/* initialise a cldap_sock */ NTSTATUS cldap_socket_init(TALLOC_CTX *mem_ctx, const struct tsocket_address *local_addr, const struct tsocket_address *remote_addr, struct cldap_socket **_cldap) { struct cldap_socket *c = NULL; struct tsocket_address *any = NULL; NTSTATUS status; int ret; const char *fam = NULL; if (local_addr == NULL && remote_addr == NULL) { return NT_STATUS_INVALID_PARAMETER_MIX; } if (remote_addr) { bool is_ipv4; bool is_ipv6; is_ipv4 = tsocket_address_is_inet(remote_addr, "ipv4"); is_ipv6 = tsocket_address_is_inet(remote_addr, "ipv6"); if (is_ipv4) { fam = "ipv4"; } else if (is_ipv6) { fam = "ipv6"; } else { return NT_STATUS_INVALID_ADDRESS; } } c = talloc_zero(mem_ctx, struct cldap_socket); if (!c) { goto nomem; } if (!local_addr) { /* * Here we know the address family of the remote address. */ if (fam == NULL) { return NT_STATUS_INVALID_PARAMETER_MIX; } ret = tsocket_address_inet_from_strings(c, fam, NULL, 0, &any); if (ret != 0) { status = map_nt_error_from_unix_common(errno); goto nterror; } local_addr = any; } c->searches.idr = idr_init(c); if (!c->searches.idr) { goto nomem; } ret = tdgram_inet_udp_socket(local_addr, remote_addr, c, &c->sock); if (ret != 0) { status = map_nt_error_from_unix_common(errno); goto nterror; } talloc_free(any); if (remote_addr) { c->connected = true; } c->send_queue = tevent_queue_create(c, "cldap_send_queue"); if (!c->send_queue) { goto nomem; } talloc_set_destructor(c, cldap_socket_destructor); *_cldap = c; return NT_STATUS_OK; nomem: status = NT_STATUS_NO_MEMORY; nterror: talloc_free(c); return status; }
/* initialise a cldap_sock */ NTSTATUS cldap_socket_init(TALLOC_CTX *mem_ctx, struct tevent_context *ev, const struct tsocket_address *local_addr, const struct tsocket_address *remote_addr, struct cldap_socket **_cldap) { struct cldap_socket *c = NULL; struct tsocket_address *any = NULL; NTSTATUS status; int ret; c = talloc_zero(mem_ctx, struct cldap_socket); if (!c) { goto nomem; } if (!ev) { ev = tevent_context_init(c); if (!ev) { goto nomem; } c->event.allow_poll = true; } c->event.ctx = ev; if (!local_addr) { ret = tsocket_address_inet_from_strings(c, "ipv4", NULL, 0, &any); if (ret != 0) { status = map_nt_error_from_unix(errno); goto nterror; } local_addr = any; } c->searches.idr = idr_init(c); if (!c->searches.idr) { goto nomem; } ret = tdgram_inet_udp_socket(local_addr, remote_addr, c, &c->sock); if (ret != 0) { status = map_nt_error_from_unix(errno); goto nterror; } talloc_free(any); if (remote_addr) { c->connected = true; } c->send_queue = tevent_queue_create(c, "cldap_send_queue"); if (!c->send_queue) { goto nomem; } talloc_set_destructor(c, cldap_socket_destructor); *_cldap = c; return NT_STATUS_OK; nomem: status = NT_STATUS_NO_MEMORY; nterror: talloc_free(c); return status; }