+
+ if ( expect_ct ) {
+ /* Check for "control" tag after dn and before changetype. */
+ if (strcasecmp(type, T_CONTROL_STR) == 0) {
+ /* Parse and add it to the list of controls */
+ rc = parse_ldif_control( line, &pctrls );
+ if (rc != 0) {
+ fprintf( stderr,
+ _("%s: Error processing %s line, line %d: %s\n"),
+ prog, T_CONTROL_STR, linenum, ldap_err2string(rc) );
+ }
+ goto end_line;
+ }
+
+ expect_ct = 0;
+ if ( !use_record && saw_replica ) {
+ printf(_("%s: skipping change record for entry: %s\n"),
+ prog, dn);
+ printf(_("\t(LDAP host/port does not match replica: lines)\n"));
+ free( dn );
+ ber_memfree( type );
+ ber_memfree( val.bv_val );
+ return( 0 );
+ }
+
+ if ( strcasecmp( type, T_CHANGETYPESTR ) == 0 ) {
+#ifdef LIBERAL_CHANGETYPE_MODOP
+ /* trim trailing spaces (and log warning ...) */
+ int icnt;
+ for ( icnt = val.bv_len; --icnt > 0; ) {
+ if ( !isspace( (unsigned char) val.bv_val[icnt] ) ) {
+ break;
+ }
+ }
+
+ if ( ++icnt != val.bv_len ) {
+ fprintf( stderr, _("%s: illegal trailing space after"
+ " \"%s: %s\" trimmed (line %d of entry \"%s\")\n"),
+ prog, T_CHANGETYPESTR, val.bv_val, linenum, dn );
+ val.bv_val[icnt] = '\0';
+ }
+#endif /* LIBERAL_CHANGETYPE_MODOP */
+
+ if ( strcasecmp( val.bv_val, T_MODIFYCTSTR ) == 0 ) {
+ new_entry = 0;
+ expect_modop = 1;
+ } else if ( strcasecmp( val.bv_val, T_ADDCTSTR ) == 0 ) {
+ new_entry = 1;
+ } else if ( strcasecmp( val.bv_val, T_MODRDNCTSTR ) == 0
+ || strcasecmp( val.bv_val, T_MODDNCTSTR ) == 0
+ || strcasecmp( val.bv_val, T_RENAMECTSTR ) == 0)
+ {
+ expect_newrdn = 1;
+ } else if ( strcasecmp( val.bv_val, T_DELETECTSTR ) == 0 ) {
+ got_all = delete_entry = 1;
+ } else {
+ fprintf( stderr,
+ _("%s: unknown %s \"%s\" (line %d of entry \"%s\")\n"),
+ prog, T_CHANGETYPESTR, val.bv_val, linenum, dn );
+ rc = LDAP_PARAM_ERROR;
+ }
+ goto end_line;
+ } else if ( ldapadd ) { /* missing changetype => add */
+ new_entry = 1;
+ modop = LDAP_MOD_ADD;
+ } else {
+ expect_modop = 1; /* missing changetype => modify */
+ }