diff options
Diffstat (limited to 'source3/winbindd')
-rw-r--r-- | source3/winbindd/winbindd.c | 51 | ||||
-rw-r--r-- | source3/winbindd/winbindd_proto.h | 1 |
2 files changed, 30 insertions, 22 deletions
diff --git a/source3/winbindd/winbindd.c b/source3/winbindd/winbindd.c index 948e9ec93a..186b0d852b 100644 --- a/source3/winbindd/winbindd.c +++ b/source3/winbindd/winbindd.c @@ -763,40 +763,23 @@ void request_ok(struct winbindd_cli_state *state) /* Process a new connection by adding it to the client connection list */ -static void new_connection(int listen_sock, bool privileged) +void winbindd_accepted_new_connection(int accepted_sock, bool privileged) { - struct sockaddr_un sunaddr; struct winbindd_cli_state *state; struct tevent_req *req; - socklen_t len; - int sock; - - /* Accept connection */ - - len = sizeof(sunaddr); - - do { - sock = accept(listen_sock, (struct sockaddr *)(void *)&sunaddr, - &len); - } while (sock == -1 && errno == EINTR); - - if (sock == -1) - return; - - DEBUG(6,("accepted socket %d\n", sock)); /* Create new connection structure */ if ((state = TALLOC_ZERO_P(NULL, struct winbindd_cli_state)) == NULL) { - close(sock); + close(accepted_sock); return; } - state->sock = sock; + state->sock = accepted_sock; state->out_queue = tevent_queue_create(state, "winbind client reply"); if (state->out_queue == NULL) { - close(sock); + close(accepted_sock); TALLOC_FREE(state); return; } @@ -809,16 +792,40 @@ static void new_connection(int listen_sock, bool privileged) WINBINDD_MAX_EXTRA_DATA); if (req == NULL) { TALLOC_FREE(state); - close(sock); + close(accepted_sock); return; } tevent_req_set_callback(req, winbind_client_request_read, state); /* Add to connection list */ + /* Once the client is added here, we can be sure something will close it eventually */ winbindd_add_client(state); } +static void new_connection(int listen_sock, bool privileged) +{ + struct sockaddr_un sunaddr; + socklen_t len; + int sock; + + /* Accept connection */ + + len = sizeof(sunaddr); + + do { + sock = accept(listen_sock, (struct sockaddr *)(void *)&sunaddr, + &len); + } while (sock == -1 && errno == EINTR); + + if (sock == -1) + return; + + DEBUG(6,("accepted socket %d\n", sock)); + + winbindd_accepted_new_connection(sock, privileged); +} + static void winbind_client_request_read(struct tevent_req *req) { struct winbindd_cli_state *state = tevent_req_callback_data( diff --git a/source3/winbindd/winbindd_proto.h b/source3/winbindd/winbindd_proto.h index a449f42452..123fefc5fc 100644 --- a/source3/winbindd/winbindd_proto.h +++ b/source3/winbindd/winbindd_proto.h @@ -44,6 +44,7 @@ void debug_unix_user_token(int dbg_class, int dbg_lev, uid_t uid, gid_t gid, struct event_context *winbind_event_context(void); /* The following definitions come from winbindd/winbindd.c */ +void winbindd_accepted_new_connection(int accepted_sock, bool privileged); struct messaging_context *winbind_messaging_context(void); void request_error(struct winbindd_cli_state *state); void request_ok(struct winbindd_cli_state *state); |