]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3 onefs: Change onefs modules to use the new createfile api
authorTim Prouty <tprouty@samba.org>
Mon, 15 Jun 2009 19:13:31 +0000 (12:13 -0700)
committerTim Prouty <tprouty@samba.org>
Mon, 15 Jun 2009 21:03:40 +0000 (14:03 -0700)
source3/modules/onefs.h
source3/modules/onefs_open.c
source3/modules/vfs_onefs_shadow_copy.c

index 70f90b5cd5e24edb44fb15089406353614d24ce7..3e6cd29b51afc5f934ef9f90060c32285f35b104 100644 (file)
@@ -46,8 +46,7 @@ void onefs_init_search_op(struct vfs_handle_struct *handle,
 NTSTATUS onefs_create_file(vfs_handle_struct *handle,
                           struct smb_request *req,
                           uint16_t root_dir_fid,
-                          const char *fname,
-                          uint32_t create_file_flags,
+                          struct smb_filename *smb_fname,
                           uint32_t access_mask,
                           uint32_t share_access,
                           uint32_t create_disposition,
@@ -58,8 +57,7 @@ NTSTATUS onefs_create_file(vfs_handle_struct *handle,
                           struct security_descriptor *sd,
                           struct ea_list *ea_list,
                           files_struct **result,
-                          int *pinfo,
-                          SMB_STRUCT_STAT *psbuf);
+                          int *pinfo);
 
 int onefs_close(vfs_handle_struct *handle, struct files_struct *fsp);
 
index 4198e5fd566a57faf0de9fa86578e96bdd2b1868..c773f9ebbc1a6d69bc337a803a249d088e798bdb 100644 (file)
@@ -1981,8 +1981,7 @@ static void destroy_onefs_fsp_data(void *p_data)
 NTSTATUS onefs_create_file(vfs_handle_struct *handle,
                           struct smb_request *req,
                           uint16_t root_dir_fid,
-                          const char *fname,
-                          uint32_t create_file_flags,
+                          struct smb_filename *smb_fname,
                           uint32_t access_mask,
                           uint32_t share_access,
                           uint32_t create_disposition,
@@ -1993,15 +1992,13 @@ NTSTATUS onefs_create_file(vfs_handle_struct *handle,
                           struct security_descriptor *sd,
                           struct ea_list *ea_list,
                           files_struct **result,
-                          int *pinfo,
-                          SMB_STRUCT_STAT *psbuf)
+                          int *pinfo)
 {
        connection_struct *conn = handle->conn;
-       struct case_semantics_state *case_state = NULL;
        struct onefs_fsp_data fsp_data = {};
-       SMB_STRUCT_STAT sbuf;
        int info = FILE_WAS_OPENED;
        files_struct *fsp = NULL;
+       char *fname = NULL;
        NTSTATUS status;
 
        DEBUG(10,("onefs_create_file: access_mask = 0x%x "
@@ -2009,7 +2006,7 @@ NTSTATUS onefs_create_file(vfs_handle_struct *handle,
                  "create_disposition = 0x%x create_options = 0x%x "
                  "oplock_request = 0x%x "
                  "root_dir_fid = 0x%x, ea_list = 0x%p, sd = 0x%p, "
-                 "create_file_flags = 0x%x, fname = %s\n",
+                 "fname = %s\n",
                  (unsigned int)access_mask,
                  (unsigned int)file_attributes,
                  (unsigned int)share_access,
@@ -2017,7 +2014,7 @@ NTSTATUS onefs_create_file(vfs_handle_struct *handle,
                  (unsigned int)create_options,
                  (unsigned int)oplock_request,
                  (unsigned int)root_dir_fid,
-                 ea_list, sd, create_file_flags, fname));
+                 ea_list, sd, smb_fname_str_dbg(smb_fname)));
 
        /* Get the file name if root_dir_fid was specified. */
        if (root_dir_fid != 0) {
@@ -2036,7 +2033,8 @@ NTSTATUS onefs_create_file(vfs_handle_struct *handle,
        if ((req != NULL) && (req->flags2 & FLAGS2_DFS_PATHNAMES)) {
                char *resolved_fname;
 
-               status = resolve_dfspath(talloc_tos(), conn, true, fname,
+               status = resolve_dfspath(talloc_tos(), conn, true,
+                                        smb_fname->base_name,
                                         &resolved_fname);
 
                if (!NT_STATUS_IS_OK(status)) {
@@ -2048,24 +2046,15 @@ NTSTATUS onefs_create_file(vfs_handle_struct *handle,
                         */
                        goto fail;
                }
-               fname = resolved_fname;
-       }
-
-       /* Check if POSIX semantics are wanted. */
-       if (file_attributes & FILE_FLAG_POSIX_SEMANTICS) {
-               case_state = set_posix_case_semantics(talloc_tos(), conn);
+               TALLOC_FREE(smb_fname->base_name);
+               smb_fname->base_name = resolved_fname;
        }
 
-       if (psbuf != NULL) {
-               sbuf = *psbuf;
-       } else {
-               if (SMB_VFS_STAT(conn, fname, &sbuf) == -1) {
-                       SET_STAT_INVALID(sbuf);
-               }
+       status = get_full_smb_filename(talloc_tos(), smb_fname, &fname);
+       if (!NT_STATUS_IS_OK(status)) {
+               goto fail;
        }
 
-       TALLOC_FREE(case_state);
-
        /* All file access must go through check_name() */
        status = check_name(conn, fname);
        if (!NT_STATUS_IS_OK(status)) {
@@ -2088,7 +2077,7 @@ NTSTATUS onefs_create_file(vfs_handle_struct *handle,
                &fsp,                                   /* result */
                &info,                                  /* pinfo */
                &fsp_data,                              /* fsp_data */
-               &sbuf);                                 /* psbuf */
+               &smb_fname->st);                        /* psbuf */
 
        if (!NT_STATUS_IS_OK(status)) {
                goto fail;
@@ -2120,9 +2109,6 @@ NTSTATUS onefs_create_file(vfs_handle_struct *handle,
        if (pinfo != NULL) {
                *pinfo = info;
        }
-       if (psbuf != NULL) {
-               *psbuf = sbuf;
-       }
        return NT_STATUS_OK;
 
  fail:
index 28bc0c508171d58e2cdacbe5db15a51f1e9414a4..3d4ffc9084aec18c9ad41de50b8cb1d67f9f1acd 100644 (file)
@@ -143,6 +143,27 @@ onefs_shadow_copy_get_shadow_copy_data(vfs_handle_struct *handle,
        return ret;                                                   \
        } while (0)                                                   \
 
+/*
+ * XXX: Convert osc_canonicalize_path to use talloc instead of malloc.
+ */
+#define SHADOW_NEXT_SMB_FNAME(op, args, rtype) do {                  \
+               char *smb_base_name_tmp = NULL;                       \
+               char *cpath = NULL;                                   \
+               char *snap_component = NULL;                          \
+               rtype ret;                                            \
+               smb_base_name_tmp = smb_fname->base_name;             \
+               if (shadow_copy_match_name(smb_fname->base_name,      \
+                       &snap_component)) {                             \
+                       cpath = osc_canonicalize_path(smb_fname->base_name, \
+                           snap_component);                            \
+                       smb_fname->base_name = cpath;                   \
+               }                                                       \
+               ret = SMB_VFS_NEXT_ ## op args;                         \
+               smb_fname->base_name = smb_base_name_tmp;               \
+               SAFE_FREE(cpath);                                       \
+               return ret;                                             \
+       } while (0)                                                     \
+
 
 
 static uint64_t
@@ -205,8 +226,7 @@ static NTSTATUS
 onefs_shadow_copy_create_file(vfs_handle_struct *handle,
                              struct smb_request *req,
                              uint16_t root_dir_fid,
-                             const char *path,
-                             uint32_t create_file_flags,
+                             struct smb_filename *smb_fname,
                              uint32_t access_mask,
                              uint32_t share_access,
                              uint32_t create_disposition,
@@ -217,16 +237,15 @@ onefs_shadow_copy_create_file(vfs_handle_struct *handle,
                              struct security_descriptor *sd,
                              struct ea_list *ea_list,
                              files_struct **result,
-                             int *pinfo,
-                             SMB_STRUCT_STAT *psbuf)
-{
-       SHADOW_NEXT(CREATE_FILE,
-                   (handle, req, root_dir_fid, cpath ?: path,
-                       create_file_flags, access_mask, share_access,
-                       create_disposition, create_options, file_attributes,
-                       oplock_request, allocation_size, sd, ea_list, result,
-                       pinfo, psbuf),
-                   NTSTATUS);
+                             int *pinfo)
+{
+       SHADOW_NEXT_SMB_FNAME(CREATE_FILE,
+                             (handle, req, root_dir_fid, smb_fname,
+                                 access_mask, share_access,
+                                 create_disposition, create_options,
+                                 file_attributes, oplock_request,
+                                 allocation_size, sd, ea_list, result, pinfo),
+                             NTSTATUS);
 }
 
 /**