1
0
mirror of https://github.com/samba-team/samba.git synced 2025-08-26 01:49:31 +03:00

r23055: Rewrite messages.c to use auto-generated marshalling in the tdb. I'm

doing this because for the clustering the marshalling is needed in more
than one place, so I wanted a decent routine to marshall a message_rec
struct which was not there before.

Tridge, this seems about the same speed as it used to be before, the
librpc/ndr overhead in my tests was under the noise.

Volker
This commit is contained in:
Volker Lendecke
2007-05-21 22:17:13 +00:00
committed by Gerald (Jerry) Carter
parent f53aa56998
commit eaefd00563
25 changed files with 548 additions and 409 deletions

View File

@ -149,7 +149,7 @@ PATH_FLAGS = -DSMB_PASSWD_FILE=\"$(SMB_PASSWD_FILE)\" \
-DLOCKDIR=\"$(LOCKDIR)\" \
-DPIDDIR=\"$(PIDDIR)\" \
-DLIBDIR=\"$(LIBDIR)\" \
-DLOGFILEBASE=\"$(LOGFILEBASE)\" \
-DLOGFILEBASE=\"$(LOGFILEBASE)\" \
-DSHLIBEXT=\"@SHLIBEXT@\" \
-DCONFIGDIR=\"$(CONFIGDIR)\"
@ -259,7 +259,9 @@ SOCKET_WRAPPER_OBJ = @SOCKET_WRAPPER_OBJS@
TALLOC_OBJ = lib/talloc/talloc.o
LIB_WITHOUT_PROTO_OBJ = $(LIBREPLACE_OBJ) $(SOCKET_WRAPPER_OBJ) $(TALLOC_OBJ)
LIB_WITHOUT_PROTO_OBJ = $(LIBREPLACE_OBJ) $(SOCKET_WRAPPER_OBJ) $(TALLOC_OBJ) \
lib/messages.o librpc/gen_ndr/ndr_messaging.o
LIB_WITH_PROTO_OBJ = $(VERSION_OBJ) lib/charcnv.o lib/debug.o lib/fault.o \
lib/interface.o lib/md4.o \
@ -273,7 +275,7 @@ LIB_WITH_PROTO_OBJ = $(VERSION_OBJ) lib/charcnv.o lib/debug.o lib/fault.o \
lib/util_unistr.o lib/util_file.o lib/data_blob.o \
lib/util.o lib/util_sock.o lib/sock_exec.o lib/util_sec.o \
lib/substitute.o lib/fsusage.o \
lib/ms_fnmatch.o lib/select.o lib/messages.o \
lib/ms_fnmatch.o lib/select.o \
lib/tallocmsg.o lib/dmallocmsg.o libsmb/smb_signing.o \
lib/md5.o lib/hmacmd5.o lib/arc4.o lib/iconv.o \
nsswitch/wb_client.o $(WBCOMMON_OBJ) \
@ -281,7 +283,7 @@ LIB_WITH_PROTO_OBJ = $(VERSION_OBJ) lib/charcnv.o lib/debug.o lib/fault.o \
lib/adt_tree.o lib/gencache.o $(TDB_OBJ) \
lib/module.o lib/events.o lib/ldap_escape.o @CHARSET_STATIC@ \
lib/secdesc.o lib/util_seaccess.o lib/secace.o lib/secacl.o \
libads/krb5_errs.o lib/system_smbd.o lib/audit.o
libads/krb5_errs.o lib/system_smbd.o lib/audit.o $(LIBNDR_OBJ)
LIB_OBJ = $(LIB_WITHOUT_PROTO_OBJ) $(LIB_WITH_PROTO_OBJ)
@ -347,7 +349,7 @@ LIBMSRPC_GEN_OBJ = librpc/gen_ndr/cli_unixinfo.o librpc/gen_ndr/cli_lsa.o \
librpc/gen_ndr/cli_srvsvc.o \
librpc/gen_ndr/cli_winreg.o librpc/gen_ndr/cli_initshutdown.o \
librpc/gen_ndr/cli_eventlog.o librpc/gen_ndr/cli_epmapper.o \
$(LIBNDR_GEN_OBJ) $(LIBNDR_OBJ) $(RPCCLIENT_NDR_OBJ)
$(LIBNDR_GEN_OBJ) $(RPCCLIENT_NDR_OBJ)
REGOBJS_OBJ = registry/reg_objects.o
@ -763,7 +765,7 @@ REPLACETORT_OBJ = lib/replace/test/testsuite.o \
$(LIBREPLACE_OBJ)
NDRDUMP_OBJ = librpc/tools/ndrdump.o \
$(PARAM_OBJ) $(LIBNDR_OBJ) $(LIBNDR_GEN_OBJ) \
$(PARAM_OBJ) $(LIBNDR_GEN_OBJ) \
$(LIBSAMBA_OBJ) $(LIB_NONSMBD_OBJ) $(POPT_LIB_OBJ) \
$(RPC_PARSE_OBJ1) $(DOSERR_OBJ) $(SECRETS_OBJ)
@ -783,7 +785,7 @@ SMBFILTER_OBJ = utils/smbfilter.o $(PARAM_OBJ) $(LIBSMB_OBJ) $(SECRETS_OBJ) \
$(LIB_NONSMBD_OBJ) $(KRBCLIENT_OBJ)
PROTO_OBJ = $(SMBD_OBJ_MAIN) $(LIBNDR_OBJ) $(RPCCLIENT_NDR_OBJ) \
$(LIBNDR_GEN_OBJ) $(SMBD_OBJ_SRV) $(NMBD_OBJ1) $(LIBSMB_OBJ) \
$(LIBNDR_GEN_OBJ) $(SMBD_OBJ_SRV) $(NMBD_OBJ1) $(LIBSMB_OBJ) \
$(SMBTORTURE_OBJ1) $(RPCCLIENT_OBJ1) \
$(LIBMSRPC_OBJ) \
$(LIB_WITH_PROTO_OBJ) \

View File

@ -648,13 +648,13 @@ typedef int BOOL;
#include "trans2.h"
#include "nterr.h"
#include "ntioctl.h"
#include "messages.h"
#include "charset.h"
#include "dynconfig.h"
#include "util_getent.h"
#include "debugparse.h"
#include "version.h"
#include "privileges.h"
#include "messages.h"
#include "locking.h"
#include "smb.h"
#include "ads_cldap.h"

View File

@ -100,4 +100,37 @@ struct server_id {
pid_t pid;
};
struct messaging_context;
struct data_blob;
unsigned int messages_pending_for_pid(struct messaging_context *msg_ctx,
struct server_id pid);
void message_dispatch(struct messaging_context *msg_ctx);
BOOL message_send_all(struct messaging_context *msg_ctx,
int msg_type,
const void *buf, size_t len,
int *n_sent);
void message_block(void);
void message_unblock(void);
struct event_context *messaging_event_context(struct messaging_context *msg_ctx);
struct messaging_context *messaging_init(TALLOC_CTX *mem_ctx,
struct server_id server_id,
struct event_context *ev);
NTSTATUS messaging_register(struct messaging_context *msg_ctx,
void *private_data,
uint32_t msg_type,
void (*fn)(struct messaging_context *msg,
void *private_data,
uint32_t msg_type,
struct server_id server_id,
struct data_blob *data));
void messaging_deregister(struct messaging_context *ctx, uint32_t msg_type,
void *private_data);
NTSTATUS messaging_send(struct messaging_context *msg_ctx,
struct server_id server,
uint32_t msg_type, const struct data_blob *data);
NTSTATUS messaging_send_buf(struct messaging_context *msg_ctx,
struct server_id server, uint32_t msg_type,
const uint8 *buf, size_t len);
#endif

