From f6ae716fb826abc0345263dc0ebb98df1cfdd05e Mon Sep 17 00:00:00 2001 From: Clint Adams Date: Tue, 12 Jun 2001 15:57:25 +0000 Subject: 14863: tcp_connect --- ChangeLog | 5 +++++ Src/Modules/tcp.c | 30 ++++++++++++++++++++++++++++-- Src/Modules/zftp.c | 19 +++++-------------- 3 files changed, 38 insertions(+), 16 deletions(-) diff --git a/ChangeLog b/ChangeLog index 026ec09ac..656659aac 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2001-06-12 Clint Adams + + * 14863: Src/Modules/tcp.c, Src/Modules/zftp.c: + introduce tcp_connect. + 2001-06-12 Peter Stephenson * 14858: Doc/Zsh/options.yo, Src/options.c, Src/subst.c, diff --git a/Src/Modules/tcp.c b/Src/Modules/tcp.c index 44a380170..6f7a05cb2 100644 --- a/Src/Modules/tcp.c +++ b/Src/Modules/tcp.c @@ -243,8 +243,34 @@ tcp_cleanup(void) mod_export int tcp_close(Tcp_session sess) { - close(sess->fd); - sess->fd = -1; + if(!close(sess->fd)) + { + sess->fd = -1; + return 0; + } + else return -1; +} + +/**/ +mod_export int +tcp_connect(Tcp_session sess, char *addrp, struct hostent *zhost, int d_port) +{ +#ifdef SUPPORT_IPV6 + if(zhost->h_addrtype==AF_INET6) { + memcpy(&(sess->peer.in6.sin6_addr), addrp, zhost->h_length); + sess->peer.in6.sin6_port = d_port; + sess->peer.in6.sin6_flowinfo = 0; +# ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID + sess->peer.in6.sin6_scope_id = 0; +# endif + } else +#endif /* SUPPORT_IPV6 */ + { + memcpy(&(sess->peer.in.sin_addr), addrp, zhost->h_length); + sess->peer.in.sin_port = d_port; + } + + return connect(sess->fd, (struct sockaddr *)&(sess->peer), zhost->h_length); } /* The load/unload routines required by the zsh library interface */ diff --git a/Src/Modules/zftp.c b/Src/Modules/zftp.c index 5120c6c64..082c19781 100644 --- a/Src/Modules/zftp.c +++ b/Src/Modules/zftp.c @@ -1764,6 +1764,8 @@ zftp_open(char *name, char **args, int flags) /* should use herror() here if available, but maybe * needs configure test. on AIX it's present but not * in headers. + * + * on the other hand, herror() is obsolete */ FAILED(); zwarnnam(name, "host not found: %s", args[0], 0); @@ -1775,16 +1777,10 @@ zftp_open(char *name, char **args, int flags) zfsess->control.peer.a.sa_family = af; #ifdef SUPPORT_IPV6 if(af == AF_INET6) { - zfsess->control.peer.in6.sin6_port = zservp->s_port; - zfsess->control.peer.in6.sin6_flowinfo = 0; -# ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID - zfsess->control.peer.in6.sin6_scope_id = 0; -# endif salen = sizeof(struct sockaddr_in6); } else #endif /* SUPPORT_IPV6 */ { - zfsess->control.peer.in.sin_port = zservp->s_port; salen = sizeof(struct sockaddr_in); } @@ -1809,15 +1805,10 @@ zftp_open(char *name, char **args, int flags) /* try all possible IP's */ for (addrp = zhostp->h_addr_list; err && *addrp; addrp++) { -#ifdef SUPPORT_IPV6 - if(af == AF_INET6) - memcpy(&zfsess->control.peer.in6.sin6_addr, *addrp, zhostp->h_length); - else -#endif /* SUPPORT_IPV6 */ - memcpy(&zfsess->control.peer.in.sin_addr, *addrp, zhostp->h_length); + if(salen != zhostp->h_length) + zwarnnam(name, "address length mismatch", NULL, 0); do { - err = connect(zfsess->control.fd, (struct sockaddr *)&zfsess->control.peer, - salen); + err = tcp_connect(&(zfsess->control), *addrp, zhostp, zservp->s_port); } while (err && errno == EINTR && !errflag); /* you can check whether it's worth retrying here */ } -- cgit 1.4.1