Esempio n. 1
0
void signal_handler(void)
{
    DEBUG_MSG("signal_handler activated");

#ifdef SIGSEGV
    signal_handle(SIGSEGV, signal_SEGV, 0);
#endif
#ifdef SIGBUS
    signal_handle(SIGBUS, signal_SEGV, 0);
#endif
#ifdef SIGINT
    signal_handle(SIGINT, signal_TERM, 0);
#endif
#ifdef SIGTERM
    signal_handle(SIGTERM, signal_TERM, 0);
#endif
#ifdef SIGCHLD
    signal_handle(SIGCHLD, signal_CHLD, 0);
#endif
#ifdef SIGPIPE
    /* needed by sslwrap */
    signal_handle(SIGPIPE, SIG_IGN, 0);
#endif
#ifdef SIGALRM
    /* needed by solaris */
    signal_handle(SIGALRM, SIG_IGN, 0);
#endif
#ifdef SIGTTOU
    /* allow the user to type "ettercap .. &" */
    signal_handle(SIGTTOU, SIG_IGN, 0);
#endif
#ifdef SIGTTIN
    signal_handle(SIGTTIN, SIG_IGN, 0);
#endif
}
Esempio n. 2
0
void event_remove(const event_t &criterion) {
    event_list_t new_list;

    if (debug_level >= 3) {
        wcstring desc = event_desc_compact(criterion);
        debug(3, "unregister: %ls\n", desc.c_str());
    }

    // Because of concurrency issues (env_remove could remove an event that is currently being
    // executed), env_remove does not actually free any events - instead it simply moves all events
    // that should be removed from the event list to the killme list, and the ones that shouldn't be
    // killed to new_list, and then drops the empty events-list.
    if (s_event_handlers.empty()) return;

    for (size_t i = 0; i < s_event_handlers.size(); i++) {
        event_t *n = s_event_handlers.at(i);
        if (event_match(criterion, *n)) {
            killme.push_back(n);

            // If this event was a signal handler and no other handler handles the specified signal
            // type, do not handle that type of signal any more.
            if (n->type == EVENT_SIGNAL) {
                event_t e = event_t::signal_event(n->param1.signal);
                if (event_get(e, 0) == 1) {
                    signal_handle(e.param1.signal, 0);
                    set_signal_observed(e.param1.signal, 0);
                }
            }
        } else {
            new_list.push_back(n);
        }
    }
    s_event_handlers.swap(new_list);
}
Esempio n. 3
0
void event_remove(event_t *criterion)
{

    size_t i;
    event_list_t new_list;

    CHECK(criterion,);

    /*
      Because of concurrency issues (env_remove could remove an event
      that is currently being executed), env_remove does not actually
      free any events - instead it simply moves all events that should
      be removed from the event list to the killme list, and the ones
      that shouldn't be killed to new_list, and then drops the empty
      events-list.
    */

    if (events.empty())
        return;

    for (i=0; i<events.size(); i++)
    {
        event_t *n = events.at(i);
        if (event_match(criterion, n))
        {
            killme.push_back(n);

            /*
              If this event was a signal handler and no other handler handles
              the specified signal type, do not handle that type of signal any
              more.
            */
            if (n->type == EVENT_SIGNAL)
            {
                event_t e = event_t::signal_event(n->param1.signal);
                if (event_get(&e, 0) == 1)
                {
                    signal_handle(e.param1.signal, 0);
                }
            }
        }
        else
        {
            new_list.push_back(n);
        }
    }
    signal_block();
    events.swap(new_list);
    signal_unblock();
}
Esempio n. 4
0
void event_add_handler(const event_t &event) {
    event_t *e;

    if (debug_level >= 3) {
        wcstring desc = event_desc_compact(event);
        debug(3, "register: %ls\n", desc.c_str());
    }

    e = new event_t(event);
    if (e->type == EVENT_SIGNAL) {
        signal_handle(e->param1.signal, 1);
        set_signal_observed(e->param1.signal, true);
    }

    s_event_handlers.push_back(e);
}
Esempio n. 5
0
// Runs the appropriate action for each queued event
void event_process()
{
  Event event;

  while (kl_shift(Event, event_queue, &event) == 0) {
    switch (event.type) {
      case kEventSignal:
        signal_handle(event);
        break;
      case kEventJobActivity:
        job_handle(event);
        break;
      default:
        abort();
    }
  }
}
Esempio n. 6
0
void event_add_handler(const event_t *event)
{
    event_t *e;

    CHECK(event,);

    e = event_copy(event, 0);

    if (e->type == EVENT_SIGNAL)
    {
        signal_handle(e->param1.signal, 1);
    }

    // Block around updating the events vector
    signal_block();
    events.push_back(e);
    signal_unblock();
}
Esempio n. 7
0
// Runs the appropriate action for each queued event
void event_process(bool deferred)
{
  Event event;

  while (kl_shift(Event, get_queue(deferred), &event) == 0) {
    switch (event.type) {
      case kEventSignal:
        signal_handle(event);
        break;
      case kEventRStreamData:
        rstream_read_event(event);
        break;
      case kEventJobExit:
        job_exit_event(event);
        break;
      default:
        abort();
    }
  }
}
Esempio n. 8
0
// Runs the appropriate action for each queued event
static void process_all_events()
{
  EventNode *next;
  Event *event;

  while (has_pending_events()) {
    next = head->next;
    event = head->event;
    free(head);
    head = next;

    switch (event->type) {
      case kEventSignal:
        signal_handle(event);
        break;
      default:
        abort();
    }

  }
}
Esempio n. 9
0
void event_add_handler(const event_t &event)
{
    event_t *e;

    if (debug_level >= 3)
    {
        wcstring desc = event_desc_compact(event);
        debug(3, "register: %ls\n", desc.c_str());
    }

    e = new event_t(event);

    if (e->type == EVENT_SIGNAL)
    {
        signal_handle(e->param1.signal, 1);
    }

    // Block around updating the events vector
    signal_block();
    events.push_back(e);
    signal_unblock();
}
Esempio n. 10
0
void
ISR_syscall(interrupt_frame frame)
{
    UPDATE(&frame);
    va_list ap;
    syscall_result_t result;
    thread_t *thisthr = curthread;
    irq_enable();

    mem_zero(&result, sizeof(result));
    ap = (va_list) (frame.f_esp + 16);
    thisthr->thr_flags |= THREAD_SYSCALL;


    syscall(thisthr, frame.f_eax, &result, ap);
    thisthr->thr_flags &= ~THREAD_SYSCALL;

    signal_handle(thisthr);

    // result
    frame.f_eax = result.result;
    frame.f_ecx = result.errno;
}
Esempio n. 11
0
File: event.c Progetto: antmd/neovim
// Runs the appropriate action for each queued event
bool event_process(bool deferred)
{
  bool processed_events = false;
  Event event;

  while (kl_shift(Event, get_queue(deferred), &event) == 0) {
    processed_events = true;
    switch (event.type) {
      case kEventSignal:
        signal_handle(event);
        break;
      case kEventRStreamData:
        rstream_read_event(event);
        break;
      case kEventJobExit:
        job_exit_event(event);
        break;
      default:
        abort();
    }
  }

  return processed_events;
}
Esempio n. 12
0
static void
sigpipe_ignore()
{
  signal_handle(SIGPIPE, SIG_IGN);
}
Esempio n. 13
0
static void
sigchld_trampoline()
{
  signal_handle(SIGCHLD, _trampoline);
}