fprintf( stderr,"Illegal 'after' paramater for virtual list\n" );
fprintf( stderr,"Illegal 'after' parameter for virtual list\n" );
options_callback( int option, char *optarg ){    char *s, *ps_ptr, *ps_arg;    char *temp_arg = NULL;    switch( option ) {    case 'u':	/* include UFN */	++includeufn;	break;    case 't':	/* write attribute values to /tmp files */	++vals2tmp;	break;    case 'U':	/* produce file URLs in conjunction with -t */	++produce_file_urls;	break;    case 'e':	/* minimize base-64 encoding of values */	++minimize_base64;	break;    case 'A':	/* retrieve attribute names only -- no values */	++attrsonly;	break;    case 'L':       /* print entries in LDIF format -- now the default */	break;    case 'o':	/* print entries using old ldapsearch format */	ldif = 0;	break;    case 'B':	/* allow binary values to be printed, even if -o used */	++allow_binary;	break;    case '1':	/* omit leading "version: #" line from LDIF output */	write_ldif_version = 0;	break;    case 's':	/* search scope */	if ( strncasecmp( optarg, "base", 4 ) == 0 ) {	    scope = LDAP_SCOPE_BASE;	} else if ( strncasecmp( optarg, "one", 3 ) == 0 ) {	    scope = LDAP_SCOPE_ONELEVEL;	} else if ( strncasecmp( optarg, "sub", 3 ) == 0 ) {	    scope = LDAP_SCOPE_SUBTREE;	} else {	    fprintf( stderr, "scope should be base, one, or sub\n" );	    usage();	}	break;    case 'a':	/* set alias deref option */	if ( strncasecmp( optarg, "never", 5 ) == 0 ) {	    deref = LDAP_DEREF_NEVER;	} else if ( strncasecmp( optarg, "search", 5 ) == 0 ) {	    deref = LDAP_DEREF_SEARCHING;	} else if ( strncasecmp( optarg, "find", 4 ) == 0 ) {	    deref = LDAP_DEREF_FINDING;	} else if ( strncasecmp( optarg, "always", 6 ) == 0 ) {	    deref = LDAP_DEREF_ALWAYS;	} else {	    fprintf( stderr, "alias deref should be never, search, find, or always\n" );	    usage();	}	break;    case 'F':	/* field separator */	sep = strdup( optarg );	break;    case 'b':	/* searchbase */	base = strdup( optarg );	break;    case 'l':	/* time limit */	timelimit = atoi( optarg );	break;    case 'x':	/* server sorting requested */	server_sort = 1;	break;    case 'z':	/* size limit */	sizelimit = atoi( optarg );	break;    case 'S':	/* sort attribute */	ldap_charray_add( &sortattr, strdup( optarg ) );	break;    case 'T':	/* don't fold lines */	fold = 0;	break;    case 'G':  /* do the virtual list setup */	use_vlv++;	s = strchr(optarg, VLV_PARAM_SEP );		if (s != NULL)	{	    vlv_before = atoi(optarg);	    s++;	    vlv_after = atoi( s );	    s = strchr(s, VLV_PARAM_SEP );	    if (s != NULL)	    {		s++;		/* below is a small set of logic to implement the following cases		 * -G23:23:wilber		 * -G23:23:"wilber:wright"		 * -G23:23:'wilber'		 * -G23:23:wilber wright		 * all of the above are before, after, value -  NOTE: a colon not in a quoted 		 * string will break the parser!!!!		 * -G23:23:45:600		 * above is index, count encoding		 */		if (*s == '\'' || *s == '"')		{		    vlv_value = strdup( s );		}		else		{		    if (strchr( s, VLV_PARAM_SEP ))		    {			/* we have an index + count option */			vlv_index = atoi( s );			vlv_count = atoi( strchr( s, VLV_PARAM_SEP) + 1);		    }		    else		    {			/* we don't have a quote surrounding the assertion value 			 * do we need to??? 			 */			vlv_value = strdup( s );		    }		}	    }	    else	    {		fprintf( stderr,"Illegal 'after' paramater for virtual list\n" );		exit( LDAP_PARAM_ERROR );	    }	    	}	else	{	    fprintf( stderr,"Illegal 'before' paramater for virtual list\n" );	    exit( LDAP_PARAM_ERROR );	}	break;    case 'C':	use_psearch++;	if ( (ps_arg = strdup( optarg)) == NULL ) {	    perror ("strdup");	    exit (LDAP_NO_MEMORY);	}		ps_ptr=strtok(ps_arg, ":");	if (ps_ptr == NULL || (strcasecmp(ps_ptr, "ps")) ) {	    fprintf (stderr, "Invalid argument for -C\n");	    usage();	}	if (NULL != (ps_ptr=strtok(NULL, ":"))) {	    if ( (temp_arg = strdup( ps_ptr )) == NULL ) {	        perror ("strdup");	    	exit (LDAP_NO_MEMORY);	    } 	} else {	    fprintf (stderr, "Invalid argument for -C\n");	    usage();	}	if (NULL != (ps_ptr=strtok(NULL, ":"))) {	    if ( (changesonly = ldaptool_boolean_str2value(ps_ptr, 0)) == -1) {		fprintf(stderr, "Invalid option value: %s\n", ps_ptr);		usage();	    }	}    	if (NULL != (ps_ptr=strtok(NULL, ":"))) {	    if ( (return_echg_ctls = ldaptool_boolean_str2value(ps_ptr, 0)) == -1) {		fprintf(stderr, "Invalid option value: %s\n", ps_ptr);		usage();	    }	}    	/* Now parse the temp_arg and build chgtype as	 * the changetypes are encountered */	if ((ps_ptr = strtok( temp_arg, "," )) == NULL) {		usage();	} else {	    while ( ps_ptr ) {		if ((strcasecmp(ps_ptr, "add"))==0) 		    chgtype |= LDAP_CHANGETYPE_ADD;		else if ((strcasecmp(ps_ptr, "delete"))==0) 		    chgtype |= LDAP_CHANGETYPE_DELETE;		else if ((strcasecmp(ps_ptr, "modify"))==0) 		    chgtype |= LDAP_CHANGETYPE_MODIFY;		else if ((strcasecmp(ps_ptr, "moddn"))==0) 		    chgtype |= LDAP_CHANGETYPE_MODDN;		else if ((strcasecmp(ps_ptr, "any"))==0) 		    chgtype = LDAP_CHANGETYPE_ANY;		else {			fprintf(stderr, "Unknown changetype: %s\n", ps_ptr);			usage();		}		ps_ptr = strtok( NULL, "," );	    }	  }	break;    default:	usage();	break;    }}