Annotation of researchv8dc/cmd/make/dosys.c, revision 1.1

1.1     ! root        1: static char *sccsid = "@(#)dosys.c     8th Edition (Bell Labs) 85/05/14";
        !             2: #include "defs"
        !             3: #include <signal.h>
        !             4: int intrupt();
        !             5: 
        !             6: #ifdef VERSION8
        !             7: #      define FORK fork
        !             8: #else
        !             9: #      define FORK vfork
        !            10: #endif
        !            11: 
        !            12: dosys(comstring, nohalt, nowait, prefix)
        !            13: register char *comstring;
        !            14: int nohalt;
        !            15: int nowait;
        !            16: char *prefix;
        !            17: {
        !            18: int status;
        !            19: register struct process *procp;
        !            20: 
        !            21: /* make sure there is room in the process stack */
        !            22: if(nproc >= MAXPROC)
        !            23:        waitstack(MAXPROC-1);
        !            24: 
        !            25: /* make sure fewer than proclimit processes are running */
        !            26: while(proclive >= proclimit)
        !            27:        {
        !            28:        enbint(SIG_IGN);
        !            29:        waitproc(&status);
        !            30:        enbint(intrupt);
        !            31:        }
        !            32: 
        !            33: if(prefix)
        !            34:        {
        !            35:        fputs(prefix, stdout);
        !            36:        fputs(comstring, stdout);
        !            37:        }
        !            38: 
        !            39: procp = procstack + nproc;
        !            40: procp->pid = metas(comstring) ? doshell(comstring,nohalt) : doexec(comstring);
        !            41: procstack[nproc].nohalt = nohalt;
        !            42: procstack[nproc].nowait = nowait;
        !            43: procstack[nproc].done = NO;
        !            44: ++proclive;
        !            45: ++nproc;
        !            46: 
        !            47: if(nowait)
        !            48:        {
        !            49:        printf(" &%d\n", procp->pid);
        !            50:        fflush(stdout);
        !            51:        return 0;
        !            52:        }
        !            53: if(prefix)
        !            54:        {
        !            55:        putchar('\n');
        !            56:        fflush(stdout);
        !            57:        }
        !            58: return waitstack(nproc-1);
        !            59: }
        !            60: 
        !            61: metas(s)   /* Are there are any  Shell meta-characters? */
        !            62: register char *s;
        !            63: {
        !            64: register char c;
        !            65: 
        !            66: while( (funny[c = *s++] & META) == 0 )
        !            67:        ;
        !            68: return( c );
        !            69: }
        !            70: 
        !            71: 
        !            72: 
        !            73: 
        !            74: doclose()      /* Close open directory files before exec'ing */
        !            75: {
        !            76: register struct dirhd *od;
        !            77: 
        !            78: for (od = firstod; od; od = od->nxtdirhd)
        !            79:        if(od->dirfc)
        !            80:                closedir(od->dirfc);
        !            81: }
        !            82: 
        !            83: /*  wait till none of the processes in the stack starting at k is live */
        !            84: int waitstack(k)
        !            85: int k;
        !            86: {
        !            87: int npending, status, totstatus;
        !            88: register int i;
        !            89: 
        !            90: totstatus = 0;
        !            91: npending = 0;
        !            92: for(i=k ; i<nproc; ++i)
        !            93:        if(! procstack[i].done)
        !            94:                ++npending;
        !            95: enbint(SIG_IGN);
        !            96: if(dbgflag > 1)
        !            97:        printf("waitstack(%d)\n", k);
        !            98: 
        !            99: while(npending > 0)
        !           100:        {
        !           101:        if(waitproc(&status) >= k)
        !           102:                --npending;
        !           103:        totstatus |= status;
        !           104:        }
        !           105: 
        !           106: if(nproc > k)
        !           107:        nproc = k;
        !           108: enbint(intrupt);
        !           109: return totstatus;
        !           110: }
        !           111: 
        !           112: waitproc(statp)
        !           113: int *statp;
        !           114: {
        !           115: int pid, status;
        !           116: register int i;
        !           117: register struct process *procp;
        !           118: char junk[50];
        !           119: 
        !           120: pid = wait(&status);
        !           121: if(dbgflag > 1)
        !           122:        fprintf(stderr, "process %d done, status = %d\n", pid, status);
        !           123: if(pid == -1)
        !           124:        fatal("bad wait code");
        !           125: for(i=0, procp=procstack; i<nproc; ++i, ++procp)
        !           126:        if(procp->pid == pid)
        !           127:                {
        !           128:                --proclive;
        !           129:                procp->done = YES;
        !           130: 
        !           131:                if(status)
        !           132:                        {
        !           133:                        if(procp->nowait)
        !           134:                                printf("%d: ", pid);
        !           135:                        if( status>>8 )
        !           136:                                printf("*** Error code %d", status>>8 );
        !           137:                        else    printf("*** Termination code %d", status );
        !           138:                
        !           139:                        printf(procp->nohalt ? "(ignored)\n" : "\n");
        !           140:                        fflush(stdout);
        !           141:                        if(!keepgoing && !procp->nohalt)
        !           142:                                fatal(CHNULL);
        !           143:                        }
        !           144:                *statp = status;
        !           145:                return i;
        !           146:                }
        !           147: 
        !           148: sprintf(junk, "spurious return from process %d", pid);
        !           149: fatal(junk);
        !           150: /*NOTREACHED*/
        !           151: }
        !           152: 
        !           153: doshell(comstring,nohalt)
        !           154: char *comstring;
        !           155: int nohalt;
        !           156: {
        !           157: int pid;
        !           158: #ifdef SHELLENV
        !           159: char *getenv(), *rindex();
        !           160: char *shellcom = getenv("SHELL");
        !           161: char *shellstr;
        !           162: #endif
        !           163: if((pid = FORK()) == 0)
        !           164:        {
        !           165:        enbint(SIG_DFL);
        !           166:        doclose();
        !           167: 
        !           168: #ifdef SHELLENV
        !           169:        if (shellcom == 0) shellcom = SHELLCOM;
        !           170:        shellstr = rindex(shellcom, '/') + 1;
        !           171:        execl(shellcom, shellstr, (nohalt ? "-c" : "-ce"), comstring, 0);
        !           172: #else
        !           173:        execl(SHELLCOM, "sh", (nohalt ? "-c" : "-ce"), comstring, 0);
        !           174: #endif
        !           175:        fatal("Couldn't load Shell");
        !           176:        }
        !           177: 
        !           178: return pid;
        !           179: }
        !           180: 
        !           181: doexec(str)
        !           182: register char *str;
        !           183: {
        !           184: register char *t, *tend;
        !           185: char **argv;
        !           186: register char **p;
        !           187: int nargs;
        !           188: int pid;
        !           189: 
        !           190: while( *str==' ' || *str=='\t' )
        !           191:        ++str;
        !           192: if( *str == '\0' )
        !           193:        return(-1);     /* no command */
        !           194: 
        !           195: nargs = 1;
        !           196: for(t = str ; *t ; )
        !           197:        {
        !           198:        ++nargs;
        !           199:        while(*t!=' ' && *t!='\t' && *t!='\0')
        !           200:                ++t;
        !           201:        if(*t)  /* replace first white space with \0, skip rest */
        !           202:                for( *t++ = '\0' ; *t==' ' || *t=='\t'  ; ++t)
        !           203:                        ;
        !           204:        }
        !           205: 
        !           206: /* now allocate args array, copy pointer to start of each string,
        !           207:    then terminate array with a null
        !           208: */
        !           209: p = argv = (char **) ckalloc(nargs*sizeof(char *));
        !           210: tend = t;
        !           211: for(t = str ; t<tend ; )
        !           212:        {
        !           213:        *p++ = t;
        !           214:        while( *t )
        !           215:                ++t;
        !           216:        do      {
        !           217:                ++t;
        !           218:                } while(t<tend && (*t==' ' || *t=='\t') );
        !           219:        }
        !           220: *p = NULL;
        !           221: /*TEMP for(p=argv; *p; ++p)printf("arg=%s\n", *p); */
        !           222: 
        !           223: if((pid = FORK()) == 0)
        !           224:        {
        !           225:        enbint(SIG_DFL);
        !           226:        doclose();
        !           227:        enbint(intrupt);
        !           228:        execvp(str, argv);
        !           229:        printf("\n");
        !           230:        fatal1("Cannot load %s",str);
        !           231:        }
        !           232: 
        !           233: free( (char *) argv);
        !           234: return pid;
        !           235: }
        !           236: 
        !           237: #include <errno.h>
        !           238: 
        !           239: #include <sys/types.h>
        !           240: #include <sys/stat.h>
        !           241: 
        !           242: 
        !           243: 
        !           244: 
        !           245: touch(force, name)
        !           246: int force;
        !           247: char *name;
        !           248: {
        !           249: struct stat stbuff;
        !           250: char junk[1];
        !           251: int fd;
        !           252: 
        !           253: if( stat(name,&stbuff) < 0)
        !           254:        if(force)
        !           255:                goto create;
        !           256:        else
        !           257:                {
        !           258:                fprintf(stderr, "touch: file %s does not exist.\n", name);
        !           259:                return;
        !           260:                }
        !           261: 
        !           262: if(stbuff.st_size == 0)
        !           263:        goto create;
        !           264: 
        !           265: if( (fd = open(name, 2)) < 0)
        !           266:        goto bad;
        !           267: 
        !           268: if( read(fd, junk, 1) < 1)
        !           269:        {
        !           270:        close(fd);
        !           271:        goto bad;
        !           272:        }
        !           273: lseek(fd, 0L, 0);
        !           274: if( write(fd, junk, 1) < 1 )
        !           275:        {
        !           276:        close(fd);
        !           277:        goto bad;
        !           278:        }
        !           279: close(fd);
        !           280: return;
        !           281: 
        !           282: bad:
        !           283:        fprintf(stderr, "Cannot touch %s\n", name);
        !           284:        return;
        !           285: 
        !           286: create:
        !           287:        if( (fd = creat(name, 0666)) < 0)
        !           288:                goto bad;
        !           289:        close(fd);
        !           290: }

unix.superglobalmegacorp.com

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