diff options
-rw-r--r-- | nlplug-findfs.c | 83 |
1 files changed, 44 insertions, 39 deletions
diff --git a/nlplug-findfs.c b/nlplug-findfs.c index bd40e25..1abcf21 100644 --- a/nlplug-findfs.c +++ b/nlplug-findfs.c @@ -306,19 +306,25 @@ static int spawn_active(struct spawn_manager *mgr) return mgr->num_running || !list_empty(&mgr->queue); } -struct cryptconf { +struct cryptdev { char *device; char *name; char devnode[256]; }; +struct cryptconf { + struct cryptdev data; + struct cryptdev header; + size_t payload_offset; + pthread_t tid; + pthread_mutex_t mutex; +}; + struct ueventconf { char **program_argv; char *search_device; blkid_cache blkid_cache; - struct cryptconf crypt_data; - struct cryptconf crypt_header; - size_t crypt_payload_offset; + struct cryptconf crypt; char *subsystem_filter; int modalias_count; int fork_count; @@ -336,7 +342,6 @@ struct ueventconf { pthread_cond_t trigger_cond; struct list_head trigger_list; - pthread_mutex_t cryptsetup_mutex; int cryptsetup_running; }; @@ -559,14 +564,14 @@ static void *cryptsetup_thread(void *data) struct crypt_device *cd; int r, passwd_tries = 5; - data_devnode = header_devnode = c->crypt_data.devnode; + data_devnode = header_devnode = c->crypt.data.devnode; - if(c->crypt_header.devnode != NULL && c->crypt_header.devnode[0] != '\0') { + if(c->crypt.header.devnode != NULL && c->crypt.header.devnode[0] != '\0') { params = alloca(sizeof(struct crypt_params_luks1)); memset(params, 0, sizeof(struct crypt_params_luks1)); - params->data_alignment = c->crypt_payload_offset; /* Memset did set that to 0, so default is 0 */ - params->data_device = c->crypt_data.devnode; - header_devnode = c->crypt_header.devnode; + params->data_alignment = c->crypt.payload_offset; /* Memset did set that to 0, so default is 0 */ + params->data_device = c->crypt.data.devnode; + header_devnode = c->crypt.header.devnode; } r = crypt_init(&cd, header_devnode); @@ -584,25 +589,25 @@ static void *cryptsetup_thread(void *data) while (passwd_tries > 0) { char pass[1024]; - printf("Enter passphrase for %s: ", c->crypt_data.devnode); + printf("Enter passphrase for %s: ", c->crypt.data.devnode); fflush(stdout); if (read_pass(pass, sizeof(pass)) < 0) goto free_out; passwd_tries--; - pthread_mutex_lock(&c->cryptsetup_mutex); - r = crypt_activate_by_passphrase(cd, c->crypt_data.name, + pthread_mutex_lock(&c->crypt.mutex); + r = crypt_activate_by_passphrase(cd, c->crypt.data.name, CRYPT_ANY_SLOT, pass, strlen(pass), 0); - pthread_mutex_unlock(&c->cryptsetup_mutex); + pthread_mutex_unlock(&c->crypt.mutex); memset(pass, 0, sizeof(pass)); /* wipe pass after use */ if (r >= 0) goto free_out; printf("No key available with this passphrase.\n"); } - printf("Mounting %s failed, amount of tries exhausted.\n", c->crypt_data.devnode); + printf("Mounting %s failed, amount of tries exhausted.\n", c->crypt.data.devnode); free_out: crypt_free(cd); @@ -626,13 +631,13 @@ static void start_thread(struct ueventconf *conf, void *(*thread_main)(void *)) static void start_cryptsetup(struct ueventconf *conf) { - if(conf->crypt_header.devnode != NULL) { + if(conf->crypt.header.devnode != NULL) { dbg("starting cryptsetup %s -> %s (header: %s)", - conf->crypt_data.devnode, conf->crypt_data.name, - conf->crypt_header.devnode); + conf->crypt.data.devnode, conf->crypt.data.name, + conf->crypt.header.devnode); } else { - dbg("starting cryptsetup %s -> %s", conf->crypt_data.devnode, - conf->crypt_data.name); + dbg("starting cryptsetup %s -> %s", conf->crypt.data.devnode, + conf->crypt.data.name); } load_kmod("dm-crypt", NULL, 0); conf->cryptsetup_running = 1; @@ -1004,27 +1009,27 @@ static void uevent_handle(struct uevent *ev) return; snprintf(ev->devnode, sizeof(ev->devnode), "/dev/%s", ev->devname); - pthread_mutex_lock(&conf->cryptsetup_mutex); + pthread_mutex_lock(&conf->crypt.mutex); found = searchdev(ev, conf->search_device, (conf->apkovls || conf->bootrepos)); - pthread_mutex_unlock(&conf->cryptsetup_mutex); + pthread_mutex_unlock(&conf->crypt.mutex); if (found) { founddev(conf, found); } else { - if (conf->crypt_data.devnode[0] == '\0' && - searchdev(ev, conf->crypt_data.device, 0)) { - strncpy(conf->crypt_data.devnode, - conf->crypt_data.device[0] == '/' ? conf->crypt_data.device : ev->devnode, - sizeof(conf->crypt_data.devnode)); + if (conf->crypt.data.devnode[0] == '\0' && + searchdev(ev, conf->crypt.data.device, 0)) { + strncpy(conf->crypt.data.devnode, + conf->crypt.data.device[0] == '/' ? conf->crypt.data.device : ev->devnode, + sizeof(conf->crypt.data.devnode)); run_now = 1; } - if (conf->crypt_header.devnode[0] == '\0' && - searchdev(ev, conf->crypt_header.device, 0)) { - strncpy(conf->crypt_header.devnode, - conf->crypt_header.device[0] == '/' ? conf->crypt_header.device : ev->devnode, - sizeof(conf->crypt_header.devnode)); + if (conf->crypt.header.devnode[0] == '\0' && + searchdev(ev, conf->crypt.header.device, 0)) { + strncpy(conf->crypt.header.devnode, + conf->crypt.header.device[0] == '/' ? conf->crypt.header.device : ev->devnode, + sizeof(conf->crypt.header.devnode)); run_now = 1; } - if(run_now && conf->crypt_data.devnode != NULL && (conf->crypt_header.device == NULL || conf->crypt_header.devnode != NULL)) + if(run_now && conf->crypt.data.devnode != NULL && (conf->crypt.header.device == NULL || conf->crypt.header.devnode != NULL)) start_cryptsetup(conf); } } @@ -1180,7 +1185,7 @@ int main(int argc, char *argv[]) pthread_mutex_init(&conf.trigger_mutex, NULL); pthread_cond_init(&conf.trigger_cond, NULL); list_init(&conf.trigger_list); - pthread_mutex_init(&conf.cryptsetup_mutex, NULL); + pthread_mutex_init(&conf.crypt.mutex, NULL); conf.program_argv = program_argv; conf.timeout = MAX_EVENT_TIMEOUT; @@ -1202,16 +1207,16 @@ int main(int argc, char *argv[]) conf.bootrepos = EARGF(usage(1)); break; case 'c': - conf.crypt_data.device = EARGF(usage(1)); + conf.crypt.data.device = EARGF(usage(1)); break; case 'H': - conf.crypt_header.device = EARGF(usage(1)); + conf.crypt.header.device = EARGF(usage(1)); break; case 'h': usage(0); break; case 'm': - conf.crypt_data.name = EARGF(usage(1)); + conf.crypt.data.name = EARGF(usage(1)); break; case 'n': not_found_is_ok = 1; @@ -1223,7 +1228,7 @@ int main(int argc, char *argv[]) conf.subsystem_filter = EARGF(usage(1)); break; case 'o': - if(sscanf(EARGF(usage(1)), "%zu", &conf.crypt_payload_offset) != 1) + if(sscanf(EARGF(usage(1)), "%zu", &conf.crypt.payload_offset) != 1) err(1, "sscanf"); break; case 'p': @@ -1342,7 +1347,7 @@ int main(int argc, char *argv[]) } close(fds[2].fd); - pthread_mutex_destroy(&conf.cryptsetup_mutex); + pthread_mutex_destroy(&conf.crypt.mutex); pthread_mutex_destroy(&conf.trigger_mutex); pthread_cond_destroy(&conf.trigger_cond); if (conf.blkid_cache) blkid_put_cache(conf.blkid_cache); |