diff options
author | Přemysl Janouch <p.janouch@gmail.com> | 2014-09-21 02:22:02 +0200 |
---|---|---|
committer | Přemysl Janouch <p.janouch@gmail.com> | 2014-09-21 03:29:35 +0200 |
commit | 6c90cc85dba04a45cddbf2250e5e805a4b107b36 (patch) | |
tree | d8d1c1eba13a73e46937de87df08feb4675099e8 | |
parent | e7d8b244a9fb611c1b6233e20e9186de4541feba (diff) | |
download | ponymap-6c90cc85dba04a45cddbf2250e5e805a4b107b36.tar.gz ponymap-6c90cc85dba04a45cddbf2250e5e805a4b107b36.tar.xz ponymap-6c90cc85dba04a45cddbf2250e5e805a4b107b36.zip |
Fix the IRC plugin, and not only that
-rw-r--r-- | plugins/irc.c | 6 | ||||
-rw-r--r-- | ponymap.c | 28 |
2 files changed, 16 insertions, 18 deletions
diff --git a/plugins/irc.c b/plugins/irc.c index 7732b73..c0e967d 100644 --- a/plugins/irc.c +++ b/plugins/irc.c @@ -217,8 +217,10 @@ static void * scan_init (struct unit *u) { char nick[IRC_MAX_NICKNAME + 1]; - for (size_t i = 0; i < sizeof nick - 1; i++) + size_t i; + for (i = 0; i < sizeof nick - 1; i++) nick[i] = 'a' + rand () % ('z' - 'a' + 1); + nick[i] = '\0'; struct str hello; str_init (&hello); @@ -267,7 +269,7 @@ on_irc_message (const struct irc_message *msg, const char *raw, void *user_data) if (code == IRC_RPL_MYINFO && msg->params.len > 0) { char *info = xstrdup_printf ("%s: %s", - "server name", msg->params.vector[0]); + "server name", msg->params.vector[1]); g_data.api->unit_add_info (scan->u, info); free (info); @@ -229,6 +229,7 @@ struct unit struct poller_timer timeout_event; ///< Timeout event struct poller_fd fd_event; ///< FD event + bool abortion_requested; ///< Abortion requested by service bool aborted; ///< Scan has been aborted bool success; ///< Service has been found struct str_vector info; ///< Info resulting from the scan @@ -537,9 +538,10 @@ unit_abort (struct unit *u) if (u->success) { // Now we're a part of the target - LIST_PREPEND (u->target->results, u); - target_unref (u->target); + struct target *target = u->target; + LIST_PREPEND (target->results, u); u->target = NULL; + target_unref (target); } else unit_unref (u); @@ -562,10 +564,6 @@ on_unit_ready (const struct pollfd *pfd, struct unit *u) struct service *service = u->service; enum transport_io_result result; - // We hold a reference so that unit_abort(), which may also be - // called by handlers within the service, doesn't free the unit. - unit_ref (u); - if ((result = transport->on_readable (u))) goto exception; if (u->read_buffer.len) @@ -574,15 +572,15 @@ on_unit_ready (const struct pollfd *pfd, struct unit *u) service->on_data (u->service_data, u, buf); str_remove_slice (buf, 0, buf->len); - if (u->aborted) - goto end; + if (u->abortion_requested) + goto abort; } if ((result = transport->on_writeable (u))) goto exception; - if (!u->aborted) - unit_update_poller (u, pfd); - goto end; + + unit_update_poller (u, pfd); + return; exception: if (result == TRANSPORT_IO_EOF) @@ -596,10 +594,8 @@ exception: service->on_error (u->service_data, u); } +abort: unit_abort (u); - -end: - unit_unref (u); } static void @@ -783,7 +779,7 @@ plugin_api_unit_get_address (struct unit *u) static ssize_t plugin_api_unit_write (struct unit *u, const void *buf, size_t len) { - if (u->aborted) + if (u->abortion_requested || u->aborted) return -1; str_append_data (&u->write_buffer, buf, len); @@ -805,7 +801,7 @@ plugin_api_unit_add_info (struct unit *u, const char *result) static void plugin_api_unit_abort (struct unit *u) { - unit_abort (u); + u->abortion_requested = true; } static struct plugin_api g_plugin_vtable = |