Imported Upstream version 0.63.0
[hcoop/debian/courier-authlib.git] / authldapescape.c
diff --git a/authldapescape.c b/authldapescape.c
new file mode 100644 (file)
index 0000000..9be9aa8
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+** Copyright 2009 Double Precision, Inc.  See COPYING for
+** distribution information.
+*/
+
+#if    HAVE_CONFIG_H
+#include       "courier_auth_config.h"
+#endif
+#include       <stdio.h>
+#include       <stdlib.h>
+#include       <string.h>
+#include       <errno.h>
+#if    HAVE_UNISTD_H
+#include       <unistd.h>
+#endif
+
+#include       "courierauth.h"
+
+static const char rcsid[]="$Id: authldapescape.c,v 1.2 2009/12/18 04:33:45 mrsam Exp $";
+
+static void escape_specials(const char *str,
+                           char *bufptr,
+                           size_t *sizeptr)
+{
+       static const char specials[]="*()\\";
+
+       while (*str)
+       {
+               char buf[10];
+               char *p;
+
+               if (strchr(specials, *str))
+               {
+                       sprintf(buf, "\\%02x", (int)(unsigned char)*str);
+               }
+               else
+               {
+                       buf[0]=*str;
+                       buf[1]=0;
+               }
+
+               for (p=buf; *p; p++)
+               {
+                       if (bufptr)
+                               *bufptr++=*p;
+                       if (sizeptr)
+                               ++*sizeptr;
+               }
+               ++str;
+       }
+
+       if (bufptr)
+               *bufptr=0;
+}
+
+char *courier_auth_ldap_escape(const char *str)
+{
+       char *escaped;
+       size_t escaped_cnt=1;
+       int rc;
+
+       escape_specials(str, NULL, &escaped_cnt);
+       escaped=malloc(escaped_cnt);
+       if (!escaped)
+               return NULL;
+
+       escape_specials(str, escaped, NULL);
+
+       return escaped;
+}