r9705: r9685@blu: tridge | 2005-08-27 19:43:44 +1000
[bbaumbach/samba-autobuild/.git] / source4 / lib / socket / socket_ipv4.c
index 4f8b1e6dd65292fd796bf1856ada029b15e2da8b..34ae0b2b73ec08e2ffba92c7d8773008e7be0249 100644 (file)
@@ -46,6 +46,8 @@ static NTSTATUS ipv4_init(struct socket_context *sock)
                return map_nt_error_from_unix(errno);
        }
 
+       sock->backend_name = "ipv4";
+
        return NT_STATUS_OK;
 }
 
@@ -111,6 +113,9 @@ static NTSTATUS ipv4_connect(struct socket_context *sock,
        }
 
        srv_ip = interpret_addr2(srv_address);
+       if (!srv_ip.addr) {
+               return NT_STATUS_BAD_NETWORK_NAME;
+       }
 
        ZERO_STRUCT(srv_addr);
 #ifdef HAVE_SOCK_SIN_LEN
@@ -221,6 +226,7 @@ static NTSTATUS ipv4_accept(struct socket_context *sock, struct socket_context *
 
        (*new_sock)->private_data       = NULL;
        (*new_sock)->ops                = sock->ops;
+       (*new_sock)->backend_name       = sock->backend_name;
 
        return NT_STATUS_OK;
 }
@@ -432,6 +438,16 @@ static int ipv4_get_fd(struct socket_context *sock)
        return sock->fd;
 }
 
+static NTSTATUS ipv4_pending(struct socket_context *sock, size_t *npending)
+{
+       int value = 0;
+       if (ioctl(sock->fd, FIONREAD, &value) == 0) {
+               *npending = value;
+               return NT_STATUS_OK;
+       }
+       return map_nt_error_from_unix(errno);
+}
+
 static const struct socket_ops ipv4_ops = {
        .name                   = "ipv4",
        .fn_init                = ipv4_init,
@@ -443,6 +459,7 @@ static const struct socket_ops ipv4_ops = {
        .fn_recvfrom            = ipv4_recvfrom,
        .fn_send                = ipv4_send,
        .fn_sendto              = ipv4_sendto,
+       .fn_pending             = ipv4_pending,
        .fn_close               = ipv4_close,
 
        .fn_set_option          = ipv4_set_option,