lineedit: do not hang on error, but return error indicator.
[oweals/busybox.git] / libbb / xconnect.c
index d8c8d02d527c992c287ade0545225d358455a806..3a6585caa8763aeb473ca6c6e4a7d15eff51b1a2 100644 (file)
@@ -4,9 +4,10 @@
  *
  * Connect to host at port using address resolution from getaddrinfo
  *
- * Licensed under GPLv2, see file LICENSE in this tarball for details.
+ * Licensed under GPLv2, see file LICENSE in this source tree.
  */
 
+#include <sys/types.h>
 #include <sys/socket.h> /* netinet/in.h needs it */
 #include <netinet/in.h>
 #include <net/if.h>
@@ -47,25 +48,35 @@ int FAST_FUNC setsockopt_bindtodevice(int fd UNUSED_PARAM,
 }
 #endif
 
-len_and_sockaddr* FAST_FUNC get_sock_lsa(int fd)
+static len_and_sockaddr* get_lsa(int fd, int (*get_name)(int fd, struct sockaddr *addr, socklen_t *addrlen))
 {
        len_and_sockaddr lsa;
        len_and_sockaddr *lsa_ptr;
 
        lsa.len = LSA_SIZEOF_SA;
-       if (getsockname(fd, &lsa.u.sa, &lsa.len) != 0)
+       if (get_name(fd, &lsa.u.sa, &lsa.len) != 0)
                return NULL;
 
        lsa_ptr = xzalloc(LSA_LEN_SIZE + lsa.len);
        if (lsa.len > LSA_SIZEOF_SA) { /* rarely (if ever) happens */
                lsa_ptr->len = lsa.len;
-               getsockname(fd, &lsa_ptr->u.sa, &lsa_ptr->len);
+               get_name(fd, &lsa_ptr->u.sa, &lsa_ptr->len);
        } else {
                memcpy(lsa_ptr, &lsa, LSA_LEN_SIZE + lsa.len);
        }
        return lsa_ptr;
 }
 
+len_and_sockaddr* FAST_FUNC get_sock_lsa(int fd)
+{
+       return get_lsa(fd, getsockname);
+}
+
+len_and_sockaddr* FAST_FUNC get_peer_lsa(int fd)
+{
+       return get_lsa(fd, getpeername);
+}
+
 void FAST_FUNC xconnect(int s, const struct sockaddr *s_addr, socklen_t addrlen)
 {
        if (connect(s, s_addr, addrlen) < 0) {