sicis.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. /** BEGIN COPYRIGHT BLOCK
  2. * Copyright (C) 2005 Red Hat, Inc.
  3. * All rights reserved.
  4. *
  5. * License: GPL (version 3 or any later version).
  6. * See LICENSE for details.
  7. * END COPYRIGHT BLOCK **/
  8. #ifdef HAVE_CONFIG_H
  9. #include <config.h>
  10. #endif
  11. /*
  12. * sicis.c - space insensitive string syntax routines.
  13. * these strings are also case insensitive.
  14. *
  15. * This is a non-standard syntax. It is only used by the presence plug-in.
  16. * It will be disabled by default unless the presence plug-in is compiled.
  17. */
  18. #include <stdio.h>
  19. #include <string.h>
  20. #include <sys/types.h>
  21. #include "syntax.h"
  22. static int sicis_filter_ava(Slapi_PBlock *pb, struct berval *bvfilter, Slapi_Value **bvals, int ftype, Slapi_Value **retVal);
  23. static int sicis_filter_sub(Slapi_PBlock *pb, char *initial, char **any, char * final, Slapi_Value **bvals);
  24. static int sicis_values2keys(Slapi_PBlock *pb, Slapi_Value **val, Slapi_Value ***ivals, int ftype);
  25. static int sicis_assertion2keys_ava(Slapi_PBlock *pb, Slapi_Value *val, Slapi_Value ***ivals, int ftype);
  26. static int sicis_assertion2keys_sub(Slapi_PBlock *pb, char *initial, char **any, char * final, Slapi_Value ***ivals);
  27. static int sicis_compare(struct berval *v1, struct berval *v2);
  28. static void sicis_normalize(
  29. Slapi_PBlock *pb,
  30. char *s,
  31. int trim_spaces,
  32. char **alt);
  33. /* the first name is the official one from RFC 2252 */
  34. static char *names[] = {"SpaceInsensitiveString",
  35. SPACE_INSENSITIVE_STRING_SYNTAX_OID, 0};
  36. static Slapi_PluginDesc pdesc = {"spaceinsensitivestring-syntax",
  37. VENDOR, DS_PACKAGE_VERSION,
  38. "space insensitive string attribute syntax plugin"};
  39. int
  40. sicis_init(Slapi_PBlock *pb)
  41. {
  42. int rc, flags;
  43. slapi_log_err(SLAPI_LOG_PLUGIN, SYNTAX_PLUGIN_SUBSYSTEM, "=> sicis_init\n");
  44. rc = slapi_pblock_set(pb, SLAPI_PLUGIN_VERSION,
  45. (void *)SLAPI_PLUGIN_VERSION_01);
  46. rc |= slapi_pblock_set(pb, SLAPI_PLUGIN_DESCRIPTION,
  47. (void *)&pdesc);
  48. rc |= slapi_pblock_set(pb, SLAPI_PLUGIN_SYNTAX_FILTER_AVA,
  49. (void *)sicis_filter_ava);
  50. rc |= slapi_pblock_set(pb, SLAPI_PLUGIN_SYNTAX_FILTER_SUB,
  51. (void *)sicis_filter_sub);
  52. rc |= slapi_pblock_set(pb, SLAPI_PLUGIN_SYNTAX_VALUES2KEYS,
  53. (void *)sicis_values2keys);
  54. rc |= slapi_pblock_set(pb, SLAPI_PLUGIN_SYNTAX_ASSERTION2KEYS_AVA,
  55. (void *)sicis_assertion2keys_ava);
  56. rc |= slapi_pblock_set(pb, SLAPI_PLUGIN_SYNTAX_ASSERTION2KEYS_SUB,
  57. (void *)sicis_assertion2keys_sub);
  58. flags = SLAPI_PLUGIN_SYNTAX_FLAG_ORDERING;
  59. rc |= slapi_pblock_set(pb, SLAPI_PLUGIN_SYNTAX_FLAGS,
  60. (void *)&flags);
  61. rc |= slapi_pblock_set(pb, SLAPI_PLUGIN_SYNTAX_NAMES,
  62. (void *)names);
  63. rc |= slapi_pblock_set(pb, SLAPI_PLUGIN_SYNTAX_OID,
  64. (void *)SPACE_INSENSITIVE_STRING_SYNTAX_OID);
  65. rc |= slapi_pblock_set(pb, SLAPI_PLUGIN_SYNTAX_COMPARE,
  66. (void *)sicis_compare);
  67. rc |= slapi_pblock_set(pb, SLAPI_PLUGIN_SYNTAX_NORMALIZE,
  68. (void *)sicis_normalize);
  69. slapi_log_err(SLAPI_LOG_PLUGIN, SYNTAX_PLUGIN_SUBSYSTEM, "<= sicis_init %d\n", rc);
  70. return (rc);
  71. }
  72. static int
  73. sicis_filter_ava(
  74. Slapi_PBlock *pb,
  75. struct berval *bvfilter,
  76. Slapi_Value **bvals,
  77. int ftype,
  78. Slapi_Value **retVal)
  79. {
  80. int filter_normalized = 0;
  81. int syntax = SYNTAX_SI | SYNTAX_CIS;
  82. if (pb) {
  83. slapi_pblock_get(pb, SLAPI_PLUGIN_SYNTAX_FILTER_NORMALIZED,
  84. &filter_normalized);
  85. if (filter_normalized) {
  86. syntax |= SYNTAX_NORM_FILT;
  87. }
  88. }
  89. return (string_filter_ava(bvfilter, bvals, syntax,
  90. ftype, retVal));
  91. }
  92. static int
  93. sicis_filter_sub(
  94. Slapi_PBlock *pb,
  95. char *initial,
  96. char **any,
  97. char * final,
  98. Slapi_Value **bvals)
  99. {
  100. return (string_filter_sub(pb, initial, any, final, bvals, SYNTAX_SI | SYNTAX_CIS));
  101. }
  102. static int
  103. sicis_values2keys(
  104. Slapi_PBlock *pb,
  105. Slapi_Value **vals,
  106. Slapi_Value ***ivals,
  107. int ftype)
  108. {
  109. return (string_values2keys(pb, vals, ivals, SYNTAX_SI | SYNTAX_CIS,
  110. ftype));
  111. }
  112. static int
  113. sicis_assertion2keys_ava(
  114. Slapi_PBlock *pb,
  115. Slapi_Value *val,
  116. Slapi_Value ***ivals,
  117. int ftype)
  118. {
  119. return (string_assertion2keys_ava(pb, val, ivals,
  120. SYNTAX_SI | SYNTAX_CIS, ftype));
  121. }
  122. static int
  123. sicis_assertion2keys_sub(
  124. Slapi_PBlock *pb,
  125. char *initial,
  126. char **any,
  127. char * final,
  128. Slapi_Value ***ivals)
  129. {
  130. return (string_assertion2keys_sub(pb, initial, any, final, ivals,
  131. SYNTAX_SI | SYNTAX_CIS));
  132. }
  133. static int
  134. sicis_compare(
  135. struct berval *v1,
  136. struct berval *v2)
  137. {
  138. return value_cmp(v1, v2, SYNTAX_SI | SYNTAX_CIS, 3 /* Normalise both values */);
  139. }
  140. static void
  141. sicis_normalize(
  142. Slapi_PBlock *pb __attribute__((unused)),
  143. char *s,
  144. int trim_spaces,
  145. char **alt)
  146. {
  147. value_normalize_ext(s, SYNTAX_SI | SYNTAX_CIS, trim_spaces, alt);
  148. return;
  149. }