version 1.1, 2017/02/04 12:03:07 |
version 1.11, 2019/03/03 13:02:11 |
|
|
/* $Id$ */ |
/* $Id$ */ |
/* |
/* |
* Copyright (c) 2017 Michael Stapelberg <stapelberg@debian.org> |
* Copyright (c) 2017 Michael Stapelberg <stapelberg@debian.org> |
* Copyright (c) 2017 Ingo Schwarze <schwarze@openbsd.org> |
* Copyright (c) 2017, 2019 Ingo Schwarze <schwarze@openbsd.org> |
* |
* |
* Permission to use, copy, modify, and distribute this software for any |
* Permission to use, copy, modify, and distribute this software for any |
* purpose with or without fee is hereby granted, provided that the above |
* purpose with or without fee is hereby granted, provided that the above |
|
|
*/ |
*/ |
#include "config.h" |
#include "config.h" |
|
|
|
#if HAVE_CMSG_XPG42 |
|
#define _XPG4_2 |
|
#endif |
|
|
#include <sys/types.h> |
#include <sys/types.h> |
#include <sys/socket.h> |
#include <sys/socket.h> |
|
|
|
|
#include <err.h> |
#include <err.h> |
#endif |
#endif |
#include <limits.h> |
#include <limits.h> |
|
#include <stdint.h> |
#include <stdio.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <stdlib.h> |
#include <string.h> |
#include <string.h> |
|
|
#include "roff.h" |
#include "roff.h" |
#include "mdoc.h" |
#include "mdoc.h" |
#include "man.h" |
#include "man.h" |
|
#include "mandoc_parse.h" |
#include "main.h" |
#include "main.h" |
#include "manconf.h" |
#include "manconf.h" |
|
|
|
|
|
|
static void process(struct mparse *, enum outt, void *); |
static void process(struct mparse *, enum outt, void *); |
static int read_fds(int, int *); |
static int read_fds(int, int *); |
static void usage(void) __attribute__((noreturn)); |
static void usage(void) __attribute__((__noreturn__)); |
|
|
|
|
#define NUM_FDS 3 |
#define NUM_FDS 3 |
Line 113 main(int argc, char *argv[]) |
|
Line 119 main(int argc, char *argv[]) |
|
struct manoutput options; |
struct manoutput options; |
struct mparse *parser; |
struct mparse *parser; |
void *formatter; |
void *formatter; |
|
const char *defos; |
const char *errstr; |
const char *errstr; |
int clientfd; |
int clientfd; |
int old_stdin; |
int old_stdin; |
Line 122 main(int argc, char *argv[]) |
|
Line 129 main(int argc, char *argv[]) |
|
int state, opt; |
int state, opt; |
enum outt outtype; |
enum outt outtype; |
|
|
|
defos = NULL; |
outtype = OUTT_ASCII; |
outtype = OUTT_ASCII; |
while ((opt = getopt(argc, argv, "T:")) != -1) { |
while ((opt = getopt(argc, argv, "I:T:")) != -1) { |
switch (opt) { |
switch (opt) { |
|
case 'I': |
|
if (strncmp(optarg, "os=", 3) == 0) |
|
defos = optarg + 3; |
|
else { |
|
warnx("-I %s: Bad argument", optarg); |
|
usage(); |
|
} |
|
break; |
case 'T': |
case 'T': |
if (strcmp(optarg, "ascii") == 0) |
if (strcmp(optarg, "ascii") == 0) |
outtype = OUTT_ASCII; |
outtype = OUTT_ASCII; |
Line 155 main(int argc, char *argv[]) |
|
Line 171 main(int argc, char *argv[]) |
|
errx(1, "file descriptor %s %s", argv[1], errstr); |
errx(1, "file descriptor %s %s", argv[1], errstr); |
|
|
mchars_alloc(); |
mchars_alloc(); |
parser = mparse_alloc(MPARSE_SO | MPARSE_UTF8 | MPARSE_LATIN1, |
parser = mparse_alloc(MPARSE_SO | MPARSE_UTF8 | MPARSE_LATIN1 | |
MANDOCLEVEL_BADARG, NULL, NULL); |
MPARSE_VALIDATE, MANDOC_OS_OTHER, defos); |
|
|
memset(&options, 0, sizeof(options)); |
memset(&options, 0, sizeof(options)); |
switch (outtype) { |
switch (outtype) { |
Line 197 main(int argc, char *argv[]) |
|
Line 213 main(int argc, char *argv[]) |
|
|
|
process(parser, outtype, formatter); |
process(parser, outtype, formatter); |
mparse_reset(parser); |
mparse_reset(parser); |
|
if (outtype == OUTT_HTML) |
|
html_reset(formatter); |
|
|
fflush(stdout); |
fflush(stdout); |
fflush(stderr); |
fflush(stderr); |
Line 228 main(int argc, char *argv[]) |
|
Line 246 main(int argc, char *argv[]) |
|
static void |
static void |
process(struct mparse *parser, enum outt outtype, void *formatter) |
process(struct mparse *parser, enum outt outtype, void *formatter) |
{ |
{ |
struct roff_man *man; |
struct roff_meta *meta; |
|
|
mparse_readfd(parser, STDIN_FILENO, "<unixfd>"); |
mparse_readfd(parser, STDIN_FILENO, "<unixfd>"); |
mparse_result(parser, &man, NULL); |
meta = mparse_result(parser); |
|
if (meta->macroset == MACROSET_MDOC) { |
if (man == NULL) |
|
return; |
|
|
|
if (man->macroset == MACROSET_MDOC) { |
|
mdoc_validate(man); |
|
switch (outtype) { |
switch (outtype) { |
case OUTT_ASCII: |
case OUTT_ASCII: |
case OUTT_UTF8: |
case OUTT_UTF8: |
terminal_mdoc(formatter, man); |
terminal_mdoc(formatter, meta); |
break; |
break; |
case OUTT_HTML: |
case OUTT_HTML: |
html_mdoc(formatter, man); |
html_mdoc(formatter, meta); |
break; |
break; |
} |
} |
} |
} |
if (man->macroset == MACROSET_MAN) { |
if (meta->macroset == MACROSET_MAN) { |
man_validate(man); |
|
switch (outtype) { |
switch (outtype) { |
case OUTT_ASCII: |
case OUTT_ASCII: |
case OUTT_UTF8: |
case OUTT_UTF8: |
terminal_man(formatter, man); |
terminal_man(formatter, meta); |
break; |
break; |
case OUTT_HTML: |
case OUTT_HTML: |
html_man(formatter, man); |
html_man(formatter, meta); |
break; |
break; |
} |
} |
} |
} |
Line 265 process(struct mparse *parser, enum outt outtype, void |
|
Line 277 process(struct mparse *parser, enum outt outtype, void |
|
void |
void |
usage(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); |
exit(1); |
} |
} |