Diff for /qemu/compatfd.c between versions 1.1.1.1 and 1.1.1.2

version 1.1.1.1, 2018/04/24 18:33:23 version 1.1.1.2, 2018/04/24 18:55:41
Line 26  struct sigfd_compat_info Line 26  struct sigfd_compat_info
 static void *sigwait_compat(void *opaque)  static void *sigwait_compat(void *opaque)
 {  {
     struct sigfd_compat_info *info = opaque;      struct sigfd_compat_info *info = opaque;
     int err;  
     sigset_t all;      sigset_t all;
   
     sigfillset(&all);      sigfillset(&all);
     sigprocmask(SIG_BLOCK, &all, NULL);      pthread_sigmask(SIG_BLOCK, &all, NULL);
   
     do {      while (1) {
         siginfo_t siginfo;          int sig;
           int err;
         err = sigwaitinfo(&info->mask, &siginfo);  
         if (err == -1 && errno == EINTR) {          err = sigwait(&info->mask, &sig);
             err = 0;          if (err != 0) {
             continue;              if (errno == EINTR) {
         }                  continue;
               } else {
         if (err > 0) {                  return NULL;
             char buffer[128];              }
           } else {
               struct qemu_signalfd_siginfo buffer;
             size_t offset = 0;              size_t offset = 0;
   
             memcpy(buffer, &err, sizeof(err));              memset(&buffer, 0, sizeof(buffer));
               buffer.ssi_signo = sig;
   
             while (offset < sizeof(buffer)) {              while (offset < sizeof(buffer)) {
                 ssize_t len;                  ssize_t len;
   
                 len = write(info->fd, buffer + offset,                  len = write(info->fd, (char *)&buffer + offset,
                             sizeof(buffer) - offset);                              sizeof(buffer) - offset);
                 if (len == -1 && errno == EINTR)                  if (len == -1 && errno == EINTR)
                     continue;                      continue;
   
                 if (len <= 0) {                  if (len <= 0) {
                     err = -1;                      return NULL;
                     break;  
                 }                  }
   
                 offset += len;                  offset += len;
             }              }
         }          }
     } while (err >= 0);      }
   
     return NULL;  
 }  }
   
 static int qemu_signalfd_compat(const sigset_t *mask)  static int qemu_signalfd_compat(const sigset_t *mask)
Line 115  int qemu_signalfd(const sigset_t *mask) Line 115  int qemu_signalfd(const sigset_t *mask)
   
     return qemu_signalfd_compat(mask);      return qemu_signalfd_compat(mask);
 }  }
   
   bool qemu_signalfd_available(void)
   {
   #ifdef CONFIG_SIGNALFD
       errno = 0;
       syscall(SYS_signalfd, -1, NULL, _NSIG / 8);
       return errno != ENOSYS;
   #else
       return false;
   #endif
   }

Removed from v.1.1.1.1  
changed lines
  Added in v.1.1.1.2


unix.superglobalmegacorp.com