xref: /plan9-contrib/sys/src/ape/lib/ap/plan9/system.c (revision 7c6618bf6b2c83b7dd9aa2962a3d6065a08b854b)
13e12c5d1SDavid du Colombier #include "lib.h"
23e12c5d1SDavid du Colombier #include <stdlib.h>
3219b2ee8SDavid du Colombier #include <stdio.h>
43e12c5d1SDavid du Colombier #include <sys/wait.h>
53e12c5d1SDavid du Colombier #include <unistd.h>
63e12c5d1SDavid du Colombier 
73e12c5d1SDavid du Colombier int
system(const char * s)83e12c5d1SDavid du Colombier system(const char *s)
93e12c5d1SDavid du Colombier {
103e12c5d1SDavid du Colombier 	int w, status;
113e12c5d1SDavid du Colombier 	pid_t pid;
12219b2ee8SDavid du Colombier 	char cmd[30], *oty;
133e12c5d1SDavid du Colombier 
14*7c6618bfSDavid du Colombier 	oty = getenv("cputype");
15219b2ee8SDavid du Colombier 	if(!oty)
16219b2ee8SDavid du Colombier 		return -1;
173e12c5d1SDavid du Colombier 	if(!s)
183e12c5d1SDavid du Colombier 		return 1; /* a command interpreter is available */
193e12c5d1SDavid du Colombier 	pid = fork();
204d44ba9bSDavid du Colombier 	snprintf(cmd, sizeof cmd, "/%s/bin/ape/sh", oty);
213e12c5d1SDavid du Colombier 	if(pid == 0) {
22f19e7b74SDavid du Colombier 		execl(cmd, "sh", "-c", s, NULL);
233e12c5d1SDavid du Colombier 		_exit(1);
243e12c5d1SDavid du Colombier 	}
253e12c5d1SDavid du Colombier 	if(pid < 0){
263e12c5d1SDavid du Colombier 		_syserrno();
273e12c5d1SDavid du Colombier 		return -1;
283e12c5d1SDavid du Colombier 	}
293e12c5d1SDavid du Colombier 	for(;;) {
303e12c5d1SDavid du Colombier 		w = wait(&status);
313e12c5d1SDavid du Colombier 		if(w == -1 || w == pid)
323e12c5d1SDavid du Colombier 			break;
333e12c5d1SDavid du Colombier 	}
343e12c5d1SDavid du Colombier 
353e12c5d1SDavid du Colombier 	if(w == -1){
363e12c5d1SDavid du Colombier 		_syserrno();
373e12c5d1SDavid du Colombier 		return w;
383e12c5d1SDavid du Colombier 	}
393e12c5d1SDavid du Colombier 	return status;
403e12c5d1SDavid du Colombier }
41