Commit | Line | Data |
---|---|---|
f7192598 | 1 | #include "cache.h" |
41cb7488 | 2 | #include "pkt-line.h" |
b10d0ec7 | 3 | #include "quote.h" |
f7192598 LT |
4 | #include <sys/wait.h> |
5 | ||
41cb7488 LT |
6 | int get_ack(int fd, unsigned char *result_sha1) |
7 | { | |
8 | static char line[1000]; | |
9 | int len = packet_read_line(fd, line, sizeof(line)); | |
10 | ||
11 | if (!len) | |
12 | die("git-fetch-pack: expected ACK/NAK, got EOF"); | |
13 | if (line[len-1] == '\n') | |
14 | line[--len] = 0; | |
15 | if (!strcmp(line, "NAK")) | |
16 | return 0; | |
17 | if (!strncmp(line, "ACK ", 3)) { | |
18 | if (!get_sha1_hex(line+4, result_sha1)) | |
19 | return 1; | |
20 | } | |
21 | die("git-fetch_pack: expected ACK/NAK, got '%s'", line); | |
22 | } | |
23 | ||
013e7c7f LT |
24 | int path_match(const char *path, int nr, char **match) |
25 | { | |
26 | int i; | |
27 | int pathlen = strlen(path); | |
28 | ||
29 | for (i = 0; i < nr; i++) { | |
30 | char *s = match[i]; | |
31 | int len = strlen(s); | |
32 | ||
33 | if (!len || len > pathlen) | |
34 | continue; | |
35 | if (memcmp(path + pathlen - len, s, len)) | |
36 | continue; | |
37 | if (pathlen > len && path[pathlen - len - 1] != '/') | |
38 | continue; | |
39 | *s = 0; | |
40 | return 1; | |
41 | } | |
42 | return 0; | |
43 | } | |
44 | ||
f7192598 LT |
45 | /* |
46 | * Yeah, yeah, fixme. Need to pass in the heads etc. | |
47 | */ | |
48 | int git_connect(int fd[2], char *url, const char *prog) | |
49 | { | |
50 | char command[1024]; | |
51 | const char *host, *path; | |
52 | char *colon; | |
53 | int pipefd[2][2]; | |
54 | pid_t pid; | |
55 | ||
f7192598 LT |
56 | host = NULL; |
57 | path = url; | |
58 | colon = strchr(url, ':'); | |
59 | if (colon) { | |
60 | *colon = 0; | |
61 | host = url; | |
62 | path = colon+1; | |
63 | } | |
f7192598 LT |
64 | if (pipe(pipefd[0]) < 0 || pipe(pipefd[1]) < 0) |
65 | die("unable to create pipe pair for communication"); | |
66 | pid = fork(); | |
67 | if (!pid) { | |
b10d0ec7 JH |
68 | snprintf(command, sizeof(command), "%s %s", prog, |
69 | sq_quote(path)); | |
f7192598 LT |
70 | dup2(pipefd[1][0], 0); |
71 | dup2(pipefd[0][1], 1); | |
72 | close(pipefd[0][0]); | |
73 | close(pipefd[0][1]); | |
74 | close(pipefd[1][0]); | |
75 | close(pipefd[1][1]); | |
76 | if (host) | |
77 | execlp("ssh", "ssh", host, command, NULL); | |
78 | else | |
79 | execlp("sh", "sh", "-c", command, NULL); | |
80 | die("exec failed"); | |
81 | } | |
82 | fd[0] = pipefd[0][0]; | |
83 | fd[1] = pipefd[1][1]; | |
84 | close(pipefd[0][1]); | |
85 | close(pipefd[1][0]); | |
86 | return pid; | |
87 | } | |
88 | ||
89 | int finish_connect(pid_t pid) | |
90 | { | |
91 | int ret; | |
92 | ||
93 | for (;;) { | |
94 | ret = waitpid(pid, NULL, 0); | |
95 | if (!ret) | |
96 | break; | |
97 | if (errno != EINTR) | |
98 | break; | |
99 | } | |
100 | return ret; | |
101 | } |