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

📄 smbcontrol.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
		goto send;	} else if (strcmp(cmd, "printer") == 0) {		uint32 attribute;				if (argc != 5) {			fprintf(stderr, "Usage: smbcontrol <dest> printnotify "				"printer <printername> <comment|port|driver> "				"<value>\n");			return False;		}		if (strcmp(argv[3], "comment") == 0) {			attribute = PRINTER_NOTIFY_COMMENT;		} else if (strcmp(argv[3], "port") == 0) {			attribute = PRINTER_NOTIFY_PORT_NAME;		} else if (strcmp(argv[3], "driver") == 0) {			attribute = PRINTER_NOTIFY_DRIVER_NAME;		} else {			fprintf(stderr, "Invalid printer command '%s'\n",				argv[3]);			return False;		}		notify_printer_byname(argv[2], attribute,				      CONST_DISCARD(char *, argv[4]));		goto send;	}	fprintf(stderr, "Invalid subcommand '%s'\n", cmd);	return False;send:	print_notify_send_messages(0);	return True;}/* Close a share */static BOOL do_closeshare(const struct process_id pid,			  const int argc, const char **argv){	if (argc != 2) {		fprintf(stderr, "Usage: smbcontrol <dest> close-share "			"<sharename>\n");		return False;	}	return send_message(		pid, MSG_SMB_FORCE_TDIS, argv[1], strlen(argv[1]) + 1, False);}/* Force a SAM synchronisation */static BOOL do_samsync(const struct process_id pid,		       const int argc, const char **argv){	if (argc != 1) {		fprintf(stderr, "Usage: smbcontrol <dest> samsync\n");		return False;	}	return send_message(		pid, MSG_SMB_SAM_SYNC, NULL, 0, False);}/* Force a SAM replication */static BOOL do_samrepl(const struct process_id pid,		       const int argc, const char **argv){	if (argc != 1) {		fprintf(stderr, "Usage: smbcontrol <dest> samrepl\n");		return False;	}	return send_message(		pid, MSG_SMB_SAM_REPL, NULL, 0, False);}/* Display talloc pool usage */static BOOL do_poolusage(const struct process_id pid,			 const int argc, const char **argv){	if (argc != 1) {		fprintf(stderr, "Usage: smbcontrol <dest> pool-usage\n");		return False;	}	message_register(MSG_POOL_USAGE, print_string_cb);	/* Send a message and register our interest in a reply */	if (!send_message(pid, MSG_REQ_POOL_USAGE, NULL, 0, False))		return False;	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_POOL_USAGE);	return num_replies;}/* Perform a dmalloc mark */static BOOL do_dmalloc_mark(const struct process_id pid,			    const int argc, const char **argv){	if (argc != 1) {		fprintf(stderr, "Usage: smbcontrol <dest> dmalloc-mark\n");		return False;	}	return send_message(		pid, MSG_REQ_DMALLOC_MARK, NULL, 0, False);}/* Perform a dmalloc changed */static BOOL do_dmalloc_changed(const struct process_id pid,			       const int argc, const char **argv){	if (argc != 1) {		fprintf(stderr, "Usage: smbcontrol <dest> "			"dmalloc-log-changed\n");		return False;	}	return send_message(		pid, MSG_REQ_DMALLOC_LOG_CHANGED, NULL, 0, False);}/* Shutdown a server process */static BOOL do_shutdown(const struct process_id pid,			const int argc, const char **argv){	if (argc != 1) {		fprintf(stderr, "Usage: smbcontrol <dest> shutdown\n");		return False;	}	return send_message(pid, MSG_SHUTDOWN, NULL, 0, False);}/* Notify a driver upgrade */static BOOL do_drvupgrade(const struct process_id pid,			  const int argc, const char **argv){	if (argc != 2) {		fprintf(stderr, "Usage: smbcontrol <dest> drvupgrade "			"<driver-name>\n");		return False;	}	return send_message(		pid, MSG_DEBUG, argv[1], strlen(argv[1]) + 1, False);}static BOOL do_reload_config(const struct process_id pid,			     const int argc, const char **argv){	if (argc != 1) {		fprintf(stderr, "Usage: smbcontrol <dest> reload-config\n");		return False;	}	return send_message(pid, MSG_SMB_CONF_UPDATED, NULL, 0, False);}static void my_make_nmb_name( struct nmb_name *n, const char *name, int type){	fstring unix_name;	memset( (char *)n, '\0', sizeof(struct nmb_name) );	fstrcpy(unix_name, name);	strupper_m(unix_name);	push_ascii(n->name, unix_name, sizeof(n->name), STR_TERMINATE);	n->name_type = (unsigned int)type & 0xFF;	push_ascii(n->scope,  global_scope(), 64, STR_TERMINATE);}static BOOL do_nodestatus(const struct process_id pid,			  const int argc, const char **argv){	struct packet_struct p;	if (argc != 2) {		fprintf(stderr, "Usage: smbcontrol nmbd nodestatus <ip>\n");		return False;	}	ZERO_STRUCT(p);	p.ip = *interpret_addr2(argv[1]);	p.port = 137;	p.packet_type = NMB_PACKET;	p.packet.nmb.header.name_trn_id = 10;	p.packet.nmb.header.opcode = 0;	p.packet.nmb.header.response = False;	p.packet.nmb.header.nm_flags.bcast = False;	p.packet.nmb.header.nm_flags.recursion_available = False;	p.packet.nmb.header.nm_flags.recursion_desired = False;	p.packet.nmb.header.nm_flags.trunc = False;	p.packet.nmb.header.nm_flags.authoritative = False;	p.packet.nmb.header.rcode = 0;	p.packet.nmb.header.qdcount = 1;	p.packet.nmb.header.ancount = 0;	p.packet.nmb.header.nscount = 0;	p.packet.nmb.header.arcount = 0;	my_make_nmb_name(&p.packet.nmb.question.question_name, "*", 0x00);	p.packet.nmb.question.question_type = 0x21;	p.packet.nmb.question.question_class = 0x1;	return send_message(pid, MSG_SEND_PACKET, &p, sizeof(p), False);}/* A list of message type supported */static const struct {	const char *name;	/* Option name */	BOOL (*fn)(const struct process_id pid,		   const int argc, const char **argv);	const char *help;	/* Short help text */} msg_types[] = {	{ "debug", do_debug, "Set debuglevel"  },	{ "force-election", do_election,	  "Force a browse election" },	{ "ping", do_ping, "Elicit a response" },	{ "profile", do_profile, "" },	{ "profilelevel", do_profilelevel, "" },	{ "debuglevel", do_debuglevel, "Display current debuglevels" },	{ "printnotify", do_printnotify, "Send a print notify message" },	{ "close-share", do_closeshare, "Forcibly disconnect a share" },        { "samsync", do_samsync, "Initiate SAM synchronisation" },        { "samrepl", do_samrepl, "Initiate SAM replication" },	{ "pool-usage", do_poolusage, "Display talloc memory usage" },	{ "dmalloc-mark", do_dmalloc_mark, "" },	{ "dmalloc-log-changed", do_dmalloc_changed, "" },	{ "shutdown", do_shutdown, "Shut down daemon" },	{ "drvupgrade", do_drvupgrade, "Notify a printer driver has changed" },	{ "reload-config", do_reload_config, "Force smbd or winbindd to reload config file"},	{ "nodestatus", do_nodestatus, "Ask nmbd to do a node status request"},	{ "noop", do_noop, "Do nothing" },	{ NULL }};/* Display usage information */static void usage(poptContext *pc){	int i;	poptPrintHelp(*pc, stderr, 0);	fprintf(stderr, "\n");	fprintf(stderr, "<destination> is one of \"nmbd\", \"smbd\" or a "		"process ID\n");	fprintf(stderr, "\n");	fprintf(stderr, "<message-type> is one of:\n");	for (i = 0; msg_types[i].name; i++) 	    fprintf(stderr, "\t%-30s%s\n", msg_types[i].name, 		    msg_types[i].help);	fprintf(stderr, "\n");	exit(1);}/* Return the pid number for a string destination */static struct process_id parse_dest(const char *dest){	struct process_id result;	pid_t pid;	/* Zero is a special return value for broadcast smbd */	if (strequal(dest, "smbd")) {		return interpret_pid("0");	}	/* Try self - useful for testing */	if (strequal(dest, "self")) {		return pid_to_procid(sys_getpid());	}	/* Check for numeric pid number */	result = interpret_pid(dest);	if (procid_valid(&result)) {		return result;	}	/* Look up other destinations in pidfile directory */	if ((pid = pidfile_pid(dest)) != 0) {		return pid_to_procid(pid);	}	fprintf(stderr,"Can't find pid for destination '%s'\n", dest);	return result;}	/* Execute smbcontrol command */static BOOL do_command(int argc, const char **argv){	const char *dest = argv[0], *command = argv[1];	struct process_id pid;	int i;	/* Check destination */	pid = parse_dest(dest);	if (!procid_valid(&pid)) {		return False;	}	/* Check command */	for (i = 0; msg_types[i].name; i++) {		if (strequal(command, msg_types[i].name))			return msg_types[i].fn(pid, argc - 1, argv + 1);	}	fprintf(stderr, "smbcontrol: unknown command '%s'\n", command);	return False;}/* Main program */int main(int argc, const char **argv){	poptContext pc;	int opt;	static struct poptOption wbinfo_options[] = {		{ "timeout", 't', POPT_ARG_INT, &timeout, 't', 		  "Set timeout value in seconds", "TIMEOUT" },		{ "configfile", 's', POPT_ARG_STRING, NULL, 's', 		  "Use alternative configuration file", "CONFIGFILE" },		POPT_TABLEEND	};	struct poptOption options[] = {		{ NULL, 0, POPT_ARG_INCLUDE_TABLE, wbinfo_options, 0, 		  "Options" },		POPT_AUTOHELP		POPT_COMMON_VERSION		POPT_TABLEEND	};	load_case_tables();	setup_logging(argv[0],True);		/* Parse command line arguments using popt */	pc = poptGetContext(		"smbcontrol", argc, (const char **)argv, options, 0);	poptSetOtherOptionHelp(pc, "[OPTION...] <destination> <message-type> "			       "<parameters>");	if (argc == 1)		usage(&pc);	while ((opt = poptGetNextOpt(pc)) != -1) {		switch(opt) {		case 't':	/* --timeout */			argc -= 2;			break;		case 's':	/* --configfile */			pstrcpy(dyn_CONFIGFILE, poptGetOptArg(pc));			argc -= 2;			break;		default:			fprintf(stderr, "Invalid option\n");			poptPrintHelp(pc, stderr, 0);			break;		}	}	/* We should now have the remaining command line arguments in           argv.  The argc parameter should have been decremented to the           correct value in the above switch statement. */	argv = (const char **)poptGetArgs(pc);	argc--;			/* Don't forget about argv[0] */	if (argc == 1)		usage(&pc);	lp_load(dyn_CONFIGFILE,False,False,False);	/* Need to invert sense of return code -- samba         * routines mostly return True==1 for success, but         * shell needs 0. */ 		return !do_command(argc, argv);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -