Fix (deprecated) reload device command to accept new device argument.
authorMilan Broz <gmazyland@gmail.com>
Sun, 30 May 2010 12:23:38 +0000 (12:23 +0000)
committerMilan Broz <gmazyland@gmail.com>
Sun, 30 May 2010 12:23:38 +0000 (12:23 +0000)
git-svn-id: https://cryptsetup.googlecode.com/svn/trunk@241 36d66b0a-2a48-0410-832c-cd162a569da5

ChangeLog
lib/setup.c
tests/api-test.c

index 0eed82b..d714d13 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,7 @@
        * Fix luksFormat/luksOpen reading passphrase from stdin and "-" keyfile.
        * Add verbose log level and move unlocking message there.
        * Remove device even if underlying device disappeared.
+       * Fix (deprecated) reload device command to accept new device argument.
 
 2010-05-23  Milan Broz  <mbroz@redhat.com>
        * Fix luksClose operation for stacked DM devices.
index 87a1c38..2957a60 100644 (file)
@@ -254,8 +254,9 @@ static int device_check_and_adjust(struct crypt_device *cd,
 {
        struct device_infos infos;
 
-       if (get_device_infos(device, &infos, cd) < 0) {
-               log_err(cd, _("Cannot get info about device %s.\n"), device);
+       if (!device || get_device_infos(device, &infos, cd) < 0) {
+               log_err(cd, _("Cannot get info about device %s.\n"),
+                       device ?: "[none]");
                return -ENOTBLK;
        }
 
@@ -587,7 +588,7 @@ void crypt_set_password_callback(struct crypt_device *cd,
 /* OPTIONS: name, cipher, device, hash, key_file, key_size, key_slot,
  *          offset, size, skip, timeout, tries, passphrase_fd (ignored),
  *          flags, icb */
-int crypt_create_device(struct crypt_options *options)
+static int crypt_create_and_update_device(struct crypt_options *options, int update)
 {
        struct crypt_device *cd = NULL;
        char *key = NULL;
@@ -607,39 +608,21 @@ int crypt_create_device(struct crypt_options *options)
                        options->cipher, NULL, options->key_file, key, keyLen,
                        options->key_size, options->size, options->skip,
                        options->offset, NULL, options->flags & CRYPT_FLAG_READONLY,
-                       options->flags, 0);
+                       options->flags, update);
 
        safe_free(key);
        crypt_free(cd);
        return r;
 }
 
-/* OPTIONS: same as create above */
-int crypt_update_device(struct crypt_options *options)
+int crypt_create_device(struct crypt_options *options)
 {
-       struct crypt_device *cd = NULL;
-       char *key = NULL;
-       unsigned int keyLen;
-       int r;
-
-       r = _crypt_init(&cd, CRYPT_PLAIN, options, 1, 1);
-       if (r)
-               return r;
-
-       get_key(_("Enter passphrase: "), &key, &keyLen, options->key_size,
-               options->key_file, cd->timeout, options->flags, cd);
-       if (!key)
-               r = -ENOENT;
-       else
-               r = create_device_helper(cd, options->name, options->hash,
-                       options->cipher, NULL, options->key_file, key, keyLen,
-                       options->key_size, options->size, options->skip,
-                       options->offset, NULL, options->flags & CRYPT_FLAG_READONLY,
-                       options->flags, 1);
+       return crypt_create_and_update_device(options, 0);
+}
 
-       safe_free(key);
-       crypt_free(cd);
-       return r;
+int crypt_update_device(struct crypt_options *options)
+{
+       return crypt_create_and_update_device(options, 1);
 }
 
 /* OPTIONS: name, size, icb */
index c24324c..b9dd34b 100644 (file)
@@ -476,7 +476,6 @@ void DeviceResizeGame(void)
        co.size = 0;
        OK_(crypt_resize_device(&co));
        EQ_(_get_device_size(DMDIR CDEVICE_2), (orig_size - 333));
-
        co.size = 0;
        co.offset = 444;
        co.skip = 555;
@@ -492,10 +491,36 @@ void DeviceResizeGame(void)
        EQ_(co.key_size, 128 / 8);
        EQ_(co.offset, 444);
        EQ_(co.skip, 555);
-       OK_(crypt_remove_device(&co));
+       crypt_put_options(&co);
+
+       // dangerous switch device still works
+       memset(&co, 0, sizeof(co));
+       co.name = CDEVICE_2,
+       co.device = DEVICE_1;
+       co.key_file = KEYFILE2;
+       co.key_size = 128 / 8;
+       co.cipher = "aes-cbc-plain";
+       co.hash = "sha1";
+       co.icb = &cmd_icb;
+       OK_(crypt_update_device(&co));
 
+       memset(&co, 0, sizeof(co));
+       co.icb = &cmd_icb,
+       co.name = CDEVICE_2;
+       EQ_(crypt_query_device(&co), 1);
+       EQ_(strcmp(co.cipher, "aes-cbc-plain"), 0);
+       EQ_(co.key_size, 128 / 8);
+       EQ_(co.offset, 0);
+       EQ_(co.skip, 0);
+       // This expect lookup returns prefered /dev/loopX
+       EQ_(strcmp(co.device, DEVICE_1), 0);
        crypt_put_options(&co);
 
+       memset(&co, 0, sizeof(co));
+       co.icb = &cmd_icb,
+       co.name = CDEVICE_2;
+       OK_(crypt_remove_device(&co));
+
        _remove_keyfiles();
 }