Importing usr.bin/leave

No Minix-specific changes needed.

Change-Id: I2cd3f75255168a553ec5f9dd722ba1c51c09a0c1
This commit is contained in:
Thomas Cort 2013-10-18 12:40:44 -04:00
parent ba6640c5fd
commit dbbd766d59
6 changed files with 312 additions and 1 deletions

View file

@ -364,6 +364,7 @@
./usr/bin/last minix-sys
./usr/bin/ld minix-sys binutils
./usr/bin/ldd minix-sys
./usr/bin/leave minix-sys
./usr/bin/less minix-sys
./usr/bin/lessecho minix-sys
./usr/bin/lesskey minix-sys
@ -1933,6 +1934,7 @@
./usr/man/man1/ld.1 minix-sys binutils
./usr/man/man1/ldd.1 minix-sys
./usr/man/man1/ld.elf_so.1 minix-sys
./usr/man/man1/leave.1 minix-sys
./usr/man/man1/less.1 minix-sys
./usr/man/man1/lesskey.1 minix-sys
./usr/man/man1/lex.1 minix-sys

View file

@ -170,6 +170,7 @@
2012/10/17 12:00:00,usr.bin/infocmp
2012/10/17 12:00:00,usr.bin/join
2011/01/17 18:11:10,usr.bin/ldd
2013/10/18 12:00:00,usr.bin/leave
2012/02/10 16:16:12,usr.bin/login
2013/05/30 12:00:00,usr.bin/logname
2012/10/17 12:00:00,usr.bin/lorder

View file

@ -13,7 +13,7 @@ SUBDIR= \
finger from \
ftp genassym getopt \
head indent infocmp join \
ldd \
ldd leave \
login logname lorder m4 \
machine make man \
mkdep mktemp \

6
usr.bin/leave/Makefile Normal file
View file

@ -0,0 +1,6 @@
# $NetBSD: Makefile,v 1.5 1997/10/19 03:44:24 lukem Exp $
# @(#)Makefile 8.1 (Berkeley) 6/6/93
PROG= leave
.include <bsd.prog.mk>

117
usr.bin/leave/leave.1 Normal file
View file

@ -0,0 +1,117 @@
.\" $NetBSD: leave.1,v 1.12 2012/02/21 15:01:51 njoly Exp $
.\"
.\" Copyright (c) 1980, 1990, 1993
.\" The Regents of the University of California. All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\" notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\" notice, this list of conditions and the following disclaimer in the
.\" documentation and/or other materials provided with the distribution.
.\" 3. Neither the name of the University nor the names of its contributors
.\" may be used to endorse or promote products derived from this software
.\" without specific prior written permission.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\" @(#)leave.1 8.3 (Berkeley) 4/28/95
.\"
.Dd January 19, 2002
.Dt LEAVE 1
.Os
.Sh NAME
.Nm leave
.Nd remind you when you have to leave
.Sh SYNOPSIS
.Nm
.Sm off
.Oo
.Op Cm \&+
.Ns Ar hhmm
.Oc
.Sm on
.Sh DESCRIPTION
.Nm
waits until the specified time (within the next 12 hours), then
reminds you that you have to leave by writing to the TTY that you
executed
.Nm
on.
.Pp
You are reminded 5 minutes and 1 minute before the actual
time, at the time, and every minute thereafter.
When you log off,
.Nm
exits just before it would have
printed the next message.
.Sh OPTIONS
.Bl -tag -width flag
.It Ar hhmm
The time of day is in the form
.Ar hhmm
where
.Ar hh
is a time in
hours (on a 12 or 24 hour clock), and
.Ar mm
are minutes.
.Pp
However, all times are converted to a 12 hour clock, and assumed to
be in the next 12 hours.
An attempt to set an alarm for farther into the future will be truncated
to within the next 12 hours.
.It Cm \&+
If the time is preceded by
.Ql Cm \&+ ,
the alarm will go off in hours and minutes
from the current time.
.El
.Pp
If no argument is given,
.Nm
prompts with "When do you have to leave?".
A reply of newline causes
.Nm
to exit,
otherwise the reply is assumed to be a time.
This form is suitable for inclusion in a
.Pa ~/.login
or
.Pa ~/.profile .
.Sh SEE ALSO
.Xr calendar 1 ,
.Xr csh 1 ,
.Xr sh 1
.Sh HISTORY
The
.Nm
command appeared in
.Bx 3.0 .
.Sh BUGS
In the modern age with
.Xr X 7
and window multiplexing programs like
.Xr tmux 1
and
.Xr screen 1 ,
the
.Nm
command's reminders and admonitions might not be seen if the user
has the window where
.Nm
was started minimized or obscured.
.Pp
This all begs for a more general user notifications system to be implemented.

