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);
 
