Provide an empty name to getsockname() if one hasn't been set up.

Ok'd (for now) by: julian
This commit is contained in:
Brian Somers 1999-11-11 20:08:04 +00:00
parent babd82dfa2
commit 03e3936479

View File

@ -370,23 +370,36 @@ ngd_connect(struct socket *so, struct sockaddr *nam, struct proc *p)
static int static int
ng_setsockaddr(struct socket *so, struct sockaddr **addr) ng_setsockaddr(struct socket *so, struct sockaddr **addr)
{ {
struct ngpcb *const pcbp = sotongpcb(so); struct ngpcb *pcbp;
struct sockaddr *sa; struct sockaddr_ng *sg;
int namelen; int sg_len, namelen, s;
if (pcbp == 0) /* Why isn't sg_data a `char[1]' ? :-( */
sg_len = sizeof(struct sockaddr_ng) - sizeof(sg->sg_data) + 1;
s = splnet();
pcbp = sotongpcb(so);
if (pcbp == 0) {
splx(s);
return (EINVAL); return (EINVAL);
if (pcbp->sockdata->node->name != NULL) { }
namelen = strlen(pcbp->sockdata->node->name) + 3;
MALLOC(sa, struct sockaddr *, namelen, M_SONAME, M_WAITOK); namelen = 0; /* silence compiler ! */
if (sa == NULL)
return (ENOMEM); if (pcbp->sockdata->node->name != NULL)
sa->sa_family = AF_NETGRAPH; sg_len += namelen = strlen(pcbp->sockdata->node->name);
sa->sa_len = namelen;
strcpy(sa->sa_data, pcbp->sockdata->node->name); MALLOC(sg, struct sockaddr_ng *, sg_len, M_SONAME, M_WAITOK);
*addr = sa; bzero(sg, sg_len);
} else
*addr = NULL; /* XXX check this makes sense */ if (pcbp->sockdata->node->name != NULL)
bcopy(pcbp->sockdata->node->name, sg->sg_data, namelen);
splx(s);
sg->sg_len = sg_len;
sg->sg_family = AF_NETGRAPH;
*addr = (struct sockaddr *)sg;
return (0); return (0);
} }