Author: idra Date: 2006-01-06 19:42:08 +0000 (Fri, 06 Jan 2006) New Revision: 12745
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=12745 Log: Initial work to support a syntax to pass over controls via command line to ldbsearch. Very rough work, no checks are done on the input yet (will segfault if you make it wrong). Controls are passed via the --controls switch an are comma separated (no escaping yet). General syntax is <ctrl_name>:<criticality> <ctrl_name> is a string <criticality> is 1 or 0 Current semi-parsed controls are: server_sort syntax: server_sort:1:0:attributename 1st parm: criticality 2nd parm: reversed 3rd parm: attribute name to be used for sorting todo: still missing suport for multiple sorting attributes and ordering rule no check on result code paged_results syntax: paged_results:1:100 1st parm: criticality 2nd parm: number of results to be returned todo: ldbsearch will return only the first batch (missing code to cycle over conditionally) no check on result code extended_dn syntax: extended_dn:1:0 1st parm: criticality 2nd parm: type, see MS docs on meaning Simo. Modified: branches/SAMBA_4_0/source/lib/ldb/tools/cmdline.c branches/SAMBA_4_0/source/lib/ldb/tools/cmdline.h branches/SAMBA_4_0/source/lib/ldb/tools/ldbsearch.c branches/SAMBA_4_0/source/setup/provision_init.ldif Changeset: Modified: branches/SAMBA_4_0/source/lib/ldb/tools/cmdline.c =================================================================== --- branches/SAMBA_4_0/source/lib/ldb/tools/cmdline.c 2006-01-06 19:37:13 UTC (rev 12744) +++ branches/SAMBA_4_0/source/lib/ldb/tools/cmdline.c 2006-01-06 19:42:08 UTC (rev 12745) @@ -62,6 +62,7 @@ { "input", 'I', POPT_ARG_STRING, &options.input, 0, "Input File", "Input" }, { "output", 'O', POPT_ARG_STRING, &options.output, 0, "Output File", "Output" }, { NULL, 'o', POPT_ARG_STRING, NULL, 'o', "ldb_connect option", "OPTION" }, + { "controls", 0, POPT_ARG_STRING, NULL, 'c', "controls", NULL }, #ifdef _SAMBA_BUILD_ POPT_COMMON_SAMBA POPT_COMMON_CREDENTIALS @@ -137,7 +138,35 @@ options.options[num_options+1] = NULL; num_options++; break; - + + case 'c': { + const char *cs = poptGetOptArg(pc); + const char *p; + int cc; + + for (p = cs, cc = 1; p = strchr(p, ','); cc++) ; + + options.controls = talloc_array(ret, char *, cc + 1); + if (options.controls == NULL) { + ldb_oom(ldb); + goto failed; + } + for (p = cs, cc = 0; p != NULL; cc++) { + const char *t; + + t = strchr(p, ','); + if (t == NULL) { + options.controls[cc] = talloc_strdup(options.controls, p); + p = NULL; + } else { + options.controls[cc] = talloc_strndup(options.controls, p, t-p); + p = t + 1; + } + } + options.controls[cc + 1] = NULL; + + break; + } default: fprintf(stderr, "Invalid option %s: %s\n", poptBadOption(pc, 0), poptStrerror(opt)); Modified: branches/SAMBA_4_0/source/lib/ldb/tools/cmdline.h =================================================================== --- branches/SAMBA_4_0/source/lib/ldb/tools/cmdline.h 2006-01-06 19:37:13 UTC (rev 12744) +++ branches/SAMBA_4_0/source/lib/ldb/tools/cmdline.h 2006-01-06 19:42:08 UTC (rev 12745) @@ -43,6 +43,7 @@ const char *sasl_mechanism; const char *input; const char *output; + char **controls; }; struct ldb_cmdline *ldb_cmdline_process(struct ldb_context *ldb, int argc, const char **argv, Modified: branches/SAMBA_4_0/source/lib/ldb/tools/ldbsearch.c =================================================================== --- branches/SAMBA_4_0/source/lib/ldb/tools/ldbsearch.c 2006-01-06 19:37:13 UTC (rev 12744) +++ branches/SAMBA_4_0/source/lib/ldb/tools/ldbsearch.c 2006-01-06 19:42:08 UTC (rev 12745) @@ -64,25 +64,93 @@ return ldb_dn_compare(ldb, (*el1)->dn, (*el2)->dn); } +static struct ldb_control **parse_controls(void *mem_ctx, char **control_strings) +{ + int i; + struct ldb_control **ctrl; + + if (control_strings == NULL || control_strings[0] == NULL) + return NULL; + + for (i = 0; control_strings[i]; i++); + + ctrl = talloc_array(mem_ctx, struct ldb_control *, i + 1); + + for (i = 0; control_strings[i]; i++) { + if (strncmp(control_strings[i], "extended_dn:", 12) == 0) { + struct ldb_extended_dn_control *control; + + ctrl[i] = talloc(ctrl, struct ldb_control); + ctrl[i]->oid = LDB_CONTROL_EXTENDED_DN_OID; + ctrl[i]->critical = control_strings[i][12]=='1'?1:0; + control = talloc(ctrl[i], struct ldb_extended_dn_control); + control->type = atoi(&control_strings[i][14]); + ctrl[i]->data = control; + } + + if (strncmp(control_strings[i], "paged_results:", 14) == 0) { + struct ldb_paged_control *control; + + ctrl[i] = talloc(ctrl, struct ldb_control); + ctrl[i]->oid = LDB_CONTROL_PAGED_RESULTS_OID; + ctrl[i]->critical = control_strings[i][14]=='1'?1:0; + control = talloc(ctrl[i], struct ldb_paged_control); + control->size = atoi(&control_strings[i][16]); + control->cookie = NULL; + control->cookie_len = 0; + ctrl[i]->data = control; + } + + if (strncmp(control_strings[i], "server_sort:", 12) == 0) { + struct ldb_server_sort_control **control; + + ctrl[i] = talloc(ctrl, struct ldb_control); + ctrl[i]->oid = LDB_CONTROL_SERVER_SORT_OID; + ctrl[i]->critical = control_strings[i][12]=='1'?1:0; + control = talloc_array(ctrl[i], struct ldb_server_sort_control *, 2); + control[0] = talloc(control, struct ldb_server_sort_control); + control[0]->attributeName = talloc_strdup(control, &control_strings[i][16]); + control[0]->orderingRule = NULL; + control[0]->reverse = control_strings[i][14]=='1'?1:0; + control[1] = NULL; + ctrl[i]->data = control; + } + } + + ctrl[i + 1] = NULL; + + return ctrl; +} + static int do_search(struct ldb_context *ldb, const struct ldb_dn *basedn, - int scope, - int sort_attribs, + struct ldb_cmdline *options, const char *expression, const char * const *attrs) { int ret, i; + struct ldb_request req; struct ldb_result *result = NULL; - ret = ldb_search(ldb, basedn, scope, expression, attrs, &result); + req.operation = LDB_REQ_SEARCH; + req.op.search.base = basedn; + req.op.search.scope = options->scope; + req.op.search.tree = ldb_parse_tree(ldb, expression); + req.op.search.attrs = attrs; + req.op.search.res = NULL; + req.controls = parse_controls(ldb, options->controls); + req.creds = NULL; + + ret = ldb_request(ldb, &req); if (ret != LDB_SUCCESS) { printf("search failed - %s\n", ldb_errstring(ldb)); return -1; } + result = req.op.search.res; printf("# returned %d records\n", ret); - if (sort_attribs) { + if (options->sorted) { ldb_qsort(result->msgs, ret, sizeof(struct ldb_message *), ldb, (ldb_qsort_cmp_fn_t)do_compare_msg); } @@ -94,7 +162,7 @@ ldif.changetype = LDB_CHANGETYPE_NONE; ldif.msg = result->msgs[i]; - if (sort_attribs) { + if (options->sorted) { /* * Ensure attributes are always returned in the same * order. For testing, this makes comparison of old @@ -154,14 +222,12 @@ if (options->interactive) { char line[1024]; while (fgets(line, sizeof(line), stdin)) { - if (do_search(ldb, basedn, - options->scope, options->sorted, line, attrs) == -1) { + if (do_search(ldb, basedn, options, line, attrs) == -1) { ret = -1; } } } else { - ret = do_search(ldb, basedn, options->scope, options->sorted, - expression, attrs); + ret = do_search(ldb, basedn, options, expression, attrs); } talloc_free(ldb); Modified: branches/SAMBA_4_0/source/setup/provision_init.ldif =================================================================== --- branches/SAMBA_4_0/source/setup/provision_init.ldif 2006-01-06 19:37:13 UTC (rev 12744) +++ branches/SAMBA_4_0/source/setup/provision_init.ldif 2006-01-06 19:42:08 UTC (rev 12745) @@ -69,5 +69,5 @@ #Add modules to the list to activate them by default #beware often order is important dn: @MODULES [EMAIL PROTECTED]: rootdse,samldb,password_hash,operational,objectguid,rdn_name,objectclass [EMAIL PROTECTED]: rootdse,paged_results,server_sort,extended_dn,samldb,password_hash,operational,objectguid,rdn_name,objectclass
