/* [<][>][^][v][top][bottom][index][help] */
DEFINITIONS
This source file includes following functions.
- process_arguments
- get_operation_name
- get_object_type_name
- surf
- main
1 /***************************************
2 $Revision: 1.1 $
3
4 Surf. surf.c - whois DB archive surfing.
5
6 Status: NOT REVIEWED, NOT TESTED, NOT COMPLETE
7
8 Implementation by: Tiago Antao
9
10 ******************/ /******************
11 Copyright (c) 2002 RIPE NCC
12
13 All Rights Reserved
14
15 Permission to use, copy, modify, and distribute this software and its
16 documentation for any purpose and without fee is hereby granted,
17 provided that the above copyright notice appear in all copies and that
18 both that copyright notice and this permission notice appear in
19 supporting documentation, and that the name of the author not be
20 used in advertising or publicity pertaining to distribution of the
21 software without specific, written prior permission.
22
23 THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
24 ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL
25 AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
26 DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
27 AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
28 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
29 ***************************************/
30
31
32 #include <stdio.h>
33 #include <stdlib.h>
34 #include <time.h>
35 #include <rip.h>
36 #include "miniconf.h"
37 #include "dbsupport.h"
38 #include "aconf.h"
39
40 char* pkey;
41 int instance = -1;
42
43 void process_arguments (int argv, char** argc) {
/* [<][>][^][v][top][bottom][index][help] */
44 if (argv != 2 && argv != 3) {
45 printf("Usage: %s <pkey> [instance]\n", argc[0]);
46 exit(-1);
47 }
48
49 pkey = argc[1];
50 if (argv==3) {
51 instance = atoi(argc[2]);
52 }
53 }
54
55 /*
56 get_operation_type_name: Given an op type in number return the name string.
57 */
58 void get_operation_name(char *operation_name, long operation) {
/* [<][>][^][v][top][bottom][index][help] */
59 switch (operation) {
60 case 1:
61 strcpy(operation_name, "ADD");
62 return;
63 case 2:
64 strcpy(operation_name, "DEL");
65 return;
66 case 3:
67 strcpy(operation_name, "DAD");
68 return;
69 case 4:
70 strcpy(operation_name, "UPD");
71 return;
72 default:
73 sprintf(operation_name, "%d", operation);
74 }
75 }
76
77 /*
78 get_object_type_name: Given an object type in number return the name string.
79 */
80 void get_object_type_name(char *object_type_name, long object_type) {
/* [<][>][^][v][top][bottom][index][help] */
81 switch (object_type) {
82 case 0:
83 strcpy(object_type_name, "AS-BLOCK");
84 return;
85 case 1:
86 strcpy(object_type_name, "AS-SET");
87 return;
88 case 2:
89 strcpy(object_type_name, "AUT-NUM");
90 return;
91 case 3:
92 strcpy(object_type_name, "DOMAIN");
93 return;
94 case 4:
95 strcpy(object_type_name, "INET-RTR");
96 return;
97 case 5:
98 strcpy(object_type_name, "INET6NUM");
99 return;
100 case 6:
101 strcpy(object_type_name, "INETNUM");
102 return;
103 case 7:
104 strcpy(object_type_name, "KEY-CERT");
105 return;
106 case 8:
107 strcpy(object_type_name, "LIMERICK");
108 return;
109 case 9:
110 strcpy(object_type_name, "MNTNER");
111 return;
112 case 10:
113 strcpy(object_type_name, "PERSON");
114 return;
115 case 11:
116 strcpy(object_type_name, "ROLE");
117 return;
118 case 12:
119 strcpy(object_type_name, "ROUTE");
120 return;
121 case 13:
122 strcpy(object_type_name, "ROUTE-SET");
123 return;
124 case 14:
125 strcpy(object_type_name, "FILTER-SET");
126 return;
127 case 15:
128 strcpy(object_type_name, "PEER-SET");
129 return;
130 default:
131 sprintf(object_type_name, "%d", object_type);
132 }
133 }
134
135 /*
136 surf: Surfs a pkey (which might include more than 1 object).
137
138
139 */
140 void surf() {
/* [<][>][^][v][top][bottom][index][help] */
141 SQ_result_set_t* rs;
142 SQ_row_t* row;
143 char query[300];
144 int cont=1;
145 long operation;
146 char operation_name[20];
147 long timestamp;
148 char type_name[20];
149 long type;
150 long current_operation;
151
152 sprintf(query,
153 " SELECT operation, timestamp, object_type, object "
154 " FROM archive "
155 " WHERE pkey LIKE '%s' "
156 "ORDER BY timestamp ASC, operation DESC",
157 pkey);
158
159 SQ_execute_query(archive_conn, query, &rs);
160
161 current_operation = 0;
162 while ((row = SQ_row_next(rs)) != NULL) {
163 if (SQ_get_column_int(rs, row, 0, &operation) == -1) {
164 operation = 1;
165 }
166 SQ_get_column_int(rs, row, 1, ×tamp);
167 SQ_get_column_int(rs, row, 2, &type);
168
169 if (operation == 1 && (current_operation == 1 || current_operation == 4)) {
170 operation = 4;
171 }
172 current_operation = operation;
173
174 get_operation_name(operation_name, operation);
175 get_object_type_name(type_name, type);
176 if (instance<1) {
177 printf("%5d - Op: %3s Type: %12s Time: %s\n", cont, operation_name,
178 type_name, ctime(×tamp));
179 }
180 else {
181 if (instance == cont) {
182 printf("%5d - Op: %3s Type: %12s Time: %s\n%s\n", cont, operation_name,
183 type_name, ctime(×tamp),
184 SQ_get_column_string_nocopy(rs, row, 3));
185 }
186 }
187 cont++;
188 }
189 }
190
191 /*
192 main: Surf entry point.
193
194 Self-documenting.
195 */
196 int main (int argv, char** argc) {
/* [<][>][^][v][top][bottom][index][help] */
197 process_arguments(argv, argc);
198 read_configuration();
199 get_db_connections();
200
201 surf();
202
203 //close_dbs();
204
205 return 1;
206 }