int _pSLstring_list_push (_pSLString_List_Type *p, int delete_list) { SLang_Array_Type *at; if ((p == NULL) || (p->buf == NULL)) { int ret = SLang_push_null (); if (delete_list) _pSLstring_list_delete (p); return ret; } if (NULL == (at = string_list_to_array (p, delete_list))) return -1; return SLang_push_array (at, 1); }
/* run arglist[0] with arglist and redirect std{in,out,err} */ int run_rw(int in, int out, int err, struct string_list *arglist) { pid_t pid, wpid; int status, retcode; char *fn; if (string_list_empty(arglist)) { fprintf(stderr, "arglist is empty\n"); return -1; } fn = arglist->tqh_first->s; wpid = fork(); if (wpid < 0) { fprintf(stderr, "fork() err: %m\n"); return -1; } else if (wpid == 0) { char **argv; int i; string_list_to_array(arglist, &argv); for (i = 0; argv[i]; i++) printf("%s ", argv[i]); printf("\n"); fflush(stdout); /* allow C-c for child */ signal(SIGINT, SIG_DFL); close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO); dup2(in, STDIN_FILENO); dup2(out, STDOUT_FILENO); dup2(err, STDERR_FILENO); close(in); close(out); close(err); /* TODO: last syncronization before start */ execvp(fn, (char *const *)argv); fprintf(stderr, "execve(%s) err: %m\n", fn); fflush(stderr); exit(-1); } while ((pid = waitpid(wpid, &status, 0)) == -1) if (errno != EINTR) break; if (pid < 0) { fprintf(stderr, "waitpid() err: %m\n"); return -1; } if (WIFEXITED(status)) { if ((retcode = WEXITSTATUS(status))) { fprintf(stderr, "%s failed, exitcode=%d\n", fn, retcode); return -1; } } else if (WIFSIGNALED(status)) { fprintf(stderr, "%s got signal %d\n", fn, WTERMSIG(status)); return -1; } else { fprintf(stderr, "%s exited with status %d\n", fn, status); return -1; } return 0; }