#include /* fprintf(3), stderr */ #include /* EX_USAGE */ #include /* execvp(3) */ #include /* */ #include /* wait(2) */ #include "psargs.h" static char *program_name = "pscat"; #define L_PAREN '[' #define R_PAREN ']' int forking(char **argv){ int child; char **corr; corr = corresponding_arg(argv, L_PAREN, R_PAREN); *corr = NULL; if(fork() == 0){ execvp(argv[1], argv+1); }else{ wait(&child); argv = corr; if(*++argv == NULL) return WIFEXITED(child) * WEXITSTATUS(child); else return forking(argv); } } int main(int argc, char *argv[]){ if(check_arg(++argv, L_PAREN, R_PAREN) == 0){ fprintf(stderr, "Usage: %s \"[\" [utility [argument...]] \"]\" ...\n", argv[-1] == NULL ? program_name : argv[-1] ); return EX_USAGE; }else return forking(argv); }