summaryrefslogtreecommitdiffstats
path: root/usr.bin/ncftp/set.c
diff options
context:
space:
mode:
authorache <ache@FreeBSD.org>1994-09-22 23:45:37 +0000
committerache <ache@FreeBSD.org>1994-09-22 23:45:37 +0000
commit41cb9decc65e51e29f0eb6fe06bcb3594726bd6b (patch)
tree31cb31bfb69915fc791ce9c2ec7d345124bedebf /usr.bin/ncftp/set.c
downloadFreeBSD-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.c367
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 */
OpenPOWER on IntegriCloud