Annotation of xinu/sys/shell/x_rls.c, revision 1.1.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.