void watch_events(void) { GNode *modified_directory, *removed_file; File *new_file; gboolean refresh_request = FALSE; struct timeval time; struct inotify_event *event; int n, i; fd_set fds; CHECK_INOTIFY_ENABLED(); again: time.tv_sec = 0; time.tv_usec = 0; FD_ZERO(&fds); FD_SET(inotify_descriptor, &fds); while ((n = select(inotify_descriptor + 1, &fds, NULL, NULL, &time)) == 1) { again2: if ((n = read(inotify_descriptor, events_buffer, BUFFER_LENGTH)) > 0) { for (i = 0; i < n; i += sizeof(struct inotify_event) + event->len) { event = (struct inotify_event *) (events_buffer + i); if (debug_inotify == TRUE) dump_event(event); modified_directory = (GNode *) g_hash_table_lookup( watches_table, &(event->wd)); if (event->mask & IN_CREATE || event->mask & IN_MOVED_TO) { if ((new_file = create_new_file(event->name, get_path(modified_directory), FALSE)) != NULL) refresh_request |= insert_in_tree(modified_directory, new_file); } else if (event->mask & IN_DELETE || event->mask & IN_MOVED_FROM) { if ((removed_file = search_node_by_name(modified_directory, event->name)) != NULL) refresh_request |= remove_from_tree(removed_file, FALSE); } else if (event->mask & IN_UNMOUNT) { refresh_request |= remove_from_tree(modified_directory, TRUE); } } } else if (n == -1) { if (errno == EINTR) goto again2; else PRINT_ERRNO_AND_EXIT(); } } if (n == -1) { if (errno == EINTR) goto again; else PRINT_ERRNO_AND_EXIT(); } if (refresh_request == TRUE) refresh_screen(); }
int main(){ Tree * tree; /*Tree ADT - holds integer values in AVL tree being tested*/ int * entry; /*Temporary variable when adding to, removing from and searching tree*/ int * result; /*Result of search*/ int i; /*Controls loops*/ tree = init_tree(&compare, &compare, &destroy, &print, &collision); printf("Adding the numbers to the tree in an out of sequence order :\n"); for (i = 0; i < 12; i++){ entry = malloc(sizeof(int)); *entry = (3 * i) % 10; printf("%d, ", *entry); tree = add_to_tree(tree, entry); } putchar('\n'); printf("Repeated some entries to test collision resolution.\n"); printf("Tree after insertions.\n"); print_tree(tree); for (i = 0; i < 10; i = i + 3){ entry = malloc(sizeof(int)); *entry = i; remove_from_tree(tree, entry); free(entry); printf("%d is removed...\n", i); print_tree(tree); putchar('\n'); } printf("Testing search_tree_closest...\n"); printf("Searching for 3 (no longer in tree), should return 4.\n"); entry = malloc(sizeof(int)); *entry = 3; result = search_tree_closest(tree, entry); printf("Returned : %d\n", *result); free(entry); printf("Note : Because the search_tree_closest function works, \n"); printf("it follows that the search_tree function must also work.\n"); printf("In the context of only integers, this function doesn't \n"); printf("really make sense though.\n"); printf("Destroying tree...\n"); destroy_tree(tree); printf("\n\nAll tests passed.\n"); return 0; }