⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smbcontrol.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*    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 + -