1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
10 #include "obsolete/probslet.h"
14 static PRFileDesc
*err
= NULL
;
15 static PRBool failed
= PR_FALSE
;
17 static void Failed(const char *msg1
, const char *msg2
)
19 if (NULL
!= msg1
) PR_fprintf(err
, "%s ", msg1
);
20 PL_FPrintError(err
, msg2
);
24 static PRSockOption
Incr(PRSockOption
*option
)
26 PRIntn val
= ((PRIntn
)*option
) + 1;
27 *option
= (PRSockOption
)val
;
28 return (PRSockOption
)val
;
31 int main(int argc
, char **argv
)
34 PRFileDesc
*udp
= PR_NewUDPSocket();
35 PRFileDesc
*tcp
= PR_NewTCPSocket();
38 "PR_SockOpt_Nonblocking", /* nonblocking io */
39 "PR_SockOpt_Linger", /* linger on close if data present */
40 "PR_SockOpt_Reuseaddr", /* allow local address reuse */
41 "PR_SockOpt_Keepalive", /* keep connections alive */
42 "PR_SockOpt_RecvBufferSize", /* send buffer size */
43 "PR_SockOpt_SendBufferSize", /* receive buffer size */
45 "PR_SockOpt_IpTimeToLive", /* time to live */
46 "PR_SockOpt_IpTypeOfService", /* type of service and precedence */
48 "PR_SockOpt_AddMember", /* add an IP group membership */
49 "PR_SockOpt_DropMember", /* drop an IP group membership */
50 "PR_SockOpt_McastInterface", /* multicast interface address */
51 "PR_SockOpt_McastTimeToLive", /* multicast timetolive */
52 "PR_SockOpt_McastLoopback", /* multicast loopback */
54 "PR_SockOpt_NoDelay", /* don't delay send to coalesce packets */
55 "PR_SockOpt_MaxSegment", /* maximum segment size */
56 "PR_SockOpt_Broadcast", /* Enable broadcast */
60 err
= PR_GetSpecialFD(PR_StandardError
);
63 if (NULL
== udp
) Failed("PR_NewUDPSocket()", NULL
);
64 else if (NULL
== tcp
) Failed("PR_NewTCPSocket()", NULL
);
68 PRUint32 segment
= 1024;
71 rv
= PR_InitializeNetAddr(PR_IpAddrAny
, 0, &addr
);
72 if (PR_FAILURE
== rv
) Failed("PR_InitializeNetAddr()", NULL
);
73 rv
= PR_Bind(udp
, &addr
);
74 if (PR_FAILURE
== rv
) Failed("PR_Bind()", NULL
);
75 for(option
= PR_SockOpt_Linger
; option
< PR_SockOpt_Last
; Incr(&option
))
77 PRSocketOptionData data
;
82 case PR_SockOpt_Nonblocking
:
83 data
.value
.non_blocking
= PR_TRUE
;
86 case PR_SockOpt_Linger
:
87 data
.value
.linger
.polarity
= PR_TRUE
;
88 data
.value
.linger
.linger
= PR_SecondsToInterval(2);
91 case PR_SockOpt_Reuseaddr
:
92 data
.value
.reuse_addr
= PR_TRUE
;
94 case PR_SockOpt_Keepalive
:
95 data
.value
.keep_alive
= PR_TRUE
;
97 case PR_SockOpt_RecvBufferSize
:
98 data
.value
.recv_buffer_size
= segment
;
100 case PR_SockOpt_SendBufferSize
:
101 data
.value
.send_buffer_size
= segment
;
104 case PR_SockOpt_IpTimeToLive
:
105 data
.value
.ip_ttl
= 64;
107 case PR_SockOpt_IpTypeOfService
:
110 case PR_SockOpt_McastTimeToLive
:
112 data
.value
.mcast_ttl
= 4;
114 case PR_SockOpt_McastLoopback
:
116 data
.value
.mcast_loopback
= PR_TRUE
;
119 case PR_SockOpt_NoDelay
:
120 data
.value
.no_delay
= PR_TRUE
;
123 case PR_SockOpt_MaxSegment
:
124 data
.value
.max_segment
= segment
;
128 case PR_SockOpt_Broadcast
:
130 data
.value
.broadcast
= PR_TRUE
;
137 * TCP_MAXSEG can only be read, not set
139 if (option
!= PR_SockOpt_MaxSegment
) {
141 if (option
!= PR_SockOpt_McastLoopback
)
144 rv
= PR_SetSocketOption(fd
, &data
);
145 if (PR_FAILURE
== rv
)
146 Failed("PR_SetSocketOption()", tag
[option
]);
150 rv
= PR_GetSocketOption(fd
, &data
);
151 if (PR_FAILURE
== rv
) Failed("PR_GetSocketOption()", tag
[option
]);
156 PR_fprintf(err
, "%s\n", (failed
) ? "FAILED" : "PASSED");
157 return (failed
) ? 1 : 0;