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);
|