#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); }