[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.16

version 1.14, 2017/02/06 19:02:37 version 1.16, 2017/02/08 16:11:40
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>
   
 int      process_manpage(int, int, const char *);  int      process_manpage(int, int, const char *);
Line 62  run_mandocd(int sockfd, const char *outtype, const cha
Line 67  run_mandocd(int sockfd, const char *outtype, const cha
 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 76  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 100  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

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

CVSweb