diff options
-rw-r--r-- | builtin-grep.c | 2 | ||||
-rw-r--r-- | connect.c | 60 | ||||
-rw-r--r-- | daemon.c | 9 | ||||
-rw-r--r-- | http-fetch.c | 1 |
4 files changed, 52 insertions, 20 deletions
diff --git a/builtin-grep.c b/builtin-grep.c index acc4eea363..5fac5701e6 100644 --- a/builtin-grep.c +++ b/builtin-grep.c @@ -459,6 +459,8 @@ static int external_grep(struct grep_opt *opt, const char **paths, int cached) push_arg("-n"); if (opt->regflags & REG_EXTENDED) push_arg("-E"); + if (opt->regflags & REG_ICASE) + push_arg("-i"); if (opt->word_regexp) push_arg("-w"); if (opt->name_only) @@ -322,7 +322,10 @@ static enum protocol get_protocol(const char *name) #ifndef NO_IPV6 -static int git_tcp_connect(int fd[2], const char *prog, char *host, char *path) +/* + * Returns a connected socket() fd, or else die()s. + */ +static int git_tcp_connect_sock(char *host) { int sockfd = -1; char *colon, *end; @@ -356,7 +359,8 @@ static int git_tcp_connect(int fd[2], const char *prog, char *host, char *path) 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); + 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) { @@ -372,15 +376,15 @@ static int git_tcp_connect(int fd[2], const char *prog, char *host, char *path) if (sockfd < 0) die("unable to connect a socket (%s)", strerror(errno)); - fd[0] = sockfd; - fd[1] = sockfd; - packet_write(sockfd, "%s %s\n", prog, path); - return 0; + return sockfd; } #else /* NO_IPV6 */ -static int git_tcp_connect(int fd[2], const char *prog, char *host, char *path) +/* + * Returns a connected socket() fd, or else die()s. + */ +static int git_tcp_connect_sock(char *host) { int sockfd = -1; char *colon, *end; @@ -407,7 +411,6 @@ static int git_tcp_connect(int fd[2], const char *prog, char *host, char *path) port = colon + 1; } - he = gethostbyname(host); if (!he) die("Unable to look up %s (%s)", host, hstrerror(h_errno)); @@ -441,13 +444,21 @@ static int git_tcp_connect(int fd[2], const char *prog, char *host, char *path) if (sockfd < 0) die("unable to connect a socket (%s)", strerror(errno)); + return sockfd; +} + +#endif /* NO_IPV6 */ + + +static void git_tcp_connect(int fd[2], + const char *prog, char *host, char *path) +{ + int sockfd = git_tcp_connect_sock(host); + fd[0] = sockfd; fd[1] = sockfd; - packet_write(sockfd, "%s %s\n", prog, path); - return 0; } -#endif /* NO_IPV6 */ static char *git_proxy_command = NULL; static const char *rhost_name = NULL; @@ -510,7 +521,8 @@ static int git_use_proxy(const char *host) return (git_proxy_command && *git_proxy_command); } -static int git_proxy_connect(int fd[2], const char *prog, char *host, char *path) +static void git_proxy_connect(int fd[2], + const char *prog, char *host, char *path) { char *port = STR(DEFAULT_GIT_PORT); char *colon, *end; @@ -547,12 +559,12 @@ static int git_proxy_connect(int fd[2], const char *prog, char *host, char *path execlp(git_proxy_command, git_proxy_command, host, port, NULL); die("exec failed"); } + if (pid < 0) + die("fork failed"); fd[0] = pipefd[0][0]; fd[1] = pipefd[1][1]; close(pipefd[0][1]); close(pipefd[1][0]); - packet_write(fd[1], "%s %s\n", prog, path); - return pid; } /* @@ -620,14 +632,26 @@ int git_connect(int fd[2], char *url, const char *prog) } if (protocol == PROTO_GIT) { - int ret; + /* These underlying connection commands die() if they + * cannot connect. + */ + char *target_host = strdup(host); if (git_use_proxy(host)) - ret = git_proxy_connect(fd, prog, host, path); + git_proxy_connect(fd, prog, host, path); else - ret = git_tcp_connect(fd, prog, host, path); + git_tcp_connect(fd, prog, host, path); + /* + * Separate original protocol components prog and path + * from extended components with a NUL byte. + */ + packet_write(fd[1], + "%s %s%chost=%s%c", + prog, path, 0, + target_host, 0); + free(target_host); if (free_path) free(path); - return ret; + return 0; } if (pipe(pipefd[0]) < 0 || pipe(pipefd[1]) < 0) @@ -267,12 +267,17 @@ static int upload(char *dir) static int execute(void) { static char line[1000]; - int len; + int pktlen, len; alarm(init_timeout ? init_timeout : timeout); - len = packet_read_line(0, line, sizeof(line)); + pktlen = packet_read_line(0, line, sizeof(line)); alarm(0); + len = strlen(line); + if (pktlen != len) + loginfo("Extended attributes (%d bytes) exist <%.*s>", + (int) pktlen - len, + (int) pktlen - len, line + len + 1); if (len && line[len-1] == '\n') line[--len] = 0; diff --git a/http-fetch.c b/http-fetch.c index 661c909152..d3602b7d7d 100644 --- a/http-fetch.c +++ b/http-fetch.c @@ -399,6 +399,7 @@ void prefetch(unsigned char *sha1) snprintf(newreq->filename, sizeof(newreq->filename), "%s", filename); snprintf(newreq->tmpfile, sizeof(newreq->tmpfile), "%s.temp", filename); + newreq->slot = NULL; newreq->next = NULL; if (object_queue_head == NULL) { |