Bump liberty, cleanup
This commit is contained in:
parent
b2456c1cb6
commit
f42099e79c
2
liberty
2
liberty
|
@ -1 +1 @@
|
||||||
Subproject commit 084e964286bfcd13ee6a25a2ee35dfba9da1072e
|
Subproject commit ec128558a4d067f51cd36d8026e6df849ea7de26
|
171
ponymap.c
171
ponymap.c
|
@ -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,8 +516,9 @@ 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);
|
||||||
|
|
||||||
|
if (u->transport->cleanup)
|
||||||
u->transport->cleanup (u);
|
u->transport->cleanup (u);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue