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