fred-mod-whoisd-3.10.1
Defines | 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"

Defines

#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.
#define MAX_RETRIES   3
 Max # of retries when COMM_FAILURE exception during CORBA call occurs.
#define RETR_SLEEP   100000
 Sleep interval in microseconds between retries.
#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.
#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.
#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.
static int get_registrar_by_handle (service_Whois service, const char *handle, general_object *objects, int *index_free, char *errmsg)
 Search registrar by handle.
static int get_contact_by_handle (service_Whois service, const char *handle, general_object *objects, int *index_free, char *errmsg)
 Search contact by handle.
static void copy_nsset (general_object *obj, ccReg_NSSetDetail *c_nsset)
 Copy corba representation of nsset object to our representation.
static void copy_keyset (general_object *obj, ccReg_KeySetDetail *c_keyset)
 Copy corba representation of keyset object to our representation.
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.
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.
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.
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.
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.
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.
static int translate_status (service_Whois service, general_object *objects, char *errmsg)
 Translate status ids by domain objects to appropriate strings.
static void copy_domain (general_object *obj, ccReg_DomainDetail *c_domain)
 Copy corba representation of domain object to our representation.
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.
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.
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.
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.
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.
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.
void whois_release_data (general_object *objects)
 Release data of any of the objects.

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.


Define 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.

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)