selftest/Samba4: make use of get_cmd_env_vars() to setup all relevant env variables
[samba.git] / source3 / modules / vfs_time_audit.c
index 28196b55a8d84a4e2a4037564569f193c3393e58..59bc68861b46645cc173d06a10970670c6193456 100644 (file)
@@ -369,6 +369,14 @@ static NTSTATUS smb_time_audit_read_dfs_pathat(struct vfs_handle_struct *handle,
        NTSTATUS result;
        struct timespec ts1,ts2;
        double timediff;
+       struct smb_filename *full_fname = NULL;
+
+       full_fname = full_path_from_dirfsp_atname(talloc_tos(),
+                                                 dirfsp,
+                                                 smb_fname);
+       if (full_fname == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
 
        clock_gettime_mono(&ts1);
        result = SMB_VFS_NEXT_READ_DFS_PATHAT(handle,
@@ -381,9 +389,12 @@ static NTSTATUS smb_time_audit_read_dfs_pathat(struct vfs_handle_struct *handle,
        timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
 
        if (timediff > audit_timeout) {
-               smb_time_audit_log("read_dfs_pathat", timediff);
+               smb_time_audit_log_smb_fname("read_dfs_pathat",
+                       timediff,
+                       full_fname);
        }
 
+       TALLOC_FREE(full_fname);
        return result;
 }
 
@@ -478,15 +489,14 @@ static DIR *smb_time_audit_fdopendir(vfs_handle_struct *handle,
 
 static struct dirent *smb_time_audit_readdir(vfs_handle_struct *handle,
                                             struct files_struct *dirfsp,
-                                            DIR *dirp,
-                                            SMB_STRUCT_STAT *sbuf)
+                                            DIR *dirp)
 {
        struct dirent *result;
        struct timespec ts1,ts2;
        double timediff;
 
        clock_gettime_mono(&ts1);
-       result = SMB_VFS_NEXT_READDIR(handle, dirfsp, dirp, sbuf);
+       result = SMB_VFS_NEXT_READDIR(handle, dirfsp, dirp);
        clock_gettime_mono(&ts2);
        timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
 
@@ -497,42 +507,6 @@ static struct dirent *smb_time_audit_readdir(vfs_handle_struct *handle,
        return result;
 }
 
-static void smb_time_audit_seekdir(vfs_handle_struct *handle,
-                                  DIR *dirp, long offset)
-{
-       struct timespec ts1,ts2;
-       double timediff;
-
-       clock_gettime_mono(&ts1);
-       SMB_VFS_NEXT_SEEKDIR(handle, dirp, offset);
-       clock_gettime_mono(&ts2);
-       timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
-
-       if (timediff > audit_timeout) {
-               smb_time_audit_log("seekdir", timediff);
-       }
-
-}
-
-static long smb_time_audit_telldir(vfs_handle_struct *handle,
-                                  DIR *dirp)
-{
-       long result;
-       struct timespec ts1,ts2;
-       double timediff;
-
-       clock_gettime_mono(&ts1);
-       result = SMB_VFS_NEXT_TELLDIR(handle, dirp);
-       clock_gettime_mono(&ts2);
-       timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
-
-       if (timediff > audit_timeout) {
-               smb_time_audit_log("telldir", timediff);
-       }
-
-       return result;
-}
-
 static void smb_time_audit_rewinddir(vfs_handle_struct *handle,
                                     DIR *dirp)
 {
@@ -610,8 +584,7 @@ static int smb_time_audit_openat(vfs_handle_struct *handle,
                                 const struct files_struct *dirfsp,
                                 const struct smb_filename *smb_fname,
                                 struct files_struct *fsp,
-                                int flags,
-                                mode_t mode)
+                                const struct vfs_open_how *how)
 {
        int result;
        struct timespec ts1,ts2;
@@ -622,8 +595,7 @@ static int smb_time_audit_openat(vfs_handle_struct *handle,
                                     dirfsp,
                                     smb_fname,
                                     fsp,
-                                    flags,
-                                    mode);
+                                    how);
        clock_gettime_mono(&ts2);
        timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
 
@@ -636,6 +608,7 @@ static int smb_time_audit_openat(vfs_handle_struct *handle,
 
 static NTSTATUS smb_time_audit_create_file(vfs_handle_struct *handle,
                                           struct smb_request *req,
+                                          struct files_struct *dirfsp,
                                           struct smb_filename *fname,
                                           uint32_t access_mask,
                                           uint32_t share_access,
@@ -661,6 +634,7 @@ static NTSTATUS smb_time_audit_create_file(vfs_handle_struct *handle,
        result = SMB_VFS_NEXT_CREATE_FILE(
                handle,                                 /* handle */
                req,                                    /* req */
+               dirfsp,                                 /* dirfsp */
                fname,                                  /* fname */
                access_mask,                            /* access_mask */
                share_access,                           /* share_access */
@@ -949,7 +923,15 @@ static int smb_time_audit_renameat(vfs_handle_struct *handle,
        int result;
        struct timespec ts1,ts2;
        double timediff;
+       struct smb_filename *new_full_fname = NULL;
 
+       new_full_fname = full_path_from_dirfsp_atname(talloc_tos(),
+                                                 dstfsp,
+                                                 newname);
+       if (new_full_fname == NULL) {
+               errno = ENOMEM;
+               return -1;
+       }
        clock_gettime_mono(&ts1);
        result = SMB_VFS_NEXT_RENAMEAT(handle,
                        srcfsp,
@@ -960,9 +942,12 @@ static int smb_time_audit_renameat(vfs_handle_struct *handle,
        timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
 
        if (timediff > audit_timeout) {
-               smb_time_audit_log_smb_fname("renameat", timediff, newname);
+               smb_time_audit_log_smb_fname("renameat",
+                                       timediff,
+                                       new_full_fname);
        }
 
+       TALLOC_FREE(new_full_fname);
        return result;
 }
 
@@ -1085,6 +1070,29 @@ static int smb_time_audit_lstat(vfs_handle_struct *handle,
        return result;
 }
 
+static int smb_time_audit_fstatat(
+       struct vfs_handle_struct *handle,
+       const struct files_struct *dirfsp,
+       const struct smb_filename *smb_fname,
+       SMB_STRUCT_STAT *sbuf,
+       int flags)
+{
+       int result;
+       struct timespec ts1,ts2;
+       double timediff;
+
+       clock_gettime_mono(&ts1);
+       result = SMB_VFS_NEXT_FSTATAT(handle, dirfsp, smb_fname, sbuf, flags);
+       clock_gettime_mono(&ts2);
+       timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
+
+       if (timediff > audit_timeout) {
+               smb_time_audit_log_smb_fname("fstatat", timediff, smb_fname);
+       }
+
+       return result;
+}
+
 static uint64_t smb_time_audit_get_alloc_size(vfs_handle_struct *handle,
                                              files_struct *fsp,
                                              const SMB_STRUCT_STAT *sbuf)
@@ -1327,23 +1335,25 @@ static bool smb_time_audit_lock(vfs_handle_struct *handle, files_struct *fsp,
        return result;
 }
 
-static int smb_time_audit_kernel_flock(struct vfs_handle_struct *handle,
-                                      struct files_struct *fsp,
-                                      uint32_t share_access,
-                                      uint32_t access_mask)
+static int smb_time_audit_filesystem_sharemode(struct vfs_handle_struct *handle,
+                                              struct files_struct *fsp,
+                                              uint32_t share_access,
+                                              uint32_t access_mask)
 {
        int result;
        struct timespec ts1,ts2;
        double timediff;
 
        clock_gettime_mono(&ts1);
-       result = SMB_VFS_NEXT_KERNEL_FLOCK(handle, fsp, share_access,
-                                          access_mask);
+       result = SMB_VFS_NEXT_FILESYSTEM_SHAREMODE(handle,
+                                                  fsp,
+                                                  share_access,
+                                                  access_mask);
        clock_gettime_mono(&ts2);
        timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
 
        if (timediff > audit_timeout) {
-               smb_time_audit_log_fsp("kernel_flock", timediff, fsp);
+               smb_time_audit_log_fsp("filesystem_sharemode", timediff, fsp);
        }
 
        return result;
@@ -1368,7 +1378,7 @@ static int smb_time_audit_fcntl(struct vfs_handle_struct *handle,
 
        timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
        if (timediff > audit_timeout) {
-               smb_time_audit_log_fsp("kernel_flock", timediff, fsp);
+               smb_time_audit_log_fsp("fcntl", timediff, fsp);
        }
 
        return result;
@@ -1584,8 +1594,8 @@ static struct smb_filename *smb_time_audit_realpath(vfs_handle_struct *handle,
        return result_fname;
 }
 
-static int smb_time_audit_chflags(vfs_handle_struct *handle,
-                               const struct smb_filename *smb_fname,
+static int smb_time_audit_fchflags(vfs_handle_struct *handle,
+                               struct files_struct *fsp,
                                unsigned int flags)
 {
        int result;
@@ -1593,12 +1603,14 @@ static int smb_time_audit_chflags(vfs_handle_struct *handle,
        double timediff;
 
        clock_gettime_mono(&ts1);
-       result = SMB_VFS_NEXT_CHFLAGS(handle, smb_fname, flags);
+       result = SMB_VFS_NEXT_FCHFLAGS(handle, fsp, flags);
        clock_gettime_mono(&ts2);
        timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
 
        if (timediff > audit_timeout) {
-               smb_time_audit_log_smb_fname("chflags", timediff, smb_fname);
+               smb_time_audit_log_smb_fname("chflags",
+                                            timediff,
+                                            fsp->fsp_name);
        }
 
        return result;
@@ -1668,39 +1680,43 @@ static NTSTATUS smb_time_audit_fstreaminfo(vfs_handle_struct *handle,
        return result;
 }
 
-static int smb_time_audit_get_real_filename(struct vfs_handle_struct *handle,
-                                           const struct smb_filename *path,
-                                           const char *name,
-                                           TALLOC_CTX *mem_ctx,
-                                           char **found_name)
+static NTSTATUS smb_time_audit_get_real_filename_at(
+       struct vfs_handle_struct *handle,
+       struct files_struct *dirfsp,
+       const char *name,
+       TALLOC_CTX *mem_ctx,
+       char **found_name)
 {
-       int result;
+       NTSTATUS result;
        struct timespec ts1,ts2;
        double timediff;
 
        clock_gettime_mono(&ts1);
-       result = SMB_VFS_NEXT_GET_REAL_FILENAME(handle, path, name, mem_ctx,
-                                               found_name);
+       result = SMB_VFS_NEXT_GET_REAL_FILENAME_AT(
+               handle, dirfsp, name, mem_ctx, found_name);
        clock_gettime_mono(&ts2);
        timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
 
        if (timediff > audit_timeout) {
-               smb_time_audit_log_fname("get_real_filename",
-                                        timediff, path->base_name);
+               smb_time_audit_log_fname("get_real_filename_at",
+                                        timediff,
+                                        fsp_str_dbg(dirfsp));
        }
 
        return result;
 }
 
-static const char *smb_time_audit_connectpath(vfs_handle_struct *handle,
-                                       const struct smb_filename *smb_fname)
+static const char *smb_time_audit_connectpath(
+       vfs_handle_struct *handle,
+       const struct files_struct *dirfsp,
+       const struct smb_filename *smb_fname)
 {
        const char *result;
        struct timespec ts1,ts2;
        double timediff;
 
        clock_gettime_mono(&ts1);
-       result = SMB_VFS_NEXT_CONNECTPATH(handle, smb_fname);
+       result = SMB_VFS_NEXT_CONNECTPATH(handle, dirfsp, smb_fname);
        clock_gettime_mono(&ts2);
        timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
 
@@ -2005,6 +2021,8 @@ static NTSTATUS smb_time_fset_dos_attributes(struct vfs_handle_struct *handle,
 struct time_audit_offload_read_state {
        struct vfs_handle_struct *handle;
        struct timespec ts_send;
+       uint32_t flags;
+       uint64_t xferlen;
        DATA_BLOB token_blob;
 };
 
@@ -2055,6 +2073,8 @@ static void smb_time_audit_offload_read_done(struct tevent_req *subreq)
        status = SMB_VFS_NEXT_OFFLOAD_READ_RECV(subreq,
                                                state->handle,
                                                state,
+                                               &state->flags,
+                                               &state->xferlen,
                                                &state->token_blob);
        TALLOC_FREE(subreq);
        if (tevent_req_nterror(req, status)) {
@@ -2067,6 +2087,8 @@ static NTSTATUS smb_time_audit_offload_read_recv(
        struct tevent_req *req,
        struct vfs_handle_struct *handle,
        TALLOC_CTX *mem_ctx,
+       uint32_t *flags,
+       uint64_t *xferlen,
        DATA_BLOB *token_blob)
 {
        struct time_audit_offload_read_state *state = tevent_req_data(
@@ -2086,6 +2108,8 @@ static NTSTATUS smb_time_audit_offload_read_recv(
                return status;
        }
 
+       *flags = state->flags;
+       *xferlen = state->xferlen;
        token_blob->length = state->token_blob.length;
        token_blob->data = talloc_move(mem_ctx, &state->token_blob.data);
 
@@ -2266,36 +2290,6 @@ static NTSTATUS smb_time_audit_fget_nt_acl(vfs_handle_struct *handle,
        return result;
 }
 
-static NTSTATUS smb_time_audit_get_nt_acl_at(vfs_handle_struct *handle,
-                               struct files_struct *dirfsp,
-                               const struct smb_filename *smb_fname,
-                               uint32_t security_info,
-                               TALLOC_CTX *mem_ctx,
-                               struct security_descriptor **ppdesc)
-{
-       NTSTATUS result;
-       struct timespec ts1,ts2;
-       double timediff;
-
-       clock_gettime_mono(&ts1);
-       result = SMB_VFS_NEXT_GET_NT_ACL_AT(handle,
-                                       dirfsp,
-                                       smb_fname,
-                                       security_info,
-                                       mem_ctx,
-                                       ppdesc);
-       clock_gettime_mono(&ts2);
-       timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
-
-       if (timediff > audit_timeout) {
-               smb_time_audit_log_fname("get_nt_acl",
-                       timediff,
-                       smb_fname->base_name);
-       }
-
-       return result;
-}
-
 static NTSTATUS smb_time_audit_fset_nt_acl(vfs_handle_struct *handle,
                                           files_struct *fsp,
                                           uint32_t security_info_sent,
@@ -2346,31 +2340,9 @@ static NTSTATUS smb_time_audit_audit_file(struct vfs_handle_struct *handle,
        return result;
 }
 
-static SMB_ACL_T smb_time_audit_sys_acl_get_file(vfs_handle_struct *handle,
-                                       const struct smb_filename *smb_fname,
-                                       SMB_ACL_TYPE_T type,
-                                       TALLOC_CTX *mem_ctx)
-{
-       SMB_ACL_T result;
-       struct timespec ts1,ts2;
-       double timediff;
-
-       clock_gettime_mono(&ts1);
-       result = SMB_VFS_NEXT_SYS_ACL_GET_FILE(handle, smb_fname,
-                               type, mem_ctx);
-       clock_gettime_mono(&ts2);
-       timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
-
-       if (timediff > audit_timeout) {
-               smb_time_audit_log_fname("sys_acl_get_file", timediff,
-                       smb_fname->base_name);
-       }
-
-       return result;
-}
-
 static SMB_ACL_T smb_time_audit_sys_acl_get_fd(vfs_handle_struct *handle,
                                               files_struct *fsp,
+                                              SMB_ACL_TYPE_T type,
                                               TALLOC_CTX *mem_ctx)
 {
        SMB_ACL_T result;
@@ -2378,7 +2350,7 @@ static SMB_ACL_T smb_time_audit_sys_acl_get_fd(vfs_handle_struct *handle,
        double timediff;
 
        clock_gettime_mono(&ts1);
-       result = SMB_VFS_NEXT_SYS_ACL_GET_FD(handle, fsp, mem_ctx);
+       result = SMB_VFS_NEXT_SYS_ACL_GET_FD(handle, fsp, type, mem_ctx);
        clock_gettime_mono(&ts2);
        timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
 
@@ -2389,30 +2361,6 @@ static SMB_ACL_T smb_time_audit_sys_acl_get_fd(vfs_handle_struct *handle,
        return result;
 }
 
-
-static int smb_time_audit_sys_acl_blob_get_file(vfs_handle_struct *handle,
-                               const struct smb_filename *smb_fname,
-                               TALLOC_CTX *mem_ctx,
-                               char **blob_description,
-                               DATA_BLOB *blob)
-{
-       int result;
-       struct timespec ts1,ts2;
-       double timediff;
-
-       clock_gettime_mono(&ts1);
-       result = SMB_VFS_NEXT_SYS_ACL_BLOB_GET_FILE(handle, smb_fname,
-                               mem_ctx, blob_description, blob);
-       clock_gettime_mono(&ts2);
-       timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
-
-       if (timediff > audit_timeout) {
-               smb_time_audit_log("sys_acl_blob_get_file", timediff);
-       }
-
-       return result;
-}
-
 static int smb_time_audit_sys_acl_blob_get_fd(vfs_handle_struct *handle,
                                              files_struct *fsp,
                                              TALLOC_CTX *mem_ctx, 
@@ -2475,29 +2423,6 @@ static int smb_time_audit_sys_acl_delete_def_fd(vfs_handle_struct *handle,
        return result;
 }
 
-static ssize_t smb_time_audit_getxattr(struct vfs_handle_struct *handle,
-                               const struct smb_filename *smb_fname,
-                               const char *name,
-                               void *value,
-                               size_t size)
-{
-       ssize_t result;
-       struct timespec ts1,ts2;
-       double timediff;
-
-       clock_gettime_mono(&ts1);
-       result = SMB_VFS_NEXT_GETXATTR(handle, smb_fname, name, value, size);
-       clock_gettime_mono(&ts2);
-       timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
-
-       if (timediff > audit_timeout) {
-               smb_time_audit_log_fname("getxattr", timediff,
-                       smb_fname->base_name);
-       }
-
-       return result;
-}
-
 struct smb_time_audit_getxattrat_state {
        struct vfs_aio_state aio_state;
        files_struct *dir_fsp;
@@ -2787,8 +2712,6 @@ static struct vfs_fn_pointers vfs_time_audit_fns = {
        .read_dfs_pathat_fn = smb_time_audit_read_dfs_pathat,
        .fdopendir_fn = smb_time_audit_fdopendir,
        .readdir_fn = smb_time_audit_readdir,
-       .seekdir_fn = smb_time_audit_seekdir,
-       .telldir_fn = smb_time_audit_telldir,
        .rewind_dir_fn = smb_time_audit_rewinddir,
        .mkdirat_fn = smb_time_audit_mkdirat,
        .closedir_fn = smb_time_audit_closedir,
@@ -2810,6 +2733,7 @@ static struct vfs_fn_pointers vfs_time_audit_fns = {
        .stat_fn = smb_time_audit_stat,
        .fstat_fn = smb_time_audit_fstat,
        .lstat_fn = smb_time_audit_lstat,
+       .fstatat_fn = smb_time_audit_fstatat,
        .get_alloc_size_fn = smb_time_audit_get_alloc_size,
        .unlinkat_fn = smb_time_audit_unlinkat,
        .fchmod_fn = smb_time_audit_fchmod,
@@ -2821,7 +2745,7 @@ static struct vfs_fn_pointers vfs_time_audit_fns = {
        .ftruncate_fn = smb_time_audit_ftruncate,
        .fallocate_fn = smb_time_audit_fallocate,
        .lock_fn = smb_time_audit_lock,
-       .kernel_flock_fn = smb_time_audit_kernel_flock,
+       .filesystem_sharemode_fn = smb_time_audit_filesystem_sharemode,
        .fcntl_fn = smb_time_audit_fcntl,
        .linux_setlease_fn = smb_time_audit_linux_setlease,
        .getlock_fn = smb_time_audit_getlock,
@@ -2830,7 +2754,7 @@ static struct vfs_fn_pointers vfs_time_audit_fns = {
        .linkat_fn = smb_time_audit_linkat,
        .mknodat_fn = smb_time_audit_mknodat,
        .realpath_fn = smb_time_audit_realpath,
-       .chflags_fn = smb_time_audit_chflags,
+       .fchflags_fn = smb_time_audit_fchflags,
        .file_id_create_fn = smb_time_audit_file_id_create,
        .fs_file_id_fn = smb_time_audit_fs_file_id,
        .offload_read_send_fn = smb_time_audit_offload_read_send,
@@ -2843,7 +2767,7 @@ static struct vfs_fn_pointers vfs_time_audit_fns = {
        .snap_create_fn = smb_time_audit_snap_create,
        .snap_delete_fn = smb_time_audit_snap_delete,
        .fstreaminfo_fn = smb_time_audit_fstreaminfo,
-       .get_real_filename_fn = smb_time_audit_get_real_filename,
+       .get_real_filename_at_fn = smb_time_audit_get_real_filename_at,
        .connectpath_fn = smb_time_audit_connectpath,
        .brl_lock_windows_fn = smb_time_audit_brl_lock_windows,
        .brl_unlock_windows_fn = smb_time_audit_brl_unlock_windows,
@@ -2856,16 +2780,12 @@ static struct vfs_fn_pointers vfs_time_audit_fns = {
        .fget_dos_attributes_fn = smb_time_fget_dos_attributes,
        .fset_dos_attributes_fn = smb_time_fset_dos_attributes,
        .fget_nt_acl_fn = smb_time_audit_fget_nt_acl,
-       .get_nt_acl_at_fn = smb_time_audit_get_nt_acl_at,
        .fset_nt_acl_fn = smb_time_audit_fset_nt_acl,
        .audit_file_fn = smb_time_audit_audit_file,
-       .sys_acl_get_file_fn = smb_time_audit_sys_acl_get_file,
        .sys_acl_get_fd_fn = smb_time_audit_sys_acl_get_fd,
-       .sys_acl_blob_get_file_fn = smb_time_audit_sys_acl_blob_get_file,
        .sys_acl_blob_get_fd_fn = smb_time_audit_sys_acl_blob_get_fd,
        .sys_acl_set_fd_fn = smb_time_audit_sys_acl_set_fd,
        .sys_acl_delete_def_fd_fn = smb_time_audit_sys_acl_delete_def_fd,
-       .getxattr_fn = smb_time_audit_getxattr,
        .getxattrat_send_fn = smb_time_audit_getxattrat_send,
        .getxattrat_recv_fn = smb_time_audit_getxattrat_recv,
        .fgetxattr_fn = smb_time_audit_fgetxattr,