X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=daemon%2Fstat.c;h=45d2cb8822beeb2a88a625072123bdc142d60294;hb=64de216ac7b6ef94f801e214a989c578f26956e8;hp=4ff27113fd33ed613c69ca2f257a25c480cac0a0;hpb=84fc760439e82e6b3616abd0d1f9bd7d7eb01ec0;p=libguestfs.git diff --git a/daemon/stat.c b/daemon/stat.c index 4ff2711..45d2cb8 100644 --- a/daemon/stat.c +++ b/daemon/stat.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include "../src/guestfs_protocol.h" @@ -60,8 +61,16 @@ do_stat (const char *path) ret->gid = statbuf.st_gid; ret->rdev = statbuf.st_rdev; ret->size = statbuf.st_size; +#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE ret->blksize = statbuf.st_blksize; +#else + ret->blksize = -1; +#endif +#ifdef HAVE_STRUCT_STAT_ST_BLOCKS ret->blocks = statbuf.st_blocks; +#else + ret->blocks = -1; +#endif ret->atime = statbuf.st_atime; ret->mtime = statbuf.st_mtime; ret->ctime = statbuf.st_ctime; @@ -99,8 +108,16 @@ do_lstat (const char *path) ret->gid = statbuf.st_gid; ret->rdev = statbuf.st_rdev; ret->size = statbuf.st_size; +#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE ret->blksize = statbuf.st_blksize; +#else + ret->blksize = -1; +#endif +#ifdef HAVE_STRUCT_STAT_ST_BLOCKS ret->blocks = statbuf.st_blocks; +#else + ret->blocks = -1; +#endif ret->atime = statbuf.st_atime; ret->mtime = statbuf.st_mtime; ret->ctime = statbuf.st_ctime; @@ -108,6 +125,81 @@ do_lstat (const char *path) return ret; } +guestfs_int_stat_list * +do_lstatlist (const char *path, char *const *names) +{ + int path_fd; + guestfs_int_stat_list *ret; + size_t i, nr_names; + + nr_names = count_strings (names); + + ret = malloc (sizeof *ret); + if (!ret) { + reply_with_perror ("malloc"); + return NULL; + } + ret->guestfs_int_stat_list_len = nr_names; + ret->guestfs_int_stat_list_val = calloc (nr_names, sizeof (guestfs_int_stat)); + if (ret->guestfs_int_stat_list_val == NULL) { + reply_with_perror ("malloc"); + free (ret); + return NULL; + } + + CHROOT_IN; + path_fd = open (path, O_RDONLY | O_DIRECTORY); + CHROOT_OUT; + + if (path_fd == -1) { + reply_with_perror ("lstatlist: %s", path); + free (ret->guestfs_int_stat_list_val); + free (ret); + return NULL; + } + + for (i = 0; names[i] != NULL; ++i) { + int r; + struct stat statbuf; + + r = fstatat (path_fd, names[i], &statbuf, AT_SYMLINK_NOFOLLOW); + if (r == -1) + ret->guestfs_int_stat_list_val[i].ino = -1; + else { + ret->guestfs_int_stat_list_val[i].dev = statbuf.st_dev; + ret->guestfs_int_stat_list_val[i].ino = statbuf.st_ino; + ret->guestfs_int_stat_list_val[i].mode = statbuf.st_mode; + ret->guestfs_int_stat_list_val[i].nlink = statbuf.st_nlink; + ret->guestfs_int_stat_list_val[i].uid = statbuf.st_uid; + ret->guestfs_int_stat_list_val[i].gid = statbuf.st_gid; + ret->guestfs_int_stat_list_val[i].rdev = statbuf.st_rdev; + ret->guestfs_int_stat_list_val[i].size = statbuf.st_size; +#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE + ret->guestfs_int_stat_list_val[i].blksize = statbuf.st_blksize; +#else + ret->guestfs_int_stat_list_val[i].blksize = -1; +#endif +#ifdef HAVE_STRUCT_STAT_ST_BLOCKS + ret->guestfs_int_stat_list_val[i].blocks = statbuf.st_blocks; +#else + ret->guestfs_int_stat_list_val[i].blocks = -1; +#endif + ret->guestfs_int_stat_list_val[i].atime = statbuf.st_atime; + ret->guestfs_int_stat_list_val[i].mtime = statbuf.st_mtime; + ret->guestfs_int_stat_list_val[i].ctime = statbuf.st_ctime; + } + } + + if (close (path_fd) == -1) { + reply_with_perror ("close: %s", path); + free (ret->guestfs_int_stat_list_val); + free (ret); + return NULL; + } + + return ret; +} + guestfs_int_statvfs * do_statvfs (const char *path) {