1    | /***************************************
2    |   $Revision: 1.2 $
3    | 
4    |   Functions to interface with RX module (create/update rx-nodes)
5    | 
6    |   Status: NOT REVUED, NOT TESTED
7    | 
8    |  Author(s):       Andrei Robachevsky
9    | 
10   |   ******************/ /******************
11   |   Modification History:
12   |         andrei (17/01/2000) Created.
13   |   ******************/ /******************
14   |   Copyright (c) 2000                              RIPE NCC
15   |  
16   |   All Rights Reserved
17   |   
18   |   Permission to use, copy, modify, and distribute this software and its
19   |   documentation for any purpose and without fee is hereby granted,
20   |   provided that the above copyright notice appear in all copies and that
21   |   both that copyright notice and this permission notice appear in
22   |   supporting documentation, and that the name of the author not be
23   |   used in advertising or publicity pertaining to distribution of the
24   |   software without specific, written prior permission.
25   |   
26   |   THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
27   |   ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL
28   |   AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
29   |   DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
30   |   AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
31   |   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
32   |  ***************************************/
33   | #include "ud_int.h"
34   | #include "rxroutines.h"
35   | 
36   | void save_rx_pref(rx_bin_data_t *rx_data, unsigned int prefix, unsigned int prefix_length)
37   | {
38   | ip_prefix_t *myprefptr = &(rx_data->mypref);
39   | 
40   |   memset(myprefptr, 0, sizeof(ip_prefix_t));
41   |   myprefptr->ip.space = IP_V4;
42   |   myprefptr->ip.words[0] = prefix;
43   |   myprefptr->bits = prefix_length; 
44   | 
45   | }
46   | 
47   | void save_rx_orig(rx_bin_data_t *rx_data, char *origin)
48   | {
49   |   rx_data->origin = origin;
50   | }
51   | 
52   | 
53   | void save_rx_rang(rx_inum_data_t *rx_data, unsigned int begin_in, unsigned int end_in)
54   | {
55   | ip_range_t *myrangptr = &(rx_data->myrang);
56   | 
57   |   memset(myrangptr, 0, sizeof(ip_range_t));
58   |   myrangptr->begin.space =  myrangptr->end.space = IP_V4;
59   |   myrangptr->begin.words[0] = begin_in;
60   |   myrangptr->end.words[0] = end_in;
61   |   
62   | }
63   | 
64   | 
65   | int update_rx_inum(rx_oper_mt mode, rx_tree_t *mytree, rx_inum_data_t *rx_data, long in_id)
66   | {
67   | ip_range_t *myrangptr = &(rx_data->myrang);
68   | rx_dataleaf_t *leafptr;
69   | char prstr[IP_RANGSTR_MAX];
70   | 
71   |   if( wr_calloc( (void **)& leafptr, sizeof(rx_dataleaf_t), 1) != UT_OK) return(-1);                        
72   |   
73   |   leafptr->data_key = in_id;
74   |  
75   |   if(mode != RX_OPER_DEL) {
76   |     if( IP_rang_b2a( myrangptr, prstr, IP_RANGSTR_MAX) != IP_OK ) return(-1);
77   |                                     
78   | #define PAYLOAD_INETNUM_LENGTH strlen("inetnum:\t\n")
79   | 
80   |     leafptr->data_len = PAYLOAD_INETNUM_LENGTH + 1 + strlen(prstr);
81   |     if( wr_calloc( (void **) & leafptr->data_ptr, leafptr->data_len, 1) != UT_OK) return(-1);
82   |   
83   |     if( snprintf(leafptr->data_ptr, leafptr->data_len, 
84   |      "inetnum:\t%s\n", prstr ) > leafptr->data_len ) return(-1);
85   |   }
86   |      
87   |   
88   |   if( RX_inum_node( mode, myrangptr, mytree, leafptr ) != RX_OK ) {
89   |     fprintf(stderr,"%ld\t%s\n", in_id, prstr);
90   |     return(-1);
91   |   }
92   |                         
93   | return(0);
94   | }
95   | 
96   | 
97   | 
98   | int update_rx_bin(rx_oper_mt mode, rx_tree_t *mytree, rx_bin_data_t *rx_data, long rt_id)
99   | {
100  | rx_dataleaf_t *leafptr;
101  | ip_prefix_t *myprefptr = &(rx_data->mypref);
102  | char prstr[IP_PREFSTR_MAX];
103  | 
104  | 
105  |   if( wr_calloc( (void **)& leafptr, sizeof(rx_dataleaf_t), 1) != UT_OK) return(-1);
106  |   
107  |   leafptr->data_key = rt_id;
108  |   
109  |   if(mode != RX_OPER_DEL) {
110  |     if( IP_pref_b2a( myprefptr, prstr, IP_PREFSTR_MAX) != IP_OK ) return(-1);
111  |                           
112  | #define PAYLOAD_ROUTE_LENGTH strlen("route:\t/\norigin:\t\n")                          
113  | 
114  |     leafptr->data_len = PAYLOAD_ROUTE_LENGTH + 1 
115  | 		+ strlen(prstr) + strlen(rx_data->origin);
116  |            
117  |     if( wr_calloc( (void **) & leafptr->data_ptr, leafptr->data_len, 1)!= UT_OK) return(-1);
118  |                               
119  |     if( snprintf(leafptr->data_ptr, leafptr->data_len,
120  |      "route:\t%s\norigin:\t%s\n", prstr, rx_data->origin ) > leafptr->data_len ) return(-1);
121  |   }   
122  | 
123  |   if( RX_bin_node( mode, myprefptr, mytree, leafptr ) != RX_OK ) {
124  |     fprintf(stderr,"%ld\t%s\n", rt_id, rx_data->origin);
125  |     return(-1);
126  |   }
127  |   
128  | return(0);  
129  | }
130  |