Mailing List Archive

[PATCH 2/4] add SFTPv4 constants & handle error & file mode strings
Just register the new SFTPv4 constants, and fill out the utility funcs
that translate some of them to strings. No code actually uses SFTPv4.
---
sftp-server.c | 23 +++++++++++++++++++++--
sftp.h | 27 ++++++++++++++++++++++++---
2 files changed, 45 insertions(+), 5 deletions(-)

diff --git a/sftp-server.c b/sftp-server.c
index 859e93f31111..bef7b6c18aa7 100644
--- a/sftp-server.c
+++ b/sftp-server.c
@@ -222,11 +222,15 @@ errno_to_portable(int unixerrno)
case 0:
ret = SSH2_FX_OK;
break;
+ case EBADF:
+ ret = sftp_version <= 3 ? SSH2_FX_NO_SUCH_FILE :
+ SSH2_FX_INVALID_HANDLE;
+ break;
case ENOENT:
case ENOTDIR:
- case EBADF:
case ELOOP:
- ret = SSH2_FX_NO_SUCH_FILE;
+ ret = sftp_version <= 3 ? SSH2_FX_NO_SUCH_PATH :
+ SSH2_FX_NO_SUCH_FILE;
break;
case EPERM:
case EACCES:
@@ -240,6 +244,14 @@ errno_to_portable(int unixerrno)
case ENOSYS:
ret = SSH2_FX_OP_UNSUPPORTED;
break;
+ case EEXIST:
+ ret = sftp_version <= 3 ? SSH2_FX_FAILURE :
+ SSH2_FX_FILE_ALREADY_EXISTS;
+ break;
+ case EROFS:
+ ret = sftp_version <= 3 ? SSH2_FX_FAILURE :
+ SSH2_FX_WRITE_PROTECT;
+ break;
default:
ret = SSH2_FX_FAILURE;
break;
@@ -296,6 +308,8 @@ string_from_portable(int pflags)
PAPPEND("TRUNCATE")
if (pflags & SSH2_FXF_EXCL)
PAPPEND("EXCL")
+ if (sftp_version >= 4 && pflags & SSH2_FXF_TEXT)
+ PAPPEND("TEXT")

return ret;
}
@@ -536,6 +550,11 @@ status_to_message(u_int32_t status)
"No connection", /* SSH_FX_NO_CONNECTION */
"Connection lost", /* SSH_FX_CONNECTION_LOST */
"Operation unsupported", /* SSH_FX_OP_UNSUPPORTED */
+ "Invalid handle", /* SSH_FX_INVALID_HANDLE */
+ "No such path", /* SSH_FX_NO_SUCH_PATH */
+ "File already exists", /* SSH_FX_FILE_ALREADY_EXISTS */
+ "Write protected", /* SSH_FX_WRITE_PROTECT */
+ "No media", /* SSH_FX_NO_MEDIA */
"Unknown error" /* Others */
};
return (status_messages[MINIMUM(status,SSH2_FX_MAX)]);
diff --git a/sftp.h b/sftp.h
index 4c22bcc81bb6..2489a212d36d 100644
--- a/sftp.h
+++ b/sftp.h
@@ -25,7 +25,7 @@
*/

/*
- * draft-ietf-secsh-filexfer-01.txt
+ * draft-ietf-secsh-filexfer-02.txt & draft-ietf-secsh-filexfer-04.txt
*/

/* client to server */
@@ -61,12 +61,26 @@
#define SSH2_FXP_EXTENDED 200
#define SSH2_FXP_EXTENDED_REPLY 201

-/* attributes */
+/* SFTPv3 attributes */
#define SSH2_FILEXFER_ATTR_SIZE 0x00000001
#define SSH2_FILEXFER_ATTR_UIDGID 0x00000002
#define SSH2_FILEXFER_ATTR_PERMISSIONS 0x00000004
#define SSH2_FILEXFER_ATTR_ACMODTIME 0x00000008
#define SSH2_FILEXFER_ATTR_EXTENDED 0x80000000
+/* SFTPv4 attributes */
+#define SSH2_FILEXFER_ATTR_ACCESSTIME 0x00000008
+#define SSH2_FILEXFER_ATTR_CREATETIME 0x00000010
+#define SSH2_FILEXFER_ATTR_MODIFYTIME 0x00000020
+#define SSH2_FILEXFER_ATTR_ACL 0x00000040
+#define SSH2_FILEXFER_ATTR_OWNERGROUP 0x00000080
+#define SSH2_FILEXFER_ATTR_SUBSECOND_TIMES 0x00000100
+
+/* SFTPv4 types */
+#define SSH2_FILEXFER_TYPE_REGULAR 1
+#define SSH2_FILEXFER_TYPE_DIRECTORY 2
+#define SSH2_FILEXFER_TYPE_SYMLINK 3
+#define SSH2_FILEXFER_TYPE_SPECIAL 4
+#define SSH2_FILEXFER_TYPE_UNKNOWN 5

/* portable open modes */
#define SSH2_FXF_READ 0x00000001
@@ -75,6 +89,7 @@
#define SSH2_FXF_CREAT 0x00000008
#define SSH2_FXF_TRUNC 0x00000010
#define SSH2_FXF_EXCL 0x00000020
+#define SSH2_FXF_TEXT 0x00000040

/* statvfs@openssh.com f_flag flags */
#define SSH2_FXE_STATVFS_ST_RDONLY 0x00000001
@@ -90,7 +105,13 @@
#define SSH2_FX_NO_CONNECTION 6
#define SSH2_FX_CONNECTION_LOST 7
#define SSH2_FX_OP_UNSUPPORTED 8
-#define SSH2_FX_MAX 8
+/* SFTPv4 errors */
+#define SSH2_FX_INVALID_HANDLE 9
+#define SSH2_FX_NO_SUCH_PATH 10
+#define SSH2_FX_FILE_ALREADY_EXISTS 11
+#define SSH2_FX_WRITE_PROTECT 12
+#define SSH2_FX_NO_MEDIA 13
+#define SSH2_FX_MAX 13

struct passwd;

--
2.33.0

_______________________________________________
openssh-unix-dev mailing list
openssh-unix-dev@mindrot.org
https://lists.mindrot.org/mailman/listinfo/openssh-unix-dev