More work on documentation.
[egate.git] / doc / egate.sgml
1 <!doctype linuxdoc system>
2
3 <!--
4   $Id: egate.sgml,v 1.6 1995/07/10 13:55:25 adam Exp $
5 -->
6
7 <article>
8 <title>Email/Z39.50 gateway guide
9 <author>Europagate, 1995
10 <date>$Revision: 1.6 $
11 <abstract>
12 This document describes a Email server that provides access to the
13 Z39.50 protocol.
14 </abstract>
15
16 <toc>
17
18 <sect>Introduction
19
20 <p>
21 This document describes an email server subsystem developed
22 within the EUROPAGATE project. The first part of this document
23 serves as an administrators guide, while the second part is a 
24 follow-up on the Design deliverable (WP4.1) that outline the
25 deviations from the design. Also, the second part contains
26 an overview of the source code.
27
28 <sect>Compilation
29
30 <p>
31 An ANSI C compiler is required in order to compile the ES software.
32
33 The ES can use either CNIDR's zdist package or the YAZ package from
34 Index Data to interface the Z39.50 protocol. So you need to obtain
35 either of these first.
36
37 The Zdist package can be found in:
38
39 <url url="ftp://ftp.cnidr.org/pub/NIDR.tools/zdist/zdist102b1-1.tar.Z" >
40
41 The Zdist package doesn't support result-set references. Also, it has a few
42 bugs. Therefore we've included a patch <tt/zdist.patch/ which fixes
43 some of these bugs.
44 Run patch in the directory above <tt/zdist102b1-1/:
45 <tscreen><verb>
46 $ patch <zdist.patch
47 </verb></tscreen>
48
49 YAZ can be found in:
50
51 <url url="ftp://ftp.algonet.se/pub/index/yaz/">.
52
53 The ES also use GNU's regex package to parse regular expressions. 
54 The ES has been tested with regex-0.12. Some systems, such as Linux,
55 comes with the regex package preinstalled.
56
57 Unpack <tt>egate.tar.gz</tt> and edit the top level <tt/Makefile/. Specify
58 where the GNU regex package is located and specify whether you use
59 YAZ or zdist. One some systems, you may have to set the <tt/NETLIB/ as
60 well.
61
62 You may wish to set <tt/CC/ and <tt/CFLAGS/ in your shell, since these
63 will affect the compilation &mdash; these are not set in the <tt/Makefile/.
64
65 Now, type <tt/make/. 
66
67 <sect>Installation
68
69 <p>
70 If the compilation was successful, you should install the software.
71 Edit the <tt/Makefile/ and set the LIBDIR to the installation
72 directory. Since, the ES is executed by the mail system, and not by a
73 user, this directory shouldn't be globally executable.
74
75 When satisfied, type <tt/make install/.
76
77 Three executables are installed in LIBDIR:
78 <descrip>
79 <tag/eti/ The email transport interface. This program receives
80 incoming mail, identifies the user, and delivers the mail request
81 to the monitor or kernel (depending on configuration).
82 <tag/monitor/ The monitor
83  is optional component. The main objective
84 of the monitor is to limit the number of simultanous running kernel
85 processes.
86 <tag/kernel/ The kernel process is the core of the ES. It parses
87 the user's requests and interfaces the Z39.50 protocols.
88 </descrip>
89
90 The <tt/sendmail/ or a similar program delivers the mail to the
91 <tt/eti/ program. The <tt/sendmail/ program usually runs as user
92 <tt/mail/ or some other special user name. We strongly suggest that
93 you create a special user and group for the ES software. In this case
94 you should use <tt/chmod/ to and set the 'set user ID on execution'
95 bits on the executable files and give that user read/write/execute
96 permissions in LIBDIR.
97
98 The mail system needs to know about the ES. Pick some name that serves
99 as the ES user and edit <tt/aliases/ used by your mail system (usually 
100 <tt>usr/lib/aliases</tt>). Now add the following line:
101
102 <tt>es:"|/usr/local/lib/es/eti </tt><em>options</em><tt>"</tt>
103
104 In this example the mail user name was <tt/es/ and the LIBDIR was
105 <tt>/usr/local/lib/es</tt>.
106
107 The ES system can operate with or without the monitor. When using
108 the monitor the number of simultanous running kernels can be
109 controlled. If the <tt>eti</tt> program is started with 
110 two dashes (<tt>--</tt>) it will operate without the monitor and
111 the options specified after the two dashes are transferred to the
112 kernel.
113
114 <sect1>Running with the monitor
115
116 <p>
117 The monitor must be running at all times in this mode. You should
118 start the monitor in one of your boot scripts (rc). For example this
119 might be put in a boot script:
120
121 <tscreen><verb>
122 (cd /usr/local/lib/es; ./monitor -d -l mon.log -- -d -l kernel.log &)
123 </verb></tscreen>
124
125 Here the monitor is started with the options <tt>-d -l mon.log</tt>
126 and the options after the two dashes are transferred to the 
127 kernel. In this mode, the eti should contact the monitor (and not
128 the kernel), so the following might be put in the aliases file:
129
130 <tscreen><verb>
131 es:"|/usr/local/lib/es/eti -c /usr/local/lib/es"
132 </verb></tscreen>
133
134 The eti sets current directory to the path specified by option <tt>-c</tt>.
135
136 <sect1>Running without the monitor
137
138 <p>
139 In this mode you should never start the monitor. 
140 The eti will contact the kernel directly. The following line could
141 be put in your aliases file:
142
143 <tscreen><verb>
144 es:"|/usr/local/lib/es/eti -c /usr/local/lib/es -- -d -l kernel.log"
145 </verb></tscreen>
146
147 <sect1>eti
148
149 <p>
150 The eti program accepts the following options:
151 <descrip>
152 <tag><tt>-l </tt>log</tag> The log file. If absent stderr is used.
153 <tag><tt>-d</tt></tag> Turns on debugging.
154 <tag><tt>-c </tt>dir</tag> Sets current directory to dir.
155 <tag><tt>-H</tt></tag> Help message.
156 <tag><tt>--</tt></tag> Indicates that the eti program should contact the
157 kernel (and not the monitor. All options after this one are transferred
158 to the kernel
159 </descrip>
160
161 <sect1>monitor
162
163 <p>
164 The monitor program accepts the following command line options:
165 <descrip>
166 <tag><tt>-l </tt>log</tag> The log file. If absent stderr is used.
167 <tag><tt>-d</tt></tag> Turns on debugging.
168 <tag><tt>-H</tt></tag> Help message.
169 <tag><tt>--</tt></tag> Precedes options that are transferred to the kernel
170 </descrip>
171
172 The monitor normally reads the resource <tt>default.res</tt> in
173 current directory. You can change this behaviour by specifying an
174 alternate file on the command line.
175
176 <sect1>kernel
177
178 <p>
179 List of options observed by the kernel:
180 <descrip>
181 <tag><tt>-d</tt></tag> Turns on debugging.
182 <tag><tt>-t </tt>target</tag> Opens connection to target (for testing only).
183 <tag><tt>-g </tt>lang</tag> Set language name.
184 <tag><tt>-o </tt>res</tag> Overriding resource file name. These
185 resources override both <tt>default.res</tt> and all user resources.
186 <tag><tt>-h </tt>host</tag> Override host name (for testing only).
187 <tag><tt>-p </tt>port</tag> Override port no (for testing only).
188 <tag><tt>-l </tt>log</tag> Specify log file.
189 <tag><tt>-H</tt></tag> Help message.
190 </descrip>
191
192 The kernel normally reads the resource <tt>default.res</tt> in
193 current directory. You can change this behaviour by specifying an
194 alternate file on the command line.
195
196 <sect>Managing the system
197
198 <sect1>Summary of files
199 <p>
200
201 To maintain the ES you need to know the files it uses. These are:
202 <descrip>
203 <tag>*.res</tag> Resource files with several settings that control
204  how the system operates, such as definition of targets, messages, etc.
205 <tag>*.bib</tag> Bib-1 attribute mapping files. These files describe
206  the mapping between CCL and the RPN query.
207 <tag>user.db</tag> Database of users. Only the eti process accesses
208  this file.
209 <tag>user.*.r</tag> Resource file for a user &mdash; accessed by the kernel
210  &mdash; only created when the user uses the <tt>def</tt> command.
211 <tag>user.*.p</tag> Persistency file for a user &mdash; accessed by
212  the kernel
213  process. 
214 </descrip>
215
216 The ES system is mostly managed by resource files. The following
217 are example resource files that comes with the ES:
218 <descrip>
219 <tag><tt>default.res</tt></tag> General resource with reasonable defaults. 
220  This file is read by the monitor and the kernel.
221 <tag><tt>loc.res</tt></tag> Resource file for Library of Congress test
222  server.
223 <tag><tt>drewdb.res</tt></tag> Resource file for Data Research's test
224  server.
225 <tag><tt>lang.uk.res</tt></tag> Resource file for english conversation.
226 <tag><tt>lang.dk.res</tt></tag> Resource file for danish conversation.
227 </descrip>
228
229 <sect1>Resources
230
231 <p>
232 Most general resources should be set in the file <tt>default.res</tt>. 
233 Some of the resources may be changed (overridden) by the user, while 
234 others may be overridden by individual target defintions. 
235 The complete scenario is depicted below:
236 <tscreen><verb>
237        +-------------+
238        | default.res |
239        +-------------+
240               |          +--------------+
241               |<---------| "target.res" | 
242               |          +--------------+
243               |
244               |          +--------------+
245               |<---------| user.x.res   |
246               |          +--------------+
247               |
248               |          +--------------+
249               |<---------| "lang.res"   |
250               |          +--------------+
251               |
252               |          +--------------+
253               |<---------| "override"   |
254               |          +--------------+
255             result
256 </verb></tscreen>
257
258 The following describes the general resources:
259 <descrip>
260 <tag>gw.reply.mta</tag> Name of MTA program &mdash; default
261  <tt>/usr/lib/sendmail</tt>.
262 <tag>gw.reply.tmp.prefix</tag> Prefix of temporary files used by the ES.
263 <tag>gw.reply.tmp.dir</tag> Name of directory with temporary files.
264 <tag>gw.marc.log</tag> If this resource is specified, retrieved MARC
265  records will be appended to this file.
266 <tag>gw.timeout</tag> Idle time before the kernel exits. When the
267  kernel exits, the Z39.50 persistency layer will reconnect when
268  necessary.
269 <tag>gw.resultset</tag> If this setting is 1, the Z39.50 client will
270  use named result sets. If 0, the Z39.50 system will always use 
271  <tt/Default/ as result-set name.
272 <tag>gw.persist</tag> If this setting 1, the persistency is enabled;
273  disabled otherwise.
274 <tag>gw.max.process</tag> This settings is the maximum number of
275  simultaneous kernel processes &mdash; only used by the monitor.
276 <tag>gw.ignore.which</tag> Some targets doesn't indicate whether
277  a record is a diagnostic messaage or a database record. If this
278  setting is 1, the ES will always try to interpret the record as a
279  database record in ISO2709 format. If 0, the ES will use the
280  record type.
281 <tag>gw.default.show</tag> Default number of records to retrieve and display
282  when using the show command. This setting may be changed by the user
283  with the <tt>def defaultshow</tt> command.
284 <tag>gw.max.show</tag> This setting specifies the maximum number of
285  records the user may retrieve in one show command &mdash; default 100.
286 <tag>gw.autoshow</tag> Number of records to retrieve in a find
287  command &mdash; default 0. This setting may be changed by the user by
288  the <tt>def autoshow</tt> command.
289 <tag>gw.display.format</tag> Default display format. This setting may
290  be changed by the user by the <tt>def f</tt> command.
291 <tag>gw.language</tag> Current language. This setting may be
292 changed by the user with the <tt>def lang</tt> command. When the 
293  langauge is set to something, say x, then the resource gw.lang.x 
294  should hold a name of a resource file read by the kernel.
295 <tag>gw.lang.<em/x/</tag> Specifies name of resource file for 
296  language <em/x/.
297 <tag>gw.target.<em/name/ </tag> Name of resource file of target
298  <em/name/.
299 <tag>gw.portno</tag> Z39.50 target port number &mdash; default 210.
300 <tag>gw.hostname</tag> Z39.50 target host name.
301 <tag>gw.bibset</tag> Name of file with Bib-1 attribute mapping.
302 <tag>gw.databases</tag> Available databases on target.
303 <tag>gw.description</tag> Description of a target. This message
304  is returned to the user when the connection is established with the
305  target.
306 <tag>gw.account</tag> Z39.50 Authentication string &mdash; default
307  empty (i.e. none).
308 </descrip>
309
310 <sect1>Messages
311
312 <p>
313 There are several resource settings that deal with language 
314 dependencies. These fall into the following categories that
315 depend on the resource name prefixes:
316 <descrip>
317 <tag>gw.msg</tag> Miscellaneous messages.
318 <tag>gw.err</tag> Error messages.
319 <tag>gw.bib1.diag.<em/no/</tag> Diagnostic error message indicated by
320  <em/no/.
321 <tag>gw.help</tag> Help/description of various commands.
322 <tag>ccl.command</tag> CCL command names.
323 <tag>ccl.token</tag> CCL tokens names.
324 </descrip>
325
326 Refer to the sample files, <tt>default.res</tt>, <tt>lang.uk.res</tt>
327 and <tt>lang.dk.res</tt> for all available settings.
328
329 <sect1>Target definitions
330
331 <p>
332 To add a target definition called <em/mytarget/ you need to make a resource 
333 entry in <tt>default.res</tt> called <tt>gw.target.</tt><em>mytarget</em>.
334 The value of this resource is the name of a resource file &mdash; for 
335 example <em>mytarget</em><tt>.res</tt>. The resource file should at least
336 define the resources: <tt/gw.hostname/, <tt/gw.databases/ and 
337 <tt/gw.description/. You might also consider specifying
338 <tt/gw.account/, <tt/gw.bibset/, <tt/gw.resultset/ and <tt/gw.portno/
339 in the target resource file. The user only needs to use the command
340 <tt>target </tt><em>mytarget</em> to use the target. Also, since we
341 already specified database names, the user doesn't need to use the
342 <tt/base/ command.
343
344 <sect1>CCL to RPN mapping
345
346 <p>
347 The mapping between CCL-queries and RPN are stored in files &mdash;
348 normally with the suffix <tt>.bib</tt>. We will refer these
349 files as bibset-files. You might consult the file <tt/default.bib/
350 to see an example of such file.
351
352 The mapping is necessary because targets usually only support a little
353 subset of the Bib-1 attribute set and because the CCL qualifiers
354 (field names) are not standardized. A bibset-file is specified
355 by the <tt/gw.bibset/ resource.
356
357 Column zero of a bib-file line either hold a hash character (<tt/#/)
358 indicating a comment in which case the rest of the line is
359 ignored; or a CCL qualifier.
360
361 The name of the CCL qualifier is up to you. However, the special
362 qualifier name <tt/term/ applies to the case where no qualifier
363 is specified in CCL. The CCL qualifier is
364 followed by one or more mapping specifications. A mapping
365 specification takes the form:
366
367 <em/type/<tt/=/<em/value/<tt/,/<em/value/...
368
369 The type is simply one of the six Bib-1 attribute query types:
370 <descrip>
371 <tag/u/ Use attribute. Value is an integer.
372 <tag/t/ Truncation attribute. Value is an integer; or the
373  value is a combination of:
374   <descrip>
375   <tag/l/ This character indicates that the CCL parser should allow
376   left truncation (2) if indicated by a <tt/?/ on the left side
377   of a term.
378   <tag/r/ This character indicates that the CCL parser should allow
379   right truncation (1) if indicated by a <tt/?/ on the right side
380   of a term.
381   <tag/b/ This character indicates that the CCL parser should allow
382   both left and right (3) truncation indicated by a <tt/?/ on both
383   left and right side of a term.
384   <tag/n/ This character indicates that the CCL parser should announce
385   no truncation (100) if no truncation was specified.
386   </descrip>
387 <tag/p/ Position attribute. Valus is an integer.
388 <tag/s/ Structure attribute. Value is an integer; or the
389  value is <tt/pw/ in which case the CCL parser announces word (2) or
390  phrase (1) depending on the number of adjacent terms.
391 <tag/r/ Relation attribute. Value is an integer; or the value is
392  <tt/o/ in which case, the CCL parser will select <em/less than/, 
393  <em/less than or equal/, ... <em/greater than/ &mdash; depending on
394  the relation specified in CCL.
395 <tag/p/ Position attribute. Value is an integer.
396 </descrip>
397
398 Consider these bibset-lines:
399 <tscreen><verb>
400 term t=l,r,b s=pw
401 au= u=1 t=l,r,b s=pw
402 date u=30 r=o
403 </verb></tscreen>
404 The first line describes the mapping in when no qualifiers are
405 present, as in:
406 <tscreen><verb>
407 find foo bar?
408 </verb></tscreen>
409 In this case the right truncation is enabled and the structure is
410 <em/phrase/.
411
412 The second line is used in this search:
413 <tscreen><verb>
414 find au=andersen
415 </verb></tscreen>
416 where the use attribute is <em/author/ and the structure is <em/word/.
417
418 The third line is used in:
419 <tscreen><verb>
420 find date>1990
421 </verb></tscreen>
422 where the use attribute is <em/date/ and the relation is <em/greater than/.
423
424 <sect>Implementation
425
426 <p>
427 The implementation of the email server includes all the modules described
428 in the design deliverable. 
429
430 The work was roughly carried out as follows:
431 <enum>
432 <item>The logging facilities and resource management utilities were
433  implemented &mdash; virtually all other modules depend on these
434  modules.
435 <item>A minimal ES was implemented &mdash; including a high-level
436  API to the Z39.50 sub-system and a CCL parser with a few
437  commands, such as FIND and SHOW. This version displayed MARC
438  records in a raw format. This version served as base for the URP.
439 <item>The first version of the MARC display formatting tool, FML,
440  was implemented and included in the ES.
441 <item>The ETI program was implemented along with the IPC 
442  (interprocess communication) utilities based on FIFOs. Facilities
443  to keep connections alive (to Z39.50 targets) was implemented.
444  To identify a user, a file-resident symbol table (small database) was 
445  implemented which maps a email username to a unique integer (email userid). 
446 <item>The protocol persistency was implemented and more CCL commands
447  were added.
448 <item>The MONITOR program was implemented.
449 </enum>
450
451 The following sections cover the most important modules in the ES and
452 deviations from the design.
453
454 <sect1>Z39.50 Interface layer
455
456 <p>
457 The design report specified that the Zdist toolkit from CNIDR would
458 be used in the ES to provide access to the Z39.50 protocol. The package
459 was choosen bacause it is easy to use and, more important, we felt
460 that the API would be reasonably stable and supported.
461
462 Nevertheless it turned out that CNIDR choose to change the API 
463 completely around January 1995 and announced a new version 
464 called zdist102b1-1. 
465
466 <em>Note: As of this date the newest version of Zdist is still
467 zdist102b1-1. CNIDR seems to concentracte on their Isite package
468 which also includes a Zdist package presumably similar to the
469 standalone Zdist package</em>
470
471 During the work with the Zdist package a few bugs were discovered.
472 Fortunately, they could be solved within a few days. We also
473 discovered that the package lacks result-set references.
474 We posted the bug fixes to Kevin Gamiel who is responsible for 
475 the package but we didn't get responses. So, eventually, we weren't
476 satisfied with the package after all.
477
478 In February some of us began the development of a new Z39.50 package 
479 called YAZ &mdash; in retrospect somewhat motivated by the 
480 experiences with existing Z39.50/SR toolkits.
481
482 To support result-set references we chose to incorporate a YAZ 
483 interface in the ES also. And we designed and implemented a 
484 simple high-level Z39.50 origin API that supported both Zdist and YAZ.
485
486 The protocol persistency module was implemented on top of
487 the high-level API and not on top of Zdist. The obvious 
488 advantage is that the persistency module is not tied to one 
489 particular Z39.50/SR package.
490
491 Persistency information stored for each user is simply:
492 <itemize>
493 <item>hostname and port number.
494 <item>authentication string
495 <item>selected database(s)
496 <item>next result set number
497 <item>next result set position
498 <item>result set information
499 </itemize>
500
501 Information about each result set includes:
502 <itemize>
503 <item>name
504 <item>size (number of hits)
505 <item>database(s)
506 <item>query
507 </itemize>
508
509 A persistency file is removed each time a new target is selected.
510 It is our experiences that the persistency files are very small.
511
512 <sect1>CCL
513
514 <p>
515 The CCL was implemented as described in the design. A CCL utility
516 was made as a separate module which implements a tokenization
517 package and a parser which translates from FIND to RPN. The
518 data structure used to represent the RPN query is also used in
519 Z39.50 search API on top of YAZ or Zdist. 
520
521 The CCL parser is quite configurable. Token names can be redefined to
522 one or more names (aliases). Also, the specification of mapping
523 between CCL field names (qualifiers) and Bib-1 attributes can be
524 specified in either the C API or a file.
525
526 Although the Z39.50 system in the ES uses the Bib-1 attribute set, the 
527 CCL parser itself is not tied to Bib-1.
528
529 <sect1>FML
530
531 <p>
532 The FML system is used to handle the presentation of MARC
533 records. There are some deviations to the design report, however.
534 The most important changes are:
535 <itemize>
536 <item>The <tt/expr/ function is not implemented. Instead arithmetic
537 operators <tt/plus/, <tt/minus/, <tt/mult/ and <tt/div/ are
538 implemented. Also relational operators <tt/gt/, <tt/lt/ ... are
539 implemented.
540 <item>The <tt/lindex/ function is called <tt/index/ and it is a binary
541 operator where the left operand is the list and the right operand is
542 the index integer.
543 <item>The MARC extraction routines are not implemented.
544 Instead, a MARC record is transferred as an argument
545 to a formatting-routine (in list notation). The formatting
546 routine then extracts fields from the list by list/string
547 manipulation functions.
548 <item>A new statement, <tt/bin/, is implemented to define
549 binary operators (functions). 
550 </itemize>
551
552 <sect1>IPC
553
554 <p>
555 As described in the design, FIFOs are used to communicate between
556 the ETI, MONITOR and KERNEL. The ES can run without the MONITOR,
557 however. The primary reason for the presence of the MONITOR was
558 to assure that the KERNELs would release the resources used by the
559 persistency layer. But, since the persistency layer did turn out to
560 use virtually no disk space at all, there was no point in starting
561 a KERNEL process to remove its files &mdash; hence this facility 
562 was not implemented. The only purpose of the MONITOR is to keep the
563 number of running KERNELs at a maximum level and even that
564 is probably useless since most unices will swap KERNEL processes
565 out anyway.
566
567 The idle time
568 before a KERNEL exits and saves its persistency file is not
569 controlled by the MONITOR. Saving the persistency file and
570 keeping it is usually a good approach &mdash; even when a
571 user doesn't reference/show old result-sets since the user
572 has a notion of <em/current target/ and database.
573
574 <sect1>Source
575
576 <p>
577 In this section a short description of each source module is
578 given. Each module is implemented in a separate sub directory. 
579 Any public headers are located in the <tt/include/ directory.
580
581 <descrip>
582 <tag/res+log/ is an implementation of the logging system
583 and the resource management sub system. Note that the
584 resource module depends on the logging facility. Logging
585 is implemented in <tt>gw-log.c</tt> and <tt/gw-log.h/. The
586 file <tt>gw-log-test.c</tt> is small test program for the
587 logging system. The core of the resource management is implemented
588 in <tt>gw-res.c</tt>. The files <tt>gw-res-bool.c</tt> and
589 <tt>gw-res-int.c</tt> implement two utility routines &mdash
590 on top of the resource management. The header file
591 <tt>gw-resp.h</tt> is a private header file and <tt>gw-res.h</tt>
592 is a public header file.
593
594 <tag/ccl/ implements CCL to RPN mapping and a tokenization 
595  utility for other CCL commands. The mapping function is
596  implemented in <tt>cclfind.c</tt>. Qualifiers are handled in 
597  <tt>cclqual.c</tt> while reading of qualifier mappings from a
598  file is implemented in <tt>cclqfile.c</tt>. Scanning is implemented
599  in <tt>ccltoken.c</tt>. String utilities, which might be changed if
600  other character sets are needed, is implemented in
601  <tt>cclstr.c</tt>. Table of error messages is implemented in
602  <tt>cclerrms.c</tt>.
603
604 <tag/util/ implements various utilities:
605   <descrip>
606   <tag>MARC utility</tag> implemented in <tt>iso2709</tt>...
607   <tag>Database utility</tag> implemented in <tt>gw-db.[ch]</tt>. This
608    utility is used to map a user (email) to an integer.
609   <tag>String queue utility</tag> implemented in <tt>strqueue.[ch]</tt>. This
610    utiltiy is used to queue incoming mail in the ETI, KERNEL and
611    the MONITOR.
612   <tag>Pretty printer</tag> implemented in <tt>ttyemit.[ch]</tt>
613    &mdash; used by the URP.
614   <tag>FIFO IPC utiltiy</tag> implemented in <tt>gip*.[ch]</tt> &mdash;
615    used by the ETI, KERNEL and MONITOR.    
616   </descrip>
617
618 <tag/fml/ implements FML. The top level functions are implemented
619  in <tt>fml.c</tt>, <tt>fmlcall.c</tt> and <tt>fmlcalls.c</tt>.
620  Scanning is implemented in <tt>fmltoken.c</tt>.
621  Memory management is implemented in <tt>fmlmem.c</tt>. 
622  Arithmetic operators are implemented in <tt>fmlarit.c</tt>. 
623  String manipulation functions are implemented in <tt>fmlstr.c</tt>.
624  Relational operators are implemented in <tt>fmlrel.c</tt>.
625  List maniuplations are performed in <tt>fmllist.c</tt>.
626  FML symbol table management is implemented in <tt>fmlsym.c</tt>.
627  Conversion from ISO2709 to list notation is implemented in
628  <tt>fmlmarc.c</tt>.
629
630 <tag/zlayer-zdist/ implements the high-level Z39.50 API on top
631   of Zdist. This task is implemented in <tt>zaccess.c</tt>. The
632  public header file is called <tt>zaccess.h</tt>.
633
634 <tag/zlayer-yaz/ implements the high-level Z39.50 API on top
635   of YAZ. This task is implemented in <tt>zaccess.c</tt>. The
636  public header file is called <tt>zaccess.h</tt>.
637
638 <tag/kernel/ implements the ETI, KERNEL and MONITOR. The kernel
639  itself is implemented in <tt>main.c</tt>, <tt>urp.c</tt> and
640  <tt>persist.c</tt>. The ETI is implemented in <tt>eti.c</tt> and
641  the MONITOR is implemented <tt>monitor.c</tt>.
642 </descrip>
643
644 <sect>LICENSE
645
646 <p>
647  Copyright &copy; 1995, the EUROPAGATE consortium (see below).
648
649  The EUROPAGATE consortium members are:
650
651 <itemize>
652 <item>University College Dublin
653 <item>Danmarks Teknologiske Videnscenter
654 <item>An Chomhairle Leabharlanna
655 <item>Consejo Superior de Investigaciones Cientificas
656 </itemize>
657
658  Permission to use, copy, modify, distribute, and sell this software and
659  its documentation, in whole or in part, for any purpose, is hereby granted,
660  provided that:
661
662  1. This copyright and permission notice appear in all copies of the
663  software and its documentation. Notices of copyright or attribution
664  which appear at the beginning of any file must remain unchanged.
665
666  2. The names of EUROPAGATE or the project partners may not be used to
667  endorse or promote products derived from this software without specific
668  prior written permission.
669
670  3. Users of this software (implementors and gateway operators) agree to
671  inform the EUROPAGATE consortium of their use of the software. This
672  information will be used to evaluate the EUROPAGATE project and the
673  software, and to plan further developments. The consortium may use
674  the information in later publications.
675  
676  4. Users of this software agree to make their best efforts, when
677  documenting their use of the software, to acknowledge the EUROPAGATE
678  consortium, and the role played by the software in their work.
679
680  THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
681  EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
682  WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
683  IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
684  FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
685  ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
686  OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
687  ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
688  USE OR PERFORMANCE OF THIS SOFTWARE.
689
690 </article>