/* * 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 Event type manipulation. * * This header file defines the event types of the `libfswatch` API. * * @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 FSW__CEVENT_H # define FSW__CEVENT_H # include # include # include "libfswatch_types.h" # ifdef __cplusplus extern "C" { # endif /** * @brief Backend-agnostic change flags. * * Each element of this enum represents a backend-agnostic change flag. No * direct mapping to backend-specific change types is guaranteed to exist: a * change type may be mapped to multiple `fsw_event_flag` instances included * the `PlatformSpecific` flag. * * The values of event flags are all powers of 2, that is numbers @f$f=2^n@f$ * where @f$n@f$ is an integer. This representation makes it easy to combine * flags into a bit mask and encode multiple events flags into a single integer. * * A monitor implementation is required to map implementation-specific flags * into API flags. Sometimes, though, a perfect match is not possible and the * following situation may arise: * * - One platform-specific flag must be mapped into multiple API flags. * * - Multiple platform-specific flags must be mapped into a single API flag. * * - A mapping is not possible for some flags, in which case they should be * mapped to fsw_event_flag::PlatformSpecific. The API currently offers no * way to retain a platform-specific event flag value in this case. */ enum fsw_event_flag { NoOp = 0, /**< No event has occurred. */ PlatformSpecific = (1 << 0), /**< Platform-specific placeholder for event type that cannot currently be mapped. */ Created = (1 << 1), /**< An object was created. */ Updated = (1 << 2), /**< An object was updated. */ Removed = (1 << 3), /**< An object was removed. */ Renamed = (1 << 4), /**< An object was renamed. */ OwnerModified = (1 << 5), /**< The owner of an object was modified. */ AttributeModified = (1 << 6), /**< The attributes of an object were modified. */ MovedFrom = (1 << 7), /**< An object was moved from this location. */ MovedTo = (1 << 8), /**< An object was moved to this location. */ IsFile = (1 << 9), /**< The object is a file. */ IsDir = (1 << 10), /**< The object is a directory. */ IsSymLink = (1 << 11), /**< The object is a symbolic link. */ Link = (1 << 12), /**< The link count of an object has changed. */ Overflow = (1 << 13) /**< The event queue has overflowed. */ }; extern enum fsw_event_flag FSW_ALL_EVENT_FLAGS[15]; /** * @brief Get event flag by name. * * This function looks for an event flag called @p name and, if it exists, it * writes its value onto @p flag and @c FSW_OK, otherwise @p flag is not * modified and @c FSW_ERR_UNKNOWN_VALUE is returned. * * @param[in] name The name of the event flag to look for. * @param[out] flag The output variable where the event flag is returned. * @return #FSW_OK if the functions succeeds, #FSW_ERR_UNKNOWN_VALUE * otherwise. */ FSW_STATUS fsw_get_event_flag_by_name(const char *name, enum fsw_event_flag *flag); /** * @brief Get the name of an event flag. * * This function looks for the name of the specified event @p flag. If it * exists, it returns its name, otherwise @c nullptr is returned. * * @param[in] flag The event flag to look for. * @return The name of @p flag, or @c nullptr if it does not exist. */ char *fsw_get_event_flag_name(const enum fsw_event_flag flag); /** * A file change event is represented as an instance of this struct where: * - path is the path where the event was triggered. * - evt_time the time when the event was triggered. * - flags is an array of fsw_event_flag of size flags_num. * - flags_num is the size of the flags array. */ typedef struct fsw_cevent { char * path; time_t evt_time; enum fsw_event_flag * flags; unsigned int flags_num; } fsw_cevent; /** * A function pointer of type FSW_CEVENT_CALLBACK is used by the API as a * callback to provide information about received events. The callback is * passed the following arguments: * - events, a const pointer to an array of events of type const fsw_cevent. * - event_num, the size of the *events array. * - data, optional persisted data for a callback. * * The memory used by the fsw_cevent objects will be freed at the end of the * callback invocation. A callback should copy such data instead of storing * a pointer to it. */ typedef void (*FSW_CEVENT_CALLBACK)(fsw_cevent const *const events, const unsigned int event_num, void *data); # ifdef __cplusplus } # endif #endif /* FSW__CEVENT_H */