henesyinit from lsubb0c8bdb6 years agoHistory
57 lines · 822 B · C
RawDownload
#include <u.h>#include <libc.h>#include <b.h> enum {	Nargs = 64}; longcmdoutput(char* cmd, char* out, long sz){	char*	argv[Nargs];	char*	s;	int	argc;	int	p[2];	long	tot, n; 	s = strdup(cmd);	if (s == nil)		return -1;	argc = tokenize(s, argv, nelem(argv)-1);	if (argc < 1){		free(s);		return -1;	}	argv[argc] = nil;	if (pipe(p) < 0){		free(s);		return -1;	}	switch(rfork(RFPROC|RFFDG|RFENVG|RFNOWAIT)){	case -1:		free(s);		close(p[0]);		close(p[1]);		return -1;	case 0:		close(p[0]);		dup(p[1], 1);		close(p[1]);		exec(argv[0], argv);		_exits("exec env/terms failed");		return -1;		break;	default:		free(s);		close(p[1]);		for(tot = 0; sz - tot > 1 ; tot +=n){			n = read(p[0], out+tot, sz - tot);			if (n <= 0)				break;		}		close(p[0]);		out[tot] = 0;		return tot;	}}