]> granicus.if.org Git - p11-kit/commitdiff
Pull the argv parsing code into its own file
authorStef Walter <stefw@gnome.org>
Sun, 7 Apr 2013 17:39:22 +0000 (19:39 +0200)
committerStef Walter <stefw@gnome.org>
Tue, 21 May 2013 09:27:32 +0000 (11:27 +0200)
So it can be used from multiple code paths

common/Makefile.am
common/argv.c [new file with mode: 0644]
common/argv.h [new file with mode: 0644]
trust/module.c

index b583a5ca5d7a846fcd62994a7ae50196946ccc57..d7b44390a27c0c3ac042c11395165da3c52e385e 100644 (file)
@@ -16,6 +16,7 @@ noinst_LTLIBRARIES = \
        $(NULL)
 
 libp11_common_la_SOURCES = \
+       argv.c argv.h \
        attrs.c attrs.h \
        array.c array.h \
        buffer.c buffer.h \
diff --git a/common/argv.c b/common/argv.c
new file mode 100644 (file)
index 0000000..6d91bfa
--- /dev/null
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2012 Red Hat Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *     * Redistributions of source code must retain the above
+ *       copyright notice, this list of conditions and the
+ *       following disclaimer.
+ *     * Redistributions in binary form must reproduce the
+ *       above copyright notice, this list of conditions and
+ *       the following disclaimer in the documentation and/or
+ *       other materials provided with the distribution.
+ *     * The names of contributors to this software may not be
+ *       used to endorse or promote products derived from this
+ *       software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+ * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * Author: Stef Walter <stefw@redhat.com>
+ */
+
+#include "config.h"
+
+#include "argv.h"
+#include "debug.h"
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+
+bool
+p11_argv_parse (const char *string,
+                void (*sink) (char *, void *),
+                void *argument)
+{
+       char quote = '\0';
+       char *src, *dup, *at, *arg;
+       bool ret = true;
+
+       return_val_if_fail (string != NULL, false);
+       return_val_if_fail (sink != NULL, false);
+
+       src = dup = strdup (string);
+       return_val_if_fail (dup != NULL, false);
+
+       arg = at = src;
+       for (src = dup; *src; src++) {
+
+               /* Matching quote */
+               if (quote == *src) {
+                       quote = '\0';
+
+               /* Inside of quotes */
+               } else if (quote != '\0') {
+                       if (*src == '\\') {
+                               *at++ = *src++;
+                               if (!*src) {
+                                       ret = false;
+                                       goto done;
+                               }
+                               if (*src != quote)
+                                       *at++ = '\\';
+                       }
+                       *at++ = *src;
+
+               /* Space, not inside of quotes */
+               } else if (isspace (*src)) {
+                       *at = 0;
+                       sink (arg, argument);
+                       arg = at;
+
+               /* Other character outside of quotes */
+               } else {
+                       switch (*src) {
+                       case '\'':
+                       case '"':
+                               quote = *src;
+                               break;
+                       case '\\':
+                               *at++ = *src++;
+                               if (!*src) {
+                                       ret = false;
+                                       goto done;
+                               }
+                       /* fall through */
+                       default:
+                               *at++ = *src;
+                               break;
+                       }
+               }
+       }
+
+
+       if (at != arg) {
+               *at = 0;
+               sink (arg, argument);
+       }
+
+done:
+       free (dup);
+       return ret;
+}
diff --git a/common/argv.h b/common/argv.h
new file mode 100644 (file)
index 0000000..8f95490
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2012 Red Hat Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *     * Redistributions of source code must retain the above
+ *       copyright notice, this list of conditions and the
+ *       following disclaimer.
+ *     * Redistributions in binary form must reproduce the
+ *       above copyright notice, this list of conditions and
+ *       the following disclaimer in the documentation and/or
+ *       other materials provided with the distribution.
+ *     * The names of contributors to this software may not be
+ *       used to endorse or promote products derived from this
+ *       software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+ * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * Author: Stef Walter <stefw@redhat.com>
+ */
+
+#ifndef P11_ARGV_H_
+#define P11_ARGV_H_
+
+#include "compat.h"
+
+bool             p11_argv_parse                     (const char *string,
+                                                     void (*sink) (char *, void *),
+                                                     void *argument);
+
+#endif /* P11_ARGV_H_ */
index 7595ba1d6d860d9cd0f6c5534c128b6c1226e476..109ff5cc0ce0415c0258fc808b41156103c1e6bb 100644 (file)
@@ -36,6 +36,7 @@
 
 #define CRYPTOKI_EXPORTS
 
+#include "argv.h"
 #include "array.h"
 #include "attrs.h"
 #define P11_DEBUG_FLAG P11_DEBUG_TRUST
@@ -248,7 +249,8 @@ create_tokens_inlock (p11_array *tokens,
 }
 
 static void
-parse_argument (char *arg)
+parse_argument (char *arg,
+                void *unused)
 {
        char *value;
 
@@ -267,78 +269,6 @@ parse_argument (char *arg)
        }
 }
 
-static void
-parse_arguments (const char *string)
-{
-       char quote = '\0';
-       char *src, *dup, *at, *arg;
-
-       if (!string)
-               return;
-
-       src = dup = strdup (string);
-       if (!dup) {
-               p11_message ("couldn't allocate memory for argument string");
-               return;
-       }
-
-       arg = at = src;
-       for (src = dup; *src; src++) {
-
-               /* Matching quote */
-               if (quote == *src) {
-                       quote = '\0';
-
-               /* Inside of quotes */
-               } else if (quote != '\0') {
-                       if (*src == '\\') {
-                               *at++ = *src++;
-                               if (!*src) {
-                                       p11_message ("couldn't parse argument string: %s", string);
-                                       goto done;
-                               }
-                               if (*src != quote)
-                                       *at++ = '\\';
-                       }
-                       *at++ = *src;
-
-               /* Space, not inside of quotes */
-               } else if (isspace(*src)) {
-                       *at = 0;
-                       parse_argument (arg);
-                       arg = at;
-
-               /* Other character outside of quotes */
-               } else {
-                       switch (*src) {
-                       case '\'':
-                       case '"':
-                               quote = *src;
-                               break;
-                       case '\\':
-                               *at++ = *src++;
-                               if (!*src) {
-                                       p11_message ("couldn't parse argument string: %s", string);
-                                       goto done;
-                               }
-                               /* fall through */
-                       default:
-                               *at++ = *src;
-                               break;
-                       }
-               }
-       }
-
-
-       if (at != arg) {
-               *at = 0;
-               parse_argument (arg);
-       }
-
-done:
-       free (dup);
-}
-
 static CK_RV
 sys_C_Finalize (CK_VOID_PTR reserved)
 {
@@ -422,7 +352,7 @@ sys_C_Initialize (CK_VOID_PTR init_args)
                 */
                if (rv == CKR_OK) {
                        if (args->pReserved)
-                               parse_arguments ((const char*)args->pReserved);
+                               p11_argv_parse ((const char*)args->pReserved, parse_argument, NULL);
 
                        gl.sessions = p11_dict_new (p11_dict_ulongptr_hash,
                                                    p11_dict_ulongptr_equal,