# HG changeset patch # User Tero Marttila # Date 1237158221 -7200 # Node ID d7508879ad0122f557f6488feeb0f7f6d6fc0c97 # Parent 81cc5b8c5abc63c9a5e8821ca5d063d52f28219e add --module support, and tweak irc_net docs diff -r 81cc5b8c5abc -r d7508879ad01 src/irc_log.c --- a/src/irc_log.c Mon Mar 16 00:55:45 2009 +0200 +++ b/src/irc_log.c Mon Mar 16 01:03:41 2009 +0200 @@ -55,6 +55,8 @@ // store ctx->nexus = nexus; + log_info("module initialized"); + // ok *ctx_ptr = ctx; diff -r 81cc5b8c5abc -r d7508879ad01 src/irc_net.h --- a/src/irc_net.h Mon Mar 16 00:55:45 2009 +0200 +++ b/src/irc_net.h Mon Mar 16 01:03:41 2009 +0200 @@ -59,7 +59,7 @@ * * @param net the new irc_net struct is returned via this pointer * @param info network informated, used to connect and register - * @param err used to return extended error information + * @param err return error info */ err_t irc_net_create (struct irc_net **net, const struct irc_net_info *info, struct error_info *err); @@ -73,6 +73,11 @@ * Create a new irc_chan and add it to our channel list. * * If we are connected and registered, JOIN the channel right away, otherwise, join it once we register. + * + * @param net the irc_net the channel is on + * #param chan_ptr return the new irc_chan via this, if not NULL + * @param info the info required to identify and join the channel + * @param err return error info */ err_t irc_net_add_chan (struct irc_net *net, struct irc_chan **chan_ptr, const struct irc_chan_info *info, struct error_info *err); diff -r 81cc5b8c5abc -r d7508879ad01 src/module.c --- a/src/module.c Mon Mar 16 00:55:45 2009 +0200 +++ b/src/module.c Mon Mar 16 01:03:41 2009 +0200 @@ -82,7 +82,8 @@ TAILQ_INSERT_TAIL(&modules->list, module, modules_list); // ok - *module_ptr = module; + if (module_ptr) + *module_ptr = module; return SUCCESS; diff -r 81cc5b8c5abc -r d7508879ad01 src/module.h --- a/src/module.h Mon Mar 16 00:55:45 2009 +0200 +++ b/src/module.h Mon Mar 16 01:03:41 2009 +0200 @@ -123,6 +123,11 @@ /** * Load a new module + * + * @param modules the module-loading context + * @param module_ptr return the new module via this, if not NULL + * @param info the info required to identify and load the module + * @param err return error info */ err_t module_load (struct modules *modules, struct module **module_ptr, const struct module_info *info, struct error_info *err); diff -r 81cc5b8c5abc -r d7508879ad01 src/nexus.c --- a/src/nexus.c Mon Mar 16 00:55:45 2009 +0200 +++ b/src/nexus.c Mon Mar 16 01:03:41 2009 +0200 @@ -55,7 +55,7 @@ } /** - * Parse and apply a --network option + * Parse and apply a --network option, adding the given network to our irc_client. */ static err_t apply_network (struct nexus *nexus, char *opt, struct error_info *err) { @@ -93,6 +93,8 @@ RETURN_SET_ERROR_STR(err, ERR_CMD_OPT, "unrecognized flag for --network"); } + log_info("add network '%s' at '%s:%s'", info.network, info.hostname, info.service); + // create the net if (irc_client_add_net(nexus->client, NULL, &info, err)) return ERROR_CODE(err); @@ -102,7 +104,7 @@ } /** - * Parse and apply a --channel option + * Parse and apply a --channel option, adding the given channel to the given irc_net. */ static err_t apply_channel (struct nexus *nexus, char *opt, struct error_info *err) { @@ -126,6 +128,8 @@ // look up the net if ((net = irc_client_get_net(nexus->client, network)) == NULL) RETURN_SET_ERROR_STR(err, ERR_CMD_OPT, "unknown network for --channel"); + + log_info("add channel '%s' on network '%s'", info.channel, net->info.network); // add the channel if (irc_net_add_chan(net, NULL, &info, err)) @@ -136,6 +140,38 @@ } /** + * Parse and apply a --module option, loading the given module. + */ +static err_t apply_module (struct nexus *nexus, char *opt, struct error_info *err) +{ + struct module_info info = { + .name = NULL, + .path = NULL, + }; + struct module *module; + + // parse the required fields + if ((info.name = strsep(&opt, ":")) == NULL) + RETURN_SET_ERROR_STR(err, ERR_CMD_OPT, "missing field for --module"); + + if ((info.path = strsep(&opt, ":")) == NULL) + RETURN_SET_ERROR_STR(err, ERR_CMD_OPT, "missing field for --module"); + + // trailing garbage? + if (opt) + RETURN_SET_ERROR_STR(err, ERR_CMD_OPT, "trailing values for --channel"); + + log_info("loading module '%s' from path '%s'", info.name, info.path); + + // load it + if (module_load(nexus->modules, &module, &info, err)) + return ERROR_CODE(err); + + // ok + return SUCCESS; +} + +/** * Parse arguments and apply them to the given nexus */ static err_t parse_args (struct nexus *nexus, int argc, char **argv, struct error_info *err) @@ -164,6 +200,11 @@ break; case OPT_MODULE: + if (apply_module(nexus, optarg, err)) + return ERROR_CODE(err); + + break; + case OPT_CONFIG: RETURN_SET_ERROR_STR(err, ERR_CMD_OPT, "option unimplemented");