X-Git-Url: https://git.sven.stormbind.net/?p=sven%2Fexfat-utils.git;a=blobdiff_plain;f=libexfat%2Fmount.c;h=ec4f52e88a6d8561957bc45bc0f8aeb5f33d1850;hp=a62466b1854fb004616ee0760337c9a1bb93dcf8;hb=4efb596cee7f7cc961990f8dffc3b210e579e49c;hpb=70a4b10edcf53a90140e6dd80ccaa045f3647ad7 diff --git a/libexfat/mount.c b/libexfat/mount.c index a62466b..ec4f52e 100644 --- a/libexfat/mount.c +++ b/libexfat/mount.c @@ -2,7 +2,7 @@ mount.c (22.10.09) exFAT file system implementation library. - Copyright (C) 2010-2012 Andrew Nayenko + Copyright (C) 2010-2013 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 @@ -61,7 +61,7 @@ static int get_int_option(const char* options, const char* option_name, return strtol(p, NULL, base); } -static int match_option(const char* options, const char* option_name) +static bool match_option(const char* options, const char* option_name) { const char* p; size_t length = strlen(option_name); @@ -69,8 +69,8 @@ static int match_option(const char* options, const char* option_name) for (p = strstr(options, option_name); p; p = strstr(p + 1, option_name)) if ((p == options || p[-1] == ',') && (p[length] == ',' || p[length] == '\0')) - return 1; - return 0; + return true; + return false; } static void parse_options(struct exfat* ef, const char* options) @@ -86,7 +86,6 @@ static void parse_options(struct exfat* ef, const char* options) ef->uid = get_int_option(options, "uid", 10, geteuid()); ef->gid = get_int_option(options, "gid", 10, getegid()); - ef->ro = match_option(options, "ro"); ef->noatime = match_option(options, "noatime"); } @@ -137,22 +136,28 @@ static int prepare_super_block(const struct exfat* ef) int exfat_mount(struct exfat* ef, const char* spec, const char* options) { int rc; + enum exfat_mode mode; exfat_tzset(); memset(ef, 0, sizeof(struct exfat)); parse_options(ef, options); - ef->dev = exfat_open(spec, ef->ro); + if (match_option(options, "ro")) + mode = EXFAT_MODE_RO; + else if (match_option(options, "ro_fallback")) + mode = EXFAT_MODE_ANY; + else + mode = EXFAT_MODE_RW; + ef->dev = exfat_open(spec, mode); if (ef->dev == NULL) + return -EIO; + if (exfat_get_mode(ef->dev) == EXFAT_MODE_RO) { - if (ef->ro || !match_option(options, "ro_fallback")) - return -EIO; - ef->dev = exfat_open(spec, 1); - if (ef->dev == NULL) - return -EIO; - exfat_warn("device is write-protected, mounting read-only"); - ef->ro_fallback = ef->ro = 1; + if (mode == EXFAT_MODE_ANY) + ef->ro = -1; + else + ef->ro = 1; } ef->sb = malloc(sizeof(struct exfat_super_block));