Use common utils_tools.c for all tools.

Unify tool environment and deduplicate code.
This commit is contained in:
Milan Broz
2012-08-13 18:31:26 +02:00
parent 48332d248f
commit ff9db165eb
6 changed files with 271 additions and 450 deletions

View File

@@ -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

View File

@@ -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);

View File

@@ -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)

View File

@@ -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
View 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;
}

View File

@@ -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);