|
|
1.1 root 1: static char *sccsid = "@(#)leave.c 4.3 (Berkeley) 3/31/83";
2: #include <stdio.h>
3: #include <signal.h>
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: */
11: char origlogin[20], thislogin[20];
12: char *getlogin();
13: char *whenleave;
14: char *ctime();
15: char buff[100];
16:
17: main(argc,argv)
18: char **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:
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:
72: doalarm(nmins)
73: long 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(SIGINT, SIG_IGN);
115: signal(SIGQUIT, SIG_IGN);
116: signal(SIGTERM, SIG_IGN);
117: signal(SIGTTOU, SIG_IGN);
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:
129: bother(slp,msg)
130: int slp;
131: char *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: */
143: delay(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
161: char *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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.