The branch, master has been updated via e8eb47f docs: Add num-children to smbcontrol manpage via 84d8b2b smbd: Make "num_children" available by smbcontrol from 168db8b waf: Fix the FreeBSD build with libinotify
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit e8eb47f6ee2b2dc128140e068ade0d22edc98518 Author: Christof Schmitt <c...@samba.org> Date: Thu Jan 2 10:49:26 2014 -0700 docs: Add num-children to smbcontrol manpage Signed-off-by: Christof Schmitt <c...@samba.org> Reviewed-by: Volker Lendecke <v...@samba.org> Autobuild-User(master): Christof Schmitt <c...@samba.org> Autobuild-Date(master): Mon Jan 6 23:20:24 CET 2014 on sn-devel-104 commit 84d8b2b01324433f7d0861042c53ffcb57dc3ccf Author: Volker Lendecke <v...@samba.org> Date: Mon May 6 11:23:03 2013 +0200 smbd: Make "num_children" available by smbcontrol Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Christof Schmit <c...@samba.org> ----------------------------------------------------------------------- Summary of changes: docs-xml/manpages/smbcontrol.1.xml | 7 +++++ source3/librpc/idl/messaging.idl | 4 +++ source3/smbd/process.c | 2 + source3/smbd/server.c | 16 +++++++++++ source3/utils/smbcontrol.c | 49 ++++++++++++++++++++++++++++++++++++ 5 files changed, 78 insertions(+), 0 deletions(-) Changeset truncated at 500 lines: diff --git a/docs-xml/manpages/smbcontrol.1.xml b/docs-xml/manpages/smbcontrol.1.xml index 4c36d63..e8fef42 100644 --- a/docs-xml/manpages/smbcontrol.1.xml +++ b/docs-xml/manpages/smbcontrol.1.xml @@ -304,6 +304,13 @@ </variablelist> </varlistentry> + <varlistentry> + <term>num-children</term> + <listitem><para>Query the number of smbd child processes. This + message can only be sent + to <constant>smbd</constant>.</para></listitem> + </varlistentry> + </variablelist> </refsect1> diff --git a/source3/librpc/idl/messaging.idl b/source3/librpc/idl/messaging.idl index 583eaf0..9405d53 100644 --- a/source3/librpc/idl/messaging.idl +++ b/source3/librpc/idl/messaging.idl @@ -92,6 +92,10 @@ interface messaging /* shutdown connection for given client */ MSG_SMB_KILL_CLIENT_IP = 0x0316, + /* Tell number of child processes */ + MSG_SMB_TELL_NUM_CHILDREN = 0x0317, + MSG_SMB_NUM_CHILDREN = 0x0318, + /* winbind messages */ MSG_WINBIND_FINISHED = 0x0401, MSG_WINBIND_FORGET_STATE = 0x0402, diff --git a/source3/smbd/process.c b/source3/smbd/process.c index 8bd1c2e..1f4cfe7 100644 --- a/source3/smbd/process.c +++ b/source3/smbd/process.c @@ -3562,6 +3562,8 @@ void smbd_process(struct tevent_context *ev_ctx, MSG_SMB_KILL_CLIENT_IP, msg_kill_client_ip); + messaging_deregister(sconn->msg_ctx, MSG_SMB_TELL_NUM_CHILDREN, NULL); + /* * Use the default MSG_DEBUG handler to avoid rebroadcasting * MSGs to all child processes diff --git a/source3/smbd/server.c b/source3/smbd/server.c index 99b0a10..feb47da 100644 --- a/source3/smbd/server.c +++ b/source3/smbd/server.c @@ -396,6 +396,20 @@ static void add_child_pid(struct smbd_parent_context *parent, parent->num_children += 1; } +static void smb_tell_num_children(struct messaging_context *ctx, void *data, + uint32_t msg_type, struct server_id srv_id, + DATA_BLOB *msg_data) +{ + uint8_t buf[sizeof(uint32_t)]; + + if (am_parent) { + SIVAL(buf, 0, am_parent->num_children); + messaging_send_buf(ctx, srv_id, MSG_SMB_NUM_CHILDREN, + buf, sizeof(buf)); + } +} + + /* at most every smbd:cleanuptime seconds (default 20), we scan the BRL and locking database for entries to cleanup. As a side effect this @@ -890,6 +904,8 @@ static bool open_sockets_smbd(struct smbd_parent_context *parent, smb_parent_force_tdis); messaging_register(msg_ctx, NULL, MSG_SMB_KILL_CLIENT_IP, smb_parent_kill_client_by_ip); + messaging_register(msg_ctx, NULL, MSG_SMB_TELL_NUM_CHILDREN, + smb_tell_num_children); messaging_register(msg_ctx, NULL, ID_CACHE_DELETE, smbd_parent_id_cache_delete); diff --git a/source3/utils/smbcontrol.c b/source3/utils/smbcontrol.c index ea1f609..579aa10 100644 --- a/source3/utils/smbcontrol.c +++ b/source3/utils/smbcontrol.c @@ -921,6 +921,53 @@ static bool do_dmalloc_changed(struct tevent_context *ev_ctx, NULL, 0); } +static void print_uint32_cb(struct messaging_context *msg, void *private_data, + uint32_t msg_type, struct server_id pid, + DATA_BLOB *data) +{ + uint32_t num_children; + + if (data->length != sizeof(uint32_t)) { + printf("Invalid response: %d bytes long\n", + (int)data->length); + goto done; + } + num_children = IVAL(data->data, 0); + printf("%u children\n", (unsigned)num_children); +done: + num_replies++; +} + +static bool do_num_children(struct tevent_context *ev_ctx, + struct messaging_context *msg_ctx, + const struct server_id pid, + const int argc, const char **argv) +{ + if (argc != 1) { + fprintf(stderr, "Usage: smbcontrol <dest> num-children\n"); + return False; + } + + messaging_register(msg_ctx, NULL, MSG_SMB_NUM_CHILDREN, + print_uint32_cb); + + /* Send a message and register our interest in a reply */ + + if (!send_message(msg_ctx, pid, MSG_SMB_TELL_NUM_CHILDREN, NULL, 0)) + return false; + + wait_replies(ev_ctx, msg_ctx, procid_to_pid(&pid) == 0); + + /* No replies were received within the timeout period */ + + if (num_replies == 0) + printf("No replies received\n"); + + messaging_deregister(msg_ctx, MSG_SMB_TELL_NUM_CHILDREN, NULL); + + return num_replies; +} + /* Shutdown a server process */ static bool do_shutdown(struct tevent_context *ev_ctx, @@ -1329,6 +1376,8 @@ static const struct { "Validate winbind's credential cache" }, { "dump-domain-list", do_winbind_dump_domain_list, "Dump winbind domain list"}, { "notify-cleanup", do_notify_cleanup }, + { "num-children", do_num_children, + "Print number of smbd child processes" }, { "noop", do_noop, "Do nothing" }, { NULL } }; -- Samba Shared Repository