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 |