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

  1. From: wht@n4hgf.uucp (Warren Tucker)
  2. Newsgroups: comp.sources.misc
  3. Subject: v16i036:  ECU async comm package rev 3.0, Part12/35
  4. Message-ID: <1991Jan6.052118.27856@sparky.IMD.Sterling.COM>
  5. Date: 6 Jan 91 05:21:18 GMT
  6. Approved: kent@sparky.imd.sterling.com
  7. X-Checksum-Snefru: d1576de0 80df6b3b 9fc37ca9 d9aa5c26
  8.  
  9. Submitted-by: wht@n4hgf.uucp (Warren Tucker)
  10. Posting-number: Volume 16, Issue 36
  11. Archive-name: ecu3/part12
  12.  
  13. ---- Cut Here and feed the following to sh ----
  14. #!/bin/sh
  15. # This is part 12 of ecu3
  16. if touch 2>&1 | fgrep 'amc' > /dev/null
  17.  then TOUCH=touch
  18.  else TOUCH=true
  19. fi
  20. # ============= hdbintf.c ==============
  21. echo 'x - extracting hdbintf.c (Text)'
  22. sed 's/^X//' << 'SHAR_EOF' > 'hdbintf.c' &&
  23. X#if defined(SHARE_DEBUG)
  24. X#define LOG_UNGETTY
  25. X#define LOG_HDBDIAL
  26. X#endif
  27. X/*+-------------------------------------------------------------------------
  28. X    hdbintf.c - HDB UUCP database and /etc/utmp interface routines
  29. X    wht@n4hgf.Mt-Park.GA.US
  30. X
  31. X  Defined functions:
  32. X    dialstr_translate(translate_list,to_translate)
  33. X    enddlent()
  34. X    enddvent()
  35. X    getdlent()
  36. X    getdlentname(name)
  37. X    getdvbaud(baud)
  38. X    getdvent()
  39. X    getdvline(line)
  40. X    hdb_dial(presult)
  41. X    hdb_dial_error_text(errcode)
  42. X    hdb_init()
  43. X    ungetty_get_line()
  44. X    ungetty_return_line()
  45. X
  46. X--------------------------------------------------------------------------*/
  47. X/*+:EDITS:*/
  48. X/*:10-16-1990-20:43-wht@n4hgf-add SHARE_DEBUG */
  49. X/*:09-19-1990-19:36-wht@n4hgf-ecu_log_event now gets pid for log from caller */
  50. X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  51. X
  52. X#include "ecu.h"
  53. X#include "esd.h"
  54. X#include "var.h"
  55. X#include "ecuhangup.h"
  56. X#include "utmpstatus.h"
  57. X#include "ecuungetty.h"
  58. X#include "dvent.h"
  59. X#include "dlent.h"
  60. X#include "dialprog.h"
  61. X#include <errno.h>
  62. X#include <utmp.h>
  63. X
  64. Xchar *arg_token();
  65. Xchar *skip_ld_break();
  66. X
  67. Xextern int errno;
  68. Xextern char kbdintr;        /* current input INTR */
  69. Xextern int interrupt;
  70. Xextern ulong colors_current;
  71. Xextern char *sys_errlist[];
  72. Xextern int proc_level;
  73. Xextern int proctrace;
  74. X
  75. Xint there_is_hdb_on_this_machine = 0;
  76. XFILE *fpdv = NULL;
  77. XFILE *fpdl = NULL;
  78. Xchar *Devices_file = "/usr/lib/uucp/Devices";
  79. Xchar *Dialers_file = "/usr/lib/uucp/Dialers";
  80. Xchar *ungetty = (char *)0;
  81. Xchar ungetty_executable[128];
  82. Xchar ungetty_ttyname[64] = "";
  83. X
  84. X/*+-------------------------------------------------------------------------
  85. X    ungetty_get_line()
  86. X--------------------------------------------------------------------------*/
  87. Xungetty_get_line()
  88. X{
  89. Xint itmp;
  90. Xchar ungetty_log[80];
  91. Xint ungetty_pid;
  92. Xint (*original_sighdlr)();
  93. Xint wait_status;
  94. Xchar bamboozlement[20];
  95. Xchar *bamboozle();
  96. X
  97. X    if(!there_is_hdb_on_this_machine)
  98. X        return(LOPEN_ENABLED);
  99. X
  100. X    if(!ungetty)
  101. X    {
  102. X        sprintf(ungetty_executable,"%s/ecuungetty",ECULIBDIR);
  103. X        ungetty = ungetty_executable;
  104. X    }
  105. X
  106. X    strcpy(bamboozlement,bamboozle(getpid()));
  107. X    if(access(ungetty,1))
  108. X    {
  109. X        pperror(ungetty);
  110. X        return(LOPEN_ENABLED);
  111. X    }
  112. X    original_sighdlr = signal(SIGCLD,SIG_DFL);
  113. X    if((ungetty_pid = smart_fork()) == 0)
  114. X    {
  115. X        execl(ungetty,"ungetty",shm->Lline,bamboozlement,(char *)0);
  116. X        exit(-1);
  117. X    }
  118. X    while(((itmp = wait(&wait_status)) != ungetty_pid) && (itmp != -1))
  119. X        ;
  120. X    signal(SIGCLD,original_sighdlr);
  121. X    switch((wait_status >> 8) & 0xFF)
  122. X    {
  123. X        case UG_NOTENAB:    /* line acquired: not enabled */
  124. X            ungetty_ttyname[0] = 0;
  125. X            break;
  126. X
  127. X        case UG_ENAB:        /* line acquired: need ungetty -r when done */
  128. X#if defined(LOG_UNGETTY)
  129. X            sprintf(ungetty_log,"UNGETTY acquired %s",shm->Lline);
  130. X            ecu_log_event(getpid(),ungetty_log);
  131. X#endif
  132. X            strcpy(ungetty_ttyname,shm->Lline);
  133. X            break;
  134. X
  135. X        case UG_FAIL:        /* line in use */
  136. X            ungetty_ttyname[0] = 0;
  137. X            return(LOPEN_ENABLED_IN_USE);
  138. X
  139. X        default:
  140. X#if defined(LOG_UNGETTY)
  141. X            sprintf(ungetty_log,"UNGETTY status 0x%04x",wait_status);
  142. X            ecu_log_event(getpid(),ungetty_log);
  143. X#endif
  144. X            ungetty_ttyname[0] = 0;
  145. X            return(LOPEN_ENABLED);
  146. X    }
  147. X
  148. X    return(0);
  149. X
  150. X}    /* end of ungetty_get_line */
  151. X
  152. X/*+-------------------------------------------------------------------------
  153. X    ungetty_return_line()
  154. X--------------------------------------------------------------------------*/
  155. Xvoid
  156. Xungetty_return_line()
  157. X{
  158. Xint ungetty_pid;
  159. Xint itmp;
  160. Xint (*original_sighdlr)();
  161. Xint wait_status = 0xDEAD;
  162. X#if defined(LOG_UNGETTY)
  163. Xchar ungetty_log[80];
  164. X#endif
  165. Xchar bamboozlement[20];
  166. Xchar *bamboozle();
  167. X
  168. X    if(!there_is_hdb_on_this_machine)
  169. X        return;
  170. X    if(!ungetty_ttyname[0])
  171. X        return;
  172. X
  173. X    strcpy(bamboozlement,bamboozle(getpid()));
  174. X
  175. X    /* call ungetty to see if we need to switch to dialin */
  176. X    if(access(ungetty,1))
  177. X    {
  178. X        pperror(ungetty);
  179. X        return;
  180. X    }
  181. X    original_sighdlr = signal(SIGCLD,SIG_DFL);
  182. X    if((ungetty_pid = smart_fork()) == 0)
  183. X    {
  184. X        execl(ungetty,"ungetty","-t",ungetty_ttyname,bamboozlement,(char *)0);
  185. X        ecu_log_event(getpid(),"could not exec ecuungetty -t");
  186. X        exit(-1);
  187. X    }
  188. X    while(((itmp = wait(&wait_status)) != ungetty_pid) &&
  189. X            (itmp != -1) )
  190. X        ;
  191. X    signal(SIGCLD,original_sighdlr);
  192. X    switch((wait_status >> 8) & 0xFF)
  193. X    {
  194. X        case UG_RESTART:
  195. X            break;
  196. X
  197. X        default:
  198. X#if defined(LOG_UNGETTY)
  199. X            sprintf(ungetty_log,"UNGETTY -t %s status %04x",
  200. X                ungetty_ttyname,wait_status);
  201. X            ecu_log_event(getpid(),ungetty_log);
  202. X#endif
  203. X            ungetty_ttyname[0] = 0;
  204. X            return;
  205. X    }
  206. X
  207. X    strcpy(bamboozlement,bamboozle(getpid()));
  208. X
  209. X    original_sighdlr = signal(SIGCLD,SIG_DFL);
  210. X    if((ungetty_pid = smart_fork()) == 0)
  211. X    {
  212. X        execl(ungetty,"ungetty","-r",ungetty_ttyname,bamboozlement,(char *)0);
  213. X        ecu_log_event(getpid(),"could not exec ecuungetty -r");
  214. X        exit(-1);
  215. X    }
  216. X
  217. X    while(((itmp = wait(&wait_status)) != ungetty_pid) &&
  218. X            (itmp != -1))
  219. X        ;
  220. X
  221. X#if defined(LOG_UNGETTY)
  222. X    if(wait_status)
  223. X    {
  224. X        sprintf(ungetty_log,"UNGETTY -r %s status 0x%04x",
  225. X            ungetty_ttyname,wait_status);
  226. X    }
  227. X    else
  228. X        sprintf(ungetty_log,"UNGETTY returned %s",ungetty_ttyname);
  229. X    ecu_log_event(getpid(),ungetty_log);
  230. X#endif
  231. X
  232. X    ungetty_ttyname[0] = 0;
  233. X
  234. X}    /* end of ungetty_return_line */
  235. X
  236. X/*+-------------------------------------------------------------------------
  237. X    getdvent() - get first or next Devices entry (a la getpwent)
  238. X--------------------------------------------------------------------------*/
  239. Xstruct dvent *
  240. Xgetdvent()
  241. X{
  242. Xint itmp;
  243. Xchar *cptr;
  244. X#define MAX_DV_TOKENS 9
  245. Xchar *tokens[MAX_DV_TOKENS];
  246. Xstatic struct dvent dve;
  247. Xstatic char dvstr[128];
  248. Xchar *strchr();
  249. X
  250. X    if(!there_is_hdb_on_this_machine)
  251. X        return((struct dvent *)0);
  252. X
  253. X    if(fpdv == NULL)
  254. X    {
  255. X        if((fpdv = fopen(Devices_file,"r")) == NULL)
  256. X        {
  257. X            pperror(Devices_file);
  258. X            return((struct dvent *)0);
  259. X        }
  260. X    }
  261. X
  262. X    while(1)
  263. X    {
  264. X        if(fgets(dvstr,sizeof(dvstr),fpdv) == NULL)
  265. X            return((struct dvent *)0);
  266. X
  267. X        if((dvstr[0] == '#') || (dvstr[0] == ' ') || (strlen(dvstr) == 1))
  268. X            continue;
  269. X
  270. X        build_arg_array(dvstr,tokens,MAX_DV_TOKENS,&itmp);
  271. X
  272. X        if(itmp > 1)
  273. X            break;
  274. X    }
  275. X
  276. X    dve.type = tokens[0];
  277. X    dve.line = tokens[1];
  278. X    dve.dialer = tokens[2];
  279. X    if(!strcmp(tokens[3],"Any"))
  280. X    {
  281. X        dve.low_baud = 1;
  282. X        dve.high_baud = 100000L;
  283. X    }
  284. X    else
  285. X    {
  286. X        dve.low_baud = atoi(tokens[3]);
  287. X        if(!(cptr = strchr(tokens[3],'-')))
  288. X            dve.high_baud = dve.low_baud;
  289. X        else
  290. X            dve.high_baud = atoi(cptr + 1);
  291. X    }
  292. X    dve.dialprog = tokens[4];
  293. X    return(&dve);
  294. X
  295. X}    /* end of getdvent */
  296. X
  297. X/*+-------------------------------------------------------------------------
  298. X    getdvbaud(baud) - get Devices entry matching baud rate
  299. X--------------------------------------------------------------------------*/
  300. Xstruct dvent *
  301. Xgetdvbaud(baud)
  302. Xuint baud;
  303. X{
  304. Xstruct dvent *dve;
  305. X
  306. X    while(1)
  307. X    {
  308. X        if((dve = getdvent()) == (struct dvent *)0)
  309. X            return(dve);
  310. X        if((dve->low_baud <= baud) && (baud <= dve->high_baud))
  311. X            return(dve);
  312. X    }
  313. X    /*NOTREACHED*/
  314. X
  315. X}    /* end of getdvbaud */
  316. X
  317. X/*+-------------------------------------------------------------------------
  318. X    getdvline(line) - get Devices entry matching line
  319. Xcalling argument 'line's is string AFTER "/dev/tty"
  320. X--------------------------------------------------------------------------*/
  321. Xstruct dvent *
  322. Xgetdvline(line)
  323. Xchar *line;
  324. X{
  325. Xstruct dvent *dve;
  326. X
  327. X    while(1)
  328. X    {
  329. X        if((dve = getdvent()) == (struct dvent *)0)
  330. X            return(dve);
  331. X        if(!strcmp(dve->line + 3,line))
  332. X            return(dve);
  333. X    }
  334. X    /*NOTREACHED*/
  335. X
  336. X}    /* end of getdvline */
  337. X
  338. X/*+-------------------------------------------------------------------------
  339. X    enddvent()
  340. X--------------------------------------------------------------------------*/
  341. Xvoid
  342. Xenddvent()
  343. X{
  344. X    if(fpdv != NULL)
  345. X    {
  346. X        fclose(fpdv);
  347. X        fpdv = NULL;
  348. X    }
  349. X}    /* end of enddvent */
  350. X
  351. X/*+-------------------------------------------------------------------------
  352. X    dialstr_translate(translate_list,to_translate) - translate dial strings
  353. X--------------------------------------------------------------------------*/
  354. Xvoid
  355. Xdialstr_translate(translate_list,to_translate)
  356. Xregister char *translate_list;
  357. Xchar *to_translate;
  358. X{
  359. X    register char *cptr;
  360. X
  361. X    while(*translate_list && *(translate_list + 1))
  362. X    {
  363. X        for(cptr=to_translate; *cptr; cptr++)
  364. X        {
  365. X            if(*translate_list == *cptr)
  366. X                *cptr = *(translate_list + 1);
  367. X        }
  368. X        translate_list += 2;
  369. X    }
  370. X}    /* end of dialstr_translate */
  371. X
  372. X/*+-------------------------------------------------------------------------
  373. X    getdlent() - get first or next Dialers entry (a la getpwent)
  374. X--------------------------------------------------------------------------*/
  375. Xstruct dlent *
  376. Xgetdlent()
  377. X{
  378. Xint itmp;
  379. Xchar *cptr;
  380. X#define MAX_DL_TOKENS 3
  381. Xchar *tokens[MAX_DL_TOKENS];
  382. Xstatic struct dlent dle;
  383. Xstatic char dlstr[128];
  384. Xchar *strchr();
  385. X
  386. X    if(!there_is_hdb_on_this_machine)
  387. X        return((struct dlent *)0);
  388. X
  389. X    if(fpdl == NULL)
  390. X    {
  391. X        if((fpdl = fopen(Dialers_file,"r")) == NULL)
  392. X        {
  393. X            pperror(Dialers_file);
  394. X            return((struct dlent *)0);
  395. X        }
  396. X    }
  397. X
  398. X    while(1)
  399. X    {
  400. X        if(fgets(dlstr,sizeof(dlstr),fpdl) == NULL)
  401. X            return((struct dlent *)0);
  402. X        if(((itmp = strlen(dlstr)) > 0) && (dlstr[itmp - 1] == '\n'))
  403. X            dlstr[--itmp] = 0;
  404. X        if((dlstr[0] == '#') || (dlstr[0] == ' ') || (!itmp))
  405. X            continue;
  406. X        for(itmp = 0; itmp < MAX_DL_TOKENS; itmp++)
  407. X            tokens[itmp] = "";
  408. X        if(tokens[0] = arg_token(dlstr," \t\r\n"))
  409. X        {
  410. X            if(tokens[1] = arg_token((char *)0," \t\r\n"))
  411. X            {
  412. X            extern char *str_token_static;
  413. X                tokens[2] = skip_ld_break(str_token_static);
  414. X            }
  415. X        }
  416. X        break;
  417. X    }
  418. X
  419. X    dle.name = tokens[0];
  420. X    dle.tlate = tokens[1];
  421. X    dle.script = tokens[2];
  422. X    return(&dle);
  423. X
  424. X}    /* end of getdlent */
  425. X
  426. X/*+-------------------------------------------------------------------------
  427. X    enddlent()
  428. X--------------------------------------------------------------------------*/
  429. Xvoid
  430. Xenddlent()
  431. X{
  432. X    if(fpdl != NULL)
  433. X    {
  434. X        fclose(fpdl);
  435. X        fpdl = NULL;
  436. X    }
  437. X}    /* end of enddlent */
  438. X
  439. X/*+-------------------------------------------------------------------------
  440. X    getdlentname(name) - get Dialers entry by name
  441. X--------------------------------------------------------------------------*/
  442. Xstruct dlent *
  443. Xgetdlentname(name)
  444. Xchar *name;
  445. X{
  446. Xregister struct dlent *tdle;
  447. X
  448. X    while(tdle = getdlent())
  449. X    {
  450. X        if(!strcmp(name,tdle->name))
  451. X            break;
  452. X    }
  453. X    return(tdle);
  454. X
  455. X}    /* end of getdlentname */
  456. X
  457. X/*+-------------------------------------------------------------------------
  458. X    hdb_dial_error(errcode)
  459. X
  460. Xalso sets iv[0] to dial command status
  461. X--------------------------------------------------------------------------*/
  462. Xchar *
  463. Xhdb_dial_error_text(errcode)
  464. Xint errcode;
  465. X{
  466. X
  467. X    iv[0] = 1;
  468. X    switch(errcode & 0x7F)
  469. X    {
  470. X        case RCE_INUSE:
  471. X            return("!Line in use");
  472. X        case RCE_SIG:
  473. X            iv[0] = 2;
  474. X            return("!Interrupted");
  475. X        case RCE_ARGS:
  476. X            return("!Invalid arguments");
  477. X        case RCE_PHNO:
  478. X            return("!Invalid phone number");
  479. X        case RCE_SPEED:
  480. X            return("!Bad baud rate");
  481. X        case RCE_OPEN:
  482. X            return("!Line open error");
  483. X        case RCE_IOCTL:
  484. X            return("!Ioctl error");
  485. X        case RCE_TIMOUT:
  486. X            iv[0] = 3;
  487. X            return("!Modem Error");
  488. X        case RCE_NOTONE:
  489. X            return("NO DIAL TONE");
  490. X        case RCE_BUSY:
  491. X            return("BUSY");
  492. X        case RCE_NOCARR:
  493. X            return("NO CARRIER");
  494. X        case RCE_ANSWER:
  495. X            return("NO ANSWER");
  496. X        default:
  497. X            
  498. X        case RCE_NULL:
  499. X            return("unknown error\n");
  500. X    }
  501. X}    /* end of hdb_dial_error */
  502. X
  503. X/*+-------------------------------------------------------------------------
  504. X    hdb_dial(presult) - dial with uucp dialer if we can
  505. X
  506. Xreturn 0 if connected
  507. X       1 if dial failed
  508. X       2 if interrupted
  509. X       3 if modem error
  510. X       4 if use ecu DCE dialer
  511. X--------------------------------------------------------------------------*/
  512. Xint
  513. Xhdb_dial(presult)
  514. Xchar **presult;
  515. X{
  516. Xint itmp;
  517. Xint dial_pid;
  518. Xint wait_status;
  519. Xint old_ttymode = get_ttymode();
  520. Xint (*original_sighdlr)();
  521. Xstruct dvent *dve;
  522. Xstruct dlent *dle = (struct dlent *)0;
  523. Xchar baudstr[10];
  524. Xchar dial_log[100];
  525. Xchar stripped_num[64];
  526. Xchar *sptr;
  527. Xchar *dptr;
  528. Xstatic char stat_s20[20];
  529. Xulong colors_at_entry = colors_current;
  530. Xextern char *make_char_graphic();
  531. X#ifdef WHT    /* hack for immediate need ... make a real feature later */
  532. XFILE *fp;
  533. Xchar credit_file[128];
  534. X#endif
  535. X
  536. X    if(!there_is_hdb_on_this_machine)
  537. X        return(4);
  538. X
  539. X    strcpy(dial_log,shm->Lline + 8);
  540. X    sptr = dial_log + strlen(dial_log) - 1;
  541. X    *sptr = to_upper(*sptr);
  542. X    dve = getdvline(dial_log);
  543. X    enddvent();
  544. X    if(!dve)
  545. X    {
  546. X        pputs("no Devices entry for line ... using ecu dialer\n");
  547. X        return(4);
  548. X    }
  549. X
  550. X    dial_log[0] = 0;
  551. X    if(*dve->dialprog != '/')
  552. X    {
  553. X        dle = getdlentname(dve->dialprog);
  554. X        enddlent();
  555. X        if(!dle)
  556. X        {
  557. X            sprintf(dial_log,
  558. X                "UUCPDIAL Devices entry %s: '%s' not found in Dialers",
  559. X                shm->Lline + 5,dve->dialprog);
  560. X        }
  561. X    }
  562. X    else if(access(dve->dialprog,1))
  563. X    {
  564. X        sprintf(dial_log,"UUCPDIAL Devices entry %s: (%s) %s",
  565. X            shm->Lline + 5,dve->dialprog,sys_errlist[errno]);
  566. X    }
  567. X
  568. X    if(dial_log[0])
  569. X    {
  570. X#if defined(LOG_HDBDIAL)
  571. X        ecu_log_event(getpid(),dial_log);
  572. X#endif
  573. X        pputs(dial_log + 9);
  574. X        pputs("\ntrying ecu dialer\n");
  575. X        return(4);
  576. X    }
  577. X
  578. X    sptr = shm->Ltelno;
  579. X    dptr = stripped_num;
  580. X    while(*sptr)
  581. X    {
  582. X        if(strchr("()-",*sptr))
  583. X        {
  584. X            sptr++;
  585. X            continue;
  586. X        }
  587. X        *dptr++ = *sptr++;
  588. X    }
  589. X    *dptr = 0;
  590. X
  591. X#ifdef WHT    /* hack for immediate need ... make a real feature later */
  592. X    if(*(dptr - 1) == '$')
  593. X    {
  594. X        *--dptr = 0;
  595. X        get_home_dir(credit_file);
  596. X        strcat(credit_file,"/.ecu/.credit");
  597. X        chmod(credit_file,0400);    /* let's keep this one quiet */
  598. X        if(fp = fopen(credit_file,"r"))
  599. X        {
  600. X            *dptr++ = ',';
  601. X            *dptr++ = ',';
  602. X            *dptr++ = ',';
  603. X            *dptr++ = ',';
  604. X            *dptr = 0;
  605. X            fgets(dptr,30,fp);
  606. X            fclose(fp);
  607. X        }
  608. X        if(!fp || !(*dptr))
  609. X        {
  610. X            pprintf("credit card error\n");
  611. X            iv[0] = 1;
  612. X            return(1);
  613. X        }
  614. X        *(dptr + strlen(dptr) - 1) = 0; /* kill NL */
  615. X    }
  616. X#endif /* WHT */
  617. X
  618. X    pprintf("Type %s to abort ... ",
  619. X        (kbdintr == 0x7F) ? "DEL" : make_char_graphic(kbdintr,0));
  620. X    ttymode(2);
  621. X
  622. X    if(!dle)
  623. X    {
  624. X        if(access(dve->dialprog,1))
  625. X        {
  626. X            pperror(ungetty);
  627. X            pputs("trying ecu dialer\n");
  628. X            return(4);
  629. X        }
  630. X        sprintf(baudstr,"%u",shm->Lbaud);
  631. X        original_sighdlr = signal(SIGCLD,SIG_DFL);
  632. X        if((dial_pid = smart_fork()) == 0)
  633. X        {
  634. X            signal(SIGINT,SIG_DFL);
  635. X            execl(dve->dialprog,"ECUdial",shm->Lline,stripped_num,
  636. X                baudstr,(char *)0);
  637. X            exit(-1);
  638. X        }
  639. X
  640. X        wait_status = (RC_FAIL | RCE_SIG) << 8;
  641. X        while(((itmp = wait(&wait_status)) != dial_pid) && (itmp != -1))
  642. X            ;
  643. X        signal(SIGCLD,original_sighdlr);
  644. X        ttymode(old_ttymode);
  645. X        ttyflush(1);
  646. X
  647. X        if(interrupt)
  648. X        {
  649. X            kill(dial_pid,9);
  650. X            ltoggle_dtr();
  651. X            interrupt = 0;     /* in case of SIGINT by user */
  652. X        }
  653. X        lreset_ksr(); /* uucp dialers are nice guys, but lets use our termio */
  654. X
  655. X#if defined(LOG_HDBDIAL)
  656. X        if(wait_status)
  657. X        {
  658. X            sprintf(dial_log,"UUCPDIAL %s %s 0x%04x",
  659. X                dve->dialprog,stripped_num,wait_status);
  660. X            ecu_log_event(getpid(),dial_log);
  661. X        }
  662. X#endif
  663. X
  664. X        /*
  665. X         * if system reports interrupt, fake dial-reported status
  666. X         */
  667. X        if(wait_status & 0xFF)
  668. X            wait_status = (RC_FAIL | RCE_SIG) << 8;
  669. X
  670. X        if(!wait_status)
  671. X        {
  672. X            sprintf(stat_s20,"CONNECT %u",shm->Lbaud);
  673. X            *presult = stat_s20;    /* DCE_dial will report result code */
  674. X            return(0);
  675. X        }
  676. X
  677. X        if((wait_status & 0xFF00) == 0xFF00)
  678. X        {
  679. X            pputs("uucp dial failure (see ~/.ecu/log) ... trying ecu dialer\n");
  680. X            return(4);
  681. X        }
  682. X        *presult = hdb_dial_error_text((wait_status >> 8) & 0xFF);
  683. X        setcolor(colors_error);
  684. X        pputs(*presult);
  685. X        setcolor(colors_at_entry);
  686. X        pputc('\n');
  687. X        ltoggle_dtr();
  688. X    }
  689. X    else
  690. X    {
  691. X        extern int expresp_verbosity;
  692. X        pprintf("using Dialers entry '%s'\n",dle->name);
  693. X        expresp_verbosity = (proc_level & proctrace) ? 1 : 0;
  694. X        if(execute_expresp(dle->script))
  695. X        {
  696. X            *presult = "DIALER SCRIPT FAILED";
  697. X            setcolor(colors_error);
  698. X            pputs(*presult);
  699. X            setcolor(colors_at_entry);
  700. X            pputc('\n');
  701. X            iv[0] = 1;
  702. X        }
  703. X        else
  704. X        {
  705. X            extern char last_Speed_result[];
  706. X            if(last_Speed_result[0])
  707. X                *presult = last_Speed_result;
  708. X            else
  709. X            {
  710. X                sprintf(stat_s20,"CONNECT %u",shm->Lbaud);
  711. X                *presult = stat_s20;    /* DCE_dial will report result code */
  712. X            }
  713. X            setcolor(colors_at_entry);
  714. X            iv[0] = 0;
  715. X        }
  716. X    }
  717. X
  718. X    return((int)iv[0]);
  719. X
  720. X}    /* end of hdb_dial */
  721. X
  722. X/*+-------------------------------------------------------------------------
  723. X    hdb_init()
  724. X--------------------------------------------------------------------------*/
  725. Xvoid
  726. Xhdb_init()
  727. X{
  728. X    there_is_hdb_on_this_machine = !access(Devices_file,4);
  729. X
  730. X}    /* end of hdb_init */
  731. X
  732. X/* vi: set tabstop=4 shiftwidth=4: */
  733. X/* end of hdbintf.c */
  734. SHAR_EOF
  735. $TOUCH -am 1224223990 'hdbintf.c' &&
  736. chmod 0644 hdbintf.c ||
  737. echo 'restore of hdbintf.c failed'
  738. Wc_c="`wc -c < 'hdbintf.c'`"
  739. test 15942 -eq "$Wc_c" ||
  740.     echo 'hdbintf.c: original size 15942, current size' "$Wc_c"
  741. # ============= kbdtest.c ==============
  742. echo 'x - extracting kbdtest.c (Text)'
  743. sed 's/^X//' << 'SHAR_EOF' > 'kbdtest.c' &&
  744. X/*+-----------------------------------------------------------------------
  745. X    kbdtest.c -- hack to test keyboard function key sequences
  746. X    wht@n4hgf.Mt-Park.GA.US
  747. X
  748. X  compile with     cc -o kbdtest kbdtest.c
  749. X  or just          cc kbdtest.c;a.out
  750. X------------------------------------------------------------------------*/
  751. X/*+:EDITS:*/
  752. X/*:12-21-1990-23:47-wht@n4hgf-liven up for release with ECU 3 */
  753. X/*:04-07-1990-01:36-wht@tridom-bring out of the daaaaark ages a bit */
  754. X/*:04-18-1988-13:44-wht-first edits -- oollldd program */
  755. X
  756. X#include <stdio.h>
  757. X#include <signal.h>
  758. X#include <ctype.h>
  759. X#include <fcntl.h>
  760. X#include <termio.h>
  761. X#include <sys/types.h>
  762. X#include <sys/errno.h>
  763. X#include <sys/stat.h>
  764. X#include <string.h>
  765. X
  766. X#define ff    fprintf
  767. X#define se    stderr
  768. X
  769. X#define TTYIN   0
  770. X#define TTYOUT  1
  771. X#define TTYERR  2
  772. X
  773. Xstruct termio tv0;        /* for saving, changing TTY atributes */
  774. Xstruct termio tv;        /* for saving, changing TTY atributes */
  775. X
  776. X/*+-----------------------------------------------------------------------
  777. X    ttymode(arg) -- control user console (kbd/screen)
  778. X
  779. X  Where arg ==
  780. X    0 restore attributes saved at start of execution
  781. X    1 raw mode 
  782. X
  783. X------------------------------------------------------------------------*/
  784. Xvoid ttymode(arg)
  785. X{
  786. X    char *mode_type;
  787. X
  788. X    switch(arg)
  789. X    {
  790. X        case 0:    
  791. X            mode_type = "console to cooked mode\r\n";
  792. X            break;
  793. X        default: 
  794. X            mode_type = "console to raw mode\r\n";
  795. X            break;
  796. X    }
  797. X    (void)fprintf(stderr,mode_type);
  798. X
  799. X    if(arg)
  800. X    {
  801. X        (void)ioctl(TTYIN,TCGETA,&tv);
  802. X        tv.c_iflag &= ~(INLCR | ICRNL | IGNCR | IXOFF | IUCLC | ISTRIP);
  803. X        tv.c_oflag |= OPOST;
  804. X        tv.c_oflag &= ~(OLCUC | ONLCR | OCRNL | ONOCR | ONLRET);
  805. X        tv.c_lflag &= ~(ICANON | ISIG | ECHO);
  806. X        tv.c_cc[VEOF] = '\01';
  807. X        tv.c_cc[VEOL] = '\0';
  808. X        tv.c_cc[VMIN] = 1;
  809. X        tv.c_cc[VTIME] = 1;
  810. X        (void)ioctl(TTYIN,TCSETAW,&tv);
  811. X    }
  812. X    else
  813. X        (void)ioctl(TTYIN,TCSETAW,&tv0);
  814. X}
  815. X
  816. X
  817. X/*+-----------------------------------------------------------------------
  818. X    main()
  819. X------------------------------------------------------------------------*/
  820. Xmain(argc,argv)
  821. Xint argc;
  822. Xchar **argv;
  823. X{
  824. Xunsigned char inchar;
  825. X
  826. X    setbuf(stdout,NULL);
  827. X    setbuf(stderr,NULL);
  828. X
  829. X    ioctl(TTYIN,TCGETA,&tv0);        /* get original status */
  830. X    ttymode(2);
  831. X
  832. X    fprintf(stderr,"press ^D (0x04) to terminate program\r\n");
  833. X
  834. X    while(read(TTYIN,&inchar,1) == 1)
  835. X    {
  836. X        printf("%02x %c\r\n",inchar,
  837. X            ((inchar >= 0x20) && (inchar < 0x7F)) ? inchar : '.');
  838. X        if((inchar & 0x7F) == 4)
  839. X        {
  840. X            ttymode(0);
  841. X            exit(0);
  842. X        }
  843. X    }
  844. X    ttymode(0);
  845. X    exit(1);
  846. X
  847. X}
  848. X
  849. X/* vi: set tabstop=4 shiftwidth=4: */
  850. X/* end of kbdtest.c */
  851. SHAR_EOF
  852. $TOUCH -am 1224223990 'kbdtest.c' &&
  853. chmod 0664 kbdtest.c ||
  854. echo 'restore of kbdtest.c failed'
  855. Wc_c="`wc -c < 'kbdtest.c'`"
  856. test 2521 -eq "$Wc_c" ||
  857.     echo 'kbdtest.c: original size 2521, current size' "$Wc_c"
  858. # ============= logevent.c ==============
  859. echo 'x - extracting logevent.c (Text)'
  860. sed 's/^X//' << 'SHAR_EOF' > 'logevent.c' &&
  861. X/*+-------------------------------------------------------------------------
  862. X    logevent.c - log ecu event
  863. X    wht@n4hgf.Mt-Park.GA.US
  864. X--------------------------------------------------------------------------*/
  865. X/*+:EDITS:*/
  866. X/*:09-19-1990-19:36-wht@n4hgf-ecu_log_event now gets pid for log from caller */
  867. X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  868. X
  869. X#include <stdio.h>
  870. X#include <sys/locking.h>
  871. X#include "stdio_lint.h"
  872. X#include "lint_args.h"
  873. X
  874. X/*+-------------------------------------------------------------------------
  875. X    ecu_log_event(pid,event_note)
  876. X--------------------------------------------------------------------------*/
  877. Xvoid
  878. Xecu_log_event(pid,event_note)
  879. Xint pid;
  880. Xchar *event_note;
  881. X{
  882. Xchar tstr256[256];
  883. XFILE *ecu_log_fp;
  884. Xstatic char logname[128] = "";
  885. X
  886. X    if(!logname[0])
  887. X    {
  888. X        get_home_dir(tstr256);
  889. X        strcat(tstr256,"/.ecu/log");
  890. X    }
  891. X    if((ecu_log_fp = fopen(tstr256,"a")) != NULL)
  892. X    {
  893. X        locking(fileno(ecu_log_fp),LK_LOCK,0L);
  894. X        get_tod(2,tstr256);
  895. X        tstr256[10] = '-';
  896. X        fputs(tstr256,ecu_log_fp);
  897. X        fprintf(ecu_log_fp,"-%05d-",pid);
  898. X        fputs(event_note,ecu_log_fp);
  899. X        fputs("\n",ecu_log_fp);
  900. X        fflush(ecu_log_fp);
  901. X        locking(fileno(ecu_log_fp),LK_UNLCK,0L);
  902. X        fclose(ecu_log_fp);
  903. X    }
  904. X}    /* end of ecu_log_event */
  905. X
  906. X
  907. X/* vi: set tabstop=4 shiftwidth=4: */
  908. X/* end of logevent.c */
  909. SHAR_EOF
  910. $TOUCH -am 1224224090 'logevent.c' &&
  911. chmod 0644 logevent.c ||
  912. echo 'restore of logevent.c failed'
  913. Wc_c="`wc -c < 'logevent.c'`"
  914. test 1295 -eq "$Wc_c" ||
  915.     echo 'logevent.c: original size 1295, current size' "$Wc_c"
  916. # ============= nonansikey.c ==============
  917. echo 'x - extracting nonansikey.c (Text)'
  918. sed 's/^X//' << 'SHAR_EOF' > 'nonansikey.c' &&
  919. X/*+-----------------------------------------------------------------
  920. X    nonansikey.c - keyboard function key -> ECU internal
  921. X    wht@n4hgf.Mt-Park.GA.US
  922. X
  923. X  Defined functions:
  924. X    define_nonansi_key(bufptr)
  925. X    map_nonansi_key(buf,buflen)
  926. X    nonansi_key_init()
  927. X    nonansi_key_read(name)
  928. X
  929. X------------------------------------------------------------------*/
  930. X/*+:EDITS:*/
  931. X/*:12-01-1990-12:51-wht@n4hgf-creation, borrowing from and using ecufkey.c */
  932. X
  933. X#include "ecu.h"
  934. X#include "ecukey.h"
  935. X#include "ecufkey.h"
  936. X#include "ecuxkey.h"
  937. X#include "ecufork.h"
  938. X
  939. Xchar *keyset_idstr();
  940. X
  941. Xextern int tty_not_char_special;
  942. X
  943. XKDE nonansi_key_table[KDE_COUNT];
  944. Xchar nonansi_key_name[32] = "";
  945. X
  946. X/*+-------------------------------------------------------------------------
  947. X    nonansi_key_init()
  948. X--------------------------------------------------------------------------*/
  949. Xvoid
  950. Xnonansi_key_init()
  951. X{
  952. Xregister itmp;
  953. Xregister KDE *tkde;
  954. Xchar *make_char_graphic();
  955. X
  956. X    for(itmp = 0; itmp < KDE_COUNT; itmp++)
  957. X    {
  958. X        tkde = &nonansi_key_table[itmp];
  959. X        tkde->logical[0] = 0;
  960. X        tkde->count = 0;
  961. X        tkde->KDEt = (uchar)itmp;
  962. X    }
  963. X
  964. X    nonansi_key_name[0] = 0;
  965. X
  966. X}    /* end of nonansi_key_init */
  967. X
  968. X/*+-------------------------------------------------------------------------
  969. X    define_nonansi_key(bufptr)
  970. X
  971. X  returns 0 good keydef
  972. X         -1 if syntax error
  973. X--------------------------------------------------------------------------*/
  974. Xint
  975. Xdefine_nonansi_key(bufptr)
  976. Xregister char *bufptr;
  977. X{
  978. Xregister itmp;
  979. Xregister token_number;
  980. XKDE *tkde;
  981. Xint KDEt;
  982. Xint done = 0;
  983. Xchar token_separator[2];
  984. Xchar *token;
  985. Xchar *arg_token();
  986. Xchar *str_token();
  987. Xchar *strip_ld_break();
  988. X
  989. X    token_number = 0;
  990. X    strcpy(token_separator,":");
  991. X    while(!done && (token = (token_number < 2) ? str_token(bufptr,":")
  992. X                                               : arg_token(bufptr," \t")))
  993. X    {
  994. X        bufptr = (char *)0;    /* further calls to arg_token need NULL */
  995. X        token = skip_ld_break(token);
  996. X        strip_trail_break(token);
  997. X
  998. X        switch(token_number)
  999. X        {
  1000. X            case 0:        /* first field is key identifier */
  1001. X                if((KDEt = keyset_idnum(token)) < 0)
  1002. X                {
  1003. X                    ff(se,"  %s is not a legal key identifier\r\n",token);
  1004. X                    return(-1);
  1005. X                }
  1006. X                tkde = &nonansi_key_table[KDEt];
  1007. X                tkde->logical[0] = 0;
  1008. X                tkde->count = 0;
  1009. X                break;
  1010. X
  1011. X            case 1:        /* second field is logical key name */
  1012. X                if(*token == '#')
  1013. X                    goto MISSING_LABEL;
  1014. X                strncpy(tkde->logical,token,sizeof(tkde->logical));
  1015. X                tkde->logical[sizeof(tkde->logical) - 1] = 0;
  1016. X                strcpy(token_separator," \t"); /* space is tok sep now */
  1017. X                break;
  1018. X
  1019. X            case 2:        /* third field is first token of sequence */
  1020. X                if(*token == '#')
  1021. X                    goto MISSING_SEQUENCE;
  1022. X                if(((itmp = ascii_to_hex(token)) < 1) || (itmp >= SPACE))
  1023. X                {    /* make sure it is escape */
  1024. X                    ff(se,
  1025. X"  %s: first char in sequence must be in the range 0x01 to 0x1F not '%s'\r\n",
  1026. X                        keyset_idstr(KDEt),token);
  1027. X                    return(-1);
  1028. X                }
  1029. X
  1030. X            default:    /* third and subsequent to define key */
  1031. X                if(*token == '#')
  1032. X                    done = 1;
  1033. X                if(tkde->count == sizeof(tkde->str))
  1034. X                {
  1035. X                    ff(se,"  %s: output count too long",
  1036. X                        keyset_idstr(KDEt));
  1037. X                    return(-1);
  1038. X                }
  1039. X                if((itmp = ascii_to_hex(token)) < 0)
  1040. X                {
  1041. X                    ff(se,"  %s: '%s' invalid\r\n",
  1042. X                        keyset_idstr(KDEt),token);
  1043. X                    return(-1);
  1044. X                }
  1045. X                tkde->str[tkde->count] = itmp;
  1046. X                tkde->count++;
  1047. X                break;
  1048. X        }    /* end of switch(token_number) */
  1049. X
  1050. X        token_number++;
  1051. X
  1052. X    }        /* end while not end of record */
  1053. X
  1054. X    switch(token_number)
  1055. X    {
  1056. X        case 0:
  1057. X            ff(se,"define nonansi key logic error\r\n");
  1058. X            hangup(HANGUP_XMTR_LOGIC_ERROR);
  1059. X            break;
  1060. X        case 1:
  1061. XMISSING_LABEL:
  1062. X            ff(se,"%s: missing key label\r\n",keyset_idstr(KDEt));
  1063. X            break;
  1064. X        case 2:
  1065. XMISSING_SEQUENCE:
  1066. X            ff(se,"%s: missing char sequence\r\n",keyset_idstr(KDEt));
  1067. X            break;
  1068. X        default:
  1069. X            return(0);
  1070. X    }
  1071. X
  1072. X    return(-1);        /* error */
  1073. X
  1074. X}    /* end of define_nonansi_key */
  1075. X
  1076. X/*+-------------------------------------------------------------------------
  1077. X    nonansi_key_read(name) - read key-sequence-to-fkey map from nonansikeys
  1078. X--------------------------------------------------------------------------*/
  1079. Xvoid
  1080. Xnonansi_key_read(name)
  1081. Xchar *name;
  1082. X{
  1083. Xregister itmp;
  1084. Xregister char *cptr;
  1085. Xchar buf[128];
  1086. XFILE *fp_keys;
  1087. Xint errstat = 0;
  1088. Xstatic char ecukeys_name[128];
  1089. X
  1090. X    nonansi_key_init();    /* clear any previous key defns */
  1091. X
  1092. X    if(!ecukeys_name[0])
  1093. X    {
  1094. X        get_home_dir(ecukeys_name);
  1095. X        strcat(ecukeys_name,"/.ecu/nonansikeys");
  1096. X    }
  1097. X
  1098. X    if((fp_keys = fopen(ecukeys_name,"r")) == NULL)
  1099. X    {
  1100. X        ff(se,"%s not found; unable to proceed\r\n",ecukeys_name);
  1101. X        hangup(HANGUP_CONFIG_ERROR);
  1102. X    }
  1103. X
  1104. X/* find nonansi_key name */
  1105. X    errstat = 1;
  1106. X    while((itmp = kde_fgets(buf,sizeof(buf),fp_keys)) != KDEt_EOF)
  1107. X    {
  1108. X        if((itmp == KDEt_COMMENT) || (itmp == KDEt_ENTRY))
  1109. X            continue;
  1110. X        if(!strcmp(buf,name))
  1111. X        {
  1112. X            errstat = 0;        /* indicate success */
  1113. X            break;
  1114. X        }
  1115. X    }
  1116. X    if(errstat)
  1117. X    {
  1118. X        ff(se,"terminal type '%s' not found in %s; unable to proceed\r\n",
  1119. X            name,ecukeys_name);
  1120. X        hangup(HANGUP_CONFIG_ERROR);
  1121. X    }
  1122. X
  1123. X/* read past any other nonansi_key names matching this set */
  1124. X    errstat = 1;
  1125. X    while((itmp = kde_fgets(buf,sizeof(buf),fp_keys)) != KDEt_EOF)
  1126. X    {
  1127. X        if(itmp == KDEt_ENTRY)
  1128. X        {
  1129. X            errstat = 0;        /* indicate success */
  1130. X            break;
  1131. X        }
  1132. X    }
  1133. X    if(errstat)
  1134. X    {
  1135. X        ff(se,"terminal type '%s' has null entry in %s; unable to proceed\r\n",
  1136. X            name,ecukeys_name);
  1137. X        hangup(HANGUP_CONFIG_ERROR);
  1138. X    }
  1139. X
  1140. X/* we found the definition ... process it */
  1141. X    errstat = 0;
  1142. X    itmp = KDEt_ENTRY;
  1143. X    do {
  1144. X        if(itmp == KDEt_NAME)
  1145. X            break;
  1146. X        else if(itmp == KDEt_ENTRY)
  1147. X        {
  1148. X            if(define_nonansi_key(buf))
  1149. X                errstat = 1;
  1150. X        }
  1151. X    } while((itmp = kde_fgets(buf,sizeof(buf),fp_keys)) != KDEt_EOF);
  1152. X
  1153. X/* close up shop */
  1154. X    strncpy(nonansi_key_name,name,sizeof(nonansi_key_name));
  1155. X    nonansi_key_name[sizeof(nonansi_key_name) - 1] = 0;
  1156. X    fclose(fp_keys);
  1157. X
  1158. X    if(!nonansi_key_table[KDEk_HOME].count)
  1159. X    {
  1160. X        ff(se,"You MUST have a 'Home' key defined\r\n");
  1161. X        errstat = 2;
  1162. X    }
  1163. X    if(!nonansi_key_table[KDEk_END].count)
  1164. X    {
  1165. X        ff(se,"You MUST have a 'End' key defined\r\n");
  1166. X        errstat = 2;
  1167. X    }
  1168. X    if((errstat == 2) || (errstat && tty_not_char_special))
  1169. X        hangup(HANGUP_CONFIG_ERROR);
  1170. X
  1171. X    if(errstat)
  1172. X    {
  1173. X        ff(se,
  1174. X            "Warning: key definition syntax errors\r\nContinue anyway (y,n)? ");
  1175. X        if((itmp = ttygetc(0)) == 'Y' || (itmp == 'y'))
  1176. X        {
  1177. X            ff(se,"YES\r\n");
  1178. X            return;
  1179. X        }
  1180. X        ff(se,"NO\r\n");
  1181. X        hangup(HANGUP_CONFIG_ERROR);
  1182. X    }
  1183. X
  1184. X    /*NOTREACHED*/
  1185. X
  1186. X}    /* end of nonansi_key_read */
  1187. X
  1188. X/*+-------------------------------------------------------------------------
  1189. X    map_nonansi_key(buf,buflen) - map char sequence to KDEt code
  1190. X
  1191. Xreturn KDEt code or 255 if no match
  1192. X--------------------------------------------------------------------------*/
  1193. Xuchar
  1194. Xmap_nonansi_key(buf,buflen)
  1195. Xuchar *buf;
  1196. Xint buflen;
  1197. X{
  1198. Xregister ikde;
  1199. Xregister KDE *tkde;
  1200. X
  1201. X    if(!buflen)
  1202. X        return(255);
  1203. X
  1204. X    for(ikde = 0,tkde = nonansi_key_table; ikde < KDE_COUNT;
  1205. X        ikde++,tkde++)
  1206. X    {
  1207. X        if((tkde->count == buflen) && !memcmp(tkde->str,buf,buflen))
  1208. X        {
  1209. X            return(tkde->KDEt);
  1210. X        }
  1211. X    }
  1212. X    return(255);
  1213. X}    /* end of map_nonansi_key */
  1214. X
  1215. X/* end of nonansikey.c */
  1216. X/* vi: set tabstop=4 shiftwidth=4: */
  1217. SHAR_EOF
  1218. $TOUCH -am 1224224090 'nonansikey.c' &&
  1219. chmod 0644 nonansikey.c ||
  1220. echo 'restore of nonansikey.c failed'
  1221. Wc_c="`wc -c < 'nonansikey.c'`"
  1222. test 6955 -eq "$Wc_c" ||
  1223.     echo 'nonansikey.c: original size 6955, current size' "$Wc_c"
  1224. # ============= pcmd.c ==============
  1225. echo 'x - extracting pcmd.c (Text)'
  1226. sed 's/^X//' << 'SHAR_EOF' > 'pcmd.c' &&
  1227. X/*+-------------------------------------------------------------------------
  1228. X    pcmd.c - ecu miscellaneous procedure commands
  1229. X    wht@n4hgf.Mt-Park.GA.US
  1230. X
  1231. X  Defined functions:
  1232. X    pcmd_baud(param)
  1233. X    pcmd_cd(param)
  1234. X    pcmd_clrx(param)
  1235. X    pcmd_dial(param)
  1236. X    pcmd_duplex(param)
  1237. X    pcmd_echo(param)
  1238. X    pcmd_exit(param)
  1239. X    pcmd_flush(param)
  1240. X    pcmd_hangup(param)
  1241. X    pcmd_hexdump(param)
  1242. X    pcmd_lbreak(param)
  1243. X    pcmd_lgets(param)
  1244. X    pcmd_logevent(param)
  1245. X    pcmd_lookfor(param)
  1246. X    pcmd_nap(param)
  1247. X    pcmd_parity(param)
  1248. X    pcmd_prompt(param)
  1249. X    pcmd_ptrace(param)
  1250. X    pcmd_rtscts(param)
  1251. X    pcmd_send(param)
  1252. X    pcmd_set(param)
  1253. X    pcmd_system(param)
  1254. X    pcmd_xon(param)
  1255. X
  1256. X--------------------------------------------------------------------------*/
  1257. X/*+:EDITS:*/
  1258. X/*:12-26-1990-02:34-wht@n4hgf-add cmd_rtscts */
  1259. X/*:12-03-1990-04:59-wht@n4hgf-beef up pcmd_exit */
  1260. X/*:09-19-1990-19:36-wht@n4hgf-ecu_log_event now gets pid for log from caller */
  1261. X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  1262. X
  1263. X#include "ecu.h"
  1264. X#include "ecuerror.h"
  1265. X#include "ecuhangup.h"
  1266. X#include "ecukey.h"
  1267. X#include "esd.h"
  1268. X#include "var.h"
  1269. X#include "proc.h"
  1270. X
  1271. Xchar *strchr();
  1272. X
  1273. Xextern int proctrace;
  1274. Xextern int rcvr_pid;
  1275. Xextern ulong colors_current;
  1276. Xextern char errmsg[];
  1277. X
  1278. X/*+-------------------------------------------------------------------------
  1279. X    pcmd_baud(param)
  1280. X--------------------------------------------------------------------------*/
  1281. Xint
  1282. Xpcmd_baud(param)
  1283. XESD *param;
  1284. X{
  1285. Xlong new_baud;
  1286. Xint erc;
  1287. X
  1288. X    if(shm->Liofd < 0)
  1289. X        return(eNoLineAttached);
  1290. X
  1291. X    if(erc = gint(param,&new_baud))
  1292. X        return(erc);
  1293. X    if(!valid_baud_rate((uint)new_baud))
  1294. X    {
  1295. X        pprintf("invalid baud rate: %lu\n",new_baud);
  1296. X        return(eFATAL_ALREADY);
  1297. X    }
  1298. X    shm->Lbaud = (uint)new_baud;
  1299. X    lset_baud_rate(1);
  1300. X    if(proctrace)
  1301. X    {
  1302. X        pprintf("baud rate set to %u\n",shm->Lbaud);
  1303. X    }
  1304. X    return(0);
  1305. X
  1306. X}    /* end of pcmd_baud */
  1307. X
  1308. X/*+-------------------------------------------------------------------------
  1309. X    pcmd_cd(param)
  1310. X--------------------------------------------------------------------------*/
  1311. Xint
  1312. Xpcmd_cd(param)
  1313. XESD *param;
  1314. X{
  1315. Xint erc;
  1316. XESD *tesd = make_esd(256);
  1317. Xextern char curr_dir[];        /* current working directory */
  1318. X
  1319. X    if(!tesd)
  1320. X        return(eNoMemory);
  1321. X    if(erc = gstr(param,tesd,0))
  1322. X        goto RETURN;
  1323. X    if(expand_dirname(tesd->pb,tesd->maxcb))
  1324. X    {
  1325. X        pprintf("%s\n",errmsg);
  1326. X        param->index = param->old_index;
  1327. X        erc = eFATAL_ALREADY;
  1328. X        goto RETURN;
  1329. X    }
  1330. X    if(chdir(tesd->pb) < 0)        /* now change to the new directory */
  1331. X    {
  1332. X        pperror(tesd->pb);        /* print error if we get one */
  1333. X        pputs("\n");
  1334. X        erc = eFATAL_ALREADY;
  1335. X        goto RETURN;
  1336. X    }
  1337. X    get_curr_dir(curr_dir,256);
  1338. X
  1339. XRETURN:
  1340. X    free_esd(tesd);
  1341. X    return(erc);
  1342. X}    /* end of pcmd_cd */
  1343. X
  1344. X/*+-------------------------------------------------------------------------
  1345. X    pcmd_clrx(param)
  1346. X--------------------------------------------------------------------------*/
  1347. Xint
  1348. Xpcmd_clrx(param)
  1349. XESD *param;
  1350. X{
  1351. X    if(shm->Liofd < 0)
  1352. X        return(eNoLineAttached);
  1353. X
  1354. X    lclear_xmtr_xoff();
  1355. X    if(proctrace)
  1356. X        pputs("transmitter XOFF cleared\n");
  1357. X    return(0);
  1358. X}    /* end of pcmd_clrx */
  1359. X
  1360. X/*+-------------------------------------------------------------------------
  1361. X    pcmd_dial(param)
  1362. X
  1363. X  DCE_dial does the following:
  1364. X  sets I0 to 0==connect,
  1365. X             1==failed to connect,
  1366. X             2==interrupted,
  1367. X             3==modem error
  1368. X  sets S0 to modem result code
  1369. X--------------------------------------------------------------------------*/
  1370. Xint
  1371. Xpcmd_dial(param)
  1372. XESD *param;
  1373. X{
  1374. Xint erc;
  1375. XESD *tesd = (ESD *)0;
  1376. X
  1377. X    if(shm->Lmodem_off_hook)
  1378. X    {
  1379. X        pputs("Already off hook\n");
  1380. X        return(eFATAL_ALREADY);
  1381. X    }
  1382. X    if(!(tesd = make_esd(64)))
  1383. X        return(eNoMemory);
  1384. X    if(erc = gstr(param,tesd,0))
  1385. X    {
  1386. X        free_esd(tesd);
  1387. X        return(erc);
  1388. X    }
  1389. X    strcpy(shm->Llogical,tesd->pb);
  1390. X    lclear_xmtr_xoff();
  1391. X    if(lookup_logical_telno())
  1392. X        (void)DCE_dial();
  1393. X    else
  1394. X    {
  1395. X        pprintf("No such entry: %s\n",tesd->pb);
  1396. X        erc = eFATAL_ALREADY;
  1397. X    }
  1398. X
  1399. X    if(!erc && (shm->Liofd < 0))
  1400. X        erc = eNoLineAttached;
  1401. X
  1402. X    free_esd(tesd);
  1403. X
  1404. X    return(erc);
  1405. X}    /* end of pcmd_dial */
  1406. X
  1407. X/*+-------------------------------------------------------------------------
  1408. X    pcmd_duplex(param)
  1409. Xduplex [f | h]
  1410. Xduplex ['f' | 'h']
  1411. Xduplex <int>  0 == half, non-0 == full
  1412. X--------------------------------------------------------------------------*/
  1413. Xint
  1414. Xpcmd_duplex(param)
  1415. XESD *param;
  1416. X{
  1417. Xint erc;
  1418. Xint new_duplex;
  1419. XESD *tesd;
  1420. X
  1421. X    if(erc = skip_cmd_break(param))
  1422. X        return(erc);
  1423. X    if(!(tesd = make_esd(64)))
  1424. X        return(eNoMemory);
  1425. X    erc = gstr(param,tesd,0);
  1426. X    new_duplex = to_lower((erc) ? param->pb[param->index] : *tesd->pb);
  1427. X    free_esd(tesd);
  1428. X    erc = 0;
  1429. X
  1430. X    switch(new_duplex)
  1431. X    {
  1432. X        case 'f':
  1433. X            shm->Lfull_duplex = 1;
  1434. X            break;
  1435. X        case 'h':
  1436. X            shm->Lfull_duplex = 0;
  1437. X            break;
  1438. X        default:
  1439. X            erc = eBadParameter;
  1440. X    }
  1441. X    if(proctrace && !erc)
  1442. X        pprintf("duplex set to %s\n",(shm->Lfull_duplex) ? "full" : "half");
  1443. X    return(erc);
  1444. X
  1445. X}    /* end of pcmd_duplex */
  1446. X
  1447. X/*+-------------------------------------------------------------------------
  1448. X    pcmd_echo(param)
  1449. Xecho [-n] <str>
  1450. X--------------------------------------------------------------------------*/
  1451. Xint
  1452. Xpcmd_echo(param)
  1453. XESD *param;
  1454. X{
  1455. Xint erc;
  1456. XESD *tesd;
  1457. Xchar switches[8];
  1458. X
  1459. X    if((tesd = make_esd(256)) == (ESD *)0)
  1460. X        return(eNoMemory);
  1461. X
  1462. X    get_switches(param,switches,sizeof(switches));
  1463. X
  1464. X    if(erc = gstr(param,tesd,1))
  1465. X    {
  1466. X        free_esd(tesd);
  1467. X        return(erc);
  1468. X    }
  1469. X    pputs(tesd->pb);
  1470. X    if(!strchr(switches,'n'))    /* if no -n */
  1471. X        pputs("\n");
  1472. X    free_esd(tesd);
  1473. X    return(0);
  1474. X
  1475. X}    /* end of pcmd_echo */
  1476. X
  1477. X/*+-------------------------------------------------------------------------
  1478. X    pcmd_exit(param)
  1479. X--------------------------------------------------------------------------*/
  1480. Xint
  1481. Xpcmd_exit(param)
  1482. XESD *param;
  1483. X{
  1484. Xlong int1;
  1485. Xulong colors_at_entry = colors_current;
  1486. X
  1487. X    if(!gint(param,&int1) && int1)
  1488. X    {
  1489. X        setcolor(colors_error);
  1490. X        pprintf("[procedure exiting ecu: user code %ld]\n",int1);
  1491. X        setcolor(colors_at_entry);
  1492. X        if((int1 += HANGUP_USER1 - 1) > HANGUP_USERN)
  1493. X        {
  1494. X            int1 = HANGUP_USERN;
  1495. X            ff(se,"user exit code too large, using %d\r\n",
  1496. X                HANGUP_USERN - HANGUP_USER1);
  1497. X        }
  1498. X        hangup((int)int1);
  1499. X    }
  1500. X    setcolor(colors_success);
  1501. X    pputs("[procedure exiting ecu: normal exit]\n");
  1502. X    setcolor(colors_at_entry);
  1503. X    hangup(0);
  1504. X}    /* end of pcmd_exit */
  1505. X
  1506. X/*+-------------------------------------------------------------------------
  1507. X    pcmd_lgets(param)
  1508. X
  1509. Xlgets [-er] <strvar> <int1> <int2> [<str>]
  1510. X
  1511. Xread string into string variable number <stvar>
  1512. Xwaiting <int1> 1/10th secs for first char,
  1513. Xwaiting <int2> 1/10th secs for subsequent chars,
  1514. Xoptionally terminating read upon detection of <str>
  1515. X-e echos to screen
  1516. X-r completely raw, else strip CRs & NLs from either end of string
  1517. X$i0 receives the length of the read
  1518. X<strvar> receives the string
  1519. X--------------------------------------------------------------------------*/
  1520. Xint
  1521. Xpcmd_lgets(param)
  1522. XESD *param;
  1523. X{
  1524. Xint erc;
  1525. Xlong int2;
  1526. Xlong int3;
  1527. XESD *tesd1 = (ESD *)0;
  1528. XESD *svptr;
  1529. XLRWT lr;
  1530. Xchar switches[8];
  1531. XESD *make_esd();
  1532. Xchar ctmp;
  1533. X
  1534. X    if(shm->Liofd < 0)
  1535. X        return(eNoLineAttached);
  1536. X
  1537. X    get_switches(param,switches,sizeof(switches));
  1538. X
  1539. X    skip_cmd_char(param,'$');
  1540. X    if(erc = get_cmd_char(param,&ctmp))
  1541. X        return(erc);
  1542. X    if(to_lower(ctmp) != 's')
  1543. X        return(eIllegalVarType);
  1544. X    if(erc = get_svptr(param,&svptr,1))
  1545. X        return(erc);
  1546. X
  1547. X    if(erc = gint(param,&int2))
  1548. X        return(erc);
  1549. X
  1550. X    if(erc = gint(param,&int3))
  1551. X        return(erc);
  1552. X
  1553. X    if((tesd1 = make_esd(64)) == (ESD *)0)
  1554. X        return(eNoMemory);
  1555. X    if(gstr(param,tesd1,1))    /* optional delimiter */
  1556. X    {
  1557. X        free_esd(tesd1);
  1558. X        tesd1 = (ESD *)0;
  1559. X    }    
  1560. X
  1561. X    zero_esd(svptr);
  1562. X
  1563. X    lr.to1 = int2 * 100L;
  1564. X    lr.to2 = int3 * 100L;
  1565. X    /* allow interrupts + raw read per -r */
  1566. X    lr.raw_flag = (strchr(switches,'r')) ? 0x81 : 0x80;
  1567. X    lr.buffer = svptr->pb;
  1568. X    lr.bufsize = svptr->maxcb;
  1569. X    lr.delim = (tesd1) ? tesd1->pb : (char *)0;
  1570. X    lr.echo = (strchr(switches,'e') != (char *)0);
  1571. X    (void)lgets_timeout(&lr);
  1572. X    if(tesd1)
  1573. X        free_esd(tesd1);
  1574. X
  1575. X    svptr->cb = lr.count;
  1576. X    null_terminate_esd(svptr);
  1577. X    iv[0] = (long)lr.count;
  1578. X    if(proctrace)
  1579. X        pprintf("lgets read %d chars\n",lr.count);
  1580. X    return(0);
  1581. X
  1582. X}    /* end of pcmd_lgets */
  1583. X
  1584. X/*+-------------------------------------------------------------------------
  1585. X    pcmd_flush(param)
  1586. X--------------------------------------------------------------------------*/
  1587. Xint
  1588. Xpcmd_flush(param)
  1589. XESD *param;
  1590. X{
  1591. X    if(shm->Liofd < 0)
  1592. X        return(eNoLineAttached);
  1593. X
  1594. X    lflush(2);
  1595. X    if(proctrace)
  1596. X        pputs("line flushed\n");
  1597. X    return(0);
  1598. X}    /* end of pcmd_flush */
  1599. X
  1600. X/*+-------------------------------------------------------------------------
  1601. X    pcmd_hangup(param)
  1602. X--------------------------------------------------------------------------*/
  1603. Xint
  1604. Xpcmd_hangup(param)
  1605. XESD *param;
  1606. X{
  1607. X    if(shm->Liofd < 0)
  1608. X    {
  1609. X        if(proctrace)
  1610. X            pputs("no line attached ... hangup ignored\n");
  1611. X        DCE_now_on_hook();
  1612. X        return(0);
  1613. X    }
  1614. X
  1615. X    if(proctrace)
  1616. X        pputs("hanging up ... ");
  1617. X    DCE_hangup();
  1618. X    if(proctrace)
  1619. X        pputs("line on hook\n");
  1620. X    return(0);
  1621. X}    /* end of pcmd_hangup */
  1622. X
  1623. X/*+-------------------------------------------------------------------------
  1624. X    pcmd_hexdump(param)
  1625. X
  1626. Xhexdump [-s] <str>
  1627. Xhexdump -t[s] <str1> <str>
  1628. X<str> buf to dump
  1629. X<str1> title (if -t)
  1630. X-s short (terse) dump
  1631. X--------------------------------------------------------------------------*/
  1632. Xint
  1633. Xpcmd_hexdump(param)
  1634. XESD *param;
  1635. X{
  1636. Xint erc;
  1637. XESD *title = (ESD *)0;
  1638. XESD *buf;
  1639. Xchar switches[8];
  1640. Xextern FILE *plog_fp;
  1641. X
  1642. X    if((buf = make_esd(256)) == (ESD *)0)
  1643. X        return(eNoMemory);
  1644. X
  1645. X    get_switches(param,switches,sizeof(switches));
  1646. X
  1647. X    if(strchr(switches,'t'))    /* if -t */
  1648. X    {
  1649. X        if((title = make_esd(256)) == (ESD *)0)
  1650. X        {
  1651. X            erc = eNoMemory;
  1652. X            goto RETURN;
  1653. X        }
  1654. X        if(erc = gstr(param,title,0))
  1655. X            goto RETURN;
  1656. X    }
  1657. X
  1658. X    if(erc = gstr(param,buf,1))
  1659. X        goto RETURN;
  1660. X
  1661. X    hex_dump(buf->pb,buf->cb,(title) ? title->pb : "",
  1662. X        (strchr(switches,'s')) ? 1 : 0);
  1663. X
  1664. X    if(plog_fp)
  1665. X        hex_dump_fp(plog_fp,buf->pb,buf->cb,(title) ? title->pb : "",
  1666. X            (strchr(switches,'s')) ? 1 : 0);
  1667. X
  1668. XRETURN:
  1669. X    free_esd(buf);
  1670. X    if(title)
  1671. X        free_esd(title);
  1672. X    return(erc);
  1673. X
  1674. X}    /* end of pcmd_hexdump */
  1675. X
  1676. X/*+-------------------------------------------------------------------------
  1677. X    pcmd_lbreak(param)
  1678. X--------------------------------------------------------------------------*/
  1679. Xint
  1680. Xpcmd_lbreak(param)
  1681. XESD *param;
  1682. X{
  1683. X    if(shm->Liofd < 0)
  1684. X        return(eNoLineAttached);
  1685. X
  1686. X    lbreak();
  1687. X    return(0);
  1688. X}    /* end of pcmd_lbreak */
  1689. X
  1690. X/*+-------------------------------------------------------------------------
  1691. X    pcmd_logevent(param)
  1692. X
  1693. Xlogevent 'cmd'
  1694. X--------------------------------------------------------------------------*/
  1695. Xint
  1696. Xpcmd_logevent(param)
  1697. XESD *param;
  1698. X{
  1699. Xint erc;
  1700. XESD *eventstr;
  1701. Xextern int last_child_wait_status;
  1702. Xchar switches[8];
  1703. X
  1704. X    if((eventstr = make_esd(256)) == (ESD *)0)
  1705. X        return(eNoMemory);
  1706. X
  1707. X    get_switches(param,switches,sizeof(switches));
  1708. X
  1709. X/* a hack */
  1710. X    strcpy(eventstr->pb,"PROC ");
  1711. X    eventstr->pb += 5;
  1712. X    eventstr->maxcb -= 5;
  1713. X
  1714. X    if(erc = gstr(param,eventstr,0))
  1715. X    {
  1716. X        eventstr->pb -= 5;        /* be nice */
  1717. X        eventstr->maxcb += 5;    /* or surely this will haunt us one day */
  1718. X        free_esd(eventstr);
  1719. X        return(erc);
  1720. X    }
  1721. X
  1722. X/* rehack */
  1723. X    eventstr->pb -= 5;
  1724. X    eventstr->maxcb += 5;
  1725. X    eventstr->cb += 5;
  1726. X
  1727. X    ecu_log_event(getpid(),eventstr->pb);
  1728. X    free_esd(eventstr);
  1729. X    return(0);
  1730. X
  1731. X}    /* end of eventstr_logevent */
  1732. X
  1733. X/*+-------------------------------------------------------------------------
  1734. X    pcmd_lookfor(param)
  1735. X
  1736. Xlookfor [-e] [quiet | <str>] [<int>]
  1737. X
  1738. X-e echo to screen while looking
  1739. Xquiet means look for quiet
  1740. X<str> means look for string
  1741. X<int> number 1/10ths secs (default 5.0 second) for timeout
  1742. X
  1743. Xin case of lookfor <str>, $i0 plugged 1 if found, else 0
  1744. X--------------------------------------------------------------------------*/
  1745. Xint
  1746. Xpcmd_lookfor(param)
  1747. XESD *param;
  1748. X{
  1749. Xint erc;
  1750. Xchar switches[8];
  1751. Xchar *cptr = (char *)0;
  1752. XESD *tesd = (ESD *)0;
  1753. Xulong decisecs = 50; /* default wait is 5 seconds */
  1754. Xint echo_flag;
  1755. Xchar quiet[8];
  1756. Xlong start_secs;
  1757. Xlong time();
  1758. X
  1759. X    if(shm->Liofd < 0)
  1760. X        return(eNoLineAttached);
  1761. X
  1762. X    get_switches(param,switches,sizeof(switches));
  1763. X    echo_flag = (strchr(switches,'e') != (char *)0);
  1764. X
  1765. X    if(!get_alpha_zstr(param,quiet,sizeof(quiet)))
  1766. X    {
  1767. X        if(strcmp(quiet,"quiet"))
  1768. X            return(eSyntaxError);
  1769. X    } 
  1770. X    else
  1771. X    {
  1772. X        if((tesd = make_esd(64)) == (ESD *)0)
  1773. X            return(eNoMemory);
  1774. X        if(erc = gstr(param,tesd,0))
  1775. X            goto RETURN;
  1776. X        if(!tesd->cb)
  1777. X        {
  1778. X            pputs("lookfor null string\n");
  1779. X            erc = eFATAL_ALREADY;
  1780. X            goto RETURN;
  1781. X        }
  1782. X        cptr = tesd->pb;
  1783. X    }
  1784. X
  1785. X    if(erc = gint(param,&decisecs))
  1786. X    {
  1787. X        /* if something there non-integer */
  1788. X        if(!end_of_cmd(param))
  1789. X        {
  1790. X            erc = eSyntaxError;
  1791. X            goto RETURN;
  1792. X        }
  1793. X    }
  1794. X    erc = 0;
  1795. X
  1796. X    if(proctrace)
  1797. X        time(&start_secs);
  1798. X
  1799. X    if(cptr)
  1800. X    {
  1801. X        iv[0] = (long)llookfor(cptr,decisecs * 100L,echo_flag);
  1802. X        if(proctrace)
  1803. X            pprintf("llookfor set $i00 = %ld\n",iv[0]);
  1804. X    }
  1805. X    else
  1806. X        lquiet(decisecs * 100L,echo_flag);
  1807. X
  1808. X    if(proctrace)
  1809. X        pprintf("waited %ld secs\n",time((long *)0) - start_secs);
  1810. X
  1811. XRETURN:
  1812. X    if(tesd)
  1813. X        free_esd(tesd);
  1814. X    return(erc);
  1815. X
  1816. X}    /* end of pcmd_lookfor */
  1817. X
  1818. X/*+-------------------------------------------------------------------------
  1819. X    pcmd_nap(param)
  1820. Xnap [-m] <int>
  1821. X<int> number 1/10ths secs, except if -m, nap <int> milliseconds
  1822. X--------------------------------------------------------------------------*/
  1823. Xint
  1824. Xpcmd_nap(param)
  1825. XESD *param;
  1826. X{
  1827. Xint erc;
  1828. Xchar switches[8];
  1829. Xulong interval;
  1830. X
  1831. X    get_switches(param,switches,sizeof(switches));
  1832. X
  1833. X    if(erc = gint(param,&interval))
  1834. X        return(erc);
  1835. X    if(interval)
  1836. X    {
  1837. X        if(strchr(switches,'m'))
  1838. X            nap(interval);
  1839. X        else
  1840. X            nap(interval * 100L);
  1841. X    }
  1842. X    return(0);
  1843. X}    /* end of pcmd_nap */
  1844. X
  1845. X/*+-------------------------------------------------------------------------
  1846. X    pcmd_parity(param)
  1847. Xparity [e | o | n]
  1848. Xparity ['e' | 'o' | 'n']
  1849. X--------------------------------------------------------------------------*/
  1850. Xint
  1851. Xpcmd_parity(param)
  1852. XESD *param;
  1853. X{
  1854. Xint erc;
  1855. Xint new_parity = 0;
  1856. XESD *tesd;
  1857. X
  1858. X    if(shm->Liofd < 0)
  1859. X        return(eNoLineAttached);
  1860. X
  1861. X    if(erc = skip_cmd_break(param))
  1862. X        return(erc);
  1863. X    if(!(tesd = make_esd(64)))
  1864. X        return(eNoMemory);
  1865. X    erc = gstr(param,tesd,0);
  1866. X    new_parity = to_lower((erc) ? param->pb[param->index] : *tesd->pb);
  1867. X    if(!erc && !tesd->cb)
  1868. X        new_parity = 'n';
  1869. X    free_esd(tesd);
  1870. X
  1871. X    switch(new_parity)
  1872. X    {
  1873. X        case 'n':
  1874. X            new_parity = 0;
  1875. X        case 'e':
  1876. X        case 'o':
  1877. X            shm->Lparity = new_parity;
  1878. X            lset_parity(1);
  1879. X            break;
  1880. X        default:
  1881. X            erc = eBadParameter;
  1882. X    }
  1883. X    if(proctrace && !erc)
  1884. X        pprintf("parity set to %s\n",
  1885. X            (shm->Lparity) ? ((shm->Lparity == 'e') ? "even" : "odd")
  1886. X                           : "none");
  1887. X    return(erc);
  1888. X
  1889. X}    /* end of pcmd_parity */
  1890. X
  1891. X/*+-------------------------------------------------------------------------
  1892. X    pcmd_prompt(param)
  1893. X--------------------------------------------------------------------------*/
  1894. Xint
  1895. Xpcmd_prompt(param)
  1896. XESD *param;
  1897. X{
  1898. Xextern ESD *icmd_prompt;
  1899. X
  1900. X    return(gstr(param,icmd_prompt,0));
  1901. X}    /* end of pcmd_prompt */
  1902. X
  1903. X/*+-------------------------------------------------------------------------
  1904. X    pcmd_ptrace(param)
  1905. X--------------------------------------------------------------------------*/
  1906. Xint
  1907. Xpcmd_ptrace(param)
  1908. XESD *param;
  1909. X{
  1910. Xchar s8[8];
  1911. Xregister itmp;
  1912. X
  1913. X    if(get_alpha_zstr(param,s8,sizeof(s8)))
  1914. X        return(eSyntaxError);
  1915. X    itmp = strlen(s8);
  1916. X    while(itmp--)
  1917. X        s8[itmp] = to_lower(s8[itmp]);
  1918. X    if(!strcmp(s8,"on"))
  1919. X        proctrace = 1;
  1920. X    else if(!strcmp(s8,"off"))
  1921. X        proctrace = 0;
  1922. X    else
  1923. X        return(eSyntaxError);
  1924. X    return(0);
  1925. X}    /* end of pcmd_ptrace */
  1926. X
  1927. X/*+-------------------------------------------------------------------------
  1928. X    pcmd_rname(param) - set remote name
  1929. X--------------------------------------------------------------------------*/
  1930. Xint
  1931. Xpcmd_rname(param)
  1932. XESD *param;
  1933. X{
  1934. Xint erc;
  1935. XESD *rname;
  1936. X
  1937. X    if(shm->Liofd < 0)
  1938. X        return(eNoLineAttached);
  1939. X    if(!shm->Lmodem_off_hook)
  1940. X    {
  1941. X        pputs("Not connected\n");
  1942. X        return(eFATAL_ALREADY);
  1943. X    }
  1944. X
  1945. X    if((rname = make_esd(sizeof(shm->Lrname) - 1)) == (ESD *)0)
  1946. X        return(eNoMemory);
  1947. X
  1948. X    if(!(erc = gstr(param,rname,0)))
  1949. X    {
  1950. X        strcpy(shm->Lrname,rname->pb);
  1951. X        if(proctrace)
  1952. X            pprintf("rname set to '%s'\n",rname->pb);
  1953. X    }
  1954. X    free_esd(rname);
  1955. X    return(erc);
  1956. X
  1957. X}    /* end of pcmd_rname */
  1958. X
  1959. X/*+-------------------------------------------------------------------------
  1960. X    pcmd_send(param)
  1961. Xsend [-n] <str>
  1962. X-n do not send trailing CR
  1963. X--------------------------------------------------------------------------*/
  1964. Xint
  1965. Xpcmd_send(param)
  1966. XESD *param;
  1967. X{
  1968. Xint erc;
  1969. XESD *buf;
  1970. Xchar switches[8];
  1971. X
  1972. X    if(shm->Liofd < 0)
  1973. X        return(eNoLineAttached);
  1974. X
  1975. X    if((buf = make_esd(256)) == (ESD *)0)
  1976. X        return(eNoMemory);
  1977. X
  1978. X    get_switches(param,switches,sizeof(switches));
  1979. X
  1980. X    if(erc = gstr(param,buf,1))
  1981. X    {
  1982. X        free_esd(buf);
  1983. X        return(erc);
  1984. X    }
  1985. X
  1986. X    lputs(buf->pb);
  1987. X
  1988. X    if(!strchr(switches,'n'))
  1989. X        lputc(CR);
  1990. X
  1991. X    free_esd(buf);
  1992. X    return(erc);
  1993. X}    /* end of pcmd_send */
  1994. X
  1995. X/*+-------------------------------------------------------------------------
  1996. X    pcmd_set(param)
  1997. X--------------------------------------------------------------------------*/
  1998. Xint
  1999. Xpcmd_set(param)
  2000. XESD *param;
  2001. X{
  2002. Xint erc;
  2003. Xint itmp;
  2004. Xulong varnum;
  2005. Xuint varmax;
  2006. Xchar vartype;
  2007. Xchar varstr[16];
  2008. Xint show_status;
  2009. Xlong *ivptr;
  2010. XESD *svptr;
  2011. Xchar *cptr;
  2012. Xchar *make_char_graphic();
  2013. X
  2014. X    if(erc = skip_cmd_break(param))
  2015. X        return(erc);
  2016. X
  2017. X    do {
  2018. X        /* $ is optional */
  2019. X        if((erc = skip_cmd_char(param,'$')) && (erc != eSyntaxError))
  2020. X            return(erc);
  2021. X        /* get variable type */
  2022. X        if(get_cmd_char(param,&vartype))
  2023. X            return(eSyntaxError);
  2024. X        /* validate variable type */
  2025. X        vartype = to_lower(vartype);
  2026. X        switch(vartype)
  2027. X        {
  2028. X            case 'i':
  2029. X                varmax = IVQUAN;
  2030. X                break;
  2031. X            case 's':
  2032. X                varmax = SVQUAN;
  2033. X                break;
  2034. X            default:
  2035. X                return(eIllegalVarType);
  2036. X        }
  2037. X
  2038. X        if(!get_numeric_value(param,&varnum))
  2039. X            goto TEST_VARNUM;
  2040. X        else if(*(param->pb + param->index) == '[')
  2041. X        {
  2042. X            if(erc = get_subscript(param,&varnum))
  2043. X                return(erc);
  2044. XTEST_VARNUM:
  2045. X            if((int)varnum >= varmax)
  2046. X                return(eIllegalVarNumber);
  2047. X            switch(vartype)
  2048. X            {
  2049. X                case 'i':
  2050. X                    ivptr = &iv[(int)varnum];
  2051. X                    break;
  2052. X                default:
  2053. X                    svptr = sv[(int)varnum];
  2054. X            }
  2055. X        }
  2056. X        else if(get_alphanum_zstr(param,varstr,sizeof(varstr)))
  2057. X            return(eInvalidVarName);
  2058. X        else
  2059. X        {
  2060. X            varnum = 0x1000L;
  2061. X            switch(vartype)
  2062. X            {
  2063. X                case 'i':
  2064. X                    erc = find_mkvi(varstr,&ivptr,1);
  2065. X                    break;
  2066. X                default:
  2067. X                    erc = find_mkvs(varstr,&svptr,1);
  2068. X            }
  2069. X            if(erc)
  2070. X                return(erc);
  2071. X        }
  2072. X            
  2073. X        show_status = 1;
  2074. X        if(!skip_cmd_char(param,'='))    /* assignment */
  2075. X        {
  2076. X            switch(vartype)
  2077. X            {
  2078. X                case 'i':
  2079. X                    if(erc = gint(param,ivptr))
  2080. X                        return(erc);
  2081. X                    break;
  2082. X                default:
  2083. X                    if(erc = gstr(param,svptr,1))
  2084. X                        return(erc);
  2085. X                    break;
  2086. X            }
  2087. X            if(!proctrace)
  2088. X                show_status = 0;
  2089. X        }
  2090. X        if(show_status)
  2091. X        {
  2092. X            switch(vartype)
  2093. X            {
  2094. X                case 'i':
  2095. X                    if(varnum != 0x1000L)
  2096. X                        pprintf("$i%02ld = %7ld (0x%08lx,0%lo)\n",varnum,
  2097. X                            *ivptr,*ivptr,*ivptr);
  2098. X                    else
  2099. X                        pprintf("$i%s = %ld (0x%08lx,0%lo)\n",varstr,
  2100. X                            *ivptr,*ivptr,*ivptr);
  2101. X                    break;
  2102. X                default:
  2103. X                    if(varnum != 0x1000L)
  2104. X                        pprintf("$s%02ld = '",varnum);
  2105. X                    else
  2106. X                        pprintf("$s%s = '",varstr);
  2107. X                    itmp = svptr->cb;
  2108. X                    cptr = svptr->pb;
  2109. X                    while(itmp--)
  2110. X                        pputs(make_char_graphic(*cptr++,0));
  2111. X                    pputs("'\n");
  2112. X                    break;
  2113. X            }
  2114. X        }
  2115. X    } while(!skip_comma(param));
  2116. X
  2117. X    if(!end_of_cmd(param))
  2118. X        return(eSyntaxError);
  2119. X
  2120. X    return(0);
  2121. X}    /* end of pcmd_set */
  2122. X
  2123. X/*+-------------------------------------------------------------------------
  2124. X    pcmd_system(param)
  2125. X
  2126. Xsystem [-l] 'cmd'
  2127. X-l makes comm line stdin/stdout
  2128. X-s keeps all fds the same
  2129. X
  2130. Xreturns $i0 set to exit status of program or 0x100 if interrupted
  2131. X--------------------------------------------------------------------------*/
  2132. Xint
  2133. Xpcmd_system(param)
  2134. XESD *param;
  2135. X{
  2136. Xint erc;
  2137. XESD *cmd;
  2138. Xextern int last_child_wait_status;
  2139. Xchar switches[8];
  2140. X
  2141. X    if((cmd = make_esd(256)) == (ESD *)0)
  2142. X        return(eNoMemory);
  2143. X
  2144. X    get_switches(param,switches,sizeof(switches));
  2145. X
  2146. X/* a hack */
  2147. X    *cmd->pb++ = (strchr(switches,'s')) ? '>' : 
  2148. X        ((strchr(switches,'l')) ? '$' : '!');
  2149. X
  2150. X    cmd->maxcb--;
  2151. X
  2152. X    if(erc = gstr(param,cmd,1))
  2153. X    {
  2154. X        cmd->pb--;        /* be nice */
  2155. X        cmd->maxcb++;    /* or surely this will haunt us one day */
  2156. X        free_esd(cmd);
  2157. X        return(erc);
  2158. X    }
  2159. X
  2160. X/* rehack */
  2161. X    cmd->pb--;
  2162. X    cmd->cb++;
  2163. X    cmd->maxcb++;
  2164. X
  2165. X    if(proctrace)
  2166. X    {
  2167. X        pputs(cmd->pb + 1);
  2168. X        pputs("\n");
  2169. X    }
  2170. X
  2171. X    last_child_wait_status = 0xFF00;
  2172. X    shell(cmd->pb);
  2173. X    iv[0] = (last_child_wait_status & 0xFF)
  2174. X            ? 0x100L : (long)last_child_wait_status >> 8;
  2175. X    if(proctrace)
  2176. X        pprintf("$i0 = %ld, (%s)\n",iv[0],
  2177. X            (iv[0] == 0x100L) ? "interrupted" : "program exit status");
  2178. X
  2179. X    free_esd(cmd);
  2180. X    return(0);
  2181. X}    /* end of pcmd_system */
  2182. X
  2183. X/*+-------------------------------------------------------------------------
  2184. X    get_big_endian_16(ptr)
  2185. X--------------------------------------------------------------------------*/
  2186. Xushort
  2187. Xget_big_endian_16(ptr)
  2188. Xregister uchar *ptr;
  2189. X{
  2190. Xregister ushort uint16 = ((ushort)ptr[0] << 8) | ptr[1];
  2191. X    return(uint16);
  2192. X}    /* end of get_big_endian_16 */
  2193. X/*+-------------------------------------------------------------------------
  2194. X    get_big_endian_32(ptr)
  2195. X--------------------------------------------------------------------------*/
  2196. Xulong
  2197. Xget_big_endian_32(ptr)
  2198. Xregister uchar *ptr;
  2199. X{
  2200. Xregister ulong uint32 = ((ulong)*ptr++) << 24;
  2201. X    uint32 |= ((ulong)*ptr++) << 16;
  2202. X    uint32 |= ((ulong)*ptr++) <<  8;
  2203. X    uint32 |=  (ulong)*ptr++;
  2204. X    return(uint32);
  2205. X}    /* end of get_big_endian_32 */
  2206. X
  2207. X/*+-------------------------------------------------------------------------
  2208. X    pcmd_getf(param) - get friend memory
  2209. X
  2210. Xgetf -x <int-var-spec> <offset>
  2211. Xwhere: -x ==
  2212. X   -b byte
  2213. X   -w word (little-endian)
  2214. X   -W word (big-endian)
  2215. X   -l 32-bits (little-endian)
  2216. X   -L 32-bits (big-endian)
  2217. X--------------------------------------------------------------------------*/
  2218. Xint
  2219. Xpcmd_getf(param)
  2220. XESD *param;
  2221. X{
  2222. Xint erc;
  2223. Xchar switches[8];
  2224. Xlong *piv;
  2225. Xlong offset;
  2226. Xint size;
  2227. Xint big_endian;
  2228. X
  2229. X    if(erc = get_switches(param,switches,sizeof(switches)))
  2230. X        return(erc);
  2231. X    if((strlen(switches) != 2) || !strchr("bwWlL",switches[1]))
  2232. X    {
  2233. X        pputs("invalid switch\n");
  2234. X        return(eFATAL_ALREADY);
  2235. X    }
  2236. X    size = to_lower(switches[1]);
  2237. X    big_endian = isupper(switches[1]);
  2238. X
  2239. X/*
  2240. X    if(!get_svptr(param,&psv))
  2241. X        return(eNotImplemented);
  2242. X    else
  2243. X*/
  2244. X    if(!strncmp(param->pb + param->index,"$i",2))
  2245. X        param->index += 2;
  2246. X    if(erc = get_ivptr(param,&piv,1))
  2247. X        return(erc);
  2248. X
  2249. X    if(erc = gint(param,&offset))
  2250. X        return(erc);
  2251. X
  2252. X    if(proctrace)
  2253. X        pprintf("getf %s offset=0x%lx",switches,offset);
  2254. X
  2255. X    switch(size)
  2256. X    {
  2257. X        case 'b':
  2258. X            if(offset > ((long)sizeof(shm->friend_space) - 1))
  2259. X                goto OFFSET_TOO_LARGE;
  2260. X            *piv = *(((uchar *)shm->friend_space) + (int)offset) & 0xFF;
  2261. X            break;
  2262. X        case 'w':
  2263. X            if(offset > ((long)sizeof(shm->friend_space) - 2))
  2264. X                goto OFFSET_TOO_LARGE;
  2265. X            if(big_endian)
  2266. X                *piv = get_big_endian_16((uchar *)shm->friend_space +
  2267. X                        (int)offset);
  2268. X            else
  2269. X                *piv = *(((ushort *)shm->friend_space) + (int)offset) & 0xFFFF;
  2270. X            break;
  2271. X        case 'l':
  2272. X            if(offset > ((long)sizeof(shm->friend_space) - 4))
  2273. X                goto OFFSET_TOO_LARGE;
  2274. X            if(big_endian)
  2275. X            {
  2276. X                *piv = get_big_endian_32((uchar *)shm->friend_space +
  2277. X                        (int)offset);
  2278. X            }
  2279. X            else
  2280. X                *piv = *((long *)((char *)shm->friend_space + (int)offset));
  2281. X            break;
  2282. X    }
  2283. X
  2284. X    if(proctrace)
  2285. X        pprintf(" value=%ld (%08lx)\n",*piv,*piv);
  2286. X    return(0);
  2287. X
  2288. XOFFSET_TOO_LARGE:
  2289. X    if(proctrace)
  2290. X        pputs("\n");
  2291. X    pprintf("offset 0x%02lx too large for -%c (0x%02x bytes available)\n",
  2292. X        offset,switches[1],sizeof(shm->friend_space));
  2293. X    return(eFATAL_ALREADY);
  2294. X
  2295. X}    /* end of pcmd_getf */
  2296. X
  2297. X/*+-------------------------------------------------------------------------
  2298. X    pcmd_putf(param)
  2299. X--------------------------------------------------------------------------*/
  2300. Xint
  2301. Xpcmd_putf(param)
  2302. XESD *param;
  2303. X{
  2304. X    return(eNotImplemented);
  2305. X}    /* end of pcmd_putf */
  2306. X
  2307. X/*+-------------------------------------------------------------------------
  2308. X    pcmd_xon(param)
  2309. X--------------------------------------------------------------------------*/
  2310. Xint
  2311. Xpcmd_xon(param)
  2312. XESD *param;
  2313. X{
  2314. Xint erc;
  2315. Xchar new_xonxoff[8];
  2316. Xchar *xon_status();
  2317. X
  2318. X    if(shm->Liofd < 0)
  2319. X        return(eNoLineAttached);
  2320. X
  2321. X    if(erc = get_alpha_zstr(param,new_xonxoff,sizeof(new_xonxoff)))
  2322. X        return(erc);
  2323. X
  2324. X    if(set_xon_xoff_by_arg(new_xonxoff))
  2325. X        return(eBadParameter);
  2326. X
  2327. X    if(proctrace)
  2328. X        pprintf("xon/xoff flow control set to %s\n",xon_status());
  2329. X
  2330. X    return(erc);
  2331. X
  2332. X}    /* end of pcmd_xon */
  2333. X
  2334. X/*+-------------------------------------------------------------------------
  2335. X    pcmd_rtscts(param)
  2336. X--------------------------------------------------------------------------*/
  2337. Xint
  2338. Xpcmd_rtscts(param)
  2339. XESD *param;
  2340. X{
  2341. Xint erc;
  2342. Xchar new_rtscts[8];
  2343. X
  2344. X    if(shm->Liofd < 0)
  2345. X        return(eNoLineAttached);
  2346. X
  2347. X    if(erc = get_alpha_zstr(param,new_rtscts,sizeof(new_rtscts)))
  2348. X        return(erc);
  2349. X
  2350. X    lRTSCTS_control(yes_or_no(new_rtscts));
  2351. X
  2352. X    if(proctrace)
  2353. X    {
  2354. X        pprintf("RTS %s CTS %s\n",
  2355. X            (Ltermio.c_cflag & RTSFLOW) ? "on" : "off",
  2356. X            (Ltermio.c_cflag & CTSFLOW) ? "on" : "off");
  2357. X    }
  2358. X
  2359. X    return(erc);
  2360. X
  2361. X}    /* end of pcmd_rtscts */
  2362. X
  2363. X/* vi: set tabstop=4 shiftwidth=4: */
  2364. X/* end of pcmd.c */
  2365. SHAR_EOF
  2366. $TOUCH -am 1226023490 'pcmd.c' &&
  2367. chmod 0644 pcmd.c ||
  2368. echo 'restore of pcmd.c failed'
  2369. Wc_c="`wc -c < 'pcmd.c'`"
  2370. test 24203 -eq "$Wc_c" ||
  2371.     echo 'pcmd.c: original size 24203, current size' "$Wc_c"
  2372. true || echo 'restore of pcmdfile.c failed'
  2373. echo End of part 12, continue with part 13
  2374. exit 0
  2375. --------------------------------------------------------------------
  2376. Warren Tucker, TuckerWare emory!n4hgf!wht or wht@n4hgf.Mt-Park.GA.US
  2377. Hacker Extraordinaire  d' async PADs,  pods,  proteins and protocols
  2378.  
  2379. exit 0 # Just in case...
  2380. -- 
  2381. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  2382. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  2383. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  2384. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  2385.