increased buffer size for long names in decode().
[unix-history] / usr / src / usr.bin / leave / leave.c
CommitLineData
18a5872f 1static char *sccsid = "@(#)leave.c 4.3 (Berkeley) %G%";
fdd8e0d1 2#include <stdio.h>
18a5872f 3#include <signal.h>
fdd8e0d1
BJ
4/*
5 * leave [hhmm]
6 *
7 * Reminds you when you have to leave.
8 * Leave prompts for input and goes away if you hit return.
9 * It nags you like a mother hen.
10 */
11char origlogin[20], thislogin[20];
12char *getlogin();
13char *whenleave;
14char *ctime();
15char buff[100];
16
17main(argc,argv)
18char **argv;
19{
20 long when, tod, now, diff, hours, minutes;
21 int *nv;
22 int atoi();
23 int *localtime();
24
25 if (argc < 2) {
26 printf("When do you have to leave? ");
27 fflush(stdout);
28 buff[read(0,buff,sizeof buff)] = 0;
29 } else {
30 strcpy(buff,argv[1]);
31 }
32
33 if (buff[0] == '\n')
34 exit(0);
35 if (buff[0] == '+') {
36 diff = atoi(buff+1);
37 doalarm(diff);
38 }
39 if (buff[0] < '0' || buff[0] > '9') {
40 printf("usage: %s [hhmm]\n",argv[0]);
41 exit(1);
42 }
43 strcpy(origlogin,getlogin());
44
45 tod = atoi(buff);
46 hours = tod / 100;
47 if (hours > 12)
48 hours -= 12;
49 if (hours == 12)
50 hours = 0;
51 minutes = tod % 100;
52
53 if (hours < 0 || hours > 12 || minutes < 0 || minutes > 59) {
54 printf("usage: %s [hhmm]\n",argv[0]);
55 exit(1);
56 }
57
fdd8e0d1
BJ
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);
18a5872f
EW
114 signal(SIGINT, SIG_IGN);
115 signal(SIGQUIT, SIG_IGN);
116 signal(SIGTERM, SIG_IGN);
117 signal(SIGTTOU, SIG_IGN);
fdd8e0d1
BJ
118
119 if (slp1)
120 bother(slp1,msg1);
121 if (slp2)
122 bother(slp2,msg2);
123 bother(slp3,msg3);
124 for (;;) {
125 bother(slp4,msg4);
126 }
127}
128
129bother(slp,msg)
130int slp;
131char *msg;
132{
133
134 delay(slp);
135 printf("\7\7\7");
136 printf("%s\n",msg);
137}
138
139/*
140 * delay is like sleep but does it in 100 sec pieces and
141 * knows what zero means.
142 */
143delay(secs) int secs; {
144 int n;
145
146 while(secs>0) {
147 n = 100;
148 secs = secs - 100;
149 if (secs < 0) {
150 n = n + secs;
151 }
152 if (n > 0)
153 sleep(n);
154 strcpy(thislogin,getlogin());
155 if (strcmp(origlogin, thislogin))
156 exit(0);
157 }
158}
159
160#ifdef V6
161char *getlogin() {
162#include <utmp.h>
163
164 static struct utmp ubuf;
165 int ufd;
166
167 ufd = open("/etc/utmp",0);
168 seek(ufd, ttyn(0)*sizeof(ubuf), 0);
169 read(ufd, &ubuf, sizeof(ubuf));
170 ubuf.ut_name[sizeof(ubuf.ut_name)] = 0;
171 return(&ubuf.ut_name);
172}
173#endif