+ case 'E': /* search controls */
+ if( version == LDAP_VERSION2 ) {
+ fprintf( stderr, "%s: -E incompatible with LDAPv%d\n",
+ prog, version );
+ return EXIT_FAILURE;
+ }
+
+ /* should be extended to support comma separated list of
+ * [!]key[=value] parameters, e.g. -E !foo,bar=567
+ */
+
+ crit = 0;
+ cvalue = NULL;
+ if( optarg[0] == '!' ) {
+ crit = 1;
+ optarg++;
+ }
+
+ control = strdup( optarg );
+ if ( (cvalue = strchr( control, '=' )) != NULL ) {
+ *cvalue++ = '\0';
+ }
+
+ if ( strcasecmp( control, "mv" ) == 0 ) {
+ /* ValuesReturnFilter control */
+ if (valuesReturnFilter!=0) {
+ fprintf( stderr, "ValuesReturnFilter previously specified");
+ return EXIT_FAILURE;
+ }
+ valuesReturnFilter= 1 + crit;
+
+ if ( cvalue == NULL ) {
+ fprintf( stderr,
+ "missing filter in ValuesReturnFilter control\n");
+ return EXIT_FAILURE;
+ }
+
+ vrFilter = cvalue;
+ version = LDAP_VERSION3;
+ break;
+
+ } else {
+ fprintf( stderr, "Invalid control name: %s\n", control );
+ usage(prog);
+ return EXIT_FAILURE;
+ }