home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume22 / u386mon / part05 < prev    next >
Text File  |  1991-08-13  |  40KB  |  1,388 lines

  1. Newsgroups: comp.sources.misc
  2. From: Warren Tucker <wht@n4hgf.Mt-Park.GA.US>
  3. Subject:  v22i007:  u386mon - Sys V Rel 3.x Performance Monitor rev 2.40, Part05/07
  4. Message-ID: <1991Aug14.011702.15396@sparky.IMD.Sterling.COM>
  5. X-Md4-Signature: 3c497f5ae09dc3210a1e60ef40978ac4
  6. Date: Wed, 14 Aug 1991 01:17:02 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: Warren Tucker <wht@n4hgf.Mt-Park.GA.US>
  10. Posting-number: Volume 22, Issue 7
  11. Archive-name: u386mon/part05
  12. Environment: SYSVR3
  13. Supersedes: u386mon-2.20: Volume 14, Issue 54-58
  14.  
  15. #!/bin/sh
  16. # This is part 05 of u386mon.3.40
  17. # ============= det_stream.c ==============
  18. if test -f 'det_stream.c' -a X"$1" != X"-c"; then
  19.     echo 'x - skipping det_stream.c (File already exists)'
  20. else
  21. echo 'x - extracting det_stream.c (Text)'
  22. sed 's/^X//' << 'SHAR_EOF' > 'det_stream.c' &&
  23. X/*+-------------------------------------------------------------------------
  24. X    det_stream.c - UNIX V/386 system monitor stream usage detail
  25. X    martin@hppcmart.grenoble.hp.com
  26. X
  27. X00000000001111111111222222222233333333334444444444555555555566666666667777777777
  28. X01234567890123456789012345678901234567890123456789012345678901234567890123456789
  29. XResource             Config Alloc Fail -- (% of resource used) -----------------
  30. X#################### ###### ##### #### ######################################### 
  31. X  Defined functions:
  32. X
  33. X--------------------------------------------------------------------------*/
  34. X/*+:EDITS:*/
  35. X/*:08-01-1991-23:34-wht@n4hgf-release 3.40 source control point */
  36. X/*:05-15-1991-17:22-wht@n4hgf-2.3 patches for SVR31 from nba@sysware.dk */
  37. X/*:02-07-1991-13:30-martin@hppcmart-creation */
  38. X
  39. X#define M_TERMINFO
  40. X
  41. X#include <curses.h>
  42. X#ifdef NATIVE_PANELS
  43. X# include <panel.h>
  44. X#else
  45. X# include "libpanel.h"
  46. X#endif
  47. X#include <string.h>
  48. X#include <nlist.h>
  49. X#include <sys/types.h>
  50. X#include <sys/stat.h>
  51. X/*
  52. X#include <sys/ascii.h>
  53. X*/
  54. X#include <sys/var.h>
  55. X#undef NGROUPS_MAX
  56. X#undef NULL
  57. X#include <sys/param.h>
  58. X#include <sys/stream.h>
  59. X#include <sys/strstat.h>
  60. X
  61. X#include "nlsym.h"
  62. X#include "libkmem.h"
  63. X#include "libmem.h"
  64. X#include "libswap.h"
  65. X#include "libnlsym.h"
  66. X#include "u386mon.h"
  67. X
  68. Xextern struct var v;
  69. Xunsigned stream_size[NCLASS+4];
  70. Xushort rbsize[NCLASS];
  71. Xstruct strstat strst;
  72. X
  73. X#define _NDX_STREAMS    0
  74. X#define _NDX_QUEUES        1
  75. X#define _NDX_MESSAGES    2
  76. X#define    _NDX_NBLK        3
  77. X#define _NDX_NBLK4        4
  78. X#define _NDX_NBLK16        5
  79. X#define _NDX_NBLK64        6
  80. X#define _NDX_NBLK128    7
  81. X#define _NDX_NBLK256    8
  82. X#define _NDX_NBLK512    9
  83. X#define _NDX_NBLK1024    10
  84. X#define _NDX_NBLK2048    11
  85. X#define _NDX_NBLK4096    12
  86. X
  87. X/*+----------------------------------------------------------------------------
  88. X    init_stream()
  89. X-----------------------------------------------------------------------------*/
  90. Xvoid
  91. Xinit_stream()
  92. X{
  93. X    int nmblock, i;
  94. X
  95. X    kread((caddr_t) rbsize, rbsizeaddr, sizeof(ushort) * NCLASS);
  96. X    stream_size[_NDX_STREAMS]=v.v_nstream;
  97. X    stream_size[_NDX_QUEUES]=v.v_nqueue;
  98. X    kread((caddr_t) &nmblock, nmblockaddr, sizeof(int));
  99. X    stream_size[_NDX_MESSAGES]=nmblock;
  100. X    stream_size[_NDX_NBLK4]=v.v_nblk4;    
  101. X    stream_size[_NDX_NBLK16]=v.v_nblk16;    
  102. X    stream_size[_NDX_NBLK64]=v.v_nblk64;    
  103. X    stream_size[_NDX_NBLK128]=v.v_nblk128;    
  104. X    stream_size[_NDX_NBLK256]=v.v_nblk256;    
  105. X    stream_size[_NDX_NBLK512]=v.v_nblk512;    
  106. X    stream_size[_NDX_NBLK1024]=v.v_nblk1024;    
  107. X    stream_size[_NDX_NBLK2048]=v.v_nblk2048;    
  108. X    stream_size[_NDX_NBLK4096]=v.v_nblk4096;    
  109. X    stream_size[_NDX_NBLK]=0;
  110. X    for(i=_NDX_NBLK4; i<=_NDX_NBLK4096; i++)
  111. X        stream_size[_NDX_NBLK]+=stream_size[i];
  112. X}
  113. X
  114. X/*+----------------------------------------------------------------------------
  115. X    draw_streamscale_literals(win, y, x);
  116. X
  117. X00000000001111111111222222222233333333334444444444555555555566666666667777777777
  118. X01234567890123456789012345678901234567890123456789012345678901234567890123456789
  119. XResource             Config Alloc Fail -- (% of resource used) -----------------
  120. XStreams              ###### ##### #### #########################################
  121. XQueues
  122. XMessage blocks
  123. XData blocks
  124. XData block size ####
  125. X-----------------------------------------------------------------------------*/
  126. X
  127. Xvoid
  128. Xdraw_streamscale_literals(win, y, x)
  129. XWINDOW *win;
  130. Xint y, x;
  131. X
  132. X{
  133. X    static char *header = 
  134. X"Resource            Config Alloc  Fail -- (% of resource used) ";
  135. X    int x2, i;
  136. X
  137. X    wmove(win, y, x);
  138. X    use_cp(win, cpBANNER);
  139. X    waddstr(win, header);
  140. X    getyx(win,y,x2);
  141. X    while (x2++ <= COLS)
  142. X        waddch(win, (chtype)'-');
  143. X    use_cp(win,cpLIT);
  144. X    clear_area(win,getmaxy(win)-1,0,getmaxx(win));
  145. X    mvwaddstr(win, y + 1, x, "Streams");
  146. X    mvwaddstr(win, y + 2, x, "Queues");
  147. X    mvwaddstr(win, y + 3, x, "Message blocks");
  148. X    mvwaddstr(win, y + 4, x, "Data blocks");
  149. X    for (i=0; i<NCLASS; i++)
  150. X        mvwprintw(win, (y+i+5), x, "Data block size %4lu", rbsize[i]);
  151. X} 
  152. X
  153. X/*+----------------------------------------------------------------------------
  154. X    update_streamscale(win, y, x, width);
  155. X
  156. X00000000001111111111222222222233333333334444444444555555555566666666667777777777
  157. X01234567890123456789012345678901234567890123456789012345678901234567890123456789
  158. XConf  Alloc Fail  -- (% of resource used) -----------------
  159. X##### ##### ##### #########################################
  160. X-----------------------------------------------------------------------------*/
  161. X#define _STREAM_CO    0
  162. X#define _STREAM_AL    6
  163. X#define _STREAM_FA    12
  164. X#define _STREAM_SX    18
  165. X
  166. Xvoid
  167. Xupdate_streamscale(win, y, x, width)
  168. XWINDOW *win;
  169. Xint y, x;
  170. Xint width;
  171. X
  172. X{
  173. X    int percent_used, percent_max;
  174. X    int i, itmp, max;
  175. X    alcdat    *strdat;
  176. X
  177. X    kread((caddr_t)&strst, strstaddr, sizeof(struct strstat));
  178. X    strdat=(alcdat *)&strst;
  179. X    for (i=0; i<NCLASS+4; i++) {
  180. X        percent_used=stream_size[i] ? (strdat->use*100/stream_size[i]) : 0;
  181. X        percent_max=stream_size[i] ? (strdat->max*100/stream_size[i]) : 0;
  182. X        use_cp(win, cpINFO);
  183. X        mvwprintw(win, y+i, _STREAM_CO+x, "%5i", stream_size[i]);
  184. X        mvwprintw(win, y+i, _STREAM_AL+x, "%5i", strdat->use);
  185. X        if (strdat->fail)
  186. X            use_cp(win, cpHIGH);
  187. X        else
  188. X            use_cp(win, cpINFO);
  189. X        mvwprintw(win, y+i, _STREAM_FA+x, "%5i", strdat->fail);
  190. X        wmove(win, y+i, _STREAM_SX+x);
  191. X
  192. X        if (percent_used < 70)
  193. X            use_cp(win, cpLOW);
  194. X        else if (percent_used < 90)
  195. X            use_cp(win, cpMED);
  196. X        else
  197. X            use_cp(win, cpHIGH);
  198. X
  199. X        itmp=(width * percent_used) / 100;
  200. X        max=(width * percent_max) / 100;
  201. X        while (-1) {
  202. X            itmp--;max--;
  203. X            if (max<1) {
  204. X                use_cp(win, cpHIGH);
  205. X                waddch(win, (chtype)'M');
  206. X                break;
  207. X            }
  208. X            if (itmp>-1)
  209. X                waddch(win, (chtype)'-');
  210. X            else
  211. X                waddch(win, (chtype)' ');
  212. X        }
  213. X
  214. X        wclrtoeol(win);
  215. X        strdat++;
  216. X    }
  217. X}
  218. X
  219. X/* vi: set tabstop=4 shiftwidth=4: */
  220. X/* end of det_stream.c */
  221. SHAR_EOF
  222. chmod 0644 det_stream.c ||
  223. echo 'restore of det_stream.c failed'
  224. Wc_c="`wc -c < 'det_stream.c'`"
  225. test 5617 -eq "$Wc_c" ||
  226.     echo 'det_stream.c: original size 5617, current size' "$Wc_c"
  227. fi
  228. # ============= det_table.c ==============
  229. if test -f 'det_table.c' -a X"$1" != X"-c"; then
  230.     echo 'x - skipping det_table.c (File already exists)'
  231. else
  232. echo 'x - extracting det_table.c (Text)'
  233. sed 's/^X//' << 'SHAR_EOF' > 'det_table.c' &&
  234. X/*+-------------------------------------------------------------------------
  235. X    det_table.c - UNIX V/386 system monitor table usage detail
  236. X    martin@hppcmart.grenoble.hp.com
  237. X
  238. X00000000001111111111222222222233333333334444444444555555555566666666667777777777
  239. X01234567890123456789012345678901234567890123456789012345678901234567890123456789
  240. XResource             Config Alloc Fail -- (% of resource used) -----------------
  241. X#################### ###### ##### #### ######################################### 
  242. X  Defined functions:
  243. Xfiles_in_use()
  244. Xinodes_in_use()
  245. Xupdate_table_line(win, y, x, width, num_item, max_item, conf_item, percent_item)
  246. Xinit_table()
  247. Xdraw_table_literals(win,y,x)
  248. X
  249. X--------------------------------------------------------------------------*/
  250. X/*+:EDITS:*/
  251. X/*:08-01-1991-23:34-wht@n4hgf-release 3.40 source control point */
  252. X/*:05-15-1991-17:22-wht@n4hgf-2.3 patches for SVR31 from nba@sysware.dk */
  253. X/*:02-07-1991-13:30-martin@hppcmart-creation */
  254. X
  255. X#define M_TERMINFO
  256. X
  257. X#include <curses.h>
  258. X#ifdef NATIVE_PANELS
  259. X# include <panel.h>
  260. X#else
  261. X# include "libpanel.h"
  262. X#endif
  263. X#include <string.h>
  264. X#include <nlist.h>
  265. X#include <sys/types.h>
  266. X#include <sys/stat.h>
  267. X/*
  268. X#include <sys/ascii.h>
  269. X*/
  270. X#include <sys/var.h>
  271. X#undef NGROUPS_MAX
  272. X#undef NULL
  273. X#include <sys/param.h>
  274. X#include <sys/inode.h>
  275. X#include <sys/file.h>
  276. X#include <sys/fcntl.h>
  277. X#include <sys/flock.h>
  278. X#include <sys/immu.h>
  279. X#include <sys/region.h>
  280. X#include <sys/callo.h>
  281. X
  282. X#include "nlsym.h"
  283. X#include "libkmem.h"
  284. X#include "libmem.h"
  285. X#include "libswap.h"
  286. X#include "libnlsym.h"
  287. X#include "u386mon.h"
  288. X
  289. Xextern struct var v;
  290. Xstruct file *fpbase;
  291. Xstruct inode *ipbase;
  292. Xstruct flckinfo flckinfo;
  293. Xstruct region *rgbase;
  294. Xstruct callo *callbase;
  295. Xint max_files=0;
  296. Xint max_inodes=0;
  297. Xint max_locks=0;
  298. Xint max_regions=0;
  299. Xint max_callouts=0;
  300. X
  301. X/*+-------------------------------------------------------------------------
  302. X    files_in_use()
  303. X
  304. X    Returns the number of files in use or -1 if the free list
  305. X    pointers were munged when read which happens every now and then.
  306. X--------------------------------------------------------------------------*/
  307. Xstatic int
  308. Xfiles_in_use()
  309. X{
  310. X    struct file *fp, *fflist;
  311. X    register int cnt=0;
  312. X    unsigned int ndx;
  313. X
  314. X    kread((caddr_t) fpbase, fileaddr, sizeof(struct file)*v.v_file);
  315. X    kread((caddr_t) &fflist, ffreelistaddr, sizeof(struct file *));
  316. X    fp=fpbase + (fflist - (struct file *)fileaddr);
  317. X    while (1) {
  318. X        cnt++;
  319. X        if (fp->f_next == 0) break;
  320. X        ndx=fp->f_next - (struct file *)fileaddr;
  321. X        if ((ndx >= v.v_file) || (ndx < 0) || (cnt > v.v_file)) return(-1);
  322. X        fp=fpbase + ndx;
  323. X            
  324. X    }
  325. X    return(v.v_file-cnt);
  326. X}
  327. X
  328. X/*+-------------------------------------------------------------------------
  329. X    inodes_in_use()
  330. X
  331. X    Returns the number of inodes used or -1 if the free list
  332. X    pointers were munged when read which happens every now and then.
  333. X--------------------------------------------------------------------------*/
  334. X
  335. Xstatic int
  336. Xinodes_in_use()
  337. X{
  338. X    struct inode *ip, *iflistend;
  339. X    struct ifreelist iflist;
  340. X    register int cnt=0;
  341. X    int ndx;
  342. X
  343. X    kread((caddr_t) ipbase, inodeaddr, sizeof(struct inode)*v.v_inode);
  344. X    kread((caddr_t) &iflist, ifreelistaddr, sizeof(struct ifreelist));
  345. X    ip=ipbase + (iflist.av_forw - (struct inode *)inodeaddr);
  346. X    iflistend=ipbase + (iflist.av_back - (struct inode *)inodeaddr);
  347. X    while (1) {
  348. X        cnt++;
  349. X        if (ip==iflistend) break;
  350. X        ndx=ip->av_forw - (struct inode *)inodeaddr;
  351. X        if ((ndx >= v.v_inode) || (ndx < 0) || (cnt > v.v_inode)) return(-1);
  352. X        ip=ipbase + ndx;
  353. X    }
  354. X    return(v.v_inode-cnt);
  355. X}
  356. X
  357. X/*+-------------------------------------------------------------------------
  358. X    regions_in_use()
  359. X
  360. X    Returns the number of regions used or -1 if the free list
  361. X    pointers were munged when read which happens every now and then.
  362. X--------------------------------------------------------------------------*/
  363. X
  364. Xstatic int
  365. Xregions_in_use()
  366. X{
  367. X    struct region *rg, ractive;
  368. X    register int cnt=0;
  369. X    int ndx;
  370. X
  371. X    kread((caddr_t) rgbase, regionaddr, sizeof(struct region)*v.v_region);
  372. X    kread((caddr_t) &ractive, ractiveaddr, sizeof(struct region));
  373. X    rg=rgbase + (ractive.r_forw - (struct region *)regionaddr);
  374. X    while (1) {
  375. X        cnt++;
  376. X        if (rg->r_forw==(struct region *)ractiveaddr) break;
  377. X        ndx=rg->r_forw - (struct region *)regionaddr;
  378. X        if ((ndx >= v.v_region) || (ndx < 0) || (cnt > v.v_region)) return(-1);
  379. X        rg=rgbase + ndx;
  380. X    }
  381. X    return(cnt);
  382. X}
  383. X
  384. X/*+-------------------------------------------------------------------------
  385. X    callouts_in_use()
  386. X
  387. X    Returns the number of callouts used.
  388. X--------------------------------------------------------------------------*/
  389. X
  390. Xstatic int
  391. Xcallouts_in_use()
  392. X{
  393. X    struct callo *call;
  394. X    register int cnt=0;
  395. X    register int ndx=0;
  396. X
  397. X    kread((caddr_t) callbase, calloutaddr, sizeof(struct callo)*v.v_call);
  398. X    call=callbase;
  399. X    while (ndx<v.v_call) {
  400. X        ndx++; call++;
  401. X                /* This is a guess - I'm checking it with SCO */
  402. X        if (call->c_id>0) cnt++;
  403. X    }
  404. X    return(cnt);
  405. X}
  406. X
  407. X
  408. X
  409. X/*+-------------------------------------------------------------------------
  410. X    update_table_line(win)
  411. X00000000001111111111222222222233333333334444444444555555555566666666667777777777
  412. X01234567890123456789012345678901234567890123456789012345678901234567890123456789
  413. Xtual total %used ------------------------------------------------
  414. X####  ####   ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  415. X--------------------------------------------------------------------------*/
  416. X
  417. X#define _TABLESCALE_AC    0
  418. X#define _TABLESCALE_TO    6
  419. X#define _TABLESCALE_PE    13
  420. X#define _TABLESCALE_SX    17
  421. X
  422. Xstatic void
  423. Xupdate_table_line(win, y, x, width, num_item, max_item, conf_item, percent_item)
  424. XWINDOW *win;
  425. Xint y;
  426. Xint x;
  427. Xint width;
  428. Xint num_item;
  429. Xint max_item;
  430. Xint conf_item;
  431. Xint percent_item;
  432. X
  433. X{
  434. X    int itmp, max;
  435. X
  436. X    if (num_item<0) {
  437. X
  438. X        wmove(win, y, x + _TABLESCALE_AC);
  439. X        use_cp(win, cpHIGH);
  440. X        waddstr(win, "OVER");
  441. X
  442. X    } else {
  443. X
  444. X        wmove(win,y, x + _TABLESCALE_AC);
  445. X        use_cp(win,cpINFO);
  446. X        wprintw(win,"%4ld",num_item);
  447. X
  448. X        wmove(win,y, x + _TABLESCALE_TO);
  449. X        use_cp(win,cpINFO);
  450. X        wprintw(win,"%4ld",conf_item);
  451. X
  452. X        wmove(win,y, x + _TABLESCALE_PE);
  453. X        if(percent_item < 70)
  454. X            use_cp(win,cpLOW);
  455. X        else if(percent_item < 90)
  456. X            use_cp(win,cpMED);
  457. X        else
  458. X            use_cp(win,cpHIGH);
  459. X        wprintw(win,"%3ld", percent_item);
  460. X
  461. X        wmove(win,y, x + _TABLESCALE_SX);
  462. X
  463. X        itmp = (width * percent_item) / 100;
  464. X        max = (width * max_item) / 100;
  465. X        while(-1) {
  466. X            itmp--; max--;
  467. X            if (max<1) {
  468. X                use_cp(win,cpHIGH);
  469. X                waddch(win,(chtype)'M');
  470. X                break;
  471. X            }
  472. X            if (itmp>-1)
  473. X                waddch(win,(chtype)'-');
  474. X            else
  475. X                waddch(win,(chtype)' ');
  476. X        }
  477. X        wclrtoeol(win);
  478. X    }
  479. X}
  480. X            
  481. X
  482. X
  483. X/*+-------------------------------------------------------------------------
  484. X    init_table()
  485. X
  486. X--------------------------------------------------------------------------*/
  487. X
  488. Xvoid
  489. Xinit_table()
  490. X
  491. X{
  492. X    if (!(fpbase = (struct file *) malloc(sizeof(struct file)*v.v_file)))
  493. X        leave_text("cannot alloc memory for file table",1);
  494. X    if (!(ipbase = (struct inode *) malloc(sizeof(struct inode)*v.v_inode)))
  495. X        leave_text("cannot alloc memory for inode table",1);
  496. X    if (!(rgbase = (struct region *) malloc(sizeof(struct region)*v.v_region)))
  497. X        leave_text("cannot alloc memory for region table",1);
  498. X    if (!(callbase = (struct callo *) malloc(sizeof(struct callo)*v.v_call)))
  499. X        leave_text("cannot alloc memory for region table",1);
  500. X}
  501. X
  502. X/*+-------------------------------------------------------------------------
  503. X    update_table(win,y,x,width)
  504. X
  505. X--------------------------------------------------------------------------*/
  506. X
  507. Xvoid
  508. Xupdate_table(win,y,x,width)
  509. XWINDOW *win;
  510. Xint y;
  511. Xint x;
  512. Xregister width;
  513. X{
  514. X    int num_files;
  515. X    int num_inodes;
  516. X    int num_regions;
  517. X    int num_callouts;
  518. X    int percent_files;
  519. X    int percent_inodes;
  520. X    int percent_locks;
  521. X    int percent_regions;
  522. X    int percent_callouts;
  523. X
  524. X    num_files=files_in_use();
  525. X    num_inodes=inodes_in_use();
  526. X    num_regions=regions_in_use();
  527. X    num_callouts=callouts_in_use();
  528. X    kread((caddr_t)&flckinfo, flckinfoaddr, sizeof(struct flckinfo));
  529. X    num_callouts=callouts_in_use();
  530. X
  531. X    percent_files=(num_files * 100 / v.v_file);
  532. X    percent_inodes=(num_inodes * 100 / v.v_inode);
  533. X    percent_regions=(num_regions * 100 / v.v_region);
  534. X    percent_locks=flckinfo.recs ? (flckinfo.reccnt * 100 / flckinfo.recs) : 0;
  535. X    percent_callouts=( num_callouts * 100 / v.v_call);
  536. X    if(percent_files > max_files) max_files=percent_files;
  537. X    if(percent_inodes > max_inodes) max_inodes=percent_inodes;
  538. X    if(percent_locks > max_locks) max_locks=percent_locks;
  539. X    if(percent_regions > max_regions) max_regions=percent_regions;
  540. X    if(percent_callouts > max_callouts) max_callouts=percent_callouts;
  541. X
  542. X    update_table_line(win, y, x, width,
  543. X            num_files, max_files, v.v_file, percent_files);
  544. X    update_table_line(win, y + 1, x, width,
  545. X            num_inodes, max_inodes, v.v_inode, percent_inodes);
  546. X    update_table_line(win, y + 2, x, width,
  547. X            flckinfo.reccnt, max_locks, flckinfo.recs, percent_locks);
  548. X    update_table_line(win, y + 3, x, width,
  549. X            num_regions, max_regions, v.v_region, percent_regions);
  550. X    update_table_line(win, y + 4, x, width,
  551. X            num_callouts, max_callouts, v.v_call, percent_callouts);
  552. X    return;
  553. X}    /* end of update_table */
  554. X
  555. X
  556. X/*+-------------------------------------------------------------------------
  557. X    draw_table_literals(win)
  558. X00000000001111111111222222222233333333334444444444555555555566666666667777777777
  559. X01234567890123456789012345678901234567890123456789012345678901234567890123456789
  560. XResource     actual total %used ------------------------------------------------
  561. X############   ####  ####   ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  562. X--------------------------------------------------------------------------*/
  563. Xvoid
  564. Xdraw_table_literals(win,y,x)
  565. XWINDOW *win;
  566. Xint y;
  567. Xint x;
  568. X{
  569. Xint x2 = x;
  570. X
  571. X    wmove(win,y,x);
  572. X    use_cp(win,cpBANNER);
  573. X    waddstr(win,"Resource     actual total %used ");
  574. X    getyx(win,y,x2);
  575. X    while(x2 < COLS)
  576. X        waddch(win,(chtype)'-'),x2++;
  577. X    use_cp(win,cpLIT);
  578. X    wmove(win,y + 1,x);
  579. X      waddstr(win,"File table ");
  580. X    wmove(win,y + 2,x);
  581. X      waddstr(win,"Inode table");
  582. X    wmove(win,y + 3,x);
  583. X    waddstr(win,"Lock table ");
  584. X    wmove(win,y + 4,x);
  585. X    waddstr(win,"Region table ");
  586. X    wmove(win,y + 5,x);
  587. X    waddstr(win,"Callout table ");
  588. X
  589. X}    /* end of draw_table_literals */
  590. SHAR_EOF
  591. chmod 0644 det_table.c ||
  592. echo 'restore of det_table.c failed'
  593. Wc_c="`wc -c < 'det_table.c'`"
  594. test 9982 -eq "$Wc_c" ||
  595.     echo 'det_table.c: original size 9982, current size' "$Wc_c"
  596. fi
  597. # ============= det_wd.c ==============
  598. if test -f 'det_wd.c' -a X"$1" != X"-c"; then
  599.     echo 'x - skipping det_wd.c (File already exists)'
  600. else
  601. echo 'x - extracting det_wd.c (Text)'
  602. sed 's/^X//' << 'SHAR_EOF' > 'det_wd.c' &&
  603. X#ifdef SCO322
  604. X/*+-------------------------------------------------------------------------
  605. X    det_wd.c - UNIX V/386 system monitor WD disk controller usage detail
  606. X    martin@hppcmart.grenoble.hp.com
  607. X
  608. X00000000001111111111222222222233333333334444444444555555555566666666667777777777
  609. X01234567890123456789012345678901234567890123456789012345678901234567890123456789
  610. XDevice  Av Q  r+w/s Blks/s -- (% Utilization) ----------------------------------
  611. X######  ##### ##### #####  ##################################################### 
  612. X  Defined functions:
  613. X
  614. X--------------------------------------------------------------------------*/
  615. X/*+:EDITS:*/
  616. X/*:08-01-1991-23:34-wht@n4hgf-release 3.40 source control point */
  617. X/*:02-07-1991-13:30-martin@hppcmart-creation */
  618. X
  619. X#define M_TERMINFO
  620. X
  621. X#include <curses.h>
  622. X#include <panel.h>
  623. X#include <string.h>
  624. X#include <nlist.h>
  625. X#include <sys/types.h>
  626. X#include <sys/stat.h>
  627. X#include <sys/ascii.h>
  628. X#include <sys/var.h>
  629. X#undef NGROUPS_MAX
  630. X#undef NULL
  631. X#include <sys/param.h>
  632. X#include <sys/elog.h>
  633. X
  634. X#include "nlsym.h"
  635. X#include "libkmem.h"
  636. X#include "libmem.h"
  637. X#include "libswap.h"
  638. X#include "libnlsym.h"
  639. X#include "u386mon.h"
  640. X
  641. Xextern struct var v;
  642. X
  643. X/* WD Driver */
  644. X#define NCTLR        2
  645. X#define NWD            2
  646. X#define NWDTOTAL    NCTLR*NWD
  647. X/* Floppy drives */
  648. X#define NDRIVES        4
  649. X    
  650. Xstatic int max_util[NWDTOTAL+NDRIVES];
  651. Xstatic struct     iotime    ia[NWDTOTAL+NDRIVES],ialast[NWDTOTAL+NDRIVES];
  652. Xstatic time_t     timelast,now;
  653. X/*+----------------------------------------------------------------------------
  654. X    init_wd();
  655. X    Get initial drive stats.
  656. X-----------------------------------------------------------------------------*/
  657. Xvoid
  658. Xinit_wd()
  659. X{
  660. X    register i;
  661. X
  662. X    (void)time(&timelast);
  663. X    for(i=0;i<(NWDTOTAL+NDRIVES);i++)
  664. X        max_util[i]=0;
  665. X    kread((caddr_t) ialast,wd1010statsaddr,sizeof(struct iotime) * NCTLR * NWD);
  666. X    kread((caddr_t) &ialast[NWDTOTAL],flstatsaddr,sizeof(struct iotime) * NDRIVES);
  667. X}
  668. X
  669. X/*+----------------------------------------------------------------------------
  670. X    draw_wd_literals(win, y, x);
  671. X
  672. X00000000001111111111222222222233333333334444444444555555555566666666667777777777
  673. X01234567890123456789012345678901234567890123456789012345678901234567890123456789
  674. XDevice  Jobs/s r+w/s Blks/s -- (% Utilization) ---------------------------------
  675. X######   ##### ##### #####  ####################################################
  676. X%wd##
  677. X%fd##
  678. X-----------------------------------------------------------------------------*/
  679. X
  680. Xvoid
  681. Xdraw_wd_literals(win,y,x)
  682. XWINDOW *win;
  683. Xint y,x;
  684. X
  685. X{
  686. X    static char *header = 
  687. X"Device  Jobs/s r+w/s Blks/s -- (% Utilization) ";
  688. X    int x2,ctlr,drive;
  689. X
  690. X    wmove(win,y,x);
  691. X    use_cp(win,cpBANNER);
  692. X    waddstr(win,header);
  693. X    getyx(win,y,x2);
  694. X    while(x2++ <= COLS)
  695. X        waddch(win,(chtype)'-');
  696. X    use_cp(win,cpLIT);
  697. X    clear_area(win,getmaxy(win)-1,0,getmaxx(win));
  698. X    for(ctlr=0; ctlr<NCTLR; ctlr++) {
  699. X        for(drive=0; drive<NWD; drive++) {
  700. X            mvwprintw(win,(y+(ctlr*NWD)+drive+1),x,"wd%1d%1d",ctlr,drive);
  701. X        }
  702. X    }
  703. X    getyx(win,y,x2);
  704. X    for(drive=0; drive<NDRIVES; drive++)
  705. X        mvwprintw(win,(y+drive+1),x,"fd%1d",drive);
  706. X} 
  707. X
  708. X/*+----------------------------------------------------------------------------
  709. X    update_wd(win, y, x, width);
  710. X
  711. X00000000001111111111222222222233333333334444444444555555555566666666667777777777
  712. X01234567890123456789012345678901234567890123456789012345678901234567890123456789
  713. Xobs/s r+w/s Blks/s -- (% Utilization) ---------------------------------
  714. X##### ##### #####  ####################################################
  715. X-----------------------------------------------------------------------------*/
  716. X#define _WD_AQ    0
  717. X#define _WD_RW    6
  718. X#define _WD_BK    12
  719. X#define _WD_UT    19
  720. X
  721. Xvoid
  722. Xupdate_wd(win,y,x,width)
  723. XWINDOW *win;
  724. Xint y,x;
  725. Xint width;
  726. X
  727. X{
  728. X    register i;
  729. X    time_t elapsed_secs;
  730. X    int itmp;
  731. X    int percent_used;
  732. X/*
  733. X    int max;
  734. X*/
  735. X
  736. X    (void)time(&now);
  737. X    elapsed_secs=now-timelast;
  738. X    kread((caddr_t) ia,wd1010statsaddr,sizeof(struct iotime) * NCTLR * NWD);
  739. X    kread((caddr_t) &ia[NWDTOTAL],flstatsaddr,
  740. X            sizeof(struct iotime) * NDRIVES);
  741. X    for(i=0; i<(NWDTOTAL+NDRIVES);i++) {
  742. X        use_cp(win,cpINFO);
  743. X        mvwprintw(win,y+i,_WD_AQ+x,"%5i",
  744. X            (ia[i].io_qc-ialast[i].io_qc));
  745. X        mvwprintw(win,y+i,_WD_RW+x,"%5i",
  746. X            (ia[i].io_cnt-ialast[i].io_cnt));
  747. X        itmp = ia[i].io_bcnt-ialast[i].io_bcnt;
  748. X        mvwprintw(win,y+i,_WD_BK+x,"%5i",
  749. X            (itmp > 99999) ? 99999 : itmp);    /* protect transient overflow */
  750. X        wmove(win,y+i,_WD_UT+x);
  751. X        percent_used=(ia[i].io_act-ialast[i].io_act);
  752. X        wprintw(win,"%5i",(percent_used > 99999) ? 99999 : percent_used);
  753. X/*
  754. X        max_util[i]=max_util[i]<percent_used ? percent_used : max_util[i];
  755. X        if(percent_used < 70)
  756. X            use_cp(win, cpLOW);
  757. X        else if (percent_used < 90)
  758. X            use_cp(win, cpMED);
  759. X        else
  760. X            use_cp(win, cpHIGH);
  761. X
  762. X        itmp = (width * percent_used) / 100;
  763. X        max = (width * max_util[i]) / 100;
  764. X        while(-1) {
  765. X            itmp--;max--;
  766. X            if (max<1) {
  767. X                use_cp(win, cpHIGH);
  768. X                waddch(win, (chtype)'M');
  769. X                break;
  770. X            }
  771. X            if (itmp>-1)
  772. X                waddch(win, (chtype)'-');
  773. X            else
  774. X                waddch(win, (chtype)' ');
  775. X        }
  776. X
  777. X        wclrtoeol(win);
  778. X*/
  779. X    }
  780. X    memcpy((char *)ialast,(char *)ia,
  781. X        sizeof(struct iotime) * (NWDTOTAL + NDRIVES));
  782. X    timelast=now;
  783. X}
  784. X#endif
  785. SHAR_EOF
  786. chmod 0644 det_wd.c ||
  787. echo 'restore of det_wd.c failed'
  788. Wc_c="`wc -c < 'det_wd.c'`"
  789. test 5037 -eq "$Wc_c" ||
  790.     echo 'det_wd.c: original size 5037, current size' "$Wc_c"
  791. fi
  792. # ============= disputil.c ==============
  793. if test -f 'disputil.c' -a X"$1" != X"-c"; then
  794.     echo 'x - skipping disputil.c (File already exists)'
  795. else
  796. echo 'x - extracting disputil.c (Text)'
  797. sed 's/^X//' << 'SHAR_EOF' > 'disputil.c' &&
  798. X/*+-------------------------------------------------------------------------
  799. X    disputil.c - u386mon display utilities
  800. X
  801. X  Defined functions:
  802. X    clear_area(win,y,x,len)
  803. X    clear_area_char(win,y,x,len,fillchar)
  804. X    disp_info_int(win,label,fmt,value)
  805. X    disp_info_long(win,label,fmt,value)
  806. X    disp_msg(cp,msg)
  807. X    disp_static_int(win,label,fmt,value)
  808. X    disp_static_long(win,label,fmt,value)
  809. X    mkpanel(rows,cols,tly,tlx,userp)
  810. X    pflush()
  811. X    wperror(win,desc)
  812. X
  813. X--------------------------------------------------------------------------*/
  814. X/*+:EDITS:*/
  815. X/*:08-01-1991-23:34-wht@n4hgf-release 3.40 source control point */
  816. X/*:08-10-1990-14:12-jmd@p1so/wht@n4hgf-2.20-add Tandem Integrity S2 */
  817. X/*:08-07-1990-14:24-wht@n4hgf-nba@sysware.dk SVR31 updates */
  818. X/*:08-02-1990-15:36-wht@n4hgf-2.12-old curses hacks+minor 3.2 formalizations */
  819. X/*:07-28-1990-18:06-wht@n4hgf-2.10 release */
  820. X/*:07-10-1990-19:06-root@n4hgf-redesign attributes/color pairs */
  821. X/*:06-27-1990-01:57-wht@n4hgf-1.10-incorporate suggestions from alpha testers */
  822. X/*:06-25-1990-04:14-wht@n4hgf-1.02-better error handling */
  823. X/*:06-24-1990-20:53-wht@n4hgf-v1.01-add ISC support thanks to peter@radig.de */
  824. X/*:06-21-1990-14:26-r@n4hgf-version x0.12 seems bug free */
  825. X/*:06-17-1990-15:15-wht-creation */
  826. X
  827. X#include "config.h"
  828. X#define M_TERMINFO
  829. X#include <curses.h>
  830. X#undef timeout
  831. X#undef reg     /* per nba@sysware.dk */
  832. X#ifdef NATIVE_PANELS
  833. X# include <panel.h>
  834. X#else
  835. X# include "libpanel.h"
  836. X#endif
  837. X#include <sys/types.h>
  838. X#include "u386mon.h"
  839. X
  840. X#ifdef COLOR_PAIR
  841. Xlong color_attr[] =
  842. X{
  843. X    COLOR_PAIR(0),
  844. X    COLOR_PAIR(cpINFO),
  845. X    COLOR_PAIR(cpREVERSE),
  846. X    COLOR_PAIR(cpBANWARN),
  847. X    COLOR_PAIR(cpLOW) | A_BOLD,
  848. X    COLOR_PAIR(cpMED) | A_BOLD,
  849. X    COLOR_PAIR(cpHIGH),
  850. X    COLOR_PAIR(cpBANNER),
  851. X    COLOR_PAIR(cpLIT),
  852. X    0
  853. X};
  854. X#endif
  855. X
  856. Xlong mono_attr[] =
  857. X{
  858. X    0,                        /* 0 */
  859. X    0,                        /* cpINFO */
  860. X    A_REVERSE,                /* cpREVERSE */
  861. X    A_BOLD,                     /* cpBANWARN */
  862. X    0,                        /* cpLOW */
  863. X    A_UNDERLINE,            /* cpMED */
  864. X    A_BLINK,                /* cpHIGH */
  865. X    A_REVERSE,                /* cpBANNER */
  866. X    A_DIM,                    /* cpLIT */
  867. X};
  868. X
  869. Xextern WINDOW *wdet, *wscr;
  870. X
  871. X/*+-------------------------------------------------------------------------
  872. X    clear_area_char(win,y,x,len,fillchar)
  873. X--------------------------------------------------------------------------*/
  874. Xvoid
  875. Xclear_area_char(win,y,x,len,fillchar)
  876. XWINDOW *win;
  877. Xint y;
  878. Xint x;
  879. Xint len;
  880. Xu_char fillchar;
  881. X{
  882. X    wmove(win,y,x);
  883. X    while(len-- > 0)
  884. X        waddch(win,(chtype)fillchar);
  885. X    wmove(win,y,x);
  886. X
  887. X}    /* end of clear_area_char */
  888. X
  889. X/*+-------------------------------------------------------------------------
  890. X    clear_area(win,y,x,len)
  891. X--------------------------------------------------------------------------*/
  892. Xvoid
  893. Xclear_area(win,y,x,len)
  894. XWINDOW *win;
  895. Xint y;
  896. Xint x;
  897. Xint len;
  898. X{
  899. X    clear_area_char(win,y,x,len,' ');
  900. X}    /* end of clear_area_char */
  901. X
  902. X/*+-------------------------------------------------------------------------
  903. X    pflush() - do update_panels() and doupdate()
  904. X--------------------------------------------------------------------------*/
  905. Xvoid
  906. Xpflush()
  907. X{
  908. X    update_panels();
  909. X    curs_set(0);
  910. X    doupdate();
  911. X    curs_set(1);
  912. X}    /* end of pflush */
  913. X
  914. X/*+-------------------------------------------------------------------------
  915. X    wperror(win,desc)
  916. X--------------------------------------------------------------------------*/
  917. Xvoid
  918. Xwperror(win,desc)
  919. XWINDOW *win;
  920. Xchar *desc;
  921. X{
  922. Xextern int errno;
  923. Xextern int sys_nerr;
  924. Xextern char *sys_errlist[];
  925. X
  926. X    waddstr(win,desc);
  927. X    waddstr(win,": ");
  928. X    if(errno < sys_nerr)
  929. X        waddstr(win,sys_errlist[errno]);
  930. X    else
  931. X        wprintw(win,"error %u",errno);
  932. X
  933. X}    /* end of wperror */
  934. X
  935. X/*+-------------------------------------------------------------------------
  936. X    mkpanel(rows,cols,tly,tlx,userp) - alloc win and pan and associate them
  937. X--------------------------------------------------------------------------*/
  938. XPANEL *
  939. Xmkpanel(rows,cols,tly,tlx,userp)
  940. Xint rows;
  941. Xint cols;
  942. Xint tly;
  943. Xint tlx;
  944. Xchar *userp;
  945. X{
  946. XWINDOW *win = newwin(rows,cols,tly,tlx);
  947. XPANEL *pan;
  948. X
  949. X    if(!win)
  950. X        return((PANEL *)0);
  951. X    if(pan = new_panel(win))
  952. X    {
  953. X        set_panel_userptr(pan,userp);
  954. X        return(pan);
  955. X    }
  956. X    delwin(win);
  957. X    return((PANEL *)0);
  958. X}    /* end of mkpanel */
  959. X
  960. X/*+-------------------------------------------------------------------------
  961. X    disp_info_long(win,label,fmt,value)
  962. X--------------------------------------------------------------------------*/
  963. Xvoid
  964. Xdisp_info_long(win,label,fmt,value)
  965. XWINDOW *win;
  966. Xchar *label;
  967. Xchar *fmt;
  968. Xlong value;
  969. X{
  970. X    use_cp(win,cpLIT);
  971. X    waddstr(win,label);
  972. X    use_cp(win,cpINFO);
  973. X    wprintw(win,fmt,value);
  974. X}    /* end of disp_info_long */
  975. X
  976. X/*+-------------------------------------------------------------------------
  977. X    disp_info_int(win,label,fmt,value)
  978. X--------------------------------------------------------------------------*/
  979. Xvoid
  980. Xdisp_info_int(win,label,fmt,value)
  981. XWINDOW *win;
  982. Xchar *label;
  983. Xchar *fmt;
  984. Xint value;
  985. X{
  986. X    use_cp(win,cpLIT);
  987. X    waddstr(win,label);
  988. X    use_cp(win,cpINFO);
  989. X    wprintw(win,fmt,value);
  990. X}    /* end of disp_info_int */
  991. X
  992. X/*+-------------------------------------------------------------------------
  993. X    disp_static_long(win,label,fmt,value)
  994. X--------------------------------------------------------------------------*/
  995. Xvoid
  996. Xdisp_static_long(win,label,fmt,value)
  997. XWINDOW *win;
  998. Xchar *label;
  999. Xchar *fmt;
  1000. Xlong value;
  1001. X{
  1002. X    use_cp(win,cpLIT);
  1003. X    waddstr(win,label);
  1004. X    wprintw(win,fmt,value);
  1005. X}    /* end of disp_static_long */
  1006. X
  1007. X/*+-------------------------------------------------------------------------
  1008. X    disp_static_int(win,label,fmt,value)
  1009. X--------------------------------------------------------------------------*/
  1010. Xvoid
  1011. Xdisp_static_int(win,label,fmt,value)
  1012. XWINDOW *win;
  1013. Xchar *label;
  1014. Xchar *fmt;
  1015. Xint value;
  1016. X{
  1017. X    use_cp(win,cpLIT);
  1018. X    waddstr(win,label);
  1019. X    wprintw(win,fmt,value);
  1020. X}    /* end of disp_static_int */
  1021. X
  1022. X/*+-------------------------------------------------------------------------
  1023. X    disp_msg(cp,msg)
  1024. X--------------------------------------------------------------------------*/
  1025. Xvoid
  1026. Xdisp_msg(cp,msg)
  1027. Xchtype cp;
  1028. Xchar *msg;
  1029. X{
  1030. Xextern WINDOW *wscr;
  1031. Xint y;
  1032. Xregister int x;
  1033. X
  1034. X    wmove(wscr,MSG_TLY,0);
  1035. X    use_cp(wscr,cp);
  1036. X    waddstr(wscr,msg);
  1037. X    getyx(wscr,y,x);
  1038. X    while(x < getmaxx(wscr))
  1039. X        waddch(wscr,(chtype)' '),x++;
  1040. X}    /* end of disp_msg */
  1041. X
  1042. X/* vi: set tabstop=4 shiftwidth=4: */
  1043. X/* end of disputil.c */
  1044. SHAR_EOF
  1045. chmod 0644 disputil.c ||
  1046. echo 'restore of disputil.c failed'
  1047. Wc_c="`wc -c < 'disputil.c'`"
  1048. test 6085 -eq "$Wc_c" ||
  1049.     echo 'disputil.c: original size 6085, current size' "$Wc_c"
  1050. fi
  1051. # ============= kludge.c ==============
  1052. if test -f 'kludge.c' -a X"$1" != X"-c"; then
  1053.     echo 'x - skipping kludge.c (File already exists)'
  1054. else
  1055. echo 'x - extracting kludge.c (Text)'
  1056. sed 's/^X//' << 'SHAR_EOF' > 'kludge.c' &&
  1057. X
  1058. X/*+-------------------------------------------------------------------------
  1059. X    kludge.c - u386mon KLUDGE
  1060. X
  1061. XWe want S5R3 curses #define PERFORMANCE because it has several macro
  1062. Xreplacements for functions, but one of the macros has a bug in it.  The
  1063. Xmacro has_colors() refers to an undefined 'max_pairs' ...  in the interest
  1064. Xof speed, we do the has_colors() call here and get the function
  1065. Xhas_colors() without the bogus extern reference.
  1066. X--------------------------------------------------------------------------*/
  1067. X/*+:EDITS:*/
  1068. X/*:08-01-1991-23:34-wht@n4hgf-release 3.40 source control point */
  1069. X/*:08-10-1990-14:12-jmd@p1so/wht@n4hgf-2.20-add Tandem Integrity S2 */
  1070. X/*:08-07-1990-14:24-wht@n4hgf-nba@sysware.dk SVR31 updates */
  1071. X/*:08-03-1990-05:04-wht-creation */
  1072. X
  1073. X#define M_TERMINFO
  1074. X#include <curses.h>
  1075. X
  1076. X/*+-------------------------------------------------------------------------
  1077. X    has_colors_kludge() - don't ask
  1078. X--------------------------------------------------------------------------*/
  1079. X#if defined(COLOR_PAIR)
  1080. Xvoid
  1081. Xhas_colors_kludge()
  1082. X{
  1083. Xextern int color_avail;
  1084. X    color_avail = has_colors();
  1085. X}    /* end of has_colors_kludge */
  1086. X#endif
  1087. X
  1088. X/* vi: set tabstop=4 shiftwidth=4: */
  1089. X/* end of kludge.c */
  1090. SHAR_EOF
  1091. chmod 0644 kludge.c ||
  1092. echo 'restore of kludge.c failed'
  1093. Wc_c="`wc -c < 'kludge.c'`"
  1094. test 1194 -eq "$Wc_c" ||
  1095.     echo 'kludge.c: original size 1194, current size' "$Wc_c"
  1096. fi
  1097. # ============= libkmem.c ==============
  1098. if test -f 'libkmem.c' -a X"$1" != X"-c"; then
  1099.     echo 'x - skipping libkmem.c (File already exists)'
  1100. else
  1101. echo 'x - extracting libkmem.c (Text)'
  1102. sed 's/^X//' << 'SHAR_EOF' > 'libkmem.c' &&
  1103. X/*LINTLIBRARY*/
  1104. X/*+-------------------------------------------------------------------------
  1105. X    libkmem.c -- /dev/kmem routines for SCO UNIX/386 (maybe other *NIX)
  1106. X    ...!{gatech,emory}!n4hgf!wht
  1107. X
  1108. X  Defined functions:
  1109. X    kinit(write_needed)
  1110. X    kread(caddr,kaddr,len)
  1111. X    kwrite(kaddr,caddr,len)
  1112. X
  1113. X routines were originally written by Mike "Ford" Ditto: kudos!!!
  1114. X--------------------------------------------------------------------------*/
  1115. X/*+:EDITS:*/
  1116. X/*:08-01-1991-23:34-wht@n4hgf-release 3.40 source control point */
  1117. X/*:08-10-1990-14:12-jmd@p1so/wht@n4hgf-2.20-add Tandem Integrity S2 */
  1118. X/*:08-07-1990-14:24-wht@n4hgf-nba@sysware.dk SVR31 updates */
  1119. X/*:08-02-1990-15:36-wht@n4hgf-2.12-old curses hacks+minor 3.2 formalizations */
  1120. X/*:08-01-1990-19:33-jdc@dell.com-add more error text */
  1121. X/*:07-28-1990-18:06-wht@n4hgf-2.10 release */
  1122. X/*:06-27-1990-01:57-wht@n4hgf-1.10-incorporate suggestions from alpha testers */
  1123. X/*:06-25-1990-04:14-wht@n4hgf-1.02-better error handling */
  1124. X/*:06-24-1990-20:53-wht@n4hgf-v1.01-add ISC support thanks to peter@radig.de */
  1125. X/*:06-21-1990-14:26-r@n4hgf-version x0.12 seems bug free */
  1126. X/*:12-07-1988-22:06-wht-put in test for initialized fdkmem */
  1127. X/*:10-27-1988-22:44-wht-creation of file */
  1128. X
  1129. X#include <sys/types.h>
  1130. X#include <sys/errno.h>
  1131. X#include <fcntl.h>
  1132. X#include "libkmem.h"
  1133. X
  1134. Xvoid leave_text();
  1135. X
  1136. Xextern int errno;
  1137. X
  1138. Xstatic int fdkmem = -2;
  1139. Xdaddr_t lseek();
  1140. X
  1141. X/*+-------------------------------------------------------------------------
  1142. X    kinit(write_needed)
  1143. X--------------------------------------------------------------------------*/
  1144. Xvoid
  1145. Xkinit(write_needed)
  1146. Xint write_needed;
  1147. X{
  1148. X    if(fdkmem >= 0)
  1149. X        return;
  1150. X    if((fdkmem=open("/dev/kmem",(write_needed) ? O_RDWR : O_RDONLY,0)) < 0)
  1151. X    {
  1152. X        if (write_needed)
  1153. X        {
  1154. X            leave_text("can't open /dev/kmem for read/write access",255);
  1155. X        }
  1156. X        else
  1157. X        {
  1158. X            leave_text("can't open /dev/kmem for read access",255);
  1159. X        }
  1160. X    }
  1161. X
  1162. X}    /* end of kinit */
  1163. X
  1164. X/*+-------------------------------------------------------------------------
  1165. X    kread(caddr,kaddr,len)
  1166. X--------------------------------------------------------------------------*/
  1167. Xvoid
  1168. Xkread(caddr,kaddr,len)
  1169. Xcaddr_t caddr;
  1170. Xdaddr_t kaddr;
  1171. Xint len;
  1172. X{
  1173. Xchar s80[80];
  1174. Xextern daddr_t myreadlen;
  1175. Xextern int myreadcnt;
  1176. X
  1177. X#if defined(M_I286)
  1178. X    kaddr &= 0xFFFFL;
  1179. X#endif
  1180. X#if defined(mips)
  1181. X    kaddr &= 0x7FFFFFFFL;
  1182. X#endif
  1183. X
  1184. X    if(fdkmem == -2)
  1185. X        leave_text("kinit() not called",1);
  1186. X
  1187. X    if(lseek(fdkmem,kaddr,0) == -1L)
  1188. X    {
  1189. X        (void)sprintf(s80,"kmem read seek error addr %08lx",kaddr);
  1190. X        leave_text(s80,255);
  1191. X    }
  1192. X
  1193. X    if(read(fdkmem,caddr,len) != len)
  1194. X    {
  1195. X        (void)sprintf(s80,"kmem read error len %d addr %08lx",len,kaddr);
  1196. X        leave_text(s80,255);
  1197. X    }
  1198. X    myreadlen += len;
  1199. X    myreadcnt++;
  1200. X}    /* end of kread */
  1201. X
  1202. X/*+-------------------------------------------------------------------------
  1203. X    kwrite(kaddr,caddr,len)
  1204. X--------------------------------------------------------------------------*/
  1205. X#ifdef KWRITE_NEEDED
  1206. Xvoid
  1207. Xkwrite(kaddr,caddr,len)
  1208. Xdaddr_t kaddr;
  1209. Xcaddr_t caddr;
  1210. Xint len;
  1211. X{
  1212. Xchar s80[80];
  1213. X
  1214. X#if defined(M_I286)
  1215. X    kaddr &= 0xFFFFL;
  1216. X#endif
  1217. X
  1218. X    if(fdkmem == -2)
  1219. X        leave_text("kinit() not called",1);
  1220. X
  1221. X    if(lseek(fdkmem,kaddr,0) == -1L)
  1222. X    {
  1223. X        (void)sprintf(s80,
  1224. X            "/dev/kmem write seek error addr %08lx",kaddr);
  1225. X        leave_text(s80,255);
  1226. X    }
  1227. X    if(write(fdkmem,caddr,len) != len)
  1228. X    {
  1229. X        (void)sprintf(s80,
  1230. X            "/dev/kmem write error addr %08lx len %08lx",kaddr,len);
  1231. X        leave_text(s80,255);
  1232. X    }
  1233. X}    /* end of kwrite */
  1234. X#endif
  1235. X
  1236. X/* vi: set tabstop=4 shiftwidth=4: */
  1237. SHAR_EOF
  1238. chmod 0644 libkmem.c ||
  1239. echo 'restore of libkmem.c failed'
  1240. Wc_c="`wc -c < 'libkmem.c'`"
  1241. test 3407 -eq "$Wc_c" ||
  1242.     echo 'libkmem.c: original size 3407, current size' "$Wc_c"
  1243. fi
  1244. # ============= libmem.c ==============
  1245. if test -f 'libmem.c' -a X"$1" != X"-c"; then
  1246.     echo 'x - skipping libmem.c (File already exists)'
  1247. else
  1248. echo 'x - extracting libmem.c (Text)'
  1249. sed 's/^X//' << 'SHAR_EOF' > 'libmem.c' &&
  1250. X/*LINTLIBRARY*/
  1251. X/*+-------------------------------------------------------------------------
  1252. X    libmem.c -- /dev/mem routines for SCO UNIX/386 (maybe other *NIX)
  1253. X    ...!{gatech,emory}!n4hgf!wht
  1254. X
  1255. X  Defined functions:
  1256. X    minit(write_needed)
  1257. X    mread(caddr,maddr,len)
  1258. X    mwrite(maddr,caddr,len)
  1259. X
  1260. X routines were originally written by Mike "Ford" Ditto: kudos!!!
  1261. X--------------------------------------------------------------------------*/
  1262. X/*+:EDITS:*/
  1263. X/*:08-01-1991-23:34-wht@n4hgf-release 3.40 source control point */
  1264. X/*:08-10-1990-14:12-jmd@p1so/wht@n4hgf-2.20-add Tandem Integrity S2 */
  1265. X/*:08-07-1990-14:24-wht@n4hgf-nba@sysware.dk SVR31 updates */
  1266. X/*:08-02-1990-15:36-wht@n4hgf-2.12-old curses hacks+minor 3.2 formalizations */
  1267. X/*:07-28-1990-18:06-wht@n4hgf-2.10 release */
  1268. X/*:06-27-1990-01:57-wht@n4hgf-1.10-incorporate suggestions from alpha testers */
  1269. X/*:06-25-1990-04:14-wht@n4hgf-1.02-better error handling */
  1270. X/*:06-24-1990-20:53-wht@n4hgf-v1.01-add ISC support thanks to peter@radig.de */
  1271. X/*:06-21-1990-14:26-r@n4hgf-version x0.12 seems bug free */
  1272. X/*:12-07-1988-22:06-wht-put in test for initialized fdmem */
  1273. X/*:10-27-1988-22:44-wht-creation of file */
  1274. X
  1275. X#include <sys/types.h>
  1276. X#include <fcntl.h>
  1277. X#include "libmem.h"
  1278. X
  1279. Xvoid leave_text();
  1280. X
  1281. Xextern int errno;
  1282. X
  1283. Xstatic int fdmem = -2;
  1284. Xdaddr_t lseek();
  1285. X
  1286. X/*+-------------------------------------------------------------------------
  1287. X    minit(write_needed)
  1288. X--------------------------------------------------------------------------*/
  1289. Xvoid
  1290. Xminit(write_needed)
  1291. Xint write_needed;
  1292. X{
  1293. X    if(fdmem >= 0)
  1294. X        return;
  1295. X    if((fdmem=open("/dev/mem",(write_needed) ? O_RDWR : O_RDONLY,0)) < 0)
  1296. X        leave_text("can't open /dev/mem",255);
  1297. X
  1298. X}    /* end of minit */
  1299. X
  1300. X/*+-------------------------------------------------------------------------
  1301. X    mread(caddr,maddr,len)
  1302. X--------------------------------------------------------------------------*/
  1303. Xvoid
  1304. Xmread(caddr,maddr,len)
  1305. Xcaddr_t caddr;
  1306. Xdaddr_t maddr;
  1307. Xint len;
  1308. X{
  1309. Xchar s80[80];
  1310. Xextern daddr_t myreadlen;
  1311. Xextern int myreadcnt;
  1312. X
  1313. X#if defined(M_I286)
  1314. X    maddr &= 0xFFFFL;
  1315. X#endif
  1316. X
  1317. X    if(fdmem == -2)
  1318. X        leave_text("minit() not called",1);
  1319. X
  1320. X    if(lseek(fdmem,maddr,0) == -1L)
  1321. X    {
  1322. X        (void)sprintf(s80,"mem seek err (%08lx)",maddr);
  1323. X        leave_text(s80,1);
  1324. X    }
  1325. X
  1326. X    if(read(fdmem,caddr,len) != len)
  1327. X    {
  1328. X        (void)sprintf(s80,
  1329. X            "mem read errno %d len %d addr %08lx",errno,len,maddr);
  1330. X        leave_text(s80,1);
  1331. X    }
  1332. X    myreadlen += len;
  1333. X    myreadcnt++;
  1334. X}    /* end of mread */
  1335. X
  1336. X/*+-------------------------------------------------------------------------
  1337. X    mwrite(maddr,caddr,len)
  1338. X--------------------------------------------------------------------------*/
  1339. X#ifdef MWRITE_NEEDED
  1340. Xvoid
  1341. Xmwrite(maddr,caddr,len)
  1342. Xdaddr_t maddr;
  1343. Xcaddr_t caddr;
  1344. Xint len;
  1345. X{
  1346. Xchar s80[80];
  1347. X
  1348. X#if defined(M_I286)
  1349. X    maddr &= 0xFFFFL;
  1350. X#endif
  1351. X
  1352. X    if(fdmem == -2)
  1353. X        leave_text("minit() not called",1);
  1354. X
  1355. X    if(lseek(fdkmem,kaddr,0) == -1L)
  1356. X    {
  1357. X        (void)sprintf(s80,
  1358. X            "/dev/kmem seek error addr %08lx",kaddr);
  1359. X        leave_text(s80,255);
  1360. X    }
  1361. X    if(write(fdkmem,caddr,len) != len)
  1362. X    {
  1363. X        (void)sprintf(s80,
  1364. X            "/dev/kmem write error addr %08lx len %08lx",kaddr,len);
  1365. X        leave_text(s80,255);
  1366. X    }
  1367. X}    /* end of mwrite */
  1368. X#endif /* MWRITE_NEEDED */
  1369. X
  1370. X/* vi: set tabstop=4 shiftwidth=4: */
  1371. SHAR_EOF
  1372. chmod 0644 libmem.c ||
  1373. echo 'restore of libmem.c failed'
  1374. Wc_c="`wc -c < 'libmem.c'`"
  1375. test 3147 -eq "$Wc_c" ||
  1376.     echo 'libmem.c: original size 3147, current size' "$Wc_c"
  1377. fi
  1378. true || echo 'restore of libpanel.c failed'
  1379. echo End of part 5, continue with part 6
  1380. exit 0
  1381.  
  1382. exit 0 # Just in case...
  1383. -- 
  1384. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  1385. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  1386. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  1387. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  1388.