static void myexit(int code) { int i; if (getpid() != mypid) return; if (pids != NULL) { POOL_SETMASK(&AuthBlockSig); exiting = 1; for (i = 0; i < pool_config->num_init_children; i++) { pid_t pid = pids[i].pid; if (pid) { kill(pid, SIGTERM); } } while (wait(NULL) > 0) ; if (errno != ECHILD) pool_error("wait() failed. reason:%s", strerror(errno)); POOL_SETMASK(&UnBlockSig); } myunlink(un_addr.sun_path); myunlink(pcp_un_addr.sun_path); myunlink(pool_config->pid_file_name); write_status_file(); pool_shmem_exit(code); exit(code); }
/* * create UNIX domain socket */ static int create_unix_domain_socket(struct sockaddr_un un_addr_tmp) { struct sockaddr_un addr; int fd; int status; int len; fd = socket(AF_UNIX, SOCK_STREAM, 0); if (fd == -1) { pool_error("Failed to create UNIX domain socket. reason: %s", strerror(errno)); myexit(1); } memset((char *) &addr, 0, sizeof(addr)); ((struct sockaddr *)&addr)->sa_family = AF_UNIX; snprintf(addr.sun_path, sizeof(addr.sun_path), un_addr_tmp.sun_path); len = sizeof(struct sockaddr_un); if (myexists(addr.sun_path)) { myunlink(addr.sun_path); } status = bind(fd, (struct sockaddr *)&addr, len); if (status == -1) { pool_error("bind(%s) failed. reason: %s", addr.sun_path, strerror(errno)); myexit(1); } if (chmod(un_addr_tmp.sun_path, 0777) == -1) { pool_error("chmod() failed. reason: %s", strerror(errno)); myexit(1); } status = listen(fd, PGPOOLMAXLITSENQUEUELENGTH); if (status < 0) { pool_error("listen() failed. reason: %s", strerror(errno)); myexit(1); } return fd; }