summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2004-04-06 23:01:09 +0000
committerJeremy Allison <jra@samba.org>2004-04-06 23:01:09 +0000
commit86ba853b57a3d0eecee8826188e6359492735e2d (patch)
tree7bff73cffc43c235354ede61de5e82e23fd7dc04
parent8a4bb3b9db0687bcda8d3497234e6231ed128e27 (diff)
downloadsamba-86ba853b57a3d0eecee8826188e6359492735e2d.tar.gz
r96: Stupid f&%'n UNIX extensions.... SETPATHINFO
normally takes as it's param entry the filename to be acted upon.... Unless it's UNIX extensions create hardlink, or UNIX extensions create symlink. Then it's param -> newfile name data -> oldfile name. This caused me to stuff them up in 3.0.2 (and the client commands link and symlink). Fixed them, everything is now called oldname and newname - thus specifying which name should already exist (hint - the old one...) and which will be created (newname). Jeremy.
-rw-r--r--source/client/client.c36
-rw-r--r--source/libsmb/clifile.c19
-rw-r--r--source/smbd/nttrans.c14
-rw-r--r--source/smbd/trans2.c61
4 files changed, 67 insertions, 63 deletions
diff --git a/source/client/client.c b/source/client/client.c
index 1da35fcc439..f2f43656cbb 100644
--- a/source/client/client.c
+++ b/source/client/client.c
@@ -1608,7 +1608,7 @@ static int cmd_rmdir(void)
static int cmd_link(void)
{
- pstring src,dest;
+ pstring oldname,newname;
pstring buf,buf2;
if (!SERVER_HAS_UNIX_CIFS(cli)) {
@@ -1616,20 +1616,20 @@ static int cmd_link(void)
return 1;
}
- pstrcpy(src,cur_dir);
- pstrcpy(dest,cur_dir);
+ pstrcpy(oldname,cur_dir);
+ pstrcpy(newname,cur_dir);
if (!next_token_nr(NULL,buf,NULL,sizeof(buf)) ||
!next_token_nr(NULL,buf2,NULL, sizeof(buf2))) {
- d_printf("link <src> <dest>\n");
+ d_printf("link <oldname> <newname>\n");
return 1;
}
- pstrcat(src,buf);
- pstrcat(dest,buf2);
+ pstrcat(oldname,buf);
+ pstrcat(newname,buf2);
- if (!cli_unix_hardlink(cli, src, dest)) {
- d_printf("%s linking files (%s -> %s)\n", cli_errstr(cli), src, dest);
+ if (!cli_unix_hardlink(cli, oldname, newname)) {
+ d_printf("%s linking files (%s -> %s)\n", cli_errstr(cli), newname, oldname);
return 1;
}
@@ -1642,7 +1642,7 @@ static int cmd_link(void)
static int cmd_symlink(void)
{
- pstring src,dest;
+ pstring oldname,newname;
pstring buf,buf2;
if (!SERVER_HAS_UNIX_CIFS(cli)) {
@@ -1650,21 +1650,21 @@ static int cmd_symlink(void)
return 1;
}
- pstrcpy(src,cur_dir);
- pstrcpy(dest,cur_dir);
+ pstrcpy(oldname,cur_dir);
+ pstrcpy(newname,cur_dir);
if (!next_token_nr(NULL,buf,NULL,sizeof(buf)) ||
!next_token_nr(NULL,buf2,NULL, sizeof(buf2))) {
- d_printf("symlink <src> <dest>\n");
+ d_printf("symlink <oldname> <newname>\n");
return 1;
}
- pstrcat(src,buf);
- pstrcat(dest,buf2);
+ pstrcat(oldname,buf);
+ pstrcat(newname,buf2);
- if (!cli_unix_symlink(cli, src, dest)) {
+ if (!cli_unix_symlink(cli, oldname, newname)) {
d_printf("%s symlinking files (%s -> %s)\n",
- cli_errstr(cli), src, dest);
+ cli_errstr(cli), newname, oldname);
return 1;
}
@@ -2192,7 +2192,7 @@ static struct
{"help",cmd_help,"[command] give help on a command",{COMPL_NONE,COMPL_NONE}},
{"history",cmd_history,"displays the command history",{COMPL_NONE,COMPL_NONE}},
{"lcd",cmd_lcd,"[directory] change/report the local current working directory",{COMPL_LOCAL,COMPL_NONE}},
- {"link",cmd_link,"<src> <dest> create a UNIX hard link",{COMPL_REMOTE,COMPL_REMOTE}},
+ {"link",cmd_link,"<oldname> <newname> create a UNIX hard link",{COMPL_REMOTE,COMPL_REMOTE}},
{"lowercase",cmd_lowercase,"toggle lowercasing of filenames for get",{COMPL_NONE,COMPL_NONE}},
{"ls",cmd_dir,"<mask> list the contents of the current directory",{COMPL_REMOTE,COMPL_NONE}},
{"mask",cmd_select,"<mask> mask all filenames against this",{COMPL_REMOTE,COMPL_NONE}},
@@ -2219,7 +2219,7 @@ static struct
{"rm",cmd_del,"<mask> delete all matching files",{COMPL_REMOTE,COMPL_NONE}},
{"rmdir",cmd_rmdir,"<directory> remove a directory",{COMPL_NONE,COMPL_NONE}},
{"setmode",cmd_setmode,"filename <setmode string> change modes of file",{COMPL_REMOTE,COMPL_NONE}},
- {"symlink",cmd_symlink,"<src> <dest> create a UNIX symlink",{COMPL_REMOTE,COMPL_REMOTE}},
+ {"symlink",cmd_symlink,"<oldname> <newname> create a UNIX symlink",{COMPL_REMOTE,COMPL_REMOTE}},
{"tar",cmd_tar,"tar <c|x>[IXFqbgNan] current directory to/from <file name>",{COMPL_NONE,COMPL_NONE}},
{"tarmode",cmd_tarmode,"<full|inc|reset|noreset> tar's behaviour towards archive bits",{COMPL_NONE,COMPL_NONE}},
{"translate",cmd_translate,"toggle text translation for printing",{COMPL_NONE,COMPL_NONE}},
diff --git a/source/libsmb/clifile.c b/source/libsmb/clifile.c
index bf7923ec788..398c7cc4f0a 100644
--- a/source/libsmb/clifile.c
+++ b/source/libsmb/clifile.c
@@ -25,9 +25,10 @@
/****************************************************************************
Hard/Symlink a file (UNIX extensions).
+ Creates new name (sym)linked to oldname.
****************************************************************************/
-static BOOL cli_link_internal(struct cli_state *cli, const char *fname_src, const char *fname_dst, BOOL hard_link)
+static BOOL cli_link_internal(struct cli_state *cli, const char *oldname, const char *newname, BOOL hard_link)
{
unsigned int data_len = 0;
unsigned int param_len = 0;
@@ -36,18 +37,18 @@ static BOOL cli_link_internal(struct cli_state *cli, const char *fname_src, cons
pstring data;
char *rparam=NULL, *rdata=NULL;
char *p;
- size_t srclen = 2*(strlen(fname_src)+1);
- size_t destlen = 2*(strlen(fname_dst) + 1);
+ size_t oldlen = 2*(strlen(oldname)+1);
+ size_t newlen = 2*(strlen(newname)+1);
memset(param, 0, sizeof(param));
SSVAL(param,0,hard_link ? SMB_SET_FILE_UNIX_HLINK : SMB_SET_FILE_UNIX_LINK);
p = &param[6];
- p += clistr_push(cli, p, fname_src, MIN(srclen, sizeof(param)-6), STR_TERMINATE);
+ p += clistr_push(cli, p, newname, MIN(newlen, sizeof(param)-6), STR_TERMINATE);
param_len = PTR_DIFF(p, param);
p = data;
- p += clistr_push(cli, p, fname_dst, MIN(destlen,sizeof(data)), STR_TERMINATE);
+ p += clistr_push(cli, p, oldname, MIN(oldlen,sizeof(data)), STR_TERMINATE);
data_len = PTR_DIFF(p, data);
if (!cli_send_trans(cli, SMBtrans2,
@@ -105,18 +106,18 @@ uint32 unix_perms_to_wire(mode_t perms)
Symlink a file (UNIX extensions).
****************************************************************************/
-BOOL cli_unix_symlink(struct cli_state *cli, const char *fname_src, const char *fname_dst)
+BOOL cli_unix_symlink(struct cli_state *cli, const char *oldname, const char *newname)
{
- return cli_link_internal(cli, fname_src, fname_dst, False);
+ return cli_link_internal(cli, oldname, newname, False);
}
/****************************************************************************
Hard a file (UNIX extensions).
****************************************************************************/
-BOOL cli_unix_hardlink(struct cli_state *cli, const char *fname_src, const char *fname_dst)
+BOOL cli_unix_hardlink(struct cli_state *cli, const char *oldname, const char *newname)
{
- return cli_link_internal(cli, fname_src, fname_dst, True);
+ return cli_link_internal(cli, oldname, newname, True);
}
/****************************************************************************
diff --git a/source/smbd/nttrans.c b/source/smbd/nttrans.c
index c9cc44627db..6ba74d5d503 100644
--- a/source/smbd/nttrans.c
+++ b/source/smbd/nttrans.c
@@ -1500,7 +1500,7 @@ int reply_ntrename(connection_struct *conn,
char *inbuf,char *outbuf,int length,int bufsize)
{
int outsize = 0;
- pstring name;
+ pstring oldname;
pstring newname;
char *p;
NTSTATUS status;
@@ -1515,13 +1515,13 @@ int reply_ntrename(connection_struct *conn,
}
p = smb_buf(inbuf) + 1;
- p += srvstr_get_path(inbuf, name, p, sizeof(name), 0, STR_TERMINATE, &status);
+ p += srvstr_get_path(inbuf, oldname, p, sizeof(oldname), 0, STR_TERMINATE, &status);
if (!NT_STATUS_IS_OK(status)) {
END_PROFILE(SMBntrename);
return ERROR_NT(status);
}
- if( strchr_m(name, ':')) {
+ if( strchr_m(oldname, ':')) {
/* Can't rename a stream. */
END_PROFILE(SMBntrename);
return ERROR_NT(NT_STATUS_ACCESS_DENIED);
@@ -1534,15 +1534,15 @@ int reply_ntrename(connection_struct *conn,
return ERROR_NT(status);
}
- RESOLVE_DFSPATH(name, conn, inbuf, outbuf);
+ RESOLVE_DFSPATH(oldname, conn, inbuf, outbuf);
RESOLVE_DFSPATH(newname, conn, inbuf, outbuf);
- DEBUG(3,("reply_ntrename : %s -> %s\n",name,newname));
+ DEBUG(3,("reply_ntrename : %s -> %s\n",oldname,newname));
if (rename_type == RENAME_FLAG_RENAME) {
- status = rename_internals(conn, name, newname, attrs, False);
+ status = rename_internals(conn, oldname, newname, attrs, False);
} else {
- status = hardlink_internals(conn, name, newname);
+ status = hardlink_internals(conn, oldname, newname);
}
if (!NT_STATUS_IS_OK(status)) {
diff --git a/source/smbd/trans2.c b/source/smbd/trans2.c
index 1e7d845714e..30d68455091 100644
--- a/source/smbd/trans2.c
+++ b/source/smbd/trans2.c
@@ -2825,32 +2825,32 @@ static int ensure_link_is_safe(connection_struct *conn, const char *link_dest_in
code.
****************************************************************************/
-NTSTATUS hardlink_internals(connection_struct *conn, char *name, char *newname)
+NTSTATUS hardlink_internals(connection_struct *conn, char *oldname, char *newname)
{
- BOOL bad_path_src = False;
- BOOL bad_path_dest = False;
+ BOOL bad_path_oldname = False;
+ BOOL bad_path_newname = False;
SMB_STRUCT_STAT sbuf1, sbuf2;
BOOL rc, rcdest;
- pstring last_component_src;
- pstring last_component_dest;
+ pstring last_component_oldname;
+ pstring last_component_newname;
NTSTATUS status = NT_STATUS_OK;
ZERO_STRUCT(sbuf1);
ZERO_STRUCT(sbuf2);
/* No wildcards. */
- if (ms_has_wild(name) || ms_has_wild(newname)) {
+ if (ms_has_wild(newname) || ms_has_wild(oldname)) {
return NT_STATUS_OBJECT_PATH_SYNTAX_BAD;
}
- rc = unix_convert(name,conn,last_component_src,&bad_path_src,&sbuf1);
- if (!rc && bad_path_src) {
+ rc = unix_convert(oldname,conn,last_component_oldname,&bad_path_oldname,&sbuf1);
+ if (!rc && bad_path_oldname) {
return NT_STATUS_OBJECT_PATH_NOT_FOUND;
}
/* Quick check for "." and ".." */
- if (last_component_src[0] == '.') {
- if (!last_component_src[1] || (last_component_src[1] == '.' && !last_component_src[2])) {
+ if (last_component_oldname[0] == '.') {
+ if (!last_component_oldname[1] || (last_component_oldname[1] == '.' && !last_component_oldname[2])) {
return NT_STATUS_OBJECT_NAME_INVALID;
}
}
@@ -2860,19 +2860,19 @@ NTSTATUS hardlink_internals(connection_struct *conn, char *name, char *newname)
return NT_STATUS_OBJECT_NAME_NOT_FOUND;
}
- rcdest = unix_convert(newname,conn,last_component_dest,&bad_path_dest,&sbuf2);
- if (!rcdest && bad_path_dest) {
+ rcdest = unix_convert(newname,conn,last_component_newname,&bad_path_newname,&sbuf2);
+ if (!rcdest && bad_path_newname) {
return NT_STATUS_OBJECT_PATH_NOT_FOUND;
}
/* Quick check for "." and ".." */
- if (last_component_dest[0] == '.') {
- if (!last_component_dest[1] || (last_component_dest[1] == '.' && !last_component_dest[2])) {
+ if (last_component_newname[0] == '.') {
+ if (!last_component_newname[1] || (last_component_newname[1] == '.' && !last_component_newname[2])) {
return NT_STATUS_OBJECT_NAME_INVALID;
}
}
- /* Disallow if already exists. */
+ /* Disallow if newname already exists. */
if (VALID_STAT(sbuf2)) {
return NT_STATUS_OBJECT_NAME_COLLISION;
}
@@ -2882,15 +2882,15 @@ NTSTATUS hardlink_internals(connection_struct *conn, char *name, char *newname)
return NT_STATUS_FILE_IS_A_DIRECTORY;
}
- if (ensure_link_is_safe(conn, newname, newname) != 0)
+ if (ensure_link_is_safe(conn, oldname, oldname) != 0)
return NT_STATUS_ACCESS_DENIED;
- DEBUG(10,("hardlink_internals: doing hard link %s -> %s\n", name, newname ));
+ DEBUG(10,("hardlink_internals: doing hard link %s -> %s\n", newname, oldname ));
- if (SMB_VFS_LINK(conn,name,newname) != 0) {
+ if (SMB_VFS_LINK(conn,oldname,newname) != 0) {
status = map_nt_error_from_unix(errno);
- DEBUG(3,("hardlink_internals: Error %s link %s -> %s\n",
- nt_errstr(status), name,newname));
+ DEBUG(3,("hardlink_internals: Error %s hard link %s -> %s\n",
+ nt_errstr(status), newname, oldname));
}
return status;
@@ -3380,25 +3380,27 @@ size = %.0f, uid = %u, gid = %u, raw perms = 0%o\n",
case SMB_SET_FILE_UNIX_LINK:
{
- pstring link_dest;
+ pstring oldname;
+ char *newname = fname;
+
/* Set a symbolic link. */
/* Don't allow this if follow links is false. */
if (!lp_symlinks(SNUM(conn)))
return(ERROR_DOS(ERRDOS,ERRnoaccess));
- srvstr_get_path(inbuf, link_dest, pdata, sizeof(link_dest), -1, STR_TERMINATE, &status);
+ srvstr_get_path(inbuf, oldname, pdata, sizeof(oldname), -1, STR_TERMINATE, &status);
if (!NT_STATUS_IS_OK(status)) {
return ERROR_NT(status);
}
- if (ensure_link_is_safe(conn, link_dest, link_dest) != 0)
+ if (ensure_link_is_safe(conn, oldname, oldname) != 0)
return(UNIXERROR(ERRDOS,ERRnoaccess));
DEBUG(10,("call_trans2setfilepathinfo: SMB_SET_FILE_UNIX_LINK doing symlink %s -> %s\n",
- fname, link_dest ));
+ fname, oldname ));
- if (SMB_VFS_SYMLINK(conn,link_dest,fname) != 0)
+ if (SMB_VFS_SYMLINK(conn,oldname,newname) != 0)
return(UNIXERROR(ERRDOS,ERRnoaccess));
SSVAL(params,0,0);
send_trans2_replies(outbuf, bufsize, params, 2, *ppdata, 0);
@@ -3407,18 +3409,19 @@ size = %.0f, uid = %u, gid = %u, raw perms = 0%o\n",
case SMB_SET_FILE_UNIX_HLINK:
{
- pstring link_dest;
+ pstring oldname;
+ char *newname = fname;
/* Set a hard link. */
- srvstr_get_path(inbuf, link_dest, pdata, sizeof(link_dest), -1, STR_TERMINATE, &status);
+ srvstr_get_path(inbuf, oldname, pdata, sizeof(oldname), -1, STR_TERMINATE, &status);
if (!NT_STATUS_IS_OK(status)) {
return ERROR_NT(status);
}
DEBUG(10,("call_trans2setfilepathinfo: SMB_SET_FILE_UNIX_LINK doing hard link %s -> %s\n",
- fname, link_dest ));
+ fname, oldname));
- status = hardlink_internals(conn, fname, link_dest);
+ status = hardlink_internals(conn, oldname, newname);
if (!NT_STATUS_IS_OK(status)) {
return ERROR_NT(status);
}