home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume40 / ncftp / part04 / set.c < prev   
C/C++ Source or Header  |  1993-11-02  |  8KB  |  368 lines

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