packages feed

voyeur-0.1.0.0: libvoyeur/src/event.h

#ifndef VOYEUR_EVENTS_H
#define VOYEUR_EVENTS_H

#include <stdint.h>

// How to define a new event:
// 1. Add the new event name to MAP_EVENTS.
// 2. Define the public API in voyeur.h. (To keep things readable, avoid using
//    MAP_EVENTS there.)
// 3. Implement voyeur-xxx.c based on one of the existing events, and
//    add it to LIBNAMES in the Makefile.
// 4. Implement a handle_xxx function in event.c.
// 5. Add a test!

#define MAP_EVENTS                              \
  ON_EVENT(EXEC, exec)                          \
  ON_EVENT(EXIT, exit)                          \
  ON_EVENT(OPEN, open)                          \
  ON_EVENT(CLOSE, close)                        \

// Define an enumeration for event types.
#define ON_EVENT(E, _) VOYEUR_EVENT_##E,
typedef enum {
  MAP_EVENTS
  VOYEUR_EVENT_MAX
} voyeur_event_type;
#undef ON_EVENT

// Define the voyeur_context type, which is primarily a container for
// event options and callbacks.
#define ON_EVENT(_, e)                          \
  uint8_t e##_opts;                             \
  void* e##_cb;                                 \
  void* e##_userdata;

typedef struct {
  MAP_EVENTS

  char* resource_path;
  void* server_state;
} voyeur_context;

#undef ON_EVENT

// Dispatch to the correct handler for the given event type.
void voyeur_handle_event(voyeur_context* context, voyeur_event_type type, int fd);

// Create the VOYEUR_LIBS and VOYEUR_OPTS strings based on the
// context. The caller is responsible for freeing them.
char* voyeur_requested_libs(voyeur_context* context);
char* voyeur_requested_opts(voyeur_context* context);

// A special hidden option for the exec() handler.
typedef enum {
  OBSERVE_EXEC_SILENT = 1 << 4
} voyeur_extra_exec_options;

#endif