View | Details | Raw Unified | Return to bug 2067 | Differences between
and this patch

Collapse All | Expand All

(-)openssh-5.8p1-orig/sftp-client.c (+74 lines)
Lines 76-81 struct sftp_conn { Link Here
76
#define SFTP_EXT_STATVFS	0x00000002
76
#define SFTP_EXT_STATVFS	0x00000002
77
#define SFTP_EXT_FSTATVFS	0x00000004
77
#define SFTP_EXT_FSTATVFS	0x00000004
78
#define SFTP_EXT_HARDLINK	0x00000008
78
#define SFTP_EXT_HARDLINK	0x00000008
79
#define SFTP_EXT_LSETSTAT	0x00000016
79
	u_int exts;
80
	u_int exts;
80
	u_int64_t limit_kbps;
81
	u_int64_t limit_kbps;
81
	struct bwlimit bwlimit_in, bwlimit_out;
82
	struct bwlimit bwlimit_in, bwlimit_out;
Lines 387-392 do_init(int fd_in, int fd_out, u_int tra Link Here
387
		    strcmp(value, "1") == 0) {
387
		    strcmp(value, "1") == 0) {
388
			ret->exts |= SFTP_EXT_HARDLINK;
388
			ret->exts |= SFTP_EXT_HARDLINK;
389
			known = 1;
389
			known = 1;
390
		} else if (strcmp(name, "lsetstat@openssh.com") == 0 &&
391
		    strcmp(value, "1") == 0) {
392
			ret->exts |= SFTP_EXT_LSETSTAT;
393
			known = 1;
390
		}
394
		}
