Blame


1 5cdb1798 2005-10-29 devnull #include "common.h"
2 5cdb1798 2005-10-29 devnull
3 5cdb1798 2005-10-29 devnull /* make a stream to a child process */
4 5cdb1798 2005-10-29 devnull extern stream *
5 5cdb1798 2005-10-29 devnull instream(void)
6 5cdb1798 2005-10-29 devnull {
7 5cdb1798 2005-10-29 devnull stream *rv;
8 5cdb1798 2005-10-29 devnull int pfd[2];
9 5cdb1798 2005-10-29 devnull
10 5cdb1798 2005-10-29 devnull if ((rv = (stream *)malloc(sizeof(stream))) == 0)
11 5cdb1798 2005-10-29 devnull return 0;
12 5cdb1798 2005-10-29 devnull memset(rv, 0, sizeof(stream));
13 5cdb1798 2005-10-29 devnull if (pipe(pfd) < 0)
14 5cdb1798 2005-10-29 devnull return 0;
15 5cdb1798 2005-10-29 devnull if(Binit(&rv->bb, pfd[1], OWRITE) < 0){
16 5cdb1798 2005-10-29 devnull close(pfd[0]);
17 5cdb1798 2005-10-29 devnull close(pfd[1]);
18 5cdb1798 2005-10-29 devnull return 0;
19 5cdb1798 2005-10-29 devnull }
20 5cdb1798 2005-10-29 devnull rv->fp = &rv->bb;
21 fa325e9b 2020-01-10 cross rv->fd = pfd[0];
22 5cdb1798 2005-10-29 devnull return rv;
23 5cdb1798 2005-10-29 devnull }
24 5cdb1798 2005-10-29 devnull
25 5cdb1798 2005-10-29 devnull /* make a stream from a child process */
26 5cdb1798 2005-10-29 devnull extern stream *
27 5cdb1798 2005-10-29 devnull outstream(void)
28 5cdb1798 2005-10-29 devnull {
29 5cdb1798 2005-10-29 devnull stream *rv;
30 5cdb1798 2005-10-29 devnull int pfd[2];
31 5cdb1798 2005-10-29 devnull
32 5cdb1798 2005-10-29 devnull if ((rv = (stream *)malloc(sizeof(stream))) == 0)
33 5cdb1798 2005-10-29 devnull return 0;
34 5cdb1798 2005-10-29 devnull memset(rv, 0, sizeof(stream));
35 5cdb1798 2005-10-29 devnull if (pipe(pfd) < 0)
36 5cdb1798 2005-10-29 devnull return 0;
37 5cdb1798 2005-10-29 devnull if (Binit(&rv->bb, pfd[0], OREAD) < 0){
38 5cdb1798 2005-10-29 devnull close(pfd[0]);
39 5cdb1798 2005-10-29 devnull close(pfd[1]);
40 5cdb1798 2005-10-29 devnull return 0;
41 5cdb1798 2005-10-29 devnull }
42 5cdb1798 2005-10-29 devnull rv->fp = &rv->bb;
43 5cdb1798 2005-10-29 devnull rv->fd = pfd[1];
44 5cdb1798 2005-10-29 devnull return rv;
45 5cdb1798 2005-10-29 devnull }
46 5cdb1798 2005-10-29 devnull
47 5cdb1798 2005-10-29 devnull extern void
48 5cdb1798 2005-10-29 devnull stream_free(stream *sp)
49 5cdb1798 2005-10-29 devnull {
50 5cdb1798 2005-10-29 devnull int fd;
51 5cdb1798 2005-10-29 devnull
52 5cdb1798 2005-10-29 devnull close(sp->fd);
53 5cdb1798 2005-10-29 devnull fd = Bfildes(sp->fp);
54 5cdb1798 2005-10-29 devnull Bterm(sp->fp);
55 5cdb1798 2005-10-29 devnull close(fd);
56 5cdb1798 2005-10-29 devnull free((char *)sp);
57 5cdb1798 2005-10-29 devnull }
58 5cdb1798 2005-10-29 devnull
59 5cdb1798 2005-10-29 devnull /* start a new process */
60 5cdb1798 2005-10-29 devnull extern process *
61 5cdb1798 2005-10-29 devnull noshell_proc_start(char **av, stream *inp, stream *outp, stream *errp, int newpg, char *who)
62 5cdb1798 2005-10-29 devnull {
63 5cdb1798 2005-10-29 devnull process *pp;
64 5cdb1798 2005-10-29 devnull int i, n;
65 5cdb1798 2005-10-29 devnull
66 5cdb1798 2005-10-29 devnull if ((pp = (process *)malloc(sizeof(process))) == 0) {
67 5cdb1798 2005-10-29 devnull if (inp != 0)
68 5cdb1798 2005-10-29 devnull stream_free(inp);
69 5cdb1798 2005-10-29 devnull if (outp != 0)
70 5cdb1798 2005-10-29 devnull stream_free(outp);
71 5cdb1798 2005-10-29 devnull if (errp != 0)
72 5cdb1798 2005-10-29 devnull stream_free(errp);
73 5cdb1798 2005-10-29 devnull return 0;
74 5cdb1798 2005-10-29 devnull }
75 5cdb1798 2005-10-29 devnull pp->std[0] = inp;
76 5cdb1798 2005-10-29 devnull pp->std[1] = outp;
77 5cdb1798 2005-10-29 devnull pp->std[2] = errp;
78 5cdb1798 2005-10-29 devnull switch (pp->pid = fork()) {
79 5cdb1798 2005-10-29 devnull case -1:
80 5cdb1798 2005-10-29 devnull proc_free(pp);
81 5cdb1798 2005-10-29 devnull return 0;
82 5cdb1798 2005-10-29 devnull case 0:
83 5cdb1798 2005-10-29 devnull if(newpg)
84 5cdb1798 2005-10-29 devnull sysdetach();
85 5cdb1798 2005-10-29 devnull for (i=0; i<3; i++)
86 5cdb1798 2005-10-29 devnull if (pp->std[i] != 0){
87 5cdb1798 2005-10-29 devnull close(Bfildes(pp->std[i]->fp));
88 5cdb1798 2005-10-29 devnull while(pp->std[i]->fd < 3)
89 5cdb1798 2005-10-29 devnull pp->std[i]->fd = dup(pp->std[i]->fd, -1);
90 5cdb1798 2005-10-29 devnull }
91 5cdb1798 2005-10-29 devnull for (i=0; i<3; i++)
92 5cdb1798 2005-10-29 devnull if (pp->std[i] != 0)
93 5cdb1798 2005-10-29 devnull dup(pp->std[i]->fd, i);
94 5cdb1798 2005-10-29 devnull for (n = sysfiles(); i < n; i++)
95 5cdb1798 2005-10-29 devnull close(i);
96 605c0ea1 2006-02-08 devnull if(who)
97 605c0ea1 2006-02-08 devnull fprint(2, "warning: cannot run %s as %s\n", av[0], who);
98 5cdb1798 2005-10-29 devnull exec(av[0], av);
99 5cdb1798 2005-10-29 devnull perror("proc_start");
100 5cdb1798 2005-10-29 devnull exits("proc_start");
101 5cdb1798 2005-10-29 devnull default:
102 5cdb1798 2005-10-29 devnull for (i=0; i<3; i++)
103 5cdb1798 2005-10-29 devnull if (pp->std[i] != 0) {
104 5cdb1798 2005-10-29 devnull close(pp->std[i]->fd);
105 5cdb1798 2005-10-29 devnull pp->std[i]->fd = -1;
106 5cdb1798 2005-10-29 devnull }
107 5cdb1798 2005-10-29 devnull return pp;
108 5cdb1798 2005-10-29 devnull }
109 5cdb1798 2005-10-29 devnull }
110 5cdb1798 2005-10-29 devnull
111 5cdb1798 2005-10-29 devnull /* start a new process under a shell */
112 5cdb1798 2005-10-29 devnull extern process *
113 5cdb1798 2005-10-29 devnull proc_start(char *cmd, stream *inp, stream *outp, stream *errp, int newpg, char *who)
114 5cdb1798 2005-10-29 devnull {
115 5cdb1798 2005-10-29 devnull char *av[4];
116 5cdb1798 2005-10-29 devnull
117 605c0ea1 2006-02-08 devnull upasconfig();
118 605c0ea1 2006-02-08 devnull av[0] = SHELL;
119 5cdb1798 2005-10-29 devnull av[1] = "-c";
120 5cdb1798 2005-10-29 devnull av[2] = cmd;
121 5cdb1798 2005-10-29 devnull av[3] = 0;
122 5cdb1798 2005-10-29 devnull return noshell_proc_start(av, inp, outp, errp, newpg, who);
123 5cdb1798 2005-10-29 devnull }
124 5cdb1798 2005-10-29 devnull
125 5cdb1798 2005-10-29 devnull /* wait for a process to stop */
126 5cdb1798 2005-10-29 devnull extern int
127 5cdb1798 2005-10-29 devnull proc_wait(process *pp)
128 5cdb1798 2005-10-29 devnull {
129 5cdb1798 2005-10-29 devnull Waitmsg *status;
130 5cdb1798 2005-10-29 devnull char err[Errlen];
131 5cdb1798 2005-10-29 devnull
132 5cdb1798 2005-10-29 devnull for(;;){
133 5cdb1798 2005-10-29 devnull status = wait();
134 5cdb1798 2005-10-29 devnull if(status == nil){
135 5cdb1798 2005-10-29 devnull errstr(err, sizeof(err));
136 5cdb1798 2005-10-29 devnull if(strstr(err, "interrupt") == 0)
137 5cdb1798 2005-10-29 devnull break;
138 5cdb1798 2005-10-29 devnull }
139 5cdb1798 2005-10-29 devnull if (status->pid==pp->pid)
140 5cdb1798 2005-10-29 devnull break;
141 5cdb1798 2005-10-29 devnull }
142 5cdb1798 2005-10-29 devnull pp->pid = -1;
143 5cdb1798 2005-10-29 devnull if(status == nil)
144 5cdb1798 2005-10-29 devnull pp->status = -1;
145 5cdb1798 2005-10-29 devnull else
146 5cdb1798 2005-10-29 devnull pp->status = status->msg[0];
147 5cdb1798 2005-10-29 devnull pp->waitmsg = status;
148 5cdb1798 2005-10-29 devnull return pp->status;
149 5cdb1798 2005-10-29 devnull }
150 5cdb1798 2005-10-29 devnull
151 5cdb1798 2005-10-29 devnull /* free a process */
152 5cdb1798 2005-10-29 devnull extern int
153 5cdb1798 2005-10-29 devnull proc_free(process *pp)
154 5cdb1798 2005-10-29 devnull {
155 5cdb1798 2005-10-29 devnull int i;
156 5cdb1798 2005-10-29 devnull
157 5cdb1798 2005-10-29 devnull if(pp->std[1] == pp->std[2])
158 5cdb1798 2005-10-29 devnull pp->std[2] = 0; /* avoid freeing it twice */
159 5cdb1798 2005-10-29 devnull for (i = 0; i < 3; i++)
160 5cdb1798 2005-10-29 devnull if (pp->std[i])
161 5cdb1798 2005-10-29 devnull stream_free(pp->std[i]);
162 5cdb1798 2005-10-29 devnull if (pp->pid >= 0)
163 5cdb1798 2005-10-29 devnull proc_wait(pp);
164 5cdb1798 2005-10-29 devnull free(pp->waitmsg);
165 5cdb1798 2005-10-29 devnull free((char *)pp);
166 5cdb1798 2005-10-29 devnull return 0;
167 5cdb1798 2005-10-29 devnull }
168 5cdb1798 2005-10-29 devnull
169 5cdb1798 2005-10-29 devnull /* kill a process */
170 5cdb1798 2005-10-29 devnull extern int
171 5cdb1798 2005-10-29 devnull proc_kill(process *pp)
172 5cdb1798 2005-10-29 devnull {
173 5cdb1798 2005-10-29 devnull return syskill(pp->pid);
174 5cdb1798 2005-10-29 devnull }