chiark / gitweb /
transmits
[chiark-tcl.git] / dgram / dgram.c
index e6df127ab79bae33afa345d9268193f17f70c7eb..7e98df224c4842facb5590cf6da01905693b1a23 100644 (file)
@@ -4,8 +4,9 @@
  * dgram-socket create <local>                        => <sockid>
  * dgram-socket close <sockid>
  * dgram-socket transmit <sockid> <data> <remote>
  * dgram-socket create <local>                        => <sockid>
  * dgram-socket close <sockid>
  * dgram-socket transmit <sockid> <data> <remote>
- * dgram-socket on-receive <sockid> <script>
+ * dgram-socket on-receive <sockid> [<script>]
  *    calls, effectively,  eval <script> [list <data> <remote-addr> <socket>]
  *    calls, effectively,  eval <script> [list <data> <remote-addr> <socket>]
+ *    if script not supplied, cancel
  */
 
 #include "tables.h"
  */
 
 #include "tables.h"
@@ -52,6 +53,20 @@ int do_dgram_socket_create(ClientData cd, Tcl_Interp *ip,
   return TCL_OK;
 }
 
   return TCL_OK;
 }
 
+int do_dgram_socket_transmit(ClientData cd, Tcl_Interp *ip,
+                            int sock, HBytes_Value data,
+                            SockAddr_Value remote) {
+  int l, r;
+
+  r= sendto(socks[sock].fd,
+           hbytes_data(&data), l=hbytes_len(&data),
+           0,
+           sockaddr_addr(&remote), sockaddr_len(&remote));
+  if (r==-1) return posixerr(ip,errno,"sendto");
+  else if (r!=l) return staticerr(ip,"sendto gave wrong answer");
+  return TCL_OK;
+}
+  
 int do_dgram_socket_close(ClientData cd, Tcl_Interp *ip, int sock) {
   close(socks[sock].fd); /* nothing useful to be done with errors */
   socks[sock].fd= -1;
 int do_dgram_socket_close(ClientData cd, Tcl_Interp *ip, int sock) {
   close(socks[sock].fd); /* nothing useful to be done with errors */
   socks[sock].fd= -1;