Add client-side subentries control support.

Make sure client controls are not specified multiple times.
NT port updates.
This commit is contained in:
Kurt Zeilenga 2002-08-30 07:05:12 +00:00
parent 8b2fa75a89
commit 4ce42af196
8 changed files with 100 additions and 4 deletions

View file

@ -155,6 +155,9 @@ Package=<4>
Begin Project Dependency Begin Project Dependency
Project_Dep_Name ldapwhoami Project_Dep_Name ldapwhoami
End Project Dependency End Project Dependency
Begin Project Dependency
Project_Dep_Name ldapcompare
End Project Dependency
}}} }}}
############################################################################### ###############################################################################
@ -239,6 +242,18 @@ Package=<5>
Package=<4> Package=<4>
{{{ {{{
Begin Project Dependency
Project_Dep_Name liblber
End Project Dependency
Begin Project Dependency
Project_Dep_Name libldap
End Project Dependency
Begin Project Dependency
Project_Dep_Name liblutil
End Project Dependency
Begin Project Dependency
Project_Dep_Name libldif
End Project Dependency
}}} }}}
############################################################################### ###############################################################################

View file

@ -130,6 +130,7 @@ main( int argc, char **argv )
"Cd:D:e:h:H:IkKMnO:p:P:qQR:U:vw:WxX:y:Y:zZ")) != EOF ) "Cd:D:e:h:H:IkKMnO:p:P:qQR:U:vw:WxX:y:Y:zZ")) != EOF )
{ {
switch( i ) { switch( i ) {
#if 0
case 'E': /* compare controls */ case 'E': /* compare controls */
if( version == LDAP_VERSION2 ) { if( version == LDAP_VERSION2 ) {
fprintf( stderr, "%s: -E incompatible with LDAPv%d\n", fprintf( stderr, "%s: -E incompatible with LDAPv%d\n",
@ -155,6 +156,7 @@ main( int argc, char **argv )
fprintf( stderr, "Invalid compare control name: %s\n", control ); fprintf( stderr, "Invalid compare control name: %s\n", control );
usage(prog); usage(prog);
return EXIT_FAILURE; return EXIT_FAILURE;
#endif
/* Common Options */ /* Common Options */
case 'C': case 'C':
@ -195,6 +197,10 @@ main( int argc, char **argv )
} }
if ( strcasecmp( control, "manageDSAit" ) == 0 ) { if ( strcasecmp( control, "manageDSAit" ) == 0 ) {
if( manageDSAit ) {
fprintf( stderr, "manageDSAit control previously specified");
return EXIT_FAILURE;
}
if( cvalue != NULL ) { if( cvalue != NULL ) {
fprintf( stderr, "manageDSAit: no control value expected" ); fprintf( stderr, "manageDSAit: no control value expected" );
usage(prog); usage(prog);
@ -206,6 +212,10 @@ main( int argc, char **argv )
break; break;
} else if ( strcasecmp( control, "noop" ) == 0 ) { } else if ( strcasecmp( control, "noop" ) == 0 ) {
if( noop ) {
fprintf( stderr, "noop control previously specified");
return EXIT_FAILURE;
}
if( cvalue != NULL ) { if( cvalue != NULL ) {
fprintf( stderr, "noop: no control value expected" ); fprintf( stderr, "noop: no control value expected" );
usage(prog); usage(prog);

View file

@ -196,6 +196,10 @@ main( int argc, char **argv )
} }
if ( strcasecmp( control, "manageDSAit" ) == 0 ) { if ( strcasecmp( control, "manageDSAit" ) == 0 ) {
if( manageDSAit ) {
fprintf( stderr, "manageDSAit control previously specified");
return EXIT_FAILURE;
}
if( cvalue != NULL ) { if( cvalue != NULL ) {
fprintf( stderr, "manageDSAit: no control value expected" ); fprintf( stderr, "manageDSAit: no control value expected" );
usage(prog); usage(prog);
@ -207,6 +211,10 @@ main( int argc, char **argv )
break; break;
} else if ( strcasecmp( control, "noop" ) == 0 ) { } else if ( strcasecmp( control, "noop" ) == 0 ) {
if( noop ) {
fprintf( stderr, "noop control previously specified");
return EXIT_FAILURE;
}
if( cvalue != NULL ) { if( cvalue != NULL ) {
fprintf( stderr, "noop: no control value expected" ); fprintf( stderr, "noop: no control value expected" );
usage(prog); usage(prog);

View file

@ -253,6 +253,10 @@ main( int argc, char **argv )
} }
if ( strcasecmp( control, "manageDSAit" ) == 0 ) { if ( strcasecmp( control, "manageDSAit" ) == 0 ) {
if( manageDSAit ) {
fprintf( stderr, "manageDSAit control previously specified");
return EXIT_FAILURE;
}
if( cvalue != NULL ) { if( cvalue != NULL ) {
fprintf( stderr, "manageDSAit: no control value expected" ); fprintf( stderr, "manageDSAit: no control value expected" );
usage(prog); usage(prog);
@ -264,6 +268,10 @@ main( int argc, char **argv )
break; break;
} else if ( strcasecmp( control, "noop" ) == 0 ) { } else if ( strcasecmp( control, "noop" ) == 0 ) {
if( noop ) {
fprintf( stderr, "noop control previously specified");
return EXIT_FAILURE;
}
if( cvalue != NULL ) { if( cvalue != NULL ) {
fprintf( stderr, "noop: no control value expected" ); fprintf( stderr, "noop: no control value expected" );
usage(prog); usage(prog);

View file

@ -216,6 +216,10 @@ main(int argc, char **argv)
} }
if ( strcasecmp( control, "manageDSAit" ) == 0 ) { if ( strcasecmp( control, "manageDSAit" ) == 0 ) {
if( manageDSAit ) {
fprintf( stderr, "manageDSAit control previously specified");
return EXIT_FAILURE;
}
if( cvalue != NULL ) { if( cvalue != NULL ) {
fprintf( stderr, "manageDSAit: no control value expected" ); fprintf( stderr, "manageDSAit: no control value expected" );
usage(prog); usage(prog);
@ -227,6 +231,10 @@ main(int argc, char **argv)
break; break;
} else if ( strcasecmp( control, "noop" ) == 0 ) { } else if ( strcasecmp( control, "noop" ) == 0 ) {
if( noop ) {
fprintf( stderr, "noop control previously specified");
return EXIT_FAILURE;
}
if( cvalue != NULL ) { if( cvalue != NULL ) {
fprintf( stderr, "noop: no control value expected" ); fprintf( stderr, "noop: no control value expected" );
usage(prog); usage(prog);

View file

@ -214,6 +214,10 @@ main( int argc, char *argv[] )
} }
if ( strcasecmp( control, "manageDSAit" ) == 0 ) { if ( strcasecmp( control, "manageDSAit" ) == 0 ) {
if( manageDSAit ) {
fprintf( stderr, "manageDSAit control previously specified");
return EXIT_FAILURE;
}
if( cvalue != NULL ) { if( cvalue != NULL ) {
fprintf( stderr, "manageDSAit: no control value expected" ); fprintf( stderr, "manageDSAit: no control value expected" );
usage(prog); usage(prog);

View file

@ -56,6 +56,9 @@ usage( const char *s )
" -b basedn base dn for search\n" " -b basedn base dn for search\n"
" -E [!]<ctrl>[=<ctrlparam>] search controls (! indicates criticality)\n" " -E [!]<ctrl>[=<ctrlparam>] search controls (! indicates criticality)\n"
" [!]mv=<filter> (matched values filter)\n" " [!]mv=<filter> (matched values filter)\n"
#ifdef LDAP_CONTROL_SUBENTRIES
" [!]subentries[=true|false] (subentries)\n"
#endif
" -F prefix URL prefix for files (default: %s)\n" " -F prefix URL prefix for files (default: %s)\n"
" -l limit time limit (in seconds) for search\n" " -l limit time limit (in seconds) for search\n"
" -L print responses in LDIFv1 format\n" " -L print responses in LDIFv1 format\n"
@ -190,7 +193,7 @@ main( int argc, char **argv )
int referrals, timelimit, sizelimit, debug; int referrals, timelimit, sizelimit, debug;
int authmethod, version, want_bindpw; int authmethod, version, want_bindpw;
LDAP *ld = NULL; LDAP *ld = NULL;
int valuesReturnFilter; int subentries, valuesReturnFilter;
BerElement *ber = NULL; BerElement *ber = NULL;
struct berval *bvalp = NULL; struct berval *bvalp = NULL;
char *vrFilter = NULL, *control = NULL, *cvalue; char *vrFilter = NULL, *control = NULL, *cvalue;
@ -198,7 +201,8 @@ main( int argc, char **argv )
infile = NULL; infile = NULL;
debug = verbose = not = vals2tmp = referrals = valuesReturnFilter = debug = verbose = not = vals2tmp = referrals =
subentries = valuesReturnFilter =
attrsonly = manageDSAit = noop = ldif = want_bindpw = 0; attrsonly = manageDSAit = noop = ldif = want_bindpw = 0;
prog = lutil_progname( "ldapsearch", argc, argv ); prog = lutil_progname( "ldapsearch", argc, argv );
@ -282,7 +286,7 @@ main( int argc, char **argv )
if ( strcasecmp( control, "mv" ) == 0 ) { if ( strcasecmp( control, "mv" ) == 0 ) {
/* ValuesReturnFilter control */ /* ValuesReturnFilter control */
if (valuesReturnFilter!=0) { if( valuesReturnFilter ) {
fprintf( stderr, "ValuesReturnFilter previously specified"); fprintf( stderr, "ValuesReturnFilter previously specified");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
@ -298,6 +302,24 @@ main( int argc, char **argv )
version = LDAP_VERSION3; version = LDAP_VERSION3;
break; break;
#ifdef LDAP_CONTROL_SUBENTRIES
} else if ( strcasecmp( control, "subentries" ) == 0 ) {
if( subentries ) {
fprintf( stderr, "subentries control previously specified");
return EXIT_FAILURE;
}
if( cvalue == NULL || strcasecmp( cvalue, "true") == 0 ) {
subentries = 2;
} else if ( strcasecmp( cvalue, "false") == 0 ) {
subentries = 1;
} else {
fprintf( stderr,
"subentries control value \"%s\" invalid\n");
return EXIT_FAILURE;
}
if( crit ) subentries *= -1;
#endif
} else { } else {
fprintf( stderr, "Invalid control name: %s\n", control ); fprintf( stderr, "Invalid control name: %s\n", control );
usage(prog); usage(prog);
@ -392,6 +414,10 @@ main( int argc, char **argv )
} }
if ( strcasecmp( control, "manageDSAit" ) == 0 ) { if ( strcasecmp( control, "manageDSAit" ) == 0 ) {
if( manageDSAit ) {
fprintf( stderr, "manageDSAit control previously specified");
return EXIT_FAILURE;
}
if( cvalue != NULL ) { if( cvalue != NULL ) {
fprintf( stderr, "manageDSAit: no control value expected" ); fprintf( stderr, "manageDSAit: no control value expected" );
usage(prog); usage(prog);
@ -403,6 +429,10 @@ main( int argc, char **argv )
break; break;
} else if ( strcasecmp( control, "noop" ) == 0 ) { } else if ( strcasecmp( control, "noop" ) == 0 ) {
if( noop ) {
fprintf( stderr, "noop control previously specified");
return EXIT_FAILURE;
}
if( cvalue != NULL ) { if( cvalue != NULL ) {
fprintf( stderr, "noop: no control value expected" ); fprintf( stderr, "noop: no control value expected" );
usage(prog); usage(prog);
@ -1051,6 +1081,11 @@ main( int argc, char **argv )
printf("\n# with noop %scontrol", printf("\n# with noop %scontrol",
noop > 1 ? "critical " : "" ); noop > 1 ? "critical " : "" );
} }
if ( subentries ) {
printf("\n# with subentries %scontrol: %s",
subentries < 0 ? "critical " : "",
abs(subentries) == 1 ? "false" : "true" );
}
if ( valuesReturnFilter ) { if ( valuesReturnFilter ) {
printf("\n# with valuesReturnFilter %scontrol: %s", printf("\n# with valuesReturnFilter %scontrol: %s",
valuesReturnFilter > 1 ? "critical " : "", vrFilter ); valuesReturnFilter > 1 ? "critical " : "", vrFilter );

View file

@ -174,6 +174,10 @@ main( int argc, char *argv[] )
} }
if ( strcasecmp( control, "manageDSAit" ) == 0 ) { if ( strcasecmp( control, "manageDSAit" ) == 0 ) {
if( manageDSAit ) {
fprintf( stderr, "manageDSAit control previously specified");
return EXIT_FAILURE;
}
if( cvalue != NULL ) { if( cvalue != NULL ) {
fprintf( stderr, "manageDSAit: no control value expected" ); fprintf( stderr, "manageDSAit: no control value expected" );
usage(prog); usage(prog);
@ -185,6 +189,10 @@ main( int argc, char *argv[] )
break; break;
} else if ( strcasecmp( control, "noop" ) == 0 ) { } else if ( strcasecmp( control, "noop" ) == 0 ) {
if( noop ) {
fprintf( stderr, "noop control previously specified");
return EXIT_FAILURE;
}
if( cvalue != NULL ) { if( cvalue != NULL ) {
fprintf( stderr, "noop: no control value expected" ); fprintf( stderr, "noop: no control value expected" );
usage(prog); usage(prog);