1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-23 17:34:34 +03:00

first cut at smbcontrol program. It currently allows syntax like:

smbcontrol nmbd debug 7
  smbcontrol smbd debug 9
  smbcontrol 3278 debug 1
  smbcontrol nmbd force-election
(This used to be commit 5f91c24636)
This commit is contained in:
Andrew Tridgell 2000-09-13 07:07:17 +00:00
parent a5ac83d2b2
commit 7be9a4fd4c
5 changed files with 209 additions and 18 deletions

View File

@ -83,7 +83,7 @@ FLAGS = $(ISA) $(FLAGS5) $(PASSWD_FLAGS)
FLAGS32 = $(ISA32) $(FLAGS5) $(PASSWD_FLAGS)
SPROGS = bin/smbd bin/nmbd bin/swat
PROGS1 = bin/smbclient bin/smbspool bin/testparm bin/testprns bin/smbstatus @RUNPROG@
PROGS1 = bin/smbclient bin/smbspool bin/testparm bin/testprns bin/smbstatus bin/smbcontrol @RUNPROG@
PROGS2 = bin/smbpasswd bin/make_smbcodepage bin/make_unicodemap bin/rpcclient @WRAP@ @WRAP32@
MPROGS = @MPROGS@
PROGS = $(PROGS1) $(PROGS2) $(MPROGS) bin/nmblookup bin/make_printerdef
@ -226,7 +226,7 @@ MAKE_PRINTERDEF_OBJ = utils/make_printerdef.o $(PARAM_OBJ) \
STATUS_OBJ = utils/status.o $(LOCKING_OBJ) $(PARAM_OBJ) \
$(UBIQX_OBJ) $(PROFILE_OBJ) $(LIB_OBJ)
MSGTEST_OBJ = utils/msgtest.o $(LOCKING_OBJ) $(PARAM_OBJ) \
SMBCONTROL_OBJ = utils/smbcontrol.o $(LOCKING_OBJ) $(PARAM_OBJ) \
$(UBIQX_OBJ) $(PROFILE_OBJ) $(LIB_OBJ)
TESTPARM_OBJ = utils/testparm.o \
@ -470,9 +470,9 @@ bin/smbstatus: $(STATUS_OBJ) bin/.dummy
@echo Linking $@
@$(CC) $(FLAGS) -o $@ $(STATUS_OBJ) $(LDFLAGS) $(LIBS)
bin/msgtest: $(MSGTEST_OBJ) bin/.dummy
bin/smbcontrol: $(SMBCONTROL_OBJ) bin/.dummy
@echo Linking $@
@$(CC) $(FLAGS) -o $@ $(MSGTEST_OBJ) $(LDFLAGS) $(LIBS)
@$(CC) $(FLAGS) -o $@ $(SMBCONTROL_OBJ) $(LDFLAGS) $(LIBS)
bin/smbpasswd: $(SMBPASSWD_OBJ) bin/.dummy
@echo Linking $@

View File

@ -152,11 +152,14 @@ void mdfour(unsigned char *out, unsigned char *in, int n);
/*The following definitions come from lib/messages.c */
void ping_message(int msg_type, pid_t src, void *buf, size_t len);
BOOL message_init(void);
BOOL message_send_pid(pid_t pid, int msg_type, void *buf, size_t len);
void message_dispatch(void);
void message_register(int msg_type,
void (*fn)(int msg_type, pid_t pid, void *buf, size_t len));
void message_deregister(int msg_type);
BOOL message_send_all(int msg_type, void *buf, size_t len);
/*The following definitions come from lib/ms_fnmatch.c */

View File

@ -304,3 +304,46 @@ void message_deregister(int msg_type)
}
}
}
static struct {
int msg_type;
void *buf;
size_t len;
} msg_all;
/****************************************************************************
send one of the messages for the broadcast
****************************************************************************/
static int traverse_fn(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf, void *state)
{
struct connections_data crec;
memcpy(&crec, dbuf.dptr, sizeof(crec));
message_send_pid(crec.pid, msg_all.msg_type, msg_all.buf, msg_all.len);
return 0;
}
/****************************************************************************
this is a useful function for sending messages to all smbd processes.
It isn't very efficient, but should be OK for the sorts of applications that
use it. When we need efficient broadcast we can add it.
****************************************************************************/
BOOL message_send_all(int msg_type, void *buf, size_t len)
{
TDB_CONTEXT *tdb;
tdb = tdb_open(lock_path("connections.tdb"), 0, 0, O_RDONLY, 0);
if (!tdb) {
DEBUG(2,("Failed to open connections database in message_send_all\n"));
return False;
}
msg_all.msg_type = msg_type;
msg_all.buf = buf;
msg_all.len = len;
tdb_traverse(tdb, traverse_fn, NULL);
tdb_close(tdb);
return True;
}

