Show remote pid of unix socket
authorMarko Kreen <markokr@gmail.com>
Tue, 2 Apr 2013 20:46:40 +0000 (23:46 +0300)
committerMarko Kreen <markokr@gmail.com>
Tue, 2 Apr 2013 20:46:40 +0000 (23:46 +0300)
include/bouncer.h
src/admin.c
src/pooler.c
src/util.c

index 545ed2c1d73d44bab7c6da8be3aa19eab2d960f7..ea62f98b0b5356af1b58f964e89df1fc7a5485ae 100644 (file)
@@ -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; }
index 693ba8372303437599a0bc3375292d53c6ae1bae..ee6a999b7997de097d0fd3f226c2288a80f8a0ca 100644 (file)
@@ -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",
index b5848b743012a2128003a41219b5236ae0c39e63..35c6999861f1ff06040e79442ad846532f2ad301 100644 (file)
@@ -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);
index b7fc0aac5090cef2dd6ba276b5336653a77a0655..bb676189a2da8547b6a13a82c991d30d0222bdb5 100644 (file)
@@ -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) {