Add non-exclusive override via --non-exclusive.
authorClemens Fruhwirth <clemens@endorphin.org>
Mon, 30 Jun 2008 12:20:24 +0000 (12:20 +0000)
committerClemens Fruhwirth <clemens@endorphin.org>
Mon, 30 Jun 2008 12:20:24 +0000 (12:20 +0000)
git-svn-id: https://cryptsetup.googlecode.com/svn/trunk@25 36d66b0a-2a48-0410-832c-cd162a569da5

lib/setup.c
src/cryptsetup.c

index 5950fb9..5ac7028 100644 (file)
@@ -481,14 +481,15 @@ static int __crypt_luks_open(int arg, struct setup_backend *backend, struct cryp
        };
        char *dmCipherSpec;
        int r, tries = options->tries;
-       
+       int excl = (options->flags & CRYPT_FLAG_NON_EXCLUSIVE_ACCESS) ? 0 : O_EXCL ;
+
        r = backend->status(0, &tmp, NULL);
        if (r >= 0) {
                set_error("Device already exists");
                return -EEXIST;
        }
 
-       if (!LUKS_device_ready(options->device, O_RDONLY | O_EXCL)) {
+       if (!LUKS_device_ready(options->device, O_RDONLY | excl)) {
                set_error("Can not access device");
                return -ENOTBLK;
        }
index c18bb03..c2024c9 100644 (file)
@@ -31,6 +31,7 @@ static int opt_version_mode = 0;
 static int opt_timeout = 0;
 static int opt_tries = 3;
 static int opt_align_payload = 0;
+static int opt_non_exclusive = 0;
 
 static const char **action_argv;
 static int action_argc;
@@ -289,6 +290,8 @@ static int action_luksOpen(int arg)
        options.flags = 0;
        if (opt_readonly)
                options.flags |= CRYPT_FLAG_READONLY;
+       if (opt_non_exclusive)
+               options.flags |= CRYPT_FLAG_NON_EXCLUSIVE_ACCESS;
        r = crypt_luksOpen(&options);
        show_status(-r);
        return r;
@@ -454,10 +457,11 @@ int main(int argc, char **argv)
                { "iter-time",         'i',  POPT_ARG_INT,                                &opt_iteration_time,    0, N_("PBKDF2 iteration time for LUKS (in ms)"),
                  N_("msecs") },
                { "batch-mode",        'q',  POPT_ARG_NONE,                               &opt_batch_mode,        0, N_("Do not ask for confirmation"),                                     NULL },
-               { "version",        '\0',  POPT_ARG_NONE,                               &opt_version_mode,        0, N_("Print package version"),                                     NULL },
+               { "version",        '\0',  POPT_ARG_NONE,                                 &opt_version_mode,        0, N_("Print package version"),                                     NULL },
                { "timeout",           't',  POPT_ARG_INT,                                &opt_timeout,           0, N_("Timeout for interactive passphrase prompt (in seconds)"),          N_("secs") },
                { "tries",             'T',  POPT_ARG_INT,                                &opt_tries,             0, N_("How often the input of the passphrase can be retried"),            NULL },
-               { "align-payload",     '\0',  POPT_ARG_INT,                                &opt_align_payload,     0, N_("Align payload at <n> sector boundaries - for luksFormat"),         N_("SECTORS") },
+               { "align-payload",     '\0',  POPT_ARG_INT,                               &opt_align_payload,     0, N_("Align payload at <n> sector boundaries - for luksFormat"),         N_("SECTORS") },
+               { "non-exclusive",     '\0',  POPT_ARG_NONE,                              &opt_non_exclusive,     0, N_("Allows non-exclusive access for luksOpen, WARNING see manpage."),        NULL },
                POPT_TABLEEND
        };
        poptContext popt_context;