diff --git a/src/tests/add-ons/kernel/file_systems/fs_shell/fsh.c b/src/tests/add-ons/kernel/file_systems/fs_shell/fsh.c index 1cebca7d5d..23784c896f 100644 --- a/src/tests/add-ons/kernel/file_systems/fs_shell/fsh.c +++ b/src/tests/add-ons/kernel/file_systems/fs_shell/fsh.c @@ -1061,26 +1061,66 @@ do_sync(int argc, char **argv) } -void *gQueryCookie = NULL; +#define MAX_LIVE_QUERIES 10 +void *gQueryCookie[MAX_LIVE_QUERIES] = {NULL}; +char *gQueryString[MAX_LIVE_QUERIES] = {NULL}; + + +static void +do_listqueries(int argc, char **argv) +{ + int min, max; + + if (argc == 2) + min = max = atol(argv[1]); + else { + min = 0; + max = MAX_LIVE_QUERIES - 1; + } + + // list all queries (or only the one asked for) + + for (; min <= max; min++) { + if (gQueryCookie[min] == NULL) + continue; + + printf("%ld. (%p) %s\n", min, gQueryCookie[min], gQueryString[min]); + } +} static void do_stopquery(int argc, char **argv) { int err; + int min, max; if (gQueryCookie == NULL) { printf("no query running (use the 'startquery' command to start a query).\n"); return; } - err = sys_close_query(true, -1, "/myfs/.", gQueryCookie); - if (err < 0) { - printf("could not close query: %s\n", strerror(err)); - return; + if (argc == 2) + min = max = atol(argv[1]); + else { + min = 0; + max = MAX_LIVE_QUERIES - 1; } - gQueryCookie = NULL; + // close all queries (or only the one asked for) + + for (; min <= max; min++) { + if (gQueryCookie[min] == NULL) + continue; + + err = sys_close_query(true, -1, "/myfs/.", gQueryCookie[min]); + if (err < 0) { + printf("could not close query: %s\n", strerror(err)); + return; + } + gQueryCookie[min] = NULL; + free(gQueryString[min]); + } } @@ -1088,10 +1128,17 @@ static void do_startquery(int argc, char **argv) { char *query; + int freeSlot; int err; - if (gQueryCookie != NULL) - do_stopquery(0, NULL); + for (freeSlot = 0; freeSlot < MAX_LIVE_QUERIES; freeSlot++) { + if (gQueryCookie[freeSlot] == NULL) + break; + } + if (freeSlot == MAX_LIVE_QUERIES) { + printf("All query slots are used, stop some\n"); + return; + } if (argc != 2) { printf("query string expected\n"); @@ -1099,12 +1146,14 @@ do_startquery(int argc, char **argv) } query = argv[1]; - err = sys_open_query(true, -1, "/myfs/.", query, B_LIVE_QUERY, &gQueryCookie); + err = sys_open_query(true, -1, "/myfs/.", query, B_LIVE_QUERY, freeSlot, freeSlot, &gQueryCookie[freeSlot]); if (err < 0) { printf("could not open query: %s\n", strerror(err)); return; - } else - printf("query started - use the 'stopquery' command to stop it.\n"); + } + + printf("query number %ld started - use the 'stopquery' command to stop it.\n", freeSlot); + gQueryString[freeSlot] = strdup(query); } @@ -1124,7 +1173,7 @@ do_query(int argc, char **argv) } query = argv[1]; - err = sys_open_query(true, -1, "/myfs/.", query, 0, &cookie); + err = sys_open_query(true, -1, "/myfs/.", query, 0, 42, 42, &cookie); if (err < 0) { printf("could not open query: %s\n", strerror(err)); return; @@ -1357,6 +1406,7 @@ cmd_entry fsh_cmds[] = { "query", do_query, "run a query on the file system" }, { "startquery", do_startquery, "run a live query on the file system" }, { "stopquery", do_stopquery, "stops the live query" }, + { "lsquery", do_listqueries, "list all live queries" }, { "ioctl", do_ioctl, "execute ioctl() without an inode (okay, with the root node)" }, { "fcntl", do_fcntl, "execute ioctl() with the active inode" }, { "cptest", do_copytest, "copies all files from the given path" }, diff --git a/src/tests/add-ons/kernel/file_systems/fs_shell/kernel.c b/src/tests/add-ons/kernel/file_systems/fs_shell/kernel.c index 621f800893..bc7ded1f49 100644 --- a/src/tests/add-ons/kernel/file_systems/fs_shell/kernel.c +++ b/src/tests/add-ons/kernel/file_systems/fs_shell/kernel.c @@ -1827,7 +1827,7 @@ error1: int -sys_open_query(bool kernel, int fd, const char *path, const char *query, ulong flags, void **cookie) +sys_open_query(bool kernel, int fd, const char *path, const char *query, ulong flags, port_id port, ulong token, void **cookie) { int err; nspace *ns; @@ -1848,7 +1848,7 @@ sys_open_query(bool kernel, int fd, const char *path, const char *query, ulong f dec_vnode(root, FALSE); return EPERM; } - err = (*fs->ops.open_query)(ns->data, query, flags, -1, 0, cookie); + err = (*fs->ops.open_query)(ns->data, query, flags, port, token, cookie); printf("sys_open_query() -- end: %d\n",err); dec_vnode(root, FALSE); @@ -3203,7 +3203,7 @@ notify_listener(int op, nspace_id nsid, vnode_id vnida, vnode_id vnidb, vnode_id text = "unknown operation..."; break; } - printf("notify_listener: %s\n",text); + printf("notify_listener: %s\n", text); #endif return 0; } @@ -3211,11 +3211,12 @@ notify_listener(int op, nspace_id nsid, vnode_id vnida, vnode_id vnidb, vnode_id int send_notification(port_id port, long token, ulong what, long op, nspace_id nsida, - nspace_id nsidb, vnode_id vnida,vnode_id vnidb, vnode_id vnidc, + nspace_id nsidb, vnode_id vnida, vnode_id vnidb, vnode_id vnidc, const char *name) { #ifdef DEBUG - printf("send_notification... op = %s, name = %s\n",op == B_ENTRY_CREATED ? "B_ENTRY_CREATED" : "B_ENTRY_REMOVED",name); + printf("send_notification... op = %s, name = %s, port = %ld, token = %ld\n", + op == B_ENTRY_CREATED ? "B_ENTRY_CREATED" : "B_ENTRY_REMOVED", name, port, token); #endif return 0; } diff --git a/src/tests/add-ons/kernel/file_systems/fs_shell/kprotos.h b/src/tests/add-ons/kernel/file_systems/fs_shell/kprotos.h index 41a5c607e9..2d02122b00 100644 --- a/src/tests/add-ons/kernel/file_systems/fs_shell/kprotos.h +++ b/src/tests/add-ons/kernel/file_systems/fs_shell/kprotos.h @@ -43,7 +43,7 @@ ssize_t sys_read_attr(bool kernel, int fd, const char *name, int type, void *buf ssize_t sys_write_attr(bool kernel, int fd, const char *name, int type, void *buffer, size_t len, off_t pos); ssize_t sys_remove_attr(bool kernel, int fd, const char *name); -int sys_open_query(bool kernel, int fd, const char *path, const char *query, ulong flags, void **cookie); +int sys_open_query(bool kernel, int fd, const char *path, const char *query, ulong flags, port_id port, ulong token, void **cookie); int sys_close_query(bool kernel, int fd, const char *path, void *cookie); int sys_read_query(bool kernel, int fd, const char *path, void *cookie,struct dirent *dent,size_t bufferSize,long num);