]> Zhao Yanbai Git Server - minix.git/commitdiff
Select patches for TCP read and write. TCP support for FIONREAD.
authorPhilip Homburg <philip@cs.vu.nl>
Mon, 11 Jul 2005 13:02:59 +0000 (13:02 +0000)
committerPhilip Homburg <philip@cs.vu.nl>
Mon, 11 Jul 2005 13:02:59 +0000 (13:02 +0000)
servers/inet/generic/tcp.c
servers/inet/generic/tcp_int.h
servers/inet/generic/tcp_recv.c
servers/inet/inet.h

index 2add222fe524b8df21f4ccc86a633b7112a82406..8c64d08937e827ec93b13a0358222efee5733d2f 100644 (file)
@@ -706,8 +706,8 @@ ioreq_t req;
        tcp_conn_t *tcp_conn;
        nwio_tcpconf_t *tcp_conf;
        nwio_tcpopt_t *tcp_opt;
-       acc_t *conf_acc, *opt_acc;
-       int result;
+       acc_t *acc, *conf_acc, *opt_acc;
+       int result, *bytesp;
 
        tcp_fd= &tcp_fd_table[fd];
 
@@ -833,6 +833,17 @@ assert (conf_acc->acc_length == sizeof(*tcp_conf));
                reply_thr_get (tcp_fd, NW_OK, TRUE);
                result= NW_OK;
                break;
+       case FIONREAD:
+               acc= bf_memreq(sizeof(*bytesp));
+               bytesp= (int *)ptr2acc_data(acc);
+               tcp_bytesavailable(tcp_fd, bytesp);
+               result= (*tcp_fd->tf_put_userdata)(tcp_fd->tf_srfd,
+                       0, acc, TRUE);
+               tcp_fd->tf_flags &= ~TFF_IOCTL_IP;
+               reply_thr_put(tcp_fd, result, TRUE);
+               result= NW_OK;
+               break;
+
        default:
                tcp_fd->tf_flags &= ~TFF_IOCTL_IP;
                reply_thr_get(tcp_fd, EBADIOCTL, TRUE);
index 8d6f47987d298f5357ed8b119dbf167a9ace4802..154c653a4779989a3288c7068a6b121faceeccb7 100644 (file)
@@ -192,6 +192,7 @@ void tcp_frag2conn ARGS(( tcp_conn_t *tcp_conn, ip_hdr_t *ip_hdr,
 void tcp_fd_read ARGS(( tcp_conn_t *tcp_conn, int enq ));
 unsigned tcp_sel_read ARGS(( tcp_conn_t *tcp_conn ));
 void tcp_rsel_read ARGS(( tcp_conn_t *tcp_conn ));
+void tcp_bytesavailable ARGS(( tcp_fd_t *tcp_fd, int *bytesp ));
 
 /* tcp_send.c */
 void tcp_conn_write ARGS(( tcp_conn_t *tcp_conn, int enq ));
index 0a510bee4a5352a5a554c9566b76da7f3f90b6e3..b009b0a4e6010f3b42130f5ee23f7d20c0f5b149 100644 (file)
@@ -1442,6 +1442,44 @@ tcp_conn_t *tcp_conn;
                printf("tcp_rsel_read: no select_res\n");
 }
 
+PUBLIC void tcp_bytesavailable(tcp_fd, bytesp)
+tcp_fd_t *tcp_fd;
+int *bytesp;
+{
+       tcp_conn_t *tcp_conn;
+       size_t data_size, read_size;
+       acc_t *data;
+       int fin_recv, urg, push, result;
+       i32_t old_window, new_window;
+       u16_t mss;
+
+       *bytesp= 0;     /* The default is that nothing is available */
+
+       if (!(tcp_fd->tf_flags & TFF_CONNECTED))
+               return;
+       tcp_conn= tcp_fd->tf_conn;
+
+       if (tcp_conn->tc_state == TCS_CLOSED)
+               return;
+
+       urg= tcp_Gmod4G(tcp_conn->tc_RCV_UP, tcp_conn->tc_RCV_LO);
+       push= (tcp_conn->tc_flags & TCF_RCV_PUSH);
+       fin_recv= (tcp_conn->tc_flags & TCF_FIN_RECV);
+
+       data_size= tcp_conn->tc_RCV_NXT-tcp_conn->tc_RCV_LO;
+       if (fin_recv)
+               data_size--;
+       if (urg)
+               data_size= tcp_conn->tc_RCV_UP-tcp_conn->tc_RCV_LO;
+
+       if (urg && !(tcp_fd->tf_flags & TFF_RECV_URG))
+               return;
+       else if (!urg && (tcp_fd->tf_flags & TFF_RECV_URG))
+               return;
+
+       *bytesp= data_size;
+}
+
 /*
  * $PchId: tcp_recv.c,v 1.30 2005/06/28 14:21:35 philip Exp $
  */
index 0b1ace85e3b82dd55263a6e8cfbbdf5e5da377bd..3d99d7c0896325aa543b203388495d1858e56675 100644 (file)
@@ -26,6 +26,7 @@ Copyright 1995 Philip Homburg
 #else /* Assume at least Minix 3.x */
 
 #include <unistd.h>
+#include <sys/ioc_file.h>
 #include <sys/time.h>
 #include <minix/config.h>
 #include <minix/type.h>