home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / misc / volume32 / ecu / part12 < prev    next >
Encoding:
Text File  |  1992-09-13  |  56.9 KB  |  2,144 lines

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