chiark / gitweb /
gutting this to put it in chiark-tcl
[chiark-tcl.git] / dgram / sockaddr.c
index 4df9aa0376414750f1c4e30b72e83b1027e2a24d..c5592ea986abbfa52f1ddafe8e89ac0a9541ade4 100644 (file)
@@ -62,10 +62,10 @@ void sockaddr_free(const SockAddr_Value *v) {
 /* Sockaddr Tcl type */
 
 static void sockaddr_t_dup(Tcl_Obj *src, Tcl_Obj *dup) {
-  objfreeir(dup);
   sockaddr_create(OBJ_SOCKADDR(dup),
                  sockaddr_addr(OBJ_SOCKADDR(src)),
                  sockaddr_len(OBJ_SOCKADDR(src)));
+  dup->typePtr= &hbytes_type;
 }
 
 static void sockaddr_t_free(Tcl_Obj *o) {
@@ -76,7 +76,7 @@ static void sockaddr_t_ustr(Tcl_Obj *o) {
   const struct sockaddr *sa;
   char i46buf[INET6_ADDRSTRLEN], portbuf[50];
   const struct sockaddr_in *sin;
-  int al, sl, pl;
+  int al;
   const char *string, *prepend;
   
   sa= sockaddr_addr(OBJ_SOCKADDR(o));
@@ -106,12 +106,10 @@ static void sockaddr_t_ustr(Tcl_Obj *o) {
     return;
   }
 
-  pl= strlen(prepend);
-  sl= strlen(string);
-  o->length= pl+sl;
-  o->bytes= TALLOC(pl+sl+1);
-  memcpy(o->bytes, prepend, pl);
-  memcpy(o->bytes+pl, string, sl+1);
+  obj_updatestr_vstringls(o,
+                         prepend, strlen(prepend),
+                         string, strlen(string),
+                         (char*)0);
 }
 
 static int sockaddr_t_sfa(Tcl_Interp *ip, Tcl_Obj *o) {
@@ -139,7 +137,7 @@ static int sockaddr_t_sfa(Tcl_Interp *ip, Tcl_Obj *o) {
     else { assert(str[0]=='/' && str[1]!='/'); path=str; }
 
     if (strlen(str) >= sizeof(s.sun.sun_path))
-      return staticerr(ip, "AF_UNIX path too long");
+      return staticerr(ip, "AF_UNIX path too long", "SOCKADDR AFUNIX LENGTH");
 
     strcpy(s.sun.sun_path, path);
 
@@ -161,21 +159,24 @@ static int sockaddr_t_sfa(Tcl_Interp *ip, Tcl_Obj *o) {
     }
     TFREE(copy);
 
-    if (!iprv) return staticerr(ip, "bad IPv4 address syntax");
+    if (!iprv)
+      return staticerr(ip, "bad IPv4 address syntax", "SOCKADDR SYNTAX IPV4");
 
     comma++;
     if (!strcmp(comma,"*")) {
       s.sin.sin_port= 0;
     } else {
       errno=0; port_l=strtoul(comma,&ep,10);
-      if (errno || *ep) return staticerr(ip, "bad IPv4 port");
-      if (port_l > 65535) return staticerr(ip, "IPv4 port out of range");
+      if (errno || *ep)
+       return staticerr(ip, "bad IPv4 port", "SOCKADDR SYNTAX IPV4");
+      if (port_l > 65535)
+       return staticerr(ip, "IPv4 port out of range", "SOCKADDR SYNTAX IPV4");
       s.sin.sin_port= htons(port_l);
     }
 
   } else {
 
-    return staticerr(ip, "bad socket address syntax");
+    return staticerr(ip, "bad socket address syntax", "SOCKADDR SYNTAX OTHER");
 
   }