summaryrefslogtreecommitdiffstats
path: root/daemon
diff options
context:
space:
mode:
Diffstat (limited to 'daemon')
-rw-r--r--daemon/configure.ac34
-rw-r--r--daemon/inotify.c35
-rw-r--r--daemon/mknod.c5
-rw-r--r--daemon/readdir.c4
-rw-r--r--daemon/stat.c24
5 files changed, 98 insertions, 4 deletions
diff --git a/daemon/configure.ac b/daemon/configure.ac
index 0deaa3c8..92776c22 100644
--- a/daemon/configure.ac
+++ b/daemon/configure.ac
@@ -127,6 +127,14 @@ AM_PROG_CC_C_O
dnl Check support for 64 bit file offsets.
AC_SYS_LARGEFILE
+dnl Check if dirent (readdir) supports d_type member.
+AC_STRUCT_DIRENT_D_TYPE
+
+dnl Check if stat has the required fields.
+AC_STRUCT_ST_BLOCKS
+AC_CHECK_MEMBER([struct stat.st_blksize],[
+ AC_DEFINE([HAVE_STRUCT_STAT_ST_BLKSIZE],[1],[Define to 1 if 'st_blksize' is a member of 'struct stat'])])
+
dnl Check for Augeas (now optional).
AC_CHECK_LIB([augeas],[aug_match],[
LIBS="-laugeas $LIBS"
@@ -155,7 +163,28 @@ AC_CHECK_LIB([portablexdr],[xdrmem_create],[],[
])
dnl Functions which may not be available in older distributions.
-AC_CHECK_FUNCS([futimens listxattr llistxattr getxattr lgetxattr setxattr lsetxattr removexattr lremovexattr inotify_init1])
+AC_CHECK_FUNCS([\
+ futimens \
+ getxattr \
+ inotify_init1 \
+ lgetxattr \
+ listxattr \
+ llistxattr \
+ lsetxattr \
+ lremovexattr \
+ mknod \
+ removexattr \
+ setxattr])
+
+dnl Headers.
+AC_CHECK_HEADERS([\
+ attr/xattr.h \
+ netdb.h \
+ printf.h \
+ sys/inotify.h \
+ sys/select.h \
+ sys/wait.h \
+ sys/xattr.h])
dnl For modified printf, we need glibc either (old-style)
dnl register_printf_function or (new-style) register_printf_specifier.
@@ -173,9 +202,6 @@ AC_CHECK_FUNC([register_printf_specifier],[
This means you either have a very old glibc (pre-2.0) or you
are using some other libc where this is not supported.])])])
-dnl Headers.
-AC_CHECK_HEADERS([attr/xattr.h sys/xattr.h])
-
dnl Produce output files.
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([Makefile lib/Makefile tests/Makefile])
diff --git a/daemon/inotify.c b/daemon/inotify.c
index 3e314f03..465d0b6e 100644
--- a/daemon/inotify.c
+++ b/daemon/inotify.c
@@ -23,17 +23,22 @@
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
+
+#ifdef HAVE_SYS_INOTIFY_H
#include <sys/inotify.h>
+#endif
#include "../src/guestfs_protocol.h"
#include "daemon.h"
#include "actions.h"
+#ifdef HAVE_SYS_INOTIFY_H
/* Currently open inotify handle, or -1 if not opened. */
static int inotify_fd = -1;
static char inotify_buf[64*1024*1024]; /* Event buffer, [0..posn-1] is valid */
static size_t inotify_posn = 0;
+#endif
/* Because inotify_init does NEED_ROOT, NEED_INOTIFY implies NEED_ROOT. */
#define NEED_INOTIFY(errcode) \
@@ -49,6 +54,7 @@ static size_t inotify_posn = 0;
int
do_inotify_init (int max_events)
{
+#ifdef HAVE_SYS_INOTIFY_H
FILE *fp;
NEED_ROOT (return -1);
@@ -99,11 +105,16 @@ do_inotify_init (int max_events)
#endif
return 0;
+#else
+ reply_with_error ("%s is not available", __func__);
+ return -1;
+#endif
}
int
do_inotify_close (void)
{
+#ifdef HAVE_SYS_INOTIFY_H
NEED_INOTIFY (-1);
if (inotify_fd == -1) {
@@ -120,11 +131,16 @@ do_inotify_close (void)
inotify_posn = 0;
return 0;
+#else
+ reply_with_error ("%s is not available", __func__);
+ return -1;
+#endif
}
int64_t
do_inotify_add_watch (const char *path, int mask)
{
+#ifdef HAVE_SYS_INOTIFY_H
int64_t r;
char *buf;
@@ -144,11 +160,16 @@ do_inotify_add_watch (const char *path, int mask)
}
return r;
+#else
+ reply_with_error ("%s is not available", __func__);
+ return -1;
+#endif
}
int
do_inotify_rm_watch (int wd)
{
+#ifdef HAVE_SYS_INOTIFY_H
NEED_INOTIFY (-1);
if (inotify_rm_watch (inotify_fd, wd) == -1) {
@@ -157,11 +178,16 @@ do_inotify_rm_watch (int wd)
}
return 0;
+#else
+ reply_with_error ("%s is not available", __func__);
+ return -1;
+#endif
}
guestfs_int_inotify_event_list *
do_inotify_read (void)
{
+#ifdef HAVE_SYS_INOTIFY_H
int space;
guestfs_int_inotify_event_list *ret;
@@ -267,11 +293,16 @@ do_inotify_read (void)
xdr_free ((xdrproc_t) xdr_guestfs_int_inotify_event_list, (char *) ret);
free (ret);
return NULL;
+#else
+ reply_with_error ("%s is not available", __func__);
+ return NULL;
+#endif
}
char **
do_inotify_files (void)
{
+#ifdef HAVE_SYS_INOTIFY_H
char **ret = NULL;
int size = 0, alloc = 0;
unsigned int i;
@@ -339,4 +370,8 @@ do_inotify_files (void)
error:
unlink ("/tmp/inotify");
return NULL;
+#else
+ reply_with_error ("%s is not available", __func__);
+ return NULL;
+#endif
}
diff --git a/daemon/mknod.c b/daemon/mknod.c
index adaeb80e..6ff88efa 100644
--- a/daemon/mknod.c
+++ b/daemon/mknod.c
@@ -33,6 +33,7 @@
int
do_mknod (int mode, int devmajor, int devminor, const char *path)
{
+#ifdef HAVE_MKNOD
int r;
CHROOT_IN;
@@ -45,6 +46,10 @@ do_mknod (int mode, int devmajor, int devminor, const char *path)
}
return 0;
+#else
+ reply_with_error ("%s is not available", __func__);
+ return -1;
+#endif
}
int
diff --git a/daemon/readdir.c b/daemon/readdir.c
index ab42dfd2..876041eb 100644
--- a/daemon/readdir.c
+++ b/daemon/readdir.c
@@ -74,6 +74,7 @@ do_readdir (const char *path)
ret->guestfs_int_dirent_list_val = p;
v.ino = d->d_ino;
+#ifdef HAVE_STRUCT_DIRENT_D_TYPE
switch (d->d_type) {
case DT_BLK: v.ftyp = 'b'; break;
case DT_CHR: v.ftyp = 'c'; break;
@@ -85,6 +86,9 @@ do_readdir (const char *path)
case DT_UNKNOWN: v.ftyp = 'u'; break;
default: v.ftyp = '?'; break;
}
+#else
+ v.ftyp = 'u';
+#endif
ret->guestfs_int_dirent_list_val[i] = v;
diff --git a/daemon/stat.c b/daemon/stat.c
index 2441c9fe..45d2cb88 100644
--- a/daemon/stat.c
+++ b/daemon/stat.c
@@ -61,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;
@@ -100,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;
@@ -158,8 +174,16 @@ do_lstatlist (const char *path, char *const *names)
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;