diff options
Diffstat (limited to 'src/plugin.c')
| -rw-r--r-- | src/plugin.c | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/src/plugin.c b/src/plugin.c index ae57e5c..6315b68 100644 --- a/src/plugin.c +++ b/src/plugin.c @@ -48,7 +48,8 @@ plugin_startup(Slapi_PBlock *pb) const char *pname; int i, protocol; slapi_pblock_get(pb, SLAPI_PLUGIN_PRIVATE, &state); - slapi_log_error(SLAPI_LOG_PLUGIN, "plugin_start", "plugin starting\n"); + slapi_log_error(SLAPI_LOG_PLUGIN, plugin_description.spd_id, + "plugin starting\n"); /* Register the listener sockets with the portmapper. */ if (state->pmap_client_socket != -1) { for (i = 0; i < state->n_listeners; i++) { @@ -69,7 +70,8 @@ plugin_startup(Slapi_PBlock *pb) if (protocol == IPPROTO_IP) { continue; } - if (!portmap_register(state->pmap_client_socket, + if (!portmap_register(plugin_description.spd_id, + state->pmap_client_socket, YPPROG, YPVERS, protocol, state->listener[i].port)) { slapi_log_error(SLAPI_LOG_PLUGIN, @@ -100,7 +102,8 @@ plugin_shutdown(Slapi_PBlock *pb) slapi_pblock_get(pb, SLAPI_PLUGIN_PRIVATE, &state); if (state->pmap_client_socket != -1) { /* Clear our registration with the portmapper. */ - portmap_unregister(state->pmap_client_socket, YPPROG, YPVERS); + portmap_unregister(plugin_description.spd_id, + state->pmap_client_socket, YPPROG, YPVERS); } return 0; } @@ -126,6 +129,19 @@ plugin_state_init(struct plugin_state **lstate) } state->arena = arena; + /* Create a socket for use in communicating with the portmapper. */ + sockfd = socket(PF_INET, SOCK_DGRAM, 0); + if (sockfd == -1) { + goto failed; + } + memset(&sin, 0, sizeof(sin)); + sin.sin_family = AF_INET; + if (bindresvport(sockfd, &sin) != 0) { + close(sockfd); + goto failed; + } + state->pmap_client_socket = sockfd; + /* We need to bind on privileged ports for both datagram and connected * listeners, over both IPv4 and IPv6. */ state->n_listeners = 0; @@ -158,11 +174,12 @@ plugin_state_init(struct plugin_state **lstate) continue; } /* Mark the socket as reusable. */ + one = 1; if (setsockopt(sockfd, IPPROTO_IP, SO_REUSEADDR, &one, sizeof(one)) != 0) { slapi_log_error(SLAPI_LOG_PLUGIN, plugin_description.spd_id, - "error marking %s socket for reuse, ", + "error marking %s socket for reuse, " "continuing\n", sock_desc); } /* Bind to a reserved port. */ @@ -197,11 +214,6 @@ plugin_state_init(struct plugin_state **lstate) continue; } } - /* Save the first socket for reuse as the portmap client - * socket. */ - if (i == 0) { - state->pmap_client_socket = sockfd; - } /* Save the other info. */ state->listener[state->n_listeners].fd = sockfd; state->listener[state->n_listeners].port = port; |
