home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #20 / NN_1992_20.iso / spool / comp / sources / misc / 3939 < prev    next >
Encoding:
Text File  |  1992-09-13  |  57.1 KB  |  2,150 lines

  1. Newsgroups: comp.sources.misc
  2. Path: sparky!kent
  3. From: wht@n4hgf.Mt-Park.GA.US (Warren Tucker)
  4. Subject:  v32i047:  ecu - ECU Asynchronous Communications v3.20, Part12/40
  5. Message-ID: <1992Sep13.153429.5280@sparky.imd.sterling.com>
  6. Followup-To: comp.sources.d
  7. X-Md4-Signature: ab5224863c023c1a44abb703a739096b
  8. Sender: kent@sparky.imd.sterling.com (Kent Landfield)
  9. Organization: Sterling Software
  10. References: <csm-v32i036=ecu.141245@sparky.IMD.Sterling.COM>
  11. Date: Sun, 13 Sep 1992 15:34:29 GMT
  12. Approved: kent@sparky.imd.sterling.com
  13. Lines: 2135
  14.  
  15. Submitted-by: wht@n4hgf.Mt-Park.GA.US (Warren Tucker)
  16. Posting-number: Volume 32, Issue 47
  17. Archive-name: ecu/part12
  18. Environment: SCO,XENIX,ISC,SUNOS,SYSVR4,HDB,Curses
  19. Supersedes: ecu: Volume 21, Issue 53-89
  20.  
  21. ---- Cut Here and feed the following to sh ----
  22. #!/bin/sh
  23. # this is ecu320.12 (part 12 of ecu320)
  24. # do not concatenate these parts, unpack them in order with /bin/sh
  25. # file ecusetup.c continued
  26. #
  27. if test ! -r _shar_seq_.tmp; then
  28.     echo 'Please unpack part 1 first!'
  29.     exit 1
  30. fi
  31. (read Scheck
  32.  if test "$Scheck" != 12; then
  33.     echo Please unpack part "$Scheck" next!
  34.     exit 1
  35.  else
  36.     exit 0
  37.  fi
  38. ) < _shar_seq_.tmp || exit 1
  39. if test ! -f _shar_wnt_.tmp; then
  40.     echo 'x - still skipping ecusetup.c'
  41. else
  42. echo 'x - continuing file ecusetup.c'
  43. sed 's/^X//' << 'SHAR_EOF' >> 'ecusetup.c' &&
  44. X
  45. X/*+-------------------------------------------------------------------------
  46. X    setup_display_tty()
  47. X     00000000
  48. X     01234567
  49. X/dev/........
  50. X--------------------------------------------------------------------------*/
  51. Xvoid
  52. Xsetup_display_tty()
  53. X{
  54. X    char s[TTY_LEN + 1];
  55. X
  56. X    strncpy(s,shm->Lline + 5,TTY_LEN);
  57. X    s[TTY_LEN] = 0;
  58. X    clear_area(setw,TTY_Y,TTY_X,TTY_LEN);
  59. X    waddstr(setw,s);
  60. X    wmove(setw,TTYOPN_LY,TTYOPN_LX);
  61. X    if(shm->Liofd >= 0)
  62. X        waddstr(setw,"(opened)");
  63. X    else
  64. X        waddstr(setw,"        ");
  65. X    wrefresh(setw);
  66. X
  67. X}    /* end of setup_display_tty */
  68. X
  69. X/*+-------------------------------------------------------------------------
  70. X    setup_display_single_char()
  71. X--------------------------------------------------------------------------*/
  72. Xvoid
  73. Xsetup_display_single_char()
  74. X{
  75. X    wmove(setw,DPX_Y,DPX_X);
  76. X    waddch(setw,(shm->Lfull_duplex) ? 'F' : 'E');
  77. X    wmove(setw,PAR_Y,PAR_X);
  78. X    waddch(setw,(shm->Lparity) ? to_upper(shm->Lparity) : 'N');
  79. X    wmove(setw,DB_Y,DB_X);
  80. X    waddch(setw,(shm->Lparity) ? '7' : '8');
  81. X    wmove(setw,XADDNL_Y,XADDNL_X);
  82. X    waddch(setw,(shm->Ladd_nl_outgoing) ? 'Y' : 'N');
  83. X    wmove(setw,RADDNL_Y,RADDNL_X);
  84. X    waddch(setw,(shm->Ladd_nl_incoming) ? 'Y' : 'N');
  85. X
  86. X }    /* end of setup_display_single_char */
  87. X
  88. X/*+-------------------------------------------------------------------------
  89. X    setup_display_baud()
  90. X--------------------------------------------------------------------------*/
  91. Xvoid
  92. Xsetup_display_baud()
  93. X{
  94. X    char s8[8];
  95. X    clear_area(setw,BAUD_Y,BAUD_X,BAUD_LEN);
  96. X    sprintf(s8,"%u",shm->Lbaud);
  97. X    waddstr(setw,s8);
  98. X
  99. X}    /* end of setup_display_baud */
  100. X
  101. X/*+-------------------------------------------------------------------------
  102. X    setup_display_screen(write_lits)
  103. X--------------------------------------------------------------------------*/
  104. Xvoid
  105. Xsetup_display_screen(write_lits)
  106. Xint write_lits;
  107. X{
  108. X
  109. X    if(write_lits)
  110. X    {
  111. X        wmove(setw,NAME_Y,NAME_LX);
  112. X        waddstr(setw,"Destination");
  113. X        wmove(setw,TTY_Y,TTY_LX);
  114. X        waddstr(setw,"tty: /dev/");
  115. X        wmove(setw,DPX_Y,DPX_LX);
  116. X        waddstr(setw,"duplex:");
  117. X        wmove(setw,BAUD_Y,BAUD_LX);
  118. X        waddstr(setw,"baud:");
  119. X        wmove(setw,PAR_Y,PAR_LX);
  120. X        waddstr(setw,"parity:");
  121. X        wmove(setw,DB_Y,DB_LX);
  122. X        waddstr(setw,"(data bits");
  123. X        wmove(setw,DB_Y,DB_LX2);
  124. X        waddch(setw,')');
  125. X        wmove(setw,XADDNL_Y,XADDNL_LX);
  126. X        waddstr(setw,"add NL to transmitted CR:");
  127. X        wmove(setw,RADDNL_Y,RADDNL_LX);
  128. X        waddstr(setw,"add NL to received CR:");
  129. X        wmove(setw,SETW_LINES - 2,1);
  130. X        wstandout(setw);
  131. X        waddstr(setw,        /* kludge -- must change if setw width does */
  132. X            "   TAB:next ^B:prev END:proceed ^D:phone dir  ESC:quit ecu    ");
  133. X        wstandend(setw);
  134. X    }
  135. X    setup_display_name();
  136. X    setup_display_tty();
  137. X    setup_display_single_char();
  138. X    setup_display_baud();
  139. X    wrefresh(setw);
  140. X}    /* end of setup_display_screen */
  141. X
  142. X/*+-------------------------------------------------------------------------
  143. X    setup_line_open()
  144. X--------------------------------------------------------------------------*/
  145. Xint
  146. Xsetup_line_open()
  147. X{
  148. X    register itmp;
  149. X    register retries = 8;
  150. X    char *linst_err_text();
  151. X    char *cptr;
  152. X    char msg[80];
  153. X    long wait_msec;
  154. X    int displayed_single_char_exit = 0;
  155. X
  156. X    while(itmp = lopen())
  157. X    {
  158. X        if(retries)
  159. X        {
  160. X            if(    (itmp != LINST_ENABLED_IN_USE) &&
  161. X                (itmp != LINST_DIALOUT_IN_USE) && (itmp < 0))
  162. X            {
  163. X                goto FAIL;
  164. X            }
  165. X            sprintf(msg,"%s - waiting %d sec",linst_err_text(itmp),retries);
  166. X            cptr = msg;
  167. X            if(!displayed_single_char_exit)
  168. X            {
  169. X                setw_bot_msg("Press any key to skip retries");
  170. X                displayed_single_char_exit = 1;
  171. X            }
  172. X        }
  173. X        else
  174. X        {
  175. XFAIL:
  176. X            retries = 0;
  177. X            cptr = linst_err_text(itmp);
  178. X            ring_bell();
  179. X        }
  180. X        setw_err_msg(cptr);
  181. X        if(!retries--)
  182. X            break;
  183. X        wait_msec = 1000L;
  184. X        while(wait_msec > 0)
  185. X        {
  186. X            if(ttyrdchk())
  187. X            {
  188. X                (void)ttygetc(1);
  189. X                goto FAIL;
  190. X            }
  191. X            wait_msec -= Nap(100L);
  192. X        }
  193. X        setw_err_msg("");
  194. X    }
  195. X    setup_display_tty();
  196. X    return(itmp);
  197. X
  198. X}    /* end of setup_line_open */
  199. X
  200. X/*+-------------------------------------------------------------------------
  201. X    setw_get_single(nondelim_list)
  202. Xassumes cursor is already positioned
  203. X--------------------------------------------------------------------------*/
  204. Xint
  205. Xsetw_get_single(nondelim_list)
  206. Xregister char *nondelim_list;
  207. X{
  208. X    register uint itmp;
  209. X    static uchar setw_nondelim_list[] =
  210. X    {
  211. X        CRET,NL,CTL_B,CTL_D,TAB,ESC,CTL_L,CTL_R,XFend,XFcurup,XFcurdn
  212. X    };
  213. X
  214. X    itmp = winget_single(setw,nondelim_list,setw_nondelim_list);
  215. X    if((itmp & 0xFF) == CRET)
  216. X        itmp = NL | 0x1000;
  217. X    return(itmp);
  218. X}    /* end of setw_get_single */
  219. X
  220. X/*+-------------------------------------------------------------------------
  221. X    setup_screen(argv_logical)
  222. X--------------------------------------------------------------------------*/
  223. Xvoid
  224. Xsetup_screen(argv_logical)
  225. Xchar *argv_logical;
  226. X{
  227. X    register itmp;
  228. X    register input_state = 0;
  229. X    char s80[80];
  230. X    char *cptr;
  231. X    char logical[NAME_LEN + 1];
  232. X    int done = 0;
  233. X    uint baud;
  234. X    uchar delim;    /* important to be unsigned to avoid sign extension */
  235. X    PDE *tpde;
  236. X    WINDOW *window_create();
  237. X    static uchar use_input_delim[] =
  238. X        {TAB,NL,XFcurdn,XFcurup,XFend,CTL_D,(uchar)0};
  239. X
  240. X    windows_start();
  241. X    sprintf(s80,"ecu %s",revstr);
  242. X    setw = window_create(s80,-3,SETW_TLY,SETW_TLX,SETW_LINES,SETW_COLS);
  243. X    shm->Llogical[0] = 0;
  244. X    logical[0] = 0;
  245. X    setup_display_screen(1);
  246. X
  247. XREENTER_INPUT_LOOP:
  248. X    while(!done)
  249. X    {
  250. X        wrefresh(setw);
  251. X        switch(input_state)
  252. X        {
  253. X            case 0:
  254. X                if(argv_logical)
  255. X                {
  256. X                    itmp = 0;    /* 'ecu -' means dont dial */
  257. X                    if(strcmp(argv_logical,"-"))    /* if not "-" */
  258. X                    {
  259. X                        strncpy(s80,argv_logical,NAME_LEN + 1);
  260. X                        s80[NAME_LEN + 1] = 0;
  261. X                        itmp = strlen(s80);
  262. X                    }
  263. X                    argv_logical = (char *)0;
  264. X                    delim = XFend;
  265. X                }
  266. X                else
  267. X                {
  268. X                    if(logical[0])
  269. X                        strcpy(s80,logical);
  270. X                    setw_bot_msg(
  271. X                        "logical phone directory entry, phone number or empty");
  272. X                     itmp = wingets(setw,NAME_Y,NAME_X,s80,NAME_LEN + 1,&delim,
  273. X                        (logical[0] != 0),(int *)0);
  274. X                    setw_err_msg("");
  275. X                }
  276. X                if(strchr((char *)use_input_delim,(char)delim))
  277. X                {
  278. X                    strcpy(logical,s80);
  279. X                    if((tpde = logical_telno_to_pde(logical)) &&
  280. X                        !copy_pde_to_Lvariables(tpde,1))
  281. X                    {
  282. X                        strcpy(logical,tpde->logical);
  283. X                        setup_display_screen(0);
  284. X                        break;
  285. X                    }
  286. X                    else
  287. X                    {
  288. X                        setw_err_msg(errmsg);
  289. X                        setup_display_screen(0);
  290. X                        ring_bell();
  291. X                        argv_logical = (char *)0;
  292. X                        continue;
  293. X                    }
  294. X                }
  295. X                setup_display_name();
  296. X                break;
  297. X
  298. X            case 1:
  299. X                cptr = strrchr(DEFAULT_TTY,'/'); /* there will be a /, right? */
  300. X                cptr++;
  301. X                sprintf(s80,"comm line: i.e., %s",cptr);
  302. X                setw_bot_msg(s80);
  303. X                setup_display_tty();
  304. X                strcpy(s80,"/dev/");
  305. X                strcpy(s80,&shm->Lline[5]);
  306. X                 itmp = wingets(setw,TTY_Y,TTY_X,s80,TTY_LEN + 1,&delim,
  307. X                    1,(int *)0);
  308. X                setw_err_msg("");
  309. X                if(strchr((char *)use_input_delim,(char)delim))
  310. X                {
  311. X                    strcpy(shm->Lline,"/dev/");
  312. X                    strcpy(&shm->Lline[5],s80);
  313. X                }
  314. X                setup_display_tty();
  315. X                break;
  316. X
  317. X            case 2:
  318. X                setw_bot_msg("duplex F:full H:half");
  319. X                wmove(setw,DPX_Y,DPX_X);
  320. X                wrefresh(setw);
  321. X                delim = NL;
  322. X                switch(itmp = setw_get_single("fh"))
  323. X                {
  324. X                    case 0:
  325. X                    case 1:
  326. X                        shm->Lfull_duplex = itmp;
  327. X                        break;
  328. X                    default:
  329. X                        delim = itmp & 0xFF;
  330. X                        break;
  331. X                }
  332. X                break;
  333. X
  334. X            case 3:        /* baud */
  335. X                setw_bot_msg(
  336. X                "rates: 110,300,600,1200,2400,4800,9600,19200,38400");
  337. XCASE_3:
  338. X                sprintf(s80,"%u",shm->Lbaud);
  339. X                 itmp = wingets(setw,BAUD_Y,BAUD_X,s80,BAUD_LEN + 1,&delim,
  340. X                    1,(int *)0);
  341. X                if(strchr((char *)use_input_delim,(char)delim))
  342. X                {
  343. X                    if(valid_baud_rate(baud = atoi(s80)) < 0)
  344. X                    {
  345. X                        setup_display_baud();
  346. X                        ring_bell();
  347. X                        goto CASE_3;
  348. X                    }
  349. X                    shm->Lbaud = baud;
  350. X                }
  351. X                setup_display_baud();
  352. X                break;
  353. X
  354. X            case 4:
  355. X                setw_bot_msg("parity: N:none E:even O:odd");
  356. X                wmove(setw,PAR_Y,PAR_X);
  357. X                wrefresh(setw);
  358. X                delim = NL;
  359. X                switch(itmp = setw_get_single("neo"))
  360. X                {
  361. X                    case 0:    shm->Lparity = 0;   break;
  362. X                    case 1: shm->Lparity = 'e'; break;
  363. X                    case 2: shm->Lparity = 'o'; break;
  364. X                    default:
  365. X                        delim = itmp & 0xFF;
  366. X                        break;
  367. X                }
  368. X                wmove(setw,DB_Y,DB_X);
  369. X                waddch(setw,(shm->Lparity) ? '7' : '8');
  370. X                break;
  371. X
  372. X            case 5:
  373. X                setw_bot_msg("");
  374. X                wmove(setw,XADDNL_Y,XADDNL_X);
  375. X                wrefresh(setw);
  376. X                delim = NL;
  377. X                switch(itmp = setw_get_single("ny"))
  378. X                {
  379. X                    case 0:
  380. X                    case 1: shm->Ladd_nl_outgoing = itmp; break;
  381. X                    default: delim = itmp & 0xFF;
  382. X                }
  383. X                break;
  384. X
  385. X            case 6:
  386. X                setw_bot_msg("");
  387. X                wmove(setw,RADDNL_Y,RADDNL_X);
  388. X                wrefresh(setw);
  389. X                delim = NL;
  390. X                switch(itmp = setw_get_single("ny"))
  391. X                {
  392. X                    case 0:
  393. X                    case 1: shm->Ladd_nl_incoming = itmp; break;
  394. X                    default: delim = itmp & 0xFF; break;
  395. X                }
  396. X                break;
  397. X        }
  398. X
  399. X        if(argv_logical)
  400. X            break;
  401. X
  402. X        switch(delim)
  403. X        {
  404. X            case XFcurup:
  405. X            case CTL_B:
  406. X                if(input_state)
  407. X                    input_state--;
  408. X                else
  409. X                    input_state = 6;
  410. X                break;
  411. X
  412. X            case XFcurdn:
  413. X            case TAB:
  414. X            case NL:
  415. X                input_state++;
  416. X                input_state %= 7;
  417. X                break;
  418. X
  419. X            case ESC:
  420. X                if(shm->Liofd >= 0)
  421. X                    lclose();
  422. X                setw_bot_msg("");
  423. X                setup_display_tty();
  424. X                termecu(0);
  425. X                break;
  426. X
  427. X            case CTL_L:
  428. X            case CTL_R:
  429. X                tcap_clear_screen();
  430. X                touchwin(stdscr);
  431. X                wrefresh(stdscr);
  432. X                setup_display_screen(1);
  433. X                touchwin(setw);
  434. X                wrefresh(setw);
  435. X                break;
  436. X
  437. X            case XFend:
  438. X            case CTL_D:
  439. X                done = 1;
  440. X                break;
  441. X        }
  442. X    }
  443. X
  444. X    if(shm->Liofd < 0)
  445. X    {
  446. X        wmove(setw,TTY_Y,TTY_X);
  447. X        wrefresh(setw);
  448. X        if(setup_line_open())
  449. X        {
  450. X            done = 0;
  451. X            input_state = 1;
  452. X            argv_logical = (char *)0;
  453. X            goto REENTER_INPUT_LOOP;
  454. X        }
  455. X    }
  456. X
  457. X    wmove(setw,SETW_LINES - 2,1);
  458. X    wstandout(setw);
  459. X    waddstr(setw,        /* kludge -- must change if setw width does */
  460. X        "------- Press HOME then 'help' for further assistance --------");
  461. X    wstandend(setw);
  462. X    setw_bot_msg("");
  463. X    wrefresh(setw);
  464. X    delwin(setw);
  465. X    windows_end(0);
  466. X    ttymode(1);
  467. X    tcap_cursor(SETW_TLY + SETW_LINES + 2,0);
  468. X    rcvr_pid = -2;
  469. X    if(delim == CTL_D)
  470. X        phdir_manager();
  471. X    else if(logical[0])
  472. X    {
  473. X        tpde = logical_telno_to_pde(logical); /* error return not likely now */
  474. X        pde_dial(tpde);
  475. X    }
  476. X    else 
  477. X        start_rcvr_process(1);
  478. X
  479. X}    /* end of setup_screen */
  480. X
  481. X/* vi: set tabstop=4 shiftwidth=4: */
  482. SHAR_EOF
  483. echo 'File ecusetup.c is complete' &&
  484. chmod 0644 ecusetup.c ||
  485. echo 'restore of ecusetup.c failed'
  486. Wc_c="`wc -c < 'ecusetup.c'`"
  487. test 16570 -eq "$Wc_c" ||
  488.     echo 'ecusetup.c: original size 16570, current size' "$Wc_c"
  489. rm -f _shar_wnt_.tmp
  490. fi
  491. # ============= ecushm.c ==============
  492. if test -f 'ecushm.c' -a X"$1" != X"-c"; then
  493.     echo 'x - skipping ecushm.c (File already exists)'
  494.     rm -f _shar_wnt_.tmp
  495. else
  496. > _shar_wnt_.tmp
  497. echo 'x - extracting ecushm.c (Text)'
  498. sed 's/^X//' << 'SHAR_EOF' > 'ecushm.c' &&
  499. X/*+-------------------------------------------------------------------------
  500. X    ecushm.c - shared memory handler for ecu xmtr/rcvr comm
  501. X    wht@n4hgf.Mt-Park.GA.US
  502. X
  503. X  Signal handler purists will surely get aneurisms from looking
  504. X  at what we do in here, but any OS that doesn't properly push
  505. X  a stack frame for a signal event just won't play here.  We even
  506. X  fork() in a signal handler.  That ought to make some of the
  507. X  brethren gag.
  508. X
  509. X  Defined functions:
  510. X    shm_done()
  511. X    shm_init()
  512. X    shmr_notify_xmtr_of_DCD_loss()
  513. X    shmr_notify_zmodem_frame()
  514. X    shmr_process_rcvr_SIGUSR2()
  515. X    shmx_connect()
  516. X    shmx_make_rcvr_sleep(seconds)
  517. X    shmx_process_xmtr_SIGUSR2()
  518. X    shmx_set_rcvr_log(logfilename,append_flag,raw_flag,flush_each)
  519. X    shmx_unpause_rcvr()
  520. X
  521. X--------------------------------------------------------------------------*/
  522. X/*+:EDITS:*/
  523. X/*:09-10-1992-13:58-wht@n4hgf-ECU release 3.20 */
  524. X/*:09-10-1992-04:34-wht@n4hgf-add rcvrdisp semaphore */
  525. X/*:08-22-1992-15:38-wht@n4hgf-ECU release 3.20 BETA */
  526. X/*:12-15-1991-14:22-wht@n4hgf-autorz initialized */
  527. X/*:12-13-1991-04:16-wht@n4hgf-move bell_notify_state to shm */
  528. X/*:11-12-1991-18:02-wht@n4hgf-remove obsolete shmx_rc_report */
  529. X/*:11-11-1991-14:59-wht@n4hgf-shmr_notify_xmtr_of_DCD_loss */
  530. X/*:07-25-1991-12:56-wht@n4hgf-ECU release 3.10 */
  531. X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  532. X
  533. X#include "ecu.h"
  534. X#include <sys/ipc.h>
  535. X#include <sys/shm.h>
  536. X#include <sys/sem.h>
  537. X
  538. X/* xmtr to rcvr cmds */
  539. X#define SHMX_MAKE_RCVR_SLEEP    1    /* sleep xi1=#seconds */
  540. X#define SHMX_UNPAUSE            2    /* no-op to un-pause() rcvr */
  541. X#define SHMX_SET_RCVR_LOG        3    /* log file manipulations
  542. X                                     * xi1=append,xi2=raw,xs1=name */
  543. X
  544. X/* rcvr to xmtr cmds */
  545. X#define SHMR_NOTIFY_DCD_LOSS    1    /* rcvr detected DCD loss */
  546. X#define SHMR_NOTIFY_ZMODEM        2    /* rcvr detected ZMODEM frame */
  547. X
  548. Xextern char rcvr_log_file[];    /* if rcvr_log!= 0,log filename */
  549. Xextern int rcvr_log;            /* rcvr log active if != 0 */
  550. Xextern FILE *rcvr_log_fp;        /* rcvr log file */
  551. Xextern int rcvr_log_raw;        /* if true, log all, else filter ctl chrs */
  552. Xextern int rcvr_log_flusheach;
  553. Xextern int rcvr_log_append;    /* if true, append, else scratch */
  554. Xextern int rcvr_log_gen_title;
  555. X
  556. XECU_SDS FAR *shm;                /* shared segment pointer */
  557. Xkey_t shm_key;
  558. Xint shm_shmid;
  559. X
  560. X/*+-------------------------------------------------------------------------
  561. X    shm_init()
  562. X  Called by parent process (xmtr) to initialize environment
  563. X--------------------------------------------------------------------------*/
  564. Xvoid
  565. Xshm_init()
  566. X{
  567. X    uint save_LINESxCOLS;
  568. X    extern uint LINESxCOLS;
  569. X
  570. X    /*
  571. X     * see the comments in ecu.h titled "Communication line variables"
  572. X     * for an explanation of the following
  573. X     */
  574. X    if(sizeof(shm->Ltiobuf) < sizeof(struct termio))
  575. X    {
  576. X        pprintf("ecushm.h LTIOBUF_SIZE needs to be increased to %d.\n",
  577. X            sizeof(struct termio));
  578. X        pputs("Please change it, remake and notify wht@n4hgf.Mt-Park.GA.US.\n");
  579. X        termecu(TERMECU_CONFIG_ERROR);
  580. X    }
  581. X
  582. X    shm_key = 0xEC000000L | getpid();
  583. X
  584. X    if((shm_shmid = shmget(shm_key,sizeof(ECU_SDS),IPC_CREAT | 0600)) < 0)
  585. X    {
  586. X        perror("shmget");
  587. X        termecu(TERMECU_IPC_ERROR);
  588. X    }
  589. X
  590. X    if((shm = (ECU_SDS FAR *)shmat(shm_shmid,(char FAR *)0,0)) ==
  591. X        (ECU_SDS FAR *)-1)
  592. X    {
  593. X        perror("shmat");
  594. X        termecu(TERMECU_IPC_ERROR);
  595. X    }
  596. X
  597. X#ifdef RCVRDISP_PV
  598. X    if((shm->rcvrdisp_semid = semget(shm_key,1,IPC_CREAT | 0600)) < 0)
  599. X    {
  600. X        perror("semget");
  601. X        termecu(TERMECU_IPC_ERROR);
  602. X    }
  603. X    rcvrdisp_v();    /* first unlock */
  604. X#endif /*  RCVRDISP_PV */
  605. X
  606. X    /*
  607. X     * see the comments in ecu.h titled "Communication line variables"
  608. X     * for an explanation of the following
  609. X     */
  610. X    Ltermio = (struct termio *)shm->Ltiobuf;    /* cover termio buffer */
  611. X
  612. X    shm->xcmd = 0;    /* signal from xmtr to rcvr SIGUSR2 */
  613. X    shm->xi1 = 0;    /* parameters */
  614. X    shm->xi2 = 0;
  615. X    shm->xs1[0] = 0;
  616. X    shm->rcmd = 0;    /* signal from rcvr to xmtr SIGUSR2 */
  617. X    shm->ri1 = 0;    /* parameters */
  618. X    shm->ri2 = 0;
  619. X    shm->rs1[0] = 0;
  620. X    shm->rcvd_chars = 0L;
  621. X    shm->rcvd_chars_this_connect = 0L;
  622. X    shm->bell_notify_state = 1;    /* default to want bell notify */
  623. X    shm->Ldcdwatch = 0;            /* default DCD watcher to off */
  624. X    shm->autorz = 1;            /* default automatic rz to on */
  625. X    shm->cursor_y = 0;
  626. X    shm->cursor_x = 0;
  627. X    shm->friend_space[0] = 0;
  628. X    save_LINESxCOLS = LINESxCOLS;
  629. X    LINESxCOLS = sizeof(shm->screen);    /* avoid trap */
  630. X    spaces((char *)shm->screen,sizeof(shm->screen));
  631. X    LINESxCOLS = save_LINESxCOLS;
  632. X    shm->rcvrdisp_ptr = shm->rcvrdisp_buffer;
  633. X    shm->rcvrdisp_count = 0;
  634. X
  635. X}    /* end of shm_init */
  636. X
  637. X/*+-------------------------------------------------------------------------
  638. X    shm_done() -- finished with shm/sem -- clean up
  639. X
  640. XWe might make a trip thru here with the xmtr and rcvr, so
  641. Xignore EINVAL
  642. X--------------------------------------------------------------------------*/
  643. Xvoid
  644. Xshm_done()
  645. X{
  646. X
  647. X#ifdef RCVRDISP_PV
  648. X    union semun {
  649. X        int val;
  650. X        struct semid_ds *buf;
  651. X        ushort array[10];
  652. X    } semctl_arg;
  653. X
  654. X    if(semctl(shm->rcvrdisp_semid,0,IPC_RMID,&semctl_arg) && (errno != EINVAL))
  655. X        pperror("semctl IPC_RMID");
  656. X#endif /*  RCVRDISP_PV */
  657. X
  658. X    if(shmctl(shm_shmid,IPC_RMID,(struct shmid_ds *)0 && (errno != EINVAL)))
  659. X        pperror("shmctl IPC_RMID");
  660. X
  661. X}    /* end of shm_done */
  662. X
  663. X/*+-------------------------------------------------------------------------
  664. X    shmx_connect() -- xmtr calls when modem connects
  665. X--------------------------------------------------------------------------*/
  666. Xvoid
  667. Xshmx_connect()
  668. X{
  669. X    shm->rcvd_chars_this_connect = 0L;
  670. X}    /* end of shmx_connect */
  671. X
  672. X/*+-------------------------------------------------------------------------
  673. X    shmx_make_rcvr_sleep(seconds)
  674. X--------------------------------------------------------------------------*/
  675. Xvoid
  676. Xshmx_make_rcvr_sleep(seconds)
  677. Xint seconds;
  678. X{
  679. X    shm->xcmd = SHMX_MAKE_RCVR_SLEEP;
  680. X    shm->xi1 = seconds;
  681. X    kill_rcvr_process(SIGUSR2);
  682. X
  683. X}    /* end of shmx_make_rcvr_sleep */
  684. X
  685. X/*+-------------------------------------------------------------------------
  686. X    shmx_unpause_rcvr() - no-op SIGUSR2 to unpause receiver
  687. X--------------------------------------------------------------------------*/
  688. Xvoid
  689. Xshmx_unpause_rcvr()
  690. X{
  691. X    shm->xcmd = SHMX_UNPAUSE;
  692. X    kill_rcvr_process(SIGUSR2);
  693. X}    /* end of shmx_unpause_rcvr */
  694. X
  695. X/*+-------------------------------------------------------------------------
  696. X    shmx_set_rcvr_log(logfilename,append_flag,raw_flag,flush_each)
  697. X
  698. Xnull logfilename stops logging
  699. Xappend_flag says whether to open for write or append
  700. Xraw_flag says whether or not to filter non-printable chars or not
  701. X(NL not filtered)
  702. X--------------------------------------------------------------------------*/
  703. Xvoid
  704. Xshmx_set_rcvr_log(logfilename,append_flag,raw_flag,flush_each)
  705. Xchar *logfilename;
  706. Xint append_flag;
  707. Xint raw_flag;
  708. Xint flush_each;
  709. X{
  710. X    shm->xcmd = SHMX_SET_RCVR_LOG;
  711. X    shm->xi1 = append_flag;
  712. X    shm->xi2 = raw_flag;
  713. X    shm->xi3 = flush_each;
  714. X    strcpy(shm->xs1,logfilename);
  715. X    kill_rcvr_process(SIGUSR2);
  716. X}    /* end of shmx_set_rcvr_log */
  717. X
  718. X/*+-------------------------------------------------------------------------
  719. X    shmr_notify_xmtr_of_DCD_loss()
  720. X--------------------------------------------------------------------------*/
  721. Xvoid
  722. Xshmr_notify_xmtr_of_DCD_loss()
  723. X{
  724. X    shm->rcmd = SHMR_NOTIFY_DCD_LOSS;
  725. X    kill(xmtr_pid,SIGUSR2);
  726. X}    /* end of shmr_notify_xmtr_of_DCD_loss */
  727. X
  728. X/*+-------------------------------------------------------------------------
  729. X    shmr_notify_zmodem_frame()
  730. X--------------------------------------------------------------------------*/
  731. Xvoid
  732. Xshmr_notify_zmodem_frame()
  733. X{
  734. X    shm->rcmd = SHMR_NOTIFY_ZMODEM;    /* rcvr detected ZMODEM frame */
  735. X    kill(xmtr_pid,SIGUSR2);
  736. X}    /* end of shmr_notify_zmodem_frame */
  737. X
  738. X/*+-------------------------------------------------------------------------
  739. X    shmx_process_xmtr_SIGUSR2()
  740. X--------------------------------------------------------------------------*/
  741. Xvoid
  742. Xshmx_process_xmtr_SIGUSR2()
  743. X{
  744. X    register rcmd;
  745. X    register ri1,ri2;
  746. X    int argc;
  747. X    char *cptr;
  748. X    char **argv;
  749. X    ulong colors_save;
  750. X    int lchar;
  751. X    int success_flag;
  752. X
  753. X    rcmd = shm->rcmd;
  754. X    shm->rcmd = 0;
  755. X    ri1 = shm->ri1;
  756. X    ri2 = shm->ri2;
  757. X
  758. X    switch(rcmd)
  759. X    {
  760. X        case SHMR_NOTIFY_DCD_LOSS:
  761. X            lzero_length_read_detected();
  762. X            break;
  763. X
  764. X        case SHMR_NOTIFY_ZMODEM:
  765. X            kill_rcvr_process(SIGUSR1);
  766. X            success_flag = 0;
  767. X            while((lchar = lgetc_timeout(100L)) >= 0)
  768. X            {
  769. X                fputc(lchar,se);
  770. X                if(lchar == '\n')
  771. X                {
  772. X                    success_flag = 1;
  773. X                    break;
  774. X                }
  775. X            }
  776. X            if(!success_flag)
  777. X                fputs("\r\n",se);
  778. X            colors_save = colors_current;
  779. X            setcolor(colors_notify);
  780. X            fputs("[automatic rz]",se);
  781. X            setcolor(colors_save);
  782. X            fputs("\r\n",se);
  783. X            argc = 1;
  784. X            cptr = "rz";
  785. X            argv = &cptr;
  786. X            receive_files_from_remote(argc,argv);
  787. X            start_rcvr_process(1);
  788. X            break;
  789. X    }
  790. X
  791. X}    /* end of shmx_process_xmtr_SIGUSR2 */
  792. X
  793. X/*+-------------------------------------------------------------------------
  794. X    shmr_process_rcvr_SIGUSR2()
  795. X--------------------------------------------------------------------------*/
  796. Xvoid
  797. Xshmr_process_rcvr_SIGUSR2()
  798. X{
  799. X    register xcmd;
  800. X    register xi1,xi2,xi3;
  801. X    char xs1[SHM_STRLEN];
  802. X
  803. X    xcmd = shm->xcmd;
  804. X    shm->xcmd = 0;
  805. X    xi1 = shm->xi1;
  806. X    xi2 = shm->xi2;
  807. X    xi3 = shm->xi3;
  808. X    strcpy(xs1,shm->xs1);
  809. X
  810. X    switch(xcmd)
  811. X    {
  812. X        case SHMX_MAKE_RCVR_SLEEP:
  813. X            sleep(xi1);
  814. X            break;
  815. X
  816. X        case SHMX_SET_RCVR_LOG:
  817. X            if(rcvr_log)         /* if already logging */
  818. X            {
  819. X                if(!rcvr_log_raw)
  820. X                    LOGPUTC('\n',rcvr_log_fp);
  821. X                fclose(rcvr_log_fp);
  822. X                rcvr_log = 0;
  823. X            }
  824. X            if(strlen(xs1) == 0)    /* if all we wanted was to stop log ... */
  825. X                break;                /* ... then quit */
  826. X            rcvr_log_gen_title = 1;
  827. X            rcvr_log = 1;
  828. X            rcvr_log_append = xi1;
  829. X            rcvr_log_raw = xi2;
  830. X            rcvr_log_flusheach = xi3;
  831. X            strcpy(rcvr_log_file,xs1);
  832. X            rcvr_log_open();
  833. X            break;
  834. X
  835. X        case SHMX_UNPAUSE:
  836. X            break;
  837. X    }
  838. X
  839. X}    /* end of shmr_process_rcvr_SIGUSR2 */
  840. X
  841. X/* end of ecushm.c */
  842. X/* vi: set tabstop=4 shiftwidth=4: */
  843. SHAR_EOF
  844. chmod 0644 ecushm.c ||
  845. echo 'restore of ecushm.c failed'
  846. Wc_c="`wc -c < 'ecushm.c'`"
  847. test 9584 -eq "$Wc_c" ||
  848.     echo 'ecushm.c: original size 9584, current size' "$Wc_c"
  849. rm -f _shar_wnt_.tmp
  850. fi
  851. # ============= ecushm.h ==============
  852. if test -f 'ecushm.h' -a X"$1" != X"-c"; then
  853.     echo 'x - skipping ecushm.h (File already exists)'
  854.     rm -f _shar_wnt_.tmp
  855. else
  856. > _shar_wnt_.tmp
  857. echo 'x - extracting ecushm.h (Text)'
  858. sed 's/^X//' << 'SHAR_EOF' > 'ecushm.h' &&
  859. X#define SHM_REV    0x0ECEC000DL    /* high 16-bits unique, low=revision */
  860. X/*+-------------------------------------------------------------------------
  861. X    ecushm.h -- ecu shared data segment
  862. X    wht@n4hgf.Mt-Park.GA.US
  863. X--------------------------------------------------------------------------*/
  864. X/*+:EDITS:*/
  865. X/*:09-10-1992-13:59-wht@n4hgf-ECU release 3.20 */
  866. X/*:09-10-1992-04:34-wht@n4hgf-add rcvrdisp semaphore */
  867. X/*:09-06-1992-13:29-wht@n4hgf-add receiver process buffered screen write */
  868. X/*:08-22-1992-15:38-wht@n4hgf-ECU release 3.20 BETA */
  869. X/*:08-17-1992-04:55-wht@n4hgf-keep rcvr pid in shm for friend code */
  870. X/*:07-19-1992-07:44-wht@n4hgf-85 lines too expensive to keep updated */
  871. X/*:07-19-1992-07:42-wht@n4hgf-ttyinit_param -> ttyuse */
  872. X/*:05-08-1992-03:36-wht@n4hgf-bumped rev: max screen geometry now 85x80 */
  873. X/*:03-27-1992-16:21-wht@n4hgf-re-include protection for all .h files */
  874. X/*:12-15-1991-14:22-wht@n4hgf-autorz and zmodem_asterisk_count added */
  875. X/*:12-13-1991-04:16-wht@n4hgf-move bell_notify_state to shm */
  876. X/*:11-11-1991-22:25-wht@n4hgf-add Ldcdwatch and Ltiobuf */
  877. X/*:08-21-1991-01:34-wht@n4hgf-FAR depends only on M_I286 */
  878. X/*:07-25-1991-12:56-wht@n4hgf-ECU release 3.10 */
  879. X/*:12-19-1990-17:09-wht@n4hgf-make cursor variables unsigned */
  880. X/*:11-30-1990-19:01-wht@n4hgf-add ttyinit_param */
  881. X/*:11-28-1990-17:43-wht@n4hgf-move cursor_y, cursor_x to right after revision */
  882. X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  883. X
  884. X#ifndef _ecushm_h
  885. X#define _ecushm_h
  886. X
  887. X#if defined(M_I286)
  888. X#define FAR far
  889. X#else
  890. X#define FAR
  891. X#endif
  892. X
  893. X#if !defined(ushort)
  894. X#define ushort unsigned short
  895. X#endif
  896. X#if !defined(uchar)
  897. X#define uchar unsigned char
  898. X#endif
  899. X#if !defined(uint)
  900. X#define uint unsigned int
  901. X#endif
  902. X#if !defined(ulong)
  903. X#define ulong unsigned long
  904. X#endif
  905. X
  906. X/* tty usage parameter (ttyuse) */
  907. X#define TTYUSE_NORMAL            0    /* must be zero */
  908. X#define TTYUSE_FORCE_SIMPLE        1
  909. X
  910. X/*
  911. X * max length of a logical name or  telephone number string
  912. X * this the actual number of characters: arrays are defined
  913. X * DESTREF_LEN + 1 in length to provide for null
  914. X *
  915. X * (in revisions prior to ALPHA-3.19.16, this was named TELNO_LEN)
  916. X */
  917. X#define DESTREF_LEN            40
  918. X
  919. X#define SCREEN_LINES_MAX    43
  920. X#define SCREEN_COLS_MAX        80
  921. X#define SHM_STRLEN            256
  922. X#define TO_SCREEN_BUFSZ        128
  923. X
  924. Xtypedef struct ecu_sds
  925. X{
  926. X    uchar screen[SCREEN_LINES_MAX][SCREEN_COLS_MAX];
  927. X    ulong shm_revision;
  928. X    uint cursor_y;            /* program-maintained receive cursor */
  929. X    uint cursor_x;            /* program-maintained receive cursor */
  930. X    ushort scr_lines;        /* lines in use */
  931. X    ushort scr_cols;        /* columns in use */
  932. X    ushort scr_size;        /* screen size (lines * cols) */
  933. X    ushort terminating;        /* made one when ECU terminating */
  934. X    /* xmtr to rcvr communication area */
  935. X    int xcmd;                /* signal from xmtr to rcvr SIGUSR2 */
  936. X    int xi1;
  937. X    int xi2;
  938. X    int xi3;
  939. X    char xs1[SHM_STRLEN];
  940. X    /* rcvr to xmtr communication area */
  941. X    int rcmd;                /* signal from rcvr to xmtr SIGUSR2 */
  942. X    int ri1;
  943. X    int ri2;
  944. X    char rs1[SHM_STRLEN];
  945. X    ulong rcvd_chars;        /* rcvr char count */
  946. X    ulong rcvd_chars_this_connect;    /* count since last connect */
  947. X    ulong xmit_chars;        /* xmit char count */
  948. X    ulong xmit_chars_this_connect;    /* count since last connect */
  949. X    int Ladd_nl_incoming;    /* when in ksr mode, add nl to cr on receive */
  950. X    int Ladd_nl_outgoing;    /* when in ksr mode, add nl to cr on xmit */
  951. X    int Lfull_duplex;        /* if non-zero, full duplex else half */
  952. X    int Liofd;                /* file descriptor for line */
  953. X    int Lmodem_already_init;/* true if modem already initialized */
  954. X    int Lconnected;    /* we try to keep accurate */
  955. X    int Lparity;            /* 0==NONE, 'e' == even, 'o' == odd */
  956. X    uint Lbaud;                /* baud rate */
  957. X    char Ldescr[64];        /* description of remote */
  958. X    char Lline[64];            /* /dev/ttyname for outgoing line */
  959. X    char Llogical[64];        /* logical name of remote (from dial dir) */
  960. X    char Lrname[64];        /* logical name of remote (settable) */
  961. X    long Loff_hook_time;    /* time() at connect */
  962. X    char Ltelno[DESTREF_LEN+1]; /* telephone number for remote or null */
  963. X    int Ldcdwatch;            /* state of line DCD watcher */
  964. X    ushort Lxonxoff;        /* status of line IXON and IXOFF */
  965. X    /*
  966. X     * this is a projectile vomit hack, but you don't need termio.h
  967. X     * to use ecushm.h this way
  968. X     */
  969. X#define TIOBUF_SIZE        40    /* big enough for all systems I know about */
  970. X    long Ltiobuf[(TIOBUF_SIZE / sizeof(long)) + 1]; /* buffer for termio */
  971. X    PID_T xmtr_pid;            /* transmitter process pid */
  972. X    PID_T xmtr_ppid;        /* transmitter process' parent's pid */
  973. X    PID_T xmtr_pgrp;        /* transmitter process group */
  974. X    PID_T rcvr_pid;            /* receiver pid (or -1 if inactive) */
  975. X    char tty_name[64];        /* comm line name (not console) */
  976. X    uchar ttyuse;            /* see TTYUSE_... above and ecuxfer.c */
  977. X    int bell_notify_state;    /* bell/text-event to annunciator mapping state */
  978. X    int autorz;                /* if true, automatic rz on rcvd zmodem prefix */
  979. X    int autorz_pos;            /* position in autorz match sequence */
  980. X    ulong friend_space[128];/* space for friend programs */
  981. X    /*
  982. X     * receiver process buffered screen write
  983. X     */
  984. X    char rcvrdisp_buffer[TO_SCREEN_BUFSZ];
  985. X    char *rcvrdisp_ptr;
  986. X    int rcvrdisp_count;
  987. X    int rcvrdisp_semid;
  988. X} ECU_SDS;
  989. X
  990. Xextern ECU_SDS FAR *shm;        /* shared segment pointer */
  991. X
  992. X#endif /* _ecushm_h */
  993. X
  994. X/* vi: set tabstop=4 shiftwidth=4: */
  995. X/* end of ecushm.h */
  996. SHAR_EOF
  997. chmod 0644 ecushm.h ||
  998. echo 'restore of ecushm.h failed'
  999. Wc_c="`wc -c < 'ecushm.h'`"
  1000. test 5188 -eq "$Wc_c" ||
  1001.     echo 'ecushm.h: original size 5188, current size' "$Wc_c"
  1002. rm -f _shar_wnt_.tmp
  1003. fi
  1004. # ============= ecusighdl.c ==============
  1005. if test -f 'ecusighdl.c' -a X"$1" != X"-c"; then
  1006.     echo 'x - skipping ecusighdl.c (File already exists)'
  1007.     rm -f _shar_wnt_.tmp
  1008. else
  1009. > _shar_wnt_.tmp
  1010. echo 'x - extracting ecusighdl.c (Text)'
  1011. sed 's/^X//' << 'SHAR_EOF' > 'ecusighdl.c' &&
  1012. X/* #define TRICKY_SEGV */
  1013. X/* #ifdef DEBUG_SRP */
  1014. X/*+-----------------------------------------------------------------------
  1015. X    ecusighdl.c - xmtr/rcvr individual process signal handlers
  1016. X    wht@n4hgf.Mt-Park.GA.US
  1017. X
  1018. X  Defined functions:
  1019. X    _start_rcvr_process(notify_flag)
  1020. X    _start_rcvr_process(notify_flag,fname,fline)
  1021. X    child_signals()
  1022. X    kill_rcvr_process(sig)
  1023. X    rcvr_SIGHUP_handler()
  1024. X    rcvr_SIGINT_handler()
  1025. X    rcvr_SIGTERM_handler()
  1026. X    rcvr_SIGUSR1_handler()
  1027. X    rcvr_SIGUSR2_handler()
  1028. X    rcvr_common_signal_handler()
  1029. X    rcvr_death_handler(sig)
  1030. X    rcvr_signals()
  1031. X    termecu(code)
  1032. X    termecu_code_text(code)
  1033. X    xmtr_SIGCLD_handler()
  1034. X    xmtr_SIGHUP_handler(sig)
  1035. X    xmtr_SIGINT_handler()
  1036. X    xmtr_SIGTERM_handler(sig)
  1037. X    xmtr_SIGUSR2_handler()
  1038. X    xmtr_death_handler(sig)
  1039. X    xmtr_signals()
  1040. X
  1041. X------------------------------------------------------------------------*/
  1042. X/*+:EDITS:*/
  1043. X/*:09-10-1992-13:59-wht@n4hgf-ECU release 3.20 */
  1044. X/*:08-22-1992-15:38-wht@n4hgf-ECU release 3.20 BETA */
  1045. X/*:08-17-1992-04:55-wht@n4hgf-keep rcvr pid in shm for friend code */
  1046. X/*:08-16-1992-03:08-wht@n4hgf-head off another POSIX plot */
  1047. X/*:08-16-1992-01:54-wht@n4hgf-job control signals get SIG_IGN */
  1048. X/*:04-29-1992-19:04-wht@n4hgf-make a pass at handling job control signals */
  1049. X/*:04-29-1992-13:46-wht@n4hgf-ignore SIGQUIT */
  1050. X/*:04-23-1992-16:20-wht@n4hgf-disable mysterious rcvr SIGCLD events */
  1051. X/*:02-16-1992-01:42-wht@n4hgf-turn off xterm_title + add _terminate.ep */
  1052. X/*:08-25-1991-23:56-wht@n4hgf2-handle xmtr core dump gracefully */
  1053. X/*:07-25-1991-12:56-wht@n4hgf-ECU release 3.10 */
  1054. X/*:07-17-1991-07:04-wht@n4hgf-avoid SCO UNIX nap bug */
  1055. X/*:06-29-1991-15:42-wht@n4hgf-if WHT and xterm, play with title bar */
  1056. X/*:01-29-1991-12:57-wht@n4hgf-on exit, restore setcolor colors if possible */
  1057. X/*:12-18-1990-20:02-wht@n4hgf-add rcvr_death_handler */
  1058. X/*:09-19-1990-19:36-wht@n4hgf-ecu_log_event now gets pid for log from caller */
  1059. X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  1060. X
  1061. X#include "ecu.h"
  1062. X#include "ecufork.h"
  1063. X
  1064. Xextern int windows_active;
  1065. Xextern int current_ttymode;
  1066. Xextern int ttymode_termecu_on_sigint;
  1067. Xextern char lopen_err_str[];
  1068. Xextern int rcvr_log;
  1069. Xextern FILE *rcvr_log_fp;
  1070. Xextern char rcvr_log_file[];    /* if rcvr_log!= 0,log filename */
  1071. Xextern int rcvr_log_append;
  1072. X
  1073. Xint sigint = 0;            /* interrupt indicator */
  1074. Xint proc_interrupt = 0;        /* procedure interrupt indicator */
  1075. Xint last_child_wait_status = 0;
  1076. Xint last_child_wait_pid = 0;
  1077. Xint xmtr_killed_rcvr = 0;
  1078. X
  1079. Xchar *signal_name_text();
  1080. X
  1081. Xvoid termecu();
  1082. Xvoid xmtr_signals();
  1083. Xvoid rcvr_signals();
  1084. Xvoid child_signals();
  1085. X
  1086. XSIGTYPE rcvr_SIGTERM_handler();
  1087. XSIGTYPE rcvr_SIGINT_handler();
  1088. XSIGTYPE rcvr_SIGUSR1_handler();
  1089. XSIGTYPE rcvr_SIGUSR2_handler();
  1090. XSIGTYPE rcvr_SIGHUP_handler();
  1091. XSIGTYPE xmtr_SIGINT_handler();
  1092. XSIGTYPE xmtr_SIGHUP_handler();
  1093. XSIGTYPE xmtr_SIGTERM_handler();
  1094. XSIGTYPE xmtr_SIGCLD_handler();
  1095. XSIGTYPE xmtr_death_handler();
  1096. XSIGTYPE rcvr_common_signal_handler();
  1097. XSIGTYPE rcvr_death_handler();
  1098. X
  1099. X/*+-----------------------------------------------------------------------
  1100. X    _start_rcvr_process(notify_flag) - start RCVR process if not extant
  1101. X------------------------------------------------------------------------*/
  1102. X#ifndef BUILDING_PROTOTYPES
  1103. XSIGTYPE
  1104. X#ifdef DEBUG_SRP
  1105. X_start_rcvr_process(notify_flag,fname,fline)
  1106. Xint notify_flag;
  1107. Xchar *fname;
  1108. Xint fline;
  1109. X#else
  1110. X_start_rcvr_process(notify_flag)
  1111. Xint notify_flag;
  1112. X#endif
  1113. X{
  1114. X    extern ulong colors_current;
  1115. X    ulong colors_at_entry = colors_current;
  1116. X#if defined(FORK_DEBUG)
  1117. X    char s40[40];
  1118. X#endif
  1119. X#ifdef DEBUG_SRP
  1120. X    char s80[80];
  1121. X        sprintf(s80,"start_rcvr_process (%d) file: %s line=%d",
  1122. X            rcvr_pid,fname,fline);
  1123. X        ecu_log_event((int)xmtr_pid,s80);
  1124. X#endif
  1125. X
  1126. X    fflush(so);
  1127. X    fflush(se);
  1128. X
  1129. X    if(rcvr_pid > 0)            /* if process already active,just ... */
  1130. X        return;
  1131. X
  1132. X    if(rcvr_log && rcvr_log_file[0] && rcvr_log_fp)
  1133. X    {
  1134. X        fclose(rcvr_log_fp);
  1135. X        rcvr_log_fp = (FILE *)0;
  1136. X    }
  1137. X
  1138. X    xmtr_killed_rcvr = 0;
  1139. X    shm->rcvr_pid = rcvr_pid = smart_fork();
  1140. X    if(rcvr_pid == 0)        /* if we are the (spawned) rcvr process */
  1141. X    {
  1142. X        if(notify_flag)
  1143. X        {
  1144. X            setcolor(colors_notify);
  1145. X            fputs("[interactive mode]",se);
  1146. X            setcolor(colors_at_entry);
  1147. X            fputs("\r\n",se);
  1148. X        }
  1149. X
  1150. X        rcvr();    /* run until killed */
  1151. X        /*NOTREACHED*/
  1152. X    }
  1153. X    else if(rcvr_pid > 0)     /* we are the father (xmtr) process */
  1154. X    {
  1155. X#if defined(FORK_DEBUG)
  1156. X        sprintf(s40,"DEBUG rcvr pid %d",rcvr_pid);
  1157. X        ecu_log_event(getpid(),s40);        /* rcvr */
  1158. X#endif
  1159. X        if(rcvr_log)
  1160. X            rcvr_log_append = 1;    /* until next %log -s */
  1161. X        xmtr_signals();
  1162. X        return;
  1163. X    }
  1164. X
  1165. X    shm->rcvr_pid = rcvr_pid = -1;        /* no receiver active */
  1166. X
  1167. X    ff(se,"\r\n\ncould not fork for receive\r\n");
  1168. X    termecu(TERMECU_NO_FORK_FOR_RCVR);
  1169. X    /*NOTREACHED*/
  1170. X
  1171. X}    /* end of _start_rcvr_process */
  1172. X#endif /* BUILDING_PROTOTYPES */
  1173. X
  1174. X/*+-----------------------------------------------------------------------
  1175. X    kill_rcvr_process(sig) -- kill rcvr process with signal 'sig'
  1176. X------------------------------------------------------------------------*/
  1177. XSIGTYPE
  1178. Xkill_rcvr_process(sig)
  1179. Xint sig;
  1180. X{
  1181. X    int wait_count = 70;
  1182. X
  1183. X    if(rcvr_pid > 0)        /* if we have forked a rcvr process */
  1184. X    {
  1185. X        xmtr_killed_rcvr = 1;
  1186. X        rcvr_log_fp = (FILE *)0;
  1187. X        xmtr_signals();
  1188. X        kill(rcvr_pid,sig);
  1189. X        if(sig != SIGUSR2)    /* rcvr does not die on SIGUSR2 */
  1190. X        {
  1191. X            errno = 0;
  1192. X            while(wait_count)
  1193. X            {
  1194. X                if(kill(rcvr_pid,0) && (errno == ESRCH))
  1195. X                    break;
  1196. X                errno = 0;
  1197. X                Nap(40L);
  1198. X                wait_count--;
  1199. X            }
  1200. X            if(!wait_count)
  1201. X            {
  1202. X                while(!kill(rcvr_pid,SIGKILL))
  1203. X                {
  1204. X                    wait((int *)0);
  1205. X                    Nap(40L);
  1206. X                }
  1207. X            }
  1208. X            shm->rcvr_pid = rcvr_pid = -1;        /* no receiver active */
  1209. X            if(rcvr_log && rcvr_log_file[0])
  1210. X                rcvr_log_fp = fopen(rcvr_log_file,"a");
  1211. X
  1212. X            rcvrdisp_actual();    /* write any buffered screen data */
  1213. X        }
  1214. X    }
  1215. X
  1216. X}    /* end of kill_rcvr_process */
  1217. X
  1218. X/*+-------------------------------------------------------------------------
  1219. X    termecu_code_text(code)
  1220. X--------------------------------------------------------------------------*/
  1221. Xchar *
  1222. Xtermecu_code_text(code)
  1223. Xint code;
  1224. X{
  1225. X    static char errant[16];
  1226. X    char *signal_name_text();
  1227. X
  1228. X    if((code >= TERMECU_SIG1) && (code <= TERMECU_SIGN))
  1229. X        return(signal_name_text(code));
  1230. X
  1231. X    switch(code)
  1232. X    {
  1233. X        case TERMECU_BSD4_IOCTL: return("BSD4 ioctl error");
  1234. X        case TERMECU_CONFIG_ERROR: return("configuration error");
  1235. X        case TERMECU_CURSES_ERROR: return("error in curses use");
  1236. X        case TERMECU_GEOMETRY: return("unsupported screen geometry");
  1237. X        case TERMECU_INIT_PROC_ERROR: return("error during initial procedure");
  1238. X        case TERMECU_IPC_ERROR: return("IPC (shm/sem) init failed");
  1239. X        case TERMECU_LINE_OPEN_ERROR: return("line open error");
  1240. X        case TERMECU_LINE_READ_ERROR: return("line read error");
  1241. X        case TERMECU_LOGIC_ERROR: return("internal logic error");
  1242. X        case TERMECU_MALLOC: return("critical memory allocation failure");
  1243. X        case TERMECU_NO_FORK_FOR_RCVR: return("can't fork for RCVR");
  1244. X        case TERMECU_PWENT_ERROR: return("password entry error");
  1245. X        case TERMECU_RCVR_FATAL_ERROR: return("detected RCVR FATAL ERROR");
  1246. X        case TERMECU_SHM_ABL: return("SHM ABL error");
  1247. X        case TERMECU_SHM_RTL: return("SHM RTL error");
  1248. X        case TERMECU_TTYIN_READ_ERROR: return("keyboard read error");
  1249. X        case TERMECU_USAGE: return("usage");
  1250. X        case TERMECU_XMTR_FATAL_ERROR: return("detected XMTR FATAL ERROR");
  1251. X        case TERMECU_XMTR_WRITE_ERROR: return("line write error");
  1252. X        default:
  1253. X            sprintf(errant,"code %u?",code);
  1254. X            return(errant);
  1255. X    }
  1256. X
  1257. X}    /* end of termecu_code_text */
  1258. X
  1259. X/*+-----------------------------------------------------------------------
  1260. X    termecu(code) -- terminate program (with cleanup)
  1261. X
  1262. X  see termecu.h for a list of codes
  1263. X
  1264. X  Separate processing for rcvr and xmtr processes;  rcvr entry
  1265. X  is only upon some kind of serious error and it more less just dies,
  1266. X  causing xmtr process to wake up with SIGCLD and come in here.
  1267. X
  1268. X  Upon entry by xmtr process:
  1269. X    close comm line
  1270. X    run any _terminate.ep procedure
  1271. X    return any ungetty'd line
  1272. X    return user's console to normal status
  1273. X    remove shm segment
  1274. X    terminate program
  1275. X
  1276. X------------------------------------------------------------------------*/
  1277. XSIGTYPE
  1278. Xtermecu(code)
  1279. Xint code;
  1280. X{
  1281. X    int isig;
  1282. X    int save_errno = errno;
  1283. X    extern char initial_procedure[];
  1284. X    shm->terminating = 1;            /* tell friends goodbye */
  1285. X    if(xmtr_pid == getpid())        /* if we are xmtr */
  1286. X    {
  1287. X        for(isig = 1; isig < NSIG; isig++)
  1288. X            signal(isig,SIG_IGN);
  1289. X        kill_rcvr_process(SIGUSR1);
  1290. X        if(windows_active)
  1291. X            windows_end_signal();
  1292. X        tcap_curbotleft();
  1293. X        tcap_eeod();
  1294. X        if(shm && shm->Lconnected)
  1295. X            DCE_hangup();
  1296. X#if defined(WHT2) || defined(XTERM_FRIEND)
  1297. X        /*
  1298. X         * if xterm, remove ecu from the title bar
  1299. X         * but this really should be done in _terminate.ep
  1300. X         */
  1301. X        xterm_title("xterm",0);
  1302. X#endif
  1303. X        if(find_procedure("_terminate"))
  1304. X        {
  1305. X        char code_str[16];
  1306. X        char *_doproc_args[2];
  1307. X            _doproc_args[0] = "_terminate";    /* _terminate.ep */
  1308. X            sprintf(code_str,"%d",code);
  1309. X            _doproc_args[1] = code_str;
  1310. X            (void)do_proc(2,_doproc_args);
  1311. X        }
  1312. X        if(shm && (shm->Liofd != -1))
  1313. X            lclose();
  1314. X        /* make SURE we release any line(s) acquired from getty */
  1315. X        ungetty_return_line((char *)0);    /* lclose() calls this via unlock_tty(),
  1316. X                                         * but ok to make sure
  1317. X                                         */
  1318. X
  1319. X        ttymode(0);            /* normal tty status */
  1320. X        shm_done();
  1321. X        if(code > NSIG)
  1322. X        {
  1323. X            char s64[64];
  1324. X            setcolor(colors_error);
  1325. X            if(code == TERMECU_INIT_PROC_ERROR)
  1326. X                pprintf("initial procedure '%s' failed\n",initial_procedure);
  1327. X            else if((code > TERMECU_INIT_PROC_ERROR) &&
  1328. X                    (code <= TERMECU_INIT_PROC_ERROR + 32))
  1329. X            {
  1330. X                pprintf("procedure command: exit %d\n",
  1331. X                    code - TERMECU_INIT_PROC_ERROR);
  1332. X            }
  1333. X            else
  1334. X            {
  1335. X                sprintf(s64,"## XMTR %s, errno = %d",termecu_code_text(code),
  1336. X                    save_errno);
  1337. X                pputs(s64);
  1338. X                pputs("\n");
  1339. X                if(lopen_err_str[0])
  1340. X                {
  1341. X                    pputs(lopen_err_str);
  1342. X                    pputs("\n");
  1343. X                }
  1344. X                ecu_log_event(getpid(),s64);
  1345. X                errno = save_errno;
  1346. X                if(errno)
  1347. X                    pperror("errno may not apply, but");
  1348. X            }
  1349. X        }
  1350. X        restore_initial_colors();
  1351. X    }
  1352. X    else                            /* we are rcvr */
  1353. X    {
  1354. X        if(code > NSIG)
  1355. X        {
  1356. X        char s64[64];
  1357. X            sprintf(s64,"## RCVR %s, errno = %d",termecu_code_text(code),
  1358. X                save_errno);
  1359. X            setcolor(colors_error);
  1360. X            pputs(s64);
  1361. X            pputs("\n");
  1362. X            ecu_log_event(getpid(),s64);
  1363. X            errno = save_errno;
  1364. X            if(errno)
  1365. X                pperror("errno may not apply, but");
  1366. X        }
  1367. X        restore_initial_colors();
  1368. X        kill(xmtr_pid,SIGHUP);
  1369. X    }
  1370. X    exit(code);
  1371. X    /*NOTREACHED*/
  1372. X
  1373. X}    /* end of termecu */
  1374. X
  1375. XSIGTYPE
  1376. Xrcvr_common_signal_handler()
  1377. X{
  1378. X    extern int rcvr_log;
  1379. X    extern int rcvr_log_raw;
  1380. X    extern FILE *rcvr_log_fp;
  1381. X
  1382. X    if(rcvr_log)
  1383. X    {
  1384. X        if(!rcvr_log_raw)
  1385. X            fputs("\n",rcvr_log_fp);
  1386. X        fclose(rcvr_log_fp);
  1387. X    }
  1388. X
  1389. X    exit(0);
  1390. X}
  1391. XSIGTYPE
  1392. Xrcvr_SIGTERM_handler()
  1393. X{
  1394. X    rcvr_common_signal_handler();
  1395. X}
  1396. XSIGTYPE
  1397. Xrcvr_SIGINT_handler()
  1398. X{
  1399. X    signal(SIGINT,rcvr_SIGINT_handler);
  1400. X}
  1401. XSIGTYPE
  1402. Xrcvr_SIGUSR1_handler()
  1403. X{
  1404. X    rcvr_common_signal_handler();
  1405. X}
  1406. XSIGTYPE
  1407. Xrcvr_SIGUSR2_handler()
  1408. X{
  1409. X    signal(SIGUSR2,rcvr_SIGUSR2_handler);
  1410. X    shmr_process_rcvr_SIGUSR2();
  1411. X}
  1412. XSIGTYPE
  1413. Xrcvr_SIGHUP_handler()
  1414. X{
  1415. X    rcvr_common_signal_handler();
  1416. X}
  1417. X
  1418. X/*+-------------------------------------------------------------------------
  1419. X    rcvr_death_handler(sig) - unexpected signal; try to dump core
  1420. X--------------------------------------------------------------------------*/
  1421. XSIGTYPE
  1422. Xrcvr_death_handler(sig)
  1423. Xint sig;
  1424. X{
  1425. X    int itmp;
  1426. X#ifdef TRICKY_SEGV
  1427. X    int *open_elevator_shaft = (int *)(shm - 1);
  1428. X#endif
  1429. X
  1430. X    ttymode(0);
  1431. X    ff(se,"\nreceiver process caught signal %s\r\n",
  1432. X        signal_name_text(sig));
  1433. X    ff(se,"screen cursor (y,x) = (%u,%u)\r\n",shm->cursor_y,shm->cursor_x);
  1434. X    for(itmp = 1; itmp < NSIG; itmp++)
  1435. X        signal(itmp,SIG_DFL);
  1436. X#ifdef TRICKY_SEGV
  1437. X    signal(SIGSEGV,SIG_DFL);
  1438. X    printf("oes=%08lx\n",open_elevator_shaft);
  1439. X    itmp = *open_elevator_shaft;
  1440. X#else
  1441. X    kill((PID_T)getpid(),SIGIOT);
  1442. X#endif
  1443. X    _exit(-1);
  1444. X}    /* end of rcvr_death_handler */
  1445. X
  1446. X/*+-------------------------------------------------------------------------
  1447. X    xmtr_SIGINT_handler()
  1448. X--------------------------------------------------------------------------*/
  1449. XSIGTYPE
  1450. Xxmtr_SIGINT_handler()
  1451. X{
  1452. X    if(ttymode_termecu_on_sigint)
  1453. X        termecu(SIGINT);
  1454. X
  1455. X    signal(SIGINT,xmtr_SIGINT_handler);
  1456. X    sigint = 1;
  1457. X    proc_interrupt = 1;
  1458. X}    /* end of xmtr_SIGINT_handler */
  1459. X
  1460. XSIGTYPE
  1461. Xxmtr_SIGHUP_handler(sig)
  1462. Xint sig;
  1463. X{
  1464. X    termecu(sig);
  1465. X}
  1466. XSIGTYPE
  1467. Xxmtr_SIGTERM_handler(sig)
  1468. Xint sig;
  1469. X{
  1470. X    termecu(sig);
  1471. X}
  1472. X
  1473. XSIGTYPE
  1474. Xxmtr_SIGUSR2_handler()
  1475. X{
  1476. X    SIGTYPE xmtr_SIGUSR2_handler();
  1477. X    signal(SIGUSR2,xmtr_SIGUSR2_handler);
  1478. X    shmx_process_xmtr_SIGUSR2();
  1479. X}
  1480. X
  1481. X/*+-------------------------------------------------------------------------
  1482. X    xmtr_death_handler(sig) - unexpected signal; try to dump core
  1483. X--------------------------------------------------------------------------*/
  1484. XSIGTYPE
  1485. Xxmtr_death_handler(sig)
  1486. Xint sig;
  1487. X{
  1488. X    int itmp;
  1489. X#ifdef TRICKY_SEGV
  1490. X    int *open_elevator_shaft = (int *)(shm - 1);
  1491. X#endif
  1492. X
  1493. X    ttymode(0);
  1494. X    ff(se,"\ntransmitter process caught signal %s\n",
  1495. X        signal_name_text(sig));
  1496. X    kill_rcvr_process(SIGUSR1);
  1497. X    for(itmp = 1; itmp < NSIG; itmp++)
  1498. X        signal(itmp,SIG_DFL);
  1499. X#ifdef TRICKY_SEGV
  1500. X    signal(SIGSEGV,SIG_DFL);
  1501. X    printf("oes=%08lx\n",open_elevator_shaft);
  1502. X    fflush(stdout);
  1503. X    itmp = *open_elevator_shaft;
  1504. X#else
  1505. X    kill((PID_T)getpid(),SIGIOT);
  1506. X#endif
  1507. X    termecu(sig);
  1508. X}    /* end of xmtr_death_handler */
  1509. X
  1510. X/*+-------------------------------------------------------------------------
  1511. X    xmtr_SIGCLD_handler()
  1512. X--------------------------------------------------------------------------*/
  1513. XSIGTYPE
  1514. Xxmtr_SIGCLD_handler()
  1515. X{
  1516. X
  1517. XWAIT:
  1518. X    errno = 0;
  1519. X    if((last_child_wait_pid = wait(&last_child_wait_status)) < 0)
  1520. X    {
  1521. X        if(errno == EINTR)
  1522. X            goto WAIT;
  1523. X    }
  1524. X
  1525. X#if defined(FORK_DEBUG)
  1526. X    sprintf(s40,"DEBUG fork SIGCLD pid %d term %x",
  1527. X        last_child_wait_pid,last_child_wait_status);
  1528. X    ecu_log_event(getpid(),s40);        /* xmtr_SIGCLD_handler() */
  1529. X#endif
  1530. X
  1531. X    if((last_child_wait_pid == rcvr_pid) && !xmtr_killed_rcvr)
  1532. X    {
  1533. X        ff(se,"\r\nECU receiver process died unexpectedly\r\n");
  1534. X        termecu(TERMECU_RCVR_FATAL_ERROR);
  1535. X    }
  1536. X    signal(SIGCLD,xmtr_SIGCLD_handler);
  1537. X
  1538. X}    /* end of xmtr_SIGCLD_handler */
  1539. X
  1540. X/*+-------------------------------------------------------------------------
  1541. X    child_signals() - signal() calls for children processes
  1542. X--------------------------------------------------------------------------*/
  1543. Xvoid
  1544. Xchild_signals()
  1545. X{
  1546. X    int isig;
  1547. X
  1548. X    for(isig = 0; isig < NSIG; isig++)
  1549. X        signal(isig,SIG_DFL);
  1550. X
  1551. X}    /* end of child_signals */
  1552. X
  1553. X/*+-------------------------------------------------------------------------
  1554. X    xmtr_signals()
  1555. X--------------------------------------------------------------------------*/
  1556. Xvoid
  1557. Xxmtr_signals()
  1558. X{
  1559. X    int sig;
  1560. X
  1561. X    for(sig = 1; sig < NSIG; sig++)
  1562. X    {
  1563. X        switch(sig)
  1564. X        {
  1565. X
  1566. X            case SIGHUP:
  1567. X                signal(sig,xmtr_SIGHUP_handler);
  1568. X                break;
  1569. X#if    defined(SIGSTOP)
  1570. X            /*
  1571. X             * call Roto-Rooter on POSIX plots
  1572. X             */
  1573. X            case SIGSTOP:
  1574. X            case SIGTSTP:
  1575. X            case SIGCONT:
  1576. X            case SIGTTIN:
  1577. X            case SIGTTOU:
  1578. X                signal(sig,SIG_IGN);
  1579. X                break;
  1580. X#endif
  1581. X
  1582. X#ifdef SIGWINCH
  1583. X            case SIGWINCH:
  1584. X                signal(sig,SIG_DFL);
  1585. X                break;
  1586. X#endif
  1587. X            case SIGQUIT:
  1588. X                signal(sig,SIG_IGN);
  1589. X                break;
  1590. X            case SIGINT:
  1591. X                signal(sig,xmtr_SIGINT_handler);
  1592. X                break;
  1593. X            case SIGTERM:
  1594. X                signal(sig,xmtr_SIGTERM_handler);
  1595. X                break;
  1596. X            case SIGCLD:
  1597. X                signal(sig,xmtr_SIGCLD_handler);
  1598. X                break;
  1599. X            case SIGUSR2:
  1600. X                signal(sig,xmtr_SIGUSR2_handler);
  1601. X                break;
  1602. X            default:
  1603. X                signal(sig,xmtr_death_handler);
  1604. X        }
  1605. X    }
  1606. X
  1607. X}    /* end of xmtr_signals */
  1608. X
  1609. X/*+-------------------------------------------------------------------------
  1610. X    rcvr_signals()
  1611. X--------------------------------------------------------------------------*/
  1612. Xvoid
  1613. Xrcvr_signals()
  1614. X{
  1615. X    int sig;
  1616. X
  1617. X    for(sig = 1; sig < NSIG; sig++)
  1618. X    {
  1619. X        switch(sig)
  1620. X        {
  1621. X
  1622. X            case SIGHUP:
  1623. X                signal(sig,rcvr_SIGHUP_handler);
  1624. X                break;
  1625. X
  1626. X#if    defined(SIGSTOP)
  1627. X            case SIGSTOP:
  1628. X            case SIGTSTP:
  1629. X            case SIGCONT:
  1630. X            case SIGTTIN:
  1631. X            case SIGTTOU:
  1632. X                signal(sig,SIG_IGN);
  1633. X                break;
  1634. X#endif
  1635. X
  1636. X#ifdef SIGWINCH
  1637. X            case SIGWINCH:
  1638. X#endif
  1639. X            case SIGCLD:
  1640. X                signal(sig,SIG_DFL);
  1641. X                break;
  1642. X            case SIGQUIT:
  1643. X                signal(sig,SIG_IGN);
  1644. X                break;
  1645. X            case SIGINT:
  1646. X                signal(sig,rcvr_SIGINT_handler);
  1647. X                break;
  1648. X            case SIGTERM:
  1649. X                signal(sig,rcvr_SIGTERM_handler);
  1650. X                break;
  1651. X            case SIGUSR1:
  1652. X                signal(sig,rcvr_SIGUSR1_handler);
  1653. X                break;
  1654. X            case SIGUSR2:
  1655. X                signal(sig,rcvr_SIGUSR2_handler);
  1656. X                break;
  1657. X            default:
  1658. X                signal(sig,rcvr_death_handler);
  1659. X        }
  1660. X    }
  1661. X}    /* end of rcvr_signals */
  1662. X
  1663. X/* vi: set tabstop=4 shiftwidth=4: */
  1664. SHAR_EOF
  1665. chmod 0644 ecusighdl.c ||
  1666. echo 'restore of ecusighdl.c failed'
  1667. Wc_c="`wc -c < 'ecusighdl.c'`"
  1668. test 16058 -eq "$Wc_c" ||
  1669.     echo 'ecusighdl.c: original size 16058, current size' "$Wc_c"
  1670. rm -f _shar_wnt_.tmp
  1671. fi
  1672. # ============= ecutcap.c ==============
  1673. if test -f 'ecutcap.c' -a X"$1" != X"-c"; then
  1674.     echo 'x - skipping ecutcap.c (File already exists)'
  1675.     rm -f _shar_wnt_.tmp
  1676. else
  1677. > _shar_wnt_.tmp
  1678. echo 'x - extracting ecutcap.c (Text)'
  1679. sed 's/^X//' << 'SHAR_EOF' > 'ecutcap.c' &&
  1680. X/*+-------------------------------------------------------------------------
  1681. X    ecutcap.c -- termcap stuff
  1682. X    wht@n4hgf.Mt-Park.GA.US
  1683. X
  1684. X  Defined functions:
  1685. X    tcap_blink_off()
  1686. X    tcap_blink_on()
  1687. X    tcap_bold_off()
  1688. X    tcap_bold_on()
  1689. X    tcap_clear_area_char(count,clrch)
  1690. X    tcap_clear_screen()
  1691. X    tcap_curbotleft()
  1692. X    tcap_curleft(count)
  1693. X    tcap_curright(count)
  1694. X    tcap_cursor(y,x)
  1695. X    tcap_delete_chars(count)
  1696. X    tcap_delete_lines(count)
  1697. X    tcap_draw_box(y,x,height,width,title,title_x)
  1698. X    tcap_draw_box_primitive(y,x,height,width)
  1699. X    tcap_eeod()
  1700. X    tcap_eeol()
  1701. X    tcap_gets(buf,bufsize,delim,wait_for_key)
  1702. X    tcap_horiz_rule(count)
  1703. X    tcap_init()
  1704. X    tcap_insert_chars(count)
  1705. X    tcap_insert_lines(count)
  1706. X    tcap_putc(character)
  1707. X    tcap_stand_end()
  1708. X    tcap_stand_out()
  1709. X    tcap_underscore_off()
  1710. X    tcap_underscore_on()
  1711. X    tcap_vbell()
  1712. X    tcap_vertical_rule(y,x,count)
  1713. X
  1714. X--------------------------------------------------------------------------*/
  1715. X/*+:EDITS:*/
  1716. X/*:09-10-1992-13:59-wht@n4hgf-ECU release 3.20 */
  1717. X/*:08-22-1992-15:38-wht@n4hgf-ECU release 3.20 BETA */
  1718. X/*:03-10-1992-13:25-wht@n4hgf2-quick sanity check on ttype features */
  1719. X/*:02-24-1992-06:50-root@n4hgf-getenv COLUMNS not COLS */
  1720. X/*:07-25-1991-12:56-wht@n4hgf-ECU release 3.10 */
  1721. X/*:05-01-1991-04:05-wht@n4hgf-try to catch tbetz tc= infinite loop early */
  1722. X/*:03-20-1991-16:25-root@n4hgf-environment LINES/COLS overrides termcap li/co */
  1723. X/*:11-28-1990-14:52-wht@n4hgf-tcap support for non-ansi console */
  1724. X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  1725. X
  1726. X#include "ecu.h"
  1727. X#include "ecukey.h"
  1728. X#include "pc_scr.h"
  1729. X
  1730. Xuint tcap_LINES;
  1731. Xuint tcap_COLS;
  1732. X
  1733. Xstatic char *tc_blink_on = "";
  1734. Xstatic char *tc_blink_off = "";
  1735. Xstatic char *tc_bold_on = "";
  1736. Xstatic char *tc_bold_off = "";
  1737. Xstatic char *tc_clear = "";
  1738. Xstatic char *tc_curleft = "";
  1739. Xstatic char *tc_curright = "";
  1740. Xstatic char *tc_delchar = "";
  1741. Xstatic char *tc_delline = "";
  1742. Xstatic char *tc_eeod = "";
  1743. Xstatic char *tc_eeol = "";
  1744. Xstatic char *tc_inschar = "";
  1745. Xstatic char *tc_insline = "";
  1746. Xstatic char *tc_move = "";
  1747. Xstatic char *tc_standout = "";
  1748. Xstatic char *tc_standend = "";
  1749. Xstatic char *tc_underscore_on = "";
  1750. Xstatic char *tc_underscore_off = "";
  1751. Xstatic char *tc_vbell = "";
  1752. Xstatic char tc_strbuf[768];        /* absolutely blunderous overkill */
  1753. Xstatic int tc_standout_width;
  1754. X
  1755. Xchar *tgetstr();
  1756. Xchar *tgoto();
  1757. Xchar *getenv();
  1758. X
  1759. Xvoid tcap_cursor();
  1760. Xvoid tcap_stand_out();
  1761. Xvoid tcap_stand_end();
  1762. X
  1763. X/*+-------------------------------------------------------------------------
  1764. X    tcap_init() - get termcap variables
  1765. X--------------------------------------------------------------------------*/
  1766. Xvoid
  1767. Xtcap_init()
  1768. X{
  1769. X    char termbuf[1024];
  1770. X    char *cptr;
  1771. X
  1772. X    if(!ttype || !*ttype)
  1773. X    {
  1774. X        fprintf(stderr,"invalid or missing TERM environment variable\r\n");
  1775. X        termecu(TERMECU_CURSES_ERROR);
  1776. X    }
  1777. X
  1778. X    if(tgetent(termbuf,ttype) > 0)
  1779. X    {
  1780. X        tcap_LINES = tgetnum("li");
  1781. X        tcap_COLS = tgetnum("co");
  1782. X        if(cptr = getenv("LINES"))            /* environment override ... */
  1783. X            tcap_LINES = atoi(cptr);        /* ... for termcap systems */
  1784. X        if(cptr = getenv("COLUMNS"))
  1785. X            tcap_COLS = atoi(cptr);
  1786. X        if((tc_standout_width = tgetnum("sg")) < 0)
  1787. X            tc_standout_width = 0;
  1788. X        cptr = tc_strbuf;
  1789. X        tc_standout         = tgetstr("so",&cptr);
  1790. X        tc_standend         = tgetstr("se",&cptr);
  1791. X        tc_clear            = tgetstr("cl",&cptr);
  1792. X        tc_curleft          = tgetstr("kl",&cptr);
  1793. X        tc_curright         = tgetstr("kr",&cptr);
  1794. X        tc_delchar             = tgetstr("dc",&cptr);
  1795. X        tc_delline          = tgetstr("dl",&cptr);
  1796. X        tc_eeod             = tgetstr("cd",&cptr);
  1797. X        tc_eeol             = tgetstr("ce",&cptr);
  1798. X        tc_inschar             = tgetstr("ic",&cptr);
  1799. X        tc_insline          = tgetstr("al",&cptr);
  1800. X        tc_move             = tgetstr("cm",&cptr);
  1801. X        tc_vbell            = tgetstr("vb",&cptr);
  1802. X        tc_underscore_on    = tgetstr("us",&cptr);
  1803. X        tc_underscore_off   = tgetstr("ue",&cptr);
  1804. X        if(!tc_underscore_on || !tc_underscore_off)
  1805. X        {
  1806. X            tc_underscore_on = tc_standout;
  1807. X            tc_underscore_off = tc_standend;
  1808. X        }
  1809. X        tc_bold_on          = tc_standout;            /* for now */
  1810. X        tc_bold_off         = tc_standend;            /* for now */
  1811. X        if(!tc_bold_on || !tc_bold_off)
  1812. X        {
  1813. X            tc_bold_on = tc_standout;
  1814. X            tc_bold_off = tc_standend;
  1815. X        }
  1816. X        tc_blink_on         = tgetstr("mb",&cptr);    /* "XENIX extension" */
  1817. X        tc_blink_off        = tgetstr("me",&cptr);    /* "XENIX extension" */
  1818. X        if(!*tc_clear || !*tc_move)
  1819. X        {
  1820. X            fprintf(stderr,"Terminal type '%s' does not have the beef.\r\n",
  1821. X                ttype);
  1822. X            fprintf(stderr,"Try again with a screen-oriented terminal.\n");
  1823. X            termecu(TERMECU_CURSES_ERROR);
  1824. X        }
  1825. X        return;
  1826. X    }
  1827. X
  1828. X
  1829. X    fprintf(stderr,"Cannot find terminal type '%s' or entry in error\r\n",
  1830. X        ttype);
  1831. X    termecu(TERMECU_CURSES_ERROR);
  1832. X
  1833. X}    /* end of tcap_init */
  1834. X
  1835. X/*+-------------------------------------------------------------------------
  1836. X    tcap_putc(character) - utility rotuine for tputs
  1837. X--------------------------------------------------------------------------*/
  1838. Xvoid
  1839. Xtcap_putc(character)
  1840. Xchar character;
  1841. X{
  1842. X    rcvrdisp(&character,1);
  1843. X}    /* end of tcap_putc */
  1844. X
  1845. X/*+-------------------------------------------------------------------------
  1846. X    tcap_horiz_rule(count) - horizontal rule starting at current position
  1847. X--------------------------------------------------------------------------*/
  1848. Xvoid
  1849. Xtcap_horiz_rule(count)
  1850. Xregister count;
  1851. X{
  1852. X    while(count--)
  1853. X        tcap_putc(sHR);
  1854. X    rcvrdisp_actual2();
  1855. X}    /* end of tcap_horiz_rule */
  1856. X
  1857. X/*+-------------------------------------------------------------------------
  1858. X    tcap_vertical_rule(y,x,count) - vertical rule starting at y,x
  1859. X--------------------------------------------------------------------------*/
  1860. Xvoid
  1861. Xtcap_vertical_rule(y,x,count)
  1862. Xint y;
  1863. Xregister x;
  1864. Xregister count;
  1865. X{
  1866. X
  1867. X    while(count--)
  1868. X    {
  1869. X        tcap_cursor(y++,x);
  1870. X        tcap_putc(sVR);
  1871. X    }
  1872. X    rcvrdisp_actual2();
  1873. X        
  1874. X}    /* end of tcap_vertical_rule */
  1875. X
  1876. X/*+-------------------------------------------------------------------------
  1877. X    tcap_draw_box_primitive(y,x,height,width) - ruled box
  1878. X--------------------------------------------------------------------------*/
  1879. Xvoid
  1880. Xtcap_draw_box_primitive(y,x,height,width)
  1881. Xregister y;
  1882. Xint x;
  1883. Xint height;
  1884. Xint width;
  1885. X{
  1886. X    register i;
  1887. X
  1888. X    tcap_cursor(y,x);
  1889. X    tcap_putc(sTL);
  1890. X    if((i = width - 2) > 0)
  1891. X        tcap_horiz_rule(i);
  1892. X    tcap_putc(sTR);
  1893. X    if((i = height - 2) > 0)
  1894. X    {
  1895. X        tcap_vertical_rule(y + 1,x + width - 1,i);
  1896. X        tcap_vertical_rule(y + 1,x,i);
  1897. X    }
  1898. X    tcap_cursor(y + height - 1,x);
  1899. X    tcap_putc(sBL);
  1900. X    if((i = width - 2) > 0)
  1901. X        tcap_horiz_rule(i);
  1902. X    tcap_putc(sBR);
  1903. X    rcvrdisp_actual2();
  1904. X
  1905. X}    /* end of tcap_draw_box_primitive */
  1906. X
  1907. X/*+-------------------------------------------------------------------------
  1908. X    tcap_draw_box(y,x,height,width,title,title_x)
  1909. X--------------------------------------------------------------------------*/
  1910. Xvoid
  1911. Xtcap_draw_box(y,x,height,width,title,title_x)
  1912. Xint y;
  1913. Xint x;
  1914. Xint height;
  1915. Xint width;
  1916. Xchar *title;
  1917. Xint title_x;
  1918. X{
  1919. X    register stand = (title_x < 0);
  1920. X
  1921. X    if(stand)
  1922. X        title_x = -title_x;
  1923. X
  1924. X    tcap_draw_box_primitive(y,x,height,width);
  1925. X    tcap_cursor(y,x + title_x);
  1926. X    tcap_putc('[');
  1927. X    if(stand)
  1928. X        tcap_stand_out();
  1929. X    ff(se," %s ",title);
  1930. X    if(stand)
  1931. X        tcap_stand_end();
  1932. X    tcap_putc(']');
  1933. X    rcvrdisp_actual2();
  1934. X
  1935. X}    /* end of tcap_draw_box */
  1936. X
  1937. X/*+-------------------------------------------------------------------------
  1938. X    tcap_cursor(y,x)
  1939. X--------------------------------------------------------------------------*/
  1940. Xvoid
  1941. Xtcap_cursor(y,x)
  1942. Xuint y;
  1943. Xuint x;
  1944. X{
  1945. X    if(y >= tcap_LINES)
  1946. X        y = tcap_LINES - 1;
  1947. X    if(x >= tcap_COLS)
  1948. X        x = tcap_COLS - 1;
  1949. X    tputs(tgoto(tc_move,x,y),1,tcap_putc);
  1950. X    rcvrdisp_actual2();
  1951. X
  1952. X}    /* end of tcap_cursor */
  1953. X
  1954. X/*+-------------------------------------------------------------------------
  1955. X    tcap_curleft(count) - move cursor left
  1956. X--------------------------------------------------------------------------*/
  1957. Xvoid
  1958. Xtcap_curleft(count)
  1959. Xregister count;
  1960. X{
  1961. X    while(count--)
  1962. X        tputs(tc_curleft);
  1963. X    rcvrdisp_actual2();
  1964. X}    /* end of tcap_curleft */
  1965. X
  1966. X/*+-------------------------------------------------------------------------
  1967. X    tcap_curright(count) - move cursor right
  1968. X--------------------------------------------------------------------------*/
  1969. Xvoid
  1970. Xtcap_curright(count)
  1971. Xregister count;
  1972. X{
  1973. X    while(count--)
  1974. X        tputs(tc_curright);
  1975. X    rcvrdisp_actual2();
  1976. X}    /* end of tcap_curright */
  1977. X
  1978. X/*+-------------------------------------------------------------------------
  1979. X    tcap_curbotleft()
  1980. X--------------------------------------------------------------------------*/
  1981. Xvoid
  1982. Xtcap_curbotleft()
  1983. X{
  1984. X    tcap_cursor(tcap_LINES - 1,0);
  1985. X}    /* end of tcap_curbotleft */
  1986. X
  1987. X/*+-------------------------------------------------------------------------
  1988. X    tcap_insert_lines(count)
  1989. X--------------------------------------------------------------------------*/
  1990. Xvoid
  1991. Xtcap_insert_lines(count)
  1992. Xregister count;
  1993. X{
  1994. X    if(count && *tc_insline)
  1995. X    {
  1996. X        while(count--)
  1997. X            tputs(tc_insline,1,tcap_putc);
  1998. X        rcvrdisp_actual2();
  1999. X    }
  2000. X}    /* end of tcap_insert_lines */
  2001. X
  2002. X/*+-------------------------------------------------------------------------
  2003. X    tcap_delete_lines(count)
  2004. X--------------------------------------------------------------------------*/
  2005. Xvoid
  2006. Xtcap_delete_lines(count)
  2007. Xregister count;
  2008. X{
  2009. X    if(count && *tc_delline)
  2010. X    {
  2011. X        while(count--)
  2012. X            tputs(tc_delline,1,tcap_putc);
  2013. X        rcvrdisp_actual2();
  2014. X    }
  2015. X}    /* end of tcap_delete_lines */
  2016. X
  2017. X/*+-------------------------------------------------------------------------
  2018. X    tcap_insert_chars(count)
  2019. X--------------------------------------------------------------------------*/
  2020. Xvoid
  2021. Xtcap_insert_chars(count)
  2022. Xregister count;
  2023. X{
  2024. X    if(count && *tc_inschar)
  2025. X    {
  2026. X        while(count--)
  2027. X            tputs(tc_inschar,1,tcap_putc);
  2028. X        rcvrdisp_actual2();
  2029. X    }
  2030. X}    /* end of tcap_insert_chars */
  2031. X
  2032. X/*+-------------------------------------------------------------------------
  2033. X    tcap_delete_chars(count)
  2034. X--------------------------------------------------------------------------*/
  2035. Xvoid
  2036. Xtcap_delete_chars(count)
  2037. Xregister count;
  2038. X{
  2039. X    if(count && *tc_delchar)
  2040. X    {
  2041. X        while(count--)
  2042. X            tputs(tc_delchar,1,tcap_putc);
  2043. X        rcvrdisp_actual2();
  2044. X    }
  2045. X}    /* end of tcap_delete_chars */
  2046. X
  2047. X/*+-------------------------------------------------------------------------
  2048. X    tcap_vbell() - output visual bell
  2049. X--------------------------------------------------------------------------*/
  2050. Xvoid
  2051. Xtcap_vbell()
  2052. X{
  2053. X    if(*tc_vbell)
  2054. X    {
  2055. X        tputs(tc_vbell,1,tcap_putc);
  2056. X        rcvrdisp_actual2();
  2057. X    }
  2058. X}    /* end of tcap_vbell */
  2059. X
  2060. X/*+-------------------------------------------------------------------------
  2061. X    tcap_clear_screen()
  2062. X--------------------------------------------------------------------------*/
  2063. Xvoid
  2064. Xtcap_clear_screen()
  2065. X{
  2066. X    if(*tc_clear)
  2067. X    {
  2068. X        tputs(tc_clear,1,tcap_putc);
  2069. X        rcvrdisp_actual2();
  2070. X    }
  2071. X}    /* end of tcap_clear_screen */
  2072. X
  2073. X/*+-------------------------------------------------------------------------
  2074. X    tcap_eeol() - erase to end of line
  2075. X--------------------------------------------------------------------------*/
  2076. Xvoid
  2077. Xtcap_eeol()
  2078. X{
  2079. X    if(*tc_eeol)
  2080. X    {
  2081. X        tputs(tc_eeol,1,tcap_putc);
  2082. X        rcvrdisp_actual2();
  2083. X    }
  2084. X}    /* end of tcap_eeol */
  2085. X
  2086. X/*+-------------------------------------------------------------------------
  2087. X    tcap_eeod() - erase to end of display
  2088. X--------------------------------------------------------------------------*/
  2089. Xvoid
  2090. Xtcap_eeod()
  2091. X{
  2092. X    if(*tc_eeod)
  2093. X    {
  2094. X        tputs(tc_eeod,1,tcap_putc);
  2095. X        rcvrdisp_actual2();
  2096. X    }
  2097. X}    /* end of tcap_eeod */
  2098. X
  2099. X/*+-------------------------------------------------------------------------
  2100. X    tcap_stand_out()
  2101. X--------------------------------------------------------------------------*/
  2102. Xvoid
  2103. Xtcap_stand_out()
  2104. X{
  2105. X    if(*tc_standout) /*  && (tc_standout_width == 0)) */
  2106. X    {
  2107. X        tputs(tc_standout,1,tcap_putc);
  2108. X        rcvrdisp_actual2();
  2109. X    }
  2110. X}    /* end of tcap_stand_out */
  2111. X
  2112. X/*+-------------------------------------------------------------------------
  2113. X    tcap_stand_end()
  2114. X--------------------------------------------------------------------------*/
  2115. Xvoid
  2116. Xtcap_stand_end()
  2117. X{
  2118. X    if(*tc_standend) /* && (tc_standout_width == 0)) */
  2119. X    {
  2120. X        tputs(tc_standend,1,tcap_putc);
  2121. X        rcvrdisp_actual2();
  2122. X    }
  2123. X}    /* end of tcap_stand_end */
  2124. X
  2125. X/*+-------------------------------------------------------------------------
  2126. X    tcap_bold_on()
  2127. X--------------------------------------------------------------------------*/
  2128. Xvoid
  2129. Xtcap_bold_on()
  2130. X{
  2131. X    if(*tc_bold_on)
  2132. X        tputs(tc_bold_on,1,tcap_putc);
  2133. X    else if(*tc_standout) /*  && (tc_standout_width == 0)) */
  2134. X        tputs(tc_standout,1,tcap_putc);
  2135. X    rcvrdisp_actual2();
  2136. X}    /* end of tcap_bold_on */
  2137. X
  2138. X/*+-------------------------------------------------------------------------
  2139. X    tcap_bold_off()
  2140. X--------------------------------------------------------------------------*/
  2141. SHAR_EOF
  2142. true || echo 'restore of ecutcap.c failed'
  2143. fi
  2144. echo 'End of ecu320 part 12'
  2145. echo 'File ecutcap.c is continued in part 13'
  2146. echo 13 > _shar_seq_.tmp
  2147. exit 0
  2148.  
  2149. exit 0 # Just in case...
  2150.