LRN: new utf8 argv converter for W32, converting strings on command-line to UTF-8...
authorChristian Grothoff <christian@grothoff.org>
Sun, 10 Jun 2012 22:47:57 +0000 (22:47 +0000)
committerChristian Grothoff <christian@grothoff.org>
Sun, 10 Jun 2012 22:47:57 +0000 (22:47 +0000)
40 files changed:
src/arm/gnunet-arm.c
src/ats/perf_ats_mlp.c
src/chat/gnunet-chat.c
src/core/gnunet-core.c
src/dht/gnunet-dht-get.c
src/dht/gnunet-dht-monitor.c
src/dht/gnunet-dht-put.c
src/dns/gnunet-dns-monitor.c
src/dns/gnunet-dns-redirector.c
src/exit/gnunet-daemon-exit.c
src/fs/gnunet-directory.c
src/fs/gnunet-download.c
src/fs/gnunet-fs.c
src/fs/gnunet-helper-fs-publish.c
src/fs/gnunet-pseudonym.c
src/fs/gnunet-publish.c
src/fs/gnunet-search.c
src/fs/gnunet-unindex.c
src/gns/gnunet-gns-fcfsd.c
src/gns/gnunet-gns-lookup.c
src/gns/gnunet-gns-proxy.c
src/gns/gnunet-gns.c
src/hostlist/gnunet-daemon-hostlist.c
src/include/gnunet_strings_lib.h
src/integration-tests/connection_watchdog.c
src/namestore/gnunet-namestore.c
src/nat/gnunet-nat-server.c
src/nse/gnunet-nse-profiler.c
src/peerinfo-tool/gnunet-peerinfo.c
src/pt/gnunet-daemon-pt.c
src/statistics/gnunet-statistics.c
src/template/gnunet-template.c
src/testing_old/gnunet-testing.c
src/topology/gnunet-daemon-topology.c
src/transport/gnunet-transport.c
src/util/gnunet-resolver.c
src/util/gnunet-rsa.c
src/util/program.c
src/util/strings.c
src/vpn/gnunet-vpn.c

