diff options
author | helbig <helbig@FreeBSD.org> | 1998-01-06 17:27:09 +0000 |
---|---|---|
committer | helbig <helbig@FreeBSD.org> | 1998-01-06 17:27:09 +0000 |
commit | ed587dfb329fb9686b71bc799d96629e52d4d3d3 (patch) | |
tree | 1191b39d07281788b00a4373aaf7847590eccc67 /usr.bin/leave/leave.c | |
parent | 743267f0166b025491e17bb3f505becaca10bc79 (diff) | |
download | FreeBSD-src-ed587dfb329fb9686b71bc799d96629e52d4d3d3.zip FreeBSD-src-ed587dfb329fb9686b71bc799d96629e52d4d3d3.tar.gz |
1. Don't reject 0145 if started at 22XX.
Applied suggested fix from Andrew Andrew <andrew@ugh.net.au> with
some stylistic changes. Thanks.
2. #include <sys/time.h> -> #include <time.h>
3. Removed #include <sys/param.h>
4. Use setlocale(3) and strftime(3) instead of ctime(3).
5. Clean up -Wall warnings.
6. Make sure, time to leave are integral minutes if the argument
is absolute. (i. e. without "+"). If started at 10:10:55 with
argument "1020" it computed time to leave as 10:20:55 instead of
10:20:00.
PR: 5395
Diffstat (limited to 'usr.bin/leave/leave.c')
-rw-r--r-- | usr.bin/leave/leave.c | 49 |
1 files changed, 35 insertions, 14 deletions
diff --git a/usr.bin/leave/leave.c b/usr.bin/leave/leave.c index 2129936..1da35da 100644 --- a/usr.bin/leave/leave.c +++ b/usr.bin/leave/leave.c @@ -42,13 +42,14 @@ static const char copyright[] = static char sccsid[] = "@(#)leave.c 8.1 (Berkeley) 6/6/93"; #endif static const char rcsid[] = - "$Id$"; + "$Id: leave.c,v 1.2 1997/07/21 12:04:31 charnier Exp $"; #endif /* not lint */ -#include <sys/param.h> -#include <sys/time.h> +#include <err.h> #include <ctype.h> +#include <locale.h> #include <stdio.h> +#include <time.h> #include <unistd.h> void doalarm __P((u_int)); @@ -71,9 +72,12 @@ main(argc, argv) register char c, *cp; struct tm *t, *localtime(); time_t now, time(); - int plusnow; + int plusnow, t_12_hour; char buf[50]; + if (setlocale(LC_TIME, "") == NULL) + warn("setlocale"); + if (argc < 2) { #define MSG1 "When do you have to leave? " (void)write(1, MSG1, sizeof(MSG1) - 1); @@ -86,11 +90,8 @@ main(argc, argv) if (*cp == '+') { plusnow = 1; ++cp; - } else { + } else plusnow = 0; - (void)time(&now); - t = localtime(&now); - } for (hours = 0; (c = *cp) && c != '\n'; ++cp) { if (!isdigit(c)) @@ -105,11 +106,30 @@ main(argc, argv) if (plusnow) secs = hours * 60 * 60 + minutes * 60; else { - if (hours > 23 || t->tm_hour > hours || - (t->tm_hour == hours && minutes <= t->tm_min)) + (void)time(&now); + t = localtime(&now); + + if (hours > 23) usage(); - secs = (hours - t->tm_hour) * 60 * 60; + + /* Convert tol to 12 hr time (0:00...11:59) */ + if (hours > 11) + hours -= 12; + + /* Convert tm to 12 hr time (0:00...11:59) */ + if (t->tm_hour > 11) + t_12_hour = t->tm_hour - 12; + else + t_12_hour = t->tm_hour; + + if (hours < t_12_hour || + (hours == t_12_hour && minutes <= t->tm_min)) + /* Leave time is in the past so we add 12 hrs */ + hours += 12; + + secs = (hours - t_12_hour) * 60 * 60; secs += (minutes - t->tm_min) * 60; + secs -= now % 60; /* truncate (now + secs) to min */ } doalarm(secs); exit(0); @@ -121,17 +141,18 @@ doalarm(secs) { register int bother; time_t daytime, time(); + char tb[80]; int pid; - char *ctime(); if ((pid = fork())) { (void)time(&daytime); daytime += secs; - printf("Alarm set for %.16s. (pid %d)\n", - ctime(&daytime), pid); + strftime(tb, sizeof(tb), "%+", localtime(&daytime)); + printf("Alarm set for %s. (pid %d)\n", tb, pid); exit(0); } sleep((u_int)2); /* let parent print set message */ + secs -= 2; /* * if write fails, we've lost the terminal through someone else |