4.4BSD/usr/src/contrib/xns/morexnslib/ch/CHretrieve.c
#include <stdio.h>
/* contains:
* CH_RetrieveItem
*/
#include <sys/types.h>
#include <netns/ns.h>
#include "Clearinghouse2_defs.h"
#include <xnscourier/CHEntries.h>
#include <xnscourier/except.h>
/*
* This module contains the routine:
* CH_RetrieveItem(pattern,property,result)
* ObjectNamePattern pattern;
* Property property;
* RetrieveItemResults *result;
*/
static Cardinal nullhash = 0;
static Authenticator nullagent = {{0,{0,(Unspecified*) 0}},
{1,&nullhash}};
static ObjectName currentname;
extern struct ns_addr *LookupCHAddr();
CH_RetrieveItem(pattern,property,result)
ObjectNamePattern pattern;
Property property;
RetrieveItemResults *result;
{
CourierConnection *conn, *ch2conn;
extern CourierConnection *CH_GetFirstCH(), *CH_GetOtherCH();
RetrieveItemResults riresult;
ObjectName hint; /* from WrongServer errors */
if (pattern.object == NULL ||
pattern.domain == NULL ||
pattern.organization == NULL) {
return(1);
}
if ((conn = CH_GetFirstCH()) == NULL) {
fprintf(stderr,"Can't open connection to local Clearinghouse\n");
return(1);
}
DURING {
riresult= RetrieveItem(conn, NULL,
pattern,property,nullagent);
} HANDLER {
if (Exception.Code == REJECT_ERROR) {
CourierClose(conn);
fprintf(stderr,"Problem with clearinghouse.addresses. Local CH rejected request\n");
return(1);
}
if (Exception.Code != WrongServer) {
CourierClose(conn);
return(1); /* some random error */
}
hint = CourierErrArgs(WrongServerArgs,hint);
ch2conn = CH_GetOtherCH(conn,hint);
CourierClose(conn);
if (ch2conn == NULL) return(1);
conn = ch2conn;
/* probe the second clearinghouse */
DURING
riresult = RetrieveItem(conn,NULL,
pattern, property, nullagent);
HANDLER {
/* should be smarter is WrongServer here */
CourierClose(conn);
return(1);
} END_HANDLER;
/* we got it */
} END_HANDLER;
CourierClose(conn);
bcopy(&riresult, result, sizeof(Clearinghouse2_RetrieveItemResults));
return(0);
}