185
usr.bin/leave/leave.c Normal file
View file

@ -0,0 +1,185 @@
/* $NetBSD: leave.c,v 1.15 2011/09/16 15:39:27 joerg Exp $ */
/*
* Copyright (c) 1980, 1988, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include <sys/cdefs.h>
#ifndef lint
__COPYRIGHT("@(#) Copyright (c) 1980, 1988, 1993\
The Regents of the University of California. All rights reserved.");
#endif /* not lint */
#ifndef lint
#if 0
static char sccsid[] = "@(#)leave.c 8.1 (Berkeley) 6/6/93";
#else
__RCSID("$NetBSD: leave.c,v 1.15 2011/09/16 15:39:27 joerg Exp $");
#endif
#endif /* not lint */
#include <sys/param.h>
#include <sys/time.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <err.h>
#include <unistd.h>
#define SECOND 1
#define MINUTE (SECOND * 60)
#define HOUR (MINUTE * 60)
/*
* leave [[+]hhmm]
*
* Reminds you when you have to leave.
* Leave prompts for input and goes away if you hit return.
* It nags you like a mother hen.
*/
__dead static void doalarm(u_int);
__dead static void usage(void);
int
main(int argc, char **argv)
{
u_int secs;
int hours, minutes;
char c, *cp;
struct tm *t = NULL;
time_t now;
int plusnow;
char buf[50];
if (setvbuf(stdout, NULL, _IONBF, 0) != 0)
errx(1, "Cannot set stdout to unbuffered.");
if (argc < 2) {
(void)puts("When do you have to leave? ");
cp = fgets(buf, sizeof(buf), stdin);
if (cp == NULL || *cp == '\n')
exit(0);
} else
cp = argv[1];
if (*cp == '+') {
plusnow = 1;
++cp;
} else {
plusnow = 0;
(void)time(&now);
t = localtime(&now);
}
for (hours = 0; (c = *cp) && c != '\n'; ++cp) {
if (!isdigit((unsigned char)c))
usage();
hours = hours * 10 + (c - '0');
}
minutes = hours % 100;
hours /= 100;
if (minutes < 0 || minutes > 59)
usage();
if (plusnow)
secs = (hours * HOUR) + (minutes * MINUTE);
else {
if (hours > 23)
usage();
if (t->tm_hour >= 12)
t->tm_hour -= 12;
if (hours >= 12)
hours -= 12;
if (t->tm_hour > hours ||
(t->tm_hour == hours && minutes <= t->tm_min))
hours += 12;
secs = (hours - t->tm_hour) * HOUR;
secs += (minutes - t->tm_min) * MINUTE;
}
doalarm(secs);
exit(0);
}
static void
doalarm(u_int secs)
{
int bother;
time_t daytime;
switch (fork()) {
case 0:
break;
case -1:
err(1, "Fork failed");
/*NOTREACHED*/
default:
exit(0);
}
(void)time(&daytime);
daytime += secs;
printf("Alarm set for %.16s. (pid %u)\n",
ctime(&daytime), (unsigned)getpid());
/*
* if write fails, we've lost the terminal through someone else
* causing a vhangup by logging in.
*/
#define FIVEMIN (5 * MINUTE)
if (secs >= FIVEMIN) {
sleep(secs - FIVEMIN);
if (puts("\07\07You have to leave in 5 minutes.\n") == EOF)
exit(0);
secs = FIVEMIN;
}
#define ONEMIN (MINUTE)
if (secs >= ONEMIN) {
sleep(secs - ONEMIN);
if (puts("\07\07Just one more minute!\n") == EOF)
exit(0);
}
for (bother = 10; bother--;) {
sleep((u_int)ONEMIN);
if (puts("\07\07Time to leave!\n") == EOF)
exit(0);
}
(void)puts("\07\07That was the last time I'll tell you. Bye.\n");
exit(0);
}
static void
usage(void)
{
(void)fprintf(stderr, "usage: %s [[+]hhmm]\n", getprogname());
exit(1);
}