Exemplo n.º 1
0
//
//  Open_Signal: C
//
DEVICE_CMD Open_Signal(REBREQ *req)
{
    //RL_Print("Open_Signal\n");

    sigset_t mask;
    sigset_t overlap;

#ifdef CHECK_MASK_OVERLAP //doesn't work yet
    if (sigprocmask(SIG_BLOCK, NULL, &mask) < 0) {
        goto error;
    }
    if (sigandset(&overlap, &mask, &req->special.signal.mask) < 0) {
        goto error;
    }
    if (!sigisemptyset(&overlap)) {
        req->error = EBUSY;
        return DR_ERROR;
    }
#endif

    if (sigprocmask(SIG_BLOCK, &req->special.signal.mask, NULL) < 0) {
        goto error;
    }

    SET_OPEN(req);
    Signal_Device(req, EVT_OPEN);

    return DR_DONE;

error:
    req->error = errno;
    return DR_ERROR;
}
Exemplo n.º 2
0
enum HANDLE_RESULT handle_signal(const sigset_t * sigs, pid_t child_pid) {
  if (sigisemptyset(sigs)) {
    return IGNORE;
  }
  if (! sigismember(sigs, SIGCHLD)) {
    if (kill_and_wait_sigchild(child_pid, SIGTERM, 1) == -1) {
      return KILL_CHILD;
    }
  }
  return WAIT_CHILD_EXIT;
}
Exemplo n.º 3
0
  void Signal::Manager::add(uint32_t signal, Handler *handler)
  {
    Manager & manager = get();

    if(sigisemptyset(&manager.mask) != 0)
    {
      manager.modify(EPOLLIN);
      manager.start();
    }

    if(manager.handlers.find(signal) == manager.handlers.end())
    {
      ::sigaddset(&manager.mask, signal);

      if(sigprocmask(SIG_BLOCK, &manager.mask, nullptr) < 0)
      {
        throw;
      }

      manager.fd = signalfd(manager.fd, &manager.mask, SFD_NONBLOCK | SFD_CLOEXEC);
    }

    manager.handlers[signal].insert(handler);
  }
Exemplo n.º 4
0
BOOL sigset_empty(sigset_t a) {
	return sigisemptyset(&a);
}