- added cmd line options, help
[sip-router] / udp_server.c
1 /*
2  * $Id$
3  */
4
5 #include <sys/types.h>
6 #include <sys/socket.h>
7 #include <netinet/in.h>
8 #include <errno.h>
9
10
11 #include "udp_server.h"
12 #include "config.h"
13 #include "dprint.h"
14
15
16 int udp_sock;
17
18
19
20 int udp_init(unsigned long ip, unsigned short port)
21 {
22         struct sockaddr_in addr;
23         int optval;
24
25         addr.sin_family=AF_INET;
26         addr.sin_port=htons(port);
27         addr.sin_addr.s_addr=ip;
28
29         udp_sock = socket(PF_INET, SOCK_DGRAM, 0);
30         if (udp_sock==-1){
31                 DPrint("ERROR: udp_init: socket: %s\n", strerror());
32                 goto error;
33         }
34         /* set sock opts? */
35         optval=1;
36         if (setsockopt(udp_sock, SOL_SOCKET, SO_REUSEADDR,
37                                         &optval, sizeof(optval)) ==-1)
38         {
39                 DPrint("ERROR: udp_init: setsockopt: %s\n", strerror());
40                 goto error;
41         }
42
43         if (bind(udp_sock, (struct sockaddr*) &addr, sizeof(addr))==-1){
44                 DPrint("ERROR: udp_init: bind: %s\n", strerror());
45                 goto error;
46         }
47
48
49         return 0;
50
51 error:
52         return -1;
53 }
54
55
56
57 int udp_rcv_loop()
58 {
59         int len;
60         char buf[BUF_SIZE+1];
61         struct sockaddr* from;
62         int fromlen;
63
64         from=(struct sockaddr*) malloc(sizeof(struct sockaddr));
65         if (from==0){
66                 DPrint("ERROR: udp_rcv_loop: out of memory\n");
67                 goto error;
68         }
69
70         for(;;){
71                 fromlen=sizeof(*from);
72                 len=recvfrom(udp_sock, buf, BUF_SIZE, 0, from, &fromlen);
73                 if (len==-1){
74                         DPrint("ERROR: udp_rcv_loop:recvfrom: %s\n", strerror());
75                         if (errno==EINTR)       goto skip;
76                         else goto error;
77                 }
78                 /*debugging, make print* msg work */
79                 buf[len+1]=0;
80
81                 receive_msg(buf, len, ((struct sockaddr_in*)from)->sin_addr.s_addr);
82                 
83         skip: /* do other stuff */
84                 
85         }
86         
87         if (from) free(from);
88         return 0;
89         
90 error:
91         if (from) free(from);
92         return -1;
93 }
94
95
96
97 /* which socket to use? main socket or new one? */
98 int udp_send(char *buf, int len, struct sockaddr*  to, int tolen)
99 {
100
101         int n;
102 again:
103         n=sendto(udp_sock, buf, len, 0, to, tolen);
104         if (n==-1){
105                 DPrint("ERROR: udp_send: sendto: %s\n", strerror());
106                 if (errno==EINTR) goto again;
107         }
108         return n;
109 }