1/*
2 * Copyright 2022, Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef FS_OPS_SUPPORT_H
6#define FS_OPS_SUPPORT_H
7
8#ifndef FS_SHELL
9#	include <kernel.h>
10#	include <kernel/debug.h>
11#	include <dirent.h>
12#else
13#	include "fssh_kernel_priv.h"
14#endif
15
16
17/*!	Converts a given open mode (e.g. O_RDONLY) into access modes (e.g. R_OK).
18 */
19static inline int
20open_mode_to_access(int openMode)
21{
22	openMode &= O_RWMASK;
23	if (openMode == O_RDONLY)
24		return R_OK;
25	if (openMode == O_WRONLY)
26		return W_OK;
27	if (openMode == O_RDWR)
28		return R_OK | W_OK;
29	return 0;
30}
31
32
33/*! Computes and assigns `dirent->d_reclen`, adjusts `bufferRemaining` accordingly,
34 * and either advances to the next buffer, or returns NULL if no space remains.
35 */
36static inline struct dirent*
37next_dirent(struct dirent* dirent, size_t nameLength, size_t& bufferRemaining)
38{
39	const size_t reclen = offsetof(struct dirent, d_name) + nameLength + 1;
40#ifdef ASSERT
41	ASSERT(reclen <= bufferRemaining);
42#endif
43	dirent->d_reclen = reclen;
44
45	const size_t roundedReclen = ROUNDUP(reclen, alignof(struct dirent));
46	if (roundedReclen >= bufferRemaining) {
47		bufferRemaining -= reclen;
48		return NULL;
49	}
50	dirent->d_reclen = roundedReclen;
51	bufferRemaining -= roundedReclen;
52
53	return (struct dirent*)((uint8*)dirent + roundedReclen);
54}
55
56
57#endif	// FS_OPS_SUPPORT_H
58