fred-mod-whoisd-3.12.0
Macros | Functions | Variables
whois-client.c File Reference

Implementation of CORBA backend used for querying CORBA server for information about an object. More...

#include <assert.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <orbit/orbit.h>
#include <ORBitservices/CosNaming.h>
#include "whois-client.h"
#include "Whois.h"
Include dependency graph for whois-client.c:

Macros

#define ID_STATUS_OBJ_LINKED   16
 ID of object status 'Linked'.
 
#define ID_STATUS_OBJ_MOJEIDCONTACT   24
 ID of object status 'mojeidContact'.
 
#define raised_exception(ev)   ((ev)->_major != CORBA_NO_EXCEPTION)
 A shortcut for testing of CORBA exception appearence. More...
 
#define MAX_RETRIES   3
 Max # of retries when COMM_FAILURE exception during CORBA call occurs. More...
 
#define RETR_SLEEP   100000
 Sleep interval in microseconds between retries. More...
 
#define IS_NOT_COMM_FAILURE_EXCEPTION(_ev)   (strcmp((_ev)->_id, "IDL:omg.org/CORBA/COMM_FAILURE:1.0"))
 True if CORBA exception is COMM_FAILURE, which is used in retry loop. More...
 
#define IS_OBJECT_NOT_FOUND(_ev)   (!strcmp((_ev)->_id, "IDL:ccReg/Whois/ObjectNotFound:1.0"))
 True if CORBA exception is ObjectNotFound.
 
#define NULL_STRDUP(src)   ((*(src) == '\0') ? NULL : strdup(src))
 Call strdup on string only if it is not empty, otherwise return NULL. More...
 
#define COPY_ADDRESS_LINE(str)   do{ if (*(str) != '\0') r->address[line++] = strdup(str); }while(0)
 
#define COPY_ADDRESS_LINE(str)   do{ if (*(str) != '\0') c->address[line++] = strdup(str); }while(0)
 

Functions

int check_duplicates (int type, char *handle, general_object *objects, int index_free)
 Check for duplicates in array of objects. More...
 
static int get_registrar_by_handle (service_Whois service, const char *handle, general_object *objects, int *index_free, char *errmsg)
 Search registrar by handle. More...
 
static int get_contact_by_handle (service_Whois service, const char *handle, general_object *objects, int *index_free, char *errmsg)
 Search contact by handle. More...
 
static void copy_nsset (general_object *obj, ccReg_NSSetDetail *c_nsset)
 Copy corba representation of nsset object to our representation. More...
 
static void copy_keyset (general_object *obj, ccReg_KeySetDetail *c_keyset)
 Copy corba representation of keyset object to our representation. More...
 
static int recurse_nsset (service_Whois service, int rec, obj_nsset *n, general_object *objects, int *index_free, char *errmsg)
 The function does recursion on nsset. More...
 
static int recurse_keyset (service_Whois service, int rec, obj_keyset *k, general_object *objects, int *index_free, char *errmsg)
 The function does recursion on keyset. More...
 
static int get_nsset_by_handle (service_Whois service, const char *handle, int rec, general_object *objects, int *index_free, char *errmsg)
 Search nsset by handle and dependent objects if recursion is switched on. More...
 
static int get_keyset_by_handle (service_Whois service, const char *handle, int rec, general_object *objects, int *index_free, char *errmsg)
 Search keyset by handle and dependent objects if recursion is switched on. More...
 
static int get_nsset_by_attr (service_Whois service, const char *key, ccReg_NSSetInvKeyType attr, int rec, general_object *objects, int *index_free, char *errmsg)
 Search nsset by its attribute and dependent objects if recursion is switched on. More...
 
static int get_keyset_by_attr (service_Whois service, const char *key, ccReg_KeySetInvKeyType attr, int rec, general_object *objects, int *index_free, char *errmsg)
 Search keyset by its attribute and dependent objects if recursion is switched on. More...
 
static int translate_status (service_Whois service, general_object *objects, char *errmsg)
 Translate status ids by domain objects to appropriate strings. More...
 
static void copy_domain (general_object *obj, ccReg_DomainDetail *c_domain)
 Copy corba representation of domain object to our representation. More...
 
