[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] xl: move some helper functions to xl_utils.c
Move some commonly used functions to a new file. find_domain requires access to global variable common_domname. Make that non-static. No functional change. Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> --- tools/xl/Makefile | 2 +- tools/xl/xl_cmdimpl.c | 221 +----------------------------------------- tools/xl/xl_utils.c | 258 ++++++++++++++++++++++++++++++++++++++++++++++++++ tools/xl/xl_utils.h | 27 ++++++ 4 files changed, 287 insertions(+), 221 deletions(-) create mode 100644 tools/xl/xl_utils.c diff --git a/tools/xl/Makefile b/tools/xl/Makefile index 7106009d66..2f740b4789 100644 --- a/tools/xl/Makefile +++ b/tools/xl/Makefile @@ -15,7 +15,7 @@ LDFLAGS += $(PTHREAD_LDFLAGS) CFLAGS_XL += $(CFLAGS_libxenlight) CFLAGS_XL += -Wshadow -XL_OBJS = xl.o xl_cmdimpl.o xl_cmdtable.o xl_sxp.o +XL_OBJS = xl.o xl_cmdimpl.o xl_cmdtable.o xl_sxp.o xl_utils.o $(XL_OBJS): CFLAGS += $(CFLAGS_libxentoollog) $(XL_OBJS): CFLAGS += $(CFLAGS_XL) $(XL_OBJS): CFLAGS += -include $(XEN_ROOT)/tools/config.h # libxl_json.h needs it. diff --git a/tools/xl/xl_cmdimpl.c b/tools/xl/xl_cmdimpl.c index d9d947827d..de9e6add65 100644 --- a/tools/xl/xl_cmdimpl.c +++ b/tools/xl/xl_cmdimpl.c @@ -19,7 +19,6 @@ #include <string.h> #include <unistd.h> #include <time.h> -#include <getopt.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/time.h> @@ -48,7 +47,7 @@ libxl_ctx *ctx; xlchild children[child_max]; -static const char *common_domname; +const char *common_domname; static int fd_lock = -1; static const char savefileheader_magic[32]= @@ -129,22 +128,6 @@ struct domain_create { char **migration_domname_r; /* from malloc */ }; - -static uint32_t find_domain(const char *p) __attribute__((warn_unused_result)); -static uint32_t find_domain(const char *p) -{ - uint32_t domid; - int rc; - - rc = libxl_domain_qualifier_to_domid(ctx, p, &domid); - if (rc) { - fprintf(stderr, "%s is an invalid domain identifier (rc=%d)\n", p, rc); - exit(EXIT_FAILURE); - } - common_domname = libxl_domid_to_name(ctx, domid); - return domid; -} - int child_report(xlchildnum child) { int status; @@ -253,47 +236,6 @@ release_lock: return rc; } -static void *xmalloc(size_t sz) { - void *r; - r = malloc(sz); - if (!r) { fprintf(stderr,"xl: Unable to malloc %lu bytes.\n", - (unsigned long)sz); exit(-ERROR_FAIL); } - return r; -} - -static void *xcalloc(size_t n, size_t sz) __attribute__((unused)); -static void *xcalloc(size_t n, size_t sz) { - void *r = calloc(n, sz); - if (!r) { - fprintf(stderr,"xl: Unable to calloc %zu bytes.\n", sz*n); - exit(-ERROR_FAIL); - } - return r; -} - -static void *xrealloc(void *ptr, size_t sz) { - void *r; - if (!sz) { free(ptr); return 0; } - /* realloc(non-0, 0) has a useless return value; - * but xrealloc(anything, 0) is like free - */ - r = realloc(ptr, sz); - if (!r) { fprintf(stderr,"xl: Unable to realloc to %lu bytes.\n", - (unsigned long)sz); exit(-ERROR_FAIL); } - return r; -} - -static char *xstrdup(const char *x) -{ - char *r; - r = strdup(x); - if (!r) { - fprintf(stderr, "xl: Unable to strdup a string of length %zu.\n", - strlen(x)); - exit(-ERROR_FAIL); - } - return r; -} #define ARRAY_EXTEND_INIT__CORE(array,count,initfn,more) \ ({ \ @@ -313,46 +255,6 @@ static char *xstrdup(const char *x) #define ARRAY_EXTEND_INIT_NODEVID(array,count,initfn) \ ARRAY_EXTEND_INIT__CORE((array),(count),(initfn), /* nothing */ ) -static void dolog(const char *file, int line, const char *func, char *fmt, ...) - __attribute__((format(printf,4,5))); - -static void dolog(const char *file, int line, const char *func, char *fmt, ...) -{ - va_list ap; - char *s = NULL; - int rc; - - va_start(ap, fmt); - rc = vasprintf(&s, fmt, ap); - va_end(ap); - if (rc >= 0) - /* we ignore write errors since we have no way to report them; - * the alternative would be to abort the whole program */ - libxl_write_exactly(NULL, logfile, s, rc, NULL, NULL); - free(s); -} - -static void xvasprintf(char **strp, const char *fmt, va_list ap) - __attribute__((format(printf,2,0))); -static void xvasprintf(char **strp, const char *fmt, va_list ap) -{ - int r = vasprintf(strp, fmt, ap); - if (r == -1) { - perror("asprintf failed"); - exit(EXIT_FAILURE); - } -} - -static void xasprintf(char **strp, const char *fmt, ...) - __attribute__((format(printf,2,3))); -static void xasprintf(char **strp, const char *fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - xvasprintf(strp, fmt, ap); - va_end(ap); -} - static yajl_gen_status printf_info_one_json(yajl_gen hand, int domid, libxl_domain_config *d_config) { @@ -389,19 +291,6 @@ out: return s; } -static void flush_stream(FILE *fh) -{ - const char *fh_name = - fh == stdout ? "stdout" : - fh == stderr ? "stderr" : - (abort(), (const char*)0); - - if (ferror(fh) || fflush(fh)) { - perror(fh_name); - exit(EXIT_FAILURE); - } -} - static void printf_info(enum output_format output_format, int domid, libxl_domain_config *d_config, FILE *fh) @@ -3294,48 +3183,6 @@ static int64_t parse_mem_size_kb(const char *mem) return kbytes; } -/* - * Callers should use SWITCH_FOREACH_OPT in preference to calling this - * directly. - */ -static int def_getopt(int argc, char * const argv[], - const char *optstring, - const struct option *longopts, - const char* helpstr, int reqargs) -{ - int opt; - const struct option def_options[] = { - COMMON_LONG_OPTS - }; - - if (!longopts) - longopts = def_options; - - opterr = 0; - while ((opt = getopt_long(argc, argv, optstring, longopts, NULL)) == '?') { - if (optopt == 'h') { - help(helpstr); - exit(0); - } - fprintf(stderr, "option `%c' not supported.\n", optopt); - exit(2); - } - if (opt == 'h') { - help(helpstr); - exit(0); - } - if (opt != -1) - return opt; - - if (argc - optind <= reqargs - 1) { - fprintf(stderr, "'xl %s' requires at least %d argument%s.\n\n", - helpstr, reqargs, reqargs > 1 ? "s" : ""); - help(helpstr); - exit(2); - } - return -1; -} - static int set_memory_max(uint32_t domid, const char *mem) { int64_t memorykb; @@ -4155,56 +4002,6 @@ out: } } -static void print_bitmap(uint8_t *map, int maplen, FILE *stream) -{ - int i; - uint8_t pmap = 0, bitmask = 0; - int firstset = 0, state = 0; - - for (i = 0; i < maplen; i++) { - if (i % 8 == 0) { - pmap = *map++; - bitmask = 1; - } else bitmask <<= 1; - - switch (state) { - case 0: - case 2: - if ((pmap & bitmask) != 0) { - firstset = i; - state++; - } - continue; - case 1: - case 3: - if ((pmap & bitmask) == 0) { - fprintf(stream, "%s%d", state > 1 ? "," : "", firstset); - if (i - 1 > firstset) - fprintf(stream, "-%d", i - 1); - state = 2; - } - continue; - } - } - switch (state) { - case 0: - fprintf(stream, "none"); - break; - case 2: - break; - case 1: - if (firstset == 0) { - fprintf(stream, "all"); - break; - } - case 3: - fprintf(stream, "%s%d", state > 1 ? "," : "", firstset); - if (i - 1 > firstset) - fprintf(stream, "-%d", i - 1); - break; - } -} - static void list_domains(bool verbose, bool context, bool claim, bool numa, bool cpupool, const libxl_dominfo *info, int nb_domain) { @@ -5331,22 +5128,6 @@ int main_vm_list(int argc, char **argv) return EXIT_SUCCESS; } -static void string_realloc_append(char **accumulate, const char *more) -{ - /* Appends more to accumulate. Accumulate is either NULL, or - * points (always) to a malloc'd nul-terminated string. */ - - size_t oldlen = *accumulate ? strlen(*accumulate) : 0; - size_t morelen = strlen(more) + 1/*nul*/; - if (oldlen > SSIZE_MAX || morelen > SSIZE_MAX - oldlen) { - fprintf(stderr,"Additional config data far too large\n"); - exit(-ERROR_FAIL); - } - - *accumulate = xrealloc(*accumulate, oldlen + morelen); - memcpy(*accumulate + oldlen, more, morelen); -} - int main_create(int argc, char **argv) { const char *filename = NULL; diff --git a/tools/xl/xl_utils.c b/tools/xl/xl_utils.c new file mode 100644 index 0000000000..1ebe8005ae --- /dev/null +++ b/tools/xl/xl_utils.c @@ -0,0 +1,258 @@ +/* + * 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. + */ + +#define _GNU_SOURCE + +#include <limits.h> +#include <stdlib.h> +#include <unistd.h> + +#include <libxl.h> +#include <libxl_utils.h> + +#include "xl.h" +#include "xl_utils.h" + +extern int logfile; +extern const char *common_domname; + +void dolog(const char *file, int line, const char *func, char *fmt, ...) +{ + va_list ap; + char *s = NULL; + int rc; + + va_start(ap, fmt); + rc = vasprintf(&s, fmt, ap); + va_end(ap); + if (rc >= 0) + /* we ignore write errors since we have no way to report them; + * the alternative would be to abort the whole program */ + libxl_write_exactly(NULL, logfile, s, rc, NULL, NULL); + free(s); +} + +void xvasprintf(char **strp, const char *fmt, va_list ap) +{ + int r = vasprintf(strp, fmt, ap); + if (r == -1) { + perror("asprintf failed"); + exit(EXIT_FAILURE); + } +} + +void xasprintf(char **strp, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + xvasprintf(strp, fmt, ap); + va_end(ap); +} + +void *xmalloc(size_t sz) +{ + void *r; + r = malloc(sz); + if (!r) { + fprintf(stderr,"xl: Unable to malloc %lu bytes.\n", + (unsigned long)sz); + exit(-ERROR_FAIL); + } + return r; +} + +void *xcalloc(size_t n, size_t sz) +{ + void *r = calloc(n, sz); + if (!r) { + fprintf(stderr,"xl: Unable to calloc %zu bytes.\n", sz*n); + exit(-ERROR_FAIL); + } + return r; +} + +void *xrealloc(void *ptr, size_t sz) +{ + void *r; + if (!sz) { + free(ptr); + return 0; + } + /* realloc(non-0, 0) has a useless return value; + * but xrealloc(anything, 0) is like free + */ + r = realloc(ptr, sz); + if (!r) { + fprintf(stderr,"xl: Unable to realloc to %lu bytes.\n", + (unsigned long)sz); + exit(-ERROR_FAIL); + } + return r; +} + +char *xstrdup(const char *x) +{ + char *r; + r = strdup(x); + if (!r) { + fprintf(stderr, "xl: Unable to strdup a string of length %zu.\n", + strlen(x)); + exit(-ERROR_FAIL); + } + return r; +} + +void flush_stream(FILE *fh) +{ + const char *fh_name = + fh == stdout ? "stdout" : + fh == stderr ? "stderr" : + (abort(), (const char*)0); + + if (ferror(fh) || fflush(fh)) { + perror(fh_name); + exit(EXIT_FAILURE); + } +} + +uint32_t find_domain(const char *p) +{ + uint32_t domid; + int rc; + + rc = libxl_domain_qualifier_to_domid(ctx, p, &domid); + if (rc) { + fprintf(stderr, "%s is an invalid domain identifier (rc=%d)\n", p, rc); + exit(EXIT_FAILURE); + } + common_domname = libxl_domid_to_name(ctx, domid); + return domid; +} + +/* + * Callers should use SWITCH_FOREACH_OPT in preference to calling this + * directly. + */ +int def_getopt(int argc, char * const argv[], + const char *optstring, + const struct option *longopts, + const char* helpstr, int reqargs) +{ + int opt; + const struct option def_options[] = { + COMMON_LONG_OPTS + }; + + if (!longopts) + longopts = def_options; + + opterr = 0; + while ((opt = getopt_long(argc, argv, optstring, longopts, NULL)) == '?') { + if (optopt == 'h') { + help(helpstr); + exit(0); + } + fprintf(stderr, "option `%c' not supported.\n", optopt); + exit(2); + } + if (opt == 'h') { + help(helpstr); + exit(0); + } + if (opt != -1) + return opt; + + if (argc - optind <= reqargs - 1) { + fprintf(stderr, "'xl %s' requires at least %d argument%s.\n\n", + helpstr, reqargs, reqargs > 1 ? "s" : ""); + help(helpstr); + exit(2); + } + return -1; +} + +void string_realloc_append(char **accumulate, const char *more) +{ + /* Appends more to accumulate. Accumulate is either NULL, or + * points (always) to a malloc'd nul-terminated string. */ + + size_t oldlen = *accumulate ? strlen(*accumulate) : 0; + size_t morelen = strlen(more) + 1/*nul*/; + if (oldlen > SSIZE_MAX || morelen > SSIZE_MAX - oldlen) { + fprintf(stderr,"Additional config data far too large\n"); + exit(-ERROR_FAIL); + } + + *accumulate = xrealloc(*accumulate, oldlen + morelen); + memcpy(*accumulate + oldlen, more, morelen); +} + +void print_bitmap(uint8_t *map, int maplen, FILE *stream) +{ + int i; + uint8_t pmap = 0, bitmask = 0; + int firstset = 0, state = 0; + + for (i = 0; i < maplen; i++) { + if (i % 8 == 0) { + pmap = *map++; + bitmask = 1; + } else bitmask <<= 1; + + switch (state) { + case 0: + case 2: + if ((pmap & bitmask) != 0) { + firstset = i; + state++; + } + continue; + case 1: + case 3: + if ((pmap & bitmask) == 0) { + fprintf(stream, "%s%d", state > 1 ? "," : "", firstset); + if (i - 1 > firstset) + fprintf(stream, "-%d", i - 1); + state = 2; + } + continue; + } + } + switch (state) { + case 0: + fprintf(stream, "none"); + break; + case 2: + break; + case 1: + if (firstset == 0) { + fprintf(stream, "all"); + break; + } + case 3: + fprintf(stream, "%s%d", state > 1 ? "," : "", firstset); + if (i - 1 > firstset) + fprintf(stream, "-%d", i - 1); + break; + } +} + + +/* + * Local variables: + * mode: C + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/tools/xl/xl_utils.h b/tools/xl/xl_utils.h index ebb9305b7c..a2cf138523 100644 --- a/tools/xl/xl_utils.h +++ b/tools/xl/xl_utils.h @@ -15,6 +15,8 @@ #ifndef XL_UTILS_H #define XL_UTILS_H +#include <getopt.h> + /* For calls which return an errno on failure */ #define CHK_ERRNOVAL( call ) ({ \ int chk_errnoval = (call); \ @@ -118,6 +120,31 @@ #define COMMON_LONG_OPTS {"help", 0, 0, 'h'}, \ {0, 0, 0, 0} +int def_getopt(int argc, char * const argv[], + const char *optstring, + const struct option *longopts, + const char* helpstr, int reqargs); + +void dolog(const char *file, int line, const char *func, char *fmt, ...) + __attribute__((format(printf,4,5))); + +void xvasprintf(char **strp, const char *fmt, va_list ap) + __attribute__((format(printf,2,0))); + +void xasprintf(char **strp, const char *fmt, ...) + __attribute__((format(printf,2,3))); + +void *xmalloc(size_t sz); +void *xcalloc(size_t n, size_t sz); +void *xrealloc(void *ptr, size_t sz); +char *xstrdup(const char *x); +void string_realloc_append(char **accumulate, const char *more); + +void flush_stream(FILE *fh); +uint32_t find_domain(const char *p) __attribute__((warn_unused_result)); + +void print_bitmap(uint8_t *map, int maplen, FILE *stream); + #endif /* XL_UTILS_H */ /* -- 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 |