Use AC_PROG_INSTALL & ./install-sh
[pgbouncer.git] / include / util.h
blob850b6f1ae2a3140d78ef5ac440754e5f1e437155
1 /*
2 * PgBouncer - Lightweight connection pooler for PostgreSQL.
3 *
4 * Copyright (c) 2007-2009 Marko Kreen, Skype Technologies OÜ
5 *
6 * Permission to use, copy, modify, and/or distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20 * time tools
22 usec_t get_cached_time(void);
23 void reset_time_cache(void);
26 * load file into malloced buffer
28 char *load_file(const char *fn) _MUSTCHECK;
30 void *zmalloc(size_t len) _MUSTCHECK _MALLOC;
33 * generic logging
35 void log_level(const char *level, const char *s, ...) _PRINTF(2, 3);
36 #define log_error(args...) log_level("ERROR", ## args)
37 #define log_warning(args...) log_level("WARNING", ## args)
38 #define log_info(args...) log_level("LOG", ## args)
39 #define log_debug(args...) do { \
40 if (unlikely(cf_verbose > 0)) \
41 log_level("DEBUG", ## args); \
42 } while (0)
43 #define log_noise(args...) do { \
44 if (unlikely(cf_verbose > 1)) \
45 log_level("NOISE", ## args); \
46 } while (0)
48 void close_logfile(void);
51 * logging about specific socket
53 void slog_level(const char *level, const PgSocket *sock, const char *fmt, ...) _PRINTF(3, 4);
54 #define slog_error(sk, args...) slog_level("ERROR", sk, ## args)
55 #define slog_warning(sk, args...) slog_level("WARNING", sk, ## args)
56 #define slog_info(sk, args...) slog_level("LOG", sk, ## args)
57 #define slog_debug(sk, args...) do { \
58 if (unlikely(cf_verbose > 0)) \
59 slog_level("DEBUG", sk, ## args); \
60 } while (0)
61 #define slog_noise(sk, args...) do { \
62 if (unlikely(cf_verbose > 1)) \
63 slog_level("NOISE", sk, ## args); \
64 } while (0)
67 * log and exit
69 void _fatal(const char *file, int line, const char *func, bool do_exit, const char *s, ...) _PRINTF(5, 6);
70 void _fatal_perror(const char *file, int line, const char *func, const char *s, ...) _PRINTF(4, 5);
71 #define fatal(args...) \
72 _fatal(__FILE__, __LINE__, __func__, true, ## args)
73 #define fatal_noexit(args...) \
74 _fatal(__FILE__, __LINE__, __func__, false, ## args)
75 #define fatal_perror(args...) \
76 _fatal_perror(__FILE__, __LINE__, __func__, ## args)
79 * non-interruptible operations
81 int safe_read(int fd, void *buf, int len) _MUSTCHECK;
82 int safe_write(int fd, const void *buf, int len) _MUSTCHECK;
83 int safe_recv(int fd, void *buf, int len, int flags) _MUSTCHECK;
84 int safe_send(int fd, const void *buf, int len, int flags) _MUSTCHECK;
85 int safe_close(int fd);
86 int safe_recvmsg(int fd, struct msghdr *msg, int flags) _MUSTCHECK;
87 int safe_sendmsg(int fd, const struct msghdr *msg, int flags) _MUSTCHECK;
88 int safe_connect(int fd, const struct sockaddr *sa, socklen_t sa_len) _MUSTCHECK;
89 int safe_accept(int fd, struct sockaddr *sa, socklen_t *sa_len) _MUSTCHECK;
92 * password tools
94 #define MD5_PASSWD_LEN 35
95 #define isMD5(passwd) (memcmp(passwd, "md5", 3) == 0 \
96 && strlen(passwd) == MD5_PASSWD_LEN)
97 void pg_md5_encrypt(const char *part1, const char *part2, size_t p2len, char *dest);
98 void get_random_bytes(uint8_t *dest, int len);
100 void socket_set_nonblocking(int fd, int val);
101 void tune_socket(int sock, bool is_unix);
103 bool strlist_contains(const char *liststr, const char *str);
105 const char *format_date(usec_t uval);
107 void fill_remote_addr(PgSocket *sk, int fd, bool is_unix);
108 void fill_local_addr(PgSocket *sk, int fd, bool is_unix);
111 void rescue_timers(void);
112 void safe_evtimer_add(struct event *ev, struct timeval *tv);
114 /* log truncated strings */
115 #define safe_strcpy(dst, src, dstlen) do { \
116 size_t needed = strlcpy(dst, src, dstlen); \
117 if (unlikely(needed >= (dstlen))) \
118 log_warning("bug in %s:%d - string truncated", __FILE__, __LINE__); \
119 } while (0)