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

Modem编程

开发平台:

Unix_Linux

  1. /*
  2.  * rwconf.c Routines to deal with ASCII configuration files.
  3.  *
  4.  * This file is part of the minicom communications package,
  5.  * Copyright 1991-1996 Miquel van Smoorenburg.
  6.  *
  7.  * This program is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU General Public License
  9.  * as published by the Free Software Foundation; either version
  10.  * 2 of the License, or (at your option) any later version.
  11.  *
  12.  * When adding options, remember to add them here in the mpars structure
  13.  * AND to the macro definitions in configsym.h.
  14.  *
  15.  * // fmg 12/20/93 - kludged in color "support" (hey, it works)
  16.  * // fmg 2/15/94 - added 9 x MAC_LEN char macros for F1 to F10 which can be
  17.  *                  save to a specified file so that old defaults file
  18.  *                  works with these patches. TODO: make these alloc
  19.  *                  memory dynamically... it's nice to have a 15K macro
  20.  *                  _WHEN_ it's being (not like now with -DMAC_LEN) :-)
  21.  * // jl  23.06.97 - changed mdropdtr to numeric
  22.  * // jl  04.09.97 - conversion table filename added to mpars table
  23.  * // jl  22.02.98 - file selection window setting added to mpars table
  24.  * // acme 26.02.98 - i18n
  25.  * // acme 18.03.98 - more i18n
  26.  * // jl  05.04.98 - added the multifile parameter for transfer protocols
  27.  *    jl  06.07.98 - added option P_CONVCAP
  28.  *    jl  28.11.98 - added P_SHOWSPD
  29.  *    jl  05.04.99 - logging options
  30.  *    er  18-Apr-99 - added P_MULTILINE for "multiline"
  31.  */
  32. #include "port.h"
  33. #include "minicom.h"
  34. #include "intl.h"
  35. #define ADM_CHANGE 1
  36. #define USR_CHANGE 2
  37. #if _HAVE_MACROS
  38. /* fmg macros stuff */
  39. #define MAX_MACS        10       /* fmg - header files? what's that... */
  40. struct macs mmacs[] = {
  41.   { "",       PUBLIC,   "pmac1" },
  42.   { "",       PUBLIC,   "pmac2" },
  43.   { "",       PUBLIC,   "pmac3" },
  44.   { "",       PUBLIC,   "pmac4" },
  45.   { "",       PUBLIC,   "pmac5" },
  46.   { "",       PUBLIC,   "pmac6" },
  47.   { "",       PUBLIC,   "pmac7" },
  48.   { "",       PUBLIC,   "pmac8" },
  49.   { "",       PUBLIC,   "pmac9" },
  50.   { "",       PUBLIC,   "pmac10" },
  51.   /* That's all folks */
  52.   { "",                 0,         (char *)NULL },
  53. };
  54. #endif
  55. struct pars mpars[] = {
  56.   /* Protocols */
  57.   /* Warning: minicom assumes the first 12 entries are these proto's ! */
  58.   { "YUNYYzmodem", PUBLIC,   "pname1" },
  59.   { "YUNYYymodem", PUBLIC,   "pname2" },
  60.   { "YUNYNxmodem", PUBLIC,   "pname3" },
  61.   { "NDNYYzmodem", PUBLIC,   "pname4" },
  62.   { "NDNYYymodem", PUBLIC,   "pname5" },
  63.   { "YDNYNxmodem", PUBLIC,   "pname6" },
  64.   { "YUYNNkermit", PUBLIC,   "pname7" },
  65.   { "NDYNNkermit", PUBLIC,   "pname8" },
  66.   { "YUNYNascii", PUBLIC,   "pname9" },
  67.   { "", PUBLIC,   "pname10" },
  68.   { "", PUBLIC,   "pname11" },
  69.   { "", PUBLIC,   "pname12" },
  70. #ifdef __linux__
  71.   { "/usr/bin/sz -vv -b", PUBLIC,   "pprog1" },
  72.   { "/usr/bin/sb -vv", PUBLIC,   "pprog2" },
  73.   { "/usr/bin/sx -vv", PUBLIC,   "pprog3" },
  74.   { "/usr/bin/rz -vv -b -E", PUBLIC,   "pprog4" },
  75.   { "/usr/bin/rb -vv", PUBLIC,   "pprog5" },
  76.   { "/usr/bin/rx -vv", PUBLIC,   "pprog6" },
  77.   { "/usr/bin/kermit -i -l %l -s", PUBLIC, "pprog7" },
  78.   { "/usr/bin/kermit -i -l %l -r", PUBLIC, "pprog8" },
  79. #else
  80.   /* Most sites have this in /usr/local, except Linux. */
  81.   { "/usr/local/bin/sz -vv", PUBLIC,   "pprog1" },
  82.   { "/usr/local/bin/sb -vv", PUBLIC,   "pprog2" },
  83.   { "/usr/local/bin/sx -vv", PUBLIC,   "pprog3" },
  84.   { "/usr/local/bin/rz -vv", PUBLIC,   "pprog4" },
  85.   { "/usr/local/bin/rb -vv", PUBLIC,   "pprog5" },
  86.   { "/usr/local/bin/rx -vv", PUBLIC,   "pprog6" },
  87.   { "/usr/local/bin/kermit -i -l %l -s", PUBLIC, "pprog7" },
  88.   { "/usr/local/bin/kermit -i -l %l -r", PUBLIC, "pprog8" },
  89. #endif
  90.   { "/usr/bin/ascii-xfr -dsv", PUBLIC,   "pprog9" },
  91.   { "", PUBLIC,   "pprog10" },
  92.   { "", PUBLIC,   "pprog11" },
  93.   { "", PUBLIC,   "pprog12" },
  94.   /* Serial port & friends */
  95.   { DFL_PORT, PRIVATE,  "port" },
  96.   { CALLIN, PRIVATE,  "callin" },
  97.   { CALLOUT, PRIVATE,  "callout" },
  98.   { UUCPLOCK, PRIVATE,  "lock" },
  99.   { DEF_BAUD, PUBLIC,   "baudrate" },
  100.   { "8", PUBLIC,   "bits" },
  101.   { "N", PUBLIC,   "parity" },
  102.   /* Kermit the frog */
  103.   { KERMIT, PRIVATE,  "kermit" },
  104.   { N_("Yes"), PRIVATE,  "kermallow" },
  105.   { N_("No"), PRIVATE,  "kermreal" },
  106.   { "3", PUBLIC,   "colusage" },
  107.   /* The script program */
  108.   { "runscript", PUBLIC,   "scriptprog" },
  109.   /* Modem parameters */
  110.   { "~^M~AT S7=45 S0=0 L1 V1 X4 &c1 E1 Q0^M",   PUBLIC,   "minit" },
  111.   { "^M~ATZ^M~", PUBLIC,   "mreset" },
  112.   { "ATDT", PUBLIC,   "mdialpre" },
  113.   { "^M", PUBLIC,   "mdialsuf" },
  114.   { "ATDP", PUBLIC,   "mdialpre2" },
  115.   { "^M", PUBLIC,   "mdialsuf2" },
  116.   { "ATX1DT", PUBLIC,   "mdialpre3" },
  117.   { ";X4D^M", PUBLIC,   "mdialsuf3" },
  118.   { "CONNECT", PUBLIC,   "mconnect" },
  119.   { "NO CARRIER", PUBLIC,   "mnocon1" },
  120.   { "BUSY", PUBLIC,   "mnocon2" },
  121.   { "NO DIALTONE", PUBLIC,   "mnocon3" },
  122.   { "VOICE", PUBLIC,   "mnocon4" },
  123.   { "~~+++~~ATH^M", PUBLIC,   "mhangup" },
  124.   { "^M", PUBLIC,   "mdialcan" },
  125.   { "45", PUBLIC,   "mdialtime" },
  126.   { "2", PUBLIC,   "mrdelay" },
  127.   { "10", PUBLIC,   "mretries" },
  128.   { "1", PUBLIC,   "mdropdtr" },   /* jl 23.06.97 */
  129.   { "No", PUBLIC,   "mautobaud" },
  130.   { "d", PUBLIC,   "showspeed" },  /* d=DTE, l=line speed */
  131.   { "", PUBLIC,   "updir" },
  132.   { "", PUBLIC,   "downdir" },
  133.   { "", PUBLIC,   "scriptdir" },
  134.   { "^A", PUBLIC,   "escape-key" },
  135.   { "BS", PUBLIC,   "backspace" },
  136.   { N_("enabled"), PUBLIC,   "statusline" },
  137.   { N_("Yes"), PUBLIC,   "hasdcd" },
  138.   { N_("Yes"), PUBLIC,   "rtscts" },
  139.   { N_("No"), PUBLIC,   "xonxoff" },
  140.   { "D", PUBLIC,   "zauto" },
  141.   /* fmg 1/11/94 colors */
  142.   /* MARK updated 02/17/95 to be more like TELIX. After all its configurable */
  143.   { "YELLOW",           PUBLIC,   "mfcolor" },
  144.   { "BLUE",             PUBLIC,   "mbcolor" },
  145.   { "WHITE",            PUBLIC,   "tfcolor" },
  146.   { "BLACK",            PUBLIC,   "tbcolor" },
  147.   { "WHITE",            PUBLIC,   "sfcolor" },
  148.   { "RED",              PUBLIC,   "sbcolor" },
  149.   /* fmg 2/20/94 macros */
  150.   { ".macros",          PUBLIC,   "macros" },
  151.   { "",                 PUBLIC,   "changed" },
  152.   { "Yes", PUBLIC,   "macenab" },
  153.   /* Continue here with new stuff. */
  154.   { "Yes", PUBLIC,   "sound"  },
  155.   /* MARK updated 02/17/95 - History buffer size */
  156.   { "2000",             PUBLIC,   "histlines" },
  157.   /* Character conversion table - jl / 04.09.97 */
  158.   { "",                 PUBLIC,    "convf" },
  159.   { "Yes", PUBLIC,    "convcap" },
  160.   /* Do you want to use the filename selection window? */
  161.   { "Yes", PUBLIC,    "fselw" },
  162.   /* Do you want to be prompted for the download directory? */
  163.   { "No", PUBLIC,    "askdndir" },
  164.   /* Logfile options - jl 05.04.99 */
  165.   { "minicom.log", PUBLIC,    "logfname" },
  166.   { "Yes", PUBLIC,    "logconn" },
  167.   { "Yes", PUBLIC,    "logxfer" },
  168.   { "No",  PUBLIC,    "multiline"},
  169.   /* That's all folks */
  170.   { "",                 0,         (char *)NULL },
  171. };
  172.  
  173. #if _HAVE_MACROS
  174. /*
  175.  * fmg - Write the macros to a file.
  176.  */
  177. int writemacs(fp, all)
  178. FILE *fp;
  179. int all;
  180. {
  181.   struct macs *m;
  182.   for(m = mmacs; m->desc; m++)
  183.         if ((all && (m->flags & ADM_CHANGE))
  184.         || ((m->flags & PUBLIC) && (m->flags & USR_CHANGE)))
  185.                 fprintf(fp, "%s %-16.16s %sn", m->flags &
  186.                         PUBLIC ? "pu" : "pr", m->desc, m->value);
  187.   return(0);
  188. }
  189. #endif
  190. /*
  191.  * Write the parameters to a file.
  192.  */
  193. int writepars(fp, all)
  194. FILE *fp;
  195. int all;
  196. {
  197.   struct pars *p;
  198.   if (all)
  199. fprintf(fp, _("# Machine-generated file - use "minicom -s" to change parameters.n"));
  200.   else
  201. fprintf(fp, _("# Machine-generated file - use setup menu in minicom to change parameters.n"));
  202.   for(p = mpars; p->desc; p++)
  203.    if ((all && (p->flags & ADM_CHANGE)) ||
  204.       ((p->flags & PUBLIC) && (p->flags & USR_CHANGE)))
  205.    fprintf(fp, "%s %-16.16s %sn",
  206.    p->flags & PUBLIC ? "pu" : "pr", p->desc, p->value);
  207.   return(0);
  208. }
  209. /*
  210.  * Read the parameters from a file.
  211.  */
  212. int readpars(fp, init)
  213. FILE *fp;
  214. int init;
  215. {
  216.   struct pars *p;
  217.   char line[80];
  218.   char *s;
  219.   int public;
  220.   int dosleep = 0;
  221.   if (init) strcpy(P_SCRIPTPROG, "runscript");
  222.   while(fgets(line, 80, fp) != (char *)0) {
  223.    s = strtok(line, "nt ");
  224. if (s == NULL) continue;
  225.    /* Here we have pr for private and pu for public */
  226.    public = -1;
  227.    if (strcmp(s, "pr") == 0) {
  228.    public = 0;
  229.    s = strtok((char *)NULL, "nt ");
  230.    }
  231.    if (strcmp(line, "pu") == 0) {
  232.    public = 1;
  233.    s = strtok((char *)NULL, "nt ");
  234.    }
  235. if (s == NULL || public < 0) continue;
  236.    /* Don't read private entries if prohibited */
  237.    if (!init && public == 0) continue;
  238.    for(p = mpars; p->desc != (char *)0; p++) {
  239.    if (strcmp(p->desc, s) == 0) {
  240. /* See if this makes sense. */
  241. if (((p->flags & PRIVATE) && public) ||
  242.     ((p->flags & PUBLIC)  && !public)) {
  243. fprintf(stderr,
  244. _("** Parameter %s is %s, but is marked %s in %s config filen"),
  245. s,
  246. (p->flags & PRIVATE) ? "private" : "public",
  247. public ? "public" : "private",
  248. init ? _("global") : _("personal"));
  249. dosleep = 1;
  250. }
  251. /* See if user is allowed to change this flag. */
  252. if ((p->flags & PRIVATE) && public == 1) {
  253. fprintf(stderr,
  254.        _("== Attempt to change private parameter %s - denied.n"),
  255. p->desc);
  256. dosleep = 1;
  257. continue;
  258. }
  259.    /* Set value */
  260.    if ((s = strtok((char *)NULL, "n")) == (char *)0)
  261.    s = "";
  262.    while(*s && (*s == 't' || *s == ' ')) s++;
  263. /* We must be prepared for config files saved before
  264.    the P_MUL parameter was added. So, we make room
  265.    for P_MUL if necessary - jl 5.4.98 */
  266. if (!strncmp(p->desc,"pname",(size_t) 5)) {
  267.   if (s[4] != 'N' && s[4] != 'Y') {
  268.     memmove (s+5, s+4, strlen(s+4));
  269.     *(s+4)='N';
  270.   }
  271. }
  272.    /* If the same as default, don't mark as changed */
  273.    if (strcmp(p->value, s) == 0) {
  274.    p->flags = 0;
  275.    } else {
  276. if (init)
  277. p->flags |= ADM_CHANGE;
  278. else
  279. p->flags |= USR_CHANGE;
  280.    strcpy(p->value, s);
  281.    }
  282. #if 0 /* Ehm. This makes no sense, Mike. */
  283.    /* Set flags */
  284.    p->flags |= (public ? PUBLIC : PRIVATE);
  285.    p->flags &= ~(public ? PRIVATE : PUBLIC);
  286. #endif
  287.    break;
  288.    }
  289.    }
  290.   }
  291.   /* To get over a bug in minicom 1.60 :( */
  292.   if (strcmp(P_BAUDRATE, "Curr") == 0) strcpy(P_BAUDRATE, "38400");
  293.   if (dosleep) sleep(3);
  294.   return(0);
  295. }
  296. #if _HAVE_MACROS
  297. /*
  298.  * fmg - Read the macros from a file.
  299.  */
  300. int readmacs(fp, init)
  301. FILE *fp;
  302. int init;
  303. {
  304.   struct        macs *m;
  305.   char          line[MAC_LEN];
  306.   int           public, max_macs=MAX_MACS+1;
  307.   char          *s;
  308.   while(fgets(line, MAC_LEN, fp) != (char *)0 && max_macs--) {
  309.         s = strtok(line, "nt ");
  310.         /* Here we have pr for private and pu for public */
  311.         public = 0;
  312.         if (strcmp(s, "pr") == 0) {
  313.                 public = 0;
  314.                 s = strtok((char *)NULL, "nt ");
  315.         }
  316.         if (strcmp(line, "pu") == 0) {
  317.                 public = 1;
  318.                 s = strtok((char *)NULL, "nt ");
  319.         }
  320.         /* Don't read private entries if prohibited */
  321.         if (!init && public == 0) continue;
  322.         for(m = mmacs; m->desc != (char *)0; m++) {
  323.                 if (strcmp(m->desc, s) == 0) {
  324.                                 ;
  325.                         /* Set value */
  326.                         if ((s = strtok((char *)NULL, "n")) == (char *)0)
  327.                                 s = "";
  328.                         while(*s && (*s == 't' || *s == ' ')) s++;
  329.                         /* If the same as default, don't mark as changed */
  330.                         if (strcmp(m->value, s) == 0) {
  331.                                 m->flags = 0;
  332.                         } else {
  333.                                 if (init)
  334.                                         m->flags |= ADM_CHANGE;
  335.                                 else
  336.                                         m->flags |= USR_CHANGE;
  337.                                 strcpy(m->value, s);
  338.                         }
  339. #if 0
  340.                         /* Set flags */
  341.                         m->flags |= (public ? PUBLIC : PRIVATE);
  342. #endif
  343.                         break;
  344.                 }
  345.         }
  346.   }
  347.   return(0);
  348. }
  349. #endif