Add rmdir, chdir, and rename as supported VFS functions
authorHolger Hetterich <hhetter@novell.com>
Fri, 11 Dec 2009 20:04:46 +0000 (21:04 +0100)
committerJim McDonough <jmcd@samba.org>
Tue, 16 Mar 2010 13:52:09 +0000 (09:52 -0400)
source3/modules/vfs_smb_traffic_analyzer.c

index f460515d8994fa8c341c9abcc45cc2abde84b236..5af230a9c20461ced440dd236df6aa32c0318304 100644 (file)
@@ -37,16 +37,35 @@ enum vfs_id {
         vfs_id_write,
         vfs_id_pwrite,
        /* end of protocol version 1 identifiers.               */
-       vfs_id_mkdir
+       vfs_id_mkdir,
+       vfs_id_rmdir,
+       vfs_id_rename,
+       vfs_id_chdir
 };
 
 /* Specific data sets for the VFS functions.                           */
 
-struct mkdir_data {
+typedef struct mkdir_data {
        const char *path;
        mode_t mode;
        int result;
-};
+} t_mkdir;
+
+typedef struct rmdir_data {
+       const char *path;
+       int result;
+} t_rmdir;
+
+typedef struct rename_data {
+       const char *src;
+       const char *dst;
+       int result;
+} t_rename;
+
+typedef struct chdir_data {
+       const char *path;
+       int result;
+} t_chdir;
 
 /* rw_data used for read/write/pread/pwrite                            */
 struct rw_data {
@@ -331,15 +350,35 @@ static void smb_traffic_analyzer_send_data(vfs_handle_struct *handle,
 
                switch( vfs_operation ) {
                        case vfs_id_mkdir: ;
-                               struct mkdir_data *s_data = \
-                                       (struct mkdir_data *) data;
                                str = smb_traffic_analyzer_create_string( tm, \
                                        seconds, handle, username, \
-                                       3, s_data->path, \
+                                       3, ((t_mkdir *) data)->path, \
+                                       talloc_asprintf( talloc_tos(), "%u", \
+                                               ((t_mkdir *) data)->mode), \
                                        talloc_asprintf( talloc_tos(), "%u", \
-                                               s_data->mode), \
+                                               ((t_mkdir *) data)->result ));
+                               break;
+                       case vfs_id_rmdir: ;
+                               str = smb_traffic_analyzer_create_string( tm, \
+                                       seconds, handle, username, \
+                                       2, ((t_rmdir *) data)->path, \
                                        talloc_asprintf( talloc_tos(), "%u", \
-                                               s_data->result ));
+                                               ((t_rmdir *) data)->result ));
+                               break;
+                       case vfs_id_rename: ;
+                               str = smb_traffic_analyzer_create_string( tm, \
+                                       seconds, handle, username, \
+                                       3, ((t_rename *) data)->src, \
+                                       ((t_rename *) data)->dst,
+                                       talloc_asprintf(talloc_tos(), "%u", \
+                                               ((t_rename *) data)->result));
+                               break;
+                       case vfs_id_chdir: ;
+                               str = smb_traffic_analyzer_create_string( tm, \
+                                       seconds, handle, username, \
+                                       2, ((t_chdir *) data)->path, \
+                                       talloc_asprintf(talloc_tos(), "%u", \
+                                               ((t_chdir *) data)->result));
                                break;
                        default:
                                DEBUG(1, ("smb_traffic_analyzer: error! "
@@ -463,6 +502,43 @@ static int smb_traffic_analyzer_connect(struct vfs_handle_struct *handle,
 }
 
 /* VFS Functions */
+static int smb_traffic_analyzer_chdir(vfs_handle_struct *handle, \
+                       const char *path)
+{
+       struct chdir_data s_data;
+       s_data.result = SMB_VFS_NEXT_CHDIR(handle, path);
+       s_data.path = path;
+       DEBUG(10, ("smb_traffic_analyzer_chdir: CHDIR: %s\n", path));
+       smb_traffic_analyzer_send_data(handle, &s_data, vfs_id_chdir);
+       return s_data.result;
+}
+
+static int smb_traffic_analyzer_rename(vfs_handle_struct *handle, \
+               const struct smb_filename *smb_fname_src,
+               const struct smb_filename *smb_fname_dst)
+{
+       struct rename_data s_data;
+       s_data.result = SMB_VFS_NEXT_RENAME(handle, smb_fname_src, \
+               smb_fname_dst);
+       s_data.src = smb_fname_src->base_name;
+       s_data.dst = smb_fname_dst->base_name;
+       DEBUG(10, ("smb_traffic_analyzer_rename: RENAME: %s / %s\n",
+               smb_fname_src->base_name,
+               smb_fname_dst->base_name));
+       smb_traffic_analyzer_send_data(handle, &s_data, vfs_id_rename);
+       return s_data.result;
+}
+
+static int smb_traffic_analyzer_rmdir(vfs_handle_struct *handle, \
+                       const char *path)
+{
+       struct rmdir_data s_data;
+       s_data.result = SMB_VFS_NEXT_RMDIR(handle, path);
+       s_data.path = path;
+       DEBUG(10, ("smb_traffic_analyzer_rmdir: RMDIR: %s\n", path));
+       smb_traffic_analyzer_send_data(handle, &s_data, vfs_id_rmdir);
+       return s_data.result;
+}
 
 static int smb_traffic_analyzer_mkdir(vfs_handle_struct *handle, \
                        const char *path, mode_t mode)
@@ -549,7 +625,9 @@ static struct vfs_fn_pointers vfs_smb_traffic_analyzer_fns = {
        .pread = smb_traffic_analyzer_pread,
        .write = smb_traffic_analyzer_write,
        .pwrite = smb_traffic_analyzer_pwrite,
-       .mkdir = smb_traffic_analyzer_mkdir
+       .mkdir = smb_traffic_analyzer_mkdir,
+       .rename = smb_traffic_analyzer_rename,
+       .chdir = smb_traffic_analyzer_chdir
 };
 
 /* Module initialization */