Added stat, lstat, statvfs and associated stat structures.
[libguestfs.git] / daemon / stat.c
1 /* libguestfs - the guestfsd daemon
2  * Copyright (C) 2009 Red Hat Inc. 
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17  */
18
19 #include <config.h>
20
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <sys/types.h>
25 #include <sys/stat.h>
26 #include <sys/statvfs.h>
27 #include <unistd.h>
28
29 #include "../src/guestfs_protocol.h"
30 #include "daemon.h"
31 #include "actions.h"
32
33 guestfs_int_stat *
34 do_stat (const char *path)
35 {
36   int r;
37   guestfs_int_stat *ret;
38   struct stat statbuf;
39
40   NEED_ROOT (NULL);
41   ABS_PATH (path, NULL);
42
43   CHROOT_IN;
44   r = stat (path, &statbuf);
45   CHROOT_OUT;
46
47   if (r == -1) {
48     reply_with_perror ("stat");
49     return NULL;
50   }
51
52   ret = malloc (sizeof *ret);
53   if (ret == NULL) {
54     reply_with_perror ("malloc");
55     return NULL;
56   }
57
58   ret->dev = statbuf.st_dev;
59   ret->ino = statbuf.st_ino;
60   ret->mode = statbuf.st_mode;
61   ret->nlink = statbuf.st_nlink;
62   ret->uid = statbuf.st_uid;
63   ret->gid = statbuf.st_gid;
64   ret->rdev = statbuf.st_rdev;
65   ret->size = statbuf.st_size;
66   ret->blksize = statbuf.st_blksize;
67   ret->blocks = statbuf.st_blocks;
68   ret->atime = statbuf.st_atime;
69   ret->mtime = statbuf.st_mtime;
70   ret->ctime = statbuf.st_ctime;
71
72   return ret;
73 }
74
75 guestfs_int_stat *
76 do_lstat (const char *path)
77 {
78   int r;
79   guestfs_int_stat *ret;
80   struct stat statbuf;
81
82   NEED_ROOT (NULL);
83   ABS_PATH (path, NULL);
84
85   CHROOT_IN;
86   r = lstat (path, &statbuf);
87   CHROOT_OUT;
88
89   if (r == -1) {
90     reply_with_perror ("stat");
91     return NULL;
92   }
93
94   ret = malloc (sizeof *ret);
95   if (ret == NULL) {
96     reply_with_perror ("malloc");
97     return NULL;
98   }
99
100   ret->dev = statbuf.st_dev;
101   ret->ino = statbuf.st_ino;
102   ret->mode = statbuf.st_mode;
103   ret->nlink = statbuf.st_nlink;
104   ret->uid = statbuf.st_uid;
105   ret->gid = statbuf.st_gid;
106   ret->rdev = statbuf.st_rdev;
107   ret->size = statbuf.st_size;
108   ret->blksize = statbuf.st_blksize;
109   ret->blocks = statbuf.st_blocks;
110   ret->atime = statbuf.st_atime;
111   ret->mtime = statbuf.st_mtime;
112   ret->ctime = statbuf.st_ctime;
113
114   return ret;
115 }
116
117 guestfs_int_statvfs *
118 do_statvfs (const char *path)
119 {
120   int r;
121   guestfs_int_statvfs *ret;
122   struct statvfs statbuf;
123
124   NEED_ROOT (NULL);
125   ABS_PATH (path, NULL);
126
127   CHROOT_IN;
128   r = statvfs (path, &statbuf);
129   CHROOT_OUT;
130
131   if (r == -1) {
132     reply_with_perror ("statvfs");
133     return NULL;
134   }
135
136   ret = malloc (sizeof *ret);
137   if (ret == NULL) {
138     reply_with_perror ("malloc");
139     return NULL;
140   }
141
142   ret->bsize = statbuf.f_bsize;
143   ret->frsize = statbuf.f_frsize;
144   ret->blocks = statbuf.f_blocks;
145   ret->bfree = statbuf.f_bfree;
146   ret->bavail = statbuf.f_bavail;
147   ret->files = statbuf.f_files;
148   ret->ffree = statbuf.f_ffree;
149   ret->favail = statbuf.f_favail;
150   ret->fsid = statbuf.f_fsid;
151   ret->flag = statbuf.f_flag;
152   ret->namemax = statbuf.f_namemax;
153
154   return ret;
155 }