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