Bump liberty, cleanup

This commit is contained in:
Přemysl Eric Janouch 2017-06-07 21:06:40 +02:00
parent b2456c1cb6
commit f42099e79c
Signed by: p
GPG Key ID: B715679E3A361BE6
2 changed files with 48 additions and 127 deletions

@ -1 +1 @@
Subproject commit 084e964286bfcd13ee6a25a2ee35dfba9da1072e Subproject commit ec128558a4d067f51cd36d8026e6df849ea7de26

173
ponymap.c
View File

@ -38,8 +38,11 @@
// --- Configuration (application-specific) ------------------------------------ // --- Configuration (application-specific) ------------------------------------
#define DEFAULT_CONNECT_TIMEOUT 10 enum
#define DEFAULT_SCAN_TIMEOUT 10 {
DEFAULT_CONNECT_TIMEOUT = 10,
DEFAULT_SCAN_TIMEOUT = 10
};
static struct simple_config_item g_config_table[] = static struct simple_config_item g_config_table[] =
{ {
@ -245,13 +248,6 @@ static void unit_unref (struct unit *self);
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
enum transport_io_result
{
TRANSPORT_IO_OK = 0, ///< Completed successfully
TRANSPORT_IO_EOF, ///< Connection shut down by peer
TRANSPORT_IO_ERROR ///< Connection error
};
// The only real purpose of this is to abstract away TLS/SSL // The only real purpose of this is to abstract away TLS/SSL
struct transport struct transport
{ {
@ -266,10 +262,10 @@ struct transport
/// The underlying socket may have become readable, update `read_buffer'; /// The underlying socket may have become readable, update `read_buffer';
/// return false if the connection has failed. /// return false if the connection has failed.
enum transport_io_result (*on_readable) (struct unit *u); enum socket_io_result (*on_readable) (struct unit *u);
/// The underlying socket may have become writeable, flush `write_buffer'; /// The underlying socket may have become writeable, flush `write_buffer';
/// return false if the connection has failed. /// return false if the connection has failed.
enum transport_io_result (*on_writeable) (struct unit *u); enum socket_io_result (*on_writeable) (struct unit *u);
/// Return event mask to use in the poller /// Return event mask to use in the poller
int (*get_poll_events) (struct unit *u); int (*get_poll_events) (struct unit *u);
}; };
@ -391,19 +387,10 @@ app_context_free (struct app_context *self)
indicator_free (&self->indicator); indicator_free (&self->indicator);
poller_free (&self->poller); poller_free (&self->poller);
for (struct ip_range *iter = self->ip_list; iter; ) LIST_FOR_EACH (struct ip_range, iter, self->ip_list)
{
struct ip_range *next = iter->next;
ip_range_delete (iter); ip_range_delete (iter);
iter = next; LIST_FOR_EACH (struct port_range, iter, self->port_list)
}
for (struct port_range *iter = self->port_list; iter; )
{
struct port_range *next = iter->next;
port_range_delete (iter); port_range_delete (iter);
iter = next;
}
if (self->ssl_ctx) if (self->ssl_ctx)
SSL_CTX_free (self->ssl_ctx); SSL_CTX_free (self->ssl_ctx);
@ -529,9 +516,10 @@ unit_stop (struct unit *u)
{ {
if (u->service->on_stopped) if (u->service->on_stopped)
u->service->on_stopped (u->service_data); u->service->on_stopped (u->service_data);
u->service->scan_free (u->service_data); u->service->scan_free (u->service_data);
u->transport->cleanup (u);
if (u->transport->cleanup)
u->transport->cleanup (u);
} }
poller_timer_reset (&u->timeout_event); poller_timer_reset (&u->timeout_event);
@ -584,12 +572,12 @@ on_unit_ready (const struct pollfd *pfd, struct unit *u)
{ {
struct service *service = u->service; struct service *service = u->service;
struct transport *transport = u->transport; struct transport *transport = u->transport;
enum transport_io_result result; enum socket_io_result result;
bool got_eof = false; bool got_eof = false;
if ((result = transport->on_readable (u)) == TRANSPORT_IO_ERROR) if ((result = transport->on_readable (u)) == SOCKET_IO_ERROR)
goto error; goto error;
got_eof |= result == TRANSPORT_IO_EOF; got_eof |= result == SOCKET_IO_EOF;
if (u->read_buffer.len) if (u->read_buffer.len)
{ {
@ -601,9 +589,9 @@ on_unit_ready (const struct pollfd *pfd, struct unit *u)
goto stop; goto stop;
} }
if ((result = transport->on_writeable (u)) == TRANSPORT_IO_ERROR) if ((result = transport->on_writeable (u)) == SOCKET_IO_ERROR)
goto error; goto error;
got_eof |= result == TRANSPORT_IO_EOF; got_eof |= result == SOCKET_IO_EOF;
if (got_eof) if (got_eof)
{ {
@ -627,7 +615,7 @@ stop:
static void static void
unit_start_scan (struct unit *u) unit_start_scan (struct unit *u)
{ {
if (!u->transport->init (u)) if (u->transport->init && !u->transport->init (u))
{ {
// TODO: maybe print a message with the problem? // TODO: maybe print a message with the problem?
unit_stop (u); unit_stop (u);
@ -917,89 +905,37 @@ load_plugins (struct app_context *ctx)
// --- Plain transport --------------------------------------------------------- // --- Plain transport ---------------------------------------------------------
static bool static enum socket_io_result
transport_plain_init (struct unit *u)
{
(void) u;
return true;
}
static void
transport_plain_cleanup (struct unit *u)
{
(void) u;
}
static enum transport_io_result
transport_plain_on_readable (struct unit *u) transport_plain_on_readable (struct unit *u)
{ {
struct str *buf = &u->read_buffer; enum socket_io_result result =
ssize_t n_read; socket_io_try_read (u->socket_fd, &u->read_buffer);
if (result == SOCKET_IO_ERROR)
while (true)
{
str_reserve (buf, 512);
n_read = recv (u->socket_fd, buf->str + buf->len,
buf->alloc - buf->len - 1 /* null byte */, 0);
if (n_read > 0)
{
buf->str[buf->len += n_read] = '\0';
continue;
}
if (n_read == 0)
return TRANSPORT_IO_EOF;
if (errno == EAGAIN)
return TRANSPORT_IO_OK;
if (errno == EINTR)
continue;
print_debug ("%s: %s: %s", __func__, "recv", strerror (errno)); print_debug ("%s: %s: %s", __func__, "recv", strerror (errno));
return TRANSPORT_IO_ERROR; return result;
}
} }
static enum transport_io_result static enum socket_io_result
transport_plain_on_writeable (struct unit *u) transport_plain_on_writeable (struct unit *u)
{ {
struct str *buf = &u->write_buffer; enum socket_io_result result =
ssize_t n_written; socket_io_try_write (u->socket_fd, &u->write_buffer);
if (result == SOCKET_IO_ERROR)
while (buf->len)
{
n_written = send (u->socket_fd, buf->str, buf->len, 0);
if (n_written >= 0)
{
str_remove_slice (buf, 0, n_written);
continue;
}
if (errno == EAGAIN)
return TRANSPORT_IO_OK;
if (errno == EINTR)
continue;
print_debug ("%s: %s: %s", __func__, "send", strerror (errno)); print_debug ("%s: %s: %s", __func__, "send", strerror (errno));
return TRANSPORT_IO_ERROR; return result;
}
return TRANSPORT_IO_OK;
} }
static int static int
transport_plain_get_poll_events (struct unit *u) transport_plain_get_poll_events (struct unit *u)
{ {
int events = POLLIN;
if (u->write_buffer.len) if (u->write_buffer.len)
events |= POLLOUT; return POLLIN | POLLOUT;
return events; return POLLIN;
} }
static struct transport g_transport_plain = static struct transport g_transport_plain =
{ {
.name = "plain", .name = "plain",
.init = transport_plain_init,
.cleanup = transport_plain_cleanup,
.on_readable = transport_plain_on_readable, .on_readable = transport_plain_on_readable,
.on_writeable = transport_plain_on_writeable, .on_writeable = transport_plain_on_writeable,
.get_poll_events = transport_plain_get_poll_events, .get_poll_events = transport_plain_get_poll_events,
@ -1067,12 +1003,12 @@ transport_tls_cleanup (struct unit *u)
free (data); free (data);
} }
static enum transport_io_result static enum socket_io_result
transport_tls_on_readable (struct unit *u) transport_tls_on_readable (struct unit *u)
{ {
struct transport_tls_data *data = u->transport_data; struct transport_tls_data *data = u->transport_data;
if (data->ssl_tx_want_rx) if (data->ssl_tx_want_rx)
return TRANSPORT_IO_OK; return SOCKET_IO_OK;
struct str *buf = &u->read_buffer; struct str *buf = &u->read_buffer;
data->ssl_rx_want_tx = false; data->ssl_rx_want_tx = false;
@ -1089,27 +1025,27 @@ transport_tls_on_readable (struct unit *u)
buf->str[buf->len += n_read] = '\0'; buf->str[buf->len += n_read] = '\0';
continue; continue;
case SSL_ERROR_ZERO_RETURN: case SSL_ERROR_ZERO_RETURN:
return TRANSPORT_IO_EOF; return SOCKET_IO_EOF;
case SSL_ERROR_WANT_READ: case SSL_ERROR_WANT_READ:
return TRANSPORT_IO_OK; return SOCKET_IO_OK;
case SSL_ERROR_WANT_WRITE: case SSL_ERROR_WANT_WRITE:
data->ssl_rx_want_tx = true; data->ssl_rx_want_tx = true;
return TRANSPORT_IO_OK; return SOCKET_IO_OK;
case XSSL_ERROR_TRY_AGAIN: case XSSL_ERROR_TRY_AGAIN:
continue; continue;
default: default:
print_debug ("%s: %s: %s", __func__, "SSL_read", error_info); print_debug ("%s: %s: %s", __func__, "SSL_read", error_info);
return TRANSPORT_IO_ERROR; return SOCKET_IO_ERROR;
} }
} }
} }
static enum transport_io_result static enum socket_io_result
transport_tls_on_writeable (struct unit *u) transport_tls_on_writeable (struct unit *u)
{ {
struct transport_tls_data *data = u->transport_data; struct transport_tls_data *data = u->transport_data;
if (data->ssl_rx_want_tx) if (data->ssl_rx_want_tx)
return TRANSPORT_IO_OK; return SOCKET_IO_OK;
struct str *buf = &u->write_buffer; struct str *buf = &u->write_buffer;
data->ssl_tx_want_rx = false; data->ssl_tx_want_rx = false;
@ -1124,20 +1060,20 @@ transport_tls_on_writeable (struct unit *u)
str_remove_slice (buf, 0, n_written); str_remove_slice (buf, 0, n_written);
continue; continue;
case SSL_ERROR_ZERO_RETURN: case SSL_ERROR_ZERO_RETURN:
return TRANSPORT_IO_EOF; return SOCKET_IO_EOF;
case SSL_ERROR_WANT_WRITE: case SSL_ERROR_WANT_WRITE:
return TRANSPORT_IO_OK; return SOCKET_IO_OK;
case SSL_ERROR_WANT_READ: case SSL_ERROR_WANT_READ:
data->ssl_tx_want_rx = true; data->ssl_tx_want_rx = true;
return TRANSPORT_IO_OK; return SOCKET_IO_OK;
case XSSL_ERROR_TRY_AGAIN: case XSSL_ERROR_TRY_AGAIN:
continue; continue;
default: default:
print_debug ("%s: %s: %s", __func__, "SSL_write", error_info); print_debug ("%s: %s: %s", __func__, "SSL_write", error_info);
return TRANSPORT_IO_ERROR; return SOCKET_IO_ERROR;
} }
} }
return TRANSPORT_IO_OK; return SOCKET_IO_OK;
} }
static int static int
@ -1206,12 +1142,8 @@ node_new (char *text)
static void static void
node_delete (struct node *self) node_delete (struct node *self)
{ {
struct node *iter, *next; LIST_FOR_EACH (struct node, iter, self->children)
for (iter = self->children; iter; iter = next)
{
next = iter->next;
node_delete (iter); node_delete (iter);
}
free (self->text); free (self->text);
free (self); free (self);
} }
@ -1230,19 +1162,7 @@ struct node_print_data
struct node_print_level **tail; ///< Where to place further levels struct node_print_level **tail; ///< Where to place further levels
}; };
static char * static int node_escape (int c) { return (c >= 32 && c < 127) ? c : '.'; }
node_escape_text (const char *text)
{
struct str filtered;
str_init (&filtered);
int c;
while ((c = *text++))
str_append_c (&filtered,
(isascii (c) && (isgraph (c) || c == ' ')) ? c : '.');
return str_steal (&filtered);
}
static void static void
node_print_tree_level (struct node *self, struct node_print_data *data) node_print_tree_level (struct node *self, struct node_print_data *data)
@ -1260,7 +1180,8 @@ node_print_tree_level (struct node *self, struct node_print_data *data)
fputs (indent.str, stdout); fputs (indent.str, stdout);
str_free (&indent); str_free (&indent);
char *escaped = node_escape_text (self->text); char *escaped = xstrdup (self->text);
cstr_transform (escaped, node_escape);
if (self->bold) if (self->bold)
print_bold (stdout, escaped); print_bold (stdout, escaped);
else else