bool shellout_write(const char *cmd, list_t *seeked, int nlines) { ui_term(); FILE *subp = popen(cmd, "w"); if(!subp){ fprintf(stderr, "fork/exec: %s", strerror(errno)); return false; } int r = list_write_file(seeked, nlines, subp, /*eol*/true); int errno_write = errno; int waitret = pclose(subp); int errno_wait = errno; if(r){ fprintf(stderr, "write subprocess: %s", strerror(errno_write)); return false; } if(WIFEXITED(waitret)){ int ec = WEXITSTATUS(waitret); if(ec) fprintf(stderr, "command returned %d\n", ec); }else if(WIFSIGNALED(waitret)){ fprintf(stderr, "command signalled with %d\n", WTERMSIG(waitret)); }else if(WIFSTOPPED(waitret)){ fprintf(stderr, "command stopped with %d\n", WSTOPSIG(waitret)); }else{ fprintf(stderr, "unknown state from wait()/pclose(): %d: %s", waitret, strerror(errno_wait)); } shellout_wait_ret(); return true; }
int main(int argc, char **argv) { int i; unsigned offset = 0; enum windows_init_args initargs = WIN_NONE; for(i = 1; i < argc; i++){ if(!strcmp(argv[i], "-O")){ initargs = WIN_VALL; }else if(!strcmp(argv[i], "-o")){ initargs = WIN_HALL; }else if(*argv[i] == '+'){ char *p = argv[i] + 1; while(isdigit(*p)) p++; if(*p == '\0' && sscanf(argv[i]+1, "%u", &offset) == 1){ /* continue */ if(offset > 0) offset--; /* 1-base -> 0-base */ }else{ break; } }else{ break; } } ui_init(); /* must be before buffers_init() */ windows_init(argc - i, argv + i, initargs, offset); int r = ui_main(); ui_term(); windows_term(); return r; }
int shellout(const char *cmd) { const char *shcmd; int r; if(cmd){ shcmd = cmd; }else{ const char *shell = getenv("SHELL"); if(!shell) shell = "sh"; shcmd = shell; } ui_term(); r = system(shcmd); shellout_wait_ret(); ui_init(); return r; }