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