/* The following definitions come from libads/ads_struct.c */
-char *ads_build_path(const char *realm, const char *sep, const char *field, int reverse);
+ADS_STATUS ads_build_path(const char *realm,
+ const char *sep,
+ const char *field,
+ int reverse,
+ char **_path);
char *ads_build_dn(const char *realm);
char *ads_build_domain(const char *dn);
ADS_STRUCT *ads_init(TALLOC_CTX *mem_ctx,
/* return a ldap dn path from a string, given separators and field name
caller must free
*/
-char *ads_build_path(const char *realm, const char *sep, const char *field, int reverse)
+ADS_STATUS ads_build_path(const char *realm,
+ const char *sep,
+ const char *field,
+ int reverse,
+ char **_path)
{
char *p, *r;
int numbits = 0;
int len;
char *saveptr;
+ *_path = NULL;
+
r = SMB_STRDUP(realm);
if (!r || !*r) {
- return r;
+ return ADS_ERROR_NT(NT_STATUS_NO_MEMORY);
}
for (p=r; *p; p++) {
ret = (char *)SMB_MALLOC(len);
if (!ret) {
free(r);
- return NULL;
+ return ADS_ERROR_NT(NT_STATUS_NO_MEMORY);
}
if (strlcpy(ret,field, len) >= len) {
/* Truncate ! */
free(r);
free(ret);
- return NULL;
+ return ADS_ERROR_NT(NT_STATUS_NO_MEMORY);
}
p=strtok_r(r, sep, &saveptr);
if (p) {
if (strlcat(ret, p, len) >= len) {
free(r);
free(ret);
- return NULL;
+ return ADS_ERROR_NT(NT_STATUS_NO_MEMORY);
}
while ((p=strtok_r(NULL, sep, &saveptr)) != NULL) {
free(ret);
if (retval == -1) {
free(r);
- return NULL;
+ return ADS_ERROR_NT(NT_STATUS_NO_MEMORY);
}
ret = SMB_STRDUP(s);
free(s);
}
free(r);
- return ret;
+
+ *_path = ret;
+
+ return ADS_ERROR_NT(NT_STATUS_OK);
}
/* return a dn of the form "dc=AA,dc=BB,dc=CC" from a
*/
char *ads_build_dn(const char *realm)
{
- return ads_build_path(realm, ".", "dc=", 0);
+ ADS_STATUS status;
+ char *dn = NULL;
+
+ status = ads_build_path(realm, ".", "dc=", 0, &dn);
+ if (!ADS_ERR_OK(status)) {
+ return NULL;
+ }
+
+ return dn;
}
/* return a DNS name in the for aa.bb.cc from the DN
**/
char *ads_ou_string(ADS_STRUCT *ads, const char *org_unit)
{
+ ADS_STATUS status;
char *ret = NULL;
+ char *dn = NULL;
if (!org_unit || !*org_unit) {
/* jmcd: removed "\\" from the separation chars, because it is
needed as an escape for chars like '#' which are valid in an
OU name */
- return ads_build_path(org_unit, "/", "ou=", 1);
+ status = ads_build_path(org_unit, "/", "ou=", 1, &dn);
+ if (!ADS_ERR_OK(status)) {
+ return NULL;
+ }
+
+ return dn;
}
/**