View File

@ -425,7 +425,6 @@ struct fd_handle {
unsigned long file_id;
};
struct messaging_context;
struct event_context;
struct fd_event;
struct timed_event;
@ -532,10 +531,10 @@ typedef struct files_struct {
#include "sysquotas.h"
/* used to hold an arbitrary blob of data */
typedef struct data_blob_ {
typedef struct data_blob {
uint8 *data;
size_t length;
void (*free)(struct data_blob_ *data_blob);
void (*free)(struct data_blob *data_blob);
} DATA_BLOB;
extern const DATA_BLOB data_blob_null;

View File

@ -47,54 +47,30 @@
*/
#include "includes.h"
#include "librpc/gen_ndr/messaging.h"
#include "librpc/gen_ndr/ndr_messaging.h"
/* the locking database handle */
static TDB_CONTEXT *tdb;
static int received_signal;
/* change the message version with any incompatible changes in the protocol */
#define MESSAGE_VERSION 1
#define MESSAGE_VERSION 2
struct message_rec {
int msg_version;
int msg_type;
struct server_id dest;
struct server_id src;
size_t len;
struct messaging_callback {
struct messaging_callback *prev, *next;
uint32 msg_type;
void (*fn)(struct messaging_context *msg, void *private_data,
uint32_t msg_type,
struct server_id server_id, DATA_BLOB *data);
void *private_data;
};
/* we have a linked list of dispatch handlers */
static struct dispatch_fns {
struct dispatch_fns *next, *prev;
int msg_type;
void (*fn)(int msg_type, struct server_id pid, void *buf, size_t len,
void *private_data);
void *private_data;
} *dispatch_fns;
static void message_register(int msg_type,
void (*fn)(int msg_type, struct server_id pid,
void *buf, size_t len,
void *private_data),
void *private_data);
/****************************************************************************
Free global objects.
****************************************************************************/
void gfree_messages(void)
{
struct dispatch_fns *dfn, *next;
/* delete the dispatch_fns list */
dfn = dispatch_fns;
while( dfn ) {
next = dfn->next;
DLIST_REMOVE(dispatch_fns, dfn);
SAFE_FREE(dfn);
dfn = next;
}
}
struct messaging_context {
TDB_CONTEXT *tdb;
struct server_id id;
struct event_context *event_ctx;
struct messaging_callback *callbacks;
};
/****************************************************************************
Notifications come in as signals.
@ -106,21 +82,25 @@ static void sig_usr1(void)
sys_select_signal(SIGUSR1);
}
static NTSTATUS message_send_pid(struct server_id pid, int msg_type,
const void *buf, size_t len);
static NTSTATUS messaging_tdb_send(TDB_CONTEXT *msg_tdb,
struct server_id pid, int msg_type,
const void *buf, size_t len);
/****************************************************************************
A useful function for testing the message system.
****************************************************************************/
static void ping_message(int msg_type, struct server_id src,
void *buf, size_t len, void *private_data)
static void ping_message(struct messaging_context *msg_ctx,
void *private_data,
uint32_t msg_type,
struct server_id src,
DATA_BLOB *data)
{
const char *msg = buf ? (const char *)buf : "none";
const char *msg = data->data ? (const char *)data->data : "none";
DEBUG(1,("INFO: Received PING message from PID %s [%s]\n",
procid_str_static(&src), msg));
message_send_pid(src, MSG_PONG, buf, len);
messaging_send(msg_ctx, src, MSG_PONG, data);
}
/****************************************************************************
@ -131,24 +111,21 @@ static BOOL message_init(struct messaging_context *msg_ctx)
{
sec_init();
if (tdb)
return True;
msg_ctx->tdb = tdb_open_log(lock_path("messages.tdb"),
0, TDB_CLEAR_IF_FIRST|TDB_DEFAULT,
O_RDWR|O_CREAT,0600);
tdb = tdb_open_log(lock_path("messages.tdb"),
0, TDB_CLEAR_IF_FIRST|TDB_DEFAULT,
O_RDWR|O_CREAT,0600);
if (!tdb) {
if (!msg_ctx->tdb) {
DEBUG(0,("ERROR: Failed to initialise messages database\n"));
return False;
}
/* Activate the per-hashchain freelist */
tdb_set_max_dead(tdb, 5);
tdb_set_max_dead(msg_ctx->tdb, 5);
CatchSignal(SIGUSR1, SIGNAL_CAST sig_usr1);
message_register(MSG_PING, ping_message, NULL);
messaging_register(msg_ctx, NULL, MSG_PING, ping_message);
/* Register some debugging related messages */
@ -175,6 +152,99 @@ static TDB_DATA message_key_pid(struct server_id pid)
return kbuf;
}
/*
Fetch the messaging array for a process
*/
static NTSTATUS messaging_tdb_fetch(TDB_CONTEXT *msg_tdb,
TDB_DATA key,
TALLOC_CTX *mem_ctx,
struct messaging_array **presult)
{
struct messaging_array *result;
TDB_DATA data;
DATA_BLOB blob;
NTSTATUS status;
if (!(result = TALLOC_ZERO_P(mem_ctx, struct messaging_array))) {
return NT_STATUS_NO_MEMORY;
}
data = tdb_fetch(msg_tdb, key);
if (data.dptr == NULL) {
*presult = result;
return NT_STATUS_OK;
}
blob = data_blob_const(data.dptr, data.dsize);
status = ndr_pull_struct_blob(
&blob, result, result,
(ndr_pull_flags_fn_t)ndr_pull_messaging_array);
SAFE_FREE(data.dptr);
if (!NT_STATUS_IS_OK(status)) {
TALLOC_FREE(result);
return status;
}
if (DEBUGLEVEL >= 10) {
DEBUG(10, ("messaging_tdb_fetch:\n"));
NDR_PRINT_DEBUG(messaging_array, result);
}
*presult = result;
return NT_STATUS_OK;
}
/*
Store a messaging array for a pid
*/
static NTSTATUS messaging_tdb_store(TDB_CONTEXT *msg_tdb,
TDB_DATA key,
struct messaging_array *array)
{
TDB_DATA data;
DATA_BLOB blob;
NTSTATUS status;
TALLOC_CTX *mem_ctx;
int ret;
if (array->num_messages == 0) {
tdb_delete(msg_tdb, key);
return NT_STATUS_OK;
}
if (!(mem_ctx = talloc_new(array))) {
return NT_STATUS_NO_MEMORY;
}
status = ndr_push_struct_blob(
&blob, mem_ctx, array,
(ndr_push_flags_fn_t)ndr_push_messaging_array);
if (!NT_STATUS_IS_OK(status)) {
talloc_free(mem_ctx);
return status;
}
if (DEBUGLEVEL >= 10) {
DEBUG(10, ("messaging_tdb_store:\n"));
NDR_PRINT_DEBUG(messaging_array, array);
}
data.dptr = blob.data;
data.dsize = blob.length;
ret = tdb_store(msg_tdb, key, data, TDB_REPLACE);
TALLOC_FREE(mem_ctx);
return (ret == 0) ? NT_STATUS_OK : NT_STATUS_INTERNAL_DB_CORRUPTION;
}
/****************************************************************************
Notify a process that it has a message. If the process doesn't exist
then delete its record in the database.
@ -216,17 +286,6 @@ static NTSTATUS message_notify(struct server_id procid)
* Something has gone wrong
*/
if (errno == ESRCH) {
DEBUG(2,("pid %d doesn't exist - deleting messages record\n",
(int)pid));
tdb_delete(tdb, message_key_pid(procid));
/*
* INVALID_HANDLE is the closest I can think of -- vl
*/
return NT_STATUS_INVALID_HANDLE;
}
DEBUG(2,("message to process %d failed - %s\n", (int)pid,
strerror(errno)));
@ -235,6 +294,7 @@ static NTSTATUS message_notify(struct server_id procid)
* errormap.o into lots of utils.
*/
if (errno == ESRCH) return NT_STATUS_INVALID_HANDLE;
if (errno == EINVAL) return NT_STATUS_INVALID_PARAMETER;
if (errno == EPERM) return NT_STATUS_ACCESS_DENIED;
return NT_STATUS_UNSUCCESSFUL;
@ -244,12 +304,15 @@ static NTSTATUS message_notify(struct server_id procid)
Send a message to a particular pid.
****************************************************************************/
static NTSTATUS message_send_pid(struct server_id pid, int msg_type,
const void *buf, size_t len)
static NTSTATUS messaging_tdb_send(TDB_CONTEXT *msg_tdb,
struct server_id pid, int msg_type,
const void *buf, size_t len)
{
TDB_DATA dbuf;
struct message_rec rec;
int ret;
struct messaging_array *msg_array;
struct messaging_rec *rec;
TALLOC_CTX *mem_ctx;
NTSTATUS status;
TDB_DATA key = message_key_pid(pid);
/* NULL pointer means implicit length zero. */
if (!buf) {
@ -263,138 +326,129 @@ static NTSTATUS message_send_pid(struct server_id pid, int msg_type,
SMB_ASSERT(procid_to_pid(&pid) > 0);
rec.msg_version = MESSAGE_VERSION;
rec.msg_type = msg_type;
rec.dest = pid;
rec.src = procid_self();
rec.len = buf ? len : 0;
dbuf.dptr = (uint8 *)SMB_MALLOC(len + sizeof(rec));
if (!dbuf.dptr) {
if (!(mem_ctx = talloc_init("message_send_pid"))) {
return NT_STATUS_NO_MEMORY;
}
memcpy(dbuf.dptr, &rec, sizeof(rec));
if (len > 0 && buf)
memcpy((void *)((char*)dbuf.dptr+sizeof(rec)), buf, len);
dbuf.dsize = len + sizeof(rec);
ret = tdb_append(tdb, message_key_pid(pid), dbuf);
SAFE_FREE(dbuf.dptr);
if (ret == -1) {
return NT_STATUS_INTERNAL_ERROR;
if (tdb_chainlock(msg_tdb, key) == -1) {
return NT_STATUS_LOCK_NOT_GRANTED;
}
errno = 0; /* paranoia */
return message_notify(pid);
status = messaging_tdb_fetch(msg_tdb, key, mem_ctx, &msg_array);
if (!NT_STATUS_IS_OK(status)) {
tdb_chainunlock(msg_tdb, key);
TALLOC_FREE(mem_ctx);
return status;
}
if (!(rec = TALLOC_REALLOC_ARRAY(mem_ctx, msg_array->messages,
struct messaging_rec,
msg_array->num_messages+1))) {
tdb_chainunlock(msg_tdb, key);
TALLOC_FREE(mem_ctx);
return NT_STATUS_NO_MEMORY;
}
rec[msg_array->num_messages].msg_version = MESSAGE_VERSION;
rec[msg_array->num_messages].msg_type = msg_type;
rec[msg_array->num_messages].dest = pid;
rec[msg_array->num_messages].src = procid_self();
rec[msg_array->num_messages].buf = data_blob_const(buf, len);
msg_array->messages = rec;
msg_array->num_messages += 1;
status = messaging_tdb_store(msg_tdb, key, msg_array);
tdb_chainunlock(msg_tdb, key);
TALLOC_FREE(mem_ctx);
if (!NT_STATUS_IS_OK(status)) {
return status;
}
status = message_notify(pid);
if (NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
DEBUG(2, ("pid %s doesn't exist - deleting messages record\n",
procid_str_static(&pid)));
tdb_delete(msg_tdb, message_key_pid(pid));
}
return status;
}
/****************************************************************************
Count the messages pending for a particular pid. Expensive....
****************************************************************************/
unsigned int messages_pending_for_pid(struct server_id pid)
unsigned int messages_pending_for_pid(struct messaging_context *msg_ctx,
struct server_id pid)
{
TDB_DATA dbuf;
uint8 *buf;
unsigned int message_count = 0;
struct messaging_array *msg_array;
unsigned int result;
dbuf = tdb_fetch(tdb, message_key_pid(pid));
if (dbuf.dptr == NULL || dbuf.dsize == 0) {
SAFE_FREE(dbuf.dptr);
if (!NT_STATUS_IS_OK(messaging_tdb_fetch(msg_ctx->tdb,
message_key_pid(pid), NULL,
&msg_array))) {
DEBUG(10, ("messaging_tdb_fetch failed\n"));
return 0;
}
for (buf = dbuf.dptr; dbuf.dsize > sizeof(struct message_rec);) {
struct message_rec rec;
memcpy(&rec, buf, sizeof(rec));
buf += (sizeof(rec) + rec.len);
dbuf.dsize -= (sizeof(rec) + rec.len);
message_count++;
}
SAFE_FREE(dbuf.dptr);
return message_count;
}
result = msg_array->num_messages;
TALLOC_FREE(msg_array);
return result;
}
/****************************************************************************
Retrieve all messages for the current process.
****************************************************************************/
static BOOL retrieve_all_messages(char **msgs_buf, size_t *total_len)
static NTSTATUS retrieve_all_messages(TDB_CONTEXT *msg_tdb,
TALLOC_CTX *mem_ctx,
struct messaging_array **presult)
{
TDB_DATA kbuf;
TDB_DATA dbuf;
TDB_DATA null_dbuf;
struct messaging_array *result;
TDB_DATA key = message_key_pid(procid_self());
NTSTATUS status;
ZERO_STRUCT(null_dbuf);
*msgs_buf = NULL;
*total_len = 0;
kbuf = message_key_pid(procid_self());
if (tdb_chainlock(tdb, kbuf) == -1)
return False;
dbuf = tdb_fetch(tdb, kbuf);
/*
* Replace with an empty record to keep the allocated
* space in the tdb.
*/
tdb_store(tdb, kbuf, null_dbuf, TDB_REPLACE);
tdb_chainunlock(tdb, kbuf);
if (dbuf.dptr == NULL || dbuf.dsize == 0) {
SAFE_FREE(dbuf.dptr);
return False;
if (tdb_chainlock(msg_tdb, key) == -1) {
return NT_STATUS_LOCK_NOT_GRANTED;
}
*msgs_buf = (char *)dbuf.dptr;
*total_len = dbuf.dsize;
status = messaging_tdb_fetch(msg_tdb, key, mem_ctx, &result);
return True;
/*
* We delete the record here, tdb_set_max_dead keeps it around
*/
tdb_delete(msg_tdb, key);
tdb_chainunlock(msg_tdb, key);
if (NT_STATUS_IS_OK(status)) {
*presult = result;
}
return status;
}
/****************************************************************************
Parse out the next message for the current process.
****************************************************************************/
static BOOL message_recv(char *msgs_buf, size_t total_len, int *msg_type,
struct server_id *src, char **buf, size_t *len)
/*
Dispatch one messsaging_rec
*/
static void messaging_dispatch_rec(struct messaging_context *msg_ctx,
struct messaging_rec *rec)
{
struct message_rec rec;
char *ret_buf = *buf;
struct messaging_callback *cb, *next;
*buf = NULL;
*len = 0;
if (total_len - (ret_buf - msgs_buf) < sizeof(rec))
return False;
memcpy(&rec, ret_buf, sizeof(rec));
ret_buf += sizeof(rec);
if (rec.msg_version != MESSAGE_VERSION) {
DEBUG(0,("message version %d received (expected %d)\n",
rec.msg_version, MESSAGE_VERSION));
return False;
for (cb = msg_ctx->callbacks; cb != NULL; cb = next) {
next = cb->next;
if (cb->msg_type == rec->msg_type) {
cb->fn(msg_ctx, cb->private_data, rec->msg_type,
rec->src, &rec->buf);
return;
}
}
if (rec.len > 0) {
if (total_len - (ret_buf - msgs_buf) < rec.len)
return False;
}
*len = rec.len;
*msg_type = rec.msg_type;
*src = rec.src;
*buf = ret_buf;
return True;
return;
}
/****************************************************************************
@ -404,14 +458,10 @@ static BOOL message_recv(char *msgs_buf, size_t total_len, int *msg_type,
messages on an *odd* byte boundary.
****************************************************************************/
void message_dispatch(void)
void message_dispatch(struct messaging_context *msg_ctx)
{
int msg_type;
struct server_id src;
char *buf;
char *msgs_buf;
size_t len, total_len;
int n_handled;
struct messaging_array *msg_array = NULL;
uint32 i;
if (!received_signal)
return;
@ -421,37 +471,16 @@ void message_dispatch(void)
received_signal = 0;
if (!retrieve_all_messages(&msgs_buf, &total_len))
if (!NT_STATUS_IS_OK(retrieve_all_messages(msg_ctx->tdb, NULL,
&msg_array))) {
return;
for (buf = msgs_buf;
message_recv(msgs_buf, total_len, &msg_type, &src, &buf, &len);
buf += len) {
struct dispatch_fns *dfn;
DEBUG(10,("message_dispatch: received msg_type=%d "
"src_pid=%u\n", msg_type,
(unsigned int) procid_to_pid(&src)));
n_handled = 0;
for (dfn = dispatch_fns; dfn; dfn = dfn->next) {
if (dfn->msg_type == msg_type) {
DEBUG(10,("message_dispatch: processing "
"message of type %d.\n", msg_type));
dfn->fn(msg_type, src,
len ? (void *)buf : NULL, len,
dfn->private_data);
n_handled++;
break;
}
}
if (!n_handled) {
DEBUG(5,("message_dispatch: warning: no handler "
"registed for msg_type %d in pid %u\n",
msg_type, (unsigned int)sys_getpid()));
}
}
SAFE_FREE(msgs_buf);
for (i=0; i<msg_array->num_messages; i++) {
messaging_dispatch_rec(msg_ctx, &msg_array->messages[i]);
}
TALLOC_FREE(msg_array);
}
/****************************************************************************
@ -461,60 +490,12 @@ void message_dispatch(void)
messages on an *odd* byte boundary.
****************************************************************************/
static void message_register(int msg_type,
void (*fn)(int msg_type, struct server_id pid,
void *buf, size_t len,
void *private_data),
void *private_data)
{
struct dispatch_fns *dfn;
for (dfn = dispatch_fns; dfn; dfn = dfn->next) {
if (dfn->msg_type == msg_type) {
dfn->fn = fn;
return;
}
}
if (!(dfn = SMB_MALLOC_P(struct dispatch_fns))) {
DEBUG(0,("message_register: Not enough memory. malloc "
"failed!\n"));
return;
}
ZERO_STRUCTPN(dfn);
dfn->msg_type = msg_type;
dfn->fn = fn;
dfn->private_data = private_data;
DLIST_ADD(dispatch_fns, dfn);
}
/****************************************************************************
De-register the function for a particular message type.
****************************************************************************/
static void message_deregister(int msg_type)
{
struct dispatch_fns *dfn, *next;
for (dfn = dispatch_fns; dfn; dfn = next) {
next = dfn->next;
if (dfn->msg_type == msg_type) {
DLIST_REMOVE(dispatch_fns, dfn);
SAFE_FREE(dfn);
return;
}
}
}
struct msg_all {
struct messaging_context *msg_ctx;
int msg_type;
uint32 msg_flag;
const void *buf;
size_t len;
BOOL duplicates;
int n_sent;
};
@ -522,41 +503,44 @@ struct msg_all {
Send one of the messages for the broadcast.
****************************************************************************/
static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf,
void *state)
static int traverse_fn(TDB_CONTEXT *the_tdb,
const struct connections_key *ckey,
const struct connections_data *crec,
void *private_data)
{
struct connections_data crec;
struct msg_all *msg_all = (struct msg_all *)state;
struct msg_all *msg_all = (struct msg_all *)private_data;
NTSTATUS status;
if (dbuf.dsize != sizeof(crec))
return 0;
memcpy(&crec, dbuf.dptr, sizeof(crec));
if (crec.cnum != -1)
if (crec->cnum != -1)
return 0;
/* Don't send if the receiver hasn't registered an interest. */
if(!(crec.bcast_msg_flags & msg_all->msg_flag))
if(!(crec->bcast_msg_flags & msg_all->msg_flag))
return 0;
/* If the msg send fails because the pid was not found (i.e. smbd died),
* the msg has already been deleted from the messages.tdb.*/
status = message_send_pid(crec.pid, msg_all->msg_type,
msg_all->buf, msg_all->len);
status = messaging_send_buf(msg_all->msg_ctx,
crec->pid, msg_all->msg_type,
(uint8 *)msg_all->buf, msg_all->len);
if (NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
TDB_DATA key;
/* If the pid was not found delete the entry from
* connections.tdb */
DEBUG(2,("pid %s doesn't exist - deleting connections "
"%d [%s]\n", procid_str_static(&crec.pid), crec.cnum,
crec.servicename));
tdb_delete(the_tdb, kbuf);
"%d [%s]\n", procid_str_static(&crec->pid),
crec->cnum, crec->servicename));
key.dptr = (uint8 *)ckey;
key.dsize = sizeof(*ckey);
tdb_delete(the_tdb, key);
}
msg_all->n_sent++;
return 0;
@ -577,7 +561,6 @@ static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf,
BOOL message_send_all(struct messaging_context *msg_ctx,
int msg_type,
const void *buf, size_t len,
BOOL duplicates_allowed,
int *n_sent)
{
struct msg_all msg_all;
@ -598,10 +581,10 @@ BOOL message_send_all(struct messaging_context *msg_ctx,
msg_all.buf = buf;
msg_all.len = len;
msg_all.duplicates = duplicates_allowed;
msg_all.n_sent = 0;
msg_all.msg_ctx = msg_ctx;
connections_traverse(traverse_fn, &msg_all);
connections_forall(traverse_fn, &msg_all);
if (n_sent)
*n_sent = msg_all.n_sent;
return True;
@ -622,40 +605,6 @@ void message_unblock(void)
BlockSignals(False, SIGUSR1);
}
/*
* Samba4 API wrapper around the Samba3 implementation. Yes, I know, we could
* import the whole Samba4 thing, but I want notify.c from Samba4 in first.
*/
struct messaging_callback {
struct messaging_callback *prev, *next;
uint32 msg_type;
void (*fn)(struct messaging_context *msg, void *private_data,
uint32_t msg_type,
struct server_id server_id, DATA_BLOB *data);
void *private_data;
};
struct messaging_context {
struct server_id id;
struct event_context *event_ctx;
struct messaging_callback *callbacks;
};
static int messaging_context_destructor(struct messaging_context *ctx)
{
struct messaging_callback *cb;
for (cb = ctx->callbacks; cb; cb = cb->next) {
/*
* We unconditionally remove all instances of our callback
* from the tdb basis.
*/
message_deregister(cb->msg_type);
}
return 0;
}
struct event_context *messaging_event_context(struct messaging_context *msg_ctx)
{
return msg_ctx->event_ctx;
@ -673,7 +622,6 @@ struct messaging_context *messaging_init(TALLOC_CTX *mem_ctx,
ctx->id = server_id;
ctx->event_ctx = ev;
talloc_set_destructor(ctx, messaging_context_destructor);
if (!message_init(ctx)) {
DEBUG(0, ("message_init failed: %s\n", strerror(errno)));
@ -683,35 +631,12 @@ struct messaging_context *messaging_init(TALLOC_CTX *mem_ctx,
return ctx;
}
static void messaging_callback(int msg_type, struct server_id pid,
void *buf, size_t len, void *private_data)
{
struct messaging_context *ctx = talloc_get_type_abort(
private_data, struct messaging_context);
struct messaging_callback *cb, *next;
for (cb = ctx->callbacks; cb; cb = next) {
/*
* Allow a callback to remove itself
*/
next = cb->next;
if (msg_type == cb->msg_type) {
DATA_BLOB blob;
blob.data = (uint8 *)buf;
blob.length = len;
cb->fn(ctx, cb->private_data, msg_type, pid, &blob);
}
}
}
/*
* Register a dispatch function for a particular message type. Allow multiple
* registrants
*/
NTSTATUS messaging_register(struct messaging_context *ctx, void *private_data,
NTSTATUS messaging_register(struct messaging_context *msg_ctx,
void *private_data,
uint32_t msg_type,
void (*fn)(struct messaging_context *msg,
void *private_data,
@ -721,7 +646,19 @@ NTSTATUS messaging_register(struct messaging_context *ctx, void *private_data,
{
struct messaging_callback *cb;
if (!(cb = talloc(ctx, struct messaging_callback))) {
/*
* Only one callback per type
*/
for (cb = msg_ctx->callbacks; cb != NULL; cb = cb->next) {
if (cb->msg_type == msg_type) {
cb->fn = fn;
cb->private_data = private_data;
return NT_STATUS_OK;
}
}
if (!(cb = talloc(msg_ctx, struct messaging_callback))) {
return NT_STATUS_NO_MEMORY;
}
@ -729,8 +666,7 @@ NTSTATUS messaging_register(struct messaging_context *ctx, void *private_data,
cb->fn = fn;
cb->private_data = private_data;
DLIST_ADD(ctx->callbacks, cb);
message_register(msg_type, messaging_callback, ctx);
DLIST_ADD(msg_ctx->callbacks, cb);
return NT_STATUS_OK;
}
@ -759,7 +695,8 @@ NTSTATUS messaging_send(struct messaging_context *msg_ctx,
struct server_id server,
uint32_t msg_type, const DATA_BLOB *data)
{
return message_send_pid(server, msg_type, data->data, data->length);
return messaging_tdb_send(msg_ctx->tdb, server, msg_type,
data->data, data->length);
}
NTSTATUS messaging_send_buf(struct messaging_context *msg_ctx,

View File

@ -199,7 +199,6 @@ void gfree_all( void )
gfree_case_tables();
gfree_debugsyms();
gfree_charcnv();
gfree_messages();
gfree_interfaces();
/* release the talloc null_context memory last */

View File

@ -0,0 +1,21 @@
/* header auto-generated by pidl */
#include <stdint.h>
#ifndef _HEADER_messaging
#define _HEADER_messaging
struct messaging_rec {
uint32_t msg_version;
uint32_t msg_type;
struct server_id dest;
struct server_id src;
DATA_BLOB buf;
}/* [public] */;
struct messaging_array {
uint32_t num_messages;
struct messaging_rec *messages;
}/* [public] */;
#endif /* _HEADER_messaging */

View File

@ -0,0 +1,115 @@
/* parser auto-generated by pidl */
#include "includes.h"
#include "librpc/gen_ndr/ndr_messaging.h"
_PUBLIC_ NTSTATUS ndr_push_messaging_rec(struct ndr_push *ndr, int ndr_flags, const struct messaging_rec *r)
{
if (ndr_flags & NDR_SCALARS) {
NDR_CHECK(ndr_push_align(ndr, 4));
NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->msg_version));
NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->msg_type));
NDR_CHECK(ndr_push_server_id(ndr, NDR_SCALARS, &r->dest));
NDR_CHECK(ndr_push_server_id(ndr, NDR_SCALARS, &r->src));
NDR_CHECK(ndr_push_DATA_BLOB(ndr, NDR_SCALARS, r->buf));
}
if (ndr_flags & NDR_BUFFERS) {
NDR_CHECK(ndr_push_server_id(ndr, NDR_BUFFERS, &r->dest));
NDR_CHECK(ndr_push_server_id(ndr, NDR_BUFFERS, &r->src));
}
return NT_STATUS_OK;
}
_PUBLIC_ NTSTATUS ndr_pull_messaging_rec(struct ndr_pull *ndr, int ndr_flags, struct messaging_rec *r)
{
if (ndr_flags & NDR_SCALARS) {
NDR_CHECK(ndr_pull_align(ndr, 4));
NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->msg_version));
NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->msg_type));
NDR_CHECK(ndr_pull_server_id(ndr, NDR_SCALARS, &r->dest));
NDR_CHECK(ndr_pull_server_id(ndr, NDR_SCALARS, &r->src));
NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS, &r->buf));
}
if (ndr_flags & NDR_BUFFERS) {
NDR_CHECK(ndr_pull_server_id(ndr, NDR_BUFFERS, &r->dest));
NDR_CHECK(ndr_pull_server_id(ndr, NDR_BUFFERS, &r->src));
}
return NT_STATUS_OK;
}
_PUBLIC_ void ndr_print_messaging_rec(struct ndr_print *ndr, const char *name, const struct messaging_rec *r)
{
ndr_print_struct(ndr, name, "messaging_rec");
ndr->depth++;
ndr_print_uint32(ndr, "msg_version", r->msg_version);
ndr_print_uint32(ndr, "msg_type", r->msg_type);
ndr_print_server_id(ndr, "dest", &r->dest);
ndr_print_server_id(ndr, "src", &r->src);
ndr_print_DATA_BLOB(ndr, "buf", r->buf);
ndr->depth--;
}
_PUBLIC_ NTSTATUS ndr_push_messaging_array(struct ndr_push *ndr, int ndr_flags, const struct messaging_array *r)
{
uint32_t cntr_messages_0;
if (ndr_flags & NDR_SCALARS) {
NDR_CHECK(ndr_push_align(ndr, 4));
NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->num_messages));
for (cntr_messages_0 = 0; cntr_messages_0 < r->num_messages; cntr_messages_0++) {
NDR_CHECK(ndr_push_messaging_rec(ndr, NDR_SCALARS, &r->messages[cntr_messages_0]));
}
}
if (ndr_flags & NDR_BUFFERS) {
for (cntr_messages_0 = 0; cntr_messages_0 < r->num_messages; cntr_messages_0++) {
NDR_CHECK(ndr_push_messaging_rec(ndr, NDR_BUFFERS, &r->messages[cntr_messages_0]));
}
}
return NT_STATUS_OK;
}
_PUBLIC_ NTSTATUS ndr_pull_messaging_array(struct ndr_pull *ndr, int ndr_flags, struct messaging_array *r)
{
uint32_t cntr_messages_0;
TALLOC_CTX *_mem_save_messages_0;
if (ndr_flags & NDR_SCALARS) {
NDR_CHECK(ndr_pull_align(ndr, 4));
NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->num_messages));
NDR_PULL_ALLOC_N(ndr, r->messages, r->num_messages);
_mem_save_messages_0 = NDR_PULL_GET_MEM_CTX(ndr);
NDR_PULL_SET_MEM_CTX(ndr, r->messages, 0);
for (cntr_messages_0 = 0; cntr_messages_0 < r->num_messages; cntr_messages_0++) {
NDR_CHECK(ndr_pull_messaging_rec(ndr, NDR_SCALARS, &r->messages[cntr_messages_0]));
}
NDR_PULL_SET_MEM_CTX(ndr, _mem_save_messages_0, 0);
}
if (ndr_flags & NDR_BUFFERS) {
_mem_save_messages_0 = NDR_PULL_GET_MEM_CTX(ndr);
NDR_PULL_SET_MEM_CTX(ndr, r->messages, 0);
for (cntr_messages_0 = 0; cntr_messages_0 < r->num_messages; cntr_messages_0++) {
NDR_CHECK(ndr_pull_messaging_rec(ndr, NDR_BUFFERS, &r->messages[cntr_messages_0]));
}
NDR_PULL_SET_MEM_CTX(ndr, _mem_save_messages_0, 0);
}
return NT_STATUS_OK;
}
_PUBLIC_ void ndr_print_messaging_array(struct ndr_print *ndr, const char *name, const struct messaging_array *r)
{
uint32_t cntr_messages_0;
ndr_print_struct(ndr, name, "messaging_array");
ndr->depth++;
ndr_print_uint32(ndr, "num_messages", r->num_messages);
ndr->print(ndr, "%s: ARRAY(%d)", "messages", r->num_messages);
ndr->depth++;
for (cntr_messages_0=0;cntr_messages_0<r->num_messages;cntr_messages_0++) {
char *idx_0=NULL;
asprintf(&idx_0, "[%d]", cntr_messages_0);
if (idx_0) {
ndr_print_messaging_rec(ndr, "messages", &r->messages[cntr_messages_0]);
free(idx_0);
}
}
ndr->depth--;
ndr->depth--;
}

View File

@ -0,0 +1,16 @@
/* header auto-generated by pidl */
#include "librpc/gen_ndr/messaging.h"
#ifndef _HEADER_NDR_messaging
#define _HEADER_NDR_messaging
#include "librpc/ndr/libndr.h"
#define DCERPC_MESSAGING_CALL_COUNT (0)
NTSTATUS ndr_push_messaging_rec(struct ndr_push *ndr, int ndr_flags, const struct messaging_rec *r);
NTSTATUS ndr_pull_messaging_rec(struct ndr_pull *ndr, int ndr_flags, struct messaging_rec *r);
void ndr_print_messaging_rec(struct ndr_print *ndr, const char *name, const struct messaging_rec *r);
NTSTATUS ndr_push_messaging_array(struct ndr_push *ndr, int ndr_flags, const struct messaging_array *r);
NTSTATUS ndr_pull_messaging_array(struct ndr_pull *ndr, int ndr_flags, struct messaging_array *r);
void ndr_print_messaging_array(struct ndr_print *ndr, const char *name, const struct messaging_array *r);
#endif /* _HEADER_NDR_messaging */

View File

@ -0,0 +1,26 @@
#include "idl_types.h"
/*
IDL structures for messaging code
*/
[
pointer_default(unique)
]
interface messaging
{
/* messaging struct sent across the sockets and stored in the tdb */
typedef [public] struct {
uint32 msg_version;
uint32 msg_type;
server_id dest;
server_id src;
DATA_BLOB buf;
} messaging_rec;
typedef [public] struct {
uint32 num_messages;
messaging_rec messages[num_messages];
} messaging_array;
}

View File

@ -376,7 +376,7 @@ static void process(void)
/* Check for internal messages */
message_dispatch();
message_dispatch(nmbd_messaging_context());
/*
* Check all broadcast subnets to see if

View File

@ -41,7 +41,7 @@ static void send_repl_message(uint32 low_serial)
DEBUG(3, ("sending replication message, serial = 0x%04x\n",
low_serial));
message_send_all(nmbd_messaging_context(), MSG_SMB_SAM_REPL,
&low_serial, sizeof(low_serial), False, NULL);
&low_serial, sizeof(low_serial), NULL);
}
/****************************************************************************

View File

@ -744,7 +744,7 @@ static int process_loop(int listen_sock, int listen_priv_sock)
/* Handle messages */
message_dispatch();
message_dispatch(winbind_messaging_context());
run_events(winbind_event_context(), 0, NULL, NULL);

View File

@ -973,7 +973,7 @@ static BOOL fork_domain_child(struct winbindd_child *child)
/* Handle messages */
message_dispatch();
message_dispatch(winbind_messaging_context());
FD_ZERO(&read_fds);
FD_SET(state.sock, &read_fds);

View File

@ -183,7 +183,8 @@ static void print_notify_send_messages_to_printer(struct messaging_context *msg_
}
for (i = 0; i < num_pids; i++) {
unsigned int q_len = messages_pending_for_pid(pid_to_procid(pid_list[i]));
unsigned int q_len = messages_pending_for_pid(
msg_ctx, pid_to_procid(pid_list[i]));
if (q_len > 1000) {
DEBUG(5, ("print_notify_send_messages_to_printer: discarding notify to printer %s as queue length = %u\n",
printer, q_len ));

View File

@ -1426,7 +1426,7 @@ void start_background_queue(void)
/* now check for messages */
DEBUG(10,("start_background_queue: background LPQ thread got a message\n"));
message_dispatch();
message_dispatch(smbd_messaging_context());
/* process any pending print change notify messages */

View File

@ -77,7 +77,7 @@ static void send_sync_message(void)
{
DEBUG(3, ("sending sam synchronisation message\n"));
message_send_all(smbd_messaging_context(), MSG_SMB_SAM_SYNC, NULL, 0,
False, NULL);
NULL);
}
/*************************************************************************

View File

@ -313,7 +313,7 @@ WERROR delete_printer_hook( NT_USER_TOKEN *token, const char *sharename )
if ( (ret = smbrun(command, NULL)) == 0 ) {
/* Tell everyone we updated smb.conf. */
message_send_all(smbd_messaging_context(),
MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL);
MSG_SMB_CONF_UPDATED, NULL, 0, NULL);
}
if ( is_print_op )
@ -6269,7 +6269,7 @@ BOOL add_printer_hook(NT_USER_TOKEN *token, NT_PRINTER_INFO_LEVEL *printer)
if ( (ret = smbrun(command, &fd)) == 0 ) {
/* Tell everyone we updated smb.conf. */
message_send_all(smbd_messaging_context(),
MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL);
MSG_SMB_CONF_UPDATED, NULL, 0, NULL);
}
if ( is_print_op )

View File

@ -1423,7 +1423,7 @@ static WERROR add_share(const char *share_name, const char *path,
/* Tell everyone we updated smb.conf. */
message_send_all(smbd_messaging_context(),
MSG_SMB_CONF_UPDATED,
NULL, 0, False, NULL);
NULL, 0, NULL);
}
if ( is_disk_op )
@ -1520,7 +1520,7 @@ static WERROR delete_share(const char *sharename,
/* Tell everyone we updated smb.conf. */
message_send_all(smbd_messaging_context(),
MSG_SMB_CONF_UPDATED,
NULL, 0, False, NULL);
NULL, 0, NULL);
}
if ( is_disk_op )
@ -1579,7 +1579,7 @@ static WERROR change_share(const char *share_name, const char *path,
/* Tell everyone we updated smb.conf. */
message_send_all(smbd_messaging_context(),
MSG_SMB_CONF_UPDATED,
NULL, 0, False, NULL);
NULL, 0, NULL);
}
if ( is_disk_op )

