X-Git-Url: http://git.sven.stormbind.net/?p=sven%2Ffuse-exfat.git;a=blobdiff_plain;f=fuse%2Fmain.c;h=bc0faf3e773a80bfd828c51c49d5f036b5c8567b;hp=aad082b68f21265f21686cdab57097ecafc60b4d;hb=729387130d5fba1d085a5f1bcccd20c712ae8f01;hpb=c76228745fbda53868afdf95990902bd3b27f608 diff --git a/fuse/main.c b/fuse/main.c index aad082b..bc0faf3 100644 --- a/fuse/main.c +++ b/fuse/main.c @@ -3,7 +3,7 @@ FUSE-based exFAT implementation. Requires FUSE 2.6 or later. Free exFAT implementation. - Copyright (C) 2010-2015 Andrew Nayenko + Copyright (C) 2010-2016 Andrew Nayenko This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -427,6 +427,36 @@ static char* add_option(char* options, const char* name, const char* value) return options; } +static void escape(char* escaped, const char* orig) +{ + do + { + if (*orig == ',' || *orig == '\\') + *escaped++ = '\\'; + } + while ((*escaped++ = *orig++)); +} + +static char* add_fsname_option(char* options, const char* spec) +{ + /* escaped string cannot be more than twice as big as the original one */ + char* escaped = malloc(strlen(spec) * 2 + 1); + + if (escaped == NULL) + { + free(options); + exfat_error("failed to allocate escaped string for %s", spec); + return NULL; + } + + /* on some platforms (e.g. Android, Solaris) device names can contain + commas */ + escape(escaped, spec); + options = add_option(options, "fsname", escaped); + free(escaped); + return options; +} + static char* add_user_option(char* options) { struct passwd* pw; @@ -458,7 +488,7 @@ static char* add_blksize_option(char* options, long cluster_size) static char* add_fuse_options(char* options, const char* spec) { - options = add_option(options, "fsname", spec); + options = add_fsname_option(options, spec); if (options == NULL) return NULL; options = add_user_option(options); @@ -508,7 +538,7 @@ int main(int argc, char* argv[]) break; case 'V': free(mount_options); - puts("Copyright (C) 2010-2015 Andrew Nayenko"); + puts("Copyright (C) 2010-2016 Andrew Nayenko"); return 0; case 'v': break;