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

Diff for /src/usr.bin/ssh/Attic/sftp-int.c between version 1.50 and 1.51

version 1.50, 2002/11/21 23:03:51 version 1.51, 2003/01/08 23:53:26
Line 668 
Line 668 
 }  }
   
 static int  static int
 parse_args(const char **cpp, int *pflag, int *lflag,  parse_args(const char **cpp, int *pflag, int *lflag, int *iflag,
     unsigned long *n_arg, char **path1, char **path2)      unsigned long *n_arg, char **path1, char **path2)
 {  {
         const char *cmd, *cp = *cpp;          const char *cmd, *cp = *cpp;
Line 680 
Line 680 
         /* Skip leading whitespace */          /* Skip leading whitespace */
         cp = cp + strspn(cp, WHITESPACE);          cp = cp + strspn(cp, WHITESPACE);
   
         /* Ignore blank lines */          /* Ignore blank lines and lines which begin with comment '#' char */
         if (!*cp)          if (*cp == '\0' || *cp == '#')
                 return(-1);                  return (0);
   
           /* Check for leading '-' (disable error processing) */
           *iflag = 0;
           if (*cp == '-') {
                   *iflag = 1;
                   cp++;
           }
   
         /* Figure out which command we have */          /* Figure out which command we have */
         for (i = 0; cmds[i].c; i++) {          for (i = 0; cmds[i].c; i++) {
                 int cmdlen = strlen(cmds[i].c);                  int cmdlen = strlen(cmds[i].c);
Line 705 
Line 712 
                 cmdnum = I_SHELL;                  cmdnum = I_SHELL;
         } else if (cmdnum == -1) {          } else if (cmdnum == -1) {
                 error("Invalid command.");                  error("Invalid command.");
                 return(-1);                  return (-1);
         }          }
   
         /* Get arguments and parse flags */          /* Get arguments and parse flags */
Line 815 
Line 822 
 }  }
   
 static int  static int
 parse_dispatch_command(struct sftp_conn *conn, const char *cmd, char **pwd)  parse_dispatch_command(struct sftp_conn *conn, const char *cmd, char **pwd,
       int err_abort)
 {  {
         char *path1, *path2, *tmp;          char *path1, *path2, *tmp;
         int pflag, lflag, cmdnum, i;          int pflag, lflag, iflag, cmdnum, i;
         unsigned long n_arg;          unsigned long n_arg;
         Attrib a, *aa;          Attrib a, *aa;
         char path_buf[MAXPATHLEN];          char path_buf[MAXPATHLEN];
Line 826 
Line 834 
         glob_t g;          glob_t g;
   
         path1 = path2 = NULL;          path1 = path2 = NULL;
         cmdnum = parse_args(&cmd, &pflag, &lflag, &n_arg,          cmdnum = parse_args(&cmd, &pflag, &lflag, &iflag, &n_arg,
             &path1, &path2);              &path1, &path2);
   
           if (iflag != 0)
                   err_abort = 0;
   
         memset(&g, 0, sizeof(g));          memset(&g, 0, sizeof(g));
   
         /* Perform command */          /* Perform command */
         switch (cmdnum) {          switch (cmdnum) {
           case 0:
                   /* Blank line */
                   break;
         case -1:          case -1:
                   /* Unrecognized command */
                   err = -1;
                 break;                  break;
         case I_GET:          case I_GET:
                 err = process_get(conn, path1, path2, *pwd, pflag);                  err = process_get(conn, path1, path2, *pwd, pflag);
Line 855 
Line 871 
                 remote_glob(conn, path1, GLOB_NOCHECK, NULL, &g);                  remote_glob(conn, path1, GLOB_NOCHECK, NULL, &g);
                 for (i = 0; g.gl_pathv[i]; i++) {                  for (i = 0; g.gl_pathv[i]; i++) {
                         printf("Removing %s\n", g.gl_pathv[i]);                          printf("Removing %s\n", g.gl_pathv[i]);
                         if (do_rm(conn, g.gl_pathv[i]) == -1)                          err = do_rm(conn, g.gl_pathv[i]);
                                 err = -1;                          if (err != 0 && err_abort)
                                   break;
                 }                  }
                 break;                  break;
         case I_MKDIR:          case I_MKDIR:
Line 909 
Line 926 
                         tmp = *pwd;                          tmp = *pwd;
   
                 path1 = make_absolute(path1, *pwd);                  path1 = make_absolute(path1, *pwd);
                   err = do_globbed_ls(conn, path1, tmp, lflag);
                 do_globbed_ls(conn, path1, tmp, lflag);  
                 break;                  break;
         case I_LCHDIR:          case I_LCHDIR:
                 if (chdir(path1) == -1) {                  if (chdir(path1) == -1) {
Line 944 
Line 960 
                 remote_glob(conn, path1, GLOB_NOCHECK, NULL, &g);                  remote_glob(conn, path1, GLOB_NOCHECK, NULL, &g);
                 for (i = 0; g.gl_pathv[i]; i++) {                  for (i = 0; g.gl_pathv[i]; i++) {
                         printf("Changing mode on %s\n", g.gl_pathv[i]);                          printf("Changing mode on %s\n", g.gl_pathv[i]);
                         do_setstat(conn, g.gl_pathv[i], &a);                          err = do_setstat(conn, g.gl_pathv[i], &a);
                           if (err != 0 && err_abort)
                                   break;
                 }                  }
                 break;                  break;
         case I_CHOWN:          case I_CHOWN:
                 path1 = make_absolute(path1, *pwd);  
                 remote_glob(conn, path1, GLOB_NOCHECK, NULL, &g);  
                 for (i = 0; g.gl_pathv[i]; i++) {  
                         if (!(aa = do_stat(conn, g.gl_pathv[i], 0)))  
                                 continue;  
                         if (!(aa->flags & SSH2_FILEXFER_ATTR_UIDGID)) {  
                                 error("Can't get current ownership of "  
                                     "remote file \"%s\"", g.gl_pathv[i]);  
                                 continue;  
                         }  
                         printf("Changing owner on %s\n", g.gl_pathv[i]);  
                         aa->flags &= SSH2_FILEXFER_ATTR_UIDGID;  
                         aa->uid = n_arg;  
                         do_setstat(conn, g.gl_pathv[i], aa);  
                 }  
                 break;  
         case I_CHGRP:          case I_CHGRP:
                 path1 = make_absolute(path1, *pwd);                  path1 = make_absolute(path1, *pwd);
                 remote_glob(conn, path1, GLOB_NOCHECK, NULL, &g);                  remote_glob(conn, path1, GLOB_NOCHECK, NULL, &g);
                 for (i = 0; g.gl_pathv[i]; i++) {                  for (i = 0; g.gl_pathv[i]; i++) {
                         if (!(aa = do_stat(conn, g.gl_pathv[i], 0)))                          if (!(aa = do_stat(conn, g.gl_pathv[i], 0))) {
                                 continue;                                  if (err != 0 && err_abort)
                                           break;
                                   else
                                           continue;
                           }
                         if (!(aa->flags & SSH2_FILEXFER_ATTR_UIDGID)) {                          if (!(aa->flags & SSH2_FILEXFER_ATTR_UIDGID)) {
                                 error("Can't get current ownership of "                                  error("Can't get current ownership of "
                                     "remote file \"%s\"", g.gl_pathv[i]);                                      "remote file \"%s\"", g.gl_pathv[i]);
                                 continue;                                  if (err != 0 && err_abort)
                                           break;
                                   else
                                           continue;
                         }                          }
                         printf("Changing group on %s\n", g.gl_pathv[i]);  
                         aa->flags &= SSH2_FILEXFER_ATTR_UIDGID;                          aa->flags &= SSH2_FILEXFER_ATTR_UIDGID;
                         aa->gid = n_arg;                          if (cmdnum == I_CHOWN) {
                         do_setstat(conn, g.gl_pathv[i], aa);                                  printf("Changing owner on %s\n", g.gl_pathv[i]);
                                   aa->uid = n_arg;
                           } else {
                                   printf("Changing group on %s\n", g.gl_pathv[i]);
                                   aa->gid = n_arg;
                           }
                           err = do_setstat(conn, g.gl_pathv[i], aa);
                           if (err != 0 && err_abort)
                                   break;
                 }                  }
                 break;                  break;
         case I_PWD:          case I_PWD:
                 printf("Remote working directory: %s\n", *pwd);                  printf("Remote working directory: %s\n", *pwd);
                 break;                  break;
         case I_LPWD:          case I_LPWD:
                 if (!getcwd(path_buf, sizeof(path_buf)))                  if (!getcwd(path_buf, sizeof(path_buf))) {
                         error("Couldn't get local cwd: %s",                          error("Couldn't get local cwd: %s", strerror(errno));
                             strerror(errno));                          err = -1;
                 else                          break;
                         printf("Local working directory: %s\n",                  }
                             path_buf);                  printf("Local working directory: %s\n", path_buf);
                 break;                  break;
         case I_QUIT:          case I_QUIT:
                 return(-1);                  /* Processed below */
                   break;
         case I_HELP:          case I_HELP:
                 help();                  help();
                 break;                  break;
Line 1011 
Line 1028 
         if (path2)          if (path2)
                 xfree(path2);                  xfree(path2);
   
         /* If an error occurs in batch mode we should abort. */          /* If an unignored error occurs in batch mode we should abort. */
         if (infile != stdin && err > 0)          if (err_abort && err != 0)
                 return -1;                  return (-1);
           else if (cmdnum == I_QUIT)
                   return (1);
   
         return(0);          return (0);
 }  }
   
 void  int
 interactive_loop(int fd_in, int fd_out, char *file1, char *file2)  interactive_loop(int fd_in, int fd_out, char *file1, char *file2)
 {  {
         char *pwd;          char *pwd;
         char *dir = NULL;          char *dir = NULL;
         char cmd[2048];          char cmd[2048];
         struct sftp_conn *conn;          struct sftp_conn *conn;
           int err;
   
         conn = do_init(fd_in, fd_out, copy_buffer_len, num_requests);          conn = do_init(fd_in, fd_out, copy_buffer_len, num_requests);
         if (conn == NULL)          if (conn == NULL)
Line 1041 
Line 1061 
                 if (remote_is_dir(conn, dir) && file2 == NULL) {                  if (remote_is_dir(conn, dir) && file2 == NULL) {
                         printf("Changing to: %s\n", dir);                          printf("Changing to: %s\n", dir);
                         snprintf(cmd, sizeof cmd, "cd \"%s\"", dir);                          snprintf(cmd, sizeof cmd, "cd \"%s\"", dir);
                         parse_dispatch_command(conn, cmd, &pwd);                          if (parse_dispatch_command(conn, cmd, &pwd, 1) != 0)
                                   return (-1);
                 } else {                  } else {
                         if (file2 == NULL)                          if (file2 == NULL)
                                 snprintf(cmd, sizeof cmd, "get %s", dir);                                  snprintf(cmd, sizeof cmd, "get %s", dir);
Line 1049 
Line 1070 
                                 snprintf(cmd, sizeof cmd, "get %s %s", dir,                                  snprintf(cmd, sizeof cmd, "get %s %s", dir,
                                     file2);                                      file2);
   
                         parse_dispatch_command(conn, cmd, &pwd);                          err = parse_dispatch_command(conn, cmd, &pwd, 1);
                         xfree(dir);                          xfree(dir);
                         return;                          return (err);
                 }                  }
                 xfree(dir);                  xfree(dir);
         }          }
   
         setvbuf(stdout, NULL, _IOLBF, 0);          setvbuf(stdout, NULL, _IOLBF, 0);
         setvbuf(infile, NULL, _IOLBF, 0);          setvbuf(infile, NULL, _IOLBF, 0);
   
           err = 0;
         for (;;) {          for (;;) {
                 char *cp;                  char *cp;
   
Line 1074 
Line 1097 
                 if (cp)                  if (cp)
                         *cp = '\0';                          *cp = '\0';
   
                 if (parse_dispatch_command(conn, cmd, &pwd))                  err = parse_dispatch_command(conn, cmd, &pwd, infile != stdin);
                   if (err != 0)
                         break;                          break;
         }          }
         xfree(pwd);          xfree(pwd);
   
           /* err == 1 signifies normal "quit" exit */
           return (err >= 0 ? 0 : -1);
 }  }
   

Legend:
Removed from v.1.50  
changed lines
  Added in v.1.51