From c1a21d085d758284fe6997a05396f225da683352 Mon Sep 17 00:00:00 2001 From: Tim Prouty Date: Tue, 7 Apr 2009 13:39:57 -0700 Subject: s3: Change unix_convert (and its callers) to use struct smb_filename This is the first of a series of patches that change path based operations to operate on a struct smb_filename instead of a char *. This same concept already exists in source4. My goals for this series of patches are to eventually: 1) Solve the stream vs. posix filename that contains a colon ambiguity that currently exists. 2) Make unix_convert the only function that parses the stream name. 3) Clean up the unix_convert API. 4) Change all path based vfs operation to take a struct smb_filename. 5) Make is_ntfs_stream_name() a constant operation that can simply check the state of struct smb_filename rather than re-parse the filename. 6) Eliminate the need for split_ntfs_stream_name() to exist. My strategy is to start from the inside at unix_convert() and work my way out through the vfs layer, call by call. This first patch does just that, by changing unix_convert and all of its callers to operate on struct smb_filename. Since this is such a large change, I plan on pushing the patches in phases, where each phase keeps full compatibility and passes make test. The API of unix_convert has been simplified from: NTSTATUS unix_convert(TALLOC_CTX *ctx, connection_struct *conn, const char *orig_path, bool allow_wcard_last_component, char **pp_conv_path, char **pp_saved_last_component, SMB_STRUCT_STAT *pst) to: NTSTATUS unix_convert(TALLOC_CTX *ctx, connection_struct *conn, const char *orig_path, struct smb_filename *smb_fname, uint32_t ucf_flags) Currently the smb_filename struct looks like: struct smb_filename { char *base_name; char *stream_name; char *original_lcomp; SMB_STRUCT_STAT st; }; One key point here is the decision to break up the base_name and stream_name. I have introduced a helper function called get_full_smb_filename() that takes an smb_filename struct and allocates the full_name. I changed the callers of unix_convert() to subsequently call get_full_smb_filename() for the time being, but I plan to eventually eliminate get_full_smb_filename(). --- source3/modules/onefs_open.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'source3/modules') diff --git a/source3/modules/onefs_open.c b/source3/modules/onefs_open.c index dc8bf10a94..7d4379f1fc 100644 --- a/source3/modules/onefs_open.c +++ b/source3/modules/onefs_open.c @@ -2058,16 +2058,27 @@ NTSTATUS onefs_create_file(vfs_handle_struct *handle, /* Convert dos path to unix path if it hasn't already been done. */ if (create_file_flags & CFF_DOS_PATH) { + struct smb_filename *smb_fname = NULL; char *converted_fname; SET_STAT_INVALID(sbuf); - status = unix_convert(talloc_tos(), conn, fname, False, - &converted_fname, NULL, &sbuf); + status = unix_convert(talloc_tos(), conn, fname, &smb_fname, + 0); if (!NT_STATUS_IS_OK(status)) { goto fail; } + + status = get_full_smb_filename(talloc_tos(), &smb_fname, + &converted_fname); + if (!NT_STATUS_IS_OK(status)) { + TALLOC_FREE(smb_fname); + goto fail; + } + + sbuf = smb_fname->st; fname = converted_fname; + TALLOC_FREE(smb_fname); } else { if (psbuf != NULL) { sbuf = *psbuf; -- cgit