summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
authorHolger Hetterich <hhetter@novell.com>2009-09-17 20:11:39 +0200
committerJim McDonough <jmcd@samba.org>2010-03-16 09:52:08 -0400
commit2a643ef10c3ed64dc60a7899a581a7b83004ce0e (patch)
tree9ecdb887f603a2db6fccf4e82956061e981a5b9e /source3
parent8353aa39b64169a6bbd4b5b21ab4989e7821363e (diff)
downloadsamba-2a643ef10c3ed64dc60a7899a581a7b83004ce0e.tar.gz
samba-2a643ef10c3ed64dc60a7899a581a7b83004ce0e.tar.bz2
samba-2a643ef10c3ed64dc60a7899a581a7b83004ce0e.zip
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.
Diffstat (limited to 'source3')
-rw-r--r--source3/modules/vfs_smb_traffic_analyzer.c69
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 */