source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* mdocml: Polishing: * support -Ios= * create missing directories * fix
@ 2017-02-06 19:03 schwarze
  0 siblings, 0 replies; only message in thread
From: schwarze @ 2017-02-06 19:03 UTC (permalink / raw)
  To: source

Log Message:
-----------
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.

Modified Files:
--------------
    mdocml:
        mandocd.c
        catman.c

Revision Data
-------------
Index: catman.c
===================================================================
RCS file: /home/cvs/mdocml/mdocml/catman.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -Lcatman.c -Lcatman.c -u -p -r1.13 -r1.14
--- catman.c
+++ catman.c
@@ -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);
 }
Index: mandocd.c
===================================================================
RCS file: /home/cvs/mdocml/mdocml/mandocd.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -Lmandocd.c -Lmandocd.c -u -p -r1.2 -r1.3
--- mandocd.c
+++ mandocd.c
@@ -114,6 +114,7 @@ main(int argc, char *argv[])
 	struct manoutput	 options;
 	struct mparse		*parser;
 	void			*formatter;
+	const char		*defos;
 	const char		*errstr;
 	int			 clientfd;
 	int			 old_stdin;
@@ -123,9 +124,18 @@ main(int argc, char *argv[])
 	int			 state, opt;
 	enum outt		 outtype;
 
+	defos = NULL;
 	outtype = OUTT_ASCII;
-	while ((opt = getopt(argc, argv, "T:")) != -1) {
+	while ((opt = getopt(argc, argv, "I:T:")) != -1) {
 		switch (opt) {
+		case 'I':
+			if (strncmp(optarg, "os=", 3) == 0)
+				defos = optarg + 3;
+			else {
+				warnx("-I %s: Bad argument", optarg);
+				usage();
+			}
+			break;
 		case 'T':
 			if (strcmp(optarg, "ascii") == 0)
 				outtype = OUTT_ASCII;
@@ -157,7 +167,7 @@ main(int argc, char *argv[])
 
 	mchars_alloc();
 	parser = mparse_alloc(MPARSE_SO | MPARSE_UTF8 | MPARSE_LATIN1,
-	    MANDOCLEVEL_BADARG, NULL, NULL);
+	    MANDOCLEVEL_BADARG, NULL, defos);
 
 	memset(&options, 0, sizeof(options));
 	switch (outtype) {
@@ -266,6 +276,6 @@ process(struct mparse *parser, enum outt
 void
 usage(void)
 {
-	fprintf(stderr, "usage: mandocd [-T output] socket_fd\n");
+	fprintf(stderr, "usage: mandocd [-I os=name] [-T output] socket_fd\n");
 	exit(1);
 }
--
 To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2017-02-06 19:03 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-02-06 19:03 mdocml: Polishing: * support -Ios= * create missing directories * fix schwarze

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).