mirror of
https://gitlab.com/cryptsetup/cryptsetup.git
synced 2025-12-14 20:30:04 +01:00
Use common utils_tools.c for all tools.
Unify tool environment and deduplicate code.
This commit is contained in:
@@ -14,6 +14,7 @@ cryptsetup_SOURCES = \
|
|||||||
$(top_builddir)/lib/utils_crypt.c \
|
$(top_builddir)/lib/utils_crypt.c \
|
||||||
$(top_builddir)/lib/utils_loop.c \
|
$(top_builddir)/lib/utils_loop.c \
|
||||||
$(top_builddir)/lib/utils_fips.c \
|
$(top_builddir)/lib/utils_fips.c \
|
||||||
|
utils_tools.c \
|
||||||
cryptsetup.c \
|
cryptsetup.c \
|
||||||
cryptsetup.h
|
cryptsetup.h
|
||||||
|
|
||||||
@@ -43,6 +44,7 @@ if VERITYSETUP
|
|||||||
veritysetup_SOURCES = \
|
veritysetup_SOURCES = \
|
||||||
$(top_builddir)/lib/utils_crypt.c \
|
$(top_builddir)/lib/utils_crypt.c \
|
||||||
$(top_builddir)/lib/utils_loop.c \
|
$(top_builddir)/lib/utils_loop.c \
|
||||||
|
utils_tools.c \
|
||||||
veritysetup.c \
|
veritysetup.c \
|
||||||
cryptsetup.h
|
cryptsetup.h
|
||||||
|
|
||||||
@@ -70,6 +72,7 @@ endif
|
|||||||
if REENCRYPT
|
if REENCRYPT
|
||||||
cryptsetup_reencrypt_SOURCES = \
|
cryptsetup_reencrypt_SOURCES = \
|
||||||
$(top_builddir)/lib/utils_crypt.c \
|
$(top_builddir)/lib/utils_crypt.c \
|
||||||
|
utils_tools.c \
|
||||||
cryptsetup_reencrypt.c \
|
cryptsetup_reencrypt.c \
|
||||||
cryptsetup.h
|
cryptsetup.h
|
||||||
|
|
||||||
|
|||||||
225
src/cryptsetup.c
225
src/cryptsetup.c
@@ -19,25 +19,8 @@
|
|||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <inttypes.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <popt.h>
|
|
||||||
|
|
||||||
#include "cryptsetup.h"
|
#include "cryptsetup.h"
|
||||||
|
|
||||||
static int opt_verbose = 0;
|
|
||||||
static int opt_debug = 0;
|
|
||||||
static const char *opt_cipher = NULL;
|
static const char *opt_cipher = NULL;
|
||||||
static const char *opt_hash = NULL;
|
static const char *opt_hash = NULL;
|
||||||
static int opt_verify_passphrase = 0;
|
static int opt_verify_passphrase = 0;
|
||||||
@@ -58,7 +41,6 @@ static uint64_t opt_skip = 0;
|
|||||||
static int opt_skip_valid = 0;
|
static int opt_skip_valid = 0;
|
||||||
static int opt_readonly = 0;
|
static int opt_readonly = 0;
|
||||||
static int opt_iteration_time = 1000;
|
static int opt_iteration_time = 1000;
|
||||||
static int opt_batch_mode = 0;
|
|
||||||
static int opt_version_mode = 0;
|
static int opt_version_mode = 0;
|
||||||
static int opt_timeout = 0;
|
static int opt_timeout = 0;
|
||||||
static int opt_tries = 3;
|
static int opt_tries = 3;
|
||||||
@@ -126,84 +108,6 @@ static struct action_type {
|
|||||||
{ NULL, NULL, 0, 0, 0, NULL, NULL }
|
{ NULL, NULL, 0, 0, 0, NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
__attribute__((format(printf, 5, 6)))
|
|
||||||
static void clogger(struct crypt_device *cd, int level, const char *file,
|
|
||||||
int line, const char *format, ...)
|
|
||||||
{
|
|
||||||
va_list argp;
|
|
||||||
char *target = NULL;
|
|
||||||
|
|
||||||
va_start(argp, format);
|
|
||||||
|
|
||||||
if (vasprintf(&target, format, argp) > 0) {
|
|
||||||
if (level >= 0) {
|
|
||||||
crypt_log(cd, level, target);
|
|
||||||
#ifdef CRYPT_DEBUG
|
|
||||||
} else if (opt_debug)
|
|
||||||
printf("# %s:%d %s\n", file ?: "?", line, target);
|
|
||||||
#else
|
|
||||||
} else if (opt_debug)
|
|
||||||
printf("# %s\n", target);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
va_end(argp);
|
|
||||||
free(target);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int _yesDialog(const char *msg, void *usrptr __attribute__((unused)))
|
|
||||||
{
|
|
||||||
char *answer = NULL;
|
|
||||||
size_t size = 0;
|
|
||||||
int r = 1;
|
|
||||||
|
|
||||||
if(isatty(STDIN_FILENO) && !opt_batch_mode) {
|
|
||||||
log_std("\nWARNING!\n========\n");
|
|
||||||
log_std("%s\n\nAre you sure? (Type uppercase yes): ", msg);
|
|
||||||
if(getline(&answer, &size, stdin) == -1) {
|
|
||||||
perror("getline");
|
|
||||||
free(answer);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if(strcmp(answer, "YES\n"))
|
|
||||||
r = 0;
|
|
||||||
free(answer);
|
|
||||||
}
|
|
||||||
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void _log(int level, const char *msg, void *usrptr __attribute__((unused)))
|
|
||||||
{
|
|
||||||
switch(level) {
|
|
||||||
|
|
||||||
case CRYPT_LOG_NORMAL:
|
|
||||||
fputs(msg, stdout);
|
|
||||||
break;
|
|
||||||
case CRYPT_LOG_VERBOSE:
|
|
||||||
if (opt_verbose)
|
|
||||||
fputs(msg, stdout);
|
|
||||||
break;
|
|
||||||
case CRYPT_LOG_ERROR:
|
|
||||||
fputs(msg, stderr);
|
|
||||||
break;
|
|
||||||
case CRYPT_LOG_DEBUG:
|
|
||||||
if (opt_debug)
|
|
||||||
printf("# %s\n", msg);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(stderr, "Internal error on logging class for msg: %s", msg);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void _quiet_log(int level, const char *msg, void *usrptr)
|
|
||||||
{
|
|
||||||
if (!opt_verbose && (level == CRYPT_LOG_ERROR || level == CRYPT_LOG_NORMAL))
|
|
||||||
level = CRYPT_LOG_VERBOSE;
|
|
||||||
_log(level, msg, usrptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int _verify_passphrase(int def)
|
static int _verify_passphrase(int def)
|
||||||
{
|
{
|
||||||
/* Batch mode switch off verify - if not overrided by -y */
|
/* Batch mode switch off verify - if not overrided by -y */
|
||||||
@@ -222,60 +126,6 @@ static int _verify_passphrase(int def)
|
|||||||
return def;
|
return def;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void show_status(int errcode)
|
|
||||||
{
|
|
||||||
char error[256], *error_;
|
|
||||||
|
|
||||||
if(!opt_verbose)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if(!errcode) {
|
|
||||||
log_std(_("Command successful.\n"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
crypt_get_error(error, sizeof(error));
|
|
||||||
|
|
||||||
if (!error[0]) {
|
|
||||||
error_ = strerror_r(-errcode, error, sizeof(error));
|
|
||||||
if (error_ != error) {
|
|
||||||
strncpy(error, error_, sizeof(error));
|
|
||||||
error[sizeof(error) - 1] = '\0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
log_err(_("Command failed with code %i"), -errcode);
|
|
||||||
if (*error)
|
|
||||||
log_err(": %s\n", error);
|
|
||||||
else
|
|
||||||
log_err(".\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char *uuid_or_device(const char *spec)
|
|
||||||
{
|
|
||||||
static char device[PATH_MAX];
|
|
||||||
char s, *ptr;
|
|
||||||
int i = 0, uuid_len = 5;
|
|
||||||
|
|
||||||
/* Check if it is correct UUID=<LUKS_UUID> format */
|
|
||||||
if (spec && !strncmp(spec, "UUID=", uuid_len)) {
|
|
||||||
strcpy(device, "/dev/disk/by-uuid/");
|
|
||||||
ptr = &device[strlen(device)];
|
|
||||||
i = uuid_len;
|
|
||||||
while ((s = spec[i++]) && i < PATH_MAX) {
|
|
||||||
if (!isxdigit(s) && s != '-')
|
|
||||||
return spec; /* Bail it out */
|
|
||||||
if (isalpha(s))
|
|
||||||
s = tolower(s);
|
|
||||||
*ptr++ = s;
|
|
||||||
}
|
|
||||||
*ptr = '\0';
|
|
||||||
return device;
|
|
||||||
}
|
|
||||||
|
|
||||||
return spec;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int action_create(int arg __attribute__((unused)))
|
static int action_create(int arg __attribute__((unused)))
|
||||||
{
|
{
|
||||||
struct crypt_device *cd = NULL;
|
struct crypt_device *cd = NULL;
|
||||||
@@ -530,15 +380,15 @@ static int action_luksRepair(int arg __attribute__((unused)))
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/* Currently only LUKS1 allows repair */
|
/* Currently only LUKS1 allows repair */
|
||||||
crypt_set_log_callback(cd, _quiet_log, NULL);
|
crypt_set_log_callback(cd, quiet_log, NULL);
|
||||||
r = crypt_load(cd, CRYPT_LUKS1, NULL);
|
r = crypt_load(cd, CRYPT_LUKS1, NULL);
|
||||||
crypt_set_log_callback(cd, _log, NULL);
|
crypt_set_log_callback(cd, tool_log, NULL);
|
||||||
if (r == 0) {
|
if (r == 0) {
|
||||||
log_verbose( _("No known problems detected for LUKS header.\n"));
|
log_verbose( _("No known problems detected for LUKS header.\n"));
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
r = _yesDialog(_("Really try to repair LUKS device header?"),
|
r = yesDialog(_("Really try to repair LUKS device header?"),
|
||||||
NULL) ? 0 : -EINVAL;
|
NULL) ? 0 : -EINVAL;
|
||||||
if (r == 0)
|
if (r == 0)
|
||||||
r = crypt_repair(cd, CRYPT_LUKS1, NULL);
|
r = crypt_repair(cd, CRYPT_LUKS1, NULL);
|
||||||
@@ -569,7 +419,7 @@ static int action_luksFormat(int arg __attribute__((unused)))
|
|||||||
r = -ENOMEM;
|
r = -ENOMEM;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
r = _yesDialog(msg, NULL) ? 0 : -EINVAL;
|
r = yesDialog(msg, NULL) ? 0 : -EINVAL;
|
||||||
free(msg);
|
free(msg);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
goto out;
|
goto out;
|
||||||
@@ -705,7 +555,7 @@ static int verify_keyslot(struct crypt_device *cd, int key_slot,
|
|||||||
int i, r;
|
int i, r;
|
||||||
|
|
||||||
ki = crypt_keyslot_status(cd, key_slot);
|
ki = crypt_keyslot_status(cd, key_slot);
|
||||||
if (ki == CRYPT_SLOT_ACTIVE_LAST && msg_last && !_yesDialog(msg_last, NULL))
|
if (ki == CRYPT_SLOT_ACTIVE_LAST && msg_last && !yesDialog(msg_last, NULL))
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
|
|
||||||
r = crypt_get_key(msg_pass, &password, &passwordLen,
|
r = crypt_get_key(msg_pass, &password, &passwordLen,
|
||||||
@@ -747,7 +597,7 @@ static int action_luksKillSlot(int arg __attribute__((unused)))
|
|||||||
if ((r = crypt_init(&cd, uuid_or_device(action_argv[0]))))
|
if ((r = crypt_init(&cd, uuid_or_device(action_argv[0]))))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
crypt_set_confirm_callback(cd, _yesDialog, NULL);
|
crypt_set_confirm_callback(cd, yesDialog, NULL);
|
||||||
crypt_set_timeout(cd, opt_timeout);
|
crypt_set_timeout(cd, opt_timeout);
|
||||||
|
|
||||||
if ((r = crypt_load(cd, CRYPT_LUKS1, NULL)))
|
if ((r = crypt_load(cd, CRYPT_LUKS1, NULL)))
|
||||||
@@ -790,7 +640,7 @@ static int action_luksRemoveKey(int arg __attribute__((unused)))
|
|||||||
if ((r = crypt_init(&cd, uuid_or_device(action_argv[0]))))
|
if ((r = crypt_init(&cd, uuid_or_device(action_argv[0]))))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
crypt_set_confirm_callback(cd, _yesDialog, NULL);
|
crypt_set_confirm_callback(cd, yesDialog, NULL);
|
||||||
crypt_set_timeout(cd, opt_timeout);
|
crypt_set_timeout(cd, opt_timeout);
|
||||||
|
|
||||||
if ((r = crypt_load(cd, CRYPT_LUKS1, NULL)))
|
if ((r = crypt_load(cd, CRYPT_LUKS1, NULL)))
|
||||||
@@ -814,7 +664,7 @@ static int action_luksRemoveKey(int arg __attribute__((unused)))
|
|||||||
log_verbose(_("Key slot %d selected for deletion.\n"), opt_key_slot);
|
log_verbose(_("Key slot %d selected for deletion.\n"), opt_key_slot);
|
||||||
|
|
||||||
if (crypt_keyslot_status(cd, opt_key_slot) == CRYPT_SLOT_ACTIVE_LAST &&
|
if (crypt_keyslot_status(cd, opt_key_slot) == CRYPT_SLOT_ACTIVE_LAST &&
|
||||||
!_yesDialog(_("This is the last keyslot. "
|
!yesDialog(_("This is the last keyslot. "
|
||||||
"Device will become unusable after purging this key."),
|
"Device will become unusable after purging this key."),
|
||||||
NULL)) {
|
NULL)) {
|
||||||
r = -EPERM;
|
r = -EPERM;
|
||||||
@@ -838,7 +688,7 @@ static int action_luksAddKey(int arg __attribute__((unused)))
|
|||||||
if ((r = crypt_init(&cd, uuid_or_device(action_argv[0]))))
|
if ((r = crypt_init(&cd, uuid_or_device(action_argv[0]))))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
crypt_set_confirm_callback(cd, _yesDialog, NULL);
|
crypt_set_confirm_callback(cd, yesDialog, NULL);
|
||||||
|
|
||||||
if ((r = crypt_load(cd, CRYPT_LUKS1, NULL)))
|
if ((r = crypt_load(cd, CRYPT_LUKS1, NULL)))
|
||||||
goto out;
|
goto out;
|
||||||
@@ -977,7 +827,7 @@ static int action_isLuks(int arg __attribute__((unused)))
|
|||||||
if ((r = crypt_init(&cd, action_argv[0])))
|
if ((r = crypt_init(&cd, action_argv[0])))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
crypt_set_log_callback(cd, _quiet_log, NULL);
|
crypt_set_log_callback(cd, quiet_log, NULL);
|
||||||
r = crypt_load(cd, CRYPT_LUKS1, NULL);
|
r = crypt_load(cd, CRYPT_LUKS1, NULL);
|
||||||
out:
|
out:
|
||||||
crypt_free(cd);
|
crypt_free(cd);
|
||||||
@@ -993,7 +843,7 @@ static int action_luksUUID(int arg __attribute__((unused)))
|
|||||||
if ((r = crypt_init(&cd, action_argv[0])))
|
if ((r = crypt_init(&cd, action_argv[0])))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
crypt_set_confirm_callback(cd, _yesDialog, NULL);
|
crypt_set_confirm_callback(cd, yesDialog, NULL);
|
||||||
|
|
||||||
if ((r = crypt_load(cd, CRYPT_LUKS1, NULL)))
|
if ((r = crypt_load(cd, CRYPT_LUKS1, NULL)))
|
||||||
goto out;
|
goto out;
|
||||||
@@ -1018,8 +868,8 @@ static int luksDump_with_volume_key(struct crypt_device *cd)
|
|||||||
unsigned i;
|
unsigned i;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
crypt_set_confirm_callback(cd, _yesDialog, NULL);
|
crypt_set_confirm_callback(cd, yesDialog, NULL);
|
||||||
if (!_yesDialog(
|
if (!yesDialog(
|
||||||
_("LUKS header dump with volume key is sensitive information\n"
|
_("LUKS header dump with volume key is sensitive information\n"
|
||||||
"which allows access to encrypted partition without passphrase.\n"
|
"which allows access to encrypted partition without passphrase.\n"
|
||||||
"This dump should be always stored encrypted on safe place."),
|
"This dump should be always stored encrypted on safe place."),
|
||||||
@@ -1132,7 +982,7 @@ static int action_luksBackup(int arg __attribute__((unused)))
|
|||||||
if ((r = crypt_init(&cd, uuid_or_device(action_argv[0]))))
|
if ((r = crypt_init(&cd, uuid_or_device(action_argv[0]))))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
crypt_set_confirm_callback(cd, _yesDialog, NULL);
|
crypt_set_confirm_callback(cd, yesDialog, NULL);
|
||||||
|
|
||||||
r = crypt_header_backup(cd, CRYPT_LUKS1, opt_header_backup_file);
|
r = crypt_header_backup(cd, CRYPT_LUKS1, opt_header_backup_file);
|
||||||
out:
|
out:
|
||||||
@@ -1153,24 +1003,13 @@ static int action_luksRestore(int arg __attribute__((unused)))
|
|||||||
if ((r = crypt_init(&cd, action_argv[0])))
|
if ((r = crypt_init(&cd, action_argv[0])))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
crypt_set_confirm_callback(cd, _yesDialog, NULL);
|
crypt_set_confirm_callback(cd, yesDialog, NULL);
|
||||||
r = crypt_header_restore(cd, CRYPT_LUKS1, opt_header_backup_file);
|
r = crypt_header_restore(cd, CRYPT_LUKS1, opt_header_backup_file);
|
||||||
out:
|
out:
|
||||||
crypt_free(cd);
|
crypt_free(cd);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __attribute__ ((noreturn)) void usage(poptContext popt_context,
|
|
||||||
int exitcode, const char *error,
|
|
||||||
const char *more)
|
|
||||||
{
|
|
||||||
poptPrintUsage(popt_context, stderr, 0);
|
|
||||||
if (error)
|
|
||||||
log_err("%s: %s\n", more, error);
|
|
||||||
poptFreeContext(popt_context);
|
|
||||||
exit(exitcode);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void help(poptContext popt_context,
|
static void help(poptContext popt_context,
|
||||||
enum poptCallbackReason reason __attribute__((unused)),
|
enum poptCallbackReason reason __attribute__((unused)),
|
||||||
struct poptOption *key,
|
struct poptOption *key,
|
||||||
@@ -1215,19 +1054,6 @@ static void help(poptContext popt_context,
|
|||||||
usage(popt_context, EXIT_SUCCESS, NULL, NULL);
|
usage(popt_context, EXIT_SUCCESS, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _dbg_version_and_cmd(int argc, const char **argv)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
log_std("# %s %s processing \"", PACKAGE_NAME, PACKAGE_VERSION);
|
|
||||||
for (i = 0; i < argc; i++) {
|
|
||||||
if (i)
|
|
||||||
log_std(" ");
|
|
||||||
log_std("%s", argv[i]);
|
|
||||||
}
|
|
||||||
log_std("\"\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static int run_action(struct action_type *action)
|
static int run_action(struct action_type *action)
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
@@ -1247,22 +1073,7 @@ static int run_action(struct action_type *action)
|
|||||||
r = 0;
|
r = 0;
|
||||||
|
|
||||||
show_status(r);
|
show_status(r);
|
||||||
|
return translate_errno(r);
|
||||||
/* Translate exit code to simple codes */
|
|
||||||
switch (r) {
|
|
||||||
case 0: r = EXIT_SUCCESS; break;
|
|
||||||
case -EEXIST:
|
|
||||||
case -EBUSY: r = 5; break;
|
|
||||||
case -ENOTBLK:
|
|
||||||
case -ENODEV: r = 4; break;
|
|
||||||
case -ENOMEM: r = 3; break;
|
|
||||||
case -EPERM: r = 2; break;
|
|
||||||
case -EINVAL:
|
|
||||||
case -ENOENT:
|
|
||||||
case -ENOSYS:
|
|
||||||
default: r = EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
return r;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, const char **argv)
|
int main(int argc, const char **argv)
|
||||||
@@ -1316,7 +1127,7 @@ int main(int argc, const char **argv)
|
|||||||
int r;
|
int r;
|
||||||
const char *null_action_argv[] = {NULL};
|
const char *null_action_argv[] = {NULL};
|
||||||
|
|
||||||
crypt_set_log_callback(NULL, _log, NULL);
|
crypt_set_log_callback(NULL, tool_log, NULL);
|
||||||
|
|
||||||
setlocale(LC_ALL, "");
|
setlocale(LC_ALL, "");
|
||||||
bindtextdomain(PACKAGE, LOCALEDIR);
|
bindtextdomain(PACKAGE, LOCALEDIR);
|
||||||
@@ -1478,7 +1289,7 @@ int main(int argc, const char **argv)
|
|||||||
if (opt_debug) {
|
if (opt_debug) {
|
||||||
opt_verbose = 1;
|
opt_verbose = 1;
|
||||||
crypt_set_debug_level(-1);
|
crypt_set_debug_level(-1);
|
||||||
_dbg_version_and_cmd(argc, argv);
|
dbg_version_and_cmd(argc, argv);
|
||||||
}
|
}
|
||||||
|
|
||||||
r = run_action(action);
|
r = run_action(action);
|
||||||
|
|||||||
@@ -22,8 +22,25 @@
|
|||||||
#ifndef CRYPTSETUP_H
|
#ifndef CRYPTSETUP_H
|
||||||
#define CRYPTSETUP_H
|
#define CRYPTSETUP_H
|
||||||
|
|
||||||
|
#define _LARGEFILE64_SOURCE
|
||||||
|
#define _FILE_OFFSET_BITS 64
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <popt.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
#include "lib/nls.h"
|
#include "lib/nls.h"
|
||||||
#include "lib/utils_crypt.h"
|
#include "lib/utils_crypt.h"
|
||||||
#include "lib/utils_loop.h"
|
#include "lib/utils_loop.h"
|
||||||
@@ -32,9 +49,28 @@
|
|||||||
#include "libcryptsetup.h"
|
#include "libcryptsetup.h"
|
||||||
|
|
||||||
#define CONST_CAST(x) (x)(uintptr_t)
|
#define CONST_CAST(x) (x)(uintptr_t)
|
||||||
|
|
||||||
#define DEFAULT_CIPHER(type) (DEFAULT_##type##_CIPHER "-" DEFAULT_##type##_MODE)
|
#define DEFAULT_CIPHER(type) (DEFAULT_##type##_CIPHER "-" DEFAULT_##type##_MODE)
|
||||||
|
#define SECTOR_SIZE 512
|
||||||
|
#define ROUND_SECTOR(x) (((x) + SECTOR_SIZE - 1) / SECTOR_SIZE)
|
||||||
|
|
||||||
|
extern int opt_debug;
|
||||||
|
extern int opt_verbose;
|
||||||
|
extern int opt_batch_mode;
|
||||||
|
|
||||||
|
/* Common tools */
|
||||||
|
void clogger(struct crypt_device *cd, int level, const char *file, int line,
|
||||||
|
const char *format, ...);
|
||||||
|
void tool_log(int level, const char *msg, void *usrptr __attribute__((unused)));
|
||||||
|
void quiet_log(int level, const char *msg, void *usrptr);
|
||||||
|
|
||||||
|
int yesDialog(const char *msg, void *usrptr __attribute__((unused)));
|
||||||
|
void show_status(int errcode);
|
||||||
|
const char *uuid_or_device(const char *spec);
|
||||||
|
void usage(poptContext popt_context, int exitcode, const char *error, const char *more);
|
||||||
|
void dbg_version_and_cmd(int argc, const char **argv);
|
||||||
|
int translate_errno(int r);
|
||||||
|
|
||||||
|
/* Log */
|
||||||
#define log_dbg(x...) clogger(NULL, CRYPT_LOG_DEBUG, __FILE__, __LINE__, x)
|
#define log_dbg(x...) clogger(NULL, CRYPT_LOG_DEBUG, __FILE__, __LINE__, x)
|
||||||
#define log_std(x...) clogger(NULL, CRYPT_LOG_NORMAL, __FILE__, __LINE__, x)
|
#define log_std(x...) clogger(NULL, CRYPT_LOG_NORMAL, __FILE__, __LINE__, x)
|
||||||
#define log_verbose(x...) clogger(NULL, CRYPT_LOG_VERBOSE, __FILE__, __LINE__, x)
|
#define log_verbose(x...) clogger(NULL, CRYPT_LOG_VERBOSE, __FILE__, __LINE__, x)
|
||||||
|
|||||||
@@ -18,43 +18,24 @@
|
|||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define PACKAGE_REENC "crypt_reencrypt"
|
#include "cryptsetup.h"
|
||||||
|
|
||||||
#define _LARGEFILE64_SOURCE
|
|
||||||
#define _FILE_OFFSET_BITS 64
|
|
||||||
#define SECTOR_SIZE 512
|
|
||||||
#define ROUND_SECTOR(x) (((x) + SECTOR_SIZE - 1) / SECTOR_SIZE)
|
|
||||||
#define NO_UUID "cafecafe-cafe-cafe-cafe-cafecafeeeee"
|
|
||||||
#define MAX_BCK_SECTORS 8192
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <inttypes.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <fcntl.h>
|
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <popt.h>
|
|
||||||
|
|
||||||
#include "cryptsetup.h"
|
#define PACKAGE_REENC "crypt_reencrypt"
|
||||||
|
|
||||||
|
#define NO_UUID "cafecafe-cafe-cafe-cafe-cafecafeeeee"
|
||||||
|
#define MAX_BCK_SECTORS 8192
|
||||||
|
|
||||||
static int opt_verbose = 0;
|
|
||||||
static int opt_debug = 0;
|
|
||||||
static const char *opt_cipher = NULL;
|
static const char *opt_cipher = NULL;
|
||||||
static const char *opt_hash = NULL;
|
static const char *opt_hash = NULL;
|
||||||
static const char *opt_key_file = NULL;
|
static const char *opt_key_file = NULL;
|
||||||
static long opt_keyfile_size = 0;
|
static long opt_keyfile_size = 0;
|
||||||
static long opt_keyfile_offset = 0;
|
static long opt_keyfile_offset = 0;
|
||||||
static int opt_iteration_time = 1000;
|
static int opt_iteration_time = 1000;
|
||||||
static int opt_batch_mode = 0;
|
|
||||||
static int opt_version_mode = 0;
|
static int opt_version_mode = 0;
|
||||||
static int opt_random = 0;
|
static int opt_random = 0;
|
||||||
static int opt_urandom = 0;
|
static int opt_urandom = 0;
|
||||||
@@ -119,55 +100,11 @@ typedef enum {
|
|||||||
CHECK_OPEN,
|
CHECK_OPEN,
|
||||||
} header_magic;
|
} header_magic;
|
||||||
|
|
||||||
__attribute__((format(printf, 5, 6)))
|
|
||||||
static void clogger(struct crypt_device *cd, int level, const char *file,
|
|
||||||
int line, const char *format, ...)
|
|
||||||
{
|
|
||||||
va_list argp;
|
|
||||||
char *target = NULL;
|
|
||||||
|
|
||||||
va_start(argp, format);
|
|
||||||
|
|
||||||
if (vasprintf(&target, format, argp) > 0) {
|
|
||||||
if (level >= 0) {
|
|
||||||
crypt_log(cd, level, target);
|
|
||||||
} else if (opt_debug)
|
|
||||||
printf("# %s\n", target);
|
|
||||||
}
|
|
||||||
|
|
||||||
va_end(argp);
|
|
||||||
free(target);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void _log(int level, const char *msg, void *usrptr __attribute__((unused)))
|
|
||||||
{
|
|
||||||
switch(level) {
|
|
||||||
|
|
||||||
case CRYPT_LOG_NORMAL:
|
|
||||||
fputs(msg, stdout);
|
|
||||||
break;
|
|
||||||
case CRYPT_LOG_VERBOSE:
|
|
||||||
if (opt_verbose)
|
|
||||||
fputs(msg, stdout);
|
|
||||||
break;
|
|
||||||
case CRYPT_LOG_ERROR:
|
|
||||||
fputs(msg, stderr);
|
|
||||||
break;
|
|
||||||
case CRYPT_LOG_DEBUG:
|
|
||||||
if (opt_debug)
|
|
||||||
printf("# %s\n", msg);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(stderr, "Internal error on logging class for msg: %s", msg);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void _quiet_log(int level, const char *msg, void *usrptr)
|
static void _quiet_log(int level, const char *msg, void *usrptr)
|
||||||
{
|
{
|
||||||
if (!opt_debug)
|
if (!opt_debug)
|
||||||
return;
|
return;
|
||||||
_log(level, msg, usrptr);
|
tool_log(level, msg, usrptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void int_handler(int sig __attribute__((__unused__)))
|
static void int_handler(int sig __attribute__((__unused__)))
|
||||||
@@ -1175,17 +1112,6 @@ out:
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __attribute__ ((noreturn)) void usage(poptContext popt_context,
|
|
||||||
int exitcode, const char *error,
|
|
||||||
const char *more)
|
|
||||||
{
|
|
||||||
poptPrintUsage(popt_context, stderr, 0);
|
|
||||||
if (error)
|
|
||||||
log_err("%s: %s\n", more, error);
|
|
||||||
poptFreeContext(popt_context);
|
|
||||||
exit(exitcode);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void help(poptContext popt_context,
|
static void help(poptContext popt_context,
|
||||||
enum poptCallbackReason reason __attribute__((unused)),
|
enum poptCallbackReason reason __attribute__((unused)),
|
||||||
struct poptOption *key,
|
struct poptOption *key,
|
||||||
@@ -1200,19 +1126,6 @@ static void help(poptContext popt_context,
|
|||||||
usage(popt_context, EXIT_SUCCESS, NULL, NULL);
|
usage(popt_context, EXIT_SUCCESS, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _dbg_version_and_cmd(int argc, const char **argv)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
log_std("# %s %s processing \"", PACKAGE_REENC, PACKAGE_VERSION);
|
|
||||||
for (i = 0; i < argc; i++) {
|
|
||||||
if (i)
|
|
||||||
log_std(" ");
|
|
||||||
log_std("%s", argv[i]);
|
|
||||||
}
|
|
||||||
log_std("\"\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, const char **argv)
|
int main(int argc, const char **argv)
|
||||||
{
|
{
|
||||||
static struct poptOption popt_help_options[] = {
|
static struct poptOption popt_help_options[] = {
|
||||||
@@ -1250,7 +1163,7 @@ int main(int argc, const char **argv)
|
|||||||
poptContext popt_context;
|
poptContext popt_context;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
crypt_set_log_callback(NULL, _log, NULL);
|
crypt_set_log_callback(NULL, tool_log, NULL);
|
||||||
|
|
||||||
set_int_block(1);
|
set_int_block(1);
|
||||||
|
|
||||||
@@ -1338,23 +1251,12 @@ int main(int argc, const char **argv)
|
|||||||
if (opt_debug) {
|
if (opt_debug) {
|
||||||
opt_verbose = 1;
|
opt_verbose = 1;
|
||||||
crypt_set_debug_level(-1);
|
crypt_set_debug_level(-1);
|
||||||
_dbg_version_and_cmd(argc, argv);
|
dbg_version_and_cmd(argc, argv);
|
||||||
}
|
}
|
||||||
|
|
||||||
r = run_reencrypt(action_argv[0]);
|
r = run_reencrypt(action_argv[0]);
|
||||||
|
|
||||||
poptFreeContext(popt_context);
|
poptFreeContext(popt_context);
|
||||||
|
|
||||||
/* Translate exit code to simple codes */
|
return translate_errno(r);
|
||||||
switch (r) {
|
|
||||||
case 0: r = EXIT_SUCCESS; break;
|
|
||||||
case -EEXIST:
|
|
||||||
case -EBUSY: r = 5; break;
|
|
||||||
case -ENOTBLK:
|
|
||||||
case -ENODEV: r = 4; break;
|
|
||||||
case -ENOMEM: r = 3; break;
|
|
||||||
case -EPERM: r = 2; break;
|
|
||||||
default: r = EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
return r;
|
|
||||||
}
|
}
|
||||||
|
|||||||
201
src/utils_tools.c
Normal file
201
src/utils_tools.c
Normal file
@@ -0,0 +1,201 @@
|
|||||||
|
/*
|
||||||
|
* cryptsetup - setup cryptographic volumes for dm-crypt
|
||||||
|
*
|
||||||
|
* Copyright (C) 2004, Christophe Saout <christophe@saout.de>
|
||||||
|
* Copyright (C) 2004-2007, Clemens Fruhwirth <clemens@endorphin.org>
|
||||||
|
* Copyright (C) 2009-2012, Red Hat, Inc. All rights reserved.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* version 2 as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "cryptsetup.h"
|
||||||
|
|
||||||
|
int opt_verbose = 0;
|
||||||
|
int opt_debug = 0;
|
||||||
|
int opt_batch_mode = 0;
|
||||||
|
|
||||||
|
__attribute__((format(printf, 5, 6)))
|
||||||
|
void clogger(struct crypt_device *cd, int level, const char *file, int line,
|
||||||
|
const char *format, ...)
|
||||||
|
{
|
||||||
|
va_list argp;
|
||||||
|
char *target = NULL;
|
||||||
|
|
||||||
|
va_start(argp, format);
|
||||||
|
|
||||||
|
if (vasprintf(&target, format, argp) > 0) {
|
||||||
|
if (level >= 0) {
|
||||||
|
crypt_log(cd, level, target);
|
||||||
|
#ifdef CRYPT_DEBUG
|
||||||
|
} else if (opt_debug)
|
||||||
|
printf("# %s:%d %s\n", file ?: "?", line, target);
|
||||||
|
#else
|
||||||
|
} else if (opt_debug)
|
||||||
|
printf("# %s\n", target);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
va_end(argp);
|
||||||
|
free(target);
|
||||||
|
}
|
||||||
|
|
||||||
|
void tool_log(int level, const char *msg, void *usrptr __attribute__((unused)))
|
||||||
|
{
|
||||||
|
switch(level) {
|
||||||
|
|
||||||
|
case CRYPT_LOG_NORMAL:
|
||||||
|
fputs(msg, stdout);
|
||||||
|
break;
|
||||||
|
case CRYPT_LOG_VERBOSE:
|
||||||
|
if (opt_verbose)
|
||||||
|
fputs(msg, stdout);
|
||||||
|
break;
|
||||||
|
case CRYPT_LOG_ERROR:
|
||||||
|
fputs(msg, stderr);
|
||||||
|
break;
|
||||||
|
case CRYPT_LOG_DEBUG:
|
||||||
|
if (opt_debug)
|
||||||
|
printf("# %s\n", msg);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "Internal error on logging class for msg: %s", msg);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void quiet_log(int level, const char *msg, void *usrptr)
|
||||||
|
{
|
||||||
|
if (!opt_verbose && (level == CRYPT_LOG_ERROR || level == CRYPT_LOG_NORMAL))
|
||||||
|
level = CRYPT_LOG_VERBOSE;
|
||||||
|
tool_log(level, msg, usrptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
int yesDialog(const char *msg, void *usrptr __attribute__((unused)))
|
||||||
|
{
|
||||||
|
char *answer = NULL;
|
||||||
|
size_t size = 0;
|
||||||
|
int r = 1;
|
||||||
|
|
||||||
|
if(isatty(STDIN_FILENO) && !opt_batch_mode) {
|
||||||
|
log_std("\nWARNING!\n========\n");
|
||||||
|
log_std("%s\n\nAre you sure? (Type uppercase yes): ", msg);
|
||||||
|
if(getline(&answer, &size, stdin) == -1) {
|
||||||
|
perror("getline");
|
||||||
|
free(answer);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if(strcmp(answer, "YES\n"))
|
||||||
|
r = 0;
|
||||||
|
free(answer);
|
||||||
|
}
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
void show_status(int errcode)
|
||||||
|
{
|
||||||
|
char error[256], *error_;
|
||||||
|
|
||||||
|
if(!opt_verbose)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(!errcode) {
|
||||||
|
log_std(_("Command successful.\n"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
crypt_get_error(error, sizeof(error));
|
||||||
|
|
||||||
|
if (!error[0]) {
|
||||||
|
error_ = strerror_r(-errcode, error, sizeof(error));
|
||||||
|
if (error_ != error) {
|
||||||
|
strncpy(error, error_, sizeof(error));
|
||||||
|
error[sizeof(error) - 1] = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log_err(_("Command failed with code %i"), -errcode);
|
||||||
|
if (*error)
|
||||||
|
log_err(": %s\n", error);
|
||||||
|
else
|
||||||
|
log_err(".\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *uuid_or_device(const char *spec)
|
||||||
|
{
|
||||||
|
static char device[PATH_MAX];
|
||||||
|
char s, *ptr;
|
||||||
|
int i = 0, uuid_len = 5;
|
||||||
|
|
||||||
|
/* Check if it is correct UUID=<LUKS_UUID> format */
|
||||||
|
if (spec && !strncmp(spec, "UUID=", uuid_len)) {
|
||||||
|
strcpy(device, "/dev/disk/by-uuid/");
|
||||||
|
ptr = &device[strlen(device)];
|
||||||
|
i = uuid_len;
|
||||||
|
while ((s = spec[i++]) && i < PATH_MAX) {
|
||||||
|
if (!isxdigit(s) && s != '-')
|
||||||
|
return spec; /* Bail it out */
|
||||||
|
if (isalpha(s))
|
||||||
|
s = tolower(s);
|
||||||
|
*ptr++ = s;
|
||||||
|
}
|
||||||
|
*ptr = '\0';
|
||||||
|
return device;
|
||||||
|
}
|
||||||
|
|
||||||
|
return spec;
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__ ((noreturn)) void usage(poptContext popt_context,
|
||||||
|
int exitcode, const char *error,
|
||||||
|
const char *more)
|
||||||
|
{
|
||||||
|
poptPrintUsage(popt_context, stderr, 0);
|
||||||
|
if (error)
|
||||||
|
log_err("%s: %s\n", more, error);
|
||||||
|
poptFreeContext(popt_context);
|
||||||
|
exit(exitcode);
|
||||||
|
}
|
||||||
|
|
||||||
|
void dbg_version_and_cmd(int argc, const char **argv)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
log_std("# %s %s processing \"", PACKAGE_NAME, PACKAGE_VERSION);
|
||||||
|
for (i = 0; i < argc; i++) {
|
||||||
|
if (i)
|
||||||
|
log_std(" ");
|
||||||
|
log_std("%s", argv[i]);
|
||||||
|
}
|
||||||
|
log_std("\"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Translate exit code to simple codes */
|
||||||
|
int translate_errno(int r)
|
||||||
|
{
|
||||||
|
switch (r) {
|
||||||
|
case 0: r = EXIT_SUCCESS; break;
|
||||||
|
case -EEXIST:
|
||||||
|
case -EBUSY: r = 5; break;
|
||||||
|
case -ENOTBLK:
|
||||||
|
case -ENODEV: r = 4; break;
|
||||||
|
case -ENOMEM: r = 3; break;
|
||||||
|
case -EPERM: r = 2; break;
|
||||||
|
case -EINVAL:
|
||||||
|
case -ENOENT:
|
||||||
|
case -ENOSYS:
|
||||||
|
default: r = EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
return r;
|
||||||
|
}
|
||||||
@@ -17,19 +17,6 @@
|
|||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <inttypes.h>
|
|
||||||
#include <popt.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
|
|
||||||
#include "cryptsetup.h"
|
#include "cryptsetup.h"
|
||||||
|
|
||||||
#define PACKAGE_VERITY "veritysetup"
|
#define PACKAGE_VERITY "veritysetup"
|
||||||
@@ -45,62 +32,11 @@ static const char *salt_string = NULL;
|
|||||||
static uint64_t hash_offset = 0;
|
static uint64_t hash_offset = 0;
|
||||||
static const char *opt_uuid = NULL;
|
static const char *opt_uuid = NULL;
|
||||||
|
|
||||||
static int opt_verbose = 0;
|
|
||||||
static int opt_debug = 0;
|
|
||||||
static int opt_version_mode = 0;
|
static int opt_version_mode = 0;
|
||||||
|
|
||||||
static const char **action_argv;
|
static const char **action_argv;
|
||||||
static int action_argc;
|
static int action_argc;
|
||||||
|
|
||||||
__attribute__((format(printf, 5, 6)))
|
|
||||||
static void clogger(struct crypt_device *cd, int level, const char *file,
|
|
||||||
int line, const char *format, ...)
|
|
||||||
{
|
|
||||||
va_list argp;
|
|
||||||
char *target = NULL;
|
|
||||||
|
|
||||||
va_start(argp, format);
|
|
||||||
|
|
||||||
if (vasprintf(&target, format, argp) > 0) {
|
|
||||||
if (level >= 0) {
|
|
||||||
crypt_log(cd, level, target);
|
|
||||||
#ifdef CRYPT_DEBUG
|
|
||||||
} else if (opt_debug)
|
|
||||||
printf("# %s:%d %s\n", file ?: "?", line, target);
|
|
||||||
#else
|
|
||||||
} else if (opt_debug)
|
|
||||||
printf("# %s\n", target);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
va_end(argp);
|
|
||||||
free(target);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void _log(int level, const char *msg, void *usrptr __attribute__((unused)))
|
|
||||||
{
|
|
||||||
switch(level) {
|
|
||||||
|
|
||||||
case CRYPT_LOG_NORMAL:
|
|
||||||
fputs(msg, stdout);
|
|
||||||
break;
|
|
||||||
case CRYPT_LOG_VERBOSE:
|
|
||||||
if (opt_verbose)
|
|
||||||
fputs(msg, stdout);
|
|
||||||
break;
|
|
||||||
case CRYPT_LOG_ERROR:
|
|
||||||
fputs(msg, stderr);
|
|
||||||
break;
|
|
||||||
case CRYPT_LOG_DEBUG:
|
|
||||||
if (opt_debug)
|
|
||||||
printf("# %s\n", msg);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(stderr, "Internal error on logging class for msg: %s", msg);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int _prepare_format(struct crypt_params_verity *params,
|
static int _prepare_format(struct crypt_params_verity *params,
|
||||||
const char *data_device,
|
const char *data_device,
|
||||||
uint32_t flags)
|
uint32_t flags)
|
||||||
@@ -362,30 +298,6 @@ static int action_dump(int arg)
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __attribute__ ((noreturn)) void usage(poptContext popt_context,
|
|
||||||
int exitcode, const char *error,
|
|
||||||
const char *more)
|
|
||||||
{
|
|
||||||
poptPrintUsage(popt_context, stderr, 0);
|
|
||||||
if (error)
|
|
||||||
log_err("%s: %s\n", more, error);
|
|
||||||
poptFreeContext(popt_context);
|
|
||||||
exit(exitcode);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void _dbg_version_and_cmd(int argc, const char **argv)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
log_std("# %s %s processing \"", PACKAGE_VERITY, PACKAGE_VERSION);
|
|
||||||
for (i = 0; i < argc; i++) {
|
|
||||||
if (i)
|
|
||||||
log_std(" ");
|
|
||||||
log_std("%s", argv[i]);
|
|
||||||
}
|
|
||||||
log_std("\"\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct action_type {
|
static struct action_type {
|
||||||
const char *type;
|
const char *type;
|
||||||
int (*handler)(int);
|
int (*handler)(int);
|
||||||
@@ -435,35 +347,6 @@ static void help(poptContext popt_context,
|
|||||||
usage(popt_context, EXIT_SUCCESS, NULL, NULL);
|
usage(popt_context, EXIT_SUCCESS, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void show_status(int errcode)
|
|
||||||
{
|
|
||||||
char error[256], *error_;
|
|
||||||
|
|
||||||
if(!opt_verbose)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if(!errcode) {
|
|
||||||
log_std(_("Command successful.\n"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
crypt_get_error(error, sizeof(error));
|
|
||||||
|
|
||||||
if (!error[0]) {
|
|
||||||
error_ = strerror_r(-errcode, error, sizeof(error));
|
|
||||||
if (error_ != error) {
|
|
||||||
strncpy(error, error_, sizeof(error));
|
|
||||||
error[sizeof(error) - 1] = '\0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
log_err(_("Command failed with code %i"), -errcode);
|
|
||||||
if (*error)
|
|
||||||
log_err(": %s\n", error);
|
|
||||||
else
|
|
||||||
log_err(".\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static int run_action(struct action_type *action)
|
static int run_action(struct action_type *action)
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
@@ -473,22 +356,7 @@ static int run_action(struct action_type *action)
|
|||||||
r = action->handler(0);
|
r = action->handler(0);
|
||||||
|
|
||||||
show_status(r);
|
show_status(r);
|
||||||
|
return translate_errno(r);
|
||||||
/* Translate exit code to simple codes */
|
|
||||||
switch (r) {
|
|
||||||
case 0: r = EXIT_SUCCESS; break;
|
|
||||||
case -EEXIST:
|
|
||||||
case -EBUSY: r = 5; break;
|
|
||||||
case -ENOTBLK:
|
|
||||||
case -ENODEV: r = 4; break;
|
|
||||||
case -ENOMEM: r = 3; break;
|
|
||||||
case -EPERM: r = 2; break;
|
|
||||||
case -EINVAL:
|
|
||||||
case -ENOENT:
|
|
||||||
case -ENOSYS:
|
|
||||||
default: r = EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
return r;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, const char **argv)
|
int main(int argc, const char **argv)
|
||||||
@@ -523,7 +391,7 @@ int main(int argc, const char **argv)
|
|||||||
const char *aname;
|
const char *aname;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
crypt_set_log_callback(NULL, _log, NULL);
|
crypt_set_log_callback(NULL, tool_log, NULL);
|
||||||
|
|
||||||
setlocale(LC_ALL, "");
|
setlocale(LC_ALL, "");
|
||||||
bindtextdomain(PACKAGE, LOCALEDIR);
|
bindtextdomain(PACKAGE, LOCALEDIR);
|
||||||
@@ -603,7 +471,7 @@ int main(int argc, const char **argv)
|
|||||||
if (opt_debug) {
|
if (opt_debug) {
|
||||||
opt_verbose = 1;
|
opt_verbose = 1;
|
||||||
crypt_set_debug_level(-1);
|
crypt_set_debug_level(-1);
|
||||||
_dbg_version_and_cmd(argc, argv);
|
dbg_version_and_cmd(argc, argv);
|
||||||
}
|
}
|
||||||
|
|
||||||
r = run_action(action);
|
r = run_action(action);
|
||||||
|
|||||||
Reference in New Issue
Block a user