[BACK]Return to scp.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / ssh

Diff for /src/usr.bin/ssh/scp.c between version 1.128 and 1.129

version 1.128, 2005/12/06 22:38:27 version 1.129, 2006/01/31 10:19:02
Line 118 
Line 118 
         exit(1);          exit(1);
 }  }
   
   static int
   do_local_cmd(arglist *a)
   {
           u_int i;
           int status;
           pid_t pid;
   
           if (a->num == 0)
                   fatal("do_local_cmd: no arguments");
   
           if (verbose_mode) {
                   fprintf(stderr, "Executing:");
                   for (i = 0; i < a->num; i++)
                           fprintf(stderr, " %s", a->list[i]);
                   fprintf(stderr, "\n");
           }
           if ((pid = fork()) == -1)
                   fatal("do_local_cmd: fork: %s", strerror(errno));
   
           if (pid == 0) {
                   execvp(a->list[0], a->list);
                   perror(a->list[0]);
                   exit(1);
           }
   
           do_cmd_pid = pid;
           signal(SIGTERM, killchild);
           signal(SIGINT, killchild);
           signal(SIGHUP, killchild);
   
           while (waitpid(pid, &status, 0) == -1)
                   if (errno != EINTR)
                           fatal("do_local_cmd: waitpid: %s", strerror(errno));
   
           do_cmd_pid = -1;
   
           if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
                   return (-1);
   
           return (0);
   }
   
 /*  /*
  * This function executes the given command as the specified user on the   * This function executes the given command as the specified user on the
  * given host.  This returns < 0 if execution fails, and >= 0 otherwise. This   * given host.  This returns < 0 if execution fails, and >= 0 otherwise. This
Line 162 
Line 204 
                 close(pin[0]);                  close(pin[0]);
                 close(pout[1]);                  close(pout[1]);
   
                 args.list[0] = ssh_program;                  replacearg(&args, 0, "%s", ssh_program);
                 if (remuser != NULL)                  if (remuser != NULL)
                         addargs(&args, "-l%s", remuser);                          addargs(&args, "-l%s", remuser);
                 addargs(&args, "%s", host);                  addargs(&args, "%s", host);
Line 225 
Line 267 
         /* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */          /* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */
         sanitise_stdfd();          sanitise_stdfd();
   
           memset(&args, '\0', sizeof(args));
         args.list = NULL;          args.list = NULL;
         addargs(&args, "ssh");          /* overwritten with ssh_program */          addargs(&args, "%s", ssh_program);
         addargs(&args, "-x");          addargs(&args, "-x");
         addargs(&args, "-oForwardAgent no");          addargs(&args, "-oForwardAgent no");
         addargs(&args, "-oPermitLocalCommand no");          addargs(&args, "-oPermitLocalCommand no");
