|
|
1.1 root 1:
2:
3:
4: /*
5: ospipe( ioptr ) builds a pipe for the input association.
6: the value returned is the file descriptor.
7: */
8:
9: #include "spitblks.h"
10: #include "spitio.h"
11:
12: ospipe( ioptr )
13:
14: struct ioblk *ioptr;
15:
16: {
17: int childfd, childpid, fd[2], len, parentfd, status;
18: char *cp;
19: struct scblk *scptr;
20:
21: if ( (status = pipe( fd )) < 0 )
22: return -1;
23:
24: if ( ioptr -> flg & IO_INP ) {
25: parentfd = fd[0];
26: childfd = fd[1];
27: } else {
28: parentfd = fd[1];
29: childfd = fd[0];
30: }
31:
32: switch ( childpid = fork() ) {
33:
34: case -1:
35: close( parentfd );
36: close( childfd );
37: parentfd = -1;
38: break;
39:
40: case 0:
41: if ( ioptr -> flg & IO_INP )
42: close( 1 );
43: else
44: close( 0 );
45: dup( childfd );
46: for ( childfd = 3; childfd <= 32; close( childfd++ ));
47: scptr = ioptr -> fnm;
48: cp = scptr -> str;
49: len = lenfnm( scptr );
50: cp[len] = '\0';
51: if ( cp[len - 1] == cp[1] )
52: cp[len - 1] = ' ';
53: cp[1] = ' ';
54: cp[0] = ' ';
55: execl( "/bin/sh","sh","-c",cp,0 );
56: break;
57:
58: default:
59: ioptr -> pid = childpid;
60: close( childfd );
61: break;
62: }
63:
64: return parentfd;
65:
66: }
67:
68:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.