aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/catman.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2017-02-06 19:02:37 +0000
committerIngo Schwarze <schwarze@openbsd.org>2017-02-06 19:02:37 +0000
commitfc82ec67a57867817a8056aed8825a8bfbde718f (patch)
treedba107f5dff80e9b586652471a3ba8924beb3a16 /catman.c
parentd4f22904a2c95e6e37afb6ff6303673a185d3595 (diff)
downloadmandoc-fc82ec67a57867817a8056aed8825a8bfbde718f.tar.gz
mandoc-fc82ec67a57867817a8056aed8825a8bfbde718f.tar.zst
mandoc-fc82ec67a57867817a8056aed8825a8bfbde718f.zip
Polishing:
* support -Ios= * create missing directories * fix output file permissions * error out on comminication failures I now consider this good enough for a first release. Bugs and missing features are still likely, though.
Diffstat (limited to 'catman.c')
-rw-r--r--catman.c57
1 files changed, 41 insertions, 16 deletions
diff --git a/catman.c b/catman.c
index 4574a6e4..5ecef67e 100644
--- a/catman.c
+++ b/catman.c
@@ -1,4 +1,4 @@
-/* $Id: catman.c,v 1.13 2017/02/04 12:03:07 schwarze Exp $ */
+/* $Id: catman.c,v 1.14 2017/02/06 19:02:37 schwarze Exp $ */
/*
* Copyright (c) 2017 Michael Stapelberg <stapelberg@debian.org>
* Copyright (c) 2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -24,6 +24,7 @@
#if HAVE_ERR
#include <err.h>
#endif
+#include <errno.h>
#include <fcntl.h>
#if HAVE_FTS
#include <fts.h>
@@ -37,19 +38,24 @@
int process_manpage(int, int, const char *);
int process_tree(int, int);
-void run_mandocd(int, const char *) __attribute__((noreturn));
+void run_mandocd(int, const char *, const char *)
+ __attribute__((noreturn));
ssize_t sock_fd_write(int, int, int, int);
void usage(void) __attribute__((noreturn));
void
-run_mandocd(int sockfd, const char *outtype)
+run_mandocd(int sockfd, const char *outtype, const char* defos)
{
char sockfdstr[10];
if (snprintf(sockfdstr, sizeof(sockfdstr), "%d", sockfd) == -1)
err(1, "snprintf");
- execlp("mandocd", "mandocd", "-T", outtype, sockfdstr, NULL);
+ if (defos == NULL)
+ execlp("mandocd", "mandocd", "-T", outtype, sockfdstr, NULL);
+ else
+ execlp("mandocd", "mandocd", "-T", outtype,
+ "-I", defos, sockfdstr, NULL);
err(1, "exec");
}
@@ -94,27 +100,30 @@ int
process_manpage(int srv_fd, int dstdir_fd, const char *path)
{
int in_fd, out_fd;
+ int irc;
if ((in_fd = open(path, O_RDONLY)) == -1) {
warn("open(%s)", path);
- return -1;
+ return 0;
}
if ((out_fd = openat(dstdir_fd, path,
O_WRONLY | O_NOFOLLOW | O_CREAT | O_TRUNC,
- S_IRUSR | S_IWUSR | S_IRGRP | S_IRWXO)) == -1) {
+ S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) == -1) {
warn("openat(%s)", path);
close(in_fd);
- return -1;
+ return 0;
}
- if (sock_fd_write(srv_fd, in_fd, out_fd, STDERR_FILENO) < 0) {
- warn("sendmsg");
- return -1;
- }
+ irc = sock_fd_write(srv_fd, in_fd, out_fd, STDERR_FILENO);
close(in_fd);
close(out_fd);
+
+ if (irc < 0) {
+ warn("sendmsg");
+ return -1;
+ }
return 0;
}
@@ -139,9 +148,20 @@ process_tree(int srv_fd, int dstdir_fd)
path = entry->fts_path + 2;
switch (entry->fts_info) {
case FTS_F:
- process_manpage(srv_fd, dstdir_fd, path);
+ if (process_manpage(srv_fd, dstdir_fd, path) == -1) {
+ fts_close(ftsp);
+ return -1;
+ }
break;
case FTS_D:
+ if (*path != '\0' &&
+ mkdirat(dstdir_fd, path, S_IRWXU | S_IRGRP |
+ S_IXGRP | S_IROTH | S_IXOTH) == -1 &&
+ errno != EEXIST) {
+ warn("mkdirat(%s)", path);
+ (void)fts_set(ftsp, entry, FTS_SKIP);
+ }
+ break;
case FTS_DP:
break;
default:
@@ -157,15 +177,19 @@ process_tree(int srv_fd, int dstdir_fd)
int
main(int argc, char **argv)
{
- const char *outtype;
+ const char *defos, *outtype;
int srv_fds[2];
int dstdir_fd;
int opt;
pid_t pid;
+ defos = NULL;
outtype = "ascii";
- while ((opt = getopt(argc, argv, "T:")) != -1) {
+ while ((opt = getopt(argc, argv, "I:T:")) != -1) {
switch (opt) {
+ case 'I':
+ defos = optarg;
+ break;
case 'T':
outtype = optarg;
break;
@@ -190,7 +214,7 @@ main(int argc, char **argv)
err(1, "fork");
case 0:
close(srv_fds[0]);
- run_mandocd(srv_fds[1], outtype);
+ run_mandocd(srv_fds[1], outtype, defos);
default:
break;
}
@@ -208,6 +232,7 @@ main(int argc, char **argv)
void
usage(void)
{
- fprintf(stderr, "usage: catman [-T output] srcdir dstdir\n");
+ fprintf(stderr, "usage: catman [-I os=name] [-T output] "
+ "srcdir dstdir\n");
exit(1);
}