1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-23 17:34:34 +03:00

Some winbindd cleanups I made trying to fix cr1020:

- move winbindd client handling into accessor functions in
   winbindd_util.c

 - move some winbindd socket routines into accessor functions in
   winbindd_utils.c

(The deadlock situation mentioned in the appliance branch is probably
not applicable since we don't clear the connection cache on SIGHUP.
Perhaps we should?)
(This used to be commit ee0e3d31a1)
This commit is contained in:
Tim Potter 2002-11-02 01:36:42 +00:00
parent 500905fedb
commit d759a02094
2 changed files with 108 additions and 38 deletions

View File

@ -23,10 +23,6 @@
#include "winbindd.h"
/* List of all connected clients */
static struct winbindd_cli_state *client_list;
static int num_clients;
BOOL opt_nocache = False;
BOOL opt_dual_daemon = False;
@ -121,11 +117,11 @@ static void winbindd_status(void)
/* Print client state information */
DEBUG(0, ("\t%d clients currently active\n", num_clients));
DEBUG(0, ("\t%d clients currently active\n", winbindd_num_clients()));
if (DEBUGLEVEL >= 2 && num_clients) {
if (DEBUGLEVEL >= 2 && winbindd_num_clients()) {
DEBUG(2, ("\tclient list:\n"));
for(tmp = client_list; tmp; tmp = tmp->next) {
for(tmp = winbindd_client_list(); tmp; tmp = tmp->next) {
DEBUG(2, ("\t\tpid %d, sock %d, rbl %d, wbl %d\n",
tmp->pid, tmp->sock, tmp->read_buf_len,
tmp->write_buf_len));
@ -189,14 +185,6 @@ static void sighup_handler(int signum)
sys_select_signal();
}
/* Create winbindd socket */
static int create_sock(void)
{
return create_pipe_sock( WINBINDD_SOCKET_DIR,
WINBINDD_SOCKET_NAME, 0755);
}
struct dispatch_table {
enum winbindd_cmd cmd;
enum winbindd_result (*fn)(struct winbindd_cli_state *state);
@ -303,7 +291,7 @@ static void process_request(struct winbindd_cli_state *state)
/* Process a new connection by adding it to the client connection list */
static void new_connection(int accept_sock)
static void new_connection(int listen_sock)
{
struct sockaddr_un sunaddr;
struct winbindd_cli_state *state;
@ -315,7 +303,7 @@ static void new_connection(int accept_sock)
len = sizeof(sunaddr);
do {
sock = accept(accept_sock, (struct sockaddr *)&sunaddr, &len);
sock = accept(listen_sock, (struct sockaddr *)&sunaddr, &len);
} while (sock == -1 && errno == EINTR);
if (sock == -1)
@ -334,8 +322,7 @@ static void new_connection(int accept_sock)
/* Add to connection list */
DLIST_ADD(client_list, state);
num_clients++;
winbindd_add_client(state);
}
/* Remove a client connection from client connection list */
@ -362,9 +349,8 @@ static void remove_client(struct winbindd_cli_state *state)
/* Remove from list and free */
DLIST_REMOVE(client_list, state);
winbindd_remove_client(state);
SAFE_FREE(state);
num_clients--;
}
}
@ -507,14 +493,14 @@ static void client_write(struct winbindd_cli_state *state)
simultaneous connections while remaining impervious to many denial of
service attacks. */
static void process_loop(int accept_sock)
static void process_loop(void)
{
/* We'll be doing this a lot */
while (1) {
struct winbindd_cli_state *state;
fd_set r_fds, w_fds;
int maxfd = accept_sock, selret;
int maxfd, listen_sock, selret;
struct timeval timeout;
/* Handle messages */
@ -528,9 +514,12 @@ static void process_loop(int accept_sock)
/* Initialise fd lists for select() */
listen_sock = open_winbindd_socket();
maxfd = listen_sock;
FD_ZERO(&r_fds);
FD_ZERO(&w_fds);
FD_SET(accept_sock, &r_fds);
FD_SET(listen_sock, &r_fds);
timeout.tv_sec = WINBINDD_ESTABLISH_LOOP;
timeout.tv_usec = 0;
@ -541,7 +530,7 @@ static void process_loop(int accept_sock)
/* Set up client readers and writers */
state = client_list;
state = winbindd_client_list();
while (state) {
@ -597,12 +586,13 @@ static void process_loop(int accept_sock)
dual_select(&w_fds);
}
if (FD_ISSET(accept_sock, &r_fds))
new_connection(accept_sock);
if (FD_ISSET(listen_sock, &r_fds))
new_connection(listen_sock);
/* Process activity on client connections */
for (state = client_list; state; state = state->next) {
for (state = winbindd_client_list(); state;
state = state->next) {
/* Data available for reading */
@ -656,7 +646,9 @@ static void process_loop(int accept_sock)
if (do_sighup) {
/* Flush winbindd cache */
DEBUG(3, ("got SIGHUP\n"));
/* Flush various caches */
flush_caches();
reload_services_file(True);
@ -751,7 +743,6 @@ static void usage(void)
extern fstring global_myworkgroup;
extern BOOL append_log;
pstring logfile;
int accept_sock;
BOOL interactive = False;
int opt;
@ -879,16 +870,9 @@ static void usage(void)
register_msg_pool_usage();
/* Create UNIX domain socket */
if ((accept_sock = create_sock()) == -1) {
DEBUG(0, ("failed to create socket\n"));
return 1;
}
/* Loop waiting for requests */
process_loop(accept_sock);
process_loop();
uni_group_cache_shutdown();
return 0;

View File

@ -441,3 +441,89 @@ void fill_domain_username(fstring name, const char *domain, const char *user)
user);
}
}
/*
* Winbindd socket accessor functions
*/
/* Open the winbindd socket */
static int _winbindd_socket = -1;
int open_winbindd_socket(void)
{
if (_winbindd_socket == -1) {
_winbindd_socket = create_pipe_sock(
WINBINDD_SOCKET_DIR, WINBINDD_SOCKET_NAME, 0755);
DEBUG(10, ("open_winbindd_socket: opened socket fd %d\n",
_winbindd_socket));
}
return _winbindd_socket;
}
/* Close the winbindd socket */
void close_winbindd_socket(void)
{
if (_winbindd_socket != -1) {
DEBUG(10, ("close_winbindd_socket: closing socket fd %d\n",
_winbindd_socket));
close(_winbindd_socket);
_winbindd_socket = -1;
}
}
/*
* Client list accessor functions
*/
static struct winbindd_cli_state *_client_list;
static int _num_clients;
/* Return list of all connected clients */
struct winbindd_cli_state *winbindd_client_list(void)
{
return _client_list;
}
/* Add a connection to the list */
void winbindd_add_client(struct winbindd_cli_state *cli)
{
DLIST_ADD(_client_list, cli);
_num_clients++;
}
/* Remove a client from the list */
void winbindd_remove_client(struct winbindd_cli_state *cli)
{
DLIST_REMOVE(_client_list, cli);
_num_clients--;
}
/* Close all open clients */
void winbindd_kill_all_clients(void)
{
struct winbindd_cli_state *cl = winbindd_client_list();
DEBUG(10, ("winbindd_kill_all_clients: going postal\n"));
while (cl) {
struct winbindd_cli_state *next;
next = cl->next;
winbindd_remove_client(cl);
cl = next;
}
}
/* Return number of open clients */
int winbindd_num_clients(void)
{
return _num_clients;
}