X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/2c3059b12521d35820e41bed7b6b9322bb45a87c..32f555bf0f396f114033687e04d0e47c1d1457af:/usr/src/sys/ufs/lfs/lfs_vnops.c diff --git a/usr/src/sys/ufs/lfs/lfs_vnops.c b/usr/src/sys/ufs/lfs/lfs_vnops.c index 61e4662045..97ba1db405 100644 --- a/usr/src/sys/ufs/lfs/lfs_vnops.c +++ b/usr/src/sys/ufs/lfs/lfs_vnops.c @@ -1,4 +1,4 @@ -/* lfs_vnops.c 4.4 %G% */ +/* lfs_vnops.c 4.20 82/03/16 */ #include "../h/param.h" #include "../h/systm.h" @@ -14,6 +14,8 @@ #include "../h/conf.h" #include "../h/stat.h" #include "../h/inline.h" +#include "../h/socket.h" +#include "../h/socketvar.h" /* * the fstat system call. @@ -28,13 +30,16 @@ fstat() uap = (struct a *)u.u_ap; fp = getf(uap->fdes); - if(fp == NULL) + if (fp == NULL) return; - stat1(fp->f_inode, uap->sb, fp->f_flag&FPIPE? fp->f_un.f_offset: 0); + if (fp->f_flag & FSOCKET) + u.u_error = sostat(fp->f_socket, uap->sb); + else + stat1(fp->f_inode, uap->sb); } /* - * the stat system call. + * Stat system call. This version does not follow links. */ stat() { @@ -45,10 +50,29 @@ stat() } *uap; uap = (struct a *)u.u_ap; - ip = namei(uchar, 0); - if(ip == NULL) + ip = namei(uchar, 0, 0); + if (ip == NULL) return; - stat1(ip, uap->sb, (off_t)0); + stat1(ip, uap->sb); + iput(ip); +} + +/* + * Lstat system call. This version does follow links. + */ +lstat() +{ + register struct inode *ip; + register struct a { + char *fname; + struct stat *sb; + } *uap; + + uap = (struct a *)u.u_ap; + ip = namei(uchar, 0, 1); + if (ip == NULL) + return; + stat1(ip, uap->sb); iput(ip); } @@ -56,10 +80,9 @@ stat() * The basic routine for fstat and stat: * get the inode and pass appropriate parts back. */ -stat1(ip, ub, pipeadj) -register struct inode *ip; -struct stat *ub; -off_t pipeadj; +stat1(ip, ub) + register struct inode *ip; + struct stat *ub; { register struct dinode *dp; register struct buf *bp; @@ -67,7 +90,7 @@ off_t pipeadj; IUPDAT(ip, &time, &time, 0); /* - * first copy from inode table + * First copy from inode table */ ds.st_dev = ip->i_dev; ds.st_ino = ip->i_number; @@ -76,7 +99,7 @@ off_t pipeadj; ds.st_uid = ip->i_uid; ds.st_gid = ip->i_gid; ds.st_rdev = (dev_t)ip->i_un.i_rdev; - ds.st_size = ip->i_size - pipeadj; + ds.st_size = ip->i_size; /* * next the dates in the disk */ @@ -91,6 +114,80 @@ off_t pipeadj; u.u_error = EFAULT; } +/* + * Return target name of a symbolic link + */ +readlink() +{ + register struct inode *ip; + register struct a { + char *name; + char *buf; + int count; + } *uap; + + ip = namei(uchar, 0, 0); + if (ip == NULL) + return; + if ((ip->i_mode&IFMT) != IFLNK) { + u.u_error = ENXIO; + goto out; + } + uap = (struct a *)u.u_ap; + u.u_offset = 0; + u.u_base = uap->buf; + u.u_count = uap->count; + u.u_segflg = 0; + readi(ip); +out: + iput(ip); + u.u_r.r_val1 = uap->count - u.u_count; +} + +/* + * symlink -- make a symbolic link + */ +symlink() +{ + register struct a { + char *target; + char *linkname; + } *uap; + register struct inode *ip; + register char *tp; + register c, nc; + + uap = (struct a *)u.u_ap; + tp = uap->target; + nc = 0; + while (c = fubyte(tp)) { + if (c < 0) { + u.u_error = EFAULT; + return; + } + tp++; + nc++; + } + u.u_dirp = uap->linkname; + ip = namei(uchar, 1, 0); + if (ip) { + iput(ip); + u.u_error = EEXIST; + return; + } + if (u.u_error) + return; + ip = maknode(IFLNK | 0777); + if (ip == NULL) + return; + u.u_base = uap->target; + u.u_count = nc; + u.u_offset = 0; + u.u_segflg = 0; + writei(ip); + iput(ip); +} + /* * the dup system call. */ @@ -107,7 +204,7 @@ dup() m = uap->fdes & ~077; uap->fdes &= 077; fp = getf(uap->fdes); - if(fp == NULL) + if (fp == NULL) return; if ((m&0100) == 0) { if ((i = ufalloc()) < 0) @@ -118,22 +215,20 @@ dup() u.u_error = EBADF; return; } - if (u.u_vrpages[i]) { - u.u_error = ETXTBSY; - return; - } u.u_r.r_val1 = i; } - if (i!=uap->fdes) { + if (i != uap->fdes) { if (u.u_ofile[i]!=NULL) - closef(u.u_ofile[i]); + closef(u.u_ofile[i], 0); + if (u.u_error) + return; u.u_ofile[i] = fp; fp->f_count++; } } /* - * the mount system call. + * Mount system call. */ smount() { @@ -148,34 +243,35 @@ smount() char *freg; int ronly; } *uap; + register char *cp; uap = (struct a *)u.u_ap; dev = getmdev(); - if(u.u_error) + if (u.u_error) return; u.u_dirp = (caddr_t)uap->freg; - ip = namei(uchar, 0); - if(ip == NULL) + ip = namei(uchar, 0, 1); + if (ip == NULL) return; - if(ip->i_count!=1 || (ip->i_mode&(IFBLK&IFCHR))!=0) + if (ip->i_count!=1 || (ip->i_mode&IFMT) != IFDIR) goto out; smp = NULL; - for(mp = &mount[0]; mp < &mount[NMOUNT]; mp++) { - if(mp->m_bufp != NULL) { - if(dev == mp->m_dev) + for (mp = &mount[0]; mp < &mount[NMOUNT]; mp++) { + if (mp->m_bufp != NULL) { + if (dev == mp->m_dev) goto out; } else - if(smp == NULL) + if (smp == NULL) smp = mp; } mp = smp; - if(mp == NULL) + if (mp == NULL) goto out; (*bdevsw[major(dev)].d_open)(dev, !uap->ronly); - if(u.u_error) + if (u.u_error) goto out; bp = bread(dev, SUPERB); - if(u.u_error) { + if (u.u_error) { brelse(bp); goto out1; } @@ -189,9 +285,14 @@ smount() fp->s_ronly = uap->ronly & 1; fp->s_nbehind = 0; fp->s_lasti = 1; + u.u_dirp = uap->freg; + for (cp = fp->s_fsmnt; cp < &fp->s_fsmnt[sizeof (fp->s_fsmnt) - 1]; ) + if ((*cp++ = uchar()) == 0) + u.u_dirp--; /* get 0 again */ + *cp = 0; brelse(bp); ip->i_flag |= IMOUNT; - prele(ip); + irele(ip); return; out: @@ -215,18 +316,19 @@ sumount() }; dev = getmdev(); - if(u.u_error) + if (u.u_error) return; xumount(dev); /* remove unused sticky files from text table */ - update(); - for(mp = &mount[0]; mp < &mount[NMOUNT]; mp++) - if(mp->m_bufp != NULL && dev == mp->m_dev) + update(0); + for (mp = &mount[0]; mp < &mount[NMOUNT]; mp++) + if (mp->m_bufp != NULL && dev == mp->m_dev) goto found; u.u_error = EINVAL; return; found: - for(ip = &inode[0]; ip < &inode[NINODE]; ip++) + stillopen = 0; + for (ip = inode; ip < inodeNINODE; ip++) if (ip->i_number != 0 && dev == ip->i_dev) { u.u_error = EBUSY; return; @@ -235,7 +337,7 @@ found: stillopen++; ip = mp->m_inodp; ip->i_flag &= ~IMOUNT; - plock(ip); + ilock(ip); iput(ip); if ((bp = getblk(dev, SUPERB)) != mp->m_bufp) panic("umount"); @@ -243,8 +345,8 @@ found: flag = !bp->b_un.b_filsys->s_ronly; mp->m_bufp = NULL; brelse(bp); + mpurge(mp - &mount[0]); if (!stillopen) { - mpurge(mp - &mount[0]); (*bdevsw[major(dev)].d_close)(dev, flag); binval(dev); } @@ -263,13 +365,13 @@ getmdev() if (!suser()) return(NODEV); - ip = namei(uchar, 0); - if(ip == NULL) + ip = namei(uchar, 0, 1); + if (ip == NULL) return(NODEV); - if((ip->i_mode&IFMT) != IFBLK) + if ((ip->i_mode&IFMT) != IFBLK) u.u_error = ENOTBLK; dev = (dev_t)ip->i_un.i_rdev; - if(major(dev) >= nblkdev) + if (major(dev) >= nblkdev) u.u_error = ENXIO; iput(ip); return(dev);