static void sockaddr_t_ustr(Tcl_Obj *o) {
const struct sockaddr *sa;
- char i46buf[INET6_ADDRSTRLEN];
- int al, sl, pl;
+ char i46buf[INET6_ADDRSTRLEN], portbuf[50];
+ const struct sockaddr_in *sin;
+ int al;
const char *string, *prepend;
sa= sockaddr_addr(OBJ_SOCKADDR(o));
case AF_INET6:
assert(sizeof(i46buf) >= INET_ADDRSTRLEN);
assert(al >= sizeof(struct sockaddr_in));
- inet_ntop(sa->sa_family, sa, i46buf, al);
- string= i46buf;
- prepend= "";
+ sin= (const void*)sa;
+ inet_ntop(sa->sa_family, &sin->sin_addr, i46buf, al);
+ snprintf(portbuf,sizeof(portbuf),",%d",(int)ntohs(sin->sin_port));
+ prepend= i46buf;
+ string= portbuf;
break;
case AF_UNIX:
- assert(al >= sizeof(struct sockaddr_un));
string= ((const struct sockaddr_un*)sa)->sun_path;
prepend= "";
if (!string[0]) string="//";
- else if (string[0] != '/' || string[1] == '/') prepend= "./";
+ else if (string[0] != '/' || string[1] == '/') prepend= "./";
+ break;
default: /* ouch ! */
obj_updatestr_array_prefix(o,(const void*)sa,al,"?");
return;
}
- pl= strlen(prepend);
- sl= strlen(string);
- o->bytes= TALLOC(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) {
sl= sizeof(s.sun);
s.sun.sun_family= AF_UNIX;
- if (strcmp(str,"//")) path= "";
- else if (memcmp(str,"./",2) && str[2]) path= str+2;
+ if (!strcmp(str,"//")) path= "";
+ else if (!memcmp(str,"./",2) && str[2]) path= str+2;
else { assert(str[0]=='/' && str[1]!='/'); path=str; }
if (strlen(str) >= sizeof(s.sun.sun_path))
return staticerr(ip, "AF_UNIX path too long");
- strcpy(s.sun.sun_path, str);
+ strcpy(s.sun.sun_path, path);
} else if ((comma= strchr(str, ','))) {