Merged Windows changes into Bruno's new version.
[olsrd.git] / lib / nameservice / src / olsrd_copy.c
1 /*
2  * Copyright (c) 2005, Bruno Randolf <bruno.randolf@4g-systems.biz>
3  * Copyright (c) 2004, Andreas T√łnnesen(andreto-at-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 notice, 
11  *   this list of conditions and the following disclaimer.
12  * * Redistributions in binary form must reproduce the above copyright notice, 
13  *   this list of conditions and the following disclaimer in the documentation 
14  *   and/or other materials provided with the distribution.
15  * * Neither the name of the UniK olsr daemon nor the names of its contributors 
16  *   may be used to endorse or promote products derived from this software 
17  *   without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
21  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
22  * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
23  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
24  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
26  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 
27  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
28  * OF THE POSSIBILITY OF SUCH DAMAGE.
29  *
30  */
31  
32 /* $Id: olsrd_copy.c,v 1.2 2005/03/01 21:35:14 tlopatic Exp $ */
33  
34 /*
35  * Dynamic linked library for UniK OLSRd
36  */
37  
38 /*************************************************************
39  *                 TOOLS COPIED FROM OLSRD                   *
40  *************************************************************/
41
42 // these functions are copied from the main olsrd source
43 // TODO: there must be a better way!!!
44
45 #include "olsrd_plugin.h"
46
47 /**
48  *Hashing function. Creates a key based on
49  *an 32-bit address.
50  *@param address the address to hash
51  *@return the hash(a value in the 0-31 range)
52  */
53 olsr_u32_t
54 olsr_hashing(union olsr_ip_addr *address)
55 {
56   olsr_u32_t hash;
57   char *tmp;
58
59   if(ipversion == AF_INET)
60     /* IPv4 */  
61     hash = (ntohl(address->v4));
62   else
63     {
64       /* IPv6 */
65       tmp = (char *) &address->v6;
66       hash = (ntohl(*tmp));
67     }
68
69   //hash &= 0x7fffffff; 
70   hash &= HASHMASK;
71
72   return hash;
73 }
74
75
76
77 /**
78  *Checks if a timer has times out. That means
79  *if it is smaller than present time.
80  *@param timer the timeval struct to evaluate
81  *@return positive if the timer has not timed out,
82  *0 if it matches with present time and negative
83  *if it is timed out.
84  */
85 int
86 olsr_timed_out(struct timeval *timer)
87 {
88   return(timercmp(timer, now, <));
89 }
90
91
92
93 /**
94  *Initiates a "timer", wich is a timeval structure,
95  *with the value given in time_value.
96  *@param time_value the value to initialize the timer with
97  *@param hold_timer the timer itself
98  *@return nada
99  */
100 void
101 olsr_init_timer(olsr_u32_t time_value, struct timeval *hold_timer)
102
103   olsr_u16_t  time_value_sec;
104   olsr_u16_t  time_value_msec;
105
106   time_value_sec = time_value/1000;
107   time_value_msec = time_value-(time_value_sec*1000);
108
109   hold_timer->tv_sec = time_value_sec;
110   hold_timer->tv_usec = time_value_msec*1000;   
111 }
112
113
114
115
116
117 /**
118  *Generaties a timestamp a certain number of milliseconds
119  *into the future.
120  *
121  *@param time_value how many milliseconds from now
122  *@param hold_timer the timer itself
123  *@return nada
124  */
125 void
126 olsr_get_timestamp(olsr_u32_t delay, struct timeval *hold_timer)
127
128   olsr_u16_t  time_value_sec;
129   olsr_u16_t  time_value_msec;
130
131   time_value_sec = delay/1000;
132   time_value_msec= delay - (delay*1000);
133
134   hold_timer->tv_sec = now->tv_sec + time_value_sec;
135   hold_timer->tv_usec = now->tv_usec + (time_value_msec*1000);   
136 }
137
138
139 /**
140  *Converts a olsr_ip_addr to a string
141  *Goes for both IPv4 and IPv6
142  *
143  *NON REENTRANT! If you need to use this
144  *function twice in e.g. the same printf
145  *it will not work.
146  *You must use it in different calls e.g.
147  *two different printfs
148  *
149  *@param the IP to convert
150  *@return a pointer to a static string buffer
151  *representing the address in "dots and numbers"
152  *
153  */
154 char *
155 olsr_ip_to_string(union olsr_ip_addr *addr)
156 {
157
158   char *ret;
159   struct in_addr in;
160   
161   if(ipversion == AF_INET)
162     {
163       in.s_addr=addr->v4;
164       ret = inet_ntoa(in);
165     }
166   else
167     {
168       /* IPv6 */
169       ret = (char *)inet_ntop(AF_INET6, &addr->v6, ipv6_buf, sizeof(ipv6_buf));
170     }
171
172   return ret;
173 }