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
This commit is contained in:
Ingo Weinhold
2005-03-05 20:32:40 +00:00
parent 740f995468
commit d29e55d8ec
2 changed files with 264 additions and 0 deletions
@@ -0,0 +1,239 @@
/*
* Copyright 2005, Ingo Weinhold, [email protected].
* 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__
@@ -0,0 +1,25 @@
/*
* Copyright 2005, Ingo Weinhold, [email protected].
* 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