📄 ldb_ldif.c
字号:
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 + -