From: Marko Kreen Date: Tue, 2 Apr 2013 20:46:40 +0000 (+0300) Subject: Show remote pid of unix socket X-Git-Tag: pgbouncer_1_6_rc1~38 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=455485284d77d5a49fca956a01b55baa48a61352;p=pgbouncer Show remote pid of unix socket --- diff --git a/include/bouncer.h b/include/bouncer.h index 545ed2c..ea62f98 100644 --- a/include/bouncer.h +++ b/include/bouncer.h @@ -139,14 +139,21 @@ extern int cf_sbuf_len; /* buffer for pgaddr string conversions (with port) */ #define PGADDR_BUF (INET6_ADDRSTRLEN + 10) +struct sockaddr_ucreds { + struct sockaddr_in sin; + uid_t uid; + pid_t pid; +}; + /* * AF_INET,AF_INET6 are stored as-is, - * AF_UNIX uses sockaddr_in port. + * AF_UNIX uses sockaddr_in port + uid/pid. */ union PgAddr { struct sockaddr sa; struct sockaddr_in sin; struct sockaddr_in6 sin6; + struct sockaddr_ucreds scred; }; static inline bool pga_is_unix(const PgAddr *a) { return a->sa.sa_family == AF_UNIX; } diff --git a/src/admin.c b/src/admin.c index 693ba83..ee6a999 100644 --- a/src/admin.c +++ b/src/admin.c @@ -556,7 +556,14 @@ static void socket_row(PktBuf *buf, PgSocket *sk, const char *state, bool debug) else linkbuf[0] = 0; - backend_pid = be32dec(sk->cancel_key); + /* get pid over unix socket */ + if (pga_is_unix(&sk->remote_addr)) + backend_pid = sk->remote_addr.scred.pid; + else + backend_pid = 0; + /* if that failed, get it from cancel key */ + if (is_server_socket(sk) && backend_pid == 0) + backend_pid = be32dec(sk->cancel_key); pktbuf_write_DataRow(buf, debug ? SKF_DBG : SKF_STD, is_server_socket(sk) ? "S" :"C", diff --git a/src/pooler.c b/src/pooler.c index b5848b7..35c6999 100644 --- a/src/pooler.c +++ b/src/pooler.c @@ -314,14 +314,6 @@ loop: log_noise("new fd from accept=%d", fd); if (is_unix) { - uid_t uid; - gid_t gid; - log_noise("getuid(): %d", (int)getuid()); - if (getpeereid(fd, &uid, &gid) >= 0) - log_noise("unix peer uid: %d", (int)uid); - else - log_warning("unix peer uid failed: %s", strerror(errno)); - client = accept_client(fd, true); } else { client = accept_client(fd, false); diff --git a/src/util.c b/src/util.c index b7fc0aa..bb67618 100644 --- a/src/util.c +++ b/src/util.c @@ -39,7 +39,13 @@ int log_socket_prefix(enum LogLevel lev, void *ctx, char *dst, unsigned int dstl db = sock->pool ? sock->pool->db->name : "(nodb)"; user = sock->auth_user ? sock->auth_user->name : "(nouser)"; if (pga_is_unix(&sock->remote_addr)) { - host = "unix"; + unsigned long pid = sock->remote_addr.scred.pid; + if (pid) { + snprintf(host6, sizeof(host6), "unix(%lu)", pid); + host = host6; + } else { + host = "unix"; + } } else { host = pga_ntop(&sock->remote_addr, host6, sizeof(host6)); } @@ -237,7 +243,17 @@ void fill_remote_addr(PgSocket *sk, int fd, bool is_unix) int err; if (is_unix) { + uid_t uid = 0; + gid_t gid = 0; + pid_t pid = 0; pga_set(dst, AF_UNIX, cf_listen_port); + if (getpeercreds(fd, &uid, &gid, &pid) >= 0) { + log_noise("unix peer uid: %d", (int)uid); + } else { + log_warning("unix peer uid failed: %s", strerror(errno)); + } + dst->scred.uid = uid; + dst->scred.pid = pid; } else { err = getpeername(fd, (struct sockaddr *)dst, &len); if (err < 0) { @@ -255,6 +271,8 @@ void fill_local_addr(PgSocket *sk, int fd, bool is_unix) if (is_unix) { pga_set(dst, AF_UNIX, cf_listen_port); + dst->scred.uid = geteuid(); + dst->scred.pid = getpid(); } else { err = getsockname(fd, (struct sockaddr *)dst, &len); if (err < 0) {