summaryrefslogtreecommitdiff
path: root/scp.c
diff options
context:
space:
mode:
authorBen Lindstrom <mouring@eviladmin.org>2001-05-08 20:27:25 +0000
committerBen Lindstrom <mouring@eviladmin.org>2001-05-08 20:27:25 +0000
commit387c472660ef173c2e469e70eb1a25d47f6e8887 (patch)
tree4686516a373bbb5ca9594c4cb285aedc6a72aa8d /scp.c
parent69128668938c82e8d428e77726ef00b2b6f799b9 (diff)
- 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
Diffstat (limited to 'scp.c')
-rw-r--r--scp.c55
1 files changed, 13 insertions, 42 deletions
diff --git a/scp.c b/scp.c
index 10b77af6d..52fd513c6 100644
--- a/scp.c
+++ b/scp.c
@@ -75,7 +75,7 @@
75 */ 75 */
76 76
77#include "includes.h" 77#include "includes.h"
78RCSID("$OpenBSD: scp.c,v 1.69 2001/05/03 23:09:53 mouring Exp $"); 78RCSID("$OpenBSD: scp.c,v 1.70 2001/05/08 19:45:24 mouring Exp $");
79 79
80#include "xmalloc.h" 80#include "xmalloc.h"
81#include "atomicio.h" 81#include "atomicio.h"
@@ -107,8 +107,8 @@ void progressmeter(int);
107int getttywidth(void); 107int getttywidth(void);
108int do_cmd(char *host, char *remuser, char *cmd, int *fdin, int *fdout, int argc); 108int do_cmd(char *host, char *remuser, char *cmd, int *fdin, int *fdout, int argc);
109 109
110/* setup arguments for the call to ssh */ 110/* Struct for addargs */
111void addargs(char *fmt, ...) __attribute__((format(printf, 1, 2))); 111arglist args;
112 112
113/* Time a transfer started. */ 113/* Time a transfer started. */
114static struct timeval start; 114static struct timeval start;
@@ -131,13 +131,6 @@ int showprogress = 1;
131/* This is the program to execute for the secured connection. ("ssh" or -S) */ 131/* This is the program to execute for the secured connection. ("ssh" or -S) */
132char *ssh_program = _PATH_SSH_PROGRAM; 132char *ssh_program = _PATH_SSH_PROGRAM;
133 133
134/* This is the list of arguments that scp passes to ssh */
135struct {
136 char **list;
137 int num;
138 int nalloc;
139} args;
140
141/* 134/*
142 * This function executes the given command as the specified user on the 135 * This function executes the given command as the specified user on the
143 * given host. This returns < 0 if execution fails, and >= 0 otherwise. This 136 * given host. This returns < 0 if execution fails, and >= 0 otherwise. This
@@ -181,9 +174,9 @@ do_cmd(char *host, char *remuser, char *cmd, int *fdin, int *fdout, int argc)
181 174
182 args.list[0] = ssh_program; 175 args.list[0] = ssh_program;
183 if (remuser != NULL) 176 if (remuser != NULL)
184 addargs("-l%s", remuser); 177 addargs(&args, "-l%s", remuser);
185 addargs("%s", host); 178 addargs(&args, "%s", host);
186 addargs("%s", cmd); 179 addargs(&args, "%s", cmd);
187 180
188 execvp(ssh_program, args.list); 181 execvp(ssh_program, args.list);
189 perror(ssh_program); 182 perror(ssh_program);
@@ -238,9 +231,9 @@ main(argc, argv)
238 __progname = get_progname(argv[0]); 231 __progname = get_progname(argv[0]);
239 232
240 args.list = NULL; 233 args.list = NULL;
241 addargs("ssh"); /* overwritten with ssh_program */ 234 addargs(&args, "ssh"); /* overwritten with ssh_program */
242 addargs("-x"); 235 addargs(&args, "-x");
243 addargs("-oFallBackToRsh no"); 236 addargs(&args, "-oFallBackToRsh no");
244 237
245 fflag = tflag = 0; 238 fflag = tflag = 0;
246 while ((ch = getopt(argc, argv, "dfprtvBCc:i:P:q46S:o:")) != -1) 239 while ((ch = getopt(argc, argv, "dfprtvBCc:i:P:q46S:o:")) != -1)
@@ -249,18 +242,18 @@ main(argc, argv)
249 case '4': 242 case '4':
250 case '6': 243 case '6':
251 case 'C': 244 case 'C':
252 addargs("-%c", ch); 245 addargs(&args, "-%c", ch);
253 break; 246 break;
254 case 'o': 247 case 'o':
255 case 'c': 248 case 'c':
256 case 'i': 249 case 'i':
257 addargs("-%c%s", ch, optarg); 250 addargs(&args, "-%c%s", ch, optarg);
258 break; 251 break;
259 case 'P': 252 case 'P':
260 addargs("-p%s", optarg); 253 addargs(&args, "-p%s", optarg);
261 break; 254 break;
262 case 'B': 255 case 'B':
263 addargs("-oBatchmode yes"); 256 addargs(&args, "-oBatchmode yes");
264 break; 257 break;
265 case 'p': 258 case 'p':
266 pflag = 1; 259 pflag = 1;
@@ -1212,25 +1205,3 @@ getttywidth(void)
1212 else 1205 else
1213 return (80); 1206 return (80);
1214} 1207}
1215
1216void
1217addargs(char *fmt, ...)
1218{
1219 va_list ap;
1220 char buf[1024];
1221
1222 va_start(ap, fmt);
1223 vsnprintf(buf, sizeof(buf), fmt, ap);
1224 va_end(ap);
1225
1226 if (args.list == NULL) {
1227 args.nalloc = 32;
1228 args.num = 0;
1229 args.list = xmalloc(args.nalloc * sizeof(char *));
1230 } else if (args.num+2 >= args.nalloc) {
1231 args.nalloc *= 2;
1232 args.list = xrealloc(args.list, args.nalloc * sizeof(char *));
1233 }
1234 args.list[args.num++] = xstrdup(buf);
1235 args.list[args.num] = NULL;
1236}