1#include "tracker.h" 2#include "kprotos.h" 3 4//#include <map> 5#include <stdio.h> 6 7 8port_id gTrackerPort; 9 10 11/*static void 12tracker_query_attributes(dev_t device, ino_t node, char *name) 13{ 14} 15*/ 16 17static void 18tracker_query_file(dev_t device, ino_t parent, char *name) 19{ 20 if (name == NULL || parent == 0) 21 return; 22 23 int fd = sys_open_entry_ref(1, device, parent, name, O_RDONLY, 0); 24 if (fd < 0) { 25 printf("tracker: could not open file: %s\n", name); 26 return; 27 } 28 29 struct my_stat stat; 30 int status = sys_rstat(true, fd, NULL, &stat, 1); 31 if (status < 0) { 32 printf("tracker: could not stat file: %s\n", name); 33 } 34 35 sys_close(true, fd); 36} 37 38#if 0 39static void 40tracker_scan_files(void) 41{ 42} 43#endif 44 45extern "C" int32 46tracker_loop(void *data) 47{ 48 // create global messaging port 49 50 gTrackerPort = create_port(128, "fsh tracker port"); 51 if (gTrackerPort < FS_OK) 52 return gTrackerPort; 53 54 while (true) { 55 update_message message; 56 int32 code; 57 status_t status = read_port(gTrackerPort, &code, &message, sizeof(message)); 58 if (status < FS_OK) 59 continue; 60 61 if (code == FSH_KILL_TRACKER) 62 break; 63 64 if (code == FSH_NOTIFY_LISTENER) { 65 printf("tracker: notify listener received\n"); 66 if (message.op != B_ATTR_CHANGED && message.op != B_DEVICE_UNMOUNTED) 67 tracker_query_file(message.device, message.parentNode, message.name); 68 } else if (code == B_QUERY_UPDATE) { 69 printf("tracker: query update received\n"); 70 tracker_query_file(message.device, message.parentNode, message.name); 71 } else { 72 printf("tracker: unknown code received: 0x%lx\n", code); 73 } 74 } 75 76 delete_port(gTrackerPort); 77 return FS_OK; 78} 79