Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
李少辉-开发者
git
提交
1efca00a
G
git
项目概览
李少辉-开发者
/
git
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
git
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
1efca00a
编写于
8月 31, 2006
作者:
J
Junio C Hamano
浏览文件
操作
浏览文件
下载
差异文件
Merge early part of branch 'jc/daemon'
上级
0edcb37d
d819e4e6
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
106 addition
and
7 deletion
+106
-7
daemon.c
daemon.c
+106
-7
未找到文件。
daemon.c
浏览文件 @
1efca00a
...
...
@@ -232,13 +232,42 @@ static char *path_ok(char *dir)
return
NULL
;
/* Fallthrough. Deny by default */
}
static
int
upload
(
char
*
dir
)
typedef
int
(
*
daemon_service_fn
)(
void
);
struct
daemon_service
{
const
char
*
name
;
const
char
*
config_name
;
daemon_service_fn
fn
;
int
enabled
;
int
overridable
;
};
static
struct
daemon_service
*
service_looking_at
;
static
int
service_enabled
;
static
int
git_daemon_config
(
const
char
*
var
,
const
char
*
value
)
{
if
(
!
strncmp
(
var
,
"daemon."
,
7
)
&&
!
strcmp
(
var
+
7
,
service_looking_at
->
config_name
))
{
service_enabled
=
git_config_bool
(
var
,
value
);
return
0
;
}
/* we are not interested in parsing any other configuration here */
return
0
;
}
static
int
run_service
(
char
*
dir
,
struct
daemon_service
*
service
)
{
/* Timeout as string */
char
timeout_buf
[
64
];
const
char
*
path
;
int
enabled
=
service
->
enabled
;
loginfo
(
"Request %s for '%s'"
,
service
->
name
,
dir
);
loginfo
(
"Request for '%s'"
,
dir
);
if
(
!
enabled
&&
!
service
->
overridable
)
{
logerror
(
"'%s': service not enabled."
,
service
->
name
);
errno
=
EACCES
;
return
-
1
;
}
if
(
!
(
path
=
path_ok
(
dir
)))
return
-
1
;
...
...
@@ -260,12 +289,34 @@ static int upload(char *dir)
return
-
1
;
}
if
(
service
->
overridable
)
{
service_looking_at
=
service
;
service_enabled
=
-
1
;
git_config
(
git_daemon_config
);
if
(
0
<=
service_enabled
)
enabled
=
service_enabled
;
}
if
(
!
enabled
)
{
logerror
(
"'%s': service not enabled for '%s'"
,
service
->
name
,
path
);
errno
=
EACCES
;
return
-
1
;
}
/*
* We'll ignore SIGTERM from now on, we have a
* good client.
*/
signal
(
SIGTERM
,
SIG_IGN
);
return
service
->
fn
();
}
static
int
upload_pack
(
void
)
{
/* Timeout as string */
char
timeout_buf
[
64
];
snprintf
(
timeout_buf
,
sizeof
timeout_buf
,
"--timeout=%u"
,
timeout
);
/* git-upload-pack only ever reads stuff, so this is safe */
...
...
@@ -273,10 +324,36 @@ static int upload(char *dir)
return
-
1
;
}
static
struct
daemon_service
daemon_service
[]
=
{
{
"upload-pack"
,
"uploadpack"
,
upload_pack
,
1
,
1
},
};
static
void
enable_service
(
const
char
*
name
,
int
ena
)
{
int
i
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
daemon_service
);
i
++
)
{
if
(
!
strcmp
(
daemon_service
[
i
].
name
,
name
))
{
daemon_service
[
i
].
enabled
=
ena
;
return
;
}
}
die
(
"No such service %s"
,
name
);
}
static
void
make_service_overridable
(
const
char
*
name
,
int
ena
)
{
int
i
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
daemon_service
);
i
++
)
{
if
(
!
strcmp
(
daemon_service
[
i
].
name
,
name
))
{
daemon_service
[
i
].
overridable
=
ena
;
return
;
}
}
die
(
"No such service %s"
,
name
);
}
static
int
execute
(
struct
sockaddr
*
addr
)
{
static
char
line
[
1000
];
int
pktlen
,
len
;
int
pktlen
,
len
,
i
;
if
(
addr
)
{
char
addrbuf
[
256
]
=
""
;
...
...
@@ -313,8 +390,14 @@ static int execute(struct sockaddr *addr)
if
(
len
&&
line
[
len
-
1
]
==
'\n'
)
line
[
--
len
]
=
0
;
if
(
!
strncmp
(
"git-upload-pack "
,
line
,
16
))
return
upload
(
line
+
16
);
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
daemon_service
);
i
++
)
{
struct
daemon_service
*
s
=
&
(
daemon_service
[
i
]);
int
namelen
=
strlen
(
s
->
name
);
if
(
!
strncmp
(
"git-"
,
line
,
4
)
&&
!
strncmp
(
s
->
name
,
line
+
4
,
namelen
)
&&
line
[
namelen
+
4
]
==
' '
)
return
run_service
(
line
+
namelen
+
5
,
s
);
}
logerror
(
"Protocol error: '%s'"
,
line
);
return
-
1
;
...
...
@@ -805,6 +888,22 @@ int main(int argc, char **argv)
group_name
=
arg
+
8
;
continue
;
}
if
(
!
strncmp
(
arg
,
"--enable="
,
9
))
{
enable_service
(
arg
+
9
,
1
);
continue
;
}
if
(
!
strncmp
(
arg
,
"--disable="
,
10
))
{
enable_service
(
arg
+
10
,
0
);
continue
;
}
if
(
!
strncmp
(
arg
,
"--enable-override="
,
18
))
{
make_service_overridable
(
arg
+
18
,
1
);
continue
;
}
if
(
!
strncmp
(
arg
,
"--disable-override="
,
19
))
{
make_service_overridable
(
arg
+
19
,
0
);
continue
;
}
if
(
!
strcmp
(
arg
,
"--"
))
{
ok_paths
=
&
argv
[
i
+
1
];
break
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录