1: /*
2: * Copyright (c) 1980 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: */
6:
7: #ifndef lint
8: char copyright[] =
9: "@(#) Copyright (c) 1980 Regents of the University of California.\n\
10: All rights reserved.\n";
11: #endif not lint
12:
13: #ifndef lint
14: static char sccsid[] = "@(#)leave.c 5.1 (Berkeley) 5/31/85";
15: #endif not lint
16:
17: #include <stdio.h>
18: #include <signal.h>
19: /*
20: * leave [[+]hhmm]
21: *
22: * Reminds you when you have to leave.
23: * Leave prompts for input and goes away if you hit return.
24: * It nags you like a mother hen.
25: */
26: char origlogin[20];
27: char *getlogin();
28: char *whenleave;
29: char *ctime();
30: char buff[100];
31:
32: main(argc, argv)
33: char **argv;
34: {
35: long when, tod, now, diff, hours, minutes;
36: char *cp;
37: int *nv;
38: int atoi();
39: int *localtime();
40:
41: strcpy(origlogin, getlogin());
42: if (argc < 2) {
43: printf("When do you have to leave? ");
44: fflush(stdout);
45: buff[read(0, buff, sizeof buff)] = 0;
46: cp = buff;
47: } else
48: cp = argv[1];
49: if (*cp == '\n')
50: exit(0);
51: if (*cp == '+') {
52: cp++;
53: if (*cp < '0' || *cp > '9')
54: usage();
55: tod = atoi(cp);
56: hours = tod / 100;
57: minutes = tod % 100;
58: if (minutes < 0 || minutes > 59)
59: usage();
60: diff = 60*hours+minutes;
61: doalarm(diff);
62: exit(0);
63: }
64: if (*cp < '0' || *cp > '9')
65: usage();
66: tod = atoi(cp);
67: hours = tod / 100;
68: if (hours > 12)
69: hours -= 12;
70: if (hours == 12)
71: hours = 0;
72: minutes = tod % 100;
73:
74: if (hours < 0 || hours > 12 || minutes < 0 || minutes > 59)
75: usage();
76:
77: time(&now);
78: nv = localtime(&now);
79: when = 60*hours+minutes;
80: if (nv[2] > 12)
81: nv[2] -= 12; /* do am/pm bit */
82: now = 60*nv[2] + nv[1];
83: diff = when - now;
84: while (diff < 0)
85: diff += 12*60;
86: if (diff > 11*60) {
87: printf("That time has already passed!\n");
88: exit(1);
89: }
90: doalarm(diff);
91: exit(0);
92: }
93:
94: usage()
95: {
96: printf("usage: leave [[+]hhmm]\n");
97: exit(1);
98: }
99:
100: doalarm(nmins)
101: long nmins;
102: {
103: char *msg1, *msg2, *msg3, *msg4;
104: register int i;
105: int slp1, slp2, slp3, slp4;
106: int seconds, gseconds;
107: long daytime;
108:
109: seconds = 60 * nmins;
110: if (seconds <= 0)
111: seconds = 1;
112: gseconds = seconds;
113:
114: msg1 = "You have to leave in 5 minutes";
115: if (seconds <= 60*5) {
116: slp1 = 0;
117: } else {
118: slp1 = seconds - 60*5;
119: seconds = 60*5;
120: }
121:
122: msg2 = "Just one more minute!";
123: if (seconds <= 60) {
124: slp2 = 0;
125: } else {
126: slp2 = seconds - 60;
127: seconds = 60;
128: }
129:
130: msg3 = "Time to leave!";
131: slp3 = seconds;
132:
133: msg4 = "You're going to be late!";
134: slp4 = 60;
135:
136: time(&daytime);
137: daytime += gseconds;
138: whenleave = ctime(&daytime);
139: printf("Alarm set for %s", whenleave);
140: if (fork())
141: exit(0);
142: signal(SIGINT, SIG_IGN);
143: signal(SIGQUIT, SIG_IGN);
144: signal(SIGTERM, SIG_IGN);
145: signal(SIGTTOU, SIG_IGN);
146:
147: if (slp1)
148: bother(slp1, msg1);
149: if (slp2)
150: bother(slp2, msg2);
151: bother(slp3, msg3);
152: for (i = 0; i < 10; i++)
153: bother(slp4, msg4);
154: printf("That was the last time I'll tell you. Bye.\n");
155: exit(0);
156: }
157:
158: bother(slp, msg)
159: int slp;
160: char *msg;
161: {
162:
163: delay(slp);
164: printf("\7\7\7%s\n", msg);
165: }
166:
167: /*
168: * delay is like sleep but does it in 100 sec pieces and
169: * knows what zero means.
170: */
171: delay(secs)
172: int secs;
173: {
174: int n;
175:
176: while (secs > 0) {
177: n = 100;
178: if (secs < n)
179: n = secs;
180: secs -= n;
181: if (n > 0)
182: sleep(n);
183: if (strcmp(origlogin, getlogin()))
184: exit(0);
185: }
186: }
187:
188: #ifdef V6
189: char *getlogin() {
190: #include <utmp.h>
191:
192: static struct utmp ubuf;
193: int ufd;
194:
195: ufd = open("/etc/utmp",0);
196: seek(ufd, ttyn(0)*sizeof(ubuf), 0);
197: read(ufd, &ubuf, sizeof(ubuf));
198: ubuf.ut_name[sizeof(ubuf.ut_name)] = 0;
199: return(&ubuf.ut_name);
200: }
201: #endif
Defined functions
main
defined in line
32;
never used
usage
defined in line
94; used 4 times
Defined variables
buff
defined in line
30; used 4 times