Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
李少辉-开发者
git
提交
6573faff
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,发现更多精彩内容 >>
提交
6573faff
编写于
9月 28, 2005
作者:
P
Peter Anvin
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
NO_IPV6 support for git daemon
上级
918e7232
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
77 addition
and
18 deletion
+77
-18
Makefile
Makefile
+1
-1
connect.c
connect.c
+1
-1
daemon.c
daemon.c
+75
-16
未找到文件。
Makefile
浏览文件 @
6573faff
...
...
@@ -239,7 +239,7 @@ ifdef NO_STRCASESTR
LIB_OBJS
+=
compat/strcasestr.o
endif
ifdef
NO_IPV6
DEFINES
+=
-DNO_IPV6
DEFINES
+=
-DNO_IPV6
-Dsockaddr_storage
=
sockaddr_in
endif
ifdef
PPC_SHA1
...
...
connect.c
浏览文件 @
6573faff
...
...
@@ -397,7 +397,7 @@ static int git_tcp_connect(int fd[2], const char *prog, char *host, char *path)
memset
(
&
sa
,
0
,
sizeof
sa
);
sa
.
sin_family
=
he
->
h_addrtype
;
sa
.
sin_port
=
nport
;
sa
.
sin_port
=
htons
(
nport
)
;
memcpy
(
&
sa
.
sin_addr
,
ap
,
he
->
h_length
);
if
(
connect
(
sockfd
,
(
struct
sockaddr
*
)
&
sa
,
sizeof
sa
)
<
0
)
{
...
...
daemon.c
浏览文件 @
6573faff
#include "cache.h"
#include "pkt-line.h"
#include <alloca.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/poll.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
...
...
@@ -328,6 +330,7 @@ static void handle(int incoming, struct sockaddr *addr, int addrlen)
inet_ntop
(
AF_INET
,
&
sin_addr
->
sin_addr
,
addrbuf
,
sizeof
(
addrbuf
));
port
=
sin_addr
->
sin_port
;
#ifndef NO_IPV6
}
else
if
(
addr
->
sa_family
==
AF_INET6
)
{
struct
sockaddr_in6
*
sin6_addr
=
(
void
*
)
addr
;
...
...
@@ -337,6 +340,7 @@ static void handle(int incoming, struct sockaddr *addr, int addrlen)
strcat
(
buf
,
"]"
);
port
=
sin6_addr
->
sin6_port
;
#endif
}
loginfo
(
"Connection from %s:%d"
,
addrbuf
,
port
);
...
...
@@ -369,16 +373,17 @@ static void child_handler(int signo)
}
}
static
int
serve
(
int
port
)
#ifndef NO_IPV6
static
int
socksetup
(
int
port
,
int
**
socklist_p
)
{
struct
addrinfo
hints
,
*
ai0
,
*
ai
;
int
gai
;
int
socknum
=
0
,
*
socklist
=
NULL
;
int
maxfd
=
-
1
;
fd_set
fds_init
,
fds
;
char
pbuf
[
NI_MAXSERV
];
signal
(
SIGCHLD
,
child_handler
);
struct
addrinfo
hints
,
*
ai0
,
*
ai
;
int
gai
;
sprintf
(
pbuf
,
"%d"
,
port
);
memset
(
&
hints
,
0
,
sizeof
(
hints
));
...
...
@@ -438,16 +443,59 @@ static int serve(int port)
freeaddrinfo
(
ai0
);
if
(
socknum
==
0
)
die
(
"unable to allocate any listen sockets on port %u"
,
port
);
*
socklist_p
=
socklist
;
return
socknum
;
}
#else
/* NO_IPV6 */
static
int
socksetup
(
int
port
,
int
**
socklist_p
)
{
struct
sockaddr_in
sin
;
int
sockfd
;
sockfd
=
socket
(
AF_INET
,
SOCK_STREAM
,
0
);
if
(
sockfd
<
0
)
return
0
;
memset
(
&
sin
,
0
,
sizeof
sin
);
sin
.
sin_family
=
AF_INET
;
sin
.
sin_addr
.
s_addr
=
htonl
(
INADDR_ANY
);
sin
.
sin_port
=
htons
(
port
);
if
(
bind
(
sockfd
,
(
struct
sockaddr
*
)
&
sin
,
sizeof
sin
)
<
0
)
{
close
(
sockfd
);
return
0
;
}
*
socklist_p
=
malloc
(
sizeof
(
int
));
if
(
!*
socklist_p
)
die
(
"memory allocation failed: %s"
,
strerror
(
errno
));
**
socklist_p
=
sockfd
;
}
#endif
static
int
service_loop
(
int
socknum
,
int
*
socklist
)
{
struct
pollfd
*
pfd
;
int
i
;
pfd
=
calloc
(
socknum
,
sizeof
(
struct
pollfd
));
if
(
!
pfd
)
die
(
"memory allocation failed: %s"
,
strerror
(
errno
));
for
(
i
=
0
;
i
<
socknum
;
i
++
)
{
pfd
[
i
].
fd
=
socklist
[
i
];
pfd
[
i
].
events
=
POLLIN
;
}
for
(;;)
{
int
i
;
fds
=
fds_init
;
if
(
select
(
maxfd
+
1
,
&
fds
,
NULL
,
NULL
,
NULL
)
<
0
)
{
if
(
poll
(
pfd
,
socknum
,
0
)
<
0
)
{
if
(
errno
!=
EINTR
)
{
error
(
"
select
failed, resuming: %s"
,
error
(
"
poll
failed, resuming: %s"
,
strerror
(
errno
));
sleep
(
1
);
}
...
...
@@ -455,12 +503,10 @@ static int serve(int port)
}
for
(
i
=
0
;
i
<
socknum
;
i
++
)
{
int
sockfd
=
socklist
[
i
];
if
(
FD_ISSET
(
sockfd
,
&
fds
))
{
if
(
pfd
[
i
].
revents
&
POLLIN
)
{
struct
sockaddr_storage
ss
;
int
sslen
=
sizeof
(
ss
);
int
incoming
=
accept
(
sock
fd
,
(
struct
sockaddr
*
)
&
ss
,
&
sslen
);
int
incoming
=
accept
(
pfd
[
i
].
fd
,
(
struct
sockaddr
*
)
&
ss
,
&
sslen
);
if
(
incoming
<
0
)
{
switch
(
errno
)
{
case
EAGAIN
:
...
...
@@ -477,6 +523,19 @@ static int serve(int port)
}
}
static
int
serve
(
int
port
)
{
int
socknum
,
*
socklist
;
signal
(
SIGCHLD
,
child_handler
);
socknum
=
socksetup
(
port
,
&
socklist
);
if
(
socknum
==
0
)
die
(
"unable to allocate any listen sockets on port %u"
,
port
);
return
service_loop
(
socknum
,
socklist
);
}
int
main
(
int
argc
,
char
**
argv
)
{
int
port
=
DEFAULT_GIT_PORT
;
...
...
@@ -526,7 +585,7 @@ int main(int argc, char **argv)
if
(
inetd_mode
)
{
fclose
(
stderr
);
//FIXME: workaround
return
execute
();
}
else
{
return
serve
(
port
);
}
return
serve
(
port
);
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录