Documentation Source Text

Hex Artifact Content
Login

Artifact 0c894b1d6be1d50cc7f543c34b531f8231c256c2:


0000: 2f 2a 0a 2a 2a 20 41 20 73 6d 61 6c 6c 2c 20 73  /*.** A small, s
0010: 69 6d 70 6c 65 20 48 54 54 50 20 73 65 72 76 65  imple HTTP serve
0020: 72 2e 0a 2a 2a 0a 2a 2a 20 46 65 61 74 75 72 65  r..**.** Feature
0030: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 4c  s:.**.**     * L
0040: 61 75 6e 63 68 65 64 20 66 72 6f 6d 20 69 6e 65  aunched from ine
0050: 74 64 0a 2a 2a 20 20 20 20 20 2a 20 4f 6e 65 20  td.**     * One 
0060: 70 72 6f 63 65 73 73 20 70 65 72 20 72 65 71 75  process per requ
0070: 65 73 74 0a 2a 2a 20 20 20 20 20 2a 20 44 65 6c  est.**     * Del
0080: 69 76 65 72 20 73 74 61 74 69 63 20 63 6f 6e 74  iver static cont
0090: 65 6e 74 20 6f 72 20 72 75 6e 20 43 47 49 0a 2a  ent or run CGI.*
00a0: 2a 20 20 20 20 20 2a 20 56 69 72 74 75 61 6c 20  *     * Virtual 
00b0: 73 69 74 65 73 20 62 61 73 65 64 20 6f 6e 20 74  sites based on t
00c0: 68 65 20 22 48 6f 73 74 3a 22 20 70 72 6f 70 65  he "Host:" prope
00d0: 72 74 79 20 6f 66 20 74 68 65 20 48 54 54 50 20  rty of the HTTP 
00e0: 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 2a 20  header.**     * 
00f0: 56 65 72 79 20 73 6d 61 6c 6c 20 63 6f 64 65 20  Very small code 
0100: 62 61 73 65 20 28 31 20 66 69 6c 65 29 20 74 6f  base (1 file) to
0110: 20 66 61 63 69 6c 69 74 61 74 65 20 73 65 63 75   facilitate secu
0120: 72 69 74 79 20 61 75 64 69 74 69 6e 67 0a 2a 2a  rity auditing.**
0130: 20 20 20 20 20 2a 20 53 69 6d 70 6c 65 20 73 65       * Simple se
0140: 74 75 70 20 2d 20 6e 6f 20 63 6f 6e 66 69 67 75  tup - no configu
0150: 72 61 74 69 6f 6e 20 66 69 6c 65 73 20 74 6f 20  ration files to 
0160: 6d 65 73 73 20 77 69 74 68 2e 0a 2a 2a 20 0a 2a  mess with..** .*
0170: 2a 20 54 68 69 73 20 66 69 6c 65 20 69 6d 70 6c  * This file impl
0180: 65 6d 65 6e 74 73 20 61 20 73 6d 61 6c 6c 20 61  ements a small a
0190: 6e 64 20 73 69 6d 70 6c 65 20 62 75 74 20 73 65  nd simple but se
01a0: 63 75 72 65 20 61 6e 64 20 65 66 66 65 63 74 69  cure and effecti
01b0: 76 65 20 77 65 62 0a 2a 2a 20 73 65 72 76 65 72  ve web.** server
01c0: 2e 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  .  There are no 
01d0: 66 72 69 6c 6c 73 2e 20 20 41 6e 79 74 68 69 6e  frills.  Anythin
01e0: 67 20 74 68 61 74 20 63 6f 75 6c 64 20 62 65 20  g that could be 
01f0: 72 65 61 73 6f 6e 61 62 6c 79 0a 2a 2a 20 6f 6d  reasonably.** om
0200: 69 74 74 65 64 20 68 61 73 20 62 65 65 6e 2e 0a  itted has been..
0210: 2a 2a 0a 2a 2a 20 53 65 74 75 70 20 72 75 6c 65  **.** Setup rule
0220: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  s:.**.**    (1) 
0230: 4c 61 75 6e 63 68 20 61 73 20 72 6f 6f 74 20 66  Launch as root f
0240: 72 6f 6d 20 69 6e 65 74 64 20 6c 69 6b 65 20 74  rom inetd like t
0250: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
0260: 20 20 20 20 20 20 68 74 74 70 64 20 2d 6c 6f 67        httpd -log
0270: 66 69 6c 65 20 6c 6f 67 66 69 6c 65 20 2d 72 6f  file logfile -ro
0280: 6f 74 20 2f 68 6f 6d 65 2f 77 77 77 20 2d 75 73  ot /home/www -us
0290: 65 72 20 6e 6f 62 6f 64 79 0a 2a 2a 0a 2a 2a 20  er nobody.**.** 
02a0: 20 20 20 20 20 20 20 49 74 20 77 69 6c 6c 20 61         It will a
02b0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 72  utomatically chr
02c0: 6f 6f 74 20 74 6f 20 2f 68 6f 6d 65 2f 77 77 77  oot to /home/www
02d0: 20 61 6e 64 20 62 65 63 6f 6d 65 20 75 73 65 72   and become user
02e0: 20 6e 6f 62 6f 64 79 2e 0a 2a 2a 20 20 20 20 20   nobody..**     
02f0: 20 20 20 54 68 65 20 6c 6f 67 66 69 6c 65 20 6e     The logfile n
0300: 61 6d 65 20 73 68 6f 75 6c 64 20 62 65 20 72 65  ame should be re
0310: 6c 61 74 69 76 65 20 74 6f 20 74 68 65 20 63 68  lative to the ch
0320: 72 6f 6f 74 20 6a 61 69 6c 2e 0a 2a 2a 0a 2a 2a  root jail..**.**
0330: 20 20 20 20 28 32 29 20 44 69 72 65 63 74 6f 72      (2) Director
0340: 69 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ies of the form 
0350: 22 2a 2e 77 65 62 73 69 74 65 22 20 28 65 78 3a  "*.website" (ex:
0360: 20 77 77 77 5f 68 77 61 63 69 5f 63 6f 6d 2e 77   www_hwaci_com.w
0370: 65 62 73 69 74 65 29 0a 2a 2a 20 20 20 20 20 20  ebsite).**      
0380: 20 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e    contain conten
0390: 74 2e 20 20 54 68 65 20 64 69 72 65 63 74 6f 72  t.  The director
03a0: 79 20 69 73 20 63 68 6f 73 65 6e 20 62 61 73 65  y is chosen base
03b0: 64 20 6f 6e 20 48 4f 53 54 2e 20 20 49 66 20 6e  d on HOST.  If n
03c0: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 48 4f 53 54  o.**        HOST
03d0: 20 6f 72 20 74 68 65 20 68 6f 73 74 20 64 69 72   or the host dir
03e0: 65 63 74 6f 72 79 20 69 73 20 6e 6f 74 20 66 6f  ectory is not fo
03f0: 75 6e 64 2c 20 22 64 65 66 61 75 6c 74 2e 77 65  und, "default.we
0400: 62 73 69 74 65 22 20 69 73 20 75 73 65 64 2e 0a  bsite" is used..
0410: 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 41 6e 79  **.**    (3) Any
0420: 20 66 69 6c 65 20 6f 72 20 64 69 72 65 63 74 6f   file or directo
0430: 72 79 20 77 68 6f 73 65 20 6e 61 6d 65 20 62 65  ry whose name be
0440: 67 69 6e 73 20 77 69 74 68 20 22 2e 22 20 6f 72  gins with "." or
0450: 20 22 2d 22 20 69 73 20 69 67 6e 6f 72 65 64 2e   "-" is ignored.
0460: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 43 68  .**.**    (4) Ch
0470: 61 72 61 63 74 65 72 73 20 6f 74 68 65 72 20 74  aracters other t
0480: 68 61 6e 20 61 2d 7a 41 2d 5a 30 2d 39 5f 2e 2c  han a-zA-Z0-9_.,
0490: 2a 7e 2f 20 69 6e 20 74 68 65 20 66 69 6c 65 6e  *~/ in the filen
04a0: 61 6d 65 20 61 72 65 20 74 72 61 6e 73 6c 61 74  ame are translat
04b0: 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 69 6e 74  ed.**        int
04c0: 6f 20 5f 2e 20 20 54 68 69 73 20 69 73 20 61 20  o _.  This is a 
04d0: 64 65 66 65 6e 73 65 20 61 67 61 69 6e 73 74 20  defense against 
04e0: 63 72 6f 73 73 2d 73 69 74 65 20 73 63 72 69 70  cross-site scrip
04f0: 74 69 6e 67 20 61 74 74 61 63 6b 73 20 61 6e 64  ting attacks and
0500: 0a 2a 2a 20 20 20 20 20 20 20 20 6f 74 68 65 72  .**        other
0510: 20 6d 69 73 63 68 69 65 66 2e 0a 2a 2a 0a 2a 2a   mischief..**.**
0520: 20 20 20 20 28 35 29 20 45 78 65 63 75 74 61 62      (5) Executab
0530: 6c 65 20 66 69 6c 65 73 20 61 72 65 20 72 75 6e  le files are run
0540: 20 61 73 20 43 47 49 2e 20 20 41 6c 6c 20 6f 74   as CGI.  All ot
0550: 68 65 72 20 66 69 6c 65 73 20 61 72 65 20 64 65  her files are de
0560: 6c 69 76 65 72 65 64 0a 2a 2a 20 20 20 20 20 20  livered.**      
0570: 20 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 20    as is..**.**  
0580: 20 20 28 36 29 20 46 6f 72 20 53 53 4c 20 73 75    (6) For SSL su
0590: 70 70 6f 72 74 20 75 73 65 20 73 74 75 6e 6e 65  pport use stunne
05a0: 6c 20 61 6e 64 20 61 64 64 20 74 68 65 20 2d 68  l and add the -h
05b0: 74 74 70 73 20 31 20 6f 70 74 69 6f 6e 20 6f 6e  ttps 1 option on
05c0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 68   the.**        h
05d0: 74 74 70 64 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  ttpd command-lin
05e0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 37 29 20  e..**.**    (7) 
05f0: 49 66 20 61 20 66 69 6c 65 20 6e 61 6d 65 64 20  If a file named 
0600: 22 2d 61 75 74 68 22 20 65 78 69 73 74 73 20 69  "-auth" exists i
0610: 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63  n the same direc
0620: 74 6f 72 79 20 61 73 20 66 69 6c 65 20 74 6f 0a  tory as file to.
0630: 2a 2a 20 20 20 20 20 20 20 20 62 65 20 72 75 6e  **        be run
0640: 20 61 73 20 43 47 49 20 6f 72 20 74 6f 20 62 65   as CGI or to be
0650: 20 64 65 6c 69 76 65 72 65 64 2c 20 74 68 65 6e   delivered, then
0660: 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 69 6e 66   it contains inf
0670: 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  ormation.**     
0680: 20 20 20 66 6f 72 20 48 54 54 50 20 42 61 73 69     for HTTP Basi
0690: 63 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 2e  c authorization.
06a0: 20 20 53 65 65 20 66 69 6c 65 20 66 6f 72 6d 61    See file forma
06b0: 74 20 64 65 74 61 69 6c 73 20 62 65 6c 6f 77 2e  t details below.
06c0: 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 42 61 73 69 63 20  .**.**.** Basic 
06d0: 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e 3a 0a 2a  Authorization:.*
06e0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
06f0: 20 22 2d 61 75 74 68 22 20 65 78 69 73 74 73 20   "-auth" exists 
0700: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65  in the same dire
0710: 63 74 6f 72 79 20 61 73 20 74 68 65 20 63 6f 6e  ctory as the con
0720: 74 65 6e 74 20 66 69 6c 65 0a 2a 2a 20 28 66 6f  tent file.** (fo
0730: 72 20 62 6f 74 68 20 73 74 61 74 69 63 20 63 6f  r both static co
0740: 6e 74 65 6e 74 20 61 6e 64 20 43 47 49 29 20 74  ntent and CGI) t
0750: 68 65 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  hen it contains 
0760: 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
0770: 75 73 65 64 0a 2a 2a 20 66 6f 72 20 62 61 73 69  used.** for basi
0780: 63 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 2e  c authorization.
0790: 20 20 54 68 65 20 66 69 6c 65 20 66 6f 72 6d 61    The file forma
07a0: 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t is as follows:
07b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 42 6c 61  .**.**    *  Bla
07c0: 6e 6b 20 6c 69 6e 65 73 20 61 6e 64 20 6c 69 6e  nk lines and lin
07d0: 65 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  es that begin wi
07e0: 74 68 20 27 23 27 20 61 72 65 20 69 67 6e 6f 72  th '#' are ignor
07f0: 65 64 0a 2a 2a 20 20 20 20 2a 20 20 22 68 74 74  ed.**    *  "htt
0800: 70 2d 72 65 64 69 72 65 63 74 22 20 66 6f 72 63  p-redirect" forc
0810: 65 73 20 61 20 72 65 64 69 72 65 63 74 20 74 6f  es a redirect to
0820: 20 48 54 54 50 53 20 69 66 20 6e 6f 74 20 74 68   HTTPS if not th
0830: 65 72 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 20  ere already.**  
0840: 20 20 2a 20 20 22 68 74 74 70 73 2d 6f 6e 6c 79    *  "https-only
0850: 22 20 64 69 73 61 6c 6c 6f 77 73 20 6f 70 65 72  " disallows oper
0860: 61 74 69 6f 6e 20 69 6e 20 48 54 54 50 0a 2a 2a  ation in HTTP.**
0870: 20 20 20 20 2a 20 20 22 75 73 65 72 20 4e 41 4d      *  "user NAM
0880: 45 20 4c 4f 47 49 4e 3a 50 41 53 53 57 4f 52 44  E LOGIN:PASSWORD
0890: 22 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  " checks to see 
08a0: 69 66 20 4c 4f 47 49 4e 3a 50 41 53 53 57 4f 52  if LOGIN:PASSWOR
08b0: 44 20 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 68  D .**       auth
08c0: 6f 72 69 7a 61 74 69 6f 6e 20 63 72 65 64 65 6e  orization creden
08d0: 74 69 61 6c 73 20 61 72 65 20 70 72 6f 76 69 64  tials are provid
08e0: 65 64 2c 20 61 6e 64 20 69 66 20 73 6f 20 73 65  ed, and if so se
08f0: 74 73 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  ts the.**       
0900: 52 45 4d 4f 54 45 5f 55 53 45 52 20 74 6f 20 4e  REMOTE_USER to N
0910: 41 4d 45 2e 0a 2a 2a 20 20 20 20 2a 20 20 22 72  AME..**    *  "r
0920: 65 61 6c 6d 20 54 45 58 54 22 20 73 65 74 73 20  ealm TEXT" sets 
0930: 74 68 65 20 72 65 61 6c 6d 20 74 6f 20 54 45 58  the realm to TEX
0940: 54 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 63  T..**.** There c
0950: 61 6e 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 22  an be multiple "
0960: 75 73 65 72 22 20 6c 69 6e 65 73 2e 20 20 49 66  user" lines.  If
0970: 20 6e 6f 20 22 75 73 65 72 22 20 6c 69 6e 65 20   no "user" line 
0980: 6d 61 74 63 68 65 73 2c 20 74 68 65 0a 2a 2a 20  matches, the.** 
0990: 72 65 71 75 65 73 74 20 66 61 69 6c 73 20 77 69  request fails wi
09a0: 74 68 20 61 20 34 30 31 20 65 72 72 6f 72 2e 0a  th a 401 error..
09b0: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  */.#include <std
09c0: 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  io.h>.#include <
09d0: 63 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  ctype.h>.#includ
09e0: 65 20 3c 73 79 73 6c 6f 67 2e 68 3e 0a 23 69 6e  e <syslog.h>.#in
09f0: 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e  clude <stdlib.h>
0a00: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73  .#include <sys/s
0a10: 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  tat.h>.#include 
0a20: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
0a30: 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69  ude <fcntl.h>.#i
0a40: 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68  nclude <string.h
0a50: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 70 77 64 2e  >.#include <pwd.
0a60: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
0a70: 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  /time.h>.#includ
0a80: 65 20 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a  e <sys/types.h>.
0a90: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 6f  #include <sys/so
0aa0: 63 6b 65 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  cket.h>.#include
0ab0: 20 3c 73 79 73 2f 77 61 69 74 2e 68 3e 0a 23 69   <sys/wait.h>.#i
0ac0: 6e 63 6c 75 64 65 20 3c 6e 65 74 69 6e 65 74 2f  nclude <netinet/
0ad0: 69 6e 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  in.h>.#include <
0ae0: 61 72 70 61 2f 69 6e 65 74 2e 68 3e 0a 23 69 6e  arpa/inet.h>.#in
0af0: 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e  clude <stdarg.h>
0b00: 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e  .#include <time.
0b10: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
0b20: 2f 74 69 6d 65 73 2e 68 3e 0a 23 69 6e 63 6c 75  /times.h>.#inclu
0b30: 64 65 20 3c 6e 65 74 64 62 2e 68 3e 0a 23 69 6e  de <netdb.h>.#in
0b40: 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a  clude <errno.h>.
0b50: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 72 65  #include <sys/re
0b60: 73 6f 75 72 63 65 2e 68 3e 0a 23 69 66 64 65 66  source.h>.#ifdef
0b70: 20 6c 69 6e 75 78 0a 23 69 6e 63 6c 75 64 65 20   linux.#include 
0b80: 3c 73 79 73 2f 73 65 6e 64 66 69 6c 65 2e 68 3e  <sys/sendfile.h>
0b90: 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65  .#endif.#include
0ba0: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 2f 2a 0a   <assert.h>../*.
0bb0: 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65  ** Configure the
0bc0: 20 73 65 72 76 65 72 20 62 79 20 73 65 74 74 69   server by setti
0bd0: 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
0be0: 20 6d 61 63 72 6f 73 20 61 6e 64 20 72 65 63 6f   macros and reco
0bf0: 6d 70 69 6c 69 6e 67 2e 0a 2a 2f 0a 23 69 66 6e  mpiling..*/.#ifn
0c00: 64 65 66 20 44 45 46 41 55 4c 54 5f 50 4f 52 54  def DEFAULT_PORT
0c10: 0a 23 64 65 66 69 6e 65 20 44 45 46 41 55 4c 54  .#define DEFAULT
0c20: 5f 50 4f 52 54 20 22 38 30 22 0a 23 65 6e 64 69  _PORT "80".#endi
0c30: 66 0a 23 69 66 6e 64 65 66 20 4d 41 58 5f 43 4f  f.#ifndef MAX_CO
0c40: 4e 54 45 4e 54 5f 4c 45 4e 47 54 48 0a 23 64 65  NTENT_LENGTH.#de
0c50: 66 69 6e 65 20 4d 41 58 5f 43 4f 4e 54 45 4e 54  fine MAX_CONTENT
0c60: 5f 4c 45 4e 47 54 48 20 39 30 30 30 30 30 30 0a  _LENGTH 9000000.
0c70: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65  #endif../*.** We
0c80: 20 72 65 63 6f 72 64 20 6d 6f 73 74 20 6f 66 20   record most of 
0c90: 74 68 65 20 73 74 61 74 65 20 69 6e 66 6f 72 6d  the state inform
0ca0: 61 74 69 6f 6e 20 61 73 20 67 6c 6f 62 61 6c 20  ation as global 
0cb0: 76 61 72 69 61 62 6c 65 73 2e 20 20 54 68 69 73  variables.  This
0cc0: 0a 2a 2a 20 73 61 76 65 73 20 68 61 76 69 6e 67  .** saves having
0cd0: 20 74 6f 20 70 61 73 73 20 69 6e 66 6f 72 6d 61   to pass informa
0ce0: 74 69 6f 6e 20 74 6f 20 73 75 62 72 6f 75 74 69  tion to subrouti
0cf0: 6e 65 73 20 61 73 20 70 61 72 61 6d 65 74 65 72  nes as parameter
0d00: 73 2c 20 61 6e 64 0a 2a 2a 20 6d 61 6b 65 73 20  s, and.** makes 
0d10: 74 68 65 20 65 78 65 63 75 74 61 62 6c 65 20 73  the executable s
0d20: 6d 61 6c 6c 65 72 2e 2e 2e 0a 2a 2f 0a 73 74 61  maller....*/.sta
0d30: 74 69 63 20 63 68 61 72 20 2a 7a 52 6f 6f 74 20  tic char *zRoot 
0d40: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
0d50: 20 52 6f 6f 74 20 64 69 72 65 63 74 6f 72 79 20   Root directory 
0d60: 6f 66 20 74 68 65 20 77 65 62 73 69 74 65 20 2a  of the website *
0d70: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a  /.static char *z
0d80: 54 6d 70 4e 61 6d 20 3d 20 30 3b 20 20 20 20 20  TmpNam = 0;     
0d90: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20     /* Name of a 
0da0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a  temporary file *
0db0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 54  /.static char zT
0dc0: 6d 70 4e 61 6d 42 75 66 5b 35 30 30 5d 3b 20 20  mpNamBuf[500];  
0dd0: 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68     /* Space to h
0de0: 6f 6c 64 20 74 68 65 20 74 65 6d 70 6f 72 61 72  old the temporar
0df0: 79 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 73 74  y filename */.st
0e00: 61 74 69 63 20 63 68 61 72 20 2a 7a 50 72 6f 74  atic char *zProt
0e10: 6f 63 6f 6c 20 3d 20 30 3b 20 20 20 20 20 20 2f  ocol = 0;      /
0e20: 2a 20 54 68 65 20 70 72 6f 74 6f 63 6f 6c 20 62  * The protocol b
0e30: 65 69 6e 67 20 75 73 69 6e 67 20 62 79 20 74 68  eing using by th
0e40: 65 20 62 72 6f 77 73 65 72 20 2a 2f 0a 73 74 61  e browser */.sta
0e50: 74 69 63 20 63 68 61 72 20 2a 7a 4d 65 74 68 6f  tic char *zMetho
0e60: 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  d = 0;        /*
0e70: 20 54 68 65 20 6d 65 74 68 6f 64 2e 20 20 4d 75   The method.  Mu
0e80: 73 74 20 62 65 20 47 45 54 20 2a 2f 0a 73 74 61  st be GET */.sta
0e90: 74 69 63 20 63 68 61 72 20 2a 7a 53 63 72 69 70  tic char *zScrip
0ea0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  t = 0;        /*
0eb0: 20 54 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 72   The object to r
0ec0: 65 74 72 69 65 76 65 20 2a 2f 0a 73 74 61 74 69  etrieve */.stati
0ed0: 63 20 63 68 61 72 20 2a 7a 52 65 61 6c 53 63 72  c char *zRealScr
0ee0: 69 70 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 54  ipt = 0;    /* T
0ef0: 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74  he object to ret
0f00: 72 69 65 76 65 2e 20 20 53 61 6d 65 20 61 73 20  rieve.  Same as 
0f10: 7a 53 63 72 69 70 74 0a 20 20 20 20 20 20 20 20  zScript.        
0f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f30: 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 63 65           ** exce
0f40: 70 74 20 6d 69 67 68 74 20 68 61 76 65 20 22 2f  pt might have "/
0f50: 69 6e 64 65 78 2e 68 74 6d 6c 22 20 61 70 70 65  index.html" appe
0f60: 6e 64 65 64 20 2a 2f 0a 73 74 61 74 69 63 20 63  nded */.static c
0f70: 68 61 72 20 2a 7a 48 6f 6d 65 20 3d 20 30 3b 20  har *zHome = 0; 
0f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0f90: 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69  directory contai
0fa0: 6e 69 6e 67 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  ning content */.
0fb0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 51 75  static char *zQu
0fc0: 65 72 79 53 74 72 69 6e 67 20 3d 20 30 3b 20 20  eryString = 0;  
0fd0: 20 2f 2a 20 54 68 65 20 71 75 65 72 79 20 73 74   /* The query st
0fe0: 72 69 6e 67 20 6f 6e 20 74 68 65 20 65 6e 64 20  ring on the end 
0ff0: 6f 66 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 73  of the name */.s
1000: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 46 69 6c  tatic char *zFil
1010: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
1020: 2f 2a 20 54 68 65 20 66 69 6c 65 6e 61 6d 65 20  /* The filename 
1030: 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f  of the object to
1040: 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 73 74 61   retrieve */.sta
1050: 74 69 63 20 69 6e 74 20 6c 65 6e 46 69 6c 65 20  tic int lenFile 
1060: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
1070: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a   Length of the z
1080: 46 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 73 74 61  File name */.sta
1090: 74 69 63 20 63 68 61 72 20 2a 7a 44 69 72 20 3d  tic char *zDir =
10a0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
10b0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72   Name of the dir
10c0: 65 63 74 6f 72 79 20 68 6f 6c 64 69 6e 67 20 7a  ectory holding z
10d0: 46 69 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20 63  File */.static c
10e0: 68 61 72 20 2a 7a 50 61 74 68 49 6e 66 6f 20 3d  har *zPathInfo =
10f0: 20 30 3b 20 20 20 20 20 20 2f 2a 20 50 61 72 74   0;      /* Part
1100: 20 6f 66 20 74 68 65 20 70 61 74 68 6e 61 6d 65   of the pathname
1110: 20 70 61 73 74 20 74 68 65 20 66 69 6c 65 20 2a   past the file *
1120: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a  /.static char *z
1130: 41 67 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20  Agent = 0;      
1140: 20 20 20 2f 2a 20 57 68 61 74 20 74 79 70 65 20     /* What type 
1150: 69 66 20 62 72 6f 77 73 65 72 20 69 73 20 6d 61  if browser is ma
1160: 6b 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20  king this query 
1170: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
1180: 7a 53 65 72 76 65 72 4e 61 6d 65 20 3d 20 30 3b  zServerName = 0;
1190: 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20      /* The name 
11a0: 61 66 74 65 72 20 74 68 65 20 68 74 74 70 3a 2f  after the http:/
11b0: 2f 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  / */.static char
11c0: 20 2a 7a 53 65 72 76 65 72 50 6f 72 74 20 3d 20   *zServerPort = 
11d0: 30 3b 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 72  0;    /* The por
11e0: 74 20 6e 75 6d 62 65 72 20 2a 2f 0a 73 74 61 74  t number */.stat
11f0: 69 63 20 63 68 61 72 20 2a 7a 43 6f 6f 6b 69 65  ic char *zCookie
1200: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
1210: 43 6f 6f 6b 69 65 73 20 72 65 70 6f 72 74 65 64  Cookies reported
1220: 20 77 69 74 68 20 74 68 65 20 72 65 71 75 65 73   with the reques
1230: 74 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  t */.static char
1240: 20 2a 7a 48 74 74 70 48 6f 73 74 20 3d 20 30 3b   *zHttpHost = 0;
1250: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 61 63        /* Name ac
1260: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 77  cording to the w
1270: 65 62 20 62 72 6f 77 73 65 72 20 2a 2f 0a 73 74  eb browser */.st
1280: 61 74 69 63 20 63 68 61 72 20 2a 7a 52 65 61 6c  atic char *zReal
1290: 50 6f 72 74 20 3d 20 30 3b 20 20 20 20 20 20 2f  Port = 0;      /
12a0: 2a 20 54 68 65 20 72 65 61 6c 20 54 43 50 20 70  * The real TCP p
12b0: 6f 72 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67  ort when running
12c0: 20 61 73 20 64 61 65 6d 6f 6e 20 2a 2f 0a 73 74   as daemon */.st
12d0: 61 74 69 63 20 63 68 61 72 20 2a 7a 52 65 6d 6f  atic char *zRemo
12e0: 74 65 41 64 64 72 20 3d 20 30 3b 20 20 20 20 2f  teAddr = 0;    /
12f0: 2a 20 49 50 20 61 64 64 72 65 73 73 20 6f 66 20  * IP address of 
1300: 74 68 65 20 72 65 71 75 65 73 74 20 2a 2f 0a 73  the request */.s
1310: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 52 65 66  tatic char *zRef
1320: 65 72 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  erer = 0;       
1330: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70  /* Name of the p
1340: 61 67 65 20 74 68 61 74 20 72 65 66 65 72 65 64  age that refered
1350: 20 74 6f 20 75 73 20 2a 2f 0a 73 74 61 74 69 63   to us */.static
1360: 20 63 68 61 72 20 2a 7a 41 63 63 65 70 74 20 3d   char *zAccept =
1370: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 68   0;        /* Wh
1380: 61 74 20 66 6f 72 6d 61 74 73 20 77 69 6c 6c 20  at formats will 
1390: 62 65 20 61 63 63 65 70 74 65 64 20 2a 2f 0a 73  be accepted */.s
13a0: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 43 6f 6e  tatic char *zCon
13b0: 74 65 6e 74 4c 65 6e 67 74 68 20 3d 20 30 3b 20  tentLength = 0; 
13c0: 2f 2a 20 43 6f 6e 74 65 6e 74 20 6c 65 6e 67 74  /* Content lengt
13d0: 68 20 72 65 70 6f 72 74 65 64 20 69 6e 20 74 68  h reported in th
13e0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 73 74 61 74  e header */.stat
13f0: 69 63 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e  ic char *zConten
1400: 74 54 79 70 65 20 3d 20 30 3b 20 20 20 2f 2a 20  tType = 0;   /* 
1410: 43 6f 6e 74 65 6e 74 20 74 79 70 65 20 72 65 70  Content type rep
1420: 6f 72 74 65 64 20 69 6e 20 74 68 65 20 68 65 61  orted in the hea
1430: 64 65 72 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  der */.static ch
1440: 61 72 20 2a 7a 51 75 65 72 79 53 75 66 66 69 78  ar *zQuerySuffix
1450: 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 70   = 0;   /* The p
1460: 61 72 74 20 6f 66 20 74 68 65 20 55 52 4c 20 61  art of the URL a
1470: 66 74 65 72 20 74 68 65 20 66 69 72 73 74 20 3f  fter the first ?
1480: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
1490: 2a 7a 41 75 74 68 54 79 70 65 20 3d 20 30 3b 20  *zAuthType = 0; 
14a0: 20 20 20 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a       /* Authoriz
14b0: 61 74 69 6f 6e 20 74 79 70 65 20 28 62 61 73 69  ation type (basi
14c0: 63 20 6f 72 20 64 69 67 65 73 74 29 20 2a 2f 0a  c or digest) */.
14d0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 41 75  static char *zAu
14e0: 74 68 41 72 67 20 3d 20 30 3b 20 20 20 20 20 20  thArg = 0;      
14f0: 20 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74 69 6f   /* Authorizatio
1500: 6e 20 76 61 6c 75 65 73 20 2a 2f 0a 73 74 61 74  n values */.stat
1510: 69 63 20 63 68 61 72 20 2a 7a 52 65 6d 6f 74 65  ic char *zRemote
1520: 55 73 65 72 20 3d 20 30 3b 20 20 20 20 2f 2a 20  User = 0;    /* 
1530: 52 45 4d 4f 54 45 5f 55 53 45 52 20 73 65 74 20  REMOTE_USER set 
1540: 62 79 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  by authorization
1550: 20 6d 6f 64 75 6c 65 20 2a 2f 0a 73 74 61 74 69   module */.stati
1560: 63 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 20 20  c int nIn = 0;  
1570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1580: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
1590: 66 20 69 6e 70 75 74 20 2a 2f 0a 73 74 61 74 69  f input */.stati
15a0: 63 20 69 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 20  c int nOut = 0; 
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
15c0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
15d0: 66 20 6f 75 74 70 75 74 20 2a 2f 0a 73 74 61 74  f output */.stat
15e0: 69 63 20 63 68 61 72 20 7a 52 65 70 6c 79 53 74  ic char zReplySt
15f0: 61 74 75 73 5b 34 5d 3b 20 20 20 20 20 2f 2a 20  atus[4];     /* 
1600: 52 65 70 6c 79 20 73 74 61 74 75 73 20 63 6f 64  Reply status cod
1610: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
1620: 73 74 61 74 75 73 53 65 6e 74 20 3d 20 30 3b 20  statusSent = 0; 
1630: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 61 66        /* True af
1640: 74 65 72 20 73 74 61 74 75 73 20 6c 69 6e 65 20  ter status line 
1650: 69 73 20 73 65 6e 74 20 2a 2f 0a 73 74 61 74 69  is sent */.stati
1660: 63 20 63 68 61 72 20 2a 7a 4c 6f 67 46 69 6c 65  c char *zLogFile
1670: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4c   = 0;       /* L
1680: 6f 67 20 74 6f 20 74 68 69 73 20 66 69 6c 65 20  og to this file 
1690: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
16a0: 62 75 67 46 6c 61 67 20 3d 20 30 3b 20 20 20 20  bugFlag = 0;    
16b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 62      /* True if b
16c0: 65 69 6e 67 20 64 65 62 75 67 67 65 64 20 2a 2f  eing debugged */
16d0: 0a 73 74 61 74 69 63 20 74 69 6d 65 5f 74 20 62  .static time_t b
16e0: 65 67 69 6e 54 69 6d 65 3b 20 20 20 20 20 20 20  eginTime;       
16f0: 20 20 2f 2a 20 54 69 6d 65 20 77 68 65 6e 20 74    /* Time when t
1700: 68 69 73 20 70 72 6f 63 65 73 73 20 73 74 61 72  his process star
1710: 74 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ts */.static int
1720: 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e   closeConnection
1730: 20 3d 20 30 3b 20 20 2f 2a 20 54 72 75 65 20 74   = 0;  /* True t
1740: 6f 20 73 65 6e 64 20 43 6f 6e 6e 65 63 74 69 6f  o send Connectio
1750: 6e 3a 20 63 6c 6f 73 65 20 69 6e 20 72 65 70 6c  n: close in repl
1760: 79 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  y */.static int 
1770: 6e 52 65 71 75 65 73 74 20 3d 20 30 3b 20 20 20  nRequest = 0;   
1780: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1790: 6f 66 20 72 65 71 75 65 73 74 73 20 70 72 6f 63  of requests proc
17a0: 65 73 73 65 64 20 2a 2f 0a 73 74 61 74 69 63 20  essed */.static 
17b0: 69 6e 74 20 6f 6d 69 74 4c 6f 67 20 3d 20 30 3b  int omitLog = 0;
17c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
17d0: 6e 6f 74 20 6d 61 6b 65 20 6c 6f 67 66 69 6c 65  not make logfile
17e0: 20 65 6e 74 72 69 65 73 20 69 66 20 74 72 75 65   entries if true
17f0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75   */.static int u
1800: 73 65 48 74 74 70 73 20 3d 20 30 3b 20 20 20 20  seHttps = 0;    
1810: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
1820: 75 73 65 20 48 54 54 50 53 3a 20 69 6e 73 74 65  use HTTPS: inste
1830: 61 64 20 6f 66 20 48 54 54 50 3a 20 2a 2f 0a 73  ad of HTTP: */.s
1840: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 48 74 74  tatic char *zHtt
1850: 70 20 3d 20 22 68 74 74 70 22 3b 20 20 20 20 20  p = "http";     
1860: 2f 2a 20 68 74 74 70 20 6f 72 20 68 74 74 70 73  /* http or https
1870: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75   */.static int u
1880: 73 65 54 69 6d 65 6f 75 74 20 3d 20 31 3b 20 20  seTimeout = 1;  
1890: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
18a0: 75 73 65 20 74 69 6d 65 73 20 2a 2f 0a 73 74 61  use times */.sta
18b0: 74 69 63 20 69 6e 74 20 73 74 61 6e 64 61 6c 6f  tic int standalo
18c0: 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ne = 0;       /*
18d0: 20 52 75 6e 20 61 73 20 61 20 73 74 61 6e 64 61   Run as a standa
18e0: 6c 6f 6e 65 20 73 65 72 76 65 72 20 28 6e 6f 20  lone server (no 
18f0: 69 6e 65 74 64 29 20 2a 2f 0a 73 74 61 74 69 63  inetd) */.static
1900: 20 69 6e 74 20 69 70 76 36 4f 6e 6c 79 20 3d 20   int ipv6Only = 
1910: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73  0;         /* Us
1920: 65 20 49 50 76 36 20 6f 6e 6c 79 20 2a 2f 0a 73  e IPv6 only */.s
1930: 74 61 74 69 63 20 69 6e 74 20 69 70 76 34 4f 6e  tatic int ipv4On
1940: 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ly = 0;         
1950: 2f 2a 20 55 73 65 20 49 50 76 34 20 6f 6e 6c 79  /* Use IPv4 only
1960: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 6f 75 62 6c   */../*.** Doubl
1970: 65 20 61 6e 79 20 64 6f 75 62 6c 65 2d 71 75 6f  e any double-quo
1980: 74 65 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  te characters in
1990: 20 61 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74   a string..*/.st
19a0: 61 74 69 63 20 63 68 61 72 20 2a 45 73 63 61 70  atic char *Escap
19b0: 65 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  e(char *z){.  in
19c0: 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 3b  t i, j;.  int n;
19d0: 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 63 68 61  .  char c;.  cha
19e0: 72 20 2a 7a 4f 75 74 3b 0a 20 20 66 6f 72 28 69  r *zOut;.  for(i
19f0: 3d 30 3b 20 28 63 3d 7a 5b 69 5d 29 21 3d 30 20  =0; (c=z[i])!=0 
1a00: 26 26 20 63 21 3d 27 22 27 3b 20 69 2b 2b 29 7b  && c!='"'; i++){
1a10: 7d 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72  }.  if( c==0 ) r
1a20: 65 74 75 72 6e 20 7a 3b 0a 20 20 6e 20 3d 20 31  eturn z;.  n = 1
1a30: 3b 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 28 63 3d  ;.  for(i++; (c=
1a40: 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 20  z[i])!=0; i++){ 
1a50: 69 66 28 20 63 3d 3d 27 22 27 20 29 20 6e 2b 2b  if( c=='"' ) n++
1a60: 3b 20 7d 0a 20 20 7a 4f 75 74 20 3d 20 6d 61 6c  ; }.  zOut = mal
1a70: 6c 6f 63 28 20 69 2b 6e 2b 31 20 29 3b 0a 20 20  loc( i+n+1 );.  
1a80: 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 20 72 65  if( zOut==0 ) re
1a90: 74 75 72 6e 20 22 22 3b 0a 20 20 66 6f 72 28 69  turn "";.  for(i
1aa0: 3d 6a 3d 30 3b 20 28 63 3d 7a 5b 69 5d 29 21 3d  =j=0; (c=z[i])!=
1ab0: 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 4f 75  0; i++){.    zOu
1ac0: 74 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20  t[j++] = c;.    
1ad0: 69 66 28 20 63 3d 3d 27 22 27 20 29 20 7a 4f 75  if( c=='"' ) zOu
1ae0: 74 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a  t[j++] = c;.  }.
1af0: 20 20 7a 4f 75 74 5b 6a 5d 20 3d 20 30 3b 0a 20    zOut[j] = 0;. 
1b00: 20 72 65 74 75 72 6e 20 7a 4f 75 74 3b 0a 7d 0a   return zOut;.}.
1b10: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 6e 20 65  ./*.** Make an e
1b20: 6e 74 72 79 20 69 6e 20 74 68 65 20 6c 6f 67 20  ntry in the log 
1b30: 66 69 6c 65 2e 20 20 49 66 20 74 68 65 20 48 54  file.  If the HT
1b40: 54 50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 68  TP connection sh
1b50: 6f 75 6c 64 20 62 65 0a 2a 2a 20 63 6c 6f 73 65  ould be.** close
1b60: 64 2c 20 74 68 65 6e 20 74 65 72 6d 69 6e 61 74  d, then terminat
1b70: 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 20  e this process. 
1b80: 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72   Otherwise retur
1b90: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1ba0: 64 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 69  d MakeLogEntry(i
1bb0: 6e 74 20 61 29 7b 0a 20 20 46 49 4c 45 20 2a 6c  nt a){.  FILE *l
1bc0: 6f 67 3b 0a 20 20 69 66 28 20 7a 54 6d 70 4e 61  og;.  if( zTmpNa
1bd0: 6d 20 29 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28  m ){.    unlink(
1be0: 7a 54 6d 70 4e 61 6d 29 3b 0a 20 20 7d 0a 20 20  zTmpNam);.  }.  
1bf0: 69 66 28 20 7a 4c 6f 67 46 69 6c 65 20 26 26 20  if( zLogFile && 
1c00: 21 6f 6d 69 74 4c 6f 67 20 29 7b 0a 20 20 20 20  !omitLog ){.    
1c10: 74 69 6d 65 5f 74 20 6e 6f 77 3b 0a 20 20 20 20  time_t now;.    
1c20: 73 74 72 75 63 74 20 74 6d 20 2a 70 54 6d 3b 0a  struct tm *pTm;.
1c30: 20 20 20 20 73 74 72 75 63 74 20 72 75 73 61 67      struct rusag
1c40: 65 20 73 65 6c 66 2c 20 63 68 69 6c 64 72 65 6e  e self, children
1c50: 3b 0a 20 20 20 20 69 6e 74 20 77 61 69 74 53 74  ;.    int waitSt
1c60: 61 74 75 73 3b 0a 20 20 20 20 63 68 61 72 20 7a  atus;.    char z
1c70: 44 61 74 65 5b 32 30 30 5d 3b 0a 20 20 20 20 63  Date[200];.    c
1c80: 68 61 72 20 2a 7a 52 4d 20 3d 20 7a 52 65 6d 6f  har *zRM = zRemo
1c90: 74 65 55 73 65 72 20 3f 20 7a 52 65 6d 6f 74 65  teUser ? zRemote
1ca0: 55 73 65 72 20 3a 20 22 22 3b 0a 0a 20 20 20 20  User : "";..    
1cb0: 69 66 28 20 7a 53 63 72 69 70 74 3d 3d 30 20 7c  if( zScript==0 |
1cc0: 7c 20 7a 53 63 72 69 70 74 5b 30 5d 3d 3d 30 20  | zScript[0]==0 
1cd0: 29 20 7a 53 63 72 69 70 74 20 3d 20 22 22 3b 0a  ) zScript = "";.
1ce0: 20 20 20 20 69 66 28 20 7a 52 65 6d 6f 74 65 41      if( zRemoteA
1cf0: 64 64 72 3d 3d 30 20 7c 7c 20 7a 52 65 6d 6f 74  ddr==0 || zRemot
1d00: 65 41 64 64 72 5b 30 5d 3d 3d 30 20 29 20 7a 52  eAddr[0]==0 ) zR
1d10: 65 6d 6f 74 65 41 64 64 72 20 3d 20 22 22 3b 0a  emoteAddr = "";.
1d20: 20 20 20 20 69 66 28 20 7a 48 74 74 70 48 6f 73      if( zHttpHos
1d30: 74 3d 3d 30 20 7c 7c 20 7a 48 74 74 70 48 6f 73  t==0 || zHttpHos
1d40: 74 5b 30 5d 3d 3d 30 20 29 20 7a 48 74 74 70 48  t[0]==0 ) zHttpH
1d50: 6f 73 74 20 3d 20 22 22 3b 0a 20 20 20 20 69 66  ost = "";.    if
1d60: 28 20 7a 52 65 66 65 72 65 72 3d 3d 30 20 7c 7c  ( zReferer==0 ||
1d70: 20 7a 52 65 66 65 72 65 72 5b 30 5d 3d 3d 30 20   zReferer[0]==0 
1d80: 29 20 7a 52 65 66 65 72 65 72 20 3d 20 22 22 3b  ) zReferer = "";
1d90: 0a 20 20 20 20 69 66 28 20 7a 41 67 65 6e 74 3d  .    if( zAgent=
1da0: 3d 30 20 7c 7c 20 7a 41 67 65 6e 74 5b 30 5d 3d  =0 || zAgent[0]=
1db0: 3d 30 20 29 20 7a 41 67 65 6e 74 20 3d 20 22 22  =0 ) zAgent = ""
1dc0: 3b 0a 20 20 20 20 74 69 6d 65 28 26 6e 6f 77 29  ;.    time(&now)
1dd0: 3b 0a 20 20 20 20 70 54 6d 20 3d 20 6c 6f 63 61  ;.    pTm = loca
1de0: 6c 74 69 6d 65 28 26 6e 6f 77 29 3b 0a 20 20 20  ltime(&now);.   
1df0: 20 73 74 72 66 74 69 6d 65 28 7a 44 61 74 65 2c   strftime(zDate,
1e00: 20 73 69 7a 65 6f 66 28 7a 44 61 74 65 29 2c 20   sizeof(zDate), 
1e10: 22 25 59 2d 25 6d 2d 25 64 20 25 48 3a 25 4d 3a  "%Y-%m-%d %H:%M:
1e20: 25 53 22 2c 20 70 54 6d 29 3b 0a 20 20 20 20 77  %S", pTm);.    w
1e30: 61 69 74 70 69 64 28 2d 31 2c 20 26 77 61 69 74  aitpid(-1, &wait
1e40: 53 74 61 74 75 73 2c 20 57 4e 4f 48 41 4e 47 29  Status, WNOHANG)
1e50: 3b 0a 20 20 20 20 67 65 74 72 75 73 61 67 65 28  ;.    getrusage(
1e60: 52 55 53 41 47 45 5f 53 45 4c 46 2c 20 26 73 65  RUSAGE_SELF, &se
1e70: 6c 66 29 3b 0a 20 20 20 20 67 65 74 72 75 73 61  lf);.    getrusa
1e80: 67 65 28 52 55 53 41 47 45 5f 43 48 49 4c 44 52  ge(RUSAGE_CHILDR
1e90: 45 4e 2c 20 26 63 68 69 6c 64 72 65 6e 29 3b 0a  EN, &children);.
1ea0: 20 20 20 20 69 66 28 20 28 6c 6f 67 20 3d 20 66      if( (log = f
1eb0: 6f 70 65 6e 28 7a 4c 6f 67 46 69 6c 65 2c 22 61  open(zLogFile,"a
1ec0: 22 29 29 21 3d 30 20 29 7b 0a 23 69 66 64 65 66  "))!=0 ){.#ifdef
1ed0: 20 43 4f 4d 42 49 4e 45 44 5f 4c 4f 47 5f 46 4f   COMBINED_LOG_FO
1ee0: 52 4d 41 54 0a 20 20 20 20 20 20 73 74 72 66 74  RMAT.      strft
1ef0: 69 6d 65 28 7a 44 61 74 65 2c 20 73 69 7a 65 6f  ime(zDate, sizeo
1f00: 66 28 7a 44 61 74 65 29 2c 20 22 25 64 2f 25 62  f(zDate), "%d/%b
1f10: 2f 25 59 3a 25 48 3a 25 4d 3a 25 53 20 25 7a 22  /%Y:%H:%M:%S %z"
1f20: 2c 20 70 54 6d 29 3b 0a 20 20 20 20 20 20 66 70  , pTm);.      fp
1f30: 72 69 6e 74 66 28 6c 6f 67 2c 20 22 25 73 20 2d  rintf(log, "%s -
1f40: 20 2d 20 5b 25 73 5d 20 5c 22 25 73 20 25 73 20   - [%s] \"%s %s 
1f50: 25 73 5c 22 20 25 73 20 25 64 20 5c 22 25 73 5c  %s\" %s %d \"%s\
1f60: 22 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20  " \"%s\"\n",.   
1f70: 20 20 20 20 20 20 20 20 20 20 20 7a 52 65 6d 6f             zRemo
1f80: 74 65 41 64 64 72 2c 20 7a 44 61 74 65 2c 20 7a  teAddr, zDate, z
1f90: 4d 65 74 68 6f 64 2c 20 7a 53 63 72 69 70 74 2c  Method, zScript,
1fa0: 20 7a 50 72 6f 74 6f 63 6f 6c 2c 0a 20 20 20 20   zProtocol,.    
1fb0: 20 20 20 20 20 20 20 20 20 20 7a 52 65 70 6c 79            zReply
1fc0: 53 74 61 74 75 73 2c 20 6e 4f 75 74 2c 20 7a 52  Status, nOut, zR
1fd0: 65 66 65 72 65 72 2c 20 7a 41 67 65 6e 74 29 3b  eferer, zAgent);
1fe0: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 73 74 72  .#else.      str
1ff0: 66 74 69 6d 65 28 7a 44 61 74 65 2c 20 73 69 7a  ftime(zDate, siz
2000: 65 6f 66 28 7a 44 61 74 65 29 2c 20 22 25 59 2d  eof(zDate), "%Y-
2010: 25 6d 2d 25 64 20 25 48 3a 25 4d 3a 25 53 22 2c  %m-%d %H:%M:%S",
2020: 20 70 54 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20   pTm);.      /* 
2030: 4c 6f 67 20 72 65 63 6f 72 64 20 66 69 6c 65 73  Log record files
2040: 3a 0a 20 20 20 20 20 20 2a 2a 20 20 28 31 29 20  :.      **  (1) 
2050: 44 61 74 65 20 61 6e 64 20 74 69 6d 65 0a 20 20  Date and time.  
2060: 20 20 20 20 2a 2a 20 20 28 32 29 20 49 50 20 61      **  (2) IP a
2070: 64 64 72 65 73 73 0a 20 20 20 20 20 20 2a 2a 20  ddress.      ** 
2080: 20 28 33 29 20 55 52 4c 20 62 65 69 6e 67 20 61   (3) URL being a
2090: 63 63 65 73 73 65 64 0a 20 20 20 20 20 20 2a 2a  ccessed.      **
20a0: 20 20 28 34 29 20 52 65 66 65 72 65 72 0a 20 20    (4) Referer.  
20b0: 20 20 20 20 2a 2a 20 20 28 35 29 20 52 65 70 6c      **  (5) Repl
20c0: 79 20 73 74 61 74 75 73 0a 20 20 20 20 20 20 2a  y status.      *
20d0: 2a 20 20 28 36 29 20 42 79 74 65 73 20 72 65 63  *  (6) Bytes rec
20e0: 65 69 76 65 64 0a 20 20 20 20 20 20 2a 2a 20 20  eived.      **  
20f0: 28 37 29 20 42 79 74 65 73 20 73 65 6e 74 0a 20  (7) Bytes sent. 
2100: 20 20 20 20 20 2a 2a 20 20 28 38 29 20 53 65 6c       **  (8) Sel
2110: 66 20 75 73 65 72 20 74 69 6d 65 0a 20 20 20 20  f user time.    
2120: 20 20 2a 2a 20 20 28 39 29 20 53 65 6c 66 20 73    **  (9) Self s
2130: 79 73 74 65 6d 20 74 69 6d 65 0a 20 20 20 20 20  ystem time.     
2140: 20 2a 2a 20 28 31 30 29 20 43 68 69 6c 64 72 65   ** (10) Childre
2150: 6e 20 75 73 65 72 20 74 69 6d 65 0a 20 20 20 20  n user time.    
2160: 20 20 2a 2a 20 28 31 31 29 20 43 68 69 6c 64 72    ** (11) Childr
2170: 65 6e 20 73 79 73 74 65 6d 20 74 69 6d 65 0a 20  en system time. 
2180: 20 20 20 20 20 2a 2a 20 28 31 32 29 20 54 6f 74       ** (12) Tot
2190: 61 6c 20 77 61 6c 6c 2d 63 6c 6f 63 6b 20 74 69  al wall-clock ti
21a0: 6d 65 0a 20 20 20 20 20 20 2a 20 20 28 31 33 29  me.      *  (13)
21b0: 20 52 65 71 75 65 73 74 20 6e 75 6d 62 65 72 20   Request number 
21c0: 66 6f 72 20 73 61 6d 65 20 54 43 50 2f 49 50 20  for same TCP/IP 
21d0: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20  connection.     
21e0: 20 2a 2a 20 28 31 34 29 20 55 73 65 72 20 61 67   ** (14) User ag
21f0: 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 28 31 35  ent.      ** (15
2200: 29 20 52 65 6d 6f 74 65 20 75 73 65 72 0a 20 20  ) Remote user.  
2210: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 70 72      */.      fpr
2220: 69 6e 74 66 28 6c 6f 67 2c 0a 20 20 20 20 20 20  intf(log,.      
2230: 20 20 22 25 73 2c 25 73 2c 5c 22 25 73 3a 2f 2f    "%s,%s,\"%s://
2240: 25 73 25 73 5c 22 2c 5c 22 25 73 5c 22 2c 25 73  %s%s\",\"%s\",%s
2250: 2c 25 64 2c 25 64 2c 25 64 2c 25 64 2c 25 64 2c  ,%d,%d,%d,%d,%d,
2260: 25 64 2c 25 64 2c 25 64 2c 5c 22 25 73 5c 22 2c  %d,%d,%d,\"%s\",
2270: 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20  \"%s\"\n",.     
2280: 20 20 20 7a 44 61 74 65 2c 20 7a 52 65 6d 6f 74     zDate, zRemot
2290: 65 41 64 64 72 2c 20 7a 48 74 74 70 2c 20 45 73  eAddr, zHttp, Es
22a0: 63 61 70 65 28 7a 48 74 74 70 48 6f 73 74 29 2c  cape(zHttpHost),
22b0: 20 45 73 63 61 70 65 28 7a 53 63 72 69 70 74 29   Escape(zScript)
22c0: 2c 0a 20 20 20 20 20 20 20 20 45 73 63 61 70 65  ,.        Escape
22d0: 28 7a 52 65 66 65 72 65 72 29 2c 20 7a 52 65 70  (zReferer), zRep
22e0: 6c 79 53 74 61 74 75 73 2c 20 6e 49 6e 2c 20 6e  lyStatus, nIn, n
22f0: 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 28 69 6e  Out,.        (in
2300: 74 29 28 73 65 6c 66 2e 72 75 5f 75 74 69 6d 65  t)(self.ru_utime
2310: 2e 74 76 5f 73 65 63 2a 31 30 30 30 30 30 30 20  .tv_sec*1000000 
2320: 2b 20 73 65 6c 66 2e 72 75 5f 75 74 69 6d 65 2e  + self.ru_utime.
2330: 74 76 5f 75 73 65 63 29 2c 0a 20 20 20 20 20 20  tv_usec),.      
2340: 20 20 28 69 6e 74 29 28 73 65 6c 66 2e 72 75 5f    (int)(self.ru_
2350: 73 74 69 6d 65 2e 74 76 5f 73 65 63 2a 31 30 30  stime.tv_sec*100
2360: 30 30 30 30 20 2b 20 73 65 6c 66 2e 72 75 5f 73  0000 + self.ru_s
2370: 74 69 6d 65 2e 74 76 5f 75 73 65 63 29 2c 0a 20  time.tv_usec),. 
2380: 20 20 20 20 20 20 20 28 69 6e 74 29 28 63 68 69         (int)(chi
2390: 6c 64 72 65 6e 2e 72 75 5f 75 74 69 6d 65 2e 74  ldren.ru_utime.t
23a0: 76 5f 73 65 63 2a 31 30 30 30 30 30 30 20 2b 20  v_sec*1000000 + 
23b0: 63 68 69 6c 64 72 65 6e 2e 72 75 5f 75 74 69 6d  children.ru_utim
23c0: 65 2e 74 76 5f 75 73 65 63 29 2c 0a 20 20 20 20  e.tv_usec),.    
23d0: 20 20 20 20 28 69 6e 74 29 28 63 68 69 6c 64 72      (int)(childr
23e0: 65 6e 2e 72 75 5f 73 74 69 6d 65 2e 74 76 5f 73  en.ru_stime.tv_s
23f0: 65 63 2a 31 30 30 30 30 30 30 20 2b 20 63 68 69  ec*1000000 + chi
2400: 6c 64 72 65 6e 2e 72 75 5f 73 74 69 6d 65 2e 74  ldren.ru_stime.t
2410: 76 5f 75 73 65 63 29 2c 0a 20 20 20 20 20 20 20  v_usec),.       
2420: 20 28 69 6e 74 29 28 6e 6f 77 20 2d 20 62 65 67   (int)(now - beg
2430: 69 6e 54 69 6d 65 29 2c 0a 20 20 20 20 20 20 20  inTime),.       
2440: 20 6e 52 65 71 75 65 73 74 2c 20 45 73 63 61 70   nRequest, Escap
2450: 65 28 7a 41 67 65 6e 74 29 2c 20 45 73 63 61 70  e(zAgent), Escap
2460: 65 28 7a 52 4d 29 0a 20 20 20 20 20 20 29 3b 0a  e(zRM).      );.
2470: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 63 6c  #endif.      fcl
2480: 6f 73 65 28 6c 6f 67 29 3b 0a 20 20 20 20 20 20  ose(log);.      
2490: 6e 49 6e 20 3d 20 6e 4f 75 74 20 3d 20 30 3b 0a  nIn = nOut = 0;.
24a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
24b0: 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20  closeConnection 
24c0: 29 7b 0a 20 20 20 20 65 78 69 74 28 61 29 3b 0a  ){.    exit(a);.
24d0: 20 20 7d 0a 20 20 73 74 61 74 75 73 53 65 6e 74    }.  statusSent
24e0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41   = 0;.}../*.** A
24f0: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 73  llocate memory s
2500: 61 66 65 6c 79 0a 2a 2f 0a 73 74 61 74 69 63 20  afely.*/.static 
2510: 63 68 61 72 20 2a 53 61 66 65 4d 61 6c 6c 6f 63  char *SafeMalloc
2520: 28 20 69 6e 74 20 73 69 7a 65 20 29 7b 0a 20 20  ( int size ){.  
2530: 63 68 61 72 20 2a 70 3b 0a 0a 20 20 70 20 3d 20  char *p;..  p = 
2540: 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 73 69  (char*)malloc(si
2550: 7a 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ze);.  if( p==0 
2560: 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28 7a 52  ){.    strcpy(zR
2570: 65 70 6c 79 53 74 61 74 75 73 2c 20 22 39 39 38  eplyStatus, "998
2580: 22 29 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f 67 45  ");.    MakeLogE
2590: 6e 74 72 79 28 31 29 3b 0a 20 20 20 20 65 78 69  ntry(1);.    exi
25a0: 74 28 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  t(1);.  }.  retu
25b0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn p;.}../*.** S
25c0: 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
25d0: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
25e0: 61 62 6c 65 20 7a 56 61 72 20 74 6f 20 7a 56 61  able zVar to zVa
25f0: 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lue..*/.static v
2600: 6f 69 64 20 53 65 74 45 6e 76 28 63 6f 6e 73 74  oid SetEnv(const
2610: 20 63 68 61 72 20 2a 7a 56 61 72 2c 20 63 6f 6e   char *zVar, con
2620: 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 29  st char *zValue)
2630: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  {.  char *z;.  i
2640: 6e 74 20 6c 65 6e 3b 0a 20 20 69 66 28 20 7a 56  nt len;.  if( zV
2650: 61 6c 75 65 3d 3d 30 20 29 20 7a 56 61 6c 75 65  alue==0 ) zValue
2660: 3d 22 22 3b 0a 20 20 6c 65 6e 20 3d 20 73 74 72  ="";.  len = str
2670: 6c 65 6e 28 7a 56 61 72 29 20 2b 20 73 74 72 6c  len(zVar) + strl
2680: 65 6e 28 7a 56 61 6c 75 65 29 20 2b 20 32 3b 0a  en(zValue) + 2;.
2690: 20 20 7a 20 3d 20 53 61 66 65 4d 61 6c 6c 6f 63    z = SafeMalloc
26a0: 28 6c 65 6e 29 3b 0a 20 20 73 70 72 69 6e 74 66  (len);.  sprintf
26b0: 28 7a 2c 22 25 73 3d 25 73 22 2c 7a 56 61 72 2c  (z,"%s=%s",zVar,
26c0: 7a 56 61 6c 75 65 29 3b 0a 20 20 70 75 74 65 6e  zValue);.  puten
26d0: 76 28 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  v(z);.}../*.** R
26e0: 65 6d 6f 76 65 20 74 68 65 20 66 69 72 73 74 20  emove the first 
26f0: 73 70 61 63 65 2d 64 65 6c 69 6d 69 74 65 64 20  space-delimited 
2700: 74 6f 6b 65 6e 20 66 72 6f 6d 20 61 20 73 74 72  token from a str
2710: 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ing and return.*
2720: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  * a pointer to i
2730: 74 2e 20 20 41 64 64 20 61 20 4e 55 4c 4c 20 74  t.  Add a NULL t
2740: 6f 20 74 68 65 20 73 74 72 69 6e 67 20 74 6f 20  o the string to 
2750: 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 74 6f  terminate the to
2760: 6b 65 6e 2e 0a 2a 2a 20 4d 61 6b 65 20 2a 7a 4c  ken..** Make *zL
2770: 65 66 74 4f 76 65 72 20 70 6f 69 6e 74 20 74 6f  eftOver point to
2780: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
2790: 65 20 6e 65 78 74 20 74 6f 6b 65 6e 2e 0a 2a 2f  e next token..*/
27a0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 47 65  .static char *Ge
27b0: 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28 63 68  tFirstElement(ch
27c0: 61 72 20 2a 7a 49 6e 70 75 74 2c 20 63 68 61 72  ar *zInput, char
27d0: 20 2a 2a 7a 4c 65 66 74 4f 76 65 72 29 7b 0a 20   **zLeftOver){. 
27e0: 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 20 3d   char *zResult =
27f0: 20 30 3b 0a 20 20 69 66 28 20 7a 49 6e 70 75 74   0;.  if( zInput
2800: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  ==0 ){.    if( z
2810: 4c 65 66 74 4f 76 65 72 20 29 20 2a 7a 4c 65 66  LeftOver ) *zLef
2820: 74 4f 76 65 72 20 3d 20 30 3b 0a 20 20 20 20 72  tOver = 0;.    r
2830: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 77  eturn 0;.  }.  w
2840: 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 7a  hile( isspace(*z
2850: 49 6e 70 75 74 29 20 29 7b 20 7a 49 6e 70 75 74  Input) ){ zInput
2860: 2b 2b 3b 20 7d 0a 20 20 7a 52 65 73 75 6c 74 20  ++; }.  zResult 
2870: 3d 20 7a 49 6e 70 75 74 3b 0a 20 20 77 68 69 6c  = zInput;.  whil
2880: 65 28 20 2a 7a 49 6e 70 75 74 20 26 26 20 21 69  e( *zInput && !i
2890: 73 73 70 61 63 65 28 2a 7a 49 6e 70 75 74 29 20  sspace(*zInput) 
28a0: 29 7b 20 7a 49 6e 70 75 74 2b 2b 3b 20 7d 0a 20  ){ zInput++; }. 
28b0: 20 69 66 28 20 2a 7a 49 6e 70 75 74 20 29 7b 0a   if( *zInput ){.
28c0: 20 20 20 20 2a 7a 49 6e 70 75 74 20 3d 20 30 3b      *zInput = 0;
28d0: 0a 20 20 20 20 7a 49 6e 70 75 74 2b 2b 3b 0a 20  .    zInput++;. 
28e0: 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63     while( isspac
28f0: 65 28 2a 7a 49 6e 70 75 74 29 20 29 7b 20 7a 49  e(*zInput) ){ zI
2900: 6e 70 75 74 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20  nput++; }.  }.  
2910: 69 66 28 20 7a 4c 65 66 74 4f 76 65 72 20 29 7b  if( zLeftOver ){
2920: 20 2a 7a 4c 65 66 74 4f 76 65 72 20 3d 20 7a 49   *zLeftOver = zI
2930: 6e 70 75 74 3b 20 7d 0a 20 20 72 65 74 75 72 6e  nput; }.  return
2940: 20 7a 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a   zResult;.}../*.
2950: 2a 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f  ** Make a copy o
2960: 66 20 61 20 73 74 72 69 6e 67 20 69 6e 74 6f 20  f a string into 
2970: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
2980: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a  from malloc..*/.
2990: 73 74 61 74 69 63 20 63 68 61 72 20 2a 53 74 72  static char *Str
29a0: 44 75 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  Dup(const char *
29b0: 7a 53 72 63 29 7b 0a 20 20 63 68 61 72 20 2a 7a  zSrc){.  char *z
29c0: 44 65 73 74 3b 0a 20 20 69 6e 74 20 73 69 7a 65  Dest;.  int size
29d0: 3b 0a 0a 20 20 69 66 28 20 7a 53 72 63 3d 3d 30  ;..  if( zSrc==0
29e0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
29f0: 69 7a 65 20 3d 20 73 74 72 6c 65 6e 28 7a 53 72  ize = strlen(zSr
2a00: 63 29 20 2b 20 31 3b 0a 20 20 7a 44 65 73 74 20  c) + 1;.  zDest 
2a10: 3d 20 28 63 68 61 72 2a 29 53 61 66 65 4d 61 6c  = (char*)SafeMal
2a20: 6c 6f 63 28 20 73 69 7a 65 20 29 3b 0a 20 20 73  loc( size );.  s
2a30: 74 72 63 70 79 28 7a 44 65 73 74 2c 7a 53 72 63  trcpy(zDest,zSrc
2a40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 44 65 73  );.  return zDes
2a50: 74 3b 0a 7d 0a 73 74 61 74 69 63 20 63 68 61 72  t;.}.static char
2a60: 20 2a 53 74 72 41 70 70 65 6e 64 28 63 68 61 72   *StrAppend(char
2a70: 20 2a 7a 50 72 69 6f 72 2c 20 63 6f 6e 73 74 20   *zPrior, const 
2a80: 63 68 61 72 20 2a 7a 53 65 70 2c 20 63 6f 6e 73  char *zSep, cons
2a90: 74 20 63 68 61 72 20 2a 7a 53 72 63 29 7b 0a 20  t char *zSrc){. 
2aa0: 20 63 68 61 72 20 2a 7a 44 65 73 74 3b 0a 20 20   char *zDest;.  
2ab0: 69 6e 74 20 73 69 7a 65 3b 0a 20 20 69 6e 74 20  int size;.  int 
2ac0: 6e 31 2c 20 6e 32 3b 0a 0a 20 20 69 66 28 20 7a  n1, n2;..  if( z
2ad0: 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
2ae0: 30 3b 0a 20 20 69 66 28 20 7a 50 72 69 6f 72 3d  0;.  if( zPrior=
2af0: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 74 72 44  =0 ) return StrD
2b00: 75 70 28 7a 53 72 63 29 3b 0a 20 20 73 69 7a 65  up(zSrc);.  size
2b10: 20 3d 20 28 6e 31 3d 73 74 72 6c 65 6e 28 7a 53   = (n1=strlen(zS
2b20: 72 63 29 29 20 2b 20 28 6e 32 3d 73 74 72 6c 65  rc)) + (n2=strle
2b30: 6e 28 7a 53 65 70 29 29 20 2b 20 73 74 72 6c 65  n(zSep)) + strle
2b40: 6e 28 7a 50 72 69 6f 72 29 20 2b 20 31 3b 0a 20  n(zPrior) + 1;. 
2b50: 20 7a 44 65 73 74 20 3d 20 28 63 68 61 72 2a 29   zDest = (char*)
2b60: 53 61 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  SafeMalloc( size
2b70: 20 29 3b 0a 20 20 73 74 72 63 70 79 28 7a 44 65   );.  strcpy(zDe
2b80: 73 74 2c 7a 50 72 69 6f 72 29 3b 0a 20 20 66 72  st,zPrior);.  fr
2b90: 65 65 28 7a 50 72 69 6f 72 29 3b 0a 20 20 73 74  ee(zPrior);.  st
2ba0: 72 63 70 79 28 26 7a 44 65 73 74 5b 6e 31 5d 2c  rcpy(&zDest[n1],
2bb0: 7a 53 65 70 29 3b 0a 20 20 73 74 72 63 70 79 28  zSep);.  strcpy(
2bc0: 26 7a 44 65 73 74 5b 6e 31 2b 6e 32 5d 2c 7a 53  &zDest[n1+n2],zS
2bd0: 72 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 44  rc);.  return zD
2be0: 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 72  est;.}../*.** Br
2bf0: 65 61 6b 20 61 20 6c 69 6e 65 20 61 74 20 74 68  eak a line at th
2c00: 65 20 66 69 72 73 74 20 5c 6e 20 6f 72 20 5c 72  e first \n or \r
2c10: 20 63 68 61 72 61 63 74 65 72 20 73 65 65 6e 2e   character seen.
2c20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2c30: 52 65 6d 6f 76 65 4e 65 77 6c 69 6e 65 28 63 68  RemoveNewline(ch
2c40: 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 7a 3d  ar *z){.  if( z=
2c50: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77  =0 ) return;.  w
2c60: 68 69 6c 65 28 20 2a 7a 20 26 26 20 2a 7a 21 3d  hile( *z && *z!=
2c70: 27 5c 6e 27 20 26 26 20 2a 7a 21 3d 27 5c 72 27  '\n' && *z!='\r'
2c80: 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 2a 7a 20   ){ z++; }.  *z 
2c90: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  = 0;.}../*.** Pr
2ca0: 69 6e 74 20 61 20 64 61 74 65 20 74 61 67 20 69  int a date tag i
2cb0: 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54  n the header.  T
2cc0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
2cd0: 61 67 20 69 73 20 7a 54 61 67 2e 0a 2a 2a 20 54  ag is zTag..** T
2ce0: 68 65 20 64 61 74 65 20 69 73 20 64 65 74 65 72  he date is deter
2cf0: 6d 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 75  mined from the u
2d00: 6e 69 78 20 74 69 6d 65 73 74 61 6d 70 20 67 69  nix timestamp gi
2d10: 76 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ven..*/.static i
2d20: 6e 74 20 44 61 74 65 54 61 67 28 63 6f 6e 73 74  nt DateTag(const
2d30: 20 63 68 61 72 20 2a 7a 54 61 67 2c 20 74 69 6d   char *zTag, tim
2d40: 65 5f 74 20 74 29 7b 0a 20 20 73 74 72 75 63 74  e_t t){.  struct
2d50: 20 74 6d 20 2a 74 6d 3b 0a 20 20 63 68 61 72 20   tm *tm;.  char 
2d60: 7a 44 61 74 65 5b 31 30 30 5d 3b 0a 20 20 74 6d  zDate[100];.  tm
2d70: 20 3d 20 67 6d 74 69 6d 65 28 26 74 29 3b 0a 20   = gmtime(&t);. 
2d80: 20 73 74 72 66 74 69 6d 65 28 7a 44 61 74 65 2c   strftime(zDate,
2d90: 20 73 69 7a 65 6f 66 28 7a 44 61 74 65 29 2c 20   sizeof(zDate), 
2da0: 22 25 61 2c 20 25 64 20 20 25 62 20 25 59 20 25  "%a, %d  %b %Y %
2db0: 48 3a 25 4d 3a 25 53 20 25 7a 22 2c 20 74 6d 29  H:%M:%S %z", tm)
2dc0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 72 69 6e 74  ;.  return print
2dd0: 66 28 22 25 73 3a 20 25 73 5c 72 5c 6e 22 2c 20  f("%s: %s\r\n", 
2de0: 7a 54 61 67 2c 20 7a 44 61 74 65 29 3b 0a 7d 0a  zTag, zDate);.}.
2df0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
2e00: 20 66 69 72 73 74 20 6c 69 6e 65 20 6f 66 20 61   first line of a
2e10: 20 72 65 73 70 6f 6e 73 65 20 66 6f 6c 6c 6f 77   response follow
2e20: 65 64 20 62 79 20 74 68 65 20 73 65 72 76 65 72  ed by the server
2e30: 20 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   type..*/.static
2e40: 20 76 6f 69 64 20 53 74 61 72 74 52 65 73 70 6f   void StartRespo
2e50: 6e 73 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  nse(const char *
2e60: 7a 52 65 73 75 6c 74 43 6f 64 65 29 7b 0a 20 20  zResultCode){.  
2e70: 74 69 6d 65 5f 74 20 6e 6f 77 3b 0a 20 20 74 69  time_t now;.  ti
2e80: 6d 65 28 26 6e 6f 77 29 3b 0a 20 20 69 66 28 20  me(&now);.  if( 
2e90: 73 74 61 74 75 73 53 65 6e 74 20 29 20 72 65 74  statusSent ) ret
2ea0: 75 72 6e 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70  urn;.  nOut += p
2eb0: 72 69 6e 74 66 28 22 25 73 20 25 73 5c 72 5c 6e  rintf("%s %s\r\n
2ec0: 22 2c 20 7a 50 72 6f 74 6f 63 6f 6c 2c 20 7a 52  ", zProtocol, zR
2ed0: 65 73 75 6c 74 43 6f 64 65 29 3b 0a 20 20 73 74  esultCode);.  st
2ee0: 72 6e 63 70 79 28 7a 52 65 70 6c 79 53 74 61 74  rncpy(zReplyStat
2ef0: 75 73 2c 20 7a 52 65 73 75 6c 74 43 6f 64 65 2c  us, zResultCode,
2f00: 20 33 29 3b 0a 20 20 7a 52 65 70 6c 79 53 74 61   3);.  zReplySta
2f10: 74 75 73 5b 33 5d 20 3d 20 30 3b 0a 20 20 69 66  tus[3] = 0;.  if
2f20: 28 20 7a 52 65 70 6c 79 53 74 61 74 75 73 5b 30  ( zReplyStatus[0
2f30: 5d 3e 3d 27 34 27 20 29 7b 0a 20 20 20 20 63 6c  ]>='4' ){.    cl
2f40: 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20  oseConnection = 
2f50: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6c 6f  1;.  }.  if( clo
2f60: 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 29 7b 0a  seConnection ){.
2f70: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
2f80: 74 66 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20  tf("Connection: 
2f90: 63 6c 6f 73 65 5c 72 5c 6e 22 29 3b 0a 20 20 7d  close\r\n");.  }
2fa0: 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 75 74 20 2b  else{.    nOut +
2fb0: 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 6e 65 63  = printf("Connec
2fc0: 74 69 6f 6e 3a 20 6b 65 65 70 2d 61 6c 69 76 65  tion: keep-alive
2fd0: 5c 72 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 6e 4f  \r\n");.  }.  nO
2fe0: 75 74 20 2b 3d 20 44 61 74 65 54 61 67 28 22 44  ut += DateTag("D
2ff0: 61 74 65 22 2c 20 6e 6f 77 29 3b 0a 20 20 73 74  ate", now);.  st
3000: 61 74 75 73 53 65 6e 74 20 3d 20 31 3b 0a 7d 0a  atusSent = 1;.}.
3010: 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20  ./*.** Tell the 
3020: 63 6c 69 65 6e 74 20 74 68 61 74 20 74 68 65 72  client that ther
3030: 65 20 69 73 20 6e 6f 20 73 75 63 68 20 64 6f 63  e is no such doc
3040: 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20  ument.*/.static 
3050: 76 6f 69 64 20 4e 6f 74 46 6f 75 6e 64 28 69 6e  void NotFound(in
3060: 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 53 74 61  t lineno){.  Sta
3070: 72 74 52 65 73 70 6f 6e 73 65 28 22 34 30 34 20  rtResponse("404 
3080: 4e 6f 74 20 46 6f 75 6e 64 22 29 3b 0a 20 20 6e  Not Found");.  n
3090: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20  Out += printf(. 
30a0: 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65     "Content-type
30b0: 3a 20 74 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e 22  : text/html\r\n"
30c0: 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20  .    "\r\n".    
30d0: 22 3c 68 65 61 64 3e 3c 74 69 74 6c 65 20 6c 69  "<head><title li
30e0: 6e 65 6e 6f 3d 5c 22 25 64 5c 22 3e 4e 6f 74 20  neno=\"%d\">Not 
30f0: 46 6f 75 6e 64 3c 2f 74 69 74 6c 65 3e 3c 2f 68  Found</title></h
3100: 65 61 64 3e 5c 6e 22 0a 20 20 20 20 22 3c 62 6f  ead>\n".    "<bo
3110: 64 79 3e 3c 68 31 3e 44 6f 63 75 6d 65 6e 74 20  dy><h1>Document 
3120: 4e 6f 74 20 46 6f 75 6e 64 3c 2f 68 31 3e 5c 6e  Not Found</h1>\n
3130: 22 0a 20 20 20 20 22 54 68 65 20 64 6f 63 75 6d  ".    "The docum
3140: 65 6e 74 20 25 73 20 69 73 20 6e 6f 74 20 61 76  ent %s is not av
3150: 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 69 73 20  ailable on this 
3160: 73 65 72 76 65 72 5c 6e 22 0a 20 20 20 20 22 3c  server\n".    "<
3170: 2f 62 6f 64 79 3e 5c 6e 22 2c 20 6c 69 6e 65 6e  /body>\n", linen
3180: 6f 2c 20 7a 53 63 72 69 70 74 29 3b 0a 20 20 4d  o, zScript);.  M
3190: 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 29 3b 0a  akeLogEntry(0);.
31a0: 20 20 65 78 69 74 28 30 29 3b 0a 7d 0a 0a 2f 2a    exit(0);.}../*
31b0: 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c 69  .** Tell the cli
31c0: 65 6e 74 20 74 68 61 74 20 74 68 65 79 20 61 72  ent that they ar
31d0: 65 20 6e 6f 74 20 77 65 6c 63 6f 6d 65 64 20 68  e not welcomed h
31e0: 65 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ere..*/.static v
31f0: 6f 69 64 20 46 6f 72 62 69 64 64 65 6e 28 76 6f  oid Forbidden(vo
3200: 69 64 29 7b 0a 20 20 53 74 61 72 74 52 65 73 70  id){.  StartResp
3210: 6f 6e 73 65 28 22 34 30 33 20 46 6f 72 62 69 64  onse("403 Forbid
3220: 64 65 6e 22 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d  den");.  nOut +=
3230: 20 70 72 69 6e 74 66 28 0a 20 20 20 20 22 43 6f   printf(.    "Co
3240: 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74  ntent-type: text
3250: 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20 20  /plain\r\n".    
3260: 22 5c 72 5c 6e 22 0a 20 20 20 20 22 41 63 63 65  "\r\n".    "Acce
3270: 73 73 20 64 65 6e 69 65 64 5c 6e 22 0a 20 20 29  ss denied\n".  )
3280: 3b 0a 20 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74  ;.  closeConnect
3290: 69 6f 6e 20 3d 20 31 3b 0a 20 20 4d 61 6b 65 4c  ion = 1;.  MakeL
32a0: 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20 20 65 78  ogEntry(0);.  ex
32b0: 69 74 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  it(0);.}../*.** 
32c0: 54 65 6c 6c 20 74 68 65 20 63 6c 69 65 6e 74 20  Tell the client 
32d0: 74 68 61 74 20 61 75 74 68 6f 72 69 7a 61 74 69  that authorizati
32e0: 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74  on is required t
32f0: 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20  o access the.** 
3300: 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  document..*/.sta
3310: 74 69 63 20 76 6f 69 64 20 4e 6f 74 41 75 74 68  tic void NotAuth
3320: 6f 72 69 7a 65 64 28 63 6f 6e 73 74 20 63 68 61  orized(const cha
3330: 72 20 2a 7a 52 65 61 6c 6d 29 7b 0a 20 20 53 74  r *zRealm){.  St
3340: 61 72 74 52 65 73 70 6f 6e 73 65 28 22 34 30 31  artResponse("401
3350: 20 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 52   Authorization R
3360: 65 71 75 69 72 65 64 22 29 3b 0a 20 20 6e 4f 75  equired");.  nOu
3370: 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20  t += printf(.   
3380: 20 22 57 57 57 2d 41 75 74 68 65 6e 74 69 63 61   "WWW-Authentica
3390: 74 65 3a 20 42 61 73 69 63 20 72 65 61 6c 6d 3d  te: Basic realm=
33a0: 5c 22 25 73 5c 22 5c 72 5c 6e 22 0a 20 20 20 20  \"%s\"\r\n".    
33b0: 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74  "Content-type: t
33c0: 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e 22 0a 20 20  ext/html\r\n".  
33d0: 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 22 3c 68    "\r\n".    "<h
33e0: 65 61 64 3e 3c 74 69 74 6c 65 3e 4e 6f 74 20 41  ead><title>Not A
33f0: 75 74 68 6f 72 69 7a 65 64 3c 2f 74 69 74 6c 65  uthorized</title
3400: 3e 3c 2f 68 65 61 64 3e 5c 6e 22 0a 20 20 20 20  ></head>\n".    
3410: 22 3c 62 6f 64 79 3e 3c 68 31 3e 34 30 31 20 4e  "<body><h1>401 N
3420: 6f 74 20 41 75 74 68 6f 72 69 7a 65 64 3c 2f 68  ot Authorized</h
3430: 31 3e 5c 6e 22 0a 20 20 20 20 22 41 20 6c 6f 67  1>\n".    "A log
3440: 69 6e 20 61 6e 64 20 70 61 73 73 77 6f 72 64 20  in and password 
3450: 61 72 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  are required for
3460: 20 74 68 69 73 20 64 6f 63 75 6d 65 6e 74 5c 6e   this document\n
3470: 22 0a 20 20 20 20 22 3c 2f 62 6f 64 79 3e 5c 6e  ".    "</body>\n
3480: 22 2c 20 7a 52 65 61 6c 6d 29 3b 0a 20 20 4d 61  ", zRealm);.  Ma
3490: 6b 65 4c 6f 67 45 6e 74 72 79 28 30 29 3b 0a 7d  keLogEntry(0);.}
34a0: 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68 65  ../*.** Tell the
34b0: 20 63 6c 69 65 6e 74 20 74 68 61 74 20 74 68 65   client that the
34c0: 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69  re is an error i
34d0: 6e 20 74 68 65 20 73 63 72 69 70 74 2e 0a 2a 2f  n the script..*/
34e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 67 69  .static void Cgi
34f0: 45 72 72 6f 72 28 76 6f 69 64 29 7b 0a 20 20 53  Error(void){.  S
3500: 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 35 30  tartResponse("50
3510: 30 20 45 72 72 6f 72 22 29 3b 0a 20 20 6e 4f 75  0 Error");.  nOu
3520: 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20  t += printf(.   
3530: 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20   "Content-type: 
3540: 74 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e 22 0a 20  text/html\r\n". 
3550: 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 22 3c     "\r\n".    "<
3560: 68 65 61 64 3e 3c 74 69 74 6c 65 3e 43 47 49 20  head><title>CGI 
3570: 50 72 6f 67 72 61 6d 20 45 72 72 6f 72 3c 2f 74  Program Error</t
3580: 69 74 6c 65 3e 3c 2f 68 65 61 64 3e 5c 6e 22 0a  itle></head>\n".
3590: 20 20 20 20 22 3c 62 6f 64 79 3e 3c 68 31 3e 43      "<body><h1>C
35a0: 47 49 20 50 72 6f 67 72 61 6d 20 45 72 72 6f 72  GI Program Error
35b0: 3c 2f 68 31 3e 5c 6e 22 0a 20 20 20 20 22 54 68  </h1>\n".    "Th
35c0: 65 20 43 47 49 20 70 72 6f 67 72 61 6d 20 25 73  e CGI program %s
35d0: 20 67 65 6e 65 72 61 74 65 64 20 61 6e 20 65 72   generated an er
35e0: 72 6f 72 5c 6e 22 0a 20 20 20 20 22 3c 2f 62 6f  ror\n".    "</bo
35f0: 64 79 3e 5c 6e 22 2c 20 7a 53 63 72 69 70 74 29  dy>\n", zScript)
3600: 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79  ;.  MakeLogEntry
3610: 28 30 29 3b 0a 20 20 65 78 69 74 28 30 29 3b 0a  (0);.  exit(0);.
3620: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
3630: 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20 74 69   called if we ti
3640: 6d 65 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  meout..*/.static
3650: 20 76 6f 69 64 20 54 69 6d 65 6f 75 74 28 69 6e   void Timeout(in
3660: 74 20 4e 6f 74 55 73 65 64 29 7b 0a 20 20 28 76  t NotUsed){.  (v
3670: 6f 69 64 29 4e 6f 74 55 73 65 64 3b 0a 20 20 69  oid)NotUsed;.  i
3680: 66 28 20 21 64 65 62 75 67 46 6c 61 67 20 29 7b  f( !debugFlag ){
3690: 0a 20 20 20 20 69 66 28 20 7a 53 63 72 69 70 74  .    if( zScript
36a0: 20 26 26 20 7a 53 63 72 69 70 74 5b 30 5d 20 29   && zScript[0] )
36b0: 7b 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 7a  {.      strcpy(z
36c0: 52 65 70 6c 79 53 74 61 74 75 73 2c 20 22 39 39  ReplyStatus, "99
36d0: 39 22 29 3b 0a 20 20 20 20 20 20 4d 61 6b 65 4c  9");.      MakeL
36e0: 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20 20 20 20  ogEntry(0);.    
36f0: 7d 0a 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20  }.    exit(0);. 
3700: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c   }.}../*.** Tell
3710: 20 74 68 65 20 63 6c 69 65 6e 74 20 74 68 61 74   the client that
3720: 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 72 72   there is an err
3730: 6f 72 20 69 6e 20 74 68 65 20 73 63 72 69 70 74  or in the script
3740: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3750: 20 43 67 69 53 63 72 69 70 74 57 72 69 74 61 62   CgiScriptWritab
3760: 6c 65 28 76 6f 69 64 29 7b 0a 20 20 53 74 61 72  le(void){.  Star
3770: 74 52 65 73 70 6f 6e 73 65 28 22 35 30 30 20 43  tResponse("500 C
3780: 47 49 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  GI Configuration
3790: 20 45 72 72 6f 72 22 29 3b 0a 20 20 6e 4f 75 74   Error");.  nOut
37a0: 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20   += printf(.    
37b0: 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74  "Content-type: t
37c0: 65 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20  ext/plain\r\n". 
37d0: 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 22 54     "\r\n".    "T
37e0: 68 65 20 43 47 49 20 70 72 6f 67 72 61 6d 20 25  he CGI program %
37f0: 73 20 69 73 20 77 72 69 74 61 62 6c 65 20 62 79  s is writable by
3800: 20 75 73 65 72 73 20 6f 74 68 65 72 20 74 68 61   users other tha
3810: 6e 20 69 74 73 20 6f 77 6e 65 72 2e 5c 6e 22 2c  n its owner.\n",
3820: 0a 20 20 20 20 7a 52 65 61 6c 53 63 72 69 70 74  .    zRealScript
3830: 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72  );.  MakeLogEntr
3840: 79 28 30 29 3b 0a 20 20 65 78 69 74 28 30 29 3b  y(0);.  exit(0);
3850: 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a         .}../*.**
3860: 20 54 65 6c 6c 20 74 68 65 20 63 6c 69 65 6e 74   Tell the client
3870: 20 74 68 61 74 20 74 68 65 20 73 65 72 76 65 72   that the server
3880: 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 65 64 2e 0a   malfunctioned..
3890: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d  */.static void M
38a0: 61 6c 66 75 6e 63 74 69 6f 6e 28 69 6e 74 20 6c  alfunction(int l
38b0: 69 6e 65 6e 75 6d 2c 20 63 6f 6e 73 74 20 63 68  inenum, const ch
38c0: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
38d0: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
38e0: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
38f0: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 53 74 61 72  zFormat);.  Star
3900: 74 52 65 73 70 6f 6e 73 65 28 22 35 30 30 20 53  tResponse("500 S
3910: 65 72 76 65 72 20 4d 61 6c 66 75 6e 63 74 69 6f  erver Malfunctio
3920: 6e 22 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70  n");.  nOut += p
3930: 72 69 6e 74 66 28 0a 20 20 20 20 22 43 6f 6e 74  rintf(.    "Cont
3940: 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 70  ent-type: text/p
3950: 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 22 5c  lain\r\n".    "\
3960: 72 5c 6e 22 0a 20 20 20 20 22 57 65 62 20 73 65  r\n".    "Web se
3970: 72 76 65 72 20 6d 61 6c 66 75 6e 63 74 69 6f 6e  rver malfunction
3980: 65 64 3b 20 65 72 72 6f 72 20 6e 75 6d 62 65 72  ed; error number
3990: 20 25 64 5c 6e 5c 6e 22 2c 20 6c 69 6e 65 6e 75   %d\n\n", linenu
39a0: 6d 29 3b 0a 20 20 69 66 28 20 7a 46 6f 72 6d 61  m);.  if( zForma
39b0: 74 20 29 7b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d  t ){.    nOut +=
39c0: 20 76 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74   vprintf(zFormat
39d0: 2c 20 61 70 29 3b 0a 20 20 7d 0a 20 20 4d 61 6b  , ap);.  }.  Mak
39e0: 65 4c 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20 20  eLogEntry(0);.  
39f0: 65 78 69 74 28 30 29 3b 20 20 20 20 20 20 20 0a  exit(0);       .
3a00: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 73 65  }../*.** Do a se
3a10: 72 76 65 72 20 72 65 64 69 72 65 63 74 20 74 6f  rver redirect to
3a20: 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 73 70   the document sp
3a30: 65 63 69 66 69 65 64 2e 20 20 54 68 65 20 64 6f  ecified.  The do
3a40: 63 75 6d 65 6e 74 0a 2a 2a 20 6e 61 6d 65 20 6e  cument.** name n
3a50: 6f 74 20 63 6f 6e 74 61 69 6e 20 73 63 68 65 6d  ot contain schem
3a60: 65 20 6f 72 20 6e 65 74 77 6f 72 6b 20 6c 6f 63  e or network loc
3a70: 61 74 69 6f 6e 20 6f 72 20 74 68 65 20 71 75 65  ation or the que
3a80: 72 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 20 49 74  ry string..** It
3a90: 20 77 69 6c 6c 20 62 65 20 6a 75 73 74 20 74 68   will be just th
3aa0: 65 20 70 61 74 68 2e 0a 2a 2f 0a 73 74 61 74 69  e path..*/.stati
3ab0: 63 20 76 6f 69 64 20 52 65 64 69 72 65 63 74 28  c void Redirect(
3ac0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
3ad0: 68 2c 20 69 6e 74 20 66 69 6e 69 73 68 29 7b 0a  h, int finish){.
3ae0: 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28    StartResponse(
3af0: 22 33 30 32 20 54 65 6d 70 6f 72 61 72 79 20 52  "302 Temporary R
3b00: 65 64 69 72 65 63 74 22 29 3b 0a 20 20 69 66 28  edirect");.  if(
3b10: 20 7a 53 65 72 76 65 72 50 6f 72 74 3d 3d 30 20   zServerPort==0 
3b20: 7c 7c 20 7a 53 65 72 76 65 72 50 6f 72 74 5b 30  || zServerPort[0
3b30: 5d 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a  ]==0 || strcmp(z
3b40: 53 65 72 76 65 72 50 6f 72 74 2c 22 38 30 22 29  ServerPort,"80")
3b50: 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4f 75 74 20  ==0 ){.    nOut 
3b60: 2b 3d 20 70 72 69 6e 74 66 28 22 4c 6f 63 61 74  += printf("Locat
3b70: 69 6f 6e 3a 20 25 73 3a 2f 2f 25 73 25 73 25 73  ion: %s://%s%s%s
3b80: 5c 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  \r\n",.         
3b90: 20 20 20 20 20 20 20 20 20 20 7a 48 74 74 70 2c            zHttp,
3ba0: 20 7a 53 65 72 76 65 72 4e 61 6d 65 2c 20 7a 50   zServerName, zP
3bb0: 61 74 68 2c 20 7a 51 75 65 72 79 53 75 66 66 69  ath, zQuerySuffi
3bc0: 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  x);.  }else{.   
3bd0: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
3be0: 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73 3a 2f 2f  "Location: %s://
3bf0: 25 73 3a 25 73 25 73 25 73 5c 72 5c 6e 22 2c 0a  %s:%s%s%s\r\n",.
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c10: 20 20 20 7a 48 74 74 70 2c 20 7a 53 65 72 76 65     zHttp, zServe
3c20: 72 4e 61 6d 65 2c 20 7a 53 65 72 76 65 72 50 6f  rName, zServerPo
3c30: 72 74 2c 20 7a 50 61 74 68 2c 20 7a 51 75 65 72  rt, zPath, zQuer
3c40: 79 53 75 66 66 69 78 29 3b 0a 20 20 7d 0a 20 20  ySuffix);.  }.  
3c50: 69 66 28 20 66 69 6e 69 73 68 20 29 7b 0a 20 20  if( finish ){.  
3c60: 20 20 70 72 69 6e 74 66 28 22 43 6f 6e 74 65 6e    printf("Conten
3c70: 74 2d 6c 65 6e 67 74 68 3a 20 30 5c 72 5c 6e 22  t-length: 0\r\n"
3c80: 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70  );.    nOut += p
3c90: 72 69 6e 74 66 28 22 5c 72 5c 6e 22 29 3b 0a 20  rintf("\r\n");. 
3ca0: 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28     MakeLogEntry(
3cb0: 30 29 3b 0a 20 20 7d 0a 20 20 66 66 6c 75 73 68  0);.  }.  fflush
3cc0: 28 73 74 64 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a  (stdout);.}../*.
3cd0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
3ce0: 20 74 72 65 61 74 73 20 69 74 73 20 69 6e 70 75   treats its inpu
3cf0: 74 20 61 73 20 61 20 62 61 73 65 2d 36 34 20 73  t as a base-64 s
3d00: 74 72 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  tring and return
3d10: 73 20 74 68 65 0a 2a 2a 20 64 65 63 6f 64 65 64  s the.** decoded
3d20: 20 76 61 6c 75 65 20 6f 66 20 74 68 61 74 20 73   value of that s
3d30: 74 72 69 6e 67 2e 20 20 43 68 61 72 61 63 74 65  tring.  Characte
3d40: 72 73 20 6f 66 20 69 6e 70 75 74 20 74 68 61 74  rs of input that
3d50: 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 76 61 6c 69   are not.** vali
3d60: 64 20 62 61 73 65 2d 36 34 20 63 68 61 72 61 63  d base-64 charac
3d70: 74 65 72 73 20 28 73 75 63 68 20 61 73 20 73 70  ters (such as sp
3d80: 61 63 65 73 20 61 6e 64 20 6e 65 77 6c 69 6e 65  aces and newline
3d90: 73 29 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a  s) are ignored..
3da0: 2a 2f 0a 76 6f 69 64 20 44 65 63 6f 64 65 36 34  */.void Decode64
3db0: 28 63 68 61 72 20 2a 7a 36 34 29 7b 0a 20 20 63  (char *z64){.  c
3dc0: 68 61 72 20 2a 7a 44 61 74 61 3b 0a 20 20 69 6e  har *zData;.  in
3dd0: 74 20 6e 36 34 3b 0a 20 20 69 6e 74 20 69 2c 20  t n64;.  int i, 
3de0: 6a 3b 0a 20 20 69 6e 74 20 61 2c 20 62 2c 20 63  j;.  int a, b, c
3df0: 2c 20 64 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  , d;.  static in
3e00: 74 20 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  t isInit = 0;.  
3e10: 73 74 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73  static int trans
3e20: 5b 31 32 38 5d 3b 0a 20 20 73 74 61 74 69 63 20  [128];.  static 
3e30: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 42  unsigned char zB
3e40: 61 73 65 5b 5d 20 3d 20 0a 20 20 20 20 22 41 42  ase[] = .    "AB
3e50: 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
3e60: 53 54 55 56 57 58 59 5a 61 62 63 64 65 66 67 68  STUVWXYZabcdefgh
3e70: 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
3e80: 79 7a 30 31 32 33 34 35 36 37 38 39 2b 2f 22 3b  yz0123456789+/";
3e90: 0a 0a 20 20 69 66 28 20 21 69 73 49 6e 69 74 20  ..  if( !isInit 
3ea0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
3eb0: 69 3c 31 32 38 3b 20 69 2b 2b 29 7b 20 74 72 61  i<128; i++){ tra
3ec0: 6e 73 5b 69 5d 20 3d 20 30 3b 20 7d 0a 20 20 20  ns[i] = 0; }.   
3ed0: 20 66 6f 72 28 69 3d 30 3b 20 7a 42 61 73 65 5b   for(i=0; zBase[
3ee0: 69 5d 3b 20 69 2b 2b 29 7b 20 74 72 61 6e 73 5b  i]; i++){ trans[
3ef0: 7a 42 61 73 65 5b 69 5d 20 26 20 30 78 37 66 5d  zBase[i] & 0x7f]
3f00: 20 3d 20 69 3b 20 7d 0a 20 20 20 20 69 73 49 6e   = i; }.    isIn
3f10: 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 6e 36  it = 1;.  }.  n6
3f20: 34 20 3d 20 73 74 72 6c 65 6e 28 7a 36 34 29 3b  4 = strlen(z64);
3f30: 0a 20 20 77 68 69 6c 65 28 20 6e 36 34 3e 30 20  .  while( n64>0 
3f40: 26 26 20 7a 36 34 5b 6e 36 34 2d 31 5d 3d 3d 27  && z64[n64-1]=='
3f50: 3d 27 20 29 20 6e 36 34 2d 2d 3b 0a 20 20 7a 44  =' ) n64--;.  zD
3f60: 61 74 61 20 3d 20 7a 36 34 3b 0a 20 20 66 6f 72  ata = z64;.  for
3f70: 28 69 3d 6a 3d 30 3b 20 69 2b 33 3c 6e 36 34 3b  (i=j=0; i+3<n64;
3f80: 20 69 2b 3d 34 29 7b 0a 20 20 20 20 61 20 3d 20   i+=4){.    a = 
3f90: 74 72 61 6e 73 5b 7a 36 34 5b 69 5d 20 26 20 30  trans[z64[i] & 0
3fa0: 78 37 66 5d 3b 0a 20 20 20 20 62 20 3d 20 74 72  x7f];.    b = tr
3fb0: 61 6e 73 5b 7a 36 34 5b 69 2b 31 5d 20 26 20 30  ans[z64[i+1] & 0
3fc0: 78 37 66 5d 3b 0a 20 20 20 20 63 20 3d 20 74 72  x7f];.    c = tr
3fd0: 61 6e 73 5b 7a 36 34 5b 69 2b 32 5d 20 26 20 30  ans[z64[i+2] & 0
3fe0: 78 37 66 5d 3b 0a 20 20 20 20 64 20 3d 20 74 72  x7f];.    d = tr
3ff0: 61 6e 73 5b 7a 36 34 5b 69 2b 33 5d 20 26 20 30  ans[z64[i+3] & 0
4000: 78 37 66 5d 3b 0a 20 20 20 20 7a 44 61 74 61 5b  x7f];.    zData[
4010: 6a 2b 2b 5d 20 3d 20 28 28 61 3c 3c 32 29 20 26  j++] = ((a<<2) &
4020: 20 30 78 66 63 29 20 7c 20 28 28 62 3e 3e 34 29   0xfc) | ((b>>4)
4030: 20 26 20 30 78 30 33 29 3b 0a 20 20 20 20 7a 44   & 0x03);.    zD
4040: 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28 62 3c 3c  ata[j++] = ((b<<
4050: 34 29 20 26 20 30 78 66 30 29 20 7c 20 28 28 63  4) & 0xf0) | ((c
4060: 3e 3e 32 29 20 26 20 30 78 30 66 29 3b 0a 20 20  >>2) & 0x0f);.  
4070: 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28    zData[j++] = (
4080: 28 63 3c 3c 36 29 20 26 20 30 78 63 30 29 20 7c  (c<<6) & 0xc0) |
4090: 20 28 64 20 26 20 30 78 33 66 29 3b 0a 20 20 7d   (d & 0x3f);.  }
40a0: 0a 20 20 69 66 28 20 69 2b 32 3c 6e 36 34 20 29  .  if( i+2<n64 )
40b0: 7b 0a 20 20 20 20 61 20 3d 20 74 72 61 6e 73 5b  {.    a = trans[
40c0: 7a 36 34 5b 69 5d 20 26 20 30 78 37 66 5d 3b 0a  z64[i] & 0x7f];.
40d0: 20 20 20 20 62 20 3d 20 74 72 61 6e 73 5b 7a 36      b = trans[z6
40e0: 34 5b 69 2b 31 5d 20 26 20 30 78 37 66 5d 3b 0a  4[i+1] & 0x7f];.
40f0: 20 20 20 20 63 20 3d 20 74 72 61 6e 73 5b 7a 36      c = trans[z6
4100: 34 5b 69 2b 32 5d 20 26 20 30 78 37 66 5d 3b 0a  4[i+2] & 0x7f];.
4110: 20 20 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d      zData[j++] =
4120: 20 28 28 61 3c 3c 32 29 20 26 20 30 78 66 63 29   ((a<<2) & 0xfc)
4130: 20 7c 20 28 28 62 3e 3e 34 29 20 26 20 30 78 30   | ((b>>4) & 0x0
4140: 33 29 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b  3);.    zData[j+
4150: 2b 5d 20 3d 20 28 28 62 3c 3c 34 29 20 26 20 30  +] = ((b<<4) & 0
4160: 78 66 30 29 20 7c 20 28 28 63 3e 3e 32 29 20 26  xf0) | ((c>>2) &
4170: 20 30 78 30 66 29 3b 0a 20 20 7d 65 6c 73 65 20   0x0f);.  }else 
4180: 69 66 28 20 69 2b 31 3c 6e 36 34 20 29 7b 0a 20  if( i+1<n64 ){. 
4190: 20 20 20 61 20 3d 20 74 72 61 6e 73 5b 7a 36 34     a = trans[z64
41a0: 5b 69 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20 20  [i] & 0x7f];.   
41b0: 20 62 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69   b = trans[z64[i
41c0: 2b 31 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20 20  +1] & 0x7f];.   
41d0: 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28   zData[j++] = ((
41e0: 61 3c 3c 32 29 20 26 20 30 78 66 63 29 20 7c 20  a<<2) & 0xfc) | 
41f0: 28 28 62 3e 3e 34 29 20 26 20 30 78 30 33 29 3b  ((b>>4) & 0x03);
4200: 0a 20 20 7d 0a 20 20 7a 44 61 74 61 5b 6a 5d 20  .  }.  zData[j] 
4210: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  = 0;.}../*.** Ch
4220: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 62 61  eck to see if ba
4230: 73 69 63 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  sic authorizatio
4240: 6e 20 63 72 65 64 65 6e 74 69 61 6c 73 20 61 72  n credentials ar
4250: 65 20 70 72 6f 76 69 64 65 64 20 66 6f 72 0a 2a  e provided for.*
4260: 2a 20 74 68 65 20 75 73 65 72 20 61 63 63 6f 72  * the user accor
4270: 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 66 6f  ding to the info
4280: 72 6d 61 74 69 6f 6e 20 69 6e 20 7a 41 75 74 68  rmation in zAuth
4290: 46 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 72  File.  Return tr
42a0: 75 65 0a 2a 2a 20 69 66 20 61 75 74 68 6f 72 69  ue.** if authori
42b0: 7a 65 64 2e 20 20 52 65 74 75 72 6e 20 66 61 6c  zed.  Return fal
42c0: 73 65 20 69 66 20 6e 6f 74 20 61 75 74 68 6f 72  se if not author
42d0: 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 69 6c 65  ized..**.** File
42e0: 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20   format:.**.**  
42f0: 20 20 2a 20 20 42 6c 61 6e 6b 20 6c 69 6e 65 73    *  Blank lines
4300: 20 61 6e 64 20 6c 69 6e 65 73 20 74 68 61 74 20   and lines that 
4310: 62 65 67 69 6e 20 77 69 74 68 20 27 23 27 20 61  begin with '#' a
4320: 72 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 20 20  re ignored.**   
4330: 20 2a 20 20 22 68 74 74 70 2d 72 65 64 69 72 65   *  "http-redire
4340: 63 74 22 20 66 6f 72 63 65 73 20 61 20 72 65 64  ct" forces a red
4350: 69 72 65 63 74 20 74 6f 20 48 54 54 50 53 20 69  irect to HTTPS i
4360: 66 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  f not there alre
4370: 61 64 79 0a 2a 2a 20 20 20 20 2a 20 20 22 68 74  ady.**    *  "ht
4380: 74 70 73 2d 6f 6e 6c 79 22 20 64 69 73 61 6c 6c  tps-only" disall
4390: 6f 77 73 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e  ows operation in
43a0: 20 48 54 54 50 0a 2a 2a 20 20 20 20 2a 20 20 22   HTTP.**    *  "
43b0: 75 73 65 72 20 4e 41 4d 45 20 4c 4f 47 49 4e 3a  user NAME LOGIN:
43c0: 50 41 53 53 57 4f 52 44 22 20 63 68 65 63 6b 73  PASSWORD" checks
43d0: 20 74 6f 20 73 65 65 20 69 66 20 4c 4f 47 49 4e   to see if LOGIN
43e0: 3a 50 41 53 53 57 4f 52 44 20 0a 2a 2a 20 20 20  :PASSWORD .**   
43f0: 20 20 20 20 61 75 74 68 6f 72 69 7a 61 74 69 6f      authorizatio
4400: 6e 20 63 72 65 64 65 6e 74 69 61 6c 73 20 61 72  n credentials ar
4410: 65 20 70 72 6f 76 69 64 65 64 2c 20 61 6e 64 20  e provided, and 
4420: 69 66 20 73 6f 20 73 65 74 73 20 74 68 65 0a 2a  if so sets the.*
4430: 2a 20 20 20 20 20 20 20 52 45 4d 4f 54 45 5f 55  *       REMOTE_U
4440: 53 45 52 20 74 6f 20 4e 41 4d 45 2e 0a 2a 2a 20  SER to NAME..** 
4450: 20 20 20 2a 20 20 22 72 65 61 6c 6d 20 54 45 58     *  "realm TEX
4460: 54 22 20 73 65 74 73 20 74 68 65 20 72 65 61 6c  T" sets the real
4470: 6d 20 74 6f 20 54 45 58 54 2e 0a 2a 2f 0a 73 74  m to TEXT..*/.st
4480: 61 74 69 63 20 69 6e 74 20 43 68 65 63 6b 42 61  atic int CheckBa
4490: 73 69 63 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e  sicAuthorization
44a0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 75  (const char *zAu
44b0: 74 68 46 69 6c 65 29 7b 0a 20 20 46 49 4c 45 20  thFile){.  FILE 
44c0: 2a 69 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65  *in;.  char *zRe
44d0: 61 6c 6d 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 72  alm = "unknown r
44e0: 65 61 6c 6d 22 3b 0a 20 20 63 68 61 72 20 2a 7a  ealm";.  char *z
44f0: 4c 6f 67 69 6e 50 73 77 64 3b 0a 20 20 63 68 61  LoginPswd;.  cha
4500: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63 68 61 72  r *zName;.  char
4510: 20 7a 4c 69 6e 65 5b 32 30 30 30 5d 3b 0a 0a 20   zLine[2000];.. 
4520: 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 41 75 74   in = fopen(zAut
4530: 68 46 69 6c 65 2c 20 22 72 22 29 3b 0a 20 20 69  hFile, "r");.  i
4540: 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  f( in==0 ){.    
4550: 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f  NotFound(__LINE_
4560: 5f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  _);.    return 0
4570: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 41 75 74  ;.  }.  if( zAut
4580: 68 41 72 67 20 29 20 44 65 63 6f 64 65 36 34 28  hArg ) Decode64(
4590: 7a 41 75 74 68 41 72 67 29 3b 0a 20 20 77 68 69  zAuthArg);.  whi
45a0: 6c 65 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c  le( fgets(zLine,
45b0: 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20   sizeof(zLine), 
45c0: 69 6e 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20  in) ){.    char 
45d0: 2a 7a 46 69 65 6c 64 4e 61 6d 65 3b 0a 20 20 20  *zFieldName;.   
45e0: 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 0a 20 20   char *zVal;..  
45f0: 20 20 7a 46 69 65 6c 64 4e 61 6d 65 20 3d 20 47    zFieldName = G
4600: 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a  etFirstElement(z
4610: 4c 69 6e 65 2c 26 7a 56 61 6c 29 3b 0a 20 20 20  Line,&zVal);.   
4620: 20 69 66 28 20 7a 46 69 65 6c 64 4e 61 6d 65 3d   if( zFieldName=
4630: 3d 30 20 7c 7c 20 2a 7a 46 69 65 6c 64 4e 61 6d  =0 || *zFieldNam
4640: 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  e==0 ) continue;
4650: 0a 20 20 20 20 69 66 28 20 7a 46 69 65 6c 64 4e  .    if( zFieldN
4660: 61 6d 65 5b 30 5d 3d 3d 27 23 27 20 29 20 63 6f  ame[0]=='#' ) co
4670: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 52 65 6d 6f  ntinue;.    Remo
4680: 76 65 4e 65 77 6c 69 6e 65 28 7a 56 61 6c 29 3b  veNewline(zVal);
4690: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
46a0: 7a 46 69 65 6c 64 4e 61 6d 65 2c 20 22 72 65 61  zFieldName, "rea
46b0: 6c 6d 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lm")==0 ){.     
46c0: 20 7a 52 65 61 6c 6d 20 3d 20 53 74 72 44 75 70   zRealm = StrDup
46d0: 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  (zVal);.    }els
46e0: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69  e if( strcmp(zFi
46f0: 65 6c 64 4e 61 6d 65 2c 22 75 73 65 72 22 29 3d  eldName,"user")=
4700: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
4710: 7a 41 75 74 68 41 72 67 3d 3d 30 20 29 20 63 6f  zAuthArg==0 ) co
4720: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7a 4e  ntinue;.      zN
4730: 61 6d 65 20 3d 20 47 65 74 46 69 72 73 74 45 6c  ame = GetFirstEl
4740: 65 6d 65 6e 74 28 7a 56 61 6c 2c 20 26 7a 56 61  ement(zVal, &zVa
4750: 6c 29 3b 0a 20 20 20 20 20 20 7a 4c 6f 67 69 6e  l);.      zLogin
4760: 50 73 77 64 20 3d 20 47 65 74 46 69 72 73 74 45  Pswd = GetFirstE
4770: 6c 65 6d 65 6e 74 28 7a 56 61 6c 2c 20 26 7a 56  lement(zVal, &zV
4780: 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  al);.      if( z
4790: 4c 6f 67 69 6e 50 73 77 64 3d 3d 30 20 29 20 63  LoginPswd==0 ) c
47a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
47b0: 66 28 20 7a 41 75 74 68 41 72 67 20 26 26 20 73  f( zAuthArg && s
47c0: 74 72 63 6d 70 28 7a 41 75 74 68 41 72 67 2c 7a  trcmp(zAuthArg,z
47d0: 4c 6f 67 69 6e 50 73 77 64 29 3d 3d 30 20 29 7b  LoginPswd)==0 ){
47e0: 0a 20 20 20 20 20 20 20 20 7a 52 65 6d 6f 74 65  .        zRemote
47f0: 55 73 65 72 20 3d 20 53 74 72 44 75 70 28 7a 4e  User = StrDup(zN
4800: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 66 63  ame);.        fc
4810: 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20  lose(in);.      
4820: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
4830: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
4840: 28 20 73 74 72 63 6d 70 28 7a 46 69 65 6c 64 4e  ( strcmp(zFieldN
4850: 61 6d 65 2c 22 68 74 74 70 73 2d 6f 6e 6c 79 22  ame,"https-only"
4860: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
4870: 28 20 21 75 73 65 48 74 74 70 73 20 29 7b 0a 20  ( !useHttps ){. 
4880: 20 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28         NotFound(
4890: 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
48a0: 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
48b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
48c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
48d0: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46  se if( strcmp(zF
48e0: 69 65 6c 64 4e 61 6d 65 2c 22 68 74 74 70 2d 72  ieldName,"http-r
48f0: 65 64 69 72 65 63 74 22 29 3d 3d 30 20 29 7b 0a  edirect")==0 ){.
4900: 20 20 20 20 20 20 69 66 28 20 21 75 73 65 48 74        if( !useHt
4910: 74 70 73 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  tps ){.        z
4920: 48 74 74 70 20 3d 20 22 68 74 74 70 73 22 3b 0a  Http = "https";.
4930: 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28          sprintf(
4940: 7a 4c 69 6e 65 2c 20 22 25 73 25 73 22 2c 20 7a  zLine, "%s%s", z
4950: 53 63 72 69 70 74 2c 20 7a 50 61 74 68 49 6e 66  Script, zPathInf
4960: 6f 29 3b 0a 20 20 20 20 20 20 20 20 52 65 64 69  o);.        Redi
4970: 72 65 63 74 28 7a 4c 69 6e 65 2c 20 31 29 3b 0a  rect(zLine, 1);.
4980: 20 20 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69          fclose(i
4990: 6e 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  n);.        retu
49a0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
49b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4e    }else{.      N
49c0: 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f  otFound(__LINE__
49d0: 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28  );.      fclose(
49e0: 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  in);.      retur
49f0: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 0;.    }.  }. 
4a00: 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 4e   fclose(in);.  N
4a10: 6f 74 41 75 74 68 6f 72 69 7a 65 64 28 7a 52 65  otAuthorized(zRe
4a20: 61 6c 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  alm);.  return 0
4a30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 75 65 73 73  ;.}../*.** Guess
4a40: 20 74 68 65 20 6d 69 6d 65 2d 74 79 70 65 20 6f   the mime-type o
4a50: 66 20 61 20 64 6f 63 75 6d 65 6e 74 20 62 61 73  f a document bas
4a60: 65 64 20 6f 6e 20 69 74 73 20 6e 61 6d 65 2e 0a  ed on its name..
4a70: 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 47  */.const char *G
4a80: 65 74 4d 69 6d 65 54 79 70 65 28 63 6f 6e 73 74  etMimeType(const
4a90: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e   char *zName, in
4aa0: 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 63 6f 6e 73  t nName){.  cons
4ab0: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74  t char *z;.  int
4ac0: 20 69 3b 0a 20 20 69 6e 74 20 66 69 72 73 74 2c   i;.  int first,
4ad0: 20 6c 61 73 74 3b 0a 20 20 69 6e 74 20 6c 65 6e   last;.  int len
4ae0: 3b 0a 20 20 63 68 61 72 20 7a 53 75 66 66 69 78  ;.  char zSuffix
4af0: 5b 32 30 5d 3b 0a 0a 20 20 2f 2a 20 41 20 74 61  [20];..  /* A ta
4b00: 62 6c 65 20 6f 66 20 6d 69 6d 65 74 79 70 65 73  ble of mimetypes
4b10: 20 62 61 73 65 64 20 6f 6e 20 66 69 6c 65 20 73   based on file s
4b20: 75 66 66 69 78 65 73 2e 20 0a 20 20 2a 2a 20 53  uffixes. .  ** S
4b30: 75 66 66 69 78 65 73 20 6d 75 73 74 20 62 65 20  uffixes must be 
4b40: 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20  in sorted order 
4b50: 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 64  so that we can d
4b60: 6f 20 61 20 62 69 6e 61 72 79 0a 20 20 2a 2a 20  o a binary.  ** 
4b70: 73 65 61 72 63 68 20 74 6f 20 66 69 6e 64 20 74  search to find t
4b80: 68 65 20 6d 69 6d 65 2d 74 79 70 65 0a 20 20 2a  he mime-type.  *
4b90: 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  /.  static const
4ba0: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f   struct {.    co
4bb0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 75 66 66 69  nst char *zSuffi
4bc0: 78 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  x;       /* The 
4bd0: 66 69 6c 65 20 73 75 66 66 69 78 20 2a 2f 0a 20  file suffix */. 
4be0: 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20     int size;    
4bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4c00: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73   Length of the s
4c10: 75 66 66 69 78 20 2a 2f 0a 20 20 20 20 63 6f 6e  uffix */.    con
4c20: 73 74 20 63 68 61 72 20 2a 7a 4d 69 6d 65 74 79  st char *zMimety
4c30: 70 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 63  pe;     /* The c
4c40: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 6d 69 6d  orresponding mim
4c50: 65 74 79 70 65 20 2a 2f 0a 20 20 7d 20 61 4d 69  etype */.  } aMi
4c60: 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  me[] = {.    { "
4c70: 61 69 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  ai",         2, 
4c80: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 6f 73  "application/pos
4c90: 74 73 63 72 69 70 74 22 20 20 20 20 20 20 20 20  tscript"        
4ca0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 69      },.    { "ai
4cb0: 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  f",        3, "a
4cc0: 75 64 69 6f 2f 78 2d 61 69 66 66 22 20 20 20 20  udio/x-aiff"    
4cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ce0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 69 66 63    },.    { "aifc
4cf0: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 75 64  ",       4, "aud
4d00: 69 6f 2f 78 2d 61 69 66 66 22 20 20 20 20 20 20  io/x-aiff"      
4d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d20: 7d 2c 0a 20 20 20 20 7b 20 22 61 69 66 66 22 2c  },.    { "aiff",
4d30: 20 20 20 20 20 20 20 34 2c 20 22 61 75 64 69 6f         4, "audio
4d40: 2f 78 2d 61 69 66 66 22 20 20 20 20 20 20 20 20  /x-aiff"        
4d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
4d60: 0a 20 20 20 20 7b 20 22 61 72 6a 22 2c 20 20 20  .    { "arj",   
4d70: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
4d80: 74 69 6f 6e 2f 78 2d 61 72 6a 2d 63 6f 6d 70 72  tion/x-arj-compr
4d90: 65 73 73 65 64 22 20 20 20 20 20 20 7d 2c 0a 20  essed"      },. 
4da0: 20 20 20 7b 20 22 61 73 63 22 2c 20 20 20 20 20     { "asc",     
4db0: 20 20 20 33 2c 20 22 74 65 78 74 2f 70 6c 61 69     3, "text/plai
4dc0: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
4dd0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
4de0: 20 7b 20 22 61 73 66 22 2c 20 20 20 20 20 20 20   { "asf",       
4df0: 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d   3, "video/x-ms-
4e00: 61 73 66 22 20 20 20 20 20 20 20 20 20 20 20 20  asf"            
4e10: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
4e20: 20 22 61 73 78 22 2c 20 20 20 20 20 20 20 20 33   "asx",        3
4e30: 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 61 73  , "video/x-ms-as
4e40: 78 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x"              
4e50: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
4e60: 61 75 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  au",         2, 
4e70: 22 61 75 64 69 6f 2f 75 6c 61 77 22 20 20 20 20  "audio/ulaw"    
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e90: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 76      },.    { "av
4ea0: 69 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76  i",        3, "v
4eb0: 69 64 65 6f 2f 78 2d 6d 73 76 69 64 65 6f 22 20  ideo/x-msvideo" 
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ed0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 62 61 74 22    },.    { "bat"
4ee0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
4ef0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 6d 73 64 6f 73  lication/x-msdos
4f00: 2d 70 72 6f 67 72 61 6d 22 20 20 20 20 20 20 20  -program"       
4f10: 7d 2c 0a 20 20 20 20 7b 20 22 62 63 70 69 6f 22  },.    { "bcpio"
4f20: 2c 20 20 20 20 20 20 35 2c 20 22 61 70 70 6c 69  ,      5, "appli
4f30: 63 61 74 69 6f 6e 2f 78 2d 62 63 70 69 6f 22 20  cation/x-bcpio" 
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
4f50: 0a 20 20 20 20 7b 20 22 62 69 6e 22 2c 20 20 20  .    { "bin",   
4f60: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
4f70: 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61  tion/octet-strea
4f80: 6d 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  m"          },. 
4f90: 20 20 20 7b 20 22 63 22 2c 20 20 20 20 20 20 20     { "c",       
4fa0: 20 20 20 31 2c 20 22 74 65 78 74 2f 70 6c 61 69     1, "text/plai
4fb0: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
4fc0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
4fd0: 20 7b 20 22 63 63 22 2c 20 20 20 20 20 20 20 20   { "cc",        
4fe0: 20 32 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22   2, "text/plain"
4ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5000: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5010: 20 22 63 63 61 64 22 2c 20 20 20 20 20 20 20 34   "ccad",       4
5020: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 63  , "application/c
5030: 6c 61 72 69 73 63 61 64 22 20 20 20 20 20 20 20  lariscad"       
5040: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5050: 63 64 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20  cdf",        3, 
5060: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6e  "application/x-n
5070: 65 74 63 64 66 22 20 20 20 20 20 20 20 20 20 20  etcdf"          
5080: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6c      },.    { "cl
5090: 61 73 73 22 2c 20 20 20 20 20 20 35 2c 20 22 61  ass",      5, "a
50a0: 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74  pplication/octet
50b0: 2d 73 74 72 65 61 6d 22 20 20 20 20 20 20 20 20  -stream"        
50c0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 64 22    },.    { "cod"
50d0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
50e0: 6c 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 72 69 6d  lication/vnd.rim
50f0: 2e 63 6f 64 22 20 20 20 20 20 20 20 20 20 20 20  .cod"           
5100: 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 6d 22 2c 20  },.    { "com", 
5110: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
5120: 63 61 74 69 6f 6e 2f 78 2d 6d 73 64 6f 73 2d 70  cation/x-msdos-p
5130: 72 6f 67 72 61 6d 22 20 20 20 20 20 20 20 7d 2c  rogram"       },
5140: 0a 20 20 20 20 7b 20 22 63 70 69 6f 22 2c 20 20  .    { "cpio",  
5150: 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61       4, "applica
5160: 74 69 6f 6e 2f 78 2d 63 70 69 6f 22 20 20 20 20  tion/x-cpio"    
5170: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5180: 20 20 20 7b 20 22 63 70 74 22 2c 20 20 20 20 20     { "cpt",     
5190: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
51a0: 6f 6e 2f 6d 61 63 2d 63 6f 6d 70 61 63 74 70 72  on/mac-compactpr
51b0: 6f 22 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  o"        },.   
51c0: 20 7b 20 22 63 73 68 22 2c 20 20 20 20 20 20 20   { "csh",       
51d0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
51e0: 2f 78 2d 63 73 68 22 20 20 20 20 20 20 20 20 20  /x-csh"         
51f0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5200: 20 22 63 73 73 22 2c 20 20 20 20 20 20 20 20 33   "css",        3
5210: 2c 20 22 74 65 78 74 2f 63 73 73 22 20 20 20 20  , "text/css"    
5220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5230: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5240: 64 63 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20  dcr",        3, 
5250: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 64  "application/x-d
5260: 69 72 65 63 74 6f 72 22 20 20 20 20 20 20 20 20  irector"        
5270: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 65      },.    { "de
5280: 62 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  b",        3, "a
5290: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 64 65 62  pplication/x-deb
52a0: 69 61 6e 2d 70 61 63 6b 61 67 65 22 20 20 20 20  ian-package"    
52b0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 69 72 22    },.    { "dir"
52c0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
52d0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 64 69 72 65 63  lication/x-direc
52e0: 74 6f 72 22 20 20 20 20 20 20 20 20 20 20 20 20  tor"            
52f0: 7d 2c 0a 20 20 20 20 7b 20 22 64 6c 22 2c 20 20  },.    { "dl",  
5300: 20 20 20 20 20 20 20 32 2c 20 22 76 69 64 65 6f         2, "video
5310: 2f 64 6c 22 20 20 20 20 20 20 20 20 20 20 20 20  /dl"            
5320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
5330: 0a 20 20 20 20 7b 20 22 64 6d 73 22 2c 20 20 20  .    { "dms",   
5340: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
5350: 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61  tion/octet-strea
5360: 6d 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  m"          },. 
5370: 20 20 20 7b 20 22 64 6f 63 22 2c 20 20 20 20 20     { "doc",     
5380: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
5390: 6f 6e 2f 6d 73 77 6f 72 64 22 20 20 20 20 20 20  on/msword"      
53a0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
53b0: 20 7b 20 22 64 72 77 22 2c 20 20 20 20 20 20 20   { "drw",       
53c0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
53d0: 2f 64 72 61 66 74 69 6e 67 22 20 20 20 20 20 20  /drafting"      
53e0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
53f0: 20 22 64 76 69 22 2c 20 20 20 20 20 20 20 20 33   "dvi",        3
5400: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
5410: 2d 64 76 69 22 20 20 20 20 20 20 20 20 20 20 20  -dvi"           
5420: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5430: 64 77 67 22 2c 20 20 20 20 20 20 20 20 33 2c 20  dwg",        3, 
5440: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 61 63 61  "application/aca
5450: 64 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d"              
5460: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 78      },.    { "dx
5470: 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  f",        3, "a
5480: 70 70 6c 69 63 61 74 69 6f 6e 2f 64 78 66 22 20  pplication/dxf" 
5490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54a0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 78 72 22    },.    { "dxr"
54b0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
54c0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 64 69 72 65 63  lication/x-direc
54d0: 74 6f 72 22 20 20 20 20 20 20 20 20 20 20 20 20  tor"            
54e0: 7d 2c 0a 20 20 20 20 7b 20 22 65 70 73 22 2c 20  },.    { "eps", 
54f0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
5500: 63 61 74 69 6f 6e 2f 70 6f 73 74 73 63 72 69 70  cation/postscrip
5510: 74 22 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  t"            },
5520: 0a 20 20 20 20 7b 20 22 65 74 78 22 2c 20 20 20  .    { "etx",   
5530: 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 78 2d       3, "text/x-
5540: 73 65 74 65 78 74 22 20 20 20 20 20 20 20 20 20  setext"         
5550: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5560: 20 20 20 7b 20 22 65 78 65 22 2c 20 20 20 20 20     { "exe",     
5570: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
5580: 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22  on/octet-stream"
5590: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
55a0: 20 7b 20 22 65 7a 22 2c 20 20 20 20 20 20 20 20   { "ez",        
55b0: 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   2, "application
55c0: 2f 61 6e 64 72 65 77 2d 69 6e 73 65 74 22 20 20  /andrew-inset"  
55d0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
55e0: 20 22 66 22 2c 20 20 20 20 20 20 20 20 20 20 31   "f",          1
55f0: 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20  , "text/plain"  
5600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5610: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5620: 66 39 30 22 2c 20 20 20 20 20 20 20 20 33 2c 20  f90",        3, 
5630: 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20  "text/plain"    
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5650: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66 6c      },.    { "fl
5660: 69 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76  i",        3, "v
5670: 69 64 65 6f 2f 66 6c 69 22 20 20 20 20 20 20 20  ideo/fli"       
5680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5690: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66 6c 76 22    },.    { "flv"
56a0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64  ,        3, "vid
56b0: 65 6f 2f 66 6c 76 22 20 20 20 20 20 20 20 20 20  eo/flv"         
56c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56d0: 7d 2c 0a 20 20 20 20 7b 20 22 67 69 66 22 2c 20  },.    { "gif", 
56e0: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
56f0: 2f 67 69 66 22 20 20 20 20 20 20 20 20 20 20 20  /gif"           
5700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
5710: 0a 20 20 20 20 7b 20 22 67 6c 22 2c 20 20 20 20  .    { "gl",    
5720: 20 20 20 20 20 32 2c 20 22 76 69 64 65 6f 2f 67       2, "video/g
5730: 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l"              
5740: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5750: 20 20 20 7b 20 22 67 74 61 72 22 2c 20 20 20 20     { "gtar",    
5760: 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69     4, "applicati
5770: 6f 6e 2f 78 2d 67 74 61 72 22 20 20 20 20 20 20  on/x-gtar"      
5780: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5790: 20 7b 20 22 67 7a 22 2c 20 20 20 20 20 20 20 20   { "gz",        
57a0: 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   2, "application
57b0: 2f 78 2d 67 7a 69 70 22 20 20 20 20 20 20 20 20  /x-gzip"        
57c0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
57d0: 20 22 68 64 66 22 2c 20 20 20 20 20 20 20 20 33   "hdf",        3
57e0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
57f0: 2d 68 64 66 22 20 20 20 20 20 20 20 20 20 20 20  -hdf"           
5800: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5810: 68 68 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  hh",         2, 
5820: 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20  "text/plain"    
5830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5840: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68 71      },.    { "hq
5850: 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  x",        3, "a
5860: 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 61 63 2d 62  pplication/mac-b
5870: 69 6e 68 65 78 34 30 22 20 20 20 20 20 20 20 20  inhex40"        
5880: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68 22 2c 20    },.    { "h", 
5890: 20 20 20 20 20 20 20 20 20 31 2c 20 22 74 65 78           1, "tex
58a0: 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20  t/plain"        
58b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58c0: 7d 2c 0a 20 20 20 20 7b 20 22 68 74 6d 22 2c 20  },.    { "htm", 
58d0: 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f         3, "text/
58e0: 68 74 6d 6c 3b 20 63 68 61 72 73 65 74 3d 75 74  html; charset=ut
58f0: 66 2d 38 22 20 20 20 20 20 20 20 20 20 20 7d 2c  f-8"          },
5900: 0a 20 20 20 20 7b 20 22 68 74 6d 6c 22 2c 20 20  .    { "html",  
5910: 20 20 20 20 20 34 2c 20 22 74 65 78 74 2f 68 74       4, "text/ht
5920: 6d 6c 3b 20 63 68 61 72 73 65 74 3d 75 74 66 2d  ml; charset=utf-
5930: 38 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  8"          },. 
5940: 20 20 20 7b 20 22 69 63 65 22 2c 20 20 20 20 20     { "ice",     
5950: 20 20 20 33 2c 20 22 78 2d 63 6f 6e 66 65 72 65     3, "x-confere
5960: 6e 63 65 2f 78 2d 63 6f 6f 6c 74 61 6c 6b 22 20  nce/x-cooltalk" 
5970: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5980: 20 7b 20 22 69 65 66 22 2c 20 20 20 20 20 20 20   { "ief",       
5990: 20 33 2c 20 22 69 6d 61 67 65 2f 69 65 66 22 20   3, "image/ief" 
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59b0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
59c0: 20 22 69 67 65 73 22 2c 20 20 20 20 20 20 20 34   "iges",       4
59d0: 2c 20 22 6d 6f 64 65 6c 2f 69 67 65 73 22 20 20  , "model/iges"  
59e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59f0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5a00: 69 67 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20  igs",        3, 
5a10: 22 6d 6f 64 65 6c 2f 69 67 65 73 22 20 20 20 20  "model/iges"    
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a30: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 70      },.    { "ip
5a40: 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  s",        3, "a
5a50: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 69 70 73  pplication/x-ips
5a60: 63 72 69 70 74 22 20 20 20 20 20 20 20 20 20 20  cript"          
5a70: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 70 78 22    },.    { "ipx"
5a80: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
5a90: 6c 69 63 61 74 69 6f 6e 2f 78 2d 69 70 69 78 22  lication/x-ipix"
5aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ab0: 7d 2c 0a 20 20 20 20 7b 20 22 6a 61 64 22 2c 20  },.    { "jad", 
5ac0: 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f         3, "text/
5ad0: 76 6e 64 2e 73 75 6e 2e 6a 32 6d 65 2e 61 70 70  vnd.sun.j2me.app
5ae0: 2d 64 65 73 63 72 69 70 74 6f 72 22 20 20 7d 2c  -descriptor"  },
5af0: 0a 20 20 20 20 7b 20 22 6a 61 72 22 2c 20 20 20  .    { "jar",   
5b00: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
5b10: 74 69 6f 6e 2f 6a 61 76 61 2d 61 72 63 68 69 76  tion/java-archiv
5b20: 65 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  e"          },. 
5b30: 20 20 20 7b 20 22 6a 70 65 67 22 2c 20 20 20 20     { "jpeg",    
5b40: 20 20 20 34 2c 20 22 69 6d 61 67 65 2f 6a 70 65     4, "image/jpe
5b50: 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g"              
5b60: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5b70: 20 7b 20 22 6a 70 65 22 2c 20 20 20 20 20 20 20   { "jpe",       
5b80: 20 33 2c 20 22 69 6d 61 67 65 2f 6a 70 65 67 22   3, "image/jpeg"
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ba0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5bb0: 20 22 6a 70 67 22 2c 20 20 20 20 20 20 20 20 33   "jpg",        3
5bc0: 2c 20 22 69 6d 61 67 65 2f 6a 70 65 67 22 20 20  , "image/jpeg"  
5bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5be0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5bf0: 6a 73 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  js",         2, 
5c00: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6a  "application/x-j
5c10: 61 76 61 73 63 72 69 70 74 22 20 20 20 20 20 20  avascript"      
5c20: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6b 61      },.    { "ka
5c30: 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  r",        3, "a
5c40: 75 64 69 6f 2f 6d 69 64 69 22 20 20 20 20 20 20  udio/midi"      
5c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c60: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 61 74 65    },.    { "late
5c70: 78 22 2c 20 20 20 20 20 20 35 2c 20 22 61 70 70  x",      5, "app
5c80: 6c 69 63 61 74 69 6f 6e 2f 78 2d 6c 61 74 65 78  lication/x-latex
5c90: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
5ca0: 7d 2c 0a 20 20 20 20 7b 20 22 6c 68 61 22 2c 20  },.    { "lha", 
5cb0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
5cc0: 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72  cation/octet-str
5cd0: 65 61 6d 22 20 20 20 20 20 20 20 20 20 20 7d 2c  eam"          },
5ce0: 0a 20 20 20 20 7b 20 22 6c 73 70 22 2c 20 20 20  .    { "lsp",   
5cf0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
5d00: 74 69 6f 6e 2f 78 2d 6c 69 73 70 22 20 20 20 20  tion/x-lisp"    
5d10: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5d20: 20 20 20 7b 20 22 6c 7a 68 22 2c 20 20 20 20 20     { "lzh",     
5d30: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
5d40: 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22  on/octet-stream"
5d50: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5d60: 20 7b 20 22 6d 22 2c 20 20 20 20 20 20 20 20 20   { "m",         
5d70: 20 31 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22   1, "text/plain"
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d90: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5da0: 20 22 6d 33 75 22 2c 20 20 20 20 20 20 20 20 33   "m3u",        3
5db0: 2c 20 22 61 75 64 69 6f 2f 78 2d 6d 70 65 67 75  , "audio/x-mpegu
5dc0: 72 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20  rl"             
5dd0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5de0: 6d 61 6e 22 2c 20 20 20 20 20 20 20 20 33 2c 20  man",        3, 
5df0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74  "application/x-t
5e00: 72 6f 66 66 2d 6d 61 6e 22 20 20 20 20 20 20 20  roff-man"       
5e10: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 65      },.    { "me
5e20: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61  ",         2, "a
5e30: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72 6f  pplication/x-tro
5e40: 66 66 2d 6d 65 22 20 20 20 20 20 20 20 20 20 20  ff-me"          
5e50: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 65 73 68    },.    { "mesh
5e60: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 6d 6f 64  ",       4, "mod
5e70: 65 6c 2f 6d 65 73 68 22 20 20 20 20 20 20 20 20  el/mesh"        
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e90: 7d 2c 0a 20 20 20 20 7b 20 22 6d 69 64 22 2c 20  },.    { "mid", 
5ea0: 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f         3, "audio
5eb0: 2f 6d 69 64 69 22 20 20 20 20 20 20 20 20 20 20  /midi"          
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
5ed0: 0a 20 20 20 20 7b 20 22 6d 69 64 69 22 2c 20 20  .    { "midi",  
5ee0: 20 20 20 20 20 34 2c 20 22 61 75 64 69 6f 2f 6d       4, "audio/m
5ef0: 69 64 69 22 20 20 20 20 20 20 20 20 20 20 20 20  idi"            
5f00: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5f10: 20 20 20 7b 20 22 6d 69 66 22 2c 20 20 20 20 20     { "mif",     
5f20: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
5f30: 6f 6e 2f 78 2d 6d 69 66 22 20 20 20 20 20 20 20  on/x-mif"       
5f40: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5f50: 20 7b 20 22 6d 69 6d 65 22 2c 20 20 20 20 20 20   { "mime",      
5f60: 20 34 2c 20 22 77 77 77 2f 6d 69 6d 65 22 20 20   4, "www/mime"  
5f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f80: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5f90: 20 22 6d 6f 76 69 65 22 2c 20 20 20 20 20 20 35   "movie",      5
5fa0: 2c 20 22 76 69 64 65 6f 2f 78 2d 73 67 69 2d 6d  , "video/x-sgi-m
5fb0: 6f 76 69 65 22 20 20 20 20 20 20 20 20 20 20 20  ovie"           
5fc0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5fd0: 6d 6f 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20  mov",        3, 
5fe0: 22 76 69 64 65 6f 2f 71 75 69 63 6b 74 69 6d 65  "video/quicktime
5ff0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
6000: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70      },.    { "mp
6010: 32 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  2",        3, "a
6020: 75 64 69 6f 2f 6d 70 65 67 22 20 20 20 20 20 20  udio/mpeg"      
6030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6040: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 32 22    },.    { "mp2"
6050: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64  ,        3, "vid
6060: 65 6f 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20  eo/mpeg"        
6070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6080: 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 33 22 2c 20  },.    { "mp3", 
6090: 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f         3, "audio
60a0: 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20 20 20  /mpeg"          
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
60c0: 0a 20 20 20 20 7b 20 22 6d 70 65 67 22 2c 20 20  .    { "mpeg",  
60d0: 20 20 20 20 20 34 2c 20 22 76 69 64 65 6f 2f 6d       4, "video/m
60e0: 70 65 67 22 20 20 20 20 20 20 20 20 20 20 20 20  peg"            
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6100: 20 20 20 7b 20 22 6d 70 65 22 2c 20 20 20 20 20     { "mpe",     
6110: 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 6d 70 65     3, "video/mpe
6120: 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g"              
6130: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6140: 20 7b 20 22 6d 70 67 61 22 2c 20 20 20 20 20 20   { "mpga",      
6150: 20 34 2c 20 22 61 75 64 69 6f 2f 6d 70 65 67 22   4, "audio/mpeg"
6160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6170: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6180: 20 22 6d 70 67 22 2c 20 20 20 20 20 20 20 20 33   "mpg",        3
6190: 2c 20 22 76 69 64 65 6f 2f 6d 70 65 67 22 20 20  , "video/mpeg"  
61a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61b0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
61c0: 6d 73 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  ms",         2, 
61d0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74  "application/x-t
61e0: 72 6f 66 66 2d 6d 73 22 20 20 20 20 20 20 20 20  roff-ms"        
61f0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 73      },.    { "ms
6200: 68 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 6d  h",        3, "m
6210: 6f 64 65 6c 2f 6d 65 73 68 22 20 20 20 20 20 20  odel/mesh"      
6220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6230: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 63 22 2c    },.    { "nc",
6240: 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70 70           2, "app
6250: 6c 69 63 61 74 69 6f 6e 2f 78 2d 6e 65 74 63 64  lication/x-netcd
6260: 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f"              
6270: 7d 2c 0a 20 20 20 20 7b 20 22 6f 64 61 22 2c 20  },.    { "oda", 
6280: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
6290: 63 61 74 69 6f 6e 2f 6f 64 61 22 20 20 20 20 20  cation/oda"     
62a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
62b0: 0a 20 20 20 20 7b 20 22 6f 67 67 22 2c 20 20 20  .    { "ogg",   
62c0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
62d0: 74 69 6f 6e 2f 6f 67 67 22 20 20 20 20 20 20 20  tion/ogg"       
62e0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
62f0: 20 20 20 7b 20 22 6f 67 6d 22 2c 20 20 20 20 20     { "ogm",     
6300: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
6310: 6f 6e 2f 6f 67 67 22 20 20 20 20 20 20 20 20 20  on/ogg"         
6320: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6330: 20 7b 20 22 70 62 6d 22 2c 20 20 20 20 20 20 20   { "pbm",       
6340: 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 70 6f 72   3, "image/x-por
6350: 74 61 62 6c 65 2d 62 69 74 6d 61 70 22 20 20 20  table-bitmap"   
6360: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6370: 20 22 70 64 62 22 2c 20 20 20 20 20 20 20 20 33   "pdb",        3
6380: 2c 20 22 63 68 65 6d 69 63 61 6c 2f 78 2d 70 64  , "chemical/x-pd
6390: 62 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b"              
63a0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
63b0: 70 64 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20  pdf",        3, 
63c0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 64 66  "application/pdf
63d0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
63e0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 67      },.    { "pg
63f0: 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69  m",        3, "i
6400: 6d 61 67 65 2f 78 2d 70 6f 72 74 61 62 6c 65 2d  mage/x-portable-
6410: 67 72 61 79 6d 61 70 22 20 20 20 20 20 20 20 20  graymap"        
6420: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 67 6e 22    },.    { "pgn"
6430: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
6440: 6c 69 63 61 74 69 6f 6e 2f 78 2d 63 68 65 73 73  lication/x-chess
6450: 2d 70 67 6e 22 20 20 20 20 20 20 20 20 20 20 20  -pgn"           
6460: 7d 2c 0a 20 20 20 20 7b 20 22 70 67 70 22 2c 20  },.    { "pgp", 
6470: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
6480: 63 61 74 69 6f 6e 2f 70 67 70 22 20 20 20 20 20  cation/pgp"     
6490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
64a0: 0a 20 20 20 20 7b 20 22 70 6c 22 2c 20 20 20 20  .    { "pl",    
64b0: 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61       2, "applica
64c0: 74 69 6f 6e 2f 78 2d 70 65 72 6c 22 20 20 20 20  tion/x-perl"    
64d0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
64e0: 20 20 20 7b 20 22 70 6d 22 2c 20 20 20 20 20 20     { "pm",      
64f0: 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69     2, "applicati
6500: 6f 6e 2f 78 2d 70 65 72 6c 22 20 20 20 20 20 20  on/x-perl"      
6510: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6520: 20 7b 20 22 70 6e 67 22 2c 20 20 20 20 20 20 20   { "png",       
6530: 20 33 2c 20 22 69 6d 61 67 65 2f 70 6e 67 22 20   3, "image/png" 
6540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6550: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6560: 20 22 70 6e 6d 22 2c 20 20 20 20 20 20 20 20 33   "pnm",        3
6570: 2c 20 22 69 6d 61 67 65 2f 78 2d 70 6f 72 74 61  , "image/x-porta
6580: 62 6c 65 2d 61 6e 79 6d 61 70 22 20 20 20 20 20  ble-anymap"     
6590: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
65a0: 70 6f 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20  pot",        3, 
65b0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 70  "application/msp
65c0: 6f 77 65 72 70 6f 69 6e 74 22 20 20 20 20 20 20  owerpoint"      
65d0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 70      },.    { "pp
65e0: 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69  m",        3, "i
65f0: 6d 61 67 65 2f 78 2d 70 6f 72 74 61 62 6c 65 2d  mage/x-portable-
6600: 70 69 78 6d 61 70 22 20 20 20 20 20 20 20 20 20  pixmap"         
6610: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 70 73 22    },.    { "pps"
6620: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
6630: 6c 69 63 61 74 69 6f 6e 2f 6d 73 70 6f 77 65 72  lication/mspower
6640: 70 6f 69 6e 74 22 20 20 20 20 20 20 20 20 20 20  point"          
6650: 7d 2c 0a 20 20 20 20 7b 20 22 70 70 74 22 2c 20  },.    { "ppt", 
6660: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
6670: 63 61 74 69 6f 6e 2f 6d 73 70 6f 77 65 72 70 6f  cation/mspowerpo
6680: 69 6e 74 22 20 20 20 20 20 20 20 20 20 20 7d 2c  int"          },
6690: 0a 20 20 20 20 7b 20 22 70 70 7a 22 2c 20 20 20  .    { "ppz",   
66a0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
66b0: 74 69 6f 6e 2f 6d 73 70 6f 77 65 72 70 6f 69 6e  tion/mspowerpoin
66c0: 74 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  t"          },. 
66d0: 20 20 20 7b 20 22 70 72 65 22 2c 20 20 20 20 20     { "pre",     
66e0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
66f0: 6f 6e 2f 78 2d 66 72 65 65 6c 61 6e 63 65 22 20  on/x-freelance" 
6700: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6710: 20 7b 20 22 70 72 74 22 2c 20 20 20 20 20 20 20   { "prt",       
6720: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
6730: 2f 70 72 6f 5f 65 6e 67 22 20 20 20 20 20 20 20  /pro_eng"       
6740: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6750: 20 22 70 73 22 2c 20 20 20 20 20 20 20 20 20 32   "ps",         2
6760: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70  , "application/p
6770: 6f 73 74 73 63 72 69 70 74 22 20 20 20 20 20 20  ostscript"      
6780: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6790: 71 74 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  qt",         2, 
67a0: 22 76 69 64 65 6f 2f 71 75 69 63 6b 74 69 6d 65  "video/quicktime
67b0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
67c0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61      },.    { "ra
67d0: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61  ",         2, "a
67e0: 75 64 69 6f 2f 78 2d 72 65 61 6c 61 75 64 69 6f  udio/x-realaudio
67f0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
6800: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61 6d 22    },.    { "ram"
6810: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64  ,        3, "aud
6820: 69 6f 2f 78 2d 70 6e 2d 72 65 61 6c 61 75 64 69  io/x-pn-realaudi
6830: 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o"              
6840: 7d 2c 0a 20 20 20 20 7b 20 22 72 61 72 22 2c 20  },.    { "rar", 
6850: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
6860: 63 61 74 69 6f 6e 2f 78 2d 72 61 72 2d 63 6f 6d  cation/x-rar-com
6870: 70 72 65 73 73 65 64 22 20 20 20 20 20 20 7d 2c  pressed"      },
6880: 0a 20 20 20 20 7b 20 22 72 61 73 22 2c 20 20 20  .    { "ras",   
6890: 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 63       3, "image/c
68a0: 6d 75 2d 72 61 73 74 65 72 22 20 20 20 20 20 20  mu-raster"      
68b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
68c0: 20 20 20 7b 20 22 72 61 73 22 2c 20 20 20 20 20     { "ras",     
68d0: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 63     3, "image/x-c
68e0: 6d 75 2d 72 61 73 74 65 72 22 20 20 20 20 20 20  mu-raster"      
68f0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6900: 20 7b 20 22 72 67 62 22 2c 20 20 20 20 20 20 20   { "rgb",       
6910: 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 72 67 62   3, "image/x-rgb
6920: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
6930: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6940: 20 22 72 6d 22 2c 20 20 20 20 20 20 20 20 20 32   "rm",         2
6950: 2c 20 22 61 75 64 69 6f 2f 78 2d 70 6e 2d 72 65  , "audio/x-pn-re
6960: 61 6c 61 75 64 69 6f 22 20 20 20 20 20 20 20 20  alaudio"        
6970: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6980: 72 6f 66 66 22 2c 20 20 20 20 20 20 20 34 2c 20  roff",       4, 
6990: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74  "application/x-t
69a0: 72 6f 66 66 22 20 20 20 20 20 20 20 20 20 20 20  roff"           
69b0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 70      },.    { "rp
69c0: 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  m",        3, "a
69d0: 75 64 69 6f 2f 78 2d 70 6e 2d 72 65 61 6c 61 75  udio/x-pn-realau
69e0: 64 69 6f 2d 70 6c 75 67 69 6e 22 20 20 20 20 20  dio-plugin"     
69f0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 74 66 22    },.    { "rtf"
6a00: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
6a10: 6c 69 63 61 74 69 6f 6e 2f 72 74 66 22 20 20 20  lication/rtf"   
6a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a30: 7d 2c 0a 20 20 20 20 7b 20 22 72 74 66 22 2c 20  },.    { "rtf", 
6a40: 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f         3, "text/
6a50: 72 74 66 22 20 20 20 20 20 20 20 20 20 20 20 20  rtf"            
6a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6a70: 0a 20 20 20 20 7b 20 22 72 74 78 22 2c 20 20 20  .    { "rtx",   
6a80: 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 72 69       3, "text/ri
6a90: 63 68 74 65 78 74 22 20 20 20 20 20 20 20 20 20  chtext"         
6aa0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6ab0: 20 20 20 7b 20 22 73 63 6d 22 2c 20 20 20 20 20     { "scm",     
6ac0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
6ad0: 6f 6e 2f 78 2d 6c 6f 74 75 73 73 63 72 65 65 6e  on/x-lotusscreen
6ae0: 63 61 6d 22 20 20 20 20 20 20 7d 2c 0a 20 20 20  cam"      },.   
6af0: 20 7b 20 22 73 65 74 22 2c 20 20 20 20 20 20 20   { "set",       
6b00: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
6b10: 2f 73 65 74 22 20 20 20 20 20 20 20 20 20 20 20  /set"           
6b20: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6b30: 20 22 73 67 6d 6c 22 2c 20 20 20 20 20 20 20 34   "sgml",       4
6b40: 2c 20 22 74 65 78 74 2f 73 67 6d 6c 22 20 20 20  , "text/sgml"   
6b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b60: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6b70: 73 67 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20  sgm",        3, 
6b80: 22 74 65 78 74 2f 73 67 6d 6c 22 20 20 20 20 20  "text/sgml"     
6b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ba0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 68      },.    { "sh
6bb0: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61  ",         2, "a
6bc0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 68 22  pplication/x-sh"
6bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6be0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 68 61 72    },.    { "shar
6bf0: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70 70  ",       4, "app
6c00: 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 68 61 72 22  lication/x-shar"
6c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c20: 7d 2c 0a 20 20 20 20 7b 20 22 73 69 6c 6f 22 2c  },.    { "silo",
6c30: 20 20 20 20 20 20 20 34 2c 20 22 6d 6f 64 65 6c         4, "model
6c40: 2f 6d 65 73 68 22 20 20 20 20 20 20 20 20 20 20  /mesh"          
6c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6c60: 0a 20 20 20 20 7b 20 22 73 69 74 22 2c 20 20 20  .    { "sit",   
6c70: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
6c80: 74 69 6f 6e 2f 78 2d 73 74 75 66 66 69 74 22 20  tion/x-stuffit" 
6c90: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6ca0: 20 20 20 7b 20 22 73 6b 64 22 2c 20 20 20 20 20     { "skd",     
6cb0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
6cc0: 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20 20 20 20  on/x-koan"      
6cd0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6ce0: 20 7b 20 22 73 6b 6d 22 2c 20 20 20 20 20 20 20   { "skm",       
6cf0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
6d00: 2f 78 2d 6b 6f 61 6e 22 20 20 20 20 20 20 20 20  /x-koan"        
6d10: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6d20: 20 22 73 6b 70 22 2c 20 20 20 20 20 20 20 20 33   "skp",        3
6d30: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
6d40: 2d 6b 6f 61 6e 22 20 20 20 20 20 20 20 20 20 20  -koan"          
6d50: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6d60: 73 6b 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20  skt",        3, 
6d70: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6b  "application/x-k
6d80: 6f 61 6e 22 20 20 20 20 20 20 20 20 20 20 20 20  oan"            
6d90: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d      },.    { "sm
6da0: 69 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  i",        3, "a
6db0: 70 70 6c 69 63 61 74 69 6f 6e 2f 73 6d 69 6c 22  pplication/smil"
6dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6dd0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 69 6c    },.    { "smil
6de0: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70 70  ",       4, "app
6df0: 6c 69 63 61 74 69 6f 6e 2f 73 6d 69 6c 22 20 20  lication/smil"  
6e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e10: 7d 2c 0a 20 20 20 20 7b 20 22 73 6e 64 22 2c 20  },.    { "snd", 
6e20: 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f         3, "audio
6e30: 2f 62 61 73 69 63 22 20 20 20 20 20 20 20 20 20  /basic"         
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6e50: 0a 20 20 20 20 7b 20 22 73 6f 6c 22 2c 20 20 20  .    { "sol",   
6e60: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
6e70: 74 69 6f 6e 2f 73 6f 6c 69 64 73 22 20 20 20 20  tion/solids"    
6e80: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6e90: 20 20 20 7b 20 22 73 70 6c 22 2c 20 20 20 20 20     { "spl",     
6ea0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
6eb0: 6f 6e 2f 78 2d 66 75 74 75 72 65 73 70 6c 61 73  on/x-futuresplas
6ec0: 68 22 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  h"        },.   
6ed0: 20 7b 20 22 73 72 63 22 2c 20 20 20 20 20 20 20   { "src",       
6ee0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
6ef0: 2f 78 2d 77 61 69 73 2d 73 6f 75 72 63 65 22 20  /x-wais-source" 
6f00: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6f10: 20 22 73 74 65 70 22 2c 20 20 20 20 20 20 20 34   "step",       4
6f20: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 53  , "application/S
6f30: 54 45 50 22 20 20 20 20 20 20 20 20 20 20 20 20  TEP"            
6f40: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6f50: 73 74 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20  stl",        3, 
6f60: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 53 4c 41  "application/SLA
6f70: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
6f80: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 74      },.    { "st
6f90: 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  p",        3, "a
6fa0: 70 70 6c 69 63 61 74 69 6f 6e 2f 53 54 45 50 22  pplication/STEP"
6fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fc0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 76 34 63    },.    { "sv4c
6fd0: 70 69 6f 22 2c 20 20 20 20 37 2c 20 22 61 70 70  pio",    7, "app
6fe0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 76 34 63 70  lication/x-sv4cp
6ff0: 69 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20  io"             
7000: 7d 2c 0a 20 20 20 20 7b 20 22 73 76 34 63 72 63  },.    { "sv4crc
7010: 22 2c 20 20 20 20 20 36 2c 20 22 61 70 70 6c 69  ",     6, "appli
7020: 63 61 74 69 6f 6e 2f 78 2d 73 76 34 63 72 63 22  cation/x-sv4crc"
7030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7040: 0a 20 20 20 20 7b 20 22 73 77 66 22 2c 20 20 20  .    { "swf",   
7050: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
7060: 74 69 6f 6e 2f 78 2d 73 68 6f 63 6b 77 61 76 65  tion/x-shockwave
7070: 2d 66 6c 61 73 68 22 20 20 20 20 20 7d 2c 0a 20  -flash"     },. 
7080: 20 20 20 7b 20 22 74 22 2c 20 20 20 20 20 20 20     { "t",       
7090: 20 20 20 31 2c 20 22 61 70 70 6c 69 63 61 74 69     1, "applicati
70a0: 6f 6e 2f 78 2d 74 72 6f 66 66 22 20 20 20 20 20  on/x-troff"     
70b0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
70c0: 20 7b 20 22 74 61 72 22 2c 20 20 20 20 20 20 20   { "tar",       
70d0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
70e0: 2f 78 2d 74 61 72 22 20 20 20 20 20 20 20 20 20  /x-tar"         
70f0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7100: 20 22 74 63 6c 22 2c 20 20 20 20 20 20 20 20 33   "tcl",        3
7110: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
7120: 2d 74 63 6c 22 20 20 20 20 20 20 20 20 20 20 20  -tcl"           
7130: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7140: 74 65 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20  tex",        3, 
7150: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74  "application/x-t
7160: 65 78 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ex"             
7170: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 65      },.    { "te
7180: 78 69 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61  xi",       4, "a
7190: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 65 78  pplication/x-tex
71a0: 69 6e 66 6f 22 20 20 20 20 20 20 20 20 20 20 20  info"           
71b0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 65 78 69    },.    { "texi
71c0: 6e 66 6f 22 2c 20 20 20 20 37 2c 20 22 61 70 70  nfo",    7, "app
71d0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 65 78 69 6e  lication/x-texin
71e0: 66 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20  fo"             
71f0: 7d 2c 0a 20 20 20 20 7b 20 22 74 67 7a 22 2c 20  },.    { "tgz", 
7200: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
7210: 63 61 74 69 6f 6e 2f 78 2d 74 61 72 2d 67 7a 22  cation/x-tar-gz"
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7230: 0a 20 20 20 20 7b 20 22 74 69 66 66 22 2c 20 20  .    { "tiff",  
7240: 20 20 20 20 20 34 2c 20 22 69 6d 61 67 65 2f 74       4, "image/t
7250: 69 66 66 22 20 20 20 20 20 20 20 20 20 20 20 20  iff"            
7260: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7270: 20 20 20 7b 20 22 74 69 66 22 2c 20 20 20 20 20     { "tif",     
7280: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 74 69 66     3, "image/tif
7290: 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f"              
72a0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
72b0: 20 7b 20 22 74 72 22 2c 20 20 20 20 20 20 20 20   { "tr",        
72c0: 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   2, "application
72d0: 2f 78 2d 74 72 6f 66 66 22 20 20 20 20 20 20 20  /x-troff"       
72e0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
72f0: 20 22 74 73 69 22 2c 20 20 20 20 20 20 20 20 33   "tsi",        3
7300: 2c 20 22 61 75 64 69 6f 2f 54 53 50 2d 61 75 64  , "audio/TSP-aud
7310: 69 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20  io"             
7320: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7330: 74 73 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20  tsp",        3, 
7340: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 64 73 70  "application/dsp
7350: 74 79 70 65 22 20 20 20 20 20 20 20 20 20 20 20  type"           
7360: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 73      },.    { "ts
7370: 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74  v",        3, "t
7380: 65 78 74 2f 74 61 62 2d 73 65 70 61 72 61 74 65  ext/tab-separate
7390: 64 2d 76 61 6c 75 65 73 22 20 20 20 20 20 20 20  d-values"       
73a0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 78 74 22    },.    { "txt"
73b0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65 78  ,        3, "tex
73c0: 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20  t/plain"        
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73e0: 7d 2c 0a 20 20 20 20 7b 20 22 75 6e 76 22 2c 20  },.    { "unv", 
73f0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
7400: 63 61 74 69 6f 6e 2f 69 2d 64 65 61 73 22 20 20  cation/i-deas"  
7410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7420: 0a 20 20 20 20 7b 20 22 75 73 74 61 72 22 2c 20  .    { "ustar", 
7430: 20 20 20 20 20 35 2c 20 22 61 70 70 6c 69 63 61       5, "applica
7440: 74 69 6f 6e 2f 78 2d 75 73 74 61 72 22 20 20 20  tion/x-ustar"   
7450: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7460: 20 20 20 7b 20 22 76 63 64 22 2c 20 20 20 20 20     { "vcd",     
7470: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
7480: 6f 6e 2f 78 2d 63 64 6c 69 6e 6b 22 20 20 20 20  on/x-cdlink"    
7490: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
74a0: 20 7b 20 22 76 64 61 22 2c 20 20 20 20 20 20 20   { "vda",       
74b0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
74c0: 2f 76 64 61 22 20 20 20 20 20 20 20 20 20 20 20  /vda"           
74d0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
74e0: 20 22 76 69 76 22 2c 20 20 20 20 20 20 20 20 33   "viv",        3
74f0: 2c 20 22 76 69 64 65 6f 2f 76 6e 64 2e 76 69 76  , "video/vnd.viv
7500: 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o"              
7510: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7520: 76 69 76 6f 22 2c 20 20 20 20 20 20 20 34 2c 20  vivo",       4, 
7530: 22 76 69 64 65 6f 2f 76 6e 64 2e 76 69 76 6f 22  "video/vnd.vivo"
7540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7550: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 76 72      },.    { "vr
7560: 6d 6c 22 2c 20 20 20 20 20 20 20 34 2c 20 22 6d  ml",       4, "m
7570: 6f 64 65 6c 2f 76 72 6d 6c 22 20 20 20 20 20 20  odel/vrml"      
7580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7590: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 61 76 22    },.    { "wav"
75a0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64  ,        3, "aud
75b0: 69 6f 2f 78 2d 77 61 76 22 20 20 20 20 20 20 20  io/x-wav"       
75c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75d0: 7d 2c 0a 20 20 20 20 7b 20 22 77 61 78 22 2c 20  },.    { "wax", 
75e0: 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f         3, "audio
75f0: 2f 78 2d 6d 73 2d 77 61 78 22 20 20 20 20 20 20  /x-ms-wax"      
7600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7610: 0a 20 20 20 20 7b 20 22 77 69 6b 69 22 2c 20 20  .    { "wiki",  
7620: 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61       4, "applica
7630: 74 69 6f 6e 2f 78 2d 66 6f 73 73 69 6c 2d 77 69  tion/x-fossil-wi
7640: 6b 69 22 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  ki"         },. 
7650: 20 20 20 7b 20 22 77 6d 61 22 2c 20 20 20 20 20     { "wma",     
7660: 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 6d     3, "audio/x-m
7670: 73 2d 77 6d 61 22 20 20 20 20 20 20 20 20 20 20  s-wma"          
7680: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7690: 20 7b 20 22 77 6d 76 22 2c 20 20 20 20 20 20 20   { "wmv",       
76a0: 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d   3, "video/x-ms-
76b0: 77 6d 76 22 20 20 20 20 20 20 20 20 20 20 20 20  wmv"            
76c0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
76d0: 20 22 77 6d 78 22 2c 20 20 20 20 20 20 20 20 33   "wmx",        3
76e0: 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 77 6d  , "video/x-ms-wm
76f0: 78 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x"              
7700: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7710: 77 72 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20  wrl",        3, 
7720: 22 6d 6f 64 65 6c 2f 76 72 6d 6c 22 20 20 20 20  "model/vrml"    
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 76      },.    { "wv
7750: 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76  x",        3, "v
7760: 69 64 65 6f 2f 78 2d 6d 73 2d 77 76 78 22 20 20  ideo/x-ms-wvx"  
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7780: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 62 6d 22    },.    { "xbm"
7790: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61  ,        3, "ima
77a0: 67 65 2f 78 2d 78 62 69 74 6d 61 70 22 20 20 20  ge/x-xbitmap"   
77b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77c0: 7d 2c 0a 20 20 20 20 7b 20 22 78 6c 63 22 2c 20  },.    { "xlc", 
77d0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
77e0: 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78  cation/vnd.ms-ex
77f0: 63 65 6c 22 20 20 20 20 20 20 20 20 20 20 7d 2c  cel"          },
7800: 0a 20 20 20 20 7b 20 22 78 6c 6c 22 2c 20 20 20  .    { "xll",   
7810: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
7820: 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65  tion/vnd.ms-exce
7830: 6c 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  l"          },. 
7840: 20 20 20 7b 20 22 78 6c 6d 22 2c 20 20 20 20 20     { "xlm",     
7850: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
7860: 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22  on/vnd.ms-excel"
7870: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7880: 20 7b 20 22 78 6c 73 22 2c 20 20 20 20 20 20 20   { "xls",       
7890: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
78a0: 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20 20  /vnd.ms-excel"  
78b0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
78c0: 20 22 78 6c 77 22 2c 20 20 20 20 20 20 20 20 33   "xlw",        3
78d0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76  , "application/v
78e0: 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20 20 20 20  nd.ms-excel"    
78f0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7900: 78 6d 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20  xml",        3, 
7910: 22 74 65 78 74 2f 78 6d 6c 22 20 20 20 20 20 20  "text/xml"      
7920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7930: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 70      },.    { "xp
7940: 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69  m",        3, "i
7950: 6d 61 67 65 2f 78 2d 78 70 69 78 6d 61 70 22 20  mage/x-xpixmap" 
7960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7970: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 77 64 22    },.    { "xwd"
7980: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61  ,        3, "ima
7990: 67 65 2f 78 2d 78 77 69 6e 64 6f 77 64 75 6d 70  ge/x-xwindowdump
79a0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
79b0: 7d 2c 0a 20 20 20 20 7b 20 22 78 79 7a 22 2c 20  },.    { "xyz", 
79c0: 20 20 20 20 20 20 20 33 2c 20 22 63 68 65 6d 69         3, "chemi
79d0: 63 61 6c 2f 78 2d 70 64 62 22 20 20 20 20 20 20  cal/x-pdb"      
79e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
79f0: 0a 20 20 20 20 7b 20 22 7a 69 70 22 2c 20 20 20  .    { "zip",   
7a00: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
7a10: 74 69 6f 6e 2f 7a 69 70 22 20 20 20 20 20 20 20  tion/zip"       
7a20: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7a30: 20 7d 3b 0a 0a 20 20 66 6f 72 28 69 3d 6e 4e 61   };..  for(i=nNa
7a40: 6d 65 2d 31 3b 20 69 3e 30 20 26 26 20 7a 4e 61  me-1; i>0 && zNa
7a50: 6d 65 5b 69 5d 21 3d 27 2e 27 3b 20 69 2d 2d 29  me[i]!='.'; i--)
7a60: 7b 7d 0a 20 20 7a 20 3d 20 26 7a 4e 61 6d 65 5b  {}.  z = &zName[
7a70: 69 2b 31 5d 3b 0a 20 20 6c 65 6e 20 3d 20 6e 4e  i+1];.  len = nN
7a80: 61 6d 65 20 2d 20 69 3b 0a 20 20 69 66 28 20 6c  ame - i;.  if( l
7a90: 65 6e 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 7a  en<(int)sizeof(z
7aa0: 53 75 66 66 69 78 29 2d 31 20 29 7b 0a 20 20 20  Suffix)-1 ){.   
7ab0: 20 73 74 72 63 70 79 28 7a 53 75 66 66 69 78 2c   strcpy(zSuffix,
7ac0: 20 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   z);.    for(i=0
7ad0: 3b 20 7a 53 75 66 66 69 78 5b 69 5d 3b 20 69 2b  ; zSuffix[i]; i+
7ae0: 2b 29 20 7a 53 75 66 66 69 78 5b 69 5d 20 3d 20  +) zSuffix[i] = 
7af0: 74 6f 6c 6f 77 65 72 28 7a 53 75 66 66 69 78 5b  tolower(zSuffix[
7b00: 69 5d 29 3b 0a 20 20 20 20 66 69 72 73 74 20 3d  i]);.    first =
7b10: 20 30 3b 0a 20 20 20 20 6c 61 73 74 20 3d 20 73   0;.    last = s
7b20: 69 7a 65 6f 66 28 61 4d 69 6d 65 29 2f 73 69 7a  izeof(aMime)/siz
7b30: 65 6f 66 28 61 4d 69 6d 65 5b 30 5d 29 3b 0a 20  eof(aMime[0]);. 
7b40: 20 20 20 77 68 69 6c 65 28 20 66 69 72 73 74 3c     while( first<
7b50: 3d 6c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 69  =last ){.      i
7b60: 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 20 3d 20  nt c;.      i = 
7b70: 28 66 69 72 73 74 2b 6c 61 73 74 29 2f 32 3b 0a  (first+last)/2;.
7b80: 20 20 20 20 20 20 63 20 3d 20 73 74 72 63 6d 70        c = strcmp
7b90: 28 7a 53 75 66 66 69 78 2c 20 61 4d 69 6d 65 5b  (zSuffix, aMime[
7ba0: 69 5d 2e 7a 53 75 66 66 69 78 29 3b 0a 20 20 20  i].zSuffix);.   
7bb0: 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65     if( c==0 ) re
7bc0: 74 75 72 6e 20 61 4d 69 6d 65 5b 69 5d 2e 7a 4d  turn aMime[i].zM
7bd0: 69 6d 65 74 79 70 65 3b 0a 20 20 20 20 20 20 69  imetype;.      i
7be0: 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( c<0 ){.      
7bf0: 20 20 6c 61 73 74 20 3d 20 69 2d 31 3b 0a 20 20    last = i-1;.  
7c00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7c10: 20 20 20 66 69 72 73 74 20 3d 20 69 2b 31 3b 0a     first = i+1;.
7c20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7c30: 7d 0a 20 20 72 65 74 75 72 6e 20 22 61 70 70 6c  }.  return "appl
7c40: 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74  ication/octet-st
7c50: 72 65 61 6d 22 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ream";.}../*.** 
7c60: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  The following ta
7c70: 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 31 20 66  ble contains 1 f
7c80: 6f 72 20 61 6c 6c 20 63 68 61 72 61 63 74 65 72  or all character
7c90: 73 20 74 68 61 74 20 61 72 65 20 70 65 72 6d 69  s that are permi
7ca0: 74 74 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 70  tted in.** the p
7cb0: 61 72 74 20 6f 66 20 74 68 65 20 55 52 4c 20 62  art of the URL b
7cc0: 65 66 6f 72 65 20 74 68 65 20 71 75 65 72 79 20  efore the query 
7cd0: 70 61 72 61 6d 65 74 65 72 73 20 61 6e 64 20 66  parameters and f
7ce0: 72 61 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41  ragment..**.** A
7cf0: 6c 6c 6f 77 65 64 20 63 68 61 72 61 63 74 65 72  llowed character
7d00: 73 3a 20 20 30 2d 39 20 61 2d 7a 20 41 2d 5a 20  s:  0-9 a-z A-Z 
7d10: 2c 2d 2e 2f 3a 5f 7e 0a 2a 2a 0a 2a 2a 20 44 69  ,-./:_~.**.** Di
7d20: 73 61 6c 6c 6f 77 65 64 20 63 68 61 72 61 63 74  sallowed charact
7d30: 65 72 73 20 69 6e 63 6c 75 64 65 3a 20 20 21 22  ers include:  !"
7d40: 23 24 25 26 27 28 29 2a 2b 3b 3c 3d 3e 3f 5b 5c  #$%&'()*+;<=>?[\
7d50: 5d 5e 7b 7c 7d 0a 2a 2f 0a 73 74 61 74 69 63 20  ]^{|}.*/.static 
7d60: 63 6f 6e 73 74 20 63 68 61 72 20 61 6c 6c 6f 77  const char allow
7d70: 65 64 49 6e 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20  edInName[] = {. 
7d80: 20 20 20 20 20 2f 2a 20 20 78 30 20 20 78 31 20       /*  x0  x1 
7d90: 20 78 32 20 20 78 33 20 20 78 34 20 20 78 35 20   x2  x3  x4  x5 
7da0: 20 78 36 20 20 78 37 20 20 78 38 20 20 78 39 20   x6  x7  x8  x9 
7db0: 20 78 61 20 20 78 62 20 20 78 63 20 20 78 64 20   xa  xb  xc  xd 
7dc0: 20 78 65 20 20 78 66 20 2a 2f 0a 2f 2a 20 30 78   xe  xf */./* 0x
7dd0: 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c   */   0,  0,  0,
7de0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
7df0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
7e00: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
7e10: 20 20 30 2c 0a 2f 2a 20 31 78 20 2a 2f 20 20 20    0,./* 1x */   
7e20: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
7e30: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
7e40: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
7e50: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f  0,  0,  0,  0,./
7e60: 2a 20 32 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c  * 2x */   0,  0,
7e70: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
7e80: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
7e90: 20 20 30 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c    0,  0,  1,  1,
7ea0: 20 20 31 2c 20 20 31 2c 0a 2f 2a 20 33 78 20 2a    1,  1,./* 3x *
7eb0: 2f 20 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  /   1,  1,  1,  
7ec0: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
7ed0: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
7ee0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
7ef0: 30 2c 0a 2f 2a 20 34 78 20 2a 2f 20 20 20 30 2c  0,./* 4x */   0,
7f00: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
7f10: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
7f20: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
7f30: 20 20 31 2c 20 20 31 2c 20 20 31 2c 0a 2f 2a 20    1,  1,  1,./* 
7f40: 35 78 20 2a 2f 20 20 20 31 2c 20 20 31 2c 20 20  5x */   1,  1,  
7f50: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
7f60: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
7f70: 31 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  1,  0,  0,  0,  
7f80: 30 2c 20 20 31 2c 0a 2f 2a 20 36 78 20 2a 2f 20  0,  1,./* 6x */ 
7f90: 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    0,  1,  1,  1,
7fa0: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
7fb0: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
7fc0: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
7fd0: 0a 2f 2a 20 37 78 20 2a 2f 20 20 20 31 2c 20 20  ./* 7x */   1,  
7fe0: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
7ff0: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
8000: 31 2c 20 20 31 2c 20 20 30 2c 20 20 30 2c 20 20  1,  1,  0,  0,  
8010: 30 2c 20 20 31 2c 20 20 30 2c 0a 7d 3b 0a 0a 2f  0,  1,  0,.};../
8020: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8030: 65 20 70 72 6f 63 65 73 73 65 73 20 61 20 73 69  e processes a si
8040: 6e 67 6c 65 20 48 54 54 50 20 72 65 71 75 65 73  ngle HTTP reques
8050: 74 20 6f 6e 20 73 74 61 6e 64 61 72 64 20 69 6e  t on standard in
8060: 70 75 74 20 61 6e 64 0a 2a 2a 20 73 65 6e 64 73  put and.** sends
8070: 20 74 68 65 20 72 65 70 6c 79 20 74 6f 20 73 74   the reply to st
8080: 61 6e 64 61 72 64 20 6f 75 74 70 75 74 2e 20 20  andard output.  
8090: 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  If the argument 
80a0: 69 73 20 31 20 69 74 20 6d 65 61 6e 73 0a 2a 2a  is 1 it means.**
80b0: 20 74 68 61 74 20 77 65 20 61 72 65 20 73 68 6f   that we are sho
80c0: 75 6c 64 20 63 6c 6f 73 65 20 74 68 65 20 73 6f  uld close the so
80d0: 63 6b 65 74 20 77 69 74 68 6f 75 74 20 70 72 6f  cket without pro
80e0: 63 65 73 73 69 6e 67 20 61 64 64 69 74 69 6f 6e  cessing addition
80f0: 61 6c 0a 2a 2a 20 48 54 54 50 20 72 65 71 75 65  al.** HTTP reque
8100: 73 74 73 20 61 66 74 65 72 20 74 68 65 20 63 75  sts after the cu
8110: 72 72 65 6e 74 20 72 65 71 75 65 73 74 20 66 69  rrent request fi
8120: 6e 69 73 68 65 73 2e 20 20 30 20 6d 65 61 6e 73  nishes.  0 means
8130: 20 77 65 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 77   we are.** allow
8140: 65 64 20 74 6f 20 6b 65 65 70 20 74 68 65 20 63  ed to keep the c
8150: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 61  onnection open a
8160: 6e 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61 64  nd to process ad
8170: 64 69 74 69 6f 6e 61 6c 20 72 65 71 75 65 73 74  ditional request
8180: 73 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  s..** This routi
8190: 6e 65 20 6d 61 79 20 63 68 6f 6f 73 65 20 74 6f  ne may choose to
81a0: 20 63 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65   close the conne
81b0: 63 74 69 6f 6e 20 65 76 65 6e 20 69 66 20 74 68  ction even if th
81c0: 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73  e argument.** is
81d0: 20 30 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68   0..** .** If th
81e0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 68 6f  e connection sho
81f0: 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 2c 20 74  uld be closed, t
8200: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c  his routine call
8210: 73 20 65 78 69 74 28 29 20 61 6e 64 0a 2a 2a 20  s exit() and.** 
8220: 74 68 75 73 20 6e 65 76 65 72 20 72 65 74 75 72  thus never retur
8230: 6e 73 2e 20 20 49 66 20 74 68 69 73 20 72 6f 75  ns.  If this rou
8240: 74 69 6e 65 20 64 6f 65 73 20 72 65 74 75 72 6e  tine does return
8250: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61   it means that a
8260: 6e 6f 74 68 65 72 0a 2a 2a 20 48 54 54 50 20 72  nother.** HTTP r
8270: 65 71 75 65 73 74 20 6d 61 79 20 61 70 70 65 61  equest may appea
8280: 72 20 6f 6e 20 74 68 65 20 77 69 72 65 2e 0a 2a  r on the wire..*
8290: 2f 0a 76 6f 69 64 20 50 72 6f 63 65 73 73 4f 6e  /.void ProcessOn
82a0: 65 52 65 71 75 65 73 74 28 69 6e 74 20 66 6f 72  eRequest(int for
82b0: 63 65 43 6c 6f 73 65 29 7b 0a 20 20 69 6e 74 20  ceClose){.  int 
82c0: 69 2c 20 63 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  i, c;.  char *z;
82d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82e0: 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 70 61 72    /* Used to par
82f0: 73 65 20 75 70 20 61 20 73 74 72 69 6e 67 20 2a  se up a string *
8300: 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  /.  struct stat 
8310: 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 2f 2a  statbuf;      /*
8320: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
8330: 75 74 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  ut the file to b
8340: 65 20 72 65 74 72 69 65 76 65 64 20 2a 2f 0a 20  e retrieved */. 
8350: 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20   FILE *in;      
8360: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
8370: 72 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 43  r reading from C
8380: 47 49 20 73 63 72 69 70 74 73 20 2a 2f 0a 20 20  GI scripts */.  
8390: 63 68 61 72 20 7a 4c 69 6e 65 5b 31 30 30 30 5d  char zLine[1000]
83a0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62  ;         /* A b
83b0: 75 66 66 65 72 20 66 6f 72 20 69 6e 70 75 74 20  uffer for input 
83c0: 6c 69 6e 65 73 20 6f 72 20 66 6f 72 6d 69 6e 67  lines or forming
83d0: 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20   names */..  /* 
83e0: 43 68 61 6e 67 65 20 64 69 72 65 63 74 6f 72 69  Change directori
83f0: 65 73 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 6f  es to the root o
8400: 66 20 74 68 65 20 48 54 54 50 20 66 69 6c 65 73  f the HTTP files
8410: 79 73 74 65 6d 0a 20 20 2a 2f 0a 20 20 69 66 28  ystem.  */.  if(
8420: 20 63 68 64 69 72 28 7a 52 6f 6f 74 5b 30 5d 20   chdir(zRoot[0] 
8430: 3f 20 7a 52 6f 6f 74 20 3a 20 22 2f 22 29 21 3d  ? zRoot : "/")!=
8440: 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42  0 ){.    char zB
8450: 75 66 5b 31 30 30 30 5d 3b 0a 20 20 20 20 4d 61  uf[1000];.    Ma
8460: 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45  lfunction(__LINE
8470: 5f 5f 2c 20 22 63 61 6e 6e 6f 74 20 63 68 64 69  __, "cannot chdi
8480: 72 20 74 6f 20 5b 25 73 5d 20 66 72 6f 6d 20 5b  r to [%s] from [
8490: 25 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 7a  %s]",.         z
84a0: 52 6f 6f 74 2c 20 67 65 74 63 77 64 28 7a 42 75  Root, getcwd(zBu
84b0: 66 2c 39 39 39 29 29 3b 0a 20 20 7d 0a 20 20 6e  f,999));.  }.  n
84c0: 52 65 71 75 65 73 74 2b 2b 3b 0a 0a 20 20 2f 2a  Request++;..  /*
84d0: 0a 20 20 2a 2a 20 57 65 20 6d 75 73 74 20 72 65  .  ** We must re
84e0: 63 65 69 76 65 20 61 20 63 6f 6d 70 6c 65 74 65  ceive a complete
84f0: 20 68 65 61 64 65 72 20 77 69 74 68 69 6e 20 31   header within 1
8500: 35 20 73 65 63 6f 6e 64 73 0a 20 20 2a 2f 0a 20  5 seconds.  */. 
8510: 20 73 69 67 6e 61 6c 28 53 49 47 41 4c 52 4d 2c   signal(SIGALRM,
8520: 20 54 69 6d 65 6f 75 74 29 3b 0a 20 20 69 66 28   Timeout);.  if(
8530: 20 75 73 65 54 69 6d 65 6f 75 74 20 29 20 61 6c   useTimeout ) al
8540: 61 72 6d 28 31 35 29 3b 0a 0a 20 20 2f 2a 20 47  arm(15);..  /* G
8550: 65 74 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e  et the first lin
8560: 65 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74  e of the request
8570: 20 61 6e 64 20 70 61 72 73 65 20 6f 75 74 20 74   and parse out t
8580: 68 65 0a 20 20 2a 2a 20 6d 65 74 68 6f 64 2c 20  he.  ** method, 
8590: 74 68 65 20 73 63 72 69 70 74 20 61 6e 64 20 74  the script and t
85a0: 68 65 20 70 72 6f 74 6f 63 6f 6c 2e 0a 20 20 2a  he protocol..  *
85b0: 2f 0a 20 20 69 66 28 20 66 67 65 74 73 28 7a 4c  /.  if( fgets(zL
85c0: 69 6e 65 2c 73 69 7a 65 6f 66 28 7a 4c 69 6e 65  ine,sizeof(zLine
85d0: 29 2c 73 74 64 69 6e 29 3d 3d 30 20 29 7b 0a 20  ),stdin)==0 ){. 
85e0: 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20 7d 0a     exit(0);.  }.
85f0: 20 20 6f 6d 69 74 4c 6f 67 20 3d 20 30 3b 0a 20    omitLog = 0;. 
8600: 20 6e 49 6e 20 2b 3d 20 73 74 72 6c 65 6e 28 7a   nIn += strlen(z
8610: 4c 69 6e 65 29 3b 0a 20 20 7a 4d 65 74 68 6f 64  Line);.  zMethod
8620: 20 3d 20 53 74 72 44 75 70 28 47 65 74 46 69 72   = StrDup(GetFir
8630: 73 74 45 6c 65 6d 65 6e 74 28 7a 4c 69 6e 65 2c  stElement(zLine,
8640: 26 7a 29 29 3b 0a 20 20 7a 52 65 61 6c 53 63 72  &z));.  zRealScr
8650: 69 70 74 20 3d 20 7a 53 63 72 69 70 74 20 3d 20  ipt = zScript = 
8660: 53 74 72 44 75 70 28 47 65 74 46 69 72 73 74 45  StrDup(GetFirstE
8670: 6c 65 6d 65 6e 74 28 7a 2c 26 7a 29 29 3b 0a 20  lement(z,&z));. 
8680: 20 7a 50 72 6f 74 6f 63 6f 6c 20 3d 20 53 74 72   zProtocol = Str
8690: 44 75 70 28 47 65 74 46 69 72 73 74 45 6c 65 6d  Dup(GetFirstElem
86a0: 65 6e 74 28 7a 2c 26 7a 29 29 3b 0a 20 20 69 66  ent(z,&z));.  if
86b0: 28 20 7a 50 72 6f 74 6f 63 6f 6c 3d 3d 30 20 7c  ( zProtocol==0 |
86c0: 7c 20 73 74 72 6e 63 6d 70 28 7a 50 72 6f 74 6f  | strncmp(zProto
86d0: 63 6f 6c 2c 22 48 54 54 50 2f 22 2c 35 29 21 3d  col,"HTTP/",5)!=
86e0: 30 20 7c 7c 20 73 74 72 6c 65 6e 28 7a 50 72 6f  0 || strlen(zPro
86f0: 74 6f 63 6f 6c 29 21 3d 38 20 29 7b 0a 20 20 20  tocol)!=8 ){.   
8700: 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22   StartResponse("
8710: 34 30 30 20 42 61 64 20 52 65 71 75 65 73 74 22  400 Bad Request"
8720: 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70  );.    nOut += p
8730: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22 43 6f  rintf(.      "Co
8740: 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74  ntent-type: text
8750: 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20 20  /plain\r\n".    
8760: 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 20 20 22    "\r\n".      "
8770: 54 68 69 73 20 73 65 72 76 65 72 20 64 6f 65 73  This server does
8780: 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20   not understand 
8790: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 72  the requested pr
87a0: 6f 74 6f 63 6f 6c 5c 6e 22 0a 20 20 20 20 29 3b  otocol\n".    );
87b0: 0a 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72  .    MakeLogEntr
87c0: 79 28 30 29 3b 0a 20 20 20 20 65 78 69 74 28 30  y(0);.    exit(0
87d0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 53 63  );.  }.  if( zSc
87e0: 72 69 70 74 5b 30 5d 3d 3d 30 20 29 20 4e 6f 74  ript[0]==0 ) Not
87f0: 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b  Found(__LINE__);
8800: 0a 20 20 69 66 28 20 66 6f 72 63 65 43 6c 6f 73  .  if( forceClos
8810: 65 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 43 6f  e ){.    closeCo
8820: 6e 6e 65 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20  nnection = 1;.  
8830: 7d 65 6c 73 65 20 69 66 28 20 7a 50 72 6f 74 6f  }else if( zProto
8840: 63 6f 6c 5b 35 5d 3c 27 31 27 20 7c 7c 20 7a 50  col[5]<'1' || zP
8850: 72 6f 74 6f 63 6f 6c 5b 37 5d 3c 27 31 27 20 29  rotocol[7]<'1' )
8860: 7b 0a 20 20 20 20 63 6c 6f 73 65 43 6f 6e 6e 65  {.    closeConne
8870: 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a  ction = 1;.  }..
8880: 20 20 2f 2a 20 54 68 69 73 20 76 65 72 79 20 73    /* This very s
8890: 69 6d 70 6c 65 20 73 65 72 76 65 72 20 6f 6e 6c  imple server onl
88a0: 79 20 75 6e 64 65 72 73 74 61 6e 64 73 20 74 68  y understands th
88b0: 65 20 47 45 54 2c 20 50 4f 53 54 0a 20 20 2a 2a  e GET, POST.  **
88c0: 20 61 6e 64 20 48 45 41 44 20 6d 65 74 68 6f 64   and HEAD method
88d0: 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 72  s.  */.  if( str
88e0: 63 6d 70 28 7a 4d 65 74 68 6f 64 2c 22 47 45 54  cmp(zMethod,"GET
88f0: 22 29 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28  ")!=0 && strcmp(
8900: 7a 4d 65 74 68 6f 64 2c 22 50 4f 53 54 22 29 21  zMethod,"POST")!
8910: 3d 30 0a 20 20 20 20 20 20 20 26 26 20 73 74 72  =0.       && str
8920: 63 6d 70 28 7a 4d 65 74 68 6f 64 2c 22 48 45 41  cmp(zMethod,"HEA
8930: 44 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 53 74  D")!=0 ){.    St
8940: 61 72 74 52 65 73 70 6f 6e 73 65 28 22 35 30 31  artResponse("501
8950: 20 4e 6f 74 20 49 6d 70 6c 65 6d 65 6e 74 65 64   Not Implemented
8960: 22 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20  ");.    nOut += 
8970: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22 43  printf(.      "C
8980: 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78  ontent-type: tex
8990: 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20  t/plain\r\n".   
89a0: 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 20 20     "\r\n".      
89b0: 22 54 68 65 20 25 73 20 6d 65 74 68 6f 64 20 69  "The %s method i
89c0: 73 20 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65  s not implemente
89d0: 64 20 6f 6e 20 74 68 69 73 20 73 65 72 76 65 72  d on this server
89e0: 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 7a 4d 65 74  .\n",.      zMet
89f0: 68 6f 64 29 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f  hod);.    MakeLo
8a00: 67 45 6e 74 72 79 28 30 29 3b 0a 20 20 20 20 65  gEntry(0);.    e
8a10: 78 69 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  xit(0);.  }..  /
8a20: 2a 20 47 65 74 20 61 6c 6c 20 74 68 65 20 6f 70  * Get all the op
8a30: 74 69 6f 6e 61 6c 20 66 69 65 6c 64 73 20 74 68  tional fields th
8a40: 61 74 20 66 6f 6c 6c 6f 77 20 74 68 65 20 66 69  at follow the fi
8a50: 72 73 74 20 6c 69 6e 65 2e 0a 20 20 2a 2f 0a 20  rst line..  */. 
8a60: 20 7a 43 6f 6f 6b 69 65 20 3d 20 30 3b 0a 20 20   zCookie = 0;.  
8a70: 7a 41 75 74 68 54 79 70 65 20 3d 20 30 3b 0a 20  zAuthType = 0;. 
8a80: 20 7a 52 65 6d 6f 74 65 55 73 65 72 20 3d 20 30   zRemoteUser = 0
8a90: 3b 0a 20 20 7a 52 65 66 65 72 65 72 20 3d 20 30  ;.  zReferer = 0
8aa0: 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74 73  ;.  while( fgets
8ab0: 28 7a 4c 69 6e 65 2c 73 69 7a 65 6f 66 28 7a 4c  (zLine,sizeof(zL
8ac0: 69 6e 65 29 2c 73 74 64 69 6e 29 20 29 7b 0a 20  ine),stdin) ){. 
8ad0: 20 20 20 63 68 61 72 20 2a 7a 46 69 65 6c 64 4e     char *zFieldN
8ae0: 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ame;.    char *z
8af0: 56 61 6c 3b 0a 0a 20 20 20 20 6e 49 6e 20 2b 3d  Val;..    nIn +=
8b00: 20 73 74 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a   strlen(zLine);.
8b10: 20 20 20 20 7a 46 69 65 6c 64 4e 61 6d 65 20 3d      zFieldName =
8b20: 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74   GetFirstElement
8b30: 28 7a 4c 69 6e 65 2c 26 7a 56 61 6c 29 3b 0a 20  (zLine,&zVal);. 
8b40: 20 20 20 69 66 28 20 7a 46 69 65 6c 64 4e 61 6d     if( zFieldNam
8b50: 65 3d 3d 30 20 7c 7c 20 2a 7a 46 69 65 6c 64 4e  e==0 || *zFieldN
8b60: 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ame==0 ) break;.
8b70: 20 20 20 20 52 65 6d 6f 76 65 4e 65 77 6c 69 6e      RemoveNewlin
8b80: 65 28 7a 56 61 6c 29 3b 0a 20 20 20 20 69 66 28  e(zVal);.    if(
8b90: 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65   strcasecmp(zFie
8ba0: 6c 64 4e 61 6d 65 2c 22 55 73 65 72 2d 41 67 65  ldName,"User-Age
8bb0: 6e 74 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nt:")==0 ){.    
8bc0: 20 20 7a 41 67 65 6e 74 20 3d 20 53 74 72 44 75    zAgent = StrDu
8bd0: 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c  p(zVal);.    }el
8be0: 73 65 20 69 66 28 20 73 74 72 63 61 73 65 63 6d  se if( strcasecm
8bf0: 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 41 63  p(zFieldName,"Ac
8c00: 63 65 70 74 3a 22 29 3d 3d 30 20 29 7b 0a 20 20  cept:")==0 ){.  
8c10: 20 20 20 20 7a 41 63 63 65 70 74 20 3d 20 53 74      zAccept = St
8c20: 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20  rDup(zVal);.    
8c30: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 61 73  }else if( strcas
8c40: 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c  ecmp(zFieldName,
8c50: 22 43 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74 68 3a  "Content-length:
8c60: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  ")==0 ){.      z
8c70: 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 20 3d 20  ContentLength = 
8c80: 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20  StrDup(zVal);.  
8c90: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
8ca0: 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d  asecmp(zFieldNam
8cb0: 65 2c 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a  e,"Content-type:
8cc0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  ")==0 ){.      z
8cd0: 43 6f 6e 74 65 6e 74 54 79 70 65 20 3d 20 53 74  ContentType = St
8ce0: 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20  rDup(zVal);.    
8cf0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 61 73  }else if( strcas
8d00: 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c  ecmp(zFieldName,
8d10: 22 52 65 66 65 72 65 72 3a 22 29 3d 3d 30 20 29  "Referer:")==0 )
8d20: 7b 0a 20 20 20 20 20 20 7a 52 65 66 65 72 65 72  {.      zReferer
8d30: 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b   = StrDup(zVal);
8d40: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
8d50: 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64  trcasecmp(zField
8d60: 4e 61 6d 65 2c 22 43 6f 6f 6b 69 65 3a 22 29 3d  Name,"Cookie:")=
8d70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6f  =0 ){.      zCoo
8d80: 6b 69 65 20 3d 20 53 74 72 41 70 70 65 6e 64 28  kie = StrAppend(
8d90: 7a 43 6f 6f 6b 69 65 2c 22 3b 20 22 2c 7a 56 61  zCookie,"; ",zVa
8da0: 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  l);.    }else if
8db0: 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69  ( strcasecmp(zFi
8dc0: 65 6c 64 4e 61 6d 65 2c 22 43 6f 6e 6e 65 63 74  eldName,"Connect
8dd0: 69 6f 6e 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ion:")==0 ){.   
8de0: 20 20 20 69 66 28 20 73 74 72 63 61 73 65 63 6d     if( strcasecm
8df0: 70 28 7a 56 61 6c 2c 22 63 6c 6f 73 65 22 29 3d  p(zVal,"close")=
8e00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c  =0 ){.        cl
8e10: 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20  oseConnection = 
8e20: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
8e30: 66 28 20 21 66 6f 72 63 65 43 6c 6f 73 65 20 26  f( !forceClose &
8e40: 26 20 73 74 72 63 61 73 65 63 6d 70 28 7a 56 61  & strcasecmp(zVa
8e50: 6c 2c 20 22 6b 65 65 70 2d 61 6c 69 76 65 22 29  l, "keep-alive")
8e60: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
8e70: 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d  loseConnection =
8e80: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
8e90: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 61 73  }else if( strcas
8ea0: 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c  ecmp(zFieldName,
8eb0: 22 48 6f 73 74 3a 22 29 3d 3d 30 20 29 7b 0a 20  "Host:")==0 ){. 
8ec0: 20 20 20 20 20 69 6e 74 20 69 6e 53 71 75 61 72       int inSquar
8ed0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61  e = 0;.      cha
8ee0: 72 20 63 3b 0a 20 20 20 20 20 20 7a 48 74 74 70  r c;.      zHttp
8ef0: 48 6f 73 74 20 3d 20 53 74 72 44 75 70 28 7a 56  Host = StrDup(zV
8f00: 61 6c 29 3b 0a 20 20 20 20 20 20 7a 53 65 72 76  al);.      zServ
8f10: 65 72 50 6f 72 74 20 3d 20 7a 53 65 72 76 65 72  erPort = zServer
8f20: 4e 61 6d 65 20 3d 20 53 74 72 44 75 70 28 7a 48  Name = StrDup(zH
8f30: 74 74 70 48 6f 73 74 29 3b 0a 20 20 20 20 20 20  ttpHost);.      
8f40: 77 68 69 6c 65 28 20 7a 53 65 72 76 65 72 50 6f  while( zServerPo
8f50: 72 74 20 26 26 20 28 63 20 3d 20 2a 7a 53 65 72  rt && (c = *zSer
8f60: 76 65 72 50 6f 72 74 29 21 3d 30 0a 20 20 20 20  verPort)!=0.    
8f70: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 63 21            && (c!
8f80: 3d 27 3a 27 20 7c 7c 20 69 6e 53 71 75 61 72 65  =':' || inSquare
8f90: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
8fa0: 20 63 3d 3d 27 5b 27 20 29 20 69 6e 53 71 75 61   c=='[' ) inSqua
8fb0: 72 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  re = 1;.        
8fc0: 69 66 28 20 63 3d 3d 27 5d 27 20 29 20 69 6e 53  if( c==']' ) inS
8fd0: 71 75 61 72 65 20 3d 20 30 3b 0a 20 20 20 20 20  quare = 0;.     
8fe0: 20 20 20 7a 53 65 72 76 65 72 50 6f 72 74 2b 2b     zServerPort++
8ff0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9000: 69 66 28 20 7a 53 65 72 76 65 72 50 6f 72 74 20  if( zServerPort 
9010: 26 26 20 2a 7a 53 65 72 76 65 72 50 6f 72 74 20  && *zServerPort 
9020: 29 7b 0a 20 20 20 20 20 20 20 20 2a 7a 53 65 72  ){.        *zSer
9030: 76 65 72 50 6f 72 74 20 3d 20 30 3b 0a 20 20 20  verPort = 0;.   
9040: 20 20 20 20 20 7a 53 65 72 76 65 72 50 6f 72 74       zServerPort
9050: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
9060: 20 20 69 66 28 20 7a 52 65 61 6c 50 6f 72 74 20    if( zRealPort 
9070: 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 65 72 76  ){.        zServ
9080: 65 72 50 6f 72 74 20 3d 20 53 74 72 44 75 70 28  erPort = StrDup(
9090: 7a 52 65 61 6c 50 6f 72 74 29 3b 0a 20 20 20 20  zRealPort);.    
90a0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
90b0: 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69  ( strcasecmp(zFi
90c0: 65 6c 64 4e 61 6d 65 2c 22 41 75 74 68 6f 72 69  eldName,"Authori
90d0: 7a 61 74 69 6f 6e 3a 22 29 3d 3d 30 20 29 7b 0a  zation:")==0 ){.
90e0: 20 20 20 20 20 20 7a 41 75 74 68 54 79 70 65 20        zAuthType 
90f0: 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e  = GetFirstElemen
9100: 74 28 53 74 72 44 75 70 28 7a 56 61 6c 29 2c 20  t(StrDup(zVal), 
9110: 26 7a 41 75 74 68 41 72 67 29 3b 0a 20 20 20 20  &zAuthArg);.    
9120: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 69 73 61  }.  }..  /* Disa
9130: 6c 6c 6f 77 20 72 65 66 65 72 72 69 6e 67 20 66  llow referring f
9140: 72 6f 6d 20 63 65 72 74 61 69 6e 20 63 6c 69 65  rom certain clie
9150: 6e 74 73 20 2a 2f 0a 20 20 69 66 28 20 7a 41 67  nts */.  if( zAg
9160: 65 6e 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73  ent ){.    if( s
9170: 74 72 73 74 72 28 7a 41 67 65 6e 74 2c 20 22 57  trstr(zAgent, "W
9180: 69 6e 64 6f 77 73 5f 39 22 29 21 3d 30 0a 20 20  indows_9")!=0.  
9190: 20 20 20 7c 7c 20 73 74 72 73 74 72 28 7a 41 67     || strstr(zAg
91a0: 65 6e 74 2c 20 22 44 6f 77 6e 6c 6f 61 64 5f 4d  ent, "Download_M
91b0: 61 73 74 65 72 22 29 21 3d 30 0a 20 20 20 20 20  aster")!=0.     
91c0: 7c 7c 20 73 74 72 73 74 72 28 7a 41 67 65 6e 74  || strstr(zAgent
91d0: 2c 20 22 5f 45 7a 6f 6f 6d 73 2f 22 29 21 3d 30  , "_Ezooms/")!=0
91e0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 46 6f  .    ){.      Fo
91f0: 72 62 69 64 64 65 6e 28 29 3b 0a 20 20 20 20 7d  rbidden();.    }
9200: 0a 20 20 7d 0a 23 69 66 20 30 0a 20 20 69 66 28  .  }.#if 0.  if(
9210: 20 7a 52 65 66 65 72 65 72 20 29 7b 0a 20 20 20   zReferer ){.   
9220: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
9230: 61 72 20 2a 61 7a 44 69 73 61 6c 6c 6f 77 5b 5d  ar *azDisallow[]
9240: 20 3d 20 7b 0a 20 20 20 20 20 20 22 73 6b 69 64   = {.      "skid
9250: 72 6f 77 63 72 61 63 6b 2e 63 6f 6d 22 2c 0a 20  rowcrack.com",. 
9260: 20 20 20 20 20 22 68 6f 73 68 69 79 75 75 67 69       "hoshiyuugi
9270: 2e 74 69 73 74 6f 72 79 2e 63 6f 6d 22 2c 0a 20  .tistory.com",. 
9280: 20 20 20 20 20 22 73 6b 69 64 72 6f 77 67 61 6d       "skidrowgam
9290: 65 73 2e 6e 65 74 22 2c 0a 20 20 20 20 7d 3b 0a  es.net",.    };.
92a0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
92b0: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
92c0: 28 61 7a 44 69 73 61 6c 6c 6f 77 29 2f 73 69 7a  (azDisallow)/siz
92d0: 65 6f 66 28 61 7a 44 69 73 61 6c 6c 6f 77 5b 30  eof(azDisallow[0
92e0: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
92f0: 69 66 28 20 73 74 72 73 74 72 28 7a 52 65 66 65  if( strstr(zRefe
9300: 72 65 72 2c 20 61 7a 44 69 73 61 6c 6c 6f 77 5b  rer, azDisallow[
9310: 69 5d 29 21 3d 30 20 29 20 4e 6f 74 46 6f 75 6e  i])!=0 ) NotFoun
9320: 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  d(__LINE__);.   
9330: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
9340: 20 2f 2a 20 4d 61 6b 65 20 61 6e 20 65 78 74 72   /* Make an extr
9350: 61 20 65 66 66 6f 72 74 20 74 6f 20 67 65 74 20  a effort to get 
9360: 61 20 76 61 6c 69 64 20 73 65 72 76 65 72 20 6e  a valid server n
9370: 61 6d 65 20 61 6e 64 20 70 6f 72 74 20 6e 75 6d  ame and port num
9380: 62 65 72 2e 0a 20 20 2a 2a 20 4f 6e 6c 79 20 4e  ber..  ** Only N
9390: 65 74 73 63 61 70 65 20 70 72 6f 76 69 64 65 73  etscape provides
93a0: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
93b0: 6e 2e 20 20 49 66 20 74 68 65 20 62 72 6f 77 73  n.  If the brows
93c0: 65 72 20 69 73 0a 20 20 2a 2a 20 49 6e 74 65 72  er is.  ** Inter
93d0: 6e 65 74 20 45 78 70 6c 6f 72 65 72 2c 20 74 68  net Explorer, th
93e0: 65 6e 20 77 65 20 68 61 76 65 20 74 6f 20 66 69  en we have to fi
93f0: 6e 64 20 6f 75 74 20 74 68 65 20 69 6e 66 6f 72  nd out the infor
9400: 6d 61 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20  mation for.  ** 
9410: 6f 75 72 73 65 6c 76 65 73 2e 0a 20 20 2a 2f 0a  ourselves..  */.
9420: 20 20 69 66 28 20 7a 53 65 72 76 65 72 4e 61 6d    if( zServerNam
9430: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53 65 72  e==0 ){.    zSer
9440: 76 65 72 4e 61 6d 65 20 3d 20 53 61 66 65 4d 61  verName = SafeMa
9450: 6c 6c 6f 63 28 20 31 30 30 20 29 3b 0a 20 20 20  lloc( 100 );.   
9460: 20 67 65 74 68 6f 73 74 6e 61 6d 65 28 7a 53 65   gethostname(zSe
9470: 72 76 65 72 4e 61 6d 65 2c 31 30 30 29 3b 0a 20  rverName,100);. 
9480: 20 7d 0a 20 20 69 66 28 20 7a 53 65 72 76 65 72   }.  if( zServer
9490: 50 6f 72 74 3d 3d 30 20 7c 7c 20 2a 7a 53 65 72  Port==0 || *zSer
94a0: 76 65 72 50 6f 72 74 3d 3d 30 20 29 7b 0a 20 20  verPort==0 ){.  
94b0: 20 20 7a 53 65 72 76 65 72 50 6f 72 74 20 3d 20    zServerPort = 
94c0: 44 45 46 41 55 4c 54 5f 50 4f 52 54 3b 0a 20 20  DEFAULT_PORT;.  
94d0: 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  }..  /* Remove t
94e0: 68 65 20 71 75 65 72 79 20 73 74 72 69 6e 67 20  he query string 
94f0: 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20  from the end of 
9500: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 66 69  the requested fi
9510: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 7a  le..  */.  for(z
9520: 3d 7a 53 63 72 69 70 74 3b 20 2a 7a 20 26 26 20  =zScript; *z && 
9530: 2a 7a 21 3d 27 3f 27 3b 20 7a 2b 2b 29 7b 7d 0a  *z!='?'; z++){}.
9540: 20 20 69 66 28 20 2a 7a 3d 3d 27 3f 27 20 29 7b    if( *z=='?' ){
9550: 0a 20 20 20 20 7a 51 75 65 72 79 53 75 66 66 69  .    zQuerySuffi
9560: 78 20 3d 20 53 74 72 44 75 70 28 7a 29 3b 0a 20  x = StrDup(z);. 
9570: 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 7d 65 6c     *z = 0;.  }el
9580: 73 65 7b 0a 20 20 20 20 7a 51 75 65 72 79 53 75  se{.    zQuerySu
9590: 66 66 69 78 20 3d 20 22 22 3b 0a 20 20 7d 0a 20  ffix = "";.  }. 
95a0: 20 7a 51 75 65 72 79 53 74 72 69 6e 67 20 3d 20   zQueryString = 
95b0: 2a 7a 51 75 65 72 79 53 75 66 66 69 78 20 3f 20  *zQuerySuffix ? 
95c0: 26 7a 51 75 65 72 79 53 75 66 66 69 78 5b 31 5d  &zQuerySuffix[1]
95d0: 20 3a 20 7a 51 75 65 72 79 53 75 66 66 69 78 3b   : zQuerySuffix;
95e0: 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20  ..  /* Create a 
95f0: 66 69 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  file to hold the
9600: 20 50 4f 53 54 20 71 75 65 72 79 20 64 61 74 61   POST query data
9610: 2c 20 69 66 20 61 6e 79 2e 20 20 57 65 20 68 61  , if any.  We ha
9620: 76 65 20 74 6f 0a 20 20 2a 2a 20 64 6f 20 69 74  ve to.  ** do it
9630: 20 74 68 69 73 20 77 61 79 2e 20 20 57 65 20 63   this way.  We c
9640: 61 6e 27 74 20 6a 75 73 74 20 70 61 73 73 20 74  an't just pass t
9650: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
9660: 6f 72 20 64 6f 77 6e 20 74 6f 0a 20 20 2a 2a 20  or down to.  ** 
9670: 74 68 65 20 63 68 69 6c 64 20 70 72 6f 63 65 73  the child proces
9680: 73 20 62 65 63 61 75 73 65 20 74 68 65 20 66 67  s because the fg
9690: 65 74 73 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  ets() function m
96a0: 61 79 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  ay have already.
96b0: 20 20 2a 2a 20 72 65 61 64 20 70 61 72 74 20 6f    ** read part o
96c0: 66 20 74 68 65 20 50 4f 53 54 20 64 61 74 61 20  f the POST data 
96d0: 69 6e 74 6f 20 69 74 73 20 69 6e 74 65 72 6e 61  into its interna
96e0: 6c 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20  l buffer..  */. 
96f0: 20 69 66 28 20 7a 4d 65 74 68 6f 64 5b 30 5d 3d   if( zMethod[0]=
9700: 3d 27 50 27 20 26 26 20 7a 43 6f 6e 74 65 6e 74  ='P' && zContent
9710: 4c 65 6e 67 74 68 21 3d 30 20 29 7b 0a 20 20 20  Length!=0 ){.   
9720: 20 69 6e 74 20 6c 65 6e 20 3d 20 61 74 6f 69 28   int len = atoi(
9730: 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 29 3b  zContentLength);
9740: 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 3b 0a  .    FILE *out;.
9750: 20 20 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a      char *zBuf;.
9760: 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20      int n;..    
9770: 69 66 28 20 6c 65 6e 3e 4d 41 58 5f 43 4f 4e 54  if( len>MAX_CONT
9780: 45 4e 54 5f 4c 45 4e 47 54 48 20 29 7b 0a 20 20  ENT_LENGTH ){.  
9790: 20 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73      StartRespons
97a0: 65 28 22 35 30 30 20 52 65 71 75 65 73 74 20 74  e("500 Request t
97b0: 6f 6f 20 6c 61 72 67 65 22 29 3b 0a 20 20 20 20  oo large");.    
97c0: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
97d0: 28 0a 20 20 20 20 20 20 20 20 22 43 6f 6e 74 65  (.        "Conte
97e0: 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 70 6c  nt-type: text/pl
97f0: 61 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 20 20 20  ain\r\n".       
9800: 20 22 5c 72 5c 6e 22 0a 20 20 20 20 20 20 20 20   "\r\n".        
9810: 22 54 6f 6f 20 6d 75 63 68 20 50 4f 53 54 20 64  "Too much POST d
9820: 61 74 61 5c 6e 22 0a 20 20 20 20 20 20 29 3b 0a  ata\n".      );.
9830: 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74        MakeLogEnt
9840: 72 79 28 30 29 3b 0a 20 20 20 20 20 20 65 78 69  ry(0);.      exi
9850: 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t(0);.    }.    
9860: 73 70 72 69 6e 74 66 28 7a 54 6d 70 4e 61 6d 42  sprintf(zTmpNamB
9870: 75 66 2c 20 22 2f 74 6d 70 2f 2d 70 6f 73 74 2d  uf, "/tmp/-post-
9880: 64 61 74 61 2d 58 58 58 58 58 58 22 29 3b 0a 20  data-XXXXXX");. 
9890: 20 20 20 7a 54 6d 70 4e 61 6d 20 3d 20 7a 54 6d     zTmpNam = zTm
98a0: 70 4e 61 6d 42 75 66 3b 0a 20 20 20 20 6d 6b 73  pNamBuf;.    mks
98b0: 74 65 6d 70 28 7a 54 6d 70 4e 61 6d 29 3b 0a 20  temp(zTmpNam);. 
98c0: 20 20 20 6f 75 74 20 3d 20 66 6f 70 65 6e 28 7a     out = fopen(z
98d0: 54 6d 70 4e 61 6d 2c 22 77 22 29 3b 0a 20 20 20  TmpNam,"w");.   
98e0: 20 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20   if( out==0 ){. 
98f0: 20 20 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e       StartRespon
9900: 73 65 28 22 35 30 30 20 43 61 6e 6e 6f 74 20 63  se("500 Cannot c
9910: 72 65 61 74 65 20 2f 74 6d 70 20 66 69 6c 65 22  reate /tmp file"
9920: 29 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d  );.      nOut +=
9930: 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20   printf(.       
9940: 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20   "Content-type: 
9950: 74 65 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a  text/plain\r\n".
9960: 20 20 20 20 20 20 20 20 22 5c 72 5c 6e 22 0a 20          "\r\n". 
9970: 20 20 20 20 20 20 20 22 43 6f 75 6c 64 20 6e 6f         "Could no
9980: 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20 66 6f  t open \"%s\" fo
9990: 72 20 77 72 69 74 69 6e 67 5c 6e 22 2c 20 7a 54  r writing\n", zT
99a0: 6d 70 4e 61 6d 0a 20 20 20 20 20 20 29 3b 0a 20  mpNam.      );. 
99b0: 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72       MakeLogEntr
99c0: 79 28 30 29 3b 0a 20 20 20 20 20 20 65 78 69 74  y(0);.      exit
99d0: 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  (0);.    }.    z
99e0: 42 75 66 20 3d 20 53 61 66 65 4d 61 6c 6c 6f 63  Buf = SafeMalloc
99f0: 28 20 6c 65 6e 20 29 3b 0a 20 20 20 20 69 66 28  ( len );.    if(
9a00: 20 75 73 65 54 69 6d 65 6f 75 74 20 29 20 61 6c   useTimeout ) al
9a10: 61 72 6d 28 31 35 20 2b 20 6c 65 6e 2f 32 30 30  arm(15 + len/200
9a20: 30 29 3b 0a 20 20 20 20 6e 20 3d 20 66 72 65 61  0);.    n = frea
9a30: 64 28 7a 42 75 66 2c 31 2c 6c 65 6e 2c 73 74 64  d(zBuf,1,len,std
9a40: 69 6e 29 3b 0a 20 20 20 20 6e 49 6e 20 2b 3d 20  in);.    nIn += 
9a50: 6e 3b 0a 20 20 20 20 66 77 72 69 74 65 28 7a 42  n;.    fwrite(zB
9a60: 75 66 2c 31 2c 6e 2c 6f 75 74 29 3b 0a 20 20 20  uf,1,n,out);.   
9a70: 20 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20   free(zBuf);.   
9a80: 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20   fclose(out);.  
9a90: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
9aa0: 65 20 74 68 65 20 72 75 6e 6e 69 6e 67 20 74 69  e the running ti
9ab0: 6d 65 20 69 73 20 6e 6f 74 20 74 6f 6f 20 67 72  me is not too gr
9ac0: 65 61 74 20 2a 2f 0a 20 20 69 66 28 20 75 73 65  eat */.  if( use
9ad0: 54 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d 28  Timeout ) alarm(
9ae0: 31 30 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65  10);..  /* Conve
9af0: 72 74 20 61 6c 6c 20 75 6e 75 73 75 61 6c 20 63  rt all unusual c
9b00: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
9b10: 20 73 63 72 69 70 74 20 6e 61 6d 65 20 69 6e 74   script name int
9b20: 6f 20 22 5f 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  o "_"..  **.  **
9b30: 20 54 68 69 73 20 69 73 20 61 20 64 65 66 65 6e   This is a defen
9b40: 73 65 20 61 67 61 69 6e 73 74 20 76 61 72 69 6f  se against vario
9b50: 75 73 20 61 74 74 61 63 6b 73 2c 20 58 53 53 20  us attacks, XSS 
9b60: 61 74 74 61 63 6b 73 20 69 6e 20 70 61 72 74 69  attacks in parti
9b70: 63 75 6c 61 72 2e 0a 20 20 2a 2f 0a 20 20 66 6f  cular..  */.  fo
9b80: 72 28 7a 3d 7a 53 63 72 69 70 74 3b 20 2a 7a 3b  r(z=zScript; *z;
9b90: 20 7a 2b 2b 29 7b 0a 20 20 20 20 75 6e 73 69 67   z++){.    unsig
9ba0: 6e 65 64 20 63 68 61 72 20 63 20 3d 20 2a 28 75  ned char c = *(u
9bb0: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 3b  nsigned char*)z;
9bc0: 0a 20 20 20 20 69 66 28 20 28 63 26 30 78 38 30  .    if( (c&0x80
9bd0: 29 21 3d 30 20 7c 7c 20 21 61 6c 6c 6f 77 65 64  )!=0 || !allowed
9be0: 49 6e 4e 61 6d 65 5b 63 5d 20 29 7b 0a 20 20 20  InName[c] ){.   
9bf0: 20 20 20 2a 7a 20 3d 20 27 5f 27 3b 0a 20 20 20     *z = '_';.   
9c00: 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20 26 26     if( c=='%' &&
9c10: 20 7a 5b 31 5d 21 3d 30 20 26 26 20 7a 5b 32 5d   z[1]!=0 && z[2]
9c20: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  !=0 ){.        f
9c30: 6f 72 28 69 3d 33 3b 20 28 7a 5b 69 2d 32 5d 20  or(i=3; (z[i-2] 
9c40: 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29  = z[i])!=0; i++)
9c50: 7b 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  {}.      }.    }
9c60: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 27 74  .  }..  /* Don't
9c70: 20 61 6c 6c 6f 77 20 22 2f 2e 22 20 6f 72 20 22   allow "/." or "
9c80: 2f 2d 22 20 74 6f 20 74 6f 20 6f 63 63 75 72 20  /-" to to occur 
9c90: 61 6e 79 77 68 65 72 65 20 69 6e 20 74 68 65 20  anywhere in the 
9ca0: 65 6e 74 69 74 79 20 6e 61 6d 65 2e 0a 20 20 2a  entity name..  *
9cb0: 2a 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20  * This prevents 
9cc0: 61 74 74 61 63 6b 73 20 69 6e 76 6f 6c 76 69 6e  attacks involvin
9cd0: 67 20 22 2e 2e 22 20 61 6e 64 20 61 6c 73 6f 20  g ".." and also 
9ce0: 61 6c 6c 6f 77 73 20 75 73 20 74 6f 20 63 72 65  allows us to cre
9cf0: 61 74 65 0a 20 20 2a 2a 20 66 69 6c 65 73 20 61  ate.  ** files a
9d00: 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 77  nd directories w
9d10: 68 6f 73 65 20 6e 61 6d 65 73 20 62 65 67 69 6e  hose names begin
9d20: 20 77 69 74 68 20 22 2d 22 20 77 68 69 63 68 20   with "-" which 
9d30: 61 72 65 20 69 6e 76 69 73 69 62 6c 65 0a 20 20  are invisible.  
9d40: 2a 2a 20 74 6f 20 74 68 65 20 77 65 62 73 65 72  ** to the webser
9d50: 76 65 72 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ver..  */.  for(
9d60: 7a 3d 7a 53 63 72 69 70 74 3b 20 2a 7a 3b 20 7a  z=zScript; *z; z
9d70: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d  ++){.    if( *z=
9d80: 3d 27 2f 27 20 26 26 20 28 7a 5b 31 5d 3d 3d 27  ='/' && (z[1]=='
9d90: 2e 27 20 7c 7c 20 7a 5b 31 5d 3d 3d 27 2d 27 29  .' || z[1]=='-')
9da0: 20 29 7b 0a 20 20 20 20 20 20 20 4e 6f 74 46 6f   ){.       NotFo
9db0: 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  und(__LINE__);. 
9dc0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
9dd0: 69 67 75 72 65 20 6f 75 74 20 77 68 61 74 20 74  igure out what t
9de0: 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 66  he root of the f
9df0: 69 6c 65 73 79 73 74 65 6d 20 73 68 6f 75 6c 64  ilesystem should
9e00: 20 62 65 2e 20 20 49 66 20 74 68 65 0a 20 20 2a   be.  If the.  *
9e10: 2a 20 48 54 54 50 5f 48 4f 53 54 20 70 61 72 61  * HTTP_HOST para
9e20: 6d 65 74 65 72 20 65 78 69 73 74 73 20 28 73 74  meter exists (st
9e30: 6f 72 65 64 20 69 6e 20 7a 48 74 74 70 48 6f 73  ored in zHttpHos
9e40: 74 29 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74  t) then remove t
9e50: 68 65 0a 20 20 2a 2a 20 70 6f 72 74 20 6e 75 6d  he.  ** port num
9e60: 62 65 72 20 66 72 6f 6d 20 74 68 65 20 65 6e 64  ber from the end
9e70: 20 28 69 66 20 61 6e 79 29 2c 20 63 6f 6e 76 65   (if any), conve
9e80: 72 74 20 61 6c 6c 20 63 68 61 72 61 63 74 65 72  rt all character
9e90: 73 20 74 6f 20 6c 6f 77 65 72 0a 20 20 2a 2a 20  s to lower.  ** 
9ea0: 63 61 73 65 2c 20 61 6e 64 20 63 6f 6e 76 65 72  case, and conver
9eb0: 74 20 61 6c 6c 20 22 2e 22 20 74 6f 20 22 5f 22  t all "." to "_"
9ec0: 2e 20 20 54 68 65 6e 20 74 72 79 20 74 6f 20 66  .  Then try to f
9ed0: 69 6e 64 20 61 20 64 69 72 65 63 74 6f 72 79 0a  ind a directory.
9ee0: 20 20 2a 2a 20 77 69 74 68 20 74 68 61 74 20 6e    ** with that n
9ef0: 61 6d 65 20 61 6e 64 20 74 68 65 20 65 78 74 65  ame and the exte
9f00: 6e 73 69 6f 6e 20 2e 77 65 62 73 69 74 65 2e 20  nsion .website. 
9f10: 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c   If not found, l
9f20: 6f 6f 6b 0a 20 20 2a 2a 20 66 6f 72 20 22 64 65  ook.  ** for "de
9f30: 66 61 75 6c 74 2e 77 65 62 73 69 74 65 22 2e 0a  fault.website"..
9f40: 20 20 2a 2f 0a 20 20 69 66 28 20 7a 53 63 72 69    */.  if( zScri
9f50: 70 74 5b 30 5d 21 3d 27 2f 27 20 29 20 4e 6f 74  pt[0]!='/' ) Not
9f60: 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b  Found(__LINE__);
9f70: 0a 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 52  .  if( strlen(zR
9f80: 6f 6f 74 29 2b 34 30 20 3e 3d 20 73 69 7a 65 6f  oot)+40 >= sizeo
9f90: 66 28 7a 4c 69 6e 65 29 20 29 20 4e 6f 74 46 6f  f(zLine) ) NotFo
9fa0: 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  und(__LINE__);. 
9fb0: 20 69 66 28 20 7a 48 74 74 70 48 6f 73 74 3d 3d   if( zHttpHost==
9fc0: 30 20 7c 7c 20 7a 48 74 74 70 48 6f 73 74 5b 30  0 || zHttpHost[0
9fd0: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 4e 6f 74 46  ]==0 ){.    NotF
9fe0: 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  ound(__LINE__);.
9ff0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6c    }else if( strl
a000: 65 6e 28 7a 48 74 74 70 48 6f 73 74 29 2b 73 74  en(zHttpHost)+st
a010: 72 6c 65 6e 28 7a 52 6f 6f 74 29 2b 31 30 20 3e  rlen(zRoot)+10 >
a020: 3d 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 20  = sizeof(zLine) 
a030: 29 7b 0a 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28  ){.    NotFound(
a040: 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c  __LINE__);.  }el
a050: 73 65 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28  se{.    sprintf(
a060: 7a 4c 69 6e 65 2c 20 22 25 73 2f 25 73 22 2c 20  zLine, "%s/%s", 
a070: 7a 52 6f 6f 74 2c 20 7a 48 74 74 70 48 6f 73 74  zRoot, zHttpHost
a080: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 73 74 72  );.    for(i=str
a090: 6c 65 6e 28 7a 52 6f 6f 74 29 2b 31 3b 20 7a 4c  len(zRoot)+1; zL
a0a0: 69 6e 65 5b 69 5d 20 26 26 20 7a 4c 69 6e 65 5b  ine[i] && zLine[
a0b0: 69 5d 21 3d 27 3a 27 3b 20 69 2b 2b 29 7b 0a 20  i]!=':'; i++){. 
a0c0: 20 20 20 20 20 69 6e 74 20 63 20 3d 20 7a 4c 69       int c = zLi
a0d0: 6e 65 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  ne[i];.      if(
a0e0: 20 21 69 73 61 6c 6e 75 6d 28 63 29 20 29 7b 0a   !isalnum(c) ){.
a0f0: 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 69 5d          zLine[i]
a100: 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 7d 65   = '_';.      }e
a110: 6c 73 65 20 69 66 28 20 69 73 75 70 70 65 72 28  lse if( isupper(
a120: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c  c) ){.        zL
a130: 69 6e 65 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72  ine[i] = tolower
a140: 28 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (c);.      }.   
a150: 20 7d 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a   }.    strcpy(&z
a160: 4c 69 6e 65 5b 69 5d 2c 20 22 2e 77 65 62 73 69  Line[i], ".websi
a170: 74 65 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  te");.  }.  if( 
a180: 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74  stat(zLine,&stat
a190: 62 75 66 29 20 7c 7c 20 21 53 5f 49 53 44 49 52  buf) || !S_ISDIR
a1a0: 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65  (statbuf.st_mode
a1b0: 29 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66  ) ){.    sprintf
a1c0: 28 7a 4c 69 6e 65 2c 20 22 25 73 2f 64 65 66 61  (zLine, "%s/defa
a1d0: 75 6c 74 2e 77 65 62 73 69 74 65 22 2c 20 7a 52  ult.website", zR
a1e0: 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 73 74  oot);.    if( st
a1f0: 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75  at(zLine,&statbu
a200: 66 29 20 7c 7c 20 21 53 5f 49 53 44 49 52 28 73  f) || !S_ISDIR(s
a210: 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20  tatbuf.st_mode) 
a220: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 61  ){.      if( sta
a230: 6e 64 61 6c 6f 6e 65 20 29 7b 0a 20 20 20 20 20  ndalone ){.     
a240: 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65     sprintf(zLine
a250: 2c 20 22 25 73 22 2c 20 7a 52 6f 6f 74 29 3b 0a  , "%s", zRoot);.
a260: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a270: 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f       NotFound(__
a280: 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 7d  LINE__);.      }
a290: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 48 6f  .    }.  }.  zHo
a2a0: 6d 65 20 3d 20 53 74 72 44 75 70 28 7a 4c 69 6e  me = StrDup(zLin
a2b0: 65 29 3b 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65  e);..  /* Change
a2c0: 20 64 69 72 65 63 74 6f 72 69 65 73 20 74 6f 20   directories to 
a2d0: 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
a2e0: 48 54 54 50 20 66 69 6c 65 73 79 73 74 65 6d 0a  HTTP filesystem.
a2f0: 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 64 69 72    */.  if( chdir
a300: 28 7a 48 6f 6d 65 29 21 3d 30 20 29 7b 0a 20 20  (zHome)!=0 ){.  
a310: 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30    char zBuf[1000
a320: 5d 3b 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69  ];.    Malfuncti
a330: 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 63 61  on(__LINE__, "ca
a340: 6e 6e 6f 74 20 63 68 64 69 72 20 74 6f 20 5b 25  nnot chdir to [%
a350: 73 5d 20 66 72 6f 6d 20 5b 25 73 5d 22 2c 0a 20  s] from [%s]",. 
a360: 20 20 20 20 20 20 20 20 7a 48 6f 6d 65 2c 20 67          zHome, g
a370: 65 74 63 77 64 28 7a 42 75 66 2c 39 39 39 29 29  etcwd(zBuf,999))
a380: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
a390: 74 65 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74  te the file in t
a3a0: 68 65 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20  he filesystem.  
a3b0: 57 65 20 6d 69 67 68 74 20 68 61 76 65 20 74 6f  We might have to
a3c0: 20 61 70 70 65 6e 64 0a 20 20 2a 2a 20 74 68 65   append.  ** the
a3d0: 20 6e 61 6d 65 20 22 69 6e 64 65 78 2e 68 74 6d   name "index.htm
a3e0: 6c 22 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66  l" in order to f
a3f0: 69 6e 64 20 69 74 2e 20 20 41 6e 79 20 65 78 63  ind it.  Any exc
a400: 65 73 73 20 70 61 74 68 0a 20 20 2a 2a 20 69 6e  ess path.  ** in
a410: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 70 75 74  formation is put
a420: 20 69 6e 74 6f 20 74 68 65 20 7a 50 61 74 68 49   into the zPathI
a430: 6e 66 6f 20 76 61 72 69 61 62 6c 65 2e 0a 20 20  nfo variable..  
a440: 2a 2f 0a 20 20 7a 4c 69 6e 65 5b 30 5d 20 3d 20  */.  zLine[0] = 
a450: 27 2e 27 3b 0a 20 20 69 20 3d 20 30 3b 0a 20 20  '.';.  i = 0;.  
a460: 77 68 69 6c 65 28 20 7a 53 63 72 69 70 74 5b 69  while( zScript[i
a470: 5d 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  ] ){.    while( 
a480: 7a 53 63 72 69 70 74 5b 69 5d 20 26 26 20 7a 53  zScript[i] && zS
a490: 63 72 69 70 74 5b 69 5d 21 3d 27 2f 27 20 29 7b  cript[i]!='/' ){
a4a0: 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 69 2b 31  .      zLine[i+1
a4b0: 5d 20 3d 20 7a 53 63 72 69 70 74 5b 69 5d 3b 0a  ] = zScript[i];.
a4c0: 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d        i++;.    }
a4d0: 0a 20 20 20 20 7a 4c 69 6e 65 5b 69 2b 31 5d 20  .    zLine[i+1] 
a4e0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 74 61  = 0;.    if( sta
a4f0: 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75 66  t(zLine,&statbuf
a500: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )!=0 ){.      in
a510: 74 20 73 74 69 6c 6c 53 65 61 72 63 68 69 6e 67  t stillSearching
a520: 20 3d 20 31 3b 0a 20 20 20 20 20 20 77 68 69 6c   = 1;.      whil
a530: 65 28 20 73 74 69 6c 6c 53 65 61 72 63 68 69 6e  e( stillSearchin
a540: 67 20 26 26 20 69 3e 30 20 29 7b 0a 20 20 20 20  g && i>0 ){.    
a550: 20 20 20 20 77 68 69 6c 65 28 20 69 3e 30 20 26      while( i>0 &
a560: 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d 27 2f 27 20  & zLine[i]!='/' 
a570: 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ i--; }.      
a580: 20 20 73 74 72 63 70 79 28 26 7a 4c 69 6e 65 5b    strcpy(&zLine[
a590: 69 5d 2c 20 22 2f 6e 6f 74 2d 66 6f 75 6e 64 2e  i], "/not-found.
a5a0: 68 74 6d 6c 22 29 3b 0a 20 20 20 20 20 20 20 20  html");.        
a5b0: 69 66 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26  if( stat(zLine,&
a5c0: 73 74 61 74 62 75 66 29 3d 3d 30 20 26 26 20 53  statbuf)==0 && S
a5d0: 5f 49 53 52 45 47 28 73 74 61 74 62 75 66 2e 73  _ISREG(statbuf.s
a5e0: 74 5f 6d 6f 64 65 29 0a 20 20 20 20 20 20 20 20  t_mode).        
a5f0: 20 20 20 20 26 26 20 61 63 63 65 73 73 28 7a 4c      && access(zL
a600: 69 6e 65 2c 52 5f 4f 4b 29 3d 3d 30 20 29 7b 0a  ine,R_OK)==0 ){.
a610: 20 20 20 20 20 20 20 20 20 20 7a 52 65 61 6c 53            zRealS
a620: 63 72 69 70 74 20 3d 20 53 74 72 44 75 70 28 26  cript = StrDup(&
a630: 7a 4c 69 6e 65 5b 31 5d 29 3b 0a 20 20 20 20 20  zLine[1]);.     
a640: 20 20 20 20 20 52 65 64 69 72 65 63 74 28 7a 52       Redirect(zR
a650: 65 61 6c 53 63 72 69 70 74 2c 20 31 29 3b 0a 20  ealScript, 1);. 
a660: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
a670: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
a680: 20 20 20 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20            i--;. 
a690: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
a6a0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 69 6c 6c  .      if( still
a6b0: 53 65 61 72 63 68 69 6e 67 20 29 20 4e 6f 74 46  Searching ) NotF
a6c0: 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  ound(__LINE__);.
a6d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a6e0: 20 7d 0a 20 20 20 20 69 66 28 20 53 5f 49 53 52   }.    if( S_ISR
a6f0: 45 47 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f  EG(statbuf.st_mo
a700: 64 65 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  de) ){.      if(
a710: 20 61 63 63 65 73 73 28 7a 4c 69 6e 65 2c 52 5f   access(zLine,R_
a720: 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 4e  OK) ){.        N
a730: 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f  otFound(__LINE__
a740: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a750: 20 7a 52 65 61 6c 53 63 72 69 70 74 20 3d 20 53   zRealScript = S
a760: 74 72 44 75 70 28 26 7a 4c 69 6e 65 5b 31 5d 29  trDup(&zLine[1])
a770: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a780: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 53 63     }.    if( zSc
a790: 72 69 70 74 5b 69 5d 3d 3d 30 20 7c 7c 20 7a 53  ript[i]==0 || zS
a7a0: 63 72 69 70 74 5b 69 2b 31 5d 3d 3d 30 20 29 7b  cript[i+1]==0 ){
a7b0: 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a  .      strcpy(&z
a7c0: 4c 69 6e 65 5b 69 2b 31 5d 2c 22 2f 69 6e 64 65  Line[i+1],"/inde
a7d0: 78 2e 68 74 6d 6c 22 29 3b 0a 20 20 20 20 20 20  x.html");.      
a7e0: 69 66 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26  if( stat(zLine,&
a7f0: 73 74 61 74 62 75 66 29 21 3d 30 20 7c 7c 20 21  statbuf)!=0 || !
a800: 53 5f 49 53 52 45 47 28 73 74 61 74 62 75 66 2e  S_ISREG(statbuf.
a810: 73 74 5f 6d 6f 64 65 29 20 0a 20 20 20 20 20 20  st_mode) .      
a820: 7c 7c 20 61 63 63 65 73 73 28 7a 4c 69 6e 65 2c  || access(zLine,
a830: 52 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 20  R_OK) ){.       
a840: 20 73 74 72 63 70 79 28 26 7a 4c 69 6e 65 5b 69   strcpy(&zLine[i
a850: 2b 31 5d 2c 22 2f 69 6e 64 65 78 2e 63 67 69 22  +1],"/index.cgi"
a860: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
a870: 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62  tat(zLine,&statb
a880: 75 66 29 21 3d 30 20 7c 7c 20 21 53 5f 49 53 52  uf)!=0 || !S_ISR
a890: 45 47 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f  EG(statbuf.st_mo
a8a0: 64 65 29 20 0a 20 20 20 20 20 20 20 20 7c 7c 20  de) .        || 
a8b0: 61 63 63 65 73 73 28 7a 4c 69 6e 65 2c 52 5f 4f  access(zLine,R_O
a8c0: 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  K) ){.          
a8d0: 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f  NotFound(__LINE_
a8e0: 5f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  _);.        }.  
a8f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 52 65 61      }.      zRea
a900: 6c 53 63 72 69 70 74 20 3d 20 53 74 72 44 75 70  lScript = StrDup
a910: 28 26 7a 4c 69 6e 65 5b 31 5d 29 3b 0a 20 20 20  (&zLine[1]);.   
a920: 20 20 20 69 66 28 20 7a 53 63 72 69 70 74 5b 69     if( zScript[i
a930: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
a940: 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  /* If the reques
a950: 74 65 64 20 55 52 4c 20 64 6f 65 73 20 6e 6f 74  ted URL does not
a960: 20 65 6e 64 20 77 69 74 68 20 22 2f 22 20 62 75   end with "/" bu
a970: 74 20 77 65 20 68 61 64 20 74 6f 0a 20 20 20 20  t we had to.    
a980: 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 22 69      ** append "i
a990: 6e 64 65 78 2e 68 74 6d 6c 22 2c 20 74 68 65 6e  ndex.html", then
a9a0: 20 61 20 72 65 64 69 72 65 63 74 20 69 73 20 6e   a redirect is n
a9b0: 65 63 65 73 73 61 72 79 2e 20 20 4f 74 68 65 72  ecessary.  Other
a9c0: 77 69 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  wise.        ** 
a9d0: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 65 6c 61  none of the rela
a9e0: 74 69 76 65 20 55 52 4c 73 20 69 6e 20 74 68 65  tive URLs in the
a9f0: 20 64 65 6c 69 76 65 72 65 64 20 64 6f 63 75 6d   delivered docum
aa00: 65 6e 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ent will be.    
aa10: 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 2e 20      ** correct. 
aa20: 2a 2f 0a 20 20 20 20 20 20 20 20 52 65 64 69 72  */.        Redir
aa30: 65 63 74 28 7a 52 65 61 6c 53 63 72 69 70 74 2c  ect(zRealScript,
aa40: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74   1);.        ret
aa50: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
aa60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
aa70: 20 20 20 20 7a 4c 69 6e 65 5b 69 2b 31 5d 20 3d      zLine[i+1] =
aa80: 20 7a 53 63 72 69 70 74 5b 69 5d 3b 0a 20 20 20   zScript[i];.   
aa90: 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c   i++;.  }.  zFil
aaa0: 65 20 3d 20 53 74 72 44 75 70 28 7a 4c 69 6e 65  e = StrDup(zLine
aab0: 29 3b 0a 20 20 7a 50 61 74 68 49 6e 66 6f 20 3d  );.  zPathInfo =
aac0: 20 53 74 72 44 75 70 28 26 7a 53 63 72 69 70 74   StrDup(&zScript
aad0: 5b 69 5d 29 3b 0a 20 20 6c 65 6e 46 69 6c 65 20  [i]);.  lenFile 
aae0: 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 3b  = strlen(zFile);
aaf0: 0a 20 20 7a 44 69 72 20 3d 20 53 74 72 44 75 70  .  zDir = StrDup
ab00: 28 7a 46 69 6c 65 29 3b 0a 20 20 66 6f 72 28 69  (zFile);.  for(i
ab10: 3d 73 74 72 6c 65 6e 28 7a 44 69 72 29 2d 31 3b  =strlen(zDir)-1;
ab20: 20 69 3e 30 20 26 26 20 7a 44 69 72 5b 69 5d 21   i>0 && zDir[i]!
ab30: 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 3b 0a 20 20  ='/'; i--){};.  
ab40: 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20  if( i==0 ){.    
ab50: 20 73 74 72 63 70 79 28 7a 44 69 72 2c 22 2f 22   strcpy(zDir,"/"
ab60: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
ab70: 20 7a 44 69 72 5b 69 5d 20 3d 20 30 3b 0a 20 20   zDir[i] = 0;.  
ab80: 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  }..  /* Check to
ab90: 20 73 65 65 20 69 66 20 74 68 65 72 65 20 69 73   see if there is
aba0: 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f   an authorizatio
abb0: 6e 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  n file.  If ther
abc0: 65 20 69 73 2c 0a 20 20 2a 2a 20 70 72 6f 63 65  e is,.  ** proce
abd0: 73 73 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 70  ss it..  */.  sp
abe0: 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 25 73  rintf(zLine, "%s
abf0: 2f 2d 61 75 74 68 22 2c 20 7a 44 69 72 29 3b 0a  /-auth", zDir);.
ac00: 20 20 69 66 28 20 61 63 63 65 73 73 28 7a 4c 69    if( access(zLi
ac10: 6e 65 2c 52 5f 4f 4b 29 3d 3d 30 20 26 26 20 21  ne,R_OK)==0 && !
ac20: 43 68 65 63 6b 42 61 73 69 63 41 75 74 68 6f 72  CheckBasicAuthor
ac30: 69 7a 61 74 69 6f 6e 28 7a 4c 69 6e 65 29 20 29  ization(zLine) )
ac40: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54   return;..  /* T
ac50: 61 6b 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  ake appropriate 
ac60: 61 63 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66  action.  */.  if
ac70: 28 20 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f  ( (statbuf.st_mo
ac80: 64 65 20 26 20 30 31 30 30 29 3d 3d 30 31 30 30  de & 0100)==0100
ac90: 20 26 26 20 61 63 63 65 73 73 28 7a 46 69 6c 65   && access(zFile
aca0: 2c 58 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20  ,X_OK)==0 ){.   
acb0: 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   /*.    ** The f
acc0: 6f 6c 6c 6f 77 69 6e 67 73 20 73 74 61 74 69 63  ollowings static
acd0: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 75   variables are u
ace0: 73 65 64 20 74 6f 20 73 65 74 75 70 20 74 68 65  sed to setup the
acf0: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 0a 20 20 20   environment.   
ad00: 20 2a 2a 20 66 6f 72 20 74 68 65 20 43 47 49 20   ** for the CGI 
ad10: 73 63 72 69 70 74 0a 20 20 20 20 2a 2f 0a 20 20  script.    */.  
ad20: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 64    static char *d
ad30: 65 66 61 75 6c 74 5f 70 61 74 68 20 3d 20 22 2f  efault_path = "/
ad40: 62 69 6e 3a 2f 75 73 72 2f 62 69 6e 22 3b 0a 20  bin:/usr/bin";. 
ad50: 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a     static char *
ad60: 67 61 74 65 77 61 79 5f 69 6e 74 65 72 66 61 63  gateway_interfac
ad70: 65 20 3d 20 22 43 47 49 2f 31 2e 30 22 3b 0a 20  e = "CGI/1.0";. 
ad80: 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74     static struct
ad90: 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a   {.      char *z
ada0: 45 6e 76 4e 61 6d 65 3b 0a 20 20 20 20 20 20 63  EnvName;.      c
adb0: 68 61 72 20 2a 2a 70 7a 45 6e 76 56 61 6c 75 65  har **pzEnvValue
adc0: 3b 0a 20 20 20 20 7d 20 63 67 69 65 6e 76 5b 5d  ;.    } cgienv[]
add0: 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 41 55   = {.      { "AU
ade0: 54 48 5f 54 59 50 45 22 2c 20 20 20 20 20 20 20  TH_TYPE",       
adf0: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 41 75              &zAu
ae00: 74 68 54 79 70 65 20 7d 2c 0a 20 20 20 20 20 20  thType },.      
ae10: 7b 20 22 41 55 54 48 5f 43 4f 4e 54 45 4e 54 22  { "AUTH_CONTENT"
ae20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ae30: 20 26 7a 41 75 74 68 41 72 67 20 7d 2c 0a 20 20   &zAuthArg },.  
ae40: 20 20 20 20 7b 20 22 43 4f 4e 54 45 4e 54 5f 4c      { "CONTENT_L
ae50: 45 4e 47 54 48 22 2c 20 20 20 20 20 20 20 20 20  ENGTH",         
ae60: 20 20 20 20 20 26 7a 43 6f 6e 74 65 6e 74 4c 65       &zContentLe
ae70: 6e 67 74 68 20 7d 2c 0a 20 20 20 20 20 20 7b 20  ngth },.      { 
ae80: 22 43 4f 4e 54 45 4e 54 5f 54 59 50 45 22 2c 20  "CONTENT_TYPE", 
ae90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
aea0: 7a 43 6f 6e 74 65 6e 74 54 79 70 65 20 7d 2c 0a  zContentType },.
aeb0: 20 20 20 20 20 20 7b 20 22 44 4f 43 55 4d 45 4e        { "DOCUMEN
aec0: 54 5f 52 4f 4f 54 22 2c 20 20 20 20 20 20 20 20  T_ROOT",        
aed0: 20 20 20 20 20 20 20 26 7a 48 6f 6d 65 20 7d 2c         &zHome },
aee0: 0a 20 20 20 20 20 20 7b 20 22 47 41 54 45 57 41  .      { "GATEWA
aef0: 59 5f 49 4e 54 45 52 46 41 43 45 22 2c 20 20 20  Y_INTERFACE",   
af00: 20 20 20 20 20 20 20 20 26 67 61 74 65 77 61 79          &gateway
af10: 5f 69 6e 74 65 72 66 61 63 65 20 7d 2c 0a 20 20  _interface },.  
af20: 20 20 20 20 7b 20 22 48 54 54 50 5f 41 43 43 45      { "HTTP_ACCE
af30: 50 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  PT",            
af40: 20 20 20 20 20 26 7a 41 63 63 65 70 74 20 7d 2c       &zAccept },
af50: 0a 20 20 20 20 20 20 7b 20 22 48 54 54 50 5f 43  .      { "HTTP_C
af60: 4f 4f 4b 49 45 22 2c 20 20 20 20 20 20 20 20 20  OOKIE",         
af70: 20 20 20 20 20 20 20 20 26 7a 43 6f 6f 6b 69 65          &zCookie
af80: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 48 54 54   },.      { "HTT
af90: 50 5f 48 4f 53 54 22 2c 20 20 20 20 20 20 20 20  P_HOST",        
afa0: 20 20 20 20 20 20 20 20 20 20 20 26 7a 48 74 74             &zHtt
afb0: 70 48 6f 73 74 20 7d 2c 0a 20 20 20 20 20 20 7b  pHost },.      {
afc0: 20 22 48 54 54 50 5f 52 45 46 45 52 45 52 22 2c   "HTTP_REFERER",
afd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afe0: 26 7a 52 65 66 65 72 65 72 20 7d 2c 0a 20 20 20  &zReferer },.   
aff0: 20 20 20 7b 20 22 48 54 54 50 5f 55 53 45 52 5f     { "HTTP_USER_
b000: 41 47 45 4e 54 22 2c 20 20 20 20 20 20 20 20 20  AGENT",         
b010: 20 20 20 20 26 7a 41 67 65 6e 74 20 7d 2c 0a 20      &zAgent },. 
b020: 20 20 20 20 20 7b 20 22 50 41 54 48 22 2c 20 20       { "PATH",  
b030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b040: 20 20 20 20 20 20 26 64 65 66 61 75 6c 74 5f 70        &default_p
b050: 61 74 68 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  ath },.      { "
b060: 50 41 54 48 5f 49 4e 46 4f 22 2c 20 20 20 20 20  PATH_INFO",     
b070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
b080: 50 61 74 68 49 6e 66 6f 20 7d 2c 0a 20 20 20 20  PathInfo },.    
b090: 20 20 7b 20 22 51 55 45 52 59 5f 53 54 52 49 4e    { "QUERY_STRIN
b0a0: 47 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  G",             
b0b0: 20 20 20 26 7a 51 75 65 72 79 53 74 72 69 6e 67     &zQueryString
b0c0: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 52 45 4d   },.      { "REM
b0d0: 4f 54 45 5f 41 44 44 52 22 2c 20 20 20 20 20 20  OTE_ADDR",      
b0e0: 20 20 20 20 20 20 20 20 20 20 20 26 7a 52 65 6d             &zRem
b0f0: 6f 74 65 41 64 64 72 20 7d 2c 0a 20 20 20 20 20  oteAddr },.     
b100: 20 7b 20 22 52 45 51 55 45 53 54 5f 4d 45 54 48   { "REQUEST_METH
b110: 4f 44 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  OD",            
b120: 20 20 26 7a 4d 65 74 68 6f 64 20 7d 2c 0a 20 20    &zMethod },.  
b130: 20 20 20 20 7b 20 22 52 45 51 55 45 53 54 5f 55      { "REQUEST_U
b140: 52 49 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  RI",            
b150: 20 20 20 20 20 26 7a 53 63 72 69 70 74 20 7d 2c       &zScript },
b160: 0a 20 20 20 20 20 20 7b 20 22 52 45 4d 4f 54 45  .      { "REMOTE
b170: 5f 55 53 45 52 22 2c 20 20 20 20 20 20 20 20 20  _USER",         
b180: 20 20 20 20 20 20 20 20 26 7a 52 65 6d 6f 74 65          &zRemote
b190: 55 73 65 72 20 7d 2c 0a 20 20 20 20 20 20 7b 20  User },.      { 
b1a0: 22 53 43 52 49 50 54 5f 44 49 52 45 43 54 4f 52  "SCRIPT_DIRECTOR
b1b0: 59 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 26  Y",            &
b1c0: 7a 44 69 72 20 7d 2c 0a 20 20 20 20 20 20 7b 20  zDir },.      { 
b1d0: 22 53 43 52 49 50 54 5f 46 49 4c 45 4e 41 4d 45  "SCRIPT_FILENAME
b1e0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 26  ",             &
b1f0: 7a 46 69 6c 65 20 7d 2c 0a 20 20 20 20 20 20 7b  zFile },.      {
b200: 20 22 53 43 52 49 50 54 5f 4e 41 4d 45 22 2c 20   "SCRIPT_NAME", 
b210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b220: 26 7a 52 65 61 6c 53 63 72 69 70 74 20 7d 2c 0a  &zRealScript },.
b230: 20 20 20 20 20 20 7b 20 22 53 45 52 56 45 52 5f        { "SERVER_
b240: 4e 41 4d 45 22 2c 20 20 20 20 20 20 20 20 20 20  NAME",          
b250: 20 20 20 20 20 20 20 26 7a 53 65 72 76 65 72 4e         &zServerN
b260: 61 6d 65 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  ame },.      { "
b270: 53 45 52 56 45 52 5f 50 4f 52 54 22 2c 20 20 20  SERVER_PORT",   
b280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
b290: 53 65 72 76 65 72 50 6f 72 74 20 7d 2c 0a 20 20  ServerPort },.  
b2a0: 20 20 20 20 7b 20 22 53 45 52 56 45 52 5f 50 52      { "SERVER_PR
b2b0: 4f 54 4f 43 4f 4c 22 2c 20 20 20 20 20 20 20 20  OTOCOL",        
b2c0: 20 20 20 20 20 26 7a 50 72 6f 74 6f 63 6f 6c 20       &zProtocol 
b2d0: 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 68  },.    };.    ch
b2e0: 61 72 20 2a 7a 42 61 73 65 46 69 6c 65 6e 61 6d  ar *zBaseFilenam
b2f0: 65 3b 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65  e;   /* Filename
b300: 20 77 69 74 68 6f 75 74 20 64 69 72 65 63 74 6f   without directo
b310: 72 79 20 70 72 65 66 69 78 20 2a 2f 0a 0a 20 20  ry prefix */..  
b320: 20 20 2f 2a 20 49 66 20 69 74 73 20 65 78 65 63    /* If its exec
b330: 75 74 61 62 6c 65 2c 20 69 74 20 6d 75 73 74 20  utable, it must 
b340: 62 65 20 61 20 43 47 49 20 70 72 6f 67 72 61 6d  be a CGI program
b350: 2e 20 20 53 74 61 72 74 20 62 79 0a 20 20 20 20  .  Start by.    
b360: 2a 2a 20 63 68 61 6e 67 69 6e 67 20 64 69 72 65  ** changing dire
b370: 63 74 6f 72 69 65 73 20 74 6f 20 74 68 65 20 64  ctories to the d
b380: 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 69 6e 67  irectory holding
b390: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20 20   the program..  
b3a0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 68 64    */.    if( chd
b3b0: 69 72 28 7a 44 69 72 29 20 29 7b 0a 20 20 20 20  ir(zDir) ){.    
b3c0: 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30    char zBuf[1000
b3d0: 5d 3b 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e 63  ];.      Malfunc
b3e0: 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22  tion(__LINE__, "
b3f0: 63 61 6e 6e 6f 74 20 63 68 64 69 72 20 74 6f 20  cannot chdir to 
b400: 5b 25 73 5d 20 66 72 6f 6d 20 5b 25 73 5d 22 2c  [%s] from [%s]",
b410: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7a 44 69   .           zDi
b420: 72 2c 20 67 65 74 63 77 64 28 7a 42 75 66 2c 39  r, getcwd(zBuf,9
b430: 39 39 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  99));.    }..   
b440: 20 2f 2a 20 53 65 74 75 70 20 74 68 65 20 65 6e   /* Setup the en
b450: 76 69 72 6f 6e 6d 65 6e 74 20 61 70 70 72 6f 70  vironment approp
b460: 72 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2f 0a  riately..    */.
b470: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28      for(i=0; i<(
b480: 69 6e 74 29 28 73 69 7a 65 6f 66 28 63 67 69 65  int)(sizeof(cgie
b490: 6e 76 29 2f 73 69 7a 65 6f 66 28 63 67 69 65 6e  nv)/sizeof(cgien
b4a0: 76 5b 30 5d 29 29 3b 20 69 2b 2b 29 7b 0a 20 20  v[0])); i++){.  
b4b0: 20 20 20 20 69 66 28 20 2a 63 67 69 65 6e 76 5b      if( *cgienv[
b4c0: 69 5d 2e 70 7a 45 6e 76 56 61 6c 75 65 20 29 7b  i].pzEnvValue ){
b4d0: 0a 20 20 20 20 20 20 20 20 53 65 74 45 6e 76 28  .        SetEnv(
b4e0: 63 67 69 65 6e 76 5b 69 5d 2e 7a 45 6e 76 4e 61  cgienv[i].zEnvNa
b4f0: 6d 65 2c 2a 63 67 69 65 6e 76 5b 69 5d 2e 70 7a  me,*cgienv[i].pz
b500: 45 6e 76 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  EnvValue);.     
b510: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
b520: 20 75 73 65 48 74 74 70 73 20 29 7b 0a 20 20 20   useHttps ){.   
b530: 20 20 20 70 75 74 65 6e 76 28 22 48 54 54 50 53     putenv("HTTPS
b540: 3d 6f 6e 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  =on");.    }..  
b550: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 41 62 6f 72    /*.    ** Abor
b560: 74 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20  t with an error 
b570: 69 66 20 74 68 65 20 43 47 49 20 73 63 72 69 70  if the CGI scrip
b580: 74 20 69 73 20 77 72 69 74 61 62 6c 65 20 62 79  t is writable by
b590: 20 61 6e 79 6f 6e 65 20 6f 74 68 65 72 0a 20 20   anyone other.  
b5a0: 20 20 2a 2a 20 74 68 61 6e 20 69 74 73 20 6f 77    ** than its ow
b5b0: 6e 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ner..    */.    
b5c0: 69 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f 6d  if( statbuf.st_m
b5d0: 6f 64 65 20 26 20 30 30 32 32 20 29 7b 0a 20 20  ode & 0022 ){.  
b5e0: 20 20 20 20 43 67 69 53 63 72 69 70 74 57 72 69      CgiScriptWri
b5f0: 74 61 62 6c 65 28 29 3b 0a 20 20 20 20 7d 0a 0a  table();.    }..
b600: 20 20 20 20 2f 2a 20 46 6f 72 20 74 68 65 20 50      /* For the P
b610: 4f 53 54 20 6d 65 74 68 6f 64 20 61 6c 6c 20 69  OST method all i
b620: 6e 70 75 74 20 68 61 73 20 62 65 65 6e 20 77 72  nput has been wr
b630: 69 74 74 65 6e 20 74 6f 20 61 20 74 65 6d 70 6f  itten to a tempo
b640: 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 20 20 2a  rary file,.    *
b650: 2a 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20  * so we have to 
b660: 72 65 64 69 72 65 63 74 20 69 6e 70 75 74 20 74  redirect input t
b670: 6f 20 74 68 65 20 43 47 49 20 73 63 72 69 70 74  o the CGI script
b680: 20 66 72 6f 6d 20 74 68 61 74 20 66 69 6c 65 2e   from that file.
b690: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
b6a0: 7a 4d 65 74 68 6f 64 5b 30 5d 3d 3d 27 50 27 20  zMethod[0]=='P' 
b6b0: 29 7b 0a 20 20 20 20 20 20 64 75 70 28 30 29 3b  ){.      dup(0);
b6c0: 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 30 29 3b  .      close(0);
b6d0: 0a 20 20 20 20 20 20 6f 70 65 6e 28 7a 54 6d 70  .      open(zTmp
b6e0: 4e 61 6d 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a  Nam, O_RDONLY);.
b6f0: 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69      }..    for(i
b700: 3d 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2d 31  =strlen(zFile)-1
b710: 3b 20 69 3e 3d 30 20 26 26 20 7a 46 69 6c 65 5b  ; i>=0 && zFile[
b720: 69 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a  i]!='/'; i--){}.
b730: 20 20 20 20 7a 42 61 73 65 46 69 6c 65 6e 61 6d      zBaseFilenam
b740: 65 20 3d 20 26 7a 46 69 6c 65 5b 69 2b 31 5d 3b  e = &zFile[i+1];
b750: 0a 20 20 20 20 69 66 28 20 69 3e 3d 30 20 26 26  .    if( i>=0 &&
b760: 20 73 74 72 6e 63 6d 70 28 7a 42 61 73 65 46 69   strncmp(zBaseFi
b770: 6c 65 6e 61 6d 65 2c 22 6e 70 68 2d 22 2c 34 29  lename,"nph-",4)
b780: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
b790: 49 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  If the name of t
b7a0: 68 65 20 43 47 49 20 73 63 72 69 70 74 20 62 65  he CGI script be
b7b0: 67 69 6e 73 20 77 69 74 68 20 22 6e 70 68 2d 22  gins with "nph-"
b7c0: 20 74 68 65 6e 20 77 65 20 61 72 65 0a 20 20 20   then we are.   
b7d0: 20 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69     ** dealing wi
b7e0: 74 68 20 61 20 22 6e 6f 6e 2d 70 61 72 73 65 64  th a "non-parsed
b7f0: 20 68 65 61 64 65 72 73 22 20 43 47 49 20 73 63   headers" CGI sc
b800: 72 69 70 74 2e 20 20 4a 75 73 74 20 65 78 65 63  ript.  Just exec
b810: 28 29 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 64  ().      ** it d
b820: 69 72 65 63 74 6c 79 20 61 6e 64 20 6c 65 74 20  irectly and let 
b830: 69 74 20 68 61 6e 64 6c 65 20 61 6c 6c 20 69 74  it handle all it
b840: 73 20 6f 77 6e 20 68 65 61 64 65 72 20 67 65 6e  s own header gen
b850: 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  eration..      *
b860: 2f 0a 20 20 20 20 20 20 65 78 65 63 6c 28 7a 42  /.      execl(zB
b870: 61 73 65 46 69 6c 65 6e 61 6d 65 2c 7a 42 61 73  aseFilename,zBas
b880: 65 46 69 6c 65 6e 61 6d 65 2c 28 63 68 61 72 2a  eFilename,(char*
b890: 29 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4e 4f  )0);.      /* NO
b8a0: 54 45 3a 20 4e 6f 20 6c 6f 67 20 65 6e 74 72 79  TE: No log entry
b8b0: 20 77 72 69 74 74 65 6e 20 66 6f 72 20 6e 70 68   written for nph
b8c0: 2d 20 73 63 72 69 70 74 73 20 2a 2f 0a 20 20 20  - scripts */.   
b8d0: 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20 20 20     exit(0);.    
b8e0: 7d 0a 0a 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  }..    /* Fall t
b8f0: 68 72 75 20 74 6f 20 68 65 72 65 20 6f 6e 6c 79  hru to here only
b900: 20 69 66 20 74 68 69 73 20 70 72 6f 63 65 73 73   if this process
b910: 20 28 74 68 65 20 73 65 72 76 65 72 29 20 69 73   (the server) is
b920: 20 67 6f 69 6e 67 0a 20 20 20 20 2a 2a 20 74 6f   going.    ** to
b930: 20 72 65 61 64 20 61 6e 64 20 61 75 67 6d 65 6e   read and augmen
b940: 74 20 74 68 65 20 68 65 61 64 65 72 20 73 65 6e  t the header sen
b950: 74 20 62 61 63 6b 20 62 79 20 74 68 65 20 43 47  t back by the CG
b960: 49 20 70 72 6f 63 65 73 73 2e 0a 20 20 20 20 2a  I process..    *
b970: 2a 20 4f 70 65 6e 20 61 20 70 69 70 65 20 74 6f  * Open a pipe to
b980: 20 72 65 63 65 69 76 65 20 74 68 65 20 6f 75 74   receive the out
b990: 70 75 74 20 66 72 6f 6d 20 74 68 65 20 43 47 49  put from the CGI
b9a0: 20 70 72 6f 63 65 73 73 2e 20 20 54 68 65 6e 0a   process.  Then.
b9b0: 20 20 20 20 2a 2a 20 66 6f 72 6b 20 74 68 65 20      ** fork the 
b9c0: 43 47 49 20 70 72 6f 63 65 73 73 2e 20 20 4f 6e  CGI process.  On
b9d0: 63 65 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  ce everything is
b9e0: 20 64 6f 6e 65 2c 20 77 65 20 73 68 6f 75 6c 64   done, we should
b9f0: 20 62 65 0a 20 20 20 20 2a 2a 20 61 62 6c 65 20   be.    ** able 
ba00: 74 6f 20 72 65 61 64 20 74 68 65 20 6f 75 74 70  to read the outp
ba10: 75 74 20 6f 66 20 43 47 49 20 6f 6e 20 74 68 65  ut of CGI on the
ba20: 20 22 69 6e 22 20 73 74 72 65 61 6d 2e 0a 20 20   "in" stream..  
ba30: 20 20 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20    */.    {.     
ba40: 20 69 6e 74 20 70 78 5b 32 5d 3b 0a 20 20 20 20   int px[2];.    
ba50: 20 20 70 69 70 65 28 70 78 29 3b 0a 20 20 20 20    pipe(px);.    
ba60: 20 20 69 66 28 20 66 6f 72 6b 28 29 3d 3d 30 20    if( fork()==0 
ba70: 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65  ){.        close
ba80: 28 70 78 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20  (px[0]);.       
ba90: 20 63 6c 6f 73 65 28 31 29 3b 0a 20 20 20 20 20   close(1);.     
baa0: 20 20 20 64 75 70 28 70 78 5b 31 5d 29 3b 0a 20     dup(px[1]);. 
bab0: 20 20 20 20 20 20 20 63 6c 6f 73 65 28 70 78 5b         close(px[
bac0: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 65 78 65  1]);.        exe
bad0: 63 6c 28 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65  cl(zBaseFilename
bae0: 2c 20 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c  , zBaseFilename,
baf0: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
bb00: 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20 20      exit(0);.   
bb10: 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 6f 73 65     }.      close
bb20: 28 70 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69  (px[1]);.      i
bb30: 6e 20 3d 20 66 64 6f 70 65 6e 28 70 78 5b 30 5d  n = fdopen(px[0]
bb40: 2c 20 22 72 22 29 3b 0a 20 20 20 20 7d 0a 20 20  , "r");.    }.  
bb50: 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20    if( in==0 ){. 
bb60: 20 20 20 20 20 43 67 69 45 72 72 6f 72 28 29 3b       CgiError();
bb70: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
bb80: 65 61 64 20 61 6e 64 20 70 72 6f 63 65 73 73 20  ead and process 
bb90: 74 68 65 20 66 69 72 73 74 20 6c 69 6e 65 20 6f  the first line o
bba0: 66 20 74 68 65 20 68 65 61 64 65 72 20 72 65 74  f the header ret
bbb0: 75 72 6e 65 64 20 62 79 20 74 68 65 0a 20 20 20  urned by the.   
bbc0: 20 2a 2a 20 43 47 49 20 73 63 72 69 70 74 2e 0a   ** CGI script..
bbd0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 75      */.    if( u
bbe0: 73 65 54 69 6d 65 6f 75 74 20 29 20 61 6c 61 72  seTimeout ) alar
bbf0: 6d 28 31 35 29 3b 0a 20 20 20 20 77 68 69 6c 65  m(15);.    while
bc00: 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 73 69  ( fgets(zLine,si
bc10: 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 69 6e 29 20  zeof(zLine),in) 
bc20: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
bc30: 6e 63 6d 70 28 7a 4c 69 6e 65 2c 22 4c 6f 63 61  ncmp(zLine,"Loca
bc40: 74 69 6f 6e 3a 22 2c 39 29 3d 3d 30 20 29 7b 0a  tion:",9)==0 ){.
bc50: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
bc60: 20 20 20 20 20 20 20 52 65 6d 6f 76 65 4e 65 77         RemoveNew
bc70: 6c 69 6e 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20  line(zLine);.   
bc80: 20 20 20 20 20 7a 20 3d 20 26 7a 4c 69 6e 65 5b       z = &zLine[
bc90: 31 30 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 69  10];.        whi
bca0: 6c 65 28 20 69 73 73 70 61 63 65 28 2a 7a 29 20  le( isspace(*z) 
bcb0: 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20  ){ z++; }.      
bcc0: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b    for(i=0; z[i];
bcd0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
bce0: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 3f 27 20 29   if( z[i]=='?' )
bcf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 51  {.            zQ
bd00: 75 65 72 79 53 75 66 66 69 78 20 3d 20 53 74 72  uerySuffix = Str
bd10: 44 75 70 28 22 22 29 3b 0a 20 20 20 20 20 20 20  Dup("");.       
bd20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
bd30: 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
bd40: 69 66 28 20 7a 5b 30 5d 3d 3d 27 2f 27 20 26 26  if( z[0]=='/' &&
bd50: 20 7a 5b 31 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20   z[1]=='/' ){.  
bd60: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
bd70: 63 68 65 6d 65 20 69 73 20 6d 69 73 73 69 6e 67  cheme is missing
bd80: 2e 20 20 41 64 64 20 69 74 20 69 6e 20 62 65 66  .  Add it in bef
bd90: 6f 72 65 20 72 65 64 69 72 65 63 74 69 6e 67 20  ore redirecting 
bda0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 53 74 61  */.          Sta
bdb0: 72 74 52 65 73 70 6f 6e 73 65 28 22 33 30 32 20  rtResponse("302 
bdc0: 52 65 64 69 72 65 63 74 22 29 3b 0a 20 20 20 20  Redirect");.    
bdd0: 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72        nOut += pr
bde0: 69 6e 74 66 28 22 4c 6f 63 61 74 69 6f 6e 3a 20  intf("Location: 
bdf0: 25 73 3a 25 73 25 73 5c 72 5c 6e 22 2c 7a 48 74  %s:%s%s\r\n",zHt
be00: 74 70 2c 7a 2c 7a 51 75 65 72 79 53 75 66 66 69  tp,z,zQuerySuffi
be10: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  x);.          br
be20: 65 61 6b 3b 20 2f 2a 20 44 4b 20 2a 2f 0a 20 20  eak; /* DK */.  
be30: 20 20 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45          MakeLogE
be40: 6e 74 72 79 28 30 29 3b 0a 20 20 20 20 20 20 20  ntry(0);.       
be50: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
be60: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30     }else if( z[0
be70: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
be80: 20 20 20 20 2f 2a 20 54 68 65 20 73 63 68 65 6d      /* The schem
be90: 65 20 61 6e 64 20 6e 65 74 77 6f 72 6b 20 6c 6f  e and network lo
bea0: 63 61 74 69 6f 6e 20 61 72 65 20 6d 69 73 73 69  cation are missi
beb0: 6e 67 20 62 75 74 20 77 65 20 68 61 76 65 0a 20  ng but we have. 
bec0: 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20 61           ** an a
bed0: 62 73 6f 6c 75 74 65 20 70 61 74 68 2e 20 2a 2f  bsolute path. */
bee0: 0a 20 20 20 20 20 20 20 20 20 20 52 65 64 69 72  .          Redir
bef0: 65 63 74 28 7a 2c 20 30 29 3b 20 2f 2a 20 44 4b  ect(z, 0); /* DK
bf00: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 62 72   */.          br
bf10: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
bf20: 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
bf30: 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
bf40: 69 73 20 61 20 73 63 68 65 6d 65 20 70 72 65 66  is a scheme pref
bf50: 69 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  ix */.        fo
bf60: 72 28 69 3d 30 3b 20 7a 5b 69 5d 20 26 26 20 7a  r(i=0; z[i] && z
bf70: 5b 69 5d 21 3d 27 3a 27 20 26 26 20 7a 5b 69 5d  [i]!=':' && z[i]
bf80: 21 3d 27 2f 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  !='/'; i++){}.  
bf90: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d        if( z[i]==
bfa0: 27 3a 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ':' ){.         
bfb0: 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 73 63   /* We have a sc
bfc0: 68 65 6d 65 2e 20 20 41 73 73 75 6d 65 20 74 68  heme.  Assume th
bfd0: 65 72 65 20 69 73 20 61 6e 20 61 62 73 6f 6c 75  ere is an absolu
bfe0: 74 65 20 55 52 4c 20 2a 2f 0a 20 20 20 20 20 20  te URL */.      
bff0: 20 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73      StartRespons
c000: 65 28 22 33 30 32 20 52 65 64 69 72 65 63 74 22  e("302 Redirect"
c010: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75  );.          nOu
c020: 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 4c 6f 63  t += printf("Loc
c030: 61 74 69 6f 6e 3a 20 25 73 25 73 5c 72 5c 6e 22  ation: %s%s\r\n"
c040: 2c 7a 2c 7a 51 75 65 72 79 53 75 66 66 69 78 29  ,z,zQuerySuffix)
c050: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
c060: 6b 3b 20 2f 2a 20 44 4b 20 2a 2f 0a 20 20 20 20  k; /* DK */.    
c070: 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74        MakeLogEnt
c080: 72 79 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20  ry(0);.         
c090: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
c0a0: 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 75   }.        /* Mu
c0b0: 73 74 20 62 65 20 61 20 72 65 6c 61 74 69 76 65  st be a relative
c0c0: 20 70 61 74 68 6e 61 6d 65 2e 20 20 43 6f 6e 73   pathname.  Cons
c0d0: 74 72 75 63 74 20 74 68 65 20 61 62 73 6f 6c 75  truct the absolu
c0e0: 74 65 20 70 61 74 68 6e 61 6d 65 0a 20 20 20 20  te pathname.    
c0f0: 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 64 69 72      ** and redir
c100: 65 63 74 20 74 6f 20 69 74 2e 20 2a 2f 0a 20 20  ect to it. */.  
c110: 20 20 20 20 20 20 69 20 3d 20 73 74 72 6c 65 6e        i = strlen
c120: 28 7a 52 65 61 6c 53 63 72 69 70 74 29 3b 0a 20  (zRealScript);. 
c130: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3e         while( i>
c140: 30 20 26 26 20 7a 52 65 61 6c 53 63 72 69 70 74  0 && zRealScript
c150: 5b 69 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 69 2d  [i-1]!='/' ){ i-
c160: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 77 68 69  -; }.        whi
c170: 6c 65 28 20 69 3e 30 20 26 26 20 7a 52 65 61 6c  le( i>0 && zReal
c180: 53 63 72 69 70 74 5b 69 2d 31 5d 3d 3d 27 2f 27  Script[i-1]=='/'
c190: 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ i--; }.     
c1a0: 20 20 20 77 68 69 6c 65 28 20 2a 7a 3d 3d 27 2e     while( *z=='.
c1b0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ' ){.          i
c1c0: 66 28 20 7a 5b 31 5d 3d 3d 27 2f 27 20 29 7b 0a  f( z[1]=='/' ){.
c1d0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 2b 3d              z +=
c1e0: 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   2;.          }e
c1f0: 6c 73 65 20 69 66 28 20 7a 5b 31 5d 3d 3d 27 2e  lse if( z[1]=='.
c200: 27 20 26 26 20 7a 5b 32 5d 3d 3d 27 2f 27 20 29  ' && z[2]=='/' )
c210: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 68  {.            wh
c220: 69 6c 65 28 20 69 3e 30 20 26 26 20 7a 52 65 61  ile( i>0 && zRea
c230: 6c 53 63 72 69 70 74 5b 69 2d 31 5d 21 3d 27 2f  lScript[i-1]!='/
c240: 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20  ' ){ i--; }.    
c250: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69          while( i
c260: 3e 30 20 26 26 20 7a 52 65 61 6c 53 63 72 69 70  >0 && zRealScrip
c270: 74 5b 69 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 69  t[i-1]=='/' ){ i
c280: 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20  --; }.          
c290: 20 20 7a 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20    z += 3;.      
c2a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c2b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c2c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c2d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 53 74 61 72    }.        Star
c2e0: 74 52 65 73 70 6f 6e 73 65 28 22 33 30 32 20 52  tResponse("302 R
c2f0: 65 64 69 72 65 63 74 22 29 3b 0a 20 20 20 20 20  edirect");.     
c300: 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74     nOut += print
c310: 66 28 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73 3a  f("Location: %s:
c320: 2f 2f 25 73 22 2c 7a 48 74 74 70 2c 7a 53 65 72  //%s",zHttp,zSer
c330: 76 65 72 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  verName);.      
c340: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 53 65    if( strcmp(zSe
c350: 72 76 65 72 50 6f 72 74 2c 22 38 30 22 29 20 29  rverPort,"80") )
c360: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74  {.          nOut
c370: 20 2b 3d 20 70 72 69 6e 74 66 28 22 3a 25 73 22   += printf(":%s"
c380: 2c 7a 53 65 72 76 65 72 50 6f 72 74 29 3b 0a 20  ,zServerPort);. 
c390: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c3a0: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
c3b0: 22 25 2e 2a 73 2f 25 73 25 73 5c 72 5c 6e 5c 72  "%.*s/%s%s\r\n\r
c3c0: 5c 6e 22 2c 69 2c 7a 52 65 61 6c 53 63 72 69 70  \n",i,zRealScrip
c3d0: 74 2c 7a 2c 7a 51 75 65 72 79 53 75 66 66 69 78  t,z,zQuerySuffix
c3e0: 29 3b 0a 20 20 20 20 20 20 20 20 4d 61 6b 65 4c  );.        MakeL
c3f0: 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20 20 20 20  ogEntry(0);.    
c400: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
c410: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e    }else if( strn
c420: 63 6d 70 28 7a 4c 69 6e 65 2c 22 53 74 61 74 75  cmp(zLine,"Statu
c430: 73 3a 22 2c 37 29 3d 3d 30 20 29 7b 0a 20 20 20  s:",7)==0 ){.   
c440: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
c450: 20 20 20 20 66 6f 72 28 69 3d 37 3b 20 69 73 73      for(i=7; iss
c460: 70 61 63 65 28 7a 4c 69 6e 65 5b 69 5d 29 3b 20  pace(zLine[i]); 
c470: 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 6e  i++){}.        n
c480: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 25  Out += printf("%
c490: 73 20 25 73 22 2c 20 7a 50 72 6f 74 6f 63 6f 6c  s %s", zProtocol
c4a0: 2c 20 26 7a 4c 69 6e 65 5b 69 5d 29 3b 0a 20 20  , &zLine[i]);.  
c4b0: 20 20 20 20 20 20 73 74 72 6e 63 70 79 28 7a 52        strncpy(zR
c4c0: 65 70 6c 79 53 74 61 74 75 73 2c 20 26 7a 4c 69  eplyStatus, &zLi
c4d0: 6e 65 5b 69 5d 2c 20 33 29 3b 0a 20 20 20 20 20  ne[i], 3);.     
c4e0: 20 20 20 7a 52 65 70 6c 79 53 74 61 74 75 73 5b     zReplyStatus[
c4f0: 33 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  3] = 0;.        
c500: 73 74 61 74 75 73 53 65 6e 74 20 3d 20 31 3b 0a  statusSent = 1;.
c510: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c520: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c530: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
c540: 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65     StartResponse
c550: 28 22 32 30 30 20 4f 4b 22 29 3b 0a 20 20 20 20  ("200 OK");.    
c560: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
c570: 74 66 28 22 25 73 22 2c 7a 4c 69 6e 65 29 3b 0a  tf("%s",zLine);.
c580: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
c590: 20 7a 4c 69 6e 65 5b 69 5d 20 26 26 20 21 69 73   zLine[i] && !is
c5a0: 73 70 61 63 65 28 7a 4c 69 6e 65 5b 69 5d 29 20  space(zLine[i]) 
c5b0: 26 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d 27 3a 27  && zLine[i]!=':'
c5c0: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20  ; i++){}.       
c5d0: 20 69 66 28 20 69 3c 32 20 7c 7c 20 7a 4c 69 6e   if( i<2 || zLin
c5e0: 65 5b 69 5d 21 3d 27 3a 27 20 29 20 62 72 65 61  e[i]!=':' ) brea
c5f0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
c600: 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 76  ..    /* Copy ev
c610: 65 72 79 74 68 69 6e 67 20 65 6c 73 65 20 74 68  erything else th
c620: 72 75 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ru without chang
c630: 65 20 6f 72 20 61 6e 61 6c 79 73 69 73 2e 0a 20  e or analysis.. 
c640: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73     */.    if( us
c650: 65 54 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d  eTimeout ) alarm
c660: 28 36 30 2a 35 29 3b 0a 20 20 20 20 77 68 69 6c  (60*5);.    whil
c670: 65 28 20 28 63 20 3d 20 67 65 74 63 28 69 6e 29  e( (c = getc(in)
c680: 29 21 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20 20  )!=EOF ){.      
c690: 70 75 74 63 28 63 2c 73 74 64 6f 75 74 29 3b 0a  putc(c,stdout);.
c6a0: 20 20 20 20 20 20 6e 4f 75 74 2b 2b 3b 0a 20 20        nOut++;.  
c6b0: 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28 69    }.    fclose(i
c6c0: 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  n);.  }else{.   
c6d0: 20 2f 2a 20 49 66 20 69 74 20 69 73 6e 27 74 20   /* If it isn't 
c6e0: 65 78 65 63 75 74 61 62 6c 65 20 74 68 65 6e 20  executable then 
c6f0: 69 74 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 61  it.    ** must a
c700: 20 73 69 6d 70 6c 65 20 66 69 6c 65 20 74 68 61   simple file tha
c710: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63 6f  t needs to be co
c720: 70 69 65 64 20 74 6f 20 6f 75 74 70 75 74 2e 0a  pied to output..
c730: 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74      */.    const
c740: 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 54   char *zContentT
c750: 79 70 65 20 3d 20 47 65 74 4d 69 6d 65 54 79 70  ype = GetMimeTyp
c760: 65 28 7a 46 69 6c 65 2c 20 6c 65 6e 46 69 6c 65  e(zFile, lenFile
c770: 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a 54 6d 70  );..    if( zTmp
c780: 4e 61 6d 20 29 20 75 6e 6c 69 6e 6b 28 7a 54 6d  Nam ) unlink(zTm
c790: 70 4e 61 6d 29 3b 0a 20 20 20 20 69 6e 20 3d 20  pNam);.    in = 
c7a0: 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 22 72 22 29  fopen(zFile,"r")
c7b0: 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20  ;.    if( in==0 
c7c0: 29 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e  ) NotFound(__LIN
c7d0: 45 5f 5f 29 3b 0a 20 20 20 20 53 74 61 72 74 52  E__);.    StartR
c7e0: 65 73 70 6f 6e 73 65 28 22 32 30 30 20 4f 4b 22  esponse("200 OK"
c7f0: 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 44  );.    nOut += D
c800: 61 74 65 54 61 67 28 22 4c 61 73 74 2d 4d 6f 64  ateTag("Last-Mod
c810: 69 66 69 65 64 22 2c 20 73 74 61 74 62 75 66 2e  ified", statbuf.
c820: 73 74 5f 6d 74 69 6d 65 29 3b 0a 20 20 20 20 6e  st_mtime);.    n
c830: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 43  Out += printf("C
c840: 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 25 73 5c  ontent-type: %s\
c850: 72 5c 6e 22 2c 7a 43 6f 6e 74 65 6e 74 54 79 70  r\n",zContentTyp
c860: 65 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20  e);.    nOut += 
c870: 70 72 69 6e 74 66 28 22 43 6f 6e 74 65 6e 74 2d  printf("Content-
c880: 6c 65 6e 67 74 68 3a 20 25 64 5c 72 5c 6e 5c 72  length: %d\r\n\r
c890: 5c 6e 22 2c 28 69 6e 74 29 73 74 61 74 62 75 66  \n",(int)statbuf
c8a0: 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 66  .st_size);.    f
c8b0: 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20  flush(stdout);. 
c8c0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4d     if( strcmp(zM
c8d0: 65 74 68 6f 64 2c 22 48 45 41 44 22 29 3d 3d 30  ethod,"HEAD")==0
c8e0: 20 29 7b 0a 20 20 20 20 20 20 4d 61 6b 65 4c 6f   ){.      MakeLo
c8f0: 67 45 6e 74 72 79 28 30 29 3b 0a 20 20 20 20 20  gEntry(0);.     
c900: 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20   fclose(in);.   
c910: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
c920: 0a 20 20 20 20 69 66 28 20 75 73 65 54 69 6d 65  .    if( useTime
c930: 6f 75 74 20 29 20 61 6c 61 72 6d 28 33 30 20 2b  out ) alarm(30 +
c940: 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65   statbuf.st_size
c950: 2f 31 30 30 30 29 3b 0a 23 69 66 64 65 66 20 6c  /1000);.#ifdef l
c960: 69 6e 75 78 0a 20 20 20 20 7b 0a 20 20 20 20 20  inux.    {.     
c970: 20 6f 66 66 5f 74 20 6f 66 66 73 65 74 20 3d 20   off_t offset = 
c980: 30 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d  0;.      nOut +=
c990: 20 73 65 6e 64 66 69 6c 65 28 66 69 6c 65 6e 6f   sendfile(fileno
c9a0: 28 73 74 64 6f 75 74 29 2c 20 66 69 6c 65 6e 6f  (stdout), fileno
c9b0: 28 69 6e 29 2c 20 26 6f 66 66 73 65 74 2c 20 73  (in), &offset, s
c9c0: 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b  tatbuf.st_size);
c9d0: 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
c9e0: 20 77 68 69 6c 65 28 20 28 63 20 3d 20 67 65 74   while( (c = get
c9f0: 63 28 69 6e 29 29 21 3d 45 4f 46 20 29 7b 0a 20  c(in))!=EOF ){. 
ca00: 20 20 20 20 20 70 75 74 63 28 63 2c 73 74 64 6f       putc(c,stdo
ca10: 75 74 29 3b 0a 20 20 20 20 20 20 6e 4f 75 74 2b  ut);.      nOut+
ca20: 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  +;.    }.#endif.
ca30: 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
ca40: 20 20 7d 0a 20 20 66 66 6c 75 73 68 28 73 74 64    }.  fflush(std
ca50: 6f 75 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45  out);.  MakeLogE
ca60: 6e 74 72 79 28 30 29 3b 0a 0a 20 20 2f 2a 20 54  ntry(0);..  /* T
ca70: 68 65 20 6e 65 78 74 20 72 65 71 75 65 73 74 20  he next request 
ca80: 6d 75 73 74 20 61 72 72 69 76 65 20 77 69 74 68  must arrive with
ca90: 69 6e 20 33 30 20 73 65 63 6f 6e 64 73 20 6f 72  in 30 seconds or
caa0: 20 77 65 20 63 6c 6f 73 65 20 74 68 65 20 63 6f   we close the co
cab0: 6e 6e 65 63 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20  nnection.  */.  
cac0: 6f 6d 69 74 4c 6f 67 20 3d 20 31 3b 0a 20 20 69  omitLog = 1;.  i
cad0: 66 28 20 75 73 65 54 69 6d 65 6f 75 74 20 29 20  f( useTimeout ) 
cae0: 61 6c 61 72 6d 28 33 30 29 3b 0a 7d 0a 0a 23 64  alarm(30);.}..#d
caf0: 65 66 69 6e 65 20 4d 41 58 5f 50 41 52 41 4c 4c  efine MAX_PARALL
cb00: 45 4c 20 35 30 20 20 2f 2a 20 4e 75 6d 62 65 72  EL 50  /* Number
cb10: 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73   of simultaneous
cb20: 20 63 68 69 6c 64 72 65 6e 20 2a 2f 0a 0a 2f 2a   children */../*
cb30: 0a 2a 2a 20 41 6c 6c 20 70 6f 73 73 69 62 6c 65  .** All possible
cb40: 20 66 6f 72 6d 73 20 6f 66 20 61 6e 20 49 50 20   forms of an IP 
cb50: 61 64 64 72 65 73 73 2e 20 20 4e 65 65 64 65 64  address.  Needed
cb60: 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   to work around 
cb70: 47 43 43 20 73 74 72 69 63 74 0a 2a 2a 20 61 6c  GCC strict.** al
cb80: 69 61 73 69 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f  iasing rules..*/
cb90: 0a 74 79 70 65 64 65 66 20 75 6e 69 6f 6e 20 7b  .typedef union {
cba0: 0a 20 20 73 74 72 75 63 74 20 73 6f 63 6b 61 64  .  struct sockad
cbb0: 64 72 20 73 61 3b 20 20 20 20 20 20 20 20 20 20  dr sa;          
cbc0: 20 20 20 20 2f 2a 20 41 62 73 74 72 61 63 74 20      /* Abstract 
cbd0: 73 75 70 65 72 63 6c 61 73 73 20 2a 2f 0a 20 20  superclass */.  
cbe0: 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f  struct sockaddr_
cbf0: 69 6e 20 73 61 34 3b 20 20 20 20 20 20 20 20 20  in sa4;         
cc00: 20 2f 2a 20 49 50 76 34 20 2a 2f 0a 20 20 73 74   /* IPv4 */.  st
cc10: 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e  ruct sockaddr_in
cc20: 36 20 73 61 36 3b 20 20 20 20 20 20 20 20 20 2f  6 sa6;         /
cc30: 2a 20 49 50 76 36 20 2a 2f 0a 20 20 73 74 72 75  * IPv6 */.  stru
cc40: 63 74 20 73 6f 63 6b 61 64 64 72 5f 73 74 6f 72  ct sockaddr_stor
cc50: 61 67 65 20 73 61 73 3b 20 20 20 20 20 2f 2a 20  age sas;     /* 
cc60: 53 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6d 61  Should be the ma
cc70: 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 61 62 6f  ximum of the abo
cc80: 76 65 20 33 20 2a 2f 0a 7d 20 61 64 64 72 65 73  ve 3 */.} addres
cc90: 73 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  s;../*.** Implem
cca0: 65 6e 74 20 61 6e 20 48 54 54 50 20 73 65 72 76  ent an HTTP serv
ccb0: 65 72 20 64 61 65 6d 6f 6e 20 6c 69 73 74 65 6e  er daemon listen
ccc0: 69 6e 67 20 6f 6e 20 70 6f 72 74 20 69 50 6f 72  ing on port iPor
ccd0: 74 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 6e 65 77 20  t..**.** As new 
cce0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 72 69  connections arri
ccf0: 76 65 2c 20 66 6f 72 6b 20 61 20 63 68 69 6c 64  ve, fork a child
cd00: 20 61 6e 64 20 6c 65 74 20 63 68 69 6c 64 20 72   and let child r
cd10: 65 74 75 72 6e 0a 2a 2a 20 6f 75 74 20 6f 66 20  eturn.** out of 
cd20: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63  this procedure c
cd30: 61 6c 6c 2e 20 20 54 68 65 20 63 68 69 6c 64 20  all.  The child 
cd40: 77 69 6c 6c 20 68 61 6e 64 6c 65 20 74 68 65 20  will handle the 
cd50: 72 65 71 75 65 73 74 2e 0a 2a 2a 20 54 68 65 20  request..** The 
cd60: 70 61 72 65 6e 74 20 6e 65 76 65 72 20 72 65 74  parent never ret
cd70: 75 72 6e 73 20 66 72 6f 6d 20 74 68 69 73 20 70  urns from this p
cd80: 72 6f 63 65 64 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  rocedure..**.** 
cd90: 52 65 74 75 72 6e 20 30 20 74 6f 20 65 61 63 68  Return 0 to each
cda0: 20 63 68 69 6c 64 20 61 73 20 69 74 20 72 75 6e   child as it run
cdb0: 73 2e 20 20 49 66 20 75 6e 61 62 6c 65 20 74 6f  s.  If unable to
cdc0: 20 65 73 74 61 62 6c 69 73 68 20 61 0a 2a 2a 20   establish a.** 
cdd0: 6c 69 73 74 65 6e 69 6e 67 20 73 6f 63 6b 65 74  listening socket
cde0: 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  , return non-zer
cdf0: 6f 2e 0a 2a 2f 0a 69 6e 74 20 68 74 74 70 5f 73  o..*/.int http_s
ce00: 65 72 76 65 72 28 63 6f 6e 73 74 20 63 68 61 72  erver(const char
ce10: 20 2a 7a 50 6f 72 74 2c 20 69 6e 74 20 6c 6f 63   *zPort, int loc
ce20: 61 6c 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 6c  alOnly){.  int l
ce30: 69 73 74 65 6e 65 72 5b 32 30 5d 3b 20 20 20 20  istener[20];    
ce40: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
ce50: 65 72 76 65 72 20 73 6f 63 6b 65 74 73 20 2a 2f  erver sockets */
ce60: 0a 20 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f  .  int connectio
ce70: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
ce80: 2f 2a 20 41 20 73 6f 63 6b 65 74 20 66 6f 72 20  /* A socket for 
ce90: 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20  each individual 
cea0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
ceb0: 66 64 5f 73 65 74 20 72 65 61 64 66 64 73 3b 20  fd_set readfds; 
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ced0: 53 65 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63  Set of file desc
cee0: 72 69 70 74 6f 72 73 20 66 6f 72 20 73 65 6c 65  riptors for sele
cef0: 63 74 28 29 20 2a 2f 0a 20 20 61 64 64 72 65 73  ct() */.  addres
cf00: 73 20 69 6e 61 64 64 72 3b 20 20 20 20 20 20 20  s inaddr;       
cf10: 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 74 65         /* Remote
cf20: 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 73 6f   address */.  so
cf30: 63 6b 6c 65 6e 5f 74 20 6c 65 6e 61 64 64 72 3b  cklen_t lenaddr;
cf40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
cf50: 6e 67 74 68 20 6f 66 20 74 68 65 20 69 6e 61 64  ngth of the inad
cf60: 64 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  dr structure */.
cf70: 20 20 69 6e 74 20 63 68 69 6c 64 3b 20 20 20 20    int child;    
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cf90: 2a 20 50 49 44 20 6f 66 20 74 68 65 20 63 68 69  * PID of the chi
cfa0: 6c 64 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20  ld process */.  
cfb0: 69 6e 74 20 6e 63 68 69 6c 64 72 65 6e 20 3d 20  int nchildren = 
cfc0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
cfd0: 4e 75 6d 62 65 72 20 6f 66 20 63 68 69 6c 64 20  Number of child 
cfe0: 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a 20 20 73  processes */.  s
cff0: 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 64 65  truct timeval de
d000: 6c 61 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 48  lay;        /* H
d010: 6f 77 20 6c 6f 6e 67 20 74 6f 20 77 61 69 74 20  ow long to wait 
d020: 69 6e 73 69 64 65 20 73 65 6c 65 63 74 28 29 20  inside select() 
d030: 2a 2f 0a 20 20 69 6e 74 20 6f 70 74 20 3d 20 31  */.  int opt = 1
d040: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d050: 20 20 2f 2a 20 73 65 74 73 6f 63 6b 6f 70 74 20    /* setsockopt 
d060: 66 6c 61 67 20 2a 2f 0a 20 20 73 74 72 75 63 74  flag */.  struct
d070: 20 61 64 64 72 69 6e 66 6f 20 73 48 69 6e 74 73   addrinfo sHints
d080: 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
d090: 73 20 68 69 6e 74 73 20 2a 2f 0a 20 20 73 74 72  s hints */.  str
d0a0: 75 63 74 20 61 64 64 72 69 6e 66 6f 20 2a 70 41  uct addrinfo *pA
d0b0: 64 64 72 73 2c 20 2a 70 3b 20 2f 2a 20 2a 2f 0a  ddrs, *p; /* */.
d0c0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d0e0: 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
d0f0: 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69  .  int i, n;.  i
d100: 6e 74 20 6d 61 78 46 64 20 3d 20 2d 31 3b 0a 20  nt maxFd = -1;. 
d110: 20 0a 20 20 6d 65 6d 73 65 74 28 26 73 48 69 6e   .  memset(&sHin
d120: 74 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 48  ts, 0, sizeof(sH
d130: 69 6e 74 73 29 29 3b 0a 20 20 69 66 28 20 69 70  ints));.  if( ip
d140: 76 34 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 48  v4Only ){.    sH
d150: 69 6e 74 73 2e 61 69 5f 66 61 6d 69 6c 79 20 3d  ints.ai_family =
d160: 20 50 46 5f 49 4e 45 54 3b 0a 20 20 20 20 2f 2a   PF_INET;.    /*
d170: 70 72 69 6e 74 66 28 22 69 70 76 34 20 6f 6e 6c  printf("ipv4 onl
d180: 79 5c 6e 22 29 3b 2a 2f 0a 20 20 7d 65 6c 73 65  y\n");*/.  }else
d190: 20 69 66 28 20 69 70 76 36 4f 6e 6c 79 20 29 7b   if( ipv6Only ){
d1a0: 0a 20 20 20 20 73 48 69 6e 74 73 2e 61 69 5f 66  .    sHints.ai_f
d1b0: 61 6d 69 6c 79 20 3d 20 50 46 5f 49 4e 45 54 36  amily = PF_INET6
d1c0: 3b 0a 20 20 20 20 2f 2a 70 72 69 6e 74 66 28 22  ;.    /*printf("
d1d0: 69 70 76 36 20 6f 6e 6c 79 5c 6e 22 29 3b 2a 2f  ipv6 only\n");*/
d1e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 48  .  }else{.    sH
d1f0: 69 6e 74 73 2e 61 69 5f 66 61 6d 69 6c 79 20 3d  ints.ai_family =
d200: 20 50 46 5f 55 4e 53 50 45 43 3b 0a 20 20 7d 0a   PF_UNSPEC;.  }.
d210: 20 20 73 48 69 6e 74 73 2e 61 69 5f 73 6f 63 6b    sHints.ai_sock
d220: 74 79 70 65 20 3d 20 53 4f 43 4b 5f 53 54 52 45  type = SOCK_STRE
d230: 41 4d 3b 0a 20 20 73 48 69 6e 74 73 2e 61 69 5f  AM;.  sHints.ai_
d240: 66 6c 61 67 73 20 3d 20 41 49 5f 50 41 53 53 49  flags = AI_PASSI
d250: 56 45 3b 0a 20 20 73 48 69 6e 74 73 2e 61 69 5f  VE;.  sHints.ai_
d260: 70 72 6f 74 6f 63 6f 6c 20 3d 20 30 3b 0a 20 20  protocol = 0;.  
d270: 72 63 20 3d 20 67 65 74 61 64 64 72 69 6e 66 6f  rc = getaddrinfo
d280: 28 6c 6f 63 61 6c 4f 6e 6c 79 20 3f 20 22 6c 6f  (localOnly ? "lo
d290: 63 61 6c 68 6f 73 74 22 3a 20 30 2c 20 7a 50 6f  calhost": 0, zPo
d2a0: 72 74 2c 20 26 73 48 69 6e 74 73 2c 20 26 70 41  rt, &sHints, &pA
d2b0: 64 64 72 73 29 3b 0a 20 20 69 66 28 20 72 63 20  ddrs);.  if( rc 
d2c0: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
d2d0: 74 64 65 72 72 2c 20 22 63 6f 75 6c 64 20 6e 6f  tderr, "could no
d2e0: 74 20 67 65 74 20 61 64 64 72 20 69 6e 66 6f 3a  t get addr info:
d2f0: 20 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20   %s", .         
d300: 20 20 20 72 63 21 3d 45 41 49 5f 53 59 53 54 45     rc!=EAI_SYSTE
d310: 4d 20 3f 20 67 61 69 5f 73 74 72 65 72 72 6f 72  M ? gai_strerror
d320: 28 72 63 29 20 3a 20 73 74 72 65 72 72 6f 72 28  (rc) : strerror(
d330: 65 72 72 6e 6f 29 29 3b 0a 20 20 20 20 72 65 74  errno));.    ret
d340: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72  urn 1;.  }.  for
d350: 28 6e 3d 30 2c 20 70 3d 70 41 64 64 72 73 3b 20  (n=0, p=pAddrs; 
d360: 6e 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 6c  n<(int)(sizeof(l
d370: 69 73 74 65 6e 65 72 29 2f 73 69 7a 65 6f 66 28  istener)/sizeof(
d380: 6c 69 73 74 65 6e 65 72 5b 30 5d 29 29 20 26 26  listener[0])) &&
d390: 20 70 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 70   p!=0;.        p
d3a0: 3d 70 2d 3e 61 69 5f 6e 65 78 74 29 7b 0a 20 20  =p->ai_next){.  
d3b0: 20 20 6c 69 73 74 65 6e 65 72 5b 6e 5d 20 3d 20    listener[n] = 
d3c0: 73 6f 63 6b 65 74 28 70 2d 3e 61 69 5f 66 61 6d  socket(p->ai_fam
d3d0: 69 6c 79 2c 20 70 2d 3e 61 69 5f 73 6f 63 6b 74  ily, p->ai_sockt
d3e0: 79 70 65 2c 20 70 2d 3e 61 69 5f 70 72 6f 74 6f  ype, p->ai_proto
d3f0: 63 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 6c 69  col);.    if( li
d400: 73 74 65 6e 65 72 5b 6e 5d 3e 3d 30 20 29 7b 0a  stener[n]>=0 ){.
d410: 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 63        /* if we c
d420: 61 6e 27 74 20 74 65 72 6d 69 6e 61 74 65 20 6e  an't terminate n
d430: 69 63 65 6c 79 2c 20 61 74 20 6c 65 61 73 74 20  icely, at least 
d440: 61 6c 6c 6f 77 20 74 68 65 20 73 6f 63 6b 65 74  allow the socket
d450: 20 74 6f 20 62 65 20 72 65 75 73 65 64 20 2a 2f   to be reused */
d460: 0a 20 20 20 20 20 20 73 65 74 73 6f 63 6b 6f 70  .      setsockop
d470: 74 28 6c 69 73 74 65 6e 65 72 5b 6e 5d 2c 20 53  t(listener[n], S
d480: 4f 4c 5f 53 4f 43 4b 45 54 2c 20 53 4f 5f 52 45  OL_SOCKET, SO_RE
d490: 55 53 45 41 44 44 52 2c 26 6f 70 74 2c 20 73 69  USEADDR,&opt, si
d4a0: 7a 65 6f 66 28 6f 70 74 29 29 3b 0a 20 20 20 20  zeof(opt));.    
d4b0: 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 49    .#if defined(I
d4c0: 50 56 36 5f 56 36 4f 4e 4c 59 29 0a 20 20 20 20  PV6_V6ONLY).    
d4d0: 20 20 69 66 28 20 70 2d 3e 61 69 5f 66 61 6d 69    if( p->ai_fami
d4e0: 6c 79 3d 3d 41 46 5f 49 4e 45 54 36 20 29 7b 0a  ly==AF_INET6 ){.
d4f0: 20 20 20 20 20 20 20 20 69 6e 74 20 76 36 6f 6e          int v6on
d500: 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ly = 1;.        
d510: 73 65 74 73 6f 63 6b 6f 70 74 28 6c 69 73 74 65  setsockopt(liste
d520: 6e 65 72 5b 6e 5d 2c 20 49 50 50 52 4f 54 4f 5f  ner[n], IPPROTO_
d530: 49 50 56 36 2c 20 49 50 56 36 5f 56 36 4f 4e 4c  IPV6, IPV6_V6ONL
d540: 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y,.             
d550: 20 20 20 20 20 20 20 26 76 36 6f 6e 6c 79 2c 20         &v6only, 
d560: 73 69 7a 65 6f 66 28 76 36 6f 6e 6c 79 29 29 3b  sizeof(v6only));
d570: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
d580: 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28        .      if(
d590: 20 62 69 6e 64 28 6c 69 73 74 65 6e 65 72 5b 6e   bind(listener[n
d5a0: 5d 2c 20 70 2d 3e 61 69 5f 61 64 64 72 2c 20 70  ], p->ai_addr, p
d5b0: 2d 3e 61 69 5f 61 64 64 72 6c 65 6e 29 3c 30 20  ->ai_addrlen)<0 
d5c0: 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74  ){.        print
d5d0: 66 28 22 62 69 6e 64 20 66 61 69 6c 65 64 3a 20  f("bind failed: 
d5e0: 25 73 5c 6e 22 2c 20 73 74 72 65 72 72 6f 72 28  %s\n", strerror(
d5f0: 65 72 72 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20  errno));.       
d600: 20 63 6c 6f 73 65 28 6c 69 73 74 65 6e 65 72 5b   close(listener[
d610: 6e 5d 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  n]);.        con
d620: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
d630: 20 20 20 20 20 69 66 28 20 6c 69 73 74 65 6e 28       if( listen(
d640: 6c 69 73 74 65 6e 65 72 5b 6e 5d 2c 20 32 30 29  listener[n], 20)
d650: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  <0 ){.        pr
d660: 69 6e 74 66 28 22 6c 69 73 74 65 6e 28 29 20 66  intf("listen() f
d670: 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20 73 74  ailed: %s\n", st
d680: 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 29 3b 0a  rerror(errno));.
d690: 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 6c 69          close(li
d6a0: 73 74 65 6e 65 72 5b 6e 5d 29 3b 0a 20 20 20 20  stener[n]);.    
d6b0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
d6c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 2b 2b 3b      }.      n++;
d6d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
d6e0: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72   n==0 ){.    fpr
d6f0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 63 61  intf(stderr, "ca
d700: 6e 6e 6f 74 20 6f 70 65 6e 20 61 6e 79 20 73 6f  nnot open any so
d710: 63 6b 65 74 73 5c 6e 22 29 3b 0a 20 20 20 20 72  ckets\n");.    r
d720: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
d730: 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
d740: 69 66 28 20 6e 63 68 69 6c 64 72 65 6e 3e 4d 41  if( nchildren>MA
d750: 58 5f 50 41 52 41 4c 4c 45 4c 20 29 7b 0a 20 20  X_PARALLEL ){.  
d760: 20 20 20 20 2f 2a 20 53 6c 6f 77 20 64 6f 77 6e      /* Slow down
d770: 20 69 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   if connections 
d780: 61 72 65 20 61 72 72 69 76 69 6e 67 20 74 6f 6f  are arriving too
d790: 20 66 61 73 74 20 2a 2f 0a 20 20 20 20 20 20 73   fast */.      s
d7a0: 6c 65 65 70 28 20 6e 63 68 69 6c 64 72 65 6e 2d  leep( nchildren-
d7b0: 4d 41 58 5f 50 41 52 41 4c 4c 45 4c 20 29 3b 0a  MAX_PARALLEL );.
d7c0: 20 20 20 20 7d 0a 20 20 20 20 64 65 6c 61 79 2e      }.    delay.
d7d0: 74 76 5f 73 65 63 20 3d 20 36 30 3b 0a 20 20 20  tv_sec = 60;.   
d7e0: 20 64 65 6c 61 79 2e 74 76 5f 75 73 65 63 20 3d   delay.tv_usec =
d7f0: 20 30 3b 0a 20 20 20 20 46 44 5f 5a 45 52 4f 28   0;.    FD_ZERO(
d800: 26 72 65 61 64 66 64 73 29 3b 0a 20 20 20 20 66  &readfds);.    f
d810: 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
d820: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
d830: 20 6c 69 73 74 65 6e 65 72 5b 69 5d 3e 3d 30 20   listener[i]>=0 
d840: 29 3b 0a 20 20 20 20 20 20 46 44 5f 53 45 54 28  );.      FD_SET(
d850: 20 6c 69 73 74 65 6e 65 72 5b 69 5d 2c 20 26 72   listener[i], &r
d860: 65 61 64 66 64 73 29 3b 0a 20 20 20 20 20 20 69  eadfds);.      i
d870: 66 28 20 6c 69 73 74 65 6e 65 72 5b 69 5d 3e 6d  f( listener[i]>m
d880: 61 78 46 64 20 29 20 6d 61 78 46 64 20 3d 20 6c  axFd ) maxFd = l
d890: 69 73 74 65 6e 65 72 5b 69 5d 3b 0a 20 20 20 20  istener[i];.    
d8a0: 7d 0a 20 20 20 20 73 65 6c 65 63 74 28 20 6d 61  }.    select( ma
d8b0: 78 46 64 2b 31 2c 20 26 72 65 61 64 66 64 73 2c  xFd+1, &readfds,
d8c0: 20 30 2c 20 30 2c 20 26 64 65 6c 61 79 29 3b 0a   0, 0, &delay);.
d8d0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
d8e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
d8f0: 28 20 46 44 5f 49 53 53 45 54 28 6c 69 73 74 65  ( FD_ISSET(liste
d900: 6e 65 72 5b 69 5d 2c 20 26 72 65 61 64 66 64 73  ner[i], &readfds
d910: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e  ) ){.        len
d920: 61 64 64 72 20 3d 20 73 69 7a 65 6f 66 28 69 6e  addr = sizeof(in
d930: 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 63  addr);.        c
d940: 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 61 63 63 65  onnection = acce
d950: 70 74 28 6c 69 73 74 65 6e 65 72 5b 69 5d 2c 20  pt(listener[i], 
d960: 26 69 6e 61 64 64 72 2e 73 61 2c 20 26 6c 65 6e  &inaddr.sa, &len
d970: 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 69  addr);.        i
d980: 66 28 20 63 6f 6e 6e 65 63 74 69 6f 6e 3e 3d 30  f( connection>=0
d990: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68   ){.          ch
d9a0: 69 6c 64 20 3d 20 66 6f 72 6b 28 29 3b 0a 20 20  ild = fork();.  
d9b0: 20 20 20 20 20 20 20 20 69 66 28 20 63 68 69 6c          if( chil
d9c0: 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d!=0 ){.        
d9d0: 20 20 20 20 69 66 28 20 63 68 69 6c 64 3e 30 20      if( child>0 
d9e0: 29 20 6e 63 68 69 6c 64 72 65 6e 2b 2b 3b 0a 20  ) nchildren++;. 
d9f0: 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
da00: 28 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20 20  (connection);.  
da10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 72 69            /* pri
da20: 6e 74 66 28 22 73 75 62 70 72 6f 63 65 73 73 20  ntf("subprocess 
da30: 25 64 20 73 74 61 72 74 65 64 2e 2e 2e 5c 6e 22  %d started...\n"
da40: 2c 20 63 68 69 6c 64 29 3b 20 66 66 6c 75 73 68  , child); fflush
da50: 28 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 20  (stdout); */.   
da60: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
da70: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 45            int nE
da80: 72 72 20 3d 20 30 2c 20 66 64 3b 0a 20 20 20 20  rr = 0, fd;.    
da90: 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 30 29          close(0)
daa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 64  ;.            fd
dab0: 20 3d 20 64 75 70 28 63 6f 6e 6e 65 63 74 69 6f   = dup(connectio
dac0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
dad0: 69 66 28 20 66 64 21 3d 30 20 29 20 6e 45 72 72  if( fd!=0 ) nErr
dae0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
daf0: 63 6c 6f 73 65 28 31 29 3b 0a 20 20 20 20 20 20  close(1);.      
db00: 20 20 20 20 20 20 66 64 20 3d 20 64 75 70 28 63        fd = dup(c
db10: 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 20 20  onnection);.    
db20: 20 20 20 20 20 20 20 20 69 66 28 20 66 64 21 3d          if( fd!=
db30: 31 20 29 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  1 ) nErr++;.    
db40: 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 63 6f          close(co
db50: 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  nnection);.     
db60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 45         return nE
db70: 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rr;.          }.
db80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
db90: 7d 0a 20 20 20 20 20 20 2f 2a 20 42 75 72 79 20  }.      /* Bury 
dba0: 64 65 61 64 20 63 68 69 6c 64 72 65 6e 20 2a 2f  dead children */
dbb0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63  .      while( (c
dbc0: 68 69 6c 64 20 3d 20 77 61 69 74 70 69 64 28 30  hild = waitpid(0
dbd0: 2c 20 30 2c 20 57 4e 4f 48 41 4e 47 29 29 3e 30  , 0, WNOHANG))>0
dbe0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 70   ){.        /* p
dbf0: 72 69 6e 74 66 28 22 70 72 6f 63 65 73 73 20 25  rintf("process %
dc00: 64 20 65 6e 64 73 5c 6e 22 2c 20 63 68 69 6c 64  d ends\n", child
dc10: 29 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74  ); fflush(stdout
dc20: 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 63  ); */.        nc
dc30: 68 69 6c 64 72 65 6e 2d 2d 3b 0a 20 20 20 20 20  hildren--;.     
dc40: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
dc50: 2a 20 4e 4f 54 20 52 45 41 43 48 45 44 20 2a 2f  * NOT REACHED */
dc60: 20 20 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a    .  exit(1);.}.
dc70: 0a 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61  ..int main(int a
dc80: 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
dc90: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dcb0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
dcc0: 2f 0a 20 20 63 68 61 72 20 2a 7a 50 65 72 6d 55  /.  char *zPermU
dcd0: 73 65 72 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  ser = 0;      /*
dce0: 20 52 75 6e 20 64 61 65 6d 6f 6e 20 77 69 74 68   Run daemon with
dcf0: 20 74 68 69 73 20 75 73 65 72 27 73 20 70 65 72   this user's per
dd00: 6d 69 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 63 6f  missions */.  co
dd10: 6e 73 74 20 63 68 61 72 20 2a 7a 50 6f 72 74 20  nst char *zPort 
dd20: 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6d 70 6c 65  = 0;    /* Imple
dd30: 6d 65 6e 74 20 61 6e 20 48 54 54 50 20 73 65 72  ment an HTTP ser
dd40: 76 65 72 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  ver process */. 
dd50: 20 69 6e 74 20 75 73 65 43 68 72 6f 6f 74 4a 61   int useChrootJa
dd60: 69 6c 20 3d 20 31 3b 20 20 20 20 2f 2a 20 54 72  il = 1;    /* Tr
dd70: 75 65 20 74 6f 20 75 73 65 20 61 20 63 68 61 6e  ue to use a chan
dd80: 67 65 2d 72 6f 6f 74 20 6a 61 69 6c 20 2a 2f 0a  ge-root jail */.
dd90: 20 20 73 74 72 75 63 74 20 70 61 73 73 77 64 20    struct passwd 
dda0: 2a 70 77 64 20 3d 20 30 3b 20 20 20 2f 2a 20 49  *pwd = 0;   /* I
ddb0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
ddc0: 20 74 68 65 20 75 73 65 72 20 2a 2f 0a 0a 20 20   the user */..  
ddd0: 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 74 69  /* Record the ti
dde0: 6d 65 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69  me when processi
ddf0: 6e 67 20 62 65 67 69 6e 73 2e 0a 20 20 2a 2f 0a  ng begins..  */.
de00: 20 20 74 69 6d 65 28 26 62 65 67 69 6e 54 69 6d    time(&beginTim
de10: 65 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20  e);..  /* Parse 
de20: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67  command-line arg
de30: 75 6d 65 6e 74 73 0a 20 20 2a 2f 0a 20 20 77 68  uments.  */.  wh
de40: 69 6c 65 28 20 61 72 67 63 3e 31 20 26 26 20 61  ile( argc>1 && a
de50: 72 67 76 5b 31 5d 5b 30 5d 3d 3d 27 2d 27 20 29  rgv[1][0]=='-' )
de60: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  {.    char *z = 
de70: 61 72 67 76 5b 31 5d 3b 0a 20 20 20 20 63 68 61  argv[1];.    cha
de80: 72 20 2a 7a 41 72 67 20 3d 20 61 72 67 63 3e 3d  r *zArg = argc>=
de90: 33 20 3f 20 61 72 67 76 5b 32 5d 20 3a 20 22 30  3 ? argv[2] : "0
dea0: 22 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  ";.    if( z[0]=
deb0: 3d 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d  ='-' && z[1]=='-
dec0: 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28  ' ) z++;.    if(
ded0: 20 73 74 72 63 6d 70 28 7a 2c 22 2d 75 73 65 72   strcmp(z,"-user
dee0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  ")==0 ){.      z
def0: 50 65 72 6d 55 73 65 72 20 3d 20 7a 41 72 67 3b  PermUser = zArg;
df00: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
df10: 74 72 63 6d 70 28 7a 2c 22 2d 72 6f 6f 74 22 29  trcmp(z,"-root")
df20: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 52 6f  ==0 ){.      zRo
df30: 6f 74 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 7d  ot = zArg;.    }
df40: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
df50: 7a 2c 22 2d 6c 6f 67 66 69 6c 65 22 29 3d 3d 30  z,"-logfile")==0
df60: 20 29 7b 0a 20 20 20 20 20 20 7a 4c 6f 67 46 69   ){.      zLogFi
df70: 6c 65 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 7d  le = zArg;.    }
df80: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
df90: 7a 2c 22 2d 68 74 74 70 73 22 29 3d 3d 30 20 29  z,"-https")==0 )
dfa0: 7b 0a 20 20 20 20 20 20 75 73 65 48 74 74 70 73  {.      useHttps
dfb0: 20 3d 20 61 74 6f 69 28 7a 41 72 67 29 3b 0a 20   = atoi(zArg);. 
dfc0: 20 20 20 20 20 7a 48 74 74 70 20 3d 20 75 73 65       zHttp = use
dfd0: 48 74 74 70 73 20 3f 20 22 68 74 74 70 22 20 3a  Https ? "http" :
dfe0: 20 22 68 74 74 70 73 22 3b 0a 20 20 20 20 7d 65   "https";.    }e
dff0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
e000: 2c 20 22 2d 70 6f 72 74 22 29 3d 3d 30 20 29 7b  , "-port")==0 ){
e010: 0a 20 20 20 20 20 20 7a 50 6f 72 74 20 3d 20 7a  .      zPort = z
e020: 41 72 67 3b 0a 20 20 20 20 20 20 73 74 61 6e 64  Arg;.      stand
e030: 61 6c 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d  alone = 1;.    }
e040: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
e050: 7a 2c 20 22 2d 66 61 6d 69 6c 79 22 29 3d 3d 30  z, "-family")==0
e060: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74   ){.      if( st
e070: 72 63 6d 70 28 7a 41 72 67 2c 20 22 69 70 76 34  rcmp(zArg, "ipv4
e080: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
e090: 20 69 70 76 34 4f 6e 6c 79 20 3d 20 31 3b 0a 20   ipv4Only = 1;. 
e0a0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
e0b0: 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 69 70 76  trcmp(zArg, "ipv
e0c0: 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  6")==0 ){.      
e0d0: 20 20 69 70 76 36 4f 6e 6c 79 20 3d 20 31 3b 0a    ipv6Only = 1;.
e0e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e0f0: 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e       Malfunction
e100: 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 75 6e 6b 6e  (__LINE__, "unkn
e110: 6f 77 6e 20 49 50 20 70 72 6f 74 6f 63 6f 6c 3a  own IP protocol:
e120: 20 5b 25 73 5d 22 2c 20 7a 41 72 67 29 3b 0a 20   [%s]", zArg);. 
e130: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
e140: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22   if( strcmp(z, "
e150: 2d 6a 61 69 6c 22 29 3d 3d 30 20 29 7b 0a 20 20  -jail")==0 ){.  
e160: 20 20 20 20 69 66 28 20 61 74 6f 69 28 7a 41 72      if( atoi(zAr
e170: 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  g)==0 ){.       
e180: 20 75 73 65 43 68 72 6f 6f 74 4a 61 69 6c 20 3d   useChrootJail =
e190: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
e1a0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
e1b0: 28 7a 2c 20 22 2d 64 65 62 75 67 22 29 3d 3d 30  (z, "-debug")==0
e1c0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 74   ){.      if( at
e1d0: 6f 69 28 7a 41 72 67 29 20 29 7b 0a 20 20 20 20  oi(zArg) ){.    
e1e0: 20 20 20 20 75 73 65 54 69 6d 65 6f 75 74 20 3d      useTimeout =
e1f0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
e200: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d 61 6c  }else{.      Mal
e210: 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f  function(__LINE_
e220: 5f 2c 20 22 75 6e 6b 6e 6f 77 6e 20 61 72 67 75  _, "unknown argu
e230: 6d 65 6e 74 3a 20 5b 25 73 5d 22 2c 20 7a 29 3b  ment: [%s]", z);
e240: 0a 20 20 20 20 7d 0a 20 20 20 20 61 72 67 76 20  .    }.    argv 
e250: 2b 3d 20 32 3b 0a 20 20 20 20 61 72 67 63 20 2d  += 2;.    argc -
e260: 3d 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  = 2;.  }.  if( z
e270: 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Root==0 ){.    i
e280: 66 28 20 73 74 61 6e 64 61 6c 6f 6e 65 20 29 7b  f( standalone ){
e290: 0a 20 20 20 20 20 20 7a 52 6f 6f 74 20 3d 20 22  .      zRoot = "
e2a0: 2e 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  .";.    }else{. 
e2b0: 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e       Malfunction
e2c0: 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 6e 6f 20 2d  (__LINE__, "no -
e2d0: 2d 72 6f 6f 74 20 73 70 65 63 69 66 69 65 64 22  -root specified"
e2e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  );.    }.  }.  .
e2f0: 20 20 2f 2a 20 43 68 61 6e 67 65 20 64 69 72 65    /* Change dire
e300: 63 74 6f 72 69 65 73 20 74 6f 20 74 68 65 20 72  ctories to the r
e310: 6f 6f 74 20 6f 66 20 74 68 65 20 48 54 54 50 20  oot of the HTTP 
e320: 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 54 68 65  filesystem.  The
e330: 6e 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20  n.  ** create a 
e340: 63 68 72 6f 6f 74 20 6a 61 69 6c 20 74 68 65 72  chroot jail ther
e350: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68  e..  */.  if( ch
e360: 64 69 72 28 7a 52 6f 6f 74 29 21 3d 30 20 29 7b  dir(zRoot)!=0 ){
e370: 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e  .    Malfunction
e380: 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 63 61 6e 6e  (__LINE__, "cann
e390: 6f 74 20 63 68 61 6e 67 65 20 74 6f 20 64 69 72  ot change to dir
e3a0: 65 63 74 6f 72 79 20 5b 25 73 5d 22 2c 20 7a 52  ectory [%s]", zR
e3b0: 6f 6f 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  oot);.  }..  /* 
e3c0: 47 65 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  Get information 
e3d0: 61 62 6f 75 74 20 74 68 65 20 75 73 65 72 20 69  about the user i
e3e0: 66 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20  f available */. 
e3f0: 20 69 66 28 20 7a 50 65 72 6d 55 73 65 72 20 29   if( zPermUser )
e400: 20 70 77 64 20 3d 20 67 65 74 70 77 6e 61 6d 28   pwd = getpwnam(
e410: 7a 50 65 72 6d 55 73 65 72 29 3b 0a 0a 20 20 2f  zPermUser);..  /
e420: 2a 20 45 6e 74 65 72 20 74 68 65 20 63 68 72 6f  * Enter the chro
e430: 6f 74 20 6a 61 69 6c 20 69 66 20 72 65 71 75 65  ot jail if reque
e440: 73 74 65 64 20 2a 2f 20 20 0a 20 20 69 66 28 20  sted */  .  if( 
e450: 7a 50 65 72 6d 55 73 65 72 20 26 26 20 75 73 65  zPermUser && use
e460: 43 68 72 6f 6f 74 4a 61 69 6c 20 26 26 20 67 65  ChrootJail && ge
e470: 74 75 69 64 28 29 3d 3d 30 20 29 7b 0a 20 20 20  tuid()==0 ){.   
e480: 20 69 66 28 20 63 68 72 6f 6f 74 28 22 2e 22 29   if( chroot(".")
e490: 3c 30 20 29 7b 0a 20 20 20 20 20 20 4d 61 6c 66  <0 ){.      Malf
e4a0: 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f  unction(__LINE__
e4b0: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 72 65  , "unable to cre
e4c0: 61 74 65 20 63 68 72 6f 6f 74 20 6a 61 69 6c 22  ate chroot jail"
e4d0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
e4e0: 20 20 20 20 7a 52 6f 6f 74 20 3d 20 22 22 3b 0a      zRoot = "";.
e4f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
e500: 41 63 74 69 76 61 74 65 20 74 68 65 20 73 65 72  Activate the ser
e510: 76 65 72 2c 20 69 66 20 72 65 71 75 65 73 74 65  ver, if requeste
e520: 64 20 2a 2f 0a 20 20 69 66 28 20 7a 50 6f 72 74  d */.  if( zPort
e530: 20 26 26 20 68 74 74 70 5f 73 65 72 76 65 72 28   && http_server(
e540: 7a 50 6f 72 74 2c 20 30 29 20 29 7b 0a 20 20 20  zPort, 0) ){.   
e550: 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c   Malfunction(__L
e560: 49 4e 45 5f 5f 2c 20 22 66 61 69 6c 65 64 20 74  INE__, "failed t
e570: 6f 20 73 74 61 72 74 20 73 65 72 76 65 72 22 29  o start server")
e580: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 72 6f 70  ;.  }..  /* Drop
e590: 20 72 6f 6f 74 20 70 72 69 76 69 6c 65 67 65 73   root privileges
e5a0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 50 65  ..  */.  if( zPe
e5b0: 72 6d 55 73 65 72 20 29 7b 0a 20 20 20 20 69 66  rmUser ){.    if
e5c0: 28 20 70 77 64 20 29 7b 0a 20 20 20 20 20 20 73  ( pwd ){.      s
e5d0: 65 74 67 69 64 28 70 77 64 2d 3e 70 77 5f 67 69  etgid(pwd->pw_gi
e5e0: 64 29 3b 0a 20 20 20 20 20 20 73 65 74 75 69 64  d);.      setuid
e5f0: 28 70 77 64 2d 3e 70 77 5f 75 69 64 29 3b 0a 20  (pwd->pw_uid);. 
e600: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e610: 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49  Malfunction(__LI
e620: 4e 45 5f 5f 2c 20 22 6e 6f 20 73 75 63 68 20 75  NE__, "no such u
e630: 73 65 72 20 5b 25 73 5d 22 2c 20 7a 50 65 72 6d  ser [%s]", zPerm
e640: 55 73 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  User);.    }.  }
e650: 0a 20 20 69 66 28 20 67 65 74 75 69 64 28 29 3d  .  if( getuid()=
e660: 3d 30 20 29 7b 0a 20 20 20 20 4d 61 6c 66 75 6e  =0 ){.    Malfun
e670: 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20  ction(__LINE__, 
e680: 22 63 61 6e 6e 6f 74 20 72 75 6e 20 61 73 20 72  "cannot run as r
e690: 6f 6f 74 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  oot");.  }..  /*
e6a0: 20 47 65 74 20 74 68 65 20 49 50 20 61 64 64 72   Get the IP addr
e6b0: 65 73 73 20 66 72 6f 6d 20 77 68 65 6e 20 74 68  ess from when th
e6c0: 65 20 72 65 71 75 65 73 74 20 6f 72 69 67 69 6e  e request origin
e6d0: 61 74 65 73 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20  ates.  */.  {.  
e6e0: 20 20 61 64 64 72 65 73 73 20 72 65 6d 6f 74 65    address remote
e6f0: 41 64 64 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e  Addr;.    unsign
e700: 65 64 20 69 6e 74 20 73 69 7a 65 20 3d 20 73 69  ed int size = si
e710: 7a 65 6f 66 28 72 65 6d 6f 74 65 41 64 64 72 29  zeof(remoteAddr)
e720: 3b 0a 20 20 20 20 63 68 61 72 20 7a 48 6f 73 74  ;.    char zHost
e730: 5b 4e 49 5f 4d 41 58 48 4f 53 54 5d 3b 0a 20 20  [NI_MAXHOST];.  
e740: 20 20 69 66 28 20 67 65 74 70 65 65 72 6e 61 6d    if( getpeernam
e750: 65 28 30 2c 20 26 72 65 6d 6f 74 65 41 64 64 72  e(0, &remoteAddr
e760: 2e 73 61 2c 20 26 73 69 7a 65 29 3e 3d 30 20 29  .sa, &size)>=0 )
e770: 7b 0a 20 20 20 20 20 20 67 65 74 6e 61 6d 65 69  {.      getnamei
e780: 6e 66 6f 28 26 72 65 6d 6f 74 65 41 64 64 72 2e  nfo(&remoteAddr.
e790: 73 61 2c 20 73 69 7a 65 2c 20 7a 48 6f 73 74 2c  sa, size, zHost,
e7a0: 20 73 69 7a 65 6f 66 28 7a 48 6f 73 74 29 2c 20   sizeof(zHost), 
e7b0: 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
e7c0: 20 20 20 20 20 20 20 20 4e 49 5f 4e 55 4d 45 52          NI_NUMER
e7d0: 49 43 48 4f 53 54 29 3b 0a 20 20 20 20 20 20 7a  ICHOST);.      z
e7e0: 52 65 6d 6f 74 65 41 64 64 72 20 3d 20 53 74 72  RemoteAddr = Str
e7f0: 44 75 70 28 7a 48 6f 73 74 29 3b 0a 20 20 20 20  Dup(zHost);.    
e800: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63  }.  }..  /* Proc
e810: 65 73 73 20 74 68 65 20 69 6e 70 75 74 20 73 74  ess the input st
e820: 72 65 61 6d 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ream */.  for(i=
e830: 30 3b 20 69 3c 31 30 30 3b 20 69 2b 2b 29 7b 0a  0; i<100; i++){.
e840: 20 20 20 20 50 72 6f 63 65 73 73 4f 6e 65 52 65      ProcessOneRe
e850: 71 75 65 73 74 28 30 29 3b 0a 20 20 7d 0a 20 20  quest(0);.  }.  
e860: 50 72 6f 63 65 73 73 4f 6e 65 52 65 71 75 65 73  ProcessOneReques
e870: 74 28 31 29 3b 0a 20 20 65 78 69 74 28 30 29 3b  t(1);.  exit(0);
e880: 0a 7d 0a                                         .}.