|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.