Exemplo n.º 1
0
/*
 * Start monitoring a directory.
 * We store the DirInfo pointer as the userdata in the kevent.
 */
static int monitor_start(FAMConnection *fc, DirInfo *dir)
{
    int code;
    kevent_t *kev;

#ifdef FAM_DEBUG
    fprintf(stderr, "Monitoring directory %s\n", dir->name);
    fflush(stderr);
#endif
    code = -1;
    if ((kev = new_kevent())) {
        dir->kevent = kev;
        /* Register interest in the MON_FLAGS flags of the dir */
        EV_SET(kev, dir->handle, EVFILT_VNODE, EV_ADD | EV_CLEAR, MON_FLAGS,
                (intptr_t) NULL, (kqueue_udata_t) dir);
        code = kevent(fc->id, kev, 1, NULL, 0, &gTime0);
#ifdef FAM_DEBUG
        fprintf(stderr,
                "  Directory id: %d\n"
                "  kevent code: %d\n", dir->handle, code);
        fflush(stderr);
#endif
    }
    if(code < 0)
    {
        if(kev)
        {
            free(kev);
            dir->kevent = NULL;
        }
        perror("monitor_start");
    }
    return code;
}
Exemplo n.º 2
0
/*
 * Poll for an event and put any on the fc->event list
 */
static int poll_kevent(FAMConnection *fc, struct timespec *timeptr)
{
    int result, more_events=1;
    FAMEvent *fevent;
    kevent_t *kev;

#ifdef FAM_DEBUG
    fprintf(stderr, "Polling FAM Connection\n");
    fflush(stderr);
#endif

    if ((kev = new_kevent())) {
        result = kevent( fc->id, NULL, 0, kev, 1, timeptr );
        if(result == 0) {
            free(kev);
            return 0;
        } else if(result < 0) {
            free(kev);
            switch(errno) {
                case EACCES:
                    FAMErrno = FAM_PERMISSION_DENIED;
                    break;
                case ENOMEM:
                    FAMErrno = FAM_OUT_OF_MEMORY;
                    break;
                default:
                    FAMErrno = FAM_UNKNOWN_ERROR;
            };
            return -1;
        }

        /* Convert each possible event flag to a FAM event */
        if(kev->fflags & MEMBER_CHANGED_FLAGS) {
            if (add_famevent_of_kevent( fc, kev, FAMDirectoryChanged ) == 0)
                goto poll_error;
        };
        if(kev->fflags & NOTE_DELETE) {
            if (add_famevent_of_kevent( fc, kev, FAMDeleted ) == 0)
                goto poll_error;
        };
        if(kev->fflags & NOTE_RENAME) {
            if (add_famevent_of_kevent( fc, kev, FAMMoved ) == 0)
                goto poll_error;
        };
        if(kev->fflags & NOTE_REVOKE) { /* Lost access */
            if (add_famevent_of_kevent( fc, kev, FAMDeleted ) == 0)
                goto poll_error;
        };
        if(kev->fflags & NOTE_ATTRIB) {
            if (add_famevent_of_kevent( fc, kev, FAMChanged ) == 0)
                goto poll_error;
        };
        free(kev);
        return 1;
poll_error:
        free(kev);
    }
    FAMErrno = FAM_OUT_OF_MEMORY;
    return -1;
}