index 58aa7095780d3d078a9b30ac3b356b3bf7c6a751..744c3f208fb072d71e57d9c9f40ddcdefbe5234e 100644 (file)
@@ -431,6 +431,9 @@ main (int argc, char *const *argv)
   if (temp_timeout_ms > 0)
     timeout.rel_value = temp_timeout_ms;
 
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   if (GNUNET_OK ==
       GNUNET_PROGRAM_run (argc, argv, "gnunet-arm",
                          gettext_noop
index b9ee5e4dccacebddea6ddbbabe932d65f270885b..ff2d8dadaa209d34eaa602a99cf639d444740a52 100644 (file)
@@ -360,6 +360,8 @@ main (int argc, char *argv[])
     GNUNET_GETOPT_OPTION_END
   };
 
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
 
   GNUNET_PROGRAM_run (argc, argv,
                       "perf_ats_mlp", "nohelp", options,
index 7b11c0d1870cfdd8b297ca1e65a3e8ab10a61299..012f78ed9076b2dbe53bea9726d743308b51f1cf 100644 (file)
@@ -737,6 +737,10 @@ main (int argc, char *const *argv)
   flags |= O_NONBLOCK;
   fcntl (0, F_SETFL, flags);
 #endif
+
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   return (GNUNET_OK ==
           GNUNET_PROGRAM_run (argc, argv, "gnunet-chat",
                               gettext_noop ("Join a chat on GNUnet."), options,
index 4fe0a4f86dcb971767e8cc098bd3f3fb1b7fec5c..78bc14154f157f36b8c750ac4579f197db47102e 100644 (file)
@@ -89,6 +89,10 @@ main (int argc, char *const *argv)
   static const struct GNUNET_GETOPT_CommandLineOption options[] = {
     GNUNET_GETOPT_OPTION_END
   };
+
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   return (GNUNET_OK ==
           GNUNET_PROGRAM_run (argc, argv, "gnunet-core",
                               gettext_noop
index fb185c489b18909d08e88ab09d6f65acff56c6dd..7555f90093cfd101c73f9700777f08b6ded17c08 100644 (file)
@@ -226,6 +226,10 @@ static struct GNUNET_GETOPT_CommandLineOption options[] = {
 int
 main (int argc, char *const *argv)
 {
+
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   return (GNUNET_OK ==
           GNUNET_PROGRAM_run (argc, argv, "gnunet-dht-get",
                               gettext_noop
index 8ca3beb2a635c039781e4a67f950680501d91844..088874a5348219cac035d6609217f184738d2f91 100644 (file)
@@ -315,6 +315,9 @@ static struct GNUNET_GETOPT_CommandLineOption options[] = {
 int
 main (int argc, char *const *argv)
 {
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   return (GNUNET_OK ==
           GNUNET_PROGRAM_run (argc, argv, "gnunet-dht-get",
                               gettext_noop
index 59acc792ba91fb7f7e58ad4b5eecd18cd7b7e5aa..f6409bdff1a8c8fe7e898c2abf0b6cb12744aa1b 100644 (file)
@@ -217,6 +217,9 @@ static struct GNUNET_GETOPT_CommandLineOption options[] = {
 int
 main (int argc, char *const *argv)
 {
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   return (GNUNET_OK ==
           GNUNET_PROGRAM_run (argc, argv, "gnunet-dht-put",
                               gettext_noop
index 82715aabc3d3a8b3e243879e9a3dc2ec481f773b..2a05efdeeddab4822b93177145109b1d7f7c2a8b 100644 (file)
@@ -342,6 +342,10 @@ main (int argc, char *const *argv)
     GNUNET_GETOPT_OPTION_VERBOSE (&verbosity),
     GNUNET_GETOPT_OPTION_END
   };
+
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   return (GNUNET_OK ==
           GNUNET_PROGRAM_run (argc, argv, "gnunet-dns-monitor",
                               gettext_noop
index a45b8960950acae8baf20b3960a96b34865df037..5ba7e87c6f3c512e0ea6a3553265aafaf0f4320a 100644 (file)
@@ -241,6 +241,10 @@ main (int argc, char *const *argv)
     GNUNET_GETOPT_OPTION_VERBOSE (&verbosity),
     GNUNET_GETOPT_OPTION_END
   };
+
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   return (GNUNET_OK ==
           GNUNET_PROGRAM_run (argc, argv, "gnunet-dns-redirector",
                               gettext_noop
index 26f3e7536901831699be272a67e0e31f82a54020..2166255672c8340e7355b71e895b57b71624e0cd 100644 (file)
@@ -3230,6 +3230,9 @@ main (int argc, char *const *argv)
     GNUNET_GETOPT_OPTION_END
   };
 
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   return (GNUNET_OK ==
           GNUNET_PROGRAM_run (argc, argv, "gnunet-daemon-exit",
                               gettext_noop
index c722f57ff232c581719194460a51449799b19d57..4122cb154fcb8cc5a4a876d5f1dd3222df0747fe 100644 (file)
@@ -173,6 +173,10 @@ main (int argc, char *const *argv)
   static struct GNUNET_GETOPT_CommandLineOption options[] = {
     GNUNET_GETOPT_OPTION_END
   };
+
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   return (GNUNET_OK ==
           GNUNET_PROGRAM_run (argc, argv, "gnunet-directory [OPTIONS] FILENAME",
                               gettext_noop
index 5a66aea27c3c02b8d961e3663aa784f152501377..bd5b09c0d520b769af0d9e81a203f0a9edc076ba 100644 (file)
@@ -272,6 +272,10 @@ main (int argc, char *const *argv)
      0, &GNUNET_GETOPT_increment_value, &verbose},
     GNUNET_GETOPT_OPTION_END
   };
+
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   return (GNUNET_OK ==
           GNUNET_PROGRAM_run (argc, argv, "gnunet-download [OPTIONS] URI",
                               gettext_noop
index 0b28923712487f4e46ffc707cf4b0b1e127f1abc..404c64e4d5f2fd88f1d907f340bc4f56e0dcc914 100644 (file)
@@ -119,6 +119,10 @@ main (int argc, char *const *argv)
     GNUNET_GETOPT_OPTION_VERBOSE (&verbose),
     GNUNET_GETOPT_OPTION_END
   };
+
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   return (GNUNET_OK ==
           GNUNET_PROGRAM_run (argc, argv, "gnunet-fs [OPTIONS]",
                               gettext_noop ("Special file-sharing operations"),
index 86b02492d1790a3069360d17ad165ac1f1cade99..45f6d588d6a48f4de18bbfa9125e7aadbce10f7e 100644 (file)
@@ -413,7 +413,7 @@ extract_files (struct ScanTreeNode *item)
  * @return 0 on success
  */
 int main(int argc,
-        char **argv)
+        char *const *argv)
 {
   const char *filename_expanded;
   const char *ex;
@@ -424,6 +424,9 @@ int main(int argc,
    * binary mode.
    */
   _setmode (1, _O_BINARY);
+  /* Get utf-8-encoded arguments */
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 5;
 #endif
 
   /* parse command line */
index 38826d1de18ec18992d721994e600bbb5e733025..2b1b897c244c2da84e41a10585f7cfc8e93fe450 100644 (file)
@@ -313,6 +313,10 @@ main (int argc, char *const *argv)
   };
   bo.expiration_time =
       GNUNET_FS_year_to_time (GNUNET_FS_get_current_year () + 2);
+
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   return (GNUNET_OK ==
           GNUNET_PROGRAM_run (argc, argv, "gnunet-pseudonym [OPTIONS]",
                               gettext_noop ("Manage GNUnet pseudonyms."),
index a1b26dbd5845da11eae06fee745c23cdd009a762..24e49d3694cf9d9cf50ed6719cfd36d531df6cb4 100644 (file)
@@ -736,6 +736,10 @@ main (int argc, char *const *argv)
              "GNUnet publish starts\n");
   bo.expiration_time =
       GNUNET_FS_year_to_time (GNUNET_FS_get_current_year () + 2);
+
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   return (GNUNET_OK ==
           GNUNET_PROGRAM_run (argc, argv, "gnunet-publish [OPTIONS] FILENAME",
                               gettext_noop
index 60620a4b3abf114f6eb2e462275c5016cecdda0d..88507f608a8e963aca51c8c19d4a661a2a2d6ffa 100644 (file)
@@ -302,6 +302,10 @@ main (int argc, char *const *argv)
      1, &GNUNET_GETOPT_set_uint, &results_limit},
     GNUNET_GETOPT_OPTION_END
   };
+
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   return (GNUNET_OK ==
           GNUNET_PROGRAM_run (argc, argv, "gnunet-search [OPTIONS] KEYWORD",
                               gettext_noop
index 3e8308df249c95f81877890e20f026f8cd1b7196..f4e35273793af7a21b94afb1e9b9d72ecd23b47f 100644 (file)
@@ -170,6 +170,10 @@ main (int argc, char *const *argv)
      0, &GNUNET_GETOPT_set_one, &verbose},
     GNUNET_GETOPT_OPTION_END
   };
+
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   return (GNUNET_OK ==
           GNUNET_PROGRAM_run (argc, argv, "gnunet-unindex [OPTIONS] FILENAME",
                               gettext_noop
index cd4e8e72dc2e2f6fd9d5abbe1da8c6185d76b654..b919b4fed55d4bf5246bf65c197a153b74e336f8 100644 (file)
@@ -797,6 +797,9 @@ main (int argc, char *const *argv)
 
   int ret;
 
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   GNUNET_log_setup ("fcfsd", "WARNING", NULL);
   ret =
       (GNUNET_OK ==
index f33264f61d2f8bec74cb86e16329c74a6a0c138d..bcd2b5bccc1233f3745785fc52116c01e95a6810 100644 (file)
@@ -204,6 +204,9 @@ static struct GNUNET_GETOPT_CommandLineOption options[] = {
 int
 main (int argc, char *const *argv)
 {
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   return (GNUNET_OK ==
           GNUNET_PROGRAM_run (argc, argv, "gnunet-gns-get",
                               gettext_noop
index b35cacad0a82dc0f0b99efd73bc55ada607cc161..2fef343436bce34d39beb1b0b061242a54dc7666 100644 (file)
@@ -2320,6 +2320,9 @@ main (int argc, char *const *argv)
 
   int ret;
 
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   GNUNET_log_setup ("gnunet-gns-proxy", "WARNING", NULL);
   ret =
       (GNUNET_OK ==
index 2a49ba1c27837615580e6e186953d923906ee59e..1efe74842a700c93b67138da9682b1fabef9bd04 100644 (file)
@@ -248,6 +248,9 @@ main (int argc, char *const *argv)
 
   int ret;
 
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   GNUNET_log_setup ("gnunet-gns", "WARNING", NULL);
   ret =
       (GNUNET_OK ==
index 8b7bf3a3e031cb0e5f0455dd579becb578aaedad..6637f37cee8a4d1475521c1d1d330e15cc8046c5 100644 (file)
@@ -334,6 +334,9 @@ main (int argc, char *const *argv)
 
   int ret;
 
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   GNUNET_log_setup ("hostlist", "WARNING", NULL);
   ret =
       (GNUNET_OK ==
index 54d2e3034d8bffa08d0c9b8726aca8869ef57dc4..d68ca5c78925d35adae12165f205a13d593fab03 100644 (file)
@@ -390,6 +390,24 @@ GNUNET_STRINGS_to_address_ip (const char *addr,
                              struct sockaddr_storage *r_buf);
 
 
+/**
+ * Returns utf-8 encoded arguments.
+ * Does nothing (returns a copy of argc and argv) on any platform
+ * other than W32.
+ * Returned argv has u8argv[u8argc] == NULL.
+ * Returned argv is a single memory block, and can be freed with a single
+ *   GNUNET_free () call.
+ *
+ * @param argc argc (as given by main())
+ * @param argv argv (as given by main())
+ * @param u8argc a location to store new argc in (though it's th same as argc)
+ * @param u8argv a location to store new argv in
+ * @return GNUNET_OK on success, GNUNET_SYSERR on failure
+ */
+int
+GNUNET_STRINGS_get_utf8_args (int argc, char *const *argv, int *u8argc,
+                              char *const **u8argv);
+
 /* ifndef GNUNET_UTIL_STRING_H */
 #endif
 /* end of gnunet_util_string.h */
index a06b5a763a319a6ee5315c2a7b2a739f734f35fc..bcf9d03796d6c2a6262ffafbe40e38faef2f0137 100644 (file)
@@ -1090,6 +1090,10 @@ main (int argc, char *const *argv)
     GNUNET_NO, &GNUNET_GETOPT_set_one, &ping},
     GNUNET_GETOPT_OPTION_END
   };
+
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   return (GNUNET_OK ==
           GNUNET_PROGRAM_run (argc, argv, "cn",
                               gettext_noop ("help text"), options, &run,
index a0d1de10a192f09c8913d9f0946f2ccffd16e8e1..62498120149cc872f576f1613f909fa538ad29e3 100644 (file)
@@ -493,6 +493,9 @@ main (int argc, char *const *argv)
 
   int ret;
 
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   GNUNET_log_setup ("gnunet-namestore", "WARNING", NULL);
   ret =
       (GNUNET_OK ==
index 9b6846cf0e21f16c70b58c09a5cae403523fdcae..e971bd3b1d5715ba0928d9618c430e0592ed57f9 100644 (file)
@@ -313,6 +313,9 @@ main (int argc, char *const argv[])
     GNUNET_GETOPT_OPTION_END
   };
 
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   if (GNUNET_OK !=
       GNUNET_PROGRAM_run (argc, argv, "gnunet-nat-server [options] PORT",
                           _("GNUnet NAT traversal test helper daemon"), options,
index 4a4bea5eddb312306272aa8ea8bbc7bf6133b8fd..cf88690d5c85e88b228d82285fd83dbd160ed6c6 100644 (file)
@@ -914,8 +914,11 @@ static struct GNUNET_GETOPT_CommandLineOption options[] = {
 
 
 int
-main (int argc, char *argv[])
+main (int argc, char *const *argv)
 {
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   GNUNET_log_setup ("nse-profiler",
 #if VERBOSE
                     "DEBUG",
index de27cd276e5ec3720d878c25dbd327cd252578c8..d3637af44c1376d99712afd7122e5cc51393ff37 100644 (file)
@@ -952,6 +952,10 @@ main (int argc, char *const *argv)
      1, &GNUNET_GETOPT_set_string, &put_uri},
     GNUNET_GETOPT_OPTION_END
   };
+
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   return (GNUNET_OK ==
           GNUNET_PROGRAM_run (argc, argv, "gnunet-peerinfo",
                               gettext_noop ("Print information about peers."),
index 2ad8468efa99fa9cbae593c85df7cf2d67d8c282..73936a48958bece6d3498b3d3e5a7b35f7236040 100644 (file)
@@ -967,6 +967,9 @@ main (int argc, char *const *argv)
     GNUNET_GETOPT_OPTION_END
   };
 
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   return (GNUNET_OK ==
           GNUNET_PROGRAM_run (argc, argv, "gnunet-daemon-pt",
                               gettext_noop
index 3eef887fc697cb27ac8e4c52eae07630726236b0..add2ddf413861205ed230a38b2c5d9ea57252420 100644 (file)
@@ -240,6 +240,10 @@ main (int argc, char *const *argv)
      &GNUNET_GETOPT_set_one, &watch},
     GNUNET_GETOPT_OPTION_END
   };
+
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   return (GNUNET_OK ==
           GNUNET_PROGRAM_run (argc, argv, "gnunet-statistics [options [value]]",
                               gettext_noop
index 7b1d9dfff85d5929e4017637b72bcd1bd4245a70..3020a73bebedb4b6489ed06a43d6583f77292a75 100644 (file)
@@ -63,6 +63,10 @@ main (int argc, char *const *argv)
     /* FIMXE: add options here */
     GNUNET_GETOPT_OPTION_END
   };
+
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   return (GNUNET_OK ==
           GNUNET_PROGRAM_run (argc, argv, "gnunet-template",
                               gettext_noop ("help text"), options, &run,
index bdbb5e8c5e4acf02c31f08e542022c743d228923..375185b0e7058c3a61c0624c0eba2648fb079aa6 100644 (file)
@@ -282,6 +282,10 @@ main (int argc, char *const *argv)
      GNUNET_YES, &GNUNET_GETOPT_set_string, &create_cfg_template},
     GNUNET_GETOPT_OPTION_END
   };
+
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   return (GNUNET_OK ==
           GNUNET_PROGRAM_run (argc, argv, "gnunet-testing",
                               gettext_noop ("Command line tool to access the testing library"), options, &run,
index 57da127fdda4d49ce7146f78c34e1a14459b55fb..356e2c963d4046118aa4e491e2ff330182d5409b 100644 (file)
@@ -1356,6 +1356,9 @@ main (int argc, char *const *argv)
   };
   int ret;
 
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   ret =
       (GNUNET_OK ==
        GNUNET_PROGRAM_run (argc, argv, "gnunet-daemon-topology",
index 3b6b7e4c541b8c4743f8d86ba2141b0f1418e2e3..d07afccea92d90013b5c7d74c05e57265d6ca549 100644 (file)
@@ -639,6 +639,10 @@ main (int argc, char *const *argv)
     GNUNET_GETOPT_OPTION_VERBOSE (&verbosity),
     GNUNET_GETOPT_OPTION_END
   };
+
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   return (GNUNET_OK ==
           GNUNET_PROGRAM_run (argc, argv, "gnunet-transport",
                               gettext_noop
index 142dd0d2fda7065ceb6140df8a0ab12b4fb250a4..55963774835d7d49ad119e0d78dbb6803a9332e3 100644 (file)
@@ -149,6 +149,10 @@ main (int argc, char *const *argv)
       0, &GNUNET_GETOPT_set_one, &reverse },
     GNUNET_GETOPT_OPTION_END
   };
+
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   return (GNUNET_OK ==
           GNUNET_PROGRAM_run (argc, argv, "gnunet-resolver [hostname]",
                               gettext_noop ("Use build-in GNUnet stub resolver"),
index f3cd83a8b64d57d43d477c2aa326ea13953c9f49..fc9d2006402234fc6e1d1cdd427096412c7ae254 100644 (file)
@@ -119,6 +119,10 @@ main (int argc, char *const *argv)
       0, &GNUNET_GETOPT_set_one, &print_short_identity },
     GNUNET_GETOPT_OPTION_END
   };
+
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   return (GNUNET_OK ==
           GNUNET_PROGRAM_run (argc, argv, "gnunet-rsa [OPTIONS] keyfile",
                               gettext_noop ("Manipulate GNUnet private RSA key files"),
index 9e1a83d0bcc071252214e5eac03b973f2d98d5ec..a8178b93a00fab50840e3ad4f6f98182dc7b4465 100644 (file)
@@ -165,6 +165,7 @@ GNUNET_PROGRAM_run2 (int argc, char *const *argv, const char *binaryName,
   char *lpfx;
   char *spc;
 
+
   logfile = NULL;
   gargs = getenv ("GNUNET_ARGS");
   if (gargs != NULL)
index 11134f139ace4d5c66b98b20d5e6d56c913b1e65..cc44767d62e4e2bee55ee95dbd466005288b5267 100644 (file)
@@ -32,6 +32,7 @@
 #include "gnunet_common.h"
 #include "gnunet_strings_lib.h"
 #include <unicase.h>
+#include <unistr.h>
 
 #define LOG(kind,...) GNUNET_log_from (kind, "util", __VA_ARGS__)
 
@@ -1113,4 +1114,93 @@ GNUNET_STRINGS_to_address_ip (const char *addr,
   return GNUNET_STRINGS_to_address_ipv4 (addr, addrlen, (struct sockaddr_in *) r_buf);
 }
 
+/**
+ * Makes a copy of argv that consists of a single memory chunk that can be
+ * freed with a single call to GNUNET_free ();
+ */
+static char *const *
+_make_continuous_arg_copy (int argc, char *const *argv)
+{
+  size_t argvsize = 0;
+  int i;
+  char **new_argv;
+  char *p;
+  for (i = 0; i < argc; i++)
+    argvsize += strlen (argv[i]) + 1 + sizeof (char *);
+  new_argv = GNUNET_malloc (argvsize + sizeof (char *));
+  p = (char *) &new_argv[argc + 1];
+  for (i = 0; i < argc; i++)
+  {
+    new_argv[i] = p;
+    strcpy (p, argv[i]);
+    p += strlen (argv[i]) + 1;
+  }
+  new_argv[argc] = NULL;
+  return (char *const *) new_argv;
+}
+
+/**
+ * Returns utf-8 encoded arguments.
+ * Does nothing (returns a copy of argc and argv) on any platform
+ * other than W32.
+ * Returned argv has u8argv[u8argc] == NULL.
+ * Returned argv is a single memory block, and can be freed with a single
+ *   GNUNET_free () call.
+ *
+ * @param argc argc (as given by main())
+ * @param argv argv (as given by main())
+ * @param u8argc a location to store new argc in (though it's th same as argc)
+ * @param u8argv a location to store new argv in
+ * @return GNUNET_OK on success, GNUNET_SYSERR on failure
+ */
+int
+GNUNET_STRINGS_get_utf8_args (int argc, char *const *argv, int *u8argc, char *const **u8argv)
+{
+#if WINDOWS
+  wchar_t *wcmd;
+  wchar_t **wargv;
+  int wargc;
+  int i;
+  char **split_u8argv;
+
+  wcmd = GetCommandLineW ();
+  if (NULL == wcmd)
+    return GNUNET_SYSERR;
+  wargv = CommandLineToArgvW (wcmd, &wargc);
+  if (NULL == wargv)
+    return GNUNET_SYSERR;
+
+  split_u8argv = GNUNET_malloc (argc * sizeof (char *));
+
+  for (i = 0; i < wargc; i++)
+  {
+    size_t strl;
+    /* Hopefully it will allocate us NUL-terminated strings... */
+    split_u8argv[i] = (char *) u16_to_u8 (wargv[i], wcslen (wargv[i]) + 1, NULL, &strl);
+    if (split_u8argv == NULL)
+    {
+      int j;
+      for (j = 0; j < i; j++)
+        free (split_u8argv[j]);
+      GNUNET_free (split_u8argv);
+      LocalFree (wargv);
+      return GNUNET_SYSERR;
+    }
+  }
+
+  *u8argv = _make_continuous_arg_copy (wargc, split_u8argv);
+  *u8argc = wargc;
+
+  for (i = 0; i < wargc; i++)
+    free (split_u8argv[i]);
+  free (split_u8argv);
+  return GNUNET_OK;
+#else
+  char *const *new_argv = (char *const *) _make_continuous_arg_copy (argc, argv);
+  *u8argv = new_argv;
+  *u8argc = argc;
+  return GNUNET_OK;
+#endif
+}
+
 /* end of strings.c */
index ecc0442c65b768e9e66dd01d68ddff091dda1307..b75b1d29a063c64534a38daa97331d04128ac7c9 100644 (file)
@@ -323,6 +323,10 @@ main (int argc, char *const *argv)
     GNUNET_GETOPT_OPTION_VERBOSE (&verbosity),
     GNUNET_GETOPT_OPTION_END
   };
+
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   return (GNUNET_OK ==
           GNUNET_PROGRAM_run (argc, argv, "gnunet-vpn",
                               gettext_noop