REORG/MEDIUM: move protocol->{read,write} to sock_ops

The protocol must not set the read and write callbacks, they're specific
to the socket layer. Move them to sock_ops instead.
diff --git a/src/proto_tcp.c b/src/proto_tcp.c
index 1f0d6dc..f709e73 100644
--- a/src/proto_tcp.c
+++ b/src/proto_tcp.c
@@ -70,8 +70,6 @@
 	.sock_addrlen = sizeof(struct sockaddr_in),
 	.l3_addrlen = 32/8,
 	.accept = &stream_sock_accept,
-	.read = &stream_sock_read,
-	.write = &stream_sock_write,
 	.bind = tcp_bind_listener,
 	.bind_all = tcp_bind_listeners,
 	.unbind_all = unbind_all_listeners,
@@ -90,8 +88,6 @@
 	.sock_addrlen = sizeof(struct sockaddr_in6),
 	.l3_addrlen = 128/8,
 	.accept = &stream_sock_accept,
-	.read = &stream_sock_read,
-	.write = &stream_sock_write,
 	.bind = tcp_bind_listener,
 	.bind_all = tcp_bind_listeners,
 	.unbind_all = unbind_all_listeners,
@@ -446,9 +442,9 @@
 	fdtab[fd].owner = si;
 	fdtab[fd].state = FD_STCONN; /* connection in progress */
 	fdtab[fd].flags = FD_FL_TCP | FD_FL_TCP_NODELAY;
-	fdtab[fd].cb[DIR_RD].f = &stream_sock_read;
+	fdtab[fd].cb[DIR_RD].f = si->sock.read;
 	fdtab[fd].cb[DIR_RD].b = si->ib;
-	fdtab[fd].cb[DIR_WR].f = &stream_sock_write;
+	fdtab[fd].cb[DIR_WR].f = si->sock.write;
 	fdtab[fd].cb[DIR_WR].b = si->ob;
 
 	fdinfo[fd].peeraddr = (struct sockaddr *)&si->addr.to;
diff --git a/src/proto_uxst.c b/src/proto_uxst.c
index 6fb7264..2140ae6 100644
--- a/src/proto_uxst.c
+++ b/src/proto_uxst.c
@@ -56,8 +56,6 @@
 	.sock_addrlen = sizeof(struct sockaddr_un),
 	.l3_addrlen = sizeof(((struct sockaddr_un*)0)->sun_path),/* path len */
 	.accept = &stream_sock_accept,
-	.read = &stream_sock_read,
-	.write = &stream_sock_write,
 	.bind = uxst_bind_listener,
 	.bind_all = uxst_bind_listeners,
 	.unbind_all = uxst_unbind_listeners,
diff --git a/src/session.c b/src/session.c
index fabba1f..96b93b9 100644
--- a/src/session.c
+++ b/src/session.c
@@ -285,9 +285,9 @@
 	fdtab[cfd].owner = &s->si[0];
 	fdtab[cfd].state = FD_STREADY;
 	fdtab[cfd].flags = 0;
-	fdtab[cfd].cb[DIR_RD].f = l->proto->read;
+	fdtab[cfd].cb[DIR_RD].f = s->si[0].sock.read;
 	fdtab[cfd].cb[DIR_RD].b = s->req;
-	fdtab[cfd].cb[DIR_WR].f = l->proto->write;
+	fdtab[cfd].cb[DIR_WR].f = s->si[0].sock.write;
 	fdtab[cfd].cb[DIR_WR].b = s->rep;
 	fdinfo[cfd].peeraddr = (struct sockaddr *)&s->si[0].addr.from;
 	fdinfo[cfd].peerlen  = sizeof(s->si[0].addr.from);
diff --git a/src/stream_interface.c b/src/stream_interface.c
index 2097623..b6188d0 100644
--- a/src/stream_interface.c
+++ b/src/stream_interface.c
@@ -313,6 +313,8 @@
 	si->sock.shutw   = stream_int_shutw;
 	si->sock.chk_rcv = stream_int_chk_rcv;
 	si->sock.chk_snd = stream_int_chk_snd;
+	si->sock.read    = NULL;
+	si->sock.write   = NULL;
 	si->connect = NULL;
 	set_target_applet(&si->target, app);
 	si->applet.state = 0;
@@ -340,6 +342,8 @@
 	si->sock.shutw   = stream_int_shutw;
 	si->sock.chk_rcv = stream_int_chk_rcv;
 	si->sock.chk_snd = stream_int_chk_snd;
+	si->sock.read    = NULL;
+	si->sock.write   = NULL;
 	si->connect = NULL;
 	clear_target(&si->target);
 	si->release   = NULL;
diff --git a/src/stream_sock.c b/src/stream_sock.c
index 3862ac8..a77ad39 100644
--- a/src/stream_sock.c
+++ b/src/stream_sock.c
@@ -1305,6 +1305,8 @@
 	si->sock.shutw   = stream_sock_shutw;
 	si->sock.chk_rcv = stream_sock_chk_rcv;
 	si->sock.chk_snd = stream_sock_chk_snd;
+	si->sock.read    = stream_sock_read;
+	si->sock.write   = stream_sock_write;
 }