home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume16 / ecu3 / part04 < prev    next >
Internet Message Format  |  1991-01-06  |  45KB

  1. From: wht@n4hgf.uucp (Warren Tucker)
  2. Newsgroups: comp.sources.misc
  3. Subject: v16i028:  ECU async comm package rev 3.0, Part04/35
  4. Message-ID: <1991Jan6.051802.27400@sparky.IMD.Sterling.COM>
  5. Date: 6 Jan 91 05:18:02 GMT
  6. Approved: kent@sparky.imd.sterling.com
  7. X-Checksum-Snefru: de87427e 4a18c6c8 95c018a3 406a9fc6
  8.  
  9. Submitted-by: wht@n4hgf.uucp (Warren Tucker)
  10. Posting-number: Volume 16, Issue 28
  11. Archive-name: ecu3/part04
  12.  
  13. ---- Cut Here and feed the following to sh ----
  14. #!/bin/sh
  15. # This is part 04 of ecu3
  16. if touch 2>&1 | fgrep 'amc' > /dev/null
  17.  then TOUCH=touch
  18.  else TOUCH=true
  19. fi
  20. # ============= ecuicmhelp.c ==============
  21. echo 'x - extracting ecuicmhelp.c (Text)'
  22. sed 's/^X//' << 'SHAR_EOF' > 'ecuicmhelp.c' &&
  23. X/*+-------------------------------------------------------------------------
  24. X    ecuicmhelp.c -- help for icmd commands
  25. X    wht@n4hgf.Mt-Park.GA.US
  26. X
  27. X  Defined functions:
  28. X    calculate_help_right_column()
  29. X    display_help_screen()
  30. X    display_help_stderr(cmd)
  31. X    help_cmd_line_setup(prompt)
  32. X    help_get_cmd()
  33. X    icmd_help(narg,arg)
  34. X    search_cmd_list_pcmd(cmd)
  35. X    show_cmds()
  36. X
  37. X--------------------------------------------------------------------------*/
  38. X/*+:EDITS:*/
  39. X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  40. X
  41. X#include <curses.h>
  42. X#define OMIT_TERMIO_REFERENCES
  43. X#define STDIO_H_INCLUDED
  44. X#include "ecu.h"
  45. X#define NEED_P_CMD
  46. X#include "ecucmd.h"
  47. X#include "ecukey.h"
  48. X#include "pc_scr.h"
  49. X
  50. X#include "stdio_lint.h"
  51. X
  52. X#define PDAT    "ecuhelp.data"
  53. X
  54. Xextern int rcvr_pid;
  55. X
  56. Xlong start_pos[TOKEN_QUAN];
  57. Xint start_pos_has_been_read = 0;
  58. Xchar help_filename[256] = "";
  59. XFILE *fpdat;        /* help data file */
  60. Xint help_right_column = 0;    /* right column for show_cmds */
  61. Xint help_longest_cmd = 0;
  62. Xint help_longest_descr = 0;
  63. X
  64. X/*+-------------------------------------------------------------------------
  65. X    search_cmd_list_pcmd(cmd)
  66. X--------------------------------------------------------------------------*/
  67. XP_CMD *
  68. Xsearch_cmd_list_pcmd(cmd)
  69. Xregister char *cmd;
  70. X{
  71. Xregister P_CMD *cmd_list = icmd_cmds;
  72. X
  73. X    while(cmd_list->token != -1)
  74. X    {
  75. X        if(minunique(cmd_list->cmd,cmd,cmd_list->min))
  76. X            break;
  77. X        cmd_list++;
  78. X    }
  79. X    if(cmd_list->token == -1)
  80. X        return((P_CMD *)0);
  81. X    else
  82. X        return(cmd_list);
  83. X
  84. X}    /* end of search_cmd_list_pcmd */
  85. X
  86. X/*+-------------------------------------------------------------------------
  87. X    display_help_stderr(cmd)
  88. X--------------------------------------------------------------------------*/
  89. Xvoid
  90. Xdisplay_help_stderr(cmd)
  91. Xchar *cmd;
  92. X{
  93. Xregister itmp;
  94. XP_CMD *pcmd;
  95. Xchar buf[128];
  96. X
  97. X    if(! (pcmd = search_cmd_list_pcmd(cmd)))
  98. X    {
  99. X        ff(se,"'%s' is not a valid command\r\n",cmd);
  100. X        return;
  101. X    }
  102. X
  103. X    if(!start_pos[pcmd->token])
  104. X    {
  105. X        ff(se,"no help available for '%s'\r\n",cmd);
  106. X        return;
  107. X    }
  108. X
  109. X    fseek(fpdat,start_pos[pcmd->token],0);
  110. X    ff(se,"\r\n");
  111. X    while(fgets(buf,sizeof(buf),fpdat) != NULL)
  112. X    {
  113. X        itmp = strlen(buf);
  114. X        buf[--itmp] = 0;
  115. X        if(itmp == 0)
  116. X            break;
  117. X        ff(se,"%s\r\n",buf);
  118. X    }
  119. X
  120. X}    /* end of display_help_stderr */
  121. X
  122. X/*+-------------------------------------------------------------------------
  123. X    calculate_help_right_column()
  124. X--------------------------------------------------------------------------*/
  125. Xvoid
  126. Xcalculate_help_right_column()
  127. X{
  128. Xregister itmp;
  129. Xregister P_CMD *pcmd = icmd_cmds;
  130. X
  131. X    if(help_right_column)    /* already bee thru here? */
  132. X        return;                /* ... seems so */
  133. X
  134. X    while(pcmd->token != -1)
  135. X    {
  136. X        if(!*pcmd->descr)
  137. X        {
  138. X            pcmd++;
  139. X            continue;
  140. X        }
  141. X        itmp = strlen(pcmd->cmd);
  142. X        if(itmp > help_longest_cmd)
  143. X            help_longest_cmd = itmp;
  144. X        itmp = strlen(pcmd->descr);
  145. X        if(itmp > help_longest_descr)
  146. X            help_longest_descr = itmp;
  147. X        pcmd++;
  148. X    }
  149. X    help_right_column = 1 + help_longest_cmd + 2 + help_longest_descr + 3;
  150. X
  151. X}    /* end of calculate_help_right_column */
  152. X
  153. X/*+-------------------------------------------------------------------------
  154. X    help_cmd_line_setup(prompt)
  155. X--------------------------------------------------------------------------*/
  156. Xvoid
  157. Xhelp_cmd_line_setup(prompt)
  158. Xchar *prompt;
  159. X{
  160. Xregister icol;
  161. Xint y;
  162. Xint x;
  163. X
  164. X    wmove(stdscr,LINES - 1,0);
  165. X    wstandout(stdscr);
  166. X    waddch(stdscr,' ');
  167. X    waddch(stdscr,' ');
  168. X    waddstr(stdscr,prompt);
  169. X    getyx(stdscr,y,x);
  170. X    for(icol = x; icol < COLS-1; icol++)
  171. X        waddch(stdscr,' ');
  172. X    wmove(stdscr,y,x);
  173. X    wstandend(stdscr);
  174. X    wrefresh(stdscr);
  175. X}    /* end of help_cmd_line_setup */
  176. X
  177. X/*+-------------------------------------------------------------------------
  178. X    char *help_get_cmd()
  179. X--------------------------------------------------------------------------*/
  180. Xchar *
  181. Xhelp_get_cmd()
  182. X{
  183. Xregister y;
  184. Xregister x;
  185. Xstatic char cmd[15];
  186. Xchar delim;
  187. X
  188. X    help_cmd_line_setup("Enter command name (ESC to quit):  ");
  189. X    wstandout(stdscr);
  190. X    getyx(stdscr,y,x);
  191. X    wingets(stdscr,y,x,cmd,sizeof(cmd) - 1,&delim,0);
  192. X    wstandend(stdscr);
  193. X    if((delim == ESC) || (cmd[0] == 0))
  194. X        return((char *)0);
  195. X    else
  196. X        return(cmd);
  197. X}    /* end of help_get_cmd */
  198. X
  199. X/*+-------------------------------------------------------------------------
  200. X    display_help_screen()
  201. Xget user command section choice and display that group of commands
  202. X--------------------------------------------------------------------------*/
  203. Xint
  204. Xdisplay_help_screen()
  205. X{
  206. Xregister itmp;
  207. Xregister P_CMD *pcmd;
  208. Xregister y = 1;
  209. Xregister x = 0;
  210. Xshort cmdclass;
  211. Xchar s80[80];
  212. Xchar **cpptr;
  213. Xstatic char *list[] =
  214. X{
  215. X    "g   - general commands",
  216. X    "c   - communications-related commands",
  217. X    "t   - transfer-related commands",
  218. X    "p   - procedure-related commands",
  219. X    "Esc - exit help",
  220. X    (char *)0
  221. X};
  222. Xstatic char keylist[] = {'g','c','t','p',ESC,0};
  223. X
  224. X
  225. X    wclear(stdscr);
  226. X    wmove(stdscr,0,0);
  227. X    wstandout(stdscr);
  228. X    waddstr(stdscr,"Interactive Command Help");
  229. X    getyx(stdscr,y,x);
  230. X    for(itmp = x; itmp < COLS-1; itmp++)
  231. X        waddch(stdscr,' ');
  232. X    wstandend(stdscr);
  233. X
  234. X    itmp = 6;
  235. X    cpptr = list;
  236. X    while(*cpptr)
  237. X    {
  238. X        wmove(stdscr,itmp++,4);
  239. X        waddstr(stdscr,*cpptr++);
  240. X    }
  241. X    wmove(stdscr,19,4);
  242. X    waddstr(stdscr,"---- press a key -------");
  243. X    switch(winget_single(stdscr,"",keylist) & 0x7F)
  244. X    {
  245. X        case 'g': cmdclass = ccG; break;
  246. X        case 'c': cmdclass = ccC; break;
  247. X        case 't': cmdclass = ccT; break;
  248. X        case 'p': cmdclass = ccP; break;
  249. X        case ESC: return(1); /* <=================== */
  250. X    }
  251. X
  252. X    pcmd = icmd_cmds;
  253. X    y = 1;
  254. X    x = 0;
  255. X    wmove(stdscr,y,x);
  256. X    wclrtobot(stdscr);
  257. X    while(pcmd->token != -1)
  258. X    {
  259. X        if(!*pcmd->descr || (pcmd->cmdclass != cmdclass))
  260. X        {
  261. X            pcmd++;
  262. X            continue;
  263. X        }
  264. X        wmove(stdscr,y,x);
  265. X        strcpy(s80,pcmd->cmd);
  266. X        pad_zstr_to_len(s80,help_longest_cmd + 2);
  267. X        for(itmp = 0; itmp < pcmd->min; itmp++)
  268. X            s80[itmp] = to_upper(s80[itmp]);
  269. X        waddstr(stdscr,s80);
  270. X
  271. X        strcpy(s80,pcmd->descr);
  272. X        pad_zstr_to_len(s80,help_longest_descr + 1);
  273. X        waddstr(stdscr,s80);
  274. X
  275. X        if(!x)
  276. X            waddch(stdscr,(unsigned)sVR);
  277. X        y++;
  278. X        if(y >= LINES - 2)
  279. X        {
  280. X            y = 1;
  281. X            x = help_right_column;
  282. X        }
  283. X        pcmd++;
  284. X    }
  285. X    wmove(stdscr,LINES - 2,0);
  286. X    wstandout(stdscr);
  287. X    waddstr(stdscr,
  288. X"Capitalized portion of listed command sufficient for command recognition");
  289. X    getyx(stdscr,y,x);
  290. X    for(itmp = x; itmp < COLS-1; itmp++)
  291. X        waddch(stdscr,' ');
  292. X    wstandend(stdscr);
  293. X    return(0);
  294. X
  295. X}    /* end of display_help_screen */
  296. X
  297. X/*+-------------------------------------------------------------------------
  298. X    show_cmds()
  299. Xcommands with null descriptions are "undocumented"
  300. X--------------------------------------------------------------------------*/
  301. Xvoid
  302. Xshow_cmds()
  303. X{
  304. Xregister char *cptr;
  305. Xint rcvr_active = (rcvr_pid > 0) || (rcvr_pid == -2);
  306. X
  307. X    if(rcvr_active && (rcvr_pid != -2))
  308. X        kill_rcvr_process(SIGUSR1);
  309. X
  310. X    calculate_help_right_column();
  311. X    windows_start();
  312. X    scrollok(stdscr,0);
  313. X    if(!display_help_screen())
  314. X    {
  315. X        while(cptr = help_get_cmd())
  316. X        {
  317. X            wmove(stdscr,LINES - 1,0);
  318. X            wclrtoeol(stdscr);
  319. X            wrefresh(stdscr);
  320. X            display_help_stderr(cptr);
  321. X            ff(se,"\r\npress return:  ");
  322. X            ttygetc(1);
  323. X            if(display_help_screen())
  324. X                break;
  325. X        }
  326. X    }
  327. X    windows_end(stdscr);
  328. X    redisplay_rcvr_screen();
  329. X    if(rcvr_active)
  330. X        start_rcvr_process(0);
  331. X
  332. X}    /* end of show_cmds */
  333. X
  334. X/*+-------------------------------------------------------------------------
  335. X    icmd_help(narg,arg)
  336. X--------------------------------------------------------------------------*/
  337. Xvoid
  338. Xicmd_help(narg,arg)
  339. Xint narg;
  340. Xchar **arg;
  341. X{
  342. Xregister char *cptr;
  343. Xchar s128[128];
  344. Xchar *getenv();
  345. X
  346. X    ff(se,"\r\n");
  347. X    if(!help_filename[0])
  348. X    {
  349. X        if((cptr = getenv("ECUHELP")) == NULL)
  350. X            sprintf(help_filename,"%s/%s",ECULIBDIR,PDAT);
  351. X        else
  352. X            strcpy(help_filename,cptr);
  353. X    }
  354. X
  355. X    if((fpdat = fopen(help_filename,"r")) == NULL)
  356. X    {
  357. X        perror(help_filename); fputc('\r',se);
  358. X        return;
  359. X    }
  360. X
  361. X    if(!start_pos_has_been_read)
  362. X    {
  363. X        fread((char *)start_pos,sizeof(long),TOKEN_QUAN,fpdat);
  364. X        start_pos_has_been_read = 1;
  365. X    }
  366. X
  367. X    if(narg > 1)
  368. X        display_help_stderr(arg[1]);
  369. X    else
  370. X        show_cmds();
  371. X
  372. X    fclose(fpdat);
  373. X}    /* end of icmd_help */
  374. X
  375. X/* vi: set tabstop=4 shiftwidth=4: */
  376. SHAR_EOF
  377. $TOUCH -am 1224222990 'ecuicmhelp.c' &&
  378. chmod 0644 ecuicmhelp.c ||
  379. echo 'restore of ecuicmhelp.c failed'
  380. Wc_c="`wc -c < 'ecuicmhelp.c'`"
  381. test 7848 -eq "$Wc_c" ||
  382.     echo 'ecuicmhelp.c: original size 7848, current size' "$Wc_c"
  383. # ============= ecuicmhist.c ==============
  384. echo 'x - extracting ecuicmhist.c (Text)'
  385. sed 's/^X//' << 'SHAR_EOF' > 'ecuicmhist.c' &&
  386. X/*+-------------------------------------------------------------------------
  387. X    ecuicmhist.c - ECU interactive command history handler
  388. X    wht@n4hgf.Mt-Park.GA.US
  389. X
  390. X  Defined functions:
  391. X    icmd_history_add(icmd_buf)
  392. X    icmd_history_manager(func,newicmd,icmdsize)
  393. X
  394. X--------------------------------------------------------------------------*/
  395. X/*+:EDITS:*/
  396. X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  397. X
  398. X#include <curses.h>
  399. X#include "pc_scr.h"
  400. X
  401. X#define STDIO_H_INCLUDED
  402. X#define OMIT_TERMIO_REFERENCES
  403. X#include "ecu.h"
  404. X
  405. X#include "ecukey.h"
  406. X#include "ecuxkey.h"
  407. X
  408. Xchar *strdup();
  409. X
  410. X#ifdef WHT
  411. X#define ICMDH_MAXCNT    100
  412. X#else
  413. X#define ICMDH_MAXCNT    50
  414. X#endif
  415. X#define ICMDH_MAXLEN    72
  416. X
  417. Xtypedef struct icmd_hist
  418. X{
  419. X    struct icmd_hist *prev;
  420. X    struct icmd_hist *next;
  421. X    uchar *icmd;
  422. X} ICMDH;
  423. X
  424. XICMDH *icmdh_head = (ICMDH *)0;
  425. XICMDH *icmdh_tail = (ICMDH *)0;
  426. Xint icmdh_count = 0;
  427. X
  428. X/*+-------------------------------------------------------------------------
  429. X    icmd_history_add(icmd_buf)
  430. X--------------------------------------------------------------------------*/
  431. Xvoid
  432. Xicmd_history_add(icmd_buf)
  433. Xchar *icmd_buf;
  434. X{
  435. XICMDH *icmdh = (ICMDH *)malloc(sizeof(ICMDH));
  436. Xchar *strdup();
  437. X
  438. X    if(!icmdh)
  439. X        return;
  440. X    if(!(icmdh->icmd = strdup(icmd_buf)))
  441. X    {
  442. X        free((char *)icmdh);
  443. X        return;
  444. X    }
  445. X    if(strlen(icmdh->icmd) > ICMDH_MAXLEN)
  446. X        icmdh->icmd[ICMDH_MAXLEN] = 0;
  447. X    if(icmdh_tail)
  448. X    {
  449. X        icmdh_tail->next = icmdh;
  450. X        icmdh->prev = icmdh_tail;
  451. X        icmdh->next = (ICMDH *)0;
  452. X        icmdh_tail = icmdh;
  453. X    }
  454. X    else
  455. X    {
  456. X        icmdh->prev = (ICMDH *)0;
  457. X        icmdh->next = (ICMDH *)0;
  458. X        icmdh_head = icmdh;
  459. X        icmdh_tail = icmdh;
  460. X    }
  461. X    if(++icmdh_count > ICMDH_MAXCNT)
  462. X    {
  463. X        icmdh = icmdh_head;
  464. X        icmdh_head = icmdh->next;
  465. X        icmdh_head->prev = (ICMDH *)0;
  466. X        free(icmdh->icmd);
  467. X        free((char *)icmdh);
  468. X        icmdh_count--;
  469. X    }
  470. X        
  471. X}    /* end of icmd_history_add */
  472. X
  473. X/*+-------------------------------------------------------------------------
  474. X    icmd_history_manager(func,newicmd,icmdsize) - entered by Home Xkey
  475. X
  476. Xreturn new icmd string to execute
  477. Xreturns 0 if ok to exce new cmd, else 1 if not
  478. X(returns 0 if null or ESC, so caller can handle exit condition)
  479. X--------------------------------------------------------------------------*/
  480. Xint
  481. Xicmd_history_manager(func,newicmd,icmdsize)
  482. Xuchar func;
  483. Xuchar *newicmd;
  484. Xint icmdsize;
  485. X{
  486. Xregister itmp;
  487. Xregister ICMDH *icmdh = icmdh_tail;
  488. X
  489. X    if((func != XFcurup) && (func != XFhome))
  490. X    {
  491. X        ring_bell();
  492. X        return(1);
  493. X    }
  494. X
  495. X    if(!icmdh)
  496. X    {
  497. X        ff(se,"no interactive commands saved\r\n");
  498. X        return(1);
  499. X    }
  500. X    while(1)
  501. X    {
  502. X        strncpy(newicmd,icmdh->icmd,icmdsize - 1);
  503. X        *(newicmd + icmdsize - 1) = 0;
  504. X
  505. X        ttygets(newicmd,icmdsize,4+2);
  506. X        switch(*newicmd)
  507. X        {
  508. X        case ESC:
  509. X        case 0:
  510. X            return(0);
  511. X        case XFhome:
  512. X            icmdh = icmdh_head;
  513. X            *newicmd = 0;
  514. X            break;
  515. X        case XFend:
  516. X            icmdh = icmdh_tail;
  517. X            *newicmd = 0;
  518. X            break;
  519. X        case XFpgup:
  520. X        case XFpgdn:
  521. X            ring_bell();
  522. X            *newicmd = 0;
  523. X            break;
  524. X        case XFcurup:
  525. X            if(icmdh->prev)
  526. X                icmdh = icmdh->prev;
  527. X            *newicmd = 0;
  528. X            break;
  529. X        case XFcurdn:
  530. X            if(icmdh->next)
  531. X                icmdh = icmdh->next;
  532. X            *newicmd = 0;
  533. X            break;
  534. X        default:
  535. X            return(0);
  536. X        }
  537. X
  538. X        itmp = strlen(newicmd);
  539. X        while(itmp--)
  540. X            fputc(BS,se);
  541. X        itmp = strlen(newicmd);
  542. X        while(itmp--)
  543. X            fputc(' ',se);
  544. X        itmp = strlen(newicmd);
  545. X        while(itmp--)
  546. X            fputc(BS,se);
  547. X    }
  548. X}    /* end of icmd_history_manager */
  549. X
  550. X/* vi: set tabstop=4 shiftwidth=4: */
  551. X/* end of ecuicmhist.c */
  552. SHAR_EOF
  553. $TOUCH -am 1224222990 'ecuicmhist.c' &&
  554. chmod 0644 ecuicmhist.c ||
  555. echo 'restore of ecuicmhist.c failed'
  556. Wc_c="`wc -c < 'ecuicmhist.c'`"
  557. test 3336 -eq "$Wc_c" ||
  558.     echo 'ecuicmhist.c: original size 3336, current size' "$Wc_c"
  559. # ============= eculine.c ==============
  560. echo 'x - extracting eculine.c (Text)'
  561. sed 's/^X//' << 'SHAR_EOF' > 'eculine.c' &&
  562. X/*+-----------------------------------------------------------------------
  563. X    eculine.c -- ECU line handler
  564. X wht@n4hgf.Mt-Park.GA.US
  565. X
  566. X  Defined functions:
  567. X    lRTSCTS_control(flag)
  568. X    lbreak()
  569. X    lclear_xmtr_xoff()
  570. X    lclose()
  571. X    ldraino(inflush_flag)
  572. X    lflush(flush_type)
  573. X    lget_xon_xoff(ixon,ixoff)
  574. X    lgetc_timeout(msec)
  575. X    lgetc_xmtr()
  576. X    lgets_timeout(lrwt)
  577. X    llookfor(lookfor,msecs,echo_flag)
  578. X    lnew_baud_rate(new_baud)
  579. X    lopen()
  580. X    lopen_err_text(lerr)
  581. X    lputc(lchar)
  582. X    lputc_paced(pace_msec,lchar)
  583. X    lputs(string)
  584. X    lputs_paced(pace_msec,string)
  585. X    lquiet(msecs,echo_flag)
  586. X    lrdchk_xmtr()
  587. X    lreset_ksr()
  588. X    lset_baud_rate(ioctl_flag)
  589. X    lset_parity(ioctl_flag)
  590. X    ltoggle_dtr()
  591. X    lxon_xoff(flag)
  592. X    process_xmtr_rcvd_char(rchar,echo)
  593. X    set_xon_xoff_by_arg(arg)
  594. X    valid_baud_rate(baud)
  595. X    xon_status()
  596. X
  597. X------------------------------------------------------------------------*/
  598. X/*+:EDITS:*/
  599. X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  600. X
  601. X#include "ecu.h"
  602. X#include "ecukey.h"
  603. X#include "ecuhangup.h"
  604. X#if !defined(NO_SELECT)
  605. X# include <sys/select.h>
  606. X#endif
  607. X
  608. Xextern int rcvr_pid;
  609. Xextern int errno;
  610. Xextern int lgetc_count;
  611. Xextern int vmin;
  612. Xextern int interrupt;        /* SIGINT flag: see xmtr_SIGINT_handler */
  613. X
  614. Xchar lopen_err_str[64] = "";
  615. X
  616. X#define LPUTS_NAP_COUNT    20    /* with UNIX 3.2.0, nap doesn't work as
  617. X                             * advertized; param MUST be > granularity
  618. X                             * or nap will return immediately
  619. X                             */
  620. X
  621. X/*+-------------------------------------------------------------------------
  622. X    process_xmtr_rcvd_char(rchar,echo) - feed xmtr-rcvd char to rcvr code
  623. X
  624. Xecho: 0 no echo
  625. X      1 echo literally
  626. X      2 "make printable"
  627. X--------------------------------------------------------------------------*/
  628. Xvoid
  629. Xprocess_xmtr_rcvd_char(rchar,echo)
  630. Xuint rchar;
  631. Xregister int echo;
  632. X{
  633. Xextern int rcvr_log;
  634. Xextern FILE *rcvr_log_fp;
  635. Xextern char rcvr_log_file[];    /* if rcvr_log!= 0,log filename */
  636. X
  637. X    if(process_rcvd_char(rchar))
  638. X        return;
  639. X
  640. X    if(echo == 1)
  641. X    {
  642. X        if(rchar == NL)
  643. X            fputc(CR,se);
  644. X        fputc(rchar,se);
  645. X        if(rchar != CR)
  646. X            plogc(rchar);
  647. X    }
  648. X    else if(echo == 2)
  649. X    {
  650. X    char *make_char_graphic();
  651. X        pputs(make_char_graphic(rchar,0));
  652. X        if(rchar == 0x0A)
  653. X            pputs("\n");
  654. X    }
  655. X
  656. X}    /* end of process_xmtr_rcvd_char */
  657. X
  658. X/*+-------------------------------------------------------------------------
  659. X    lgetc_xmtr() -- xmtr version of get char from line
  660. Xalso called by rcvr code when lgetc_buf empty and vmin == 1
  661. X--------------------------------------------------------------------------*/
  662. Xuchar
  663. Xlgetc_xmtr()
  664. X{
  665. Xint itmp;
  666. Xextern int errno;
  667. Xuchar char_rtnd;
  668. X
  669. XREAD_AGAIN:
  670. X    if((itmp = read(shm->Liofd,&char_rtnd,1)) < 1)
  671. X    {
  672. X        if(!itmp)
  673. X        {
  674. X            pperror("lgetc_xmtr: zero length read\n");
  675. X            hangup(HANGUP_LINE_READ_ERROR);
  676. X        }
  677. X        if(errno == EINTR)            /* if signal interrupted, ... */
  678. X        {
  679. X            if(interrupt)
  680. X                return(0);
  681. X            goto READ_AGAIN;
  682. X        }
  683. X        hangup(HANGUP_LINE_READ_ERROR);
  684. X    }
  685. X    shm->rcvd_chars++;
  686. X    shm->rcvd_chars_this_connect++;
  687. X    if(shm->Lparity)
  688. X        char_rtnd &= 0x7F;
  689. X    return(char_rtnd);
  690. X
  691. X}    /* end of lgetc_xmtr */
  692. X
  693. X/*+-------------------------------------------------------------------------
  694. X    lrdchk_xmtr() -- rdchk(shm->Liofd) for xmtr
  695. X--------------------------------------------------------------------------*/
  696. Xint
  697. Xlrdchk_xmtr()
  698. X{
  699. X    return(rdchk(shm->Liofd));
  700. X}    /* end of lrdchk_xmtr */
  701. X
  702. X/*+-------------------------------------------------------------------------
  703. X    char *lgets_timeout(LRWT *) - may be called by xmtr only
  704. X
  705. Xto1 and to2 are unsigned long values in milliseconds (not
  706. Xcurrently supported well under BSD4); to1 is the time to wait
  707. Xfor the first character, to2 the time to wait for subsequent
  708. Xcharacters.
  709. X
  710. Xif raw_flag 0,     non-printables are stripped from beginning
  711. X                   and end of received characters (i.e., modem
  712. X                   response reads); NULs discarded, parity stripped
  713. Xif raw_flag 1,     full raw read buffer returned
  714. X
  715. X0x80 in raw_flag indicates console interrupts should be enabled.
  716. Xif interrupt thus detected, the procedure returns "!Interrupted"
  717. Xwithout reseting variable 'interrupt'
  718. X
  719. Xbuffer is address to read chars into
  720. X
  721. Xbufsize is buffer max size (allowing room for terminating null)
  722. Xwhich should be at least 2 if raw_size includes 0x80 bit,
  723. Xelse at least 12 characters if 0x80 omitted.
  724. X
  725. Xcount is a int which, at return, receives the actual count read
  726. X
  727. X--------------------------------------------------------------------------*/
  728. Xchar *
  729. Xlgets_timeout(lrwt)
  730. XLRWT *lrwt;
  731. X{
  732. X/**********************/
  733. X#if defined(NO_SELECT)
  734. X/**********************/
  735. X
  736. Xregister actual_count = 0;
  737. Xregister char *cptr = lrwt->buffer;
  738. Xregister echo_flag = lrwt->echo;
  739. Xint max_count = lrwt->bufsize;
  740. Xchar *rtn_val;
  741. Xint timeout_counter;
  742. Xint qc1;
  743. Xint qc2;
  744. Xint raw_mode = lrwt->raw_flag & 0x0F;
  745. Xint check_sigint = (lrwt->raw_flag & 0x80);
  746. Xint old_ttymode = get_ttymode();    /* save original tty mode */
  747. Xint delim_len;
  748. Xlong quantum;
  749. Xlong ltmp;
  750. Xlong nap(long);
  751. X
  752. X    delim_len = (lrwt->delim) ? strlen(lrwt->delim) : 0;
  753. X
  754. X    if((shm->Lbaud < 300) && lrwt->to2)
  755. X        if(lrwt->to2 < 300L) lrwt->to2 = 300L;
  756. X    else if((shm->Lbaud < 1200) && lrwt->to2)
  757. X        if(lrwt->to2 < 200L) lrwt->to2 = 100L;
  758. X
  759. X/* shortest interval */
  760. X    ltmp = (lrwt->to1 < lrwt->to2) ? lrwt->to1 : lrwt->to2;
  761. X
  762. X/* calculate wait quantum */
  763. X    quantum = ltmp / 10L;                /* try for ten ticks */
  764. X
  765. X#if defined(M_I386)
  766. X    if(quantum < 40L)
  767. X        quantum = 40L;
  768. X#else
  769. X    if(quantum < 20L)
  770. X        quantum = 20L;
  771. X#endif
  772. X    qc1 = lrwt->to1 / quantum;
  773. X    if(!qc1) qc1 = 1L;
  774. X    qc2 = lrwt->to2 / quantum;
  775. X    if(!qc2) qc2 = 1L;
  776. X
  777. X/* perform the lrtw function using nap() and rdchk()
  778. X   input: qc1 is first nap count (for first charcters) 
  779. X          qc2 is 2nd nap count (for subsequent characters) 
  780. X          quantum is the nap period in milliseconds
  781. X          cptr is char* to receive read string
  782. X          max_count is max number of characters incl null
  783. X          lrwt->raw_flag as described above
  784. X
  785. X  output: lrwt->count is actual count of return result
  786. X          lrwt->buffer is return read buffer
  787. X*/
  788. X    max_count--;                /* leave room for null */
  789. X
  790. X    if(check_sigint)
  791. X        ttymode(2);                /* let console interrupt long timeouts */
  792. X
  793. X    timeout_counter = qc1;        /* first timeout */ 
  794. X    *cptr = 0;                    /* init result string */
  795. X    while(timeout_counter--)
  796. X    {
  797. X        nap(quantum);
  798. X
  799. X        if(check_sigint && interrupt)
  800. X            goto INTERRUPTED;
  801. X
  802. X        while(lrdchk_xmtr())
  803. X        {
  804. X            *cptr = lgetc_xmtr();
  805. X
  806. X            if(check_sigint && interrupt)
  807. X                goto INTERRUPTED;
  808. X
  809. X            if(*cptr == 0)
  810. X                continue;
  811. X
  812. X            process_xmtr_rcvd_char(*cptr,echo_flag);
  813. X
  814. X            if(!raw_mode && (*cptr == CR))
  815. X                    continue;
  816. X
  817. X            *++cptr = 0;
  818. X            if(++actual_count == 1)
  819. X            {
  820. X                if(!lrwt->to2)
  821. X                    break;
  822. X                timeout_counter = qc2;
  823. X            }
  824. X
  825. X            if(--max_count == 0)
  826. X                goto BOTTOM;
  827. X
  828. X            if(delim_len && (actual_count >= delim_len) &&
  829. X                    !strncmp(lrwt->delim,cptr - delim_len,delim_len))
  830. X                goto BOTTOM;
  831. X        }
  832. X    }
  833. X
  834. X/******************************/
  835. X#else /* other than NO_SELECT */
  836. X/******************************/
  837. X/* --- use select --- */
  838. Xregister actual_count = 0;
  839. Xregister char *cptr = lrwt->buffer;
  840. Xregister max_count = lrwt->bufsize;
  841. Xregister raw_mode = lrwt->raw_flag & 0x0F;
  842. Xregister echo_flag = lrwt->echo;
  843. Xint check_sigint = (lrwt->raw_flag & 0x80);
  844. Xint old_ttymode = get_ttymode();    /* save original tty mode */
  845. Xint fdmask;
  846. Xint delim_len;
  847. Xstruct timeval tval;
  848. Xchar *rtn_val;
  849. X
  850. X    delim_len = (lrwt->delim) ? strlen(lrwt->delim) : 0;
  851. X
  852. X    if((shm->Lbaud < 300) && lrwt->to2)
  853. X        if(lrwt->to2 < 300L) lrwt->to2 = 300L;
  854. X    else if((shm->Lbaud < 1200) && lrwt->to2)
  855. X        if(lrwt->to2 < 200L) lrwt->to2 = 100L;
  856. X
  857. X
  858. X/* perform the lrtw function
  859. X
  860. X  output: lrwt->count is actual count of return result
  861. X          lrwt->buffer is return read buffer
  862. X*/
  863. X    max_count--;                /* leave room for null */
  864. X
  865. X    if(check_sigint)
  866. X        ttymode(2);                /* let console interrupt long timeouts */
  867. X
  868. X    *cptr = 0;                    /* init result string */
  869. X    while(1)
  870. X    {
  871. X        if(check_sigint && interrupt)
  872. X            goto INTERRUPTED;
  873. X
  874. X        errno = 0;
  875. X        fdmask = 1 << shm->Liofd;
  876. X        if(actual_count)
  877. X        {
  878. X            tval.tv_sec = lrwt->to2 / 1000L;
  879. X            tval.tv_usec = (lrwt->to2 % 1000L) * 1000L;
  880. X        }
  881. X        else
  882. X        {
  883. X            tval.tv_sec = lrwt->to1 / 1000L;
  884. X            tval.tv_usec = (lrwt->to1 % 1000L) * 1000L;
  885. X        }
  886. X        if(select(32,&fdmask,(int *)0,(int *)0,&tval) != 1)
  887. X        {
  888. X            if(errno == EINTR)
  889. X                continue;
  890. X            break;
  891. X        }
  892. X
  893. X        while(rdchk(shm->Liofd))
  894. X        {
  895. X            *cptr = lgetc_xmtr();
  896. X
  897. X            if(check_sigint && interrupt)
  898. X                goto INTERRUPTED;
  899. X
  900. X            if(*cptr == 0)
  901. X                continue;
  902. X
  903. X            process_xmtr_rcvd_char(*cptr,!!echo_flag);
  904. X
  905. X            if(!raw_mode && (*cptr == CR))
  906. X                    continue;
  907. X
  908. X            *++cptr = 0;
  909. X            actual_count++;
  910. X
  911. X            if(--max_count == 0)
  912. X                goto BOTTOM;
  913. X
  914. X            if(delim_len && (actual_count >= delim_len) &&
  915. X                    !strncmp(lrwt->delim,cptr - delim_len,delim_len))
  916. X                goto BOTTOM;
  917. X        }
  918. X        if(!lrwt->to2)
  919. X            break;
  920. X    }
  921. X
  922. X#endif    /* NO_SELECT */
  923. X
  924. X/********* common post processing for select() / no select() ************/
  925. XBOTTOM:
  926. X    if(check_sigint)
  927. X        ttymode(old_ttymode);
  928. X    if(raw_mode)
  929. X    {
  930. X        lrwt->count = actual_count;
  931. X        return(lrwt->buffer);
  932. X    }
  933. X    cptr = lrwt->buffer;
  934. X    while(((*cptr > 0) && (*cptr < SPACE)) || (*cptr >= DEL))
  935. X        cptr++;
  936. X    rtn_val = cptr;
  937. X    actual_count = 0;
  938. X    while(((*cptr &= 0x7F) >= SPACE) && (*cptr < DEL))
  939. X    {
  940. X        cptr++;
  941. X        actual_count++;
  942. X    }
  943. X    *cptr = 0;
  944. X    strcpy(lrwt->buffer,rtn_val);
  945. X    lrwt->count = actual_count;
  946. X    return(lrwt->buffer);
  947. X
  948. XINTERRUPTED:
  949. X    ttymode(old_ttymode);
  950. X    strcpy(lrwt->buffer,"!Interrupted");
  951. X    lrwt->count = strlen(lrwt->buffer);
  952. X    return((char *)0);
  953. X
  954. X}    /* end of lgets_timeout */
  955. X
  956. X/*+-------------------------------------------------------------------------
  957. X    lgetc_timeout(msec) - may be called by xmtr only
  958. X
  959. X reads one character from line unless msec passes with no receipt.
  960. X return char if received, else -1 if timeout
  961. X--------------------------------------------------------------------------*/
  962. Xint
  963. Xlgetc_timeout(msec)
  964. Xlong msec;
  965. X{
  966. Xuchar rtn_char;
  967. X#if defined(NO_SELECT)
  968. Xlong nap();
  969. Xlong count;
  970. X
  971. XAGAIN:
  972. X    count = msec;
  973. X    while(!lrdchk_xmtr())
  974. X    {
  975. X        if(interrupt)
  976. X            return(-1);
  977. X        if((count -= nap(20L)) <= 0)
  978. X            return(-1);
  979. X    }
  980. X
  981. X#else
  982. X
  983. Xint fdmask;
  984. Xstruct timeval tval;
  985. X
  986. XAGAIN:
  987. X    tval.tv_sec = msec / 1000L;
  988. X    tval.tv_usec = (msec % 1000L) * 1000L;
  989. X    fdmask = 1 << shm->Liofd;
  990. X    if(select(32,&fdmask,(int *)0,(int *)0,&tval) < 1)
  991. X        return(-1);
  992. X    if(!lrdchk_xmtr())
  993. X        return(-1);
  994. X    if(interrupt)
  995. X        return(-1);
  996. X#endif
  997. X
  998. X    rtn_char = lgetc_xmtr();
  999. X    if(!rtn_char)
  1000. X        goto AGAIN;
  1001. X    return(rtn_char);
  1002. X
  1003. X}    /* end of lgetc_timeout */
  1004. X
  1005. X/*+-------------------------------------------------------------------------
  1006. X    llookfor(lookfor,msecs,echo_flag)
  1007. Xreturn 1 if successful, else 0 if no match
  1008. Xecho_flag: 0 no echo
  1009. X           1 echo literally
  1010. X           2 "make printable"
  1011. X--------------------------------------------------------------------------*/
  1012. Xint
  1013. Xllookfor(lookfor,msecs,echo_flag)
  1014. Xchar *lookfor;
  1015. Xulong msecs;
  1016. Xint echo_flag;
  1017. X{
  1018. Xregister lookfor_len = strlen(lookfor);
  1019. Xregister lchar;
  1020. Xchar *lastfew = (char *)malloc(lookfor_len);
  1021. Xint success_flag = 0;
  1022. Xint old_ttymode = get_ttymode();
  1023. X
  1024. X    if(!lastfew)
  1025. X    {
  1026. X        pputs("memory exhausted\n");
  1027. X        return(0);
  1028. X    }
  1029. X
  1030. X    ttymode(2);
  1031. X
  1032. X    memset(lastfew,0,lookfor_len);
  1033. X    while((lchar = lgetc_timeout(msecs)) >= 0)
  1034. X    {
  1035. X        if(!lchar)        /* skip nulls */
  1036. X            continue;
  1037. X        process_xmtr_rcvd_char(lchar,echo_flag);
  1038. X        memcpy(lastfew,lastfew + 1,lookfor_len - 1);
  1039. X        *(lastfew + lookfor_len - 1) = lchar;
  1040. X        if(!strncmp(lastfew,lookfor,lookfor_len))
  1041. X        {
  1042. X            success_flag = 1;
  1043. X            break;
  1044. X        }
  1045. X    }
  1046. X    free(lastfew);
  1047. X    ttymode(old_ttymode);
  1048. X    return(success_flag);
  1049. X}    /* end of llookfor */
  1050. X
  1051. X/*+-------------------------------------------------------------------------
  1052. X    lquiet(msecs,echo_flag)
  1053. X--------------------------------------------------------------------------*/
  1054. Xvoid
  1055. Xlquiet(msecs,echo_flag)
  1056. Xulong msecs;
  1057. Xint echo_flag;
  1058. X{
  1059. Xregister lchar;
  1060. Xint old_ttymode = get_ttymode();
  1061. X
  1062. X    ttymode(2);
  1063. X    while((lchar = lgetc_timeout(msecs)) >= 0)
  1064. X    {
  1065. X        if(interrupt)    /* if interrupt, return */
  1066. X            break;
  1067. X        if(!lchar)        /* skip nulls */
  1068. X            continue;
  1069. X        process_xmtr_rcvd_char(lchar,!!echo_flag);
  1070. X    }
  1071. X    ttymode(old_ttymode);
  1072. X
  1073. X}    /* end of lquiet */
  1074. X
  1075. X/*+-------------------------------------------------------------------------
  1076. X    lflush(flush_type) -- flush line driver input &/or output buffers
  1077. X
  1078. X0 == input buffer
  1079. X1 == output buffer
  1080. X2 == both buffers
  1081. X--------------------------------------------------------------------------*/
  1082. Xvoid
  1083. Xlflush(flush_type)
  1084. Xint flush_type;
  1085. X{
  1086. X    lgetc_count = 0;
  1087. X    switch(flush_type)
  1088. X    {
  1089. X        case 0:
  1090. X            ioctl(TTYIN,TCFLSH,(char *)0); break;
  1091. X        case 1:
  1092. X            ioctl(TTYIN,TCFLSH,(char *)1); break;
  1093. X        case 2:
  1094. X            ioctl(TTYIN,TCFLSH,(char *)2); break;
  1095. X    }
  1096. X}    /* end of lflush */
  1097. X
  1098. X/*+-------------------------------------------------------------------------
  1099. X    lreset_ksr()
  1100. X
  1101. X  This procedure restores the termio for the
  1102. X  comm line to the values in Ltermio
  1103. X--------------------------------------------------------------------------*/
  1104. Xvoid
  1105. Xlreset_ksr()
  1106. X{
  1107. X    ioctl(shm->Liofd,TCSETA,(char *)&Ltermio);
  1108. X
  1109. X}    /* end of lreset_ksr */
  1110. X
  1111. X/*+-------------------------------------------------------------------------
  1112. X    ldraino(inflush_flag) - wait for output to drain
  1113. X
  1114. XIf inflush_flag is set, also flush input after output drains
  1115. X--------------------------------------------------------------------------*/
  1116. Xvoid
  1117. Xldraino(inflush_flag)
  1118. Xint inflush_flag;
  1119. X{
  1120. X    ioctl(shm->Liofd,(inflush_flag) ? TCSETAF : TCSETAW,(char *)&Ltermio);
  1121. X
  1122. X}    /* end of ldraino */
  1123. X
  1124. X/*+-----------------------------------------------------------------------
  1125. X    lputc(lchar) -- write lchar to comm line
  1126. X------------------------------------------------------------------------*/
  1127. Xvoid
  1128. Xlputc(lchar)
  1129. Xchar lchar;
  1130. X{
  1131. X    while(write(shm->Liofd,&lchar,1) < 0)
  1132. X    {
  1133. X        if(errno == EINTR)
  1134. X            continue;
  1135. X        pperror("lputc write error");
  1136. X        hangup(HANGUP_XMTR_WRITE_ERROR);
  1137. X    }
  1138. X    shm->xmit_chars++;
  1139. X    shm->xmit_chars_this_connect++;
  1140. X}    /* end of lputc */
  1141. X
  1142. X/*+-----------------------------------------------------------------------
  1143. X    lputc_paced(pace_msec,lchar) -- write lchar to comm line
  1144. X  with time between each character 
  1145. X------------------------------------------------------------------------*/
  1146. Xvoid
  1147. Xlputc_paced(pace_msec,lchar)
  1148. Xregister pace_msec;
  1149. Xchar lchar;
  1150. X{
  1151. X
  1152. X    lputc(lchar);    
  1153. X    nap((long)(pace_msec ? pace_msec : LPUTS_NAP_COUNT));
  1154. X
  1155. X}    /* end of lputc_paced */
  1156. X
  1157. X/*+-----------------------------------------------------------------------
  1158. X    lputs(string) -- write string to comm line
  1159. X------------------------------------------------------------------------*/
  1160. Xvoid
  1161. Xlputs(string)
  1162. Xregister char *string;
  1163. X{
  1164. X    while(*string)
  1165. X        lputc(*string++);
  1166. X}
  1167. X
  1168. X/*+-----------------------------------------------------------------------
  1169. X    lputs_paced(pace_msec,string) -- write string to comm line
  1170. X  with time between each character 
  1171. X------------------------------------------------------------------------*/
  1172. Xvoid
  1173. Xlputs_paced(pace_msec,string)
  1174. Xregister pace_msec;
  1175. Xregister char *string;
  1176. X{
  1177. X    while(*string)
  1178. X        lputc_paced(pace_msec,*string++);
  1179. X
  1180. X}    /* end of lputs_paced */
  1181. X
  1182. X/*+-------------------------------------------------------------------------
  1183. X    valid_baud_rate(baud) -- returns (positive) baud rate selector
  1184. Xor -1 if invalid baud rate
  1185. X--------------------------------------------------------------------------*/
  1186. Xvalid_baud_rate(baud)
  1187. Xuint baud;
  1188. X{
  1189. X    switch(baud)
  1190. X    {
  1191. X        case 110: return(B110);
  1192. X        case 300: return(B300);
  1193. X        case 600: return(B600);
  1194. X        case 1200: return(B1200);
  1195. X        case 2400: return(B2400);
  1196. X        case 4800: return(B4800);
  1197. X        case 9600: return(B9600);
  1198. X        case 19200: return(EXTA);
  1199. X        case 38400: return(EXTB);
  1200. X        default: return(-1);
  1201. X    }
  1202. X
  1203. X}    /* end of valid_baud_rate */
  1204. X
  1205. X/*+-----------------------------------------------------------------------
  1206. X    lset_baud_rate(ioctl_flag)
  1207. X
  1208. X  If 'ioctl_flag' is set, then perform ioctl call
  1209. X  is executed after setting baud rate
  1210. X------------------------------------------------------------------------*/
  1211. Xlset_baud_rate(ioctl_flag)
  1212. Xint ioctl_flag;
  1213. X{
  1214. Xint baud_selector = valid_baud_rate(shm->Lbaud);
  1215. X
  1216. X    if(baud_selector == -1)
  1217. X        baud_selector = valid_baud_rate(shm->Lbaud = DEFAULT_BAUD_RATE);
  1218. X
  1219. X    Ltermio.c_cflag &= ~CBAUD;
  1220. X    Ltermio.c_cflag |= baud_selector;
  1221. X
  1222. X#if defined(HO_HUM)
  1223. X    if(ioctl_flag)
  1224. X#endif
  1225. X         ioctl(shm->Liofd,TCSETA,(char *)&Ltermio);
  1226. X    return(0);
  1227. X
  1228. X}    /* end of lset_baud_rate */
  1229. X
  1230. X/*+-------------------------------------------------------------------------
  1231. X    lRTSCTS_control(flag)
  1232. X--------------------------------------------------------------------------*/
  1233. Xvoid
  1234. XlRTSCTS_control(flag)
  1235. Xint flag;
  1236. X{
  1237. X    switch(flag)
  1238. X    {
  1239. X        case 0:
  1240. X            Ltermio.c_iflag |= (IXOFF);
  1241. X            Ltermio.c_cflag &= ~(RTSFLOW | CTSFLOW);
  1242. X            break;
  1243. X
  1244. X        case 1:
  1245. X            Ltermio.c_iflag &= ~(IXON | IXOFF | IXANY);
  1246. X            Ltermio.c_cflag |= (RTSFLOW | CTSFLOW);
  1247. X            break;
  1248. X
  1249. X        case 2:
  1250. X            Ltermio.c_iflag &= ~(IXON | IXOFF | IXANY);
  1251. X            Ltermio.c_cflag |= RTSFLOW;
  1252. X            Ltermio.c_cflag &= ~CTSFLOW;
  1253. X            break;
  1254. X
  1255. X        case 3:
  1256. X            Ltermio.c_iflag &= ~(IXON | IXOFF | IXANY);
  1257. X            Ltermio.c_cflag |= CTSFLOW;
  1258. X            Ltermio.c_cflag &= ~RTSFLOW;
  1259. X            break;
  1260. X    }
  1261. X    shm->Lxonxoff = Ltermio.c_iflag & (IXON|IXOFF);
  1262. X    ioctl(shm->Liofd,TCSETA,(char *)&Ltermio);
  1263. X
  1264. X}    /* end of lRTSCTS_control */
  1265. X
  1266. X/*+-------------------------------------------------------------------------
  1267. X    lnew_baud_rate(new_baud)
  1268. X--------------------------------------------------------------------------*/
  1269. Xint
  1270. Xlnew_baud_rate(new_baud)
  1271. Xuint new_baud;
  1272. X{
  1273. X    if(valid_baud_rate(new_baud) < 0)
  1274. X        return(-1);
  1275. X    if(shm->Lbaud != new_baud)
  1276. X        shm->Lmodem_already_init = 0;
  1277. X    shm->Lbaud = new_baud;
  1278. X    lset_baud_rate(1);
  1279. X    return(0);
  1280. X}    /* end of lnew_baud_rate */
  1281. X
  1282. X/*+-----------------------------------------------------------------------
  1283. X    lset_parity(ioctl_flag)
  1284. X
  1285. X  If 'ioctl_flag' is set, then perform ioctl call
  1286. X  is executed after setting parity
  1287. X------------------------------------------------------------------------*/
  1288. Xvoid
  1289. Xlset_parity(ioctl_flag)
  1290. Xint ioctl_flag;
  1291. X{
  1292. X    Ltermio.c_cflag &= ~(CS8 | PARENB | PARODD);
  1293. X    switch(to_lower(shm->Lparity))
  1294. X    {
  1295. X        case 'e':
  1296. X            Ltermio.c_cflag |= CS7 | PARENB;
  1297. X            Ltermio.c_iflag |= ISTRIP;
  1298. X            break;
  1299. X        case 'o':
  1300. X            Ltermio.c_cflag |= CS7 | PARENB | PARODD;
  1301. X            Ltermio.c_iflag |= ISTRIP;
  1302. X            break;
  1303. X        default:
  1304. X            ff(se,"invalid parity: %c ... defaulting to no parity\r\n");
  1305. X        case 0:
  1306. X        case 'n':
  1307. X            Ltermio.c_cflag |= CS8;
  1308. X            Ltermio.c_iflag &= ~(ISTRIP);
  1309. X            shm->Lparity = 0;
  1310. X            break;
  1311. X    }            
  1312. X
  1313. X#if defined(HO_HUM)
  1314. X    if(ioctl_flag)
  1315. X#endif
  1316. X    {
  1317. X        ioctl(shm->Liofd,TCSETA,(char *)&Ltermio);
  1318. X    }
  1319. X
  1320. X}    /* end of lset_parity */
  1321. X
  1322. X/*+-------------------------------------------------------------------------
  1323. X    lclear_xmtr_xoff()
  1324. X--------------------------------------------------------------------------*/
  1325. Xvoid
  1326. Xlclear_xmtr_xoff()
  1327. X{
  1328. X    ioctl(shm->Liofd,TCXONC,(char *)1); /* restart xmtr output */
  1329. X}    /* end of lclear_xmtr_xoff */
  1330. X
  1331. X/*+-------------------------------------------------------------------------
  1332. X    lbreak()
  1333. X--------------------------------------------------------------------------*/
  1334. Xvoid
  1335. Xlbreak()
  1336. X{
  1337. X    ioctl(shm->Liofd,TCSBRK,(char *)0);
  1338. X}    /* end of lbreak */
  1339. X
  1340. X/*+----------------------------------------------------------------------
  1341. X    lopen()
  1342. Xreturns negative LOPEN_ codes if failure else positive pid using line
  1343. Xelse 0 if successful open
  1344. X------------------------------------------------------------------------*/
  1345. Xint
  1346. Xlopen()
  1347. X{
  1348. Xregister itmp = strlen(shm->Lline);
  1349. Xstruct stat ttystat;
  1350. X
  1351. X    lopen_err_str[0] = 0;
  1352. X    if(shm->Liofd >= 0)
  1353. X        return(LOPEN_ALREADY);
  1354. X    if(strncmp(shm->Lline,"/dev/tty",8))
  1355. X        return(LOPEN_INVALID);
  1356. X    if(!strcmp(shm->Lline,"/dev/tty"))
  1357. X        return(LOPEN_INVALID);
  1358. X    if(shm->Lline[8] == 'p')
  1359. X        return(LOPEN_NOPTY);
  1360. X    if(isupper(shm->Lline[itmp - 1]))
  1361. X        shm->Lline[itmp - 1] = tolower(shm->Lline[itmp - 1]);
  1362. X    if(itmp = lock_tty())        /* get lock file */
  1363. X        return(itmp);
  1364. X    if(stat(shm->Lline,&ttystat) < 0)
  1365. X        return(LOPEN_NODEV);
  1366. X    shm->Liofd = open(shm->Lline,O_RDWR,0777);
  1367. X    if(shm->Liofd < 0)
  1368. X    {
  1369. X        if(errno == EACCES)
  1370. X            sprintf(lopen_err_str,"open error - try chmod +rw %s",shm->Lline);
  1371. X        return(LOPEN_OPNFAIL);
  1372. X    }
  1373. X    else
  1374. X    {
  1375. X        ioctl(shm->Liofd,TCGETA,(char *) &Ltermio);
  1376. X        Ltermio.c_iflag = (IGNPAR | IGNBRK | shm->Lxonxoff);
  1377. X        Ltermio.c_oflag = 0;
  1378. X        Ltermio.c_cflag |= (CLOCAL | CREAD | HUPCL);
  1379. X        Ltermio.c_lflag = 0;
  1380. X
  1381. X        Ltermio.c_cc[VMIN]   = 1;
  1382. X        Ltermio.c_cc[VTIME]  = 1;
  1383. X        lset_baud_rate(0);        /* do not perform ioctl */
  1384. X        lset_parity(1);            /* do perform ioctl */
  1385. X    }
  1386. X
  1387. X    lopen_err_str[0] = 0;
  1388. X    return(0);
  1389. X
  1390. X}    /* end of lopen */
  1391. X
  1392. X/*+-----------------------------------------------------------------------
  1393. X    lclose()
  1394. X------------------------------------------------------------------------*/
  1395. Xvoid
  1396. Xlclose()
  1397. X{
  1398. X    if(shm->Liofd < 0)
  1399. X        return;
  1400. X    unlock_tty();    /* kill lock file (writes to line; must go before close) */
  1401. X    close(shm->Liofd);
  1402. X    shm->Liofd = -1;
  1403. X
  1404. X}    /* end of lclose */
  1405. X
  1406. X/*+-------------------------------------------------------------------------
  1407. X    ltoggle_dtr()
  1408. X--------------------------------------------------------------------------*/
  1409. Xvoid
  1410. Xltoggle_dtr()
  1411. X{
  1412. X    close(shm->Liofd);
  1413. X    nap(500L);
  1414. X    shm->Liofd = open(shm->Lline,O_RDWR,0777);
  1415. X    ioctl(shm->Liofd,TCSETA,(char *)&Ltermio);
  1416. X    nap(300L);
  1417. X}    /* end of ltoggle_dtr */
  1418. X
  1419. X/*+-------------------------------------------------------------------------
  1420. X    lxon_xoff(flag)
  1421. XIXON specifies whether or not we respond to xon/xoff characters
  1422. XIXOFF specifies whether or not we generate XON/XOFF characters
  1423. X--------------------------------------------------------------------------*/
  1424. Xvoid
  1425. Xlxon_xoff(flag)
  1426. Xint flag;
  1427. X{
  1428. X    if(flag & IXON)
  1429. X        Ltermio.c_iflag |= IXON;
  1430. X    else
  1431. X        Ltermio.c_iflag &= ~IXON;
  1432. X
  1433. X    if(flag & IXOFF)
  1434. X        Ltermio.c_iflag |= IXOFF;
  1435. X    else
  1436. X        Ltermio.c_iflag &= ~IXOFF;
  1437. X
  1438. X    shm->Lxonxoff = Ltermio.c_iflag & (IXON|IXOFF);
  1439. X    ioctl(shm->Liofd,TCSETA,(char *)&Ltermio);
  1440. X
  1441. X}    /* end of lxon_xoff */
  1442. X
  1443. X/*+-------------------------------------------------------------------------
  1444. X    lget_xon_xoff(ixon,ixoff)
  1445. X--------------------------------------------------------------------------*/
  1446. Xvoid
  1447. Xlget_xon_xoff(ixon,ixoff)
  1448. Xint *ixon;
  1449. Xint *ixoff;
  1450. X{
  1451. X    *ixon  = Ltermio.c_iflag & IXON;
  1452. X    *ixoff = Ltermio.c_iflag & IXOFF;
  1453. X}    /* end of lget_xon_xoff */
  1454. X
  1455. X/*+-------------------------------------------------------------------------
  1456. X    set_xon_xoff_by_arg(arg)
  1457. X--------------------------------------------------------------------------*/
  1458. Xint
  1459. Xset_xon_xoff_by_arg(arg)
  1460. Xchar *arg;
  1461. X{
  1462. X    if(ulcmpb(arg,"on") < 0)
  1463. X        shm->Lxonxoff = IXON | IXOFF;
  1464. X    else if(ulcmpb(arg,"off") < 0)
  1465. X        shm->Lxonxoff = 0;
  1466. X    else if(ulcmpb(arg,"out") < 0)
  1467. X        shm->Lxonxoff = IXON;
  1468. X    else if(ulcmpb(arg,"in") < 0)
  1469. X        shm->Lxonxoff = IXOFF;
  1470. X    else
  1471. X        return(-1);
  1472. X
  1473. X    Ltermio.c_iflag &= ~(IXON|IXOFF);
  1474. X    Ltermio.c_iflag |= shm->Lxonxoff;
  1475. X    ioctl(shm->Liofd,TCSETA,(char *)&Ltermio);
  1476. X    return(0);
  1477. X
  1478. X}    /* end of set_xon_xoff_by_arg */
  1479. X
  1480. X/*+-------------------------------------------------------------------------
  1481. X    xon_status()
  1482. X--------------------------------------------------------------------------*/
  1483. Xchar *
  1484. Xxon_status()
  1485. X{
  1486. X    switch(shm->Lxonxoff)
  1487. X    {
  1488. X        case 0            : return("off");
  1489. X        case IXON         : return("in off, out on");
  1490. X        case        IXOFF : return("in on, out off");
  1491. X        case IXON | IXOFF : return("on");
  1492. X    }
  1493. X    return("logic error");
  1494. X}    /* end of xon_status */
  1495. X
  1496. X/*+-------------------------------------------------------------------------
  1497. X    lopen_err_text(lerr)
  1498. X--------------------------------------------------------------------------*/
  1499. Xchar *
  1500. Xlopen_err_text(lerr)
  1501. Xint lerr;
  1502. X{
  1503. Xstatic char lerr_s80[80];
  1504. Xchar s32[32];
  1505. X
  1506. X    if(lopen_err_str[0])
  1507. X        return(lopen_err_str);
  1508. X
  1509. X    switch(lerr)
  1510. X    {
  1511. X        case LOPEN_INVALID: return("invalid line name");
  1512. X        case LOPEN_UNKPID: return("unknown pid is using line");
  1513. X        case LOPEN_LCKERR: return("error creating lock file");
  1514. X        case LOPEN_NODEV: return("line does not exist");
  1515. X        case LOPEN_ALREADY: return("line already open!?");
  1516. X        case LOPEN_OPNFAIL:
  1517. X            sprintf(s32,"errno %d",errno);
  1518. X            sprintf(lerr_s80,"open error (%-.60s)",
  1519. X                (errno < sys_nerr) ? sys_errlist[errno] : s32);
  1520. X            return(lerr_s80);
  1521. X        case LOPEN_ENABLED: return("line enabled for incoming login");
  1522. X        case LOPEN_ENABLED_IN_USE: return("line in use by incoming login");
  1523. X        case LOPEN_DIALOUT_IN_USE: return("line in use by another dial out");
  1524. X        case LOPEN_NOPTY: return("ptys not supported");
  1525. X    }
  1526. X    if(lerr > 0)
  1527. X        sprintf(lerr_s80,"pid %d using line",lerr);
  1528. X    else
  1529. X        sprintf(lerr_s80,"unknown line error %d",lerr);
  1530. X    return(lerr_s80);
  1531. X}    /* end of lopen_err_text */
  1532. X
  1533. X/* end of eculine.c */
  1534. X
  1535. X/* vi: set tabstop=4 shiftwidth=4: */
  1536. SHAR_EOF
  1537. $TOUCH -am 1224223090 'eculine.c' &&
  1538. chmod 0644 eculine.c ||
  1539. echo 'restore of eculine.c failed'
  1540. Wc_c="`wc -c < 'eculine.c'`"
  1541. test 23928 -eq "$Wc_c" ||
  1542.     echo 'eculine.c: original size 23928, current size' "$Wc_c"
  1543. # ============= eculock.c ==============
  1544. echo 'x - extracting eculock.c (Text)'
  1545. sed 's/^X//' << 'SHAR_EOF' > 'eculock.c' &&
  1546. X#define HONEYDANBER /* means use ASCII pids in lock files */
  1547. X#if defined(SHARE_DEBUG)
  1548. X#define LOG_LOCKS
  1549. X#endif
  1550. X/*+-----------------------------------------------------------------------
  1551. X    eculock.c -- lock file management
  1552. X    wht@n4hgf.Mt-Park.GA.US
  1553. X
  1554. X  Defined functions:
  1555. X    check_utmp()
  1556. X    create_lock_file(name)
  1557. X    lock_tty()
  1558. X    unlock_tty()
  1559. X
  1560. XLock files under XENIX are supposed to use the direct line name
  1561. X(lower-case last letter); we create only the lower-case case, but
  1562. Xcheck for both.
  1563. X------------------------------------------------------------------------*/
  1564. X/*+:EDITS:*/
  1565. X/*:10-16-1990-20:43-wht@n4hgf-add SHARE_DEBUG */
  1566. X/*:09-19-1990-19:36-wht@n4hgf-ecu_log_event now gets pid for log from caller */
  1567. X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  1568. X
  1569. X#include "ecu.h"
  1570. X#include "utmpstatus.h"
  1571. X
  1572. Xextern int errno;
  1573. Xextern char ungetty_ttyname[];
  1574. Xextern char lopen_err_str[];
  1575. X
  1576. X/*+-------------------------------------------------------------------------
  1577. X    check_utmp()
  1578. Xreturn 0 if line available, else LOPEN code
  1579. X--------------------------------------------------------------------------*/
  1580. Xint
  1581. Xcheck_utmp()
  1582. X{
  1583. Xregister utstatus;
  1584. Xregister status = 0;
  1585. X
  1586. X    switch(utstatus = utmp_status(shm->Lline))
  1587. X    {
  1588. X        case US_DIALOUT:    /* enabled for login, currently dialout */
  1589. X            status = LOPEN_DIALOUT_IN_USE;
  1590. X            break;
  1591. X        case US_LOGGEDIN:    /* enabled for login, in use */
  1592. X            status = LOPEN_ENABLED_IN_USE;
  1593. X            break;
  1594. X        case US_NOTFOUND:    /* not in utmp, or getty dead */
  1595. X            break;
  1596. X        case US_LOGIN:        /* enabled for login, idle */
  1597. X            status = ungetty_get_line();
  1598. X            break;
  1599. X    }
  1600. X
  1601. X#if defined(LOG_LOCKS)
  1602. X{ char s64[64];
  1603. X    sprintf(s64,"UTMPCHK %s st=%d ut=%d",shm->Lline,status,utstatus);
  1604. X    ecu_log_event(getpid(),s64);
  1605. X}
  1606. X#endif
  1607. X
  1608. X    return(status);
  1609. X
  1610. X}    /* end of check_utmp */
  1611. X
  1612. X/*+-----------------------------------------------------------------------
  1613. X    void unlock_tty()
  1614. X------------------------------------------------------------------------*/
  1615. Xvoid
  1616. Xunlock_tty()
  1617. X{
  1618. X    if(LLCKname[0] == 0)
  1619. X    {
  1620. X        ungetty_return_line();
  1621. X        return;
  1622. X    }
  1623. X
  1624. X#ifdef M_UNIX
  1625. X    ungetty_return_line();
  1626. X    unlink(LLCKname);
  1627. X    LLCKname[0] = 0;
  1628. X#else
  1629. X    unlink(LLCKname);
  1630. X    LLCKname[0] = 0;
  1631. X    ungetty_return_line();
  1632. X#endif
  1633. X
  1634. X}    /* end of unlock_tty */
  1635. X
  1636. X/*+-------------------------------------------------------------------------
  1637. X    create_lock_file(name)
  1638. X--------------------------------------------------------------------------*/
  1639. Xint
  1640. Xcreate_lock_file(name)
  1641. Xchar *name;
  1642. X{
  1643. Xregister fd;
  1644. Xint pid = getpid();
  1645. Xchar LTMP_fname[64];
  1646. X#if defined(HONEYDANBER)
  1647. Xchar pid10str[12];
  1648. X
  1649. X    sprintf(pid10str,"%10d\n",getpid());
  1650. X#endif
  1651. X
  1652. X    errno = 0;
  1653. X    sprintf(LTMP_fname,"/usr/spool/uucp/LTMP.%05d",pid);
  1654. X    if((fd = creat(LTMP_fname,0444)) < 0)
  1655. X    {
  1656. X        if(errno == EACCES)
  1657. X            sprintf(lopen_err_str,
  1658. X#if defined(M_UNIX)
  1659. X            "lock error - try chmod 043777 /usr/spool/uucp"
  1660. X#else
  1661. X            "lock error - try chmod 0777 /usr/spool/uucp"
  1662. X#endif
  1663. X            );
  1664. X        unlink(LTMP_fname);
  1665. X        return(-1);
  1666. X    }
  1667. X#if defined(HONEYDANBER)
  1668. X    write(fd,pid10str,11);
  1669. X#else
  1670. X    write(fd,(char *)&pid,sizeof(int));
  1671. X#endif
  1672. X
  1673. X    chmod(LTMP_fname,0444);
  1674. X    close(fd);
  1675. X
  1676. X    fd = link(LTMP_fname,name);        /* use 'fd' for link return code */
  1677. X    unlink(LTMP_fname);
  1678. X    chmod(name,0444);
  1679. X
  1680. X#if defined(LOG_LOCKS)
  1681. X{ char s128[128];
  1682. X  extern char *errno_text();
  1683. X    sprintf(s128,"CRLOCK %s status=%d errno=%s",name,fd,errno_text(errno));
  1684. X    ecu_log_event(getpid(),s128);
  1685. X}
  1686. X#endif
  1687. X
  1688. X    return(fd);
  1689. X}    /* end of create_lock_file */
  1690. X
  1691. X/*+-------------------------------------------------------------------------
  1692. X    lock_tty() - create lock files for tty name in 'shm->Lline'
  1693. X--------------------------------------------------------------------------*/
  1694. Xlock_tty()
  1695. X{
  1696. Xregister itmp;
  1697. X
  1698. X    if(itmp = make_lock_name(shm->Lline,LLCKname))
  1699. X        return(itmp);
  1700. X
  1701. X    if(itmp = check_utmp())
  1702. X        return(itmp);
  1703. X
  1704. X#if defined(GETTY_LOCKS_TTY)
  1705. X    if(!ungetty_ttyname[0])    /* if getty did not lock line */
  1706. X    {
  1707. X#endif
  1708. X        if(create_lock_file(LLCKname))
  1709. X        {
  1710. X            if(itmp = is_active_lock(LLCKname))
  1711. X            {
  1712. X                ungetty_return_line();
  1713. X                errno = EACCES; /* for hangup() */
  1714. X                return(itmp);
  1715. X            }
  1716. X            if(create_lock_file(LLCKname))
  1717. X            {
  1718. X                ungetty_return_line();
  1719. X                errno = EACCES; /* for hangup() */
  1720. X                return(LOPEN_LCKERR);
  1721. X            }
  1722. X        }
  1723. X#if defined(GETTY_LOCKS_TTY)
  1724. X    }
  1725. X#endif
  1726. X
  1727. X    return(0);
  1728. X}    /* end of lock_tty */
  1729. X
  1730. X/* end of eculock.c */
  1731. X/* vi: set tabstop=4 shiftwidth=4: */
  1732. SHAR_EOF
  1733. $TOUCH -am 1224223090 'eculock.c' &&
  1734. chmod 0644 eculock.c ||
  1735. echo 'restore of eculock.c failed'
  1736. Wc_c="`wc -c < 'eculock.c'`"
  1737. test 4250 -eq "$Wc_c" ||
  1738.     echo 'eculock.c: original size 4250, current size' "$Wc_c"
  1739. # ============= ecunumrev.c ==============
  1740. echo 'x - extracting ecunumrev.c (Text)'
  1741. sed 's/^X//' << 'SHAR_EOF' > 'ecunumrev.c' &&
  1742. X/*+-----------------------------------------------------------------------
  1743. X    ecunumrev.c - revision numbers
  1744. X    wht@n4hgf.Mt-Park.GA.US
  1745. X------------------------------------------------------------------------*/
  1746. X/*+:EDITS:*/
  1747. X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  1748. X
  1749. X#if defined(M_I286) && !defined(NO_SELECT)
  1750. X#define NO_SELECT
  1751. X#endif
  1752. X
  1753. X#ifdef WHT
  1754. Xchar *numeric_revision = "tw3.00";
  1755. X#else
  1756. X#ifdef SCO
  1757. Xchar *numeric_revision = "sco-3.00";
  1758. X#else
  1759. Xchar *numeric_revision = "unet-3.00";
  1760. X#endif
  1761. X#endif
  1762. X
  1763. X#if defined(M_UNIX)
  1764. Xchar *revision_modifier = "-386u wht@n4hgf";
  1765. X#else
  1766. X#if defined(M_I386)
  1767. X#if defined(NO_SELECT)
  1768. Xchar *revision_modifier = "-386n wht@n4hgf";
  1769. X#else
  1770. Xchar *revision_modifier = "-386s wht@n4hgf";
  1771. X#endif
  1772. X#else
  1773. Xchar *revision_modifier = "-286n wht@n4hgf";
  1774. X#endif
  1775. X#endif
  1776. X
  1777. X/* vi: set tabstop=4 shiftwidth=4: */
  1778. SHAR_EOF
  1779. $TOUCH -am 1226041490 'ecunumrev.c' &&
  1780. chmod 0644 ecunumrev.c ||
  1781. echo 'restore of ecunumrev.c failed'
  1782. Wc_c="`wc -c < 'ecunumrev.c'`"
  1783. test 834 -eq "$Wc_c" ||
  1784.     echo 'ecunumrev.c: original size 834, current size' "$Wc_c"
  1785. true || echo 'restore of ecuphone.c failed'
  1786. echo End of part 4, continue with part 5
  1787. exit 0
  1788. --------------------------------------------------------------------
  1789. Warren Tucker, TuckerWare emory!n4hgf!wht or wht@n4hgf.Mt-Park.GA.US
  1790. Hacker Extraordinaire  d' async PADs,  pods,  proteins and protocols
  1791.  
  1792. exit 0 # Just in case...
  1793. -- 
  1794. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  1795. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  1796. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  1797. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  1798.