mirror of
https://github.com/yrutschle/sslh.git
synced 2025-05-30 07:09:33 +03:00
separate connection information creationg from log emission
This commit is contained in:
parent
d78c810d84
commit
3aa245efa5
59
common.c
59
common.c
@ -550,7 +550,7 @@ void resolve_name(struct addrinfo **out, char* fullname)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Log to syslog or stderr if foreground */
|
/* Log to syslog or stderr if foreground */
|
||||||
void log_message(int type, char* msg, ...)
|
void log_message(int type, const char* msg, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
@ -562,48 +562,63 @@ void log_message(int type, char* msg, ...)
|
|||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* syslogs who connected to where */
|
|
||||||
void log_connection(struct connection *cnx)
|
/* Fills a connection description; returns 0 on failure */
|
||||||
|
int get_connection_desc(struct connection_desc* desc, const struct connection *cnx)
|
||||||
{
|
{
|
||||||
|
int res;
|
||||||
struct addrinfo addr;
|
struct addrinfo addr;
|
||||||
struct sockaddr_storage ss;
|
struct sockaddr_storage ss;
|
||||||
#define MAX_NAMELENGTH (NI_MAXHOST + NI_MAXSERV + 1)
|
|
||||||
char peer[MAX_NAMELENGTH], service[MAX_NAMELENGTH],
|
|
||||||
local[MAX_NAMELENGTH], target[MAX_NAMELENGTH];
|
|
||||||
int res;
|
|
||||||
|
|
||||||
if (cnx->proto->log_level < 1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
addr.ai_addr = (struct sockaddr*)&ss;
|
addr.ai_addr = (struct sockaddr*)&ss;
|
||||||
addr.ai_addrlen = sizeof(ss);
|
addr.ai_addrlen = sizeof(ss);
|
||||||
|
|
||||||
res = getpeername(cnx->q[0].fd, addr.ai_addr, &addr.ai_addrlen);
|
res = getpeername(cnx->q[0].fd, addr.ai_addr, &addr.ai_addrlen);
|
||||||
if (res == -1) return; /* Can happen if connection drops before we get here.
|
if (res == -1) return 0; /* Can happen if connection drops before we get here.
|
||||||
In that case, don't log anything (there is no connection) */
|
In that case, don't log anything (there is no connection) */
|
||||||
sprintaddr(peer, sizeof(peer), &addr);
|
sprintaddr(desc->peer, sizeof(desc->peer), &addr);
|
||||||
|
|
||||||
addr.ai_addrlen = sizeof(ss);
|
addr.ai_addrlen = sizeof(ss);
|
||||||
res = getsockname(cnx->q[0].fd, addr.ai_addr, &addr.ai_addrlen);
|
res = getsockname(cnx->q[0].fd, addr.ai_addr, &addr.ai_addrlen);
|
||||||
if (res == -1) return;
|
if (res == -1) return 0;
|
||||||
sprintaddr(service, sizeof(service), &addr);
|
sprintaddr(desc->service, sizeof(desc->service), &addr);
|
||||||
|
|
||||||
addr.ai_addrlen = sizeof(ss);
|
addr.ai_addrlen = sizeof(ss);
|
||||||
res = getpeername(cnx->q[1].fd, addr.ai_addr, &addr.ai_addrlen);
|
res = getpeername(cnx->q[1].fd, addr.ai_addr, &addr.ai_addrlen);
|
||||||
if (res == -1) return;
|
if (res == -1) return 0;
|
||||||
sprintaddr(target, sizeof(target), &addr);
|
sprintaddr(desc->target, sizeof(desc->target), &addr);
|
||||||
|
|
||||||
addr.ai_addrlen = sizeof(ss);
|
addr.ai_addrlen = sizeof(ss);
|
||||||
res = getsockname(cnx->q[1].fd, addr.ai_addr, &addr.ai_addrlen);
|
res = getsockname(cnx->q[1].fd, addr.ai_addr, &addr.ai_addrlen);
|
||||||
if (res == -1) return;
|
if (res == -1) return 0;
|
||||||
sprintaddr(local, sizeof(local), &addr);
|
sprintaddr(desc->local, sizeof(desc->local), &addr);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* syslogs who connected to where
|
||||||
|
* desc: string description of the connection. if NULL, log_connection will
|
||||||
|
* manage on its own
|
||||||
|
* cnx: connection descriptor
|
||||||
|
* */
|
||||||
|
void log_connection(struct connection_desc* desc, const struct connection *cnx)
|
||||||
|
{
|
||||||
|
struct connection_desc d;
|
||||||
|
|
||||||
|
if (cnx->proto->log_level < 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!desc) {
|
||||||
|
desc = &d;
|
||||||
|
get_connection_desc(desc, cnx);
|
||||||
|
}
|
||||||
|
|
||||||
log_message(LOG_INFO, "%s:connection from %s to %s forwarded from %s to %s\n",
|
log_message(LOG_INFO, "%s:connection from %s to %s forwarded from %s to %s\n",
|
||||||
cnx->proto->name,
|
cnx->proto->name,
|
||||||
peer,
|
desc->peer,
|
||||||
service,
|
desc->service,
|
||||||
local,
|
desc->local,
|
||||||
target);
|
desc->target);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
12
common.h
12
common.h
@ -107,6 +107,13 @@ struct connection {
|
|||||||
#define FD_NODATA -1
|
#define FD_NODATA -1
|
||||||
#define FD_STALLED -2
|
#define FD_STALLED -2
|
||||||
|
|
||||||
|
/* String description of a connection */
|
||||||
|
#define MAX_NAMELENGTH (NI_MAXHOST + NI_MAXSERV + 1)
|
||||||
|
struct connection_desc {
|
||||||
|
char peer[MAX_NAMELENGTH], service[MAX_NAMELENGTH],
|
||||||
|
local[MAX_NAMELENGTH], target[MAX_NAMELENGTH];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/* common.c */
|
/* common.c */
|
||||||
void init_cnx(struct connection *cnx);
|
void init_cnx(struct connection *cnx);
|
||||||
@ -114,13 +121,14 @@ int connect_addr(struct connection *cnx, int fd_from);
|
|||||||
int fd2fd(struct queue *target, struct queue *from);
|
int fd2fd(struct queue *target, struct queue *from);
|
||||||
char* sprintaddr(char* buf, size_t size, struct addrinfo *a);
|
char* sprintaddr(char* buf, size_t size, struct addrinfo *a);
|
||||||
void resolve_name(struct addrinfo **out, char* fullname);
|
void resolve_name(struct addrinfo **out, char* fullname);
|
||||||
void log_connection(struct connection *cnx);
|
int get_connection_desc(struct connection_desc* desc, const struct connection *cnx);
|
||||||
|
void log_connection(struct connection_desc* desc, const struct connection *cnx);
|
||||||
int check_access_rights(int in_socket, const char* service);
|
int check_access_rights(int in_socket, const char* service);
|
||||||
void setup_signals(void);
|
void setup_signals(void);
|
||||||
void setup_syslog(const char* bin_name);
|
void setup_syslog(const char* bin_name);
|
||||||
void drop_privileges(const char* user_name, const char* chroot_path);
|
void drop_privileges(const char* user_name, const char* chroot_path);
|
||||||
void write_pid_file(const char* pidfile);
|
void write_pid_file(const char* pidfile);
|
||||||
void log_message(int type, char* msg, ...);
|
void log_message(int type, const char* msg, ...);
|
||||||
void dump_connection(struct connection *cnx);
|
void dump_connection(struct connection *cnx);
|
||||||
int resolve_split_name(struct addrinfo **out, char* hostname, char* port);
|
int resolve_split_name(struct addrinfo **out, char* hostname, char* port);
|
||||||
|
|
||||||
|
@ -72,6 +72,7 @@ void start_shoveler(int in_socket)
|
|||||||
int res = PROBE_AGAIN;
|
int res = PROBE_AGAIN;
|
||||||
int out_socket;
|
int out_socket;
|
||||||
struct connection cnx;
|
struct connection cnx;
|
||||||
|
struct connection_desc desc;
|
||||||
|
|
||||||
init_cnx(&cnx);
|
init_cnx(&cnx);
|
||||||
cnx.q[0].fd = in_socket;
|
cnx.q[0].fd = in_socket;
|
||||||
@ -111,7 +112,8 @@ void start_shoveler(int in_socket)
|
|||||||
|
|
||||||
cnx.q[1].fd = out_socket;
|
cnx.q[1].fd = out_socket;
|
||||||
|
|
||||||
log_connection(&cnx);
|
get_connection_desc(&desc, &cnx);
|
||||||
|
log_connection(&desc, &cnx);
|
||||||
|
|
||||||
flush_deferred(&cnx.q[1]);
|
flush_deferred(&cnx.q[1]);
|
||||||
|
|
||||||
|
@ -143,7 +143,7 @@ int connect_queue(struct connection *cnx, fd_set *fds_r, fd_set *fds_w)
|
|||||||
|
|
||||||
q->fd = connect_addr(cnx, cnx->q[0].fd);
|
q->fd = connect_addr(cnx, cnx->q[0].fd);
|
||||||
if ((q->fd != -1) && fd_is_in_range(q->fd)) {
|
if ((q->fd != -1) && fd_is_in_range(q->fd)) {
|
||||||
log_connection(cnx);
|
log_connection(NULL, cnx);
|
||||||
set_nonblock(q->fd);
|
set_nonblock(q->fd);
|
||||||
flush_deferred(q);
|
flush_deferred(q);
|
||||||
if (q->deferred_data) {
|
if (q->deferred_data) {
|
||||||
@ -262,7 +262,7 @@ void connect_proxy(struct connection *cnx)
|
|||||||
|
|
||||||
cnx->q[1].fd = out_socket;
|
cnx->q[1].fd = out_socket;
|
||||||
|
|
||||||
log_connection(cnx);
|
log_connection(NULL, cnx);
|
||||||
|
|
||||||
shovel_single(cnx);
|
shovel_single(cnx);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user