commit 9888507cd4212b360fc15e4262e5fd95844efc7c from: Omar Polo date: Mon Jul 24 09:28:01 2023 UTC read from stdin if no file is given commit - bf9ca5e71c334c4d96466a3e6bee8b2dbde5c884 commit + 9888507cd4212b360fc15e4262e5fd95844efc7c blob - 7300b94ac70ff2cd656979e030da9e3ae9c81881 blob + f76deeb670ee35ddd262c3c180f2ecb27e609f5b --- titan.c +++ titan.c @@ -148,11 +148,53 @@ iomux(struct tls *ctx, int fd, const char *in, size_t return 0; } +static FILE * +open_input_file(int argc, char **argv) +{ + FILE *fp; + char buf[BUFSIZ]; + char sfn[22]; + size_t r; + int fd; + + if (argc > 1) { + if ((fp = fopen(argv[1], "r")) == NULL) + err(1, "can't open %s", argv[1]); + return fp; + } + + strlcpy(sfn, "/tmp/titan.XXXXXXXXXX", sizeof(sfn)); + if ((fd = mkstemp(sfn)) == -1 || + (fp = fdopen(fd, "w+")) == NULL) { + warn("%s", sfn); + if (fd != -1) { + unlink(sfn); + close(fd); + } + errx(1, "can't create temp file"); + } + unlink(sfn); + + for (;;) { + r = fread(buf, 1, sizeof(buf), stdin); + if (r == 0) + break; + fwrite(buf, 1, r, fp); + } + if (ferror(fp)) + err(1, "I/O error"); + + if (fseeko(fp, 0, SEEK_SET) == -1) + err(1, "fseeko"); + + return fp; +} + static void __dead usage(void) { fprintf(stderr, - "usage: %s [-C cert] [-K key] [-m mime] [-t token] url file\n", + "usage: %s [-C cert] [-K key] [-m mime] [-t token] url [file]\n", getprogname()); exit(1); } @@ -172,7 +214,7 @@ main(int argc, char **argv) char *req; int sock, ch; - if (pledge("stdio rpath inet dns", NULL) == -1) + if (pledge("stdio rpath tmppath inet dns", NULL) == -1) err(1, "pledge"); while ((ch = getopt(argc, argv, "C:K:m:t:")) != -1) { @@ -199,13 +241,12 @@ main(int argc, char **argv) if (cert != NULL && key == NULL) key = cert; - if (argc != 2) + if (argc > 2) usage(); - if ((in = fopen(argv[1], "r")) == NULL) - err(1, "can't open %s", argv[1]); + in = open_input_file(argc, argv); - /* drop rpath */ + /* drop rpath tmppath */ if (pledge("stdio inet dns", NULL) == -1) err(1, "pledge");