View | Details | Raw Unified | Return to bug 1094 | Differences between
and this patch

Collapse All | Expand All

(-)openssh-4.2p1/scp.c.no-system (-39 / +90 lines)
Lines 185-190 Link Here
185
	return 0;
185
	return 0;
186
}
186
}
187
187
188
int
189
do_spawnwait(arglist *alist)
190
{
191
	int status;
192
193
	if (verbose_mode) {
194
		int i;
195
		
196
		fprintf(stderr, "Executing:");
197
		for (i = 0; alist->list[i] != NULL; i++) {
198
			fprintf(stderr, " %s", alist->list[i]);
199
		}
200
		fprintf(stderr, "\n");
201
	}
202
	/* Fork a child to execute the command. */
203
	do_cmd_pid = fork();
204
	if (do_cmd_pid == 0) {
205
		/* Child. */
206
207
		execvp(alist->list[0], alist->list);
208
		perror(alist->list[0]);
209
		exit(1);
210
	} else if (do_cmd_pid == -1) {
211
		fatal("fork: %s", strerror(errno));
212
	}
213
	signal(SIGTERM, killchild);
214
	signal(SIGINT, killchild);
215
	signal(SIGHUP, killchild);
216
	
217
	while (waitpid(do_cmd_pid, &status, 0) != do_cmd_pid) {
218
	    if (errno != EINTR) {
219
		fatal("waitpid: %s", strerror(errno));
220
	    }
221
	}
222
	if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
223
	    return 1;
224
225
	return 0;
226
}
227
188
typedef struct {
228
typedef struct {
189
	size_t cnt;
229
	size_t cnt;
190
	char *buf;
230
	char *buf;
Lines 360-369 Link Here
360
}
400
}
361
401
362
void
402
void
403
clearargs(arglist *alist)
404
{
405
	int i = alist->num;
406
	while (i > 0) {
407
		i--;
408
		if (alist->list[i]) {
409
			xfree(alist->list[i]);
410
			alist->list[i] = NULL;
411
		}
412
	}
413
	alist->num = 0;
414
}
415
416
void
363
toremote(char *targ, int argc, char **argv)
417
toremote(char *targ, int argc, char **argv)
364
{
418
{
365
	int i, len;
419
	int i, len;
366
	char *bp, *host, *src, *suser, *thost, *tuser, *arg;
420
	char *bp, *host, *src, *suser, *thost, *tuser, *arg;
421
	arglist alist;
422
	memset(&alist, 0, sizeof(alist));
423
367
424
368
	*targ++ = 0;
425
	*targ++ = 0;
369
	if (*targ == 0)
426
	if (*targ == 0)
Lines 381-400 Link Here
381
		tuser = NULL;
438
		tuser = NULL;
382
	}
439
	}
383
440
441
	if (tuser && !okname(tuser)) {
442
		xfree(arg);
443
		return;
444
	}
445
384
	for (i = 0; i < argc - 1; i++) {
446
	for (i = 0; i < argc - 1; i++) {
385
		src = colon(argv[i]);
447
		src = colon(argv[i]);
386
		if (src) {	/* remote to remote */
448
		if (src) {	/* remote to remote */
387
			static char *ssh_options =
449
			clearargs(&alist);
388
			    "-x -o'ClearAllForwardings yes'";
450
			addargs(&alist, "%s", ssh_program);
451
			if (verbose_mode)
452
				addargs(&alist, "-v");
453
			addargs(&alist, "-x");
454
			addargs(&alist, "-oClearAllForwardings yes");
455
			addargs(&alist, "-n");
389
			*src++ = 0;
456
			*src++ = 0;
390
			if (*src == 0)
457
			if (*src == 0)
391
				src = ".";
458
				src = ".";
392
			host = strrchr(argv[i], '@');
459
			host = strrchr(argv[i], '@');
393
			len = strlen(ssh_program) + strlen(argv[i]) +
460
			
394
			    strlen(src) + (tuser ? strlen(tuser) : 0) +
395
			    strlen(thost) + strlen(targ) +
396
			    strlen(ssh_options) + CMDNEEDS + 20;
397
			bp = xmalloc(len);
398
			if (host) {
461
			if (host) {
399
				*host++ = 0;
462
				*host++ = 0;
400
				host = cleanhostname(host);
463
				host = cleanhostname(host);
Lines 402-436 Link Here
402
				if (*suser == '\0')
465
				if (*suser == '\0')
403
					suser = pwd->pw_name;
466
					suser = pwd->pw_name;
404
				else if (!okname(suser)) {
467
				else if (!okname(suser)) {
405
					xfree(bp);
406
					continue;
407
				}
408
				if (tuser && !okname(tuser)) {
409
					xfree(bp);
410
					continue;
468
					continue;
411
				}
469
				}
412
				snprintf(bp, len,
470
				addargs(&alist, "-l");
413
				    "%s%s %s -n "
471
				addargs(&alist, "%s", suser);
414
				    "-l %s %s %s %s '%s%s%s:%s'",
415
				    ssh_program, verbose_mode ? " -v" : "",
416
				    ssh_options, suser, host, cmd, src,
417
				    tuser ? tuser : "", tuser ? "@" : "",
418
				    thost, targ);
419
			} else {
472
			} else {
420
				host = cleanhostname(argv[i]);
473
				host = cleanhostname(argv[i]);
421
				snprintf(bp, len,
474
			}
422
				    "exec %s%s %s -n %s "
475
			
423
				    "%s %s '%s%s%s:%s'",
476
			addargs(&alist, "%s", host);
424
				    ssh_program, verbose_mode ? " -v" : "",
477
			addargs(&alist, "%s", cmd);
425
				    ssh_options, host, cmd, src,
478
			addargs(&alist, "%s", src);
479
			addargs(&alist, "%s%s%s:%s",
426
				    tuser ? tuser : "", tuser ? "@" : "",
480
				    tuser ? tuser : "", tuser ? "@" : "",
427
				    thost, targ);
481
				    thost, targ);
428
			}
482
			if (do_spawnwait(&alist) != 0)
429
			if (verbose_mode)
430
				fprintf(stderr, "Executing: %s\n", bp);
431
			if (system(bp) != 0)
432
				errs = 1;
483
				errs = 1;
433
			(void) xfree(bp);
434
		} else {	/* local to remote */
484
		} else {	/* local to remote */
435
			if (remin == -1) {
485
			if (remin == -1) {
436
				len = strlen(targ) + CMDNEEDS + 20;
486
				len = strlen(targ) + CMDNEEDS + 20;
Lines 454-473 Link Here
454
{
504
{
455
	int i, len;
505
	int i, len;
456
	char *bp, *host, *src, *suser;
506
	char *bp, *host, *src, *suser;
507
	arglist alist;
508
	memset(&alist, 0, sizeof(alist));
457
509
458
	for (i = 0; i < argc - 1; i++) {
510
	for (i = 0; i < argc - 1; i++) {
459
		if (!(src = colon(argv[i]))) {	/* Local to local. */
511
		if (!(src = colon(argv[i]))) {	/* Local to local. */
460
			len = strlen(_PATH_CP) + strlen(argv[i]) +
512
			clearargs(&alist);
461
			    strlen(argv[argc - 1]) + 20;
513
			addargs(&alist, "%s", _PATH_CP);
462
			bp = xmalloc(len);
514
			if (iamrecursive)
463
			(void) snprintf(bp, len, "exec %s%s%s %s %s", _PATH_CP,
515
				addargs(&alist, "-r");
464
			    iamrecursive ? " -r" : "", pflag ? " -p" : "",
516
			if (pflag)
465
			    argv[i], argv[argc - 1]);
517
				addargs(&alist, "-p");
466
			if (verbose_mode)
518
			addargs(&alist, "%s", argv[i]);
467
				fprintf(stderr, "Executing: %s\n", bp);
519
			addargs(&alist, "%s", argv[argc-1]);
468
			if (system(bp))
520
			if (do_spawnwait(&alist))
469
				++errs;
521
				++errs;
470
			(void) xfree(bp);
471
			continue;
522
			continue;
472
		}
523
		}
473
		*src++ = 0;
524
		*src++ = 0;

Return to bug 1094