int addressEqual (XdmcpNetaddr a1, int len1, XdmcpNetaddr a2, int len2) { int partlen1, partlen2; char *part1, *part2; if (len1 != len2) { return FALSE; } if (NetaddrFamily(a1) != NetaddrFamily(a2)) { return FALSE; } part1 = NetaddrPort(a1, &partlen1); part2 = NetaddrPort(a2, &partlen2); if (partlen1 != partlen2 || memcmp(part1, part2, partlen1) != 0) { return FALSE; } part1 = NetaddrAddress(a1, &partlen1); part2 = NetaddrAddress(a2, &partlen2); if (partlen1 != partlen2 || memcmp(part1, part2, partlen1) != 0) { return FALSE; } return TRUE; }
int ConvertAddr (XdmcpNetaddr saddr, int *len, char **addr) { int retval; if (len == NULL) return -1; *addr = NetaddrAddress(saddr, len); switch (NetaddrFamily(saddr)) { #ifdef AF_UNSPEC case AF_UNSPEC: retval = FamilyLocal; break; #endif #ifdef AF_UNIX #ifndef hpux case AF_UNIX: retval = FamilyLocal; break; #endif #endif #ifdef TCPCONN case AF_INET: retval = FamilyInternet; break; #endif default: retval = -1; break; } WDMDebug("ConvertAddr returning %d for family %d\n", retval, NetaddrFamily(saddr)); return retval; }
char * NetaddrAddress(XdmcpNetaddr netaddrp, int *lenp) { # ifdef STREAMSCONN *lenp = 4; return netaddrp+4; # else switch (NetaddrFamily(netaddrp)) { # ifdef UNIXCONN case AF_UNIX: *lenp = strlen(((struct sockaddr_un *)netaddrp)->sun_path); return (char *) (((struct sockaddr_un *)netaddrp)->sun_path); # endif # ifdef TCPCONN case AF_INET: *lenp = sizeof (struct in_addr); return (char *) &(((struct sockaddr_in *)netaddrp)->sin_addr); case AF_INET6: { struct in6_addr *a = &(((struct sockaddr_in6 *)netaddrp)->sin6_addr); if (IN6_IS_ADDR_V4MAPPED(a)) { *lenp = sizeof (struct in_addr); return ((char *) &(a->s6_addr))+12; } else { *lenp = sizeof (struct in6_addr); return (char *) &(a->s6_addr); } } # endif default: *lenp = 0; return NULL; } # endif /* STREAMSCONN else */ }
int ConvertAddr (XdmcpNetaddr saddr, int *len, char **addr) { int retval; if ((len == NULL) || (saddr == NULL)) return -1; *addr = NetaddrAddress(saddr, len); # ifdef STREAMSCONN /* kludge */ if (NetaddrFamily(saddr) == 2) retval = FamilyInternet; # else switch (NetaddrFamily(saddr)) { # ifdef AF_UNSPEC case AF_UNSPEC: retval = FamilyLocal; break; # endif # ifdef AF_UNIX case AF_UNIX: retval = FamilyLocal; break; # endif # ifdef TCPCONN case AF_INET: retval = FamilyInternet; break; case AF_INET6: if (*len == sizeof(struct in_addr)) retval = FamilyInternet; else retval = FamilyInternet6; break; # endif default: retval = -1; break; } # endif /* STREAMSCONN else */ Debug ("ConvertAddr returning %d for family %d\n", retval, NetaddrFamily(saddr)); return retval; }
char * NetaddrPort(XdmcpNetaddr netaddrp, int *lenp) { switch (NetaddrFamily(netaddrp)) { case AF_INET: *lenp = 2; return (char *)&(((struct sockaddr_in *)netaddrp)->sin_port); default: *lenp = 0; return NULL; } }
static FormatChooserArgument ( char *buf, int len) { unsigned char addr_buf[1024]; int addr_len = sizeof (addr_buf); unsigned char result_buf[1024]; int result_len = 0; int netfamily; if (GetChooserAddr (addr_buf, &addr_len) == -1) { LogError ((unsigned char *)"Cannot get return address for chooser socket\n"); Debug ("Cannot get chooser socket address\n"); return 0; } netfamily = NetaddrFamily((XdmcpNetaddr)addr_buf); switch (netfamily) { case AF_INET: { char *port; int portlen; ARRAY8Ptr localAddress, getLocalAddress (); port = NetaddrPort((XdmcpNetaddr)addr_buf, &portlen); result_buf[0] = netfamily >> 8; result_buf[1] = netfamily & 0xFF; result_buf[2] = port[0]; result_buf[3] = port[1]; localAddress = getLocalAddress (); bcopy ((char *)localAddress->data, (char *)result_buf+4, 4); result_len = 8; } break; #ifdef AF_DECnet case AF_DECnet: break; #endif default: Debug ("Chooser family %d isn't known\n", netfamily); return 0; } return FormatBytes (result_buf, result_len, buf, len); }
char * NetaddrAddress(XdmcpNetaddr netaddrp, int *lenp) { switch (NetaddrFamily(netaddrp)) { #ifdef UNIXCONN case AF_UNIX: *lenp = strlen(((struct sockaddr_un *)netaddrp)->sun_path); return (char *) (((struct sockaddr_un *)netaddrp)->sun_path); #endif #ifdef TCPCONN case AF_INET: *lenp = sizeof (struct in_addr); return (char *) &(((struct sockaddr_in *)netaddrp)->sin_addr); #endif default: *lenp = 0; return NULL; } }
char * NetaddrPort(XdmcpNetaddr netaddrp, int *lenp) { # ifdef STREAMSCONN *lenp = 2; return netaddrp+2; # else switch (NetaddrFamily(netaddrp)) { case AF_INET: *lenp = 2; return (char *)&(((struct sockaddr_in *)netaddrp)->sin_port); case AF_INET6: *lenp = 2; return (char *)&(((struct sockaddr_in6 *)netaddrp)->sin6_port); default: *lenp = 0; return NULL; } # endif }