ckuusx.c
上传用户:dufan58
上传日期:2007-01-05
资源大小:3407k
文件大小:192k
源码类别:

通讯/手机编程

开发平台:

Windows_Unix

  1.             }
  2.             if (n == 0)
  3.               goto xdebug;
  4.             m = n + 32;                 /* m = size of dest */
  5.             pbuf = (char *) malloc(m+1);
  6.             if (!pbuf)
  7.               goto xdebug;
  8.             i = 0;
  9.             pbuf[i++] = '[';
  10.             for (; i <= n; p++) {
  11.                 if (*p == LF) {
  12.                     if (i >= m-4)
  13.                       break;
  14.                     pbuf[i++] = '<';
  15.                     pbuf[i++] = 'L';
  16.                     pbuf[i++] = 'F';
  17.                     pbuf[i++] = '>';
  18.                     continue;
  19.                 } else if (*p) {
  20.                     pbuf[i++] = *p;
  21.                     continue;
  22.                 } else {
  23.                     if (i >= m-5)
  24.                       break;
  25.                     pbuf[i++] = '<';
  26.                     pbuf[i++] = 'N';
  27.                     pbuf[i++] = 'U';
  28.                     pbuf[i++] = 'L';
  29.                     pbuf[i++] = '>';
  30.                     continue;
  31.                 }
  32.             }
  33.             if (i < m-2 || contd) {
  34.                 pbuf[i++] = '.';
  35.                 pbuf[i++] = '.';
  36.             }
  37.             pbuf[i++] = ']';
  38. #ifdef COMMENT
  39.             pbuf[i] = NUL;
  40. #else
  41.             sprintf(pbuf+i,"=%ld",n);
  42. #endif /*  */
  43.             if (!s1) s1 = "";
  44.             if (*s1) {
  45.                 if (zsout(ZDFILE,s1) < 0) {
  46.                     deblog = 0;
  47.                     zclose(ZDFILE);
  48.                 }
  49.             }
  50.             if (zsoutl(ZDFILE,pbuf) < 0) {
  51.                 deblog = 0;
  52.                 zclose(ZDFILE);
  53.             }
  54. #ifdef CKSYSLOG
  55.             if (ckxsyslog >= SYSLG_DB && ckxlogging) {
  56.                 cksyslog(SYSLG_DB,1,"debug",s1,pbuf);
  57.             }
  58. #endif /* CKSYSLOG */
  59.             free(pbuf);
  60.         }
  61. #endif /* DEBUG */
  62. #endif /* COMMENT */
  63.         break;
  64.       case F100:                        /* 4, "s1" */
  65.         if (zsoutl(ZDFILE,s1) < 0) {
  66.             deblog = 0;
  67.             zclose(ZDFILE);
  68.         }
  69. #ifdef CKSYSLOG
  70.         if (ckxsyslog >= SYSLG_DB && ckxlogging) {
  71.             cksyslog(SYSLG_DB,1,"debug",s1,NULL);
  72.         }
  73. #endif /* CKSYSLOG */
  74.         break;
  75.       case F101:                        /* 5, "s1=n" */
  76.         sprintf(sp,"%s=%ldn",s1,n);
  77.         if (zsout(ZDFILE,dbptr) < 0) {
  78.             deblog = 0;
  79.             zclose(ZDFILE);
  80.         }
  81. #ifdef CKSYSLOG
  82.         if (ckxsyslog >= SYSLG_DB && ckxlogging) {
  83.             cksyslog(SYSLG_DB,1,"debug",dbptr,NULL);
  84.         }
  85. #endif /* CKSYSLOG */
  86.         break;
  87.       case F110:                        /* 6, "s1[s2]" */
  88.         sprintf(sp,"%s[%s]n",s1,s2);
  89.         if (zsout(ZDFILE,dbptr) < 0) {
  90.             deblog = 0;
  91.             zclose(ZDFILE);
  92.         }
  93. #ifdef CKSYSLOG
  94.         if (ckxsyslog >= SYSLG_DB && ckxlogging) {
  95.             cksyslog(SYSLG_DB,1,"debug",dbptr,NULL);
  96.         }
  97. #endif /* CKSYSLOG */
  98.         break;
  99.       case F111:                        /* 7, "s1[s2]=n" */
  100.         sprintf(sp,"%s[%s]=%ldn",s1,s2,n);
  101.         if (zsout(ZDFILE,dbptr) < 0) {
  102.             deblog = 0;
  103.             zclose(ZDFILE);
  104.         }
  105. #ifdef CKSYSLOG
  106.         if (ckxsyslog >= SYSLG_DB && ckxlogging) {
  107.             cksyslog(SYSLG_DB,1,"debug",dbptr,NULL);
  108.         }
  109. #endif /* CKSYSLOG */
  110.         break;
  111.       default:
  112.         sprintf(sp,"n?Invalid format for debug() - %dn",f);
  113.         if (zsout(ZDFILE,dbptr) < 0) {
  114.             deblog = 0;
  115.             zclose(ZDFILE);
  116.         }
  117. #ifdef CKSYSLOG
  118.         if (ckxsyslog >= SYSLG_DB && ckxlogging) {
  119.             cksyslog(SYSLG_DB,1,"debug",dbptr,NULL);
  120.         }
  121. #endif /* CKSYSLOG */
  122.         break;
  123.     }
  124.   xdebug:                               /* Common exit point */
  125. #ifndef OS2
  126.     deblog = 1;                         /* Restore this */
  127. #endif /* OS2 */
  128.     return(0);
  129. }
  130. VOID
  131. #ifdef CK_ANSIC
  132. dohexdump(CHAR *msg, CHAR *st, int cnt)
  133. #else
  134. dohexdump(msg,st,cnt) CHAR *msg; CHAR *st; int cnt;
  135. #endif /* CK_ANSIC */
  136. /* dohexdump */ {
  137.     int i = 0, j = 0;
  138.     char tmp[8];
  139.     if (!deblog) return;                /* If no debug log, don't. */
  140.     if (!dbptr) {                       /* Allocate memory buffer */
  141.         dbptr = malloc(DBUFL+1);        /* This only happens once */
  142.         if (!dbptr) {
  143.             deblog = 0;
  144.             zclose(ZDFILE);
  145.             return;
  146.         }
  147.     }
  148.     if (msg != NULL) {
  149.         sprintf(dbptr,"HEXDUMP: %s (%d bytes)n",msg,cnt);
  150.         if (zsout(ZDFILE,dbptr) < 0) {
  151.             deblog = 0;
  152.             zclose(ZDFILE);
  153.             return;
  154.         }
  155.     } else {
  156.         sprintf(dbptr,"HEXDUMP: (%d bytes)n",cnt);
  157.         zsout(ZDFILE,dbptr);
  158.         if (zsout(ZDFILE,dbptr) < 0) {
  159.             deblog = 0;
  160.             zclose(ZDFILE);
  161.             return;
  162.         }
  163.     }
  164.     for (i = 0; i < cnt; i++) {
  165.         dbptr[0] = '';
  166.         for(j = 0 ; (j < 16) && ((i + j) < cnt) ; j++) {
  167.             sprintf(tmp,
  168.                     "%s%02x%s",
  169.                     (j == 8 ? "| " : ""),
  170.                     (CHAR) st[i + j],
  171.                     (j < 16 && i < cnt ? "  " : "")
  172.                     );
  173.             strcat(dbptr,tmp);
  174.         }
  175.         strcat(dbptr,"n");
  176.         i += j - 1;
  177.         if (zsout(ZDFILE,dbptr) < 0) {
  178.             deblog = 0;
  179.             zclose(ZDFILE);
  180.             return;
  181.         }
  182.     } /* end for */
  183. }
  184. #endif /* DEBUG */
  185. VOID
  186. #ifdef OS2
  187. logchar(unsigned short c)
  188. #else /* OS2 */
  189. #ifdef CK_ANSIC
  190. logchar(char c)
  191. #else
  192. logchar(c) char c;
  193. #endif /* CK_ANSIC */
  194. #endif /* OS2 */
  195. /* logchar */ {                         /* Log character c to session log */
  196. #ifndef NOLOCAL
  197.     if (seslog)
  198.       if ((sessft != XYFT_T) ||
  199.           (c != 'r' &&
  200.            c != '' &&
  201.            c != XON &&
  202.            c != XOFF))
  203.         if (zchout(ZSFILE,(CHAR)(c & 0xFF)) < 0) {
  204.             conoll("");
  205.             conoll("ERROR WRITING SESSION LOG, LOG CLOSED!");
  206.             seslog = 0;
  207.             zclose(ZSFILE);
  208.         }
  209. #endif /* NOLOCAL */
  210. }
  211. VOID
  212. logstr(s, len) char * s; int len; {     /* Log string to session log */
  213. #ifndef NOLOCAL
  214.     char c;
  215.     int n = 0;
  216.     if (!seslog || !s)
  217.       return;
  218.     while (n < len) {
  219.         c = s[n];
  220.         n++;
  221.         if ((sessft != XYFT_T) ||
  222.             (c != 'r' &&
  223.              c != '' &&
  224.              c != XON &&
  225.              c != XOFF))
  226.           if (zchout(ZSFILE,c) < 0) {
  227.               conoll("");
  228.               conoll("ERROR WRITING SESSION LOG, LOG CLOSED!");
  229.               seslog = 0;
  230.               zclose(ZSFILE);
  231.               return;
  232.           }
  233.     }
  234. #endif /* NOLOCAL */
  235. }
  236. #ifdef CK_CURSES
  237. #ifdef STRATUS
  238. /* VOS has curses but no tgetent() */
  239. int
  240. tgetent(s1, s2) char * s1, * s2; {
  241.     return(1);
  242. }
  243. #endif /* STRATUS */
  244. #ifdef VMS
  245. #ifdef __DECC
  246. _PROTOTYP(int tgetent,(char *, char *));
  247. #endif /* __DECC */
  248. #endif /* VMS */
  249. /*
  250.   There are three different ways to do fullscreen on VMS.
  251.   1. Use the real curses library, VAXCCURSE.
  252.   2. Use do-it-yourself code.
  253.   3. Use the Screen Manager, SMG$.
  254.   Method 1 doesn't work quite right; you can't call endwin(), so once you've
  255.   started curses mode, you can never leave.
  256.   Method 2 doesn't optimize the screen, and so much more time is spent in
  257.   screen writes.  This actually causes file transfers to fail because the
  258.   tty device input buffer can be overrun while the screen is being updated,
  259.   especially on a slow MicroVAX that has small typeahead buffers.
  260.   In the following #ifdef block, #define one of them and #undef the other 2.
  261.   So now let's try method 3...
  262. */
  263. #ifdef VMS
  264. #define CK_SMG                          /* Screen Manager */
  265. #undef MYCURSES                         /* Do-it-yourself */
  266. #undef VMSCURSE                         /* VAXCCURSE library */
  267. #endif /* VMS */
  268. /*
  269.   But just before New Years, 2000, the SMG library seemed to break on
  270.   both VMS systems we have here (an Alpha with VMS 7.1 and a VAX with 5.5).
  271.   So back to MYCURSES, which works fine.
  272. */
  273. #ifdef VMS
  274. #undef CK_SMG
  275. #define MYCURSES
  276. #endif /* VMS */
  277. #ifdef MYCURSES
  278. #define stdscr 0
  279. #ifdef CK_WREFRESH
  280. #undef CK_WREFRESH
  281. #endif /* CK_WREFRESH */
  282. #endif /* MYCURSES */
  283. /*  S C R E E N C  --  Screen display function, uses curses  */
  284. /* Idea for curses display contributed by Chris Pratt of APV Baker, UK */
  285. /* Avoid conficts with curses.h */
  286. #ifdef QNX
  287. /* Same as ckcasc.h, but in a different radix... */
  288. #ifdef ESC
  289. #undef ESC
  290. #endif /* ESC */
  291. #endif /* QNX */
  292. #ifndef MYCURSES
  293. #undef VOID                             /* This was defined in ckcdeb.h */
  294. #endif /* MYCURSES */
  295. #undef BS                               /* These were defined in ckcasc.h */
  296. #undef CR
  297. #undef NL
  298. #undef SO
  299. #undef US
  300. #undef SP                               /* Used in ncurses */
  301. #define CHR_SP 32                       /* Use this instead */
  302. #ifdef VMS                              /* VMS fullscreen display */
  303. #ifdef MYCURSES                         /* Do-it-yourself method */
  304. extern int isvt52;                      /* From CKVTIO.C */
  305. #define printw printf
  306. #else
  307. #ifdef VMSCURSE                         /* VMS curses library VAXCCURSE */
  308. #include <curses.h>
  309. /* Note: Screen manager doesn't need a header file */
  310. #endif /* VMSCURSE */
  311. #endif /* MYCURSES */
  312. #else                                   /* Not VMS */
  313. #ifdef MYCURSES                         /* Do-it-yourself method */
  314. #define isvt52 0                        /* Used by OS/2, VT-100/ANSI always */
  315. #ifdef CKXPRINTF
  316. #define printw ckxprintf
  317. #else /* CKXPRINTF */
  318. #define printw printf
  319. #endif /* CKXPRINTF */
  320. #else                                   /* Use real curses */
  321. #ifdef CK_NCURSES                       /* or ncurses... */
  322. #ifdef CKXPRINTF                        /* Our printf macro conflicts with */
  323. #undef printf                           /* use of "printf" in ncurses.h */
  324. #endif /* CKXPRINTF */
  325. #include <ncurses.h>
  326. #ifdef CKXPRINTF
  327. #define printf ckxprintf
  328. #endif /* CKXPRINTF */
  329. #else  /* Not ncurses */
  330. #ifdef CKXPRINTF                        /* Our printf macro conflicts with */
  331. #undef printf                           /* use of "printf" in curses.h */
  332. #endif /* CKXPRINTF */
  333. #include <curses.h>
  334. #ifdef CKXPRINTF
  335. #define printf ckxprintf
  336. #endif /* CKXPRINTF */
  337. #endif /* CK_NCURSES */
  338. #endif /* MYCURSES */
  339. #endif /* VMS */
  340. #endif /* CK_CURSES */
  341. /*  F X D I N I T  --  File Xfer Display Initialization  */
  342. #ifdef CK_CURSES
  343. #ifndef MYCURSES
  344. #ifndef CK_SMG
  345. static
  346. #ifdef CK_ANSIC
  347. /* Can't use VOID because of curses.h */
  348. void
  349. ck_termset(int);
  350. #else
  351. ck_termset();
  352. #endif /* CK_ANSIC */
  353. #endif /* CK_SMG */
  354. #endif /* MYCURSES */
  355. #endif /* CK_CURSES */
  356. #ifdef NOTERMCAP
  357. static int notermcap = 1;
  358. #else
  359. static int notermcap = 0;
  360. #endif /* NOTERMCAP */
  361. #ifndef NODISPLAY
  362. #ifdef OSK
  363. VOID
  364. #else
  365. #ifdef CK_ANSIC
  366. void
  367. #endif /* CKANSIC */
  368. #endif /* OSK */
  369. fxdinit(xdispla) int xdispla; {
  370. #ifndef COHERENT
  371. #ifndef OS2
  372. #ifndef STRATUS
  373.     char *s;
  374.     int x, dummy;
  375.     debug(F101,"fxdinit xdispla","",xdispla);
  376.     debug(F101,"fxdinit fxd_inited","",fxd_inited);
  377. #ifdef IKSD
  378. #ifndef NOXFER
  379.     /* No curses for IKSD */
  380.     if (inserver) {
  381.         fdispla = XYFD_N;
  382.         return;
  383.     }
  384.     if (fxd_inited)                     /* Only do this once */
  385.       return;
  386. #endif /* NOXFER */
  387. #endif /* IKSD */
  388. #ifdef CK_CURSES
  389. #ifdef VMS
  390.     /* Force BRIEF in Batch logs */
  391.     if (batch && (xdispla == XYFD_C || xdispla == XYFD_S))
  392.       xdispla = XYFD_B;
  393. #else
  394.     if (xdispla == XYFD_C || xdispla == 9999) {
  395. #ifdef DYNAMIC
  396.         if (!trmbuf) {
  397. /*
  398.   Allocate tgetent() buffer.  Make it big -- some termcaps can be huge;
  399.   tgetent() merrily writes past the end of the buffer, causing core dumps
  400.   or worse.
  401. */
  402.             trmbuf = (char *)malloc(TRMBUFL);
  403.             if (!trmbuf) {
  404.                 notermcap = 1;
  405.                 debug(F101,"fxdinit malloc trmbuf","FAILED",TRMBUFL);
  406.                 fdispla = XYFD_S;
  407.                 return;
  408.             }
  409.             debug(F111,"fxdinit malloc trmbuf","OK",TRMBUFL);
  410.             debug(F001,"fxdinit trmbuf","",trmbuf);
  411. #ifdef COMMENT
  412.             memset(trmbuf,'',(size_t)TRMBUFL);
  413.             debug(F100,"fxdinit memset OK","",0);
  414. #endif /* COMMENT */
  415.         }
  416. #endif /* DYNAMIC */
  417.         debug(F100,"fxdinit before getenv(TERM)","",0);
  418.         s = getenv("TERM");
  419.         debug(F110,"fxdinit after getenv(TERM)",s,0);
  420.         if (!s) s = "";
  421.         if (*s) {
  422.             debug(F110,"fxdinit before tgetent()",s,0);
  423.             x = tgetent(trmbuf,s);
  424.             debug(F111,"fxdinit tgetent",s,x);
  425.         } else {
  426.             x = 0;
  427.             notermcap = 1;
  428.             debug(F110,"fxdinit TERM null - no tgetent",s,0);
  429.         }
  430.         if (x < 1 && !quiet && !backgrd
  431. #ifdef VMS
  432.             && !batch
  433. #endif /* VMS */
  434.             ) {
  435.             printf("Warning: terminal type unknown: "%s"n",s);
  436.             printf("SCREEN command will use ANSI sequences.n");
  437.             if (local)
  438.               printf("Fullscreen file transfer display disabled.n");
  439.             fdispla = XYFD_S;
  440.         }
  441. #ifndef MYCURSES
  442. #ifndef CK_SMG
  443.         ck_termset(x);
  444. #endif /* CK_SMG */
  445. #endif /* MYCURSES */
  446.         fxd_inited = 1;
  447.     }
  448. #endif /* CK_CURSES */
  449. #endif /* VMS */
  450. #endif /* STRATUS */
  451. #endif /* OS2 */
  452. #endif /* COHERENT */
  453. }
  454. #endif /* NODISPLAY */
  455. #ifdef CK_CURSES
  456. #ifdef CK_SMG
  457. /*
  458.   Long section for Screen Manager starts here...
  459.   By William Bader.
  460. */
  461. #include "ckvvms.h"
  462. #ifdef OLD_VMS
  463. #include <smgdef.h>                     /* use this on VAX C 2.4 */
  464. /* #include <smgmsg.h> */
  465. #else
  466. #include <smg$routines.h>               /* Martin Zinser */
  467. #endif /* OLD_VMS */
  468. extern unsigned int vms_status;     /* Used for system service return status */
  469. static long smg_pasteboard_id = -1;     /* pasteboard identifier */
  470. static long smg_display_id = -1;        /* display identifier */
  471. static int smg_open = 0;                /* flag if smg current open */
  472. static int smg_inited = 0;              /* flag if smg initialized */
  473. #ifdef COMMENT
  474. #define clrtoeol()      SMG$ERASE_LINE(&smg_display_id, 0, 0)
  475. #define clear()         SMG$ERASE_DISPLAY(&smg_display_id, 0, 0, 0, 0)
  476. #define touchwin(scr)   SMG$REPAINT_SCREEN(&smg_pasteboard_id)
  477. #else  /* Not COMMENT */
  478. #define clrtoeol()      smg$erase_line(&smg_display_id, 0, 0)
  479. #define clear()         smg$erase_display(&smg_display_id, 0, 0, 0, 0)
  480. #define touchwin(scr)   smg$repaint_screen(&smg_pasteboard_id)
  481. #endif /* COMMENT */
  482. #define clearok(curscr,ok)              /* Let wrefresh() do the work */
  483. #define wrefresh(cursrc) touchwin(scr)
  484. static void
  485. move(row, col) int row, col; {
  486.     /* Change from 0-based for curses to 1-based for SMG */
  487.     if (!smg_open)
  488.       return;
  489.     ++row; ++col;
  490.     debug(F111,"VMS smg move",ckitoa(row),col);
  491. #ifdef COMMENT                          /* Martin Zinser */
  492.     CHECK_ERR("move: smg$set_cursor_abs",
  493.               SMG$SET_CURSOR_ABS(&smg_display_id, &row, &col));
  494. #else
  495.     CHECK_ERR("move: smg$set_cursor_abs",
  496.               smg$set_cursor_abs(&smg_display_id, &row, &col));
  497. #endif /* COMMENT */
  498.     debug(F101,"VMS smg move vms_status","",vms_status);
  499. }
  500. #ifdef VMS_V40
  501. #define OLD_VMS
  502. #endif /* VMS_V40 */
  503. #ifdef VMS_V42
  504. #define OLD_VMS
  505. #endif /* VMS_V42 */
  506. #ifdef VMS_V44
  507. #define OLD_VMS
  508. #endif /* VMS_V44 */
  509. static int
  510. initscr() {
  511.     int rows = 24, cols = 80;
  512.     int row = 1, col = 1;
  513.     debug(F101,"VMS initscr smg_pasteboard_id A","",smg_pasteboard_id);
  514.     if (smg_pasteboard_id == -1) { /* Open the screen */
  515. #ifdef OLD_VMS                     /* Note: Routine calls lowercased 9/96 */
  516.         CHECK_ERR("initscr: smg$create_pasteboard",
  517.                   smg$create_pasteboard(&smg_pasteboard_id, 0, 0, 0, 0));
  518. #else
  519.         /* For VMS V5, not tested */
  520.         CHECK_ERR("initscr: smg$create_pasteboard",
  521.                   smg$create_pasteboard(&smg_pasteboard_id, 0, 0, 0, 0, 0));
  522. #endif /* OLD_VMS */
  523.     }
  524.     debug(F101,"VMS initscr smg_pasteboard_id B","",smg_pasteboard_id);
  525.     if (smg_pasteboard_id == -1) {
  526. printf("?Error initializing fullscreen displayn");
  527. fdispla = XYFD_S;
  528. dpyinit();
  529. return(0);
  530.     }
  531.     debug(F101,"VMS initscr smg_display_id","",smg_display_id);
  532.     if (smg_display_id == -1) {         /* Create a display window */
  533. #ifdef COMMENT                          /* Martin Zinser */
  534.         CHECK_ERR("initscr: smg$create_virtual_display",
  535.                   SMG$CREATE_VIRTUAL_DISPLAY(&rows, &cols, &smg_display_id,
  536.                                              0, 0, 0));
  537.         /* Connect the display window to the screen */
  538.         CHECK_ERR("initscr: smg$paste_virtual_display",
  539.                   SMG$PASTE_VIRTUAL_DISPLAY(&smg_display_id,&smg_pasteboard_id,
  540.                                             &row,&col));
  541. #else
  542.         CHECK_ERR("initscr: smg$create_virtual_display",
  543.                   smg$create_virtual_display(&rows, &cols, &smg_display_id,
  544.                                              0, 0, 0));
  545.         /* Connect the display window to the screen */
  546.         CHECK_ERR("initscr: smg$paste_virtual_display",
  547.                   smg$paste_virtual_display(&smg_display_id,&smg_pasteboard_id,
  548.                                             &row,&col));
  549. #endif /* COMMENT */
  550.     }
  551.     debug(F101,"VMS initscr smg_open A","",smg_open);
  552.     if (!smg_open) {                    /* Start a batch update */
  553.         smg_open = 1;
  554. #ifdef COMMENT
  555.         CHECK_ERR("initscr: smg$begin_pasteboard_update",
  556.                   SMG$BEGIN_PASTEBOARD_UPDATE(&smg_pasteboard_id));
  557. #else
  558.         CHECK_ERR("initscr: smg$begin_pasteboard_update",
  559.                   smg$begin_pasteboard_update(&smg_pasteboard_id));
  560. #endif /* COMMENT */
  561. debug(F101,"VMS initscr smg$begin_pasteboard_update","",vms_status);
  562.     }
  563.     debug(F101,"VMS initscr smg_open B","",smg_open);
  564.     smg_inited = 1;
  565.     return(1);
  566. }
  567. static void
  568. refresh() {
  569.     debug(F101,"refresh smg_pasteboard_id","",smg_pasteboard_id);
  570.     if (smg_open == 0 || smg_pasteboard_id == -1)
  571.       return;
  572. #ifdef COMMENT                          /* Martin Zinser */
  573.     CHECK_ERR("refresh: smg$end_pasteboard_update",
  574.               SMG$END_PASTEBOARD_UPDATE(&smg_pasteboard_id));
  575.     CHECK_ERR("refresh: smg$begin_pasteboard_update",
  576.               SMG$BEGIN_PASTEBOARD_UPDATE(&smg_pasteboard_id));
  577. #else
  578.     CHECK_ERR("refresh: smg$end_pasteboard_update",
  579.               smg$end_pasteboard_update(&smg_pasteboard_id));
  580.     CHECK_ERR("refresh: smg$begin_pasteboard_update",
  581.               smg$begin_pasteboard_update(&smg_pasteboard_id));
  582. #endif /* COMMENT */
  583. }
  584. static void
  585. endwin() {
  586.     if (!smg_open)
  587.       return;
  588.     smg_open = 0;
  589. #ifdef COMMENT
  590.     CHECK_ERR("endwin: smg$end_pasteboard_update",
  591.               SMG$END_PASTEBOARD_UPDATE(&smg_pasteboard_id));
  592. #else
  593.     CHECK_ERR("endwin: smg$end_pasteboard_update",
  594.               smg$end_pasteboard_update(&smg_pasteboard_id));
  595. #endif /* COMMENT */
  596.     move(22, 0);
  597. #ifdef COMMENT
  598. /*
  599.   These calls clear the screen.
  600.   (convert routine calls to lowercase - Martin Zinser)
  601. */
  602.     CHECK_ERR("endwin: smg$delete_virtual_display",
  603.               SMG$DELETE_VIRTUAL_DISPLAY(&smg_display_id));
  604.     smg_display_id = -1;
  605.     CHECK_ERR("endwin: smg$delete_pasteboard",
  606.               SMG$DELETE_PASTEBOARD(&smg_pasteboard_id, 0));
  607.     smg_pasteboard_id = -1;
  608. #endif /* COMMENT */
  609. }
  610. #ifdef COMMENT
  611. /* DECC 6.2 screams bloody murder about printw ("not enough args") */
  612. /* but adding the following prototype only makes it holler louder. */
  613. #ifdef __DECC
  614. /* "varargs" prototype for printw */
  615. _PROTOTYP(static int printw,(char *, ...));
  616. #endif /* __DECC */
  617. #endif /* COMMENT */
  618. #ifdef __DECC
  619. #include <stdarg.h>
  620. _PROTOTYP(static void printw,(char *, ...));
  621. static void
  622. printw(char *str,...) {
  623.     char buf[255];
  624.     va_list ap;
  625.     $DESCRIPTOR(text_dsc, 0);
  626.     text_dsc.dsc$a_pointer=buf;
  627.     if (!smg_open)
  628.       return;
  629.     va_start(ap,str);
  630.     text_dsc.dsc$w_length = vsprintf(buf, str, ap);
  631.     va_end(ap);
  632.     CHECK_ERR("printw: smg$put_chars",
  633.               smg$put_chars(&smg_display_id, &text_dsc, 0, 0, 0, 0, 0));
  634. }
  635. #else
  636. static void
  637. printw(str, a1, a2, a3, a4, a5, a6, a7, a8)
  638.     char *str;
  639.     long a1, a2, a3, a4, a5, a6, a7, a8;
  640. /* printw */ {
  641.     char buf[255];
  642.     $DESCRIPTOR(text_dsc, 0);
  643.     if (!smg_open)
  644.       return;
  645.     text_dsc.dsc$a_pointer=buf;
  646.     text_dsc.dsc$w_length = sprintf(buf, str, a1, a2, a3, a4, a5, a6, a7, a8);
  647.     CHECK_ERR("printw: smg$put_chars",
  648.               smg$put_chars(&smg_display_id, &text_dsc, 0, 0, 0, 0, 0));
  649. }
  650. #endif /* __DECC */
  651. #define CK_CURPOS
  652. int
  653. ck_curpos(row, col) {
  654.     debug(F111,"VMS smg ck_curpos",ckitoa(row),col);
  655.     if (!smg_inited || !smg_open) {
  656.         initscr();
  657.     }
  658.     debug(F101,"VMS smg curpos smg_open","",smg_open);
  659.     if (!smg_open)
  660.       return(0);
  661.     debug(F111,"VMS smg ck_curpos",ckitoa(row-1),col-1);
  662.     move(row - 1, col - 1);             /* SMG is 0-based */
  663.     refresh();
  664.     /* endwin(); */
  665.     return(0);
  666. }
  667. int
  668. ck_cls() {
  669.     debug(F101,"VMS smg ck_cls smg_inited","",smg_inited);
  670.     if (!smg_inited || !smg_open) {
  671.         initscr();
  672.     }
  673.     debug(F101,"VMS smg ck_cls smg_open","",smg_open);
  674.     if (!smg_open)
  675.       return(0);
  676.     clear();
  677.     refresh();
  678.     /* endwin(); */
  679.     return(0);
  680. }
  681. int
  682. ck_cleol() {
  683.     debug(F101,"VMS smg ck_cleol smg_inited","",smg_inited);
  684.     if (!smg_inited || !smg_open) {
  685.         initscr();
  686.     }
  687.     debug(F101,"VMS smg ck_cleol smg_open","",smg_open);
  688.     if (!smg_open)
  689.       return(0);
  690.     clrtoeol();
  691.     refresh();
  692.     /* endwin(); */
  693.     return(0);
  694. }
  695. #endif /* CK_SMG */
  696. #ifdef MYCURSES
  697. /*
  698.   Do-it-yourself curses implementation for VMS, OS/2 and other ANSI/VT-100's.
  699.   Supports only the VT52 and VT1xx (and later VT2xx/3xx/4xx) terminals.
  700.   By Terry Kennedy, St Peters College.
  701.   First, some stuff we can just ignore:
  702. */
  703. static int
  704. touchwin(x) int x; {
  705.     return(0);
  706. }
  707. static int
  708. initscr() {
  709.     return(0);
  710. }
  711. static int
  712. refresh() {
  713.     return(0);
  714. }
  715. static int
  716. endwin() {
  717.     return(0);
  718. }
  719. /*
  720.  * Now, some stuff we need to do:
  721.  */
  722. _PROTOTYP( int move, (int, int) );
  723. #ifndef OS2
  724. int
  725. move(row, col) int row, col; {
  726.     if (isvt52)
  727.       printf("33Y%c%c", row + 037, col + 037);
  728.     else
  729.       printf("33[%d;%dH", row + 1, col + 1);
  730.     return(0);
  731. }
  732. int
  733. clear() {
  734.     move(0,0);
  735.     if (isvt52)
  736.       printf("33J");
  737.     else
  738.       printf("33[J");
  739.     return(0);
  740. }
  741. int
  742. clrtoeol() {
  743.     if (isvt52)
  744.       printf("33K");
  745.     else
  746.       printf("33[K");
  747.     return(0);
  748. }
  749. #define CK_CURPOS
  750. int
  751. ck_cls() {
  752.     return(clear());
  753. }
  754. int
  755. ck_cleol() {
  756.     return(clrtoeol());
  757. }
  758. int
  759. ck_curpos(row, col) int row, col; {
  760.     move(row, col);
  761.     return(0);
  762. }
  763. #else /* OS2 */
  764. /* Windows NT and Windows 95 do not provide ANSI emulation */
  765. /* Therefore we might as well not use it for OS/2 either   */
  766. int
  767. move(row, col) int row, col; {
  768. #ifndef ONETERMUPD
  769.     SetCurPos(row, col);
  770. #endif /* ONETERMUPD */
  771.     lgotoxy( VCMD, col+1, row+1);
  772.     VscrnIsDirty(VCMD);
  773.     return(0);
  774. }
  775. int
  776. clear() {
  777.     viocell cell;
  778.     move(0,0);
  779. #ifdef ONETERMUPD
  780.     if (VscrnGetBufferSize(VCMD) > 0) {
  781.         VscrnScroll(VCMD, UPWARD, 0,
  782.                     VscrnGetHeight(VCMD)-(1),
  783.                     VscrnGetHeight(VCMD)-(0), TRUE, CHR_SP);
  784.         cleartermscreen(VCMD);
  785.     }
  786. #else
  787.     cell.c = ' ';
  788.     cell.a = colorcmd;
  789.     WrtNCell(cell, cmd_rows * cmd_cols, 0, 0);
  790. #endif /* ONETERMUPD */
  791.     return(0);
  792. }
  793. int
  794. clrtoeol() {
  795.     USHORT row, col;
  796.     viocell cell;
  797.     cell.c = ' ';
  798.     cell.a = colorcmd;
  799. #ifndef ONETERMUPD
  800.     GetCurPos(&row, &col );
  801.     WrtNCell(cell, cmd_cols - col -1, row, col);
  802. #endif /* ONETERMUPD */
  803.     clrtoeoln(VCMD,CHR_SP);
  804.     return(0);
  805. }
  806. #define CK_CURPOS
  807. int
  808. ck_curpos(row, col) int row, col; {
  809.     move(row, col);
  810.     return(0);
  811. }
  812. int
  813. ck_cls() {
  814.     return(clear());
  815. }
  816. int
  817. ck_cleol() {
  818.     return(clrtoeol());
  819. }
  820. #endif /* OS2 */
  821. #endif /* MYCURSES */
  822. #ifndef NOTERMCAP
  823. #ifndef CK_CURPOS
  824. #define CK_CURPOS
  825. /* Termcap/Terminfo section */
  826. static char cur_cls[32] = { NUL, NUL };
  827. static char cur_cleol[32] = { NUL, NUL };
  828. static char cur_cm[64] = { NUL, NUL };
  829. static char tgsbuf[128] = { NUL, NUL };
  830. static
  831. #ifdef CK_ANSIC
  832. void
  833. #endif /* CK_ANSIC */
  834. ck_termset(x) int x; {
  835.     cur_cls[0] = NUL;
  836.     cur_cleol[0] = NUL;
  837.     cur_cm[0] = NUL;
  838. #ifdef tgetent
  839.     debug(F100,"tgetent is a macro","",0);
  840. #endif /* tgetent */
  841. #ifdef tgetstr
  842.     debug(F100,"tgetstr is a macro","",0);
  843. #endif /* tgetstr */
  844. #ifdef tputs
  845.     debug(F100,"tputs is a macro","",0);
  846. #endif /* tputs */
  847. #ifdef tgoto
  848.     debug(F100,"tgoto is a macro","",0);
  849. #endif /* tgoto */
  850. #ifdef NOTERMCAP
  851.     /* tgetstr() gets a segmentation fault on OSF/1 */
  852.     debug(F100,"ck_termset NOTERMCAP","",0);
  853. #else
  854.     if (notermcap) {
  855.         debug(F100,"ck_termset notermcap","",0);
  856.         return;
  857.     }
  858.     debug(F101,"ck_termset x","",x);
  859.     if (x > 0) {
  860.         char * bp;
  861.         bp = tgsbuf;
  862.         *bp = NUL;
  863.         debug(F110,"ck_termset calling tgetstr","cl",0);
  864.         if (tgetstr("cl", &bp)) {       /* Get clear-screen code */
  865.             debug(F110,"ck_termset tgetstr cl",tgsbuf,"");
  866.             if ((int)strlen(tgsbuf) < 32)
  867.               strcpy(cur_cls,tgsbuf);
  868.         } else
  869.           return;
  870.         bp = tgsbuf;
  871.         if (tgetstr("ce", &bp)) {       /* Get clear-to-end-of-line code */
  872.             debug(F110,"ck_termset tgetstr ce",tgsbuf,"");
  873.             if ((int)strlen(tgsbuf) < 32)
  874.               strcpy(cur_cleol,tgsbuf);
  875.         } else
  876.           return;
  877.         bp = tgsbuf;
  878.         if (tgetstr("cm", &bp)) {       /* Get cursor-movement code */
  879.             debug(F110,"ck_termset tgetstr cm",tgsbuf,"");
  880.             if ((int)strlen(tgsbuf) < 64)
  881.               strcpy(cur_cm,tgsbuf);
  882.         } else
  883.           return;
  884.     }
  885. #endif /* NOTERMCAP */
  886. }
  887. #ifndef TPUTSFNTYPE
  888. #ifdef TPUTSISVOID
  889. #define TPUTSFNTYPE void
  890. #else
  891. #define TPUTSFNTYPE int
  892. #endif /* TPUTSISVOID */
  893. #endif /* TPUTSFNTYPE */
  894. #ifndef TPUTSARGTYPE
  895. #ifdef HPUX9
  896. #define TPUTSARGTYPE char
  897. #else
  898. #ifdef HPUX10
  899. #define TPUTSARGTYPE char
  900. #else
  901. #define TPUTSARGTYPE int
  902. #endif /* HPUX10 */
  903. #endif /* HPUX9 */
  904. #endif /* TPUTSARGTYPE */
  905. static TPUTSFNTYPE
  906. #ifdef CK_ANSIC
  907. ck_outc(TPUTSARGTYPE x)
  908. #else
  909. ck_outc(x) TPUTSARGTYPE x;
  910. #endif /* CK_ANSIC */
  911. {                                       /* To satisfy tputs() arg3 prototype */
  912.     int rc;
  913.     char c;
  914.     c = (char) x;
  915.     rc = (inserver) ? ttoc(c) : conoc(c);
  916. #ifndef TPUTSISVOID
  917.     return(rc);
  918. #endif /* TPUTSISVOID */
  919. }
  920. int
  921. ck_curpos(row, col) {
  922. #ifdef CK_ANSIC
  923.     TPUTSFNTYPE (*fn)(TPUTSARGTYPE);
  924. #else
  925.     TPUTSFNTYPE (*fn)();
  926. #endif /* CK_ANSIC */
  927.     if (!fxd_inited)
  928.       fxdinit(9999);
  929.     if (!cur_cm[0]) {                   /* We don't have escape sequences */
  930. #ifdef COMMENT
  931.         return(-1);                     /* Do nothing */
  932. #else
  933.         /* Both C-Kermit's SCREEN command and ANSI/VT100 are 1-based */
  934.         printf("33[%d;%dH", row, col); /* Or default to ANSI */
  935. #endif /* COMMENT */
  936.     } else {
  937.         fn = ck_outc;
  938.         /* termcap/terminfo is 0-based */
  939.         tputs(
  940. #ifdef TPUTSARG1CONST
  941.               (const char *)
  942. #endif /* TPUTSARG1CONST */
  943.               tgoto(cur_cm,col-1,row-1),1,fn);
  944.     }
  945.     return(0);
  946. }
  947. int
  948. ck_cls() {
  949. #ifdef CK_ANSIC
  950.     TPUTSFNTYPE (*fn)(TPUTSARGTYPE);
  951. #else
  952.     TPUTSFNTYPE (*fn)();
  953. #endif /* CK_ANSIC */
  954.     if (!fxd_inited)
  955.       fxdinit(9999);
  956.     if (!cur_cls[0]) {                  /* If we don't have escape sequences */
  957. #ifdef COMMENT
  958.         return(-1);                     /* Do nothing */
  959. #else
  960.         printf("33[;H33[2J");       /* Or default to ANSI */
  961. #endif /* COMMENT */
  962.     } else {
  963.         fn = ck_outc;
  964.         debug(F111,"ck_cls 2",cur_cls,fxd_inited);
  965.         tputs(cur_cls,cmd_rows,fn);
  966.     }
  967.     return(0);
  968. }
  969. int
  970. ck_cleol() {
  971. #ifdef CK_ANSIC
  972.     TPUTSFNTYPE (*fn)(TPUTSARGTYPE);
  973. #else
  974.     TPUTSFNTYPE (*fn)();
  975. #endif /* CK_ANSIC */
  976.     if (!fxd_inited)
  977.       fxdinit(9999);
  978.     if (!cur_cleol[0]) {                /* If we don't have escape sequences */
  979. #ifdef COMMENT
  980.         return(-1);                     /* Do nothing */
  981. #else
  982.         printf("33[K");               /* Or use ANSI */
  983. #endif /* COMMENT */
  984.     } else {
  985.         fn = ck_outc;
  986.         tputs(cur_cleol,1,fn);
  987.     }
  988.     return(0);
  989. }
  990. #endif /* CK_CURPOS */
  991. #else
  992. static void
  993. ck_termset(x) int x; {
  994.     if (x) return;
  995. }
  996. #endif /* NOTERMCAP */
  997. #ifndef CK_CURPOS
  998. #define CK_CURPOS
  999. int
  1000. ck_cls() {
  1001.     printf("33[;H33[2J");
  1002.     return(0);
  1003. }
  1004. int
  1005. ck_cleol() {
  1006.     printf("33[K");
  1007.     return(0);
  1008. }
  1009. int
  1010. ck_curpos(row, col) int row, col; {
  1011.     printf("33[%d;%dH", row, col);
  1012.     return(0);
  1013. }
  1014. #endif /* CK_CURPOS */
  1015. static int cinit = 0;                   /* Flag for curses init'd */
  1016. static int cendw = 0;                   /* endwin() was called */
  1017. static
  1018. #ifdef CK_ANSIC                         /* Because VOID used by curses.h */
  1019. void
  1020. #else
  1021. #ifdef MYCURSES
  1022. VOID
  1023. #else
  1024. int
  1025. #endif /* MYCURSES */
  1026. #endif /* CK_ANSIC */
  1027. #ifdef CK_ANSIC                         /* Update % transfered and % bar */
  1028. updpct(long old, long new)
  1029. #else /* CK_ANSIC */
  1030. updpct(old, new) long old, new;
  1031. #endif /* CK_ANSIC */
  1032. /* updpct */ {
  1033. #ifdef COMMENT
  1034.     int m, n;
  1035.     move(CW_PCD,22);
  1036.     printw("%ld", new);
  1037. #ifdef KUI
  1038. #ifndef K95G
  1039.     KuiSetProperty(KUI_FILE_TRANSFER, (long) CW_PCD, (long) new);
  1040. #endif /* K95G */
  1041. #endif /* KUI */
  1042. #ifdef CK_PCT_BAR
  1043.     if (thermometer) {
  1044.         if (old > new) {
  1045.             old = 0;
  1046.             move(CW_PCD, 26);
  1047.             clrtoeol();
  1048.         }
  1049.         m = old/2;
  1050.         move(CW_PCD, 26 + m);
  1051.         n = new / 2 - m;
  1052. #ifndef OS2
  1053.         while (n > 0) {
  1054.             if ((m + 1) % 5 == 0)
  1055.               printw("*");
  1056.             else
  1057.               printw("=");
  1058.             m++;
  1059.             n--;
  1060.         }
  1061.         if (new % 2 != 0) printw("-");
  1062.         /* move(CW_PCD, 22+53); */
  1063. #else /* OS2 */
  1064.         while (n > 0) {
  1065.             printw("%c", '333');
  1066.             m++; n--;
  1067.         }
  1068.         if (new % 2 != 0)
  1069.           printw("%c", '261');
  1070. #endif /* OS2 */
  1071.     }
  1072. #endif /* CK_PCT_BAR */
  1073.     /* clrtoeol(); */
  1074. #else  /* !COMMENT */
  1075. #ifdef OS2
  1076. #define CHAR1   '333'          /* OS2 */
  1077. #define CHAR2   '261'
  1078. #else
  1079. #define CHAR1   '/'             /* Default */
  1080. #define CHAR2   '-'
  1081. #endif /* OS2 */
  1082.     debug(F101,"updpct old","",old);
  1083.     debug(F101,"updpct new","",new);
  1084.     move(CW_PCD,22);
  1085.     printw("%-3ld", new); /*  (was)   printw("%ld", new);  */
  1086. #ifdef KUI
  1087. #ifndef K95G
  1088.     KuiSetProperty( KUI_FILE_TRANSFER, (long) CW_PCD, (long) new );
  1089. #endif /* K95G */
  1090. #endif /* KUI */
  1091. #ifdef CK_PCT_BAR
  1092.     if (thermometer) {
  1093.         int m, n;
  1094.         if (old > new) {
  1095.             old = 0 ;
  1096.             move(CW_PCD, 26);
  1097.             clrtoeol();
  1098.         }
  1099.         if (new <= 100L) {
  1100.             m = old / 2;
  1101.             n = new / 2 - m;
  1102.             move(CW_PCD, 26+m);
  1103.             while (n-- > 0)
  1104.               printw("%c", CHAR1);
  1105.             if (new % 2 != 0)
  1106.               printw("%c", CHAR2);
  1107.         }
  1108.     }
  1109. #endif /* CK_PCT_BAR */
  1110. #endif /* COMMENT */
  1111. }
  1112. static long old_tr = -1L;               /* Time remaining previously */
  1113. static long
  1114. #ifdef CK_ANSIC
  1115. shoetl(long old_tr, long cps, long fsiz, long howfar)
  1116. #else
  1117. shoetl(old_tr, cps, fsiz, howfar) long old_tr, cps, fsiz, howfar;
  1118. #endif /* CK_ANSIC */
  1119. /* shoetl */ {                          /* Estimated time left in transfer */
  1120.     long tr;                            /* Time remaining, seconds */
  1121. #ifdef GFTIMER
  1122.     if (fsiz > 0L && cps > 0L)
  1123.       tr = (long)((CKFLOAT)(fsiz - howfar) / (CKFLOAT)cps);
  1124.     else
  1125.       tr = -1L;
  1126. #else
  1127.     tr = (fsiz > 0L && cps > 0L) ?
  1128.       ((fsiz - howfar) / cps) :
  1129.         -1L;
  1130. #endif /* GFTIMER */
  1131.     debug(F101,"SUNDAY tr","",tr);
  1132.     debug(F101,"SUNDAY old_tr","",old_tr);
  1133.     move(CW_TR,22);
  1134.     if (tr > -1L) {
  1135.         if (tr != old_tr) {
  1136.             printw("%s",hhmmss(tr));
  1137. #ifdef KUI
  1138. #ifndef K95G
  1139.             KuiSetProperty(KUI_FILE_TRANSFER, (long)CW_TR, (long)hhmmss(tr));
  1140. #endif /* K95G */
  1141. #endif /* KUI */
  1142.             clrtoeol();
  1143.         }
  1144.     } else {
  1145.         printw("(unknown)");
  1146. #ifdef KUI
  1147. #ifndef K95G
  1148.         KuiSetProperty( KUI_FILE_TRANSFER, (long) CW_TR, (long) "(unknown)" );
  1149. #endif /* K95G */
  1150. #endif /* KUI */
  1151.         clrtoeol();
  1152.     }
  1153.     return(tr);
  1154. }
  1155. static long
  1156. #ifdef CK_ANSIC
  1157. shocps(int pct, long fsiz, long howfar)
  1158. #else
  1159. shocps(pct, fsiz, howfar) int pct; long fsiz, howfar;
  1160. #endif /* CK_ANSIC */
  1161. /* shocps */ {
  1162.     static long oldffc = 0L;
  1163. #ifdef GFTIMER
  1164.     CKFLOAT secs, xx;
  1165. #else
  1166.     long secs, xx;
  1167. #endif /* GFTIMER */
  1168. #ifdef GFTIMER
  1169.     xx = (gtv >= 0.0) ? gtv : 0.0;      /* Floating-point version */
  1170.     gtv = gftimer();
  1171.     if ((gtv - oldgtv) < (CKFLOAT) 1.0) /* Only do this once per second */
  1172.       return(oldcps);
  1173.     oldgtv = xx;
  1174. #else
  1175.     xx = (gtv >= 0) ? gtv : 0;          /* Whole-number version */
  1176.     gtv = gtimer();
  1177.     if ((gtv - oldgtv) < 1)
  1178.       return(oldcps);
  1179.     oldgtv = xx;
  1180. #endif /* GFTIMER */
  1181. #ifdef CPS_WEIGHTED
  1182.     debug(F100,"SHOCPS: WEIGHTED","",0);
  1183.     if (gtv != oldgtv) {                /* The first packet is ignored */
  1184.         if (ffc < oldffc)
  1185.           oldffc = ffc;
  1186.         oldcps = cps;
  1187.         if (oldcps && oldgtv >
  1188. #ifdef GFTIMER
  1189.             1.0
  1190. #else
  1191.             1
  1192. #endif /* GFTIMER */
  1193.             ) {                         /* The first second is ignored */
  1194. /*
  1195.   This version of shocps() produces a weighted average that some
  1196.   people like, but most people find it disconcerting and bombard us
  1197.   with questions and complaints about why the CPS figure fluctuates so
  1198.   wildly.  So now you only get the weighted average if you build the
  1199.   program yourself with CPS_WEIGHTED defined.
  1200. */
  1201. #ifndef CPS_VINCE
  1202. #ifdef GFTIMER
  1203.             cps = (long)((((CKFLOAT)oldcps * 3.0) +
  1204.                    (CKFLOAT)(ffc - oldffc) / (gtv-oldgtv) ) / 4.0);
  1205. #else
  1206.             cps = ( (oldcps * 3) + (ffc - oldffc) / (gtv-oldgtv) ) / 4;
  1207. #endif /* GFTIMER */
  1208. #else
  1209. /* And an alternate weighting scheme from Vincent Fatica... */
  1210.             cps = (3 *
  1211.              ((1+pct/300)*oldffc/oldgtv+(1-pct/100)*(ffc-oldffc)/(gtv-oldgtv)))
  1212.               / 4;
  1213. #endif /* CPS_VINCE */
  1214.         } else {
  1215.             /* No weighted average since there is nothing to weigh */
  1216. #ifdef GFTIMER
  1217.             cps = (long)(gtv != 0.0 ?
  1218.               (CKFLOAT)(ffc - oldffc) / (gtv - oldgtv) :
  1219.                 (ffc - oldffc)) ;
  1220. #else
  1221.             cps = gtv ? (ffc - oldffc) / (gtv - oldgtv) : (ffc - oldffc) ;
  1222. #endif /* GFTIMER */
  1223.         }
  1224. #ifdef DEBUG
  1225.         if (deblog) {
  1226.             debug(F101,"SHOCPS: pct   ","",pct);
  1227.             debug(F101,"SHOCPS: gtv   ","",gtv);
  1228.             debug(F101,"SHOCPS: oldgtv","",oldgtv);
  1229.             debug(F101,"SHOCPS: dgtv  ","",(long)(gtv-oldgtv));
  1230.             debug(F101,"SHOCPS: ffc   ","",ffc);
  1231.             debug(F101,"SHOCPS: oldffc","",oldffc);
  1232.             debug(F101,"SHOCPS: dffc  ","",ffc-oldffc);
  1233.             debug(F101,"SHOCPS: cps   ","",cps);
  1234.         }
  1235. #endif /* DEBUG */
  1236.         move(CW_CP,22);
  1237.         printw("%ld", cps);
  1238. #ifdef KUI
  1239. #ifndef K95G
  1240.         KuiSetProperty( KUI_FILE_TRANSFER, (long) CW_CP, (long) cps );
  1241. #endif /* K95G */
  1242. #endif /* KUI */
  1243.         clrtoeol();
  1244.         oldffc = ffc;
  1245.     }
  1246. #else /* !CPS_WEIGHTED */
  1247. #ifdef DEBUG
  1248.     debug(F100,"SHOCPS: NOT WEIGHTED","",0);
  1249.     if (deblog) {
  1250.         debug(F101,"SHOCPS: pct    ","",pct);
  1251.         debug(F101,"SHOCPS: gtv    ","",gtv);
  1252.         debug(F101,"SHOCPS: oldgtv ","",oldgtv);
  1253.         debug(F101,"SHOCPS: dgtv   ","",(long)gtv - (long)oldgtv);
  1254.         debug(F101,"SHOCPS: ffc    ","",ffc);
  1255.         debug(F101,"SHOCPS: oldffc ","",oldffc);
  1256.         debug(F101,"SHOCPS: dffc   ","",ffc-oldffc);
  1257.         debug(F101,"SHOCPS: cps    ","",cps);
  1258.         debug(F101,"SHOCPS: filcnt ","",filcnt);
  1259. #ifdef GFTIMER
  1260.         debug(F101,"SHOCPS: fpfsecs","",fpfsecs);
  1261. #endif /* GFTIMER */
  1262.     }
  1263.     debug(F101,"shocps gtv","",gtv);
  1264. #endif /* DEBUG */
  1265. #ifdef GFTIMER
  1266.     debug(F101,"shocps fpfsecs","",fpfsecs);
  1267.     secs = gtv - fpfsecs;
  1268.     debug(F101,"shocps secs","",(long)secs);
  1269.     if (secs > 0.0) {
  1270.         cps = (long)((CKFLOAT) ffc / secs);
  1271.         debug(F101,"shocps cps","",cps);
  1272.         move(CW_CP,22);
  1273. #ifdef KUI
  1274. #ifndef K95G
  1275.         KuiSetProperty( KUI_FILE_TRANSFER, (long) CW_CP, (long) cps );
  1276. #endif /* K95G */
  1277. #endif /* KUI */
  1278.         printw("%ld", cps);
  1279.         clrtoeol();
  1280.     }
  1281. #else  /* Not GFTIMER */
  1282.     if ((secs = gtv - fsecs) > 0) {
  1283.         cps = (secs < 1L) ? ffc : ffc / secs;
  1284.         move(CW_CP,22);
  1285. #ifdef KUI
  1286. #ifndef K95G
  1287.         KuiSetProperty( KUI_FILE_TRANSFER, (long) CW_CP, (long) cps );
  1288. #endif /* K95G */
  1289. #endif /* KUI */
  1290.         printw("%ld", cps);
  1291.         clrtoeol();
  1292.     }
  1293. #endif /* GFTIMER */
  1294. #endif /* CPS_WEIGHTED */
  1295.     if (cps > peakcps &&                /* Peak transfer rate */
  1296.         ((what == W_SEND && spackets > wslots + 4) ||
  1297.         (what != W_SEND && spackets > 10))) {
  1298.         peakcps = cps;
  1299.     }
  1300.     old_tr = shoetl(old_tr, cps, fsiz, howfar);
  1301.     return(cps);
  1302. }
  1303. static
  1304. #ifdef CK_ANSIC                         /* Because VOID used by curses.h */
  1305. void
  1306. #else
  1307. #ifdef MYCURSES
  1308. VOID
  1309. #else
  1310. int
  1311. #endif /* MYCURSES */
  1312. #endif /* CK_ANSIC */
  1313. scrft() {                               /* Display file type */
  1314.     char xferstr[80];
  1315.     xferstr[0] = NUL;
  1316.     if (binary) {
  1317.         switch(binary) {
  1318.           case XYFT_L:
  1319.             strcpy( xferstr, "LABELED" ) ;
  1320.             break;
  1321.           case XYFT_I:
  1322.             strcpy( xferstr, "IMAGE" );
  1323.             break;
  1324.           case XYFT_U:
  1325.             strcpy( xferstr, "BINARY UNDEFINED" );
  1326.             break;
  1327.           default:
  1328.           case XYFT_B:
  1329.             strcpy( xferstr, "BINARY" );
  1330.             break;
  1331.         }
  1332. #ifdef CK_RESEND
  1333.         if (what == W_SEND && sendstart > 0L) {
  1334.             if (sendmode == SM_PSEND) {
  1335.                 strcat( xferstr, " / partial");
  1336.             } else if (sendmode == SM_RESEND) {
  1337.                 strcat( xferstr, " / resend");
  1338.             }
  1339.         } else if (what == W_RECV && rs_len > 0L) {
  1340.             strcat( xferstr, " / resend");
  1341.         }
  1342. #endif /* CK_RESEND */
  1343.     } else {
  1344.         strcpy(xferstr, "TEXT") ;
  1345. #ifndef NOCSETS
  1346.         if (tcharset == TC_TRANSP) {
  1347.             strcat( xferstr, " (no translation)");
  1348.         } else {
  1349.             if (what == W_SEND) {
  1350.                 sprintf( &xferstr[strlen(xferstr)],
  1351.                         " (%s => %s)",
  1352.                         fcsinfo[fcharset].keyword,
  1353.                         tcsinfo[tcharset].keyword);
  1354.             } else {
  1355.                 sprintf( &xferstr[strlen(xferstr)],
  1356.                         " (%s => %s)",
  1357.                         tcsinfo[tcharset].keyword,
  1358.                         fcsinfo[fcharset].keyword);
  1359.             }
  1360.         }
  1361. #endif /* NOCSETS */
  1362.     }
  1363.     move(CW_TYP,22);
  1364.     printw("%s", xferstr);
  1365.     clrtoeol();
  1366. #ifdef KUI
  1367. #ifndef K95G
  1368.     KuiSetProperty( KUI_FILE_TRANSFER, (long) CW_TYP, (long) xferstr );
  1369. #endif /* K95G */
  1370. #endif /* KUI */
  1371.     return;
  1372. }
  1373. #ifdef CK_NEWTERM
  1374. static FILE *ck_stdout = NULL;
  1375. static int ck_fd = -1;
  1376. #endif /* CK_NEWTERM */
  1377. static long pct = 0L, oldpct = 0L, oldrtt = -1L;
  1378. static int oldtyp = 0, oldwin = -1, oldtry = -1, oldlen = -1, oldtim = -1;
  1379. #ifdef NETCONN
  1380. static char *netname[] = {
  1381.     "none", "TCP/IP", "TCP/IP", "X.25", "DECnet", "VAX PSI", "Named Pipes",
  1382.     "X.25", "NetBIOS", "SuperLAT", "File", "Command", "DLL", "SSH",
  1383.     "X.25", "X.25", NULL
  1384. };
  1385. #endif /* NETCONN */
  1386. #ifdef CK_ANSIC
  1387. void
  1388. screenc(int f, char c,long n,char *s)
  1389. #else
  1390. #ifdef MYCURSES
  1391. VOID
  1392. #else
  1393. int
  1394. #endif /* MYCURSES */
  1395. screenc(f,c,n,s)
  1396. int f;          /* argument descriptor */
  1397. char c;         /* a character or small integer */
  1398. long n;         /* a long integer */
  1399. char *s;        /* a string */
  1400. #endif /* CK_ANSIC */
  1401. /* screenc() */ {
  1402. #ifdef CK_SSL
  1403.     extern int tls_active_flag, ssl_active_flag;
  1404. #endif /* CK_SSL */
  1405. #ifdef RLOGCODE
  1406.     extern int ttnproto;
  1407. #endif /* RLOGCODE */
  1408.     static int q = 0;
  1409.     static long fsiz = -1L;   /* Copy of file size */
  1410.     static long fcnt = 0L;    /* Number of files transferred */
  1411.     static long fbyt = 0L;    /* Total file bytes of all files transferred */
  1412.     static long howfar = 0L;  /* How much of current file has been xfer'd. */
  1413.     static int  pctlbl = 0L;  /* Percent done vs Bytes so far */
  1414.     long cps = 0L;
  1415.     int len;                            /* Length of string */
  1416.     int errors = 0;                     /* Error counter */
  1417.     int x;                              /* Worker */
  1418.     debug(F101,"screenc cinit","",cinit);
  1419.     debug(F101,"screenc cendw","",cendw);
  1420.     if (!s) s = "";                     /* Always do this. */
  1421.     if (cinit == 0 || cendw > 0) {      /* Handle borderline cases... */
  1422.         if (f == SCR_CW) {              /* Close window, but it's not open */
  1423.             ft_win = 0;
  1424.             return;
  1425.         }
  1426.         debug(F111,"screenc fatal A",s,f);
  1427.         if (f == SCR_EM ||
  1428.            (f == SCR_PT && c == 'E')) { /* Fatal error before window open */
  1429.             conoll(""); conoc('?'); conoll(s); return; /* Regular display */
  1430.         }
  1431.     }
  1432.     if (cinit == 0) {                   /* Only call initscr() once */
  1433.         cendw = 1;                      /* New window needs repainting */
  1434. #ifdef COMMENT
  1435.         if (!initscr()) {               /* Oops, can't initialize window? */
  1436. /*
  1437.   In fact, this doesn't happen.  "man curses" says initscr() halts the
  1438.   entire program if it fails, which is true on the systems where I've
  1439.   tested it.  It will fail if your terminal type is not known to it.
  1440.   That's why SET FILE DISPLAY FULLSCREEN calls tgetent() to make sure the
  1441.   terminal type is known before allowing a curses display.
  1442. */
  1443.             fprintf(stderr,"CURSES INITSCR ERRORrn");
  1444.             fdispla = XYFD_S;           /* Fall back to CRT display */
  1445.             return;
  1446.         } else {
  1447.             cinit++;                    /* Window initialized ok */
  1448.             debug(F100,"CURSES INITSCR OK","",0);
  1449.         }
  1450. #else                                   /* Save some memory. */
  1451. #ifdef CK_NEWTERM
  1452.         /* (From Andy Fyfe <andy@vlsi.cs.caltech.edu>)
  1453.            System V curses seems to reserve the right to alter the buffering
  1454.            on the output FILE* without restoring it.  Fortunately System V
  1455.            curses provides newterm(), an alternative to initscr(), that
  1456.            allows us to specify explicitly the terminal type and input and
  1457.            output FILE pointers.  Thus we duplicate stdout, and let curses
  1458.            have the copy.  The original remains unaltered.  Unfortunately,
  1459.            newterm() seems to be particular to System V.
  1460.         */
  1461.         s = getenv("TERM");
  1462.         if (ck_fd < 0) {
  1463.             ck_fd = dup(fileno(stdout));
  1464.             ck_stdout = (ck_fd >= 0) ? fdopen(ck_fd, "w") : NULL;
  1465.         }
  1466.         debug(F100,"screenc newterm...","",0);
  1467.         if (ck_stdout == NULL || newterm(s, ck_stdout, stdin) == 0) {
  1468.             fprintf(stderr,
  1469.               "Fullscreen display not supported for terminal type: %srn",s);
  1470.             fdispla = XYFD_S;           /* Use CRT instead */
  1471.             return;
  1472.         }
  1473.         debug(F100,"screenc newterm ok","",0);
  1474. #else
  1475.         debug(F100,"screen calling initscr","",0);
  1476.         initscr();                      /* Initialize curses. */
  1477.         debug(F100,"screen initscr ok","",0);
  1478. #endif /* CK_NEWTERM */
  1479.         cinit++;                        /* Remember curses was initialized. */
  1480. #endif /* COMMENT */
  1481.     }
  1482.     ft_win = 1;                         /* Window is open */
  1483.     if (repaint) {
  1484. #ifdef CK_WREFRESH
  1485. /*
  1486.   This totally repaints the screen, just what we want, but we can only
  1487.   do this with real curses, and then only if clearok() and wrefresh() are
  1488.   provided in the curses library.
  1489. */
  1490. #ifdef OS2
  1491.         RestoreCmdMode();
  1492. #else
  1493. #ifdef QNX
  1494. #ifndef QNX16
  1495.         clearok(stdscr, 1);             /* QNX doesn't have curscr */
  1496. #endif /* QNX16 */
  1497.         wrefresh(stdscr);
  1498. #else
  1499.         wrefresh(curscr);
  1500. #endif /* QNX */
  1501. #endif /* OS2 */
  1502. #else  /* No CK_WREFRESH */
  1503. /*
  1504.   Kermit's do-it-yourself method, works with all types of fullscreen
  1505.   support, but does not repaint all the fields.  For example, the filename
  1506.   is lost, because it arrives at a certain time and never comes again, and
  1507.   Kermit presently does not save it anywhere.  Making this method work for
  1508.   all fields would be a rather major recoding task, and would add a lot of
  1509.   complexity and storage space.
  1510. */
  1511.         cendw = 1;
  1512. #endif /* CK_WREFRESH */
  1513.         repaint = 0;
  1514.     }
  1515.     if (cendw) {                        /* endwin() was called previously */
  1516. #ifdef VMS
  1517.         initscr();                      /* (or should have been!) */
  1518.         clear();
  1519.         touchwin(stdscr);
  1520.         refresh();
  1521. #else
  1522. #ifdef QNX
  1523. /*
  1524.   In QNX, if we don't call initscr() here we core dump.
  1525.   I don't have any QNX curses documentation, but other curses manuals
  1526.   say that initscr() should be called only once per application, and
  1527.   experience shows that on other systems, calling initscr() here generally
  1528.   results in a core dump.
  1529. */
  1530.         debug(F100,"screenc re-calling initscr QNX","",0);
  1531.         initscr();
  1532.         clear();
  1533.         refresh();
  1534. #ifdef COMMENT
  1535. /*
  1536.   But even so, second and subsequent curses displays are messed up.
  1537.   Calling touchwin, refresh, etc, doesn't make any difference.
  1538. */
  1539.         debug(F100,"screenc calling touchwin QNX","",0);
  1540.         touchwin(stdscr);
  1541.         debug(F100,"screenc calling refresh QNX","",0);
  1542.         refresh();
  1543. #endif /* COMMENT */
  1544. #else /* All others... */
  1545.         debug(F100,"screenc calling clear","",0);
  1546.         clear();
  1547.         debug(F100,"screenc clear ok","",0);
  1548. #endif /* QNX */
  1549. #endif /* VMS */
  1550.         debug(F100,"screenc setup ok","",0);
  1551.         debug(F100,"screenc doing first move","",0);
  1552.         move(CW_BAN,0);                 /* Display the banner */
  1553.         debug(F110,"screenc myhost",myhost,0);
  1554. #ifdef TCPSOCKET
  1555.         debug(F110,"screenc myipaddr",myipaddr,0);
  1556. #endif /* TCPSOCKET */
  1557. #ifdef HPUX1010
  1558.         debug(F100,"screenc calling first printw...","",0);
  1559. /* Right here is where HP-UX 10.10 libxcurse.1 Rev 76.20 hangs... */
  1560. #endif /* HPUX1010 */
  1561.         if (myhost[0]) {
  1562. #ifdef TCPSOCKET
  1563.             if (!myipaddr[0]
  1564. #ifdef OS2
  1565.                  /* We need to perform this test because on non-TCP/IP */
  1566.                  /* systems the call to getlocalipaddr() results in a  */
  1567.                  /* DNS Lookup which takes several minutes to time out */
  1568.                  && network &&
  1569.                  (nettype == NET_TCPA || nettype == NET_TCPB)
  1570. #endif /* OS2 */
  1571.                  )
  1572.               getlocalipaddr();
  1573.             if (myipaddr[0] && strcmp((char *)myhost,(char *)myipaddr))
  1574.               printw("%s, %s [%s]",versio,(char *)myhost,(char *)myipaddr);
  1575.             else
  1576. #endif /* TCPSOCKET */
  1577.               printw("%s, %s",versio,(char *)myhost);
  1578.         } else {
  1579.             printw("%s",versio);
  1580.         }
  1581. #ifdef HPUX1010
  1582.         debug(F100,"screenc first printw returns","",0);
  1583. #endif /* HPUX1010 */
  1584.         move(CW_DIR,3);
  1585.         printw("Current Directory: %s",zgtdir());
  1586. #ifdef KUI
  1587. #ifndef K95G
  1588.         KuiSetProperty( KUI_FILE_TRANSFER, (long) CW_DIR, (long) zgtdir() );
  1589. #endif /* K95G */
  1590. #endif /* KUI */
  1591.         if (network) {
  1592.             move(CW_LIN,8);
  1593.             printw("Network Host: %s",ttname);
  1594.         } else {
  1595.             move(CW_LIN,0);
  1596.             printw("Communication Device: %s",ttname);
  1597.         }
  1598. #ifdef KUI
  1599. #ifndef K95G
  1600.         KuiSetProperty( KUI_FILE_TRANSFER, (long) CW_LIN, (long) ttname );
  1601. #endif /* K95G */
  1602. #endif /* KUI */
  1603.         if (network) {
  1604.             move(CW_SPD,8);
  1605.             printw("Network Type: ");
  1606.         } else {
  1607.             move(CW_SPD,1);
  1608.             printw("Communication Speed: ");
  1609.         }
  1610.         move(CW_SPD,22);                /* Serial speed or network type */
  1611.         if (network) {
  1612. #ifdef NETCONN
  1613.             if (0
  1614. #ifdef CK_ENCRYPTION
  1615.                 || ck_tn_encrypting() && ck_tn_decrypting()
  1616. #endif /* CK_ENCRYPTION */
  1617. #ifdef CK_SSL
  1618.                 || tls_active_flag || ssl_active_flag
  1619. #endif /* CK_SSL */
  1620. #ifdef RLOGCODE
  1621. #ifdef CK_KERBEROS
  1622. #ifdef CK_ENCRYPTION
  1623.                 || ttnproto == NP_EK4LOGIN || ttnproto == NP_EK5LOGIN
  1624. #endif /* CK_ENCRYPTION */
  1625. #endif /* CK_KERBEROS */
  1626. #endif /* RLOGCODE */
  1627.                  ) {
  1628. #ifdef KUI
  1629. #ifndef K95G
  1630.                 char buf[30];
  1631.                 sprintf(buf,"%s (SECURE)",netname[nettype]);
  1632.                 KuiSetProperty(KUI_FILE_TRANSFER,
  1633.                                (long) CW_SPD,
  1634.                                (long) buf
  1635.                                );
  1636. #endif /* K95G */
  1637. #endif /* KUI */
  1638.                 printw("%s (SECURE)",netname[nettype]);
  1639.             } else {
  1640.                 printw("%s",netname[nettype]);
  1641. #ifdef KUI
  1642. #ifndef K95G
  1643.                 KuiSetProperty(KUI_FILE_TRANSFER,
  1644.                                (long) CW_SPD,
  1645.                                (long) netname[nettype]
  1646.                                );
  1647. #endif /* K95G */
  1648. #endif /* KUI */
  1649.             }
  1650. #else
  1651.             printw("(network)");
  1652. #ifdef KUI
  1653. #ifndef K95G
  1654.             KuiSetProperty(KUI_FILE_TRANSFER,
  1655.                            (long) CW_SPD,
  1656.                            (long) "(network)"
  1657.                            );
  1658. #endif /* K95G */
  1659. #endif /* KUI */
  1660. #endif /* NETCONN */
  1661.         } else {
  1662.             if (speed < 0L)
  1663.               speed = ttgspd();
  1664.             if (speed > 0L) {
  1665.                 if (speed == 8880) {
  1666.                     printw("75/1200");
  1667. #ifdef KUI
  1668. #ifndef K95G
  1669.                     KuiSetProperty(KUI_FILE_TRANSFER,
  1670.                                    (long) CW_SPD,
  1671.                                    (long) "75/1200"
  1672.                                    );
  1673. #endif /* K95G */
  1674. #endif /* KUI */
  1675.                 } else {
  1676.                     char speedbuf[64] ;
  1677.                     sprintf(speedbuf, "%ld", speed);
  1678.                     printw("%s",speedbuf);
  1679. #ifdef KUI
  1680. #ifndef K95G
  1681.                     KuiSetProperty(KUI_FILE_TRANSFER,
  1682.                                    (long) CW_SPD,
  1683.                                    (long) speedbuf
  1684.                                    );
  1685. #endif /* K95G */
  1686. #endif /* KUI */
  1687.                 }
  1688.             } else {
  1689.                 printw("unknown");
  1690. #ifdef KUI
  1691. #ifndef K95G
  1692.                 KuiSetProperty(KUI_FILE_TRANSFER,
  1693.                                (long) CW_SPD,
  1694.                                (long) "(unknown)"
  1695.                                );
  1696. #endif /* K95G */
  1697. #endif /* KUI */
  1698.             }
  1699.         }
  1700.         move(CW_PAR,14);
  1701.         printw("Parity: %s",parnam((char)parity));
  1702. #ifdef KUI
  1703. #ifndef K95G
  1704.         KuiSetProperty(KUI_FILE_TRANSFER,
  1705.                        (long) CW_PAR,
  1706.                        (long) parnam((char)parity)
  1707.                        );
  1708. #endif /* K95G */
  1709. #endif /* KUI */
  1710. #ifdef CK_TIMERS
  1711.         if (rttflg && protocol == PROTO_K) {
  1712.             move(CW_TMO, 9); printw("RTT/Timeout:"); }
  1713. #endif /* CK_TIMERS */
  1714.         move(CW_TYP,11); printw("File Type:");
  1715.         move(CW_SIZ,11); printw("File Size:");
  1716.         move(CW_PCD, 8);
  1717.         pctlbl = (what == W_SEND);
  1718.         printw("%s:", pctlbl ? "Percent Done" : "Bytes so far");
  1719. #ifdef XYZ_INTERNAL
  1720.         move(CW_BAR, 1);
  1721.         printw("%10s Protocol:",ptab[protocol].p_name);
  1722. #endif /* XYZ_INTERNAL */
  1723. #ifdef CK_PCT_BAR
  1724.         if (thermometer) {
  1725.             oldpct = pct = 0;
  1726.             move(CW_BAR,22);
  1727.             printw("    ...10...20...30...40...50...60...70...80...90..100");
  1728.             move(CW_BAR,22+56);
  1729.         }
  1730. #endif /* CK_PCT_BAR */
  1731.         move(CW_TR,  1); printw("Estimated Time Left:");
  1732.         move(CW_CP,  2); printw("Transfer Rate, CPS:");
  1733.         move(CW_WS,  8); printw("Window Slots:%s",
  1734.                                 protocol == PROTO_K ?
  1735.                                 "" : " N/A"
  1736.                                 );
  1737.         move(CW_PT,  9); printw("Packet Type:");
  1738. #ifdef XYZ_INTERNAL
  1739.         if (protocol != PROTO_K) {
  1740.             move(CW_PC,  11); printw("I/O Count:");
  1741.             move(CW_PL,  10); printw("I/O Length:");
  1742.         } else {
  1743. #endif /* XYZ_INTERNAL */
  1744.             move(CW_PC,  8); printw("Packet Count:");
  1745.             move(CW_PL,  7); printw("Packet Length:");
  1746. #ifdef XYZ_INTERNAL
  1747.         }
  1748. #endif /* XYZ_INTERNAL */
  1749. #ifndef COMMENT
  1750.         move(CW_PR,  9); printw("Error Count:");
  1751. #else
  1752.         move(CW_PR,  2); printw("Packet Retry Count:");
  1753. #endif
  1754. #ifdef COMMENT
  1755.         move(CW_PB,  2); printw("Packet Block Check:");
  1756. #endif /* COMMENT */
  1757.         move(CW_ERR,10); printw("Last Error:");
  1758.         move(CW_MSG, 8); printw("Last Message:");
  1759.         move(CW_INT, 0);
  1760.         if (!xfrint) {
  1761.             printw("(Transfer interruption is disabled)");
  1762.         } else {
  1763. #ifdef CK_NEED_SIG
  1764.             printw(
  1765. "<%s>X to cancel file, <%s>Z to cancel group, <%s><CR> to resend last packet",
  1766.                    dbchr(escape), dbchr(escape), dbchr(escape)
  1767.                    );
  1768.             move(CW_INT + 1, 0);
  1769.             printw(
  1770. "<%s>E to send Error packet, ^C to quit immediately, <%s>L to refresh screen.",
  1771.                    dbchr(escape), dbchr(escape)
  1772.                    );
  1773. #else /* !CK_NEED_SIG */
  1774.             move(CW_INT, 0);
  1775. #ifdef OS2
  1776.             if (protocol == PROTO_K) {
  1777.                 printw(
  1778. "X to cancel file, Z to cancel group, <Enter> to resend last packet,"
  1779.                        );
  1780.             }
  1781. #else /* !OS2 */
  1782. #ifdef VMS                              /* In VMS avoid bottom line */
  1783.             printw(
  1784. "X: Cancel this file; E: Cancel transfer; ^C: Quit now; ^W: Refresh screen."
  1785.                    );
  1786. #else
  1787.             printw(
  1788. "X to cancel file, Z to cancel group, <CR> to resend last packet,"
  1789.                    );
  1790. #endif /* VMS */
  1791. #endif /* OS2 */
  1792. #ifndef VMS
  1793.             move(CW_INT + 1, 0);
  1794.             if (protocol == PROTO_K) {
  1795.                 printw(
  1796. "E to send Error packet, ^C to quit immediately, ^L to refresh screen."
  1797.                        );
  1798.             } else {
  1799.                 printw("^C to cancel file transfer.");
  1800.             }
  1801. #endif /* VMS */
  1802. #endif /* CK_NEED_SIG */
  1803.         }
  1804.         refresh();
  1805.         cendw = 0;
  1806.     }
  1807.     debug(F101,"SCREENC switch","",f);
  1808.     debug(F000,"SCREENC c","",c);
  1809.     debug(F101,"SCREENC n","",n);
  1810.     len = strlen(s);                    /* Length of argument string */
  1811.     switch (f) {                        /* Handle our function code */
  1812.       case SCR_FN:                      /* Filename */
  1813.         oldpct = pct = 0L;              /* Reset percents */
  1814. #ifdef GFTIMER
  1815.         gtv = (CKFLOAT) -1.0;
  1816.         /* oldgtv = (CKFLOAT) -1.0; */
  1817. #else
  1818.         gtv = -1L;
  1819.         /* oldgtv = -1L; */
  1820. #endif /* GFTIMER */
  1821.         oldwin = -1;
  1822.         fsiz = -1L;                     /* Invalidate previous file size */
  1823.         move(CW_PCD,22);                /* Erase percent done from last time */
  1824. #ifdef KUI
  1825. #ifndef K95G
  1826.         KuiSetProperty( KUI_FILE_TRANSFER, (long) CW_PCD, (long) 0 );
  1827.         KuiSetProperty( KUI_FILE_TRANSFER, (long) CW_FFC, (long) 0 );
  1828. #endif /* K95G */
  1829. #endif /* KUI */
  1830.         clrtoeol();
  1831.         move(CW_SIZ,22);                /* Erase file size from last time */
  1832. #ifdef KUI
  1833. #ifndef K95G
  1834.         KuiSetProperty( KUI_FILE_TRANSFER, (long) CW_SIZ, (long) 0 );
  1835. #endif /* K95G */
  1836. #endif /* KUI */
  1837.         clrtoeol();
  1838.         move(CW_ERR,22);                /* And last error message */
  1839. #ifdef KUI
  1840. #ifndef K95G
  1841.         KuiSetProperty( KUI_FILE_TRANSFER, (long) CW_ERR, (long) "" );
  1842. #endif /* K95G */
  1843. #endif /* KUI */
  1844.         clrtoeol();
  1845. #ifdef COMMENT
  1846. #ifdef STREAMING
  1847.         if (protocol == PROTO_K && streamok) {
  1848.             move(CW_BAR, 1);
  1849. #ifdef XYZ_INTERNAL
  1850.             printw("   Kermit STREAMING:");
  1851. #else
  1852.             printw("          STREAMING:");
  1853. #endif /* XYZ_INTERNAL */
  1854.         }
  1855. #endif /* STREAMING */
  1856. #endif /* COMMENT */
  1857.         if (what == W_SEND) {           /* If we're sending... */
  1858. #ifdef CK_RESEND
  1859.             switch (sendmode) {
  1860.               case SM_RESEND:
  1861.                 move(CW_NAM,11);
  1862.                 printw("RESENDING:");
  1863.                 break;
  1864.               default:
  1865.                 move(CW_NAM,13);
  1866.                 printw("SENDING:");
  1867.                 break;
  1868.             }
  1869. #else
  1870.             move(CW_NAM,13);
  1871.             printw("SENDING:");
  1872. #endif /* CK_RESEND */
  1873.         } else if (what == W_RECV) {    /* If we're receiving... */
  1874.             move(CW_NAM,11);
  1875.             printw("RECEIVING:");
  1876.         } else {                        /* If we don't know... */
  1877.             move(CW_NAM,11);            /* (should never see this) */
  1878.             printw("File Name:");
  1879.         }
  1880.         move(CW_NAM,22);                /* Display the filename */
  1881.         if (len > 57) {
  1882.             printw("%.55s..",s);
  1883.             len = 57;
  1884.         } else printw("%s",s);
  1885. #ifdef KUI
  1886. #ifndef K95G
  1887.         KuiSetProperty( KUI_FILE_TRANSFER, (long) CW_NAM, (long) s );
  1888. #endif /* K95G */
  1889. #endif /* KUI */
  1890.         q = len;                        /* Remember name length for later */
  1891.         clrtoeol();
  1892.         scrft();                        /* Display file type (can change) */
  1893.         refresh();
  1894. #ifdef OS2
  1895.         SaveCmdMode(0, 0);
  1896. #endif /* OS2 */
  1897.         return;
  1898.       case SCR_AN:                      /* File as-name */
  1899.         if (q + len + 4 < 58) {         /* Will fit */
  1900.             move(CW_NAM, 22 + q);
  1901.             printw(" => %s",s);
  1902. #ifdef KUI
  1903. #ifndef K95G
  1904.             KuiSetProperty( KUI_FILE_TRANSFER, (long) CW_NAM, (long) s );
  1905. #endif /* K95G */
  1906. #endif /* KUI */
  1907.         } else {                        /* Too long */
  1908.             move(CW_NAM, 22);           /* Overwrite previous name */
  1909.             q = 0;
  1910.             if (len + 4 > 57) {                                 /* wg15 */
  1911.                 printw(" => %.51s..",s);                        /* wg15 */
  1912.                 len = 53;                                       /* wg15 */
  1913.             } else printw(" => %s",s);                          /* wg15 */
  1914. #ifdef KUI
  1915. #ifndef K95G
  1916.             KuiSetProperty( KUI_FILE_TRANSFER, (long) CW_NAM, (long) s  );
  1917. #endif /* K95G */
  1918. #endif /* KUI */
  1919.         }
  1920.         q += len + 4;                   /* Remember horizontal position */
  1921.         clrtoeol();
  1922.         refresh();
  1923. #ifdef OS2
  1924.         SaveCmdMode(0, 0);
  1925. #endif /* OS2 */
  1926.         return;
  1927.       case SCR_FS:                      /* File size */
  1928.         fsiz = n;
  1929.         move(CW_SIZ,22);
  1930.         if (fsiz > -1L) {
  1931. #ifdef KUI
  1932. #ifndef K95G
  1933.             KuiSetProperty( KUI_FILE_TRANSFER, (long) CW_SIZ, (long) n );
  1934. #endif /* K95G */
  1935. #endif /* KUI */
  1936.             printw("%ld",n);
  1937.         }
  1938.         clrtoeol();
  1939.         move(CW_PCD, 8);
  1940.         if (fsiz > -1L) {               /* Put up percent label */
  1941.             pctlbl = 1;
  1942.             printw("Percent Done:");
  1943.         }
  1944.         clrtoeol();
  1945.         scrft();                        /* File type */
  1946.         refresh();
  1947. #ifdef OS2
  1948.         SaveCmdMode(0, 0);
  1949. #endif /* OS2 */
  1950.         return;
  1951.       case SCR_PT:                      /* Packet type or pseudotype */
  1952.         if (spackets < 5) {
  1953.             extern int sysindex;
  1954.             extern struct sysdata sysidlist[];
  1955.             /* Things that won't change after the 4th packet */
  1956.             move(CW_PAR,22);
  1957.             printw("%s",parnam((char)parity));
  1958. #ifdef KUI
  1959. #ifndef K95G
  1960.             KuiSetProperty( KUI_FILE_TRANSFER,
  1961.                            (long) CW_PAR,
  1962.                            (long) parnam((char)parity)
  1963.                            );
  1964. #endif /* K95G */
  1965. #endif /* KUI */
  1966.             clrtoeol();
  1967. #ifdef COMMENT
  1968.             move(CW_PB, 22);            /* Block check on this packet */
  1969.             if (bctu == 4)
  1970.               printw("B");
  1971.             else
  1972.               printw("%d",bctu);
  1973.             clrtoeol();
  1974. #endif /* COMMENT */
  1975.             if (spackets == 4) {
  1976.                 move(CW_LIN,8);
  1977.                 if (protocol == PROTO_K && sysindex > -1) {
  1978.                     if (network) {
  1979.                         move(CW_LIN,8);
  1980.                         printw("Network Host: %s (%s)",
  1981.                              ttname,
  1982.                              sysidlist[sysindex].sid_name
  1983.                              );
  1984.                     }
  1985.                     else {
  1986.                         move(CW_LIN,0);
  1987.                         printw("Communication Device: %s (remote host is %s)",
  1988.                              ttname,
  1989.                              sysidlist[sysindex].sid_name
  1990.                              );
  1991.                     }
  1992.                     clrtoeol();
  1993.                 }
  1994.             }
  1995.         }
  1996. #ifdef CK_TIMERS
  1997.         if (rttflg && protocol == PROTO_K) {
  1998.             long xx;
  1999.             if (
  2000. #ifdef STREAMING
  2001.                 streaming && oldwin != -2
  2002. #else
  2003.                 0
  2004. #endif /* STREAMING */
  2005.                 ) {
  2006.                 move(CW_TMO, 22);
  2007.                 printw("00 / 00");
  2008.                 clrtoeol();
  2009.             } else {
  2010.                 xx = (rttdelay + 500) / 1000;
  2011.                 if (xx != oldrtt || rcvtimo != oldtim) {
  2012.                     move(CW_TMO, 22);
  2013.                     printw("%02ld / %02d", xx, rcvtimo);
  2014.                     oldrtt = xx;
  2015.                     oldtim = rcvtimo;
  2016.                     clrtoeol();
  2017.                 }
  2018.             }
  2019.         }
  2020. #endif /* CK_TIMERS */
  2021.         x = (what == W_RECV) ?          /* Packet length */
  2022.           rpktl+(protocol==PROTO_K?1:0) :
  2023.             spktl;
  2024.         if (x != oldlen) {              /* But only if it changed. */
  2025.             move(CW_PL, 22);
  2026.             printw("%d",x);
  2027. #ifdef KUI
  2028. #ifndef K95G
  2029.             KuiSetProperty( KUI_FILE_TRANSFER, (long) CW_PL, (long) x );
  2030. #endif /* K95G */
  2031. #endif /* KUI */
  2032.             clrtoeol();
  2033.             oldlen = x;
  2034.         }
  2035.         move(CW_PC, 22);                /* Packet count (always). */
  2036.         printw("%d", (what == W_RECV) ? rpackets : spackets);
  2037. #ifdef KUI
  2038. #ifndef K95G
  2039.         KuiSetProperty( KUI_FILE_TRANSFER, (long) CW_PC, (long) spackets );
  2040. #endif /* K95G */
  2041. #endif /* KUI */
  2042.         clrtoeol();
  2043.         if (protocol == PROTO_K) {      /* Window slots */
  2044.             char ws[16];
  2045.             int flag;
  2046.             flag = 0;
  2047. #ifdef STREAMING
  2048.             if (streaming) {
  2049.                 if (oldwin != -2) {
  2050.                     sprintf(ws,"STREAMING");
  2051.                     flag = 1;
  2052.                     oldwin = -2;
  2053.                 }
  2054.             } else
  2055. #endif /* STREAMING */
  2056.               if (wcur != oldwin) {
  2057.                   sprintf(ws, "%d of %d", wcur < 1 ? 1 : wcur, wslotn);
  2058.                   flag = 1;
  2059.                   oldwin = wcur;
  2060.               }
  2061.             if (flag) {
  2062.                 move(CW_WS, 22);
  2063.                 printw("%s", ws);
  2064.                 clrtoeol();
  2065. #ifdef KUI
  2066. #ifndef K95G
  2067.                 KuiSetProperty( KUI_FILE_TRANSFER, (long) CW_WS, (long) ws );
  2068. #endif /* K95G */
  2069. #endif /* KUI */
  2070.             }
  2071.         }
  2072.         errors = retrans + crunched + timeouts;
  2073.         if (errors != oldtry) {         /* Retry count, if changed */
  2074.             move(CW_PR, 22);
  2075.             printw("%d",errors);
  2076. #ifdef KUI
  2077. #ifndef K95G
  2078.             KuiSetProperty( KUI_FILE_TRANSFER, (long) CW_PR, (long) errors );
  2079. #endif /* K95G */
  2080. #endif /* KUI */
  2081.             clrtoeol();
  2082.             oldtry = errors;
  2083.         }
  2084.         if (c != oldtyp && c != 'Y' && c != 'N') { /* Sender's packet type */
  2085.             char type[2];
  2086.             sprintf(type, "%c",c);
  2087.             move(CW_PT,22);
  2088.             printw("%s", type);
  2089. #ifdef KUI
  2090. #ifndef K95G
  2091.             KuiSetProperty( KUI_FILE_TRANSFER, (long) CW_PT, (long) type );
  2092. #endif /* K95G */
  2093. #endif /* KUI */
  2094.             clrtoeol();
  2095.             oldtyp = c;
  2096.         }
  2097.         switch (c) {                    /* Now handle specific packet types */
  2098.           case 'S':                     /* Beginning of transfer */
  2099.             fcnt = fbyt = 0L;           /* Clear counters */
  2100. #ifdef GFTIMER
  2101.             gtv = -1.0;
  2102. #else /* GFTIMER */
  2103.             gtv = -1L;                  /* And old/new things... */
  2104. #endif /* GFTIMER */
  2105.             oldpct = pct = 0L;
  2106.             break;
  2107.           case 'Z':                     /* or EOF */
  2108.             debug(F101,"screenc SCR_PT Z pktnum","",n);
  2109.             debug(F101,"screenc SCR_PT Z oldpct","",oldpct);
  2110.             debug(F101,"screenc SCR_PT Z pct","",pct);
  2111.           case 'D':                     /* Data packet */
  2112.             if (fsiz > 0L) {            /* Show percent done if known */
  2113.                 oldpct = pct;           /* Remember previous percent */
  2114.                 howfar = ffc;
  2115. #ifdef CK_RESEND
  2116.                 if (what == W_SEND)     /* Account for PSEND or RESEND */
  2117.                   howfar += sendstart;
  2118.                 else if (what == W_RECV)
  2119.                   howfar += rs_len;
  2120. #endif /* CK_RESEND */
  2121.                 /* Percent done, to be displayed... */
  2122.                 if (c == 'Z') {
  2123.                     if (!discard && !cxseen && !czseen) pct = 100L;
  2124.                 } else
  2125.                   pct = (fsiz > 99L) ? (howfar / (fsiz / 100L)) : 0L;
  2126.                 if (pct > 100L ||       /* Allow for expansion and */
  2127.                    (oldpct == 99L && pct < 0L)) /* other boundary conditions */
  2128.                   pct = 100L;
  2129.                 if (pct != oldpct)      /* Only do this 100 times per file */
  2130.                   updpct(oldpct, pct);
  2131.             } else {
  2132.                 move(CW_PCD,22);
  2133.                 printw("%ld", ffc);
  2134.             }
  2135. #ifdef KUI
  2136. #ifndef K95G
  2137.             KuiSetProperty(KUI_FILE_TRANSFER, (long) CW_FFC, (long) howfar);
  2138. #endif /* K95G */
  2139. #endif /* KUI */
  2140.             cps = shocps((int) pct, fsiz, howfar);
  2141.             /* old_tr = shoetl(old_tr, cps, fsiz, howfar); */
  2142.             break;
  2143.           case '%':                     /* Timeouts, retransmissions */
  2144.             cps = shocps((int) pct, fsiz, howfar);
  2145.             /* old_tr = shoetl(old_tr, cps, fsiz, howfar); */
  2146.             errors = retrans + crunched + timeouts;
  2147.             if (errors != oldtry) {     /* Error count, if changed */
  2148.                 move(CW_PR, 22);
  2149.                 printw("%d",errors);
  2150.                 clrtoeol();
  2151. #ifdef KUI
  2152. #ifndef K95G
  2153.                 KuiSetProperty(KUI_FILE_TRANSFER,
  2154.                                (long) CW_PR, (long) errors
  2155.                                );
  2156. #endif /* K95G */
  2157. #endif /* KUI */
  2158.                 }
  2159.                 oldtry = errors;
  2160.                 if (s) if (*s) {
  2161.                     move(CW_ERR,22);
  2162.                     printw("%s",s);
  2163.                     clrtoeol();
  2164. #ifdef KUI
  2165. #ifndef K95G
  2166.                     KuiSetProperty(KUI_FILE_TRANSFER, (long) CW_ERR, (long) s);
  2167. #endif /* K95G */
  2168. #endif /* KUI */
  2169.             }
  2170.             break;
  2171.           case 'E':                     /* Error packet */
  2172. #ifdef COMMENT
  2173.             move(CW_ERR,22);            /* Print its data field */
  2174.             if (*s) {
  2175.                 printw("%s",s);
  2176. #ifdef KUI
  2177. #ifndef K95G
  2178.                 KuiSetProperty( KUI_FILE_TRANSFER, (long) CW_ERR, (long) s );
  2179. #endif /* K95G */
  2180. #endif /* KUI */
  2181.             }
  2182.             clrtoeol();
  2183. #endif /* COMMENT */
  2184.             fcnt = fbyt = 0L;           /* So no bytes for this file */
  2185.             break;
  2186.           case 'Q':                     /* Crunched packet */
  2187.             cps = shocps((int) pct, fsiz, howfar);
  2188.             /* old_tr = shoetl(old_tr, cps, fsiz, howfar); */
  2189.             move(CW_ERR,22);
  2190.             printw("Damaged Packet");
  2191. #ifdef KUI
  2192. #ifndef K95G
  2193.             KuiSetProperty(KUI_FILE_TRANSFER,
  2194.                            (long) CW_ERR,
  2195.                            (long) "Damaged Packet"
  2196.                            );
  2197. #endif /* K95G */
  2198. #endif /* KUI */
  2199.             clrtoeol();
  2200.             break;
  2201.           case 'q':                     /* Ctrl-C or connection lost */
  2202.             move(CW_MSG,22);
  2203.             if (!s) s = "";
  2204.             printw(*s ? s : "User interruption or connection lost");
  2205. #ifdef KUI
  2206. #ifndef K95G
  2207.             KuiSetProperty(KUI_FILE_TRANSFER,
  2208.                            (long) CW_MSG,
  2209.                            (long) s
  2210.                            );
  2211. #endif /* K95G */
  2212. #endif /* KUI */
  2213.             break;
  2214.           case 'T':                     /* Timeout */
  2215.             cps = shocps((int) pct, fsiz, howfar);
  2216.             /* old_tr = shoetl(old_tr, cps, fsiz, howfar); */
  2217.             move(CW_ERR,22);
  2218.             printw("Timeout %d sec",rcvtimo);
  2219. #ifdef KUI
  2220. #ifndef K95G
  2221.             KuiSetProperty(KUI_FILE_TRANSFER,
  2222.                            (long) CW_ERR,
  2223.                            (long) "Timeout"
  2224.                            );
  2225. #endif /* K95G */
  2226. #endif /* KUI */
  2227.             clrtoeol();
  2228.             errors = retrans + crunched + timeouts;
  2229.             if (errors != oldtry) {     /* Error count, if changed */
  2230.                 move(CW_PR, 22);
  2231.                 printw("%d",errors);
  2232. #ifdef KUI
  2233. #ifndef K95G
  2234.                 KuiSetProperty(KUI_FILE_TRANSFER,
  2235.                                (long) CW_PR, (long) errors
  2236.                                );
  2237. #endif /* K95G */
  2238. #endif /* KUI */
  2239.                 clrtoeol();
  2240.                 oldtry = errors;
  2241.             }
  2242.             break;
  2243.           default:                      /* Others, do nothing */
  2244.             break;
  2245.         }
  2246.         refresh();
  2247. #ifdef OS2
  2248.         SaveCmdMode(0, 0);
  2249. #endif /* OS2 */
  2250.         return;
  2251.       case SCR_ST:                      /* File transfer status */
  2252.         debug(F101,"screenc SCR_ST c","",c);
  2253.         debug(F101,"screenc SCR_ST success","",success);
  2254.         debug(F101,"screenc SCR_ST cxseen","",cxseen);
  2255. #ifdef COMMENT
  2256.         move(CW_PCD,22);                /* Update percent done */
  2257.         if (c == ST_OK) {               /* OK, print 100 % */
  2258.             if (pctlbl)
  2259.               updpct(oldpct,100);
  2260.             else
  2261.               printw("%ld", ffc);
  2262. #ifdef KUI
  2263. #ifndef K95G
  2264.             KuiSetProperty(KUI_FILE_TRANSFER, (long) CW_FFC, (long) ffc);
  2265. #endif /* K95G */
  2266. #endif /* KUI */
  2267.             pct = 100;
  2268.             oldpct = 0;
  2269.         } else if (fsiz > 0L)           /* Not OK, update final percent */
  2270. /*
  2271.   The else part writes all over the screen -- howfar and/or fsiz have
  2272.   been reset as a consequence of the not-OKness of the transfer.
  2273. */
  2274.           if (pctlbl)
  2275.             updpct(oldpct, (howfar * 100L) / fsiz);
  2276.         clrtoeol();
  2277. #else
  2278.         if (c == ST_OK) {               /* OK, print 100 % */
  2279.             move(CW_PCD,22);            /* Update percent done */
  2280.             if (pctlbl)
  2281.               updpct(oldpct,100);
  2282.             else
  2283.               printw("%ld", ffc);
  2284. #ifdef KUI
  2285. #ifndef K95G
  2286.             KuiSetProperty(KUI_FILE_TRANSFER, (long) CW_FFC, (long) ffc);
  2287. #endif /* K95G */
  2288. #endif /* KUI */
  2289. #ifdef COMMENT
  2290.             pct = 100;
  2291.             oldpct = 0;
  2292. #endif /* COMMENT */
  2293.             clrtoeol();
  2294.         }
  2295. #endif /* COMMENT */
  2296. #ifdef COMMENT
  2297. /* No, leave it there so they can read it */
  2298.         move(CW_MSG,22);                /* Remove any previous message */
  2299. #ifdef KUI
  2300. #ifndef K95G
  2301.         KuiSetProperty( KUI_FILE_TRANSFER, (long) CW_MSG, (long) "" );
  2302. #endif /* K95G */
  2303. #endif /* KUI */
  2304.         clrtoeol(); refresh();
  2305. #endif /* COMMENT */
  2306.         move(CW_TR, 22);
  2307. #ifdef KUI
  2308. #ifndef K95G
  2309.         KuiSetProperty( KUI_FILE_TRANSFER, (long) CW_TR, (long) "" );
  2310. #endif /* K95G */
  2311. #endif /* KUI */
  2312.         clrtoeol(); refresh();
  2313.         switch (c) {                    /* Print new status message */
  2314.           case ST_OK:                   /* Transfer OK */
  2315.             fcnt++;                     /* Count this file */
  2316.             fbyt += ffc;                /* Count its bytes */
  2317.             move(CW_MSG,22);
  2318.             printw("Transfer OK");      /* Say Transfer was OK */
  2319. #ifdef KUI
  2320. #ifndef K95G
  2321.             KuiSetProperty(KUI_FILE_TRANSFER,
  2322.                            (long) CW_MSG,
  2323.                            (long) "Transfer OK"
  2324.                            );
  2325. #endif /* K95G */
  2326. #endif /* KUI */
  2327.             clrtoeol(); refresh();
  2328.             return;
  2329.           case ST_DISC:                 /* Discarded */
  2330.             move(CW_ERR,22);
  2331.             printw("File discarded");
  2332. #ifdef KUI
  2333. #ifndef K95G
  2334.             KuiSetProperty(KUI_FILE_TRANSFER,
  2335.                            (long) CW_ERR,
  2336.                            (long) "File discarded"
  2337.                            );
  2338. #endif /* K95G */
  2339. #endif /* KUI */
  2340. #ifdef COMMENT
  2341.             pct = oldpct = 0;
  2342. #endif /* COMMENT */
  2343.             clrtoeol(); refresh();
  2344.             return;
  2345.           case ST_INT:                  /* Interrupted */
  2346.             move(CW_ERR,22);
  2347.             printw("Transfer interrupted");
  2348. #ifdef KUI
  2349. #ifndef K95G
  2350.             KuiSetProperty(KUI_FILE_TRANSFER,
  2351.                            (long) CW_ERR,
  2352.                            (long) "Transfer interrupted"
  2353.                            );
  2354. #endif /* K95G */
  2355. #endif /* KUI */
  2356. #ifdef COMMENT
  2357.             pct = oldpct = 0;
  2358. #endif /* COMMENT */
  2359.             clrtoeol(); refresh();
  2360.             return;
  2361.           case ST_SKIP:                 /* Skipped */
  2362.             move(CW_ERR,22);
  2363.             printw("File skipped");
  2364. #ifdef KUI
  2365. #ifndef K95G
  2366.             KuiSetProperty(KUI_FILE_TRANSFER,
  2367.                            (long) CW_ERR,
  2368.                            (long) "File skipped"
  2369.                            );
  2370. #endif /* K95G */
  2371. #endif /* KUI */
  2372. #ifdef COMMENT
  2373.             pct = oldpct = 0;
  2374. #endif /* COMMENT */
  2375.             clrtoeol(); refresh();
  2376.             return;
  2377.           case ST_ERR:                  /* Error message */
  2378.             move(CW_ERR,22);
  2379.             if (!s) s = (char *)epktmsg;
  2380.             printw("%s",s);
  2381. #ifdef KUI
  2382. #ifndef K95G
  2383.             KuiSetProperty( KUI_FILE_TRANSFER, (long) CW_ERR, (long) s );
  2384. #endif /* K95G */
  2385. #endif /* KUI */
  2386. #ifdef COMMENT
  2387.             pct = oldpct = 0;
  2388. #endif /* COMMENT */
  2389.             clrtoeol(); refresh();
  2390.             return;
  2391.           case ST_REFU:                 /* Refused */
  2392.             move(CW_ERR,22);
  2393.             if (*s) {
  2394.                 char errbuf[64] ;
  2395.                 sprintf( errbuf, "Refused, %s", s ) ;
  2396.                 printw("%s", errbuf);
  2397. #ifdef KUI
  2398. #ifndef K95G
  2399.                 KuiSetProperty(KUI_FILE_TRANSFER,(long) CW_ERR,(long) errbuf);
  2400. #endif /* K95G */
  2401. #endif /* KUI */
  2402.             } else {
  2403.                 printw("Refused");
  2404. #ifdef KUI
  2405. #ifndef K95G
  2406.                 KuiSetProperty(KUI_FILE_TRANSFER,(long)CW_ERR,(long)"Refused");
  2407. #endif /* K95G */
  2408. #endif /* KUI */
  2409.             }
  2410. #ifdef COMMENT
  2411.             pct = oldpct = 0;
  2412. #endif /* COMMENT */
  2413.             clrtoeol(); refresh();
  2414.             return;
  2415.           case ST_INC:
  2416.             move(CW_ERR,22);
  2417.             printw("Incomplete");
  2418. #ifdef KUI
  2419. #ifndef K95G
  2420.             KuiSetProperty(KUI_FILE_TRANSFER,(long)CW_ERR,(long)"Incomplete");
  2421. #endif /* K95G */
  2422. #endif /* KUI */
  2423. #ifdef COMMENT
  2424.             pct = oldpct = 0;
  2425. #endif /* COMMENT */
  2426.             clrtoeol(); refresh();
  2427.             return;
  2428.           case ST_MSG:
  2429.             move(CW_MSG,22);
  2430.             printw("%s",s);
  2431. #ifdef KUI
  2432. #ifndef K95G
  2433.             KuiSetProperty(KUI_FILE_TRANSFER,(long)CW_MSG,(long)s);
  2434. #endif /* K95G */
  2435. #endif /* KUI */
  2436.             clrtoeol(); refresh();
  2437.             return;
  2438.           default:                      /* Bad call */
  2439.             move(CW_ERR,22);
  2440.             printw("*** screen() called with bad status ***");
  2441. #ifdef KUI
  2442. #ifndef K95G
  2443.             KuiSetProperty( KUI_FILE_TRANSFER, (long) CW_ERR,
  2444.                        (long) "*** screen() called with bad status ***" );
  2445. #endif /* K95G */
  2446. #endif /* KUI */
  2447.             clrtoeol(); refresh(); return;
  2448.         }
  2449.       case SCR_TC: {                    /* Transaction complete */
  2450.           char msgbuf[128];
  2451.           int eff = -1;
  2452.           move(CW_CP,22);               /* Overall transfer rate */
  2453. #ifdef KUI
  2454. #ifndef K95G
  2455.           KuiSetProperty( KUI_FILE_TRANSFER, (long) CW_CP, tfcps);
  2456. #endif /* K95G */
  2457. #endif /* KUI */
  2458.           printw("%ld", tfcps);
  2459.           clrtoeol();
  2460.           if (success) {
  2461.               move(CW_MSG,22);          /* Print statistics in message line */
  2462.               clrtoeol();
  2463.           }
  2464.           if (success) {
  2465.               sprintf(msgbuf,
  2466.                       "SUCCESS.  Files: %ld, Bytes: %ld, %ld CPS",
  2467.                       fcnt,
  2468.                       fbyt,
  2469.                       tfcps
  2470.                       );
  2471.               printw("%s", msgbuf);
  2472. #ifdef KUI
  2473. #ifndef K95G
  2474.               KuiSetProperty(KUI_FILE_TRANSFER,
  2475.                              (long) CW_MSG,
  2476.                              (long) msgbuf
  2477.                              );
  2478. #endif /* K95G */
  2479. #endif /* KUI */
  2480.               clrtoeol();
  2481.           }
  2482.           move(CW_TR, 1);
  2483.           printw("       Elapsed Time: %s",hhmmss((long)
  2484. #ifdef GFTIMER
  2485.                                                   (fptsecs + 0.5)
  2486. #else
  2487.                                                   tsecs
  2488. #endif /* GFTIMER */
  2489.                                                    ));
  2490. #ifdef KUI
  2491. #ifndef K95G
  2492.           KuiSetProperty(KUI_FILE_TRANSFER,
  2493.                          (long) CW_TR,
  2494.                          (long) hhmmss((long)
  2495. #ifdef GFTIMER
  2496.                                        (fptsecs + 0.5)
  2497. #else
  2498.                                        tsecs
  2499. #endif /* GFTIMER */
  2500.                                        ));
  2501. #endif /* K95G */
  2502. #endif /* KUI */
  2503.           clrtoeol();
  2504.           move(23,0); clrtoeol();       /* Clear instructions lines */
  2505.           move(22,0); clrtoeol();       /* to make room for prompt. */
  2506.           refresh();
  2507. #ifdef GFTIMER
  2508.           oldgtv = (CKFLOAT) -1.0;
  2509. #else
  2510.           oldgtv = -1L;
  2511. #endif /* GFTIMER */
  2512. #ifndef VMSCURSE
  2513.           endwin();
  2514. #ifdef SOLARIS
  2515.           conres();
  2516. #endif /* SOLARIS */
  2517. #endif /* VMSCURSE */
  2518. #ifdef COMMENT
  2519.           pct = 100; oldpct = 0;        /* Reset these for next time. */
  2520. #endif /* COMMENT */
  2521.           oldtyp = 0; oldrtt = -1L; oldtry = -1; oldlen = -1;
  2522.           oldtim = -1;
  2523.           cendw = 1;
  2524.           if (xfrbel) bleep(BP_NOTE);   /* Close window, then beep. */
  2525. #ifdef UNIX
  2526.           fflush(stdout);
  2527. #endif /* UNIX */
  2528.           ft_win = 0;                   /* Window closed. */
  2529.           return;
  2530.       }
  2531.       case SCR_EM:                      /* Error packet (fatal) */
  2532.         move (CW_ERR,22);
  2533.         printw("FAILURE: %s",s);
  2534. #ifdef KUI
  2535. #ifndef K95G
  2536.         KuiSetProperty( KUI_FILE_TRANSFER, (long) CW_ERR, (long) s );
  2537. #endif /* K95G */
  2538. #endif /* KUI */
  2539.         if (xfrbel) bleep(BP_FAIL);
  2540. #ifdef COMMENT
  2541.         pct = oldpct = 0;
  2542. #endif /* COMMENT */
  2543.         clrtoeol(); refresh(); return;
  2544.       case SCR_QE:                      /* Quantity equals */
  2545.       case SCR_TU:                      /* Undelimited text */
  2546.       case SCR_TN:                      /* Text delimited at start */
  2547.       case SCR_TZ:                      /* Text delimited at end */
  2548.         return;                         /* (ignored in fullscreen display) */
  2549.       case SCR_XD:                      /* X-packet data */
  2550.         pct = oldpct = 0;
  2551.         move(CW_NAM,22);
  2552.         printw("%s",s);
  2553. #ifdef KUI
  2554. #ifndef K95G
  2555.         KuiSetProperty( KUI_FILE_TRANSFER, (long) CW_NAM, (long) s );
  2556. #endif /* K95G */
  2557. #endif /* KUI */
  2558.         clrtoeol(); refresh(); return;
  2559.       case SCR_CW:                      /* Close Window */
  2560.         clrtoeol(); move(23,0); clrtoeol(); move(22,0); clrtoeol();
  2561.         refresh();
  2562. #ifdef COMMENT
  2563.         pct = 100; oldpct = 0;          /* Reset these for next time. */
  2564. #endif /* COMMENT */
  2565.         oldtyp = 0; oldrtt = -1L; oldtry = -1; oldlen = -1;
  2566.         oldtim = -1;
  2567. #ifndef VMSCURSE
  2568.         endwin();
  2569. #endif /* VMSCURSE */
  2570.         ft_win = 0;                     /* Flag that window is closed. */
  2571.         cendw = 1; return;
  2572.       case SCR_CD:                      /* Display current directory */
  2573.         move(CW_DIR,22);
  2574.          printw("%s", s);
  2575. #ifdef KUI
  2576. #ifndef K95G
  2577.         KuiSetProperty( KUI_FILE_TRANSFER, (long) CW_DIR, (long) s );
  2578. #endif /* K95G */
  2579. #endif /* KUI */
  2580.         clrtoeol();
  2581.         refresh();
  2582. #ifdef OS2
  2583.         SaveCmdMode(0, 0);
  2584. #endif /* OS2 */
  2585.         return;
  2586.       default:                          /* Bad call */
  2587.         move (CW_ERR,22);
  2588. #ifdef KUI
  2589. #ifndef K95G
  2590.         KuiSetProperty(KUI_FILE_TRANSFER,
  2591.                        (long) CW_ERR,
  2592.                        (long) "*** screen() called with bad function code ***"
  2593.                        );
  2594. #endif /* K95G */
  2595. #endif /* KUI */
  2596.         printw("*** screen() called with bad function code ***");
  2597.         clrtoeol(); refresh(); return;
  2598.     }
  2599. }
  2600. #endif /* CK_CURSES */
  2601. #endif /* MAC */
  2602. #ifndef CK_CURPOS
  2603. /* Dummies for when cursor control is not supported */
  2604. int
  2605. ck_curpos(row, col) {
  2606.     return(-1);
  2607. }
  2608. int
  2609. ck_cls() {
  2610.     return(-1);
  2611. }
  2612. int
  2613. ck_cleol() {
  2614.     return(-1);
  2615. }
  2616. #endif /* CK_CURPOS */
  2617. #ifndef NOIKSD
  2618. #ifdef IKSDB
  2619. struct iksdbfld dbfld[] = {
  2620.    /* Offset    Length    Type   */
  2621.     { DB_FLAGS, dB_FLAGS, DBT_HEX },    /*  0 db_FLAGS Flags */
  2622.     { DB_ATYPE, dB_ATYPE, DBT_HEX },    /*  1 db_ATYPE Auth type */
  2623.     { DB_AMODE, dB_AMODE, DBT_HEX },    /*  3 db_AMODE Auth mode */
  2624.     { DB_STATE, dB_STATE, DBT_HEX },    /*  2 db_STATE State */
  2625.     { DB_MYPID, dB_MYPID, DBT_HEX },    /*  5 db_MYPID PID */
  2626.     { DB_SADDR, dB_SADDR, DBT_HEX },    /*  4 db_SADDR Server address */
  2627.     { DB_CADDR, dB_CADDR, DBT_HEX },    /*  6 db_CADDR Client address */
  2628.     { DB_START, dB_START, DBT_DAT },    /*  7 db_START Session start */
  2629.     { DB_LASTU, dB_LASTU, DBT_DAT },    /*  8 db_LASTU Last update */
  2630.     { DB_ULEN,  dB_ULEN,  DBT_HEX },    /*  9 db_ULEN  Username length */
  2631.     { DB_DLEN,  dB_DLEN,  DBT_HEX },    /* 10 db_DLEN  Directory name length */
  2632.     { DB_ILEN,  dB_ILEN,  DBT_HEX },    /* 11 db_ILEN  Info length */
  2633.     { DB_PAD1,  dB_PAD1,  DBT_UND },    /* 12 db_PAD1  (Reserved) */
  2634.     { DB_USER,  dB_USER,  DBT_STR },    /* 13 db_USER  Username */
  2635.     { DB_DIR,   dB_DIR,   DBT_STR },    /* 14 db_DIR   Current Directory */
  2636.     { DB_INFO,  dB_INFO,  DBT_STR }     /* 15 db_INFO  State-specific info */
  2637. };
  2638. static char lcknam[CKMAXPATH+1];        /* Lockfile pathname */
  2639. static char tmplck[CKMAXPATH+1];        /* Temporary lockfile name */
  2640. static char * updmode =                 /* Update mode for fopen() */
  2641. #ifdef OS2
  2642.   "r+b"
  2643. #else
  2644. #ifdef VMS
  2645.   "r+b"
  2646. #else
  2647.   "r+"
  2648. #endif /* VMS */
  2649. #endif /* OS2 */
  2650.   ;
  2651. /*  D B I N I T  --  Initialize the IKSD database...  */
  2652. int
  2653. dbinit() {
  2654.     extern int dbinited;
  2655.     int x = 0;
  2656.     debug(F110,"dbinit dbdir 1",dbdir,0);
  2657.     debug(F110,"dbinit dbfile 1",dbfile,0);
  2658.     if (dbinited)
  2659.       return(0);
  2660. #ifdef OS2
  2661.     if (!dbdir) {
  2662. #ifdef NT
  2663.         char * p = NULL;
  2664.         if (!isWin95()) {
  2665.             p = getenv("SystemRoot");
  2666.         } else {
  2667.             p = getenv("winbootdir");
  2668.             if (!p)  p = getenv("windir");
  2669.         }
  2670.         if (!p) p = "C:/";
  2671.         dbdir = malloc(strlen(p)+2);
  2672.         strcpy(dbdir,p);
  2673.         p = dbdir;
  2674.         while (*p) {
  2675.             if (*p == '\')
  2676.               *p = '/';
  2677.             p++;
  2678.         }
  2679. #else /* NT */
  2680.         makestr(&dbdir,"C:/");
  2681. #endif /* NT */
  2682.     }
  2683. #else /* OS2 */
  2684.     if (!dbdir)
  2685.       makestr(&dbdir,IK_DBASEDIR);
  2686. #endif /* OS2 */
  2687.     if (!dbfile) {
  2688.         char * s = "";
  2689.         x = strlen(dbdir);
  2690.         if (dbdir[x-1] != '/') {
  2691.             s = "/";
  2692.             x++;
  2693.         }
  2694.         x += (int)strlen(IK_DBASEFIL);
  2695.         dbfile = (char *)malloc(x+1);
  2696.         sprintf(dbfile,"%s%s%s",dbdir,s,IK_DBASEFIL);
  2697.     }
  2698.     debug(F110,"dbinit dbdir 2",dbdir,0);
  2699.     debug(F110,"dbinit dbfile 2",dbfile,0);
  2700.     mypid = getpid();                   /* Get my pid */
  2701.     debug(F101,"dbinit mypid","",mypid);
  2702.     if (!myhexip[0]) {                  /* Set my hex IP address */
  2703. #ifdef TCPSOCKET
  2704.         extern unsigned long myxipaddr;
  2705.         if (getlocalipaddr() > -1) {
  2706.             myip = myxipaddr;
  2707.             sprintf(myhexip,"%08lx",myip); /* (Needs fixing for IPv6) */
  2708.         } else
  2709. #endif /* TCPSOCKET */
  2710.           ckstrncpy(myhexip,"00000000",9);
  2711.     }
  2712.     debug(F011,"dbinit myip",myhexip,myip);
  2713.     if (!peerhexip[0]) {                /* Get peer's  hex IP address */
  2714. #ifdef TCPSOCKET
  2715.         extern unsigned long peerxipaddr;
  2716.         if (ckgetpeer()) {
  2717.             peerip = peerxipaddr;
  2718.             sprintf(peerhexip,"%08lx",peerip); /* (Needs fixing for IPv6) */
  2719.             debug(F011,"dbinit peerip",peerhexip,peerip);
  2720.         } else {
  2721.             debug(F101,"dbinit ckgetpeer failure","",errno);
  2722.             ckstrncpy(peerhexip,"00000000",9);
  2723.         }
  2724. #else
  2725.         ckstrncpy(peerhexip,"00000000",9);
  2726. #endif /* TCPSOCKET */
  2727.     }
  2728.     debug(F111,"dbinit peerip",peerhexip,peerip);
  2729.     debug(F101,"dbinit dbenabled","",dbenabled);
  2730.     if (dbenabled && inserver) {
  2731.         mydbslot = getslot();
  2732.         debug(F111,"dbinit getslot",ckitoa(ikdbopen),x);
  2733.         if (ikdbopen) dbinited = 1;
  2734.     }
  2735.     return(0);
  2736. }
  2737. /*  U P D S L O T  --  Update slot n  */
  2738. /*
  2739.   Opens the database if necessary, seeks to slot n, writes current record
  2740.   and adds current time to last-update field.  n is the record sequence number
  2741.   (0, 1, 2, ...), not the seek pointer.   Returns -1 on failure, 0 on success.
  2742. */
  2743. int
  2744. updslot(n) int n; {                     /* Update our slot */
  2745.     int x, rc = 0;
  2746.     long position;
  2747.     if (!ikdbopen)                      /* Not if not ok */
  2748.       return(0);
  2749.     if (!dbfp) {                        /* Open database if not open */
  2750.         dbfp = fopen(dbfile,updmode);   /* In update no-truncate mode */
  2751.         if (!dbfp) {
  2752.             debug(F110,"updslot fopen failed",dbfile,0);
  2753.             ikdbopen = 0;
  2754.             return(-1);
  2755.         }
  2756.     }
  2757.     position = n * DB_RECL;
  2758.     if (fseek(dbfp,position,0) < 0) {   /* Seek to desired slot */
  2759.         debug(F111,"updslot fseek failed",dbfile,mydbseek);
  2760.         ikdbopen = 0;
  2761.         rc = -1;
  2762.     } else {
  2763.         /* Update the update time */
  2764.         strncpy(&dbrec[dbfld[db_LASTU].off],
  2765.                 ckdate(),
  2766.                 dbfld[db_LASTU].len
  2767.                 );
  2768.         if (fwrite(dbrec,1,DB_RECL,dbfp) < DB_RECL) { /* Write the record */
  2769.             debug(F110,"updslot fwrite failed",dbfile,0);
  2770.             ikdbopen = 0;
  2771.             rc = -1;
  2772.         } else {                        /* Flush the write */
  2773.             fflush(dbfp);
  2774.         }
  2775.     }
  2776.     return(rc);
  2777. }
  2778. /*  I N I T S L O T --  Initialize slot n with my info  */
  2779. int
  2780. initslot(n) int n; {                    /* Initialize slot */
  2781.     int i, j, k;
  2782.     char * s;
  2783. #ifdef TCPSOCKET
  2784.     extern unsigned long peerxipaddr;
  2785. #endif /* TCPSOCKET */
  2786.     debug(F101,"initslot","",n);
  2787. #ifdef USE_MEMCPY
  2788.     memset(dbrec,32,DB_RECL);
  2789. #else
  2790.     for (i = 0; i < DB_RECL; i++)
  2791.       dbrec[i] = '40';
  2792. #endif /* USE_MEMCPY */
  2793.     myflags = DBF_INUSE;                /* Set in-use flag */
  2794.     mystate = W_NOTHING;
  2795.     myatype = 0L;
  2796.     myamode = 0L;
  2797.     k = dbfld[db_FLAGS].len;            /* Length of flags field */
  2798.     strncpy(&dbrec[dbfld[db_FLAGS].off],ulongtohex(myflags,k),k);
  2799.     k = dbfld[db_ATYPE].len;
  2800.     strncpy(&dbrec[dbfld[db_ATYPE].off],ulongtohex(myatype,k),k);
  2801.     k = dbfld[db_AMODE].len;
  2802.     strncpy(&dbrec[dbfld[db_AMODE].off],ulongtohex(myamode,k),k);
  2803.     k = dbfld[db_STATE].len;
  2804.     strncpy(&dbrec[dbfld[db_STATE].off],ulongtohex(mystate,k),k);
  2805.     k = dbfld[db_SADDR].len;
  2806.     strncpy(&dbrec[dbfld[db_SADDR].off],ulongtohex(myip,k),k);
  2807. #ifdef TCPSOCKET
  2808.     ckgetpeer();
  2809.     k = dbfld[db_CADDR].len;
  2810.     strncpy(&dbrec[dbfld[db_CADDR].off],ulongtohex(peerxipaddr,k),k);
  2811. #else
  2812.     k = dbfld[db_CADDR].len;
  2813.     strncpy(&dbrec[dbfld[db_CADDR].off],ulongtohex(0L,k),k);
  2814. #endif /* TCPSOCKET */
  2815.     k = dbfld[db_MYPID].len;
  2816.     strncpy(&dbrec[dbfld[db_MYPID].off],ulongtohex(mypid,k),k);
  2817.     k = dbfld[db_START].len;
  2818.     strncpy(&dbrec[dbfld[db_START].off],ckdate(),k);
  2819.     k = dbfld[db_ULEN].len;
  2820.     strncpy(&dbrec[dbfld[db_ULEN].off],"0000",4);
  2821.     k = dbfld[db_DLEN].len;
  2822.     strncpy(&dbrec[dbfld[db_DLEN].off],"0000",4);
  2823.     k = dbfld[db_ILEN].len;
  2824.     strncpy(&dbrec[dbfld[db_ILEN].off],"0000",4);
  2825.     strncpy(&dbrec[dbfld[db_INFO].off],"INIT",4);
  2826.     return(updslot(n));
  2827. }
  2828. int
  2829. slotstate(x,s1,s2,s3) int x; char *s1, *s2, *s3; {
  2830.     int k, l1, l2, l3, z;
  2831.     mystate = x;
  2832.     debug(F101,"slotstate ikdbopen","",ikdbopen);
  2833.     if (!ikdbopen)
  2834.       return(-1);
  2835.     if (!s1) s1 = "";
  2836.     l1 = strlen(s1);
  2837.     if (!s2) s2 = "";
  2838.     l2 = strlen(s2);
  2839.     if (!s3) s3 = "";
  2840.     l3 = strlen(s3);
  2841.     strncpy(&dbrec[DB_STATE],ulongtohex(mystate,4),4);
  2842.     k = dbfld[db_ILEN].len;
  2843.     z = l1 + l2 + l3 + 2;
  2844.     if (z > dB_INFO)
  2845.       z = dB_INFO;
  2846.     strncpy(&dbrec[DB_ILEN],ulongtohex((unsigned long)z,k),k);
  2847.     k = dbfld[db_INFO].len;
  2848.     z = dbfld[db_INFO].off;
  2849.     if (l1 <= k) {
  2850.         lset(&dbrec[z],s1,l1+1,32);
  2851.         z += l1+1;
  2852.         k -= l1+1;
  2853.         if (l2 <= k) {
  2854.             lset(&dbrec[z],s2,l2+1,32);
  2855.             z += l2+1;
  2856.             k -= l2+1;
  2857.             if (l3 <= k)
  2858.               lset(&dbrec[z],s3,k,32);
  2859.         }
  2860.     }
  2861. #ifdef DEBUG
  2862.     if (deblog) {
  2863.         char buf[128];
  2864.         int i;
  2865.         strncpy(buf,&dbrec[DB_INFO],127);
  2866.         buf[127] = NUL;
  2867.         for (i = 126; i > 0 && buf[i] == 32; i--) buf[i] = 0;
  2868.         debug(F111,"slotstate",buf,mystate);
  2869.     }
  2870. #endif /* DEBUG */
  2871.     z = updslot(mydbslot);
  2872.     debug(F111,"slotstate updslot","",z);
  2873.     return(z);
  2874. }
  2875. int
  2876. slotdir(s1,s2) char * s1, * s2; {       /* Update current directory */
  2877.     int k, len1, len2;
  2878.     if (!ikdbopen)
  2879.       return(-1);
  2880.     if (!s1) s1 = "";
  2881.     if (!s2) s2 = "";
  2882.     len1 = strlen(s1);
  2883.     len2 = strlen(s2);
  2884.     k = dbfld[db_DLEN].len;
  2885.     strncpy(&dbrec[DB_DLEN],ulongtohex((unsigned long)(len1+len2),k),k);
  2886.     k = dbfld[db_DIR].len;
  2887.     if (len1 > 0) {
  2888.         lset(&dbrec[dbfld[db_DIR].off],s1,len1,32);
  2889.         lset(&dbrec[dbfld[db_DIR].off+len1],s2,k-len1,32);
  2890.     } else {
  2891.         lset(&dbrec[dbfld[db_DIR].off],s2,k,32);
  2892.     }
  2893.     return(updslot(mydbslot));
  2894. }
  2895. /*  F R E E S L O T  --  Free slot n  */
  2896. int
  2897. freeslot(n) int n; {
  2898.     int k;
  2899.     if (!ikdbopen)
  2900.       return(0);
  2901.     dbflags = 0L;
  2902.     if (n == mydbslot) {
  2903.         dbflags = myflags & ~DBF_INUSE;
  2904.         dbflags &= ~DBF_LOGGED;
  2905.     }
  2906.     k = dbfld[db_FLAGS].len;
  2907.     strncpy(&dbrec[dbfld[db_FLAGS].off],ulongtohex(dbflags,k),k);
  2908.     return(updslot(n));
  2909. }
  2910. /*  G E T S L O T  --  Find a free database slot; returns slot number  */
  2911. int
  2912. getslot() {                             /* Find a free slot for us */
  2913.     FILE * rfp = NULL;                  /* Returns slot number (0, 1, ...) */
  2914.     char idstring[64];                  /* PID string buffer (decimal) */
  2915.     char pidbuf[64], * s;
  2916.     int j, k, n, x, rc = -1;
  2917.     int lockfd, tries, haveslot = 0;
  2918.     long lockpid, i;
  2919.     char ipbuf[17];
  2920.     if (!myhexip[0])                    /* Set my hex IP address if not set */
  2921.       ckstrncpy((char *)myhexip,"7F000001",33);
  2922.     sprintf(idstring,"%08lx:%010ldn",myip,mypid);
  2923.     debug(F110,"getslot idstring", idstring, 0);
  2924.     /* Make temporary lockfile name IP.PID (hex.hex) */
  2925.     /* This should fit in 14 chars -- huge PIDs are usually not possible */
  2926.     /* on 14-char filename systems. */
  2927.     sprintf(tmplck,"%s%08lx.%lx",dbdir,myip,mypid);
  2928.     debug(F110,"getslot tempfile",tmplck,0);
  2929.     /* Make a temporary file */
  2930.     lockfd = creat(tmplck, 0600);
  2931.     if (lockfd < 0) {
  2932.         debug(F111,"getslock temp lockfile create failure", tmplck, errno);
  2933.         return(-1);
  2934.     }
  2935.     /* Write my (decimal) PID into the temp file */
  2936.     write(lockfd,idstring,(int)strlen(idstring));
  2937.     if (close(lockfd) < 0) {            /* Close lockfile */
  2938.         debug(F101,"getslot error closing temp lockfile", "", errno);
  2939.         return(-1);
  2940.     }
  2941.     sprintf(lcknam,"%s%s",dbdir,IK_LOCKFILE); /* Build lockfile name */
  2942.     debug(F110,"getslot lockfile",lcknam,0);
  2943.     rfp = fopen(lcknam,"r");            /* See if lockfile exists */
  2944.     if (rfp) {                          /* If so... */
  2945.         int sameip = 0;
  2946.         rset(pidbuf,"",64,0);
  2947.         x = fread(pidbuf,1,63,rfp);     /* Read ID string from it */
  2948.         fclose(rfp);                    /* and close it quickly */
  2949.         debug(F110,"getslot lock exists",pidbuf,0);
  2950.         if (x > 0) {                    /* If we have a PID, check it */
  2951.             char * s = pidbuf;
  2952.             while (*s) {
  2953.                 if (islower(*s)) *s = toupper(*s);
  2954.                 if (*s == ':') {
  2955.                     *s = NUL;
  2956.                     debug(F110,"getslot lock IP",pidbuf,0);
  2957.                     debug(F110,"gteslot my   IP",myhexip,0);
  2958.                     if (!strcmp(pidbuf,myhexip)) { /* Same IP address? */
  2959.                         lockpid = atol(s+1); /* Yes, now get PID */
  2960.                         debug(F101,"getslot lockpid","",lockpid);
  2961.                         /* Check if PID lockpid on this computer is alive */
  2962.                         x = zchkpid(lockpid);
  2963.                         if (!x) {
  2964.                             debug(F100,"getslot PID stale,removing lock","",0);
  2965.                             unlink(lcknam);
  2966.                         }
  2967.                         break;
  2968.                     }
  2969.                 }
  2970.                 s++;
  2971.             }
  2972.         } else {
  2973.             debug(F111,"getslot lockfile open failure",lcknam,errno);
  2974.         }
  2975.     }
  2976.     /* Try IK_LCKTRIES (16) times to rename temp file to lockfile */
  2977.     for (tries = IK_LCKTRIES; tries > 0; tries--) {
  2978.         if (zrename(tmplck,lcknam) == 0)
  2979.           break;
  2980.         debug(F101,"getslot database locked by pid", "", dbpid);
  2981.         sleep(IK_LCKSLEEP);
  2982.     }
  2983.     if (tries < 1) {                    /* Couldn't */
  2984.         debug(F110,"getslot create lock failure",lcknam,0);
  2985.         return(-1);
  2986.     }
  2987.     /* Have lock, open database */
  2988.     debug(F110,"getslot has lock",lcknam,0); /* Have lock */
  2989.     if (!dbfile)
  2990.       return(-1);
  2991.     /* If database doesn't exist, create it. */
  2992.     debug(F110,"getslot dbfile",dbfile,0);
  2993.     if (zchki(dbfile) < 0) {
  2994.         debug(F110,"getslot creating new database",dbfile,0);
  2995.         x = creat(dbfile,0660);
  2996.         if (x < 0) {
  2997.             debug(F111,"getslot creat() failed", dbfile, errno);
  2998.             goto xslot;
  2999.         }
  3000.         close(x);
  3001.     }
  3002.     dbfp = fopen(dbfile,updmode);       /* Open it in update mode */
  3003.     if (!dbfp) {
  3004.         debug(F111,"getslot fopen failed",dbfile,errno);
  3005.         goto xslot;
  3006.     }
  3007.     /* Now find a free (or new) slot... */
  3008.     dblastused = 0L;                    /* Seek pointer to last record inuse */
  3009.     mydbseek = 0L;                      /* Seek pointer for my record */
  3010.     /* Quickly read the whole database; n = record counter, i = seek pointer */
  3011.     for (n = 0, i = 0; !feof(dbfp); i += DB_RECL, n++) {
  3012.         x = fread(dbrec,1,DB_RECL,dbfp); /* Read a record */
  3013.         if (x < 1)                      /* EOF not caught by feof() */
  3014.           break;
  3015. #ifndef NOFTRUNCATE
  3016.         if (x != DB_RECL) {             /* Watch out for trailing junk */
  3017.             debug(F101,"getslot bad size","",x);  /* (Shouldn't happen...) */
  3018. #ifdef COHERENT
  3019.             chsize(fileno(dbfp),i);
  3020. #else
  3021.             ftruncate(fileno(dbfp),i);
  3022. #endif /* COHERENT */
  3023.             x = 0;
  3024.             fseek(dbfp,i,0);
  3025.             break;
  3026.         }
  3027. #endif /* NOFTRUNCATE */
  3028.         debug(F101,"getslot record","",n);
  3029.         k = dbfld[db_FLAGS].off;
  3030.         j = dbfld[db_FLAGS].len;
  3031.         dbflags = hextoulong(&dbrec[k],j);
  3032.         debug(F001,"getslot dbflags","",dbflags);
  3033.         k = dbfld[db_MYPID].off;
  3034.         j = dbfld[db_MYPID].len;
  3035.         dbpid  = hextoulong(&dbrec[k],j);
  3036.         debug(F001,"getslot dbpid","",dbpid);
  3037.         k = dbfld[db_SADDR].off;
  3038.         j = dbfld[db_SADDR].len;
  3039.         dbip = hextoulong(&dbrec[k],j);
  3040.         debug(F001,"getslot dbip","",dbip);
  3041.         if (dbflags & DBF_INUSE) {      /* Remember last slot in use */
  3042.             x = 0;                      /* Make sure it's REALLY in use */
  3043.             if (dbpid == mypid && dbip == myip) { /* Check for PID == my PID */
  3044.                 x = 1;
  3045.                 debug(F101,"getslot record pid","",dbpid);
  3046.             } else {                    /* Or for stale PID */
  3047.                 x = zchkpid(dbpid);
  3048.                 debug(F101,"getslot zchkpid()","",x);
  3049.             }
  3050.             if (!x) {                   /* Bogus record */
  3051.                 x = freeslot(n);
  3052.                 debug(F101,"getslot stale record pid: freeslot()","",x);
  3053.                 if (x > -1 && !haveslot)
  3054.                   dbflags = 0;
  3055.             } else {                    /* It's really in use */
  3056.                 dblastused = i;
  3057.             }
  3058.         }
  3059.         if (!haveslot) {                /* If I don't have a slot yet */
  3060.             if (!(dbflags & DBF_INUSE)) {       /* Claim this one */
  3061.                 debug(F101,"getslot free slot", "", n);
  3062.                 haveslot = 1;
  3063.                 mydbseek = i;
  3064.                 mydbslot = n;           /* But keep going... */
  3065.             }
  3066.         }
  3067.     }
  3068.     /* Come here with i == seek pointer to first record after eof */
  3069.     if (!haveslot) {                    /* Found no free slot so add to end */
  3070.         debug(F101,"getslot new slot","",n);
  3071.         haveslot = 1;
  3072.         mydbseek = i;
  3073.         mydbslot = n;
  3074.     }
  3075.     ikdbopen = 1;                       /* OK to make database entries */
  3076.     debug(F101,"getslot records","",n);
  3077.     debug(F101,"getslot dblastused","",dblastused);
  3078.     debug(F101,"getslot i","",i);
  3079.     /* Trim stale records from end */
  3080. #ifndef NOFTRUNCATE
  3081.     if (i > dblastused+DB_RECL) {
  3082.         debug(F101,"getslot truncating at","",dblastused+DB_RECL);
  3083. #ifdef COHERENT
  3084.         x = chsize(fileno(dbfp),dblastused+DB_RECL);
  3085. #else
  3086.         x = ftruncate(fileno(dbfp),dblastused+DB_RECL);
  3087. #endif /* COHERENT */
  3088.         if (x < 0)                      /* (Not fatal) */
  3089.           debug(F101,"getslot ftruncate failed", "", errno);
  3090.     }
  3091. #endif /* NOFTRUNCATE */
  3092.     /* Initialize my record */
  3093.     if (initslot(mydbslot) < 0) {
  3094.         debug(F101,"getslot initslot() error","",n);
  3095.         ikdbopen = 0;
  3096.         goto xslot;
  3097.     }
  3098.     debug(F101,"getslot OK","",mydbslot);
  3099.     rc = mydbslot;                      /* OK return code */
  3100.   xslot:                                /* Unlock the database and return */
  3101.     if (unlink(lcknam) < 0) {
  3102.         debug(F111,"getslot lockfile removal failed",lcknam,errno);
  3103.         rc = -1;
  3104.     }
  3105.     return(rc);
  3106. }
  3107. #endif /* IKSDB */
  3108. #endif /* NOIKSD */