mirror of
https://repo.or.cz/socat.git
synced 2025-07-10 06:06:33 +00:00
reworked so-type, so-prototype
This commit is contained in:
parent
b6c2d46008
commit
376b9d50c3
22 changed files with 293 additions and 253 deletions
113
xio-gopen.c
113
xio-gopen.c
|
@ -45,113 +45,17 @@ static int xioopen_gopen(int argc, const char *argv[], struct opt *opts, int xio
|
|||
/* note: when S_ISSOCK was undefined, it always gives 0 */
|
||||
if (exists && S_ISSOCK(st_mode)) {
|
||||
#if WITH_UNIX
|
||||
int socktype = SOCK_STREAM;
|
||||
int optsotype = -1;
|
||||
struct sockaddr_un sa, us;
|
||||
socklen_t salen, uslen = sizeof(us);
|
||||
bool needbind = false;
|
||||
union sockaddr_union us;
|
||||
socklen_t uslen;
|
||||
char infobuff[256];
|
||||
struct opt *opts2;
|
||||
|
||||
socket_un_init(&sa);
|
||||
socket_un_init(&us);
|
||||
|
||||
Info1("\"%s\" is a socket, connecting to it", filename);
|
||||
if (retropt_int(opts, OPT_SO_TYPE, &optsotype) == 0) {
|
||||
socktype = optsotype;
|
||||
|
||||
result =
|
||||
_xioopen_unix_client(&fd->stream, xioflags, groups, 0, opts, filename);
|
||||
if (result < 0) {
|
||||
return result;
|
||||
}
|
||||
|
||||
if (retropt_bind(opts, AF_UNIX, socktype, 0, (struct sockaddr *)&us, &uslen, 0, 0, 0) != STAT_NOACTION) {
|
||||
needbind = true;
|
||||
}
|
||||
|
||||
retropt_bool(opts, OPT_UNLINK_CLOSE, &opt_unlink_close);
|
||||
if (opt_unlink_close) {
|
||||
if ((fd->stream.unlink_close = strdup(filename)) == NULL) {
|
||||
Error1("strdup(\"%s\"): out of memory", filename);
|
||||
}
|
||||
fd->stream.opt_unlink_close = true;
|
||||
}
|
||||
|
||||
/* save options, because we might have to start again with Socket() */
|
||||
opts2 = copyopts(opts, GROUP_ALL);
|
||||
|
||||
if ((fd->stream.fd = Socket(PF_UNIX, socktype, 0)) < 0) {
|
||||
Error2("socket(PF_UNIX, %d, 0): %s", socktype, strerror(errno));
|
||||
return STAT_RETRYLATER;
|
||||
}
|
||||
/*0 Info2("socket(PF_UNIX, %d, 0) -> %d", socktype, fd->stream.fd);*/
|
||||
applyopts(fd->stream.fd, opts, PH_PASTSOCKET);
|
||||
applyopts(fd->stream.fd, opts, PH_FD);
|
||||
|
||||
applyopts_cloexec(fd->stream.fd, opts);
|
||||
|
||||
sa.sun_family = AF_UNIX;
|
||||
salen = xiosetunix(&sa, filename, false, false);
|
||||
|
||||
#if 0
|
||||
applyopts(fd->stream.fd, opts, PH_PREBIND);
|
||||
applyopts(fd->stream.fd, opts, PH_BIND);
|
||||
if (us) {
|
||||
if (Bind(fd->stream.fd, us, uslen) < 0) {
|
||||
Error4("bind(%d, {%s}, "F_Zd"): %s",
|
||||
fd->fd, sockaddr_info(us, infobuff, sizeof(infobuff)),
|
||||
uslen, strerror(errno));
|
||||
if (fd->forever || --fd->retry) {
|
||||
Nanosleep(&fd->intervall, NULL);
|
||||
continue;
|
||||
} else
|
||||
return STAT_RETRYLATER;
|
||||
}
|
||||
}
|
||||
applyopts(fd->stream.fd, opts, PH_PASTBIND);
|
||||
#endif /* 0 */
|
||||
|
||||
applyopts(fd->stream.fd, opts, PH_CONNECT);
|
||||
if ((result = Connect(fd->stream.fd, (struct sockaddr *)&sa, salen)) < 0) {
|
||||
if (errno == EINPROGRESS) {
|
||||
Warn4("connect(%d, %s, "F_Zd"): %s",
|
||||
fd->stream.fd, sockaddr_unix_info(&sa, salen, infobuff, sizeof(infobuff)),
|
||||
sizeof(sa), strerror(errno));
|
||||
} else if (errno == EPROTOTYPE && optsotype != SOCK_STREAM) {
|
||||
Warn4("connect(%d, %s, "F_Zd"): %s",
|
||||
fd->stream.fd, sockaddr_unix_info(&sa, salen, infobuff, sizeof(infobuff)),
|
||||
sizeof(sa), strerror(errno));
|
||||
Info("assuming datagram socket");
|
||||
Close(fd->stream.fd);
|
||||
|
||||
opts = opts2;
|
||||
if ((fd->stream.fd = Socket(PF_UNIX, SOCK_DGRAM, 0)) < 0) {
|
||||
Error1("socket(PF_UNIX, SOCK_DGRAM, 0): %s", strerror(errno));
|
||||
return STAT_RETRYLATER;
|
||||
}
|
||||
/*0 Info1("socket(PF_UNIX, SOCK_DGRAM, 0) -> %d", fd->stream.fd);*/
|
||||
|
||||
applyopts(fd->stream.fd, opts, PH_PASTSOCKET);
|
||||
applyopts(fd->stream.fd, opts, PH_FD);
|
||||
|
||||
applyopts_cloexec(fd->stream.fd, opts);
|
||||
|
||||
sa.sun_family = AF_UNIX;
|
||||
strncpy(sa.sun_path, filename, sizeof(sa.sun_path));
|
||||
|
||||
fd->stream.dtype = XIODATA_RECVFROM;
|
||||
fd->stream.salen = sizeof(sa);
|
||||
memcpy(&fd->stream.peersa.soa, &sa, fd->stream.salen);
|
||||
} else {
|
||||
Error4("connect(%d, %s, "F_Zd"): %s",
|
||||
fd->stream.fd, sockaddr_unix_info(&sa, fd->stream.salen, infobuff, sizeof(infobuff)),
|
||||
sizeof(sa), strerror(errno));
|
||||
return STAT_RETRYLATER;
|
||||
}
|
||||
}
|
||||
if (fd->stream.howtoend == END_UNSPEC) {
|
||||
fd->stream.howtoend = END_SHUTDOWN;
|
||||
}
|
||||
|
||||
applyopts_fchown(fd->stream.fd, opts);
|
||||
applyopts(fd->stream.fd, opts, PH_CONNECTED);
|
||||
applyopts(fd->stream.fd, opts, PH_LATE);
|
||||
applyopts_named(filename, opts, PH_PASTOPEN); /* unlink-late */
|
||||
|
||||
if (Getsockname(fd->stream.fd, (struct sockaddr *)&us, &uslen) < 0) {
|
||||
|
@ -159,7 +63,8 @@ static int xioopen_gopen(int argc, const char *argv[], struct opt *opts, int xio
|
|||
fd->stream.fd, &us, uslen, strerror(errno));
|
||||
} else {
|
||||
Notice1("successfully connected via %s",
|
||||
sockaddr_unix_info(&us, uslen, infobuff, sizeof(infobuff)));
|
||||
sockaddr_unix_info(&us.un, uslen,
|
||||
infobuff, sizeof(infobuff)));
|
||||
}
|
||||
#else
|
||||
Error("\"%s\" is a socket, but UNIX socket support is not compiled in");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue