Add an "equals" method to both implementations of directory-handle.
The "directory fd" implementation uses the underlying inode of
the directory to perform comparisons.
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Change-Id: I9c97f75ea6a79168d772268fca490aee7c333ae2
+/*
+ * Special inode number reserved to represent the "current working directory".
+ * ino_t is spec'ed as being an unsigned integral type.
+ */
+#define RESERVED_AT_FDCWD_INO \
+ ({ \
+ uint64_t reserved_val; \
+ switch (sizeof(ino_t)) { \
+ case 4: \
+ reserved_val = UINT32_MAX; \
+ break; \
+ case 8: \
+ reserved_val = UINT64_MAX; \
+ break; \
+ default: \
+ abort(); \
+ } \
+ (ino_t) reserved_val; \
+ })
+
LTTNG_HIDDEN
struct lttng_directory_handle *lttng_directory_handle_create(const char *path)
{
LTTNG_HIDDEN
struct lttng_directory_handle *lttng_directory_handle_create(const char *path)
{
struct lttng_directory_handle *lttng_directory_handle_create_from_dirfd(
int dirfd)
{
struct lttng_directory_handle *lttng_directory_handle_create_from_dirfd(
int dirfd)
{
struct lttng_directory_handle *handle = zmalloc(sizeof(*handle));
struct lttng_directory_handle *handle = zmalloc(sizeof(*handle));
if (!handle) {
goto end;
}
if (!handle) {
goto end;
}
+
+ if (dirfd != AT_FDCWD) {
+ ret = fstat(dirfd, &stat_buf);
+ if (ret) {
+ PERROR("Failed to fstat directory file descriptor %i", dirfd);
+ lttng_directory_handle_release(&handle->ref);
+ }
+ } else {
+ handle->directory_inode = RESERVED_AT_FDCWD_INO;
+ }
handle->dirfd = dirfd;
urcu_ref_init(&handle->ref);
end:
handle->dirfd = dirfd;
urcu_ref_init(&handle->ref);
end:
+LTTNG_HIDDEN
+bool lttng_directory_handle_equals(const struct lttng_directory_handle *lhs,
+ const struct lttng_directory_handle *rhs)
+{
+ return lhs->directory_inode == rhs->directory_inode;
+}
+
static
void lttng_directory_handle_invalidate(struct lttng_directory_handle *handle)
{
static
void lttng_directory_handle_invalidate(struct lttng_directory_handle *handle)
{
+LTTNG_HIDDEN
+bool lttng_directory_handle_equals(const struct lttng_directory_handle *lhs,
+ const struct lttng_directory_handle *rhs)
+{
+ return strcmp(lhs->path, rhs->path) == 0;
+}
+
static
void lttng_directory_handle_invalidate(struct lttng_directory_handle *handle)
{
static
void lttng_directory_handle_invalidate(struct lttng_directory_handle *handle)
{
#ifdef COMPAT_DIRFD
struct lttng_directory_handle {
struct urcu_ref ref;
#ifdef COMPAT_DIRFD
struct lttng_directory_handle {
struct urcu_ref ref;
const struct lttng_credentials *creds,
int flags);
const struct lttng_credentials *creds,
int flags);
+/*
+ * Compare two directory handles.
+ *
+ * Returns true if the two directory handles are equal, false otherwise.
+ */
+LTTNG_HIDDEN
+bool lttng_directory_handle_equals(const struct lttng_directory_handle *lhs,
+ const struct lttng_directory_handle *rhs);
+
#endif /* _COMPAT_PATH_HANDLE_H */
#endif /* _COMPAT_PATH_HANDLE_H */