utf8 regex, still using glibc/posix regex, other engines need to be evaluated later
authorChristian Thaeter <ct@pipapo.org>
Sun, 28 Oct 2007 03:54:11 +0000 (04:54 +0100)
committerChristian Thaeter <ct@pipapo.org>
Sun, 28 Oct 2007 03:54:11 +0000 (04:54 +0100)
src/main.c
src/rxpd.h
src/rxpd_base.c
tests/10basics.tests
tests/20simplecommands.tests
tests/30listmanipulation.tests
tests/40regexchecking.tests
tests/50listsyncronization.tests
tests/60unicode.tests [new file with mode: 0644]

index 076c756..a1a740a 100644 (file)
@@ -26,6 +26,8 @@
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
+#include <locale.h>
+#include <langinfo.h>
 
 void
 version (void)
@@ -60,6 +62,7 @@ usage (void)
     //" -6          ipv6\n"
     //" -r          resolve names\n"
     //" -l log      log hits to logfile\n"
+    " -L locale   set locale, must be a utf-8 locale, only LC_CTYPE is used\n"
     " -h          this usage information\n"
     //" -U user     switch to user\n"
     );
@@ -81,7 +84,7 @@ main (int argc, char** argv)
   opterr = 0;
   int opt;
 
-  while ((opt = getopt (argc, argv, "vVdDb:qt:u:p:i46rl:h")) != -1)
+  while ((opt = getopt (argc, argv, "vVdDb:qt:u:p:i46rl:L:h")) != -1)
     switch (opt)
       {
       case 'v':
@@ -135,6 +138,12 @@ main (int argc, char** argv)
       case 'i':
         rxpd->regflags |= REG_ICASE; 
         break;
+      case 'L':
+        if (!rxpd->locale)
+          rxpd->locale = optarg;
+        else
+          rxpd_fail (rxpd, "locale already set\n");
+        break;
 #if 0 /*not yet implemented*/
       case '4':
         break;
@@ -159,6 +168,14 @@ main (int argc, char** argv)
   if (llist_is_empty (&rxpd->sockets))
     rxpd_fail (rxpd, "No listening sockets given (use -t TCP or -u UNIX)\n");
 
+  rxpd->locale = setlocale(LC_CTYPE, rxpd->locale ? rxpd->locale : "");
+  if (!rxpd->locale)
+    rxpd_fail (rxpd, "Failed setting locale\n");
+
+  rxpd_log (rxpd, LOG_INFO, "Using locale '%s'\n", rxpd->locale);
+  if (strcmp(nl_langinfo(CODESET), "UTF-8") != 0)
+    rxpd_fail (rxpd, "Not a utf-8 locale '%s'\n", rxpd->locale);
+
   if (rxpd->policy)
     {
       if (rxpd_file_load (rxpd->policy))
index 745c40b..7fbbaa4 100644 (file)
@@ -93,6 +93,7 @@ struct rxpd_base
   int verbosity;
   int regflags;
   int daemonize;
+  const char* locale;
 
   struct rxpd_file* policy;
 
index 1f9da8f..cc517d7 100644 (file)
@@ -34,6 +34,7 @@ rxpd_init (void)
   global_base.verbosity = LOG_WARNING;
   global_base.daemonize = 0;
   global_base.regflags = 0;
+  global_base.locale = NULL;
   global_base.policy = NULL;
 
   psplay_init_root (&global_base.files, rxpd_file_cmp, (psplay_delete_t)rxpd_file_delete);
index 02baae9..80e8f44 100644 (file)
@@ -1,5 +1,20 @@
 TESTING "startup and options" ./rxpd
 
+if ! expr "$LC_CTYPE" : ".*\.utf8" >/dev/null; then
+  cat <<EOL
+
+
+  You have to run this tests with LC_CTYPE set to a utf8 locale!
+
+example:
+ $ LC_CTYPE=en_US.utf8 make check
+
+ 'locale -a' will list all available locales on your system
+
+EOL
+  exit 1
+fi
+
 TEST "usage test" -h <<END
 out: rxpd [OPTIONS] RULES..
 out:  -v          increase verbosity level
@@ -10,6 +25,7 @@ out:  -b dir      basedir for rules
 out:  -q          be quiet
 out:  -t port     listen on tcp port
 out:  -p policy   define a list for access policies
+out:  -L locale   set locale, must be a utf-8 locale, only LC_CTYPE is used
 out:  -h          this usage information
 return: 0
 END
index 28602d8..37101f9 100644 (file)
@@ -4,7 +4,7 @@
 cp -rf $srcdir/files ./
 chmod -R +w files
 port=$((RANDOM+1500))
-./rxpd -dq -b files -p policy -t $port example
+./rxpd -dq -L $LC_CTYPE -b files -p policy -t $port example
 
 function rxpd_client()
 {
index d6210cf..d85357f 100644 (file)
@@ -4,7 +4,7 @@
 cp -rf $srcdir/files ./
 chmod -R +w files
 port=$((RANDOM+1500))
-./rxpd -dq -b files -p policy -t $port example
+./rxpd -L $LC_CTYPE -dq -b files -p policy -t $port example
 
 function rxpd_client()
 {
index d5ca7c4..09430a9 100644 (file)
@@ -4,7 +4,7 @@
 cp -rf $srcdir/files ./
 chmod -R +w files
 port=$((RANDOM+1500))
-./rxpd -dq -b files -p policy -t $port example
+./rxpd -L $LC_CTYPE -dq -b files -p policy -t $port example
 
 function rxpd_client()
 {
index 2537530..421ec5e 100644 (file)
@@ -4,7 +4,7 @@
 cp -rf $srcdir/files ./
 chmod -R +w files
 port=$((RANDOM+1500))
-./rxpd -dq -b files -p policy -t $port example
+./rxpd -L $LC_CTYPE -dq -b files -p policy -t $port example
 
 function rxpd_client()
 {
diff --git a/tests/60unicode.tests b/tests/60unicode.tests
new file mode 100644 (file)
index 0000000..f98f7a4
--- /dev/null
@@ -0,0 +1,27 @@
+# we randomize ports to minimize collisions,
+# this needs to be fixed someday (use netstat and check which port is free)
+
+cp -rf $srcdir/files ./
+chmod -R +w files
+port=$((RANDOM+1500))
+./rxpd -L $LC_CTYPE -dq -b files -p policy -t $port example
+
+function rxpd_client()
+{
+    nc -q1 localhost $port;
+}
+
+TESTING "unicode regex checking tests" rxpd_client
+
+TEST "create unicode rules" <<END
+in: APPEND:unicode
+in: :german:-[äöüÄÖÜß]-
+out: #OK:
+END
+
+TEST "match unicode" <<END
+in: CHECK:unicode
+in: -ä-
+out: german:-[äöüÄÖÜß]-
+END
+