[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 メーリングリストの案内