- mouring@cvs.openbsd.org 2001/05/08 19:45:25
     [misc.c misc.h scp.c sftp.c]
     Use addargs() in sftp plus some clean up of addargs().  OK Markus
diff --git a/sftp.c b/sftp.c
index 895e0e1..dd8c08b 100644
--- a/sftp.c
+++ b/sftp.c
@@ -24,7 +24,7 @@
 
 #include "includes.h"
 
-RCSID("$OpenBSD: sftp.c,v 1.16 2001/05/03 23:09:53 mouring Exp $");
+RCSID("$OpenBSD: sftp.c,v 1.17 2001/05/08 19:45:25 mouring Exp $");
 
 /* XXX: commandline mode */
 /* XXX: short-form remote directory listings (like 'ls -C') */
@@ -46,9 +46,7 @@
 char *__progname;
 #endif
 
-int use_ssh1 = 0;
 char *ssh_program = _PATH_SSH_PROGRAM;
-char *sftp_server = NULL;
 FILE* infile;
 
 void
@@ -92,58 +90,6 @@
 	close(c_out);
 }
 
-char **
-make_ssh_args(char *add_arg)
-{
-	static char **args = NULL;
-	static int nargs = 0;
-	char debug_buf[4096];
-	int i;
-
-	/* Init args array */
-	if (args == NULL) {
-		nargs = 2;
-		i = 0;
-		args = xmalloc(sizeof(*args) * nargs);
-		args[i++] = "ssh";
-		args[i++] = NULL;
-	}
-
-	/* If asked to add args, then do so and return */
-	if (add_arg) {
-		i = nargs++ - 1;
-		args = xrealloc(args, sizeof(*args) * nargs);
-		args[i++] = add_arg;
-		args[i++] = NULL;
-		return(NULL);
-	}
-
-	/* no subsystem if the server-spec contains a '/' */
-	if (sftp_server == NULL || strchr(sftp_server, '/') == NULL)
-		make_ssh_args("-s");
-	make_ssh_args("-oForwardX11=no");
-	make_ssh_args("-oForwardAgent=no");
-	make_ssh_args(use_ssh1 ? "-oProtocol=1" : "-oProtocol=2");
-
-	/* Otherwise finish up and return the arg array */
-	if (sftp_server != NULL)
-		make_ssh_args(sftp_server);
-	else
-		make_ssh_args("sftp");
-
-	/* XXX: overflow - doesn't grow debug_buf */
-	debug_buf[0] = '\0';
-	for(i = 0; args[i]; i++) {
-		if (i)
-			strlcat(debug_buf, " ", sizeof(debug_buf));
-
-		strlcat(debug_buf, args[i], sizeof(debug_buf));
-	}
-	debug("SSH args \"%s\"", debug_buf);
-
-	return(args);
-}
-
 void
 usage(void)
 {
@@ -154,32 +100,42 @@
 int
 main(int argc, char **argv)
 {
-	int in, out, ch, debug_level, compress_flag;
+	int in, out, ch;
 	pid_t sshpid;
-	char *file1 = NULL;
 	char *host, *userhost, *cp, *file2;
-	LogLevel ll;
+	int debug_level = 0, sshver = 2;
+	char *file1 = NULL, *sftp_server = NULL;
+	LogLevel ll = SYSLOG_LEVEL_INFO;
+	arglist args;
 	extern int optind;
 	extern char *optarg;
 
 	__progname = get_progname(argv[0]);
-	infile = stdin;         /* Read from STDIN unless changed by -b */
-	debug_level = compress_flag = 0;
+	args.list = NULL;
+	addargs(&args, "ssh");         /* overwritten with ssh_program */
+	addargs(&args, "-oFallBackToRsh no");
+	addargs(&args, "-oForwardX11 no");
+	addargs(&args, "-oForwardAgent no");
+	ll = SYSLOG_LEVEL_INFO;
+	infile = stdin;		/* Read from STDIN unless changed by -b */
 
 	while ((ch = getopt(argc, argv, "1hvCo:s:S:b:")) != -1) {
 		switch (ch) {
 		case 'C':
-			compress_flag = 1;
+			addargs(&args, "-C");
 			break;
 		case 'v':
-			debug_level = MIN(3, debug_level + 1);
+			if (debug_level < 3) {
+				addargs(&args, "-v");
+				ll = SYSLOG_LEVEL_DEBUG1 + debug_level;
+			}
+			debug_level++;
 			break;
 		case 'o':
-			make_ssh_args("-o");
-			make_ssh_args(optarg);
+			addargs(&args, "-o%s", optarg);
 			break;
 		case '1':
-			use_ssh1 = 1;
+			sshver = 1;
 			if (sftp_server == NULL)
 				sftp_server = _PATH_SFTP_SERVER;
 			break;
@@ -222,8 +178,7 @@
 			fprintf(stderr, "Missing username\n");
 			usage();
 		}
-		make_ssh_args("-l");
-		make_ssh_args(userhost);
+		addargs(&args, "-l%s",userhost);
 	}
 
 	host = cleanhostname(host);
@@ -232,36 +187,20 @@
 		usage();
 	}
 
-	/* Set up logging and debug '-d' arguments to ssh */
-	ll = SYSLOG_LEVEL_INFO;
-	switch (debug_level) {
-	case 1:
-		ll = SYSLOG_LEVEL_DEBUG1;
-		make_ssh_args("-v");
-		break;
-	case 2:
-		ll = SYSLOG_LEVEL_DEBUG2;
-		make_ssh_args("-v");
-		make_ssh_args("-v");
-		break;
-	case 3:
-		ll = SYSLOG_LEVEL_DEBUG3;
-		make_ssh_args("-v");
-		make_ssh_args("-v");
-		make_ssh_args("-v");
-		break;
-	}
-
-	if (compress_flag)
-		make_ssh_args("-C");
-
 	log_init(argv[0], ll, SYSLOG_FACILITY_USER, 1);
+	addargs(&args, "-oProtocol %d", sshver);
 
-	make_ssh_args(host);
+	/* no subsystem if the server-spec contains a '/' */
+	if (sftp_server == NULL || strchr(sftp_server, '/') == NULL) 
+		addargs(&args, "-s");
+
+	addargs(&args, "%s", host);
+	addargs(&args, "%s", (sftp_server != NULL ? sftp_server : "sftp"));
+	args.list[0] = ssh_program;
 
 	fprintf(stderr, "Connecting to %s...\n", host);
 
-	connect_to_server(make_ssh_args(NULL), &in, &out, &sshpid);
+	connect_to_server(args.list, &in, &out, &sshpid);
 
 	interactive_loop(in, out, file1, file2);