-/* vfs_lookup.c 3.1 %H% */
+/* vfs_lookup.c 4.3 %G% */
#include "../h/param.h"
#include "../h/systm.h"
#include "../h/dir.h"
#include "../h/user.h"
#include "../h/buf.h"
+#include "../h/conf.h"
/*
* Convert a pathname into a pointer to
register c;
register char *cp;
struct buf *bp;
+ register struct direct *ep;
int i;
dev_t d;
off_t eo;
if((c=(*func)()) == '/')
if ((dp = u.u_rdir) == NULL)
dp = rootdir;
- VOID iget(dp->i_dev, dp->i_number);
+ (void) iget(dp->i_dev, dp->i_number);
while(c == '/')
c = (*func)();
if(c == '\0' && flag != 0)
if(c == '\0')
return(dp);
+#ifdef CHAOS
+ if((dp->i_mode&IFMT) == IFCHR && cdevpath & (1 << major(dp->i_un.i_rdev)) ) {
+ u.u_dirp--;
+ return(dp);
+ }
+#endif
+
/*
* If there is another component,
* Gather up name into
while (c != '/' && c != '\0' && u.u_error == 0 ) {
if (mpxip!=NULL && c=='!')
break;
- if(cp < &u.u_dbuf[DIRSIZ])
+ if (flag==1 && c == ('/'|0200)) {
+ u.u_error = ENOENT;
+ goto out;
+ }
+ if (cp < &u.u_dbuf[DIRSIZ])
*cp++ = c;
c = (*func)();
}
if((dp->i_mode&IFMT) != IFDIR)
u.u_error = ENOTDIR;
- VOID access(dp, IEXEC);
+ (void) access(dp, IEXEC);
if(u.u_error)
goto out;
if(u.u_offset >= dp->i_size) {
if(bp != NULL)
brelse(bp);
- if(flag==1 && c=='\0') {
+ if(flag==1 && c=='\0' && dp->i_nlink) {
if(access(dp, IWRITE))
goto out;
u.u_pdir = dp;
brelse(bp);
goto out;
}
- }
+ ep = (struct direct *)bp->b_un.b_addr;
+ } else
+ ep++;
/*
* Note first empty directory slot
* If they do not match, go back to eloop.
*/
- bcopy(bp->b_un.b_addr+(u.u_offset&BMASK), (caddr_t)&u.u_dent,
- sizeof(struct direct));
u.u_offset += sizeof(struct direct);
- if(u.u_dent.d_ino == 0) {
+ if(ep->d_ino == 0) {
if(eo == 0)
eo = u.u_offset;
goto eloop;
}
for(i=0; i<DIRSIZ; i++) {
- if(u.u_dbuf[i] != u.u_dent.d_name[i])
+ if(u.u_dbuf[i] != ep->d_name[i])
goto eloop;
if(u.u_dbuf[i] == 0)
break;
* If there is more pathname, go back to
* cloop, otherwise return.
*/
-
+ bcopy((caddr_t)ep, (caddr_t)&u.u_dent, sizeof(struct direct));
if(bp != NULL)
brelse(bp);
if(flag==2 && c=='\0') {