/**************************************************************************** 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 (AllowDebugChange == False) { int old_debuglevel_class[DBGC_LAST]; /* save current debug level */ memcpy(old_debuglevel_class, DEBUGLEVEL_CLASS, sizeof(DEBUGLEVEL_CLASS)); if (debug_parse_params(params, debuglevel_class)) memcpy(parsed_debuglevel_class, debuglevel_class, sizeof(DEBUGLEVEL_CLASS)); memcpy(DEBUGLEVEL_CLASS, old_debuglevel_class, sizeof(old_debuglevel_class)); return True; } if (debug_parse_params(params, debuglevel_class)) { debug_message(MSG_DEBUG, getpid(), (void*)debuglevel_class, sizeof(debuglevel_class)); return True; } else return False; }
/**************************************************************************** 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(const char *params_str) { char **params; /* Just in case */ debug_init(); if (AllowDebugChange == False) return True; params = str_list_make(params_str, NULL); if (debug_parse_params(params)) { debug_dump_status(5); str_list_free(¶ms); return True; } else { str_list_free(¶ms); return False; } }
/**************************************************************************** do command ****************************************************************************/ static BOOL do_command(char *dest, char *msg_name, int iparams, char **params) { int i, n, v; int mtype; BOOL retval=False; int debuglevel_class[DBGC_LAST]; mtype = parse_type(msg_name); if (mtype == -1) { fprintf(stderr,"Couldn't resolve message type: %s\n", msg_name); return(False); } switch (mtype) { case MSG_DEBUG: if (!params || !params[0]) { fprintf(stderr,"MSG_DEBUG needs a parameter\n"); return(False); } ZERO_ARRAY(debuglevel_class); if (!debug_parse_params(params, debuglevel_class)) { fprintf(stderr, "MSG_DEBUG error. Expected <class name>:level\n"); return(False); } else send_message(dest, MSG_DEBUG, debuglevel_class, sizeof(debuglevel_class), False); break; case MSG_PROFILE: if (!params || !params[0]) { fprintf(stderr,"MSG_PROFILE needs a parameter\n"); return(False); } if (strequal(params[0], "off")) { v = 0; } else if (strequal(params[0], "count")) { v = 1; } else if (strequal(params[0], "on")) { v = 2; } else if (strequal(params[0], "flush")) { v = 3; } else { fprintf(stderr, "MSG_PROFILE parameter must be off, count, on, or flush\n"); return(False); } send_message(dest, MSG_PROFILE, &v, sizeof(int), False); break; case MSG_FORCE_ELECTION: if (!strequal(dest, "nmbd")) { fprintf(stderr,"force-election can only be sent to nmbd\n"); return(False); } send_message(dest, MSG_FORCE_ELECTION, NULL, 0, False); break; case MSG_REQ_PROFILELEVEL: if (!profilelevel_registered) { message_register(MSG_PROFILELEVEL, profilelevel_function); profilelevel_registered = True; } got_level = False; retval = send_message(dest, MSG_REQ_PROFILELEVEL, NULL, 0, True); if (retval) { timeout_start = time(NULL); while (!got_level) { message_dispatch(); if ((time(NULL) - timeout_start) > MAX_WAIT) { fprintf(stderr,"profilelevel timeout\n"); break; } } } break; case MSG_REQ_DEBUGLEVEL: if (!debuglevel_registered) { message_register(MSG_DEBUGLEVEL, debuglevel_function); debuglevel_registered = True; } got_level = False; retval = send_message(dest, MSG_REQ_DEBUGLEVEL, NULL, 0, True); if (retval) { timeout_start = time(NULL); while (!got_level) { message_dispatch(); if ((time(NULL) - timeout_start) > MAX_WAIT) { fprintf(stderr,"debuglevel timeout\n"); break; } } } break; case MSG_PRINTER_NOTIFY: if (!strequal(dest, "smbd")) { fprintf(stderr,"printer-notify can only be sent to smbd\n"); return(False); } if (!params || !params[0]) { fprintf(stderr, "printer-notify needs a printer name\n"); return (False); } { char msg[8 + sizeof(fstring)+4]; SIVAL(msg,0,PRINTER_CHANGE_ALL); SIVAL(msg,4,0); fstrcpy(&msg[8], params[0]); SIVAL(msg,8+strlen(params[0])+1, PRINTER_MESSAGE_DRIVER); retval = send_message(dest, MSG_PRINTER_NOTIFY, msg, 8 + strlen(params[0]) + 1 + 4, False); } break; case MSG_SMB_FORCE_TDIS: if (!strequal(dest, "smbd")) { fprintf(stderr,"close-share can only be sent to smbd\n"); return(False); } if (!params || !params[0]) { fprintf(stderr, "close-share needs a share name or '*'\n"); return (False); } retval = send_message(dest, MSG_SMB_FORCE_TDIS, params[0], strlen(params[0]) + 1, False); break; case MSG_PING: if (!pong_registered) { message_register(MSG_PONG, pong_function); pong_registered = True; } if (!params || !params[0]) { fprintf(stderr,"MSG_PING needs a parameter\n"); return(False); } n = atoi(params[0]); pong_count = 0; for (i=0;i<n;i++) { if (iparams > 1) retval = send_message(dest, MSG_PING, params[1], strlen(params[1]) + 1, True); else retval = send_message(dest, MSG_PING, NULL, 0, True); if (retval == False) break; } if (retval) { timeout_start = time(NULL); while (pong_count < n) { message_dispatch(); if ((time(NULL) - timeout_start) > MAX_WAIT) { fprintf(stderr,"PING timeout\n"); break; } } } break; } return (True); }