diff options
| author | Tim Prouty <tprouty@samba.org> | 2008-11-19 17:55:28 -0800 | 
|---|---|---|
| committer | Tim Prouty <tprouty@samba.org> | 2008-12-03 17:50:37 -0800 | 
| commit | f995a7af2a06ccff29f23f1b099e0a84bc948f6e (patch) | |
| tree | 4d1b1b193f16ea3c6c5567127084cfe9d74be17b | |
| parent | f38d7f20a865b1ff5f7b039dd284d91b2ba7ec26 (diff) | |
| download | samba-f995a7af2a06ccff29f23f1b099e0a84bc948f6e.tar.gz samba-f995a7af2a06ccff29f23f1b099e0a84bc948f6e.tar.bz2 samba-f995a7af2a06ccff29f23f1b099e0a84bc948f6e.zip  | |
s3: Add new "is_dos_path" argument to SMB_VFS_CREATE_FILE
Now unix paths can be differentiated from windows paths so the
underlying create_file implementations can convert paths correctly.
| -rw-r--r-- | source3/include/proto.h | 1 | ||||
| -rw-r--r-- | source3/include/vfs.h | 1 | ||||
| -rw-r--r-- | source3/include/vfs_macros.h | 6 | ||||
| -rw-r--r-- | source3/modules/vfs_default.c | 3 | ||||
| -rw-r--r-- | source3/rpc_server/srv_srvsvc_nt.c | 2 | ||||
| -rw-r--r-- | source3/smbd/nttrans.c | 2 | ||||
| -rw-r--r-- | source3/smbd/open.c | 7 | ||||
| -rw-r--r-- | source3/smbd/reply.c | 3 | ||||
| -rw-r--r-- | source3/smbd/trans2.c | 1 | 
9 files changed, 19 insertions, 7 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h index 05ef17b51c..258139b877 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -8154,6 +8154,7 @@ NTSTATUS create_file_default(connection_struct *conn,  			     struct smb_request *req,  			     uint16_t root_dir_fid,  			     const char *fname, +			     bool is_dos_path,  			     uint32_t access_mask,  			     uint32_t share_access,  			     uint32_t create_disposition, diff --git a/source3/include/vfs.h b/source3/include/vfs.h index 03b4b8e706..5f6851a7bc 100644 --- a/source3/include/vfs.h +++ b/source3/include/vfs.h @@ -313,6 +313,7 @@ struct vfs_ops {  					struct smb_request *req,  					uint16_t root_dir_fid,  					const char *fname, +					bool is_dos_path,  					uint32_t access_mask,  					uint32_t share_access,  					uint32_t create_disposition, diff --git a/source3/include/vfs_macros.h b/source3/include/vfs_macros.h index 5c57e92899..97107f3f60 100644 --- a/source3/include/vfs_macros.h +++ b/source3/include/vfs_macros.h @@ -48,7 +48,7 @@  /* File operations */  #define SMB_VFS_OPEN(conn, fname, fsp, flags, mode) (((conn)->vfs.ops.open)((conn)->vfs.handles.open, (fname), (fsp), (flags), (mode))) -#define SMB_VFS_CREATE_FILE(conn, req, root_dir_fid, fname, access_mask, share_access, create_disposition, create_options, file_attributes, oplock_request, allocation_size, sd, ea_list, result, pinfo, psbuf) (((conn)->vfs.ops.create_file)((conn)->vfs.handles.create_file, (req), (root_dir_fid), (fname), (access_mask), (share_access), (create_disposition), (create_options), (file_attributes), (oplock_request), (allocation_size), (sd), (ea_list), (result), (pinfo), (psbuf))) +#define SMB_VFS_CREATE_FILE(conn, req, root_dir_fid, fname, is_dos_path, access_mask, share_access, create_disposition, create_options, file_attributes, oplock_request, allocation_size, sd, ea_list, result, pinfo, psbuf) (((conn)->vfs.ops.create_file)((conn)->vfs.handles.create_file, (req), (root_dir_fid), (fname), (is_dos_path), (access_mask), (share_access), (create_disposition), (create_options), (file_attributes), (oplock_request), (allocation_size), (sd), (ea_list), (result), (pinfo), (psbuf)))  #define SMB_VFS_CLOSE(fsp) ((fsp)->conn->vfs.ops.close_fn((fsp)->conn->vfs.handles.close_hnd, (fsp)))  #define SMB_VFS_READ(fsp, data, n) ((fsp)->conn->vfs.ops.vfs_read((fsp)->conn->vfs.handles.vfs_read, (fsp), (data), (n)))  #define SMB_VFS_PREAD(fsp, data, n, off) ((fsp)->conn->vfs.ops.pread((fsp)->conn->vfs.handles.pread, (fsp), (data), (n), (off))) @@ -174,7 +174,7 @@  /* File operations */  #define SMB_VFS_OPAQUE_OPEN(conn, fname, fsp, flags, mode) (((conn)->vfs_opaque.ops.open)((conn)->vfs_opaque.handles.open, (fname), (fsp), (flags), (mode))) -#define SMB_VFS_OPAQUE_CREATE_FILE(conn, req, root_dir_fid, fname, access_mask, share_access, create_disposition, create_options, file_attributes, oplock_request, allocation_size, sd, ea_list, result, pinfo, psbuf) (((conn)->vfs_opaque.ops.create_file)((conn)->vfs_opaque.handles.create_file, (req), (root_dir_fid), (fname), (access_mask), (share_access), (create_disposition), (create_options), (file_attributes), (oplock_request), (allocation_size), (sd), (ea_list), (result), (pinfo), (psbuf))) +#define SMB_VFS_OPAQUE_CREATE_FILE(conn, req, root_dir_fid, fname, is_dos_path, access_mask, share_access, create_disposition, create_options, file_attributes, oplock_request, allocation_size, sd, ea_list, result, pinfo, psbuf) (((conn)->vfs_opaque.ops.create_file)((conn)->vfs_opaque.handles.create_file, (req), (root_dir_fid), (fname), (is_dos_path), (access_mask), (share_access), (create_disposition), (create_options), (file_attributes), (oplock_request), (allocation_size), (sd), (ea_list), (result), (pinfo), (psbuf)))  #define SMB_VFS_OPAQUE_CLOSE(fsp) ((fsp)->conn->vfs_opaque.ops.close_fn((fsp)->conn->vfs_opaque.handles.close_hnd, (fsp)))  #define SMB_VFS_OPAQUE_READ(fsp, data, n) ((fsp)->conn->vfs_opaque.ops.vfs_read((fsp)->conn->vfs_opaque.handles.vfs_read, (fsp), (data), (n)))  #define SMB_VFS_OPAQUE_PREAD(fsp, data, n, off) ((fsp)->conn->vfs_opaque.ops.pread((fsp)->conn->vfs_opaque.handles.pread, (fsp), (data), (n), (off))) @@ -301,7 +301,7 @@  /* File operations */  #define SMB_VFS_NEXT_OPEN(handle, fname, fsp, flags, mode) (((handle)->vfs_next.ops.open)((handle)->vfs_next.handles.open, (fname), (fsp), (flags), (mode))) -#define SMB_VFS_NEXT_CREATE_FILE(handle, req, root_dir_fid, fname, access_mask, share_access, create_disposition, create_options, file_attributes, oplock_request, allocation_size, sd, ea_list, result, pinfo, psbuf) (((handle)->vfs_next.ops.create_file)((handle)->vfs_next.handles.create_file, (req), (root_dir_fid), (fname), (access_mask), (share_access), (create_disposition), (create_options), (file_attributes), (oplock_request), (allocation_size), (sd), (ea_list), (result), (pinfo), (psbuf))) +#define SMB_VFS_NEXT_CREATE_FILE(handle, req, root_dir_fid, fname, is_dos_path, access_mask, share_access, create_disposition, create_options, file_attributes, oplock_request, allocation_size, sd, ea_list, result, pinfo, psbuf) (((handle)->vfs_next.ops.create_file)((handle)->vfs_next.handles.create_file, (req), (root_dir_fid), (fname), (is_dos_path), (access_mask), (share_access), (create_disposition), (create_options), (file_attributes), (oplock_request), (allocation_size), (sd), (ea_list), (result), (pinfo), (psbuf)))  #define SMB_VFS_NEXT_CLOSE(handle, fsp) ((handle)->vfs_next.ops.close_fn((handle)->vfs_next.handles.close_hnd, (fsp)))  #define SMB_VFS_NEXT_READ(handle, fsp, data, n) ((handle)->vfs_next.ops.vfs_read((handle)->vfs_next.handles.vfs_read, (fsp), (data), (n)))  #define SMB_VFS_NEXT_PREAD(handle, fsp, data, n, off) ((handle)->vfs_next.ops.pread((handle)->vfs_next.handles.pread, (fsp), (data), (n), (off))) diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c index bca06dfaf7..fde899d1af 100644 --- a/source3/modules/vfs_default.c +++ b/source3/modules/vfs_default.c @@ -212,6 +212,7 @@ static NTSTATUS vfswrap_create_file(vfs_handle_struct *handle,  				    struct smb_request *req,  				    uint16_t root_dir_fid,  				    const char *fname, +				    bool is_dos_path,  				    uint32_t access_mask,  				    uint32_t share_access,  				    uint32_t create_disposition, @@ -226,7 +227,7 @@ static NTSTATUS vfswrap_create_file(vfs_handle_struct *handle,  				    SMB_STRUCT_STAT *psbuf)  {  	return create_file_default(handle->conn, req, root_dir_fid, fname, -				   access_mask, share_access, +				   is_dos_path, access_mask, share_access,  				   create_disposition, create_options,  				   file_attributes, oplock_request,  				   allocation_size, sd, ea_list, result, pinfo, diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index b1a31f1761..0febfbca06 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -2053,6 +2053,7 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p,  		NULL,					/* req */  		0,					/* root_dir_fid */  		r->in.file,				/* fname */ +		true,					/* is_dos_path */  		FILE_READ_ATTRIBUTES,			/* access_mask */  		FILE_SHARE_READ|FILE_SHARE_WRITE,	/* share_access */  		FILE_OPEN,				/* create_disposition*/ @@ -2167,6 +2168,7 @@ WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p,  		NULL,					/* req */  		0,					/* root_dir_fid */  		r->in.file,				/* fname */ +		true,					/* is_dos_path */  		FILE_WRITE_ATTRIBUTES,			/* access_mask */  		FILE_SHARE_READ|FILE_SHARE_WRITE,	/* share_access */  		FILE_OPEN,				/* create_disposition*/ diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c index f2c6eaccca..b66aba5aac 100644 --- a/source3/smbd/nttrans.c +++ b/source3/smbd/nttrans.c @@ -479,6 +479,7 @@ void reply_ntcreate_and_X(struct smb_request *req)  		req,					/* req */  		root_dir_fid,				/* root_dir_fid */  		fname,					/* fname */ +		true,					/* is_dos_path */  		access_mask,				/* access_mask */  		share_access,				/* share_access */  		create_disposition,			/* create_disposition*/ @@ -950,6 +951,7 @@ static void call_nt_transact_create(connection_struct *conn,  		req,					/* req */  		root_dir_fid,				/* root_dir_fid */  		fname,					/* fname */ +		true,					/* is_dos_path */  		access_mask,				/* access_mask */  		share_access,				/* share_access */  		create_disposition,			/* create_disposition*/ diff --git a/source3/smbd/open.c b/source3/smbd/open.c index 924b6c5905..d8f5548883 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -3086,6 +3086,7 @@ NTSTATUS create_file_default(connection_struct *conn,  			     struct smb_request *req,  			     uint16_t root_dir_fid,  			     const char *fname, +			     bool is_dos_path,  			     uint32_t access_mask,  			     uint32_t share_access,  			     uint32_t create_disposition, @@ -3111,7 +3112,7 @@ NTSTATUS create_file_default(connection_struct *conn,  		  "create_disposition = 0x%x create_options = 0x%x "  		  "oplock_request = 0x%x "  		  "root_dir_fid = 0x%x, ea_list = 0x%p, sd = 0x%p, " -		  "fname = %s\n", +		  "is_dos_path = %s, fname = %s\n",  		  (unsigned int)access_mask,  		  (unsigned int)file_attributes,  		  (unsigned int)share_access, @@ -3119,7 +3120,7 @@ NTSTATUS create_file_default(connection_struct *conn,  		  (unsigned int)create_options,  		  (unsigned int)oplock_request,  		  (unsigned int)root_dir_fid, -		  ea_list, sd, fname)); +		  ea_list, sd, fname, is_dos_path ? "true" : "false"));  	/*  	 * Get the file name. @@ -3275,7 +3276,7 @@ NTSTATUS create_file_default(connection_struct *conn,  		file_attributes &= ~FILE_FLAG_POSIX_SEMANTICS;  	} -	{ +	if (is_dos_path) {  		char *converted_fname;  		SET_STAT_INVALID(sbuf); diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index dfd4b47608..80292636a6 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -1635,6 +1635,7 @@ void reply_open(struct smb_request *req)  		req,					/* req */  		0,					/* root_dir_fid */  		fname,					/* fname */ +		true,					/* is_dos_path */  		access_mask,				/* access_mask */  		share_mode,				/* share_access */  		create_disposition,			/* create_disposition*/ @@ -1780,6 +1781,7 @@ void reply_open_and_X(struct smb_request *req)  		req,					/* req */  		0,					/* root_dir_fid */  		fname,					/* fname */ +		true,					/* is_dos_path */  		access_mask,				/* access_mask */  		share_mode,				/* share_access */  		create_disposition,			/* create_disposition*/ @@ -1979,6 +1981,7 @@ void reply_mknew(struct smb_request *req)  		req,					/* req */  		0,					/* root_dir_fid */  		fname,					/* fname */ +		true,					/* is_dos_path */  		access_mask,				/* access_mask */  		share_mode,				/* share_access */  		create_disposition,			/* create_disposition*/ diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index 4669e883fd..9ba6d198c4 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -1011,6 +1011,7 @@ static void call_trans2open(connection_struct *conn,  		req,					/* req */  		0,					/* root_dir_fid */  		fname,					/* fname */ +		true,					/* is_dos_path */  		access_mask,				/* access_mask */  		share_mode,				/* share_access */  		create_disposition,			/* create_disposition*/  | 
