/*
- * Copyright (C) 2018 - Jérémie Galarneau <jeremie.galarneau@efficios.com>
+ * Copyright (C) 2018 Jérémie Galarneau <jeremie.galarneau@efficios.com>
*
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License, version 2 only, as
- * published by the Free Software Foundation.
+ * SPDX-License-Identifier: GPL-2.0-only
*
- * 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, write to the Free Software Foundation, Inc., 51
- * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef FD_TRACKER_H
#define FD_TRACKER_H
+#include <common/compat/directory-handle.h>
+#include <common/macros.h>
#include <stdint.h>
#include <sys/types.h>
* Set the maximal number of fds that the process should be allowed to open at
* any given time. This function must be called before any other of this
* interface.
+ *
+ * The unlinked_file_path is an absolute path (which does not need to exist)
+ * under which unlinked files will be stored for as long as a reference to them
+ * is held.
*/
-struct fd_tracker *fd_tracker_create(unsigned int capacity);
+LTTNG_HIDDEN
+struct fd_tracker *fd_tracker_create(const char *unlinked_file_path,
+ unsigned int capacity);
/* Returns an error if file descriptors are leaked. */
+LTTNG_HIDDEN
int fd_tracker_destroy(struct fd_tracker *tracker);
/*
* (e.g. truncation) may react differently than if the file descriptor was kept
* open.
*/
+LTTNG_HIDDEN
struct fs_handle *fd_tracker_open_fs_handle(struct fd_tracker *tracker,
- const char *path, int flags, mode_t *mode);
+ struct lttng_directory_handle *directory,
+ const char *path,
+ int flags,
+ mode_t *mode);
/*
* Open a tracked unsuspendable file descriptor.
* negative tracker-specific codes may be returned:
* - ENOMEM: allocation of a new entry failed,
* - EMFILE: too many unsuspendable fds are opened and the tracker can't
- * accomodate the request for a new unsuspendable entry.
+ * accommodates the request for a new unsuspendable entry.
*/
+LTTNG_HIDDEN
int fd_tracker_open_unsuspendable_fd(struct fd_tracker *tracker,
- int *out_fds, const char **names, unsigned int fd_count,
- fd_open_cb open, void *data);
+ int *out_fds,
+ const char **names,
+ unsigned int fd_count,
+ fd_open_cb open,
+ void *data);
/*
* Close a tracked unsuspendable file descriptor.
* Closed fds are set to -1 in the fds array which, in the event of an error,
* allows the user to know which file descriptors are no longer being tracked.
*/
+LTTNG_HIDDEN
int fd_tracker_close_unsuspendable_fd(struct fd_tracker *tracker,
- int *fds, unsigned int fd_count, fd_close_cb close,
+ int *fds,
+ unsigned int fd_count,
+ fd_close_cb close,
void *data);
/*
* Log the contents of the fd_tracker.
*/
+LTTNG_HIDDEN
void fd_tracker_log(struct fd_tracker *tracker);
/*
* Returns the fd on success, otherwise a negative value may be returned
* if the restoration of the fd failed.
*/
+LTTNG_HIDDEN
int fs_handle_get_fd(struct fs_handle *handle);
/*
* Used by the application to signify that it is no longer using the
* underlying fd and that it may be suspended.
*/
+LTTNG_HIDDEN
void fs_handle_put_fd(struct fs_handle *handle);
+/*
+ * Unlink the file associated to an fs_handle. Note that the unlink
+ * operation will not be performed immediately. It will only be performed
+ * once all references to the underlying file (through other fs_handle objects)
+ * have been released.
+ *
+ * However, note that the file will be renamed so as to provide the observable
+ * effect of an unlink(), that is removing a name from the filesystem.
+ *
+ * Returns 0 on success, otherwise a negative value will be returned
+ * if the operation failed.
+ */
+LTTNG_HIDDEN
+int fs_handle_unlink(struct fs_handle *handle);
+
/*
* Frees the handle and discards the underlying fd.
*/
+LTTNG_HIDDEN
int fs_handle_close(struct fs_handle *handle);
#endif /* FD_TRACKER_H */