netatalk  4.4.0
Free and Open Source Apple Filing Protocol (AFP) Server
Loading...
Searching...
No Matches
fce_api.c File Reference

File change event API for netatalk. More...

#include <arpa/inet.h>
#include <errno.h>
#include <netdb.h>
#include <netinet/in.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <time.h>
#include <unistd.h>
#include <atalk/adouble.h>
#include <atalk/afp.h>
#include <atalk/cnid.h>
#include <atalk/fce_api.h>
#include <atalk/globals.h>
#include <atalk/logger.h>
#include <atalk/unix.h>
#include <atalk/util.h>
#include <atalk/vfs.h>
#include "desktop.h"
#include "directory.h"
#include "file.h"
#include "fork.h"
#include "volume.h"
#include "fce_api_internal.h"

Macros

#define MAXIOBUF   4096

Functions

int afprun_bg (char *cmd)
 Run a command in the background without waiting.
void fce_init_udp (void)
 Initialize network structs for any listeners.
void fce_cleanup (void)
static ssize_t build_fce_packet (const AFPObj *obj, unsigned char *iobuf, fce_ev_t event, const char *path, const char *oldpath, pid_t pid, const char *user, uint32_t event_id)
static void send_fce_event (const AFPObj *obj, int event, const char *path, const char *oldpath)
 Send the fce information to all (connected) listeners.
static int add_udp_socket (const char *target_ip, const char *target_port)
static void save_close_event (const AFPObj *obj, const char *path)
static void fce_init_ign_paths (const char *ignores, const char ***dest_array, bool is_directory)
int fce_register (const AFPObj *obj, fce_ev_t event, const char *path, const char *oldpath)
static void check_saved_close_events (const AFPObj *obj)
void fce_pending_events (const AFPObj *obj)
int fce_add_udp_socket (const char *target)
 Extern connect to afpd parameter.
int fce_set_events (const char *events)

Variables

static struct udp_entry udp_socket_list [FCE_MAX_UDP_SOCKS]
static int udp_sockets = 0
static bool udp_initialized = false
static unsigned long fce_ev_enabled
static uint8_t fce_ev_info
static unsigned char iobuf [MAXIOBUF]
static const char ** skip_files
static const char ** skip_directories
static struct fce_close_event last_close_event
static char * fce_event_names []

Detailed Description

File change event API for netatalk.

for every detected filesystem change a UDP packet is sent to an arbitrary list of listeners. Each packet contains unix path of modified filesystem element, event reason, and a consecutive event id (32 bit). Technically we are UDP client and are sending out packets synchronuosly as they are created by the afp functions. This should not affect performance measurably. The only delaying calls occur during initialization, if we have to resolve non-IP hostnames to IP. All numeric data inside the packet is network byte order, so use ntohs / ntohl to resolve length and event id. Ideally a listener receives every packet with no gaps in event ids, starting with event id 1 and mode FCE_CONN_START followed by data events from id 2 up to 0xFFFFFFFF, followed by 0 to 0xFFFFFFFF and so on.

A gap or not starting with 1 mode FCE_CONN_START or receiving mode FCE_CONN_BROKEN means that the listener has lost at least one filesystem event

Macro Definition Documentation

◆ MAXIOBUF

#define MAXIOBUF   4096

Function Documentation

◆ add_udp_socket()

int add_udp_socket ( const char * target_ip,
const char * target_port )
static

◆ afprun_bg()

int afprun_bg ( char * cmd)
extern

Run a command in the background without waiting.

Note
being careful about uid/gid handling

◆ build_fce_packet()

ssize_t build_fce_packet ( const AFPObj * obj,
unsigned char * iobuf,
fce_ev_t event,
const char * path,
const char * oldpath,
pid_t pid,
const char * user,
uint32_t event_id )
static

Construct a UDP packet for our listeners and return packet size

◆ check_saved_close_events()

void check_saved_close_events ( const AFPObj * obj)
static

◆ fce_add_udp_socket()

int fce_add_udp_socket ( const char * target)

Extern connect to afpd parameter.

Note
can be called multiple times for multiple listeners (up to MAX_UDP_SOCKS times)

◆ fce_cleanup()

void fce_cleanup ( void )

◆ fce_init_ign_paths()

void fce_init_ign_paths ( const char * ignores,
const char *** dest_array,
bool is_directory )
static

◆ fce_init_udp()

void fce_init_udp ( void )

Initialize network structs for any listeners.

Note
We don't give return code because all errors are handled internally (I hope..)

◆ fce_pending_events()

void fce_pending_events ( const AFPObj * obj)

API-Calls for file change api, called from outside (file.c directory.c ofork.c filedir.c)

◆ fce_register()

int fce_register ( const AFPObj * obj,
fce_ev_t event,
const char * path,
const char * oldpath )

Dispatcher for all incoming file change events

◆ fce_set_events()

int fce_set_events ( const char * events)

fmod,fdel,ddel,fcre,dcre

◆ save_close_event()

void save_close_event ( const AFPObj * obj,
const char * path )
static

◆ send_fce_event()

void send_fce_event ( const AFPObj * obj,
int event,
const char * path,
const char * oldpath )
static

Send the fce information to all (connected) listeners.

Note
We don't give return code because all errors are handled internally (I hope..)

Variable Documentation

◆ fce_ev_enabled

unsigned long fce_ev_enabled
static
Initial value:
=
(1 << FCE_FILE_MODIFY) |
(1 << FCE_FILE_DELETE) |
(1 << FCE_DIR_DELETE) |
(1 << FCE_FILE_CREATE) |
(1 << FCE_DIR_CREATE) |
(1 << FCE_FILE_MOVE) |
(1 << FCE_DIR_MOVE) |
(1 << FCE_LOGIN) |
(1 << FCE_LOGOUT)
#define FCE_DIR_MOVE
Definition fce_api.h:26
#define FCE_LOGOUT
Definition fce_api.h:28
#define FCE_FILE_DELETE
Definition fce_api.h:21
#define FCE_FILE_MOVE
Definition fce_api.h:25
#define FCE_DIR_CREATE
Definition fce_api.h:24
#define FCE_LOGIN
Definition fce_api.h:27
#define FCE_FILE_MODIFY
Definition fce_api.h:20
#define FCE_DIR_DELETE
Definition fce_api.h:22
#define FCE_FILE_CREATE
Definition fce_api.h:23

◆ fce_ev_info

uint8_t fce_ev_info
static

◆ fce_event_names

char* fce_event_names[]
static
Initial value:
= {
[FCE_FILE_MODIFY] = "FCE_FILE_MODIFY",
[FCE_FILE_DELETE] = "FCE_FILE_DELETE",
[FCE_DIR_DELETE] = "FCE_DIR_DELETE",
[FCE_FILE_CREATE] = "FCE_FILE_CREATE",
[FCE_DIR_CREATE] = "FCE_DIR_CREATE",
[FCE_FILE_MOVE] = "FCE_FILE_MOVE",
[FCE_DIR_MOVE] = "FCE_DIR_MOVE",
[FCE_LOGIN] = "FCE_LOGIN",
[FCE_LOGOUT] = "FCE_LOGOUT",
[FCE_CONN_START] = "FCE_CONN_START",
[FCE_CONN_BROKEN] = "FCE_CONN_BROKEN"
}
#define FCE_CONN_START
Definition fce_api.h:37
#define FCE_CONN_BROKEN
Definition fce_api.h:38

◆ iobuf

unsigned char iobuf[MAXIOBUF]
static

◆ last_close_event

struct fce_close_event last_close_event
static

◆ skip_directories

const char** skip_directories
static

◆ skip_files

const char** skip_files
static

◆ udp_initialized

bool udp_initialized = false
static

◆ udp_socket_list

struct udp_entry udp_socket_list[FCE_MAX_UDP_SOCKS]
static

◆ udp_sockets

int udp_sockets = 0
static