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

1.1     ! root        1: /* x_create.c - x_creat, closret */
        !             2: 
        !             3: #include <conf.h>
        !             4: #include <kernel.h>
        !             5: #include <mem.h>
        !             6: #include <shell.h>
        !             7: #include "/usr/include/a.out.h"
        !             8: 
        !             9: LOCAL  char    symfile[] = "a.out";    /* name of object file to search*/
        !            10: 
        !            11: #define        SYMBLK  42*sizeof(struct nlist)
        !            12: 
        !            13: /*------------------------------------------------------------------------
        !            14:  *  x_creat  -  (command create) create a process given a starting address
        !            15:  *------------------------------------------------------------------------
        !            16:  */
        !            17: COMMAND        x_creat(stdin, stdout, stderr, nargs, args)
        !            18: int    stdin, stdout, stderr, nargs;
        !            19: char   *args[];
        !            20: {
        !            21:        int     ssize, prio;
        !            22:        struct  exec   *aoutptr;
        !            23:        int     dev,   symdev,   len,    pid;
        !            24:        char    *loc,  *symbuf,  *last,  *buf;
        !            25:        Bool    found;
        !            26:        struct  nlist  *symptr;
        !            27:        unsigned stroff, symoff;
        !            28:        
        !            29:        if (nargs < 4 || nargs > 5) {
        !            30:            fprintf(stderr,
        !            31:                "usage: create procedure stack-size prio [name]\n");
        !            32:            return(SYSERR);
        !            33:        }
        !            34:        ssize = atoi(args[2]);
        !            35:        prio  = atoi(args[3]);
        !            36:        symbuf = (char *)(symdev = SYSERR);
        !            37:        if ( (dev=open(NAMESPACE, symfile, "ro")) == SYSERR ||
        !            38:             (symdev=open(NAMESPACE, symfile, "ro")) == SYSERR ) {
        !            39:                fprintf(stderr, "Cannot open %s\n", symfile);
        !            40:                close(dev);
        !            41:                close(symdev);
        !            42:                return(SYSERR);
        !            43:        }
        !            44:        if ( (buf=(char *)getmem(SHCMDSTK)) == (char *)SYSERR ||
        !            45:             (symbuf=(char *)getmem(SHBUFLEN)) == (char *)SYSERR) {
        !            46:                fprintf(stderr, "no memory\n");
        !            47:                closret(dev, symdev, buf, symbuf);
        !            48:                return(SYSERR);
        !            49:        }
        !            50:        strcpy(args[0], "_");
        !            51:        strcat(args[0], args[1]);
        !            52:        printf("Looking up %s\n", args[0]);
        !            53:        read(dev, buf, sizeof(struct exec));
        !            54:        aoutptr = (struct exec *) buf;
        !            55:        symoff = N_SYMOFF(*aoutptr);
        !            56:        stroff = N_STROFF(*aoutptr);
        !            57:        if (N_BADMAG(*aoutptr) || stroff < N_TXTOFF(*aoutptr)) {
        !            58:                fprintf(stderr, "bad a.out format\n");
        !            59:                closret(dev, symdev, buf, symbuf);
        !            60:                return(SYSERR);
        !            61:        }
        !            62:        seek(dev, symoff);
        !            63:        for (found=FALSE ; !found && symoff < stroff ; symoff += SYMBLK) {
        !            64:                len = read(dev, buf,
        !            65:                        (symoff+SYMBLK <= stroff) ? SYMBLK : stroff-symoff);
        !            66:                if (len == SYSERR) {
        !            67:                        fprintf(stderr, "error reading %s\n", symfile);
        !            68:                        break;
        !            69:                }
        !            70:                last = &buf[len]; 
        !            71:                for (symptr=(struct nlist *)buf;(char *)symptr<last;symptr++){
        !            72:                        if ((symptr->n_type == (N_TEXT|N_EXT)) &&
        !            73:                             symptr->n_un.n_strx) {
        !            74:                                seek(symdev, stroff + symptr->n_un.n_strx);
        !            75:                                if (read(symdev, symbuf, SHBUFLEN) <= 0) {
        !            76:                                        fprintf(stderr,"can't read strtab\n");
        !            77:                                        closret(dev, symdev, buf, symbuf);
        !            78:                                        return(SYSERR);
        !            79:                                }
        !            80:                                if (strcmp(symbuf,args[0]) == 0) {
        !            81:                                        loc = (char *)symptr->n_value;
        !            82:                                        found = TRUE;
        !            83:                                        break;
        !            84:                                }
        !            85:                        }
        !            86:                }
        !            87:        }
        !            88:        closret(dev, symdev, buf, symbuf);
        !            89:        if (found) {
        !            90:                pid=create(loc, ssize, prio, nargs==5?args[4]:&args[0][1], 0);
        !            91:                fprintf(stderr, "[%d]\n", pid );
        !            92:                return(resume(pid));
        !            93:        } else {
        !            94:                fprintf(stderr, "%s not found\n", args[0]);
        !            95:                return (SYSERR);
        !            96:        }
        !            97: }
        !            98: 
        !            99: /*------------------------------------------------------------------------
        !           100:  *  closret  -  close devices, free memory before returning
        !           101:  *------------------------------------------------------------------------
        !           102: */
        !           103: LOCAL  closret(dev, symdev, buf, symbuf)
        !           104: int    dev, symdev;
        !           105: char   *buf, *symbuf;
        !           106: {
        !           107:        close(dev);
        !           108:        close(symdev);
        !           109:        freemem(buf, SHCMDSTK);
        !           110:        freemem(symbuf, SHBUFLEN);
        !           111: }

unix.superglobalmegacorp.com

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