summaryrefslogtreecommitdiff
path: root/source3/lib
diff options
context:
space:
mode:
Diffstat (limited to 'source3/lib')
-rw-r--r--source3/lib/debug.c128
-rw-r--r--source3/lib/messages.c3
-rw-r--r--source3/lib/msrpc_use.c4
3 files changed, 125 insertions, 10 deletions
diff --git a/source3/lib/debug.c b/source3/lib/debug.c
index 9d520b6c2f..e7772bbd38 100644
--- a/source3/lib/debug.c
+++ b/source3/lib/debug.c
@@ -82,7 +82,8 @@
FILE *dbf = NULL;
pstring debugf = "";
BOOL append_log = False;
-int DEBUGLEVEL = 1;
+int DEBUGLEVEL_CLASS[DBGC_LAST];
+int DEBUGLEVEL = DEBUGLEVEL_CLASS;
/* -------------------------------------------------------------------------- **
@@ -114,22 +115,137 @@ static int syslog_level = 0;
static pstring format_bufr = { '\0' };
static size_t format_pos = 0;
+/*
+* Define all the debug class selection names here. Names *MUST NOT* contain
+* white space. There must be one name for each DBGC_<class name>, and they
+* must be in the table in the order of DBGC_<class name>..
+*/
+char *classname_table[] = {
+ "all", /* DBGC_ALL; index references traditional DEBUGLEVEL */
+ "tdb", /* DBGC_TDB */
+ "printdrivers", /* DBGC_PRINTDRIVERS */
+ "lanman", /* DBGC_LANMAN */
+};
+
/* -------------------------------------------------------------------------- **
* Functions...
*/
/****************************************************************************
+utility access to debug class names's
+****************************************************************************/
+char* debug_classname_from_index(int idx)
+{
+ return classname_table[idx];
+}
+
+/****************************************************************************
+utility to translate names to debug class index's
+****************************************************************************/
+int debug_lookup_classname(char* classname)
+{
+ int i;
+
+ if (!classname) return -1;
+
+ for (i=0; i<DBGC_LAST; i++) {
+ if (strcmp(classname, classname_table[i])==0)
+ return i;
+ }
+ return -1;
+}
+
+/****************************************************************************
+parse the debug levels from smbcontrol. Example debug level parameter:
+ printdrivers:7
+****************************************************************************/
+BOOL debug_parse_params(char **params, int *debuglevel_class)
+{
+ int i, idx;
+ char *class_name;
+ char *class_level;
+
+ /* Set the new debug level array to the current DEBUGLEVEL array */
+ memcpy(debuglevel_class, DEBUGLEVEL_CLASS, sizeof(DEBUGLEVEL_CLASS));
+
+ /* Allow DBGC_ALL to be specifies w/o requiring its class name e.g."10"
+ * v.s. "all:10", this is the traditional way to set DEBUGLEVEL
+ */
+ if (isdigit(params[0][0])) {
+ debuglevel_class[DBGC_ALL] = atoi(params[0]);
+ i = 1; /* start processing at the next params */
+ }
+ else
+ i = 0; /* DBGC_ALL not specified OR calss name was included */
+
+ /* Fill in new debug class levels */
+ for (; i < DBGC_LAST && params[i]; i++) {
+ if ((class_name=strtok(params[i],":")) &&
+ (class_level=strtok(NULL, "\0")) &&
+ ((idx = debug_lookup_classname(class_name)) != -1)) {
+ debuglevel_class[idx] = atoi(class_level);
+ } else {
+ DEBUG(0,("debug_parse_params: unrecognized debug class name or format [%s]\n", params[i]));
+ return False;
+ }
+ }
+
+ return True;
+}
+
+/****************************************************************************
+parse the debug levels from smb.conf. Example debug level string:
+ 3 tdb:5 printdrivers:7
+Note: the 1st param has no "name:" preceeding it.
+****************************************************************************/
+BOOL debug_parse_levels(char *params_str)
+{
+ int i;
+ char *params[DBGC_LAST];
+ int debuglevel_class[DBGC_LAST];
+
+ ZERO_ARRAY(params);
+ ZERO_ARRAY(debuglevel_class);
+
+ if ( (params[0]=strtok(params_str," ,")) ) {
+ for (i=1; i<DBGC_LAST;i++) {
+ if ((params[i]=strtok(NULL," ,"))==NULL)
+ break;
+ }
+ }
+ else
+ return False;
+
+ if (debug_parse_params(params, debuglevel_class)) {
+ debug_message(0, getpid(), (void*)debuglevel_class, sizeof(debuglevel_class));
+ return True;
+ } else
+ return False;
+}
+
+/****************************************************************************
receive a "set debug level" message
****************************************************************************/
void debug_message(int msg_type, pid_t src, void *buf, size_t len)
{
- int level;
- memcpy(&level, buf, sizeof(int));
- DEBUGLEVEL = level;
- DEBUG(1,("INFO: Debug level set to %d from pid %d\n", level, (int)src));
+ int i;
+
+ /* Set the new DEBUGLEVEL_CLASS array from the pased array */
+ memcpy(DEBUGLEVEL_CLASS, buf, sizeof(DEBUGLEVEL_CLASS));
+
+ DEBUG(1,("INFO: Debug class %s level = %d (pid %d from pid %d)\n",
+ classname_table[DBGC_ALL],
+ DEBUGLEVEL_CLASS[DBGC_ALL], getpid(), (int)src));
+
+ for (i=1; i<DBGC_LAST; i++) {
+ if (DEBUGLEVEL_CLASS[i])
+ DEBUGADD(1,("INFO: Debug class %s level = %d\n",
+ classname_table[i], DEBUGLEVEL_CLASS[i]));
+ }
}
+
/****************************************************************************
send a "set debug level" message
****************************************************************************/
@@ -175,7 +291,7 @@ void reopen_logs( void )
pstring fname;
mode_t oldumask;
- if (DEBUGLEVEL <= 0) {
+ if (DEBUGLEVEL_CLASS[ DBGC_ALL ] <= 0) {
if (dbf) {
(void)fclose(dbf);
dbf = NULL;
diff --git a/source3/lib/messages.c b/source3/lib/messages.c
index 6f6d99c8ec..19496bd426 100644
--- a/source3/lib/messages.c
+++ b/source3/lib/messages.c
@@ -73,7 +73,6 @@ void ping_message(int msg_type, pid_t src, void *buf, size_t len)
DEBUG(1,("INFO: Received PING message from PID %d\n",src));
message_send_pid(src, MSG_PONG, buf, len, True);
}
-
/****************************************************************************
return current debug level
****************************************************************************/
@@ -83,7 +82,7 @@ void debuglevel_message(int msg_type, pid_t src, void *buf, size_t len)
DEBUG(1,("INFO: Received REQ_DEBUGLEVEL message from PID %d\n",src));
level = DEBUGLEVEL;
- message_send_pid(src, MSG_DEBUGLEVEL, &level, sizeof(int), True);
+ message_send_pid(src, MSG_DEBUGLEVEL, DEBUGLEVEL_CLASS, sizeof(DEBUGLEVEL_CLASS), True);
}
/****************************************************************************
diff --git a/source3/lib/msrpc_use.c b/source3/lib/msrpc_use.c
index 7558a266b3..90fac637b3 100644
--- a/source3/lib/msrpc_use.c
+++ b/source3/lib/msrpc_use.c
@@ -109,7 +109,7 @@ find client state. server name, user name, domain name and password must all
match.
****************************************************************************/
static struct msrpc_use *msrpc_find(const char* pipe_name,
- const struct user_creds *usr_creds)
+ struct user_creds *usr_creds)
{
int i;
struct user_creds null_usr;
@@ -199,7 +199,7 @@ init client state
****************************************************************************/
struct msrpc_state *msrpc_use_add(const char* pipe_name,
uint32 pid,
- const struct user_creds *usr_creds,
+ struct user_creds *usr_creds,
BOOL redir)
{
struct msrpc_use *cli;