diff options
author | Jim Kaye <jameskaye@google.com> | 2018-02-22 21:34:16 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2018-02-22 21:34:16 +0000 |
commit | 7555c8dedf02a4dc946626f9dbe24de60c9ba441 (patch) | |
tree | a9babdba662865e91b66649dc7ee8ea3e68a0ead | |
parent | 613a112d8ef97bc5278e6bf51c6904243f3c0742 (diff) | |
parent | b2d5e1171803b3229c64f8dfd2c576e8a80c5901 (diff) | |
download | sdk-7555c8dedf02a4dc946626f9dbe24de60c9ba441.tar.gz |
Merge "[SDK tools] Support non-ASCII paths in 'mksdcard'"android-p-preview-1android-o-mr1-iot-preview-7o-mr1-iot-preview-7
-rw-r--r-- | emulator/mksdcard/src/source/mksdcard.c | 79 |
1 files changed, 57 insertions, 22 deletions
diff --git a/emulator/mksdcard/src/source/mksdcard.c b/emulator/mksdcard/src/source/mksdcard.c index d0b6d5cf6..ca23e6375 100644 --- a/emulator/mksdcard/src/source/mksdcard.c +++ b/emulator/mksdcard/src/source/mksdcard.c @@ -62,6 +62,19 @@ static Byte s_fsinfo_sector [ BYTES_PER_SECTOR ]; /* FS Info sector */ static Byte s_fat_head [ BYTES_PER_SECTOR ]; /* first FAT sector */ // static Byte s_zero_sector [ BYTES_PER_SECTOR ]; /* empty sector */ +// For handling Unicode paths +#ifdef _WIN32 + #define WIDE_CHAR wchar_t + #define ARGC wargc + #define ARGV wargv + #define STRINGPRINT "%S" +#else + #define WIDE_CHAR char + #define ARGC argc + #define ARGV argv + #define STRINGPRINT "%s" +#endif + /* this is the date and time when creating the disk */ static int get_serial_id( void ) @@ -220,26 +233,35 @@ static void usage (void) int main( int argc, char** argv ) { - Wide disk_size; - int sectors_per_fat; - int sectors_per_disk; - char* end; - const char* label = NULL; - FILE* f = NULL; - - for ( ; argc > 1 && argv[1][0] == '-'; argc--, argv++ ) + Wide disk_size; + int sectors_per_fat; + int sectors_per_disk; + WIDE_CHAR* end; + const WIDE_CHAR* label = NULL; + FILE* f = NULL; + +#ifdef _WIN32 + int wargc; + WIDE_CHAR** wargv; + WIDE_CHAR** unused_environment; + WIDE_CHAR** unused_startupinfo; + + __wgetmainargs(&wargc, &wargv, &unused_environment, 0, &unused_startupinfo); +#endif + + for ( ; ARGC > 1 && ARGV[1][0] == '-'; ARGC--, ARGV++ ) { - char* arg = argv[1] + 1; + WIDE_CHAR* arg = ARGV[1] + 1; switch (arg[0]) { case 'l': if (arg[1] != 0) arg += 2; else { - argc--; - argv++; - if (argc <= 1) + ARGC--; + ARGV++; + if (ARGC <= 1) usage(); - arg = argv[1]; + arg = ARGV[1]; } label = arg; break; @@ -249,12 +271,17 @@ int main( int argc, char** argv ) } } - if (argc != 3) + if (ARGC != 3) usage(); - disk_size = strtoll( argv[1], &end, 10 ); +#ifdef _WIN32 + disk_size = wcstoll( ARGV[1], &end, 10 ); +#else + disk_size = strtoll( ARGV[1], &end, 10 ); +#endif + if (disk_size <= 0 || errno == EINVAL || errno == ERANGE) { - fprintf(stderr, "Invalid argument size '%s'\n\n", argv[1]); + fprintf(stderr, "Invalid argument size '" STRINGPRINT "'\n\n", ARGV[1]); usage(); } @@ -266,10 +293,10 @@ int main( int argc, char** argv ) disk_size *= 1024*1024*1024; if (disk_size < 9*1024*1024) { - fprintf(stderr, "Invalid argument: size '%s' is too small.\n\n", argv[1]); + fprintf(stderr, "Invalid argument: size '" STRINGPRINT "' is too small.\n\n", ARGV[1]); usage(); } else if (disk_size > MAX_DISK_SIZE) { - fprintf(stderr, "Invalid argument: size '%s' is too large.\n\n", argv[1]); + fprintf(stderr, "Invalid argument: size '" STRINGPRINT "' is too large.\n\n", ARGV[1]); usage(); } @@ -279,9 +306,13 @@ int main( int argc, char** argv ) boot_sector_init( s_boot_sector, s_fsinfo_sector, disk_size, NULL ); fat_init( s_fat_head ); - f = fopen( argv[2], "wb" ); +#ifdef _WIN32 + f = _wfopen( ARGV[2], L"wb" ); +#else + f = fopen( ARGV[2], "wb" ); +#endif if ( !f ) { - fprintf(stderr, "Could not create file '%s': %s\n", argv[2], strerror(errno)); + fprintf(stderr, "Could not create file '" STRINGPRINT "': %s\n", ARGV[2], strerror(errno)); goto FailWrite; } @@ -322,8 +353,12 @@ int main( int argc, char** argv ) FailWrite: if (f != NULL) { fclose(f); - unlink( argv[2] ); - fprintf(stderr, "File '%s' was not created.\n", argv[2]); +#ifdef _WIN32 + _wunlink( ARGV[2] ); +#else + unlink( ARGV[2] ); +#endif + fprintf(stderr, "File '" STRINGPRINT "' was not created.\n", ARGV[2]); } return 1; } |