| /* |
| * QEMU file monitor helper |
| * |
| * Copyright (c) 2018 Red Hat, Inc. |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, see <http://www.gnu.org/licenses/>. |
| * |
| */ |
| |
| #ifndef QEMU_FILEMONITOR_H |
| #define QEMU_FILEMONITOR_H |
| |
| |
| |
| typedef struct QFileMonitor QFileMonitor; |
| |
| typedef enum { |
| /* File has been created in a dir */ |
| QFILE_MONITOR_EVENT_CREATED, |
| /* File has been modified in a dir */ |
| QFILE_MONITOR_EVENT_MODIFIED, |
| /* File has been deleted in a dir */ |
| QFILE_MONITOR_EVENT_DELETED, |
| /* File has attributes changed */ |
| QFILE_MONITOR_EVENT_ATTRIBUTES, |
| /* Dir is no longer being monitored (due to deletion) */ |
| QFILE_MONITOR_EVENT_IGNORED, |
| } QFileMonitorEvent; |
| |
| |
| /** |
| * QFileMonitorHandler: |
| * @id: id from qemu_file_monitor_add_watch() |
| * @event: the file change that occurred |
| * @filename: the name of the file affected |
| * @opaque: opaque data provided to qemu_file_monitor_add_watch() |
| * |
| * Invoked whenever a file changes. If @event is |
| * QFILE_MONITOR_EVENT_IGNORED, @filename will be |
| * empty. |
| * |
| */ |
| typedef void (*QFileMonitorHandler)(int64_t id, |
| QFileMonitorEvent event, |
| const char *filename, |
| void *opaque); |
| |
| /** |
| * qemu_file_monitor_new: |
| * @errp: pointer to a NULL-initialized error object |
| * |
| * Create a handle for a file monitoring object. |
| * |
| * This object does locking internally to enable it to be |
| * safe to use from multiple threads |
| * |
| * If the platform does not support file monitoring, an |
| * error will be reported. Likewise if file monitoring |
| * is supported, but cannot be initialized |
| * |
| * Currently this is implemented on Linux platforms with |
| * the inotify subsystem. |
| * |
| * Returns: the new monitoring object, or NULL on error |
| */ |
| QFileMonitor *qemu_file_monitor_new(Error **errp); |
| |
| /** |
| * qemu_file_monitor_free: |
| * @mon: the file monitor context |
| * |
| * Free resources associated with the file monitor, |
| * including any currently registered watches. |
| */ |
| void qemu_file_monitor_free(QFileMonitor *mon); |
| |
| /** |
| * qemu_file_monitor_add_watch: |
| * @mon: the file monitor context |
| * @dirpath: the directory whose contents to watch |
| * @filename: optional filename to filter on |
| * @cb: the function to invoke when @dirpath has changes |
| * @opaque: data to pass to @cb |
| * @errp: pointer to a NULL-initialized error object |
| * |
| * Register to receive notifications of changes |
| * in the directory @dirpath. All files in the |
| * directory will be monitored. If the caller is |
| * only interested in one specific file, @filename |
| * can be used to filter events. |
| * |
| * Returns: a positive integer watch ID, or -1 on error |
| */ |
| int64_t qemu_file_monitor_add_watch(QFileMonitor *mon, |
| const char *dirpath, |
| const char *filename, |
| QFileMonitorHandler cb, |
| void *opaque, |
| Error **errp); |
| |
| /** |
| * qemu_file_monitor_remove_watch: |
| * @mon: the file monitor context |
| * @dirpath: the directory whose contents to unwatch |
| * @id: id of the watch to remove |
| * |
| * Removes the file monitoring watch @id, associated |
| * with the directory @dirpath. This must never be |
| * called from a QFileMonitorHandler callback, or a |
| * deadlock will result. |
| */ |
| void qemu_file_monitor_remove_watch(QFileMonitor *mon, |
| const char *dirpath, |
| int64_t id); |
| |
| #endif /* QEMU_FILEMONITOR_H */ |