13 #define FATAL "preline: fatal: "
17 strerr_die1x(100,"preline: usage: preline cmd [ arg ... ]");
20 int flagufline
= 1; char *ufline
;
21 int flagrpline
= 1; char *rpline
;
22 int flagdtline
= 1; char *dtline
;
24 char outbuf
[SUBSTDIO_OUTSIZE
];
25 char inbuf
[SUBSTDIO_INSIZE
];
26 substdio ssout
= SUBSTDIO_FDBUF(write
,1,outbuf
,sizeof outbuf
);
27 substdio ssin
= SUBSTDIO_FDBUF(read
,0,inbuf
,sizeof inbuf
);
40 if (!(ufline
= env_get("UFLINE"))) die_usage();
41 if (!(rpline
= env_get("RPLINE"))) die_usage();
42 if (!(dtline
= env_get("DTLINE"))) die_usage();
44 while ((opt
= getopt(argc
,argv
,"frdFRD")) != opteof
)
46 case 'f': flagufline
= 0; break;
47 case 'r': flagrpline
= 0; break;
48 case 'd': flagdtline
= 0; break;
49 case 'F': flagufline
= 1; break;
50 case 'R': flagrpline
= 1; break;
51 case 'D': flagdtline
= 1; break;
56 if (!*argv
) die_usage();
59 strerr_die2sys(111,FATAL
,"unable to create pipe: ");
63 strerr_die2sys(111,FATAL
,"unable to fork: ");
67 if (fd_move(0,pi
[0]) == -1)
68 strerr_die2sys(111,FATAL
,"unable to set up fds: ");
71 strerr_die4sys(error_temp(errno
) ?
111 : 100,FATAL
,"unable to run ",*argv
,": ");
74 if (fd_move(1,pi
[1]) == -1)
75 strerr_die2sys(111,FATAL
,"unable to set up fds: ");
77 if (flagufline
) substdio_bputs(&ssout
,ufline
);
78 if (flagrpline
) substdio_bputs(&ssout
,rpline
);
79 if (flagdtline
) substdio_bputs(&ssout
,dtline
);
80 if (substdio_copy(&ssout
,&ssin
) != 0)
81 strerr_die2sys(111,FATAL
,"unable to copy input: ");
82 substdio_flush(&ssout
);
85 if (wait_pid(&wstat
,pid
) == -1)
86 strerr_die2sys(111,FATAL
,"wait failed: ");
87 if (wait_crashed(wstat
))
88 strerr_die2x(111,FATAL
,"child crashed");
89 _exit(wait_exitcode(wstat
));