aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsinanmohd <sinan@sinanmohd.com>2024-04-07 10:08:27 +0530
committersinanmohd <sinan@sinanmohd.com>2024-04-07 10:08:27 +0530
commit8ab1e3c5da78c05b8edf48d44e6fde046d50e582 (patch)
tree4e96c8f691029efbaf1f0f7bc074f2abee727b72
parentf6071344e355e46072475b5578da6673294427c1 (diff)
util: refactor error reporting
-rw-r--r--include/util.h6
-rw-r--r--src/libnpass/gpg.c36
-rw-r--r--src/libnpass/libnpass.c42
-rw-r--r--src/libnpass/util.c4
-rw-r--r--src/npass/npass.c25
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 <stdio.h>
-#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;
}