/* * 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; }
/* * 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; }