blob: a91b3c61dd2b56eeaf54bf9fd2ed8e9f92d138f4 [file] [log] [blame]
Benny Prijono8ab968f2007-07-20 08:08:30 +00001/* $Id$ */
2/*
3 * Copyright (C)2003-2007 Benny Prijono <benny@prijono.org>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 */
19#include <pj/sock.h>
Benny Prijono62b86eb2007-12-01 08:52:57 +000020#include <pj/assert.h>
21#include <pj/errno.h>
22#include <pj/ip_helper.h>
23#include <pj/os.h>
24#include <pj/addr_resolv.h>
25#include <pj/string.h>
26#include <pj/compat/socket.h>
27
28
29/*
30 * Convert address string with numbers and dots to binary IP address.
31 */
32PJ_DEF(pj_in_addr) pj_inet_addr(const pj_str_t *cp)
33{
34 pj_in_addr addr;
35
36 pj_inet_aton(cp, &addr);
37 return addr;
38}
39
40/*
41 * Convert address string with numbers and dots to binary IP address.
42 */
43PJ_DEF(pj_in_addr) pj_inet_addr2(const char *cp)
44{
45 pj_str_t str = pj_str((char*)cp);
46 return pj_inet_addr(&str);
47}
48
49/*
Benny Prijono80025db2007-12-02 15:36:46 +000050 * Get text representation.
51 */
52PJ_DEF(char*) pj_inet_ntop2( int af, const void *src,
53 char *dst, int size)
54{
55 pj_status_t status;
56
57 status = pj_inet_ntop(af, src, dst, size);
58 return (status==PJ_SUCCESS)? dst : NULL;
59}
60
61/*
Benny Prijono40c26332007-12-03 14:33:39 +000062 * Print socket address.
63 */
64PJ_DEF(char*) pj_sockaddr_print( const pj_sockaddr_t *addr,
65 char *buf, int size,
66 unsigned flags)
67{
68 enum {
69 WITH_PORT = 1,
70 WITH_BRACKETS = 2
71 };
72
73 char txt[PJ_INET6_ADDRSTRLEN];
74 char port[32];
75 const pj_addr_hdr *h = (const pj_addr_hdr*)addr;
76 char *bquote, *equote;
77 pj_status_t status;
78
79 status = pj_inet_ntop(h->sa_family, pj_sockaddr_get_addr(addr),
80 txt, sizeof(txt));
81 if (status != PJ_SUCCESS)
82 return "";
83
84 if (h->sa_family != PJ_AF_INET6 || (flags & WITH_BRACKETS)==0) {
85 bquote = ""; equote = "";
86 } else {
87 bquote = "["; equote = "]";
88 }
89
90 if (flags & WITH_PORT) {
91 pj_ansi_snprintf(port, sizeof(port), ":%d",
92 pj_sockaddr_get_port(addr));
93 } else {
94 port[0] = '\0';
95 }
96
97 pj_ansi_snprintf(buf, size, "%s%s%s%s",
98 bquote, txt, equote, port);
99
100 return buf;
101}
102
103/*
Benny Prijono62b86eb2007-12-01 08:52:57 +0000104 * Set the IP address of an IP socket address from string address,
105 * with resolving the host if necessary. The string address may be in a
106 * standard numbers and dots notation or may be a hostname. If hostname
107 * is specified, then the function will resolve the host into the IP
108 * address.
109 */
110PJ_DEF(pj_status_t) pj_sockaddr_in_set_str_addr( pj_sockaddr_in *addr,
111 const pj_str_t *str_addr)
112{
113 PJ_CHECK_STACK();
114
115 PJ_ASSERT_RETURN(!str_addr || str_addr->slen < PJ_MAX_HOSTNAME,
116 (addr->sin_addr.s_addr=PJ_INADDR_NONE, PJ_EINVAL));
117
118 PJ_SOCKADDR_RESET_LEN(addr);
119 addr->sin_family = AF_INET;
120 pj_bzero(addr->sin_zero, sizeof(addr->sin_zero));
121
122 if (str_addr && str_addr->slen) {
123 addr->sin_addr = pj_inet_addr(str_addr);
124 if (addr->sin_addr.s_addr == PJ_INADDR_NONE) {
125 pj_hostent he;
126 pj_status_t rc;
127
128 rc = pj_gethostbyname(str_addr, &he);
129 if (rc == 0) {
130 addr->sin_addr.s_addr = *(pj_uint32_t*)he.h_addr;
131 } else {
132 addr->sin_addr.s_addr = PJ_INADDR_NONE;
133 return rc;
134 }
135 }
136
137 } else {
138 addr->sin_addr.s_addr = 0;
139 }
140
141 return PJ_SUCCESS;
142}
143
144/* Set address from a name */
145PJ_DEF(pj_status_t) pj_sockaddr_set_str_addr(int af,
146 pj_sockaddr *addr,
147 const pj_str_t *str_addr)
148{
149 pj_status_t status;
150
151 if (af == PJ_AF_INET) {
152 return pj_sockaddr_in_set_str_addr(&addr->ipv4, str_addr);
153 }
154
155 PJ_ASSERT_RETURN(af==PJ_AF_INET6, PJ_EAFNOTSUP);
156
157 /* IPv6 specific */
158
159 addr->ipv6.sin6_family = PJ_AF_INET6;
160 PJ_SOCKADDR_RESET_LEN(addr);
161
162 if (str_addr && str_addr->slen) {
163 status = pj_inet_pton(PJ_AF_INET6, str_addr, &addr->ipv6.sin6_addr);
164 if (status != PJ_SUCCESS) {
165 pj_addrinfo ai;
166 unsigned count = 1;
167
168 status = pj_getaddrinfo(PJ_AF_INET6, str_addr, &count, &ai);
169 if (status==PJ_SUCCESS) {
170 pj_memcpy(&addr->ipv6.sin6_addr, &ai.ai_addr.ipv6.sin6_addr,
171 sizeof(pj_sockaddr_in6));
172 }
173 }
174 } else {
175 status = PJ_SUCCESS;
176 }
177
178 return status;
179}
180
181/*
182 * Set the IP address and port of an IP socket address.
183 * The string address may be in a standard numbers and dots notation or
184 * may be a hostname. If hostname is specified, then the function will
185 * resolve the host into the IP address.
186 */
187PJ_DEF(pj_status_t) pj_sockaddr_in_init( pj_sockaddr_in *addr,
188 const pj_str_t *str_addr,
189 pj_uint16_t port)
190{
191 PJ_ASSERT_RETURN(addr, (addr->sin_addr.s_addr=PJ_INADDR_NONE, PJ_EINVAL));
192
193 PJ_SOCKADDR_RESET_LEN(addr);
194 addr->sin_family = PJ_AF_INET;
195 pj_bzero(addr->sin_zero, sizeof(addr->sin_zero));
196 pj_sockaddr_in_set_port(addr, port);
197 return pj_sockaddr_in_set_str_addr(addr, str_addr);
198}
199
200/*
201 * Initialize IP socket address based on the address and port info.
202 */
203PJ_DEF(pj_status_t) pj_sockaddr_init(int af,
204 pj_sockaddr *addr,
205 const pj_str_t *cp,
206 pj_uint16_t port)
207{
208 pj_status_t status;
209
210 if (af == PJ_AF_INET) {
211 return pj_sockaddr_in_init(&addr->ipv4, cp, port);
212 }
213
214 /* IPv6 specific */
215 PJ_ASSERT_RETURN(af==PJ_AF_INET6, PJ_EAFNOTSUP);
216
217 pj_bzero(addr, sizeof(pj_sockaddr_in6));
218 addr->addr.sa_family = PJ_AF_INET6;
219
220 status = pj_sockaddr_set_str_addr(af, addr, cp);
221 if (status != PJ_SUCCESS)
222 return status;
223
224 addr->ipv6.sin6_port = pj_htons(port);
225 return PJ_SUCCESS;
226}
227
228/*
Benny Prijono40c26332007-12-03 14:33:39 +0000229 * Compare two socket addresses.
230 */
231PJ_DEF(int) pj_sockaddr_cmp( const pj_sockaddr_t *addr1,
232 const pj_sockaddr_t *addr2)
233{
234 const pj_sockaddr *a1 = (const pj_sockaddr*) addr1;
235 const pj_sockaddr *a2 = (const pj_sockaddr*) addr2;
236 int port1, port2;
237 int result;
238
239 /* Compare address family */
240 if (a1->addr.sa_family < a2->addr.sa_family)
241 return -1;
242 else if (a1->addr.sa_family > a2->addr.sa_family)
243 return 1;
244
245 /* Compare addresses */
246 result = pj_memcmp(pj_sockaddr_get_addr(a1),
247 pj_sockaddr_get_addr(a2),
248 pj_sockaddr_get_addr_len(a1));
249 if (result != 0)
250 return result;
251
252 /* Compare port number */
253 port1 = pj_sockaddr_get_port(a1);
254 port2 = pj_sockaddr_get_port(a2);
255
256 if (port1 < port2)
257 return -1;
258 else if (port1 > port2)
259 return 1;
260
261 /* TODO:
262 * Do we need to compare flow label and scope id in IPv6?
263 */
264
265 /* Looks equal */
266 return 0;
267}
268
269/*
Benny Prijono62b86eb2007-12-01 08:52:57 +0000270 * Get first IP address associated with the hostname.
271 */
272PJ_DEF(pj_in_addr) pj_gethostaddr(void)
273{
274 pj_sockaddr_in addr;
275 const pj_str_t *hostname = pj_gethostname();
276
277 pj_sockaddr_in_set_str_addr(&addr, hostname);
278 return addr.sin_addr;
279}
280
281/*
282 * Get port number of a pj_sockaddr_in
283 */
284PJ_DEF(pj_uint16_t) pj_sockaddr_in_get_port(const pj_sockaddr_in *addr)
285{
286 return pj_ntohs(addr->sin_port);
287}
288
289/*
290 * Get the address part
291 */
292PJ_DEF(void*) pj_sockaddr_get_addr(const pj_sockaddr_t *addr)
293{
294 const pj_sockaddr *a = (const pj_sockaddr*)addr;
295
296 PJ_ASSERT_RETURN(a->addr.sa_family == PJ_AF_INET ||
297 a->addr.sa_family == PJ_AF_INET6, NULL);
298
299 if (a->addr.sa_family == PJ_AF_INET6)
300 return (void*) &a->ipv6.sin6_addr;
301 else
302 return (void*) &a->ipv4.sin_addr;
303}
304
305/*
306 * Check if sockaddr contains a non-zero address
307 */
308PJ_DEF(pj_bool_t) pj_sockaddr_has_addr(const pj_sockaddr_t *addr)
309{
310 const pj_sockaddr *a = (const pj_sockaddr*)addr;
311
Benny Prijonobb7b98e2007-12-12 17:13:34 +0000312 /* It's probably not wise to raise assertion here if
313 * the address doesn't contain a valid address family, and
314 * just return PJ_FALSE instead.
315 *
316 * The reason is because application may need to distinguish
317 * these three conditions with sockaddr:
318 * a) sockaddr is not initialized. This is by convention
319 * indicated by sa_family==0.
320 * b) sockaddr is initialized with zero address. This is
321 * indicated with the address field having zero address.
322 * c) sockaddr is initialized with valid address/port.
323 *
324 * If we enable this assertion, then application will loose
325 * the capability to specify condition a), since it will be
326 * forced to always initialize sockaddr (even with zero address).
327 * This may break some parts of upper layer libraries.
328 */
329 //PJ_ASSERT_RETURN(a->addr.sa_family == PJ_AF_INET ||
330 // a->addr.sa_family == PJ_AF_INET6, PJ_EAFNOTSUP);
Benny Prijono62b86eb2007-12-01 08:52:57 +0000331
Benny Prijonobb7b98e2007-12-12 17:13:34 +0000332 if (a->addr.sa_family!=PJ_AF_INET && a->addr.sa_family!=PJ_AF_INET6) {
333 return PJ_FALSE;
334 } else if (a->addr.sa_family == PJ_AF_INET6) {
Benny Prijono62b86eb2007-12-01 08:52:57 +0000335 pj_uint8_t zero[24];
336 pj_bzero(zero, sizeof(zero));
337 return pj_memcmp(a->ipv6.sin6_addr.s6_addr, zero,
338 sizeof(pj_in6_addr)) != 0;
339 } else
340 return a->ipv4.sin_addr.s_addr != PJ_INADDR_ANY;
341}
342
343/*
344 * Get port number
345 */
346PJ_DEF(pj_uint16_t) pj_sockaddr_get_port(const pj_sockaddr_t *addr)
347{
348 const pj_sockaddr *a = (const pj_sockaddr*) addr;
349
350 PJ_ASSERT_RETURN(a->addr.sa_family == PJ_AF_INET ||
351 a->addr.sa_family == PJ_AF_INET6, (pj_uint16_t)0xFFFF);
352
353 return pj_ntohs((pj_uint16_t)(a->addr.sa_family == PJ_AF_INET6 ?
354 a->ipv6.sin6_port : a->ipv4.sin_port));
355}
356
357/*
358 * Get the length of the address part.
359 */
360PJ_DEF(unsigned) pj_sockaddr_get_addr_len(const pj_sockaddr_t *addr)
361{
362 const pj_sockaddr *a = (const pj_sockaddr*) addr;
363 PJ_ASSERT_RETURN(a->addr.sa_family == PJ_AF_INET ||
364 a->addr.sa_family == PJ_AF_INET6, PJ_EAFNOTSUP);
365 return a->addr.sa_family == PJ_AF_INET6 ?
366 sizeof(pj_in6_addr) : sizeof(pj_in_addr);
367}
368
369/*
Benny Prijono80025db2007-12-02 15:36:46 +0000370 * Get socket address length.
371 */
372PJ_DEF(unsigned) pj_sockaddr_get_len(const pj_sockaddr_t *addr)
373{
374 const pj_sockaddr *a = (const pj_sockaddr*) addr;
375 PJ_ASSERT_RETURN(a->addr.sa_family == PJ_AF_INET ||
376 a->addr.sa_family == PJ_AF_INET6, PJ_EAFNOTSUP);
377 return a->addr.sa_family == PJ_AF_INET6 ?
378 sizeof(pj_sockaddr_in6) : sizeof(pj_sockaddr_in);
379}
380
381/*
Benny Prijono40c26332007-12-03 14:33:39 +0000382 * Copy only the address part (sin_addr/sin6_addr) of a socket address.
383 */
384PJ_DEF(void) pj_sockaddr_copy_addr( pj_sockaddr *dst,
385 const pj_sockaddr *src)
386{
387 pj_memcpy(pj_sockaddr_get_addr(dst),
388 pj_sockaddr_get_addr(src),
389 pj_sockaddr_get_addr_len(src));
390}
391
392/*
Benny Prijono62b86eb2007-12-01 08:52:57 +0000393 * Set port number of pj_sockaddr_in
394 */
395PJ_DEF(void) pj_sockaddr_in_set_port(pj_sockaddr_in *addr,
396 pj_uint16_t hostport)
397{
398 addr->sin_port = pj_htons(hostport);
399}
400
401/*
402 * Set port number of pj_sockaddr
403 */
404PJ_DEF(pj_status_t) pj_sockaddr_set_port(pj_sockaddr *addr,
405 pj_uint16_t hostport)
406{
407 int af = addr->addr.sa_family;
408
Benny Prijono80025db2007-12-02 15:36:46 +0000409 PJ_ASSERT_RETURN(af==PJ_AF_INET || af==PJ_AF_INET6, PJ_EINVAL);
Benny Prijono62b86eb2007-12-01 08:52:57 +0000410
411 if (af == PJ_AF_INET6)
412 addr->ipv6.sin6_port = pj_htons(hostport);
413 else
414 addr->ipv4.sin_port = pj_htons(hostport);
415
416 return PJ_SUCCESS;
417}
418
419/*
420 * Get IPv4 address
421 */
422PJ_DEF(pj_in_addr) pj_sockaddr_in_get_addr(const pj_sockaddr_in *addr)
423{
424 pj_in_addr in_addr;
425 in_addr.s_addr = pj_ntohl(addr->sin_addr.s_addr);
426 return in_addr;
427}
428
429/*
430 * Set IPv4 address
431 */
432PJ_DEF(void) pj_sockaddr_in_set_addr(pj_sockaddr_in *addr,
433 pj_uint32_t hostaddr)
434{
435 addr->sin_addr.s_addr = pj_htonl(hostaddr);
436}
437
438/* Resolve the IP address of local machine */
439PJ_DEF(pj_status_t) pj_gethostip(int af, pj_sockaddr *addr)
440{
441 unsigned count;
442 pj_addrinfo ai;
443 pj_status_t status;
444
445
446#ifdef _MSC_VER
447 /* Get rid of "uninitialized he variable" with MS compilers */
448 pj_bzero(&ai, sizeof(ai));
449#endif
450
451 addr->addr.sa_family = (pj_uint16_t)af;
452 PJ_SOCKADDR_RESET_LEN(addr);
453
454 /* Try with resolving local hostname first */
455 count = 1;
456 status = pj_getaddrinfo(af, pj_gethostname(), &count, &ai);
457 if (status == PJ_SUCCESS) {
Benny Prijono9db4bd62007-12-31 11:26:21 +0000458 pj_assert(ai.ai_addr.addr.sa_family == (pj_uint16_t)af);
459 pj_sockaddr_copy_addr(addr, &ai.ai_addr);
Benny Prijono62b86eb2007-12-01 08:52:57 +0000460 }
461
462
463 /* If we end up with 127.x.x.x, resolve the IP by getting the default
464 * interface to connect to some public host.
465 */
466 if (status != PJ_SUCCESS || !pj_sockaddr_has_addr(addr) ||
Benny Prijono9db4bd62007-12-31 11:26:21 +0000467 (af==PJ_AF_INET && (pj_ntohl(addr->ipv4.sin_addr.s_addr) >> 24)==127))
Benny Prijono62b86eb2007-12-01 08:52:57 +0000468 {
Benny Prijono9db4bd62007-12-31 11:26:21 +0000469 status = pj_getdefaultipinterface(af, addr);
Benny Prijono62b86eb2007-12-01 08:52:57 +0000470 }
471
472 /* If failed, get the first available interface */
473 if (status != PJ_SUCCESS) {
Benny Prijono9db4bd62007-12-31 11:26:21 +0000474 pj_sockaddr itf[1];
475 unsigned count = PJ_ARRAY_SIZE(itf);
476
477 status = pj_enum_ip_interface(af, &count, itf);
478 if (status == PJ_SUCCESS) {
479 pj_assert(itf[0].addr.sa_family == (pj_uint16_t)af);
480 pj_sockaddr_copy_addr(addr, &itf[0]);
481 }
Benny Prijono62b86eb2007-12-01 08:52:57 +0000482 }
483
484 /* If else fails, returns loopback interface as the last resort */
485 if (status != PJ_SUCCESS) {
Benny Prijono9db4bd62007-12-31 11:26:21 +0000486 if (af==PJ_AF_INET) {
487 addr->ipv4.sin_addr.s_addr = pj_htonl (0x7f000001);
488 } else {
489 pj_in6_addr *s6_addr;
490
491 s6_addr = (pj_in6_addr*) pj_sockaddr_get_addr(addr);
492 pj_bzero(s6_addr, sizeof(pj_in6_addr));
493 s6_addr->s6_addr[15] = 1;
494 }
495 status = PJ_SUCCESS;
Benny Prijono62b86eb2007-12-01 08:52:57 +0000496 }
497
498 return status;
499}
500
501/* Get the default IP interface */
502PJ_DEF(pj_status_t) pj_getdefaultipinterface(int af, pj_sockaddr *addr)
503{
504 pj_sock_t fd;
505 pj_str_t cp;
506 pj_sockaddr a;
507 int len;
508 pj_uint8_t zero[64];
509 pj_status_t status;
510
511 addr->addr.sa_family = (pj_uint16_t)af;
512
513 status = pj_sock_socket(af, pj_SOCK_DGRAM(), 0, &fd);
514 if (status != PJ_SUCCESS) {
515 return status;
516 }
517
518 if (af == PJ_AF_INET) {
519 cp = pj_str("1.1.1.1");
520 } else {
521 cp = pj_str("1::1");
522 }
523 status = pj_sockaddr_init(af, &a, &cp, 53);
524 if (status != PJ_SUCCESS) {
525 pj_sock_close(fd);
526 return status;
527 }
528
529 status = pj_sock_connect(fd, &a, sizeof(a));
530 if (status != PJ_SUCCESS) {
531 pj_sock_close(fd);
532 return status;
533 }
534
535 len = sizeof(a);
536 status = pj_sock_getsockname(fd, &a, &len);
537 if (status != PJ_SUCCESS) {
538 pj_sock_close(fd);
539 return status;
540 }
541
542 pj_sock_close(fd);
543
544 /* Check that the address returned is not zero */
545 pj_bzero(zero, sizeof(zero));
546 if (pj_memcmp(pj_sockaddr_get_addr(&a), zero,
547 pj_sockaddr_get_addr_len(&a))==0)
548 {
549 return PJ_ENOTFOUND;
550 }
551
Benny Prijono9db4bd62007-12-31 11:26:21 +0000552 pj_sockaddr_copy_addr(addr, &a);
Benny Prijono62b86eb2007-12-01 08:52:57 +0000553
554 /* Success */
555 return PJ_SUCCESS;
556}
557
558
559/* Only need to implement these in DLL build */
560#if defined(PJ_DLL)
Benny Prijono8ab968f2007-07-20 08:08:30 +0000561
Benny Prijonoc16c6e32007-11-18 14:53:47 +0000562PJ_DEF(pj_uint16_t) pj_AF_UNSPEC(void)
563{
564 return PJ_AF_UNSPEC;
565}
566
Benny Prijono8ab968f2007-07-20 08:08:30 +0000567PJ_DEF(pj_uint16_t) pj_AF_UNIX(void)
568{
569 return PJ_AF_UNIX;
570}
571
572PJ_DEF(pj_uint16_t) pj_AF_INET(void)
573{
574 return PJ_AF_INET;
575}
576
577PJ_DEF(pj_uint16_t) pj_AF_INET6(void)
578{
579 return PJ_AF_INET6;
580}
581
582PJ_DEF(pj_uint16_t) pj_AF_PACKET(void)
583{
584 return PJ_AF_PACKET;
585}
586
587PJ_DEF(pj_uint16_t) pj_AF_IRDA(void)
588{
589 return PJ_AF_IRDA;
590}
591
592PJ_DEF(int) pj_SOCK_STREAM(void)
593{
594 return PJ_SOCK_STREAM;
595}
596
597PJ_DEF(int) pj_SOCK_DGRAM(void)
598{
599 return PJ_SOCK_DGRAM;
600}
601
602PJ_DEF(int) pj_SOCK_RAW(void)
603{
604 return PJ_SOCK_RAW;
605}
606
607PJ_DEF(int) pj_SOCK_RDM(void)
608{
609 return PJ_SOCK_RDM;
610}
611
612PJ_DEF(pj_uint16_t) pj_SOL_SOCKET(void)
613{
614 return PJ_SOL_SOCKET;
615}
616
617PJ_DEF(pj_uint16_t) pj_SOL_IP(void)
618{
619 return PJ_SOL_IP;
620}
621
622PJ_DEF(pj_uint16_t) pj_SOL_TCP(void)
623{
624 return PJ_SOL_TCP;
625}
626
627PJ_DEF(pj_uint16_t) pj_SOL_UDP(void)
628{
629 return PJ_SOL_UDP;
630}
631
632PJ_DEF(pj_uint16_t) pj_SOL_IPV6(void)
633{
634 return PJ_SOL_IPV6;
635}
636
637PJ_DEF(int) pj_IP_TOS(void)
638{
639 return PJ_IP_TOS;
640}
641
642PJ_DEF(int) pj_IPTOS_LOWDELAY(void)
643{
644 return PJ_IPTOS_LOWDELAY;
645}
646
647PJ_DEF(int) pj_IPTOS_THROUGHPUT(void)
648{
649 return PJ_IPTOS_THROUGHPUT;
650}
651
652PJ_DEF(int) pj_IPTOS_RELIABILITY(void)
653{
654 return PJ_IPTOS_RELIABILITY;
655}
656
657PJ_DEF(int) pj_IPTOS_MINCOST(void)
658{
659 return PJ_IPTOS_MINCOST;
660}
661
662PJ_DEF(pj_uint16_t) pj_SO_TYPE(void)
663{
664 return PJ_SO_TYPE;
665}
666
667PJ_DEF(pj_uint16_t) pj_SO_RCVBUF(void)
668{
669 return PJ_SO_RCVBUF;
670}
671
672PJ_DEF(pj_uint16_t) pj_SO_SNDBUF(void)
673{
674 return PJ_SO_SNDBUF;
675}
676
677PJ_DEF(int) pj_MSG_OOB(void)
678{
679 return PJ_MSG_OOB;
680}
681
682PJ_DEF(int) pj_MSG_PEEK(void)
683{
684 return PJ_MSG_PEEK;
685}
686
687PJ_DEF(int) pj_MSG_DONTROUTE(void)
688{
689 return PJ_MSG_DONTROUTE;
690}
691
Benny Prijono62b86eb2007-12-01 08:52:57 +0000692#endif /* PJ_DLL */
693