#define DEFAULT_DISK_ALIGNMENT 1048576 /* 1MiB */
#define DEFAULT_MEM_ALIGNMENT 4096
-/* private struct crypt_options flags */
-
-#define CRYPT_FLAG_FREE_DEVICE (1 << 24)
-#define CRYPT_FLAG_FREE_CIPHER (1 << 25)
-
-#define CRYPT_FLAG_PRIVATE_MASK ((unsigned int)-1 << 24)
-
#define at_least(a, b) ({ __typeof__(a) __at_least = (a); (__at_least >= (b))?__at_least:(b); })
struct crypt_device;
int crypt_confirm(struct crypt_device *cd, const char *msg);
-void set_error_va(const char *fmt, va_list va);
-void set_error(const char *fmt, ...);
-const char *get_error(void);
-
char *crypt_lookup_dev(const char *dev_id);
int crypt_sysfs_check_crypt_segment(const char *device, uint64_t offset, uint64_t size);
int crypt_sysfs_get_rotational(int major, int minor, int *rotational);
#define log_dbg(x...) logger(NULL, CRYPT_LOG_DEBUG, __FILE__, __LINE__, x)
#define log_std(c, x...) logger(c, CRYPT_LOG_NORMAL, __FILE__, __LINE__, x)
#define log_verbose(c, x...) logger(c, CRYPT_LOG_VERBOSE, __FILE__, __LINE__, x)
-#define log_err(c, x...) do { \
- logger(c, CRYPT_LOG_ERROR, __FILE__, __LINE__, x); \
- set_error(x); } while(0)
+#define log_err(c, x...) logger(c, CRYPT_LOG_ERROR, __FILE__, __LINE__, x)
int crypt_get_debug_level(void);
void debug_processes_using_device(const char *name);
struct dm_task *dmt = NULL;
struct dm_info dmi;
char *params = NULL;
- char *error = NULL;
char dev_uuid[DM_UUID_LEN] = {0};
int r = -EINVAL;
uint32_t read_ahead = 0;
cookie = 0;
}
- if (r < 0 && !reload) {
- if (get_error())
- error = strdup(get_error());
-
+ if (r < 0 && !reload)
dm_remove_device(name, 0, 0);
- if (error) {
- set_error(error);
- free(error);
- }
- }
-
out_no_removal:
if (cookie && _dm_use_udev())
(void)_dm_udev_wait(cookie);
buffer_size = hdr_file.payloadOffset << SECTOR_SHIFT;
if (r || buffer_size < LUKS_ALIGN_KEYSLOTS) {
- log_err(ctx, _("Backup file do not contain valid LUKS header.\n"));
+ log_err(ctx, _("Backup file doesn't contain valid LUKS header.\n"));
r = -EINVAL;
goto out;
}
close(devfd);
/* Be sure to reload new data */
- r = LUKS_read_phdr(device, hdr, 0, ctx);
+ r = LUKS_read_phdr(device, hdr, 1, ctx);
out:
if (devfd != -1)
close(devfd);
log_dbg("LUKS header not detected.");
if (require_luks_device)
log_err(ctx, _("Device %s is not a valid LUKS device.\n"), device);
- else
- set_error(_("Device %s is not a valid LUKS device."), device);
r = -EINVAL;
} else if((hdr->version = ntohs(hdr->version)) != 1) { /* Convert every uint16/32_t item from network byte order */
log_err(ctx, _("Unsupported LUKS version %d.\n"), hdr->version);
hdr->keyblock[keyIndex].keyMaterialOffset,
ctx);
if (r < 0) {
- if(!get_error())
- log_err(ctx, _("Failed to write to key storage.\n"));
+ log_err(ctx, _("Failed to write to key storage.\n"));
goto out;
}
void *password_usrptr;
};
+/* Global error */
+/* FIXME: not thread safe, remove this later */
+static char global_error[512] = {0};
+
/* Log helper */
static void (*_default_log)(int level, const char *msg, void *usrptr) = NULL;
static int _debug_level = 0;
return _debug_level;
}
+
void crypt_log(struct crypt_device *cd, int level, const char *msg)
{
if (cd && cd->log)
_default_log(level, msg, NULL);
}
+/* Set global error, ugly hack... */
+void set_global_error(const char *error)
+{
+ size_t size = strlen(error);
+
+ strncpy(global_error, error, sizeof(global_error) - 2);
+ if (size < sizeof(global_error) && global_error[size - 1] == '\n')
+ global_error[size - 1] = '\0';
+}
+
__attribute__((format(printf, 5, 6)))
void logger(struct crypt_device *cd, int level, const char *file,
int line, const char *format, ...)
va_start(argp, format);
- if (vasprintf(&target, format, argp) > 0) {
+ if (vasprintf(&target, format, argp) > 0 ) {
if (level >= 0) {
crypt_log(cd, level, target);
#ifdef CRYPT_DEBUG
} else if (_debug_level)
printf("# %s\n", target);
#endif
+
+ if (level == CRYPT_LOG_ERROR)
+ set_global_error(target);
}
va_end(argp);
cd->password_usrptr = usrptr;
}
+/* Deprecated global error interface */
void crypt_get_error(char *buf, size_t size)
{
- const char *error = get_error();
-
if (!buf || size < 1)
- set_error(NULL);
- else if (error) {
- strncpy(buf, error, size - 1);
+ global_error[0] = '\0';
+ else if (*global_error) {
+ strncpy(buf, global_error, size - 1);
buf[size - 1] = '\0';
- set_error(NULL);
+ global_error[0] = '\0';
} else
buf[0] = '\0';
}
#include "libcryptsetup.h"
#include "internal.h"
-static char *error=NULL;
-
-__attribute__((format(printf, 1, 0)))
-void set_error_va(const char *fmt, va_list va)
-{
- int r;
-
- if(error) {
- free(error);
- error = NULL;
- }
-
- if(!fmt) return;
-
- r = vasprintf(&error, fmt, va);
- if (r < 0) {
- free(error);
- error = NULL;
- return;
- }
-
- if (r && error[r - 1] == '\n')
- error[r - 1] = '\0';
-}
-
-__attribute__((format(printf, 1, 2)))
-void set_error(const char *fmt, ...)
-{
- va_list va;
-
- va_start(va, fmt);
- set_error_va(fmt, va);
- va_end(va);
-}
-
-const char *get_error(void)
-{
- return error;
-}
-
static int get_alignment(int fd)
{
int alignment = DEFAULT_MEM_ALIGNMENT;