[gq-commit] gq/src input.c,1.42,1.43
Status: Beta
Brought to you by:
sur5r
From: <sta...@us...> - 2002-07-15 18:12:33
|
Update of /cvsroot/gqclient/gq/src In directory usw-pr-cvs1:/tmp/cvs-serv11050 Modified Files: input.c Log Message: * Added a test to deal with strange behaviour reported by <gw...@ac...>: When changing a dn where the rdn names an attribute value that does not exist in the object caused the object itself to be deleted. Now there is a test to check for the existence of the object to act accordingly. Index: input.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/input.c,v retrieving revision 1.42 retrieving revision 1.43 diff -C2 -d -r1.42 -r1.43 *** input.c 13 Jul 2002 16:47:38 -0000 1.42 --- input.c 15 Jul 2002 18:12:30 -0000 1.43 *************** *** 1091,1098 **** LDAP *ld; struct ldapserver *server; ! int error, res, i; char *olddn, *dn; char **oldrdn, **rdn; char *c; server = g_hash_table_lookup(hash, "server"); --- 1091,1100 ---- LDAP *ld; struct ldapserver *server; ! int error, rc, i, remove_flag = 0; char *olddn, *dn; char **oldrdn, **rdn; char *c; + char *noattrs[] = { LDAP_NO_ATTRS, NULL }; + LDAPMessage *res; server = g_hash_table_lookup(hash, "server"); *************** *** 1130,1152 **** if (c) free(c); #if defined(HAVE_LDAP_RENAME) ! res = ldap_rename_s(ld, olddn, rdn[0], NULL, 1, NULL, NULL); #else ! res = ldap_modrdn2_s(ld, olddn, rdn[0], 1); #endif ! if(res == LDAP_SUCCESS) { /* get ready for subsequent DN changes */ g_free(olddn); g_hash_table_insert(hash, "olddn", g_strdup(dn)); } else { ! if (res == LDAP_SERVER_DOWN) { server->server_down++; } #if defined(HAVE_LDAP_RENAME) g_string_sprintf(message, "ldap_rename_s: %s", ! ldap_err2string(res)); #else g_string_sprintf(message, "ldap_modrdn2_s: %s", ! ldap_err2string(res)); #endif error_push(context, message->str); --- 1132,1172 ---- if (c) free(c); + /* check to see if the rdn exists as an attribute. If it + does set the remove flag. If it does not do not set the + remove flag. This is due to the fact that in the latter + case a set remove flag actually removes the object (at + least from openldap 2.0 servers. This strange behaviour + was pointed out by <gw...@ac...>. */ + + rc = ldap_search_s(ld, olddn, LDAP_SCOPE_BASE, + oldrdn[0], noattrs, 0, &res); + if (rc == LDAP_SUCCESS) { + LDAPMessage *e = ldap_first_entry(ld, res); + if (e) { + remove_flag = 1; + } + ldap_msgfree(res); + } + /* printf("oldrdn[0]=%s, remove=%d\n", oldrdn[0], remove_flag); */ + #if defined(HAVE_LDAP_RENAME) ! rc = ldap_rename_s(ld, olddn, rdn[0], NULL, remove_flag, NULL, NULL); #else ! rc = ldap_modrdn2_s(ld, olddn, rdn[0], remove_flag); #endif ! if(rc == LDAP_SUCCESS) { /* get ready for subsequent DN changes */ g_free(olddn); g_hash_table_insert(hash, "olddn", g_strdup(dn)); } else { ! if (rc == LDAP_SERVER_DOWN) { server->server_down++; } #if defined(HAVE_LDAP_RENAME) g_string_sprintf(message, "ldap_rename_s: %s", ! ldap_err2string(rc)); #else g_string_sprintf(message, "ldap_modrdn2_s: %s", ! ldap_err2string(rc)); #endif error_push(context, message->str); |