home *** CD-ROM | disk | FTP | other *** search
/ The CDPD Public Domain Collection for CDTV 4 / CDPD_IV.bin / networking / tcpip / amitcp-support / ncftp-1.5.6 / src / rcs / set.c,v < prev    next >
Encoding:
Text File  |  1994-06-29  |  7.9 KB  |  385 lines

  1. head    14020.12;
  2. access;
  3. symbols
  4.     ORIGINAL:14020.12;
  5. locks; strict;
  6. comment    @ * @;
  7.  
  8.  
  9. 14020.12
  10. date    93.07.09.11.45.48;    author alph;    state Exp;
  11. branches;
  12. next    ;
  13.  
  14.  
  15. desc
  16. @Original version
  17. @
  18.  
  19.  
  20. 14020.12
  21. log
  22. @checked in with -k by alph at 1993/10/10 19:59:56
  23. @
  24. text
  25. @/* Set.c */
  26.  
  27. /*  $RCSfile: set.c,v $
  28.  *  $Revision: 14020.12 $
  29.  *  $Date: 93/07/09 11:45:48 $
  30.  */
  31.  
  32. #include "sys.h"
  33.  
  34. #include <string.h>
  35. #include <ctype.h>
  36.  
  37. #include "util.h"
  38. #include "cmds.h"
  39. #include "main.h"
  40. #include "set.h"
  41. #include "defaults.h"
  42. #include "copyright.h"
  43.  
  44. /* Set.c globals: */
  45. char *verbose_msgs[4] = {
  46.     "Not printing anything.\n",
  47.     "Only printing necessary error messages.\n",
  48.     "Printing error messages and announcements from the remote host.\n",
  49.     "Printing all messages, errors, acknowledgments, and announcements.\n"
  50. };
  51.  
  52. char *short_verbose_msgs[4] = {
  53.     "Quiet (-1)",
  54.     "Errors Only (0)",
  55.     "Terse (1)",
  56.     "Verbose (2)"
  57. };
  58.  
  59. string                        vstr;
  60.  
  61. /* Set.c externs: */
  62. extern int                    progress_meter, connected;
  63. extern int                    parsing_rc, keep_recent;
  64. extern string                pager, anon_password, prompt;
  65. extern str32                curtypename;
  66. extern long                    logsize;
  67. extern FILE                    *logf;
  68. extern longstring            rcname, logfname, lcwd;
  69. extern int                    auto_binary, ansi_escapes, debug;
  70. extern int                    mprompt, remote_is_unix, verbose;
  71. extern int                    startup_msg, anon_open;
  72. #ifndef NO_TIPS
  73. extern int                    tips;
  74. #endif
  75. #ifdef GATEWAY
  76. extern string                gateway, gate_login;
  77. #endif
  78.  
  79. /* The variables must be sorted in alphabetical order, or else
  80.  * match_var() will choke.
  81.  */
  82. struct var vars[] = {
  83.     VARENTRY("anon-open",        BOOL, 0, &anon_open,    NULL),
  84.     VARENTRY("anon-password",    STR,  0, anon_password,    NULL),
  85.     VARENTRY("ansi-escapes",    BOOL, 0, &ansi_escapes,    NULL),
  86.     VARENTRY("auto-binary",        BOOL, 0, &auto_binary,    NULL),
  87.     VARENTRY("debug",            INT,  0, &debug,        NULL),
  88. #ifdef GATEWAY
  89.     VARENTRY("gateway-login",    STR,  0, gate_login,    set_gatelogin),
  90.     VARENTRY("gateway-host",    STR,  0, gateway,        NULL),
  91. #endif
  92.     VARENTRY("local-dir",        STR,  0, lcwd,            set_ldir),
  93.     VARENTRY("logfile",            STR,  0, logfname,        set_log),
  94.     VARENTRY("logsize",            LONG, 0, &logsize,        NULL),
  95.     VARENTRY("mprompt",            BOOL, 0, &mprompt,        NULL),
  96.     VARENTRY("netrc",            -STR, 0, rcname,        NULL),
  97.     VARENTRY("pager",            STR,  0, pager + 1,        set_pager),
  98.     VARENTRY("prompt",            STR,  0, prompt,        set_prompt),
  99.     VARENTRY("progress-reports",INT,  0, &progress_meter,NULL),
  100.     VARENTRY("recent-list",        BOOL, 0, &keep_recent,    NULL),
  101.     VARENTRY("remote-is-unix",    BOOL, 1, &remote_is_unix,NULL),
  102.     VARENTRY("startup-msg",        BOOL, 0, &startup_msg,    NULL),  /* TAR */
  103. #ifndef NO_TIPS
  104.     VARENTRY("tips",            BOOL, 0, &tips,            NULL),
  105. #endif
  106.     VARENTRY("type",            STR,  1, curtypename,    set_type),
  107.     VARENTRY("verbose",            STR,  0, vstr,            set_verbose),
  108. };
  109.  
  110.  
  111. void set_verbose(char *new, int unset)
  112. {
  113.     int i, c;
  114.  
  115.     if (unset == -1) verbose = !verbose;
  116.     else if (unset || !new) verbose = V_ERRS;
  117.     else {
  118.         if (isalpha(*new)) {
  119.             c = islower(*new) ? toupper(*new) : *new;    
  120.             for (i=0; i<(int)(sizeof(short_verbose_msgs)/sizeof(char *)); i++) {
  121.                 if (short_verbose_msgs[i][0] == c)
  122.                     verbose = i - 1;
  123.             }
  124.         } else {
  125.             i = atoi(new);
  126.             if (i < V_QUIET) i = V_QUIET;
  127.             else if (i > V_VERBOSE) i = V_VERBOSE;
  128.             verbose = i;
  129.         }
  130.     }
  131.     (void) Strncpy(vstr, short_verbose_msgs[verbose+1]);
  132.     if (!parsing_rc && NOT_VQUIET) 
  133.         (void) fputs(verbose_msgs[verbose+1], stdout);
  134. }    /* set_verbose */
  135.  
  136.  
  137.  
  138.  
  139. void set_prompt(char *new, int unset)
  140. {
  141.     (void) Strncpy(prompt, (unset || !new) ? dPROMPT : new);
  142.     init_prompt();
  143. }    /* set_prompt */
  144.  
  145.  
  146.  
  147.  
  148. void set_log(char *fname, int unset)
  149. {
  150.     if (logf) {
  151.         (void) fclose(logf);
  152.         logf = NULL;
  153.     }
  154.     if (!unset && fname) {
  155.         (void) Strncpy(logfname, fname);
  156.         logf = fopen (LocalDotPath(logfname), "a");
  157.     }
  158. }    /* set_log */
  159.  
  160.  
  161.  
  162.  
  163. void set_pager(char *new, int unset)
  164. {
  165.     if (unset)
  166.         (void) strcpy(pager, "-");
  167.     else {
  168.         if (!new)
  169.             new = dPAGER;
  170.         if (!new[0])
  171.             (void) Strncpy(pager, "-");
  172.         else {
  173.             (void) sprintf(pager, "|%s", (*new == '|' ? new + 1 : new));
  174.             (void) LocalPath(pager + 1);
  175.         }
  176.     }
  177. }    /* set_pager */
  178.  
  179.  
  180.  
  181.  
  182. void set_type(char *newtype, int unset)
  183. {
  184.     int t = verbose;
  185.     verbose = V_QUIET;
  186.     if (!connected && t > V_QUIET)
  187.         (void) printf("Not connected.\n");
  188.     else if (newtype != NULL && !unset)
  189.         (void) _settype(newtype);
  190.     verbose = t;
  191. }    /* set_type */
  192.  
  193.  
  194.  
  195.  
  196. void set_ldir(char *ldir, int unset)
  197. {
  198.     int t = verbose;
  199.     char *argv[2];
  200.  
  201.     if (ldir && !unset) {
  202.         verbose = V_QUIET;
  203.         argv[1] = ldir;
  204.         (void) lcd(2, argv);
  205.         verbose = t;
  206.     }
  207. }    /* set_ldir */
  208.  
  209.  
  210.  
  211.  
  212. #ifdef GATEWAY
  213. void set_gatelogin(char *glogin, int unset)
  214. {
  215.     if (unset || !glogin) {
  216.         gate_login[0] = gateway[0] = 0;
  217.     } else
  218.         (void) strcpy(gate_login, glogin);
  219. }    /* set_gatelogin */
  220. #endif
  221.  
  222.  
  223.  
  224.  
  225. struct var *match_var(char *varname)
  226. {
  227.     int i, c, ambig;
  228.     struct var *v;
  229.  
  230.     c = strlen(varname);
  231.     for (i=0, v=vars; i<NVARS; i++, v++) {
  232.         if (strcmp(v->name, varname) == 0)
  233.             return v;    /* exact match. */
  234.         if (c < v->nmlen) {
  235.             if (strncmp(v->name, varname, c) == 0) {
  236.                 /* Now make sure that it only matches one var name. */
  237.                 if (c >= v[1].nmlen || (i == (NVARS - 1)))
  238.                     ambig = 0;
  239.                 else
  240.                     ambig = !strncmp(v[1].name, varname, c);
  241.                 if (!ambig)
  242.                     return v;
  243.                 (void) fprintf(stderr, "%s: ambiguous variable name.\n", varname);
  244.                 goto xx;
  245.             }
  246.         }
  247.     }
  248.     (void) fprintf(stderr, "%s: unknown variable.\n", varname);
  249. xx:
  250.     return ((struct var *)0);
  251. }    /* match_var */
  252.  
  253.  
  254.  
  255.  
  256. void show_var(struct var *v)
  257. {
  258.     int c;
  259.  
  260.     if (v != (struct var *)0) {
  261.         (void) printf("%-20s= ", v->name);
  262.         c = v->type;
  263.         if (c < 0) c = -c;
  264.         if (v->conn_required && !connected)
  265.             (void) printf("(not connected)\n");
  266.         else switch (c) {
  267.             case INT:
  268.                 (void) printf("%d\n", *(int *)v->var); break;
  269.             case LONG:
  270.                 (void) printf("%ld\n", *(long *)v->var); break;
  271.             case STR:
  272.                 (void) printf("\"%s\"\n", (char *)v->var); break;
  273.             case BOOL:
  274.                 (void) printf("%s\n", *(int *)v->var == 0 ? "no" : "yes");
  275.         }
  276.     }
  277. }    /* show_var */
  278.  
  279.  
  280.  
  281.  
  282. void show(char *varname)
  283. {
  284.     int i;
  285.     struct var *v;
  286.  
  287.     if ((varname == NULL)    /* (Denotes show all vars) */
  288.         || (strcmp("all", varname) == 0))
  289.     {
  290.         for (i=0; i<NVARS; i++)
  291.             show_var(&vars[i]);
  292.     } else {
  293.         if ((v = match_var(varname)) != (struct var *)0)
  294.             show_var(v);
  295.     }
  296. }    /* show */
  297.  
  298.  
  299.  
  300.  
  301. int do_show(int argc, char **argv)
  302. {
  303.     int i;
  304.  
  305.     if (argc < 2)
  306.         show(NULL);
  307.     else
  308.         for (i=1; i<argc; i++)
  309.             show(argv[i]);
  310.     return NOERR;
  311. }    /* do_show */
  312.  
  313.  
  314.  
  315.  
  316. int set(int argc, char **argv)
  317. {
  318.     int unset;
  319.     struct var *v;
  320.     char *var, *val = NULL;
  321.  
  322.     if (argc < 2 || strncmp(argv[1], "all", (size_t)3) == 0) {
  323.         show(NULL);        /* show all variables. */
  324.     } else {
  325.         unset = argv[0][0] == 'u';
  326.         var = argv[1];
  327.         if (argc > 2) {
  328.             /* could be '= value' or just 'value.' */
  329.             if (*argv[2] == '=') {
  330.                 if (argc > 3)
  331.                     val = argv[3];
  332.                 else return USAGE;    /* can't do 'set var =' */
  333.             } else
  334.                 val = argv[2];
  335.             if (val[0] == 0)
  336.                 val = NULL;
  337.         }
  338.         v = match_var(var);
  339.         if (v != NULL) {
  340.             if (v->conn_required && !connected)
  341.                 (void) fprintf(stderr, "%s: must be connected.\n", var);
  342.             else if (v->type < 0)    
  343.                 (void) fprintf(stderr, "%s: read-only variable.\n", var);
  344.             else if (v->proc != (setvarproc) 0) {
  345.                 (*v->proc)(val, unset);        /* a custom set proc. */
  346.             } else if (unset) switch(v->type) {
  347.                 case BOOL:
  348.                 case INT:
  349.                     *(int *) v->var = 0; break;
  350.                 case LONG:
  351.                     *(long *) v->var = 0; break;
  352.                 case STR:
  353.                     *(char *) v->var = 0; break;
  354.             } else {
  355.                 if (val == NULL) switch(v->type) {
  356.                     /* User just said "set varname" */
  357.                     case BOOL:
  358.                     case INT:
  359.                         *(int *) v->var = 1; break;
  360.                     case LONG:
  361.                         *(long *) v->var = 1; break;
  362.                     case STR:
  363.                         *(char *) v->var = 0; break;
  364.                 } else {
  365.                     /* User said "set varname = value" */
  366.                     switch (v->type) {
  367.                         case BOOL:
  368.                             *(int *)v->var = StrToBool(val); break;
  369.                         case INT:
  370.                             (void) sscanf(val, "%d", (int *) v->var); break;
  371.                         case LONG:
  372.                             (void) sscanf(val, "%ld", (long *) v->var); break;
  373.                         case STR:
  374.                             (void) strcpy(v->var, val); break;
  375.                     }
  376.                 }
  377.             }
  378.         }
  379.     }
  380.     return NOERR;
  381. }    /* set */
  382.  
  383. /* eof Set.c */
  384. @
  385.