1 #include "git-compat-util.h"
 
   6 #include "run-command.h"
 
   9 static char *server_capabilities;
 
  11 static int check_ref(const char *name, int len, unsigned int flags)
 
  16         if (len < 5 || memcmp(name, "refs/", 5))
 
  19         /* Skip the "refs/" part */
 
  23         /* REF_NORMAL means that we don't want the magic fake tag refs */
 
  24         if ((flags & REF_NORMAL) && check_ref_format(name) < 0)
 
  27         /* REF_HEADS means that we want regular branch heads */
 
  28         if ((flags & REF_HEADS) && !memcmp(name, "heads/", 6))
 
  31         /* REF_TAGS means that we want tags */
 
  32         if ((flags & REF_TAGS) && !memcmp(name, "tags/", 5))
 
  35         /* All type bits clear means that we are ok with anything */
 
  36         return !(flags & ~REF_NORMAL);
 
  39 int check_ref_type(const struct ref *ref, int flags)
 
  41         return check_ref(ref->name, strlen(ref->name), flags);
 
  44 static void add_extra_have(struct extra_have_objects *extra, unsigned char *sha1)
 
  46         ALLOC_GROW(extra->array, extra->nr + 1, extra->alloc);
 
  47         hashcpy(&(extra->array[extra->nr][0]), sha1);
 
  52  * Read all the refs from the other end
 
  54 struct ref **get_remote_heads(int in, struct ref **list,
 
  55                               int nr_match, char **match,
 
  57                               struct extra_have_objects *extra_have)
 
  62                 unsigned char old_sha1[20];
 
  63                 static char buffer[1000];
 
  67                 len = packet_read_line(in, buffer, sizeof(buffer));
 
  70                 if (buffer[len-1] == '\n')
 
  73                 if (len > 4 && !prefixcmp(buffer, "ERR "))
 
  74                         die("remote error: %s", buffer + 4);
 
  76                 if (len < 42 || get_sha1_hex(buffer, old_sha1) || buffer[40] != ' ')
 
  77                         die("protocol error: expected sha/ref, got '%s'", buffer);
 
  80                 name_len = strlen(name);
 
  81                 if (len != name_len + 41) {
 
  82                         free(server_capabilities);
 
  83                         server_capabilities = xstrdup(name + name_len + 1);
 
  87                     name_len == 5 && !memcmp(".have", name, 5)) {
 
  88                         add_extra_have(extra_have, old_sha1);
 
  92                 if (!check_ref(name, name_len, flags))
 
  94                 if (nr_match && !path_match(name, nr_match, match))
 
  96                 ref = alloc_ref(buffer + 41);
 
  97                 hashcpy(ref->old_sha1, old_sha1);
 
 104 int server_supports(const char *feature)
 
 106         return server_capabilities &&
 
 107                 strstr(server_capabilities, feature) != NULL;
 
 110 int path_match(const char *path, int nr, char **match)
 
 113         int pathlen = strlen(path);
 
 115         for (i = 0; i < nr; i++) {
 
 119                 if (!len || len > pathlen)
 
 121                 if (memcmp(path + pathlen - len, s, len))
 
 123                 if (pathlen > len && path[pathlen - len - 1] != '/')
 
 137 static enum protocol get_protocol(const char *name)
 
 139         if (!strcmp(name, "ssh"))
 
 141         if (!strcmp(name, "git"))
 
 143         if (!strcmp(name, "git+ssh"))
 
 145         if (!strcmp(name, "ssh+git"))
 
 147         if (!strcmp(name, "file"))
 
 149         die("I don't handle protocol '%s'", name);
 
 153 #define STR(s)  STR_(s)
 
 155 static void get_host_and_port(char **host, const char **port)
 
 159         if (*host[0] == '[') {
 
 160                 end = strchr(*host + 1, ']');
 
 169         colon = strchr(end, ':');
 
 179 static const char *ai_name(const struct addrinfo *ai)
 
 181         static char addr[NI_MAXHOST];
 
 182         if (getnameinfo(ai->ai_addr, ai->ai_addrlen, addr, sizeof(addr), NULL, 0,
 
 183                         NI_NUMERICHOST) != 0)
 
 184                 strcpy(addr, "(unknown)");
 
 190  * Returns a connected socket() fd, or else die()s.
 
 192 static int git_tcp_connect_sock(char *host, int flags)
 
 194         int sockfd = -1, saved_errno = 0;
 
 195         const char *port = STR(DEFAULT_GIT_PORT);
 
 196         struct addrinfo hints, *ai0, *ai;
 
 200         get_host_and_port(&host, &port);
 
 204         memset(&hints, 0, sizeof(hints));
 
 205         hints.ai_socktype = SOCK_STREAM;
 
 206         hints.ai_protocol = IPPROTO_TCP;
 
 208         if (flags & CONNECT_VERBOSE)
 
 209                 fprintf(stderr, "Looking up %s ... ", host);
 
 211         gai = getaddrinfo(host, port, &hints, &ai);
 
 213                 die("Unable to look up %s (port %s) (%s)", host, port, gai_strerror(gai));
 
 215         if (flags & CONNECT_VERBOSE)
 
 216                 fprintf(stderr, "done.\nConnecting to %s (port %s) ... ", host, port);
 
 218         for (ai0 = ai; ai; ai = ai->ai_next) {
 
 219                 sockfd = socket(ai->ai_family,
 
 220                                 ai->ai_socktype, ai->ai_protocol);
 
 225                 if (connect(sockfd, ai->ai_addr, ai->ai_addrlen) < 0) {
 
 227                         fprintf(stderr, "%s[%d: %s]: errno=%s\n",
 
 231                                 strerror(saved_errno));
 
 236                 if (flags & CONNECT_VERBOSE)
 
 237                         fprintf(stderr, "%s ", ai_name(ai));
 
 244                 die("unable to connect a socket (%s)", strerror(saved_errno));
 
 246         if (flags & CONNECT_VERBOSE)
 
 247                 fprintf(stderr, "done.\n");
 
 255  * Returns a connected socket() fd, or else die()s.
 
 257 static int git_tcp_connect_sock(char *host, int flags)
 
 259         int sockfd = -1, saved_errno = 0;
 
 260         const char *port = STR(DEFAULT_GIT_PORT);
 
 263         struct sockaddr_in sa;
 
 268         get_host_and_port(&host, &port);
 
 270         if (flags & CONNECT_VERBOSE)
 
 271                 fprintf(stderr, "Looking up %s ... ", host);
 
 273         he = gethostbyname(host);
 
 275                 die("Unable to look up %s (%s)", host, hstrerror(h_errno));
 
 276         nport = strtoul(port, &ep, 10);
 
 277         if ( ep == port || *ep ) {
 
 279                 struct servent *se = getservbyname(port,"tcp");
 
 281                         die("Unknown port %s", port);
 
 285         if (flags & CONNECT_VERBOSE)
 
 286                 fprintf(stderr, "done.\nConnecting to %s (port %s) ... ", host, port);
 
 288         for (cnt = 0, ap = he->h_addr_list; *ap; ap++, cnt++) {
 
 289                 sockfd = socket(he->h_addrtype, SOCK_STREAM, 0);
 
 295                 memset(&sa, 0, sizeof sa);
 
 296                 sa.sin_family = he->h_addrtype;
 
 297                 sa.sin_port = htons(nport);
 
 298                 memcpy(&sa.sin_addr, *ap, he->h_length);
 
 300                 if (connect(sockfd, (struct sockaddr *)&sa, sizeof sa) < 0) {
 
 302                         fprintf(stderr, "%s[%d: %s]: errno=%s\n",
 
 305                                 inet_ntoa(*(struct in_addr *)&sa.sin_addr),
 
 306                                 strerror(saved_errno));
 
 311                 if (flags & CONNECT_VERBOSE)
 
 312                         fprintf(stderr, "%s ",
 
 313                                 inet_ntoa(*(struct in_addr *)&sa.sin_addr));
 
 318                 die("unable to connect a socket (%s)", strerror(saved_errno));
 
 320         if (flags & CONNECT_VERBOSE)
 
 321                 fprintf(stderr, "done.\n");
 
 329 static void git_tcp_connect(int fd[2], char *host, int flags)
 
 331         int sockfd = git_tcp_connect_sock(host, flags);
 
 338 static char *git_proxy_command;
 
 340 static int git_proxy_command_options(const char *var, const char *value,
 
 343         if (!strcmp(var, "core.gitproxy")) {
 
 347                 const char *rhost_name = cb;
 
 348                 int rhost_len = strlen(rhost_name);
 
 350                 if (git_proxy_command)
 
 353                         return config_error_nonbool(var);
 
 355                  * ;# matches www.kernel.org as well
 
 356                  * gitproxy = netcatter-1 for kernel.org
 
 357                  * gitproxy = netcatter-2 for sample.xz
 
 358                  * gitproxy = netcatter-default
 
 360                 for_pos = strstr(value, " for ");
 
 362                         /* matches everybody */
 
 363                         matchlen = strlen(value);
 
 365                         hostlen = strlen(for_pos + 5);
 
 366                         if (rhost_len < hostlen)
 
 368                         else if (!strncmp(for_pos + 5,
 
 369                                           rhost_name + rhost_len - hostlen,
 
 371                                  ((rhost_len == hostlen) ||
 
 372                                   rhost_name[rhost_len - hostlen -1] == '.'))
 
 373                                 matchlen = for_pos - value;
 
 378                         /* core.gitproxy = none for kernel.org */
 
 380                             !memcmp(value, "none", 4))
 
 382                         git_proxy_command = xmemdupz(value, matchlen);
 
 387         return git_default_config(var, value, cb);
 
 390 static int git_use_proxy(const char *host)
 
 392         git_proxy_command = getenv("GIT_PROXY_COMMAND");
 
 393         git_config(git_proxy_command_options, (void*)host);
 
 394         return (git_proxy_command && *git_proxy_command);
 
 397 static void git_proxy_connect(int fd[2], char *host)
 
 399         const char *port = STR(DEFAULT_GIT_PORT);
 
 401         struct child_process proxy;
 
 403         get_host_and_port(&host, &port);
 
 405         argv[0] = git_proxy_command;
 
 409         memset(&proxy, 0, sizeof(proxy));
 
 413         if (start_command(&proxy))
 
 414                 die("cannot start proxy %s", argv[0]);
 
 415         fd[0] = proxy.out; /* read from proxy stdout */
 
 416         fd[1] = proxy.in;  /* write to proxy stdin */
 
 419 #define MAX_CMD_LEN 1024
 
 421 static char *get_port(char *host)
 
 424         char *p = strchr(host, ':');
 
 427                 long port = strtol(p + 1, &end, 10);
 
 428                 if (end != p + 1 && *end == '\0' && 0 <= port && port < 65536) {
 
 437 static struct child_process no_fork;
 
 440  * This returns a dummy child_process if the transport protocol does not
 
 441  * need fork(2), or a struct child_process object if it does.  Once done,
 
 442  * finish the connection with finish_connect() with the value returned from
 
 443  * this function (it is safe to call finish_connect() with NULL to support
 
 446  * If it returns, the connect is successful; it just dies on errors (this
 
 447  * will hopefully be changed in a libification effort, to return NULL when
 
 448  * the connection failed).
 
 450 struct child_process *git_connect(int fd[2], const char *url_orig,
 
 451                                   const char *prog, int flags)
 
 453         char *url = xstrdup(url_orig);
 
 457         struct child_process *conn;
 
 458         enum protocol protocol = PROTO_LOCAL;
 
 464         /* Without this we cannot rely on waitpid() to tell
 
 465          * what happened to our children.
 
 467         signal(SIGCHLD, SIG_DFL);
 
 469         host = strstr(url, "://");
 
 472                 protocol = get_protocol(url);
 
 481          * Don't do destructive transforms with git:// as that
 
 482          * protocol code does '[]' unwrapping of its own.
 
 484         if (host[0] == '[') {
 
 485                 end = strchr(host + 1, ']');
 
 487                         if (protocol != PROTO_GIT) {
 
 497         path = strchr(end, c);
 
 498         if (path && !has_dos_drive_prefix(end)) {
 
 500                         protocol = PROTO_SSH;
 
 507                 die("No path specified. See 'man git-pull' for valid url syntax");
 
 510          * null-terminate hostname and point path to ~ for URL's like this:
 
 511          *    ssh://host.xz/~user/repo
 
 513         if (protocol != PROTO_LOCAL && host != url) {
 
 526          * Add support for ssh port: ssh://host.xy:<port>/...
 
 528         if (protocol == PROTO_SSH && host != url)
 
 529                 port = get_port(host);
 
 531         if (protocol == PROTO_GIT) {
 
 532                 /* These underlying connection commands die() if they
 
 535                 char *target_host = xstrdup(host);
 
 536                 if (git_use_proxy(host))
 
 537                         git_proxy_connect(fd, host);
 
 539                         git_tcp_connect(fd, host, flags);
 
 541                  * Separate original protocol components prog and path
 
 542                  * from extended host header with a NUL byte.
 
 544                  * Note: Do not add any other headers here!  Doing so
 
 545                  * will cause older git-daemon servers to crash.
 
 558         conn = xcalloc(1, sizeof(*conn));
 
 560         strbuf_init(&cmd, MAX_CMD_LEN);
 
 561         strbuf_addstr(&cmd, prog);
 
 562         strbuf_addch(&cmd, ' ');
 
 563         sq_quote_buf(&cmd, path);
 
 564         if (cmd.len >= MAX_CMD_LEN)
 
 565                 die("command line too long");
 
 567         conn->in = conn->out = -1;
 
 568         conn->argv = arg = xcalloc(7, sizeof(*arg));
 
 569         if (protocol == PROTO_SSH) {
 
 570                 const char *ssh = getenv("GIT_SSH");
 
 571                 int putty = ssh && strcasestr(ssh, "plink");
 
 572                 if (!ssh) ssh = "ssh";
 
 575                 if (putty && !strcasestr(ssh, "tortoiseplink"))
 
 578                         /* P is for PuTTY, p is for OpenSSH */
 
 579                         *arg++ = putty ? "-P" : "-p";
 
 585                 /* remove repo-local variables from the environment */
 
 586                 conn->env = local_repo_env;
 
 592         if (start_command(conn))
 
 593                 die("unable to fork");
 
 595         fd[0] = conn->out; /* read from child's stdout */
 
 596         fd[1] = conn->in;  /* write to child's stdin */
 
 597         strbuf_release(&cmd);
 
 604 int finish_connect(struct child_process *conn)
 
 607         if (!conn || conn == &no_fork)
 
 610         code = finish_command(conn);
 
 616 char *git_getpass(const char *prompt)
 
 619         struct child_process pass;
 
 621         static struct strbuf buffer = STRBUF_INIT;
 
 623         askpass = getenv("GIT_ASKPASS");
 
 625         if (!askpass || !(*askpass))
 
 626                 return getpass(prompt);
 
 632         memset(&pass, 0, sizeof(pass));
 
 636         if (start_command(&pass))
 
 639         strbuf_reset(&buffer);
 
 640         if (strbuf_read(&buffer, pass.out, 20) < 0)
 
 641                 die("failed to read password from %s\n", askpass);
 
 645         if (finish_command(&pass))
 
 648         strbuf_setlen(&buffer, strcspn(buffer.buf, "\r\n"));