📄 smbcontrol.c
字号:
/* Unix SMB/CIFS implementation. Send messages to other Samba daemons Copyright (C) Tim Potter 2003 Copyright (C) Andrew Tridgell 1994-1998 Copyright (C) Martin Pool 2001-2002 Copyright (C) Simo Sorce 2002 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.*/#include "includes.h"/* Default timeout value when waiting for replies (in seconds) */#define DEFAULT_TIMEOUT 10static int timeout = DEFAULT_TIMEOUT;static int num_replies; /* Used by message callback fns *//* Send a message to a destination pid. Zero means broadcast smbd. */static BOOL send_message(struct process_id pid, int msg_type, const void *buf, int len, BOOL duplicates){ TDB_CONTEXT *tdb; BOOL ret; int n_sent = 0; if (!message_init()) return False; if (procid_to_pid(&pid) != 0) return message_send_pid(pid, msg_type, buf, len, duplicates); tdb = tdb_open_log(lock_path("connections.tdb"), 0, TDB_DEFAULT, O_RDWR, 0); if (!tdb) { fprintf(stderr,"Failed to open connections database" ": %s\n", strerror(errno)); return False; } ret = message_send_all(tdb,msg_type, buf, len, duplicates, &n_sent); DEBUG(10,("smbcontrol/send_message: broadcast message to " "%d processes\n", n_sent)); tdb_close(tdb); return ret;}/* Wait for one or more reply messages */static void wait_replies(BOOL multiple_replies){ time_t start_time = time(NULL); /* Wait around a bit. This is pretty disgusting - we have to busy-wait here as there is no nicer way to do it. */ do { message_dispatch(); if (num_replies > 0 && !multiple_replies) break; sleep(1); } while (timeout - (time(NULL) - start_time) > 0);}/* Message handler callback that displays the PID and a string on stdout */static void print_pid_string_cb(int msg_type, struct process_id pid, void *buf, size_t len){ printf("PID %u: %.*s", (unsigned int)procid_to_pid(&pid), (int)len, (const char *)buf); num_replies++;}/* Message handler callback that displays a string on stdout */static void print_string_cb(int msg_type, struct process_id pid, void *buf, size_t len){ printf("%.*s", (int)len, (const char *)buf); num_replies++;}/* Send no message. Useful for testing. */static BOOL do_noop(const struct process_id pid, const int argc, const char **argv){ if (argc != 1) { fprintf(stderr, "Usage: smbcontrol <dest> noop\n"); return False; } /* Move along, nothing to see here */ return True;}/* Send a debug string */static BOOL do_debug(const struct process_id pid, const int argc, const char **argv){ if (argc != 2) { fprintf(stderr, "Usage: smbcontrol <dest> debug " "<debug-string>\n"); return False; } return send_message( pid, MSG_DEBUG, argv[1], strlen(argv[1]) + 1, False);}/* Force a browser election */static BOOL do_election(const struct process_id pid, const int argc, const char **argv){ if (argc != 1) { fprintf(stderr, "Usage: smbcontrol <dest> force-election\n"); return False; } return send_message( pid, MSG_FORCE_ELECTION, NULL, 0, False);}/* Ping a samba daemon process */static void pong_cb(int msg_type, struct process_id pid, void *buf, size_t len){ char *src_string = procid_str(NULL, &pid); printf("PONG from pid %s\n", src_string); talloc_free(src_string); num_replies++;}static BOOL do_ping(const struct process_id pid, const int argc, const char **argv){ if (argc != 1) { fprintf(stderr, "Usage: smbcontrol <dest> ping\n"); return False; } /* Send a message and register our interest in a reply */ if (!send_message(pid, MSG_PING, NULL, 0, False)) return False; message_register(MSG_PONG, pong_cb); wait_replies(procid_to_pid(&pid) == 0); /* No replies were received within the timeout period */ if (num_replies == 0) printf("No replies received\n"); message_deregister(MSG_PONG); return num_replies;}/* Set profiling options */static BOOL do_profile(const struct process_id pid, const int argc, const char **argv){ int v; if (argc != 2) { fprintf(stderr, "Usage: smbcontrol <dest> profile " "<off|count|on|flush>\n"); return False; } if (strcmp(argv[1], "off") == 0) { v = 0; } else if (strcmp(argv[1], "count") == 0) { v = 1; } else if (strcmp(argv[1], "on") == 0) { v = 2; } else if (strcmp(argv[1], "flush") == 0) { v = 3; } else { fprintf(stderr, "Unknown profile command '%s'\n", argv[1]); return False; } return send_message(pid, MSG_PROFILE, &v, sizeof(int), False);}/* Return the profiling level */static void profilelevel_cb(int msg_type, struct process_id pid, void *buf, size_t len){ int level; const char *s; num_replies++; if (len != sizeof(int)) { fprintf(stderr, "invalid message length %ld returned\n", (unsigned long)len); return; } memcpy(&level, buf, sizeof(int)); switch (level) { case 0: s = "not enabled"; break; case 1: s = "off"; break; case 3: s = "count only"; break; case 7: s = "count and time"; break; default: s = "BOGUS"; break; } printf("Profiling %s on pid %u\n",s,(unsigned int)procid_to_pid(&pid));}static void profilelevel_rqst(int msg_type, struct process_id pid, void *buf, size_t len){ int v = 0; /* Send back a dummy reply */ send_message(pid, MSG_PROFILELEVEL, &v, sizeof(int), False);}static BOOL do_profilelevel(const struct process_id pid, const int argc, const char **argv){ if (argc != 1) { fprintf(stderr, "Usage: smbcontrol <dest> profilelevel\n"); return False; } /* Send a message and register our interest in a reply */ if (!send_message(pid, MSG_REQ_PROFILELEVEL, NULL, 0, False)) return False; message_register(MSG_PROFILELEVEL, profilelevel_cb); message_register(MSG_REQ_PROFILELEVEL, profilelevel_rqst); wait_replies(procid_to_pid(&pid) == 0); /* No replies were received within the timeout period */ if (num_replies == 0) printf("No replies received\n"); message_deregister(MSG_PROFILE); return num_replies;}/* Display debug level settings */static BOOL do_debuglevel(const struct process_id pid, const int argc, const char **argv){ if (argc != 1) { fprintf(stderr, "Usage: smbcontrol <dest> debuglevel\n"); return False; } /* Send a message and register our interest in a reply */ if (!send_message(pid, MSG_REQ_DEBUGLEVEL, NULL, 0, False)) return False; message_register(MSG_DEBUGLEVEL, print_pid_string_cb); wait_replies(procid_to_pid(&pid) == 0); /* No replies were received within the timeout period */ if (num_replies == 0) printf("No replies received\n"); message_deregister(MSG_DEBUGLEVEL); return num_replies;}/* Send a print notify message */static BOOL do_printnotify(const struct process_id pid, const int argc, const char **argv){ const char *cmd; /* Check for subcommand */ if (argc == 1) { fprintf(stderr, "Must specify subcommand:\n"); fprintf(stderr, "\tqueuepause <printername>\n"); fprintf(stderr, "\tqueueresume <printername>\n"); fprintf(stderr, "\tjobpause <printername> <unix jobid>\n"); fprintf(stderr, "\tjobresume <printername> <unix jobid>\n"); fprintf(stderr, "\tjobdelete <printername> <unix jobid>\n"); fprintf(stderr, "\tprinter <printername> <comment|port|" "driver> <value>\n"); return False; } cmd = argv[1]; if (strcmp(cmd, "queuepause") == 0) { if (argc != 3) { fprintf(stderr, "Usage: smbcontrol <dest> printnotify" " queuepause <printername>\n"); return False; } notify_printer_status_byname(argv[2], PRINTER_STATUS_PAUSED); goto send; } else if (strcmp(cmd, "queueresume") == 0) { if (argc != 3) { fprintf(stderr, "Usage: smbcontrol <dest> printnotify" " queuereume <printername>\n"); return False; } notify_printer_status_byname(argv[2], PRINTER_STATUS_OK); goto send; } else if (strcmp(cmd, "jobpause") == 0) { int jobid; if (argc != 4) { fprintf(stderr, "Usage: smbcontrol <dest> printnotify" " jobpause <printername> <unix-jobid>\n"); return False; } jobid = atoi(argv[3]); notify_job_status_byname( argv[2], jobid, JOB_STATUS_PAUSED, SPOOLSS_NOTIFY_MSG_UNIX_JOBID); goto send; } else if (strcmp(cmd, "jobresume") == 0) { int jobid; if (argc != 4) { fprintf(stderr, "Usage: smbcontrol <dest> printnotify" " jobpause <printername> <unix-jobid>\n"); return False; } jobid = atoi(argv[3]); notify_job_status_byname( argv[2], jobid, JOB_STATUS_QUEUED, SPOOLSS_NOTIFY_MSG_UNIX_JOBID); goto send; } else if (strcmp(cmd, "jobdelete") == 0) { int jobid; if (argc != 4) { fprintf(stderr, "Usage: smbcontrol <dest> printnotify" " jobpause <printername> <unix-jobid>\n"); return False; } jobid = atoi(argv[3]); notify_job_status_byname( argv[2], jobid, JOB_STATUS_DELETING, SPOOLSS_NOTIFY_MSG_UNIX_JOBID); notify_job_status_byname( argv[2], jobid, JOB_STATUS_DELETING| JOB_STATUS_DELETED, SPOOLSS_NOTIFY_MSG_UNIX_JOBID);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -