|
|
1.1 ! root 1: #include <stdio.h> ! 2: /* $Header: CHenumerate.c,v 2.0 85/11/21 07:22:30 jqj Exp $ */ ! 3: ! 4: /* contains: ! 5: * CH_Enumerate ! 6: */ ! 7: ! 8: /* $Log: CHenumerate.c,v $ ! 9: * Revision 2.0 85/11/21 07:22:30 jqj ! 10: * 4.3BSD standard release ! 11: * ! 12: * Revision 1.1 85/03/26 06:26:59 jqj ! 13: * Initial revision ! 14: * ! 15: * Revision 1.1 85/03/26 06:26:59 jqj ! 16: * Initial revision ! 17: * ! 18: */ ! 19: #include <sys/types.h> ! 20: #include <netns/ns.h> ! 21: #include "Clearinghouse2_defs.h" ! 22: #include <xnscourier/CHEntries.h> ! 23: #include <xnscourier/except.h> ! 24: ! 25: /* ! 26: * This module contains the routine: ! 27: * int CH_Enumerate(pattern,property,eachName) ! 28: * ObjectNamePattern pattern; ! 29: * Property property; ! 30: * NameProcedure eachName; ! 31: * where NameProcedure is a procedure of the form: ! 32: * int eachName(name) ! 33: * Object name; ! 34: */ ! 35: #define MAXPACKS 5 ! 36: ! 37: static (*ProcEachName)(); /* use: (*ProcEachName)(arg); */ ! 38: static Cardinal nullhash = 0; ! 39: static Authenticator nullagent = {{0,{0,(Unspecified*) 0}}, ! 40: {1,&nullhash}}; ! 41: static ObjectName currentname; ! 42: extern struct ns_addr *LookupCHAddr(); ! 43: ! 44: static ! 45: listObject(name) ! 46: ObjectName name; ! 47: { ! 48: printf("%s:%s:%s\n", name.object, name.domain, name.organization); ! 49: } ! 50: ! 51: static ! 52: GetObjects(conn) ! 53: CourierConnection *conn; ! 54: { ! 55: int count, i; ! 56: Unspecified buffer[MAXWORDS*MAXPACKS], *bp, *bufend; ! 57: StreamOfObject obnames; ! 58: ! 59: bufend = buffer; ! 60: bp = buffer+((MAXWORDS-1)*MAXPACKS); /* end of available space */ ! 61: while (count = BDTread(conn, (char*)bufend, ! 62: MAXWORDS*sizeof(Unspecified)) ! 63: ) { ! 64: bufend += count/sizeof(Unspecified); ! 65: if (bufend > bp) { ! 66: fprintf(stderr,"BDT read too big to fit\n"); ! 67: BDTabort(conn); ! 68: /* should clear out stuff here if we knew how much */ ! 69: } ! 70: } ! 71: bp = buffer; ! 72: while (bp < bufend) { ! 73: bp += internalize_StreamOfObject(&obnames,bp); ! 74: if (0 == (int) obnames.designator) { ! 75: for (i=0; i < obnames.nextSegment_case.segment.length; i++) { ! 76: currentname.object = ! 77: obnames.nextSegment_case.segment.sequence[i]; ! 78: (*ProcEachName)(currentname); ! 79: } ! 80: free(obnames.nextSegment_case.segment.sequence); ! 81: } else { ! 82: for (i = 0; i < obnames.lastSegment_case.length; i++) { ! 83: currentname.object = ! 84: obnames.lastSegment_case.sequence[i]; ! 85: (*ProcEachName)(currentname); ! 86: } ! 87: free(obnames.lastSegment_case.sequence); ! 88: return; ! 89: } ! 90: } ! 91: } ! 92: ! 93: CH_Enumerate(pattern,property,eachName) ! 94: ObjectNamePattern pattern; ! 95: Property property; ! 96: int (*eachName)(); ! 97: { ! 98: CourierConnection *conn; ! 99: extern CourierConnection *CH_GetFirstCH(); ! 100: ! 101: if (eachName != NULL) ! 102: ProcEachName = eachName; ! 103: else ! 104: ProcEachName = listObject; ! 105: if (pattern.object == NULL || ! 106: pattern.domain == NULL || ! 107: pattern.organization == NULL) ! 108: return(1); ! 109: currentname.domain = pattern.domain; ! 110: currentname.organization = pattern.organization; ! 111: ! 112: if ((conn = CH_GetFirstCH()) == NULL) { ! 113: fprintf(stderr,"Can't open connection to local Clearinghouse\n"); ! 114: return(1); ! 115: } ! 116: DURING { ! 117: ListObjects(conn, GetObjects, pattern, property, ! 118: BulkData1_immediateSink, nullagent); ! 119: } HANDLER { ! 120: return(Exception.Code); /* some random error */ ! 121: /* should handle WrongServer here */ ! 122: } END_HANDLER; ! 123: CourierClose(conn); ! 124: return(0); ! 125: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.