int session_connect (SESSION * session) { struct sockaddr_in sin; char host[1025 + 1], *service_list, *service; int port; /* Lookup service hosts in DNS */ service_list = dns_srv_list ("_spotify-client._tcp.spotify.com"); if (!service_list) { DSFYDEBUG("service lookup failed. falling back to ap.spotify.com\n"); service_list = malloc(200); strcpy(service_list, "ap.spotify.com:4070\n"); } for (service = service_list; *service;) { if (sscanf (service, "%[^:]:%d\n", host, &port) != 2) return -1; service += strlen (host) + 7; DSFYDEBUG ("session_connect(): Connecting to %s:%d\n", host, port); memset (&sin, 0, sizeof (sin)); sin.sin_family = PF_INET; sin.sin_port = htons (port); sin.sin_addr.s_addr = dns_resolve_name (host); if (sin.sin_addr.s_addr == INADDR_NONE) continue; session->ap_sock = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP); if (connect (session->ap_sock, (struct sockaddr *) &sin, sizeof (sin)) != -1) break; sock_close (session->ap_sock); session->ap_sock = -1; } free (service_list); if (sin.sin_addr.s_addr == INADDR_NONE) return -1; /* * Save for later use in ConnectionInfo message * (too lazy to do getpeername() later ;) */ DSFYstrncpy (session->server_host, host, sizeof session->server_host); session->server_port = port; DSFYstrncpy (session->user_info.server_host, host, sizeof session->user_info.server_host); session->user_info.server_port = port; return 0; }
int session_connect (SESSION * session) { struct addrinfo h, *airoot, *ai; char host[1025 + 1], port[6], *service_list, *service; /* Lookup service hosts in DNS */ service_list = dns_srv_list ("_spotify-client._tcp.spotify.com"); if (!service_list) { DSFYDEBUG ("Service lookup failed. falling back to ap.spotify.com\n"); service_list = malloc(200); strcpy (service_list, "ap.spotify.com:4070\n"); } for (service = service_list; *service;) { if (sscanf (service, "%[^:]:%5s\n", host, port) != 2) return -1; service += strlen (host) + 7; DSFYDEBUG ("Connecting to %s:%s\n", host, port); memset(&h, 0, sizeof(h)); h.ai_family = PF_UNSPEC; h.ai_socktype = SOCK_STREAM; h.ai_protocol = IPPROTO_TCP; if (getaddrinfo (host, port, &h, &airoot)) { DSFYDEBUG ("getaddrinfo(%s,%s) failed with error %d\n", host, port, errno); continue; } for(ai = airoot; ai; ai = ai->ai_next) { if (ai->ai_family != AF_INET && ai->ai_family != AF_INET6) continue; session->ap_sock = socket (ai->ai_family, ai->ai_socktype, ai->ai_protocol); if (session->ap_sock < 0) continue; if (connect (session->ap_sock, (struct sockaddr *) ai->ai_addr, ai->ai_addrlen) != -1) break; sock_close (session->ap_sock); session->ap_sock = -1; } freeaddrinfo (airoot); if (session->ap_sock != -1) break; } free (service_list); if (session->ap_sock == -1) return -1; /* * Save for later use in ConnectionInfo message * (too lazy to do getpeername() later ;) */ DSFYstrncpy (session->server_host, host, sizeof session->server_host); session->server_port = atoi(port); DSFYstrncpy (session->user_info.server_host, host, sizeof session->user_info.server_host); session->user_info.server_port = atoi(port); return 0; }