From d29e55d8ec682b5e10ed183c924d347f124a37d4 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Sat, 5 Mar 2005 20:32:40 +0000 Subject: [PATCH] Functions for converting between the build platform and emulated platform stat structures. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@11581 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../file_systems/fs_shell/stat_util.cpp | 239 ++++++++++++++++++ .../kernel/file_systems/fs_shell/stat_util.h | 25 ++ 2 files changed, 264 insertions(+) create mode 100644 src/tests/add-ons/kernel/file_systems/fs_shell/stat_util.cpp create mode 100644 src/tests/add-ons/kernel/file_systems/fs_shell/stat_util.h diff --git a/src/tests/add-ons/kernel/file_systems/fs_shell/stat_util.cpp b/src/tests/add-ons/kernel/file_systems/fs_shell/stat_util.cpp new file mode 100644 index 0000000000..2c7d36cfc3 --- /dev/null +++ b/src/tests/add-ons/kernel/file_systems/fs_shell/stat_util.cpp @@ -0,0 +1,239 @@ +/* + * Copyright 2005, Ingo Weinhold, bonefish@users.sf.net. + * Distributed under the terms of the MIT License. + */ + +#include "stat_util.h" + +#ifdef __BEOS__ + +void +from_platform_stat(const struct stat *st, struct my_stat *myst) +{ + myst->dev = st->st_dev; + myst->ino = st->st_ino; + myst->nlink = st->st_nlink; + myst->uid = st->st_uid; + myst->gid = st->st_gid; + myst->size = st->st_size; + myst->blksize = st->st_blksize; + myst->atime = st->st_atime; + myst->mtime = st->st_mtime; + myst->ctime = st->st_ctime; + myst->crtime = st->st_ctime; + myst->mode = st->st_mode; +} + + +void +to_platform_stat(const struct my_stat *myst, struct stat *st) +{ + st->st_dev = myst->dev; + st->st_ino = myst->ino; + st->st_nlink = myst->nlink; + st->st_uid = myst->uid; + st->st_gid = myst->gid; + st->st_size = myst->size; + st->st_blksize = myst->blksize; + st->st_atime = myst->atime; + st->st_mtime = myst->mtime; + st->st_ctime = myst->ctime; + st->st_crtime = myst->crtime; + st->st_mode = myst->mode; +} + + +#else // !__BEOS__ + +#ifndef S_ATTR_DIR + #define S_ATTR_DIR 0 +#endif +#ifndef S_ATTR + #define S_ATTR 0 +#endif +#ifndef S_INDEX_DIR + #define S_INDEX_DIR 0 +#endif +#ifndef S_INT_INDEX + #define S_INT_INDEX 0 +#endif +#ifndef S_UINT_INDEX + #define S_UINT_INDEX 0 +#endif +#ifndef S_LONG_LONG_INDEX + #define S_LONG_LONG_INDEX 0 +#endif +#ifndef S_ULONG_LONG_INDEX + #define S_ULONG_LONG_INDEX 0 +#endif +#ifndef S_FLOAT_INDEX + #define S_FLOAT_INDEX 0 +#endif +#ifndef S_DOUBLE_INDEX + #define S_DOUBLE_INDEX 0 +#endif +#ifndef S_ALLOW_DUPS + #define S_ALLOW_DUPS 0 +#endif +#ifndef S_LINK_SELF_HEALING + #define S_LINK_SELF_HEALING 0 +#endif +#ifndef S_LINK_AUTO_DELETE + #define S_LINK_AUTO_DELETE 0 +#endif + + +my_mode_t +from_platform_mode(mode_t mode) +{ + #define SET_ST_MODE_BIT(flag, myFlag) \ + if (mode & flag) \ + myMode |= myFlag; + + my_mode_t myMode = 0; + + SET_ST_MODE_BIT(MY_S_ATTR_DIR, S_ATTR_DIR); + SET_ST_MODE_BIT(MY_S_ATTR, S_ATTR); + SET_ST_MODE_BIT(MY_S_INDEX_DIR, S_INDEX_DIR); + SET_ST_MODE_BIT(MY_S_INT_INDEX, S_INT_INDEX); + SET_ST_MODE_BIT(MY_S_UINT_INDEX, S_UINT_INDEX); + SET_ST_MODE_BIT(MY_S_LONG_LONG_INDEX, S_LONG_LONG_INDEX); + SET_ST_MODE_BIT(MY_S_ULONG_LONG_INDEX, S_ULONG_LONG_INDEX); + SET_ST_MODE_BIT(MY_S_FLOAT_INDEX, S_FLOAT_INDEX); + SET_ST_MODE_BIT(MY_S_DOUBLE_INDEX, S_DOUBLE_INDEX); + SET_ST_MODE_BIT(MY_S_ALLOW_DUPS, S_ALLOW_DUPS); + SET_ST_MODE_BIT(MY_S_LINK_SELF_HEALING, S_LINK_SELF_HEALING); + SET_ST_MODE_BIT(MY_S_LINK_AUTO_DELETE, S_LINK_AUTO_DELETE); + + switch (mode & S_IFMT) { + case S_IFLNK: + myMode |= MY_S_IFLNK; + break; + case S_IFREG: + myMode |= MY_S_IFREG; + break; + case S_IFBLK: + myMode |= MY_S_IFBLK; + break; + case S_IFDIR: + myMode |= MY_S_IFDIR; + break; + case S_IFIFO: + myMode |= MY_S_IFIFO; + break; + } + + SET_ST_MODE_BIT(MY_S_ISUID, S_ISUID); + SET_ST_MODE_BIT(MY_S_ISGID, S_ISGID); + SET_ST_MODE_BIT(MY_S_ISVTX, S_ISVTX); + SET_ST_MODE_BIT(MY_S_IRUSR, S_IRUSR); + SET_ST_MODE_BIT(MY_S_IWUSR, S_IWUSR); + SET_ST_MODE_BIT(MY_S_IXUSR, S_IXUSR); + SET_ST_MODE_BIT(MY_S_IRGRP, S_IRGRP); + SET_ST_MODE_BIT(MY_S_IWGRP, S_IWGRP); + SET_ST_MODE_BIT(MY_S_IXGRP, S_IXGRP); + SET_ST_MODE_BIT(MY_S_IROTH, S_IROTH); + SET_ST_MODE_BIT(MY_S_IWOTH, S_IWOTH); + SET_ST_MODE_BIT(MY_S_IXOTH, S_IXOTH); + + #undef SET_ST_MODE_BIT + + return myMode; +} + + +mode_t +to_platform_mode(my_mode_t mode) +{ + #define SET_ST_MODE_BIT(flag, myFlag) \ + if (myMode & myFlag) \ + mode |= flag; + + mode_t mode = 0; + + SET_ST_MODE_BIT(MY_S_ATTR_DIR, S_ATTR_DIR); + SET_ST_MODE_BIT(MY_S_ATTR, S_ATTR); + SET_ST_MODE_BIT(MY_S_INDEX_DIR, S_INDEX_DIR); + SET_ST_MODE_BIT(MY_S_INT_INDEX, S_INT_INDEX); + SET_ST_MODE_BIT(MY_S_UINT_INDEX, S_UINT_INDEX); + SET_ST_MODE_BIT(MY_S_LONG_LONG_INDEX, S_LONG_LONG_INDEX); + SET_ST_MODE_BIT(MY_S_ULONG_LONG_INDEX, S_ULONG_LONG_INDEX); + SET_ST_MODE_BIT(MY_S_FLOAT_INDEX, S_FLOAT_INDEX); + SET_ST_MODE_BIT(MY_S_DOUBLE_INDEX, S_DOUBLE_INDEX); + SET_ST_MODE_BIT(MY_S_ALLOW_DUPS, S_ALLOW_DUPS); + SET_ST_MODE_BIT(MY_S_LINK_SELF_HEALING, S_LINK_SELF_HEALING); + SET_ST_MODE_BIT(MY_S_LINK_AUTO_DELETE, S_LINK_AUTO_DELETE); + + switch (myMode & MY_S_IFMT) { + case MY_S_IFLNK: + mode |= S_IFLNK; + break; + case MY_S_IFREG: + mode |= S_IFREG; + break; + case MY_S_IFBLK: + mode |= S_IFBLK; + break; + case MY_S_IFDIR: + mode |= S_IFDIR; + break; + case MY_S_IFIFO: + mode |= S_IFIFO; + break; + } + + SET_ST_MODE_BIT(MY_S_ISUID, S_ISUID); + SET_ST_MODE_BIT(MY_S_ISGID, S_ISGID); + SET_ST_MODE_BIT(MY_S_ISVTX, S_ISVTX); + SET_ST_MODE_BIT(MY_S_IRUSR, S_IRUSR); + SET_ST_MODE_BIT(MY_S_IWUSR, S_IWUSR); + SET_ST_MODE_BIT(MY_S_IXUSR, S_IXUSR); + SET_ST_MODE_BIT(MY_S_IRGRP, S_IRGRP); + SET_ST_MODE_BIT(MY_S_IWGRP, S_IWGRP); + SET_ST_MODE_BIT(MY_S_IXGRP, S_IXGRP); + SET_ST_MODE_BIT(MY_S_IROTH, S_IROTH); + SET_ST_MODE_BIT(MY_S_IWOTH, S_IWOTH); + SET_ST_MODE_BIT(MY_S_IXOTH, S_IXOTH); + + #undef SET_ST_MODE_BIT + + return mode; +} + + +void +from_platform_stat(const struct stat *st, struct my_stat *myst) +{ + st->st_dev = myst->dev; + st->st_ino = myst->ino; + st->st_mode = from_platform_mode(myst->mode); + st->st_nlink = myst->nlink; + st->st_uid = myst->uid; + st->st_gid = myst->gid; + st->st_size = myst->size; + st->st_blksize = myst->blksize; + st->st_atime = myst->atime; + st->st_mtime = myst->mtime; + st->st_ctime = myst->ctime; +// st->st_crtime = myst->crtime; +} + + +void +to_platform_stat(const struct my_stat *myst, struct stat *st) +{ + myst->dev = st->st_dev; + myst->ino = st->st_ino; + myst->st_mode = to_platform_mode(st->st_mode); + myst->nlink = st->st_nlink; + myst->uid = st->st_uid; + myst->gid = st->st_gid; + myst->size = st->st_size; + myst->blksize = st->st_blksize; + myst->atime = st->st_atime; + myst->mtime = st->st_mtime; + myst->ctime = st->st_ctime; + myst->crtime = st->st_ctime; +} + +#endif // !__BEOS__ diff --git a/src/tests/add-ons/kernel/file_systems/fs_shell/stat_util.h b/src/tests/add-ons/kernel/file_systems/fs_shell/stat_util.h new file mode 100644 index 0000000000..967d9c4de3 --- /dev/null +++ b/src/tests/add-ons/kernel/file_systems/fs_shell/stat_util.h @@ -0,0 +1,25 @@ +/* + * Copyright 2005, Ingo Weinhold, bonefish@users.sf.net. + * Distributed under the terms of the MIT License. + */ +#ifndef FS_SHELL_STAT_UTIL_H +#define FS_SHELL_STAT_UTIL_H + +#include "compat.h" + +#ifdef __cplusplus +extern "C" { +#endif + +my_mode_t from_platform_mode(mode_t mode); +mode_t to_platform_mode(my_mode_t mode); + +void from_platform_stat(const struct stat *st, struct my_stat *myst); +void to_platform_stat(const struct my_stat *myst, struct stat *st); + +#ifdef __cplusplus +} +#endif + + +#endif // FS_SHELL_STAT_UTIL_H