config.c
上传用户:tianjinjs
上传日期:2007-01-05
资源大小:309k
文件大小:50k
源码类别:

Modem编程

开发平台:

Unix_Linux

  1. /*
  2.  * config.c Read and write the configuration file(s).
  3.  *
  4.  *  $Id: config.c,v 1.2 1999/09/03 12:25:24 walker Exp $
  5.  *
  6.  * This file is part of the minicom communications package,
  7.  * Copyright 1991-1995 Miquel van Smoorenburg.
  8.  *
  9.  * This program is free software; you can redistribute it and/or
  10.  * modify it under the terms of the GNU General Public License
  11.  * as published by the Free Software Foundation; either version
  12.  * 2 of the License, or (at your option) any later version.
  13.  *
  14.  * // fmg 12/20/93 - Added color selection to Screen & Keyboard menu
  15.  * // fmg 2/15/94 - Added macro filename & Macro define selection to
  16.  *                  Screen & Keyboard menu. Added window for macro
  17.  *                  definition.
  18.  * // jl 04.09.97 - Added configuring the character conversion tables
  19.  * // jl 09.09.97 - Save conversion table filename in the config file and
  20.  *                  read the table at startup
  21.  * // jl 22.02.98 - Setting for filename selection window
  22.  * // acme 25.02.98 - i18n
  23.  * // jl 05.04.98 - Handling the P_MUL option
  24.  *    jl 06.07.98 - the P_CONVCAP option
  25.  *    jl 10.07.98 - moved functions pfix_home and do_log to file common.c
  26.  *    jl 29.11.98 - the P_SHOWSPD option
  27.  *    jl 05.04.99 - logging options menu
  28.  *    er 18-Apr-99 - the P_MULTILINE option
  29.  */
  30. #include "port.h"
  31. #include "minicom.h"
  32. #include "intl.h"
  33. void doconv();   /* jl 04.09.97 */
  34. /* Read in parameters. */
  35. void read_parms()
  36. {
  37.   FILE *fp;
  38.   int f;
  39.   char buf[64];
  40.   char *p;
  41.   /* Read global parameters */
  42.   if ((fp = fopen(parfile, "r")) == (FILE *)NULL) {
  43.    if (real_uid == 0) {
  44.    fputs(
  45.   _("minicom: WARNING: configuration file not found, using defaultsn"),stderr);
  46.    sleep(2);
  47.    return;
  48.    }
  49.    fprintf(stderr,
  50. _("minicom: there is no global configuration file %sn"), parfile);
  51.    fputs(_("Ask your sysadm to create one (with minicom -s).n"), stderr);
  52.    exit(1);
  53.   }
  54.   readpars(fp, 1);
  55.   fclose(fp);
  56.   /* Read personal parameters */
  57.   if ((fp = sfopen(pparfile, "r")) != (FILE *)NULL) {
  58. readpars(fp, 0);
  59. fclose(fp);
  60.   }
  61.   /* fmg - set colors from readin values (Jcolor Xlates name to #) */
  62.   mfcolor = Jcolor(P_MFG); mbcolor = Jcolor(P_MBG);
  63.   tfcolor = Jcolor(P_TFG); tbcolor = Jcolor(P_TBG);
  64.   sfcolor = Jcolor(P_SFG); sbcolor = Jcolor(P_SBG);
  65.  
  66. #if _HAVE_MACROS
  67.   /* fmg - Read personal macros */
  68.   if (P_MACROS[0] != 0) { /* fmg - null length? */
  69. if ((fp = sfopen(pfix_home(P_MACROS), "r")) == NULL) {
  70. if (errno != ENOENT) {
  71.                  fprintf(stderr,
  72.                 _("minicom: cannot open macro file %sn"), pfix_home(P_MACROS));
  73.                  sleep(1); /* fmg - give the "slow" ones time to read :-) */
  74. }
  75.         } else {
  76.                 readmacs(fp, 0);
  77.                 fclose(fp);
  78.         }
  79.   } /* fmg - but it's perfectly OK if macros file name is NULL... */
  80.   if (P_CONVF[0] != 0) { /* jl 09.09.97 */
  81.     loadconv(P_CONVF);
  82.   }
  83. #endif
  84.   /* This code is to use old configuration files. */
  85.   for(f = PROTO_BASE; f < MAXPROTO; f++) {
  86. if (P_PNAME(f)[0] && P_PIORED(f) != 'Y' && P_PIORED(f) != 'N') {
  87. strncpy(buf, P_PNAME(f) - 2, sizeof(buf));
  88. strcpy(P_PNAME(f), buf);
  89. P_PIORED(f) = 'Y';
  90. P_PFULL(f) = 'N';
  91. }
  92.   }
  93.   p = mbasename(P_LOCK);
  94.   if (strncmp(p, "LCK", 3) == 0) *p = 0;
  95. }
  96. /*
  97.  * fmg - Convert color word to number
  98.  */
  99. int Jcolor(s)
  100. char *s;
  101. {
  102.         char c1, c3;
  103.         c1 = toupper(s[0]); /* fmg - it's already up but why tempt it? */
  104.         c3 = toupper(s[2]);
  105.         switch (c1)
  106.         {
  107.                 case 'G'        : return (GREEN);
  108.                 case 'Y'        : return (YELLOW);
  109.                 case 'W'        : return (WHITE);
  110.                 case 'R'        : return (RED);
  111.                 case 'M'        : return (MAGENTA);
  112.                 case 'C'        : return (CYAN);
  113.                 case 'B'        : if (c3 == 'A')
  114.                                         return (BLACK);
  115.                                   if (c3 == 'U')
  116.                                         return (BLUE);
  117.                                   else
  118.                                         break;
  119.         }
  120.         return (-1); /* fmg - should never get here */
  121. }
  122.  
  123. /*
  124.  * See if we have write access to a file.
  125.  * If it is not there, see if the directory is writable.
  126.  */
  127. int waccess(s)
  128. char *s;
  129. {
  130.   char *p;
  131.   char buf[128];
  132.   struct stat stt;
  133.   /* We use stat instead of access(s, F_OK) because I couldn't get
  134.    * that to work under BSD 4.3 ...
  135.    */
  136.   if (stat(s, &stt) == 0) {
  137. if (access(s, W_OK) == 0)
  138. return(XA_OK_EXIST);
  139. return(-1);
  140.   }
  141.   strncpy(buf, s, sizeof(buf)-1);
  142.   buf[sizeof(buf)-1]=0;
  143.   if((p = strrchr(buf, '/')) == (char *)NULL)
  144.    strcpy(buf, ".");
  145.   else
  146.    *p = '';
  147.   if (access(buf, W_OK) == 0)
  148. return(XA_OK_NOTEXIST);
  149.   return(-1);
  150. }
  151. #if _HAVE_MACROS
  152. /*
  153.  * fmg - Read in a macro, but first check to see if it's
  154.  * allowed to do so.
  155.  *
  156.  * TODO: have System macros and user macros (in theory it's already there
  157.  * since user can specify their own macros file (unless root makes it
  158.  * private... that's silly) ... anyways, you know what I mean...)
  159.  */
  160. static void mgets(w, x, y, s, len, maxl)
  161. WIN *w;
  162. int x, y;
  163. char *s;
  164. int len;
  165. int maxl;
  166. {
  167.   struct macs *m = (struct macs *)s;
  168.   if ((m->flags & PRIVATE) && real_uid != 0) {
  169.         werror(_("You are not allowed to change this parameter"));
  170.         return;
  171.   }
  172.   wlocate(w, x, y);
  173.   (void) wgets(w, s, len, maxl);
  174.   m->flags |= CHANGED;
  175. }
  176. #endif
  177. /*
  178.  * Read in a string, but first check to see if it's
  179.  * allowed to do so.
  180.  */
  181. static void pgets(w, x, y, s, len, maxl)
  182. WIN *w;
  183. int x, y;
  184. char *s;
  185. int len;
  186. int maxl;
  187. {
  188.   struct pars *p = (struct pars *)s;
  189.   if ((p->flags & PRIVATE) && real_uid != 0) {
  190.    werror(_("You are not allowed to change this parameter"));
  191.    return;
  192.   }
  193.   wlocate(w, x, y);
  194.   (void) wgets(w, s, len, maxl);
  195.   p->flags |= CHANGED;
  196. }
  197. /*
  198.  * Mark a variable as changed.
  199.  */
  200. static void markch(s)
  201. char *s;
  202. {
  203.   struct pars *p = (struct pars *)s;
  204.   p->flags |= CHANGED;
  205. }
  206. /*
  207.  * Set a string to a given value, but only if we're allowed to.
  208.  */
  209. static void psets(s, w)
  210. char *s, *w;
  211. {
  212.   struct pars *p = (struct pars *)s;
  213.   if ((p->flags & PRIVATE) && real_uid != 0) {
  214.    werror(_("You are not allowed to change this parameter"));
  215.    return;
  216.   }
  217.   strcpy(s, w);
  218.   p->flags |= CHANGED;
  219. }
  220. /*
  221.  * Get a a character from the keyboard. Translate lower
  222.  * to uppercase and 'r' to 'n'.
  223.  */
  224. static int rwxgetch()
  225. {
  226.   int c;
  227.   c = wxgetch();
  228.   if (islower(c)) c = toupper(c);
  229.   if (c == 'n' || c == 'r' || c == '33') return('n');
  230.   return(c);
  231. }
  232. #ifdef LOGFILE
  233. static void dologopt()
  234. {
  235.   WIN *w;
  236.   int c;
  237.   char *logfnstr = _(" A - File name (empty=disable) :"),
  238.        *logconn  = _(" B - Log connects and hangups  :"),
  239.        *logxfer  = _(" C - Log file transfers        :"),
  240.        *question = _("Change which setting?");
  241.   w = wopen(5, 4, 75, 8, BDOUBLE, stdattr, mfcolor, mbcolor, 0, 0, 1);
  242.   wtitle(w, TMID, _("Logging options"));
  243.   wprintf(w, "%s %sn", logfnstr, P_LOGFNAME);
  244.   wprintf(w, "%s %sn", logconn, _(P_LOGCONN));
  245.   wprintf(w, "%s %sn", logxfer, _(P_LOGXFER));
  246.   wlocate(w, 4, 4);
  247.   wputs(w, question);
  248.   wredraw(w, 1);
  249.   while(1) {
  250.     wlocate(w, strlen(question) + 5, 5);
  251.     c = rwxgetch();
  252.     switch(c) {
  253.       case 'n':
  254. wclose(w, 1);
  255. return;
  256.       case 'A':
  257. pgets(w, strlen(logfnstr) + 1, 0,
  258.       P_LOGFNAME, PARS_VAL_LEN, PARS_VAL_LEN);
  259. strcpy(logfname,P_LOGFNAME);
  260. break;
  261.       case 'B':
  262. strcpy(P_LOGCONN, yesno(P_LOGCONN[0] == 'N'));
  263. wlocate(w, strlen(logconn) + 1, 1);
  264. wprintf(w, "%s  ", _(P_LOGCONN));
  265. markch(P_LOGCONN);
  266. break;
  267.       case 'C':
  268. strcpy(P_LOGXFER, yesno(P_LOGXFER[0] == 'N'));
  269. wlocate(w, strlen(logxfer) + 1, 2);
  270. wprintf(w, "%s  ", _(P_LOGXFER));
  271. markch(P_LOGXFER);
  272. break;
  273.       default:
  274. break;
  275.     }
  276.   }
  277. }
  278. #endif
  279. static void dopath()
  280. {
  281.   WIN *w;
  282.   int c;
  283.   char* download_directory = _(" A - Download directory :"),
  284.       * upload_directory = _(" B - Upload directory   :"),
  285.       * script_directory = _(" C - Script directory   :"),
  286.       * script_program = _(" D - Script program     :"),
  287.       * kermit_program = _(" E - Kermit program     :"),
  288.       * log_settings   = _(" F - Logging options"),
  289.       * question = _("Change which setting?");
  290.   
  291.   w = wopen(5, 5, 75, 12, BDOUBLE, stdattr, mfcolor, mbcolor, 0, 0, 1);
  292.   wprintf(w, "%s %.44sn", download_directory, P_DOWNDIR);
  293.   wprintf(w, "%s %.44sn", upload_directory, P_UPDIR);
  294.   wprintf(w, "%s %.44sn", script_directory, P_SCRIPTDIR);
  295.   wprintf(w, "%s %.44sn", script_program, P_SCRIPTPROG);
  296.   wprintf(w, "%s %.44sn", kermit_program, P_KERMIT);
  297. #ifdef LOGFILE
  298.   wprintf(w, "%sn", log_settings);
  299. #endif
  300.   wlocate(w, 4, 8);
  301.   wputs(w, question);
  302.   wredraw(w, 1);
  303.   while(1) {
  304.       wlocate(w, strlen (question) + 5, 8);
  305.       c = rwxgetch();
  306.       switch(c) {
  307.    case 'n':
  308.    wclose(w, 1);
  309.    return;
  310.    case 'A':
  311.    pgets(w, strlen (download_directory) + 1, 0, P_DOWNDIR, 64, 64);
  312.    break;
  313.    case 'B':
  314.    pgets(w, strlen (upload_directory) + 1, 1, P_UPDIR, 64, 64);
  315.    break;
  316.    case 'C':
  317.    pgets(w, strlen (script_directory) + 1, 2, P_SCRIPTDIR, 64, 64);
  318.    break;
  319.    case 'D':
  320.    pgets(w, strlen (script_program) + 1, 3, P_SCRIPTPROG, 64, 64);
  321.    break;
  322.    case 'E':
  323.    pgets(w, strlen (kermit_program) + 1, 4, P_KERMIT, 64, 64);
  324.    break;
  325. #ifdef LOGFILE
  326.    case 'F':
  327. dologopt();
  328. break;  
  329. #endif
  330.    default:
  331.    break;
  332.       }
  333.   }
  334. }
  335. char *yesno(k)
  336. int k;
  337. {
  338.   return(k ? N_("Yes") : N_("No "));
  339. }
  340. /*
  341.  * Input the definition of an up/download protocol.
  342.  */
  343. static void inputproto(w, n)
  344. WIN *w;
  345. int n;
  346. {
  347.   int c = 0;
  348.   mpars[PROTO_BASE + n].flags |= CHANGED;
  349.   if (P_PNAME(n)[0] == '') {
  350.    P_PNN(n) = 'Y';
  351.    P_PUD(n) = 'U';
  352. P_PFULL(n) = 'N';
  353. P_PPROG(n)[0] = 0;
  354. P_PIORED(n) = 'Y';
  355.    wlocate(w, 4, n+1);
  356.    wputs(w, "       ");
  357.   }
  358.   wlocate(w, 4, n+1);
  359.   (void ) wgets(w, P_PNAME(n), 10, 64);
  360.   pgets(w, 15, n+1, P_PPROG(n), 31, 64);
  361.   do {
  362. wlocate(w, 47, n+1);
  363. wprintf(w, "%c", P_PNN(n));
  364. c = rwxgetch();
  365. if (c == 'Y') P_PNN(n) = 'Y';
  366. if (c == 'N') P_PNN(n) = 'N';
  367.   } while(c != 'r' && c != 'n');
  368.   do {
  369. wlocate(w, 52, n+1);
  370. wprintf(w, "%c", P_PUD(n));
  371. c = rwxgetch();
  372. if (c == 'U') P_PUD(n) = 'U';
  373. if (c == 'D') P_PUD(n) = 'D';
  374.   } while(c != 'r' && c != 'n');
  375.   do {
  376. wlocate(w, 57, n+1);
  377. wprintf(w, "%c", P_PFULL(n));
  378. c = rwxgetch();
  379. if (c == 'Y') P_PFULL(n) = 'Y';
  380. if (c == 'N') P_PFULL(n) = 'N';
  381.   } while(c != 'r' && c != 'n');
  382.   do {
  383. wlocate(w, 65, n+1);
  384. wprintf(w, "%c", P_PIORED(n));
  385. c = rwxgetch();
  386. if (c == 'Y') P_PIORED(n) = 'Y';
  387. if (c == 'N') P_PIORED(n) = 'N';
  388.   } while(c != 'r' && c != 'n');
  389.   do {
  390.      wlocate(w, 73, n+1);
  391. wprintf(w, "%c", P_MUL(n));
  392. c = rwxgetch();
  393. if (c == 'Y') P_MUL(n) = 'Y';
  394. if (c == 'N') P_MUL(n) = 'N';
  395.   } while (c != 'r' && c != 'n');
  396. }
  397. static void doproto()
  398. {
  399.   WIN *w;
  400.   int f, c;
  401.   char* zmodem_download = _("M  Zmodem download string activates..."),
  402.       * use_filename_selection = _("N  Use filename selection window......"),
  403.       * prompt_downdir =         _("O  Prompt for download directory......"),
  404.       * question = _("Change which setting? (SPACE to delete)");
  405.   w = wopen(1, 3, 78, 20, BDOUBLE, stdattr, mfcolor, mbcolor, 0, 0, 1);
  406.   wputs(w, _("     Name             Program"));
  407.   wlocate(w, 46, 0);
  408.   wputs(w, _("Name U/D FullScr IO-Red. Multi"));
  409.   for(f = 0; f < 12; f++) {
  410.      wlocate(w, 1, f+1);
  411.      if (P_PNAME(f)[0])
  412.    wprintf(w, "%c  %-10.10s %-31.31s %c    %c    %c       %c       %c",
  413. 'A' + f,
  414.    P_PNAME(f), P_PPROG(f),
  415.    P_PNN(f), P_PUD(f),
  416. P_PFULL(f), P_PIORED(f),
  417.    P_MUL(f));
  418.      else
  419.         wprintf(w, "%c    -", 'A' + f);
  420.   }
  421.   wlocate(w, 1, 13);
  422.   wprintf(w, "%s %c", zmodem_download, P_PAUTO[0]);
  423.   wlocate(w, 1, 14);
  424.   wprintf(w, "%s %s", use_filename_selection, _(P_FSELW));
  425.   wlocate(w, 1, 15);
  426.   wprintf(w, "%s %s", prompt_downdir, _(P_ASKDNDIR));
  427.   wlocate(w, 3, 17);
  428.   wputs(w, question);
  429.   wredraw(w, 1);
  430.   do {
  431.    wlocate(w, strlen (question) + 4, 17);
  432.    c = rwxgetch();
  433.    if (c >= 'A' && c <= 'L') inputproto(w, c - 'A');
  434.    if (c == ' ') {
  435.    wlocate(w, 3, 17);
  436.    wputs(w, _("Delete which protocol? "));
  437.    wclreol(w);
  438.    c = rwxgetch();
  439.    if (c >= 'A' && c <= 'L') {
  440.    P_PNAME(c - 'A')[0] = '';
  441.    mpars[PROTO_BASE + (c - 'A')].flags |= CHANGED;
  442.    wlocate(w, 3, c - 'A' + 1);
  443.    wclreol(w);
  444.    wputs(w, "   -");
  445.    }
  446. wlocate(w, 3, 17);
  447. wputs(w, question);
  448. c = ' ';
  449. }
  450. else if (c == 'M') {
  451. wlocate(w, strlen (zmodem_download) + 2, 13);
  452. wprintf(w, " b");
  453. c = rwxgetch();
  454. if (c >= 'A' && c <= 'L') {
  455. P_PAUTO[0] = c;
  456. markch(P_PAUTO);
  457. wprintf(w, "%c", c);
  458. } else if (c == 'n' || c == ' ') {
  459. P_PAUTO[0] = ' ';
  460. markch(P_PAUTO);
  461. } else {
  462. wprintf(w, "%c", P_PAUTO[0]);
  463. }
  464. c = 0;
  465. }
  466. else if (c == 'N') {
  467. strcpy(P_FSELW, yesno(P_FSELW[0] == 'N'));
  468. if (P_FSELW[0] == 'N') {
  469.   strcpy(P_ASKDNDIR, "No ");
  470.   wlocate(w, strlen (prompt_downdir) + 2, 15);
  471.   wprintf(w, "%s ", _(P_ASKDNDIR));
  472.   markch(P_ASKDNDIR);
  473. }
  474. wlocate(w, strlen (use_filename_selection) + 2, 14);
  475. wprintf(w, "%s ", _(P_FSELW));
  476. markch(P_FSELW);
  477. }
  478. else if (c == 'O') {
  479.    strcpy(P_ASKDNDIR, yesno(P_ASKDNDIR[0] == 'N'));
  480. if (P_ASKDNDIR[0] == 'Y') {
  481.   strcpy(P_FSELW, "Yes");
  482.   wlocate(w, strlen (use_filename_selection) + 2, 14);
  483.   wprintf(w, "%s ", _(P_FSELW));
  484.   markch(P_FSELW);
  485. }
  486. wlocate(w, strlen (prompt_downdir) + 2, 15);
  487. wprintf(w, "%s ", _(P_ASKDNDIR));
  488. markch(P_ASKDNDIR);
  489. }
  490.   } while(c != 'n');
  491.   wclose(w, 1);
  492. }
  493. static void doserial()
  494. {
  495.   WIN *w;
  496.   char* serial_device = _(" A -    Serial Device      :"),
  497.       * lockfile_location = _(" B - Lockfile Location     :"),
  498.       * callin_program = _(" C -   Callin Program      :"),
  499.       * callout_program = _(" D -  Callout Program      :"),
  500.       * bps_par_bits = _(" E -    Bps/Par/Bits       :"),
  501.       * hardware_flow_control = _(" F - Hardware Flow Control :"),
  502.       * software_flow_control = _(" G - Software Flow Control :"),
  503.       * question = _("Change which setting?");
  504.   w = wopen(5, 4, 75, 12, BDOUBLE, stdattr, mfcolor, mbcolor, 0, 0, 1);
  505.   wprintf(w, "%s %.41sn", serial_device, P_PORT);
  506.   wprintf(w, "%s %.41sn", lockfile_location, P_LOCK);
  507.   wprintf(w, "%s %.41sn", callin_program, P_CALLIN);
  508.   wprintf(w, "%s %.41sn", callout_program, P_CALLOUT);
  509.   wprintf(w, "%s %s %s%s1n", bps_par_bits, P_BAUDRATE, P_BITS, P_PARITY);
  510.   wprintf(w, "%s %sn", hardware_flow_control, _(P_HASRTS));
  511.   wprintf(w, "%s %sn", software_flow_control, _(P_HASXON));
  512.   wlocate(w, 4, 8);
  513.   wputs(w, question);
  514.   wredraw(w, 1);
  515.   while(1) {
  516.       wlocate(w, strlen (question) + 5, 8);
  517.       switch(rwxgetch()) {
  518.    case 'n':
  519.    wclose(w, 1);
  520.    return;
  521.    case 'A':
  522.    pgets(w, strlen (serial_device) + 1, 0, P_PORT, 64, 64);
  523.    break;
  524.    case 'B':
  525.    pgets(w, strlen (lockfile_location) + 1, 1, P_LOCK, 64, 64);
  526.    break;
  527.    case 'C':
  528.    pgets(w, strlen (callin_program) + 1, 2, P_CALLIN, 64, 64);
  529.    break;
  530.    case 'D':
  531.    pgets(w, strlen (callout_program) + 1, 3, P_CALLOUT, 64, 64);
  532.    break;
  533.    case 'E':
  534.    get_bbp(P_BAUDRATE, P_BITS, P_PARITY, 0);
  535.    if (portfd >= 0) port_init();
  536.    wlocate(w, strlen (bps_par_bits) + 1, 4);
  537. wprintf(w, "%s %s%s1  n", P_BAUDRATE, P_BITS, P_PARITY);
  538. if (st != NIL_WIN) mode_status();
  539. markch(P_BAUDRATE);
  540. markch(P_BITS);
  541. markch(P_PARITY);
  542. break;
  543. case 'F':
  544. strcpy(P_HASRTS, yesno(P_HASRTS[0] == 'N'));
  545. wlocate(w, strlen (hardware_flow_control) + 1, 5);
  546. wprintf(w, "%s ", _(P_HASRTS));
  547.    if (portfd >= 0) port_init();
  548. markch(P_HASRTS);
  549. break;
  550. case 'G':
  551. strcpy(P_HASXON, yesno(P_HASXON[0] == 'N'));
  552. wlocate(w, strlen (software_flow_control) + 1, 6);
  553. wprintf(w, "%s ", _(P_HASXON));
  554.    if (portfd >= 0) port_init();
  555. markch(P_HASXON);
  556. break;
  557.    default:
  558.    break;
  559.       }
  560.   }
  561. }
  562. char * sspd(char *sptyp)
  563. {
  564.   if (sptyp[0] == 'd')
  565.     return (_("DTE speed "));
  566.   else
  567.     return (_("line speed"));
  568. }
  569. static void domodem()
  570. {
  571.   WIN *w;
  572.   char *str;
  573.   int c, x, y, ypos, maxl, string_size;
  574.   char* init_string = _(" A - Init string ........."),
  575.       * reset_string = _(" B - Reset string ........"),
  576.       * dialing_prefix_1 = _(" C - Dialing prefix #1...."),
  577.       * dialing_suffix_1 = _(" D - Dialing suffix #1...."),
  578.       * dialing_prefix_2 = _(" E - Dialing prefix #2...."),
  579.       * dialing_suffix_2 = _(" F - Dialing suffix #2...."),
  580.       * dialing_prefix_3 = _(" G - Dialing prefix #3...."),
  581.       * dialing_suffix_3 = _(" H - Dialing suffix #3...."),
  582.       * connect_string = _(" I - Connect string ......"),
  583.       * no_connect_strings = _(" J - No connect strings .."),
  584.       * hangup_string = _(" K - Hang-up string ......"),
  585.       * dial_cancel_string = _(" L - Dial cancel string .."),
  586.       * dial_time = _(" M - Dial time ..........."),
  587.       * delay_before_redial = _(" N - Delay before redial ."),
  588.       * number_of_tries = _(" O - Number of tries ....."),
  589.       * dtr_drop_time = _(" P - DTR drop time (0=no)."),
  590.       * auto_bps_detect = _(" Q - Auto bps detect ....."),
  591.       * modem_has_dcd_line = _(" R - Modem has DCD line .."),
  592.       * shown_speed = _(" S - Status line shows ..."),
  593.       * multi_node = _(" T - Multi-line untag ...."),
  594.       * question = _("Change which setting?");
  595.   w = wopen(2, 2, 77, 22, BDOUBLE, stdattr, mfcolor, mbcolor, 0, 0, 1);
  596.   dirflush = 0;
  597.   wtitle(w, TMID, _("Modem and dialing parameter setup"));
  598.   wprintf(w, "n");
  599.   wprintf(w, "%s %.48sn", init_string, P_MINIT);
  600.   wprintf(w, "%s %.48sn", reset_string, P_MRESET);
  601.   wprintf(w, "%s %.48sn", dialing_prefix_1, P_MDIALPRE);
  602.   wprintf(w, "%s %.48sn", dialing_suffix_1, P_MDIALSUF);
  603.   wprintf(w, "%s %.48sn", dialing_prefix_2, P_MDIALPRE2);
  604.   wprintf(w, "%s %.48sn", dialing_suffix_2, P_MDIALSUF2);
  605.   wprintf(w, "%s %.48sn", dialing_prefix_3, P_MDIALPRE3);
  606.   wprintf(w, "%s %.48sn", dialing_suffix_3, P_MDIALSUF3);
  607.   wprintf(w, "%s %.48sn", connect_string, P_MCONNECT);
  608.   wprintf(w, "%s %-20.20s  %.20sn", no_connect_strings, P_MNOCON1, P_MNOCON2);
  609.   wlocate(w, strlen (no_connect_strings) + 1, 11);
  610.   wprintf(w, "%-20.20s  %.20sn", P_MNOCON3, P_MNOCON4);
  611.   wprintf(w, "%s %.48sn", hangup_string, P_MHANGUP);
  612.   wprintf(w, "%s %.48sn", dial_cancel_string, P_MDIALCAN);
  613.   wprintf(w, "n");
  614.   wprintf(w, "%s %.3sn", dial_time, P_MDIALTIME);
  615.   wprintf(w, "%s %.3sn", delay_before_redial, P_MRDELAY);
  616.   wprintf(w, "%s %.3sn", number_of_tries, P_MRETRIES);
  617.   wprintf(w, "%s %.3sn", dtr_drop_time, P_MDROPDTR);
  618.   wlocate(w, 34, 15);
  619.   wprintf(w, "%s %sn", auto_bps_detect, _(P_MAUTOBAUD));
  620.   wlocate(w, 34, 16);
  621.   wprintf(w, "%s %sn", modem_has_dcd_line, _(P_HASDCD));
  622.   wlocate(w, 34, 17);
  623.   wprintf(w, "%s %sn", shown_speed, sspd(P_SHOWSPD));
  624.   wlocate(w, 34, 18); /* Option for multi-node untag */
  625.   wprintf(w, "%s %sn", multi_node, _(P_MULTILINE)); /* er 18-Apr-99 */
  626.   wlocate(w, 1, 20);
  627.   wprintf(w, "%s ", question);
  628.   x = w->curx; y = w->cury;
  629.   wprintf(w, _("      (Return or Esc to exit)"));
  630.   wredraw(w, 1);
  631.   while(1) {
  632.    wlocate(w, x, y);
  633.    wflush();
  634.    c = rwxgetch();
  635.    ypos = 1;
  636. maxl = 64;
  637. string_size = 0;
  638.    switch(c) {
  639.    case 'M':
  640. if (string_size == 0)
  641.   string_size = strlen (dial_time);
  642.    case 'N':
  643. if (string_size == 0)
  644.   string_size = strlen (delay_before_redial);
  645.    case 'O':
  646. if (string_size == 0)
  647.   string_size = strlen (number_of_tries);
  648.      case 'P':
  649. if (string_size == 0)
  650.   string_size = strlen (dtr_drop_time);
  651.   
  652.    ypos++;
  653. maxl = 4;
  654.    case 'K':
  655. if (string_size == 0)
  656.   string_size = strlen (hangup_string);
  657.    case 'L':
  658. if (string_size == 0)
  659.   string_size = strlen (dial_cancel_string);
  660.    ypos -= 2;
  661.    c += 3;
  662.    case 'A':
  663. if (string_size == 0)
  664.   string_size = strlen (init_string);
  665.    case 'B':
  666. if (string_size == 0)
  667.   string_size = strlen (reset_string);
  668.    case 'C':
  669. if (string_size == 0)
  670.   string_size = strlen (dialing_prefix_1);
  671.    case 'D':
  672. if (string_size == 0)
  673.   string_size = strlen (dialing_suffix_1);
  674.    case 'E':
  675. if (string_size == 0)
  676.   string_size = strlen (dialing_prefix_2);
  677. case 'F':
  678. if (string_size == 0)
  679.   string_size = strlen (dialing_suffix_2);
  680. case 'G':
  681. if (string_size == 0)
  682.   string_size = strlen (dialing_prefix_3);
  683. case 'H':
  684. if (string_size == 0)
  685.   string_size = strlen (dialing_suffix_3);
  686. case 'I':
  687. if (string_size == 0)
  688.   string_size = strlen (connect_string);
  689.    /* Calculate adress of string tomodify */
  690.    str = P_MINIT + (c - 'A') * sizeof(struct pars);
  691.    pgets(w, string_size + 1, ypos + (c - 'A'), str, maxl, maxl);
  692.    break;
  693.    case 'J':
  694.         string_size = strlen (no_connect_strings);
  695.    /* Walk through all four */
  696.    pgets(w, string_size + 1, 10, P_MNOCON1, 20, 64);
  697.    pgets(w, string_size + 1 + 22, 10, P_MNOCON2, 20, 64);
  698.    pgets(w, string_size + 1 , 11, P_MNOCON3, 20, 64);
  699.    pgets(w, string_size + 1 + 22, 11, P_MNOCON4, 20, 64);
  700.    break;
  701.    case 'Q':
  702.    psets(P_MAUTOBAUD, yesno(P_MAUTOBAUD[0] == 'N'));
  703.    wlocate(w, 35 + strlen (auto_bps_detect), 15);
  704.    wputs(w, _(P_MAUTOBAUD));
  705.    break;
  706.    case 'R':
  707.    psets(P_HASDCD, yesno(P_HASDCD[0] == 'N'));
  708.    wlocate(w, 35 + strlen (modem_has_dcd_line), 16);
  709.    wputs(w, _(P_HASDCD));
  710.    break;
  711. case 'S':
  712. psets(P_SHOWSPD, P_SHOWSPD[0] == 'd' ? "l": "d");
  713. wlocate(w, 35 + strlen (shown_speed), 17);
  714. wputs(w, sspd(P_SHOWSPD));
  715. mode_status();
  716. break;
  717. case 'T': /* Update for multi-node */
  718. psets(P_MULTILINE, yesno(P_MULTILINE[0] == 'N' ));
  719. wlocate(w, 35 + strlen(multi_node), 18);
  720. wputs(w, _(P_MULTILINE));
  721. break;
  722. /* er 18-Apr-99 */
  723. case 'n':
  724.    dirflush = 1;
  725.    wclose(w, 1);
  726.    return;
  727.    default:
  728.    break;
  729.    }
  730.   }
  731. }
  732. /*
  733.  * Screen and keyboard menu.
  734.  */
  735. static void doscrkeyb()
  736. {
  737.   WIN *w, *w1;
  738.   int c;
  739.   int once = 0;
  740.   int clr = 1;
  741.   int tmp_c;    /* fmg - need it to color keep in sanity checks */
  742.   char buf[16];
  743.   int miny = 4, 
  744.   maxy = 17;
  745.   int old_stat = P_STATLINE[0];
  746.   char* command_key = _(" A - Command key is         :"),
  747.       * backspace_key = _(" B - Backspace key sends    :"),
  748.       * status_line = _(" C - Status line is         :"),
  749.       * alarm_sound = _(" D - Alarm sound            :"),
  750.       * foreground_color_menu = _(" E - Foreground Color (menu):"),
  751.       * background_color_menu = _(" F - Background Color (menu):"),
  752.       * foreground_color_term = _(" G - Foreground Color (term):"),
  753.       * background_color_term = _(" H - Background Color (term):"),
  754.       * foreground_color_stat = _(" I - Foreground Color (stat):"),
  755.       * background_color_stat = _(" J - Background Color (stat):"),
  756.       * history_buffer_size = _(" K - History Buffer Size    :"),
  757.       * macros_file = _(" L - Macros file            :"),
  758.       * macros_enabled = _(" N - Macros enabled         :"),
  759.       * character_conversion = _(" O - Character conversion   :"),
  760.       * question = _("Change which setting?  (Esc to exit)");
  761. #if _HAVE_MACROS
  762.   FILE *fp;
  763.   miny = 3;
  764.   maxy = 20;
  765. #endif
  766.   w = wopen(15, miny, 69, maxy, BDOUBLE, stdattr, mfcolor, mbcolor, 0, 0, 1);
  767.   wtitle(w, TMID, _("Screen and keyboard"));
  768.   wprintf(w, "n%s %sn", command_key, P_ESCAPE);
  769.   wprintf(w, "%s %sn", backspace_key, P_BACKSPACE);
  770.   wprintf(w, "%s %sn", status_line, _(P_STATLINE));
  771.   wprintf(w, "%s %sn", alarm_sound, _(P_SOUND));
  772.   /* fmg - colors support */
  773.   wprintf(w, "%s %sn", foreground_color_menu, _(J_col[mfcolor]));
  774.   wprintf(w, "%s %sn", background_color_menu, _(J_col[mbcolor]));
  775.   wprintf(w, "%s %sn", foreground_color_term, _(J_col[tfcolor]));
  776.   wprintf(w, "%s %sn", background_color_term, _(J_col[tbcolor]));
  777.   wprintf(w, "%s %sn", foreground_color_stat, _(J_col[sfcolor]));
  778.   wprintf(w, "%s %sn", background_color_stat, _(J_col[sbcolor]));
  779.   
  780.   /* MARK updated 02/17/95 - Configurable history buffer size */
  781.   wprintf(w, "%s %sn", history_buffer_size, P_HISTSIZE);
  782. #if _HAVE_MACROS
  783.   /* fmg - macros support */
  784.   wprintf(w, "%s %sn", macros_file, P_MACROS);
  785.   wprintf(w, _(" M - Edit Macrosn"));
  786.   wprintf(w, "%s %sn", macros_enabled, _(P_MACENAB));
  787.   wprintf(w, "%s %sn", character_conversion, P_CONVF);
  788. #endif
  789.   wredraw(w, 1);
  790.   while(1) {
  791.    if (clr) {
  792.    wlocate(w, 2, maxy - miny);
  793. wprintf(w, "%s ", question);
  794. wclreol(w);
  795. clr = 0;
  796. } else
  797.    wlocate(w, strlen (question) + 3, maxy - miny);
  798.    if (once) { /* fmg - allow to force looping */
  799.    c = once;
  800.    once = 0;
  801. } else c = rwxgetch();
  802. #if 0 /* This might save us someday */
  803. if (!usecolor && (c >= 'E' && c <= 'J')) {
  804. werror(_("You can't change colors in black and white mode"));
  805. continue;
  806. }
  807. #endif
  808.    switch(c) {
  809.    case 'n':
  810.                  /* fmg - sanity checks... "we found the enemy and he is us" :-) */
  811.                  if (mfcolor == mbcolor)   /* oops... */
  812.                  {
  813.                     tmp_c=mfcolor;      /* save color (same for both, right?) */
  814.                     mfcolor=WHITE;      /* make sure they can see error :-) */
  815.                     mbcolor=BLACK;
  816.                     werror(_("Menu foreground == background color, change!"));
  817.                     mfcolor=tmp_c;      /* restore colors */
  818.                     mbcolor=tmp_c;
  819.                     break;
  820.                  }
  821.                  if (tfcolor == tbcolor)   /* oops... */
  822.                  {
  823.                     tmp_c=mfcolor;      /* save color (same for both, right?) */
  824.                     mfcolor=WHITE;      /* make sure they can see error :-) */
  825.                     mbcolor=BLACK;
  826.                     werror(_("Terminal foreground == background color, change!"));
  827.                     mfcolor=tmp_c;      /* restore colors */
  828.                     mbcolor=tmp_c;
  829.                     break;
  830.                  }
  831.                  /* fmg - I'll let them change sfcolor=sbcolor because it's just
  832.                           another way of turning "off" the status line... */
  833. /* MARK updated 02/17/95, Warn user to restart */
  834. /* minicom if they changed history buffer size */
  835. if (atoi(P_HISTSIZE) != num_hist_lines) {
  836. w1 = wopen(14, 9, 70, 15, BSINGLE, stdattr, mfcolor, mbcolor, 0, 0, 1);
  837. wtitle(w1, TMID, _("History Buffer Size"));
  838. wputs(w1, _("n
  839.   You have changed the history buffer size.n
  840.   You will need to save the configuration file andn
  841.   restart minicom for the change to take effect.nn
  842.   Hit a key to Continue... "));
  843. wredraw(w1, 1);
  844. c = wxgetch();
  845. wclose(w1, 1);
  846. }
  847.    wclose(w, 1);
  848. /* If status line enabled/disabled resize screen. */
  849. if (P_STATLINE[0] != old_stat)
  850. init_emul(terminal, 0);
  851.    return;
  852.    case 'A':
  853.    w1 = wopen(11, 8, 73, 17, BSINGLE, stdattr, mfcolor, mbcolor, 0, 0, 1);
  854. wtitle(w1, TMID, _("Program new command key"));
  855. wputs(w1, _("n Press the new command key. If you want to usen"));
  856. wputs(w1, _(" the META or ALT key enter:nn"));
  857. wputs(w1, _("  o SPACE if your meta key sets the 8th bit highn"));
  858. wputs(w1, _("  o ESC   if your meta key sends the ESCAPE prefix (standard)n"));
  859. wputs(w1, _("nn Press new command key: "));
  860. wredraw(w1, 1);
  861. c = wxgetch();
  862. wclose(w1, 1);
  863.    if (c  == ' ')
  864.    strcpy(buf, N_("Meta-8th bit "));
  865.    else if (c == 27)
  866. strcpy(buf, N_("Escape (Meta)"));
  867. else
  868.    sprintf(buf, "^%c           ", (c & 0x1f) + 'A' - 1);
  869.    psets(P_ESCAPE, buf);
  870.    wlocate(w, strlen (command_key) + 1, 1);
  871.    wputs(w, _(buf));
  872.    clr = 1;
  873.    alt_override = 0;
  874. switch(P_ESCAPE[0]) {
  875. case '^':
  876. c = P_ESCAPE[1] & 31;
  877. break;
  878. case 'E':
  879. c = 27;
  880. break;
  881. default:
  882. c = 128;
  883. break;
  884. }
  885. keyboard(KSETESC, c);
  886.    if (st) show_status();
  887.    break;
  888.    case 'B':
  889.    if (P_BACKSPACE[0] == 'D')
  890.    psets(P_BACKSPACE, "BS");
  891.    else
  892.    psets(P_BACKSPACE, "DEL");
  893.    wlocate(w, strlen (backspace_key) + 1, 2);
  894.    wprintf(w, "%s ", P_BACKSPACE);
  895. keyboard(KSETBS, P_BACKSPACE[0] == 'B' ? 8 : 127);
  896.    break;
  897.    case 'C':
  898.    if (P_STATLINE[0] == 'e') {
  899.    psets(P_STATLINE, N_("disabled"));
  900.    tempst = 1;
  901.    } else {
  902.    psets(P_STATLINE, N_("enabled"));
  903.    /* See if it fits on screen */
  904.    if (LINES > 24) tempst = 0;
  905.    }
  906.    wlocate(w, strlen (status_line) + 1, 3);
  907.    wprintf(w, "%s ", _(P_STATLINE));
  908.    break;
  909. case 'D':
  910. psets(P_SOUND, yesno(P_SOUND[0] == 'N'));
  911. wlocate(w, strlen (alarm_sound) + 1, 4);
  912. wprintf(w, "%s", _(P_SOUND));
  913. break;
  914.                 case 'E': /* fmg - letters cycle colors */
  915.                         if (mfcolor == WHITE)
  916.                                 mfcolor = BLACK;
  917.                         else
  918.                                 mfcolor++;
  919.                         psets(P_MFG, J_col[mfcolor]);
  920.                         wlocate(w, strlen (foreground_color_menu) + 1, 5);
  921.                         wprintf(w, "%s   ", _(J_col[mfcolor]));
  922.                         break;
  923.                 case 'F': /* fmg - letters cycle colors */
  924.                         if (mbcolor == WHITE)
  925.                                 mbcolor = BLACK;
  926.                         else
  927.                                 mbcolor++;
  928.                         psets(P_MBG, J_col[mbcolor]);
  929.                         wlocate(w, strlen (background_color_menu) + 1, 6);
  930.                         wprintf(w, "%s   ", _(J_col[mbcolor]));
  931.                         break;
  932.                 case 'G': /* fmg - letters cycle colors */
  933.                         if (tfcolor == WHITE)
  934.                                 tfcolor = BLACK;
  935.                         else
  936.                                 tfcolor++;
  937.                         psets(P_TFG, J_col[tfcolor]);
  938.                         wlocate(w, strlen (foreground_color_term) + 1, 7);
  939.                         wprintf(w, "%s   ", _(J_col[tfcolor]));
  940. if (us) vt_pinit(us, tfcolor, tbcolor);
  941.                         break;
  942.                 case 'H': /* fmg - letters cycle colors */
  943.                         if (tbcolor == WHITE)
  944.                                 tbcolor = BLACK;
  945.                         else
  946.                                 tbcolor++;
  947.                         psets(P_TBG, J_col[tbcolor]);
  948.                         wlocate(w, strlen (background_color_term) + 1, 8);
  949.                         wprintf(w, "%s   ", _(J_col[tbcolor]));
  950. if (us) vt_pinit(us, tfcolor, tbcolor);
  951.                         break;
  952.                 case 'I': /* fmg - letters cycle colors & redraw stat line */
  953.                         if (sfcolor == WHITE)
  954.                                 sfcolor = BLACK;
  955.                         else
  956.                                 sfcolor++;
  957.                         /* fmg - this causes redraw of status line (if any)
  958.                                  in current color */
  959.                         if (st)
  960.                         {
  961.                                 wclose(st,0);
  962.                                 st = wopen(0, LINES - 1, COLS - 1, LINES - 1, BNONE,
  963.                                          XA_NORMAL, sfcolor, sbcolor, 1, 0, 1);
  964.                                 show_status();
  965.                         }
  966.                         psets(P_SFG, J_col[sfcolor]);
  967.                         wlocate(w, strlen (foreground_color_stat) + 1, 9);
  968.                         wprintf(w, "%s   ", _(J_col[sfcolor]));
  969.                         break;
  970.                 case 'J': /* fmg - letters cycle colors & redraw stat line */
  971.                         if (sbcolor == WHITE)
  972.                                 sbcolor = BLACK;
  973.                         else
  974.                                 sbcolor++;
  975.                         /* fmg - this causes redraw of status line (if any)
  976.                                  in current color */
  977.                         if (st)
  978.                         {
  979.                                 wclose(st,0);
  980.                                 st = wopen(0, LINES - 1, COLS - 1, LINES - 1, BNONE,
  981.                                          XA_NORMAL, sfcolor, sbcolor, 1, 0, 0);
  982.                                 show_status();
  983.                         }
  984.                         psets(P_SBG, J_col[sbcolor]);
  985.                         wlocate(w, strlen (background_color_stat) + 1, 10);
  986.                         wprintf(w, "%s   ", _(J_col[sbcolor]));
  987.                         break;
  988. case 'K': /* MARK updated 02/17/95 - Config history size */
  989. #if HISTORY
  990.    pgets(w, strlen (history_buffer_size) + 1, 11,
  991.       P_HISTSIZE, 5, 5);
  992.                         
  993.                         /* In case gibberish or a value was out of bounds, */
  994.                         /* limit history buffer size between 0 to 5000 lines */
  995.                         /* 5000 line history at 80 columns consumes about */
  996.                         /* 800 kilobytes including chars and attrs bytes! */
  997.                         if (atoi(P_HISTSIZE) <= 0) 
  998.                          strcpy(P_HISTSIZE,"0");
  999.                         else if (atoi(P_HISTSIZE) >= 5000)
  1000.                          strcpy(P_HISTSIZE,"5000");
  1001.                         
  1002.                         wlocate(w, strlen (history_buffer_size) + 1, 11);
  1003.                         wprintf(w, "%s     ", P_HISTSIZE);
  1004. #else
  1005. werror(_("This system does not support history"));
  1006. #endif
  1007. break;
  1008. #if _HAVE_MACROS
  1009.                 case 'L': /* fmg - get local macros storage file */
  1010.                         pgets(w, strlen (macros_file) + 1, 12, P_MACROS, 64, 64);
  1011. /* Try to open the file to read it in. */
  1012. fp = sfopen(pfix_home(P_MACROS), "r+");
  1013. if (fp == NULL) {
  1014.     if (errno == EPERM) {
  1015. /* Permission denied, hacker! */
  1016. werror(_("ERROR: you do not have permission to create a file there!"));
  1017. once = 'J'; /* fmg - re-enter it! */
  1018. continue;
  1019.     }
  1020.     if (errno != ENOENT) {
  1021. /* File does exist, but cannot be opened. */
  1022. werror(_("ERROR: cannot open macro file %s"),
  1023. pfix_home(P_MACROS));
  1024.     }
  1025.     continue;
  1026. }
  1027. /* Read macros from the file. */
  1028. werror(_("Reading macros"));
  1029. readmacs(fp, 0);
  1030. fclose(fp);
  1031.                         break;
  1032.                 case 'M': /* fmg - Bring up macro editing window */
  1033.                         domacros();
  1034.                         break;
  1035. case 'N':
  1036. psets(P_MACENAB, yesno(P_MACENAB[0] == 'N'));
  1037. wlocate(w, strlen (macros_enabled) + 1, 14);
  1038. wprintf(w, "%s", _(P_MACENAB));
  1039. break;
  1040.         case 'O': /* Character conversions - jl / 04.09.97 */
  1041.         doconv();
  1042. wlocate(w, strlen (character_conversion) + 1, 15);
  1043. wprintf(w, "%-16.16s", _(P_CONVF));
  1044. break;
  1045. #endif
  1046.    }
  1047.   }
  1048. }
  1049. /*
  1050.  * This is the 'T' menu - terminal parameters. Does NOT set the new
  1051.  * terminal type, but returns it to the calling functions that has
  1052.  * to call init_emul itself.
  1053.  */
  1054. int dotermmenu()
  1055. {
  1056.   WIN *w;
  1057.   int c;
  1058.   int new_term = -1;
  1059.   int old_stat = P_STATLINE[0];
  1060.   extern int use_status;
  1061.   char buf[8];
  1062.   extern int vt_nl_delay;
  1063.   char* terminal_emulation = _(" A - Terminal emulation  :"),
  1064.       * backspace_key_sends = _(" B - Backspace key sends :"),
  1065.       * status_line = _(" C -      Status line is :"),
  1066.       * msg_nl_delay = _(" D -  Newline delay (ms) :"),
  1067.       * question = _("Change which setting?");
  1068.   w = wopen(20, 7, 59, 14, BDOUBLE, stdattr, mfcolor, mbcolor, 0, 0, 1);
  1069.   wtitle(w, TMID, _("Terminal settings"));
  1070.   wprintf(w, "n");
  1071.   wprintf(w, "%s %sn", terminal_emulation, terminal == VT100 ? "VT102" : "ANSI");
  1072.   wprintf(w, "%s %sn", backspace_key_sends, P_BACKSPACE);
  1073.   wprintf(w, "%s %sn", status_line, _(P_STATLINE));
  1074.   wprintf(w, "%s %dn", msg_nl_delay, vt_nl_delay);
  1075.   wlocate(w, 4, 6);
  1076.   wputs(w, question);
  1077.   wredraw(w, 1);
  1078.   while(1) {
  1079.       wlocate(w, strlen (question) + 5, 6);
  1080.       c = rwxgetch();
  1081.       switch(c) {
  1082.    case 'n':
  1083.    wclose(w, 1);
  1084. /* If status line enabled/disabled resize screen. */
  1085. if (P_STATLINE[0] != old_stat && new_term < 0)
  1086. init_emul(terminal, 0);
  1087.    return(new_term);
  1088.    case 'A':
  1089. if (new_term < 0) new_term = terminal;
  1090. if (new_term == VT100) {
  1091. new_term = ANSI;
  1092.    psets(P_BACKSPACE, "BS");
  1093. } else {
  1094. new_term = VT100;
  1095.    psets(P_BACKSPACE, "DEL");
  1096. }
  1097. wlocate(w, strlen (terminal_emulation) + 1, 1);
  1098. wprintf(w, "%s ", new_term == VT100 ? "VT102" : "ANSI");
  1099.    wlocate(w, strlen (backspace_key_sends) + 1, 2);
  1100.    wprintf(w, "%s ", P_BACKSPACE);
  1101. keyboard(KSETBS, P_BACKSPACE[0] == 'B' ? 8 : 127);
  1102.    break;
  1103.    case 'B':
  1104.    if (P_BACKSPACE[0] == 'D')
  1105.    psets(P_BACKSPACE, "BS");
  1106.    else
  1107.    psets(P_BACKSPACE, "DEL");
  1108.    wlocate(w, strlen (backspace_key_sends) + 1, 2);
  1109.    wprintf(w, "%s ", P_BACKSPACE);
  1110. keyboard(KSETBS, P_BACKSPACE[0] == 'B' ? 8 : 127);
  1111.    break;
  1112.    case 'C':
  1113. if (P_STATLINE[0] == 'e') {
  1114. psets(P_STATLINE, N_("disabled"));
  1115. tempst = 1;
  1116. } else {
  1117. psets(P_STATLINE, N_("enabled"));
  1118. /* See if it fits on screen */
  1119. if (LINES > 24 || use_status)
  1120. tempst = 0;
  1121. }
  1122. wlocate(w, strlen (status_line) + 1, 3);
  1123. wprintf(w, "%s ", _(P_STATLINE));
  1124. break;
  1125. case 'D':
  1126. sprintf(buf, "%d", vt_nl_delay);
  1127. wlocate(w, strlen(msg_nl_delay) +1, 4);
  1128. wgets(w, buf, 4, 4);
  1129. vt_nl_delay = atoi(buf);
  1130. wlocate(w, strlen(msg_nl_delay) +1, 4);
  1131. wprintf(w, "%-3d", vt_nl_delay);
  1132. break;
  1133.    default:
  1134.    break;
  1135.       }
  1136.   }
  1137. }
  1138. /*
  1139.  * Save the configuration.
  1140.  */
  1141. void vdodflsave()
  1142. {
  1143. dodflsave();
  1144. }
  1145. /*
  1146.  * Save the configuration.
  1147.  */
  1148. int dodflsave()
  1149. {
  1150.   FILE *fp;
  1151.   /* Root saves new configuration */
  1152.   if (real_uid == 0) {
  1153.    if ((fp = fopen(parfile, "w")) == (FILE *)NULL) {
  1154.    werror(_("Cannot write to %s"), parfile);
  1155.    return(-1);
  1156.    }
  1157.    writepars(fp, 1);
  1158. fclose(fp);
  1159. werror(_("Configuration saved"));
  1160.   } else {
  1161. /* Mortals save their own configuration */
  1162. if ((fp = sfopen(pparfile, "w")) == (FILE *)NULL) {
  1163.    werror(_("Cannot write to %s"), pparfile);
  1164.    return (-1);
  1165. }
  1166. writepars(fp, 0);
  1167. fclose(fp);
  1168. werror(_("Configuration saved"));
  1169.   }
  1170. #if _HAVE_MACROS
  1171.   if (domacsave() < 0) /* fmg - something went wrong... */
  1172. return(-1);
  1173. #endif
  1174.   return(0);
  1175. }
  1176. #if _HAVE_MACROS
  1177. /*
  1178.  * Save the macros. (fmg)
  1179.  */
  1180. int domacsave()
  1181. {
  1182.   FILE *fp;
  1183.   /* fmg - do some basic silly-mortal checks and allow for recovery */
  1184.   if (!strcmp(P_MACCHG,"CHANGED")) {
  1185.         if (strlen(P_MACROS) == 0) { /* fmg - they might want to know... */
  1186.                 werror(_("ERROR: Macros have changed but no filename is set!"));
  1187.                 return(-1);
  1188.         } else {
  1189. if ((fp = sfopen(pfix_home(P_MACROS), "w")) == (FILE *)NULL) {
  1190. werror(_("Cannot write macros file %s"),
  1191. pfix_home(P_MACROS));
  1192.                         return(-1);
  1193.                 }
  1194. writemacs(fp, 0);
  1195. fclose(fp);
  1196. werror(_("Macros saved"));
  1197. strcpy(P_MACCHG,"SAVED"); /* fmg - reset after save */
  1198. return(0);
  1199. }
  1200.   }
  1201.   return(0);
  1202. }
  1203. #endif
  1204.  
  1205. /*
  1206.  * Save the configuration, ask a name for it.
  1207.  */
  1208. static void donamsave()
  1209. {
  1210.   char ifile[128];
  1211.   char *s;
  1212.   if (real_uid != 0) {
  1213.    werror(_("You are not allowed to create a configuration"));
  1214. return;
  1215.   }
  1216.   ifile[0] = 0;
  1217.   s = input(_("Give name to save this configuration?"), ifile);
  1218.   if (s != (char *)0 && *s != 0) {
  1219.    snprintf(parfile, sizeof(parfile), "%s/minirc.%s", LIBDIR, s);
  1220.   dodflsave();
  1221.   }
  1222. }
  1223. static void (*funcs1[])() = {
  1224.   dopath,
  1225.   doproto,
  1226.   doserial,
  1227.   domodem,
  1228.   doscrkeyb,
  1229.   vdodflsave,
  1230.   donamsave,
  1231.   NIL_FUN,
  1232.   NIL_FUN
  1233. };
  1234. char some_string[32];
  1235. static char *menu1[] = {
  1236.   N_("Filenames and paths"),
  1237.   N_("File transfer protocols"),
  1238.   N_("Serial port setup"),
  1239.   N_("Modem and dialing"),
  1240.   N_("Screen and keyboard"),
  1241.   some_string,
  1242.   N_("Save setup as.."),
  1243.   N_("Exit"),
  1244.   N_("Exit from Minicom"),
  1245.   MENU_END
  1246. };
  1247. int config(setup)
  1248. int setup;
  1249. {
  1250.   int c;
  1251.   char *s;
  1252.   /* Find out extension of parameter file */
  1253.   s = parfile + strlen(LIBDIR) + 8;
  1254.   snprintf(some_string, sizeof(some_string), _("Save setup as %s"), s);
  1255.   if (!setup) menu1[8] = MENU_END;
  1256.   c = wselect(13, 10, menu1, funcs1, _("configuration"), stdattr, mfcolor, mbcolor);
  1257.   if (c == 9) return(1);
  1258.   return(0);
  1259. }
  1260. /* fmg 1/11/94 Color names for menu */
  1261. static char *J_col[] =
  1262.   { N_("BLACK"), N_("RED"), N_("GREEN"), N_("YELLOW"),
  1263.     N_("BLUE"), N_("MAGENTA"), N_("CYAN"), N_("WHITE") };
  1264. static char *speeds[] =
  1265.    { "300", "1200", "2400", "4800" , 
  1266.      "9600", "19200", "38400", "57600", "115200", "230400", "Curr" };
  1267. /*
  1268.  * Ask user for Baudrate, Bits and Parity
  1269.  */
  1270. void get_bbp(ba, bi, pa, curr_ok)
  1271. char *ba;
  1272. char *bi;
  1273. char *pa;
  1274. int curr_ok;
  1275. {
  1276.   int c;
  1277.   WIN *w;
  1278.   int x, y;
  1279.   int max = m_getmaxspd();
  1280.   w = wopen(21, 3, 60, 20, BDOUBLE, stdattr, mfcolor, mbcolor, 0, 0, 1);
  1281.   wtitle(w, TMID, _("Comm Parameters"));
  1282.   dirflush = 0;
  1283.   wlocate(w, 0, 3);
  1284.   wputs(w, _("   Speed          Parity          Datann"));
  1285.   wputs(w, _(" A: 300           L: None         S: 5n"));
  1286.   wputs(w, _(" B: 1200          M: Even         T: 6n"));
  1287.   wputs(w, _(" C: 2400          N: Odd          U: 7n"));
  1288.   wputs(w, _(" D: 4800          O: Mark         V: 8n"));
  1289.   wputs(w, _(" E: 9600          P: Spacen"));
  1290.   if (max > 96)
  1291. wputs(w, _(" F: 19200n"));
  1292.   else
  1293. wputs(w, "n");
  1294.   if (max > 192)
  1295. wputs(w, _(" G: 38400n"));
  1296.   else
  1297. wputs(w, "n");
  1298.   if (max > 384)
  1299. wputs(w, _(" H: 57600n"));
  1300.   else
  1301. wputs(w, "n");
  1302.   if (max > 576)
  1303. wputs(w, _(" I: 115200        Q: 8-N-1n"));
  1304.   else
  1305. wputs(w, _("                  Q: 8-N-1n"));
  1306.   if (max > 1152)
  1307. wputs(w, _(" J: 230400        R: 7-E-1n"));
  1308.   else
  1309. wputs(w, _("                  R: 7-E-1n"));
  1310.   if (curr_ok)
  1311. wputs(w, _(" K: Currentn"));
  1312.   else
  1313. wputs(w, "n");
  1314.   wputs(w, _("n Choice, or <Enter> to exit? "));
  1315.   x = w->curx;
  1316.   y = w->cury;
  1317.   bi[1] = 0;
  1318.   pa[1] = 0;
  1319.   wredraw(w, 1);
  1320.   while(1) {
  1321.    wlocate(w, 1, 1);
  1322.    wprintf(w, _("Current: %5s %s%s1  "), ba, bi, pa);
  1323.    wlocate(w, x, y);
  1324.    wflush();
  1325.    c = wxgetch();
  1326.    if (c >= 'a') c -= 32;
  1327.    switch(c) {
  1328.    case 'J':
  1329. if (max < 2304) break;
  1330.    case 'I':
  1331. if (max < 1152) break;
  1332.    case 'H':
  1333. if (max < 576) break;
  1334. case 'G':
  1335. if (max < 384) break;
  1336.    case 'F':
  1337. if (max < 192) break;
  1338.    case 'A':
  1339.    case 'B':
  1340.    case 'C':
  1341.    case 'D':
  1342.    case 'E':
  1343.    case 'K':
  1344. if (c == 'K' && !curr_ok) break;
  1345.    strcpy(ba, speeds[c - 'A']);
  1346.    break;
  1347.    case 'L':
  1348.    pa[0] = 'N';
  1349.    break;
  1350.    case 'M':
  1351.    pa[0] = 'E';
  1352.    break;
  1353.    case 'N':
  1354.    pa[0] = 'O';
  1355.    break;
  1356. case 'O':
  1357. pa[0] = 'M';
  1358. break;
  1359. case 'P':
  1360. pa[0] = 'S';
  1361. break;
  1362.    case 'Q':
  1363.    pa[0] = 'N';
  1364.    bi[0] = '8';
  1365.    break;
  1366.    case 'R':
  1367.    pa[0] = 'E';
  1368.    bi[0] = '7';
  1369.    break;
  1370.    case 'S':
  1371.    bi[0] = '5';
  1372.    break;
  1373.    case 'T':
  1374.    bi[0] = '6';
  1375.    break;
  1376.    case 'U':
  1377.    bi[0] = '7';
  1378.    break;
  1379.    case 'V':
  1380.    bi[0] = '8';
  1381.    break;
  1382.    case 27:
  1383.    case 'n':
  1384.    case 'r':
  1385.    dirflush = 1;
  1386.    wclose(w, 1);
  1387.    return;
  1388.    default:
  1389.    break;
  1390.    }
  1391.   }
  1392. }
  1393. #if _HAVE_MACROS
  1394. /*
  1395.  * fmg - part of the Macros menu, "[none]" beats (null) :-)
  1396.  */
  1397. static void out_mac(w, s, n)
  1398. WIN *w;
  1399. char *s;
  1400. char n;
  1401. {
  1402.   wprintf(w, " %c : %.67sn", n, s ? s : "[none]");
  1403. }
  1404. /*
  1405.  * fmg - Macros editing window
  1406.  */
  1407. void domacros()
  1408. {
  1409.   WIN   *w;
  1410.   int   clr = 1;
  1411.   int   Jch='1', Jm=0; /* fmg - ok, so I was lazy.. */
  1412.   char* question = _("Change which setting?  (Esc to exit)");
  1413.   w = wopen(3, 6, 75, 21 , BDOUBLE, stdattr, mfcolor, mbcolor, 0, 0, 1);
  1414.   wtitle(w, TMID, _("F1 to F10 Macros"));
  1415.   wprintf(w, "n");
  1416.   out_mac(w,mmacs[Jm++].value, Jch++);
  1417.   out_mac(w,mmacs[Jm++].value, Jch++);
  1418.   out_mac(w,mmacs[Jm++].value, Jch++);
  1419.   out_mac(w,mmacs[Jm++].value, Jch++);
  1420.   out_mac(w,mmacs[Jm++].value, Jch++);
  1421.   out_mac(w,mmacs[Jm++].value, Jch++);
  1422.   out_mac(w,mmacs[Jm++].value, Jch++);
  1423.   out_mac(w,mmacs[Jm++].value, Jch++);
  1424.   out_mac(w,mmacs[Jm++].value, Jch++);
  1425.   Jch = 'A'; /* fmg - ran out of single digits... */
  1426.   out_mac(w,mmacs[Jm++].value, Jch++);
  1427.   wredraw(w, 1);
  1428.   while(1) {
  1429.         wlocate(w, 1, 14);
  1430.         wputs(w, _(" (LEGEND: ^M = C-M, ^L = C-L, ^G = C-G, ^R = C-R, ^~ = pause 1 second,"));
  1431. wlocate(w, 1, 15);
  1432. wputs(w, _("  \u = username, \p = password, \\ = \)"));
  1433.         if (clr) {
  1434.                 wlocate(w, 1, 12);
  1435.                 wprintf(w, "%s ", question);
  1436.                 wclreol(w);
  1437.                 clr = 0;
  1438.         } else wlocate(w, strlen (question) + 2, 12);
  1439.         switch(rwxgetch()) {
  1440.                 case 'n': wclose(w, 1); return;
  1441.                 case '1':
  1442.                         mgets(w, 5, 1, P_MAC1, 72, MAC_LEN);
  1443.                         strcpy(P_MACCHG,_("CHANGED")); /* fmg - ...I'm ashamed */
  1444.                         wlocate(w, 0, 1);
  1445.                         out_mac(w,P_MAC1, '1');
  1446.                         break;
  1447.                 case '2':
  1448.                         mgets(w, 5, 2, P_MAC2, 72, MAC_LEN);
  1449.                         strcpy(P_MACCHG,"CHANGED"); /* fmg - ... really, I am */
  1450.                         wlocate(w, 0, 2);
  1451.                         out_mac(w,P_MAC2, '2');
  1452.                         break;
  1453.                 case '3':
  1454.                         mgets(w, 5, 3, P_MAC3, 72, MAC_LEN);
  1455.                         strcpy(P_MACCHG,"CHANGED"); /* fmg - ... this is the */
  1456.                         wlocate(w, 0, 3);
  1457.                         out_mac(w,P_MAC3, '3');
  1458.                         break;
  1459.                 case '4':
  1460.                         mgets(w, 5, 4, P_MAC4, 72, MAC_LEN);
  1461.                         strcpy(P_MACCHG,"CHANGED"); /* fmg - ... first entry on */
  1462.                         wlocate(w, 0, 4);
  1463.                         out_mac(w,P_MAC4, '4');
  1464.                         break;
  1465.                 case '5':
  1466.                         mgets(w, 5, 5, P_MAC5, 72, MAC_LEN);
  1467.                         strcpy(P_MACCHG,"CHANGED"); /* fmg - ... my TODO list. */
  1468.                         wlocate(w, 0, 5);
  1469.                         out_mac(w,P_MAC5, '5');
  1470.                         break;
  1471.                 case '6':
  1472.                         mgets(w, 5, 6, P_MAC6, 72, MAC_LEN);
  1473.                         strcpy(P_MACCHG,"CHANGED"); /* fmg - ... and, come to think */
  1474.                         wlocate(w, 0, 6);
  1475.                         out_mac(w,P_MAC6, '6');
  1476.                         break;
  1477.                 case '7':
  1478.                         mgets(w, 5, 7, P_MAC7, 72, MAC_LEN);
  1479.                         strcpy(P_MACCHG,"CHANGED"); /* fmg - ... of it, I no longer */
  1480.                         wlocate(w, 0, 7);
  1481.                         out_mac(w,P_MAC7, '7');
  1482.                         break;
  1483.                 case '8':
  1484.                         mgets(w, 5, 8, P_MAC8, 72, MAC_LEN);
  1485.                         strcpy(P_MACCHG,"CHANGED"); /* fmg - ... even use this... */
  1486.                         wlocate(w, 0, 8);
  1487.                         out_mac(w,P_MAC8, '8');
  1488.                         break;
  1489.                 case '9':
  1490.                         mgets(w, 5, 9, P_MAC9, 72, MAC_LEN);
  1491.                         strcpy(P_MACCHG,"CHANGED"); /* fmg - ... [sigh] */
  1492.                         wlocate(w, 0, 9);
  1493.                         out_mac(w,P_MAC9, '9');
  1494.                         break;
  1495.                 case 'A':
  1496.                         mgets(w, 5, 10, P_MAC10, 72, MAC_LEN);
  1497.                         strcpy(P_MACCHG,"CHANGED"); /* fmg - ... [sigh] */
  1498.                         wlocate(w, 0, 10);
  1499.                         out_mac(w,P_MAC10, 'A');
  1500.                         break;
  1501.         }
  1502.   }
  1503. }
  1504. /* is this *REALLY* a printable or non-printable character?
  1505.  * the isprint() function seems to consider all chars > 127d non-printable..
  1506.  * jl 10.03.1998
  1507.  */
  1508. int prch(int c)
  1509. {
  1510.   if (c < 32 || c == 127 || c == 155)
  1511.     return (' ');
  1512.   else
  1513.     return (c);
  1514. }
  1515. /* Edit the character conversion tables. jl 04.09.97 */
  1516. void doconv()
  1517. {
  1518.   WIN *w;
  1519.   int i, j, k, l,
  1520.     offs=32,
  1521.     ymax=22,
  1522.     h,
  1523.     redraw=1;
  1524.   char buf[64];
  1525.   char *prompt;
  1526.   h = 16;
  1527.   w = wopen (1, 1, 77, ymax, BDOUBLE, stdattr, mfcolor, mbcolor, 0, 0, 1);
  1528.   wtitle(w, TMID, _("Character conversion"));
  1529.   while(1) {
  1530.     if (redraw) {
  1531.       winclr(w);
  1532.       wprintf(w,
  1533.       _(" char    in out    char    in out    char    in out    char    in outn"));
  1534.       for (i=offs,j=i+h,k=j+h,l=k+h ;
  1535.    i<offs+h && i<256 ; i++,j++,k++,l++){
  1536. wprintf(w, "%3d (%c) %3d %3d   ",
  1537. i, prch(i), (int) vt_inmap[i], (int) vt_outmap[i]);
  1538. if (j<256)
  1539.   wprintf(w, "%3d (%c) %3d %3d   ",
  1540.   j, prch(j), (int) vt_inmap[j], (int) vt_outmap[j]);
  1541. else
  1542.   wprintf(w, "                  ");
  1543. if (k<256)
  1544.   wprintf(w, "%3d (%c) %3d %3d   ",
  1545.   k, prch(k), (int) vt_inmap[k], (int) vt_outmap[k]);
  1546. else
  1547.   wprintf(w, "                  ");
  1548. if (l<256)
  1549.   wprintf(w, "%3d (%c) %3d %3dn",
  1550.   l, prch(l), (int) vt_inmap[l], (int) vt_outmap[l]);
  1551. else
  1552.   wprintf(w, "               n");
  1553.       }
  1554.       wprintf(w, _("n A - load tabletB - save table"));
  1555.       if (P_CONVF[0])
  1556. wprintf(w, _("tfile:%s"),P_CONVF);
  1557.       wprintf(w, _("n C - edit chartD - next screentE - prev screenn"));
  1558.       wprintf(w, _(" F - convert capture: %sn"), _(P_CONVCAP));
  1559.       
  1560.       wredraw(w, 1);
  1561.       redraw=0;
  1562.     }
  1563.     wlocate(w, 1, ymax - 1);
  1564.     wclreol(w);
  1565.     wflush();
  1566.     switch (toupper(rwxgetch())) {
  1567.     case 'n':
  1568.       wclose(w, 1); return;
  1569.       break;
  1570.     case 'A':
  1571.       strcpy(buf,P_CONVF);
  1572.       prompt=_("Load file: %s");
  1573.       wprintf(w, prompt, buf);
  1574.       pgets(w, strlen(prompt) - 1, ymax - 1, buf, 64, 64);
  1575.       if (loadconv(buf) == 0) {
  1576. if(strcmp(P_CONVF,buf))
  1577.   markch(P_CONVF);
  1578. strcpy(P_CONVF,buf);
  1579. redraw=1;
  1580.       }
  1581.       break;
  1582.     case 'B':
  1583.       strcpy(buf,P_CONVF);
  1584.       prompt=_("Save as file: %s");
  1585.       wprintf(w, prompt, buf);
  1586.       pgets(w, strlen(prompt) - 1, ymax - 1, buf, 64, 64);
  1587.       if (saveconv(buf) == 0) {
  1588. if(strcmp(P_CONVF,buf))
  1589.   markch(P_CONVF);
  1590. strcpy(P_CONVF,buf);
  1591. redraw=1;
  1592.       }
  1593.       break;
  1594.     case 'C':
  1595.       prompt=_("Character to be edited: ");
  1596.       wprintf(w, prompt);
  1597.       buf[0]=0; i=-1;
  1598.       wlocate(w, strlen(prompt), ymax - 1);
  1599.       wgets(w, buf, 4, 4);
  1600.       sscanf(buf,"%d",&i);
  1601.       if (i>255 || i<0) {
  1602. werror(_("Input character ascii value 0-255"));
  1603. break;
  1604.       }
  1605.       sprintf(buf,"%u",(unsigned int) vt_inmap[i]);
  1606.       wlocate(w, 30, ymax - 1);
  1607.       prompt=_("Change input to: %s");
  1608.       wprintf(w, prompt,buf);
  1609.       wlocate(w, strlen(prompt) + 28, ymax - 1);
  1610.       wgets(w, buf, 4, 4);
  1611.       sscanf(buf,"%d",&j);
  1612.       if (j>255 || j<0) {
  1613.         werror(_("Input character ascii value 0-255"));
  1614.         break;
  1615.       }
  1616.       else vt_inmap[i] = j;
  1617.       sprintf(buf,"%u",(unsigned int) vt_outmap[i]);
  1618.       wlocate(w, 54, ymax - 1);
  1619.       prompt=_("Change output to: %s");
  1620.       wprintf(w, prompt, buf);
  1621.       wlocate(w, strlen(prompt) + 52, ymax - 1);
  1622.       wgets(w, buf, 4, 4);
  1623.       sscanf(buf,"%d",&j);
  1624.       if (j>255 || j<0) {
  1625.         werror(_("Input character ascii value 0-255"));
  1626.         break;
  1627.       }
  1628.       else vt_outmap[i] = j;
  1629.       redraw=1;
  1630.       break;
  1631.     case 'D':
  1632.       offs += 4 * h;
  1633.       if (offs > 255)
  1634. offs = 0;
  1635.       redraw=1;
  1636.       break;
  1637.     case 'E':
  1638.       offs -= 4 * h;
  1639.       if (offs < 0)
  1640. offs = 0;
  1641.       redraw=1;
  1642.       break;
  1643.     case 'F':
  1644.       strcpy(P_CONVCAP, yesno(P_CONVCAP[0] == 'N'));
  1645.       markch(P_CONVCAP);
  1646.       redraw=1;
  1647.       break;
  1648.     }
  1649.   }
  1650. }
  1651. int loadconv(char *buf)
  1652. {
  1653.   FILE *fp;
  1654.   if ((fp = sfopen(pfix_home(buf), "rb")) == (FILE *)NULL) {
  1655.     werror(_("Cannot open conversion table %s"),pfix_home(buf));
  1656.     return 1;
  1657.   }
  1658.   fread(vt_inmap, sizeof(vt_inmap), (size_t)1, fp);
  1659.   fread(vt_outmap, sizeof(vt_outmap), (size_t)1, fp);
  1660.   fclose(fp);
  1661.   return 0;
  1662. }
  1663. int saveconv(char *buf)
  1664. {
  1665.   FILE *fp;
  1666.   if ((fp = sfopen(pfix_home(buf), "wb")) == (FILE *)NULL) {
  1667.     werror(_("Cannot write conversion table %s"),pfix_home(buf));
  1668.     return 1;
  1669.   }
  1670.   fwrite(vt_inmap, sizeof(vt_inmap), (size_t)1, fp);
  1671.   fwrite(vt_outmap, sizeof(vt_outmap), (size_t)1, fp);
  1672.   fclose(fp);
  1673.   return 0;
  1674. }
  1675. #endif