vtable.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. /** BEGIN COPYRIGHT BLOCK
  2. * Copyright (C) 2001 Sun Microsystems, Inc. Used by permission.
  3. * Copyright (C) 2005 Red Hat, Inc.
  4. * All rights reserved.
  5. *
  6. * License: GPL (version 3 or any later version).
  7. * See LICENSE for details.
  8. * END COPYRIGHT BLOCK **/
  9. #ifdef HAVE_CONFIG_H
  10. # include <config.h>
  11. #endif
  12. #include "ldaputili.h"
  13. #include <ldap.h>
  14. static LDAPUVTable_t ldapu_VTable = {0};
  15. /* Replace ldapu_VTable. Subsequently, ldaputil will call the
  16. functions in 'from' (not the LDAP API) to access the directory.
  17. */
  18. void
  19. ldapu_VTable_set (LDAPUVTable_t* from)
  20. {
  21. if (from) {
  22. memcpy (&ldapu_VTable, from, sizeof(LDAPUVTable_t));
  23. }
  24. }
  25. int
  26. ldapu_set_option( LDAP *ld, int option, void *optdata )
  27. {
  28. if (ldapu_VTable.ldapuV_set_option) {
  29. return ldapu_VTable.ldapuV_set_option (ld, option, optdata);
  30. }
  31. return LDAP_LOCAL_ERROR;
  32. }
  33. int
  34. ldapu_simple_bind_s( LDAP *ld, const char *who, const char *passwd )
  35. {
  36. if (ldapu_VTable.ldapuV_simple_bind_s) {
  37. return ldapu_VTable.ldapuV_simple_bind_s (ld, who, passwd);
  38. }
  39. return LDAP_LOCAL_ERROR;
  40. }
  41. int
  42. ldapu_unbind( LDAP *ld )
  43. {
  44. if (ldapu_VTable.ldapuV_unbind) {
  45. return ldapu_VTable.ldapuV_unbind (ld);
  46. }
  47. return LDAP_LOCAL_ERROR;
  48. }
  49. int
  50. ldapu_search_s( LDAP *ld, const char *base, int scope,
  51. const char *filter, char **attrs, int attrsonly, LDAPMessage **res )
  52. {
  53. if (ldapu_VTable.ldapuV_search_s) {
  54. return ldapu_VTable.ldapuV_search_s (ld, base, scope, filter, attrs, attrsonly, res);
  55. }
  56. return LDAP_LOCAL_ERROR;
  57. }
  58. int
  59. ldapu_count_entries( LDAP *ld, LDAPMessage *chain )
  60. {
  61. if (ldapu_VTable.ldapuV_count_entries) {
  62. return ldapu_VTable.ldapuV_count_entries (ld, chain);
  63. }
  64. return 0;
  65. }
  66. LDAPMessage*
  67. ldapu_first_entry( LDAP *ld, LDAPMessage *chain )
  68. {
  69. if (ldapu_VTable.ldapuV_first_entry) {
  70. return ldapu_VTable.ldapuV_first_entry (ld, chain);
  71. }
  72. return NULL;
  73. }
  74. LDAPMessage*
  75. ldapu_next_entry( LDAP *ld, LDAPMessage *entry )
  76. {
  77. if (ldapu_VTable.ldapuV_next_entry) {
  78. return ldapu_VTable.ldapuV_next_entry (ld, entry);
  79. }
  80. return NULL;
  81. }
  82. int
  83. ldapu_msgfree( LDAP* ld, LDAPMessage *chain )
  84. {
  85. if (ldapu_VTable.ldapuV_msgfree) {
  86. return ldapu_VTable.ldapuV_msgfree (ld, chain);
  87. }
  88. return LDAP_SUCCESS;
  89. }
  90. char*
  91. ldapu_get_dn( LDAP *ld, LDAPMessage *entry )
  92. {
  93. if (ldapu_VTable.ldapuV_get_dn) {
  94. return ldapu_VTable.ldapuV_get_dn (ld, entry);
  95. }
  96. return NULL;
  97. }
  98. void
  99. ldapu_memfree( LDAP* ld, void *p )
  100. {
  101. if (ldapu_VTable.ldapuV_memfree) {
  102. ldapu_VTable.ldapuV_memfree (ld, p);
  103. }
  104. }
  105. char*
  106. ldapu_first_attribute( LDAP *ld, LDAPMessage *entry, BerElement **ber )
  107. {
  108. if (ldapu_VTable.ldapuV_first_attribute) {
  109. return ldapu_VTable.ldapuV_first_attribute (ld, entry, ber);
  110. }
  111. return NULL;
  112. }
  113. char*
  114. ldapu_next_attribute( LDAP *ld, LDAPMessage *entry, BerElement *ber )
  115. {
  116. if (ldapu_VTable.ldapuV_next_attribute) {
  117. return ldapu_VTable.ldapuV_next_attribute (ld, entry, ber);
  118. }
  119. return NULL;
  120. }
  121. void
  122. ldapu_ber_free( LDAP* ld, BerElement *ber, int freebuf )
  123. {
  124. if (ldapu_VTable.ldapuV_ber_free) {
  125. ldapu_VTable.ldapuV_ber_free (ld, ber, freebuf);
  126. }
  127. }
  128. char**
  129. ldapu_get_values( LDAP *ld, LDAPMessage *entry, const char *desc )
  130. {
  131. if (ldapu_VTable.ldapuV_get_values) {
  132. return ldapu_VTable.ldapuV_get_values (ld, entry, desc);
  133. } else if (!ldapu_VTable.ldapuV_value_free
  134. && ldapu_VTable.ldapuV_get_values_len) {
  135. auto struct berval** bvals =
  136. ldapu_VTable.ldapuV_get_values_len (ld, entry, desc);
  137. if (bvals) {
  138. auto char** vals = (char**)
  139. ldapu_malloc ((ldap_count_values_len (bvals) + 1)
  140. * sizeof(char*));
  141. if (vals) {
  142. auto char** val;
  143. auto struct berval** bval;
  144. for (val = vals, bval = bvals; *bval; ++val, ++bval) {
  145. auto const size_t len = (*bval)->bv_len;
  146. *val = (char*) ldapu_malloc (len + 1);
  147. memcpy (*val, (*bval)->bv_val, len);
  148. (*val)[len] = '\0';
  149. }
  150. *val = NULL;
  151. ldapu_value_free_len(ld, bvals);
  152. return vals;
  153. }
  154. }
  155. ldapu_value_free_len(ld, bvals);
  156. }
  157. return NULL;
  158. }
  159. void
  160. ldapu_value_free( LDAP *ld, char **vals )
  161. {
  162. if (ldapu_VTable.ldapuV_value_free) {
  163. ldapu_VTable.ldapuV_value_free (ld, vals);
  164. } else if (!ldapu_VTable.ldapuV_get_values && vals) {
  165. auto char** val;
  166. for (val = vals; *val; ++val) {
  167. free (*val);
  168. }
  169. free (vals);
  170. }
  171. }
  172. struct berval**
  173. ldapu_get_values_len( LDAP *ld, LDAPMessage *entry, const char *desc )
  174. {
  175. if (ldapu_VTable.ldapuV_get_values_len) {
  176. return ldapu_VTable.ldapuV_get_values_len (ld, entry, desc);
  177. }
  178. return NULL;
  179. }
  180. void
  181. ldapu_value_free_len( LDAP *ld, struct berval **vals )
  182. {
  183. if (ldapu_VTable.ldapuV_value_free_len) {
  184. ldapu_VTable.ldapuV_value_free_len (ld, vals);
  185. } else if (!ldapu_VTable.ldapuV_get_values_len && vals) {
  186. auto struct berval** val;
  187. for (val = vals; *val; ++val) {
  188. free (*val);
  189. }
  190. free (vals);
  191. }
  192. }