summaryrefslogtreecommitdiffstats
path: root/pki/base/native-tools/src/setpin/options.c
diff options
context:
space:
mode:
Diffstat (limited to 'pki/base/native-tools/src/setpin/options.c')
-rw-r--r--pki/base/native-tools/src/setpin/options.c184
1 files changed, 184 insertions, 0 deletions
diff --git a/pki/base/native-tools/src/setpin/options.c b/pki/base/native-tools/src/setpin/options.c
new file mode 100644
index 000000000..9e2dab129
--- /dev/null
+++ b/pki/base/native-tools/src/setpin/options.c
@@ -0,0 +1,184 @@
+/* --- BEGIN COPYRIGHT BLOCK ---
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2007 Red Hat, Inc.
+ * All rights reserved.
+ * --- END COPYRIGHT BLOCK ---
+ */
+
+
+
+#include "options.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+/*
+ * (C) 1998 Netscape Communications Corporation
+ * All rights reserved
+ * Intellectual property rulez!
+ *
+ */
+
+
+
+/* this file maintains a static linked list of the
+ options it knows about
+*/
+
+static OPTION *option_list = NULL;
+static OPTION *last_option = NULL;
+
+static char* OPT_parseArgument(char *arg,char**valid);
+
+
+/* OPT_getValue(char *option, char** output)
+
+ returns 1 if the specified option exists,
+ - value is put into 'output'
+ returns 0 if the specified option doesn't exist
+ - output is unchanged
+
+*/
+
+
+int OPT_getValue(char *option, char **output) {
+ OPTION *opt = option_list;
+
+ while (opt) {
+ if (! strcmp(opt->name,option)) {
+ *output = opt->value;
+ return 1;
+ }
+ opt = opt->next;
+ }
+ return 0;
+}
+
+
+static char* OPT_parseOptFile(char *filename, char*validlist[])
+{
+ FILE *fp;
+ char buffer[1024];
+
+ if (filename == NULL || filename[0] == '\0') {
+ return ("Bad syntax for 'optfile'\n");
+ }
+ fp = fopen(filename,"r");
+ if (fp == NULL) {
+ return ("Options file could not be opened for reading\n");
+ }
+ while (fgets(buffer,1024,fp)) {
+ if (buffer[strlen(buffer)-1] == '\n') buffer[strlen(buffer)-1] = '\0';
+ if (buffer[strlen(buffer)-1] == '\r') buffer[strlen(buffer)-1] = '\0';
+
+ OPT_parseArgument(strdup(buffer),validlist);
+ }
+ fclose(fp);
+ return NULL;
+}
+
+
+
+static char *OPT_parseArgument(char *arg, char* validlist[]) {
+ char *error;
+ char *INV_ARG = "invalid argument: %s";
+ char *eq;
+
+ OPTION *new_opt;
+
+ if (!strncmp(arg,"optfile=",8)) {
+ return OPT_parseOptFile(&arg[8],validlist);
+ }
+
+ new_opt = (OPTION*)malloc(sizeof(OPTION));
+
+ new_opt->next = NULL;
+ new_opt->name = strdup(arg);
+ eq = strchr(new_opt->name,'=');
+ if (eq) {
+ *eq = 0;
+ }
+ new_opt->value = strchr(arg,'=');
+
+
+ if (new_opt->value != NULL) {
+ new_opt->value++;
+ }
+
+ if (option_list == NULL) {
+ option_list = new_opt;
+ last_option = new_opt;
+ }
+ else {
+ last_option->next = new_opt;
+ last_option= new_opt;
+ }
+ if (!validlist) {
+ return NULL;
+ }
+ else {
+ int i=0;
+ while (validlist[i]) {
+ if (! strcmp(validlist[i],new_opt->name)) {
+ return NULL;
+ }
+ i+=2;
+ }
+ }
+
+ error = (char *)malloc(strlen(INV_ARG)+strlen(new_opt->name)+5);
+ sprintf(error,INV_ARG,new_opt->name);
+
+ return error;
+}
+
+
+
+
+/* char *OPT_parseOptions(int ac, char **av)
+
+ constructs the linked list of options
+ ac: number of arguments
+ av: array of arguments
+ valid: array of valid arguments (can be null)
+
+ returns:
+ NULL if no error
+ char* with error text if error. caller is responsible for
+ freeing this memory
+
+*/
+
+char * OPT_parseOptions(int ac, char **av, char *valid[]) {
+ int i=0;
+ char *r=NULL;
+
+ assert(option_list == NULL);
+ assert(last_option == NULL);
+ assert(av != NULL);
+
+ if (ac == 1) return NULL;
+
+ for (i=0; i<ac-1; i++) {
+ r = OPT_parseArgument(av[1+i],valid);
+ if (r) return r;
+ }
+ return r;
+}
+
+
+
+