View File

@ -1,8 +1,7 @@
/*
Unix SMB/Netbios implementation.
Version 1.9.
status reporting
Copyright (C) Andrew Tridgell 1994-1998
Version 3.0
Copyright (C) Andrew Tridgell 2000
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
@ -17,19 +16,10 @@
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.
Revision History:
12 aug 96: Erik.Devriendt@te6.siemens.be
added support for shared memory implementation of share mode locking
21-Jul-1998: rsharpe@ns.aus.com (Richard Sharpe)
Added -L (locks only) -S (shares only) flags and code
*/
/*
* This program reports current SMB connections
test code for internal messaging
*/
#define NO_SYSLOG
@ -71,7 +61,7 @@ void pong_message(int msg_type, pid_t src, void *buf, size_t len)
message_send_pid(pid, MSG_PING, NULL, 0);
}
while (pong_count < n) {
while (pong_count < i) {
message_dispatch();
msleep(1);
}

155
source3/utils/smbcontrol.c Normal file
View File

@ -0,0 +1,155 @@
/*
Unix SMB/Netbios implementation.
Version 3.0
program to send control messages to Samba processes
Copyright (C) Andrew Tridgell 1994-1998
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.
*/
#define NO_SYSLOG
#include "includes.h"
static struct {
char *name;
int value;
} msg_types[] = {
{"debug", MSG_DEBUG},
{"force-election", MSG_FORCE_ELECTION},
{"ping", MSG_PING},
{NULL, -1}
};
static void usage(void)
{
int i;
printf("Usage: smbcontrol <destination> <message-type> <parameters>\n\n");
printf("\t<destination> is one of \"nmbd\", \"smbd\" or a process ID\n");
printf("\t<message-type> is one of: ");
for (i=0; msg_types[i].name; i++) printf("%s, ", msg_types[i].name);
printf("\n");
exit(1);
}
static int pong_count;
/****************************************************************************
a useful function for testing the message system
****************************************************************************/
void pong_function(int msg_type, pid_t src, void *buf, size_t len)
{
pong_count++;
}
/****************************************************************************
send a message to a named destination
****************************************************************************/
static BOOL send_message(char *dest, int msg_type, void *buf, int len)
{
pid_t pid;
/* "smbd" is the only broadcast operation */
if (strequal(dest,"smbd")) {
return message_send_all(msg_type, buf, len);
} else if (strequal(dest,"nmbd")) {
pid = pidfile_pid(dest);
if (pid == 0) {
fprintf(stderr,"Can't find pid for nmbd\n");
return False;
}
} else {
pid = atoi(dest);
if (pid == 0) {
fprintf(stderr,"Not a valid pid\n");
return False;
}
}
return message_send_pid(pid, msg_type, buf, len);
}
/****************************************************************************
evaluate a message type string
****************************************************************************/
static int parse_type(char *mtype)
{
int i;
for (i=0;msg_types[i].name;i++) {
if (strequal(mtype, msg_types[i].name)) return msg_types[i].value;
}
return -1;
}
int main(int argc, char *argv[])
{
char *dest;
int i, n, v;
pstring servicesf = CONFIGFILE;
int mtype;
TimeInit();
setup_logging(argv[0],True);
charset_initialise();
lp_load(servicesf,False,False,False);
message_init();
if (argc < 3) usage();
dest = argv[1];
mtype = parse_type(argv[2]);
if (mtype == -1) {
fprintf(stderr,"Couldn't resolve message type: %s\n", argv[2]);
exit(1);
}
argc -= 2;
argv += 2;
switch (mtype) {
case MSG_DEBUG:
if (argc < 2) {
fprintf(stderr,"MSG_DEBUG needs a parameter\n");
exit(1);
}
v = atoi(argv[1]);
send_message(dest, MSG_DEBUG, &v, sizeof(int));
break;
case MSG_FORCE_ELECTION:
if (!strequal(dest, "nmbd")) {
fprintf(stderr,"force-election can only be sent to nmbd\n");
exit(1);
}
send_message(dest, MSG_FORCE_ELECTION, NULL, 0);
break;
case MSG_PING:
message_register(MSG_PONG, pong_function);
n = atoi(argv[1]);
for (i=0;i<n;i++) {
send_message(dest, MSG_PING, NULL, 0);
}
while (pong_count < n) message_dispatch();
break;
}
return (0);
}