static int recurse_domain (service_Whois service, int rec, obj_domain *d, general_object *objects, int *index_free, char *errmsg)
 The function does recursion on domain. More...
 
static int get_domain_by_handle (service_Whois service, const char *handle, int rec, general_object *objects, int *index_free, char *errmsg)
 Search domain by fqdn and dependent objects if recursion is switched on. More...
 
static int get_domain_by_attr (service_Whois service, const char *key, ccReg_DomainInvKeyType attr, int rec, general_object *objects, int *index_free, char *errmsg)
 Search domain by its attribute and dependent objects if recursion is switched on. More...
 
int whois_log_new_message (service_Logger service, const char *sourceIP, const char *content, ccReg_RequestProperties *properties, ccReg_TID *log_entry_id, char *errmsg)
 Log a new event using logging daemon. More...
 
int whois_close_log_message (service_Logger service, const char *content, ccReg_RequestProperties *properties, ccReg_TID log_entry_id, CORBA_long result_code, char *errmsg)
 Update and close existing event using logging daemon. More...
 
int whois_corba_call (service_Whois service, const whois_request *wr, general_object *objects, char *timebuf, char *errmsg)
 Call the right function for the specific object type / search axis / handle combination. More...
 
void whois_release_data (general_object *objects)
 Release data of any of the objects. More...
 

Variables

const int IP_ADDR_LEN = 39
 maximum length of a string containing IP address
 
