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