version 1.14, 2017/02/06 19:02:37 |
version 1.19, 2017/02/16 15:12:32 |
|
|
*/ |
*/ |
#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 <sys/stat.h> |
#include <sys/stat.h> |
|
|
#include <stdio.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <stdlib.h> |
#include <string.h> |
#include <string.h> |
|
#include <time.h> |
#include <unistd.h> |
#include <unistd.h> |
|
|
|
#ifndef O_DIRECTORY |
|
#define O_DIRECTORY 0 |
|
#endif |
|
|
int process_manpage(int, int, const char *); |
int process_manpage(int, int, const char *); |
int process_tree(int, int); |
int process_tree(int, int); |
void run_mandocd(int, const char *, const char *) |
void run_mandocd(int, const char *, const char *) |
Line 52 run_mandocd(int sockfd, const char *outtype, const cha |
|
Line 61 run_mandocd(int sockfd, const char *outtype, const cha |
|
if (snprintf(sockfdstr, sizeof(sockfdstr), "%d", sockfd) == -1) |
if (snprintf(sockfdstr, sizeof(sockfdstr), "%d", sockfd) == -1) |
err(1, "snprintf"); |
err(1, "snprintf"); |
if (defos == NULL) |
if (defos == NULL) |
execlp("mandocd", "mandocd", "-T", outtype, sockfdstr, NULL); |
execlp("mandocd", "mandocd", "-T", outtype, |
|
sockfdstr, (char *)NULL); |
else |
else |
execlp("mandocd", "mandocd", "-T", outtype, |
execlp("mandocd", "mandocd", "-T", outtype, |
"-I", defos, sockfdstr, NULL); |
"-I", defos, sockfdstr, (char *)NULL); |
err(1, "exec"); |
err(1, "exec"); |
} |
} |
|
|
ssize_t |
ssize_t |
sock_fd_write(int fd, int fd0, int fd1, int fd2) |
sock_fd_write(int fd, int fd0, int fd1, int fd2) |
{ |
{ |
|
const struct timespec timeout = { 0, 10000000 }; /* 0.01 s */ |
struct msghdr msg; |
struct msghdr msg; |
struct iovec iov; |
struct iovec iov; |
union { |
union { |
Line 70 sock_fd_write(int fd, int fd0, int fd1, int fd2) |
|
Line 81 sock_fd_write(int fd, int fd0, int fd1, int fd2) |
|
} cmsgu; |
} cmsgu; |
struct cmsghdr *cmsg; |
struct cmsghdr *cmsg; |
int *walk; |
int *walk; |
|
ssize_t sz; |
unsigned char dummy[1] = {'\0'}; |
unsigned char dummy[1] = {'\0'}; |
|
|
iov.iov_base = dummy; |
iov.iov_base = dummy; |
Line 93 sock_fd_write(int fd, int fd0, int fd1, int fd2) |
|
Line 105 sock_fd_write(int fd, int fd0, int fd1, int fd2) |
|
*(walk++) = fd1; |
*(walk++) = fd1; |
*(walk++) = fd2; |
*(walk++) = fd2; |
|
|
return sendmsg(fd, &msg, 0); |
/* |
|
* It appears that on some systems, sendmsg(3) |
|
* may return EAGAIN even in blocking mode. |
|
* Seen for example on Oracle Solaris 11.2. |
|
* The sleeping time was chosen by experimentation, |
|
* to neither cause more than a handful of retries |
|
* in normal operation nor unnecessary delays. |
|
*/ |
|
for (;;) { |
|
if ((sz = sendmsg(fd, &msg, 0)) != -1 || |
|
errno != EAGAIN) |
|
break; |
|
nanosleep(&timeout, NULL); |
|
} |
|
return sz; |
} |
} |
|
|
int |
int |
Line 232 main(int argc, char **argv) |
|
Line 258 main(int argc, char **argv) |
|
void |
void |
usage(void) |
usage(void) |
{ |
{ |
fprintf(stderr, "usage: catman [-I os=name] [-T output] " |
fprintf(stderr, "usage: %s [-I os=name] [-T output] " |
"srcdir dstdir\n"); |
"srcdir dstdir\n", BINM_CATMAN); |
exit(1); |
exit(1); |
} |
} |