]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
Implement unified accept function.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 21 Apr 2014 12:46:18 +0000 (13:46 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 21 Apr 2014 12:46:18 +0000 (13:46 +0100)
src/util.c
src/util.h

index d5a4a19df58ec29e95086d05f75fb15dced68adb..70420037480e6d881adc3f82df3f169f9728da67 100644 (file)
@@ -194,41 +194,6 @@ make_udp_socket (struct addrinfo *addr, gboolean is_server, gboolean async)
        return make_inet_socket (SOCK_DGRAM, addr, is_server, async, NULL);
 }
 
-gint
-accept_from_socket (gint listen_sock, struct sockaddr *addr, socklen_t * len)
-{
-       gint                            nfd;
-       gint                            serrno;
-
-       if ((nfd = accept (listen_sock, addr, len)) == -1) {
-               if (errno == EAGAIN) {
-                       return 0;
-               }
-               msg_warn ("accept failed: %d, '%s'", errno, strerror (errno));
-               return -1;
-       }
-       if (make_socket_nonblocking (nfd) < 0) {
-               goto out;
-       }
-
-       /* Set close on exec */
-       if (fcntl (nfd, F_SETFD, FD_CLOEXEC) == -1) {
-               msg_warn ("fcntl failed: %d, '%s'", errno, strerror (errno));
-               goto out;
-       }
-
-
-
-       return (nfd);
-
-  out:
-       serrno = errno;
-       close (nfd);
-       errno = serrno;
-       return (-1);
-
-}
-
 gint
 make_unix_socket (const gchar *path, struct sockaddr_un *addr, gint type, gboolean is_server, gboolean async)
 {
@@ -2218,6 +2183,41 @@ rspamd_ucl_emit_gstring (ucl_object_t *obj, enum ucl_emitter emit_type, GString
        ucl_object_emit_full (obj, emit_type, &func);
 }
 
+gint
+rspamd_accept_from_socket (gint sock, rspamd_inet_addr_t *addr)
+{
+       gint nfd, serrno;
+       socklen_t len = sizeof (addr->addr.ss);
+
+       if ((nfd = accept (sock, &addr->addr.sa, &len)) == -1) {
+               if (errno == EAGAIN) {
+                       return 0;
+               }
+               return -1;
+       }
+
+       addr->slen = len;
+       addr->af = addr->addr.sa.sa_family;
+
+       if (make_socket_nonblocking (nfd) < 0) {
+               goto out;
+       }
+
+       /* Set close on exec */
+       if (fcntl (nfd, F_SETFD, FD_CLOEXEC) == -1) {
+               msg_warn ("fcntl failed: %d, '%s'", errno, strerror (errno));
+               goto out;
+       }
+
+       return (nfd);
+
+  out:
+       serrno = errno;
+       close (nfd);
+       errno = serrno;
+       return (-1);
+
+}
 /*
  * vi:ts=4
  */
index 972730d04940af9b35284fa052dfe93de4848bc2..32f0dcd8527a595621e20eecc287e22498827591 100644 (file)
@@ -41,10 +41,7 @@ gint make_tcp_socket (struct addrinfo *, gboolean is_server, gboolean async);
  * Create socket and bind or connect it to specified address and port
  */
 gint make_udp_socket (struct addrinfo *, gboolean is_server, gboolean async);
-/*
- * Accept from socket
- */
-gint accept_from_socket (gint listen_sock, struct sockaddr *addr, socklen_t *len);
+
 /*
  * Create and bind or connect unix socket
  */
@@ -461,5 +458,12 @@ gboolean rspamd_ip_is_valid (void *ptr, int af);
  */
 void rspamd_ucl_emit_gstring (ucl_object_t *obj, enum ucl_emitter emit_type, GString *target);
 
+/**
+ * Accept from listening socket filling addr structure
+ * @param sock listening socket
+ * @param addr
+ * @return
+ */
+gint rspamd_accept_from_socket (gint sock, rspamd_inet_addr_t *addr);
 
 #endif