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

Diff for /src/usr.bin/ssh/sftp-server.c between version 1.45 and 1.45.2.1

version 1.45, 2004/02/19 21:15:04 version 1.45.2.1, 2004/08/19 04:13:27
Line 254 
Line 254 
 }  }
   
 static void  static void
 send_status(u_int32_t id, u_int32_t error)  send_status(u_int32_t id, u_int32_t status)
 {  {
         Buffer msg;          Buffer msg;
         const char *status_messages[] = {          const char *status_messages[] = {
Line 270 
Line 270 
                 "Unknown error"                 /* Others */                  "Unknown error"                 /* Others */
         };          };
   
         TRACE("sent status id %u error %u", id, error);          TRACE("sent status id %u error %u", id, status);
         buffer_init(&msg);          buffer_init(&msg);
         buffer_put_char(&msg, SSH2_FXP_STATUS);          buffer_put_char(&msg, SSH2_FXP_STATUS);
         buffer_put_int(&msg, id);          buffer_put_int(&msg, id);
         buffer_put_int(&msg, error);          buffer_put_int(&msg, status);
         if (version >= 3) {          if (version >= 3) {
                 buffer_put_cstring(&msg,                  buffer_put_cstring(&msg,
                     status_messages[MIN(error,SSH2_FX_MAX)]);                      status_messages[MIN(status,SSH2_FX_MAX)]);
                 buffer_put_cstring(&msg, "");                  buffer_put_cstring(&msg, "");
         }          }
         send_msg(&msg);          send_msg(&msg);
Line 819 
Line 819 
                 status = errno_to_portable(errno);                  status = errno_to_portable(errno);
         else if (S_ISREG(sb.st_mode)) {          else if (S_ISREG(sb.st_mode)) {
                 /* Race-free rename of regular files */                  /* Race-free rename of regular files */
                 if (link(oldpath, newpath) == -1)                  if (link(oldpath, newpath) == -1) {
                           if (errno == EOPNOTSUPP) {
                                   struct stat st;
   
                                   /*
                                    * fs doesn't support links, so fall back to
                                    * stat+rename.  This is racy.
                                    */
                                   if (stat(newpath, &st) == -1) {
                                           if (rename(oldpath, newpath) == -1)
                                                   status =
                                                       errno_to_portable(errno);
                                           else
                                                   status = SSH2_FX_OK;
                                   }
                           } else {
                                   status = errno_to_portable(errno);
                           }
                   } else if (unlink(oldpath) == -1) {
                         status = errno_to_portable(errno);                          status = errno_to_portable(errno);
                 else if (unlink(oldpath) == -1) {  
                         status = errno_to_portable(errno);  
                         /* clean spare link */                          /* clean spare link */
                         unlink(newpath);                          unlink(newpath);
                 } else                  } else
Line 843 
Line 859 
 {  {
         u_int32_t id;          u_int32_t id;
         int len;          int len;
         char link[MAXPATHLEN];          char buf[MAXPATHLEN];
         char *path;          char *path;
   
         id = get_int();          id = get_int();
         path = get_string(NULL);          path = get_string(NULL);
         TRACE("readlink id %u path %s", id, path);          TRACE("readlink id %u path %s", id, path);
         if ((len = readlink(path, link, sizeof(link) - 1)) == -1)          if ((len = readlink(path, buf, sizeof(buf) - 1)) == -1)
                 send_status(id, errno_to_portable(errno));                  send_status(id, errno_to_portable(errno));
         else {          else {
                 Stat s;                  Stat s;
   
                 link[len] = '\0';                  buf[len] = '\0';
                 attrib_clear(&s.attrib);                  attrib_clear(&s.attrib);
                 s.name = s.long_name = link;                  s.name = s.long_name = buf;
                 send_names(id, 1, &s);                  send_names(id, 1, &s);
         }          }
         xfree(path);          xfree(path);

Legend:
Removed from v.1.45  
changed lines
  Added in v.1.45.2.1