From 2a643ef10c3ed64dc60a7899a581a7b83004ce0e Mon Sep 17 00:00:00 2001 From: Holger Hetterich Date: Thu, 17 Sep 2009 20:11:39 +0200 Subject: Introduce smb_traffic_analyzer protocol v2. 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 | 69 +++++++++++++++++++++++++++--- 1 file changed, 62 insertions(+), 7 deletions(-) diff --git a/source3/modules/vfs_smb_traffic_analyzer.c b/source3/modules/vfs_smb_traffic_analyzer.c index 1eb02a2581..79f7662977 100644 --- a/source3/modules/vfs_smb_traffic_analyzer.c +++ b/source3/modules/vfs_smb_traffic_analyzer.c @@ -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 */ -- cgit