Annotation of xinu/sys/shell/x_rls.c, revision 1.1

1.1     ! root        1: /* x_rls.c - x_rls */
        !             2: 
        !             3: #include <conf.h>
        !             4: #include <kernel.h>
        !             5: #include <shell.h>
        !             6: 
        !             7: /*------------------------------------------------------------------------
        !             8:  *  x_rls  -  (command rls) list contents of remote file system directory
        !             9:  *------------------------------------------------------------------------
        !            10:  */
        !            11: COMMAND        x_rls(stdin, stdout, stderr, nargs, args)
        !            12: int    stdin, stdout, stderr, nargs;
        !            13: char   *args[];
        !            14: {
        !            15:        char    *p, *buf;
        !            16:        int     dev, len;
        !            17:        char    str[32];
        !            18:        struct  dirent  {               /* UNIX directory entry         */
        !            19:                long    d_inum;         /* file's inode number          */
        !            20:                short   d_rlen;         /* length of this record        */
        !            21:                short   d_nlen;         /* length of this file's name   */
        !            22:                char    d_nam[1];       /* start of file name           */
        !            23:        };
        !            24:        struct  dirent  *d;
        !            25:        Bool    aflag;
        !            26: 
        !            27: 
        !            28:        aflag = FALSE;
        !            29:        if (nargs > 1 && strcmp(p=args[1],"-a") == 0) {
        !            30:                nargs--;
        !            31:                aflag = TRUE;
        !            32:                p = args[2];
        !            33:        }
        !            34:        if (nargs == 1)
        !            35:                p = ".";
        !            36:        else if (nargs != 2) {
        !            37:                printf("use: rls [-a] directory\n");
        !            38:                return(SYSERR);
        !            39:        }
        !            40:        if ( ((int)(buf=(char *)getmem(512))) == SYSERR) {
        !            41:                fprintf(stderr, "rls: no memory\n");
        !            42:                return(SYSERR);
        !            43:        }
        !            44:        if (nammap(p, buf) != RFILSYS ||
        !            45:           (dev=open(NAMESPACE, p, "ro")) == SYSERR) {
        !            46:                fprintf(stderr, "cannot open %s\n", p);
        !            47:                freemem(buf, 512);
        !            48:                return(SYSERR);
        !            49:        }
        !            50:        len = read(dev, buf, 512);
        !            51:        for( ; len > 0 ; len=read(dev, buf, 512)) {
        !            52:                for (p=buf ; p< &buf[512] ;) {
        !            53:                        d = (struct dirent *)p;
        !            54:                        if (d->d_nlen != strlen(d->d_nam) ||
        !            55:                            d->d_nlen > 32 || d->d_rlen < 0 ||
        !            56:                            d->d_rlen > 512) {
        !            57:                                fprintf(stderr, "Not a directory\n");
        !            58:                                close(dev);
        !            59:                                freemem(buf, 512);
        !            60:                                return(SYSERR);
        !            61:                        }
        !            62:                        if (aflag || d->d_nam[0] != '.') {
        !            63:                                strcpy(str, d->d_nam);
        !            64:                                strcat(str, "\n");
        !            65:                                write(stdout, str, strlen(str));
        !            66:                        }
        !            67:                        if (d->d_rlen == 0)
        !            68:                                break;
        !            69:                        p += d->d_rlen;
        !            70:                }
        !            71:        }
        !            72:        freemem(buf, 512);
        !            73:        close(dev);
        !            74:        return(OK);
        !            75: }

unix.superglobalmegacorp.com

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