summaryrefslogtreecommitdiff
path: root/source3/libads/ads_struct.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2002-01-16 02:22:30 +0000
committerAndrew Tridgell <tridge@samba.org>2002-01-16 02:22:30 +0000
commit9f85d4ad5f2bb5fdb7739b3f90c4bfac705393ce (patch)
tree013b7f83aeb828c9fb42591d07abab9d234f4e84 /source3/libads/ads_struct.c
parent3fee2ac712c5fe7a85b89ba3a3c19ab8801f0b22 (diff)
downloadsamba-9f85d4ad5f2bb5fdb7739b3f90c4bfac705393ce.tar.gz
samba-9f85d4ad5f2bb5fdb7739b3f90c4bfac705393ce.tar.bz2
samba-9f85d4ad5f2bb5fdb7739b3f90c4bfac705393ce.zip
much better support for organisational units in ADS join
(This used to be commit 7e876057d5e392f85e6fdb0f2c233b0fe76df688)
Diffstat (limited to 'source3/libads/ads_struct.c')
-rw-r--r--source3/libads/ads_struct.c36
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
/*