From 3689e4ffc10fceb4c39814ef58fe31697e7dd976 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 11 Sep 2000 07:02:43 +0000 Subject: the first cut of the internal messaging system. The motivation for this system is to replace the UDP message for oplocks, but this commit only does the "set debug level" message. (This used to be commit 2a34ee95f3929cff131db6c5a2b4820194c05b2d) --- source3/lib/messages.c | 237 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 237 insertions(+) create mode 100644 source3/lib/messages.c (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c new file mode 100644 index 0000000000..30eef40ec9 --- /dev/null +++ b/source3/lib/messages.c @@ -0,0 +1,237 @@ +/* + Unix SMB/Netbios implementation. + Version 3.0 + Samba internal messaging functions + 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 + 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. +*/ + +/* this module is used for internal messaging between Samba daemons. */ + +#include "includes.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 + +struct message_rec { + int msg_version; + enum message_type msg_type; + pid_t dest; + pid_t src; + size_t len; +}; + +/**************************************************************************** +notifications come in as signals +****************************************************************************/ +static void sig_usr1(void) +{ + received_signal = 1; + sys_select_signal(); +} + +/**************************************************************************** + Initialise the messaging functions. +****************************************************************************/ +BOOL message_init(void) +{ + if (tdb) return True; + + tdb = tdb_open(lock_path("messages.tdb"), + 0, TDB_CLEAR_IF_FIRST, + O_RDWR|O_CREAT,0600); + + if (!tdb) { + DEBUG(0,("ERROR: Failed to initialise messages database\n")); + return False; + } + + CatchSignal(SIGUSR1, sig_usr1); + + return True; +} + + +/******************************************************************* + form a static tdb key from a pid +******************************************************************/ +static TDB_DATA message_key_pid(pid_t pid) +{ + static char key[20]; + TDB_DATA kbuf; + + slprintf(key, sizeof(key), "PID/%d", (int)pid); + + kbuf.dptr = (char *)key; + kbuf.dsize = sizeof(key); + return kbuf; +} + + +/**************************************************************************** +notify a process that it has a message. If the process doesn't exist +then delete its record in the database +****************************************************************************/ +static BOOL message_notify(pid_t pid) +{ + if (kill(pid, SIGUSR1) == -1) { + if (errno == ESRCH) { + DEBUG(2,("pid %d doesn't exist - deleting messages record\n", (int)pid)); + tdb_delete(tdb, message_key_pid(pid)); + } else { + DEBUG(2,("message to process %d failed - %s\n", (int)pid, strerror(errno))); + } + return False; + } + return True; +} + +/**************************************************************************** +send a message to a particular pid +****************************************************************************/ +BOOL message_send_pid(pid_t pid, enum message_type msg_type, void *buf, size_t len) +{ + TDB_DATA kbuf; + TDB_DATA dbuf; + struct message_rec rec; + void *p; + + rec.msg_version = MESSAGE_VERSION; + rec.msg_type = msg_type; + rec.dest = pid; + rec.src = sys_getpid(); + rec.len = len; + + kbuf = message_key_pid(pid); + + /* lock the record for the destination */ + tdb_lockchain(tdb, kbuf); + + dbuf = tdb_fetch(tdb, kbuf); + + if (!dbuf.dptr) { + /* its a new record */ + p = (void *)malloc(len + sizeof(rec)); + if (!p) goto failed; + + memcpy(p, &rec, sizeof(rec)); + memcpy(p+sizeof(rec), buf, len); + + dbuf.dptr = p; + dbuf.dsize = len + sizeof(rec); + tdb_store(tdb, kbuf, dbuf, TDB_REPLACE); + free(p); + goto ok; + } + + /* we're adding to an existing entry */ + p = (void *)malloc(dbuf.dsize + len + sizeof(rec)); + if (!p) goto failed; + + memcpy(p, dbuf.dptr, dbuf.dsize); + memcpy(p+dbuf.dsize, &rec, sizeof(rec)); + memcpy(p+dbuf.dsize+sizeof(rec), buf, len); + + dbuf.dptr = p; + dbuf.dsize += len + sizeof(rec); + tdb_store(tdb, kbuf, dbuf, TDB_REPLACE); + free(dbuf.dptr); + free(p); + + ok: + tdb_unlockchain(tdb, kbuf); + return message_notify(pid); + + failed: + tdb_unlockchain(tdb, kbuf); + return False; +} + + + +/**************************************************************************** +retrieve the next message for the current process +****************************************************************************/ +static BOOL message_recv(enum message_type *msg_type, pid_t *src, void **buf, size_t *len) +{ + TDB_DATA kbuf; + TDB_DATA dbuf; + struct message_rec rec; + + kbuf = message_key_pid(sys_getpid()); + + tdb_lockchain(tdb, kbuf); + + dbuf = tdb_fetch(tdb, kbuf); + if (dbuf.dptr == NULL || dbuf.dsize == 0) goto failed; + + memcpy(&rec, dbuf.dptr, sizeof(rec)); + + if (rec.msg_version != MESSAGE_VERSION) { + DEBUG(0,("message version %d received (expected %d)\n", rec.msg_version, MESSAGE_VERSION)); + goto failed; + } + + (*buf) = (void *)malloc(rec.len); + if (!(*buf)) goto failed; + + memcpy(*buf, dbuf.dptr+sizeof(rec), rec.len); + *len = rec.len; + *msg_type = rec.msg_type; + *src = rec.src; + + memmove(dbuf.dptr, dbuf.dptr+sizeof(rec)+rec.len, dbuf.dsize - (sizeof(rec)+rec.len)); + dbuf.dsize -= sizeof(rec)+rec.len; + tdb_store(tdb, kbuf, dbuf, TDB_REPLACE); + + free(dbuf.dptr); + tdb_unlockchain(tdb, kbuf); + return True; + + failed: + tdb_unlockchain(tdb, kbuf); + return False; +} + + +/**************************************************************************** +receive and dispatch any messages pending for this process +****************************************************************************/ +void message_dispatch(void) +{ + enum message_type msg_type; + pid_t src; + void *buf; + size_t len; + + if (!received_signal) return; + received_signal = 0; + + while (message_recv(&msg_type, &src, &buf, &len)) { + switch (msg_type) { + case MSG_DEBUG: + debug_message(src, buf, len); + break; + default: + DEBUG(0,("Unknown message type %d from %d\n", msg_type, (int)src)); + break; + } + } +} -- cgit From 06eeb3c45803bcf26ee586103a974fd852de21b9 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 12 Sep 2000 00:47:11 +0000 Subject: much nicer message interface. We now register dispatch functions, allowing new bits of code or vfs modules to register functions without impacting on the messaging code itself. Also note that multiple registrations for the same message type are possible allowing the same message to be delivered to multiple parts of the code (possibly useful for reload messages). (This used to be commit c3350c77f52cade48d2945574e09cb630af85b92) --- source3/lib/messages.c | 53 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 45 insertions(+), 8 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 30eef40ec9..bbda5d71ed 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -19,7 +19,18 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* this module is used for internal messaging between Samba daemons. */ +/* this module is used for internal messaging between Samba daemons. + + The idea is that if a part of Samba wants to do communication with + another Samba process then it will do a message_register() of a + dispatch function, and use message_send_pid() to send messages to + that process. + + This system doesn't have any inherent size limitations but is not + very efficient for large messages or when messages are sent in very + quick succession. + +*/ #include "includes.h" @@ -38,6 +49,13 @@ struct message_rec { size_t len; }; +/* we have a linked list of dispatch handlers */ +static struct dispatch_fns { + struct dispatch_fns *next, *prev; + enum message_type msg_type; + void (*fn)(enum message_type msg_type, pid_t pid, void *buf, size_t len); +} *dispatch_fns; + /**************************************************************************** notifications come in as signals ****************************************************************************/ @@ -213,6 +231,8 @@ static BOOL message_recv(enum message_type *msg_type, pid_t *src, void **buf, si /**************************************************************************** receive and dispatch any messages pending for this process +notice that all dispatch handlers for a particular msg_type get called, +so you can register multiple handlers for a message ****************************************************************************/ void message_dispatch(void) { @@ -220,18 +240,35 @@ void message_dispatch(void) pid_t src; void *buf; size_t len; + struct dispatch_fns *dfn; if (!received_signal) return; received_signal = 0; while (message_recv(&msg_type, &src, &buf, &len)) { - switch (msg_type) { - case MSG_DEBUG: - debug_message(src, buf, len); - break; - default: - DEBUG(0,("Unknown message type %d from %d\n", msg_type, (int)src)); - break; + for (dfn = dispatch_fns; dfn; dfn = dfn->next) { + if (dfn->msg_type == msg_type) { + dfn->fn(msg_type, src, buf, len); + } } } } + + +/**************************************************************************** +register a dispatch function for a particular message type +****************************************************************************/ +void message_register(enum message_type msg_type, + void (*fn)(enum message_type msg_type, pid_t pid, void *buf, size_t len)) +{ + struct dispatch_fns *dfn; + + dfn = (struct dispatch_fns *)malloc(sizeof(*dfn)); + + ZERO_STRUCTP(dfn); + + dfn->msg_type = msg_type; + dfn->fn = fn; + + DLIST_ADD(dispatch_fns, dfn); +} -- cgit From f0ce4f7ae3b58f45b70598e3a44539e3e12291ce Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 12 Sep 2000 06:13:25 +0000 Subject: - changed the msg_type to be an int instead of an enum so that it is easier to add new message types to messages.h without breaking old binaries - added a MSG_FORCE_ELECTION message to force nmbd to hold an election (This used to be commit f1c49ca7ce56bc39259041a71479e84ebf53eeca) --- source3/lib/messages.c | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index bbda5d71ed..927cb095dd 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -43,7 +43,7 @@ static int received_signal; struct message_rec { int msg_version; - enum message_type msg_type; + int msg_type; pid_t dest; pid_t src; size_t len; @@ -52,8 +52,8 @@ struct message_rec { /* we have a linked list of dispatch handlers */ static struct dispatch_fns { struct dispatch_fns *next, *prev; - enum message_type msg_type; - void (*fn)(enum message_type msg_type, pid_t pid, void *buf, size_t len); + int msg_type; + void (*fn)(int msg_type, pid_t pid, void *buf, size_t len); } *dispatch_fns; /**************************************************************************** @@ -124,7 +124,7 @@ static BOOL message_notify(pid_t pid) /**************************************************************************** send a message to a particular pid ****************************************************************************/ -BOOL message_send_pid(pid_t pid, enum message_type msg_type, void *buf, size_t len) +BOOL message_send_pid(pid_t pid, int msg_type, void *buf, size_t len) { TDB_DATA kbuf; TDB_DATA dbuf; @@ -150,7 +150,7 @@ BOOL message_send_pid(pid_t pid, enum message_type msg_type, void *buf, size_t l if (!p) goto failed; memcpy(p, &rec, sizeof(rec)); - memcpy(p+sizeof(rec), buf, len); + if (len > 0) memcpy(p+sizeof(rec), buf, len); dbuf.dptr = p; dbuf.dsize = len + sizeof(rec); @@ -165,7 +165,7 @@ BOOL message_send_pid(pid_t pid, enum message_type msg_type, void *buf, size_t l memcpy(p, dbuf.dptr, dbuf.dsize); memcpy(p+dbuf.dsize, &rec, sizeof(rec)); - memcpy(p+dbuf.dsize+sizeof(rec), buf, len); + if (len > 0) memcpy(p+dbuf.dsize+sizeof(rec), buf, len); dbuf.dptr = p; dbuf.dsize += len + sizeof(rec); @@ -187,7 +187,7 @@ BOOL message_send_pid(pid_t pid, enum message_type msg_type, void *buf, size_t l /**************************************************************************** retrieve the next message for the current process ****************************************************************************/ -static BOOL message_recv(enum message_type *msg_type, pid_t *src, void **buf, size_t *len) +static BOOL message_recv(int *msg_type, pid_t *src, void **buf, size_t *len) { TDB_DATA kbuf; TDB_DATA dbuf; @@ -207,10 +207,15 @@ static BOOL message_recv(enum message_type *msg_type, pid_t *src, void **buf, si goto failed; } - (*buf) = (void *)malloc(rec.len); - if (!(*buf)) goto failed; + if (rec.len > 0) { + (*buf) = (void *)malloc(rec.len); + if (!(*buf)) goto failed; + + memcpy(*buf, dbuf.dptr+sizeof(rec), rec.len); + } else { + *buf = NULL; + } - memcpy(*buf, dbuf.dptr+sizeof(rec), rec.len); *len = rec.len; *msg_type = rec.msg_type; *src = rec.src; @@ -236,7 +241,7 @@ so you can register multiple handlers for a message ****************************************************************************/ void message_dispatch(void) { - enum message_type msg_type; + int msg_type; pid_t src; void *buf; size_t len; @@ -258,8 +263,8 @@ void message_dispatch(void) /**************************************************************************** register a dispatch function for a particular message type ****************************************************************************/ -void message_register(enum message_type msg_type, - void (*fn)(enum message_type msg_type, pid_t pid, void *buf, size_t len)) +void message_register(int msg_type, + void (*fn)(int msg_type, pid_t pid, void *buf, size_t len)) { struct dispatch_fns *dfn; -- cgit From df89b4853954b7dcc86839167760cf72af693656 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 12 Sep 2000 06:57:25 +0000 Subject: - fixed some memory leaks in the messages code - added a MSG_PING message for performance testing. (This used to be commit e779f834dbb875669c3aa0a35b324aa13f0c8c36) --- source3/lib/messages.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 927cb095dd..939bf36004 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -65,6 +65,14 @@ static void sig_usr1(void) sys_select_signal(); } +/**************************************************************************** +a useful function for testing the message system +****************************************************************************/ +void ping_message(int msg_type, pid_t src, void *buf, size_t len) +{ + message_send_pid(src, MSG_PONG, buf, len); +} + /**************************************************************************** Initialise the messaging functions. ****************************************************************************/ @@ -83,6 +91,8 @@ BOOL message_init(void) CatchSignal(SIGUSR1, sig_usr1); + message_register(MSG_PING, ping_message); + return True; } @@ -167,11 +177,11 @@ BOOL message_send_pid(pid_t pid, int msg_type, void *buf, size_t len) memcpy(p+dbuf.dsize, &rec, sizeof(rec)); if (len > 0) memcpy(p+dbuf.dsize+sizeof(rec), buf, len); + free(dbuf.dptr); dbuf.dptr = p; dbuf.dsize += len + sizeof(rec); tdb_store(tdb, kbuf, dbuf, TDB_REPLACE); free(dbuf.dptr); - free(p); ok: tdb_unlockchain(tdb, kbuf); @@ -256,6 +266,7 @@ void message_dispatch(void) dfn->fn(msg_type, src, buf, len); } } + if (buf) free(buf); } } @@ -277,3 +288,19 @@ void message_register(int msg_type, DLIST_ADD(dispatch_fns, dfn); } + +/**************************************************************************** +de-register the function for a particular message type +****************************************************************************/ +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); + free(dfn); + } + } +} -- cgit From 7be9a4fd4c044fa98c434bbdbf0f8229f1101bbb Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 13 Sep 2000 07:07:17 +0000 Subject: 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 5f91c24636f5d82486f22c10bc55e060f9c518bf) --- source3/lib/messages.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 939bf36004..4153c21c23 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.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; +} -- cgit From 7489aa1ff35cb1b9d154948f5f9f971ad0346e59 Mon Sep 17 00:00:00 2001 From: Herb Lewis Date: Tue, 26 Sep 2000 18:48:13 +0000 Subject: fix for IRIX compiler error messages (This used to be commit f2549db1ce6527c3e378e9f9210c70be5de93762) --- source3/lib/messages.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 4153c21c23..2409e5b1e8 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -160,7 +160,7 @@ BOOL message_send_pid(pid_t pid, int msg_type, void *buf, size_t len) if (!p) goto failed; memcpy(p, &rec, sizeof(rec)); - if (len > 0) memcpy(p+sizeof(rec), buf, len); + if (len > 0) memcpy((void *)((unsigned)p+sizeof(rec)), buf, len); dbuf.dptr = p; dbuf.dsize = len + sizeof(rec); @@ -174,8 +174,8 @@ BOOL message_send_pid(pid_t pid, int msg_type, void *buf, size_t len) if (!p) goto failed; memcpy(p, dbuf.dptr, dbuf.dsize); - memcpy(p+dbuf.dsize, &rec, sizeof(rec)); - if (len > 0) memcpy(p+dbuf.dsize+sizeof(rec), buf, len); + memcpy((void *)((unsigned)p+dbuf.dsize), &rec, sizeof(rec)); + if (len > 0) memcpy((void *)((unsigned)p+dbuf.dsize+sizeof(rec)), buf, len); free(dbuf.dptr); dbuf.dptr = p; -- cgit From 23f78fd7b91878176c518471cdca84cad826cba9 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 4 Oct 2000 01:03:23 +0000 Subject: Adding Herb's compile warning fixes to HEAD. Jeremy. (This used to be commit d131ad1ce3f6e72e295f865a463f8dcbfa6f8d42) --- source3/lib/messages.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 2409e5b1e8..258610f409 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -89,7 +89,7 @@ BOOL message_init(void) return False; } - CatchSignal(SIGUSR1, sig_usr1); + CatchSignal(SIGUSR1, SIGNAL_CAST sig_usr1); message_register(MSG_PING, ping_message); -- cgit From 8719c27726d3412edd0781beb956f48f76a62fb6 Mon Sep 17 00:00:00 2001 From: Herb Lewis Date: Wed, 11 Oct 2000 05:31:39 +0000 Subject: changes to sync with 2.2. tree .cvsignore remove config.h - not in this directory include/profile.h profile changes lib/messages.c added message to return debug level libsmb/clierror.c cast to get rid of compiler warning libsmb/smbencrypt.c cast to get rid of compiler warning profile/profile.c add flush profile stats changes for profile struct rpc_parse/parse_samr.c fix for compiler warning rpc_server/srv_samr.c cast to get rid of compiler warning smbd/ipc.c profile stats message.c profile stats smbd/negprot.c profile stats smbd/nttrans.c profile stats smbd/trans2.c profile stats utils/smbcontrol.c new flush stats command (This used to be commit bbb24daa25dca4e4b6b1f8942cd84ee3aa1bed8e) --- source3/lib/messages.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 258610f409..1b225b1ed3 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -73,6 +73,17 @@ void ping_message(int msg_type, pid_t src, void *buf, size_t len) message_send_pid(src, MSG_PONG, buf, len); } +/**************************************************************************** +return current debug level +****************************************************************************/ +void debuglevel_message(int msg_type, pid_t src, void *buf, size_t len) +{ + int level; + + level = DEBUGLEVEL; + message_send_pid(src, MSG_DEBUGLEVEL, &level, sizeof(int)); +} + /**************************************************************************** Initialise the messaging functions. ****************************************************************************/ @@ -92,6 +103,7 @@ BOOL message_init(void) CatchSignal(SIGUSR1, SIGNAL_CAST sig_usr1); message_register(MSG_PING, ping_message); + message_register(MSG_REQ_DEBUGLEVEL, debuglevel_message); return True; } -- cgit From 53ce2f7012d55e200082fa7bc04b27d9dcfcf706 Mon Sep 17 00:00:00 2001 From: Herb Lewis Date: Thu, 12 Oct 2000 17:58:40 +0000 Subject: lib/messages.c add debug print for receipt of PING and REQ_DEBUGLEVEL messages utils/smbcontrol.c allow "q" to exit interactive mode. Exit on error from message_init. (This used to be commit cda8c0439113dcce02a681b0aaddf69326c0ec9a) --- source3/lib/messages.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 1b225b1ed3..53c911e8b0 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -70,6 +70,7 @@ a useful function for testing the message system ****************************************************************************/ void ping_message(int msg_type, pid_t src, void *buf, size_t len) { + DEBUG(1,("INFO: Received PING message from PID %d\n",src)); message_send_pid(src, MSG_PONG, buf, len); } @@ -80,6 +81,7 @@ void debuglevel_message(int msg_type, pid_t src, void *buf, size_t len) { int level; + DEBUG(1,("INFO: Received REQ_DEBUGLEVEL message from PID %d\n",src)); level = DEBUGLEVEL; message_send_pid(src, MSG_DEBUGLEVEL, &level, sizeof(int)); } -- cgit From 61b659faafdb33097e664d034f10b930bf9f6a0b Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Sat, 4 Nov 2000 18:44:34 +0000 Subject: Fix some compiler warnings. (This used to be commit 852de9226d50ccac71ec1691052a6e395283ca56) --- source3/lib/messages.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 53c911e8b0..98e9a47179 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -328,7 +328,7 @@ static struct { /**************************************************************************** send one of the messages for the broadcast ****************************************************************************/ -static int traverse_fn(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf, void *state) +static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void *state) { struct connections_data crec; @@ -345,10 +345,10 @@ 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_CONTEXT *the_tdb; - tdb = tdb_open(lock_path("connections.tdb"), 0, 0, O_RDONLY, 0); - if (!tdb) { + the_tdb = tdb_open(lock_path("connections.tdb"), 0, 0, O_RDONLY, 0); + if (!the_tdb) { DEBUG(2,("Failed to open connections database in message_send_all\n")); return False; } @@ -357,7 +357,7 @@ BOOL message_send_all(int msg_type, void *buf, size_t len) msg_all.buf = buf; msg_all.len = len; - tdb_traverse(tdb, traverse_fn, NULL); - tdb_close(tdb); + tdb_traverse(the_tdb, traverse_fn, NULL); + tdb_close(the_tdb); return True; } -- cgit From 7185f5fbe6a8d1a8e043b693bcbaf9b3e26329ad Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Mon, 6 Nov 2000 23:14:59 +0000 Subject: 64 bit fix from Uros Prestor . Jeremy. (This used to be commit 9a5471b3e861aa864ffff5fc87ac2681de7b0068) --- source3/lib/messages.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 98e9a47179..1cc6700ea9 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -174,7 +174,7 @@ BOOL message_send_pid(pid_t pid, int msg_type, void *buf, size_t len) if (!p) goto failed; memcpy(p, &rec, sizeof(rec)); - if (len > 0) memcpy((void *)((unsigned)p+sizeof(rec)), buf, len); + if (len > 0) memcpy((void *)((char*)p+sizeof(rec)), buf, len); dbuf.dptr = p; dbuf.dsize = len + sizeof(rec); @@ -188,8 +188,8 @@ BOOL message_send_pid(pid_t pid, int msg_type, void *buf, size_t len) if (!p) goto failed; memcpy(p, dbuf.dptr, dbuf.dsize); - memcpy((void *)((unsigned)p+dbuf.dsize), &rec, sizeof(rec)); - if (len > 0) memcpy((void *)((unsigned)p+dbuf.dsize+sizeof(rec)), buf, len); + memcpy((void *)((char*)p+dbuf.dsize), &rec, sizeof(rec)); + if (len > 0) memcpy((void *)((char*)p+dbuf.dsize+sizeof(rec)), buf, len); free(dbuf.dptr); dbuf.dptr = p; -- cgit From 20838bb9ed25d7a325831041f371c11731ff6283 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Sat, 11 Nov 2000 00:33:33 +0000 Subject: Merge of Herb's profiling code. Jeremy. (This used to be commit 3be056c71aa8e0a4ba70d397107199004bdb7d3f) --- source3/lib/messages.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 1cc6700ea9..126ca768b7 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -334,6 +334,7 @@ static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void memcpy(&crec, dbuf.dptr, sizeof(crec)); + if (crec.cnum == -1) return 0; message_send_pid(crec.pid, msg_all.msg_type, msg_all.buf, msg_all.len); return 0; } -- cgit From cdac09614ef426092ed1b1de480fe90c3c4cdd83 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 16 Nov 2000 21:38:24 +0000 Subject: Fix for a problem with the new messaging system. If a sender is using the messaging system as a notification mechanism, and the speed of notification greatly exceeds the speed of message recovery, then you get a massively (>75Mb) growing tdb. If the message is a simple notification, then the message is static, and you only need one of them in transit to a target process at any one time. This patch adds a BOOL "allow_duplicates" to the message_send_XX primitives. If set to False, then before sending a message the sender checks the existing message queue for a target pid for a duplicate of this message, and doesn't add to it if one already exists. Also added code into msgtest.c to test this. Jeremy. (This used to be commit 3aa7995660395ecb85c8e35b638fa9fbbb952558) --- source3/lib/messages.c | 46 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 5 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 126ca768b7..0e2dfeffd6 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -71,7 +71,7 @@ a useful function for testing the message system void ping_message(int msg_type, pid_t src, void *buf, size_t len) { DEBUG(1,("INFO: Received PING message from PID %d\n",src)); - message_send_pid(src, MSG_PONG, buf, len); + message_send_pid(src, MSG_PONG, buf, len, True); } /**************************************************************************** @@ -83,7 +83,7 @@ void debuglevel_message(int msg_type, pid_t src, void *buf, size_t len) DEBUG(1,("INFO: Received REQ_DEBUGLEVEL message from PID %d\n",src)); level = DEBUGLEVEL; - message_send_pid(src, MSG_DEBUGLEVEL, &level, sizeof(int)); + message_send_pid(src, MSG_DEBUGLEVEL, &level, sizeof(int), True); } /**************************************************************************** @@ -148,13 +148,23 @@ static BOOL message_notify(pid_t pid) /**************************************************************************** send a message to a particular pid ****************************************************************************/ -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, BOOL duplicates_allowed) { TDB_DATA kbuf; TDB_DATA dbuf; struct message_rec rec; void *p; + /* + * Do an early check for process exists - saves adding into a tdb + * and deleting again if the target is not present. JRA. + */ + + if (kill(pid, 0) == -1) { + DEBUG(2,("message_send_pid: pid %d doesn't exist\n", (int)pid)); + return False; + } + rec.msg_version = MESSAGE_VERSION; rec.msg_type = msg_type; rec.dest = pid; @@ -183,6 +193,30 @@ BOOL message_send_pid(pid_t pid, int msg_type, void *buf, size_t len) goto ok; } + if (!duplicates_allowed) { + char *ptr; + struct message_rec *prec; + + for(ptr = (char *)dbuf.dptr, prec = (struct message_rec *)ptr; ptr < dbuf.dptr + dbuf.dsize; + ptr += (sizeof(rec) + prec->len), prec = (struct message_rec *)ptr) { + + /* + * First check if the message header matches, then, if it's a non-zero + * sized message, check if the data matches. If so it's a duplicate and + * we can discard it. JRA. + */ + + if (!memcmp(ptr, &rec, sizeof(rec))) { + if (!len || (len && !memcmp( ptr + sizeof(rec), (char *)buf, len))) { + DEBUG(10,("message_send_pid: discarding duplicate message.\n")); + free(dbuf.dptr); + tdb_unlockchain(tdb, kbuf); + return True; + } + } + } + } + /* we're adding to an existing entry */ p = (void *)malloc(dbuf.dsize + len + sizeof(rec)); if (!p) goto failed; @@ -323,6 +357,7 @@ static struct { int msg_type; void *buf; size_t len; + BOOL duplicates; } msg_all; /**************************************************************************** @@ -335,7 +370,7 @@ static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void memcpy(&crec, dbuf.dptr, sizeof(crec)); if (crec.cnum == -1) return 0; - message_send_pid(crec.pid, msg_all.msg_type, msg_all.buf, msg_all.len); + message_send_pid(crec.pid, msg_all.msg_type, msg_all.buf, msg_all.len, msg_all.duplicates); return 0; } @@ -344,7 +379,7 @@ 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) +BOOL message_send_all(int msg_type, void *buf, size_t len, BOOL duplicates_allowed) { TDB_CONTEXT *the_tdb; @@ -357,6 +392,7 @@ BOOL message_send_all(int msg_type, void *buf, size_t len) msg_all.msg_type = msg_type; msg_all.buf = buf; msg_all.len = len; + msg_all.duplicates = duplicates_allowed; tdb_traverse(the_tdb, traverse_fn, NULL); tdb_close(the_tdb); -- cgit From 2add9223231a710c7935fddd39f1a25b1a3c4462 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 17 Nov 2000 00:02:16 +0000 Subject: use process_exists() not kill(pid, 0) (This used to be commit 30048cff12e03c95ef43ba4ee16af1df2de9dbc8) --- source3/lib/messages.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 0e2dfeffd6..0f3638ada2 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -160,7 +160,7 @@ BOOL message_send_pid(pid_t pid, int msg_type, void *buf, size_t len, BOOL dupli * and deleting again if the target is not present. JRA. */ - if (kill(pid, 0) == -1) { + if (!process_exists(pid)) { DEBUG(2,("message_send_pid: pid %d doesn't exist\n", (int)pid)); return False; } -- cgit From 7c8e73e9435a740836acbbe677837bc9c3c63b1b Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 17 Nov 2000 00:08:42 +0000 Subject: the duplicate checking code will cause unaligned accesses on non-intel processors. Fixed. (This used to be commit 64d38c24100cb3409b38b9923734f2a6202bdc2a) --- source3/lib/messages.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 0f3638ada2..8b50533610 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -195,11 +195,9 @@ BOOL message_send_pid(pid_t pid, int msg_type, void *buf, size_t len, BOOL dupli if (!duplicates_allowed) { char *ptr; - struct message_rec *prec; + struct message_rec prec; - for(ptr = (char *)dbuf.dptr, prec = (struct message_rec *)ptr; ptr < dbuf.dptr + dbuf.dsize; - ptr += (sizeof(rec) + prec->len), prec = (struct message_rec *)ptr) { - + for(ptr = (char *)dbuf.dptr; ptr < dbuf.dptr + dbuf.dsize; ) { /* * First check if the message header matches, then, if it's a non-zero * sized message, check if the data matches. If so it's a duplicate and @@ -214,6 +212,8 @@ BOOL message_send_pid(pid_t pid, int msg_type, void *buf, size_t len, BOOL dupli return True; } } + memcpy(&prec, ptr, sizeof(prec)); + ptr += sizeof(rec) + prec.len; } } -- cgit From 29e6b9cdd089eccc6ed0877d8bad8eb193e339e1 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 17 Nov 2000 00:48:02 +0000 Subject: Delete queue on empty. Jeremy. (This used to be commit 6e18a2aa58bc485e3c803ff357acc1b7fe6d95e1) --- source3/lib/messages.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 8b50533610..8f181f0982 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -278,9 +278,14 @@ static BOOL message_recv(int *msg_type, pid_t *src, void **buf, size_t *len) *msg_type = rec.msg_type; *src = rec.src; - memmove(dbuf.dptr, dbuf.dptr+sizeof(rec)+rec.len, dbuf.dsize - (sizeof(rec)+rec.len)); + if (dbuf.dsize - (sizeof(rec)+rec.len) > 0) + memmove(dbuf.dptr, dbuf.dptr+sizeof(rec)+rec.len, dbuf.dsize - (sizeof(rec)+rec.len)); dbuf.dsize -= sizeof(rec)+rec.len; - tdb_store(tdb, kbuf, dbuf, TDB_REPLACE); + + if (dbuf.dsize == 0) + tdb_delete(tdb, kbuf); + else + tdb_store(tdb, kbuf, dbuf, TDB_REPLACE); free(dbuf.dptr); tdb_unlockchain(tdb, kbuf); -- cgit From 0de5569304ec1d1650865983dba32f13c313104c Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 17 Nov 2000 03:15:18 +0000 Subject: fixed the problem with messages not getting through the problem had nothing to do with being your own pid, it was instead a problem with IPC$ connections not being registered in the connections database and an incorrect test for -1 in the messaging code. These changes also mean that IPC$ shares now show up in smbstatus. That is probably a good thing. (This used to be commit 3575ad10985a18f897e38179ca69fa9a49a7ea02) --- source3/lib/messages.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 8f181f0982..7a0343b249 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -374,7 +374,7 @@ static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void memcpy(&crec, dbuf.dptr, sizeof(crec)); - if (crec.cnum == -1) return 0; + if (crec.cnum != -1) return 0; message_send_pid(crec.pid, msg_all.msg_type, msg_all.buf, msg_all.len, msg_all.duplicates); return 0; } -- cgit From d546f555a22e1c4aaa29851ab7a226137fce3508 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 2 Dec 2000 00:51:50 +0000 Subject: fixed messaging bug - use strlen() instead of sizeof() in key length (This used to be commit 1d63160c751fa968e3a7618d1feb84a9feaa13dc) --- source3/lib/messages.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 7a0343b249..c30c389d49 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -120,9 +120,9 @@ static TDB_DATA message_key_pid(pid_t pid) TDB_DATA kbuf; slprintf(key, sizeof(key), "PID/%d", (int)pid); - + kbuf.dptr = (char *)key; - kbuf.dsize = sizeof(key); + kbuf.dsize = strlen(key)+1; return kbuf; } -- cgit From 7e4c4721b4fbfa71ce6712ec5b9f3e8e8a105147 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 6 Dec 2000 00:05:15 +0000 Subject: Changed to sourceforge tdb code. This includes spinlocks (so we now have a --with-spinlocks option to configure, this does mean the on-disk tdb format has changed, so 2.2alphaX sites will need to re-create their tdb's. The upside is no more tdb fragmentation and a +5% on netbench. Swings and roundabouts.... Jeremy. (This used to be commit 9dea7b7c257db487f8ced7dad3fce92fba03ea91) --- source3/lib/messages.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index c30c389d49..e5aafcb646 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -174,7 +174,7 @@ BOOL message_send_pid(pid_t pid, int msg_type, void *buf, size_t len, BOOL dupli kbuf = message_key_pid(pid); /* lock the record for the destination */ - tdb_lockchain(tdb, kbuf); + tdb_chainlock(tdb, kbuf); dbuf = tdb_fetch(tdb, kbuf); @@ -208,7 +208,7 @@ BOOL message_send_pid(pid_t pid, int msg_type, void *buf, size_t len, BOOL dupli if (!len || (len && !memcmp( ptr + sizeof(rec), (char *)buf, len))) { DEBUG(10,("message_send_pid: discarding duplicate message.\n")); free(dbuf.dptr); - tdb_unlockchain(tdb, kbuf); + tdb_chainunlock(tdb, kbuf); return True; } } @@ -232,11 +232,11 @@ BOOL message_send_pid(pid_t pid, int msg_type, void *buf, size_t len, BOOL dupli free(dbuf.dptr); ok: - tdb_unlockchain(tdb, kbuf); + tdb_chainunlock(tdb, kbuf); return message_notify(pid); failed: - tdb_unlockchain(tdb, kbuf); + tdb_chainunlock(tdb, kbuf); return False; } @@ -253,7 +253,7 @@ static BOOL message_recv(int *msg_type, pid_t *src, void **buf, size_t *len) kbuf = message_key_pid(sys_getpid()); - tdb_lockchain(tdb, kbuf); + tdb_chainlock(tdb, kbuf); dbuf = tdb_fetch(tdb, kbuf); if (dbuf.dptr == NULL || dbuf.dsize == 0) goto failed; @@ -288,11 +288,11 @@ static BOOL message_recv(int *msg_type, pid_t *src, void **buf, size_t *len) tdb_store(tdb, kbuf, dbuf, TDB_REPLACE); free(dbuf.dptr); - tdb_unlockchain(tdb, kbuf); + tdb_chainunlock(tdb, kbuf); return True; failed: - tdb_unlockchain(tdb, kbuf); + tdb_chainunlock(tdb, kbuf); return False; } -- cgit From 369f5fd1d7a6e6298bc3cbe01e3aaed0106f6cf4 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 15 Dec 2000 01:02:11 +0000 Subject: Fixed memory leaks in lsa_XX calls. Fixed memory leaks in smbcacls. Merged in fixes from appliance-head and 2.2. Fixed multiple connection.tdb open problem. Jeremy. (This used to be commit 0a40bc83e14c69a09948ec09bb6fc5026c4f4c14) --- source3/lib/messages.c | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index e5aafcb646..d46ad74553 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -384,22 +384,13 @@ 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, BOOL duplicates_allowed) +BOOL message_send_all(TDB_CONTEXT *conn_tdb, int msg_type, void *buf, size_t len, BOOL duplicates_allowed) { - TDB_CONTEXT *the_tdb; - - the_tdb = tdb_open(lock_path("connections.tdb"), 0, 0, O_RDONLY, 0); - if (!the_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; msg_all.duplicates = duplicates_allowed; - tdb_traverse(the_tdb, traverse_fn, NULL); - tdb_close(the_tdb); + tdb_traverse(conn_tdb, traverse_fn, NULL); return True; } -- cgit From a4763f59382a66a2ad45ce6ba88fe03faca18714 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 11 Jan 2001 19:22:08 +0000 Subject: Fix from John for growing messages.tdb. Jeremy. (This used to be commit 6dc83a8c665dd6774ce597cf7269ad4d8c5380cf) --- source3/lib/messages.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index d46ad74553..bc6f209938 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -161,6 +161,7 @@ BOOL message_send_pid(pid_t pid, int msg_type, void *buf, size_t len, BOOL dupli */ if (!process_exists(pid)) { + tdb_delete(tdb, message_key_pid(pid)); DEBUG(2,("message_send_pid: pid %d doesn't exist\n", (int)pid)); return False; } -- cgit From 3380ffae9c231a34406dd694c9ab03bb0b6d8070 Mon Sep 17 00:00:00 2001 From: David O'Neill Date: Thu, 11 Jan 2001 20:41:19 +0000 Subject: Changes from APPLIANCE_HEAD: testsuite/printing/psec.c - Use lock directory from smb.conf parameter when peeking at the ntdrivers.tdb file. source/rpc_parse/parse_sec.c - fix typo in debug message source/script/installbin.sh - create private directory as part of 'make install'. source/nsswitch/winbindd_cache.c source/nsswitch/winbindd_idmap.c source/passdb/secrets.c source/smbd/connection.c - always convert tdb key to unix code-page when generating. source/printing/nt_printing.c - always convert tdb key to unix code-page when generating. - don't prepend path to a filename that is NULL in add_a_printer_driver_3(). source/rpc_server/srv_spoolss_nt.c - always convert tdb key to unix code-page when generating. - don't prepend server name to a path/filename that is NULL in the fill_printer_driver_info functions. source/printing/printing.c - always convert tdb key to unix code-page when generating. - move access check for print_queue_purge() outside of job delete loop. source/smbd/unix_acls.c - fix for setting ACLs (this got missed earlier) source/lib/messages.c - trivial sync with appliance_head (This used to be commit 376601d17d53ef7bfaafa576bd770e554516e808) --- source3/lib/messages.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index bc6f209938..94c04cfa8e 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -161,8 +161,8 @@ BOOL message_send_pid(pid_t pid, int msg_type, void *buf, size_t len, BOOL dupli */ if (!process_exists(pid)) { - tdb_delete(tdb, message_key_pid(pid)); DEBUG(2,("message_send_pid: pid %d doesn't exist\n", (int)pid)); + tdb_delete(tdb, message_key_pid(pid)); return False; } -- cgit From fc06a034e88ebdd0b271078b26e607eca70fcdb0 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 15 Jan 2001 01:47:00 +0000 Subject: removed unnecessary process_exists() call in message_send_pid() it slows us down and doesn't gain anything (This used to be commit 30fb31a3ab05ab6bb6c89cb457e2216e34b963e6) --- source3/lib/messages.c | 11 ----------- 1 file changed, 11 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 94c04cfa8e..661a1ab0ef 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -155,17 +155,6 @@ BOOL message_send_pid(pid_t pid, int msg_type, void *buf, size_t len, BOOL dupli struct message_rec rec; void *p; - /* - * Do an early check for process exists - saves adding into a tdb - * and deleting again if the target is not present. JRA. - */ - - if (!process_exists(pid)) { - DEBUG(2,("message_send_pid: pid %d doesn't exist\n", (int)pid)); - tdb_delete(tdb, message_key_pid(pid)); - return False; - } - rec.msg_version = MESSAGE_VERSION; rec.msg_type = msg_type; rec.dest = pid; -- cgit From eee29958f5cacc753f3fa324327e0d8b14ac3006 Mon Sep 17 00:00:00 2001 From: David O'Neill Date: Tue, 23 Jan 2001 20:25:25 +0000 Subject: Changes from APPLIANCE_HEAD: source/rpc_server/srv_spoolss_nt.c - add an access check to _spoolss_deleteprinter() to stop random users and passers by from deleting printers. source/lib/messages.c - converted global msg_all struct to a local in message_send_all() function. source/include/smb.h - added a success error code to the spoolss return codes. source/include/proto.h source/param/loadparm.c source/printing/printing.c - Added new parameter "total print jobs" to limit the total number of print jobs across all queues. Currently individual queues are limited by "max print jobs". (This used to be commit 02f154e729b0e8465d3e1e2ac794e6ab3844ce57) --- source3/lib/messages.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 661a1ab0ef..f0e75d430a 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -348,12 +348,12 @@ void message_deregister(int msg_type) } } -static struct { +struct msg_all { int msg_type; void *buf; size_t len; BOOL duplicates; -} msg_all; +}; /**************************************************************************** send one of the messages for the broadcast @@ -361,11 +361,12 @@ send one of the messages for the broadcast static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void *state) { struct connections_data crec; + struct msg_all *msg_all = (struct msg_all *)state; memcpy(&crec, dbuf.dptr, sizeof(crec)); if (crec.cnum != -1) return 0; - message_send_pid(crec.pid, msg_all.msg_type, msg_all.buf, msg_all.len, msg_all.duplicates); + message_send_pid(crec.pid, msg_all->msg_type, msg_all->buf, msg_all->len, msg_all->duplicates); return 0; } @@ -376,11 +377,13 @@ use it. When we need efficient broadcast we can add it. ****************************************************************************/ BOOL message_send_all(TDB_CONTEXT *conn_tdb, int msg_type, void *buf, size_t len, BOOL duplicates_allowed) { + struct msg_all msg_all; + msg_all.msg_type = msg_type; msg_all.buf = buf; msg_all.len = len; msg_all.duplicates = duplicates_allowed; - tdb_traverse(conn_tdb, traverse_fn, NULL); + tdb_traverse(conn_tdb, traverse_fn, &msg_all); return True; } -- cgit From 01d45db46b5e9ad4e6b9c9552c74c655eeafa78b Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Sat, 3 Feb 2001 17:19:10 +0000 Subject: Merge from 2.2 - with connection fix. Jeremy. (This used to be commit 8d3601c1366b5f0a9f5772e9797ff54a2250dbfd) --- source3/lib/messages.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index f0e75d430a..6f6d99c8ec 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -223,10 +223,12 @@ BOOL message_send_pid(pid_t pid, int msg_type, void *buf, size_t len, BOOL dupli ok: tdb_chainunlock(tdb, kbuf); + errno = 0; /* paranoia */ return message_notify(pid); failed: tdb_chainunlock(tdb, kbuf); + errno = 0; /* paranoia */ return False; } @@ -366,7 +368,19 @@ static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void memcpy(&crec, dbuf.dptr, sizeof(crec)); if (crec.cnum != -1) return 0; - message_send_pid(crec.pid, msg_all->msg_type, msg_all->buf, msg_all->len, msg_all->duplicates); + + /* 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.*/ + if (!message_send_pid(crec.pid, msg_all->msg_type, msg_all->buf, msg_all->len, + msg_all->duplicates)) { + + /* if the pid was not found delete the entry from connections.tdb */ + if (errno == ESRCH) { + DEBUG(2,("pid %d doesn't exist - deleting connections %d [%s]\n", + crec.pid, crec.cnum, crec.name)); + tdb_delete(the_tdb, kbuf); + } + } return 0; } -- cgit From 94fc44a93c46cece9b9fa947bff62087dbcd89fa Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Mon, 12 Feb 2001 16:18:02 +0000 Subject: Merge of JohnR's changes to appliance-head, JF's changes to 2.2, updated the POSIX_ACL code to be in sync. Jeremy. (This used to be commit c0517d6f4e3079feca1309fd1ea7b21e83f0de02) --- source3/lib/messages.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 6f6d99c8ec..19496bd426 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -73,7 +73,6 @@ void ping_message(int msg_type, pid_t src, void *buf, size_t len) DEBUG(1,("INFO: Received PING message from PID %d\n",src)); message_send_pid(src, MSG_PONG, buf, len, True); } - /**************************************************************************** return current debug level ****************************************************************************/ @@ -83,7 +82,7 @@ void debuglevel_message(int msg_type, pid_t src, void *buf, size_t len) DEBUG(1,("INFO: Received REQ_DEBUGLEVEL message from PID %d\n",src)); level = DEBUGLEVEL; - message_send_pid(src, MSG_DEBUGLEVEL, &level, sizeof(int), True); + message_send_pid(src, MSG_DEBUGLEVEL, DEBUGLEVEL_CLASS, sizeof(DEBUGLEVEL_CLASS), True); } /**************************************************************************** -- cgit From da3053048c3d224a20d6383ac6682d31059cd46c Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Sun, 11 Mar 2001 00:32:10 +0000 Subject: Merge of new 2.2 code into HEAD (Gerald I hate you :-) :-). Allows new SAMR RPC code to merge with new passdb code. Currently rpcclient doesn't compile. I'm working on it... Jeremy. (This used to be commit 0be41d5158ea4e645e93e8cd30617c038416e549) --- source3/lib/messages.c | 3 --- 1 file changed, 3 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 19496bd426..ab02d1253b 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -78,10 +78,7 @@ return current debug level ****************************************************************************/ void debuglevel_message(int msg_type, pid_t src, void *buf, size_t len) { - int level; - DEBUG(1,("INFO: Received REQ_DEBUGLEVEL message from PID %d\n",src)); - level = DEBUGLEVEL; message_send_pid(src, MSG_DEBUGLEVEL, DEBUGLEVEL_CLASS, sizeof(DEBUGLEVEL_CLASS), True); } -- cgit From f9a15ce1a69f905e94db7650f0a4805720cd9c88 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Sun, 8 Apr 2001 20:22:39 +0000 Subject: Got "medieval on our ass" about adding the -1 to slprintf. Jeremy. (This used to be commit 94747b4639ed9b19f7d0fb896e43aa392a84989a) --- source3/lib/messages.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index ab02d1253b..5591f141cc 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -115,7 +115,7 @@ static TDB_DATA message_key_pid(pid_t pid) static char key[20]; TDB_DATA kbuf; - slprintf(key, sizeof(key), "PID/%d", (int)pid); + slprintf(key, sizeof(key)-1, "PID/%d", (int)pid); kbuf.dptr = (char *)key; kbuf.dsize = strlen(key)+1; -- cgit From c11887e3257c8dfe650f5004106a43a891ab4b31 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 27 Apr 2001 22:17:10 +0000 Subject: More debug %d -> %u issues. Jeremy. (This used to be commit 6fcb600dcd23c61d1a7d2ce8c2b7b2eea2e58623) --- source3/lib/messages.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 5591f141cc..3b45a9c305 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -70,7 +70,7 @@ a useful function for testing the message system ****************************************************************************/ void ping_message(int msg_type, pid_t src, void *buf, size_t len) { - DEBUG(1,("INFO: Received PING message from PID %d\n",src)); + DEBUG(1,("INFO: Received PING message from PID %u\n",(unsigned int)src)); message_send_pid(src, MSG_PONG, buf, len, True); } /**************************************************************************** @@ -78,7 +78,7 @@ return current debug level ****************************************************************************/ void debuglevel_message(int msg_type, pid_t src, void *buf, size_t len) { - DEBUG(1,("INFO: Received REQ_DEBUGLEVEL message from PID %d\n",src)); + DEBUG(1,("INFO: Received REQ_DEBUGLEVEL message from PID %u\n",(unsigned int)src)); message_send_pid(src, MSG_DEBUGLEVEL, DEBUGLEVEL_CLASS, sizeof(DEBUGLEVEL_CLASS), True); } @@ -372,8 +372,8 @@ static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void /* if the pid was not found delete the entry from connections.tdb */ if (errno == ESRCH) { - DEBUG(2,("pid %d doesn't exist - deleting connections %d [%s]\n", - crec.pid, crec.cnum, crec.name)); + DEBUG(2,("pid %u doesn't exist - deleting connections %d [%s]\n", + (unsigned int)crec.pid, crec.cnum, crec.name)); tdb_delete(the_tdb, kbuf); } } -- cgit From 10211f53f9fa9e21a6ededf892b8be27bad9643e Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 15 May 2001 18:12:02 +0000 Subject: Check sizes of data entries in connections.tdb before deciding they're crecs... We will need this when we use finer grained locking for max connections. Jeremy. (This used to be commit c6cd42a6791e26174eb795fd08ddbbd797e5a9cf) --- source3/lib/messages.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 3b45a9c305..b18cebf6cf 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -361,9 +361,13 @@ static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void struct connections_data crec; struct msg_all *msg_all = (struct msg_all *)state; + if (dbuf.dsize != sizeof(crec)) + return 0; + memcpy(&crec, dbuf.dptr, sizeof(crec)); - if (crec.cnum != -1) return 0; + if (crec.cnum != -1) + 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.*/ -- cgit From 05fc3e578c895f632b351969d09cd00feb7599c7 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 4 Jun 2001 05:13:59 +0000 Subject: use LDSHFLAGS not -shared in several places (This used to be commit 8ec9c87b5d1a7dae17d5b1a30f58effaf5e69e4b) --- source3/lib/messages.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index b18cebf6cf..ffa873960e 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -89,7 +89,7 @@ BOOL message_init(void) { if (tdb) return True; - tdb = tdb_open(lock_path("messages.tdb"), + tdb = tdb_open_log(lock_path("messages.tdb"), 0, TDB_CLEAR_IF_FIRST, O_RDWR|O_CREAT,0600); -- cgit From 996719cce26700c68ff0e456e6a25d20085d091f Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Mon, 30 Jul 2001 22:21:31 +0000 Subject: Added "use mmap" for HPUX. Jeremy. (This used to be commit 840802f10677cb0009cb4df4c37c7d01aa5edacd) --- source3/lib/messages.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index ffa873960e..78cd3e22bc 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -90,7 +90,7 @@ BOOL message_init(void) if (tdb) return True; tdb = tdb_open_log(lock_path("messages.tdb"), - 0, TDB_CLEAR_IF_FIRST, + 0, TDB_CLEAR_IF_FIRST|USE_TDB_MMAP_FLAG, O_RDWR|O_CREAT,0600); if (!tdb) { -- cgit From e485a1a4986c9328754b9a8b3054b8a6738b54f0 Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Sun, 5 Aug 2001 10:10:16 +0000 Subject: Some fixes about malloc/Realloc and mem leak thanks to andreas moroder (This used to be commit b29a549cdd85d42a1697041ab04f0ae4eddd23ca) --- source3/lib/messages.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 78cd3e22bc..54f6321041 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -322,12 +322,19 @@ void message_register(int msg_type, dfn = (struct dispatch_fns *)malloc(sizeof(*dfn)); - ZERO_STRUCTP(dfn); + if (dfn != NULL) { - dfn->msg_type = msg_type; - dfn->fn = fn; + ZERO_STRUCTPN(dfn); - DLIST_ADD(dispatch_fns, dfn); + dfn->msg_type = msg_type; + dfn->fn = fn; + + DLIST_ADD(dispatch_fns, dfn); + } + else { + + DEBUG(0,("message_register: Not enough memory. malloc failed!\n")); + } } /**************************************************************************** -- cgit From 9a9ac2739bbdc993ecdfa78298bdd9c059328378 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 6 Sep 2001 22:08:19 +0000 Subject: got rid of USE_TDB_MMAP_FLAG as its not needed any more (This used to be commit c26e0d3f27a05ecc8bd2390f9aab7f9451524e47) --- source3/lib/messages.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 54f6321041..18f9d0c1d5 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -90,7 +90,7 @@ BOOL message_init(void) if (tdb) return True; tdb = tdb_open_log(lock_path("messages.tdb"), - 0, TDB_CLEAR_IF_FIRST|USE_TDB_MMAP_FLAG, + 0, TDB_CLEAR_IF_FIRST|TDB_DEFAULT, O_RDWR|O_CREAT,0600); if (!tdb) { -- cgit From 484a7c0341fe033fe26fe1e6b597ed1c456c39d4 Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Mon, 17 Sep 2001 02:19:44 +0000 Subject: move to SAFE_FREE() (This used to be commit 60e907b7e8e1c008463a88ed2b076344278986ef) --- source3/lib/messages.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 18f9d0c1d5..5e7072c2b4 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -175,7 +175,7 @@ BOOL message_send_pid(pid_t pid, int msg_type, void *buf, size_t len, BOOL dupli dbuf.dptr = p; dbuf.dsize = len + sizeof(rec); tdb_store(tdb, kbuf, dbuf, TDB_REPLACE); - free(p); + SAFE_FREE(p); goto ok; } @@ -193,7 +193,7 @@ BOOL message_send_pid(pid_t pid, int msg_type, void *buf, size_t len, BOOL dupli if (!memcmp(ptr, &rec, sizeof(rec))) { if (!len || (len && !memcmp( ptr + sizeof(rec), (char *)buf, len))) { DEBUG(10,("message_send_pid: discarding duplicate message.\n")); - free(dbuf.dptr); + SAFE_FREE(dbuf.dptr); tdb_chainunlock(tdb, kbuf); return True; } @@ -211,11 +211,11 @@ BOOL message_send_pid(pid_t pid, int msg_type, void *buf, size_t len, BOOL dupli memcpy((void *)((char*)p+dbuf.dsize), &rec, sizeof(rec)); if (len > 0) memcpy((void *)((char*)p+dbuf.dsize+sizeof(rec)), buf, len); - free(dbuf.dptr); + SAFE_FREE(dbuf.dptr); dbuf.dptr = p; dbuf.dsize += len + sizeof(rec); tdb_store(tdb, kbuf, dbuf, TDB_REPLACE); - free(dbuf.dptr); + SAFE_FREE(dbuf.dptr); ok: tdb_chainunlock(tdb, kbuf); @@ -275,7 +275,7 @@ static BOOL message_recv(int *msg_type, pid_t *src, void **buf, size_t *len) else tdb_store(tdb, kbuf, dbuf, TDB_REPLACE); - free(dbuf.dptr); + SAFE_FREE(dbuf.dptr); tdb_chainunlock(tdb, kbuf); return True; @@ -307,7 +307,7 @@ void message_dispatch(void) dfn->fn(msg_type, src, buf, len); } } - if (buf) free(buf); + SAFE_FREE(buf); } } @@ -348,7 +348,7 @@ void message_deregister(int msg_type) next = dfn->next; if (dfn->msg_type == msg_type) { DLIST_REMOVE(dispatch_fns, dfn); - free(dfn); + SAFE_FREE(dfn); } } } -- cgit From 008ba27b2884a5553f4c28a2c9c7ae584b61c3a4 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 25 Sep 2001 00:50:37 +0000 Subject: Fixed enumeration of large numbers of groups from a Samba DC. Tidied up debug messages in lib/messages.c Jeremy. (This used to be commit dfb58f227609d6c8a255677b85ec853efa19f602) --- source3/lib/messages.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 5e7072c2b4..8a696e0c26 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -298,12 +298,16 @@ void message_dispatch(void) size_t len; struct dispatch_fns *dfn; - if (!received_signal) return; + if (!received_signal) + return; + + DEBUG(10,("message_dispatch: received_signal = %d\n", received_signal)); received_signal = 0; while (message_recv(&msg_type, &src, &buf, &len)) { 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, buf, len); } } -- cgit From d325611842beb1b1a4448df9eca42430b27dec24 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 20 Nov 2001 22:55:46 +0000 Subject: Merged in JohnR's ping messaging extension. Jeremy. (This used to be commit 694372b2c4d7713fe228114730027175f7b4e9b6) --- source3/lib/messages.c | 63 ++++++++++++++++++++++++++++---------------------- 1 file changed, 36 insertions(+), 27 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 8a696e0c26..b4fd82139e 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -57,8 +57,9 @@ static struct dispatch_fns { } *dispatch_fns; /**************************************************************************** -notifications come in as signals + Notifications come in as signals. ****************************************************************************/ + static void sig_usr1(void) { received_signal = 1; @@ -66,16 +67,20 @@ static void sig_usr1(void) } /**************************************************************************** -a useful function for testing the message system + A useful function for testing the message system. ****************************************************************************/ + void ping_message(int msg_type, pid_t src, void *buf, size_t len) { - DEBUG(1,("INFO: Received PING message from PID %u\n",(unsigned int)src)); + char *msg = buf ? buf : "none"; + DEBUG(1,("INFO: Received PING message from PID %u [%s]\n",(unsigned int)src, msg)); message_send_pid(src, MSG_PONG, buf, len, True); } + /**************************************************************************** -return current debug level + Return current debug level. ****************************************************************************/ + void debuglevel_message(int msg_type, pid_t src, void *buf, size_t len) { DEBUG(1,("INFO: Received REQ_DEBUGLEVEL message from PID %u\n",(unsigned int)src)); @@ -85,12 +90,13 @@ void debuglevel_message(int msg_type, pid_t src, void *buf, size_t len) /**************************************************************************** Initialise the messaging functions. ****************************************************************************/ + BOOL message_init(void) { if (tdb) return True; tdb = tdb_open_log(lock_path("messages.tdb"), - 0, TDB_CLEAR_IF_FIRST|TDB_DEFAULT, + 0, TDB_CLEAR_IF_FIRST|TDB_DEFAULT, O_RDWR|O_CREAT,0600); if (!tdb) { @@ -106,10 +112,10 @@ BOOL message_init(void) return True; } - /******************************************************************* - form a static tdb key from a pid + Form a static tdb key from a pid. ******************************************************************/ + static TDB_DATA message_key_pid(pid_t pid) { static char key[20]; @@ -122,11 +128,11 @@ static TDB_DATA message_key_pid(pid_t pid) return kbuf; } - /**************************************************************************** -notify a process that it has a message. If the process doesn't exist -then delete its record in the database + Notify a process that it has a message. If the process doesn't exist + then delete its record in the database. ****************************************************************************/ + static BOOL message_notify(pid_t pid) { if (kill(pid, SIGUSR1) == -1) { @@ -142,8 +148,9 @@ static BOOL message_notify(pid_t pid) } /**************************************************************************** -send a message to a particular pid + Send a message to a particular pid. ****************************************************************************/ + BOOL message_send_pid(pid_t pid, int msg_type, void *buf, size_t len, BOOL duplicates_allowed) { TDB_DATA kbuf; @@ -228,11 +235,10 @@ BOOL message_send_pid(pid_t pid, int msg_type, void *buf, size_t len, BOOL dupli return False; } - - /**************************************************************************** -retrieve the next message for the current process + Retrieve the next message for the current process. ****************************************************************************/ + static BOOL message_recv(int *msg_type, pid_t *src, void **buf, size_t *len) { TDB_DATA kbuf; @@ -284,12 +290,12 @@ static BOOL message_recv(int *msg_type, pid_t *src, void **buf, size_t *len) return False; } - /**************************************************************************** -receive and dispatch any messages pending for this process -notice that all dispatch handlers for a particular msg_type get called, -so you can register multiple handlers for a message + Receive and dispatch any messages pending for this process. + Notice that all dispatch handlers for a particular msg_type get called, + so you can register multiple handlers for a message. ****************************************************************************/ + void message_dispatch(void) { int msg_type; @@ -298,10 +304,10 @@ void message_dispatch(void) size_t len; struct dispatch_fns *dfn; - if (!received_signal) - return; + if (!received_signal) return; DEBUG(10,("message_dispatch: received_signal = %d\n", received_signal)); + received_signal = 0; while (message_recv(&msg_type, &src, &buf, &len)) { @@ -315,10 +321,10 @@ void message_dispatch(void) } } - /**************************************************************************** -register a dispatch function for a particular message type + Register a dispatch function for a particular message type. ****************************************************************************/ + void message_register(int msg_type, void (*fn)(int msg_type, pid_t pid, void *buf, size_t len)) { @@ -342,8 +348,9 @@ void message_register(int msg_type, } /**************************************************************************** -de-register the function for a particular message type + De-register the function for a particular message type. ****************************************************************************/ + void message_deregister(int msg_type) { struct dispatch_fns *dfn, *next; @@ -365,8 +372,9 @@ struct msg_all { }; /**************************************************************************** -send one of the messages for the broadcast + Send one of the messages for the broadcast. ****************************************************************************/ + static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void *state) { struct connections_data crec; @@ -396,10 +404,11 @@ static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void } /**************************************************************************** -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. + 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(TDB_CONTEXT *conn_tdb, int msg_type, void *buf, size_t len, BOOL duplicates_allowed) { struct msg_all msg_all; -- cgit From ec781f8e842c6fbe7ce2aab1d71716bccf26f690 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Wed, 19 Dec 2001 07:49:25 +0000 Subject: Doc how to reply to messages. (This used to be commit e2b080587c4d6e147cf7274fa7e09e89ae2083c3) --- source3/lib/messages.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index b4fd82139e..f63e2c4766 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -19,13 +19,20 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* this module is used for internal messaging between Samba daemons. +/** + @file messages.c + + This module is used for internal messaging between Samba daemons. The idea is that if a part of Samba wants to do communication with another Samba process then it will do a message_register() of a dispatch function, and use message_send_pid() to send messages to that process. + The dispatch function is given the pid of the sender, and it can + use that to reply by message_send_pid(). See ping_message() for a + simple example. + This system doesn't have any inherent size limitations but is not very efficient for large messages or when messages are sent in very quick succession. -- cgit From bf65820af242786bd66d814fc3e9d89920a49f8e Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Fri, 21 Dec 2001 00:37:49 +0000 Subject: Add an output parameter to message_send_all that says how many messages were sent, so you know how many replies to expect. Const and doc religion. (This used to be commit 22e510ea0d69356be4fd2fa5ad9e9f4e84f62337) --- source3/lib/messages.c | 45 +++++++++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 12 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index f63e2c4766..923005de71 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -3,6 +3,7 @@ Version 3.0 Samba internal messaging functions Copyright (C) Andrew Tridgell 2000 + Copyright (C) 2001 by Martin Pool 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 @@ -20,6 +21,8 @@ */ /** + @defgroups messages Internal messaging framework + @{ @file messages.c This module is used for internal messaging between Samba daemons. @@ -158,7 +161,8 @@ static BOOL message_notify(pid_t pid) Send a message to a particular pid. ****************************************************************************/ -BOOL message_send_pid(pid_t pid, int msg_type, void *buf, size_t len, BOOL duplicates_allowed) +BOOL message_send_pid(pid_t pid, int msg_type, const void *buf, size_t len, + BOOL duplicates_allowed) { TDB_DATA kbuf; TDB_DATA dbuf; @@ -205,7 +209,7 @@ BOOL message_send_pid(pid_t pid, int msg_type, void *buf, size_t len, BOOL dupli */ if (!memcmp(ptr, &rec, sizeof(rec))) { - if (!len || (len && !memcmp( ptr + sizeof(rec), (char *)buf, len))) { + if (!len || (len && !memcmp( ptr + sizeof(rec), buf, len))) { DEBUG(10,("message_send_pid: discarding duplicate message.\n")); SAFE_FREE(dbuf.dptr); tdb_chainunlock(tdb, kbuf); @@ -373,9 +377,10 @@ void message_deregister(int msg_type) struct msg_all { int msg_type; - void *buf; + const void *buf; size_t len; BOOL duplicates; + int n_sent; }; /**************************************************************************** @@ -397,8 +402,9 @@ static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void /* 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.*/ - if (!message_send_pid(crec.pid, msg_all->msg_type, msg_all->buf, msg_all->len, - msg_all->duplicates)) { + if (!message_send_pid(crec.pid, msg_all->msg_type, + msg_all->buf, msg_all->len, + msg_all->duplicates)) { /* if the pid was not found delete the entry from connections.tdb */ if (errno == ESRCH) { @@ -407,16 +413,26 @@ static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void tdb_delete(the_tdb, kbuf); } } + msg_all->n_sent++; 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(TDB_CONTEXT *conn_tdb, int msg_type, void *buf, size_t len, BOOL duplicates_allowed) +/** + * Send a message 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. + * + * @param n_sent Set to the number of messages sent. This should be + * equal to the number of processes, but be careful for races. + * + * @return True for success. + **/ +BOOL message_send_all(TDB_CONTEXT *conn_tdb, int msg_type, + const void *buf, size_t len, + BOOL duplicates_allowed, + int *n_sent) { struct msg_all msg_all; @@ -424,7 +440,12 @@ BOOL message_send_all(TDB_CONTEXT *conn_tdb, int msg_type, void *buf, size_t len msg_all.buf = buf; msg_all.len = len; msg_all.duplicates = duplicates_allowed; + msg_all.n_sent = 0; tdb_traverse(conn_tdb, traverse_fn, &msg_all); + if (n_sent) + *n_sent = msg_all.n_sent; return True; } + +/** @} **/ -- cgit From 07a6e0d311edacbc560e7b54ca9325df9295300b Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Thu, 3 Jan 2002 03:35:02 +0000 Subject: debug output on receipt of message. (This used to be commit 6bd5b7ce8ec54faefcf129fcc98cc4440bb355d6) --- source3/lib/messages.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 923005de71..5561127410 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -322,6 +322,8 @@ void message_dispatch(void) received_signal = 0; while (message_recv(&msg_type, &src, &buf, &len)) { + DEBUG(10,("message_dispatch: received msg_type=%d src_pid=%d\n", + msg_type, (int) src)); 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)); -- cgit From 1a09c706fc09952c6c58e9a88a62d208b61903c5 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Thu, 3 Jan 2002 03:42:33 +0000 Subject: If we receive a message that is not handled then emit a gentle warning to the log. (This used to be commit 53dd8b45397f5de7660594b9287341f8f4c91c43) --- source3/lib/messages.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 5561127410..cd7eb8b82f 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -314,6 +314,7 @@ void message_dispatch(void) void *buf; size_t len; struct dispatch_fns *dfn; + int n_handled; if (!received_signal) return; @@ -324,12 +325,19 @@ void message_dispatch(void) while (message_recv(&msg_type, &src, &buf, &len)) { DEBUG(10,("message_dispatch: received msg_type=%d src_pid=%d\n", msg_type, (int) 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, buf, len); + n_handled++; } } + if (!n_handled) { + DEBUG(5,("message_dispatch: warning: no handlers registed for " + "msg_type %d in pid%d\n", + msg_type, getpid())); + } SAFE_FREE(buf); } } -- cgit From cd68afe31256ad60748b34f7318a180cfc2127cc Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Wed, 30 Jan 2002 06:08:46 +0000 Subject: Removed version number from file header. Changed "SMB/Netbios" to "SMB/CIFS" in file header. (This used to be commit 6a58c9bd06d0d7502a24bf5ce5a2faf0a146edfa) --- source3/lib/messages.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index cd7eb8b82f..096452784a 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -1,6 +1,5 @@ /* - Unix SMB/Netbios implementation. - Version 3.0 + Unix SMB/CIFS implementation. Samba internal messaging functions Copyright (C) Andrew Tridgell 2000 Copyright (C) 2001 by Martin Pool -- cgit From c2729d59a631822c7e5545d13a2eff8ed237401b Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 18 Feb 2002 11:07:57 +0000 Subject: serialise all domain auth requests this is needed because W2K will send a TCP reset to any open connections that have not done a negprot when a second connection is made. This meant that under heavy netlogon load a Samba domain member would fail authentications. Jeremy, you may wish to port this to 2.2.x (This used to be commit eb196070e62b45b113e5712f27198c50c5c95657) --- source3/lib/messages.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 096452784a..7ce050d70d 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -458,3 +458,33 @@ BOOL message_send_all(TDB_CONTEXT *conn_tdb, int msg_type, } /** @} **/ + + +/* + lock the messaging tdb based on a string - this is used as a primitive form of mutex + between smbd instances. +*/ +BOOL message_named_mutex(const char *name) +{ + TDB_DATA key; + + if (!message_init()) return False; + + key.dptr = name; + key.dsize = strlen(name)+1; + + return (tdb_chainlock(tdb, key) == 0); +} + +/* + unlock a named mutex +*/ +void message_named_mutex_release(const char *name) +{ + TDB_DATA key; + + key.dptr = name; + key.dsize = strlen(name)+1; + + tdb_chainunlock(tdb, key); +} -- cgit From d0f80d2c41d115e3f62eca06a44c92c01ece6154 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Sat, 9 Mar 2002 09:48:35 +0000 Subject: Doc. (This used to be commit b9ab79f30a931c694b1c181b1c2abd38186692ae) --- source3/lib/messages.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 7ce050d70d..5974c5a872 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -457,13 +457,13 @@ BOOL message_send_all(TDB_CONTEXT *conn_tdb, int msg_type, return True; } -/** @} **/ - +/** + * Lock the messaging tdb based on a string - this is used as a primitive + * form of mutex between smbd instances. + * + * @param name A string identifying the name of the mutex. + */ -/* - lock the messaging tdb based on a string - this is used as a primitive form of mutex - between smbd instances. -*/ BOOL message_named_mutex(const char *name) { TDB_DATA key; @@ -476,9 +476,12 @@ BOOL message_named_mutex(const char *name) return (tdb_chainlock(tdb, key) == 0); } -/* - unlock a named mutex -*/ +/** + * Unlock a named mutex. + * + * @param name A string identifying the name of the mutex. + */ + void message_named_mutex_release(const char *name) { TDB_DATA key; @@ -488,3 +491,5 @@ void message_named_mutex_release(const char *name) tdb_chainunlock(tdb, key); } + +/** @} **/ -- cgit From 57bd576445e42a55887c41d270f2230f5136b873 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Thu, 14 Mar 2002 01:53:04 +0000 Subject: getpid() -> sys_getpid() (This used to be commit a3cea5e9ae3b53ecbc45e61a39cbce0ca1b916aa) --- source3/lib/messages.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 5974c5a872..642caafac4 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -335,7 +335,7 @@ void message_dispatch(void) if (!n_handled) { DEBUG(5,("message_dispatch: warning: no handlers registed for " "msg_type %d in pid%d\n", - msg_type, getpid())); + msg_type, sys_getpid())); } SAFE_FREE(buf); } -- cgit From 75722fa183d1678bc7360bc79f9ac8cf17cd62e3 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Wed, 20 Mar 2002 06:57:03 +0000 Subject: Add assertions that kill() is never accidentally passed a non-positive pid. This follows a bug in rsync where it would accidentally kill(-1), removing all the user's processes. I can't see any way this would directly happen in Samba, but having the assertions seems beneficial. http://cvs.samba.org/cgi-bin/cvsweb/rsync/util.c.diff?r1=1.108&r2=1.109&f=h (This used to be commit 098905bea29c7d5b886809d431294ddf2fc1e152) --- source3/lib/messages.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 642caafac4..b745cbaf8b 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -144,6 +144,9 @@ static TDB_DATA message_key_pid(pid_t pid) static BOOL message_notify(pid_t pid) { + /* Doing kill with a non-positive pid causes messages to be + * sent to places we don't want. */ + SMB_ASSERT(pid > 0); if (kill(pid, SIGUSR1) == -1) { if (errno == ESRCH) { DEBUG(2,("pid %d doesn't exist - deleting messages record\n", (int)pid)); @@ -174,6 +177,10 @@ BOOL message_send_pid(pid_t pid, int msg_type, const void *buf, size_t len, rec.src = sys_getpid(); rec.len = len; + /* Doing kill with a non-positive pid causes messages to be + * sent to places we don't want. */ + SMB_ASSERT(pid > 0); + kbuf = message_key_pid(pid); /* lock the record for the destination */ -- cgit From 64d20453d97f08e412a2dc51d8d131d630f63999 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 26 Mar 2002 22:36:27 +0000 Subject: Don't hold the mutex for more than 20 seconds. Jeremy. (This used to be commit 1b9f1a368f2f37700cef357ab4bbc0389ec06378) --- source3/lib/messages.c | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index b745cbaf8b..7d0da4b158 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -464,6 +464,17 @@ BOOL message_send_all(TDB_CONTEXT *conn_tdb, int msg_type, return True; } +static VOLATILE sig_atomic_t gotalarm; + +/*************************************************************** + Signal function to tell us we timed out. +****************************************************************/ + +static void gotalarm_sig(void) +{ + gotalarm = 1; +} + /** * Lock the messaging tdb based on a string - this is used as a primitive * form of mutex between smbd instances. @@ -471,16 +482,33 @@ BOOL message_send_all(TDB_CONTEXT *conn_tdb, int msg_type, * @param name A string identifying the name of the mutex. */ -BOOL message_named_mutex(const char *name) +BOOL message_named_mutex(char *name, unsigned int timeout) { TDB_DATA key; + int ret; - if (!message_init()) return False; + if (!message_init()) + return False; key.dptr = name; key.dsize = strlen(name)+1; - return (tdb_chainlock(tdb, key) == 0); + if (timeout) { + gotalarm = 0; + CatchSignal(SIGALRM, SIGNAL_CAST gotalarm_sig); + alarm(timeout); + } + + ret = tdb_chainlock(tdb, key); + + if (timeout) { + alarm(0); + CatchSignal(SIGALRM, SIGNAL_CAST SIG_IGN); + if (gotalarm) + return False; + } + + return (ret == 0); } /** @@ -489,7 +517,7 @@ BOOL message_named_mutex(const char *name) * @param name A string identifying the name of the mutex. */ -void message_named_mutex_release(const char *name) +void message_named_mutex_release(char *name) { TDB_DATA key; -- cgit From 94c52a00525c55db83d48c0ef76c3eb12de0af2b Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 27 Mar 2002 00:02:49 +0000 Subject: Moved debug messages for grabbing/releasing mutex. Jeremy. (This used to be commit e144c174eafc18f236c848b8f3a2c6382796f5a9) --- source3/lib/messages.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 7d0da4b158..8602c2f32d 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -508,6 +508,9 @@ BOOL message_named_mutex(char *name, unsigned int timeout) return False; } + if (ret == 0) + DEBUG(10,("message_named_mutex: got mutex for %s\n", name )); + return (ret == 0); } @@ -525,6 +528,7 @@ void message_named_mutex_release(char *name) key.dsize = strlen(name)+1; tdb_chainunlock(tdb, key); + DEBUG(10,("message_named_mutex: released mutex for %s\n", name )); } /** @} **/ -- cgit From e90b65284812aaa5ff9e9935ce9bbad7791cbbcd Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 15 Jul 2002 10:35:28 +0000 Subject: updated the 3.0 branch from the head branch - ready for alpha18 (This used to be commit 03ac082dcb375b6f3ca3d810a6a6367542bc23ce) --- source3/lib/messages.c | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 8602c2f32d..e6d2de4a58 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -79,23 +79,13 @@ static void sig_usr1(void) A useful function for testing the message system. ****************************************************************************/ -void ping_message(int msg_type, pid_t src, void *buf, size_t len) +static void ping_message(int msg_type, pid_t src, void *buf, size_t len) { char *msg = buf ? buf : "none"; DEBUG(1,("INFO: Received PING message from PID %u [%s]\n",(unsigned int)src, msg)); message_send_pid(src, MSG_PONG, buf, len, True); } -/**************************************************************************** - Return current debug level. -****************************************************************************/ - -void debuglevel_message(int msg_type, pid_t src, void *buf, size_t len) -{ - DEBUG(1,("INFO: Received REQ_DEBUGLEVEL message from PID %u\n",(unsigned int)src)); - message_send_pid(src, MSG_DEBUGLEVEL, DEBUGLEVEL_CLASS, sizeof(DEBUGLEVEL_CLASS), True); -} - /**************************************************************************** Initialise the messaging functions. ****************************************************************************/ @@ -116,7 +106,6 @@ BOOL message_init(void) CatchSignal(SIGUSR1, SIGNAL_CAST sig_usr1); message_register(MSG_PING, ping_message); - message_register(MSG_REQ_DEBUGLEVEL, debuglevel_message); return True; } @@ -340,8 +329,8 @@ void message_dispatch(void) } } if (!n_handled) { - DEBUG(5,("message_dispatch: warning: no handlers registed for " - "msg_type %d in pid%d\n", + DEBUG(5,("message_dispatch: warning: no handlers registered for " + "msg_type %d in pid %d\n", msg_type, sys_getpid())); } SAFE_FREE(buf); @@ -464,7 +453,7 @@ BOOL message_send_all(TDB_CONTEXT *conn_tdb, int msg_type, return True; } -static VOLATILE sig_atomic_t gotalarm; +static SIG_ATOMIC_T gotalarm; /*************************************************************** Signal function to tell us we timed out. @@ -486,6 +475,7 @@ BOOL message_named_mutex(char *name, unsigned int timeout) { TDB_DATA key; int ret; + void (*oldsig_handler)(int) = NULL; if (!message_init()) return False; @@ -495,7 +485,7 @@ BOOL message_named_mutex(char *name, unsigned int timeout) if (timeout) { gotalarm = 0; - CatchSignal(SIGALRM, SIGNAL_CAST gotalarm_sig); + oldsig_handler = CatchSignal(SIGALRM, SIGNAL_CAST gotalarm_sig); alarm(timeout); } @@ -503,7 +493,7 @@ BOOL message_named_mutex(char *name, unsigned int timeout) if (timeout) { alarm(0); - CatchSignal(SIGALRM, SIGNAL_CAST SIG_IGN); + CatchSignal(SIGALRM, SIGNAL_CAST oldsig_handler); if (gotalarm) return False; } -- cgit From a834a73e341059be154426390304a42e4a011f72 Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Wed, 25 Sep 2002 15:19:00 +0000 Subject: sync'ing up for 3.0alpha20 release (This used to be commit 65e7b5273bb58802bf0c389b77f7fcae0a1f6139) --- source3/lib/messages.c | 94 ++++++++++++-------------------------------------- 1 file changed, 22 insertions(+), 72 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index e6d2de4a58..d9886a54da 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -382,10 +382,11 @@ void message_deregister(int msg_type) struct msg_all { int msg_type; + uint32 msg_flag; const void *buf; size_t len; BOOL duplicates; - int n_sent; + int n_sent; }; /**************************************************************************** @@ -405,13 +406,20 @@ static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void if (crec.cnum != -1) return 0; - /* if the msg send fails because the pid was not found (i.e. smbd died), + /* Don't send if the receiver hasn't registered an interest. */ + + 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.*/ + if (!message_send_pid(crec.pid, msg_all->msg_type, msg_all->buf, msg_all->len, msg_all->duplicates)) { - /* if the pid was not found delete the entry from connections.tdb */ + /* If the pid was not found delete the entry from connections.tdb */ + if (errno == ESRCH) { DEBUG(2,("pid %u doesn't exist - deleting connections %d [%s]\n", (unsigned int)crec.pid, crec.cnum, crec.name)); @@ -442,6 +450,17 @@ BOOL message_send_all(TDB_CONTEXT *conn_tdb, int msg_type, struct msg_all msg_all; msg_all.msg_type = msg_type; + if (msg_type < 1000) + msg_all.msg_flag = FLAG_MSG_GENERAL; + else if (msg_type > 1000 && msg_type < 2000) + msg_all.msg_flag = FLAG_MSG_NMBD; + else if (msg_type > 2000 && msg_type < 3000) + msg_all.msg_flag = FLAG_MSG_PRINTING; + else if (msg_type > 3000 && msg_type < 4000) + msg_all.msg_flag = FLAG_MSG_SMBD; + else + return False; + msg_all.buf = buf; msg_all.len = len; msg_all.duplicates = duplicates_allowed; @@ -452,73 +471,4 @@ BOOL message_send_all(TDB_CONTEXT *conn_tdb, int msg_type, *n_sent = msg_all.n_sent; return True; } - -static SIG_ATOMIC_T gotalarm; - -/*************************************************************** - Signal function to tell us we timed out. -****************************************************************/ - -static void gotalarm_sig(void) -{ - gotalarm = 1; -} - -/** - * Lock the messaging tdb based on a string - this is used as a primitive - * form of mutex between smbd instances. - * - * @param name A string identifying the name of the mutex. - */ - -BOOL message_named_mutex(char *name, unsigned int timeout) -{ - TDB_DATA key; - int ret; - void (*oldsig_handler)(int) = NULL; - - if (!message_init()) - return False; - - key.dptr = name; - key.dsize = strlen(name)+1; - - if (timeout) { - gotalarm = 0; - oldsig_handler = CatchSignal(SIGALRM, SIGNAL_CAST gotalarm_sig); - alarm(timeout); - } - - ret = tdb_chainlock(tdb, key); - - if (timeout) { - alarm(0); - CatchSignal(SIGALRM, SIGNAL_CAST oldsig_handler); - if (gotalarm) - return False; - } - - if (ret == 0) - DEBUG(10,("message_named_mutex: got mutex for %s\n", name )); - - return (ret == 0); -} - -/** - * Unlock a named mutex. - * - * @param name A string identifying the name of the mutex. - */ - -void message_named_mutex_release(char *name) -{ - TDB_DATA key; - - key.dptr = name; - key.dsize = strlen(name)+1; - - tdb_chainunlock(tdb, key); - DEBUG(10,("message_named_mutex: released mutex for %s\n", name )); -} - /** @} **/ -- cgit From de474974ea25df7738dd175126e3f1de0df47ea6 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Sat, 23 Nov 2002 02:52:36 +0000 Subject: Lots of fixes for error paths where tdb_fetch() data need freeing. Found via a post from Arcady Chernyak . Jeremy. (This used to be commit 5d5762d1787db4392d2dff16024097c638b2d494) --- source3/lib/messages.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index d9886a54da..36a23e28ab 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -180,10 +180,12 @@ BOOL message_send_pid(pid_t pid, int msg_type, const void *buf, size_t len, if (!dbuf.dptr) { /* its a new record */ p = (void *)malloc(len + sizeof(rec)); - if (!p) goto failed; + if (!p) + goto failed; memcpy(p, &rec, sizeof(rec)); - if (len > 0) memcpy((void *)((char*)p+sizeof(rec)), buf, len); + if (len > 0) + memcpy((void *)((char*)p+sizeof(rec)), buf, len); dbuf.dptr = p; dbuf.dsize = len + sizeof(rec); @@ -218,11 +220,13 @@ BOOL message_send_pid(pid_t pid, int msg_type, const void *buf, size_t len, /* we're adding to an existing entry */ p = (void *)malloc(dbuf.dsize + len + sizeof(rec)); - if (!p) goto failed; + if (!p) + goto failed; memcpy(p, dbuf.dptr, dbuf.dsize); memcpy((void *)((char*)p+dbuf.dsize), &rec, sizeof(rec)); - if (len > 0) memcpy((void *)((char*)p+dbuf.dsize+sizeof(rec)), buf, len); + if (len > 0) + memcpy((void *)((char*)p+dbuf.dsize+sizeof(rec)), buf, len); SAFE_FREE(dbuf.dptr); dbuf.dptr = p; @@ -256,7 +260,8 @@ static BOOL message_recv(int *msg_type, pid_t *src, void **buf, size_t *len) tdb_chainlock(tdb, kbuf); dbuf = tdb_fetch(tdb, kbuf); - if (dbuf.dptr == NULL || dbuf.dsize == 0) goto failed; + if (dbuf.dptr == NULL || dbuf.dsize == 0) + goto failed; memcpy(&rec, dbuf.dptr, sizeof(rec)); @@ -267,7 +272,8 @@ static BOOL message_recv(int *msg_type, pid_t *src, void **buf, size_t *len) if (rec.len > 0) { (*buf) = (void *)malloc(rec.len); - if (!(*buf)) goto failed; + if (!(*buf)) + goto failed; memcpy(*buf, dbuf.dptr+sizeof(rec), rec.len); } else { @@ -293,6 +299,7 @@ static BOOL message_recv(int *msg_type, pid_t *src, void **buf, size_t *len) failed: tdb_chainunlock(tdb, kbuf); + SAFE_FREE(dbuf.dptr); return False; } -- cgit From 634c54310c92c48dd4eceec602e230a021bdcfc5 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Fri, 3 Jan 2003 08:28:12 +0000 Subject: Merge from HEAD - make Samba compile with -Wwrite-strings without additional warnings. (Adds a lot of const). Andrew Bartlett (This used to be commit 3a7458f9472432ef12c43008414925fd1ce8ea0c) --- source3/lib/messages.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 36a23e28ab..8200b2f8c3 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -81,7 +81,7 @@ static void sig_usr1(void) static void ping_message(int msg_type, pid_t src, void *buf, size_t len) { - char *msg = buf ? buf : "none"; + const char *msg = buf ? buf : "none"; DEBUG(1,("INFO: Received PING message from PID %u [%s]\n",(unsigned int)src, msg)); message_send_pid(src, MSG_PONG, buf, len, True); } -- cgit From 6dea8137286f8c7178db084b879de5e9a0c5ca25 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 10 Jan 2003 20:17:02 +0000 Subject: First part of efficiency fixes for message sending to pid's (cutting down the amount of time we hold tdb locks). Gulp down all messages at once rather than reading/re-writing one at a time. NOTE: All dispatch routines *must* be able to cope with incoming message on *odd* byte boundaries (all current handlers do). Jeremy. (This used to be commit b752c0340f96669b2b2573cf7d3d10f99580b070) --- source3/lib/messages.c | 143 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 95 insertions(+), 48 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 8200b2f8c3..555a55569e 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -3,6 +3,7 @@ Samba internal messaging functions Copyright (C) Andrew Tridgell 2000 Copyright (C) 2001 by Martin Pool + Copyright (C) 2002 by Jeremy Allison 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 @@ -35,6 +36,9 @@ use that to reply by message_send_pid(). See ping_message() for a simple example. + *NOTE*: Dispatch functions must be able to cope with incoming + messages on an *odd* byte boundary. + This system doesn't have any inherent size limitations but is not very efficient for large messages or when messages are sent in very quick succession. @@ -86,6 +90,16 @@ static void ping_message(int msg_type, pid_t src, void *buf, size_t len) message_send_pid(src, MSG_PONG, buf, len, True); } +/**************************************************************************** + Return current debug level. +****************************************************************************/ + +void debuglevel_message(int msg_type, pid_t src, void *buf, size_t len) +{ + DEBUG(1,("INFO: Received REQ_DEBUGLEVEL message from PID %u\n",(unsigned int)src)); + message_send_pid(src, MSG_DEBUGLEVEL, DEBUGLEVEL_CLASS, sizeof(DEBUGLEVEL_CLASS), True); +} + /**************************************************************************** Initialise the messaging functions. ****************************************************************************/ @@ -106,6 +120,7 @@ BOOL message_init(void) CatchSignal(SIGUSR1, SIGNAL_CAST sig_usr1); message_register(MSG_PING, ping_message); + message_register(MSG_REQ_DEBUGLEVEL, debuglevel_message); return True; } @@ -133,9 +148,13 @@ static TDB_DATA message_key_pid(pid_t pid) static BOOL message_notify(pid_t pid) { - /* Doing kill with a non-positive pid causes messages to be - * sent to places we don't want. */ + /* + * Doing kill with a non-positive pid causes messages to be + * sent to places we don't want. + */ + SMB_ASSERT(pid > 0); + if (kill(pid, SIGUSR1) == -1) { if (errno == ESRCH) { DEBUG(2,("pid %d doesn't exist - deleting messages record\n", (int)pid)); @@ -160,16 +179,19 @@ BOOL message_send_pid(pid_t pid, int msg_type, const void *buf, size_t len, struct message_rec rec; void *p; + /* + * Doing kill with a non-positive pid causes messages to be + * sent to places we don't want. + */ + + SMB_ASSERT(pid > 0); + rec.msg_version = MESSAGE_VERSION; rec.msg_type = msg_type; rec.dest = pid; rec.src = sys_getpid(); rec.len = len; - /* Doing kill with a non-positive pid causes messages to be - * sent to places we don't want. */ - SMB_ASSERT(pid > 0); - kbuf = message_key_pid(pid); /* lock the record for the destination */ @@ -241,111 +263,136 @@ BOOL message_send_pid(pid_t pid, int msg_type, const void *buf, size_t len, failed: tdb_chainunlock(tdb, kbuf); + SAFE_FREE(dbuf.dptr); errno = 0; /* paranoia */ return False; } /**************************************************************************** - Retrieve the next message for the current process. + Retrieve all messages for the current process. ****************************************************************************/ -static BOOL message_recv(int *msg_type, pid_t *src, void **buf, size_t *len) +static BOOL retrieve_all_messages(char **msgs_buf, size_t *total_len) { TDB_DATA kbuf; TDB_DATA dbuf; - struct message_rec rec; + TDB_DATA null_dbuf; + + ZERO_STRUCT(null_dbuf); + + *msgs_buf = NULL; + *total_len = 0; kbuf = message_key_pid(sys_getpid()); tdb_chainlock(tdb, kbuf); - dbuf = tdb_fetch(tdb, kbuf); - if (dbuf.dptr == NULL || dbuf.dsize == 0) - goto failed; + /* + * 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; + } + + *msgs_buf = dbuf.dptr; + *total_len = dbuf.dsize; + + return True; +} + +/**************************************************************************** + Parse out the next message for the current process. +****************************************************************************/ + +static BOOL message_recv(char *msgs_buf, size_t total_len, int *msg_type, pid_t *src, char **buf, size_t *len) +{ + struct message_rec rec; + char *ret_buf = *buf; - memcpy(&rec, dbuf.dptr, sizeof(rec)); + *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)); - goto failed; + return False; } if (rec.len > 0) { - (*buf) = (void *)malloc(rec.len); - if (!(*buf)) - goto failed; - - memcpy(*buf, dbuf.dptr+sizeof(rec), rec.len); - } else { - *buf = NULL; + 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; - if (dbuf.dsize - (sizeof(rec)+rec.len) > 0) - memmove(dbuf.dptr, dbuf.dptr+sizeof(rec)+rec.len, dbuf.dsize - (sizeof(rec)+rec.len)); - dbuf.dsize -= sizeof(rec)+rec.len; - - if (dbuf.dsize == 0) - tdb_delete(tdb, kbuf); - else - tdb_store(tdb, kbuf, dbuf, TDB_REPLACE); - - SAFE_FREE(dbuf.dptr); - tdb_chainunlock(tdb, kbuf); return True; - - failed: - tdb_chainunlock(tdb, kbuf); - SAFE_FREE(dbuf.dptr); - return False; } /**************************************************************************** Receive and dispatch any messages pending for this process. Notice that all dispatch handlers for a particular msg_type get called, so you can register multiple handlers for a message. + *NOTE*: Dispatch functions must be able to cope with incoming + messages on an *odd* byte boundary. ****************************************************************************/ void message_dispatch(void) { int msg_type; pid_t src; - void *buf; - size_t len; + char *buf; + char *msgs_buf; + size_t len, total_len; struct dispatch_fns *dfn; int n_handled; - if (!received_signal) return; + if (!received_signal) + return; DEBUG(10,("message_dispatch: received_signal = %d\n", received_signal)); received_signal = 0; - while (message_recv(&msg_type, &src, &buf, &len)) { - DEBUG(10,("message_dispatch: received msg_type=%d src_pid=%d\n", - msg_type, (int) src)); + if (!retrieve_all_messages(&msgs_buf, &total_len)) + return; + + for (buf = msgs_buf; message_recv(msgs_buf, total_len, &msg_type, &src, &buf, &len); buf += len) { + DEBUG(10,("message_dispatch: received msg_type=%d src_pid=%u\n", + msg_type, (unsigned int) 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, buf, len); + dfn->fn(msg_type, src, len ? (void *)buf : NULL, len); n_handled++; } } if (!n_handled) { - DEBUG(5,("message_dispatch: warning: no handlers registered for " - "msg_type %d in pid %d\n", - msg_type, sys_getpid())); + DEBUG(5,("message_dispatch: warning: no handlers registed for " + "msg_type %d in pid %u\n", + msg_type, (unsigned int)sys_getpid())); } - SAFE_FREE(buf); } + SAFE_FREE(msgs_buf); } /**************************************************************************** Register a dispatch function for a particular message type. + *NOTE*: Dispatch functions must be able to cope with incoming + messages on an *odd* byte boundary. ****************************************************************************/ void message_register(int msg_type, -- cgit From dd510e054743c02e88fa4a2b45e9252718bda2e6 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Sat, 11 Jan 2003 00:17:41 +0000 Subject: Added new message_send_pid() code that uses tdb append to reduce locking contention on the messaging tdb. Jeremy. (This used to be commit ee0ceeff99f32146bebd4b49d346abdaa20aa10c) --- source3/lib/messages.c | 109 +++++++++++++++++++++++++------------------------ 1 file changed, 55 insertions(+), 54 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 555a55569e..38c3c411d4 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -176,8 +176,10 @@ BOOL message_send_pid(pid_t pid, int msg_type, const void *buf, size_t len, { TDB_DATA kbuf; TDB_DATA dbuf; + TDB_DATA old_dbuf; struct message_rec rec; - void *p; + char *ptr; + struct message_rec prec; /* * Doing kill with a non-positive pid causes messages to be @@ -194,78 +196,77 @@ BOOL message_send_pid(pid_t pid, int msg_type, const void *buf, size_t len, kbuf = message_key_pid(pid); + dbuf.dptr = (void *)malloc(len + sizeof(rec)); + if (!dbuf.dptr) + return False; + + memcpy(dbuf.dptr, &rec, sizeof(rec)); + if (len > 0) + memcpy((void *)((char*)dbuf.dptr+sizeof(rec)), buf, len); + + dbuf.dsize = len + sizeof(rec); + + if (duplicates_allowed) { + + /* If duplicates are allowed we can just append the message and return. */ + + /* lock the record for the destination */ + tdb_chainlock(tdb, kbuf); + tdb_append(tdb, kbuf, dbuf); + tdb_chainunlock(tdb, kbuf); + + SAFE_FREE(dbuf.dptr); + errno = 0; /* paranoia */ + return message_notify(pid); + } + /* lock the record for the destination */ tdb_chainlock(tdb, kbuf); + old_dbuf = tdb_fetch(tdb, kbuf); - dbuf = tdb_fetch(tdb, kbuf); - - if (!dbuf.dptr) { + if (!old_dbuf.dptr) { /* its a new record */ - p = (void *)malloc(len + sizeof(rec)); - if (!p) - goto failed; - memcpy(p, &rec, sizeof(rec)); - if (len > 0) - memcpy((void *)((char*)p+sizeof(rec)), buf, len); - - dbuf.dptr = p; - dbuf.dsize = len + sizeof(rec); tdb_store(tdb, kbuf, dbuf, TDB_REPLACE); - SAFE_FREE(p); - goto ok; + tdb_chainunlock(tdb, kbuf); + + SAFE_FREE(dbuf.dptr); + errno = 0; /* paranoia */ + return message_notify(pid); } - if (!duplicates_allowed) { - char *ptr; - struct message_rec prec; - - for(ptr = (char *)dbuf.dptr; ptr < dbuf.dptr + dbuf.dsize; ) { - /* - * First check if the message header matches, then, if it's a non-zero - * sized message, check if the data matches. If so it's a duplicate and - * we can discard it. JRA. - */ - - if (!memcmp(ptr, &rec, sizeof(rec))) { - if (!len || (len && !memcmp( ptr + sizeof(rec), buf, len))) { - DEBUG(10,("message_send_pid: discarding duplicate message.\n")); - SAFE_FREE(dbuf.dptr); - tdb_chainunlock(tdb, kbuf); - return True; - } + /* Not a new record. Check for duplicates. */ + + for(ptr = (char *)old_dbuf.dptr; ptr < old_dbuf.dptr + old_dbuf.dsize; ) { + /* + * First check if the message header matches, then, if it's a non-zero + * sized message, check if the data matches. If so it's a duplicate and + * we can discard it. JRA. + */ + + if (!memcmp(ptr, &rec, sizeof(rec))) { + if (!len || (len && !memcmp( ptr + sizeof(rec), buf, len))) { + tdb_chainunlock(tdb, kbuf); + DEBUG(10,("message_send_pid: discarding duplicate message.\n")); + SAFE_FREE(dbuf.dptr); + SAFE_FREE(old_dbuf.dptr); + return True; } - memcpy(&prec, ptr, sizeof(prec)); - ptr += sizeof(rec) + prec.len; } + memcpy(&prec, ptr, sizeof(prec)); + ptr += sizeof(rec) + prec.len; } /* we're adding to an existing entry */ - p = (void *)malloc(dbuf.dsize + len + sizeof(rec)); - if (!p) - goto failed; - memcpy(p, dbuf.dptr, dbuf.dsize); - memcpy((void *)((char*)p+dbuf.dsize), &rec, sizeof(rec)); - if (len > 0) - memcpy((void *)((char*)p+dbuf.dsize+sizeof(rec)), buf, len); + tdb_append(tdb, kbuf, dbuf); + tdb_chainunlock(tdb, kbuf); - SAFE_FREE(dbuf.dptr); - dbuf.dptr = p; - dbuf.dsize += len + sizeof(rec); - tdb_store(tdb, kbuf, dbuf, TDB_REPLACE); + SAFE_FREE(old_dbuf.dptr); SAFE_FREE(dbuf.dptr); - ok: - tdb_chainunlock(tdb, kbuf); errno = 0; /* paranoia */ return message_notify(pid); - - failed: - tdb_chainunlock(tdb, kbuf); - SAFE_FREE(dbuf.dptr); - errno = 0; /* paranoia */ - return False; } /**************************************************************************** -- cgit From 97027aa5ff4ba6bb05f66458e9b8db98c194c619 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Thu, 30 Jan 2003 04:37:18 +0000 Subject: Merge of REQ_DEBUGLEVEL messaging and debug_count fixes from HEAD. (This used to be commit abb112ba2ad362036c7b3f340d5f64d6fcc0cd3c) --- source3/lib/messages.c | 11 ----------- 1 file changed, 11 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 38c3c411d4..53c9e3d2bc 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -90,16 +90,6 @@ static void ping_message(int msg_type, pid_t src, void *buf, size_t len) message_send_pid(src, MSG_PONG, buf, len, True); } -/**************************************************************************** - Return current debug level. -****************************************************************************/ - -void debuglevel_message(int msg_type, pid_t src, void *buf, size_t len) -{ - DEBUG(1,("INFO: Received REQ_DEBUGLEVEL message from PID %u\n",(unsigned int)src)); - message_send_pid(src, MSG_DEBUGLEVEL, DEBUGLEVEL_CLASS, sizeof(DEBUGLEVEL_CLASS), True); -} - /**************************************************************************** Initialise the messaging functions. ****************************************************************************/ @@ -120,7 +110,6 @@ BOOL message_init(void) CatchSignal(SIGUSR1, SIGNAL_CAST sig_usr1); message_register(MSG_PING, ping_message); - message_register(MSG_REQ_DEBUGLEVEL, debuglevel_message); return True; } -- cgit From bbf9f09ee5c58e348eef33448d2c38e588adb66a Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 30 Jan 2003 23:55:58 +0000 Subject: Add 3 second timeout when terminating server and sending print notify messages. Stops build-up of large numbers of smbd's waiting to terminate on large print throughput. Jeremy. (This used to be commit 07efebb98473cb3d4adc6b2e0afef3f06dcc99b8) --- source3/lib/messages.c | 50 +++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 45 insertions(+), 5 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 53c9e3d2bc..3603758e9f 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -160,8 +160,8 @@ static BOOL message_notify(pid_t pid) Send a message to a particular pid. ****************************************************************************/ -BOOL message_send_pid(pid_t pid, int msg_type, const void *buf, size_t len, - BOOL duplicates_allowed) +static BOOL message_send_pid_internal(pid_t pid, int msg_type, const void *buf, size_t len, + BOOL duplicates_allowed, unsigned int timeout) { TDB_DATA kbuf; TDB_DATA dbuf; @@ -200,7 +200,17 @@ BOOL message_send_pid(pid_t pid, int msg_type, const void *buf, size_t len, /* If duplicates are allowed we can just append the message and return. */ /* lock the record for the destination */ - tdb_chainlock(tdb, kbuf); + if (timeout) { + if (tdb_chainlock_with_timeout(tdb, kbuf, timeout) == -1) { + DEBUG(0,("message_send_pid_internal: failed to get chainlock with timeout %ul.\n", timeout)); + return False; + } + } else { + if (tdb_chainlock(tdb, kbuf) == -1) { + DEBUG(0,("message_send_pid_internal: failed to get chainlock.\n")); + return False; + } + } tdb_append(tdb, kbuf, dbuf); tdb_chainunlock(tdb, kbuf); @@ -210,7 +220,18 @@ BOOL message_send_pid(pid_t pid, int msg_type, const void *buf, size_t len, } /* lock the record for the destination */ - tdb_chainlock(tdb, kbuf); + if (timeout) { + if (tdb_chainlock_with_timeout(tdb, kbuf, timeout) == -1) { + DEBUG(0,("message_send_pid_internal: failed to get chainlock with timeout %ul.\n", timeout)); + return False; + } + } else { + if (tdb_chainlock(tdb, kbuf) == -1) { + DEBUG(0,("message_send_pid_internal: failed to get chainlock.\n")); + return False; + } + } + old_dbuf = tdb_fetch(tdb, kbuf); if (!old_dbuf.dptr) { @@ -236,7 +257,7 @@ BOOL message_send_pid(pid_t pid, int msg_type, const void *buf, size_t len, if (!memcmp(ptr, &rec, sizeof(rec))) { if (!len || (len && !memcmp( ptr + sizeof(rec), buf, len))) { tdb_chainunlock(tdb, kbuf); - DEBUG(10,("message_send_pid: discarding duplicate message.\n")); + DEBUG(10,("message_send_pid_internal: discarding duplicate message.\n")); SAFE_FREE(dbuf.dptr); SAFE_FREE(old_dbuf.dptr); return True; @@ -258,6 +279,25 @@ BOOL message_send_pid(pid_t pid, int msg_type, const void *buf, size_t len, return message_notify(pid); } +/**************************************************************************** + Send a message to a particular pid - no timeout. +****************************************************************************/ + +BOOL message_send_pid(pid_t pid, int msg_type, const void *buf, size_t len, BOOL duplicates_allowed) +{ + return message_send_pid_internal(pid, msg_type, buf, len, duplicates_allowed, 0); +} + +/**************************************************************************** + Send a message to a particular pid, with timeout in seconds. +****************************************************************************/ + +BOOL message_send_pid_with_timeout(pid_t pid, int msg_type, const void *buf, size_t len, + BOOL duplicates_allowed, unsigned int timeout) +{ + return message_send_pid_internal(pid, msg_type, buf, len, duplicates_allowed, timeout); +} + /**************************************************************************** Retrieve all messages for the current process. ****************************************************************************/ -- cgit From 45d3e78547cb2024d9cf7bf1fc838dd33ad8126b Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 17 Mar 2003 22:42:56 +0000 Subject: Mege from HEAD - doxygen. (This used to be commit 04a5cbc8964386774acdca759b4cfaded068c8f2) --- source3/lib/messages.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 3603758e9f..5ff0e45c61 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -21,11 +21,11 @@ */ /** - @defgroups messages Internal messaging framework - @{ - @file messages.c - - This module is used for internal messaging between Samba daemons. + @defgroup messages Internal messaging framework + @{ + @file messages.c + + @brief Module for internal messaging between Samba daemons. The idea is that if a part of Samba wants to do communication with another Samba process then it will do a message_register() of a @@ -36,7 +36,7 @@ use that to reply by message_send_pid(). See ping_message() for a simple example. - *NOTE*: Dispatch functions must be able to cope with incoming + @caution Dispatch functions must be able to cope with incoming messages on an *odd* byte boundary. This system doesn't have any inherent size limitations but is not @@ -524,7 +524,7 @@ static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void * @param n_sent Set to the number of messages sent. This should be * equal to the number of processes, but be careful for races. * - * @return True for success. + * @retval True for success. **/ BOOL message_send_all(TDB_CONTEXT *conn_tdb, int msg_type, const void *buf, size_t len, -- cgit From 3be18a1fba5b008e55a4497470165de62aa15054 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 20 Mar 2003 00:52:37 +0000 Subject: lib/messages.c: Check return from chainlock before modifying message queue. Apply the job returned limit across all requests for job queues. Jeremy. (This used to be commit bf795b684e608f82db822e0759e7b69afd451b65) --- source3/lib/messages.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 5ff0e45c61..c078472880 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -315,7 +315,9 @@ static BOOL retrieve_all_messages(char **msgs_buf, size_t *total_len) kbuf = message_key_pid(sys_getpid()); - tdb_chainlock(tdb, kbuf); + if (tdb_chainlock(tdb, kbuf) == -1) + return False; + dbuf = tdb_fetch(tdb, kbuf); /* * Replace with an empty record to keep the allocated -- cgit From ae7414ed37782cf45ba750caaed0ebeceb0c09b3 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Mon, 14 Apr 2003 02:19:10 +0000 Subject: Whoops - missed some tdb message registrations from a previous merge. (This used to be commit 59f8fc438a2ff5bb7ff115a19f6aacbb0ef7b653) --- source3/lib/messages.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index c078472880..0615cc1883 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -111,6 +111,11 @@ BOOL message_init(void) message_register(MSG_PING, ping_message); + /* Register some debugging related messages */ + + register_msg_pool_usage(); + register_dmalloc_msgs(); + return True; } -- cgit From 30418a47c609fdff286bcab4e29e3fe0b244632e Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 23 Apr 2003 00:19:30 +0000 Subject: Limit the number of outstanding print notify messages for a process to 1000. Jeremy. (This used to be commit 2e5e4c10d2377493913554e7dab79d97a4d16d87) --- source3/lib/messages.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 0615cc1883..8706ede706 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -303,6 +303,37 @@ BOOL message_send_pid_with_timeout(pid_t pid, int msg_type, const void *buf, siz return message_send_pid_internal(pid, msg_type, buf, len, duplicates_allowed, timeout); } +/**************************************************************************** + Count the messages pending for a particular pid. Expensive.... +****************************************************************************/ + +unsigned int messages_pending_for_pid(pid_t pid) +{ + TDB_DATA kbuf; + TDB_DATA dbuf; + char *buf; + unsigned int message_count = 0; + + kbuf = message_key_pid(sys_getpid()); + + dbuf = tdb_fetch(tdb, kbuf); + if (dbuf.dptr == NULL || dbuf.dsize == 0) { + SAFE_FREE(dbuf.dptr); + 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; +} + /**************************************************************************** Retrieve all messages for the current process. ****************************************************************************/ -- cgit From 1842fde7d10a6faccae1a24ebc67f8452a5a828e Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Wed, 18 Aug 2004 13:55:58 +0000 Subject: r1885: tighten the cache consistency with the ntprinters.tdb entry an the in memory cache associated with open printer handles; also make sure that register_messages_flags() doesn't overwrite the originally registers flags (This used to be commit 540daf71d8ad189af5dd6d45aa1ce2b3d67da752) --- source3/lib/messages.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 8706ede706..ded3ac95bb 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -576,8 +576,10 @@ BOOL message_send_all(TDB_CONTEXT *conn_tdb, int msg_type, msg_all.msg_flag = FLAG_MSG_GENERAL; else if (msg_type > 1000 && msg_type < 2000) msg_all.msg_flag = FLAG_MSG_NMBD; - else if (msg_type > 2000 && msg_type < 3000) - msg_all.msg_flag = FLAG_MSG_PRINTING; + else if (msg_type > 2000 && msg_type < 2100) + msg_all.msg_flag = FLAG_MSG_PRINT_NOTIFY; + else if (msg_type > 2100 && msg_type < 3000) + msg_all.msg_flag = FLAG_MSG_PRINT_GENERAL; else if (msg_type > 3000 && msg_type < 4000) msg_all.msg_flag = FLAG_MSG_SMBD; else -- cgit From acf9d61421faa6c0055d57fdee7db300dc5431aa Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 7 Dec 2004 18:25:53 +0000 Subject: r4088: Get medieval on our ass about malloc.... :-). Take control of all our allocation functions so we can funnel through some well known functions. Should help greatly with malloc checking. HEAD patch to follow. Jeremy. (This used to be commit 620f2e608f70ba92f032720c031283d295c5c06a) --- source3/lib/messages.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index ded3ac95bb..dca4b94844 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -190,7 +190,7 @@ static BOOL message_send_pid_internal(pid_t pid, int msg_type, const void *buf, kbuf = message_key_pid(pid); - dbuf.dptr = (void *)malloc(len + sizeof(rec)); + dbuf.dptr = (void *)SMB_MALLOC(len + sizeof(rec)); if (!dbuf.dptr) return False; @@ -468,7 +468,7 @@ void message_register(int msg_type, { struct dispatch_fns *dfn; - dfn = (struct dispatch_fns *)malloc(sizeof(*dfn)); + dfn = SMB_MALLOC_P(struct dispatch_fns); if (dfn != NULL) { -- cgit From 129b461673ecd0ad4d16c0c99585dd5c067172df Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Thu, 9 Jun 2005 15:20:11 +0000 Subject: r7440: * merge registry server changes from trunk (so far) for more printmig.exe work * merge the sys_select_signal(char c) change from trunk in order to keeo the winbind code in sync (This used to be commit a112c5570a7f8ddddde1af0fa665f40a6067e8cf) --- source3/lib/messages.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index dca4b94844..21b5531c89 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -76,7 +76,7 @@ static struct dispatch_fns { static void sig_usr1(void) { received_signal = 1; - sys_select_signal(); + sys_select_signal(SIGUSR1); } /**************************************************************************** -- cgit From 56fd626fe710f24201b1f413f8b7b28a919df0c4 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Thu, 25 Aug 2005 17:46:13 +0000 Subject: r9619: Fix messages_pending_for_pid actually do what it's meant to do. This might be a big relief on messages.tdb contention as ignoring processes with >1000 messages in printing/notify.c should work correctly now. Jeremy, Jerry told me to ask you about printer scalability torture tests, this might be a reason why you implemented the message_send_pid_with_timeout using the signal (shudder) in the first place. :-) While looking at that... Wouldn't it be better to not use the signal but have an overall timeout for print_notify_send_messages using GetTimeOfDay & friends and not use the alarm signal deep inside tdb.c? Volker (This used to be commit b5e82bb512d3425839e061e78f4d6fe0bd05b708) --- source3/lib/messages.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 21b5531c89..7d3addd86a 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -314,7 +314,7 @@ unsigned int messages_pending_for_pid(pid_t pid) char *buf; unsigned int message_count = 0; - kbuf = message_key_pid(sys_getpid()); + kbuf = message_key_pid(pid); dbuf = tdb_fetch(tdb, kbuf); if (dbuf.dptr == NULL || dbuf.dsize == 0) { -- cgit From 54abd2aa66069e6baf7769c496f46d9dba18db39 Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Fri, 30 Sep 2005 17:13:37 +0000 Subject: r10656: BIG merge from trunk. Features not copied over * \PIPE\unixinfo * winbindd's {group,alias}membership new functions * winbindd's lookupsids() functionality * swat (trunk changes to be reverted as per discussion with Deryck) (This used to be commit 939c3cb5d78e3a2236209b296aa8aba8bdce32d3) --- source3/lib/messages.c | 57 +++++++++++++++++++++++++++++--------------------- 1 file changed, 33 insertions(+), 24 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 7d3addd86a..058bbc99b0 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -57,8 +57,8 @@ static int received_signal; struct message_rec { int msg_version; int msg_type; - pid_t dest; - pid_t src; + struct process_id dest; + struct process_id src; size_t len; }; @@ -66,7 +66,7 @@ struct message_rec { static struct dispatch_fns { struct dispatch_fns *next, *prev; int msg_type; - void (*fn)(int msg_type, pid_t pid, void *buf, size_t len); + void (*fn)(int msg_type, struct process_id pid, void *buf, size_t len); } *dispatch_fns; /**************************************************************************** @@ -83,10 +83,12 @@ static void sig_usr1(void) A useful function for testing the message system. ****************************************************************************/ -static void ping_message(int msg_type, pid_t src, void *buf, size_t len) +static void ping_message(int msg_type, struct process_id src, + void *buf, size_t len) { const char *msg = buf ? buf : "none"; - DEBUG(1,("INFO: Received PING message from PID %u [%s]\n",(unsigned int)src, msg)); + DEBUG(1,("INFO: Received PING message from PID %s [%s]\n", + procid_str_static(&src), msg)); message_send_pid(src, MSG_PONG, buf, len, True); } @@ -123,12 +125,12 @@ BOOL message_init(void) Form a static tdb key from a pid. ******************************************************************/ -static TDB_DATA message_key_pid(pid_t pid) +static TDB_DATA message_key_pid(struct process_id pid) { static char key[20]; TDB_DATA kbuf; - slprintf(key, sizeof(key)-1, "PID/%d", (int)pid); + slprintf(key, sizeof(key)-1, "PID/%s", procid_str_static(&pid)); kbuf.dptr = (char *)key; kbuf.dsize = strlen(key)+1; @@ -140,8 +142,9 @@ static TDB_DATA message_key_pid(pid_t pid) then delete its record in the database. ****************************************************************************/ -static BOOL message_notify(pid_t pid) +static BOOL message_notify(struct process_id procid) { + pid_t pid = procid.pid; /* * Doing kill with a non-positive pid causes messages to be * sent to places we don't want. @@ -152,7 +155,7 @@ static BOOL message_notify(pid_t pid) if (kill(pid, SIGUSR1) == -1) { if (errno == ESRCH) { DEBUG(2,("pid %d doesn't exist - deleting messages record\n", (int)pid)); - tdb_delete(tdb, message_key_pid(pid)); + tdb_delete(tdb, message_key_pid(procid)); } else { DEBUG(2,("message to process %d failed - %s\n", (int)pid, strerror(errno))); } @@ -165,8 +168,10 @@ static BOOL message_notify(pid_t pid) Send a message to a particular pid. ****************************************************************************/ -static BOOL message_send_pid_internal(pid_t pid, int msg_type, const void *buf, size_t len, - BOOL duplicates_allowed, unsigned int timeout) +static BOOL message_send_pid_internal(struct process_id pid, int msg_type, + const void *buf, size_t len, + BOOL duplicates_allowed, + unsigned int timeout) { TDB_DATA kbuf; TDB_DATA dbuf; @@ -180,12 +185,12 @@ static BOOL message_send_pid_internal(pid_t pid, int msg_type, const void *buf, * sent to places we don't want. */ - SMB_ASSERT(pid > 0); + SMB_ASSERT(procid_to_pid(&pid) > 0); rec.msg_version = MESSAGE_VERSION; rec.msg_type = msg_type; rec.dest = pid; - rec.src = sys_getpid(); + rec.src = procid_self(); rec.len = len; kbuf = message_key_pid(pid); @@ -288,7 +293,7 @@ static BOOL message_send_pid_internal(pid_t pid, int msg_type, const void *buf, Send a message to a particular pid - no timeout. ****************************************************************************/ -BOOL message_send_pid(pid_t pid, int msg_type, const void *buf, size_t len, BOOL duplicates_allowed) +BOOL message_send_pid(struct process_id pid, int msg_type, const void *buf, size_t len, BOOL duplicates_allowed) { return message_send_pid_internal(pid, msg_type, buf, len, duplicates_allowed, 0); } @@ -297,7 +302,7 @@ BOOL message_send_pid(pid_t pid, int msg_type, const void *buf, size_t len, BOOL Send a message to a particular pid, with timeout in seconds. ****************************************************************************/ -BOOL message_send_pid_with_timeout(pid_t pid, int msg_type, const void *buf, size_t len, +BOOL message_send_pid_with_timeout(struct process_id pid, int msg_type, const void *buf, size_t len, BOOL duplicates_allowed, unsigned int timeout) { return message_send_pid_internal(pid, msg_type, buf, len, duplicates_allowed, timeout); @@ -307,7 +312,7 @@ BOOL message_send_pid_with_timeout(pid_t pid, int msg_type, const void *buf, siz Count the messages pending for a particular pid. Expensive.... ****************************************************************************/ -unsigned int messages_pending_for_pid(pid_t pid) +unsigned int messages_pending_for_pid(struct process_id pid) { TDB_DATA kbuf; TDB_DATA dbuf; @@ -349,7 +354,7 @@ static BOOL retrieve_all_messages(char **msgs_buf, size_t *total_len) *msgs_buf = NULL; *total_len = 0; - kbuf = message_key_pid(sys_getpid()); + kbuf = message_key_pid(pid_to_procid(sys_getpid())); if (tdb_chainlock(tdb, kbuf) == -1) return False; @@ -377,7 +382,8 @@ static BOOL retrieve_all_messages(char **msgs_buf, size_t *total_len) Parse out the next message for the current process. ****************************************************************************/ -static BOOL message_recv(char *msgs_buf, size_t total_len, int *msg_type, pid_t *src, char **buf, size_t *len) +static BOOL message_recv(char *msgs_buf, size_t total_len, int *msg_type, + struct process_id *src, char **buf, size_t *len) { struct message_rec rec; char *ret_buf = *buf; @@ -420,7 +426,7 @@ static BOOL message_recv(char *msgs_buf, size_t total_len, int *msg_type, pid_t void message_dispatch(void) { int msg_type; - pid_t src; + struct process_id src; char *buf; char *msgs_buf; size_t len, total_len; @@ -438,8 +444,9 @@ void message_dispatch(void) return; for (buf = msgs_buf; message_recv(msgs_buf, total_len, &msg_type, &src, &buf, &len); buf += len) { - DEBUG(10,("message_dispatch: received msg_type=%d src_pid=%u\n", - msg_type, (unsigned int) src)); + 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) { @@ -464,7 +471,8 @@ void message_dispatch(void) ****************************************************************************/ void message_register(int msg_type, - void (*fn)(int msg_type, pid_t pid, void *buf, size_t len)) + void (*fn)(int msg_type, struct process_id pid, + void *buf, size_t len)) { struct dispatch_fns *dfn; @@ -543,8 +551,9 @@ static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void /* If the pid was not found delete the entry from connections.tdb */ if (errno == ESRCH) { - DEBUG(2,("pid %u doesn't exist - deleting connections %d [%s]\n", - (unsigned int)crec.pid, crec.cnum, crec.name)); + DEBUG(2,("pid %s doesn't exist - deleting connections %d [%s]\n", + procid_str_static(&crec.pid), + crec.cnum, crec.name)); tdb_delete(the_tdb, kbuf); } } -- cgit From 0af1500fc0bafe61019f1b2ab1d9e1d369221240 Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Fri, 3 Feb 2006 22:19:41 +0000 Subject: r13316: Let the carnage begin.... Sync with trunk as off r13315 (This used to be commit 17e63ac4ed8325c0d44fe62b2442449f3298559f) --- source3/lib/messages.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 058bbc99b0..2d6518aed6 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -604,4 +604,19 @@ BOOL message_send_all(TDB_CONTEXT *conn_tdb, int msg_type, *n_sent = msg_all.n_sent; return True; } + +/* + * Block and unblock receiving of messages. Allows removal of race conditions + * when doing a fork and changing message disposition. + */ + +void message_block(void) +{ + BlockSignals(True, SIGUSR1); +} + +void message_unblock(void) +{ + BlockSignals(False, SIGUSR1); +} /** @} **/ -- cgit From bbf666e447132a5f6b206ddf9ca918298b756392 Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Sat, 8 Apr 2006 17:25:31 +0000 Subject: r15003: patch based on code from Arkady Glabek to ensure that global memory is freed when unloading pam_winbind.so (needs more testing on non-linux platforms) (This used to be commit 1e0b79e591d70352a96e0a0487d8f394dc7b36ba) --- source3/lib/messages.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 2d6518aed6..cd2a3b36b6 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -69,6 +69,24 @@ static struct dispatch_fns { void (*fn)(int msg_type, struct process_id pid, void *buf, size_t len); } *dispatch_fns; +/**************************************************************************** + Free global objects. +****************************************************************************/ + +void gfree_messsges(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; + } +} + /**************************************************************************** Notifications come in as signals. ****************************************************************************/ -- cgit From e98a2e1fca5f1cb61e1441520a695073bab1bec4 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 20 Jun 2006 01:20:38 +0000 Subject: r16390: Klocwork #604 - ensure if NULL pointer we assert if len != 0. Jeremy. (This used to be commit e99cedfb0cabe3863797c8bd4594ee0826022d2e) --- source3/lib/messages.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index cd2a3b36b6..dd6d4137d7 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -105,6 +105,7 @@ static void ping_message(int msg_type, struct process_id src, void *buf, size_t len) { const char *msg = buf ? buf : "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, True); @@ -198,6 +199,11 @@ static BOOL message_send_pid_internal(struct process_id pid, int msg_type, char *ptr; struct message_rec prec; + /* NULL pointer means implicit length zero. */ + if (!buf) { + SMB_ASSERT(len == 0); + } + /* * Doing kill with a non-positive pid causes messages to be * sent to places we don't want. @@ -209,7 +215,7 @@ static BOOL message_send_pid_internal(struct process_id pid, int msg_type, rec.msg_type = msg_type; rec.dest = pid; rec.src = procid_self(); - rec.len = len; + rec.len = buf ? len : 0; kbuf = message_key_pid(pid); @@ -218,7 +224,7 @@ static BOOL message_send_pid_internal(struct process_id pid, int msg_type, return False; memcpy(dbuf.dptr, &rec, sizeof(rec)); - if (len > 0) + if (len > 0 && buf) memcpy((void *)((char*)dbuf.dptr+sizeof(rec)), buf, len); dbuf.dsize = len + sizeof(rec); -- cgit From 7ad912c2641f0138884dd37626cc6294ec54d93c Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Tue, 25 Jul 2006 14:59:32 +0000 Subject: r17231: Some patch cosmetics (This used to be commit 736e55101b1e7cc22f043b836be877afbb031edf) --- source3/lib/messages.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index dd6d4137d7..57e4514b58 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -73,7 +73,7 @@ static struct dispatch_fns { Free global objects. ****************************************************************************/ -void gfree_messsges(void) +void gfree_messages(void) { struct dispatch_fns *dfn, *next; -- cgit From a093a76dc14303fd1c42fb2c0b87faf3748815e4 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 28 Jul 2006 22:42:39 +0000 Subject: r17293: After the results from the cluster tests in Germany, fix the messaging code to call the efficient calls : save_re_uid() set_effective_uid(0); messaging_op restore_re_uid(); instead of using heavyweight become_root()/unbecome_root() pairs around all messaging code. Fixup the messaging code to ensure sec_init() is called (only once) so that non-root processes still work when sending messages. This is a lighter weight solution to become_root()/unbecome_root() (which swaps all the supplemental groups) and should be more efficient. I will migrate all server code over to using this (a similar technique should be used in the passdb backend where needed). Jeremy. (This used to be commit 4ace291278d9a44f5c577bdd3b282c1231e543df) --- source3/lib/messages.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 57e4514b58..bae4052964 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -117,7 +117,10 @@ static void ping_message(int msg_type, struct process_id src, BOOL message_init(void) { - if (tdb) return True; + sec_init(); + + if (tdb) + return True; tdb = tdb_open_log(lock_path("messages.tdb"), 0, TDB_CLEAR_IF_FIRST|TDB_DEFAULT, @@ -164,6 +167,10 @@ static TDB_DATA message_key_pid(struct process_id pid) static BOOL message_notify(struct process_id procid) { pid_t pid = procid.pid; + int saved_errno; + int ret; + uid_t euid = geteuid(); + /* * Doing kill with a non-positive pid causes messages to be * sent to places we don't want. @@ -171,15 +178,28 @@ static BOOL message_notify(struct process_id procid) SMB_ASSERT(pid > 0); - if (kill(pid, SIGUSR1) == -1) { - if (errno == ESRCH) { + if (euid != 0) { + save_re_uid(); + set_effective_uid(0); + } + + ret = kill(pid, SIGUSR1); + saved_errno = errno; + + if (euid != 0) { + restore_re_uid(); + } + + if (ret == -1) { + if (saved_errno == ESRCH) { DEBUG(2,("pid %d doesn't exist - deleting messages record\n", (int)pid)); tdb_delete(tdb, message_key_pid(procid)); } else { - DEBUG(2,("message to process %d failed - %s\n", (int)pid, strerror(errno))); + DEBUG(2,("message to process %d failed - %s\n", (int)pid, strerror(saved_errno))); } return False; } + return True; } -- cgit From e4e2be0d8b5778ecc5c521b9e0e0b4c05ac87394 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 28 Jul 2006 22:56:41 +0000 Subject: r17294: Make the code a little cleaner. Instead of using the two calls make it : become_root_uid_only() operation unbecome_root_uid_only() saving errno across the second call. Most of our internal change calls can be replaced with these simple calls. Jeremy (This used to be commit 4143aa83c029848d8ec741d9218b3fa6e3fd28dd) --- source3/lib/messages.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index bae4052964..410e4af659 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -167,7 +167,6 @@ static TDB_DATA message_key_pid(struct process_id pid) static BOOL message_notify(struct process_id procid) { pid_t pid = procid.pid; - int saved_errno; int ret; uid_t euid = geteuid(); @@ -179,23 +178,21 @@ static BOOL message_notify(struct process_id procid) SMB_ASSERT(pid > 0); if (euid != 0) { - save_re_uid(); - set_effective_uid(0); + become_root_uid_only(); } ret = kill(pid, SIGUSR1); - saved_errno = errno; if (euid != 0) { - restore_re_uid(); + unbecome_root_uid_only(); } if (ret == -1) { - if (saved_errno == ESRCH) { + if (errno == ESRCH) { DEBUG(2,("pid %d doesn't exist - deleting messages record\n", (int)pid)); tdb_delete(tdb, message_key_pid(procid)); } else { - DEBUG(2,("message to process %d failed - %s\n", (int)pid, strerror(saved_errno))); + DEBUG(2,("message to process %d failed - %s\n", (int)pid, strerror(errno))); } return False; } -- cgit From e23781b3b304d1e69ad80af5ae9c0ed8d02cf996 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sun, 30 Jul 2006 16:36:56 +0000 Subject: r17316: More C++ warnings -- 456 left (This used to be commit 1e4ee728df7eeafc1b4d533240acb032f73b4f5c) --- source3/lib/messages.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 410e4af659..93e12ebe35 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -104,7 +104,7 @@ static void sig_usr1(void) static void ping_message(int msg_type, struct process_id src, void *buf, size_t len) { - const char *msg = buf ? buf : "none"; + const char *msg = buf ? (const char *)buf : "none"; DEBUG(1,("INFO: Received PING message from PID %s [%s]\n", procid_str_static(&src), msg)); @@ -236,7 +236,7 @@ static BOOL message_send_pid_internal(struct process_id pid, int msg_type, kbuf = message_key_pid(pid); - dbuf.dptr = (void *)SMB_MALLOC(len + sizeof(rec)); + dbuf.dptr = (char *)SMB_MALLOC(len + sizeof(rec)); if (!dbuf.dptr) return False; -- cgit From 25f897053946eb9eeb56acb090ef691bf0e7edd4 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 13 Dec 2006 22:19:10 +0000 Subject: r20160: Fix long-standing (ie. from initial code I think) bug in tdb message processing. If we're inside a dispatch function and we delete our own handler we'd walk onto the next pointer from a deleted memory block. Fixes crash bug in winbindd (and goodness knows where else). Jeremy. (This used to be commit 27a4c1121404e346432d90b97b518861e038e9f2) --- source3/lib/messages.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 93e12ebe35..10fc5af24d 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -471,7 +471,6 @@ void message_dispatch(void) char *buf; char *msgs_buf; size_t len, total_len; - struct dispatch_fns *dfn; int n_handled; if (!received_signal) @@ -485,11 +484,15 @@ void message_dispatch(void) return; for (buf = msgs_buf; message_recv(msgs_buf, total_len, &msg_type, &src, &buf, &len); buf += len) { + struct dispatch_fns *dfn, *next; + 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) { + for (dfn = dispatch_fns; dfn; dfn = next) { + next = 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); -- cgit From 7f5fefb7bb65ef35916769988abbec8209889225 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 14 Dec 2006 01:00:16 +0000 Subject: r20165: Change messaging subsystem to only allow one message per type - this is all we use right now and makes re-entrancy problems with deleting handlers with a message dispatch loop go away. Jeremy. (This used to be commit 2e9b6faeae1474d65a5c12f5a19b0ae045d47c2e) --- source3/lib/messages.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 10fc5af24d..66bbebac27 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -458,8 +458,7 @@ static BOOL message_recv(char *msgs_buf, size_t total_len, int *msg_type, /**************************************************************************** Receive and dispatch any messages pending for this process. - Notice that all dispatch handlers for a particular msg_type get called, - so you can register multiple handlers for a message. + JRA changed Dec 13 2006. Only one message handler now permitted per type. *NOTE*: Dispatch functions must be able to cope with incoming messages on an *odd* byte boundary. ****************************************************************************/ @@ -509,7 +508,8 @@ void message_dispatch(void) } /**************************************************************************** - Register a dispatch function for a particular message type. + Register/replace a dispatch function for a particular message type. + JRA changed Dec 13 2006. Only one message handler now permitted per type. *NOTE*: Dispatch functions must be able to cope with incoming messages on an *odd* byte boundary. ****************************************************************************/ @@ -520,6 +520,13 @@ void message_register(int msg_type, { struct dispatch_fns *dfn; + for (dfn = dispatch_fns; dfn; dfn = dfn->next) { + if (dfn->msg_type == msg_type) { + dfn->fn = fn; + return; + } + } + dfn = SMB_MALLOC_P(struct dispatch_fns); if (dfn != NULL) { @@ -550,6 +557,7 @@ void message_deregister(int msg_type) if (dfn->msg_type == msg_type) { DLIST_REMOVE(dispatch_fns, dfn); SAFE_FREE(dfn); + return; } } } -- cgit From 806daad51088bddcedda0274333b3f9e17cc26b3 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 14 Dec 2006 22:11:17 +0000 Subject: r20174: If we're only going to call one handler per message then terminate the traversal once we've done that. Jeremy. (This used to be commit da3d0b62340b545950ea2081f30c252fd4609981) --- source3/lib/messages.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 66bbebac27..de17a03afc 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -483,23 +483,23 @@ void message_dispatch(void) return; for (buf = msgs_buf; message_recv(msgs_buf, total_len, &msg_type, &src, &buf, &len); buf += len) { - struct dispatch_fns *dfn, *next; + 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 = next) { - next = dfn->next; + 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); n_handled++; + break; } } if (!n_handled) { - DEBUG(5,("message_dispatch: warning: no handlers registed for " + DEBUG(5,("message_dispatch: warning: no handler registed for " "msg_type %d in pid %u\n", msg_type, (unsigned int)sys_getpid())); } -- cgit From caf8c6a76be051559ffcfe97084edca43e0a3cee Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Tue, 30 Jan 2007 22:22:06 +0000 Subject: r21064: The core of this patch is void message_register(int msg_type, void (*fn)(int msg_type, struct process_id pid, - void *buf, size_t len)) + void *buf, size_t len, + void *private_data), + void *private_data) { struct dispatch_fns *dfn; So this adds a (so far unused) private pointer that is passed from message_register to the message handler. A prerequisite to implement a tiny samba4-API compatible wrapper around our messaging system. That itself is necessary for the Samba4 notify system. Yes, I know, I could import the whole Samba4 messaging system, but I want to do it step by step and I think getting notify in is more important in this step. Volker (This used to be commit c8ae60ed65dcce9660ee39c75488f2838cf9a28b) --- source3/lib/messages.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index de17a03afc..d231373475 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -66,7 +66,9 @@ struct message_rec { static struct dispatch_fns { struct dispatch_fns *next, *prev; int msg_type; - void (*fn)(int msg_type, struct process_id pid, void *buf, size_t len); + void (*fn)(int msg_type, struct process_id pid, void *buf, size_t len, + void *private_data); + void *private_data; } *dispatch_fns; /**************************************************************************** @@ -102,7 +104,7 @@ static void sig_usr1(void) ****************************************************************************/ static void ping_message(int msg_type, struct process_id src, - void *buf, size_t len) + void *buf, size_t len, void *private_data) { const char *msg = buf ? (const char *)buf : "none"; @@ -133,7 +135,7 @@ BOOL message_init(void) CatchSignal(SIGUSR1, SIGNAL_CAST sig_usr1); - message_register(MSG_PING, ping_message); + message_register(MSG_PING, ping_message, NULL); /* Register some debugging related messages */ @@ -493,7 +495,9 @@ void message_dispatch(void) 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->fn(msg_type, src, + len ? (void *)buf : NULL, len, + dfn->private_data); n_handled++; break; } @@ -516,7 +520,9 @@ void message_dispatch(void) void message_register(int msg_type, void (*fn)(int msg_type, struct process_id pid, - void *buf, size_t len)) + void *buf, size_t len, + void *private_data), + void *private_data) { struct dispatch_fns *dfn; @@ -535,6 +541,7 @@ void message_register(int msg_type, dfn->msg_type = msg_type; dfn->fn = fn; + dfn->private_data = private_data; DLIST_ADD(dispatch_fns, dfn); } -- cgit From 032bd8eea89ce24ab5fdd2eb6095b8416ebde558 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Wed, 31 Jan 2007 12:01:52 +0000 Subject: r21076: Two pieces of infrastructure from Samba4: An API-compatible messaging wrapper and tdb_wrap_open. Volker (This used to be commit c01f164dcaf88fb7f3bed8f69b210ba8fab326d1) --- source3/lib/messages.c | 121 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index d231373475..f2d930e357 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -678,4 +678,125 @@ 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 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 messaging_context *messaging_init(TALLOC_CTX *mem_ctx, + struct server_id server_id, + struct event_context *ev) +{ + struct messaging_context *ctx; + + if (!(ctx = TALLOC_ZERO_P(mem_ctx, struct messaging_context))) { + return NULL; + } + + ctx->id = server_id; + talloc_set_destructor(ctx, messaging_context_destructor); + return ctx; +} + +static void messaging_callback(int msg_type, struct process_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; + struct server_id id; + + blob.data = (uint8 *)buf; + blob.length = len; + id.id = pid; + + cb->fn(ctx, cb->private_data, msg_type, id, &blob); + } + } +} + +/* + * Register a dispatch function for a particular message type. Allow multiple + * registrants +*/ +NTSTATUS messaging_register(struct messaging_context *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, + DATA_BLOB *data)) +{ + struct messaging_callback *cb; + + if (!(cb = talloc(ctx, struct messaging_callback))) { + return NT_STATUS_NO_MEMORY; + } + + cb->msg_type = msg_type; + cb->fn = fn; + cb->private_data = private_data; + + DLIST_ADD(ctx->callbacks, cb); + message_register(msg_type, messaging_callback, ctx); + return NT_STATUS_OK; +} + +/* + De-register the function for a particular message type. +*/ +void messaging_deregister(struct messaging_context *ctx, uint32_t msg_type, + void *private_data) +{ + struct messaging_callback *cb, *next; + + for (cb = ctx->callbacks; cb; cb = next) { + next = cb->next; + if ((cb->msg_type == msg_type) + && (cb->private_data == private_data)) { + DLIST_REMOVE(ctx->callbacks, cb); + TALLOC_FREE(cb); + } + } +} + + /** @} **/ -- cgit From 6490e114b8e9ffc9d35a0eaee66f9bdef65708fc Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Wed, 31 Jan 2007 13:05:36 +0000 Subject: r21081: Add forgotten function (This used to be commit 4a99fa266672e2989f9e62baf9090eb45df750ea) --- source3/lib/messages.c | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index f2d930e357..5bf1774af1 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -798,5 +798,16 @@ void messaging_deregister(struct messaging_context *ctx, uint32_t msg_type, } } +/* + Send a message to a particular server +*/ +NTSTATUS messaging_send(struct messaging_context *msg, + struct server_id server, + uint32_t msg_type, DATA_BLOB *data) +{ + return message_send_pid_internal(server.id, msg_type, data->data, + data->length, True, 0) + ? NT_STATUS_OK : NT_STATUS_ACCESS_DENIED; +} /** @} **/ -- cgit From 69d8c5ae5f1319e3c9430aa7d6d09ca2a62ba10a Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Thu, 1 Feb 2007 19:29:07 +0000 Subject: r21115: notify_internal.c needs to remove the table entry if a process has crashed. So it needs the specific error message. Make messages.c return NTSTATUS and specificially NT_STATUS_INVALID_HANDLE if sending to a non-existent process. Volker (This used to be commit 3f620d181da0c356c8ffbdb5b380ccab3645a972) --- source3/lib/messages.c | 100 ++++++++++++++++++++++++++++++------------------- 1 file changed, 62 insertions(+), 38 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 5bf1774af1..e0bf86a46c 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -166,7 +166,7 @@ static TDB_DATA message_key_pid(struct process_id pid) then delete its record in the database. ****************************************************************************/ -static BOOL message_notify(struct process_id procid) +static NTSTATUS message_notify(struct process_id procid) { pid_t pid = procid.pid; int ret; @@ -191,25 +191,40 @@ static BOOL message_notify(struct process_id procid) if (ret == -1) { if (errno == ESRCH) { - DEBUG(2,("pid %d doesn't exist - deleting messages record\n", (int)pid)); + DEBUG(2,("pid %d doesn't exist - deleting messages record\n", + (int)pid)); tdb_delete(tdb, message_key_pid(procid)); - } else { - DEBUG(2,("message to process %d failed - %s\n", (int)pid, strerror(errno))); + + /* + * INVALID_HANDLE is the closest I can think of -- vl + */ + return NT_STATUS_INVALID_HANDLE; } - return False; + + DEBUG(2,("message to process %d failed - %s\n", (int)pid, + strerror(errno))); + + /* + * No call to map_nt_error_from_unix -- don't want to link in + * errormap.o into lots of utils. + */ + + if (errno == EINVAL) return NT_STATUS_INVALID_PARAMETER; + if (errno == EPERM) return NT_STATUS_ACCESS_DENIED; + return NT_STATUS_UNSUCCESSFUL; } - return True; + return NT_STATUS_OK; } /**************************************************************************** Send a message to a particular pid. ****************************************************************************/ -static BOOL message_send_pid_internal(struct process_id pid, int msg_type, - const void *buf, size_t len, - BOOL duplicates_allowed, - unsigned int timeout) +static NTSTATUS message_send_pid_internal(struct process_id pid, int msg_type, + const void *buf, size_t len, + BOOL duplicates_allowed, + unsigned int timeout) { TDB_DATA kbuf; TDB_DATA dbuf; @@ -239,8 +254,9 @@ static BOOL message_send_pid_internal(struct process_id pid, int msg_type, kbuf = message_key_pid(pid); dbuf.dptr = (char *)SMB_MALLOC(len + sizeof(rec)); - if (!dbuf.dptr) - return False; + if (!dbuf.dptr) { + return NT_STATUS_NO_MEMORY; + } memcpy(dbuf.dptr, &rec, sizeof(rec)); if (len > 0 && buf) @@ -255,13 +271,15 @@ static BOOL message_send_pid_internal(struct process_id pid, int msg_type, /* lock the record for the destination */ if (timeout) { if (tdb_chainlock_with_timeout(tdb, kbuf, timeout) == -1) { - DEBUG(0,("message_send_pid_internal: failed to get chainlock with timeout %ul.\n", timeout)); - return False; + DEBUG(0,("message_send_pid_internal: failed to get " + "chainlock with timeout %ul.\n", timeout)); + return NT_STATUS_IO_TIMEOUT; } } else { if (tdb_chainlock(tdb, kbuf) == -1) { - DEBUG(0,("message_send_pid_internal: failed to get chainlock.\n")); - return False; + DEBUG(0,("message_send_pid_internal: failed to get " + "chainlock.\n")); + return NT_STATUS_LOCK_NOT_GRANTED; } } tdb_append(tdb, kbuf, dbuf); @@ -275,13 +293,15 @@ static BOOL message_send_pid_internal(struct process_id pid, int msg_type, /* lock the record for the destination */ if (timeout) { if (tdb_chainlock_with_timeout(tdb, kbuf, timeout) == -1) { - DEBUG(0,("message_send_pid_internal: failed to get chainlock with timeout %ul.\n", timeout)); - return False; + DEBUG(0,("message_send_pid_internal: failed to get chainlock " + "with timeout %ul.\n", timeout)); + return NT_STATUS_IO_TIMEOUT; } } else { if (tdb_chainlock(tdb, kbuf) == -1) { - DEBUG(0,("message_send_pid_internal: failed to get chainlock.\n")); - return False; + DEBUG(0,("message_send_pid_internal: failed to get " + "chainlock.\n")); + return NT_STATUS_LOCK_NOT_GRANTED; } } @@ -310,10 +330,11 @@ static BOOL message_send_pid_internal(struct process_id pid, int msg_type, if (!memcmp(ptr, &rec, sizeof(rec))) { if (!len || (len && !memcmp( ptr + sizeof(rec), buf, len))) { tdb_chainunlock(tdb, kbuf); - DEBUG(10,("message_send_pid_internal: discarding duplicate message.\n")); + DEBUG(10,("message_send_pid_internal: discarding " + "duplicate message.\n")); SAFE_FREE(dbuf.dptr); SAFE_FREE(old_dbuf.dptr); - return True; + return NT_STATUS_OK; } } memcpy(&prec, ptr, sizeof(prec)); @@ -336,19 +357,23 @@ static BOOL message_send_pid_internal(struct process_id pid, int msg_type, Send a message to a particular pid - no timeout. ****************************************************************************/ -BOOL message_send_pid(struct process_id pid, int msg_type, const void *buf, size_t len, BOOL duplicates_allowed) +NTSTATUS message_send_pid(struct process_id pid, int msg_type, const void *buf, + size_t len, BOOL duplicates_allowed) { - return message_send_pid_internal(pid, msg_type, buf, len, duplicates_allowed, 0); + return message_send_pid_internal(pid, msg_type, buf, len, + duplicates_allowed, 0); } /**************************************************************************** Send a message to a particular pid, with timeout in seconds. ****************************************************************************/ -BOOL message_send_pid_with_timeout(struct process_id pid, int msg_type, const void *buf, size_t len, - BOOL duplicates_allowed, unsigned int timeout) +NTSTATUS message_send_pid_with_timeout(struct process_id pid, int msg_type, + const void *buf, size_t len, + BOOL duplicates_allowed, unsigned int timeout) { - return message_send_pid_internal(pid, msg_type, buf, len, duplicates_allowed, timeout); + return message_send_pid_internal(pid, msg_type, buf, len, duplicates_allowed, + timeout); } /**************************************************************************** @@ -586,6 +611,7 @@ static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void { struct connections_data crec; struct msg_all *msg_all = (struct msg_all *)state; + NTSTATUS status; if (dbuf.dsize != sizeof(crec)) return 0; @@ -603,18 +629,17 @@ static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void /* 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.*/ - if (!message_send_pid(crec.pid, msg_all->msg_type, - msg_all->buf, msg_all->len, - msg_all->duplicates)) { + status = message_send_pid(crec.pid, msg_all->msg_type, + msg_all->buf, msg_all->len, + msg_all->duplicates); + + if (NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) { /* If the pid was not found delete the entry from connections.tdb */ - if (errno == ESRCH) { - DEBUG(2,("pid %s doesn't exist - deleting connections %d [%s]\n", - procid_str_static(&crec.pid), - crec.cnum, crec.name)); - tdb_delete(the_tdb, kbuf); - } + DEBUG(2,("pid %s doesn't exist - deleting connections %d [%s]\n", + procid_str_static(&crec.pid), crec.cnum, crec.name)); + tdb_delete(the_tdb, kbuf); } msg_all->n_sent++; return 0; @@ -806,8 +831,7 @@ NTSTATUS messaging_send(struct messaging_context *msg, uint32_t msg_type, DATA_BLOB *data) { return message_send_pid_internal(server.id, msg_type, data->data, - data->length, True, 0) - ? NT_STATUS_OK : NT_STATUS_ACCESS_DENIED; + data->length, True, 0); } /** @} **/ -- cgit From 94a1b230f3323e55fa23f20b464964eaac643882 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Tue, 6 Mar 2007 10:40:18 +0000 Subject: r21723: Make use of the per-hashchain "freelists" (This used to be commit f3421ae4cfa263c0e7a8e934b40342ee9885d239) --- source3/lib/messages.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index e0bf86a46c..e2c8a6b52f 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -133,6 +133,9 @@ BOOL message_init(void) return False; } + /* Activate the per-hashchain freelist */ + tdb_set_max_dead(tdb, 5); + CatchSignal(SIGUSR1, SIGNAL_CAST sig_usr1); message_register(MSG_PING, ping_message, NULL); -- cgit From bc2b6436d0f5f3e9ffdfaeb7f1b32996a83d5478 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 29 Mar 2007 09:35:51 +0000 Subject: r22009: change TDB_DATA from char * to unsigned char * and fix all compiler warnings in the users metze (This used to be commit 3a28443079c141a6ce8182c65b56ca210e34f37f) --- source3/lib/messages.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index e2c8a6b52f..336a9349e6 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -159,7 +159,7 @@ static TDB_DATA message_key_pid(struct process_id pid) slprintf(key, sizeof(key)-1, "PID/%s", procid_str_static(&pid)); - kbuf.dptr = (char *)key; + kbuf.dptr = (uint8 *)key; kbuf.dsize = strlen(key)+1; return kbuf; } @@ -233,7 +233,7 @@ static NTSTATUS message_send_pid_internal(struct process_id pid, int msg_type, TDB_DATA dbuf; TDB_DATA old_dbuf; struct message_rec rec; - char *ptr; + uint8 *ptr; struct message_rec prec; /* NULL pointer means implicit length zero. */ @@ -256,7 +256,7 @@ static NTSTATUS message_send_pid_internal(struct process_id pid, int msg_type, kbuf = message_key_pid(pid); - dbuf.dptr = (char *)SMB_MALLOC(len + sizeof(rec)); + dbuf.dptr = (uint8 *)SMB_MALLOC(len + sizeof(rec)); if (!dbuf.dptr) { return NT_STATUS_NO_MEMORY; } @@ -323,7 +323,7 @@ static NTSTATUS message_send_pid_internal(struct process_id pid, int msg_type, /* Not a new record. Check for duplicates. */ - for(ptr = (char *)old_dbuf.dptr; ptr < old_dbuf.dptr + old_dbuf.dsize; ) { + for(ptr = old_dbuf.dptr; ptr < old_dbuf.dptr + old_dbuf.dsize; ) { /* * First check if the message header matches, then, if it's a non-zero * sized message, check if the data matches. If so it's a duplicate and @@ -387,7 +387,7 @@ unsigned int messages_pending_for_pid(struct process_id pid) { TDB_DATA kbuf; TDB_DATA dbuf; - char *buf; + uint8 *buf; unsigned int message_count = 0; kbuf = message_key_pid(pid); @@ -443,7 +443,7 @@ static BOOL retrieve_all_messages(char **msgs_buf, size_t *total_len) return False; } - *msgs_buf = dbuf.dptr; + *msgs_buf = (char *)dbuf.dptr; *total_len = dbuf.dsize; return True; -- cgit From bc45c82904e268327bfbf72cd3f35699ae6e7397 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 5 Apr 2007 23:56:10 +0000 Subject: r22096: become_root_uid_only() is unneeded - it's only used in messages.c. Refactor to use become_root() instead and make it local to messages.c Jeremy. (This used to be commit f3ffb3f98472b69b476b702dfe5c0575b32da018) --- source3/lib/messages.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 336a9349e6..316854f643 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -183,13 +183,18 @@ static NTSTATUS message_notify(struct process_id procid) SMB_ASSERT(pid > 0); if (euid != 0) { - become_root_uid_only(); + /* If we're not root become so to send the message. */ + save_re_uid(); + set_effective_uid(0); } ret = kill(pid, SIGUSR1); if (euid != 0) { - unbecome_root_uid_only(); + /* Go back to who we were. */ + int saved_errno = errno; + restore_re_uid_fromroot(); + errno = saved_errno; } if (ret == -1) { -- cgit From 8e4945bc1588ed1ccb954f5add95558c3a582106 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Mon, 16 Apr 2007 19:47:41 +0000 Subject: r22276: Fix name -> servicename in messages.c Jeremy. (This used to be commit cc4face3bc269afa7af19bde534cacc04f9510a9) --- source3/lib/messages.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 316854f643..94caca69b7 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -646,7 +646,7 @@ static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void /* 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.name)); + procid_str_static(&crec.pid), crec.cnum, crec.servicename)); tdb_delete(the_tdb, kbuf); } msg_all->n_sent++; -- cgit From e6383f47629368d9dd4e803f17566a24e9d7359e Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Mon, 7 May 2007 09:35:35 +0000 Subject: r22736: Start to merge the low-hanging fruit from the now 7000-line cluster patch. This changes "struct process_id" to "struct server_id", keeping both is just too much hassle. No functional change (I hope ;-)) Volker (This used to be commit 0ad4b1226c9d91b72136310d3bbb640d2c5d67b8) --- source3/lib/messages.c | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 94caca69b7..6ecb89571b 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -57,8 +57,8 @@ static int received_signal; struct message_rec { int msg_version; int msg_type; - struct process_id dest; - struct process_id src; + struct server_id dest; + struct server_id src; size_t len; }; @@ -66,7 +66,7 @@ struct message_rec { static struct dispatch_fns { struct dispatch_fns *next, *prev; int msg_type; - void (*fn)(int msg_type, struct process_id pid, void *buf, size_t len, + void (*fn)(int msg_type, struct server_id pid, void *buf, size_t len, void *private_data); void *private_data; } *dispatch_fns; @@ -103,7 +103,7 @@ static void sig_usr1(void) A useful function for testing the message system. ****************************************************************************/ -static void ping_message(int msg_type, struct process_id src, +static void ping_message(int msg_type, struct server_id src, void *buf, size_t len, void *private_data) { const char *msg = buf ? (const char *)buf : "none"; @@ -152,7 +152,7 @@ BOOL message_init(void) Form a static tdb key from a pid. ******************************************************************/ -static TDB_DATA message_key_pid(struct process_id pid) +static TDB_DATA message_key_pid(struct server_id pid) { static char key[20]; TDB_DATA kbuf; @@ -169,7 +169,7 @@ static TDB_DATA message_key_pid(struct process_id pid) then delete its record in the database. ****************************************************************************/ -static NTSTATUS message_notify(struct process_id procid) +static NTSTATUS message_notify(struct server_id procid) { pid_t pid = procid.pid; int ret; @@ -229,7 +229,7 @@ static NTSTATUS message_notify(struct process_id procid) Send a message to a particular pid. ****************************************************************************/ -static NTSTATUS message_send_pid_internal(struct process_id pid, int msg_type, +static NTSTATUS message_send_pid_internal(struct server_id pid, int msg_type, const void *buf, size_t len, BOOL duplicates_allowed, unsigned int timeout) @@ -365,7 +365,7 @@ static NTSTATUS message_send_pid_internal(struct process_id pid, int msg_type, Send a message to a particular pid - no timeout. ****************************************************************************/ -NTSTATUS message_send_pid(struct process_id pid, int msg_type, const void *buf, +NTSTATUS message_send_pid(struct server_id pid, int msg_type, const void *buf, size_t len, BOOL duplicates_allowed) { return message_send_pid_internal(pid, msg_type, buf, len, @@ -376,7 +376,7 @@ NTSTATUS message_send_pid(struct process_id pid, int msg_type, const void *buf, Send a message to a particular pid, with timeout in seconds. ****************************************************************************/ -NTSTATUS message_send_pid_with_timeout(struct process_id pid, int msg_type, +NTSTATUS message_send_pid_with_timeout(struct server_id pid, int msg_type, const void *buf, size_t len, BOOL duplicates_allowed, unsigned int timeout) { @@ -388,7 +388,7 @@ NTSTATUS message_send_pid_with_timeout(struct process_id pid, int msg_type, Count the messages pending for a particular pid. Expensive.... ****************************************************************************/ -unsigned int messages_pending_for_pid(struct process_id pid) +unsigned int messages_pending_for_pid(struct server_id pid) { TDB_DATA kbuf; TDB_DATA dbuf; @@ -459,7 +459,7 @@ static BOOL retrieve_all_messages(char **msgs_buf, size_t *total_len) ****************************************************************************/ static BOOL message_recv(char *msgs_buf, size_t total_len, int *msg_type, - struct process_id *src, char **buf, size_t *len) + struct server_id *src, char **buf, size_t *len) { struct message_rec rec; char *ret_buf = *buf; @@ -501,7 +501,7 @@ static BOOL message_recv(char *msgs_buf, size_t total_len, int *msg_type, void message_dispatch(void) { int msg_type; - struct process_id src; + struct server_id src; char *buf; char *msgs_buf; size_t len, total_len; @@ -552,7 +552,7 @@ void message_dispatch(void) ****************************************************************************/ void message_register(int msg_type, - void (*fn)(int msg_type, struct process_id pid, + void (*fn)(int msg_type, struct server_id pid, void *buf, size_t len, void *private_data), void *private_data) @@ -760,7 +760,7 @@ struct messaging_context *messaging_init(TALLOC_CTX *mem_ctx, return ctx; } -static void messaging_callback(int msg_type, struct process_id pid, +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( @@ -775,13 +775,11 @@ static void messaging_callback(int msg_type, struct process_id pid, if (msg_type == cb->msg_type) { DATA_BLOB blob; - struct server_id id; blob.data = (uint8 *)buf; blob.length = len; - id.id = pid; - cb->fn(ctx, cb->private_data, msg_type, id, &blob); + cb->fn(ctx, cb->private_data, msg_type, pid, &blob); } } } @@ -838,7 +836,7 @@ NTSTATUS messaging_send(struct messaging_context *msg, struct server_id server, uint32_t msg_type, DATA_BLOB *data) { - return message_send_pid_internal(server.id, msg_type, data->data, + return message_send_pid_internal(server, msg_type, data->data, data->length, True, 0); } -- cgit From 4aa44f7475e03dcc596f6a13fffffda7268074a1 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Tue, 8 May 2007 13:44:36 +0000 Subject: r22761: This introduces lib/conn_tdb.c with two main functions: connections_traverse and connections_forall. This centralizes all the routines that did individual tdb_open("connections.tdb") and direct tdb_traverse. Volker (This used to be commit e43e94cda1ad8876b3cb5d1129080b57fa6ec214) --- source3/lib/messages.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 6ecb89571b..10bf5dfcf7 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -665,7 +665,7 @@ static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void * * @retval True for success. **/ -BOOL message_send_all(TDB_CONTEXT *conn_tdb, int msg_type, +BOOL message_send_all(int msg_type, const void *buf, size_t len, BOOL duplicates_allowed, int *n_sent) @@ -691,7 +691,7 @@ BOOL message_send_all(TDB_CONTEXT *conn_tdb, int msg_type, msg_all.duplicates = duplicates_allowed; msg_all.n_sent = 0; - tdb_traverse(conn_tdb, traverse_fn, &msg_all); + connections_traverse(traverse_fn, &msg_all); if (n_sent) *n_sent = msg_all.n_sent; return True; -- cgit From b92064fcfd804b861e2f5125078812d83b9120a6 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Mon, 14 May 2007 13:01:28 +0000 Subject: r22846: Chunk one to replace message_send_pid with messaging_send: Deep inside locking/locking.c we have to send retry messages to timed lock holders. The majority of this patch passes a "struct messaging_context" down there. No functional change, survives make test. (This used to be commit bbb508414683eeddd2ee0d2d36fe620118180bbb) --- source3/lib/messages.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 10bf5dfcf7..7805f3c6d9 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -834,7 +834,7 @@ void messaging_deregister(struct messaging_context *ctx, uint32_t msg_type, */ NTSTATUS messaging_send(struct messaging_context *msg, struct server_id server, - uint32_t msg_type, DATA_BLOB *data) + uint32_t msg_type, const DATA_BLOB *data) { return message_send_pid_internal(server, msg_type, data->data, data->length, True, 0); -- cgit From fad7dd8a60e6637598b17fa89ec92d98db51fffe Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Mon, 14 May 2007 20:31:28 +0000 Subject: r22868: Replace some message_send_pid calls with messaging_send_pid calls. More tomorrow. (This used to be commit 74fa57ca5d7fa8eace72bbe948a08a0bca3cc4ca) --- source3/lib/messages.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 7805f3c6d9..16d3a61343 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -832,7 +832,7 @@ void messaging_deregister(struct messaging_context *ctx, uint32_t msg_type, /* Send a message to a particular server */ -NTSTATUS messaging_send(struct messaging_context *msg, +NTSTATUS messaging_send(struct messaging_context *msg_ctx, struct server_id server, uint32_t msg_type, const DATA_BLOB *data) { @@ -840,4 +840,22 @@ NTSTATUS messaging_send(struct messaging_context *msg, data->length, True, 0); } +NTSTATUS messaging_send_buf(struct messaging_context *msg_ctx, + struct server_id server, uint32_t msg_type, + const uint8 *buf, size_t len) +{ + DATA_BLOB blob = data_blob_const(buf, len); + return messaging_send(msg_ctx, server, msg_type, &blob); +} + +NTSTATUS messaging_send_buf_with_timeout(struct messaging_context *msg_ctx, + struct server_id server, + uint32_t msg_type, + const uint8 *buf, size_t len, + int timeout) +{ + return message_send_pid_internal(server, msg_type, buf, len, + True, timeout); +} + /** @} **/ -- cgit From 84758bd1f8633d3efe30e293887596db6bfd5e5b Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Tue, 15 May 2007 15:14:32 +0000 Subject: r22908: All callers of message_init now also call messaging_init. Unify those. (This used to be commit 330946ad2307ca34f0a8d068a0193fcb8a0d6036) --- source3/lib/messages.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 16d3a61343..63c136db61 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -117,7 +117,7 @@ static void ping_message(int msg_type, struct server_id src, Initialise the messaging functions. ****************************************************************************/ -BOOL message_init(void) +static BOOL message_init(struct messaging_context *msg_ctx) { sec_init(); @@ -144,6 +144,7 @@ BOOL message_init(void) register_msg_pool_usage(); register_dmalloc_msgs(); + debug_register_msgs(); return True; } @@ -757,6 +758,12 @@ struct messaging_context *messaging_init(TALLOC_CTX *mem_ctx, ctx->id = server_id; talloc_set_destructor(ctx, messaging_context_destructor); + + if (!message_init(ctx)) { + DEBUG(0, ("message_init failed: %s\n", strerror(errno))); + TALLOC_FREE(ctx); + } + return ctx; } -- cgit From 6669aa051e6e2e3cb79cb4e4b97c2dcd4e31d02b Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Tue, 15 May 2007 15:41:37 +0000 Subject: r22910: Make message_send_pid static to messages.c (This used to be commit 27224922cf964cc70aad7cf529ab6c03fb277a89) --- source3/lib/messages.c | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 63c136db61..55eed105b3 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -99,6 +99,10 @@ 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, + BOOL duplicates_allowed); + /**************************************************************************** A useful function for testing the message system. ****************************************************************************/ @@ -142,9 +146,9 @@ static BOOL message_init(struct messaging_context *msg_ctx) /* Register some debugging related messages */ - register_msg_pool_usage(); + register_msg_pool_usage(msg_ctx); register_dmalloc_msgs(); - debug_register_msgs(); + debug_register_msgs(msg_ctx); return True; } @@ -366,25 +370,14 @@ static NTSTATUS message_send_pid_internal(struct server_id pid, int msg_type, Send a message to a particular pid - no timeout. ****************************************************************************/ -NTSTATUS message_send_pid(struct server_id pid, int msg_type, const void *buf, - size_t len, BOOL duplicates_allowed) +static NTSTATUS message_send_pid(struct server_id pid, int msg_type, + const void *buf, size_t len, + BOOL duplicates_allowed) { return message_send_pid_internal(pid, msg_type, buf, len, duplicates_allowed, 0); } -/**************************************************************************** - Send a message to a particular pid, with timeout in seconds. -****************************************************************************/ - -NTSTATUS message_send_pid_with_timeout(struct server_id pid, int msg_type, - const void *buf, size_t len, - BOOL duplicates_allowed, unsigned int timeout) -{ - return message_send_pid_internal(pid, msg_type, buf, len, duplicates_allowed, - timeout); -} - /**************************************************************************** Count the messages pending for a particular pid. Expensive.... ****************************************************************************/ -- cgit From 8c3f8e5697f29f1a9829298e0561ff7305b62082 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Tue, 15 May 2007 15:49:55 +0000 Subject: r22911: Pass a messaging_context to message_send_all (This used to be commit cc92ce665dcfe9054d09429219883b18a4cab090) --- source3/lib/messages.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 55eed105b3..9c1eba7b1c 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -659,7 +659,8 @@ static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void * * @retval True for success. **/ -BOOL message_send_all(int msg_type, +BOOL message_send_all(struct messaging_context *msg_ctx, + int msg_type, const void *buf, size_t len, BOOL duplicates_allowed, int *n_sent) -- cgit From 56e6e5b8ca9c42f53425ebc48157e4041e52a878 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Wed, 16 May 2007 13:02:53 +0000 Subject: r22934: Change smbcontrol to use messaging_register instead of message_register (This used to be commit e3d985c581ffc597aea932858d27c421643d2868) --- source3/lib/messages.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 9c1eba7b1c..4cbdda61ee 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -723,6 +723,7 @@ struct messaging_callback { struct messaging_context { struct server_id id; + struct event_context *event_ctx; struct messaging_callback *callbacks; }; @@ -740,6 +741,11 @@ static int messaging_context_destructor(struct messaging_context *ctx) return 0; } +struct event_context *messaging_event_context(struct messaging_context *msg_ctx) +{ + return msg_ctx->event_ctx; +} + struct messaging_context *messaging_init(TALLOC_CTX *mem_ctx, struct server_id server_id, struct event_context *ev) @@ -751,6 +757,7 @@ 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)) { -- cgit From 4d5f58c2b945e7a2263ba42749f73c7ba72ab3c7 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sat, 19 May 2007 21:53:28 +0000 Subject: r23015: Make message_(de)register static to messages.c (This used to be commit a8082a3c7c3d1e68c27fc3bf42f3d44402cc6f9f) --- source3/lib/messages.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 4cbdda61ee..667571a75d 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -71,6 +71,12 @@ static struct dispatch_fns { 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. ****************************************************************************/ @@ -147,7 +153,7 @@ static BOOL message_init(struct messaging_context *msg_ctx) /* Register some debugging related messages */ register_msg_pool_usage(msg_ctx); - register_dmalloc_msgs(); + register_dmalloc_msgs(msg_ctx); debug_register_msgs(msg_ctx); return True; @@ -545,11 +551,11 @@ void message_dispatch(void) messages on an *odd* byte boundary. ****************************************************************************/ -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) +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; @@ -582,7 +588,7 @@ void message_register(int msg_type, De-register the function for a particular message type. ****************************************************************************/ -void message_deregister(int msg_type) +static void message_deregister(int msg_type) { struct dispatch_fns *dfn, *next; -- cgit From 23c0e27b6cbedff77ec427191e9f56ee749414aa Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sun, 20 May 2007 17:00:18 +0000 Subject: r23022: Reformatting (This used to be commit 782ee7291683d061767688b23f93ac0865e46331) --- source3/lib/messages.c | 84 ++++++++++++++++++++++++++++---------------------- 1 file changed, 47 insertions(+), 37 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 667571a75d..30056de716 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -285,19 +285,22 @@ static NTSTATUS message_send_pid_internal(struct server_id pid, int msg_type, if (duplicates_allowed) { - /* If duplicates are allowed we can just append the message and return. */ + /* If duplicates are allowed we can just append the message + * and return. */ /* lock the record for the destination */ if (timeout) { - if (tdb_chainlock_with_timeout(tdb, kbuf, timeout) == -1) { - DEBUG(0,("message_send_pid_internal: failed to get " - "chainlock with timeout %ul.\n", timeout)); + if (tdb_chainlock_with_timeout(tdb, kbuf, + timeout) == -1) { + DEBUG(0,("message_send_pid_internal: failed " + "to get chainlock with timeout " + "%ul.\n", timeout)); return NT_STATUS_IO_TIMEOUT; } } else { if (tdb_chainlock(tdb, kbuf) == -1) { - DEBUG(0,("message_send_pid_internal: failed to get " - "chainlock.\n")); + DEBUG(0,("message_send_pid_internal: failed " + "to get chainlock.\n")); return NT_STATUS_LOCK_NOT_GRANTED; } } @@ -312,8 +315,8 @@ static NTSTATUS message_send_pid_internal(struct server_id pid, int msg_type, /* lock the record for the destination */ if (timeout) { if (tdb_chainlock_with_timeout(tdb, kbuf, timeout) == -1) { - DEBUG(0,("message_send_pid_internal: failed to get chainlock " - "with timeout %ul.\n", timeout)); + DEBUG(0,("message_send_pid_internal: failed to get " + "chainlock with timeout %ul.\n", timeout)); return NT_STATUS_IO_TIMEOUT; } } else { @@ -341,16 +344,18 @@ static NTSTATUS message_send_pid_internal(struct server_id pid, int msg_type, for(ptr = old_dbuf.dptr; ptr < old_dbuf.dptr + old_dbuf.dsize; ) { /* - * First check if the message header matches, then, if it's a non-zero - * sized message, check if the data matches. If so it's a duplicate and - * we can discard it. JRA. + * First check if the message header matches, then, if it's a + * non-zero sized message, check if the data matches. If so + * it's a duplicate and we can discard it. JRA. */ if (!memcmp(ptr, &rec, sizeof(rec))) { - if (!len || (len && !memcmp( ptr + sizeof(rec), buf, len))) { + if (!len + || (len + && !memcmp( ptr + sizeof(rec), buf, len))) { tdb_chainunlock(tdb, kbuf); - DEBUG(10,("message_send_pid_internal: discarding " - "duplicate message.\n")); + DEBUG(10,("message_send_pid_internal: " + "discarding duplicate message.\n")); SAFE_FREE(dbuf.dptr); SAFE_FREE(old_dbuf.dptr); return NT_STATUS_OK; @@ -474,7 +479,8 @@ static BOOL message_recv(char *msgs_buf, size_t total_len, int *msg_type, ret_buf += sizeof(rec); if (rec.msg_version != MESSAGE_VERSION) { - DEBUG(0,("message version %d received (expected %d)\n", rec.msg_version, MESSAGE_VERSION)); + DEBUG(0,("message version %d received (expected %d)\n", + rec.msg_version, MESSAGE_VERSION)); return False; } @@ -510,14 +516,17 @@ void message_dispatch(void) if (!received_signal) return; - DEBUG(10,("message_dispatch: received_signal = %d\n", received_signal)); + DEBUG(10, ("message_dispatch: received_signal = %d\n", + received_signal)); received_signal = 0; if (!retrieve_all_messages(&msgs_buf, &total_len)) return; - for (buf = msgs_buf; message_recv(msgs_buf, total_len, &msg_type, &src, &buf, &len); buf += len) { + 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 " @@ -527,7 +536,8 @@ void message_dispatch(void) 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)); + 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); @@ -536,8 +546,8 @@ void message_dispatch(void) } } if (!n_handled) { - DEBUG(5,("message_dispatch: warning: no handler registed for " - "msg_type %d in pid %u\n", + DEBUG(5,("message_dispatch: warning: no handler " + "registed for msg_type %d in pid %u\n", msg_type, (unsigned int)sys_getpid())); } } @@ -566,22 +576,19 @@ static void message_register(int msg_type, } } - dfn = SMB_MALLOC_P(struct dispatch_fns); - - if (dfn != NULL) { + if (!(dfn = SMB_MALLOC_P(struct dispatch_fns))) { + DEBUG(0,("message_register: Not enough memory. malloc " + "failed!\n")); + return; + } - ZERO_STRUCTPN(dfn); + ZERO_STRUCTPN(dfn); - dfn->msg_type = msg_type; - dfn->fn = fn; - dfn->private_data = private_data; + dfn->msg_type = msg_type; + dfn->fn = fn; + dfn->private_data = private_data; - DLIST_ADD(dispatch_fns, dfn); - } - else { - - DEBUG(0,("message_register: Not enough memory. malloc failed!\n")); - } + DLIST_ADD(dispatch_fns, dfn); } /**************************************************************************** @@ -615,7 +622,8 @@ 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, TDB_DATA kbuf, TDB_DATA dbuf, + void *state) { struct connections_data crec; struct msg_all *msg_all = (struct msg_all *)state; @@ -643,10 +651,12 @@ static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void if (NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) { - /* If the pid was not found delete the entry from connections.tdb */ + /* 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)); + 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); } msg_all->n_sent++; -- cgit From e0ebb46cff5d45a0bda6dd525e25ae71dec7ed57 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sun, 20 May 2007 19:43:49 +0000 Subject: r23023: Get rid of the only caller of message_send_pid_with_timeout(). This replaces the timeouts on the individual message send calls with an overall timeout on all the calls. The timeout in message_send_pid_with_timeout() did not make much sense IMO anyway, because the tdb_fetch() for the messages_pending_for_pid was blocking in a readlock anyway, we "just" did the timeout for the write lock. This new code goes through the full wait for the write lock once and then breaks out of sending the notifies instead of running into the timeout per target. Jerry, please check this! Thanks, Volker (This used to be commit 697099f06e1aa432187f802b9c2632607e3de46e) --- source3/lib/messages.c | 10 ---------- 1 file changed, 10 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 30056de716..479a6952a6 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -872,14 +872,4 @@ NTSTATUS messaging_send_buf(struct messaging_context *msg_ctx, return messaging_send(msg_ctx, server, msg_type, &blob); } -NTSTATUS messaging_send_buf_with_timeout(struct messaging_context *msg_ctx, - struct server_id server, - uint32_t msg_type, - const uint8 *buf, size_t len, - int timeout) -{ - return message_send_pid_internal(server, msg_type, buf, len, - True, timeout); -} - /** @} **/ -- cgit From 9e5dbf3fd1c20b78e016080db90c87d97f441355 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sun, 20 May 2007 20:11:23 +0000 Subject: r23024: Ok, neither the duplicates_allowed nor the timeout argument to message_send_pid is used anymore. Two users of duplicates_allowed: winbind and the printer notify system. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I don't thing this really changes semantics: duplicates_allowed is hell racy anyway, we can't guarantee that we don't send the same message in sequence twice, and I think the only thing we can harm with the print notify is performance. For winbind I talked to Günther, and he did not seem too worried. Volker (This used to be commit 75b3ae6a761c33ae6a70799340a1e8c1edea265e) --- source3/lib/messages.c | 124 +++++-------------------------------------------- 1 file changed, 12 insertions(+), 112 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 479a6952a6..7ccc87a3cb 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -4,6 +4,7 @@ Copyright (C) Andrew Tridgell 2000 Copyright (C) 2001 by Martin Pool Copyright (C) 2002 by Jeremy Allison + Copyright (C) 2007 by Volker Lendecke 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 @@ -106,8 +107,7 @@ static void sig_usr1(void) } static NTSTATUS message_send_pid(struct server_id pid, int msg_type, - const void *buf, size_t len, - BOOL duplicates_allowed); + const void *buf, size_t len); /**************************************************************************** A useful function for testing the message system. @@ -120,7 +120,7 @@ static void ping_message(int msg_type, struct server_id src, DEBUG(1,("INFO: Received PING message from PID %s [%s]\n", procid_str_static(&src), msg)); - message_send_pid(src, MSG_PONG, buf, len, True); + message_send_pid(src, MSG_PONG, buf, len); } /**************************************************************************** @@ -240,17 +240,13 @@ static NTSTATUS message_notify(struct server_id procid) Send a message to a particular pid. ****************************************************************************/ -static NTSTATUS message_send_pid_internal(struct server_id pid, int msg_type, - const void *buf, size_t len, - BOOL duplicates_allowed, - unsigned int timeout) +static NTSTATUS message_send_pid(struct server_id pid, int msg_type, + const void *buf, size_t len) { TDB_DATA kbuf; TDB_DATA dbuf; - TDB_DATA old_dbuf; struct message_rec rec; - uint8 *ptr; - struct message_rec prec; + int ret; /* NULL pointer means implicit length zero. */ if (!buf) { @@ -283,112 +279,18 @@ static NTSTATUS message_send_pid_internal(struct server_id pid, int msg_type, dbuf.dsize = len + sizeof(rec); - if (duplicates_allowed) { - - /* If duplicates are allowed we can just append the message - * and return. */ - - /* lock the record for the destination */ - if (timeout) { - if (tdb_chainlock_with_timeout(tdb, kbuf, - timeout) == -1) { - DEBUG(0,("message_send_pid_internal: failed " - "to get chainlock with timeout " - "%ul.\n", timeout)); - return NT_STATUS_IO_TIMEOUT; - } - } else { - if (tdb_chainlock(tdb, kbuf) == -1) { - DEBUG(0,("message_send_pid_internal: failed " - "to get chainlock.\n")); - return NT_STATUS_LOCK_NOT_GRANTED; - } - } - tdb_append(tdb, kbuf, dbuf); - tdb_chainunlock(tdb, kbuf); - - SAFE_FREE(dbuf.dptr); - errno = 0; /* paranoia */ - return message_notify(pid); - } - - /* lock the record for the destination */ - if (timeout) { - if (tdb_chainlock_with_timeout(tdb, kbuf, timeout) == -1) { - DEBUG(0,("message_send_pid_internal: failed to get " - "chainlock with timeout %ul.\n", timeout)); - return NT_STATUS_IO_TIMEOUT; - } - } else { - if (tdb_chainlock(tdb, kbuf) == -1) { - DEBUG(0,("message_send_pid_internal: failed to get " - "chainlock.\n")); - return NT_STATUS_LOCK_NOT_GRANTED; - } - } - - old_dbuf = tdb_fetch(tdb, kbuf); - - if (!old_dbuf.dptr) { - /* its a new record */ - - tdb_store(tdb, kbuf, dbuf, TDB_REPLACE); - tdb_chainunlock(tdb, kbuf); - - SAFE_FREE(dbuf.dptr); - errno = 0; /* paranoia */ - return message_notify(pid); - } - - /* Not a new record. Check for duplicates. */ + ret = tdb_append(tdb, kbuf, dbuf); - for(ptr = old_dbuf.dptr; ptr < old_dbuf.dptr + old_dbuf.dsize; ) { - /* - * First check if the message header matches, then, if it's a - * non-zero sized message, check if the data matches. If so - * it's a duplicate and we can discard it. JRA. - */ + SAFE_FREE(dbuf.dptr); - if (!memcmp(ptr, &rec, sizeof(rec))) { - if (!len - || (len - && !memcmp( ptr + sizeof(rec), buf, len))) { - tdb_chainunlock(tdb, kbuf); - DEBUG(10,("message_send_pid_internal: " - "discarding duplicate message.\n")); - SAFE_FREE(dbuf.dptr); - SAFE_FREE(old_dbuf.dptr); - return NT_STATUS_OK; - } - } - memcpy(&prec, ptr, sizeof(prec)); - ptr += sizeof(rec) + prec.len; + if (ret == -1) { + return NT_STATUS_INTERNAL_ERROR; } - /* we're adding to an existing entry */ - - tdb_append(tdb, kbuf, dbuf); - tdb_chainunlock(tdb, kbuf); - - SAFE_FREE(old_dbuf.dptr); - SAFE_FREE(dbuf.dptr); - errno = 0; /* paranoia */ return message_notify(pid); } -/**************************************************************************** - Send a message to a particular pid - no timeout. -****************************************************************************/ - -static NTSTATUS message_send_pid(struct server_id pid, int msg_type, - const void *buf, size_t len, - BOOL duplicates_allowed) -{ - return message_send_pid_internal(pid, msg_type, buf, len, - duplicates_allowed, 0); -} - /**************************************************************************** Count the messages pending for a particular pid. Expensive.... ****************************************************************************/ @@ -646,8 +548,7 @@ static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, * 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, - msg_all->duplicates); + msg_all->buf, msg_all->len); if (NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) { @@ -860,8 +761,7 @@ NTSTATUS messaging_send(struct messaging_context *msg_ctx, struct server_id server, uint32_t msg_type, const DATA_BLOB *data) { - return message_send_pid_internal(server, msg_type, data->data, - data->length, True, 0); + return message_send_pid(server, msg_type, data->data, data->length); } NTSTATUS messaging_send_buf(struct messaging_context *msg_ctx, -- cgit From 772d8b0cd3e97d0314aab4195c8520711532d0f0 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sun, 20 May 2007 20:28:45 +0000 Subject: r23025: Some logic simplifications (This used to be commit d3f16722b2c3c68b03e55b5100d979921c3f284d) --- source3/lib/messages.c | 56 ++++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 29 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 7ccc87a3cb..95f4aba4e7 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -208,32 +208,36 @@ static NTSTATUS message_notify(struct server_id procid) errno = saved_errno; } - if (ret == -1) { - 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; - } + if (ret == 0) { + return NT_STATUS_OK; + } - DEBUG(2,("message to process %d failed - %s\n", (int)pid, - strerror(errno))); + /* + * 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)); /* - * No call to map_nt_error_from_unix -- don't want to link in - * errormap.o into lots of utils. + * INVALID_HANDLE is the closest I can think of -- vl */ - - if (errno == EINVAL) return NT_STATUS_INVALID_PARAMETER; - if (errno == EPERM) return NT_STATUS_ACCESS_DENIED; - return NT_STATUS_UNSUCCESSFUL; + return NT_STATUS_INVALID_HANDLE; } - return NT_STATUS_OK; + DEBUG(2,("message to process %d failed - %s\n", (int)pid, + strerror(errno))); + + /* + * No call to map_nt_error_from_unix -- don't want to link in + * errormap.o into lots of utils. + */ + + if (errno == EINVAL) return NT_STATUS_INVALID_PARAMETER; + if (errno == EPERM) return NT_STATUS_ACCESS_DENIED; + return NT_STATUS_UNSUCCESSFUL; } /**************************************************************************** @@ -243,7 +247,6 @@ static NTSTATUS message_notify(struct server_id procid) static NTSTATUS message_send_pid(struct server_id pid, int msg_type, const void *buf, size_t len) { - TDB_DATA kbuf; TDB_DATA dbuf; struct message_rec rec; int ret; @@ -266,8 +269,6 @@ static NTSTATUS message_send_pid(struct server_id pid, int msg_type, rec.src = procid_self(); rec.len = buf ? len : 0; - kbuf = message_key_pid(pid); - dbuf.dptr = (uint8 *)SMB_MALLOC(len + sizeof(rec)); if (!dbuf.dptr) { return NT_STATUS_NO_MEMORY; @@ -279,7 +280,7 @@ static NTSTATUS message_send_pid(struct server_id pid, int msg_type, dbuf.dsize = len + sizeof(rec); - ret = tdb_append(tdb, kbuf, dbuf); + ret = tdb_append(tdb, message_key_pid(pid), dbuf); SAFE_FREE(dbuf.dptr); @@ -297,14 +298,11 @@ static NTSTATUS message_send_pid(struct server_id pid, int msg_type, unsigned int messages_pending_for_pid(struct server_id pid) { - TDB_DATA kbuf; TDB_DATA dbuf; uint8 *buf; unsigned int message_count = 0; - kbuf = message_key_pid(pid); - - dbuf = tdb_fetch(tdb, kbuf); + dbuf = tdb_fetch(tdb, message_key_pid(pid)); if (dbuf.dptr == NULL || dbuf.dsize == 0) { SAFE_FREE(dbuf.dptr); return 0; @@ -337,7 +335,7 @@ static BOOL retrieve_all_messages(char **msgs_buf, size_t *total_len) *msgs_buf = NULL; *total_len = 0; - kbuf = message_key_pid(pid_to_procid(sys_getpid())); + kbuf = message_key_pid(procid_self()); if (tdb_chainlock(tdb, kbuf) == -1) return False; -- cgit From ac3f08ddbe0b484375624db0e35999a8584b57f4 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Mon, 21 May 2007 22:17:13 +0000 Subject: 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 used to be commit eaefd00563173dfabb7716c5695ac0a2f7139bb6) --- source3/lib/messages.c | 597 ++++++++++++++++++++++--------------------------- 1 file changed, 267 insertions(+), 330 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 95f4aba4e7..6932369b21 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -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; -}; - -/* 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); +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; -} *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; - - tdb = tdb_open_log(lock_path("messages.tdb"), - 0, TDB_CLEAR_IF_FIRST|TDB_DEFAULT, - O_RDWR|O_CREAT,0600); + msg_ctx->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; + if (!(mem_ctx = talloc_init("message_send_pid"))) { + return NT_STATUS_NO_MEMORY; + } + + if (tdb_chainlock(msg_tdb, key) == -1) { + return NT_STATUS_LOCK_NOT_GRANTED; + } + + 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; + } - dbuf.dptr = (uint8 *)SMB_MALLOC(len + sizeof(rec)); - if (!dbuf.dptr) { + 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; } - memcpy(dbuf.dptr, &rec, sizeof(rec)); - if (len > 0 && buf) - memcpy((void *)((char*)dbuf.dptr+sizeof(rec)), buf, len); + 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); - dbuf.dsize = len + sizeof(rec); + msg_array->messages = rec; + msg_array->num_messages += 1; - ret = tdb_append(tdb, message_key_pid(pid), dbuf); + status = messaging_tdb_store(msg_tdb, key, msg_array); - SAFE_FREE(dbuf.dptr); + tdb_chainunlock(msg_tdb, key); + TALLOC_FREE(mem_ctx); + + if (!NT_STATUS_IS_OK(status)) { + return status; + } + + status = message_notify(pid); - if (ret == -1) { - return NT_STATUS_INTERNAL_ERROR; + 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)); } - errno = 0; /* paranoia */ - return message_notify(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; - - ZERO_STRUCT(null_dbuf); - - *msgs_buf = NULL; - *total_len = 0; + struct messaging_array *result; + TDB_DATA key = message_key_pid(procid_self()); + NTSTATUS status; - kbuf = message_key_pid(procid_self()); + if (tdb_chainlock(msg_tdb, key) == -1) { + return NT_STATUS_LOCK_NOT_GRANTED; + } - if (tdb_chainlock(tdb, kbuf) == -1) - return False; + status = messaging_tdb_fetch(msg_tdb, key, mem_ctx, &result); - dbuf = tdb_fetch(tdb, kbuf); /* - * Replace with an empty record to keep the allocated - * space in the tdb. + * We delete the record here, tdb_set_max_dead keeps it around */ - tdb_store(tdb, kbuf, null_dbuf, TDB_REPLACE); - tdb_chainunlock(tdb, kbuf); + tdb_delete(msg_tdb, key); + tdb_chainunlock(msg_tdb, key); - if (dbuf.dptr == NULL || dbuf.dsize == 0) { - SAFE_FREE(dbuf.dptr); - return False; + if (NT_STATUS_IS_OK(status)) { + *presult = result; } - *msgs_buf = (char *)dbuf.dptr; - *total_len = dbuf.dsize; - - return True; + 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; - - *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; - } + struct messaging_callback *cb, *next; - if (rec.len > 0) { - if (total_len - (ret_buf - msgs_buf) < rec.len) - 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; + } } - - *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())); - } + for (i=0; inum_messages; i++) { + messaging_dispatch_rec(msg_ctx, &msg_array->messages[i]); } - SAFE_FREE(msgs_buf); + + 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, -- cgit From 2991d3416b688a9b29ac891a9e5571099c333267 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Tue, 22 May 2007 14:31:26 +0000 Subject: r23077: Minor cleanup (This used to be commit 72ed8388252bed07627b3a4636744dc8acf1c98b) --- source3/lib/messages.c | 4 ---- 1 file changed, 4 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 6932369b21..bad6bdf1a9 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -82,10 +82,6 @@ static void sig_usr1(void) sys_select_signal(SIGUSR1); } -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. ****************************************************************************/ -- cgit From ff0ac5b0e7f9163760b2863f48389e4943ac2154 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Thu, 24 May 2007 11:09:37 +0000 Subject: r23112: Trim down the message.c API slightly: The messages_pending_for_pid is now replaced by MSG_FLAG_LOWPRIORITY or'ed into the msg_type. To enable this, changed the msg_type definitions to hexadecimal. This way we could theoretically add the MSG_FLAG_NODUPLICATES again, but I would rather not do this, because that one is racy and can't be guaranteed at all. (This used to be commit 3f5eb8a9600839a9f9c44c553f0bda6df22b30b0) --- source3/lib/messages.c | 97 +++++++++++++++++++++----------------------------- 1 file changed, 41 insertions(+), 56 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index bad6bdf1a9..e1434ff01f 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -70,6 +70,8 @@ struct messaging_context { struct server_id id; struct event_context *event_ctx; struct messaging_callback *callbacks; + + }; /**************************************************************************** @@ -103,7 +105,7 @@ static void ping_message(struct messaging_context *msg_ctx, Initialise the messaging functions. ****************************************************************************/ -static BOOL message_init(struct messaging_context *msg_ctx) +static BOOL message_tdb_init(struct messaging_context *msg_ctx) { sec_init(); @@ -121,14 +123,6 @@ static BOOL message_init(struct messaging_context *msg_ctx) CatchSignal(SIGUSR1, SIGNAL_CAST sig_usr1); - messaging_register(msg_ctx, NULL, MSG_PING, ping_message); - - /* Register some debugging related messages */ - - register_msg_pool_usage(msg_ctx); - register_dmalloc_msgs(msg_ctx); - debug_register_msgs(msg_ctx); - return True; } @@ -300,9 +294,9 @@ static NTSTATUS message_notify(struct server_id procid) Send a message to a particular pid. ****************************************************************************/ -static NTSTATUS messaging_tdb_send(TDB_CONTEXT *msg_tdb, +static NTSTATUS messaging_tdb_send(struct messaging_context *msg_ctx, struct server_id pid, int msg_type, - const void *buf, size_t len) + const DATA_BLOB *data) { struct messaging_array *msg_array; struct messaging_rec *rec; @@ -311,8 +305,8 @@ static NTSTATUS messaging_tdb_send(TDB_CONTEXT *msg_tdb, TDB_DATA key = message_key_pid(pid); /* NULL pointer means implicit length zero. */ - if (!buf) { - SMB_ASSERT(len == 0); + if (!data->data) { + SMB_ASSERT(data->length == 0); } /* @@ -326,42 +320,45 @@ static NTSTATUS messaging_tdb_send(TDB_CONTEXT *msg_tdb, return NT_STATUS_NO_MEMORY; } - if (tdb_chainlock(msg_tdb, key) == -1) { + if (tdb_chainlock(msg_ctx->tdb, key) == -1) { + TALLOC_FREE(mem_ctx); return NT_STATUS_LOCK_NOT_GRANTED; } - status = messaging_tdb_fetch(msg_tdb, key, mem_ctx, &msg_array); + status = messaging_tdb_fetch(msg_ctx->tdb, key, mem_ctx, &msg_array); if (!NT_STATUS_IS_OK(status)) { - tdb_chainunlock(msg_tdb, key); - TALLOC_FREE(mem_ctx); - return status; + goto done; + } + + if ((msg_type & MSG_FLAG_LOWPRIORITY) + && (msg_array->num_messages > 1000)) { + DEBUG(5, ("Dropping message for PID %s\n", + procid_str_static(&pid))); + status = NT_STATUS_INSUFFICIENT_RESOURCES; + goto done; } 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; + status = NT_STATUS_NO_MEMORY; + goto done; } rec[msg_array->num_messages].msg_version = MESSAGE_VERSION; - rec[msg_array->num_messages].msg_type = msg_type; + rec[msg_array->num_messages].msg_type = msg_type & MSG_TYPE_MASK; 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); + rec[msg_array->num_messages].buf = *data; 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); + status = messaging_tdb_store(msg_ctx->tdb, key, msg_array); if (!NT_STATUS_IS_OK(status)) { - return status; + goto done; } status = message_notify(pid); @@ -369,34 +366,15 @@ static NTSTATUS messaging_tdb_send(TDB_CONTEXT *msg_tdb, 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)); + tdb_delete(msg_ctx->tdb, message_key_pid(pid)); } + done: + tdb_chainunlock(msg_ctx->tdb, key); + TALLOC_FREE(mem_ctx); return status; } -/**************************************************************************** - Count the messages pending for a particular pid. Expensive.... -****************************************************************************/ - -unsigned int messages_pending_for_pid(struct messaging_context *msg_ctx, - struct server_id pid) -{ - struct messaging_array *msg_array; - unsigned int result; - - 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; - } - - result = msg_array->num_messages; - TALLOC_FREE(msg_array); - return result; -} - /**************************************************************************** Retrieve all messages for the current process. ****************************************************************************/ @@ -619,11 +597,19 @@ struct messaging_context *messaging_init(TALLOC_CTX *mem_ctx, ctx->id = server_id; ctx->event_ctx = ev; - if (!message_init(ctx)) { + if (!message_tdb_init(ctx)) { DEBUG(0, ("message_init failed: %s\n", strerror(errno))); TALLOC_FREE(ctx); } + messaging_register(ctx, NULL, MSG_PING, ping_message); + + /* Register some debugging related messages */ + + register_msg_pool_usage(ctx); + register_dmalloc_msgs(ctx); + debug_register_msgs(ctx); + return ctx; } @@ -688,11 +674,10 @@ void messaging_deregister(struct messaging_context *ctx, uint32_t msg_type, Send a message to a particular server */ NTSTATUS messaging_send(struct messaging_context *msg_ctx, - struct server_id server, - uint32_t msg_type, const DATA_BLOB *data) + struct server_id server, uint32_t msg_type, + const DATA_BLOB *data) { - return messaging_tdb_send(msg_ctx->tdb, server, msg_type, - data->data, data->length); + return messaging_tdb_send(msg_ctx, server, msg_type, data); } NTSTATUS messaging_send_buf(struct messaging_context *msg_ctx, -- cgit From f260b45d646ae69602f63c1f6a002384b4828a1c Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Thu, 24 May 2007 14:47:24 +0000 Subject: r23117: Factor out local messaging. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This removes message_block / message_unblock. I've talked to Jeremy and Günther, giving them my reasons why I believe they have no effect. Neither could come up with a counter-argument, so they go :-) (This used to be commit a925e0991ffbaea4a533bab3a5d61e5d367d46c8) --- source3/lib/messages.c | 425 +++---------------------------------------------- 1 file changed, 26 insertions(+), 399 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index e1434ff01f..056286f89a 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -50,12 +50,6 @@ #include "librpc/gen_ndr/messaging.h" #include "librpc/gen_ndr/ndr_messaging.h" -/* the locking database handle */ -static int received_signal; - -/* change the message version with any incompatible changes in the protocol */ -#define MESSAGE_VERSION 2 - struct messaging_callback { struct messaging_callback *prev, *next; uint32 msg_type; @@ -65,25 +59,6 @@ struct messaging_callback { void *private_data; }; -struct messaging_context { - TDB_CONTEXT *tdb; - struct server_id id; - struct event_context *event_ctx; - struct messaging_callback *callbacks; - - -}; - -/**************************************************************************** - Notifications come in as signals. -****************************************************************************/ - -static void sig_usr1(void) -{ - received_signal = 1; - sys_select_signal(SIGUSR1); -} - /**************************************************************************** A useful function for testing the message system. ****************************************************************************/ @@ -101,362 +76,6 @@ static void ping_message(struct messaging_context *msg_ctx, messaging_send(msg_ctx, src, MSG_PONG, data); } -/**************************************************************************** - Initialise the messaging functions. -****************************************************************************/ - -static BOOL message_tdb_init(struct messaging_context *msg_ctx) -{ - sec_init(); - - msg_ctx->tdb = tdb_open_log(lock_path("messages.tdb"), - 0, TDB_CLEAR_IF_FIRST|TDB_DEFAULT, - O_RDWR|O_CREAT,0600); - - if (!msg_ctx->tdb) { - DEBUG(0,("ERROR: Failed to initialise messages database\n")); - return False; - } - - /* Activate the per-hashchain freelist */ - tdb_set_max_dead(msg_ctx->tdb, 5); - - CatchSignal(SIGUSR1, SIGNAL_CAST sig_usr1); - - return True; -} - -/******************************************************************* - Form a static tdb key from a pid. -******************************************************************/ - -static TDB_DATA message_key_pid(struct server_id pid) -{ - static char key[20]; - TDB_DATA kbuf; - - slprintf(key, sizeof(key)-1, "PID/%s", procid_str_static(&pid)); - - kbuf.dptr = (uint8 *)key; - kbuf.dsize = strlen(key)+1; - 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. -****************************************************************************/ - -static NTSTATUS message_notify(struct server_id procid) -{ - pid_t pid = procid.pid; - int ret; - uid_t euid = geteuid(); - - /* - * Doing kill with a non-positive pid causes messages to be - * sent to places we don't want. - */ - - SMB_ASSERT(pid > 0); - - if (euid != 0) { - /* If we're not root become so to send the message. */ - save_re_uid(); - set_effective_uid(0); - } - - ret = kill(pid, SIGUSR1); - - if (euid != 0) { - /* Go back to who we were. */ - int saved_errno = errno; - restore_re_uid_fromroot(); - errno = saved_errno; - } - - if (ret == 0) { - return NT_STATUS_OK; - } - - /* - * Something has gone wrong - */ - - DEBUG(2,("message to process %d failed - %s\n", (int)pid, - strerror(errno))); - - /* - * No call to map_nt_error_from_unix -- don't want to link in - * 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; -} - -/**************************************************************************** - Send a message to a particular pid. -****************************************************************************/ - -static NTSTATUS messaging_tdb_send(struct messaging_context *msg_ctx, - struct server_id pid, int msg_type, - const DATA_BLOB *data) -{ - 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 (!data->data) { - SMB_ASSERT(data->length == 0); - } - - /* - * Doing kill with a non-positive pid causes messages to be - * sent to places we don't want. - */ - - SMB_ASSERT(procid_to_pid(&pid) > 0); - - if (!(mem_ctx = talloc_init("message_send_pid"))) { - return NT_STATUS_NO_MEMORY; - } - - if (tdb_chainlock(msg_ctx->tdb, key) == -1) { - TALLOC_FREE(mem_ctx); - return NT_STATUS_LOCK_NOT_GRANTED; - } - - status = messaging_tdb_fetch(msg_ctx->tdb, key, mem_ctx, &msg_array); - - if (!NT_STATUS_IS_OK(status)) { - goto done; - } - - if ((msg_type & MSG_FLAG_LOWPRIORITY) - && (msg_array->num_messages > 1000)) { - DEBUG(5, ("Dropping message for PID %s\n", - procid_str_static(&pid))); - status = NT_STATUS_INSUFFICIENT_RESOURCES; - goto done; - } - - if (!(rec = TALLOC_REALLOC_ARRAY(mem_ctx, msg_array->messages, - struct messaging_rec, - msg_array->num_messages+1))) { - status = NT_STATUS_NO_MEMORY; - goto done; - } - - rec[msg_array->num_messages].msg_version = MESSAGE_VERSION; - rec[msg_array->num_messages].msg_type = msg_type & MSG_TYPE_MASK; - rec[msg_array->num_messages].dest = pid; - rec[msg_array->num_messages].src = procid_self(); - rec[msg_array->num_messages].buf = *data; - - msg_array->messages = rec; - msg_array->num_messages += 1; - - status = messaging_tdb_store(msg_ctx->tdb, key, msg_array); - - if (!NT_STATUS_IS_OK(status)) { - goto done; - } - - 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_ctx->tdb, message_key_pid(pid)); - } - - done: - tdb_chainunlock(msg_ctx->tdb, key); - TALLOC_FREE(mem_ctx); - return status; -} - -/**************************************************************************** - Retrieve all messages for the current process. -****************************************************************************/ - -static NTSTATUS retrieve_all_messages(TDB_CONTEXT *msg_tdb, - TALLOC_CTX *mem_ctx, - struct messaging_array **presult) -{ - struct messaging_array *result; - TDB_DATA key = message_key_pid(procid_self()); - NTSTATUS status; - - if (tdb_chainlock(msg_tdb, key) == -1) { - return NT_STATUS_LOCK_NOT_GRANTED; - } - - status = messaging_tdb_fetch(msg_tdb, key, mem_ctx, &result); - - /* - * 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; -} - -/* - Dispatch one messsaging_rec -*/ -static void messaging_dispatch_rec(struct messaging_context *msg_ctx, - struct messaging_rec *rec) -{ - struct messaging_callback *cb, *next; - - 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; - } - } - return; -} - -/**************************************************************************** - Receive and dispatch any messages pending for this process. - JRA changed Dec 13 2006. Only one message handler now permitted per type. - *NOTE*: Dispatch functions must be able to cope with incoming - messages on an *odd* byte boundary. -****************************************************************************/ - -void message_dispatch(struct messaging_context *msg_ctx) -{ - struct messaging_array *msg_array = NULL; - uint32 i; - - if (!received_signal) - return; - - DEBUG(10, ("message_dispatch: received_signal = %d\n", - received_signal)); - - received_signal = 0; - - if (!NT_STATUS_IS_OK(retrieve_all_messages(msg_ctx->tdb, NULL, - &msg_array))) { - return; - } - - for (i=0; inum_messages; i++) { - messaging_dispatch_rec(msg_ctx, &msg_array->messages[i]); - } - - TALLOC_FREE(msg_array); -} - /**************************************************************************** Register/replace a dispatch function for a particular message type. JRA changed Dec 13 2006. Only one message handler now permitted per type. @@ -564,21 +183,6 @@ BOOL message_send_all(struct messaging_context *msg_ctx, return True; } -/* - * Block and unblock receiving of messages. Allows removal of race conditions - * when doing a fork and changing message disposition. - */ - -void message_block(void) -{ - BlockSignals(True, SIGUSR1); -} - -void message_unblock(void) -{ - BlockSignals(False, SIGUSR1); -} - struct event_context *messaging_event_context(struct messaging_context *msg_ctx) { return msg_ctx->event_ctx; @@ -589,6 +193,7 @@ struct messaging_context *messaging_init(TALLOC_CTX *mem_ctx, struct event_context *ev) { struct messaging_context *ctx; + NTSTATUS status; if (!(ctx = TALLOC_ZERO_P(mem_ctx, struct messaging_context))) { return NULL; @@ -597,8 +202,10 @@ struct messaging_context *messaging_init(TALLOC_CTX *mem_ctx, ctx->id = server_id; ctx->event_ctx = ev; - if (!message_tdb_init(ctx)) { - DEBUG(0, ("message_init failed: %s\n", strerror(errno))); + status = messaging_tdb_init(ctx, ctx, &ctx->local); + + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0, ("message_init failed: %s\n", nt_errstr(status))); TALLOC_FREE(ctx); } @@ -677,7 +284,8 @@ NTSTATUS messaging_send(struct messaging_context *msg_ctx, struct server_id server, uint32_t msg_type, const DATA_BLOB *data) { - return messaging_tdb_send(msg_ctx, server, msg_type, data); + return msg_ctx->local->send_fn(msg_ctx, server, msg_type, data, + msg_ctx->local); } NTSTATUS messaging_send_buf(struct messaging_context *msg_ctx, @@ -688,4 +296,23 @@ NTSTATUS messaging_send_buf(struct messaging_context *msg_ctx, return messaging_send(msg_ctx, server, msg_type, &blob); } +/* + Dispatch one messsaging_rec +*/ +void messaging_dispatch_rec(struct messaging_context *msg_ctx, + struct messaging_rec *rec) +{ + struct messaging_callback *cb, *next; + + 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; + } + } + return; +} + /** @} **/ -- cgit From 054bf2fc8bd8ac62e16ec04001c0a4a8409d0e1d Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Mon, 28 May 2007 11:38:42 +0000 Subject: r23171: Convert connections.tdb to dbwrap (This used to be commit 80a1f43825063bbbda896175d99700ede5a4757a) --- source3/lib/messages.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 056286f89a..01683bf9ec 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -96,12 +96,12 @@ struct msg_all { Send one of the messages for the broadcast. ****************************************************************************/ -static int traverse_fn(TDB_CONTEXT *the_tdb, +static int traverse_fn(struct db_record *rec, const struct connections_key *ckey, const struct connections_data *crec, - void *private_data) + void *state) { - struct msg_all *msg_all = (struct msg_all *)private_data; + struct msg_all *msg_all = (struct msg_all *)state; NTSTATUS status; if (crec->cnum != -1) @@ -120,20 +120,14 @@ static int traverse_fn(TDB_CONTEXT *the_tdb, (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)); + /* If the pid was not found delete the entry from connections.tdb */ - key.dptr = (uint8 *)ckey; - key.dsize = sizeof(*ckey); + 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, key); + rec->delete_rec(rec); } msg_all->n_sent++; return 0; -- cgit From 3f5742e20b30010ef88e19b6ee41c6b071258aee Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Tue, 29 May 2007 14:49:19 +0000 Subject: r23204: Add MSG_SMB_BRL_VALIDATE. Tridge, this is a bit different from your bzr branch, please check if it fulfils your needs. Two changes: The validation is not done inside the brlock.c traverse_fn, it's done as a separate routine. Secondly, this patch does not call the checker routines in smbcontrol directly but depends on a running smbd. (This used to be commit 7e39d77c1f90d9025cab08918385d140e20ca25b) --- source3/lib/messages.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 01683bf9ec..256d4d097c 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -199,7 +199,7 @@ struct messaging_context *messaging_init(TALLOC_CTX *mem_ctx, status = messaging_tdb_init(ctx, ctx, &ctx->local); if (!NT_STATUS_IS_OK(status)) { - DEBUG(0, ("message_init failed: %s\n", nt_errstr(status))); + DEBUG(0, ("messaging_tdb_init failed: %s\n", nt_errstr(status))); TALLOC_FREE(ctx); } -- cgit From f96193a2cb18c86f625532f8824dde01ed193ce7 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Mon, 4 Jun 2007 19:45:41 +0000 Subject: r23343: Fix error return (This used to be commit 0014ee44b87a4a109c897ffec5f9c38eea442571) --- source3/lib/messages.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 256d4d097c..b796e1472c 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -199,8 +199,10 @@ struct messaging_context *messaging_init(TALLOC_CTX *mem_ctx, status = messaging_tdb_init(ctx, ctx, &ctx->local); if (!NT_STATUS_IS_OK(status)) { - DEBUG(0, ("messaging_tdb_init failed: %s\n", nt_errstr(status))); + DEBUG(0, ("messaging_tdb_init failed: %s\n", + nt_errstr(status))); TALLOC_FREE(ctx); + return NULL; } messaging_register(ctx, NULL, MSG_PING, ping_message); -- cgit From de565785f5e1f097bd75f57331425c4185185f80 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sun, 10 Jun 2007 17:02:09 +0000 Subject: r23410: Merge the core of the cluster code. I'm 100% certain I've forgotten to merge something, but the main code should be in. It's mainly in dbwrap_ctdb.c, ctdbd_conn.c and messages_ctdbd.c. There should be no changes to the non-cluster case, it does survive make test on my laptop. It survives some very basic tests with ctdbd enables, I did not do the full test suite for clusters yet. Phew... Volker (This used to be commit 15553d6327a3aecdd2b0b94a3656d04bf4106323) --- source3/lib/messages.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index b796e1472c..54657d8d56 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -205,6 +205,19 @@ struct messaging_context *messaging_init(TALLOC_CTX *mem_ctx, return NULL; } +#ifdef CLUSTER_SUPPORT + if (lp_clustering()) { + status = messaging_ctdbd_init(ctx, ctx, &ctx->remote); + + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0, ("messaging_ctdb_init failed: %s\n", + nt_errstr(status))); + TALLOC_FREE(ctx); + return NULL; + } + } +#endif + messaging_register(ctx, NULL, MSG_PING, ping_message); /* Register some debugging related messages */ @@ -216,6 +229,34 @@ struct messaging_context *messaging_init(TALLOC_CTX *mem_ctx, return ctx; } +/* + * re-init after a fork + */ +NTSTATUS messaging_reinit(struct messaging_context *msg_ctx) +{ +#ifdef CLUSTER_SUPPORT + + TALLOC_FREE(msg_ctx->remote); + + if (lp_clustering()) { + NTSTATUS status; + + status = messaging_ctdbd_init(msg_ctx, msg_ctx, + &msg_ctx->remote); + + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0, ("messaging_ctdb_init failed: %s\n", + nt_errstr(status))); + return status; + } + } + +#endif + + return NT_STATUS_OK; +} + + /* * Register a dispatch function for a particular message type. Allow multiple * registrants -- cgit From d824b98f80ba186030cbb70b3a1e5daf80469ecd Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Mon, 9 Jul 2007 19:25:36 +0000 Subject: r23779: Change from v2 or later to v3 or later. Jeremy. (This used to be commit 407e6e695b8366369b7c76af1ff76869b45347b3) --- source3/lib/messages.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 54657d8d56..6fdf12f515 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -8,7 +8,7 @@ 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 + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, -- cgit From 5e54558c6dea67b56bbfaba5698f3a434d3dffb6 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 10 Jul 2007 00:52:41 +0000 Subject: r23784: use the GPLv3 boilerplate as recommended by the FSF and the license text (This used to be commit b0132e94fc5fef936aa766fb99a306b3628e9f07) --- source3/lib/messages.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 6fdf12f515..a7925ace7a 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -17,8 +17,7 @@ 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. + along with this program. If not, see . */ /** -- cgit From 33c57437a497f14c6f554c254cbb00b08f73e382 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Tue, 24 Jul 2007 11:47:37 +0000 Subject: r24032: It helps testing tremendously if the cluster messaging actually sends and receives messages to other nodes... :-) (This used to be commit 3e9e9a3f28763500a1c5e551a808a14661d7d9fa) --- source3/lib/messages.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index a7925ace7a..c153953fb7 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -320,6 +320,13 @@ NTSTATUS messaging_send(struct messaging_context *msg_ctx, struct server_id server, uint32_t msg_type, const DATA_BLOB *data) { +#ifdef CLUSTER_SUPPORT + if (!procid_is_local(&server)) { + return msg_ctx->remote->send_fn(msg_ctx, server, + msg_type, data, + msg_ctx->remote); + } +#endif return msg_ctx->local->send_fn(msg_ctx, server, msg_type, data, msg_ctx->local); } -- cgit From 30191d1a5704ad2b158386b511558972d539ce47 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 18 Oct 2007 17:40:25 -0700 Subject: RIP BOOL. Convert BOOL -> bool. I found a few interesting bugs in various places whilst doing this (places that assumed BOOL == int). I also need to fix the Samba4 pidl generation (next checkin). Jeremy. (This used to be commit f35a266b3cbb3e5fa6a86be60f34fe340a3ca71f) --- source3/lib/messages.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index c153953fb7..5cd575466f 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -144,7 +144,7 @@ static int traverse_fn(struct db_record *rec, * * @retval True for success. **/ -BOOL message_send_all(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) -- cgit From c316c7ab737b5e849d1704032ac77d9853c310ba Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 31 Mar 2008 12:50:23 +0200 Subject: messaging: add FLAG_MSG_DBWRAP message class flag metze (This used to be commit ee6325495f48bab43a37d740a6eca57192004d57) --- source3/lib/messages.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 5cd575466f..ea03f8d43b 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -162,6 +162,8 @@ bool message_send_all(struct messaging_context *msg_ctx, msg_all.msg_flag = FLAG_MSG_PRINT_GENERAL; else if (msg_type > 3000 && msg_type < 4000) msg_all.msg_flag = FLAG_MSG_SMBD; + else if (msg_type > 4000 && msg_type < 5000) + msg_all.msg_flag = FLAG_MSG_DBWRAP; else return False; -- cgit From 0412c203867d6f81924f0bb0e033663dac0a33be Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Tue, 24 Jun 2008 15:08:21 +0200 Subject: messages: bump debug level to 1 for "messaging_ctdb_init failed". Leave level 0 messages to higher level callers. Michael (This used to be commit 7bbf29137bf051044cbf0db8d9fe564a7c9d7a29) --- source3/lib/messages.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source3/lib/messages.c') diff --git a/source3/lib/messages.c b/source3/lib/messages.c index ea03f8d43b..f5933cafdb 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -211,7 +211,7 @@ struct messaging_context *messaging_init(TALLOC_CTX *mem_ctx, status = messaging_ctdbd_init(ctx, ctx, &ctx->remote); if (!NT_STATUS_IS_OK(status)) { - DEBUG(0, ("messaging_ctdb_init failed: %s\n", + DEBUG(1, ("messaging_ctdb_init failed: %s\n", nt_errstr(status))); TALLOC_FREE(ctx); return NULL; @@ -246,7 +246,7 @@ NTSTATUS messaging_reinit(struct messaging_context *msg_ctx) &msg_ctx->remote); if (!NT_STATUS_IS_OK(status)) { - DEBUG(0, ("messaging_ctdb_init failed: %s\n", + DEBUG(1, ("messaging_ctdb_init failed: %s\n", nt_errstr(status))); return status; } -- cgit