BSD 3 development
[unix-history] / usr / src / cmd / csh / sh.wait.c
CommitLineData
0a63e3e8
BJ
1/* Copyright (c) 1979 Regents of the University of California */
2#include "sh.h"
3
4/*
5 * C Shell
6 */
7
8static struct tbuffer {
9#ifdef V6
10 int put, pst;
11#else
12 time_t put, pst;
13#endif
14 time_t cut, cst;
15} times0;
16time_t time0;
17
18long
19secs(bef, aft)
20 struct tbuffer *bef, *aft;
21{
22
23 return ((aft->cut - bef->cut + aft->cst - bef->cst));
24}
25
26settimes()
27{
28
29 time(&time0);
30 times(&times0);
31}
32
33dotime(v, kp)
34 register char **v;
35 struct command *kp;
36{
37 struct tbuffer timeszer, timesdol, *tzp;
38 time_t timezer, timedol;
39
40 if (v[1] != 0) {
41 time(&timezer), times(&timeszer);
42 lshift(v, 1);
43 if (func(kp) == 0) {
44 timflg = 1;
45 return (0);
46 }
47 tzp = &timeszer;
48 } else
49 timezer = time0, tzp = &times0;
50 time(&timedol);
51 times(&timesdol);
52 ptimes(timedol - timezer, tzp, &timesdol);
53 return (1);
54}
55
56donice(v)
57 register char **v;
58{
59 register char *cp;
60
61 v++, cp = *v++;
62 if (cp == 0) {
63#ifndef V6
64 nice(20);
65 nice(-10);
66#endif
67 nice(4);
68 return (1);
69 }
70 if (*v == 0 && any(cp[0], "+-")) {
71#ifndef V6
72 nice(20);
73 nice(-10);
74#endif
75 nice(getn(cp));
76 return (1);
77 }
78 return (0);
79}
80
81struct tbuffer bef, aft;
82time_t btim, atim;
83
84pwait(i)
85 register int i;
86{
87 register int p, e;
88 char *name;
89 int s;
90
91 if (i == 0)
92 return;
93 time(&btim);
94 do {
95 times(&bef);
96 p = wait(&s);
97 if (p == -1)
98 return;
99 times(&aft);
100 if (p == getn(value("child")))
101 unsetv("child");
102 time(&atim);
103 e = s & TRIM;
104 if (e > 0 && (e > 15 || mesg[e])) {
105 if (p != i)
106 printf("%d: ", p);
107 if (name = cname(p))
108 printf("%s: ", name);
109 if (e <= 15)
110 printf(mesg[e]);
111 else
112 printf("Sig %d", e);
113 if (s & 0200)
114 printf(" -- Core dumped");
115 printf("\n");
116 }
117 if (e != 0 && i == p) {
118 cdone(p);
119 if (e == SIGINT && setintr && (!gointr || !eq(gointr, "-")))
120 pintr();
121 error(0);
122 }
123 if (i == p) {
124 set("status", putn(e ? e | QUOTE : (s >> 8) & 0377));
125 if (exiterr && !eq(value("status"), "0")) {
126 if (e == 0) {
127 if (name = cname(p))
128 printf("%s: ", name);
129 printf("Exit status %s\n", value("status"));
130 }
131 exitstat();
132 }
133 cdone(p);
134 break;
135 }
136 cdone(p);
137 } while (i != p);
138 if (timflg || (!child && adrof("time") && secs(&bef, &aft) / 60 >= getn(value("time")))) {
139 timflg = 0;
140 ptimes(atim - btim, &bef, &aft);
141 }
142}
143
144ptimes(sec, bef, aft)
145 time_t sec;
146 register struct tbuffer *bef, *aft;
147{
148
149 p60ths(aft->cut - bef->cut);
150 printf("u ");
151 p60ths(aft->cst - bef->cst);
152 printf("s ");
153 psecs(sec);
154 printf(" %d%%\n", (int) ((100 * secs(bef, aft)) / (60 * (sec ? sec : 1))));
155}
156
157endwait()
158{
159
160 signal(SIGINT, SIG_IGN);
161 cleft();
162 bferr("Interrupted");
163}
164
165await()
166{
167 if (setintr)
168 signal(SIGINT, endwait);
169 pwait(-1);
170 if (setintr)
171 signal(SIGINT, SIG_IGN);
172}
173
174struct achild {
175 int pid;
176 char *cname;
177 struct achild *cnext;
178} children;
179
180char *
181cname(pid)
182 int pid;
183{
184 register struct achild *cp;
185
186 for (cp = children.cnext; cp; cp = cp->cnext)
187 if (cp->pid == pid)
188 return (cp->cname);
189 return (NOSTR);
190}
191
192cadd(pid, cname)
193 int pid;
194 char *cname;
195{
196 register struct achild *cp = (struct achild *) calloc(1, sizeof (struct achild));
197
198 cp->pid = pid;
199 cp->cname = savestr(cname);
200 cp->cnext = children.cnext;
201 children.cnext = cp;
202}
203
204cdone(pid)
205 int pid;
206{
207 register struct achild *cpp, *cp;
208
209 cpp = &children;
210 for (cp = cpp->cnext; cp; cp = cp->cnext) {
211 if (cp->pid == pid) {
212 xfree(cp->cname);
213 cpp->cnext = cp->cnext;
214 xfree(cp);
215 return;
216 }
217 cpp = cp;
218 }
219}
220
221cleft()
222{
223
224 register struct achild *cp;
225
226 for (cp = children.cnext; cp; cp = cp->cnext)
227 printf("%6d %s\n", cp->pid, cp->cname);
228}