[BACK]Return to catman.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / mandoc

Diff for /mandoc/catman.c between version 1.14 and 1.19

version 1.14, 2017/02/06 19:02:37 version 1.19, 2017/02/16 15:12:32
Line 17 
Line 17 
  */   */
 #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>
Line 34 
Line 38 
 #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);
 }  }

Legend:
Removed from v.1.14  
changed lines
  Added in v.1.19

CVSweb