Check that the socket is well and served by us.
[gnupg.git] / jnlib / ChangeLog
1 2008-10-29  Werner Koch  <wk@g10code.com>
2
3         * stringhelp.c (make_filename): Implement using macros. Factor some
4         code out to ..
5         (change_slashes): New.
6         (make_filename_try): New.
7
8         * w32-gettext.c (gettext): Return if no domain is loaded.
9         Reported by Tom Pegios.
10
11 2008-10-28  Werner Koch  <wk@g10code.com>
12
13         * w32-gettext.c (gettext): Try the binary search if the string was
14         not found in the hash table.
15
16 2008-10-20  Werner Koch  <wk@g10code.com>
17
18         * w32-afunix.c (_w32_sock_connect): Mark ADDRLEN as unused.
19
20         * dotlock.c (release_dotlock): Do not mix declaration and code.
21
22         * stringhelp.c (make_basename): Silent gcc warning about unused arg.
23         * argparse.c (store_alias): Ditto.
24         (find_long_option): 
25
26 2008-10-15  Werner Koch  <wk@g10code.com>
27
28         * logging.c (do_logv) [W32]: Flush the log stream.
29
30 2008-09-29  Werner Koch  <wk@g10code.com>
31
32         * argparse.c (ARGERR_): Use constants for error values.
33         (optfile_parse): Prettify.  Replace xmalloc and xrealloc by malloc
34         and realloc.
35         * libjnlib-config.h (jnlib_strdup, jnlib_realloc): New.
36
37 2008-06-26  Werner Koch  <wk@g10code.com>
38
39         * stringhelp.c (print_sanitized_buffer2): Loose check for control
40         characters to better cope with utf-8.  The range 0x80..0x9f is
41         nowadays not anymore accidently used for control charaters.
42
43 2008-06-13  Werner Koch  <wk@g10code.com>
44
45         * dotlock.c: Reformat code and implement locking for W32.
46         (create_dotlock): Use snprintf.
47
48 2008-06-11  Werner Koch  <wk@g10code.com>
49
50         * utf8conv.c: Remove useless variable ACTIVE_CHARSET.  Suggested
51         by Petr Uzel.
52
53 2008-05-26  Werner Koch  <wk@g10code.com>
54
55         * argparse.c (usage): Make sure to print a trailing LF for usage(1).
56
57 2008-04-08  Werner Koch  <wk@g10code.com>
58
59         * w32-gettext.c (gettext_select_utf8): New.
60         (get_string): Support switching encodings.
61         (load_domain): Allocate space for DATA_NATIVE.
62
63 2008-03-25  Werner Koch  <wk@g10code.com>
64
65         * w32-gettext.c (_nl_locale_name): New.  Taken from
66         ../common/localename and GNU gettext's localename.c.
67         (set_gettext_file): Rewritten.
68         (gettext_localename): New.
69
70 2008-03-17  Werner Koch  <wk@g10code.com>
71
72         * logging.c (my_funopen_hook_size_t): New.
73         (fun_writer): Use it to cope with fopencookie/funopen differences.
74         * dotlock.c (read_lockfile): Initialize PID.  Reported by St├ęphane
75         Corth├ęsy.
76
77 2008-02-22  Werner Koch  <wk@g10code.com>
78
79         * argparse.c (strusage): Set copyright year to 2008.
80
81 2007-11-19  Werner Koch  <wk@g10code.com>
82
83         * stringhelp.c (percent_escape): Factor code out to
84         (do_percent_escape): .. new.
85         (try_percent_escape): New.
86
87 2007-10-01  Werner Koch  <wk@g10code.com>
88
89         * w32-afunix.c: Only keep the client related code.
90         (read_port_and_nonce): New.  Taken from Assuan.
91         (_w32_sock_connect): Rewritten.
92
93 2007-08-29  Werner Koch  <wk@g10code.com>
94
95         * argparse.c (initialize): Make strings translatable and remove
96         extra LF.
97
98 2007-08-24  Werner Koch  <wk@g10code.com>
99
100         * mischelp.c (same_file_p): New.
101         (libjnlib_dummy_mischelp_func): Remove as we now always have one
102         function.
103
104 2007-08-09  Werner Koch  <wk@g10code.com>
105
106         * argparse.c (show_help): Expand the @EMAIL@ macro in the package
107         bug reporting address.
108
109 2007-08-02  Werner Koch  <wk@g10code.com>
110
111         * t-stringhelp.c (test_compare_filenames): New.
112
113         * stringhelp.c (compare_filenames) [HAVE_DRIVE_LETTERS]: Fixed
114         comparison to take slash and backslash in account.
115         (make_filename): Avoid mixing / and \.
116
117 2007-07-04  Werner Koch  <wk@g10code.com>
118
119         * utf8conv.c (load_libiconv): Remove URL from translatble string.
120
121         Switched JNLIB from LGPLv2.1 to LGPLv3.
122
123 2007-07-01  Werner Koch  <wk@g10code.com>
124
125         * argparse.c (strusage): Use id 10 for the license string;
126         default to GPL3+.  Change long note to version 3 or later.
127         (show_version): Print the license info.
128
129 2007-06-19  Werner Koch  <wk@g10code.com>
130
131         * Makefile.am: Add support for regression tests.
132         * t-support.h, t-support.c: New.
133         * t-stringhelp.c: New.
134
135         * stringhelp.c (percent_escape): Add arg EXTRA to make it a more
136         general function.  Changed all callers.
137
138 2007-06-18  Werner Koch  <wk@g10code.com>
139
140         * w32-afunix.c (_w32_sock_bind): Changed to properly detect an
141         already used socket.
142
143 2007-06-18  Marcus Brinkmann  <marcus@g10code.de>
144
145         * stringhelp.h (percent_escape): New prototype.
146         * stringhelp.c (percent_escape): New function.
147
148 2007-06-11  Werner Koch  <wk@g10code.com>
149
150         * utf8conv.c (jnlib_iconv_open, jnlib_iconv, jnlib_iconv_close): New.
151
152 2007-06-06  Werner Koch  <wk@g10code.com>
153
154         * w32help.h: New.
155         * w32-gettext.c: New.  Taken from gnupg 1.4, added ngettext,
156         changed to use jnlib malloc functions and put under the LGPL.
157         * w32-reg.c: New.  Taken from../common/w32reg.c and changed to
158         LGPL.  Changed API to use the jnlib malloc functions.
159         * Makefile.am (libjnlib_a_SOURCES) [!W32]: Do not build the w32
160         specific modules.
161
162         * dotlock.c: Include stringhelp.h for stpcpy prototype.
163
164 2007-06-04  Werner Koch  <wk@g10code.com>
165
166         * dynload.h: New.  Taken from ../common and changed to LGPL.
167
168         * utf8conv.c (load_libiconv): New.  Taken from GnuPG 1.4
169
170 2007-05-30  Werner Koch  <wk@g10code.com>
171
172         * w32-pth.h, w32-pth.c: Remove.
173
174 2007-04-25  Werner Koch  <wk@g10code.com>
175
176         * argparse.c (long_opt_strlen): Fixed for utf-8.
177
178 2007-03-07  Werner Koch  <wk@g10code.com>
179
180         * argparse.c (strusage): Set copyright year to 2007.
181
182 2007-01-25  Werner Koch  <wk@g10code.com>
183
184         * stringhelp.c (utf8_charcount): New.
185
186 2006-11-29  Werner Koch  <wk@g10code.com>
187
188         * utf8conv.c (set_native_charset) [HAVE_W32_SYSTEM]: Fixed typo in
189         macro name.
190
191 2006-11-15  Werner Koch  <wk@g10code.com>
192
193         * logging.c (my_funopen_hook_ret_t): New.
194         (fun_writer): Use it.
195
196 2006-10-19  Werner Koch  <wk@g10code.com>
197
198         * stringhelp.c (memrchr) [!HAVE_MEMRCHR]: Provide a replacement.
199
200 2006-09-27  Werner Koch  <wk@g10code.com>
201
202         * mischelp.c: New.
203         (timegm): Copied from gnupg 1.4, changed from GPL to LGPL.  Fixed
204         a memory leak.
205
206         * stringhelp.h (isascii): New.
207
208         * stringhelp.c (strsep): New. Copied from gnupg 1.4.5
209         util/strgutil.c.
210
211         * strlist.h (STRLIST): Removed deprecated typedef. 
212
213         * types.h: Made cpp commands work with old compilers.  Also shows
214         up nicer with Emacs' font locking.
215
216         * w32-afunix.c (_w32_sock_connect): Set ERRNO for an invalid port.
217
218         Changed license from GPL to LGPL.  Note that all code has either
219         been written by me, David, employees of g10 Code or taken from
220         glibc.
221         
222         * libjnlib-config.h, stringhelp.c, stringhelp.h:
223         * strlist.c, strlist.h, utf8conv.c, utf8conv.h:
224         * argparse.c, argparse.h, logging.c, logging.h:
225         * dotlock.c, dotlock.h, types.h, mischelp.h:
226         * xmalloc.c, xmalloc.h, w32-pth.c, w32-pth.h:
227         * w32-afunix.c, w32-afunix.h: Tagged them to be long to jnlib
228         which is a part of GnuPG but also used by other projetcs. 
229
230 2006-09-22  Werner Koch  <wk@g10code.com>
231
232         * utf8conv.c: Reworked to match the gnupg 1.4.5 code.  This now
233         requires iconv support but this is reasonable for all modern
234         systems.
235
236 2006-08-29  Werner Koch  <wk@g10code.com>
237
238         * logging.c (do_logv): Emit a missing LF for fatal errors.
239
240 2006-06-28  Werner Koch  <wk@g10code.com>
241
242         * dotlock.c (make_dotlock, release_dotlock, read_lockfile)
243         (maybe_deadlock, destroy_dotlock, create_dotlock): Re-indented.
244         (create_dotlock): Repalces some log_fatal by log_error as it was
245         not intended that they should terminate.  Write the nodename to
246         the locking file. Code cleanups.
247         (read_lockfile): Reworked to read the node name.
248         (make_dotlock): Test for identical node name and delete lock stale
249         file.
250         (release_dotlock): Likewise.
251
252 2006-05-23  Werner Koch  <wk@g10code.com>
253
254         * libjnlib-config.h (JNLIB_NEED_UTF8CONV): Fixed typo in name.
255
256         * dotlock.c (release_dotlock): Don't act if we don't have any
257         locks at all.
258         (destroy_dotlock): New.  From 1.4.3.
259         (dotlock_remove_lockfiles): Make use of destroy function.
260
261 2006-05-19  Werner Koch  <wk@g10code.com>
262
263         * strlist.c (append_to_strlist2): Enabled.
264
265         * stringhelp.c (print_sanitized_buffer2): New.  Changed the rules
266         to match the behaviour of print_string2 from gnupg 1.4.3.
267         (print_sanitized_buffer): Use the new function.
268         (print_sanitized_string2): New.
269         (hextobyte): New.  Taken from gpg 1.4.3.
270
271 2006-04-28  Werner Koch  <wk@g10code.com>
272
273         * stringhelp.c (print_sanitized_buffer): Fix bug where the count
274         got wrong for the \xNN representation.
275         (sanitize_buffer): Fix bug where some control characters lose part
276         of their \xNN representation.
277
278 2006-04-20  Werner Koch  <wk@g10code.com>
279
280         * stringhelp.c (make_basename): New arg INPUTPATH for future
281         riscos compatibility.
282
283 2006-04-18  Werner Koch  <wk@g10code.com>
284
285         * libjnlib-config.h (JNLIB_NEED_UTF8CONF): Defined.
286         * strlist.c (add_to_strlist2) [JNLIB_NEED_UTF8CONV]: Enabled.
287
288 2005-06-15  Werner Koch  <wk@g10code.com>
289
290         * stringhelp.c (sanitize_buffer): Make P a void*.
291         (ascii_memistr, memistr): Ditto.
292         (ascii_memcasecmp): Ditto.
293         * logging.c (writen): Use void * for arg BUFFER.
294         * stringhelp.c (memistr): Fixed unsigned/signed pointer conflict.
295         (ascii_memistr): Ditto.
296         (ascii_memcasemem): Ditto.
297         * utf8conv.c (utf8_to_native): Ditto.
298         (utf8_to_native): Ditto.
299         * argparse.c (show_version): Removed non-required cast.
300
301 2005-01-19  Werner Koch  <wk@g10code.com>
302
303         * logging.c (fun_writer): Don't fallback to stderr. Print to
304         stderr only if connected to a tty.
305
306 2004-12-20  Werner Koch  <wk@g10code.com>
307
308         * w32-pth.c (do_pth_event_free): The events are hold in a ring
309         buffer.  Adjust for that.
310         (do_pth_event_body): Ditto.
311         (pth_event_isolate): Ditto.
312         (do_pth_wait): Ditto.
313         (_pth_event_count): Renamed to ..
314         (event_count): .. and adjusted as above.
315         (pth_init): Define 3 debug levels and change all debug calls to
316         make use of them.  This makes the moule now silent.
317
318 2004-12-19  Werner Koch  <wk@g10code.com>
319
320         * w32-pth.c (pth_init): Enable debugging depending on env var.
321         (pth_self): New.
322         (pth_mutex_release, pth_mutex_acquire): Implemented directly using
323         the W32 API.
324
325 2004-12-18  Werner Koch  <wk@g10code.com>
326
327         * w32-pth.c (pth_init): Reverse return values.  Use TRUE and FALSE
328         constants.
329         (pth_kill, pth_mutex_acquire, pth_attr_set, pth_join, pth_cancel):
330         Ditto.
331
332 2004-12-15  Werner Koch  <wk@g10code.com>
333
334         * logging.c [W32]: Don't include unavailable headers.
335
336 2004-12-14  Werner Koch  <wk@g10code.com>
337
338         * w32-pth.c (_pth_strerror): Renamed to ...
339         (w32_strerror): .. this. And let callers provide a buffer.
340         (spawn_helper_thread): Removed HD arg and hardwire the stack size
341         to 32k.
342         (do_pth_wait): Removed use of ATTR; not needed for the helper
343         threads.
344         (helper_thread): Renamed to ..
345         (launch_thread): .. this.  Release handle if not joinable.
346         (struct pth_priv_hd_s): Renamed to ...
347         (struct thread_info_s): .. this.  Add member JOINABLE and TH.
348
349 2004-12-14  Timo Schulz  <twoaday@g10code.com>
350
351         * w32-pth.c (pth_kill): Just release the crit section if
352         pth_init was really called. And set all handles to NULL.
353         (_pth_strerror): New.
354         (do_pth_wait): Before we enter the loop we check if there
355         are too much events in the ring.
356         
357 2004-12-14  Werner Koch  <wk@g10code.com>
358
359         * w32-pth.h (pth_event_occured): Removed macro. 
360         * w32-pth.c: Fixed license statement; its under the LGPL.
361         (enter_pth, leave_pth): Use them to bracket almost all public
362         functions.
363
364 2004-12-13  Timo Schulz  <twoaday@g10code.com>
365
366         * w32-pth.c (enter_pth, leave_pth): New.
367         (pth_init): Initialize global mutex section.
368         (pth_kill): Release global mutex section.
369         (helper_thread): New.
370         (pth_spawn): Make sure only one thread is running.
371         
372 2004-12-13  Werner Koch  <wk@g10code.com>
373
374         * stringhelp.c (w32_strerror) [W32]: New.
375
376         * w32-pth.c, w32-pth.h: Added real code written by Timo Schulz.
377         Not finished, though.
378
379 2004-12-07  Werner Koch  <wk@g10code.com>
380
381         * w32-pth.c, w32-pth.h: New.
382
383 2004-11-26  Werner Koch  <wk@g10code.com>
384
385         * logging.c [_WIN32]: Don't include socket headers.
386
387 2004-11-30  Timo Schulz  <ts@g10code.com>
388
389         * w32-afunix.c: New. AF_UNIX emulation for W32.
390         * w32-afunix.h: Likewise.
391         
392 2004-11-22  Werner Koch  <wk@g10code.com>
393
394         * logging.c (log_test_fd): Add test on LOGSTREAM.  Reported by
395         Barry Schwartz.
396
397 2004-11-18  Werner Koch  <wk@g10code.com>
398
399         * logging.c: Explicitly include sys/stat.h for the S_I* constants.
400
401 2004-10-21  Werner Koch  <wk@g10code.com>
402
403         * logging.c (do_logv): Use set_log_stream to setup a default.
404         (log_set_file): Factored code out to ..
405         (set_file_fd): .. New function to allow using a file descriptor.
406         (log_set_fd): Make use of new fucntion.
407         (fun_writer): Reworked.
408
409 2004-08-18  Werner Koch  <wk@g10code.de>
410
411         * stringhelp.c (print_sanitized_utf8_string): Actually implement
412         it.
413
414 2004-06-21  Werner Koch  <wk@g10code.com>
415
416         * logging.c (log_set_file): Do not close an old logstream if it
417         used to be stderr or stdout.
418
419 2004-05-05  Werner Koch  <wk@gnupg.org>
420
421         * logging.c (log_set_file): Oops, don't close if LOGSTREAM is NULL.
422
423 2004-04-30  Werner Koch  <wk@gnupg.org>
424
425         * logging.c (log_set_file): Make sure the log stream will be
426         closed even if the stderr fileno will be assigned to a new socket.
427
428 2004-04-16  Werner Koch  <wk@gnupg.org>
429
430         * logging.h (JNLIB_LOG_WITH_PREFIX): Add constants for the flag
431         values.
432         * logging.c (log_set_prefix): New flag DETACHED.
433         (fun_writer): Take care of this flag.
434         (log_test_fd): New.
435
436 2004-02-18  Werner Koch  <wk@gnupg.org>
437
438         * stringhelp.c (print_sanitized_buffer): Don't care about
439         non-ASCII characaters.
440         (sanitize_buffer): Ditto.
441
442 2004-02-12  Werner Koch  <wk@gnupg.org>
443
444         * Makefile.am: Replaced INCLUDES by AM_CPPFLAGS.
445
446 2004-01-05  Werner Koch  <wk@gnupg.org>
447
448         * argparse.c (strusage): Changed default copyright year to 2004.
449
450 2003-12-17  Werner Koch  <wk@gnupg.org>
451
452         * argparse.c (initialize): Replaced use of non-literal format
453         args.  Suggested by Florian Weimer.
454
455 2003-12-16  Werner Koch  <wk@gnupg.org>
456
457         * logging.c (writen, fun_writer, fun_closer): New.
458         (log_set_file): Add feature to log to a socket.
459         (log_set_file, do_logv): Force printing with prefix and pid.
460
461 2003-11-13  Werner Koch  <wk@gnupg.org>
462
463         * strlist.c (strlist_copy): New.
464
465         * dotlock.c: Define DIRSEP_C et al. if not defined.
466
467 2003-11-06  Werner Koch  <wk@gnupg.org>
468
469         * strlist.h (strlist_t): New. STRLIST is now deprecated.
470
471 2003-06-18  Werner Koch  <wk@gnupg.org>
472
473         * strlist.c (strlist_pop): New.
474
475         * dotlock.c (dotlock_remove_lockfiles): Prefixed with dotlock_ and
476         made global.
477
478 2003-06-17  Werner Koch  <wk@gnupg.org>
479
480         * stringhelp.c (length_sans_trailing_chars)
481         (length_sans_trailing_ws): New.
482
483         * logging.c (log_inc_errorcount): New.
484
485         * stringhelp.c (print_sanitized_utf8_buffer): Implement utf8
486         conversion.
487         (sanitize_buffer): New. Based on gnupg 1.3.2 make_printable_string.
488
489         * dotlock.c: Updated to match the version from 1.3.2
490         * utf8conv.c: New.  Code taken from strgutil.c of gnupg 1.3.2.
491         * utf8conv.h: New.
492
493 2003-06-16  Werner Koch  <wk@gnupg.org>
494
495         * logging.c (do_logv): Hack to optionally suppress a leading space.
496
497         * stringhelp.c (ascii_strncasecmp): New.  Taken from gnupg 1.3.
498         (ascii_memistr): New. Taken from gnupg 1.3
499
500 2003-06-13  Werner Koch  <wk@gnupg.org>
501
502         * mischelp.h (wipememory2,wipememory): New. Taken from GnuPG 1.3.2. 
503
504 2002-06-04  Werner Koch  <wk@gnupg.org>
505
506         * stringhelp.c (print_sanitized_utf8_string): New.  No real
507         implementation for now.
508         (print_sanitized_utf8_buffer): Ditto.
509
510 2002-04-04  Werner Koch  <wk@gnupg.org>
511
512         * logging.c (log_get_prefix): New.
513
514 2002-03-15  Werner Koch  <wk@gnupg.org>
515
516         * argparse.c (optfile_parse): Fixed missing argument handling.
517
518 2002-02-25  Werner Koch  <wk@gnupg.org>
519
520         * stringhelp.c (ascii_memcasemem): New.
521
522 2002-02-14  Werner Koch  <wk@gnupg.org>
523
524         * Makefile.am (INCLUDES): Add cflags for libgcrypt.
525
526 2002-02-07  Werner Koch  <wk@gnupg.org>
527
528         * logging.c (log_set_fd): New.
529
530         * stringhelp.c (print_sanitized_buffer): New.
531         (print_sanitized_string): New.
532
533 2002-01-24  Werner Koch  <wk@gnupg.org>
534
535         * argparse.c (strusage): Set default copyright notice year to 2002.
536
537         Fixed the copyright notice of this file, as it has always been
538         part of GnuPG and therefore belongs to the FSF.
539
540 2001-11-01  Marcus Brinkmann  <marcus@g10code.de>
541
542         * logging.c (log_printf): Do not initialize ARG_PTR with 0, we
543         don't know the correct type.  Instead, run va_start and va_end
544         unconditionally.
545         Reported by Jose Carlos Garcia Sogo <jsogo@debian.org>.
546
547 2002-01-19  Werner Koch  <wk@gnupg.org>
548
549         * logging.c (log_get_stream): New.
550
551 2001-12-05  Werner Koch  <wk@gnupg.org>
552
553         * logging.c (log_set_prefix): New.
554         (do_logv): Include prefix and pid only if enabled. Print time only
555         when explicitly enabled.
556         (log_logv): New.  
557         * logging.h: Include log_logv() only when requested.
558
559 2001-11-06  Werner Koch  <wk@gnupg.org>
560
561         * strlist.c, strlist.h: New. Taken from pgnupg/util/strgutil.c
562
563 2001-08-30  Werner Koch  <wk@gnupg.org>
564
565         * logging.c (log_printf): Don't pass NULL instead of arg_ptr.
566
567 2001-07-19  Werner Koch  <wk@gnupg.org>
568
569         * stringhelp.c (ascii_memistr,ascii_isupper,ascii_islower,
570         ascii_toupper,ascii_tolower, ascii_strcasecmp, ascii_memcasecmp): New.
571
572 2000-07-26 10:02:51  Werner Koch  (wk@habibti.openit.de)
573
574         * stringhelp.c.: Add stdarg.h
575         * argparse.h: s/ulong/unsigned long/ although this should be defined
576         by types.h.
577
578 2000-06-28 19:40:23  Werner Koch  (wk@habibti.openit.de)
579
580         * Makefile.am: Replaced second logging.c by .h
581
582 2000-05-24 08:58:15  Werner Koch  (wk@habibti.openit.de)
583
584         * logging.c (log_get_errorcount): New.
585
586 2000-05-24 08:44:47  Werner Koch  (wk@habibti.openit.de)
587
588         * stringhelp.c: Added a few filename related helper functions.
589
590 2000-05-11 18:04:43  Werner Koch  (wk@habibti.openit.de)
591
592         * xmalloc.c (xstrcat2): Replaced stpcpy to quickly address W32
593         problems.
594
595 2000-05-02 19:43:38  Werner Koch  (wk@habibti.openit.de)
596
597         * xmalloc.c (xstrcat2): New.
598
599 Mon Jan 24 13:04:28 CET 2000  Werner Koch  <wk@gnupg.de>
600
601         * README: New.
602         * Makefile.am: new.
603         * argparse.c, argparse.h, logging.c, logging.h:
604         * mischelp.h, stringhelp.c, stringhelp.h, xmalloc.c:
605         * xmalloc.h, dotlock.c: Moved from ../util to here.
606         * dotlock.h: New.
607         * libjnlib-config.h: New.
608
609         * logging.c (log_set_file): New.
610         (log_printf): New.
611         (do_logv): Add kludge to insert LFs.
612
613
614      ***********************************************************
615      * Please note that JNLIB is maintained as part of GnuPG.  *
616      * You may find it source-copied in other packages.        *
617      ***********************************************************        
618         
619  Copyright 2000, 2001, 2002, 2003, 2004,
620            2005, 2006, 2007, 2008 Free Software Foundation, Inc.
621
622  This file is free software; as a special exception the author gives
623  unlimited permission to copy and/or distribute it, with or without
624  modifications, as long as this notice is preserved.
625
626  This file is distributed in the hope that it will be useful, but
627  WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
628  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.