diff options
Diffstat (limited to 'source3/libads/ads_struct.c')
-rw-r--r-- | source3/libads/ads_struct.c | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/source3/libads/ads_struct.c b/source3/libads/ads_struct.c index 013491eaed..476152f2c2 100644 --- a/source3/libads/ads_struct.c +++ b/source3/libads/ads_struct.c @@ -22,14 +22,13 @@ #include "includes.h" -/* return a dn of the form "dc=AA,dc=BB,dc=CC" from a - realm of the form AA.BB.CC +/* return a ldap dn path from a string, given separators and field name caller must free */ -char *ads_build_dn(const char *realm) +char *ads_build_path(const char *realm, const char *sep, const char *field, int reverse) { char *p, *r; - int numdots = 0; + int numbits = 0; char *ret; int len; @@ -38,19 +37,25 @@ char *ads_build_dn(const char *realm) if (!r || !*r) return r; for (p=r; *p; p++) { - if (*p == '.') numdots++; + if (strchr(sep, *p)) numbits++; } - len = (numdots+1)*4 + strlen(r) + 1; + len = (numbits+1)*(strlen(field)+1) + strlen(r) + 1; ret = malloc(len); - strlcpy(ret,"dc=", len); - p=strtok(r,"."); + strlcpy(ret,field, len); + p=strtok(r,sep); strlcat(ret, p, len); - while ((p=strtok(NULL,"."))) { - strlcat(ret,",dc=", len); - strlcat(ret, p, len); + while ((p=strtok(NULL,sep))) { + char *s; + if (reverse) { + asprintf(&s, "%s%s,%s", field, p, ret); + } else { + asprintf(&s, "%s,%s%s", ret, field, p); + } + free(ret); + ret = s; } free(r); @@ -58,6 +63,15 @@ char *ads_build_dn(const char *realm) return ret; } +/* return a dn of the form "dc=AA,dc=BB,dc=CC" from a + realm of the form AA.BB.CC + caller must free +*/ +char *ads_build_dn(const char *realm) +{ + return ads_build_path(realm, ".", "dc=", 0); +} + #ifdef HAVE_LDAP /* |