|
|
1.1 root 1: #include "sys/param.h"
2: #include "sys/systm.h"
3: #include "sys/user.h"
4: #include "sys/inode.h"
5: #include "sys/file.h"
6: #include "sys/proc.h"
7: #include "sys/stream.h"
8: #include "sys/stat.h"
9: #include "sys/conf.h"
10:
11: static struct inode *mkpipend();
12: extern struct streamtab nilinfo;
13:
14: #define PIPFSTYP 6 /* until we do it right */
15:
16: /*
17: * The sys-pipe entry.
18: * Allocate 2 open inodes, stream them, and splice them together
19: */
20: pipe()
21: {
22: struct inode *ip1, *ip2;
23: register struct file *rf, *wf;
24: register r;
25:
26: rf = falloc();
27: if(rf == NULL)
28: return;
29: r = u.u_r.r_val1;
30: wf = falloc();
31: if(wf == NULL) {
32: rf->f_count = 0;
33: u.u_ofile[r] = NULL;
34: return;
35: }
36: u.u_r.r_val2 = u.u_r.r_val1;
37: u.u_r.r_val1 = r;
38: if (makepipe(&ip1, &ip2)==0) {
39: rf->f_count = 0;
40: wf->f_count = 0;
41: u.u_ofile[u.u_r.r_val1] = NULL;
42: u.u_ofile[u.u_r.r_val2] = NULL;
43: return;
44: }
45: wf->f_flag = FREAD|FWRITE;
46: wf->f_inode = ip1;
47: rf->f_flag = FREAD|FWRITE;
48: rf->f_inode = ip2;
49: }
50:
51: /*
52: * also called by connld, unfortunately
53: */
54: makepipe(ip1, ip2)
55: struct inode **ip1, **ip2;
56: {
57: register struct inode *i1, *i2;
58:
59: if (nfstyp <= PIPFSTYP || fstypsw[PIPFSTYP] == NULL) { /* config error */
60: u.u_error = ENODEV;
61: return (0);
62: }
63: i1 = mkpipend();
64: i2 = mkpipend();
65: if (i1==NULL || i2==NULL) {
66: if (i1)
67: iput(i1);
68: if (i2)
69: iput(i2);
70: return(0);
71: }
72: qdetach(RD(i1->i_sptr->wrq->next), 1);
73: i1->i_sptr->wrq->next = RD(i2->i_sptr->wrq);
74: qdetach(RD(i2->i_sptr->wrq->next), 1);
75: i2->i_sptr->wrq->next = RD(i1->i_sptr->wrq);
76: *ip1 = i1;
77: *ip2 = i2;
78: return(1);
79: }
80:
81: static struct inode *
82: mkpipend()
83: {
84: register struct inode *ip;
85:
86: if ((ip = iuniq(PIPFSTYP)) == NULL)
87: return(NULL);
88: if ((ip = stopen(&nilinfo, NODEV, 0, ip)) == NULL)
89: return(NULL);
90: ip->i_flag |= IOPEN; /* white lie */
91: prele(ip);
92: return(ip);
93: }
94:
95: /*
96: * pipe file system:
97: * exists just so pipe creation is fast
98: * inodes are in-core only
99: * must be configured, but can't be mounted,
100: * which is a little unfortunate
101: * only stat exists
102: */
103:
104: static int pipstat();
105: struct fstypsw pipfs =
106: fsinit(nulldev, nulldev, nodev, nodev, nodev, pipstat,
107: nullnami, nodev, nodev, nullopen, nodev);
108:
109: static
110: pipstat(ip, ub)
111: register struct inode *ip;
112: struct stat *ub;
113: {
114: struct stat ds;
115:
116: ds.st_dev = ip->i_dev;
117: ds.st_ino = ip->i_number;
118: ds.st_mode = ip->i_mode;
119: ds.st_nlink = 0;
120: ds.st_uid = ip->i_uid;
121: ds.st_gid = ip->i_gid;
122: ds.st_size = 0;
123: ds.st_atime = time;
124: ds.st_mtime = time;
125: ds.st_ctime = time;
126: if (copyout((caddr_t)&ds, (caddr_t)ub, sizeof(ds)) < 0)
127: u.u_error = EFAULT;
128: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.