X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=daemon%2Fstat.c;h=2441c9fe1e6d8be8d59a0257fc727b756db3aa91;hb=c477e2fb78347728aaacbbc89666dcda1481a4b9;hp=da360ce83ff6e643497a38363701b3fcdb748e44;hpb=a7b73d4a1e09f12b2002083618056f0c823c1dcf;p=libguestfs.git diff --git a/daemon/stat.c b/daemon/stat.c index da360ce..2441c9f 100644 --- a/daemon/stat.c +++ b/daemon/stat.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include "../src/guestfs_protocol.h" @@ -31,15 +32,12 @@ #include "actions.h" guestfs_int_stat * -do_stat (char *path) +do_stat (const char *path) { int r; guestfs_int_stat *ret; struct stat statbuf; - NEED_ROOT (NULL); - ABS_PATH (path, NULL); - CHROOT_IN; r = stat (path, &statbuf); CHROOT_OUT; @@ -73,15 +71,12 @@ do_stat (char *path) } guestfs_int_stat * -do_lstat (char *path) +do_lstat (const char *path) { int r; guestfs_int_stat *ret; struct stat statbuf; - NEED_ROOT (NULL); - ABS_PATH (path, NULL); - CHROOT_IN; r = lstat (path, &statbuf); CHROOT_OUT; @@ -114,16 +109,80 @@ do_lstat (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; + ret->guestfs_int_stat_list_val[i].blksize = statbuf.st_blksize; + ret->guestfs_int_stat_list_val[i].blocks = statbuf.st_blocks; + 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 (char *path) +do_statvfs (const char *path) { int r; guestfs_int_statvfs *ret; struct statvfs statbuf; - NEED_ROOT (NULL); - ABS_PATH (path, NULL); - CHROOT_IN; r = statvfs (path, &statbuf); CHROOT_OUT;