Bugzilla – Attachment 1970 Details for
Bug 155
OpenSSH 3.1p1 fails to compile on BSDi 4.0
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
/home/djm/sftp-hardlink.diff
sftp-hardlink.diff (text/plain), 8.99 KB, created by
Damien Miller
on 2010-12-03 11:52:25 AEDT
(
hide
)
Description:
/home/djm/sftp-hardlink.diff
Filename:
MIME Type:
Creator:
Damien Miller
Created:
2010-12-03 11:52:25 AEDT
Size:
8.99 KB
patch
obsolete
>diff -r b8d9be5ed0c6 Makefile.inc >--- a/Makefile.inc Mon Nov 29 23:45:51 2010 +0000 >+++ b/Makefile.inc Fri Dec 03 11:52:03 2010 +1100 >@@ -3,7 +3,7 @@ > CFLAGS+= -I${.CURDIR}/.. > > CDIAGFLAGS= -Wall >-#CDIAGFLAGS+= -Werror >+CDIAGFLAGS+= -Werror > CDIAGFLAGS+= -Wpointer-arith > CDIAGFLAGS+= -Wuninitialized > CDIAGFLAGS+= -Wstrict-prototypes >diff -r b8d9be5ed0c6 PROTOCOL >--- a/PROTOCOL Mon Nov 29 23:45:51 2010 +0000 >+++ b/PROTOCOL Fri Dec 03 11:52:03 2010 +1100 >@@ -275,4 +275,20 @@ > Both the "statvfs@openssh.com" and "fstatvfs@openssh.com" extensions are > advertised in the SSH_FXP_VERSION hello with version "2". > >+10. sftp: Extension request "hardlink@openssh.com" >+ >+This request is for creating a hard link to a regular file. This >+request is implemented as a SSH_FXP_EXTENDED request with the >+following format: >+ >+ uint32 id >+ string "hardlink@openssh.com" >+ string oldpath >+ string newpath >+ >+On receiving this request the server will perform the operation >+link(oldpath, newpath) and will respond with a SSH_FXP_STATUS message. >+This extension is advertised in the SSH_FXP_VERSION hello with version >+"1". >+ > $OpenBSD$ >diff -r b8d9be5ed0c6 sftp-client.c >--- a/sftp-client.c Mon Nov 29 23:45:51 2010 +0000 >+++ b/sftp-client.c Fri Dec 03 11:52:03 2010 +1100 >@@ -68,6 +68,7 @@ > #define SFTP_EXT_POSIX_RENAME 0x00000001 > #define SFTP_EXT_STATVFS 0x00000002 > #define SFTP_EXT_FSTATVFS 0x00000004 >+#define SFTP_EXT_HARDLINK 0x00000008 > u_int exts; > u_int64_t limit_kbps; > struct bwlimit bwlimit_in, bwlimit_out; >@@ -371,10 +372,14 @@ > strcmp(value, "2") == 0) { > ret->exts |= SFTP_EXT_STATVFS; > known = 1; >- } if (strcmp(name, "fstatvfs@openssh.com") == 0 && >+ } else if (strcmp(name, "fstatvfs@openssh.com") == 0 && > strcmp(value, "2") == 0) { > ret->exts |= SFTP_EXT_FSTATVFS; > known = 1; >+ } else if (strcmp(name, "hardlink@openssh.com") == 0 && >+ strcmp(value, "1") == 0) { >+ ret->exts |= SFTP_EXT_HARDLINK; >+ known = 1; > } > if (known) { > debug2("Server supports extension \"%s\" revision %s", >@@ -788,6 +793,39 @@ > } > > int >+do_hardlink(struct sftp_conn *conn, char *oldpath, char *newpath) >+{ >+ Buffer msg; >+ u_int status, id; >+ >+ buffer_init(&msg); >+ >+ /* Send link request */ >+ id = conn->msg_id++; >+ if ((conn->exts & SFTP_EXT_HARDLINK) == 0) { >+ error("Server does not support hardlink@openssh.com extension"); >+ return -1; >+ } >+ >+ buffer_put_char(&msg, SSH2_FXP_EXTENDED); >+ buffer_put_int(&msg, id); >+ buffer_put_cstring(&msg, "hardlink@openssh.com"); >+ buffer_put_cstring(&msg, oldpath); >+ buffer_put_cstring(&msg, newpath); >+ send_msg(conn, &msg); >+ debug3("Sent message hardlink@openssh.com \"%s\" -> \"%s\"", >+ oldpath, newpath); >+ buffer_free(&msg); >+ >+ status = get_status(conn, id); >+ if (status != SSH2_FX_OK) >+ error("Couldn't link file \"%s\" to \"%s\": %s", oldpath, >+ newpath, fx2txt(status)); >+ >+ return(status); >+} >+ >+int > do_symlink(struct sftp_conn *conn, char *oldpath, char *newpath) > { > Buffer msg; >diff -r b8d9be5ed0c6 sftp-client.h >--- a/sftp-client.h Mon Nov 29 23:45:51 2010 +0000 >+++ b/sftp-client.h Fri Dec 03 11:52:03 2010 +1100 >@@ -94,6 +94,9 @@ > /* Rename 'oldpath' to 'newpath' */ > int do_rename(struct sftp_conn *, char *, char *); > >+/* Link 'oldpath' to 'newpath' */ >+int do_hardlink(struct sftp_conn *, char *, char *); >+ > /* Rename 'oldpath' to 'newpath' */ > int do_symlink(struct sftp_conn *, char *, char *); > >diff -r b8d9be5ed0c6 sftp-server.c >--- a/sftp-server.c Mon Nov 29 23:45:51 2010 +0000 >+++ b/sftp-server.c Fri Dec 03 11:52:03 2010 +1100 >@@ -526,6 +526,9 @@ > /* fstatvfs extension */ > buffer_put_cstring(&msg, "fstatvfs@openssh.com"); > buffer_put_cstring(&msg, "2"); /* version */ >+ /* hardlink extension */ >+ buffer_put_cstring(&msg, "hardlink@openssh.com"); >+ buffer_put_cstring(&msg, "1"); /* version */ > send_msg(&msg); > buffer_free(&msg); > } >@@ -1195,6 +1198,27 @@ > } > > static void >+process_extended_hardlink(u_int32_t id) >+{ >+ char *oldpath, *newpath; >+ int ret, status; >+ >+ oldpath = get_string(NULL); >+ newpath = get_string(NULL); >+ debug3("request %u: hardlink", id); >+ logit("hardlink old \"%s\" new \"%s\"", oldpath, newpath); >+ if (readonly) >+ status = SSH2_FX_PERMISSION_DENIED; >+ else { >+ ret = link(oldpath, newpath); >+ status = (ret == -1) ? errno_to_portable(errno) : SSH2_FX_OK; >+ } >+ send_status(id, status); >+ xfree(oldpath); >+ xfree(newpath); >+} >+ >+static void > process_extended(void) > { > u_int32_t id; >@@ -1208,6 +1232,8 @@ > process_extended_statvfs(id); > else if (strcmp(request, "fstatvfs@openssh.com") == 0) > process_extended_fstatvfs(id); >+ else if (strcmp(request, "hardlink@openssh.com") == 0) >+ process_extended_hardlink(id); > else > send_status(id, SSH2_FX_OP_UNSUPPORTED); /* MUST */ > xfree(request); >diff -r b8d9be5ed0c6 sftp.1 >--- a/sftp.1 Mon Nov 29 23:45:51 2010 +0000 >+++ b/sftp.1 Fri Dec 03 11:52:03 2010 +1100 >@@ -128,7 +128,7 @@ > .Ic get , put , rename , ln , > .Ic rm , mkdir , chdir , ls , > .Ic lchdir , chmod , chown , >-.Ic chgrp , lpwd , df , >+.Ic chgrp , lpwd , df , symlink , > and > .Ic lmkdir . > Termination on error can be suppressed on a command by command basis by >@@ -392,11 +392,19 @@ > .It Ic lmkdir Ar path > Create local directory specified by > .Ar path . >-.It Ic ln Ar oldpath Ar newpath >-Create a symbolic link from >+.It Xo Ic ln >+.Op Fl s >+.Ar oldpath >+.Ar newpath >+.Xc >+Create a link from > .Ar oldpath > to > .Ar newpath . >+If the >+.Fl s >+flag is specified the created link is a symbolic link, otherwise it is >+a hard link. > .It Ic lpwd > Print local working directory. > .It Xo Ic ls >diff -r b8d9be5ed0c6 sftp.c >--- a/sftp.c Mon Nov 29 23:45:51 2010 +0000 >+++ b/sftp.c Fri Dec 03 11:52:03 2010 +1100 >@@ -109,6 +109,7 @@ > #define I_GET 5 > #define I_HELP 6 > #define I_LCHDIR 7 >+#define I_LINK 25 > #define I_LLS 8 > #define I_LMKDIR 9 > #define I_LPWD 10 >@@ -153,7 +154,7 @@ > { "lchdir", I_LCHDIR, LOCAL }, > { "lls", I_LLS, LOCAL }, > { "lmkdir", I_LMKDIR, LOCAL }, >- { "ln", I_SYMLINK, REMOTE }, >+ { "ln", I_LINK, REMOTE }, > { "lpwd", I_LPWD, LOCAL }, > { "ls", I_LS, REMOTE }, > { "lumask", I_LUMASK, NOARGS }, >@@ -217,7 +218,7 @@ > "lcd path Change local directory to 'path'\n" > "lls [ls-options [path]] Display local directory listing\n" > "lmkdir path Create local directory\n" >- "ln oldpath newpath Symlink remote file\n" >+ "ln [-s] oldpath newpath Link remote file (-s for symlink)\n" > "lpwd Print local working directory\n" > "ls [-1afhlnrSt] [path] Display remote directory listing\n" > "lumask umask Set local umask to 'umask'\n" >@@ -354,6 +355,30 @@ > } > > static int >+parse_link_flags(const char *cmd, char **argv, int argc, int *sflag) >+{ >+ extern int opterr, optind, optopt, optreset; >+ int ch; >+ >+ optind = optreset = 1; >+ opterr = 0; >+ >+ *sflag = 0; >+ while ((ch = getopt(argc, argv, "s")) != -1) { >+ switch (ch) { >+ case 's': >+ *sflag = 1; >+ break; >+ default: >+ error("%s: Invalid flag -%c", cmd, optopt); >+ return -1; >+ } >+ } >+ >+ return optind; >+} >+ >+static int > parse_ls_flags(char **argv, int argc, int *lflag) > { > extern int opterr, optind, optopt, optreset; >@@ -1065,7 +1090,7 @@ > > static int > parse_args(const char **cpp, int *pflag, int *rflag, int *lflag, int *iflag, >- int *hflag, unsigned long *n_arg, char **path1, char **path2) >+ int *hflag, int *sflag, unsigned long *n_arg, char **path1, char **path2) > { > const char *cmd, *cp = *cpp; > char *cp2, **argv; >@@ -1115,7 +1140,8 @@ > switch (cmdnum) { > case I_GET: > case I_PUT: >- if ((optidx = parse_getput_flags(cmd, argv, argc, pflag, rflag)) == -1) >+ if ((optidx = parse_getput_flags(cmd, argv, argc, >+ pflag, rflag)) == -1) > return -1; > /* Get first pathname (mandatory) */ > if (argc - optidx < 1) { >@@ -1131,8 +1157,11 @@ > undo_glob_escape(*path2); > } > break; >+ case I_LINK: >+ if ((optidx = parse_link_flags(cmd, argv, argc, sflag)) == -1) >+ return -1; >+ case I_SYMLINK: > case I_RENAME: >- case I_SYMLINK: > if (argc - optidx < 2) { > error("You must specify two paths after a %s " > "command.", cmd); >@@ -1235,7 +1264,8 @@ > int err_abort) > { > char *path1, *path2, *tmp; >- int pflag = 0, rflag = 0, lflag = 0, iflag = 0, hflag = 0, cmdnum, i; >+ int pflag = 0, rflag = 0, lflag = 0, iflag = 0, hflag = 0, sflag = 0; >+ int cmdnum, i; > unsigned long n_arg = 0; > Attrib a, *aa; > char path_buf[MAXPATHLEN]; >@@ -1243,8 +1273,8 @@ > glob_t g; > > path1 = path2 = NULL; >- cmdnum = parse_args(&cmd, &pflag, &rflag, &lflag, &iflag, &hflag, &n_arg, >- &path1, &path2); >+ cmdnum = parse_args(&cmd, &pflag, &rflag, &lflag, &iflag, &hflag, >+ &sflag, &n_arg, &path1, &path2); > > if (iflag != 0) > err_abort = 0; >@@ -1272,8 +1302,11 @@ > err = do_rename(conn, path1, path2); > break; > case I_SYMLINK: >+ sflag = 1; >+ case I_LINK: >+ path1 = make_absolute(path1, *pwd); > path2 = make_absolute(path2, *pwd); >- err = do_symlink(conn, path1, path2); >+ err = (sflag ? do_symlink : do_hardlink)(conn, path1, path2); > break; > case I_RM: > path1 = make_absolute(path1, *pwd);
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 155
: 1970