extern int command (char **stdoutput, char **stderror, const char *name, ...);
extern int commandr (char **stdoutput, char **stderror, const char *name, ...);
extern int commandv (char **stdoutput, char **stderror,
- char * const* const argv);
+ char * const* const argv);
extern int commandrv (char **stdoutput, char **stderror,
- char * const* const argv);
+ char * const* const argv);
extern char **split_lines (char *str);
* printf formatters %Q and %R. See HACKING file for more
* info about these.
*/
-static int
+static inline int
asprintf_nowarn (char **strp, const char *fmt, ...)
{
int r;
/* Helper for functions that need a root filesystem mounted.
* NB. Cannot be used for FileIn functions.
*/
-#define NEED_ROOT(errcode) \
+#define NEED_ROOT(fail_stmt) \
do { \
if (!root_mounted) { \
reply_with_error ("%s: you must call 'mount' first to mount the root filesystem", __func__); \
- return (errcode); \
+ fail_stmt; \
} \
} \
while (0)
/* Helper for functions that need an argument ("path") that is absolute.
* NB. Cannot be used for FileIn functions.
*/
-#define ABS_PATH(path,errcode) \
+#define ABS_PATH(path,fail_stmt) \
do { \
if ((path)[0] != '/') { \
reply_with_error ("%s: path must start with a / character", __func__); \
- return (errcode); \
+ fail_stmt; \
} \
} while (0)
*
* NB. Cannot be used for FileIn functions.
*/
-#define IS_DEVICE(path,errcode) \
+#define RESOLVE_DEVICE(path,fail_stmt) \
do { \
if (strncmp ((path), "/dev/", 5) != 0) { \
reply_with_error ("%s: %s: expecting a device name", __func__, (path)); \
- return (errcode); \
+ fail_stmt; \
} \
if (device_name_translation ((path), __func__) == -1) \
- return (errcode); \
+ fail_stmt; \
} while (0)
/* Helper for functions which need either an absolute path in the
* because we intend in future to make device parameters a distinct
* type from filenames.
*/
-#define NEED_ROOT_OR_IS_DEVICE(path,errcode) \
+#define REQUIRE_ROOT_OR_RESOLVE_DEVICE(path,fail_stmt) \
do { \
if (strncmp ((path), "/dev/", 5) == 0) \
- IS_DEVICE ((path),(errcode)); \
+ RESOLVE_DEVICE ((path), fail_stmt); \
else { \
- NEED_ROOT ((errcode)); \
- ABS_PATH ((path),(errcode)); \
+ NEED_ROOT (fail_stmt); \
+ ABS_PATH ((path),fail_stmt); \
} \
} while (0)
} \
while (0)
+#ifndef __attribute__
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8)
+# define __attribute__(x) /* empty */
+# endif
+#endif
+
+#ifndef ATTRIBUTE_UNUSED
+# define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+#endif
+
#endif /* GUESTFSD_DAEMON_H */