Line 363 
Line 406 
 {  {
         int i, len;          int i, len;
         char *bp, *host, *src, *suser, *thost, *tuser, *arg;          char *bp, *host, *src, *suser, *thost, *tuser, *arg;
           arglist alist;
   
           memset(&alist, '\0', sizeof(alist));
           alist.list = NULL;
   
         *targ++ = 0;          *targ++ = 0;
         if (*targ == 0)          if (*targ == 0)
                 targ = ".";                  targ = ".";
Line 380 
Line 427 
                 tuser = NULL;                  tuser = NULL;
         }          }
   
           if (tuser != NULL && !okname(tuser)) {
                   xfree(arg);
                   return;
           }
   
         for (i = 0; i < argc - 1; i++) {          for (i = 0; i < argc - 1; i++) {
                 src = colon(argv[i]);                  src = colon(argv[i]);
                 if (src) {      /* remote to remote */                  if (src) {      /* remote to remote */
                         static char *ssh_options =                          freeargs(&alist);
                             "-x -o'ClearAllForwardings yes'";                          addargs(&alist, "%s", ssh_program);
                           if (verbose_mode)
                                   addargs(&alist, "-v");
                           addargs(&alist, "-x");
                           addargs(&alist, "-oClearAllForwardings yes");
                           addargs(&alist, "-n");
   
                         *src++ = 0;                          *src++ = 0;
                         if (*src == 0)                          if (*src == 0)
                                 src = ".";                                  src = ".";
                         host = strrchr(argv[i], '@');                          host = strrchr(argv[i], '@');
                         len = strlen(ssh_program) + strlen(argv[i]) +  
                             strlen(src) + (tuser ? strlen(tuser) : 0) +  
                             strlen(thost) + strlen(targ) +  
                             strlen(ssh_options) + CMDNEEDS + 20;  
                         bp = xmalloc(len);  
                         if (host) {                          if (host) {
                                 *host++ = 0;                                  *host++ = 0;
                                 host = cleanhostname(host);                                  host = cleanhostname(host);
                                 suser = argv[i];                                  suser = argv[i];
                                 if (*suser == '\0')                                  if (*suser == '\0')
                                         suser = pwd->pw_name;                                          suser = pwd->pw_name;
                                 else if (!okname(suser)) {                                  else if (!okname(suser))
                                         xfree(bp);  
                                         continue;                                          continue;
                                 }                                  addargs(&alist, "-l");
                                 if (tuser && !okname(tuser)) {                                  addargs(&alist, "%s", suser);
                                         xfree(bp);  
                                         continue;  
                                 }  
                                 snprintf(bp, len,  
                                     "%s%s %s -n "  
                                     "-l %s %s %s %s '%s%s%s:%s'",  
                                     ssh_program, verbose_mode ? " -v" : "",  
                                     ssh_options, suser, host, cmd, src,  
                                     tuser ? tuser : "", tuser ? "@" : "",  
                                     thost, targ);  
                         } else {                          } else {
                                 host = cleanhostname(argv[i]);                                  host = cleanhostname(argv[i]);
                                 snprintf(bp, len,  
                                     "exec %s%s %s -n %s "  
                                     "%s %s '%s%s%s:%s'",  
                                     ssh_program, verbose_mode ? " -v" : "",  
                                     ssh_options, host, cmd, src,  
                                     tuser ? tuser : "", tuser ? "@" : "",  
                                     thost, targ);  
                         }                          }
                         if (verbose_mode)                          addargs(&alist, "%s", host);
                                 fprintf(stderr, "Executing: %s\n", bp);                          addargs(&alist, "%s", cmd);
                         if (system(bp) != 0)                          addargs(&alist, "%s", src);
                           addargs(&alist, "%s%s%s:%s",
                               tuser ? tuser : "", tuser ? "@" : "",
                               thost, targ);
                           if (do_local_cmd(&alist) != 0)
                                 errs = 1;                                  errs = 1;
                         (void) xfree(bp);  
                 } else {        /* local to remote */                  } else {        /* local to remote */
                         if (remin == -1) {                          if (remin == -1) {
                                 len = strlen(targ) + CMDNEEDS + 20;                                  len = strlen(targ) + CMDNEEDS + 20;
Line 453 
Line 492 
 {  {
         int i, len;          int i, len;
         char *bp, *host, *src, *suser;          char *bp, *host, *src, *suser;
           arglist alist;
   
           memset(&alist, '\0', sizeof(alist));
           alist.list = NULL;
   
         for (i = 0; i < argc - 1; i++) {          for (i = 0; i < argc - 1; i++) {
                 if (!(src = colon(argv[i]))) {  /* Local to local. */                  if (!(src = colon(argv[i]))) {  /* Local to local. */
                         len = strlen(_PATH_CP) + strlen(argv[i]) +                          freeargs(&alist);
                             strlen(argv[argc - 1]) + 20;                          addargs(&alist, "%s", _PATH_CP);
                         bp = xmalloc(len);                          if (iamrecursive)
                         (void) snprintf(bp, len, "exec %s%s%s %s %s", _PATH_CP,                                  addargs(&alist, "-r");
                             iamrecursive ? " -r" : "", pflag ? " -p" : "",                          if (pflag)
                             argv[i], argv[argc - 1]);                                  addargs(&alist, "-p");
                         if (verbose_mode)                          addargs(&alist, "%s", argv[i]);
                                 fprintf(stderr, "Executing: %s\n", bp);                          addargs(&alist, "%s", argv[argc-1]);
                         if (system(bp))                          if (do_local_cmd(&alist))
                                 ++errs;                                  ++errs;
                         (void) xfree(bp);  
                         continue;                          continue;
                 }                  }
                 *src++ = 0;                  *src++ = 0;

Legend:
Removed from v.1.128  
changed lines
  Added in v.1.129