aboutsummaryrefslogtreecommitdiffstats
path: root/gpgme/w32-io.c
diff options
context:
space:
mode:
Diffstat (limited to 'gpgme/w32-io.c')
-rw-r--r--gpgme/w32-io.c43
1 files changed, 26 insertions, 17 deletions
diff --git a/gpgme/w32-io.c b/gpgme/w32-io.c
index 94f0a06a..ae09d9ce 100644
--- a/gpgme/w32-io.c
+++ b/gpgme/w32-io.c
@@ -762,27 +762,36 @@ _gpgme_io_set_nonblocking ( int fd )
static char *
build_commandline ( char **argv )
{
- int i, n = 0;
- char *buf, *p;
-
- /* FIXME: we have to quote some things because under Windows the
- * program parses the commandline and does some unquoting */
- for (i=0; argv[i]; i++)
- n += strlen (argv[i]) + 2 + 1; /* 2 extra bytes for possible quoting */
- buf = p = malloc (n);
- if ( !buf )
- return NULL;
- *buf = 0;
- if ( argv[0] )
+ int i, n = 0;
+ char *buf, *p;
+
+ /* FIXME: we have to quote some things because under Windows the
+ * program parses the commandline and does some unquoting. For now
+ * we only do very basic quoting to the first argument because this
+ * one often contains a space (e.g. C:\\Program Files\GNU\GnuPG\gpg.exe)
+ * and we would produce an invalid line in that case. */
+ for (i=0; argv[i]; i++)
+ n += strlen (argv[i]) + 2 + 1; /* 2 extra bytes for possible quoting */
+ buf = p = malloc (n);
+ if ( !buf )
+ return NULL;
+ *buf = 0;
+ if ( argv[0] )
+ {
+ if (strpbrk (argv[0], " \t"))
+ p = stpcpy (stpcpy (stpcpy (p, "\""), argv[0]), "\"");
+ else
p = stpcpy (p, argv[0]);
- for (i = 1; argv[i]; i++) {
- if (!*argv[i])
+ for (i = 1; argv[i]; i++)
+ {
+ if (!*argv[i])
p = stpcpy (p, " \"\"");
- else
+ else
p = stpcpy (stpcpy (p, " "), argv[i]);
+ }
}
-
- return buf;
+
+ return buf;
}