chiark / gitweb /
actually clean out unwanted file handlers; docuemtn -reverse options in right place
[chiark-tcl.git] / dgram / dgram.c
index b2661a4fe82611792a359e02fb25a12ee3c713ff..63d3b2923731552f72da76694a2fc35a030afce8 100644 (file)
@@ -21,8 +21,6 @@ typedef struct DgramSocket {
   int addr_buflen, msg_buflen;
 } DgramSocket;
 
-IdDataTable dgram_socks= { "dgramsock" };
-
 int do_dgram_socket_create(ClientData cd, Tcl_Interp *ip,
                           SockAddr_Value local, void **sock_r) {
   int fd, al, r;
@@ -144,7 +142,7 @@ int do_dgram_socket_on_receive(ClientData cd, Tcl_Interp *ip,
   cancel(sock);
   
   if (newscript) {
-    rc= scriptinv_set(&sock->script, ip, newscript);
+    rc= scriptinv_set(&sock->script, ip, newscript, 0);
     if (rc) return rc;
   }
   
@@ -152,15 +150,24 @@ int do_dgram_socket_on_receive(ClientData cd, Tcl_Interp *ip,
   return TCL_OK;
 }
 
-int do_dgram_socket_close(ClientData cd, Tcl_Interp *ip, void *sock_v) {
-  DgramSocket *sock= sock_v;
-  int sockix;
+static void destroy(DgramSocket *sock) {
   cancel(sock);
   close(sock->fd); /* nothing useful to be done with errors */
-  sockix= sock->ix;
   TFREE(sock->addr_buf);
   TFREE(sock->msg_buf);
   TFREE(sock);
-  dgram_socks.a[sockix]= 0;
+}
+
+static void destroy_idtabcb(Tcl_Interp *ip, void *sock_v) {
+  destroy(sock_v);
+}
+
+int do_dgram_socket_close(ClientData cd, Tcl_Interp *ip, void *sock_v) {
+  destroy(sock_v);
+  tabledataid_disposing(ip,sock_v,&dgram_socks);
   return TCL_OK;
 }
+
+const IdDataSpec dgram_socks= {
+  "dgramsock", "dgramsock-table", destroy_idtabcb
+};