# sd_event_get_fd

## NAME



           sd_event_get_fd - Obtain a file descriptor to poll for event loop
           events
    


## SYNOPSIS



           **#include <systemd/sd-event.h>**
    
           **int sd_event_get_fd(sd_event ***_event_**);**
    


## DESCRIPTION



           **sd_event_get_fd()** returns the file descriptor that an event loop
           object returned by the sd_event_new(3) function uses to wait for
           events. This file descriptor may itself be polled for
           **POLLIN** /**EPOLLIN** events. This makes it possible to embed an
           sd-event(3) event loop into another, possibly foreign, event loop.
    
           The returned file descriptor refers to an epoll(7) object. It is
           recommended not to alter it by invoking epoll_ctl(2) on it, in
           order to avoid interference with the event loop's inner logic and
           assumptions.
    


## RETURN VALUE



           On success, **sd_event_get_fd()** returns a non-negative file
           descriptor. On failure, it returns a negative errno-style error
           code.
    
       **Errors**
           Returned errors may indicate the following problems:
    
           **-EINVAL**
               _event_ is not a valid pointer to an sd_event structure.
    
           **-ECHILD**
               The event loop has been created in a different process,
               library or module instance.
    


## EXAMPLES



           **Example 1. Integration in the GLib event loop**
    
               /* SPDX-License-Identifier: MIT-0 */
    
               #include <stdlib.h>
               #include <glib.h>
               #include <systemd/sd-event.h>
    
               typedef struct SDEventSource {
                 GSource source;
                 GPollFD pollfd;
                 sd_event *event;
               } SDEventSource;
    
               static gboolean event_prepare(GSource *source, gint *timeout_) {
                 return sd_event_prepare(((SDEventSource *)source)->event) > 0;
               }
    
               static gboolean event_check(GSource *source) {
                 return sd_event_wait(((SDEventSource *)source)->event, 0) > 0;
               }
    
               static gboolean event_dispatch(GSource *source, GSourceFunc callback, gpointer user_data) {
                 return sd_event_dispatch(((SDEventSource *)source)->event) > 0;
               }
    
               static void event_finalize(GSource *source) {
                 sd_event_unref(((SDEventSource *)source)->event);
               }
    
               static GSourceFuncs event_funcs = {
                 .prepare = event_prepare,
                 .check = event_check,
                 .dispatch = event_dispatch,
                 .finalize = event_finalize,
               };
    
               GSource *g_sd_event_create_source(sd_event *event) {
                 SDEventSource *source;
    
                 source = (SDEventSource *)g_source_new(&event_funcs, sizeof(SDEventSource));
    
                 source->event = sd_event_ref(event);
                 source->pollfd.fd = sd_event_get_fd(event);
                 source->pollfd.events = G_IO_IN | G_IO_HUP | G_IO_ERR;
    
                 g_source_add_poll((GSource *)source, &source->pollfd);
    
                 return (GSource *)source;
               }
    


## NOTES



           Functions described here are available as a shared library, which
           can be compiled against and linked to with the
           **libsystemd pkg-config**(1) file.
    
           The code described here uses getenv(3), which is declared to be
           not multi-thread-safe. This means that the code calling the
           functions described here must not call setenv(3) from a parallel
           thread. It is recommended to only do calls to **setenv()** from an
           early phase of the program when no other threads have been
           started.
    


* * *