/* dump servers */ static void m_dump_server(char *arg) { struct server *sptr = NULL; if(arg) { if(chars_isdigit(*arg)) sptr = server_find_id(atoi(arg)); else sptr = server_find_name(arg); } server_dump(sptr); }
dbase_server *server_find_name(char *name, dbase_server *root) { if (root) { int i; dbase_server *tmp; if (!strcmp(name, root->name)) return root; for (i = 0; i < root->children_count; i++) if ((tmp = server_find_name(name, root->children[i]))) return tmp; } return NULL; }
void server_remove(char *name) { dbase_server *server = servers; if (name) { server = server_find_name(name, servers); } if (server) { if (server == servers) servers = NULL; server_free(server, 1); } }
/* -------------------------------------------------------------------------- * * argv[0] - prefix * * argv[1] - 'connect' * * argv[2] - server to connect from/to * * argv[3] - [server to connect to] * * -------------------------------------------------------------------------- */ static void mo_connect(struct lclient *lcptr, struct client *cptr, int argc, char **argv) { struct connect *cnptr; struct server *asptr; /* We have 2 arguments, the message must be relayed */ if(argv[3]) { if(server_relay_always(lcptr, cptr, 2, ":%C CONNECT %s %s", &argc, argv)) return; } /* Message is targeted to us, search connect{} block */ if((cnptr = connect_find_name(argv[2])) == NULL) { client_send(cptr, ":%S NOTICE %C :*** no connect{} block for %s", server_me, cptr, argv[3]); return; } /* Cannot have redundant links (currently) */ if((asptr = server_find_name(cnptr->name))) { if(asptr->client->origin != client_me) client_send(cptr, ":%S NOTICE %C :*** server %S already exists from %S.", server_me, cptr, asptr, asptr->client->origin->server); else client_send(cptr, ":%S NOTICE %C :*** server %S already exists.", server_me, cptr, asptr); return; } /* Intitiate the connect{} block */ if(server_connect(cptr, cnptr)) { client_send(cptr, ":%S NOTICE %C :*** couldn't connect to %s[%s:%u]", server_me, cptr, cnptr->name, cnptr->address, cnptr->port_remote); } }