View File

@ -1895,8 +1895,7 @@ static BOOL api_RNetShareAdd(connection_struct *conn,uint16 vuid,
} else {
SAFE_FREE(command);
message_send_all(smbd_messaging_context(),
MSG_SMB_CONF_UPDATED, NULL, 0,
False, NULL);
MSG_SMB_CONF_UPDATED, NULL, 0, NULL);
}
} else {
return False;

View File

@ -380,7 +380,7 @@ static BOOL receive_message_or_smb(char *buffer, int buffer_len, int timeout)
* messages as we need to synchronously process any messages
* we may have sent to ourselves from the previous SMB.
*/
message_dispatch();
message_dispatch(smbd_messaging_context());
/*
* Check to see if we already have a message on the deferred open queue

View File

@ -392,7 +392,7 @@ static BOOL open_sockets_smbd(enum smb_server_mode server_mode, const char *smb_
lp_TALLOC_FREE();
/* Ensure we respond to PING and DEBUG messages from the main smbd. */
message_dispatch();
message_dispatch(smbd_messaging_context());
if (got_sig_cld) {
pid_t pid;

View File

@ -296,7 +296,6 @@ void send_stat_cache_delete_message(const char *name)
MSG_SMB_STAT_CACHE_DELETE,
name,
strlen(name)+1,
True,
NULL);
#endif
}

