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

📄 ldb_ldif.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 2 页
字号:
	int c;	int in_comment = 0;	while ((c = fgetc_fn(private_data)) != EOF) {		if (chunk_size+1 >= alloc_size) {			char *c2;			alloc_size += 1024;			c2 = talloc_realloc(ldb, chunk, char, alloc_size);			if (!c2) {				talloc_free(chunk);				errno = ENOMEM;				return NULL;			}			chunk = c2;		}		if (in_comment) {			if (c == '\n') {				in_comment = 0;			}			continue;					}				/* handle continuation lines - see RFC2849 */		if (c == ' ' && chunk_size > 1 && chunk[chunk_size-1] == '\n') {			chunk_size--;			continue;		}				/* chunks are terminated by a double line-feed */		if (c == '\n' && chunk_size > 0 && chunk[chunk_size-1] == '\n') {			chunk[chunk_size-1] = 0;			return chunk;		}		if (c == '#' && (chunk_size == 0 || chunk[chunk_size-1] == '\n')) {			in_comment = 1;			continue;		}		/* ignore leading blank lines */		if (chunk_size == 0 && c == '\n') {			continue;		}		chunk[chunk_size++] = c;	}	if (chunk) {		chunk[chunk_size] = 0;	}	return chunk;}/* simple ldif attribute parser */static int next_attr(void *mem_ctx, char **s, const char **attr, struct ldb_val *value){	char *p;	int base64_encoded = 0;	int binary_file = 0;	if (strncmp(*s, "-\n", 2) == 0) {		value->length = 0;		*attr = "-";		*s += 2;		return 0;	}	p = strchr(*s, ':');	if (!p) {		return -1;	}	*p++ = 0;	if (*p == ':') {		base64_encoded = 1;		p++;	}	if (*p == '<') {		binary_file = 1;		p++;	}	*attr = *s;	while (*p == ' ' || *p == '\t') {		p++;	}	value->data = (uint8_t *)p;	p = strchr(p, '\n');	if (!p) {		value->length = strlen((char *)value->data);		*s = ((char *)value->data) + value->length;	} else {		value->length = p - (char *)value->data;		*s = p+1;		*p = 0;	}	if (base64_encoded) {		int len = ldb_base64_decode((char *)value->data);		if (len == -1) {			/* it wasn't valid base64 data */			return -1;		}		value->length = len;	}	if (binary_file) {		int len = ldb_read_data_file(mem_ctx, value);		if (len == -1) {			/* an error occured hile trying to retrieve the file */			return -1;		}	}	return 0;}/*  free a message from a ldif_read*/void ldb_ldif_read_free(struct ldb_context *ldb, struct ldb_ldif *ldif){	talloc_free(ldif);}/* read from a LDIF source, creating a ldb_message*/struct ldb_ldif *ldb_ldif_read(struct ldb_context *ldb,			       int (*fgetc_fn)(void *), void *private_data){	struct ldb_ldif *ldif;	struct ldb_message *msg;	const char *attr=NULL;	char *chunk=NULL, *s;	struct ldb_val value;	unsigned flags = 0;	value.data = NULL;	ldif = talloc(ldb, struct ldb_ldif);	if (!ldif) return NULL;	ldif->msg = talloc(ldif, struct ldb_message);	if (ldif->msg == NULL) {		talloc_free(ldif);		return NULL;	}	ldif->changetype = LDB_CHANGETYPE_NONE;	msg = ldif->msg;	msg->dn = NULL;	msg->elements = NULL;	msg->num_elements = 0;	chunk = next_chunk(ldb, fgetc_fn, private_data);	if (!chunk) {		goto failed;	}	talloc_steal(ldif, chunk);	s = chunk;	if (next_attr(ldif, &s, &attr, &value) != 0) {		goto failed;	}		/* first line must be a dn */	if (ldb_attr_cmp(attr, "dn") != 0) {		ldb_debug(ldb, LDB_DEBUG_ERROR, "Error: First line of ldif must be a dn not '%s'\n", 			  attr);		goto failed;	}	msg->dn = ldb_dn_new(msg, ldb, (char *)value.data);	if ( ! ldb_dn_validate(msg->dn)) {		ldb_debug(ldb, LDB_DEBUG_ERROR, "Error: Unable to parse dn '%s'\n", 				  value.data);		goto failed;	}	while (next_attr(ldif, &s, &attr, &value) == 0) {		const struct ldb_schema_attribute *a;		struct ldb_message_element *el;		int ret, empty = 0;		if (ldb_attr_cmp(attr, "changetype") == 0) {			int i;			for (i=0;ldb_changetypes[i].name;i++) {				if (ldb_attr_cmp((char *)value.data, ldb_changetypes[i].name) == 0) {					ldif->changetype = ldb_changetypes[i].changetype;					break;				}			}			if (!ldb_changetypes[i].name) {				ldb_debug(ldb, LDB_DEBUG_ERROR, 					  "Error: Bad ldif changetype '%s'\n",(char *)value.data);			}			flags = 0;			continue;		}		if (ldb_attr_cmp(attr, "add") == 0) {			flags = LDB_FLAG_MOD_ADD;			empty = 1;		}		if (ldb_attr_cmp(attr, "delete") == 0) {			flags = LDB_FLAG_MOD_DELETE;			empty = 1;		}		if (ldb_attr_cmp(attr, "replace") == 0) {			flags = LDB_FLAG_MOD_REPLACE;			empty = 1;		}		if (ldb_attr_cmp(attr, "-") == 0) {			flags = 0;			continue;		}		if (empty) {			if (ldb_msg_add_empty(msg, (char *)value.data, flags, NULL) != 0) {				goto failed;			}			continue;		}				el = &msg->elements[msg->num_elements-1];		a = ldb_schema_attribute_by_name(ldb, attr);		if (msg->num_elements > 0 && ldb_attr_cmp(attr, el->name) == 0 &&		    flags == el->flags) {			/* its a continuation */			el->values = 				talloc_realloc(msg->elements, el->values, 						 struct ldb_val, el->num_values+1);			if (!el->values) {				goto failed;			}			ret = a->syntax->ldif_read_fn(ldb, ldif, &value, &el->values[el->num_values]);			if (ret != 0) {				goto failed;			}			if (value.length == 0) {				ldb_debug(ldb, LDB_DEBUG_ERROR,					  "Error: Attribute value cannot be empty for attribute '%s'\n", el->name);				goto failed;			}			if (value.data != el->values[el->num_values].data) {				talloc_steal(el->values, el->values[el->num_values].data);			}			el->num_values++;		} else {			/* its a new attribute */			msg->elements = talloc_realloc(ldif, msg->elements, 							 struct ldb_message_element, 							 msg->num_elements+1);			if (!msg->elements) {				goto failed;			}			el = &msg->elements[msg->num_elements];			el->flags = flags;			el->name = talloc_strdup(msg->elements, attr);			el->values = talloc(msg->elements, struct ldb_val);			if (!el->values || !el->name) {				goto failed;			}			el->num_values = 1;			ret = a->syntax->ldif_read_fn(ldb, ldif, &value, &el->values[0]);			if (ret != 0) {				goto failed;			}			if (value.data != el->values[0].data) {				talloc_steal(el->values, el->values[0].data);			}			msg->num_elements++;		}	}	return ldif;failed:	talloc_free(ldif);	return NULL;}/*  a wrapper around ldif_read() for reading from FILE**/struct ldif_read_file_state {	FILE *f;};static int fgetc_file(void *private_data){	struct ldif_read_file_state *state =		(struct ldif_read_file_state *)private_data;	return fgetc(state->f);}struct ldb_ldif *ldb_ldif_read_file(struct ldb_context *ldb, FILE *f){	struct ldif_read_file_state state;	state.f = f;	return ldb_ldif_read(ldb, fgetc_file, &state);}/*  a wrapper around ldif_read() for reading from const char**/struct ldif_read_string_state {	const char *s;};static int fgetc_string(void *private_data){	struct ldif_read_string_state *state =		(struct ldif_read_string_state *)private_data;	if (state->s[0] != 0) {		return *state->s++;	}	return EOF;}struct ldb_ldif *ldb_ldif_read_string(struct ldb_context *ldb, const char **s){	struct ldif_read_string_state state;	struct ldb_ldif *ldif;	state.s = *s;	ldif = ldb_ldif_read(ldb, fgetc_string, &state);	*s = state.s;	return ldif;}/*  wrapper around ldif_write() for a file*/struct ldif_write_file_state {	FILE *f;};static int fprintf_file(void *private_data, const char *fmt, ...) PRINTF_ATTRIBUTE(2, 3);static int fprintf_file(void *private_data, const char *fmt, ...){	struct ldif_write_file_state *state =		(struct ldif_write_file_state *)private_data;	int ret;	va_list ap;	va_start(ap, fmt);	ret = vfprintf(state->f, fmt, ap);	va_end(ap);	return ret;}int ldb_ldif_write_file(struct ldb_context *ldb, FILE *f, const struct ldb_ldif *ldif){	struct ldif_write_file_state state;	state.f = f;	return ldb_ldif_write(ldb, fprintf_file, &state, ldif);}

⌨️ 快捷键说明

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