Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
liblongpath-rsync
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
liblongpath
liblongpath-rsync
Commits
9c07d253
Commit
9c07d253
authored
Jan 02, 2004
by
Wayne Davison
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Tidied up a few things in preparation for changes.
parent
7352b873
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
83 additions
and
78 deletions
+83
-78
socket.c
socket.c
+83
-78
No files found.
socket.c
View file @
9c07d253
...
...
@@ -44,13 +44,13 @@ static int establish_proxy_connection(int fd, char *host, int port)
char
*
cp
;
snprintf
(
buffer
,
sizeof
(
buffer
),
"CONNECT %s:%d HTTP/1.0
\r\n\r\n
"
,
host
,
port
);
if
(
write
(
fd
,
buffer
,
strlen
(
buffer
))
!=
(
int
)
strlen
(
buffer
))
{
if
(
write
(
fd
,
buffer
,
strlen
(
buffer
))
!=
(
int
)
strlen
(
buffer
))
{
rprintf
(
FERROR
,
"failed to write to proxy: %s
\n
"
,
strerror
(
errno
));
return
-
1
;
}
for
(
cp
=
buffer
;
cp
<
&
buffer
[
sizeof
(
buffer
)
-
1
];
cp
++
)
{
for
(
cp
=
buffer
;
cp
<
&
buffer
[
sizeof
(
buffer
)
-
1
];
cp
++
)
{
if
(
read
(
fd
,
cp
,
1
)
!=
1
)
{
rprintf
(
FERROR
,
"failed to read from proxy: %s
\n
"
,
strerror
(
errno
));
...
...
@@ -70,8 +70,7 @@ static int establish_proxy_connection(int fd, char *host, int port)
buffer
);
return
-
1
;
}
for
(
cp
=
&
buffer
[
5
];
isdigit
(
*
(
unsigned
char
*
)
cp
)
||
(
*
cp
==
'.'
);
cp
++
)
;
for
(
cp
=
&
buffer
[
5
];
isdigit
(
*
(
uchar
*
)
cp
)
||
*
cp
==
'.'
;
cp
++
)
{}
while
(
*
cp
==
' '
)
cp
++
;
if
(
*
cp
!=
'2'
)
{
...
...
@@ -81,7 +80,7 @@ static int establish_proxy_connection(int fd, char *host, int port)
}
/* throw away the rest of the HTTP header */
while
(
1
)
{
for
(
cp
=
buffer
;
cp
<
&
buffer
[
sizeof
(
buffer
)
-
1
];
for
(
cp
=
buffer
;
cp
<
&
buffer
[
sizeof
(
buffer
)
-
1
];
cp
++
)
{
if
(
read
(
fd
,
cp
,
1
)
!=
1
)
{
rprintf
(
FERROR
,
"failed to read from proxy: %s
\n
"
,
...
...
@@ -91,9 +90,9 @@ static int establish_proxy_connection(int fd, char *host, int port)
if
(
*
cp
==
'\n'
)
break
;
}
if
(
(
cp
>
buffer
)
&&
(
*
cp
==
'\n'
)
)
if
(
cp
>
buffer
&&
*
cp
==
'\n'
)
cp
--
;
if
(
(
cp
==
buffer
)
&&
((
*
cp
==
'\n'
)
||
(
*
cp
==
'\r'
)
))
if
(
cp
==
buffer
&&
(
*
cp
==
'\n'
||
*
cp
==
'\r'
))
break
;
}
return
0
;
...
...
@@ -173,7 +172,7 @@ int open_socket_out(char *host, int port, const char *bind_address,
* connetcion via a web proxy at the given address. The format
* is hostname:port */
h
=
getenv
(
"RSYNC_PROXY"
);
proxied
=
(
h
!=
NULL
)
&&
(
*
h
!=
'\0'
)
;
proxied
=
h
!=
NULL
&&
*
h
!=
'\0'
;
if
(
proxied
)
{
strlcpy
(
buffer
,
h
,
sizeof
(
buffer
));
...
...
@@ -258,18 +257,14 @@ int open_socket_out(char *host, int port, const char *bind_address,
*
* @param bind_address Local address to use. Normally NULL to get the stack default.
**/
int
open_socket_out_wrapped
(
char
*
host
,
int
port
,
const
char
*
bind_address
,
int
open_socket_out_wrapped
(
char
*
host
,
int
port
,
const
char
*
bind_address
,
int
af_hint
)
{
char
*
prog
;
if
((
prog
=
getenv
(
"RSYNC_CONNECT_PROG"
))
!=
NULL
)
return
sock_exec
(
prog
);
else
return
open_socket_out
(
host
,
port
,
bind_address
,
af_hint
);
if
((
prog
=
getenv
(
"RSYNC_CONNECT_PROG"
))
!=
NULL
)
return
sock_exec
(
prog
);
return
open_socket_out
(
host
,
port
,
bind_address
,
af_hint
);
}
...
...
@@ -370,7 +365,7 @@ int is_a_socket(int fd)
* also has socklen_t [*]. See also accept(2).''
*
* We now return to your regularly scheduled programming. */
return
(
getsockopt
(
fd
,
SOL_SOCKET
,
SO_TYPE
,
(
char
*
)
&
v
,
&
l
)
==
0
)
;
return
getsockopt
(
fd
,
SOL_SOCKET
,
SO_TYPE
,
(
char
*
)
&
v
,
&
l
)
==
0
;
}
...
...
@@ -418,15 +413,16 @@ void start_accept_loop(int port, int (*fn)(int, int))
FD_ZERO
(
&
fds
);
FD_SET
(
s
,
&
fds
);
if
(
select
(
s
+
1
,
&
fds
,
NULL
,
NULL
,
NULL
)
!=
1
)
{
if
(
select
(
s
+
1
,
&
fds
,
NULL
,
NULL
,
NULL
)
!=
1
)
continue
;
}
if
(
!
FD_ISSET
(
s
,
&
fds
))
continue
;
if
(
!
FD_ISSET
(
s
,
&
fds
))
continue
;
fd
=
accept
(
s
,(
struct
sockaddr
*
)
&
addr
,
&
addrlen
);
if
(
fd
==
-
1
)
continue
;
if
(
fd
==
-
1
)
continue
;
signal
(
SIGCHLD
,
sigchld_handler
);
...
...
@@ -507,13 +503,16 @@ struct
void
set_socket_options
(
int
fd
,
char
*
options
)
{
char
*
tok
;
if
(
!
options
||
!*
options
)
return
;
if
(
!
options
||
!*
options
)
return
;
options
=
strdup
(
options
);
if
(
!
options
)
out_of_memory
(
"set_socket_options"
);
if
(
!
options
)
out_of_memory
(
"set_socket_options"
);
for
(
tok
=
strtok
(
options
,
"
\t
,"
);
tok
;
tok
=
strtok
(
NULL
,
"
\t
,"
))
{
for
(
tok
=
strtok
(
options
,
"
\t
,"
);
tok
;
tok
=
strtok
(
NULL
,
"
\t
,"
))
{
int
ret
=
0
,
i
;
int
value
=
1
;
char
*
p
;
...
...
@@ -525,9 +524,10 @@ void set_socket_options(int fd, char *options)
got_value
=
1
;
}
for
(
i
=
0
;
socket_options
[
i
].
name
;
i
++
)
for
(
i
=
0
;
socket_options
[
i
].
name
;
i
++
)
{
if
(
strcmp
(
socket_options
[
i
].
name
,
tok
)
==
0
)
break
;
}
if
(
!
socket_options
[
i
].
name
)
{
rprintf
(
FERROR
,
"Unknown socket option %s
\n
"
,
tok
);
...
...
@@ -579,14 +579,14 @@ void become_daemon(void)
#ifdef TIOCNOTTY
i
=
open
(
"/dev/tty"
,
O_RDWR
);
if
(
i
>=
0
)
{
ioctl
(
i
,
(
int
)
TIOCNOTTY
,
(
char
*
)
0
);
ioctl
(
i
,
(
int
)
TIOCNOTTY
,
(
char
*
)
0
);
close
(
i
);
}
#endif
/* TIOCNOTTY */
#endif
/* make sure that stdin, stdout an stderr don't stuff things
up (library functions, for example) */
for
(
i
=
0
;
i
<
3
;
i
++
)
{
for
(
i
=
0
;
i
<
3
;
i
++
)
{
close
(
i
);
open
(
"/dev/null"
,
O_RDWR
);
}
...
...
@@ -614,7 +614,8 @@ static int socketpair_tcp(int fd[2])
memset
(
&
sock
,
0
,
sizeof
(
sock
));
if
((
listener
=
socket
(
PF_INET
,
SOCK_STREAM
,
0
))
==
-
1
)
goto
failed
;
if
((
listener
=
socket
(
PF_INET
,
SOCK_STREAM
,
0
))
==
-
1
)
goto
failed
;
memset
(
&
sock2
,
0
,
sizeof
(
sock2
));
#ifdef HAVE_SOCKADDR_LEN
...
...
@@ -624,39 +625,47 @@ static int socketpair_tcp(int fd[2])
bind
(
listener
,
(
struct
sockaddr
*
)
&
sock2
,
sizeof
(
sock2
));
if
(
listen
(
listener
,
1
)
!=
0
)
goto
failed
;
if
(
listen
(
listener
,
1
)
!=
0
)
goto
failed
;
if
(
getsockname
(
listener
,
(
struct
sockaddr
*
)
&
sock
,
&
socklen
)
!=
0
)
goto
failed
;
if
(
getsockname
(
listener
,
(
struct
sockaddr
*
)
&
sock
,
&
socklen
)
!=
0
)
goto
failed
;
if
((
fd
[
1
]
=
socket
(
PF_INET
,
SOCK_STREAM
,
0
))
==
-
1
)
goto
failed
;
if
((
fd
[
1
]
=
socket
(
PF_INET
,
SOCK_STREAM
,
0
))
==
-
1
)
goto
failed
;
set_nonblocking
(
fd
[
1
]);
sock
.
sin_addr
.
s_addr
=
htonl
(
INADDR_LOOPBACK
);
if
(
connect
(
fd
[
1
],(
struct
sockaddr
*
)
&
sock
,
sizeof
(
sock
))
==
-
1
)
{
if
(
errno
!=
EINPROGRESS
)
goto
failed
;
}
else
{
if
(
errno
!=
EINPROGRESS
)
goto
failed
;
}
else
connect_done
=
1
;
}
if
((
fd
[
0
]
=
accept
(
listener
,
(
struct
sockaddr
*
)
&
sock
,
&
socklen
))
==
-
1
)
goto
failed
;
if
((
fd
[
0
]
=
accept
(
listener
,
(
struct
sockaddr
*
)
&
sock
,
&
socklen
))
==
-
1
)
goto
failed
;
close
(
listener
);
if
(
connect_done
==
0
)
{
if
(
connect
(
fd
[
1
],(
struct
sockaddr
*
)
&
sock
,
sizeof
(
sock
))
!=
0
&&
errno
!=
EISCONN
)
goto
failed
;
&&
errno
!=
EISCONN
)
goto
failed
;
}
set_blocking
(
fd
[
1
]);
set_blocking
(
fd
[
1
]);
/* all OK! */
return
0
;
failed:
if
(
fd
[
0
]
!=
-
1
)
close
(
fd
[
0
]);
if
(
fd
[
1
]
!=
-
1
)
close
(
fd
[
1
]);
if
(
listener
!=
-
1
)
close
(
listener
);
if
(
fd
[
0
]
!=
-
1
)
close
(
fd
[
0
]);
if
(
fd
[
1
]
!=
-
1
)
close
(
fd
[
1
]);
if
(
listener
!=
-
1
)
close
(
listener
);
return
-
1
;
}
...
...
@@ -676,8 +685,7 @@ int sock_exec(const char *prog)
int
fd
[
2
];
if
(
socketpair_tcp
(
fd
)
!=
0
)
{
rprintf
(
FERROR
,
RSYNC_NAME
": socketpair_tcp failed (%s)
\n
"
,
rprintf
(
FERROR
,
RSYNC_NAME
": socketpair_tcp failed (%s)
\n
"
,
strerror
(
errno
));
return
-
1
;
}
...
...
@@ -689,15 +697,12 @@ int sock_exec(const char *prog)
dup
(
fd
[
1
]);
if
(
verbose
>
3
)
{
/* Can't use rprintf because we've forked. */
fprintf
(
stderr
,
fprintf
(
stderr
,
RSYNC_NAME
": execute socket program
\"
%s
\"\n
"
,
prog
);
}
exit
(
system
(
prog
));
exit
(
system
(
prog
));
}
close
(
fd
[
1
]);
close
(
fd
[
1
]);
return
fd
[
0
];
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment