/* * atheme.ison * * XML inputs: * nickname * * XML outputs: * boolean: if nickname is online * string: if nickname is authenticated, what entity they are authed to, * else '*' */ static int xmlrpcmethod_ison(void *conn, int parc, char *parv[]) { user_t *u; int i; char buf[XMLRPC_BUFSIZE], buf2[XMLRPC_BUFSIZE]; for (i = 0; i < parc; i++) { if (strchr(parv[i], '\r') || strchr(parv[i], '\n')) { xmlrpc_generic_error(fault_badparams, "Invalid parameters."); return 0; } } if (parc < 1) { xmlrpc_generic_error(fault_needmoreparams, "Insufficient parameters."); return 0; } u = user_find(parv[0]); if (u == NULL) { xmlrpc_boolean(buf, false); xmlrpc_string(buf2, "*"); xmlrpc_send(2, buf, buf2); return 0; } xmlrpc_boolean(buf, true); xmlrpc_string(buf2, u->myuser != NULL ? entity(u->myuser)->name : "*"); xmlrpc_send(2, buf, buf2); return 0; }
static int xmlrpc_raise(struct sip_msg *dummy_msg, str* ev_name, evi_reply_sock *sock, evi_params_t * params) { xmlrpc_send_t * msg = NULL; if (!sock) { LM_ERR("no socket found\n"); return -1; } /* check the socket type */ if (!(sock->flags & XMLRPC_FLAG)) { LM_ERR("invalid socket type %x\n", sock->flags); return -1; } /* check to see if a socket was specified */ if (!(sock->flags & EVI_SOCKET)) { LM_ERR("not a valid socket\n"); return -1; } if (!(sock->flags & EVI_ADDRESS)) { LM_ERR("cannot find destination address\n"); return -1; } if (!(sock->flags & EVI_PARAMS)) { LM_ERR("no method found\n"); return -1; } if (xmlrpc_build_buffer(ev_name, sock, params, &msg) ) { LM_ERR("cannot create send buffer\n"); return -1; } if (xmlrpc_send(msg) < 0) { LM_ERR("cannot send message\n"); shm_free(msg); return -1; } return 0; }
int xmlrpc_about(void *userdata, int ac, char **av) { char buf[XMLRPC_BUFSIZE]; char buf2[XMLRPC_BUFSIZE]; char buf3[XMLRPC_BUFSIZE]; char buf4[XMLRPC_BUFSIZE]; char *arraydata; (void)userdata; xmlrpc_integer(buf3, ac); xmlrpc_string(buf4, av[0]); xmlrpc_string(buf, (char *)XMLLIB_VERSION); xmlrpc_string(buf2, (char *)XMLLIB_AUTHOR); arraydata = xmlrpc_array(4, buf, buf2, buf3, buf4); xmlrpc_send(1, arraydata); free(arraydata); return XMLRPC_CONT; }
/* * atheme.metadata * * XML inputs: * entity name, UID or channel name * metadata key * metadata value (optional) * * XML outputs: * string: metadata value */ static int xmlrpcmethod_metadata(void *conn, int parc, char *parv[]) { metadata_t *md; int i; char buf[XMLRPC_BUFSIZE]; for (i = 0; i < parc; i++) { if (strchr(parv[i], '\r') || strchr(parv[i], '\n')) { xmlrpc_generic_error(fault_badparams, "Invalid parameters."); return 0; } } if (parc < 2) { xmlrpc_generic_error(fault_needmoreparams, "Insufficient parameters."); return 0; } if (*parv[0] == '#') { mychan_t *mc; mc = mychan_find(parv[0]); if (mc == NULL) { xmlrpc_generic_error(fault_nosuch_source, "No channel registration was found for the provided channel name."); return 0; } md = metadata_find(mc, parv[1]); } else { myentity_t *mt; mt = myentity_find(parv[0]); if (mt == NULL) mt = myentity_find_uid(parv[0]); if (mt == NULL) { xmlrpc_generic_error(fault_nosuch_source, "No account was found for this accountname or UID."); return 0; } md = metadata_find(mt, parv[1]); } if (md == NULL) { xmlrpc_generic_error(fault_nosuch_source, "No metadata found matching this account/channel and key."); return 0; } xmlrpc_string(buf, md->value); xmlrpc_send(1, buf); return 0; }