Let all .asn depend on yaz-asncomp
[yaz-moved-to-github.git] / src / zget.c
1 /*
2  * Copyright (C) 1995-2005, Index Data ApS
3  * See the file LICENSE for details.
4  *
5  * $Id: zget.c,v 1.11 2005-06-25 15:46:06 adam Exp $
6  */
7 /**
8  * \file zget.c
9  * \brief Implements Z39.50 package creator utilities
10  */
11
12 #include <yaz/proto.h>
13
14 Z_InitRequest *zget_InitRequest(ODR o)
15 {
16     Z_InitRequest *r = (Z_InitRequest *)odr_malloc(o, sizeof(*r));
17
18     r->referenceId = 0;
19     r->options = (Odr_bitmask *)odr_malloc(o, sizeof(*r->options));
20     ODR_MASK_ZERO(r->options);
21     r->protocolVersion = (Odr_bitmask *)
22         odr_malloc(o, sizeof(*r->protocolVersion));
23
24     ODR_MASK_SET(r->options, Z_Options_search);
25     ODR_MASK_SET(r->options, Z_Options_present);
26
27     ODR_MASK_ZERO(r->protocolVersion);
28
29     ODR_MASK_SET(r->protocolVersion, Z_ProtocolVersion_1);
30     ODR_MASK_SET(r->protocolVersion, Z_ProtocolVersion_2);
31
32     r->preferredMessageSize = odr_intdup(o, 1024*1024);
33     r->maximumRecordSize = odr_intdup(o, 1024*1024);
34     r->idAuthentication = 0;
35     r->implementationId = "81";
36     r->implementationName = "YAZ";
37     r->implementationVersion = YAZ_VERSION
38 #ifdef YAZ_DATE_STR
39     " (" YAZ_DATE_STR ")"
40 #endif
41 #ifdef YAZ_OS
42     " " YAZ_OS
43 #endif
44         ;
45     r->userInformationField = 0;
46     r->otherInfo = 0;
47     return r;
48 }
49
50 Z_InitResponse *zget_InitResponse(ODR o)
51 {
52     Z_InitResponse *r = (Z_InitResponse *)odr_malloc(o, sizeof(*r));
53
54     r->referenceId = 0;
55     r->options = (Odr_bitmask *)odr_malloc(o, sizeof(*r->options));
56     ODR_MASK_ZERO(r->options);
57     r->protocolVersion = (Odr_bitmask *)odr_malloc(o, sizeof(*r->protocolVersion));
58     ODR_MASK_ZERO(r->protocolVersion);
59     r->preferredMessageSize = odr_intdup(o, 30*1024);
60     r->maximumRecordSize = odr_intdup(o, 30*1024);
61     r->result = odr_intdup(o, 1);
62     r->implementationId = "81";
63     r->implementationName = "YAZ";
64     r->implementationVersion = YAZ_VERSION
65 #ifdef YAZ_DATE_STR
66     " (" YAZ_DATE_STR ")"
67 #endif
68 #ifdef YAZ_OS
69     " " YAZ_OS
70 #endif
71         ;
72     r->userInformationField = 0;
73     r->otherInfo = 0;
74     return r;
75 }
76
77 Z_SearchRequest *zget_SearchRequest(ODR o)
78 {
79     Z_SearchRequest *r = (Z_SearchRequest *)odr_malloc(o, sizeof(*r));
80
81     r->referenceId = 0;
82     r->smallSetUpperBound = odr_intdup(o, 0);
83     r->largeSetLowerBound = odr_intdup(o, 1);
84     r->mediumSetPresentNumber = odr_intdup(o, 0);
85     r->replaceIndicator = odr_intdup(o, 1);
86     r->resultSetName = "default";
87     r->num_databaseNames = 0;
88     r->databaseNames = 0;
89     r->smallSetElementSetNames = 0;
90     r->mediumSetElementSetNames = 0;
91     r->preferredRecordSyntax = 0;
92     r->query = 0;
93     r->additionalSearchInfo = 0;
94     r->otherInfo = 0;
95     return r;
96 }
97
98 Z_SearchResponse *zget_SearchResponse(ODR o)
99 {
100     Z_SearchResponse *r = (Z_SearchResponse *)odr_malloc(o, sizeof(*r));
101
102     r->referenceId = 0;
103     r->resultCount = odr_intdup(o, 0);
104     r->numberOfRecordsReturned = odr_intdup(o, 0);
105     r->nextResultSetPosition = odr_intdup(o, 0);
106     r->searchStatus = odr_intdup(o, 1);
107     r->resultSetStatus = 0;
108     r->presentStatus = 0;
109     r->records = 0;
110     r->additionalSearchInfo = 0;
111     r->otherInfo = 0;
112     return r;
113 }
114
115 Z_PresentRequest *zget_PresentRequest(ODR o)
116 {
117     Z_PresentRequest *r = (Z_PresentRequest *)odr_malloc(o, sizeof(*r));
118
119     r->referenceId = 0;
120     r->resultSetId = "default";
121     r->resultSetStartPoint = odr_intdup(o, 1);
122     r->numberOfRecordsRequested = odr_intdup(o, 10);
123     r->num_ranges = 0;
124     r->additionalRanges = 0;
125     r->recordComposition = 0;
126     r->preferredRecordSyntax = 0;
127     r->maxSegmentCount = 0;
128     r->maxRecordSize = 0;
129     r->maxSegmentSize = 0;
130     r->otherInfo = 0;
131     return r;
132 }
133
134 Z_PresentResponse *zget_PresentResponse(ODR o)
135 {
136     Z_PresentResponse *r = (Z_PresentResponse *)odr_malloc(o, sizeof(*r));
137
138     r->referenceId = 0;
139     r->numberOfRecordsReturned = odr_intdup(o, 0);
140     r->nextResultSetPosition = odr_intdup(o, 0);
141     r->presentStatus = odr_intdup(o, Z_PresentStatus_success);
142     r->records = 0;
143     r->otherInfo = 0;
144     return r;
145 }
146
147 Z_DeleteResultSetRequest *zget_DeleteResultSetRequest(ODR o)
148 {
149     Z_DeleteResultSetRequest *r = (Z_DeleteResultSetRequest *)
150         odr_malloc(o, sizeof(*r));
151
152     r->referenceId = 0;
153     r->deleteFunction = odr_intdup(o, Z_DeleteResultSetRequest_list);
154     r->num_resultSetList = 0;
155     r->resultSetList = 0;
156     r->otherInfo = 0;
157     return r;
158 }
159
160 Z_DeleteResultSetResponse *zget_DeleteResultSetResponse(ODR o)
161 {
162     Z_DeleteResultSetResponse *r = (Z_DeleteResultSetResponse *)
163         odr_malloc(o, sizeof(*r));
164     
165     r->referenceId = 0;
166     r->deleteOperationStatus = odr_intdup(o, Z_DeleteStatus_success);
167     r->deleteListStatuses = 0;
168     r->numberNotDeleted = 0;
169     r->bulkStatuses = 0;
170     r->deleteMessage = 0;
171     r->otherInfo = 0;
172     return r;
173 }
174
175 Z_ScanRequest *zget_ScanRequest(ODR o)
176 {
177     Z_ScanRequest *r = (Z_ScanRequest *)odr_malloc(o, sizeof(*r));
178     
179     r->referenceId = 0;
180     r->num_databaseNames = 0;
181     r->databaseNames = 0;
182     r->attributeSet = 0;
183     r->termListAndStartPoint = 0;
184     r->stepSize = 0;
185     r->numberOfTermsRequested = odr_intdup(o, 20);
186     r->preferredPositionInResponse = 0;
187     r->otherInfo = 0;
188     return r;
189 }
190
191 Z_ScanResponse *zget_ScanResponse(ODR o)
192 {
193     Z_ScanResponse *r = (Z_ScanResponse *)odr_malloc(o, sizeof(*r));
194     
195     r->referenceId = 0;
196     r->stepSize = 0;
197     r->scanStatus = odr_intdup(o, Z_Scan_success);
198     r->numberOfEntriesReturned = odr_intdup(o, 0);
199     r->positionOfTerm =0;
200     r->entries = 0;
201     r->attributeSet = 0;
202     r->otherInfo = 0;
203     return r;
204 }
205
206 Z_TriggerResourceControlRequest *zget_TriggerResourceControlRequest(ODR o)
207 {
208     Z_TriggerResourceControlRequest *r = (Z_TriggerResourceControlRequest *)
209         odr_malloc(o, sizeof(*r));
210     
211     r->referenceId = 0;
212     r->requestedAction = odr_intdup(o, Z_TriggerResourceControlRequest_resourceReport);
213     r->prefResourceReportFormat = 0;
214     r->resultSetWanted = 0;
215     r->otherInfo = 0;
216     return r;
217 }
218
219 Z_ResourceControlRequest *zget_ResourceControlRequest(ODR o)
220 {
221     Z_ResourceControlRequest *r = (Z_ResourceControlRequest *)
222         odr_malloc(o, sizeof(*r));
223
224     r->referenceId = 0;
225     r->suspendedFlag = 0;
226     r->resourceReport = 0;
227     r->partialResultsAvailable = 0;
228     r->responseRequired = odr_intdup(o, 0);
229     r->triggeredRequestFlag = 0;
230     r->otherInfo = 0;
231     return r;
232 }
233
234 Z_ResourceControlResponse *zget_ResourceControlResponse(ODR o)
235 {
236     Z_ResourceControlResponse *r = (Z_ResourceControlResponse *)
237         odr_malloc(o, sizeof(*r));
238
239     r->referenceId = 0;
240     r->continueFlag = odr_intdup(o, 1);
241     r->resultSetWanted = 0;
242     r->otherInfo = 0;
243     return r;
244 }
245
246 Z_AccessControlRequest *zget_AccessControlRequest(ODR o)
247 {
248     Z_AccessControlRequest *r = (Z_AccessControlRequest *)
249         odr_malloc(o, sizeof(*r));
250
251     r->referenceId = 0;
252     r->which = Z_AccessControlRequest_simpleForm;
253     r->u.simpleForm = 0;
254     r->otherInfo = 0;
255     return r;
256 }
257
258 Z_AccessControlResponse *zget_AccessControlResponse(ODR o)
259 {
260     Z_AccessControlResponse *r = (Z_AccessControlResponse *)
261         odr_malloc(o, sizeof(*r));
262
263     r->referenceId = 0;
264     r->which = Z_AccessControlResponse_simpleForm;
265     r->u.simpleForm = 0;
266     r->diagnostic = 0;
267     r->otherInfo = 0;
268     return r;
269 }
270
271 Z_Segment *zget_Segment(ODR o)
272 {
273     Z_Segment *r = (Z_Segment *)odr_malloc(o, sizeof(*r));
274
275     r->referenceId = 0;
276     r->numberOfRecordsReturned = odr_intdup(o, 0);
277     r->num_segmentRecords = 0;
278     r->segmentRecords = (Z_NamePlusRecord **) odr_nullval();
279     r->otherInfo = 0;
280     return r;
281 }
282
283 Z_Close *zget_Close(ODR o)
284 {
285     Z_Close *r = (Z_Close *)odr_malloc(o, sizeof(*r));
286
287     r->referenceId = 0;
288     r->closeReason = odr_intdup(o, Z_Close_finished);
289     r->diagnosticInformation = 0;
290     r->resourceReportFormat = 0;
291     r->resourceReport = 0;
292     r->otherInfo = 0;
293     return r;
294 }
295
296 Z_ResourceReportRequest *zget_ResourceReportRequest(ODR o)
297 {
298     Z_ResourceReportRequest *r = (Z_ResourceReportRequest *)
299         odr_malloc(o, sizeof(*r));
300
301     r->referenceId = 0;
302     r->opId = 0;
303     r->prefResourceReportFormat = 0;
304     r->otherInfo = 0;
305     return r;
306 }
307
308 Z_ResourceReportResponse *zget_ResourceReportResponse(ODR o)
309 {
310     Z_ResourceReportResponse *r = (Z_ResourceReportResponse *)
311         odr_malloc(o, sizeof(*r));
312
313     r->referenceId = 0;
314     r->resourceReportStatus = odr_intdup(o, Z_ResourceReportResponse_success);
315     r->resourceReport = 0;
316     r->otherInfo = 0;
317     return r;
318 }
319
320 Z_SortRequest *zget_SortRequest(ODR o)
321 {
322     Z_SortRequest *r = (Z_SortRequest *)odr_malloc(o, sizeof(*r));
323
324     r->referenceId = 0;
325     r->inputResultSetNames = 0;
326     r->sortedResultSetName = 0;
327     r->sortSequence = 0;
328     r->otherInfo = 0;
329     return r;
330 }
331
332 Z_SortResponse *zget_SortResponse(ODR o)
333 {
334     Z_SortResponse *r = (Z_SortResponse *)odr_malloc(o, sizeof(*r));
335
336     r->referenceId = 0;
337     r->sortStatus = odr_intdup(o, Z_SortResponse_success);
338     r->resultSetStatus = odr_intdup(o, Z_SortResponse_empty);
339     r->diagnostics = 0;
340     r->resultCount = 0;
341     r->otherInfo = 0;
342     return r;
343 }
344
345 Z_ExtendedServicesRequest *zget_ExtendedServicesRequest(ODR o)
346 {
347     Z_ExtendedServicesRequest *r = (Z_ExtendedServicesRequest *)
348         odr_malloc(o, sizeof(*r));
349
350     r->referenceId = 0;
351     r->function = odr_intdup(o, Z_ExtendedServicesRequest_create);
352     r->packageType = 0;
353     r->packageName = 0;
354     r->userId = 0;
355     r->retentionTime = 0;
356     r->permissions = 0;
357     r->description = 0;
358     r->taskSpecificParameters = 0;
359     r->waitAction = odr_intdup(o, Z_ExtendedServicesRequest_waitIfPossible);
360     r->elements = 0;
361     r->otherInfo = 0;
362     return r;
363 }
364
365 Z_ExtendedServicesResponse *zget_ExtendedServicesResponse(ODR o)
366 {
367     Z_ExtendedServicesResponse *r = (Z_ExtendedServicesResponse *)
368         odr_malloc(o, sizeof(*r));
369
370     r->referenceId = 0;
371     r->operationStatus = odr_intdup(o, Z_ExtendedServicesResponse_done);
372     r->num_diagnostics = 0;
373     r->diagnostics = 0;
374     r->taskPackage = 0;
375     r->otherInfo = 0;
376     return r;
377 }
378
379 Z_DuplicateDetectionRequest *zget_DuplicateDetectionRequest(ODR o)
380 {
381     Z_DuplicateDetectionRequest *r = (Z_DuplicateDetectionRequest *)
382         odr_malloc(o, sizeof(*r));
383     
384     r->referenceId = 0;
385     r->num_inputResultSetIds = 0;
386     r->inputResultSetIds = 0;
387     r->outputResultSetName = 0;
388     r->applicablePortionOfRecord = 0;
389     r->num_duplicateDetectionCriteria = 0;
390     r->duplicateDetectionCriteria = 0;
391     r->clustering = 0;
392     r->num_retentionCriteria = 0;
393     r->retentionCriteria = 0;
394     r->num_sortCriteria = 0;
395     r->sortCriteria = 0;
396     r->otherInfo = 0;
397     return r;
398 }
399
400 Z_DuplicateDetectionResponse *zget_DuplicateDetectionResponse(ODR o)
401 {
402     Z_DuplicateDetectionResponse *r = (Z_DuplicateDetectionResponse *)
403         odr_malloc(o, sizeof(*r));
404  
405     r->referenceId = 0;
406     r->status = odr_intdup(o, Z_DuplicateDetectionResponse_success);
407     r->resultSetCount = 0;
408     r->num_diagnostics = 0;
409     r->diagnostics = 0;
410     r->otherInfo = 0;
411     return r;
412 }
413  
414 Z_APDU *zget_APDU(ODR o, int which)
415 {
416     Z_APDU *r = (Z_APDU *)odr_malloc(o, sizeof(*r));
417     
418     switch (r->which = which)
419     {
420     case Z_APDU_initRequest:
421         r->u.initRequest = zget_InitRequest(o);
422         break;
423     case Z_APDU_initResponse:
424         r->u.initResponse = zget_InitResponse(o);
425         break;
426     case Z_APDU_searchRequest:
427         r->u.searchRequest = zget_SearchRequest(o);
428         break;
429     case Z_APDU_searchResponse:
430         r->u.searchResponse = zget_SearchResponse(o);
431         break;
432     case Z_APDU_presentRequest:
433         r->u.presentRequest = zget_PresentRequest(o);
434         break;
435     case Z_APDU_presentResponse:
436         r->u.presentResponse = zget_PresentResponse(o);
437         break;
438     case Z_APDU_deleteResultSetRequest:
439         r->u.deleteResultSetRequest = zget_DeleteResultSetRequest(o);
440         break;
441     case Z_APDU_deleteResultSetResponse:
442         r->u.deleteResultSetResponse = zget_DeleteResultSetResponse(o);
443         break;
444     case Z_APDU_scanRequest:
445         r->u.scanRequest = zget_ScanRequest(o);
446         break;
447     case Z_APDU_scanResponse:
448         r->u.scanResponse = zget_ScanResponse(o);
449         break;
450     case Z_APDU_triggerResourceControlRequest:
451         r->u.triggerResourceControlRequest =
452             zget_TriggerResourceControlRequest(o);
453         break;
454     case Z_APDU_resourceControlRequest:
455         r->u.resourceControlRequest = zget_ResourceControlRequest(o);
456         break;
457     case Z_APDU_resourceControlResponse:
458         r->u.resourceControlResponse = zget_ResourceControlResponse(o);
459         break;
460     case Z_APDU_segmentRequest:
461         r->u.segmentRequest = zget_Segment(o);
462         break;
463     case Z_APDU_close:
464         r->u.close = zget_Close(o);
465         break;
466     case Z_APDU_accessControlRequest:
467         r->u.accessControlRequest = zget_AccessControlRequest(o);
468         break;
469     case Z_APDU_accessControlResponse:
470         r->u.accessControlResponse = zget_AccessControlResponse(o);
471         break;
472     case Z_APDU_resourceReportRequest:
473         r->u.resourceReportRequest = zget_ResourceReportRequest(o);
474         break;
475     case Z_APDU_resourceReportResponse:
476         r->u.resourceReportResponse = zget_ResourceReportResponse(o);
477         break;
478     case Z_APDU_sortRequest:
479         r->u.sortRequest = zget_SortRequest(o);
480         break;
481     case Z_APDU_sortResponse:
482         r->u.sortResponse = zget_SortResponse(o);
483         break;
484     case Z_APDU_extendedServicesRequest:
485         r->u.extendedServicesRequest = zget_ExtendedServicesRequest(o);
486         break;
487     case Z_APDU_extendedServicesResponse:
488         r->u.extendedServicesResponse = zget_ExtendedServicesResponse(o);
489         break;
490     case Z_APDU_duplicateDetectionRequest:
491         r->u.duplicateDetectionRequest = zget_DuplicateDetectionRequest(o);
492         break;
493     case Z_APDU_duplicateDetectionResponse:
494         r->u.duplicateDetectionResponse = zget_DuplicateDetectionResponse(o);
495         break;
496     default:
497         return 0;
498     }
499     return r;
500 }
501
502 Z_DefaultDiagFormat *zget_DefaultDiagFormat(ODR o, int error,
503                                             const char *addinfo)
504 {
505     Z_DefaultDiagFormat *dr = (Z_DefaultDiagFormat *) 
506         odr_malloc (o, sizeof(*dr));
507     
508     dr->diagnosticSetId = yaz_oidval_to_z3950oid (o, CLASS_DIAGSET, VAL_BIB1);
509     dr->condition = odr_intdup(o, error);
510     dr->which = Z_DefaultDiagFormat_v2Addinfo;
511     dr->u.v2Addinfo = odr_strdup (o, addinfo ? addinfo : "");
512     return dr;
513 }
514
515 Z_DiagRec *zget_DiagRec(ODR o, int error, const char *addinfo)
516 {
517     Z_DiagRec *dr = (Z_DiagRec*) odr_malloc(o, sizeof(*dr));
518     dr->which = Z_DiagRec_defaultFormat;
519     dr->u.defaultFormat = zget_DefaultDiagFormat(o, error, addinfo);
520     return dr;
521 }
522
523 Z_DiagRecs *zget_DiagRecs(ODR o, int error, const char *addinfo)
524 {
525     Z_DiagRecs *drecs = (Z_DiagRecs*) odr_malloc(o, sizeof(*drecs));
526     Z_DiagRec **dr = (Z_DiagRec**) odr_malloc(o, sizeof(**dr));
527     drecs->diagRecs = dr;
528     dr[0] = zget_DiagRec(o, error, addinfo);
529     drecs->num_diagRecs = 1;
530     return drecs;
531 }
532
533 Z_NamePlusRecord *zget_surrogateDiagRec(ODR o, const char *dbname,
534                                         int error, const char *addinfo)
535 {
536     Z_NamePlusRecord *rec = (Z_NamePlusRecord *) odr_malloc (o, sizeof(*rec));
537     Z_DiagRec *drec = (Z_DiagRec *)odr_malloc (o, sizeof(*drec));
538     
539     if (dbname)
540         rec->databaseName = odr_strdup(o, dbname);
541     else
542         rec->databaseName = 0;
543     rec->which = Z_NamePlusRecord_surrogateDiagnostic;
544     rec->u.surrogateDiagnostic = drec;
545     drec->which = Z_DiagRec_defaultFormat;
546     drec->u.defaultFormat = zget_DefaultDiagFormat(o, error, addinfo);
547     return rec;
548 }
549
550 Z_External *zget_init_diagnostics(ODR odr, int error, const char *addinfo)
551 {
552     Z_External *x, *x2;
553     oident oid;
554     Z_OtherInformation *u;
555     Z_OtherInformationUnit *l;
556     Z_DiagnosticFormat *d;
557     Z_DiagnosticFormat_s *e;
558
559     x = (Z_External*) odr_malloc(odr, sizeof *x);
560     x->descriptor = 0;
561     x->indirect_reference = 0;  
562     oid.proto = PROTO_Z3950;
563     oid.oclass = CLASS_USERINFO;
564     oid.value = VAL_USERINFO1;
565     x->direct_reference = odr_oiddup(odr, oid_getoidbyent(&oid));
566     x->which = Z_External_userInfo1;
567
568     u = odr_malloc(odr, sizeof *u);
569     x->u.userInfo1 = u;
570     u->num_elements = 1;
571     u->list = (Z_OtherInformationUnit**) odr_malloc(odr, sizeof *u->list);
572     u->list[0] = (Z_OtherInformationUnit*) odr_malloc(odr, sizeof *u->list[0]);
573     l = u->list[0];
574     l->category = 0;
575     l->which = Z_OtherInfo_externallyDefinedInfo;
576
577     x2 = (Z_External*) odr_malloc(odr, sizeof *x);
578     l->information.externallyDefinedInfo = x2;
579     x2->descriptor = 0;
580     x2->indirect_reference = 0;
581     oid.oclass = CLASS_DIAGSET;
582     oid.value = VAL_DIAG1;
583     x2->direct_reference = odr_oiddup(odr, oid_getoidbyent(&oid));
584     x2->which = Z_External_diag1;
585
586     d = (Z_DiagnosticFormat*) odr_malloc(odr, sizeof *d);
587     x2->u.diag1 = d;
588     d->num = 1;
589     d->elements = (Z_DiagnosticFormat_s**) odr_malloc (odr, sizeof *d->elements);
590     d->elements[0] = (Z_DiagnosticFormat_s*) odr_malloc (odr, sizeof *d->elements[0]);
591     e = d->elements[0];
592
593     e->which = Z_DiagnosticFormat_s_defaultDiagRec;
594     e->u.defaultDiagRec = zget_DefaultDiagFormat(odr, error, addinfo);
595     e->message = 0;
596     return x;
597 }
598
599 Z_External *zget_init_diagnostics_octet(ODR odr, int error,
600                                         const char *addinfo)
601 {
602     Z_External *x, *x2;
603     oident oid;
604     Z_OtherInformation *u;
605     Z_OtherInformationUnit *l;
606     Z_DiagnosticFormat *d;
607     Z_DiagnosticFormat_s *e;
608     char *octet_buf;
609     int octet_len;
610     ODR encode;
611
612     u = odr_malloc(odr, sizeof *u);
613     u->num_elements = 1;
614     u->list = (Z_OtherInformationUnit**) odr_malloc(odr, sizeof *u->list);
615     u->list[0] = (Z_OtherInformationUnit*) odr_malloc(odr, sizeof *u->list[0]);
616     l = u->list[0];
617     l->category = 0;
618     l->which = Z_OtherInfo_externallyDefinedInfo;
619
620     x2 = (Z_External*) odr_malloc(odr, sizeof *x);
621     l->information.externallyDefinedInfo = x2;
622     x2->descriptor = 0;
623     x2->indirect_reference = 0;
624     oid.oclass = CLASS_DIAGSET;
625     oid.proto = PROTO_Z3950;
626     oid.value = VAL_DIAG1;
627     x2->direct_reference = odr_oiddup(odr, oid_getoidbyent(&oid));
628     x2->which = Z_External_diag1;
629
630     d = (Z_DiagnosticFormat*) odr_malloc(odr, sizeof *d);
631     x2->u.diag1 = d;
632     d->num = 1;
633     d->elements = (Z_DiagnosticFormat_s**) odr_malloc (odr, sizeof *d->elements);
634     d->elements[0] = (Z_DiagnosticFormat_s*) odr_malloc (odr, sizeof *d->elements[0]);
635     e = d->elements[0];
636
637     e->which = Z_DiagnosticFormat_s_defaultDiagRec;
638     e->u.defaultDiagRec = zget_DefaultDiagFormat(odr, error, addinfo);
639     e->message = 0;
640
641     encode = odr_createmem(ODR_ENCODE);
642
643     z_OtherInformation(encode, &u, 0, 0);
644
645     octet_buf = odr_getbuf(encode, &octet_len, 0);
646
647     x = (Z_External*) odr_malloc(odr, sizeof *x);
648     x->descriptor = 0;
649     x->indirect_reference = 0;  
650     oid.proto = PROTO_Z3950;
651     oid.oclass = CLASS_USERINFO;
652     oid.value = VAL_USERINFO1;
653     x->direct_reference = odr_oiddup(odr, oid_getoidbyent(&oid));
654
655     x->which = Z_External_octet;
656     x->u.octet_aligned = (Odr_oct *) odr_malloc(odr, sizeof(Odr_oct));
657     x->u.octet_aligned->buf = odr_malloc(odr, octet_len);
658     memcpy(x->u.octet_aligned->buf, octet_buf, octet_len);
659     x->u.octet_aligned->len = octet_len;
660
661     odr_destroy(encode);
662
663     return x;
664 }
665
666 /*
667  * Local variables:
668  * c-basic-offset: 4
669  * indent-tabs-mode: nil
670  * End:
671  * vim: shiftwidth=4 tabstop=8 expandtab
672  */
673