⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ldapdb.c

📁 bind 9.3结合mysql数据库
💻 C
📖 第 1 页 / 共 2 页
字号:
						isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_SERVER, ISC_LOG_ERROR,								      "LDAP sdb zone '%s': dns_sdb_put... failed for %s", zone, vals[i]);						ldap_value_free(vals);#ifndef LDAPDB_RFC1823API						ldap_memfree(a);						if (ptr != NULL)							ber_free(ptr, 0);#endif						if (name == NULL)							ldap_value_free(names);						ldap_msgfree(res);						return (ISC_R_FAILURE);					}				}				ldap_value_free(vals);			}#ifndef LDAPDB_RFC1823API			ldap_memfree(a);#endif		}#ifndef LDAPDB_RFC1823API		if (ptr != NULL)			ber_free(ptr, 0);#endif		if (name == NULL)			ldap_value_free(names);		/* free this result */		ldap_msgfree(res);	}	/* free final result */	ldap_msgfree(res);        return (result);}/* callback routines */static isc_result_tldapdb_lookup(const char *zone, const char *name, void *dbdata,	      dns_sdblookup_t *lookup){	return ldapdb_search(zone, name, dbdata, lookup);}static isc_result_tldapdb_allnodes(const char *zone, void *dbdata,		dns_sdballnodes_t *allnodes){	return ldapdb_search(zone, NULL, dbdata, allnodes);}static char *unhex(char *in){	static const char hexdigits[] = "0123456789abcdef";	char *p, *s = in;	int d1, d2;	while ((s = strchr(s, '%'))) {		if (!(s[1] && s[2]))			return NULL;		if ((p = strchr(hexdigits, tolower(s[1]))) == NULL)			return NULL;		d1 = p - hexdigits;		if ((p = strchr(hexdigits, tolower(s[2]))) == NULL)			return NULL;		d2 = p - hexdigits;		*s++ = d1 << 4 | d2;		memmove(s, s + 2, strlen(s) - 1);	}	return in;}/* returns 0 for ok, -1 for bad syntax, -2 for unknown critical extension */static intparseextensions(char *extensions, struct ldapdb_data *data){	char *s, *next, *name, *value;	int critical;	while (extensions != NULL) {		s = strchr(extensions, ',');		if (s != NULL) {			*s++ = '\0';			next = s;		} else {			next = NULL;		}		if (*extensions != '\0') {			s = strchr(extensions, '=');			if (s != NULL) {				*s++ = '\0';				value = *s != '\0' ? s : NULL;			} else {				value = NULL;			}			name = extensions;			critical = *name == '!';			if (critical) {				name++;			}			if (*name == '\0') {				return -1;			}						if (!strcasecmp(name, "bindname")) {				data->bindname = value;			} else if (!strcasecmp(name, "x-bindpw")) {				data->bindpw = value;#ifdef LDAPDB_TLS			} else if (!strcasecmp(name, "x-tls")) {				data->tls = value == NULL || !strcasecmp(value, "true");#endif			} else if (critical) {				return -2;			}		}		extensions = next;	}	return 0;}static voidfree_data(struct ldapdb_data *data){	if (data->hostport != NULL)		isc_mem_free(ns_g_mctx, data->hostport);	if (data->hostname != NULL)		isc_mem_free(ns_g_mctx, data->hostname);	if (data->filterall != NULL)		isc_mem_put(ns_g_mctx, data->filterall, data->filteralllen);	if (data->filterone != NULL)		isc_mem_put(ns_g_mctx, data->filterone, data->filteronelen);        isc_mem_put(ns_g_mctx, data, sizeof(struct ldapdb_data));}static isc_result_tldapdb_create(const char *zone, int argc, char **argv,	      void *driverdata, void **dbdata){	struct ldapdb_data *data;	char *s, *filter = NULL, *extensions = NULL;	int defaultttl;	UNUSED(driverdata);	/* we assume that only one thread will call create at a time */	/* want to do this only once for all instances */	if ((argc < 2)	    || (argv[0] != strstr( argv[0], "ldap://"))	    || ((defaultttl = atoi(argv[1])) < 1))                return (ISC_R_FAILURE);        data = isc_mem_get(ns_g_mctx, sizeof(struct ldapdb_data));        if (data == NULL)                return (ISC_R_NOMEMORY);	memset(data, 0, sizeof(struct ldapdb_data));	data->hostport = isc_mem_strdup(ns_g_mctx, argv[0] + strlen("ldap://"));	if (data->hostport == NULL) {		free_data(data);		return (ISC_R_NOMEMORY);	}	data->defaultttl = defaultttl;	s = strchr(data->hostport, '/');	if (s != NULL) {		*s++ = '\0';		data->base = s;		/* attrs, scope, filter etc? */		s = strchr(s, '?');		if (s != NULL) {			*s++ = '\0';			/* ignore attributes */			s = strchr(s, '?');			if (s != NULL) {				*s++ = '\0';				/* ignore scope */				s = strchr(s, '?');				if (s != NULL) {					*s++ = '\0';					/* filter */					filter = s;					s = strchr(s, '?');					if (s != NULL) {						*s++ = '\0';						/* extensions */						extensions = s;						s = strchr(s, '?');						if (s != NULL) {							*s++ = '\0';						}						if (*extensions == '\0') {							extensions = NULL;						}					}					if (*filter == '\0') {						filter = NULL;					}				}			}		}		if (*data->base == '\0') {			data->base = NULL;		}	}	/* parse extensions */	if (extensions != NULL) {		int err;		err = parseextensions(extensions, data);		if (err < 0) {			/* err should be -1 or -2 */			free_data(data);			if (err == -1) {				isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_SERVER, ISC_LOG_ERROR,					      "LDAP sdb zone '%s': URL: extension syntax error", zone);			} else if (err == -2) {				isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_SERVER, ISC_LOG_ERROR,					      "LDAP sdb zone '%s': URL: unknown critical extension", zone);			}			return (ISC_R_FAILURE);		}	}	if ((data->base != NULL && unhex(data->base) == NULL) ||	    (filter != NULL && unhex(filter) == NULL) ||	    (data->bindname != NULL && unhex(data->bindname) == NULL) ||	    (data->bindpw != NULL && unhex(data->bindpw) == NULL)) {		free_data(data);		isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_SERVER, ISC_LOG_ERROR,				      "LDAP sdb zone '%s': URL: bad hex values", zone);		return (ISC_R_FAILURE);	}	/* compute filterall and filterone once and for all */	if (filter == NULL) {		data->filteralllen = strlen(zone) + strlen("(zoneName=)") + 1;		data->filteronelen = strlen(zone) + strlen("(&(zoneName=)(relativeDomainName=))") + MAXNAMELEN + 1;	} else {		data->filteralllen = strlen(filter) + strlen(zone) + strlen("(&(zoneName=))") + 1;		data->filteronelen = strlen(filter) + strlen(zone) + strlen("(&(zoneName=)(relativeDomainName=))") + MAXNAMELEN + 1;	}	data->filterall = isc_mem_get(ns_g_mctx, data->filteralllen);	if (data->filterall == NULL) {		free_data(data);		return (ISC_R_NOMEMORY);	}	data->filterone = isc_mem_get(ns_g_mctx, data->filteronelen);	if (data->filterone == NULL) {		free_data(data);		return (ISC_R_NOMEMORY);	}	if (filter == NULL) {		sprintf(data->filterall, "(zoneName=%s)", zone);		sprintf(data->filterone, "(&(zoneName=%s)(relativeDomainName=", zone); 	} else {		sprintf(data->filterall, "(&%s(zoneName=%s))", filter, zone);		sprintf(data->filterone, "(&%s(zoneName=%s)(relativeDomainName=", filter, zone);	}	data->filtername = data->filterone + strlen(data->filterone);	/* support URLs with literal IPv6 addresses */	data->hostname = isc_mem_strdup(ns_g_mctx, data->hostport + (*data->hostport == '[' ? 1 : 0));	if (data->hostname == NULL) {		free_data(data);		return (ISC_R_NOMEMORY);	}	if (*data->hostport == '[' &&	    (s = strchr(data->hostname, ']')) != NULL )		*s++ = '\0';	else		s = data->hostname;	s = strchr(s, ':');	if (s != NULL) {		*s++ = '\0';		data->portno = atoi(s);	} else		data->portno = LDAP_PORT;	*dbdata = data;	return (ISC_R_SUCCESS);}static voidldapdb_destroy(const char *zone, void *driverdata, void **dbdata) {	struct ldapdb_data *data = *dbdata;	        UNUSED(zone);        UNUSED(driverdata);	free_data(data);}static dns_sdbmethods_t ldapdb_methods = {	ldapdb_lookup,	NULL, /* authority */	ldapdb_allnodes,	ldapdb_create,	ldapdb_destroy};/* Wrapper around dns_sdb_register() */isc_result_tldapdb_init(void) {	unsigned int flags =		DNS_SDBFLAG_RELATIVEOWNER |		DNS_SDBFLAG_RELATIVERDATA |		DNS_SDBFLAG_THREADSAFE;	ldapdb_lock(0);	return (dns_sdb_register("ldap", &ldapdb_methods, NULL, flags,				 ns_g_mctx, &ldapdb));}/* Wrapper around dns_sdb_unregister() */voidldapdb_clear(void) {	if (ldapdb != NULL) {		/* clean up thread data */		ldapdb_getconn(NULL);		dns_sdb_unregister(&ldapdb);	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -