/* Set.c */ /* $RCSfile: set.c,v $ * $Revision: 14020.12 $ * $Date: 93/07/09 11:45:48 $ */ #include "sys.h" #include #include "util.h" #include "cmds.h" #include "main.h" #include "set.h" #include "defaults.h" #include "copyright.h" #ifdef TERM_FTP extern int compress_toggle; #endif /* Set.c globals: */ char *verbose_msgs[4] = { "Not printing anything.\n", "Only printing necessary error messages.\n", "Printing error messages and announcements from the remote host.\n", "Printing all messages, errors, acknowledgments, and announcements.\n" }; char *short_verbose_msgs[4] = { "Quiet (-1)", "Errors Only (0)", "Terse (1)", "Verbose (2)" }; string vstr; /* Set.c externs: */ extern int progress_meter, connected; extern int parsing_rc, keep_recent; extern string pager, anon_password, prompt; extern str32 curtypename; extern long logsize; extern FILE *logf; extern longstring rcname, logfname, lcwd; extern int auto_binary, ansi_escapes, debug; extern int mprompt, remote_is_unix, verbose; extern int startup_msg, anon_open; #ifndef NO_TIPS extern int tips; #endif #ifdef GATEWAY extern string gateway, gate_login; #endif /* The variables must be sorted in alphabetical order, or else * match_var() will choke. */ struct var vars[] = { VARENTRY("anon-open", BOOL, 0, &anon_open, NULL), VARENTRY("anon-password", STR, 0, anon_password, NULL), VARENTRY("ansi-escapes", BOOL, 0, &ansi_escapes, NULL), VARENTRY("auto-binary", BOOL, 0, &auto_binary, NULL), #ifdef TERM_FTP VARENTRY("compress", INT, 0, &compress_toggle,NULL), #endif VARENTRY("debug", INT, 0, &debug, NULL), #ifdef GATEWAY VARENTRY("gateway-login", STR, 0, gate_login, set_gatelogin), VARENTRY("gateway-host", STR, 0, gateway, NULL), #endif VARENTRY("local-dir", STR, 0, lcwd, set_ldir), VARENTRY("logfile", STR, 0, logfname, set_log), VARENTRY("logsize", LONG, 0, &logsize, NULL), VARENTRY("mprompt", BOOL, 0, &mprompt, NULL), VARENTRY("netrc", -STR, 0, rcname, NULL), VARENTRY("pager", STR, 0, pager + 1, set_pager), VARENTRY("prompt", STR, 0, prompt, set_prompt), VARENTRY("progress-reports",INT, 0, &progress_meter,NULL), VARENTRY("recent-list", BOOL, 0, &keep_recent, NULL), VARENTRY("remote-is-unix", BOOL, 1, &remote_is_unix,NULL), VARENTRY("startup-msg", BOOL, 0, &startup_msg, NULL), /* TAR */ #ifndef NO_TIPS VARENTRY("tips", BOOL, 0, &tips, NULL), #endif VARENTRY("type", STR, 1, curtypename, set_type), VARENTRY("verbose", STR, 0, vstr, set_verbose), }; void set_verbose(char *new, int unset) { int i, c; if (unset == -1) verbose = !verbose; else if (unset || !new) verbose = V_ERRS; else { if (isalpha(*new)) { c = islower(*new) ? toupper(*new) : *new; for (i=0; i<(int)(sizeof(short_verbose_msgs)/sizeof(char *)); i++) { if (short_verbose_msgs[i][0] == c) verbose = i - 1; } } else { i = atoi(new); if (i < V_QUIET) i = V_QUIET; else if (i > V_VERBOSE) i = V_VERBOSE; verbose = i; } } (void) Strncpy(vstr, short_verbose_msgs[verbose+1]); if (!parsing_rc && NOT_VQUIET) (void) fputs(verbose_msgs[verbose+1], stdout); } /* set_verbose */ void set_prompt(char *new, int unset) { (void) Strncpy(prompt, (unset || !new) ? dPROMPT : new); init_prompt(); } /* set_prompt */ void set_log(char *fname, int unset) { if (logf) { (void) fclose(logf); logf = NULL; } if (!unset && fname) { (void) Strncpy(logfname, fname); logf = fopen (LocalDotPath(logfname), "a"); } } /* set_log */ void set_pager(char *new, int unset) { if (unset) (void) strcpy(pager, "-"); else { if (!new) new = dPAGER; if (!new[0]) (void) Strncpy(pager, "-"); else { (void) sprintf(pager, "|%s", (*new == '|' ? new + 1 : new)); (void) LocalPath(pager + 1); } } } /* set_pager */ void set_type(char *newtype, int unset) { int t = verbose; verbose = V_QUIET; if (!connected && t > V_QUIET) (void) printf("Not connected.\n"); else if (newtype != NULL && !unset) (void) _settype(newtype); verbose = t; } /* set_type */ void set_ldir(char *ldir, int unset) { int t = verbose; char *argv[2]; if (ldir && !unset) { verbose = V_QUIET; argv[1] = ldir; (void) lcd(2, argv); verbose = t; } } /* set_ldir */ #ifdef GATEWAY void set_gatelogin(char *glogin, int unset) { if (unset || !glogin) { gate_login[0] = gateway[0] = 0; } else (void) strcpy(gate_login, glogin); } /* set_gatelogin */ #endif struct var *match_var(char *varname) { int i, ambig; struct var *v; short c; c = (short) strlen(varname); for (i=0, v=vars; iname, varname) == 0) return v; /* exact match. */ if (c < v->nmlen) { if (strncmp(v->name, varname, (size_t) c) == 0) { /* Now make sure that it only matches one var name. */ if (c >= v[1].nmlen || (i == (NVARS - 1))) ambig = 0; else ambig = !strncmp(v[1].name, varname, (size_t) c); if (!ambig) return v; (void) fprintf(stderr, "%s: ambiguous variable name.\n", varname); goto xx; } } } (void) fprintf(stderr, "%s: unknown variable.\n", varname); xx: return ((struct var *)0); } /* match_var */ void show_var(struct var *v) { int c; if (v != (struct var *)0) { (void) printf("%-20s= ", v->name); c = v->type; if (c < 0) c = -c; if (v->conn_required && !connected) (void) printf("(not connected)\n"); else switch (c) { case INT: (void) printf("%d\n", *(int *)v->var); break; case LONG: (void) printf("%ld\n", *(long *)v->var); break; case STR: (void) printf("\"%s\"\n", (char *)v->var); break; case BOOL: (void) printf("%s\n", *(int *)v->var == 0 ? "no" : "yes"); } } } /* show_var */ void show(char *varname) { int i; struct var *v; if ((varname == NULL) /* (Denotes show all vars) */ || (strcmp("all", varname) == 0)) { for (i=0; i 2) { /* could be '= value' or just 'value.' */ if (*argv[2] == '=') { if (argc > 3) val = argv[3]; else return USAGE; /* can't do 'set var =' */ } else val = argv[2]; if (val[0] == 0) val = NULL; } v = match_var(var); if (v != NULL) { if (v->conn_required && !connected) (void) fprintf(stderr, "%s: must be connected.\n", var); else if (v->type < 0) (void) fprintf(stderr, "%s: read-only variable.\n", var); else if (v->proc != (setvarproc) 0) { (*v->proc)(val, unset); /* a custom set proc. */ } else if (unset) switch(v->type) { case BOOL: case INT: *(int *) v->var = 0; break; case LONG: *(long *) v->var = 0; break; case STR: *(char *) v->var = 0; break; } else { if (val == NULL) switch(v->type) { /* User just said "set varname" */ case BOOL: case INT: *(int *) v->var = 1; break; case LONG: *(long *) v->var = 1; break; case STR: *(char *) v->var = 0; break; } else { /* User said "set varname = value" */ switch (v->type) { case BOOL: *(int *)v->var = StrToBool(val); break; case INT: (void) sscanf(val, "%d", (int *) v->var); break; case LONG: (void) sscanf(val, "%ld", (long *) v->var); break; case STR: (void) strcpy(v->var, val); break; } } } } } return NOERR; } /* set */ /* eof Set.c */