| /* Copyright 2016 The Chromium OS Authors. All rights reserved. |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef CRAS_FILE_WAIT_H_ |
| #define CRAS_FILE_WAIT_H_ |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| /* Structure used to track the current progress of a file wait. */ |
| struct cras_file_wait; |
| |
| /* Flags type for file wait. */ |
| typedef unsigned int cras_file_wait_flag_t; |
| |
| /* No flags. */ |
| #define CRAS_FILE_WAIT_FLAG_NONE ((cras_file_wait_flag_t)0) |
| |
| /* File wait events. */ |
| typedef enum cras_file_wait_event { |
| CRAS_FILE_WAIT_EVENT_NONE, |
| CRAS_FILE_WAIT_EVENT_CREATED, |
| CRAS_FILE_WAIT_EVENT_DELETED, |
| } cras_file_wait_event_t; |
| |
| /* |
| * File wait callback function. |
| * |
| * Called for cras_file_wait events. Do not call cras_file_wait_destroy() |
| * from this function. |
| * |
| * Args: |
| * context - Context pointer passed to cras_file_wait_start(). |
| * event - Event that has occurred related to this file wait. |
| * filename - Filename associated with the event. |
| */ |
| typedef void (*cras_file_wait_callback_t)(void *context, |
| cras_file_wait_event_t event, |
| const char *filename); |
| |
| /* |
| * Wait for the existence of a file. |
| * |
| * Setup a watch with the aim of determining if the given file path exists. If |
| * any parent directory is missing, then the appropriate watch is created to |
| * watch for the parent (or it's parent). Watches are created or renewed while |
| * this file wait structure exists. |
| * |
| * The callback function will be called with event CRAS_FILE_WAIT_EVENT_CREATED |
| * when the file is created, moved into the directory, or if it already exists |
| * when this function is called. |
| * |
| * After the file is found future deletion and creation events for the file can |
| * be observed using the same file_wait structure and callback. When the file |
| * is deleted or moved out of it's parent, the callback is called with event |
| * CRAS_FILE_WAIT_EVENT_DELETED. |
| * |
| * Call cras_file_wait_destroy() to cancel the wait anytime and cleanup |
| * resources. |
| * |
| * Args: |
| * file_path - Path of the file or directory that must exist. |
| * flags - CRAS_FILE_WAIT_FLAG_* values bit-wise orred together. Set to |
| * CRAS_FILE_WAIT_FLAG_NONE for now. |
| * callback - Callback function to execute to notify of file existence. |
| * callback_context - Context pointer passed to the callback function. |
| * file_wait_out - Pointer to file wait structure that is initialized. |
| * |
| * Returns: |
| * - 0 for success, or negative on error. |
| * - On error cras_file_wait_destroy() need not be called. |
| */ |
| int cras_file_wait_create(const char *file_path, cras_file_wait_flag_t flags, |
| cras_file_wait_callback_t callback, |
| void *callback_context, |
| struct cras_file_wait **file_wait_out); |
| |
| /* Returns the file-descriptor to poll for a file wait. |
| * |
| * Poll for POLLIN on this file decriptor. When there is data available, call |
| * cras_file_wait_continue() on the associated file_wait structure. |
| * |
| * Args: |
| * file_wait - The associated cras_file_wait structure initialized by |
| * cras_file_wait_start(). |
| * |
| * Returns: |
| * Non-negative file descriptor number, or -EINVAL if the file_wait |
| * structure is NULL or otherwise invalid. |
| */ |
| int cras_file_wait_get_fd(struct cras_file_wait *file_wait); |
| |
| /* Dispatch a file wait event. |
| * |
| * Call this function when the file descriptor from cras_file_wait_fd() has |
| * data ready (POLLIN). This function will call the callback provided to |
| * cras_file_wait_start when there is a relevant event. |
| * |
| * Args: |
| * file_wait - The associated cras_file_wait structure initialized by |
| * cras_file_wait_start(). |
| * |
| * Returns: |
| * - 0 for success, negative on error. |
| * - -EAGAIN or -EWOULDBLOCK when this function would have blocked. |
| */ |
| int cras_file_wait_dispatch(struct cras_file_wait *file_wait); |
| |
| /* Destroy a file wait structure. |
| * |
| * This function can be called to cleanup a cras_file_wait structure, and it |
| * will interrupt any wait that is in progress; the pointer is subsequently |
| * invalid. |
| * |
| * Args: |
| * file_wait - The cras_file_wait structure initialized by |
| * cras_file_wait_start(); |
| */ |
| void cras_file_wait_destroy(struct cras_file_wait *file_wait); |
| |
| #ifdef __cplusplus |
| } /* extern "C" */ |
| #endif |
| |
| #endif /* CRAS_FILE_WAIT_H_ */ |