int main(int argc, const char **argv) { struct ldb_context *ldb; struct ldb_result *resultMsg; int i; /* This is the always the first thing you want to do in an LDB application - initialise up the context structure. Note that you can use the context structure as a parent for talloc allocations as well */ ldb = ldb_init(NULL); /* We now open the database. In this example we just hard code the connection path. Also note that the database is being opened read-only. This means that the call will fail unless the database already exists. */ if (LDB_SUCCESS != ldb_connect(ldb, "tdb://tdbtest.ldb", LDB_FLG_RDONLY, NULL) ){ printf("Problem on connection\n"); exit(-1); } /* At this stage we have an open database, and can start using it. It is opened read-only, so a query is possible. We construct a search that just returns all the (sensible) contents. You can do quite fine grained results with the LDAP search syntax, however it is a bit confusing to start with. See RFC2254. */ if (LDB_SUCCESS != ldb_search(ldb, ldb, &resultMsg, NULL, LDB_SCOPE_DEFAULT, NULL, "(dn=*)") ) { printf("Problem in search\n"); exit(-1); } printf("%i records returned\n", resultMsg->count); /* We can now iterate through the results, writing them out (to standard output) with our custom output routine as defined at the top of this file */ for (i = 0; i < resultMsg->count; ++i) { struct ldb_ldif ldifMsg; printf("Message: %i\n", i+1); ldifMsg.changetype = LDB_CHANGETYPE_NONE; ldifMsg.msg = resultMsg->msgs[i]; ldb_ldif_write(ldb, vprintf_fn, NULL, &ldifMsg); } /* There are two objects to clean up - the result from the ldb_search() query, and the original ldb context. */ talloc_free(resultMsg); talloc_free(ldb); return 0; }
int main(int argc, const char **argv) { struct ldb_context *ldb; FILE *fileStream; struct ldb_ldif *ldifMsg; if (argc != 2) { printf("Usage %s filename.ldif\n", argv[0]); exit(1); } /* This is the always the first thing you want to do in an LDB application - initialise up the context structure. Note that you can use the context structure as a parent for talloc allocations as well */ ldb = ldb_init(NULL); fileStream = fopen(argv[1], "r"); if (0 == fileStream) { perror(argv[1]); exit(1); } /* We now work through the filestream to get each entry. */ while ( (ldifMsg = ldb_ldif_read_file(ldb, fileStream)) ) { /* Each message has a particular change type. For Add, Modify and Delete, this will also appear in the output listing (as changetype: add, changetype: modify or changetype:delete, respectively). */ switch (ldifMsg->changetype) { case LDB_CHANGETYPE_NONE: printf("ChangeType: None\n"); break; case LDB_CHANGETYPE_ADD: printf("ChangeType: Add\n"); break; case LDB_CHANGETYPE_MODIFY: printf("ChangeType: Modify\n"); break; case LDB_CHANGETYPE_DELETE: printf("ChangeType: Delete\n"); break; default: printf("ChangeType: Unknown\n"); } /* We can now write out the results, using our custom output routine as defined at the top of this file. */ ldb_ldif_write(ldb, vprintf_fn, NULL, ldifMsg); /* Clean up the message */ ldb_ldif_read_free(ldb, ldifMsg); } /* Clean up the context */ talloc_free(ldb); return 0; }