s3: Change unix_convert (and its callers) to use struct smb_filename
authorTim Prouty <tprouty@samba.org>
Tue, 7 Apr 2009 20:39:57 +0000 (13:39 -0700)
committerTim Prouty <tprouty@samba.org>
Thu, 21 May 2009 00:40:15 +0000 (17:40 -0700)
commitc1a21d085d758284fe6997a05396f225da683352
tree5cb74bc432c5e3c76f8eaac6652a3125ea108515
parent5d3d51e9ad1e4db8d9580ce7f2ba4e86e658bb13
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/include/proto.h
source3/include/smb.h
source3/modules/onefs_open.c
source3/printing/nt_printing.c
source3/smbd/filename.c
source3/smbd/msdfs.c
source3/smbd/nttrans.c
source3/smbd/open.c
source3/smbd/reply.c
source3/smbd/trans2.c