[PATCH] Link count attribute extension

rian at thelig.ht rian at thelig.ht
Thu Jun 2 16:45:31 AEST 2016


Sure, now located at https://bugzilla.mindrot.org/show_bug.cgi?id=2579

On 2016-06-01 19:45, Damien Miller wrote:
> 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