4 # define INADDR_ANY ((unsigned long int) 0x00000000)
8 # define INADDR_NONE ((unsigned long int) 0xffffffff)
11 /* Linux libc 5.3.x has a bug that causes isalnum() to not work! */
12 #define ISALNUM(c) ( (((c) >= 'A') && ((c) <= 'Z')) || (((c) >= 'a') && ((c) <= 'z')) || (((c) >= '0') && ((c) <= '9')) )
15 ServiceNameToPortNumber(const char *const s
)
21 strncpy(str
, s
, sizeof(str
) - 1);
22 str
[sizeof(str
) - 1] = '\0';
32 || ((!ISALNUM(*cp
)) && (*cp
!= '-') && (*cp
!= '_')))
37 sp
= getservbyname(str
, "tcp");
40 return ((unsigned int) ntohs((unsigned short) sp
->s_port
));
42 sp
= getservbyname(str
, "udp");
45 return ((unsigned int) ntohs((unsigned short) sp
->s_port
));
47 return (0); /* error */
48 } /* ServiceNameToPortNumber */
54 AddrStrToAddr(const char * const s
, struct sockaddr_in
* const sa
, const int defaultport
)
60 char *hostcp
, *atsign
, *colon
, *cp
, *p2
;
62 memset(sa
, 0, sizeof(struct sockaddr_in
));
63 strncpy(portstr
, s
, sizeof(portstr
));
64 portstr
[sizeof(portstr
) - 1] = '\0';
66 if ((colon
= strchr(portstr
, ':')) != NULL
) {
67 /* Does it look like a URL? http://host ? */
68 if ((colon
[1] == '/') && (colon
[2] == '/')) {
72 for (cp
= hostcp
; *cp
!= '\0'; cp
++) {
73 if ((!ISALNUM(*cp
)) && (*cp
!= '.')) {
74 /* http://host:port */
75 if ((*cp
== ':') && (isdigit(cp
[1]))) {
88 port
= ServiceNameToPortNumber(portstr
);
90 /* Look for host.name.domain:port */
93 port
= (unsigned int) atoi(colon
+ 1);
95 } else if ((atsign
= strchr(portstr
, '@')) != NULL
) {
96 /* Look for port@host.name.domain */
99 port
= (unsigned int) atoi(portstr
);
100 } else if (defaultport
> 0) {
101 /* Have just host.name.domain, use that w/ default port. */
102 port
= (unsigned int) defaultport
;
105 /* If defaultport <= 0, they must supply a port number
106 * in the host/port string.
108 errno
= EADDRNOTAVAIL
;
109 return (kAddrStrToAddrMiscErr
);
112 sa
->sin_port
= htons((short) port
);
114 ipnum
= inet_addr(hostcp
);
115 if (ipnum
!= INADDR_NONE
) {
116 sa
->sin_family
= AF_INET
;
117 sa
->sin_addr
.s_addr
= ipnum
;
120 hp
= gethostbyname(hostcp
);
124 return (kAddrStrToAddrBadHost
);
126 sa
->sin_family
= hp
->h_addrtype
;
127 memcpy(&sa
->sin_addr
.s_addr
, hp
->h_addr_list
[0],
128 (size_t) hp
->h_length
);
131 } /* AddrStrToAddr */
136 AddrToAddrStr(char *const dst
, size_t dsize
, struct sockaddr_in
* const saddrp
, int dns
, const char *fmt
)
138 const char *addrNamePtr
;
146 addrNamePtr
= inet_ntoa(saddrp
->sin_addr
);
148 hp
= gethostbyaddr((char *) &saddrp
->sin_addr
, (int) sizeof(struct in_addr
), AF_INET
);
149 if ((hp
!= NULL
) && (hp
->h_name
!= NULL
) && (hp
->h_name
[0] != '\0')) {
150 addrNamePtr
= hp
->h_name
;
152 addrNamePtr
= inet_ntoa(saddrp
->sin_addr
);
157 for (dp
= dst
, dlim
= dp
+ dsize
- 1; ; fmt
++) {
160 } else if (*fmt
== '%') {
165 } else if (*fmt
== 'p') {
166 sprintf(str
, "%u", (unsigned int) ntohs(saddrp
->sin_port
));
167 for (cp
= str
; *cp
!= '\0'; cp
++)
171 } else if (*fmt
== 'h') {
172 if (addrNamePtr
!= NULL
) {
177 for ( ; *cp
!= '\0'; cp
++)
181 } else if (*fmt
== 's') {
182 pp
= getservbyport((int) (saddrp
->sin_port
), "tcp");
184 pp
= getservbyport((int) (saddrp
->sin_port
), "udp");
186 sprintf(str
, "%u", (unsigned int) ntohs(saddrp
->sin_port
));
191 for ( ; *cp
!= '\0'; cp
++)
196 } else if ((*fmt
== 't') || (*fmt
== 'u')) {
197 pp
= getservbyport((int) (saddrp
->sin_port
), (*fmt
== 'u') ? "udp" : "tcp");
199 sprintf(str
, "%u", (unsigned int) ntohs(saddrp
->sin_port
));
204 for ( ; *cp
!= '\0'; cp
++)
209 } else if (*fmt
== '\0') {
215 } else if (dp
< dlim
) {
221 } /* AddrToAddrStr */