Licence change... man that was boring work...
[olsrd.git] / src / socket_parser.c
1 /*
2  * The olsr.org Optimized Link-State Routing daemon(olsrd)
3  * Copyright (c) 2004, Andreas T√łnnesen(andreto@olsr.org)
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without 
7  * modification, are permitted provided that the following conditions 
8  * are met:
9  *
10  * * Redistributions of source code must retain the above copyright 
11  *   notice, this list of conditions and the following disclaimer.
12  * * Redistributions in binary form must reproduce the above copyright 
13  *   notice, this list of conditions and the following disclaimer in 
14  *   the documentation and/or other materials provided with the 
15  *   distribution.
16  * * Neither the name of olsr.org, olsrd nor the names of its 
17  *   contributors may be used to endorse or promote products derived 
18  *   from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
23  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
24  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
26  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
27  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
28  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
30  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
31  * POSSIBILITY OF SUCH DAMAGE.
32  *
33  * Visit http://www.olsr.org for more information.
34  *
35  * If you find this software useful feel free to make a donation
36  * to the project. For more information see the website or contact
37  * the copyright holders.
38  *
39  * $Id: socket_parser.c,v 1.15 2004/11/21 11:28:56 kattemat Exp $
40  */
41
42 #include <unistd.h>
43 #include "socket_parser.h"
44 #include "olsr.h"
45 #include "defs.h"
46
47 #ifdef WIN32
48 #undef EINTR
49 #define EINTR WSAEINTR
50 #undef errno
51 #define errno WSAGetLastError()
52 #undef strerror
53 #define strerror(x) StrError(x)
54 #endif
55
56
57 static int hfd = 0;
58
59 static struct timeval tvp = {0, 0};
60 static fd_set ibits;
61
62 #warning highest FD for select is now set in socket add/remove functions
63
64 /**
65  * Add a socket and handler to the socketset
66  * beeing used in the main select(2) loop
67  * in listen_loop
68  *
69  *@param fd the socket
70  *@param pf the processing function
71  */
72 void
73 add_olsr_socket(int fd, void(*pf)(int))
74 {
75   struct olsr_socket_entry *new_entry;
76
77   if((fd == 0) || (pf == NULL))
78     {
79       fprintf(stderr, "Bogus socket entry - not registering...\n");
80       return;
81     }
82   olsr_printf(1, "Adding OLSR socket entry %d\n", fd);
83
84   new_entry = olsr_malloc(sizeof(struct olsr_socket_entry), "Socket entry");
85
86   new_entry->fd = fd;
87   new_entry->process_function = pf;
88
89   /* Queue */
90   new_entry->next = olsr_socket_entries;
91   olsr_socket_entries = new_entry;
92
93   if(fd + 1 > hfd)
94     hfd = fd + 1;
95 }
96
97 /**
98  * Remove a socket and handler to the socketset
99  * beeing used in the main select(2) loop
100  * in listen_loop
101  *
102  *@param fd the socket
103  *@param pf the processing function
104  */
105 int
106 remove_olsr_socket(int fd, void(*pf)(int))
107 {
108   struct olsr_socket_entry *entry, *prev_entry;
109
110   if((fd == 0) || (pf == NULL))
111     {
112       olsr_syslog(OLSR_LOG_ERR, "Bogus socket entry - not processing...\n");
113       return 0;
114     }
115   olsr_printf(1, "Removing OLSR socket entry %d\n", fd);
116
117   entry = olsr_socket_entries;
118   prev_entry = NULL;
119
120   while(entry)
121     {
122       if((entry->fd == fd) && (entry->process_function == pf))
123         {
124           if(prev_entry == NULL)
125             {
126               olsr_socket_entries = entry->next;
127               free(entry);
128             }
129           else
130             {
131               prev_entry->next = entry->next;
132               free(entry);
133             }
134
135           if(hfd == fd + 1)
136             {
137               /* Re-calculate highest FD */
138               entry = olsr_socket_entries;
139               hfd = 0;
140               while(entry)
141                 {
142                   if(entry->fd + 1 > hfd)
143                     hfd = entry->fd + 1;
144                   entry = entry->next;
145                 }
146             }
147           return 1;
148         }
149       prev_entry = entry;
150       entry = entry->next;
151     }
152
153   return 0;
154 }
155
156
157 void
158 poll_sockets()
159 {
160   int n;
161   struct olsr_socket_entry *olsr_sockets;
162
163
164   /* If there are no registered sockets we
165    * do not call select(2)
166    */
167   if(hfd == 0)
168     return;
169   
170   FD_ZERO(&ibits);
171   
172   /* Adding file-descriptors to FD set */
173   olsr_sockets = olsr_socket_entries;
174   while(olsr_sockets)
175     {
176       FD_SET(olsr_sockets->fd, &ibits);
177       olsr_sockets = olsr_sockets->next;
178     }
179       
180   /* Runnig select on the FD set */
181   n = select(hfd, &ibits, 0, 0, &tvp);
182   
183   if(n == 0)
184     return;
185   /* Did somethig go wrong? */
186   if ((n < 0) && errno != EINTR) 
187     {
188       olsr_syslog(OLSR_LOG_ERR, "select: %m");
189       olsr_printf(1, "Error select: %s", strerror(errno));
190       return;
191     }
192
193   /* Update time since this is much used by the parsing functions */
194   gettimeofday(&now, NULL);      
195   
196   olsr_sockets = olsr_socket_entries;
197   while(olsr_sockets)
198     {
199       if(FD_ISSET(olsr_sockets->fd, &ibits))
200         {
201           olsr_sockets->process_function(olsr_sockets->fd);
202         }
203       olsr_sockets = olsr_sockets->next;
204     }
205         
206 }
207