Annotation of Net2/miscfs/fdesc/fdesc_vnops.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1990, 1992 Jan-Simon Pendry
                      3:  * All rights reserved.
                      4:  *
                      5:  * This code is derived from software contributed to Berkeley by
                      6:  * Jan-Simon Pendry.
                      7:  *
                      8:  * Redistribution and use in source and binary forms, with or without
                      9:  * modification, are permitted provided that the following conditions
                     10:  * are met:
                     11:  * 1. Redistributions of source code must retain the above copyright
                     12:  *    notice, this list of conditions and the following disclaimer.
                     13:  * 2. Redistributions in binary form must reproduce the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer in the
                     15:  *    documentation and/or other materials provided with the distribution.
                     16:  * 3. All advertising materials mentioning features or use of this software
                     17:  *    must display the following acknowledgement:
                     18:  *      This product includes software developed by the University of
                     19:  *      California, Berkeley and its contributors.
                     20:  * 4. Neither the name of the University nor the names of its contributors
                     21:  *    may be used to endorse or promote products derived from this software
                     22:  *    without specific prior written permission.
                     23:  *
                     24:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     25:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     26:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     27:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     28:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     29:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     30:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     31:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     32:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     33:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     34:  * SUCH DAMAGE.
                     35:  *
                     36:  *     $Id: fdesc_vnops.c,v 1.3 1993/03/30 05:16:56 cgd Exp $
                     37:  */
                     38: 
                     39: /*
                     40:  * /dev/fd Filesystem
                     41:  */
                     42: 
                     43: #include "param.h"
                     44: #include "systm.h"
                     45: #include "types.h"
                     46: #include "time.h"
                     47: #include "proc.h"
                     48: #include "resourcevar.h"
                     49: #include "filedesc.h"
                     50: #include "vnode.h"
                     51: #include "file.h"
                     52: #include "stat.h"
                     53: #include "mount.h"
                     54: #include "namei.h"
                     55: #include "buf.h"
                     56: #include "miscfs/fdesc/fdesc.h"
                     57: 
                     58: #include "../ufs/dir.h"                /* For readdir() XXX */
                     59: 
                     60: /*
                     61:  * vp is the current namei directory
                     62:  * ndp is the name to locate in that directory...
                     63:  */
                     64: fdesc_lookup(dvp, ndp, p)
                     65:        struct vnode *dvp;
                     66:        struct nameidata *ndp;
                     67:        struct proc *p;
                     68: {
                     69:        char *pname = ndp->ni_ptr;
                     70:        int nfiles = p->p_fd->fd_nfiles;
                     71:        unsigned fd;
                     72:        int error;
                     73:        struct vnode *fvp;
                     74: 
                     75: #ifdef FDESC_DIAGNOSTIC
                     76:        printf("fdesc_lookup(%s)\n", pname);
                     77: #endif
                     78:        if (ndp->ni_namelen == 1 && *pname == '.') {
                     79:                ndp->ni_dvp = dvp;
                     80:                ndp->ni_vp = dvp;
                     81:                VREF(dvp);
                     82:                /*VOP_LOCK(dvp);*/
                     83:                return (0);
                     84:        }
                     85: 
                     86:        fd = 0;
                     87:        while (*pname >= '0' && *pname <= '9') {
                     88:                fd = 10 * fd + *pname++ - '0';
                     89:                if (fd >= nfiles)
                     90:                        break;
                     91:        }
                     92: 
                     93: #ifdef FDESC_DIAGNOSTIC
                     94:        printf("fdesc_lookup: fd = %d, *pname = %x\n", fd, *pname);
                     95: #endif
                     96:        if (*pname == '/') {
                     97:                error = ENOTDIR;
                     98:                goto bad;
                     99:        }
                    100: 
                    101:        if (*pname != '\0') {
                    102:                error = ENOENT;
                    103:                goto bad;
                    104:        }
                    105: 
                    106:        if (fd >= nfiles || p->p_fd->fd_ofiles[fd] == NULL) {
                    107:                error = EBADF;
                    108:                goto bad;
                    109:        }
                    110: 
                    111: #ifdef FDESC_DIAGNOSTIC
                    112:        printf("fdesc_lookup: allocate new vnode\n");
                    113: #endif
                    114:        error = getnewvnode(VT_UFS, dvp->v_mount, &fdesc_vnodeops, &fvp);
                    115:        if (error)
                    116:                goto bad;
                    117:        VTOFDESC(fvp)->f_fd = fd;
                    118:        /*VTOFDESC(fvp)->f_isroot = 0;*/
                    119:        ndp->ni_dvp = dvp;
                    120:        ndp->ni_vp = fvp;
                    121: #ifdef FDESC_DIAGNOSTIC
                    122:        printf("fdesc_lookup: newvp = %x\n", fvp);
                    123: #endif
                    124:        return (0);
                    125: 
                    126: bad:;
                    127:        ndp->ni_dvp = dvp;
                    128:        ndp->ni_vp = NULL;
                    129: #ifdef FDESC_DIAGNOSTIC
                    130:        printf("fdesc_lookup: error = %d\n", error);
                    131: #endif
                    132:        return (error);
                    133: }
                    134: 
                    135: fdesc_open(vp, mode, cred, p)
                    136:        struct vnode *vp;
                    137:        int mode;
                    138:        struct ucred *cred;
                    139:        struct proc *p;
                    140: {
                    141:        int error;
                    142:        struct filedesc *fdp;
                    143:        struct file *fp;
                    144:        int dfd;
                    145:        int fd;
                    146: 
                    147:        /*
                    148:         * Can always open the root (modulo perms)
                    149:         */
                    150:        if (vp->v_flag & VROOT)
                    151:                return (0);
                    152: 
                    153:        /*
                    154:         * XXX Kludge: set p->p_dupfd to contain the value of the
                    155:         * the file descriptor being sought for duplication. The error 
                    156:         * return ensures that the vnode for this device will be released
                    157:         * by vn_open. Open will detect this special error and take the
                    158:         * actions in dupfdopen.  Other callers of vn_open or VOP_OPEN
                    159:         * will simply report the error.
                    160:         */
                    161:        p->p_dupfd = VTOFDESC(vp)->f_fd;        /* XXX */
                    162:        return (ENODEV);
                    163: }
                    164: 
                    165: static int
                    166: fdesc_attr(fd, vap, cred, p)
                    167:        int fd;
                    168:        struct vattr *vap;
                    169:        struct ucred *cred;
                    170:        struct proc *p;
                    171: {
                    172:        struct filedesc *fdp = p->p_fd;
                    173:        struct file *fp;
                    174:        int error;
                    175: 
                    176: #ifdef FDESC_DIAGNOSTIC
                    177:        printf("fdesc_attr: fd = %d, nfiles = %d\n", fd, fdp->fd_nfiles);
                    178: #endif
                    179:        if (fd >= fdp->fd_nfiles || (fp = fdp->fd_ofiles[fd]) == NULL) {
                    180: #ifdef FDESC_DIAGNOSTIC
                    181:                printf("fdesc_attr: fp = %x (EBADF)\n", fp);
                    182: #endif
                    183:                return (EBADF);
                    184:        }
                    185: 
                    186:        /*
                    187:         * Can stat the underlying vnode, but not sockets because
                    188:         * they don't use struct vattrs.  Well, we could convert from
                    189:         * a struct stat back to a struct vattr, later...
                    190:         */
                    191:        switch (fp->f_type) {
                    192:        case DTYPE_VNODE:
                    193:                error = VOP_GETATTR((struct vnode *) fp->f_data, vap, cred, p);
                    194:                break;
                    195: 
                    196:        case DTYPE_SOCKET:
                    197:                error = EOPNOTSUPP;
                    198:                break;
                    199: 
                    200:        default:
                    201:                panic("fdesc attr");
                    202:                break;
                    203:        }
                    204: 
                    205: #ifdef FDESC_DIAGNOSTIC
                    206:        printf("fdesc_attr: returns error %d\n", error);
                    207: #endif
                    208:        return (error);
                    209: }
                    210: 
                    211: fdesc_getattr(vp, vap, cred, p)
                    212:        struct vnode *vp;
                    213:        struct vattr *vap;
                    214:        struct ucred *cred;
                    215:        struct proc *p;
                    216: {
                    217:        unsigned fd;
                    218:        int error;
                    219: 
                    220:        if (vp->v_flag & VROOT) {
                    221: #ifdef FDESC_DIAGNOSTIC
                    222:                printf("fdesc_getattr: stat rootdir\n");
                    223: #endif
                    224:                bzero((caddr_t) vap, sizeof(*vap));
                    225:                vattr_null(vap);
                    226:                vap->va_type = VDIR;
                    227:                vap->va_mode = S_IRUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH;
                    228:                vap->va_nlink = 2;
                    229:                vap->va_uid = 0;
                    230:                vap->va_gid = 0;
                    231:                vap->va_fsid = vp->v_mount->mnt_stat.f_fsid.val[0];
                    232:                vap->va_fileid = 2;
                    233:                /* vap->va_qsize = 0; */
                    234:                vap->va_size = DEV_BSIZE;
                    235:                vap->va_blocksize = DEV_BSIZE;
                    236:                microtime(&vap->va_atime);
                    237:                vap->va_mtime = vap->va_atime;
                    238:                vap->va_ctime = vap->va_ctime;
                    239:                vap->va_gen = 0;
                    240:                vap->va_flags = 0;
                    241:                vap->va_rdev = 0;
                    242:                /* vap->va_qbytes = 0; */
                    243:                vap->va_bytes = 0;
                    244:                return (0);
                    245:        }
                    246: 
                    247:        fd = VTOFDESC(vp)->f_fd;
                    248:        error = fdesc_attr(fd, vap, cred, p);
                    249:        if (error == 0)
                    250:                vp->v_type = vap->va_type;
                    251:        return (error);
                    252: }
                    253: 
                    254: fdesc_setattr(vp, vap, cred, p)
                    255:        struct vnode *vp;
                    256:        struct vattr *vap;
                    257:        struct ucred *cred;
                    258:        struct proc *p;
                    259: {
                    260:        struct filedesc *fdp = p->p_fd;
                    261:        struct file *fp;
                    262:        unsigned fd;
                    263:        int error;
                    264: 
                    265:        /*
                    266:         * Can't mess with the root vnode
                    267:         */
                    268:        if (vp->v_flag & VROOT)
                    269:                return (EACCES);
                    270: 
                    271:        fd = VTOFDESC(vp)->f_fd;
                    272: #ifdef FDESC_DIAGNOSTIC
                    273:        printf("fdesc_setattr: fd = %d, nfiles = %d\n", fd, fdp->fd_nfiles);
                    274: #endif
                    275:        if (fd >= fdp->fd_nfiles || (fp = fdp->fd_ofiles[fd]) == NULL) {
                    276: #ifdef FDESC_DIAGNOSTIC
                    277:                printf("fdesc_setattr: fp = %x (EBADF)\n", fp);
                    278: #endif
                    279:                return (EBADF);
                    280:        }
                    281: 
                    282:        /*
                    283:         * Can setattr the underlying vnode, but not sockets!
                    284:         */
                    285:        switch (fp->f_type) {
                    286:        case DTYPE_VNODE:
                    287:                error = VOP_SETATTR((struct vnode *) fp->f_data, vap, cred, p);
                    288:                break;
                    289: 
                    290:        case DTYPE_SOCKET:
                    291:                error = EOPNOTSUPP;
                    292:                break;
                    293: 
                    294:        default:
                    295:                panic("fdesc setattr");
                    296:                break;
                    297:        }
                    298: 
                    299: #ifdef FDESC_DIAGNOSTIC
                    300:        printf("fdesc_setattr: returns error %d\n", error);
                    301: #endif
                    302:        return (error);
                    303: }
                    304: 
                    305: fdesc_readdir(vp, uio, cred, eofflagp)
                    306:        struct vnode *vp;
                    307:        struct uio *uio;
                    308:        struct ucred *cred;
                    309:        int *eofflagp;
                    310: {
                    311:        struct filedesc *fdp;
                    312:        int ind, i;
                    313:        int error;
                    314: 
                    315: #define UIO_MX 16
                    316: 
                    317:        fdp = uio->uio_procp->p_fd;
                    318:        ind = uio->uio_offset / UIO_MX;
                    319:        error = 0;
                    320:        while (uio->uio_resid > 0) {
                    321:                struct direct d;
                    322:                struct direct *dp = &d;
                    323: 
                    324:                if (ind < 2) { /* . or .. */
                    325:                  bzero((caddr_t) dp, UIO_MX);
                    326:                  if (ind == 0) {
                    327:                    strcpy(dp->d_name, ".");
                    328:                    dp->d_namlen = 1;
                    329:                  } else if (ind == 1) {
                    330:                    strcpy(dp->d_name, "..");
                    331:                    dp->d_namlen = 2;
                    332:                  } else
                    333:                    panic("fdesc: ind is negative!");
                    334: 
                    335:                  dp->d_reclen = UIO_MX;
                    336:                  dp->d_ino = 2;
                    337: 
                    338:                  /*
                    339:                   * And ship to userland
                    340:                   */
                    341:                  error = uiomove((caddr_t) dp, UIO_MX, uio);
                    342:                  if (error)
                    343:                    break;
                    344: 
                    345:                  ind++;
                    346:                  continue;
                    347:                }
                    348:                i = ind - 2;
                    349:                if (i >= fdp->fd_nfiles) {
                    350:                        *eofflagp = 1;
                    351:                        break;
                    352:                }
                    353:                if (fdp->fd_ofiles[i] != NULL) {
                    354:                        struct direct d;
                    355:                        struct direct *dp = &d;
                    356:                        char *cp = dp->d_name;
                    357: #ifdef FDESC_FILEID
                    358:                        struct vattr va;
                    359: #endif
                    360:                        int j;
                    361: 
                    362:                        bzero((caddr_t) dp, UIO_MX);
                    363: 
                    364:                        /*
                    365:                         * Generate an ASCII representation of the name.
                    366:                         * This can cope with fds in the range 0..99999
                    367:                         */
                    368:                        cp++;
                    369:                        if (i > 10) cp++;
                    370:                        if (i > 100) cp++;
                    371:                        if (i > 1000) cp++;
                    372:                        if (i > 10000) cp++;
                    373:                        if (i > 100000) panic("fdesc_readdir");
                    374:                        dp->d_namlen = cp - dp->d_name;
                    375:                        *cp = '\0';
                    376:                        j = i;
                    377:                        do {
                    378:                                *--cp = j % 10 + '0';
                    379:                                j /= 10;
                    380:                        } while (j > 0);
                    381:                        /*
                    382:                         * Fill in the remaining fields
                    383:                         */
                    384:                        dp->d_reclen = UIO_MX;
                    385:                        dp->d_ino = i + 3;
                    386: #ifdef FDESC_FILEID
                    387:                        /*
                    388:                         * If we want the file ids to match the
                    389:                         * we must call getattr on the underlying file.
                    390:                         * fdesc_attr may return an error, in which case
                    391:                         * we ignore the returned file id.
                    392:                         */
                    393:                        error = fdesc_attr(i, &va, cred, p);
                    394:                        if (error == 0)
                    395:                                dp->d_ino = va.va_fileid;
                    396: #endif
                    397:                        /*
                    398:                         * And ship to userland
                    399:                         */
                    400:                        error = uiomove((caddr_t) dp, UIO_MX, uio);
                    401:                        if (error)
                    402:                                break;
                    403:                }
                    404:                ind++;
                    405:        }
                    406: 
                    407:        uio->uio_offset = ind * UIO_MX;
                    408:        return (error);
                    409: }
                    410: 
                    411: fdesc_inactive(vp, p)
                    412:        struct vnode *vp;
                    413:        struct proc *p;
                    414: {
                    415:        /*
                    416:         * Clear out the v_type field to avoid
                    417:         * nasty things happening in vgone().
                    418:         */
                    419:        vp->v_type = VNON;
                    420: #ifdef FDESC_DIAGNOSTIC
                    421:        printf("fdesc_inactive(%x)\n", vp);
                    422: #endif
                    423:        return (0);
                    424: }
                    425: 
                    426: /*
                    427:  * Print out the contents of a /dev/fd vnode.
                    428:  */
                    429: /* ARGSUSED */
                    430: fdesc_print(vp)
                    431:        struct vnode *vp;
                    432: {
                    433:        printf("tag VT_NON, fdesc vnode\n");
                    434: }
                    435: 
                    436: /*
                    437:  * /dev/fd vnode unsupported operation
                    438:  */
                    439: fdesc_enotsupp()
                    440: {
                    441:        return (EOPNOTSUPP);
                    442: }
                    443: 
                    444: /*
                    445:  * /dev/fd "should never get here" operation
                    446:  */
                    447: fdesc_badop()
                    448: {
                    449:        panic("fdesc: bad op");
                    450:        /* NOTREACHED */
                    451: }
                    452: 
                    453: /*
                    454:  * /dev/fd vnode null operation
                    455:  */
                    456: fdesc_nullop()
                    457: {
                    458:        return (0);
                    459: }
                    460: 
                    461: #define fdesc_create ((int (*) __P(( \
                    462:                struct nameidata *ndp, \
                    463:                struct vattr *vap, \
                    464:                struct proc *p))) fdesc_enotsupp)
                    465: #define fdesc_mknod ((int (*) __P(( \
                    466:                struct nameidata *ndp, \
                    467:                struct vattr *vap, \
                    468:                struct ucred *cred, \
                    469:                struct proc *p))) fdesc_enotsupp)
                    470: #define fdesc_close ((int (*) __P(( \
                    471:                struct vnode *vp, \
                    472:                int fflag, \
                    473:                struct ucred *cred, \
                    474:                struct proc *p))) nullop)
                    475: #define fdesc_access ((int (*) __P(( \
                    476:                struct vnode *vp, \
                    477:                int mode, \
                    478:                struct ucred *cred, \
                    479:                struct proc *p))) nullop)
                    480: #define        fdesc_read ((int (*) __P(( \
                    481:                struct vnode *vp, \
                    482:                struct uio *uio, \
                    483:                int ioflag, \
                    484:                struct ucred *cred))) fdesc_enotsupp)
                    485: #define        fdesc_write ((int (*) __P(( \
                    486:                struct vnode *vp, \
                    487:                struct uio *uio, \
                    488:                int ioflag, \
                    489:                struct ucred *cred))) fdesc_enotsupp)
                    490: #define        fdesc_ioctl ((int (*) __P(( \
                    491:                struct vnode *vp, \
                    492:                int command, \
                    493:                caddr_t data, \
                    494:                int fflag, \
                    495:                struct ucred *cred, \
                    496:                struct proc *p))) fdesc_enotsupp)
                    497: #define        fdesc_select ((int (*) __P(( \
                    498:                struct vnode *vp, \
                    499:                int which, \
                    500:                int fflags, \
                    501:                struct ucred *cred, \
                    502:                struct proc *p))) fdesc_enotsupp)
                    503: #define fdesc_mmap ((int (*) __P(( \
                    504:                struct vnode *vp, \
                    505:                int fflags, \
                    506:                struct ucred *cred, \
                    507:                struct proc *p))) fdesc_enotsupp)
                    508: #define fdesc_fsync ((int (*) __P(( \
                    509:                struct vnode *vp, \
                    510:                int fflags, \
                    511:                struct ucred *cred, \
                    512:                int waitfor, \
                    513:                struct proc *p))) nullop)
                    514: #define fdesc_seek ((int (*) __P(( \
                    515:                struct vnode *vp, \
                    516:                off_t oldoff, \
                    517:                off_t newoff, \
                    518:                struct ucred *cred))) nullop)
                    519: #define fdesc_remove ((int (*) __P(( \
                    520:                struct nameidata *ndp, \
                    521:                struct proc *p))) fdesc_enotsupp)
                    522: #define fdesc_link ((int (*) __P(( \
                    523:                struct vnode *vp, \
                    524:                struct nameidata *ndp, \
                    525:                struct proc *p))) fdesc_enotsupp)
                    526: #define fdesc_rename ((int (*) __P(( \
                    527:                struct nameidata *fndp, \
                    528:                struct nameidata *tdnp, \
                    529:                struct proc *p))) fdesc_enotsupp)
                    530: #define fdesc_mkdir ((int (*) __P(( \
                    531:                struct nameidata *ndp, \
                    532:                struct vattr *vap, \
                    533:                struct proc *p))) fdesc_enotsupp)
                    534: #define fdesc_rmdir ((int (*) __P(( \
                    535:                struct nameidata *ndp, \
                    536:                struct proc *p))) fdesc_enotsupp)
                    537: #define fdesc_symlink ((int (*) __P(( \
                    538:                struct nameidata *ndp, \
                    539:                struct vattr *vap, \
                    540:                char *target, \
                    541:                struct proc *p))) fdesc_enotsupp)
                    542: #define fdesc_readlink ((int (*) __P(( \
                    543:                struct vnode *vp, \
                    544:                struct uio *uio, \
                    545:                struct ucred *cred))) fdesc_enotsupp)
                    546: #define fdesc_abortop ((int (*) __P(( \
                    547:                struct nameidata *ndp))) nullop)
                    548: #ifdef FDESC_DIAGNOSTIC
                    549: int fdesc_reclaim(vp)
                    550: struct vnode *vp;
                    551: {
                    552:        printf("fdesc_reclaim(%x)\n", vp);
                    553:        return (0);
                    554: }
                    555: #else
                    556: #define fdesc_reclaim ((int (*) __P(( \
                    557:                struct vnode *vp))) nullop)
                    558: #endif
                    559: #define        fdesc_lock ((int (*) __P(( \
                    560:                struct vnode *vp))) nullop)
                    561: #define fdesc_unlock ((int (*) __P(( \
                    562:                struct vnode *vp))) nullop)
                    563: #define        fdesc_bmap ((int (*) __P(( \
                    564:                struct vnode *vp, \
                    565:                daddr_t bn, \
                    566:                struct vnode **vpp, \
                    567:                daddr_t *bnp))) fdesc_badop)
                    568: #define        fdesc_strategy ((int (*) __P(( \
                    569:                struct buf *bp))) fdesc_badop)
                    570: #define fdesc_islocked ((int (*) __P(( \
                    571:                struct vnode *vp))) nullop)
                    572: #define fdesc_advlock ((int (*) __P(( \
                    573:                struct vnode *vp, \
                    574:                caddr_t id, \
                    575:                int op, \
                    576:                struct flock *fl, \
                    577:                int flags))) fdesc_enotsupp)
                    578: 
                    579: struct vnodeops fdesc_vnodeops = {
                    580:        fdesc_lookup,   /* lookup */
                    581:        fdesc_create,   /* create */
                    582:        fdesc_mknod,    /* mknod */
                    583:        fdesc_open,     /* open */
                    584:        fdesc_close,    /* close */
                    585:        fdesc_access,   /* access */
                    586:        fdesc_getattr,  /* getattr */
                    587:        fdesc_setattr,  /* setattr */
                    588:        fdesc_read,     /* read */
                    589:        fdesc_write,    /* write */
                    590:        fdesc_ioctl,    /* ioctl */
                    591:        fdesc_select,   /* select */
                    592:        fdesc_mmap,     /* mmap */
                    593:        fdesc_fsync,    /* fsync */
                    594:        fdesc_seek,     /* seek */
                    595:        fdesc_remove,   /* remove */
                    596:        fdesc_link,     /* link */
                    597:        fdesc_rename,   /* rename */
                    598:        fdesc_mkdir,    /* mkdir */
                    599:        fdesc_rmdir,    /* rmdir */
                    600:        fdesc_symlink,  /* symlink */
                    601:        fdesc_readdir,  /* readdir */
                    602:        fdesc_readlink, /* readlink */
                    603:        fdesc_abortop,  /* abortop */
                    604:        fdesc_inactive, /* inactive */
                    605:        fdesc_reclaim,  /* reclaim */
                    606:        fdesc_lock,     /* lock */
                    607:        fdesc_unlock,   /* unlock */
                    608:        fdesc_bmap,     /* bmap */
                    609:        fdesc_strategy, /* strategy */
                    610:        fdesc_print,    /* print */
                    611:        fdesc_islocked, /* islocked */
                    612:        fdesc_advlock,  /* advlock */
                    613: };

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.