[pgpool-general-jp: 391] Small patch for error messages in main.c

Jun Kuriyama kuriyama+ml @ s2factory.co.jp
2008年 3月 3日 (月) 11:40:20 JST


 ちょっとおっちょこちょいなことをしてはまったので、安全のために以下の
パッチはどうでしょうか。

(1) bind() で Address already in use と言われて勝手に TCP のことだと思
    い込み、あれーおかしいなあ、と思ったら Unix Domain Socket 側でした。
    エラーメッセージ側でどのソケットに対して失敗したかがわかるといいか
    な、と思いました。

(2) 一回間違えて root で起動した上に、kill -9 で殺したので /tmp のソケッ
    トが残っていました。その際、次に nobody で起動すると、main.c の
    myexit() 内の unlink でそのソケットを削除することができません。そ
    れはまあ権限がないのであたりまえなのですが、その旨エラーメッセージ
    でわかるといいな、と。


# 以下 2.0.1 に対するパッチです。

--- main.c.orig	2007-11-09 13:37:35.000000000 +0900
+++ main.c	2008-03-03 10:24:27.651654702 +0900
@@ -836,7 +836,13 @@
 	status = bind(fd, (struct sockaddr *)&addr, len);
 	if (status == -1)
 	{
-		pool_error("bind() failed. reason: %s", strerror(errno));
+		char *host = "", *serv = "";
+		char hostname[NI_MAXHOST], servname[NI_MAXSERV];
+		if (getnameinfo(&addr, len, hostname, sizeof(hostname), servname, sizeof(servname), 0) == 0) {
+			host = hostname;
+			serv = servname;
+		}
+		pool_error("bind(%s:%s) failed. reason: %s", host, serv, strerror(errno));
 		myexit(1);
 	}
 
@@ -872,7 +878,7 @@
 	status = bind(fd, (struct sockaddr *)&addr, len);
 	if (status == -1)
 	{
-		pool_error("bind() failed. reason: %s", strerror(errno));
+		pool_error("bind(%s) failed. reason: %s", addr.sun_path, strerror(errno));
 		myexit(1);
 	}
 
@@ -891,6 +897,12 @@
 	return fd;
 }
 
+static void myunlink(const char* path)
+{
+	if (unlink(path) == 0) return;
+	pool_error("unlink(%s) failed: %s", path, strerror(errno));
+}
+
 static void myexit(int code)
 {
 	char path[POOLMAXPATHLEN];
@@ -917,10 +929,10 @@
 		POOL_SETMASK(&UnBlockSig);
 	}
 	
-	unlink(un_addr.sun_path);
-	unlink(pcp_un_addr.sun_path);
+	myunlink(un_addr.sun_path);
+	myunlink(pcp_un_addr.sun_path);
 	snprintf(path, sizeof(path), "%s/%s", pool_config->logdir, PID_FILE_NAME);
-	unlink(path);
+	myunlink(path);
 
 	pool_shmem_exit(code);
 	exit(code);


-- 
Jun Kuriyama <kuriyama @ s2factory.co.jp> // S2 Factory, Inc.


pgpool-general-jp メーリングリストの案内