git

Форк
0
/
remote-fd.c 
84 строки · 1.9 Кб
1
#include "builtin.h"
2
#include "transport.h"
3

4
static const char usage_msg[] =
5
	"git remote-fd <remote> <url>";
6

7
/*
8
 * URL syntax:
9
 *	'fd::<inoutfd>[/<anything>]'		Read/write socket pair
10
 *						<inoutfd>.
11
 *	'fd::<infd>,<outfd>[/<anything>]'	Read pipe <infd> and write
12
 *						pipe <outfd>.
13
 *	[foo] indicates 'foo' is optional. <anything> is any string.
14
 *
15
 * The data output to <outfd>/<inoutfd> should be passed unmolested to
16
 * git-receive-pack/git-upload-pack/git-upload-archive and output of
17
 * git-receive-pack/git-upload-pack/git-upload-archive should be passed
18
 * unmolested to <infd>/<inoutfd>.
19
 *
20
 */
21

22
#define MAXCOMMAND 4096
23

24
static void command_loop(int input_fd, int output_fd)
25
{
26
	char buffer[MAXCOMMAND];
27

28
	while (1) {
29
		size_t i;
30
		if (!fgets(buffer, MAXCOMMAND - 1, stdin)) {
31
			if (ferror(stdin))
32
				die("Input error");
33
			return;
34
		}
35
		/* Strip end of line characters. */
36
		i = strlen(buffer);
37
		while (i > 0 && isspace(buffer[i - 1]))
38
			buffer[--i] = 0;
39

40
		if (!strcmp(buffer, "capabilities")) {
41
			printf("*connect\n\n");
42
			fflush(stdout);
43
		} else if (starts_with(buffer, "connect ")) {
44
			printf("\n");
45
			fflush(stdout);
46
			if (bidirectional_transfer_loop(input_fd,
47
				output_fd))
48
				die("Copying data between file descriptors failed");
49
			return;
50
		} else {
51
			die("Bad command: %s", buffer);
52
		}
53
	}
54
}
55

56
int cmd_remote_fd(int argc, const char **argv, const char *prefix)
57
{
58
	int input_fd = -1;
59
	int output_fd = -1;
60
	char *end;
61

62
	BUG_ON_NON_EMPTY_PREFIX(prefix);
63

64
	if (argc != 3)
65
		usage(usage_msg);
66

67
	input_fd = (int)strtoul(argv[2], &end, 10);
68

69
	if ((end == argv[2]) || (*end != ',' && *end != '/' && *end))
70
		die("Bad URL syntax");
71

72
	if (*end == '/' || !*end) {
73
		output_fd = input_fd;
74
	} else {
75
		char *end2;
76
		output_fd = (int)strtoul(end + 1, &end2, 10);
77

78
		if ((end2 == end + 1) || (*end2 != '/' && *end2))
79
			die("Bad URL syntax");
80
	}
81

82
	command_loop(input_fd, output_fd);
83
	return 0;
84
}
85

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.