2 * PgBouncer - Lightweight connection pooler for PostgreSQL.
4 * Copyright (c) 2007-2009 Marko Kreen, Skype Technologies OÜ
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.
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.
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
;
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); \
43 #define log_noise(args...) do { \
44 if (unlikely(cf_verbose > 1)) \
45 log_level("NOISE", ## args); \
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); \
61 #define slog_noise(sk, args...) do { \
62 if (unlikely(cf_verbose > 1)) \
63 slog_level("NOISE", sk, ## args); \
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
;
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__); \