104bf885fae3544cd80ad3948e3b74ba400b80c1
[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 char* our_name;
19 unsigned long our_address;
20 unsigned short our_port;
21
22
23
24 int udp_init(unsigned long ip, unsigned short port)
25 {
26         struct sockaddr_in addr;
27         int optval;
28
29         addr.sin_family=AF_INET;
30         addr.sin_port=htons(port);
31         addr.sin_addr.s_addr=ip;
32
33         udp_sock = socket(PF_INET, SOCK_DGRAM, 0);
34         if (udp_sock==-1){
35                 DPrint("ERROR: udp_init: socket: %s\n", strerror());
36                 goto error;
37         }
38         /* set sock opts? */
39         optval=1;
40         if (setsockopt(udp_sock, SOL_SOCKET, SO_REUSEPORT,
41                                         &optval, sizeof(optval)) ==-1)
42         {
43                 DPrint("ERROR: udp_init: setsockopt: %s\n", strerror());
44                 goto error;
45         }
46
47         if (bind(udp_sock, (struct sockaddr*) &addr, sizeof(addr))==-1){
48                 DPrint("ERROR: udp_init: bind: %s\n", strerror());
49                 goto error;
50         }
51
52
53         return 0;
54
55 error:
56         return -1;
57 }
58
59
60
61 int udp_rcv_loop()
62 {
63         int len;
64         char buf[BUF_SIZE+1];
65         struct sockaddr* from;
66         int fromlen;
67
68         from=(struct sockaddr*) malloc(sizeof(struct sockaddr));
69         if (from==0){
70                 DPrint("ERROR: udp_rcv_loop: out of memory\n");
71                 goto error;
72         }
73
74         for(;;){
75                 fromlen=sizeof(*from);
76                 len=recvfrom(udp_sock, buf, BUF_SIZE, 0, from, &fromlen);
77                 if (len==-1){
78                         DPrint("ERROR: udp_rcv_loop:recvfrom: %s\n", strerror());
79                         if (errno==EINTR)       goto skip;
80                         else goto error;
81                 }
82                 /*debugging, make print* msg work */
83                 buf[len+1]=0;
84
85                 receive_msg(buf, len, from, fromlen);
86
87         skip: /* do other stuff */
88                 
89         }
90
91         return 0;
92         
93 error:
94         return -1;
95 }
96
97
98
99 /* which socket to use? main socket or new one? */
100 int udp_send(char *buf, int len, struct sockaddr*  to, int tolen)
101 {
102
103         int n;
104 again:
105         n=sendto(udp_sock, buf, len, 0, to, tolen);
106         if (n==-1){
107                 DPrint("ERROR: udp_send: sendto: %s\n", strerror());
108                 if (errno==EINTR) goto again;
109         }
110         return n;
111 }