Introduce smb_traffic_analyzer protocol v2.
authorHolger Hetterich <hhetter@novell.com>
Thu, 17 Sep 2009 18:11:39 +0000 (20:11 +0200)
committerJim McDonough <jmcd@samba.org>
Tue, 16 Mar 2010 13:52:08 +0000 (09:52 -0400)
From Holger:
Make smb_traffic_analyzer differ the protocol versions to enable the development of version 2 of the protocol. To do this, a new parameter "protocol_version" has been introduced, which can be set to "V1", "V2", or nothing. If protocol_version is not set, V1 will be chosen automatically.

Created an enum for identifying VFS functions in the upcoming protocol v2. Converted the existing VFS functions to use the identifier, and set the read/write bool used in protocol v1 accordingly, also ignore any other VFS functions except read/write/pread/pwrite in v1. Added a first new VFS function for mkdir, which I use for testing and implementing both the sender and receiver for v2.

source3/modules/vfs_smb_traffic_analyzer.c

index 1eb02a2581c6c498e80a458505eb59c834717e4d..79f76629774cc44eb49187dcb789b6533db0a726 100644 (file)
@@ -27,6 +27,20 @@ enum sock_type {INTERNET_SOCKET = 0, UNIX_DOMAIN_SOCKET};
 
 #define LOCAL_PATHNAME "/var/tmp/stadsocket"
 
+/* VFS Functions identifier table. In protocol version 2, every vfs     */
+/* function is given a unique id.                                       */
+enum vfs_id {
+       /* care for the order here, required for compatibility  */
+       /* with protocol version 1.                             */
+        vfs_id_read,
+        vfs_id_pread,
+        vfs_id_write,
+        vfs_id_pwrite,
+       /* end of protocol version 1 identifiers.               */
+       vfs_id_mkdir
+};
+
+
 static int vfs_smb_traffic_analyzer_debug_level = DBGC_VFS;
 
 static enum sock_type smb_traffic_analyzer_connMode(vfs_handle_struct *handle)
@@ -155,7 +169,7 @@ struct refcounted_sock {
 static void smb_traffic_analyzer_send_data(vfs_handle_struct *handle,
                                        ssize_t result,
                                        const char *file_name,
-                                       bool Write)
+                                       enum vfs_id vfs_operation )
 {
        struct refcounted_sock *rf_sock = NULL;
        struct timeval tv;
@@ -166,6 +180,8 @@ static void smb_traffic_analyzer_send_data(vfs_handle_struct *handle,
        char *username = NULL;
        const char *anon_prefix = NULL;
        const char *total_anonymization = NULL;
+       const char *protocol_version = NULL;
+       bool Write = false;
        size_t len;
 
        SMB_VFS_HANDLE_GET_DATA(handle, rf_sock, struct refcounted_sock, return);
@@ -212,7 +228,22 @@ static void smb_traffic_analyzer_send_data(vfs_handle_struct *handle,
                return;
        }
 
-       str = talloc_asprintf(talloc_tos(),
+       protocol_version = lp_parm_const_string(SNUM(handle->conn),
+               "smb_traffic_analyzer",
+               "protocol_version", NULL );
+
+       if ( protocol_version == NULL || strcmp( protocol_version,"V1") == 0) {
+
+               /* in case of protocol v1, ignore any vfs operations    */
+               /* except read,pread,write,pwrite, and set the "Write"  */
+               /* bool accordingly.                                    */
+
+               if ( vfs_operation > vfs_id_pwrite ) return;
+
+               if ( vfs_operation <= vfs_id_pread ) Write=false;
+                       else Write=true;
+
+               str = talloc_asprintf(talloc_tos(),
                        "V1,%u,\"%s\",\"%s\",\"%c\",\"%s\",\"%s\","
                        "\"%04d-%02d-%02d %02d:%02d:%02d.%03d\"\n",
                        (unsigned int)result,
@@ -228,8 +259,18 @@ static void smb_traffic_analyzer_send_data(vfs_handle_struct *handle,
                        tm->tm_min,
                        tm->tm_sec,
                        (int)seconds);
+       } else if ( strcmp( protocol_version, "V2") == 0) {
+               /* protocol version 2   */
+               /* in development       */
+       } else {
+               DEBUG(1, ("smb_traffic_analyzer_send_data_socket: "
+                       "error, unkown protocol given!\n"));
+               return;
+       }
 
        if (!str) {
+               DEBUG(1, ("smb_traffic_analyzer_send_data: "
+                       "unable to create string to send!\n"));
                return;
        }
 
@@ -336,7 +377,20 @@ static int smb_traffic_analyzer_connect(struct vfs_handle_struct *handle,
        return 0;
 }
 
-/* VFS Functions: write, read, pread, pwrite for now */
+/* VFS Functions */
+
+static int smb_traffic_analyzer_mkdir(vfs_handle_struct *handle, \
+                       const char *path, mode_t mode)
+{
+       int result;
+       result = SMB_VFS_NEXT_MKDIR(handle, path, mode);
+       DEBUG(10, ("smb_traffic_analyzer_mkdir: MKDIR: %s\n", path));
+       smb_traffic_analyzer_send_data(handle,
+                       result,
+                       path,
+                       vfs_id_mkdir);
+       return result;
+}
 
 static ssize_t smb_traffic_analyzer_read(vfs_handle_struct *handle, \
                                files_struct *fsp, void *data, size_t n)
@@ -349,7 +403,7 @@ static ssize_t smb_traffic_analyzer_read(vfs_handle_struct *handle, \
        smb_traffic_analyzer_send_data(handle,
                        result,
                        fsp->fsp_name->base_name,
-                       false);
+                       vfs_id_read);
        return result;
 }
 
@@ -367,7 +421,7 @@ static ssize_t smb_traffic_analyzer_pread(vfs_handle_struct *handle, \
        smb_traffic_analyzer_send_data(handle,
                        result,
                        fsp->fsp_name->base_name,
-                       false);
+                       vfs_id_pread);
 
        return result;
 }
@@ -385,7 +439,7 @@ static ssize_t smb_traffic_analyzer_write(vfs_handle_struct *handle, \
        smb_traffic_analyzer_send_data(handle,
                        result,
                        fsp->fsp_name->base_name,
-                       true);
+                       vfs_id_write);
        return result;
 }
 
@@ -401,7 +455,7 @@ static ssize_t smb_traffic_analyzer_pwrite(vfs_handle_struct *handle, \
        smb_traffic_analyzer_send_data(handle,
                        result,
                        fsp->fsp_name->base_name,
-                       true);
+                       vfs_id_pwrite);
        return result;
 }
 
@@ -411,6 +465,7 @@ 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
 };
 
 /* Module initialization */