Relay-Version: version B 2.10.3 4.3bsd-beta 6/6/85; site seismo.CSS.GOV Posting-Version: version B 2.10.2 9/3/84; site panda.UUCP Path: seismo!harvard!talcott!panda!sources-request From: sources-request@panda.UUCP Newsgroups: mod.sources Subject: SPS (Show Process Status) Part 2 of 2 Message-ID: <1155@panda.UUCP> Date: 2 Dec 85 23:48:55 GMT Sender: jpn@panda.UUCP Lines: 1688 Approved: jpn@panda.UUCP Mod.sources: Volume 3, Issue 56 Submitted by: seismo!mcvax!cernvax!hslrswi!robert (Robert Ward) #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # main.c # mktree.c # needed.c # openfiles.c # percentmem.c # prcmd.c # prcpu.c # prheader.c # printall.c # printproc.c # prsummary.c # readstatus.c # selectproc.c # selecttty.c # sps.h # termwidth.c # ttystatus.c # waitingfor.c # This archive created: Mon Dec 2 18:41:14 1985 export PATH; PATH=/bin:$PATH echo shar: extracting "'main.c'" '(2626 characters)' if test -f 'main.c' then echo shar: will not over-write existing file "'main.c'" else sed 's/^X//' << \SHAR_EOF > 'main.c' # include "sps.h" # include "flags.h" # include # include /* SPS - Show Process Status */ /* J. R. Ward - Hasler AG Bern - 24 May 1985 */ main ( argc,argv ) int argc ; char **argv ; { register struct process *plist ; register struct process *process ; register struct text *text ; int flinfo ; extern struct flags Flg ; extern struct info Info ; extern int Flmem ; extern int Flkmem ; extern int Flswap ; char *getcore() ; struct process *needed(), *mktree() ; /* Renice as fast as possible for root (Suggested by Gregorio!mogul) */ if ( !getuid() ) (void)nice( -40 ) ; /* Decode the flag arguments */ flagdecode( argc, argv ) ; /* Determine the terminal width */ if ( !Flg.flg_w && !Flg.flg_N && !Flg.flg_i ) termwidth() ; /* Open the cpu physical memory, kernel virtual memory and swap device*/ if ( Flg.flg_k ) { Flmem = openfile( Flg.flg_k ) ; Flkmem = Flmem ; } else { Flmem = openfile( FILE_MEM ) ; Flkmem = openfile( FILE_KMEM ) ; if ( !Flg.flg_o ) Flswap = openfile( FILE_SWAP ) ; } if ( Flg.flg_i ) { /* -i flag for info file initialisation */ initialise() ; exit( 0 ) ; } /* Read the information file */ flinfo = openfile( Flg.flg_j ? Flg.flg_j : FILE_INFO ) ; if ( read( flinfo, (char*)&Info, sizeof( struct info ) ) != sizeof( struct info ) ) { fprintf( stderr, "sps - Can't read info file %s", Flg.flg_j ? Flg.flg_j : FILE_INFO ) ; sysperror() ; } (void)close( flinfo ) ; /* Find current tty status */ ttystatus() ; /* Now that we know the available ttys, decode the flags */ flagsetup() ; process = (struct process*)getcore(Info.i_nproc*sizeof(struct process)); text = (struct text*)getcore( Info.i_ntext * sizeof( struct text ) ) ; do { /* Read current process and text status */ readstatus( process, text ) ; /* Select those processes to be listed */ plist = needed( process, text ) ; /* Form a tree of listed processes */ plist = mktree( process, plist ) ; if ( !Flg.flg_N ) { /* Print the processes */ prheader() ; printall( plist, 0 ) ; } prsummary() ; (void)fflush( stdout ) ; if ( Flg.flg_r ) { /* If repeating, again get tty status */ ttystatus() ; if ( Flg.flg_rdelay ) # ifdef BSD42 sleep( Flg.flg_rdelay ) ; # else sleep( (int)Flg.flg_rdelay ) ; # endif } } while ( Flg.flg_r ) ; exit( 0 ) ; } SHAR_EOF if test 2626 -ne "`wc -c < 'main.c'`" then echo shar: error transmitting "'main.c'" '(should have been 2626 characters)' fi fi # end of overwriting check echo shar: extracting "'mktree.c'" '(1626 characters)' if test -f 'mktree.c' then echo shar: will not over-write existing file "'mktree.c'" else sed 's/^X//' << \SHAR_EOF > 'mktree.c' # include "sps.h" /* ** MKTREE - Sort the needed processes by subtree and at the top by user. ** This procedure takes a list of processes (as returned by needed()) ** and returnes a pointer to a sorted list. */ struct process *mktree ( process, plist ) struct process *process ; struct process *plist ; { register struct process *p ; register struct process *pp ; register struct process *lp ; struct process *op ; struct process proot ; proot.pr_sibling = (struct process*)0 ; for ( p = plist ; p ; p = p->pr_plink ) { if ( p->pr_pptr > &process[1] ) { for ( pp = plist ; pp ; pp = pp->pr_plink ) { if ( pp != p->pr_pptr ) continue ; if ( lp = pp->pr_child ) { /* Does process have children ? */ op = (struct process*)0 ; while (lp && lp->pr_p.p_pid < p->pr_p.p_pid ) { op = lp ; lp=lp->pr_sibling ; } if ( op ) { p->pr_sibling = lp ; op->pr_sibling = p ; break ; } } p->pr_sibling = lp ; pp->pr_child = p ; break ; } if ( pp ) continue ; } /* We have a top level process, sort into top level list. The top level is sorted firstly by user-id and then by process-id. */ lp = &proot ; pp = lp->pr_sibling ; while ( pp ) { if ( p->pr_p.p_uid < pp->pr_p.p_uid ) break ; if ( p->pr_p.p_uid == pp->pr_p.p_uid && p->pr_p.p_pid < pp->pr_p.p_pid ) break ; lp = pp, pp = pp->pr_sibling ; } p->pr_sibling = lp->pr_sibling ; lp->pr_sibling = p ; } return ( proot.pr_sibling ) ; } SHAR_EOF if test 1626 -ne "`wc -c < 'mktree.c'`" then echo shar: error transmitting "'mktree.c'" '(should have been 1626 characters)' fi fi # end of overwriting check echo shar: extracting "'needed.c'" '(4455 characters)' if test -f 'needed.c' then echo shar: will not over-write existing file "'needed.c'" else sed 's/^X//' << \SHAR_EOF > 'needed.c' # include "sps.h" # include "flags.h" # include # include /* ** NEEDED - Determine which processes are needed for the printout ** and add these to a list of needed processes. */ struct process *needed ( process, text ) register struct process *process ; struct text *text ; { register struct process *p ; register struct process *plist ; struct process *lastp ; int uid ; extern struct flags Flg ; extern union userstate User ; extern struct info Info ; extern struct ttyline Notty ; struct ttyline *findtty() ; char *getcmd() ; plist = (struct process*)0 ; lastp = &process[ Info.i_nproc ] ; /* Normalise internal pointers from kernel addresses. For each kmem address in the `proc' and `text' structures, we convert that address for our own internal use. */ for ( p = process ; p < lastp ; p++ ) { if ( !p->pr_p.p_stat ) continue ; /* Normalise internal text pointers */ if ( p->pr_p.p_textp ) p->pr_p.p_textp = &text[p->pr_p.p_textp - Info.i_text0]; /* Normalise internal linked list of processes */ p->pr_plink = p->pr_p.p_link ? &process[ p->pr_p.p_link - Info.i_proc0 ] : (struct process*)0 ; /* Normalise internal parent pointers */ p->pr_pptr = p->pr_p.p_pptr ? &process[ p->pr_p.p_pptr - Info.i_proc0 ] : (struct process*)0 ; /* Check for valid parent pointers */ if ( !p->pr_pptr ) { p->pr_pptr = process ; continue ; } if ( p->pr_pptr < process || p->pr_pptr >= lastp ) { fprintf( stderr, "sps - process %d has bad pptr\n", p->pr_p.p_pid ) ; p->pr_pptr = process ; } } /* For each process, see if it is a candidate for selection. If so, retrieve its command arguments and upage information. */ uid = getuid() ; for ( p = process ; p < lastp ; p++ ) { if ( !p->pr_p.p_stat ) continue ; /* Count processes and sizes */ summarise( p ) ; /* Select the given processes. Bear in mind that selection of processes based on the `F' and `T' flags must be postponed until the upage is accessed. */ if ( !Flg.flg_F && !Flg.flg_T && !selectproc( p, process, uid )) continue ; /* Try to find the process' command arguments. Accessing the arguments also involves retrieving the upage. */ p->pr_cmd = getcmd( p ) ; /* If the upage was found successfully, use this information */ if ( p->pr_upag ) { # ifdef BSD42 p->pr_rself = User.u_us.u_ru ; p->pr_rchild = User.u_us.u_cru ; # else p->pr_vself = User.u_us.u_vm ; p->pr_vchild = User.u_us.u_cvm ; # endif p->pr_tty = findtty( p ) ; p->pr_files = filecount() ; } else p->pr_tty = &Notty ; /* Select on the basis of the `F' and `T' flags */ if ( Flg.flg_F && !(p->pr_p.p_pgrp && p->pr_p.p_pgrp == p->pr_tty->l_pgrp) ) continue ; if ( Flg.flg_T && !selecttty( p ) ) continue ; /* Arrive here with a selected process. Add this to the linked list of needed processes. */ p->pr_plink = plist ; plist = p ; p->pr_child = (struct process*)0 ; p->pr_sibling = (struct process*)0 ; } return ( plist ) ; } /* SUMMARISE - Summarises the given process into the `Summary' structure */ /* ** SHOULD ACCOUNT HERE FOR THE SIZE OF LOADED PAGE TABLES, BUT WE DON'T REALLY ** KNOW THEIR RESIDENT SIZES. */ summarise ( p ) register struct process *p ; { register struct text *tp ; int busy ; extern struct summary Summary ; Summary.sm_ntotal++ ; if ( p->pr_p.p_stat == SZOMB ) return ; /* Firstly, account for processes */ Summary.sm_ktotal += p->pr_p.p_dsize + p->pr_p.p_ssize ; Summary.sm_kloaded += p->pr_p.p_rssize ; Summary.sm_kswapped += p->pr_p.p_swrss ; if ( p->pr_p.p_flag & SLOAD ) Summary.sm_nloaded++ ; else Summary.sm_nswapped++ ; busy = (p->pr_p.p_stat == SRUN) || (p->pr_p.p_stat==SSLEEP && (p->pr_p.p_pripr_p.p_pid > MSPID) ) ; if ( busy ) { Summary.sm_nbusy++ ; Summary.sm_kbusy += p->pr_p.p_dsize + p->pr_p.p_ssize ; } /* Now account for their texts */ if ( !(tp = p->pr_p.p_textp) || !tp->x_count ) return ; Summary.sm_ktotal += tp->x_size ; Summary.sm_kloaded += tp->x_rssize ; Summary.sm_kswapped += tp->x_swrss ; if ( busy ) Summary.sm_kbusy += tp->x_size ; tp->x_count = 0 ; } SHAR_EOF if test 4455 -ne "`wc -c < 'needed.c'`" then echo shar: error transmitting "'needed.c'" '(should have been 4455 characters)' fi fi # end of overwriting check echo shar: extracting "'openfiles.c'" '(2626 characters)' if test -f 'openfiles.c' then echo shar: will not over-write existing file "'openfiles.c'" else sed 's/^X//' << \SHAR_EOF > 'openfiles.c' # include # include "sps.h" # include "flags.h" /* Miscellaneous procedures */ /* OPENFILE - Opens the named file */ openfile ( name ) char *name ; { register int fd ; if ( (fd = open( name, 0 )) >= 0 ) return ( fd ) ; fprintf( stderr, "sps - Can't open %s", name ) ; sysperror() ; /* NOTREACHED */ } /* MEMSEEK - Seek on a special file */ memseek ( fd, pos ) int fd ; long pos ; { extern int errno ; extern struct flags Flg ; long lseek() ; errno = 0 ; if ( Flg.flg_k ) pos &= 0x7fffffff ; (void)lseek( fd, pos, 0 ) ; if ( errno ) { fprintf( stderr, "sps - Seek failed" ) ; sysperror() ; } } /* SWSEEK - Seek on the swap device */ swseek ( pos ) long pos ; { extern int Flswap ; extern int errno ; long lseek() ; errno = 0 ; (void)lseek( Flswap, pos, 0 ) ; if ( errno ) { fprintf( stderr, "sps - Seek failed" ) ; sysperror() ; } } # ifdef lint int errno ; int sys_nerr ; char *sys_errlist[] ; # endif /* SYSPERROR - Reports a system defined error msg and then exits gracefully */ sysperror () { extern int errno ; extern int sys_nerr ; extern char *sys_errlist[] ; if ( 0 < errno && errno < sys_nerr ) fprintf( stderr, " : %s", sys_errlist[errno] ) ; (void)fputc( '\n', stderr ) ; exit( 1 ) ; } /* STRSAVE - Store a string in core for later use. */ char *strsave ( cp ) register char *cp ; { register char *chp ; char *getcore(), *strcpy() ; chp = getcore( strlen( cp ) + 1 ) ; (void)strcpy( chp, cp ) ; return ( chp ) ; } /* GETCORE - Allocate and return a pointer to the asked for amount of core */ char *getcore ( size ) register int size ; { register char *chp ; char *malloc() ; if ( chp = malloc( (unsigned)size ) ) return ( chp ) ; fprintf( stderr, "sps - Out of core" ) ; sysperror() ; /* NOTREACHED */ } union flaglist *getflgsp ( argc ) register int argc ; { char *getcore() ; return ( (union flaglist*)getcore( sizeof( union flaglist )*argc ) ) ; } /* PREXIT - Print an error message and exit */ /* VARARGS1 */ /* ARGSUSED */ prexit ( fmt, args ) char *fmt ; { _doprnt( fmt, &args, stderr ) ; exit( 1 ) ; } SHAR_EOF if test 2626 -ne "`wc -c < 'openfiles.c'`" then echo shar: error transmitting "'openfiles.c'" '(should have been 2626 characters)' fi fi # end of overwriting check echo shar: extracting "'percentmem.c'" '(823 characters)' if test -f 'percentmem.c' then echo shar: will not over-write existing file "'percentmem.c'" else sed 's/^X//' << \SHAR_EOF > 'percentmem.c' # include "sps.h" # include # ifdef BSD42 # include # else # include # include # endif # include /* PERCENTMEM - Returns the percentage of real memory used by this process */ double percentmem ( p ) register struct process *p ; { register struct text *tp ; int szptudot ; double fracmem ; extern struct info Info ; tp = p->pr_p.p_textp ; if ( !(p->pr_p.p_flag & SLOAD) || !tp ) return ( 0.0 ) ; szptudot = UPAGES + clrnd( ctopt( p->pr_p.p_dsize + p->pr_p.p_ssize ) ); fracmem = ( (double)p->pr_p.p_rssize + szptudot ) / CLSIZE ; if ( tp->x_ccount ) fracmem += ((double)tp->x_rssize)/CLSIZE/tp->x_ccount ; return ( 100.0 * fracmem / (double)Info.i_ecmx ) ; } SHAR_EOF if test 823 -ne "`wc -c < 'percentmem.c'`" then echo shar: error transmitting "'percentmem.c'" '(should have been 823 characters)' fi fi # end of overwriting check echo shar: extracting "'prcmd.c'" '(709 characters)' if test -f 'prcmd.c' then echo shar: will not over-write existing file "'prcmd.c'" else sed 's/^X//' << \SHAR_EOF > 'prcmd.c' # include "sps.h" # include "flags.h" /* PRCMD - Prints the command arguments according to the switches */ prcmd ( p, lpad, width ) register struct process *p ; int lpad ; int width ; { extern struct flags Flg ; extern unsigned Termwidth ; printf( "%*d ", lpad, p->pr_p.p_pid ) ; if ( Flg.flg_f ) { printf( "%5d ", p->pr_p.p_ppid ) ; width -= 6 ; } if ( Flg.flg_g ) { printf( "%5d ", p->pr_p.p_pgrp ) ; width -= 6 ; } width += Termwidth ; if ( Flg.flg_w ) printf( "%s\n", p->pr_cmd ) ; else if ( width > 0 ) printf( "%-.*s\n", width, p->pr_cmd ) ; if ( p->pr_csaved ) free( p->pr_cmd ) ; } SHAR_EOF if test 709 -ne "`wc -c < 'prcmd.c'`" then echo shar: error transmitting "'prcmd.c'" '(should have been 709 characters)' fi fi # end of overwriting check echo shar: extracting "'prcpu.c'" '(1538 characters)' if test -f 'prcpu.c' then echo shar: will not over-write existing file "'prcpu.c'" else sed 's/^X//' << \SHAR_EOF > 'prcpu.c' # include "sps.h" # ifdef BSD42 /* PRCPU - Print cpu time */ prcpu ( time, utime ) register time_t time ; time_t utime ; { time += utime / 1000000 ; utime %= 1000000 ; if ( time < 0L ) { /* Ignore negative times */ printf( " " ) ; return ; } if ( time < 60L*10L ) { /* Print as seconds if less than 1000 seconds */ printf( "%3d.%1d", (int)time, (int)utime/100000 ) ; return ; } /* Print as minutes if less than 10 hours ; print as hours if less than 10 days, else print as days. */ if ( time < 60L*60L*10L ) printf( "%3D M", time/60L ) ; else if ( time < 24L*60L*60L*10L ) printf( "%3D H", time/60L/60L ) ; else printf( "%3D D", time/60L/60L/24L ) ; } # else /* PRCPU - Print cpu time */ prcpu ( time ) register time_t time ; { extern struct info Info ; if ( time < 0L ) { /* Ignore negative times */ printf( " " ) ; return ; } if ( time < Info.i_hz*60L*10L ) { /* Less than 10 minutes */ printf( "%3D.%1D", time/Info.i_hz, (time % Info.i_hz / (Info.i_hz/10L)) ) ; return ; } /* If less than 10 hours, print as minutes */ time /= Info.i_hz ; /* Print as minutes if less than 10 hours ; print as hours if less than 10 days, else print as days. */ if ( time < 60L*60L*10L ) printf( "%3D M", time/60L ) ; else if ( time < 24L*60L*60L*10L ) printf( "%3D H", time/60L/60L ) ; else printf( "%3D D", time/60L/60L/24L ) ; } # endif SHAR_EOF if test 1538 -ne "`wc -c < 'prcpu.c'`" then echo shar: error transmitting "'prcpu.c'" '(should have been 1538 characters)' fi fi # end of overwriting check echo shar: extracting "'prheader.c'" '(438 characters)' if test -f 'prheader.c' then echo shar: will not over-write existing file "'prheader.c'" else sed 's/^X//' << \SHAR_EOF > 'prheader.c' # include "sps.h" # include "flags.h" /* PRHEADER - Print a header according to the switches */ prheader () { extern struct flags Flg ; printf( "Ty User %s Proc#", Flg.flg_v ? " Status Fl Nice Virtual Resident %M Time Child %C" : Flg.flg_d ? " Files PageFaults Swap BlockI/O Kbytsecs" : "" ) ; if ( Flg.flg_f ) printf( " Ppid#" ) ; if ( Flg.flg_g ) printf( " Pgrp#" ) ; printf( " Command\n" ) ; } SHAR_EOF if test 438 -ne "`wc -c < 'prheader.c'`" then echo shar: error transmitting "'prheader.c'" '(should have been 438 characters)' fi fi # end of overwriting check echo shar: extracting "'printall.c'" '(430 characters)' if test -f 'printall.c' then echo shar: will not over-write existing file "'printall.c'" else sed 's/^X//' << \SHAR_EOF > 'printall.c' # include # include "sps.h" /* PRINTALL - Recursively print the process tree. */ printall ( p, md ) register struct process *p ; register int md ; { while ( p ) { /* Print this process */ printproc( p, md ) ; (void)fflush( stdout ) ; /* Print child processes */ printall( p->pr_child, md+1 ) ; /* Print brother processes */ p = p->pr_sibling ; } } SHAR_EOF if test 430 -ne "`wc -c < 'printall.c'`" then echo shar: error transmitting "'printall.c'" '(should have been 430 characters)' fi fi # end of overwriting check echo shar: extracting "'printproc.c'" '(5844 characters)' if test -f 'printproc.c' then echo shar: will not over-write existing file "'printproc.c'" else sed 's/^X//' << \SHAR_EOF > 'printproc.c' # include "sps.h" # include "flags.h" # include /* PRINTPROC - Pretty print a process according to the switches. */ printproc ( p, md ) register struct process *p ; int md ; { register char *chp ; register struct text *tp ; register struct hashtab *hp ; char chbuf[10] ; time_t time ; time_t chtime ; # ifdef BSD42 time_t utime ; time_t uchtime ; # endif extern short Lastuid, Lastpgrp ; extern struct flags Flg ; char *waitingfor() ; struct hashtab *hashuid() ; double percentmem() ; /* List tty name and foreground/background/detached information */ printf( "%2.2s%c", p->pr_tty->l_name, !p->pr_p.p_pgrp ? ' ' : # ifdef SDETACH p->pr_p.p_flag & SDETACH ? '_' : # endif p->pr_p.p_pgrp == p->pr_tty->l_pgrp ? '.' : ' ' ) ; hp = hashuid( p->pr_p.p_uid ) ; if ( !md ) { /* If a top-level process, list the user name */ if ( hp ) printf( "%-8.8s ", hp->h_uname ) ; else printf( "user%-4.4d ", p->pr_p.p_uid ) ; } else { /* Usually list an asterisk for a child process */ md = md > 8 ? 8 : md ; printf( "%*s%c", md, "", p->pr_p.p_pgrp == Lastpgrp ? '|' : '*' ) ; /* But beware of setuid processes */ md = 8 - md ; if ( p->pr_p.p_uid == Lastuid ) printf( "%-*.*s", md, md, "" ) ; else if ( hp ) printf( "%-*.*s", md, md, hp->h_uname ) ; else { md -= 4 ; printf( "user%-*.*d", md, md, p->pr_p.p_uid ) ; } } Lastuid = p->pr_p.p_uid ; Lastpgrp = p->pr_p.p_pgrp ; if ( Flg.flg_d ) { /* List disc I/O and paging information */ if ( !p->pr_upag || p->pr_p.p_stat == SZOMB ) { prcmd( p, 49, -63 ) ; return ; } printf( "%2d %8d+%8d %4d %8d %8D ", p->pr_files, # ifdef BSD42 p->pr_rself.ru_majflt, p->pr_rself.ru_minflt, p->pr_rself.ru_nswap, p->pr_rself.ru_inblock + p->pr_rself.ru_oublock, KBYTES( p->pr_rself.ru_idrss + p->pr_rself.ru_isrss + p->pr_rself.ru_ixrss ) ) ; # else p->pr_vself.vm_majflt, p->pr_vself.vm_minflt, p->pr_vself.vm_nswap, p->pr_vself.vm_inblk + p->pr_vself.vm_oublk, KBYTES( (p->pr_vself.vm_idsrss + p->pr_vself.vm_ixrss) / Info.i_hz ) ) ; # endif prcmd( p, 5, -63 ) ; return ; } if ( !Flg.flg_v ) { /* Not verbose so just list command arguments */ prcmd( p, 5, -19 ) ; return ; } /* Arrive here if being verbose ; list cpu information */ switch ( p->pr_p.p_stat ) { case SSLEEP : case SWAIT : case SIDL : /* Determine why a process should be in a wait state */ chp = waitingfor( p ) ; break ; case SRUN : chp = "run" ; break ; case SZOMB : chp = "exit" ; break ; case SSTOP : chp = "stop" ; break ; } /* If the process is loaded, list the status information in capitals */ printf( "%-6.6s ", p->pr_p.p_flag & SLOAD ? (capitals( chp, chbuf ), chbuf) : chp ) ; /* List process flags */ printf( "%c%c%c", p->pr_p.p_flag & SSYS ? 'U' : p->pr_p.p_flag & STRC ? 'T' : ' ', p->pr_p.p_flag & SVFORK ? 'V' : p->pr_p.p_flag & SPHYSIO ? 'I' : ' ', p->pr_p.p_flag & SUANOM ? 'A' : ' ' ) ; /* List process niceness */ if ( p->pr_p.p_nice != NZERO ) printf( "%3d ", p->pr_p.p_nice - NZERO ) ; else printf( " " ) ; if ( p->pr_p.p_stat == SZOMB ) { prcmd( p, 41, -69 ) ; return ; } /* List process and text virtual sizes */ printf( "%4d", KBYTES( p->pr_p.p_dsize + p->pr_p.p_ssize ) ) ; if ( tp = p->pr_p.p_textp ) printf( "+%3d ", KBYTES( tp->x_size ) ) ; else printf( " " ) ; /* List process and text real sizes */ printf( "%4d", KBYTES( p->pr_p.p_rssize ) ) ; if ( tp ) printf( "+%3d %2.0f ", KBYTES( tp->x_rssize ), percentmem( p ) ); else printf( " " ) ; /* List information obtained from the upage. This includes the process times and command arguments. */ if ( !p->pr_upag ) { prcmd( p, 20, -69 ) ; return ; } /* List process time information */ # ifdef BSD42 time = Flg.flg_q ? p->pr_rself.ru_utime.tv_sec : p->pr_rself.ru_utime.tv_sec + p->pr_rself.ru_stime.tv_sec ; utime = Flg.flg_q ? p->pr_rself.ru_utime.tv_usec : p->pr_rself.ru_utime.tv_usec + p->pr_rself.ru_stime.tv_usec ; chtime = Flg.flg_q ? p->pr_rchild.ru_utime.tv_sec : p->pr_rchild.ru_utime.tv_sec + p->pr_rchild.ru_stime.tv_sec ; uchtime = Flg.flg_q ? p->pr_rchild.ru_utime.tv_usec : p->pr_rchild.ru_utime.tv_usec + p->pr_rchild.ru_stime.tv_usec ; prcpu( time, utime ) ; if ( chtime != 0L ) { printf( "+" ) ; prcpu( chtime, uchtime ) ; } # else time = Flg.flg_q ? p->pr_vself.vm_utime : p->pr_vself.vm_utime + p->pr_vself.vm_stime ; chtime = Flg.flg_q ? p->pr_vchild.vm_utime : p->pr_vchild.vm_utime + p->pr_vchild.vm_stime ; prcpu( time ) ; if ( chtime != 0L ) { printf( "+" ) ; prcpu( chtime ) ; } # endif else printf( " " ) ; # ifdef BSD42 if ( time || utime ) # else if ( time ) # endif # ifdef SUN printf( " %2.0f ", (double)p->pr_p.p_pctcpu ) ; # else printf( " %2.0f ", p->pr_p.p_pctcpu * 100.0 ) ; # endif else printf( " " ) ; /* Finally, list the process command arguments. */ prcmd( p, 5, -69 ) ; } /* CAPITALS - Converts letters in `chp' to upper-case in buffer `buf'. */ capitals ( chp, buf ) register char *chp ; register char *buf ; { while ( *buf = *chp++ ) { if ( 'a' <= *buf && *buf <= 'z' ) *buf -= 'a' - 'A' ; buf++ ; } } SHAR_EOF if test 5844 -ne "`wc -c < 'printproc.c'`" then echo shar: error transmitting "'printproc.c'" '(should have been 5844 characters)' fi fi # end of overwriting check echo shar: extracting "'prsummary.c'" '(632 characters)' if test -f 'prsummary.c' then echo shar: will not over-write existing file "'prsummary.c'" else sed 's/^X//' << \SHAR_EOF > 'prsummary.c' # include "sps.h" /* PRSUMMARY - Print the summarising information */ prsummary () { extern struct summary Summary ; printf( "%D (%Dk) processes, %D (%Dk) busy, %D (%Dk) loaded, %D (%Dk) swapped\n", Summary.sm_ntotal, KBYTES( Summary.sm_ktotal ), Summary.sm_nbusy, KBYTES( Summary.sm_kbusy ), Summary.sm_nloaded, KBYTES( Summary.sm_kloaded ), Summary.sm_nswapped, KBYTES( Summary.sm_kswapped ) ) ; Summary.sm_ntotal = 0L ; Summary.sm_ktotal = 0L ; Summary.sm_nbusy = 0L ; Summary.sm_kbusy = 0L ; Summary.sm_nloaded = 0L ; Summary.sm_kloaded = 0L ; Summary.sm_nswapped = 0L ; Summary.sm_kswapped = 0L ; } SHAR_EOF if test 632 -ne "`wc -c < 'prsummary.c'`" then echo shar: error transmitting "'prsummary.c'" '(should have been 632 characters)' fi fi # end of overwriting check echo shar: extracting "'readstatus.c'" '(1170 characters)' if test -f 'readstatus.c' then echo shar: will not over-write existing file "'readstatus.c'" else sed 's/^X//' << \SHAR_EOF > 'readstatus.c' # include "sps.h" # include /* READSTATUS - Reads the kernel memory for current processes and texts */ readstatus ( process, text ) register struct process *process ; struct text *text ; { register struct proc *p ; register struct proc *p0 ; register struct process *pr ; extern struct info Info ; extern int Flkmem ; char *getcore() ; /* Read current text information */ memseek( Flkmem, (long)Info.i_text0 ) ; if ( read( Flkmem, (char*)text, Info.i_ntext * sizeof( struct text ) ) != Info.i_ntext * sizeof( struct text ) ) prexit( "sps - Can't read system text table\n" ) ; /* Read current process information */ p0 = (struct proc*)getcore( sizeof( struct proc )*Info.i_nproc ) ; memseek( Flkmem, (long)Info.i_proc0 ) ; if ( read( Flkmem, (char*)p0, Info.i_nproc * sizeof( struct proc ) ) != Info.i_nproc * sizeof( struct proc ) ) prexit( "sps - Can't read system process table\n" ) ; /* Copy process information into our own array */ for ( p = p0, pr = process ; pr < &process[ Info.i_nproc ] ; p++, pr++ ) pr->pr_p = *p ; free( (char*)p0 ) ; } SHAR_EOF if test 1170 -ne "`wc -c < 'readstatus.c'`" then echo shar: error transmitting "'readstatus.c'" '(should have been 1170 characters)' fi fi # end of overwriting check echo shar: extracting "'selectproc.c'" '(1587 characters)' if test -f 'selectproc.c' then echo shar: will not over-write existing file "'selectproc.c'" else sed 's/^X//' << \SHAR_EOF > 'selectproc.c' # include "sps.h" # include "flags.h" /* ** SELECTPROC - Given a process structure, this procedure decides whether ** the process is a candidate for printing. */ selectproc ( p, process, thisuid ) register struct process *p ; register struct process *process ; int thisuid ; { register union flaglist *fp ; register struct process *pp ; extern struct flags Flg ; /* Flg.flg_AZ is an internal flag set if one of flags `A' to `Z' was specified. If this is not set, a process is listed only if it or one of its ancestors belongs to the invoking user. */ if ( !Flg.flg_AZ ) for ( pp = p ; pp > &process[1] ; pp = pp->pr_pptr ) if ( thisuid == pp->pr_p.p_uid ) return ( 1 ) ; if ( Flg.flg_A ) return ( 1 ) ; if ( Flg.flg_P ) for ( fp = Flg.flg_Plist ; fp->f_pid >= 0 ; fp++ ) if ( fp->f_pid == p->pr_p.p_pid ) return ( 1 ) ; if ( Flg.flg_U ) for ( pp = p ; pp > &process[1] ; pp = pp->pr_pptr ) for ( fp = Flg.flg_Ulist ; fp->f_uid >= 0 ; fp++ ) if ( fp->f_uid == pp->pr_p.p_uid ) return ( 1 ) ; switch ( p->pr_p.p_stat ) { case SRUN : if ( Flg.flg_B ) return ( 1 ) ; break ; case SSLEEP : if ( Flg.flg_B && p->pr_p.p_pri < PZERO && p->pr_p.p_pid > MSPID ) return ( 1 ) ; case SWAIT : case SIDL : if ( Flg.flg_W ) return ( 1 ) ; break ; case SSTOP : if ( Flg.flg_S ) return ( 1 ) ; break ; case SZOMB : if ( Flg.flg_Z ) return ( 1 ) ; break ; default : break ; } return ( 0 ) ; } SHAR_EOF if test 1587 -ne "`wc -c < 'selectproc.c'`" then echo shar: error transmitting "'selectproc.c'" '(should have been 1587 characters)' fi fi # end of overwriting check echo shar: extracting "'selecttty.c'" '(368 characters)' if test -f 'selecttty.c' then echo shar: will not over-write existing file "'selecttty.c'" else sed 's/^X//' << \SHAR_EOF > 'selecttty.c' # include "sps.h" # include "flags.h" /* SELECTTTY - Decides whether this process is interesting for its tty */ selecttty ( p ) register struct process *p ; { register union flaglist *fp ; extern struct flags Flg ; for ( fp = Flg.flg_Tlist ; fp->f_ttyline ; fp++ ) if ( fp->f_ttyline == p->pr_tty ) return ( 1 ) ; return ( 0 ) ; } SHAR_EOF if test 368 -ne "`wc -c < 'selecttty.c'`" then echo shar: error transmitting "'selecttty.c'" '(should have been 368 characters)' fi fi # end of overwriting check echo shar: extracting "'sps.h'" '(6468 characters)' if test -f 'sps.h' then echo shar: will not over-write existing file "'sps.h'" else sed 's/^X//' << \SHAR_EOF > 'sps.h' # include # include # include # include /* ** Maximum # of users to be considered. (Should probably be ** approximately double the # of users in /etc/passwd.) */ # define MAXUSERID 100 /* Maximum # ttys to be considered ... */ # define MAXTTYS 60 /* Maximum user name length ... */ # define UNAMELEN 8 /* Maximum process-id not to be considered busy ... */ # define MSPID 2 /* # of wait states defined in the `struct info' ... */ # define NWAITSTATE 36 /* Convert clicks to kbytes ... */ # ifdef SUN # define KBYTES( size ) ((size) << 1) # else # define KBYTES( size ) ((size) >> (10 - PGSHIFT)) # endif /* Standard files to be examined ... */ # define FILE_MEM "/dev/mem" /* System physical memory */ # define FILE_KMEM "/dev/kmem" /* Kernel virtual memory */ # define FILE_SWAP "/dev/drum" /* Swap/paging device */ # define FILE_DEV "/dev" /* Directory of tty entries */ # define FILE_SYMBOL "/vmunix" /* Symbol file for nlist() */ # define FILE_INFO "/etc/spsinfo" /* Sps information file */ /* Structure to hold necessary information concerning a tty ... */ struct ttyline { struct tty *l_addr ; /* Ptr to tty struct in kmem */ unsigned short l_pgrp ; /* Tty process group */ char l_name[2] ; /* Tty character name */ dev_t l_dev ; /* Tty device # */ } ; /* Structure holding a single hash table entry ... */ struct hashtab { unsigned short h_uid ; /* Uid of user entry */ char h_uname[ UNAMELEN ] ; /* Corresponding name */ } ; /* ** Format of the standard information file maintained by sps. ** This structure is filled in at initialisation time and then is read back ** in whenever sps is invoked. ** Note that the pointer variables in this structure refer to ** kernel virtual addresses, not addresses within sps. ** These variable are typed as such so that pointer arithmetic ** on the kernel addresses will work correctly. */ struct info { /* Kernel values determining process, tty and upage info ... */ struct proc *i_proc0 ; /* address of process table */ int i_nproc ; /* length of process table */ struct text *i_text0 ; /* address of text table */ int i_ntext ; /* length of text table */ struct inode *i_inode0 ; /* address of inode table */ int i_ninode ; /* length of inode table */ struct buf *i_swbuf0 ; /* address of swap buffers */ int i_nswbuf ; /* # swap buffers */ struct buf *i_buf0 ; /* address of i/o buffers */ int i_nbuf ; /* # i/o buffers */ int i_ecmx ; /* max physical memory address*/ struct pte *i_usrptmap ; /* page table map */ struct pte *i_usrpt ; /* page table map */ struct cdevsw *i_cdevsw ; /* device switch to find ttys */ # ifdef BSD42 struct quota *i_quota0 ; /* disc quota structures */ int i_nquota ; /* # quota structures */ int i_dmmin ; /* The start of the disc map */ int i_dmmax ; /* The end of the disc map */ struct mbuf *i_mbutl ; /* Start of mbuf area */ # else int i_hz ; /* Clock rate */ # endif # ifdef CHAOS caddr_t i_Chconntab ; /* Chaos connection table */ # endif /* Kernel addresses are associated with process wait states ... */ caddr_t i_waitstate[ NWAITSTATE ] ; /* User names, stored in a hash table ... */ struct hashtab i_hnames[ MAXUSERID ] ; /* Tty device info ... */ struct ttyline i_ttyline[ MAXTTYS ] ; } ; /* ** The symbol structure cross-references values read from the kernel with ** their place in the info structure, and if such a value is associated with ** a process wait state or not. */ struct symbol { char *s_kname ; /* Kernel symbol name */ char s_indirect ; /* Value requires indirection */ caddr_t *s_info ; /* Corresponding info address */ char *s_wait ; /* Reason for wait, if any */ } ; /* The `user' structure obtained from /dev/mem or /dev/swap ... */ union userstate { struct user u_us ; char u_pg[ UPAGES ][ NBPG ] ; } ; /* Information concerning each process filled from /dev/kmem ... */ struct process { struct proc pr_p ; /* struct proc from /dev/kmem */ struct process *pr_plink ; /* Normalised ptrs from above */ struct process *pr_sibling ; /* Ptr to sibling process */ struct process *pr_child ; /* Ptr to child process */ struct process *pr_pptr ; /* Ptr to parent process */ # ifdef BSD42 struct rusage pr_rself ; /* Read from upage for self */ struct rusage pr_rchild ; /* ... and the children */ # else struct vtimes pr_vself ; /* Read from upage for self */ struct vtimes pr_vchild ; /* ... and the children */ # endif int pr_files ; /* # open files */ struct ttyline *pr_tty ; /* Associated tty information */ char *pr_cmd ; /* Command args, from upage */ int pr_upag:1 ; /* Upage was obtained */ int pr_csaved:1 ; /* Cmd args saved by malloc() */ } ; /* Structure to hold summarising information ... */ struct summary { long sm_ntotal ; /* Total # processes */ long sm_ktotal ; /* Total virtual memory */ long sm_nbusy ; /* # busy processes */ long sm_kbusy ; /* Busy virtual memory */ long sm_nloaded ; /* # loaded processes */ long sm_kloaded ; /* Active resident memory */ long sm_nswapped ; /* # swapped processes */ long sm_kswapped ; /* Size totally swapped out */ } ; SHAR_EOF if test 6468 -ne "`wc -c < 'sps.h'`" then echo shar: error transmitting "'sps.h'" '(should have been 6468 characters)' fi fi # end of overwriting check echo shar: extracting "'termwidth.c'" '(490 characters)' if test -f 'termwidth.c' then echo shar: will not over-write existing file "'termwidth.c'" else sed 's/^X//' << \SHAR_EOF > 'termwidth.c' /* ** TERMWIDTH - Sets the external variable `Termwidth' to the # of columns ** on the terminal. */ termwidth () { register char *termtype ; register int twidth ; char buf[ 1025 ] ; extern unsigned Termwidth ; char *getenv() ; Termwidth = 80 ; if ( !(termtype = getenv( "TERM" )) ) return ; if ( tgetent( buf, termtype ) != 1 ) return ; twidth = tgetnum( "co" ) ; if ( twidth > 40 ) Termwidth = twidth ; } SHAR_EOF if test 490 -ne "`wc -c < 'termwidth.c'`" then echo shar: error transmitting "'termwidth.c'" '(should have been 490 characters)' fi fi # end of overwriting check echo shar: extracting "'ttystatus.c'" '(2883 characters)' if test -f 'ttystatus.c' then echo shar: will not over-write existing file "'ttystatus.c'" else sed 's/^X//' << \SHAR_EOF > 'ttystatus.c' # include "sps.h" # include "flags.h" # include # include # ifdef CHAOS # include # include # endif /* ** TTYSTATUS - Reads the kernel memory for tty structures of active processes. ** The addresses of the associated struct ttys of /dev/kmem are kept in the ** info structure. Here we use those addresses to access the structures. ** Actually, we are mostly interested just in the process group of each tty. */ ttystatus () { register struct ttyline *lp ; struct tty tty ; extern struct flags Flg ; extern struct info Info ; extern int Flkmem ; if ( Flg.flg_y ) printf( "Ty Dev Addr Rawq Canq Outq Pgrp\n" ) ; lp = Info.i_ttyline ; # ifdef CHAOS while ( lp->l_name[0] && lp->l_name[0] != 'C' ) # else while ( lp->l_name[0] ) # endif { memseek( Flkmem, (long)lp->l_addr ) ; if ( read( Flkmem, (char*)&tty, sizeof( struct tty ) ) != sizeof( struct tty ) ) { fprintf( stderr, "sps - Can't read struct tty for tty%.2s\n", lp->l_name ) ; lp->l_pgrp = 0 ; lp++ ; continue ; } lp->l_pgrp = tty.t_pgrp ; prtty( lp, &tty ) ; lp++ ; } # ifdef CHAOS chaosttys( lp ) ; # endif } /* PRTTY - Print out the tty structure */ prtty ( lp, tty ) register struct ttyline *lp ; register struct tty *tty ; { extern struct flags Flg ; if ( !Flg.flg_y ) return ; printf( "%-2.2s %2d,%2d 0x%08x %4d %4d %4d %5d\n", lp->l_name, major( lp->l_dev ), minor( lp->l_dev ), lp->l_addr, tty->t_rawq.c_cc, tty->t_canq.c_cc, tty->t_outq.c_cc, tty->t_pgrp ) ; } # ifdef CHAOS /* CHAOSTTYS - Finds ttys attached to the Chaos net */ chaosttys ( lp ) register struct ttyline *lp ; { register struct connection **cnp ; register int i ; struct tty tty ; struct connection *conntab[CHNCONNS] ; struct connection conn ; extern struct info Info ; extern int Flkmem ; memseek( Flkmem, (long)Info.i_Chconntab ) ; (void)read( Flkmem, (char*)conntab, sizeof( conntab ) ) ; for ( i = 0, cnp = conntab ; cnp < &conntab[CHNCONNS] ; i++, cnp++ ) { if ( !*cnp ) continue ; memseek( Flkmem, (long)*cnp ) ; (void)read( Flkmem, (char*)&conn, sizeof( struct connection ) ); if ( !(conn.cn_flags & CHTTY) ) continue ; memseek( Flkmem, (long)conn.cn_ttyp ) ; (void)read( Flkmem, (char*)&tty, sizeof( struct tty ) ) ; if ( lp >= &Info.i_ttyline[MAXTTYS] ) prexit( "sps - Too many chaos ttys\n" ) ; lp->l_addr = conn.cn_ttyp ; lp->l_pgrp = tty.t_pgrp ; lp->l_dev = tty.t_dev ; lp->l_name[0] = 'C' ; lp->l_name[1] = i < 10 ? '0'+i : i-10 <= 'z'-'a' ? i-10+'a' : i-10-('z'-'a')+'A' ; prtty( lp, &tty ) ; lp++ ; } } # endif SHAR_EOF if test 2883 -ne "`wc -c < 'ttystatus.c'`" then echo shar: error transmitting "'ttystatus.c'" '(should have been 2883 characters)' fi fi # end of overwriting check echo shar: extracting "'waitingfor.c'" '(5822 characters)' if test -f 'waitingfor.c' then echo shar: will not over-write existing file "'waitingfor.c'" else sed 's/^X//' << \SHAR_EOF > 'waitingfor.c' # include "sps.h" # include # include # ifdef SUN # include # include # else # include # endif # include # ifdef BSD42 # include # include # include # include # endif /* 1 if `w' is in the address range defined by `a1' and `a2' ... */ # define INRANGE( w, a1, a2 ) \ ( (caddr_t)(a1) <= (w) && (w) < (caddr_t)(a2) ) /* WAITINGFOR - Determine what a process is waiting for and describe it. */ char *waitingfor ( p ) struct process *p ; { register caddr_t w ; register struct ttyline *lp ; register struct symbol *s ; register char *cp ; # ifdef BSD42 struct socket sc ; # endif static char wbuf[ 8 ] ; extern struct info Info ; extern struct symbol Symbollist[] ; char *sprintf() ; w = p->pr_p.p_wchan ; if ( !w ) return ( "null" ) ; /* Waiting for a child process, alternatively in a vfork() ? */ if ( INRANGE( w, Info.i_proc0, &Info.i_proc0[ Info.i_nproc ] ) ) return ( p->pr_p.p_flag & SNOVM ? "vfork" : "child" ) ; /* Waiting for a page to be brought in ? */ if ( INRANGE( w, Info.i_swbuf0, &Info.i_swbuf0[ Info.i_nswbuf ] ) ) return ( "swap" ) ; /* Waiting for discio through a block device to complete ? */ if ( INRANGE( w, Info.i_buf0, &Info.i_buf0[ Info.i_nbuf ] ) ) /* SHOULD ACTUALLY READ AS "blkio" BUT "discio" IS WHAT IS GENERALLY MEANT HERE. */ return ( "discio" ) ; /* Waiting for a text page to be brought in ? */ if ( INRANGE( w, Info.i_text0, &Info.i_text0[ Info.i_ntext ] ) ) return ( "swtext" ) ; # ifdef BSD42 /* Waiting for an event associated with the quota system ? */ if ( INRANGE( w, Info.i_quota0, &Info.i_quota0[ Info.i_nquota ] ) ) return ( "quota" ) ; # endif /* Waiting for tty I/O ? If so, find which tty it is */ for ( lp = Info.i_ttyline ; lp->l_name[0] ; lp++ ) if ( INRANGE( w, &lp->l_addr[0], &lp->l_addr[1] ) ) { switch ( w - (int)lp->l_addr ) { case (int)&((struct tty*)0)->t_rawq : /* Read from a tty or slave pty */ cp = "rtty??" ; break ; case (int)&((struct tty*)0)->t_outq : /* Write to a tty or slave pty */ cp = "wtty??" ; break ; case (int)&((struct tty*)0)->t_state : /* Tty not open */ cp = "otty??" ; break ; case (int)&((struct tty*)0)->t_outq.c_cf : /* Read from a controller pty */ cp = "rpty??" ; break ; case (int)&((struct tty*)0)->t_rawq.c_cf : /* Write to a controller pty */ cp = "wpty??" ; break ; default : cp = "?tty??" ; break ; } cp[4] = lp->l_name[0] ; cp[5] = lp->l_name[1] ; return ( cp ) ; } /* Waiting for an inode ? */ if ( INRANGE( w, Info.i_inode0, &Info.i_inode0[ Info.i_ninode ] ) ) switch ( ((int)w - (int)Info.i_inode0) % sizeof( struct inode )) { # ifdef BSD42 # ifndef SUN case (int)&((struct inode*)0)->i_exlockc : /* Exclusive lock on this inode */ return ( "exlock" ) ; case (int)&((struct inode*)0)->i_shlockc : /* Shared lock on this inode */ return ( "shlock" ) ; # endif # else case 1 : return ( "wpipe" ) ; case 2 : return ( "rpipe" ) ; case (int)&((struct inode*)0)->i_un.i_group.g_datq : return ( "rmux" ) ; # endif default : /* Inode probably locked */ return ( "inode" ) ; } # ifdef BSD42 /* Waiting for a structure inside an mbuf ? If so, try to find why */ if ( INRANGE( w, Info.i_mbutl, &Info.i_mbutl[ NMBCLUSTERS * CLBYTES / sizeof( struct mbuf ) ] ) ) switch ( ((int)w - (int)Info.i_mbutl) % sizeof( struct mbuf ) - (int)&((struct mbuf*)0)->m_dat[0] ) { case (int)&((struct socket*)0)->so_timeo : /* Socket timeout event */ return ( "socket" ) ; case (int)&((struct socket*)0)->so_rcv.sb_cc : /* Read from an empty socket. Here we actually attempt to determine whether the socket structure in question really does refer to a socket, or whether it is in fact a pipe in disguise. */ return ( getsocket( (struct socket*)(w - (int)&((struct socket*)0)->so_rcv.sb_cc), &sc ) && sc.so_type == SOCK_STREAM && !sc.so_rcv.sb_hiwat && !sc.so_rcv.sb_mbmax && (sc.so_state & (SS_ISCONNECTED|SS_CANTRCVMORE)) ? "rpipe" : "rsockt" ) ; case (int)&((struct socket*)0)->so_snd.sb_cc : /* Write to a full socket. Again, we try to determine whether or not this is a real socket or a pipe. */ return ( getsocket( (struct socket*)(w - (int)&((struct socket*)0)->so_snd.sb_cc), &sc ) && sc.so_type == SOCK_STREAM && sc.so_rcv.sb_hiwat == 2048 && sc.so_rcv.sb_mbmax == 4096 && (sc.so_state & (SS_ISCONNECTED|SS_CANTSENDMORE)) ? "wpipe" : "wsockt" ) ; default : /* Other mbuf event */ return ( "mbuf" ) ; } # endif /* Look in the symbol table for known wait addresses. */ for ( s = Symbollist ; s->s_kname ; s++ ) if ( s->s_wait && w == *s->s_info ) return ( s->s_wait ) ; /* No reason for the wait state has been found. Return the wait channel as a hexadecimal address. */ # ifdef SUN (void)sprintf( wbuf, "x%05x", w ) ; # else (void)sprintf( wbuf, "x%05x", w - 0x80000000 ) ; # endif return ( wbuf ) ; } # ifdef BSD42 /* ** GETSOCKET - Reads a `struct socket' from the kernel virtual memory address ** identified by `ks' into the buffer `s'. */ getsocket ( ks, s ) struct socket *ks ; struct socket *s ; { extern int Flkmem ; memseek( Flkmem, (long)ks ) ; return ( read( Flkmem, (char*)s, sizeof( struct socket ) ) == sizeof( struct socket ) ) ; } # endif SHAR_EOF if test 5822 -ne "`wc -c < 'waitingfor.c'`" then echo shar: error transmitting "'waitingfor.c'" '(should have been 5822 characters)' fi fi # end of overwriting check # End of shell archive exit 0