391
		if (known) {
395
		if (known) {
392
			debug2("Server supports extension \"%s\" revision %s",
396
			debug2("Server supports extension \"%s\" revision %s",
Lines 833-838 do_hardlink(struct sftp_conn *conn, char Link Here
833
}
834
}
834
835
835
int
836
int
837
do_lsetstat(struct sftp_conn *conn, char *path, Attrib *a)
838
{
839
       	Buffer msg;
840
	u_int status, id;
841
842
	buffer_init(&msg);
843
	/* Send link request */
844
	id = conn->msg_id++;
845
	if ((conn->exts & SFTP_EXT_HARDLINK) == 0) {
846
		error("Server does not support hardlink@openssh.com extension");
847
		return -1;
848
	}
849
850
	buffer_put_char(&msg, SSH2_FXP_EXTENDED);
851
	buffer_put_int(&msg, id);
852
	buffer_put_cstring(&msg, "lsetstat@openssh.com");
853
	buffer_put_cstring(&msg, path);
854
        encode_attrib(&msg, a);
855
	send_msg(conn, &msg);
856
	debug3("Sent message lsetstat@openssh.com \"%s\"",
857
	       path);
858
	buffer_free(&msg);
859
860
	status = get_status(conn, id);
861
	if (status != SSH2_FX_OK)
862
		error("Couldn't lsetstat file \"%s\": %s", 
863
                      path, fx2txt(status));
864
865
	return(status);
866
}
867
868
int do_create(struct sftp_conn *conn, char *path, Attrib *a)
869
{          
870
      	Buffer msg;
871
	u_int status, id, handle_len;
872
	char *handle;
873
874
	buffer_init(&msg);
875
876
	/* Send open request */
877
	id = conn->msg_id++;
878
	buffer_put_char(&msg, SSH2_FXP_OPEN);
879
	buffer_put_int(&msg, id);
880
	buffer_put_cstring(&msg, path);
881
	buffer_put_int(&msg, SSH2_FXF_CREAT);
882
	encode_attrib(&msg, a);
883
	send_msg(conn, &msg);
884
	debug3("Sent message SSH2_FXP_OPEN I:%u P:%s", id, path);
885
886
	/* Get Handle */
887
	handle = get_handle(conn, id, &handle_len,
888
	    "remote open(\"%s\")", path);
889
	if (handle == NULL) {
890
		buffer_free(&msg);
891
		return(-1);
892
	}
893
894
	/* Send close request */
895
	status=do_close(conn, handle, handle_len);
896
	buffer_free(&msg);
897
	xfree(handle);
898
	if (status != SSH2_FX_OK)
899
	  error("Couldn't create file \"%s\": %s", 
900
		path, fx2txt(status));
901
902
	return status;
903
}
904
905
int
836
do_symlink(struct sftp_conn *conn, char *oldpath, char *newpath)
906
do_symlink(struct sftp_conn *conn, char *oldpath, char *newpath)
837
{
907
{
838
	Buffer msg;
908
	Buffer msg;
(-)openssh-5.8p1-orig/sftp-client.h (+6 lines)
Lines 85-90 int do_setstat(struct sftp_conn *, char Link Here
85
/* Set file attributes of open file 'handle' */
85
/* Set file attributes of open file 'handle' */
86
int do_fsetstat(struct sftp_conn *, char *, u_int, Attrib *);
86
int do_fsetstat(struct sftp_conn *, char *, u_int, Attrib *);
87
87
88
/* Set file attributes of 'path' to softlink */
89
int do_lsetstat(struct sftp_conn *, char *, Attrib *);
90
91
/* Open a file or create it */
92
int do_create(struct sftp_conn *conn, char *path, Attrib *a);
93
88
/* Canonicalise 'path' - caller must free result */
94
/* Canonicalise 'path' - caller must free result */
89
char *do_realpath(struct sftp_conn *, char *);
95
char *do_realpath(struct sftp_conn *, char *);
90
96
(-)openssh-5.8p1-orig/sftp-server.c (+34 lines)
Lines 538-543 process_init(void) Link Here
538
	/* hardlink extension */
538
	/* hardlink extension */
539
	buffer_put_cstring(&msg, "hardlink@openssh.com");
539
	buffer_put_cstring(&msg, "hardlink@openssh.com");
540
	buffer_put_cstring(&msg, "1"); /* version */
540
	buffer_put_cstring(&msg, "1"); /* version */
541
	/* lsetstat extension */
542
	buffer_put_cstring(&msg, "lsetstat@openssh.com");
543
	buffer_put_cstring(&msg, "1"); /* version */
541
	send_msg(&msg);
544
	send_msg(&msg);
542
	buffer_free(&msg);
545
	buffer_free(&msg);
543
}
546
}
Lines 1247-1252 process_extended_hardlink(u_int32_t id) Link Here
1247
}
1249
}
1248
1250
1249
static void
1251
static void
1252
process_extended_lsetstat(u_int32_t id)
1253
{
1254
	Attrib *a;
1255
	char *name;
1256
	int status = SSH2_FX_OK, ret;
1257
1258
	name = get_string(NULL);
1259
	a = get_attrib();
1260
        debug3("request %u: lsetstat name \"%s\"", id, name);
1261
	if (readonly) {
1262
		status = SSH2_FX_PERMISSION_DENIED;
1263
		a->flags = 0;
1264
	}
1265
	if (a->flags & SSH2_FILEXFER_ATTR_ACMODTIME) {
1266
		char buf[64];
1267
		time_t t = a->mtime;
1268
1269
		strftime(buf, sizeof(buf), "%Y%m%d-%H:%M:%S",
1270
		    localtime(&t));
1271
		logit("lset \"%s\" modtime %s", name, buf);
1272
		ret = lutimes(name, attrib_to_tv(a));
1273
		if (ret == -1)
1274
			status = errno_to_portable(errno);
1275
	}
1276
	send_status(id, status);
1277
	xfree(name);
1278
}
1279
1280
static void
1250
process_extended(void)
1281
process_extended(void)
1251
{
1282
{
1252
	u_int32_t id;
1283
	u_int32_t id;
Lines 1262-1267 process_extended(void) Link Here
1262
		process_extended_fstatvfs(id);
1293
		process_extended_fstatvfs(id);
1263
	else if (strcmp(request, "hardlink@openssh.com") == 0)
1294
	else if (strcmp(request, "hardlink@openssh.com") == 0)
1264
		process_extended_hardlink(id);
1295
		process_extended_hardlink(id);
1296
	else if (strcmp(request, "lsetstat@openssh.com") == 0)
1297
		process_extended_lsetstat(id);
1265
	else
1298
	else
1266
		send_status(id, SSH2_FX_OP_UNSUPPORTED);	/* MUST */
1299
		send_status(id, SSH2_FX_OP_UNSUPPORTED);	/* MUST */
1267
	xfree(request);
1300
	xfree(request);

Return to bug 2067