Annotation of coherent/d/bin/ps.c, revision 1.1.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.