aboutsummaryrefslogtreecommitdiffstats
path: root/common/server-help.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/server-help.c')
-rw-r--r--common/server-help.c50
1 files changed, 49 insertions, 1 deletions
diff --git a/common/server-help.c b/common/server-help.c
index 53a888a86..e5a69e02d 100644
--- a/common/server-help.c
+++ b/common/server-help.c
@@ -30,8 +30,22 @@
#include <config.h>
#include <string.h>
-#include "server-help.h"
#include "util.h"
+#include "server-help.h"
+
+
+static GPGRT_INLINE gpg_error_t
+my_error (int e)
+{
+ return gpg_err_make (default_errsource, (e));
+}
+
+static GPGRT_INLINE gpg_error_t
+my_error_from_syserror (void)
+{
+ return gpg_err_make (default_errsource, gpg_err_code_from_syserror ());
+}
+
/* Skip over options in LINE.
@@ -114,6 +128,40 @@ has_option_name (const char *line, const char *name)
}
+/* Parse an option with the format "--NAME=VALUE" which must occur in
+ * LINE before a double-dash. LINE is written to but not modified by
+ * this function. If the option is found and has a value the value is
+ * stored as a malloced string at R_VALUE. If the option was not
+ * found or an error occurred NULL is stored there. Note that
+ * currently the value must be a string without any space; we may
+ * eventually update this function to allow for a quoted value. */
+gpg_error_t
+get_option_value (char *line, const char *name, char **r_value)
+{
+ char *p, *pend;
+ int c;
+
+ *r_value = NULL;
+
+ p = (char*)has_option_name (line, name);
+ if (!p || p >= skip_options (line))
+ return 0;
+
+ if (*p != '=' || !p[1] || spacep (p+1))
+ return my_error (GPG_ERR_INV_ARG);
+ p++;
+ for (pend = p; *pend && !spacep (pend); pend++)
+ ;
+ c = *pend;
+ *pend = 0;
+ *r_value = xtrystrdup (p);
+ *pend = c;
+ if (!p)
+ return my_error_from_syserror ();
+ return 0;
+}
+
+
/* Return a pointer to the argument of the option with NAME. If such
an option is not given, NULL is returned. */
char *