Annotation of coherent/d/bin/ps.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *     Modifications copyright INETCO Systems Ltd.
        !             3:  *
        !             4:  * Print out process statuses.
        !             5:  *
        !             6:  * $Log:       ps.c,v $
        !             7:  * Revision 1.3  91/07/17  14:22:55  bin
        !             8:  * stevesf supplied as INETCO source because previous sources are of
        !             9:  * questionable origin... this one works
        !            10:  * 
        !            11:  * Revision 1.2        89/06/12  15:15:22      src
        !            12:  * Bug:        A directory at the end of the '/dev' directory would cause 'ps'
        !            13:  *     to crash with the message "Cannot open <dir> in /dev".
        !            14:  * Fix:        A stat was being done without the return code being checked. (ART)
        !            15:  * 
        !            16:  * Revision 1.1        89/06/12  14:42:24      src
        !            17:  * Initial revision
        !            18:  * 
        !            19:  * 88/02/15    Allan Cornish   /usr/src/cmd/cmd/ps.c
        !            20:  * Kernel processes are now displayed regardless of -ax flags.
        !            21:  *
        !            22:  * 87/11/25    Allan Cornish   /usr/src/cmd/cmd/ps.c
        !            23:  * Debug flag now -D.  Drivers now displayed by -d flag.
        !            24:  *
        !            25:  * 87/11/12    Allan Cornish   /usr/src/cmd/cmd/ps.c
        !            26:  * Modified to support Coherent 9.0 [protected mode] segmentation.
        !            27:  *
        !            28:  * 87/10/20    Allan Cornish   /usr/src/cmd/cmd/ps.c
        !            29:  * Now extracts cmd name from u_comm field in uproc struct for kernel procs.
        !            30:  * Kernel processes only displayed if -d [debug] flag given.
        !            31:  *
        !            32:  * 87/09/28    Phil Selby      /usr/src/cmd/cmd/ps.c
        !            33:  * Altered so that the terminal name rather than major and minor
        !            34:  * device number is printed out
        !            35:  *
        !            36:  * 84/08/21    Rec
        !            37:  * Added gflag for group identification.
        !            38:  *
        !            39:  * 84/07/16    Lauren Weinstein
        !            40:  * Initial version.
        !            41:  */
        !            42: 
        !            43: #include <stdio.h>
        !            44: #include <ctype.h>
        !            45: #include <sys/const.h>
        !            46: #include <l.out.h>
        !            47: #include <pwd.h>
        !            48: #include <sys/proc.h>
        !            49: #include <sys/sched.h>
        !            50: #include <sys/dir.h>
        !            51: #include <sys/seg.h>
        !            52: #include <sys/stat.h>
        !            53: #include <sys/uproc.h>
        !            54: 
        !            55: /*
        !            56:  * This is a kludge for the i8086 only and will be
        !            57:  * made to disappear when the segmentation (jproto)
        !            58:  * is thrown away.
        !            59:  */
        !            60: #undef SISTACK
        !            61: #define        SISTACK SIPDATA
        !            62: 
        !            63: /*
        !            64:  *     Terminal information stored in memory for use by ps in TTY field
        !            65:  */
        !            66: 
        !            67: struct handle {
        !            68:        dev_t   dnum;           /* device number */
        !            69:        char dname[DIRSIZ];     /* device name */
        !            70:        struct handle *nptr;    /* pointer to next */
        !            71: } *fptr, *lptr;
        !            72: 
        !            73: /*
        !            74:  * Maximum sizes.
        !            75:  */
        !            76: #define ARGSIZE        512
        !            77: 
        !            78: /*
        !            79:  * Functions to see if a pointer is in alloc space and to map a
        !            80:  * pointer from alloc space to this process.
        !            81:  */
        !            82: #define range(p)       (p>=(char *)(aend) && p<(char *)(aend)+casize)
        !            83: #define map(p)         (&allp[(char *)p - (char *)aend])
        !            84: 
        !            85: /*
        !            86:  * For easy referencing.
        !            87:  */
        !            88: #define        aprocq          nl[0].n_value
        !            89: #define        autime          nl[1].n_value
        !            90: #define astime         nl[2].n_value
        !            91: #define aasize         nl[3].n_value
        !            92: #define        aend            nl[4].n_value
        !            93: 
        !            94: /*
        !            95:  * Variables.
        !            96:  */
        !            97: int    aflag;                          /* All processes */
        !            98: int    dflag;                          /* Driver flag */
        !            99: int    dbflag;                         /* Debug flag */
        !           100: int    fflag;                          /* Print out all fields */
        !           101: int    gflag;                          /* Print out process groups */
        !           102: int    lflag;                          /* Long format */
        !           103: int    mflag;                          /* Print scheduling values */
        !           104: int    nflag;                          /* No header */
        !           105: int    rflag;                          /* Print out real sizes */
        !           106: int    tflag;                          /* Print times */
        !           107: int    wflag;                          /* Wide format */
        !           108: int    xflag;                          /* Get special processes */
        !           109: dev_t  ttdev;                          /* Terminal device */
        !           110: 
        !           111: /*
        !           112:  * Table for namelist.
        !           113:  */
        !           114: struct nlist nl[] ={
        !           115:        "procq_",       0,      0,
        !           116:        "utimer_",      0,      0,
        !           117:        "stimer_",      0,      0,
        !           118:        "asize_",       0,      0,
        !           119:        "end_",         0,      0,
        !           120:        ""
        !           121: };
        !           122: 
        !           123: /*
        !           124:  * Symbols.
        !           125:  */
        !           126: char    *allp;                         /* Pointer to alloc space */
        !           127: char    *kfile;                        /* Kernel data memory file */
        !           128: char    *nfile;                        /* Namelist file */
        !           129: char    *mfile;                        /* Memory file */
        !           130: char    *dfile;                        /* Swap file */
        !           131: char    argp[ARGSIZE];                 /* Arguments */
        !           132: int     kfd;                           /* Kernel memory file descriptor */
        !           133: int     mfd;                           /* Memory file descriptor */
        !           134: int     dfd;                           /* Swap file descriptor */
        !           135: struct  uproc u;                       /* User process area */
        !           136: int     cutime;                        /* Unsigned time */
        !           137: PROC    cprocq;                        /* Process queue header */
        !           138: unsigned casize;                       /* Size of alloc area */
        !           139: 
        !           140: main(argc, argv)
        !           141: char *argv[];
        !           142: {
        !           143:        register int i;
        !           144:        register char *cp;
        !           145: 
        !           146:        initialise();
        !           147:        for (i=1; i<argc; i++) {
        !           148:                for (cp=&argv[i][0]; *cp; cp++) {
        !           149:                        switch (*cp) {
        !           150:                        case '-':
        !           151:                                continue;
        !           152:                        case 'a':
        !           153:                                aflag++;
        !           154:                                continue;
        !           155:                        case 'c':
        !           156:                                if (++i >= argc)
        !           157:                                        usage();
        !           158:                                nfile = argv[i];
        !           159:                                continue;
        !           160:                        case 'd':
        !           161:                                dflag++;
        !           162:                                continue;
        !           163:                        case 'D':
        !           164:                                dbflag++;
        !           165:                                continue;
        !           166:                        case 'f':
        !           167:                                fflag++;
        !           168:                                continue;
        !           169:                        case 'g':
        !           170:                                gflag++;
        !           171:                                continue;
        !           172:                        case 'k':
        !           173:                                if (++i >= argc)
        !           174:                                        usage();
        !           175:                                mfile = argv[i];
        !           176:                                continue;
        !           177:                        case 'l':
        !           178:                                lflag++;
        !           179:                                continue;
        !           180:                        case 'm':
        !           181:                                mflag++;
        !           182:                                continue;
        !           183:                        case 'n':
        !           184:                                nflag++;
        !           185:                                continue;
        !           186:                        case 'r':
        !           187:                                rflag++;
        !           188:                                continue;
        !           189:                        case 't':
        !           190:                                tflag++;
        !           191:                                continue;
        !           192:                        case 'w':
        !           193:                                wflag++;
        !           194:                                continue;
        !           195:                        case 'x':
        !           196:                                xflag++;
        !           197:                                continue;
        !           198:                        default:
        !           199:                                usage();
        !           200:                        }
        !           201:                }
        !           202:        }
        !           203:        execute();
        !           204:        exit(0);
        !           205: }
        !           206: 
        !           207: /*
        !           208:  * Initialise.
        !           209:  */
        !           210: initialise()
        !           211: {
        !           212:        register char *cp;
        !           213: 
        !           214:        aflag = 0;
        !           215:        gflag = 0;
        !           216:        lflag = 0;
        !           217:        mflag = 0;
        !           218:        nflag = 0;
        !           219:        xflag = 0;
        !           220:        nfile = "/coherent";
        !           221:        kfile = "/dev/kmem";
        !           222:        mfile = "/dev/mem";
        !           223:        dfile = "/dev/swap";
        !           224:        if ((cp=malloc(BUFSIZ)) != NULL)
        !           225:                setbuf(stdout, cp);
        !           226: }
        !           227: 
        !           228: /*
        !           229:  * Print out usage.
        !           230:  */
        !           231: usage()
        !           232: {
        !           233:        panic("Usage: ps [-][acdfgklmnrtwx]");
        !           234: }
        !           235: 
        !           236: /*
        !           237:  * Print out information about processes.
        !           238:  */
        !           239: execute()
        !           240: {
        !           241:        int c, l;
        !           242:        register PROC *pp1, *pp2;
        !           243: 
        !           244:        nlist(nfile, nl);
        !           245:        if (nl[0].n_type == 0)
        !           246:                panic("Bad namelist file %s", nfile);
        !           247:        if ((mfd=open(mfile, 0)) < 0)
        !           248:                panic("Cannot open %s", mfile);
        !           249:        if ((kfd = open(kfile, 0)) < 0)
        !           250:                panic("Cannot open %s", kfile);
        !           251: 
        !           252:        /*
        !           253:         * Open swap device if it exists
        !           254:         */
        !           255:        dfd = open(dfile, 0);
        !           256: 
        !           257:        kread((long)aasize, &casize, sizeof (casize));
        !           258:        kread((long)aprocq, &cprocq, sizeof (cprocq));
        !           259: 
        !           260:        if ((allp=malloc(casize)) == NULL)
        !           261:                panic( "Out of core or invalid kernel specified" );
        !           262: 
        !           263:        kread((long)aend, allp, casize);
        !           264:        kread((long)autime, &cutime, sizeof (cutime));
        !           265:        settdev();
        !           266:        fttys( "/dev"); /* load all the devices in dev */
        !           267:        l = 9;
        !           268:        if (dbflag)
        !           269:                l += 7;
        !           270:        if (gflag)
        !           271:                l += 6;
        !           272:        if (lflag)
        !           273:                l += 34;
        !           274:        if (mflag)
        !           275:                l += 26;
        !           276:        if (tflag)
        !           277:                l += 12;
        !           278:        if (nflag == 0) {
        !           279:                if (dbflag)
        !           280:                        printf("       ");
        !           281:                printf("TTY       PID");
        !           282:                if (gflag)
        !           283:                        printf(" GROUP");
        !           284:                if (lflag)
        !           285:                        printf("  PPID      UID    K    F S  EVENT");
        !           286:                if (mflag)
        !           287:                        printf("  CVAL  SVAL   IVAL   RVAL");
        !           288:                if (tflag)
        !           289:                        printf(" UTIME STIME");
        !           290:                putchar('\n');
        !           291:                fflush(stdout);
        !           292:        }
        !           293:        pp1 = &cprocq;
        !           294:        while ((pp2=pp1->p_nback) != aprocq) {
        !           295: 
        !           296:                if (range((char *)pp2) == 0)
        !           297:                        panic("Fragmented list");
        !           298:                pp1 = (PROC *) map(pp2);
        !           299: 
        !           300:                /*
        !           301:                 * Kernel process - display only if '-d' argument given.
        !           302:                 */
        !           303:                if ( pp1->p_flags & PFKERN ) {
        !           304:                        if ( dflag == 0 )
        !           305:                                continue;
        !           306:                }
        !           307: 
        !           308:                /*
        !           309:                 * Unattached process - display only if '-x' argument given.
        !           310:                 */
        !           311:                else if ( pp1->p_ttdev == NODEV ) {
        !           312:                        if ( xflag == 0 )
        !           313:                                continue;
        !           314:                }
        !           315: 
        !           316:                /*
        !           317:                 * Attached to other terminal - display only if '-a' arg given.
        !           318:                 */
        !           319:                else if ( pp1->p_ttdev != ttdev ) {
        !           320:                        if ( aflag == 0 )
        !           321:                                continue;
        !           322:                }
        !           323: 
        !           324:                if (dbflag)
        !           325:                        printf("%06o ", pp2);
        !           326:                ptty(pp1);
        !           327:                printf(" %5d", pp1->p_pid);
        !           328:                if (gflag)
        !           329:                        printf(" %5d", pp1->p_group);
        !           330:                if (lflag) {
        !           331:                        printf(" %5d", pp1->p_ppid);
        !           332:                        printf(" %8.8s", uname(pp1));
        !           333:                        psize(pp1);
        !           334:                        printf(" %4o", pp1->p_flags);
        !           335:                        printf(" %c", c=state(pp1, pp2));
        !           336:                        if (c == 'S')
        !           337:                                printf(" %06o", pp1->p_event);
        !           338:                        else {
        !           339:                                if (fflag)
        !           340:                                        printf("      -");
        !           341:                                else
        !           342:                                        printf("       ");
        !           343:                        }
        !           344:                }
        !           345:                if (mflag) {
        !           346:                        printf(" %5u", cval(pp1, pp2));
        !           347:                        printf(" %5u", pp1->p_sval);
        !           348:                        printf(" %6d", pp1->p_ival);
        !           349:                        printf(" %6d", pp1->p_rval);
        !           350:                }
        !           351:                if (tflag) {
        !           352:                        ptime(pp1->p_utime);
        !           353:                        ptime(pp1->p_stime);
        !           354:                }
        !           355:                printf("  ");
        !           356:                printl(pp1, (wflag?132:80)-l-1);
        !           357:                putchar('\n');
        !           358:                fflush(stdout);
        !           359:        }
        !           360:        rttys();        /* release all alloced space */
        !           361: }
        !           362: 
        !           363: /*
        !           364:  * Set our terminal device.
        !           365:  */
        !           366: settdev()
        !           367: {
        !           368:        register PROC *pp1, *pp2;
        !           369:        register int p;
        !           370: 
        !           371:        p = getpid();
        !           372:        pp1 = &cprocq;
        !           373:        while ((pp2=pp1->p_nforw) != aprocq) {
        !           374:                if (range((char *)pp2) == 0)
        !           375:                        break;
        !           376:                pp1 = (PROC *) map(pp2);
        !           377:                if (pp1->p_pid == p) {
        !           378:                        ttdev = pp1->p_ttdev;
        !           379:                        return;
        !           380:                }
        !           381:        }
        !           382:        ttdev = NODEV;
        !           383: }
        !           384: 
        !           385: /*
        !           386:  *     Finds all special file in the specified directory (e.g. /dev)
        !           387:  */
        !           388: 
        !           389: fttys( dirname)
        !           390: 
        !           391: char *dirname;
        !           392: 
        !           393: {
        !           394:        int filein;             /* directory file descriptor */
        !           395:        struct stat sbuf;       /* stat structure */
        !           396:        struct direct dbuf;     /* directory buffer structure */
        !           397:        
        !           398:        /* move to the appropriate directory and open file for reading */
        !           399:        
        !           400:        chdir( dirname );
        !           401: 
        !           402:        if( ( filein = open( ".", 0) ) < 0 ) {
        !           403:                fprintf( stderr, "Cannot open '%s' in /dev\n", dirname );
        !           404:                exit( 1 );
        !           405:        }
        !           406: 
        !           407:        read( filein, &dbuf, sizeof(dbuf) );    /* read . */
        !           408:        read( filein, &dbuf, sizeof(dbuf) );    /* read .. */
        !           409: 
        !           410:        while( read( filein, &dbuf, sizeof(dbuf) ) ) {
        !           411:                if( stat( dbuf.d_name, &sbuf ) < 0 )
        !           412:                        continue;
        !           413: 
        !           414:                if( sbuf.st_mode & S_IFCHR )
        !           415:                        addname( dbuf.d_name, sbuf.st_rdev );
        !           416: 
        !           417:                else if( sbuf.st_mode & S_IFDIR )
        !           418:                        fttys( dbuf.d_name );
        !           419:        }
        !           420: 
        !           421:        close( filein );
        !           422:        chdir( ".." );
        !           423: }
        !           424: 
        !           425: /*
        !           426:  *     Adds a name and and device number of type handle
        !           427:  */
        !           428: 
        !           429: addname( devname, devnum )
        !           430: 
        !           431: char *devname;
        !           432: dev_t devnum;
        !           433: 
        !           434: {
        !           435:        extern struct handle *fptr;
        !           436:        extern struct handle *lptr;
        !           437:        
        !           438:        if( fptr == (struct handle *) NULL ) {
        !           439:                if( (fptr=(struct handle *) malloc( sizeof(struct handle))) ==
        !           440:                                (struct handle *) NULL ) {
        !           441:                        fprintf( stderr, "Out of memory\n");
        !           442:                        exit( 1 );
        !           443:                }
        !           444: 
        !           445:                fptr->nptr = (struct handle *) NULL;
        !           446:                strcpy( fptr->dname, devname);
        !           447:                fptr->dnum = devnum;
        !           448:        }
        !           449: 
        !           450:        else {
        !           451:                lptr = fptr;
        !           452: 
        !           453:                while( ( lptr->nptr != (struct handle *) NULL ) &&
        !           454:                        ( lptr->dnum != devnum ) ) lptr = lptr->nptr;
        !           455: 
        !           456:                if( lptr->dnum == devnum )
        !           457:                        return;
        !           458: 
        !           459:                if( (lptr->nptr=(struct handle *)malloc(sizeof(struct handle)))
        !           460:                                == (struct handle *) NULL ) {
        !           461:                        fprintf( stderr, "Out of memory\n");
        !           462:                        exit( 1 );
        !           463:                }
        !           464: 
        !           465:                lptr = lptr->nptr;
        !           466:                lptr->nptr = (struct handle *) NULL;
        !           467:                strcpy( lptr->dname, devname);
        !           468:                lptr->dnum = devnum;
        !           469:        }
        !           470: }
        !           471: 
        !           472: /*
        !           473:  *     Release allocated space on exit (default action anyway)
        !           474:  */
        !           475: 
        !           476: rttys()
        !           477: {
        !           478:        /* release allocated space */
        !           479:        
        !           480:        lptr = fptr;
        !           481:        while( lptr->nptr != (struct handle *) NULL ) {
        !           482:                fptr = lptr;
        !           483:                lptr = fptr->nptr;
        !           484:                free( fptr);
        !           485:        }
        !           486:        free( lptr);
        !           487: }
        !           488: 
        !           489: /*
        !           490:  *     Print the controlling terminal name.  If not found it prints the
        !           491:  *     major and minor device numbers.  If no controlling terminal on the
        !           492:  *     process than '--------' is printed.
        !           493:  */
        !           494: 
        !           495: ptty( pp )
        !           496: register PROC *pp;
        !           497: {
        !           498:        register int d;
        !           499: 
        !           500:        /* when supplied with a device number, look for the name
        !           501:           of the special file from the dev directory */
        !           502:           
        !           503:        if( ( d = pp->p_ttdev ) == NODEV ) {
        !           504:                printf( "-------");
        !           505:                return;
        !           506:        }
        !           507: 
        !           508:        lptr = fptr;
        !           509:        while( lptr->nptr != (struct handle *) NULL ) {
        !           510:                if( lptr->dnum == d ) {
        !           511:                        printf( "%-7.7s", lptr->dname);
        !           512:                        return;
        !           513:                }
        !           514:                lptr = lptr->nptr;
        !           515:        }
        !           516:        if( lptr->dnum == d ) {
        !           517:                printf( "%-7.7s", lptr->dname);
        !           518:                return;
        !           519:        }
        !           520:        printf( "%3d %3d", major( d ), minor( d ) );
        !           521:        return;
        !           522: }
        !           523: 
        !           524: /*
        !           525:  * Given a process, return it's user name.
        !           526:  */
        !           527: uname(pp)
        !           528: register PROC *pp;
        !           529: {
        !           530:        static char name[8];
        !           531:        register struct passwd *pwp;
        !           532: 
        !           533:        if ((pwp=getpwuid(pp->p_ruid)) != NULL)
        !           534:                return (pwp->pw_name);
        !           535:        sprintf(name, "%d", pp->p_ruid);
        !           536:        return (name);
        !           537: }
        !           538: 
        !           539: /*
        !           540:  * Return the core value for a process.
        !           541:  */
        !           542: cval(pp1, pp2)
        !           543: register PROC *pp1;
        !           544: {
        !           545:        unsigned u;
        !           546:        register PROC *pp3, *pp4;
        !           547: 
        !           548:        if (pp1->p_state == PSSLEEP) {
        !           549:                u = (cutime-pp1->p_lctim) * 1;
        !           550:                if (pp1->p_cval+u > pp1->p_cval)
        !           551:                        return (pp1->p_cval+u);
        !           552:                return (-1);
        !           553:        }
        !           554:        u = 0;
        !           555:        pp3 = &cprocq;
        !           556:        while ((pp4=pp3->p_lforw) != aprocq) {
        !           557:                if (range((char *)pp4) == 0)
        !           558:                        break;
        !           559:                pp3 = (PROC *) map(pp4);
        !           560:                u -= pp3->p_cval;
        !           561:                if (pp2 == pp4)
        !           562:                        return (u);
        !           563:        }
        !           564:        if (pp1->p_pid == getpid())
        !           565:                return (pp1->p_cval);
        !           566:        return (0);
        !           567: }
        !           568: 
        !           569: /*
        !           570:  * Return the size in K of the given process.
        !           571:  */
        !           572: psize(pp)
        !           573: register PROC *pp;
        !           574: {
        !           575:        long l;
        !           576:        register SEG *sp;
        !           577:        register int n;
        !           578: 
        !           579:        l = 0;
        !           580:        for (n=0; n<NUSEG+1; n++) {
        !           581:                if (rflag == 0)
        !           582:                        if (n==SIUSERP || n==SIAUXIL)
        !           583:                                continue;
        !           584:                if ((sp=pp->p_segp[n]) == NULL)
        !           585:                        continue;
        !           586:                if (range((char *)sp) == 0) {
        !           587:                        printf("   ?K");
        !           588:                        return;
        !           589:                }
        !           590:                sp = (SEG *) map(sp);
        !           591:                l += sp->s_size;
        !           592:        }
        !           593:        if (l != 0)
        !           594:                printf("%4ldK", l/1024);
        !           595:        else {
        !           596:                if (fflag)
        !           597:                        printf("    -");
        !           598:                else
        !           599:                        printf("     ");
        !           600:        }
        !           601: }
        !           602: 
        !           603: /*
        !           604:  * Get the state of the process.
        !           605:  */
        !           606: state(pp1, pp2)
        !           607: register PROC *pp1;
        !           608: {
        !           609:        register int s;
        !           610: 
        !           611:        s = pp1->p_state;
        !           612:        if (s == PSSLEEP) {
        !           613:                if (pp1->p_event == pp2)
        !           614:                        return ('W');
        !           615:                if ((pp1->p_flags&PFSTOP) != 0)
        !           616:                        return ('T');
        !           617:                return ('S');
        !           618:        }
        !           619:        if (s == PSRUN)
        !           620:                return ('R');
        !           621:        if (s == PSDEAD)
        !           622:                return ('Z');
        !           623:        return ('?');
        !           624: }
        !           625: 
        !           626: /*
        !           627:  * Given a time in HZ, print it out.
        !           628:  */
        !           629: ptime(l)
        !           630: long l;
        !           631: {
        !           632:        register unsigned m;
        !           633: 
        !           634:        if ((l=(l+HZ/2)/HZ) == 0) {
        !           635:                if (fflag)
        !           636:                        printf("     -");
        !           637:                else
        !           638:                        printf("      ");
        !           639:                return;
        !           640:        }
        !           641:        if ((m=l/60) >= 100) {
        !           642:                printf("%6d", m);
        !           643:                return;
        !           644:        }
        !           645:        printf(" %2d:%02d", m, (unsigned)l%60);
        !           646: }
        !           647: 
        !           648: /*
        !           649:  * Print out the command line of a process.
        !           650:  */
        !           651: printl(pp, m)
        !           652: register PROC *pp;
        !           653: {
        !           654:        register char *cp;
        !           655:        register int c;
        !           656:        register int argc;
        !           657:        register int n;
        !           658: 
        !           659:        if (pp->p_state == PSDEAD)
        !           660:                return;
        !           661:        if (pp->p_pid == 0) {
        !           662:                printf("<idle>");
        !           663:                return;
        !           664:        }
        !           665:        if (segread(pp->p_segp[SIUSERP], 0, &u, sizeof (u)) == 0)
        !           666:                return;
        !           667: 
        !           668:        /*
        !           669:         * Handle kernel processes.
        !           670:         */
        !           671:        if ( pp->p_flags & PFKERN ) {
        !           672:                printf("<%.*s>",sizeof(u.u_comm), u.u_comm[0] ? u.u_comm : "");
        !           673:                return;
        !           674:        }
        !           675: 
        !           676:        n = segread(pp->p_segp[SISTACK], (u.u_argp-u.u_segl[SISTACK].sr_base),
        !           677:                argp, sizeof (argp));
        !           678: 
        !           679:        if (n == 0)
        !           680:                return;
        !           681: 
        !           682:        if ((argc=u.u_argc) <= 0)
        !           683:                return;
        !           684: 
        !           685:        m -= 2;
        !           686:        cp = argp;
        !           687: 
        !           688:        while (argc--) {
        !           689:                while ((c=*cp++) != '\0') {
        !           690:                        if (!isascii(c) || !isprint(c))
        !           691:                                return;
        !           692:                        if (m-- == 0)
        !           693:                                return;
        !           694:                        putchar(c);
        !           695:                }
        !           696:                if (m-- == 0)
        !           697:                        return;
        !           698:                if (argc != 0)
        !           699:                        putchar(' ');
        !           700:        }
        !           701: }
        !           702: 
        !           703: /*
        !           704:  * Given a segment pointer `sp' and an offset into the segment,
        !           705:  * `s', read `n' bytes from the segment into the buffer `bp'.
        !           706:  */
        !           707: segread(sp, s, bp, n)
        !           708: 
        !           709: SEG *sp;
        !           710: vaddr_t s;
        !           711: char *bp;
        !           712: 
        !           713: {
        !           714:        register SEG *sp1;
        !           715: 
        !           716:        if (range((char *)sp) == 0)
        !           717:                return (0);
        !           718: 
        !           719:        sp1 = (SEG *) map(sp);
        !           720: 
        !           721:        if ((sp1->s_flags&SFCORE) != 0)
        !           722:                mread( sp1->s_paddr + s, bp, n );
        !           723: 
        !           724:        else
        !           725:                if( dread( (long)sp1->s_daddr*BSIZE + s, bp, n ) < 0 )
        !           726:                        return( 0 );
        !           727: 
        !           728:        return (1);
        !           729: }
        !           730: 
        !           731: /*
        !           732:  * Read `n' bytes into the buffer `bp' from kernel memory
        !           733:  * starting at seek position `s'.
        !           734:  */
        !           735: kread(s, bp, n)
        !           736: long s;
        !           737: {
        !           738:        lseek(kfd, (long)s, 0);
        !           739:        if (read(kfd, bp, n) != n)
        !           740:                panic("Kernel memory read error");
        !           741: }
        !           742: 
        !           743: /*
        !           744:  * Read `n' bytes into the buffer `bp' from absolute memory
        !           745:  * starting at seek position `s'.
        !           746:  */
        !           747: mread(s, bp, n)
        !           748: long s;
        !           749: {
        !           750:        lseek(mfd, (long)s, 0);
        !           751:        if (read(mfd, bp, n) != n)
        !           752:                panic("Memory read error");
        !           753: }
        !           754: 
        !           755: /*
        !           756:  * Read `n' bytes into the buffer `bp' from the swap file
        !           757:  * starting at seek position `s'.
        !           758:  */
        !           759: dread(s, bp, n)
        !           760: long s;
        !           761: {
        !           762:        /*
        !           763:         * If swap device exists go look at it
        !           764:         */
        !           765:        if( dfd > 0 ) {
        !           766:                lseek(dfd, (long)s, 0);
        !           767: 
        !           768:                if (read(dfd, bp, n) != n)
        !           769:                        panic("Swap read error");
        !           770: 
        !           771:                return( 1 );
        !           772:        }
        !           773: 
        !           774:        return( 0 );
        !           775: }
        !           776: 
        !           777: /*
        !           778:  * Print out an error message and exit.
        !           779:  */
        !           780: panic(a1)
        !           781: char *a1;
        !           782: {
        !           783:        fflush(stdout);
        !           784:        fprintf(stderr, "%r", &a1);
        !           785:        fprintf(stderr, "\n");
        !           786:        exit(1);
        !           787: }

unix.superglobalmegacorp.com

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