vtable.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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, const char *filter, char **attrs, int attrsonly, LDAPMessage **res)
  51. {
  52. if (ldapu_VTable.ldapuV_search_s) {
  53. return ldapu_VTable.ldapuV_search_s(ld, base, scope, filter, attrs, attrsonly, res);
  54. }
  55. return LDAP_LOCAL_ERROR;
  56. }
  57. int
  58. ldapu_count_entries(LDAP *ld, LDAPMessage *chain)
  59. {
  60. if (ldapu_VTable.ldapuV_count_entries) {
  61. return ldapu_VTable.ldapuV_count_entries(ld, chain);
  62. }
  63. return 0;
  64. }
  65. LDAPMessage *
  66. ldapu_first_entry(LDAP *ld, LDAPMessage *chain)
  67. {
  68. if (ldapu_VTable.ldapuV_first_entry) {
  69. return ldapu_VTable.ldapuV_first_entry(ld, chain);
  70. }
  71. return NULL;
  72. }
  73. LDAPMessage *
  74. ldapu_next_entry(LDAP *ld, LDAPMessage *entry)
  75. {
  76. if (ldapu_VTable.ldapuV_next_entry) {
  77. return ldapu_VTable.ldapuV_next_entry(ld, entry);
  78. }
  79. return NULL;
  80. }
  81. int
  82. ldapu_msgfree(LDAP *ld, LDAPMessage *chain)
  83. {
  84. if (ldapu_VTable.ldapuV_msgfree) {
  85. return ldapu_VTable.ldapuV_msgfree(ld, chain);
  86. }
  87. return LDAP_SUCCESS;
  88. }
  89. char *
  90. ldapu_get_dn(LDAP *ld, LDAPMessage *entry)
  91. {
  92. if (ldapu_VTable.ldapuV_get_dn) {
  93. return ldapu_VTable.ldapuV_get_dn(ld, entry);
  94. }
  95. return NULL;
  96. }
  97. void
  98. ldapu_memfree(LDAP *ld, void *p)
  99. {
  100. if (ldapu_VTable.ldapuV_memfree) {
  101. ldapu_VTable.ldapuV_memfree(ld, p);
  102. }
  103. }
  104. char *
  105. ldapu_first_attribute(LDAP *ld, LDAPMessage *entry, BerElement **ber)
  106. {
  107. if (ldapu_VTable.ldapuV_first_attribute) {
  108. return ldapu_VTable.ldapuV_first_attribute(ld, entry, ber);
  109. }
  110. return NULL;
  111. }
  112. char *
  113. ldapu_next_attribute(LDAP *ld, LDAPMessage *entry, BerElement *ber)
  114. {
  115. if (ldapu_VTable.ldapuV_next_attribute) {
  116. return ldapu_VTable.ldapuV_next_attribute(ld, entry, ber);
  117. }
  118. return NULL;
  119. }
  120. void
  121. ldapu_ber_free(LDAP *ld, BerElement *ber, int freebuf)
  122. {
  123. if (ldapu_VTable.ldapuV_ber_free) {
  124. ldapu_VTable.ldapuV_ber_free(ld, ber, freebuf);
  125. }
  126. }
  127. char **
  128. ldapu_get_values(LDAP *ld, LDAPMessage *entry, const char *desc)
  129. {
  130. if (ldapu_VTable.ldapuV_get_values) {
  131. return ldapu_VTable.ldapuV_get_values(ld, entry, desc);
  132. } else if (!ldapu_VTable.ldapuV_value_free && ldapu_VTable.ldapuV_get_values_len) {
  133. auto struct berval **bvals =
  134. ldapu_VTable.ldapuV_get_values_len(ld, entry, desc);
  135. if (bvals) {
  136. auto char **vals = (char **)
  137. ldapu_malloc((ldap_count_values_len(bvals) + 1) * sizeof(char *));
  138. if (vals) {
  139. auto char **val;
  140. auto struct berval **bval;
  141. for (val = vals, bval = bvals; *bval; ++val, ++bval) {
  142. auto const size_t len = (*bval)->bv_len;
  143. *val = (char *)ldapu_malloc(len + 1);
  144. memcpy(*val, (*bval)->bv_val, len);
  145. (*val)[len] = '\0';
  146. }
  147. *val = NULL;
  148. ldapu_value_free_len(ld, bvals);
  149. return vals;
  150. }
  151. }
  152. ldapu_value_free_len(ld, bvals);
  153. }
  154. return NULL;
  155. }
  156. void
  157. ldapu_value_free(LDAP *ld, char **vals)
  158. {
  159. if (ldapu_VTable.ldapuV_value_free) {
  160. ldapu_VTable.ldapuV_value_free(ld, vals);
  161. } else if (!ldapu_VTable.ldapuV_get_values && vals) {
  162. auto char **val;
  163. for (val = vals; *val; ++val) {
  164. free(*val);
  165. }
  166. free(vals);
  167. }
  168. }
  169. struct berval **
  170. ldapu_get_values_len(LDAP *ld, LDAPMessage *entry, const char *desc)
  171. {
  172. if (ldapu_VTable.ldapuV_get_values_len) {
  173. return ldapu_VTable.ldapuV_get_values_len(ld, entry, desc);
  174. }
  175. return NULL;
  176. }
  177. void
  178. ldapu_value_free_len(LDAP *ld, struct berval **vals)
  179. {
  180. if (ldapu_VTable.ldapuV_value_free_len) {
  181. ldapu_VTable.ldapuV_value_free_len(ld, vals);
  182. } else if (!ldapu_VTable.ldapuV_get_values_len && vals) {
  183. auto struct berval **val;
  184. for (val = vals; *val; ++val) {
  185. free(*val);
  186. }
  187. free(vals);
  188. }
  189. }