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:
parent
a5ac83d2b2
commit
7be9a4fd4c
@ -83,7 +83,7 @@ FLAGS = $(ISA) $(FLAGS5) $(PASSWD_FLAGS)
|
|||||||
FLAGS32 = $(ISA32) $(FLAGS5) $(PASSWD_FLAGS)
|
FLAGS32 = $(ISA32) $(FLAGS5) $(PASSWD_FLAGS)
|
||||||
|
|
||||||
SPROGS = bin/smbd bin/nmbd bin/swat
|
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@
|
PROGS2 = bin/smbpasswd bin/make_smbcodepage bin/make_unicodemap bin/rpcclient @WRAP@ @WRAP32@
|
||||||
MPROGS = @MPROGS@
|
MPROGS = @MPROGS@
|
||||||
PROGS = $(PROGS1) $(PROGS2) $(MPROGS) bin/nmblookup bin/make_printerdef
|
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) \
|
STATUS_OBJ = utils/status.o $(LOCKING_OBJ) $(PARAM_OBJ) \
|
||||||
$(UBIQX_OBJ) $(PROFILE_OBJ) $(LIB_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)
|
$(UBIQX_OBJ) $(PROFILE_OBJ) $(LIB_OBJ)
|
||||||
|
|
||||||
TESTPARM_OBJ = utils/testparm.o \
|
TESTPARM_OBJ = utils/testparm.o \
|
||||||
@ -470,9 +470,9 @@ bin/smbstatus: $(STATUS_OBJ) bin/.dummy
|
|||||||
@echo Linking $@
|
@echo Linking $@
|
||||||
@$(CC) $(FLAGS) -o $@ $(STATUS_OBJ) $(LDFLAGS) $(LIBS)
|
@$(CC) $(FLAGS) -o $@ $(STATUS_OBJ) $(LDFLAGS) $(LIBS)
|
||||||
|
|
||||||
bin/msgtest: $(MSGTEST_OBJ) bin/.dummy
|
bin/smbcontrol: $(SMBCONTROL_OBJ) bin/.dummy
|
||||||
@echo Linking $@
|
@echo Linking $@
|
||||||
@$(CC) $(FLAGS) -o $@ $(MSGTEST_OBJ) $(LDFLAGS) $(LIBS)
|
@$(CC) $(FLAGS) -o $@ $(SMBCONTROL_OBJ) $(LDFLAGS) $(LIBS)
|
||||||
|
|
||||||
bin/smbpasswd: $(SMBPASSWD_OBJ) bin/.dummy
|
bin/smbpasswd: $(SMBPASSWD_OBJ) bin/.dummy
|
||||||
@echo Linking $@
|
@echo Linking $@
|
||||||
|
@ -152,11 +152,14 @@ void mdfour(unsigned char *out, unsigned char *in, int n);
|
|||||||
|
|
||||||
/*The following definitions come from lib/messages.c */
|
/*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_init(void);
|
||||||
BOOL message_send_pid(pid_t pid, int msg_type, void *buf, size_t len);
|
BOOL message_send_pid(pid_t pid, int msg_type, void *buf, size_t len);
|
||||||
void message_dispatch(void);
|
void message_dispatch(void);
|
||||||
void message_register(int msg_type,
|
void message_register(int msg_type,
|
||||||
void (*fn)(int msg_type, pid_t pid, void *buf, size_t len));
|
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 */
|
/*The following definitions come from lib/ms_fnmatch.c */
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Unix SMB/Netbios implementation.
|
Unix SMB/Netbios implementation.
|
||||||
Version 1.9.
|
Version 3.0
|
||||||
status reporting
|
Copyright (C) Andrew Tridgell 2000
|
||||||
Copyright (C) Andrew Tridgell 1994-1998
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
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
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
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
|
#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);
|
message_send_pid(pid, MSG_PING, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
while (pong_count < n) {
|
while (pong_count < i) {
|
||||||
message_dispatch();
|
message_dispatch();
|
||||||
msleep(1);
|
msleep(1);
|
||||||
}
|
}
|
||||||
|
155
source3/utils/smbcontrol.c
Normal file
155
source3/utils/smbcontrol.c
Normal 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);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user