110{
111 char **myArgs;
112 int rc, totArgs = numArgs + argC;
113
114
115
116 if (!ArgBuff)
118 return -ENOEXEC;
119 }
120
121
122
123 myArgs = (char**)alloca(sizeof(char *) * (totArgs + 1));
124 if (numArgs) memcpy(myArgs, Arg, sizeof(char*)*numArgs);
125 if (argC) memcpy(&myArgs[numArgs], argV, sizeof(char*)*argC);
126 myArgs[totArgs] = 0;
127
128
129
130 if (myProc) return (*myProc)(Sp, myArgs, totArgs);
131
132
133
134 if (envV)
135 {
XrdOucEnv progEnv, *oldEnv = Sp->SetEnv(&progEnv);
136 progEnv.
PutPtr(
"XrdEnvars**", (
void *)envV);
137 rc = Sp->Exec(myArgs, 1, theEFD);
138 Sp->SetEnv(oldEnv);
139 } else rc = Sp->Exec(myArgs, 1, theEFD);
140
141
142
143 if (rc)
144 {rc = Sp->LastError();
146 return -rc;
147 }
148
149
150
151 return 0;
152}
153
154
155
156int XrdOucProg::Run(
const char *argV[],
int argC,
const char *envV[])
const
157{
159 char *lp;
160 int rc;
161
162
163
164 rc =
Run(&cmd, argV, argC, envV);
165 if (rc) return rc;
166
167
168
170 if (eDest && *lp) eDest->
Emsg(
"Run", lp);
171
172
173
175}
176
177
178
180 const char *arg3, const char *arg4) const
181{
182 int rc;
183
184
185
187 return rc;
188}
189
190
191
193 const char *arg3, const char *arg4) const
194{
196 char *lp;
197 int rc;
198
199
200
202 if (rc) return rc;
203
204
205
207 if (eDest && *lp) eDest->
Emsg(
"Run", lp);
208
209
210
212}
213
214
215
217 const char *arg1, const char *arg2,
218 const char *arg3, const char *arg4) const
219{
221 char *lp, *tp;
222 int n, rc;
223
224
225
227 if (rc) return rc;
228
229
230
231 if (outBuff && outBsz > 0)
233 {while (*lp && *lp == ' ') lp++;
234 if ((n = strlen(lp)))
235 {tp = lp+n-1;
236 while(*tp-- == ' ') n--;
237 if (n >= outBsz) n = outBsz-1;
238 strncpy(outBuff, lp, n); outBuff += n;
239 }
240 }
241 *outBuff = 0;
242 }
243
244
245
247
248
249
251}
252
253
254
255
256
258{
259 int rc;
260
261
262
263
264 if (myProc) return 0;
265
266
267
269
270
271
272 if (WIFSIGNALED(rc))
273 {if (eDest)
274 {char buff[16];
275 sprintf(buff, "%d", WTERMSIG(rc));
276 eDest->
Emsg(
"Run", Arg[0],
"killed by signal", buff);
277 }
278 return -EPIPE;
279 }
280 if (WIFEXITED(rc))
281 {rc = WEXITSTATUS(rc);
282 if (rc && eDest)
283 {char buff[16];
284 sprintf(buff, "%d", rc);
285 eDest->
Emsg(
"Run", Arg[0],
"ended with status", buff);
286 }
287 return -rc;
288 }
289 return 0;
290}
291
292
293
294
295
298{
299 static const int maxArgs = 65;
300 char *argV[maxArgs];
301 int rc;
302
303
304
305 Reset();
306 if (!errP) errP = eDest;
307 myProc = 0;
308 ArgBuff = strdup(prog);
309
310
311
313 if (rc <= 0)
314 {if (errP)
315 {if (!rc || !argV[0])
316 {const char *pgm = (Proc ? "procedure" : "program");
317 errP->
Emsg(
"Run", pgm,
"name not specified.");
318 }
else errP->
Emsg(
"Run", rc,
"set up", argV[0]);
319 }
320 return (rc ? rc : -EINVAL);
321 }
322
323
324
325
326 numArgs = rc;
327 Arg = new char*[rc+1];
328 memcpy(Arg, argV, sizeof(char *) * (rc+1));
329
330
331
332 if ((myProc = Proc)) return 0;
333
334
335
337 {rc = errno;
338 if (errP) errP->
Emsg(
"Run", rc,
"set up", Arg[0]);
339 Reset();
340 return rc;
341 }
342 return 0;
343}
344
345
346
347
348
350{
351
352
353
354 if (myStream) return EBUSY;
355 if (!(myStream =
new XrdOucStream(eDest)))
return ENOMEM;
356
357
358
359 theEFD = 0;
360 return Run(myStream);
361}
362
363
364
365
366
367
368
369
370void XrdOucProg::Reset()
371{
372
373 if (ArgBuff) {free(ArgBuff); ArgBuff = 0;}
374 if (numArgs) delete [] Arg;
375 Arg = &ArgBuff;
376 numArgs = 0;
377}
378
379
380
381
382
383int XrdOucProg::Restart()
384{
386 return Run(myStream);
387}
static XrdSysError eDest(0,"crypto_")
#define runWithVec(strmP, theRC)
void PutPtr(const char *varname, void *value)
int RunDone(XrdOucStream &cmd) const
int Run(XrdOucStream *Sp, const char *argV[], int argc=0, const char *envV[]=0) const
int Setup(const char *prog, XrdSysError *errP=0, int(*Proc)(XrdOucStream *, char **, int)=0)
static int argList(char *args, char **argV, int argC)
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)