[PATCH] add atomic rename extension to sftp-server

Miklos Szeredi miklos at szeredi.hu
Fri Dec 7 22:52:37 EST 2007


This is needed to be able to support a rename() operation conforming
to POSIX in the SSH filesystem.

With the rename operation defined in the SFTP spec, this is
impossible, since in case the target exists it's not possible to
perform the rename+unlink atomically.

Index: ssh/sftp-server.c
===================================================================
--- ssh.orig/sftp-server.c	2006-08-19 16:49:03.000000000 +0200
+++ ssh/sftp-server.c	2006-08-19 16:51:26.000000000 +0200
@@ -1087,6 +1087,23 @@ process_extended_statfs(u_int32_t id)
 }
 
 static void
+process_extended_posix_rename(u_int32_t id)
+{
+	char *oldpath, *newpath;
+
+	oldpath = get_string(NULL);
+	newpath = get_string(NULL);
+	debug3("request %u: posix-rename", id);
+	logit("posix-rename old \"%s\" new \"%s\"", oldpath, newpath);
+        if (rename(oldpath, newpath) == -1)
+            send_status(id, errno_to_portable(errno));
+        else
+            send_status(id, SSH2_FX_OK);
+	xfree(oldpath);
+	xfree(newpath);
+}
+
+static void
 process_extended(void)
 {
 	u_int32_t id;
@@ -1096,6 +1113,8 @@ process_extended(void)
 	request = get_string(NULL);
 	if (strcmp(request, "statfs at openssh.org") == 0)
 		process_extended_statfs(id);
+	if (strcmp(request, "posix-rename at openssh.org") == 0)
+		process_extended_posix_rename(id);
 	else
 		send_status(id, SSH2_FX_OP_UNSUPPORTED);	/* MUST */
 	xfree(request);



More information about the openssh-unix-dev mailing list