aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--g10/ChangeLog10
-rw-r--r--g10/export.c38
-rw-r--r--g10/import.c37
-rw-r--r--g10/main.h10
-rw-r--r--g10/misc.c37
5 files changed, 60 insertions, 72 deletions
diff --git a/g10/ChangeLog b/g10/ChangeLog
index e37368c38..ffbbc4c26 100644
--- a/g10/ChangeLog
+++ b/g10/ChangeLog
@@ -1,3 +1,13 @@
+2003-05-31 David Shaw <[email protected]>
+
+ * main.h, misc.c (parse_options): New general option line
+ parser. Fix the bug in the old version that did not handle report
+ syntax errors after a valid entry.
+
+ * import.c (parse_import_options), export.c
+ (parse_export_options): Call it here instead of duplicating the
+ code.
+
2003-05-30 David Shaw <[email protected]>
* keylist.c (list_one): Don't show the keyring filename when in
diff --git a/g10/export.c b/g10/export.c
index e036e2520..5783f6ac1 100644
--- a/g10/export.c
+++ b/g10/export.c
@@ -42,13 +42,7 @@ static int do_export_stream( IOBUF out, STRLIST users, int secret,
int
parse_export_options(char *str,unsigned int *options)
{
- char *tok;
- int hit=0;
- struct
- {
- char *name;
- unsigned int bit;
- } export_opts[]=
+ struct parse_options export_opts[]=
{
{"include-non-rfc",EXPORT_INCLUDE_NON_RFC},
{"include-local-sigs",EXPORT_INCLUDE_LOCAL_SIGS},
@@ -58,34 +52,7 @@ parse_export_options(char *str,unsigned int *options)
/* add tags for include revoked and disabled? */
};
- while((tok=strsep(&str," ,")))
- {
- int i,rev=0;
-
- if(ascii_strncasecmp("no-",tok,3)==0)
- {
- rev=1;
- tok+=3;
- }
-
- for(i=0;export_opts[i].name;i++)
- {
- if(ascii_strcasecmp(export_opts[i].name,tok)==0)
- {
- if(rev)
- *options&=~export_opts[i].bit;
- else
- *options|=export_opts[i].bit;
- hit=1;
- break;
- }
- }
-
- if(!hit && !export_opts[i].name)
- return 0;
- }
-
- return hit;
+ return parse_options(str,options,export_opts);
}
/****************
@@ -427,4 +394,3 @@ do_export_stream( IOBUF out, STRLIST users, int secret,
log_info(_("WARNING: nothing exported\n"));
return rc;
}
-
diff --git a/g10/import.c b/g10/import.c
index cec24b8ad..1b955c412 100644
--- a/g10/import.c
+++ b/g10/import.c
@@ -85,13 +85,7 @@ static int merge_keysigs( KBNODE dst, KBNODE src, int *n_sigs,
int
parse_import_options(char *str,unsigned int *options)
{
- char *tok;
- int hit=0;
- struct
- {
- char *name;
- unsigned int bit;
- } import_opts[]=
+ struct parse_options import_opts[]=
{
{"allow-local-sigs",IMPORT_ALLOW_LOCAL_SIGS},
{"repair-hkp-subkey-bug",IMPORT_REPAIR_PKS_SUBKEY_BUG},
@@ -101,34 +95,7 @@ parse_import_options(char *str,unsigned int *options)
{NULL,0}
};
- while((tok=strsep(&str," ,")))
- {
- int i,rev=0;
-
- if(ascii_strncasecmp("no-",tok,3)==0)
- {
- rev=1;
- tok+=3;
- }
-
- for(i=0;import_opts[i].name;i++)
- {
- if(ascii_strcasecmp(import_opts[i].name,tok)==0)
- {
- if(rev)
- *options&=~import_opts[i].bit;
- else
- *options|=import_opts[i].bit;
- hit=1;
- break;
- }
- }
-
- if(!hit && !import_opts[i].name)
- return 0;
- }
-
- return hit;
+ return parse_options(str,options,import_opts);
}
void *
diff --git a/g10/main.h b/g10/main.h
index 67d2f9853..e27f78dc4 100644
--- a/g10/main.h
+++ b/g10/main.h
@@ -95,8 +95,16 @@ int string_to_compress_algo(const char *string);
int check_compress_algo(int algo);
int default_cipher_algo(void);
int default_compress_algo(void);
-void compliance_failure(void);
const char *compliance_option_string(void);
+void compliance_failure(void);
+
+struct parse_options
+{
+ char *name;
+ unsigned int bit;
+};
+
+int parse_options(char *str,unsigned int *options,struct parse_options *opts);
/*-- helptext.c --*/
void display_online_help( const char *keyword );
diff --git a/g10/misc.c b/g10/misc.c
index 44deb5737..1b8e6172a 100644
--- a/g10/misc.c
+++ b/g10/misc.c
@@ -639,3 +639,40 @@ compliance_failure(void)
log_info(_("this message may not be usable by %s\n"),compliance_string());
opt.compliance=CO_GNUPG;
}
+
+int
+parse_options(char *str,unsigned int *options,struct parse_options *opts)
+{
+ char *tok;
+
+ while((tok=strsep(&str," ,")))
+ {
+ int i,rev=0;
+
+ if(tok[0]=='\0')
+ continue;
+
+ if(ascii_strncasecmp("no-",tok,3)==0)
+ {
+ rev=1;
+ tok+=3;
+ }
+
+ for(i=0;opts[i].name;i++)
+ {
+ if(ascii_strcasecmp(opts[i].name,tok)==0)
+ {
+ if(rev)
+ *options&=~opts[i].bit;
+ else
+ *options|=opts[i].bit;
+ break;
+ }
+ }
+
+ if(!opts[i].name)
+ return 0;
+ }
+
+ return 1;
+}