return -1;
}
- if (preferredportno == 0)
- preferredportno = IAX_DEFAULT_PORTNO;
-
- if (preferredportno > 0) {
- sin.sin_family = AF_INET;
- if (ip) {
- inet_aton(ip, &sin.sin_addr);
- } else {
- sin.sin_addr.s_addr = 0;
- }
-
- sin.sin_port = htons((short)preferredportno);
- if (bind(netfd, (struct sockaddr *) &sin, sizeof(sin)) < 0) {
- DEBU(G "Unable to bind to preferred port. Using random one instead.");
- }
- }
- sinlen = sizeof(sin);
+ if (preferredportno == 0) preferredportno = IAX_DEFAULT_PORTNO;\r
+ if (preferredportno < 0) preferredportno = 0;\r
+\r
+ sin.sin_family = AF_INET;\r
+ sin.sin_addr.s_addr = 0;\r
+ sin.sin_port = htons((short)preferredportno);\r
+ if (bind(netfd, (struct sockaddr *) &sin, sizeof(sin)) < 0) \r
+ {\r
+#if defined(WIN32) || defined(_WIN32_WCE)\r
+ if (WSAGetLastError() == WSAEADDRINUSE)\r
+#else\r
+ if (errno == EADDRINUSE)\r
+#endif\r
+ {\r
+ /*the port is already in use, so bind to a free port chosen by the IP stack*/\r
+ DEBU(G "Unable to bind to preferred port - port is in use. Trying to bind to a free one");\r
+ sin.sin_port = htons((short)0);\r
+ if (bind(netfd, (struct sockaddr *) &sin, sizeof(sin)) < 0)\r
+ {\r
+ IAXERROR "Unable to bind UDP socket\n");\r
+ return -1;\r
+ }\r
+ } else\r
+ {\r
+ IAXERROR "Unable to bind UDP socket\n");\r
+ return -1;\r
+ }\r
+ }
+ sinlen = sizeof(sin);
if (getsockname(netfd, (struct sockaddr *) &sin, &sinlen) < 0) {
close(netfd);
netfd = -1;
iax_send_pong(event->session, event->ts);
iax_event_free(event);
break;
+ case IAX_EVENT_POKE:\r
+ event->etype = IAX_EVENT_PONG;\r
+ iax_send_pong(event->session, event->ts);\r
+ destroy_session(event->session);\r
+ iax_event_free(event);\r
+ break; \r
default:
return event;
}
e->ts = ts;
e = schedule_delivery(e, ts, updatehistory);
break;
- case IAX_COMMAND_PING:
- case IAX_COMMAND_POKE:
+ case IAX_COMMAND_POKE:\r
+ e->etype = IAX_EVENT_POKE;\r
+ e->ts = ts;\r
+ break; case IAX_COMMAND_PING:
/* PINGS and PONGS don't get scheduled; */
e->etype = IAX_EVENT_PING;
e->ts = ts;