int fserve_list_clients (client_t *client, const char *mount, int response, int show_listeners) { int ret; fbinfo finfo; xmlDocPtr doc; xmlNodePtr node, srcnode; finfo.flags = 0; finfo.mount = (char*)mount; finfo.limit = 0; finfo.fallback = NULL; doc = xmlNewDoc(XMLSTR("1.0")); node = xmlNewDocNode(doc, NULL, XMLSTR("icestats"), NULL); xmlDocSetRootElement(doc, node); srcnode = xmlNewChild(node, NULL, XMLSTR("source"), NULL); xmlSetProp(srcnode, XMLSTR("mount"), XMLSTR(mount)); ret = fserve_list_clients_xml (srcnode, &finfo); if (ret == 0 && finfo.flags&FS_FALLBACK) { finfo.flags = 0; // retry ret = fserve_list_clients_xml (srcnode, &finfo); } if (ret) { char buf [20]; snprintf (buf, sizeof(buf), "%d", ret); xmlNewChild (srcnode, NULL, XMLSTR("listeners"), XMLSTR(buf)); return admin_send_response (doc, client, response, "listclients.xsl"); } xmlFreeDoc (doc); return client_send_400 (client, "mount does not exist"); }
xmlDocPtr stats_get_xml (int flags, const char *show_mount) { xmlDocPtr doc; xmlNodePtr node; doc = xmlNewDoc (XMLSTR("1.0")); node = xmlNewDocNode (doc, NULL, XMLSTR("icestats"), NULL); xmlDocSetRootElement(doc, node); node = _dump_stats_to_doc (node, show_mount, flags); if (show_mount && node) { source_t *source; /* show each listener */ avl_tree_rlock (global.source_tree); source = source_find_mount_raw (show_mount); if (source) { thread_mutex_lock (&source->lock); admin_source_listeners (source, node); thread_mutex_unlock (&source->lock); avl_tree_unlock (global.source_tree); } else { fbinfo finfo; avl_tree_unlock (global.source_tree); finfo.flags = FS_FALLBACK; finfo.mount = (char*)show_mount; finfo.limit = 0; finfo.fallback = NULL; fserve_list_clients_xml (node, &finfo); } } return doc; }