#include #include #include #include #define tst(a,b) (*mode == 'r'? (b) : (a)) #define RDR 0 #define WTR 1 static int popen_pid[20]; FILE * mypopen(char *path_cmd, char *cmd, char *mode, int *pid2, char *path) { int p[2]; register myside, hisside, pid; char pwd[512]; char *parametros[200]; char orden[100]; int i, j = 0, ant = 0; int primero = 1; int HuboComillas = 0; if(pipe(p) < 0) return NULL; myside = tst(p[WTR], p[RDR]); hisside = tst(p[RDR], p[WTR]); if((pid = fork()) == 0) { /* myside and hisside reverse roles in child */ close(myside); dup2(hisside, tst(0, 1)); close(hisside); if (path) chdir (path); memset (parametros, 0, 200); memset (orden, 0, 100); for (i = 0; 1; i ++) { if (HuboComillas) { if (cmd[i] == '\"' || cmd[i] == 0) { parametros[j] = (char *) calloc (i - ant + 1, sizeof (char)); strncpy (parametros[j], &cmd[ant], i - ant); j++; i++; /* Me salto las comillas de cierre */ while (cmd[i] == ' ' || cmd[i] == '\t') i ++; HuboComillas = 0; if (cmd[i] == '\"') { HuboComillas = 1; i ++; /* Me salto las comillas de apertura */ } ant = i; } } else { if (cmd[i] == ' ' || cmd[i] == '\t' || cmd[i] == 0) { if (primero) { primero = 0; parametros[j] = (char *) calloc (i - ant + 2 + strlen (path_cmd), sizeof (char)); strncpy (orden, &cmd[ant], i - ant); sprintf (parametros[j], "%s/%s", path_cmd, orden); j++; strcpy (orden, parametros[j-1]); } else { parametros[j] = (char *) calloc (i - ant + 1, sizeof (char)); strncpy (parametros[j], &cmd[ant], i - ant); j++; } while (cmd[i] == ' ' || cmd[i] == '\t') i ++; if (cmd[i] == '\"') { HuboComillas = 1; i ++; /* Me salto las comillas de apertura */ } ant = i; } } if (!cmd[i]) { break; } } execv (orden, parametros); for (j = 0; parametros[j]; j ++) { free (parametros[j]); } //execl("/bin/sh", "sh", "-c", cmd, 0); //execl("/bin/sh", "sh", "-c", cmd, 0); _exit(1); } if(pid == -1) return NULL; popen_pid[myside] = pid; *pid2 = pid; close(hisside); return(fdopen(myside, mode)); } int mypclose(FILE *ptr) { register f, r, (*hstat)(), (*istat)(), (*qstat)(); int status; f = fileno(ptr); fclose(ptr); istat = signal(SIGINT, SIG_IGN); qstat = signal(SIGQUIT, SIG_IGN); hstat = signal(SIGHUP, SIG_IGN); while((r = wait(&status)) != popen_pid[f] && r != -1); if(r == -1) status = -1; signal(SIGINT, istat); signal(SIGQUIT, qstat); signal(SIGHUP, hstat); return(status); }