home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume32 / ecu / part14 < prev    next >
Text File  |  1992-09-14  |  58KB  |  2,184 lines

  1. Newsgroups: comp.sources.misc
  2. From: wht@n4hgf.Mt-Park.GA.US (Warren Tucker)
  3. Subject:  v32i049:  ecu - ECU Asynchronous Communications v3.20, Part14/40
  4. Message-ID: <1992Sep13.153528.5428@sparky.imd.sterling.com>
  5. X-Md4-Signature: 2bdb7392c1efd7960ac7f6377a2d5073
  6. Date: Sun, 13 Sep 1992 15:35:28 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: wht@n4hgf.Mt-Park.GA.US (Warren Tucker)
  10. Posting-number: Volume 32, Issue 49
  11. Archive-name: ecu/part14
  12. Environment: SCO,XENIX,ISC,SUNOS,SYSVR4,HDB,Curses
  13. Supersedes: ecu: Volume 21, Issue 53-89
  14.  
  15. ---- Cut Here and feed the following to sh ----
  16. #!/bin/sh
  17. # this is ecu320.14 (part 14 of ecu320)
  18. # do not concatenate these parts, unpack them in order with /bin/sh
  19. # file ecuusage.c continued
  20. #
  21. if test ! -r _shar_seq_.tmp; then
  22.     echo 'Please unpack part 1 first!'
  23.     exit 1
  24. fi
  25. (read Scheck
  26.  if test "$Scheck" != 14; then
  27.     echo Please unpack part "$Scheck" next!
  28.     exit 1
  29.  else
  30.     exit 0
  31.  fi
  32. ) < _shar_seq_.tmp || exit 1
  33. if test ! -f _shar_wnt_.tmp; then
  34.     echo 'x - still skipping ecuusage.c'
  35. else
  36. echo 'x - continuing file ecuusage.c'
  37. sed 's/^X//' << 'SHAR_EOF' >> 'ecuusage.c' &&
  38. X
  39. Xchar *usage_text[] = 
  40. X{
  41. X"usage: ecu [-l <ttyname>] [-b <baud_rate>] [-eon]\n",
  42. X"           [-h] [-t] [-P <phonedir>] [-F name] [-T <trace-level>]\n",
  43. X"           [-p <initial_proc> [-d] [-D] | <phone_number>]\n",
  44. X"-D unconditionally stop execution when -p initial procedure is done\n",
  45. X"-F sets an alternate funckeymap name for the *keyboard*\n",
  46. X"-P choose alternate phone directory (<phonedir> must be a full pathname)\n",
  47. X"-T set procedure tracing to level: 0=none, 1=standard, 2=ECU-debugging\n",
  48. X"-b choose baud rate (any UNIX rate 110-38400)\n",
  49. X"-d stop execution if -p initial procedure fails\n",
  50. X"-e even parity   -o odd parity   -n no parity\n",
  51. X"-h half duplex ... default is full duplex\n",
  52. X"-l choose line (/dev/<ttyname>)\n",
  53. X"-p execute an initial procedure\n",
  54. X"-t append NL to incoming and outgoing CR characters\n",
  55. X"<phone_number> is either an actual number or a directory entry name\n",
  56. X"\n",
  57. X"For interactive option selection, try executing ecu with no arguments\n",
  58. X"\n",
  59. X"For a list of built in commands, type HOME?<ENTER> once program started\n",
  60. X    (char *)0        /* terminated with null pointer */
  61. X};
  62. X
  63. Xchar *log_cmd_usage_text[] = 
  64. X{
  65. X"Usage: log [-s] [-r] <filename>\n",
  66. X"       log off   turn logging off\n",
  67. X" -s scratch any previous contents of <filename>, else append\n",
  68. X" -r raw log, else drop 0x00-0x08,0x11-0x1F,0x7F-0xFF\n",
  69. X    (char *)0        /* terminated with null pointer */
  70. X};
  71. X
  72. X/*+-----------------------------------------------------------------------
  73. X    general_usage(uptr)
  74. X------------------------------------------------------------------------*/
  75. Xvoid
  76. Xgeneral_usage(uptr)
  77. Xregister char **uptr;
  78. X{
  79. X    while(*uptr != (char *)0)
  80. X        pputs(*(uptr++));
  81. X}    /* end of usage */
  82. X
  83. X/*+-----------------------------------------------------------------------
  84. X    usage()
  85. X------------------------------------------------------------------------*/
  86. Xvoid
  87. Xusage()
  88. X{
  89. X    fprintf(stderr,"ecu %s made: %s\n",revstr,makedate);
  90. X    general_usage(usage_text);
  91. X    pprintf("\nDefaults: tty=%s baud=%d parity=%c\n",
  92. X        DEFAULT_TTY, DEFAULT_BAUD_RATE, DEFAULT_PARITY);
  93. X    termecu(TERMECU_USAGE);
  94. X    /*NOTREACHED*/
  95. X}
  96. X
  97. X/*+-------------------------------------------------------------------------
  98. X    log_cmd_usage()
  99. X--------------------------------------------------------------------------*/
  100. Xvoid
  101. Xlog_cmd_usage()
  102. X{
  103. X    general_usage(log_cmd_usage_text);
  104. X}    /* end of log_cmd_usage */
  105. X
  106. X/* vi: set tabstop=4 shiftwidth=4: */
  107. SHAR_EOF
  108. echo 'File ecuusage.c is complete' &&
  109. chmod 0644 ecuusage.c ||
  110. echo 'restore of ecuusage.c failed'
  111. Wc_c="`wc -c < 'ecuusage.c'`"
  112. test 3383 -eq "$Wc_c" ||
  113.     echo 'ecuusage.c: original size 3383, current size' "$Wc_c"
  114. rm -f _shar_wnt_.tmp
  115. fi
  116. # ============= ecuutil.c ==============
  117. if test -f 'ecuutil.c' -a X"$1" != X"-c"; then
  118.     echo 'x - skipping ecuutil.c (File already exists)'
  119.     rm -f _shar_wnt_.tmp
  120. else
  121. > _shar_wnt_.tmp
  122. echo 'x - extracting ecuutil.c (Text)'
  123. sed 's/^X//' << 'SHAR_EOF' > 'ecuutil.c' &&
  124. X/*+-----------------------------------------------------------------------
  125. X    ecuutil.c -- utility routines for extended calling unit
  126. X    wht@n4hgf.Mt-Park.GA.US
  127. X
  128. X
  129. X  Defined functions:
  130. X    arg_token(parsestr,termchars)
  131. X    ascii_name_to_hex(str3char)
  132. X    ascii_to_hex(ascii)
  133. X    build_arg_array(cmd,arg,arg_max_quan,narg_rtn)
  134. X    build_str_array(str,arg,str_max_quan,nstr_rtn)
  135. X    cfree(p,num,size)
  136. X    defeat_optimize_to_work_around_bug(would_be_optimized)
  137. X    disp_line_termio(fd,text)
  138. X    disp_stat(st)
  139. X    disp_termio(ttt,text)
  140. X    errno_text(err)
  141. X    find_shell_chars(command)
  142. X    get_curr_dir(cdir,cdir_max)
  143. X    get_home_dir(home_dir)
  144. X    hex_to_ascii_name(char_val)
  145. X    make_char_graphic(ch,incl_3char)
  146. X    make_ecu_subdir()
  147. X    mem_cpy(dest,src,len)
  148. X    mode_map(mode,mode_str)
  149. X    pad_zstr_to_len(zstr,len)
  150. X    perror_errmsg(str)
  151. X    rdchk(fd)
  152. X    skip_ld_break(zstr)
  153. X    str_classify(sc,str)
  154. X    str_token(parsestr,termchars)
  155. X    strip_trail_break(zstr)
  156. X    yes_or_no(strarg)
  157. X
  158. XThis module assumes the neo-standard 'mode_t' type is an unsigned
  159. Xshort and 'dev_t' is a short in accordance with tradition.  This
  160. Xis, in fact, true with all the supported systems which have it as
  161. Xof this writing.  This is just a test of the Brown Shirt Warning
  162. XSystem.  If this had been an actual Brown Shirt Alert, you would
  163. Xhave heard the noise of sickening thuds and breaking things nearby.
  164. X
  165. X------------------------------------------------------------------------*/
  166. X/*+:EDITS:*/
  167. X/*:09-10-1992-13:59-wht@n4hgf-ECU release 3.20 */
  168. X/*:08-22-1992-15:38-wht@n4hgf-ECU release 3.20 BETA */
  169. X/*:05-11-1992-16:42-wht@gyro-fix WORKING_SELECT nap once and for all */
  170. X/*:05-08-1992-02:42-wht@n4hgf-select-based Nap was buggy on EINTR */
  171. X/*:04-05-1992-15:31-wht@n4hgf-no more use of memmove in any environment */
  172. X/*:02-22-1992-16:19-wht@n4hgf-build arg/str array now handles zero tokens */
  173. X/*:11-26-1991-19:36-wht@n4hgf-add str_classify and yes_or_no uses it */
  174. X/*:09-01-1991-12:46-wht@n4hgf2-show sun flow control bit */
  175. X/*:08-30-1991-20:09-wht@n4hgf2-sun Nap was not returning a value */
  176. X/*:08-25-1991-14:39-wht@n4hgf-SVR4 port thanks to aega84!lh */
  177. X/*:08-17-1991-14:11-root@n4hgf-ascii_to_hex supports "csi" */
  178. X/*:08-13-1991-13:53-wht@n4hgf-UNIX and ISC nap() broken; XENIX still wins */
  179. X/*:07-25-1991-12:57-wht@n4hgf-ECU release 3.10 */
  180. X/*:04-16-1991-15:45-wht@n4hgf-gcc cannot use memmove */
  181. X/*:03-18-1991-22:31-wht@n4hgf-ISC 2.2 has mkdir() */
  182. X/*:02-03-1991-14:23-wht@n4hgf-hack workaround for get_home_dir under x286 */
  183. X/*:01-25-1991-16:23-wht@n4hgf-source name wrong in headers */
  184. X/*:12-26-1990-14:32-wht@n4hgf-use memmove or Duff's Device in mem_cpy() */
  185. X/*:12-04-1990-00:58-wht@n4hgf-allow alternating between str/arg_token */
  186. X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  187. X
  188. X#include "ecu.h"
  189. X#include "termecu.h"
  190. X#include "ecufork.h"
  191. X#include "ecukey.h"
  192. X#include "ecu_pwd.h"
  193. X
  194. X#if defined(sun)
  195. X#undef ECHO
  196. X#undef NL0
  197. X#undef NL1
  198. X#undef TAB0
  199. X#undef TAB1
  200. X#undef TAB2
  201. X#undef XTABS
  202. X#undef CR0
  203. X#undef CR1
  204. X#undef CR2
  205. X#undef CR3
  206. X#undef FF0
  207. X#undef FF1
  208. X#undef BS0
  209. X#undef BS1
  210. X#undef TOSTOP
  211. X#undef FLUSHO
  212. X#undef PENDIN
  213. X#undef NOFLSH
  214. X#include <sys/ioctl.h>
  215. X#endif
  216. X
  217. X#if defined(SVR4)
  218. X# include <sys/termiox.h>
  219. Xextern int hx_flag;
  220. X#endif
  221. X
  222. Xchar *getenv();
  223. X
  224. Xextern int errno;
  225. Xextern char curr_dir[CURR_DIRSIZ];
  226. X
  227. Xchar *str_token_static = (char *)0;
  228. X
  229. Xchar *ascii_ctlstr =
  230. X"NULSOHSTXETXEOTENQACKBELBS HT NL VT FF CR SO SI DLEDC1DC2DC3DC4NAKSYNETBCANEM SUBESCFS GS RS US SP ";
  231. X
  232. X/*+-------------------------------------------------------------------------
  233. X    mem_cpy(dest,src,len) - memcpy() with non-destructive overlapping copy
  234. X
  235. X  use Duff's device for speed if memmove not available
  236. X--------------------------------------------------------------------------*/
  237. Xvoid
  238. Xmem_cpy(dest,src,len)
  239. Xregister char *dest;
  240. Xregister char *src;
  241. Xregister len;
  242. X{
  243. X#if 0 /* defined(M_UNIX) && !defined(DUFF)*/ /*  && !defined(__GNUC__) */
  244. X    /*
  245. X     * memmove() clobbers regs that GCC wants to keep
  246. X     * unless you use -fcall-save-bx
  247. X     */
  248. X    memmove(dest,src,len);
  249. X#else
  250. X    /*
  251. X     * for systems without memmove or with compiler that cannot use it
  252. X     */
  253. X
  254. X    register itmp = (len + 7) / 8;
  255. X    if(dest > src)
  256. X    {
  257. X        dest += len;
  258. X        src += len;
  259. X        switch(len % 8)
  260. X        {
  261. X        case 0:    do{    *--dest = *--src;
  262. X        case 7:        *--dest = *--src;
  263. X        case 6:        *--dest = *--src;
  264. X        case 5:        *--dest = *--src;
  265. X        case 4:        *--dest = *--src;
  266. X        case 3:        *--dest = *--src;
  267. X        case 2:        *--dest = *--src;
  268. X        case 1:        *--dest = *--src;
  269. X                 }while(--itmp > 0);
  270. X        }
  271. X    }
  272. X    else
  273. X    {
  274. X        switch(len % 8)
  275. X        {
  276. X        case 0:    do{    *dest++ = *src++;
  277. X        case 7:        *dest++ = *src++;
  278. X        case 6:        *dest++ = *src++;
  279. X        case 5:        *dest++ = *src++;
  280. X        case 4:        *dest++ = *src++;
  281. X        case 3:        *dest++ = *src++;
  282. X        case 2:        *dest++ = *src++;
  283. X        case 1:        *dest++ = *src++;
  284. X                 }while(--itmp > 0);
  285. X        }
  286. X    }
  287. X#endif
  288. X}    /* end of mem_cpy */
  289. X
  290. X/*+-------------------------------------------------------------------------
  291. X    skip_ld_break(zstr) - skip leading spaces and tabs
  292. X--------------------------------------------------------------------------*/
  293. Xchar *
  294. Xskip_ld_break(zstr)
  295. Xregister char *zstr;
  296. X{
  297. X    while(isspace(*zstr))
  298. X        zstr++;
  299. X    return(zstr);
  300. X}    /* end of skip_ld_break */
  301. X
  302. X/*+-------------------------------------------------------------------------
  303. X    strip_trail_break(zstr) - strip leading spaces and tabs
  304. X--------------------------------------------------------------------------*/
  305. Xvoid
  306. Xstrip_trail_break(zstr)
  307. Xchar *zstr;
  308. X{
  309. X    register int itmp = strlen(zstr);
  310. X    register char *zptr = zstr + itmp - 1;
  311. X
  312. X    while(itmp && isspace(*zptr))
  313. X    {
  314. X        *zptr-- = 0;
  315. X        itmp--;
  316. X    }
  317. X}    /* end of strip_trail_break */
  318. X
  319. X/*+-----------------------------------------------------------------------
  320. X    pad_zstr_to_len(zstr,len)
  321. X
  322. X  pads with spaces to specified length, unless already longer than
  323. X  len in which case the string is truncated to 'len' characters.
  324. X------------------------------------------------------------------------*/
  325. Xvoid
  326. Xpad_zstr_to_len(zstr,len)
  327. Xchar *zstr;
  328. Xint len;
  329. X{
  330. X    register izstr;
  331. X
  332. X    izstr = strlen(zstr);
  333. X    if(izstr >= len)
  334. X        zstr[len] = 0;
  335. X    else
  336. X    {
  337. X        while(izstr < len)
  338. X            zstr[izstr++] = 0x20;
  339. X        zstr[izstr] = 0;
  340. X    }
  341. X}    /* end of pad_zstr_to_len */
  342. X
  343. X/*+-----------------------------------------------------------------------
  344. X    arg_token(parsestr,termchars)
  345. X
  346. XGet next token from string parsestr ((char *)0 on 2nd, 3rd, etc.
  347. Xcalls), where tokens are nonempty strings separated by runs of chars
  348. Xfrom termchars.  Writes nulls into parsestr to end tokens.
  349. Xtermchars need not remain constant from call to call.
  350. X
  351. XTreats multiple occurrences of a termchar as one delimiter (does not
  352. Xallow null fields).
  353. X------------------------------------------------------------------------*/
  354. Xchar *
  355. Xarg_token(parsestr,termchars)
  356. Xchar *parsestr;
  357. Xchar *termchars;
  358. X{
  359. X    register char *parseptr;
  360. X    char *token;
  361. X
  362. X    if(!parsestr && !str_token_static)
  363. X        return((char *)0);
  364. X
  365. X    if(parsestr)
  366. X    {
  367. X        str_token_static = (char *)0;
  368. X        parseptr = parsestr;
  369. X    }
  370. X    else
  371. X       parseptr = str_token_static;
  372. X
  373. X    while(*parseptr)
  374. X    {
  375. X        if(!strchr(termchars,*parseptr))
  376. X            break;
  377. X        parseptr++;
  378. X    }
  379. X
  380. X    if(!*parseptr)
  381. X    {
  382. X        str_token_static = (char *)0;
  383. X        return((char *)0);
  384. X    }
  385. X
  386. X    token = parseptr;
  387. X    if(*token == '\'')
  388. X    {
  389. X        token++;
  390. X        parseptr++;
  391. X        while(*parseptr)
  392. X        {
  393. X            if(*parseptr == '\'')
  394. X            {
  395. X                str_token_static = parseptr + 1;
  396. X                *parseptr = 0;
  397. X                return(token);
  398. X            }
  399. X            parseptr++;
  400. X        }
  401. X        str_token_static = (char *)0;
  402. X        return(token);
  403. X    }
  404. X    while(*parseptr)
  405. X    {
  406. X        if(strchr(termchars,*parseptr))
  407. X        {
  408. X            *parseptr = 0;
  409. X            str_token_static = parseptr + 1;
  410. X            while(*str_token_static)
  411. X            {
  412. X                if(!strchr(termchars,*str_token_static))
  413. X                    break;
  414. X                str_token_static++;
  415. X            }
  416. X            return(token);
  417. X        }
  418. X        parseptr++;
  419. X    }
  420. X    str_token_static = (char *)0;
  421. X    return(token);
  422. X}    /* end of arg_token */
  423. X
  424. X/*+-------------------------------------------------------------------------
  425. X    build_arg_array(cmd,arg,arg_max_quan,&narg)
  426. X--------------------------------------------------------------------------*/
  427. Xvoid
  428. Xbuild_arg_array(cmd,arg,arg_max_quan,narg_rtn)
  429. Xchar *cmd;
  430. Xchar **arg;
  431. Xint arg_max_quan;
  432. Xint *narg_rtn;
  433. X{
  434. X    register narg;
  435. X
  436. X    str_token_static = (char *)0;
  437. X    memset((char *)arg,0,sizeof(char *) * arg_max_quan);
  438. X    if(!(arg[0] = arg_token(cmd," \t\r\n")))
  439. X    {
  440. X        *narg_rtn = 0;
  441. X        return;
  442. X    }
  443. X
  444. X    for(narg = 1; narg < arg_max_quan; ++narg)
  445. X    {
  446. X        if(!(arg[narg] = arg_token((char *)0," \t\r\n"))) 
  447. X            break;
  448. X    }
  449. X
  450. X    *narg_rtn = narg;
  451. X
  452. X}    /* end of build_arg_array */
  453. X
  454. X/*+-----------------------------------------------------------------------
  455. X    str_token(parsestr,termchars)
  456. X
  457. XGet next token from string parsestr ((char *)0 on 2nd, 3rd, etc.
  458. Xcalls), where tokens are nonempty strings separated by runs of chars
  459. Xfrom termchars.  Writes nulls into parsestr to end tokens.
  460. Xtermchars need not remain constant from call to call.
  461. X
  462. XTreats each occurrence of a termchar as delimiter (allows null
  463. Xfields).
  464. X------------------------------------------------------------------------*/
  465. Xchar *
  466. Xstr_token(parsestr,termchars)
  467. Xchar *parsestr;
  468. Xchar *termchars;
  469. X{
  470. X    register char *termptr;
  471. X    register char *parseptr;
  472. X    char *token;
  473. X
  474. X    if(!parsestr && !str_token_static)
  475. X        return((char *)0);
  476. X
  477. X    if(parsestr)
  478. X    {
  479. X        str_token_static = (char *)0;
  480. X        parseptr = parsestr;
  481. X    }
  482. X    else
  483. X       parseptr = str_token_static;
  484. X
  485. X    while(*parseptr)
  486. X    {
  487. X        for(termptr = termchars; *termptr != 0; termptr++)
  488. X        {
  489. X            if(*parseptr == *termptr)
  490. X                goto FOUND_TERM;
  491. X        }
  492. X        if(!*termptr)
  493. X            break;
  494. X        parseptr++;
  495. X    }
  496. X
  497. X    if(!*parseptr)
  498. X    {
  499. X        str_token_static = (char *)0;
  500. X        return((char *)0);
  501. X    }
  502. X
  503. XFOUND_TERM:
  504. X    token = parseptr;
  505. X    while(*parseptr)
  506. X    {
  507. X        for(termptr = termchars; *termptr;)
  508. X        {
  509. X            if(*parseptr == *termptr++)
  510. X            {
  511. X                str_token_static = parseptr + 1;
  512. X                *parseptr = 0;
  513. X                return(token);
  514. X            }
  515. X        }
  516. X        parseptr++;
  517. X    }
  518. X    str_token_static = (char *)0;
  519. X    return(token);
  520. X}    /* end of str_token */
  521. X
  522. X/*+-------------------------------------------------------------------------
  523. X    build_str_array(str,arg,arg_max_quan,&narg)
  524. X--------------------------------------------------------------------------*/
  525. Xvoid
  526. Xbuild_str_array(str,arg,arg_max_quan,narg_rtn)
  527. Xchar *str;
  528. Xchar **arg;
  529. Xint arg_max_quan;
  530. Xint *narg_rtn;
  531. X{
  532. X    register narg;
  533. X
  534. X    str_token_static = (char *)0;
  535. X    memset((char *)arg,0,sizeof(char *) * arg_max_quan);
  536. X    if(!(arg[0] = str_token(str," \t\r\n")))
  537. X    {
  538. X        *narg_rtn = 0;
  539. X        return;
  540. X    }
  541. X
  542. X    for(narg = 1; narg < arg_max_quan; ++narg)
  543. X    {
  544. X        if(!(arg[narg] = str_token((char *)0," \t\r\n"))) 
  545. X            break;
  546. X    }
  547. X
  548. X    *narg_rtn = narg;
  549. X
  550. X}    /* end of build_str_array */
  551. X
  552. X/*+-----------------------------------------------------------------------
  553. X    make_char_graphic(character,incl_3char) - Make all chars "printable"
  554. X
  555. X  returns pointer to a static string containing printable version
  556. X  of a character.  If control char, printed as "^A", etc.
  557. X  if incl_3char set true, then space + ASCII assignment (e.g. "NUL") is
  558. X  appended to the string for non-printable graphics
  559. X------------------------------------------------------------------------*/
  560. Xchar *
  561. Xmake_char_graphic(ch,incl_3char)
  562. Xregister char ch;
  563. Xint incl_3char;
  564. X{
  565. X    static char gg[16];
  566. X
  567. X    ch &= 0x7F;
  568. X    if((ch >= 0x20) && (ch < 0x7F))
  569. X    {
  570. X        gg[0] = ch; gg[1] = 0;
  571. X    }
  572. X    else
  573. X    {
  574. X        gg[0] = '^'; 
  575. X        if(ch == 0x7F)
  576. X        {
  577. X            gg[1] = '?';
  578. X            if(incl_3char)
  579. X                strcpy(&gg[2]," DEL");
  580. X            else
  581. X                gg[2] = 0;
  582. X        }
  583. X        else
  584. X        {
  585. X            gg[1] = ch + 0x40;
  586. X            if(incl_3char)
  587. X            {
  588. X                gg[2] = 0x20;
  589. X                strncpy(&gg[3],ascii_ctlstr + (ch * 3),3);
  590. X                gg[7] = 0;
  591. X            }
  592. X            else
  593. X                gg[2] = 0;
  594. X        }
  595. X    }
  596. X    return(gg);
  597. X}    /* end of make_char_graphic */
  598. X
  599. X/*+-----------------------------------------------------------------------
  600. X    mode_map(mode,mode_str)    build drwxrwxrwx string
  601. X------------------------------------------------------------------------*/
  602. Xchar *
  603. Xmode_map(mode,mode_str)
  604. Xunsigned short mode;
  605. Xchar *mode_str;
  606. X{
  607. X    register unsigned ftype = mode & S_IFMT;
  608. X    register char *rtn;
  609. X    static char result[12];
  610. X
  611. X    rtn = (mode_str == (char *)0) ? result : mode_str;
  612. X
  613. X    /*               drwxrwxrwx */
  614. X    /*               0123456789 */
  615. X    strcpy(rtn,"----------");
  616. X
  617. X    switch(ftype)
  618. X    {
  619. X        case S_IFIFO:    *rtn = 'p'; break; /* FIFO (named pipe) */
  620. X        case S_IFDIR:    *rtn = 'd'; break; /* directory */
  621. X        case S_IFCHR:    *rtn = 'c'; break; /* character special */
  622. X        case S_IFBLK:    *rtn = 'b'; break; /* block special */
  623. X        case S_IFREG:    *rtn = '-'; break; /* regular */
  624. X
  625. X#if defined(S_IFLNK)
  626. X        case S_IFLNK:    *rtn = 'l'; break; /* symbolic link */
  627. X#endif
  628. X#if defined(S_IFSOCK)
  629. X        case S_IFSOCK:    *rtn = 's'; break; /* socket */
  630. X#endif
  631. X
  632. X#if defined(S_IFNAM)
  633. X        case S_IFNAM:                        /* name space entry */
  634. X#if defined(S_IFNAM)
  635. X            if(mode & S_INSEM)                /* semaphore */
  636. X            {
  637. X                *rtn = 's';
  638. X                break;
  639. X            }
  640. X#endif
  641. X#if defined(S_INSHD)
  642. X            if(mode & S_INSHD)                /* shared memory */
  643. X            {
  644. X                *rtn = 'm';
  645. X                break;
  646. X            }
  647. X            break;
  648. X#endif
  649. X#endif
  650. X
  651. X        default:        *rtn = '?'; break;    /* ??? */
  652. X    }
  653. X
  654. X    if(mode & 000400) *(rtn + 1) = 'r';
  655. X    if(mode & 000200) *(rtn + 2) = 'w';
  656. X    if(mode & 000100) *(rtn + 3) = 'x';
  657. X    if(mode & 004000) *(rtn + 3) = 's';
  658. X    if(mode & 000040) *(rtn + 4) = 'r';
  659. X    if(mode & 000020) *(rtn + 5) = 'w';
  660. X    if(mode & 000010) *(rtn + 6) = 'x';
  661. X    if(mode & 002000) *(rtn + 6) = 's';
  662. X    if(mode & 000004) *(rtn + 7) = 'r';
  663. X    if(mode & 000002) *(rtn + 8) = 'w';
  664. X    if(mode & 000001) *(rtn + 9) = 'x';
  665. X    if(mode & 001000) *(rtn + 9) = 't';
  666. X
  667. X    return(rtn);
  668. X
  669. X}    /* end of mode_map */
  670. X
  671. X/*+-----------------------------------------------------------------------
  672. X    disp_termio(ttt)
  673. X  display termio 'ttt' on stderr
  674. X------------------------------------------------------------------------*/
  675. Xvoid disp_termio(ttt,text)
  676. Xstruct termio *ttt;
  677. Xchar *text;
  678. X{
  679. X    register flag;
  680. X    register i_cc;
  681. X    register char *cptr;
  682. X    int dbits;
  683. X    char parity;
  684. X
  685. X    pprintf("---------> %s\n",text);
  686. X
  687. X    flag = ttt->c_iflag;
  688. X    pprintf(
  689. X"iflag: %07o IGNBRK:%d  BRKINT:%d  IGNPAR:%d  PARMRK:%d  INPCK:%d  ISTRIP:%d\n",
  690. X                flag,
  691. X                (flag & IGNBRK) ? 1 : 0,
  692. X                (flag & BRKINT) ? 1 : 0,
  693. X                (flag & IGNPAR) ? 1 : 0,
  694. X                (flag & PARMRK) ? 1 : 0,
  695. X                (flag & INPCK ) ? 1 : 0,
  696. X                (flag & ISTRIP) ? 1 : 0);
  697. X    pprintf("               INLCR:%d  IGNCR:%d  ICRNL:%d  IUCLC:%d  ",
  698. X                (flag & INLCR ) ? 1 : 0,
  699. X                (flag & IGNCR ) ? 1 : 0,
  700. X                (flag & ICRNL ) ? 1 : 0,
  701. X                (flag & IUCLC ) ? 1 : 0);
  702. X    pprintf("IXON:%d  IXANY:%d  IXOFF:%d\n",
  703. X                (flag & IXON  ) ? 1 : 0,
  704. X                (flag & IXANY ) ? 1 : 0,
  705. X                (flag & IXOFF ) ? 1 : 0);
  706. X
  707. X    flag = ttt->c_oflag;
  708. X    pprintf("oflag: %07o OPOST:%d  OLCUC:%d  ONLCR:%d  OCRNL:%d  ",
  709. X                flag,
  710. X                (flag & OPOST ) ? 1 : 0,
  711. X                (flag & OLCUC ) ? 1 : 0,
  712. X                (flag & ONLCR ) ? 1 : 0,
  713. X                (flag & OCRNL ) ? 1 : 0);
  714. X    pprintf("ONOCR:%d  ONLRET:%d  OFDEL:%d\n",
  715. X                (flag & ONOCR ) ? 1 : 0,
  716. X                (flag & ONLRET) ? 1 : 0,
  717. X                (flag & OFDEL ) ? 1 : 0);
  718. X
  719. X    flag = ttt->c_cflag;
  720. X    pprintf("cflag: %07o ",ttt->c_cflag);
  721. X    switch(flag & CBAUD)
  722. X    {
  723. X        case B0:    cptr = "HUP"; break;
  724. X        case B50:    cptr = "50"; break;
  725. X        case B75:    cptr = "75"; break;
  726. X        case B110:    cptr = "110"; break;
  727. X        case B134:    cptr = "134.5"; break;
  728. X        case B150:    cptr = "150"; break;
  729. X        case B200:    cptr = "200"; break;
  730. X        case B300:    cptr = "300"; break;
  731. X        case B600:    cptr = "600"; break;
  732. X        case B1200:    cptr = "1200"; break;
  733. X        case B1800:    cptr = "1800"; break;
  734. X        case B2400:    cptr = "2400"; break;
  735. X        case B4800:    cptr = "4800"; break;
  736. X        case B9600:    cptr = "9600"; break;
  737. X#if defined(B19200)
  738. X        case B19200:cptr = "19200"; break;
  739. X#endif
  740. X#if defined(B38400)
  741. X        case B38400:cptr = "38400"; break;
  742. X#endif
  743. X        default:    
  744. X            switch(flag & CBAUD)
  745. X            {
  746. X                case EXTA:    cptr = "EXTA"; break;
  747. X                case EXTB:    cptr = "EXTB"; break;
  748. X                default:    cptr = "????"; break;
  749. X            }
  750. X    }
  751. X    dbits = 5 + ((flag & CSIZE) >> 4);
  752. X    parity = (flag & PARENB) ? ((flag & PARODD) ? 'O' : 'E') : 'N';
  753. X    pprintf("%s-%d-%c-%d ",cptr,dbits,parity,(flag & CSTOPB) ? 2 : 1);
  754. X    switch(flag & CS8)
  755. X    {
  756. X        case CS8: pputs("CS8 "); break;
  757. X        case CS7: pputs("CS7 "); break;
  758. X        case CS6: pputs("CS6 "); break;
  759. X        case CS5: pputs("CS5 "); break;
  760. X    }
  761. X    pprintf("CREAD:%d  HUPCL:%d  CLOCAL:%d",
  762. X                (flag & CREAD ) ? 1 : 0,
  763. X                (flag & HUPCL ) ? 1 : 0,
  764. X                (flag & CLOCAL) ? 1 : 0);
  765. X#if defined(RTSFLOW) /* SCO */
  766. X    pprintf(" RTSFLOW:%d  CTSFLOW:%d",
  767. X                (flag & RTSFLOW ) ? 1 : 0,
  768. X                (flag & CTSFLOW ) ? 1 : 0);
  769. X#endif
  770. X#if defined(CRTSFL) /* SCO 3.2v4 */
  771. X    pprintf("\n               CRTSFL:%d",
  772. X                (flag & CRTSFL ) ? 1 : 0);
  773. X#endif
  774. X#if defined(RTSXOFF) /* SVR4 */
  775. X    pprintf(" RTSXOFF:%d  CTSXON:%d",
  776. X                (hx_flag & RTSXOFF ) ? 1 : 0,
  777. X                (hx_flag & CTSXON ) ? 1 : 0);
  778. X#endif
  779. X#ifdef CRTSCTS /* sun */
  780. X    pprintf(" CRTSCTS:%d",(flag & CRTSCTS) ? 1 : 0);
  781. X#endif
  782. X    pprintf("\n");
  783. X
  784. X    flag = ttt->c_lflag;
  785. X    pprintf("lflag: %07o ISIG:%d  ICANON:%d  XCASE:%d  ECHO:%d  ECHOE:%d\n",
  786. X                flag,
  787. X                (flag & ISIG  ) ? 1 : 0,
  788. X                (flag & ICANON) ? 1 : 0,
  789. X                (flag & XCASE ) ? 1 : 0,
  790. X                (flag & ECHO  ) ? 1 : 0,
  791. X                (flag & ECHOE ) ? 1 : 0);
  792. X    pprintf("               ECHOK:%d  ECHONL:%d  NOFLSH:%d",
  793. X                (flag & ECHOK ) ? 1 : 0,
  794. X                (flag & ECHONL) ? 1 : 0,
  795. X                (flag & NOFLSH) ? 1 : 0);
  796. X
  797. X#if defined(XCLUDE)
  798. X    pprintf("  XCLUDE:%d",(flag & XCLUDE) ? 1 : 0);
  799. X#endif
  800. X    pputs("\n");
  801. X
  802. X    pprintf("ctl chars: ");
  803. X    for(i_cc = 0; i_cc < NCC; i_cc++)
  804. X        pprintf("%02x   ",ttt->c_cc[i_cc]);
  805. X    pputs("  (hex)\n");
  806. X    pputs("           INTR QUIT ERAS KILL EOF  EOL  ");
  807. X    pputs("EOL2 SWTCH  VMIN-EOF VTIME-EOL\n");
  808. X
  809. X}    /* end of disp_termio */
  810. X
  811. X/*+-------------------------------------------------------------------------
  812. X    disp_stat(st)
  813. X--------------------------------------------------------------------------*/
  814. Xvoid
  815. Xdisp_stat(st)
  816. Xstruct stat *st;
  817. X{
  818. X    char mdmap[32];
  819. X    mode_map(st->st_mode,mdmap);
  820. X    pprintf("mode: %s ",mdmap);
  821. X    pprintf("inode: %5u  dev: %3u rdev: %u,%u (0x%04x)\n",
  822. X        (uint)st->st_ino,(uint)st->st_dev,
  823. X        (ushort)st->st_rdev >> 8,(ushort)st->st_rdev & 0xFF,
  824. X        (ushort)st->st_rdev);
  825. X
  826. X}    /* end of disp_stat */
  827. X
  828. X/*+-----------------------------------------------------------------------
  829. X    disp_line_termio(fd)
  830. X
  831. XGet current termio structure for file descriptor fd
  832. Xand display on stderr
  833. X------------------------------------------------------------------------*/
  834. Xvoid
  835. Xdisp_line_termio(fd,text)
  836. Xint fd;        /* file descriptor */
  837. Xchar *text;
  838. X{
  839. X    struct termio fd_termio;
  840. X    struct stat fd_stat;
  841. X    char text2[128];
  842. X
  843. X    ioctl(fd,TCGETA,&fd_termio);
  844. X    sprintf(text2,"fd: %d  %s",fd,text);
  845. X    disp_termio(&fd_termio,text2);
  846. X    fstat(fd,&fd_stat);
  847. X    disp_stat(&fd_stat);
  848. X
  849. X}    /* end of disp_line_termio */
  850. X
  851. X/*+-----------------------------------------------------------------------
  852. X    ascii_name_to_hex(str3char)
  853. X
  854. X  return value of ascii ctl char name (e.g., "NUL") 0 - 0x1F
  855. X  support CSI "ascii" 0x9B (for ESC + '[' ANSI)
  856. X  returns -1 if input not valid
  857. X------------------------------------------------------------------------*/
  858. Xascii_name_to_hex(str3char)
  859. Xchar *str3char;
  860. X{
  861. X    register char *cptr = ascii_ctlstr;
  862. X    register intval;
  863. X
  864. X    if((strlen(str3char) == 3) && (ulcmpb(str3char,"del") < 0))
  865. X        return(0x7F);
  866. X    if((strlen(str3char) == 3) && (ulcmpb(str3char,"csi") < 0))
  867. X        return(0x9B);
  868. X
  869. X    for(intval = 0; intval <= SPACE; intval++)
  870. X    {
  871. X        if(    (to_lower(*str3char) == to_lower(*cptr))                &&
  872. X            (to_lower(*(str3char + 1)) == to_lower(*(cptr + 1)))    &&
  873. X            ((to_lower(*(str3char + 2)) == to_lower(*(cptr + 2)))    ||
  874. X            (*(cptr + 2) == ' ')))
  875. X        {
  876. X            return(intval);
  877. X        }
  878. X        cptr += 3;
  879. X    }
  880. X
  881. X    return(-1);
  882. X
  883. X}    /* end of ascii_name_to_hex */
  884. X
  885. X/*+-------------------------------------------------------------------------
  886. X    ascii_to_hex(ascii)
  887. X--------------------------------------------------------------------------*/
  888. Xint
  889. Xascii_to_hex(ascii)
  890. Xchar *ascii;
  891. X{
  892. X    int hexval;
  893. X    if(strlen(ascii) == 1)
  894. X        return(*ascii);
  895. X    else if(!strncmp(ascii,"0x",2))
  896. X    {
  897. X        sscanf(ascii + 2,"%x",&hexval);
  898. X        return(hexval & 0xFF);
  899. X    }
  900. X    else if(*ascii == '^')
  901. X        return(*(ascii + 1) & 0x1F);
  902. X    else
  903. X        return(ascii_name_to_hex(ascii));
  904. X}    /* end of ascii_to_hex */
  905. X
  906. X/*+-------------------------------------------------------------------------
  907. X    hex_to_ascii_name(char_val)
  908. X
  909. X  Returns pointer to static string containing three character ASCII
  910. X  name for control character followed by a null.
  911. X--------------------------------------------------------------------------*/
  912. Xchar *
  913. Xhex_to_ascii_name(char_val)
  914. Xchar char_val;
  915. X{
  916. X    static char ascii_name[4];
  917. X
  918. X    char_val &= 0x7F;
  919. X
  920. X    if(char_val == 0x7F)
  921. X        strcpy(ascii_name,"DEL");
  922. X    else if(char_val > SPACE)
  923. X    {
  924. X        ascii_name[0] = char_val;
  925. X        ascii_name[1] = 0;
  926. X    }
  927. X    else
  928. X    {
  929. X        strncpy(ascii_name,ascii_ctlstr + (char_val * 3),3);
  930. X        ascii_name[3] = 0;
  931. X    }
  932. X
  933. X    return(ascii_name);
  934. X
  935. X}    /* end of hex_to_ascii_name */
  936. X
  937. X/*+-------------------------------------------------------------------------
  938. X    get_curr_dir(cdir,cdir_max) - get current directory into 'cdir'
  939. X--------------------------------------------------------------------------*/
  940. Xint
  941. Xget_curr_dir(cdir,cdir_max)
  942. Xchar *cdir;
  943. Xint cdir_max;
  944. X{
  945. X    FILE *popen();
  946. X    FILE *pipefp = popen("/bin/pwd","r");
  947. X    int itmp;
  948. X
  949. X    strcpy(cdir,".");
  950. X    if(!pipefp)
  951. X        return(-1);
  952. X    fgets(cdir,cdir_max,pipefp);
  953. X    if((itmp = strlen(cdir)) && (*(cdir + itmp - 1) == 0x0A))
  954. X        *(cdir + itmp - 1) = 0;
  955. X    fclose(pipefp);
  956. X    return(0);
  957. X}    /* end of get_curr_dir */
  958. X
  959. X/*+-----------------------------------------------------------------------
  960. X    get_home_dir(home_dir) - get user home directory
  961. X------------------------------------------------------------------------*/
  962. Xget_home_dir(home_dir)
  963. Xchar *home_dir;
  964. X{
  965. X    static char home_directory[256] = "";
  966. X    struct passwd *pwent;
  967. X    char *cptr;
  968. X
  969. X    if(home_directory[0])
  970. X    {
  971. X        strcpy(home_dir,home_directory);
  972. X        return(0);
  973. X    }
  974. X
  975. X    if(cptr = getenv("HOME"))            /* x286 seems to blow up ... */
  976. X    {                                    /* ... in pwent code ... hmmm */
  977. X        strcpy(home_directory,cptr);
  978. X        strcpy(home_dir,cptr);
  979. X        return(0);
  980. X    }
  981. X
  982. X    if(!(pwent = getpwuid(getuid())))
  983. X    {
  984. X        pperror("cannot get pwent for you!!");
  985. X        termecu(TERMECU_PWENT_ERROR);
  986. X    }
  987. X    strcpy(home_directory,pwent->pw_dir);
  988. X    strcpy(home_dir,pwent->pw_dir);
  989. X    endpwent();
  990. X    return(0);
  991. X
  992. X}    /* end of get_home_dir */
  993. X
  994. X/*+-------------------------------------------------------------------------
  995. X    make_ecu_subdir()
  996. Xmust be called early in execution before wierd tty states set, etc.
  997. X--------------------------------------------------------------------------*/
  998. Xvoid
  999. Xmake_ecu_subdir()
  1000. X{
  1001. X    int itmp;
  1002. X    struct stat fst;
  1003. X    char s256[256];
  1004. X    char s258[258];
  1005. X
  1006. X    get_home_dir(s256);
  1007. X    strcat(s256,"/.ecu");
  1008. X    if((!(itmp = stat(s256,&fst))) && ((fst.st_mode & S_IFMT) != S_IFDIR))
  1009. X    {
  1010. X        ff(se,"~/.ecu is not a directory. Rename the file and try again.\n\n");
  1011. X        exit(1);
  1012. X    }
  1013. X    if(itmp)        /* if stat failed, try to make the directory */
  1014. X    {
  1015. X        strcpy(s258,s256);
  1016. X        strcat(s258,"/x");
  1017. X        errno = ENOENT;
  1018. X        if(make_dirs(s258))
  1019. X        {
  1020. X            if(stat(s256,&fst))
  1021. X            {
  1022. X                ff(se,"cannot make ~/.ecu subdirectory.\n");
  1023. X                perror(s256);
  1024. X                exit(1);
  1025. X            }
  1026. X        }
  1027. X    }
  1028. X    chmod(s256,0700);
  1029. X}    /* end of make_ecu_subdir */
  1030. X
  1031. X/*+-------------------------------------------------------------------------
  1032. X    str_classify(sc,str) - classify a string and return value
  1033. X
  1034. XUse the STR_CLASSIFY structure to classify a string (convert str to
  1035. Xlexical token or error code) and return the value;  use last token
  1036. Xin table if no string matches
  1037. X--------------------------------------------------------------------------*/
  1038. Xstr_classify(sc,str)
  1039. XSTR_CLASSIFY *sc;
  1040. Xchar *str;
  1041. X{
  1042. X    while(sc->str)
  1043. X    {
  1044. X        if(minunique(sc->str,str,sc->min_ch))
  1045. X            return(sc->token);
  1046. X        sc++;
  1047. X    }
  1048. X    return(sc->token);
  1049. X}    /* end of str_classify */
  1050. X
  1051. X/*+-------------------------------------------------------------------------
  1052. X    yes_or_no(strarg) - lenient yes/no, on/off
  1053. X
  1054. X  Returns 1 if first char is 'Y' or 'y'
  1055. X    or if strarg is numeric returns the numeric value
  1056. X    or if strarg is alpha == "on" returns 1
  1057. X  Returns 0 otherwise
  1058. X--------------------------------------------------------------------------*/
  1059. Xint
  1060. Xyes_or_no(strarg)
  1061. Xchar *strarg;
  1062. X{
  1063. X    static STR_CLASSIFY sc[] = {
  1064. X        { "yes",    1,1 },
  1065. X        { "on",        2,1 },
  1066. X        { "no",        1,0 },
  1067. X        { "off",    3,0 },
  1068. X        { (char *)0,0,0 },
  1069. X    };
  1070. X
  1071. X    if(isdigit(*strarg))
  1072. X        return(atoi(strarg));
  1073. X    else
  1074. X        return(str_classify(sc,strarg));
  1075. X
  1076. X}    /* end of yes_or_no */
  1077. X
  1078. X/*+-------------------------------------------------------------------------
  1079. X    find_shell_chars(command) - search for shell metacharacters
  1080. X
  1081. Xreturns 1 if found
  1082. X--------------------------------------------------------------------------*/
  1083. Xint
  1084. Xfind_shell_chars(command)
  1085. Xchar *command;
  1086. X{
  1087. X    register schar;
  1088. X    register cchar;
  1089. X    register char *scptr;
  1090. X    static char shell_chars[] = "\\\"~;*?'`{}[]$";
  1091. X
  1092. X    while(cchar = *command++)
  1093. X    {
  1094. X        scptr = shell_chars;
  1095. X        while(schar = *scptr++)
  1096. X            if(schar == cchar)
  1097. X                return(1);
  1098. X    }
  1099. X    return(0);
  1100. X}    /* end of find_shell_chars */
  1101. X
  1102. X/*+-------------------------------------------------------------------------
  1103. X    errno_text(err) - safe sys_errlist lookup
  1104. X--------------------------------------------------------------------------*/
  1105. Xchar *
  1106. Xerrno_text(err)
  1107. Xint err;
  1108. X{
  1109. X    static char errant[32];
  1110. X
  1111. X    if((unsigned)err <= (unsigned)sys_nerr)
  1112. X        return(sys_errlist[errno]);
  1113. X    sprintf(errant,"errno %d",errno);
  1114. X    return(errant);
  1115. X
  1116. X}    /* end of errno_text */
  1117. X
  1118. X/*+-------------------------------------------------------------------------
  1119. X    perror_errmsg(str)
  1120. X--------------------------------------------------------------------------*/
  1121. Xvoid
  1122. Xperror_errmsg(str)
  1123. Xchar *str;
  1124. X{
  1125. X    extern char errmsg[];
  1126. X
  1127. X    sprintf(errmsg,"%s: %s",str,errno_text(errno));
  1128. X}    /* end of perror_errmsg */
  1129. X
  1130. X/*+-------------------------------------------------------------------------
  1131. X    cfree(p,num,size) - fix bug in XENIX -lmalloc
  1132. X--------------------------------------------------------------------------*/
  1133. X#if defined(M_XENIX) && defined(XENIX_MALLOC_LIB_BUG)
  1134. Xcfree(p,num,size)
  1135. Xchar *p;
  1136. Xint num;
  1137. Xint size;
  1138. X{
  1139. X    free(p);
  1140. X}    /* end of cfree */
  1141. X#endif
  1142. X
  1143. X/*+-------------------------------------------------------------------------
  1144. X    defeat_optimize_to_work_around_bug(would_be_optimized)
  1145. X
  1146. Xwork around for GCC 1.39 optimization bug (see ecufkey.c)
  1147. XThis bug was fixed in gcc 1.40
  1148. X--------------------------------------------------------------------------*/
  1149. X#if defined(__GNUC__) && !defined(GCC140)
  1150. Xvoid
  1151. Xdefeat_optimize_to_work_around_bug(would_be_optimized)
  1152. Xint *would_be_optimized;
  1153. X{
  1154. X    ;    /* do absolutely nothing */
  1155. X}    /* end of defeat_optimize_to_work_around_bug */
  1156. X
  1157. X#endif /* __GNUC__ */
  1158. X
  1159. X/*+-------------------------------------------------------------------------
  1160. X    rdchk(fd) - for systems without it but with FIONREAD
  1161. X--------------------------------------------------------------------------*/
  1162. X#if defined(sun) || defined(NO_RDCHK)
  1163. Xint
  1164. Xrdchk(fd)
  1165. Xint fd;
  1166. X{
  1167. X    int chars_waiting;
  1168. X
  1169. X    if(ioctl(fd,FIONREAD,&chars_waiting))
  1170. X        return(0);
  1171. X    else
  1172. X        return(!!chars_waiting);
  1173. X}    /* end of rdchk */
  1174. X#endif
  1175. X
  1176. X/* end of ecuutil.c */
  1177. X/* vi: set tabstop=4 shiftwidth=4: */
  1178. SHAR_EOF
  1179. chmod 0644 ecuutil.c ||
  1180. echo 'restore of ecuutil.c failed'
  1181. Wc_c="`wc -c < 'ecuutil.c'`"
  1182. test 26150 -eq "$Wc_c" ||
  1183.     echo 'ecuutil.c: original size 26150, current size' "$Wc_c"
  1184. rm -f _shar_wnt_.tmp
  1185. fi
  1186. # ============= ecuvmin.h ==============
  1187. if test -f 'ecuvmin.h' -a X"$1" != X"-c"; then
  1188.     echo 'x - skipping ecuvmin.h (File already exists)'
  1189.     rm -f _shar_wnt_.tmp
  1190. else
  1191. > _shar_wnt_.tmp
  1192. echo 'x - extracting ecuvmin.h (Text)'
  1193. sed 's/^X//' << 'SHAR_EOF' > 'ecuvmin.h' &&
  1194. X/*+-------------------------------------------------------------------------
  1195. X    ecuvmin.h  --  set line default VMIN
  1196. X    wht@n4hgf.Mt-Park.GA.US
  1197. X--------------------------------------------------------------------------*/
  1198. X/*+:EDITS:*/
  1199. X/*:09-10-1992-13:59-wht@n4hgf-ECU release 3.20 */
  1200. X/*:08-22-1992-15:38-wht@n4hgf-ECU release 3.20 BETA */
  1201. X/*:03-27-1992-16:21-wht@n4hgf-re-include protection for all .h files */
  1202. X/*:07-25-1991-12:57-wht@n4hgf-ECU release 3.10 */
  1203. X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  1204. X
  1205. X#ifndef _ecuvmin_h
  1206. X#define _ecuvmin_h
  1207. X
  1208. X#if defined(BUILDING_PROTOTYPES)    /* if building protos.h ... */
  1209. X                                    /* ... pick up extra functions */
  1210. X#define XENIX_VMIN        2    /* ... include vmin handling routines */
  1211. X#else
  1212. X#define XENIX_VMIN        1    /* this is the real value for vmin */
  1213. X#endif
  1214. X
  1215. X#endif /* _ecuvmin_h */
  1216. X
  1217. X/* vi: set tabstop=4 shiftwidth=4: */
  1218. X/* end of ecuvmin.h */
  1219. SHAR_EOF
  1220. chmod 0644 ecuvmin.h ||
  1221. echo 'restore of ecuvmin.h failed'
  1222. Wc_c="`wc -c < 'ecuvmin.h'`"
  1223. test 891 -eq "$Wc_c" ||
  1224.     echo 'ecuvmin.h: original size 891, current size' "$Wc_c"
  1225. rm -f _shar_wnt_.tmp
  1226. fi
  1227. # ============= ecuwinutil.c ==============
  1228. if test -f 'ecuwinutil.c' -a X"$1" != X"-c"; then
  1229.     echo 'x - skipping ecuwinutil.c (File already exists)'
  1230.     rm -f _shar_wnt_.tmp
  1231. else
  1232. > _shar_wnt_.tmp
  1233. echo 'x - extracting ecuwinutil.c (Text)'
  1234. sed 's/^X//' << 'SHAR_EOF' > 'ecuwinutil.c' &&
  1235. X/*+-------------------------------------------------------------------------
  1236. X    ecuwinutil.c - curses window utilities
  1237. X    wht@n4hgf.Mt-Park.GA.US
  1238. X
  1239. X  Defined functions:
  1240. X    clear_area(win,y,x,len)
  1241. X    clear_area_char(win,y,x,len,fillchar)
  1242. X    winbox(win)
  1243. X    window_create(title,title_x,tly,tlx,lines,cols)
  1244. X    window_setup(win,title,title_x)
  1245. X    windows_end(botleft_flag)
  1246. X    windows_end_signal()
  1247. X    windows_start()
  1248. X    winget_single(win,nondelim_list,delim_list)
  1249. X    wingets(win,y,x,buf,bufsize,delim,edit,pwgpos)
  1250. X
  1251. X--------------------------------------------------------------------------*/
  1252. X/*+:EDITS:*/
  1253. X/*:09-10-1992-13:59-wht@n4hgf-ECU release 3.20 */
  1254. X/*:08-22-1992-15:38-wht@n4hgf-ECU release 3.20 BETA */
  1255. X/*:02-09-1992-16:08-root@n4hgf-ruling characters only on  SCO (tcap curses) */
  1256. X/*:08-25-1991-14:39-wht@n4hgf-SVR4 port thanks to aega84!lh */
  1257. X/*:08-01-1991-03:52-wht@n4hgf-when editing string, set cursor to end */
  1258. X/*:07-25-1991-12:57-wht@n4hgf-ECU release 3.10 */
  1259. X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  1260. X
  1261. X#include "ecucurses.h"
  1262. X#include <errno.h>
  1263. X#include "ecukey.h"
  1264. X#include "ecuxkey.h"
  1265. X#include "termecu.h"
  1266. X#include "pc_scr.h"
  1267. X#ifdef USE_PROTOS
  1268. X# include "protos.h"
  1269. X#endif
  1270. X
  1271. X#if !defined(ushort)
  1272. X#define ushort unsigned short
  1273. X#endif
  1274. X#if !defined(uchar)
  1275. X#define uchar unsigned char
  1276. X#endif
  1277. X#if !defined(uint)
  1278. X#define uint unsigned int
  1279. X#endif
  1280. X#if !defined(ulong)
  1281. X#define ulong unsigned long
  1282. X#endif
  1283. X
  1284. Xextern int tty_is_multiscreen;
  1285. X
  1286. X#ifdef M_SYSV
  1287. Xunsigned char sTL = at_TL;
  1288. Xunsigned char sTR = at_TR;
  1289. Xunsigned char sBL = at_BL;
  1290. Xunsigned char sBR = at_BR;
  1291. Xunsigned char sLT = at_LT;
  1292. Xunsigned char sRT = at_RT;
  1293. Xunsigned char sVR = at_VR;
  1294. Xunsigned char sHR = at_HR;
  1295. X#else
  1296. Xunsigned char sTL = vanilla_TL;
  1297. Xunsigned char sTR = vanilla_TR;
  1298. Xunsigned char sBL = vanilla_BL;
  1299. Xunsigned char sBR = vanilla_BR;
  1300. Xunsigned char sLT = vanilla_LT;
  1301. Xunsigned char sRT = vanilla_RT;
  1302. Xunsigned char sVR = vanilla_VR;
  1303. Xunsigned char sHR = vanilla_HR;
  1304. X#endif
  1305. X
  1306. Xint windows_active = 0;
  1307. X
  1308. Xint ttymode_before_window_start;
  1309. X
  1310. X/*+-------------------------------------------------------------------------
  1311. X    clear_area_char(win,y,x,len,fillchar)
  1312. X--------------------------------------------------------------------------*/
  1313. Xvoid
  1314. Xclear_area_char(win,y,x,len,fillchar)
  1315. XWINDOW *win;
  1316. Xint y;
  1317. Xint x;
  1318. Xint len;
  1319. Xchar fillchar;
  1320. X{
  1321. X    wmove(win,y,x);
  1322. X    while(len-- > 0)
  1323. X        waddch(win,fillchar & 0xFF);
  1324. X    wmove(win,y,x);
  1325. X
  1326. X}    /* end of clear_area_char */
  1327. X
  1328. X/*+-------------------------------------------------------------------------
  1329. X    clear_area(win,y,x,len)
  1330. X--------------------------------------------------------------------------*/
  1331. Xvoid
  1332. Xclear_area(win,y,x,len)
  1333. XWINDOW *win;
  1334. Xint y;
  1335. Xint x;
  1336. Xint len;
  1337. X{
  1338. X    clear_area_char(win,y,x,len,' ');
  1339. X}    /* end of clear_area_char */
  1340. X
  1341. X/*+-------------------------------------------------------------------------
  1342. X    windows_start()
  1343. X--------------------------------------------------------------------------*/
  1344. Xvoid
  1345. Xwindows_start()
  1346. X{
  1347. X    extern int tty_not_char_special;
  1348. X    static int initscr_already_performed = 0;
  1349. X
  1350. X    if(tty_not_char_special)
  1351. X    {
  1352. X        errno = ENOTTY;
  1353. X        fprintf(stderr,"curses features unavailable when stdin not tty\r\n");
  1354. X        termecu(TERMECU_CURSES_ERROR);
  1355. X    }
  1356. X
  1357. X    ttymode_before_window_start = get_ttymode();
  1358. X    ttymode(0);
  1359. X    if(!initscr_already_performed && !initscr())
  1360. X    {
  1361. X        fprintf(stderr,"curses init failure ... check terminal type\r\n");
  1362. X        termecu(TERMECU_CURSES_ERROR);
  1363. X    }
  1364. X    initscr_already_performed = 1;
  1365. X    scrollok(stdscr,0);
  1366. X    savetty(); 
  1367. X    raw(); 
  1368. X    noecho(); 
  1369. X    nonl(); 
  1370. X    clear();
  1371. X#if defined(M_TERMINFO)
  1372. X    typeahead(-1);
  1373. X#endif
  1374. X    windows_active = 1;
  1375. X
  1376. X#if defined(M_SYSV)
  1377. X    if(!tty_is_multiscreen)
  1378. X    {
  1379. X        sTL = vanilla_TL;
  1380. X        sTR = vanilla_TR;
  1381. X        sBL = vanilla_BL;
  1382. X        sBR = vanilla_BR;
  1383. X        sLT = vanilla_LT;
  1384. X        sRT = vanilla_RT;
  1385. X        sVR = vanilla_VR;
  1386. X        sHR = vanilla_HR;
  1387. X    }
  1388. X#endif
  1389. X
  1390. X    wclear(stdscr);
  1391. X    touchwin(stdscr);
  1392. X    wrefresh(stdscr);
  1393. X
  1394. X}    /* end of windows_start */
  1395. X
  1396. X/*+-------------------------------------------------------------------------
  1397. X    windows_end(botleft_flag)
  1398. X--------------------------------------------------------------------------*/
  1399. Xvoid
  1400. Xwindows_end(botleft_flag)
  1401. Xint botleft_flag;
  1402. X{
  1403. X    if(!windows_active)
  1404. X        return;
  1405. X/*
  1406. X    endwin();
  1407. X*/
  1408. X    if(botleft_flag)
  1409. X        tcap_cursor(LINES - 1,0);
  1410. X    ttymode(ttymode_before_window_start);
  1411. X    windows_active = 0;
  1412. X}    /* end of windows_end */
  1413. X
  1414. X/*+-------------------------------------------------------------------------
  1415. X    windows_end_signal() -- called by termecu()
  1416. X--------------------------------------------------------------------------*/
  1417. Xvoid
  1418. Xwindows_end_signal()
  1419. X{
  1420. X    windows_end(0);
  1421. X}    /* end of windows_end_signal */
  1422. X
  1423. X/*+-------------------------------------------------------------------------
  1424. X    winbox(win)
  1425. X--------------------------------------------------------------------------*/
  1426. Xvoid
  1427. Xwinbox(win)
  1428. XWINDOW *win;
  1429. X{
  1430. X
  1431. X#if defined(SVR4)
  1432. X    box(win,(unsigned long)sVR,(unsigned long)sHR);
  1433. X#else
  1434. X    box(win,sVR,sHR);
  1435. X    wmove(win,0,0); waddch(win,(unsigned)sTL);
  1436. X    wmove(win,win->_maxy - 1,0); waddch(win,(unsigned)sBL);
  1437. X    wmove(win,win->_maxy - 1,win->_maxx - 1); waddch(win,(unsigned)sBR);
  1438. X    wmove(win,0,win->_maxx - 1); waddch(win,(unsigned)sTR);
  1439. X#endif
  1440. X
  1441. X}    /* end of winbox */
  1442. X
  1443. X/*+-------------------------------------------------------------------------
  1444. X    window_setup(win,title,title_x)
  1445. X--------------------------------------------------------------------------*/
  1446. Xvoid
  1447. Xwindow_setup(win,title,title_x)
  1448. XWINDOW *win;
  1449. Xchar *title;
  1450. Xint title_x;
  1451. X{
  1452. X    register stand = (title_x < 0);
  1453. X
  1454. X    if(stand)
  1455. X        title_x = -title_x;
  1456. X
  1457. X    touchwin(win);
  1458. X    scrollok(win,0);        /* do not scroll */
  1459. X    winbox(win);
  1460. X    wmove(win,0,title_x);
  1461. X    if(stand)
  1462. X        wstandout(win);
  1463. X    waddch(win,'[');
  1464. X    wprintw(win," %s ",title);
  1465. X    waddch(win,']');
  1466. X    if(stand)
  1467. X        wstandend(win);
  1468. X}    /* end of window_setup */
  1469. X
  1470. X/*+-------------------------------------------------------------------------
  1471. X    window_create(title,title_x,tly,tlx,lines,cols)
  1472. Xif title_x negative, make title "stand" out
  1473. X--------------------------------------------------------------------------*/
  1474. XWINDOW *
  1475. Xwindow_create(title,title_x,tly,tlx,lines,cols)
  1476. Xchar *title;
  1477. Xint title_x;
  1478. Xint tly;
  1479. Xint tlx;
  1480. Xint lines;
  1481. Xint cols;
  1482. X{
  1483. X    register WINDOW *nwin = newwin(lines,cols,tly,tlx);
  1484. X    
  1485. X    if(nwin)
  1486. X        window_setup(nwin,title,title_x);
  1487. X    else
  1488. X    {
  1489. X        fprintf(stderr,"\r\ncurses error: cannot create new window\r\n");
  1490. X        termecu(TERMECU_CURSES_ERROR);
  1491. X    }
  1492. X    return(nwin);
  1493. X}    /* end of window_create */
  1494. X
  1495. X/*+-------------------------------------------------------------------------
  1496. X    wingets(win,y,x,buf,bufsize,delim,edit,pwgpos)
  1497. X
  1498. XThis procedure reads a string from win and returns the number
  1499. Xof characters read.
  1500. X
  1501. XIf edit is non-zero and pwgpos is not null, the inital string
  1502. Xposition is set by dereferencing the pointer.
  1503. X
  1504. XThe terminating delim is returned in 'delim'.
  1505. X
  1506. XIf pwgpos is not null, the ending string position is returned in
  1507. Xthe integer pointed to.
  1508. X
  1509. X-1 is returned if an ESCape is typed by the keyboard user,
  1510. Xotherwise the count of characters in the string.
  1511. X
  1512. XThe entire line must be contained on one line (no line wrap supported).
  1513. X--------------------------------------------------------------------------*/
  1514. Xint
  1515. Xwingets(win,y,x,buf,bufsize,delim,edit,pwgpos)
  1516. XWINDOW *win;
  1517. Xint y;
  1518. Xregister x;
  1519. Xregister char *buf;
  1520. Xint bufsize;    /* includes room for null..field is 1 less */
  1521. Xregister uchar *delim;
  1522. Xint edit;
  1523. Xint *pwgpos;
  1524. X{
  1525. X    register count = 0;
  1526. X    register pos = 0;
  1527. X    int insert_mode = 0;
  1528. X    int rtn_val = 0;
  1529. X
  1530. X    bufsize--;
  1531. X    clear_area_char(win,y,x,bufsize,'_');
  1532. X    if(edit)
  1533. X    {
  1534. X        waddstr(win,buf);
  1535. X        count = pos = strlen(buf);
  1536. X        if(pwgpos)
  1537. X        {
  1538. X            pos = *pwgpos;
  1539. X            if((pos < 0) || (pos > count))
  1540. X                pos = count;
  1541. X        }
  1542. X    }
  1543. X    else
  1544. X        *buf = 0;
  1545. X    wmove(win,y,x + pos);
  1546. X
  1547. X    while(1)
  1548. X    {
  1549. X        wrefresh(win);
  1550. X        *delim = ttygetc(1);
  1551. X        if((*delim < 0x20) || (*delim >= 0x7F))
  1552. X        {
  1553. X            switch(*delim)
  1554. X            {
  1555. X                case CRET:
  1556. X                    *delim = NL;
  1557. X                case NL:
  1558. X                    wrefresh(win);
  1559. X                    rtn_val = count;
  1560. X                    goto RETURN;
  1561. X
  1562. X                case BS:
  1563. X                    if(count)
  1564. X                    {
  1565. X                        if(count == pos)
  1566. X                        {
  1567. X                            *(buf + --count) = 0;
  1568. X                            wmove(win,y,x + count);
  1569. X                            waddch(win,'_');
  1570. X                            wmove(win,y,x + count);
  1571. X                            pos--;
  1572. X                        }
  1573. X                        else
  1574. X                        {
  1575. X                            if(!pos)
  1576. X                                continue;
  1577. X                            mem_cpy(buf + pos - 1,buf + pos,count - pos);
  1578. X                            *(buf + --count) = 0;
  1579. X                            wmove(win,y,x + --pos);
  1580. X                            waddstr(win,buf + pos);
  1581. X                            waddch(win,'_');
  1582. X                            wmove(win,y,x + pos);
  1583. X                        }
  1584. X                    }
  1585. X                    continue;
  1586. X
  1587. X                case XFcurlf:
  1588. X                    if(pos)
  1589. X                        wmove(win,y,x + --pos);
  1590. X                    continue;
  1591. X
  1592. X                case XFcurrt:
  1593. X                    if(pos < count)
  1594. X                        wmove(win,y,x + ++pos);
  1595. X                    continue;
  1596. X
  1597. X                case XFins:
  1598. X                    insert_mode = !insert_mode;
  1599. X                    continue;
  1600. X
  1601. X                case ESC:
  1602. X                    rtn_val = -1;
  1603. X                    goto RETURN;
  1604. X
  1605. X                case CTL_U:
  1606. X                    clear_area_char(win,y,x,bufsize,'_');
  1607. X                    count = 0;
  1608. X                    pos = 0;
  1609. X                    *buf = 0;
  1610. X                    continue;
  1611. X
  1612. X                default:
  1613. X                    *(buf + count) = 0;
  1614. X                    rtn_val = count;
  1615. X                    goto RETURN;
  1616. X
  1617. X            }    /* end of switch(*delim) */
  1618. X            /*NOTREACHED*/
  1619. X        }        /* end of if read delimiter */
  1620. X
  1621. X        if(count == bufsize)
  1622. X        {
  1623. X            ring_bell();
  1624. X            continue;
  1625. X        }
  1626. X
  1627. X        if(insert_mode && (pos != count))
  1628. X        {
  1629. X            waddch(win,*delim);
  1630. X            waddstr(win,buf + pos);
  1631. X            mem_cpy(buf + pos + 1,buf + pos,count - pos);
  1632. X            *(buf + pos++) = *delim;
  1633. X            *(buf + ++count) = 0;
  1634. X            wmove(win,y,x + pos);
  1635. X        }
  1636. X        else
  1637. X        {
  1638. X            waddch(win,*delim);
  1639. X            *(buf + pos) = *delim;
  1640. X            if(pos == count)
  1641. X                *(buf + ++count) = 0;
  1642. X            pos++;
  1643. X        }
  1644. X    }    /* end of while can get character */
  1645. X
  1646. XRETURN:
  1647. X    if(pwgpos)
  1648. X        *pwgpos = pos;
  1649. X    return(rtn_val);
  1650. X
  1651. X}    /* end of wingets */
  1652. X
  1653. X/*+-------------------------------------------------------------------------
  1654. X    winget_single(win,nondelim_list,delim_list)
  1655. X
  1656. XThis procedure assumes cursor is positioned, repeats reading a non-echoing
  1657. Xcharacter from the keyboard until it matches a character in nondelim_list
  1658. Xor delim_list.  delim_list is expected to contain printable characters
  1659. Xand no upper-case characters.
  1660. X
  1661. XIf no match occurs, the bell is rung and the keyboard is read again.
  1662. X
  1663. XIf the input character matches a character in delim_list, the index (0-n)
  1664. Xof the character in delim_list is returned.  If a match occurs, an
  1665. Xupper-case version of the matching character is placed in the window.
  1666. X
  1667. XIf the input character matches a character in nondelim_list, the character
  1668. Xis returned or'ed with 0x1000
  1669. X
  1670. X--------------------------------------------------------------------------*/
  1671. Xint
  1672. Xwinget_single(win,nondelim_list,delim_list)
  1673. XWINDOW *win;
  1674. Xregister char *nondelim_list;
  1675. Xregister char *delim_list;
  1676. X{
  1677. X    register itmp;
  1678. X    register nlen = strlen(nondelim_list);
  1679. X    register dlen = strlen(delim_list);
  1680. X    register ichar;
  1681. X
  1682. X    wrefresh(win);
  1683. X
  1684. X    while(1)
  1685. X    {
  1686. X        ichar = to_lower(ttygetc(1));
  1687. X        for(itmp = 0; itmp < nlen; itmp++)
  1688. X        {
  1689. X            if(ichar == nondelim_list[itmp])
  1690. X            {
  1691. X                waddch(win,to_upper(ichar));
  1692. X                wrefresh(win);
  1693. X                return(itmp);
  1694. X            }
  1695. X        }
  1696. X        for(itmp = 0; itmp < dlen; itmp++)
  1697. X        {
  1698. X            if(ichar == delim_list[itmp])
  1699. X                return(ichar | 0x1000);
  1700. X        }
  1701. X        ring_bell();
  1702. X    }
  1703. X
  1704. X}    /* end of winget_single */
  1705. X
  1706. X/* end of ecuwinutil.c */
  1707. X/* vi: set tabstop=4 shiftwidth=4: */
  1708. SHAR_EOF
  1709. chmod 0644 ecuwinutil.c ||
  1710. echo 'restore of ecuwinutil.c failed'
  1711. Wc_c="`wc -c < 'ecuwinutil.c'`"
  1712. test 10846 -eq "$Wc_c" ||
  1713.     echo 'ecuwinutil.c: original size 10846, current size' "$Wc_c"
  1714. rm -f _shar_wnt_.tmp
  1715. fi
  1716. # ============= ecuxfer.c ==============
  1717. if test -f 'ecuxfer.c' -a X"$1" != X"-c"; then
  1718.     echo 'x - skipping ecuxfer.c (File already exists)'
  1719.     rm -f _shar_wnt_.tmp
  1720. else
  1721. > _shar_wnt_.tmp
  1722. echo 'x - extracting ecuxfer.c (Text)'
  1723. sed 's/^X//' << 'SHAR_EOF' > 'ecuxfer.c' &&
  1724. X/*+-------------------------------------------------------------------------
  1725. X    ecuxfer.c - file transfer
  1726. X    wht@n4hgf.Mt-Park.GA.US
  1727. X
  1728. X   000000000011111111112222222222333333333344444444445555555555666666666actually
  1729. X   012345678901234567890123456789012345678901234567890123456789012345678wider
  1730. X00:.--[ Send ZMODEM/CRC32 ]--------------------------------------------.
  1731. X01:|                                                                   |
  1732. X02:|  File? to send:                                                   |
  1733. X03:|  ................................................................ |
  1734. X04:|                                                                   |
  1735. X05:|  Binary: Y (no CR/LF translation)                                 |
  1736. X06:|  Overwrite destination files: Y                                   |
  1737. X07:|  Send full pathnames: N                                           |
  1738. X08:|  Transfer only newer files:   N (if receiver supports)            |
  1739. X09:|  Resume interrupted transfer: N (if receiver supports)            |
  1740. X10:|  ZMODEM window: ______                                            |
  1741. X11:|                                                                   |
  1742. X-1:| TAB:next  ^B:prev  END:perform transfer  ESC:abort                |
  1743. X-0:`-------------------------------------------------------------------'
  1744. X
  1745. X  Defined functions:
  1746. X    file_xfer_done_bell()
  1747. X    file_xfer_start()
  1748. X    receive_files_from_remote(argc,argv)
  1749. X    report_send_status()
  1750. X    send_files_to_remote(argc,argv)
  1751. X    xfer_title_fragment()
  1752. X    xfrw_bot_msg(msg)
  1753. X    xfrw_display_cmd_line()
  1754. X    xfrw_get_single(nondelim_list)
  1755. X    xfrws_display_allvars()
  1756. X    xfrws_display_binary()
  1757. X    xfrws_display_literals()
  1758. X    xfrws_display_name()
  1759. X    xfrws_display_resume()
  1760. X    xfrws_display_xfernew()
  1761. X
  1762. X--------------------------------------------------------------------------*/
  1763. X/*+:EDITS:*/
  1764. X/*:09-10-1992-13:59-wht@n4hgf-ECU release 3.20 */
  1765. X/*:09-05-1992-15:31-wht@n4hgf-add resume choice  */
  1766. X/*:08-22-1992-15:38-wht@n4hgf-ECU release 3.20 BETA */
  1767. X/*:08-21-1992-15:21-wht@n4hgf-look for ecu xfer programs in ECULIBDIR */
  1768. X/*:09-25-1991-16:26-wht@n4hgf2-flexible C-Kermit filename */
  1769. X/*:09-17-1991-19:41-wht@n4hgf-restore console termio after xfer prog runs */
  1770. X/*:08-28-1991-14:07-wht@n4hgf2-SVR4 cleanup by aega84!lh */
  1771. X/*:08-25-1991-14:39-wht@n4hgf-SVR4 port thanks to aega84!lh */
  1772. X/*:07-25-1991-12:57-wht@n4hgf-ECU release 3.10 */
  1773. X/*:07-17-1991-07:04-wht@n4hgf-avoid SCO UNIX nap bug */
  1774. X/*:07-14-1991-18:18-wht@n4hgf-new ttygets functions */
  1775. X/*:06-04-1991-14:18-wht@n4hgf-sometimes I forget 286: zwindw_size now uint */
  1776. X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  1777. X
  1778. X#include "ecucurses.h"
  1779. X
  1780. X#define STDIO_H_INCLUDED
  1781. X#define OMIT_TERMIO_REFERENCES
  1782. X#include "ecu.h"
  1783. X#include "ecuerror.h"
  1784. X#include "ecukey.h"
  1785. X#include "ecuxkey.h"
  1786. X#include "ecutty.h"
  1787. X#include "pc_scr.h"
  1788. X
  1789. Xlong atol();
  1790. Xchar *find_executable();
  1791. X
  1792. X#ifdef M_I286
  1793. X#define ZWINDW_LIMIT 65472
  1794. X#else
  1795. X#define ZWINDW_LIMIT 65536
  1796. X#endif
  1797. X
  1798. X/* -- protocol xfer types -- */
  1799. X#define ECUSZ_X            1
  1800. X#define ECUSZ_Y            2
  1801. X#define ECUSZ_Z            3
  1802. X#define ECUSEA            4
  1803. X#define CKERMIT            5
  1804. X#define ECURZ_X            7
  1805. X#define ECURZ_Y            8
  1806. X#define ECURZ_Z            9
  1807. X
  1808. X/* --------------------- send window ----------------------------------- */
  1809. X/*      SNDW_LINES            calculated (xfrw_lines) */
  1810. X#define SNDW_COLS            79
  1811. X#define SNDW_TLY            2
  1812. X/*      SNDW_TLX            calculated (xfrw_tlx) */
  1813. X
  1814. X#define SNDW_FILE_LY        2
  1815. X#define SNDW_FILE_LX        3
  1816. X#define SNDW_FILE_Y            3
  1817. X#define SNDW_FILE_X            3
  1818. X#define SNDW_FILE_LEN        (SNDW_COLS - SNDW_FILE_X - 2)
  1819. X
  1820. X#define SNDW_BIN_Y            5
  1821. X#define SNDW_BIN_LX            3
  1822. X#define SNDW_BIN_X            11
  1823. X#define SNDW_BIN_LX2        13
  1824. X
  1825. X#define SNDW_OVERW_Y        6
  1826. X#define SNDW_OVERW_LX        3
  1827. X#define SNDW_OVERW_X        32
  1828. X
  1829. X#define SNDW_SENDFULL_Y        7
  1830. X#define SNDW_SENDFULL_LX    3
  1831. X#define SNDW_SENDFULL_X        24
  1832. X
  1833. X#define SNDW_XFERNEW_Y        8
  1834. X#define SNDW_XFERNEW_LX        3
  1835. X#define SNDW_XFERNEW_X        32
  1836. X
  1837. X#define SNDW_RESUME_Y        9
  1838. X#define SNDW_RESUME_LX        3
  1839. X#define SNDW_RESUME_X        32
  1840. X
  1841. X#define SNDW_ZWINDW_Y        10
  1842. X#define SNDW_ZWINDW_LX        3
  1843. X#define SNDW_ZWINDW_X        16
  1844. X#define SNDW_ZWINDW_LEN        6
  1845. X
  1846. Xextern char curr_dir[CURR_DIRSIZ];        /* current working directory */
  1847. Xextern int protocol_log_packets;
  1848. Xextern int last_child_wait_status;
  1849. X
  1850. Xlong file_xfer_start_time;    /* time() value at beginning of file xfer */
  1851. Xchar xfertype = -1;        /* file xfer type */
  1852. XWINDOW *xfrw;
  1853. Xchar xfrw_cols;
  1854. Xchar xfrw_lines;
  1855. Xchar xfrw_tlx;
  1856. X
  1857. Xchar p_binary;        /* xfer options -- not all apply to all protocols */
  1858. Xchar p_sendfull;
  1859. Xchar p_overwrite;
  1860. Xchar p_xfernew;
  1861. Xchar p_resume;
  1862. Xchar p_filelist[80];
  1863. Xuint zwindw_size;
  1864. X
  1865. X/*+-------------------------------------------------------------------------
  1866. X    file_xfer_start()
  1867. X--------------------------------------------------------------------------*/
  1868. Xvoid
  1869. Xfile_xfer_start()
  1870. X{
  1871. X    time(&file_xfer_start_time);
  1872. X}    /* end of file_xfer_start */
  1873. X
  1874. X/*+-------------------------------------------------------------------------
  1875. X    file_xfer_done_bell()
  1876. X--------------------------------------------------------------------------*/
  1877. Xvoid
  1878. Xfile_xfer_done_bell()
  1879. X{
  1880. X    long xfer_time;
  1881. X    int xbell_count = 0;
  1882. X
  1883. X    time(&xfer_time);
  1884. X    xfer_time -= file_xfer_start_time;
  1885. X    sleep(1);
  1886. X    xbell_count = 1;
  1887. X    if(xfer_time >= 3600L)            /* >= one hour */
  1888. X        xbell_count = 3;
  1889. X    else if(xfer_time >= 1800L)        /* >= 1/2 hour */
  1890. X        xbell_count = 2;
  1891. X
  1892. X    if(shm->bell_notify_state)
  1893. X        bell_notify(XBELL_ATTENTION);
  1894. X    xbell(XBELL_DONE,xbell_count);
  1895. X
  1896. X}    /* end of file_xfer_done_bell */
  1897. X
  1898. X/*+-------------------------------------------------------------------------
  1899. X    xfrw_bot_msg(msg)
  1900. X--------------------------------------------------------------------------*/
  1901. Xvoid
  1902. Xxfrw_bot_msg(msg)
  1903. Xchar *msg;
  1904. X{
  1905. X    register itmp;
  1906. X    register itmp2;
  1907. X    static last_msglen = 0;
  1908. X    char msg2[80];
  1909. X
  1910. X    wmove(xfrw,xfrw_lines - 1,3);
  1911. X
  1912. X    if((itmp = strlen(msg)) == 0)
  1913. X    {
  1914. X        itmp2 = last_msglen + 2;
  1915. X#if defined(SVR4)
  1916. X        whline(xfrw, (unsigned long)(sHR & 0x00ff), itmp2);
  1917. X#else
  1918. X        for(itmp = 0; itmp < itmp2; itmp++)
  1919. X            waddch(xfrw,(unsigned)sHR);
  1920. X#endif
  1921. X        last_msglen = 0;
  1922. X    }
  1923. X    else
  1924. X    {
  1925. X        waddch(xfrw,' ');
  1926. X        if(itmp > xfrw_cols - 3 - 2)
  1927. X        {
  1928. X            strncpy(msg2,msg,xfrw_cols - 3 - 2);
  1929. X            msg2[xfrw_cols - 3 - 2 + 1] = 0;
  1930. X            waddstr(xfrw,msg2);
  1931. X            itmp = strlen(msg2);
  1932. X        }
  1933. X        else
  1934. X        {
  1935. X            waddstr(xfrw,msg);
  1936. X            itmp = strlen(msg);
  1937. X        }
  1938. X        waddch(xfrw,' ');
  1939. X        if((itmp2 = last_msglen - itmp) > 0)
  1940. X        {
  1941. X#if defined(SVR4)
  1942. X            whline(xfrw, (unsigned long)(sHR & 0x00ff), itmp2);
  1943. X#else
  1944. X            while(itmp2--)
  1945. X                waddch(xfrw,(unsigned)sHR);
  1946. X#endif
  1947. X        }
  1948. X        last_msglen = itmp;        /* remember last message length */
  1949. X    }
  1950. X    wrefresh(xfrw);
  1951. X}    /* end of xfrw_bot_msg */
  1952. X
  1953. X/*+-------------------------------------------------------------------------
  1954. X    xfrw_get_single(nondelim_list)
  1955. Xassumes cursor is already positioned
  1956. X--------------------------------------------------------------------------*/
  1957. Xint
  1958. Xxfrw_get_single(nondelim_list)
  1959. Xregister char *nondelim_list;
  1960. X{
  1961. X    register uint itmp;
  1962. X    static uchar xfrw_nondelim_list[] =
  1963. X    {
  1964. X        CRET,NL,XFcurup,XFcurdn,CTL_B,TAB,ESC,CTL_L,CTL_R,XFend,(uchar)0
  1965. X    };
  1966. X
  1967. X    itmp = winget_single(xfrw,nondelim_list,xfrw_nondelim_list);
  1968. X    if( (itmp & 0xFF) == CRET)
  1969. X        itmp = NL | 0x1000;
  1970. X    return(itmp);
  1971. X}    /* end of xfrw_get_single */
  1972. X
  1973. X/*+-------------------------------------------------------------------------
  1974. X    xfer_title_fragment()
  1975. X--------------------------------------------------------------------------*/
  1976. Xchar *
  1977. Xxfer_title_fragment()
  1978. X{
  1979. X    register char *cptr = "UNKNOWN";
  1980. X
  1981. X    switch(xfertype)
  1982. X    {
  1983. X        case ECURZ_X:
  1984. X        case ECUSZ_X: cptr = "XMODEM/CRC"; break;
  1985. X        case ECURZ_Y:
  1986. X        case ECUSZ_Y: cptr = "YMODEM/CRC"; break;
  1987. X        case ECURZ_Z:
  1988. X        case ECUSZ_Z: cptr = "ZMODEM/CRC32"; break;
  1989. X        case ECUSEA:  cptr = "SEAlink"; break;
  1990. X        case CKERMIT: cptr = "KERMIT/CRC" ;break;
  1991. X    }
  1992. X    return(cptr);
  1993. X}    /* end of xfer_title_fragment */
  1994. X
  1995. X/*+-------------------------------------------------------------------------
  1996. X    xfrw_display_cmd_line()
  1997. X--------------------------------------------------------------------------*/
  1998. Xvoid
  1999. Xxfrw_display_cmd_line()
  2000. X{
  2001. X    register itmp;
  2002. X    char *cmd_string = "TAB:next  ^B:prev  END:perform transfer  ESC:abort"; 
  2003. X    register left_spaces = ((xfrw_cols - 2) - strlen(cmd_string)) / (unsigned)2;
  2004. X    int x;
  2005. X    int y;
  2006. X
  2007. X    wmove(xfrw,xfrw_lines - 2,1);
  2008. X    wstandout(xfrw);
  2009. X    for(itmp = 0; itmp < left_spaces; itmp++)
  2010. X        waddch(xfrw,' ');
  2011. X    waddstr(xfrw,cmd_string);
  2012. X    getyx(xfrw,y,x);
  2013. X    while(++x < xfrw_cols)
  2014. X        waddch(xfrw,' '); 
  2015. X    wstandend(xfrw);
  2016. X
  2017. X}    /* end of xfrw_display_cmd_line */
  2018. X
  2019. X/*+-------------------------------------------------------------------------
  2020. X    xfrws_display_literals()
  2021. X--------------------------------------------------------------------------*/
  2022. Xvoid
  2023. Xxfrws_display_literals()
  2024. X{
  2025. X    wmove(xfrw,SNDW_FILE_LY,SNDW_FILE_LX);
  2026. X    if(xfertype == ECUSZ_X)
  2027. X        waddstr(xfrw,"File");
  2028. X    else
  2029. X        waddstr(xfrw,"File(s)");
  2030. X    waddstr(xfrw," to send:");
  2031. X
  2032. X    switch(xfertype)
  2033. X    {
  2034. X        case ECUSZ_Z:
  2035. X            wmove(xfrw,SNDW_XFERNEW_Y,SNDW_XFERNEW_LX);
  2036. X            waddstr(xfrw,"Transfer only newer files:");
  2037. X            wmove(xfrw,SNDW_SENDFULL_Y,SNDW_SENDFULL_LX);
  2038. X            waddstr(xfrw,"Send full pathames:");
  2039. X            wmove(xfrw,SNDW_RESUME_Y,SNDW_RESUME_LX);
  2040. X            waddstr(xfrw,"Resume interrupted transfer:");
  2041. X            wmove(xfrw,SNDW_ZWINDW_Y,SNDW_ZWINDW_LX);
  2042. X            waddstr(xfrw,"Window size:");
  2043. X        case CKERMIT:
  2044. X            wmove(xfrw,SNDW_OVERW_Y,SNDW_OVERW_LX);
  2045. X            waddstr(xfrw,"Overwrite destination files:");
  2046. X        case ECUSZ_Y:
  2047. X        case ECUSZ_X:
  2048. X            wmove(xfrw,SNDW_BIN_Y,SNDW_BIN_LX);
  2049. X            waddstr(xfrw,"Binary:");
  2050. X    }
  2051. X}    /* end of xfrws_display_literals */
  2052. X
  2053. X/*+-------------------------------------------------------------------------
  2054. X    xfrws_display_name()
  2055. X--------------------------------------------------------------------------*/
  2056. Xvoid
  2057. Xxfrws_display_name()
  2058. X{
  2059. X    clear_area(xfrw,SNDW_FILE_Y,SNDW_FILE_X,SNDW_FILE_LEN);
  2060. X    waddstr(xfrw,p_filelist);
  2061. X
  2062. X}    /* end of xfrws_display_name */
  2063. X
  2064. X/*+-------------------------------------------------------------------------
  2065. X    xfrws_display_binary()
  2066. X--------------------------------------------------------------------------*/
  2067. Xvoid
  2068. Xxfrws_display_binary()
  2069. X{
  2070. X    wmove(xfrw,SNDW_BIN_Y,SNDW_BIN_X);
  2071. X    waddch(xfrw,(p_binary) ? 'Y' : 'N');
  2072. X    if(p_binary)
  2073. X        waddstr(xfrw," (no NL-CR/LF translation)     ");
  2074. X    else
  2075. X        waddstr(xfrw," (NL-CR/LF translation enabled)");
  2076. X
  2077. X}    /* end of xfrws_display_binary */
  2078. X
  2079. X/*+-------------------------------------------------------------------------
  2080. X    xfrws_display_xfernew()
  2081. X--------------------------------------------------------------------------*/
  2082. Xvoid
  2083. Xxfrws_display_xfernew()
  2084. X{
  2085. X    wmove(xfrw,SNDW_XFERNEW_Y,SNDW_XFERNEW_X);
  2086. X    waddch(xfrw,(p_xfernew) ? 'Y' : 'N');
  2087. X    if(p_xfernew)
  2088. X        waddstr(xfrw," (if receiver supports)");
  2089. X    else
  2090. X        waddstr(xfrw,"                       ");
  2091. X}    /* end of xfrws_display_xfernew */
  2092. X
  2093. X/*+-------------------------------------------------------------------------
  2094. X    xfrws_display_resume()
  2095. X--------------------------------------------------------------------------*/
  2096. Xvoid
  2097. Xxfrws_display_resume()
  2098. X{
  2099. X    wmove(xfrw,SNDW_RESUME_Y,SNDW_RESUME_X);
  2100. X    waddch(xfrw,(p_resume) ? 'Y' : 'N');
  2101. X    if(p_resume)
  2102. X        waddstr(xfrw," (if receiver supports)");
  2103. X    else
  2104. X        waddstr(xfrw,"                       ");
  2105. X}    /* end of xfrws_display_resume */
  2106. X
  2107. X/*+-------------------------------------------------------------------------
  2108. X    xfrws_display_allvars()
  2109. X--------------------------------------------------------------------------*/
  2110. Xvoid
  2111. Xxfrws_display_allvars()
  2112. X{
  2113. X    char s32[32];
  2114. X
  2115. X    xfrws_display_name();
  2116. X    switch(xfertype)
  2117. X    {
  2118. X        case ECUSZ_Z:
  2119. X            xfrws_display_xfernew();
  2120. X            xfrws_display_resume();
  2121. X            wmove(xfrw,SNDW_SENDFULL_Y,SNDW_SENDFULL_X);
  2122. X            waddch(xfrw,(p_sendfull) ? 'Y' : 'N');
  2123. X            wmove(xfrw,SNDW_ZWINDW_Y,SNDW_ZWINDW_X);
  2124. X            sprintf(s32,"%u",zwindw_size);
  2125. X            waddstr(xfrw,s32);
  2126. X        case CKERMIT:
  2127. X            wmove(xfrw,SNDW_OVERW_Y,SNDW_OVERW_X);
  2128. X            waddch(xfrw,(p_overwrite) ? 'Y' : 'N');
  2129. X        case ECUSZ_Y:
  2130. X        case ECUSZ_X:
  2131. X            xfrws_display_binary();
  2132. X    }
  2133. X}    /* end of xfrws_display_allvars */
  2134. X
  2135. X/*+-------------------------------------------------------------------------
  2136. X    report_send_status() - report file transmission result
  2137. Xreturns proc-type erc
  2138. Xfor "ecu knowledgeable" protocols only
  2139. X--------------------------------------------------------------------------*/
  2140. Xreport_send_status()
  2141. X{
  2142. X    int erc = 0;
  2143. X    ushort int ustmp;
  2144. X    ulong colors_at_entry = colors_current;
  2145. X    char *signal_name_text();
  2146. X
  2147. X    ustmp = last_child_wait_status;
  2148. X    if((ustmp & 0xFF) == 0)    /* exit() called */
  2149. X    {
  2150. X        ustmp >>= 8;
  2151. X        if(ustmp == 0)
  2152. X        {
  2153. X            setcolor(colors_notify);
  2154. X            pputs("[transfer successful]");
  2155. X            erc = 0;
  2156. X        }
  2157. X        else if(ustmp == 255)
  2158. X        {
  2159. X            setcolor(colors_error);
  2160. X            pputs("[ecu error: transfer program usage error]");
  2161. X            erc = eFATAL_ALREADY;
  2162. X        }
  2163. X        else if(ustmp == 254)
  2164. X        {
  2165. X            setcolor(colors_error);
  2166. X            pputs(
  2167. X            "[protocol failure: bad line conditions or remote not ready]");
  2168. X            erc = eFATAL_ALREADY;
  2169. X        }
  2170. X        else if(ustmp == 253)
  2171. X        {
  2172. X            setcolor(colors_alert);
  2173. X            pputs("[no requested files exist]");
  2174. X            erc = eFATAL_ALREADY;
  2175. SHAR_EOF
  2176. true || echo 'restore of ecuxfer.c failed'
  2177. fi
  2178. echo 'End of ecu320 part 14'
  2179. echo 'File ecuxfer.c is continued in part 15'
  2180. echo 15 > _shar_seq_.tmp
  2181. exit 0
  2182.  
  2183. exit 0 # Just in case...
  2184.