On Tue, May 28, 2013 at 10:26:54AM +0200, Sumit Bose wrote:
> @@ -1371,14 +1382,11 @@ fo_set_port_status(struct fo_server
*server, enum port_status status)
> * into fo_server structures. Find the duplicates and set the same
> * status */
> DLIST_FOR_EACH(siter, server->service->server_list) {
> - if (siter == server) continue;
> - if (!siter->common || !siter->common->name) continue;
> -
> - if (siter->port == server->port &&
> - (strcasecmp(siter->common->name, server->common->name) ==
0)) {
> - DEBUG(7, ("Marking port %d of duplicate server '%s' as
'%s'\n",
> - siter->port, SERVER_NAME(siter),
> - str_port_status(status)));
> + if (fo_server_cmp(siter, server)) {
You removed the NULL check on siter->common->name but siter is used in
fo_server_cmp() as first argument to fo_server_match() where it is not
properly checked if siter->common->name is not NULL.
I guess it's good to remove the check here and add it to
fo_server_match().
Sorry, I'm not sure I completely understood. I moved the
server->common->name check to fo_server_match(), is that what you meant?
> From fae5ac11bc7c48684625b5b43d9c5856b11fa9c4 Mon Sep 17
00:00:00 2001
> From: Jakub Hrozek <jhrozek(a)redhat.com>
> Date: Fri, 17 May 2013 14:33:26 +0200
> Subject: [PATCH 4/4] AD dyndns: extract the host name from URI
>
> ---
> src/providers/ad/ad_dyndns.c | 31 ++++++++++++++++++++++---------
> 1 file changed, 22 insertions(+), 9 deletions(-)
>
> diff --git a/src/providers/ad/ad_dyndns.c b/src/providers/ad/ad_dyndns.c
> index
4e9ed852f91b8f99a0363b0f31af857ef98e8130..d6f2737e99b87b21f8ad6e5e1a8f008c68ee3698 100644
> --- a/src/providers/ad/ad_dyndns.c
> +++ b/src/providers/ad/ad_dyndns.c
> @@ -159,6 +159,7 @@ static void ad_dyndns_nsupdate_done(struct tevent_req *req)
>
> struct ad_dyndns_update_state {
> struct ad_options *ad_ctx;
> + const char *servername;
> };
>
> static void ad_dyndns_sdap_update_done(struct tevent_req *subreq);
> @@ -170,7 +171,7 @@ ad_dyndns_update_send(struct ad_options *ctx)
> struct ad_dyndns_update_state *state;
> struct tevent_req *req, *subreq;
> struct sdap_id_ctx *sdap_ctx = ctx->id_ctx->sdap_id_ctx;
> - const char *servername;
> + LDAPURLDesc *lud;
>
> DEBUG(SSSDBG_TRACE_FUNC, ("Performing update\n"));
>
> @@ -190,15 +191,27 @@ ad_dyndns_update_send(struct ad_options *ctx)
> }
> state->ad_ctx->dyndns_ctx->last_refresh = time(NULL);
>
> - if (strncmp(ctx->service->sdap->uri,
> - "ldap://", 7) != 0) {
> - DEBUG(SSSDBG_CRIT_FAILURE, ("Unexpected format of LDAP
URI.\n"));
> - ret = EIO;
> + ret = ldap_url_parse(ctx->service->sdap->uri, &lud);
> + if (ret != LDAP_SUCCESS) {
> + DEBUG(SSSDBG_CRIT_FAILURE,
> + ("Failed to parse ldap URI (%s)!\n",
ctx->service->sdap->uri));
> + ret = EINVAL;
> goto done;
> }
> - servername = ctx->service->sdap->uri + 7;
> - if (!servername) {
> - ret = EIO;
> +
> + if (lud->lud_host == NULL) {
maybe you can check if strcasecmp( lud->lud_scheme, "ldapi" ) == 0
because in this case lud->lud_host contains a local path and not a host
name. Please note that lud->lud_scheme might be NULL .
You're right, I was thinking about the schemes, too, but wasn't sure if
there is a way to actually have an AD server with ldapi ? But it's
better to be safe.