From: Marko Kreen Date: Wed, 18 Apr 2007 08:42:31 +0000 (+0000) Subject: Move OS compat functions to src/system.c to keep the ifdef mess separately. X-Git-Tag: pgbouncer_1_0_7~5 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b471d3f09d9729626e7d464b3b90a521ce9c853b;p=pgbouncer Move OS compat functions to src/system.c to keep the ifdef mess separately. Also remove crypt() wrapper, pointless. --- diff --git a/Makefile b/Makefile index 7a1481a..93b35fd 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,10 @@ # sources SRCS = client.c loader.c objects.c pooler.c proto.c sbuf.c server.c util.c \ - admin.c stats.c takeover.c md5.c janitor.c pktbuf.c main.c + admin.c stats.c takeover.c md5.c janitor.c pktbuf.c system.c main.c HDRS = client.h loader.h objects.h pooler.h proto.h sbuf.h server.h util.h \ - admin.h stats.h takeover.h md5.h janitor.h pktbuf.h bouncer.h \ - list.h mbuf.h system.h + admin.h stats.h takeover.h md5.h janitor.h pktbuf.h system.h bouncer.h \ + list.h mbuf.h # data & dirs to include in tgz DATA = README NEWS etc/pgbouncer.ini Makefile config.mak.in config.h.in \ diff --git a/src/client.c b/src/client.c index 206052b..3e72d1b 100644 --- a/src/client.c +++ b/src/client.c @@ -36,7 +36,7 @@ static bool check_client_passwd(PgSocket *client, const char *passwd) case AUTH_PLAIN: return strcmp(user->passwd, passwd) == 0; case AUTH_CRYPT: - correct = pg_crypt(user->passwd, (char *)client->salt); + correct = crypt(user->passwd, (char *)client->salt); return strcmp(correct, passwd) == 0; case AUTH_MD5: if (strlen(passwd) != MD5_PASSWD_LEN) diff --git a/src/proto.c b/src/proto.c index fd5eef7..7f50247 100644 --- a/src/proto.c +++ b/src/proto.c @@ -215,7 +215,7 @@ static bool login_crypt_psw(PgSocket *server, const uint8 *salt) log_debug("P: send crypt password"); strncpy(saltbuf, (char *)salt, 2); - enc = pg_crypt(user->passwd, saltbuf); + enc = crypt(user->passwd, saltbuf); return send_password(server, enc); } diff --git a/src/system.c b/src/system.c new file mode 100644 index 0000000..4dc1868 --- /dev/null +++ b/src/system.c @@ -0,0 +1,91 @@ +/* + * PgBouncer - Lightweight connection pooler for PostgreSQL. + * + * Copyright (c) 2007 Marko Kreen, Skype Technologies OÜ + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * Compat functions for OSes where libc does not provide them. + */ + +#include "bouncer.h" + +#ifdef HAVE_SYS_PARAM_H +#include +#endif +#ifdef HAVE_SYS_UCRED_H +#include +#endif + +/* + * Minimal spec-conforming implementations of strlcpy(), strlcat(). + */ + +#ifndef HAVE_STRLCPY +size_t strlcpy(char *dst, const char *src, size_t n) +{ + size_t len = strlen(src); + if (len < n) { + memcpy(dst, src, len + 1); + } else if (n > 0) { + memcpy(dst, src, n - 1); + dst[n - 1] = 0; + } + return len; +} +#endif + +#ifndef HAVE_STRLCAT +size_t strlcat(char *dst, const char *src, size_t n) +{ + size_t pos = 0; + while (pos < n && dst[pos]) + pos++; + return pos + strlcpy(dst + pos, src, n - pos); +} +#endif + +/* + * Get other side's uid for UNIX socket. + * + * Standardise on getpeereid() from BSDs. + */ +#ifndef HAVE_GETPEEREID +int getpeereid(int fd, uid_t *uid_p, gid_t *gid_p) +{ +#ifdef SO_PEERCRED + struct ucred cred; + socklen_t len = sizeof(cred); + if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &cred, &len) >= 0) { + *uid_p = cred.uid; + *gid_p = cred.gid; + return 0; + } +#else /* !SO_PEERCRED */ +#ifdef HAVE_GETPEERUCRED + ucred_t *cred = NULL; + if (getpeerucred(fd, &cred) >= 0) { + *uid_p = ucred_geteuid(cred); + *gid_p = ucred_getegid(cred); + ucred_free(cred); + if (*uid_p >= 0 && *gid_p >= 0) + return 0; + } +#endif /* HAVE_GETPEERUCRED */ +#endif /* !SO_PEERCRED */ + return -1; +} +#endif /* !HAVE_GETPEEREID */ + diff --git a/src/system.h b/src/system.h index 35123d1..7edb862 100644 --- a/src/system.h +++ b/src/system.h @@ -70,6 +70,11 @@ /* how many microseconds in a second */ #define USEC (1000000LL) + +/* + * PostgreSQL types. + */ + typedef enum { false=0, true=1 } bool; typedef uint8_t uint8; @@ -77,8 +82,25 @@ typedef uint16_t uint16; typedef uint32_t uint32; typedef uint64_t uint64; +/* + * PostgreSQL type OIDs for resultsets. + */ #define INT8OID 20 #define INT4OID 23 #define TEXTOID 25 +/* + * libc compat functions. + */ + +#ifndef HAVE_STRLCPY +size_t strlcpy(char *dst, const char *src, size_t n); +#endif +#ifndef HAVE_STRLCAT +size_t strlcat(char *dst, const char *src, size_t n); +#endif +#ifndef HAVE_GETPEEREID +int getpeereid(int fd, uid_t *uid_p, gid_t *gid_p); +#endif + diff --git a/src/util.c b/src/util.c index 04116da..67de7ed 100644 --- a/src/util.c +++ b/src/util.c @@ -24,13 +24,6 @@ #include "md5.h" -#ifdef HAVE_SYS_PARAM_H -#include -#endif -#ifdef HAVE_SYS_UCRED_H -#include -#endif - void *zmalloc(size_t len) { void *p = malloc(len); @@ -39,32 +32,6 @@ void *zmalloc(size_t len) return p; } -/* - * Minimal spec-conforming implementations of strlcpy(), strlcat(). - */ -#ifndef HAVE_STRLCPY -size_t strlcpy(char *dst, const char *src, size_t n) -{ - size_t len = strlen(src); - if (len < n) { - memcpy(dst, src, len + 1); - } else if (n > 0) { - memcpy(dst, src, n - 1); - dst[n - 1] = 0; - } - return len; -} -#endif -#ifndef HAVE_STRLCAT -size_t strlcat(char *dst, const char *src, size_t n) -{ - size_t pos = 0; - while (pos < n && dst[pos]) - pos++; - return pos + strlcpy(dst + pos, src, n - pos); -} -#endif - /* * Generic logging */ @@ -359,12 +326,6 @@ bool pg_md5_encrypt(const char *part1, return true; } -/* wrapper for usable crypt() */ -const char *pg_crypt(const char *passwd, const char *salt) -{ - return crypt(passwd, salt); -} - /* wrapped for getting random bytes */ bool get_random_bytes(uint8 *dest, int len) { @@ -402,38 +363,6 @@ void reset_time_cache(void) time_cache = 0; } -/* - * Get other side's uid for UNIX socket. - * - * Standardise on getpeereid() from BSDs. - */ -#ifndef HAVE_GETPEEREID -int getpeereid(int fd, uid_t *uid_p, gid_t *gid_p) -{ -#ifdef SO_PEERCRED - struct ucred cred; - socklen_t len = sizeof(cred); - if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &cred, &len) >= 0) { - *uid_p = cred.uid; - *gid_p = cred.gid; - return 0; - } -#else /* !SO_PEERCRED */ -#ifdef HAVE_GETPEERUCRED - ucred_t *cred = NULL; - if (getpeerucred(fd, &cred) >= 0) { - *uid_p = ucred_geteuid(cred); - *gid_p = ucred_getegid(cred); - ucred_free(cred); - if (*uid_p >= 0 && *gid_p >= 0) - return 0; - } -#endif /* HAVE_GETPEERUCRED */ -#endif /* !SO_PEERCRED */ - return -1; -} -#endif /* !HAVE_GETPEEREID */ - void socket_set_nonblocking(int fd, int val) { int flags, res; diff --git a/src/util.h b/src/util.h index dbefcf3..0333b31 100644 --- a/src/util.h +++ b/src/util.h @@ -89,26 +89,8 @@ int safe_sendmsg(int fd, const struct msghdr *msg, int flags); #define isMD5(passwd) (memcmp(passwd, "md5", 3) == 0 \ && strlen(passwd) == MD5_PASSWD_LEN) bool pg_md5_encrypt(const char *part1, const char *part2, size_t p2len, char *dest); -const char *pg_crypt(const char *passwd, const char *salt); bool get_random_bytes(uint8 *dest, int len); -/* - * safe string copy - */ -#ifndef HAVE_STRLCPY -size_t strlcpy(char *dst, const char *src, size_t n); -#endif -#ifndef HAVE_STRLCAT -size_t strlcat(char *dst, const char *src, size_t n); -#endif - -/* - * socket option handling - */ -#ifndef HAVE_GETPEEREID -int getpeereid(int fd, uid_t *uid_p, gid_t *gid_p); -#endif - void socket_set_nonblocking(int fd, int val); void tune_socket(int sock, bool is_unix);