[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.22.2.5 and 1.22.2.6

version 1.22.2.5, 2001/09/27 00:15:42 version 1.22.2.6, 2002/03/08 17:04:43
Line 1 
Line 1 
 /*  /*
  * Copyright (c) 2001 Damien Miller.  All rights reserved.   * Copyright (c) 2001,2002 Damien Miller.  All rights reserved.
  *   *
  * Redistribution and use in source and binary forms, with or without   * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions   * modification, are permitted provided that the following conditions
Line 44 
Line 44 
 /* File to read commands from */  /* File to read commands from */
 extern FILE *infile;  extern FILE *infile;
   
 /* Version of server we are speaking to */  /* Size of buffer used when copying files */
 int version;  extern size_t copy_buffer_len;
   
   /* Number of concurrent outstanding requests */
   extern int num_requests;
   
 /* Seperators for interactive commands */  /* Seperators for interactive commands */
 #define WHITESPACE " \t\r\n"  #define WHITESPACE " \t\r\n"
   
Line 207 
Line 210 
   
         ret = xmalloc(len);          ret = xmalloc(len);
         strlcpy(ret, p1, len);          strlcpy(ret, p1, len);
         if (strcmp(p1, "/") != 0)          if (strcmp(p1, "/") != 0)
                 strlcat(ret, "/", len);                  strlcat(ret, "/", len);
         strlcat(ret, p2, len);          strlcat(ret, p2, len);
   
Line 332 
Line 335 
 }  }
   
 static int  static int
 remote_is_dir(int in, int out, char *path)  remote_is_dir(struct sftp_conn *conn, char *path)
 {  {
         Attrib *a;          Attrib *a;
   
         /* XXX: report errors? */          /* XXX: report errors? */
         if ((a = do_stat(in, out, path, 1)) == NULL)          if ((a = do_stat(conn, path, 1)) == NULL)
                 return(0);                  return(0);
         if (!(a->flags & SSH2_FILEXFER_ATTR_PERMISSIONS))          if (!(a->flags & SSH2_FILEXFER_ATTR_PERMISSIONS))
                 return(0);                  return(0);
Line 345 
Line 348 
 }  }
   
 static int  static int
 process_get(int in, int out, char *src, char *dst, char *pwd, int pflag)  process_get(struct sftp_conn *conn, char *src, char *dst, char *pwd, int pflag)
 {  {
         char *abs_src = NULL;          char *abs_src = NULL;
         char *abs_dst = NULL;          char *abs_dst = NULL;
Line 359 
Line 362 
   
         memset(&g, 0, sizeof(g));          memset(&g, 0, sizeof(g));
         debug3("Looking up %s", abs_src);          debug3("Looking up %s", abs_src);
         if (remote_glob(in, out, abs_src, 0, NULL, &g)) {          if (remote_glob(conn, abs_src, 0, NULL, &g)) {
                 error("File \"%s\" not found.", abs_src);                  error("File \"%s\" not found.", abs_src);
                 err = -1;                  err = -1;
                 goto out;                  goto out;
Line 383 
Line 386 
                         goto out;                          goto out;
                 }                  }
                 printf("Fetching %s to %s\n", g.gl_pathv[0], abs_dst);                  printf("Fetching %s to %s\n", g.gl_pathv[0], abs_dst);
                 err = do_download(in, out, g.gl_pathv[0], abs_dst, pflag);                  err = do_download(conn, g.gl_pathv[0], abs_dst, pflag);
                 goto out;                  goto out;
         }          }
   
