diff --git a/Makefile b/Makefile index ab3ad48bd..e8110bd2e 100644 --- a/Makefile +++ b/Makefile @@ -878,7 +878,7 @@ OBJS += src/mux_h2.o src/mux_fcgi.o src/http_ana.o src/stream.o \ src/ebistree.o src/auth.o src/wdt.o src/http_acl.o \ src/hpack-enc.o src/hpack-huff.o src/ebtree.o src/base64.o \ src/hash.o src/dgram.o src/version.o src/fix.o src/mqtt.o src/dns.o \ - src/server_state.o src/proto_uxdg.o + src/server_state.o src/proto_uxdg.o src/init.o ifneq ($(TRACE),) OBJS += src/calltrace.o diff --git a/include/haproxy/api.h b/include/haproxy/api.h index b1af6fffe..a0bb6a889 100644 --- a/include/haproxy/api.h +++ b/include/haproxy/api.h @@ -33,6 +33,6 @@ #include #include #include -#include +#include #endif diff --git a/include/haproxy/global.h b/include/haproxy/global.h index feb04c213..9d8f7896e 100644 --- a/include/haproxy/global.h +++ b/include/haproxy/global.h @@ -66,17 +66,6 @@ void run_poll_loop(void); int tell_old_pids(int sig); int delete_oldpid(int pid); void hap_register_build_opts(const char *str, int must_free); -void hap_register_post_check(int (*fct)()); -void hap_register_post_proxy_check(int (*fct)(struct proxy *)); -void hap_register_post_server_check(int (*fct)(struct server *)); -void hap_register_post_deinit(void (*fct)()); -void hap_register_proxy_deinit(void (*fct)(struct proxy *)); -void hap_register_server_deinit(void (*fct)(struct server *)); - -void hap_register_per_thread_alloc(int (*fct)()); -void hap_register_per_thread_init(int (*fct)()); -void hap_register_per_thread_deinit(void (*fct)()); -void hap_register_per_thread_free(void (*fct)()); void mworker_accept_wrapper(int fd); void mworker_reload(); @@ -106,46 +95,6 @@ static inline unsigned long thread_mask(unsigned long mask) #define REGISTER_BUILD_OPTS(str) \ INITCALL2(STG_REGISTER, hap_register_build_opts, (str), 0) -/* simplified way to declare a post-check callback in a file */ -#define REGISTER_POST_CHECK(fct) \ - INITCALL1(STG_REGISTER, hap_register_post_check, (fct)) - -/* simplified way to declare a post-proxy-check callback in a file */ -#define REGISTER_POST_PROXY_CHECK(fct) \ - INITCALL1(STG_REGISTER, hap_register_post_proxy_check, (fct)) - -/* simplified way to declare a post-server-check callback in a file */ -#define REGISTER_POST_SERVER_CHECK(fct) \ - INITCALL1(STG_REGISTER, hap_register_post_server_check, (fct)) - -/* simplified way to declare a post-deinit callback in a file */ -#define REGISTER_POST_DEINIT(fct) \ - INITCALL1(STG_REGISTER, hap_register_post_deinit, (fct)) - -/* simplified way to declare a proxy-deinit callback in a file */ -#define REGISTER_PROXY_DEINIT(fct) \ - INITCALL1(STG_REGISTER, hap_register_proxy_deinit, (fct)) - -/* simplified way to declare a proxy-deinit callback in a file */ -#define REGISTER_SERVER_DEINIT(fct) \ - INITCALL1(STG_REGISTER, hap_register_server_deinit, (fct)) - -/* simplified way to declare a per-thread allocation callback in a file */ -#define REGISTER_PER_THREAD_ALLOC(fct) \ - INITCALL1(STG_REGISTER, hap_register_per_thread_alloc, (fct)) - -/* simplified way to declare a per-thread init callback in a file */ -#define REGISTER_PER_THREAD_INIT(fct) \ - INITCALL1(STG_REGISTER, hap_register_per_thread_init, (fct)) - -/* simplified way to declare a per-thread deinit callback in a file */ -#define REGISTER_PER_THREAD_DEINIT(fct) \ - INITCALL1(STG_REGISTER, hap_register_per_thread_deinit, (fct)) - -/* simplified way to declare a per-thread free callback in a file */ -#define REGISTER_PER_THREAD_FREE(fct) \ - INITCALL1(STG_REGISTER, hap_register_per_thread_free, (fct)) - #endif /* _HAPROXY_GLOBAL_H */ /* diff --git a/include/haproxy/init-t.h b/include/haproxy/init-t.h new file mode 100644 index 000000000..dee86f867 --- /dev/null +++ b/include/haproxy/init-t.h @@ -0,0 +1,59 @@ +#ifndef _HAPROXY_INIT_T_H +#define _HAPROXY_INIT_T_H + +#include + +struct proxy; +struct server; + +struct post_check_fct { + struct list list; + int (*fct)(); +}; + +struct post_proxy_check_fct { + struct list list; + int (*fct)(struct proxy *); +}; + +struct post_server_check_fct { + struct list list; + int (*fct)(struct server *); +}; + +struct per_thread_alloc_fct { + struct list list; + int (*fct)(); +}; + +struct per_thread_init_fct { + struct list list; + int (*fct)(); +}; + +struct post_deinit_fct { + struct list list; + void (*fct)(); +}; + +struct proxy_deinit_fct { + struct list list; + void (*fct)(struct proxy *); +}; + +struct server_deinit_fct { + struct list list; + void (*fct)(struct server *); +}; + +struct per_thread_free_fct { + struct list list; + void (*fct)(); +}; + +struct per_thread_deinit_fct { + struct list list; + void (*fct)(); +}; + +#endif /* _HAPROXY_INIT_T_H */ diff --git a/include/haproxy/init.h b/include/haproxy/init.h new file mode 100644 index 000000000..4e8f09e26 --- /dev/null +++ b/include/haproxy/init.h @@ -0,0 +1,73 @@ +#ifndef _HAPROXY_INIT_H +#define _HAPROXY_INIT_H + +#include +#include + +struct proxy; +struct server; + +extern struct list post_check_list; +extern struct list post_proxy_check_list; +extern struct list post_server_check_list; +extern struct list per_thread_alloc_list; +extern struct list per_thread_init_list; +extern struct list post_deinit_list; +extern struct list proxy_deinit_list; +extern struct list server_deinit_list; +extern struct list per_thread_free_list; +extern struct list per_thread_deinit_list; + +void hap_register_post_check(int (*fct)()); +void hap_register_post_proxy_check(int (*fct)(struct proxy *)); +void hap_register_post_server_check(int (*fct)(struct server *)); +void hap_register_post_deinit(void (*fct)()); +void hap_register_proxy_deinit(void (*fct)(struct proxy *)); +void hap_register_server_deinit(void (*fct)(struct server *)); + +void hap_register_per_thread_alloc(int (*fct)()); +void hap_register_per_thread_init(int (*fct)()); +void hap_register_per_thread_deinit(void (*fct)()); +void hap_register_per_thread_free(void (*fct)()); + +/* simplified way to declare a post-check callback in a file */ +#define REGISTER_POST_CHECK(fct) \ + INITCALL1(STG_REGISTER, hap_register_post_check, (fct)) + +/* simplified way to declare a post-proxy-check callback in a file */ +#define REGISTER_POST_PROXY_CHECK(fct) \ + INITCALL1(STG_REGISTER, hap_register_post_proxy_check, (fct)) + +/* simplified way to declare a post-server-check callback in a file */ +#define REGISTER_POST_SERVER_CHECK(fct) \ + INITCALL1(STG_REGISTER, hap_register_post_server_check, (fct)) + +/* simplified way to declare a post-deinit callback in a file */ +#define REGISTER_POST_DEINIT(fct) \ + INITCALL1(STG_REGISTER, hap_register_post_deinit, (fct)) + +/* simplified way to declare a proxy-deinit callback in a file */ +#define REGISTER_PROXY_DEINIT(fct) \ + INITCALL1(STG_REGISTER, hap_register_proxy_deinit, (fct)) + +/* simplified way to declare a proxy-deinit callback in a file */ +#define REGISTER_SERVER_DEINIT(fct) \ + INITCALL1(STG_REGISTER, hap_register_server_deinit, (fct)) + +/* simplified way to declare a per-thread allocation callback in a file */ +#define REGISTER_PER_THREAD_ALLOC(fct) \ + INITCALL1(STG_REGISTER, hap_register_per_thread_alloc, (fct)) + +/* simplified way to declare a per-thread init callback in a file */ +#define REGISTER_PER_THREAD_INIT(fct) \ + INITCALL1(STG_REGISTER, hap_register_per_thread_init, (fct)) + +/* simplified way to declare a per-thread deinit callback in a file */ +#define REGISTER_PER_THREAD_DEINIT(fct) \ + INITCALL1(STG_REGISTER, hap_register_per_thread_deinit, (fct)) + +/* simplified way to declare a per-thread free callback in a file */ +#define REGISTER_PER_THREAD_FREE(fct) \ + INITCALL1(STG_REGISTER, hap_register_per_thread_free, (fct)) + +#endif /* _HAPROXY_INIT_H */ diff --git a/src/fcgi-app.c b/src/fcgi-app.c index a7f3842b6..61f904daf 100644 --- a/src/fcgi-app.c +++ b/src/fcgi-app.c @@ -17,7 +17,6 @@ #include #include #include -#include #include #include #include diff --git a/src/haproxy.c b/src/haproxy.c index 433d1b896..1d136e9f5 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -252,115 +252,6 @@ struct build_opts_str { int must_free; }; -/* These functions are called just after the point where the program exits - * after a config validity check, so they are generally suited for resource - * allocation and slow initializations that should be skipped during basic - * config checks. The functions must return 0 on success, or a combination - * of ERR_* flags (ERR_WARN, ERR_ABORT, ERR_FATAL, ...). The 2 latter cause - * and immediate exit, so the function must have emitted any useful error. - */ -struct list post_check_list = LIST_HEAD_INIT(post_check_list); -struct post_check_fct { - struct list list; - int (*fct)(); -}; - -/* These functions are called for each proxy just after the config validity - * check. The functions must return 0 on success, or a combination of ERR_* - * flags (ERR_WARN, ERR_ABORT, ERR_FATAL, ...). The 2 latter cause and immediate - * exit, so the function must have emitted any useful error. - */ -struct list post_proxy_check_list = LIST_HEAD_INIT(post_proxy_check_list); -struct post_proxy_check_fct { - struct list list; - int (*fct)(struct proxy *); -}; - -/* These functions are called for each server just after the config validity - * check. The functions must return 0 on success, or a combination of ERR_* - * flags (ERR_WARN, ERR_ABORT, ERR_FATAL, ...). The 2 latter cause and immediate - * exit, so the function must have emitted any useful error. - */ -struct list post_server_check_list = LIST_HEAD_INIT(post_server_check_list); -struct post_server_check_fct { - struct list list; - int (*fct)(struct server *); -}; - -/* These functions are called for each thread just after the thread creation - * and before running the init functions. They should be used to do per-thread - * (re-)allocations that are needed by subsequent functoins. They must return 0 - * if an error occurred. */ -struct list per_thread_alloc_list = LIST_HEAD_INIT(per_thread_alloc_list); -struct per_thread_alloc_fct { - struct list list; - int (*fct)(); -}; - -/* These functions are called for each thread just after the thread creation - * and before running the scheduler. They should be used to do per-thread - * initializations. They must return 0 if an error occurred. */ -struct list per_thread_init_list = LIST_HEAD_INIT(per_thread_init_list); -struct per_thread_init_fct { - struct list list; - int (*fct)(); -}; - -/* These functions are called when freeing the global sections at the end of - * deinit, after everything is stopped. They don't return anything. They should - * not release shared resources that are possibly used by other deinit - * functions, only close/release what is private. Use the per_thread_free_list - * to release shared resources. - */ -struct list post_deinit_list = LIST_HEAD_INIT(post_deinit_list); -struct post_deinit_fct { - struct list list; - void (*fct)(); -}; - -/* These functions are called when freeing a proxy during the deinit, after - * everything isg stopped. They don't return anything. They should not release - * the proxy itself or any shared resources that are possibly used by other - * deinit functions, only close/release what is private. - */ -struct list proxy_deinit_list = LIST_HEAD_INIT(proxy_deinit_list); -struct proxy_deinit_fct { - struct list list; - void (*fct)(struct proxy *); -}; - -/* These functions are called when freeing a server during the deinit, after - * everything isg stopped. They don't return anything. They should not release - * the proxy itself or any shared resources that are possibly used by other - * deinit functions, only close/release what is private. - */ -struct list server_deinit_list = LIST_HEAD_INIT(server_deinit_list); -struct server_deinit_fct { - struct list list; - void (*fct)(struct server *); -}; - -/* These functions are called when freeing the global sections at the end of - * deinit, after the thread deinit functions, to release unneeded memory - * allocations. They don't return anything, and they work in best effort mode - * as their sole goal is to make valgrind mostly happy. - */ -struct list per_thread_free_list = LIST_HEAD_INIT(per_thread_free_list); -struct per_thread_free_fct { - struct list list; - void (*fct)(); -}; - -/* These functions are called for each thread just after the scheduler loop and - * before exiting the thread. They don't return anything and, as for post-deinit - * functions, they work in best effort mode as their sole goal is to make - * valgrind mostly happy. */ -struct list per_thread_deinit_list = LIST_HEAD_INIT(per_thread_deinit_list); -struct per_thread_deinit_fct { - struct list list; - void (*fct)(); -}; - /*********************************************************************/ /* general purpose functions ***************************************/ /*********************************************************************/ @@ -382,157 +273,6 @@ void hap_register_build_opts(const char *str, int must_free) LIST_ADDQ(&build_opts_list, &b->list); } -/* used to register some initialization functions to call after the checks. */ -void hap_register_post_check(int (*fct)()) -{ - struct post_check_fct *b; - - b = calloc(1, sizeof(*b)); - if (!b) { - fprintf(stderr, "out of memory\n"); - exit(1); - } - b->fct = fct; - LIST_ADDQ(&post_check_list, &b->list); -} - -/* used to register some initialization functions to call for each proxy after - * the checks. - */ -void hap_register_post_proxy_check(int (*fct)(struct proxy *)) -{ - struct post_proxy_check_fct *b; - - b = calloc(1, sizeof(*b)); - if (!b) { - fprintf(stderr, "out of memory\n"); - exit(1); - } - b->fct = fct; - LIST_ADDQ(&post_proxy_check_list, &b->list); -} - -/* used to register some initialization functions to call for each server after - * the checks. - */ -void hap_register_post_server_check(int (*fct)(struct server *)) -{ - struct post_server_check_fct *b; - - b = calloc(1, sizeof(*b)); - if (!b) { - fprintf(stderr, "out of memory\n"); - exit(1); - } - b->fct = fct; - LIST_ADDQ(&post_server_check_list, &b->list); -} - -/* used to register some de-initialization functions to call after everything - * has stopped. - */ -void hap_register_post_deinit(void (*fct)()) -{ - struct post_deinit_fct *b; - - b = calloc(1, sizeof(*b)); - if (!b) { - fprintf(stderr, "out of memory\n"); - exit(1); - } - b->fct = fct; - LIST_ADDQ(&post_deinit_list, &b->list); -} - -/* used to register some per proxy de-initialization functions to call after - * everything has stopped. - */ -void hap_register_proxy_deinit(void (*fct)(struct proxy *)) -{ - struct proxy_deinit_fct *b; - - b = calloc(1, sizeof(*b)); - if (!b) { - fprintf(stderr, "out of memory\n"); - exit(1); - } - b->fct = fct; - LIST_ADDQ(&proxy_deinit_list, &b->list); -} - - -/* used to register some per server de-initialization functions to call after - * everything has stopped. - */ -void hap_register_server_deinit(void (*fct)(struct server *)) -{ - struct server_deinit_fct *b; - - b = calloc(1, sizeof(*b)); - if (!b) { - fprintf(stderr, "out of memory\n"); - exit(1); - } - b->fct = fct; - LIST_ADDQ(&server_deinit_list, &b->list); -} - -/* used to register some allocation functions to call for each thread. */ -void hap_register_per_thread_alloc(int (*fct)()) -{ - struct per_thread_alloc_fct *b; - - b = calloc(1, sizeof(*b)); - if (!b) { - fprintf(stderr, "out of memory\n"); - exit(1); - } - b->fct = fct; - LIST_ADDQ(&per_thread_alloc_list, &b->list); -} - -/* used to register some initialization functions to call for each thread. */ -void hap_register_per_thread_init(int (*fct)()) -{ - struct per_thread_init_fct *b; - - b = calloc(1, sizeof(*b)); - if (!b) { - fprintf(stderr, "out of memory\n"); - exit(1); - } - b->fct = fct; - LIST_ADDQ(&per_thread_init_list, &b->list); -} - -/* used to register some de-initialization functions to call for each thread. */ -void hap_register_per_thread_deinit(void (*fct)()) -{ - struct per_thread_deinit_fct *b; - - b = calloc(1, sizeof(*b)); - if (!b) { - fprintf(stderr, "out of memory\n"); - exit(1); - } - b->fct = fct; - LIST_ADDQ(&per_thread_deinit_list, &b->list); -} - -/* used to register some free functions to call for each thread. */ -void hap_register_per_thread_free(void (*fct)()) -{ - struct per_thread_free_fct *b; - - b = calloc(1, sizeof(*b)); - if (!b) { - fprintf(stderr, "out of memory\n"); - exit(1); - } - b->fct = fct; - LIST_ADDQ(&per_thread_free_list, &b->list); -} - static void display_version() { struct utsname utsname; diff --git a/src/init.c b/src/init.c new file mode 100644 index 000000000..e94f51f68 --- /dev/null +++ b/src/init.c @@ -0,0 +1,224 @@ +#include +#include + +#include +#include + +/* These functions are called just after the point where the program exits + * after a config validity check, so they are generally suited for resource + * allocation and slow initializations that should be skipped during basic + * config checks. The functions must return 0 on success, or a combination + * of ERR_* flags (ERR_WARN, ERR_ABORT, ERR_FATAL, ...). The 2 latter cause + * and immediate exit, so the function must have emitted any useful error. + */ +struct list post_check_list = LIST_HEAD_INIT(post_check_list); + +/* These functions are called for each proxy just after the config validity + * check. The functions must return 0 on success, or a combination of ERR_* + * flags (ERR_WARN, ERR_ABORT, ERR_FATAL, ...). The 2 latter cause and immediate + * exit, so the function must have emitted any useful error. + */ +struct list post_proxy_check_list = LIST_HEAD_INIT(post_proxy_check_list); + +/* These functions are called for each server just after the config validity + * check. The functions must return 0 on success, or a combination of ERR_* + * flags (ERR_WARN, ERR_ABORT, ERR_FATAL, ...). The 2 latter cause and immediate + * exit, so the function must have emitted any useful error. + */ +struct list post_server_check_list = LIST_HEAD_INIT(post_server_check_list); + +/* These functions are called for each thread just after the thread creation + * and before running the init functions. They should be used to do per-thread + * (re-)allocations that are needed by subsequent functoins. They must return 0 + * if an error occurred. */ +struct list per_thread_alloc_list = LIST_HEAD_INIT(per_thread_alloc_list); + +/* These functions are called for each thread just after the thread creation + * and before running the scheduler. They should be used to do per-thread + * initializations. They must return 0 if an error occurred. */ +struct list per_thread_init_list = LIST_HEAD_INIT(per_thread_init_list); + +/* These functions are called when freeing the global sections at the end of + * deinit, after everything is stopped. They don't return anything. They should + * not release shared resources that are possibly used by other deinit + * functions, only close/release what is private. Use the per_thread_free_list + * to release shared resources. + */ +struct list post_deinit_list = LIST_HEAD_INIT(post_deinit_list); + +/* These functions are called when freeing a proxy during the deinit, after + * everything isg stopped. They don't return anything. They should not release + * the proxy itself or any shared resources that are possibly used by other + * deinit functions, only close/release what is private. + */ +struct list proxy_deinit_list = LIST_HEAD_INIT(proxy_deinit_list); + +/* These functions are called when freeing a server during the deinit, after + * everything isg stopped. They don't return anything. They should not release + * the proxy itself or any shared resources that are possibly used by other + * deinit functions, only close/release what is private. + */ +struct list server_deinit_list = LIST_HEAD_INIT(server_deinit_list); + +/* These functions are called when freeing the global sections at the end of + * deinit, after the thread deinit functions, to release unneeded memory + * allocations. They don't return anything, and they work in best effort mode + * as their sole goal is to make valgrind mostly happy. + */ +struct list per_thread_free_list = LIST_HEAD_INIT(per_thread_free_list); + +/* These functions are called for each thread just after the scheduler loop and + * before exiting the thread. They don't return anything and, as for post-deinit + * functions, they work in best effort mode as their sole goal is to make + * valgrind mostly happy. */ +struct list per_thread_deinit_list = LIST_HEAD_INIT(per_thread_deinit_list); + +/* used to register some initialization functions to call after the checks. */ +void hap_register_post_check(int (*fct)()) +{ + struct post_check_fct *b; + + b = calloc(1, sizeof(*b)); + if (!b) { + fprintf(stderr, "out of memory\n"); + exit(1); + } + b->fct = fct; + LIST_ADDQ(&post_check_list, &b->list); +} + +/* used to register some initialization functions to call for each proxy after + * the checks. + */ +void hap_register_post_proxy_check(int (*fct)(struct proxy *)) +{ + struct post_proxy_check_fct *b; + + b = calloc(1, sizeof(*b)); + if (!b) { + fprintf(stderr, "out of memory\n"); + exit(1); + } + b->fct = fct; + LIST_ADDQ(&post_proxy_check_list, &b->list); +} + +/* used to register some initialization functions to call for each server after + * the checks. + */ +void hap_register_post_server_check(int (*fct)(struct server *)) +{ + struct post_server_check_fct *b; + + b = calloc(1, sizeof(*b)); + if (!b) { + fprintf(stderr, "out of memory\n"); + exit(1); + } + b->fct = fct; + LIST_ADDQ(&post_server_check_list, &b->list); +} + +/* used to register some de-initialization functions to call after everything + * has stopped. + */ +void hap_register_post_deinit(void (*fct)()) +{ + struct post_deinit_fct *b; + + b = calloc(1, sizeof(*b)); + if (!b) { + fprintf(stderr, "out of memory\n"); + exit(1); + } + b->fct = fct; + LIST_ADDQ(&post_deinit_list, &b->list); +} + +/* used to register some per proxy de-initialization functions to call after + * everything has stopped. + */ +void hap_register_proxy_deinit(void (*fct)(struct proxy *)) +{ + struct proxy_deinit_fct *b; + + b = calloc(1, sizeof(*b)); + if (!b) { + fprintf(stderr, "out of memory\n"); + exit(1); + } + b->fct = fct; + LIST_ADDQ(&proxy_deinit_list, &b->list); +} + +/* used to register some per server de-initialization functions to call after + * everything has stopped. + */ +void hap_register_server_deinit(void (*fct)(struct server *)) +{ + struct server_deinit_fct *b; + + b = calloc(1, sizeof(*b)); + if (!b) { + fprintf(stderr, "out of memory\n"); + exit(1); + } + b->fct = fct; + LIST_ADDQ(&server_deinit_list, &b->list); +} + +/* used to register some allocation functions to call for each thread. */ +void hap_register_per_thread_alloc(int (*fct)()) +{ + struct per_thread_alloc_fct *b; + + b = calloc(1, sizeof(*b)); + if (!b) { + fprintf(stderr, "out of memory\n"); + exit(1); + } + b->fct = fct; + LIST_ADDQ(&per_thread_alloc_list, &b->list); +} + +/* used to register some initialization functions to call for each thread. */ +void hap_register_per_thread_init(int (*fct)()) +{ + struct per_thread_init_fct *b; + + b = calloc(1, sizeof(*b)); + if (!b) { + fprintf(stderr, "out of memory\n"); + exit(1); + } + b->fct = fct; + LIST_ADDQ(&per_thread_init_list, &b->list); +} + +/* used to register some de-initialization functions to call for each thread. */ +void hap_register_per_thread_deinit(void (*fct)()) +{ + struct per_thread_deinit_fct *b; + + b = calloc(1, sizeof(*b)); + if (!b) { + fprintf(stderr, "out of memory\n"); + exit(1); + } + b->fct = fct; + LIST_ADDQ(&per_thread_deinit_list, &b->list); +} + +/* used to register some free functions to call for each thread. */ +void hap_register_per_thread_free(void (*fct)()) +{ + struct per_thread_free_fct *b; + + b = calloc(1, sizeof(*b)); + if (!b) { + fprintf(stderr, "out of memory\n"); + exit(1); + } + b->fct = fct; + LIST_ADDQ(&per_thread_free_list, &b->list); +} diff --git a/src/resolvers.c b/src/resolvers.c index b6b8982e3..4ad2e6833 100644 --- a/src/resolvers.c +++ b/src/resolvers.c @@ -28,7 +28,6 @@ #include #include #include -#include #include #include #include