/*
* Copyright (c) 2014-2015 Enrico M. Crisostomo
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation; either version 3, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see .
*/
/**
* @file
* @brief Header of the `libfswatch` library.
*
* This header file defines the API of the `libfswatch` library.
*
* @copyright Copyright (c) 2014-2015 Enrico M. Crisostomo
* @license GNU General Public License v. 3.0
* @author Enrico M. Crisostomo
* @version 1.8.0
*/
#ifndef LIBFSW_H
#define LIBFSW_H
#include
#include "libfswatch_types.h"
#include "cevent.h"
#include "cmonitor.h"
#include "cfilter.h"
#include "error.h"
# ifdef __cplusplus
extern "C"
{
# endif
/**
* The `libfswatch` C API let users create monitor sessions and receive file
* system events matching the specified criteria. Most API functions return
* a status code of type FSW_STATUS which can take any value specified in
* the error.h header. A successful API call returns FSW_OK and the last
* error can be obtained calling the fsw_last_error() function.
*
* If the compiler and the C++ library used to build `libfswatch` support the
* thread_local storage specified then this API is thread safe and a
* different state is maintained on a per-thread basis.
*
* Session-modifying API calls (such as fsw_add_path) will take effect the
* next time a monitor is started with fsw_start_monitor.
*
* Currently not all monitors supports being stopped, in which case
* fsw_start_monitor is a non-returning API call.
*
* A basic session needs at least:
*
* * A path to watch.
* * A callback to process the events sent by the monitor.
*
* as shown in the next example (error checking code was omitted).
*
* // Use the default monitor.
* const FSW_HANDLE handle = fsw_init_session(system_default_monitor_type);
*
* fsw_add_path(handle, "my/path");
* fsw_set_callback(handle, my_callback);
*
* fsw_start_monitor(handle);
*
* A suitable callback function is a function pointer of type
* FSW_CEVENT_CALLBACK, that is it is a function conforming with the
* following signature:
*
* void c_process_events(fsw_cevent const * const events,
* const unsigned int event_num,
* void * data);
*
* When a monitor receives change events satisfying all the session criteria,
* the callback is invoked and passed a copy of the events.
*/
/**
* This function initializes the `libfswatch` library and must be invoked
* before any other calls to the C or C++ API. If the function succeeds, it
* returns FSW_OK, otherwise the initialization routine failed and the library
* should not be usable.
*/
FSW_STATUS fsw_init_library();
/**
* This function creates a new monitor session using the specified monitor
* and returns an handle to it. This function is the `libfswatch` API entry
* point.
*
* @see cmonitor.h for a list of all the available monitors.
*/
FSW_HANDLE fsw_init_session(const enum fsw_monitor_type type);
/**
* Adds a path to watch to the specified session. At least one path must be
* added to the current session in order for it to be valid.
*/
FSW_STATUS fsw_add_path(const FSW_HANDLE handle, const char * path);
/**
* Adds the specified monitor property.
*/
FSW_STATUS fsw_add_property(const FSW_HANDLE handle, const char * name, const char * value);
/**
* Sets the allow overflow flag of the monitor. When this flag is set, a
* monitor is allowed to overflow and report it as a change event.
*/
FSW_STATUS fsw_set_allow_overflow(const FSW_HANDLE handle, const bool allow_overflow);
/**
* Sets the callback the monitor invokes when some events are received. The
* callback must be set in the current session in order for it to be valid.
*
* See cevent.h for the definition of FSW_CEVENT_CALLBACK.
*/
FSW_STATUS fsw_set_callback(const FSW_HANDLE handle,
const FSW_CEVENT_CALLBACK callback,
void * data);
/**
* Sets the latency of the monitor. By default, the latency is set to 1 s.
*/
FSW_STATUS fsw_set_latency(const FSW_HANDLE handle, const double latency);
/**
* Determines whether the monitor recursively scans each watched path or not.
* Recursive scanning is an optional feature which could not be implemented
* by all the monitors. By default, recursive scanning is disabled.
*/
FSW_STATUS fsw_set_recursive(const FSW_HANDLE handle, const bool recursive);
/**
* Determines whether the monitor only watches a directory when performing a
* recursive scan. By default, a monitor accepts all kinds of files.
*/
FSW_STATUS fsw_set_directory_only(const FSW_HANDLE handle, const bool directory_only);
/**
* Determines whether a symbolic link is followed or not. By default, a
* symbolic link are not followed.
*/
FSW_STATUS fsw_set_follow_symlinks(const FSW_HANDLE handle,
const bool follow_symlinks);
/**
* Adds an event type filter to the current session.
*
* See cfilter.h for the definition of fsw_event_type_filter.
*/
FSW_STATUS fsw_add_event_type_filter(const FSW_HANDLE handle,
const fsw_event_type_filter event_type);
/**
* Adds a filter to the current session. A filter is a regular expression
* that, depending on whether the filter type is exclusion or not, must or
* must not be matched for an event path for the event to be accepted.
*
* See cfilter.h for the definition of fsw_cmonitor_filter.
*/
FSW_STATUS fsw_add_filter(const FSW_HANDLE handle,
const fsw_cmonitor_filter filter);
/**
* Starts the monitor if it is properly configured. Depending on the type of
* monitor this call might return when a monitor is stopped or not.
*/
FSW_STATUS fsw_start_monitor(const FSW_HANDLE handle);
/**
* Stops a running monitor.
*/
FSW_STATUS fsw_stop_monitor(const FSW_HANDLE handle);
/**
* Checks if a monitor exists and is running.
*/
bool fsw_is_running(const FSW_HANDLE handle);
/**
* Destroys an existing session and invalidates its handle.
*/
FSW_STATUS fsw_destroy_session(const FSW_HANDLE handle);
/**
* Gets the last error code.
*/
FSW_STATUS fsw_last_error();
/**
* Check whether the verbose mode is active.
*/
bool fsw_is_verbose();
/**
* Set the verbose mode.
*/
void fsw_set_verbose(bool verbose);
# ifdef __cplusplus
}
# endif
#endif /* LIBFSW_H */