|
|
1.1 root 1: /*
2: * Copyright (c) 1980, 1988 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: */
17:
18: #ifndef lint
19: char copyright[] =
20: "@(#) Copyright (c) 1980, 1988 Regents of the University of California.\n\
21: All rights reserved.\n";
22: #endif /* not lint */
23:
24: #ifndef lint
25: static char sccsid[] = "@(#)leave.c 5.4 (Berkeley) 7/7/88";
26: #endif /* not lint */
27:
28: #include <sys/param.h>
29: #include <sys/time.h>
30: #include <stdio.h>
31: #include <ctype.h>
32:
33: /*
34: * leave [[+]hhmm]
35: *
36: * Reminds you when you have to leave.
37: * Leave prompts for input and goes away if you hit return.
38: * It nags you like a mother hen.
39: */
40: main(argc, argv)
41: int argc;
42: char **argv;
43: {
44: register u_int secs;
45: register int hours, minutes;
46: register char c, *cp;
47: struct tm *t, *localtime();
48: time_t now, time();
49: int plusnow;
50: char buf[50];
51:
52: if (argc < 2) {
53: #define MSG1 "When do you have to leave? "
54: (void)write(1, MSG1, sizeof(MSG1) - 1);
55: cp = fgets(buf, sizeof(buf), stdin);
56: if (*cp == '\n')
57: exit(0);
58: } else
59: cp = argv[1];
60:
61: if (*cp == '+') {
62: plusnow = 1;
63: ++cp;
64: } else {
65: plusnow = 0;
66: (void)time(&now);
67: t = localtime(&now);
68: }
69:
70: for (hours = 0; (c = *cp) && c != '\n'; ++cp) {
71: if (!isdigit(c))
72: usage();
73: hours = hours * 10 + (c - '0');
74: }
75: minutes = hours % 100;
76: hours /= 100;
77:
78: if (minutes < 0 || minutes > 59)
79: usage();
80: if (plusnow)
81: secs = hours * 60 * 60 + minutes * 60;
82: else {
83: if (hours > 23 || t->tm_hour > hours ||
84: t->tm_hour == hours && minutes <= t->tm_min)
85: usage();
86: secs = (hours - t->tm_hour) * 60 * 60;
87: secs += (minutes - t->tm_min) * 60;
88: }
89: doalarm(secs);
90: exit(0);
91: }
92:
93: static
94: doalarm(secs)
95: u_int secs;
96: {
97: register int bother;
98: time_t daytime, time();
99: int pid;
100: char *ctime();
101:
102: if (pid = fork()) {
103: (void)time(&daytime);
104: daytime += secs;
105: printf("Alarm set for %.16s. (pid %d)\n",
106: ctime(&daytime), pid);
107: exit(0);
108: }
109: sleep((u_int)2); /* let parent print set message */
110:
111: /*
112: * if write fails, we've lost the terminal through someone else
113: * causing a vhangup by logging in.
114: */
115: #define FIVEMIN (5 * 60)
116: #define MSG2 "\07\07You have to leave in 5 minutes.\n"
117: if (secs >= FIVEMIN) {
118: sleep(secs - FIVEMIN);
119: if (write(1, MSG2, sizeof(MSG2) - 1) != sizeof(MSG2) - 1)
120: exit(0);
121: secs = FIVEMIN;
122: }
123:
124: #define ONEMIN (60)
125: #define MSG3 "\07\07Just one more minute!\n"
126: if (secs >= ONEMIN) {
127: sleep(secs - ONEMIN);
128: if (write(1, MSG3, sizeof(MSG3) - 1) != sizeof(MSG3) - 1)
129: exit(0);
130: }
131:
132: #define MSG4 "\07\07Time to leave!\n"
133: for (bother = 10; bother--;) {
134: sleep((u_int)ONEMIN);
135: if (write(1, MSG4, sizeof(MSG4) - 1) != sizeof(MSG4) - 1)
136: exit(0);
137: }
138:
139: #define MSG5 "\07\07That was the last time I'll tell you. Bye.\n"
140: (void)write(1, MSG5, sizeof(MSG5) - 1);
141: exit(0);
142: }
143:
144: static
145: usage()
146: {
147: fprintf(stderr, "usage: leave [[+]hhmm]\n");
148: exit(1);
149: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.