From a6a49587035a29df9ad2401e47cffd9fb51e9ba3 Mon Sep 17 00:00:00 2001 From: sinanmohd Date: Wed, 17 Apr 2024 07:22:44 +0530 Subject: npass: refactor https://www.kernel.org/doc/html/v4.10/process/coding-style.html - Function return values and names (-Exxx = failure, 0 = success) for imperative commands (0 = failure, non-zero = success) for predicates --- include/libnpass/libnpass.h | 2 +- include/util.h | 6 +- src/libnpass/libnpass.c | 24 +++++--- src/npass/npass.c | 139 ++++++++++++++++++++++++-------------------- 4 files changed, 97 insertions(+), 74 deletions(-) diff --git a/include/libnpass/libnpass.h b/include/libnpass/libnpass.h index 186b907..33e6831 100644 --- a/include/libnpass/libnpass.h +++ b/include/libnpass/libnpass.h @@ -30,5 +30,5 @@ int pass_cat(FILE *out, const char *path); int pass_add(const char *path, const char *pass, size_t n); int pass_rm(const char *path); -ssize_t pass_getpass(char **lineptr, size_t *n, FILE *stream); +ssize_t pass_getpass(char **lineptr, FILE *stream); int pass_gen(pass_gen_t gen, char *pass, int len); diff --git a/include/util.h b/include/util.h index 9c650e1..ca4e6d8 100644 --- a/include/util.h +++ b/include/util.h @@ -1,8 +1,10 @@ #include +#define err_print(fmt, ...) \ + fprintf(stderr, "[%s:%d] " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__) + #define err_ret(r, fmt, ...) \ do { \ - fprintf(stderr, "[%s:%d] " fmt "\n", __FILE__, __LINE__, \ - ##__VA_ARGS__); \ + err_print(fmt, ##__VA_ARGS__); \ return r; \ } while (0) diff --git a/src/libnpass/libnpass.c b/src/libnpass/libnpass.c index f62f098..779a42a 100644 --- a/src/libnpass/libnpass.c +++ b/src/libnpass/libnpass.c @@ -250,6 +250,8 @@ int readstore_all(const char *path, struct store **stor) err_ret(-errno, "%s", strerror(errno)); } } + if (len == 0) + free(*stor); return (ret < 0) ? ret : len; } @@ -309,10 +311,11 @@ int pass_cat(FILE *out, const char *path) return gpg_decrypt(out, pass_path); } -ssize_t pass_getpass(char **lineptr, size_t *n, FILE *stream) +ssize_t pass_getpass(char **lineptr, FILE *stream) { struct termios new, old; - int ret; + size_t len; + ssize_t ret; ret = tcgetattr(fileno(stream), &old); if (ret < 0) @@ -324,17 +327,22 @@ ssize_t pass_getpass(char **lineptr, size_t *n, FILE *stream) if (ret < 0) err_ret(-errno, "%s", strerror(errno)); - ret = getline(lineptr, n, stream); - if (ret > 0 && (*lineptr)[ret - 1] == '\n') - (*lineptr)[ret - 1] = '\0'; - else if (ret < 0) + len = 0; + *lineptr = NULL; + ret = getline(lineptr, &len, stream); + if (ret < 0) err_ret(-errno, "%s", strerror(errno)); + else if (ret > 0 && (*lineptr)[ret - 1] == '\n') + (*lineptr)[--ret] = '\0'; + len = ret; ret = tcsetattr(fileno(stream), TCSAFLUSH, &old); - if (ret < 0) + if (ret < 0) { + free(*lineptr); err_ret(-errno, "%s", strerror(errno)); + } - return 0; + return len; } int pass_gen(pass_gen_t gen, char *pass, int len) diff --git a/src/npass/npass.c b/src/npass/npass.c index f02c4be..cf6338f 100644 --- a/src/npass/npass.c +++ b/src/npass/npass.c @@ -7,7 +7,8 @@ #include "libnpass/libnpass.h" #include "util.h" -#define invalid_usage_err_ret() err_ret(1, "invalid usage, try pass help") +#define invalid_usage_err_ret(err) \ + err_ret(err, "%s", "Invalid usage, try $pass help") #define DEF_DEPTTH 16; #define BLUE "\e[0;34m" @@ -47,43 +48,56 @@ static void print_usage(void) static int cat(const char *path) { - int r; + int ret; - r = pass_cat(stdout, path); - if (!r && isatty(STDOUT_FILENO)) + ret = pass_cat(stdout, path); + if (ret >= 0 && isatty(STDOUT_FILENO)) putchar('\n'); - return r; + return ret; } static int ls(const char *path, size_t depth) { - void *p; - char *prefix; - int i, j, len, r; - struct store *stor; - char new_path[PATH_MAX]; static depth_state_t *depth_state; - static size_t depth_state_len = DEF_DEPTTH; + static size_t depth_state_len; - len = readstore_all(path, &stor); - if (len <= 0) - return 1; + char new_path[PATH_MAX]; + struct store *stor; + int slen, ret; + char *prefix; + void *p; + + slen = readstore_all(path, &stor); + if (slen <= 0) + return -EPERM; + depth_state_len = DEF_DEPTTH; if (!depth) { depth_state = malloc(sizeof(depth_state_t) * depth_state_len); + if (!depth_state) { + free(stor); + err_ret(-errno, "%s", strerror(errno)); + } + puts((path) ? path : "Password Store"); } else if (depth == depth_state_len - 1) { depth_state_len *= 2; - p = realloc(stor, sizeof(depth_state[0]) * len); - if (!p) - err_ret(1, "%s", strerror(errno)); + p = realloc(stor, sizeof(*depth_state) * depth_state_len); + if (!p) { + free(stor); + err_ret(-errno, "%s", strerror(errno)); + } depth_state = p; } - qsort(stor, len, sizeof(stor[0]), pass_store_cmp); - for (i = 0; i < len; i++) { - if (i == len - 1) { + qsort(stor, slen, sizeof(*stor), pass_store_cmp); + for (int i = 0; i < slen; i++) { + for (int j = 0; (size_t)j < depth; j++) + printf("%s ", + (depth_state[j]) == DEPTH_ITS_OVER ? " " : "│"); + + if (i == slen - 1) { prefix = "└──"; depth_state[depth] = DEPTH_ITS_OVER; } else { @@ -91,74 +105,73 @@ static int ls(const char *path, size_t depth) depth_state[depth] = DEPTH_NOT_OVER; } - for (j = 0; (size_t)j < depth; j++) - printf("%s ", - (depth_state[j]) == DEPTH_ITS_OVER ? " " : "│"); - if (stor[i].type == PASS_STORE_DIR) { printf("%s %s%s%s\n", prefix, BLUE, stor[i].name, NCOL); - r = snprintf(new_path, sizeof(new_path), "%s/%s", - (path) ? path : "", stor[i].name); - if (r < 0 || (size_t)r >= sizeof(new_path)) - err_ret(1, "%s", "failed to build path"); + ret = snprintf(new_path, sizeof(new_path), "%s/%s", + (path) ? path : "", stor[i].name); + if (ret < 0 || (size_t)ret >= sizeof(new_path)) { + ret = -ENAMETOOLONG; + err_print("%s", "Path exceeded PATH_MAX"); + goto out_free_depth_state; + } + ls(new_path, depth + 1); } else { printf("%s %s\n", prefix, stor[i].name); } } +out_free_depth_state: if (!depth) free(depth_state); free(stor); - return 0; + return (ret < 0) ? ret : 0; } static int add(const char *path) { char *p1 = NULL, *p2 = NULL; FILE *in; - size_t n; - int r; + ssize_t ret; in = fopen("/dev/tty", "r"); if (!in) in = stdin; fputs("Password: ", stdout); - r = pass_getpass(&p1, &n, in); - if (r < 0) { - if (in != stdin) - fclose(in); - err_ret(1, "%d:%s:", errno, strerror(errno)); + ret = pass_getpass(&p1, in); + if (ret < 0) { + err_print("%s", strerror(errno)); + goto out_close_in; } fputs("\nRetype password: ", stdout); - r = pass_getpass(&p2, &n, in); - putc('\n', stdout); - if (r < 0) { - if (in != stdin) - fclose(in); - if (p1) - free(p1); - err_ret(1, "%d:%s:", errno, strerror(errno)); + ret = pass_getpass(&p2, in); + putchar('\n'); + if (ret < 0) { + err_print("%s", strerror(errno)); + goto out_free_p1; } - if (in != stdin) - fclose(in); - if (strcmp(p1, p2)) { - free(p1); - free(p2); - err_ret(1, "Sorry, passwords do not match"); + err_print("%s", "Passwords do not match"); + ret = -EINVAL; + goto out_free_p2; } - free(p1); - r = pass_add(path, p2, n); + ret = pass_add(path, p2, ret); +out_free_p2: free(p2); - return r; +out_free_p1: + free(p1); +out_close_in: + if (in != stdin) + fclose(in); + + return ret; } static int gen(int argc, char *argv[]) @@ -186,11 +199,11 @@ static int gen(int argc, char *argv[]) } if (optind != argc - 1) - invalid_usage_err_ret(); + invalid_usage_err_ret(-EINVAL); pass = malloc(sizeof(char) * len); if (!pass) - err_ret(1, "%s", strerror(errno)); + err_ret(-errno, "%s", strerror(errno)); r = pass_gen(gen, pass, len); if (r) @@ -217,32 +230,32 @@ int main(int argc, char *argv[]) print_usage(); } else if (!strcmp("init", *argv)) { if (argc != 2) - invalid_usage_err_ret(); + invalid_usage_err_ret(EXIT_FAILURE); r = pass_init(argv[1]); } else if (!strcmp("ls", *argv)) { if (argc > 2) - invalid_usage_err_ret(); + invalid_usage_err_ret(EXIT_FAILURE); r = ls(argv[1], 0); } else if (!strcmp("cat", *argv)) { if (argc != 2) - invalid_usage_err_ret(); + invalid_usage_err_ret(EXIT_FAILURE); r = cat(argv[1]); } else if (!strcmp("add", *argv)) { if (argc != 2) - invalid_usage_err_ret(); + invalid_usage_err_ret(EXIT_FAILURE); r = add(argv[1]); } else if (!strcmp("rm", *argv)) { if (argc != 2) - invalid_usage_err_ret(); + invalid_usage_err_ret(EXIT_FAILURE); r = pass_rm(argv[1]); } else if (!strcmp("gen", *argv)) { if (argc < 2) - invalid_usage_err_ret(); + invalid_usage_err_ret(EXIT_FAILURE); r = gen(argc, argv); } else if (argc == 1) { @@ -260,8 +273,8 @@ int main(int argc, char *argv[]) break; } } else { - invalid_usage_err_ret(); + invalid_usage_err_ret(EXIT_FAILURE); } - return r; + return (r < 0) ? EXIT_FAILURE : EXIT_SUCCESS; } -- cgit v1.2.3