mirror of
https://github.com/yrutschle/sslh.git
synced 2025-05-31 15:49:17 +03:00
log error message in case fork fails
This commit is contained in:
parent
7bf3e12c30
commit
9a85efded5
18
sslh-fork.c
18
sslh-fork.c
@ -148,8 +148,13 @@ void main_loop(int listen_sockets[], int num_addr_listen)
|
|||||||
|
|
||||||
/* Start one process for each listening address */
|
/* Start one process for each listening address */
|
||||||
for (i = 0; i < num_addr_listen; i++) {
|
for (i = 0; i < num_addr_listen; i++) {
|
||||||
if (!(listener_pid[i] = fork())) {
|
listener_pid[i] = fork();
|
||||||
|
switch(listener_pid[i]) {
|
||||||
|
case 0: break;
|
||||||
|
case -1: log_message(LOG_ERR, "fork failed: err %d: %s\n", errno, strerror(errno));
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
/* Listening process just accepts a connection, forks, and goes
|
/* Listening process just accepts a connection, forks, and goes
|
||||||
* back to listening */
|
* back to listening */
|
||||||
while (1)
|
while (1)
|
||||||
@ -157,8 +162,15 @@ void main_loop(int listen_sockets[], int num_addr_listen)
|
|||||||
in_socket = accept(listen_sockets[i], 0, 0);
|
in_socket = accept(listen_sockets[i], 0, 0);
|
||||||
if (verbose) fprintf(stderr, "accepted fd %d\n", in_socket);
|
if (verbose) fprintf(stderr, "accepted fd %d\n", in_socket);
|
||||||
|
|
||||||
if (!fork())
|
switch(fork()) {
|
||||||
{
|
case -1: log_message(LOG_ERR, "fork failed: err %d: %s\n", errno, strerror(errno));
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* In parent process */
|
||||||
|
case 0: break;
|
||||||
|
|
||||||
|
/* In child process */
|
||||||
|
default:
|
||||||
for (i = 0; i < num_addr_listen; ++i)
|
for (i = 0; i < num_addr_listen; ++i)
|
||||||
close(listen_sockets[i]);
|
close(listen_sockets[i]);
|
||||||
start_shoveler(in_socket);
|
start_shoveler(in_socket);
|
||||||
|
@ -275,6 +275,18 @@ void connect_proxy(struct connection *cnx)
|
|||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Close all connection fd except one (used when forking) */
|
||||||
|
void keep_cnx(int index, struct connection* cnx, int num_cnx)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
for (i = 0; i < num_cnx; i++)
|
||||||
|
if (i != index)
|
||||||
|
for (j = 0; j < 2; j++)
|
||||||
|
if (cnx[i].q[j].fd != -1)
|
||||||
|
close(cnx[i].q[j].fd);
|
||||||
|
}
|
||||||
|
|
||||||
/* returns true if specified fd is initialised and present in fd_set */
|
/* returns true if specified fd is initialised and present in fd_set */
|
||||||
int is_fd_active(int fd, fd_set* set)
|
int is_fd_active(int fd, fd_set* set)
|
||||||
{
|
{
|
||||||
@ -416,18 +428,16 @@ void main_loop(int listen_sockets[], int num_addr_listen)
|
|||||||
tidy_connection(&cnx[i], &fds_r, &fds_w);
|
tidy_connection(&cnx[i], &fds_r, &fds_w);
|
||||||
res = -1;
|
res = -1;
|
||||||
} else if (cnx[i].proto->fork) {
|
} else if (cnx[i].proto->fork) {
|
||||||
if (!fork()) {
|
switch (fork()) {
|
||||||
struct connection *pcnx_i = &cnx[i];
|
case 0: break;
|
||||||
struct connection cnx_i = *pcnx_i;
|
case -1: log_message(LOG_ERR, "fork failed: err %d: %s\n", errno, strerror(errno));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
for (i = 0; i < num_addr_listen; i++)
|
for (i = 0; i < num_addr_listen; i++)
|
||||||
close(listen_sockets[i]);
|
close(listen_sockets[i]);
|
||||||
for (i = 0; i < num_cnx; i++)
|
keep_cnx(i, cnx, num_cnx);
|
||||||
if (&cnx[i] != pcnx_i)
|
|
||||||
for (j = 0; j < 2; j++)
|
|
||||||
if (cnx[i].q[j].fd != -1)
|
|
||||||
close(cnx[i].q[j].fd);
|
|
||||||
free(cnx);
|
free(cnx);
|
||||||
connect_proxy(&cnx_i);
|
connect_proxy(&cnx[i]);
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
tidy_connection(&cnx[i], &fds_r, &fds_w);
|
tidy_connection(&cnx[i], &fds_r, &fds_w);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user