Documentation Source Text

Hex Artifact Content
Login

Artifact f2fb2df974d6464930ccef49c8edbf75b0195b7e:


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 2c 20 6f 72 20 61 73 20 61 20 73 74 61 6e  td, or as a stan
0060: 64 2d 61 6c 6f 6e 65 20 73 65 72 76 65 72 0a 2a  d-alone server.*
0070: 2a 20 20 20 20 20 2a 20 4f 6e 65 20 70 72 6f 63  *     * One proc
0080: 65 73 73 20 70 65 72 20 72 65 71 75 65 73 74 0a  ess per request.
0090: 2a 2a 20 20 20 20 20 2a 20 44 65 6c 69 76 65 72  **     * Deliver
00a0: 20 73 74 61 74 69 63 20 63 6f 6e 74 65 6e 74 20   static content 
00b0: 6f 72 20 72 75 6e 20 43 47 49 0a 2a 2a 20 20 20  or run CGI.**   
00c0: 20 20 2a 20 56 69 72 74 75 61 6c 20 73 69 74 65    * Virtual site
00d0: 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 22  s based on the "
00e0: 48 6f 73 74 3a 22 20 70 72 6f 70 65 72 74 79 20  Host:" property 
00f0: 6f 66 20 74 68 65 20 48 54 54 50 20 68 65 61 64  of the HTTP head
0100: 65 72 0a 2a 2a 20 20 20 20 20 2a 20 52 75 6e 73  er.**     * Runs
0110: 20 69 6e 20 61 20 63 68 72 6f 6f 74 20 6a 61 69   in a chroot jai
0120: 6c 0a 2a 2a 20 20 20 20 20 2a 20 55 6e 69 66 69  l.**     * Unifi
0130: 65 64 20 6c 6f 67 20 66 69 6c 65 20 69 6e 20 61  ed log file in a
0140: 20 43 53 56 20 66 6f 72 6d 61 74 0a 2a 2a 20 20   CSV format.**  
0150: 20 20 20 2a 20 56 65 72 79 20 73 6d 61 6c 6c 20     * Very small 
0160: 63 6f 64 65 20 62 61 73 65 20 28 31 20 66 69 6c  code base (1 fil
0170: 65 29 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  e) to facilitate
0180: 20 73 65 63 75 72 69 74 79 20 61 75 64 69 74 69   security auditi
0190: 6e 67 0a 2a 2a 20 20 20 20 20 2a 20 53 69 6d 70  ng.**     * Simp
01a0: 6c 65 20 73 65 74 75 70 20 2d 20 6e 6f 20 63 6f  le setup - no co
01b0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65  nfiguration file
01c0: 73 20 74 6f 20 6d 65 73 73 20 77 69 74 68 2e 0a  s to mess with..
01d0: 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  ** .** This file
01e0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 73 6d   implements a sm
01f0: 61 6c 6c 20 61 6e 64 20 73 69 6d 70 6c 65 20 62  all and simple b
0200: 75 74 20 73 65 63 75 72 65 20 61 6e 64 20 65 66  ut secure and ef
0210: 66 65 63 74 69 76 65 20 77 65 62 0a 2a 2a 20 73  fective web.** s
0220: 65 72 76 65 72 2e 20 20 54 68 65 72 65 20 61 72  erver.  There ar
0230: 65 20 6e 6f 20 66 72 69 6c 6c 73 2e 20 20 41 6e  e no frills.  An
0240: 79 74 68 69 6e 67 20 74 68 61 74 20 63 6f 75 6c  ything that coul
0250: 64 20 62 65 20 72 65 61 73 6f 6e 61 62 6c 79 0a  d be reasonably.
0260: 2a 2a 20 6f 6d 69 74 74 65 64 20 68 61 73 20 62  ** omitted has b
0270: 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 74 75 70  een..**.** Setup
0280: 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   rules:.**.**   
0290: 20 28 31 29 20 4c 61 75 6e 63 68 20 61 73 20 72   (1) Launch as r
02a0: 6f 6f 74 20 66 72 6f 6d 20 69 6e 65 74 64 20 6c  oot from inetd l
02b0: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
02c0: 20 20 20 20 20 20 20 20 20 20 20 68 74 74 70 64             httpd
02d0: 20 2d 6c 6f 67 66 69 6c 65 20 6c 6f 67 66 69 6c   -logfile logfil
02e0: 65 20 2d 72 6f 6f 74 20 2f 68 6f 6d 65 2f 77 77  e -root /home/ww
02f0: 77 20 2d 75 73 65 72 20 6e 6f 62 6f 64 79 0a 2a  w -user nobody.*
0300: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 49 74 20 77  *.**        It w
0310: 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
0320: 79 20 63 68 72 6f 6f 74 20 74 6f 20 2f 68 6f 6d  y chroot to /hom
0330: 65 2f 77 77 77 20 61 6e 64 20 62 65 63 6f 6d 65  e/www and become
0340: 20 75 73 65 72 20 6e 6f 62 6f 64 79 2e 0a 2a 2a   user nobody..**
0350: 20 20 20 20 20 20 20 20 54 68 65 20 6c 6f 67 66          The logf
0360: 69 6c 65 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20  ile name should 
0370: 62 65 20 72 65 6c 61 74 69 76 65 20 74 6f 20 74  be relative to t
0380: 68 65 20 63 68 72 6f 6f 74 20 6a 61 69 6c 2e 0a  he chroot jail..
0390: 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 44 69 72  **.**    (2) Dir
03a0: 65 63 74 6f 72 69 65 73 20 6f 66 20 74 68 65 20  ectories of the 
03b0: 66 6f 72 6d 20 22 2a 2e 77 65 62 73 69 74 65 22  form "*.website"
03c0: 20 28 65 78 3a 20 77 77 77 5f 68 77 61 63 69 5f   (ex: www_hwaci_
03d0: 63 6f 6d 2e 77 65 62 73 69 74 65 29 0a 2a 2a 20  com.website).** 
03e0: 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 63         contain c
03f0: 6f 6e 74 65 6e 74 2e 20 20 54 68 65 20 64 69 72  ontent.  The dir
0400: 65 63 74 6f 72 79 20 69 73 20 63 68 6f 73 65 6e  ectory is chosen
0410: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 48 54   based on the HT
0420: 54 50 5f 48 4f 53 54 0a 2a 2a 20 20 20 20 20 20  TP_HOST.**      
0430: 20 20 72 65 71 75 65 73 74 20 68 65 61 64 65 72    request header
0440: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
0450: 6f 20 48 54 54 50 5f 48 4f 53 54 20 68 65 61 64  o HTTP_HOST head
0460: 65 72 20 6f 72 20 69 66 20 74 68 65 0a 2a 2a 20  er or if the.** 
0470: 20 20 20 20 20 20 20 63 6f 72 72 65 73 70 6f 6e         correspon
0480: 64 69 6e 67 20 68 6f 73 74 20 64 69 72 65 63 74  ding host direct
0490: 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ory does not exi
04a0: 73 74 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  st, then the.** 
04b0: 20 20 20 20 20 20 20 22 64 65 66 61 75 6c 74 2e         "default.
04c0: 77 65 62 73 69 74 65 22 20 69 73 20 75 73 65 64  website" is used
04d0: 2e 20 20 49 66 20 74 68 65 20 48 54 54 50 5f 48  .  If the HTTP_H
04e0: 4f 53 54 20 68 65 61 64 65 72 20 63 6f 6e 74 61  OST header conta
04f0: 69 6e 73 20 61 6e 79 0a 2a 2a 20 20 20 20 20 20  ins any.**      
0500: 20 20 63 68 61 72 61 74 65 72 73 20 6f 74 68 65    charaters othe
0510: 72 20 74 68 61 6e 20 5b 61 2d 7a 41 2d 5a 30 2d  r than [a-zA-Z0-
0520: 39 5f 2e 2c 2a 7e 2f 5d 20 74 68 65 6e 20 61 20  9_.,*~/] then a 
0530: 34 30 33 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20  403 error is.** 
0540: 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 64         generated
0550: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 41  ..**.**    (3) A
0560: 6e 79 20 66 69 6c 65 20 6f 72 20 64 69 72 65 63  ny file or direc
0570: 74 6f 72 79 20 77 68 6f 73 65 20 6e 61 6d 65 20  tory whose name 
0580: 62 65 67 69 6e 73 20 77 69 74 68 20 22 2e 22 20  begins with "." 
0590: 6f 72 20 22 2d 22 20 69 73 20 69 67 6e 6f 72 65  or "-" is ignore
05a0: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20  d..**.**    (4) 
05b0: 43 68 61 72 61 63 74 65 72 73 20 6f 74 68 65 72  Characters other
05c0: 20 74 68 61 6e 20 5b 30 2d 39 61 2d 7a 41 2d 5a   than [0-9a-zA-Z
05d0: 2c 2d 2e 2f 3a 5f 7e 5d 20 61 6e 64 20 61 6e 79  ,-./:_~] and any
05e0: 20 25 48 48 20 63 68 61 72 61 63 74 65 72 73 0a   %HH characters.
05f0: 2a 2a 20 20 20 20 20 20 20 20 65 73 63 61 70 65  **        escape
0600: 73 20 69 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d  s in the filenam
0610: 65 20 61 72 65 20 61 6c 6c 20 74 72 61 6e 73 6c  e are all transl
0620: 61 74 65 64 20 69 6e 74 6f 20 22 5f 22 2e 20 20  ated into "_".  
0630: 54 68 69 73 20 69 73 0a 2a 2a 20 20 20 20 20 20  This is.**      
0640: 20 20 61 20 64 65 66 65 6e 73 65 20 61 67 61 69    a defense agai
0650: 6e 73 74 20 63 72 6f 73 73 2d 73 69 74 65 20 73  nst cross-site s
0660: 63 72 69 70 74 69 6e 67 20 61 74 74 61 63 6b 73  cripting attacks
0670: 20 61 6e 64 20 6f 74 68 65 72 20 6d 69 73 63 68   and other misch
0680: 69 65 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 35  ief..**.**    (5
0690: 29 20 45 78 65 63 75 74 61 62 6c 65 20 66 69 6c  ) Executable fil
06a0: 65 73 20 61 72 65 20 72 75 6e 20 61 73 20 43 47  es are run as CG
06b0: 49 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 66 69  I.  All other fi
06c0: 6c 65 73 20 61 72 65 20 64 65 6c 69 76 65 72 65  les are delivere
06d0: 64 0a 2a 2a 20 20 20 20 20 20 20 20 61 73 20 69  d.**        as i
06e0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 36 29 20  s..**.**    (6) 
06f0: 46 6f 72 20 53 53 4c 20 73 75 70 70 6f 72 74 20  For SSL support 
0700: 75 73 65 20 73 74 75 6e 6e 65 6c 20 61 6e 64 20  use stunnel and 
0710: 61 64 64 20 74 68 65 20 2d 68 74 74 70 73 20 31  add the -https 1
0720: 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a   option on the.*
0730: 2a 20 20 20 20 20 20 20 20 68 74 74 70 64 20 63  *        httpd c
0740: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 2e 0a 2a 2a 0a  ommand-line..**.
0750: 2a 2a 20 20 20 20 28 37 29 20 49 66 20 61 20 66  **    (7) If a f
0760: 69 6c 65 20 6e 61 6d 65 64 20 22 2d 61 75 74 68  ile named "-auth
0770: 22 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  " exists in the 
0780: 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61  same directory a
0790: 73 20 74 68 65 20 66 69 6c 65 20 74 6f 0a 2a 2a  s the file to.**
07a0: 20 20 20 20 20 20 20 20 62 65 20 72 75 6e 20 61          be run a
07b0: 73 20 43 47 49 20 6f 72 20 74 6f 20 62 65 20 64  s CGI or to be d
07c0: 65 6c 69 76 65 72 65 64 2c 20 74 68 65 6e 20 69  elivered, then i
07d0: 74 20 63 6f 6e 74 61 69 6e 73 20 69 6e 66 6f 72  t contains infor
07e0: 6d 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  mation.**       
07f0: 20 66 6f 72 20 48 54 54 50 20 42 61 73 69 63 20   for HTTP Basic 
0800: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 2e 20 20  authorization.  
0810: 53 65 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  See file format 
0820: 64 65 74 61 69 6c 73 20 62 65 6c 6f 77 2e 0a 2a  details below..*
0830: 2a 0a 2a 2a 20 20 20 20 28 38 29 20 54 6f 20 72  *.**    (8) To r
0840: 75 6e 20 61 73 20 61 20 73 74 61 6e 64 2d 61 6c  un as a stand-al
0850: 6f 6e 65 20 73 65 72 76 65 72 2c 20 73 69 6d 70  one server, simp
0860: 6c 79 20 61 64 64 20 74 68 65 20 22 2d 70 6f 72  ly add the "-por
0870: 74 20 4e 22 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  t N" command-lin
0880: 65 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 74 69  e.**        opti
0890: 6f 6e 20 74 6f 20 64 65 66 69 6e 65 20 77 68 69  on to define whi
08a0: 63 68 20 54 43 50 20 70 6f 72 74 20 74 6f 20 6c  ch TCP port to l
08b0: 69 73 74 65 6e 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  isten on..**.** 
08c0: 43 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 4f 70 74  Command-line Opt
08d0: 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 2d 2d 72  ions:.**.**  --r
08e0: 6f 6f 74 20 44 49 52 20 20 20 20 20 20 20 44 65  oot DIR       De
08f0: 66 69 6e 65 73 20 74 68 65 20 64 69 72 65 63 74  fines the direct
0900: 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ory that contain
0910: 73 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a  s the various.**
0920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0930: 20 20 20 24 48 4f 53 54 2e 77 65 62 73 69 74 65     $HOST.website
0940: 20 73 75 62 64 69 72 65 63 74 6f 72 69 65 73 2c   subdirectories,
0950: 20 65 61 63 68 20 63 6f 6e 74 61 69 6e 69 6e 67   each containing
0960: 20 77 65 62 20 63 6f 6e 74 65 6e 74 20 0a 2a 2a   web content .**
0970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0980: 20 20 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20     for a single 
0990: 76 69 72 74 75 61 6c 20 68 6f 73 74 2e 20 20 49  virtual host.  I
09a0: 66 20 6c 61 75 6e 63 68 65 64 20 61 73 20 72 6f  f launched as ro
09b0: 6f 74 20 61 6e 64 20 69 66 0a 2a 2a 20 20 20 20  ot and if.**    
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
09d0: 2d 2d 75 73 65 72 20 55 53 45 52 22 20 61 6c 73  --user USER" als
09e0: 6f 20 61 70 70 65 61 72 73 20 6f 6e 20 74 68 65  o appears on the
09f0: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 6e   command-line an
0a00: 64 20 69 66 0a 2a 2a 20 20 20 20 20 20 20 20 20  d if.**         
0a10: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 6a 61 69            "--jai
0a20: 6c 20 30 22 20 69 73 20 6f 6d 69 74 74 65 64 2c  l 0" is omitted,
0a30: 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
0a40: 73 20 72 75 6e 73 20 69 6e 20 61 20 63 68 72 6f  s runs in a chro
0a50: 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ot.**           
0a60: 20 20 20 20 20 20 20 20 6a 61 69 6c 20 72 6f 6f          jail roo
0a70: 74 65 64 20 61 74 20 74 68 69 73 20 64 69 72 65  ted at this dire
0a80: 63 74 6f 72 79 20 61 6e 64 20 75 6e 64 65 72 20  ctory and under 
0a90: 74 68 65 20 75 73 65 72 69 64 20 55 53 45 52 2e  the userid USER.
0aa0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0ab0: 20 20 20 20 20 20 54 68 69 73 20 6f 70 74 69 6f        This optio
0ac0: 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  n is required fo
0ad0: 72 20 78 69 6e 65 74 64 20 6c 61 75 6e 63 68 20  r xinetd launch 
0ae0: 62 75 74 20 64 65 66 61 75 6c 74 73 0a 2a 2a 20  but defaults.** 
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b00: 20 20 74 6f 20 22 2e 22 20 66 6f 72 20 61 20 73    to "." for a s
0b10: 74 61 6e 64 2d 61 6c 6f 6e 65 20 77 65 62 20 73  tand-alone web s
0b20: 65 72 76 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 2d 2d  erver..**.**  --
0b30: 75 73 65 72 20 55 53 45 52 20 20 20 20 20 20 44  user USER      D
0b40: 65 66 69 6e 65 20 74 68 65 20 75 73 65 72 20 75  efine the user u
0b50: 6e 64 65 72 20 77 68 69 63 68 20 74 68 65 20 70  nder which the p
0b60: 72 6f 63 65 73 73 20 73 68 6f 75 6c 64 20 72 75  rocess should ru
0b70: 6e 20 69 66 0a 2a 2a 20 20 20 20 20 20 20 20 20  n if.**         
0b80: 20 20 20 20 20 20 20 20 20 20 6f 72 69 67 69 6e            origin
0b90: 61 6c 6c 79 20 6c 61 75 6e 63 68 65 64 20 61 73  ally launched as
0ba0: 20 72 6f 6f 74 2e 20 20 54 68 69 73 20 70 72 6f   root.  This pro
0bb0: 63 65 73 73 20 77 69 6c 6c 20 72 65 66 75 73 65  cess will refuse
0bc0: 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   to.**          
0bd0: 20 20 20 20 20 20 20 20 20 72 75 6e 20 61 73 20           run as 
0be0: 72 6f 6f 74 20 28 66 6f 72 20 73 65 63 75 72 69  root (for securi
0bf0: 74 79 29 2e 20 20 49 66 20 74 68 69 73 20 6f 70  ty).  If this op
0c00: 74 69 6f 6e 20 69 73 20 6f 6d 69 74 74 65 64 20  tion is omitted 
0c10: 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
0c20: 20 20 20 20 20 20 20 20 20 74 68 65 20 70 72 6f           the pro
0c30: 63 65 73 73 20 69 73 20 6c 61 75 6e 63 68 65 64  cess is launched
0c40: 20 61 73 20 72 6f 6f 74 2c 20 69 74 20 77 69 6c   as root, it wil
0c50: 6c 20 61 62 6f 72 74 20 77 69 74 68 6f 75 74 0a  l abort without.
0c60: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0c70: 20 20 20 20 20 70 72 6f 63 65 73 73 69 6e 67 20       processing 
0c80: 61 6e 79 20 48 54 54 50 20 72 65 71 75 65 73 74  any HTTP request
0c90: 73 2e 0a 2a 2a 0a 2a 2a 20 20 2d 2d 6c 6f 67 66  s..**.**  --logf
0ca0: 69 6c 65 20 46 49 4c 45 20 20 20 41 70 70 65 6e  ile FILE   Appen
0cb0: 64 20 61 20 73 69 6e 67 6c 65 2d 6c 69 6e 65 2c  d a single-line,
0cc0: 20 43 53 56 2d 66 6f 72 6d 61 74 2c 20 6c 6f 67   CSV-format, log
0cd0: 20 66 69 6c 65 20 65 6e 74 72 79 20 74 6f 20 46   file entry to F
0ce0: 49 4c 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ILE.**          
0cf0: 20 20 20 20 20 20 20 20 20 66 6f 72 20 65 61 63           for eac
0d00: 68 20 48 54 54 50 20 72 65 71 75 65 73 74 2e 20  h HTTP request. 
0d10: 20 46 49 4c 45 20 73 68 6f 75 6c 64 20 62 65 20   FILE should be 
0d20: 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e  a full pathname.
0d30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0d40: 20 20 20 20 20 20 54 68 65 20 46 49 4c 45 20 6e        The FILE n
0d50: 61 6d 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  ame is interpret
0d60: 65 64 20 69 6e 73 69 64 65 20 74 68 65 20 63 68  ed inside the ch
0d70: 72 6f 6f 74 20 6a 61 69 6c 2e 20 20 54 68 65 0a  root jail.  The.
0d80: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0d90: 20 20 20 20 20 46 49 4c 45 20 6e 61 6d 65 20 69       FILE name i
0da0: 73 20 65 78 70 61 6e 64 65 64 20 75 73 69 6e 67  s expanded using
0db0: 20 73 74 72 66 74 69 6d 65 28 29 20 69 66 20 69   strftime() if i
0dc0: 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 20 20  t contains.**   
0dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0de0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 27 25 27  at least one '%'
0df0: 20 61 6e 64 20 69 73 20 6e 6f 74 20 74 6f 6f 20   and is not too 
0e00: 6c 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 2d 2d 68  long..**.**  --h
0e10: 74 74 70 73 20 20 20 20 20 20 20 20 20 20 49 6e  ttps          In
0e20: 64 69 63 61 74 65 73 20 74 68 61 74 20 69 6e 70  dicates that inp
0e30: 75 74 20 69 73 20 63 6f 6d 69 6e 67 20 6f 76 65  ut is coming ove
0e40: 72 20 53 53 4c 20 61 6e 64 20 69 73 20 62 65 69  r SSL and is bei
0e50: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ng.**           
0e60: 20 20 20 20 20 20 20 20 64 65 63 6f 64 65 64 20          decoded 
0e70: 75 70 73 74 72 65 61 6d 2c 20 70 65 72 68 61 70  upstream, perhap
0e80: 73 20 62 79 20 73 74 75 6e 6e 65 6c 2e 20 20 28  s by stunnel.  (
0e90: 54 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  This program.** 
0ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0eb0: 20 20 6f 6e 6c 79 20 75 6e 64 65 72 73 74 61 6e    only understan
0ec0: 64 73 20 70 6c 61 69 6e 74 65 78 74 2e 29 0a 2a  ds plaintext.).*
0ed0: 2a 0a 2a 2a 20 20 2d 2d 66 61 6d 69 6c 79 20 69  *.**  --family i
0ee0: 70 76 34 20 20 20 20 4f 6e 6c 79 20 61 63 63 65  pv4    Only acce
0ef0: 70 74 20 69 6e 70 75 74 20 66 72 6f 6d 20 49 50  pt input from IP
0f00: 56 34 20 6f 72 20 49 50 56 36 2c 20 72 65 73 70  V4 or IPV6, resp
0f10: 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 20 2d 2d  ectively..**  --
0f20: 66 61 6d 69 6c 79 20 69 70 76 36 20 20 20 20 54  family ipv6    T
0f30: 68 65 73 65 20 6f 70 74 69 6f 6e 73 20 61 72 65  hese options are
0f40: 20 6f 6e 6c 79 20 6d 65 61 6e 69 6e 67 66 75 6c   only meaningful
0f50: 20 69 66 20 61 6c 74 68 74 74 70 64 20 69 73 20   if althttpd is 
0f60: 72 75 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  run.**          
0f70: 20 20 20 20 20 20 20 20 20 61 73 20 61 20 73 74           as a st
0f80: 61 6e 64 2d 61 6c 6f 6e 65 20 73 65 72 76 65 72  and-alone server
0f90: 2e 0a 2a 2a 0a 2a 2a 20 20 2d 2d 6a 61 69 6c 20  ..**.**  --jail 
0fa0: 42 4f 4f 4c 45 41 4e 20 20 20 49 6e 64 69 63 61  BOOLEAN   Indica
0fb0: 74 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e  tes whether or n
0fc0: 6f 74 20 74 6f 20 66 6f 72 6d 20 61 20 63 68 72  ot to form a chr
0fd0: 6f 6f 74 20 6a 61 69 6c 20 69 66 20 0a 2a 2a 20  oot jail if .** 
0fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ff0: 20 20 69 6e 69 74 69 61 6c 6c 79 20 72 75 6e 20    initially run 
1000: 61 73 20 72 6f 6f 74 2e 20 20 54 68 65 20 64 65  as root.  The de
1010: 66 61 75 6c 74 20 69 73 20 74 72 75 65 2c 20 73  fault is true, s
1020: 6f 20 74 68 65 20 6f 6e 6c 79 0a 2a 2a 20 20 20  o the only.**   
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1040: 75 73 65 66 75 6c 20 76 61 72 69 61 6e 74 20 6f  useful variant o
1050: 66 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 69 73  f this option is
1060: 20 22 2d 2d 6a 61 69 6c 20 30 22 20 77 68 69 63   "--jail 0" whic
1070: 68 20 70 72 65 76 65 6e 74 73 0a 2a 2a 20 20 20  h prevents.**   
1080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1090: 74 68 65 20 66 6f 72 6d 61 74 69 6f 6e 20 6f 66  the formation of
10a0: 20 74 68 65 20 63 68 72 6f 6f 74 20 6a 61 69 6c   the chroot jail
10b0: 2e 0a 2a 2a 0a 2a 2a 20 20 2d 2d 64 65 62 75 67  ..**.**  --debug
10c0: 20 20 20 20 20 20 20 20 20 20 44 69 73 61 62 6c            Disabl
10d0: 65 73 20 69 6e 70 75 74 20 74 69 6d 65 6f 75 74  es input timeout
10e0: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 66  s.  This is usef
10f0: 75 6c 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ul for debugging
1100: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1110: 20 20 20 20 20 20 77 68 65 6e 20 69 6e 70 75 74        when input
1120: 73 20 69 73 20 62 65 69 6e 67 20 74 79 70 65 64  s is being typed
1130: 20 69 6e 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a   in manually..**
1140: 0a 2a 2a 20 43 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  .** Command-line
1150: 20 6f 70 74 69 6f 6e 73 20 63 61 6e 20 74 61 6b   options can tak
1160: 65 20 65 69 74 68 65 72 20 6f 6e 65 20 6f 72 20  e either one or 
1170: 74 77 6f 20 69 6e 69 74 69 61 6c 20 22 2d 22 20  two initial "-" 
1180: 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 20 53  characters..** S
1190: 6f 20 22 2d 2d 64 65 62 75 67 22 20 61 6e 64 20  o "--debug" and 
11a0: 22 2d 64 65 62 75 67 22 20 6d 65 61 6e 20 74 68  "-debug" mean th
11b0: 65 20 73 61 6d 65 20 74 68 69 6e 67 2c 20 66 6f  e same thing, fo
11c0: 72 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 0a 2a 2a  r example..**.**
11d0: 0a 2a 2a 20 53 65 63 75 72 69 74 79 20 46 65 61  .** Security Fea
11e0: 74 75 72 65 73 3a 0a 2a 2a 0a 2a 2a 20 28 31 29  tures:.**.** (1)
11f0: 20 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20 61    This program a
1200: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 70 75 74  utomatically put
1210: 73 20 69 74 73 65 6c 66 20 69 6e 73 69 64 65 20  s itself inside 
1220: 61 20 63 68 72 6f 6f 74 20 6a 61 69 6c 20 69 66  a chroot jail if
1230: 0a 2a 2a 20 20 20 20 20 20 69 74 20 63 61 6e 20  .**      it can 
1240: 61 6e 64 20 69 66 20 6e 6f 74 20 73 70 65 63 69  and if not speci
1250: 66 69 63 61 6c 6c 79 20 70 72 6f 68 69 62 69 74  fically prohibit
1260: 65 64 20 62 79 20 74 68 65 20 22 2d 2d 6a 61 69  ed by the "--jai
1270: 6c 20 30 22 0a 2a 2a 20 20 20 20 20 20 63 6f 6d  l 0".**      com
1280: 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand-line option
1290: 2e 20 20 54 68 65 20 72 6f 6f 74 20 6f 66 20 74  .  The root of t
12a0: 68 65 20 6a 61 69 6c 20 69 73 20 74 68 65 20 64  he jail is the d
12b0: 69 72 65 63 74 6f 72 79 20 74 68 61 74 0a 2a 2a  irectory that.**
12c0: 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 73 20 74        contains t
12d0: 68 65 20 76 61 72 69 6f 75 73 20 24 48 4f 53 54  he various $HOST
12e0: 2e 77 65 62 73 69 74 65 20 63 6f 6e 74 65 6e 74  .website content
12f0: 20 73 75 62 64 69 72 65 63 74 6f 72 69 65 73 2e   subdirectories.
1300: 0a 2a 2a 0a 2a 2a 20 28 32 29 20 20 4e 6f 20 69  .**.** (2)  No i
1310: 6e 70 75 74 20 69 73 20 72 65 61 64 20 77 68 69  nput is read whi
1320: 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
1330: 68 61 73 20 72 6f 6f 74 20 70 72 69 76 69 6c 65  has root privile
1340: 67 65 73 2e 20 20 52 6f 6f 74 0a 2a 2a 20 20 20  ges.  Root.**   
1350: 20 20 20 70 72 69 76 69 6c 65 67 65 73 20 61 72     privileges ar
1360: 65 20 64 72 6f 70 70 65 64 20 70 72 69 6f 72 20  e dropped prior 
1370: 74 6f 20 72 65 61 64 69 6e 67 20 61 6e 79 20 69  to reading any i
1380: 6e 70 75 74 20 28 62 75 74 20 61 66 74 65 72 20  nput (but after 
1390: 65 6e 74 65 72 69 6e 67 0a 2a 2a 20 20 20 20 20  entering.**     
13a0: 20 74 68 65 20 63 68 72 6f 6f 74 20 6a 61 69 6c   the chroot jail
13b0: 2c 20 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49  , of course).  I
13c0: 66 20 72 6f 6f 74 20 70 72 69 76 69 6c 65 67 65  f root privilege
13d0: 73 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70  s cannot be drop
13e0: 70 65 64 0a 2a 2a 20 20 20 20 20 20 28 66 6f 72  ped.**      (for
13f0: 20 65 78 61 6d 70 6c 65 20 62 65 63 61 75 73 65   example because
1400: 20 74 68 65 20 2d 2d 75 73 65 72 20 63 6f 6d 6d   the --user comm
1410: 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20  and-line option 
1420: 77 61 73 20 6f 6d 69 74 74 65 64 20 6f 72 0a 2a  was omitted or.*
1430: 2a 20 20 20 20 20 20 62 65 63 61 75 73 65 20 74  *      because t
1440: 68 65 20 75 73 65 72 20 73 70 65 63 69 66 69 65  he user specifie
1450: 64 20 62 79 20 74 68 65 20 2d 2d 75 73 65 72 20  d by the --user 
1460: 6f 70 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  option does not 
1470: 65 78 69 73 74 29 2c 20 0a 2a 2a 20 20 20 20 20  exist), .**     
1480: 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
1490: 73 20 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e  s aborts with an
14a0: 20 65 72 72 6f 72 20 70 72 69 6f 72 20 74 6f 20   error prior to 
14b0: 72 65 61 64 69 6e 67 20 61 6e 79 20 69 6e 70 75  reading any inpu
14c0: 74 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20 20 54 68  t..**.** (3)  Th
14d0: 65 20 6c 65 6e 67 74 68 20 6f 66 20 61 6e 20 48  e length of an H
14e0: 54 54 50 20 72 65 71 75 65 73 74 20 69 73 20 6c  TTP request is l
14f0: 69 6d 69 74 65 64 20 74 6f 20 4d 41 58 5f 43 4f  imited to MAX_CO
1500: 4e 54 45 4e 54 5f 4c 45 4e 47 54 48 20 62 79 74  NTENT_LENGTH byt
1510: 65 73 0a 2a 2a 20 20 20 20 20 20 28 64 65 66 61  es.**      (defa
1520: 75 6c 74 3a 20 32 35 30 20 6d 69 6c 6c 69 6f 6e  ult: 250 million
1530: 29 2e 20 20 41 6e 79 20 48 54 54 50 20 72 65 71  ).  Any HTTP req
1540: 75 65 73 74 20 6c 6f 6e 67 65 72 20 74 68 61 6e  uest longer than
1550: 20 74 68 69 73 20 66 61 69 6c 73 0a 2a 2a 20 20   this fails.**  
1560: 20 20 20 20 77 69 74 68 20 61 6e 20 65 72 72 6f      with an erro
1570: 72 2e 0a 2a 2a 0a 2a 2a 20 28 34 29 20 20 54 68  r..**.** (4)  Th
1580: 65 72 65 20 61 72 65 20 68 61 72 64 2d 63 6f 64  ere are hard-cod
1590: 65 64 20 74 69 6d 65 2d 6f 75 74 73 20 6f 6e 20  ed time-outs on 
15a0: 65 61 63 68 20 48 54 54 50 20 72 65 71 75 65 73  each HTTP reques
15b0: 74 2e 20 20 49 66 20 74 68 69 73 20 70 72 6f 63  t.  If this proc
15c0: 65 73 73 0a 2a 2a 20 20 20 20 20 20 77 61 69 74  ess.**      wait
15d0: 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74 68  s longer than th
15e0: 65 20 74 69 6d 65 6f 75 74 20 66 6f 72 20 74 68  e timeout for th
15f0: 65 20 63 6f 6d 70 6c 65 74 65 20 72 65 71 75 65  e complete reque
1600: 73 74 2c 20 6f 72 20 66 6f 72 20 43 47 49 0a 2a  st, or for CGI.*
1610: 2a 20 20 20 20 20 20 74 6f 20 66 69 6e 69 73 68  *      to finish
1620: 20 72 75 6e 6e 69 6e 67 2c 20 74 68 65 6e 20 74   running, then t
1630: 68 69 73 20 70 72 6f 63 65 73 73 20 61 62 6f 72  his process abor
1640: 74 73 2e 20 20 28 54 68 65 20 74 69 6d 65 6f 75  ts.  (The timeou
1650: 74 20 66 65 61 74 75 72 65 0a 2a 2a 20 20 20 20  t feature.**    
1660: 20 20 63 61 6e 20 62 65 20 64 69 73 61 62 6c 65    can be disable
1670: 64 20 75 73 69 6e 67 20 74 68 65 20 2d 2d 64 65  d using the --de
1680: 62 75 67 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  bug command-line
1690: 20 6f 70 74 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20   option.).**.** 
16a0: 28 35 29 20 20 49 66 20 74 68 65 20 48 54 54 50  (5)  If the HTTP
16b0: 5f 48 4f 53 54 20 72 65 71 75 65 73 74 20 68 65  _HOST request he
16c0: 61 64 65 72 20 63 6f 6e 74 61 69 6e 73 20 63 68  ader contains ch
16d0: 61 72 61 63 74 65 72 73 20 6f 74 68 65 72 20 74  aracters other t
16e0: 68 61 6e 0a 2a 2a 20 20 20 20 20 20 5b 30 2d 39  han.**      [0-9
16f0: 61 2d 7a 41 2d 5a 2c 2d 2e 2f 3a 5f 7e 5d 20 74  a-zA-Z,-./:_~] t
1700: 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20 72  hen the entire r
1710: 65 71 75 65 73 74 20 69 73 20 72 65 6a 65 63 74  equest is reject
1720: 65 64 2e 0a 2a 2a 0a 2a 2a 20 28 36 29 20 20 41  ed..**.** (6)  A
1730: 6e 79 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  ny characters in
1740: 20 74 68 65 20 55 52 49 20 70 61 74 68 6e 61 6d   the URI pathnam
1750: 65 20 6f 74 68 65 72 20 74 68 61 6e 20 5b 30 2d  e other than [0-
1760: 39 61 2d 7a 41 2d 5a 2c 2d 2e 2f 3a 5f 7e 5d 0a  9a-zA-Z,-./:_~].
1770: 2a 2a 20 20 20 20 20 20 61 72 65 20 63 6f 6e 76  **      are conv
1780: 65 72 74 65 64 20 69 6e 74 6f 20 22 5f 22 2e 20  erted into "_". 
1790: 20 54 68 69 73 20 61 70 70 6c 69 65 73 20 74 6f   This applies to
17a0: 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f 6e   the pathname on
17b0: 6c 79 2c 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  ly, not.**      
17c0: 74 6f 20 74 68 65 20 71 75 65 72 79 20 70 61 72  to the query par
17d0: 61 6d 65 74 65 72 73 20 6f 72 20 66 72 61 67 6d  ameters or fragm
17e0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 28 37 29 20 20  ent..**.** (7)  
17f0: 49 66 20 74 68 65 20 66 69 72 73 74 20 63 68 61  If the first cha
1800: 72 61 63 74 65 72 20 6f 66 20 61 6e 79 20 55 52  racter of any UR
1810: 49 20 70 61 74 68 6e 61 6d 65 20 63 6f 6d 70 6f  I pathname compo
1820: 6e 65 6e 74 20 69 73 20 22 2e 22 20 6f 72 20 22  nent is "." or "
1830: 2d 22 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e 20  -".**      then 
1840: 61 20 34 30 34 20 4e 6f 74 20 46 6f 75 6e 64 20  a 404 Not Found 
1850: 72 65 70 6c 79 20 69 73 20 67 65 6e 65 72 61 74  reply is generat
1860: 65 64 2e 20 20 54 68 69 73 20 70 72 65 76 65 6e  ed.  This preven
1870: 74 73 20 61 74 74 61 63 6b 73 0a 2a 2a 20 20 20  ts attacks.**   
1880: 20 20 20 73 75 63 68 20 61 73 20 69 6e 63 6c 75     such as inclu
1890: 64 69 6e 67 20 22 2e 2e 22 20 6f 72 20 22 2e 22  ding ".." or "."
18a0: 20 64 69 72 65 63 74 6f 72 79 20 65 6c 65 6d 65   directory eleme
18b0: 6e 74 73 20 69 6e 20 74 68 65 20 70 61 74 68 6e  nts in the pathn
18c0: 61 6d 65 0a 2a 2a 20 20 20 20 20 20 61 6e 64 20  ame.**      and 
18d0: 61 6c 6c 6f 77 73 20 70 6c 61 63 69 6e 67 20 66  allows placing f
18e0: 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f  iles and directo
18f0: 72 69 65 73 20 69 6e 20 74 68 65 20 63 6f 6e 74  ries in the cont
1900: 65 6e 74 20 73 75 62 64 69 72 65 63 74 6f 72 79  ent subdirectory
1910: 0a 2a 2a 20 20 20 20 20 20 74 68 61 74 20 61 72  .**      that ar
1920: 65 20 69 6e 76 69 73 69 62 6c 65 20 74 6f 20 61  e invisible to a
1930: 6c 6c 20 48 54 54 50 20 72 65 71 75 65 73 74 73  ll HTTP requests
1940: 2c 20 62 79 20 6d 61 6b 69 6e 67 20 74 68 65 20  , by making the 
1950: 66 69 72 73 74 20 0a 2a 2a 20 20 20 20 20 20 63  first .**      c
1960: 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20  haracter of the 
1970: 66 69 6c 65 20 6f 72 20 73 75 62 64 69 72 65 63  file or subdirec
1980: 74 6f 72 79 20 6e 61 6d 65 20 22 2d 22 20 6f 72  tory name "-" or
1990: 20 22 2e 22 2e 0a 2a 2a 0a 2a 2a 20 28 38 29 20   "."..**.** (8) 
19a0: 20 54 68 65 20 72 65 71 75 65 73 74 20 55 52 49   The request URI
19b0: 20 6d 75 73 74 20 62 65 67 69 6e 20 77 69 74 68   must begin with
19c0: 20 22 2f 22 20 6f 72 20 65 6c 73 65 20 61 20 34   "/" or else a 4
19d0: 30 34 20 65 72 72 6f 72 20 69 73 20 67 65 6e 65  04 error is gene
19e0: 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 28 39 29  rated..**.** (9)
19f0: 20 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20 6e    This program n
1a00: 65 76 65 72 20 73 65 74 73 20 74 68 65 20 76 61  ever sets the va
1a10: 6c 75 65 20 6f 66 20 61 6e 20 65 6e 76 69 72 6f  lue of an enviro
1a20: 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 74  nment variable t
1a30: 6f 20 61 0a 2a 2a 20 20 20 20 20 20 73 74 72 69  o a.**      stri
1a40: 6e 67 20 74 68 61 74 20 62 65 67 69 6e 73 20 77  ng that begins w
1a50: 69 74 68 20 22 28 29 20 7b 22 2e 0a 2a 2a 0a 2a  ith "() {"..**.*
1a60: 2a 0a 2a 2a 20 42 61 73 69 63 20 41 75 74 68 6f  *.** Basic Autho
1a70: 72 69 7a 61 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20  rization:.**.** 
1a80: 49 66 20 74 68 65 20 66 69 6c 65 20 22 2d 61 75  If the file "-au
1a90: 74 68 22 20 65 78 69 73 74 73 20 69 6e 20 74 68  th" exists in th
1aa0: 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
1ab0: 20 61 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   as the content 
1ac0: 66 69 6c 65 0a 2a 2a 20 28 66 6f 72 20 62 6f 74  file.** (for bot
1ad0: 68 20 73 74 61 74 69 63 20 63 6f 6e 74 65 6e 74  h static content
1ae0: 20 61 6e 64 20 43 47 49 29 20 74 68 65 6e 20 69   and CGI) then i
1af0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69  t contains the i
1b00: 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 0a  nformation used.
1b10: 2a 2a 20 66 6f 72 20 62 61 73 69 63 20 61 75 74  ** for basic aut
1b20: 68 6f 72 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65  horization.  The
1b30: 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20   file format is 
1b40: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
1b50: 2a 20 20 20 20 2a 20 20 42 6c 61 6e 6b 20 6c 69  *    *  Blank li
1b60: 6e 65 73 20 61 6e 64 20 6c 69 6e 65 73 20 74 68  nes and lines th
1b70: 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 27 23  at begin with '#
1b80: 27 20 61 72 65 20 69 67 6e 6f 72 65 64 0a 2a 2a  ' are ignored.**
1b90: 20 20 20 20 2a 20 20 22 68 74 74 70 2d 72 65 64      *  "http-red
1ba0: 69 72 65 63 74 22 20 66 6f 72 63 65 73 20 61 20  irect" forces a 
1bb0: 72 65 64 69 72 65 63 74 20 74 6f 20 48 54 54 50  redirect to HTTP
1bc0: 53 20 69 66 20 6e 6f 74 20 74 68 65 72 65 20 61  S if not there a
1bd0: 6c 72 65 61 64 79 0a 2a 2a 20 20 20 20 2a 20 20  lready.**    *  
1be0: 22 68 74 74 70 73 2d 6f 6e 6c 79 22 20 64 69 73  "https-only" dis
1bf0: 61 6c 6c 6f 77 73 20 6f 70 65 72 61 74 69 6f 6e  allows operation
1c00: 20 69 6e 20 48 54 54 50 0a 2a 2a 20 20 20 20 2a   in HTTP.**    *
1c10: 20 20 22 75 73 65 72 20 4e 41 4d 45 20 4c 4f 47    "user NAME LOG
1c20: 49 4e 3a 50 41 53 53 57 4f 52 44 22 20 63 68 65  IN:PASSWORD" che
1c30: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 4c 4f  cks to see if LO
1c40: 47 49 4e 3a 50 41 53 53 57 4f 52 44 20 0a 2a 2a  GIN:PASSWORD .**
1c50: 20 20 20 20 20 20 20 61 75 74 68 6f 72 69 7a 61         authoriza
1c60: 74 69 6f 6e 20 63 72 65 64 65 6e 74 69 61 6c 73  tion credentials
1c70: 20 61 72 65 20 70 72 6f 76 69 64 65 64 2c 20 61   are provided, a
1c80: 6e 64 20 69 66 20 73 6f 20 73 65 74 73 20 74 68  nd if so sets th
1c90: 65 0a 2a 2a 20 20 20 20 20 20 20 52 45 4d 4f 54  e.**       REMOT
1ca0: 45 5f 55 53 45 52 20 74 6f 20 4e 41 4d 45 2e 0a  E_USER to NAME..
1cb0: 2a 2a 20 20 20 20 2a 20 20 22 72 65 61 6c 6d 20  **    *  "realm 
1cc0: 54 45 58 54 22 20 73 65 74 73 20 74 68 65 20 72  TEXT" sets the r
1cd0: 65 61 6c 6d 20 74 6f 20 54 45 58 54 2e 0a 2a 2a  ealm to TEXT..**
1ce0: 0a 2a 2a 20 54 68 65 72 65 20 63 61 6e 20 62 65  .** There can be
1cf0: 20 6d 75 6c 74 69 70 6c 65 20 22 75 73 65 72 22   multiple "user"
1d00: 20 6c 69 6e 65 73 2e 20 20 49 66 20 6e 6f 20 22   lines.  If no "
1d10: 75 73 65 72 22 20 6c 69 6e 65 20 6d 61 74 63 68  user" line match
1d20: 65 73 2c 20 74 68 65 0a 2a 2a 20 72 65 71 75 65  es, the.** reque
1d30: 73 74 20 66 61 69 6c 73 20 77 69 74 68 20 61 20  st fails with a 
1d40: 34 30 31 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 69  401 error..*/.#i
1d50: 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e  nclude <stdio.h>
1d60: 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65  .#include <ctype
1d70: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
1d80: 73 6c 6f 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  slog.h>.#include
1d90: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63   <stdlib.h>.#inc
1da0: 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68  lude <sys/stat.h
1db0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73  >.#include <unis
1dc0: 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  td.h>.#include <
1dd0: 66 63 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64  fcntl.h>.#includ
1de0: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e  e <string.h>.#in
1df0: 63 6c 75 64 65 20 3c 70 77 64 2e 68 3e 0a 23 69  clude <pwd.h>.#i
1e00: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65  nclude <sys/time
1e10: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
1e20: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
1e30: 75 64 65 20 3c 73 79 73 2f 73 6f 63 6b 65 74 2e  ude <sys/socket.
1e40: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
1e50: 2f 77 61 69 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  /wait.h>.#includ
1e60: 65 20 3c 6e 65 74 69 6e 65 74 2f 69 6e 2e 68 3e  e <netinet/in.h>
1e70: 0a 23 69 6e 63 6c 75 64 65 20 3c 61 72 70 61 2f  .#include <arpa/
1e80: 69 6e 65 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  inet.h>.#include
1e90: 20 3c 73 74 64 61 72 67 2e 68 3e 0a 23 69 6e 63   <stdarg.h>.#inc
1ea0: 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69  lude <time.h>.#i
1eb0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65  nclude <sys/time
1ec0: 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6e  s.h>.#include <n
1ed0: 65 74 64 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  etdb.h>.#include
1ee0: 20 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 6e 63 6c   <errno.h>.#incl
1ef0: 75 64 65 20 3c 73 79 73 2f 72 65 73 6f 75 72 63  ude <sys/resourc
1f00: 65 2e 68 3e 0a 23 69 66 64 65 66 20 6c 69 6e 75  e.h>.#ifdef linu
1f10: 78 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  x.#include <sys/
1f20: 73 65 6e 64 66 69 6c 65 2e 68 3e 0a 23 65 6e 64  sendfile.h>.#end
1f30: 69 66 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73  if.#include <ass
1f40: 65 72 74 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ert.h>../*.** Co
1f50: 6e 66 69 67 75 72 65 20 74 68 65 20 73 65 72 76  nfigure the serv
1f60: 65 72 20 62 79 20 73 65 74 74 69 6e 67 20 74 68  er by setting th
1f70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72  e following macr
1f80: 6f 73 20 61 6e 64 20 72 65 63 6f 6d 70 69 6c 69  os and recompili
1f90: 6e 67 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 44  ng..*/.#ifndef D
1fa0: 45 46 41 55 4c 54 5f 50 4f 52 54 0a 23 64 65 66  EFAULT_PORT.#def
1fb0: 69 6e 65 20 44 45 46 41 55 4c 54 5f 50 4f 52 54  ine DEFAULT_PORT
1fc0: 20 22 38 30 22 20 20 20 20 20 20 20 20 20 20 20   "80"           
1fd0: 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 54 43 50    /* Default TCP
1fe0: 20 70 6f 72 74 20 66 6f 72 20 48 54 54 50 20 2a   port for HTTP *
1ff0: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  /.#endif.#ifndef
2000: 20 4d 41 58 5f 43 4f 4e 54 45 4e 54 5f 4c 45 4e   MAX_CONTENT_LEN
2010: 47 54 48 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f  GTH.#define MAX_
2020: 43 4f 4e 54 45 4e 54 5f 4c 45 4e 47 54 48 20 32  CONTENT_LENGTH 2
2030: 35 30 30 30 30 30 30 30 20 20 2f 2a 20 4d 61 78  50000000  /* Max
2040: 20 6c 65 6e 67 74 68 20 6f 66 20 48 54 54 50 20   length of HTTP 
2050: 72 65 71 75 65 73 74 20 63 6f 6e 74 65 6e 74 20  request content 
2060: 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  */.#endif../*.**
2070: 20 57 65 20 72 65 63 6f 72 64 20 6d 6f 73 74 20   We record most 
2080: 6f 66 20 74 68 65 20 73 74 61 74 65 20 69 6e 66  of the state inf
2090: 6f 72 6d 61 74 69 6f 6e 20 61 73 20 67 6c 6f 62  ormation as glob
20a0: 61 6c 20 76 61 72 69 61 62 6c 65 73 2e 20 20 54  al variables.  T
20b0: 68 69 73 0a 2a 2a 20 73 61 76 65 73 20 68 61 76  his.** saves hav
20c0: 69 6e 67 20 74 6f 20 70 61 73 73 20 69 6e 66 6f  ing to pass info
20d0: 72 6d 61 74 69 6f 6e 20 74 6f 20 73 75 62 72 6f  rmation to subro
20e0: 75 74 69 6e 65 73 20 61 73 20 70 61 72 61 6d 65  utines as parame
20f0: 74 65 72 73 2c 20 61 6e 64 0a 2a 2a 20 6d 61 6b  ters, and.** mak
2100: 65 73 20 74 68 65 20 65 78 65 63 75 74 61 62 6c  es the executabl
2110: 65 20 73 6d 61 6c 6c 65 72 2e 2e 2e 0a 2a 2f 0a  e smaller....*/.
2120: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 52 6f  static char *zRo
2130: 6f 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ot = 0;         
2140: 20 2f 2a 20 52 6f 6f 74 20 64 69 72 65 63 74 6f   /* Root directo
2150: 72 79 20 6f 66 20 74 68 65 20 77 65 62 73 69 74  ry of the websit
2160: 65 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  e */.static char
2170: 20 2a 7a 54 6d 70 4e 61 6d 20 3d 20 30 3b 20 20   *zTmpNam = 0;  
2180: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2190: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
21a0: 65 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  e */.static char
21b0: 20 7a 54 6d 70 4e 61 6d 42 75 66 5b 35 30 30 5d   zTmpNamBuf[500]
21c0: 3b 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74  ;     /* Space t
21d0: 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 6d 70 6f  o hold the tempo
21e0: 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 20 2a 2f  rary filename */
21f0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 50  .static char *zP
2200: 72 6f 74 6f 63 6f 6c 20 3d 20 30 3b 20 20 20 20  rotocol = 0;    
2210: 20 20 2f 2a 20 54 68 65 20 70 72 6f 74 6f 63 6f    /* The protoco
2220: 6c 20 62 65 69 6e 67 20 75 73 69 6e 67 20 62 79  l being using by
2230: 20 74 68 65 20 62 72 6f 77 73 65 72 20 2a 2f 0a   the browser */.
2240: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 4d 65  static char *zMe
2250: 74 68 6f 64 20 3d 20 30 3b 20 20 20 20 20 20 20  thod = 0;       
2260: 20 2f 2a 20 54 68 65 20 6d 65 74 68 6f 64 2e 20   /* The method. 
2270: 20 4d 75 73 74 20 62 65 20 47 45 54 20 2a 2f 0a   Must be GET */.
2280: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 53 63  static char *zSc
2290: 72 69 70 74 20 3d 20 30 3b 20 20 20 20 20 20 20  ript = 0;       
22a0: 20 2f 2a 20 54 68 65 20 6f 62 6a 65 63 74 20 74   /* The object t
22b0: 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 73 74  o retrieve */.st
22c0: 61 74 69 63 20 63 68 61 72 20 2a 7a 52 65 61 6c  atic char *zReal
22d0: 53 63 72 69 70 74 20 3d 20 30 3b 20 20 20 20 2f  Script = 0;    /
22e0: 2a 20 54 68 65 20 6f 62 6a 65 63 74 20 74 6f 20  * The object to 
22f0: 72 65 74 72 69 65 76 65 2e 20 20 53 61 6d 65 20  retrieve.  Same 
2300: 61 73 20 7a 53 63 72 69 70 74 0a 20 20 20 20 20  as zScript.     
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2320: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65              ** e
2330: 78 63 65 70 74 20 6d 69 67 68 74 20 68 61 76 65  xcept might have
2340: 20 22 2f 69 6e 64 65 78 2e 68 74 6d 6c 22 20 61   "/index.html" a
2350: 70 70 65 6e 64 65 64 20 2a 2f 0a 73 74 61 74 69  ppended */.stati
2360: 63 20 63 68 61 72 20 2a 7a 48 6f 6d 65 20 3d 20  c char *zHome = 
2370: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  0;          /* T
2380: 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e  he directory con
2390: 74 61 69 6e 69 6e 67 20 63 6f 6e 74 65 6e 74 20  taining content 
23a0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
23b0: 7a 51 75 65 72 79 53 74 72 69 6e 67 20 3d 20 30  zQueryString = 0
23c0: 3b 20 20 20 2f 2a 20 54 68 65 20 71 75 65 72 79  ;   /* The query
23d0: 20 73 74 72 69 6e 67 20 6f 6e 20 74 68 65 20 65   string on the e
23e0: 6e 64 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 2a  nd of the name *
23f0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a  /.static char *z
2400: 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20  File = 0;       
2410: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 6e 61     /* The filena
2420: 6d 65 20 6f 66 20 74 68 65 20 6f 62 6a 65 63 74  me of the object
2430: 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a   to retrieve */.
2440: 73 74 61 74 69 63 20 69 6e 74 20 6c 65 6e 46 69  static int lenFi
2450: 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  le = 0;         
2460: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68   /* Length of th
2470: 65 20 7a 46 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a  e zFile name */.
2480: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 44 69  static char *zDi
2490: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
24a0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
24b0: 64 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 69 6e  directory holdin
24c0: 67 20 7a 46 69 6c 65 20 2a 2f 0a 73 74 61 74 69  g zFile */.stati
24d0: 63 20 63 68 61 72 20 2a 7a 50 61 74 68 49 6e 66  c char *zPathInf
24e0: 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 50  o = 0;      /* P
24f0: 61 72 74 20 6f 66 20 74 68 65 20 70 61 74 68 6e  art of the pathn
2500: 61 6d 65 20 70 61 73 74 20 74 68 65 20 66 69 6c  ame past the fil
2510: 65 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  e */.static char
2520: 20 2a 7a 41 67 65 6e 74 20 3d 20 30 3b 20 20 20   *zAgent = 0;   
2530: 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 79        /* What ty
2540: 70 65 20 69 66 20 62 72 6f 77 73 65 72 20 69 73  pe if browser is
2550: 20 6d 61 6b 69 6e 67 20 74 68 69 73 20 71 75 65   making this que
2560: 72 79 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  ry */.static cha
2570: 72 20 2a 7a 53 65 72 76 65 72 4e 61 6d 65 20 3d  r *zServerName =
2580: 20 30 3b 20 20 20 20 2f 2a 20 54 68 65 20 6e 61   0;    /* The na
2590: 6d 65 20 61 66 74 65 72 20 74 68 65 20 68 74 74  me after the htt
25a0: 70 3a 2f 2f 20 2a 2f 0a 73 74 61 74 69 63 20 63  p:// */.static c
25b0: 68 61 72 20 2a 7a 53 65 72 76 65 72 50 6f 72 74  har *zServerPort
25c0: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 54 68 65 20   = 0;    /* The 
25d0: 70 6f 72 74 20 6e 75 6d 62 65 72 20 2a 2f 0a 73  port number */.s
25e0: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 43 6f 6f  tatic char *zCoo
25f0: 6b 69 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  kie = 0;        
2600: 2f 2a 20 43 6f 6f 6b 69 65 73 20 72 65 70 6f 72  /* Cookies repor
2610: 74 65 64 20 77 69 74 68 20 74 68 65 20 72 65 71  ted with the req
2620: 75 65 73 74 20 2a 2f 0a 73 74 61 74 69 63 20 63  uest */.static c
2630: 68 61 72 20 2a 7a 48 74 74 70 48 6f 73 74 20 3d  har *zHttpHost =
2640: 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65   0;      /* Name
2650: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
2660: 65 20 77 65 62 20 62 72 6f 77 73 65 72 20 2a 2f  e web browser */
2670: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 52  .static char *zR
2680: 65 61 6c 50 6f 72 74 20 3d 20 30 3b 20 20 20 20  ealPort = 0;    
2690: 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 54 43    /* The real TC
26a0: 50 20 70 6f 72 74 20 77 68 65 6e 20 72 75 6e 6e  P port when runn
26b0: 69 6e 67 20 61 73 20 64 61 65 6d 6f 6e 20 2a 2f  ing as daemon */
26c0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 52  .static char *zR
26d0: 65 6d 6f 74 65 41 64 64 72 20 3d 20 30 3b 20 20  emoteAddr = 0;  
26e0: 20 20 2f 2a 20 49 50 20 61 64 64 72 65 73 73 20    /* IP address 
26f0: 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 20 2a  of the request *
2700: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a  /.static char *z
2710: 52 65 66 65 72 65 72 20 3d 20 30 3b 20 20 20 20  Referer = 0;    
2720: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2730: 65 20 70 61 67 65 20 74 68 61 74 20 72 65 66 65  e page that refe
2740: 72 65 64 20 74 6f 20 75 73 20 2a 2f 0a 73 74 61  red to us */.sta
2750: 74 69 63 20 63 68 61 72 20 2a 7a 41 63 63 65 70  tic char *zAccep
2760: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  t = 0;        /*
2770: 20 57 68 61 74 20 66 6f 72 6d 61 74 73 20 77 69   What formats wi
2780: 6c 6c 20 62 65 20 61 63 63 65 70 74 65 64 20 2a  ll be accepted *
2790: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a  /.static char *z
27a0: 41 63 63 65 70 74 45 6e 63 6f 64 69 6e 67 20 3d  AcceptEncoding =
27b0: 30 3b 20 2f 2a 20 67 7a 69 70 20 6f 72 20 64 65  0; /* gzip or de
27c0: 66 61 75 6c 74 20 2a 2f 0a 73 74 61 74 69 63 20  fault */.static 
27d0: 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 4c 65  char *zContentLe
27e0: 6e 67 74 68 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e  ngth = 0; /* Con
27f0: 74 65 6e 74 20 6c 65 6e 67 74 68 20 72 65 70 6f  tent length repo
2800: 72 74 65 64 20 69 6e 20 74 68 65 20 68 65 61 64  rted in the head
2810: 65 72 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  er */.static cha
2820: 72 20 2a 7a 43 6f 6e 74 65 6e 74 54 79 70 65 20  r *zContentType 
2830: 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 6e 74 65 6e  = 0;   /* Conten
2840: 74 20 74 79 70 65 20 72 65 70 6f 72 74 65 64 20  t type reported 
2850: 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  in the header */
2860: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 51  .static char *zQ
2870: 75 65 72 79 53 75 66 66 69 78 20 3d 20 30 3b 20  uerySuffix = 0; 
2880: 20 20 2f 2a 20 54 68 65 20 70 61 72 74 20 6f 66    /* The part of
2890: 20 74 68 65 20 55 52 4c 20 61 66 74 65 72 20 74   the URL after t
28a0: 68 65 20 66 69 72 73 74 20 3f 20 2a 2f 0a 73 74  he first ? */.st
28b0: 61 74 69 63 20 63 68 61 72 20 2a 7a 41 75 74 68  atic char *zAuth
28c0: 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20 2f  Type = 0;      /
28d0: 2a 20 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  * Authorization 
28e0: 74 79 70 65 20 28 62 61 73 69 63 20 6f 72 20 64  type (basic or d
28f0: 69 67 65 73 74 29 20 2a 2f 0a 73 74 61 74 69 63  igest) */.static
2900: 20 63 68 61 72 20 2a 7a 41 75 74 68 41 72 67 20   char *zAuthArg 
2910: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41 75  = 0;       /* Au
2920: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 76 61 6c 75  thorization valu
2930: 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  es */.static cha
2940: 72 20 2a 7a 52 65 6d 6f 74 65 55 73 65 72 20 3d  r *zRemoteUser =
2950: 20 30 3b 20 20 20 20 2f 2a 20 52 45 4d 4f 54 45   0;    /* REMOTE
2960: 5f 55 53 45 52 20 73 65 74 20 62 79 20 61 75 74  _USER set by aut
2970: 68 6f 72 69 7a 61 74 69 6f 6e 20 6d 6f 64 75 6c  horization modul
2980: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
2990: 6e 49 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nIn = 0;        
29a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
29b0: 6f 66 20 62 79 74 65 73 20 6f 66 20 69 6e 70 75  of bytes of inpu
29c0: 74 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  t */.static int 
29d0: 6e 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20  nOut = 0;       
29e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
29f0: 6f 66 20 62 79 74 65 73 20 6f 66 20 6f 75 74 70  of bytes of outp
2a00: 75 74 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  ut */.static cha
2a10: 72 20 7a 52 65 70 6c 79 53 74 61 74 75 73 5b 34  r zReplyStatus[4
2a20: 5d 3b 20 20 20 20 20 2f 2a 20 52 65 70 6c 79 20  ];     /* Reply 
2a30: 73 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 73  status code */.s
2a40: 74 61 74 69 63 20 69 6e 74 20 73 74 61 74 75 73  tatic int status
2a50: 53 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Sent = 0;       
2a60: 2f 2a 20 54 72 75 65 20 61 66 74 65 72 20 73 74  /* True after st
2a70: 61 74 75 73 20 6c 69 6e 65 20 69 73 20 73 65 6e  atus line is sen
2a80: 74 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  t */.static char
2a90: 20 2a 7a 4c 6f 67 46 69 6c 65 20 3d 20 30 3b 20   *zLogFile = 0; 
2aa0: 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 6f 20        /* Log to 
2ab0: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 73 74 61  this file */.sta
2ac0: 74 69 63 20 69 6e 74 20 64 65 62 75 67 46 6c 61  tic int debugFla
2ad0: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  g = 0;        /*
2ae0: 20 54 72 75 65 20 69 66 20 62 65 69 6e 67 20 64   True if being d
2af0: 65 62 75 67 67 65 64 20 2a 2f 0a 73 74 61 74 69  ebugged */.stati
2b00: 63 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c  c struct timeval
2b10: 20 62 65 67 69 6e 54 69 6d 65 3b 20 2f 2a 20 54   beginTime; /* T
2b20: 69 6d 65 20 77 68 65 6e 20 74 68 69 73 20 70 72  ime when this pr
2b30: 6f 63 65 73 73 20 73 74 61 72 74 73 20 2a 2f 0a  ocess starts */.
2b40: 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65  static int close
2b50: 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 30 3b 20  Connection = 0; 
2b60: 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 6e 64   /* True to send
2b70: 20 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f   Connection: clo
2b80: 73 65 20 69 6e 20 72 65 70 6c 79 20 2a 2f 0a 73  se in reply */.s
2b90: 74 61 74 69 63 20 69 6e 74 20 6e 52 65 71 75 65  tatic int nReque
2ba0: 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
2bb0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 71  /* Number of req
2bc0: 75 65 73 74 73 20 70 72 6f 63 65 73 73 65 64 20  uests processed 
2bd0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 6d  */.static int om
2be0: 69 74 4c 6f 67 20 3d 20 30 3b 20 20 20 20 20 20  itLog = 0;      
2bf0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6d 61      /* Do not ma
2c00: 6b 65 20 6c 6f 67 66 69 6c 65 20 65 6e 74 72 69  ke logfile entri
2c10: 65 73 20 69 66 20 74 72 75 65 20 2a 2f 0a 73 74  es if true */.st
2c20: 61 74 69 63 20 69 6e 74 20 75 73 65 48 74 74 70  atic int useHttp
2c30: 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  s = 0;         /
2c40: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 48 54  * True to use HT
2c50: 54 50 53 3a 20 69 6e 73 74 65 61 64 20 6f 66 20  TPS: instead of 
2c60: 48 54 54 50 3a 20 2a 2f 0a 73 74 61 74 69 63 20  HTTP: */.static 
2c70: 63 68 61 72 20 2a 7a 48 74 74 70 20 3d 20 22 68  char *zHttp = "h
2c80: 74 74 70 22 3b 20 20 20 20 20 2f 2a 20 68 74 74  ttp";     /* htt
2c90: 70 20 6f 72 20 68 74 74 70 73 20 2a 2f 0a 73 74  p or https */.st
2ca0: 61 74 69 63 20 69 6e 74 20 75 73 65 54 69 6d 65  atic int useTime
2cb0: 6f 75 74 20 3d 20 31 3b 20 20 20 20 20 20 20 2f  out = 1;       /
2cc0: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 74 69  * True to use ti
2cd0: 6d 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  mes */.static in
2ce0: 74 20 73 74 61 6e 64 61 6c 6f 6e 65 20 3d 20 30  t standalone = 0
2cf0: 3b 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 20 61  ;       /* Run a
2d00: 73 20 61 20 73 74 61 6e 64 61 6c 6f 6e 65 20 73  s a standalone s
2d10: 65 72 76 65 72 20 28 6e 6f 20 69 6e 65 74 64 29  erver (no inetd)
2d20: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69   */.static int i
2d30: 70 76 36 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20  pv6Only = 0;    
2d40: 20 20 20 20 20 2f 2a 20 55 73 65 20 49 50 76 36       /* Use IPv6
2d50: 20 6f 6e 6c 79 20 2a 2f 0a 73 74 61 74 69 63 20   only */.static 
2d60: 69 6e 74 20 69 70 76 34 4f 6e 6c 79 20 3d 20 30  int ipv4Only = 0
2d70: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  ;         /* Use
2d80: 20 49 50 76 34 20 6f 6e 6c 79 20 2a 2f 0a 73 74   IPv4 only */.st
2d90: 61 74 69 63 20 73 74 72 75 63 74 20 72 75 73 61  atic struct rusa
2da0: 67 65 20 70 72 69 6f 72 53 65 6c 66 3b 20 20 2f  ge priorSelf;  /
2db0: 2a 20 50 72 65 76 69 6f 75 73 6c 79 20 72 65 70  * Previously rep
2dc0: 6f 72 74 20 53 45 4c 46 20 74 69 6d 65 20 2a 2f  ort SELF time */
2dd0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 72  .static struct r
2de0: 75 73 61 67 65 20 70 72 69 6f 72 43 68 69 6c 64  usage priorChild
2df0: 3b 20 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79 20  ; /* Previously 
2e00: 72 65 70 6f 72 74 20 43 48 49 4c 44 20 74 69 6d  report CHILD tim
2e10: 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 6f 75 62  e */../*.** Doub
2e20: 6c 65 20 61 6e 79 20 64 6f 75 62 6c 65 2d 71 75  le any double-qu
2e30: 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 20 69  ote characters i
2e40: 6e 20 61 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  n a string..*/.s
2e50: 74 61 74 69 63 20 63 68 61 72 20 2a 45 73 63 61  tatic char *Esca
2e60: 70 65 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  pe(char *z){.  i
2e70: 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e  nt i, j;.  int n
2e80: 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 63 68  ;.  char c;.  ch
2e90: 61 72 20 2a 7a 4f 75 74 3b 0a 20 20 66 6f 72 28  ar *zOut;.  for(
2ea0: 69 3d 30 3b 20 28 63 3d 7a 5b 69 5d 29 21 3d 30  i=0; (c=z[i])!=0
2eb0: 20 26 26 20 63 21 3d 27 22 27 3b 20 69 2b 2b 29   && c!='"'; i++)
2ec0: 7b 7d 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 20  {}.  if( c==0 ) 
2ed0: 72 65 74 75 72 6e 20 7a 3b 0a 20 20 6e 20 3d 20  return z;.  n = 
2ee0: 31 3b 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 28 63  1;.  for(i++; (c
2ef0: 3d 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b  =z[i])!=0; i++){
2f00: 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 6e 2b   if( c=='"' ) n+
2f10: 2b 3b 20 7d 0a 20 20 7a 4f 75 74 20 3d 20 6d 61  +; }.  zOut = ma
2f20: 6c 6c 6f 63 28 20 69 2b 6e 2b 31 20 29 3b 0a 20  lloc( i+n+1 );. 
2f30: 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 20 72   if( zOut==0 ) r
2f40: 65 74 75 72 6e 20 22 22 3b 0a 20 20 66 6f 72 28  eturn "";.  for(
2f50: 69 3d 6a 3d 30 3b 20 28 63 3d 7a 5b 69 5d 29 21  i=j=0; (c=z[i])!
2f60: 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 4f  =0; i++){.    zO
2f70: 75 74 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20  ut[j++] = c;.   
2f80: 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 7a 4f   if( c=='"' ) zO
2f90: 75 74 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d  ut[j++] = c;.  }
2fa0: 0a 20 20 7a 4f 75 74 5b 6a 5d 20 3d 20 30 3b 0a  .  zOut[j] = 0;.
2fb0: 20 20 72 65 74 75 72 6e 20 7a 4f 75 74 3b 0a 7d    return zOut;.}
2fc0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
2fd0: 61 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c  a struct timeval
2fe0: 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65 72   into an integer
2ff0: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
3000: 73 65 63 6f 6e 64 73 0a 2a 2f 0a 73 74 61 74 69  seconds.*/.stati
3010: 63 20 69 6e 74 20 74 76 6d 73 28 73 74 72 75 63  c int tvms(struc
3020: 74 20 74 69 6d 65 76 61 6c 20 2a 70 29 7b 0a 20  t timeval *p){. 
3030: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28 70 2d   return (int)(p-
3040: 3e 74 76 5f 73 65 63 2a 31 30 30 30 30 30 30 20  >tv_sec*1000000 
3050: 2b 20 70 2d 3e 74 76 5f 75 73 65 63 29 3b 0a 7d  + p->tv_usec);.}
3060: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 6e 20  ../*.** Make an 
3070: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6c 6f 67  entry in the log
3080: 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 20 48   file.  If the H
3090: 54 54 50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  TTP connection s
30a0: 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 63 6c 6f 73  hould be.** clos
30b0: 65 64 2c 20 74 68 65 6e 20 74 65 72 6d 69 6e 61  ed, then termina
30c0: 74 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  te this process.
30d0: 20 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75    Otherwise retu
30e0: 72 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rn..*/.static vo
30f0: 69 64 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28  id MakeLogEntry(
3100: 69 6e 74 20 65 78 69 74 43 6f 64 65 2c 20 69 6e  int exitCode, in
3110: 74 20 6c 69 6e 65 4e 75 6d 29 7b 0a 20 20 46 49  t lineNum){.  FI
3120: 4c 45 20 2a 6c 6f 67 3b 0a 20 20 69 66 28 20 7a  LE *log;.  if( z
3130: 54 6d 70 4e 61 6d 20 29 7b 0a 20 20 20 20 75 6e  TmpNam ){.    un
3140: 6c 69 6e 6b 28 7a 54 6d 70 4e 61 6d 29 3b 0a 20  link(zTmpNam);. 
3150: 20 7d 0a 20 20 69 66 28 20 7a 4c 6f 67 46 69 6c   }.  if( zLogFil
3160: 65 20 26 26 20 21 6f 6d 69 74 4c 6f 67 20 29 7b  e && !omitLog ){
3170: 0a 20 20 20 20 73 74 72 75 63 74 20 74 69 6d 65  .    struct time
3180: 76 61 6c 20 6e 6f 77 3b 0a 20 20 20 20 73 74 72  val now;.    str
3190: 75 63 74 20 74 6d 20 2a 70 54 6d 3b 0a 20 20 20  uct tm *pTm;.   
31a0: 20 73 74 72 75 63 74 20 72 75 73 61 67 65 20 73   struct rusage s
31b0: 65 6c 66 2c 20 63 68 69 6c 64 72 65 6e 3b 0a 20  elf, children;. 
31c0: 20 20 20 69 6e 74 20 77 61 69 74 53 74 61 74 75     int waitStatu
31d0: 73 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 52 4d  s;.    char *zRM
31e0: 20 3d 20 7a 52 65 6d 6f 74 65 55 73 65 72 20 3f   = zRemoteUser ?
31f0: 20 7a 52 65 6d 6f 74 65 55 73 65 72 20 3a 20 22   zRemoteUser : "
3200: 22 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69  ";.    char *zFi
3210: 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 73 69 7a 65  lename;.    size
3220: 5f 74 20 73 7a 3b 0a 20 20 20 20 63 68 61 72 20  _t sz;.    char 
3230: 7a 44 61 74 65 5b 32 30 30 5d 3b 0a 20 20 20 20  zDate[200];.    
3240: 63 68 61 72 20 7a 45 78 70 4c 6f 67 46 69 6c 65  char zExpLogFile
3250: 5b 35 30 30 5d 3b 0a 0a 20 20 20 20 69 66 28 20  [500];..    if( 
3260: 7a 53 63 72 69 70 74 3d 3d 30 20 29 20 7a 53 63  zScript==0 ) zSc
3270: 72 69 70 74 20 3d 20 22 22 3b 0a 20 20 20 20 69  ript = "";.    i
3280: 66 28 20 7a 52 65 61 6c 53 63 72 69 70 74 3d 3d  f( zRealScript==
3290: 30 20 29 20 7a 52 65 61 6c 53 63 72 69 70 74 20  0 ) zRealScript 
32a0: 3d 20 22 22 3b 0a 20 20 20 20 69 66 28 20 7a 52  = "";.    if( zR
32b0: 65 6d 6f 74 65 41 64 64 72 3d 3d 30 20 29 20 7a  emoteAddr==0 ) z
32c0: 52 65 6d 6f 74 65 41 64 64 72 20 3d 20 22 22 3b  RemoteAddr = "";
32d0: 0a 20 20 20 20 69 66 28 20 7a 48 74 74 70 48 6f  .    if( zHttpHo
32e0: 73 74 3d 3d 30 20 29 20 7a 48 74 74 70 48 6f 73  st==0 ) zHttpHos
32f0: 74 20 3d 20 22 22 3b 0a 20 20 20 20 69 66 28 20  t = "";.    if( 
3300: 7a 52 65 66 65 72 65 72 3d 3d 30 20 29 20 7a 52  zReferer==0 ) zR
3310: 65 66 65 72 65 72 20 3d 20 22 22 3b 0a 20 20 20  eferer = "";.   
3320: 20 69 66 28 20 7a 41 67 65 6e 74 3d 3d 30 20 29   if( zAgent==0 )
3330: 20 7a 41 67 65 6e 74 20 3d 20 22 22 3b 0a 20 20   zAgent = "";.  
3340: 20 20 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26    gettimeofday(&
3350: 6e 6f 77 2c 20 30 29 3b 0a 20 20 20 20 70 54 6d  now, 0);.    pTm
3360: 20 3d 20 6c 6f 63 61 6c 74 69 6d 65 28 26 6e 6f   = localtime(&no
3370: 77 2e 74 76 5f 73 65 63 29 3b 0a 20 20 20 20 73  w.tv_sec);.    s
3380: 74 72 66 74 69 6d 65 28 7a 44 61 74 65 2c 20 73  trftime(zDate, s
3390: 69 7a 65 6f 66 28 7a 44 61 74 65 29 2c 20 22 25  izeof(zDate), "%
33a0: 59 2d 25 6d 2d 25 64 20 25 48 3a 25 4d 3a 25 53  Y-%m-%d %H:%M:%S
33b0: 22 2c 20 70 54 6d 29 3b 0a 20 20 20 20 73 7a 20  ", pTm);.    sz 
33c0: 3d 20 73 74 72 66 74 69 6d 65 28 7a 45 78 70 4c  = strftime(zExpL
33d0: 6f 67 46 69 6c 65 2c 20 73 69 7a 65 6f 66 28 7a  ogFile, sizeof(z
33e0: 45 78 70 4c 6f 67 46 69 6c 65 29 2c 20 7a 4c 6f  ExpLogFile), zLo
33f0: 67 46 69 6c 65 2c 20 70 54 6d 29 3b 0a 20 20 20  gFile, pTm);.   
3400: 20 69 66 28 20 73 7a 3e 30 20 26 26 20 73 7a 3c   if( sz>0 && sz<
3410: 73 69 7a 65 6f 66 28 7a 45 78 70 4c 6f 67 46 69  sizeof(zExpLogFi
3420: 6c 65 29 2d 32 20 29 7b 0a 20 20 20 20 20 20 7a  le)-2 ){.      z
3430: 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 45 78 70 4c  Filename = zExpL
3440: 6f 67 46 69 6c 65 3b 0a 20 20 20 20 7d 65 6c 73  ogFile;.    }els
3450: 65 7b 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61  e{.      zFilena
3460: 6d 65 20 3d 20 7a 4c 6f 67 46 69 6c 65 3b 0a 20  me = zLogFile;. 
3470: 20 20 20 7d 0a 20 20 20 20 77 61 69 74 70 69 64     }.    waitpid
3480: 28 2d 31 2c 20 26 77 61 69 74 53 74 61 74 75 73  (-1, &waitStatus
3490: 2c 20 57 4e 4f 48 41 4e 47 29 3b 0a 20 20 20 20  , WNOHANG);.    
34a0: 67 65 74 72 75 73 61 67 65 28 52 55 53 41 47 45  getrusage(RUSAGE
34b0: 5f 53 45 4c 46 2c 20 26 73 65 6c 66 29 3b 0a 20  _SELF, &self);. 
34c0: 20 20 20 67 65 74 72 75 73 61 67 65 28 52 55 53     getrusage(RUS
34d0: 41 47 45 5f 43 48 49 4c 44 52 45 4e 2c 20 26 63  AGE_CHILDREN, &c
34e0: 68 69 6c 64 72 65 6e 29 3b 0a 20 20 20 20 69 66  hildren);.    if
34f0: 28 20 28 6c 6f 67 20 3d 20 66 6f 70 65 6e 28 7a  ( (log = fopen(z
3500: 46 69 6c 65 6e 61 6d 65 2c 22 61 22 29 29 21 3d  Filename,"a"))!=
3510: 30 20 29 7b 0a 23 69 66 64 65 66 20 43 4f 4d 42  0 ){.#ifdef COMB
3520: 49 4e 45 44 5f 4c 4f 47 5f 46 4f 52 4d 41 54 0a  INED_LOG_FORMAT.
3530: 20 20 20 20 20 20 73 74 72 66 74 69 6d 65 28 7a        strftime(z
3540: 44 61 74 65 2c 20 73 69 7a 65 6f 66 28 7a 44 61  Date, sizeof(zDa
3550: 74 65 29 2c 20 22 25 64 2f 25 62 2f 25 59 3a 25  te), "%d/%b/%Y:%
3560: 48 3a 25 4d 3a 25 53 20 25 7a 22 2c 20 70 54 6d  H:%M:%S %z", pTm
3570: 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  );.      fprintf
3580: 28 6c 6f 67 2c 20 22 25 73 20 2d 20 2d 20 5b 25  (log, "%s - - [%
3590: 73 5d 20 5c 22 25 73 20 25 73 20 25 73 5c 22 20  s] \"%s %s %s\" 
35a0: 25 73 20 25 64 20 5c 22 25 73 5c 22 20 5c 22 25  %s %d \"%s\" \"%
35b0: 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  s\"\n",.        
35c0: 20 20 20 20 20 20 7a 52 65 6d 6f 74 65 41 64 64        zRemoteAdd
35d0: 72 2c 20 7a 44 61 74 65 2c 20 7a 4d 65 74 68 6f  r, zDate, zMetho
35e0: 64 2c 20 7a 53 63 72 69 70 74 2c 20 7a 50 72 6f  d, zScript, zPro
35f0: 74 6f 63 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20  tocol,.         
3600: 20 20 20 20 20 7a 52 65 70 6c 79 53 74 61 74 75       zReplyStatu
3610: 73 2c 20 6e 4f 75 74 2c 20 7a 52 65 66 65 72 65  s, nOut, zRefere
3620: 72 2c 20 7a 41 67 65 6e 74 29 3b 0a 23 65 6c 73  r, zAgent);.#els
3630: 65 0a 20 20 20 20 20 20 73 74 72 66 74 69 6d 65  e.      strftime
3640: 28 7a 44 61 74 65 2c 20 73 69 7a 65 6f 66 28 7a  (zDate, sizeof(z
3650: 44 61 74 65 29 2c 20 22 25 59 2d 25 6d 2d 25 64  Date), "%Y-%m-%d
3660: 20 25 48 3a 25 4d 3a 25 53 22 2c 20 70 54 6d 29   %H:%M:%S", pTm)
3670: 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 72  ;.      /* Log r
3680: 65 63 6f 72 64 20 66 69 6c 65 73 3a 0a 20 20 20  ecord files:.   
3690: 20 20 20 2a 2a 20 20 28 31 29 20 44 61 74 65 20     **  (1) Date 
36a0: 61 6e 64 20 74 69 6d 65 0a 20 20 20 20 20 20 2a  and time.      *
36b0: 2a 20 20 28 32 29 20 49 50 20 61 64 64 72 65 73  *  (2) IP addres
36c0: 73 0a 20 20 20 20 20 20 2a 2a 20 20 28 33 29 20  s.      **  (3) 
36d0: 55 52 4c 20 62 65 69 6e 67 20 61 63 63 65 73 73  URL being access
36e0: 65 64 0a 20 20 20 20 20 20 2a 2a 20 20 28 34 29  ed.      **  (4)
36f0: 20 52 65 66 65 72 65 72 0a 20 20 20 20 20 20 2a   Referer.      *
3700: 2a 20 20 28 35 29 20 52 65 70 6c 79 20 73 74 61  *  (5) Reply sta
3710: 74 75 73 0a 20 20 20 20 20 20 2a 2a 20 20 28 36  tus.      **  (6
3720: 29 20 42 79 74 65 73 20 72 65 63 65 69 76 65 64  ) Bytes received
3730: 0a 20 20 20 20 20 20 2a 2a 20 20 28 37 29 20 42  .      **  (7) B
3740: 79 74 65 73 20 73 65 6e 74 0a 20 20 20 20 20 20  ytes sent.      
3750: 2a 2a 20 20 28 38 29 20 53 65 6c 66 20 75 73 65  **  (8) Self use
3760: 72 20 74 69 6d 65 0a 20 20 20 20 20 20 2a 2a 20  r time.      ** 
3770: 20 28 39 29 20 53 65 6c 66 20 73 79 73 74 65 6d   (9) Self system
3780: 20 74 69 6d 65 0a 20 20 20 20 20 20 2a 2a 20 28   time.      ** (
3790: 31 30 29 20 43 68 69 6c 64 72 65 6e 20 75 73 65  10) Children use
37a0: 72 20 74 69 6d 65 0a 20 20 20 20 20 20 2a 2a 20  r time.      ** 
37b0: 28 31 31 29 20 43 68 69 6c 64 72 65 6e 20 73 79  (11) Children sy
37c0: 73 74 65 6d 20 74 69 6d 65 0a 20 20 20 20 20 20  stem time.      
37d0: 2a 2a 20 28 31 32 29 20 54 6f 74 61 6c 20 77 61  ** (12) Total wa
37e0: 6c 6c 2d 63 6c 6f 63 6b 20 74 69 6d 65 0a 20 20  ll-clock time.  
37f0: 20 20 20 20 2a 2a 20 28 31 33 29 20 52 65 71 75      ** (13) Requ
3800: 65 73 74 20 6e 75 6d 62 65 72 20 66 6f 72 20 73  est number for s
3810: 61 6d 65 20 54 43 50 2f 49 50 20 63 6f 6e 6e 65  ame TCP/IP conne
3820: 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 28  ction.      ** (
3830: 31 34 29 20 55 73 65 72 20 61 67 65 6e 74 0a 20  14) User agent. 
3840: 20 20 20 20 20 2a 2a 20 28 31 35 29 20 52 65 6d       ** (15) Rem
3850: 6f 74 65 20 75 73 65 72 0a 20 20 20 20 20 20 2a  ote user.      *
3860: 2a 20 28 31 36 29 20 42 79 74 65 73 20 6f 66 20  * (16) Bytes of 
3870: 55 52 4c 20 74 68 61 74 20 63 6f 72 72 65 73 70  URL that corresp
3880: 6f 6e 64 20 74 6f 20 74 68 65 20 53 43 52 49 50  ond to the SCRIP
3890: 54 5f 4e 41 4d 45 0a 20 20 20 20 20 20 2a 2a 20  T_NAME.      ** 
38a0: 28 31 37 29 20 4c 69 6e 65 20 6e 75 6d 62 65 72  (17) Line number
38b0: 20 69 6e 20 73 6f 75 72 63 65 20 66 69 6c 65 0a   in source file.
38c0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66        */.      f
38d0: 70 72 69 6e 74 66 28 6c 6f 67 2c 0a 20 20 20 20  printf(log,.    
38e0: 20 20 20 20 22 25 73 2c 25 73 2c 5c 22 25 73 3a      "%s,%s,\"%s:
38f0: 2f 2f 25 73 25 73 5c 22 2c 5c 22 25 73 5c 22 2c  //%s%s\",\"%s\",
3900: 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 25 73  ".           "%s
3910: 2c 25 64 2c 25 64 2c 25 64 2c 25 64 2c 25 64 2c  ,%d,%d,%d,%d,%d,
3920: 25 64 2c 25 64 2c 25 64 2c 5c 22 25 73 5c 22 2c  %d,%d,%d,\"%s\",
3930: 5c 22 25 73 5c 22 2c 25 64 2c 25 64 5c 6e 22 2c  \"%s\",%d,%d\n",
3940: 0a 20 20 20 20 20 20 20 20 7a 44 61 74 65 2c 20  .        zDate, 
3950: 7a 52 65 6d 6f 74 65 41 64 64 72 2c 20 7a 48 74  zRemoteAddr, zHt
3960: 74 70 2c 20 45 73 63 61 70 65 28 7a 48 74 74 70  tp, Escape(zHttp
3970: 48 6f 73 74 29 2c 20 45 73 63 61 70 65 28 7a 53  Host), Escape(zS
3980: 63 72 69 70 74 29 2c 0a 20 20 20 20 20 20 20 20  cript),.        
3990: 45 73 63 61 70 65 28 7a 52 65 66 65 72 65 72 29  Escape(zReferer)
39a0: 2c 20 7a 52 65 70 6c 79 53 74 61 74 75 73 2c 20  , zReplyStatus, 
39b0: 6e 49 6e 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20  nIn, nOut,.     
39c0: 20 20 20 74 76 6d 73 28 26 73 65 6c 66 2e 72 75     tvms(&self.ru
39d0: 5f 75 74 69 6d 65 29 20 2d 20 74 76 6d 73 28 26  _utime) - tvms(&
39e0: 70 72 69 6f 72 53 65 6c 66 2e 72 75 5f 75 74 69  priorSelf.ru_uti
39f0: 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 74 76 6d  me),.        tvm
3a00: 73 28 26 73 65 6c 66 2e 72 75 5f 73 74 69 6d 65  s(&self.ru_stime
3a10: 29 20 2d 20 74 76 6d 73 28 26 70 72 69 6f 72 53  ) - tvms(&priorS
3a20: 65 6c 66 2e 72 75 5f 73 74 69 6d 65 29 2c 0a 20  elf.ru_stime),. 
3a30: 20 20 20 20 20 20 20 74 76 6d 73 28 26 63 68 69         tvms(&chi
3a40: 6c 64 72 65 6e 2e 72 75 5f 75 74 69 6d 65 29 20  ldren.ru_utime) 
3a50: 2d 20 74 76 6d 73 28 26 70 72 69 6f 72 43 68 69  - tvms(&priorChi
3a60: 6c 64 2e 72 75 5f 75 74 69 6d 65 29 2c 0a 20 20  ld.ru_utime),.  
3a70: 20 20 20 20 20 20 74 76 6d 73 28 26 63 68 69 6c        tvms(&chil
3a80: 64 72 65 6e 2e 72 75 5f 73 74 69 6d 65 29 20 2d  dren.ru_stime) -
3a90: 20 74 76 6d 73 28 26 70 72 69 6f 72 43 68 69 6c   tvms(&priorChil
3aa0: 64 2e 72 75 5f 73 74 69 6d 65 29 2c 0a 20 20 20  d.ru_stime),.   
3ab0: 20 20 20 20 20 74 76 6d 73 28 26 6e 6f 77 29 20       tvms(&now) 
3ac0: 2d 20 74 76 6d 73 28 26 62 65 67 69 6e 54 69 6d  - tvms(&beginTim
3ad0: 65 29 2c 0a 20 20 20 20 20 20 20 20 6e 52 65 71  e),.        nReq
3ae0: 75 65 73 74 2c 20 45 73 63 61 70 65 28 7a 41 67  uest, Escape(zAg
3af0: 65 6e 74 29 2c 20 45 73 63 61 70 65 28 7a 52 4d  ent), Escape(zRM
3b00: 29 2c 0a 20 20 20 20 20 20 20 20 28 69 6e 74 29  ),.        (int)
3b10: 28 73 74 72 6c 65 6e 28 7a 48 74 74 70 29 2b 73  (strlen(zHttp)+s
3b20: 74 72 6c 65 6e 28 7a 48 74 74 70 48 6f 73 74 29  trlen(zHttpHost)
3b30: 2b 73 74 72 6c 65 6e 28 7a 52 65 61 6c 53 63 72  +strlen(zRealScr
3b40: 69 70 74 29 2b 33 29 2c 0a 20 20 20 20 20 20 20  ipt)+3),.       
3b50: 20 6c 69 6e 65 4e 75 6d 0a 20 20 20 20 20 20 29   lineNum.      )
3b60: 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 53 65 6c  ;.      priorSel
3b70: 66 20 3d 20 73 65 6c 66 3b 0a 20 20 20 20 20 20  f = self;.      
3b80: 70 72 69 6f 72 43 68 69 6c 64 20 3d 20 63 68 69  priorChild = chi
3b90: 6c 64 72 65 6e 3b 0a 20 20 20 20 20 20 62 65 67  ldren;.      beg
3ba0: 69 6e 54 69 6d 65 20 3d 20 6e 6f 77 3b 0a 23 65  inTime = now;.#e
3bb0: 6e 64 69 66 0a 20 20 20 20 20 20 66 63 6c 6f 73  ndif.      fclos
3bc0: 65 28 6c 6f 67 29 3b 0a 20 20 20 20 20 20 6e 49  e(log);.      nI
3bd0: 6e 20 3d 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20  n = nOut = 0;.  
3be0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 63 6c    }.  }.  if( cl
3bf0: 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 29 7b  oseConnection ){
3c00: 0a 20 20 20 20 65 78 69 74 28 65 78 69 74 43 6f  .    exit(exitCo
3c10: 64 65 29 3b 0a 20 20 7d 0a 20 20 73 74 61 74 75  de);.  }.  statu
3c20: 73 53 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  sSent = 0;.}../*
3c30: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d  .** Allocate mem
3c40: 6f 72 79 20 73 61 66 65 6c 79 0a 2a 2f 0a 73 74  ory safely.*/.st
3c50: 61 74 69 63 20 63 68 61 72 20 2a 53 61 66 65 4d  atic char *SafeM
3c60: 61 6c 6c 6f 63 28 20 69 6e 74 20 73 69 7a 65 20  alloc( int size 
3c70: 29 7b 0a 20 20 63 68 61 72 20 2a 70 3b 0a 0a 20  ){.  char *p;.. 
3c80: 20 70 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c   p = (char*)mall
3c90: 6f 63 28 73 69 7a 65 29 3b 0a 20 20 69 66 28 20  oc(size);.  if( 
3ca0: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 63  p==0 ){.    strc
3cb0: 70 79 28 7a 52 65 70 6c 79 53 74 61 74 75 73 2c  py(zReplyStatus,
3cc0: 20 22 39 39 38 22 29 3b 0a 20 20 20 20 4d 61 6b   "998");.    Mak
3cd0: 65 4c 6f 67 45 6e 74 72 79 28 31 2c 5f 5f 4c 49  eLogEntry(1,__LI
3ce0: 4e 45 5f 5f 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20  NE__);  /* LOG: 
3cf0: 4d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20  Malloc() failed 
3d00: 2a 2f 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  */.    exit(1);.
3d10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
3d20: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
3d30: 20 76 61 6c 75 65 20 6f 66 20 65 6e 76 69 72 6f   value of enviro
3d40: 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 7a  nment variable z
3d50: 56 61 72 20 74 6f 20 7a 56 61 6c 75 65 2e 0a 2a  Var to zValue..*
3d60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 65  /.static void Se
3d70: 74 45 6e 76 28 63 6f 6e 73 74 20 63 68 61 72 20  tEnv(const char 
3d80: 2a 7a 56 61 72 2c 20 63 6f 6e 73 74 20 63 68 61  *zVar, const cha
3d90: 72 20 2a 7a 56 61 6c 75 65 29 7b 0a 20 20 63 68  r *zValue){.  ch
3da0: 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6c 65 6e  ar *z;.  int len
3db0: 3b 0a 20 20 69 66 28 20 7a 56 61 6c 75 65 3d 3d  ;.  if( zValue==
3dc0: 30 20 29 20 7a 56 61 6c 75 65 3d 22 22 3b 0a 20  0 ) zValue="";. 
3dd0: 20 2f 2a 20 44 69 73 61 62 6c 65 20 61 6e 20 61   /* Disable an a
3de0: 74 74 65 6d 70 74 65 64 20 62 61 73 68 64 6f 6f  ttempted bashdoo
3df0: 72 20 61 74 74 61 63 6b 20 2a 2f 0a 20 20 69 66  r attack */.  if
3e00: 28 20 73 74 72 6e 63 6d 70 28 7a 56 61 6c 75 65  ( strncmp(zValue
3e10: 2c 22 28 29 20 7b 22 2c 34 29 3d 3d 30 20 29 20  ,"() {",4)==0 ) 
3e20: 7a 56 61 6c 75 65 20 3d 20 22 22 3b 0a 20 20 6c  zValue = "";.  l
3e30: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 56 61 72  en = strlen(zVar
3e40: 29 20 2b 20 73 74 72 6c 65 6e 28 7a 56 61 6c 75  ) + strlen(zValu
3e50: 65 29 20 2b 20 32 3b 0a 20 20 7a 20 3d 20 53 61  e) + 2;.  z = Sa
3e60: 66 65 4d 61 6c 6c 6f 63 28 6c 65 6e 29 3b 0a 20  feMalloc(len);. 
3e70: 20 73 70 72 69 6e 74 66 28 7a 2c 22 25 73 3d 25   sprintf(z,"%s=%
3e80: 73 22 2c 7a 56 61 72 2c 7a 56 61 6c 75 65 29 3b  s",zVar,zValue);
3e90: 0a 20 20 70 75 74 65 6e 76 28 7a 29 3b 0a 7d 0a  .  putenv(z);.}.
3ea0: 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
3eb0: 65 20 66 69 72 73 74 20 73 70 61 63 65 2d 64 65  e first space-de
3ec0: 6c 69 6d 69 74 65 64 20 74 6f 6b 65 6e 20 66 72  limited token fr
3ed0: 6f 6d 20 61 20 73 74 72 69 6e 67 20 61 6e 64 20  om a string and 
3ee0: 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  return.** a poin
3ef0: 74 65 72 20 74 6f 20 69 74 2e 20 20 41 64 64 20  ter to it.  Add 
3f00: 61 20 4e 55 4c 4c 20 74 6f 20 74 68 65 20 73 74  a NULL to the st
3f10: 72 69 6e 67 20 74 6f 20 74 65 72 6d 69 6e 61 74  ring to terminat
3f20: 65 20 74 68 65 20 74 6f 6b 65 6e 2e 0a 2a 2a 20  e the token..** 
3f30: 4d 61 6b 65 20 2a 7a 4c 65 66 74 4f 76 65 72 20  Make *zLeftOver 
3f40: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 74 61  point to the sta
3f50: 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 74  rt of the next t
3f60: 6f 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oken..*/.static 
3f70: 63 68 61 72 20 2a 47 65 74 46 69 72 73 74 45 6c  char *GetFirstEl
3f80: 65 6d 65 6e 74 28 63 68 61 72 20 2a 7a 49 6e 70  ement(char *zInp
3f90: 75 74 2c 20 63 68 61 72 20 2a 2a 7a 4c 65 66 74  ut, char **zLeft
3fa0: 4f 76 65 72 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Over){.  char *z
3fb0: 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 69 66  Result = 0;.  if
3fc0: 28 20 7a 49 6e 70 75 74 3d 3d 30 20 29 7b 0a 20  ( zInput==0 ){. 
3fd0: 20 20 20 69 66 28 20 7a 4c 65 66 74 4f 76 65 72     if( zLeftOver
3fe0: 20 29 20 2a 7a 4c 65 66 74 4f 76 65 72 20 3d 20   ) *zLeftOver = 
3ff0: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  0;.    return 0;
4000: 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 69 73  .  }.  while( is
4010: 73 70 61 63 65 28 2a 7a 49 6e 70 75 74 29 20 29  space(*zInput) )
4020: 7b 20 7a 49 6e 70 75 74 2b 2b 3b 20 7d 0a 20 20  { zInput++; }.  
4030: 7a 52 65 73 75 6c 74 20 3d 20 7a 49 6e 70 75 74  zResult = zInput
4040: 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 49 6e 70  ;.  while( *zInp
4050: 75 74 20 26 26 20 21 69 73 73 70 61 63 65 28 2a  ut && !isspace(*
4060: 7a 49 6e 70 75 74 29 20 29 7b 20 7a 49 6e 70 75  zInput) ){ zInpu
4070: 74 2b 2b 3b 20 7d 0a 20 20 69 66 28 20 2a 7a 49  t++; }.  if( *zI
4080: 6e 70 75 74 20 29 7b 0a 20 20 20 20 2a 7a 49 6e  nput ){.    *zIn
4090: 70 75 74 20 3d 20 30 3b 0a 20 20 20 20 7a 49 6e  put = 0;.    zIn
40a0: 70 75 74 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65  put++;.    while
40b0: 28 20 69 73 73 70 61 63 65 28 2a 7a 49 6e 70 75  ( isspace(*zInpu
40c0: 74 29 20 29 7b 20 7a 49 6e 70 75 74 2b 2b 3b 20  t) ){ zInput++; 
40d0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4c 65 66  }.  }.  if( zLef
40e0: 74 4f 76 65 72 20 29 7b 20 2a 7a 4c 65 66 74 4f  tOver ){ *zLeftO
40f0: 76 65 72 20 3d 20 7a 49 6e 70 75 74 3b 20 7d 0a  ver = zInput; }.
4100: 20 20 72 65 74 75 72 6e 20 7a 52 65 73 75 6c 74    return zResult
4110: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
4120: 61 20 63 6f 70 79 20 6f 66 20 61 20 73 74 72 69  a copy of a stri
4130: 6e 67 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  ng into memory o
4140: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
4150: 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  loc..*/.static c
4160: 68 61 72 20 2a 53 74 72 44 75 70 28 63 6f 6e 73  har *StrDup(cons
4170: 74 20 63 68 61 72 20 2a 7a 53 72 63 29 7b 0a 20  t char *zSrc){. 
4180: 20 63 68 61 72 20 2a 7a 44 65 73 74 3b 0a 20 20   char *zDest;.  
4190: 69 6e 74 20 73 69 7a 65 3b 0a 0a 20 20 69 66 28  int size;..  if(
41a0: 20 7a 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72   zSrc==0 ) retur
41b0: 6e 20 30 3b 0a 20 20 73 69 7a 65 20 3d 20 73 74  n 0;.  size = st
41c0: 72 6c 65 6e 28 7a 53 72 63 29 20 2b 20 31 3b 0a  rlen(zSrc) + 1;.
41d0: 20 20 7a 44 65 73 74 20 3d 20 28 63 68 61 72 2a    zDest = (char*
41e0: 29 53 61 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  )SafeMalloc( siz
41f0: 65 20 29 3b 0a 20 20 73 74 72 63 70 79 28 7a 44  e );.  strcpy(zD
4200: 65 73 74 2c 7a 53 72 63 29 3b 0a 20 20 72 65 74  est,zSrc);.  ret
4210: 75 72 6e 20 7a 44 65 73 74 3b 0a 7d 0a 73 74 61  urn zDest;.}.sta
4220: 74 69 63 20 63 68 61 72 20 2a 53 74 72 41 70 70  tic char *StrApp
4230: 65 6e 64 28 63 68 61 72 20 2a 7a 50 72 69 6f 72  end(char *zPrior
4240: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
4250: 65 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ep, const char *
4260: 7a 53 72 63 29 7b 0a 20 20 63 68 61 72 20 2a 7a  zSrc){.  char *z
4270: 44 65 73 74 3b 0a 20 20 69 6e 74 20 73 69 7a 65  Dest;.  int size
4280: 3b 0a 20 20 69 6e 74 20 6e 31 2c 20 6e 32 3b 0a  ;.  int n1, n2;.
4290: 0a 20 20 69 66 28 20 7a 53 72 63 3d 3d 30 20 29  .  if( zSrc==0 )
42a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
42b0: 20 7a 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74   zPrior==0 ) ret
42c0: 75 72 6e 20 53 74 72 44 75 70 28 7a 53 72 63 29  urn StrDup(zSrc)
42d0: 3b 0a 20 20 73 69 7a 65 20 3d 20 28 6e 31 3d 73  ;.  size = (n1=s
42e0: 74 72 6c 65 6e 28 7a 53 72 63 29 29 20 2b 20 28  trlen(zSrc)) + (
42f0: 6e 32 3d 73 74 72 6c 65 6e 28 7a 53 65 70 29 29  n2=strlen(zSep))
4300: 20 2b 20 73 74 72 6c 65 6e 28 7a 50 72 69 6f 72   + strlen(zPrior
4310: 29 20 2b 20 31 3b 0a 20 20 7a 44 65 73 74 20 3d  ) + 1;.  zDest =
4320: 20 28 63 68 61 72 2a 29 53 61 66 65 4d 61 6c 6c   (char*)SafeMall
4330: 6f 63 28 20 73 69 7a 65 20 29 3b 0a 20 20 73 74  oc( size );.  st
4340: 72 63 70 79 28 7a 44 65 73 74 2c 7a 50 72 69 6f  rcpy(zDest,zPrio
4350: 72 29 3b 0a 20 20 66 72 65 65 28 7a 50 72 69 6f  r);.  free(zPrio
4360: 72 29 3b 0a 20 20 73 74 72 63 70 79 28 26 7a 44  r);.  strcpy(&zD
4370: 65 73 74 5b 6e 31 5d 2c 7a 53 65 70 29 3b 0a 20  est[n1],zSep);. 
4380: 20 73 74 72 63 70 79 28 26 7a 44 65 73 74 5b 6e   strcpy(&zDest[n
4390: 31 2b 6e 32 5d 2c 7a 53 72 63 29 3b 0a 20 20 72  1+n2],zSrc);.  r
43a0: 65 74 75 72 6e 20 7a 44 65 73 74 3b 0a 7d 0a 0a  eturn zDest;.}..
43b0: 2f 2a 0a 2a 2a 20 42 72 65 61 6b 20 61 20 6c 69  /*.** Break a li
43c0: 6e 65 20 61 74 20 74 68 65 20 66 69 72 73 74 20  ne at the first 
43d0: 5c 6e 20 6f 72 20 5c 72 20 63 68 61 72 61 63 74  \n or \r charact
43e0: 65 72 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 61 74  er seen..*/.stat
43f0: 69 63 20 76 6f 69 64 20 52 65 6d 6f 76 65 4e 65  ic void RemoveNe
4400: 77 6c 69 6e 65 28 63 68 61 72 20 2a 7a 29 7b 0a  wline(char *z){.
4410: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
4420: 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a  urn;.  while( *z
4430: 20 26 26 20 2a 7a 21 3d 27 5c 6e 27 20 26 26 20   && *z!='\n' && 
4440: 2a 7a 21 3d 27 5c 72 27 20 29 7b 20 7a 2b 2b 3b  *z!='\r' ){ z++;
4450: 20 7d 0a 20 20 2a 7a 20 3d 20 30 3b 0a 7d 0a 0a   }.  *z = 0;.}..
4460: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 64 61  /*.** Print a da
4470: 74 65 20 74 61 67 20 69 6e 20 74 68 65 20 68 65  te tag in the he
4480: 61 64 65 72 2e 20 20 54 68 65 20 6e 61 6d 65 20  ader.  The name 
4490: 6f 66 20 74 68 65 20 74 61 67 20 69 73 20 7a 54  of the tag is zT
44a0: 61 67 2e 0a 2a 2a 20 54 68 65 20 64 61 74 65 20  ag..** The date 
44b0: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 66 72  is determined fr
44c0: 6f 6d 20 74 68 65 20 75 6e 69 78 20 74 69 6d 65  om the unix time
44d0: 73 74 61 6d 70 20 67 69 76 65 6e 2e 0a 2a 2f 0a  stamp given..*/.
44e0: 73 74 61 74 69 63 20 69 6e 74 20 44 61 74 65 54  static int DateT
44f0: 61 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ag(const char *z
4500: 54 61 67 2c 20 74 69 6d 65 5f 74 20 74 29 7b 0a  Tag, time_t t){.
4510: 20 20 73 74 72 75 63 74 20 74 6d 20 2a 74 6d 3b    struct tm *tm;
4520: 0a 20 20 63 68 61 72 20 7a 44 61 74 65 5b 31 30  .  char zDate[10
4530: 30 5d 3b 0a 20 20 74 6d 20 3d 20 67 6d 74 69 6d  0];.  tm = gmtim
4540: 65 28 26 74 29 3b 0a 20 20 73 74 72 66 74 69 6d  e(&t);.  strftim
4550: 65 28 7a 44 61 74 65 2c 20 73 69 7a 65 6f 66 28  e(zDate, sizeof(
4560: 7a 44 61 74 65 29 2c 20 22 25 61 2c 20 25 64 20  zDate), "%a, %d 
4570: 20 25 62 20 25 59 20 25 48 3a 25 4d 3a 25 53 20   %b %Y %H:%M:%S 
4580: 25 7a 22 2c 20 74 6d 29 3b 0a 20 20 72 65 74 75  %z", tm);.  retu
4590: 72 6e 20 70 72 69 6e 74 66 28 22 25 73 3a 20 25  rn printf("%s: %
45a0: 73 5c 72 5c 6e 22 2c 20 7a 54 61 67 2c 20 7a 44  s\r\n", zTag, zD
45b0: 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ate);.}../*.** P
45c0: 72 69 6e 74 20 74 68 65 20 66 69 72 73 74 20 6c  rint the first l
45d0: 69 6e 65 20 6f 66 20 61 20 72 65 73 70 6f 6e 73  ine of a respons
45e0: 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68  e followed by th
45f0: 65 20 73 65 72 76 65 72 20 74 79 70 65 2e 0a 2a  e server type..*
4600: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 74  /.static void St
4610: 61 72 74 52 65 73 70 6f 6e 73 65 28 63 6f 6e 73  artResponse(cons
4620: 74 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 43  t char *zResultC
4630: 6f 64 65 29 7b 0a 20 20 74 69 6d 65 5f 74 20 6e  ode){.  time_t n
4640: 6f 77 3b 0a 20 20 74 69 6d 65 28 26 6e 6f 77 29  ow;.  time(&now)
4650: 3b 0a 20 20 69 66 28 20 73 74 61 74 75 73 53 65  ;.  if( statusSe
4660: 6e 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e  nt ) return;.  n
4670: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 25  Out += printf("%
4680: 73 20 25 73 5c 72 5c 6e 22 2c 20 7a 50 72 6f 74  s %s\r\n", zProt
4690: 6f 63 6f 6c 2c 20 7a 52 65 73 75 6c 74 43 6f 64  ocol, zResultCod
46a0: 65 29 3b 0a 20 20 73 74 72 6e 63 70 79 28 7a 52  e);.  strncpy(zR
46b0: 65 70 6c 79 53 74 61 74 75 73 2c 20 7a 52 65 73  eplyStatus, zRes
46c0: 75 6c 74 43 6f 64 65 2c 20 33 29 3b 0a 20 20 7a  ultCode, 3);.  z
46d0: 52 65 70 6c 79 53 74 61 74 75 73 5b 33 5d 20 3d  ReplyStatus[3] =
46e0: 20 30 3b 0a 20 20 69 66 28 20 7a 52 65 70 6c 79   0;.  if( zReply
46f0: 53 74 61 74 75 73 5b 30 5d 3e 3d 27 34 27 20 29  Status[0]>='4' )
4700: 7b 0a 20 20 20 20 63 6c 6f 73 65 43 6f 6e 6e 65  {.    closeConne
4710: 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d 0a 20  ction = 1;.  }. 
4720: 20 69 66 28 20 63 6c 6f 73 65 43 6f 6e 6e 65 63   if( closeConnec
4730: 74 69 6f 6e 20 29 7b 0a 20 20 20 20 6e 4f 75 74  tion ){.    nOut
4740: 20 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 6e   += printf("Conn
4750: 65 63 74 69 6f 6e 3a 20 63 6c 6f 73 65 5c 72 5c  ection: close\r\
4760: 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n");.  }else{.  
4770: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
4780: 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 6b 65  ("Connection: ke
4790: 65 70 2d 61 6c 69 76 65 5c 72 5c 6e 22 29 3b 0a  ep-alive\r\n");.
47a0: 20 20 7d 0a 20 20 6e 4f 75 74 20 2b 3d 20 44 61    }.  nOut += Da
47b0: 74 65 54 61 67 28 22 44 61 74 65 22 2c 20 6e 6f  teTag("Date", no
47c0: 77 29 3b 0a 20 20 73 74 61 74 75 73 53 65 6e 74  w);.  statusSent
47d0: 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 1;.}../*.** T
47e0: 65 6c 6c 20 74 68 65 20 63 6c 69 65 6e 74 20 74  ell the client t
47f0: 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
4800: 73 75 63 68 20 64 6f 63 75 6d 65 6e 74 0a 2a 2f  such document.*/
4810: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4e 6f 74  .static void Not
4820: 46 6f 75 6e 64 28 69 6e 74 20 6c 69 6e 65 6e 6f  Found(int lineno
4830: 29 7b 0a 20 20 53 74 61 72 74 52 65 73 70 6f 6e  ){.  StartRespon
4840: 73 65 28 22 34 30 34 20 4e 6f 74 20 46 6f 75 6e  se("404 Not Foun
4850: 64 22 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70  d");.  nOut += p
4860: 72 69 6e 74 66 28 0a 20 20 20 20 22 43 6f 6e 74  rintf(.    "Cont
4870: 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 68  ent-type: text/h
4880: 74 6d 6c 5c 72 5c 6e 22 0a 20 20 20 20 22 5c 72  tml\r\n".    "\r
4890: 5c 6e 22 0a 20 20 20 20 22 3c 68 65 61 64 3e 3c  \n".    "<head><
48a0: 74 69 74 6c 65 20 6c 69 6e 65 6e 6f 3d 5c 22 25  title lineno=\"%
48b0: 64 5c 22 3e 4e 6f 74 20 46 6f 75 6e 64 3c 2f 74  d\">Not Found</t
48c0: 69 74 6c 65 3e 3c 2f 68 65 61 64 3e 5c 6e 22 0a  itle></head>\n".
48d0: 20 20 20 20 22 3c 62 6f 64 79 3e 3c 68 31 3e 44      "<body><h1>D
48e0: 6f 63 75 6d 65 6e 74 20 4e 6f 74 20 46 6f 75 6e  ocument Not Foun
48f0: 64 3c 2f 68 31 3e 5c 6e 22 0a 20 20 20 20 22 54  d</h1>\n".    "T
4900: 68 65 20 64 6f 63 75 6d 65 6e 74 20 25 73 20 69  he document %s i
4910: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
4920: 6f 6e 20 74 68 69 73 20 73 65 72 76 65 72 5c 6e  on this server\n
4930: 22 0a 20 20 20 20 22 3c 2f 62 6f 64 79 3e 5c 6e  ".    "</body>\n
4940: 22 2c 20 6c 69 6e 65 6e 6f 2c 20 7a 53 63 72 69  ", lineno, zScri
4950: 70 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e  pt);.  MakeLogEn
4960: 74 72 79 28 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a  try(0, lineno);.
4970: 20 20 65 78 69 74 28 30 29 3b 0a 7d 0a 0a 2f 2a    exit(0);.}../*
4980: 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c 69  .** Tell the cli
4990: 65 6e 74 20 74 68 61 74 20 74 68 65 79 20 61 72  ent that they ar
49a0: 65 20 6e 6f 74 20 77 65 6c 63 6f 6d 65 64 20 68  e not welcomed h
49b0: 65 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ere..*/.static v
49c0: 6f 69 64 20 46 6f 72 62 69 64 64 65 6e 28 69 6e  oid Forbidden(in
49d0: 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 53 74 61  t lineno){.  Sta
49e0: 72 74 52 65 73 70 6f 6e 73 65 28 22 34 30 33 20  rtResponse("403 
49f0: 46 6f 72 62 69 64 64 65 6e 22 29 3b 0a 20 20 6e  Forbidden");.  n
4a00: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20  Out += printf(. 
4a10: 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65     "Content-type
4a20: 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e  : text/plain\r\n
4a30: 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20  ".    "\r\n".   
4a40: 20 22 41 63 63 65 73 73 20 64 65 6e 69 65 64 5c   "Access denied\
4a50: 6e 22 0a 20 20 29 3b 0a 20 20 63 6c 6f 73 65 43  n".  );.  closeC
4a60: 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 31 3b 0a 20  onnection = 1;. 
4a70: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c   MakeLogEntry(0,
4a80: 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 65 78 69 74   lineno);.  exit
4a90: 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65  (0);.}../*.** Te
4aa0: 6c 6c 20 74 68 65 20 63 6c 69 65 6e 74 20 74 68  ll the client th
4ab0: 61 74 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  at authorization
4ac0: 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
4ad0: 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 64 6f  access the.** do
4ae0: 63 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  cument..*/.stati
4af0: 63 20 76 6f 69 64 20 4e 6f 74 41 75 74 68 6f 72  c void NotAuthor
4b00: 69 7a 65 64 28 63 6f 6e 73 74 20 63 68 61 72 20  ized(const char 
4b10: 2a 7a 52 65 61 6c 6d 29 7b 0a 20 20 53 74 61 72  *zRealm){.  Star
4b20: 74 52 65 73 70 6f 6e 73 65 28 22 34 30 31 20 41  tResponse("401 A
4b30: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 52 65 71  uthorization Req
4b40: 75 69 72 65 64 22 29 3b 0a 20 20 6e 4f 75 74 20  uired");.  nOut 
4b50: 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20 22  += printf(.    "
4b60: 57 57 57 2d 41 75 74 68 65 6e 74 69 63 61 74 65  WWW-Authenticate
4b70: 3a 20 42 61 73 69 63 20 72 65 61 6c 6d 3d 5c 22  : Basic realm=\"
4b80: 25 73 5c 22 5c 72 5c 6e 22 0a 20 20 20 20 22 43  %s\"\r\n".    "C
4b90: 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78  ontent-type: tex
4ba0: 74 2f 68 74 6d 6c 5c 72 5c 6e 22 0a 20 20 20 20  t/html\r\n".    
4bb0: 22 5c 72 5c 6e 22 0a 20 20 20 20 22 3c 68 65 61  "\r\n".    "<hea
4bc0: 64 3e 3c 74 69 74 6c 65 3e 4e 6f 74 20 41 75 74  d><title>Not Aut
4bd0: 68 6f 72 69 7a 65 64 3c 2f 74 69 74 6c 65 3e 3c  horized</title><
4be0: 2f 68 65 61 64 3e 5c 6e 22 0a 20 20 20 20 22 3c  /head>\n".    "<
4bf0: 62 6f 64 79 3e 3c 68 31 3e 34 30 31 20 4e 6f 74  body><h1>401 Not
4c00: 20 41 75 74 68 6f 72 69 7a 65 64 3c 2f 68 31 3e   Authorized</h1>
4c10: 5c 6e 22 0a 20 20 20 20 22 41 20 6c 6f 67 69 6e  \n".    "A login
4c20: 20 61 6e 64 20 70 61 73 73 77 6f 72 64 20 61 72   and password ar
4c30: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74  e required for t
4c40: 68 69 73 20 64 6f 63 75 6d 65 6e 74 5c 6e 22 0a  his document\n".
4c50: 20 20 20 20 22 3c 2f 62 6f 64 79 3e 5c 6e 22 2c      "</body>\n",
4c60: 20 7a 52 65 61 6c 6d 29 3b 0a 20 20 4d 61 6b 65   zRealm);.  Make
4c70: 4c 6f 67 45 6e 74 72 79 28 30 2c 20 5f 5f 4c 49  LogEntry(0, __LI
4c80: 4e 45 5f 5f 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20  NE__);  /* LOG: 
4c90: 4e 6f 74 20 61 75 74 68 6f 72 69 7a 65 64 20 2a  Not authorized *
4ca0: 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20  /.}../*.** Tell 
4cb0: 74 68 65 20 63 6c 69 65 6e 74 20 74 68 61 74 20  the client that 
4cc0: 74 68 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f  there is an erro
4cd0: 72 20 69 6e 20 74 68 65 20 73 63 72 69 70 74 2e  r in the script.
4ce0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4cf0: 43 67 69 45 72 72 6f 72 28 76 6f 69 64 29 7b 0a  CgiError(void){.
4d00: 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28    StartResponse(
4d10: 22 35 30 30 20 45 72 72 6f 72 22 29 3b 0a 20 20  "500 Error");.  
4d20: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a  nOut += printf(.
4d30: 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70      "Content-typ
4d40: 65 3a 20 74 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e  e: text/html\r\n
4d50: 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20  ".    "\r\n".   
4d60: 20 22 3c 68 65 61 64 3e 3c 74 69 74 6c 65 3e 43   "<head><title>C
4d70: 47 49 20 50 72 6f 67 72 61 6d 20 45 72 72 6f 72  GI Program Error
4d80: 3c 2f 74 69 74 6c 65 3e 3c 2f 68 65 61 64 3e 5c  </title></head>\
4d90: 6e 22 0a 20 20 20 20 22 3c 62 6f 64 79 3e 3c 68  n".    "<body><h
4da0: 31 3e 43 47 49 20 50 72 6f 67 72 61 6d 20 45 72  1>CGI Program Er
4db0: 72 6f 72 3c 2f 68 31 3e 5c 6e 22 0a 20 20 20 20  ror</h1>\n".    
4dc0: 22 54 68 65 20 43 47 49 20 70 72 6f 67 72 61 6d  "The CGI program
4dd0: 20 25 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e   %s generated an
4de0: 20 65 72 72 6f 72 5c 6e 22 0a 20 20 20 20 22 3c   error\n".    "<
4df0: 2f 62 6f 64 79 3e 5c 6e 22 2c 20 7a 53 63 72 69  /body>\n", zScri
4e00: 70 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e  pt);.  MakeLogEn
4e10: 74 72 79 28 30 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  try(0, __LINE__)
4e20: 3b 20 20 2f 2a 20 4c 4f 47 3a 20 43 47 49 20 45  ;  /* LOG: CGI E
4e30: 72 72 6f 72 20 2a 2f 0a 20 20 65 78 69 74 28 30  rror */.  exit(0
4e40: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
4e50: 20 69 73 20 63 61 6c 6c 65 64 20 69 66 20 77 65   is called if we
4e60: 20 74 69 6d 65 6f 75 74 20 6f 72 20 63 61 74 63   timeout or catc
4e70: 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6b 69 6e  h some other kin
4e80: 64 20 6f 66 20 73 69 67 6e 61 6c 2e 0a 2a 2a 20  d of signal..** 
4e90: 4c 6f 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  Log an error cod
4ea0: 65 20 77 68 69 63 68 20 69 73 20 39 30 30 2b 69  e which is 900+i
4eb0: 53 69 67 20 61 6e 64 20 74 68 65 6e 20 71 75 69  Sig and then qui
4ec0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
4ed0: 64 20 54 69 6d 65 6f 75 74 28 69 6e 74 20 69 53  d Timeout(int iS
4ee0: 69 67 29 7b 0a 20 20 69 66 28 20 21 64 65 62 75  ig){.  if( !debu
4ef0: 67 46 6c 61 67 20 29 7b 0a 20 20 20 20 69 66 28  gFlag ){.    if(
4f00: 20 7a 53 63 72 69 70 74 20 26 26 20 7a 53 63 72   zScript && zScr
4f10: 69 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ipt[0] ){.      
4f20: 63 68 61 72 20 7a 42 75 66 5b 31 30 5d 3b 0a 20  char zBuf[10];. 
4f30: 20 20 20 20 20 7a 42 75 66 5b 30 5d 20 3d 20 27       zBuf[0] = '
4f40: 39 27 3b 0a 20 20 20 20 20 20 7a 42 75 66 5b 31  9';.      zBuf[1
4f50: 5d 20 3d 20 27 30 27 20 2b 20 28 69 53 69 67 2f  ] = '0' + (iSig/
4f60: 31 30 29 25 31 30 3b 0a 20 20 20 20 20 20 7a 42  10)%10;.      zB
4f70: 75 66 5b 32 5d 20 3d 20 27 30 27 20 2b 20 69 53  uf[2] = '0' + iS
4f80: 69 67 25 31 30 3b 0a 20 20 20 20 20 20 7a 42 75  ig%10;.      zBu
4f90: 66 5b 33 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  f[3] = 0;.      
4fa0: 73 74 72 63 70 79 28 7a 52 65 70 6c 79 53 74 61  strcpy(zReplySta
4fb0: 74 75 73 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20  tus, zBuf);.    
4fc0: 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30    MakeLogEntry(0
4fd0: 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 20 2f 2a  , __LINE__);  /*
4fe0: 20 4c 4f 47 3a 20 54 69 6d 65 6f 75 74 20 2a 2f   LOG: Timeout */
4ff0: 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 69 74 28  .    }.    exit(
5000: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
5010: 20 54 65 6c 6c 20 74 68 65 20 63 6c 69 65 6e 74   Tell the client
5020: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
5030: 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 73  n error in the s
5040: 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  cript..*/.static
5050: 20 76 6f 69 64 20 43 67 69 53 63 72 69 70 74 57   void CgiScriptW
5060: 72 69 74 61 62 6c 65 28 76 6f 69 64 29 7b 0a 20  ritable(void){. 
5070: 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22   StartResponse("
5080: 35 30 30 20 43 47 49 20 43 6f 6e 66 69 67 75 72  500 CGI Configur
5090: 61 74 69 6f 6e 20 45 72 72 6f 72 22 29 3b 0a 20  ation Error");. 
50a0: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
50b0: 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79  .    "Content-ty
50c0: 70 65 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c 72  pe: text/plain\r
50d0: 5c 6e 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20  \n".    "\r\n". 
50e0: 20 20 20 22 54 68 65 20 43 47 49 20 70 72 6f 67     "The CGI prog
50f0: 72 61 6d 20 25 73 20 69 73 20 77 72 69 74 61 62  ram %s is writab
5100: 6c 65 20 62 79 20 75 73 65 72 73 20 6f 74 68 65  le by users othe
5110: 72 20 74 68 61 6e 20 69 74 73 20 6f 77 6e 65 72  r than its owner
5120: 2e 5c 6e 22 2c 0a 20 20 20 20 7a 52 65 61 6c 53  .\n",.    zRealS
5130: 63 72 69 70 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f  cript);.  MakeLo
5140: 67 45 6e 74 72 79 28 30 2c 20 5f 5f 4c 49 4e 45  gEntry(0, __LINE
5150: 5f 5f 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 43 47  __);  /* LOG: CG
5160: 49 20 73 63 72 69 70 74 20 69 73 20 77 72 69 74  I script is writ
5170: 61 62 6c 65 20 2a 2f 0a 20 20 65 78 69 74 28 30  able */.  exit(0
5180: 29 3b 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a  );       .}../*.
5190: 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c 69 65  ** Tell the clie
51a0: 6e 74 20 74 68 61 74 20 74 68 65 20 73 65 72 76  nt that the serv
51b0: 65 72 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 65 64  er malfunctioned
51c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
51d0: 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 69 6e 74   Malfunction(int
51e0: 20 6c 69 6e 65 6e 75 6d 2c 20 63 6f 6e 73 74 20   linenum, const 
51f0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
5200: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
5210: 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  p;.  va_start(ap
5220: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 53 74  , zFormat);.  St
5230: 61 72 74 52 65 73 70 6f 6e 73 65 28 22 35 30 30  artResponse("500
5240: 20 53 65 72 76 65 72 20 4d 61 6c 66 75 6e 63 74   Server Malfunct
5250: 69 6f 6e 22 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d  ion");.  nOut +=
5260: 20 70 72 69 6e 74 66 28 0a 20 20 20 20 22 43 6f   printf(.    "Co
5270: 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74  ntent-type: text
5280: 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20 20  /plain\r\n".    
5290: 22 5c 72 5c 6e 22 0a 20 20 20 20 22 57 65 62 20  "\r\n".    "Web 
52a0: 73 65 72 76 65 72 20 6d 61 6c 66 75 6e 63 74 69  server malfuncti
52b0: 6f 6e 65 64 3b 20 65 72 72 6f 72 20 6e 75 6d 62  oned; error numb
52c0: 65 72 20 25 64 5c 6e 5c 6e 22 2c 20 6c 69 6e 65  er %d\n\n", line
52d0: 6e 75 6d 29 3b 0a 20 20 69 66 28 20 7a 46 6f 72  num);.  if( zFor
52e0: 6d 61 74 20 29 7b 0a 20 20 20 20 6e 4f 75 74 20  mat ){.    nOut 
52f0: 2b 3d 20 76 70 72 69 6e 74 66 28 7a 46 6f 72 6d  += vprintf(zForm
5300: 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 20 20 4d  at, ap);.  }.  M
5310: 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 6c  akeLogEntry(0, l
5320: 69 6e 65 6e 75 6d 29 3b 0a 20 20 65 78 69 74 28  inenum);.  exit(
5330: 30 29 3b 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a  0);       .}../*
5340: 0a 2a 2a 20 44 6f 20 61 20 73 65 72 76 65 72 20  .** Do a server 
5350: 72 65 64 69 72 65 63 74 20 74 6f 20 74 68 65 20  redirect to the 
5360: 64 6f 63 75 6d 65 6e 74 20 73 70 65 63 69 66 69  document specifi
5370: 65 64 2e 20 20 54 68 65 20 64 6f 63 75 6d 65 6e  ed.  The documen
5380: 74 0a 2a 2a 20 6e 61 6d 65 20 6e 6f 74 20 63 6f  t.** name not co
5390: 6e 74 61 69 6e 20 73 63 68 65 6d 65 20 6f 72 20  ntain scheme or 
53a0: 6e 65 74 77 6f 72 6b 20 6c 6f 63 61 74 69 6f 6e  network location
53b0: 20 6f 72 20 74 68 65 20 71 75 65 72 79 20 73 74   or the query st
53c0: 72 69 6e 67 2e 0a 2a 2a 20 49 74 20 77 69 6c 6c  ring..** It will
53d0: 20 62 65 20 6a 75 73 74 20 74 68 65 20 70 61 74   be just the pat
53e0: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  h..*/.static voi
53f0: 64 20 52 65 64 69 72 65 63 74 28 63 6f 6e 73 74  d Redirect(const
5400: 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e   char *zPath, in
5410: 74 20 66 69 6e 69 73 68 2c 20 69 6e 74 20 6c 69  t finish, int li
5420: 6e 65 6e 6f 29 7b 0a 20 20 53 74 61 72 74 52 65  neno){.  StartRe
5430: 73 70 6f 6e 73 65 28 22 33 30 32 20 54 65 6d 70  sponse("302 Temp
5440: 6f 72 61 72 79 20 52 65 64 69 72 65 63 74 22 29  orary Redirect")
5450: 3b 0a 20 20 69 66 28 20 7a 53 65 72 76 65 72 50  ;.  if( zServerP
5460: 6f 72 74 3d 3d 30 20 7c 7c 20 7a 53 65 72 76 65  ort==0 || zServe
5470: 72 50 6f 72 74 5b 30 5d 3d 3d 30 20 7c 7c 20 73  rPort[0]==0 || s
5480: 74 72 63 6d 70 28 7a 53 65 72 76 65 72 50 6f 72  trcmp(zServerPor
5490: 74 2c 22 38 30 22 29 3d 3d 30 20 29 7b 0a 20 20  t,"80")==0 ){.  
54a0: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
54b0: 28 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73 3a 2f  ("Location: %s:/
54c0: 2f 25 73 25 73 25 73 5c 72 5c 6e 22 2c 0a 20 20  /%s%s%s\r\n",.  
54d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54e0: 20 7a 48 74 74 70 2c 20 7a 53 65 72 76 65 72 4e   zHttp, zServerN
54f0: 61 6d 65 2c 20 7a 50 61 74 68 2c 20 7a 51 75 65  ame, zPath, zQue
5500: 72 79 53 75 66 66 69 78 29 3b 0a 20 20 7d 65 6c  rySuffix);.  }el
5510: 73 65 7b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20  se{.    nOut += 
5520: 70 72 69 6e 74 66 28 22 4c 6f 63 61 74 69 6f 6e  printf("Location
5530: 3a 20 25 73 3a 2f 2f 25 73 3a 25 73 25 73 25 73  : %s://%s:%s%s%s
5540: 5c 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  \r\n",.         
5550: 20 20 20 20 20 20 20 20 20 20 7a 48 74 74 70 2c            zHttp,
5560: 20 7a 53 65 72 76 65 72 4e 61 6d 65 2c 20 7a 53   zServerName, zS
5570: 65 72 76 65 72 50 6f 72 74 2c 20 7a 50 61 74 68  erverPort, zPath
5580: 2c 20 7a 51 75 65 72 79 53 75 66 66 69 78 29 3b  , zQuerySuffix);
5590: 0a 20 20 7d 0a 20 20 69 66 28 20 66 69 6e 69 73  .  }.  if( finis
55a0: 68 20 29 7b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d  h ){.    nOut +=
55b0: 20 70 72 69 6e 74 66 28 22 43 6f 6e 74 65 6e 74   printf("Content
55c0: 2d 6c 65 6e 67 74 68 3a 20 30 5c 72 5c 6e 22 29  -length: 0\r\n")
55d0: 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72  ;.    nOut += pr
55e0: 69 6e 74 66 28 22 5c 72 5c 6e 22 29 3b 0a 20 20  intf("\r\n");.  
55f0: 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30    MakeLogEntry(0
5600: 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 20  , lineno);.  }. 
5610: 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
5620: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
5630: 75 6e 63 74 69 6f 6e 20 74 72 65 61 74 73 20 69  unction treats i
5640: 74 73 20 69 6e 70 75 74 20 61 73 20 61 20 62 61  ts input as a ba
5650: 73 65 2d 36 34 20 73 74 72 69 6e 67 20 61 6e 64  se-64 string and
5660: 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20   returns the.** 
5670: 64 65 63 6f 64 65 64 20 76 61 6c 75 65 20 6f 66  decoded value of
5680: 20 74 68 61 74 20 73 74 72 69 6e 67 2e 20 20 43   that string.  C
5690: 68 61 72 61 63 74 65 72 73 20 6f 66 20 69 6e 70  haracters of inp
56a0: 75 74 20 74 68 61 74 20 61 72 65 20 6e 6f 74 0a  ut that are not.
56b0: 2a 2a 20 76 61 6c 69 64 20 62 61 73 65 2d 36 34  ** valid base-64
56c0: 20 63 68 61 72 61 63 74 65 72 73 20 28 73 75 63   characters (suc
56d0: 68 20 61 73 20 73 70 61 63 65 73 20 61 6e 64 20  h as spaces and 
56e0: 6e 65 77 6c 69 6e 65 73 29 20 61 72 65 20 69 67  newlines) are ig
56f0: 6e 6f 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 44  nored..*/.void D
5700: 65 63 6f 64 65 36 34 28 63 68 61 72 20 2a 7a 36  ecode64(char *z6
5710: 34 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 61 74  4){.  char *zDat
5720: 61 3b 0a 20 20 69 6e 74 20 6e 36 34 3b 0a 20 20  a;.  int n64;.  
5730: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
5740: 61 2c 20 62 2c 20 63 2c 20 64 3b 0a 20 20 73 74  a, b, c, d;.  st
5750: 61 74 69 63 20 69 6e 74 20 69 73 49 6e 69 74 20  atic int isInit 
5760: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  = 0;.  static in
5770: 74 20 74 72 61 6e 73 5b 31 32 38 5d 3b 0a 20 20  t trans[128];.  
5780: 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
5790: 63 68 61 72 20 7a 42 61 73 65 5b 5d 20 3d 20 0a  char zBase[] = .
57a0: 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b      "ABCDEFGHIJK
57b0: 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 61  LMNOPQRSTUVWXYZa
57c0: 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
57d0: 72 73 74 75 76 77 78 79 7a 30 31 32 33 34 35 36  rstuvwxyz0123456
57e0: 37 38 39 2b 2f 22 3b 0a 0a 20 20 69 66 28 20 21  789+/";..  if( !
57f0: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 66 6f  isInit ){.    fo
5800: 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b  r(i=0; i<128; i+
5810: 2b 29 7b 20 74 72 61 6e 73 5b 69 5d 20 3d 20 30  +){ trans[i] = 0
5820: 3b 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ; }.    for(i=0;
5830: 20 7a 42 61 73 65 5b 69 5d 3b 20 69 2b 2b 29 7b   zBase[i]; i++){
5840: 20 74 72 61 6e 73 5b 7a 42 61 73 65 5b 69 5d 20   trans[zBase[i] 
5850: 26 20 30 78 37 66 5d 20 3d 20 69 3b 20 7d 0a 20  & 0x7f] = i; }. 
5860: 20 20 20 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20     isInit = 1;. 
5870: 20 7d 0a 20 20 6e 36 34 20 3d 20 73 74 72 6c 65   }.  n64 = strle
5880: 6e 28 7a 36 34 29 3b 0a 20 20 77 68 69 6c 65 28  n(z64);.  while(
5890: 20 6e 36 34 3e 30 20 26 26 20 7a 36 34 5b 6e 36   n64>0 && z64[n6
58a0: 34 2d 31 5d 3d 3d 27 3d 27 20 29 20 6e 36 34 2d  4-1]=='=' ) n64-
58b0: 2d 3b 0a 20 20 7a 44 61 74 61 20 3d 20 7a 36 34  -;.  zData = z64
58c0: 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  ;.  for(i=j=0; i
58d0: 2b 33 3c 6e 36 34 3b 20 69 2b 3d 34 29 7b 0a 20  +3<n64; i+=4){. 
58e0: 20 20 20 61 20 3d 20 74 72 61 6e 73 5b 7a 36 34     a = trans[z64
58f0: 5b 69 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20 20  [i] & 0x7f];.   
5900: 20 62 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69   b = trans[z64[i
5910: 2b 31 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20 20  +1] & 0x7f];.   
5920: 20 63 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69   c = trans[z64[i
5930: 2b 32 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20 20  +2] & 0x7f];.   
5940: 20 64 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69   d = trans[z64[i
5950: 2b 33 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20 20  +3] & 0x7f];.   
5960: 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28   zData[j++] = ((
5970: 61 3c 3c 32 29 20 26 20 30 78 66 63 29 20 7c 20  a<<2) & 0xfc) | 
5980: 28 28 62 3e 3e 34 29 20 26 20 30 78 30 33 29 3b  ((b>>4) & 0x03);
5990: 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20  .    zData[j++] 
59a0: 3d 20 28 28 62 3c 3c 34 29 20 26 20 30 78 66 30  = ((b<<4) & 0xf0
59b0: 29 20 7c 20 28 28 63 3e 3e 32 29 20 26 20 30 78  ) | ((c>>2) & 0x
59c0: 30 66 29 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a  0f);.    zData[j
59d0: 2b 2b 5d 20 3d 20 28 28 63 3c 3c 36 29 20 26 20  ++] = ((c<<6) & 
59e0: 30 78 63 30 29 20 7c 20 28 64 20 26 20 30 78 33  0xc0) | (d & 0x3
59f0: 66 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 2b  f);.  }.  if( i+
5a00: 32 3c 6e 36 34 20 29 7b 0a 20 20 20 20 61 20 3d  2<n64 ){.    a =
5a10: 20 74 72 61 6e 73 5b 7a 36 34 5b 69 5d 20 26 20   trans[z64[i] & 
5a20: 30 78 37 66 5d 3b 0a 20 20 20 20 62 20 3d 20 74  0x7f];.    b = t
5a30: 72 61 6e 73 5b 7a 36 34 5b 69 2b 31 5d 20 26 20  rans[z64[i+1] & 
5a40: 30 78 37 66 5d 3b 0a 20 20 20 20 63 20 3d 20 74  0x7f];.    c = t
5a50: 72 61 6e 73 5b 7a 36 34 5b 69 2b 32 5d 20 26 20  rans[z64[i+2] & 
5a60: 30 78 37 66 5d 3b 0a 20 20 20 20 7a 44 61 74 61  0x7f];.    zData
5a70: 5b 6a 2b 2b 5d 20 3d 20 28 28 61 3c 3c 32 29 20  [j++] = ((a<<2) 
5a80: 26 20 30 78 66 63 29 20 7c 20 28 28 62 3e 3e 34  & 0xfc) | ((b>>4
5a90: 29 20 26 20 30 78 30 33 29 3b 0a 20 20 20 20 7a  ) & 0x03);.    z
5aa0: 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28 62 3c  Data[j++] = ((b<
5ab0: 3c 34 29 20 26 20 30 78 66 30 29 20 7c 20 28 28  <4) & 0xf0) | ((
5ac0: 63 3e 3e 32 29 20 26 20 30 78 30 66 29 3b 0a 20  c>>2) & 0x0f);. 
5ad0: 20 7d 65 6c 73 65 20 69 66 28 20 69 2b 31 3c 6e   }else if( i+1<n
5ae0: 36 34 20 29 7b 0a 20 20 20 20 61 20 3d 20 74 72  64 ){.    a = tr
5af0: 61 6e 73 5b 7a 36 34 5b 69 5d 20 26 20 30 78 37  ans[z64[i] & 0x7
5b00: 66 5d 3b 0a 20 20 20 20 62 20 3d 20 74 72 61 6e  f];.    b = tran
5b10: 73 5b 7a 36 34 5b 69 2b 31 5d 20 26 20 30 78 37  s[z64[i+1] & 0x7
5b20: 66 5d 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b  f];.    zData[j+
5b30: 2b 5d 20 3d 20 28 28 61 3c 3c 32 29 20 26 20 30  +] = ((a<<2) & 0
5b40: 78 66 63 29 20 7c 20 28 28 62 3e 3e 34 29 20 26  xfc) | ((b>>4) &
5b50: 20 30 78 30 33 29 3b 0a 20 20 7d 0a 20 20 7a 44   0x03);.  }.  zD
5b60: 61 74 61 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f  ata[j] = 0;.}../
5b70: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
5b80: 65 20 69 66 20 62 61 73 69 63 20 61 75 74 68 6f  e if basic autho
5b90: 72 69 7a 61 74 69 6f 6e 20 63 72 65 64 65 6e 74  rization credent
5ba0: 69 61 6c 73 20 61 72 65 20 70 72 6f 76 69 64 65  ials are provide
5bb0: 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20 75 73 65  d for.** the use
5bc0: 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  r according to t
5bd0: 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
5be0: 6e 20 7a 41 75 74 68 46 69 6c 65 2e 20 20 52 65  n zAuthFile.  Re
5bf0: 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20  turn true.** if 
5c00: 61 75 74 68 6f 72 69 7a 65 64 2e 20 20 52 65 74  authorized.  Ret
5c10: 75 72 6e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  urn false if not
5c20: 20 61 75 74 68 6f 72 69 7a 65 64 2e 0a 2a 2a 0a   authorized..**.
5c30: 2a 2a 20 46 69 6c 65 20 66 6f 72 6d 61 74 3a 0a  ** File format:.
5c40: 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 42 6c 61 6e  **.**    *  Blan
5c50: 6b 20 6c 69 6e 65 73 20 61 6e 64 20 6c 69 6e 65  k lines and line
5c60: 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  s that begin wit
5c70: 68 20 27 23 27 20 61 72 65 20 69 67 6e 6f 72 65  h '#' are ignore
5c80: 64 0a 2a 2a 20 20 20 20 2a 20 20 22 68 74 74 70  d.**    *  "http
5c90: 2d 72 65 64 69 72 65 63 74 22 20 66 6f 72 63 65  -redirect" force
5ca0: 73 20 61 20 72 65 64 69 72 65 63 74 20 74 6f 20  s a redirect to 
5cb0: 48 54 54 50 53 20 69 66 20 6e 6f 74 20 74 68 65  HTTPS if not the
5cc0: 72 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 20 20  re already.**   
5cd0: 20 2a 20 20 22 68 74 74 70 73 2d 6f 6e 6c 79 22   *  "https-only"
5ce0: 20 64 69 73 61 6c 6c 6f 77 73 20 6f 70 65 72 61   disallows opera
5cf0: 74 69 6f 6e 20 69 6e 20 48 54 54 50 0a 2a 2a 20  tion in HTTP.** 
5d00: 20 20 20 2a 20 20 22 75 73 65 72 20 4e 41 4d 45     *  "user NAME
5d10: 20 4c 4f 47 49 4e 3a 50 41 53 53 57 4f 52 44 22   LOGIN:PASSWORD"
5d20: 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69   checks to see i
5d30: 66 20 4c 4f 47 49 4e 3a 50 41 53 53 57 4f 52 44  f LOGIN:PASSWORD
5d40: 20 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 68 6f   .**       autho
5d50: 72 69 7a 61 74 69 6f 6e 20 63 72 65 64 65 6e 74  rization credent
5d60: 69 61 6c 73 20 61 72 65 20 70 72 6f 76 69 64 65  ials are provide
5d70: 64 2c 20 61 6e 64 20 69 66 20 73 6f 20 73 65 74  d, and if so set
5d80: 73 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 52  s the.**       R
5d90: 45 4d 4f 54 45 5f 55 53 45 52 20 74 6f 20 4e 41  EMOTE_USER to NA
5da0: 4d 45 2e 0a 2a 2a 20 20 20 20 2a 20 20 22 72 65  ME..**    *  "re
5db0: 61 6c 6d 20 54 45 58 54 22 20 73 65 74 73 20 74  alm TEXT" sets t
5dc0: 68 65 20 72 65 61 6c 6d 20 74 6f 20 54 45 58 54  he realm to TEXT
5dd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5de0: 43 68 65 63 6b 42 61 73 69 63 41 75 74 68 6f 72  CheckBasicAuthor
5df0: 69 7a 61 74 69 6f 6e 28 63 6f 6e 73 74 20 63 68  ization(const ch
5e00: 61 72 20 2a 7a 41 75 74 68 46 69 6c 65 29 7b 0a  ar *zAuthFile){.
5e10: 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 63 68    FILE *in;.  ch
5e20: 61 72 20 2a 7a 52 65 61 6c 6d 20 3d 20 22 75 6e  ar *zRealm = "un
5e30: 6b 6e 6f 77 6e 20 72 65 61 6c 6d 22 3b 0a 20 20  known realm";.  
5e40: 63 68 61 72 20 2a 7a 4c 6f 67 69 6e 50 73 77 64  char *zLoginPswd
5e50: 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  ;.  char *zName;
5e60: 0a 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b 32 30  .  char zLine[20
5e70: 30 30 5d 3b 0a 0a 20 20 69 6e 20 3d 20 66 6f 70  00];..  in = fop
5e80: 65 6e 28 7a 41 75 74 68 46 69 6c 65 2c 20 22 72  en(zAuthFile, "r
5e90: 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20  ");.  if( in==0 
5ea0: 29 7b 0a 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28  ){.    NotFound(
5eb0: 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 20 2f 2a 20 4c  __LINE__);  /* L
5ec0: 4f 47 3a 20 43 61 6e 6e 6f 74 20 6f 70 65 6e 20  OG: Cannot open 
5ed0: 2d 61 75 74 68 20 66 69 6c 65 20 2a 2f 0a 20 20  -auth file */.  
5ee0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
5ef0: 20 20 69 66 28 20 7a 41 75 74 68 41 72 67 20 29    if( zAuthArg )
5f00: 20 44 65 63 6f 64 65 36 34 28 7a 41 75 74 68 41   Decode64(zAuthA
5f10: 72 67 29 3b 0a 20 20 77 68 69 6c 65 28 20 66 67  rg);.  while( fg
5f20: 65 74 73 28 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f  ets(zLine, sizeo
5f30: 66 28 7a 4c 69 6e 65 29 2c 20 69 6e 29 20 29 7b  f(zLine), in) ){
5f40: 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69 65 6c  .    char *zFiel
5f50: 64 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20  dName;.    char 
5f60: 2a 7a 56 61 6c 3b 0a 0a 20 20 20 20 7a 46 69 65  *zVal;..    zFie
5f70: 6c 64 4e 61 6d 65 20 3d 20 47 65 74 46 69 72 73  ldName = GetFirs
5f80: 74 45 6c 65 6d 65 6e 74 28 7a 4c 69 6e 65 2c 26  tElement(zLine,&
5f90: 7a 56 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a  zVal);.    if( z
5fa0: 46 69 65 6c 64 4e 61 6d 65 3d 3d 30 20 7c 7c 20  FieldName==0 || 
5fb0: 2a 7a 46 69 65 6c 64 4e 61 6d 65 3d 3d 30 20 29  *zFieldName==0 )
5fc0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
5fd0: 66 28 20 7a 46 69 65 6c 64 4e 61 6d 65 5b 30 5d  f( zFieldName[0]
5fe0: 3d 3d 27 23 27 20 29 20 63 6f 6e 74 69 6e 75 65  =='#' ) continue
5ff0: 3b 0a 20 20 20 20 52 65 6d 6f 76 65 4e 65 77 6c  ;.    RemoveNewl
6000: 69 6e 65 28 7a 56 61 6c 29 3b 0a 20 20 20 20 69  ine(zVal);.    i
6010: 66 28 20 73 74 72 63 6d 70 28 7a 46 69 65 6c 64  f( strcmp(zField
6020: 4e 61 6d 65 2c 20 22 72 65 61 6c 6d 22 29 3d 3d  Name, "realm")==
6030: 30 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 61 6c  0 ){.      zReal
6040: 6d 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29  m = StrDup(zVal)
6050: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
6060: 73 74 72 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d  strcmp(zFieldNam
6070: 65 2c 22 75 73 65 72 22 29 3d 3d 30 20 29 7b 0a  e,"user")==0 ){.
6080: 20 20 20 20 20 20 69 66 28 20 7a 41 75 74 68 41        if( zAuthA
6090: 72 67 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  rg==0 ) continue
60a0: 3b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  ;.      zName = 
60b0: 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28  GetFirstElement(
60c0: 7a 56 61 6c 2c 20 26 7a 56 61 6c 29 3b 0a 20 20  zVal, &zVal);.  
60d0: 20 20 20 20 7a 4c 6f 67 69 6e 50 73 77 64 20 3d      zLoginPswd =
60e0: 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74   GetFirstElement
60f0: 28 7a 56 61 6c 2c 20 26 7a 56 61 6c 29 3b 0a 20  (zVal, &zVal);. 
6100: 20 20 20 20 20 69 66 28 20 7a 4c 6f 67 69 6e 50       if( zLoginP
6110: 73 77 64 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  swd==0 ) continu
6120: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 75  e;.      if( zAu
6130: 74 68 41 72 67 20 26 26 20 73 74 72 63 6d 70 28  thArg && strcmp(
6140: 7a 41 75 74 68 41 72 67 2c 7a 4c 6f 67 69 6e 50  zAuthArg,zLoginP
6150: 73 77 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  swd)==0 ){.     
6160: 20 20 20 7a 52 65 6d 6f 74 65 55 73 65 72 20 3d     zRemoteUser =
6170: 20 53 74 72 44 75 70 28 7a 4e 61 6d 65 29 3b 0a   StrDup(zName);.
6180: 20 20 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69          fclose(i
6190: 6e 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  n);.        retu
61a0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
61b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
61c0: 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 68  mp(zFieldName,"h
61d0: 74 74 70 73 2d 6f 6e 6c 79 22 29 3d 3d 30 20 29  ttps-only")==0 )
61e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 75 73 65  {.      if( !use
61f0: 48 74 74 70 73 20 29 7b 0a 20 20 20 20 20 20 20  Https ){.       
6200: 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45   NotFound(__LINE
6210: 5f 5f 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 20 68  __);  /* LOG:  h
6220: 74 74 70 20 72 65 71 75 65 73 74 20 6f 6e 20 68  ttp request on h
6230: 74 74 70 73 2d 6f 6e 6c 79 20 70 61 67 65 20 2a  ttps-only page *
6240: 2f 0a 20 20 20 20 20 20 20 20 66 63 6c 6f 73 65  /.        fclose
6250: 28 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 72 65  (in);.        re
6260: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
6270: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
6280: 72 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c  rcmp(zFieldName,
6290: 22 68 74 74 70 2d 72 65 64 69 72 65 63 74 22 29  "http-redirect")
62a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
62b0: 20 21 75 73 65 48 74 74 70 73 20 29 7b 0a 20 20   !useHttps ){.  
62c0: 20 20 20 20 20 20 7a 48 74 74 70 20 3d 20 22 68        zHttp = "h
62d0: 74 74 70 73 22 3b 0a 20 20 20 20 20 20 20 20 73  ttps";.        s
62e0: 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 25  printf(zLine, "%
62f0: 73 25 73 22 2c 20 7a 53 63 72 69 70 74 2c 20 7a  s%s", zScript, z
6300: 50 61 74 68 49 6e 66 6f 29 3b 0a 20 20 20 20 20  PathInfo);.     
6310: 20 20 20 52 65 64 69 72 65 63 74 28 7a 4c 69 6e     Redirect(zLin
6320: 65 2c 20 31 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  e, 1, __LINE__);
6330: 20 2f 2a 20 4c 4f 47 3a 20 2d 61 75 74 68 20 72   /* LOG: -auth r
6340: 65 64 69 72 65 63 74 20 2a 2f 0a 20 20 20 20 20  edirect */.     
6350: 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
6360: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
6370: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
6380: 73 65 7b 0a 20 20 20 20 20 20 4e 6f 74 46 6f 75  se{.      NotFou
6390: 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 20 2f  nd(__LINE__);  /
63a0: 2a 20 4c 4f 47 3a 20 20 6d 61 6c 66 6f 72 6d 65  * LOG:  malforme
63b0: 64 20 65 6e 74 72 79 20 69 6e 20 2d 61 75 74 68  d entry in -auth
63c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 66   file */.      f
63d0: 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20  close(in);.     
63e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
63f0: 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e  .  }.  fclose(in
6400: 29 3b 0a 20 20 4e 6f 74 41 75 74 68 6f 72 69 7a  );.  NotAuthoriz
6410: 65 64 28 7a 52 65 61 6c 6d 29 3b 0a 20 20 72 65  ed(zRealm);.  re
6420: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
6430: 20 47 75 65 73 73 20 74 68 65 20 6d 69 6d 65 2d   Guess the mime-
6440: 74 79 70 65 20 6f 66 20 61 20 64 6f 63 75 6d 65  type of a docume
6450: 6e 74 20 62 61 73 65 64 20 6f 6e 20 69 74 73 20  nt based on its 
6460: 6e 61 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  name..*/.const c
6470: 68 61 72 20 2a 47 65 74 4d 69 6d 65 54 79 70 65  har *GetMimeType
6480: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61  (const char *zNa
6490: 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a  me, int nName){.
64a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
64b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
64c0: 66 69 72 73 74 2c 20 6c 61 73 74 3b 0a 20 20 69  first, last;.  i
64d0: 6e 74 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20 7a  nt len;.  char z
64e0: 53 75 66 66 69 78 5b 32 30 5d 3b 0a 0a 20 20 2f  Suffix[20];..  /
64f0: 2a 20 41 20 74 61 62 6c 65 20 6f 66 20 6d 69 6d  * A table of mim
6500: 65 74 79 70 65 73 20 62 61 73 65 64 20 6f 6e 20  etypes based on 
6510: 66 69 6c 65 20 73 75 66 66 69 78 65 73 2e 20 0a  file suffixes. .
6520: 20 20 2a 2a 20 53 75 66 66 69 78 65 73 20 6d 75    ** Suffixes mu
6530: 73 74 20 62 65 20 69 6e 20 73 6f 72 74 65 64 20  st be in sorted 
6540: 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20 77 65  order so that we
6550: 20 63 61 6e 20 64 6f 20 61 20 62 69 6e 61 72 79   can do a binary
6560: 0a 20 20 2a 2a 20 73 65 61 72 63 68 20 74 6f 20  .  ** search to 
6570: 66 69 6e 64 20 74 68 65 20 6d 69 6d 65 2d 74 79  find the mime-ty
6580: 70 65 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63  pe.  */.  static
6590: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
65a0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
65b0: 7a 53 75 66 66 69 78 3b 20 20 20 20 20 20 20 2f  zSuffix;       /
65c0: 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66 66 69  * The file suffi
65d0: 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 69 7a  x */.    int siz
65e0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
65f0: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
6600: 20 74 68 65 20 73 75 66 66 69 78 20 2a 2f 0a 20   the suffix */. 
6610: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
6620: 4d 69 6d 65 74 79 70 65 3b 20 20 20 20 20 2f 2a  Mimetype;     /*
6630: 20 54 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   The correspondi
6640: 6e 67 20 6d 69 6d 65 74 79 70 65 20 2a 2f 0a 20  ng mimetype */. 
6650: 20 7d 20 61 4d 69 6d 65 5b 5d 20 3d 20 7b 0a 20   } aMime[] = {. 
6660: 20 20 20 7b 20 22 61 69 22 2c 20 20 20 20 20 20     { "ai",      
6670: 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69     2, "applicati
6680: 6f 6e 2f 70 6f 73 74 73 63 72 69 70 74 22 20 20  on/postscript"  
6690: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
66a0: 20 7b 20 22 61 69 66 22 2c 20 20 20 20 20 20 20   { "aif",       
66b0: 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 61 69 66   3, "audio/x-aif
66c0: 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f"              
66d0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
66e0: 20 22 61 69 66 63 22 2c 20 20 20 20 20 20 20 34   "aifc",       4
66f0: 2c 20 22 61 75 64 69 6f 2f 78 2d 61 69 66 66 22  , "audio/x-aiff"
6700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6710: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6720: 61 69 66 66 22 2c 20 20 20 20 20 20 20 34 2c 20  aiff",       4, 
6730: 22 61 75 64 69 6f 2f 78 2d 61 69 66 66 22 20 20  "audio/x-aiff"  
6740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6750: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 72      },.    { "ar
6760: 6a 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  j",        3, "a
6770: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 61 72 6a  pplication/x-arj
6780: 2d 63 6f 6d 70 72 65 73 73 65 64 22 20 20 20 20  -compressed"    
6790: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 73 63 22    },.    { "asc"
67a0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65 78  ,        3, "tex
67b0: 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20  t/plain"        
67c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67d0: 7d 2c 0a 20 20 20 20 7b 20 22 61 73 66 22 2c 20  },.    { "asf", 
67e0: 20 20 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f         3, "video
67f0: 2f 78 2d 6d 73 2d 61 73 66 22 20 20 20 20 20 20  /x-ms-asf"      
6800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6810: 0a 20 20 20 20 7b 20 22 61 73 78 22 2c 20 20 20  .    { "asx",   
6820: 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 78       3, "video/x
6830: 2d 6d 73 2d 61 73 78 22 20 20 20 20 20 20 20 20  -ms-asx"        
6840: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6850: 20 20 20 7b 20 22 61 75 22 2c 20 20 20 20 20 20     { "au",      
6860: 20 20 20 32 2c 20 22 61 75 64 69 6f 2f 75 6c 61     2, "audio/ula
6870: 77 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w"              
6880: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6890: 20 7b 20 22 61 76 69 22 2c 20 20 20 20 20 20 20   { "avi",       
68a0: 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 76   3, "video/x-msv
68b0: 69 64 65 6f 22 20 20 20 20 20 20 20 20 20 20 20  ideo"           
68c0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
68d0: 20 22 62 61 74 22 2c 20 20 20 20 20 20 20 20 33   "bat",        3
68e0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
68f0: 2d 6d 73 64 6f 73 2d 70 72 6f 67 72 61 6d 22 20  -msdos-program" 
6900: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6910: 62 63 70 69 6f 22 2c 20 20 20 20 20 20 35 2c 20  bcpio",      5, 
6920: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 62  "application/x-b
6930: 63 70 69 6f 22 20 20 20 20 20 20 20 20 20 20 20  cpio"           
6940: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 62 69      },.    { "bi
6950: 6e 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  n",        3, "a
6960: 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74  pplication/octet
6970: 2d 73 74 72 65 61 6d 22 20 20 20 20 20 20 20 20  -stream"        
6980: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 22 2c 20    },.    { "c", 
6990: 20 20 20 20 20 20 20 20 20 31 2c 20 22 74 65 78           1, "tex
69a0: 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20  t/plain"        
69b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69c0: 7d 2c 0a 20 20 20 20 7b 20 22 63 63 22 2c 20 20  },.    { "cc",  
69d0: 20 20 20 20 20 20 20 32 2c 20 22 74 65 78 74 2f         2, "text/
69e0: 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20 20  plain"          
69f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6a00: 0a 20 20 20 20 7b 20 22 63 63 61 64 22 2c 20 20  .    { "ccad",  
6a10: 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61       4, "applica
6a20: 74 69 6f 6e 2f 63 6c 61 72 69 73 63 61 64 22 20  tion/clariscad" 
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6a40: 20 20 20 7b 20 22 63 64 66 22 2c 20 20 20 20 20     { "cdf",     
6a50: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
6a60: 6f 6e 2f 78 2d 6e 65 74 63 64 66 22 20 20 20 20  on/x-netcdf"    
6a70: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6a80: 20 7b 20 22 63 6c 61 73 73 22 2c 20 20 20 20 20   { "class",     
6a90: 20 35 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   5, "application
6aa0: 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22 20 20  /octet-stream"  
6ab0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6ac0: 20 22 63 6f 64 22 2c 20 20 20 20 20 20 20 20 33   "cod",        3
6ad0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76  , "application/v
6ae0: 6e 64 2e 72 69 6d 2e 63 6f 64 22 20 20 20 20 20  nd.rim.cod"     
6af0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6b00: 63 6f 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20  com",        3, 
6b10: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6d  "application/x-m
6b20: 73 64 6f 73 2d 70 72 6f 67 72 61 6d 22 20 20 20  sdos-program"   
6b30: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 70      },.    { "cp
6b40: 69 6f 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61  io",       4, "a
6b50: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 63 70 69  pplication/x-cpi
6b60: 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o"              
6b70: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 70 74 22    },.    { "cpt"
6b80: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
6b90: 6c 69 63 61 74 69 6f 6e 2f 6d 61 63 2d 63 6f 6d  lication/mac-com
6ba0: 70 61 63 74 70 72 6f 22 20 20 20 20 20 20 20 20  pactpro"        
6bb0: 7d 2c 0a 20 20 20 20 7b 20 22 63 73 68 22 2c 20  },.    { "csh", 
6bc0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
6bd0: 63 61 74 69 6f 6e 2f 78 2d 63 73 68 22 20 20 20  cation/x-csh"   
6be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6bf0: 0a 20 20 20 20 7b 20 22 63 73 73 22 2c 20 20 20  .    { "css",   
6c00: 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 63 73       3, "text/cs
6c10: 73 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s"              
6c20: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6c30: 20 20 20 7b 20 22 64 63 72 22 2c 20 20 20 20 20     { "dcr",     
6c40: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
6c50: 6f 6e 2f 78 2d 64 69 72 65 63 74 6f 72 22 20 20  on/x-director"  
6c60: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6c70: 20 7b 20 22 64 65 62 22 2c 20 20 20 20 20 20 20   { "deb",       
6c80: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
6c90: 2f 78 2d 64 65 62 69 61 6e 2d 70 61 63 6b 61 67  /x-debian-packag
6ca0: 65 22 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  e"      },.    {
6cb0: 20 22 64 69 72 22 2c 20 20 20 20 20 20 20 20 33   "dir",        3
6cc0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
6cd0: 2d 64 69 72 65 63 74 6f 72 22 20 20 20 20 20 20  -director"      
6ce0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6cf0: 64 6c 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  dl",         2, 
6d00: 22 76 69 64 65 6f 2f 64 6c 22 20 20 20 20 20 20  "video/dl"      
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d20: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 6d      },.    { "dm
6d30: 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  s",        3, "a
6d40: 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74  pplication/octet
6d50: 2d 73 74 72 65 61 6d 22 20 20 20 20 20 20 20 20  -stream"        
6d60: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 6f 63 22    },.    { "doc"
6d70: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
6d80: 6c 69 63 61 74 69 6f 6e 2f 6d 73 77 6f 72 64 22  lication/msword"
6d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6da0: 7d 2c 0a 20 20 20 20 7b 20 22 64 72 77 22 2c 20  },.    { "drw", 
6db0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
6dc0: 63 61 74 69 6f 6e 2f 64 72 61 66 74 69 6e 67 22  cation/drafting"
6dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6de0: 0a 20 20 20 20 7b 20 22 64 76 69 22 2c 20 20 20  .    { "dvi",   
6df0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
6e00: 74 69 6f 6e 2f 78 2d 64 76 69 22 20 20 20 20 20  tion/x-dvi"     
6e10: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6e20: 20 20 20 7b 20 22 64 77 67 22 2c 20 20 20 20 20     { "dwg",     
6e30: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
6e40: 6f 6e 2f 61 63 61 64 22 20 20 20 20 20 20 20 20  on/acad"        
6e50: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6e60: 20 7b 20 22 64 78 66 22 2c 20 20 20 20 20 20 20   { "dxf",       
6e70: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
6e80: 2f 64 78 66 22 20 20 20 20 20 20 20 20 20 20 20  /dxf"           
6e90: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6ea0: 20 22 64 78 72 22 2c 20 20 20 20 20 20 20 20 33   "dxr",        3
6eb0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
6ec0: 2d 64 69 72 65 63 74 6f 72 22 20 20 20 20 20 20  -director"      
6ed0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6ee0: 65 70 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20  eps",        3, 
6ef0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 6f 73  "application/pos
6f00: 74 73 63 72 69 70 74 22 20 20 20 20 20 20 20 20  tscript"        
6f10: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65 74      },.    { "et
6f20: 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74  x",        3, "t
6f30: 65 78 74 2f 78 2d 73 65 74 65 78 74 22 20 20 20  ext/x-setext"   
6f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f50: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65 78 65 22    },.    { "exe"
6f60: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
6f70: 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73  lication/octet-s
6f80: 74 72 65 61 6d 22 20 20 20 20 20 20 20 20 20 20  tream"          
6f90: 7d 2c 0a 20 20 20 20 7b 20 22 65 7a 22 2c 20 20  },.    { "ez",  
6fa0: 20 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69         2, "appli
6fb0: 63 61 74 69 6f 6e 2f 61 6e 64 72 65 77 2d 69 6e  cation/andrew-in
6fc0: 73 65 74 22 20 20 20 20 20 20 20 20 20 20 7d 2c  set"          },
6fd0: 0a 20 20 20 20 7b 20 22 66 22 2c 20 20 20 20 20  .    { "f",     
6fe0: 20 20 20 20 20 31 2c 20 22 74 65 78 74 2f 70 6c       1, "text/pl
6ff0: 61 69 6e 22 20 20 20 20 20 20 20 20 20 20 20 20  ain"            
7000: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7010: 20 20 20 7b 20 22 66 39 30 22 2c 20 20 20 20 20     { "f90",     
7020: 20 20 20 33 2c 20 22 74 65 78 74 2f 70 6c 61 69     3, "text/plai
7030: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
7040: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7050: 20 7b 20 22 66 6c 69 22 2c 20 20 20 20 20 20 20   { "fli",       
7060: 20 33 2c 20 22 76 69 64 65 6f 2f 66 6c 69 22 20   3, "video/fli" 
7070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7080: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7090: 20 22 66 6c 76 22 2c 20 20 20 20 20 20 20 20 33   "flv",        3
70a0: 2c 20 22 76 69 64 65 6f 2f 66 6c 76 22 20 20 20  , "video/flv"   
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70c0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
70d0: 67 69 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20  gif",        3, 
70e0: 22 69 6d 61 67 65 2f 67 69 66 22 20 20 20 20 20  "image/gif"     
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7100: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 67 6c      },.    { "gl
7110: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 76  ",         2, "v
7120: 69 64 65 6f 2f 67 6c 22 20 20 20 20 20 20 20 20  ideo/gl"        
7130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7140: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 67 74 61 72    },.    { "gtar
7150: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70 70  ",       4, "app
7160: 6c 69 63 61 74 69 6f 6e 2f 78 2d 67 74 61 72 22  lication/x-gtar"
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7180: 7d 2c 0a 20 20 20 20 7b 20 22 67 7a 22 2c 20 20  },.    { "gz",  
7190: 20 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69         2, "appli
71a0: 63 61 74 69 6f 6e 2f 78 2d 67 7a 69 70 22 20 20  cation/x-gzip"  
71b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
71c0: 0a 20 20 20 20 7b 20 22 68 64 66 22 2c 20 20 20  .    { "hdf",   
71d0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
71e0: 74 69 6f 6e 2f 78 2d 68 64 66 22 20 20 20 20 20  tion/x-hdf"     
71f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7200: 20 20 20 7b 20 22 68 68 22 2c 20 20 20 20 20 20     { "hh",      
7210: 20 20 20 32 2c 20 22 74 65 78 74 2f 70 6c 61 69     2, "text/plai
7220: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
7230: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7240: 20 7b 20 22 68 71 78 22 2c 20 20 20 20 20 20 20   { "hqx",       
7250: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
7260: 2f 6d 61 63 2d 62 69 6e 68 65 78 34 30 22 20 20  /mac-binhex40"  
7270: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7280: 20 22 68 22 2c 20 20 20 20 20 20 20 20 20 20 31   "h",          1
7290: 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20  , "text/plain"  
72a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72b0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
72c0: 68 74 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20  htm",        3, 
72d0: 22 74 65 78 74 2f 68 74 6d 6c 3b 20 63 68 61 72  "text/html; char
72e0: 73 65 74 3d 75 74 66 2d 38 22 20 20 20 20 20 20  set=utf-8"      
72f0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68 74      },.    { "ht
7300: 6d 6c 22 2c 20 20 20 20 20 20 20 34 2c 20 22 74  ml",       4, "t
7310: 65 78 74 2f 68 74 6d 6c 3b 20 63 68 61 72 73 65  ext/html; charse
7320: 74 3d 75 74 66 2d 38 22 20 20 20 20 20 20 20 20  t=utf-8"        
7330: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 63 65 22    },.    { "ice"
7340: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 78 2d 63  ,        3, "x-c
7350: 6f 6e 66 65 72 65 6e 63 65 2f 78 2d 63 6f 6f 6c  onference/x-cool
7360: 74 61 6c 6b 22 20 20 20 20 20 20 20 20 20 20 20  talk"           
7370: 7d 2c 0a 20 20 20 20 7b 20 22 69 65 66 22 2c 20  },.    { "ief", 
7380: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
7390: 2f 69 65 66 22 20 20 20 20 20 20 20 20 20 20 20  /ief"           
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
73b0: 0a 20 20 20 20 7b 20 22 69 67 65 73 22 2c 20 20  .    { "iges",  
73c0: 20 20 20 20 20 34 2c 20 22 6d 6f 64 65 6c 2f 69       4, "model/i
73d0: 67 65 73 22 20 20 20 20 20 20 20 20 20 20 20 20  ges"            
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
73f0: 20 20 20 7b 20 22 69 67 73 22 2c 20 20 20 20 20     { "igs",     
7400: 20 20 20 33 2c 20 22 6d 6f 64 65 6c 2f 69 67 65     3, "model/ige
7410: 73 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s"              
7420: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7430: 20 7b 20 22 69 70 73 22 2c 20 20 20 20 20 20 20   { "ips",       
7440: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
7450: 2f 78 2d 69 70 73 63 72 69 70 74 22 20 20 20 20  /x-ipscript"    
7460: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7470: 20 22 69 70 78 22 2c 20 20 20 20 20 20 20 20 33   "ipx",        3
7480: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
7490: 2d 69 70 69 78 22 20 20 20 20 20 20 20 20 20 20  -ipix"          
74a0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
74b0: 6a 61 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20  jad",        3, 
74c0: 22 74 65 78 74 2f 76 6e 64 2e 73 75 6e 2e 6a 32  "text/vnd.sun.j2
74d0: 6d 65 2e 61 70 70 2d 64 65 73 63 72 69 70 74 6f  me.app-descripto
74e0: 72 22 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 61  r"  },.    { "ja
74f0: 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  r",        3, "a
7500: 70 70 6c 69 63 61 74 69 6f 6e 2f 6a 61 76 61 2d  pplication/java-
7510: 61 72 63 68 69 76 65 22 20 20 20 20 20 20 20 20  archive"        
7520: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 70 65 67    },.    { "jpeg
7530: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 69 6d 61  ",       4, "ima
7540: 67 65 2f 6a 70 65 67 22 20 20 20 20 20 20 20 20  ge/jpeg"        
7550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7560: 7d 2c 0a 20 20 20 20 7b 20 22 6a 70 65 22 2c 20  },.    { "jpe", 
7570: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
7580: 2f 6a 70 65 67 22 20 20 20 20 20 20 20 20 20 20  /jpeg"          
7590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
75a0: 0a 20 20 20 20 7b 20 22 6a 70 67 22 2c 20 20 20  .    { "jpg",   
75b0: 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 6a       3, "image/j
75c0: 70 65 67 22 20 20 20 20 20 20 20 20 20 20 20 20  peg"            
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
75e0: 20 20 20 7b 20 22 6a 73 22 2c 20 20 20 20 20 20     { "js",      
75f0: 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69     2, "applicati
7600: 6f 6e 2f 78 2d 6a 61 76 61 73 63 72 69 70 74 22  on/x-javascript"
7610: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7620: 20 7b 20 22 6b 61 72 22 2c 20 20 20 20 20 20 20   { "kar",       
7630: 20 33 2c 20 22 61 75 64 69 6f 2f 6d 69 64 69 22   3, "audio/midi"
7640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7650: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7660: 20 22 6c 61 74 65 78 22 2c 20 20 20 20 20 20 35   "latex",      5
7670: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
7680: 2d 6c 61 74 65 78 22 20 20 20 20 20 20 20 20 20  -latex"         
7690: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
76a0: 6c 68 61 22 2c 20 20 20 20 20 20 20 20 33 2c 20  lha",        3, 
76b0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74  "application/oct
76c0: 65 74 2d 73 74 72 65 61 6d 22 20 20 20 20 20 20  et-stream"      
76d0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 73      },.    { "ls
76e0: 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  p",        3, "a
76f0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6c 69 73  pplication/x-lis
7700: 70 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p"              
7710: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 7a 68 22    },.    { "lzh"
7720: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
7730: 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73  lication/octet-s
7740: 74 72 65 61 6d 22 20 20 20 20 20 20 20 20 20 20  tream"          
7750: 7d 2c 0a 20 20 20 20 7b 20 22 6d 22 2c 20 20 20  },.    { "m",   
7760: 20 20 20 20 20 20 20 31 2c 20 22 74 65 78 74 2f         1, "text/
7770: 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20 20  plain"          
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7790: 0a 20 20 20 20 7b 20 22 6d 33 75 22 2c 20 20 20  .    { "m3u",   
77a0: 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 78       3, "audio/x
77b0: 2d 6d 70 65 67 75 72 6c 22 20 20 20 20 20 20 20  -mpegurl"       
77c0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
77d0: 20 20 20 7b 20 22 6d 61 6e 22 2c 20 20 20 20 20     { "man",     
77e0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
77f0: 6f 6e 2f 78 2d 74 72 6f 66 66 2d 6d 61 6e 22 20  on/x-troff-man" 
7800: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7810: 20 7b 20 22 6d 65 22 2c 20 20 20 20 20 20 20 20   { "me",        
7820: 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   2, "application
7830: 2f 78 2d 74 72 6f 66 66 2d 6d 65 22 20 20 20 20  /x-troff-me"    
7840: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7850: 20 22 6d 65 73 68 22 2c 20 20 20 20 20 20 20 34   "mesh",       4
7860: 2c 20 22 6d 6f 64 65 6c 2f 6d 65 73 68 22 20 20  , "model/mesh"  
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7880: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7890: 6d 69 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20  mid",        3, 
78a0: 22 61 75 64 69 6f 2f 6d 69 64 69 22 20 20 20 20  "audio/midi"    
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 69      },.    { "mi
78d0: 64 69 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61  di",       4, "a
78e0: 75 64 69 6f 2f 6d 69 64 69 22 20 20 20 20 20 20  udio/midi"      
78f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7900: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 69 66 22    },.    { "mif"
7910: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
7920: 6c 69 63 61 74 69 6f 6e 2f 78 2d 6d 69 66 22 20  lication/x-mif" 
7930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7940: 7d 2c 0a 20 20 20 20 7b 20 22 6d 69 6d 65 22 2c  },.    { "mime",
7950: 20 20 20 20 20 20 20 34 2c 20 22 77 77 77 2f 6d         4, "www/m
7960: 69 6d 65 22 20 20 20 20 20 20 20 20 20 20 20 20  ime"            
7970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7980: 0a 20 20 20 20 7b 20 22 6d 6f 76 69 65 22 2c 20  .    { "movie", 
7990: 20 20 20 20 20 35 2c 20 22 76 69 64 65 6f 2f 78       5, "video/x
79a0: 2d 73 67 69 2d 6d 6f 76 69 65 22 20 20 20 20 20  -sgi-movie"     
79b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
79c0: 20 20 20 7b 20 22 6d 6f 76 22 2c 20 20 20 20 20     { "mov",     
79d0: 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 71 75 69     3, "video/qui
79e0: 63 6b 74 69 6d 65 22 20 20 20 20 20 20 20 20 20  cktime"         
79f0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7a00: 20 7b 20 22 6d 70 32 22 2c 20 20 20 20 20 20 20   { "mp2",       
7a10: 20 33 2c 20 22 61 75 64 69 6f 2f 6d 70 65 67 22   3, "audio/mpeg"
7a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a30: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7a40: 20 22 6d 70 32 22 2c 20 20 20 20 20 20 20 20 33   "mp2",        3
7a50: 2c 20 22 76 69 64 65 6f 2f 6d 70 65 67 22 20 20  , "video/mpeg"  
7a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a70: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7a80: 6d 70 33 22 2c 20 20 20 20 20 20 20 20 33 2c 20  mp3",        3, 
7a90: 22 61 75 64 69 6f 2f 6d 70 65 67 22 20 20 20 20  "audio/mpeg"    
7aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ab0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70      },.    { "mp
7ac0: 65 67 22 2c 20 20 20 20 20 20 20 34 2c 20 22 76  eg",       4, "v
7ad0: 69 64 65 6f 2f 6d 70 65 67 22 20 20 20 20 20 20  ideo/mpeg"      
7ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7af0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 65 22    },.    { "mpe"
7b00: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64  ,        3, "vid
7b10: 65 6f 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20  eo/mpeg"        
7b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b30: 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 67 61 22 2c  },.    { "mpga",
7b40: 20 20 20 20 20 20 20 34 2c 20 22 61 75 64 69 6f         4, "audio
7b50: 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20 20 20  /mpeg"          
7b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7b70: 0a 20 20 20 20 7b 20 22 6d 70 67 22 2c 20 20 20  .    { "mpg",   
7b80: 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 6d       3, "video/m
7b90: 70 65 67 22 20 20 20 20 20 20 20 20 20 20 20 20  peg"            
7ba0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7bb0: 20 20 20 7b 20 22 6d 73 22 2c 20 20 20 20 20 20     { "ms",      
7bc0: 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69     2, "applicati
7bd0: 6f 6e 2f 78 2d 74 72 6f 66 66 2d 6d 73 22 20 20  on/x-troff-ms"  
7be0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7bf0: 20 7b 20 22 6d 73 68 22 2c 20 20 20 20 20 20 20   { "msh",       
7c00: 20 33 2c 20 22 6d 6f 64 65 6c 2f 6d 65 73 68 22   3, "model/mesh"
7c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c20: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7c30: 20 22 6e 63 22 2c 20 20 20 20 20 20 20 20 20 32   "nc",         2
7c40: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
7c50: 2d 6e 65 74 63 64 66 22 20 20 20 20 20 20 20 20  -netcdf"        
7c60: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7c70: 6f 64 61 22 2c 20 20 20 20 20 20 20 20 33 2c 20  oda",        3, 
7c80: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 64 61  "application/oda
7c90: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
7ca0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 67      },.    { "og
7cb0: 67 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  g",        3, "a
7cc0: 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 67 67 22 20  pplication/ogg" 
7cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ce0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 67 6d 22    },.    { "ogm"
7cf0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
7d00: 6c 69 63 61 74 69 6f 6e 2f 6f 67 67 22 20 20 20  lication/ogg"   
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d20: 7d 2c 0a 20 20 20 20 7b 20 22 70 62 6d 22 2c 20  },.    { "pbm", 
7d30: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
7d40: 2f 78 2d 70 6f 72 74 61 62 6c 65 2d 62 69 74 6d  /x-portable-bitm
7d50: 61 70 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c  ap"           },
7d60: 0a 20 20 20 20 7b 20 22 70 64 62 22 2c 20 20 20  .    { "pdb",   
7d70: 20 20 20 20 20 33 2c 20 22 63 68 65 6d 69 63 61       3, "chemica
7d80: 6c 2f 78 2d 70 64 62 22 20 20 20 20 20 20 20 20  l/x-pdb"        
7d90: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7da0: 20 20 20 7b 20 22 70 64 66 22 2c 20 20 20 20 20     { "pdf",     
7db0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
7dc0: 6f 6e 2f 70 64 66 22 20 20 20 20 20 20 20 20 20  on/pdf"         
7dd0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7de0: 20 7b 20 22 70 67 6d 22 2c 20 20 20 20 20 20 20   { "pgm",       
7df0: 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 70 6f 72   3, "image/x-por
7e00: 74 61 62 6c 65 2d 67 72 61 79 6d 61 70 22 20 20  table-graymap"  
7e10: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7e20: 20 22 70 67 6e 22 2c 20 20 20 20 20 20 20 20 33   "pgn",        3
7e30: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
7e40: 2d 63 68 65 73 73 2d 70 67 6e 22 20 20 20 20 20  -chess-pgn"     
7e50: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7e60: 70 67 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20  pgp",        3, 
7e70: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 67 70  "application/pgp
7e80: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
7e90: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 6c      },.    { "pl
7ea0: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61  ",         2, "a
7eb0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 70 65 72  pplication/x-per
7ec0: 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l"              
7ed0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 6d 22 2c    },.    { "pm",
7ee0: 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70 70           2, "app
7ef0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 70 65 72 6c 22  lication/x-perl"
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f10: 7d 2c 0a 20 20 20 20 7b 20 22 70 6e 67 22 2c 20  },.    { "png", 
7f20: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
7f30: 2f 70 6e 67 22 20 20 20 20 20 20 20 20 20 20 20  /png"           
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7f50: 0a 20 20 20 20 7b 20 22 70 6e 6d 22 2c 20 20 20  .    { "pnm",   
7f60: 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78       3, "image/x
7f70: 2d 70 6f 72 74 61 62 6c 65 2d 61 6e 79 6d 61 70  -portable-anymap
7f80: 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  "           },. 
7f90: 20 20 20 7b 20 22 70 6f 74 22 2c 20 20 20 20 20     { "pot",     
7fa0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
7fb0: 6f 6e 2f 6d 73 70 6f 77 65 72 70 6f 69 6e 74 22  on/mspowerpoint"
7fc0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7fd0: 20 7b 20 22 70 70 6d 22 2c 20 20 20 20 20 20 20   { "ppm",       
7fe0: 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 70 6f 72   3, "image/x-por
7ff0: 74 61 62 6c 65 2d 70 69 78 6d 61 70 22 20 20 20  table-pixmap"   
8000: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8010: 20 22 70 70 73 22 2c 20 20 20 20 20 20 20 20 33   "pps",        3
8020: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d  , "application/m
8030: 73 70 6f 77 65 72 70 6f 69 6e 74 22 20 20 20 20  spowerpoint"    
8040: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8050: 70 70 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20  ppt",        3, 
8060: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 70  "application/msp
8070: 6f 77 65 72 70 6f 69 6e 74 22 20 20 20 20 20 20  owerpoint"      
8080: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 70      },.    { "pp
8090: 7a 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  z",        3, "a
80a0: 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 70 6f 77  pplication/mspow
80b0: 65 72 70 6f 69 6e 74 22 20 20 20 20 20 20 20 20  erpoint"        
80c0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 72 65 22    },.    { "pre"
80d0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
80e0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 66 72 65 65 6c  lication/x-freel
80f0: 61 6e 63 65 22 20 20 20 20 20 20 20 20 20 20 20  ance"           
8100: 7d 2c 0a 20 20 20 20 7b 20 22 70 72 74 22 2c 20  },.    { "prt", 
8110: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
8120: 63 61 74 69 6f 6e 2f 70 72 6f 5f 65 6e 67 22 20  cation/pro_eng" 
8130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8140: 0a 20 20 20 20 7b 20 22 70 73 22 2c 20 20 20 20  .    { "ps",    
8150: 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61       2, "applica
8160: 74 69 6f 6e 2f 70 6f 73 74 73 63 72 69 70 74 22  tion/postscript"
8170: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8180: 20 20 20 7b 20 22 71 74 22 2c 20 20 20 20 20 20     { "qt",      
8190: 20 20 20 32 2c 20 22 76 69 64 65 6f 2f 71 75 69     2, "video/qui
81a0: 63 6b 74 69 6d 65 22 20 20 20 20 20 20 20 20 20  cktime"         
81b0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
81c0: 20 7b 20 22 72 61 22 2c 20 20 20 20 20 20 20 20   { "ra",        
81d0: 20 32 2c 20 22 61 75 64 69 6f 2f 78 2d 72 65 61   2, "audio/x-rea
81e0: 6c 61 75 64 69 6f 22 20 20 20 20 20 20 20 20 20  laudio"         
81f0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8200: 20 22 72 61 6d 22 2c 20 20 20 20 20 20 20 20 33   "ram",        3
8210: 2c 20 22 61 75 64 69 6f 2f 78 2d 70 6e 2d 72 65  , "audio/x-pn-re
8220: 61 6c 61 75 64 69 6f 22 20 20 20 20 20 20 20 20  alaudio"        
8230: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8240: 72 61 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20  rar",        3, 
8250: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 72  "application/x-r
8260: 61 72 2d 63 6f 6d 70 72 65 73 73 65 64 22 20 20  ar-compressed"  
8270: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61      },.    { "ra
8280: 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69  s",        3, "i
8290: 6d 61 67 65 2f 63 6d 75 2d 72 61 73 74 65 72 22  mage/cmu-raster"
82a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82b0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61 73 22    },.    { "ras"
82c0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61  ,        3, "ima
82d0: 67 65 2f 78 2d 63 6d 75 2d 72 61 73 74 65 72 22  ge/x-cmu-raster"
82e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82f0: 7d 2c 0a 20 20 20 20 7b 20 22 72 67 62 22 2c 20  },.    { "rgb", 
8300: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
8310: 2f 78 2d 72 67 62 22 20 20 20 20 20 20 20 20 20  /x-rgb"         
8320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8330: 0a 20 20 20 20 7b 20 22 72 6d 22 2c 20 20 20 20  .    { "rm",    
8340: 20 20 20 20 20 32 2c 20 22 61 75 64 69 6f 2f 78       2, "audio/x
8350: 2d 70 6e 2d 72 65 61 6c 61 75 64 69 6f 22 20 20  -pn-realaudio"  
8360: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8370: 20 20 20 7b 20 22 72 6f 66 66 22 2c 20 20 20 20     { "roff",    
8380: 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69     4, "applicati
8390: 6f 6e 2f 78 2d 74 72 6f 66 66 22 20 20 20 20 20  on/x-troff"     
83a0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
83b0: 20 7b 20 22 72 70 6d 22 2c 20 20 20 20 20 20 20   { "rpm",       
83c0: 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 70 6e 2d   3, "audio/x-pn-
83d0: 72 65 61 6c 61 75 64 69 6f 2d 70 6c 75 67 69 6e  realaudio-plugin
83e0: 22 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  "       },.    {
83f0: 20 22 72 74 66 22 2c 20 20 20 20 20 20 20 20 33   "rtf",        3
8400: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 72  , "application/r
8410: 74 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20  tf"             
8420: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8430: 72 74 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20  rtf",        3, 
8440: 22 74 65 78 74 2f 72 74 66 22 20 20 20 20 20 20  "text/rtf"      
8450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8460: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 74      },.    { "rt
8470: 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74  x",        3, "t
8480: 65 78 74 2f 72 69 63 68 74 65 78 74 22 20 20 20  ext/richtext"   
8490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84a0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 63 6d 22    },.    { "scm"
84b0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
84c0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 6c 6f 74 75 73  lication/x-lotus
84d0: 73 63 72 65 65 6e 63 61 6d 22 20 20 20 20 20 20  screencam"      
84e0: 7d 2c 0a 20 20 20 20 7b 20 22 73 65 74 22 2c 20  },.    { "set", 
84f0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
8500: 63 61 74 69 6f 6e 2f 73 65 74 22 20 20 20 20 20  cation/set"     
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8520: 0a 20 20 20 20 7b 20 22 73 67 6d 6c 22 2c 20 20  .    { "sgml",  
8530: 20 20 20 20 20 34 2c 20 22 74 65 78 74 2f 73 67       4, "text/sg
8540: 6d 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ml"             
8550: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8560: 20 20 20 7b 20 22 73 67 6d 22 2c 20 20 20 20 20     { "sgm",     
8570: 20 20 20 33 2c 20 22 74 65 78 74 2f 73 67 6d 6c     3, "text/sgml
8580: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8590: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
85a0: 20 7b 20 22 73 68 22 2c 20 20 20 20 20 20 20 20   { "sh",        
85b0: 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   2, "application
85c0: 2f 78 2d 73 68 22 20 20 20 20 20 20 20 20 20 20  /x-sh"          
85d0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
85e0: 20 22 73 68 61 72 22 2c 20 20 20 20 20 20 20 34   "shar",       4
85f0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
8600: 2d 73 68 61 72 22 20 20 20 20 20 20 20 20 20 20  -shar"          
8610: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8620: 73 69 6c 6f 22 2c 20 20 20 20 20 20 20 34 2c 20  silo",       4, 
8630: 22 6d 6f 64 65 6c 2f 6d 65 73 68 22 20 20 20 20  "model/mesh"    
8640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8650: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 69      },.    { "si
8660: 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  t",        3, "a
8670: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 74 75  pplication/x-stu
8680: 66 66 69 74 22 20 20 20 20 20 20 20 20 20 20 20  ffit"           
8690: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6b 64 22    },.    { "skd"
86a0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
86b0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 6b 6f 61 6e 22  lication/x-koan"
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86d0: 7d 2c 0a 20 20 20 20 7b 20 22 73 6b 6d 22 2c 20  },.    { "skm", 
86e0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
86f0: 63 61 74 69 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20  cation/x-koan"  
8700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8710: 0a 20 20 20 20 7b 20 22 73 6b 70 22 2c 20 20 20  .    { "skp",   
8720: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
8730: 74 69 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20 20  tion/x-koan"    
8740: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8750: 20 20 20 7b 20 22 73 6b 74 22 2c 20 20 20 20 20     { "skt",     
8760: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
8770: 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20 20 20 20  on/x-koan"      
8780: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8790: 20 7b 20 22 73 6d 69 22 2c 20 20 20 20 20 20 20   { "smi",       
87a0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
87b0: 2f 73 6d 69 6c 22 20 20 20 20 20 20 20 20 20 20  /smil"          
87c0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
87d0: 20 22 73 6d 69 6c 22 2c 20 20 20 20 20 20 20 34   "smil",       4
87e0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 73  , "application/s
87f0: 6d 69 6c 22 20 20 20 20 20 20 20 20 20 20 20 20  mil"            
8800: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8810: 73 6e 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20  snd",        3, 
8820: 22 61 75 64 69 6f 2f 62 61 73 69 63 22 20 20 20  "audio/basic"   
8830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8840: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6f      },.    { "so
8850: 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  l",        3, "a
8860: 70 70 6c 69 63 61 74 69 6f 6e 2f 73 6f 6c 69 64  pplication/solid
8870: 73 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s"              
8880: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 70 6c 22    },.    { "spl"
8890: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
88a0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 66 75 74 75 72  lication/x-futur
88b0: 65 73 70 6c 61 73 68 22 20 20 20 20 20 20 20 20  esplash"        
88c0: 7d 2c 0a 20 20 20 20 7b 20 22 73 72 63 22 2c 20  },.    { "src", 
88d0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
88e0: 63 61 74 69 6f 6e 2f 78 2d 77 61 69 73 2d 73 6f  cation/x-wais-so
88f0: 75 72 63 65 22 20 20 20 20 20 20 20 20 20 7d 2c  urce"         },
8900: 0a 20 20 20 20 7b 20 22 73 74 65 70 22 2c 20 20  .    { "step",  
8910: 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61       4, "applica
8920: 74 69 6f 6e 2f 53 54 45 50 22 20 20 20 20 20 20  tion/STEP"      
8930: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8940: 20 20 20 7b 20 22 73 74 6c 22 2c 20 20 20 20 20     { "stl",     
8950: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
8960: 6f 6e 2f 53 4c 41 22 20 20 20 20 20 20 20 20 20  on/SLA"         
8970: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8980: 20 7b 20 22 73 74 70 22 2c 20 20 20 20 20 20 20   { "stp",       
8990: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
89a0: 2f 53 54 45 50 22 20 20 20 20 20 20 20 20 20 20  /STEP"          
89b0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
89c0: 20 22 73 76 34 63 70 69 6f 22 2c 20 20 20 20 37   "sv4cpio",    7
89d0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
89e0: 2d 73 76 34 63 70 69 6f 22 20 20 20 20 20 20 20  -sv4cpio"       
89f0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8a00: 73 76 34 63 72 63 22 2c 20 20 20 20 20 36 2c 20  sv4crc",     6, 
8a10: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73  "application/x-s
8a20: 76 34 63 72 63 22 20 20 20 20 20 20 20 20 20 20  v4crc"          
8a30: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 77      },.    { "sw
8a40: 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  f",        3, "a
8a50: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 68 6f  pplication/x-sho
8a60: 63 6b 77 61 76 65 2d 66 6c 61 73 68 22 20 20 20  ckwave-flash"   
8a70: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 22 2c 20    },.    { "t", 
8a80: 20 20 20 20 20 20 20 20 20 31 2c 20 22 61 70 70           1, "app
8a90: 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72 6f 66 66  lication/x-troff
8aa0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8ab0: 7d 2c 0a 20 20 20 20 7b 20 22 74 61 72 22 2c 20  },.    { "tar", 
8ac0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
8ad0: 63 61 74 69 6f 6e 2f 78 2d 74 61 72 22 20 20 20  cation/x-tar"   
8ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8af0: 0a 20 20 20 20 7b 20 22 74 63 6c 22 2c 20 20 20  .    { "tcl",   
8b00: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
8b10: 74 69 6f 6e 2f 78 2d 74 63 6c 22 20 20 20 20 20  tion/x-tcl"     
8b20: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8b30: 20 20 20 7b 20 22 74 65 78 22 2c 20 20 20 20 20     { "tex",     
8b40: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
8b50: 6f 6e 2f 78 2d 74 65 78 22 20 20 20 20 20 20 20  on/x-tex"       
8b60: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8b70: 20 7b 20 22 74 65 78 69 22 2c 20 20 20 20 20 20   { "texi",      
8b80: 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   4, "application
8b90: 2f 78 2d 74 65 78 69 6e 66 6f 22 20 20 20 20 20  /x-texinfo"     
8ba0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8bb0: 20 22 74 65 78 69 6e 66 6f 22 2c 20 20 20 20 37   "texinfo",    7
8bc0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
8bd0: 2d 74 65 78 69 6e 66 6f 22 20 20 20 20 20 20 20  -texinfo"       
8be0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8bf0: 74 67 7a 22 2c 20 20 20 20 20 20 20 20 33 2c 20  tgz",        3, 
8c00: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74  "application/x-t
8c10: 61 72 2d 67 7a 22 20 20 20 20 20 20 20 20 20 20  ar-gz"          
8c20: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 69      },.    { "ti
8c30: 66 66 22 2c 20 20 20 20 20 20 20 34 2c 20 22 69  ff",       4, "i
8c40: 6d 61 67 65 2f 74 69 66 66 22 20 20 20 20 20 20  mage/tiff"      
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c60: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 69 66 22    },.    { "tif"
8c70: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61  ,        3, "ima
8c80: 67 65 2f 74 69 66 66 22 20 20 20 20 20 20 20 20  ge/tiff"        
8c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ca0: 7d 2c 0a 20 20 20 20 7b 20 22 74 72 22 2c 20 20  },.    { "tr",  
8cb0: 20 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69         2, "appli
8cc0: 63 61 74 69 6f 6e 2f 78 2d 74 72 6f 66 66 22 20  cation/x-troff" 
8cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8ce0: 0a 20 20 20 20 7b 20 22 74 73 69 22 2c 20 20 20  .    { "tsi",   
8cf0: 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 54       3, "audio/T
8d00: 53 50 2d 61 75 64 69 6f 22 20 20 20 20 20 20 20  SP-audio"       
8d10: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8d20: 20 20 20 7b 20 22 74 73 70 22 2c 20 20 20 20 20     { "tsp",     
8d30: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
8d40: 6f 6e 2f 64 73 70 74 79 70 65 22 20 20 20 20 20  on/dsptype"     
8d50: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8d60: 20 7b 20 22 74 73 76 22 2c 20 20 20 20 20 20 20   { "tsv",       
8d70: 20 33 2c 20 22 74 65 78 74 2f 74 61 62 2d 73 65   3, "text/tab-se
8d80: 70 61 72 61 74 65 64 2d 76 61 6c 75 65 73 22 20  parated-values" 
8d90: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8da0: 20 22 74 78 74 22 2c 20 20 20 20 20 20 20 20 33   "txt",        3
8db0: 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20  , "text/plain"  
8dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8dd0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8de0: 75 6e 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20  unv",        3, 
8df0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 69 2d 64  "application/i-d
8e00: 65 61 73 22 20 20 20 20 20 20 20 20 20 20 20 20  eas"            
8e10: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 75 73      },.    { "us
8e20: 74 61 72 22 2c 20 20 20 20 20 20 35 2c 20 22 61  tar",      5, "a
8e30: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 75 73 74  pplication/x-ust
8e40: 61 72 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ar"             
8e50: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 76 63 64 22    },.    { "vcd"
8e60: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
8e70: 6c 69 63 61 74 69 6f 6e 2f 78 2d 63 64 6c 69 6e  lication/x-cdlin
8e80: 6b 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k"              
8e90: 7d 2c 0a 20 20 20 20 7b 20 22 76 64 61 22 2c 20  },.    { "vda", 
8ea0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
8eb0: 63 61 74 69 6f 6e 2f 76 64 61 22 20 20 20 20 20  cation/vda"     
8ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8ed0: 0a 20 20 20 20 7b 20 22 76 69 76 22 2c 20 20 20  .    { "viv",   
8ee0: 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 76       3, "video/v
8ef0: 6e 64 2e 76 69 76 6f 22 20 20 20 20 20 20 20 20  nd.vivo"        
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8f10: 20 20 20 7b 20 22 76 69 76 6f 22 2c 20 20 20 20     { "vivo",    
8f20: 20 20 20 34 2c 20 22 76 69 64 65 6f 2f 76 6e 64     4, "video/vnd
8f30: 2e 76 69 76 6f 22 20 20 20 20 20 20 20 20 20 20  .vivo"          
8f40: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8f50: 20 7b 20 22 76 72 6d 6c 22 2c 20 20 20 20 20 20   { "vrml",      
8f60: 20 34 2c 20 22 6d 6f 64 65 6c 2f 76 72 6d 6c 22   4, "model/vrml"
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f80: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8f90: 20 22 76 73 69 78 22 2c 20 20 20 20 20 20 20 34   "vsix",       4
8fa0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76  , "application/v
8fb0: 73 69 78 22 20 20 20 20 20 20 20 20 20 20 20 20  six"            
8fc0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8fd0: 77 61 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20  wav",        3, 
8fe0: 22 61 75 64 69 6f 2f 78 2d 77 61 76 22 20 20 20  "audio/x-wav"   
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9000: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 61      },.    { "wa
9010: 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  x",        3, "a
9020: 75 64 69 6f 2f 78 2d 6d 73 2d 77 61 78 22 20 20  udio/x-ms-wax"  
9030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9040: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 69 6b 69    },.    { "wiki
9050: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70 70  ",       4, "app
9060: 6c 69 63 61 74 69 6f 6e 2f 78 2d 66 6f 73 73 69  lication/x-fossi
9070: 6c 2d 77 69 6b 69 22 20 20 20 20 20 20 20 20 20  l-wiki"         
9080: 7d 2c 0a 20 20 20 20 7b 20 22 77 6d 61 22 2c 20  },.    { "wma", 
9090: 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f         3, "audio
90a0: 2f 78 2d 6d 73 2d 77 6d 61 22 20 20 20 20 20 20  /x-ms-wma"      
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
90c0: 0a 20 20 20 20 7b 20 22 77 6d 76 22 2c 20 20 20  .    { "wmv",   
90d0: 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 78       3, "video/x
90e0: 2d 6d 73 2d 77 6d 76 22 20 20 20 20 20 20 20 20  -ms-wmv"        
90f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
9100: 20 20 20 7b 20 22 77 6d 78 22 2c 20 20 20 20 20     { "wmx",     
9110: 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d     3, "video/x-m
9120: 73 2d 77 6d 78 22 20 20 20 20 20 20 20 20 20 20  s-wmx"          
9130: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9140: 20 7b 20 22 77 72 6c 22 2c 20 20 20 20 20 20 20   { "wrl",       
9150: 20 33 2c 20 22 6d 6f 64 65 6c 2f 76 72 6d 6c 22   3, "model/vrml"
9160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9170: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
9180: 20 22 77 76 78 22 2c 20 20 20 20 20 20 20 20 33   "wvx",        3
9190: 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 77 76  , "video/x-ms-wv
91a0: 78 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x"              
91b0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
91c0: 78 62 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20  xbm",        3, 
91d0: 22 69 6d 61 67 65 2f 78 2d 78 62 69 74 6d 61 70  "image/x-xbitmap
91e0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
91f0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 6c      },.    { "xl
9200: 63 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  c",        3, "a
9210: 70 70 6c 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d  pplication/vnd.m
9220: 73 2d 65 78 63 65 6c 22 20 20 20 20 20 20 20 20  s-excel"        
9230: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 6c 6c 22    },.    { "xll"
9240: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
9250: 6c 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d  lication/vnd.ms-
9260: 65 78 63 65 6c 22 20 20 20 20 20 20 20 20 20 20  excel"          
9270: 7d 2c 0a 20 20 20 20 7b 20 22 78 6c 6d 22 2c 20  },.    { "xlm", 
9280: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
9290: 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78  cation/vnd.ms-ex
92a0: 63 65 6c 22 20 20 20 20 20 20 20 20 20 20 7d 2c  cel"          },
92b0: 0a 20 20 20 20 7b 20 22 78 6c 73 22 2c 20 20 20  .    { "xls",   
92c0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
92d0: 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65  tion/vnd.ms-exce
92e0: 6c 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  l"          },. 
92f0: 20 20 20 7b 20 22 78 6c 77 22 2c 20 20 20 20 20     { "xlw",     
9300: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
9310: 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22  on/vnd.ms-excel"
9320: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9330: 20 7b 20 22 78 6d 6c 22 2c 20 20 20 20 20 20 20   { "xml",       
9340: 20 33 2c 20 22 74 65 78 74 2f 78 6d 6c 22 20 20   3, "text/xml"  
9350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9360: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
9370: 20 22 78 70 6d 22 2c 20 20 20 20 20 20 20 20 33   "xpm",        3
9380: 2c 20 22 69 6d 61 67 65 2f 78 2d 78 70 69 78 6d  , "image/x-xpixm
9390: 61 70 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ap"             
93a0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
93b0: 78 77 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20  xwd",        3, 
93c0: 22 69 6d 61 67 65 2f 78 2d 78 77 69 6e 64 6f 77  "image/x-xwindow
93d0: 64 75 6d 70 22 20 20 20 20 20 20 20 20 20 20 20  dump"           
93e0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 79      },.    { "xy
93f0: 7a 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 63  z",        3, "c
9400: 68 65 6d 69 63 61 6c 2f 78 2d 70 64 62 22 20 20  hemical/x-pdb"  
9410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9420: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 7a 69 70 22    },.    { "zip"
9430: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
9440: 6c 69 63 61 74 69 6f 6e 2f 7a 69 70 22 20 20 20  lication/zip"   
9450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9460: 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 66 6f 72 28 69  },.  };..  for(i
9470: 3d 6e 4e 61 6d 65 2d 31 3b 20 69 3e 30 20 26 26  =nName-1; i>0 &&
9480: 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 2e 27 3b 20   zName[i]!='.'; 
9490: 69 2d 2d 29 7b 7d 0a 20 20 7a 20 3d 20 26 7a 4e  i--){}.  z = &zN
94a0: 61 6d 65 5b 69 2b 31 5d 3b 0a 20 20 6c 65 6e 20  ame[i+1];.  len 
94b0: 3d 20 6e 4e 61 6d 65 20 2d 20 69 3b 0a 20 20 69  = nName - i;.  i
94c0: 66 28 20 6c 65 6e 3c 28 69 6e 74 29 73 69 7a 65  f( len<(int)size
94d0: 6f 66 28 7a 53 75 66 66 69 78 29 2d 31 20 29 7b  of(zSuffix)-1 ){
94e0: 0a 20 20 20 20 73 74 72 63 70 79 28 7a 53 75 66  .    strcpy(zSuf
94f0: 66 69 78 2c 20 7a 29 3b 0a 20 20 20 20 66 6f 72  fix, z);.    for
9500: 28 69 3d 30 3b 20 7a 53 75 66 66 69 78 5b 69 5d  (i=0; zSuffix[i]
9510: 3b 20 69 2b 2b 29 20 7a 53 75 66 66 69 78 5b 69  ; i++) zSuffix[i
9520: 5d 20 3d 20 74 6f 6c 6f 77 65 72 28 7a 53 75 66  ] = tolower(zSuf
9530: 66 69 78 5b 69 5d 29 3b 0a 20 20 20 20 66 69 72  fix[i]);.    fir
9540: 73 74 20 3d 20 30 3b 0a 20 20 20 20 6c 61 73 74  st = 0;.    last
9550: 20 3d 20 73 69 7a 65 6f 66 28 61 4d 69 6d 65 29   = sizeof(aMime)
9560: 2f 73 69 7a 65 6f 66 28 61 4d 69 6d 65 5b 30 5d  /sizeof(aMime[0]
9570: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 66 69  );.    while( fi
9580: 72 73 74 3c 3d 6c 61 73 74 20 29 7b 0a 20 20 20  rst<=last ){.   
9590: 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
95a0: 69 20 3d 20 28 66 69 72 73 74 2b 6c 61 73 74 29  i = (first+last)
95b0: 2f 32 3b 0a 20 20 20 20 20 20 63 20 3d 20 73 74  /2;.      c = st
95c0: 72 63 6d 70 28 7a 53 75 66 66 69 78 2c 20 61 4d  rcmp(zSuffix, aM
95d0: 69 6d 65 5b 69 5d 2e 7a 53 75 66 66 69 78 29 3b  ime[i].zSuffix);
95e0: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
95f0: 29 20 72 65 74 75 72 6e 20 61 4d 69 6d 65 5b 69  ) return aMime[i
9600: 5d 2e 7a 4d 69 6d 65 74 79 70 65 3b 0a 20 20 20  ].zMimetype;.   
9610: 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20     if( c<0 ){.  
9620: 20 20 20 20 20 20 6c 61 73 74 20 3d 20 69 2d 31        last = i-1
9630: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9640: 20 20 20 20 20 20 20 66 69 72 73 74 20 3d 20 69         first = i
9650: 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  +1;.      }.    
9660: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22  }.  }.  return "
9670: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65  application/octe
9680: 74 2d 73 74 72 65 61 6d 22 3b 0a 7d 0a 0a 2f 2a  t-stream";.}../*
9690: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
96a0: 67 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73  g table contains
96b0: 20 31 20 66 6f 72 20 61 6c 6c 20 63 68 61 72 61   1 for all chara
96c0: 63 74 65 72 73 20 74 68 61 74 20 61 72 65 20 70  cters that are p
96d0: 65 72 6d 69 74 74 65 64 20 69 6e 0a 2a 2a 20 74  ermitted in.** t
96e0: 68 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 55  he part of the U
96f0: 52 4c 20 62 65 66 6f 72 65 20 74 68 65 20 71 75  RL before the qu
9700: 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 61  ery parameters a
9710: 6e 64 20 66 72 61 67 6d 65 6e 74 2e 0a 2a 2a 0a  nd fragment..**.
9720: 2a 2a 20 41 6c 6c 6f 77 65 64 20 63 68 61 72 61  ** Allowed chara
9730: 63 74 65 72 73 3a 20 20 30 2d 39 61 2d 7a 41 2d  cters:  0-9a-zA-
9740: 5a 2c 2d 2e 2f 3a 5f 7e 0a 2a 2a 0a 2a 2a 20 44  Z,-./:_~.**.** D
9750: 69 73 61 6c 6c 6f 77 65 64 20 63 68 61 72 61 63  isallowed charac
9760: 74 65 72 73 20 69 6e 63 6c 75 64 65 3a 20 20 21  ters include:  !
9770: 22 23 24 25 26 27 28 29 2a 2b 3b 3c 3d 3e 3f 5b  "#$%&'()*+;<=>?[
9780: 5c 5d 5e 7b 7c 7d 0a 2a 2f 0a 73 74 61 74 69 63  \]^{|}.*/.static
9790: 20 63 6f 6e 73 74 20 63 68 61 72 20 61 6c 6c 6f   const char allo
97a0: 77 65 64 49 6e 4e 61 6d 65 5b 5d 20 3d 20 7b 0a  wedInName[] = {.
97b0: 20 20 20 20 20 20 2f 2a 20 20 78 30 20 20 78 31        /*  x0  x1
97c0: 20 20 78 32 20 20 78 33 20 20 78 34 20 20 78 35    x2  x3  x4  x5
97d0: 20 20 78 36 20 20 78 37 20 20 78 38 20 20 78 39    x6  x7  x8  x9
97e0: 20 20 78 61 20 20 78 62 20 20 78 63 20 20 78 64    xa  xb  xc  xd
97f0: 20 20 78 65 20 20 78 66 20 2a 2f 0a 2f 2a 20 30    xe  xf */./* 0
9800: 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30  x */   0,  0,  0
9810: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9820: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9830: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9840: 2c 20 20 30 2c 0a 2f 2a 20 31 78 20 2a 2f 20 20  ,  0,./* 1x */  
9850: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9860: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9870: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9880: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a   0,  0,  0,  0,.
9890: 2f 2a 20 32 78 20 2a 2f 20 20 20 30 2c 20 20 30  /* 2x */   0,  0
98a0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
98b0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
98c0: 2c 20 20 30 2c 20 20 30 2c 20 20 31 2c 20 20 31  ,  0,  0,  1,  1
98d0: 2c 20 20 31 2c 20 20 31 2c 0a 2f 2a 20 33 78 20  ,  1,  1,./* 3x 
98e0: 2a 2f 20 20 20 31 2c 20 20 31 2c 20 20 31 2c 20  */   1,  1,  1, 
98f0: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
9900: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
9910: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9920: 20 30 2c 0a 2f 2a 20 34 78 20 2a 2f 20 20 20 30   0,./* 4x */   0
9930: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
9940: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
9950: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
9960: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 0a 2f 2a  ,  1,  1,  1,./*
9970: 20 35 78 20 2a 2f 20 20 20 31 2c 20 20 31 2c 20   5x */   1,  1, 
9980: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
9990: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
99a0: 20 31 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   1,  0,  0,  0, 
99b0: 20 30 2c 20 20 31 2c 0a 2f 2a 20 36 78 20 2a 2f   0,  1,./* 6x */
99c0: 20 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 31     0,  1,  1,  1
99d0: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
99e0: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
99f0: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
9a00: 2c 0a 2f 2a 20 37 78 20 2a 2f 20 20 20 31 2c 20  ,./* 7x */   1, 
9a10: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
9a20: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
9a30: 20 31 2c 20 20 31 2c 20 20 30 2c 20 20 30 2c 20   1,  1,  0,  0, 
9a40: 20 30 2c 20 20 31 2c 20 20 30 2c 0a 2f 2a 20 38   0,  1,  0,./* 8
9a50: 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30  x */   0,  0,  0
9a60: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9a70: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9a80: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9a90: 2c 20 20 30 2c 0a 2f 2a 20 39 78 20 2a 2f 20 20  ,  0,./* 9x */  
9aa0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9ab0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9ac0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9ad0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a   0,  0,  0,  0,.
9ae0: 2f 2a 20 41 78 20 2a 2f 20 20 20 30 2c 20 20 30  /* Ax */   0,  0
9af0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9b00: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9b10: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9b20: 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 42 78 20  ,  0,  0,./* Bx 
9b30: 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20  */   0,  0,  0, 
9b40: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9b50: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9b60: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9b70: 20 30 2c 0a 2f 2a 20 43 78 20 2a 2f 20 20 20 30   0,./* Cx */   0
9b80: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9b90: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9ba0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9bb0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a  ,  0,  0,  0,./*
9bc0: 20 44 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20   Dx */   0,  0, 
9bd0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9be0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9bf0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9c00: 20 30 2c 20 20 30 2c 0a 2f 2a 20 45 78 20 2a 2f   0,  0,./* Ex */
9c10: 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30     0,  0,  0,  0
9c20: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9c30: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9c40: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9c50: 2c 0a 2f 2a 20 46 78 20 2a 2f 20 20 20 30 2c 20  ,./* Fx */   0, 
9c60: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9c70: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9c80: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9c90: 20 30 2c 20 20 30 2c 20 20 30 2c 0a 7d 3b 0a 0a   0,  0,  0,.};..
9ca0: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c  /*.** Remove all
9cb0: 20 64 69 73 61 6c 6c 6f 77 65 64 20 63 68 61 72   disallowed char
9cc0: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 69 6e  acters in the in
9cd0: 70 75 74 20 73 74 72 69 6e 67 20 7a 5b 5d 2e 20  put string z[]. 
9ce0: 20 43 6f 6e 76 65 72 74 20 61 6e 79 0a 2a 2a 20   Convert any.** 
9cf0: 64 69 73 61 6c 6c 6f 77 65 64 20 63 68 61 72 61  disallowed chara
9d00: 63 74 65 72 73 20 69 6e 74 6f 20 22 5f 22 2e 0a  cters into "_"..
9d10: 2a 2a 0a 2a 2a 20 4e 6f 74 20 74 68 61 74 20 74  **.** Not that t
9d20: 68 65 20 74 68 72 65 65 20 63 68 61 72 61 63 74  he three charact
9d30: 65 72 20 73 65 71 75 65 6e 63 65 20 22 25 58 58  er sequence "%XX
9d40: 22 20 77 68 65 72 65 20 58 20 69 73 20 61 6e 79  " where X is any
9d50: 20 62 79 74 65 20 69 73 0a 2a 2a 20 63 6f 6e 76   byte is.** conv
9d60: 65 72 74 65 64 20 69 6e 74 6f 20 61 20 73 69 6e  erted into a sin
9d70: 67 6c 65 20 22 5f 22 20 63 68 61 72 61 63 74 65  gle "_" characte
9d80: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
9d90: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
9da0: 61 72 61 63 74 65 72 73 20 63 6f 6e 76 65 72 74  aracters convert
9db0: 65 64 2e 20 20 41 6e 20 22 25 58 58 22 20 2d 3e  ed.  An "%XX" ->
9dc0: 20 22 5f 22 20 63 6f 6e 76 65 72 73 69 6f 6e 0a   "_" conversion.
9dd0: 2a 2a 20 63 6f 75 6e 74 73 20 61 73 20 61 20 73  ** counts as a s
9de0: 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72 2e  ingle character.
9df0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
9e00: 61 6e 69 74 69 7a 65 53 74 72 69 6e 67 28 63 68  anitizeString(ch
9e10: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 43  ar *z){.  int nC
9e20: 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 77 68 69  hange = 0;.  whi
9e30: 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 69 66  le( *z ){.    if
9e40: 28 20 21 61 6c 6c 6f 77 65 64 49 6e 4e 61 6d 65  ( !allowedInName
9e50: 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  [*(unsigned char
9e60: 2a 29 7a 5d 20 29 7b 0a 20 20 20 20 20 20 69 66  *)z] ){.      if
9e70: 28 20 2a 7a 3d 3d 27 25 27 20 26 26 20 7a 5b 31  ( *z=='%' && z[1
9e80: 5d 21 3d 30 20 26 26 20 7a 5b 32 5d 21 3d 30 20  ]!=0 && z[2]!=0 
9e90: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
9ea0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
9eb0: 33 3b 20 28 7a 5b 69 2d 32 5d 20 3d 20 7a 5b 69  3; (z[i-2] = z[i
9ec0: 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ])!=0; i++){}.  
9ed0: 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 7a 20 3d      }.      *z =
9ee0: 20 27 5f 27 3b 0a 20 20 20 20 20 20 6e 43 68 61   '_';.      nCha
9ef0: 6e 67 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  nge++;.    }.   
9f00: 20 7a 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75   z++;.  }.  retu
9f10: 72 6e 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f  rn nChange;.}../
9f20: 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e  *.** Count the n
9f30: 75 6d 62 65 72 20 6f 66 20 22 2f 22 20 63 68 61  umber of "/" cha
9f40: 72 61 63 74 65 72 73 20 69 6e 20 61 20 73 74 72  racters in a str
9f50: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
9f60: 6e 74 20 63 6f 75 6e 74 53 6c 61 73 68 65 73 28  nt countSlashes(
9f70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
9f80: 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 77    int n = 0;.  w
9f90: 68 69 6c 65 28 20 2a 7a 20 29 20 69 66 28 20 2a  hile( *z ) if( *
9fa0: 28 7a 2b 2b 29 3d 3d 27 2f 27 20 29 20 6e 2b 2b  (z++)=='/' ) n++
9fb0: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
9fc0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
9fd0: 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 61 20  ine processes a 
9fe0: 73 69 6e 67 6c 65 20 48 54 54 50 20 72 65 71 75  single HTTP requ
9ff0: 65 73 74 20 6f 6e 20 73 74 61 6e 64 61 72 64 20  est on standard 
a000: 69 6e 70 75 74 20 61 6e 64 0a 2a 2a 20 73 65 6e  input and.** sen
a010: 64 73 20 74 68 65 20 72 65 70 6c 79 20 74 6f 20  ds the reply to 
a020: 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74 2e  standard output.
a030: 20 20 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e    If the argumen
a040: 74 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 0a  t is 1 it means.
a050: 2a 2a 20 74 68 61 74 20 77 65 20 61 72 65 20 73  ** that we are s
a060: 68 6f 75 6c 64 20 63 6c 6f 73 65 20 74 68 65 20  hould close the 
a070: 73 6f 63 6b 65 74 20 77 69 74 68 6f 75 74 20 70  socket without p
a080: 72 6f 63 65 73 73 69 6e 67 20 61 64 64 69 74 69  rocessing additi
a090: 6f 6e 61 6c 0a 2a 2a 20 48 54 54 50 20 72 65 71  onal.** HTTP req
a0a0: 75 65 73 74 73 20 61 66 74 65 72 20 74 68 65 20  uests after the 
a0b0: 63 75 72 72 65 6e 74 20 72 65 71 75 65 73 74 20  current request 
a0c0: 66 69 6e 69 73 68 65 73 2e 20 20 30 20 6d 65 61  finishes.  0 mea
a0d0: 6e 73 20 77 65 20 61 72 65 0a 2a 2a 20 61 6c 6c  ns we are.** all
a0e0: 6f 77 65 64 20 74 6f 20 6b 65 65 70 20 74 68 65  owed to keep the
a0f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e   connection open
a100: 20 61 6e 64 20 74 6f 20 70 72 6f 63 65 73 73 20   and to process 
a110: 61 64 64 69 74 69 6f 6e 61 6c 20 72 65 71 75 65  additional reque
a120: 73 74 73 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  sts..** This rou
a130: 74 69 6e 65 20 6d 61 79 20 63 68 6f 6f 73 65 20  tine may choose 
a140: 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 63 6f 6e  to close the con
a150: 6e 65 63 74 69 6f 6e 20 65 76 65 6e 20 69 66 20  nection even if 
a160: 74 68 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  the argument.** 
a170: 69 73 20 30 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  is 0..** .** If 
a180: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  the connection s
a190: 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 2c  hould be closed,
a1a0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
a1b0: 6c 6c 73 20 65 78 69 74 28 29 20 61 6e 64 0a 2a  lls exit() and.*
a1c0: 2a 20 74 68 75 73 20 6e 65 76 65 72 20 72 65 74  * thus never ret
a1d0: 75 72 6e 73 2e 20 20 49 66 20 74 68 69 73 20 72  urns.  If this r
a1e0: 6f 75 74 69 6e 65 20 64 6f 65 73 20 72 65 74 75  outine does retu
a1f0: 72 6e 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  rn it means that
a200: 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 48 54 54 50   another.** HTTP
a210: 20 72 65 71 75 65 73 74 20 6d 61 79 20 61 70 70   request may app
a220: 65 61 72 20 6f 6e 20 74 68 65 20 77 69 72 65 2e  ear on the wire.
a230: 0a 2a 2f 0a 76 6f 69 64 20 50 72 6f 63 65 73 73  .*/.void Process
a240: 4f 6e 65 52 65 71 75 65 73 74 28 69 6e 74 20 66  OneRequest(int f
a250: 6f 72 63 65 43 6c 6f 73 65 29 7b 0a 20 20 69 6e  orceClose){.  in
a260: 74 20 69 2c 20 63 3b 0a 20 20 63 68 61 72 20 2a  t i, c;.  char *
a270: 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
a280: 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 70      /* Used to p
a290: 61 72 73 65 20 75 70 20 61 20 73 74 72 69 6e 67  arse up a string
a2a0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61   */.  struct sta
a2b0: 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20  t statbuf;      
a2c0: 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
a2d0: 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 74 6f  bout the file to
a2e0: 20 62 65 20 72 65 74 72 69 65 76 65 64 20 2a 2f   be retrieved */
a2f0: 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20  .  FILE *in;    
a300: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a310: 46 6f 72 20 72 65 61 64 69 6e 67 20 66 72 6f 6d  For reading from
a320: 20 43 47 49 20 73 63 72 69 70 74 73 20 2a 2f 0a   CGI scripts */.
a330: 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b 31 30 30    char zLine[100
a340: 30 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  0];         /* A
a350: 20 62 75 66 66 65 72 20 66 6f 72 20 69 6e 70 75   buffer for inpu
a360: 74 20 6c 69 6e 65 73 20 6f 72 20 66 6f 72 6d 69  t lines or formi
a370: 6e 67 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 2f  ng names */..  /
a380: 2a 20 43 68 61 6e 67 65 20 64 69 72 65 63 74 6f  * Change directo
a390: 72 69 65 73 20 74 6f 20 74 68 65 20 72 6f 6f 74  ries to the root
a3a0: 20 6f 66 20 74 68 65 20 48 54 54 50 20 66 69 6c   of the HTTP fil
a3b0: 65 73 79 73 74 65 6d 0a 20 20 2a 2f 0a 20 20 69  esystem.  */.  i
a3c0: 66 28 20 63 68 64 69 72 28 7a 52 6f 6f 74 5b 30  f( chdir(zRoot[0
a3d0: 5d 20 3f 20 7a 52 6f 6f 74 20 3a 20 22 2f 22 29  ] ? zRoot : "/")
a3e0: 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  !=0 ){.    char 
a3f0: 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20 20 20  zBuf[1000];.    
a400: 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49  Malfunction(__LI
a410: 4e 45 5f 5f 2c 20 20 20 2f 2a 20 4c 4f 47 3a 20  NE__,   /* LOG: 
a420: 63 68 64 69 72 28 29 20 66 61 69 6c 65 64 20 2a  chdir() failed *
a430: 2f 0a 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e  /.         "cann
a440: 6f 74 20 63 68 64 69 72 20 74 6f 20 5b 25 73 5d  ot chdir to [%s]
a450: 20 66 72 6f 6d 20 5b 25 73 5d 22 2c 0a 20 20 20   from [%s]",.   
a460: 20 20 20 20 20 20 7a 52 6f 6f 74 2c 20 67 65 74        zRoot, get
a470: 63 77 64 28 7a 42 75 66 2c 39 39 39 29 29 3b 0a  cwd(zBuf,999));.
a480: 20 20 7d 0a 20 20 6e 52 65 71 75 65 73 74 2b 2b    }.  nRequest++
a490: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20  ;..  /*.  ** We 
a4a0: 6d 75 73 74 20 72 65 63 65 69 76 65 20 61 20 63  must receive a c
a4b0: 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 20 77  omplete header w
a4c0: 69 74 68 69 6e 20 31 35 20 73 65 63 6f 6e 64 73  ithin 15 seconds
a4d0: 0a 20 20 2a 2f 0a 20 20 73 69 67 6e 61 6c 28 53  .  */.  signal(S
a4e0: 49 47 41 4c 52 4d 2c 20 54 69 6d 65 6f 75 74 29  IGALRM, Timeout)
a4f0: 3b 0a 20 20 73 69 67 6e 61 6c 28 53 49 47 53 45  ;.  signal(SIGSE
a500: 47 56 2c 20 54 69 6d 65 6f 75 74 29 3b 0a 20 20  GV, Timeout);.  
a510: 73 69 67 6e 61 6c 28 53 49 47 50 49 50 45 2c 20  signal(SIGPIPE, 
a520: 54 69 6d 65 6f 75 74 29 3b 0a 20 20 69 66 28 20  Timeout);.  if( 
a530: 75 73 65 54 69 6d 65 6f 75 74 20 29 20 61 6c 61  useTimeout ) ala
a540: 72 6d 28 31 35 29 3b 0a 0a 20 20 2f 2a 20 47 65  rm(15);..  /* Ge
a550: 74 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e 65  t the first line
a560: 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 20   of the request 
a570: 61 6e 64 20 70 61 72 73 65 20 6f 75 74 20 74 68  and parse out th
a580: 65 0a 20 20 2a 2a 20 6d 65 74 68 6f 64 2c 20 74  e.  ** method, t
a590: 68 65 20 73 63 72 69 70 74 20 61 6e 64 20 74 68  he script and th
a5a0: 65 20 70 72 6f 74 6f 63 6f 6c 2e 0a 20 20 2a 2f  e protocol..  */
a5b0: 0a 20 20 69 66 28 20 66 67 65 74 73 28 7a 4c 69  .  if( fgets(zLi
a5c0: 6e 65 2c 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29  ne,sizeof(zLine)
a5d0: 2c 73 74 64 69 6e 29 3d 3d 30 20 29 7b 0a 20 20  ,stdin)==0 ){.  
a5e0: 20 20 65 78 69 74 28 30 29 3b 0a 20 20 7d 0a 20    exit(0);.  }. 
a5f0: 20 6f 6d 69 74 4c 6f 67 20 3d 20 30 3b 0a 20 20   omitLog = 0;.  
a600: 6e 49 6e 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 4c  nIn += strlen(zL
a610: 69 6e 65 29 3b 0a 20 20 7a 4d 65 74 68 6f 64 20  ine);.  zMethod 
a620: 3d 20 53 74 72 44 75 70 28 47 65 74 46 69 72 73  = StrDup(GetFirs
a630: 74 45 6c 65 6d 65 6e 74 28 7a 4c 69 6e 65 2c 26  tElement(zLine,&
a640: 7a 29 29 3b 0a 20 20 7a 52 65 61 6c 53 63 72 69  z));.  zRealScri
a650: 70 74 20 3d 20 7a 53 63 72 69 70 74 20 3d 20 53  pt = zScript = S
a660: 74 72 44 75 70 28 47 65 74 46 69 72 73 74 45 6c  trDup(GetFirstEl
a670: 65 6d 65 6e 74 28 7a 2c 26 7a 29 29 3b 0a 20 20  ement(z,&z));.  
a680: 7a 50 72 6f 74 6f 63 6f 6c 20 3d 20 53 74 72 44  zProtocol = StrD
a690: 75 70 28 47 65 74 46 69 72 73 74 45 6c 65 6d 65  up(GetFirstEleme
a6a0: 6e 74 28 7a 2c 26 7a 29 29 3b 0a 20 20 69 66 28  nt(z,&z));.  if(
a6b0: 20 7a 50 72 6f 74 6f 63 6f 6c 3d 3d 30 20 7c 7c   zProtocol==0 ||
a6c0: 20 73 74 72 6e 63 6d 70 28 7a 50 72 6f 74 6f 63   strncmp(zProtoc
a6d0: 6f 6c 2c 22 48 54 54 50 2f 22 2c 35 29 21 3d 30  ol,"HTTP/",5)!=0
a6e0: 20 7c 7c 20 73 74 72 6c 65 6e 28 7a 50 72 6f 74   || strlen(zProt
a6f0: 6f 63 6f 6c 29 21 3d 38 20 29 7b 0a 20 20 20 20  ocol)!=8 ){.    
a700: 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 34  StartResponse("4
a710: 30 30 20 42 61 64 20 52 65 71 75 65 73 74 22 29  00 Bad Request")
a720: 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72  ;.    nOut += pr
a730: 69 6e 74 66 28 0a 20 20 20 20 20 20 22 43 6f 6e  intf(.      "Con
a740: 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f  tent-type: text/
a750: 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 20  plain\r\n".     
a760: 20 22 5c 72 5c 6e 22 0a 20 20 20 20 20 20 22 54   "\r\n".      "T
a770: 68 69 73 20 73 65 72 76 65 72 20 64 6f 65 73 20  his server does 
a780: 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74  not understand t
a790: 68 65 20 72 65 71 75 65 73 74 65 64 20 70 72 6f  he requested pro
a7a0: 74 6f 63 6f 6c 5c 6e 22 0a 20 20 20 20 29 3b 0a  tocol\n".    );.
a7b0: 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79      MakeLogEntry
a7c0: 28 30 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 2f  (0, __LINE__); /
a7d0: 2a 20 4c 4f 47 3a 20 62 61 64 20 70 72 6f 74 6f  * LOG: bad proto
a7e0: 63 6f 6c 20 69 6e 20 48 54 54 50 20 68 65 61 64  col in HTTP head
a7f0: 65 72 20 2a 2f 0a 20 20 20 20 65 78 69 74 28 30  er */.    exit(0
a800: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 53 63  );.  }.  if( zSc
a810: 72 69 70 74 5b 30 5d 3d 3d 30 20 29 20 4e 6f 74  ript[0]==0 ) Not
a820: 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b  Found(__LINE__);
a830: 20 2f 2a 20 4c 4f 47 3a 20 45 6d 70 74 79 20 72   /* LOG: Empty r
a840: 65 71 75 65 73 74 20 55 52 49 20 2a 2f 0a 20 20  equest URI */.  
a850: 69 66 28 20 66 6f 72 63 65 43 6c 6f 73 65 20 29  if( forceClose )
a860: 7b 0a 20 20 20 20 63 6c 6f 73 65 43 6f 6e 6e 65  {.    closeConne
a870: 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c  ction = 1;.  }el
a880: 73 65 20 69 66 28 20 7a 50 72 6f 74 6f 63 6f 6c  se if( zProtocol
a890: 5b 35 5d 3c 27 31 27 20 7c 7c 20 7a 50 72 6f 74  [5]<'1' || zProt
a8a0: 6f 63 6f 6c 5b 37 5d 3c 27 31 27 20 29 7b 0a 20  ocol[7]<'1' ){. 
a8b0: 20 20 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69     closeConnecti
a8c0: 6f 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  on = 1;.  }..  /
a8d0: 2a 20 54 68 69 73 20 76 65 72 79 20 73 69 6d 70  * This very simp
a8e0: 6c 65 20 73 65 72 76 65 72 20 6f 6e 6c 79 20 75  le server only u
a8f0: 6e 64 65 72 73 74 61 6e 64 73 20 74 68 65 20 47  nderstands the G
a900: 45 54 2c 20 50 4f 53 54 0a 20 20 2a 2a 20 61 6e  ET, POST.  ** an
a910: 64 20 48 45 41 44 20 6d 65 74 68 6f 64 73 0a 20  d HEAD methods. 
a920: 20 2a 2f 0a 20 20 69 66 28 20 73 74 72 63 6d 70   */.  if( strcmp
a930: 28 7a 4d 65 74 68 6f 64 2c 22 47 45 54 22 29 21  (zMethod,"GET")!
a940: 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 65  =0 && strcmp(zMe
a950: 74 68 6f 64 2c 22 50 4f 53 54 22 29 21 3d 30 0a  thod,"POST")!=0.
a960: 20 20 20 20 20 20 20 26 26 20 73 74 72 63 6d 70         && strcmp
a970: 28 7a 4d 65 74 68 6f 64 2c 22 48 45 41 44 22 29  (zMethod,"HEAD")
a980: 21 3d 30 20 29 7b 0a 20 20 20 20 53 74 61 72 74  !=0 ){.    Start
a990: 52 65 73 70 6f 6e 73 65 28 22 35 30 31 20 4e 6f  Response("501 No
a9a0: 74 20 49 6d 70 6c 65 6d 65 6e 74 65 64 22 29 3b  t Implemented");
a9b0: 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69  .    nOut += pri
a9c0: 6e 74 66 28 0a 20 20 20 20 20 20 22 43 6f 6e 74  ntf(.      "Cont
a9d0: 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 70  ent-type: text/p
a9e0: 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 20 20  lain\r\n".      
a9f0: 22 5c 72 5c 6e 22 0a 20 20 20 20 20 20 22 54 68  "\r\n".      "Th
aa00: 65 20 25 73 20 6d 65 74 68 6f 64 20 69 73 20 6e  e %s method is n
aa10: 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 6f  ot implemented o
aa20: 6e 20 74 68 69 73 20 73 65 72 76 65 72 2e 5c 6e  n this server.\n
aa30: 22 2c 0a 20 20 20 20 20 20 7a 4d 65 74 68 6f 64  ",.      zMethod
aa40: 29 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e  );.    MakeLogEn
aa50: 74 72 79 28 30 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  try(0, __LINE__)
aa60: 3b 20 2f 2a 20 4c 4f 47 3a 20 55 6e 6b 6e 6f 77  ; /* LOG: Unknow
aa70: 6e 20 72 65 71 75 65 73 74 20 6d 65 74 68 6f 64  n request method
aa80: 20 2a 2f 0a 20 20 20 20 65 78 69 74 28 30 29 3b   */.    exit(0);
aa90: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61  .  }..  /* Get a
aaa0: 6c 6c 20 74 68 65 20 6f 70 74 69 6f 6e 61 6c 20  ll the optional 
aab0: 66 69 65 6c 64 73 20 74 68 61 74 20 66 6f 6c 6c  fields that foll
aac0: 6f 77 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e  ow the first lin
aad0: 65 2e 0a 20 20 2a 2f 0a 20 20 7a 43 6f 6f 6b 69  e..  */.  zCooki
aae0: 65 20 3d 20 30 3b 0a 20 20 7a 41 75 74 68 54 79  e = 0;.  zAuthTy
aaf0: 70 65 20 3d 20 30 3b 0a 20 20 7a 52 65 6d 6f 74  pe = 0;.  zRemot
ab00: 65 55 73 65 72 20 3d 20 30 3b 0a 20 20 7a 52 65  eUser = 0;.  zRe
ab10: 66 65 72 65 72 20 3d 20 30 3b 0a 20 20 77 68 69  ferer = 0;.  whi
ab20: 6c 65 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c  le( fgets(zLine,
ab30: 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 73 74  sizeof(zLine),st
ab40: 64 69 6e 29 20 29 7b 0a 20 20 20 20 63 68 61 72  din) ){.    char
ab50: 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 3b 0a 20 20   *zFieldName;.  
ab60: 20 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 0a 20    char *zVal;.. 
ab70: 20 20 20 6e 49 6e 20 2b 3d 20 73 74 72 6c 65 6e     nIn += strlen
ab80: 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 7a 46 69  (zLine);.    zFi
ab90: 65 6c 64 4e 61 6d 65 20 3d 20 47 65 74 46 69 72  eldName = GetFir
aba0: 73 74 45 6c 65 6d 65 6e 74 28 7a 4c 69 6e 65 2c  stElement(zLine,
abb0: 26 7a 56 61 6c 29 3b 0a 20 20 20 20 69 66 28 20  &zVal);.    if( 
abc0: 7a 46 69 65 6c 64 4e 61 6d 65 3d 3d 30 20 7c 7c  zFieldName==0 ||
abd0: 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 3d 3d 30 20   *zFieldName==0 
abe0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 52 65 6d  ) break;.    Rem
abf0: 6f 76 65 4e 65 77 6c 69 6e 65 28 7a 56 61 6c 29  oveNewline(zVal)
ac00: 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 61 73  ;.    if( strcas
ac10: 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c  ecmp(zFieldName,
ac20: 22 55 73 65 72 2d 41 67 65 6e 74 3a 22 29 3d 3d  "User-Agent:")==
ac30: 30 20 29 7b 0a 20 20 20 20 20 20 7a 41 67 65 6e  0 ){.      zAgen
ac40: 74 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29  t = StrDup(zVal)
ac50: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
ac60: 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c  strcasecmp(zFiel
ac70: 64 4e 61 6d 65 2c 22 41 63 63 65 70 74 3a 22 29  dName,"Accept:")
ac80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 41 63  ==0 ){.      zAc
ac90: 63 65 70 74 20 3d 20 53 74 72 44 75 70 28 7a 56  cept = StrDup(zV
aca0: 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  al);.    }else i
acb0: 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46  f( strcasecmp(zF
acc0: 69 65 6c 64 4e 61 6d 65 2c 22 41 63 63 65 70 74  ieldName,"Accept
acd0: 2d 45 6e 63 6f 64 69 6e 67 3a 22 29 3d 3d 30 20  -Encoding:")==0 
ace0: 29 7b 0a 20 20 20 20 20 20 7a 41 63 63 65 70 74  ){.      zAccept
acf0: 45 6e 63 6f 64 69 6e 67 20 3d 20 53 74 72 44 75  Encoding = StrDu
ad00: 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c  p(zVal);.    }el
ad10: 73 65 20 69 66 28 20 73 74 72 63 61 73 65 63 6d  se if( strcasecm
ad20: 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 43 6f  p(zFieldName,"Co
ad30: 6e 74 65 6e 74 2d 6c 65 6e 67 74 68 3a 22 29 3d  ntent-length:")=
ad40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6e  =0 ){.      zCon
ad50: 74 65 6e 74 4c 65 6e 67 74 68 20 3d 20 53 74 72  tentLength = Str
ad60: 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d  Dup(zVal);.    }
ad70: 65 6c 73 65 20 69 66 28 20 73 74 72 63 61 73 65  else if( strcase
ad80: 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22  cmp(zFieldName,"
ad90: 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 22 29 3d  Content-type:")=
ada0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6e  =0 ){.      zCon
adb0: 74 65 6e 74 54 79 70 65 20 3d 20 53 74 72 44 75  tentType = StrDu
adc0: 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c  p(zVal);.    }el
add0: 73 65 20 69 66 28 20 73 74 72 63 61 73 65 63 6d  se if( strcasecm
ade0: 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 52 65  p(zFieldName,"Re
adf0: 66 65 72 65 72 3a 22 29 3d 3d 30 20 29 7b 0a 20  ferer:")==0 ){. 
ae00: 20 20 20 20 20 7a 52 65 66 65 72 65 72 20 3d 20       zReferer = 
ae10: 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20  StrDup(zVal);.  
ae20: 20 20 20 20 69 66 28 20 73 74 72 73 74 72 28 7a      if( strstr(z
ae30: 56 61 6c 2c 20 22 64 65 76 69 64 73 2e 6e 65 74  Val, "devids.net
ae40: 2f 22 29 21 3d 30 20 29 7b 20 7a 52 65 66 65 72  /")!=0 ){ zRefer
ae50: 65 72 20 3d 20 22 64 65 76 69 64 73 2e 6e 65 74  er = "devids.net
ae60: 2e 73 6d 75 74 22 3b 0a 20 20 20 20 20 20 20 20  .smut";.        
ae70: 46 6f 72 62 69 64 64 65 6e 28 5f 5f 4c 49 4e 45  Forbidden(__LINE
ae80: 5f 5f 29 3b 20 2f 2a 20 4c 4f 47 3a 20 52 65 66  __); /* LOG: Ref
ae90: 65 72 72 65 72 20 69 73 20 64 65 76 69 64 73 2e  errer is devids.
aea0: 6e 65 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  net */.      }. 
aeb0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
aec0: 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61  casecmp(zFieldNa
aed0: 6d 65 2c 22 43 6f 6f 6b 69 65 3a 22 29 3d 3d 30  me,"Cookie:")==0
aee0: 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6f 6b 69   ){.      zCooki
aef0: 65 20 3d 20 53 74 72 41 70 70 65 6e 64 28 7a 43  e = StrAppend(zC
af00: 6f 6f 6b 69 65 2c 22 3b 20 22 2c 7a 56 61 6c 29  ookie,"; ",zVal)
af10: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
af20: 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c  strcasecmp(zFiel
af30: 64 4e 61 6d 65 2c 22 43 6f 6e 6e 65 63 74 69 6f  dName,"Connectio
af40: 6e 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  n:")==0 ){.     
af50: 20 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28   if( strcasecmp(
af60: 7a 56 61 6c 2c 22 63 6c 6f 73 65 22 29 3d 3d 30  zVal,"close")==0
af70: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73   ){.        clos
af80: 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 31 3b  eConnection = 1;
af90: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
afa0: 20 21 66 6f 72 63 65 43 6c 6f 73 65 20 26 26 20   !forceClose && 
afb0: 73 74 72 63 61 73 65 63 6d 70 28 7a 56 61 6c 2c  strcasecmp(zVal,
afc0: 20 22 6b 65 65 70 2d 61 6c 69 76 65 22 29 3d 3d   "keep-alive")==
afd0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f  0 ){.        clo
afe0: 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 30  seConnection = 0
aff0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
b000: 6c 73 65 20 69 66 28 20 73 74 72 63 61 73 65 63  lse if( strcasec
b010: 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 48  mp(zFieldName,"H
b020: 6f 73 74 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ost:")==0 ){.   
b030: 20 20 20 69 6e 74 20 69 6e 53 71 75 61 72 65 20     int inSquare 
b040: 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20  = 0;.      char 
b050: 63 3b 0a 20 20 20 20 20 20 69 66 28 20 73 61 6e  c;.      if( san
b060: 69 74 69 7a 65 53 74 72 69 6e 67 28 7a 56 61 6c  itizeString(zVal
b070: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 46 6f 72  ) ){.        For
b080: 62 69 64 64 65 6e 28 5f 5f 4c 49 4e 45 5f 5f 29  bidden(__LINE__)
b090: 3b 20 20 2f 2a 20 4c 4f 47 3a 20 49 6c 6c 65 67  ;  /* LOG: Illeg
b0a0: 61 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 48 4f  al content in HO
b0b0: 53 54 3a 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  ST: parameter */
b0c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
b0d0: 48 74 74 70 48 6f 73 74 20 3d 20 53 74 72 44 75  HttpHost = StrDu
b0e0: 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 7a  p(zVal);.      z
b0f0: 53 65 72 76 65 72 50 6f 72 74 20 3d 20 7a 53 65  ServerPort = zSe
b100: 72 76 65 72 4e 61 6d 65 20 3d 20 53 74 72 44 75  rverName = StrDu
b110: 70 28 7a 48 74 74 70 48 6f 73 74 29 3b 0a 20 20  p(zHttpHost);.  
b120: 20 20 20 20 77 68 69 6c 65 28 20 7a 53 65 72 76      while( zServ
b130: 65 72 50 6f 72 74 20 26 26 20 28 63 20 3d 20 2a  erPort && (c = *
b140: 7a 53 65 72 76 65 72 50 6f 72 74 29 21 3d 30 0a  zServerPort)!=0.
b150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
b160: 20 28 63 21 3d 27 3a 27 20 7c 7c 20 69 6e 53 71   (c!=':' || inSq
b170: 75 61 72 65 29 20 29 7b 0a 20 20 20 20 20 20 20  uare) ){.       
b180: 20 69 66 28 20 63 3d 3d 27 5b 27 20 29 20 69 6e   if( c=='[' ) in
b190: 53 71 75 61 72 65 20 3d 20 31 3b 0a 20 20 20 20  Square = 1;.    
b1a0: 20 20 20 20 69 66 28 20 63 3d 3d 27 5d 27 20 29      if( c==']' )
b1b0: 20 69 6e 53 71 75 61 72 65 20 3d 20 30 3b 0a 20   inSquare = 0;. 
b1c0: 20 20 20 20 20 20 20 7a 53 65 72 76 65 72 50 6f         zServerPo
b1d0: 72 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rt++;.      }.  
b1e0: 20 20 20 20 69 66 28 20 7a 53 65 72 76 65 72 50      if( zServerP
b1f0: 6f 72 74 20 26 26 20 2a 7a 53 65 72 76 65 72 50  ort && *zServerP
b200: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ort ){.        *
b210: 7a 53 65 72 76 65 72 50 6f 72 74 20 3d 20 30 3b  zServerPort = 0;
b220: 0a 20 20 20 20 20 20 20 20 7a 53 65 72 76 65 72  .        zServer
b230: 50 6f 72 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  Port++;.      }.
b240: 20 20 20 20 20 20 69 66 28 20 7a 52 65 61 6c 50        if( zRealP
b250: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ort ){.        z
b260: 53 65 72 76 65 72 50 6f 72 74 20 3d 20 53 74 72  ServerPort = Str
b270: 44 75 70 28 7a 52 65 61 6c 50 6f 72 74 29 3b 0a  Dup(zRealPort);.
b280: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
b290: 65 20 69 66 28 20 73 74 72 63 61 73 65 63 6d 70  e if( strcasecmp
b2a0: 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 41 75 74  (zFieldName,"Aut
b2b0: 68 6f 72 69 7a 61 74 69 6f 6e 3a 22 29 3d 3d 30  horization:")==0
b2c0: 20 29 7b 0a 20 20 20 20 20 20 7a 41 75 74 68 54   ){.      zAuthT
b2d0: 79 70 65 20 3d 20 47 65 74 46 69 72 73 74 45 6c  ype = GetFirstEl
b2e0: 65 6d 65 6e 74 28 53 74 72 44 75 70 28 7a 56 61  ement(StrDup(zVa
b2f0: 6c 29 2c 20 26 7a 41 75 74 68 41 72 67 29 3b 0a  l), &zAuthArg);.
b300: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
b310: 44 69 73 61 6c 6c 6f 77 20 72 65 71 75 65 73 74  Disallow request
b320: 73 20 66 72 6f 6d 20 63 65 72 74 61 69 6e 20 63  s from certain c
b330: 6c 69 65 6e 74 73 20 2a 2f 0a 20 20 69 66 28 20  lients */.  if( 
b340: 7a 41 67 65 6e 74 20 29 7b 0a 20 20 20 20 69 66  zAgent ){.    if
b350: 28 20 73 74 72 73 74 72 28 7a 41 67 65 6e 74 2c  ( strstr(zAgent,
b360: 20 22 57 69 6e 64 6f 77 73 5f 39 22 29 21 3d 30   "Windows_9")!=0
b370: 0a 20 20 20 20 20 7c 7c 20 73 74 72 73 74 72 28  .     || strstr(
b380: 7a 41 67 65 6e 74 2c 20 22 44 6f 77 6e 6c 6f 61  zAgent, "Downloa
b390: 64 5f 4d 61 73 74 65 72 22 29 21 3d 30 0a 20 20  d_Master")!=0.  
b3a0: 20 20 20 7c 7c 20 73 74 72 73 74 72 28 7a 41 67     || strstr(zAg
b3b0: 65 6e 74 2c 20 22 45 7a 6f 6f 6d 73 2f 22 29 21  ent, "Ezooms/")!
b3c0: 3d 30 0a 20 20 20 2f 2a 7c 7c 20 73 74 72 73 74  =0.   /*|| strst
b3d0: 72 28 7a 41 67 65 6e 74 2c 20 22 62 69 6e 67 62  r(zAgent, "bingb
b3e0: 6f 74 22 29 21 3d 30 2a 2f 0a 20 20 20 20 20 7c  ot")!=0*/.     |
b3f0: 7c 20 73 74 72 73 74 72 28 7a 41 67 65 6e 74 2c  | strstr(zAgent,
b400: 20 22 41 68 72 65 66 73 42 6f 74 22 29 21 3d 30   "AhrefsBot")!=0
b410: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 46 6f  .    ){.      Fo
b420: 72 62 69 64 64 65 6e 28 5f 5f 4c 49 4e 45 5f 5f  rbidden(__LINE__
b430: 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 44 69 73 61  );  /* LOG: Disa
b440: 6c 6c 6f 77 65 64 20 75 73 65 72 20 61 67 65 6e  llowed user agen
b450: 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  t */.    }.  }.#
b460: 69 66 20 30 0a 20 20 69 66 28 20 7a 52 65 66 65  if 0.  if( zRefe
b470: 72 65 72 20 29 7b 0a 20 20 20 20 73 74 61 74 69  rer ){.    stati
b480: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
b490: 44 69 73 61 6c 6c 6f 77 5b 5d 20 3d 20 7b 0a 20  Disallow[] = {. 
b4a0: 20 20 20 20 20 22 73 6b 69 64 72 6f 77 63 72 61       "skidrowcra
b4b0: 63 6b 2e 63 6f 6d 22 2c 0a 20 20 20 20 20 20 22  ck.com",.      "
b4c0: 68 6f 73 68 69 79 75 75 67 69 2e 74 69 73 74 6f  hoshiyuugi.tisto
b4d0: 72 79 2e 63 6f 6d 22 2c 0a 20 20 20 20 20 20 22  ry.com",.      "
b4e0: 73 6b 69 64 72 6f 77 67 61 6d 65 73 2e 6e 65 74  skidrowgames.net
b4f0: 22 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  ",.    };.    in
b500: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
b510: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 73  ; i<sizeof(azDis
b520: 61 6c 6c 6f 77 29 2f 73 69 7a 65 6f 66 28 61 7a  allow)/sizeof(az
b530: 44 69 73 61 6c 6c 6f 77 5b 30 5d 29 3b 20 69 2b  Disallow[0]); i+
b540: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
b550: 72 73 74 72 28 7a 52 65 66 65 72 65 72 2c 20 61  rstr(zReferer, a
b560: 7a 44 69 73 61 6c 6c 6f 77 5b 69 5d 29 21 3d 30  zDisallow[i])!=0
b570: 20 29 7b 0a 20 20 20 20 20 20 20 20 4e 6f 74 46   ){.        NotF
b580: 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20  ound(__LINE__); 
b590: 20 2f 2a 20 4c 4f 47 3a 20 44 69 73 61 6c 6c 6f   /* LOG: Disallo
b5a0: 77 65 64 20 72 65 66 65 72 72 65 72 20 2a 2f 0a  wed referrer */.
b5b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b5c0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d  }.#endif..  /* M
b5d0: 61 6b 65 20 61 6e 20 65 78 74 72 61 20 65 66 66  ake an extra eff
b5e0: 6f 72 74 20 74 6f 20 67 65 74 20 61 20 76 61 6c  ort to get a val
b5f0: 69 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20 61  id server name a
b600: 6e 64 20 70 6f 72 74 20 6e 75 6d 62 65 72 2e 0a  nd port number..
b610: 20 20 2a 2a 20 4f 6e 6c 79 20 4e 65 74 73 63 61    ** Only Netsca
b620: 70 65 20 70 72 6f 76 69 64 65 73 20 74 68 69 73  pe provides this
b630: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49   information.  I
b640: 66 20 74 68 65 20 62 72 6f 77 73 65 72 20 69 73  f the browser is
b650: 0a 20 20 2a 2a 20 49 6e 74 65 72 6e 65 74 20 45  .  ** Internet E
b660: 78 70 6c 6f 72 65 72 2c 20 74 68 65 6e 20 77 65  xplorer, then we
b670: 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20 6f 75   have to find ou
b680: 74 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  t the informatio
b690: 6e 20 66 6f 72 0a 20 20 2a 2a 20 6f 75 72 73 65  n for.  ** ourse
b6a0: 6c 76 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lves..  */.  if(
b6b0: 20 7a 53 65 72 76 65 72 4e 61 6d 65 3d 3d 30 20   zServerName==0 
b6c0: 29 7b 0a 20 20 20 20 7a 53 65 72 76 65 72 4e 61  ){.    zServerNa
b6d0: 6d 65 20 3d 20 53 61 66 65 4d 61 6c 6c 6f 63 28  me = SafeMalloc(
b6e0: 20 31 30 30 20 29 3b 0a 20 20 20 20 67 65 74 68   100 );.    geth
b6f0: 6f 73 74 6e 61 6d 65 28 7a 53 65 72 76 65 72 4e  ostname(zServerN
b700: 61 6d 65 2c 31 30 30 29 3b 0a 20 20 7d 0a 20 20  ame,100);.  }.  
b710: 69 66 28 20 7a 53 65 72 76 65 72 50 6f 72 74 3d  if( zServerPort=
b720: 3d 30 20 7c 7c 20 2a 7a 53 65 72 76 65 72 50 6f  =0 || *zServerPo
b730: 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53 65  rt==0 ){.    zSe
b740: 72 76 65 72 50 6f 72 74 20 3d 20 44 45 46 41 55  rverPort = DEFAU
b750: 4c 54 5f 50 4f 52 54 3b 0a 20 20 7d 0a 0a 20 20  LT_PORT;.  }..  
b760: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 71 75  /* Remove the qu
b770: 65 72 79 20 73 74 72 69 6e 67 20 66 72 6f 6d 20  ery string from 
b780: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72  the end of the r
b790: 65 71 75 65 73 74 65 64 20 66 69 6c 65 2e 0a 20  equested file.. 
b7a0: 20 2a 2f 0a 20 20 66 6f 72 28 7a 3d 7a 53 63 72   */.  for(z=zScr
b7b0: 69 70 74 3b 20 2a 7a 20 26 26 20 2a 7a 21 3d 27  ipt; *z && *z!='
b7c0: 3f 27 3b 20 7a 2b 2b 29 7b 7d 0a 20 20 69 66 28  ?'; z++){}.  if(
b7d0: 20 2a 7a 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20   *z=='?' ){.    
b7e0: 7a 51 75 65 72 79 53 75 66 66 69 78 20 3d 20 53  zQuerySuffix = S
b7f0: 74 72 44 75 70 28 7a 29 3b 0a 20 20 20 20 2a 7a  trDup(z);.    *z
b800: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
b810: 20 20 20 7a 51 75 65 72 79 53 75 66 66 69 78 20     zQuerySuffix 
b820: 3d 20 22 22 3b 0a 20 20 7d 0a 20 20 7a 51 75 65  = "";.  }.  zQue
b830: 72 79 53 74 72 69 6e 67 20 3d 20 2a 7a 51 75 65  ryString = *zQue
b840: 72 79 53 75 66 66 69 78 20 3f 20 26 7a 51 75 65  rySuffix ? &zQue
b850: 72 79 53 75 66 66 69 78 5b 31 5d 20 3a 20 7a 51  rySuffix[1] : zQ
b860: 75 65 72 79 53 75 66 66 69 78 3b 0a 0a 20 20 2f  uerySuffix;..  /
b870: 2a 20 43 72 65 61 74 65 20 61 20 66 69 6c 65 20  * Create a file 
b880: 74 6f 20 68 6f 6c 64 20 74 68 65 20 50 4f 53 54  to hold the POST
b890: 20 71 75 65 72 79 20 64 61 74 61 2c 20 69 66 20   query data, if 
b8a0: 61 6e 79 2e 20 20 57 65 20 68 61 76 65 20 74 6f  any.  We have to
b8b0: 0a 20 20 2a 2a 20 64 6f 20 69 74 20 74 68 69 73  .  ** do it this
b8c0: 20 77 61 79 2e 20 20 57 65 20 63 61 6e 27 74 20   way.  We can't 
b8d0: 6a 75 73 74 20 70 61 73 73 20 74 68 65 20 66 69  just pass the fi
b8e0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 64 6f  le descriptor do
b8f0: 77 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 63  wn to.  ** the c
b900: 68 69 6c 64 20 70 72 6f 63 65 73 73 20 62 65 63  hild process bec
b910: 61 75 73 65 20 74 68 65 20 66 67 65 74 73 28 29  ause the fgets()
b920: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 68 61   function may ha
b930: 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ve already.  ** 
b940: 72 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  read part of the
b950: 20 50 4f 53 54 20 64 61 74 61 20 69 6e 74 6f 20   POST data into 
b960: 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 62 75 66  its internal buf
b970: 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  fer..  */.  if( 
b980: 7a 4d 65 74 68 6f 64 5b 30 5d 3d 3d 27 50 27 20  zMethod[0]=='P' 
b990: 26 26 20 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67 74  && zContentLengt
b9a0: 68 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  h!=0 ){.    int 
b9b0: 6c 65 6e 20 3d 20 61 74 6f 69 28 7a 43 6f 6e 74  len = atoi(zCont
b9c0: 65 6e 74 4c 65 6e 67 74 68 29 3b 0a 20 20 20 20  entLength);.    
b9d0: 46 49 4c 45 20 2a 6f 75 74 3b 0a 20 20 20 20 63  FILE *out;.    c
b9e0: 68 61 72 20 2a 7a 42 75 66 3b 0a 20 20 20 20 69  har *zBuf;.    i
b9f0: 6e 74 20 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6c  nt n;..    if( l
ba00: 65 6e 3e 4d 41 58 5f 43 4f 4e 54 45 4e 54 5f 4c  en>MAX_CONTENT_L
ba10: 45 4e 47 54 48 20 29 7b 0a 20 20 20 20 20 20 53  ENGTH ){.      S
ba20: 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 35 30  tartResponse("50
ba30: 30 20 52 65 71 75 65 73 74 20 74 6f 6f 20 6c 61  0 Request too la
ba40: 72 67 65 22 29 3b 0a 20 20 20 20 20 20 6e 4f 75  rge");.      nOu
ba50: 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20  t += printf(.   
ba60: 20 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79       "Content-ty
ba70: 70 65 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c 72  pe: text/plain\r
ba80: 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 5c 72 5c  \n".        "\r\
ba90: 6e 22 0a 20 20 20 20 20 20 20 20 22 54 6f 6f 20  n".        "Too 
baa0: 6d 75 63 68 20 50 4f 53 54 20 64 61 74 61 5c 6e  much POST data\n
bab0: 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ".      );.     
bac0: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c   MakeLogEntry(0,
bad0: 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 2f 2a 20 4c   __LINE__); /* L
bae0: 4f 47 3a 20 52 65 71 75 65 73 74 20 74 6f 6f 20  OG: Request too 
baf0: 6c 61 72 67 65 20 2a 2f 0a 20 20 20 20 20 20 65  large */.      e
bb00: 78 69 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20  xit(0);.    }.  
bb10: 20 20 73 70 72 69 6e 74 66 28 7a 54 6d 70 4e 61    sprintf(zTmpNa
bb20: 6d 42 75 66 2c 20 22 2f 74 6d 70 2f 2d 70 6f 73  mBuf, "/tmp/-pos
bb30: 74 2d 64 61 74 61 2d 58 58 58 58 58 58 22 29 3b  t-data-XXXXXX");
bb40: 0a 20 20 20 20 7a 54 6d 70 4e 61 6d 20 3d 20 7a  .    zTmpNam = z
bb50: 54 6d 70 4e 61 6d 42 75 66 3b 0a 20 20 20 20 69  TmpNamBuf;.    i
bb60: 66 28 20 6d 6b 73 74 65 6d 70 28 7a 54 6d 70 4e  f( mkstemp(zTmpN
bb70: 61 6d 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 4d  am)<0 ){.      M
bb80: 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e  alfunction(__LIN
bb90: 45 5f 5f 2c 20 20 2f 2a 20 4c 4f 47 3a 20 6d 6b  E__,  /* LOG: mk
bba0: 73 74 65 6d 70 28 29 20 66 61 69 6c 65 64 20 2a  stemp() failed *
bbb0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
bbc0: 20 22 43 61 6e 6e 6f 74 20 63 72 65 61 74 65 20   "Cannot create 
bbd0: 61 20 74 65 6d 70 20 66 69 6c 65 20 69 6e 20 77  a temp file in w
bbe0: 68 69 63 68 20 74 6f 20 73 74 6f 72 65 20 50 4f  hich to store PO
bbf0: 53 54 20 64 61 74 61 22 29 3b 0a 20 20 20 20 7d  ST data");.    }
bc00: 0a 20 20 20 20 6f 75 74 20 3d 20 66 6f 70 65 6e  .    out = fopen
bc10: 28 7a 54 6d 70 4e 61 6d 2c 22 77 22 29 3b 0a 20  (zTmpNam,"w");. 
bc20: 20 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b     if( out==0 ){
bc30: 0a 20 20 20 20 20 20 53 74 61 72 74 52 65 73 70  .      StartResp
bc40: 6f 6e 73 65 28 22 35 30 30 20 43 61 6e 6e 6f 74  onse("500 Cannot
bc50: 20 63 72 65 61 74 65 20 2f 74 6d 70 20 66 69 6c   create /tmp fil
bc60: 65 22 29 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20  e");.      nOut 
bc70: 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20  += printf(.     
bc80: 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65     "Content-type
bc90: 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e  : text/plain\r\n
bca0: 22 0a 20 20 20 20 20 20 20 20 22 5c 72 5c 6e 22  ".        "\r\n"
bcb0: 0a 20 20 20 20 20 20 20 20 22 43 6f 75 6c 64 20  .        "Could 
bcc0: 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20  not open \"%s\" 
bcd0: 66 6f 72 20 77 72 69 74 69 6e 67 5c 6e 22 2c 20  for writing\n", 
bce0: 7a 54 6d 70 4e 61 6d 0a 20 20 20 20 20 20 29 3b  zTmpNam.      );
bcf0: 0a 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e  .      MakeLogEn
bd00: 74 72 79 28 30 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  try(0, __LINE__)
bd10: 3b 20 2f 2a 20 4c 4f 47 3a 20 63 61 6e 6e 6f 74  ; /* LOG: cannot
bd20: 20 63 72 65 61 74 65 20 74 65 6d 70 20 66 69 6c   create temp fil
bd30: 65 20 66 6f 72 20 50 4f 53 54 20 2a 2f 0a 20 20  e for POST */.  
bd40: 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20 20      exit(0);.   
bd50: 20 7d 0a 20 20 20 20 7a 42 75 66 20 3d 20 53 61   }.    zBuf = Sa
bd60: 66 65 4d 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31 20  feMalloc( len+1 
bd70: 29 3b 0a 20 20 20 20 69 66 28 20 75 73 65 54 69  );.    if( useTi
bd80: 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d 28 31 35  meout ) alarm(15
bd90: 20 2b 20 6c 65 6e 2f 32 30 30 30 29 3b 0a 20 20   + len/2000);.  
bda0: 20 20 6e 20 3d 20 66 72 65 61 64 28 7a 42 75 66    n = fread(zBuf
bdb0: 2c 31 2c 6c 65 6e 2c 73 74 64 69 6e 29 3b 0a 20  ,1,len,stdin);. 
bdc0: 20 20 20 6e 49 6e 20 2b 3d 20 6e 3b 0a 20 20 20     nIn += n;.   
bdd0: 20 66 77 72 69 74 65 28 7a 42 75 66 2c 31 2c 6e   fwrite(zBuf,1,n
bde0: 2c 6f 75 74 29 3b 0a 20 20 20 20 66 72 65 65 28  ,out);.    free(
bdf0: 7a 42 75 66 29 3b 0a 20 20 20 20 66 63 6c 6f 73  zBuf);.    fclos
be00: 65 28 6f 75 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  e(out);.  }..  /
be10: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
be20: 72 75 6e 6e 69 6e 67 20 74 69 6d 65 20 69 73 20  running time is 
be30: 6e 6f 74 20 74 6f 6f 20 67 72 65 61 74 20 2a 2f  not too great */
be40: 0a 20 20 69 66 28 20 75 73 65 54 69 6d 65 6f 75  .  if( useTimeou
be50: 74 20 29 20 61 6c 61 72 6d 28 31 30 29 3b 0a 0a  t ) alarm(10);..
be60: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 61 6c 6c    /* Convert all
be70: 20 75 6e 75 73 75 61 6c 20 63 68 61 72 61 63 74   unusual charact
be80: 65 72 73 20 69 6e 20 74 68 65 20 73 63 72 69 70  ers in the scrip
be90: 74 20 6e 61 6d 65 20 69 6e 74 6f 20 22 5f 22 2e  t name into "_".
bea0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
beb0: 69 73 20 61 20 64 65 66 65 6e 73 65 20 61 67 61  is a defense aga
bec0: 69 6e 73 74 20 76 61 72 69 6f 75 73 20 61 74 74  inst various att
bed0: 61 63 6b 73 2c 20 58 53 53 20 61 74 74 61 63 6b  acks, XSS attack
bee0: 73 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 2e  s in particular.
bef0: 0a 20 20 2a 2f 0a 20 20 73 61 6e 69 74 69 7a 65  .  */.  sanitize
bf00: 53 74 72 69 6e 67 28 7a 53 63 72 69 70 74 29 3b  String(zScript);
bf10: 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c  ..  /* Do not al
bf20: 6c 6f 77 20 22 2f 2e 22 20 6f 72 20 22 2f 2d 22  low "/." or "/-"
bf30: 20 74 6f 20 74 6f 20 6f 63 63 75 72 20 61 6e 79   to to occur any
bf40: 77 68 65 72 65 20 69 6e 20 74 68 65 20 65 6e 74  where in the ent
bf50: 69 74 79 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 54  ity name..  ** T
bf60: 68 69 73 20 70 72 65 76 65 6e 74 73 20 61 74 74  his prevents att
bf70: 61 63 6b 73 20 69 6e 76 6f 6c 76 69 6e 67 20 22  acks involving "
bf80: 2e 2e 22 20 61 6e 64 20 61 6c 73 6f 20 61 6c 6c  .." and also all
bf90: 6f 77 73 20 75 73 20 74 6f 20 63 72 65 61 74 65  ows us to create
bfa0: 0a 20 20 2a 2a 20 66 69 6c 65 73 20 61 6e 64 20  .  ** files and 
bfb0: 64 69 72 65 63 74 6f 72 69 65 73 20 77 68 6f 73  directories whos
bfc0: 65 20 6e 61 6d 65 73 20 62 65 67 69 6e 20 77 69  e names begin wi
bfd0: 74 68 20 22 2d 22 20 6f 72 20 22 2e 22 20 77 68  th "-" or "." wh
bfe0: 69 63 68 20 61 72 65 0a 20 20 2a 2a 20 69 6e 76  ich are.  ** inv
bff0: 69 73 69 62 6c 65 20 74 6f 20 74 68 65 20 77 65  isible to the we
c000: 62 73 65 72 76 65 72 2e 0a 20 20 2a 2f 0a 20 20  bserver..  */.  
c010: 66 6f 72 28 7a 3d 7a 53 63 72 69 70 74 3b 20 2a  for(z=zScript; *
c020: 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  z; z++){.    if(
c030: 20 2a 7a 3d 3d 27 2f 27 20 26 26 20 28 7a 5b 31   *z=='/' && (z[1
c040: 5d 3d 3d 27 2e 27 20 7c 7c 20 7a 5b 31 5d 3d 3d  ]=='.' || z[1]==
c050: 27 2d 27 29 20 29 7b 0a 20 20 20 20 20 20 20 4e  '-') ){.       N
c060: 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f  otFound(__LINE__
c070: 29 3b 20 2f 2a 20 4c 4f 47 3a 20 50 61 74 68 20  ); /* LOG: Path 
c080: 65 6c 65 6d 65 6e 74 20 62 65 67 69 6e 73 20 77  element begins w
c090: 69 74 68 20 22 2e 22 20 6f 72 20 22 2d 22 20 2a  ith "." or "-" *
c0a0: 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  /.    }.  }..  /
c0b0: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 61  * Figure out wha
c0c0: 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68  t the root of th
c0d0: 65 20 66 69 6c 65 73 79 73 74 65 6d 20 73 68 6f  e filesystem sho
c0e0: 75 6c 64 20 62 65 2e 20 20 49 66 20 74 68 65 0a  uld be.  If the.
c0f0: 20 20 2a 2a 20 48 54 54 50 5f 48 4f 53 54 20 70    ** HTTP_HOST p
c100: 61 72 61 6d 65 74 65 72 20 65 78 69 73 74 73 20  arameter exists 
c110: 28 73 74 6f 72 65 64 20 69 6e 20 7a 48 74 74 70  (stored in zHttp
c120: 48 6f 73 74 29 20 74 68 65 6e 20 72 65 6d 6f 76  Host) then remov
c130: 65 20 74 68 65 0a 20 20 2a 2a 20 70 6f 72 74 20  e the.  ** port 
c140: 6e 75 6d 62 65 72 20 66 72 6f 6d 20 74 68 65 20  number from the 
c150: 65 6e 64 20 28 69 66 20 61 6e 79 29 2c 20 63 6f  end (if any), co
c160: 6e 76 65 72 74 20 61 6c 6c 20 63 68 61 72 61 63  nvert all charac
c170: 74 65 72 73 20 74 6f 20 6c 6f 77 65 72 0a 20 20  ters to lower.  
c180: 2a 2a 20 63 61 73 65 2c 20 61 6e 64 20 63 6f 6e  ** case, and con
c190: 76 65 72 74 20 61 6c 6c 20 22 2e 22 20 74 6f 20  vert all "." to 
c1a0: 22 5f 22 2e 20 20 54 68 65 6e 20 74 72 79 20 74  "_".  Then try t
c1b0: 6f 20 66 69 6e 64 20 61 20 64 69 72 65 63 74 6f  o find a directo
c1c0: 72 79 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 61  ry.  ** with tha
c1d0: 74 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 65  t name and the e
c1e0: 78 74 65 6e 73 69 6f 6e 20 2e 77 65 62 73 69 74  xtension .websit
c1f0: 65 2e 20 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64  e.  If not found
c200: 2c 20 6c 6f 6f 6b 0a 20 20 2a 2a 20 66 6f 72 20  , look.  ** for 
c210: 22 64 65 66 61 75 6c 74 2e 77 65 62 73 69 74 65  "default.website
c220: 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 53  "..  */.  if( zS
c230: 63 72 69 70 74 5b 30 5d 21 3d 27 2f 27 20 29 7b  cript[0]!='/' ){
c240: 0a 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f  .    NotFound(__
c250: 4c 49 4e 45 5f 5f 29 3b 20 2f 2a 20 4c 4f 47 3a  LINE__); /* LOG:
c260: 20 55 52 49 20 64 6f 65 73 20 6e 6f 74 20 73 74   URI does not st
c270: 61 72 74 20 77 69 74 68 20 22 2f 22 20 2a 2f 0a  art with "/" */.
c280: 20 20 7d 0a 20 20 69 66 28 20 73 74 72 6c 65 6e    }.  if( strlen
c290: 28 7a 52 6f 6f 74 29 2b 34 30 20 3e 3d 20 73 69  (zRoot)+40 >= si
c2a0: 7a 65 6f 66 28 7a 4c 69 6e 65 29 20 29 7b 0a 20  zeof(zLine) ){. 
c2b0: 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c      NotFound(__L
c2c0: 49 4e 45 5f 5f 29 3b 20 2f 2a 20 4c 4f 47 3a 20  INE__); /* LOG: 
c2d0: 55 52 49 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a  URI too long */.
c2e0: 20 20 7d 0a 20 20 69 66 28 20 7a 48 74 74 70 48    }.  if( zHttpH
c2f0: 6f 73 74 3d 3d 30 20 7c 7c 20 7a 48 74 74 70 48  ost==0 || zHttpH
c300: 6f 73 74 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20  ost[0]==0 ){.   
c310: 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45   NotFound(__LINE
c320: 5f 5f 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 4d 69  __);  /* LOG: Mi
c330: 73 73 69 6e 67 20 48 4f 53 54 3a 20 70 61 72 61  ssing HOST: para
c340: 6d 65 74 65 72 20 2a 2f 0a 20 20 7d 65 6c 73 65  meter */.  }else
c350: 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 48 74 74   if( strlen(zHtt
c360: 70 48 6f 73 74 29 2b 73 74 72 6c 65 6e 28 7a 52  pHost)+strlen(zR
c370: 6f 6f 74 29 2b 31 30 20 3e 3d 20 73 69 7a 65 6f  oot)+10 >= sizeo
c380: 66 28 7a 4c 69 6e 65 29 20 29 7b 0a 20 20 20 20  f(zLine) ){.    
c390: 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f  NotFound(__LINE_
c3a0: 5f 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 48 4f 53  _);  /* LOG: HOS
c3b0: 54 20 70 61 72 61 6d 65 74 65 72 20 74 6f 6f 20  T parameter too 
c3c0: 6c 6f 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  long */.  }else{
c3d0: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 69  .    sprintf(zLi
c3e0: 6e 65 2c 20 22 25 73 2f 25 73 22 2c 20 7a 52 6f  ne, "%s/%s", zRo
c3f0: 6f 74 2c 20 7a 48 74 74 70 48 6f 73 74 29 3b 0a  ot, zHttpHost);.
c400: 20 20 20 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e      for(i=strlen
c410: 28 7a 52 6f 6f 74 29 2b 31 3b 20 7a 4c 69 6e 65  (zRoot)+1; zLine
c420: 5b 69 5d 20 26 26 20 7a 4c 69 6e 65 5b 69 5d 21  [i] && zLine[i]!
c430: 3d 27 3a 27 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  =':'; i++){.    
c440: 20 20 69 6e 74 20 63 20 3d 20 7a 4c 69 6e 65 5b    int c = zLine[
c450: 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 69  i];.      if( !i
c460: 73 61 6c 6e 75 6d 28 63 29 20 29 7b 0a 20 20 20  salnum(c) ){.   
c470: 20 20 20 20 20 7a 4c 69 6e 65 5b 69 5d 20 3d 20       zLine[i] = 
c480: 27 5f 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  '_';.      }else
c490: 20 69 66 28 20 69 73 75 70 70 65 72 28 63 29 20   if( isupper(c) 
c4a0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65  ){.        zLine
c4b0: 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72 28 63 29  [i] = tolower(c)
c4c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c4d0: 20 20 20 20 73 74 72 63 70 79 28 26 7a 4c 69 6e      strcpy(&zLin
c4e0: 65 5b 69 5d 2c 20 22 2e 77 65 62 73 69 74 65 22  e[i], ".website"
c4f0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61  );.  }.  if( sta
c500: 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75 66  t(zLine,&statbuf
c510: 29 20 7c 7c 20 21 53 5f 49 53 44 49 52 28 73 74  ) || !S_ISDIR(st
c520: 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29  atbuf.st_mode) )
c530: 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c  {.    sprintf(zL
c540: 69 6e 65 2c 20 22 25 73 2f 64 65 66 61 75 6c 74  ine, "%s/default
c550: 2e 77 65 62 73 69 74 65 22 2c 20 7a 52 6f 6f 74  .website", zRoot
c560: 29 3b 0a 20 20 20 20 69 66 28 20 73 74 61 74 28  );.    if( stat(
c570: 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75 66 29 20  zLine,&statbuf) 
c580: 7c 7c 20 21 53 5f 49 53 44 49 52 28 73 74 61 74  || !S_ISDIR(stat
c590: 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 7b 0a  buf.st_mode) ){.
c5a0: 20 20 20 20 20 20 69 66 28 20 73 74 61 6e 64 61        if( standa
c5b0: 6c 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lone ){.        
c5c0: 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22  sprintf(zLine, "
c5d0: 25 73 22 2c 20 7a 52 6f 6f 74 29 3b 0a 20 20 20  %s", zRoot);.   
c5e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c5f0: 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e    NotFound(__LIN
c600: 45 5f 5f 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 2a  E__);  /* LOG: *
c610: 2e 77 65 62 73 69 74 65 20 70 65 72 6d 69 73 73  .website permiss
c620: 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  ions */.      }.
c630: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 48 6f 6d      }.  }.  zHom
c640: 65 20 3d 20 53 74 72 44 75 70 28 7a 4c 69 6e 65  e = StrDup(zLine
c650: 29 3b 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20  );..  /* Change 
c660: 64 69 72 65 63 74 6f 72 69 65 73 20 74 6f 20 74  directories to t
c670: 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 48  he root of the H
c680: 54 54 50 20 66 69 6c 65 73 79 73 74 65 6d 0a 20  TTP filesystem. 
c690: 20 2a 2f 0a 20 20 69 66 28 20 63 68 64 69 72 28   */.  if( chdir(
c6a0: 7a 48 6f 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zHome)!=0 ){.   
c6b0: 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30 5d   char zBuf[1000]
c6c0: 3b 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f  ;.    Malfunctio
c6d0: 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 20 2f 2a 20  n(__LINE__,  /* 
c6e0: 4c 4f 47 3a 20 63 68 64 69 72 28 29 20 66 61 69  LOG: chdir() fai
c6f0: 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  led */.         
c700: 22 63 61 6e 6e 6f 74 20 63 68 64 69 72 20 74 6f  "cannot chdir to
c710: 20 5b 25 73 5d 20 66 72 6f 6d 20 5b 25 73 5d 22   [%s] from [%s]"
c720: 2c 0a 20 20 20 20 20 20 20 20 20 7a 48 6f 6d 65  ,.         zHome
c730: 2c 20 67 65 74 63 77 64 28 7a 42 75 66 2c 39 39  , getcwd(zBuf,99
c740: 39 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  9));.  }..  /* L
c750: 6f 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 69  ocate the file i
c760: 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
c770: 2e 20 20 57 65 20 6d 69 67 68 74 20 68 61 76 65  .  We might have
c780: 20 74 6f 20 61 70 70 65 6e 64 0a 20 20 2a 2a 20   to append.  ** 
c790: 74 68 65 20 6e 61 6d 65 20 22 69 6e 64 65 78 2e  the name "index.
c7a0: 68 74 6d 6c 22 20 69 6e 20 6f 72 64 65 72 20 74  html" in order t
c7b0: 6f 20 66 69 6e 64 20 69 74 2e 20 20 41 6e 79 20  o find it.  Any 
c7c0: 65 78 63 65 73 73 20 70 61 74 68 0a 20 20 2a 2a  excess path.  **
c7d0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
c7e0: 70 75 74 20 69 6e 74 6f 20 74 68 65 20 7a 50 61  put into the zPa
c7f0: 74 68 49 6e 66 6f 20 76 61 72 69 61 62 6c 65 2e  thInfo variable.
c800: 0a 20 20 2a 2f 0a 20 20 7a 4c 69 6e 65 5b 30 5d  .  */.  zLine[0]
c810: 20 3d 20 27 2e 27 3b 0a 20 20 69 20 3d 20 30 3b   = '.';.  i = 0;
c820: 0a 20 20 77 68 69 6c 65 28 20 7a 53 63 72 69 70  .  while( zScrip
c830: 74 5b 69 5d 20 29 7b 0a 20 20 20 20 77 68 69 6c  t[i] ){.    whil
c840: 65 28 20 7a 53 63 72 69 70 74 5b 69 5d 20 26 26  e( zScript[i] &&
c850: 20 7a 53 63 72 69 70 74 5b 69 5d 21 3d 27 2f 27   zScript[i]!='/'
c860: 20 29 7b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b   ){.      zLine[
c870: 69 2b 31 5d 20 3d 20 7a 53 63 72 69 70 74 5b 69  i+1] = zScript[i
c880: 5d 3b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  ];.      i++;.  
c890: 20 20 7d 0a 20 20 20 20 7a 4c 69 6e 65 5b 69 2b    }.    zLine[i+
c8a0: 31 5d 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  1] = 0;.    if( 
c8b0: 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74  stat(zLine,&stat
c8c0: 62 75 66 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  buf)!=0 ){.     
c8d0: 20 69 6e 74 20 73 74 69 6c 6c 53 65 61 72 63 68   int stillSearch
c8e0: 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 77  ing = 1;.      w
c8f0: 68 69 6c 65 28 20 73 74 69 6c 6c 53 65 61 72 63  hile( stillSearc
c900: 68 69 6e 67 20 26 26 20 69 3e 30 20 29 7b 0a 20  hing && i>0 ){. 
c910: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3e         while( i>
c920: 30 20 26 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d 27  0 && zLine[i]!='
c930: 2f 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20  /' ){ i--; }.   
c940: 20 20 20 20 20 73 74 72 63 70 79 28 26 7a 4c 69       strcpy(&zLi
c950: 6e 65 5b 69 5d 2c 20 22 2f 6e 6f 74 2d 66 6f 75  ne[i], "/not-fou
c960: 6e 64 2e 68 74 6d 6c 22 29 3b 0a 20 20 20 20 20  nd.html");.     
c970: 20 20 20 69 66 28 20 73 74 61 74 28 7a 4c 69 6e     if( stat(zLin
c980: 65 2c 26 73 74 61 74 62 75 66 29 3d 3d 30 20 26  e,&statbuf)==0 &
c990: 26 20 53 5f 49 53 52 45 47 28 73 74 61 74 62 75  & S_ISREG(statbu
c9a0: 66 2e 73 74 5f 6d 6f 64 65 29 0a 20 20 20 20 20  f.st_mode).     
c9b0: 20 20 20 20 20 20 20 26 26 20 61 63 63 65 73 73         && access
c9c0: 28 7a 4c 69 6e 65 2c 52 5f 4f 4b 29 3d 3d 30 20  (zLine,R_OK)==0 
c9d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 52 65  ){.          zRe
c9e0: 61 6c 53 63 72 69 70 74 20 3d 20 53 74 72 44 75  alScript = StrDu
c9f0: 70 28 26 7a 4c 69 6e 65 5b 31 5d 29 3b 0a 20 20  p(&zLine[1]);.  
ca00: 20 20 20 20 20 20 20 20 52 65 64 69 72 65 63 74          Redirect
ca10: 28 7a 52 65 61 6c 53 63 72 69 70 74 2c 20 31 2c  (zRealScript, 1,
ca20: 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 2f 2a 20 4c   __LINE__); /* L
ca30: 4f 47 3a 20 72 65 64 69 72 65 63 74 20 74 6f 20  OG: redirect to 
ca40: 6e 6f 74 2d 66 6f 75 6e 64 20 2a 2f 0a 20 20 20  not-found */.   
ca50: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
ca60: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
ca70: 20 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20          i--;.   
ca80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
ca90: 20 20 20 20 20 69 66 28 20 73 74 69 6c 6c 53 65       if( stillSe
caa0: 61 72 63 68 69 6e 67 20 29 20 4e 6f 74 46 6f 75  arching ) NotFou
cab0: 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 2f 2a  nd(__LINE__); /*
cac0: 20 4c 4f 47 3a 20 55 52 49 20 6e 6f 74 20 66 6f   LOG: URI not fo
cad0: 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  und */.      bre
cae0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
caf0: 28 20 53 5f 49 53 52 45 47 28 73 74 61 74 62 75  ( S_ISREG(statbu
cb00: 66 2e 73 74 5f 6d 6f 64 65 29 20 29 7b 0a 20 20  f.st_mode) ){.  
cb10: 20 20 20 20 69 66 28 20 61 63 63 65 73 73 28 7a      if( access(z
cb20: 4c 69 6e 65 2c 52 5f 4f 4b 29 20 29 7b 0a 20 20  Line,R_OK) ){.  
cb30: 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f        NotFound(_
cb40: 5f 4c 49 4e 45 5f 5f 29 3b 20 20 2f 2a 20 4c 4f  _LINE__);  /* LO
cb50: 47 3a 20 46 69 6c 65 20 6e 6f 74 20 72 65 61 64  G: File not read
cb60: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  able */.      }.
cb70: 20 20 20 20 20 20 7a 52 65 61 6c 53 63 72 69 70        zRealScrip
cb80: 74 20 3d 20 53 74 72 44 75 70 28 26 7a 4c 69 6e  t = StrDup(&zLin
cb90: 65 5b 31 5d 29 3b 0a 20 20 20 20 20 20 62 72 65  e[1]);.      bre
cba0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
cbb0: 28 20 7a 53 63 72 69 70 74 5b 69 5d 3d 3d 30 20  ( zScript[i]==0 
cbc0: 7c 7c 20 7a 53 63 72 69 70 74 5b 69 2b 31 5d 3d  || zScript[i+1]=
cbd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 63  =0 ){.      strc
cbe0: 70 79 28 26 7a 4c 69 6e 65 5b 69 2b 31 5d 2c 22  py(&zLine[i+1],"
cbf0: 2f 69 6e 64 65 78 2e 68 74 6d 6c 22 29 3b 0a 20  /index.html");. 
cc00: 20 20 20 20 20 69 66 28 20 73 74 61 74 28 7a 4c       if( stat(zL
cc10: 69 6e 65 2c 26 73 74 61 74 62 75 66 29 21 3d 30  ine,&statbuf)!=0
cc20: 20 7c 7c 20 21 53 5f 49 53 52 45 47 28 73 74 61   || !S_ISREG(sta
cc30: 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 0a 20  tbuf.st_mode) . 
cc40: 20 20 20 20 20 7c 7c 20 61 63 63 65 73 73 28 7a       || access(z
cc50: 4c 69 6e 65 2c 52 5f 4f 4b 29 20 29 7b 0a 20 20  Line,R_OK) ){.  
cc60: 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a 4c        strcpy(&zL
cc70: 69 6e 65 5b 69 2b 31 5d 2c 22 2f 69 6e 64 65 78  ine[i+1],"/index
cc80: 2e 63 67 69 22 29 3b 0a 20 20 20 20 20 20 20 20  .cgi");.        
cc90: 69 66 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26  if( stat(zLine,&
cca0: 73 74 61 74 62 75 66 29 21 3d 30 20 7c 7c 20 21  statbuf)!=0 || !
ccb0: 53 5f 49 53 52 45 47 28 73 74 61 74 62 75 66 2e  S_ISREG(statbuf.
ccc0: 73 74 5f 6d 6f 64 65 29 20 0a 20 20 20 20 20 20  st_mode) .      
ccd0: 20 20 7c 7c 20 61 63 63 65 73 73 28 7a 4c 69 6e    || access(zLin
cce0: 65 2c 52 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20  e,R_OK) ){.     
ccf0: 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f       NotFound(__
cd00: 4c 49 4e 45 5f 5f 29 3b 20 2f 2a 20 4c 4f 47 3a  LINE__); /* LOG:
cd10: 20 55 52 49 20 69 73 20 61 20 64 69 72 65 63 74   URI is a direct
cd20: 6f 72 79 20 77 2f 6f 20 69 6e 64 65 78 2e 68 74  ory w/o index.ht
cd30: 6d 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  ml */.        }.
cd40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 52        }.      zR
cd50: 65 61 6c 53 63 72 69 70 74 20 3d 20 53 74 72 44  ealScript = StrD
cd60: 75 70 28 26 7a 4c 69 6e 65 5b 31 5d 29 3b 0a 20  up(&zLine[1]);. 
cd70: 20 20 20 20 20 69 66 28 20 7a 53 63 72 69 70 74       if( zScript
cd80: 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]==0 ){.      
cd90: 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75    /* If the requ
cda0: 65 73 74 65 64 20 55 52 4c 20 64 6f 65 73 20 6e  ested URL does n
cdb0: 6f 74 20 65 6e 64 20 77 69 74 68 20 22 2f 22 20  ot end with "/" 
cdc0: 62 75 74 20 77 65 20 68 61 64 20 74 6f 0a 20 20  but we had to.  
cdd0: 20 20 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20        ** append 
cde0: 22 69 6e 64 65 78 2e 68 74 6d 6c 22 2c 20 74 68  "index.html", th
cdf0: 65 6e 20 61 20 72 65 64 69 72 65 63 74 20 69 73  en a redirect is
ce00: 20 6e 65 63 65 73 73 61 72 79 2e 20 20 4f 74 68   necessary.  Oth
ce10: 65 72 77 69 73 65 0a 20 20 20 20 20 20 20 20 2a  erwise.        *
ce20: 2a 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 65  * none of the re
ce30: 6c 61 74 69 76 65 20 55 52 4c 73 20 69 6e 20 74  lative URLs in t
ce40: 68 65 20 64 65 6c 69 76 65 72 65 64 20 64 6f 63  he delivered doc
ce50: 75 6d 65 6e 74 20 77 69 6c 6c 20 62 65 0a 20 20  ument will be.  
ce60: 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74        ** correct
ce70: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 52 65 64  . */.        Red
ce80: 69 72 65 63 74 28 7a 52 65 61 6c 53 63 72 69 70  irect(zRealScrip
ce90: 74 2c 31 2c 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 2f  t,1,__LINE__); /
cea0: 2a 20 4c 4f 47 3a 20 72 65 64 69 72 65 63 74 20  * LOG: redirect 
ceb0: 74 6f 20 61 64 64 20 74 72 61 69 6c 69 6e 67 20  to add trailing 
cec0: 2f 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  / */.        ret
ced0: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
cee0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
cef0: 20 20 20 20 7a 4c 69 6e 65 5b 69 2b 31 5d 20 3d      zLine[i+1] =
cf00: 20 7a 53 63 72 69 70 74 5b 69 5d 3b 0a 20 20 20   zScript[i];.   
cf10: 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c   i++;.  }.  zFil
cf20: 65 20 3d 20 53 74 72 44 75 70 28 7a 4c 69 6e 65  e = StrDup(zLine
cf30: 29 3b 0a 20 20 7a 50 61 74 68 49 6e 66 6f 20 3d  );.  zPathInfo =
cf40: 20 53 74 72 44 75 70 28 26 7a 53 63 72 69 70 74   StrDup(&zScript
cf50: 5b 69 5d 29 3b 0a 20 20 6c 65 6e 46 69 6c 65 20  [i]);.  lenFile 
cf60: 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 3b  = strlen(zFile);
cf70: 0a 20 20 7a 44 69 72 20 3d 20 53 74 72 44 75 70  .  zDir = StrDup
cf80: 28 7a 46 69 6c 65 29 3b 0a 20 20 66 6f 72 28 69  (zFile);.  for(i
cf90: 3d 73 74 72 6c 65 6e 28 7a 44 69 72 29 2d 31 3b  =strlen(zDir)-1;
cfa0: 20 69 3e 30 20 26 26 20 7a 44 69 72 5b 69 5d 21   i>0 && zDir[i]!
cfb0: 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 3b 0a 20 20  ='/'; i--){};.  
cfc0: 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20  if( i==0 ){.    
cfd0: 20 73 74 72 63 70 79 28 7a 44 69 72 2c 22 2f 22   strcpy(zDir,"/"
cfe0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
cff0: 20 7a 44 69 72 5b 69 5d 20 3d 20 30 3b 0a 20 20   zDir[i] = 0;.  
d000: 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  }..  /* Check to
d010: 20 73 65 65 20 69 66 20 74 68 65 72 65 20 69 73   see if there is
d020: 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f   an authorizatio
d030: 6e 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  n file.  If ther
d040: 65 20 69 73 2c 0a 20 20 2a 2a 20 70 72 6f 63 65  e is,.  ** proce
d050: 73 73 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 70  ss it..  */.  sp
d060: 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 25 73  rintf(zLine, "%s
d070: 2f 2d 61 75 74 68 22 2c 20 7a 44 69 72 29 3b 0a  /-auth", zDir);.
d080: 20 20 69 66 28 20 61 63 63 65 73 73 28 7a 4c 69    if( access(zLi
d090: 6e 65 2c 52 5f 4f 4b 29 3d 3d 30 20 26 26 20 21  ne,R_OK)==0 && !
d0a0: 43 68 65 63 6b 42 61 73 69 63 41 75 74 68 6f 72  CheckBasicAuthor
d0b0: 69 7a 61 74 69 6f 6e 28 7a 4c 69 6e 65 29 20 29  ization(zLine) )
d0c0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54   return;..  /* T
d0d0: 61 6b 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  ake appropriate 
d0e0: 61 63 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66  action.  */.  if
d0f0: 28 20 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f  ( (statbuf.st_mo
d100: 64 65 20 26 20 30 31 30 30 29 3d 3d 30 31 30 30  de & 0100)==0100
d110: 20 26 26 20 61 63 63 65 73 73 28 7a 46 69 6c 65   && access(zFile
d120: 2c 58 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20  ,X_OK)==0 ){.   
d130: 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   /*.    ** The f
d140: 6f 6c 6c 6f 77 69 6e 67 73 20 73 74 61 74 69 63  ollowings static
d150: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 75   variables are u
d160: 73 65 64 20 74 6f 20 73 65 74 75 70 20 74 68 65  sed to setup the
d170: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 0a 20 20 20   environment.   
d180: 20 2a 2a 20 66 6f 72 20 74 68 65 20 43 47 49 20   ** for the CGI 
d190: 73 63 72 69 70 74 0a 20 20 20 20 2a 2f 0a 20 20  script.    */.  
d1a0: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 64    static char *d
d1b0: 65 66 61 75 6c 74 5f 70 61 74 68 20 3d 20 22 2f  efault_path = "/
d1c0: 62 69 6e 3a 2f 75 73 72 2f 62 69 6e 22 3b 0a 20  bin:/usr/bin";. 
d1d0: 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a     static char *
d1e0: 67 61 74 65 77 61 79 5f 69 6e 74 65 72 66 61 63  gateway_interfac
d1f0: 65 20 3d 20 22 43 47 49 2f 31 2e 30 22 3b 0a 20  e = "CGI/1.0";. 
d200: 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74     static struct
d210: 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a   {.      char *z
d220: 45 6e 76 4e 61 6d 65 3b 0a 20 20 20 20 20 20 63  EnvName;.      c
d230: 68 61 72 20 2a 2a 70 7a 45 6e 76 56 61 6c 75 65  har **pzEnvValue
d240: 3b 0a 20 20 20 20 7d 20 63 67 69 65 6e 76 5b 5d  ;.    } cgienv[]
d250: 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 41 55   = {.      { "AU
d260: 54 48 5f 54 59 50 45 22 2c 20 20 20 20 20 20 20  TH_TYPE",       
d270: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 41 75              &zAu
d280: 74 68 54 79 70 65 20 7d 2c 0a 20 20 20 20 20 20  thType },.      
d290: 7b 20 22 41 55 54 48 5f 43 4f 4e 54 45 4e 54 22  { "AUTH_CONTENT"
d2a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d2b0: 20 26 7a 41 75 74 68 41 72 67 20 7d 2c 0a 20 20   &zAuthArg },.  
d2c0: 20 20 20 20 7b 20 22 43 4f 4e 54 45 4e 54 5f 4c      { "CONTENT_L
d2d0: 45 4e 47 54 48 22 2c 20 20 20 20 20 20 20 20 20  ENGTH",         
d2e0: 20 20 20 20 20 26 7a 43 6f 6e 74 65 6e 74 4c 65       &zContentLe
d2f0: 6e 67 74 68 20 7d 2c 0a 20 20 20 20 20 20 7b 20  ngth },.      { 
d300: 22 43 4f 4e 54 45 4e 54 5f 54 59 50 45 22 2c 20  "CONTENT_TYPE", 
d310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
d320: 7a 43 6f 6e 74 65 6e 74 54 79 70 65 20 7d 2c 0a  zContentType },.
d330: 20 20 20 20 20 20 7b 20 22 44 4f 43 55 4d 45 4e        { "DOCUMEN
d340: 54 5f 52 4f 4f 54 22 2c 20 20 20 20 20 20 20 20  T_ROOT",        
d350: 20 20 20 20 20 20 20 26 7a 48 6f 6d 65 20 7d 2c         &zHome },
d360: 0a 20 20 20 20 20 20 7b 20 22 47 41 54 45 57 41  .      { "GATEWA
d370: 59 5f 49 4e 54 45 52 46 41 43 45 22 2c 20 20 20  Y_INTERFACE",   
d380: 20 20 20 20 20 20 20 20 26 67 61 74 65 77 61 79          &gateway
d390: 5f 69 6e 74 65 72 66 61 63 65 20 7d 2c 0a 20 20  _interface },.  
d3a0: 20 20 20 20 7b 20 22 48 54 54 50 5f 41 43 43 45      { "HTTP_ACCE
d3b0: 50 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  PT",            
d3c0: 20 20 20 20 20 26 7a 41 63 63 65 70 74 20 7d 2c       &zAccept },
d3d0: 0a 20 20 20 20 20 20 7b 20 22 48 54 54 50 5f 41  .      { "HTTP_A
d3e0: 43 43 45 50 54 5f 45 4e 43 4f 44 49 4e 47 22 2c  CCEPT_ENCODING",
d3f0: 20 20 20 20 20 20 20 20 26 7a 41 63 63 65 70 74          &zAccept
d400: 45 6e 63 6f 64 69 6e 67 20 7d 2c 0a 20 20 20 20  Encoding },.    
d410: 20 20 7b 20 22 48 54 54 50 5f 43 4f 4f 4b 49 45    { "HTTP_COOKIE
d420: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
d430: 20 20 20 26 7a 43 6f 6f 6b 69 65 20 7d 2c 0a 20     &zCookie },. 
d440: 20 20 20 20 20 7b 20 22 48 54 54 50 5f 48 4f 53       { "HTTP_HOS
d450: 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  T",             
d460: 20 20 20 20 20 20 26 7a 48 74 74 70 48 6f 73 74        &zHttpHost
d470: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 48 54 54   },.      { "HTT
d480: 50 5f 52 45 46 45 52 45 52 22 2c 20 20 20 20 20  P_REFERER",     
d490: 20 20 20 20 20 20 20 20 20 20 20 26 7a 52 65 66             &zRef
d4a0: 65 72 65 72 20 7d 2c 0a 20 20 20 20 20 20 7b 20  erer },.      { 
d4b0: 22 48 54 54 50 5f 55 53 45 52 5f 41 47 45 4e 54  "HTTP_USER_AGENT
d4c0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 26  ",             &
d4d0: 7a 41 67 65 6e 74 20 7d 2c 0a 20 20 20 20 20 20  zAgent },.      
d4e0: 7b 20 22 50 41 54 48 22 2c 20 20 20 20 20 20 20  { "PATH",       
d4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d500: 20 26 64 65 66 61 75 6c 74 5f 70 61 74 68 20 7d   &default_path }
d510: 2c 0a 20 20 20 20 20 20 7b 20 22 50 41 54 48 5f  ,.      { "PATH_
d520: 49 4e 46 4f 22 2c 20 20 20 20 20 20 20 20 20 20  INFO",          
d530: 20 20 20 20 20 20 20 20 20 26 7a 50 61 74 68 49           &zPathI
d540: 6e 66 6f 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  nfo },.      { "
d550: 51 55 45 52 59 5f 53 54 52 49 4e 47 22 2c 20 20  QUERY_STRING",  
d560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
d570: 51 75 65 72 79 53 74 72 69 6e 67 20 7d 2c 0a 20  QueryString },. 
d580: 20 20 20 20 20 7b 20 22 52 45 4d 4f 54 45 5f 41       { "REMOTE_A
d590: 44 44 52 22 2c 20 20 20 20 20 20 20 20 20 20 20  DDR",           
d5a0: 20 20 20 20 20 20 26 7a 52 65 6d 6f 74 65 41 64        &zRemoteAd
d5b0: 64 72 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 52  dr },.      { "R
d5c0: 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 22 2c 20  EQUEST_METHOD", 
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 4d               &zM
d5e0: 65 74 68 6f 64 20 7d 2c 0a 20 20 20 20 20 20 7b  ethod },.      {
d5f0: 20 22 52 45 51 55 45 53 54 5f 55 52 49 22 2c 20   "REQUEST_URI", 
d600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d610: 26 7a 53 63 72 69 70 74 20 7d 2c 0a 20 20 20 20  &zScript },.    
d620: 20 20 7b 20 22 52 45 4d 4f 54 45 5f 55 53 45 52    { "REMOTE_USER
d630: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
d640: 20 20 20 26 7a 52 65 6d 6f 74 65 55 73 65 72 20     &zRemoteUser 
d650: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 43 52 49  },.      { "SCRI
d660: 50 54 5f 44 49 52 45 43 54 4f 52 59 22 2c 20 20  PT_DIRECTORY",  
d670: 20 20 20 20 20 20 20 20 20 20 26 7a 44 69 72 20            &zDir 
d680: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 43 52 49  },.      { "SCRI
d690: 50 54 5f 46 49 4c 45 4e 41 4d 45 22 2c 20 20 20  PT_FILENAME",   
d6a0: 20 20 20 20 20 20 20 20 20 20 26 7a 46 69 6c 65            &zFile
d6b0: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 43 52   },.      { "SCR
d6c0: 49 50 54 5f 4e 41 4d 45 22 2c 20 20 20 20 20 20  IPT_NAME",      
d6d0: 20 20 20 20 20 20 20 20 20 20 20 26 7a 52 65 61             &zRea
d6e0: 6c 53 63 72 69 70 74 20 7d 2c 0a 20 20 20 20 20  lScript },.     
d6f0: 20 7b 20 22 53 45 52 56 45 52 5f 4e 41 4d 45 22   { "SERVER_NAME"
d700: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d710: 20 20 26 7a 53 65 72 76 65 72 4e 61 6d 65 20 7d    &zServerName }
d720: 2c 0a 20 20 20 20 20 20 7b 20 22 53 45 52 56 45  ,.      { "SERVE
d730: 52 5f 50 4f 52 54 22 2c 20 20 20 20 20 20 20 20  R_PORT",        
d740: 20 20 20 20 20 20 20 20 20 26 7a 53 65 72 76 65           &zServe
d750: 72 50 6f 72 74 20 7d 2c 0a 20 20 20 20 20 20 7b  rPort },.      {
d760: 20 22 53 45 52 56 45 52 5f 50 52 4f 54 4f 43 4f   "SERVER_PROTOCO
d770: 4c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  L",             
d780: 26 7a 50 72 6f 74 6f 63 6f 6c 20 7d 2c 0a 20 20  &zProtocol },.  
d790: 20 20 7d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a    };.    char *z
d7a0: 42 61 73 65 46 69 6c 65 6e 61 6d 65 3b 20 20 20  BaseFilename;   
d7b0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d        /* Filenam
d7c0: 65 20 77 69 74 68 6f 75 74 20 64 69 72 65 63 74  e without direct
d7d0: 6f 72 79 20 70 72 65 66 69 78 20 2a 2f 0a 20 20  ory prefix */.  
d7e0: 20 20 69 6e 74 20 73 65 65 6e 43 6f 6e 74 65 6e    int seenConten
d7f0: 74 4c 65 6e 67 74 68 20 3d 20 30 3b 20 20 20 2f  tLength = 0;   /
d800: 2a 20 54 72 75 65 20 69 66 20 43 6f 6e 74 65 6e  * True if Conten
d810: 74 2d 6c 65 6e 67 74 68 3a 20 68 65 61 64 65 72  t-length: header
d820: 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74   seen */.    int
d830: 20 6e 52 65 73 20 3d 20 30 3b 20 20 20 20 20 20   nRes = 0;      
d840: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
d850: 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 20 2a 2f  es of payload */
d860: 0a 20 20 20 20 69 6e 74 20 6e 4d 61 6c 6c 6f 63  .    int nMalloc
d870: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
d880: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70    /* Bytes of sp
d890: 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ace allocated to
d8a0: 20 61 52 65 73 20 2a 2f 0a 20 20 20 20 63 68 61   aRes */.    cha
d8b0: 72 20 2a 61 52 65 73 20 3d 20 30 3b 20 20 20 20  r *aRes = 0;    
d8c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 79            /* Pay
d8d0: 6c 6f 61 64 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  load */..    /* 
d8e0: 49 66 20 69 74 73 20 65 78 65 63 75 74 61 62 6c  If its executabl
d8f0: 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 61 20  e, it must be a 
d900: 43 47 49 20 70 72 6f 67 72 61 6d 2e 20 20 53 74  CGI program.  St
d910: 61 72 74 20 62 79 0a 20 20 20 20 2a 2a 20 63 68  art by.    ** ch
d920: 61 6e 67 69 6e 67 20 64 69 72 65 63 74 6f 72 69  anging directori
d930: 65 73 20 74 6f 20 74 68 65 20 64 69 72 65 63 74  es to the direct
d940: 6f 72 79 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ory holding the 
d950: 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20 2a 2f 0a  program..    */.
d960: 20 20 20 20 69 66 28 20 63 68 64 69 72 28 7a 44      if( chdir(zD
d970: 69 72 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ir) ){.      cha
d980: 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20  r zBuf[1000];.  
d990: 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28      Malfunction(
d9a0: 5f 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a 20 4c 4f 47  __LINE__, /* LOG
d9b0: 3a 20 63 68 64 69 72 28 29 20 66 61 69 6c 65 64  : chdir() failed
d9c0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 22   */.           "
d9d0: 63 61 6e 6e 6f 74 20 63 68 64 69 72 20 74 6f 20  cannot chdir to 
d9e0: 5b 25 73 5d 20 66 72 6f 6d 20 5b 25 73 5d 22 2c  [%s] from [%s]",
d9f0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7a 44 69   .           zDi
da00: 72 2c 20 67 65 74 63 77 64 28 7a 42 75 66 2c 39  r, getcwd(zBuf,9
da10: 39 39 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  99));.    }..   
da20: 20 2f 2a 20 53 65 74 75 70 20 74 68 65 20 65 6e   /* Setup the en
da30: 76 69 72 6f 6e 6d 65 6e 74 20 61 70 70 72 6f 70  vironment approp
da40: 72 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2f 0a  riately..    */.
da50: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28      for(i=0; i<(
da60: 69 6e 74 29 28 73 69 7a 65 6f 66 28 63 67 69 65  int)(sizeof(cgie
da70: 6e 76 29 2f 73 69 7a 65 6f 66 28 63 67 69 65 6e  nv)/sizeof(cgien
da80: 76 5b 30 5d 29 29 3b 20 69 2b 2b 29 7b 0a 20 20  v[0])); i++){.  
da90: 20 20 20 20 69 66 28 20 2a 63 67 69 65 6e 76 5b      if( *cgienv[
daa0: 69 5d 2e 70 7a 45 6e 76 56 61 6c 75 65 20 29 7b  i].pzEnvValue ){
dab0: 0a 20 20 20 20 20 20 20 20 53 65 74 45 6e 76 28  .        SetEnv(
dac0: 63 67 69 65 6e 76 5b 69 5d 2e 7a 45 6e 76 4e 61  cgienv[i].zEnvNa
dad0: 6d 65 2c 2a 63 67 69 65 6e 76 5b 69 5d 2e 70 7a  me,*cgienv[i].pz
dae0: 45 6e 76 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  EnvValue);.     
daf0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
db00: 20 75 73 65 48 74 74 70 73 20 29 7b 0a 20 20 20   useHttps ){.   
db10: 20 20 20 70 75 74 65 6e 76 28 22 48 54 54 50 53     putenv("HTTPS
db20: 3d 6f 6e 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  =on");.    }..  
db30: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 41 62 6f 72    /*.    ** Abor
db40: 74 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20  t with an error 
db50: 69 66 20 74 68 65 20 43 47 49 20 73 63 72 69 70  if the CGI scrip
db60: 74 20 69 73 20 77 72 69 74 61 62 6c 65 20 62 79  t is writable by
db70: 20 61 6e 79 6f 6e 65 20 6f 74 68 65 72 0a 20 20   anyone other.  
db80: 20 20 2a 2a 20 74 68 61 6e 20 69 74 73 20 6f 77    ** than its ow
db90: 6e 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ner..    */.    
dba0: 69 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f 6d  if( statbuf.st_m
dbb0: 6f 64 65 20 26 20 30 30 32 32 20 29 7b 0a 20 20  ode & 0022 ){.  
dbc0: 20 20 20 20 43 67 69 53 63 72 69 70 74 57 72 69      CgiScriptWri
dbd0: 74 61 62 6c 65 28 29 3b 0a 20 20 20 20 7d 0a 0a  table();.    }..
dbe0: 20 20 20 20 2f 2a 20 46 6f 72 20 74 68 65 20 50      /* For the P
dbf0: 4f 53 54 20 6d 65 74 68 6f 64 20 61 6c 6c 20 69  OST method all i
dc00: 6e 70 75 74 20 68 61 73 20 62 65 65 6e 20 77 72  nput has been wr
dc10: 69 74 74 65 6e 20 74 6f 20 61 20 74 65 6d 70 6f  itten to a tempo
dc20: 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 20 20 2a  rary file,.    *
dc30: 2a 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20  * so we have to 
dc40: 72 65 64 69 72 65 63 74 20 69 6e 70 75 74 20 74  redirect input t
dc50: 6f 20 74 68 65 20 43 47 49 20 73 63 72 69 70 74  o the CGI script
dc60: 20 66 72 6f 6d 20 74 68 61 74 20 66 69 6c 65 2e   from that file.
dc70: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
dc80: 7a 4d 65 74 68 6f 64 5b 30 5d 3d 3d 27 50 27 20  zMethod[0]=='P' 
dc90: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 75 70  ){.      if( dup
dca0: 28 30 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  (0)<0 ){.       
dcb0: 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c   Malfunction(__L
dcc0: 49 4e 45 5f 5f 2c 20 20 2f 2a 20 4c 4f 47 3a 20  INE__,  /* LOG: 
dcd0: 64 75 70 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a  dup() failed */.
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcf0: 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f 20 64      "Unable to d
dd00: 75 70 6c 69 63 61 74 69 6f 6e 20 66 69 6c 65 20  uplication file 
dd10: 64 65 73 63 72 69 70 74 6f 72 20 30 22 29 3b 0a  descriptor 0");.
dd20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c        }.      cl
dd30: 6f 73 65 28 30 29 3b 0a 20 20 20 20 20 20 6f 70  ose(0);.      op
dd40: 65 6e 28 7a 54 6d 70 4e 61 6d 2c 20 4f 5f 52 44  en(zTmpNam, O_RD
dd50: 4f 4e 4c 59 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ONLY);.    }..  
dd60: 20 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 7a    for(i=strlen(z
dd70: 46 69 6c 65 29 2d 31 3b 20 69 3e 3d 30 20 26 26  File)-1; i>=0 &&
dd80: 20 7a 46 69 6c 65 5b 69 5d 21 3d 27 2f 27 3b 20   zFile[i]!='/'; 
dd90: 69 2d 2d 29 7b 7d 0a 20 20 20 20 7a 42 61 73 65  i--){}.    zBase
dda0: 46 69 6c 65 6e 61 6d 65 20 3d 20 26 7a 46 69 6c  Filename = &zFil
ddb0: 65 5b 69 2b 31 5d 3b 0a 20 20 20 20 69 66 28 20  e[i+1];.    if( 
ddc0: 69 3e 3d 30 20 26 26 20 73 74 72 6e 63 6d 70 28  i>=0 && strncmp(
ddd0: 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c 22 6e  zBaseFilename,"n
dde0: 70 68 2d 22 2c 34 29 3d 3d 30 20 29 7b 0a 20 20  ph-",4)==0 ){.  
ddf0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 61      /* If the na
de00: 6d 65 20 6f 66 20 74 68 65 20 43 47 49 20 73 63  me of the CGI sc
de10: 72 69 70 74 20 62 65 67 69 6e 73 20 77 69 74 68  ript begins with
de20: 20 22 6e 70 68 2d 22 20 74 68 65 6e 20 77 65 20   "nph-" then we 
de30: 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 61  are.      ** dea
de40: 6c 69 6e 67 20 77 69 74 68 20 61 20 22 6e 6f 6e  ling with a "non
de50: 2d 70 61 72 73 65 64 20 68 65 61 64 65 72 73 22  -parsed headers"
de60: 20 43 47 49 20 73 63 72 69 70 74 2e 20 20 4a 75   CGI script.  Ju
de70: 73 74 20 65 78 65 63 28 29 0a 20 20 20 20 20 20  st exec().      
de80: 2a 2a 20 69 74 20 64 69 72 65 63 74 6c 79 20 61  ** it directly a
de90: 6e 64 20 6c 65 74 20 69 74 20 68 61 6e 64 6c 65  nd let it handle
dea0: 20 61 6c 6c 20 69 74 73 20 6f 77 6e 20 68 65 61   all its own hea
deb0: 64 65 72 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a  der generation..
dec0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 65        */.      e
ded0: 78 65 63 6c 28 7a 42 61 73 65 46 69 6c 65 6e 61  xecl(zBaseFilena
dee0: 6d 65 2c 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65  me,zBaseFilename
def0: 2c 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20  ,(char*)0);.    
df00: 20 20 2f 2a 20 4e 4f 54 45 3a 20 4e 6f 20 6c 6f    /* NOTE: No lo
df10: 67 20 65 6e 74 72 79 20 77 72 69 74 74 65 6e 20  g entry written 
df20: 66 6f 72 20 6e 70 68 2d 20 73 63 72 69 70 74 73  for nph- scripts
df30: 20 2a 2f 0a 20 20 20 20 20 20 65 78 69 74 28 30   */.      exit(0
df40: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
df50: 20 46 61 6c 6c 20 74 68 72 75 20 74 6f 20 68 65   Fall thru to he
df60: 72 65 20 6f 6e 6c 79 20 69 66 20 74 68 69 73 20  re only if this 
df70: 70 72 6f 63 65 73 73 20 28 74 68 65 20 73 65 72  process (the ser
df80: 76 65 72 29 20 69 73 20 67 6f 69 6e 67 0a 20 20  ver) is going.  
df90: 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 61 6e 64    ** to read and
dfa0: 20 61 75 67 6d 65 6e 74 20 74 68 65 20 68 65 61   augment the hea
dfb0: 64 65 72 20 73 65 6e 74 20 62 61 63 6b 20 62 79  der sent back by
dfc0: 20 74 68 65 20 43 47 49 20 70 72 6f 63 65 73 73   the CGI process
dfd0: 2e 0a 20 20 20 20 2a 2a 20 4f 70 65 6e 20 61 20  ..    ** Open a 
dfe0: 70 69 70 65 20 74 6f 20 72 65 63 65 69 76 65 20  pipe to receive 
dff0: 74 68 65 20 6f 75 74 70 75 74 20 66 72 6f 6d 20  the output from 
e000: 74 68 65 20 43 47 49 20 70 72 6f 63 65 73 73 2e  the CGI process.
e010: 20 20 54 68 65 6e 0a 20 20 20 20 2a 2a 20 66 6f    Then.    ** fo
e020: 72 6b 20 74 68 65 20 43 47 49 20 70 72 6f 63 65  rk the CGI proce
e030: 73 73 2e 20 20 4f 6e 63 65 20 65 76 65 72 79 74  ss.  Once everyt
e040: 68 69 6e 67 20 69 73 20 64 6f 6e 65 2c 20 77 65  hing is done, we
e050: 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a   should be.    *
e060: 2a 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20 74  * able to read t
e070: 68 65 20 6f 75 74 70 75 74 20 6f 66 20 43 47 49  he output of CGI
e080: 20 6f 6e 20 74 68 65 20 22 69 6e 22 20 73 74 72   on the "in" str
e090: 65 61 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eam..    */.    
e0a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 78 5b 32  {.      int px[2
e0b0: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 69 70  ];.      if( pip
e0c0: 65 28 70 78 29 20 29 7b 0a 20 20 20 20 20 20 20  e(px) ){.       
e0d0: 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c   Malfunction(__L
e0e0: 49 4e 45 5f 5f 2c 20 2f 2a 20 4c 4f 47 3a 20 70  INE__, /* LOG: p
e0f0: 69 70 65 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a  ipe() failed */.
e100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e110: 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f 20 63      "Unable to c
e120: 72 65 61 74 65 20 61 20 70 69 70 65 20 66 6f 72  reate a pipe for
e130: 20 74 68 65 20 43 47 49 20 70 72 6f 67 72 61 6d   the CGI program
e140: 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
e150: 20 20 69 66 28 20 66 6f 72 6b 28 29 3d 3d 30 20    if( fork()==0 
e160: 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65  ){.        close
e170: 28 70 78 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20  (px[0]);.       
e180: 20 63 6c 6f 73 65 28 31 29 3b 0a 20 20 20 20 20   close(1);.     
e190: 20 20 20 69 66 28 20 64 75 70 28 70 78 5b 31 5d     if( dup(px[1]
e1a0: 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=1 ){.        
e1b0: 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f    Malfunction(__
e1c0: 4c 49 4e 45 5f 5f 2c 20 2f 2a 20 4c 4f 47 3a 20  LINE__, /* LOG: 
e1d0: 64 75 70 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a  dup() failed */.
e1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1f0: 20 22 55 6e 61 62 6c 65 20 74 6f 20 64 75 70 6c   "Unable to dupl
e200: 69 63 61 74 65 20 66 69 6c 65 20 64 65 73 63 72  icate file descr
e210: 69 70 74 6f 72 20 25 64 20 74 6f 20 31 22 2c 0a  iptor %d to 1",.
e220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e230: 20 70 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20   px[1]);.       
e240: 20 7d 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65   }.        close
e250: 28 70 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  (px[1]);.       
e260: 20 65 78 65 63 6c 28 7a 42 61 73 65 46 69 6c 65   execl(zBaseFile
e270: 6e 61 6d 65 2c 20 7a 42 61 73 65 46 69 6c 65 6e  name, zBaseFilen
e280: 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ame, (char*)0);.
e290: 20 20 20 20 20 20 20 20 65 78 69 74 28 30 29 3b          exit(0);
e2a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
e2b0: 6c 6f 73 65 28 70 78 5b 31 5d 29 3b 0a 20 20 20  lose(px[1]);.   
e2c0: 20 20 20 69 6e 20 3d 20 66 64 6f 70 65 6e 28 70     in = fdopen(p
e2d0: 78 5b 30 5d 2c 20 22 72 22 29 3b 0a 20 20 20 20  x[0], "r");.    
e2e0: 7d 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20  }.    if( in==0 
e2f0: 29 7b 0a 20 20 20 20 20 20 43 67 69 45 72 72 6f  ){.      CgiErro
e300: 72 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  r();.    }..    
e310: 2f 2a 20 52 65 61 64 20 61 6e 64 20 70 72 6f 63  /* Read and proc
e320: 65 73 73 20 74 68 65 20 66 69 72 73 74 20 6c 69  ess the first li
e330: 6e 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ne of the header
e340: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
e350: 0a 20 20 20 20 2a 2a 20 43 47 49 20 73 63 72 69  .    ** CGI scri
e360: 70 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  pt..    */.    i
e370: 66 28 20 75 73 65 54 69 6d 65 6f 75 74 20 29 20  f( useTimeout ) 
e380: 61 6c 61 72 6d 28 31 35 29 3b 0a 20 20 20 20 77  alarm(15);.    w
e390: 68 69 6c 65 28 20 66 67 65 74 73 28 7a 4c 69 6e  hile( fgets(zLin
e3a0: 65 2c 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c  e,sizeof(zLine),
e3b0: 69 6e 29 20 26 26 20 21 69 73 73 70 61 63 65 28  in) && !isspace(
e3c0: 7a 4c 69 6e 65 5b 30 5d 29 20 29 7b 0a 20 20 20  zLine[0]) ){.   
e3d0: 20 20 20 69 66 28 20 73 74 72 6e 63 61 73 65 63     if( strncasec
e3e0: 6d 70 28 7a 4c 69 6e 65 2c 22 4c 6f 63 61 74 69  mp(zLine,"Locati
e3f0: 6f 6e 3a 22 2c 39 29 3d 3d 30 20 29 7b 0a 20 20  on:",9)==0 ){.  
e400: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
e410: 20 20 20 20 20 52 65 6d 6f 76 65 4e 65 77 6c 69       RemoveNewli
e420: 6e 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20  ne(zLine);.     
e430: 20 20 20 7a 20 3d 20 26 7a 4c 69 6e 65 5b 31 30     z = &zLine[10
e440: 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ];.        while
e450: 28 20 69 73 73 70 61 63 65 28 2a 7a 29 20 29 7b  ( isspace(*z) ){
e460: 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20   z++; }.        
e470: 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
e480: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
e490: 66 28 20 7a 5b 69 5d 3d 3d 27 3f 27 20 29 7b 0a  f( z[i]=='?' ){.
e4a0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65              zQue
e4b0: 72 79 53 75 66 66 69 78 20 3d 20 53 74 72 44 75  rySuffix = StrDu
e4c0: 70 28 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20  p("");.         
e4d0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
e4e0: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 69 66       .        if
e4f0: 28 20 7a 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 7a  ( z[0]=='/' && z
e500: 5b 31 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [1]=='/' ){.    
e510: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 63 68        /* The sch
e520: 65 6d 65 20 69 73 20 6d 69 73 73 69 6e 67 2e 20  eme is missing. 
e530: 20 41 64 64 20 69 74 20 69 6e 20 62 65 66 6f 72   Add it in befor
e540: 65 20 72 65 64 69 72 65 63 74 69 6e 67 20 2a 2f  e redirecting */
e550: 0a 20 20 20 20 20 20 20 20 20 20 53 74 61 72 74  .          Start
e560: 52 65 73 70 6f 6e 73 65 28 22 33 30 32 20 52 65  Response("302 Re
e570: 64 69 72 65 63 74 22 29 3b 0a 20 20 20 20 20 20  direct");.      
e580: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
e590: 74 66 28 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73  tf("Location: %s
e5a0: 3a 25 73 25 73 5c 72 5c 6e 22 2c 7a 48 74 74 70  :%s%s\r\n",zHttp
e5b0: 2c 7a 2c 7a 51 75 65 72 79 53 75 66 66 69 78 29  ,z,zQuerySuffix)
e5c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
e5d0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 65  inue;.        }e
e5e0: 6c 73 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2f  lse if( z[0]=='/
e5f0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ' ){.          /
e600: 2a 20 54 68 65 20 73 63 68 65 6d 65 20 61 6e 64  * The scheme and
e610: 20 6e 65 74 77 6f 72 6b 20 6c 6f 63 61 74 69 6f   network locatio
e620: 6e 20 61 72 65 20 6d 69 73 73 69 6e 67 20 62 75  n are missing bu
e630: 74 20 77 65 20 68 61 76 65 0a 20 20 20 20 20 20  t we have.      
e640: 20 20 20 20 2a 2a 20 61 6e 20 61 62 73 6f 6c 75      ** an absolu
e650: 74 65 20 70 61 74 68 2e 20 2a 2f 0a 20 20 20 20  te path. */.    
e660: 20 20 20 20 20 20 52 65 64 69 72 65 63 74 28 7a        Redirect(z
e670: 2c 20 30 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20  , 0, __LINE__); 
e680: 2f 2a 20 4c 4f 47 3a 20 52 65 64 69 72 65 63 74  /* LOG: Redirect
e690: 20 66 72 6f 6d 20 43 47 49 20 2a 2f 0a 20 20 20   from CGI */.   
e6a0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
e6b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e6c0: 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
e6d0: 65 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ee if there is a
e6e0: 20 73 63 68 65 6d 65 20 70 72 65 66 69 78 20 2a   scheme prefix *
e6f0: 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  /.        for(i=
e700: 30 3b 20 7a 5b 69 5d 20 26 26 20 7a 5b 69 5d 21  0; z[i] && z[i]!
e710: 3d 27 3a 27 20 26 26 20 7a 5b 69 5d 21 3d 27 2f  =':' && z[i]!='/
e720: 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  '; i++){}.      
e730: 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 3a 27 20    if( z[i]==':' 
e740: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
e750: 57 65 20 68 61 76 65 20 61 20 73 63 68 65 6d 65  We have a scheme
e760: 2e 20 20 41 73 73 75 6d 65 20 74 68 65 72 65 20  .  Assume there 
e770: 69 73 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 55  is an absolute U
e780: 52 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  RL */.          
e790: 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 33  StartResponse("3
e7a0: 30 32 20 52 65 64 69 72 65 63 74 22 29 3b 0a 20  02 Redirect");. 
e7b0: 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d           nOut +=
e7c0: 20 70 72 69 6e 74 66 28 22 4c 6f 63 61 74 69 6f   printf("Locatio
e7d0: 6e 3a 20 25 73 25 73 5c 72 5c 6e 22 2c 7a 2c 7a  n: %s%s\r\n",z,z
e7e0: 51 75 65 72 79 53 75 66 66 69 78 29 3b 0a 20 20  QuerySuffix);.  
e7f0: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
e800: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e810: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 61      /* Must be a
e820: 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
e830: 6d 65 2e 20 20 43 6f 6e 73 74 72 75 63 74 20 74  me.  Construct t
e840: 68 65 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68  he absolute path
e850: 6e 61 6d 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  name.        ** 
e860: 61 6e 64 20 72 65 64 69 72 65 63 74 20 74 6f 20  and redirect to 
e870: 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  it. */.        i
e880: 20 3d 20 73 74 72 6c 65 6e 28 7a 52 65 61 6c 53   = strlen(zRealS
e890: 63 72 69 70 74 29 3b 0a 20 20 20 20 20 20 20 20  cript);.        
e8a0: 77 68 69 6c 65 28 20 69 3e 30 20 26 26 20 7a 52  while( i>0 && zR
e8b0: 65 61 6c 53 63 72 69 70 74 5b 69 2d 31 5d 21 3d  ealScript[i-1]!=
e8c0: 27 2f 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20  '/' ){ i--; }.  
e8d0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3e 30        while( i>0
e8e0: 20 26 26 20 7a 52 65 61 6c 53 63 72 69 70 74 5b   && zRealScript[
e8f0: 69 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 69 2d 2d  i-1]=='/' ){ i--
e900: 3b 20 7d 0a 20 20 20 20 20 20 20 20 77 68 69 6c  ; }.        whil
e910: 65 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b 0a 20 20  e( *z=='.' ){.  
e920: 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 31 5d          if( z[1]
e930: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
e940: 20 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 20       z += 2;.   
e950: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
e960: 20 7a 5b 31 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b   z[1]=='.' && z[
e970: 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  2]=='/' ){.     
e980: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3e         while( i>
e990: 30 20 26 26 20 7a 52 65 61 6c 53 63 72 69 70 74  0 && zRealScript
e9a0: 5b 69 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 69 2d  [i-1]!='/' ){ i-
e9b0: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20  -; }.           
e9c0: 20 77 68 69 6c 65 28 20 69 3e 30 20 26 26 20 7a   while( i>0 && z
e9d0: 52 65 61 6c 53 63 72 69 70 74 5b 69 2d 31 5d 3d  RealScript[i-1]=
e9e0: 3d 27 2f 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20  ='/' ){ i--; }. 
e9f0: 20 20 20 20 20 20 20 20 20 20 20 7a 20 2b 3d 20             z += 
ea00: 33 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  3;.          }el
ea10: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
ea20: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
ea30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
ea40: 20 20 20 20 20 20 20 20 53 74 61 72 74 52 65 73          StartRes
ea50: 70 6f 6e 73 65 28 22 33 30 32 20 52 65 64 69 72  ponse("302 Redir
ea60: 65 63 74 22 29 3b 0a 20 20 20 20 20 20 20 20 6e  ect");.        n
ea70: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 4c  Out += printf("L
ea80: 6f 63 61 74 69 6f 6e 3a 20 25 73 3a 2f 2f 25 73  ocation: %s://%s
ea90: 22 2c 7a 48 74 74 70 2c 7a 53 65 72 76 65 72 4e  ",zHttp,zServerN
eaa0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
eab0: 28 20 73 74 72 63 6d 70 28 7a 53 65 72 76 65 72  ( strcmp(zServer
eac0: 50 6f 72 74 2c 22 38 30 22 29 20 29 7b 0a 20 20  Port,"80") ){.  
ead0: 20 20 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20          nOut += 
eae0: 70 72 69 6e 74 66 28 22 3a 25 73 22 2c 7a 53 65  printf(":%s",zSe
eaf0: 72 76 65 72 50 6f 72 74 29 3b 0a 20 20 20 20 20  rverPort);.     
eb00: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 4f 75     }.        nOu
eb10: 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 25 2e 2a  t += printf("%.*
eb20: 73 2f 25 73 25 73 5c 72 5c 6e 5c 72 5c 6e 22 2c  s/%s%s\r\n\r\n",
eb30: 69 2c 7a 52 65 61 6c 53 63 72 69 70 74 2c 7a 2c  i,zRealScript,z,
eb40: 7a 51 75 65 72 79 53 75 66 66 69 78 29 3b 0a 20  zQuerySuffix);. 
eb50: 20 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e         MakeLogEn
eb60: 74 72 79 28 30 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  try(0, __LINE__)
eb70: 3b 20 2f 2a 20 4c 4f 47 3a 20 43 47 49 20 72 65  ; /* LOG: CGI re
eb80: 64 69 72 65 63 74 20 2a 2f 0a 20 20 20 20 20 20  direct */.      
eb90: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
eba0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 61  }else if( strnca
ebb0: 73 65 63 6d 70 28 7a 4c 69 6e 65 2c 22 53 74 61  secmp(zLine,"Sta
ebc0: 74 75 73 3a 22 2c 37 29 3d 3d 30 20 29 7b 0a 20  tus:",7)==0 ){. 
ebd0: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
ebe0: 20 20 20 20 20 20 66 6f 72 28 69 3d 37 3b 20 69        for(i=7; i
ebf0: 73 73 70 61 63 65 28 7a 4c 69 6e 65 5b 69 5d 29  sspace(zLine[i])
ec00: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20  ; i++){}.       
ec10: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
ec20: 22 25 73 20 25 73 22 2c 20 7a 50 72 6f 74 6f 63  "%s %s", zProtoc
ec30: 6f 6c 2c 20 26 7a 4c 69 6e 65 5b 69 5d 29 3b 0a  ol, &zLine[i]);.
ec40: 20 20 20 20 20 20 20 20 73 74 72 6e 63 70 79 28          strncpy(
ec50: 7a 52 65 70 6c 79 53 74 61 74 75 73 2c 20 26 7a  zReplyStatus, &z
ec60: 4c 69 6e 65 5b 69 5d 2c 20 33 29 3b 0a 20 20 20  Line[i], 3);.   
ec70: 20 20 20 20 20 7a 52 65 70 6c 79 53 74 61 74 75       zReplyStatu
ec80: 73 5b 33 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  s[3] = 0;.      
ec90: 20 20 73 74 61 74 75 73 53 65 6e 74 20 3d 20 31    statusSent = 1
eca0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
ecb0: 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63         if( strnc
ecc0: 61 73 65 63 6d 70 28 7a 4c 69 6e 65 2c 20 22 43  asecmp(zLine, "C
ecd0: 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74 68 3a 22 2c  ontent-length:",
ece0: 20 31 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   14)==0 ){.     
ecf0: 20 20 20 20 20 73 65 65 6e 43 6f 6e 74 65 6e 74       seenContent
ed00: 4c 65 6e 67 74 68 20 3d 20 31 3b 0a 20 20 20 20  Length = 1;.    
ed10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 53 74      }.        St
ed20: 61 72 74 52 65 73 70 6f 6e 73 65 28 22 32 30 30  artResponse("200
ed30: 20 4f 4b 22 29 3b 0a 20 20 20 20 20 20 20 20 6e   OK");.        n
ed40: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 25  Out += printf("%
ed50: 73 22 2c 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20  s",zLine);.     
ed60: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
ed70: 20 43 6f 70 79 20 65 76 65 72 79 74 68 69 6e 67   Copy everything
ed80: 20 65 6c 73 65 20 74 68 72 75 20 77 69 74 68 6f   else thru witho
ed90: 75 74 20 63 68 61 6e 67 65 20 6f 72 20 61 6e 61  ut change or ana
eda0: 6c 79 73 69 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  lysis..    */.  
edb0: 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28    StartResponse(
edc0: 22 32 30 30 20 4f 4b 22 29 3b 0a 20 20 20 20 69  "200 OK");.    i
edd0: 66 28 20 75 73 65 54 69 6d 65 6f 75 74 20 29 20  f( useTimeout ) 
ede0: 61 6c 61 72 6d 28 36 30 2a 35 29 3b 0a 20 20 20  alarm(60*5);.   
edf0: 20 69 66 28 20 73 65 65 6e 43 6f 6e 74 65 6e 74   if( seenContent
ee00: 4c 65 6e 67 74 68 20 29 7b 0a 20 20 20 20 20 20  Length ){.      
ee10: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22  nOut += printf("
ee20: 25 73 22 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20 20  %s", zLine);.   
ee30: 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 67     while( (c = g
ee40: 65 74 63 28 69 6e 29 29 21 3d 45 4f 46 20 29 7b  etc(in))!=EOF ){
ee50: 0a 20 20 20 20 20 20 20 20 70 75 74 63 28 63 2c  .        putc(c,
ee60: 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 20  stdout);.       
ee70: 20 6e 4f 75 74 2b 2b 3b 0a 20 20 20 20 20 20 7d   nOut++;.      }
ee80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ee90: 20 20 6e 52 65 73 20 3d 20 30 3b 0a 20 20 20 20    nRes = 0;.    
eea0: 20 20 6e 4d 61 6c 6c 6f 63 20 3d 20 31 30 30 30    nMalloc = 1000
eeb0: 3b 0a 20 20 20 20 20 20 61 52 65 73 20 3d 20 6d  ;.      aRes = m
eec0: 61 6c 6c 6f 63 28 6e 4d 61 6c 6c 6f 63 2b 31 29  alloc(nMalloc+1)
eed0: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 52 65 73  ;.      if( aRes
eee0: 3d 3d 30 20 29 20 4d 61 6c 66 75 6e 63 74 69 6f  ==0 ) Malfunctio
eef0: 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 22 4f 75 74 20  n(__LINE__,"Out 
ef00: 6f 66 20 6d 65 6d 6f 72 79 3a 20 25 64 20 62 79  of memory: %d by
ef10: 74 65 73 22 2c 20 6e 4d 61 6c 6c 6f 63 29 3b 0a  tes", nMalloc);.
ef20: 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 20        while( (c 
ef30: 3d 20 67 65 74 63 28 69 6e 29 29 21 3d 45 4f 46  = getc(in))!=EOF
ef40: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
ef50: 6e 52 65 73 3e 3d 6e 4d 61 6c 6c 6f 63 20 29 7b  nRes>=nMalloc ){
ef60: 0a 20 20 20 20 20 20 20 20 20 20 6e 4d 61 6c 6c  .          nMall
ef70: 6f 63 20 3d 20 6e 4d 61 6c 6c 6f 63 2a 32 3b 0a  oc = nMalloc*2;.
ef80: 20 20 20 20 20 20 20 20 20 20 61 52 65 73 20 3d            aRes =
ef90: 20 72 65 61 6c 6c 6f 63 28 61 52 65 73 2c 20 6e   realloc(aRes, n
efa0: 4d 61 6c 6c 6f 63 2b 31 29 3b 0a 20 20 20 20 20  Malloc+1);.     
efb0: 20 20 20 20 20 69 66 28 20 61 52 65 73 3d 3d 30       if( aRes==0
efc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
efd0: 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c   Malfunction(__L
efe0: 49 4e 45 5f 5f 2c 20 22 4f 75 74 20 6f 66 20 6d  INE__, "Out of m
eff0: 65 6d 6f 72 79 3a 20 25 64 20 62 79 74 65 73 22  emory: %d bytes"
f000: 2c 20 6e 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  , nMalloc);.    
f010: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f020: 7d 0a 20 20 20 20 20 20 20 20 61 52 65 73 5b 6e  }.        aRes[n
f030: 52 65 73 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20  Res++] = c;.    
f040: 20 20 7d 0a 20 20 20 20 20 20 61 52 65 73 5b 6e    }.      aRes[n
f050: 52 65 73 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  Res] = 0;.      
f060: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22  nOut += printf("
f070: 43 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74 68 3a 20  Content-length: 
f080: 25 64 5c 72 5c 6e 5c 72 5c 6e 25 73 22 2c 20 6e  %d\r\n\r\n%s", n
f090: 52 65 73 2c 20 61 52 65 73 29 3b 0a 20 20 20 20  Res, aRes);.    
f0a0: 20 20 66 72 65 65 28 61 52 65 73 29 3b 0a 20 20    free(aRes);.  
f0b0: 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28 69    }.    fclose(i
f0c0: 6e 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  n);.  }else if( 
f0d0: 63 6f 75 6e 74 53 6c 61 73 68 65 73 28 7a 52 65  countSlashes(zRe
f0e0: 61 6c 53 63 72 69 70 74 29 21 3d 63 6f 75 6e 74  alScript)!=count
f0f0: 53 6c 61 73 68 65 73 28 7a 53 63 72 69 70 74 29  Slashes(zScript)
f100: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
f110: 65 20 72 65 71 75 65 73 74 20 55 52 49 20 66 6f  e request URI fo
f120: 72 20 73 74 61 74 69 63 20 63 6f 6e 74 65 6e 74  r static content
f130: 20 63 6f 6e 74 61 69 6e 73 20 6d 61 74 65 72 69   contains materi
f140: 61 6c 20 70 61 73 74 20 74 68 65 0a 20 20 20 20  al past the.    
f150: 2a 2a 20 61 63 74 75 61 6c 20 63 6f 6e 74 65 6e  ** actual conten
f160: 74 20 66 69 6c 65 20 6e 61 6d 65 2c 20 72 65 70  t file name, rep
f170: 6f 72 74 20 74 68 61 74 20 61 73 20 61 20 34 30  ort that as a 40
f180: 34 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20  4 error. */.    
f190: 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f  NotFound(__LINE_
f1a0: 5f 29 3b 20 2f 2a 20 4c 4f 47 3a 20 45 78 63 65  _); /* LOG: Exce
f1b0: 73 73 20 55 52 49 20 63 6f 6e 74 65 6e 74 20 70  ss URI content p
f1c0: 61 73 74 20 73 74 61 74 69 63 20 66 69 6c 65 20  ast static file 
f1d0: 6e 61 6d 65 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  name */.  }else{
f1e0: 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73  .    /* If it is
f1f0: 6e 27 74 20 65 78 65 63 75 74 61 62 6c 65 20 74  n't executable t
f200: 68 65 6e 20 69 74 0a 20 20 20 20 2a 2a 20 6d 75  hen it.    ** mu
f210: 73 74 20 61 20 73 69 6d 70 6c 65 20 66 69 6c 65  st a simple file
f220: 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
f230: 65 20 63 6f 70 69 65 64 20 74 6f 20 6f 75 74 70  e copied to outp
f240: 75 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ut..    */.    c
f250: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6e 74  onst char *zCont
f260: 65 6e 74 54 79 70 65 20 3d 20 47 65 74 4d 69 6d  entType = GetMim
f270: 65 54 79 70 65 28 7a 46 69 6c 65 2c 20 6c 65 6e  eType(zFile, len
f280: 46 69 6c 65 29 3b 0a 0a 20 20 20 20 69 66 28 20  File);..    if( 
f290: 7a 54 6d 70 4e 61 6d 20 29 20 75 6e 6c 69 6e 6b  zTmpNam ) unlink
f2a0: 28 7a 54 6d 70 4e 61 6d 29 3b 0a 20 20 20 20 69  (zTmpNam);.    i
f2b0: 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c  n = fopen(zFile,
f2c0: 22 72 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e  "r");.    if( in
f2d0: 3d 3d 30 20 29 20 4e 6f 74 46 6f 75 6e 64 28 5f  ==0 ) NotFound(_
f2e0: 5f 4c 49 4e 45 5f 5f 29 3b 20 2f 2a 20 4c 4f 47  _LINE__); /* LOG
f2f0: 3a 20 66 6f 70 65 6e 28 29 20 66 61 69 6c 65 64  : fopen() failed
f300: 20 66 6f 72 20 73 74 61 74 69 63 20 63 6f 6e 74   for static cont
f310: 65 6e 74 20 2a 2f 0a 20 20 20 20 53 74 61 72 74  ent */.    Start
f320: 52 65 73 70 6f 6e 73 65 28 22 32 30 30 20 4f 4b  Response("200 OK
f330: 22 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20  ");.    nOut += 
f340: 44 61 74 65 54 61 67 28 22 4c 61 73 74 2d 4d 6f  DateTag("Last-Mo
f350: 64 69 66 69 65 64 22 2c 20 73 74 61 74 62 75 66  dified", statbuf
f360: 2e 73 74 5f 6d 74 69 6d 65 29 3b 0a 20 20 20 20  .st_mtime);.    
f370: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22  nOut += printf("
f380: 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 25 73  Content-type: %s
f390: 5c 72 5c 6e 22 2c 7a 43 6f 6e 74 65 6e 74 54 79  \r\n",zContentTy
f3a0: 70 65 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d  pe);.    nOut +=
f3b0: 20 70 72 69 6e 74 66 28 22 43 6f 6e 74 65 6e 74   printf("Content
f3c0: 2d 6c 65 6e 67 74 68 3a 20 25 64 5c 72 5c 6e 5c  -length: %d\r\n\
f3d0: 72 5c 6e 22 2c 28 69 6e 74 29 73 74 61 74 62 75  r\n",(int)statbu
f3e0: 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20  f.st_size);.    
f3f0: 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
f400: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
f410: 4d 65 74 68 6f 64 2c 22 48 45 41 44 22 29 3d 3d  Method,"HEAD")==
f420: 30 20 29 7b 0a 20 20 20 20 20 20 4d 61 6b 65 4c  0 ){.      MakeL
f430: 6f 67 45 6e 74 72 79 28 30 2c 20 5f 5f 4c 49 4e  ogEntry(0, __LIN
f440: 45 5f 5f 29 3b 20 2f 2a 20 4c 4f 47 3a 20 4e 6f  E__); /* LOG: No
f450: 72 6d 61 6c 20 48 45 41 44 20 72 65 70 6c 79 20  rmal HEAD reply 
f460: 2a 2f 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28  */.      fclose(
f470: 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  in);.      retur
f480: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  n;.    }.    if(
f490: 20 75 73 65 54 69 6d 65 6f 75 74 20 29 20 61 6c   useTimeout ) al
f4a0: 61 72 6d 28 33 30 20 2b 20 73 74 61 74 62 75 66  arm(30 + statbuf
f4b0: 2e 73 74 5f 73 69 7a 65 2f 31 30 30 30 29 3b 0a  .st_size/1000);.
f4c0: 23 69 66 64 65 66 20 6c 69 6e 75 78 0a 20 20 20  #ifdef linux.   
f4d0: 20 7b 0a 20 20 20 20 20 20 6f 66 66 5f 74 20 6f   {.      off_t o
f4e0: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
f4f0: 20 6e 4f 75 74 20 2b 3d 20 73 65 6e 64 66 69 6c   nOut += sendfil
f500: 65 28 66 69 6c 65 6e 6f 28 73 74 64 6f 75 74 29  e(fileno(stdout)
f510: 2c 20 66 69 6c 65 6e 6f 28 69 6e 29 2c 20 26 6f  , fileno(in), &o
f520: 66 66 73 65 74 2c 20 73 74 61 74 62 75 66 2e 73  ffset, statbuf.s
f530: 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23  t_size);.    }.#
f540: 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65 28 20  else.    while( 
f550: 28 63 20 3d 20 67 65 74 63 28 69 6e 29 29 21 3d  (c = getc(in))!=
f560: 45 4f 46 20 29 7b 0a 20 20 20 20 20 20 70 75 74  EOF ){.      put
f570: 63 28 63 2c 73 74 64 6f 75 74 29 3b 0a 20 20 20  c(c,stdout);.   
f580: 20 20 20 6e 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d     nOut++;.    }
f590: 0a 23 65 6e 64 69 66 0a 20 20 20 20 66 63 6c 6f  .#endif.    fclo
f5a0: 73 65 28 69 6e 29 3b 0a 20 20 7d 0a 20 20 66 66  se(in);.  }.  ff
f5b0: 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20  lush(stdout);.  
f5c0: 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20  MakeLogEntry(0, 
f5d0: 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 20 2f 2a 20 4c  __LINE__);  /* L
f5e0: 4f 47 3a 20 4e 6f 72 6d 61 6c 20 72 65 70 6c 79  OG: Normal reply
f5f0: 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65   */..  /* The ne
f600: 78 74 20 72 65 71 75 65 73 74 20 6d 75 73 74 20  xt request must 
f610: 61 72 72 69 76 65 20 77 69 74 68 69 6e 20 33 30  arrive within 30
f620: 20 73 65 63 6f 6e 64 73 20 6f 72 20 77 65 20 63   seconds or we c
f630: 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  lose the connect
f640: 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6f 6d 69 74 4c  ion.  */.  omitL
f650: 6f 67 20 3d 20 31 3b 0a 20 20 69 66 28 20 75 73  og = 1;.  if( us
f660: 65 54 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d  eTimeout ) alarm
f670: 28 33 30 29 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65  (30);.}..#define
f680: 20 4d 41 58 5f 50 41 52 41 4c 4c 45 4c 20 35 30   MAX_PARALLEL 50
f690: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
f6a0: 69 6d 75 6c 74 61 6e 65 6f 75 73 20 63 68 69 6c  imultaneous chil
f6b0: 64 72 65 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  dren */../*.** A
f6c0: 6c 6c 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 6d  ll possible form
f6d0: 73 20 6f 66 20 61 6e 20 49 50 20 61 64 64 72 65  s of an IP addre
f6e0: 73 73 2e 20 20 4e 65 65 64 65 64 20 74 6f 20 77  ss.  Needed to w
f6f0: 6f 72 6b 20 61 72 6f 75 6e 64 20 47 43 43 20 73  ork around GCC s
f700: 74 72 69 63 74 0a 2a 2a 20 61 6c 69 61 73 69 6e  trict.** aliasin
f710: 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65  g rules..*/.type
f720: 64 65 66 20 75 6e 69 6f 6e 20 7b 0a 20 20 73 74  def union {.  st
f730: 72 75 63 74 20 73 6f 63 6b 61 64 64 72 20 73 61  ruct sockaddr sa
f740: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
f750: 2a 20 41 62 73 74 72 61 63 74 20 73 75 70 65 72  * Abstract super
f760: 63 6c 61 73 73 20 2a 2f 0a 20 20 73 74 72 75 63  class */.  struc
f770: 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 20 73 61  t sockaddr_in sa
f780: 34 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  4;          /* I
f790: 50 76 34 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  Pv4 */.  struct 
f7a0: 73 6f 63 6b 61 64 64 72 5f 69 6e 36 20 73 61 36  sockaddr_in6 sa6
f7b0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 50 76  ;         /* IPv
f7c0: 36 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 6f  6 */.  struct so
f7d0: 63 6b 61 64 64 72 5f 73 74 6f 72 61 67 65 20 73  ckaddr_storage s
f7e0: 61 73 3b 20 20 20 20 20 2f 2a 20 53 68 6f 75 6c  as;     /* Shoul
f7f0: 64 20 62 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  d be the maximum
f800: 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 33 20   of the above 3 
f810: 2a 2f 0a 7d 20 61 64 64 72 65 73 73 3b 0a 0a 2f  */.} address;../
f820: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61  *.** Implement a
f830: 6e 20 48 54 54 50 20 73 65 72 76 65 72 20 64 61  n HTTP server da
f840: 65 6d 6f 6e 20 6c 69 73 74 65 6e 69 6e 67 20 6f  emon listening o
f850: 6e 20 70 6f 72 74 20 69 50 6f 72 74 2e 0a 2a 2a  n port iPort..**
f860: 0a 2a 2a 20 41 73 20 6e 65 77 20 63 6f 6e 6e 65  .** As new conne
f870: 63 74 69 6f 6e 73 20 61 72 72 69 76 65 2c 20 66  ctions arrive, f
f880: 6f 72 6b 20 61 20 63 68 69 6c 64 20 61 6e 64 20  ork a child and 
f890: 6c 65 74 20 63 68 69 6c 64 20 72 65 74 75 72 6e  let child return
f8a0: 0a 2a 2a 20 6f 75 74 20 6f 66 20 74 68 69 73 20  .** out of this 
f8b0: 70 72 6f 63 65 64 75 72 65 20 63 61 6c 6c 2e 20  procedure call. 
f8c0: 20 54 68 65 20 63 68 69 6c 64 20 77 69 6c 6c 20   The child will 
f8d0: 68 61 6e 64 6c 65 20 74 68 65 20 72 65 71 75 65  handle the reque
f8e0: 73 74 2e 0a 2a 2a 20 54 68 65 20 70 61 72 65 6e  st..** The paren
f8f0: 74 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73 20  t never returns 
f900: 66 72 6f 6d 20 74 68 69 73 20 70 72 6f 63 65 64  from this proced
f910: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ure..**.** Retur
f920: 6e 20 30 20 74 6f 20 65 61 63 68 20 63 68 69 6c  n 0 to each chil
f930: 64 20 61 73 20 69 74 20 72 75 6e 73 2e 20 20 49  d as it runs.  I
f940: 66 20 75 6e 61 62 6c 65 20 74 6f 20 65 73 74 61  f unable to esta
f950: 62 6c 69 73 68 20 61 0a 2a 2a 20 6c 69 73 74 65  blish a.** liste
f960: 6e 69 6e 67 20 73 6f 63 6b 65 74 2c 20 72 65 74  ning socket, ret
f970: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f  urn non-zero..*/
f980: 0a 69 6e 74 20 68 74 74 70 5f 73 65 72 76 65 72  .int http_server
f990: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 6f  (const char *zPo
f9a0: 72 74 2c 20 69 6e 74 20 6c 6f 63 61 6c 4f 6e 6c  rt, int localOnl
f9b0: 79 29 7b 0a 20 20 69 6e 74 20 6c 69 73 74 65 6e  y){.  int listen
f9c0: 65 72 5b 32 30 5d 3b 20 20 20 20 20 20 20 20 20  er[20];         
f9d0: 20 20 20 2f 2a 20 54 68 65 20 73 65 72 76 65 72     /* The server
f9e0: 20 73 6f 63 6b 65 74 73 20 2a 2f 0a 20 20 69 6e   sockets */.  in
f9f0: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 3b 20 20 20  t connection;   
fa00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
fa10: 73 6f 63 6b 65 74 20 66 6f 72 20 65 61 63 68 20  socket for each 
fa20: 69 6e 64 69 76 69 64 75 61 6c 20 63 6f 6e 6e 65  individual conne
fa30: 63 74 69 6f 6e 20 2a 2f 0a 20 20 66 64 5f 73 65  ction */.  fd_se
fa40: 74 20 72 65 61 64 66 64 73 3b 20 20 20 20 20 20  t readfds;      
fa50: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f          /* Set o
fa60: 66 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  f file descripto
fa70: 72 73 20 66 6f 72 20 73 65 6c 65 63 74 28 29 20  rs for select() 
fa80: 2a 2f 0a 20 20 61 64 64 72 65 73 73 20 69 6e 61  */.  address ina
fa90: 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddr;            
faa0: 20 20 2f 2a 20 52 65 6d 6f 74 65 20 61 64 64 72    /* Remote addr
fab0: 65 73 73 20 2a 2f 0a 20 20 73 6f 63 6b 6c 65 6e  ess */.  socklen
fac0: 5f 74 20 6c 65 6e 61 64 64 72 3b 20 20 20 20 20  _t lenaddr;     
fad0: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
fae0: 6f 66 20 74 68 65 20 69 6e 61 64 64 72 20 73 74  of the inaddr st
faf0: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74  ructure */.  int
fb00: 20 63 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20   child;         
fb10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 49 44            /* PID
fb20: 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 72   of the child pr
fb30: 6f 63 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  ocess */.  int n
fb40: 63 68 69 6c 64 72 65 6e 20 3d 20 30 3b 20 20 20  children = 0;   
fb50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
fb60: 72 20 6f 66 20 63 68 69 6c 64 20 70 72 6f 63 65  r of child proce
fb70: 73 73 65 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  sses */.  struct
fb80: 20 74 69 6d 65 76 61 6c 20 64 65 6c 61 79 3b 20   timeval delay; 
fb90: 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6c 6f         /* How lo
fba0: 6e 67 20 74 6f 20 77 61 69 74 20 69 6e 73 69 64  ng to wait insid
fbb0: 65 20 73 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20  e select() */.  
fbc0: 69 6e 74 20 6f 70 74 20 3d 20 31 3b 20 20 20 20  int opt = 1;    
fbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fbe0: 73 65 74 73 6f 63 6b 6f 70 74 20 66 6c 61 67 20  setsockopt flag 
fbf0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 61 64 64 72  */.  struct addr
fc00: 69 6e 66 6f 20 73 48 69 6e 74 73 3b 20 20 20 20  info sHints;    
fc10: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 68 69 6e    /* Address hin
fc20: 74 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61  ts */.  struct a
fc30: 64 64 72 69 6e 66 6f 20 2a 70 41 64 64 72 73 2c  ddrinfo *pAddrs,
fc40: 20 2a 70 3b 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74   *p; /* */.  int
fc50: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
fc60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
fc70: 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  ult code */.  in
fc80: 74 20 69 2c 20 6e 3b 0a 20 20 69 6e 74 20 6d 61  t i, n;.  int ma
fc90: 78 46 64 20 3d 20 2d 31 3b 0a 20 20 0a 20 20 6d  xFd = -1;.  .  m
fca0: 65 6d 73 65 74 28 26 73 48 69 6e 74 73 2c 20 30  emset(&sHints, 0
fcb0: 2c 20 73 69 7a 65 6f 66 28 73 48 69 6e 74 73 29  , sizeof(sHints)
fcc0: 29 3b 0a 20 20 69 66 28 20 69 70 76 34 4f 6e 6c  );.  if( ipv4Onl
fcd0: 79 20 29 7b 0a 20 20 20 20 73 48 69 6e 74 73 2e  y ){.    sHints.
fce0: 61 69 5f 66 61 6d 69 6c 79 20 3d 20 50 46 5f 49  ai_family = PF_I
fcf0: 4e 45 54 3b 0a 20 20 20 20 2f 2a 70 72 69 6e 74  NET;.    /*print
fd00: 66 28 22 69 70 76 34 20 6f 6e 6c 79 5c 6e 22 29  f("ipv4 only\n")
fd10: 3b 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ;*/.  }else if( 
fd20: 69 70 76 36 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  ipv6Only ){.    
fd30: 73 48 69 6e 74 73 2e 61 69 5f 66 61 6d 69 6c 79  sHints.ai_family
fd40: 20 3d 20 50 46 5f 49 4e 45 54 36 3b 0a 20 20 20   = PF_INET6;.   
fd50: 20 2f 2a 70 72 69 6e 74 66 28 22 69 70 76 36 20   /*printf("ipv6 
fd60: 6f 6e 6c 79 5c 6e 22 29 3b 2a 2f 0a 20 20 7d 65  only\n");*/.  }e
fd70: 6c 73 65 7b 0a 20 20 20 20 73 48 69 6e 74 73 2e  lse{.    sHints.
fd80: 61 69 5f 66 61 6d 69 6c 79 20 3d 20 50 46 5f 55  ai_family = PF_U
fd90: 4e 53 50 45 43 3b 0a 20 20 7d 0a 20 20 73 48 69  NSPEC;.  }.  sHi
fda0: 6e 74 73 2e 61 69 5f 73 6f 63 6b 74 79 70 65 20  nts.ai_socktype 
fdb0: 3d 20 53 4f 43 4b 5f 53 54 52 45 41 4d 3b 0a 20  = SOCK_STREAM;. 
fdc0: 20 73 48 69 6e 74 73 2e 61 69 5f 66 6c 61 67 73   sHints.ai_flags
fdd0: 20 3d 20 41 49 5f 50 41 53 53 49 56 45 3b 0a 20   = AI_PASSIVE;. 
fde0: 20 73 48 69 6e 74 73 2e 61 69 5f 70 72 6f 74 6f   sHints.ai_proto
fdf0: 63 6f 6c 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  col = 0;.  rc = 
fe00: 67 65 74 61 64 64 72 69 6e 66 6f 28 6c 6f 63 61  getaddrinfo(loca
fe10: 6c 4f 6e 6c 79 20 3f 20 22 6c 6f 63 61 6c 68 6f  lOnly ? "localho
fe20: 73 74 22 3a 20 30 2c 20 7a 50 6f 72 74 2c 20 26  st": 0, zPort, &
fe30: 73 48 69 6e 74 73 2c 20 26 70 41 64 64 72 73 29  sHints, &pAddrs)
fe40: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
fe50: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
fe60: 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 67 65 74  , "could not get
fe70: 20 61 64 64 72 20 69 6e 66 6f 3a 20 25 73 22 2c   addr info: %s",
fe80: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63   .            rc
fe90: 21 3d 45 41 49 5f 53 59 53 54 45 4d 20 3f 20 67  !=EAI_SYSTEM ? g
fea0: 61 69 5f 73 74 72 65 72 72 6f 72 28 72 63 29 20  ai_strerror(rc) 
feb0: 3a 20 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f  : strerror(errno
fec0: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ));.    return 1
fed0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6e 3d 30 2c  ;.  }.  for(n=0,
fee0: 20 70 3d 70 41 64 64 72 73 3b 20 6e 3c 28 69 6e   p=pAddrs; n<(in
fef0: 74 29 28 73 69 7a 65 6f 66 28 6c 69 73 74 65 6e  t)(sizeof(listen
ff00: 65 72 29 2f 73 69 7a 65 6f 66 28 6c 69 73 74 65  er)/sizeof(liste
ff10: 6e 65 72 5b 30 5d 29 29 20 26 26 20 70 21 3d 30  ner[0])) && p!=0
ff20: 3b 0a 20 20 20 20 20 20 20 20 70 3d 70 2d 3e 61  ;.        p=p->a
ff30: 69 5f 6e 65 78 74 29 7b 0a 20 20 20 20 6c 69 73  i_next){.    lis
ff40: 74 65 6e 65 72 5b 6e 5d 20 3d 20 73 6f 63 6b 65  tener[n] = socke
ff50: 74 28 70 2d 3e 61 69 5f 66 61 6d 69 6c 79 2c 20  t(p->ai_family, 
ff60: 70 2d 3e 61 69 5f 73 6f 63 6b 74 79 70 65 2c 20  p->ai_socktype, 
ff70: 70 2d 3e 61 69 5f 70 72 6f 74 6f 63 6f 6c 29 3b  p->ai_protocol);
ff80: 0a 20 20 20 20 69 66 28 20 6c 69 73 74 65 6e 65  .    if( listene
ff90: 72 5b 6e 5d 3e 3d 30 20 29 7b 0a 20 20 20 20 20  r[n]>=0 ){.     
ffa0: 20 2f 2a 20 69 66 20 77 65 20 63 61 6e 27 74 20   /* if we can't 
ffb0: 74 65 72 6d 69 6e 61 74 65 20 6e 69 63 65 6c 79  terminate nicely
ffc0: 2c 20 61 74 20 6c 65 61 73 74 20 61 6c 6c 6f 77  , at least allow
ffd0: 20 74 68 65 20 73 6f 63 6b 65 74 20 74 6f 20 62   the socket to b
ffe0: 65 20 72 65 75 73 65 64 20 2a 2f 0a 20 20 20 20  e reused */.    
fff0: 20 20 73 65 74 73 6f 63 6b 6f 70 74 28 6c 69 73    setsockopt(lis
10000 74 65 6e 65 72 5b 6e 5d 2c 20 53 4f 4c 5f 53 4f  tener[n], SOL_SO
10010 43 4b 45 54 2c 20 53 4f 5f 52 45 55 53 45 41 44  CKET, SO_REUSEAD
10020 44 52 2c 26 6f 70 74 2c 20 73 69 7a 65 6f 66 28  DR,&opt, sizeof(
10030 6f 70 74 29 29 3b 0a 20 20 20 20 20 20 0a 23 69  opt));.      .#i
10040 66 20 64 65 66 69 6e 65 64 28 49 50 56 36 5f 56  f defined(IPV6_V
10050 36 4f 4e 4c 59 29 0a 20 20 20 20 20 20 69 66 28  6ONLY).      if(
10060 20 70 2d 3e 61 69 5f 66 61 6d 69 6c 79 3d 3d 41   p->ai_family==A
10070 46 5f 49 4e 45 54 36 20 29 7b 0a 20 20 20 20 20  F_INET6 ){.     
10080 20 20 20 69 6e 74 20 76 36 6f 6e 6c 79 20 3d 20     int v6only = 
10090 31 3b 0a 20 20 20 20 20 20 20 20 73 65 74 73 6f  1;.        setso
100a0 63 6b 6f 70 74 28 6c 69 73 74 65 6e 65 72 5b 6e  ckopt(listener[n
100b0 5d 2c 20 49 50 50 52 4f 54 4f 5f 49 50 56 36 2c  ], IPPROTO_IPV6,
100c0 20 49 50 56 36 5f 56 36 4f 4e 4c 59 2c 0a 20 20   IPV6_V6ONLY,.  
100d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100e0 20 20 26 76 36 6f 6e 6c 79 2c 20 73 69 7a 65 6f    &v6only, sizeo
100f0 66 28 76 36 6f 6e 6c 79 29 29 3b 0a 20 20 20 20  f(v6only));.    
10100 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
10110 20 0a 20 20 20 20 20 20 69 66 28 20 62 69 6e 64   .      if( bind
10120 28 6c 69 73 74 65 6e 65 72 5b 6e 5d 2c 20 70 2d  (listener[n], p-
10130 3e 61 69 5f 61 64 64 72 2c 20 70 2d 3e 61 69 5f  >ai_addr, p->ai_
10140 61 64 64 72 6c 65 6e 29 3c 30 20 29 7b 0a 20 20  addrlen)<0 ){.  
10150 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 62 69        printf("bi
10160 6e 64 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22  nd failed: %s\n"
10170 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f  , strerror(errno
10180 29 29 3b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73  ));.        clos
10190 65 28 6c 69 73 74 65 6e 65 72 5b 6e 5d 29 3b 0a  e(listener[n]);.
101a0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
101b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
101c0 69 66 28 20 6c 69 73 74 65 6e 28 6c 69 73 74 65  if( listen(liste
101d0 6e 65 72 5b 6e 5d 2c 20 32 30 29 3c 30 20 29 7b  ner[n], 20)<0 ){
101e0 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28  .        printf(
101f0 22 6c 69 73 74 65 6e 28 29 20 66 61 69 6c 65 64  "listen() failed
10200 3a 20 25 73 5c 6e 22 2c 20 73 74 72 65 72 72 6f  : %s\n", strerro
10210 72 28 65 72 72 6e 6f 29 29 3b 0a 20 20 20 20 20  r(errno));.     
10220 20 20 20 63 6c 6f 73 65 28 6c 69 73 74 65 6e 65     close(listene
10230 72 5b 6e 5d 29 3b 0a 20 20 20 20 20 20 20 20 63  r[n]);.        c
10240 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
10250 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20  .      n++;.    
10260 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 30  }.  }.  if( n==0
10270 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
10280 73 74 64 65 72 72 2c 20 22 63 61 6e 6e 6f 74 20  stderr, "cannot 
10290 6f 70 65 6e 20 61 6e 79 20 73 6f 63 6b 65 74 73  open any sockets
102a0 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  \n");.    return
102b0 20 31 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65   1;.  }..  while
102c0 28 20 31 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ( 1 ){.    if( n
102d0 63 68 69 6c 64 72 65 6e 3e 4d 41 58 5f 50 41 52  children>MAX_PAR
102e0 41 4c 4c 45 4c 20 29 7b 0a 20 20 20 20 20 20 2f  ALLEL ){.      /
102f0 2a 20 53 6c 6f 77 20 64 6f 77 6e 20 69 66 20 63  * Slow down if c
10300 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61  onnections are a
10310 72 72 69 76 69 6e 67 20 74 6f 6f 20 66 61 73 74  rriving too fast
10320 20 2a 2f 0a 20 20 20 20 20 20 73 6c 65 65 70 28   */.      sleep(
10330 20 6e 63 68 69 6c 64 72 65 6e 2d 4d 41 58 5f 50   nchildren-MAX_P
10340 41 52 41 4c 4c 45 4c 20 29 3b 0a 20 20 20 20 7d  ARALLEL );.    }
10350 0a 20 20 20 20 64 65 6c 61 79 2e 74 76 5f 73 65  .    delay.tv_se
10360 63 20 3d 20 36 30 3b 0a 20 20 20 20 64 65 6c 61  c = 60;.    dela
10370 79 2e 74 76 5f 75 73 65 63 20 3d 20 30 3b 0a 20  y.tv_usec = 0;. 
10380 20 20 20 46 44 5f 5a 45 52 4f 28 26 72 65 61 64     FD_ZERO(&read
10390 66 64 73 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  fds);.    for(i=
103a0 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
103b0 20 20 20 20 61 73 73 65 72 74 28 20 6c 69 73 74      assert( list
103c0 65 6e 65 72 5b 69 5d 3e 3d 30 20 29 3b 0a 20 20  ener[i]>=0 );.  
103d0 20 20 20 20 46 44 5f 53 45 54 28 20 6c 69 73 74      FD_SET( list
103e0 65 6e 65 72 5b 69 5d 2c 20 26 72 65 61 64 66 64  ener[i], &readfd
103f0 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 69  s);.      if( li
10400 73 74 65 6e 65 72 5b 69 5d 3e 6d 61 78 46 64 20  stener[i]>maxFd 
10410 29 20 6d 61 78 46 64 20 3d 20 6c 69 73 74 65 6e  ) maxFd = listen
10420 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  er[i];.    }.   
10430 20 73 65 6c 65 63 74 28 20 6d 61 78 46 64 2b 31   select( maxFd+1
10440 2c 20 26 72 65 61 64 66 64 73 2c 20 30 2c 20 30  , &readfds, 0, 0
10450 2c 20 26 64 65 6c 61 79 29 3b 0a 20 20 20 20 66  , &delay);.    f
10460 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
10470 29 7b 0a 20 20 20 20 20 20 69 66 28 20 46 44 5f  ){.      if( FD_
10480 49 53 53 45 54 28 6c 69 73 74 65 6e 65 72 5b 69  ISSET(listener[i
10490 5d 2c 20 26 72 65 61 64 66 64 73 29 20 29 7b 0a  ], &readfds) ){.
104a0 20 20 20 20 20 20 20 20 6c 65 6e 61 64 64 72 20          lenaddr 
104b0 3d 20 73 69 7a 65 6f 66 28 69 6e 61 64 64 72 29  = sizeof(inaddr)
104c0 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63  ;.        connec
104d0 74 69 6f 6e 20 3d 20 61 63 63 65 70 74 28 6c 69  tion = accept(li
104e0 73 74 65 6e 65 72 5b 69 5d 2c 20 26 69 6e 61 64  stener[i], &inad
104f0 64 72 2e 73 61 2c 20 26 6c 65 6e 61 64 64 72 29  dr.sa, &lenaddr)
10500 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  ;.        if( co
10510 6e 6e 65 63 74 69 6f 6e 3e 3d 30 20 29 7b 0a 20  nnection>=0 ){. 
10520 20 20 20 20 20 20 20 20 20 63 68 69 6c 64 20 3d           child =
10530 20 66 6f 72 6b 28 29 3b 0a 20 20 20 20 20 20 20   fork();.       
10540 20 20 20 69 66 28 20 63 68 69 6c 64 21 3d 30 20     if( child!=0 
10550 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
10560 66 28 20 63 68 69 6c 64 3e 30 20 29 20 6e 63 68  f( child>0 ) nch
10570 69 6c 64 72 65 6e 2b 2b 3b 0a 20 20 20 20 20 20  ildren++;.      
10580 20 20 20 20 20 20 63 6c 6f 73 65 28 63 6f 6e 6e        close(conn
10590 65 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20  ection);.       
105a0 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 66 28 22       /* printf("
105b0 73 75 62 70 72 6f 63 65 73 73 20 25 64 20 73 74  subprocess %d st
105c0 61 72 74 65 64 2e 2e 2e 5c 6e 22 2c 20 63 68 69  arted...\n", chi
105d0 6c 64 29 3b 20 66 66 6c 75 73 68 28 73 74 64 6f  ld); fflush(stdo
105e0 75 74 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20  ut); */.        
105f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10600 20 20 20 20 20 69 6e 74 20 6e 45 72 72 20 3d 20       int nErr = 
10610 30 2c 20 66 64 3b 0a 20 20 20 20 20 20 20 20 20  0, fd;.         
10620 20 20 20 63 6c 6f 73 65 28 30 29 3b 0a 20 20 20     close(0);.   
10630 20 20 20 20 20 20 20 20 20 66 64 20 3d 20 64 75           fd = du
10640 70 28 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20  p(connection);. 
10650 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66             if( f
10660 64 21 3d 30 20 29 20 6e 45 72 72 2b 2b 3b 0a 20  d!=0 ) nErr++;. 
10670 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
10680 28 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (1);.           
10690 20 66 64 20 3d 20 64 75 70 28 63 6f 6e 6e 65 63   fd = dup(connec
106a0 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  tion);.         
106b0 20 20 20 69 66 28 20 66 64 21 3d 31 20 29 20 6e     if( fd!=1 ) n
106c0 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Err++;.         
106d0 20 20 20 63 6c 6f 73 65 28 63 6f 6e 6e 65 63 74     close(connect
106e0 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ion);.          
106f0 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 20    return nErr;. 
10700 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
10710 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
10720 20 20 20 2f 2a 20 42 75 72 79 20 64 65 61 64 20     /* Bury dead 
10730 63 68 69 6c 64 72 65 6e 20 2a 2f 0a 20 20 20 20  children */.    
10740 20 20 77 68 69 6c 65 28 20 28 63 68 69 6c 64 20    while( (child 
10750 3d 20 77 61 69 74 70 69 64 28 30 2c 20 30 2c 20  = waitpid(0, 0, 
10760 57 4e 4f 48 41 4e 47 29 29 3e 30 20 29 7b 0a 20  WNOHANG))>0 ){. 
10770 20 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 66         /* printf
10780 28 22 70 72 6f 63 65 73 73 20 25 64 20 65 6e 64  ("process %d end
10790 73 5c 6e 22 2c 20 63 68 69 6c 64 29 3b 20 66 66  s\n", child); ff
107a0 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 20 2a 2f  lush(stdout); */
107b0 0a 20 20 20 20 20 20 20 20 6e 63 68 69 6c 64 72  .        nchildr
107c0 65 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  en--;.      }.  
107d0 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4e 4f 54    }.  }.  /* NOT
107e0 20 52 45 41 43 48 45 44 20 2a 2f 20 20 0a 20 20   REACHED */  .  
107f0 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 0a 69 6e 74  exit(1);.}...int
10800 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20   main(int argc, 
10810 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20  char **argv){.  
10820 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
10830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
10840 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 63  p counter */.  c
10850 68 61 72 20 2a 7a 50 65 72 6d 55 73 65 72 20 3d  har *zPermUser =
10860 20 30 3b 20 20 20 20 20 20 2f 2a 20 52 75 6e 20   0;      /* Run 
10870 64 61 65 6d 6f 6e 20 77 69 74 68 20 74 68 69 73  daemon with this
10880 20 75 73 65 72 27 73 20 70 65 72 6d 69 73 73 69   user's permissi
10890 6f 6e 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ons */.  const c
108a0 68 61 72 20 2a 7a 50 6f 72 74 20 3d 20 30 3b 20  har *zPort = 0; 
108b0 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20     /* Implement 
108c0 61 6e 20 48 54 54 50 20 73 65 72 76 65 72 20 70  an HTTP server p
108d0 72 6f 63 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20  rocess */.  int 
108e0 75 73 65 43 68 72 6f 6f 74 4a 61 69 6c 20 3d 20  useChrootJail = 
108f0 31 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f  1;    /* True to
10900 20 75 73 65 20 61 20 63 68 61 6e 67 65 2d 72 6f   use a change-ro
10910 6f 74 20 6a 61 69 6c 20 2a 2f 0a 20 20 73 74 72  ot jail */.  str
10920 75 63 74 20 70 61 73 73 77 64 20 2a 70 77 64 20  uct passwd *pwd 
10930 3d 20 30 3b 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  = 0;   /* Inform
10940 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
10950 75 73 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65  user */..  /* Re
10960 63 6f 72 64 20 74 68 65 20 74 69 6d 65 20 77 68  cord the time wh
10970 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 65  en processing be
10980 67 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 67 65 74  gins..  */.  get
10990 74 69 6d 65 6f 66 64 61 79 28 26 62 65 67 69 6e  timeofday(&begin
109a0 54 69 6d 65 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  Time, 0);..  /* 
109b0 50 61 72 73 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69  Parse command-li
109c0 6e 65 20 61 72 67 75 6d 65 6e 74 73 0a 20 20 2a  ne arguments.  *
109d0 2f 0a 20 20 77 68 69 6c 65 28 20 61 72 67 63 3e  /.  while( argc>
109e0 31 20 26 26 20 61 72 67 76 5b 31 5d 5b 30 5d 3d  1 && argv[1][0]=
109f0 3d 27 2d 27 20 29 7b 0a 20 20 20 20 63 68 61 72  ='-' ){.    char
10a00 20 2a 7a 20 3d 20 61 72 67 76 5b 31 5d 3b 0a 20   *z = argv[1];. 
10a10 20 20 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20     char *zArg = 
10a20 61 72 67 63 3e 3d 33 20 3f 20 61 72 67 76 5b 32  argc>=3 ? argv[2
10a30 5d 20 3a 20 22 30 22 3b 0a 20 20 20 20 69 66 28  ] : "0";.    if(
10a40 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b   z[0]=='-' && z[
10a50 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20  1]=='-' ) z++;. 
10a60 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
10a70 22 2d 75 73 65 72 22 29 3d 3d 30 20 29 7b 0a 20  "-user")==0 ){. 
10a80 20 20 20 20 20 7a 50 65 72 6d 55 73 65 72 20 3d       zPermUser =
10a90 20 7a 41 72 67 3b 0a 20 20 20 20 7d 65 6c 73 65   zArg;.    }else
10aa0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
10ab0 72 6f 6f 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  root")==0 ){.   
10ac0 20 20 20 7a 52 6f 6f 74 20 3d 20 7a 41 72 67 3b     zRoot = zArg;
10ad0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
10ae0 74 72 63 6d 70 28 7a 2c 22 2d 6c 6f 67 66 69 6c  trcmp(z,"-logfil
10af0 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
10b00 7a 4c 6f 67 46 69 6c 65 20 3d 20 7a 41 72 67 3b  zLogFile = zArg;
10b10 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
10b20 74 72 63 6d 70 28 7a 2c 22 2d 68 74 74 70 73 22  trcmp(z,"-https"
10b30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 73  )==0 ){.      us
10b40 65 48 74 74 70 73 20 3d 20 61 74 6f 69 28 7a 41  eHttps = atoi(zA
10b50 72 67 29 3b 0a 20 20 20 20 20 20 7a 48 74 74 70  rg);.      zHttp
10b60 20 3d 20 75 73 65 48 74 74 70 73 20 3f 20 22 68   = useHttps ? "h
10b70 74 74 70 73 22 20 3a 20 22 68 74 74 70 22 3b 0a  ttps" : "http";.
10b80 20 20 20 20 20 20 69 66 28 20 75 73 65 48 74 74        if( useHtt
10b90 70 73 20 29 20 7a 52 65 6d 6f 74 65 41 64 64 72  ps ) zRemoteAddr
10ba0 20 3d 20 67 65 74 65 6e 76 28 22 52 45 4d 4f 54   = getenv("REMOT
10bb0 45 5f 48 4f 53 54 22 29 3b 0a 20 20 20 20 7d 65  E_HOST");.    }e
10bc0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
10bd0 2c 20 22 2d 70 6f 72 74 22 29 3d 3d 30 20 29 7b  , "-port")==0 ){
10be0 0a 20 20 20 20 20 20 7a 50 6f 72 74 20 3d 20 7a  .      zPort = z
10bf0 41 72 67 3b 0a 20 20 20 20 20 20 73 74 61 6e 64  Arg;.      stand
10c00 61 6c 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d  alone = 1;.    }
10c10 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
10c20 7a 2c 20 22 2d 66 61 6d 69 6c 79 22 29 3d 3d 30  z, "-family")==0
10c30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74   ){.      if( st
10c40 72 63 6d 70 28 7a 41 72 67 2c 20 22 69 70 76 34  rcmp(zArg, "ipv4
10c50 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
10c60 20 69 70 76 34 4f 6e 6c 79 20 3d 20 31 3b 0a 20   ipv4Only = 1;. 
10c70 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
10c80 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 69 70 76  trcmp(zArg, "ipv
10c90 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  6")==0 ){.      
10ca0 20 20 69 70 76 36 4f 6e 6c 79 20 3d 20 31 3b 0a    ipv6Only = 1;.
10cb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10cc0 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e       Malfunction
10cd0 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 20 2f 2a 20 4c  (__LINE__,  /* L
10ce0 4f 47 3a 20 75 6e 6b 6e 6f 77 6e 20 49 50 20 70  OG: unknown IP p
10cf0 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20 20  rotocol */.     
10d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
10d10 75 6e 6b 6e 6f 77 6e 20 49 50 20 70 72 6f 74 6f  unknown IP proto
10d20 63 6f 6c 3a 20 5b 25 73 5d 22 2c 20 7a 41 72 67  col: [%s]", zArg
10d30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
10d40 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
10d50 7a 2c 20 22 2d 6a 61 69 6c 22 29 3d 3d 30 20 29  z, "-jail")==0 )
10d60 7b 0a 20 20 20 20 20 20 69 66 28 20 61 74 6f 69  {.      if( atoi
10d70 28 7a 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20  (zArg)==0 ){.   
10d80 20 20 20 20 20 75 73 65 43 68 72 6f 6f 74 4a 61       useChrootJa
10d90 69 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  il = 0;.      }.
10da0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
10db0 72 63 6d 70 28 7a 2c 20 22 2d 64 65 62 75 67 22  rcmp(z, "-debug"
10dc0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
10dd0 28 20 61 74 6f 69 28 7a 41 72 67 29 20 29 7b 0a  ( atoi(zArg) ){.
10de0 20 20 20 20 20 20 20 20 75 73 65 54 69 6d 65 6f          useTimeo
10df0 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ut = 0;.      }.
10e00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10e10 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c   Malfunction(__L
10e20 49 4e 45 5f 5f 2c 20 2f 2a 20 4c 4f 47 3a 20 75  INE__, /* LOG: u
10e30 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64 2d 6c  nknown command-l
10e40 69 6e 65 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20  ine argument on 
10e50 6c 61 75 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20  launch */.      
10e60 20 20 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b              "unk
10e70 6e 6f 77 6e 20 61 72 67 75 6d 65 6e 74 3a 20 5b  nown argument: [
10e80 25 73 5d 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a  %s]", z);.    }.
10e90 20 20 20 20 61 72 67 76 20 2b 3d 20 32 3b 0a 20      argv += 2;. 
10ea0 20 20 20 61 72 67 63 20 2d 3d 20 32 3b 0a 20 20     argc -= 2;.  
10eb0 7d 0a 20 20 69 66 28 20 7a 52 6f 6f 74 3d 3d 30  }.  if( zRoot==0
10ec0 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61 6e   ){.    if( stan
10ed0 64 61 6c 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20  dalone ){.      
10ee0 7a 52 6f 6f 74 20 3d 20 22 2e 22 3b 0a 20 20 20  zRoot = ".";.   
10ef0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d 61   }else{.      Ma
10f00 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45  lfunction(__LINE
10f10 5f 5f 2c 20 2f 2a 20 4c 4f 47 3a 20 2d 2d 72 6f  __, /* LOG: --ro
10f20 6f 74 20 61 72 67 75 6d 65 6e 74 20 6d 69 73 73  ot argument miss
10f30 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ing */.         
10f40 20 20 20 20 20 20 20 20 20 22 6e 6f 20 2d 2d 72           "no --r
10f50 6f 6f 74 20 73 70 65 63 69 66 69 65 64 22 29 3b  oot specified");
10f60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
10f70 2f 2a 20 43 68 61 6e 67 65 20 64 69 72 65 63 74  /* Change direct
10f80 6f 72 69 65 73 20 74 6f 20 74 68 65 20 72 6f 6f  ories to the roo
10f90 74 20 6f 66 20 74 68 65 20 48 54 54 50 20 66 69  t of the HTTP fi
10fa0 6c 65 73 79 73 74 65 6d 2e 20 20 54 68 65 6e 0a  lesystem.  Then.
10fb0 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20 63 68    ** create a ch
10fc0 72 6f 6f 74 20 6a 61 69 6c 20 74 68 65 72 65 2e  root jail there.
10fd0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 64 69  .  */.  if( chdi
10fe0 72 28 7a 52 6f 6f 74 29 21 3d 30 20 29 7b 0a 20  r(zRoot)!=0 ){. 
10ff0 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f     Malfunction(_
11000 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a 20 4c 4f 47 3a  _LINE__, /* LOG:
11010 20 63 68 64 69 72 28 29 20 66 61 69 6c 65 64 20   chdir() failed 
11020 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
11030 20 20 20 22 63 61 6e 6e 6f 74 20 63 68 61 6e 67     "cannot chang
11040 65 20 74 6f 20 64 69 72 65 63 74 6f 72 79 20 5b  e to directory [
11050 25 73 5d 22 2c 20 7a 52 6f 6f 74 29 3b 0a 20 20  %s]", zRoot);.  
11060 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 69 6e 66 6f  }..  /* Get info
11070 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
11080 65 20 75 73 65 72 20 69 66 20 61 76 61 69 6c 61  e user if availa
11090 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 7a 50 65  ble */.  if( zPe
110a0 72 6d 55 73 65 72 20 29 20 70 77 64 20 3d 20 67  rmUser ) pwd = g
110b0 65 74 70 77 6e 61 6d 28 7a 50 65 72 6d 55 73 65  etpwnam(zPermUse
110c0 72 29 3b 0a 0a 20 20 2f 2a 20 45 6e 74 65 72 20  r);..  /* Enter 
110d0 74 68 65 20 63 68 72 6f 6f 74 20 6a 61 69 6c 20  the chroot jail 
110e0 69 66 20 72 65 71 75 65 73 74 65 64 20 2a 2f 20  if requested */ 
110f0 20 0a 20 20 69 66 28 20 7a 50 65 72 6d 55 73 65   .  if( zPermUse
11100 72 20 26 26 20 75 73 65 43 68 72 6f 6f 74 4a 61  r && useChrootJa
11110 69 6c 20 26 26 20 67 65 74 75 69 64 28 29 3d 3d  il && getuid()==
11120 30 20 29 7b 0a 20 20 20 20 69 66 28 20 63 68 72  0 ){.    if( chr
11130 6f 6f 74 28 22 2e 22 29 3c 30 20 29 7b 0a 20 20  oot(".")<0 ){.  
11140 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28      Malfunction(
11150 5f 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a 20 4c 4f 47  __LINE__, /* LOG
11160 3a 20 63 68 72 6f 6f 74 28 29 20 66 61 69 6c 65  : chroot() faile
11170 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  d */.           
11180 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74         "unable t
11190 6f 20 63 72 65 61 74 65 20 63 68 72 6f 6f 74 20  o create chroot 
111a0 6a 61 69 6c 22 29 3b 0a 20 20 20 20 7d 65 6c 73  jail");.    }els
111b0 65 7b 0a 20 20 20 20 20 20 7a 52 6f 6f 74 20 3d  e{.      zRoot =
111c0 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   "";.    }.  }..
111d0 20 20 2f 2a 20 41 63 74 69 76 61 74 65 20 74 68    /* Activate th
111e0 65 20 73 65 72 76 65 72 2c 20 69 66 20 72 65 71  e server, if req
111f0 75 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  uested */.  if( 
11200 7a 50 6f 72 74 20 26 26 20 68 74 74 70 5f 73 65  zPort && http_se
11210 72 76 65 72 28 7a 50 6f 72 74 2c 20 30 29 20 29  rver(zPort, 0) )
11220 7b 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f  {.    Malfunctio
11230 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a 20 4c  n(__LINE__, /* L
11240 4f 47 3a 20 73 65 72 76 65 72 20 73 74 61 72 74  OG: server start
11250 75 70 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  up failed */.   
11260 20 20 20 20 20 20 20 20 20 20 20 20 20 22 66 61               "fa
11270 69 6c 65 64 20 74 6f 20 73 74 61 72 74 20 73 65  iled to start se
11280 72 76 65 72 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rver");.  }..  /
11290 2a 20 44 72 6f 70 20 72 6f 6f 74 20 70 72 69 76  * Drop root priv
112a0 69 6c 65 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  ileges..  */.  i
112b0 66 28 20 7a 50 65 72 6d 55 73 65 72 20 29 7b 0a  f( zPermUser ){.
112c0 20 20 20 20 69 66 28 20 70 77 64 20 29 7b 0a 20      if( pwd ){. 
112d0 20 20 20 20 20 69 66 28 20 73 65 74 67 69 64 28       if( setgid(
112e0 70 77 64 2d 3e 70 77 5f 67 69 64 29 20 29 7b 0a  pwd->pw_gid) ){.
112f0 20 20 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74          Malfunct
11300 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a  ion(__LINE__, /*
11310 20 4c 4f 47 3a 20 73 65 74 67 69 64 28 29 20 66   LOG: setgid() f
11320 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  ailed */.       
11330 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 61               "ca
11340 6e 6e 6f 74 20 73 65 74 20 67 72 6f 75 70 2d 69  nnot set group-i
11350 64 20 74 6f 20 25 64 22 2c 20 70 77 64 2d 3e 70  d to %d", pwd->p
11360 77 5f 67 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a  w_gid);.      }.
11370 20 20 20 20 20 20 69 66 28 20 73 65 74 75 69 64        if( setuid
11380 28 70 77 64 2d 3e 70 77 5f 75 69 64 29 20 29 7b  (pwd->pw_uid) ){
11390 0a 20 20 20 20 20 20 20 20 4d 61 6c 66 75 6e 63  .        Malfunc
113a0 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 2f  tion(__LINE__, /
113b0 2a 20 4c 4f 47 3a 20 73 65 74 75 69 64 28 29 20  * LOG: setuid() 
113c0 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
113d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
113e0 61 6e 6e 6f 74 20 73 65 74 20 75 73 65 72 2d 69  annot set user-i
113f0 64 20 74 6f 20 25 64 22 2c 20 70 77 64 2d 3e 70  d to %d", pwd->p
11400 77 5f 75 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a  w_uid);.      }.
11410 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11420 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c   Malfunction(__L
11430 49 4e 45 5f 5f 2c 20 2f 2a 20 4c 4f 47 3a 20 75  INE__, /* LOG: u
11440 6e 6b 6e 6f 77 6e 20 75 73 65 72 20 2a 2f 0a 20  nknown user */. 
11450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11460 20 22 6e 6f 20 73 75 63 68 20 75 73 65 72 20 5b   "no such user [
11470 25 73 5d 22 2c 20 7a 50 65 72 6d 55 73 65 72 29  %s]", zPermUser)
11480 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
11490 28 20 67 65 74 75 69 64 28 29 3d 3d 30 20 29 7b  ( getuid()==0 ){
114a0 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e  .    Malfunction
114b0 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a 20 4c 4f  (__LINE__, /* LO
114c0 47 3a 20 63 61 6e 6e 6f 74 20 72 75 6e 20 61 73  G: cannot run as
114d0 20 72 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20   root */.       
114e0 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74           "cannot
114f0 20 72 75 6e 20 61 73 20 72 6f 6f 74 22 29 3b 0a   run as root");.
11500 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68    }..  /* Get th
11510 65 20 49 50 20 61 64 64 72 65 73 73 20 66 72 6f  e IP address fro
11520 6d 20 77 68 65 6e 63 65 20 74 68 65 20 72 65 71  m whence the req
11530 75 65 73 74 20 6f 72 69 67 69 6e 61 74 65 73 0a  uest originates.
11540 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6d 6f    */.  if( zRemo
11550 74 65 41 64 64 72 3d 3d 30 20 29 7b 0a 20 20 20  teAddr==0 ){.   
11560 20 61 64 64 72 65 73 73 20 72 65 6d 6f 74 65 41   address remoteA
11570 64 64 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  ddr;.    unsigne
11580 64 20 69 6e 74 20 73 69 7a 65 20 3d 20 73 69 7a  d int size = siz
11590 65 6f 66 28 72 65 6d 6f 74 65 41 64 64 72 29 3b  eof(remoteAddr);
115a0 0a 20 20 20 20 63 68 61 72 20 7a 48 6f 73 74 5b  .    char zHost[
115b0 4e 49 5f 4d 41 58 48 4f 53 54 5d 3b 0a 20 20 20  NI_MAXHOST];.   
115c0 20 69 66 28 20 67 65 74 70 65 65 72 6e 61 6d 65   if( getpeername
115d0 28 30 2c 20 26 72 65 6d 6f 74 65 41 64 64 72 2e  (0, &remoteAddr.
115e0 73 61 2c 20 26 73 69 7a 65 29 3e 3d 30 20 29 7b  sa, &size)>=0 ){
115f0 0a 20 20 20 20 20 20 67 65 74 6e 61 6d 65 69 6e  .      getnamein
11600 66 6f 28 26 72 65 6d 6f 74 65 41 64 64 72 2e 73  fo(&remoteAddr.s
11610 61 2c 20 73 69 7a 65 2c 20 7a 48 6f 73 74 2c 20  a, size, zHost, 
11620 73 69 7a 65 6f 66 28 7a 48 6f 73 74 29 2c 20 30  sizeof(zHost), 0
11630 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
11640 20 20 20 20 20 20 20 4e 49 5f 4e 55 4d 45 52 49         NI_NUMERI
11650 43 48 4f 53 54 29 3b 0a 20 20 20 20 20 20 7a 52  CHOST);.      zR
11660 65 6d 6f 74 65 41 64 64 72 20 3d 20 53 74 72 44  emoteAddr = StrD
11670 75 70 28 7a 48 6f 73 74 29 3b 0a 20 20 20 20 7d  up(zHost);.    }
11680 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
11690 73 73 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  ss the input str
116a0 65 61 6d 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  eam */.  for(i=0
116b0 3b 20 69 3c 31 30 30 3b 20 69 2b 2b 29 7b 0a 20  ; i<100; i++){. 
116c0 20 20 20 50 72 6f 63 65 73 73 4f 6e 65 52 65 71     ProcessOneReq
116d0 75 65 73 74 28 30 29 3b 0a 20 20 7d 0a 20 20 50  uest(0);.  }.  P
116e0 72 6f 63 65 73 73 4f 6e 65 52 65 71 75 65 73 74  rocessOneRequest
116f0 28 31 29 3b 0a 20 20 65 78 69 74 28 30 29 3b 0a  (1);.  exit(0);.
11700 7d 0a                                            }.