81
const char unix_sock_usage_msg[] =
82
"Unknown command. Please enter one of the following commands only :\n"
83
" show info : report information about the running process\n"
84
" show stat : report counters for each proxy and server\n"
85
" show errors : report last request and response errors for each proxy\n"
86
" show sess : report the list of current sessions\n"
89
const struct chunk unix_sock_usage = {
90
.str = (char *)&unix_sock_usage_msg,
91
.len = sizeof(unix_sock_usage_msg)-1
82
94
/********************************
83
95
* 1) low-level socket functions
102
114
/* 1. create socket names */
104
Alert("Invalid name for a UNIX socket. Aborting.\n");
116
Alert("Invalid empty name for a UNIX socket. Aborting.\n");
108
120
ret = snprintf(tempname, MAXPATHLEN, "%s.%d.tmp", path, pid);
109
121
if (ret < 0 || ret >= MAXPATHLEN) {
110
Alert("name too long for UNIX socket. Aborting.\n");
122
Alert("name too long for UNIX socket (%s). Aborting.\n", path);
114
126
ret = snprintf(backname, MAXPATHLEN, "%s.%d.bak", path, pid);
115
127
if (ret < 0 || ret >= MAXPATHLEN) {
116
Alert("name too long for UNIX socket. Aborting.\n");
128
Alert("name too long for UNIX socket (%s). Aborting.\n", path);
120
132
/* 2. clean existing orphaned entries */
121
133
if (unlink(tempname) < 0 && errno != ENOENT) {
122
Alert("error when trying to unlink previous UNIX socket. Aborting.\n");
134
Alert("error when trying to unlink previous UNIX socket (%s). Aborting.\n", path);
126
138
if (unlink(backname) < 0 && errno != ENOENT) {
127
Alert("error when trying to unlink previous UNIX socket. Aborting.\n");
139
Alert("error when trying to unlink previous UNIX socket (%s). Aborting.\n", path);
131
143
/* 3. backup existing socket */
132
144
if (link(path, backname) < 0 && errno != ENOENT) {
133
Alert("error when trying to preserve previous UNIX socket. Aborting.\n");
145
Alert("error when trying to preserve previous UNIX socket (%s). Aborting.\n", path);
142
154
sock = socket(PF_UNIX, SOCK_STREAM, 0);
144
Alert("cannot create socket for UNIX listener. Aborting.\n");
156
Alert("cannot create socket for UNIX listener (%s). Aborting.\n", path);
145
157
goto err_unlink_back;
148
160
if (sock >= global.maxsock) {
149
Alert("socket(): not enough free sockets for UNIX listener. Raise -n argument. Aborting.\n");
161
Alert("socket(): not enough free sockets for UNIX listener (%s). Raise -n argument. Aborting.\n", path);
150
162
goto err_unlink_temp;
158
170
if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
159
171
/* note that bind() creates the socket <tempname> on the file system */
160
Alert("cannot bind socket for UNIX listener. Aborting.\n");
172
Alert("cannot bind socket for UNIX listener (%s). Aborting.\n", path);
161
173
goto err_unlink_temp;
164
176
if (((uid != -1 || gid != -1) && (chown(tempname, uid, gid) == -1)) ||
165
177
(mode != 0 && chmod(tempname, mode) == -1)) {
166
Alert("cannot change UNIX socket ownership. Aborting.\n");
178
Alert("cannot change UNIX socket ownership (%s). Aborting.\n", path);
167
179
goto err_unlink_temp;
170
182
if (listen(sock, 0) < 0) {
171
Alert("cannot listen to socket for UNIX listener. Aborting.\n");
183
Alert("cannot listen to socket for UNIX listener (%s). Aborting.\n", path);
172
184
goto err_unlink_temp;
180
192
if (rename(tempname, path) < 0) {
181
Alert("cannot switch final and temporary sockets for UNIX listener. Aborting.\n");
193
Alert("cannot switch final and temporary sockets for UNIX listener (%s). Aborting.\n", path);