git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 1/2] GIT: Try all addresses for given remote name

From
Petr Baudis <pasky@suse.cz>
Date
Jul 22, 2005, 21:09 UTC
Message-ID
<20050722210913.GH11916@pasky.ji.cz>
In-Reply-To
<20050721.091036.01119516.yoshfuji@linux-ipv6.org>

Dear diary, on Thu, Jul 21, 2005 at 03:10:36PM CEST, I got a letter where "YOSHIFUJI Hideaki / ?$B5HF#1QL@" <yoshfuji@linux-ipv6.org> told me that...

> Hello.
Hello,
Show 25 quoted lines
> Try all addresses for given remote name until it succeeds.
> Also supports IPv6.
> 
> Signed-of-by: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>
> 
> diff --git a/connect.c b/connect.c
> --- a/connect.c
> +++ b/connect.c
> @@ -96,42 +96,57 @@ static enum protocol get_protocol(const 
>  	die("I don't handle protocol '%s'", name);
>  }
>  
> -static void lookup_host(const char *host, struct sockaddr *in)
> -{
> -	struct addrinfo *res;
> -	int ret;
> -
> -	ret = getaddrinfo(host, NULL, NULL, &res);
> -	if (ret)
> -		die("Unable to look up %s (%s)", host, gai_strerror(ret));
> -	*in = *res->ai_addr;
> -	freeaddrinfo(res);
> -}
> +#define STR_(s)	# s
> +#define STR(s)	STR_(s)
Uh-huh? Why two macros? Well, why any macros at all?
Show 67 quoted lines
>  static int git_tcp_connect(int fd[2], const char *prog, char *host, char *path)
>  {
> -	struct sockaddr addr;
> -	int port = DEFAULT_GIT_PORT, sockfd;
> -	char *colon;
> -
> -	colon = strchr(host, ':');
> -	if (colon) {
> -		char *end;
> -		unsigned long n = strtoul(colon+1, &end, 0);
> -		if (colon[1] && !*end) {
> -			*colon = 0;
> -			port = n;
> +	int sockfd = -1;
> +	char *colon, *end;
> +	char *port = STR(DEFAULT_GIT_PORT);
> +	struct addrinfo hints, *ai0, *ai;
> +	int gai;
> +
> +	if (host[0] == '[') {
> +		end = strchr(host + 1, ']');
> +		if (end) {
> +			*end = 0;
> +			end++;
> +			host++;
> +		} else
> +			end = host;
> +	} else
> +		end = host;
> +	colon = strchr(end, ':');
> +
> +	if (colon)
> +		port = colon + 1;
> +
> +	memset(&hints, 0, sizeof(hints));
> +	hints.ai_socktype = SOCK_STREAM;
> +	hints.ai_protocol = IPPROTO_TCP;
> +
> +	gai = getaddrinfo(host, port, &hints, &ai);
> +	if (gai)
> +		die("Unable to look up %s (%s)", host, gai_strerror(gai));
> +
> +	for (ai0 = ai; ai; ai = ai->ai_next) {
> +		sockfd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
> +		if (sockfd < 0)
> +			continue;
> +		if (connect(sockfd, ai->ai_addr, ai->ai_addrlen) < 0) {
> +			close(sockfd);
> +			sockfd = -1;
> +			continue;
>  		}
> +		break;
>  	}
>  
> -	lookup_host(host, &addr);
> -	((struct sockaddr_in *)&addr)->sin_port = htons(port);
> +	freeaddrinfo(ai0);
>  
> -	sockfd = socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
>  	if (sockfd < 0)
>  		die("unable to create socket (%s)", strerror(errno));
> -	if (connect(sockfd, (void *)&addr, sizeof(addr)) < 0)
> -		die("unable to connect (%s)", strerror(errno));
> +
>  	fd[0] = sockfd;
>  	fd[1] = sockfd;
>  	packet_write(sockfd, "%s %s\n", prog, path);

You are saying that you were unable to create socket while you just were unable to connect. Not any biggie, but it saves the user the trouble of one strace after being confused by an error message. :-)

-- 
				Petr "Pasky" Baudis
Stuff: http://pasky.or.cz/
If you want the holes in your knowledge showing up try teaching
someone.  -- Alan Cox
Previous: YOSHIFUJI Hideaki / 吉藤英明Next: YOSHIFUJI Hideaki / 吉藤英明
Message 2 of 5 in “GIT: Try all addresses for given remote name”
  1. 1/2 GIT: Try all addresses for given remote nameYOSHIFUJI Hideaki / 吉藤英明, Jul 21, 2005
  2. Petr BaudisJul 22, 2005
  3. YOSHIFUJI Hideaki / 吉藤英明Jul 22, 2005
  4. Petr BaudisJul 22, 2005
  5. Sam RavnborgJul 23, 2005

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.