vcpe/srcs/libs/fs_watch/fs_mon.c

106 lines
2.8 KiB
C

//
// Created by xajhuang on 2023/2/9.
//
#include <uv.h>
#include "uthash/uthash.h"
#include "misc.h"
#include "user_errno.h"
#include "zlog_module.h"
#include "task_manager.h"
#include "fs_watch.h"
typedef struct {
char watchPath[MAX_PATH];
watch_cb pCb;
uv_fs_event_t *uv_event;
UT_hash_handle hh; ///< UT Hash handle
} WATCH_CONTENT, *PWATCH_CONTENT;
PWATCH_CONTENT g_watchContent = NULL;
static void monitor_cb(uv_fs_event_t *handle, const char *filename, int events, int status) {
PWATCH_CONTENT pCtx = (PWATCH_CONTENT)handle->data;
char path[1024];
size_t size = 1023;
uv_fs_event_getpath(handle, path, &size);
path[size] = '\0';
if (pCtx && pCtx->pCb) {
pCtx->pCb(path, filename, events, pCtx->watchPath);
}
#if 1
fprintf(stderr, "Change detected in %s: ", path);
if (events & UV_RENAME) {
fprintf(stderr, "renamed");
}
if (events & UV_CHANGE) {
fprintf(stderr, "changed");
}
fprintf(stderr, " %s\n", filename ? filename : "");
#endif
}
int add_watch_path(const char *pFsPath, watch_cb cb) {
PWATCH_CONTENT pCtx;
if (cb == NULL || pFsPath == NULL || !file_exists(pFsPath)) {
LOG_MOD(debug, ZLOG_MOD_WATCH, "Watch path [%s] notify function <%p>\n", pFsPath ? pFsPath : "<NULL>", cb);
return -ERR_INPUT_PARAMS;
}
HASH_FIND_STR(g_watchContent, pFsPath, pCtx);
if (pCtx != NULL) {
return -ERR_ITEM_EXISTS;
}
pCtx = (PWATCH_CONTENT)malloc(sizeof(WATCH_CONTENT));
if (pCtx == NULL) {
LOG_MOD(error, ZLOG_MOD_WATCH, "Malloc memory error of %ld size\n", sizeof(WATCH_CONTENT));
return -ERR_MALLOC_MEMORY;
}
pCtx->uv_event = (uv_fs_event_t *)malloc(sizeof(uv_fs_event_t));
if (pCtx->uv_event == NULL) {
LOG_MOD(error, ZLOG_MOD_WATCH, "Malloc memory error of %ld size\n", sizeof(uv_fs_event_t));
free(pCtx);
return -ERR_MALLOC_MEMORY;
}
memset(pCtx, 0, sizeof(WATCH_CONTENT));
strcpy(pCtx->watchPath, pFsPath);
pCtx->pCb = cb;
pCtx->uv_event->data = pCtx;
uv_fs_event_init(get_task_manager(), pCtx->uv_event);
uv_fs_event_start(pCtx->uv_event, monitor_cb, pFsPath, UV_FS_EVENT_RECURSIVE);
HASH_ADD_STR(g_watchContent, watchPath, pCtx);
return ERR_SUCCESS;
}
int remove_watch_path(const char *pFsPath) {
PWATCH_CONTENT pCtx;
if (pFsPath == NULL || !file_exists(pFsPath)) {
LOG_MOD(debug, ZLOG_MOD_WATCH, "Remove Watch path [%s]\n", pFsPath ? pFsPath : "<NULL>");
return -ERR_INPUT_PARAMS;
}
HASH_FIND_STR(g_watchContent, pFsPath, pCtx);
if (pCtx != NULL) {
HASH_DEL(g_watchContent, pCtx);
uv_fs_event_stop(pCtx->uv_event);
free(pCtx->uv_event);
free(pCtx);
}
return ERR_SUCCESS;
}