1 | /*************************************** 2 | $Revision: 1.7 $ 3 | 4 | Attributes module (at) - this _should_ eventually get merged in with the 5 | config module. 6 | 7 | Status: NOT REVUED, NOT TESTED 8 | 9 | ******************/ /****************** 10 | Filename : attributes.c 11 | Author : ottrey@ripe.net 12 | OSs Tested : Solaris 13 | Related Modules : Used in conjunction with the objects module. 14 | Problems : Keeping consistency between arrays and enums. 15 | To Do : Total re-design. 16 | Comments : 17 | ******************/ /****************** 18 | Copyright (c) 1999 RIPE NCC 19 | 20 | All Rights Reserved 21 | 22 | Permission to use, copy, modify, and distribute this software and its 23 | documentation for any purpose and without fee is hereby granted, 24 | provided that the above copyright notice appear in all copies and that 25 | both that copyright notice and this permission notice appear in 26 | supporting documentation, and that the name of the author not be 27 | used in advertising or publicity pertaining to distribution of the 28 | software without specific, written prior permission. 29 | 30 | THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 31 | ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL 32 | AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY 33 | DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN 34 | AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 35 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 36 | ***************************************/ 37 | #include <stdlib.h> 38 | #include "attributes.h" 39 | 40 | /*+ String sizes +*/ 41 | #define STR_S 63 42 | #define STR_M 255 43 | #define STR_L 1023 44 | #define STR_XL 4095 45 | #define STR_XXL 16383 46 | 47 | /*+ Attributes (short name & long name) +*/ 48 | char * const Attributes[] = { 49 | "ac", "admin-c", 50 | "aa", "as-name", 51 | "ad", "address", 52 | "ag", "aggr-mtd", 53 | "ab", "aggr-bndry", 54 | "ah", "author", 55 | "an", "aut-num", 56 | "as", "as-set", 57 | "at", "auth", 58 | "az", "alias", 59 | "ce", "certif", 60 | "ch", "changed", 61 | "cy", "country", 62 | "cn", "cross-nfy", 63 | "co", "components", 64 | "ct", "cross-mnt", 65 | "da", "dom-name", 66 | "de", "descr", 67 | "df", "default", 68 | "dc", "dictionary", 69 | "di", "dom-net", 70 | "dn", "domain", 71 | "dt", "upd-to", 72 | "ec", "export-comps", 73 | "en", "encapsulation", 74 | "em", "e-mail", 75 | "ex", "export", 76 | "fi", "filter", 77 | "fp", "fingerpr", 78 | "fs", "filter-set", 79 | "fx", "fax-no", 80 | "ho", "holes", 81 | "if", "ifaddr", 82 | "ij", "inject", 83 | "in", "inetnum", 84 | "i6", "inet6num", 85 | "ip", "import", 86 | "ir", "inet-rtr", 87 | "is", "rtr-set", 88 | "kc", "key-cert", 89 | "la", "local-as", 90 | "li", "limerick", 91 | "mh", "method", 92 | "mb", "mnt-by", 93 | "ml", "mnt-lower", 94 | "mo", "member-of", 95 | "mr", "mbrs-by-ref", 96 | "ms", "members", 97 | "mt", "mntner", 98 | "mn", "mnt-nfy", 99 | "na", "netname", 100 | "nh", "nic-hdl", 101 | "ns", "nserver", 102 | "ny", "notify", 103 | "or", "origin", 104 | "ow", "owner", 105 | "pe", "peer", 106 | "pg", "peering", 107 | "ph", "phone", 108 | "pl", "protocol", 109 | "pn", "person", 110 | "ps", "peering-set", 111 | "rf", "refer", 112 | "rm", "remarks", 113 | "ro", "role", 114 | "rp", "rp-attribute", 115 | "rs", "route-set", 116 | "rt", "route", 117 | "rz", "rev-srv", 118 | "sd", "sub-dom", 119 | "so", "source", 120 | "st", "status", 121 | "tb", "trouble", 122 | "td", "typedef", 123 | "tc", "tech-c", 124 | "tx", "text", 125 | "wd", "withdrawn", 126 | "zc", "zone-c", 127 | NULL, NULL 128 | }; /* Attributes */ 129 | 130 | /*+ Attribute Details - Ie descriptions +*/ 131 | const char *Attributes_details[][2] = { 132 | /* ac */ { "An on-site contact (person)", "<NIC-handle>" }, 133 | /* aa */ { "A descriptive name associated with an AS.", "Uppercase letters, dashes (\"-\") and digits, no spaces.\n\tMust start with a letter." }, 134 | /* ad */ { "Full postal address of a person.", "Free Text." }, 135 | /* ag */ { "aggr-mtd", "INSERT aggr-mtd desc here." }, 136 | /* ab */ { "aggr-bndry", "INSERT aggr-bndry desc here." }, 137 | /* ah */ { "Limerick author.", "<NIC-handle>" }, 138 | /* an */ { "The autonomous system number. This must be a uniquely\n\tallocated autonomous system number from an AS registry\n\t(e.g.RIPE NCC, the Inter-NIC, etc).", "\"AS\"<positive integer between 1 and 65535>" }, 139 | /* as */ { "as-set", "INSERT as-set desc here." }, 140 | /* at */ { "The formal authority for a community. This could be\n\tan organisation, institute, committee, etc.", "Free text (alphanumeric characters, \".\", \"-\", \"\\\")." }, 141 | /* az */ { "alias", "INSERT alias desc here." }, 142 | /* ce */ { "certif", "INSERT certif desc here." }, 143 | /* ch */ { "Who previously changed this object\n\tand when this change was made.", "<RFC822 e-mail address> <DATE>\n\tE-mail address of person updating the object.\n\tDATE in YYYYMMDD or YYMMDD format." }, 144 | /* cy */ { "ATB country DESC Name of the country of the admin-c.", "ATB country FRMT 2 letter uppercase ISO 3166 country code." }, 145 | /* cn */ { "cross-nfy", "INSERT cross-nfy desc here." }, 146 | /* co */ { "components", "INSERT components desc here." }, 147 | /* ct */ { "cross-mnt", "INSERT cross-mnt desc here." }, 148 | /* da */ { "dom-name", "INSERT dom-name desc here." }, 149 | /* de */ { "A short decription of this object.", "All characters possible." }, 150 | /* df */ { "default", "INSERT default desc here." }, 151 | /* dc */ { "dictionary", "INSERT dictionary desc here." }, 152 | /* di */ { "List of IP networks in a domain.", "Dotted quad including trailing 0's." }, 153 | /* dn */ { "IP domain name.", "Full qualified domain name without trailing \".\"." }, 154 | /* dt */ { "The e-mail address to be notified when an object\n\tATB upd-to DESC protected by a mntner is unsuccessfully updated.", "ATB upd-to FRMT RFC-822 address" }, 155 | /* ec */ { "export-comps", "INSERT export-comps desc here." }, 156 | /* en */ { "encapsulation", "INSERT encapsulation desc here." }, 157 | /* em */ { "The e-mail address of a person or role.", "RFC-822 address." }, 158 | /* ex */ { "export", "INSERT export desc here." }, 159 | /* fi */ { "filter", "INSERT filter desc here." }, 160 | /* fp */ { "fingerpr", "INSERT fingerpr desc here." }, 161 | /* fs */ { "filter-set", "INSERT filter-set desc here." }, 162 | /* fx */ { "The fax number of a person or role", "+ <Country Code> <Area Code> <Fax Number>" }, 163 | /* ho */ { "holes", " INSERT holes desc here." }, 164 | /* if */ { "An interface address within an internet router.", "<Interface Address> <Interface Subnet Mask>" }, 165 | /* ij */ { "inject", "INSERT inject desc here." }, 166 | /* in */ { "A range of IP address space.", "x.x.x.x - x.x.x.x, where 0 =< x =< 255" }, 167 | /* i6 */ { "Full IP version 6 address.", "<ip6num>/<prefix length>" }, 168 | /* ip */ { "import", "INSERT import desc here." }, 169 | /* ir */ { "Fully qualified domain name of an internet router.", "Fully qualified domain name without trailing \".\"" }, 170 | /* is */ { "rtr-set", "INSERT rtr-set desc here." }, 171 | /* kc */ { "key-cert", "INSERT key-cert desc here." }, 172 | /* la */ { "The autonomous system in which a router belongs.", "AS<positive integer between 1 and 65535>." }, 173 | /* li */ { "Title of a limerick.", "LIM-<string>, where string can include\n\talphanumeric characters, \"-\" character." }, 174 | /* mh */ { "method", "INSERT method desc here." }, 175 | /* mb */ { "The identifier of a registered mntner object used for\n\tauthorization and authentication.", "<mntner>" }, 176 | /* ml */ { "The identifier of a registered mntner object used for\n\thierarchical authorization and authentication.", "<mntner>" }, 177 | /* mo */ { "member-of", " INSERT member-of desc here." }, 178 | /* mr */ { "mbrs-by-ref", "INSERT mbrs-by-ref desc here." }, 179 | /* ms */ { "members", "INSERT members desc here." }, 180 | /* mt */ { "The name of a mntner object. Must be an unique mntner\n\tname, but can be identical to AS names, nic-handles.", "<uppercase letter><uppercase alphanumeric, \"-\">" }, 181 | /* mn */ { "The e-mail address to be notified when an object\n\tprotected by a mntner is successfully updated.", "RFC-822 address." }, 182 | /* na */ { "The name of a range of IP address space.", "<uppercase letter><uppercase alphanumeric, \"-\">" }, 183 | /* nh */ { "The NIC handle of a role or person object.n\tThis can be a RIPE NIC-handle or a NIC-handle\n\tassigned by other regional registries.", "RIPE NIC-handle: <Initials><0-999>-RIPE" }, 184 | /* ns */ { "List of nameservers for a domain object; a minimum\n\tof two is mandatory .", "<Fully qualified domain name(s) without trailing \".\">\n\tOR <IP Address(es) of the nameserver(s)>" }, 185 | /* ny */ { "The e-mail address to which notifications of changes to\n\tan object should be sent.", "<RFC-822 address>" }, 186 | /* or */ { "origin", "INSERT origin desc here." }, 187 | /* ow */ { "owner", "INSERT owner desc here." }, 188 | /* pe */ { "Details of any (interior or exterior) router peerings.", "<Peer address> <Peer AS> <Routing Protocol> [Local AS]\n\t[Local AS] is optional." }, 189 | /* pg */ { "peering", "INSERT peering desc here." }, 190 | /* ph */ { "Telephone number", "+ <Country Code><Area Code><Phone Number>\n\t+ <Country Code><Area Code><Phone Number> ext. <number>\n\tOptional: spaces may be used to split up the phone number\n\tinto its constituent components. \".\" characters can a191 | lso\n\tbe used between to separate the digits." }, 192 | /* pl */ { "protocol", "INSERT protocol desc here." }, 193 | /* pn */ { "The full name of an adminstrative, technical or zone\n\tcontact person specified in another object.\n\tDo not use titles such as\"Dr.\", \"Prof.\", \"Mv.\",\n\t\"Ms.\", \"Mr.\", etc.", "<Personal Name> <Family Name> where each name is\n\tco194 | mposed of alphabetic characters." }, 195 | /* ps */ { "peering-set", "INSERT peering-set desc here." }, 196 | /* rf */ { "Whois referral for domain objects", "<Type> <host> <port>\n\t<Type> is one of RIPE, Internic or SIMPLE. Specifies whois\n\tquery style.\n\t<host> specifies the host to be queried.\n\t<port> the TCP port number (optional: 43 is the default)"197 | }, 198 | /* rm */ { "General remarks. Can include an URL or RFC822\n\taddress (if preceeded by mailto:).", "<free text>" }, 199 | /* ro */ { "The full name of a role entity e.g. RIPE DBM.", "Two components, each consisting of alphabetic\n\tcharacters. Note: there is no \"-\" character\n\tbetween the two components of the the name." }, 200 | /* rp */ { "rp-attribute", "INSERT rp-attribute desc here." }, 201 | /* rs */ { "route-set", "INSERT route-set desc here." }, 202 | /* rt */ { "route", "INSERT route desc here." }, 203 | /* rz */ { "Domain name server for a range of IP addresses.", "Fully qualified name without trailing \".\"" }, 204 | /* sd */ { "List of the sub-domains of a domain", "<Relative domain name to the domain>" }, 205 | /* so */ { "Identifier of the database containing\n\tauthoritative data for this object.\n\tUse RIPE for objects in the RIPE Database.", "Uppercase Text." }, 206 | /* st */ { "status", "INSERT status desc here." }, 207 | /* tb */ { "Information on who to contact when there are problems.", "<Free text>" }, 208 | /* td */ { "typedef", "INSERT typedef desc here." }, 209 | /* tc */ { "A technical contact.", "<NIC-handle>" }, 210 | /* tx */ { "Must be humourous, but not malicious\n\tor insulting. :-)", "Free Text." }, 211 | /* wd */ { "withdrawn", "INSERT withdrawn desc here." }, 212 | /* zc */ { "NIC-handle of the person with authority over a zone.", "<NIC-handle>" }, 213 | { NULL , NULL } 214 | }; /* Attributes_details */ 215 | 216 | /*+ Source database mirrors +*/ 217 | char * const Sources[] = { 218 | "RIPE", 219 | "RIPE2", 220 | "ARIN", 221 | "APNIC", 222 | NULL 223 | }; /* Sources */ 224 | 225 | 226 | /* AT_get_sources() */ 227 | /*++++++++++++++++++++++++++++++++++++++ 228 | Returns the sources as a list of strings. Used when validating query options. 229 | 230 | More: 231 | +html+ <PRE> 232 | Authors: 233 | ottrey 234 | 235 | +html+ </PRE><DL COMPACT> 236 | +html+ <DT>Online References: 237 | +html+ <DD><UL> 238 | +html+ </UL></DL> 239 | 240 | ++++++++++++++++++++++++++++++++++++++*/ 241 | char * const *AT_get_sources(void) { 242 | 243 | return Sources; 244 | 245 | } /* AT_get_sources() */ 246 | 247 | /* AT_get_source() */ 248 | /*++++++++++++++++++++++++++++++++++++++ 249 | Returns the indexed source. 250 | 251 | int index The index of the source in the Sources list. 252 | 253 | More: 254 | +html+ <PRE> 255 | Authors: 256 | ottrey 257 | 258 | +html+ </PRE><DL COMPACT> 259 | +html+ <DT>Online References: 260 | +html+ <DD><UL> 261 | +html+ </UL></DL> 262 | 263 | ++++++++++++++++++++++++++++++++++++++*/ 264 | const char *AT_get_source(int index) { 265 | 266 | return Sources[index]; 267 | 268 | } /* AT_get_source() */ 269 | 270 | /* source_foreach() */ 271 | /*++++++++++++++++++++++++++++++++++++++ 272 | Function to adds the source string to the created string from the Glist of sources. 273 | It is called via g_list_foreach(). 274 | 275 | void *element_data The source name. 276 | 277 | void *result_buf_ptr The string to be populated. 278 | 279 | More: 280 | +html+ <PRE> 281 | Authors: 282 | ottrey 283 | 284 | +html+ </PRE><DL COMPACT> 285 | +html+ <DT>Online References: 286 | +html+ <DD><UL> 287 | +html+ </UL></DL> 288 | 289 | ++++++++++++++++++++++++++++++++++++++*/ 290 | static void source_foreach(void *element_data, void *result_buf_ptr) { 291 | char *source = element_data; 292 | char *result_buf = (char *)result_buf_ptr; 293 | 294 | strcat(result_buf, element_data); 295 | strcat(result_buf, ","); 296 | 297 | } /* source_foreach() */ 298 | 299 | /* AT_sources_to_string() */ 300 | /*++++++++++++++++++++++++++++++++++++++ 301 | Creates a string from Sources. 302 | 303 | char * AT_sources_to_string Returns a string of the Sources. 304 | 305 | More: 306 | +html+ <PRE> 307 | Authors: 308 | ottrey 309 | 310 | +html+ </PRE><DL COMPACT> 311 | +html+ <DT>Online References: 312 | +html+ <DD><UL> 313 | +html+ </UL></DL> 314 | 315 | ++++++++++++++++++++++++++++++++++++++*/ 316 | char * AT_sources_to_string(void) { 317 | char *result=NULL; 318 | char result_buf[STR_XL]; 319 | int result_len; 320 | int i; 321 | 322 | strcpy(result_buf, "{"); 323 | for (i=0; Sources[i] != NULL; i++) { 324 | strcat(result_buf, Sources[i]); 325 | strcat(result_buf, ","); 326 | } 327 | result_len = strlen(result_buf); 328 | result_buf[result_len-1] = '}'; 329 | result_buf[result_len] = '\0'; 330 | 331 | result = (char *)calloc(1, result_len+1); 332 | strcpy(result, result_buf); 333 | 334 | return result; 335 | 336 | } /* AT_sources_to_string() */ 337 | 338 | /* AT_sources_list_to_string() */ 339 | /*++++++++++++++++++++++++++++++++++++++ 340 | Creates a string from the sources in the GList. 341 | 342 | GList *sources_list The GList of sources. 343 | 344 | More: 345 | +html+ <PRE> 346 | Authors: 347 | ottrey 348 | 349 | +html+ </PRE><DL COMPACT> 350 | +html+ <DT>Online References: 351 | +html+ <DD><UL> 352 | +html+ </UL></DL> 353 | 354 | ++++++++++++++++++++++++++++++++++++++*/ 355 | char * AT_sources_list_to_string(GList *sources_list) { 356 | char *result=NULL; 357 | char result_buf[STR_XL]; 358 | int result_len; 359 | 360 | strcpy(result_buf, "{"); 361 | g_list_foreach(sources_list, source_foreach, &result_buf); 362 | result_len = strlen(result_buf); 363 | if (result_len == 1) { 364 | /* If an empty set */ 365 | result_buf[1] = '}'; 366 | result_buf[2] = '\0'; 367 | } 368 | else { 369 | result_buf[result_len-1] = '}'; 370 | result_buf[result_len] = '\0'; 371 | } 372 | 373 | result = (char *)calloc(1, result_len+1); 374 | strcpy(result, result_buf); 375 | 376 | return result; 377 | 378 | } /* AT_sources_list_to_string() */ 379 | 380 | /* AT_get_attributes() */ 381 | /*++++++++++++++++++++++++++++++++++++++ 382 | Returns the attributes as a list of strings. 383 | 384 | More: 385 | +html+ <PRE> 386 | Authors: 387 | ottrey 388 | 389 | +html+ </PRE><DL COMPACT> 390 | +html+ <DT>Online References: 391 | +html+ <DD><UL> 392 | +html+ </UL></DL> 393 | 394 | ++++++++++++++++++++++++++++++++++++++*/ 395 | char * const *AT_get_attributes(void) { 396 | 397 | return Attributes; 398 | 399 | } /* AT_get_sources() */ 400 | 401 | /* AT_get_attribute() */ 402 | /*++++++++++++++++++++++++++++++++++++++ 403 | Returns the indexed attribute. Used when validating query options. 404 | 405 | AT_Type attr_index The index into the Attributes[] array. 406 | 407 | int offset The offset (Ie short or long name). 408 | 409 | More: 410 | +html+ <PRE> 411 | Authors: 412 | ottrey 413 | 414 | +html+ </PRE><DL COMPACT> 415 | +html+ <DT>Online References: 416 | +html+ <DD><UL> 417 | +html+ </UL></DL> 418 | 419 | ++++++++++++++++++++++++++++++++++++++*/ 420 | const char *AT_get_attribute(AT_Type attr_index, int offset) { 421 | 422 | return Attributes[attr_index*2+offset]; 423 | 424 | } /* AT_get_attribute() */ 425 | 426 | /* AT_get_attribute_desc() */ 427 | /*++++++++++++++++++++++++++++++++++++++ 428 | Returns the attribute description. Used for -t & -v queries. 429 | 430 | AT_Type attr_index The index into the Attributes[] array. 431 | 432 | More: 433 | +html+ <PRE> 434 | Authors: 435 | ottrey 436 | 437 | +html+ </PRE><DL COMPACT> 438 | +html+ <DT>Online References: 439 | +html+ <DD><UL> 440 | +html+ </UL></DL> 441 | 442 | ++++++++++++++++++++++++++++++++++++++*/ 443 | const char *AT_get_attribute_desc(AT_Type attr_index) { 444 | 445 | return (char *)Attributes_details[attr_index][0]; 446 | 447 | } /* AT_get_attribute_desc() */ 448 | 449 | /* AT_get_attribute_frmt() */ 450 | /*++++++++++++++++++++++++++++++++++++++ 451 | Returns the attribute format. Used for -t & -v queries. 452 | 453 | AT_Type attr_index The index into the Attributes[] array. 454 | 455 | More: 456 | +html+ <PRE> 457 | Authors: 458 | ottrey 459 | 460 | +html+ </PRE><DL COMPACT> 461 | +html+ <DT>Online References: 462 | +html+ <DD><UL> 463 | +html+ </UL></DL> 464 | 465 | ++++++++++++++++++++++++++++++++++++++*/ 466 | const char *AT_get_attribute_frmt(AT_Type attr_index) { 467 | 468 | return (char *)Attributes_details[attr_index][1]; 469 | 470 | } /* AT_get_attribute_frmt() */ 471 | 472 | /* AT_attributes_to_string() */ 473 | /*++++++++++++++++++++++++++++++++++++++ 474 | Returns a string of all the attributes. Only there for debugging and tracing purposes. 475 | 476 | int offset The offset (Ie short or long name). 477 | 478 | More: 479 | +html+ <PRE> 480 | Authors: 481 | ottrey 482 | 483 | +html+ </PRE><DL COMPACT> 484 | +html+ <DT>Online References: 485 | +html+ <DD><UL> 486 | +html+ </UL></DL> 487 | 488 | ++++++++++++++++++++++++++++++++++++++*/ 489 | char *AT_attributes_to_string(int offset) { 490 | int i; 491 | char *str; 492 | char str_buffer[4096]; 493 | int str_len; 494 | 495 | strcpy(str_buffer, "{\""); 496 | for (i=0; Attributes[i*2+offset] != NULL; i++) { 497 | strcat(str_buffer, Attributes[i*2+offset]); 498 | strcat(str_buffer, "\", \""); 499 | } 500 | str_len = strlen(str_buffer); 501 | str_buffer[str_len-3] = '}'; 502 | str_buffer[str_len-2] = '\0'; 503 | str_len--; 504 | 505 | str = (char *)calloc(1, str_len); 506 | strcpy(str, str_buffer); 507 | 508 | return str; 509 | 510 | } /* AT_attributes_to_string() */ 511 |