diff options
author | ache <ache@FreeBSD.org> | 1994-09-22 23:45:37 +0000 |
---|---|---|
committer | ache <ache@FreeBSD.org> | 1994-09-22 23:45:37 +0000 |
commit | 41cb9decc65e51e29f0eb6fe06bcb3594726bd6b (patch) | |
tree | 31cb31bfb69915fc791ce9c2ec7d345124bedebf /usr.bin/ncftp/set.c | |
download | FreeBSD-src-41cb9decc65e51e29f0eb6fe06bcb3594726bd6b.zip FreeBSD-src-41cb9decc65e51e29f0eb6fe06bcb3594726bd6b.tar.gz |
ncftp 1.8.5
Diffstat (limited to 'usr.bin/ncftp/set.c')
-rw-r--r-- | usr.bin/ncftp/set.c | 367 |
1 files changed, 367 insertions, 0 deletions
diff --git a/usr.bin/ncftp/set.c b/usr.bin/ncftp/set.c new file mode 100644 index 0000000..14d8715 --- /dev/null +++ b/usr.bin/ncftp/set.c @@ -0,0 +1,367 @@ +/* Set.c */ + +/* $RCSfile: set.c,v $ + * $Revision: 14020.12 $ + * $Date: 93/07/09 11:45:48 $ + */ + +#include "sys.h" + +#include <ctype.h> + +#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; i<NVARS; i++, v++) { + if (strcmp(v->name, 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<NVARS; i++) + show_var(&vars[i]); + } else { + if ((v = match_var(varname)) != (struct var *)0) + show_var(v); + } +} /* show */ + + + + +int do_show(int argc, char **argv) +{ + int i; + + if (argc < 2) + show(NULL); + else + for (i=1; i<argc; i++) + show(argv[i]); + return NOERR; +} /* do_show */ + + + + +int set(int argc, char **argv) +{ + int unset; + struct var *v; + char *var, *val = NULL; + + if (argc < 2 || strncmp(argv[1], "all", (size_t)3) == 0) { + show(NULL); /* show all variables. */ + } else { + unset = argv[0][0] == 'u'; + var = argv[1]; + if (argc > 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 */ |