unsigned short GAddress_INET_GetPort(GAddress *address) { struct sockaddr_in *addr; assert(address != NULL); CHECK_ADDRESS_RETVAL(address, INET, 0); addr = (struct sockaddr_in *)address->m_addr; return ntohs(addr->sin_port); }
unsigned long GAddress_INET_GetHostAddress(GAddress *address) { struct sockaddr_in *addr; assert(address != NULL); CHECK_ADDRESS_RETVAL(address, INET, 0); addr = (struct sockaddr_in *)address->m_addr; return ntohl(addr->sin_addr.s_addr); }
GSocketError GAddress_INET_SetHostName(GAddress *address, const char *hostname) { struct hostent *he; struct in_addr *addr; assert(address != NULL); CHECK_ADDRESS(address, INET); addr = &(((struct sockaddr_in *)address->m_addr)->sin_addr); /* If it is a numeric host name, convert it now */ #if defined(HAVE_INET_ATON) if (inet_aton(hostname, addr) == 0) { #elif defined(HAVE_INET_ADDR) if ( (addr->s_addr = inet_addr(hostname)) == (unsigned)-1 ) { #else /* Use gethostbyname by default */ #ifndef __WXMAC__ int val = 1; /* VA doesn't like constants in conditional expressions */ if (val) #endif { #endif struct in_addr *array_addr; /* It is a real name, we solve it */ if ((he = gethostbyname(hostname)) == NULL) { /* Reset to invalid address */ addr->s_addr = INADDR_NONE; address->m_error = GSOCK_NOHOST; return GSOCK_NOHOST; } array_addr = (struct in_addr *) *(he->h_addr_list); addr->s_addr = array_addr[0].s_addr; } return GSOCK_NOERROR; } GSocketError GAddress_INET_SetAnyAddress(GAddress *address) { return GAddress_INET_SetHostAddress(address, INADDR_ANY); } GSocketError GAddress_INET_SetHostAddress(GAddress *address, unsigned long hostaddr) { struct in_addr *addr; assert(address != NULL); CHECK_ADDRESS(address, INET); addr = &(((struct sockaddr_in *)address->m_addr)->sin_addr); addr->s_addr = htonl(hostaddr); return GSOCK_NOERROR; } GSocketError GAddress_INET_SetPortName(GAddress *address, const char *port, const char *protocol) { struct servent *se; struct sockaddr_in *addr; assert(address != NULL); CHECK_ADDRESS(address, INET); if (!port) { address->m_error = GSOCK_INVPORT; return GSOCK_INVPORT; } #if defined(__WXPM__) && defined(__EMX__) se = getservbyname(port, (char*)protocol); #else se = getservbyname(port, protocol); #endif if (!se) { /* the cast to int suppresses compiler warnings about subscript having the type char */ if (isdigit((int)port[0])) { int port_int; port_int = atoi(port); addr = (struct sockaddr_in *)address->m_addr; addr->sin_port = htons(port_int); return GSOCK_NOERROR; } address->m_error = GSOCK_INVPORT; return GSOCK_INVPORT; } addr = (struct sockaddr_in *)address->m_addr; addr->sin_port = se->s_port; return GSOCK_NOERROR; } GSocketError GAddress_INET_SetPort(GAddress *address, unsigned short port) { struct sockaddr_in *addr; assert(address != NULL); CHECK_ADDRESS(address, INET); addr = (struct sockaddr_in *)address->m_addr; addr->sin_port = htons(port); return GSOCK_NOERROR; } GSocketError GAddress_INET_GetHostName(GAddress *address, char *hostname, size_t sbuf) { struct hostent *he; char *addr_buf; struct sockaddr_in *addr; assert(address != NULL); CHECK_ADDRESS(address, INET); addr = (struct sockaddr_in *)address->m_addr; addr_buf = (char *)&(addr->sin_addr); he = gethostbyaddr(addr_buf, sizeof(addr->sin_addr), AF_INET); if (he == NULL) { address->m_error = GSOCK_NOHOST; return GSOCK_NOHOST; } strncpy(hostname, he->h_name, sbuf); return GSOCK_NOERROR; } unsigned long GAddress_INET_GetHostAddress(GAddress *address) { struct sockaddr_in *addr; assert(address != NULL); CHECK_ADDRESS_RETVAL(address, INET, 0); addr = (struct sockaddr_in *)address->m_addr; return ntohl(addr->sin_addr.s_addr); } unsigned short GAddress_INET_GetPort(GAddress *address) { struct sockaddr_in *addr; assert(address != NULL); CHECK_ADDRESS_RETVAL(address, INET, 0); addr = (struct sockaddr_in *)address->m_addr; return ntohs(addr->sin_port); } /* * ------------------------------------------------------------------------- * Unix address family * ------------------------------------------------------------------------- */ #ifndef __VISAGECPP__ GSocketError _GAddress_Init_UNIX(GAddress *address) { address->m_len = sizeof(struct sockaddr_un); address->m_addr = (struct sockaddr *)malloc(address->m_len); if (address->m_addr == NULL) { address->m_error = GSOCK_MEMERR; return GSOCK_MEMERR; } address->m_family = GSOCK_UNIX; address->m_realfamily = PF_UNIX; ((struct sockaddr_un *)address->m_addr)->sun_family = AF_UNIX; ((struct sockaddr_un *)address->m_addr)->sun_path[0] = 0; return GSOCK_NOERROR; } #define UNIX_SOCK_PATHLEN (sizeof(addr->sun_path)/sizeof(addr->sun_path[0])) GSocketError GAddress_UNIX_SetPath(GAddress *address, const char *path) { struct sockaddr_un *addr; assert(address != NULL); CHECK_ADDRESS(address, UNIX); addr = ((struct sockaddr_un *)address->m_addr); strncpy(addr->sun_path, path, UNIX_SOCK_PATHLEN); addr->sun_path[UNIX_SOCK_PATHLEN - 1] = '\0'; return GSOCK_NOERROR; } GSocketError GAddress_UNIX_GetPath(GAddress *address, char *path, size_t sbuf) { struct sockaddr_un *addr; assert(address != NULL); CHECK_ADDRESS(address, UNIX); addr = (struct sockaddr_un *)address->m_addr; strncpy(path, addr->sun_path, sbuf); return GSOCK_NOERROR; }