Beispiel #1
0
/**
 * Try to connect using ipv4 connection.
 *
 * @param service service to determinate
 * @param sockaddr initialized sockaddr_in for connect
 * @param port a port to connect to
 */
bool Connect::examine_ipv4(std::string & service,
                           struct sockaddr_in * sockaddr,
                           port_t port)
{
    // create socket
    signal(SIGTERM, connect_socket_close);
    m_socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

    // estamblish connection...
    if (connect(m_socket, reinterpret_cast<struct sockaddr *>(sockaddr),
                sizeof(struct sockaddr_in)) < 0) {
        // unable connect to given port
        if (Arg::get_instace().verbose())
            std::cerr << "Warn: Cannot connect to given port: "
                      << std::strerror(errno)
                      << std::endl;

        return false;
    }

    // we are connected, print port
    if (! Arg::get_instace().verbose())
        std::cout << port << std::endl;
    m_established = true;

    bool ret = read_service(service);

    // now we can close the socket
    close_socket();

    return ret;

}
int parse_service(const char *data, int data_len, service_t **dst)
{
	int res = 0;
	xmlDocPtr doc; /* the resulting document tree */

	doc = xmlReadMemory(data, data_len, NULL, NULL, xml_parser_flags);
	if (doc == NULL) {
		ERROR_LOG("can't parse document\n");
		return -1;
	}
	
	res = read_service(xmlDocGetRootElement(doc), dst);

	xmlFreeDoc(doc);
	return res;
}
static int read_rls_services(xmlNode *root, rls_services_t **dst)
{
	/* xmlAttr *a; */
	xmlNode *n;
	service_t *l, *last_l;
	int res = 0;
	
	if (!root) return -1;
	if (!dst) return -1;
	
	if (cmp_node(root, "rls-services", rls_namespace) < 0) {
		ERROR_LOG("document is not a rls-services\n");
		return -1;
	}

	*dst = (rls_services_t*)cds_malloc(sizeof(rls_services_t));
	if (!(*dst)) return -2;
	(*dst)->rls_services = NULL;
	
	last_l = NULL;
	n = root->children;
	while (n) {
		if (n->type == XML_ELEMENT_NODE) {
			if (cmp_node(n, "service", rls_namespace) >= 0) {
				res = read_service(n, &l);
				if (res == 0) {
					if (l) SEQUENCE_ADD((*dst)->rls_services, last_l, l);
				}
				else break;
			}
		}
		n = n->next;
	}

	return res;
}