diff options
Diffstat (limited to 'source3')
-rw-r--r-- | source3/include/messages.h | 1 | ||||
-rw-r--r-- | source3/nsswitch/winbindd.c | 1 | ||||
-rw-r--r-- | source3/nsswitch/winbindd_cache.c | 5 | ||||
-rw-r--r-- | source3/nsswitch/winbindd_dual.c | 76 | ||||
-rw-r--r-- | source3/utils/smbcontrol.c | 31 |
5 files changed, 114 insertions, 0 deletions
diff --git a/source3/include/messages.h b/source3/include/messages.h index 6a739c0bcc..e246123ea9 100644 --- a/source3/include/messages.h +++ b/source3/include/messages.h @@ -76,6 +76,7 @@ #define MSG_WINBIND_FORGET_STATE 4002 #define MSG_WINBIND_ONLINE 4003 #define MSG_WINBIND_OFFLINE 4004 +#define MSG_WINBIND_ONLINESTATUS 4005 /* Flags to classify messages - used in message_send_all() */ /* Sender will filter by flag. */ diff --git a/source3/nsswitch/winbindd.c b/source3/nsswitch/winbindd.c index e6c69247f8..06b8b93543 100644 --- a/source3/nsswitch/winbindd.c +++ b/source3/nsswitch/winbindd.c @@ -1035,6 +1035,7 @@ int main(int argc, char **argv) /* Handle online/offline messages. */ message_register(MSG_WINBIND_OFFLINE,winbind_msg_offline); message_register(MSG_WINBIND_ONLINE,winbind_msg_online); + message_register(MSG_WINBIND_ONLINESTATUS,winbind_msg_onlinestatus); poptFreeContext(pc); diff --git a/source3/nsswitch/winbindd_cache.c b/source3/nsswitch/winbindd_cache.c index bf76c7f251..6541e10877 100644 --- a/source3/nsswitch/winbindd_cache.c +++ b/source3/nsswitch/winbindd_cache.c @@ -2357,6 +2357,11 @@ void set_global_winbindd_state_online(void) tdb_delete_bystring(wcache->tdb, "WINBINDD_OFFLINE"); } +BOOL get_global_winbindd_state_online(void) +{ + return global_winbindd_offline_state; +} + /* the cache backend methods are exposed via this structure */ struct winbindd_methods cache_methods = { True, diff --git a/source3/nsswitch/winbindd_dual.c b/source3/nsswitch/winbindd_dual.c index c5d24f98c1..05b73a9ddc 100644 --- a/source3/nsswitch/winbindd_dual.c +++ b/source3/nsswitch/winbindd_dual.c @@ -496,6 +496,26 @@ void winbind_msg_online(int msg_type, struct process_id src, void *buf, size_t l } } +/* Forward the online/offline messages to our children. */ +void winbind_msg_onlinestatus(int msg_type, struct process_id src, void *buf, size_t len) +{ + struct winbindd_child *child; + + DEBUG(10,("winbind_msg_onlinestatus: got onlinestatus message.\n")); + + for (child = children; child != NULL; child = child->next) { + if (child->domain && child->domain->primary) { + DEBUG(10,("winbind_msg_onlinestatus: " + "sending message to pid %u of primary domain.\n", + (unsigned int)child->pid)); + message_send_pid(pid_to_procid(child->pid), + MSG_WINBIND_ONLINESTATUS, buf, len, False); + break; + } + } +} + + static void account_lockout_policy_handler(struct timed_event *te, const struct timeval *now, void *private_data) @@ -582,6 +602,60 @@ static void child_msg_online(int msg_type, struct process_id src, void *buf, siz } } +static const char *collect_onlinestatus(TALLOC_CTX *mem_ctx) +{ + struct winbindd_domain *domain; + char *buf = NULL; + + if ((buf = talloc_asprintf(mem_ctx, "global:%s ", + get_global_winbindd_state_online() ? + "Offline":"Online")) == NULL) { + return NULL; + } + + for (domain = domain_list(); domain; domain = domain->next) { + if ((buf = talloc_asprintf_append(buf, "%s:%s ", + domain->name, + domain->online ? + "Online":"Offline")) == NULL) { + return NULL; + } + } + + buf = talloc_asprintf_append(buf, "\n"); + + DEBUG(5,("collect_onlinestatus: %s\n", buf)); + + return buf; +} + +static void child_msg_onlinestatus(int msg_type, struct process_id src, void *buf, size_t len) +{ + TALLOC_CTX *mem_ctx; + const char *message; + struct process_id *sender; + + DEBUG(5,("winbind_msg_onlinestatus received.\n")); + + if (!buf) { + return; + } + + sender = (struct process_id *)buf; + + mem_ctx = talloc_init("winbind_msg_onlinestatus"); + if (mem_ctx == NULL) { + return; + } + + message = collect_onlinestatus(mem_ctx); + + message_send_pid(*sender, MSG_WINBIND_ONLINESTATUS, + message, strlen(message) + 1, True); + + talloc_destroy(mem_ctx); +} + static BOOL fork_domain_child(struct winbindd_child *child) { int fdpair[2]; @@ -646,6 +720,7 @@ static BOOL fork_domain_child(struct winbindd_child *child) message_deregister(MSG_SHUTDOWN); message_deregister(MSG_WINBIND_OFFLINE); message_deregister(MSG_WINBIND_ONLINE); + message_deregister(MSG_WINBIND_ONLINESTATUS); /* The child is ok with online/offline messages now. */ message_unblock(); @@ -667,6 +742,7 @@ static BOOL fork_domain_child(struct winbindd_child *child) /* Handle online/offline messages. */ message_register(MSG_WINBIND_OFFLINE,child_msg_offline); message_register(MSG_WINBIND_ONLINE,child_msg_online); + message_register(MSG_WINBIND_ONLINESTATUS,child_msg_onlinestatus); while (1) { diff --git a/source3/utils/smbcontrol.c b/source3/utils/smbcontrol.c index c368ee0ad4..ad05f8e948 100644 --- a/source3/utils/smbcontrol.c +++ b/source3/utils/smbcontrol.c @@ -909,6 +909,36 @@ static BOOL do_winbind_offline(const struct process_id pid, return ret; } +static BOOL do_winbind_onlinestatus(const struct process_id pid, + const int argc, const char **argv) +{ + struct process_id myid; + + myid = pid_to_procid(sys_getpid()); + + if (argc != 1) { + fprintf(stderr, "Usage: smbcontrol winbindd onlinestatus\n"); + return False; + } + + message_register(MSG_WINBIND_ONLINESTATUS, print_pid_string_cb); + + if (!send_message(pid, MSG_WINBIND_ONLINESTATUS, &myid, sizeof(myid), False)) + return False; + + wait_replies(procid_to_pid(&pid) == 0); + + /* No replies were received within the timeout period */ + + if (num_replies == 0) + printf("No replies received\n"); + + message_deregister(MSG_WINBIND_ONLINESTATUS); + + return num_replies; +} + + static BOOL do_reload_config(const struct process_id pid, const int argc, const char **argv) { @@ -999,6 +1029,7 @@ static const struct { { "nodestatus", do_nodestatus, "Ask nmbd to do a node status request"}, { "online", do_winbind_online, "Ask winbind to go into online state"}, { "offline", do_winbind_offline, "Ask winbind to go into offline state"}, + { "onlinestatus", do_winbind_onlinestatus, "Request winbind online status"}, { "noop", do_noop, "Do nothing" }, { NULL } }; |