int main(int argc, char *argv[]) { int split; char **argv1,**argv2; int p1[2],p2[2]; int dirchar=0; progname=argv[0]; argv++; argc--; alternate_fd(); split=splitindex(argc,argv,&dirchar); if (argc < 3 || split == 0 || split >= argc-1) usage(); pipe(p1); pipe(p2); argv[split]=NULL; argv1=argv; argv2=argv+(split+1); if (fork()) { close(p1[1]); close(p2[0]); dup2(p1[0],STDIN_FILENO); dup2(p2[1],STDOUT_FILENO); close(p1[0]); close(p2[1]); execvp(argv1[0],argv1); } else { close(p2[1]); close(p1[0]); dup2(p2[0],STDIN_FILENO); dup2(p1[1],STDOUT_FILENO); close(p1[1]); close(p2[0]); recmain(argc-split-1,argv2,dirchar); } return (0); }
int main(int argc, char *argv[]) { int split; char **argv1,**argv2; int p1[2],p2[2]; int dirchar=0; int daemonize=0; char *pidfile=NULL; int pgrp; int argflag; int err=0; progname=argv[0]; argv++; argc--; do { argflag=0; if (argv[0] && *argv[0] == '-') { argflag++; argv[0]++; if (*argv[0] == '-') { argv[0]++; if (strcmp(argv[0],"daemon") == 0) daemonize = 1; else if (strcmp(argv[0],"pidfile") == 0) { pidfile = argv[argflag]; argflag++; } else { fprintf(stderr,"unknown option --%s\n",argv[0]); err++; } } else { while (*argv[0] != 0) { switch (*argv[0]) { case 0: break; case 'd': daemonize = 1; break; case 'p': pidfile = argv[argflag]; argflag++; break; default: fprintf(stderr,"unknown option -%c\n",*argv[0]); err++; } if (*argv[0] != 0) argv[0]++; } } argv += argflag; argc -= argflag; } } while (argflag); if (err) exit(1); if (daemonize != 0) daemon(0,0); else if (setpgrp() != 0) { fprintf(stderr,"Err: cannot create pgrp\n"); exit(1); } pgrp = getpgrp(); if (pidfile != NULL) { FILE *f=fopen(pidfile, "w"); if (f != NULL) { fprintf(f,"-%d\n",pgrp); fclose(f); } } alternate_fd(); split=splitindex(argc,argv,&dirchar); if (argc < 3 || split == 0 || split >= argc-1) usage(); pipe(p1); pipe(p2); argv[split]=NULL; argv1=argv; argv2=argv+(split+1); if (fork()) { close(p1[1]); close(p2[0]); dup2(p1[0],STDIN_FILENO); dup2(p2[1],STDOUT_FILENO); close(p1[0]); close(p2[1]); execvp(argv1[0],argv1); } else { close(p2[1]); close(p1[0]); dup2(p2[0],STDIN_FILENO); dup2(p1[1],STDOUT_FILENO); close(p1[1]); close(p2[0]); recmain(argc-split-1,argv2,dirchar); } return (0); }