[PATCH] Link count attribute extension
Damien Miller
djm at mindrot.org
Thu Jun 2 12:45:21 AEST 2016
Hi,
Thanks for the patch! Could I ask you to create a bug on
https://bugzilla.mindrot.org/ and attach it so it doesn't get lost?
Thanks,
Damien Miller
On Thu, 2 Jun 2016, Rian Hunter wrote:
> Hello,
>
> This patch adds client and server support for transmitting the st_nlink field
> across SSH2_FXP_NAME and SSH2_FXP_ATTRS responses.
>
> Please let me know if there anything I can do to improve this patch. I am
> not subscribed to list so please CC me.
>
> Index: sftp-common.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/ssh/sftp-common.c,v
> retrieving revision 1.28
> diff -u -r1.28 sftp-common.c
> --- sftp-common.c 20 Jan 2015 23:14:00 -0000 1.28
> +++ sftp-common.c 2 Jun 2016 01:32:02 -0000
> @@ -56,6 +56,8 @@
> a->perm = 0;
> a->atime = 0;
> a->mtime = 0;
> + a->has_nlink = 0;
> + a->nlink = 0;
> }
>
> /* Convert from struct stat to filexfer attribs */
> @@ -74,6 +76,9 @@
> a->flags |= SSH2_FILEXFER_ATTR_ACMODTIME;
> a->atime = st->st_atime;
> a->mtime = st->st_mtime;
> + a->flags |= SSH2_FILEXFER_ATTR_EXTENDED;
> + a->has_nlink = 1;
> + a->nlink = st->st_nlink;
> }
>
> /* Convert from filexfer attribs to struct stat */
> @@ -94,6 +99,11 @@
> st->st_atime = a->atime;
> st->st_mtime = a->mtime;
> }
> + if (a->flags & SSH2_FILEXFER_ATTR_EXTENDED) {
> + if (a->has_nlink) {
> + st->st_nlink = a->nlink;
> + }
> + }
> }
>
> /* Decode attributes in buffer */
> @@ -138,6 +148,15 @@
> return r;
> debug3("Got file attribute \"%.100s\" len %zu",
> type, dlen);
> + if (strcmp(type, SFTP_EXT_ATTR_LINK_COUNT) == 0) {
> + if (dlen < 8) {
> + return SSH_ERR_MESSAGE_INCOMPLETE;
> + free(type);
> + free(data);
> + }
> + a->has_nlink = 1;
> + a->nlink = PEEK_U64(data);
> + }
> free(type);
> free(data);
> }
> @@ -170,6 +189,24 @@
> if ((r = sshbuf_put_u32(b, a->atime)) != 0 ||
> (r = sshbuf_put_u32(b, a->mtime)) != 0)
> return r;
> + }
> + if (a->flags & SSH2_FILEXFER_ATTR_EXTENDED) {
> + u_int32_t count = 0;
> + if (a->has_nlink) {
> + count += 1;
> + }
> +
> + if (count) {
> + if ((r = sshbuf_put_u32(b, count)) != 0)
> + return r;
> +
> + if (a->has_nlink) {
> + if ((r = sshbuf_put_cstring(b, SFTP_EXT_ATTR_LINK_COUNT)) != 0 ||
> + (r = sshbuf_put_u32(b, 8)) != 0 ||
> + (r = sshbuf_put_u64(b, a->nlink)))
> + return r;
> + }
> + }
> }
> return 0;
> }
> Index: sftp-common.h
> ===================================================================
> RCS file: /cvs/src/usr.bin/ssh/sftp-common.h,v
> retrieving revision 1.12
> diff -u -r1.12 sftp-common.h
> --- sftp-common.h 14 Jan 2015 13:54:13 -0000 1.12
> +++ sftp-common.h 2 Jun 2016 01:32:02 -0000
> @@ -40,6 +40,8 @@
> u_int32_t perm;
> u_int32_t atime;
> u_int32_t mtime;
> + u_int32_t has_nlink;
> + u_int64_t nlink;
> };
>
> void attrib_clear(Attrib *);
> @@ -50,3 +52,5 @@
> char *ls_file(const char *, const struct stat *, int, int);
>
> const char *fx2txt(int);
> +
> +#define SFTP_EXT_ATTR_LINK_COUNT "attr-link-count at openssh.com"
> Index: sftp-server.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/ssh/sftp-server.c,v
> retrieving revision 1.109
> diff -u -r1.109 sftp-server.c
> --- sftp-server.c 15 Feb 2016 09:47:49 -0000 1.109
> +++ sftp-server.c 2 Jun 2016 01:32:02 -0000
> @@ -659,6 +659,9 @@
> (r = sshbuf_put_cstring(msg, "1")) != 0 || /* version */
> /* fsync extension */
> (r = sshbuf_put_cstring(msg, "fsync at openssh.com")) != 0 ||
> + (r = sshbuf_put_cstring(msg, "1")) != 0 || /* version */
> + /* attr link count extension */
> + (r = sshbuf_put_cstring(msg, SFTP_EXT_ATTR_LINK_COUNT)) != 0 ||
> (r = sshbuf_put_cstring(msg, "1")) != 0) /* version */
> fatal("%s: buffer error: %s", __func__, ssh_err(r));
> send_msg(msg);
> _______________________________________________
> openssh-unix-dev mailing list
> openssh-unix-dev at mindrot.org
> https://lists.mindrot.org/mailman/listinfo/openssh-unix-dev
>
More information about the openssh-unix-dev
mailing list