X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Fcompat%2Fdirectory-handle.h;fp=src%2Fcommon%2Fcompat%2Fdirectory-handle.h;h=a24bbd8db9ffaff76eba111a81b9fd2cc5be2098;hp=0000000000000000000000000000000000000000;hb=18710679a8ac57fda5dbd26cf16bb180dce9e286;hpb=61159eeb808d6691ec7d9e7c4e84c2057c2d27f2 diff --git a/src/common/compat/directory-handle.h b/src/common/compat/directory-handle.h new file mode 100644 index 000000000..a24bbd8db --- /dev/null +++ b/src/common/compat/directory-handle.h @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2019 - Jérémie Galarneau + * + * 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. + * + * 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 _COMPAT_DIRECTORY_HANDLE_H +#define _COMPAT_DIRECTORY_HANDLE_H + +#include +#include + +/* + * Some platforms, such as Solaris 10, do not support directory file descriptors + * and their associated functions (*at(...)), which are defined in POSIX.2008. + * + * This wrapper provides a handle that is either a copy of a directory's path + * or a directory file descriptors, depending on the platform's capabilities. + */ +#ifdef COMPAT_DIRFD +struct lttng_directory_handle { + int dirfd; +}; +#else +struct lttng_directory_handle { + char *base_path; +}; +#endif + +/* + * Initialize a directory handle to the provided path. Passing a NULL path + * returns a handle to the current working directory. The working directory + * is not sampled; it will be accessed at the time of use of the functions + * of this API. + * + * An initialized directory handle must be finalized using + * lttng_directory_handle_fini(). + */ +LTTNG_HIDDEN +int lttng_directory_handle_init(struct lttng_directory_handle *handle, + const char *path); + +LTTNG_HIDDEN +int lttng_directory_handle_init_from_dirfd( + struct lttng_directory_handle *handle, int dirfd); + +/* + * Release the resources of a directory handle. + */ +LTTNG_HIDDEN +void lttng_directory_handle_fini(struct lttng_directory_handle *handle); + +/* + * Create a subdirectory relative to a directory handle. + */ +LTTNG_HIDDEN +int lttng_directory_handle_create_subdirectory( + const struct lttng_directory_handle *handle, + const char *subdirectory, + mode_t mode); + +/* + * Create a subdirectory relative to a directory handle + * as a given user. + */ +LTTNG_HIDDEN +int lttng_directory_handle_create_subdirectory_as_user( + const struct lttng_directory_handle *handle, + const char *subdirectory, + mode_t mode, struct lttng_credentials *creds); + +/* + * Recursively create a directory relative to a directory handle. + */ +LTTNG_HIDDEN +int lttng_directory_handle_create_subdirectory_recursive( + const struct lttng_directory_handle *handle, + const char *subdirectory_path, + mode_t mode); + +/* + * Recursively create a directory relative to a directory handle + * as a given user. + */ +LTTNG_HIDDEN +int lttng_directory_handle_create_subdirectory_recursive_as_user( + const struct lttng_directory_handle *handle, + const char *subdirectory_path, + mode_t mode, struct lttng_credentials *creds); + +#endif /* _COMPAT_PATH_HANDLE_H */