|
|
1.1 root 1: /* sys3.c 4.9 81/03/08 */
2:
3: #include "sys/param.h"
4: #include "sys/systm.h"
5: #include "sys/buf.h"
6: #include "sys/user.h"
7: #include "sys/inode.h"
8: #include "sys/file.h"
9: #include "sys/conf.h"
10: #include "sys/stat.h"
11:
12: /*
13: * the fstat system call.
14: */
15: fstat()
16: {
17: register struct file *fp;
18: register struct a {
19: int fdes;
20: struct stat *sb;
21: } *uap;
22: register struct inode *ip;
23:
24: uap = (struct a *)u.u_ap;
25: fp = getf(uap->fdes);
26: if(fp == NULL) {
27: u.u_error = EBADF;
28: return;
29: }
30: ip = fp->f_inode;
31: plock(ip);
32: iupdat(ip, &time, &time, 0);
33: (*fstypsw[ip->i_fstyp]->t_stat)(ip, uap->sb);
34: prele(ip);
35: }
36:
37: /*
38: * the stat system call. This version follows links.
39: */
40: stat()
41: {
42: register struct inode *ip;
43: register struct a {
44: char *fname;
45: struct stat *sb;
46: } *uap;
47:
48: uap = (struct a *)u.u_ap;
49: ip = namei(uap->fname, SEGUDATA, &nilargnamei, 1);
50: if(ip == NULL)
51: return;
52: iupdat(ip, &time, &time, 0);
53: (*fstypsw[ip->i_fstyp]->t_stat)(ip, uap->sb);
54: iput(ip);
55: }
56:
57: /*
58: * the lstat system call. This version does not follow links.
59: */
60: lstat()
61: {
62: register struct inode *ip;
63: register struct a {
64: char *fname;
65: struct stat *sb;
66: } *uap;
67:
68: uap = (struct a *)u.u_ap;
69: ip = namei(uap->fname, SEGUDATA, &nilargnamei, 0);
70: if(ip == NULL)
71: return;
72: iupdat(ip, &time, &time, 0);
73: (*fstypsw[ip->i_fstyp]->t_stat)(ip, uap->sb);
74: iput(ip);
75: }
76:
77: /*
78: * readlink -- return target name of a symbolic link
79: */
80: readlink()
81: {
82: register struct inode *ip;
83: register struct a {
84: char *name;
85: char *buf;
86: int count;
87: } *uap;
88:
89: uap = (struct a *)u.u_ap;
90: ip = namei(uap->name, SEGUDATA, &nilargnamei, 0);
91: if (ip == NULL)
92: return;
93: if ((ip->i_mode&IFMT) != IFLNK) {
94: u.u_error = ENXIO;
95: goto out;
96: }
97: u.u_offset = ltoL(0);
98: u.u_base = uap->buf;
99: u.u_count = uap->count;
100: u.u_segflg = SEGUDATA;
101: readi(ip);
102: out:
103: iput(ip);
104: u.u_r.r_val1 = uap->count - u.u_count;
105: }
106:
107: /*
108: * symlink -- make a symbolic link
109: */
110: symlink()
111: {
112: register struct a {
113: char *target;
114: char *linkname;
115: } *uap;
116: register struct inode *ip;
117: register nc;
118: struct argnamei nmarg;
119:
120: uap = (struct a *)u.u_ap;
121: if ((nc = fustrlen(uap->target)) < 0) {
122: u.u_error = EFAULT;
123: return;
124: }
125: nc--; /* fustrlen includes NUL at end */
126: nmarg = nilargnamei;
127: nmarg.flag = NI_NXCREAT;
128: nmarg.un.mode = IFLNK|0777;
129: ip = namei(uap->linkname, SEGUDATA, &nmarg, 0);
130: if (ip == NULL)
131: return;
132: u.u_base = uap->target;
133: u.u_count = nc;
134: u.u_offset = ltoL(0);
135: u.u_segflg = SEGUDATA;
136: writei(ip);
137: iput(ip);
138: }
139:
140: /*
141: * the dup system call.
142: */
143: dup()
144: {
145: register struct file *fp;
146: register struct a {
147: int fdes;
148: int fdes2;
149: } *uap;
150: register i, m;
151:
152: uap = (struct a *)u.u_ap;
153: m = uap->fdes & ~077;
154: uap->fdes &= 077;
155: fp = getf(uap->fdes);
156: if(fp == NULL) {
157: u.u_error = EBADF;
158: return;
159: }
160: if ((m&0100) == 0) {
161: if ((i = ufalloc()) < 0)
162: return;
163: } else {
164: i = uap->fdes2;
165: if (i<0 || i>=NOFILE) {
166: u.u_error = EBADF;
167: return;
168: }
169: u.u_r.r_val1 = i;
170: }
171: if (i!=uap->fdes) {
172: if (u.u_ofile[i]!=NULL)
173: closef(u.u_ofile[i]);
174: u.u_ofile[i] = fp;
175: u.u_pofile[i] = 0;
176: fp->f_count++;
177: }
178: }
179:
180: /* dirread(fd, buf, buflen) */
181: dirread()
182: { struct a {
183: int fdes;
184: char *buf;
185: int len;
186: } *uap;
187: register struct file *fp;
188: register struct inode *ip;
189:
190: uap = (struct a *)u.u_ap;
191: fp = getf(uap->fdes);
192: if(fp == NULL) {
193: u.u_error = EBADF;
194: return;
195: }
196: if((fp->f_flag&FREAD) == 0) {
197: u.u_error = EBADF;
198: return;
199: }
200: u.u_offset = fp->f_offset;
201: u.u_base = uap->buf;
202: ip = fp->f_inode;
203: plock(ip);
204: ip->i_flag |= IACC;
205: (*fstypsw[ip->i_fstyp]->t_dirread)(ip, uap->len);
206: fp->f_offset = u.u_offset;
207: prele(ip);
208: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.