Mercurial > irccd
changeset 946:2ec05b9db2ee
irccd: use net set.h macros
author | David Demelier <markand@malikania.fr> |
---|---|
date | Fri, 15 Jan 2021 14:44:52 +0100 |
parents | 8ddeceeee0f2 |
children | 95201fd9ad88 |
files | irccd/main.c lib/irccd/irccd.c lib/irccd/irccd.h lib/irccd/jsapi-plugin.c lib/irccd/jsapi-server.c lib/irccd/jsapi-timer.c lib/irccd/peer.c lib/irccd/server.c |
diffstat | 8 files changed, 64 insertions(+), 110 deletions(-) [+] |
line wrap: on
line diff
--- a/irccd/main.c Fri Jan 15 14:18:54 2021 +0100 +++ b/irccd/main.c Fri Jan 15 14:44:52 2021 +0100 @@ -36,9 +36,8 @@ irc_server_join(&s, "#test", NULL); - irc_init(); irc_log_set_verbose(true); - irc_add_server(&s); - irc_run(); - + irc_bot_init(); + irc_bot_add_server(&s); + irc_bot_run(); }
--- a/lib/irccd/irccd.c Fri Jan 15 14:18:54 2021 +0100 +++ b/lib/irccd/irccd.c Fri Jan 15 14:44:52 2021 +0100 @@ -27,31 +27,14 @@ #include "event.h" #include "irccd.h" #include "log.h" +#include "peer.h" #include "plugin.h" +#include "rule.h" #include "server.h" -#include "peer.h" +#include "set.h" #include "transport.h" -#include "rule.h" #include "util.h" -#define APPEND(a, l, o, f) \ -do { \ - a = irc_util_reallocarray(a, ++l, sizeof (*o)); \ - memcpy(&a[l - 1], o, sizeof (*o)); \ - qsort(a, l, sizeof (*o), f); \ -} while (0) - -#define REMOVE(a, l, f) \ -do { \ - if (--l == 0) { \ - free(a); \ - a = NULL; \ - } else { \ - qsort(a, l + 1, sizeof (*a), f); \ - a = irc_util_reallocarray(a, --l, sizeof (*a)); \ - } \ -} while (0) - struct pkg { struct pollfd *fds; size_t fdsz; @@ -67,39 +50,21 @@ static int pipes[2]; static int -cmp_server(const void *d1, const void *d2) +cmp_server(const struct irc_server *s1, const struct irc_server *s2) { - return strcmp( - ((const struct irc_server *)d1)->name, - ((const struct irc_server *)d2)->name - ); + return strcmp(s1->name, s2->name); } static int -cmp_plugin(const void *d1, const void *d2) +cmp_plugin(const struct irc_plugin *p1, const struct irc_plugin *p2) { - return strcmp( - ((const struct irc_plugin *)d1)->name, - ((const struct irc_plugin *)d2)->name - ); + return strcmp(p1->name, p2->name); } static int -cmp_peer(const void *d1, const void *d2) -{ - return ((const struct irc_peer *)d2)->fd - ((const struct irc_peer *)d1)->fd; -} - -static int -cmp_server_name(const void *d1, const void *d2) +cmp_peer(const struct irc_peer *p1, const struct irc_peer *p2) { - return strcmp(d1, ((const struct irc_server *)d2)->name); -} - -static int -cmp_plugin_name(const void *d1, const void *d2) -{ - return strcmp(d1, ((const struct irc_plugin *)d2)->name); + return p1->fd - p2->fd; } static struct pkg @@ -174,14 +139,15 @@ /* Accept new transport client. */ if (irc_transport_flush(&pkg->fds[i], &peer)) - APPEND(irc.peers, irc.peersz, &peer, cmp_peer); + IRC_SET_ALLOC_PUSH(&irc.peers, &irc.peersz, &peer, cmp_peer); /* Flush clients. */ - for (size_t p = 0; p < irc.peersz; ++p) { + for (size_t p = 0; p < irc.peersz; ) { if (!irc_peer_flush(&irc.peers[p], &pkg->fds[i])) { irc_peer_finish(&irc.peers[p]); - REMOVE(irc.peers, irc.peersz, cmp_peer); - } + IRC_SET_ALLOC_REMOVE(&irc.peers, &irc.peersz, &irc.peers[p]); + } else + ++p; } } @@ -204,7 +170,7 @@ } void -irc_init(void) +irc_bot_init(void) { irc_log_to_console(); @@ -213,28 +179,30 @@ } void -irc_add_server(const struct irc_server *s) +irc_bot_add_server(const struct irc_server *s) { assert(s); - APPEND(irc.servers, irc.serversz, s, cmp_server); - + IRC_SET_ALLOC_PUSH(&irc.servers, &irc.serversz, s, cmp_server); irc_server_connect(&irc.servers[irc.serversz - 1]); } struct irc_server * -irc_find_server(const char *name) +irc_bot_find_server(const char *name) { - return bsearch(name, irc.servers, irc.serversz, sizeof (*irc.servers), - cmp_server_name); + struct irc_server key = {0}; + + strlcpy(key.name, name, sizeof (key.name)); + + return IRC_SET_FIND(irc.servers, irc.serversz, &key, cmp_server); } void -irc_del_server(const char *name) +irc_bot_remove_server(const char *name) { struct irc_server *s; - if (!(s = irc_find_server(name))) + if (!(s = irc_bot_find_server(name))) return; irc_server_disconnect(s); @@ -246,15 +214,15 @@ }); /* Finally remove from array. */ - REMOVE(irc.servers, irc.serversz, cmp_server); + IRC_SET_ALLOC_REMOVE(&irc.servers, &irc.serversz, s); } void -irc_add_plugin(const struct irc_plugin *p) +irc_bot_add_plugin(const struct irc_plugin *p) { assert(p); - APPEND(irc.plugins, irc.pluginsz, p, cmp_plugin); + IRC_SET_ALLOC_PUSH(&irc.plugins, &irc.pluginsz, p, cmp_plugin); irc_log_info("plugin %s: %s", p->name, p->description); irc_log_info("plugin %s: version %s, from %s (%s license)", p->name, @@ -264,24 +232,27 @@ } struct irc_plugin * -irc_find_plugin(const char *name) +irc_bot_find_plugin(const char *name) { - return bsearch(name, irc.plugins, irc.pluginsz, sizeof (*irc.plugins), - cmp_plugin_name); + struct irc_plugin key = {0}; + + strlcpy(key.name, name, sizeof (key.name)); + + return IRC_SET_FIND(irc.plugins, irc.pluginsz, &key, cmp_plugin); } void -irc_del_plugin(const char *name) +irc_bot_remove_plugin(const char *name) { struct irc_plugin *p; - if (!(p = irc_find_plugin(name))) + if (!(p = irc_bot_find_plugin(name))) return; irc_plugin_unload(p); irc_plugin_finish(p); - REMOVE(irc.plugins, irc.pluginsz, cmp_plugin); + IRC_SET_ALLOC_REMOVE(&irc.plugins, &irc.pluginsz, p); } bool @@ -315,7 +286,7 @@ } void -irc_post(void (*exec)(void *), void *data) +irc_bot_post(void (*exec)(void *), void *data) { struct defer df = { .exec = exec, @@ -327,7 +298,7 @@ } void -irc_run(void) +irc_bot_run(void) { struct pkg pkg;
--- a/lib/irccd/irccd.h Fri Jan 15 14:18:54 2021 +0100 +++ b/lib/irccd/irccd.h Fri Jan 15 14:44:52 2021 +0100 @@ -43,25 +43,25 @@ } irc; void -irc_init(void); +irc_bot_init(void); void -irc_add_server(const struct irc_server *); +irc_bot_add_server(const struct irc_server *); struct irc_server * -irc_find_server(const char *); +irc_bot_find_server(const char *); void -irc_del_server(const char *); +irc_bot_remove_server(const char *); void -irc_add_plugin(const struct irc_plugin *); +irc_bot_add_plugin(const struct irc_plugin *); struct irc_plugin * -irc_find_plugin(const char *); +irc_bot_find_plugin(const char *); void -irc_del_plugin(const char *); +irc_bot_remove_plugin(const char *); bool irc_bot_insert_rule(const struct irc_rule *, size_t); @@ -70,9 +70,9 @@ irc_bot_remove_rule(size_t); void -irc_post(void (*)(void *), void *); +irc_bot_post(void (*)(void *), void *); void -irc_run(void); +irc_bot_run(void); #endif /* !IRCCD_H */
--- a/lib/irccd/jsapi-plugin.c Fri Jan 15 14:18:54 2021 +0100 +++ b/lib/irccd/jsapi-plugin.c Fri Jan 15 14:44:52 2021 +0100 @@ -136,7 +136,7 @@ struct irc_plugin *p; if (duk_get_top(ctx) >= 1) - p = irc_find_plugin(duk_require_string(ctx, 0)); + p = irc_bot_find_plugin(duk_require_string(ctx, 0)); else p = irc_jsapi_plugin_self(ctx);
--- a/lib/irccd/jsapi-server.c Fri Jan 15 14:18:54 2021 +0100 +++ b/lib/irccd/jsapi-server.c Fri Jan 15 14:44:52 2021 +0100 @@ -38,7 +38,7 @@ duk_push_this(ctx); duk_get_prop_string(ctx, -1, SIGNATURE); - sv = irc_find_server(duk_to_string(ctx, -1)); + sv = irc_bot_find_server(duk_to_string(ctx, -1)); duk_pop_2(ctx); if (!sv) @@ -56,7 +56,7 @@ duk_error(ctx, DUK_ERR_TYPE_ERROR, "not a Server object"); duk_get_prop_string(ctx, index, SIGNATURE); - sv = irc_find_server(duk_to_string(ctx, -1)); + sv = irc_bot_find_server(duk_to_string(ctx, -1)); duk_pop(ctx); return sv;
--- a/lib/irccd/jsapi-timer.c Fri Jan 15 14:18:54 2021 +0100 +++ b/lib/irccd/jsapi-timer.c Fri Jan 15 14:44:52 2021 +0100 @@ -148,11 +148,10 @@ * 2. It has been stopped by the user (tm->stopped is true). * 3. The plugin is shutting down (tm->kill is true). */ - printf("FINISHED: %d, %d\n", rc, tm->status); if (rc == ETIMEDOUT && tm->status == TIMER_ACTIVE) - irc_post(timer_expired, tm); + irc_bot_post(timer_expired, tm); else - irc_post(timer_aborted, tm); + irc_bot_post(timer_aborted, tm); return NULL; }
--- a/lib/irccd/peer.c Fri Jan 15 14:18:54 2021 +0100 +++ b/lib/irccd/peer.c Fri Jan 15 14:44:52 2021 +0100 @@ -67,7 +67,7 @@ { struct irc_server *s; - if (!(s = irc_find_server(id))) { + if (!(s = irc_bot_find_server(id))) { irc_peer_send(p, "server %s not found", id); return NULL; }
--- a/lib/irccd/server.c Fri Jan 15 14:18:54 2021 +0100 +++ b/lib/irccd/server.c Fri Jan 15 14:44:52 2021 +0100 @@ -34,10 +34,11 @@ # include <openssl/err.h> #endif +#include "channel.h" #include "event.h" #include "log.h" #include "server.h" -#include "channel.h" +#include "set.h" #include "util.h" struct origin { @@ -74,12 +75,9 @@ } static int -compare_chan(const void *d1, const void *d2) +cmp_channel(const struct irc_channel *c1, const struct irc_channel *c2) { - return strcmp( - ((const struct irc_channel *)d1)->name, - ((const struct irc_channel *)d2)->name - ); + return strcmp(c1->name, c2->name); } static const struct origin * @@ -98,12 +96,6 @@ return &origin; } -static inline void -sort(struct irc_server *s) -{ - qsort(s->channels, s->channelsz, sizeof (*s->channels), compare_chan); -} - static struct irc_channel * add_channel(struct irc_server *s, const char *name, const char *password, bool joined) { @@ -116,10 +108,7 @@ if (password) strlcpy(ch.password, password, sizeof (ch.password)); - s->channels = irc_util_reallocarray(s->channels, ++s->channelsz, sizeof (ch)); - - memcpy(&s->channels[s->channelsz - 1], &ch, sizeof (ch)); - sort(s); + IRC_SET_ALLOC_PUSH(&s->channels, &s->channelsz, &ch, cmp_channel); return irc_server_find(s, name); } @@ -127,11 +116,7 @@ static void remove_channel(struct irc_server *s, struct irc_channel *ch) { - /* Null channel name will be moved at the end. */ - memset(ch, 0, sizeof (*ch)); - - s->channels = irc_util_reallocarray(s->channels, --s->channelsz, sizeof (*ch)); - sort(s); + IRC_SET_ALLOC_REMOVE(&s->channels, &s->channelsz, ch); } static void @@ -842,7 +827,7 @@ strlcpy(key.name, name, sizeof (key.name)); - return bsearch(&key, s->channels, s->channelsz, sizeof (key), compare_chan); + return IRC_SET_FIND(s->channels, s->channelsz, &key, cmp_channel); } bool