[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.43.2.2 and 1.44

version 1.43.2.2, 2004/08/19 22:37:32 version 1.44, 2003/11/10 16:23:41
Line 1 
Line 1 
 /*  /*
  * Copyright (c) 2000-2004 Markus Friedl.  All rights reserved.   * Copyright (c) 2000, 2001, 2002 Markus Friedl.  All rights reserved.
  *   *
  * Permission to use, copy, modify, and distribute this software for any   * Redistribution and use in source and binary forms, with or without
  * purpose with or without fee is hereby granted, provided that the above   * modification, are permitted provided that the following conditions
  * copyright notice and this permission notice appear in all copies.   * are met:
    * 1. Redistributions of source code must retain the above copyright
    *    notice, this list of conditions and the following disclaimer.
    * 2. Redistributions in binary form must reproduce the above copyright
    *    notice, this list of conditions and the following disclaimer in the
    *    documentation and/or other materials provided with the distribution.
  *   *
  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES   * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF   * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES   * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN   * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.   * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
    * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */   */
 #include "includes.h"  #include "includes.h"
 RCSID("$OpenBSD$");  RCSID("$OpenBSD$");
Line 254 
Line 262 
 }  }
   
 static void  static void
 send_status(u_int32_t id, u_int32_t status)  send_status(u_int32_t id, u_int32_t error)
 {  {
         Buffer msg;          Buffer msg;
         const char *status_messages[] = {          const char *status_messages[] = {
Line 270 
Line 278 
                 "Unknown error"                 /* Others */                  "Unknown error"                 /* Others */
         };          };
   
         TRACE("sent status id %u error %u", id, status);          TRACE("sent status id %u error %u", id, error);
         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, status);          buffer_put_int(&msg, error);
         if (version >= 3) {          if (version >= 3) {
                 buffer_put_cstring(&msg,                  buffer_put_cstring(&msg,
                     status_messages[MIN(status,SSH2_FX_MAX)]);                      status_messages[MIN(error,SSH2_FX_MAX)]);
                 buffer_put_cstring(&msg, "");                  buffer_put_cstring(&msg, "");
         }          }
         send_msg(&msg);          send_msg(&msg);
Line 819 
Line 827 
                 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 859 
Line 851 
 {  {
         u_int32_t id;          u_int32_t id;
         int len;          int len;
         char buf[MAXPATHLEN];          char link[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, buf, sizeof(buf) - 1)) == -1)          if ((len = readlink(path, link, sizeof(link) - 1)) == -1)
                 send_status(id, errno_to_portable(errno));                  send_status(id, errno_to_portable(errno));
         else {          else {
                 Stat s;                  Stat s;
   
                 buf[len] = '\0';                  link[len] = '\0';
                 attrib_clear(&s.attrib);                  attrib_clear(&s.attrib);
                 s.name = s.long_name = buf;                  s.name = s.long_name = link;
                 send_names(id, 1, &s);                  send_names(id, 1, &s);
         }          }
         xfree(path);          xfree(path);

Legend:
Removed from v.1.43.2.2  
changed lines
  Added in v.1.44