diff options
Diffstat (limited to 'upstream/mageia-cauldron/man3/sd_event_add_inotify.3')
-rw-r--r-- | upstream/mageia-cauldron/man3/sd_event_add_inotify.3 | 286 |
1 files changed, 286 insertions, 0 deletions
diff --git a/upstream/mageia-cauldron/man3/sd_event_add_inotify.3 b/upstream/mageia-cauldron/man3/sd_event_add_inotify.3 new file mode 100644 index 00000000..cb5a643a --- /dev/null +++ b/upstream/mageia-cauldron/man3/sd_event_add_inotify.3 @@ -0,0 +1,286 @@ +'\" t +.TH "SD_EVENT_ADD_INOTIFY" "3" "" "systemd 255" "sd_event_add_inotify" +.\" ----------------------------------------------------------------- +.\" * Define some portability stuff +.\" ----------------------------------------------------------------- +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.\" http://bugs.debian.org/507673 +.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" ----------------------------------------------------------------- +.\" * set default formatting +.\" ----------------------------------------------------------------- +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.\" ----------------------------------------------------------------- +.\" * MAIN CONTENT STARTS HERE * +.\" ----------------------------------------------------------------- +.SH "NAME" +sd_event_add_inotify, sd_event_add_inotify_fd, sd_event_source_get_inotify_mask, sd_event_inotify_handler_t \- Add an "inotify" file system inode event source to an event loop +.SH "SYNOPSIS" +.sp +.ft B +.nf +#include <systemd/sd\-event\&.h> +.fi +.ft +.sp +.ft B +.nf +typedef struct sd_event_source sd_event_source; +.fi +.ft +.HP \w'typedef\ int\ (*sd_event_inotify_handler_t)('u +.BI "typedef int (*sd_event_inotify_handler_t)(sd_event_source\ *" "s" ", const\ struct\ inotify_event\ *" "event" ", void\ *" "userdata" ");" +.HP \w'int\ sd_event_add_inotify('u +.BI "int sd_event_add_inotify(sd_event\ *" "event" ", sd_event_source\ **" "source" ", const\ char\ *" "path" ", uint32_t\ " "mask" ", sd_event_inotify_handler_t\ " "handler" ", void\ *" "userdata" ");" +.HP \w'int\ sd_event_add_inotify_fd('u +.BI "int sd_event_add_inotify_fd(sd_event\ *" "event" ", sd_event_source\ **" "source" ", int\ " "fd" ", uint32_t\ " "mask" ", sd_event_inotify_handler_t\ " "handler" ", void\ *" "userdata" ");" +.HP \w'int\ sd_event_source_get_inotify_mask('u +.BI "int sd_event_source_get_inotify_mask(sd_event_source\ *" "source" ", uint32_t\ *" "mask" ");" +.SH "DESCRIPTION" +.PP +\fBsd_event_add_inotify()\fR +adds a new +\fBinotify\fR(7) +file system inode event source to an event loop\&. The event loop object is specified in the +\fIevent\fR +parameter, the event source object is returned in the +\fIsource\fR +parameter\&. The +\fIpath\fR +parameter specifies the path of the file system inode to watch\&. The +\fImask\fR +parameter specifies which types of inode events to watch specifically\&. It must contain an OR\-ed combination of +\fBIN_ACCESS\fR, +\fBIN_ATTRIB\fR, +\fBIN_CLOSE_WRITE\fR, \&... flags\&. See +\fBinotify\fR(7) +for further information\&. +.PP +The +\fIhandler\fR +must reference a function to call when the inode changes or +\fBNULL\fR\&. The handler function will be passed the +\fIuserdata\fR +pointer, which may be chosen freely by the caller\&. The handler also receives a pointer to a +struct inotify_event +structure containing information about the inode event\&. The handler may return negative to signal an error (see below), other return values are ignored\&. If +\fIhandler\fR +is +\fBNULL\fR, a default handler that calls +\fBsd_event_exit\fR(3) +will be used\&. +.PP +\fBsd_event_add_inotify_fd()\fR +is identical to +\fBsd_event_add_inotify()\fR, except that it takes a file descriptor to an inode (possibly an +\fBO_PATH\fR +one, but any other will do too) instead of a path in the file system\&. +.PP +If multiple event sources are installed for the same inode the backing inotify watch descriptor is automatically shared\&. The mask parameter may contain any flag defined by the inotify API, with the exception of +\fBIN_MASK_ADD\fR\&. +.PP +The handler is enabled continuously (\fBSD_EVENT_ON\fR), but this may be changed with +\fBsd_event_source_set_enabled\fR(3)\&. Alternatively, the +\fBIN_ONESHOT\fR +mask flag may be used to request +\fBSD_EVENT_ONESHOT\fR +mode\&. If the handler function returns a negative error code, it will be disabled after the invocation, even if the +\fBSD_EVENT_ON\fR +mode was requested before\&. +.PP +As a special limitation the priority of inotify event sources may only be altered (see +\fBsd_event_source_set_priority\fR(3)) in the time between creation of the event source object with +\fBsd_event_add_inotify()\fR +and the beginning of the next event loop iteration\&. Attempts of changing the priority any later will be refused\&. Consider freeing and allocating a new inotify event source to change the priority at that point\&. +.PP +To destroy an event source object use +\fBsd_event_source_unref\fR(3), but note that the event source is only removed from the event loop when all references to the event source are dropped\&. To make sure an event source does not fire anymore, even when there\*(Aqs still a reference to it kept, consider disabling it with +\fBsd_event_source_set_enabled\fR(3)\&. +.PP +If the second parameter of +\fBsd_event_add_inotify()\fR +is passed as +\fBNULL\fR +no reference to the event source object is returned\&. In this case the event source is considered "floating", and will be destroyed implicitly when the event loop itself is destroyed\&. +.PP +If the +\fIhandler\fR +parameter to +\fBsd_event_add_inotify()\fR +is +\fBNULL\fR, and the event source fires, this will be considered a request to exit the event loop\&. In this case, the +\fIuserdata\fR +parameter, cast to an integer, is passed as the exit code parameter to +\fBsd_event_exit\fR(3)\&. +.PP +\fBsd_event_source_get_inotify_mask()\fR +retrieves the configured inotify watch mask of an event source created previously with +\fBsd_event_add_inotify()\fR\&. It takes the event source object as the +\fIsource\fR +parameter and a pointer to a +\fBuint32_t\fR +variable to return the mask in\&. +.SH "RETURN VALUE" +.PP +On success, these functions return 0 or a positive integer\&. On failure, they return a negative errno\-style error code\&. +.SS "Errors" +.PP +Returned errors may indicate the following problems: +.PP +\fB\-ENOMEM\fR +.RS 4 +Not enough memory to allocate an object\&. +.RE +.PP +\fB\-EINVAL\fR +.RS 4 +An invalid argument has been passed\&. This includes specifying a mask with +\fBIN_MASK_ADD\fR +set\&. +.RE +.PP +\fB\-ESTALE\fR +.RS 4 +The event loop is already terminated\&. +.RE +.PP +\fB\-ECHILD\fR +.RS 4 +The event loop has been created in a different process, library or module instance\&. +.RE +.PP +\fB\-EDOM\fR +.RS 4 +The passed event source is not an inotify process event source\&. +.RE +.PP +\fB\-EBADF\fR +.RS 4 +The passed file descriptor is not valid\&. +.sp +Added in version 250\&. +.RE +.PP +\fB\-ENOSYS\fR +.RS 4 +\fBsd_event_add_inotify_fd()\fR +was called without +/proc/ +mounted\&. +.sp +Added in version 250\&. +.RE +.SH "EXAMPLES" +.PP +\fBExample\ \&1.\ \&A simple program that uses inotify to monitor one or two directories\fR +.sp +.if n \{\ +.RS 4 +.\} +.nf +/* SPDX\-License\-Identifier: MIT\-0 */ + +#include <stdio\&.h> +#include <string\&.h> +#include <sys/inotify\&.h> + +#include <systemd/sd\-event\&.h> + +#define _cleanup_(f) __attribute__((cleanup(f))) + +static int inotify_handler(sd_event_source *source, + const struct inotify_event *event, + void *userdata) { + + const char *desc = NULL; + + sd_event_source_get_description(source, &desc); + + if (event\->mask & IN_Q_OVERFLOW) + printf("inotify\-handler <%s>: overflow\en", desc); + else if (event\->mask & IN_CREATE) + printf("inotify\-handler <%s>: create on %s\en", desc, event\->name); + else if (event\->mask & IN_DELETE) + printf("inotify\-handler <%s>: delete on %s\en", desc, event\->name); + else if (event\->mask & IN_MOVED_TO) + printf("inotify\-handler <%s>: moved\-to on %s\en", desc, event\->name); + + /* Terminate the program if an "exit" file appears */ + if ((event\->mask & (IN_CREATE|IN_MOVED_TO)) && + strcmp(event\->name, "exit") == 0) + sd_event_exit(sd_event_source_get_event(source), 0); + + return 1; +} + +int main(int argc, char **argv) { + _cleanup_(sd_event_unrefp) sd_event *event = NULL; + _cleanup_(sd_event_source_unrefp) sd_event_source *source1 = NULL, *source2 = NULL; + + const char *path1 = argc > 1 ? argv[1] : "/tmp"; + const char *path2 = argc > 2 ? argv[2] : NULL; + + /* Note: failure handling is omitted for brevity */ + + sd_event_default(&event); + + sd_event_add_inotify(event, &source1, path1, + IN_CREATE | IN_DELETE | IN_MODIFY | IN_MOVED_TO, + inotify_handler, NULL); + if (path2) + sd_event_add_inotify(event, &source2, path2, + IN_CREATE | IN_DELETE | IN_MODIFY | IN_MOVED_TO, + inotify_handler, NULL); + + sd_event_loop(event); + + return 0; +} +.fi +.if n \{\ +.RE +.\} +.SH "NOTES" +.PP +Functions described here are available as a shared library, which can be compiled against and linked to with the +\fBlibsystemd\fR\ \&\fBpkg-config\fR(1) +file\&. +.PP +The code described here uses +\fBgetenv\fR(3), which is declared to be not multi\-thread\-safe\&. This means that the code calling the functions described here must not call +\fBsetenv\fR(3) +from a parallel thread\&. It is recommended to only do calls to +\fBsetenv()\fR +from an early phase of the program when no other threads have been started\&. +.SH "HISTORY" +.PP +\fBsd_event_inotify_handler_t()\fR, +\fBsd_event_add_inotify()\fR, and +\fBsd_event_source_get_inotify_mask()\fR +were added in version 239\&. +.PP +\fBsd_event_add_inotify_fd()\fR +was added in version 250\&. +.SH "SEE ALSO" +.PP +\fBsystemd\fR(1), +\fBsd-event\fR(3), +\fBsd_event_new\fR(3), +\fBsd_event_now\fR(3), +\fBsd_event_add_io\fR(3), +\fBsd_event_add_time\fR(3), +\fBsd_event_add_signal\fR(3), +\fBsd_event_add_defer\fR(3), +\fBsd_event_add_child\fR(3), +\fBsd_event_source_set_enabled\fR(3), +\fBsd_event_source_set_priority\fR(3), +\fBsd_event_source_set_userdata\fR(3), +\fBsd_event_source_set_description\fR(3), +\fBsd_event_source_set_floating\fR(3), +\fBwaitid\fR(2) |