X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=daemon%2Fdaemon.h;h=bb1ebb3ad9c4425f0f4431774b0e6409a0a4e888;hb=1f56debfcfdc35d6b0e7fec469dba0598d7f1901;hp=f08269046d7c6ba6c093042abe8268a7e41364d6;hpb=d714547ab361962ca6f76ec07736f1515595b2df;p=libguestfs.git diff --git a/daemon/daemon.h b/daemon/daemon.h index f082690..bb1ebb3 100644 --- a/daemon/daemon.h +++ b/daemon/daemon.h @@ -19,6 +19,7 @@ #ifndef GUESTFSD_DAEMON_H #define GUESTFSD_DAEMON_H +#include #include #include #include @@ -55,13 +56,13 @@ extern void free_stringslen (char **argv, int len); #define COMMAND_FLAG_FOLD_STDOUT_ON_STDERR 1 extern int commandf (char **stdoutput, char **stderror, int flags, - const char *name, ...); + const char *name, ...); extern int commandrf (char **stdoutput, char **stderror, int flags, - const char *name, ...); + const char *name, ...); extern int commandvf (char **stdoutput, char **stderror, int flags, - char *const *argv); + char const *const *argv); extern int commandrvf (char **stdoutput, char **stderror, int flags, - char const* const *argv); + char const* const *argv); extern char **split_lines (char *str); @@ -101,14 +102,29 @@ extern guestfs_int_lvm_pv_list *parse_command_line_pvs (void); extern guestfs_int_lvm_vg_list *parse_command_line_vgs (void); extern guestfs_int_lvm_lv_list *parse_command_line_lvs (void); +/*-- in optgroups.c (auto-generated) --*/ +struct optgroup { + const char *group; /* Name of the optional group. */ + int (*available) (void); /* Function to test availability. */ +}; +extern struct optgroup optgroups[]; + +/*-- in sync.c --*/ +/* Use this as a replacement for sync(2). */ +extern int sync_disks (void); + /*-- in proto.c --*/ extern void main_loop (int sock) __attribute__((noreturn)); -/* ordinary daemon functions use these to indicate errors */ +/* ordinary daemon functions use these to indicate errors + * NB: you don't need to prefix the string with the current command, + * it is added automatically by the client-side RPC stubs. + */ extern void reply_with_error (const char *fs, ...) __attribute__((format (printf,1,2))); -extern void reply_with_perror (const char *fs, ...) - __attribute__((format (printf,1,2))); +extern void reply_with_perror_errno (int err, const char *fs, ...) + __attribute__((format (printf,2,3))); +#define reply_with_perror(...) reply_with_perror_errno(errno, __VA_ARGS__) /* daemon functions that receive files (FileIn) should call * receive_file for each FileIn parameter. @@ -118,7 +134,7 @@ extern int receive_file (receive_cb cb, void *opaque); /* daemon functions that receive files (FileIn) can call this * to cancel incoming transfers (eg. if there is a local error), - * but they MUST then call reply_with_error or reply_with_perror. + * but they MUST then call reply_with_*. */ extern void cancel_receive (void); @@ -164,7 +180,7 @@ extern void reply (xdrproc_t xdrp, char *ret); */ #define RESOLVE_DEVICE(path,fail_stmt) \ do { \ - if (strncmp ((path), "/dev/", 5) != 0) { \ + if (STRNEQLEN ((path), "/dev/", 5)) { \ reply_with_error ("%s: %s: expecting a device name", __func__, (path)); \ fail_stmt; \ } \ @@ -184,7 +200,7 @@ extern void reply (xdrproc_t xdrp, char *ret); */ #define REQUIRE_ROOT_OR_RESOLVE_DEVICE(path,fail_stmt) \ do { \ - if (strncmp ((path), "/dev/", 5) == 0) \ + if (STREQLEN ((path), "/dev/", 5)) \ RESOLVE_DEVICE ((path), fail_stmt); \ else { \ NEED_ROOT (fail_stmt); \ @@ -224,6 +240,16 @@ extern void reply (xdrproc_t xdrp, char *ret); } \ while (0) +/* Marks functions which are not available. + * NB. Cannot be used for FileIn functions. + */ +#define NOT_AVAILABLE(errcode) \ + do { \ + reply_with_error ("%s: function not available", __func__); \ + return (errcode); \ + } \ + while (0) + #ifndef __attribute__ # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) # define __attribute__(x) /* empty */ @@ -234,4 +260,14 @@ extern void reply (xdrproc_t xdrp, char *ret); # define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) #endif +#define STREQ(a,b) (strcmp((a),(b)) == 0) +#define STRCASEEQ(a,b) (strcasecmp((a),(b)) == 0) +#define STRNEQ(a,b) (strcmp((a),(b)) != 0) +#define STRCASENEQ(a,b) (strcasecmp((a),(b)) != 0) +#define STREQLEN(a,b,n) (strncmp((a),(b),(n)) == 0) +#define STRCASEEQLEN(a,b,n) (strncasecmp((a),(b),(n)) == 0) +#define STRNEQLEN(a,b,n) (strncmp((a),(b),(n)) != 0) +#define STRCASENEQLEN(a,b,n) (strncasecmp((a),(b),(n)) != 0) +#define STRPREFIX(a,b) (strncmp((a),(b),strlen((b))) == 0) + #endif /* GUESTFSD_DAEMON_H */