diff options
author | Tim Prouty <tprouty@samba.org> | 2009-07-24 11:39:56 -0700 |
---|---|---|
committer | Tim Prouty <tprouty@samba.org> | 2009-07-24 15:10:45 -0700 |
commit | cd5133b1127579fa47152e4c38f4a6534bdf37c7 (patch) | |
tree | 309d18173e34d1236f92689a1cbd69603c306ec2 /source3/smbd/trans2.c | |
parent | 10324b177ed2c5de07039f035905b8272f51fbf7 (diff) | |
download | samba-cd5133b1127579fa47152e4c38f4a6534bdf37c7.tar.gz samba-cd5133b1127579fa47152e4c38f4a6534bdf37c7.tar.bz2 samba-cd5133b1127579fa47152e4c38f4a6534bdf37c7.zip |
s3: Simplify rename_internals() by passing in smb_filename structs
Diffstat (limited to 'source3/smbd/trans2.c')
-rw-r--r-- | source3/smbd/trans2.c | 71 |
1 files changed, 36 insertions, 35 deletions
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index 6a7b1f8b32..6fde8d240c 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -5683,14 +5683,13 @@ static NTSTATUS smb_file_rename_information(connection_struct *conn, const char *pdata, int total_data, files_struct *fsp, - const char *fname) + struct smb_filename *smb_fname_src) { bool overwrite; uint32 root_fid; uint32 len; char *newname = NULL; - char *base_name = NULL; - struct smb_filename *smb_fname = NULL; + struct smb_filename *smb_fname_dst = NULL; bool dest_has_wcard = False; NTSTATUS status = NT_STATUS_OK; char *p; @@ -5741,7 +5740,7 @@ static NTSTATUS smb_file_rename_information(connection_struct *conn, /* Create an smb_fname to call rename_internals_fsp() with. */ status = create_synthetic_smb_fname(talloc_tos(), fsp->base_fsp->fsp_name->base_name, newname, NULL, - &smb_fname); + &smb_fname_dst); if (!NT_STATUS_IS_OK(status)) { goto out; } @@ -5750,28 +5749,31 @@ static NTSTATUS smb_file_rename_information(connection_struct *conn, * Set the original last component, since * rename_internals_fsp() requires it. */ - smb_fname->original_lcomp = talloc_strdup(smb_fname, newname); - if (smb_fname->original_lcomp == NULL) { + smb_fname_dst->original_lcomp = talloc_strdup(smb_fname_dst, + newname); + if (smb_fname_dst->original_lcomp == NULL) { status = NT_STATUS_NO_MEMORY; goto out; } - /* Create a char * to call rename_internals() with. */ - base_name = talloc_asprintf(ctx, "%s%s", - fsp->base_fsp->fsp_name->base_name, - newname); - if (!base_name) { - status = NT_STATUS_NO_MEMORY; - goto out; - } } else { + /* + * Build up an smb_fname_dst based on the filename passed in. + * We basically just strip off the last component, and put on + * the newname instead. + */ + char *base_name = NULL; + /* newname must *not* be a stream name. */ if (newname[0] == ':') { return NT_STATUS_NOT_SUPPORTED; } - /* Create the base directory. */ - base_name = talloc_strdup(ctx, fname); + /* + * Strip off the last component (filename) of the path passed + * in. + */ + base_name = talloc_strdup(ctx, smb_fname_src->base_name); if (!base_name) { return NT_STATUS_NO_MEMORY; } @@ -5792,8 +5794,10 @@ static NTSTATUS smb_file_rename_information(connection_struct *conn, return NT_STATUS_NO_MEMORY; } - status = unix_convert(ctx, conn, base_name, &smb_fname, - UCF_SAVE_LCOMP); + status = unix_convert(ctx, conn, base_name, &smb_fname_dst, + (UCF_SAVE_LCOMP | + (dest_has_wcard ? + UCF_ALLOW_WCARD_LCOMP : 0))); /* If an error we expect this to be * NT_STATUS_OBJECT_PATH_NOT_FOUND */ @@ -5804,32 +5808,35 @@ static NTSTATUS smb_file_rename_information(connection_struct *conn, goto out; } /* Create an smb_fname to call rename_internals_fsp() */ - status = create_synthetic_smb_fname(talloc_tos(), + status = create_synthetic_smb_fname(ctx, base_name, NULL, - NULL, &smb_fname); + NULL, + &smb_fname_dst); if (!NT_STATUS_IS_OK(status)) { goto out; } } - } if (fsp) { DEBUG(10,("smb_file_rename_information: " "SMB_FILE_RENAME_INFORMATION (fnum %d) %s -> %s\n", - fsp->fnum, fsp_str_dbg(fsp), base_name)); - status = rename_internals_fsp(conn, fsp, smb_fname, 0, + fsp->fnum, fsp_str_dbg(fsp), + smb_fname_str_dbg(smb_fname_dst))); + status = rename_internals_fsp(conn, fsp, smb_fname_dst, 0, overwrite); } else { DEBUG(10,("smb_file_rename_information: " "SMB_FILE_RENAME_INFORMATION %s -> %s\n", - fname, base_name)); - status = rename_internals(ctx, conn, req, fname, base_name, 0, - overwrite, False, dest_has_wcard, - FILE_WRITE_ATTRIBUTES); + smb_fname_str_dbg(smb_fname_src), + smb_fname_str_dbg(smb_fname_dst))); + status = rename_internals(ctx, conn, req, smb_fname_src, + smb_fname_dst, 0, overwrite, false, + dest_has_wcard, + FILE_WRITE_ATTRIBUTES); } out: - TALLOC_FREE(smb_fname); + TALLOC_FREE(smb_fname_dst); return status; } @@ -7072,7 +7079,6 @@ NTSTATUS smbd_do_setfilepathinfo(connection_struct *conn, int *ret_data_size) { char *pdata = *ppdata; - char *fname = NULL; NTSTATUS status = NT_STATUS_OK; int data_return_size = 0; @@ -7090,11 +7096,6 @@ NTSTATUS smbd_do_setfilepathinfo(connection_struct *conn, } } - status = get_full_smb_filename(mem_ctx, smb_fname, &fname); - if (!NT_STATUS_IS_OK(status)) { - return status; - } - DEBUG(3,("smbd_do_setfilepathinfo: %s (fnum %d) info_level=%d " "totdata=%d\n", smb_fname_str_dbg(smb_fname), fsp ? fsp->fnum : -1, info_level, total_data)); @@ -7248,7 +7249,7 @@ NTSTATUS smbd_do_setfilepathinfo(connection_struct *conn, { status = smb_file_rename_information(conn, req, pdata, total_data, - fsp, fname); + fsp, smb_fname); break; } |