bootstrap fixups and lint
[unix-history] / usr / src / usr.bin / leave / leave.c
CommitLineData
fdd8e0d1
BJ
1static char *sccsid = "@(#)leave.c 4.1 (Berkeley) %G%";
2#include <stdio.h>
3/*
4 * leave [hhmm]
5 *
6 * Reminds you when you have to leave.
7 * Leave prompts for input and goes away if you hit return.
8 * It nags you like a mother hen.
9 */
10char origlogin[20], thislogin[20];
11char *getlogin();
12char *whenleave;
13char *ctime();
14char buff[100];
15
16main(argc,argv)
17char **argv;
18{
19 long when, tod, now, diff, hours, minutes;
20 int *nv;
21 int atoi();
22 int *localtime();
23
24 if (argc < 2) {
25 printf("When do you have to leave? ");
26 fflush(stdout);
27 buff[read(0,buff,sizeof buff)] = 0;
28 } else {
29 strcpy(buff,argv[1]);
30 }
31
32 if (buff[0] == '\n')
33 exit(0);
34 if (buff[0] == '+') {
35 diff = atoi(buff+1);
36 doalarm(diff);
37 }
38 if (buff[0] < '0' || buff[0] > '9') {
39 printf("usage: %s [hhmm]\n",argv[0]);
40 exit(1);
41 }
42 strcpy(origlogin,getlogin());
43
44 tod = atoi(buff);
45 hours = tod / 100;
46 if (hours > 12)
47 hours -= 12;
48 if (hours == 12)
49 hours = 0;
50 minutes = tod % 100;
51
52 if (hours < 0 || hours > 12 || minutes < 0 || minutes > 59) {
53 printf("usage: %s [hhmm]\n",argv[0]);
54 exit(1);
55 }
56
57 setexit(); /* refigure time if killed */
58 time(&now);
59 nv = localtime(&now);
60 when = 60*hours+minutes;
61 if (nv[2] > 12) nv[2] -= 12; /* do am/pm bit */
62 now = 60*nv[2] + nv[1];
63 diff = when - now;
64 while (diff < 0)
65 diff += 12*60;
66 if (diff > 11*60) printf("That time has already passed!\n");
67 doalarm(diff);
68 exit(0);
69}
70
71
72doalarm(nmins)
73long nmins;
74{
75 char *msg1, *msg2, *msg3, *msg4;
76 register int i;
77 int slp1, slp2, slp3, slp4;
78 int seconds, gseconds;
79 long daytime;
80
81 seconds = 60 * nmins;
82 if (seconds <= 0)
83 seconds = 1;
84 gseconds = seconds;
85
86 msg1 = "You have to leave in 5 minutes";
87 if (seconds <= 60*5) {
88 slp1 = 0;
89 } else {
90 slp1 = seconds - 60*5;
91 seconds = 60*5;
92 }
93
94 msg2 = "Just one more minute!";
95 if (seconds <= 60) {
96 slp2 = 0;
97 } else {
98 slp2 = seconds - 60;
99 seconds = 60;
100 }
101
102 msg3 = "Time to leave!";
103 slp3 = seconds;
104
105 msg4 = "You're going to be late!";
106 slp4 = 60;
107
108 time(&daytime);
109 daytime += gseconds;
110 whenleave = ctime(&daytime);
111 printf("Alarm set for %s\n",whenleave);
112 if (fork())
113 exit(0);
114 signal(2,1);
115 signal(3,1);
116 signal(15,1);
117
118 if (slp1)
119 bother(slp1,msg1);
120 if (slp2)
121 bother(slp2,msg2);
122 bother(slp3,msg3);
123 for (;;) {
124 bother(slp4,msg4);
125 }
126}
127
128bother(slp,msg)
129int slp;
130char *msg;
131{
132
133 delay(slp);
134 printf("\7\7\7");
135 printf("%s\n",msg);
136}
137
138/*
139 * delay is like sleep but does it in 100 sec pieces and
140 * knows what zero means.
141 */
142delay(secs) int secs; {
143 int n;
144
145 while(secs>0) {
146 n = 100;
147 secs = secs - 100;
148 if (secs < 0) {
149 n = n + secs;
150 }
151 if (n > 0)
152 sleep(n);
153 strcpy(thislogin,getlogin());
154 if (strcmp(origlogin, thislogin))
155 exit(0);
156 }
157}
158
159#ifdef V6
160char *getlogin() {
161#include <utmp.h>
162
163 static struct utmp ubuf;
164 int ufd;
165
166 ufd = open("/etc/utmp",0);
167 seek(ufd, ttyn(0)*sizeof(ubuf), 0);
168 read(ufd, &ubuf, sizeof(ubuf));
169 ubuf.ut_name[sizeof(ubuf.ut_name)] = 0;
170 return(&ubuf.ut_name);
171}
172#endif