pt_info_t * pt_investigate_kevent (process_tracker_t * pt, struct kevent * ke)
{
    pt_info_t * result;
    pt_info_t info;

    if (ke->filter != EVFILT_PROC)
        goto no_result;

    if (ke->fflags & NOTE_CHILD)
    {
        printf ("new pid %d has %d as parent\n", ke->ident, ke->data);
        info.event = PT_CHILD;
        info.pid = ke->ident;
        info.ppid = ke->data;

        pid_list_add (pt->pids, pid_new_p (ke->ident));

        goto result;
    }
    if (ke->fflags & NOTE_EXIT)
    {
        pid_list_iterator it;

        printf ("pid %d exited\n", ke->ident);
        info.event = PT_EXIT;
        info.pid = ke->ident;
        info.ppid = 0;
        info.flags = ke->data;

        for (it = pid_list_begin (pt->pids); it != NULL;
                pid_list_iterator_next (&it))
        {
            if (*it->val == ke->ident)
                goto found;
        }

        goto result;

found:
        free (it->val);
        pid_list_del (pt->pids, it->val);
        goto result;
    }

no_result:
    return 0;

result:
    result = malloc (sizeof (pt_info_t));
    *result = info;
    return result;
}
Exemple #2
0
void unit_deregister_pid (unit_t * unit, pid_t pid)
{
    for (pid_list_iterator it = pid_list_begin (unit->pids); it != NULL;
         pid_list_iterator_next (&it))
    {
        if (*it->val == pid)
        {
            pid_t * tofree = it->val;
            pid_list_del (unit->pids, it->val);
            pt_disregard_pid (Manager.ptrack, pid);
            s16mem_free (tofree);
            return;
        }
    }
}
void pt_disregard_pid (process_tracker_t * pt, pid_t pid)
{
    pid_list_iterator it;

    for (it = pid_list_begin (pt->pids); it != NULL;
         pid_list_iterator_next (&it))
    {
        if (*it->val == pid)
        {
            s16mem_free (it->val);
            pid_list_del (pt->pids, it->val);
            break;
        }
    }

    return;
}
void pt_disregard_pid (process_tracker_t * pt, pid_t pid)
{
    struct kevent ke;
    pid_list_iterator it;

    EV_SET (&ke, pid, EVFILT_PROC, EV_ADD, NOTE_EXIT | NOTE_TRACK, 0, NULL);
    kevent (pt->kq, &ke, 1, NULL, 0, NULL);

    for (it = pid_list_begin (pt->pids); it != NULL;
            pid_list_iterator_next (&it))
    {
        if (*it->val == pid)
            goto found;
    }

    return;

found:
    free (it->val);
    pid_list_del (pt->pids, it->val);
}