Commit 5091313d authored by Pascal Bleser's avatar Pascal Bleser Committed by Birte Kristina Friesel
Browse files

imlib.c: Use getaddrinfo in builtin http client, enables IPv6 support

parent fc0978a2
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -138,7 +138,6 @@ void real_loadables_mode(int loadable);
void feh_reload_image(winwidget w, int resize, int force_new);
void feh_filelist_image_remove(winwidget winwid, char do_delete);
char *feh_strip_hostname(char *url);
struct hostent *feh_gethostbyname(const char *name);
void slideshow_save_image(winwidget win);
void feh_edit_inplace_orient(winwidget w, int orientation);
void feh_edit_inplace_lossless_rotate(winwidget w, int orientation);
+20 −32
Original line number Diff line number Diff line
@@ -262,8 +262,8 @@ char *feh_http_load_image(char *url)
		int sockno = 0;
		int size;
		int body = SAW_NONE;
		struct sockaddr_in addr;
		struct hostent *hptr;
		struct addrinfo hints;
		struct addrinfo *result, *rp;
		char *hostname;
		char *get_string;
		char *host_string;
@@ -293,7 +293,12 @@ char *feh_http_load_image(char *url)

		D(("trying hostname %s\n", hostname));

		if (!(hptr = feh_gethostbyname(hostname))) {
		memset(&hints, 0, sizeof(struct addrinfo));
		hints.ai_family = AF_UNSPEC;
		hints.ai_socktype = SOCK_STREAM;
		hints.ai_flags = AI_NUMERICSERV;
		hints.ai_protocol = 0;
		if (getaddrinfo(hostname, "80", &hints, &result) != 0) {
			weprintf("error resolving host %s:", hostname);
			fclose(fp);
			unlink(tmpname);
@@ -301,30 +306,26 @@ char *feh_http_load_image(char *url)
			free(tmpname);
			return(NULL);
		}

		/* Copy the address of the host to socket description. */
		memcpy(&addr.sin_addr, hptr->h_addr, hptr->h_length);

		/* Set port and protocol */
		addr.sin_family = AF_INET;
		addr.sin_port = htons(80);

		if ((sockno = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
			weprintf("error opening socket:");
			fclose(fp);
			unlink(tmpname);
			free(tmpname);
			free(hostname);
			return(NULL);
		for (rp = result; rp != NULL; rp = rp->ai_next) {
			sockno = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
			if (sockno == -1) {
				continue;
			}
		if (connect(sockno, (struct sockaddr *) &addr, sizeof(addr)) == -1) {
			if (connect(sockno, rp->ai_addr, rp->ai_addrlen) != -1) {
				break;
			}
			close(sockno);
		}
		if (rp == NULL) {
			weprintf("error connecting socket:");
			freeaddrinfo(result);
			fclose(fp);
			unlink(tmpname);
			free(tmpname);
			free(hostname);
			return(NULL);
		}
		freeaddrinfo(result);

		get_url = strchr(url, '/') + 2;
		get_url = strchr(get_url, '/');
@@ -468,19 +469,6 @@ char *feh_http_load_image(char *url)
	return(tmpname);
}

struct hostent *feh_gethostbyname(const char *name)
{
	struct hostent *hp;
	unsigned long addr;

	addr = (unsigned long) inet_addr(name);
	if ((int) addr != -1)
		hp = gethostbyaddr((char *) &addr, sizeof(addr), AF_INET);
	else
		hp = gethostbyname(name);
	return(hp);
}

char *feh_strip_hostname(char *url)
{
	char *ret;