home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume14 / u386mon-2.0 / part04 < prev    next >
Encoding:
Text File  |  1990-07-15  |  54.1 KB  |  2,019 lines

  1. Newsgroups: comp.sources.misc
  2. subject: v14i004: u386mon 2.0 part 04/04
  3. From: wht@n4hgf.UUCP (Warren Tucker)
  4. Sender: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  5.  
  6. Posting-number: Volume 14, Issue 4
  7. Submitted-by: wht@n4hgf.UUCP (Warren Tucker)
  8. Archive-name: u386mon-2.0/part04
  9.  
  10. #!/bin/sh
  11. # This is part 04 of u386mon.2.0
  12. if touch 2>&1 | fgrep 'amc' > /dev/null
  13.  then TOUCH=touch
  14.  else TOUCH=true
  15. fi
  16. # ============= lint_args.h ==============
  17. echo "x - extracting lint_args.h (Text)"
  18. sed 's/^X//' << 'SHAR_EOF' > lint_args.h &&
  19. X/* CHK=0x3CB6 */
  20. X/*+-----------------------------------------------------------------------
  21. X    lint_args.h
  22. X------------------------------------------------------------------------*/
  23. X/*+:EDITS:*/
  24. X/*:07-11-1990-04:12-afterlint-creation */
  25. X
  26. X#ifndef BUILDING_LINT_ARGS
  27. X#ifdef LINT_ARGS
  28. X
  29. X/* bootinfo.c */
  30. Xextern  char *bmemf_text(unsigned long flags);
  31. Xextern  void display_bootinfo(struct _win_st *win,int y,int x);
  32. X/* det_proc.c */
  33. Xextern  char *get_cpu_time_str(long ticks);
  34. Xextern  char *pgrp_to_ttyname(int pgrp);
  35. Xextern  char *uid_to_name(unsigned short uid);
  36. Xextern  int det_proc_init(void );
  37. Xextern  int get_user(struct proc *tproc,struct user *tuser);
  38. Xextern  int getpwent_and_enter(unsigned short uid);
  39. Xextern  int ppproc_pid_compare(struct proc * *ppp1,struct proc * *ppp2);
  40. Xextern  int uid_name_enter(unsigned short uid,char *name);
  41. Xextern  struct utmp *find_utmp_for_pgrp(int pgrp);
  42. Xextern  void display_proc_stat(struct _win_st *win,int iproc,int initial);
  43. Xextern  void display_proc_stats(struct _win_st *win,int initial);
  44. Xextern  void init_uid_name_hash(void );
  45. Xextern  void read_and_sort_procs(int initial);
  46. Xextern  void read_utmp(void );
  47. X/* det_sio.c */
  48. Xextern  char *B_to_baud_rate(int code);
  49. Xextern  char *cflag_to_baud_d_p_s(int cflag);
  50. Xextern  int display_sio_summary(struct _win_st *win,int initial);
  51. Xextern  int tty_slot_compare(struct tty *sio1,struct tty *sio2);
  52. Xextern  void display_siofull_init(struct _win_st *win,int tly,int tlx,int show_flag);
  53. Xextern  void display_siofull_update(struct _win_st *win,int tly,int tlx,struct tty *tsio);
  54. Xextern  void display_siosum_update(struct _win_st *win,int y,struct tty *tsio);
  55. Xextern  void grok_sio_tty(void );
  56. X/* detail.c */
  57. Xextern  void detail_init(void );
  58. Xextern  void detail_panel_cmd(unsigned long cmd);
  59. Xextern  void detail_panel_update(void );
  60. Xextern  void detpanel_destroy(void );
  61. Xextern  void detpanel_extra_init(void );
  62. Xextern  void detpanel_extra_update(void );
  63. Xextern  void detpanel_ps_init(int full43);
  64. Xextern  void detpanel_ps_update(void );
  65. Xextern  void detpanel_sio_init(void );
  66. Xextern  void detpanel_sio_update(void );
  67. X/* disputil.c */
  68. Xextern  struct PANEL *mkpanel(int rows,int cols,int tly,int tlx);
  69. Xextern  void clear_area(struct _win_st *win,int y,int x,int len);
  70. Xextern  void clear_area_char(struct _win_st *win,int y,int x,int len,unsigned char fillchar);
  71. Xextern  void disp_info_int(struct _win_st *win,char *label,char *fmt,int value);
  72. Xextern  void disp_info_long(struct _win_st *win,char *label,char *fmt,long value);
  73. Xextern  void disp_msg(unsigned long cp,char *msg);
  74. Xextern  void disp_static_int(struct _win_st *win,char *label,char *fmt,int value);
  75. Xextern  void disp_static_long(struct _win_st *win,char *label,char *fmt,long value);
  76. Xextern  void pflush(void );
  77. Xextern  void wperror(struct _win_st *win,char *desc);
  78. X/* libkmem.c */
  79. Xextern  void kinit(int write_needed);
  80. Xextern  void kread(char *caddr,long kaddr,int len);
  81. X/* libmem.c */
  82. Xextern  void minit(int write_needed);
  83. Xextern  void mread(char *caddr,long maddr,int len);
  84. X/* libnlsym.c */
  85. Xextern  void nlsym_error(char *text);
  86. Xextern  void nlsym_read(void );
  87. X/* libswap.c */
  88. Xextern  void sinit(void );
  89. Xextern  void sread(char *caddr,long maddr,int len);
  90. X/* nlsym.c */
  91. Xextern  int main(int argc,char * *argv,char * *envp);
  92. Xextern  void nlsym_write_error(int code);
  93. X/* proc.c */
  94. Xextern  char *pstat_text(char pstat);
  95. Xextern  void display_proc(struct _win_st *win,int y,int x);
  96. Xextern  void grok_proc(void );
  97. X/* tune.c */
  98. Xextern  void display_tune(struct _win_st *win,int y,int x);
  99. X/* u386mon.c */
  100. Xextern  char *get_elapsed_time(long elapsed_seconds);
  101. Xextern  int get_cpu_avg(long *cpu_ticks,int period);
  102. Xextern  int get_wait_avg(long *wait_ticks,int period);
  103. Xextern  int main(int argc,char * *argv,char * *envp);
  104. Xextern  long update_cpuscale(struct _win_st *win,int y,int x,int width,long *per_state);
  105. Xextern  long update_waitscale(struct _win_st *win,int y,int x,int width,long *per_state,long total_ticks);
  106. Xextern  void calc_cpu_avg(long *per_state);
  107. Xextern  void calc_wait_avg(long *per_state);
  108. Xextern  void caught_signal(int sig);
  109. Xextern  void draw_cpuscale_literals(struct _win_st *win,int y,int x);
  110. Xextern  void draw_per_sec_literals(struct _win_st *win,int y,int x);
  111. Xextern  void draw_waitscale_literals(struct _win_st *win,int y,int x);
  112. Xextern  void extra_info_stuff(void );
  113. Xextern  void extra_static_stuff(void );
  114. Xextern  void leave(int exit_code);
  115. Xextern  void leave_text(char *text,int exit_code);
  116. Xextern  void leaving(void );
  117. Xextern  void read_sysinfo_and_minfo(void );
  118. X/* var.c */
  119. Xextern  void display_var(struct _win_st *win,int y,int x);
  120. X
  121. X#else        /* compiler doesn't know about prototyping */
  122. X
  123. X/* bootinfo.c */
  124. Xextern  char *bmemf_text();
  125. Xextern  void display_bootinfo();
  126. X/* det_proc.c */
  127. Xextern  char *get_cpu_time_str();
  128. Xextern  char *pgrp_to_ttyname();
  129. Xextern  char *uid_to_name();
  130. Xextern  int det_proc_init();
  131. Xextern  int get_user();
  132. Xextern  int getpwent_and_enter();
  133. Xextern  int ppproc_pid_compare();
  134. Xextern  int uid_name_enter();
  135. Xextern  struct utmp *find_utmp_for_pgrp();
  136. Xextern  void display_proc_stat();
  137. Xextern  void display_proc_stats();
  138. Xextern  void init_uid_name_hash();
  139. Xextern  void read_and_sort_procs();
  140. Xextern  void read_utmp();
  141. X/* det_sio.c */
  142. Xextern  char *B_to_baud_rate();
  143. Xextern  char *cflag_to_baud_d_p_s();
  144. Xextern  int display_sio_summary();
  145. Xextern  int tty_slot_compare();
  146. Xextern  void display_siofull_init();
  147. Xextern  void display_siofull_update();
  148. Xextern  void display_siosum_update();
  149. Xextern  void grok_sio_tty();
  150. X/* detail.c */
  151. Xextern  void detail_init();
  152. Xextern  void detail_panel_cmd();
  153. Xextern  void detail_panel_update();
  154. Xextern  void detpanel_destroy();
  155. Xextern  void detpanel_extra_init();
  156. Xextern  void detpanel_extra_update();
  157. Xextern  void detpanel_ps_init();
  158. Xextern  void detpanel_ps_update();
  159. Xextern  void detpanel_sio_init();
  160. Xextern  void detpanel_sio_update();
  161. X/* disputil.c */
  162. Xextern  struct PANEL *mkpanel();
  163. Xextern  void clear_area();
  164. Xextern  void clear_area_char();
  165. Xextern  void disp_info_int();
  166. Xextern  void disp_info_long();
  167. Xextern  void disp_msg();
  168. Xextern  void disp_static_int();
  169. Xextern  void disp_static_long();
  170. Xextern  void pflush();
  171. Xextern  void wperror();
  172. X/* libkmem.c */
  173. Xextern  void kinit();
  174. Xextern  void kread();
  175. X/* libmem.c */
  176. Xextern  void minit();
  177. Xextern  void mread();
  178. X/* libnlsym.c */
  179. Xextern  void nlsym_error();
  180. Xextern  void nlsym_read();
  181. X/* libswap.c */
  182. Xextern  void sinit();
  183. Xextern  void sread();
  184. X/* nlsym.c */
  185. Xextern  int main();
  186. Xextern  void nlsym_write_error();
  187. X/* proc.c */
  188. Xextern  char *pstat_text();
  189. Xextern  void display_proc();
  190. Xextern  void grok_proc();
  191. X/* tune.c */
  192. Xextern  void display_tune();
  193. X/* u386mon.c */
  194. Xextern  char *get_elapsed_time();
  195. Xextern  int get_cpu_avg();
  196. Xextern  int get_wait_avg();
  197. Xextern  int main();
  198. Xextern  long update_cpuscale();
  199. Xextern  long update_waitscale();
  200. Xextern  void calc_cpu_avg();
  201. Xextern  void calc_wait_avg();
  202. Xextern  void caught_signal();
  203. Xextern  void draw_cpuscale_literals();
  204. Xextern  void draw_per_sec_literals();
  205. Xextern  void draw_waitscale_literals();
  206. Xextern  void extra_info_stuff();
  207. Xextern  void extra_static_stuff();
  208. Xextern  void leave();
  209. Xextern  void leave_text();
  210. Xextern  void leaving();
  211. Xextern  void read_sysinfo_and_minfo();
  212. X/* var.c */
  213. Xextern  void display_var();
  214. X
  215. X#endif /* LINT_ARGS */
  216. X#endif /* BUILDING_LINT_ARGS */
  217. X
  218. X/* end of lint_args.h */
  219. SHAR_EOF
  220. $TOUCH -am 0715025190 lint_args.h &&
  221. chmod 0644 lint_args.h ||
  222. echo "restore of lint_args.h failed"
  223. set `wc -c lint_args.h`;Wc_c=$1
  224. if test "$Wc_c" != "7313"; then
  225.     echo original size 7313, current size $Wc_c
  226. fi
  227. # ============= nlsym.h ==============
  228. echo "x - extracting nlsym.h (Text)"
  229. sed 's/^X//' << 'SHAR_EOF' > nlsym.h &&
  230. X/* CHK=0x23B9 */
  231. X/*+-------------------------------------------------------------------------
  232. X    nlsym.h -- utility nlist - fast access to kernel /dev/kmem offsets
  233. X    ...!emory!n4hgf!wht
  234. X
  235. XThe nlsym file contains three records:
  236. X1.  struct stat unixstat - stat buffer from /unix at file creation time
  237. X2.  struct nlist nlsym - the structure of nlist'd information
  238. X3.  long unique - a unique identifier to help ensure correct nlsym length
  239. X
  240. X--------------------------------------------------------------------------*/
  241. X/*+:EDITS:*/
  242. X/*:06-27-1990-01:57-wht@n4hgf-1.10-incorporate suggestions from alpha testers */
  243. X/*:06-27-1990-01:55-wht@n4hgf-use 64 bits of unique check */
  244. X/*:06-25-1990-04:14-wht@n4hgf-1.02-better error handling */
  245. X/*:06-24-1990-20:53-wht@n4hgf-v1.01-add ISC support thanks to peter@radig.de */
  246. X/*:06-21-1990-14:26-r@n4hgf-version x0.12 seems bug free */
  247. X/*:10-27-1988-11:07-wht-creation */
  248. X
  249. X#define UNIX_KERNEL        "/unix"
  250. X#define UNIX_NLSYM        "/unix.nlsym"
  251. X#define NLSYM_UNIQUE1    0x1BADD00DL
  252. X#define NLSYM_UNIQUE2    0xDEADB1FFL
  253. X
  254. X#define Nindex_AVAILRMEM            0
  255. X#define Nindex_AVAILSMEM            1
  256. X#define Nindex_BDEVCNT              2
  257. X#define Nindex_BDEVSW               3
  258. X#define Nindex_BOOTINFO             4
  259. X#define Nindex_CDEVCNT              5
  260. X#define Nindex_CDEVSW               6
  261. X#define Nindex_CFREE                7
  262. X#define Nindex_CFREECNT             8
  263. X#define Nindex_CFREELIST            9
  264. X#define Nindex_CONSSW              10
  265. X#define Nindex_CURPROC             11
  266. X#define Nindex_DINFO               12
  267. X#define Nindex_DSTFLAG             13
  268. X#define Nindex_DUMPDEV             14
  269. X#define Nindex_EMAP                15
  270. X#define Nindex_FFREELIST           16
  271. X#define Nindex_FILE                17
  272. X#define Nindex_FMODCNT             18
  273. X#define Nindex_FMODSW              19
  274. X#define Nindex_FREEMEM             20
  275. X#define Nindex_FSINFO              21
  276. X#define Nindex_FSTYPSW             22
  277. X#define Nindex_HZ                  23
  278. X#define Nindex_IDLESERVER          24
  279. X#define Nindex_IFREELIST           25
  280. X#define Nindex_INODE               26
  281. X#define Nindex_KPTBL               27
  282. X#define Nindex_LBOLT               28
  283. X#define Nindex_LINECNT             29
  284. X#define Nindex_LINESW              30
  285. X#define Nindex_MAXCLICK            31
  286. X#define Nindex_MAXMEM              32
  287. X#define Nindex_MINFO               33
  288. X#define Nindex_MOUNT               34
  289. X#define Nindex_MSGLISTCNT          35
  290. X#define Nindex_NFSTYP              36
  291. X#define Nindex_NPTALLOCED          37
  292. X#define Nindex_NPTFREE             38
  293. X#define Nindex_NSERVERS            39
  294. X#define Nindex_NSWAP               40
  295. X#define Nindex_NSYSENT             41
  296. X#define Nindex_OLDPROC             42
  297. X#define Nindex_OLD_CURPROC         43
  298. X#define Nindex_PANICSTR            44
  299. X#define Nindex_PHYSMEM             45
  300. X#define Nindex_PIPEDEV             46
  301. X#define Nindex_PROC                47
  302. X#define Nindex_RCINFO              48
  303. X#define Nindex_ROOTDEV             49
  304. X#define Nindex_RUNQ                50
  305. X#define Nindex_SHLBINFO            51
  306. X#define Nindex_SWAPDEV             52
  307. X#define Nindex_SWPLO               53
  308. X#define Nindex_SYSERR              54
  309. X#define Nindex_SYSINFO             55
  310. X#define Nindex_SYSSEGS             56
  311. X#define Nindex_SYSWAIT             57
  312. X#define Nindex_TIME                58
  313. X#define Nindex_TIMEZONE            59
  314. X#define Nindex_TTHIWAT             60
  315. X#define Nindex_TTLOWAT             61
  316. X#define Nindex_TUNE                62
  317. X#define Nindex_U                   63
  318. X#define Nindex_USERTABLE           64
  319. X#define Nindex_V                   65
  320. X#define Nindex_WIN_UBLK            66
  321. X#ifdef M_UNIX
  322. X#define Nindex_SIO_TTY             67
  323. X#endif
  324. X
  325. X#define bootinfoaddr (nlsym[Nindex_BOOTINFO].n_value)
  326. X#define freememaddr (nlsym[Nindex_FREEMEM].n_value)
  327. X#define lboltaddr (nlsym[Nindex_LBOLT].n_value)
  328. X#define maxmemaddr (nlsym[Nindex_MAXMEM].n_value)
  329. X#define minfoaddr (nlsym[Nindex_MINFO].n_value)
  330. X#define nswapaddr (nlsym[Nindex_NSWAP].n_value)
  331. X#define physmemaddr (nlsym[Nindex_PHYSMEM].n_value)
  332. X#define procaddr (nlsym[Nindex_PROC].n_value)
  333. X#define sysinfoaddr (nlsym[Nindex_SYSINFO].n_value)
  334. X#define tuneaddr (nlsym[Nindex_TUNE].n_value)
  335. X#define vaddr (nlsym[Nindex_V].n_value)
  336. X#ifdef M_UNIX
  337. X#define sio_ttyaddr (nlsym[Nindex_SIO_TTY].n_value)
  338. X#endif
  339. X
  340. X#ifdef DEFINE_NLSYM
  341. Xstruct nlist nlsym[] =
  342. X{
  343. X    { "availrmem" },
  344. X    { "availsmem" },
  345. X    { "bdevcnt" },
  346. X    { "bdevsw" },
  347. X    { "bootinfo" },
  348. X    { "cdevcnt" },
  349. X    { "cdevsw" },
  350. X    { "cfree" },
  351. X    { "cfreecnt" },
  352. X    { "cfreelist" },
  353. X    { "conssw" },
  354. X    { "curproc" },
  355. X    { "dinfo" },
  356. X    { "Dstflag" },
  357. X    { "dumpdev" },
  358. X    { "emap" },
  359. X    { "ffreelist" },
  360. X    { "file" },
  361. X    { "fmodcnt" },
  362. X    { "fmodsw" },
  363. X    { "freemem" },
  364. X    { "fsinfo" },
  365. X    { "fstypsw" },
  366. X    { "Hz" },
  367. X    { "idleserver" },
  368. X    { "ifreelist" },
  369. X    { "inode" },
  370. X    { "kptbl" },
  371. X    { "lbolt" },
  372. X    { "linecnt" },
  373. X    { "linesw" },
  374. X    { "maxclick" },
  375. X    { "maxmem" },
  376. X    { "minfo" },
  377. X    { "mount" },
  378. X    { "msglistcnt" },
  379. X    { "nfstyp" },
  380. X    { "nptalloced" },
  381. X    { "nptfree" },
  382. X    { "nservers" },
  383. X    { "nswap" },
  384. X    { "nsysent" },
  385. X    { "oldproc" },
  386. X    { "old_curproc" },
  387. X    { "panicstr" },
  388. X    { "physmem" },
  389. X    { "pipedev" },
  390. X    { "proc" },
  391. X    { "rcinfo" },
  392. X    { "rootdev" },
  393. X    { "runq" },
  394. X    { "shlbinfo" },
  395. X    { "swapdev" },
  396. X    { "swplo" },
  397. X    { "syserr" },
  398. X    { "sysinfo" },
  399. X    { "syssegs" },
  400. X    { "syswait" },
  401. X    { "time" },
  402. X    { "Timezone" },
  403. X    { "tthiwat" },
  404. X    { "ttlowat" },
  405. X    { "tune" },
  406. X    { "u" },
  407. X    { "usertable" },
  408. X    { "v" },
  409. X    { "win_ublk" },
  410. X#ifdef M_UNIX
  411. X    { "sio_tty" },
  412. X#endif
  413. X    { (char *)0 }
  414. X};
  415. X#else
  416. Xextern struct nlist nlsym[];
  417. X#endif
  418. X
  419. X/* vi: set tabstop=4 shiftwidth=4: */
  420. SHAR_EOF
  421. $TOUCH -am 0715025190 nlsym.h &&
  422. chmod 0644 nlsym.h ||
  423. echo "restore of nlsym.h failed"
  424. set `wc -c nlsym.h`;Wc_c=$1
  425. if test "$Wc_c" != "5472"; then
  426.     echo original size 5472, current size $Wc_c
  427. fi
  428. # ============= u386mon.h ==============
  429. echo "x - extracting u386mon.h (Text)"
  430. sed 's/^X//' << 'SHAR_EOF' > u386mon.h &&
  431. X/* CHK=0x259A */
  432. X/*+-------------------------------------------------------------------------
  433. X    u386mon.h - UNIX 386 system monitor definitions
  434. X    wht@n4hgf.Mt-Park.GA.US
  435. X--------------------------------------------------------------------------*/
  436. X/*+:EDITS:*/
  437. X/*:07-10-1990-19:06-root@n4hgf-redesign attributes/color pairs */
  438. X/*:07-10-1990-18:33-root@n4hgf-move pio wait to medium alert */
  439. X/*:07-03-1990-03:21-root@n4hgf-add cpBANWARN and renumber */
  440. X/*:06-27-1990-01:57-wht@n4hgf-1.10-incorporate suggestions from alpha testers */
  441. X/*:06-25-1990-04:14-wht@n4hgf-1.02-better error handling */
  442. X/*:06-24-1990-20:53-wht@n4hgf-v1.01-add ISC support thanks to peter@radig.de */
  443. X/*:06-21-1990-14:27-r@n4hgf-version x0.12 seems bug free */
  444. X/*:06-20-1990-03:03-root@n4hgf-trick use_cp into making bright fgnd colors */
  445. X/*:06-19-1990-21:35-wht-get ready for release */
  446. X
  447. X#ifndef M_SYSV    /* for ISC */
  448. X#define u_char unsigned char
  449. X#define u_long unsigned long
  450. X#endif
  451. X
  452. Xchar *getenv();
  453. Xchar *strchr();
  454. Xchar *strrchr();
  455. X#ifdef __STDC__
  456. Xvoid *malloc();
  457. X#else
  458. Xchar *malloc();
  459. X#endif
  460. X
  461. X#define pW(pan) panel_window(pan)
  462. X#define W WINDOW
  463. X#define P PANEL
  464. X
  465. X/* color numbers for EGA/VGA */
  466. X#ifdef COLOR_16_TERMINFO    /* wht 16-color fgnd/bgnd terminfo */
  467. X#define cHIBIT    8
  468. X#define cBLK    0
  469. X#define cBLU    1
  470. X#define cGRN    2
  471. X#define cCYN    3
  472. X#define cRED    4
  473. X#define cMAG    5
  474. X#define cBRN    6
  475. X#define cWHT    7
  476. X#define cGRY    (cBLK | cHIBIT)
  477. X#define cLTB    (cBLU | cHIBIT)
  478. X#define cLTG    (cGRN | cHIBIT)
  479. X#define cLTC    (cCYN | cHIBIT)
  480. X#define cLTR    (cRED | cHIBIT)
  481. X#define cLTM    (cMAG | cHIBIT)
  482. X#define cYEL    (cBRN | cHIBIT)
  483. X#define cHIW    (cWHT | cHIBIT)
  484. X#else
  485. X#define cBLK    COLOR_BLACK
  486. X#define cBLU    COLOR_BLUE
  487. X#define cGRN    COLOR_GREEN
  488. X#define cCYN    COLOR_CYAN
  489. X#define cRED    COLOR_RED
  490. X#define cMAG    COLOR_MAGENTA
  491. X#define cBRN    COLOR_YELLOW
  492. X#define cWHT    COLOR_WHITE
  493. X#define cGRY    COLOR_BLACK
  494. X#define cLTB    COLOR_BLUE
  495. X#define cLTG    COLOR_GREEN
  496. X#define cLTC    COLOR_CYAN
  497. X#define cLTR    COLOR_RED
  498. X#define cLTM    COLOR_MAGENTA
  499. X#define cYEL    COLOR_YELLOW
  500. X#define cHIW    COLOR_WHITE
  501. X#endif
  502. X
  503. X#define sTL        0xDA
  504. X#define sTR        0xBF
  505. X#define sBL        0xC0
  506. X#define sBR        0xD9
  507. X#define sLT        0xC3    /* left hand T */
  508. X#define sRT        0xB4    /* right hand T */
  509. X#define sVR        0xB3    /* vertical rule */
  510. X#define sHR        0xC4    /* horizontal rule */
  511. X
  512. X/* color pairs */
  513. X#ifdef COLOR_16_TERMINFO    /* wht 16-color fgnd/bgnd terminfo */
  514. X#define use_cp(win,cp) wattrset(win,COLOR_PAIR(cp))
  515. X#else
  516. X#define use_cp(win,cp) wattrset(win,\
  517. X    (color_avail) ? color_attr[cp] : mono_attr[cp])
  518. X#endif
  519. X
  520. X/* if color par numbers are changed, disputil.c
  521. X * color_attr and mono_attr tables
  522. X * must also be changed
  523. X */
  524. X#define cpINFO        1    /* information field */
  525. X#define cpREVERSE    2    /* "reverse video" */
  526. X#define cpBANWARN    3    /* banner warning */
  527. X#define cpLOW        4    /* low/user/io */
  528. X#define cpMED        5    /* medium/kernel/pio */
  529. X#define cpHIGH        6    /* high/brk/swp */
  530. X#define cpBANNER    7    /* banner */
  531. X#define cpLIT        8    /* field literals */
  532. Xextern int color_avail;
  533. Xextern long color_attr[];
  534. Xextern long mono_attr[];
  535. X
  536. X#define MSG_TLY        (LINES - 2)
  537. X#define CMD_TLY        (LINES - 1)
  538. X#define LVMSG_Y        MSG_TLY
  539. X#define LVMSG_X        0
  540. X
  541. X#define CPUSCALE_TLY        1
  542. X#define CPUSCALE_SX            13
  543. X#define CPUSCALE_WIDTH        50
  544. X
  545. X#define WAITSCALE_TLY        5
  546. X#define WAITSCALE_SX        13
  547. X#define WAITSCALE_WIDTH        50
  548. X
  549. X/* Sysinfo/Minfo per second area */
  550. X#define PER_SEC_TLY            9
  551. X#define PER_SEC1_TLX        0
  552. X#define PER_SEC2_TLX        18
  553. X#define PER_SEC3_TLX        35
  554. X#define PER_SEC4_TLX        51
  555. X#define PER_SEC5_TLX        66
  556. X
  557. X/* extra info area */
  558. X#define EXTRA_TLY            26
  559. X#define EXTRA1_TLX            0
  560. X#define EXTRA2_TLX            18
  561. X#define EXTRA3_TLX            43
  562. X#define EXTRA4_TLX            62
  563. X
  564. X#include "lint_args.h"
  565. X
  566. X/* vi: set tabstop=4 shiftwidth=4: */
  567. X/* end of u386mon.h */
  568. SHAR_EOF
  569. $TOUCH -am 0715025190 u386mon.h &&
  570. chmod 0644 u386mon.h ||
  571. echo "restore of u386mon.h failed"
  572. set `wc -c u386mon.h`;Wc_c=$1
  573. if test "$Wc_c" != "3631"; then
  574.     echo original size 3631, current size $Wc_c
  575. fi
  576. # ============= renice/Makefile ==============
  577. if test ! -d 'renice'; then
  578.     echo "x - creating directory renice"
  579.     mkdir 'renice'
  580. fi
  581. echo "x - extracting renice/Makefile (Text)"
  582. sed 's/^X//' << 'SHAR_EOF' > renice/Makefile &&
  583. X#  CHK=0xD897
  584. X#+-------------------------------------------------------------------
  585. X#  Makefile for renice for SCO UNIX V/386
  586. X#  ...!emory!n4hgf!wht
  587. X#--------------------------------------------------------------------
  588. X#+:EDITS:*/
  589. X#:06-25-1990-04:14-wht@n4hgf-1.03-better error handling
  590. X#:06-21-1990-14:27-r@n4hgf-version x0.12 seems bug free
  591. X#:06-19-1990-21:37-wht@n4hgf-get ready for 0.08 release
  592. X
  593. X#------------> CFLAGS 
  594. XCFLAGS = -c -Octl -DLINT_ARGS
  595. X#CFLAGS = -c -O
  596. X
  597. X#------------> BINDIR
  598. XBINDIR = /usr/local/bin
  599. X
  600. X#LDFLAGS = -s
  601. X
  602. X
  603. X#handle Sys V make "feature" of using SHELL
  604. XSHELL = /bin/sh
  605. X
  606. X#FCRC = fcrc -u $*.c ;
  607. X.c.o:;    $(FCRC) $(CC) $(CFLAGS) $*.c 
  608. X
  609. XSRC = \
  610. X    renice.c
  611. X
  612. XRENICE_OBJ =\
  613. X    renice.o\
  614. X    ../libnlsym.o\
  615. X    libkmem-w.o
  616. X
  617. Xall: renice
  618. X
  619. X#must run as root
  620. Xinstall: all
  621. X    mv renice $(BINDIR)
  622. X    chmod 4711 $(BINDIR)/renice
  623. X    chown root $(BINDIR)/renice
  624. X    @echo ' ';echo 'csh users rehash before executing'
  625. X
  626. Xrenice: $(RENICE_OBJ)
  627. X    $(CC) $(LDFLAGS) -o $@ $(RENICE_OBJ) $(LIB)
  628. X
  629. Xlibkmem-w.o: ../libkmem.c
  630. X    cc $(CFLAGS) -I .. -DKWRITE_NEEDED ../libkmem.c; mv libkmem.o libkmem-w.o
  631. X
  632. X../libnlsym.o: ../libnlsym.c
  633. X    cd ..;make libnlsym.o
  634. X
  635. Xclean:
  636. X    rm -f renice.o libkmem-w.o core 
  637. X
  638. Xclobber: clean
  639. X    rm -f renice
  640. X
  641. SHAR_EOF
  642. $TOUCH -am 0715025190 renice/Makefile &&
  643. chmod 0644 renice/Makefile ||
  644. echo "restore of renice/Makefile failed"
  645. set `wc -c renice/Makefile`;Wc_c=$1
  646. if test "$Wc_c" != "1200"; then
  647.     echo original size 1200, current size $Wc_c
  648. fi
  649. # ============= renice/renice.c ==============
  650. echo "x - extracting renice/renice.c (Text)"
  651. sed 's/^X//' << 'SHAR_EOF' > renice/renice.c &&
  652. X/* CHK=0xE998 */
  653. X/*+-------------------------------------------------------------------------
  654. X    renice.c - UNIX 386 renice
  655. X
  656. X * This program was written by me, Mike "Ford" Ditto, and
  657. X * I hereby release it into the public domain in the interest
  658. X * of promoting the development of free, quality software
  659. X * for the hackers and users of the world.
  660. X *
  661. X * Feel free to use, copy, modify, improve, and redistribute
  662. X * this program, but keep in mind the spirit of this
  663. X * contribution; always provide source, and always allow
  664. X * free redistribution (shareware is fine with me).  If
  665. X * you use a significant part of this code in a program of
  666. X * yours, I would appreciate being given the appropriate
  667. X * amount of credit.
  668. X *                -=] Ford [=-
  669. X *
  670. X--------------------------------------------------------------------------*/
  671. X/*+:EDITS:*/
  672. X/*:06-26-1990-15:09-wht@n4hgf-adapt Ford's work to UNIX 386 */
  673. X
  674. X#include <stdio.h>
  675. X#include <errno.h>
  676. X#include <sys/types.h>
  677. X#undef NGROUPS_MAX
  678. X#undef NULL
  679. X#include <sys/param.h>
  680. X#include <sys/immu.h>
  681. X#include <sys/region.h>
  682. X#include <sys/proc.h>
  683. X#include <sys/var.h>
  684. X#include <nlist.h>
  685. X#include "../nlsym.h"
  686. X#include "../libkmem.h"
  687. X#include "../libnlsym.h"
  688. X
  689. Xstruct var v;
  690. Xstruct proc tproc;
  691. Xint myuid;
  692. Xchar *progname;
  693. Xchar s128[128];
  694. Xdaddr_t myreadcnt;
  695. X
  696. X/*+-------------------------------------------------------------------------
  697. X    leave_text(text,exit_code)
  698. XIf exit_code == 255, do perror
  699. X--------------------------------------------------------------------------*/
  700. Xvoid
  701. Xleave_text(text,exit_code)
  702. Xchar *text;
  703. Xint exit_code;
  704. X{
  705. X    if(exit_code == 255)
  706. X        perror(text);
  707. X    else
  708. X    {
  709. X        fputs(text,stderr);
  710. X        fputs("\n",stderr);
  711. X    }
  712. X    exit(exit_code);
  713. X}    /* end of leave_text */
  714. X
  715. X/*+-------------------------------------------------------------------------
  716. X    renice(pid,value,relative) - change nice of process `pid'
  717. Xbased on 'value' and 'relative'
  718. X--------------------------------------------------------------------------*/
  719. Xrenice(pid,value,relative)
  720. Xint pid;
  721. Xint value;
  722. Xint relative;
  723. X{
  724. X    register i;
  725. X    int tmpnice;
  726. X
  727. X    for(i = 0; i < v.v_proc; i++)
  728. X    {
  729. X        kread((caddr_t)&tproc,(daddr_t)((struct proc *)procaddr + i),
  730. X            sizeof(struct proc));
  731. X        if(tproc.p_pid == pid)
  732. X        {
  733. X#ifdef DEBUG
  734. X            fprintf(stderr,"Found it!  proc[%d], p_uid is %d\n",
  735. X                i,tproc.p_uid);
  736. X
  737. X            fprintf(stderr,"Old p_nice was %d\n",tproc.p_nice);
  738. X#endif /* DEBUG */
  739. X
  740. X            tmpnice = tproc.p_nice;
  741. X
  742. X            if(relative)
  743. X                tmpnice += value;
  744. X            else
  745. X                tmpnice = value;
  746. X
  747. X            if(tmpnice >= 40)
  748. X                tmpnice = 40;
  749. X            if(tmpnice < 0)
  750. X                tmpnice = 0;
  751. X
  752. X#ifdef DEBUG
  753. X            fprintf(stderr,"New p_nice is %d\n",tmpnice);
  754. X#endif /* DEBUG */
  755. X
  756. X            if( 
  757. X#ifdef WHT
  758. X                (myuid && (myuid != 201))
  759. X#else
  760. X                myuid
  761. X#endif
  762. X                 && ((myuid != tproc.p_uid) || (tmpnice < tproc.p_nice)))
  763. X            {
  764. X                errno = EACCES;
  765. X                sprintf(s128,"%s: can't renice process %d",progname,pid);
  766. X                perror(s128);
  767. X                return 1;
  768. X            }
  769. X
  770. X            tproc.p_nice = tmpnice;
  771. X
  772. X            kwrite((daddr_t)&((struct proc *)procaddr)[i]
  773. X                + ( ((caddr_t)&tproc.p_nice) - (caddr_t)&tproc ),
  774. X                (caddr_t)&tproc.p_nice,sizeof(tproc.p_nice));
  775. X            return(0);
  776. X        }
  777. X    }
  778. X    fprintf(stderr,"%s: process %d not found.\n",progname,pid);
  779. X
  780. X    return(1);
  781. X}    /* end of renice */
  782. X
  783. X/*+-------------------------------------------------------------------------
  784. X    usage()
  785. X--------------------------------------------------------------------------*/
  786. Xvoid
  787. Xusage()
  788. X{
  789. X    fprintf(stderr,"usage: %s [{+-}inc] [=prio] pid ...\n",progname);
  790. X    exit(-1);
  791. X}    /* end of usage */
  792. X
  793. X/*+-------------------------------------------------------------------------
  794. X    main(argc,argv)
  795. X--------------------------------------------------------------------------*/
  796. Xmain(argc,argv)
  797. Xint argc;
  798. Xchar **argv;
  799. X{
  800. X    int status=0;
  801. X    int pid;
  802. X    int relative = 1;
  803. X    int value = 0;
  804. X
  805. X    progname = *argv;
  806. X    if(argc < 2)
  807. X        usage();
  808. X
  809. X    myuid = getuid();
  810. X    nlsym_read();
  811. X    kinit(1);
  812. X    kread((caddr_t)&v,vaddr,sizeof(v));
  813. X
  814. X    while(++argv,--argc)
  815. X    {
  816. X        switch(**argv)
  817. X        {
  818. X        case '-':
  819. X            if(sscanf(*argv+1,"%d",&value) != 1)
  820. X                usage();
  821. X            relative = 1;
  822. X            break;
  823. X        case '+':
  824. X            if(sscanf(*argv+1,"%d",&value) != 1)
  825. X                usage();
  826. X            value = -value;
  827. X            relative = 1;
  828. X            break;
  829. X        case '=':
  830. X            if(sscanf(*argv+1,"%d",&value) != 1)
  831. X                usage();
  832. X            relative = 0;
  833. X            break;
  834. X        default:
  835. X            if(sscanf(*argv,"%d",&pid) != 1)
  836. X                usage();
  837. X            status += renice(pid,value,relative);
  838. X        }
  839. X    }
  840. X
  841. X    exit(status);
  842. X}    /* end of main */
  843. X
  844. X/* vi: set tabstop=4 shiftwidth=4: */
  845. X/* end of renice.c */
  846. SHAR_EOF
  847. $TOUCH -am 0715025190 renice/renice.c &&
  848. chmod 0644 renice/renice.c ||
  849. echo "restore of renice/renice.c failed"
  850. set `wc -c renice/renice.c`;Wc_c=$1
  851. if test "$Wc_c" != "4399"; then
  852.     echo original size 4399, current size $Wc_c
  853. fi
  854. # ============= uutool/README ==============
  855. if test ! -d 'uutool'; then
  856.     echo "x - creating directory uutool"
  857.     mkdir 'uutool'
  858. fi
  859. echo "x - extracting uutool/README (Text)"
  860. sed 's/^X//' << 'SHAR_EOF' > uutool/README &&
  861. XUUTOOL
  862. X------
  863. X
  864. XUutool is a single program called with different names to
  865. Xaccomplish specific functions.  These names are:
  866. X
  867. X     uupoke - "poke" a uucp connection into life
  868. X              similar to "uucico -r1 [-x#] -[S|s]system name
  869. X
  870. X     uulstat - display summary uucp connection status
  871. X
  872. X     uukill -  terminate a uucico session (promptly, but
  873. X               with finesse); kill uucico and any active
  874. X               dialer programs
  875. X
  876. XThis is included with u386mon primarily as an example of alternate
  877. Xuses of libkmem (see killpc.c), but I have found them very useful.
  878. X
  879. Xusage information
  880. X-----------------
  881. Xusage: uupoke [-a] [-v] [-x#] systemname ...
  882. X       uulstat systemname ...
  883. X       uukill systemname ...
  884. X
  885. Xuupoke [-a] [-v] [-x#] systemname ...
  886. X----------------------------------
  887. X
  888. XCall each system in the 'systemname' list in turn.  The -a switch ("always")
  889. Xcauses -S to be used in the uucico invocation; if -a is omited,
  890. Xuupoke will make it's own analysis of work to be done and execute
  891. Xuucico for a system only if outgoing work is found.
  892. X
  893. XThe -v switch causes uupoke to display status similar to uulstat
  894. Xas it does its work.
  895. X
  896. XThe -x# switch sets the uucico debugging level.  The default is -x1.
  897. XSetting -x0 may still result in -x1 output occurring due to
  898. Xuucico switch interpretation.
  899. X
  900. Xuulstat systemsnames
  901. X--------------------
  902. X
  903. XSummary status for each system in the 'systemname' list is displayed.
  904. X
  905. Xexample of inactive connection:
  906. Xsystem: gatech: uucico not active
  907. Xlast status: successful  (0 failed calls)
  908. Xqueues:  input: 0  output: 0 data files: 0
  909. Xlast call: Sat Jul 14 19:10:55 1990
  910. Xnext call: none scheduled
  911. X
  912. Xexample of active connection:
  913. Xsystem: gatech: uucico pid 9274 active on tty2b
  914. Xlast status: CALL IN PROGRESS  (0 failed calls)
  915. Xqueues:  input: 0  output: 0 data files: 0
  916. Xlast call: Sun Jul 15 02:29:30 1990
  917. Xnext call: now
  918. X
  919. Xuukill systemnames
  920. X------------------
  921. X
  922. XOnly executable by root, this invocation promptly terminates
  923. Xan active incoming or outgoing uucico session for each system
  924. Xnamed in 'systemnames'.
  925. SHAR_EOF
  926. $TOUCH -am 0715025990 uutool/README &&
  927. chmod 0644 uutool/README ||
  928. echo "restore of uutool/README failed"
  929. set `wc -c uutool/README`;Wc_c=$1
  930. if test "$Wc_c" != "2027"; then
  931.     echo original size 2027, current size $Wc_c
  932. fi
  933. # ============= uutool/Makefile ==============
  934. echo "x - extracting uutool/Makefile (Text)"
  935. sed 's/^X//' << 'SHAR_EOF' > uutool/Makefile &&
  936. X#  CHK=0x9F4A
  937. X#+-------------------------------------------------------------------
  938. X#  Makefile for uutool for SCO UNIX V/386
  939. X#  ...!emory!n4hgf!wht
  940. X#--------------------------------------------------------------------
  941. X#+:EDITS:*/
  942. X#:06-25-1990-04:14-wht@n4hgf-1.03-better error handling
  943. X#:06-21-1990-14:27-r@n4hgf-version x0.12 seems bug free
  944. X#:06-19-1990-21:37-wht@n4hgf-get ready for 0.08 release
  945. X
  946. X#------------> CFLAGS 
  947. XCFLAGS = -c -Octl -DLINT_ARGS
  948. X#CFLAGS = -c -O
  949. X
  950. X#------------> BINDIR
  951. XBINDIR = /usr/lib/uucp
  952. X
  953. X#LDFLAGS = -s
  954. X
  955. XLIB = -lx
  956. X
  957. X#handle Sys V make "feature" of using SHELL
  958. XSHELL = /bin/sh
  959. X
  960. X#FCRC = fcrc -u $*.c ;
  961. X.c.o:;    $(FCRC) $(CC) $(CFLAGS) $*.c 
  962. X
  963. XSRC = \
  964. X    uutool.c
  965. X
  966. XUUTOOL_OBJ =\
  967. X    uutool.o\
  968. X    killpc.o\
  969. X    wstext.o\
  970. X    ../libnlsym.o\
  971. X    ../libkmem.o
  972. X
  973. Xall: uutool
  974. X
  975. X#must run as root
  976. Xinstall: all
  977. X    rm -f $(BINDIR)/uulstat $(BINDIR)/uupoke $(BINDIR)/uukill $(BINDIR)/uulstat
  978. X    cp uutool $(BINDIR)/uulstat
  979. X    chown uucp $(BINDIR)/uulstat
  980. X    chmod 711 $(BINDIR)/uulstat
  981. X    ln $(BINDIR)/uulstat $(BINDIR)/uupoke
  982. X    ln $(BINDIR)/uulstat $(BINDIR)/uukill
  983. X    @echo ' ';echo 'csh users rehash before executing'
  984. X
  985. Xuutool: $(UUTOOL_OBJ)
  986. X    $(CC) $(LDFLAGS) -o $@ $(UUTOOL_OBJ) $(LIB)
  987. X
  988. X../libnlsym.o: ../libnlsym.c
  989. X    cd ..;make libnlsym.o
  990. X
  991. X../libkmem.o: ../libkmem.c
  992. X    cd ..;make libkmem.o
  993. X
  994. Xclean:
  995. X    rm -f uutool.o libkmem-w.o core 
  996. X
  997. Xclobber: clean
  998. X    rm -f uutool
  999. X
  1000. SHAR_EOF
  1001. $TOUCH -am 0715024290 uutool/Makefile &&
  1002. chmod 0644 uutool/Makefile ||
  1003. echo "restore of uutool/Makefile failed"
  1004. set `wc -c uutool/Makefile`;Wc_c=$1
  1005. if test "$Wc_c" != "1344"; then
  1006.     echo original size 1344, current size $Wc_c
  1007. fi
  1008. # ============= uutool/killpc.c ==============
  1009. echo "x - extracting uutool/killpc.c (Text)"
  1010. sed 's/^X//' << 'SHAR_EOF' > uutool/killpc.c &&
  1011. X/* CHK=0xFAEC */
  1012. X#define USE_KMEM
  1013. X/*+-------------------------------------------------------------------------
  1014. X    killpc.c
  1015. X
  1016. X  Defined functions:
  1017. X    kill_parent_and_children(ppid,sig_to_parent,sig_to_children)
  1018. X    leave_text(text,exit_code)
  1019. X
  1020. X--------------------------------------------------------------------------*/
  1021. X/*+:EDITS:*/
  1022. X/*:07-15-1990-01:49-wht-creation */
  1023. X
  1024. X#include <stdio.h>
  1025. X#ifdef USE_KMEM
  1026. X#include <sys/types.h>
  1027. X#undef NGROUPS_MAX
  1028. X#undef NULL
  1029. X#include <sys/param.h>
  1030. X#include <sys/immu.h>
  1031. X#include <sys/region.h>
  1032. X#include <sys/proc.h>
  1033. X#include <sys/var.h>
  1034. X#include <nlist.h>
  1035. X
  1036. X#include "../nlsym.h"
  1037. X#include "../libkmem.h"
  1038. X#include "../libnlsym.h"
  1039. X
  1040. Xdaddr_t myreadcnt = 0L;
  1041. X#endif /* USE_KMEM */
  1042. X
  1043. Xextern int verbose;
  1044. X
  1045. X/*+-------------------------------------------------------------------------
  1046. X    leave_text(text,exit_code)
  1047. XIf exit_code == 255, do perror
  1048. X--------------------------------------------------------------------------*/
  1049. X#ifdef USE_KMEM
  1050. Xvoid
  1051. Xleave_text(text,exit_code)
  1052. Xchar *text;
  1053. Xint exit_code;
  1054. X{
  1055. X    if(exit_code == 255)
  1056. X        perror(text);
  1057. X    else
  1058. X    {
  1059. X        fputs(text,stderr);
  1060. X        fputs("\n",stderr);
  1061. X    }
  1062. X    exit(exit_code);
  1063. X}    /* end of leave_text */
  1064. X#endif /* USE_KMEM */
  1065. X
  1066. X/*+-------------------------------------------------------------------------
  1067. X    kill_parent_and_children(ppid,sig_to_parent,sig_to_children)
  1068. X--------------------------------------------------------------------------*/
  1069. Xvoid
  1070. Xkill_parent_and_children(ppid,sig_to_parent,sig_to_children)
  1071. Xint ppid;
  1072. Xint sig_to_parent;
  1073. Xint sig_to_children;
  1074. X{
  1075. X#ifdef USE_KMEM
  1076. Xregister struct proc *tproc;
  1077. Xint iproc;
  1078. Xstatic struct proc *procs = (struct proc *)0;
  1079. Xstatic struct var v;
  1080. Xstatic char *memfail = "cannot alloc memory for proc table";
  1081. X
  1082. X    nlsym_read();
  1083. X    kinit(0);
  1084. X    if(!procs)
  1085. X    {
  1086. X        kread((caddr_t)&v,vaddr,sizeof(v));
  1087. X        if(!(procs = (struct proc *)malloc(sizeof(struct proc) * v.v_proc)))
  1088. X            leave_text(memfail,1);
  1089. X    }
  1090. X
  1091. X    kread((caddr_t)procs,procaddr,sizeof(struct proc) * v.v_proc);
  1092. X
  1093. X    for(iproc = 0; iproc < v.v_proc; iproc++)
  1094. X    {
  1095. X        tproc = &procs[iproc];
  1096. X        if(    tproc->p_stat &&
  1097. X            (tproc->p_ppid == ppid) &&
  1098. X            (tproc->p_pid != ppid))
  1099. X        {                            /* eliminate from consideration */
  1100. X            kill(tproc->p_pid,sig_to_children);
  1101. X        }
  1102. X    }
  1103. X    kill(ppid,sig_to_parent);
  1104. X
  1105. X#else /* do not use kmem */
  1106. Xint col;
  1107. Xint ps_ppid_col;
  1108. Xint ps_pid_col;
  1109. Xchar psbuf[256];
  1110. Xchar psbuf2[256];
  1111. X#define MAX_PS_FIELDS 32
  1112. Xchar *fields[MAX_PS_FIELDS];
  1113. Xint nfields;
  1114. XFILE *popen();
  1115. XFILE *fpps = popen("ps -ef","r");
  1116. X
  1117. X    if(!fpps)
  1118. X    {
  1119. X        printf("cannot read process status\n");
  1120. X        return;
  1121. X    }
  1122. X    fgets(psbuf,sizeof(psbuf),fpps);
  1123. X    if(verbose)
  1124. X    {
  1125. X        printf("killing\n");
  1126. X        fputs(psbuf,stdout);
  1127. X    }
  1128. X    build_field_array(psbuf,fields,MAX_PS_FIELDS,&nfields);
  1129. X    for(col = 0; col < nfields; col++)
  1130. X    {
  1131. X        if(!strcmp("PPID",fields[col]))
  1132. X            ps_ppid_col = col;
  1133. X        else if(!strcmp("PID",fields[col]))
  1134. X            ps_pid_col = col;
  1135. X    }
  1136. X    while(fgets(psbuf,sizeof(psbuf),fpps))
  1137. X    {
  1138. X        if(verbose)
  1139. X            strcpy(psbuf2,psbuf);
  1140. X        build_field_array(psbuf,fields,MAX_PS_FIELDS,&nfields);
  1141. X        if(atoi(fields[ps_ppid_col]) == ppid)
  1142. X        {
  1143. X            if(verbose)
  1144. X                fputs(psbuf2,stdout);
  1145. X            kill(atoi(fields[ps_pid_col]),sig_to_children);
  1146. X        }
  1147. X        else if((atoi(fields[ps_pid_col]) == ppid) && verbose)
  1148. X            fputs(psbuf2,stdout);
  1149. X    }
  1150. X    pclose(fpps);
  1151. X    kill(ppid,sig_to_parent);
  1152. X    nap(2000L);
  1153. X#endif /* USE_KMEM */
  1154. X}    /* end of kill_parent_and_children */
  1155. X
  1156. X/* vi: set tabstop=4 shiftwidth=4: */
  1157. X/* end of killpc.c */
  1158. SHAR_EOF
  1159. $TOUCH -am 0715023690 uutool/killpc.c &&
  1160. chmod 0644 uutool/killpc.c ||
  1161. echo "restore of uutool/killpc.c failed"
  1162. set `wc -c uutool/killpc.c`;Wc_c=$1
  1163. if test "$Wc_c" != "3354"; then
  1164.     echo original size 3354, current size $Wc_c
  1165. fi
  1166. # ============= uutool/uutool.c ==============
  1167. echo "x - extracting uutool/uutool.c (Text)"
  1168. sed 's/^X//' << 'SHAR_EOF' > uutool/uutool.c &&
  1169. X/* CHK=0xCD46 */
  1170. Xchar *revision = "1.10";
  1171. X/*+-------------------------------------------------------------------------
  1172. X    uutool.c - HDB UUCP tool - uupoke/uukill/uulstat
  1173. X    wht@n4hgf.Mt-Park.GA.US
  1174. X
  1175. X  Defined functions:
  1176. X    basename(fullname)
  1177. X    build_field_array(cmd,field,field_max_quan,nfield_rtn)
  1178. X    cmd_uukill(uls)
  1179. X    cmd_uulstat(uls)
  1180. X    cmd_uupoke(uls,uucico_x_flag,poll_always)
  1181. X    dir_close(dirp)
  1182. X    dir_open(dirname)
  1183. X    dir_read(dirp)
  1184. X    get_uucp_lstat(system_name,uls)
  1185. X    lockpid_to_tty(lockpid)
  1186. X    main(argc,argv)
  1187. X    parse_field(parsestr,termchars)
  1188. X    read_status_file(system_name,buf,bufsize)
  1189. X    spooldirname(fname)
  1190. X    statdirname(fname)
  1191. X
  1192. X--------------------------------------------------------------------------*/
  1193. X/*+:EDITS:*/
  1194. X/*:04-10-1990-21:20-wht@n4hgf-uupoke proceeds even if there is no status file */
  1195. X/*:04-03-1990-19:44-wht@n4hgf-version 1.00 working */
  1196. X
  1197. X#include <stdio.h>
  1198. X#include <signal.h>
  1199. X#include <errno.h>
  1200. X#include <sys/types.h>
  1201. X#include <sys/stat.h>
  1202. X
  1203. Xchar *ctime();
  1204. Xextern int errno;
  1205. Xextern char *sys_errlist[];
  1206. X
  1207. Xchar *wait_status_text();
  1208. X
  1209. X#define DDIR FILE
  1210. Xstruct dent
  1211. X{
  1212. X    unsigned short d_inode;
  1213. X    char d_name[14];
  1214. X};
  1215. X
  1216. Xchar *STATUSDIR = "/usr/spool/uucp/.Status";
  1217. Xchar *LOCKDIR = "/usr/spool/uucp/LCK..";
  1218. Xchar *WORKDIR = "/usr/spool/uucp/";
  1219. Xchar *SPOOLDIR = "/usr/spool/uucp";
  1220. X
  1221. X#define SS_OK                    0     /* successful */
  1222. X#define SS_NO_DEVICE             1     /* no device */
  1223. X#define SS_TIME_WRONG            2     /* wrong time to call */
  1224. X#define SS_TALKING               3     /* TALKING */
  1225. X#define SS_CONVERSATION          4     /* conversation failed */
  1226. X#define SS_SEQBAD                5     /* bad sequence check */
  1227. X#define SS_LOGIN_FAILED          6     /* login failed */
  1228. X#define SS_DIAL_FAILED           7     /* dial failed */
  1229. X#define SS_BAD_LOG_MCH           8     /* bad login/machine */
  1230. X#define SS_LOCKED_DEVICE         9     /* DEVICE LOCKED */
  1231. X#define SS_ASSERT_ERROR          10    /* assert error */
  1232. X#define SS_BADSYSTEM             11    /* system not in Systems */
  1233. X#define SS_CANT_ACCESS_DEVICE    12    /* can't access device */
  1234. X#define SS_DEVICE_FAILED         13    /* device failed */
  1235. X#define SS_WRONG_MCH             14    /* wrong machine name */
  1236. X#define SS_CALLBACK              15    /* callback required */
  1237. X#define SS_RLOCKED               16    /* remote has lock for me */
  1238. X#define SS_RUNKNOWN              17    /* remote does not know me */
  1239. X#define SS_RLOGIN                18    /* remote reject after login */
  1240. X#define SS_UNKNOWN_RESPONSE      19    /* remote reject, unknown msg */
  1241. X#define SS_STARTUP               20    /* startup failed */
  1242. X#define SS_CHAT_FAILED           21    /* caller script failed */
  1243. X#if defined(M_XENIX) || defined(M_UNIX)
  1244. X#define SS_CALL_IN_PROGRESS         22    /* CALL IN PROGRESS */
  1245. X#define SS_CALL_FAILED           23    /* call failed (busy?) */
  1246. X#else
  1247. X#define SS_CALL_IN_PROGRESS         22    /* CALL IN PROGRESS */
  1248. X#endif
  1249. X
  1250. X#define UUCMD_NONE 0
  1251. X#define UUCMD_LSTAT 1
  1252. X#define UUCMD_POLL 2
  1253. X#define UUCMD_KILL 3
  1254. X
  1255. Xtypedef struct uucp_lstat
  1256. X{
  1257. X    char system[16];
  1258. X    int uucico_active;
  1259. X    long secs_last_try;
  1260. X    long secs_next_try;
  1261. X    int retry_count;
  1262. X    int status;
  1263. X    int input_queue_count;
  1264. X    int output_queue_count;
  1265. X    int dfil_count;
  1266. X    int locking_pid;
  1267. X    char locked_tty[32];
  1268. X    char work_dir[64];
  1269. X    char stattxt[40];
  1270. X    char linebuf[512];
  1271. X} UUCP_LSTAT;
  1272. X
  1273. Xchar *errortext[] =
  1274. X{
  1275. X    /*       00000000001111111111222222 */
  1276. X    /*       01234567890123456789012346 */
  1277. X    /* 0 */ "successful",
  1278. X    /* 1 */ "no device",
  1279. X    /* 2 */ "wrong time to call",
  1280. X    /* 3 */ "TALKING",
  1281. X    /* 4 */ "conversation failed",
  1282. X    /* 5 */ "bad sequence check",
  1283. X    /* 6 */ "login failed",
  1284. X    /* 7 */ "dial failed",
  1285. X    /* 8 */ "bad login/machine",
  1286. X    /* 9 */ "DEVICE LOCKED",
  1287. X    /* 10*/ "assert error",
  1288. X    /* 11*/ "system not in Systems",
  1289. X    /* 12*/ "can't access device",
  1290. X    /* 13*/ "device failed",
  1291. X    /* 14*/ "wrong machine name",
  1292. X    /* 15*/ "callback required",
  1293. X    /* 16*/ "remote has lock for me",
  1294. X    /* 17*/ "remote does not know me",
  1295. X    /* 18*/ "remote reject after login",
  1296. X    /* 19*/ "remote reject, unknown msg",
  1297. X    /* 20*/ "startup failed",
  1298. X    /* 21*/ "caller script failed",
  1299. X#if defined(M_XENIX) || defined(M_UNIX)
  1300. X    /* 22*/ "CALL IN PROGRESS",
  1301. X    /* 23*/ "call failed (busy?)",
  1302. X#else
  1303. X    /* 22*/ "CALL IN PROGRESS",
  1304. X#endif
  1305. X};
  1306. X
  1307. X#if defined(M_XENIX) || defined(M_UNIX)
  1308. X#define SS_MSG_MAX 23
  1309. X#else
  1310. X#define SS_MSG_MAX 22
  1311. X#endif
  1312. X
  1313. Xint verbose = 0;
  1314. X
  1315. X/*+-----------------------------------------------------------------------
  1316. X    parse_field(parsestr,termchars)
  1317. X
  1318. XGet next field from string parsestr ((char *)0 on 2nd, 3rd, etc.
  1319. Xcalls), where fields are nonempty strings separated by runs of chars
  1320. Xfrom termchars.  Writes nulls into parsestr to end fields.
  1321. Xtermchars need not remain constant from call to call.
  1322. X
  1323. XTreats multiple occurrences of a termchar as one delimiter (does not
  1324. Xallow null fields).
  1325. X------------------------------------------------------------------------*/
  1326. Xchar *parse_field_static = (char *)0;
  1327. Xchar *parse_field(parsestr,termchars)
  1328. Xchar *parsestr;
  1329. Xchar *termchars;
  1330. X{
  1331. Xregister int first = 1;
  1332. Xregister char *termptr;
  1333. Xregister char *parseptr;
  1334. Xchar *field;
  1335. X
  1336. X    if(parsestr == (char *)0 && parse_field_static == (char *)0)
  1337. X        return((char *)0);
  1338. X
  1339. X    if(parsestr)
  1340. X        parseptr = parsestr;
  1341. X    else
  1342. X       parseptr = parse_field_static;
  1343. X
  1344. X    while(*parseptr)
  1345. X    {
  1346. X        if(!strchr(termchars,*parseptr))
  1347. X            break;
  1348. X        parseptr++;
  1349. X    }
  1350. X
  1351. X    if(!*parseptr)
  1352. X    {
  1353. X        parse_field_static = (char *)0;
  1354. X        return((char *)0);
  1355. X    }
  1356. X
  1357. X    field = parseptr;
  1358. X    if(*field == '\'')
  1359. X    {
  1360. X        field++;
  1361. X        parseptr++;
  1362. X        while(*parseptr)
  1363. X        {
  1364. X            if(*parseptr == '\'')
  1365. X            {
  1366. X                parse_field_static = parseptr + 1;
  1367. X                *parseptr = 0;
  1368. X                return(field);
  1369. X            }
  1370. X            parseptr++;
  1371. X        }
  1372. X        parse_field_static = (char *)0;
  1373. X        return(field);
  1374. X    }
  1375. X    while(*parseptr)
  1376. X    {
  1377. X        if(strchr(termchars,*parseptr))
  1378. X        {
  1379. X            *parseptr = 0;
  1380. X            parse_field_static = parseptr + 1;
  1381. X            while(*parse_field_static)
  1382. X            {
  1383. X                if(!strchr(termchars,*parse_field_static))
  1384. X                    break;
  1385. X                parse_field_static++;
  1386. X            }
  1387. X            return(field);
  1388. X        }
  1389. X        parseptr++;
  1390. X    }
  1391. X    parse_field_static = (char *)0;
  1392. X    return(field);
  1393. X}    /* end of parse_field */
  1394. X
  1395. X/*+-------------------------------------------------------------------------
  1396. X    build_field_array(cmd,field,field_max_quan,&nfield)
  1397. X--------------------------------------------------------------------------*/
  1398. Xvoid
  1399. Xbuild_field_array(cmd,field,field_max_quan,nfield_rtn)
  1400. Xchar *cmd;
  1401. Xchar **field;
  1402. Xint field_max_quan;
  1403. Xint *nfield_rtn;
  1404. X{
  1405. Xregister itmp;
  1406. Xregister nfield;
  1407. X
  1408. X    for(itmp = 0; itmp < field_max_quan; itmp++)
  1409. X        field[itmp] = (char *)0;
  1410. X    field[0] = parse_field(cmd," \t\r\n");
  1411. X
  1412. X    for(nfield = 1; nfield < field_max_quan; ++nfield)
  1413. X    {
  1414. X        if((field[nfield] = parse_field((char *)0," \t\r\n")) == (char *)0) 
  1415. X            break;
  1416. X    }
  1417. X
  1418. X    *nfield_rtn = nfield;
  1419. X
  1420. X}    /* end of build_field_array */
  1421. X
  1422. X/*+-------------------------------------------------------------------------
  1423. X    dir_open(dirname)
  1424. X--------------------------------------------------------------------------*/
  1425. XDDIR *
  1426. Xdir_open(dirname)
  1427. Xchar *dirname;
  1428. X{
  1429. X    DDIR *fp = fopen(dirname,"r");
  1430. X    return(fp);
  1431. X}    /* end of dir_open */
  1432. X
  1433. X/*+-------------------------------------------------------------------------
  1434. X    dir_read(dirname)
  1435. X--------------------------------------------------------------------------*/
  1436. Xstruct dent *
  1437. Xdir_read(dirp)
  1438. XDDIR *dirp;
  1439. X{
  1440. Xstatic struct dent_w_null {
  1441. X    struct dent dent;
  1442. X    int null;
  1443. X} static_dent;
  1444. X
  1445. X
  1446. X    do {
  1447. X        if(fread((char *)&static_dent.dent,sizeof(struct dent),1,dirp) != 1)
  1448. X            return((struct dent *)0);
  1449. X    } while(!static_dent.dent.d_inode);
  1450. X
  1451. X    static_dent.null = 0;
  1452. X    return(&static_dent.dent);
  1453. X}    /* end of dir_open */
  1454. X
  1455. X/*+-------------------------------------------------------------------------
  1456. X    dir_close(dirp)
  1457. X--------------------------------------------------------------------------*/
  1458. Xvoid
  1459. Xdir_close(dirp)
  1460. XDDIR *dirp;
  1461. X{
  1462. X    if(dirp)
  1463. X        fclose(dirp);
  1464. X}    /* end of dir_close */
  1465. X
  1466. X/*+-------------------------------------------------------------------------
  1467. X    basename(fullname) - strip directory name from filename
  1468. X
  1469. Xreturns address of static string
  1470. X--------------------------------------------------------------------------*/
  1471. Xchar *
  1472. Xbasename(fullname)
  1473. Xchar *fullname;
  1474. X{
  1475. Xregister char *start;
  1476. Xstatic char outstr[256];
  1477. Xchar *strrchr();
  1478. X
  1479. X    start = strrchr(fullname,'/'); /* find last slash */
  1480. X    if(!start)
  1481. X        return(fullname);
  1482. X    start++;
  1483. X    strcpy(outstr,start);
  1484. X    return(outstr);
  1485. X}    /* end of basename */
  1486. X
  1487. X/*+-------------------------------------------------------------------------
  1488. X    statdirname(fname) - return base name prepended with status dir
  1489. X
  1490. Xreturns address of static string
  1491. X--------------------------------------------------------------------------*/
  1492. Xchar *
  1493. Xstatdirname(fname)
  1494. Xchar *fname;
  1495. X{
  1496. Xstatic char fullname[128];
  1497. Xstatic int fullname_cat_point = 0;
  1498. X
  1499. X    if(!fullname_cat_point)
  1500. X    {
  1501. X        strcpy(fullname,STATUSDIR);
  1502. X        strcat(fullname,"/");
  1503. X        fullname_cat_point = strlen(fullname);
  1504. X    }
  1505. X
  1506. X    strcpy(fullname + fullname_cat_point,fname);
  1507. X    return(fullname);
  1508. X
  1509. X}    /* end of statdirname */
  1510. X
  1511. X/*+-------------------------------------------------------------------------
  1512. X    spooldirname(fname) - return base name prepended with spool dir
  1513. X
  1514. Xreturns address of static string
  1515. X--------------------------------------------------------------------------*/
  1516. Xchar *
  1517. Xspooldirname(fname)
  1518. Xchar *fname;
  1519. X{
  1520. Xstatic char fullname[128];
  1521. Xstatic int fullname_cat_point = 0;
  1522. X
  1523. X    if(!fullname_cat_point)
  1524. X    {
  1525. X        strcpy(fullname,SPOOLDIR);
  1526. X        strcat(fullname,"/");
  1527. X        fullname_cat_point = strlen(fullname);
  1528. X    }
  1529. X
  1530. X    strcpy(fullname + fullname_cat_point,fname);
  1531. X    return(fullname);
  1532. X
  1533. X}    /* end of statdirname */
  1534. X
  1535. X/*+-------------------------------------------------------------------------
  1536. X    lockpid_to_tty(lockpid) - given pid, find first ttyname it has locked
  1537. X--------------------------------------------------------------------------*/
  1538. Xchar *
  1539. Xlockpid_to_tty(lockpid)
  1540. Xint lockpid;
  1541. X{
  1542. XDDIR *uspool_dp;
  1543. Xstruct dent *dp;
  1544. XFILE *fp;
  1545. Xint testpid;
  1546. Xstatic char rtnname[32];
  1547. X
  1548. X    if(uspool_dp = dir_open(SPOOLDIR))
  1549. X    {
  1550. X        while(dp = dir_read(uspool_dp))
  1551. X        {
  1552. X            if(strncmp(dp->d_name,"LCK..tty",8))
  1553. X                continue;
  1554. X            if(fp = fopen(spooldirname(dp->d_name),"r"))
  1555. X            {
  1556. X                fscanf(fp,"%d",&testpid);
  1557. X                fclose(fp);
  1558. X                if(testpid == lockpid)
  1559. X                {
  1560. X                    strcpy(rtnname,dp->d_name + 5);
  1561. X                    dir_close(uspool_dp);
  1562. X                    return(rtnname);
  1563. X                }
  1564. X            }
  1565. X        }
  1566. X        dir_close(uspool_dp);
  1567. X    }
  1568. X    return((char *)0);
  1569. X}    /* end of lockpid_to_tty */
  1570. X
  1571. X/*+-------------------------------------------------------------------------
  1572. X    read_status_file(system_name,buf,bufsize)
  1573. X--------------------------------------------------------------------------*/
  1574. Xint
  1575. Xread_status_file(system_name,buf,bufsize)
  1576. Xchar *system_name;
  1577. Xchar *buf;
  1578. Xint bufsize;
  1579. X{
  1580. XFILE *fp;
  1581. X
  1582. X    if(!(fp = fopen(statdirname(system_name),"r")))
  1583. X        return(-1);
  1584. X    buf[0] = 0;
  1585. X    fgets(buf,bufsize,fp);
  1586. X    fclose(fp);
  1587. X    if(!buf[0])
  1588. X        return(-1);
  1589. X    buf[strlen(buf) - 1] = 0;
  1590. X    return(0);
  1591. X
  1592. X}    /* end of read_status_file */
  1593. X
  1594. X/*+-------------------------------------------------------------------------
  1595. X    get_uucp_lstat(system_name,uls)
  1596. X--------------------------------------------------------------------------*/
  1597. Xget_uucp_lstat(system_name,uls)
  1598. Xchar *system_name;
  1599. XUUCP_LSTAT *uls;
  1600. X{
  1601. Xint itmp;
  1602. Xchar s32[32];
  1603. Xstruct dent *dp;
  1604. XDDIR *work_dp;
  1605. XFILE *fp;
  1606. Xchar lock_name[64];
  1607. Xchar *ttyname;
  1608. X
  1609. X    memset((char *)uls,0,sizeof(UUCP_LSTAT));
  1610. X    strcpy(uls->system,system_name);
  1611. X    if(read_status_file(system_name,uls->linebuf,sizeof(uls->linebuf)))
  1612. X        return(-1);
  1613. X
  1614. X    sscanf(uls->linebuf,"%d %d %ld %ld",
  1615. X        &uls->status,&uls->retry_count,
  1616. X        &uls->secs_last_try,&uls->secs_next_try);
  1617. X    uls->secs_next_try += uls->secs_last_try;
  1618. X
  1619. X    strcpy(uls->work_dir,WORKDIR);
  1620. X    strcat(uls->work_dir,system_name);
  1621. X
  1622. X    uls->input_queue_count = 0;
  1623. X    uls->output_queue_count = 0;
  1624. X    uls->dfil_count = 0;
  1625. X    if(work_dp = dir_open(uls->work_dir))
  1626. X    {
  1627. X        /* count files */
  1628. X        while(dp = dir_read(work_dp))
  1629. X        {
  1630. X            if(!strncmp(dp->d_name,"X.",2))
  1631. X                uls->input_queue_count++;
  1632. X            if(!strncmp(dp->d_name,"D.",2))
  1633. X                uls->dfil_count++;
  1634. X            if(!strncmp(dp->d_name,"C.",2))
  1635. X                uls->output_queue_count++;
  1636. X        }
  1637. X        dir_close(work_dp);
  1638. X    }
  1639. X
  1640. X    /* "kludges for screwy status stuff with HDB" thanks to Ed Carp */
  1641. X    strcpy(lock_name,LOCKDIR);
  1642. X    strcat(lock_name,system_name);
  1643. X    if(!access(lock_name,0) && (uls->status != SS_TALKING))
  1644. X        uls->status = SS_CALL_IN_PROGRESS;
  1645. X    if(uls->status == SS_BADSYSTEM)
  1646. X        uls->status = SS_DEVICE_FAILED;
  1647. X
  1648. X    uls->locking_pid = 0;
  1649. X    uls->locked_tty[0] = 0;
  1650. X    uls->uucico_active = 0;
  1651. X    if((uls->status == SS_TALKING) || (uls->status == SS_LOCKED_DEVICE ) ||
  1652. X        (uls->status == SS_CALL_IN_PROGRESS))
  1653. X    {
  1654. X        if(fp = fopen(lock_name,"r"))
  1655. X        {
  1656. X            fscanf(fp,"%d",&uls->locking_pid);
  1657. X            fclose(fp);
  1658. X            errno = 0;
  1659. X            uls->uucico_active = !kill(uls->locking_pid) || (errno != ESRCH);
  1660. X            if(!uls->uucico_active)
  1661. X                uls->locking_pid = 0;
  1662. X        }
  1663. X        if(uls->locking_pid)
  1664. X            strcpy(uls->locked_tty,lockpid_to_tty(uls->locking_pid));
  1665. X    }
  1666. X
  1667. X    if(uls->status > SS_MSG_MAX)
  1668. X        sprintf(uls->stattxt,"status %u",uls->status);
  1669. X    else
  1670. X        strcpy(uls->stattxt,errortext[uls->status]);
  1671. X    return(0);
  1672. X}    /* end of get_uucp_lstat */
  1673. X
  1674. X/*+-------------------------------------------------------------------------
  1675. X    cmd_uulstat(uls)
  1676. X--------------------------------------------------------------------------*/
  1677. Xvoid
  1678. Xcmd_uulstat(uls)
  1679. XUUCP_LSTAT *uls;
  1680. X{
  1681. X    printf("system: %s: ",uls->system);
  1682. X    if(uls->uucico_active)
  1683. X    {
  1684. X        printf("uucico pid %d active",uls->locking_pid);
  1685. X        if(uls->locked_tty[0])
  1686. X            printf(" on %s\n",uls->locked_tty);
  1687. X        else
  1688. X            printf(" on /dev/tty??\n");
  1689. X    }
  1690. X    else
  1691. X        printf("uucico not active\n");
  1692. X    printf("last status: %s",uls->stattxt);
  1693. X    printf("  (%d failed calls)\n",uls->retry_count);
  1694. X    printf("queues:  input: %d  output: %d data files: %d\n",
  1695. X        uls->input_queue_count,uls->output_queue_count,uls->dfil_count);
  1696. X    printf("last call: %s",ctime(&uls->secs_last_try));
  1697. X    printf("next call: %s",
  1698. X        (uls->uucico_active)
  1699. X            ? "now\n"
  1700. X            : ((uls->output_queue_count)
  1701. X                ? ctime(&uls->secs_next_try)
  1702. X                : "none scheduled\n")
  1703. X            );
  1704. X    printf("\n");
  1705. X}    /* end of cmd_uulstat */
  1706. X
  1707. X/*+-------------------------------------------------------------------------
  1708. X    cmd_uupoke(uls,uucico_x_flag,poll_always)
  1709. X--------------------------------------------------------------------------*/
  1710. Xvoid
  1711. Xcmd_uupoke(uls,uucico_x_flag,poll_always)
  1712. XUUCP_LSTAT *uls;
  1713. Xint uucico_x_flag;
  1714. Xint poll_always;
  1715. X{
  1716. Xint itmp;
  1717. Xint wait_status;
  1718. Xint uucico_pid;
  1719. Xchar uucico_x_arg[16];
  1720. Xchar system_arg[16];
  1721. X
  1722. X    if(uls->uucico_active)
  1723. X    {
  1724. X        printf("no poll made to %s (uucico already active)\n",uls->system);
  1725. X        return;
  1726. X    }
  1727. X
  1728. X    if(!poll_always && !uls->output_queue_count)
  1729. X    {
  1730. X        printf("no poll made to %s (no work to be done and no -a)\n",
  1731. X            uls->system);
  1732. X        return;
  1733. X    }
  1734. X
  1735. X    sprintf(uucico_x_arg,"-x%d",uucico_x_flag);
  1736. X    strcpy(system_arg,(poll_always) ? "-S" : "-s");
  1737. X    strcat(system_arg,uls->system);
  1738. X
  1739. X    if((uucico_pid = fork()) < 0)
  1740. X        printf("cannot fork: %s\n",sys_errlist[errno]);
  1741. X    else if(uucico_pid)
  1742. X    {
  1743. X        printf("uucico pid %d\n",uucico_pid);
  1744. X        while(((itmp = wait(&wait_status)) != uucico_pid) && (itmp != -1))
  1745. X            ;
  1746. X        nap(250L);
  1747. X        printf("%s\n",wait_status_text(wait_status));
  1748. X    }
  1749. X    else
  1750. X    {
  1751. X        nap(250L);
  1752. X        close(2);
  1753. X        dup(1);
  1754. X        printf("UUCICO.POKE %s -r1 %s\n",uucico_x_arg,system_arg);
  1755. X        execl("/usr/lib/uucp/uucico","UUCICO.POKE","-r1",system_arg,
  1756. X            (uucico_x_flag) ? uucico_x_arg : "-x1",
  1757. X            (char *)0);
  1758. X        exit(255);
  1759. X    }
  1760. X
  1761. X}    /* end of cmd_uupoke */
  1762. X
  1763. X/*+-------------------------------------------------------------------------
  1764. X    cmd_uukill(uls)
  1765. X--------------------------------------------------------------------------*/
  1766. Xvoid
  1767. Xcmd_uukill(uls)
  1768. XUUCP_LSTAT *uls;
  1769. X{
  1770. X    if(getuid())
  1771. X    {
  1772. X        printf("no kill done (only root may do this!)\n");
  1773. X        return;
  1774. X    }
  1775. X    if(!uls->uucico_active)
  1776. X    {
  1777. X        printf("no kill done (uucico not active)\n");
  1778. X        return;
  1779. X    }
  1780. X    if(!uls->locking_pid)
  1781. X    {
  1782. X        printf("no kill done (cannot determine uucico pid)\n");
  1783. X        return;
  1784. X    }
  1785. X    kill_parent_and_children(uls->locking_pid,SIGHUP,SIGKILL);
  1786. X
  1787. X}    /* end of cmd_uukill */
  1788. X
  1789. X/*+-------------------------------------------------------------------------
  1790. X    main(argc,argv)
  1791. X--------------------------------------------------------------------------*/
  1792. Xmain(argc,argv)
  1793. Xint argc;
  1794. Xchar **argv;
  1795. X{
  1796. Xint itmp;
  1797. Xint errflg = 0;
  1798. Xint poll_always = 0;
  1799. Xint cmd;
  1800. Xchar *cptr;
  1801. Xint uucico_x_flag = 0;
  1802. XUUCP_LSTAT ulsbuf;
  1803. XUUCP_LSTAT *uls = &ulsbuf;
  1804. Xextern char *optarg;
  1805. Xextern int optind;
  1806. X
  1807. X    setbuf(stdout,NULL);
  1808. X    setbuf(stderr,NULL);
  1809. X
  1810. X    while((itmp = getopt(argc,argv,"vx:a")) != -1)
  1811. X    {
  1812. X        switch(itmp)
  1813. X        {
  1814. X            case 'v':
  1815. X                verbose = 1;
  1816. X                break;
  1817. X            case 'x':
  1818. X                uucico_x_flag = atoi(optarg);
  1819. X                break;
  1820. X            case 'a':
  1821. X                poll_always = 1;
  1822. X                break;
  1823. X            case '?':
  1824. X                errflg++;
  1825. X        }
  1826. X    }
  1827. X
  1828. X    cmd = UUCMD_NONE;
  1829. X    cptr = basename(argv[0]);
  1830. X    if(!strcmp(cptr,"uulstat"))
  1831. X        cmd = UUCMD_LSTAT;
  1832. X    else if(!strcmp(cptr,"uupoke"))
  1833. X        cmd = UUCMD_POLL;
  1834. X    else if(!strcmp(cptr,"uukill"))
  1835. X        cmd = UUCMD_KILL;
  1836. X
  1837. X    if(errflg || (cmd == UUCMD_NONE) || (optind == argc))
  1838. X    {
  1839. X        printf("usage: uupoke [-a] [-v] [-x#] system ...\n");
  1840. X        printf("       uulstat system ...\n");
  1841. X        printf("       uukill system ...\n");
  1842. X        exit(1);
  1843. X    }
  1844. X
  1845. X    while(optind < argc)
  1846. X    {
  1847. X        if(get_uucp_lstat(cptr = argv[optind++],uls))
  1848. X        {
  1849. X            printf("could not get status on '%s'\n\n",cptr);
  1850. X            switch(cmd)
  1851. X            {
  1852. X                case UUCMD_POLL:
  1853. X                    cmd_uupoke(uls,uucico_x_flag,1);
  1854. X                    if(verbose)
  1855. X                    {
  1856. X                        fputs("after poll: ",stdout);
  1857. X                        if(get_uucp_lstat(cptr,uls))
  1858. X                            printf("could not get status on '%s'\n\n",cptr);
  1859. X                        else
  1860. X                            cmd_uulstat(uls);
  1861. X                    }
  1862. X                    break;
  1863. X            }
  1864. X        }
  1865. X        else
  1866. X        {
  1867. X            switch(cmd)
  1868. X            {
  1869. X                case UUCMD_LSTAT:
  1870. X                    cmd_uulstat(uls);
  1871. X                    break;
  1872. X                case UUCMD_POLL:
  1873. X                    if(verbose)
  1874. X                    {
  1875. X                        fputs("before poll: ",stdout);
  1876. X                        cmd_uulstat(uls);
  1877. X                    }
  1878. X                    cmd_uupoke(uls,uucico_x_flag,poll_always);
  1879. X                    if(verbose)
  1880. X                    {
  1881. X                        fputs("after poll: ",stdout);
  1882. X                        if(get_uucp_lstat(cptr,uls))
  1883. X                            printf("could not get status on '%s'\n\n",cptr);
  1884. X                        else
  1885. X                            cmd_uulstat(uls);
  1886. X                    }
  1887. X                    break;
  1888. X                case UUCMD_KILL:
  1889. X                    if(verbose)
  1890. X                    {
  1891. X                        fputs("before kill: ",stdout);
  1892. X                        cmd_uulstat(uls);
  1893. X                    }
  1894. X                    cmd_uukill(uls);
  1895. X                    break;
  1896. X            }
  1897. X        }
  1898. X    }
  1899. X    exit(0);
  1900. X
  1901. X}    /* end of main */
  1902. X
  1903. X/* vi: set tabstop=4 shiftwidth=4: */
  1904. X/* end of uutool.c */
  1905. SHAR_EOF
  1906. $TOUCH -am 0715030090 uutool/uutool.c &&
  1907. chmod 0644 uutool/uutool.c ||
  1908. echo "restore of uutool/uutool.c failed"
  1909. set `wc -c uutool/uutool.c`;Wc_c=$1
  1910. if test "$Wc_c" != "17805"; then
  1911.     echo original size 17805, current size $Wc_c
  1912. fi
  1913. # ============= uutool/wstext.c ==============
  1914. echo "x - extracting uutool/wstext.c (Text)"
  1915. sed 's/^X//' << 'SHAR_EOF' > uutool/wstext.c &&
  1916. X/* CHK=0xBB16 */
  1917. X/*+-------------------------------------------------------------------------
  1918. X    wstext.c - wait status and signal to text strings
  1919. X    wht@n4hgf.Mt-Park.GA.US
  1920. X--------------------------------------------------------------------------*/
  1921. X/*+:EDITS:*/
  1922. X/*:07-15-1990-02:38-wht-break out of uutool.c */
  1923. X
  1924. X#include <signal.h>
  1925. X
  1926. X/*+-------------------------------------------------------------------------
  1927. X    signal_name_text(sig)
  1928. X--------------------------------------------------------------------------*/
  1929. Xchar *
  1930. Xsignal_name_text(sig)
  1931. Xint sig;
  1932. X{
  1933. Xregister char *cptr;
  1934. Xstatic char sigunknown[20];
  1935. X
  1936. X    sig &= 0x7F;
  1937. X    switch(sig)
  1938. X    {
  1939. X        case SIGHUP:    cptr = "SIGHUP"; break;
  1940. X        case SIGINT:    cptr = "SIGINT"; break;
  1941. X        case SIGQUIT:    cptr = "SIGQUIT"; break;
  1942. X        case SIGILL:    cptr = "SIGILL"; break;
  1943. X        case SIGTRAP:    cptr = "SIGTRAP"; break;
  1944. X        case SIGIOT:    cptr = "SIGIOT"; break;
  1945. X        case SIGEMT:    cptr = "SIGEMT"; break;
  1946. X        case SIGFPE:    cptr = "SIGFPE"; break;
  1947. X        case SIGKILL:    cptr = "SIGKILL"; break;
  1948. X        case SIGBUS:    cptr = "SIGBUS"; break;
  1949. X        case SIGSEGV:    cptr = "SIGSEGV"; break;
  1950. X        case SIGSYS:    cptr = "SIGSYS"; break;
  1951. X        case SIGPIPE:    cptr = "SIGPIPE"; break;
  1952. X        case SIGALRM:    cptr = "SIGALRM"; break;
  1953. X        case SIGTERM:    cptr = "SIGTERM"; break;
  1954. X        case SIGUSR1:    cptr = "SIGUSR1"; break;
  1955. X        case SIGUSR2:    cptr = "SIGUSR2"; break;
  1956. X        case SIGCLD:    cptr = "SIGCLD"; break;
  1957. X        case SIGPWR:    cptr = "SIGPWR"; break;
  1958. X#if    defined(M_UNIX)
  1959. X        case SIGSTOP:   cptr = "SIGSTOP"; break;
  1960. X        case SIGTSTP:   cptr = "SIGTSTP"; break;
  1961. X        case SIGCONT:   cptr = "SIGCONT"; break;
  1962. X        case SIGTTIN:   cptr = "SIGTTIN"; break;
  1963. X        case SIGTTOU:   cptr = "SIGTTOU"; break;
  1964. X#endif
  1965. X        default:
  1966. X            sprintf(sigunknown,"SIGNAL %u",sig);
  1967. X            return(sigunknown);
  1968. X    }
  1969. X    return(cptr);
  1970. X
  1971. X}    /* end of signal_name_text */
  1972. X
  1973. X/*+-------------------------------------------------------------------------
  1974. X    wait_status_text(wait_status)
  1975. X--------------------------------------------------------------------------*/
  1976. Xchar *
  1977. Xwait_status_text(wait_status)
  1978. Xregister unsigned int wait_status;
  1979. X{
  1980. Xstatic char text[80];
  1981. X
  1982. X    if(wait_status & 0xFF)    /* exit never called by child */
  1983. X    {
  1984. X        sprintf(text,"[killed by %s",signal_name_text(wait_status & 0x7F));
  1985. X        if(wait_status & 0x80)
  1986. X            strcat(text,", core dumped");
  1987. X        strcat(text,"]");
  1988. X    }
  1989. X    else
  1990. X    {
  1991. X        wait_status >>= 8;
  1992. X        if(wait_status == 0)
  1993. X            strcpy(text,"[successful]");
  1994. X        else
  1995. X            sprintf(text,"[exit status %d]\n",wait_status);
  1996. X    }
  1997. X
  1998. X    return(text);
  1999. X
  2000. X}    /* end of wait_status_text */
  2001. X
  2002. X/* vi: set tabstop=4 shiftwidth=4: */
  2003. X/* end of wstext.c */
  2004. SHAR_EOF
  2005. $TOUCH -am 0715024390 uutool/wstext.c &&
  2006. chmod 0644 uutool/wstext.c ||
  2007. echo "restore of uutool/wstext.c failed"
  2008. set `wc -c uutool/wstext.c`;Wc_c=$1
  2009. if test "$Wc_c" != "2504"; then
  2010.     echo original size 2504, current size $Wc_c
  2011. fi
  2012. exit 0
  2013.  
  2014. --------------------------------------------------------------------
  2015. Warren Tucker, TuckerWare emory!n4hgf!wht or wht@n4hgf.Mt-Park.GA.US
  2016. Sforzando (It., sfohr-tsahn'-doh).   A direction to perform the tone
  2017. or chord with special stress, or marked and sudden emphasis.
  2018.  
  2019.