Blame src/systemd/src/systemd/sd-event.h

Packit Service 87a54e
/* SPDX-License-Identifier: LGPL-2.1-or-later */
Packit 5756e2
#ifndef foosdeventhfoo
Packit 5756e2
#define foosdeventhfoo
Packit 5756e2
Packit 5756e2
/***
Packit 5756e2
  systemd is free software; you can redistribute it and/or modify it
Packit 5756e2
  under the terms of the GNU Lesser General Public License as published by
Packit 5756e2
  the Free Software Foundation; either version 2.1 of the License, or
Packit 5756e2
  (at your option) any later version.
Packit 5756e2
Packit 5756e2
  systemd is distributed in the hope that it will be useful, but
Packit 5756e2
  WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 5756e2
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Packit 5756e2
  Lesser General Public License for more details.
Packit 5756e2
Packit 5756e2
  You should have received a copy of the GNU Lesser General Public License
Packit 5756e2
  along with systemd; If not, see <http://www.gnu.org/licenses/>.
Packit 5756e2
***/
Packit 5756e2
Packit 5756e2
#include <inttypes.h>
Packit 5756e2
#include <signal.h>
Packit 5756e2
#include <sys/epoll.h>
Packit 5756e2
#include <sys/inotify.h>
Packit 5756e2
#include <sys/signalfd.h>
Packit 5756e2
#include <sys/types.h>
Packit 5756e2
#include <sys/wait.h>
Packit 5756e2
#include <time.h>
Packit 5756e2
Packit 5756e2
#include "_sd-common.h"
Packit 5756e2
Packit 5756e2
/*
Packit 5756e2
  Why is this better than pure epoll?
Packit 5756e2
Packit 5756e2
  - Supports event source prioritization
Packit 5756e2
  - Scales better with a large number of time events because it does not require one timerfd each
Packit 5756e2
  - Automatically tries to coalesce timer events system-wide
Packit 5756e2
  - Handles signals, child PIDs, inotify events
Packit 5756e2
  - Supports systemd-style automatic watchdog event generation
Packit 5756e2
*/
Packit 5756e2
Packit 5756e2
_SD_BEGIN_DECLARATIONS;
Packit 5756e2
Packit 5756e2
#define SD_EVENT_DEFAULT ((sd_event *) 1)
Packit 5756e2
Packit 5756e2
typedef struct sd_event sd_event;
Packit 5756e2
typedef struct sd_event_source sd_event_source;
Packit 5756e2
Packit 5756e2
enum {
Packit 5756e2
        SD_EVENT_OFF = 0,
Packit 5756e2
        SD_EVENT_ON = 1,
Packit 5756e2
        SD_EVENT_ONESHOT = -1
Packit 5756e2
};
Packit 5756e2
Packit 5756e2
enum {
Packit 5756e2
        SD_EVENT_INITIAL,
Packit 5756e2
        SD_EVENT_ARMED,
Packit 5756e2
        SD_EVENT_PENDING,
Packit 5756e2
        SD_EVENT_RUNNING,
Packit 5756e2
        SD_EVENT_EXITING,
Packit 5756e2
        SD_EVENT_FINISHED,
Packit 5756e2
        SD_EVENT_PREPARING
Packit 5756e2
};
Packit 5756e2
Packit 5756e2
enum {
Packit 5756e2
        /* And everything in-between and outside is good too */
Packit 5756e2
        SD_EVENT_PRIORITY_IMPORTANT = -100,
Packit 5756e2
        SD_EVENT_PRIORITY_NORMAL = 0,
Packit 5756e2
        SD_EVENT_PRIORITY_IDLE = 100
Packit 5756e2
};
Packit 5756e2
Packit 5756e2
typedef int (*sd_event_handler_t)(sd_event_source *s, void *userdata);
Packit 5756e2
typedef int (*sd_event_io_handler_t)(sd_event_source *s, int fd, uint32_t revents, void *userdata);
Packit 5756e2
typedef int (*sd_event_time_handler_t)(sd_event_source *s, uint64_t usec, void *userdata);
Packit 5756e2
typedef int (*sd_event_signal_handler_t)(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata);
Packit 5756e2
#if defined _GNU_SOURCE || (defined _POSIX_C_SOURCE && _POSIX_C_SOURCE >= 199309L)
Packit 5756e2
typedef int (*sd_event_child_handler_t)(sd_event_source *s, const siginfo_t *si, void *userdata);
Packit 5756e2
#else
Packit 5756e2
typedef void* sd_event_child_handler_t;
Packit 5756e2
#endif
Packit 5756e2
typedef int (*sd_event_inotify_handler_t)(sd_event_source *s, const struct inotify_event *event, void *userdata);
Packit 5756e2
typedef _sd_destroy_t sd_event_destroy_t;
Packit 5756e2
Packit 5756e2
int sd_event_default(sd_event **e);
Packit 5756e2
Packit 5756e2
int sd_event_new(sd_event **e);
Packit 5756e2
sd_event* sd_event_ref(sd_event *e);
Packit 5756e2
sd_event* sd_event_unref(sd_event *e);
Packit 5756e2
Packit 5756e2
int sd_event_add_io(sd_event *e, sd_event_source **s, int fd, uint32_t events, sd_event_io_handler_t callback, void *userdata);
Packit 5756e2
int sd_event_add_time(sd_event *e, sd_event_source **s, clockid_t clock, uint64_t usec, uint64_t accuracy, sd_event_time_handler_t callback, void *userdata);
Packit 5756e2
int sd_event_add_time_relative(sd_event *e, sd_event_source **s, clockid_t clock, uint64_t usec, uint64_t accuracy, sd_event_time_handler_t callback, void *userdata);
Packit 5756e2
int sd_event_add_signal(sd_event *e, sd_event_source **s, int sig, sd_event_signal_handler_t callback, void *userdata);
Packit 5756e2
int sd_event_add_child(sd_event *e, sd_event_source **s, pid_t pid, int options, sd_event_child_handler_t callback, void *userdata);
Packit 5756e2
int sd_event_add_child_pidfd(sd_event *e, sd_event_source **s, int pidfd, int options, sd_event_child_handler_t callback, void *userdata);
Packit 5756e2
int sd_event_add_inotify(sd_event *e, sd_event_source **s, const char *path, uint32_t mask, sd_event_inotify_handler_t callback, void *userdata);
Packit 5756e2
int sd_event_add_defer(sd_event *e, sd_event_source **s, sd_event_handler_t callback, void *userdata);
Packit 5756e2
int sd_event_add_post(sd_event *e, sd_event_source **s, sd_event_handler_t callback, void *userdata);
Packit 5756e2
int sd_event_add_exit(sd_event *e, sd_event_source **s, sd_event_handler_t callback, void *userdata);
Packit 5756e2
Packit 5756e2
int sd_event_prepare(sd_event *e);
Packit 5756e2
int sd_event_wait(sd_event *e, uint64_t usec);
Packit 5756e2
int sd_event_dispatch(sd_event *e);
Packit 5756e2
int sd_event_run(sd_event *e, uint64_t usec);
Packit 5756e2
int sd_event_loop(sd_event *e);
Packit 5756e2
int sd_event_exit(sd_event *e, int code);
Packit 5756e2
Packit 5756e2
int sd_event_now(sd_event *e, clockid_t clock, uint64_t *usec);
Packit 5756e2
Packit 5756e2
int sd_event_get_fd(sd_event *e);
Packit 5756e2
int sd_event_get_state(sd_event *e);
Packit 5756e2
int sd_event_get_tid(sd_event *e, pid_t *tid);
Packit 5756e2
int sd_event_get_exit_code(sd_event *e, int *code);
Packit 5756e2
int sd_event_set_watchdog(sd_event *e, int b);
Packit 5756e2
int sd_event_get_watchdog(sd_event *e);
Packit 5756e2
int sd_event_get_iteration(sd_event *e, uint64_t *ret);
Packit 5756e2
Packit 5756e2
sd_event_source* sd_event_source_ref(sd_event_source *s);
Packit 5756e2
sd_event_source* sd_event_source_unref(sd_event_source *s);
Packit 5756e2
sd_event_source* sd_event_source_disable_unref(sd_event_source *s);
Packit 5756e2
Packit 5756e2
sd_event *sd_event_source_get_event(sd_event_source *s);
Packit 5756e2
void* sd_event_source_get_userdata(sd_event_source *s);
Packit 5756e2
void* sd_event_source_set_userdata(sd_event_source *s, void *userdata);
Packit 5756e2
Packit 5756e2
int sd_event_source_set_description(sd_event_source *s, const char *description);
Packit 5756e2
int sd_event_source_get_description(sd_event_source *s, const char **description);
Packit 5756e2
int sd_event_source_set_prepare(sd_event_source *s, sd_event_handler_t callback);
Packit 5756e2
int sd_event_source_get_pending(sd_event_source *s);
Packit 5756e2
int sd_event_source_get_priority(sd_event_source *s, int64_t *priority);
Packit 5756e2
int sd_event_source_set_priority(sd_event_source *s, int64_t priority);
Packit 5756e2
int sd_event_source_get_enabled(sd_event_source *s, int *enabled);
Packit 5756e2
int sd_event_source_set_enabled(sd_event_source *s, int enabled);
Packit 5756e2
int sd_event_source_get_io_fd(sd_event_source *s);
Packit 5756e2
int sd_event_source_set_io_fd(sd_event_source *s, int fd);
Packit 5756e2
int sd_event_source_get_io_fd_own(sd_event_source *s);
Packit 5756e2
int sd_event_source_set_io_fd_own(sd_event_source *s, int own);
Packit 5756e2
int sd_event_source_get_io_events(sd_event_source *s, uint32_t* events);
Packit 5756e2
int sd_event_source_set_io_events(sd_event_source *s, uint32_t events);
Packit 5756e2
int sd_event_source_get_io_revents(sd_event_source *s, uint32_t* revents);
Packit 5756e2
int sd_event_source_get_time(sd_event_source *s, uint64_t *usec);
Packit 5756e2
int sd_event_source_set_time(sd_event_source *s, uint64_t usec);
Packit 5756e2
int sd_event_source_set_time_relative(sd_event_source *s, uint64_t usec);
Packit 5756e2
int sd_event_source_get_time_accuracy(sd_event_source *s, uint64_t *usec);
Packit 5756e2
int sd_event_source_set_time_accuracy(sd_event_source *s, uint64_t usec);
Packit 5756e2
int sd_event_source_get_time_clock(sd_event_source *s, clockid_t *clock);
Packit 5756e2
int sd_event_source_get_signal(sd_event_source *s);
Packit 5756e2
int sd_event_source_get_child_pid(sd_event_source *s, pid_t *pid);
Packit 5756e2
int sd_event_source_get_child_pidfd(sd_event_source *s);
Packit 5756e2
int sd_event_source_get_child_pidfd_own(sd_event_source *s);
Packit 5756e2
int sd_event_source_set_child_pidfd_own(sd_event_source *s, int own);
Packit 5756e2
int sd_event_source_get_child_process_own(sd_event_source *s);
Packit 5756e2
int sd_event_source_set_child_process_own(sd_event_source *s, int own);
Packit 5756e2
#if defined _GNU_SOURCE || (defined _POSIX_C_SOURCE && _POSIX_C_SOURCE >= 199309L)
Packit 5756e2
int sd_event_source_send_child_signal(sd_event_source *s, int sig, const siginfo_t *si, unsigned flags);
Packit 5756e2
#else
Packit 5756e2
int sd_event_source_send_child_signal(sd_event_source *s, int sig, const void *si, unsigned flags);
Packit 5756e2
#endif
Packit 5756e2
int sd_event_source_get_inotify_mask(sd_event_source *s, uint32_t *ret);
Packit 5756e2
int sd_event_source_set_destroy_callback(sd_event_source *s, sd_event_destroy_t callback);
Packit 5756e2
int sd_event_source_get_destroy_callback(sd_event_source *s, sd_event_destroy_t *ret);
Packit 5756e2
int sd_event_source_get_floating(sd_event_source *s);
Packit 5756e2
int sd_event_source_set_floating(sd_event_source *s, int b);
Packit Service a1bd4f
int sd_event_source_get_exit_on_failure(sd_event_source *s);
Packit Service a1bd4f
int sd_event_source_set_exit_on_failure(sd_event_source *s, int b);
Packit Service 87a54e
int sd_event_source_set_ratelimit(sd_event_source *s, uint64_t interval_usec, unsigned burst);
Packit Service 87a54e
int sd_event_source_get_ratelimit(sd_event_source *s, uint64_t *ret_interval_usec, unsigned *ret_burst);
Packit Service 87a54e
int sd_event_source_is_ratelimited(sd_event_source *s);
Packit 5756e2
Packit 5756e2
/* Define helpers so that __attribute__((cleanup(sd_event_unrefp))) and similar may be used. */
Packit 5756e2
_SD_DEFINE_POINTER_CLEANUP_FUNC(sd_event, sd_event_unref);
Packit 5756e2
_SD_DEFINE_POINTER_CLEANUP_FUNC(sd_event_source, sd_event_source_unref);
Packit 5756e2
_SD_DEFINE_POINTER_CLEANUP_FUNC(sd_event_source, sd_event_source_disable_unref);
Packit 5756e2
Packit 5756e2
_SD_END_DECLARATIONS;
Packit 5756e2
Packit 5756e2
#endif