X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/65802cb13c3ad5a26e4cf660dc5ebde42962aa89..025c5f4aa5ffbf8948482a4233318db81c2df5d2:/pixie.c diff --git a/pixie.c b/pixie.c index b7083f3..993b60f 100644 --- a/pixie.c +++ b/pixie.c @@ -1024,6 +1024,7 @@ static unsigned c_flags = 0; #define cf_uclose 1u #define cf_sclose 2u +#define cf_cooked 4u /* --- Line handler functions --- */ @@ -1049,7 +1050,22 @@ static void c_sline(char *s, size_t len, void *p) } exit(0); } - puts(s); + if (!(c_flags & cf_cooked)) + puts(s); + else { + char *q = str_getword(&s); + if (strcmp(q, "FAIL") == 0) + die(1, "%s", p); + else if (strcmp(q, "INFO") == 0 || + strcmp(q, "ITEM") == 0) + puts(s); + else if (strcmp(q, "OK") == 0) { + if (s && *s) puts(s); + } else if (strcmp(q, "MISSING") == 0) + ; + else + moan("unexpected output: %s %s", q, s); + } } /* --- @pix_client@ --- * @@ -1093,7 +1109,7 @@ static void pix_client(struct sockaddr_un *sun, size_t sz, char *argv[]) DPUTC(&d, '\n'); write(fd, d.buf, d.len); shutdown(fd, 1); - c_flags |= cf_uclose; + c_flags |= cf_uclose | cf_cooked; dstr_destroy(&d); } @@ -1122,6 +1138,7 @@ static void usage(FILE *fp) Usage:\n\ $ [-qvfidl] [-c COMMAND] [-t TIMEOUT] [-s SOCKET]\n\ $ [-s SOCKET] -C [COMMAND ARGS...]\n\ + $ [-s SOCKET] -P[P] TAG\n\ "); } @@ -1144,6 +1161,9 @@ protect important keys. Options provided:\n\ -u, --usage Show a (very) terse usage summary.\n\ \n\ -C, --client Connect to a running pixie as a client.\n\ +-P, --passphrase Request passphrase TAG and print to stdout.\n\ +-PP, --verify-passphrase\n\ + Verify passphrase TAG and print to stdout.\n\ \n\ -q, --quiet Emit fewer log messages.\n\ -v, --version Emit more log messages.\n\ @@ -1190,6 +1210,8 @@ int main(int argc, char *argv[]) #define f_stdin 4u #define f_daemon 8u #define f_syslog 16u +#define f_fetch 32u +#define f_verify 64u /* --- Initialize libraries --- */ @@ -1217,6 +1239,8 @@ int main(int argc, char *argv[]) { "quiet", 0, 0, 'q' }, { "verbose", 0, 0, 'v' }, { "client", 0, 0, 'C' }, + { "passphrase", 0, 0, 'P' }, + { "verify-passphrase", 0, 0, '+' }, { "socket", OPTF_ARGREQ, 0, 's' }, { "command", OPTF_ARGREQ, 0, 'c' }, { "fetch", 0, 0, 'f' }, @@ -1232,7 +1256,7 @@ int main(int argc, char *argv[]) { 0, 0, 0, 0 } }; - int i = mdwopt(argc, argv, "hVuqvCs:c:ft:idl", opts, 0, 0, 0); + int i = mdwopt(argc, argv, "hVuqvCPs:c:ft:idl", opts, 0, 0, 0); if (i < 0) break; @@ -1261,6 +1285,17 @@ int main(int argc, char *argv[]) break; case 'C': f |= f_client; + f &= ~f_fetch; + break; + case 'P': + if (!(f & f_fetch)) + f |= f_fetch; + else + f |= f_verify; + break; + case '+': + f |= f_fetch | f_verify; + f &= ~f_client; break; case 's': path = optarg; @@ -1294,11 +1329,26 @@ int main(int argc, char *argv[]) } } - if (f & f_bogus || (optind < argc && !(f & f_client))) { + if (f & f_bogus || + (optind < argc && !(f & (f_client|f_fetch))) || + ((f & f_fetch) && optind != argc - 1)) { usage(stderr); exit(1); } + /* --- Handle request for a passphrase --- */ + + if (f & f_fetch) { + char *buf = l_alloc(&lm, 1024); + passphrase_connect(path); + if (passphrase_read(argv[optind], + (f & f_verify) ? PMODE_VERIFY : PMODE_READ, + buf, 1024)) + die(1, "failed to read passphrase: %s", strerror(errno)); + puts(buf); + return (0); + } + /* --- Set up the socket address --- */ sun = pixie_address(path, &sz);