From 8ab1e3c5da78c05b8edf48d44e6fde046d50e582 Mon Sep 17 00:00:00 2001 From: sinanmohd Date: Sun, 7 Apr 2024 10:08:27 +0530 Subject: util: refactor error reporting --- include/util.h | 6 ++---- src/libnpass/gpg.c | 36 ++++++++++++++++++------------------ src/libnpass/libnpass.c | 42 +++++++++++++++++++++--------------------- src/libnpass/util.c | 4 ++-- src/npass/npass.c | 25 +++++++++++++------------ 5 files changed, 56 insertions(+), 57 deletions(-) diff --git a/include/util.h b/include/util.h index b6c64e0..e19dbe8 100644 --- a/include/util.h +++ b/include/util.h @@ -1,8 +1,6 @@ #include -#define err_die(r, ...) {\ - fprintf(stderr, "%s:%d: ", __FILE__, __LINE__); \ - fprintf(stderr, __VA_ARGS__); \ - fputc('\n', stderr); \ +#define err_ret(r, fmt, ...) {\ + fprintf(stderr, "[%s:%d] " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__); \ return r; \ } diff --git a/src/libnpass/gpg.c b/src/libnpass/gpg.c index 0b90b33..9e3bb7a 100644 --- a/src/libnpass/gpg.c +++ b/src/libnpass/gpg.c @@ -7,12 +7,12 @@ #include "libnpass/gpg.h" #include "libnpass/util.h" -#define fail_if_err(err) \ +#include "util.h" + +#define gpg_err_ret(err) \ if (err) { \ - fprintf(stderr, "%s:%d: %s: %s\n", __FILE__, __LINE__, \ - gpgme_strsource(err), gpgme_strerror(err)); \ gpg_cleanup(); \ - return 1; \ + err_ret(1, "%s: %s", gpgme_strsource(err), gpgme_strerror(err)); \ } static gpgme_ctx_t ctx = NULL; @@ -33,9 +33,9 @@ int gpg_init(void) #endif err = gpgme_engine_check_version(GPGME_PROTOCOL_OpenPGP); - fail_if_err(err); + gpg_err_ret(err); err = gpgme_new(&ctx); - fail_if_err(err); + gpg_err_ret(err); return 0; } @@ -58,7 +58,7 @@ int gpg_key_validate(const char *fpr) return r; err = gpgme_get_key(ctx, fpr, &key, 1); - fail_if_err(err); + gpg_err_ret(err); gpg_cleanup(); return 0; @@ -76,20 +76,20 @@ int gpg_decrypt(FILE *pass_out, const char *pass_path) return r; err = gpgme_data_new_from_file(&in, pass_path, 1); - fail_if_err(err); + gpg_err_ret(err); err = gpgme_data_new(&out); - fail_if_err(err); + gpg_err_ret(err); err = gpgme_op_decrypt(ctx, in, out); - fail_if_err(err); + gpg_err_ret(err); r = gpgme_data_seek(out, 0, SEEK_SET); if (r) - fail_if_err (gpgme_err_code_from_errno(errno)); + gpg_err_ret(gpgme_err_code_from_errno(errno)); while ((r = gpgme_data_read(out, buf, sizeof(buf)))) fwrite(buf, r, 1, pass_out); if (r < 0) - fail_if_err(gpgme_err_code_from_errno(errno)); + gpg_err_ret(gpgme_err_code_from_errno(errno)); gpg_cleanup(); return 0; @@ -107,24 +107,24 @@ int gpg_encrypt(FILE *stream, const char *fpr, const char *pass, size_t n) return r; err = gpgme_get_key(ctx, fpr, &key, 1); - fail_if_err(err); + gpg_err_ret(err); err = gpgme_data_new_from_mem(&in, pass, n, 0); - fail_if_err(err); + gpg_err_ret(err); err = gpgme_data_new(&out); - fail_if_err(err); + gpg_err_ret(err); err = gpgme_op_encrypt(ctx, &key, GPGME_ENCRYPT_ALWAYS_TRUST, in, out); - fail_if_err(err); + gpg_err_ret(err); r = gpgme_data_seek(out, 0, SEEK_SET); if (r) - fail_if_err (gpgme_err_code_from_errno(errno)); + gpg_err_ret(gpgme_err_code_from_errno(errno)); while ((r = gpgme_data_read(out, buf, sizeof(buf)))) fwrite(buf, r, 1, stream); gpg_cleanup(); if (r < 0) - fail_if_err(gpgme_err_code_from_errno(errno)); + gpg_err_ret(gpgme_err_code_from_errno(errno)); return 0; } diff --git a/src/libnpass/libnpass.c b/src/libnpass/libnpass.c index 14f4737..9158c62 100644 --- a/src/libnpass/libnpass.c +++ b/src/libnpass/libnpass.c @@ -55,29 +55,29 @@ int pass_init(const char *fpr) r = set_pass_dir(); if (r) - err_die(1, "PASSWORD_STORE_DIR not set"); + err_ret(1, "PASSWORD_STORE_DIR not set"); r = gpg_key_validate(fpr); if (r) - err_die(1, "key not usable, try gpg --full-generate-key"); + err_ret(1, "key not usable, try gpg --full-generate-key"); r = r_mkdir(pass_dir, S_IRWXU); if (r) - err_die(1, "%s %s", pass_dir, strerror(errno)); + err_ret(1, "%s %s", pass_dir, strerror(errno)); r = snprintf(gpg_id_path, sizeof(gpg_id_path), "%s/%s", pass_dir, ".gpg-id"); if (r > (int) sizeof(gpg_id_path)) - err_die(1, "path exceeded PATH_MAX"); + err_ret(1, "path exceeded PATH_MAX"); gpg_id = fopen(gpg_id_path, "w"); if (!gpg_id) - err_die(1, "%s %s", gpg_id_path, strerror(errno)); + err_ret(1, "%s %s", gpg_id_path, strerror(errno)); r = fwrite(fpr, strlen(fpr), 1,gpg_id); fclose(gpg_id); if (!r) - err_die(1, "write failed"); + err_ret(1, "write failed"); return 0; } @@ -89,11 +89,11 @@ int pass_cat(FILE *out, const char *path) r = set_pass_dir(); if (r) - err_die(1, "PASSWORD_STORE_DIR not set"); + err_ret(1, "PASSWORD_STORE_DIR not set"); r = snprintf(pass_path, sizeof(pass_path), "%s/%s.gpg", pass_dir, path); if (r >= (int) sizeof(pass_path)) - err_die(1, "path exceeded PATH_MAX"); + err_ret(1, "path exceeded PATH_MAX"); r = gpg_decrypt(out, pass_path); return r; @@ -132,44 +132,44 @@ int pass_add(const char *path, const char *pass, size_t n) r = set_pass_dir(); if (r) - err_die(1, "PASSWORD_STORE_DIR not set"); + err_ret(1, "PASSWORD_STORE_DIR not set"); r = snprintf(gpg_id_path, sizeof(gpg_id_path), "%s/%s", pass_dir, ".gpg-id"); if (r > (int) sizeof(gpg_id_path)) - err_die(1, "path exceeded PATH_MAX"); + err_ret(1, "path exceeded PATH_MAX"); gpg_id = fopen(gpg_id_path, "r"); if (!gpg_id) - err_die(1, "%s %s", gpg_id_path, strerror(errno)); + err_ret(1, "%s %s", gpg_id_path, strerror(errno)); rc = fgets(fpr, sizeof(fpr), gpg_id); if (!rc) - err_die(1, "failed to read %s", gpg_id_path); + err_ret(1, "failed to read %s", gpg_id_path); fclose(gpg_id); util_strtrim(fpr); r = gpg_key_validate(fpr); if (r) - err_die(1, "invalid key , try gpg --list-keys"); + err_ret(1, "invalid key , try gpg --list-keys"); // TODO: guard against .*\.gpg\.gpg[/$] r = snprintf(pass_path, sizeof(pass_path), "%s/%s.gpg", pass_dir, path); if (r > (int) sizeof(pass_path)) - err_die(1, "path exceeded PATH_MAX"); + err_ret(1, "path exceeded PATH_MAX"); rc = strdup(pass_path); if (!rc) - err_die(1, "%s", strerror(errno)); + err_ret(1, "%s", strerror(errno)); (void) r_mkdir(dirname(rc), S_IRWXU); free(rc); r = access(pass_path, F_OK); if (!(errno & ENOENT)) - err_die(1, "an entry already exists for %s", path); + err_ret(1, "an entry already exists for %s", path); out_stream = fopen(pass_path, "w"); if (!out_stream) - err_die(1, "%s", strerror(errno)); + err_ret(1, "%s", strerror(errno)); r = gpg_encrypt(out_stream, fpr, pass, n); @@ -185,20 +185,20 @@ int pass_rm(const char *path) r = set_pass_dir(); if (r) - err_die(1, "PASSWORD_STORE_DIR not set"); + err_ret(1, "PASSWORD_STORE_DIR not set"); r = snprintf(gpg_path, sizeof(gpg_path), "%s.gpg", path); if (r > (int) sizeof(gpg_path)) - err_die(1, "path exceeded PATH_MAX"); + err_ret(1, "path exceeded PATH_MAX"); r = snprintf(abs_path, sizeof(gpg_path), "%s/%s", pass_dir, gpg_path); if (r > (int) sizeof(abs_path)) - err_die(1, "path exceeded PATH_MAX"); + err_ret(1, "path exceeded PATH_MAX"); // TODO: guard against .*\.gpg\.gpg[/$] r = unlink(abs_path); if (r) - err_die(1, "%s %s", abs_path, strerror(errno)); + err_ret(1, "%s %s", abs_path, strerror(errno)); return r_rmdir(pass_dir, dirname(gpg_path)); } diff --git a/src/libnpass/util.c b/src/libnpass/util.c index 9164354..11cf264 100644 --- a/src/libnpass/util.c +++ b/src/libnpass/util.c @@ -46,11 +46,11 @@ int r_rmdir(const char *prefix_path, char *rm_path) r = snprintf(abs_path, sizeof(abs_path), "%s/%s", prefix_path, rm_path); if (r > (int) sizeof(abs_path)) - err_die(1, "path exceeded PATH_MAX"); + err_ret(1, "path exceeded PATH_MAX"); r = rmdir(abs_path); if (r && errno != EEXIST && errno != ENOTEMPTY) - err_die(1, "%s", strerror(errno)); + err_ret(1, "%s", strerror(errno)); return r_rmdir(prefix_path, dirname(rm_path)); } diff --git a/src/npass/npass.c b/src/npass/npass.c index bde34de..d286d80 100644 --- a/src/npass/npass.c +++ b/src/npass/npass.c @@ -7,6 +7,8 @@ #include "libnpass/libnpass.h" #include "util.h" +#define invalid_usage_err_ret() err_ret(1, "invalid usage, try pass help") + void print_usage(void); int cat(const char *path); int add(const char *path); @@ -59,7 +61,7 @@ int add(const char *path) if (r < 0) { if (in != stdin) fclose(in); - err_die(1, "%d:%s:", errno, strerror(errno)); + err_ret(1, "%d:%s:", errno, strerror(errno)); } fputs("\nRetype password: ", stdout); @@ -70,7 +72,7 @@ int add(const char *path) fclose(in); if (p1) free(p1); - err_die(1, "%d:%s:", errno, strerror(errno)); + err_ret(1, "%d:%s:", errno, strerror(errno)); } if (in != stdin) @@ -79,7 +81,7 @@ int add(const char *path) if (strcmp(p1, p2)) { free(p1); free(p2); - err_die(1, "Sorry, passwords do not match"); + err_ret(1, "Sorry, passwords do not match"); } free(p1); @@ -104,30 +106,29 @@ int main(int argc, char *argv[]) print_usage(); } else if (!strcmp("init", *argv)) { if (argc != 2) - err_die(1, "invalid usage, try pass help"); + invalid_usage_err_ret(); r = pass_init(argv[1]); } else if (!strcmp("cat", *argv)) { if (argc != 2) - err_die(1, "invalid usage, try pass help"); + invalid_usage_err_ret(); r = cat(argv[1]); } else if (!strcmp("add", *argv)) { if (argc != 2) - err_die(1, "invalid usage, try pass help"); + invalid_usage_err_ret(); r = add(argv[1]); } else if (!strcmp("rm", *argv)) { if (argc != 2) - err_die(1, "invalid usage, try pass help"); + invalid_usage_err_ret(); r = pass_rm(argv[1]); - } else { + } else if (argc == 1){ r = cat(*argv); + } else { + invalid_usage_err_ret(); } - if (r) - err_die(r, "Command failed"); - - return 0; + return r; } -- cgit v1.2.3