#include <u.h>
#include <libc.h>
#include <bio.h>
#include <thread.h>
#include "dat.h"
typedef struct Arg Arg;
struct Arg {
int p[2];
char**argv;
};
enum {
Nargs = 64
};
static void
cmdproc(void* x)
{
Arg* a = x;
char** argv;
argv = a->argv;
close(a->p[0]);
dup(a->p[1], 1);
close(a->p[1]);
procexec(nil, argv[0], argv);
threadexits(nil);
}
char*
tcmdoutput(char* cmd, long *noutp)
{
long tot, n;
Arg a;
char* argv[Nargs];
int argc;
char* s;
char* out;
long sz;
*noutp = -1;
s = estrdup(cmd);
argc = tokenize(s, argv, nelem(argv)-1);
if(argc < 0)
error("tcmdoutput: no args");
argv[argc] = nil;
if (pipe(a.p) < 0)
error("no pipes");
a.argv = argv;
procrfork(cmdproc, &a, 8*1024, RFFDG|RFENVG);
close(a.p[1]);
sz = 16*1024;
out = emalloc(sz);
for(tot = 0; sz - tot > 1 ; tot +=n){
n = read(a.p[0], out+tot, sz - tot);
if (n <= 0)
break;
if(tot + n == sz){
sz += 16*1024;
out = erealloc(out, sz);
}
}
free(s);
close(a.p[0]);
out[tot] = 0;
*noutp = tot;
return out;
}
|