View File

@ -75,7 +75,7 @@ static void pong_message(struct messaging_context *msg_ctx,
}
while (pong_count < i) {
message_dispatch();
message_dispatch(msg_ctx);
smb_msleep(1);
}
@ -92,7 +92,7 @@ static void pong_message(struct messaging_context *msg_ctx,
}
for (i=0;i<n;i++) {
message_dispatch();
message_dispatch(msg_ctx);
smb_msleep(1);
}
@ -122,14 +122,14 @@ static void pong_message(struct messaging_context *msg_ctx,
ping_count++;
while (ping_count > pong_count + 20) {
message_dispatch();
message_dispatch(msg_ctx);
}
}
printf("waiting for %d remaining replies (done %d)\n",
(int)(ping_count - pong_count), pong_count);
while (timeval_elapsed(&tv) < 30 && pong_count < ping_count) {
message_dispatch();
message_dispatch(msg_ctx);
}
if (ping_count != pong_count) {

View File

@ -49,8 +49,7 @@ static int num_replies; /* Used by message callback fns */
static BOOL send_message(struct messaging_context *msg_ctx,
struct server_id pid, int msg_type,
const void *buf, int len,
BOOL duplicates)
const void *buf, int len)
{
BOOL ret;
int n_sent = 0;
@ -60,8 +59,7 @@ static BOOL send_message(struct messaging_context *msg_ctx,
messaging_send_buf(msg_ctx, pid, msg_type,
(uint8 *)buf, len));
ret = message_send_all(msg_ctx, msg_type, buf, len, duplicates,
&n_sent);
ret = message_send_all(msg_ctx, msg_type, buf, len, &n_sent);
DEBUG(10,("smbcontrol/send_message: broadcast message to "
"%d processes\n", n_sent));
@ -79,7 +77,7 @@ static void wait_replies(struct messaging_context *msg_ctx,
busy-wait here as there is no nicer way to do it. */
do {
message_dispatch();
message_dispatch(msg_ctx);
event_loop_once(messaging_event_context(msg_ctx));
if (num_replies > 0 && !multiple_replies)
break;
@ -140,8 +138,8 @@ static BOOL do_debug(struct messaging_context *msg_ctx,
return False;
}
return send_message(msg_ctx,
pid, MSG_DEBUG, argv[1], strlen(argv[1]) + 1, False);
return send_message(msg_ctx, pid, MSG_DEBUG, argv[1],
strlen(argv[1]) + 1);
}
#if defined(HAVE_LIBUNWIND_PTRACE) && defined(HAVE_LINUX_PTRACE)
@ -336,7 +334,7 @@ static BOOL do_inject_fault(struct messaging_context *msg_ctx,
}
return send_message(msg_ctx, pid, MSG_SMB_INJECT_FAULT,
&sig, sizeof(int), False);
&sig, sizeof(int));
}
#endif /* DEVELOPER */
}
@ -352,8 +350,7 @@ static BOOL do_election(struct messaging_context *msg_ctx,
return False;
}
return send_message(msg_ctx,
pid, MSG_FORCE_ELECTION, NULL, 0, False);
return send_message(msg_ctx, pid, MSG_FORCE_ELECTION, NULL, 0);
}
/* Ping a samba daemon process */
@ -381,7 +378,7 @@ static BOOL do_ping(struct messaging_context *msg_ctx,
/* Send a message and register our interest in a reply */
if (!send_message(msg_ctx, pid, MSG_PING, NULL, 0, False))
if (!send_message(msg_ctx, pid, MSG_PING, NULL, 0))
return False;
messaging_register(msg_ctx, NULL, MSG_PONG, pong_cb);
@ -425,7 +422,7 @@ static BOOL do_profile(struct messaging_context *msg_ctx,
return False;
}
return send_message(msg_ctx, pid, MSG_PROFILE, &v, sizeof(int), False);
return send_message(msg_ctx, pid, MSG_PROFILE, &v, sizeof(int));
}
/* Return the profiling level */
@ -480,7 +477,7 @@ static void profilelevel_rqst(struct messaging_context *msg_ctx,
/* Send back a dummy reply */
send_message(msg_ctx, pid, MSG_PROFILELEVEL, &v, sizeof(int), False);
send_message(msg_ctx, pid, MSG_PROFILELEVEL, &v, sizeof(int));
}
static BOOL do_profilelevel(struct messaging_context *msg_ctx,
@ -494,7 +491,7 @@ static BOOL do_profilelevel(struct messaging_context *msg_ctx,
/* Send a message and register our interest in a reply */
if (!send_message(msg_ctx, pid, MSG_REQ_PROFILELEVEL, NULL, 0, False))
if (!send_message(msg_ctx, pid, MSG_REQ_PROFILELEVEL, NULL, 0))
return False;
messaging_register(msg_ctx, NULL, MSG_PROFILELEVEL, profilelevel_cb);
@ -526,7 +523,7 @@ static BOOL do_debuglevel(struct messaging_context *msg_ctx,
/* Send a message and register our interest in a reply */
if (!send_message(msg_ctx, pid, MSG_REQ_DEBUGLEVEL, NULL, 0, False))
if (!send_message(msg_ctx, pid, MSG_REQ_DEBUGLEVEL, NULL, 0))
return False;
messaging_register(msg_ctx, NULL, MSG_DEBUGLEVEL, print_pid_string_cb);
@ -696,8 +693,8 @@ static BOOL do_closeshare(struct messaging_context *msg_ctx,
return False;
}
return send_message(msg_ctx,
pid, MSG_SMB_FORCE_TDIS, argv[1], strlen(argv[1]) + 1, False);
return send_message(msg_ctx, pid, MSG_SMB_FORCE_TDIS, argv[1],
strlen(argv[1]) + 1);
}
/* Force a SAM synchronisation */
@ -711,8 +708,7 @@ static BOOL do_samsync(struct messaging_context *msg_ctx,
return False;
}
return send_message(msg_ctx,
pid, MSG_SMB_SAM_SYNC, NULL, 0, False);
return send_message(msg_ctx, pid, MSG_SMB_SAM_SYNC, NULL, 0);
}
/* Force a SAM replication */
@ -726,8 +722,7 @@ static BOOL do_samrepl(struct messaging_context *msg_ctx,
return False;
}
return send_message(msg_ctx,
pid, MSG_SMB_SAM_REPL, NULL, 0, False);
return send_message(msg_ctx, pid, MSG_SMB_SAM_REPL, NULL, 0);
}
/* Display talloc pool usage */
@ -745,7 +740,7 @@ static BOOL do_poolusage(struct messaging_context *msg_ctx,
/* Send a message and register our interest in a reply */
if (!send_message(msg_ctx, pid, MSG_REQ_POOL_USAGE, NULL, 0, False))
if (!send_message(msg_ctx, pid, MSG_REQ_POOL_USAGE, NULL, 0))
return False;
wait_replies(msg_ctx, procid_to_pid(&pid) == 0);
@ -771,8 +766,7 @@ static BOOL do_dmalloc_mark(struct messaging_context *msg_ctx,
return False;
}
return send_message(msg_ctx,
pid, MSG_REQ_DMALLOC_MARK, NULL, 0, False);
return send_message(msg_ctx, pid, MSG_REQ_DMALLOC_MARK, NULL, 0);
}
/* Perform a dmalloc changed */
@ -787,8 +781,8 @@ static BOOL do_dmalloc_changed(struct messaging_context *msg_ctx,
return False;
}
return send_message(msg_ctx,
pid, MSG_REQ_DMALLOC_LOG_CHANGED, NULL, 0, False);
return send_message(msg_ctx, pid, MSG_REQ_DMALLOC_LOG_CHANGED,
NULL, 0);
}
/* Shutdown a server process */
@ -802,7 +796,7 @@ static BOOL do_shutdown(struct messaging_context *msg_ctx,
return False;
}
return send_message(msg_ctx, pid, MSG_SHUTDOWN, NULL, 0, False);
return send_message(msg_ctx, pid, MSG_SHUTDOWN, NULL, 0);
}
/* Notify a driver upgrade */
@ -817,8 +811,8 @@ static BOOL do_drvupgrade(struct messaging_context *msg_ctx,
return False;
}
return send_message(msg_ctx,
pid, MSG_DEBUG, argv[1], strlen(argv[1]) + 1, False);
return send_message(msg_ctx, pid, MSG_DEBUG, argv[1],
strlen(argv[1]) + 1);
}
static BOOL do_winbind_online(struct messaging_context *msg_ctx,
@ -852,7 +846,7 @@ static BOOL do_winbind_online(struct messaging_context *msg_ctx,
tdb_delete_bystring(tdb, "WINBINDD_OFFLINE");
tdb_close(tdb);
return send_message(msg_ctx, pid, MSG_WINBIND_ONLINE, NULL, 0, False);
return send_message(msg_ctx, pid, MSG_WINBIND_ONLINE, NULL, 0);
}
static BOOL do_winbind_offline(struct messaging_context *msg_ctx,
@ -909,7 +903,7 @@ static BOOL do_winbind_offline(struct messaging_context *msg_ctx,
tdb_store_bystring(tdb, "WINBINDD_OFFLINE", d, TDB_INSERT);
ret = send_message(msg_ctx, pid, MSG_WINBIND_OFFLINE,
NULL, 0, False);
NULL, 0);
/* Check that the entry "WINBINDD_OFFLINE" still exists. */
d = tdb_fetch_bystring( tdb, "WINBINDD_OFFLINE" );
@ -944,7 +938,7 @@ static BOOL do_winbind_onlinestatus(struct messaging_context *msg_ctx,
print_pid_string_cb);
if (!send_message(msg_ctx, pid, MSG_WINBIND_ONLINESTATUS, &myid,
sizeof(myid), False))
sizeof(myid)))
return False;
wait_replies(msg_ctx, procid_to_pid(&pid) == 0);
@ -969,8 +963,7 @@ static BOOL do_reload_config(struct messaging_context *msg_ctx,
return False;
}
return send_message(msg_ctx, pid, MSG_SMB_CONF_UPDATED,
NULL, 0, False);
return send_message(msg_ctx, pid, MSG_SMB_CONF_UPDATED, NULL, 0);
}
static void my_make_nmb_name( struct nmb_name *n, const char *name, int type)
@ -1018,8 +1011,7 @@ static BOOL do_nodestatus(struct messaging_context *msg_ctx,
p.packet.nmb.question.question_type = 0x21;
p.packet.nmb.question.question_class = 0x1;
return send_message(msg_ctx, pid, MSG_SEND_PACKET, &p, sizeof(p),
False);
return send_message(msg_ctx, pid, MSG_SEND_PACKET, &p, sizeof(p));
}
/* A list of message type supported */