diff options
-rw-r--r-- | source3/modules/vfs_smb_traffic_analyzer.c | 69 |
1 files 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 */ |