|
|
1.1 root 1: #include "../h/param.h"
2: #include "../h/systm.h"
3: #include "../h/inode.h"
4: #include "../h/dir.h"
5: #include "../h/user.h"
6: #include "../h/buf.h"
7: #include "../h/conf.h"
8:
9: /*
10: * Convert a pathname into a pointer to
11: * a locked inode.
12: *
13: * func = function called to get next char of name
14: * &uchar if name is in user space
15: * &schar if name is in system space
16: * length guaranteed <= BUFSIZE if func != uchar
17: * flagp
18: 0 for ordinary searches
19: else ->flag structure with more parameters
20: * follow = 1 if links are to be followed at the end of the name
21: */
22:
23: struct inode *
24: namei(func, flagp, follow)
25: int (*func)();
26: struct argnamei *flagp;
27: int follow;
28: {
29: register int i;
30: register char *cp;
31: struct nx p;
32:
33: p.nbp = geteblk();
34: if(func == uchar) {
35: if((i = fustrlen(u.u_dirp)) < 0) {
36: u.u_error = EFAULT;
37: brelse(p.nbp);
38: return NULL;
39: }
40: if(i > BUFSIZE) {
41: u.u_error = ENOENT;
42: brelse(p.nbp);
43: return NULL;
44: }
45: bcopy(u.u_dirp, p.nbp->b_un.b_addr, i);
46: #ifdef CHAOS
47: u.u_dirp += i;
48: #endif
49: } else {
50: cp = p.nbp->b_un.b_addr;
51: do; while(*cp++ = (*func)());
52: }
53: if(flagp != NULL) {
54: cp = p.nbp->b_un.b_addr;
55: while(i = *cp++) {
56: if(i & 0200) {
57: u.u_error = ENOENT;
58: brelse(p.nbp);
59: return NULL;
60: }
61: }
62: }
63: cp = p.nbp->b_un.b_addr;
64: if(*cp == '/') {
65: while(*cp == '/')
66: cp++;
67: if((p.dp = u.u_rdir) == NULL)
68: p.dp = rootdir;
69: } else
70: p.dp = u.u_cdir;
71: p.nlink = 0;
72: p.cp = cp;
73: plock(p.dp);
74: p.dp->i_count++;
75:
76: for (;;) {
77: switch((*fstypsw[p.dp->i_fstyp].t_nami)(&p, &flagp, follow)) {
78: case 1:
79: iput(p.dp);
80: brelse(p.nbp);
81: return NULL;
82: case 2:
83: if(*p.cp)
84: break;
85: case 0:
86: brelse(p.nbp);
87: return p.dp;
88: default:
89: panic("namei ret");
90: }
91: }
92: }
93:
94: /*
95: * for filesystems without namei code
96: */
97:
98: int
99: nullnami()
100: {
101: u.u_error = ENODEV;
102: return (1);
103: }
104:
105: /*
106: * Return the next character from the
107: * kernel string pointed at by dirp.
108: */
109: schar()
110: {
111:
112: return(*u.u_dirp++ & 0377);
113: }
114:
115: /*
116: * Return the next character from the
117: * user string pointed at by dirp.
118: */
119: uchar()
120: {
121: register c;
122:
123: c = fubyte(u.u_dirp++);
124: if(c == -1) {
125: u.u_error = EFAULT;
126: c = 0;
127: }
128: return(c);
129: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.