chiark / gitweb /
Logging fixes.
[chiark-tcl.git] / dgram / dgram.c
index bb538bf2f1b4d11c9ff39d6ee0be7de6cd602aa7..e541a3a2ed5891c687696d7bae982f4d18668d76 100644 (file)
@@ -76,7 +76,7 @@ int do_dgram_socket_transmit(ClientData cd, Tcl_Interp *ip,
            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");
+  else if (r!=l) return staticerr(ip,"sendto gave wrong answer",0);
   return TCL_OK;
 }
 
@@ -146,17 +146,14 @@ static void recv_call(ClientData sock_cd, int mask) {
   Tcl_IncrRefCount(invoke);
 
   rc= Tcl_ListObjReplace(ip,invoke,sock->script_llength,0,3,args);
+  for (i=0; i<3; i++) { Tcl_DecrRefCount(args[i]); args[i]= 0; }
   if (rc) goto x_rc;
 
   rc= Tcl_EvalObjEx(ip,invoke,TCL_EVAL_GLOBAL|TCL_EVAL_DIRECT);
 
-  for (i=0; i<3; i++) Tcl_DecrRefCount(args[i]);
-  Tcl_DecrRefCount(invoke);
-
-  hbytes_free(&message_val);
-  sockaddr_free(&peer_val);
-
 x_rc:
+  if (invoke) Tcl_DecrRefCount(invoke);
+
   if (rc)
     Tcl_BackgroundError(ip);
 }
@@ -203,7 +200,7 @@ int pat_sockid(Tcl_Interp *ip, Tcl_Obj *o, DgramSocket **val) {
 
   sockix= o->internalRep.longValue;
   if (sockix >= n_socks || !(sock= socks[sockix]))
-    return staticerr(ip,"dgram socket not open");
+    return staticerr(ip,"dgram socket not open",0);
 
   assert(socks[sockix]->ix == sockix);
 
@@ -225,6 +222,7 @@ static void sockid_t_free(Tcl_Obj *o) { }
 
 static void sockid_t_dup(Tcl_Obj *src, Tcl_Obj *dup) {
   dup->internalRep= src->internalRep;
+  dup->typePtr= &dgramsockid_type;
 }
 
 static void sockid_t_ustr(Tcl_Obj *o) {
@@ -242,10 +240,10 @@ static int sockid_t_sfa(Tcl_Interp *ip, Tcl_Obj *o) {
   char *ep, *str;
   
   str= Tcl_GetStringFromObj(o,0);
-  if (memcmp(str,"dgramsock",9)) return staticerr(ip,"bad dgram socket id");
+  if (memcmp(str,"dgramsock",9)) return staticerr(ip,"bad dgram socket id",0);
   errno=0; ul=strtoul(str+9,&ep,10);
-  if (errno || *ep) return staticerr(ip,"bad dgram socket id number");
-  if (ul > INT_MAX) return staticerr(ip,"out of range dgram socket id");
+  if (errno || *ep) return staticerr(ip,"bad dgram socket id number",0);
+  if (ul > INT_MAX) return staticerr(ip,"out of range dgram socket id",0);
 
   objfreeir(o);
   o->internalRep.longValue= ul;