home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume13 / u386mon / part02 < prev    next >
Text File  |  1990-07-02  |  56KB  |  2,159 lines

  1. Newsgroups: comp.sources.misc
  2. subject: v13i100: u386mon 1.10 (SCO&ISC UNIX monitor) part 02/04
  3. From: wht@gatech.edu@n4hgf.UUCP (Warren Tucker)
  4. Sender: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  5.  
  6. Posting-number: Volume 13, Issue 100
  7. Submitted-by: wht@gatech.edu@n4hgf.UUCP (Warren Tucker)
  8. Archive-name: u386mon/part02
  9.  
  10. #!/bin/sh
  11. # This is part 02 of u386mon.1.10
  12. if touch 2>&1 | fgrep 'mmdd' > /dev/null
  13.  then TOUCH=touch
  14.  else TOUCH=true
  15. fi
  16. # ============= det_proc.c ==============
  17. echo "x - extracting det_proc.c (Text)"
  18. sed 's/^X//' << 'SHAR_EOF' > det_proc.c &&
  19. X/* CHK=0xC5D1 */
  20. X/*+-------------------------------------------------------------------------
  21. X    det_proc.c - UNIX V/386 system monitor proc status detail
  22. X    ...!emory!n4hgf!wht
  23. X
  24. X  Defined functions:
  25. X    display_proc_stat(win,iproc,initial)
  26. X    display_proc_stats(win,initial)
  27. X    find_utmp_for_pgrp(pgrp)
  28. X    get_cpu_time_str(ticks)
  29. X    get_user(tproc,tuser)
  30. X    getpwent_and_enter(uid)
  31. X    init_uid_name_hash()
  32. X    pgrp_to_ttyname(pgrp)
  33. X    proc_pid_compare(p1,p2)
  34. X    read_and_sort_procs(initial)
  35. X    read_utmp()
  36. X    uid_name_enter(uid,name)
  37. X    uid_to_name(uid)
  38. X
  39. X--------------------------------------------------------------------------*/
  40. X/*+:EDITS:*/
  41. X/*:06-27-1990-01:57-wht@n4hgf-1.10 - incorporate suggestions from alpha testers */
  42. X/*:06-25-1990-04:14-wht@n4hgf-1.02-better error handling */
  43. X/*:06-24-1990-20:53-wht@n4hgf-v1.01-add ISC support thanks to peter@radig.de */
  44. X/*:06-21-1990-14:26-r@n4hgf-version x0.12 seems bug free */
  45. X/*:01-05-1989-13:27-wht-creation */
  46. X
  47. X#define M_TERMINFO
  48. X
  49. X#include <curses.h>
  50. X#include <panel.h>
  51. X#include <signal.h>
  52. X#include <string.h>
  53. X#include <fcntl.h>
  54. X#include <nlist.h>
  55. X#include <errno.h>
  56. X#include <time.h>
  57. X#include <pwd.h>
  58. X#include <sys/types.h>
  59. X#include <utmp.h>
  60. X#include <sys/stat.h>
  61. X#include <sys/ascii.h>
  62. X#undef NGROUPS_MAX
  63. X#undef NULL
  64. X#include <sys/param.h>
  65. X#include <sys/bootinfo.h>
  66. X#include <sys/tuneable.h>
  67. X#include <sys/sysinfo.h>
  68. X#include <sys/sysmacros.h>
  69. X#include <sys/immu.h>
  70. X#include <sys/region.h>
  71. X#include <sys/proc.h>
  72. X#include <sys/fs/s5dir.h>
  73. X#include <sys/user.h>
  74. X#include <sys/var.h>
  75. X
  76. X#include "nlsym.h"
  77. X#include "libkmem.h"
  78. X#include "libmem.h"
  79. X#include "libswap.h"
  80. X#include "libnlsym.h"
  81. X#include "u386mon.h"
  82. X
  83. Xextern int errno;
  84. X
  85. Xextern int nprocs;
  86. Xextern struct var v;
  87. Xextern struct proc *procs;
  88. Xextern struct proc *oldprocs;
  89. X
  90. Xint mypid;
  91. Xint noldprocs = 0;
  92. Xint nprocs = 0;
  93. Xint max_procs_to_display;
  94. X
  95. Xstruct user user;
  96. X
  97. X#define min(a,b) (((a) > (b)) ? (b) : (a))
  98. X
  99. X#define p_slotnum    p_whystop    /* reuse a field we dont look at */
  100. X
  101. X#define MAX_UTMP 64
  102. Xint nutmps = 0;
  103. Xstruct utmp utmps[MAX_UTMP];
  104. X
  105. X/*+-------------------------------------------------------------------------
  106. X    proc_pid_compare(p1,p2)
  107. X--------------------------------------------------------------------------*/
  108. Xproc_pid_compare(p1,p2)
  109. Xstruct proc *p1;
  110. Xstruct proc *p2;
  111. X{
  112. X    return(p1->p_pid - p2->p_pid);
  113. X}    /* end of proc_pid_compare */
  114. X
  115. X/*+-------------------------------------------------------------------------
  116. X    read_and_sort_procs(initial)
  117. X--------------------------------------------------------------------------*/
  118. Xvoid
  119. Xread_and_sort_procs(initial)
  120. Xint initial;
  121. X{
  122. Xregister int iproc;
  123. Xregister char *cptr;
  124. Xstruct proc *tproc;
  125. X
  126. X    disp_msg(cpINFO,"");
  127. X    if(!initial)
  128. X    {
  129. X        (void)memcpy((char *)oldprocs,
  130. X            (char *)procs,v.v_proc * sizeof(struct proc));
  131. X        noldprocs = nprocs;
  132. X    }
  133. X
  134. X/* read current procs */
  135. X    grok_proc();
  136. X
  137. X/* if slot not in use, force to end when sorting */
  138. X    nprocs = 0;
  139. X    for(iproc = 0; iproc < v.v_proc; iproc++)
  140. X    {
  141. X        tproc = procs + iproc;
  142. X        tproc->p_slotnum = iproc;        /* save slot number */
  143. X        if(    (tproc->p_stat == 0) ||        /* if slot not in use, ... */
  144. X            (tproc->p_pid == 1)  ||        /* ... or proc is init, ... */
  145. X            (tproc->p_flag & SSYS))        /* ... or proc is system process */
  146. X        {                            /* eliminate from consideration */
  147. X            tproc->p_pid = 32767;    /* force below selected procs in qsort */
  148. X            continue;
  149. X        }
  150. X        nprocs++;
  151. X    }
  152. X
  153. X/* if too many procs, whittle down */
  154. X    if(nprocs > max_procs_to_display)
  155. X    {
  156. X        nprocs = 0;
  157. X        for(iproc = 0; iproc < v.v_proc; iproc++)
  158. X        {
  159. X            tproc = procs + iproc;
  160. X            if(tproc->p_pid == 32767)    /* previously eliminated? */
  161. X                continue;
  162. X            else if(get_user(tproc,&user))
  163. X            {
  164. X                if( !strcmp(cptr = user.u_comm,"csh") ||
  165. X                    !strcmp(cptr,"sh")        ||
  166. X                    !strcmp(cptr,"ksh")        ||
  167. X                    !strcmp(cptr,"getty")    ||
  168. X                    !strcmp(cptr,"uugetty")        )
  169. X                {
  170. X                    tproc->p_pid = 32767;
  171. X                    continue;
  172. X                }
  173. X            }
  174. X            nprocs++;
  175. X        }
  176. X        disp_msg(cpLIT,"shells and gettys not displayed");
  177. X    }
  178. X
  179. X/* if still too many procs, whittle swapped */
  180. X    if(nprocs > max_procs_to_display)
  181. X    {
  182. X        nprocs = 0;
  183. X        for(iproc = 0; iproc < v.v_proc; iproc++)
  184. X        {
  185. X            tproc = procs + iproc;
  186. X            if(tproc->p_pid == 32767)    /* previously eliminated? */
  187. X                continue;
  188. X            else if((!(tproc->p_flag & SLOAD) && (tproc->p_stat != SRUN)) ||
  189. X                (tproc->p_stat == SZOMB))
  190. X            {
  191. X                tproc->p_pid = 32767;
  192. X                continue;
  193. X            }
  194. X            nprocs++;
  195. X        }
  196. X        disp_msg(cpLIT,"shells, gettys and swapped/zombie procs not displayed");
  197. X    }
  198. X/* if still too many procs, whittle hard */
  199. X    if(nprocs > max_procs_to_display)
  200. X    {
  201. X        nprocs = 0;
  202. X        for(iproc = 0; iproc < v.v_proc; iproc++)
  203. X        {
  204. X            tproc = procs + iproc;
  205. X            if(tproc->p_pid == 32767)    /* previously eliminated? */
  206. X                continue;
  207. X            else if(tproc->p_stat == SSLEEP)
  208. X            {
  209. X                tproc->p_pid = 32767;
  210. X                continue;
  211. X            }
  212. X            nprocs++;
  213. X        }
  214. X        disp_msg(cpLIT,
  215. X            "shells, gettys and swapped/zombie/sleeping procs not displayed");
  216. X    }
  217. X
  218. X    if(nprocs > max_procs_to_display)
  219. X        disp_msg(cpMED,"display size too small for all processes");
  220. X
  221. X/* sort new procs array */
  222. X    (void)qsort((char *)procs,(unsigned)v.v_proc,
  223. X        sizeof(struct proc),proc_pid_compare);
  224. X
  225. X    if(initial)
  226. X    {
  227. X        (void)memcpy((char *)oldprocs,(char *)procs,
  228. X            v.v_proc * sizeof(struct proc));
  229. X        noldprocs = nprocs;
  230. X    }
  231. X
  232. X}    /* end of read_and_sort_procs */
  233. X
  234. X/*+-------------------------------------------------------------------------
  235. X    read_utmp()
  236. X--------------------------------------------------------------------------*/
  237. Xvoid
  238. Xread_utmp()
  239. X{
  240. Xint utmpfd;
  241. Xregister struct utmp *tutmp = utmps;
  242. X
  243. X    nutmps = 0;
  244. X    if((utmpfd = open("/etc/utmp",O_RDONLY,755)) < 0)
  245. X        leave_text("/etc/utmp open error",255);
  246. X
  247. X    while(read(utmpfd,(char *)(tutmp++),sizeof(struct utmp)) > 0)
  248. X    {
  249. X        /* ensure null termination
  250. X         * (clobbers 1st byte of ut_line, but we don't use it)
  251. X         */
  252. X        tutmp->ut_id[sizeof(tutmp->ut_id)] = 0;
  253. X        if(++nutmps == MAX_UTMP)
  254. X            leave_text("too many utmp entries for me to handle",1);
  255. X    }
  256. X    (void)close(utmpfd);
  257. X}    /* end of read_utmp */
  258. X
  259. X/*+-------------------------------------------------------------------------
  260. X    find_utmp_for_pgrp(pgrp)
  261. X--------------------------------------------------------------------------*/
  262. Xstruct utmp *
  263. Xfind_utmp_for_pgrp(pgrp)
  264. Xint pgrp;
  265. X{
  266. Xstruct utmp *tutmp = utmps;
  267. Xregister int count = nutmps;
  268. X
  269. X    while(count--)
  270. X    {
  271. X        if(tutmp->ut_pid == pgrp)
  272. X            return(tutmp);
  273. X        tutmp++;
  274. X    }
  275. X    return((struct utmp *)0);
  276. X}    /* end of find_utmp_for_pgrp */
  277. X
  278. X/*+-------------------------------------------------------------------------
  279. X    pgrp_to_ttyname(pgrp)
  280. X--------------------------------------------------------------------------*/
  281. Xchar *
  282. Xpgrp_to_ttyname(pgrp)
  283. Xint pgrp;
  284. X{
  285. Xregister itmp;
  286. Xstruct utmp *tutmp;
  287. X
  288. X    if(!(tutmp = find_utmp_for_pgrp(pgrp)))
  289. X    {
  290. X        read_utmp();
  291. X        tutmp = find_utmp_for_pgrp(pgrp);
  292. X    }
  293. X    if(!tutmp)
  294. X        return("??");
  295. X    else
  296. X    {
  297. X        itmp = strlen(tutmp->ut_id);
  298. X        return(&tutmp->ut_id[(itmp >= 2) ? (itmp - 2) : 0]);
  299. X    }
  300. X}    /* end of pgrp_to_ttyname */
  301. X
  302. X/*+-------------------------------------------------------------------------
  303. X    get_user(tproc,tuser)
  304. X--------------------------------------------------------------------------*/
  305. Xget_user(tproc,tuser)
  306. Xstruct proc *tproc;
  307. Xstruct user *tuser;
  308. X{
  309. X    register caddr_t uptr = (caddr_t)tuser;
  310. X    register int ubrdcount = sizeof(struct user);
  311. X    int ipde;
  312. X    paddr_t mptr;
  313. X
  314. X    if(tproc->p_flag & SULOAD)
  315. X    {
  316. X        for(ipde = 0; ipde < tproc->p_usize; ipde++)
  317. X        {
  318. X            if(!tproc->p_ubptbl[ipde].pgm.pg_pres)    /* if not resident */
  319. X                return(0);
  320. X            mptr = tproc->p_ubptbl[ipde].pgm.pg_pfn * NBPP;
  321. X            mread(uptr,(daddr_t)mptr,min(ubrdcount,NBPP));
  322. X            uptr += NBPP;
  323. X            if((ubrdcount -= NBPP) <= 0)
  324. X                break;
  325. X        }
  326. X    }
  327. X    else
  328. X    {
  329. X        mptr = tproc->p_ubdbd.dbd_blkno * NBPSCTR;
  330. X        sread(uptr,mptr,ubrdcount);
  331. X    }
  332. X    /*
  333. X     * we can get crap from swap if things change after we get
  334. X     * an address to read from, so validate user as best we can
  335. X     */
  336. X    return((tuser->u_ruid == tproc->p_uid) ||    /* validate it */
  337. X            (tuser->u_ruid == tproc->p_suid));
  338. X
  339. X}    /* end of get_user */
  340. X
  341. X/*+-------------------------------------------------------------------------
  342. Xuid to username conversion; thanks for the idea to William LeFebvre
  343. X--------------------------------------------------------------------------*/
  344. X#define UID_NAME_HASH_SIZE    127    /* prime */
  345. X#define HASH_EMPTY            -1
  346. X#define HASHIT(i)            ((i) % UID_NAME_HASH_SIZE)
  347. X
  348. Xstruct uid_name_hash_entry {
  349. X    int  uid;
  350. X    char name[10];
  351. X};
  352. X
  353. Xstruct uid_name_hash_entry uid_name_table[UID_NAME_HASH_SIZE];
  354. Xint uid_count = 0;
  355. X
  356. X/*+-------------------------------------------------------------------------
  357. X    init_uid_name_hash()
  358. X--------------------------------------------------------------------------*/
  359. Xvoid
  360. Xinit_uid_name_hash()
  361. X{
  362. Xregister int ihash = 0;
  363. Xregister struct uid_name_hash_entry *hashent = uid_name_table;
  364. X
  365. X    while(ihash++ < UID_NAME_HASH_SIZE)
  366. X    {
  367. X        hashent->uid = HASH_EMPTY;
  368. X        hashent++;
  369. X    }
  370. X}    /* end of init_uid_name_hash */
  371. X
  372. X/*+-------------------------------------------------------------------------
  373. X    uid_name_enter(uid,name)
  374. X--------------------------------------------------------------------------*/
  375. Xint
  376. Xuid_name_enter(uid,name)
  377. Xregister int uid;
  378. Xregister char *name;
  379. X{
  380. Xregister int table_uid;
  381. Xregister int hashval;
  382. X
  383. X    if(++uid_count >= UID_NAME_HASH_SIZE - 1)
  384. X        leave_text("too many user names for me to handle",1);
  385. X
  386. X    hashval = HASHIT(uid);
  387. X    while((table_uid = uid_name_table[hashval].uid) != HASH_EMPTY)
  388. X    {
  389. X        if(table_uid == uid)
  390. X            return(hashval);
  391. X        hashval = (hashval + 1) % UID_NAME_HASH_SIZE;
  392. X    }
  393. X
  394. X    uid_name_table[hashval].uid = uid;
  395. X    (void)strncpy(uid_name_table[hashval].name,name,
  396. X        sizeof(uid_name_table[0].name));
  397. X
  398. X    return(hashval);
  399. X
  400. X}    /* end of uid_name_enter */
  401. X
  402. X/*+-------------------------------------------------------------------------
  403. X    getpwent_and_enter(uid)
  404. X--------------------------------------------------------------------------*/
  405. Xgetpwent_and_enter(uid)
  406. Xregister int uid;
  407. X{
  408. Xregister int hashval;
  409. Xregister struct passwd *pwd;
  410. Xchar errant[10];
  411. Xstruct passwd *getpwuid();
  412. X
  413. X    pwd = getpwuid(uid);
  414. X    endpwent();
  415. X    if(pwd)
  416. X    {
  417. X        hashval = uid_name_enter(pwd->pw_uid,pwd->pw_name);
  418. X        return(hashval);
  419. X    }
  420. X    (void)sprintf(errant,"%d",uid);
  421. X    return(uid_name_enter(uid,errant));
  422. X}    /* end of getpwent_and_enter */
  423. X
  424. X/*+-------------------------------------------------------------------------
  425. X    uid_to_name(uid)
  426. X--------------------------------------------------------------------------*/
  427. Xchar *
  428. Xuid_to_name(uid)
  429. Xregister int uid;
  430. X{
  431. Xregister int uid_hash;
  432. Xregister int table_uid;
  433. X
  434. X    uid_hash = HASHIT(uid);
  435. X    while((table_uid = uid_name_table[uid_hash].uid) != uid)
  436. X    {
  437. X        if(table_uid == HASH_EMPTY)
  438. X        {
  439. X            /* not in hash table */
  440. X            uid_hash = getpwent_and_enter(uid);
  441. X            break;        /* out of while */
  442. X        }
  443. X        uid_hash = (uid_hash + 1) % UID_NAME_HASH_SIZE;
  444. X    }
  445. X    return(uid_name_table[uid_hash].name);
  446. X}    /* end of char *uid_to_name */
  447. X
  448. X/*+-----------------------------------------------------------------------
  449. X    char *get_cpu_time_str(ticks)
  450. X  6-char static string address is returned
  451. X------------------------------------------------------------------------*/
  452. Xchar *
  453. Xget_cpu_time_str(ticks)
  454. Xtime_t ticks;
  455. X{
  456. Xstatic char timestr[10];
  457. Xtime_t mm,ss;
  458. Xextern int hz;
  459. X
  460. X    ticks /= hz;
  461. X    mm = ticks / 60L;
  462. X    ticks -= mm * 60L;
  463. X    ss = ticks;
  464. X
  465. X    if(mm > 9999)
  466. X        (void)strcpy(timestr,">9999m");
  467. X    else if(mm > 999)
  468. X        (void)sprintf(timestr,"%5ldm",mm);
  469. X    else
  470. X        (void)sprintf(timestr,"%3lu:%02lu",mm,ss);
  471. X
  472. X    return(timestr);
  473. X
  474. X}    /* end of get_cpu_time_str */
  475. X
  476. X#define PROC_Y        1
  477. X#define PROC_X        0
  478. X#define UID_X        2
  479. X#define PID_X        12
  480. X#define CPU_X        18
  481. X#define PRI_X        22
  482. X#define NICE_X        26
  483. X#define UTIME_X        29
  484. X#define STIME_X        36
  485. X#define SIZE_X        43
  486. X#define TTY_X        48
  487. X#define CMD_X        52
  488. X
  489. X/*+-------------------------------------------------------------------------
  490. X    display_proc_stat(win,iproc,initial)
  491. X00000000001111111111222222222233333333334444444444555555555566666666667777777777
  492. X01234567890123456789012345678901234567890123456789012345678901234567890123456789
  493. XS     USER   PID  CPU PRI NI  UCPU   SCPU  SIZE TTY CMD
  494. X#!########X ##### ### ### ## ###### ###### #### ### ########
  495. X--------------------------------------------------------------------------*/
  496. Xvoid
  497. Xdisplay_proc_stat(win,iproc,initial)
  498. XWINDOW *win;
  499. Xregister int iproc;
  500. Xregister int initial;
  501. X{
  502. Xregister int positioned = 0;
  503. Xregister struct proc *tproc = procs + iproc;
  504. Xstruct proc *oproc = oldprocs + iproc;
  505. Xint got_user;
  506. Xstatic char *p_stat_str = " sRzdipx";    /* dependent on values of SSLEEP etc */
  507. Xchar buf[20];
  508. X
  509. X    use_cp(win,cpINFO);
  510. X    if((tproc->p_stat == SRUN) && !(tproc->p_flag & SLOAD))
  511. X        use_cp(win,cpHIGH);
  512. X    else if((tproc->p_stat == SRUN) || (oproc->p_stat == SRUN))
  513. X        use_cp(win,cpMED);
  514. X    if(tproc->p_pid != tproc->p_pid)
  515. X        initial = 1;
  516. X
  517. X    wmove(win,PROC_Y + iproc,PROC_X);
  518. X    waddch(win,(chtype)p_stat_str[tproc->p_stat]);
  519. X    waddch(win,(tproc->p_flag & SLOAD) ? (chtype)' ' : (chtype)'S');
  520. X    positioned = 1;
  521. X
  522. X    if(initial)
  523. X    {
  524. X        if(!positioned)
  525. X            wmove(win,PROC_Y + iproc,PROC_X + UID_X);
  526. X        (void)sprintf(buf,"%8s",uid_to_name(tproc->p_uid));
  527. X        waddstr(win,buf);
  528. X        waddch(win,(tproc->p_uid != tproc->p_suid) ? '#' : ' ');
  529. X        waddch(win,' ');
  530. X        positioned = 1;
  531. X    }
  532. X    else
  533. X        positioned = 0;
  534. X
  535. X    if(initial)
  536. X    {
  537. X        if(!positioned)
  538. X            wmove(win,PROC_Y + iproc,PROC_X + PID_X);
  539. X        (void)sprintf(buf,"%5d ",tproc->p_pid);
  540. X        waddstr(win,buf);
  541. X        positioned = 1;
  542. X    }
  543. X    else
  544. X        positioned = 0;
  545. X
  546. X    if(initial || (tproc->p_cpu != oproc->p_cpu))
  547. X    {
  548. X        if(!positioned)
  549. X            wmove(win,PROC_Y + iproc,PROC_X + CPU_X);
  550. X        (void)sprintf(buf,"%3u ",tproc->p_cpu);
  551. X        waddstr(win,buf);
  552. X        positioned = 1;
  553. X    }
  554. X    else
  555. X        positioned = 0;
  556. X
  557. X    if(initial || (tproc->p_pri != oproc->p_pri))
  558. X    {
  559. X        if(!positioned)
  560. X            wmove(win,PROC_Y + iproc,PROC_X + PRI_X);
  561. X        (void)sprintf(buf,"%3u ",tproc->p_pri);
  562. X        waddstr(win,buf);
  563. X        positioned = 1;
  564. X    }
  565. X    else
  566. X        positioned = 0;
  567. X
  568. X    if(initial || (tproc->p_nice != oproc->p_nice))
  569. X    {
  570. X        if(!positioned)
  571. X            wmove(win,PROC_Y + iproc,PROC_X + NICE_X);
  572. X        (void)sprintf(buf,"%2d ",tproc->p_nice);
  573. X        waddstr(win,buf);
  574. X        positioned = 1;
  575. X    }
  576. X    else
  577. X        positioned = 0;
  578. X
  579. X/* since not saving user area, always update fields from it */
  580. X    if(!positioned)
  581. X        wmove(win,PROC_Y + iproc,PROC_X + UTIME_X);
  582. X    if(got_user = get_user(tproc,&user))
  583. X    {
  584. X        waddstr(win,get_cpu_time_str(user.u_utime));
  585. X        waddch(win,' ');
  586. X        waddstr(win,get_cpu_time_str(user.u_stime));
  587. X        waddch(win,' ');
  588. X/*
  589. X * process size:
  590. X *
  591. X * There are ways that seem right to a man, but the end of them is death.
  592. X * u_tsize and friends are not clicks, but in bytes.
  593. X * I thought this would have been:
  594. X *        (ctob((u_long)user.u_tsize + user.u_dsize + user.u_ssize)) / 1024);
  595. X * At least this makes numbers agree with /bin/ps, although I cannot
  596. X * figure out why there is one extra page charged by ps (user is 2 pages).
  597. X *
  598. X * This was evidentally wrong in SCO UNIX 3.2.0 and fixed in 3.2.1.
  599. X * If you get lots of processes who size is reported as 4, define
  600. X * USIZE_FIXED
  601. X */
  602. X        (void)sprintf(buf,"%4lu ",
  603. X#ifdef USIZE_FIXED
  604. X            (ctob((u_long)user.u_tsize + user.u_dsize + user.u_ssize)) / 1024
  605. X#else
  606. X            (((u_long)user.u_tsize + 511) / 1024) +
  607. X            (((u_long)user.u_dsize + 511) / 1024) +
  608. X            (((u_long)user.u_ssize + 511) / 1024) +
  609. X            (((u_long)((user.u_tsize)?1:0) * NBPP) / 1024)
  610. X#endif
  611. X        );
  612. X        waddstr(win,buf);
  613. X    }
  614. X    else
  615. X        waddstr(win,"------ ------ ---- ");
  616. X
  617. X/*
  618. X    positioned = 1;
  619. X    if(!positioned)
  620. X        wmove(win,PROC_Y + iproc,PROC_X + TTY_X);
  621. X*/
  622. X    (void)sprintf(buf,"%3.3s ",pgrp_to_ttyname(tproc->p_pgrp));
  623. X    waddstr(win,buf);
  624. X    positioned = 1;
  625. X
  626. X/*
  627. X    if(!positioned)
  628. X        wmove(win,PROC_Y + iproc,PROC_X + CMD_X);
  629. X*/
  630. X    if(got_user)
  631. X    {
  632. X    register char *cptr = user.u_psargs;
  633. X    int y,x,maxx = getmaxx(win);
  634. X        getyx(win,y,x);
  635. X        while(*cptr && (x < maxx))
  636. X        {
  637. X            *cptr &= 0x7F;
  638. X            if(*cptr < 0x20)
  639. X                *cptr = 0x20;
  640. X            waddch(win,*cptr);
  641. X            cptr++,x++;
  642. X        }
  643. X    }
  644. X    else
  645. X    {
  646. X        switch(tproc->p_stat)
  647. X        {
  648. X            case SZOMB:
  649. X                waddstr(win,"<zombie>");
  650. X                break;
  651. X            case SXBRK:
  652. X                waddstr(win,"<xbreak>");
  653. X                break;
  654. X            default:
  655. X                waddstr(win,"<swapped>");
  656. X        }
  657. X    }
  658. X
  659. X    wclrtoeol(win);
  660. X
  661. X}    /* end of display_proc_stat */
  662. X
  663. X/*+-------------------------------------------------------------------------
  664. X    display_proc_stats(win,initial)
  665. X--------------------------------------------------------------------------*/
  666. Xvoid
  667. Xdisplay_proc_stats(win,initial)
  668. XWINDOW *win;
  669. Xint initial;
  670. X{
  671. Xregister int iproc;
  672. Xint y,x;
  673. X
  674. X    if(initial)
  675. X    {
  676. X        use_cp(win,cpBANNER);
  677. X        wmove(win,0,0);
  678. X        waddstr(win,
  679. X            "S     USER   PID  CPU PRI NI  UCPU   SCPU  SIZE TTY CMD");
  680. X        getyx(win,y,x);
  681. X        while(x < getmaxx(win))
  682. X            waddch(win,(chtype)' '),x++;
  683. X    }
  684. X    mypid = getpid();
  685. X    max_procs_to_display = getmaxy(win) - PROC_Y;
  686. X    read_and_sort_procs(initial);
  687. X    max_procs_to_display = min(nprocs,max_procs_to_display);
  688. X    for(iproc = 0; iproc < max_procs_to_display; iproc++)
  689. X        display_proc_stat(win,iproc,1);
  690. X    wclrtobot(win);
  691. X}    /* end of display_proc_stats */
  692. X
  693. X/* vi: set tabstop=4 shiftwidth=4: */
  694. X/* end of det_proc.c */
  695. SHAR_EOF
  696. $TOUCH -am 0627015790 det_proc.c &&
  697. chmod 0644 det_proc.c ||
  698. echo "restore of det_proc.c failed"
  699. set `wc -c det_proc.c`;Wc_c=$1
  700. if test "$Wc_c" != "16615"; then
  701.     echo original size 16615, current size $Wc_c
  702. fi
  703. # ============= det_sio.c ==============
  704. echo "x - extracting det_sio.c (Text)"
  705. sed 's/^X//' << 'SHAR_EOF' > det_sio.c &&
  706. X/* CHK=0xC5D1 */
  707. X/*+-------------------------------------------------------------------------
  708. X    det_sio.c - UNIX V/386 system monitor serial I/O detail
  709. X    ...!emory!n4hgf!wht
  710. X
  711. X  Defined functions:
  712. X    B_to_baud_rate(code)
  713. X    cflag_to_baud_d_p_s(cflag)
  714. X    grok_sio_tty()
  715. X    display_siofull_init(win,tly,tlx,show_flag)
  716. X    display_siofull_update(win,tly,tlx,tsio)
  717. X    display_siosum_update(win,y,tsio)
  718. X    tty_slot_compare(sio1,sio2)
  719. X
  720. X--------------------------------------------------------------------------*/
  721. X/*+:EDITS:*/
  722. X/*:06-27-1990-01:57-wht@n4hgf-1.10 - incorporate suggestions from alpha testers */
  723. X/*:06-26-1990-03:17-wht@n4hgf-creation */
  724. X
  725. X#define M_TERMINFO
  726. X
  727. X#include <curses.h>
  728. X#include <panel.h>
  729. X#include <string.h>
  730. X#include <nlist.h>
  731. X#include <sys/types.h>
  732. X#include <sys/stat.h>
  733. X#include <sys/ascii.h>
  734. X#undef NGROUPS_MAX
  735. X#undef NULL
  736. X#include <sys/param.h>
  737. X#include <sys/tty.h>
  738. X
  739. X#include "nlsym.h"
  740. X#include "libkmem.h"
  741. X#include "libmem.h"
  742. X#include "libswap.h"
  743. X#include "libnlsym.h"
  744. X#include "u386mon.h"
  745. X
  746. Xextern int errno;
  747. Xextern int sys_nerr;
  748. Xextern char *sys_errlist[];
  749. X
  750. X#define SIO_NTTY 16    /* for now */
  751. Xstruct tty sio[SIO_NTTY];
  752. X
  753. X#define t_slot    t_delct
  754. X
  755. Xint nsio;    /* number of sios open */
  756. X
  757. Xtypedef struct slabel
  758. X{
  759. X    int y,x;
  760. X    char *label;
  761. X} SLABEL;
  762. X
  763. XSLABEL tty_slabels[] =
  764. X{
  765. X    {  0,  0, "iflag:" },
  766. X    {  2,  0, "oflag:" },
  767. X    {  3,  0, "cflag:" },
  768. X    {  4,  0, "lflag:" },
  769. X    {  5,  7, "INTR QUIT ERASE KILL EOF/VMIN  EOL/VTIME EOL2 SWTCH" },
  770. X    {  6,  0, "cc:" },
  771. X    {  7,  0, "state:" },
  772. X    {  -1,-1, (char *)0}
  773. X};
  774. X
  775. Xtypedef struct bitfld
  776. X{
  777. X    int y,x;
  778. X    char *label;
  779. X    int flag_num;
  780. X    int mask;
  781. X} BITFLD;
  782. X
  783. X#define IFLAG 1
  784. X#define OFLAG 2
  785. X#define LFLAG 3
  786. X#define CFLAG 4
  787. X#define STATE 5
  788. X
  789. XBITFLD ttybitflds[] =
  790. X{
  791. X    {  0,  7, "IGNBRK", IFLAG, IGNBRK },
  792. X    {  0, 15, "BRKINT", IFLAG, BRKINT },
  793. X    {  0, 23, "IGNPAR", IFLAG, IGNPAR },
  794. X    {  0, 31, "PARMRK", IFLAG, PARMRK },
  795. X    {  0, 39, "INPCK",  IFLAG, INPCK },
  796. X    {  0, 46, "ISTRIP", IFLAG, ISTRIP },
  797. X    {  0, 53, "INLCR",  IFLAG, INLCR },
  798. X    {  0, 60, "IGNCR",  IFLAG, IGNCR },
  799. X    {  0, 68, "ICRNL",  IFLAG, ICRNL },
  800. X    {  1,  7, "IUCLC",  IFLAG, IUCLC },
  801. X    {  1, 15, "IXON",   IFLAG, IXON },
  802. X    {  1, 23, "IXOFF",  IFLAG, IXOFF },
  803. X    {  1, 31, "IXANY",  IFLAG, IXANY },
  804. X    {  2,  7, "OPOST",  OFLAG, OPOST },
  805. X    {  2, 15, "OLCUC",  OFLAG, OLCUC },
  806. X    {  2, 23, "ONLCR",  OFLAG, ONLCR },
  807. X    {  2, 31, "OCRNL",  OFLAG, OCRNL },
  808. X    {  2, 39, "ONOCR",  OFLAG, ONOCR },
  809. X    {  2, 46, "ONLRET", OFLAG, ONLRET },
  810. X    {  2, 53, "OFDEL",  OFLAG, OFDEL },
  811. X    {  3, 23, "CREAD",  CFLAG, CREAD },
  812. X    {  3, 31, "HUPCL",  CFLAG, HUPCL },
  813. X    {  3, 39, "CLOCAL", CFLAG, CLOCAL },
  814. X#ifdef RTSFLOW
  815. X    {  3, 46, "RTSFLO", CFLAG, RTSFLOW },
  816. X#endif
  817. X#ifdef CTSFLOW
  818. X    {  3, 53, "CTSFLO", CFLAG, CTSFLOW },
  819. X#endif
  820. X    {  4,  7, "ISIG",   LFLAG, ISIG },
  821. X    {  4, 15, "ICANON", LFLAG, ICANON },
  822. X    {  4, 23, "XCASE",  LFLAG, XCASE },
  823. X    {  4, 31, "ECHO",   LFLAG, ECHO },
  824. X    {  4, 39, "ECHOE",  LFLAG, ECHOE },
  825. X    {  4, 46, "ECHOK",  LFLAG, ECHOK },
  826. X    {  4, 53, "ECHONL", LFLAG, ECHONL },
  827. X    {  4, 60, "NOFLSH", LFLAG, NOFLSH },
  828. X    {  4, 68, "XCLUDE", LFLAG, XCLUDE },
  829. X    {  7,  7, "TO",     STATE, TIMEOUT },
  830. X    {  7, 10, "WO",     STATE, WOPEN },
  831. X    {  7, 13, "O",      STATE, ISOPEN },
  832. X    {  7, 15, "TB",     STATE, TBLOCK },
  833. X    {  7, 18, "CD",     STATE, CARR_ON },
  834. X    {  7, 21, "BY",     STATE, BUSY },
  835. X    {  7, 24, "OSLP",   STATE, OASLP },
  836. X    {  7, 29, "ISLP",   STATE, IASLP },
  837. X    {  7, 34, "STOP",   STATE, TTSTOP },
  838. X    {  7, 39, "EXT",    STATE, EXTPROC },
  839. X    {  7, 43, "TACT",   STATE, TACT },
  840. X    {  7, 48, "ESC",    STATE, CLESC },
  841. X    {  7, 52, "RTO",    STATE, RTO },
  842. X    {  7, 56, "IOW",    STATE, TTIOW },
  843. X    {  7, 60, "XON",    STATE, TTXON },
  844. X    {  7, 64, "XOFF",   STATE, TTXOFF },
  845. X    {  -1,-1, (char *)0,    -1,    -1 }
  846. X};
  847. X
  848. Xtypedef struct valyx
  849. X{
  850. X    int y,x;
  851. X} VALYX;
  852. X
  853. XVALYX ttyvalyx[] =
  854. X{
  855. X#define Fc_intr       0
  856. X    {  6,  8 },
  857. X#define Fcc_quit      1
  858. X    {  6, 13 },
  859. X#define Fcc_erase     2
  860. X    {  6, 18 },
  861. X#define Fcc_kill      3
  862. X    {  6, 24 },
  863. X#define Fcc_eof       4
  864. X    {  6, 30 },
  865. X#define Fcc_eol       5
  866. X    {  6, 40 },
  867. X#define Fcc_eol2      6
  868. X    {  6, 49 },
  869. X#define Fcc_swtch     7
  870. X    {  6, 54 },
  871. X#define Fbaud_b_p_s   8
  872. X    {  3,  7 }
  873. X};
  874. X
  875. Xtypedef struct b_to_br
  876. X{
  877. X    char *baud_rate;
  878. X    int B_code;
  879. X} B_TO_BR;
  880. X
  881. XB_TO_BR speeds[] =     /* ordered to put less common rates later in table */
  882. X{                    /* and the vagaries of baud rates above 9600 "handled" */
  883. X    " 2400",    B2400,
  884. X    " 1200",    B1200,
  885. X    " 9600",    B9600,
  886. X#if defined(B19200)
  887. X    "19200",    B19200,
  888. X#endif
  889. X#if defined(B38400)
  890. X    "38400",    B38400,
  891. X#endif
  892. X    " 4800",    B4800,
  893. X    "  300",    B300,
  894. X    "  110",    B110,
  895. X    "  600",    B600,
  896. X    "   75",    B75,
  897. X    "   50",    B50,
  898. X    "  HUP",    B0,
  899. X    " EXTA",    EXTA,
  900. X    " EXTB",    EXTB,
  901. X
  902. X    (char *)0,0
  903. X};
  904. X
  905. X/*+-------------------------------------------------------------------------
  906. X    tty_slot_compare(sio1,sio2)
  907. X--------------------------------------------------------------------------*/
  908. Xint
  909. Xtty_slot_compare(sio1,sio2)
  910. Xstruct tty *sio1;
  911. Xstruct tty *sio2;
  912. X{
  913. X    return(sio1->t_slot - sio2->t_slot);
  914. X}    /* end of tty_slot_compare */
  915. X
  916. X/*+-------------------------------------------------------------------------
  917. X    grok_sio_tty()
  918. X--------------------------------------------------------------------------*/
  919. Xvoid
  920. Xgrok_sio_tty()
  921. X{
  922. Xregister isio;
  923. Xregister struct tty *tsio;
  924. X
  925. X    nsio = 0;
  926. X    kread((caddr_t)sio,sio_ttyaddr,sizeof(struct tty) * SIO_NTTY);
  927. X    for(isio = 0; isio < SIO_NTTY; isio++)
  928. X    {
  929. X        tsio = &sio[isio];
  930. X        if(tsio->t_state & (WOPEN | ISOPEN))
  931. X        {
  932. X            tsio->t_slot = (ushort)isio;
  933. X            nsio++;
  934. X            continue;
  935. X        }
  936. X        tsio->t_slot = 127;
  937. X    }
  938. X    (void)qsort((char *)sio,(unsigned)SIO_NTTY,
  939. X        sizeof(struct tty),tty_slot_compare);
  940. X
  941. X}    /* end of grok_sio_tty */
  942. X
  943. X/*+-------------------------------------------------------------------------
  944. X    B_to_baud_rate(code) - convert CBAUD B_ code to baud rate string
  945. X--------------------------------------------------------------------------*/
  946. Xchar *
  947. XB_to_baud_rate(code)
  948. X{
  949. Xregister int n;
  950. X
  951. X    for(n=0; speeds[n].baud_rate; n++)
  952. X        if(speeds[n].B_code == code)
  953. X            return(speeds[n].baud_rate);
  954. X    return("-----");
  955. X}    /* end of B_to_baud_rate */
  956. X
  957. X/*+-------------------------------------------------------------------------
  958. X    cflag_to_baud_d_p_s(cflag)
  959. X--------------------------------------------------------------------------*/
  960. Xchar *
  961. Xcflag_to_baud_d_p_s(cflag)
  962. Xint cflag;
  963. X{
  964. Xregister char *cptr;
  965. Xstatic char rtnstr[16];
  966. X
  967. X    strcpy(rtnstr,B_to_baud_rate(cflag & CBAUD));
  968. X    cptr = rtnstr + strlen(rtnstr);
  969. X    *cptr++ = '-';
  970. X    switch(cflag & CSIZE)
  971. X    {
  972. X        case CS5: *cptr++ = '5'; break;
  973. X        case CS6: *cptr++ = '6'; break;
  974. X        case CS7: *cptr++ = '7'; break;
  975. X        case CS8: *cptr++ = '8'; break;
  976. X    }
  977. X    *cptr++ = '-';
  978. X    *cptr++ = (cflag & PARENB) ? ((cflag & PARODD) ? 'O' : 'E') : 'N';
  979. X    *cptr++ = '-';
  980. X    *cptr++ = (cflag & CSTOPB) ? '2' : '1';
  981. X    *cptr = 0;
  982. X    return(rtnstr);
  983. X
  984. X}    /* end of cflag_to_baud_d_p_s */
  985. X
  986. X/*+-----------------------------------------------------------------------
  987. X    display_siofull_update(win,tly,tlx,tsio)
  988. X
  989. X000000000011111111112222222222333333333344444444445555555555666666666677777
  990. X012345678901234567890123456789012345678901234567890123456789012345678901234
  991. Xiflag: IGNBRK  BRKINT  IGNPAR  PARMRK  INPCK  ISTRIP INLCR  IGNCR   ICRNL
  992. X       IUCLC   IXON    IXOFF   IXANY
  993. Xoflag: OPOST   OLCUC   ONLCR   OCRNL   ONOCR  ONLRET OFDEL
  994. Xcflag: 09600-8-N-1     CREAD   HUPCL   CLOCAL
  995. Xlflag: ISIG    ICANON  XCASE   ECHO    ECHOE  ECHOK  ECHONL NOFLSH  XCLUDE
  996. X       INTR QUIT ERASE KILL EOF/VMIN  EOL/VTIME EOL2 SWTCH 
  997. Xcc:     03   1c   08    15    01        00       00   00   
  998. X
  999. X------------------------------------------------------------------------*/
  1000. Xvoid
  1001. Xdisplay_siofull_update(win,tly,tlx,tsio)
  1002. XWINDOW *win;
  1003. Xint tly;
  1004. Xint tlx;
  1005. Xstruct tty *tsio;
  1006. X{
  1007. Xregister flag;
  1008. Xregister i_cc;
  1009. Xregister char *cptr;
  1010. XBITFLD *bfptr = ttybitflds;
  1011. XVALYX *vptr = ttyvalyx;
  1012. X
  1013. X    use_cp(win,cpLOW);
  1014. X    while(bfptr->y >= 0)
  1015. X    {
  1016. X        switch(bfptr->flag_num)
  1017. X        {
  1018. X            case IFLAG: flag = tsio->t_iflag; break;
  1019. X            case OFLAG: flag = tsio->t_oflag; break;
  1020. X            case LFLAG: flag = tsio->t_lflag; break;
  1021. X            case CFLAG: flag = tsio->t_cflag; break;
  1022. X            case STATE: flag = tsio->t_state; break;
  1023. X        }
  1024. X        flag &= bfptr->mask;
  1025. X        wmove(win,bfptr->y + tly,bfptr->x + tlx);
  1026. X        if(flag)
  1027. X            use_cp(win,cpREVERSE);
  1028. X        waddstr(win,bfptr->label);
  1029. X        if(flag)
  1030. X            use_cp(win,cpLOW);
  1031. X        bfptr++;
  1032. X    }
  1033. X    for(i_cc = 0; i_cc < NCC; i_cc++)
  1034. X    {
  1035. X        wmove(win,vptr->y + tly,vptr->x + tlx);
  1036. X        wprintw(win,"%02x",tsio->t_cc[i_cc]);
  1037. X        vptr++;
  1038. X    }
  1039. X
  1040. X    vptr = &ttyvalyx[Fbaud_b_p_s];
  1041. X    clear_area(win,vptr->y + tly,vptr->x + tlx,12);
  1042. X    waddstr(win,cflag_to_baud_d_p_s(tsio->t_cflag));
  1043. X
  1044. X}    /* end of display_siofull_update */
  1045. X
  1046. X/*+-------------------------------------------------------------------------
  1047. X    display_siofull_init(win,tly,tlx,show_flag)
  1048. X--------------------------------------------------------------------------*/
  1049. Xvoid
  1050. Xdisplay_siofull_init(win,tly,tlx,show_flag)
  1051. XWINDOW *win;
  1052. Xint tly;
  1053. Xint tlx;
  1054. Xint show_flag;
  1055. X{
  1056. Xregister y;
  1057. XSLABEL *sptr = tty_slabels;
  1058. X
  1059. X    use_cp(win,cpLIT);
  1060. X    for(y = 0; y < 7; y++)
  1061. X        clear_area(win,y,0,getmaxy(win));
  1062. X    if(show_flag)
  1063. X    {
  1064. X        while(sptr->y >= 0)
  1065. X        {
  1066. X            wmove(win,sptr->y + tly,sptr->x + tlx);
  1067. X            waddstr(win,sptr->label);
  1068. X            sptr++;
  1069. X        }
  1070. X    }
  1071. X
  1072. X}    /* end of display_siofull_init */
  1073. X
  1074. X/*+-------------------------------------------------------------------------
  1075. X    display_siosum_update(win,y,tsio)
  1076. X--------------------------------------------------------------------------*/
  1077. Xvoid
  1078. Xdisplay_siosum_update(win,y,tsio)
  1079. Xregister WINDOW *win;
  1080. Xint y;
  1081. Xregister struct tty *tsio;
  1082. X{
  1083. Xregister unsigned int itmp;
  1084. Xregister opened = tsio->t_state & (ISOPEN | WOPEN);
  1085. Xchar s8[8];
  1086. X
  1087. X#define TX 1
  1088. X#define RX 6
  1089. X#define CX 11
  1090. X#define OX 16
  1091. X#define SX 23
  1092. X#define FX 30
  1093. X
  1094. X    wmove(win,y,TX);
  1095. X#ifdef M_UNIX
  1096. X    waddch(win,(tsio->t_slot < 8) ? '1' : '2');
  1097. X    waddch(win,(tsio->t_slot % 8) + 'a');
  1098. X#else
  1099. X    wprintw(win,"%02d",tsio->slot);
  1100. X#endif
  1101. X
  1102. X    if(!opened)
  1103. X    {
  1104. X        use_cp(win,cpINFO);
  1105. X        clear_area(win,y,TX,COLS - TX);
  1106. X        waddstr(win,"closed");
  1107. X        return;
  1108. X    }
  1109. X
  1110. X    wmove(win,y,RX);
  1111. X    if((itmp = (unsigned)tsio->t_rawq.c_cc) > 999)
  1112. X        itmp = 999;
  1113. X    if(itmp > 10)
  1114. X        use_cp(win,cpHIGH);
  1115. X    else if(itmp > 3)
  1116. X        use_cp(win,cpMED);
  1117. X    else
  1118. X        use_cp(win,cpLOW);
  1119. X    wprintw(win,"%3d",itmp);
  1120. X
  1121. X    if((itmp = (unsigned)tsio->t_canq.c_cc) > 999)
  1122. X        itmp = 999;
  1123. X    if(itmp > 20)
  1124. X        use_cp(win,cpHIGH);
  1125. X    else if(itmp > 10)
  1126. X        use_cp(win,cpMED);
  1127. X    else
  1128. X        use_cp(win,cpLOW);
  1129. X    wmove(win,y,CX);
  1130. X    wprintw(win,"%3d",itmp);
  1131. X
  1132. X    if((itmp = (unsigned)tsio->t_outq.c_cc + tsio->t_tbuf.c_count) > 99999)
  1133. X        itmp = 99999;
  1134. X    if(itmp > 75)
  1135. X        use_cp(win,cpHIGH);
  1136. X    else if(itmp > 20)
  1137. X        use_cp(win,cpMED);
  1138. X    else
  1139. X        use_cp(win,cpLOW);
  1140. X    wmove(win,y,OX);
  1141. X    wprintw(win,"%5d",itmp);
  1142. X
  1143. X    use_cp(win,cpINFO);
  1144. X    wmove(win,y,SX);
  1145. X    waddstr(win,B_to_baud_rate(tsio->t_cflag & CBAUD));
  1146. X
  1147. X    strcpy(s8,".....");
  1148. X    if(tsio->t_state & WOPEN)
  1149. X        s8[0] = 'W';
  1150. X    else if(tsio->t_state & ISOPEN)
  1151. X        s8[0] = 'O';
  1152. X    if(tsio->t_state & CARR_ON)
  1153. X        s8[1] = 'C';
  1154. X    if(tsio->t_state & BUSY)
  1155. X        s8[2] = 'B';
  1156. X    if(tsio->t_state & TTSTOP)
  1157. X        s8[3] = 'S';
  1158. X    if(tsio->t_state & TIMEOUT)
  1159. X        s8[4] = 'D';
  1160. X    wmove(win,y,FX);
  1161. X    waddstr(win,s8);
  1162. X
  1163. X    wprintw(win,"%7o",tsio->t_iflag);
  1164. X    wprintw(win,"%7o",tsio->t_oflag);
  1165. X    wprintw(win,"%7o",tsio->t_cflag);
  1166. X    wprintw(win,"%7o",tsio->t_lflag);
  1167. X    if(tsio->t_pgrp)
  1168. X        wprintw(win,"%6d",tsio->t_pgrp);
  1169. X    else
  1170. X        waddstr(win,"      ");
  1171. X
  1172. X}    /* end of display_siosum_update */
  1173. X
  1174. X/*+-------------------------------------------------------------------------
  1175. X    display_sio_summary(win,initial)
  1176. X--------------------------------------------------------------------------*/
  1177. Xdisplay_sio_summary(win,initial)
  1178. Xregister WINDOW *win;
  1179. Xint initial;
  1180. X{
  1181. Xregister int isio;
  1182. Xint max_displayable_sios = getmaxy(win) - 2;
  1183. Xstatic char *header  = 
  1184. X" tty  raw  can    out  speed  state  iflag  oflag  cflag  lflag  pgrp";
  1185. Xstatic couldnt_display_all = 0;
  1186. X
  1187. X    if(initial)
  1188. X    {
  1189. X        use_cp(win,cpBANNER);
  1190. X        clear_area(win,0,0,getmaxx(win));
  1191. X        waddstr(win,header);
  1192. X        disp_msg(cpLIT,
  1193. X"W=wait for open  O=open C=carrier on  B=output busy  S=stopped  T=timeout");
  1194. X        couldnt_display_all = 1;
  1195. X    }
  1196. X    grok_sio_tty();
  1197. X    for(isio = 0; (isio < nsio); isio++)
  1198. X    {
  1199. X        if(isio > max_displayable_sios)
  1200. X        {
  1201. X            wmove(win,getmaxy(win)-1);
  1202. X            use_cp(win,cpMED);
  1203. X            waddstr(win,"cannot display all active serial ports");
  1204. X            couldnt_display_all = 1;
  1205. X            return;
  1206. X        }
  1207. X        display_siosum_update(win,isio + 1,&sio[isio]);
  1208. X    }
  1209. X    if(couldnt_display_all)
  1210. X    {
  1211. X        use_cp(win,cpINFO);
  1212. X        clear_area(win,getmaxy(win)-1,0,getmaxx(win));
  1213. X        couldnt_display_all = 0;
  1214. X    }
  1215. X
  1216. X}    /* end of display_sio_summary */
  1217. X
  1218. X/* vi: set tabstop=4 shiftwidth=4: */
  1219. X/* end of det_sio.c */
  1220. SHAR_EOF
  1221. $TOUCH -am 0627015790 det_sio.c &&
  1222. chmod 0644 det_sio.c ||
  1223. echo "restore of det_sio.c failed"
  1224. set `wc -c det_sio.c`;Wc_c=$1
  1225. if test "$Wc_c" != "12386"; then
  1226.     echo original size 12386, current size $Wc_c
  1227. fi
  1228. # ============= disputil.c ==============
  1229. echo "x - extracting disputil.c (Text)"
  1230. sed 's/^X//' << 'SHAR_EOF' > disputil.c &&
  1231. X/*+-------------------------------------------------------------------------
  1232. X    disputil.c - u386mon display utilities
  1233. X
  1234. X  Defined functions:
  1235. X    clear_area(win,y,x,len)
  1236. X    clear_area_char(win,y,x,len,fillchar)
  1237. X    disp_info_int(win,label,fmt,value)
  1238. X    disp_info_long(win,label,fmt,value)
  1239. X    disp_static_int(win,label,fmt,value)
  1240. X    disp_static_long(win,label,fmt,value)
  1241. X    mkpanel(rows,cols,tly,tlx)
  1242. X    pflush()
  1243. X    wperror(win,desc)
  1244. X
  1245. X--------------------------------------------------------------------------*/
  1246. X/*+:EDITS:*/
  1247. X/*:06-27-1990-01:57-wht@n4hgf-1.10 - incorporate suggestions from alpha testers */
  1248. X/*:06-25-1990-04:14-wht@n4hgf-1.02-better error handling */
  1249. X/*:06-24-1990-20:53-wht@n4hgf-v1.01-add ISC support thanks to peter@radig.de */
  1250. X/*:06-21-1990-14:26-r@n4hgf-version x0.12 seems bug free */
  1251. X/*:06-17-1990-15:15-wht-creation */
  1252. X
  1253. X#define M_TERMINFO
  1254. X
  1255. X#include <curses.h>
  1256. X#include <panel.h>
  1257. X#include <sys/types.h>
  1258. X#include "u386mon.h"
  1259. X
  1260. X/*+-------------------------------------------------------------------------
  1261. X    clear_area_char(win,y,x,len,fillchar)
  1262. X--------------------------------------------------------------------------*/
  1263. Xvoid
  1264. Xclear_area_char(win,y,x,len,fillchar)
  1265. XWINDOW *win;
  1266. Xint y;
  1267. Xint x;
  1268. Xint len;
  1269. Xu_char fillchar;
  1270. X{
  1271. X    wmove(win,y,x);
  1272. X    while(len-- > 0)
  1273. X        waddch(win,(chtype)fillchar);
  1274. X    wmove(win,y,x);
  1275. X
  1276. X}    /* end of clear_area_char */
  1277. X
  1278. X/*+-------------------------------------------------------------------------
  1279. X    clear_area(win,y,x,len)
  1280. X--------------------------------------------------------------------------*/
  1281. Xvoid
  1282. Xclear_area(win,y,x,len)
  1283. XWINDOW *win;
  1284. Xint y;
  1285. Xint x;
  1286. Xint len;
  1287. X{
  1288. X    clear_area_char(win,y,x,len,' ');
  1289. X}    /* end of clear_area_char */
  1290. X
  1291. X/*+-------------------------------------------------------------------------
  1292. X    pflush() - do update_panels() and doupdate()
  1293. X--------------------------------------------------------------------------*/
  1294. Xvoid
  1295. Xpflush()
  1296. X{
  1297. X    update_panels();
  1298. X    curs_set(0);
  1299. X    doupdate();
  1300. X    curs_set(1);
  1301. X}    /* end of pflush */
  1302. X
  1303. X/*+-------------------------------------------------------------------------
  1304. X    wperror(win,desc)
  1305. X--------------------------------------------------------------------------*/
  1306. Xvoid
  1307. Xwperror(win,desc)
  1308. XWINDOW *win;
  1309. Xchar *desc;
  1310. X{
  1311. Xextern int errno;
  1312. Xextern int sys_nerr;
  1313. Xextern char *sys_errlist[];
  1314. X
  1315. X    waddstr(win,desc);
  1316. X    waddstr(win,": ");
  1317. X    if(errno < sys_nerr)
  1318. X        waddstr(win,sys_errlist[errno]);
  1319. X    else
  1320. X        wprintw(win,"error %u",errno);
  1321. X
  1322. X}    /* end of wperror */
  1323. X
  1324. X/*+-------------------------------------------------------------------------
  1325. X    mkpanel(rows,cols,tly,tlx) - alloc a win and panel and associate them
  1326. X--------------------------------------------------------------------------*/
  1327. XPANEL *
  1328. Xmkpanel(rows,cols,tly,tlx)
  1329. Xint rows;
  1330. Xint cols;
  1331. Xint tly;
  1332. Xint tlx;
  1333. X{
  1334. XWINDOW *win = newwin(rows,cols,tly,tlx);
  1335. XPANEL *pan;
  1336. X
  1337. X    if(!win)
  1338. X        return((PANEL *)0);
  1339. X    if(pan = new_panel(win))
  1340. X        return(pan);
  1341. X    delwin(win);
  1342. X    return((PANEL *)0);
  1343. X}    /* end of mkpanel */
  1344. X
  1345. X/*+-------------------------------------------------------------------------
  1346. X    disp_info_long(win,label,fmt,value)
  1347. X--------------------------------------------------------------------------*/
  1348. Xvoid
  1349. Xdisp_info_long(win,label,fmt,value)
  1350. XWINDOW *win;
  1351. Xchar *label;
  1352. Xchar *fmt;
  1353. Xlong value;
  1354. X{
  1355. X    use_cp(win,cpLIT);
  1356. X    waddstr(win,label);
  1357. X    use_cp(win,cpINFO);
  1358. X    wprintw(win,fmt,value);
  1359. X}    /* end of disp_info_long */
  1360. X
  1361. X/*+-------------------------------------------------------------------------
  1362. X    disp_info_int(win,label,fmt,value)
  1363. X--------------------------------------------------------------------------*/
  1364. Xvoid
  1365. Xdisp_info_int(win,label,fmt,value)
  1366. XWINDOW *win;
  1367. Xchar *label;
  1368. Xchar *fmt;
  1369. Xint value;
  1370. X{
  1371. X    use_cp(win,cpLIT);
  1372. X    waddstr(win,label);
  1373. X    use_cp(win,cpINFO);
  1374. X    wprintw(win,fmt,value);
  1375. X}    /* end of disp_info_int */
  1376. X
  1377. X/*+-------------------------------------------------------------------------
  1378. X    disp_static_long(win,label,fmt,value)
  1379. X--------------------------------------------------------------------------*/
  1380. Xvoid
  1381. Xdisp_static_long(win,label,fmt,value)
  1382. XWINDOW *win;
  1383. Xchar *label;
  1384. Xchar *fmt;
  1385. Xlong value;
  1386. X{
  1387. X    use_cp(win,cpLIT);
  1388. X    waddstr(win,label);
  1389. X    wprintw(win,fmt,value);
  1390. X}    /* end of disp_static_long */
  1391. X
  1392. X/*+-------------------------------------------------------------------------
  1393. X    disp_static_int(win,label,fmt,value)
  1394. X--------------------------------------------------------------------------*/
  1395. Xvoid
  1396. Xdisp_static_int(win,label,fmt,value)
  1397. XWINDOW *win;
  1398. Xchar *label;
  1399. Xchar *fmt;
  1400. Xint value;
  1401. X{
  1402. X    use_cp(win,cpLIT);
  1403. X    waddstr(win,label);
  1404. X    wprintw(win,fmt,value);
  1405. X}    /* end of disp_static_int */
  1406. X
  1407. X/*+-------------------------------------------------------------------------
  1408. X    disp_msg(cp,msg)
  1409. X--------------------------------------------------------------------------*/
  1410. Xvoid
  1411. Xdisp_msg(cp,msg)
  1412. Xchtype cp;
  1413. Xchar *msg;
  1414. X{
  1415. Xextern WINDOW *wscr;
  1416. Xint y;
  1417. Xregister int x;
  1418. X
  1419. X    wmove(wscr,MSG_TLY,0);
  1420. X    use_cp(wscr,cp);
  1421. X    waddstr(wscr,msg);
  1422. X    getyx(wscr,y,x);
  1423. X    while(x < getmaxx(wscr))
  1424. X        waddch(wscr,(chtype)' '),x++;
  1425. X}    /* end of disp_msg */
  1426. X
  1427. X/* vi: set tabstop=4 shiftwidth=4: */
  1428. X/* end of disputil.c */
  1429. SHAR_EOF
  1430. $TOUCH -am 0627015790 disputil.c &&
  1431. chmod 0644 disputil.c ||
  1432. echo "restore of disputil.c failed"
  1433. set `wc -c disputil.c`;Wc_c=$1
  1434. if test "$Wc_c" != "4936"; then
  1435.     echo original size 4936, current size $Wc_c
  1436. fi
  1437. # ============= libkmem.c ==============
  1438. echo "x - extracting libkmem.c (Text)"
  1439. sed 's/^X//' << 'SHAR_EOF' > libkmem.c &&
  1440. X/*LINTLIBRARY*/
  1441. X/*+-------------------------------------------------------------------------
  1442. X    libkmem.c -- /dev/kmem routines for SCO UNIX/386 (maybe other *NIX)
  1443. X    ...!emory!n4hgf!wht
  1444. X
  1445. X  Defined functions:
  1446. X    kinit(write_needed)
  1447. X    kread(caddr,kaddr,len)
  1448. X    kwrite(kaddr,caddr,len)
  1449. X
  1450. X routines were originally written by Mike "Ford" Ditto: kudos!!!
  1451. X--------------------------------------------------------------------------*/
  1452. X/*+:EDITS:*/
  1453. X/*:06-27-1990-01:57-wht@n4hgf-1.10 - incorporate suggestions from alpha testers */
  1454. X/*:06-25-1990-04:14-wht@n4hgf-1.02-better error handling */
  1455. X/*:06-24-1990-20:53-wht@n4hgf-v1.01-add ISC support thanks to peter@radig.de */
  1456. X/*:06-21-1990-14:26-r@n4hgf-version x0.12 seems bug free */
  1457. X/*:12-07-1988-22:06-wht-put in test for initialized fdkmem */
  1458. X/*:10-27-1988-22:44-wht-creation of file */
  1459. X
  1460. X#include <sys/types.h>
  1461. X#include <fcntl.h>
  1462. X#include "libkmem.h"
  1463. X
  1464. Xvoid leave_text();
  1465. X
  1466. Xextern int errno;
  1467. X
  1468. Xstatic int fdkmem = -2;
  1469. Xdaddr_t lseek();
  1470. X
  1471. X/*+-------------------------------------------------------------------------
  1472. X    kinit(write_needed)
  1473. X--------------------------------------------------------------------------*/
  1474. Xvoid
  1475. Xkinit(write_needed)
  1476. Xint write_needed;
  1477. X{
  1478. X    if(fdkmem >= 0)
  1479. X        return;
  1480. X    if((fdkmem=open("/dev/kmem",(write_needed) ? O_RDWR : O_RDONLY,0)) < 0)
  1481. X        leave_text("can't open /dev/kmem",255);
  1482. X
  1483. X}    /* end of kinit */
  1484. X
  1485. X/*+-------------------------------------------------------------------------
  1486. X    kread(caddr,kaddr,len)
  1487. X--------------------------------------------------------------------------*/
  1488. Xvoid
  1489. Xkread(caddr,kaddr,len)
  1490. Xcaddr_t caddr;
  1491. Xdaddr_t kaddr;
  1492. Xint len;
  1493. X{
  1494. Xchar s80[80];
  1495. Xextern daddr_t myreadcnt;
  1496. X
  1497. X#if defined(M_I286)
  1498. X    kaddr &= 0xFFFFL;
  1499. X#endif
  1500. X
  1501. X    if(fdkmem == -2)
  1502. X        leave_text("kinit() not called",1);
  1503. X
  1504. X    if(lseek(fdkmem,kaddr,0) == -1L)
  1505. X    {
  1506. X        (void)sprintf(s80,"kmem read seek error addr %08lx",kaddr);
  1507. X        leave_text(s80,255);
  1508. X    }
  1509. X
  1510. X    if(read(fdkmem,caddr,len) != len)
  1511. X    {
  1512. X        (void)sprintf(s80,"kmem read error len %d addr %08lx",len,kaddr);
  1513. X        leave_text(s80,255);
  1514. X    }
  1515. X    myreadcnt += len;
  1516. X}    /* end of kread */
  1517. X
  1518. X/*+-------------------------------------------------------------------------
  1519. X    kwrite(kaddr,caddr,len)
  1520. X--------------------------------------------------------------------------*/
  1521. X#ifdef KWRITE_NEEDED
  1522. Xvoid
  1523. Xkwrite(kaddr,caddr,len)
  1524. Xdaddr_t kaddr;
  1525. Xcaddr_t caddr;
  1526. Xint len;
  1527. X{
  1528. Xchar s80[80];
  1529. X
  1530. X#if defined(M_I286)
  1531. X    kaddr &= 0xFFFFL;
  1532. X#endif
  1533. X
  1534. X    if(fdkmem == -2)
  1535. X        leave_text("kinit() not called",1);
  1536. X
  1537. X    if(lseek(fdkmem,kaddr,0) == -1L)
  1538. X    {
  1539. X        (void)sprintf(s80,
  1540. X            "/dev/kmem write seek error addr %08lx",kaddr);
  1541. X        leave_text(s80,255);
  1542. X    }
  1543. X    if(write(fdkmem,caddr,len) != len)
  1544. X    {
  1545. X        (void)sprintf(s80,
  1546. X            "/dev/kmem write error addr %08lx len %08lx",kaddr,len);
  1547. X        leave_text(s80,255);
  1548. X    }
  1549. X}    /* end of kwrite */
  1550. X#endif
  1551. X
  1552. X/* vi: set tabstop=4 shiftwidth=4: */
  1553. SHAR_EOF
  1554. $TOUCH -am 0627015790 libkmem.c &&
  1555. chmod 0644 libkmem.c ||
  1556. echo "restore of libkmem.c failed"
  1557. set `wc -c libkmem.c`;Wc_c=$1
  1558. if test "$Wc_c" != "2780"; then
  1559.     echo original size 2780, current size $Wc_c
  1560. fi
  1561. # ============= libmem.c ==============
  1562. echo "x - extracting libmem.c (Text)"
  1563. sed 's/^X//' << 'SHAR_EOF' > libmem.c &&
  1564. X/*LINTLIBRARY*/
  1565. X/*+-------------------------------------------------------------------------
  1566. X    libmem.c -- /dev/mem routines for SCO UNIX/386 (maybe other *NIX)
  1567. X    ...!emory!n4hgf!wht
  1568. X
  1569. X  Defined functions:
  1570. X    minit(write_needed)
  1571. X    mread(caddr,maddr,len)
  1572. X    mwrite(maddr,caddr,len)
  1573. X
  1574. X routines were originally written by Mike "Ford" Ditto: kudos!!!
  1575. X--------------------------------------------------------------------------*/
  1576. X/*+:EDITS:*/
  1577. X/*:06-27-1990-01:57-wht@n4hgf-1.10 - incorporate suggestions from alpha testers */
  1578. X/*:06-25-1990-04:14-wht@n4hgf-1.02-better error handling */
  1579. X/*:06-24-1990-20:53-wht@n4hgf-v1.01-add ISC support thanks to peter@radig.de */
  1580. X/*:06-21-1990-14:26-r@n4hgf-version x0.12 seems bug free */
  1581. X/*:12-07-1988-22:06-wht-put in test for initialized fdmem */
  1582. X/*:10-27-1988-22:44-wht-creation of file */
  1583. X
  1584. X#include <sys/types.h>
  1585. X#include <fcntl.h>
  1586. X#include "libmem.h"
  1587. X
  1588. Xvoid leave_text();
  1589. X
  1590. Xextern int errno;
  1591. X
  1592. Xstatic int fdmem = -2;
  1593. Xdaddr_t lseek();
  1594. X
  1595. X/*+-------------------------------------------------------------------------
  1596. X    minit(write_needed)
  1597. X--------------------------------------------------------------------------*/
  1598. Xvoid
  1599. Xminit(write_needed)
  1600. Xint write_needed;
  1601. X{
  1602. X    if(fdmem >= 0)
  1603. X        return;
  1604. X    if((fdmem=open("/dev/mem",(write_needed) ? O_RDWR : O_RDONLY,0)) < 0)
  1605. X        leave_text("can't open /dev/mem",255);
  1606. X
  1607. X}    /* end of minit */
  1608. X
  1609. X/*+-------------------------------------------------------------------------
  1610. X    mread(caddr,maddr,len)
  1611. X--------------------------------------------------------------------------*/
  1612. Xvoid
  1613. Xmread(caddr,maddr,len)
  1614. Xcaddr_t caddr;
  1615. Xdaddr_t maddr;
  1616. Xint len;
  1617. X{
  1618. Xchar s80[80];
  1619. Xextern daddr_t myreadcnt;
  1620. X
  1621. X#if defined(M_I286)
  1622. X    maddr &= 0xFFFFL;
  1623. X#endif
  1624. X
  1625. X    if(fdmem == -2)
  1626. X        leave_text("minit() not called",1);
  1627. X
  1628. X    if(lseek(fdmem,maddr,0) == -1L)
  1629. X    {
  1630. X        (void)sprintf(s80,"mem seek err (%08lx)",maddr);
  1631. X        leave_text(s80,1);
  1632. X    }
  1633. X
  1634. X    if(read(fdmem,caddr,len) != len)
  1635. X    {
  1636. X        (void)sprintf(s80,
  1637. X            "mem read errno %d len %d addr %08lx",errno,len,maddr);
  1638. X        leave_text(s80,1);
  1639. X    }
  1640. X    myreadcnt += len;
  1641. X}    /* end of mread */
  1642. X
  1643. X/*+-------------------------------------------------------------------------
  1644. X    mwrite(maddr,caddr,len)
  1645. X--------------------------------------------------------------------------*/
  1646. X#ifdef MWRITE_NEEDED
  1647. Xvoid
  1648. Xmwrite(maddr,caddr,len)
  1649. Xdaddr_t maddr;
  1650. Xcaddr_t caddr;
  1651. Xint len;
  1652. X{
  1653. Xchar s80[80];
  1654. X
  1655. X#if defined(M_I286)
  1656. X    maddr &= 0xFFFFL;
  1657. X#endif
  1658. X
  1659. X    if(fdmem == -2)
  1660. X        leave_text("minit() not called",1);
  1661. X
  1662. X    if(lseek(fdkmem,kaddr,0) == -1L)
  1663. X    {
  1664. X        (void)sprintf(s80,
  1665. X            "/dev/kmem seek error addr %08lx",kaddr);
  1666. X        leave_text(s80,255);
  1667. X    }
  1668. X    if(write(fdkmem,caddr,len) != len)
  1669. X    {
  1670. X        (void)sprintf(s80,
  1671. X            "/dev/kmem write error addr %08lx len %08lx",kaddr,len);
  1672. X        leave_text(s80,255);
  1673. X    }
  1674. X}    /* end of mwrite */
  1675. X#endif /* MWRITE_NEEDED */
  1676. X
  1677. X/* vi: set tabstop=4 shiftwidth=4: */
  1678. SHAR_EOF
  1679. $TOUCH -am 0627015790 libmem.c &&
  1680. chmod 0644 libmem.c ||
  1681. echo "restore of libmem.c failed"
  1682. set `wc -c libmem.c`;Wc_c=$1
  1683. if test "$Wc_c" != "2778"; then
  1684.     echo original size 2778, current size $Wc_c
  1685. fi
  1686. # ============= libswap.c ==============
  1687. echo "x - extracting libswap.c (Text)"
  1688. sed 's/^X//' << 'SHAR_EOF' > libswap.c &&
  1689. X/*LINTLIBRARY*/
  1690. X/*+-------------------------------------------------------------------------
  1691. X    libswap.c -- /dev/swap routines for SCO UNIX/386 (maybe other *NIX)
  1692. X    ...!emory!n4hgf!wht
  1693. X
  1694. X  Defined functions:
  1695. X    sinit()
  1696. X    sread(caddr,maddr,len)
  1697. X
  1698. X routines were originally written by Mike "Ford" Ditto: kudos!!!
  1699. X--------------------------------------------------------------------------*/
  1700. X/*+:EDITS:*/
  1701. X/*:06-27-1990-01:57-wht@n4hgf-1.10 - incorporate suggestions from alpha testers */
  1702. X/*:06-25-1990-04:14-wht@n4hgf-1.02-better error handling */
  1703. X/*:06-24-1990-20:53-wht@n4hgf-v1.01-add ISC support thanks to peter@radig.de */
  1704. X/*:06-22-1990-02:00-root@n4hgf-creation from libmem */
  1705. X
  1706. X#include <sys/types.h>
  1707. X#include <fcntl.h>
  1708. X#include "libswap.h"
  1709. X
  1710. Xvoid leave_text();
  1711. X
  1712. Xextern int errno;
  1713. X
  1714. Xstatic int fdswap = -2;
  1715. Xdaddr_t lseek();
  1716. X
  1717. X/*+-------------------------------------------------------------------------
  1718. X    sinit()
  1719. X--------------------------------------------------------------------------*/
  1720. Xvoid
  1721. Xsinit()
  1722. X{
  1723. X    if(fdswap >= 0)
  1724. X        return;
  1725. X    if((fdswap=open("/dev/swap",O_RDONLY)) < 0)
  1726. X#ifdef M_SYS5
  1727. X        leave_text("can't open /dev/swap (chgrp mem /dev/swap)",1);
  1728. X#else
  1729. X        leave_text("can't open /dev/swap (chgrp sys /dev/swap)",1);
  1730. X#endif
  1731. X
  1732. X}    /* end of sinit */
  1733. X
  1734. X/*+-------------------------------------------------------------------------
  1735. X    sread(caddr,maddr,len)
  1736. X--------------------------------------------------------------------------*/
  1737. Xvoid
  1738. Xsread(caddr,maddr,len)
  1739. Xcaddr_t caddr;
  1740. Xdaddr_t maddr;
  1741. Xint len;
  1742. X{
  1743. Xchar s80[80];
  1744. Xextern daddr_t myreadcnt;
  1745. X
  1746. X#if defined(M_I286)
  1747. X    maddr &= 0xFFFFL;
  1748. X#endif
  1749. X
  1750. X    if(fdswap == -2)
  1751. X        leave_text("sinit() not called",1);
  1752. X
  1753. X    if(lseek(fdswap,maddr,0) == -1L)
  1754. X    {
  1755. X        (void)sprintf(s80,"swap seek error addr %08lx",maddr);
  1756. X        leave_text(s80,1);
  1757. X    }
  1758. X
  1759. X    if(read(fdswap,caddr,len) != len)
  1760. X    {
  1761. X        (void)sprintf(s80,"swap read error len %d addr %08lx",len,maddr);
  1762. X        leave_text(s80,255);
  1763. X    }
  1764. X    myreadcnt += len;
  1765. X}    /* end of sread */
  1766. X
  1767. X/* vi: set tabstop=4 shiftwidth=4: */
  1768. SHAR_EOF
  1769. $TOUCH -am 0627015790 libswap.c &&
  1770. chmod 0644 libswap.c ||
  1771. echo "restore of libswap.c failed"
  1772. set `wc -c libswap.c`;Wc_c=$1
  1773. if test "$Wc_c" != "1964"; then
  1774.     echo original size 1964, current size $Wc_c
  1775. fi
  1776. # ============= libnlsym.c ==============
  1777. echo "x - extracting libnlsym.c (Text)"
  1778. sed 's/^X//' << 'SHAR_EOF' > libnlsym.c &&
  1779. X/*LINTLIBRARY*/
  1780. X/*+-------------------------------------------------------------------------
  1781. X    libnlsym.c -- common runtime for nlsym users
  1782. X    ...!emory!n4hgf!wht
  1783. X
  1784. X  Defined functions:
  1785. X    nlsym_error(text)
  1786. X    nlsym_read()
  1787. X
  1788. X--------------------------------------------------------------------------*/
  1789. X/*+:EDITS:*/
  1790. X/*:06-27-1990-01:57-wht@n4hgf-1.10 - incorporate suggestions from alpha testers */
  1791. X/*:06-27-1990-01:55-wht@n4hgf-use 64 bits of unique check */
  1792. X/*:06-25-1990-04:14-wht@n4hgf-1.02-better error handling */
  1793. X/*:06-24-1990-20:53-wht@n4hgf-v1.01-add ISC support thanks to peter@radig.de */
  1794. X/*:06-21-1990-14:26-r@n4hgf-version x0.12 seems bug free */
  1795. X/*:10-27-1988-11:44-wht-creation */
  1796. X
  1797. X#include <stdio.h>
  1798. X#include <sys/types.h>
  1799. X#include <sys/stat.h>
  1800. X#include <fcntl.h>
  1801. X#include <nlist.h>
  1802. X
  1803. Xvoid leave_text();
  1804. X
  1805. X#define DEFINE_NLSYM
  1806. X#include "nlsym.h"
  1807. X#include "libnlsym.h"
  1808. X
  1809. Xextern int errno;
  1810. Xextern char *sys_errlist[];
  1811. X
  1812. X/*+-------------------------------------------------------------------------
  1813. X    nlsym_error(text)
  1814. X--------------------------------------------------------------------------*/
  1815. Xvoid
  1816. Xnlsym_error(text)
  1817. Xchar *text;
  1818. X{
  1819. Xchar s128[128];
  1820. X
  1821. X    (void)strcpy(s128,text);
  1822. X    (void)strcat(s128,": run nlsym");
  1823. X    leave_text(s128,(errno) ? 255 : 1);
  1824. X}    /* end of nlsym_error */
  1825. X
  1826. X/*+-------------------------------------------------------------------------
  1827. X    nlsym_read()
  1828. X--------------------------------------------------------------------------*/
  1829. Xvoid
  1830. Xnlsym_read()
  1831. X{
  1832. Xchar s80[80];
  1833. Xint itmp;
  1834. Xint fdnlsym;
  1835. Xstruct stat curstat;    /* current /unix status */
  1836. Xstruct stat unixstat;        /* /unix status at nlsym run (void)time */
  1837. Xlong unique1 = 0;
  1838. Xlong unique2 = 0;
  1839. X
  1840. X    if(stat(UNIX_KERNEL,&curstat) < 0)
  1841. X    {
  1842. X        (void)sprintf(s80,"cannot stat %s",UNIX_KERNEL);
  1843. X        nlsym_error(s80);
  1844. X    }
  1845. X
  1846. X    errno = 0;
  1847. X    if((fdnlsym = open(UNIX_NLSYM,O_RDONLY,0)) < 0)
  1848. X    {
  1849. X        (void)sprintf(s80,"%s open error\n",UNIX_NLSYM);
  1850. X        nlsym_error(s80);
  1851. X    }
  1852. X
  1853. X    if(read(fdnlsym,(char *)&unixstat,sizeof(unixstat)) != sizeof(unixstat))
  1854. X        nlsym_error("nlsym_read: /unix stat read error");
  1855. X
  1856. X    if(read(fdnlsym,(char *)nlsym,sizeof(nlsym)) != sizeof(nlsym))
  1857. X        nlsym_error("nlsym_read: nlsym read error");
  1858. X
  1859. X    if(read(fdnlsym,(char *)&unique1,sizeof(unique1)) != sizeof(unique1))
  1860. X        nlsym_error("nlsym_read: `unique' read error");
  1861. X
  1862. X    if(read(fdnlsym,(char *)&unique2,sizeof(unique2)) != sizeof(unique2))
  1863. X        nlsym_error("nlsym_read: `unique' read error");
  1864. X
  1865. X    (void)close(fdnlsym);
  1866. X
  1867. X    if( (unique1 != NLSYM_UNIQUE1) ||
  1868. X        (unique2 != NLSYM_UNIQUE2) ||
  1869. X        (unixstat.st_ino != curstat.st_ino) ||
  1870. X        (unixstat.st_mtime != curstat.st_mtime) ||
  1871. X        (unixstat.st_size != curstat.st_size))
  1872. X    {
  1873. X        (void)sprintf(s80,"%s out of date",UNIX_NLSYM);
  1874. X        nlsym_error(s80);
  1875. X    }
  1876. X
  1877. X}    /* end of nlsym_read */
  1878. SHAR_EOF
  1879. $TOUCH -am 0627020090 libnlsym.c &&
  1880. chmod 0644 libnlsym.c ||
  1881. echo "restore of libnlsym.c failed"
  1882. set `wc -c libnlsym.c`;Wc_c=$1
  1883. if test "$Wc_c" != "2706"; then
  1884.     echo original size 2706, current size $Wc_c
  1885. fi
  1886. # ============= nlsym.c ==============
  1887. echo "x - extracting nlsym.c (Text)"
  1888. sed 's/^X//' << 'SHAR_EOF' > nlsym.c &&
  1889. X/*+-------------------------------------------------------------------------
  1890. X    nlsym.c -- utility nlist - fast access to kernel /dev/kmem offsets
  1891. X    ...!emory!n4hgf!wht
  1892. X
  1893. X  Defined functions:
  1894. X    main(argc,argv,envp)
  1895. X    nlsym_write_error(code)
  1896. X
  1897. X--------------------------------------------------------------------------*/
  1898. X/*+:EDITS:*/
  1899. X/*:06-27-1990-01:57-wht@n4hgf-1.10 - incorporate suggestions from alpha testers */
  1900. X/*:06-27-1990-01:55-wht@n4hgf-use 64 bits of unique check */
  1901. X/*:06-25-1990-04:14-wht@n4hgf-1.02-better error handling */
  1902. X/*:06-24-1990-20:53-wht@n4hgf-v1.01-add ISC support thanks to peter@radig.de */
  1903. X/*:06-21-1990-14:26-r@n4hgf-version x0.12 seems bug free */
  1904. X/*:05-12-1989-18:27-wht-fix endless loop error on cannot nlist */
  1905. X/*:10-27-1988-10:58-wht-creation */
  1906. X
  1907. X#include <stdio.h>
  1908. X#include <sys/types.h>
  1909. X#include <sys/stat.h>
  1910. X#include <fcntl.h>
  1911. X#include <nlist.h>
  1912. X
  1913. X#define DEFINE_NLSYM
  1914. X#include "nlsym.h"
  1915. X
  1916. X/*+-------------------------------------------------------------------------
  1917. X    nlsym_write_error(code)
  1918. X--------------------------------------------------------------------------*/
  1919. Xvoid
  1920. Xnlsym_write_error(code)
  1921. Xint code;
  1922. X{
  1923. X    (void)fprintf(stderr,"code %d: ",code);
  1924. X    perror(UNIX_NLSYM);
  1925. X    exit(1);
  1926. X}    /* end of nlsym_write_error */
  1927. X
  1928. X/*+-------------------------------------------------------------------------
  1929. X    main(argc,argv,envp)
  1930. X--------------------------------------------------------------------------*/
  1931. X/*ARGSUSED*/
  1932. Xmain(argc,argv,envp)
  1933. Xint argc;
  1934. Xchar **argv;
  1935. Xchar **envp;
  1936. X{
  1937. Xregister int itmp;
  1938. Xregister struct nlist *nn;
  1939. Xstruct stat unixstat;        /* /unix status at nlsym run (void)time */
  1940. Xint fdnlsym;
  1941. Xint nlist_error = 0;
  1942. Xlong unique;
  1943. XFILE *kludge;
  1944. X
  1945. X    (void)nlist(UNIX_KERNEL,nlsym);
  1946. X
  1947. X    nn = nlsym;
  1948. X    while(nn->n_name)
  1949. X    {
  1950. X        if(!nn->n_sclass)
  1951. X        {
  1952. X            (void)printf("%s: can't nlist\n", nn->n_name);
  1953. X            nlist_error = 1;
  1954. X            nn++;
  1955. X            continue;
  1956. X        }
  1957. X        (void)printf("%-12.12s  storage class: %04x value: %08lx\n",
  1958. X            nn->n_name,
  1959. X            nn->n_sclass,
  1960. X            nn->n_value);
  1961. X        nn++;
  1962. X    }
  1963. X
  1964. X    if(nlist_error)
  1965. X    {
  1966. X        (void)fprintf(stderr,"%s NOT produced\n",UNIX_NLSYM);
  1967. X        exit(1);
  1968. X    }
  1969. X
  1970. X    if((kludge = fopen(UNIX_NLSYM,"w")) == NULL)    /* scratch/create */
  1971. X        nlsym_write_error(-1);
  1972. X    (void)fclose(kludge);
  1973. X
  1974. X    if((fdnlsym = open(UNIX_NLSYM,O_WRONLY,0)) < 0)
  1975. X        nlsym_write_error(fdnlsym);
  1976. X
  1977. X    if(stat(UNIX_KERNEL,&unixstat) < 0)
  1978. X    {
  1979. X        (void)fputs("cannot stat ",stderr);
  1980. X        perror(UNIX_KERNEL);
  1981. X        exit(1);
  1982. X    }
  1983. X
  1984. X    if((itmp = write(fdnlsym,&unixstat,sizeof(unixstat))) != sizeof(unixstat))
  1985. X        nlsym_write_error(itmp);
  1986. X
  1987. X    if((itmp = write(fdnlsym,nlsym,sizeof(nlsym))) != sizeof(nlsym))
  1988. X        nlsym_write_error(itmp);
  1989. X
  1990. X    unique = NLSYM_UNIQUE1;
  1991. X    if((itmp = write(fdnlsym,&unique,sizeof(unique))) != sizeof(unique))
  1992. X        nlsym_write_error(itmp);
  1993. X
  1994. X    unique = NLSYM_UNIQUE2;
  1995. X    if((itmp = write(fdnlsym,&unique,sizeof(unique))) != sizeof(unique))
  1996. X        nlsym_write_error(itmp);
  1997. X
  1998. X    (void)close(fdnlsym);
  1999. X    exit(0);
  2000. X    /*NOTREACHED*/
  2001. X}    /* end of main */
  2002. X
  2003. X/* vi: set tabstop=4 shiftwidth=4: */
  2004. SHAR_EOF
  2005. $TOUCH -am 0627015790 nlsym.c &&
  2006. chmod 0644 nlsym.c ||
  2007. echo "restore of nlsym.c failed"
  2008. set `wc -c nlsym.c`;Wc_c=$1
  2009. if test "$Wc_c" != "2933"; then
  2010.     echo original size 2933, current size $Wc_c
  2011. fi
  2012. # ============= proc.c ==============
  2013. echo "x - extracting proc.c (Text)"
  2014. sed 's/^X//' << 'SHAR_EOF' > proc.c &&
  2015. X/*+-------------------------------------------------------------------------
  2016. X    proc.c - u386mon proc table functions
  2017. X
  2018. X  Defined functions:
  2019. X    display_proc(win,y,x)
  2020. X    grok_proc()
  2021. X    pstat_text(pstat)
  2022. X
  2023. X--------------------------------------------------------------------------*/
  2024. X/*+:EDITS:*/
  2025. X/*:06-27-1990-01:57-wht@n4hgf-1.10 - incorporate suggestions from alpha testers */
  2026. X/*:06-25-1990-04:14-wht@n4hgf-1.02-better error handling */
  2027. X/*:06-24-1990-20:53-wht@n4hgf-v1.01-add ISC support thanks to peter@radig.de */
  2028. X/*:06-21-1990-14:26-r@n4hgf-version x0.12 seems bug free */
  2029. X/*:06-17-1990-16:46-wht-creation */
  2030. X
  2031. X#define M_TERMINFO
  2032. X
  2033. X#include <curses.h>
  2034. X#include <panel.h>
  2035. X#include <sys/types.h>
  2036. X#undef NGROUPS_MAX
  2037. X#undef NULL
  2038. X#include <sys/param.h>
  2039. X#include <sys/immu.h>
  2040. X#include <sys/region.h>
  2041. X#include <sys/proc.h>
  2042. X#include <sys/var.h>
  2043. X#include <nlist.h>
  2044. X#include "nlsym.h"
  2045. X#include "libkmem.h"
  2046. X#include "libnlsym.h"
  2047. X#include "u386mon.h"
  2048. X
  2049. Xextern struct var v;
  2050. X
  2051. Xstruct proc *procs = (struct proc *)0;
  2052. Xstruct proc *oldprocs = (struct proc *)0;
  2053. X
  2054. Xint procs_per_pstat[SXBRK + 1];
  2055. Xint procs_in_core;
  2056. Xint procs_alive;
  2057. X
  2058. X/*+-------------------------------------------------------------------------
  2059. X    pstat_text(pstat)
  2060. X--------------------------------------------------------------------------*/
  2061. Xchar *
  2062. Xpstat_text(pstat)
  2063. Xchar pstat;
  2064. X{
  2065. Xstatic char errant[10];
  2066. X
  2067. X    switch(pstat)
  2068. X    {
  2069. X        case SSLEEP:   return("sleep ");
  2070. X        case SRUN:     return("run   ");
  2071. X        case SZOMB:    return("zombie");
  2072. X        case SSTOP:    return("stop  ");
  2073. X        case SIDL:     return("idle  ");
  2074. X        case SONPROC:  return("onproc");
  2075. X        case SXBRK:    return("xbrk  ");
  2076. X    }
  2077. X    (void)sprintf(errant,"%06u?",(unsigned char)pstat);
  2078. X    return(errant);
  2079. X
  2080. X}    /* end of pstat_text */
  2081. X
  2082. X/*+-------------------------------------------------------------------------
  2083. X    grok_proc() - read and examine kernel process table
  2084. X--------------------------------------------------------------------------*/
  2085. Xvoid
  2086. Xgrok_proc()
  2087. X{
  2088. Xregister iproc;
  2089. Xregister struct proc *pp;
  2090. X
  2091. X    if(!procs)
  2092. X    {
  2093. X        if(!(procs = (struct proc *)malloc(sizeof(struct proc) * v.v_proc)))
  2094. X            leave_text("cannot alloc memory for proc table",1);
  2095. X        if(!(oldprocs = (struct proc *)malloc(sizeof(struct proc) * v.v_proc)))
  2096. X            leave_text("cannot alloc memory for proc table",1);
  2097. X    }
  2098. X    kread((caddr_t)procs,procaddr,sizeof(struct proc) * v.v_proc);
  2099. X    for(iproc = 0; iproc < SXBRK + 1; iproc++)
  2100. X        procs_per_pstat[iproc] = 0;
  2101. X    procs_in_core = 0;
  2102. X    procs_alive = 0;
  2103. X
  2104. X    for(iproc = 0; iproc < v.v_proc; iproc++)
  2105. X    {
  2106. X        pp = procs + iproc;
  2107. X
  2108. X        if(pp->p_stat)
  2109. X            procs_alive++;
  2110. X
  2111. X        procs_per_pstat[pp->p_stat]++;    /* count # procs in each state */
  2112. X
  2113. X        if(pp->p_flag & SLOAD)            /* count # procs in memory */
  2114. X            procs_in_core++;
  2115. X    }
  2116. X
  2117. X}    /* end of grok_proc */
  2118. X
  2119. X/*+-------------------------------------------------------------------------
  2120. X    display_proc(win,y,x)
  2121. X--------------------------------------------------------------------------*/
  2122. Xvoid
  2123. Xdisplay_proc(win,y,x)
  2124. XWINDOW *win;
  2125. Xint y;
  2126. Xint x;
  2127. X{
  2128. Xregister istat;
  2129. X
  2130. X    grok_proc();
  2131. X
  2132. X    use_cp(win,cpBANNER);
  2133. X    wmove(win,y++,x);
  2134. X    waddstr(win,"-- Proc ---");
  2135. X    for(istat = SSLEEP; istat <= SXBRK; istat++)
  2136. X    {
  2137. X        wmove(win,y++,x);
  2138. X        disp_info_int(win,pstat_text(istat),"  %3d",procs_per_pstat[istat]);
  2139. X    }
  2140. X    wmove(win,y++,x);
  2141. X    disp_info_int(win,"total ","  %3d",procs_alive);
  2142. X    wmove(win,y++,x);
  2143. X    disp_info_int(win,"in mem","  %3d",procs_in_core);
  2144. X}    /* end of display_proc */
  2145. X
  2146. X/* vi: set tabstop=4 shiftwidth=4: */
  2147. X/* end of proc.c */
  2148. SHAR_EOF
  2149. $TOUCH -am 0627015790 proc.c &&
  2150. chmod 0644 proc.c ||
  2151. echo "restore of proc.c failed"
  2152. set `wc -c proc.c`;Wc_c=$1
  2153. if test "$Wc_c" != "3411"; then
  2154.     echo original size 3411, current size $Wc_c
  2155. fi
  2156. echo "End of part 2, continue with part 3"
  2157. exit 0
  2158.  
  2159.