Libinfo-78.tar.gz
[apple/libinfo.git] / netinfo.subproj / ni_prot.x
1 /*
2  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3  *
4  * @APPLE_LICENSE_HEADER_START@
5  * 
6  * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
7  * Reserved.  This file contains Original Code and/or Modifications of
8  * Original Code as defined in and that are subject to the Apple Public
9  * Source License Version 1.1 (the "License").  You may not use this file
10  * except in compliance with the License.  Please obtain a copy of the
11  * License at http://www.apple.com/publicsource and read it before using
12  * this file.
13  * 
14  * The Original Code and all software distributed under the License are
15  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
19  * License for the specific language governing rights and limitations
20  * under the License.
21  * 
22  * @APPLE_LICENSE_HEADER_END@
23  */
24 /* 
25  * NetInfo protocol specification
26  * Copyright (C) 1989 by NeXT, Inc.
27  */
28
29 /* Preamble appearing on all generated output */
30 #ifndef NOPREAMBLE
31 %/*
32 % * Output of the RPC protocol compiler: DO NOT EDIT
33 % * Copyright (C) 1989 by NeXT, Inc.
34 % */
35 #endif
36
37 #ifndef RPC_HDR
38 %#include <string.h>
39 #endif
40
41 const NI_NAME_MAXLEN = 65535;
42 const NI_NAMELIST_MAXLEN = 65535;
43 const NI_PROPLIST_MAXLEN = 65535;
44 const NI_IDLIST_MAXLEN = 1048576;
45
46 /*
47  * Every object has a unique ID. One part of the ID identifies the object
48  * itself. The other identifies the instance of the object. Every time
49  * an object is written or an object is destroyed and then reallocated, 
50  * its instance is incremented. 
51  *
52  * All read operations ignore the instance field. All write operations 
53  * refuse to operate on the object if there is an instance mismatch.
54  */
55
56 /*
57  * Don't go through unnecessary overhead for xdr_ni_index using typedef
58  * rpcgen needs an optimizer so we don't have to do this!
59  */
60 #ifdef RPC_HDR
61 %typedef unsigned long ni_index;
62 #endif
63 #define ni_index unsigned long
64
65 struct ni_id {
66         ni_index nii_object;
67         ni_index nii_instance;
68 };
69
70
71 /*
72  * Names are assumed to contain human-readable ASCII characters.
73  */
74 typedef string ni_name<NI_NAME_MAXLEN>;
75
76
77 typedef ni_name ni_namelist<NI_NAMELIST_MAXLEN>;
78
79 /*
80  * A property
81  */
82 struct ni_property {
83         ni_name nip_name;
84         ni_namelist nip_val;
85 };
86
87 /*
88  * A list of properties
89  */
90 typedef ni_property ni_proplist<NI_PROPLIST_MAXLEN>;
91
92 /*
93  * A list of IDs (yet another variable-length array)
94  */
95 typedef ni_index ni_idlist<NI_IDLIST_MAXLEN>;
96
97
98 /*
99  * A name object
100  */
101 struct ni_object {
102         ni_id nio_id;
103         ni_proplist nio_props;
104         ni_index nio_parent;
105         ni_idlist nio_children;
106 };
107
108
109 /*
110  * All operations return a status indicating either that the requested 
111  * operation succeeded or why it failed.
112  */
113 enum ni_status {
114         NI_OK,          /* Operation succeeded */
115         NI_BADID,       /* ID is invalid */
116         NI_STALE,       /* Write attempted on stale version of object */
117         NI_NOSPACE,     /* No space available for write operation */
118         NI_PERM,        /* Permission denied */
119         NI_NODIR,       /* No such directory */
120         NI_NOPROP,      /* No such property */
121         NI_NONAME,      /* No such name */
122         NI_NOTEMPTY,    /* Cannot delete name object with children */
123         NI_UNRELATED,   /* Object is not child of parent: cannot destroy */
124         NI_SERIAL,      /* Serialization error */
125         NI_NETROOT,     /* Hit network root domain */
126         NI_NORESPONSE,  /* No response from remote parent */
127         NI_RDONLY,      /* No writes allowed: all objects are read-only */
128         NI_SYSTEMERR,   /* generic remote error */
129         NI_ALIVE,       /* Can't regenerate: already in use */
130         NI_NOTMASTER,   /* Operation makes no sense on clone */
131         NI_CANTFINDADDRESS, /* Can't find address of server */
132         NI_DUPTAG,      /* Duplicate domain tag: can't serve it */
133         NI_NOTAG,       /* No such tag */
134         NI_AUTHERROR,   /* Authentication error */
135         NI_NOUSER,      /* No such user */
136         NI_MASTERBUSY,  /* Master server is busy */
137         NI_INVALIDDOMAIN,       /* Invalid Domain */
138         NI_BADOP,        /* Invalid operation on master */
139         NI_FAILED = 9999        /* generic local error */
140 };
141
142 /*
143  * Wrappers needed to handle arguments and results
144  */
145 union ni_id_res switch (ni_status status) {
146 case NI_OK:
147         ni_id id;
148 default:
149         void;
150 };
151
152 struct ni_parent_stuff {
153         ni_index object_id;
154         ni_id self_id;
155 };
156
157 union ni_parent_res switch (ni_status status) {
158 case NI_OK:
159         struct ni_parent_stuff stuff;
160 default:
161         void;
162 };
163
164 struct ni_children_stuff {
165         ni_idlist children;
166         ni_id self_id;
167 };
168
169 union ni_children_res switch (ni_status status) {
170 case NI_OK:
171         ni_children_stuff stuff;
172 default:
173         void;
174 };
175
176 struct ni_entry {
177         ni_index id;
178         ni_namelist *names;
179 };
180
181 typedef ni_entry ni_entrylist<NI_IDLIST_MAXLEN>;
182
183 struct ni_list_stuff {
184         ni_entrylist entries;
185         ni_id self_id;
186 };
187
188 union ni_list_res switch (ni_status status) {
189 case NI_OK:
190         ni_list_stuff stuff;
191 default:
192         void;
193 };
194
195 struct ni_proplist_stuff {
196         ni_id id;
197         ni_proplist props;
198 };
199
200 struct ni_create_args {
201         ni_id id;
202         ni_proplist props;
203         ni_index where;
204         ni_id *target_id;
205 };
206
207 union ni_proplist_res switch (ni_status status) {
208 case NI_OK:
209         ni_proplist_stuff stuff;
210 default:
211         void;
212 };
213         
214 struct ni_create_stuff {
215         ni_id id;
216         ni_id self_id;
217 };
218
219 union ni_create_res switch (ni_status status) {
220 case NI_OK:
221         ni_create_stuff stuff;
222 default:
223         void;
224 };
225
226 struct ni_destroy_args {
227         ni_id parent_id;
228         ni_id self_id;
229 };
230
231 struct ni_lookup_args {
232         ni_id id;
233         ni_name key;
234         ni_name value;
235 };
236
237 struct ni_lookup_stuff {
238         ni_idlist idlist;
239         ni_id self_id;
240 };
241
242 union ni_lookup_res switch (ni_status status) {
243 case NI_OK:
244         ni_lookup_stuff stuff;
245 default:
246         void;
247 };
248
249
250 struct ni_name_args {
251         ni_id id;
252         ni_name name;
253 };
254
255 struct ni_createprop_args {
256         ni_id id;
257         ni_property prop;
258         ni_index where;
259 };
260
261 struct ni_writeprop_args {
262         ni_id id;
263         ni_index prop_index;
264         ni_namelist values;
265 };
266
267 struct ni_prop_args {
268         ni_id id;
269         ni_index prop_index;
270 };
271
272 struct ni_namelist_stuff {
273         ni_namelist values;
274         ni_id self_id;
275 };
276
277 union ni_namelist_res switch (ni_status status) {
278 case NI_OK:
279         ni_namelist_stuff stuff;
280 default:
281         void;
282 };
283
284 struct ni_propname_args {
285         ni_id id;
286         ni_index prop_index;
287         ni_name name;
288 };
289
290 struct ni_createname_args {
291         ni_id id;
292         ni_index prop_index;
293         ni_name name;
294         ni_index where;
295 };
296
297 struct ni_nameindex_args {
298         ni_id id;
299         ni_index prop_index;
300         ni_index name_index;
301 };
302
303 struct ni_writename_args {
304         ni_id id;
305         ni_index prop_index;
306         ni_index name_index;
307         ni_name name;
308 };
309
310 struct ni_readname_stuff {
311         ni_id id;
312         ni_name name;
313 };
314
315 union ni_readname_res switch (ni_status status) {
316 case NI_OK:
317         ni_readname_stuff stuff;
318 default:
319         void;
320 };
321
322 struct ni_binding {
323         ni_name tag;
324         unsigned addr;
325 };
326
327 union ni_rparent_res switch (ni_status status) {
328 case NI_OK:
329         ni_binding binding;
330 default:
331         void;
332 };
333
334 typedef struct ni_object_node *ni_object_list;
335 struct ni_object_node {
336         ni_object object;
337         ni_object_list next;
338 };
339
340 struct ni_readall_stuff {
341         unsigned checksum;
342         ni_index highestid;
343         ni_object_list list;
344 };
345         
346 union ni_readall_res switch (ni_status status) {
347 case NI_OK:
348         ni_readall_stuff stuff;
349 default:
350         void;
351 };
352
353 typedef ni_proplist ni_proplist_list<NI_IDLIST_MAXLEN>;
354
355 struct ni_listall_stuff {
356         ni_id self_id;
357         ni_proplist_list entries;
358 };
359
360 union ni_listall_res switch (ni_status status) {
361 case NI_OK:
362         ni_listall_stuff stuff;
363 default:
364         void;
365 };
366
367
368 program NI_PROG {
369         version NI_VERS {
370                 void
371                 _NI_PING(void) = 0;
372                 /*
373                  * Get various server statistics
374                  */
375                 ni_proplist
376                 _NI_STATISTICS(void) = 1;
377
378                 /*
379                  * Procedures dealing with nodes
380                  */
381                 ni_id_res
382                 _NI_ROOT(void) = 2;
383
384                 ni_id_res
385                 _NI_SELF(ni_id) = 3;
386
387                 ni_parent_res
388                 _NI_PARENT(ni_id) = 4;  
389
390                 ni_create_res
391                 _NI_CREATE(ni_create_args) = 5; 
392
393                 ni_id_res
394                 _NI_DESTROY(ni_destroy_args) = 6; 
395
396                 ni_proplist_res
397                 _NI_READ(ni_id) = 7;
398
399                 ni_id_res
400                 _NI_WRITE(ni_proplist_stuff) = 8;
401
402                 ni_children_res
403                 _NI_CHILDREN(ni_id) = 9;
404
405                 ni_lookup_res
406                 _NI_LOOKUP(ni_lookup_args) = 10; 
407
408                 ni_list_res
409                 _NI_LIST(ni_name_args) = 11;
410
411                 /*
412                  * Procedures dealing with properties
413                  */
414                 ni_id_res
415                 _NI_CREATEPROP(ni_createprop_args) = 12; 
416                 
417                 ni_id_res
418                 _NI_DESTROYPROP(ni_prop_args) = 13; 
419
420                 ni_namelist_res
421                 _NI_READPROP(ni_prop_args) = 14;        
422
423                 ni_id_res
424                 _NI_WRITEPROP(ni_writeprop_args) = 15;
425
426                 ni_id_res
427                 _NI_RENAMEPROP(ni_propname_args) = 16;
428                 
429                 ni_namelist_res
430                 _NI_LISTPROPS(ni_id) = 17;
431
432                 /*
433                  * Procedures dealing with names
434                  */
435                 ni_id_res
436                 _NI_CREATENAME(ni_createname_args) = 18;
437
438                 ni_id_res
439                 _NI_DESTROYNAME(ni_nameindex_args) = 19;
440
441                 ni_readname_res
442                 _NI_READNAME(ni_nameindex_args) = 20;
443
444                 ni_id_res
445                 _NI_WRITENAME(ni_writename_args) = 21;
446
447                 /*
448                  * Returns the address of this domain's remote parent
449                  */
450                 ni_rparent_res
451                 _NI_RPARENT(void) = 22;
452
453                 /*
454                  * List all properties of each subdirectory, not just
455                  * just a single named property.
456                  *
457                  * WARNING: this routine is dangerous and may be
458                  * removed from future implementations of the protocol.
459                  * While it is good the the network in that there is
460                  * less data on it because a lot is done in a single call, 
461                  * it is bad for the server because it ties it up and locks 
462                  * others out.
463                  */
464                 ni_listall_res
465                 _NI_LISTALL(ni_id) = 23;
466
467                 /*
468                  * Answers only if the given binding is served
469                  */
470                 void
471                 _NI_BIND(ni_binding) = 24;
472                 
473                 /*
474                  * Read the entire database if the checksum is different
475                  * Implemented by master only.
476                  */
477                 ni_readall_res
478                 _NI_READALL(unsigned) = 25;
479
480                 /*
481                  * Informs server that master has crashed. Hands out
482                  * latest checksum.
483                  */
484                 void
485                 _NI_CRASHED(unsigned) = 26;
486
487                 /*
488                  * If master, force clones to resync.
489                  * If clone, resync with master.
490                  */
491                 ni_status
492                 _NI_RESYNC(void) = 27; 
493
494
495                 /*
496                  * Extra procedure added for performance
497                  * Terminates on first hit, returns proplist
498                  */
499                 ni_proplist_res
500                 _NI_LOOKUPREAD(ni_lookup_args) = 28;
501         } = 2;
502 } = 200100000;