[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 07/29] xl: lift a bunch of macros to xl_utils.h
We're going to split xl_cmdimpl.c into multiple files. Lift the commonly used macros to xl_utils.h. Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> --- tools/xl/xl_cmdimpl.c | 104 +--------------------------------------- tools/xl/xl_utils.h | 129 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+), 103 deletions(-) create mode 100644 tools/xl/xl_utils.h diff --git a/tools/xl/xl_cmdimpl.c b/tools/xl/xl_cmdimpl.c index 1d7cf8ffa8..d9d947827d 100644 --- a/tools/xl/xl_cmdimpl.c +++ b/tools/xl/xl_cmdimpl.c @@ -39,42 +39,7 @@ #include <libxl_json.h> #include <libxlutil.h> #include "xl.h" - -/* For calls which return an errno on failure */ -#define CHK_ERRNOVAL( call ) ({ \ - int chk_errnoval = (call); \ - if (chk_errnoval < 0) \ - abort(); \ - else if (chk_errnoval > 0) { \ - fprintf(stderr,"xl: fatal error: %s:%d: %s: %s\n", \ - __FILE__,__LINE__, strerror(chk_errnoval), #call); \ - exit(EXIT_FAILURE); \ - } \ - }) - -/* For calls which return -1 and set errno on failure */ -#define CHK_SYSCALL( call ) ({ \ - if ((call) == -1) { \ - fprintf(stderr,"xl: fatal error: %s:%d: %s: %s\n", \ - __FILE__,__LINE__, strerror(errno), #call); \ - exit(EXIT_FAILURE); \ - } \ - }) - -#define MUST( call ) ({ \ - int must_rc = (call); \ - if (must_rc < 0) { \ - fprintf(stderr,"xl: fatal error: %s:%d, rc=%d: %s\n", \ - __FILE__,__LINE__, must_rc, #call); \ - exit(EXIT_FAILURE); \ - } \ - }) - -#define STR_HAS_PREFIX( a, b ) \ - ( strncmp(a, b, strlen(b)) == 0 ) -#define STR_SKIP_PREFIX( a, b ) \ - ( STR_HAS_PREFIX(a, b) ? ((a) += strlen(b), 1) : 0 ) - +#include "xl_utils.h" int logfile = 2; @@ -83,7 +48,6 @@ libxl_ctx *ctx; xlchild children[child_max]; -#define INVALID_DOMID ~0 static const char *common_domname; static int fd_lock = -1; @@ -349,8 +313,6 @@ static char *xstrdup(const char *x) #define ARRAY_EXTEND_INIT_NODEVID(array,count,initfn) \ ARRAY_EXTEND_INIT__CORE((array),(count),(initfn), /* nothing */ ) -#define LOG(_f, _a...) dolog(__FILE__, __LINE__, __func__, _f "\n", ##_a) - static void dolog(const char *file, int line, const char *func, char *fmt, ...) __attribute__((format(printf,4,5))); @@ -3332,10 +3294,6 @@ static int64_t parse_mem_size_kb(const char *mem) return kbytes; } -/* Must be last in list */ -#define COMMON_LONG_OPTS {"help", 0, 0, 'h'}, \ - {0, 0, 0, 0} - /* * Callers should use SWITCH_FOREACH_OPT in preference to calling this * directly. @@ -3378,66 +3336,6 @@ static int def_getopt(int argc, char * const argv[], return -1; } -/* - * Wraps def_getopt into a convenient loop+switch to process all - * arguments. This macro is intended to be called from main_XXX(). - * - * SWITCH_FOREACH_OPT(int *opt, "OPTS", - * const struct option *longopts, - * const char *commandname, - * int num_opts_req) { ... - * - * opt: pointer to an int variable, holds the current option - * during processing. - * OPTS: short options, as per getopt_long(3)'s optstring argument. - * do not include "h"; will be provided automatically - * longopts: long options, as per getopt_long(3)'s longopts argument. - * May be null. - * commandname: name of this command, for usage string. - * num_required_opts: number of non-option command line parameters - * which are required. - * - * In addition the calling context is expected to contain variables - * "argc" and "argv" in the conventional C-style: - * main(int argc, char **argv) - * manner. - * - * Callers should treat SWITCH_FOREACH_OPT as they would a switch - * statement over the value of `opt`. Each option given in `opts` (or - * `lopts`) should be handled by a case statement as if it were inside - * a switch statement. - * - * In addition to the options provided in opts the macro will handle - * the "help" option and enforce a minimum number of non-option - * command line pearameters as follows: - * -- if the user passes a -h or --help option. help will be printed, - * and the macro will cause the process to exit with code 0. - * -- if the user does not provided `num_required_opts` non-option - * arguments, the macro will cause the process to exit with code 2. - * - * Example: - * - * int main_foo(int argc, char **argv) { - * int opt; - * - * SWITCH_FOREACH_OPT(opt, "blah", NULL, "foo", 0) { - * case 'b': - * ... handle b option... - * break; - * case 'l': - * ... handle l option ... - * break; - * case etc etc... - * } - * ... do something useful with the options ... - * } - */ -#define SWITCH_FOREACH_OPT(opt, opts, longopts, \ - commandname, num_required_opts) \ - while (((opt) = def_getopt(argc, argv, "h" opts, (longopts), \ - (commandname), (num_required_opts))) != -1) \ - switch (opt) - static int set_memory_max(uint32_t domid, const char *mem) { int64_t memorykb; diff --git a/tools/xl/xl_utils.h b/tools/xl/xl_utils.h new file mode 100644 index 0000000000..ebb9305b7c --- /dev/null +++ b/tools/xl/xl_utils.h @@ -0,0 +1,129 @@ +/* + * Copyright 2009-2017 Citrix Ltd and other contributors + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation; version 2.1 only. with the special + * exception on linking described in file LICENSE. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + */ + +#ifndef XL_UTILS_H +#define XL_UTILS_H + +/* For calls which return an errno on failure */ +#define CHK_ERRNOVAL( call ) ({ \ + int chk_errnoval = (call); \ + if (chk_errnoval < 0) \ + abort(); \ + else if (chk_errnoval > 0) { \ + fprintf(stderr,"xl: fatal error: %s:%d: %s: %s\n", \ + __FILE__,__LINE__, strerror(chk_errnoval), #call); \ + exit(EXIT_FAILURE); \ + } \ + }) + +/* For calls which return -1 and set errno on failure */ +#define CHK_SYSCALL( call ) ({ \ + if ((call) == -1) { \ + fprintf(stderr,"xl: fatal error: %s:%d: %s: %s\n", \ + __FILE__,__LINE__, strerror(errno), #call); \ + exit(EXIT_FAILURE); \ + } \ + }) + +#define MUST( call ) ({ \ + int must_rc = (call); \ + if (must_rc < 0) { \ + fprintf(stderr,"xl: fatal error: %s:%d, rc=%d: %s\n", \ + __FILE__,__LINE__, must_rc, #call); \ + exit(EXIT_FAILURE); \ + } \ + }) + +#define STR_HAS_PREFIX( a, b ) \ + ( strncmp(a, b, strlen(b)) == 0 ) +#define STR_SKIP_PREFIX( a, b ) \ + ( STR_HAS_PREFIX(a, b) ? ((a) += strlen(b), 1) : 0 ) + +#define INVALID_DOMID ~0 + +#define LOG(_f, _a...) dolog(__FILE__, __LINE__, __func__, _f "\n", ##_a) + +/* + * Wraps def_getopt into a convenient loop+switch to process all + * arguments. This macro is intended to be called from main_XXX(). + * + * SWITCH_FOREACH_OPT(int *opt, "OPTS", + * const struct option *longopts, + * const char *commandname, + * int num_opts_req) { ... + * + * opt: pointer to an int variable, holds the current option + * during processing. + * OPTS: short options, as per getopt_long(3)'s optstring argument. + * do not include "h"; will be provided automatically + * longopts: long options, as per getopt_long(3)'s longopts argument. + * May be null. + * commandname: name of this command, for usage string. + * num_required_opts: number of non-option command line parameters + * which are required. + * + * In addition the calling context is expected to contain variables + * "argc" and "argv" in the conventional C-style: + * main(int argc, char **argv) + * manner. + * + * Callers should treat SWITCH_FOREACH_OPT as they would a switch + * statement over the value of `opt`. Each option given in `opts` (or + * `lopts`) should be handled by a case statement as if it were inside + * a switch statement. + * + * In addition to the options provided in opts the macro will handle + * the "help" option and enforce a minimum number of non-option + * command line pearameters as follows: + * -- if the user passes a -h or --help option. help will be printed, + * and the macro will cause the process to exit with code 0. + * -- if the user does not provided `num_required_opts` non-option + * arguments, the macro will cause the process to exit with code 2. + * + * Example: + * + * int main_foo(int argc, char **argv) { + * int opt; + * + * SWITCH_FOREACH_OPT(opt, "blah", NULL, "foo", 0) { + * case 'b': + * ... handle b option... + * break; + * case 'l': + * ... handle l option ... + * break; + * case etc etc... + * } + * ... do something useful with the options ... + * } + */ +#define SWITCH_FOREACH_OPT(opt, opts, longopts, \ + commandname, num_required_opts) \ + while (((opt) = def_getopt(argc, argv, "h" opts, (longopts), \ + (commandname), (num_required_opts))) != -1) \ + switch (opt) + +/* Must be last in list */ +#define COMMON_LONG_OPTS {"help", 0, 0, 'h'}, \ + {0, 0, 0, 0} + +#endif /* XL_UTILS_H */ + +/* + * Local variables: + * mode: C + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ -- 2.11.0 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |