* generic/udp_tcl.c: fconfigure options were returning lists of
authorpatthoyts <patthoyts>
Thu, 19 May 2005 15:41:05 +0000 (15:41 +0000)
committerpatthoyts <patthoyts>
Thu, 19 May 2005 15:41:05 +0000 (15:41 +0000)
lists. Fixed.

ChangeLog
demos/multicast.tcl
generic/udp_tcl.c
win/tcludp.dsp

index b1c3496c56e9055466616df3fecc2a25fdee5902..4059a760fffad16dce39d56004ba47c065ec1750 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,8 @@
 
        * generic/udp_tcl.c: Deal with bug #1178996 by changing the code
        used to cleanup sockets under Windows.
+       * generic/udp_tcl.c: fconfigure options were returning lists of
+       lists. Fixed.
 
 2005-05-17  Pat Thoyts  <patthoyts@users.sourceforge.net>
 
index ff4414d0f3d6af2d3f1d0146723595a778b02f43..daec2476085df5569d367e0fad77287f08f4c96b 100644 (file)
@@ -12,7 +12,8 @@ package require udp 1.0.6
 proc udpEvent {chan} {
     set data [read $chan]
     set peer [fconfigure $chan -peer]
-    puts "$peer [string length $data] '$data'"
+    set group [lindex [fconfigure $chan -remote] 0]
+    puts "$peer ($group) [string length $data] '$data' {[fconfigure $chan]}"
     if {[string match "QUIT*" $data]} {
         close $chan
         set ::forever 1
@@ -21,13 +22,18 @@ proc udpEvent {chan} {
 }
 
 # Select a multicast group and the port number.
-set group 224.5.1.21
-set port  7771
+#
+# We have two groups here to show that it's possible.
+#
+set group1 224.5.1.21
+set group2 224.5.2.21
+set port   7771
 
 # Create a listening socket and configure for sending too.
 set s [udp_open $port]
 fconfigure $s -buffering none -blocking 0
-fconfigure $s -mcastadd $group -remote [list $group $port]
+fconfigure $s -mcastadd $group1 -remote [list $group1 $port]
+fconfigure $s -mcastadd $group2 -remote [list $group2 $port]
 fileevent $s readable [list udpEvent $s]
 
 # Announce our presence and run
index e42773163f26faf02bb8e00658725696c4803db1..3c51bf219297edd4cdfdf0d0e944ba6abd7ea1cb 100644 (file)
@@ -1177,23 +1177,24 @@ udpGetOption(ClientData instanceData, Tcl_Interp *interp,
              CONST84 char *optionName, Tcl_DString *optionValue)
 {
     UdpState *statePtr = (UdpState *)instanceData;
-    CONST84 char * options = "myport remote peer mcastgroups broadcast ttl";
+    const char * options[] = { "myport", "remote", "peer", "mcastgroups", "broadcast", "ttl", NULL};
     int r = TCL_OK;
 
     if (optionName == NULL) {
-
-        Tcl_DStringAppend(optionValue, " -myport ", -1);
-        udpGetOption(instanceData, interp, "-myport", optionValue);
-        Tcl_DStringAppend(optionValue, " -remote ", -1);
-        udpGetOption(instanceData, interp, "-remote", optionValue);
-        Tcl_DStringAppend(optionValue, " -peer ", -1);
-        udpGetOption(instanceData, interp, "-peer", optionValue);
-        Tcl_DStringAppend(optionValue, " -mcastgroups ", -1);
-        udpGetOption(instanceData, interp, "-mcastgroups", optionValue);
-        Tcl_DStringAppend(optionValue, " -broadcast ", -1);
-        udpGetOption(instanceData, interp, "-broadcast", optionValue);
-        Tcl_DStringAppend(optionValue, " -ttl ", -1);
-        udpGetOption(instanceData, interp, "-ttl", optionValue);
+       Tcl_DString ds;
+       const char **p;
+       
+       Tcl_DStringInit(&ds);
+       for (p = options; *p != NULL; p++) {
+           char op[16];
+           sprintf(op, "-%s", *p);
+           Tcl_DStringSetLength(&ds, 0);
+           udpGetOption(instanceData, interp, op, &ds);
+           Tcl_DStringAppend(optionValue, " ", 1);
+           Tcl_DStringAppend(optionValue, op, -1);
+           Tcl_DStringAppend(optionValue, " ", 1);
+           Tcl_DStringAppendElement(optionValue, Tcl_DStringValue(&ds));
+       }
 
     } else {
 
@@ -1262,11 +1263,17 @@ udpGetOption(ClientData instanceData, Tcl_Interp *interp,
             }
            
         } else {
-            r = Tcl_BadChannelOption(interp, optionName, options);
+           CONST84 char **p;
+           Tcl_DString tmp;
+           Tcl_DStringInit(&tmp);
+           for (p = options; *p != NULL; p++)
+               Tcl_DStringAppendElement(&tmp, *p);
+            r = Tcl_BadChannelOption(interp, optionName, Tcl_DStringValue(&tmp));
+           Tcl_DStringFree(&tmp);
         }
         
         if (r == TCL_OK) {
-            Tcl_DStringAppendElement(optionValue, Tcl_DStringValue(&ds));
+            Tcl_DStringAppend(optionValue, Tcl_DStringValue(&ds), -1);
         }
         Tcl_DStringFree(&dsInt);
         Tcl_DStringFree(&ds);
index 1d7ae3be1a2335e8eff752032672f61d30eb5d89..7f9d5e50d3ce56425b41d37bfbc18adbcf5aa3e3 100644 (file)
@@ -62,9 +62,9 @@ CFG=tcludp - Win32 Debug
 # PROP Use_Debug_Libraries 1
 # PROP Output_Dir "Debug"
 # PROP Intermediate_Dir "Debug"
-# PROP Cmd_Line "nmake /f makefile.vc INSTALLDIR=c:\opt\tcl OPTS=symbols all"
-# PROP Rebuild_Opt "/a"
-# PROP Target_File "Debug/udp106g.dll"
+# PROP Cmd_Line "nmake /f makefile.vc INSTALLDIR=c:\opt\tcl\site-lib OPTS=symbols all"
+# PROP Rebuild_Opt "realclean all"
+# PROP Target_File "Debug/udp107g.dll"
 # PROP Bsc_Name ""
 # PROP Target_Dir ""