]> git.gir.st - ttxd.git/blob - src/thttpd-2.27/thttpd.8
initial code import
[ttxd.git] / src / thttpd-2.27 / thttpd.8
1 .TH thttpd 8 "29 February 2000"
2 .SH NAME
3 thttpd - tiny/turbo/throttling HTTP server
4 .SH SYNOPSIS
5 .B thttpd
6 .RB [ -C
7 .IR configfile ]
8 .RB [ -p
9 .IR port ]
10 .RB [ -d
11 .IR dir ]
12 .RB [ -dd
13 .IR data_dir ]
14 .RB [ -r | -nor ]
15 .RB [ -s | -nos ]
16 .RB [ -v | -nov ]
17 .RB [ -g | -nog ]
18 .RB [ -u
19 .IR user ]
20 .RB [ -c
21 .IR cgipat ]
22 .RB [ -t
23 .IR throttles ]
24 .RB [ -h
25 .IR host ]
26 .RB [ -l
27 .IR logfile ]
28 .RB [ -i
29 .IR pidfile ]
30 .RB [ -T
31 .IR charset ]
32 .RB [ -P
33 .IR P3P ]
34 .RB [ -M
35 .IR maxage ]
36 .RB [ -V ]
37 .RB [ -D ]
38 .SH DESCRIPTION
39 .PP
40 .I thttpd
41 is a simple, small, fast, and secure HTTP server.
42 It doesn't have a lot of special features, but it suffices for most uses of
43 the web, it's about as fast as the best full-featured servers (Apache, NCSA,
44 Netscape),
45 and it has one extremely useful feature (URL-traffic-based throttling)
46 that no other server currently has.
47 .SH OPTIONS
48 .TP
49 .B -C
50 Specifies a config-file to read.
51 All options can be set either by command-line flags or in the config file.
52 See below for details.
53 .TP
54 .B -p
55 Specifies an alternate port number to listen on.
56 The default is 80.
57 The config-file option name for this flag is "port",
58 and the config.h option is DEFAULT_PORT.
59 .TP
60 .B -d
61 Specifies a directory to chdir() to at startup.
62 This is merely a convenience - you could just as easily
63 do a cd in the shell script that invokes the program.
64 The config-file option name for this flag is "dir",
65 and the config.h options are WEBDIR, USE_USER_DIR.
66 .TP
67 .B -r
68 Do a chroot() at initialization time, restricting file access
69 to the program's current directory.
70 If -r is the compiled-in default, then -nor disables it.
71 See below for details.
72 The config-file option names for this flag are "chroot" and "nochroot",
73 and the config.h option is ALWAYS_CHROOT.
74 .TP
75 .B -dd
76 Specifies a directory to chdir() to after chrooting.
77 If you're not chrooting, you might as well do a single chdir() with
78 the -d flag.
79 If you are chrooting, this lets you put the web files in a subdirectory
80 of the chroot tree, instead of in the top level mixed in with the
81 chroot files.
82 The config-file option name for this flag is "data_dir".
83 .TP
84 .B -nos
85 Don't do explicit symbolic link checking.
86 Normally, thttpd explicitly expands any symbolic links in filenames,
87 to check that the resulting path stays within the original document tree.
88 If you want to turn off this check and save some CPU time, you can use
89 the -nos flag, however this is not recommended.
90 Note, though, that if you are using the chroot option, the symlink
91 checking is unnecessary and is turned off, so the safe way to save
92 those CPU cycles is to use chroot.
93 The config-file option names for this flag are "symlinkcheck" and "nosymlinkcheck".
94 .TP
95 .B -v
96 Do el-cheapo virtual hosting.
97 If -v is the compiled-in default, then -nov disables it.
98 See below for details.
99 The config-file option names for this flag are "vhost" and "novhost",
100 and the config.h option is ALWAYS_VHOST.
101 .TP
102 .B -g
103 Use a global passwd file.
104 This means that every file in the entire document tree is protected by
105 the single .htpasswd file at the top of the tree.
106 Otherwise the semantics of the .htpasswd file are the same.
107 If this option is set but there is no .htpasswd file in
108 the top-level directory, then thttpd proceeds as if the option was
109 not set - first looking for a local .htpasswd file, and if that doesn't
110 exist either then serving the file without any password.
111 If -g is the compiled-in default, then -nog disables it.
112 The config-file option names for this flag are "globalpasswd" and
113 "noglobalpasswd",
114 and the config.h option is ALWAYS_GLOBAL_PASSWD.
115 .TP
116 .B -u
117 Specifies what user to switch to after initialization when started as root.
118 The default is "nobody".
119 The config-file option name for this flag is "user",
120 and the config.h option is DEFAULT_USER.
121 .TP
122 .B -c
123 Specifies a wildcard pattern for CGI programs, for instance "**.cgi"
124 or "/cgi-bin/*".
125 See below for details.
126 The config-file option name for this flag is "cgipat",
127 and the config.h option is CGI_PATTERN.
128 .TP
129 .B -t
130 Specifies a file of throttle settings.
131 See below for details.
132 The config-file option name for this flag is "throttles".
133 .TP
134 .B -h
135 Specifies a hostname to bind to, for multihoming.
136 The default is to bind to all hostnames supported on the local machine.
137 See below for details.
138 The config-file option name for this flag is "host",
139 and the config.h option is SERVER_NAME.
140 .TP
141 .B -l
142 Specifies a file for logging.
143 If no -l argument is specified, thttpd logs via syslog().
144 If "-l /dev/null" is specified, thttpd doesn't log at all.
145 The config-file option name for this flag is "logfile".
146 .TP
147 .B -i
148 Specifies a file to write the process-id to.
149 If no file is specified, no process-id is written.
150 You can use this file to send signals to thttpd.
151 See below for details.
152 The config-file option name for this flag is "pidfile".
153 .TP
154 .B -T
155 Specifies the character set to use with text MIME types.
156 The default is UTF-8.
157 The config-file option name for this flag is "charset",
158 and the config.h option is DEFAULT_CHARSET.
159 .TP
160 .B -P
161 Specifies a P3P server privacy header to be returned with all responses.
162 See http://www.w3.org/P3P/ for details.
163 Thttpd doesn't do anything at all with the string except put it in the
164 P3P: response header.
165 The config-file option name for this flag is "p3p".
166 .TP
167 .B -M
168 Specifies the number of seconds to be used in a "Cache-Control: max-age"
169 header to be returned with all responses.
170 An equivalent "Expires" header is also generated.
171 The default is no Cache-Control or Expires headers,
172 which is just fine for most sites.
173 The config-file option name for this flag is "max_age".
174 .TP
175 .B -V
176 Shows the current version info.
177 .TP
178 .B -D
179 This was originally just a debugging flag, however it's worth mentioning
180 because one of the things it does is prevent thttpd from making itself
181 a background daemon.
182 Instead it runs in the foreground like a regular program.
183 This is necessary when you want to run thttpd wrapped in a little shell
184 script that restarts it if it exits.
185 .SH "CONFIG-FILE"
186 .PP
187 All the command-line options can also be set in a config file.
188 One advantage of using a config file is that the file can be changed,
189 and thttpd will pick up the changes with a restart.
190 .PP
191 The syntax of the config file is simple, a series of "option" or
192 "option=value" separated by whitespace.
193 The option names are listed above with their corresponding command-line flags.
194 .SH "CHROOT"
195 .PP
196 chroot() is a system call that restricts the program's view
197 of the filesystem to the current directory and directories
198 below it.
199 It becomes impossible for remote users to access any file
200 outside of the initial directory.
201 The restriction is inherited by child processes, so CGI programs get it too.
202 This is a very strong security measure, and is recommended.
203 The only downside is that only root can call chroot(), so this means
204 the program must be started as root.
205 However, the last thing it does during initialization is to
206 give up root access by becoming another user, so this is safe.
207 .PP
208 The program can also be compile-time configured to always
209 do a chroot(), without needing the -r flag.
210 .PP
211 Note that with some other web servers, such as NCSA httpd, setting
212 up a directory tree for use with chroot() is complicated, involving
213 creating a bunch of special directories and copying in various files.
214 With thttpd it's a lot easier, all you have to do is make sure
215 any shells, utilities, and config files used by your CGI programs and
216 scripts are available.
217 If you have CGI disabled, or if you make a policy that all CGI programs
218 must be written in a compiled language such as C and statically linked,
219 then you probably don't have to do any setup at all.
220 .PP
221 However, one thing you should do is tell syslogd about the chroot tree,
222 so that thttpd can still generate syslog messages.
223 Check your system's syslodg man page for how to do this.
224 In FreeBSD you would put something like this in /etc/rc.conf:
225 .nf
226 syslogd_flags="-l /usr/local/www/data/dev/log"
227 .fi
228 Substitute in your own chroot tree's pathname, of course.
229 Don't worry about creating the log socket, syslogd wants to do that itself.
230 (You may need to create the dev directory.)
231 In Linux the flag is -a instead of -l, and there may be other differences.
232 .PP
233 Relevant config.h option: ALWAYS_CHROOT.
234 .SH "CGI"
235 .PP
236 thttpd supports the CGI 1.1 spec.
237 .PP
238 In order for a CGI program to be run, its name must match the pattern
239 specified either at compile time or on the command line with the -c flag.
240 This is a simple shell-style filename pattern.
241 You can use * to match any string not including a slash,
242 or ** to match any string including slashes,
243 or ? to match any single character.
244 You can also use multiple such patterns separated by |.
245 The patterns get checked against the filename
246 part of the incoming URL.
247 Don't forget to quote any wildcard characters so that the shell doesn't
248 mess with them.
249 .PP
250 Restricting CGI programs to a single directory lets the site administrator
251 review them for security holes, and is strongly recommended.
252 If there are individual users that you trust, you can enable their
253 directories too.
254 .PP
255 If no CGI pattern is specified, neither here nor at compile time,
256 then CGI programs cannot be run at all.
257 If you want to disable CGI as a security measure, that's how you do it, just
258 comment out the patterns in the config file and don't run with the -c flag.
259 .PP
260 Note: the current working directory when a CGI program gets run is
261 the directory that the CGI program lives in.
262 This isn't in the CGI 1.1 spec, but it's what most other HTTP servers do.
263 .PP
264 Relevant config.h options: CGI_PATTERN, CGI_TIMELIMIT, CGI_NICE, CGI_PATH, CGI_LD_LIBRARY_PATH, CGIBINDIR.
265 .SH "BASIC AUTHENTICATION"
266 .PP
267 Basic Authentication is available as an option at compile time.
268 If enabled, it uses a password file in the directory to be protected,
269 called .htpasswd by default.
270 This file is formatted as the familiar colon-separated
271 username/encrypted-password pair, records delimited by newlines.
272 The protection does not carry over to subdirectories.
273 The utility program htpasswd(1) is included to help create and
274 modify .htpasswd files.
275 .PP
276 Relevant config.h option: AUTH_FILE
277 .SH "THROTTLING"
278 .PP
279 The throttle file lets you set maximum byte rates on URLs or URL groups.
280 You can optionally set a minimum rate too.
281 The format of the throttle file is very simple.
282 A # starts a comment, and the rest of the line is ignored.
283 Blank lines are ignored.
284 The rest of the lines should consist of a pattern, whitespace, and a number.
285 The pattern is a simple shell-style filename pattern, using ?/**/*, or
286 multiple such patterns separated by |.
287 .PP
288 The numbers in the file are byte rates, specified in units of bytes per second.
289 For comparison, a v.90 modem gives about 5000 B/s depending on compression,
290 a double-B-channel ISDN line about 12800 B/s, and a T1 line is about
291 150000 B/s.
292 If you want to set a minimum rate as well, use number-number.
293 .PP
294 Example:
295 .nf
296 # throttle file for www.acme.com
297
298 ** 2000-100000 # limit total web usage to 2/3 of our T1,
299 # but never go below 2000 B/s
300 **.jpg|**.gif 50000 # limit images to 1/3 of our T1
301 **.mpg 20000 # and movies to even less
302 jef/** 20000 # jef's pages are too popular
303 .fi
304 .PP
305 Throttling is implemented by checking each incoming URL filename against all
306 of the patterns in the throttle file.
307 The server accumulates statistics on how much bandwidth each pattern
308 has accounted for recently (via a rolling average).
309 If a URL matches a pattern that has been exceeding its specified limit,
310 then the data returned is actually slowed down, with
311 pauses between each block.
312 If that's not possible (e.g. for CGI programs) or if the bandwidth has gotten
313 way larger than the limit, then the server returns a special code
314 saying 'try again later'.
315 .PP
316 The minimum rates are implemented similarly.
317 If too many people are trying to fetch something at the same time,
318 throttling may slow down each connection so much that it's not really
319 useable.
320 Furthermore, all those slow connections clog up the server, using
321 up file handles and connection slots.
322 Setting a minimum rate says that past a certain point you should not
323 even bother - the server returns the 'try again later" code and the
324 connection isn't even started.
325 .PP
326 There is no provision for setting a maximum connections/second throttle,
327 because throttling a request uses as much cpu as handling it, so
328 there would be no point.
329 There is also no provision for throttling the number of simultaneous
330 connections on a per-URL basis.
331 However you can control the overall number of connections for the whole
332 server very simply, by setting the operating system's per-process file
333 descriptor limit before starting thttpd.
334 Be sure to set the hard limit, not the soft limit.
335 .SH "MULTIHOMING"
336 .PP
337 Multihoming means using one machine to serve multiple hostnames.
338 For instance, if you're an internet provider and you want to let
339 all of your customers have customized web addresses, you might
340 have www.joe.acme.com, www.jane.acme.com, and your own www.acme.com,
341 all running on the same physical hardware.
342 This feature is also known as "virtual hosts".
343 There are three steps to setting this up.
344 .PP
345 One, make DNS entries for all of the hostnames.
346 The current way to do this, allowed by HTTP/1.1, is to use CNAME aliases,
347 like so:
348 .nf
349 www.acme.com IN A 192.100.66.1
350 www.joe.acme.com IN CNAME www.acme.com
351 www.jane.acme.com IN CNAME www.acme.com
352 .fi
353 However, this is incompatible with older HTTP/1.0 browsers.
354 If you want to stay compatible, there's a different way - use A records
355 instead, each with a different IP address, like so:
356 .nf
357 www.acme.com IN A 192.100.66.1
358 www.joe.acme.com IN A 192.100.66.200
359 www.jane.acme.com IN A 192.100.66.201
360 .fi
361 This is bad because it uses extra IP addresses, a somewhat scarce resource.
362 But if you want people with older browsers to be able to visit your
363 sites, you still have to do it this way.
364 .PP
365 Step two.
366 If you're using the modern CNAME method of multihoming, then you can
367 skip this step.
368 Otherwise, using the older multiple-IP-address method you
369 must set up IP aliases or multiple interfaces for the extra addresses.
370 You can use ifconfig(8)'s alias command to tell the machine to answer to
371 all of the different IP addresses.
372 Example:
373 .nf
374 ifconfig le0 www.acme.com
375 ifconfig le0 www.joe.acme.com alias
376 ifconfig le0 www.jane.acme.com alias
377 .fi
378 If your OS's version of ifconfig doesn't have an alias command, you're
379 probably out of luck (but see http://www.acme.com/software/thttpd/notes.html).
380 .PP
381 Third and last, you must set up thttpd to handle the multiple hosts.
382 The easiest way is with the -v flag, or the ALWAYS_VHOST config.h option.
383 This works with either CNAME multihosting or multiple-IP multihosting.
384 What it does is send each incoming request to a subdirectory based on the
385 hostname it's intended for.
386 All you have to do in order to set things up is to create those subdirectories
387 in the directory where thttpd will run.
388 With the example above, you'd do like so:
389 .nf
390 mkdir www.acme.com www.joe.acme.com www.jane.acme.com
391 .fi
392 If you're using old-style multiple-IP multihosting, you should also create
393 symbolic links from the numeric addresses to the names, like so:
394 .nf
395 ln -s www.acme.com 192.100.66.1
396 ln -s www.joe.acme.com 192.100.66.200
397 ln -s www.jane.acme.com 192.100.66.201
398 .fi
399 This lets the older HTTP/1.0 browsers find the right subdirectory.
400 .PP
401 There's an optional alternate step three if you're using multiple-IP
402 multihosting: run a separate thttpd process for each hostname, using
403 the -h flag to specify which one is which.
404 This gives you more flexibility, since you can run each of these processes
405 in separate directories, with different throttle files, etc.
406 Example:
407 .nf
408 thttpd -r -d /usr/www -h www.acme.com
409 thttpd -r -d /usr/www/joe -u joe -h www.joe.acme.com
410 thttpd -r -d /usr/www/jane -u jane -h www.jane.acme.com
411 .fi
412 But remember, this multiple-process method does not work with CNAME
413 multihosting - for that, you must use a single thttpd process with
414 the -v flag.
415 .SH "CUSTOM ERRORS"
416 .PP
417 thttpd lets you define your own custom error pages for the various
418 HTTP errors.
419 There's a separate file for each error number, all stored in one
420 special directory.
421 The directory name is "errors", at the top of the web directory tree.
422 The error files should be named "errNNN.html", where NNN is the error number.
423 So for example, to make a custom error page for the authentication failure
424 error, which is number 401, you would put your HTML into the file
425 "errors/err401.html".
426 If no custom error file is found for a given error number, then the
427 usual built-in error page is generated.
428 .PP
429 If you're using the virtual hosts option, you can also have different
430 custom error pages for each different virtual host.
431 In this case you put another "errors" directory in the top of that
432 virtual host's web tree.
433 thttpd will look first in the virtual host errors directory, and
434 then in the server-wide errors directory, and if neither of those
435 has an appropriate error file then it will generate the built-in error.
436 .SH "NON-LOCAL REFERRERS"
437 .PP
438 Sometimes another site on the net will embed your image files in their
439 HTML files, which basically means they're stealing your bandwidth.
440 You can prevent them from doing this by using non-local referrer filtering.
441 With this option, certain files can only be fetched via a local referrer.
442 The files have to be referenced by a local web page.
443 If a web page on some other site references the files, that fetch will
444 be blocked.
445 There are three config-file variables for this feature:
446 .TP
447 .B urlpat
448 A wildcard pattern for the URLs that should require a local referrer.
449 This is typically just image files, sound files, and so on.
450 For example:
451 .nf
452 urlpat=**.jpg|**.gif|**.au|**.wav
453 .fi
454 For most sites, that one setting is all you need to enable referrer filtering.
455 .TP
456 .B noemptyreferrers
457 By default, requests with no referrer at all, or a null referrer, or a
458 referrer with no apparent hostname, are allowed.
459 With this variable set, such requests are disallowed.
460 .TP
461 .B localpat
462 A wildcard pattern that specifies the local host or hosts.
463 This is used to determine if the host in the referrer is local or not.
464 If not specified it defaults to the actual local hostname.
465 .SH SYMLINKS
466 .PP
467 thttpd is very picky about symbolic links.
468 Before delivering any file, it first checks each element in the path
469 to see if it's a symbolic link, and expands them all out to get the final
470 actual filename.
471 Along the way it checks for things like links with ".." that go above
472 the server's directory, and absolute symlinks (ones that start with a /).
473 These are prohibited as security holes, so the server returns an
474 error page for them.
475 This means you can't set up your web directory with a bunch of symlinks
476 pointing to individual users' home web directories.
477 Instead you do it the other way around - the user web directories are
478 real subdirs of the main web directory, and in each user's home
479 dir there's a symlink pointing to their actual web dir.
480 .PP
481 The CGI pattern is also affected - it gets matched against the fully-expanded
482 filename. So, if you have a single CGI directory but then put a symbolic
483 link in it pointing somewhere else, that won't work. The CGI program will be
484 treated as a regular file and returned to the client, instead of getting run.
485 This could be confusing.
486 .SH PERMISSIONS
487 .PP
488 thttpd is also picky about file permissions.
489 It wants data files (HTML, images) to be world readable.
490 Readable by the group that the thttpd process runs as is not enough - thttpd
491 checks explicitly for the world-readable bit.
492 This is so that no one ever gets surprised by a file that's not set
493 world-readable and yet somehow is readable by the HTTP server and
494 therefore the *whole* world.
495 .PP
496 The same logic applies to directories.
497 As with the standard Unix "ls" program, thttpd will only let you
498 look at the contents of a directory if its read bit is on; but
499 as with data files, this must be the world-read bit, not just the
500 group-read bit.
501 .PP
502 thttpd also wants the execute bit to be *off* for data files.
503 A file that is marked executable but doesn't match the CGI pattern
504 might be a script or program that got accidentally left in the
505 wrong directory.
506 Allowing people to fetch the contents of the file might be a security breach,
507 so this is prohibited.
508 Of course if an executable file *does* match the CGI pattern, then it
509 just gets run as a CGI.
510 .PP
511 In summary, data files should be mode 644 (rw-r--r--),
512 directories should be 755 (rwxr-xr-x) if you want to allow indexing and
513 711 (rwx--x--x) to disallow it, and CGI programs should be mode
514 755 (rwxr-xr-x) or 711 (rwx--x--x).
515 .SH LOGS
516 .PP
517 thttpd does all of its logging via syslog(3).
518 The facility it uses is configurable.
519 Aside from error messages, there are only a few log entry types of interest,
520 all fairly similar to CERN Common Log Format:
521 .nf
522 Aug 6 15:40:34 acme thttpd[583]: 165.113.207.103 - - "GET /file" 200 357
523 Aug 6 15:40:43 acme thttpd[583]: 165.113.207.103 - - "HEAD /file" 200 0
524 Aug 6 15:41:16 acme thttpd[583]: referrer http://www.acme.com/ -> /dir
525 Aug 6 15:41:16 acme thttpd[583]: user-agent Mozilla/1.1N
526 .fi
527 The package includes a script for translating these log entries info
528 CERN-compatible files.
529 Note that thttpd does not translate numeric IP addresses into domain names.
530 This is both to save time and as a minor security measure (the numeric
531 address is harder to spoof).
532 .PP
533 Relevant config.h option: LOG_FACILITY.
534 .PP
535 If you'd rather log directly to a file, you can use the -l command-line
536 flag. But note that error messages still go to syslog.
537 .SH SIGNALS
538 .PP
539 thttpd handles a couple of signals, which you can send via the
540 standard Unix kill(1) command:
541 .TP
542 .B INT,TERM
543 These signals tell thttpd to shut down immediately.
544 Any requests in progress get aborted.
545 .TP
546 .B USR1
547 This signal tells thttpd to shut down as soon as it's done servicing
548 all current requests.
549 In addition, the network socket it uses to accept new connections gets
550 closed immediately, which means a fresh thttpd can be started up
551 immediately.
552 .TP
553 .B USR2
554 This signal tells thttpd to generate the statistics syslog messages
555 immediately, instead of waiting for the regular hourly update.
556 .TP
557 .B HUP
558 This signal tells thttpd to close and re-open its (non-syslog) log file,
559 for instance if you rotated the logs and want it to start using the
560 new one.
561 This is a little tricky to set up correctly, for instance if you are using
562 chroot() then the log file must be within the chroot tree, but it's
563 definitely doable.
564 .SH "SEE ALSO"
565 redirect(8), ssi(8), makeweb(1), htpasswd(1), syslogtocern(8), weblog_parse(1), http_get(1)
566 .SH THANKS
567 .PP
568 Many thanks to contributors, reviewers, testers:
569 John LoVerso, Jordan Hayes, Chris Torek, Jim Thompson, Barton Schaffer,
570 Geoff Adams, Dan Kegel, John Hascall, Bennett Todd, KIKUCHI Takahiro,
571 Catalin Ionescu.
572 Special thanks to Craig Leres for substantial debugging and development,
573 and for not complaining about my coding style very much.
574 .SH AUTHOR
575 Copyright © 1995,1998,1999,2000 by Jef Poskanzer <jef@mail.acme.com>.
576 All rights reserved.
577 .\" Redistribution and use in source and binary forms, with or without
578 .\" modification, are permitted provided that the following conditions
579 .\" are met:
580 .\" 1. Redistributions of source code must retain the above copyright
581 .\" notice, this list of conditions and the following disclaimer.
582 .\" 2. Redistributions in binary form must reproduce the above copyright
583 .\" notice, this list of conditions and the following disclaimer in the
584 .\" documentation and/or other materials provided with the distribution.
585 .\"
586 .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
587 .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
588 .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
589 .\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
590 .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
591 .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
592 .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
593 .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
594 .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
595 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
596 .\" SUCH DAMAGE.
Imprint / Impressum