|
@@ -19,11 +19,27 @@
|
|
#include "user.h"
|
|
#include "user.h"
|
|
#include <utime.h>
|
|
#include <utime.h>
|
|
|
|
|
|
-int stat_file(const char *path, unsigned long long *inode_out, int *mode_out,
|
|
|
|
- int *nlink_out, int *uid_out, int *gid_out,
|
|
|
|
- unsigned long long *size_out, struct timespec *atime_out,
|
|
|
|
- struct timespec *mtime_out, struct timespec *ctime_out,
|
|
|
|
- int *blksize_out, unsigned long long *blocks_out, int fd)
|
|
|
|
|
|
+static void stat64_to_hostfs(const struct stat64 *buf, struct hostfs_stat *p)
|
|
|
|
+{
|
|
|
|
+ p->ino = buf->st_ino;
|
|
|
|
+ p->mode = buf->st_mode;
|
|
|
|
+ p->nlink = buf->st_nlink;
|
|
|
|
+ p->uid = buf->st_uid;
|
|
|
|
+ p->gid = buf->st_gid;
|
|
|
|
+ p->size = buf->st_size;
|
|
|
|
+ p->atime.tv_sec = buf->st_atime;
|
|
|
|
+ p->atime.tv_nsec = 0;
|
|
|
|
+ p->ctime.tv_sec = buf->st_ctime;
|
|
|
|
+ p->ctime.tv_nsec = 0;
|
|
|
|
+ p->mtime.tv_sec = buf->st_mtime;
|
|
|
|
+ p->mtime.tv_nsec = 0;
|
|
|
|
+ p->blksize = buf->st_blksize;
|
|
|
|
+ p->blocks = buf->st_blocks;
|
|
|
|
+ p->maj = os_major(buf->st_rdev);
|
|
|
|
+ p->min = os_minor(buf->st_rdev);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+int stat_file(const char *path, struct hostfs_stat *p, int fd)
|
|
{
|
|
{
|
|
struct stat64 buf;
|
|
struct stat64 buf;
|
|
|
|
|
|
@@ -33,35 +49,7 @@ int stat_file(const char *path, unsigned long long *inode_out, int *mode_out,
|
|
} else if (lstat64(path, &buf) < 0) {
|
|
} else if (lstat64(path, &buf) < 0) {
|
|
return -errno;
|
|
return -errno;
|
|
}
|
|
}
|
|
-
|
|
|
|
- if (inode_out != NULL)
|
|
|
|
- *inode_out = buf.st_ino;
|
|
|
|
- if (mode_out != NULL)
|
|
|
|
- *mode_out = buf.st_mode;
|
|
|
|
- if (nlink_out != NULL)
|
|
|
|
- *nlink_out = buf.st_nlink;
|
|
|
|
- if (uid_out != NULL)
|
|
|
|
- *uid_out = buf.st_uid;
|
|
|
|
- if (gid_out != NULL)
|
|
|
|
- *gid_out = buf.st_gid;
|
|
|
|
- if (size_out != NULL)
|
|
|
|
- *size_out = buf.st_size;
|
|
|
|
- if (atime_out != NULL) {
|
|
|
|
- atime_out->tv_sec = buf.st_atime;
|
|
|
|
- atime_out->tv_nsec = 0;
|
|
|
|
- }
|
|
|
|
- if (mtime_out != NULL) {
|
|
|
|
- mtime_out->tv_sec = buf.st_mtime;
|
|
|
|
- mtime_out->tv_nsec = 0;
|
|
|
|
- }
|
|
|
|
- if (ctime_out != NULL) {
|
|
|
|
- ctime_out->tv_sec = buf.st_ctime;
|
|
|
|
- ctime_out->tv_nsec = 0;
|
|
|
|
- }
|
|
|
|
- if (blksize_out != NULL)
|
|
|
|
- *blksize_out = buf.st_blksize;
|
|
|
|
- if (blocks_out != NULL)
|
|
|
|
- *blocks_out = buf.st_blocks;
|
|
|
|
|
|
+ stat64_to_hostfs(&buf, p);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -235,8 +223,8 @@ int file_create(char *name, int ur, int uw, int ux, int gr,
|
|
|
|
|
|
int set_attr(const char *file, struct hostfs_iattr *attrs, int fd)
|
|
int set_attr(const char *file, struct hostfs_iattr *attrs, int fd)
|
|
{
|
|
{
|
|
|
|
+ struct hostfs_stat st;
|
|
struct timeval times[2];
|
|
struct timeval times[2];
|
|
- struct timespec atime_ts, mtime_ts;
|
|
|
|
int err, ma;
|
|
int err, ma;
|
|
|
|
|
|
if (attrs->ia_valid & HOSTFS_ATTR_MODE) {
|
|
if (attrs->ia_valid & HOSTFS_ATTR_MODE) {
|
|
@@ -279,15 +267,14 @@ int set_attr(const char *file, struct hostfs_iattr *attrs, int fd)
|
|
*/
|
|
*/
|
|
ma = (HOSTFS_ATTR_ATIME_SET | HOSTFS_ATTR_MTIME_SET);
|
|
ma = (HOSTFS_ATTR_ATIME_SET | HOSTFS_ATTR_MTIME_SET);
|
|
if (attrs->ia_valid & ma) {
|
|
if (attrs->ia_valid & ma) {
|
|
- err = stat_file(file, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
- &atime_ts, &mtime_ts, NULL, NULL, NULL, fd);
|
|
|
|
|
|
+ err = stat_file(file, &st, fd);
|
|
if (err != 0)
|
|
if (err != 0)
|
|
return err;
|
|
return err;
|
|
|
|
|
|
- times[0].tv_sec = atime_ts.tv_sec;
|
|
|
|
- times[0].tv_usec = atime_ts.tv_nsec / 1000;
|
|
|
|
- times[1].tv_sec = mtime_ts.tv_sec;
|
|
|
|
- times[1].tv_usec = mtime_ts.tv_nsec / 1000;
|
|
|
|
|
|
+ times[0].tv_sec = st.atime.tv_sec;
|
|
|
|
+ times[0].tv_usec = st.atime.tv_nsec / 1000;
|
|
|
|
+ times[1].tv_sec = st.mtime.tv_sec;
|
|
|
|
+ times[1].tv_usec = st.mtime.tv_nsec / 1000;
|
|
|
|
|
|
if (attrs->ia_valid & HOSTFS_ATTR_ATIME_SET) {
|
|
if (attrs->ia_valid & HOSTFS_ATTR_ATIME_SET) {
|
|
times[0].tv_sec = attrs->ia_atime.tv_sec;
|
|
times[0].tv_sec = attrs->ia_atime.tv_sec;
|
|
@@ -308,9 +295,9 @@ int set_attr(const char *file, struct hostfs_iattr *attrs, int fd)
|
|
|
|
|
|
/* Note: ctime is not handled */
|
|
/* Note: ctime is not handled */
|
|
if (attrs->ia_valid & (HOSTFS_ATTR_ATIME | HOSTFS_ATTR_MTIME)) {
|
|
if (attrs->ia_valid & (HOSTFS_ATTR_ATIME | HOSTFS_ATTR_MTIME)) {
|
|
- err = stat_file(file, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
- &attrs->ia_atime, &attrs->ia_mtime, NULL,
|
|
|
|
- NULL, NULL, fd);
|
|
|
|
|
|
+ err = stat_file(file, &st, fd);
|
|
|
|
+ attrs->ia_atime = st.atime;
|
|
|
|
+ attrs->ia_mtime = st.mtime;
|
|
if (err != 0)
|
|
if (err != 0)
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|