home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume10 / sps / part01 next >
Internet Message Format  |  1987-07-21  |  62KB

  1. Path: uunet!rs
  2. From: rs@uunet.UU.NET (Rich Salz)
  3. Newsgroups: comp.sources.unix
  4. Subject: v10i060:  SPS for BSD, Ultrix1.2, Sun3.x, NFS, Part01/03
  5. Message-ID: <689@uunet.UU.NET>
  6. Date: 23 Jul 87 00:17:15 GMT
  7. Organization: UUNET Communications Services, Arlington, VA
  8. Lines: 2004
  9. Approved: rs@uunet.UU.NET
  10.  
  11. Submitted-by: robert@hslrswi.UUCP (Robert Ward)
  12. Posting-Number: Volume 10, Issue 60
  13. Archive-name: sps/Part01
  14.  
  15. [  This is a fast, public, version of "ps" for BSD-derived Unices..  --r$  ]
  16.  
  17. Hello Net,
  18.  
  19. This is another posting of SPS, hopefully the last for quite a while now.
  20. This version is the same as the one last posted to comp.sources.unix
  21. except that it includes fixes for those 4.3 systems with NFS. These
  22. additions were incorporated by Alexander Dupuy <dupuy@amsterdam.columbia.edu>
  23. who writes:
  24.  
  25. > Sun-specific changes
  26. >     A minor bugfix to "getcmd.c" to deal with processes which have no stack
  27. > (this is the case for nfs async block i/o daemons on some VMEbus Suns).
  28. > 4.3+NFS changes
  29. >     Changes to conditionalization to support NFS on non-Sun systems.
  30. > Several things like disc quotas are reimplemented with NFS, and should be
  31. > ignored on any NFS system, not just Suns.  The files "globals2.c" and
  32. > "waitingfor.c" were changed to support non-Sun NFS systems.  The file
  33. > "Makefile.sun" was changed to add the -DNFS option, and a new Makefile for
  34. > 4.3+NFS systems was added.
  35. >                     Alexander Dupuy
  36.  
  37.  
  38.  
  39. As usual, please mail all comments and fixes to myself (Robert) at:
  40.  
  41. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  42.     J. Robert Ward,                           ___________
  43.     Hasler AG, Belpstrasse 23, CH-3000 Berne 14, Switzerland       |    _    |
  44.                                    |  _| |_  |
  45. Tel.:        +41 31 632319                       | |_   _| |
  46. X.400:        robert@hslrswi.hasler                   |   |_|   |
  47. Bitnet:        robert%hslrswi.UUCP@cernvax.BITNET                  |_________|
  48. Uucp:        ... {seismo,ukc, ... }!mcvax!cernvax!hslrswi!robert
  49. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  50. #! /bin/sh
  51. # This is a shell archive.  Remove anything before this line, then unpack
  52. # it by saving it into a file and typing "sh file".  To overwrite existing
  53. # files, type "sh file -c".  You can also feed this as standard input via
  54. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  55. # will see the following message at the end:
  56. #        "End of archive 1 (of 3)."
  57. # Contents:  MANIFEST Makefile.4.1 Makefile.4.2 Makefile.4.3
  58. #   Makefile.4.3+NFS Makefile.sun README README2 filecount.c findtty.c
  59. #   flags.h flagsetup.c getupage.c globals1.c hashuid.c initialise.c
  60. #   initsymbols.c main.c mktree.c openfiles.c percentmem.c prcmd.c
  61. #   prcpu.c prheader.c printall.c prsummary.c readstatus.c
  62. #   selectproc.c selecttty.c termwidth.c ttystatus.c
  63. # Wrapped by rs@uunet on Wed Jul 22 20:09:05 1987
  64. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  65. if test -f MANIFEST -a "${1}" != "-c" ; then 
  66.   echo shar: Will not over-write existing file \"MANIFEST\"
  67. else
  68. echo shar: Extracting \"MANIFEST\" \(1344 characters\)
  69. sed "s/^X//" >MANIFEST <<'END_OF_MANIFEST'
  70. X   File Name        Archive #    Description
  71. X-----------------------------------------------------------
  72. X MANIFEST                  1    This shipping list
  73. X Makefile.4.1              1    
  74. X Makefile.4.2              1    
  75. X Makefile.4.3              1    
  76. X Makefile.4.3+NFS          1    
  77. X Makefile.sun              1    
  78. X README                    1    
  79. X README2                   1    
  80. X filecount.c               1    
  81. X findtty.c                 1    
  82. X flagdecode.c              2    
  83. X flags.h                   1    
  84. X flagsetup.c               1    
  85. X getcmd.c                  2    
  86. X getupage.c                1    
  87. X globals1.c                1    
  88. X globals2.c                2    
  89. X hashuid.c                 1    
  90. X initialise.c              1    
  91. X initsymbols.c             1    
  92. X inittty.c                 2    
  93. X main.c                    1    
  94. X mktree.c                  1    
  95. X needed.c                  2    
  96. X openfiles.c               1    
  97. X patches                   3    
  98. X percentmem.c              1    
  99. X prcmd.c                   1    
  100. X prcpu.c                   1    
  101. X prheader.c                1    
  102. X printall.c                1    
  103. X printproc.c               2    
  104. X prsummary.c               1    
  105. X readstatus.c              1    
  106. X selectproc.c              1    
  107. X selecttty.c               1    
  108. X sps.h                     2    
  109. X sps.man                   3    
  110. X termwidth.c               1    
  111. X ttystatus.c               1    
  112. X waitingfor.c              2    
  113. END_OF_MANIFEST
  114. if test 1344 -ne `wc -c <MANIFEST`; then
  115.     echo shar: \"MANIFEST\" unpacked with wrong size!
  116. fi
  117. # end of overwriting check
  118. fi
  119. if test -f Makefile.4.1 -a "${1}" != "-c" ; then 
  120.   echo shar: Will not over-write existing file \"Makefile.4.1\"
  121. else
  122. echo shar: Extracting \"Makefile.4.1\" \(882 characters\)
  123. sed "s/^X//" >Makefile.4.1 <<'END_OF_Makefile.4.1'
  124. X# Makefile for SPS (4.1BSD UNIX Version)
  125. X
  126. XPROG    =       sps
  127. XOBJS    =       filecount.o findtty.o flagdecode.o flagsetup.o \
  128. X        getcmd.o getupage.o globals1.o globals2.o hashuid.o \
  129. X        initialise.o initsymbols.o inittty.o main.o mktree.o \
  130. X        needed.o openfiles.o percentmem.o prcmd.o prcpu.o \
  131. X        prheader.o printall.o printproc.o prsummary.o readstatus.o \
  132. X        selectproc.o selecttty.o termwidth.o ttystatus.o waitingfor.o
  133. X
  134. XINCS    =       sps.h
  135. XLIBS    =       -ltermlib
  136. XCFLAGS  =       -I/usr/src/sys -DCHAOS
  137. X
  138. Xall:            $(PROG)
  139. X.c.o:
  140. X        cc $(CFLAGS) -c -O -R $<
  141. Xglobals1.o waitingfor.o:
  142. X        cc $(CFLAGS) -c -O $<
  143. X
  144. X$(OBJS):        $(INCS)
  145. X
  146. X$(PROG):        $(OBJS)
  147. X        cc -o $@ $(OBJS) $(LIBS)
  148. X
  149. Xinstall:        $(PROG)
  150. X        strip $(PROG)
  151. X        mv $(PROG) /bin/$(PROG)
  152. X        /etc/chown root /bin/$(PROG)
  153. X        chmod 4711 /bin/$(PROG)
  154. X
  155. Xlint:
  156. X        lint -x -b $(CFLAGS) *.c
  157. Xclean:
  158. X        rm -f $(OBJS) $(PROG)
  159. END_OF_Makefile.4.1
  160. if test 882 -ne `wc -c <Makefile.4.1`; then
  161.     echo shar: \"Makefile.4.1\" unpacked with wrong size!
  162. fi
  163. # end of overwriting check
  164. fi
  165. if test -f Makefile.4.2 -a "${1}" != "-c" ; then 
  166.   echo shar: Will not over-write existing file \"Makefile.4.2\"
  167. else
  168. echo shar: Extracting \"Makefile.4.2\" \(977 characters\)
  169. sed "s/^X//" >Makefile.4.2 <<'END_OF_Makefile.4.2'
  170. X# Makefile for SPS (Vax 4.2BSD and Ultrix1.2 UNIX Version)
  171. X
  172. XPROG    =       sps
  173. XOBJS    =       filecount.o findtty.o flagdecode.o flagsetup.o \
  174. X        getcmd.o getupage.o globals1.o globals2.o hashuid.o \
  175. X        initialise.o initsymbols.o inittty.o main.o mktree.o \
  176. X        needed.o openfiles.o percentmem.o prcmd.o prcpu.o \
  177. X        prheader.o printall.o printproc.o prsummary.o readstatus.o \
  178. X        selectproc.o selecttty.o termwidth.o ttystatus.o waitingfor.o
  179. XINCS    =       sps.h
  180. XCC      =       cc
  181. XCFLAGS  =       -DBSD42 -I/sys
  182. XLIBS    =       -ltermlib
  183. XDIRINSTALL =    /bin
  184. X
  185. Xall:            $(PROG)
  186. X.c.o:
  187. X        $(CC) $(CFLAGS) -c -O -R $<
  188. X    
  189. Xglobals1.o waitingfor.o:
  190. X        $(CC) $(CFLAGS) -c -O $<
  191. X
  192. X$(OBJS):        $(INCS)
  193. X
  194. X$(PROG):        $(OBJS)
  195. X        $(CC) -o $@ $(OBJS) $(LIBS)
  196. X
  197. Xinstall:        $(PROG)
  198. X        strip $(PROG)
  199. X        mv $(PROG) $(DIRINSTALL)/$(PROG)
  200. X        /etc/chown root $(DIRINSTALL)/$(PROG)
  201. X        chgrp kmem $(DIRINSTALL)/$(PROG)
  202. X        chmod 2755 $(DIRINSTALL)/$(PROG)
  203. X
  204. Xlint:
  205. X        lint -x -b $(CFLAGS) *.c
  206. Xclean:
  207. X        rm -f $(OBJS) $(PROG)
  208. END_OF_Makefile.4.2
  209. if test 977 -ne `wc -c <Makefile.4.2`; then
  210.     echo shar: \"Makefile.4.2\" unpacked with wrong size!
  211. fi
  212. # end of overwriting check
  213. fi
  214. if test -f Makefile.4.3 -a "${1}" != "-c" ; then 
  215.   echo shar: Will not over-write existing file \"Makefile.4.3\"
  216. else
  217. echo shar: Extracting \"Makefile.4.3\" \(966 characters\)
  218. sed "s/^X//" >Makefile.4.3 <<'END_OF_Makefile.4.3'
  219. X# Makefile for SPS (Vax 4.3BSD Version)
  220. X
  221. XPROG    =       sps
  222. XOBJS    =       filecount.o findtty.o flagdecode.o flagsetup.o \
  223. X        getcmd.o getupage.o globals1.o globals2.o hashuid.o \
  224. X        initialise.o initsymbols.o inittty.o main.o mktree.o \
  225. X        needed.o openfiles.o percentmem.o prcmd.o prcpu.o \
  226. X        prheader.o printall.o printproc.o prsummary.o readstatus.o \
  227. X        selectproc.o selecttty.o termwidth.o ttystatus.o waitingfor.o
  228. XINCS    =       sps.h
  229. XCC      =       cc
  230. XCFLAGS  =       -DBSD42 -DBSD43 -I/sys
  231. XLIBS    =       -ltermlib
  232. XDIRINSTALL =    /bin
  233. X
  234. Xall:            $(PROG)
  235. X.c.o:
  236. X        $(CC) $(CFLAGS) -c -O -R $<
  237. X    
  238. Xglobals1.o waitingfor.o:
  239. X        $(CC) $(CFLAGS) -c -O $<
  240. X
  241. X$(OBJS):        $(INCS)
  242. X
  243. X$(PROG):        $(OBJS)
  244. X        $(CC) -o $@ $(OBJS) $(LIBS)
  245. X
  246. Xinstall:        $(PROG)
  247. X        strip $(PROG)
  248. X        mv $(PROG) $(DIRINSTALL)/$(PROG)
  249. X        /etc/chown root $(DIRINSTALL)/$(PROG)
  250. X        chgrp kmem $(DIRINSTALL)/$(PROG)
  251. X        chmod 2755 $(DIRINSTALL)/$(PROG)
  252. X
  253. Xlint:
  254. X        lint -x -b $(CFLAGS) *.c
  255. Xclean:
  256. X        rm -f $(OBJS) $(PROG)
  257. END_OF_Makefile.4.3
  258. if test 966 -ne `wc -c <Makefile.4.3`; then
  259.     echo shar: \"Makefile.4.3\" unpacked with wrong size!
  260. fi
  261. # end of overwriting check
  262. fi
  263. if test -f Makefile.4.3+NFS -a "${1}" != "-c" ; then 
  264.   echo shar: Will not over-write existing file \"Makefile.4.3+NFS\"
  265. else
  266. echo shar: Extracting \"Makefile.4.3+NFS\" \(1089 characters\)
  267. sed "s/^X//" >Makefile.4.3+NFS <<'END_OF_Makefile.4.3+NFS'
  268. X# Makefile for SPS (Vax 4.3BSD Version)
  269. XPROG    =       sps
  270. XOBJS    =       filecount.o findtty.o flagdecode.o flagsetup.o \
  271. X        getcmd.o getupage.o globals1.o globals2.o hashuid.o \
  272. X        initialise.o initsymbols.o inittty.o main.o mktree.o \
  273. X        needed.o openfiles.o percentmem.o prcmd.o prcpu.o \
  274. X        prheader.o printall.o printproc.o prsummary.o readstatus.o \
  275. X        selectproc.o selecttty.o termwidth.o ttystatus.o waitingfor.o
  276. XINCS    =       sps.h
  277. XCC      =       cc
  278. XCFLAGS  =       -DBSD42 -DBSD43 -DQUOTA -DNFS -I/sys
  279. XLIBS    =       -ltermlib
  280. XDIRINSTALL =    /bin
  281. Xall:            $(PROG)
  282. X.c.o:
  283. X        $(CC) $(CFLAGS) -c -O -R $<
  284. Xglobals1.o waitingfor.o:
  285. X        $(CC) $(CFLAGS) -c -O $<
  286. X$(OBJS):        $(INCS)
  287. X$(PROG):        $(OBJS)
  288. X        $(CC) -o $@ $(OBJS) $(LIBS)
  289. Xinstall:        $(PROG)
  290. X        strip $(PROG)
  291. X        mv $(PROG) $(DIRINSTALL)/$(PROG)
  292. X        /etc/chown root $(DIRINSTALL)/$(PROG)
  293. X        chgrp kmem $(DIRINSTALL)/$(PROG)
  294. X        chmod 2755 $(DIRINSTALL)/$(PROG)
  295. Xlint:
  296. X        lint -x -b $(CFLAGS) *.c
  297. Xclean:
  298. X        rm -f $(OBJS) $(PROG)
  299. END_OF_Makefile.4.3+NFS
  300. if test 1089 -ne `wc -c <Makefile.4.3+NFS`; then
  301.     echo shar: \"Makefile.4.3+NFS\" unpacked with wrong size!
  302. fi
  303. # end of overwriting check
  304. fi
  305. if test -f Makefile.sun -a "${1}" != "-c" ; then 
  306.   echo shar: Will not over-write existing file \"Makefile.sun\"
  307. else
  308. echo shar: Extracting \"Makefile.sun\" \(988 characters\)
  309. sed "s/^X//" >Makefile.sun <<'END_OF_Makefile.sun'
  310. X# Makefile for SPS (Sun-2 and Sun-3, 4.2BSD UNIX Version)
  311. X
  312. XPROG    =       sps
  313. XOBJS    =       filecount.o findtty.o flagdecode.o flagsetup.o \
  314. X        getcmd.o getupage.o globals1.o globals2.o hashuid.o \
  315. X        initialise.o initsymbols.o inittty.o main.o mktree.o \
  316. X        needed.o openfiles.o percentmem.o prcmd.o prcpu.o \
  317. X        prheader.o printall.o printproc.o prsummary.o readstatus.o \
  318. X        selectproc.o selecttty.o termwidth.o ttystatus.o waitingfor.o
  319. XINCS    =       sps.h
  320. XCC      =       cc
  321. XCFLAGS  =       -DSUN -DBSD42 -DNFS -I/sys
  322. XLIBS    =       -ltermlib
  323. XDIRINSTALL    = /bin
  324. X
  325. Xall:            $(PROG)
  326. X.c.o:
  327. X        $(CC) $(CFLAGS) -c -O -R $<
  328. X    
  329. Xglobals1.o waitingfor.o:
  330. X        $(CC) $(CFLAGS) -c -O $<
  331. X
  332. X$(OBJS):        $(INCS)
  333. X
  334. X$(PROG):        $(OBJS)
  335. X        $(CC) -o $@ $(OBJS) $(LIBS)
  336. X
  337. Xinstall:        $(PROG)
  338. X        strip $(PROG)
  339. X        mv $(PROG) $(DIRINSTALL)/$(PROG)
  340. X        /etc/chown root $(DIRINSTALL)/$(PROG)
  341. X        chgrp kmem $(DIRINSTALL)/$(PROG)
  342. X        chmod 2755 $(DIRINSTALL)/$(PROG)
  343. X
  344. Xlint:
  345. X        lint -x -b $(CFLAGS) *.c
  346. Xclean:
  347. X        rm -f $(OBJS) $(PROG)
  348. END_OF_Makefile.sun
  349. if test 988 -ne `wc -c <Makefile.sun`; then
  350.     echo shar: \"Makefile.sun\" unpacked with wrong size!
  351. fi
  352. # end of overwriting check
  353. fi
  354. if test -f README -a "${1}" != "-c" ; then 
  355.   echo shar: Will not over-write existing file \"README\"
  356. else
  357. echo shar: Extracting \"README\" \(1226 characters\)
  358. sed "s/^X//" >README <<'END_OF_README'
  359. X        SPS - Show Process Status
  360. X        =========================
  361. XTo compile, install and test, type the following commands (as super-user):
  362. X    % make                  # Compile SPS
  363. X    % make install          # Install SPS into /bin/sps
  364. X    % sps i                 # Initialise SPS
  365. X    % sps va                # Run SPS
  366. X********************************************************************************
  367. XThe files in this directory are for the 4.[12]BSD / VAX-11 version of SPS.
  368. XCompiler options are as follows -
  369. X    -DCHAOS         if the Chaos network is incorporated into 4.xbsd
  370. X    -DTRACE         for testing/debugging purposes
  371. X    -DBSD42         compile SPS for 4.2bsd.
  372. X            Otherwise, SPS is compiled for 4.1bsd.
  373. X********************************************************************************
  374. XIf you want to tell SPS about a new type of device, then add a new line to
  375. Xthe symbol table (see globals2.c),after ensuring that there is sufficient
  376. Xroom in the `info' structure. (NWAITSTATE may need to be increased in sps.h).
  377. X********************************************************************************
  378. XSPS understands if the size of internal kernel tables are changed under VMUNIX,
  379. Xbut must be recompiled if major modifications are made to the kernel.
  380. END_OF_README
  381. if test 1226 -ne `wc -c <README`; then
  382.     echo shar: \"README\" unpacked with wrong size!
  383. fi
  384. # end of overwriting check
  385. fi
  386. if test -f README2 -a "${1}" != "-c" ; then 
  387.   echo shar: Will not over-write existing file \"README2\"
  388. else
  389. echo shar: Extracting \"README2\" \(3050 characters\)
  390. sed "s/^X//" >README2 <<'END_OF_README2'
  391. X        SPS  -  Show Process Status
  392. X        ===========================
  393. X
  394. XSPS is a intended to be used as a replacement for the standard ps(1)
  395. Xprogram. Its advantages over ps(1) are that it shows more useful
  396. Xinformation and that it is faster.
  397. X
  398. XSPS is currently implemented for 4.1 and 4.2bsd Unix on Vaxen and for
  399. XSun's 4.2bsd/Release 2. (I also have a somewhat older implementation
  400. Xfor V7 on a PDP-11 as well as Unisoft Version 1.3 on a MC68000 if you
  401. Xare interested).
  402. X
  403. XSPS displays wait channels symbolically, rather than as hexadecimal
  404. Xaddresses. If you wish to teach sps about a new sort of device, you
  405. Xmust add an entry in the symbol table (globals2.c) as well as
  406. Xincreasing the size of that table (NWAITSTATE in sps.h).
  407. X
  408. XSPS sorts processes before listing them. The order reflects the
  409. Xrelationship of the processes. A child process is listed underneath its
  410. Xcorresponding parent and is indented to depict the exact relationship.
  411. XSPS also indicates setuid processes.
  412. X
  413. XSPS displays such values as the resident and virtual sizes of system
  414. Xprocesses.  It accepts a whole range of options to control the output.
  415. XBy default, SPS lists information about one's own processes. Other
  416. Xoptions instruct it to be verbose (the "v" option), to list all the
  417. Xcommand arguments of a process (the "w" option) or to list the
  418. Xenvironment strings of that process (the "e" option). Similarly, there
  419. Xare options to control which processes are to be displayed. The "a"
  420. Xoption tells it to describe all processes and the "b" option tells it
  421. Xto describe "busy" processes, which is useful if you wish to find out
  422. Xwhat is loading your system. There are also options to select the
  423. Xoutput according to user, controlling tty or process number.
  424. X
  425. XSPS keeps its information in an information file. By default, this is
  426. X/etc/spsinfo. This means that it can avoid having to do an expensive
  427. Xnlist() operation each time it is run. It must be reinitialised (with
  428. Xthe "i" option) if new users are added to /etc/passwd or if a new
  429. Xversion of /vmunix is installed.
  430. X
  431. XTo compile SPS, unbundle the four shell archive files.  Check that the
  432. Xdefine statements in sps.h are large enough for your system (You may
  433. Xneed to alter MAXTTYS).  Then compile it using the appropriate
  434. XMakefile. Initialise it by typing "sps i" (ignore any error messages at
  435. Xthis stage) and then test it out by typing "sps va". That should make
  436. XSPS list verbose information about every process currently active. If
  437. Xthat works, use the appropriate Makefile to install it.
  438. X
  439. XSend all bug reports, fixes, comments and suggestions to Robert Ward at -
  440. X
  441. X******************************************************************************
  442. X    Robert Ward,
  443. X    Hasler AG, Murtenstrasse 137a, CH-3008 Bern, Switzerland
  444. X
  445. XTel.:        (031) - 65 23 19
  446. XUucp:        ... {seismo,decvax,ukc, ... }!mcvax!cernvax!hslrswi!robert
  447. XBitnet:        hslrswi!robert@cernvax.bitnet
  448. XArpa:        hslrswi!robert%cernvax.bitnet@WISCVM.ARPA
  449. XEdunet:        hslrswi!robert%cernvax.bitnet@UCBJADE.Berkeley.EDU
  450. X******************************************************************************
  451. END_OF_README2
  452. if test 3050 -ne `wc -c <README2`; then
  453.     echo shar: \"README2\" unpacked with wrong size!
  454. fi
  455. # end of overwriting check
  456. fi
  457. if test -f filecount.c -a "${1}" != "-c" ; then 
  458.   echo shar: Will not over-write existing file \"filecount.c\"
  459. else
  460. echo shar: Extracting \"filecount.c\" \(351 characters\)
  461. sed "s/^X//" >filecount.c <<'END_OF_filecount.c'
  462. X# include       "sps.h"
  463. X
  464. X/* FILECOUNT - Counts the # open files for the current process */
  465. Xfilecount ()
  466. X{
  467. X    register int            i ;
  468. X    register struct file    **f ;
  469. X    register int            count ;
  470. X    extern union userstate  User ;
  471. X
  472. X    count = 0 ;
  473. X    for ( i = 0, f = User.u_us.u_ofile ; i < NOFILE ; i++ )
  474. X        if ( *f++ )
  475. X            count++ ;
  476. X    return ( count ) ;
  477. X}
  478. END_OF_filecount.c
  479. if test 351 -ne `wc -c <filecount.c`; then
  480.     echo shar: \"filecount.c\" unpacked with wrong size!
  481. fi
  482. # end of overwriting check
  483. fi
  484. if test -f findtty.c -a "${1}" != "-c" ; then 
  485.   echo shar: Will not over-write existing file \"findtty.c\"
  486. else
  487. echo shar: Extracting \"findtty.c\" \(533 characters\)
  488. sed "s/^X//" >findtty.c <<'END_OF_findtty.c'
  489. X# include       "sps.h"
  490. X# include       <h/ioctl.h>
  491. X# include       <h/tty.h>
  492. X
  493. X/* FINDTTY - Attempts to determine to which tty a process is connected */
  494. Xstruct ttyline  *findtty ( p )
  495. X
  496. Xregister struct process         *p ;
  497. X
  498. X{
  499. X    register struct ttyline *lp ;
  500. X    extern struct info      Info ;
  501. X    extern struct ttyline   Notty ;
  502. X    extern union userstate  User ;
  503. X
  504. X    if ( !p->pr_p.p_pgrp )
  505. X        return ( &Notty ) ;
  506. X    for ( lp = Info.i_ttyline ; lp->l_name[0] ; lp++ )
  507. X        if ( lp->l_dev == User.u_us.u_ttyd )
  508. X            return ( lp ) ;
  509. X    return ( &Notty ) ;
  510. X}
  511. END_OF_findtty.c
  512. if test 533 -ne `wc -c <findtty.c`; then
  513.     echo shar: \"findtty.c\" unpacked with wrong size!
  514. fi
  515. # end of overwriting check
  516. fi
  517. if test -f flags.h -a "${1}" != "-c" ; then 
  518.   echo shar: Will not over-write existing file \"flags.h\"
  519. else
  520. echo shar: Extracting \"flags.h\" \(2488 characters\)
  521. sed "s/^X//" >flags.h <<'END_OF_flags.h'
  522. X/* Structure holding information specified in the option list ... */
  523. Xunion flaglist
  524. X{
  525. X    char                    *f_chp ;        /* Option specified as string */
  526. X    int                     f_uid ;         /* Numerical user id */
  527. X    int                     f_pid ;         /* Numerical process id */
  528. X    struct ttyline          *f_ttyline ;    /* Specified tty */
  529. X} ;
  530. X
  531. X/* Structure holding global information specifed by arg list options ... */
  532. Xstruct flags
  533. X{
  534. X    int                     flg_d:1 ;       /* disc orientated output */
  535. X    int                     flg_e:1 ;       /* print environment string */
  536. X    int                     flg_f:1 ;       /* print process father # */
  537. X    int                     flg_g:1 ;       /* print process group # */
  538. X    int                     flg_i:1 ;       /* initialise sps */
  539. X    char                    *flg_j ;        /* Use this as the info file */
  540. X    char                    *flg_k ;        /* Use this as the {k}mem file*/
  541. X    int                     flg_o:1 ;       /* avoid the swap device */
  542. X    int                     flg_q:1 ;       /* show user time only */
  543. X    int                     flg_r:1 ;       /* repeat output */
  544. X    unsigned                flg_rdelay ;    /* ... with this much delay */
  545. X    char                    *flg_s ;        /* Use this as the symbol file*/
  546. X    int                     flg_v:1 ;       /* print verbose listing */
  547. X    int                     flg_w:1 ;       /* print wide output */
  548. X    int                     flg_y:1 ;       /* print tty information */
  549. X    int                     flg_A:1 ;       /* print all processes */
  550. X    int                     flg_B:1 ;       /* print busy processes */
  551. X    int                     flg_F:1 ;       /* print foreground processes */
  552. X    int                     flg_N:1 ;       /* print no processes */
  553. X    int                     flg_P:1 ;       /* print specified process #'s*/
  554. X    int                     flg_S:1 ;       /* print stopped processes */
  555. X    int                     flg_T:1 ;       /* print procs for given ttys */
  556. X    int                     flg_U:1 ;       /* print procs for given users*/
  557. X    int                     flg_W:1 ;       /* print waiting processes */
  558. X    int                     flg_Z:1 ;       /* print zombie processes */
  559. X    int                     flg_AZ:1 ;      /* One of A to Z was specified*/
  560. X    union flaglist          *flg_Plist ;    /* List of specified processes*/
  561. X    union flaglist          *flg_Tlist ;    /* List of specified ttys */
  562. X    union flaglist          *flg_Ulist ;    /* List of specified users */
  563. X} ;
  564. END_OF_flags.h
  565. if test 2488 -ne `wc -c <flags.h`; then
  566.     echo shar: \"flags.h\" unpacked with wrong size!
  567. fi
  568. # end of overwriting check
  569. fi
  570. if test -f flagsetup.c -a "${1}" != "-c" ; then 
  571.   echo shar: Will not over-write existing file \"flagsetup.c\"
  572. else
  573. echo shar: Extracting \"flagsetup.c\" \(2210 characters\)
  574. sed "s/^X//" >flagsetup.c <<'END_OF_flagsetup.c'
  575. X# include       "sps.h"
  576. X# include       "flags.h"
  577. X# include       <h/ioctl.h>
  578. X# include       <h/tty.h>
  579. X
  580. X/*
  581. X** FLAGSETUP - Replaces any users or processes specified by flagdecode()
  582. X** with numerical equivalents. The lists are terminated by negative values.
  583. X** or null pointers. Ttystatus() must have been previously called to
  584. X** initialise the Info structure with chaos tty values.
  585. X*/
  586. Xflagsetup ()
  587. X{
  588. X    register union flaglist *fp ;
  589. X    register char           *chp ;
  590. X    register int            i ;
  591. X    register struct ttyline *lp ;
  592. X    int                     found ;
  593. X    extern struct flags     Flg ;
  594. X    extern struct info      Info ;
  595. X
  596. X    /* Look for specified users */
  597. X    if ( Flg.flg_U )                
  598. X    {
  599. X        if ( !Flg.flg_Ulist->f_chp )
  600. X            prexit( "sps - User name was expected after -u flag\n");
  601. X        for ( fp = Flg.flg_Ulist ; chp = fp->f_chp ; fp++ )
  602. X        {
  603. X            found = 0 ;
  604. X            for ( i = 0 ; i < MAXUSERID ; i++ )
  605. X                if ( !strncmp( chp, Info.i_hnames[i].h_uname,
  606. X                    UNAMELEN ) )
  607. X                {
  608. X                    fp->f_uid = Info.i_hnames[i].h_uid ;
  609. X                    found = 1 ;
  610. X                    break ;
  611. X                }
  612. X            if ( !found )
  613. X                prexit( "sps - Unknown user: %s\n", chp ) ;
  614. X        }
  615. X        fp->f_uid = -1 ;
  616. X    }
  617. X    /* Look for specified process ids */
  618. X    if ( Flg.flg_P )                
  619. X    {
  620. X        if ( !Flg.flg_Plist->f_chp )
  621. X            prexit(
  622. X                 "sps - Process id was expected after -p flag\n" ) ;
  623. X        for ( fp = Flg.flg_Plist ; chp = fp->f_chp ; fp++ )
  624. X        {
  625. X            if ( chp[0] < '0' || chp[0] > '9' )
  626. X                prexit( "sps - Bad process id: %s\n", chp ) ;
  627. X            fp->f_pid = atoi( chp ) ;
  628. X        }
  629. X        fp->f_pid = -1 ;
  630. X    }
  631. X    /* Look for specified ttys */
  632. X    if ( !Flg.flg_T )               
  633. X        return ;
  634. X    if ( !Flg.flg_Tlist->f_chp )
  635. X        prexit( "sps - Tty name was expected after -t flag\n" ) ;
  636. X    for ( fp = Flg.flg_Tlist ; chp = fp->f_chp ; fp++ )
  637. X    {       /* Under VMUNIX, all ttys have two character names.
  638. X           Thus, a flag of the form `t 8' should be expanded to
  639. X           become `t 08'. */
  640. X        if ( !chp[1] )
  641. X            chp[1] = chp[0], chp[0] = '0' ;
  642. X        found = 0 ;
  643. X        for ( lp = Info.i_ttyline ; lp->l_name[0] ; lp++ )
  644. X            if ( !strncmp( chp, lp->l_name, 2 ) )
  645. X            {
  646. X                fp->f_ttyline = lp ;
  647. X                found = 1 ;
  648. X                break ;
  649. X            }
  650. X        if ( !found )
  651. X            prexit( "sps - Unknown tty name: %.2s\n", chp ) ;
  652. X    }
  653. X    fp->f_ttyline = (struct ttyline*)0 ;
  654. X}
  655. END_OF_flagsetup.c
  656. if test 2210 -ne `wc -c <flagsetup.c`; then
  657.     echo shar: \"flagsetup.c\" unpacked with wrong size!
  658. fi
  659. # end of overwriting check
  660. fi
  661. if test -f getupage.c -a "${1}" != "-c" ; then 
  662.   echo shar: Will not over-write existing file \"getupage.c\"
  663. else
  664. echo shar: Extracting \"getupage.c\" \(2971 characters\)
  665. sed "s/^X//" >getupage.c <<'END_OF_getupage.c'
  666. X# include       "sps.h"
  667. X# include       <h/vm.h>
  668. X# ifdef BSD42
  669. X# include    <machine/pte.h>
  670. X# else
  671. X# include       <h/pte.h>
  672. X# endif
  673. X# include       <stdio.h>
  674. X
  675. X/*
  676. X** GETUPAGE - Reads the upage for the specified process as well as sufficient
  677. X** page tables entries for reading the command arguments. The pte's are read
  678. X** into the argument `ptetbl'. The upage is read into the external variable
  679. X** `User'. This procedure returns 1 if the upage was successfully read.
  680. X*/
  681. X
  682. X# define        usrpt           (Info.i_usrpt)
  683. X
  684. Xgetupage ( p, ptetbl )
  685. X
  686. Xregister struct process         *p ;
  687. Xregister struct pte             *ptetbl ;
  688. X
  689. X{
  690. X    register int            i ;
  691. X    register int            ncl ;
  692. X    struct pte              pte ;
  693. X    extern struct info      Info ;
  694. X    extern union userstate  User ;
  695. X    extern int              Flmem, Flkmem, Flswap ;
  696. X
  697. X    /* If the process is not loaded, look for the upage on the swap device*/
  698. X    if ( !(p->pr_p.p_flag & SLOAD) )
  699. X    {                               
  700. X# ifdef BSD42
  701. X        swseek( (long)dtob( p->pr_p.p_swaddr ) ) ;
  702. X# else
  703. X        swseek( (long)ctob( p->pr_p.p_swaddr ) ) ;
  704. X# endif
  705. X# ifdef SUN
  706. X        if ( read( Flswap, (char*)&User.u_us, sizeof( union userstate ))
  707. X        != sizeof( union userstate ) )
  708. X# else
  709. X        if ( read( Flswap, (char*)&User.u_us, sizeof( struct user ) )
  710. X        != sizeof( struct user ) )
  711. X# endif
  712. X        {
  713. X            fprintf( stderr,
  714. X                "sps - Can't read upage of process %d\n",
  715. X                p->pr_p.p_pid ) ;
  716. X            return ( 0 ) ;
  717. X        }
  718. X        return ( 1 ) ;          
  719. X    }                               
  720. X    /* The process is loaded. Locate the process pte's by reading
  721. X       the pte of their base address from system virtual address space. */
  722. X    memseek( Flkmem, (long)&Info.i_usrptmap[ btokmx(p->pr_p.p_p0br)
  723. X        + p->pr_p.p_szpt-1 ] ) ;
  724. X    if ( read( Flkmem, (char*)&pte, sizeof( struct pte ) )
  725. X    != sizeof( struct pte ) )
  726. X    {
  727. X        fprintf( stderr,
  728. X              "sps - Can't read indir pte for upage of process %d\n",
  729. X            p->pr_p.p_pid ) ;
  730. X        return ( 0 ) ;
  731. X    }                               
  732. X    /* Now read the process' pte's from physical memory. We need to access
  733. X       sufficient pte's for the upage and for the command arguments. */
  734. X    memseek( Flmem, (long)ctob( pte.pg_pfnum+1 )
  735. X        - (UPAGES+CLSIZE)*sizeof( struct pte ) ) ;
  736. X    if ( read( Flmem, (char*)ptetbl, (UPAGES+CLSIZE)*sizeof( struct pte ) )
  737. X    != (UPAGES+CLSIZE)*sizeof( struct pte ) )
  738. X    {
  739. X        fprintf( stderr, "sps - Can't read page table of process %d\n",
  740. X            p->pr_p.p_pid ) ;
  741. X        return ( 0 ) ;
  742. X    }
  743. X    /* Now we can read the pages belonging to the upage.
  744. X       Here we read in an entire click at one go. */
  745. X    ncl = (sizeof( struct user ) + NBPG*CLSIZE - 1) / (NBPG*CLSIZE) ;
  746. X    while ( --ncl >= 0 )            
  747. X    {                               
  748. X        i = ncl * CLSIZE ;
  749. X        memseek( Flmem, (long)ctob( ptetbl[ CLSIZE+i ].pg_pfnum ) ) ;
  750. X        if ( read( Flmem, User.u_pg[i], CLSIZE*NBPG ) != CLSIZE*NBPG )
  751. X        {
  752. X            fprintf( stderr,
  753. X                "sps - Can't read page 0x%x of process %d\n",
  754. X                ptetbl[ CLSIZE+i ].pg_pfnum, p->pr_p.p_pid ) ;
  755. X            return ( 0 ) ;
  756. X        }
  757. X    }
  758. X    return ( 1 ) ;
  759. X}
  760. END_OF_getupage.c
  761. if test 2971 -ne `wc -c <getupage.c`; then
  762.     echo shar: \"getupage.c\" unpacked with wrong size!
  763. fi
  764. # end of overwriting check
  765. fi
  766. if test -f globals1.c -a "${1}" != "-c" ; then 
  767.   echo shar: Will not over-write existing file \"globals1.c\"
  768. else
  769. echo shar: Extracting \"globals1.c\" \(720 characters\)
  770. sed "s/^X//" >globals1.c <<'END_OF_globals1.c'
  771. X# include       "sps.h"
  772. X# include       "flags.h"
  773. X
  774. X/* Read/Write Variables global to the code of sps */
  775. X
  776. Xstruct info                     Info ;          /* Information structure */
  777. X
  778. Xstruct flags                    Flg ;           /* Flag options */
  779. X
  780. Xstruct summary                  Summary ;       /* Summary of processes */
  781. X
  782. Xunion  userstate                User ;          /* Upage of one process */
  783. X
  784. Xint                             Flmem, Flkmem, Flswap ; /* File descriptors */
  785. X
  786. Xunsigned                        Termwidth ;     /* Width of output device */
  787. X
  788. Xshort                           Lastpgrp ;      /* Last process pgrp printed */
  789. X
  790. Xshort                           Lastuid ;       /* Last process uid printed */
  791. END_OF_globals1.c
  792. if test 720 -ne `wc -c <globals1.c`; then
  793.     echo shar: \"globals1.c\" unpacked with wrong size!
  794. fi
  795. # end of overwriting check
  796. fi
  797. if test -f hashuid.c -a "${1}" != "-c" ; then 
  798.   echo shar: Will not over-write existing file \"hashuid.c\"
  799. else
  800. echo shar: Extracting \"hashuid.c\" \(1441 characters\)
  801. sed "s/^X//" >hashuid.c <<'END_OF_hashuid.c'
  802. X# include       "sps.h"
  803. X
  804. X/* The hashing functions themselves ... */
  805. X# define        HASHFN1( a )            (((unsigned)(a)*91 + 17) % MAXUSERID)
  806. X# define        HASHFN2( a )            (((unsigned)(a) + 47) % MAXUSERID)
  807. X
  808. X/*
  809. X** HASHUID - Returns a pointer to a slot in the hash table that corresponds
  810. X** to the hash table entry for `uid'. It returns a null pointer if there is
  811. X** no such slot.
  812. X*/
  813. Xstruct hashtab  *hashuid ( uid )
  814. X
  815. Xint                             uid ;
  816. X
  817. X{
  818. X    register struct hashtab *hp ;
  819. X    register int            i ;
  820. X    register int            j ;
  821. X    extern struct info      Info ;
  822. X
  823. X    j = HASHFN1( uid ) ;
  824. X    for ( i = 0 ; i < MAXUSERID ; i++ )
  825. X    {
  826. X        hp = &Info.i_hnames[ j ] ;
  827. X        if ( !hp->h_uname[0] )
  828. X            return ( (struct hashtab*)0 ) ;
  829. X        if ( hp->h_uid == uid )
  830. X            return ( hp ) ;
  831. X        j = HASHFN2( j ) ;
  832. X    }
  833. X    return ( (struct hashtab*)0 ) ;
  834. X}
  835. X
  836. X/*
  837. X** HASHNEXT - Returns a pointer to the next slot in the hash table that
  838. X** may be use for storing information for `uid'. It returns a null pointer
  839. X** if there are no more free slots available.
  840. X*/
  841. Xstruct hashtab  *hashnext ( uid )
  842. X
  843. Xint                             uid ;
  844. X
  845. X{
  846. X    register struct hashtab *hp ;
  847. X    register int            i ;
  848. X    register int            j ;
  849. X    extern struct info      Info ;
  850. X
  851. X    j = HASHFN1( uid ) ;
  852. X    for ( i = 0 ; i < MAXUSERID ; i++ )
  853. X    {
  854. X        hp = &Info.i_hnames[ j ] ;
  855. X        if ( !hp->h_uname[0] )
  856. X            return ( hp ) ;
  857. X        j = HASHFN2( j ) ;
  858. X    }
  859. X    return ( (struct hashtab*)0 ) ;
  860. X}
  861. END_OF_hashuid.c
  862. if test 1441 -ne `wc -c <hashuid.c`; then
  863.     echo shar: \"hashuid.c\" unpacked with wrong size!
  864. fi
  865. # end of overwriting check
  866. fi
  867. if test -f initialise.c -a "${1}" != "-c" ; then 
  868.   echo shar: Will not over-write existing file \"initialise.c\"
  869. else
  870. echo shar: Extracting \"initialise.c\" \(1905 characters\)
  871. sed "s/^X//" >initialise.c <<'END_OF_initialise.c'
  872. X# include       "sps.h"
  873. X# include       "flags.h"
  874. X# include       <pwd.h>
  875. X# include       <stdio.h>
  876. X
  877. X/*
  878. X** INITIALISE - Called to reset the `Info' structure with new kernel
  879. X** addresses and user and tty information.
  880. X*/
  881. Xinitialise ()
  882. X{
  883. X    register FILE           *fd ;
  884. X    char                    *fileinfo ;
  885. X    extern struct flags     Flg ;
  886. X    extern struct info      Info ;
  887. X    FILE                    *fopen() ;
  888. X
  889. X    fileinfo = Flg.flg_j ? Flg.flg_j : FILE_INFO ;
  890. X    /* Read kernel addresses */
  891. X    initsymbols() ;                 
  892. X    /* Read user names */
  893. X    initusers() ;                   
  894. X    (void)umask( ~0644 ) ;          
  895. X    if ( !(fd = fopen( fileinfo, "w" )) )
  896. X    {
  897. X        fprintf( stderr, "sps - Can't create info file %s", fileinfo ) ;
  898. X        sysperror() ;
  899. X    }
  900. X    /* Find tty addresses */
  901. X    inittty() ;                     
  902. X    if ( fwrite( (char*)&Info, sizeof( struct info ), 1, fd ) != 1 )
  903. X    {
  904. X        fprintf( stderr, "sps - Can't write info file %s", fileinfo ) ;
  905. X        sysperror() ;
  906. X        exit( 1 ) ;
  907. X    }
  908. X    (void)fclose( fd ) ;
  909. X    printf( "sps is initialised\n" ) ;
  910. X}
  911. X
  912. X/* INITUSERS - Read the passwd file and fill in the user name arrays */
  913. Xinitusers ()
  914. X{
  915. X    register struct passwd  *pw ;
  916. X    register struct hashtab *hp ;
  917. X    struct passwd           *getpwent() ;
  918. X    char                    *strncpy() ;
  919. X    struct hashtab          *hashuid(), *hashnext() ;
  920. X
  921. X    while ( pw = getpwent() )
  922. X    {       /* For each user in the passwd file, first see if that uid
  923. X           has been already allocated in the hash table. */
  924. X        if ( hp = hashuid( pw->pw_uid ) )
  925. X        {
  926. X            fprintf( stderr,
  927. X           "sps - Names %s and %s conflict in passwd file for uid %d\n",
  928. X                hp->h_uname, pw->pw_name, pw->pw_uid ) ;
  929. X            continue ;
  930. X        }
  931. X        /* Try to find a free slot in the hash table and fill it. */
  932. X        if ( !(hp = hashnext( pw->pw_uid )) )
  933. X            prexit( "sps - Too many users in passwd file\n" ) ;
  934. X        hp->h_uid = pw->pw_uid ;
  935. X        (void)strncpy( hp->h_uname, pw->pw_name, UNAMELEN ) ;
  936. X    }
  937. X    (void)endpwent() ;
  938. X}
  939. END_OF_initialise.c
  940. if test 1905 -ne `wc -c <initialise.c`; then
  941.     echo shar: \"initialise.c\" unpacked with wrong size!
  942. fi
  943. # end of overwriting check
  944. fi
  945. if test -f initsymbols.c -a "${1}" != "-c" ; then 
  946.   echo shar: Will not over-write existing file \"initsymbols.c\"
  947. else
  948. echo shar: Extracting \"initsymbols.c\" \(3000 characters\)
  949. sed "s/^X//" >initsymbols.c <<'END_OF_initsymbols.c'
  950. X# include       "sps.h"
  951. X# include       "flags.h"
  952. X# ifdef BSD42
  953. X# include       <sys/file.h>
  954. X# endif
  955. X# include       <nlist.h>
  956. X# include       <stdio.h>
  957. X
  958. X/* INITSYMBOLS - Reads kmem values into the Info structure */
  959. X/*
  960. X** THIS CODE COPIES KMEM VALUES INTO THE INFO STRUCTURE ASSUMING THAT
  961. X** VALUES READ FROM THE KERNEL HAVE TYPE CADDR_T. THEREFORE, WE ARE
  962. X** MAKING THE DUBIOUS ASSUMPTION THAT INTS, POINTERS AND CADDR_T's
  963. X** HAVE IDENTICAL SIZES.
  964. X*/
  965. Xinitsymbols ()
  966. X{
  967. X    register struct nlist   *np ;
  968. X    register struct symbol  *s ;
  969. X    register struct nlist   *np0 ;
  970. X    char                    *filesymbol ;
  971. X    extern int              Flkmem ;
  972. X    extern struct flags     Flg ;
  973. X    extern struct symbol    Symbollist[] ;
  974. X    extern struct info      Info ;
  975. X    char                    *getcore() ;
  976. X    char                    *strncpy() ;
  977. X
  978. X    filesymbol = Flg.flg_s ? Flg.flg_s : FILE_SYMBOL ;
  979. X    /* Find the length of the symbol table */
  980. X    for ( s = Symbollist ; s->s_kname ; s++ )
  981. X        ;
  982. X    /* Construct an nlist structure by copying names from the symbol table*/
  983. X    np0 = (struct nlist*)getcore( (s-Symbollist+1)*sizeof( struct nlist ) );
  984. X    for ( s = Symbollist, np = np0 ; s->s_kname ; s++, np++ )
  985. X    {                                       
  986. X        np->n_name = s->s_kname ;       
  987. X        np[1].n_name = (char*)0 ;       
  988. X        np->n_value = 0 ;
  989. X    }
  990. X# ifdef BSD42
  991. X    if ( access( filesymbol, R_OK ) < 0 )
  992. X# else
  993. X    if ( access( filesymbol, 4 ) < 0 )
  994. X# endif
  995. X    {
  996. X        fprintf( stderr, "sps - Can't open symbol file %s", filesymbol);
  997. X        sysperror() ;
  998. X    }
  999. X    /* Get kernel addresses */
  1000. X    (void)nlist( filesymbol, np0 ) ;              
  1001. X    if ( np0[0].n_value == -1 )
  1002. X    {
  1003. X        fprintf( stderr, "sps - Can't read symbol file %s", filesymbol);
  1004. X        sysperror() ;
  1005. X    }
  1006. X    for ( s = Symbollist, np = np0 ; s->s_kname ; s++, np++ )
  1007. X    {                                       
  1008. X        if ( !np->n_value )             
  1009. X        {
  1010. X            fprintf( stderr, "sps - Can't find symbol %s in %s",
  1011. X                np->n_name, filesymbol ) ;
  1012. X            /* Assume this error to be unimportant if the address
  1013. X               is only associated with a process wait state.
  1014. X               This may happen if the system has been configured
  1015. X               without a particular device. */
  1016. X            fprintf( stderr, &Info.i_waitstate[ 0 ] <= s->s_info
  1017. X                && s->s_info < &Info.i_waitstate[ NWAITSTATE ]
  1018. X                ? " (error is not serious)\n"
  1019. X                : " (ERROR MAY BE SERIOUS)\n" ) ;
  1020. X            *s->s_info = (caddr_t)0 ;
  1021. X            continue ;
  1022. X        }
  1023. X        /* If no indirection is required, just copy the obtained value
  1024. X           into the `Info' structure. */
  1025. X        if ( !s->s_indirect )           
  1026. X        {                               
  1027. X        /* DUBIOUS ASSUMPTION THAT KMEM VALUE HAS SIZE OF A CADDR_T */
  1028. X            *s->s_info = (caddr_t)np->n_value ;
  1029. X            continue ;              
  1030. X        }                               
  1031. X        /* Otherwise one level of indirection is required. Using the
  1032. X           obtained address, look again in the kernel for the value */
  1033. X        memseek( Flkmem, (long)np->n_value ) ;
  1034. X        /* DUBIOUS ASSUMPTION THAT KMEM VALUE HAS SIZE OF A CADDR_T */
  1035. X        (void)read( Flkmem, (char*)s->s_info, sizeof(caddr_t) ) ;
  1036. X    }
  1037. X    free( (char*)np0 ) ;
  1038. X}
  1039. END_OF_initsymbols.c
  1040. if test 3000 -ne `wc -c <initsymbols.c`; then
  1041.     echo shar: \"initsymbols.c\" unpacked with wrong size!
  1042. fi
  1043. # end of overwriting check
  1044. fi
  1045. if test -f main.c -a "${1}" != "-c" ; then 
  1046.   echo shar: Will not over-write existing file \"main.c\"
  1047. else
  1048. echo shar: Extracting \"main.c\" \(3406 characters\)
  1049. sed "s/^X//" >main.c <<'END_OF_main.c'
  1050. X# include       "sps.h"
  1051. X# include       "flags.h"
  1052. X# include       <h/text.h>
  1053. X# include       <sys/stat.h>
  1054. X# include       <stdio.h>
  1055. X
  1056. X
  1057. X/* SPS - Show Process Status */
  1058. X/* J. R. Ward - Hasler AG Bern, CH - 24 May 1985 */
  1059. X/*                     26 Nov 1986 */
  1060. X
  1061. X/* <robert@hslrswi.uucp> */
  1062. X
  1063. Xmain ( argc,argv )
  1064. X
  1065. Xint                             argc ;
  1066. Xchar                            **argv ;
  1067. X
  1068. X{
  1069. X    register struct process *plist ;
  1070. X    register struct process *process ;
  1071. X    register struct text    *text ;
  1072. X    int                     flinfo ;
  1073. X    char            *fileinfo, *filesymbol ;
  1074. X    struct stat        sinfo, ssymbol, spasswd ;
  1075. X    extern struct flags     Flg ;
  1076. X    extern struct info      Info ;
  1077. X    extern int              Flmem ;
  1078. X    extern int              Flkmem ;
  1079. X    extern int              Flswap ;
  1080. X    char                    *getcore() ;
  1081. X    struct process          *needed(), *mktree() ;
  1082. X
  1083. X    /* Renice as fast as possible for root only (Suggested by Jeff Mogul,
  1084. X       gregorio!mogul) */
  1085. X    if ( !getuid() )
  1086. X        (void)nice( -40 ) ;
  1087. X    /* Decode the flag arguments */
  1088. X    flagdecode( argc, argv ) ;      
  1089. X    /* Determine the terminal width */
  1090. X    if ( !Flg.flg_w && !Flg.flg_N && !Flg.flg_i )
  1091. X        termwidth() ;
  1092. X    /* Open the cpu physical memory, kernel virtual memory and swap device*/
  1093. X    if ( Flg.flg_k )
  1094. X    {
  1095. X        Flmem = openfile( Flg.flg_k ) ;
  1096. X        Flkmem = Flmem ;
  1097. X    }
  1098. X    else
  1099. X    {
  1100. X        Flmem = openfile( FILE_MEM ) ;
  1101. X        Flkmem = openfile( FILE_KMEM ) ;
  1102. X        if ( !Flg.flg_o )
  1103. X            Flswap = openfile( FILE_SWAP ) ;
  1104. X    }
  1105. X    if ( Flg.flg_i )
  1106. X    {       /* -i flag for info file initialisation */
  1107. X        initialise() ;          
  1108. X        exit( 0 ) ;
  1109. X    }
  1110. X    /* Check that the information file is newer than the symbol and
  1111. X       password files, suggested by gregorio!mogul */
  1112. X    fileinfo = Flg.flg_j ? Flg.flg_j : FILE_INFO ;
  1113. X    filesymbol = Flg.flg_s ? Flg.flg_s : FILE_SYMBOL ;
  1114. X    flinfo = openfile( fileinfo ) ;
  1115. X    (void)fstat( flinfo, &sinfo ) ;
  1116. X    if ( !stat( filesymbol, &ssymbol ) &&
  1117. X        sinfo.st_mtime < ssymbol.st_mtime )
  1118. X        fprintf( stderr,
  1119. X           "sps - WARNING: Info file `%s' is older than symbol file `%s'\n",
  1120. X            fileinfo, filesymbol ) ;
  1121. X    if ( !stat( FILE_PASSWD, &spasswd ) &&
  1122. X        sinfo.st_mtime < spasswd.st_mtime )
  1123. X        fprintf( stderr,
  1124. X           "sps - WARNING: Info file `%s' is older than passwd file `%s'\n",
  1125. X            fileinfo, FILE_PASSWD ) ;
  1126. X    /* Read the information file */
  1127. X    if ( read( flinfo, (char*)&Info, sizeof( struct info ) )
  1128. X    != sizeof( struct info ) )
  1129. X    {
  1130. X        fprintf( stderr, "sps - Can't read info file `%s'", fileinfo ) ;
  1131. X        sysperror() ;
  1132. X    }
  1133. X    (void)close( flinfo ) ;
  1134. X    /* Find current tty status */
  1135. X    ttystatus() ;                   
  1136. X    /* Now that we know the available ttys, decode the flags */
  1137. X    flagsetup() ;                   
  1138. X    process = (struct process*)getcore(Info.i_nproc*sizeof(struct process));
  1139. X    text = (struct text*)getcore( Info.i_ntext * sizeof( struct text ) ) ;
  1140. X    do
  1141. X    {       /* Read current process and text status */
  1142. X        readstatus( process, text ) ;
  1143. X        /* Select those processes to be listed */
  1144. X        plist = needed( process, text ) ;
  1145. X        /* Form a tree of listed processes */
  1146. X        plist = mktree( process, plist ) ;
  1147. X        if ( !Flg.flg_N )
  1148. X        {       /* Print the processes */
  1149. X            prheader() ;
  1150. X            printall( plist, 0 ) ;
  1151. X        }
  1152. X        prsummary() ;
  1153. X        (void)fflush( stdout ) ;
  1154. X        if ( Flg.flg_r )        
  1155. X        {       /* If repeating, again get tty status */
  1156. X            ttystatus() ;
  1157. X            if ( Flg.flg_rdelay )
  1158. X# ifdef BSD42
  1159. X                sleep( Flg.flg_rdelay ) ;
  1160. X# else
  1161. X                sleep( (int)Flg.flg_rdelay ) ;
  1162. X# endif
  1163. X        }
  1164. X    } while ( Flg.flg_r ) ;
  1165. X    exit( 0 ) ;
  1166. X}
  1167. END_OF_main.c
  1168. if test 3406 -ne `wc -c <main.c`; then
  1169.     echo shar: \"main.c\" unpacked with wrong size!
  1170. fi
  1171. # end of overwriting check
  1172. fi
  1173. if test -f mktree.c -a "${1}" != "-c" ; then 
  1174.   echo shar: Will not over-write existing file \"mktree.c\"
  1175. else
  1176. echo shar: Extracting \"mktree.c\" \(1626 characters\)
  1177. sed "s/^X//" >mktree.c <<'END_OF_mktree.c'
  1178. X# include       "sps.h"
  1179. X
  1180. X/*
  1181. X** MKTREE - Sort the needed processes by subtree and at the top by user.
  1182. X** This procedure takes a list of processes (as returned by needed())
  1183. X** and returnes a pointer to a sorted list.
  1184. X*/
  1185. Xstruct process  *mktree ( process, plist )
  1186. X
  1187. Xstruct process                  *process ;
  1188. Xstruct process                  *plist ;
  1189. X
  1190. X{
  1191. X    register struct process *p ;
  1192. X    register struct process *pp ;
  1193. X    register struct process *lp ;
  1194. X    struct process          *op ;
  1195. X    struct process          proot ;
  1196. X
  1197. X    proot.pr_sibling = (struct process*)0 ;
  1198. X    for ( p = plist ; p ; p = p->pr_plink )
  1199. X    {
  1200. X        if ( p->pr_pptr > &process[1] )
  1201. X        {
  1202. X            for ( pp = plist ; pp ; pp = pp->pr_plink )
  1203. X            {
  1204. X                if ( pp != p->pr_pptr )
  1205. X                    continue ;
  1206. X                if ( lp = pp->pr_child )
  1207. X                {       /* Does process have children ? */
  1208. X                    op = (struct process*)0 ;
  1209. X                    while (lp &&
  1210. X                    lp->pr_p.p_pid < p->pr_p.p_pid )
  1211. X                    {
  1212. X                        op = lp ;
  1213. X                        lp=lp->pr_sibling ;
  1214. X                    }
  1215. X                    if ( op )
  1216. X                    {
  1217. X                        p->pr_sibling = lp ;
  1218. X                        op->pr_sibling = p ;
  1219. X                        break ;
  1220. X                    }
  1221. X                }       
  1222. X                p->pr_sibling = lp ;
  1223. X                pp->pr_child = p ;
  1224. X                break ;
  1225. X            }
  1226. X            if ( pp )
  1227. X                continue ;
  1228. X        }
  1229. X        /* We have a top level process, sort into top level list.
  1230. X           The top level is sorted firstly by user-id and then
  1231. X           by process-id. */
  1232. X        lp = &proot ;
  1233. X        pp = lp->pr_sibling ;
  1234. X        while ( pp )
  1235. X        {
  1236. X            if ( p->pr_p.p_uid < pp->pr_p.p_uid )
  1237. X                break ;
  1238. X            if ( p->pr_p.p_uid == pp->pr_p.p_uid
  1239. X            && p->pr_p.p_pid < pp->pr_p.p_pid )
  1240. X                break ;
  1241. X            lp = pp, pp = pp->pr_sibling ;
  1242. X        }
  1243. X        p->pr_sibling = lp->pr_sibling ;
  1244. X        lp->pr_sibling = p ;
  1245. X    }
  1246. X    return ( proot.pr_sibling ) ;
  1247. X}
  1248. END_OF_mktree.c
  1249. if test 1626 -ne `wc -c <mktree.c`; then
  1250.     echo shar: \"mktree.c\" unpacked with wrong size!
  1251. fi
  1252. # end of overwriting check
  1253. fi
  1254. if test -f openfiles.c -a "${1}" != "-c" ; then 
  1255.   echo shar: Will not over-write existing file \"openfiles.c\"
  1256. else
  1257. echo shar: Extracting \"openfiles.c\" \(2626 characters\)
  1258. sed "s/^X//" >openfiles.c <<'END_OF_openfiles.c'
  1259. X# include       <stdio.h>
  1260. X# include       "sps.h"
  1261. X# include       "flags.h"
  1262. X
  1263. X/* Miscellaneous procedures */
  1264. X
  1265. X/* OPENFILE - Opens the named file */
  1266. Xopenfile ( name )
  1267. X
  1268. Xchar                            *name ;
  1269. X
  1270. X{
  1271. X    register int            fd ;
  1272. X
  1273. X    if ( (fd = open( name, 0 )) >= 0 )
  1274. X        return ( fd ) ;
  1275. X    fprintf( stderr, "sps - Can't open %s", name ) ;
  1276. X    sysperror() ;
  1277. X    /* NOTREACHED */
  1278. X}
  1279. X
  1280. X/* MEMSEEK - Seek on a special file */
  1281. Xmemseek ( fd, pos )
  1282. X
  1283. Xint                             fd ;
  1284. Xlong                            pos ;
  1285. X
  1286. X{
  1287. X    extern int              errno ;
  1288. X    extern struct flags     Flg ;
  1289. X    long                    lseek() ;
  1290. X
  1291. X    errno = 0 ;
  1292. X    if ( Flg.flg_k )
  1293. X        pos &= 0x7fffffff ;
  1294. X    (void)lseek( fd, pos, 0 ) ;
  1295. X    if ( errno )
  1296. X    {
  1297. X        fprintf( stderr, "sps - Seek failed" ) ;
  1298. X        sysperror() ;
  1299. X    }
  1300. X}
  1301. X
  1302. X/* SWSEEK - Seek on the swap device */
  1303. Xswseek ( pos )
  1304. X
  1305. Xlong                            pos ;
  1306. X
  1307. X{
  1308. X    extern int              Flswap ;
  1309. X    extern int              errno ;
  1310. X    long                    lseek() ;
  1311. X
  1312. X    errno = 0 ;
  1313. X    (void)lseek( Flswap, pos, 0 ) ;
  1314. X    if ( errno )
  1315. X    {
  1316. X        fprintf( stderr, "sps - Seek failed" ) ;
  1317. X        sysperror() ;
  1318. X    }
  1319. X}
  1320. X
  1321. X# ifdef lint
  1322. Xint                             errno ;
  1323. Xint                             sys_nerr ;
  1324. Xchar                            *sys_errlist[] ;
  1325. X# endif
  1326. X
  1327. X/* SYSPERROR - Reports a system defined error msg and then exits gracefully */
  1328. Xsysperror ()
  1329. X{
  1330. X    extern int              errno ;
  1331. X    extern int              sys_nerr ;
  1332. X    extern char             *sys_errlist[] ;
  1333. X
  1334. X    if ( 0 < errno && errno < sys_nerr )
  1335. X        fprintf( stderr, " : %s", sys_errlist[errno] ) ;
  1336. X    (void)fputc( '\n', stderr ) ;
  1337. X    exit( 1 ) ;
  1338. X}
  1339. X
  1340. X/* STRSAVE - Store a string in core for later use. */
  1341. Xchar    *strsave ( cp )
  1342. X
  1343. Xregister char                   *cp ;
  1344. X
  1345. X{
  1346. X    register char           *chp ;
  1347. X    char                    *getcore(), *strcpy() ;
  1348. X
  1349. X    chp = getcore( strlen( cp ) + 1 ) ;
  1350. X    (void)strcpy( chp, cp ) ;
  1351. X    return ( chp ) ;
  1352. X}
  1353. X
  1354. X/* GETCORE - Allocate and return a pointer to the asked for amount of core */
  1355. Xchar    *getcore ( size )
  1356. X
  1357. Xregister int                    size ;
  1358. X
  1359. X{
  1360. X    register char           *chp ;
  1361. X    char                    *malloc() ;
  1362. X
  1363. X    if ( chp = malloc( (unsigned)size ) )
  1364. X        return ( chp ) ;
  1365. X    fprintf( stderr, "sps - Out of core" ) ;
  1366. X    sysperror() ;
  1367. X    /* NOTREACHED */
  1368. X}
  1369. X
  1370. Xunion flaglist  *getflgsp ( argc )
  1371. X
  1372. Xregister int                    argc ;
  1373. X
  1374. X{
  1375. X    char                    *getcore() ;
  1376. X
  1377. X    return ( (union flaglist*)getcore( sizeof( union flaglist )*argc ) ) ;
  1378. X}
  1379. X
  1380. X/* PREXIT - Print an error message and exit */
  1381. X/* VARARGS1 */
  1382. X/* ARGSUSED */
  1383. Xprexit ( fmt, args )
  1384. X
  1385. Xchar                            *fmt ;
  1386. X
  1387. X{
  1388. X    _doprnt( fmt, &args, stderr ) ;
  1389. X    exit( 1 ) ;
  1390. X}
  1391. END_OF_openfiles.c
  1392. if test 2626 -ne `wc -c <openfiles.c`; then
  1393.     echo shar: \"openfiles.c\" unpacked with wrong size!
  1394. fi
  1395. # end of overwriting check
  1396. fi
  1397. if test -f percentmem.c -a "${1}" != "-c" ; then 
  1398.   echo shar: Will not over-write existing file \"percentmem.c\"
  1399. else
  1400. echo shar: Extracting \"percentmem.c\" \(823 characters\)
  1401. sed "s/^X//" >percentmem.c <<'END_OF_percentmem.c'
  1402. X# include       "sps.h"
  1403. X# include       <h/text.h>
  1404. X# ifdef BSD42
  1405. X# include    <machine/pte.h>
  1406. X# else
  1407. X# include       <h/pte.h>
  1408. X# include       <h/vmparam.h>
  1409. X# endif
  1410. X# include       <h/vmmac.h>
  1411. X
  1412. X/* PERCENTMEM - Returns the percentage of real memory used by this process */
  1413. Xdouble  percentmem ( p )
  1414. X
  1415. Xregister struct process         *p ;
  1416. X
  1417. X{
  1418. X    register struct text    *tp ;
  1419. X    int                     szptudot ;
  1420. X    double                  fracmem ;
  1421. X    extern struct info      Info ;
  1422. X
  1423. X    tp = p->pr_p.p_textp ;
  1424. X    if ( !(p->pr_p.p_flag & SLOAD) || !tp )
  1425. X        return ( 0.0 ) ;
  1426. X    szptudot = UPAGES + clrnd( ctopt( p->pr_p.p_dsize + p->pr_p.p_ssize ) );
  1427. X    fracmem = ( (double)p->pr_p.p_rssize + szptudot ) / CLSIZE ;
  1428. X    if ( tp->x_ccount )
  1429. X        fracmem += ((double)tp->x_rssize)/CLSIZE/tp->x_ccount ;
  1430. X    return ( 100.0 * fracmem / (double)Info.i_ecmx ) ;
  1431. X}
  1432. END_OF_percentmem.c
  1433. if test 823 -ne `wc -c <percentmem.c`; then
  1434.     echo shar: \"percentmem.c\" unpacked with wrong size!
  1435. fi
  1436. # end of overwriting check
  1437. fi
  1438. if test -f prcmd.c -a "${1}" != "-c" ; then 
  1439.   echo shar: Will not over-write existing file \"prcmd.c\"
  1440. else
  1441. echo shar: Extracting \"prcmd.c\" \(709 characters\)
  1442. sed "s/^X//" >prcmd.c <<'END_OF_prcmd.c'
  1443. X# include       "sps.h"
  1444. X# include       "flags.h"
  1445. X
  1446. X/* PRCMD - Prints the command arguments according to the switches */
  1447. Xprcmd ( p, lpad, width )
  1448. X
  1449. Xregister struct process         *p ;
  1450. Xint                             lpad ;
  1451. Xint                             width ;
  1452. X
  1453. X{
  1454. X    extern struct flags     Flg ;
  1455. X    extern unsigned         Termwidth ;
  1456. X
  1457. X    printf( "%*d ", lpad, p->pr_p.p_pid ) ;
  1458. X    if ( Flg.flg_f )
  1459. X    {
  1460. X        printf( "%5d ", p->pr_p.p_ppid ) ;
  1461. X        width -= 6 ;
  1462. X    }
  1463. X    if ( Flg.flg_g )
  1464. X    {
  1465. X        printf( "%5d ", p->pr_p.p_pgrp ) ;
  1466. X        width -= 6 ;
  1467. X    }
  1468. X    width += Termwidth ;
  1469. X    if ( Flg.flg_w )
  1470. X        printf( "%s\n", p->pr_cmd ) ;
  1471. X    else if ( width > 0 )
  1472. X        printf( "%-.*s\n", width, p->pr_cmd ) ;
  1473. X    if ( p->pr_csaved )
  1474. X        free( p->pr_cmd ) ;
  1475. X}
  1476. END_OF_prcmd.c
  1477. if test 709 -ne `wc -c <prcmd.c`; then
  1478.     echo shar: \"prcmd.c\" unpacked with wrong size!
  1479. fi
  1480. # end of overwriting check
  1481. fi
  1482. if test -f prcpu.c -a "${1}" != "-c" ; then 
  1483.   echo shar: Will not over-write existing file \"prcpu.c\"
  1484. else
  1485. echo shar: Extracting \"prcpu.c\" \(1538 characters\)
  1486. sed "s/^X//" >prcpu.c <<'END_OF_prcpu.c'
  1487. X# include       "sps.h"
  1488. X
  1489. X# ifdef BSD42
  1490. X
  1491. X/* PRCPU - Print cpu time */
  1492. Xprcpu ( time, utime )
  1493. X
  1494. Xregister time_t                 time ;
  1495. Xtime_t                          utime ;
  1496. X
  1497. X{
  1498. X    time += utime / 1000000 ;
  1499. X    utime %= 1000000 ;
  1500. X    if ( time < 0L )
  1501. X    {       /* Ignore negative times */
  1502. X        printf( "     " ) ;     
  1503. X        return ;
  1504. X    }
  1505. X    if ( time < 60L*10L )
  1506. X    {       /* Print as seconds if less than 1000 seconds */
  1507. X        printf( "%3d.%1d", (int)time, (int)utime/100000 ) ;
  1508. X        return ;
  1509. X    }
  1510. X    /* Print as minutes if less than 10 hours ; print as hours if less than
  1511. X       10 days, else print as days. */
  1512. X    if ( time < 60L*60L*10L )               
  1513. X        printf( "%3D M", time/60L ) ;
  1514. X    else if ( time < 24L*60L*60L*10L )
  1515. X        printf( "%3D H", time/60L/60L ) ;
  1516. X    else
  1517. X        printf( "%3D D", time/60L/60L/24L ) ;
  1518. X}
  1519. X
  1520. X# else
  1521. X
  1522. X/* PRCPU - Print cpu time */
  1523. Xprcpu ( time )
  1524. X
  1525. Xregister time_t                 time ;
  1526. X
  1527. X{
  1528. X    extern struct info      Info ;
  1529. X
  1530. X    if ( time < 0L )
  1531. X    {       /* Ignore negative times */
  1532. X        printf( "     " ) ;     
  1533. X        return ;
  1534. X    }
  1535. X    if ( time < Info.i_hz*60L*10L )
  1536. X    {       /* Less than 10 minutes */
  1537. X        printf( "%3D.%1D", time/Info.i_hz,
  1538. X            (time % Info.i_hz / (Info.i_hz/10L)) ) ;
  1539. X        return ;
  1540. X    }
  1541. X    /* If less than 10 hours, print as minutes */
  1542. X    time /= Info.i_hz ;
  1543. X    /* Print as minutes if less than 10 hours ; print as hours if less than
  1544. X       10 days, else print as days. */
  1545. X    if ( time < 60L*60L*10L )               
  1546. X        printf( "%3D M", time/60L ) ;
  1547. X    else if ( time < 24L*60L*60L*10L )
  1548. X        printf( "%3D H", time/60L/60L ) ;
  1549. X    else
  1550. X        printf( "%3D D", time/60L/60L/24L ) ;
  1551. X}
  1552. X
  1553. X# endif
  1554. END_OF_prcpu.c
  1555. if test 1538 -ne `wc -c <prcpu.c`; then
  1556.     echo shar: \"prcpu.c\" unpacked with wrong size!
  1557. fi
  1558. # end of overwriting check
  1559. fi
  1560. if test -f prheader.c -a "${1}" != "-c" ; then 
  1561.   echo shar: Will not over-write existing file \"prheader.c\"
  1562. else
  1563. echo shar: Extracting \"prheader.c\" \(438 characters\)
  1564. sed "s/^X//" >prheader.c <<'END_OF_prheader.c'
  1565. X# include       "sps.h"
  1566. X# include       "flags.h"
  1567. X
  1568. X/* PRHEADER - Print a header according to the switches */
  1569. Xprheader ()
  1570. X{
  1571. X    extern struct flags     Flg ;
  1572. X
  1573. X    printf( "Ty User    %s Proc#", Flg.flg_v ?
  1574. X        " Status Fl Nice Virtual Resident %M  Time Child %C" :
  1575. X        Flg.flg_d ?
  1576. X        "  Files    PageFaults Swap BlockI/O Kbytsecs" : "" ) ;
  1577. X    if ( Flg.flg_f )
  1578. X        printf( " Ppid#" ) ;
  1579. X    if ( Flg.flg_g )
  1580. X        printf( " Pgrp#" ) ;
  1581. X    printf( " Command\n" ) ;
  1582. X}
  1583. END_OF_prheader.c
  1584. if test 438 -ne `wc -c <prheader.c`; then
  1585.     echo shar: \"prheader.c\" unpacked with wrong size!
  1586. fi
  1587. # end of overwriting check
  1588. fi
  1589. if test -f printall.c -a "${1}" != "-c" ; then 
  1590.   echo shar: Will not over-write existing file \"printall.c\"
  1591. else
  1592. echo shar: Extracting \"printall.c\" \(430 characters\)
  1593. sed "s/^X//" >printall.c <<'END_OF_printall.c'
  1594. X# include       <stdio.h>
  1595. X# include       "sps.h"
  1596. X
  1597. X/* PRINTALL - Recursively print the process tree. */
  1598. Xprintall ( p, md )
  1599. X
  1600. Xregister struct process         *p ;
  1601. Xregister int                    md ;
  1602. X
  1603. X{
  1604. X    while ( p )
  1605. X    {       /* Print this process */
  1606. X        printproc( p, md ) ;    
  1607. X        (void)fflush( stdout ) ;
  1608. X        /* Print child processes */
  1609. X        printall( p->pr_child, md+1 ) ;
  1610. X        /* Print brother processes */
  1611. X        p = p->pr_sibling ;     
  1612. X    }
  1613. X}
  1614. END_OF_printall.c
  1615. if test 430 -ne `wc -c <printall.c`; then
  1616.     echo shar: \"printall.c\" unpacked with wrong size!
  1617. fi
  1618. # end of overwriting check
  1619. fi
  1620. if test -f prsummary.c -a "${1}" != "-c" ; then 
  1621.   echo shar: Will not over-write existing file \"prsummary.c\"
  1622. else
  1623. echo shar: Extracting \"prsummary.c\" \(632 characters\)
  1624. sed "s/^X//" >prsummary.c <<'END_OF_prsummary.c'
  1625. X# include       "sps.h"
  1626. X
  1627. X/* PRSUMMARY - Print the summarising information */
  1628. Xprsummary ()
  1629. X{
  1630. X    extern struct summary   Summary ;
  1631. X
  1632. X    printf(
  1633. X"%D (%Dk) processes, %D (%Dk) busy, %D (%Dk) loaded, %D (%Dk) swapped\n",
  1634. X        Summary.sm_ntotal, KBYTES( Summary.sm_ktotal ),
  1635. X        Summary.sm_nbusy, KBYTES( Summary.sm_kbusy ),
  1636. X        Summary.sm_nloaded, KBYTES( Summary.sm_kloaded ),
  1637. X        Summary.sm_nswapped, KBYTES( Summary.sm_kswapped ) ) ;
  1638. X    Summary.sm_ntotal = 0L ;
  1639. X    Summary.sm_ktotal = 0L ;
  1640. X    Summary.sm_nbusy = 0L ;
  1641. X    Summary.sm_kbusy = 0L ;
  1642. X    Summary.sm_nloaded = 0L ;
  1643. X    Summary.sm_kloaded = 0L ;
  1644. X    Summary.sm_nswapped = 0L ;
  1645. X    Summary.sm_kswapped = 0L ;
  1646. X}
  1647. END_OF_prsummary.c
  1648. if test 632 -ne `wc -c <prsummary.c`; then
  1649.     echo shar: \"prsummary.c\" unpacked with wrong size!
  1650. fi
  1651. # end of overwriting check
  1652. fi
  1653. if test -f readstatus.c -a "${1}" != "-c" ; then 
  1654.   echo shar: Will not over-write existing file \"readstatus.c\"
  1655. else
  1656. echo shar: Extracting \"readstatus.c\" \(1170 characters\)
  1657. sed "s/^X//" >readstatus.c <<'END_OF_readstatus.c'
  1658. X# include       "sps.h"
  1659. X# include       <h/text.h>
  1660. X
  1661. X/* READSTATUS - Reads the kernel memory for current processes and texts */
  1662. Xreadstatus ( process, text )
  1663. X
  1664. Xregister struct process         *process ;
  1665. Xstruct text                     *text ;
  1666. X
  1667. X{
  1668. X    register struct proc    *p ;
  1669. X    register struct proc    *p0 ;
  1670. X    register struct process *pr ;
  1671. X    extern struct info      Info ;
  1672. X    extern int              Flkmem ;
  1673. X    char                    *getcore() ;
  1674. X
  1675. X    /* Read current text information */
  1676. X    memseek( Flkmem, (long)Info.i_text0 ) ;
  1677. X    if ( read( Flkmem, (char*)text, Info.i_ntext * sizeof( struct text ) )
  1678. X    != Info.i_ntext * sizeof( struct text ) )
  1679. X        prexit( "sps - Can't read system text table\n" ) ;
  1680. X    /* Read current process information */
  1681. X    p0 = (struct proc*)getcore( sizeof( struct proc )*Info.i_nproc ) ;
  1682. X    memseek( Flkmem, (long)Info.i_proc0 ) ;
  1683. X    if ( read( Flkmem, (char*)p0, Info.i_nproc * sizeof( struct proc ) )
  1684. X    != Info.i_nproc * sizeof( struct proc ) )
  1685. X        prexit( "sps - Can't read system process table\n" ) ;
  1686. X    /* Copy process information into our own array */
  1687. X    for ( p = p0, pr = process ; pr < &process[ Info.i_nproc ] ; p++, pr++ )
  1688. X        pr->pr_p = *p ;
  1689. X    free( (char*)p0 ) ;
  1690. X}
  1691. END_OF_readstatus.c
  1692. if test 1170 -ne `wc -c <readstatus.c`; then
  1693.     echo shar: \"readstatus.c\" unpacked with wrong size!
  1694. fi
  1695. # end of overwriting check
  1696. fi
  1697. if test -f selectproc.c -a "${1}" != "-c" ; then 
  1698.   echo shar: Will not over-write existing file \"selectproc.c\"
  1699. else
  1700. echo shar: Extracting \"selectproc.c\" \(1885 characters\)
  1701. sed "s/^X//" >selectproc.c <<'END_OF_selectproc.c'
  1702. X# include       "sps.h"
  1703. X# include       "flags.h"
  1704. X# ifdef USELOGINUID
  1705. X# include    <pwd.h>
  1706. X# endif USELOGINUID
  1707. X
  1708. X/*
  1709. X** SELECTPROC - Given a process structure, this procedure decides whether
  1710. X** the process is a candidate for printing.
  1711. X*/
  1712. Xselectproc ( p, process, thisuid )
  1713. X
  1714. Xregister struct process         *p ;            
  1715. Xregister struct process         *process ;      
  1716. Xint                thisuid ;
  1717. X
  1718. X{
  1719. X    register union flaglist *fp ;
  1720. X    register struct process *pp ;
  1721. X#ifdef USELOGINUID
  1722. X    char            *username ;
  1723. X    struct passwd        *pw ;
  1724. X    char            *getlogin() ;
  1725. X    struct passwd        *getpwnam() ;
  1726. X#endif USELOGINUID
  1727. X    extern struct flags     Flg ;
  1728. X
  1729. X    /* Flg.flg_AZ is an internal flag set if one of flags `A' to `Z'
  1730. X       was specified. If this is not set, a process is listed only
  1731. X       if it or one of its ancestors belongs to the invoking user. */
  1732. X    if ( !Flg.flg_AZ )
  1733. X    {
  1734. X#ifdef USELOGINUID
  1735. X        thisuid = (username = getlogin())
  1736. X            && (pw = getpwnam( username )) ? pw->pw_uid : getuid() ;
  1737. X#endif USELOGINUID
  1738. X        for ( pp = p ; pp > &process[1] ; pp = pp->pr_pptr )
  1739. X            if ( thisuid == pp->pr_p.p_uid )
  1740. X                return ( 1 ) ;
  1741. X    }
  1742. X    if ( Flg.flg_A )
  1743. X        return ( 1 ) ;
  1744. X    if ( Flg.flg_P )
  1745. X        for ( fp = Flg.flg_Plist ; fp->f_pid >= 0 ; fp++ )
  1746. X            if ( fp->f_pid == p->pr_p.p_pid )
  1747. X                return ( 1 ) ;
  1748. X    if ( Flg.flg_U )
  1749. X        for ( pp = p ; pp > &process[1] ; pp = pp->pr_pptr )
  1750. X            for ( fp = Flg.flg_Ulist ; fp->f_uid >= 0 ; fp++ )
  1751. X                if ( fp->f_uid == pp->pr_p.p_uid )
  1752. X                    return ( 1 ) ;
  1753. X    switch ( p->pr_p.p_stat )
  1754. X    {
  1755. X        case SRUN :
  1756. X            if ( Flg.flg_B )
  1757. X                return ( 1 ) ;
  1758. X            break ;
  1759. X        case SSLEEP :
  1760. X            if ( Flg.flg_B
  1761. X            &&   p->pr_p.p_pri < PZERO && p->pr_p.p_pid > MSPID )
  1762. X                return ( 1 ) ;
  1763. X        case SWAIT :
  1764. X        case SIDL :
  1765. X            if ( Flg.flg_W )
  1766. X                return ( 1 ) ;
  1767. X            break ;
  1768. X        case SSTOP :
  1769. X            if ( Flg.flg_S )
  1770. X                return ( 1 ) ;
  1771. X            break ;
  1772. X        case SZOMB :
  1773. X            if ( Flg.flg_Z )
  1774. X                return ( 1 ) ;
  1775. X            break ;
  1776. X        default :
  1777. X            break ;
  1778. X    }
  1779. X    return ( 0 ) ;
  1780. X}
  1781. END_OF_selectproc.c
  1782. if test 1885 -ne `wc -c <selectproc.c`; then
  1783.     echo shar: \"selectproc.c\" unpacked with wrong size!
  1784. fi
  1785. # end of overwriting check
  1786. fi
  1787. if test -f selecttty.c -a "${1}" != "-c" ; then 
  1788.   echo shar: Will not over-write existing file \"selecttty.c\"
  1789. else
  1790. echo shar: Extracting \"selecttty.c\" \(368 characters\)
  1791. sed "s/^X//" >selecttty.c <<'END_OF_selecttty.c'
  1792. X# include       "sps.h"
  1793. X# include       "flags.h"
  1794. X
  1795. X/* SELECTTTY - Decides whether this process is interesting for its tty */
  1796. Xselecttty ( p )
  1797. X
  1798. Xregister struct process         *p ;
  1799. X
  1800. X{
  1801. X    register union flaglist *fp ;
  1802. X    extern struct flags     Flg ;
  1803. X
  1804. X    for ( fp = Flg.flg_Tlist ; fp->f_ttyline ; fp++ )
  1805. X        if ( fp->f_ttyline == p->pr_tty )
  1806. X            return ( 1 ) ;
  1807. X    return ( 0 ) ;
  1808. X}
  1809. END_OF_selecttty.c
  1810. if test 368 -ne `wc -c <selecttty.c`; then
  1811.     echo shar: \"selecttty.c\" unpacked with wrong size!
  1812. fi
  1813. # end of overwriting check
  1814. fi
  1815. if test -f termwidth.c -a "${1}" != "-c" ; then 
  1816.   echo shar: Will not over-write existing file \"termwidth.c\"
  1817. else
  1818. echo shar: Extracting \"termwidth.c\" \(691 characters\)
  1819. sed "s/^X//" >termwidth.c <<'END_OF_termwidth.c'
  1820. X#include    <sys/ioctl.h>
  1821. X
  1822. X/*
  1823. X** TERMWIDTH - Sets the external variable `Termwidth' to the # of columns
  1824. X** on the terminal.
  1825. X*/
  1826. Xtermwidth ()
  1827. X{
  1828. X    register char           *termtype ;
  1829. X    register int            twidth ;
  1830. X#ifdef TIOCGWINSZ
  1831. X    struct winsize        w ;
  1832. X#endif
  1833. X    char                    buf[ 1025 ] ;
  1834. X    extern unsigned         Termwidth ;
  1835. X    char                    *getenv() ;
  1836. X
  1837. X#ifdef TIOCGWINSZ
  1838. X    w.ws_col = 0 ;
  1839. X    if ( !ioctl( 0, TIOCGWINSZ, &w ) && w.ws_col )
  1840. X    {
  1841. X        Termwidth = w.ws_col ;
  1842. X        return ;
  1843. X    }
  1844. X#endif
  1845. X    Termwidth = 80 ;
  1846. X    if ( !(termtype = getenv( "TERM" )) )
  1847. X        return ;
  1848. X    if ( tgetent( buf, termtype ) != 1 )
  1849. X        return ;
  1850. X    twidth = tgetnum( "co" ) ;
  1851. X    if ( twidth > 40 )
  1852. X        Termwidth = twidth ;
  1853. X}
  1854. END_OF_termwidth.c
  1855. if test 691 -ne `wc -c <termwidth.c`; then
  1856.     echo shar: \"termwidth.c\" unpacked with wrong size!
  1857. fi
  1858. # end of overwriting check
  1859. fi
  1860. if test -f ttystatus.c -a "${1}" != "-c" ; then 
  1861.   echo shar: Will not over-write existing file \"ttystatus.c\"
  1862. else
  1863. echo shar: Extracting \"ttystatus.c\" \(2911 characters\)
  1864. sed "s/^X//" >ttystatus.c <<'END_OF_ttystatus.c'
  1865. X# include       "sps.h"
  1866. X# include       "flags.h"
  1867. X# include       <stdio.h>
  1868. X# include       <h/ioctl.h>
  1869. X# include       <h/tty.h>
  1870. X# ifdef CHAOS
  1871. X# include       <chunix/chsys.h>
  1872. X# include       <chaos/chaos.h>
  1873. X# endif
  1874. X
  1875. X/*
  1876. X** TTYSTATUS - Reads the kernel memory for tty structures of active processes.
  1877. X** The addresses of the associated struct ttys of /dev/kmem are kept in the
  1878. X** info structure. Here we use those addresses to access the structures.
  1879. X** Actually, we are mostly interested just in the process group of each tty.
  1880. X*/
  1881. Xttystatus ()
  1882. X{
  1883. X    register struct ttyline *lp ;
  1884. X    struct tty              tty ;
  1885. X    extern struct flags     Flg ;
  1886. X    extern struct info      Info ;
  1887. X    extern int              Flkmem ;
  1888. X
  1889. X    if ( Flg.flg_y )
  1890. X        printf( "Ty   Dev       Addr Rawq Canq Outq  Pgrp\n" ) ;
  1891. X    lp = Info.i_ttyline ;
  1892. X# ifdef CHAOS
  1893. X    while ( lp->l_name[0] && lp->l_name[0] != 'C' )
  1894. X# else
  1895. X    while ( lp->l_name[0] )
  1896. X# endif
  1897. X    {
  1898. X        memseek( Flkmem, (long)lp->l_addr ) ;
  1899. X        if ( read( Flkmem, (char*)&tty, sizeof( struct tty ) )
  1900. X        != sizeof( struct tty ) )
  1901. X        {
  1902. X            fprintf( stderr,
  1903. X                "sps - Can't read struct tty for tty%.2s\n",
  1904. X                lp->l_name ) ;
  1905. X            lp->l_pgrp = 0 ;
  1906. X            lp++ ;
  1907. X            continue ;
  1908. X        }
  1909. X        lp->l_pgrp = tty.t_pgrp ;
  1910. X        prtty( lp, &tty ) ;
  1911. X        lp++ ;
  1912. X    }
  1913. X# ifdef CHAOS
  1914. X    chaosttys( lp ) ;               
  1915. X# endif
  1916. X}
  1917. X
  1918. X/* PRTTY - Print out the tty structure */
  1919. Xprtty ( lp, tty )
  1920. X
  1921. Xregister struct ttyline         *lp ;
  1922. Xregister struct tty             *tty ;
  1923. X
  1924. X{
  1925. X    extern struct flags     Flg ;
  1926. X
  1927. X    if ( !Flg.flg_y )
  1928. X        return ;
  1929. X    printf( "%-2.2s %2d,%2d 0x%08x %4d %4d %4d %5d\n",
  1930. X        lp->l_name,
  1931. X        major( lp->l_dev ),
  1932. X        minor( lp->l_dev ),
  1933. X        lp->l_addr,
  1934. X        tty->t_rawq.c_cc,
  1935. X        tty->t_canq.c_cc,
  1936. X        tty->t_outq.c_cc,
  1937. X        tty->t_pgrp ) ;
  1938. X}
  1939. X
  1940. X# ifdef CHAOS
  1941. X
  1942. X/* CHAOSTTYS - Finds ttys attached to the Chaos net */
  1943. Xchaosttys ( lp )
  1944. X
  1945. Xregister struct ttyline         *lp ;
  1946. X
  1947. X{
  1948. X    register struct connection      **cnp ;
  1949. X    register int                    i ;
  1950. X    struct tty                      tty ;
  1951. X    struct connection               *conntab[CHNCONNS] ;
  1952. X    struct connection               conn ;
  1953. X    extern struct info              Info ;
  1954. X    extern int                      Flkmem ;
  1955. X
  1956. X    memseek( Flkmem, (long)Info.i_Chconntab ) ;
  1957. X    (void)read( Flkmem, (char*)conntab, sizeof( conntab ) ) ;
  1958. X    for ( i = 0, cnp = conntab ; cnp < &conntab[CHNCONNS] ; i++, cnp++ )
  1959. X    {
  1960. X        if ( !*cnp )
  1961. X            continue ;
  1962. X        memseek( Flkmem, (long)*cnp ) ;
  1963. X        (void)read( Flkmem, (char*)&conn, sizeof( struct connection ) );
  1964. X        if ( !(conn.cn_flags & CHTTY) )
  1965. X            continue ;
  1966. X        memseek( Flkmem, (long)conn.cn_ttyp ) ;
  1967. X        (void)read( Flkmem, (char*)&tty, sizeof( struct tty ) ) ;
  1968. X        if ( lp >= &Info.i_ttyline[MAXTTYS] )
  1969. X            prexit( "sps - Too many chaos ttys\n" ) ;
  1970. X        lp->l_addr = conn.cn_ttyp ;
  1971. X        lp->l_pgrp = tty.t_pgrp ;
  1972. X        lp->l_dev = tty.t_dev ;
  1973. X        lp->l_name[0] = 'C' ;
  1974. X        lp->l_name[1] = i < 10 ? '0'+i : i-10 <= 'z'-'a' ? i-10+'a' :
  1975. X                i-10-('z'-'a')+'A' ;
  1976. X        prtty( lp, &tty ) ;
  1977. X        lp++ ;
  1978. X    }
  1979. X}
  1980. X
  1981. X# endif
  1982. END_OF_ttystatus.c
  1983. if test 2911 -ne `wc -c <ttystatus.c`; then
  1984.     echo shar: \"ttystatus.c\" unpacked with wrong size!
  1985. fi
  1986. # end of overwriting check
  1987. fi
  1988. echo shar: End of archive 1 \(of 3\).
  1989. cp /dev/null ark1isdone
  1990. MISSING=""
  1991. for I in 1 2 3 ; do
  1992.     if test ! -f ark${I}isdone ; then
  1993.     MISSING="${MISSING} ${I}"
  1994.     fi
  1995. done
  1996. if test "${MISSING}" = "" ; then
  1997.     echo You have unpacked all 3 archives.
  1998.     rm -f ark[1-9]isdone
  1999. else
  2000.     echo You still need to unpack the following archives:
  2001.     echo "        " ${MISSING}
  2002. fi
  2003. ##  End of shell archive.
  2004. exit 0
  2005. -- 
  2006.  
  2007. Rich $alz            "Anger is an energy"
  2008. Cronus Project, BBN Labs    rsalz@bbn.com
  2009. Moderator, comp.sources.unix    sources@uunet.uu.net
  2010.