Line 395 
Line 398 
                 goto out;                  goto out;
         }          }
   
         for(i = 0; g.gl_pathv[i]; i++) {          for (i = 0; g.gl_pathv[i]; i++) {
                 if (infer_path(g.gl_pathv[i], &tmp)) {                  if (infer_path(g.gl_pathv[i], &tmp)) {
                         err = -1;                          err = -1;
                         goto out;                          goto out;
Line 407 
Line 410 
                         abs_dst = tmp;                          abs_dst = tmp;
   
                 printf("Fetching %s to %s\n", g.gl_pathv[i], abs_dst);                  printf("Fetching %s to %s\n", g.gl_pathv[i], abs_dst);
                 if (do_download(in, out, g.gl_pathv[i], abs_dst, pflag) == -1)                  if (do_download(conn, g.gl_pathv[i], abs_dst, pflag) == -1)
                         err = -1;                          err = -1;
                 xfree(abs_dst);                  xfree(abs_dst);
                 abs_dst = NULL;                  abs_dst = NULL;
Line 422 
Line 425 
 }  }
   
 static int  static int
 process_put(int in, int out, char *src, char *dst, char *pwd, int pflag)  process_put(struct sftp_conn *conn, char *src, char *dst, char *pwd, int pflag)
 {  {
         char *tmp_dst = NULL;          char *tmp_dst = NULL;
         char *abs_dst = NULL;          char *abs_dst = NULL;
Line 448 
Line 451 
         if (g.gl_pathv[0] && g.gl_matchc == 1) {          if (g.gl_pathv[0] && g.gl_matchc == 1) {
                 if (tmp_dst) {                  if (tmp_dst) {
                         /* If directory specified, append filename */                          /* If directory specified, append filename */
                         if (remote_is_dir(in, out, tmp_dst)) {                          if (remote_is_dir(conn, tmp_dst)) {
                                 if (infer_path(g.gl_pathv[0], &tmp)) {                                  if (infer_path(g.gl_pathv[0], &tmp)) {
                                         err = 1;                                          err = 1;
                                         goto out;                                          goto out;
Line 465 
Line 468 
                         abs_dst = make_absolute(abs_dst, pwd);                          abs_dst = make_absolute(abs_dst, pwd);
                 }                  }
                 printf("Uploading %s to %s\n", g.gl_pathv[0], abs_dst);                  printf("Uploading %s to %s\n", g.gl_pathv[0], abs_dst);
                 err = do_upload(in, out, g.gl_pathv[0], abs_dst, pflag);                  err = do_upload(conn, g.gl_pathv[0], abs_dst, pflag);
                 goto out;                  goto out;
         }          }
   
         /* Multiple matches, dst may be directory or unspecified */          /* Multiple matches, dst may be directory or unspecified */
         if (tmp_dst && !remote_is_dir(in, out, tmp_dst)) {          if (tmp_dst && !remote_is_dir(conn, tmp_dst)) {
                 error("Multiple files match, but \"%s\" is not a directory",                  error("Multiple files match, but \"%s\" is not a directory",
                     tmp_dst);                      tmp_dst);
                 err = -1;                  err = -1;
                 goto out;                  goto out;
         }          }
   
         for(i = 0; g.gl_pathv[i]; i++) {          for (i = 0; g.gl_pathv[i]; i++) {
                 if (infer_path(g.gl_pathv[i], &tmp)) {                  if (infer_path(g.gl_pathv[i], &tmp)) {
                         err = -1;                          err = -1;
                         goto out;                          goto out;
Line 489 
Line 492 
                         abs_dst = make_absolute(tmp, pwd);                          abs_dst = make_absolute(tmp, pwd);
   
                 printf("Uploading %s to %s\n", g.gl_pathv[i], abs_dst);                  printf("Uploading %s to %s\n", g.gl_pathv[i], abs_dst);
                 if (do_upload(in, out, g.gl_pathv[i], abs_dst, pflag) == -1)                  if (do_upload(conn, g.gl_pathv[i], abs_dst, pflag) == -1)
                         err = -1;                          err = -1;
         }          }
   
Line 519 
Line 522 
                 return(-1);                  return(-1);
   
         /* 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);
   
                 /* Check for command followed by whitespace */                  /* Check for command followed by whitespace */
Line 647 
Line 650 
 }  }
   
 static int  static int
 parse_dispatch_command(int in, int out, const char *cmd, char **pwd)  parse_dispatch_command(struct sftp_conn *conn, const char *cmd, char **pwd)
 {  {
         char *path1, *path2, *tmp;          char *path1, *path2, *tmp;
         int pflag, cmdnum, i;          int pflag, cmdnum, i;
Line 667 
Line 670 
         case -1:          case -1:
                 break;                  break;
         case I_GET:          case I_GET:
                 err = process_get(in, out, path1, path2, *pwd, pflag);                  err = process_get(conn, path1, path2, *pwd, pflag);
                 break;                  break;
         case I_PUT:          case I_PUT:
                 err = process_put(in, out, path1, path2, *pwd, pflag);                  err = process_put(conn, path1, path2, *pwd, pflag);
                 break;                  break;
         case I_RENAME:          case I_RENAME:
                 path1 = make_absolute(path1, *pwd);                  path1 = make_absolute(path1, *pwd);
                 path2 = make_absolute(path2, *pwd);                  path2 = make_absolute(path2, *pwd);
                 err = do_rename(in, out, path1, path2);                  err = do_rename(conn, path1, path2);
                 break;                  break;
         case I_SYMLINK:          case I_SYMLINK:
                 if (version < 3) {                  path2 = make_absolute(path2, *pwd);
                         error("The server (version %d) does not support "                  err = do_symlink(conn, path1, path2);
                             "this operation", version);  
                         err = -1;  
                 } else {  
                         path2 = make_absolute(path2, *pwd);  
                         err = do_symlink(in, out, path1, path2);  
                 }  
                 break;                  break;
         case I_RM:          case I_RM:
                 path1 = make_absolute(path1, *pwd);                  path1 = make_absolute(path1, *pwd);
                 remote_glob(in, out, 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(in, out, g.gl_pathv[i]) == -1)                          if (do_rm(conn, g.gl_pathv[i]) == -1)
                                 err = -1;                                  err = -1;
                 }                  }
                 break;                  break;
Line 701 
Line 698 
                 attrib_clear(&a);                  attrib_clear(&a);
                 a.flags |= SSH2_FILEXFER_ATTR_PERMISSIONS;                  a.flags |= SSH2_FILEXFER_ATTR_PERMISSIONS;
                 a.perm = 0777;                  a.perm = 0777;
                 err = do_mkdir(in, out, path1, &a);                  err = do_mkdir(conn, path1, &a);
                 break;                  break;
         case I_RMDIR:          case I_RMDIR:
                 path1 = make_absolute(path1, *pwd);                  path1 = make_absolute(path1, *pwd);
                 err = do_rmdir(in, out, path1);                  err = do_rmdir(conn, path1);
                 break;                  break;
         case I_CHDIR:          case I_CHDIR:
                 path1 = make_absolute(path1, *pwd);                  path1 = make_absolute(path1, *pwd);
                 if ((tmp = do_realpath(in, out, path1)) == NULL) {                  if ((tmp = do_realpath(conn, path1)) == NULL) {
                         err = 1;                          err = 1;
                         break;                          break;
                 }                  }
                 if ((aa = do_stat(in, out, tmp, 0)) == NULL) {                  if ((aa = do_stat(conn, tmp, 0)) == NULL) {
                         xfree(tmp);                          xfree(tmp);
                         err = 1;                          err = 1;
                         break;                          break;
Line 736 
Line 733 
                 break;                  break;
         case I_LS:          case I_LS:
                 if (!path1) {                  if (!path1) {
                         do_ls(in, out, *pwd);                          do_ls(conn, *pwd);
                         break;                          break;
                 }                  }
                 path1 = make_absolute(path1, *pwd);                  path1 = make_absolute(path1, *pwd);
                 if ((tmp = do_realpath(in, out, path1)) == NULL)                  if ((tmp = do_realpath(conn, path1)) == NULL)
                         break;                          break;
                 xfree(path1);                  xfree(path1);
                 path1 = tmp;                  path1 = tmp;
                 if ((aa = do_stat(in, out, path1, 0)) == NULL)                  if ((aa = do_stat(conn, path1, 0)) == NULL)
                         break;                          break;
                 if ((aa->flags & SSH2_FILEXFER_ATTR_PERMISSIONS) &&                  if ((aa->flags & SSH2_FILEXFER_ATTR_PERMISSIONS) &&
                     !S_ISDIR(aa->perm)) {                      !S_ISDIR(aa->perm)) {
                         error("Can't ls: \"%s\" is not a directory", path1);                          error("Can't ls: \"%s\" is not a directory", path1);
                         break;                          break;
                 }                  }
                 do_ls(in, out, path1);                  do_ls(conn, path1);
                 break;                  break;
         case I_LCHDIR:          case I_LCHDIR:
                 if (chdir(path1) == -1) {                  if (chdir(path1) == -1) {
Line 782 
Line 779 
                 attrib_clear(&a);                  attrib_clear(&a);
                 a.flags |= SSH2_FILEXFER_ATTR_PERMISSIONS;                  a.flags |= SSH2_FILEXFER_ATTR_PERMISSIONS;
                 a.perm = n_arg;                  a.perm = n_arg;
                 remote_glob(in, out, 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(in, out, g.gl_pathv[i], &a);                          do_setstat(conn, g.gl_pathv[i], &a);
                 }                  }
                 break;                  break;
         case I_CHOWN:          case I_CHOWN:
                 path1 = make_absolute(path1, *pwd);                  path1 = make_absolute(path1, *pwd);
                 remote_glob(in, out, 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(in, out, g.gl_pathv[i], 0)))                          if (!(aa = do_stat(conn, g.gl_pathv[i], 0)))
                                 continue;                                  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 "
Line 802 
Line 799 
                         printf("Changing owner on %s\n", g.gl_pathv[i]);                          printf("Changing owner on %s\n", g.gl_pathv[i]);
                         aa->flags &= SSH2_FILEXFER_ATTR_UIDGID;                          aa->flags &= SSH2_FILEXFER_ATTR_UIDGID;
                         aa->uid = n_arg;                          aa->uid = n_arg;
                         do_setstat(in, out, g.gl_pathv[i], aa);                          do_setstat(conn, g.gl_pathv[i], aa);
                 }                  }
                 break;                  break;
         case I_CHGRP:          case I_CHGRP:
                 path1 = make_absolute(path1, *pwd);                  path1 = make_absolute(path1, *pwd);
                 remote_glob(in, out, 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(in, out, g.gl_pathv[i], 0)))                          if (!(aa = do_stat(conn, g.gl_pathv[i], 0)))
                                 continue;                                  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 "
Line 819 
Line 816 
                         printf("Changing group on %s\n", g.gl_pathv[i]);                          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;                          aa->gid = n_arg;
                         do_setstat(in, out, g.gl_pathv[i], aa);                          do_setstat(conn, g.gl_pathv[i], aa);
                 }                  }
                 break;                  break;
         case I_PWD:          case I_PWD:
Line 839 
Line 836 
                 help();                  help();
                 break;                  break;
         case I_VERSION:          case I_VERSION:
                 printf("SFTP protocol version %d\n", version);                  printf("SFTP protocol version %d\n", sftp_proto_version(conn));
                 break;                  break;
         default:          default:
                 fatal("%d is not implemented", cmdnum);                  fatal("%d is not implemented", cmdnum);
Line 865 
Line 862 
         char *pwd;          char *pwd;
         char *dir = NULL;          char *dir = NULL;
         char cmd[2048];          char cmd[2048];
           struct sftp_conn *conn;
   
         version = do_init(fd_in, fd_out);          conn = do_init(fd_in, fd_out, copy_buffer_len, num_requests);
         if (version == -1)          if (conn == NULL)
                 fatal("Couldn't initialise connection to server");                  fatal("Couldn't initialise connection to server");
   
         pwd = do_realpath(fd_in, fd_out, ".");          pwd = do_realpath(conn, ".");
         if (pwd == NULL)          if (pwd == NULL)
                 fatal("Need cwd");                  fatal("Need cwd");
   
Line 878 
Line 876 
                 dir = xstrdup(file1);                  dir = xstrdup(file1);
                 dir = make_absolute(dir, pwd);                  dir = make_absolute(dir, pwd);
   
                 if (remote_is_dir(fd_in, fd_out, 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(fd_in, fd_out, cmd, &pwd);                          parse_dispatch_command(conn, cmd, &pwd);
                 } else {                  } else {
                         if (file2 == NULL)                          if (file2 == NULL)
                                 snprintf(cmd, sizeof cmd, "get %s", dir);                                  snprintf(cmd, sizeof cmd, "get %s", dir);
Line 889 
Line 887 
                                 snprintf(cmd, sizeof cmd, "get %s %s", dir,                                  snprintf(cmd, sizeof cmd, "get %s %s", dir,
                                     file2);                                      file2);
   
                         parse_dispatch_command(fd_in, fd_out, cmd, &pwd);                          parse_dispatch_command(conn, cmd, &pwd);
                         return;                          return;
                 }                  }
         }          }
         setvbuf(stdout, NULL, _IOLBF, 0);          setvbuf(stdout, NULL, _IOLBF, 0);
         setvbuf(infile, NULL, _IOLBF, 0);          setvbuf(infile, NULL, _IOLBF, 0);
   
         for(;;) {          for (;;) {
                 char *cp;                  char *cp;
   
                 printf("sftp> ");                  printf("sftp> ");
Line 912 
Line 910 
                 if (cp)                  if (cp)
                         *cp = '\0';                          *cp = '\0';
   
                 if (parse_dispatch_command(fd_in, fd_out, cmd, &pwd))                  if (parse_dispatch_command(conn, cmd, &pwd))
                         break;                          break;
         }          }
         xfree(pwd);          xfree(pwd);

Legend:
Removed from v.1.22.2.5  
changed lines
  Added in v.1.22.2.6