const int LC_UNIX_WHOIS = 0
 code of the servie according to the database table `service'
 

Detailed Description

Implementation of CORBA backend used for querying CORBA server for information about an object.

Macro Definition Documentation

#define IS_NOT_COMM_FAILURE_EXCEPTION (   _ev)    (strcmp((_ev)->_id, "IDL:omg.org/CORBA/COMM_FAILURE:1.0"))
#define MAX_RETRIES   3
#define NULL_STRDUP (   src)    ((*(src) == '\0') ? NULL : strdup(src))

Call strdup on string only if it is not empty, otherwise return NULL.

Referenced by copy_domain(), copy_keyset(), copy_nsset(), get_contact_by_handle(), and get_registrar_by_handle().

#define raised_exception (   ev)    ((ev)->_major != CORBA_NO_EXCEPTION)
#define RETR_SLEEP   100000

Function Documentation

int check_duplicates ( int  type,
char *  handle,
general_object objects,
int  index_free 
)

Check for duplicates in array of objects.

Parameters
typeWhich type of objects to look for.
handleHandle of the object.
objectsThe structure for holding any type of object
index_freeFirst free item in array of objects.
Returns
0 if no duplicates are present, 1 otherwise.

References obj_contact::contact, obj_domain::domain, obj_keyset::keyset, obj_nsset::nsset, and obj_registrar::registrar.

Referenced by get_contact_by_handle(), get_domain_by_handle(), get_keyset_by_handle(), get_nsset_by_handle(), and get_registrar_by_handle().

static void copy_domain ( general_object obj,
ccReg_DomainDetail *  c_domain 
)
static

Copy corba representation of domain object to our representation.

Parameters
objField in object array which is destination of copy.
c_domainDomain detail returned from CORBA.

References obj_domain::admin_c, obj_domain::changed, obj_domain::domain, obj_domain::expire, obj_domain::keyset, obj_domain::nsset, NULL_STRDUP, general_object::obj, obj_domain::registered, obj_domain::registrant, obj_domain::registrar, obj_domain::status, obj_domain::status_ids, obj_domain::temp_c, general_object::type, and obj_domain::validated_to.

Referenced by get_domain_by_attr(), and get_domain_by_handle().

static void copy_keyset ( general_object obj,
ccReg_KeySetDetail *  c_keyset 
)
static
static void copy_nsset ( general_object obj,
ccReg_NSSetDetail *  c_nsset 
)
static

Copy corba representation of nsset object to our representation.

Parameters
objField in object array which is destination of copy.
c_nssetNsset detail returned from CORBA.

References obj_nsset::changed, obj_nsset::created, IP_ADDR_LEN, obj_nsset::nserver, obj_nsset::nserver_addrs, obj_nsset::nsset, NULL_STRDUP, general_object::obj, obj_nsset::registrar, obj_nsset::tech_c, and general_object::type.

Referenced by get_nsset_by_attr(), and get_nsset_by_handle().

static int get_contact_by_handle ( service_Whois  service,
const char *  handle,
general_object objects,
int *  index_free,
char *  errmsg 
)
static

Search contact by handle.

Supress duplicities in array of objects.

Parameters
serviceWhois CORBA object reference.
handleHandle of contact.
objectsArray of resulting objects.
index_freeFirst free item in array of objects.
errmsgBuffer for error message.
Returns
Status.

References obj_contact::address, obj_contact::changed, check_duplicates(), obj_contact::contact, CORBA_OK, CORBA_SERVICE_FAILED, obj_contact::created, obj_contact::disclose, obj_contact::e_mail, obj_contact::fax_no, ID_STATUS_OBJ_LINKED, IS_NOT_COMM_FAILURE_EXCEPTION, IS_OBJECT_NOT_FOUND, MAX_ERROR_MSG_LEN, MAX_RETRIES, obj_contact::name, NULL_STRDUP, general_object::obj, obj_contact::org, obj_contact::phone, raised_exception, obj_contact::registrar, RETR_SLEEP, and general_object::type.

Referenced by recurse_domain(), recurse_keyset(), recurse_nsset(), and whois_corba_call().

static int get_domain_by_attr ( service_Whois  service,
const char *  key,
ccReg_DomainInvKeyType  attr,
int  rec,
general_object objects,
int *  index_free,
char *  errmsg 
)
static

Search domain by its attribute and dependent objects if recursion is switched on.

Parameters
serviceWhois CORBA object reference.
keyAttribute of domain.
attrAttribute type.
recRecursive lookup is performed if true.
objectsArray of resulting objects.
index_freeFirst free item in array of objects.
errmsgBuffer for error message.
Returns
Status.

References copy_domain(), CORBA_OK, CORBA_SERVICE_FAILED, IS_NOT_COMM_FAILURE_EXCEPTION, MAX_ERROR_MSG_LEN, MAX_OBJECT_COUNT, MAX_RETRIES, raised_exception, recurse_domain(), and RETR_SLEEP.

Referenced by whois_corba_call().

static int get_domain_by_handle ( service_Whois  service,
const char *  handle,
int  rec,
general_object objects,
int *  index_free,
char *  errmsg 
)
static

Search domain by fqdn and dependent objects if recursion is switched on.

Supress duplicates in array of objects

Parameters
serviceWhois CORBA object reference.
handleFqdn of domain.
recRecursive lookup is performed if true.
objectsArray of resulting objects.
index_freeFirst free item in array of objects.
errmsgBuffer for error message.
Returns
Status.

References check_duplicates(), copy_domain(), CORBA_OK, CORBA_SERVICE_FAILED, IS_NOT_COMM_FAILURE_EXCEPTION, IS_OBJECT_NOT_FOUND, MAX_ERROR_MSG_LEN, MAX_RETRIES, raised_exception, recurse_domain(), and RETR_SLEEP.

Referenced by whois_corba_call().

static int get_keyset_by_attr ( service_Whois  service,
const char *  key,
ccReg_KeySetInvKeyType  attr,
int  rec,
general_object objects,
int *  index_free,
char *  errmsg 
)
static

Search keyset by its attribute and dependent objects if recursion is switched on.

Parameters
serviceWhois CORBA object reference.
keyAttribute of keyset.
attrAttribute type.
recRecursive lookup is performed if true.
objectsArray of resulting objects.
index_freeFirst free item in array of objects.
errmsgBuffer for error message.
Returns
Status.

References copy_keyset(), CORBA_OK, CORBA_SERVICE_FAILED, IS_NOT_COMM_FAILURE_EXCEPTION, MAX_ERROR_MSG_LEN, MAX_OBJECT_COUNT, MAX_RETRIES, raised_exception, recurse_keyset(), and RETR_SLEEP.

Referenced by whois_corba_call().

static int get_keyset_by_handle ( service_Whois  service,
const char *  handle,
int  rec,
general_object objects,
int *  index_free,
char *  errmsg 
)
static

Search keyset by handle and dependent objects if recursion is switched on.

Supress duplicities in array of objects.

Parameters
serviceWhois CORBA object reference.
handleHandle of keyset.
recRecursive lookup is performed if true.
objectsArray of resulting objects.
index_freeFirst free item in array of objects.
errmsgBuffer for error message.
Returns
Status.

References check_duplicates(), copy_keyset(), CORBA_OK, CORBA_SERVICE_FAILED, IS_NOT_COMM_FAILURE_EXCEPTION, IS_OBJECT_NOT_FOUND, MAX_ERROR_MSG_LEN, MAX_RETRIES, raised_exception, recurse_keyset(), and RETR_SLEEP.

Referenced by recurse_domain(), and whois_corba_call().

static int get_nsset_by_attr ( service_Whois  service,
const char *  key,
ccReg_NSSetInvKeyType  attr,
int  rec,
general_object objects,
int *  index_free,
char *  errmsg 
)
static

Search nsset by its attribute and dependent objects if recursion is switched on.

Parameters
serviceWhois CORBA object reference.
keyAttribute of nsset.
attrAttribute type.
recRecursive lookup is performed if true.
objectsArray of resulting objects.
index_freeFirst free item in array of objects.
errmsgBuffer for error message.
Returns
Status.

References copy_nsset(), CORBA_OK, CORBA_SERVICE_FAILED, IS_NOT_COMM_FAILURE_EXCEPTION, MAX_ERROR_MSG_LEN, MAX_OBJECT_COUNT, MAX_RETRIES, raised_exception, recurse_nsset(), and RETR_SLEEP.

Referenced by whois_corba_call().

static int get_nsset_by_handle ( service_Whois  service,
const char *  handle,
int  rec,
general_object objects,
int *  index_free,
char *  errmsg 
)
static

Search nsset by handle and dependent objects if recursion is switched on.

Supress duplicities in array of objects.

Parameters
serviceWhois CORBA object reference.
handleHandle of nsset.
recRecursive lookup is performed if true.
objectsArray of resulting objects.
index_freeFirst free item in array of objects.
errmsgBuffer for error message.
Returns
Status.

References check_duplicates(), copy_nsset(), CORBA_OK, CORBA_SERVICE_FAILED, IS_NOT_COMM_FAILURE_EXCEPTION, IS_OBJECT_NOT_FOUND, MAX_ERROR_MSG_LEN, MAX_RETRIES, raised_exception, recurse_nsset(), and RETR_SLEEP.

Referenced by recurse_domain(), and whois_corba_call().

static int get_registrar_by_handle ( service_Whois  service,
const char *  handle,
general_object objects,
int *  index_free,
char *  errmsg 
)
static

Search registrar by handle.

Supress duplicities in array of objects.

Parameters
serviceWhois CORBA object reference.
handleHandle of registrar.
objectsArray of resulting objects.
index_freeFirst free item in array of objects.
errmsgBuffer for error message.
Returns
Status.

References obj_registrar::address, check_duplicates(), CORBA_OK, CORBA_SERVICE_FAILED, IS_NOT_COMM_FAILURE_EXCEPTION, IS_OBJECT_NOT_FOUND, MAX_ERROR_MSG_LEN, MAX_RETRIES, NULL_STRDUP, general_object::obj, obj_registrar::org, obj_registrar::phone, raised_exception, obj_registrar::registrar, RETR_SLEEP, general_object::type, and obj_registrar::url.

Referenced by whois_corba_call().

static int recurse_domain ( service_Whois  service,
int  rec,
obj_domain d,
general_object objects,
int *  index_free,
char *  errmsg 
)
static

The function does recursion on domain.

Parameters
serviceWhois corba object reference.
recRecursive lookup is performed if true.
dDomain object on which recursion is done.
objectsArray of results.
index_freeFirst free index in array of results.
errmsgBuffer for error message.
Returns
Status.

References obj_domain::admin_c, CORBA_OK, CORBA_OK_LIMIT, get_contact_by_handle(), get_keyset_by_handle(), get_nsset_by_handle(), obj_domain::keyset, MAX_OBJECT_COUNT, obj_domain::nsset, obj_domain::registrant, and obj_domain::temp_c.

Referenced by get_domain_by_attr(), and get_domain_by_handle().

static int recurse_keyset ( service_Whois  service,
int  rec,
obj_keyset k,
general_object objects,
int *  index_free,
char *  errmsg 
)
static

The function does recursion on keyset.

Parameters
serviceWhois corba object reference.
recSwitches recursion on/off
kKeyset object on which recursion is done.
objectsArray of results.
index_freeFirst free index in array of results.
errmsgBuffer for error message.
Returns
Status.

References CORBA_OK, CORBA_OK_LIMIT, get_contact_by_handle(), MAX_OBJECT_COUNT, and obj_keyset::tech_c.

Referenced by get_keyset_by_attr(), and get_keyset_by_handle().

static int recurse_nsset ( service_Whois  service,
int  rec,
obj_nsset n,
general_object objects,
int *  index_free,
char *  errmsg 
)
static

The function does recursion on nsset.

Parameters
serviceWhois corba object reference.
recSwitches recursion on/off
nNsset object on which is done recursion.
objectsArray of results.
index_freeFirst free index in array of results.
errmsgBuffer for error message.
Returns
Status.

References CORBA_OK, CORBA_OK_LIMIT, get_contact_by_handle(), MAX_OBJECT_COUNT, and obj_nsset::tech_c.

Referenced by get_nsset_by_attr(), and get_nsset_by_handle().

static int translate_status ( service_Whois  service,
general_object objects,
char *  errmsg 
)
static

Translate status ids by domain objects to appropriate strings.

Parameters
serviceWhois corba object reference.
objectsArray of objects.
errmsgBuffer for error message.
Returns
Status.

References CORBA_OK, CORBA_SERVICE_FAILED, IS_NOT_COMM_FAILURE_EXCEPTION, MAX_ERROR_MSG_LEN, MAX_OBJECT_COUNT, MAX_RETRIES, general_object::obj, raised_exception, RETR_SLEEP, obj_domain::status, obj_domain::status_ids, and general_object::type.

Referenced by whois_corba_call().

int whois_close_log_message ( service_Logger  service,
const char *  content,
ccReg_RequestProperties *  properties,
ccReg_TID  log_entry_id,
CORBA_long  result_code,
char *  errmsg 
)

Update and close existing event using logging daemon.

Parameters
serviceWhois CORBA object reference.
contentRaw content of the message.
propertiesCustom properties parsed from the content
log_entry_idID of the log entry to be close
errmsgBuffer for error message.
Returns
Status.

References CORBA_OK, CORBA_SERVICE_FAILED, IS_NOT_COMM_FAILURE_EXCEPTION, MAX_ERROR_MSG_LEN, MAX_RETRIES, raised_exception, and RETR_SLEEP.

Referenced by process_whois_query().

int whois_corba_call ( service_Whois  service,
const whois_request wr,
general_object objects,
char *  timebuf,
char *  errmsg 
)

Call the right function for the specific object type / search axis / handle combination.

The core function of whois module performs actual query.

Parameters
serviceWhois CORBA object reference.
wrWhois request.
objectsArray of resulting objects.
timebufTimestamp.
errmsg
Returns
Status.

References whois_request::axe, CORBA_OK, CORBA_OK_LIMIT, get_contact_by_handle(), get_domain_by_attr(), get_domain_by_handle(), get_keyset_by_attr(), get_keyset_by_handle(), get_nsset_by_attr(), get_nsset_by_handle(), get_registrar_by_handle(), MAX_OBJECT_COUNT, whois_request::norecursion, TIME_BUFFER_LENGTH, translate_status(), whois_request::type, general_object::type, whois_request::value, and whois_release_data().

Referenced by process_whois_query().

int whois_log_new_message ( service_Logger  service,
const char *  sourceIP,
const char *  content,
ccReg_RequestProperties *  properties,
ccReg_TID *  log_entry_id,
char *  errmsg 
)

Log a new event using logging daemon.

Log a message using logging daemon.

Parameters
serviceWhois CORBA object reference.
sourceIPIP of the host which sent the request.
contentRaw content of the message.
propertiesCustom properties parsed from the content
log_entry_idOutput of ID from event logger
errmsgBuffer for error message.
Returns
Status.

References CORBA_OK, CORBA_SERVICE_FAILED, IS_NOT_COMM_FAILURE_EXCEPTION, LC_UNIX_WHOIS, MAX_ERROR_MSG_LEN, MAX_RETRIES, raised_exception, and RETR_SLEEP.

Referenced by log_whois_request().

void whois_release_data ( general_object objects)