Documentation Source Text
Hex Artifact Content
Not logged in

Artifact b58d6df2d895d7c236b3441e2fdae5e2ef75b47587f810cb8d66c48dc38facf0:


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: 25 62 20 25 59 20 25 48 3a 25 4d 3a 25 53 20 25  %b %Y %H:%M:%S %
4580: 7a 22 2c 20 74 6d 29 3b 0a 20 20 72 65 74 75 72  z", tm);.  retur
4590: 6e 20 70 72 69 6e 74 66 28 22 25 73 3a 20 25 73  n printf("%s: %s
45a0: 5c 72 5c 6e 22 2c 20 7a 54 61 67 2c 20 7a 44 61  \r\n", zTag, zDa
45b0: 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  te);.}../*.** Pr
45c0: 69 6e 74 20 74 68 65 20 66 69 72 73 74 20 6c 69  int the first li
45d0: 6e 65 20 6f 66 20 61 20 72 65 73 70 6f 6e 73 65  ne of a response
45e0: 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68 65   followed by the
45f0: 20 73 65 72 76 65 72 20 74 79 70 65 2e 0a 2a 2f   server type..*/
4600: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 74 61  .static void Sta
4610: 72 74 52 65 73 70 6f 6e 73 65 28 63 6f 6e 73 74  rtResponse(const
4620: 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 43 6f   char *zResultCo
4630: 64 65 29 7b 0a 20 20 74 69 6d 65 5f 74 20 6e 6f  de){.  time_t no
4640: 77 3b 0a 20 20 74 69 6d 65 28 26 6e 6f 77 29 3b  w;.  time(&now);
4650: 0a 20 20 69 66 28 20 73 74 61 74 75 73 53 65 6e  .  if( statusSen
4660: 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e 4f  t ) return;.  nO
4670: 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 25 73  ut += printf("%s
4680: 20 25 73 5c 72 5c 6e 22 2c 20 7a 50 72 6f 74 6f   %s\r\n", zProto
4690: 63 6f 6c 2c 20 7a 52 65 73 75 6c 74 43 6f 64 65  col, zResultCode
46a0: 29 3b 0a 20 20 73 74 72 6e 63 70 79 28 7a 52 65  );.  strncpy(zRe
46b0: 70 6c 79 53 74 61 74 75 73 2c 20 7a 52 65 73 75  plyStatus, zResu
46c0: 6c 74 43 6f 64 65 2c 20 33 29 3b 0a 20 20 7a 52  ltCode, 3);.  zR
46d0: 65 70 6c 79 53 74 61 74 75 73 5b 33 5d 20 3d 20  eplyStatus[3] = 
46e0: 30 3b 0a 20 20 69 66 28 20 7a 52 65 70 6c 79 53  0;.  if( zReplyS
46f0: 74 61 74 75 73 5b 30 5d 3e 3d 27 34 27 20 29 7b  tatus[0]>='4' ){
4700: 0a 20 20 20 20 63 6c 6f 73 65 43 6f 6e 6e 65 63  .    closeConnec
4710: 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  tion = 1;.  }.  
4720: 69 66 28 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74  if( closeConnect
4730: 69 6f 6e 20 29 7b 0a 20 20 20 20 6e 4f 75 74 20  ion ){.    nOut 
4740: 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 6e 65  += printf("Conne
4750: 63 74 69 6f 6e 3a 20 63 6c 6f 73 65 5c 72 5c 6e  ction: close\r\n
4760: 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
4770: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
4780: 22 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 6b 65 65  "Connection: kee
4790: 70 2d 61 6c 69 76 65 5c 72 5c 6e 22 29 3b 0a 20  p-alive\r\n");. 
47a0: 20 7d 0a 20 20 6e 4f 75 74 20 2b 3d 20 44 61 74   }.  nOut += Dat
47b0: 65 54 61 67 28 22 44 61 74 65 22 2c 20 6e 6f 77  eTag("Date", now
47c0: 29 3b 0a 20 20 73 74 61 74 75 73 53 65 6e 74 20  );.  statusSent 
47d0: 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65  = 1;.}../*.** Te
47e0: 6c 6c 20 74 68 65 20 63 6c 69 65 6e 74 20 74 68  ll the client th
47f0: 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  at there is no s
4800: 75 63 68 20 64 6f 63 75 6d 65 6e 74 0a 2a 2f 0a  uch document.*/.
4810: 73 74 61 74 69 63 20 76 6f 69 64 20 4e 6f 74 46  static void NotF
4820: 6f 75 6e 64 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  ound(int lineno)
4830: 7b 0a 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73  {.  StartRespons
4840: 65 28 22 34 30 34 20 4e 6f 74 20 46 6f 75 6e 64  e("404 Not Found
4850: 22 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72  ");.  nOut += pr
4860: 69 6e 74 66 28 0a 20 20 20 20 22 43 6f 6e 74 65  intf(.    "Conte
4870: 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 68 74  nt-type: text/ht
4880: 6d 6c 5c 72 5c 6e 22 0a 20 20 20 20 22 5c 72 5c  ml\r\n".    "\r\
4890: 6e 22 0a 20 20 20 20 22 3c 68 65 61 64 3e 3c 74  n".    "<head><t
48a0: 69 74 6c 65 20 6c 69 6e 65 6e 6f 3d 5c 22 25 64  itle lineno=\"%d
48b0: 5c 22 3e 4e 6f 74 20 46 6f 75 6e 64 3c 2f 74 69  \">Not Found</ti
48c0: 74 6c 65 3e 3c 2f 68 65 61 64 3e 5c 6e 22 0a 20  tle></head>\n". 
48d0: 20 20 20 22 3c 62 6f 64 79 3e 3c 68 31 3e 44 6f     "<body><h1>Do
48e0: 63 75 6d 65 6e 74 20 4e 6f 74 20 46 6f 75 6e 64  cument Not Found
48f0: 3c 2f 68 31 3e 5c 6e 22 0a 20 20 20 20 22 54 68  </h1>\n".    "Th
4900: 65 20 64 6f 63 75 6d 65 6e 74 20 25 73 20 69 73  e document %s is
4910: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 6f   not available o
4920: 6e 20 74 68 69 73 20 73 65 72 76 65 72 5c 6e 22  n this server\n"
4930: 0a 20 20 20 20 22 3c 2f 62 6f 64 79 3e 5c 6e 22  .    "</body>\n"
4940: 2c 20 6c 69 6e 65 6e 6f 2c 20 7a 53 63 72 69 70  , lineno, zScrip
4950: 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74  t);.  MakeLogEnt
4960: 72 79 28 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20  ry(0, lineno);. 
4970: 20 65 78 69 74 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a   exit(0);.}../*.
4980: 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c 69 65  ** Tell the clie
4990: 6e 74 20 74 68 61 74 20 74 68 65 79 20 61 72 65  nt that they are
49a0: 20 6e 6f 74 20 77 65 6c 63 6f 6d 65 64 20 68 65   not welcomed he
49b0: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  re..*/.static vo
49c0: 69 64 20 46 6f 72 62 69 64 64 65 6e 28 69 6e 74  id Forbidden(int
49d0: 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 53 74 61 72   lineno){.  Star
49e0: 74 52 65 73 70 6f 6e 73 65 28 22 34 30 33 20 46  tResponse("403 F
49f0: 6f 72 62 69 64 64 65 6e 22 29 3b 0a 20 20 6e 4f  orbidden");.  nO
4a00: 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20  ut += printf(.  
4a10: 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a    "Content-type:
4a20: 20 74 65 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22   text/plain\r\n"
4a30: 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20  .    "\r\n".    
4a40: 22 41 63 63 65 73 73 20 64 65 6e 69 65 64 5c 6e  "Access denied\n
4a50: 22 0a 20 20 29 3b 0a 20 20 63 6c 6f 73 65 43 6f  ".  );.  closeCo
4a60: 6e 6e 65 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20  nnection = 1;.  
4a70: 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20  MakeLogEntry(0, 
4a80: 6c 69 6e 65 6e 6f 29 3b 0a 20 20 65 78 69 74 28  lineno);.  exit(
4a90: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c  0);.}../*.** Tel
4aa0: 6c 20 74 68 65 20 63 6c 69 65 6e 74 20 74 68 61  l the client tha
4ab0: 74 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  t authorization 
4ac0: 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 61  is required to a
4ad0: 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 64 6f 63  ccess the.** doc
4ae0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
4af0: 20 76 6f 69 64 20 4e 6f 74 41 75 74 68 6f 72 69   void NotAuthori
4b00: 7a 65 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  zed(const char *
4b10: 7a 52 65 61 6c 6d 29 7b 0a 20 20 53 74 61 72 74  zRealm){.  Start
4b20: 52 65 73 70 6f 6e 73 65 28 22 34 30 31 20 41 75  Response("401 Au
4b30: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 52 65 71 75  thorization Requ
4b40: 69 72 65 64 22 29 3b 0a 20 20 6e 4f 75 74 20 2b  ired");.  nOut +
4b50: 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20 22 57  = printf(.    "W
4b60: 57 57 2d 41 75 74 68 65 6e 74 69 63 61 74 65 3a  WW-Authenticate:
4b70: 20 42 61 73 69 63 20 72 65 61 6c 6d 3d 5c 22 25   Basic realm=\"%
4b80: 73 5c 22 5c 72 5c 6e 22 0a 20 20 20 20 22 43 6f  s\"\r\n".    "Co
4b90: 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74  ntent-type: text
4ba0: 2f 68 74 6d 6c 5c 72 5c 6e 22 0a 20 20 20 20 22  /html\r\n".    "
4bb0: 5c 72 5c 6e 22 0a 20 20 20 20 22 3c 68 65 61 64  \r\n".    "<head
4bc0: 3e 3c 74 69 74 6c 65 3e 4e 6f 74 20 41 75 74 68  ><title>Not Auth
4bd0: 6f 72 69 7a 65 64 3c 2f 74 69 74 6c 65 3e 3c 2f  orized</title></
4be0: 68 65 61 64 3e 5c 6e 22 0a 20 20 20 20 22 3c 62  head>\n".    "<b
4bf0: 6f 64 79 3e 3c 68 31 3e 34 30 31 20 4e 6f 74 20  ody><h1>401 Not 
4c00: 41 75 74 68 6f 72 69 7a 65 64 3c 2f 68 31 3e 5c  Authorized</h1>\
4c10: 6e 22 0a 20 20 20 20 22 41 20 6c 6f 67 69 6e 20  n".    "A login 
4c20: 61 6e 64 20 70 61 73 73 77 6f 72 64 20 61 72 65  and password are
4c30: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68   required for th
4c40: 69 73 20 64 6f 63 75 6d 65 6e 74 5c 6e 22 0a 20  is document\n". 
4c50: 20 20 20 22 3c 2f 62 6f 64 79 3e 5c 6e 22 2c 20     "</body>\n", 
4c60: 7a 52 65 61 6c 6d 29 3b 0a 20 20 4d 61 6b 65 4c  zRealm);.  MakeL
4c70: 6f 67 45 6e 74 72 79 28 30 2c 20 5f 5f 4c 49 4e  ogEntry(0, __LIN
4c80: 45 5f 5f 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 4e  E__);  /* LOG: N
4c90: 6f 74 20 61 75 74 68 6f 72 69 7a 65 64 20 2a 2f  ot authorized */
4ca0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74  .}../*.** Tell t
4cb0: 68 65 20 63 6c 69 65 6e 74 20 74 68 61 74 20 74  he client that t
4cc0: 68 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72  here is an error
4cd0: 20 69 6e 20 74 68 65 20 73 63 72 69 70 74 2e 0a   in the script..
4ce0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43  */.static void C
4cf0: 67 69 45 72 72 6f 72 28 76 6f 69 64 29 7b 0a 20  giError(void){. 
4d00: 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22   StartResponse("
4d10: 35 30 30 20 45 72 72 6f 72 22 29 3b 0a 20 20 6e  500 Error");.  n
4d20: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20  Out += printf(. 
4d30: 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65     "Content-type
4d40: 3a 20 74 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e 22  : text/html\r\n"
4d50: 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20  .    "\r\n".    
4d60: 22 3c 68 65 61 64 3e 3c 74 69 74 6c 65 3e 43 47  "<head><title>CG
4d70: 49 20 50 72 6f 67 72 61 6d 20 45 72 72 6f 72 3c  I Program Error<
4d80: 2f 74 69 74 6c 65 3e 3c 2f 68 65 61 64 3e 5c 6e  /title></head>\n
4d90: 22 0a 20 20 20 20 22 3c 62 6f 64 79 3e 3c 68 31  ".    "<body><h1
4da0: 3e 43 47 49 20 50 72 6f 67 72 61 6d 20 45 72 72  >CGI Program Err
4db0: 6f 72 3c 2f 68 31 3e 5c 6e 22 0a 20 20 20 20 22  or</h1>\n".    "
4dc0: 54 68 65 20 43 47 49 20 70 72 6f 67 72 61 6d 20  The CGI program 
4dd0: 25 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e 20  %s generated an 
4de0: 65 72 72 6f 72 5c 6e 22 0a 20 20 20 20 22 3c 2f  error\n".    "</
4df0: 62 6f 64 79 3e 5c 6e 22 2c 20 7a 53 63 72 69 70  body>\n", zScrip
4e00: 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74  t);.  MakeLogEnt
4e10: 72 79 28 30 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  ry(0, __LINE__);
4e20: 20 20 2f 2a 20 4c 4f 47 3a 20 43 47 49 20 45 72    /* LOG: CGI Er
4e30: 72 6f 72 20 2a 2f 0a 20 20 65 78 69 74 28 30 29  ror */.  exit(0)
4e40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
4e50: 69 73 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20  is called if we 
4e60: 74 69 6d 65 6f 75 74 20 6f 72 20 63 61 74 63 68  timeout or catch
4e70: 20 73 6f 6d 65 20 6f 74 68 65 72 20 6b 69 6e 64   some other kind
4e80: 20 6f 66 20 73 69 67 6e 61 6c 2e 0a 2a 2a 20 4c   of signal..** L
4e90: 6f 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  og an error code
4ea0: 20 77 68 69 63 68 20 69 73 20 39 30 30 2b 69 53   which is 900+iS
4eb0: 69 67 20 61 6e 64 20 74 68 65 6e 20 71 75 69 74  ig and then quit
4ec0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4ed0: 20 54 69 6d 65 6f 75 74 28 69 6e 74 20 69 53 69   Timeout(int iSi
4ee0: 67 29 7b 0a 20 20 69 66 28 20 21 64 65 62 75 67  g){.  if( !debug
4ef0: 46 6c 61 67 20 29 7b 0a 20 20 20 20 69 66 28 20  Flag ){.    if( 
4f00: 7a 53 63 72 69 70 74 20 26 26 20 7a 53 63 72 69  zScript && zScri
4f10: 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 63  pt[0] ){.      c
4f20: 68 61 72 20 7a 42 75 66 5b 31 30 5d 3b 0a 20 20  har zBuf[10];.  
4f30: 20 20 20 20 7a 42 75 66 5b 30 5d 20 3d 20 27 39      zBuf[0] = '9
4f40: 27 3b 0a 20 20 20 20 20 20 7a 42 75 66 5b 31 5d  ';.      zBuf[1]
4f50: 20 3d 20 27 30 27 20 2b 20 28 69 53 69 67 2f 31   = '0' + (iSig/1
4f60: 30 29 25 31 30 3b 0a 20 20 20 20 20 20 7a 42 75  0)%10;.      zBu
4f70: 66 5b 32 5d 20 3d 20 27 30 27 20 2b 20 69 53 69  f[2] = '0' + iSi
4f80: 67 25 31 30 3b 0a 20 20 20 20 20 20 7a 42 75 66  g%10;.      zBuf
4f90: 5b 33 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  [3] = 0;.      s
4fa0: 74 72 63 70 79 28 7a 52 65 70 6c 79 53 74 61 74  trcpy(zReplyStat
4fb0: 75 73 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20  us, zBuf);.     
4fc0: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c   MakeLogEntry(0,
4fd0: 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 20 2f 2a 20   __LINE__);  /* 
4fe0: 4c 4f 47 3a 20 54 69 6d 65 6f 75 74 20 2a 2f 0a  LOG: Timeout */.
4ff0: 20 20 20 20 7d 0a 20 20 20 20 65 78 69 74 28 30      }.    exit(0
5000: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
5010: 54 65 6c 6c 20 74 68 65 20 63 6c 69 65 6e 74 20  Tell the client 
5020: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 6e  that there is an
5030: 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 73 63   error in the sc
5040: 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ript..*/.static 
5050: 76 6f 69 64 20 43 67 69 53 63 72 69 70 74 57 72  void CgiScriptWr
5060: 69 74 61 62 6c 65 28 76 6f 69 64 29 7b 0a 20 20  itable(void){.  
5070: 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 35  StartResponse("5
5080: 30 30 20 43 47 49 20 43 6f 6e 66 69 67 75 72 61  00 CGI Configura
5090: 74 69 6f 6e 20 45 72 72 6f 72 22 29 3b 0a 20 20  tion Error");.  
50a0: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a  nOut += printf(.
50b0: 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70      "Content-typ
50c0: 65 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c 72 5c  e: text/plain\r\
50d0: 6e 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20  n".    "\r\n".  
50e0: 20 20 22 54 68 65 20 43 47 49 20 70 72 6f 67 72    "The CGI progr
50f0: 61 6d 20 25 73 20 69 73 20 77 72 69 74 61 62 6c  am %s is writabl
5100: 65 20 62 79 20 75 73 65 72 73 20 6f 74 68 65 72  e by users other
5110: 20 74 68 61 6e 20 69 74 73 20 6f 77 6e 65 72 2e   than its owner.
5120: 5c 6e 22 2c 0a 20 20 20 20 7a 52 65 61 6c 53 63  \n",.    zRealSc
5130: 72 69 70 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67  ript);.  MakeLog
5140: 45 6e 74 72 79 28 30 2c 20 5f 5f 4c 49 4e 45 5f  Entry(0, __LINE_
5150: 5f 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 43 47 49  _);  /* LOG: CGI
5160: 20 73 63 72 69 70 74 20 69 73 20 77 72 69 74 61   script is writa
5170: 62 6c 65 20 2a 2f 0a 20 20 65 78 69 74 28 30 29  ble */.  exit(0)
5180: 3b 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a  ;       .}../*.*
5190: 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c 69 65 6e  * Tell the clien
51a0: 74 20 74 68 61 74 20 74 68 65 20 73 65 72 76 65  t that the serve
51b0: 72 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 65 64 2e  r malfunctioned.
51c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
51d0: 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 69 6e 74 20  Malfunction(int 
51e0: 6c 69 6e 65 6e 75 6d 2c 20 63 6f 6e 73 74 20 63  linenum, const c
51f0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
5200: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
5210: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
5220: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 53 74 61   zFormat);.  Sta
5230: 72 74 52 65 73 70 6f 6e 73 65 28 22 35 30 30 20  rtResponse("500 
5240: 53 65 72 76 65 72 20 4d 61 6c 66 75 6e 63 74 69  Server Malfuncti
5250: 6f 6e 22 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20  on");.  nOut += 
5260: 70 72 69 6e 74 66 28 0a 20 20 20 20 22 43 6f 6e  printf(.    "Con
5270: 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f  tent-type: text/
5280: 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 22  plain\r\n".    "
5290: 5c 72 5c 6e 22 0a 20 20 20 20 22 57 65 62 20 73  \r\n".    "Web s
52a0: 65 72 76 65 72 20 6d 61 6c 66 75 6e 63 74 69 6f  erver malfunctio
52b0: 6e 65 64 3b 20 65 72 72 6f 72 20 6e 75 6d 62 65  ned; error numbe
52c0: 72 20 25 64 5c 6e 5c 6e 22 2c 20 6c 69 6e 65 6e  r %d\n\n", linen
52d0: 75 6d 29 3b 0a 20 20 69 66 28 20 7a 46 6f 72 6d  um);.  if( zForm
52e0: 61 74 20 29 7b 0a 20 20 20 20 6e 4f 75 74 20 2b  at ){.    nOut +
52f0: 3d 20 76 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61  = vprintf(zForma
5300: 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 20 20 4d 61  t, ap);.  }.  Ma
5310: 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 6c 69  keLogEntry(0, li
5320: 6e 65 6e 75 6d 29 3b 0a 20 20 65 78 69 74 28 30  nenum);.  exit(0
5330: 29 3b 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a  );       .}../*.
5340: 2a 2a 20 44 6f 20 61 20 73 65 72 76 65 72 20 72  ** Do a server r
5350: 65 64 69 72 65 63 74 20 74 6f 20 74 68 65 20 64  edirect to the d
5360: 6f 63 75 6d 65 6e 74 20 73 70 65 63 69 66 69 65  ocument specifie
5370: 64 2e 20 20 54 68 65 20 64 6f 63 75 6d 65 6e 74  d.  The document
5380: 0a 2a 2a 20 6e 61 6d 65 20 6e 6f 74 20 63 6f 6e  .** name not con
5390: 74 61 69 6e 20 73 63 68 65 6d 65 20 6f 72 20 6e  tain scheme or n
53a0: 65 74 77 6f 72 6b 20 6c 6f 63 61 74 69 6f 6e 20  etwork location 
53b0: 6f 72 20 74 68 65 20 71 75 65 72 79 20 73 74 72  or the query str
53c0: 69 6e 67 2e 0a 2a 2a 20 49 74 20 77 69 6c 6c 20  ing..** It will 
53d0: 62 65 20 6a 75 73 74 20 74 68 65 20 70 61 74 68  be just the path
53e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
53f0: 20 52 65 64 69 72 65 63 74 28 63 6f 6e 73 74 20   Redirect(const 
5400: 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74  char *zPath, int
5410: 20 66 69 6e 69 73 68 2c 20 69 6e 74 20 6c 69 6e   finish, int lin
5420: 65 6e 6f 29 7b 0a 20 20 53 74 61 72 74 52 65 73  eno){.  StartRes
5430: 70 6f 6e 73 65 28 22 33 30 32 20 54 65 6d 70 6f  ponse("302 Tempo
5440: 72 61 72 79 20 52 65 64 69 72 65 63 74 22 29 3b  rary Redirect");
5450: 0a 20 20 69 66 28 20 7a 53 65 72 76 65 72 50 6f  .  if( zServerPo
5460: 72 74 3d 3d 30 20 7c 7c 20 7a 53 65 72 76 65 72  rt==0 || zServer
5470: 50 6f 72 74 5b 30 5d 3d 3d 30 20 7c 7c 20 73 74  Port[0]==0 || st
5480: 72 63 6d 70 28 7a 53 65 72 76 65 72 50 6f 72 74  rcmp(zServerPort
5490: 2c 22 38 30 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ,"80")==0 ){.   
54a0: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
54b0: 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73 3a 2f 2f  "Location: %s://
54c0: 25 73 25 73 25 73 5c 72 5c 6e 22 2c 0a 20 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: 7a 48 74 74 70 2c 20 7a 53 65 72 76 65 72 4e 61  zHttp, zServerNa
54f0: 6d 65 2c 20 7a 50 61 74 68 2c 20 7a 51 75 65 72  me, zPath, zQuer
5500: 79 53 75 66 66 69 78 29 3b 0a 20 20 7d 65 6c 73  ySuffix);.  }els
5510: 65 7b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70  e{.    nOut += p
5520: 72 69 6e 74 66 28 22 4c 6f 63 61 74 69 6f 6e 3a  rintf("Location:
5530: 20 25 73 3a 2f 2f 25 73 3a 25 73 25 73 25 73 5c   %s://%s:%s%s%s\
5540: 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  r\n",.          
5550: 20 20 20 20 20 20 20 20 20 7a 48 74 74 70 2c 20           zHttp, 
5560: 7a 53 65 72 76 65 72 4e 61 6d 65 2c 20 7a 53 65  zServerName, zSe
5570: 72 76 65 72 50 6f 72 74 2c 20 7a 50 61 74 68 2c  rverPort, zPath,
5580: 20 7a 51 75 65 72 79 53 75 66 66 69 78 29 3b 0a   zQuerySuffix);.
5590: 20 20 7d 0a 20 20 69 66 28 20 66 69 6e 69 73 68    }.  if( finish
55a0: 20 29 7b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20   ){.    nOut += 
55b0: 70 72 69 6e 74 66 28 22 43 6f 6e 74 65 6e 74 2d  printf("Content-
55c0: 6c 65 6e 67 74 68 3a 20 30 5c 72 5c 6e 22 29 3b  length: 0\r\n");
55d0: 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69  .    nOut += pri
55e0: 6e 74 66 28 22 5c 72 5c 6e 22 29 3b 0a 20 20 20  ntf("\r\n");.   
55f0: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c   MakeLogEntry(0,
5600: 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 20 20   lineno);.  }.  
5610: 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
5620: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
5630: 6e 63 74 69 6f 6e 20 74 72 65 61 74 73 20 69 74  nction treats it
5640: 73 20 69 6e 70 75 74 20 61 73 20 61 20 62 61 73  s input as a bas
5650: 65 2d 36 34 20 73 74 72 69 6e 67 20 61 6e 64 20  e-64 string and 
5660: 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 64  returns the.** d
5670: 65 63 6f 64 65 64 20 76 61 6c 75 65 20 6f 66 20  ecoded value of 
5680: 74 68 61 74 20 73 74 72 69 6e 67 2e 20 20 43 68  that string.  Ch
5690: 61 72 61 63 74 65 72 73 20 6f 66 20 69 6e 70 75  aracters of inpu
56a0: 74 20 74 68 61 74 20 61 72 65 20 6e 6f 74 0a 2a  t that are not.*
56b0: 2a 20 76 61 6c 69 64 20 62 61 73 65 2d 36 34 20  * valid base-64 
56c0: 63 68 61 72 61 63 74 65 72 73 20 28 73 75 63 68  characters (such
56d0: 20 61 73 20 73 70 61 63 65 73 20 61 6e 64 20 6e   as spaces and n
56e0: 65 77 6c 69 6e 65 73 29 20 61 72 65 20 69 67 6e  ewlines) are ign
56f0: 6f 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 44 65  ored..*/.void De
5700: 63 6f 64 65 36 34 28 63 68 61 72 20 2a 7a 36 34  code64(char *z64
5710: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 61  ){.  char *zData
5720: 3b 0a 20 20 69 6e 74 20 6e 36 34 3b 0a 20 20 69  ;.  int n64;.  i
5730: 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 61  nt i, j;.  int a
5740: 2c 20 62 2c 20 63 2c 20 64 3b 0a 20 20 73 74 61  , b, c, d;.  sta
5750: 74 69 63 20 69 6e 74 20 69 73 49 6e 69 74 20 3d  tic int isInit =
5760: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   0;.  static int
5770: 20 74 72 61 6e 73 5b 31 32 38 5d 3b 0a 20 20 73   trans[128];.  s
5780: 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63  tatic unsigned c
5790: 68 61 72 20 7a 42 61 73 65 5b 5d 20 3d 20 0a 20  har zBase[] = . 
57a0: 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c     "ABCDEFGHIJKL
57b0: 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 61 62  MNOPQRSTUVWXYZab
57c0: 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
57d0: 73 74 75 76 77 78 79 7a 30 31 32 33 34 35 36 37  stuvwxyz01234567
57e0: 38 39 2b 2f 22 3b 0a 0a 20 20 69 66 28 20 21 69  89+/";..  if( !i
57f0: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 66 6f 72  sInit ){.    for
5800: 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b  (i=0; i<128; i++
5810: 29 7b 20 74 72 61 6e 73 5b 69 5d 20 3d 20 30 3b  ){ trans[i] = 0;
5820: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
5830: 7a 42 61 73 65 5b 69 5d 3b 20 69 2b 2b 29 7b 20  zBase[i]; i++){ 
5840: 74 72 61 6e 73 5b 7a 42 61 73 65 5b 69 5d 20 26  trans[zBase[i] &
5850: 20 30 78 37 66 5d 20 3d 20 69 3b 20 7d 0a 20 20   0x7f] = i; }.  
5860: 20 20 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20    isInit = 1;.  
5870: 7d 0a 20 20 6e 36 34 20 3d 20 73 74 72 6c 65 6e  }.  n64 = strlen
5880: 28 7a 36 34 29 3b 0a 20 20 77 68 69 6c 65 28 20  (z64);.  while( 
5890: 6e 36 34 3e 30 20 26 26 20 7a 36 34 5b 6e 36 34  n64>0 && z64[n64
58a0: 2d 31 5d 3d 3d 27 3d 27 20 29 20 6e 36 34 2d 2d  -1]=='=' ) n64--
58b0: 3b 0a 20 20 7a 44 61 74 61 20 3d 20 7a 36 34 3b  ;.  zData = z64;
58c0: 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 2b  .  for(i=j=0; i+
58d0: 33 3c 6e 36 34 3b 20 69 2b 3d 34 29 7b 0a 20 20  3<n64; i+=4){.  
58e0: 20 20 61 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b    a = trans[z64[
58f0: 69 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20  i] & 0x7f];.    
5900: 62 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b  b = trans[z64[i+
5910: 31 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20  1] & 0x7f];.    
5920: 63 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b  c = trans[z64[i+
5930: 32 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20  2] & 0x7f];.    
5940: 64 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b  d = trans[z64[i+
5950: 33 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20  3] & 0x7f];.    
5960: 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28 61  zData[j++] = ((a
5970: 3c 3c 32 29 20 26 20 30 78 66 63 29 20 7c 20 28  <<2) & 0xfc) | (
5980: 28 62 3e 3e 34 29 20 26 20 30 78 30 33 29 3b 0a  (b>>4) & 0x03);.
5990: 20 20 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d      zData[j++] =
59a0: 20 28 28 62 3c 3c 34 29 20 26 20 30 78 66 30 29   ((b<<4) & 0xf0)
59b0: 20 7c 20 28 28 63 3e 3e 32 29 20 26 20 30 78 30   | ((c>>2) & 0x0
59c0: 66 29 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b  f);.    zData[j+
59d0: 2b 5d 20 3d 20 28 28 63 3c 3c 36 29 20 26 20 30  +] = ((c<<6) & 0
59e0: 78 63 30 29 20 7c 20 28 64 20 26 20 30 78 33 66  xc0) | (d & 0x3f
59f0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 2b 32  );.  }.  if( i+2
5a00: 3c 6e 36 34 20 29 7b 0a 20 20 20 20 61 20 3d 20  <n64 ){.    a = 
5a10: 74 72 61 6e 73 5b 7a 36 34 5b 69 5d 20 26 20 30  trans[z64[i] & 0
5a20: 78 37 66 5d 3b 0a 20 20 20 20 62 20 3d 20 74 72  x7f];.    b = tr
5a30: 61 6e 73 5b 7a 36 34 5b 69 2b 31 5d 20 26 20 30  ans[z64[i+1] & 0
5a40: 78 37 66 5d 3b 0a 20 20 20 20 63 20 3d 20 74 72  x7f];.    c = tr
5a50: 61 6e 73 5b 7a 36 34 5b 69 2b 32 5d 20 26 20 30  ans[z64[i+2] & 0
5a60: 78 37 66 5d 3b 0a 20 20 20 20 7a 44 61 74 61 5b  x7f];.    zData[
5a70: 6a 2b 2b 5d 20 3d 20 28 28 61 3c 3c 32 29 20 26  j++] = ((a<<2) &
5a80: 20 30 78 66 63 29 20 7c 20 28 28 62 3e 3e 34 29   0xfc) | ((b>>4)
5a90: 20 26 20 30 78 30 33 29 3b 0a 20 20 20 20 7a 44   & 0x03);.    zD
5aa0: 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28 62 3c 3c  ata[j++] = ((b<<
5ab0: 34 29 20 26 20 30 78 66 30 29 20 7c 20 28 28 63  4) & 0xf0) | ((c
5ac0: 3e 3e 32 29 20 26 20 30 78 30 66 29 3b 0a 20 20  >>2) & 0x0f);.  
5ad0: 7d 65 6c 73 65 20 69 66 28 20 69 2b 31 3c 6e 36  }else if( i+1<n6
5ae0: 34 20 29 7b 0a 20 20 20 20 61 20 3d 20 74 72 61  4 ){.    a = tra
5af0: 6e 73 5b 7a 36 34 5b 69 5d 20 26 20 30 78 37 66  ns[z64[i] & 0x7f
5b00: 5d 3b 0a 20 20 20 20 62 20 3d 20 74 72 61 6e 73  ];.    b = trans
5b10: 5b 7a 36 34 5b 69 2b 31 5d 20 26 20 30 78 37 66  [z64[i+1] & 0x7f
5b20: 5d 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b 2b  ];.    zData[j++
5b30: 5d 20 3d 20 28 28 61 3c 3c 32 29 20 26 20 30 78  ] = ((a<<2) & 0x
5b40: 66 63 29 20 7c 20 28 28 62 3e 3e 34 29 20 26 20  fc) | ((b>>4) & 
5b50: 30 78 30 33 29 3b 0a 20 20 7d 0a 20 20 7a 44 61  0x03);.  }.  zDa
5b60: 74 61 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ta[j] = 0;.}../*
5b70: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
5b80: 20 69 66 20 62 61 73 69 63 20 61 75 74 68 6f 72   if basic author
5b90: 69 7a 61 74 69 6f 6e 20 63 72 65 64 65 6e 74 69  ization credenti
5ba0: 61 6c 73 20 61 72 65 20 70 72 6f 76 69 64 65 64  als are provided
5bb0: 20 66 6f 72 0a 2a 2a 20 74 68 65 20 75 73 65 72   for.** the user
5bc0: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
5bd0: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  e information in
5be0: 20 7a 41 75 74 68 46 69 6c 65 2e 20 20 52 65 74   zAuthFile.  Ret
5bf0: 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 61  urn true.** if a
5c00: 75 74 68 6f 72 69 7a 65 64 2e 20 20 52 65 74 75  uthorized.  Retu
5c10: 72 6e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 20  rn false if not 
5c20: 61 75 74 68 6f 72 69 7a 65 64 2e 0a 2a 2a 0a 2a  authorized..**.*
5c30: 2a 20 46 69 6c 65 20 66 6f 72 6d 61 74 3a 0a 2a  * File format:.*
5c40: 2a 0a 2a 2a 20 20 20 20 2a 20 20 42 6c 61 6e 6b  *.**    *  Blank
5c50: 20 6c 69 6e 65 73 20 61 6e 64 20 6c 69 6e 65 73   lines and lines
5c60: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
5c70: 20 27 23 27 20 61 72 65 20 69 67 6e 6f 72 65 64   '#' are ignored
5c80: 0a 2a 2a 20 20 20 20 2a 20 20 22 68 74 74 70 2d  .**    *  "http-
5c90: 72 65 64 69 72 65 63 74 22 20 66 6f 72 63 65 73  redirect" forces
5ca0: 20 61 20 72 65 64 69 72 65 63 74 20 74 6f 20 48   a redirect to H
5cb0: 54 54 50 53 20 69 66 20 6e 6f 74 20 74 68 65 72  TTPS if not ther
5cc0: 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 20 20 20  e already.**    
5cd0: 2a 20 20 22 68 74 74 70 73 2d 6f 6e 6c 79 22 20  *  "https-only" 
5ce0: 64 69 73 61 6c 6c 6f 77 73 20 6f 70 65 72 61 74  disallows operat
5cf0: 69 6f 6e 20 69 6e 20 48 54 54 50 0a 2a 2a 20 20  ion in HTTP.**  
5d00: 20 20 2a 20 20 22 75 73 65 72 20 4e 41 4d 45 20    *  "user NAME 
5d10: 4c 4f 47 49 4e 3a 50 41 53 53 57 4f 52 44 22 20  LOGIN:PASSWORD" 
5d20: 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
5d30: 20 4c 4f 47 49 4e 3a 50 41 53 53 57 4f 52 44 20   LOGIN:PASSWORD 
5d40: 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 68 6f 72  .**       author
5d50: 69 7a 61 74 69 6f 6e 20 63 72 65 64 65 6e 74 69  ization credenti
5d60: 61 6c 73 20 61 72 65 20 70 72 6f 76 69 64 65 64  als are provided
5d70: 2c 20 61 6e 64 20 69 66 20 73 6f 20 73 65 74 73  , and if so sets
5d80: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 52 45   the.**       RE
5d90: 4d 4f 54 45 5f 55 53 45 52 20 74 6f 20 4e 41 4d  MOTE_USER to NAM
5da0: 45 2e 0a 2a 2a 20 20 20 20 2a 20 20 22 72 65 61  E..**    *  "rea
5db0: 6c 6d 20 54 45 58 54 22 20 73 65 74 73 20 74 68  lm TEXT" sets th
5dc0: 65 20 72 65 61 6c 6d 20 74 6f 20 54 45 58 54 2e  e realm to TEXT.
5dd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 43  .*/.static int C
5de0: 68 65 63 6b 42 61 73 69 63 41 75 74 68 6f 72 69  heckBasicAuthori
5df0: 7a 61 74 69 6f 6e 28 63 6f 6e 73 74 20 63 68 61  zation(const cha
5e00: 72 20 2a 7a 41 75 74 68 46 69 6c 65 29 7b 0a 20  r *zAuthFile){. 
5e10: 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61   FILE *in;.  cha
5e20: 72 20 2a 7a 52 65 61 6c 6d 20 3d 20 22 75 6e 6b  r *zRealm = "unk
5e30: 6e 6f 77 6e 20 72 65 61 6c 6d 22 3b 0a 20 20 63  nown realm";.  c
5e40: 68 61 72 20 2a 7a 4c 6f 67 69 6e 50 73 77 64 3b  har *zLoginPswd;
5e50: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
5e60: 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b 32 30 30    char zLine[200
5e70: 30 5d 3b 0a 0a 20 20 69 6e 20 3d 20 66 6f 70 65  0];..  in = fope
5e80: 6e 28 7a 41 75 74 68 46 69 6c 65 2c 20 22 72 22  n(zAuthFile, "r"
5e90: 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29  );.  if( in==0 )
5ea0: 7b 0a 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f  {.    NotFound(_
5eb0: 5f 4c 49 4e 45 5f 5f 29 3b 20 20 2f 2a 20 4c 4f  _LINE__);  /* LO
5ec0: 47 3a 20 43 61 6e 6e 6f 74 20 6f 70 65 6e 20 2d  G: Cannot open -
5ed0: 61 75 74 68 20 66 69 6c 65 20 2a 2f 0a 20 20 20  auth file */.   
5ee0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
5ef0: 20 69 66 28 20 7a 41 75 74 68 41 72 67 20 29 20   if( zAuthArg ) 
5f00: 44 65 63 6f 64 65 36 34 28 7a 41 75 74 68 41 72  Decode64(zAuthAr
5f10: 67 29 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65  g);.  while( fge
5f20: 74 73 28 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f 66  ts(zLine, sizeof
5f30: 28 7a 4c 69 6e 65 29 2c 20 69 6e 29 20 29 7b 0a  (zLine), in) ){.
5f40: 20 20 20 20 63 68 61 72 20 2a 7a 46 69 65 6c 64      char *zField
5f50: 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  Name;.    char *
5f60: 7a 56 61 6c 3b 0a 0a 20 20 20 20 7a 46 69 65 6c  zVal;..    zFiel
5f70: 64 4e 61 6d 65 20 3d 20 47 65 74 46 69 72 73 74  dName = GetFirst
5f80: 45 6c 65 6d 65 6e 74 28 7a 4c 69 6e 65 2c 26 7a  Element(zLine,&z
5f90: 56 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a 46  Val);.    if( zF
5fa0: 69 65 6c 64 4e 61 6d 65 3d 3d 30 20 7c 7c 20 2a  ieldName==0 || *
5fb0: 7a 46 69 65 6c 64 4e 61 6d 65 3d 3d 30 20 29 20  zFieldName==0 ) 
5fc0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
5fd0: 28 20 7a 46 69 65 6c 64 4e 61 6d 65 5b 30 5d 3d  ( zFieldName[0]=
5fe0: 3d 27 23 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ='#' ) continue;
5ff0: 0a 20 20 20 20 52 65 6d 6f 76 65 4e 65 77 6c 69  .    RemoveNewli
6000: 6e 65 28 7a 56 61 6c 29 3b 0a 20 20 20 20 69 66  ne(zVal);.    if
6010: 28 20 73 74 72 63 6d 70 28 7a 46 69 65 6c 64 4e  ( strcmp(zFieldN
6020: 61 6d 65 2c 20 22 72 65 61 6c 6d 22 29 3d 3d 30  ame, "realm")==0
6030: 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 61 6c 6d   ){.      zRealm
6040: 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b   = StrDup(zVal);
6050: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
6060: 74 72 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65  trcmp(zFieldName
6070: 2c 22 75 73 65 72 22 29 3d 3d 30 20 29 7b 0a 20  ,"user")==0 ){. 
6080: 20 20 20 20 20 69 66 28 20 7a 41 75 74 68 41 72       if( zAuthAr
6090: 67 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  g==0 ) continue;
60a0: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 47  .      zName = G
60b0: 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a  etFirstElement(z
60c0: 56 61 6c 2c 20 26 7a 56 61 6c 29 3b 0a 20 20 20  Val, &zVal);.   
60d0: 20 20 20 7a 4c 6f 67 69 6e 50 73 77 64 20 3d 20     zLoginPswd = 
60e0: 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28  GetFirstElement(
60f0: 7a 56 61 6c 2c 20 26 7a 56 61 6c 29 3b 0a 20 20  zVal, &zVal);.  
6100: 20 20 20 20 69 66 28 20 7a 4c 6f 67 69 6e 50 73      if( zLoginPs
6110: 77 64 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  wd==0 ) continue
6120: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 75 74  ;.      if( zAut
6130: 68 41 72 67 20 26 26 20 73 74 72 63 6d 70 28 7a  hArg && strcmp(z
6140: 41 75 74 68 41 72 67 2c 7a 4c 6f 67 69 6e 50 73  AuthArg,zLoginPs
6150: 77 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  wd)==0 ){.      
6160: 20 20 7a 52 65 6d 6f 74 65 55 73 65 72 20 3d 20    zRemoteUser = 
6170: 53 74 72 44 75 70 28 7a 4e 61 6d 65 29 3b 0a 20  StrDup(zName);. 
6180: 20 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69 6e         fclose(in
6190: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
61a0: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
61b0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
61c0: 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 68 74  p(zFieldName,"ht
61d0: 74 70 73 2d 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b  tps-only")==0 ){
61e0: 0a 20 20 20 20 20 20 69 66 28 20 21 75 73 65 48  .      if( !useH
61f0: 74 74 70 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ttps ){.        
6200: 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f  NotFound(__LINE_
6210: 5f 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 20 68 74  _);  /* LOG:  ht
6220: 74 70 20 72 65 71 75 65 73 74 20 6f 6e 20 68 74  tp request on ht
6230: 74 70 73 2d 6f 6e 6c 79 20 70 61 67 65 20 2a 2f  tps-only page */
6240: 0a 20 20 20 20 20 20 20 20 66 63 6c 6f 73 65 28  .        fclose(
6250: 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  in);.        ret
6260: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
6270: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
6280: 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22  cmp(zFieldName,"
6290: 68 74 74 70 2d 72 65 64 69 72 65 63 74 22 29 3d  http-redirect")=
62a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
62b0: 21 75 73 65 48 74 74 70 73 20 29 7b 0a 20 20 20  !useHttps ){.   
62c0: 20 20 20 20 20 7a 48 74 74 70 20 3d 20 22 68 74       zHttp = "ht
62d0: 74 70 73 22 3b 0a 20 20 20 20 20 20 20 20 73 70  tps";.        sp
62e0: 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 25 73  rintf(zLine, "%s
62f0: 25 73 22 2c 20 7a 53 63 72 69 70 74 2c 20 7a 50  %s", zScript, zP
6300: 61 74 68 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  athInfo);.      
6310: 20 20 52 65 64 69 72 65 63 74 28 7a 4c 69 6e 65    Redirect(zLine
6320: 2c 20 31 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20  , 1, __LINE__); 
6330: 2f 2a 20 4c 4f 47 3a 20 2d 61 75 74 68 20 72 65  /* LOG: -auth re
6340: 64 69 72 65 63 74 20 2a 2f 0a 20 20 20 20 20 20  direct */.      
6350: 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
6360: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
6370: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
6380: 65 7b 0a 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e  e{.      NotFoun
6390: 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 20 2f 2a  d(__LINE__);  /*
63a0: 20 4c 4f 47 3a 20 20 6d 61 6c 66 6f 72 6d 65 64   LOG:  malformed
63b0: 20 65 6e 74 72 79 20 69 6e 20 2d 61 75 74 68 20   entry in -auth 
63c0: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 66 63  file */.      fc
63d0: 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20  lose(in);.      
63e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
63f0: 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29    }.  fclose(in)
6400: 3b 0a 20 20 4e 6f 74 41 75 74 68 6f 72 69 7a 65  ;.  NotAuthorize
6410: 64 28 7a 52 65 61 6c 6d 29 3b 0a 20 20 72 65 74  d(zRealm);.  ret
6420: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
6430: 47 75 65 73 73 20 74 68 65 20 6d 69 6d 65 2d 74  Guess the mime-t
6440: 79 70 65 20 6f 66 20 61 20 64 6f 63 75 6d 65 6e  ype of a documen
6450: 74 20 62 61 73 65 64 20 6f 6e 20 69 74 73 20 6e  t based on its n
6460: 61 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ame..*/.const ch
6470: 61 72 20 2a 47 65 74 4d 69 6d 65 54 79 70 65 28  ar *GetMimeType(
6480: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
6490: 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20  e, int nName){. 
64a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
64b0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 66    int i;.  int f
64c0: 69 72 73 74 2c 20 6c 61 73 74 3b 0a 20 20 69 6e  irst, last;.  in
64d0: 74 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20 7a 53  t len;.  char zS
64e0: 75 66 66 69 78 5b 32 30 5d 3b 0a 0a 20 20 2f 2a  uffix[20];..  /*
64f0: 20 41 20 74 61 62 6c 65 20 6f 66 20 6d 69 6d 65   A table of mime
6500: 74 79 70 65 73 20 62 61 73 65 64 20 6f 6e 20 66  types based on f
6510: 69 6c 65 20 73 75 66 66 69 78 65 73 2e 20 0a 20  ile suffixes. . 
6520: 20 2a 2a 20 53 75 66 66 69 78 65 73 20 6d 75 73   ** Suffixes mus
6530: 74 20 62 65 20 69 6e 20 73 6f 72 74 65 64 20 6f  t be in sorted o
6540: 72 64 65 72 20 73 6f 20 74 68 61 74 20 77 65 20  rder so that we 
6550: 63 61 6e 20 64 6f 20 61 20 62 69 6e 61 72 79 0a  can do a binary.
6560: 20 20 2a 2a 20 73 65 61 72 63 68 20 74 6f 20 66    ** search to f
6570: 69 6e 64 20 74 68 65 20 6d 69 6d 65 2d 74 79 70  ind the mime-typ
6580: 65 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  e.  */.  static 
6590: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
65a0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
65b0: 53 75 66 66 69 78 3b 20 20 20 20 20 20 20 2f 2a  Suffix;       /*
65c0: 20 54 68 65 20 66 69 6c 65 20 73 75 66 66 69 78   The file suffix
65d0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 69 7a 65   */.    int size
65e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
65f0: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
6600: 74 68 65 20 73 75 66 66 69 78 20 2a 2f 0a 20 20  the suffix */.  
6610: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d    const char *zM
6620: 69 6d 65 74 79 70 65 3b 20 20 20 20 20 2f 2a 20  imetype;     /* 
6630: 54 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  The correspondin
6640: 67 20 6d 69 6d 65 74 79 70 65 20 2a 2f 0a 20 20  g mimetype */.  
6650: 7d 20 61 4d 69 6d 65 5b 5d 20 3d 20 7b 0a 20 20  } aMime[] = {.  
6660: 20 20 7b 20 22 61 69 22 2c 20 20 20 20 20 20 20    { "ai",       
6670: 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    2, "applicatio
6680: 6e 2f 70 6f 73 74 73 63 72 69 70 74 22 20 20 20  n/postscript"   
6690: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
66a0: 7b 20 22 61 69 66 22 2c 20 20 20 20 20 20 20 20  { "aif",        
66b0: 33 2c 20 22 61 75 64 69 6f 2f 78 2d 61 69 66 66  3, "audio/x-aiff
66c0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
66d0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
66e0: 22 61 69 66 63 22 2c 20 20 20 20 20 20 20 34 2c  "aifc",       4,
66f0: 20 22 61 75 64 69 6f 2f 78 2d 61 69 66 66 22 20   "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 7d 2c 0a 20 20 20 20 7b 20 22 61       },.    { "a
6720: 69 66 66 22 2c 20 20 20 20 20 20 20 34 2c 20 22  iff",       4, "
6730: 61 75 64 69 6f 2f 78 2d 61 69 66 66 22 20 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 7d 2c 0a 20 20 20 20 7b 20 22 61 72 6a     },.    { "arj
6760: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
6770: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 61 72 6a 2d  plication/x-arj-
6780: 63 6f 6d 70 72 65 73 73 65 64 22 20 20 20 20 20  compressed"     
6790: 20 7d 2c 0a 20 20 20 20 7b 20 22 61 73 63 22 2c   },.    { "asc",
67a0: 20 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74          3, "text
67b0: 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20  /plain"         
67c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
67d0: 2c 0a 20 20 20 20 7b 20 22 61 73 66 22 2c 20 20  ,.    { "asf",  
67e0: 20 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f        3, "video/
67f0: 78 2d 6d 73 2d 61 73 66 22 20 20 20 20 20 20 20  x-ms-asf"       
6800: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
6810: 20 20 20 20 7b 20 22 61 73 78 22 2c 20 20 20 20      { "asx",    
6820: 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d      3, "video/x-
6830: 6d 73 2d 61 73 78 22 20 20 20 20 20 20 20 20 20  ms-asx"         
6840: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
6850: 20 20 7b 20 22 61 75 22 2c 20 20 20 20 20 20 20    { "au",       
6860: 20 20 32 2c 20 22 61 75 64 69 6f 2f 75 6c 61 77    2, "audio/ulaw
6870: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
6880: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
6890: 7b 20 22 61 76 69 22 2c 20 20 20 20 20 20 20 20  { "avi",        
68a0: 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 76 69  3, "video/x-msvi
68b0: 64 65 6f 22 20 20 20 20 20 20 20 20 20 20 20 20  deo"            
68c0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
68d0: 22 62 61 74 22 2c 20 20 20 20 20 20 20 20 33 2c  "bat",        3,
68e0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
68f0: 6d 73 64 6f 73 2d 70 72 6f 67 72 61 6d 22 20 20  msdos-program"  
6900: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 62       },.    { "b
6910: 63 70 69 6f 22 2c 20 20 20 20 20 20 35 2c 20 22  cpio",      5, "
6920: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 62 63  application/x-bc
6930: 70 69 6f 22 20 20 20 20 20 20 20 20 20 20 20 20  pio"            
6940: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 62 69 6e     },.    { "bin
6950: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
6960: 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d  plication/octet-
6970: 73 74 72 65 61 6d 22 20 20 20 20 20 20 20 20 20  stream"         
6980: 20 7d 2c 0a 20 20 20 20 7b 20 22 63 22 2c 20 20   },.    { "c",  
6990: 20 20 20 20 20 20 20 20 31 2c 20 22 74 65 78 74          1, "text
69a0: 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20  /plain"         
69b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
69c0: 2c 0a 20 20 20 20 7b 20 22 63 63 22 2c 20 20 20  ,.    { "cc",   
69d0: 20 20 20 20 20 20 32 2c 20 22 74 65 78 74 2f 70        2, "text/p
69e0: 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20 20 20  lain"           
69f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
6a00: 20 20 20 20 7b 20 22 63 63 61 64 22 2c 20 20 20      { "ccad",   
6a10: 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74      4, "applicat
6a20: 69 6f 6e 2f 63 6c 61 72 69 73 63 61 64 22 20 20  ion/clariscad"  
6a30: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
6a40: 20 20 7b 20 22 63 64 66 22 2c 20 20 20 20 20 20    { "cdf",      
6a50: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
6a60: 6e 2f 78 2d 6e 65 74 63 64 66 22 20 20 20 20 20  n/x-netcdf"     
6a70: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
6a80: 7b 20 22 63 6c 61 73 73 22 2c 20 20 20 20 20 20  { "class",      
6a90: 35 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  5, "application/
6aa0: 6f 63 74 65 74 2d 73 74 72 65 61 6d 22 20 20 20  octet-stream"   
6ab0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
6ac0: 22 63 6f 64 22 2c 20 20 20 20 20 20 20 20 33 2c  "cod",        3,
6ad0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76 6e   "application/vn
6ae0: 64 2e 72 69 6d 2e 63 6f 64 22 20 20 20 20 20 20  d.rim.cod"      
6af0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63       },.    { "c
6b00: 6f 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  om",        3, "
6b10: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6d 73  application/x-ms
6b20: 64 6f 73 2d 70 72 6f 67 72 61 6d 22 20 20 20 20  dos-program"    
6b30: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 70 69     },.    { "cpi
6b40: 6f 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70  o",       4, "ap
6b50: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 63 70 69 6f  plication/x-cpio
6b60: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
6b70: 20 7d 2c 0a 20 20 20 20 7b 20 22 63 70 74 22 2c   },.    { "cpt",
6b80: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
6b90: 69 63 61 74 69 6f 6e 2f 6d 61 63 2d 63 6f 6d 70  ication/mac-comp
6ba0: 61 63 74 70 72 6f 22 20 20 20 20 20 20 20 20 7d  actpro"        }
6bb0: 2c 0a 20 20 20 20 7b 20 22 63 73 68 22 2c 20 20  ,.    { "csh",  
6bc0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
6bd0: 61 74 69 6f 6e 2f 78 2d 63 73 68 22 20 20 20 20  ation/x-csh"    
6be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
6bf0: 20 20 20 20 7b 20 22 63 73 73 22 2c 20 20 20 20      { "css",    
6c00: 20 20 20 20 33 2c 20 22 74 65 78 74 2f 63 73 73      3, "text/css
6c10: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
6c20: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
6c30: 20 20 7b 20 22 64 63 72 22 2c 20 20 20 20 20 20    { "dcr",      
6c40: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
6c50: 6e 2f 78 2d 64 69 72 65 63 74 6f 72 22 20 20 20  n/x-director"   
6c60: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
6c70: 7b 20 22 64 65 62 22 2c 20 20 20 20 20 20 20 20  { "deb",        
6c80: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
6c90: 78 2d 64 65 62 69 61 6e 2d 70 61 63 6b 61 67 65  x-debian-package
6ca0: 22 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20  "      },.    { 
6cb0: 22 64 69 72 22 2c 20 20 20 20 20 20 20 20 33 2c  "dir",        3,
6cc0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
6cd0: 64 69 72 65 63 74 6f 72 22 20 20 20 20 20 20 20  director"       
6ce0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64       },.    { "d
6cf0: 6c 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22  l",         2, "
6d00: 76 69 64 65 6f 2f 64 6c 22 20 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 7d 2c 0a 20 20 20 20 7b 20 22 64 6d 73     },.    { "dms
6d30: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
6d40: 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d  plication/octet-
6d50: 73 74 72 65 61 6d 22 20 20 20 20 20 20 20 20 20  stream"         
6d60: 20 7d 2c 0a 20 20 20 20 7b 20 22 64 6f 63 22 2c   },.    { "doc",
6d70: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
6d80: 69 63 61 74 69 6f 6e 2f 6d 73 77 6f 72 64 22 20  ication/msword" 
6d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
6da0: 2c 0a 20 20 20 20 7b 20 22 64 72 77 22 2c 20 20  ,.    { "drw",  
6db0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
6dc0: 61 74 69 6f 6e 2f 64 72 61 66 74 69 6e 67 22 20  ation/drafting" 
6dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
6de0: 20 20 20 20 7b 20 22 64 76 69 22 2c 20 20 20 20      { "dvi",    
6df0: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
6e00: 69 6f 6e 2f 78 2d 64 76 69 22 20 20 20 20 20 20  ion/x-dvi"      
6e10: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
6e20: 20 20 7b 20 22 64 77 67 22 2c 20 20 20 20 20 20    { "dwg",      
6e30: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
6e40: 6e 2f 61 63 61 64 22 20 20 20 20 20 20 20 20 20  n/acad"         
6e50: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
6e60: 7b 20 22 64 78 66 22 2c 20 20 20 20 20 20 20 20  { "dxf",        
6e70: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
6e80: 64 78 66 22 20 20 20 20 20 20 20 20 20 20 20 20  dxf"            
6e90: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
6ea0: 22 64 78 72 22 2c 20 20 20 20 20 20 20 20 33 2c  "dxr",        3,
6eb0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
6ec0: 64 69 72 65 63 74 6f 72 22 20 20 20 20 20 20 20  director"       
6ed0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65       },.    { "e
6ee0: 70 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ps",        3, "
6ef0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 6f 73 74  application/post
6f00: 73 63 72 69 70 74 22 20 20 20 20 20 20 20 20 20  script"         
6f10: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65 74 78     },.    { "etx
6f20: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65  ",        3, "te
6f30: 78 74 2f 78 2d 73 65 74 65 78 74 22 20 20 20 20  xt/x-setext"    
6f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f50: 20 7d 2c 0a 20 20 20 20 7b 20 22 65 78 65 22 2c   },.    { "exe",
6f60: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
6f70: 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74  ication/octet-st
6f80: 72 65 61 6d 22 20 20 20 20 20 20 20 20 20 20 7d  ream"          }
6f90: 2c 0a 20 20 20 20 7b 20 22 65 7a 22 2c 20 20 20  ,.    { "ez",   
6fa0: 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63        2, "applic
6fb0: 61 74 69 6f 6e 2f 61 6e 64 72 65 77 2d 69 6e 73  ation/andrew-ins
6fc0: 65 74 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  et"          },.
6fd0: 20 20 20 20 7b 20 22 66 22 2c 20 20 20 20 20 20      { "f",      
6fe0: 20 20 20 20 31 2c 20 22 74 65 78 74 2f 70 6c 61      1, "text/pla
6ff0: 69 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20  in"             
7000: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
7010: 20 20 7b 20 22 66 39 30 22 2c 20 20 20 20 20 20    { "f90",      
7020: 20 20 33 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e    3, "text/plain
7030: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
7040: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
7050: 7b 20 22 66 6c 69 22 2c 20 20 20 20 20 20 20 20  { "fli",        
7060: 33 2c 20 22 76 69 64 65 6f 2f 66 6c 69 22 20 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 7d 2c 0a 20 20 20 20 7b 20         },.    { 
7090: 22 66 6c 76 22 2c 20 20 20 20 20 20 20 20 33 2c  "flv",        3,
70a0: 20 22 76 69 64 65 6f 2f 66 6c 76 22 20 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 7d 2c 0a 20 20 20 20 7b 20 22 67       },.    { "g
70d0: 69 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  if",        3, "
70e0: 69 6d 61 67 65 2f 67 69 66 22 20 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 7d 2c 0a 20 20 20 20 7b 20 22 67 6c 22     },.    { "gl"
7110: 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 76 69  ,         2, "vi
7120: 64 65 6f 2f 67 6c 22 20 20 20 20 20 20 20 20 20  deo/gl"         
7130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7140: 20 7d 2c 0a 20 20 20 20 7b 20 22 67 74 61 72 22   },.    { "gtar"
7150: 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c  ,       4, "appl
7160: 69 63 61 74 69 6f 6e 2f 78 2d 67 74 61 72 22 20  ication/x-gtar" 
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
7180: 2c 0a 20 20 20 20 7b 20 22 67 7a 22 2c 20 20 20  ,.    { "gz",   
7190: 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63        2, "applic
71a0: 61 74 69 6f 6e 2f 78 2d 67 7a 69 70 22 20 20 20  ation/x-gzip"   
71b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
71c0: 20 20 20 20 7b 20 22 68 64 66 22 2c 20 20 20 20      { "hdf",    
71d0: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
71e0: 69 6f 6e 2f 78 2d 68 64 66 22 20 20 20 20 20 20  ion/x-hdf"      
71f0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
7200: 20 20 7b 20 22 68 68 22 2c 20 20 20 20 20 20 20    { "hh",       
7210: 20 20 32 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e    2, "text/plain
7220: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
7230: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
7240: 7b 20 22 68 71 78 22 2c 20 20 20 20 20 20 20 20  { "hqx",        
7250: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
7260: 6d 61 63 2d 62 69 6e 68 65 78 34 30 22 20 20 20  mac-binhex40"   
7270: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
7280: 22 68 22 2c 20 20 20 20 20 20 20 20 20 20 31 2c  "h",          1,
7290: 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 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 7d 2c 0a 20 20 20 20 7b 20 22 68       },.    { "h
72c0: 74 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  tm",        3, "
72d0: 74 65 78 74 2f 68 74 6d 6c 3b 20 63 68 61 72 73  text/html; chars
72e0: 65 74 3d 75 74 66 2d 38 22 20 20 20 20 20 20 20  et=utf-8"       
72f0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68 74 6d     },.    { "htm
7300: 6c 22 2c 20 20 20 20 20 20 20 34 2c 20 22 74 65  l",       4, "te
7310: 78 74 2f 68 74 6d 6c 3b 20 63 68 61 72 73 65 74  xt/html; charset
7320: 3d 75 74 66 2d 38 22 20 20 20 20 20 20 20 20 20  =utf-8"         
7330: 20 7d 2c 0a 20 20 20 20 7b 20 22 69 63 65 22 2c   },.    { "ice",
7340: 20 20 20 20 20 20 20 20 33 2c 20 22 78 2d 63 6f          3, "x-co
7350: 6e 66 65 72 65 6e 63 65 2f 78 2d 63 6f 6f 6c 74  nference/x-coolt
7360: 61 6c 6b 22 20 20 20 20 20 20 20 20 20 20 20 7d  alk"           }
7370: 2c 0a 20 20 20 20 7b 20 22 69 65 66 22 2c 20 20  ,.    { "ief",  
7380: 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f        3, "image/
7390: 69 65 66 22 20 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 7d 2c 0a               },.
73b0: 20 20 20 20 7b 20 22 69 67 65 73 22 2c 20 20 20      { "iges",   
73c0: 20 20 20 20 34 2c 20 22 6d 6f 64 65 6c 2f 69 67      4, "model/ig
73d0: 65 73 22 20 20 20 20 20 20 20 20 20 20 20 20 20  es"             
73e0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
73f0: 20 20 7b 20 22 69 67 73 22 2c 20 20 20 20 20 20    { "igs",      
7400: 20 20 33 2c 20 22 6d 6f 64 65 6c 2f 69 67 65 73    3, "model/iges
7410: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
7420: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
7430: 7b 20 22 69 70 73 22 2c 20 20 20 20 20 20 20 20  { "ips",        
7440: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
7450: 78 2d 69 70 73 63 72 69 70 74 22 20 20 20 20 20  x-ipscript"     
7460: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
7470: 22 69 70 78 22 2c 20 20 20 20 20 20 20 20 33 2c  "ipx",        3,
7480: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
7490: 69 70 69 78 22 20 20 20 20 20 20 20 20 20 20 20  ipix"           
74a0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a       },.    { "j
74b0: 61 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ad",        3, "
74c0: 74 65 78 74 2f 76 6e 64 2e 73 75 6e 2e 6a 32 6d  text/vnd.sun.j2m
74d0: 65 2e 61 70 70 2d 64 65 73 63 72 69 70 74 6f 72  e.app-descriptor
74e0: 22 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 61 72  "  },.    { "jar
74f0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
7500: 70 6c 69 63 61 74 69 6f 6e 2f 6a 61 76 61 2d 61  plication/java-a
7510: 72 63 68 69 76 65 22 20 20 20 20 20 20 20 20 20  rchive"         
7520: 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 70 65 67 22   },.    { "jpeg"
7530: 2c 20 20 20 20 20 20 20 34 2c 20 22 69 6d 61 67  ,       4, "imag
7540: 65 2f 6a 70 65 67 22 20 20 20 20 20 20 20 20 20  e/jpeg"         
7550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
7560: 2c 0a 20 20 20 20 7b 20 22 6a 70 65 22 2c 20 20  ,.    { "jpe",  
7570: 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f        3, "image/
7580: 6a 70 65 67 22 20 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 7d 2c 0a               },.
75a0: 20 20 20 20 7b 20 22 6a 70 67 22 2c 20 20 20 20      { "jpg",    
75b0: 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 6a 70      3, "image/jp
75c0: 65 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20  eg"             
75d0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
75e0: 20 20 7b 20 22 6a 73 22 2c 20 20 20 20 20 20 20    { "js",       
75f0: 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    2, "applicatio
7600: 6e 2f 78 2d 6a 61 76 61 73 63 72 69 70 74 22 20  n/x-javascript" 
7610: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
7620: 7b 20 22 6b 61 72 22 2c 20 20 20 20 20 20 20 20  { "kar",        
7630: 33 2c 20 22 61 75 64 69 6f 2f 6d 69 64 69 22 20  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 7d 2c 0a 20 20 20 20 7b 20         },.    { 
7660: 22 6c 61 74 65 78 22 2c 20 20 20 20 20 20 35 2c  "latex",      5,
7670: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
7680: 6c 61 74 65 78 22 20 20 20 20 20 20 20 20 20 20  latex"          
7690: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c       },.    { "l
76a0: 68 61 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ha",        3, "
76b0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65  application/octe
76c0: 74 2d 73 74 72 65 61 6d 22 20 20 20 20 20 20 20  t-stream"       
76d0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 73 70     },.    { "lsp
76e0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
76f0: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6c 69 73 70  plication/x-lisp
7700: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
7710: 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 7a 68 22 2c   },.    { "lzh",
7720: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
7730: 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74  ication/octet-st
7740: 72 65 61 6d 22 20 20 20 20 20 20 20 20 20 20 7d  ream"          }
7750: 2c 0a 20 20 20 20 7b 20 22 6d 22 2c 20 20 20 20  ,.    { "m",    
7760: 20 20 20 20 20 20 31 2c 20 22 74 65 78 74 2f 70        1, "text/p
7770: 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20 20 20  lain"           
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
7790: 20 20 20 20 7b 20 22 6d 33 75 22 2c 20 20 20 20      { "m3u",    
77a0: 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d      3, "audio/x-
77b0: 6d 70 65 67 75 72 6c 22 20 20 20 20 20 20 20 20  mpegurl"        
77c0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
77d0: 20 20 7b 20 22 6d 61 6e 22 2c 20 20 20 20 20 20    { "man",      
77e0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
77f0: 6e 2f 78 2d 74 72 6f 66 66 2d 6d 61 6e 22 20 20  n/x-troff-man"  
7800: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
7810: 7b 20 22 6d 65 22 2c 20 20 20 20 20 20 20 20 20  { "me",         
7820: 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  2, "application/
7830: 78 2d 74 72 6f 66 66 2d 6d 65 22 20 20 20 20 20  x-troff-me"     
7840: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
7850: 22 6d 65 73 68 22 2c 20 20 20 20 20 20 20 34 2c  "mesh",       4,
7860: 20 22 6d 6f 64 65 6c 2f 6d 65 73 68 22 20 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 7d 2c 0a 20 20 20 20 7b 20 22 6d       },.    { "m
7890: 69 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  id",        3, "
78a0: 61 75 64 69 6f 2f 6d 69 64 69 22 20 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 7d 2c 0a 20 20 20 20 7b 20 22 6d 69 64     },.    { "mid
78d0: 69 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 75  i",       4, "au
78e0: 64 69 6f 2f 6d 69 64 69 22 20 20 20 20 20 20 20  dio/midi"       
78f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7900: 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 69 66 22 2c   },.    { "mif",
7910: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
7920: 69 63 61 74 69 6f 6e 2f 78 2d 6d 69 66 22 20 20  ication/x-mif"  
7930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
7940: 2c 0a 20 20 20 20 7b 20 22 6d 69 6d 65 22 2c 20  ,.    { "mime", 
7950: 20 20 20 20 20 20 34 2c 20 22 77 77 77 2f 6d 69        4, "www/mi
7960: 6d 65 22 20 20 20 20 20 20 20 20 20 20 20 20 20  me"             
7970: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
7980: 20 20 20 20 7b 20 22 6d 6f 76 69 65 22 2c 20 20      { "movie",  
7990: 20 20 20 20 35 2c 20 22 76 69 64 65 6f 2f 78 2d      5, "video/x-
79a0: 73 67 69 2d 6d 6f 76 69 65 22 20 20 20 20 20 20  sgi-movie"      
79b0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
79c0: 20 20 7b 20 22 6d 6f 76 22 2c 20 20 20 20 20 20    { "mov",      
79d0: 20 20 33 2c 20 22 76 69 64 65 6f 2f 71 75 69 63    3, "video/quic
79e0: 6b 74 69 6d 65 22 20 20 20 20 20 20 20 20 20 20  ktime"          
79f0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
7a00: 7b 20 22 6d 70 32 22 2c 20 20 20 20 20 20 20 20  { "mp2",        
7a10: 33 2c 20 22 61 75 64 69 6f 2f 6d 70 65 67 22 20  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 7d 2c 0a 20 20 20 20 7b 20         },.    { 
7a40: 22 6d 70 32 22 2c 20 20 20 20 20 20 20 20 33 2c  "mp2",        3,
7a50: 20 22 76 69 64 65 6f 2f 6d 70 65 67 22 20 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 7d 2c 0a 20 20 20 20 7b 20 22 6d       },.    { "m
7a80: 70 33 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  p3",        3, "
7a90: 61 75 64 69 6f 2f 6d 70 65 67 22 20 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 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 65     },.    { "mpe
7ac0: 67 22 2c 20 20 20 20 20 20 20 34 2c 20 22 76 69  g",       4, "vi
7ad0: 64 65 6f 2f 6d 70 65 67 22 20 20 20 20 20 20 20  deo/mpeg"       
7ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7af0: 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 65 22 2c   },.    { "mpe",
7b00: 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64 65          3, "vide
7b10: 6f 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20 20  o/mpeg"         
7b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
7b30: 2c 0a 20 20 20 20 7b 20 22 6d 70 67 61 22 2c 20  ,.    { "mpga", 
7b40: 20 20 20 20 20 20 34 2c 20 22 61 75 64 69 6f 2f        4, "audio/
7b50: 6d 70 65 67 22 20 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 7d 2c 0a               },.
7b70: 20 20 20 20 7b 20 22 6d 70 67 22 2c 20 20 20 20      { "mpg",    
7b80: 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 6d 70      3, "video/mp
7b90: 65 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20  eg"             
7ba0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
7bb0: 20 20 7b 20 22 6d 73 22 2c 20 20 20 20 20 20 20    { "ms",       
7bc0: 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    2, "applicatio
7bd0: 6e 2f 78 2d 74 72 6f 66 66 2d 6d 73 22 20 20 20  n/x-troff-ms"   
7be0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
7bf0: 7b 20 22 6d 73 68 22 2c 20 20 20 20 20 20 20 20  { "msh",        
7c00: 33 2c 20 22 6d 6f 64 65 6c 2f 6d 65 73 68 22 20  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 7d 2c 0a 20 20 20 20 7b 20         },.    { 
7c30: 22 6e 63 22 2c 20 20 20 20 20 20 20 20 20 32 2c  "nc",         2,
7c40: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
7c50: 6e 65 74 63 64 66 22 20 20 20 20 20 20 20 20 20  netcdf"         
7c60: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f       },.    { "o
7c70: 64 61 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  da",        3, "
7c80: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 64 61 22  application/oda"
7c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ca0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 67 67     },.    { "ogg
7cb0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
7cc0: 70 6c 69 63 61 74 69 6f 6e 2f 6f 67 67 22 20 20  plication/ogg"  
7cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ce0: 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 67 6d 22 2c   },.    { "ogm",
7cf0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
7d00: 69 63 61 74 69 6f 6e 2f 6f 67 67 22 20 20 20 20  ication/ogg"    
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
7d20: 2c 0a 20 20 20 20 7b 20 22 70 62 6d 22 2c 20 20  ,.    { "pbm",  
7d30: 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f        3, "image/
7d40: 78 2d 70 6f 72 74 61 62 6c 65 2d 62 69 74 6d 61  x-portable-bitma
7d50: 70 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  p"           },.
7d60: 20 20 20 20 7b 20 22 70 64 62 22 2c 20 20 20 20      { "pdb",    
7d70: 20 20 20 20 33 2c 20 22 63 68 65 6d 69 63 61 6c      3, "chemical
7d80: 2f 78 2d 70 64 62 22 20 20 20 20 20 20 20 20 20  /x-pdb"         
7d90: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
7da0: 20 20 7b 20 22 70 64 66 22 2c 20 20 20 20 20 20    { "pdf",      
7db0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
7dc0: 6e 2f 70 64 66 22 20 20 20 20 20 20 20 20 20 20  n/pdf"          
7dd0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
7de0: 7b 20 22 70 67 6d 22 2c 20 20 20 20 20 20 20 20  { "pgm",        
7df0: 33 2c 20 22 69 6d 61 67 65 2f 78 2d 70 6f 72 74  3, "image/x-port
7e00: 61 62 6c 65 2d 67 72 61 79 6d 61 70 22 20 20 20  able-graymap"   
7e10: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
7e20: 22 70 67 6e 22 2c 20 20 20 20 20 20 20 20 33 2c  "pgn",        3,
7e30: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
7e40: 63 68 65 73 73 2d 70 67 6e 22 20 20 20 20 20 20  chess-pgn"      
7e50: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70       },.    { "p
7e60: 67 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  gp",        3, "
7e70: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 67 70 22  application/pgp"
7e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e90: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 6c 22     },.    { "pl"
7ea0: 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70  ,         2, "ap
7eb0: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 70 65 72 6c  plication/x-perl
7ec0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
7ed0: 20 7d 2c 0a 20 20 20 20 7b 20 22 70 6d 22 2c 20   },.    { "pm", 
7ee0: 20 20 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c          2, "appl
7ef0: 69 63 61 74 69 6f 6e 2f 78 2d 70 65 72 6c 22 20  ication/x-perl" 
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
7f10: 2c 0a 20 20 20 20 7b 20 22 70 6e 67 22 2c 20 20  ,.    { "png",  
7f20: 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f        3, "image/
7f30: 70 6e 67 22 20 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 7d 2c 0a               },.
7f50: 20 20 20 20 7b 20 22 70 6e 6d 22 2c 20 20 20 20      { "pnm",    
7f60: 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d      3, "image/x-
7f70: 70 6f 72 74 61 62 6c 65 2d 61 6e 79 6d 61 70 22  portable-anymap"
7f80: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
7f90: 20 20 7b 20 22 70 6f 74 22 2c 20 20 20 20 20 20    { "pot",      
7fa0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
7fb0: 6e 2f 6d 73 70 6f 77 65 72 70 6f 69 6e 74 22 20  n/mspowerpoint" 
7fc0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
7fd0: 7b 20 22 70 70 6d 22 2c 20 20 20 20 20 20 20 20  { "ppm",        
7fe0: 33 2c 20 22 69 6d 61 67 65 2f 78 2d 70 6f 72 74  3, "image/x-port
7ff0: 61 62 6c 65 2d 70 69 78 6d 61 70 22 20 20 20 20  able-pixmap"    
8000: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8010: 22 70 70 73 22 2c 20 20 20 20 20 20 20 20 33 2c  "pps",        3,
8020: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73   "application/ms
8030: 70 6f 77 65 72 70 6f 69 6e 74 22 20 20 20 20 20  powerpoint"     
8040: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70       },.    { "p
8050: 70 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  pt",        3, "
8060: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 70 6f  application/mspo
8070: 77 65 72 70 6f 69 6e 74 22 20 20 20 20 20 20 20  werpoint"       
8080: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 70 7a     },.    { "ppz
8090: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
80a0: 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 70 6f 77 65  plication/mspowe
80b0: 72 70 6f 69 6e 74 22 20 20 20 20 20 20 20 20 20  rpoint"         
80c0: 20 7d 2c 0a 20 20 20 20 7b 20 22 70 72 65 22 2c   },.    { "pre",
80d0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
80e0: 69 63 61 74 69 6f 6e 2f 78 2d 66 72 65 65 6c 61  ication/x-freela
80f0: 6e 63 65 22 20 20 20 20 20 20 20 20 20 20 20 7d  nce"           }
8100: 2c 0a 20 20 20 20 7b 20 22 70 72 74 22 2c 20 20  ,.    { "prt",  
8110: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
8120: 61 74 69 6f 6e 2f 70 72 6f 5f 65 6e 67 22 20 20  ation/pro_eng"  
8130: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
8140: 20 20 20 20 7b 20 22 70 73 22 2c 20 20 20 20 20      { "ps",     
8150: 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74      2, "applicat
8160: 69 6f 6e 2f 70 6f 73 74 73 63 72 69 70 74 22 20  ion/postscript" 
8170: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8180: 20 20 7b 20 22 71 74 22 2c 20 20 20 20 20 20 20    { "qt",       
8190: 20 20 32 2c 20 22 76 69 64 65 6f 2f 71 75 69 63    2, "video/quic
81a0: 6b 74 69 6d 65 22 20 20 20 20 20 20 20 20 20 20  ktime"          
81b0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
81c0: 7b 20 22 72 61 22 2c 20 20 20 20 20 20 20 20 20  { "ra",         
81d0: 32 2c 20 22 61 75 64 69 6f 2f 78 2d 72 65 61 6c  2, "audio/x-real
81e0: 61 75 64 69 6f 22 20 20 20 20 20 20 20 20 20 20  audio"          
81f0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8200: 22 72 61 6d 22 2c 20 20 20 20 20 20 20 20 33 2c  "ram",        3,
8210: 20 22 61 75 64 69 6f 2f 78 2d 70 6e 2d 72 65 61   "audio/x-pn-rea
8220: 6c 61 75 64 69 6f 22 20 20 20 20 20 20 20 20 20  laudio"         
8230: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72       },.    { "r
8240: 61 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ar",        3, "
8250: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 72 61  application/x-ra
8260: 72 2d 63 6f 6d 70 72 65 73 73 65 64 22 20 20 20  r-compressed"   
8270: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61 73     },.    { "ras
8280: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d  ",        3, "im
8290: 61 67 65 2f 63 6d 75 2d 72 61 73 74 65 72 22 20  age/cmu-raster" 
82a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82b0: 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61 73 22 2c   },.    { "ras",
82c0: 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67          3, "imag
82d0: 65 2f 78 2d 63 6d 75 2d 72 61 73 74 65 72 22 20  e/x-cmu-raster" 
82e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
82f0: 2c 0a 20 20 20 20 7b 20 22 72 67 62 22 2c 20 20  ,.    { "rgb",  
8300: 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f        3, "image/
8310: 78 2d 72 67 62 22 20 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 7d 2c 0a               },.
8330: 20 20 20 20 7b 20 22 72 6d 22 2c 20 20 20 20 20      { "rm",     
8340: 20 20 20 20 32 2c 20 22 61 75 64 69 6f 2f 78 2d      2, "audio/x-
8350: 70 6e 2d 72 65 61 6c 61 75 64 69 6f 22 20 20 20  pn-realaudio"   
8360: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8370: 20 20 7b 20 22 72 6f 66 66 22 2c 20 20 20 20 20    { "roff",     
8380: 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    4, "applicatio
8390: 6e 2f 78 2d 74 72 6f 66 66 22 20 20 20 20 20 20  n/x-troff"      
83a0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
83b0: 7b 20 22 72 70 6d 22 2c 20 20 20 20 20 20 20 20  { "rpm",        
83c0: 33 2c 20 22 61 75 64 69 6f 2f 78 2d 70 6e 2d 72  3, "audio/x-pn-r
83d0: 65 61 6c 61 75 64 69 6f 2d 70 6c 75 67 69 6e 22  ealaudio-plugin"
83e0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
83f0: 22 72 74 66 22 2c 20 20 20 20 20 20 20 20 33 2c  "rtf",        3,
8400: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 72 74   "application/rt
8410: 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f"              
8420: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72       },.    { "r
8430: 74 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  tf",        3, "
8440: 74 65 78 74 2f 72 74 66 22 20 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 7d 2c 0a 20 20 20 20 7b 20 22 72 74 78     },.    { "rtx
8470: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65  ",        3, "te
8480: 78 74 2f 72 69 63 68 74 65 78 74 22 20 20 20 20  xt/richtext"    
8490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84a0: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 63 6d 22 2c   },.    { "scm",
84b0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
84c0: 69 63 61 74 69 6f 6e 2f 78 2d 6c 6f 74 75 73 73  ication/x-lotuss
84d0: 63 72 65 65 6e 63 61 6d 22 20 20 20 20 20 20 7d  creencam"      }
84e0: 2c 0a 20 20 20 20 7b 20 22 73 65 74 22 2c 20 20  ,.    { "set",  
84f0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
8500: 61 74 69 6f 6e 2f 73 65 74 22 20 20 20 20 20 20  ation/set"      
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
8520: 20 20 20 20 7b 20 22 73 67 6d 6c 22 2c 20 20 20      { "sgml",   
8530: 20 20 20 20 34 2c 20 22 74 65 78 74 2f 73 67 6d      4, "text/sgm
8540: 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l"              
8550: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8560: 20 20 7b 20 22 73 67 6d 22 2c 20 20 20 20 20 20    { "sgm",      
8570: 20 20 33 2c 20 22 74 65 78 74 2f 73 67 6d 6c 22    3, "text/sgml"
8580: 20 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 7d 2c 0a 20 20 20 20           },.    
85a0: 7b 20 22 73 68 22 2c 20 20 20 20 20 20 20 20 20  { "sh",         
85b0: 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  2, "application/
85c0: 78 2d 73 68 22 20 20 20 20 20 20 20 20 20 20 20  x-sh"           
85d0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
85e0: 22 73 68 61 72 22 2c 20 20 20 20 20 20 20 34 2c  "shar",       4,
85f0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
8600: 73 68 61 72 22 20 20 20 20 20 20 20 20 20 20 20  shar"           
8610: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73       },.    { "s
8620: 69 6c 6f 22 2c 20 20 20 20 20 20 20 34 2c 20 22  ilo",       4, "
8630: 6d 6f 64 65 6c 2f 6d 65 73 68 22 20 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 7d 2c 0a 20 20 20 20 7b 20 22 73 69 74     },.    { "sit
8660: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
8670: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 74 75 66  plication/x-stuf
8680: 66 69 74 22 20 20 20 20 20 20 20 20 20 20 20 20  fit"            
8690: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6b 64 22 2c   },.    { "skd",
86a0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
86b0: 69 63 61 74 69 6f 6e 2f 78 2d 6b 6f 61 6e 22 20  ication/x-koan" 
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
86d0: 2c 0a 20 20 20 20 7b 20 22 73 6b 6d 22 2c 20 20  ,.    { "skm",  
86e0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
86f0: 61 74 69 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20  ation/x-koan"   
8700: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
8710: 20 20 20 20 7b 20 22 73 6b 70 22 2c 20 20 20 20      { "skp",    
8720: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
8730: 69 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20 20 20  ion/x-koan"     
8740: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8750: 20 20 7b 20 22 73 6b 74 22 2c 20 20 20 20 20 20    { "skt",      
8760: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
8770: 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20 20 20 20 20  n/x-koan"       
8780: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
8790: 7b 20 22 73 6d 69 22 2c 20 20 20 20 20 20 20 20  { "smi",        
87a0: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
87b0: 73 6d 69 6c 22 20 20 20 20 20 20 20 20 20 20 20  smil"           
87c0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
87d0: 22 73 6d 69 6c 22 2c 20 20 20 20 20 20 20 34 2c  "smil",       4,
87e0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 73 6d   "application/sm
87f0: 69 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20  il"             
8800: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73       },.    { "s
8810: 6e 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  nd",        3, "
8820: 61 75 64 69 6f 2f 62 61 73 69 63 22 20 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 7d 2c 0a 20 20 20 20 7b 20 22 73 6f 6c     },.    { "sol
8850: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
8860: 70 6c 69 63 61 74 69 6f 6e 2f 73 6f 6c 69 64 73  plication/solids
8870: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8880: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 70 6c 22 2c   },.    { "spl",
8890: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
88a0: 69 63 61 74 69 6f 6e 2f 78 2d 66 75 74 75 72 65  ication/x-future
88b0: 73 70 6c 61 73 68 22 20 20 20 20 20 20 20 20 7d  splash"        }
88c0: 2c 0a 20 20 20 20 7b 20 22 73 72 63 22 2c 20 20  ,.    { "src",  
88d0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
88e0: 61 74 69 6f 6e 2f 78 2d 77 61 69 73 2d 73 6f 75  ation/x-wais-sou
88f0: 72 63 65 22 20 20 20 20 20 20 20 20 20 7d 2c 0a  rce"         },.
8900: 20 20 20 20 7b 20 22 73 74 65 70 22 2c 20 20 20      { "step",   
8910: 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74      4, "applicat
8920: 69 6f 6e 2f 53 54 45 50 22 20 20 20 20 20 20 20  ion/STEP"       
8930: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8940: 20 20 7b 20 22 73 74 6c 22 2c 20 20 20 20 20 20    { "stl",      
8950: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
8960: 6e 2f 53 4c 41 22 20 20 20 20 20 20 20 20 20 20  n/SLA"          
8970: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
8980: 7b 20 22 73 74 70 22 2c 20 20 20 20 20 20 20 20  { "stp",        
8990: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
89a0: 53 54 45 50 22 20 20 20 20 20 20 20 20 20 20 20  STEP"           
89b0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
89c0: 22 73 76 34 63 70 69 6f 22 2c 20 20 20 20 37 2c  "sv4cpio",    7,
89d0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
89e0: 73 76 34 63 70 69 6f 22 20 20 20 20 20 20 20 20  sv4cpio"        
89f0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73       },.    { "s
8a00: 76 34 63 72 63 22 2c 20 20 20 20 20 36 2c 20 22  v4crc",     6, "
8a10: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 76  application/x-sv
8a20: 34 63 72 63 22 20 20 20 20 20 20 20 20 20 20 20  4crc"           
8a30: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 77 66     },.    { "swf
8a40: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
8a50: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 68 6f 63  plication/x-shoc
8a60: 6b 77 61 76 65 2d 66 6c 61 73 68 22 20 20 20 20  kwave-flash"    
8a70: 20 7d 2c 0a 20 20 20 20 7b 20 22 74 22 2c 20 20   },.    { "t",  
8a80: 20 20 20 20 20 20 20 20 31 2c 20 22 61 70 70 6c          1, "appl
8a90: 69 63 61 74 69 6f 6e 2f 78 2d 74 72 6f 66 66 22  ication/x-troff"
8aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8ab0: 2c 0a 20 20 20 20 7b 20 22 74 61 72 22 2c 20 20  ,.    { "tar",  
8ac0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
8ad0: 61 74 69 6f 6e 2f 78 2d 74 61 72 22 20 20 20 20  ation/x-tar"    
8ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
8af0: 20 20 20 20 7b 20 22 74 63 6c 22 2c 20 20 20 20      { "tcl",    
8b00: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
8b10: 69 6f 6e 2f 78 2d 74 63 6c 22 20 20 20 20 20 20  ion/x-tcl"      
8b20: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8b30: 20 20 7b 20 22 74 65 78 22 2c 20 20 20 20 20 20    { "tex",      
8b40: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
8b50: 6e 2f 78 2d 74 65 78 22 20 20 20 20 20 20 20 20  n/x-tex"        
8b60: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
8b70: 7b 20 22 74 65 78 69 22 2c 20 20 20 20 20 20 20  { "texi",       
8b80: 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  4, "application/
8b90: 78 2d 74 65 78 69 6e 66 6f 22 20 20 20 20 20 20  x-texinfo"      
8ba0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8bb0: 22 74 65 78 69 6e 66 6f 22 2c 20 20 20 20 37 2c  "texinfo",    7,
8bc0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
8bd0: 74 65 78 69 6e 66 6f 22 20 20 20 20 20 20 20 20  texinfo"        
8be0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74       },.    { "t
8bf0: 67 7a 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  gz",        3, "
8c00: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 61  application/x-ta
8c10: 72 2d 67 7a 22 20 20 20 20 20 20 20 20 20 20 20  r-gz"           
8c20: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 69 66     },.    { "tif
8c30: 66 22 2c 20 20 20 20 20 20 20 34 2c 20 22 69 6d  f",       4, "im
8c40: 61 67 65 2f 74 69 66 66 22 20 20 20 20 20 20 20  age/tiff"       
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c60: 20 7d 2c 0a 20 20 20 20 7b 20 22 74 69 66 22 2c   },.    { "tif",
8c70: 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67          3, "imag
8c80: 65 2f 74 69 66 66 22 20 20 20 20 20 20 20 20 20  e/tiff"         
8c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8ca0: 2c 0a 20 20 20 20 7b 20 22 74 72 22 2c 20 20 20  ,.    { "tr",   
8cb0: 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63        2, "applic
8cc0: 61 74 69 6f 6e 2f 78 2d 74 72 6f 66 66 22 20 20  ation/x-troff"  
8cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
8ce0: 20 20 20 20 7b 20 22 74 73 69 22 2c 20 20 20 20      { "tsi",    
8cf0: 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 54 53      3, "audio/TS
8d00: 50 2d 61 75 64 69 6f 22 20 20 20 20 20 20 20 20  P-audio"        
8d10: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8d20: 20 20 7b 20 22 74 73 70 22 2c 20 20 20 20 20 20    { "tsp",      
8d30: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
8d40: 6e 2f 64 73 70 74 79 70 65 22 20 20 20 20 20 20  n/dsptype"      
8d50: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
8d60: 7b 20 22 74 73 76 22 2c 20 20 20 20 20 20 20 20  { "tsv",        
8d70: 33 2c 20 22 74 65 78 74 2f 74 61 62 2d 73 65 70  3, "text/tab-sep
8d80: 61 72 61 74 65 64 2d 76 61 6c 75 65 73 22 20 20  arated-values"  
8d90: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8da0: 22 74 78 74 22 2c 20 20 20 20 20 20 20 20 33 2c  "txt",        3,
8db0: 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 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 7d 2c 0a 20 20 20 20 7b 20 22 75       },.    { "u
8de0: 6e 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  nv",        3, "
8df0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 69 2d 64 65  application/i-de
8e00: 61 73 22 20 20 20 20 20 20 20 20 20 20 20 20 20  as"             
8e10: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 75 73 74     },.    { "ust
8e20: 61 72 22 2c 20 20 20 20 20 20 35 2c 20 22 61 70  ar",      5, "ap
8e30: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 75 73 74 61  plication/x-usta
8e40: 72 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r"              
8e50: 20 7d 2c 0a 20 20 20 20 7b 20 22 76 63 64 22 2c   },.    { "vcd",
8e60: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
8e70: 69 63 61 74 69 6f 6e 2f 78 2d 63 64 6c 69 6e 6b  ication/x-cdlink
8e80: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  "              }
8e90: 2c 0a 20 20 20 20 7b 20 22 76 64 61 22 2c 20 20  ,.    { "vda",  
8ea0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
8eb0: 61 74 69 6f 6e 2f 76 64 61 22 20 20 20 20 20 20  ation/vda"      
8ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
8ed0: 20 20 20 20 7b 20 22 76 69 76 22 2c 20 20 20 20      { "viv",    
8ee0: 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 76 6e      3, "video/vn
8ef0: 64 2e 76 69 76 6f 22 20 20 20 20 20 20 20 20 20  d.vivo"         
8f00: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8f10: 20 20 7b 20 22 76 69 76 6f 22 2c 20 20 20 20 20    { "vivo",     
8f20: 20 20 34 2c 20 22 76 69 64 65 6f 2f 76 6e 64 2e    4, "video/vnd.
8f30: 76 69 76 6f 22 20 20 20 20 20 20 20 20 20 20 20  vivo"           
8f40: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
8f50: 7b 20 22 76 72 6d 6c 22 2c 20 20 20 20 20 20 20  { "vrml",       
8f60: 34 2c 20 22 6d 6f 64 65 6c 2f 76 72 6d 6c 22 20  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 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8f90: 22 76 73 69 78 22 2c 20 20 20 20 20 20 20 34 2c  "vsix",       4,
8fa0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76 73   "application/vs
8fb0: 69 78 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ix"             
8fc0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77       },.    { "w
8fd0: 61 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  av",        3, "
8fe0: 61 75 64 69 6f 2f 78 2d 77 61 76 22 20 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 7d 2c 0a 20 20 20 20 7b 20 22 77 61 78     },.    { "wax
9010: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75  ",        3, "au
9020: 64 69 6f 2f 78 2d 6d 73 2d 77 61 78 22 20 20 20  dio/x-ms-wax"   
9030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9040: 20 7d 2c 0a 20 20 20 20 7b 20 22 77 69 6b 69 22   },.    { "wiki"
9050: 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c  ,       4, "appl
9060: 69 63 61 74 69 6f 6e 2f 78 2d 66 6f 73 73 69 6c  ication/x-fossil
9070: 2d 77 69 6b 69 22 20 20 20 20 20 20 20 20 20 7d  -wiki"         }
9080: 2c 0a 20 20 20 20 7b 20 22 77 6d 61 22 2c 20 20  ,.    { "wma",  
9090: 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f        3, "audio/
90a0: 78 2d 6d 73 2d 77 6d 61 22 20 20 20 20 20 20 20  x-ms-wma"       
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
90c0: 20 20 20 20 7b 20 22 77 6d 76 22 2c 20 20 20 20      { "wmv",    
90d0: 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d      3, "video/x-
90e0: 6d 73 2d 77 6d 76 22 20 20 20 20 20 20 20 20 20  ms-wmv"         
90f0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
9100: 20 20 7b 20 22 77 6d 78 22 2c 20 20 20 20 20 20    { "wmx",      
9110: 20 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73    3, "video/x-ms
9120: 2d 77 6d 78 22 20 20 20 20 20 20 20 20 20 20 20  -wmx"           
9130: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9140: 7b 20 22 77 72 6c 22 2c 20 20 20 20 20 20 20 20  { "wrl",        
9150: 33 2c 20 22 6d 6f 64 65 6c 2f 76 72 6d 6c 22 20  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 7d 2c 0a 20 20 20 20 7b 20         },.    { 
9180: 22 77 76 78 22 2c 20 20 20 20 20 20 20 20 33 2c  "wvx",        3,
9190: 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 77 76 78   "video/x-ms-wvx
91a0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
91b0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78       },.    { "x
91c0: 62 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  bm",        3, "
91d0: 69 6d 61 67 65 2f 78 2d 78 62 69 74 6d 61 70 22  image/x-xbitmap"
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91f0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 6c 63     },.    { "xlc
9200: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
9210: 70 6c 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73  plication/vnd.ms
9220: 2d 65 78 63 65 6c 22 20 20 20 20 20 20 20 20 20  -excel"         
9230: 20 7d 2c 0a 20 20 20 20 7b 20 22 78 6c 6c 22 2c   },.    { "xll",
9240: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
9250: 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65  ication/vnd.ms-e
9260: 78 63 65 6c 22 20 20 20 20 20 20 20 20 20 20 7d  xcel"          }
9270: 2c 0a 20 20 20 20 7b 20 22 78 6c 6d 22 2c 20 20  ,.    { "xlm",  
9280: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
9290: 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63  ation/vnd.ms-exc
92a0: 65 6c 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  el"          },.
92b0: 20 20 20 20 7b 20 22 78 6c 73 22 2c 20 20 20 20      { "xls",    
92c0: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
92d0: 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c  ion/vnd.ms-excel
92e0: 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  "          },.  
92f0: 20 20 7b 20 22 78 6c 77 22 2c 20 20 20 20 20 20    { "xlw",      
9300: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
9310: 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20  n/vnd.ms-excel" 
9320: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9330: 7b 20 22 78 6d 6c 22 2c 20 20 20 20 20 20 20 20  { "xml",        
9340: 33 2c 20 22 74 65 78 74 2f 78 6d 6c 22 20 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 7d 2c 0a 20 20 20 20 7b 20         },.    { 
9370: 22 78 70 6d 22 2c 20 20 20 20 20 20 20 20 33 2c  "xpm",        3,
9380: 20 22 69 6d 61 67 65 2f 78 2d 78 70 69 78 6d 61   "image/x-xpixma
9390: 70 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p"              
93a0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78       },.    { "x
93b0: 77 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  wd",        3, "
93c0: 69 6d 61 67 65 2f 78 2d 78 77 69 6e 64 6f 77 64  image/x-xwindowd
93d0: 75 6d 70 22 20 20 20 20 20 20 20 20 20 20 20 20  ump"            
93e0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 79 7a     },.    { "xyz
93f0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 63 68  ",        3, "ch
9400: 65 6d 69 63 61 6c 2f 78 2d 70 64 62 22 20 20 20  emical/x-pdb"   
9410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9420: 20 7d 2c 0a 20 20 20 20 7b 20 22 7a 69 70 22 2c   },.    { "zip",
9430: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
9440: 69 63 61 74 69 6f 6e 2f 7a 69 70 22 20 20 20 20  ication/zip"    
9450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
9460: 2c 0a 20 20 7d 3b 0a 0a 20 20 66 6f 72 28 69 3d  ,.  };..  for(i=
9470: 6e 4e 61 6d 65 2d 31 3b 20 69 3e 30 20 26 26 20  nName-1; i>0 && 
9480: 7a 4e 61 6d 65 5b 69 5d 21 3d 27 2e 27 3b 20 69  zName[i]!='.'; i
9490: 2d 2d 29 7b 7d 0a 20 20 7a 20 3d 20 26 7a 4e 61  --){}.  z = &zNa
94a0: 6d 65 5b 69 2b 31 5d 3b 0a 20 20 6c 65 6e 20 3d  me[i+1];.  len =
94b0: 20 6e 4e 61 6d 65 20 2d 20 69 3b 0a 20 20 69 66   nName - i;.  if
94c0: 28 20 6c 65 6e 3c 28 69 6e 74 29 73 69 7a 65 6f  ( len<(int)sizeo
94d0: 66 28 7a 53 75 66 66 69 78 29 2d 31 20 29 7b 0a  f(zSuffix)-1 ){.
94e0: 20 20 20 20 73 74 72 63 70 79 28 7a 53 75 66 66      strcpy(zSuff
94f0: 69 78 2c 20 7a 29 3b 0a 20 20 20 20 66 6f 72 28  ix, z);.    for(
9500: 69 3d 30 3b 20 7a 53 75 66 66 69 78 5b 69 5d 3b  i=0; zSuffix[i];
9510: 20 69 2b 2b 29 20 7a 53 75 66 66 69 78 5b 69 5d   i++) zSuffix[i]
9520: 20 3d 20 74 6f 6c 6f 77 65 72 28 7a 53 75 66 66   = tolower(zSuff
9530: 69 78 5b 69 5d 29 3b 0a 20 20 20 20 66 69 72 73  ix[i]);.    firs
9540: 74 20 3d 20 30 3b 0a 20 20 20 20 6c 61 73 74 20  t = 0;.    last 
9550: 3d 20 73 69 7a 65 6f 66 28 61 4d 69 6d 65 29 2f  = sizeof(aMime)/
9560: 73 69 7a 65 6f 66 28 61 4d 69 6d 65 5b 30 5d 29  sizeof(aMime[0])
9570: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 66 69 72  ;.    while( fir
9580: 73 74 3c 3d 6c 61 73 74 20 29 7b 0a 20 20 20 20  st<=last ){.    
9590: 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 69    int c;.      i
95a0: 20 3d 20 28 66 69 72 73 74 2b 6c 61 73 74 29 2f   = (first+last)/
95b0: 32 3b 0a 20 20 20 20 20 20 63 20 3d 20 73 74 72  2;.      c = str
95c0: 63 6d 70 28 7a 53 75 66 66 69 78 2c 20 61 4d 69  cmp(zSuffix, aMi
95d0: 6d 65 5b 69 5d 2e 7a 53 75 66 66 69 78 29 3b 0a  me[i].zSuffix);.
95e0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
95f0: 20 72 65 74 75 72 6e 20 61 4d 69 6d 65 5b 69 5d   return aMime[i]
9600: 2e 7a 4d 69 6d 65 74 79 70 65 3b 0a 20 20 20 20  .zMimetype;.    
9610: 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20    if( c<0 ){.   
9620: 20 20 20 20 20 6c 61 73 74 20 3d 20 69 2d 31 3b       last = i-1;
9630: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9640: 20 20 20 20 20 20 66 69 72 73 74 20 3d 20 69 2b        first = i+
9650: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
9660: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 61  .  }.  return "a
9670: 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74  pplication/octet
9680: 2d 73 74 72 65 61 6d 22 3b 0a 7d 0a 0a 2f 2a 0a  -stream";.}../*.
9690: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
96a0: 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20   table contains 
96b0: 31 20 66 6f 72 20 61 6c 6c 20 63 68 61 72 61 63  1 for all charac
96c0: 74 65 72 73 20 74 68 61 74 20 61 72 65 20 70 65  ters that are pe
96d0: 72 6d 69 74 74 65 64 20 69 6e 0a 2a 2a 20 74 68  rmitted in.** th
96e0: 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 55 52  e part of the UR
96f0: 4c 20 62 65 66 6f 72 65 20 74 68 65 20 71 75 65  L before the que
9700: 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 61 6e  ry parameters an
9710: 64 20 66 72 61 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d fragment..**.*
9720: 2a 20 41 6c 6c 6f 77 65 64 20 63 68 61 72 61 63  * Allowed charac
9730: 74 65 72 73 3a 20 20 30 2d 39 61 2d 7a 41 2d 5a  ters:  0-9a-zA-Z
9740: 2c 2d 2e 2f 3a 5f 7e 0a 2a 2a 0a 2a 2a 20 44 69  ,-./:_~.**.** Di
9750: 73 61 6c 6c 6f 77 65 64 20 63 68 61 72 61 63 74  sallowed charact
9760: 65 72 73 20 69 6e 63 6c 75 64 65 3a 20 20 21 22  ers include:  !"
9770: 23 24 25 26 27 28 29 2a 2b 3b 3c 3d 3e 3f 5b 5c  #$%&'()*+;<=>?[\
9780: 5d 5e 7b 7c 7d 0a 2a 2f 0a 73 74 61 74 69 63 20  ]^{|}.*/.static 
9790: 63 6f 6e 73 74 20 63 68 61 72 20 61 6c 6c 6f 77  const char allow
97a0: 65 64 49 6e 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20  edInName[] = {. 
97b0: 20 20 20 20 20 2f 2a 20 20 78 30 20 20 78 31 20       /*  x0  x1 
97c0: 20 78 32 20 20 78 33 20 20 78 34 20 20 78 35 20   x2  x3  x4  x5 
97d0: 20 78 36 20 20 78 37 20 20 78 38 20 20 78 39 20   x6  x7  x8  x9 
97e0: 20 78 61 20 20 78 62 20 20 78 63 20 20 78 64 20   xa  xb  xc  xd 
97f0: 20 78 65 20 20 78 66 20 2a 2f 0a 2f 2a 20 30 78   xe  xf */./* 0x
9800: 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c   */   0,  0,  0,
9810: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
9820: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
9830: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
9840: 20 20 30 2c 0a 2f 2a 20 31 78 20 2a 2f 20 20 20    0,./* 1x */   
9850: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
9860: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
9870: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
9880: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f  0,  0,  0,  0,./
9890: 2a 20 32 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c  * 2x */   0,  0,
98a0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
98b0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
98c0: 20 20 30 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c    0,  0,  1,  1,
98d0: 20 20 31 2c 20 20 31 2c 0a 2f 2a 20 33 78 20 2a    1,  1,./* 3x *
98e0: 2f 20 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  /   1,  1,  1,  
98f0: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
9900: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
9910: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
9920: 30 2c 0a 2f 2a 20 34 78 20 2a 2f 20 20 20 30 2c  0,./* 4x */   0,
9930: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
9940: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
9950: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
9960: 20 20 31 2c 20 20 31 2c 20 20 31 2c 0a 2f 2a 20    1,  1,  1,./* 
9970: 35 78 20 2a 2f 20 20 20 31 2c 20 20 31 2c 20 20  5x */   1,  1,  
9980: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
9990: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
99a0: 31 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  1,  0,  0,  0,  
99b0: 30 2c 20 20 31 2c 0a 2f 2a 20 36 78 20 2a 2f 20  0,  1,./* 6x */ 
99c0: 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    0,  1,  1,  1,
99d0: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
99e0: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
99f0: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
9a00: 0a 2f 2a 20 37 78 20 2a 2f 20 20 20 31 2c 20 20  ./* 7x */   1,  
9a10: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
9a20: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
9a30: 31 2c 20 20 31 2c 20 20 30 2c 20 20 30 2c 20 20  1,  1,  0,  0,  
9a40: 30 2c 20 20 31 2c 20 20 30 2c 0a 2f 2a 20 38 78  0,  1,  0,./* 8x
9a50: 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c   */   0,  0,  0,
9a60: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
9a70: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
9a80: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
9a90: 20 20 30 2c 0a 2f 2a 20 39 78 20 2a 2f 20 20 20    0,./* 9x */   
9aa0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
9ab0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
9ac0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
9ad0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f  0,  0,  0,  0,./
9ae0: 2a 20 41 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c  * Ax */   0,  0,
9af0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
9b00: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
9b10: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
9b20: 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 42 78 20 2a    0,  0,./* Bx *
9b30: 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  /   0,  0,  0,  
9b40: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
9b50: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
9b60: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
9b70: 30 2c 0a 2f 2a 20 43 78 20 2a 2f 20 20 20 30 2c  0,./* Cx */   0,
9b80: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
9b90: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
9ba0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
9bb0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20    0,  0,  0,./* 
9bc0: 44 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20  Dx */   0,  0,  
9bd0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
9be0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
9bf0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
9c00: 30 2c 20 20 30 2c 0a 2f 2a 20 45 78 20 2a 2f 20  0,  0,./* Ex */ 
9c10: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
9c20: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
9c30: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
9c40: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
9c50: 0a 2f 2a 20 46 78 20 2a 2f 20 20 20 30 2c 20 20  ./* Fx */   0,  
9c60: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
9c70: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
9c80: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
9c90: 30 2c 20 20 30 2c 20 20 30 2c 0a 7d 3b 0a 0a 2f  0,  0,  0,.};../
9ca0: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20  *.** Remove all 
9cb0: 64 69 73 61 6c 6c 6f 77 65 64 20 63 68 61 72 61  disallowed chara
9cc0: 63 74 65 72 73 20 69 6e 20 74 68 65 20 69 6e 70  cters in the inp
9cd0: 75 74 20 73 74 72 69 6e 67 20 7a 5b 5d 2e 20 20  ut string z[].  
9ce0: 43 6f 6e 76 65 72 74 20 61 6e 79 0a 2a 2a 20 64  Convert any.** d
9cf0: 69 73 61 6c 6c 6f 77 65 64 20 63 68 61 72 61 63  isallowed charac
9d00: 74 65 72 73 20 69 6e 74 6f 20 22 5f 22 2e 0a 2a  ters into "_"..*
9d10: 2a 0a 2a 2a 20 4e 6f 74 20 74 68 61 74 20 74 68  *.** Not that th
9d20: 65 20 74 68 72 65 65 20 63 68 61 72 61 63 74 65  e three characte
9d30: 72 20 73 65 71 75 65 6e 63 65 20 22 25 58 58 22  r sequence "%XX"
9d40: 20 77 68 65 72 65 20 58 20 69 73 20 61 6e 79 20   where X is any 
9d50: 62 79 74 65 20 69 73 0a 2a 2a 20 63 6f 6e 76 65  byte is.** conve
9d60: 72 74 65 64 20 69 6e 74 6f 20 61 20 73 69 6e 67  rted into a sing
9d70: 6c 65 20 22 5f 22 20 63 68 61 72 61 63 74 65 72  le "_" character
9d80: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
9d90: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
9da0: 72 61 63 74 65 72 73 20 63 6f 6e 76 65 72 74 65  racters converte
9db0: 64 2e 20 20 41 6e 20 22 25 58 58 22 20 2d 3e 20  d.  An "%XX" -> 
9dc0: 22 5f 22 20 63 6f 6e 76 65 72 73 69 6f 6e 0a 2a  "_" conversion.*
9dd0: 2a 20 63 6f 75 6e 74 73 20 61 73 20 61 20 73 69  * counts as a si
9de0: 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72 2e 0a  ngle character..
9df0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
9e00: 6e 69 74 69 7a 65 53 74 72 69 6e 67 28 63 68 61  nitizeString(cha
9e10: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 43 68  r *z){.  int nCh
9e20: 61 6e 67 65 20 3d 20 30 3b 0a 20 20 77 68 69 6c  ange = 0;.  whil
9e30: 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 69 66 28  e( *z ){.    if(
9e40: 20 21 61 6c 6c 6f 77 65 64 49 6e 4e 61 6d 65 5b   !allowedInName[
9e50: 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  *(unsigned char*
9e60: 29 7a 5d 20 29 7b 0a 20 20 20 20 20 20 69 66 28  )z] ){.      if(
9e70: 20 2a 7a 3d 3d 27 25 27 20 26 26 20 7a 5b 31 5d   *z=='%' && z[1]
9e80: 21 3d 30 20 26 26 20 7a 5b 32 5d 21 3d 30 20 29  !=0 && z[2]!=0 )
9e90: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  {.        int i;
9ea0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 33  .        for(i=3
9eb0: 3b 20 28 7a 5b 69 2d 32 5d 20 3d 20 7a 5b 69 5d  ; (z[i-2] = z[i]
9ec0: 29 21 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  )!=0; i++){}.   
9ed0: 20 20 20 7d 0a 20 20 20 20 20 20 2a 7a 20 3d 20     }.      *z = 
9ee0: 27 5f 27 3b 0a 20 20 20 20 20 20 6e 43 68 61 6e  '_';.      nChan
9ef0: 67 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge++;.    }.    
9f00: 7a 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  z++;.  }.  retur
9f10: 6e 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  n nChange;.}../*
9f20: 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
9f30: 6d 62 65 72 20 6f 66 20 22 2f 22 20 63 68 61 72  mber of "/" char
9f40: 61 63 74 65 72 73 20 69 6e 20 61 20 73 74 72 69  acters in a stri
9f50: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
9f60: 74 20 63 6f 75 6e 74 53 6c 61 73 68 65 73 28 63  t countSlashes(c
9f70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
9f80: 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 77 68   int n = 0;.  wh
9f90: 69 6c 65 28 20 2a 7a 20 29 20 69 66 28 20 2a 28  ile( *z ) if( *(
9fa0: 7a 2b 2b 29 3d 3d 27 2f 27 20 29 20 6e 2b 2b 3b  z++)=='/' ) n++;
9fb0: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
9fc0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
9fd0: 6e 65 20 70 72 6f 63 65 73 73 65 73 20 61 20 73  ne processes a s
9fe0: 69 6e 67 6c 65 20 48 54 54 50 20 72 65 71 75 65  ingle HTTP reque
9ff0: 73 74 20 6f 6e 20 73 74 61 6e 64 61 72 64 20 69  st on standard i
a000: 6e 70 75 74 20 61 6e 64 0a 2a 2a 20 73 65 6e 64  nput and.** send
a010: 73 20 74 68 65 20 72 65 70 6c 79 20 74 6f 20 73  s the reply to s
a020: 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74 2e 20  tandard output. 
a030: 20 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   If the argument
a040: 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 0a 2a   is 1 it means.*
a050: 2a 20 74 68 61 74 20 77 65 20 61 72 65 20 73 68  * that we are sh
a060: 6f 75 6c 64 20 63 6c 6f 73 65 20 74 68 65 20 73  ould close the s
a070: 6f 63 6b 65 74 20 77 69 74 68 6f 75 74 20 70 72  ocket without pr
a080: 6f 63 65 73 73 69 6e 67 20 61 64 64 69 74 69 6f  ocessing additio
a090: 6e 61 6c 0a 2a 2a 20 48 54 54 50 20 72 65 71 75  nal.** HTTP requ
a0a0: 65 73 74 73 20 61 66 74 65 72 20 74 68 65 20 63  ests after the c
a0b0: 75 72 72 65 6e 74 20 72 65 71 75 65 73 74 20 66  urrent request f
a0c0: 69 6e 69 73 68 65 73 2e 20 20 30 20 6d 65 61 6e  inishes.  0 mean
a0d0: 73 20 77 65 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  s we are.** allo
a0e0: 77 65 64 20 74 6f 20 6b 65 65 70 20 74 68 65 20  wed to keep the 
a0f0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20  connection open 
a100: 61 6e 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61  and to process a
a110: 64 64 69 74 69 6f 6e 61 6c 20 72 65 71 75 65 73  dditional reques
a120: 74 73 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ts..** This rout
a130: 69 6e 65 20 6d 61 79 20 63 68 6f 6f 73 65 20 74  ine may choose t
a140: 6f 20 63 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e  o close the conn
a150: 65 63 74 69 6f 6e 20 65 76 65 6e 20 69 66 20 74  ection even if t
a160: 68 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  he argument.** i
a170: 73 20 30 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  s 0..** .** If t
a180: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 68  he connection sh
a190: 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 2c 20  ould be closed, 
a1a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6c  this routine cal
a1b0: 6c 73 20 65 78 69 74 28 29 20 61 6e 64 0a 2a 2a  ls exit() and.**
a1c0: 20 74 68 75 73 20 6e 65 76 65 72 20 72 65 74 75   thus never retu
a1d0: 72 6e 73 2e 20 20 49 66 20 74 68 69 73 20 72 6f  rns.  If this ro
a1e0: 75 74 69 6e 65 20 64 6f 65 73 20 72 65 74 75 72  utine does retur
a1f0: 6e 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  n it means that 
a200: 61 6e 6f 74 68 65 72 0a 2a 2a 20 48 54 54 50 20  another.** HTTP 
a210: 72 65 71 75 65 73 74 20 6d 61 79 20 61 70 70 65  request may appe
a220: 61 72 20 6f 6e 20 74 68 65 20 77 69 72 65 2e 0a  ar on the wire..
a230: 2a 2f 0a 76 6f 69 64 20 50 72 6f 63 65 73 73 4f  */.void ProcessO
a240: 6e 65 52 65 71 75 65 73 74 28 69 6e 74 20 66 6f  neRequest(int fo
a250: 72 63 65 43 6c 6f 73 65 29 7b 0a 20 20 69 6e 74  rceClose){.  int
a260: 20 69 2c 20 63 3b 0a 20 20 63 68 61 72 20 2a 7a   i, c;.  char *z
a270: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a280: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 70 61     /* Used to pa
a290: 72 73 65 20 75 70 20 61 20 73 74 72 69 6e 67 20  rse up a string 
a2a0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  */.  struct stat
a2b0: 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 2f   statbuf;      /
a2c0: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
a2d0: 6f 75 74 20 74 68 65 20 66 69 6c 65 20 74 6f 20  out the file to 
a2e0: 62 65 20 72 65 74 72 69 65 76 65 64 20 2a 2f 0a  be retrieved */.
a2f0: 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20    FILE *in;     
a300: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
a310: 6f 72 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  or reading from 
a320: 43 47 49 20 73 63 72 69 70 74 73 20 2a 2f 0a 20  CGI scripts */. 
a330: 20 63 68 61 72 20 7a 4c 69 6e 65 5b 31 30 30 30   char zLine[1000
a340: 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ];         /* A 
a350: 62 75 66 66 65 72 20 66 6f 72 20 69 6e 70 75 74  buffer for input
a360: 20 6c 69 6e 65 73 20 6f 72 20 66 6f 72 6d 69 6e   lines or formin
a370: 67 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 2f 2a  g names */..  /*
a380: 20 43 68 61 6e 67 65 20 64 69 72 65 63 74 6f 72   Change director
a390: 69 65 73 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  ies to the root 
a3a0: 6f 66 20 74 68 65 20 48 54 54 50 20 66 69 6c 65  of the HTTP file
a3b0: 73 79 73 74 65 6d 0a 20 20 2a 2f 0a 20 20 69 66  system.  */.  if
a3c0: 28 20 63 68 64 69 72 28 7a 52 6f 6f 74 5b 30 5d  ( chdir(zRoot[0]
a3d0: 20 3f 20 7a 52 6f 6f 74 20 3a 20 22 2f 22 29 21   ? zRoot : "/")!
a3e0: 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  =0 ){.    char z
a3f0: 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20 20 20 4d  Buf[1000];.    M
a400: 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e  alfunction(__LIN
a410: 45 5f 5f 2c 20 20 20 2f 2a 20 4c 4f 47 3a 20 63  E__,   /* LOG: c
a420: 68 64 69 72 28 29 20 66 61 69 6c 65 64 20 2a 2f  hdir() failed */
a430: 0a 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f  .         "canno
a440: 74 20 63 68 64 69 72 20 74 6f 20 5b 25 73 5d 20  t chdir to [%s] 
a450: 66 72 6f 6d 20 5b 25 73 5d 22 2c 0a 20 20 20 20  from [%s]",.    
a460: 20 20 20 20 20 7a 52 6f 6f 74 2c 20 67 65 74 63       zRoot, getc
a470: 77 64 28 7a 42 75 66 2c 39 39 39 29 29 3b 0a 20  wd(zBuf,999));. 
a480: 20 7d 0a 20 20 6e 52 65 71 75 65 73 74 2b 2b 3b   }.  nRequest++;
a490: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 6d  ..  /*.  ** We m
a4a0: 75 73 74 20 72 65 63 65 69 76 65 20 61 20 63 6f  ust receive a co
a4b0: 6d 70 6c 65 74 65 20 68 65 61 64 65 72 20 77 69  mplete header wi
a4c0: 74 68 69 6e 20 31 35 20 73 65 63 6f 6e 64 73 0a  thin 15 seconds.
a4d0: 20 20 2a 2f 0a 20 20 73 69 67 6e 61 6c 28 53 49    */.  signal(SI
a4e0: 47 41 4c 52 4d 2c 20 54 69 6d 65 6f 75 74 29 3b  GALRM, Timeout);
a4f0: 0a 20 20 73 69 67 6e 61 6c 28 53 49 47 53 45 47  .  signal(SIGSEG
a500: 56 2c 20 54 69 6d 65 6f 75 74 29 3b 0a 20 20 73  V, Timeout);.  s
a510: 69 67 6e 61 6c 28 53 49 47 50 49 50 45 2c 20 54  ignal(SIGPIPE, T
a520: 69 6d 65 6f 75 74 29 3b 0a 20 20 69 66 28 20 75  imeout);.  if( u
a530: 73 65 54 69 6d 65 6f 75 74 20 29 20 61 6c 61 72  seTimeout ) alar
a540: 6d 28 31 35 29 3b 0a 0a 20 20 2f 2a 20 47 65 74  m(15);..  /* Get
a550: 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e 65 20   the first line 
a560: 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 20 61  of the request a
a570: 6e 64 20 70 61 72 73 65 20 6f 75 74 20 74 68 65  nd parse out the
a580: 0a 20 20 2a 2a 20 6d 65 74 68 6f 64 2c 20 74 68  .  ** method, th
a590: 65 20 73 63 72 69 70 74 20 61 6e 64 20 74 68 65  e script and the
a5a0: 20 70 72 6f 74 6f 63 6f 6c 2e 0a 20 20 2a 2f 0a   protocol..  */.
a5b0: 20 20 69 66 28 20 66 67 65 74 73 28 7a 4c 69 6e    if( fgets(zLin
a5c0: 65 2c 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c  e,sizeof(zLine),
a5d0: 73 74 64 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  stdin)==0 ){.   
a5e0: 20 65 78 69 74 28 30 29 3b 0a 20 20 7d 0a 20 20   exit(0);.  }.  
a5f0: 6f 6d 69 74 4c 6f 67 20 3d 20 30 3b 0a 20 20 6e  omitLog = 0;.  n
a600: 49 6e 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 4c 69  In += strlen(zLi
a610: 6e 65 29 3b 0a 20 20 7a 4d 65 74 68 6f 64 20 3d  ne);.  zMethod =
a620: 20 53 74 72 44 75 70 28 47 65 74 46 69 72 73 74   StrDup(GetFirst
a630: 45 6c 65 6d 65 6e 74 28 7a 4c 69 6e 65 2c 26 7a  Element(zLine,&z
a640: 29 29 3b 0a 20 20 7a 52 65 61 6c 53 63 72 69 70  ));.  zRealScrip
a650: 74 20 3d 20 7a 53 63 72 69 70 74 20 3d 20 53 74  t = zScript = St
a660: 72 44 75 70 28 47 65 74 46 69 72 73 74 45 6c 65  rDup(GetFirstEle
a670: 6d 65 6e 74 28 7a 2c 26 7a 29 29 3b 0a 20 20 7a  ment(z,&z));.  z
a680: 50 72 6f 74 6f 63 6f 6c 20 3d 20 53 74 72 44 75  Protocol = StrDu
a690: 70 28 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e  p(GetFirstElemen
a6a0: 74 28 7a 2c 26 7a 29 29 3b 0a 20 20 69 66 28 20  t(z,&z));.  if( 
a6b0: 7a 50 72 6f 74 6f 63 6f 6c 3d 3d 30 20 7c 7c 20  zProtocol==0 || 
a6c0: 73 74 72 6e 63 6d 70 28 7a 50 72 6f 74 6f 63 6f  strncmp(zProtoco
a6d0: 6c 2c 22 48 54 54 50 2f 22 2c 35 29 21 3d 30 20  l,"HTTP/",5)!=0 
a6e0: 7c 7c 20 73 74 72 6c 65 6e 28 7a 50 72 6f 74 6f  || strlen(zProto
a6f0: 63 6f 6c 29 21 3d 38 20 29 7b 0a 20 20 20 20 53  col)!=8 ){.    S
a700: 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 34 30  tartResponse("40
a710: 30 20 42 61 64 20 52 65 71 75 65 73 74 22 29 3b  0 Bad Request");
a720: 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69  .    nOut += pri
a730: 6e 74 66 28 0a 20 20 20 20 20 20 22 43 6f 6e 74  ntf(.      "Cont
a740: 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 70  ent-type: text/p
a750: 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 20 20  lain\r\n".      
a760: 22 5c 72 5c 6e 22 0a 20 20 20 20 20 20 22 54 68  "\r\n".      "Th
a770: 69 73 20 73 65 72 76 65 72 20 64 6f 65 73 20 6e  is server does n
a780: 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  ot understand th
a790: 65 20 72 65 71 75 65 73 74 65 64 20 70 72 6f 74  e requested prot
a7a0: 6f 63 6f 6c 5c 6e 22 0a 20 20 20 20 29 3b 0a 20  ocol\n".    );. 
a7b0: 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28     MakeLogEntry(
a7c0: 30 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 2f 2a  0, __LINE__); /*
a7d0: 20 4c 4f 47 3a 20 62 61 64 20 70 72 6f 74 6f 63   LOG: bad protoc
a7e0: 6f 6c 20 69 6e 20 48 54 54 50 20 68 65 61 64 65  ol in HTTP heade
a7f0: 72 20 2a 2f 0a 20 20 20 20 65 78 69 74 28 30 29  r */.    exit(0)
a800: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 53 63 72  ;.  }.  if( zScr
a810: 69 70 74 5b 30 5d 3d 3d 30 20 29 20 4e 6f 74 46  ipt[0]==0 ) NotF
a820: 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20  ound(__LINE__); 
a830: 2f 2a 20 4c 4f 47 3a 20 45 6d 70 74 79 20 72 65  /* LOG: Empty re
a840: 71 75 65 73 74 20 55 52 49 20 2a 2f 0a 20 20 69  quest URI */.  i
a850: 66 28 20 66 6f 72 63 65 43 6c 6f 73 65 20 29 7b  f( forceClose ){
a860: 0a 20 20 20 20 63 6c 6f 73 65 43 6f 6e 6e 65 63  .    closeConnec
a870: 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  tion = 1;.  }els
a880: 65 20 69 66 28 20 7a 50 72 6f 74 6f 63 6f 6c 5b  e if( zProtocol[
a890: 35 5d 3c 27 31 27 20 7c 7c 20 7a 50 72 6f 74 6f  5]<'1' || zProto
a8a0: 63 6f 6c 5b 37 5d 3c 27 31 27 20 29 7b 0a 20 20  col[7]<'1' ){.  
a8b0: 20 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f    closeConnectio
a8c0: 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n = 1;.  }..  /*
a8d0: 20 54 68 69 73 20 76 65 72 79 20 73 69 6d 70 6c   This very simpl
a8e0: 65 20 73 65 72 76 65 72 20 6f 6e 6c 79 20 75 6e  e server only un
a8f0: 64 65 72 73 74 61 6e 64 73 20 74 68 65 20 47 45  derstands the GE
a900: 54 2c 20 50 4f 53 54 0a 20 20 2a 2a 20 61 6e 64  T, POST.  ** and
a910: 20 48 45 41 44 20 6d 65 74 68 6f 64 73 0a 20 20   HEAD methods.  
a920: 2a 2f 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  */.  if( strcmp(
a930: 7a 4d 65 74 68 6f 64 2c 22 47 45 54 22 29 21 3d  zMethod,"GET")!=
a940: 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 65 74  0 && strcmp(zMet
a950: 68 6f 64 2c 22 50 4f 53 54 22 29 21 3d 30 0a 20  hod,"POST")!=0. 
a960: 20 20 20 20 20 20 26 26 20 73 74 72 63 6d 70 28        && strcmp(
a970: 7a 4d 65 74 68 6f 64 2c 22 48 45 41 44 22 29 21  zMethod,"HEAD")!
a980: 3d 30 20 29 7b 0a 20 20 20 20 53 74 61 72 74 52  =0 ){.    StartR
a990: 65 73 70 6f 6e 73 65 28 22 35 30 31 20 4e 6f 74  esponse("501 Not
a9a0: 20 49 6d 70 6c 65 6d 65 6e 74 65 64 22 29 3b 0a   Implemented");.
a9b0: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
a9c0: 74 66 28 0a 20 20 20 20 20 20 22 43 6f 6e 74 65  tf(.      "Conte
a9d0: 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 70 6c  nt-type: text/pl
a9e0: 61 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 20 20 22  ain\r\n".      "
a9f0: 5c 72 5c 6e 22 0a 20 20 20 20 20 20 22 54 68 65  \r\n".      "The
aa00: 20 25 73 20 6d 65 74 68 6f 64 20 69 73 20 6e 6f   %s method is no
aa10: 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 6f 6e  t implemented on
aa20: 20 74 68 69 73 20 73 65 72 76 65 72 2e 5c 6e 22   this server.\n"
aa30: 2c 0a 20 20 20 20 20 20 7a 4d 65 74 68 6f 64 29  ,.      zMethod)
aa40: 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74  ;.    MakeLogEnt
aa50: 72 79 28 30 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  ry(0, __LINE__);
aa60: 20 2f 2a 20 4c 4f 47 3a 20 55 6e 6b 6e 6f 77 6e   /* LOG: Unknown
aa70: 20 72 65 71 75 65 73 74 20 6d 65 74 68 6f 64 20   request method 
aa80: 2a 2f 0a 20 20 20 20 65 78 69 74 28 30 29 3b 0a  */.    exit(0);.
aa90: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61 6c    }..  /* Get al
aaa0: 6c 20 74 68 65 20 6f 70 74 69 6f 6e 61 6c 20 66  l the optional f
aab0: 69 65 6c 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  ields that follo
aac0: 77 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e 65  w the first line
aad0: 2e 0a 20 20 2a 2f 0a 20 20 7a 43 6f 6f 6b 69 65  ..  */.  zCookie
aae0: 20 3d 20 30 3b 0a 20 20 7a 41 75 74 68 54 79 70   = 0;.  zAuthTyp
aaf0: 65 20 3d 20 30 3b 0a 20 20 7a 52 65 6d 6f 74 65  e = 0;.  zRemote
ab00: 55 73 65 72 20 3d 20 30 3b 0a 20 20 7a 52 65 66  User = 0;.  zRef
ab10: 65 72 65 72 20 3d 20 30 3b 0a 20 20 77 68 69 6c  erer = 0;.  whil
ab20: 65 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 73  e( fgets(zLine,s
ab30: 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 73 74 64  izeof(zLine),std
ab40: 69 6e 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20  in) ){.    char 
ab50: 2a 7a 46 69 65 6c 64 4e 61 6d 65 3b 0a 20 20 20  *zFieldName;.   
ab60: 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 0a 20 20   char *zVal;..  
ab70: 20 20 6e 49 6e 20 2b 3d 20 73 74 72 6c 65 6e 28    nIn += strlen(
ab80: 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 7a 46 69 65  zLine);.    zFie
ab90: 6c 64 4e 61 6d 65 20 3d 20 47 65 74 46 69 72 73  ldName = GetFirs
aba0: 74 45 6c 65 6d 65 6e 74 28 7a 4c 69 6e 65 2c 26  tElement(zLine,&
abb0: 7a 56 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a  zVal);.    if( z
abc0: 46 69 65 6c 64 4e 61 6d 65 3d 3d 30 20 7c 7c 20  FieldName==0 || 
abd0: 2a 7a 46 69 65 6c 64 4e 61 6d 65 3d 3d 30 20 29  *zFieldName==0 )
abe0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 52 65 6d 6f   break;.    Remo
abf0: 76 65 4e 65 77 6c 69 6e 65 28 7a 56 61 6c 29 3b  veNewline(zVal);
ac00: 0a 20 20 20 20 69 66 28 20 73 74 72 63 61 73 65  .    if( strcase
ac10: 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22  cmp(zFieldName,"
ac20: 55 73 65 72 2d 41 67 65 6e 74 3a 22 29 3d 3d 30  User-Agent:")==0
ac30: 20 29 7b 0a 20 20 20 20 20 20 7a 41 67 65 6e 74   ){.      zAgent
ac40: 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b   = StrDup(zVal);
ac50: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
ac60: 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64  trcasecmp(zField
ac70: 4e 61 6d 65 2c 22 41 63 63 65 70 74 3a 22 29 3d  Name,"Accept:")=
ac80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 41 63 63  =0 ){.      zAcc
ac90: 65 70 74 20 3d 20 53 74 72 44 75 70 28 7a 56 61  ept = StrDup(zVa
aca0: 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  l);.    }else if
acb0: 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69  ( strcasecmp(zFi
acc0: 65 6c 64 4e 61 6d 65 2c 22 41 63 63 65 70 74 2d  eldName,"Accept-
acd0: 45 6e 63 6f 64 69 6e 67 3a 22 29 3d 3d 30 20 29  Encoding:")==0 )
ace0: 7b 0a 20 20 20 20 20 20 7a 41 63 63 65 70 74 45  {.      zAcceptE
acf0: 6e 63 6f 64 69 6e 67 20 3d 20 53 74 72 44 75 70  ncoding = StrDup
ad00: 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  (zVal);.    }els
ad10: 65 20 69 66 28 20 73 74 72 63 61 73 65 63 6d 70  e if( strcasecmp
ad20: 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 43 6f 6e  (zFieldName,"Con
ad30: 74 65 6e 74 2d 6c 65 6e 67 74 68 3a 22 29 3d 3d  tent-length:")==
ad40: 30 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6e 74  0 ){.      zCont
ad50: 65 6e 74 4c 65 6e 67 74 68 20 3d 20 53 74 72 44  entLength = StrD
ad60: 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65  up(zVal);.    }e
ad70: 6c 73 65 20 69 66 28 20 73 74 72 63 61 73 65 63  lse if( strcasec
ad80: 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 43  mp(zFieldName,"C
ad90: 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 22 29 3d 3d  ontent-type:")==
ada0: 30 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6e 74  0 ){.      zCont
adb0: 65 6e 74 54 79 70 65 20 3d 20 53 74 72 44 75 70  entType = StrDup
adc0: 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  (zVal);.    }els
add0: 65 20 69 66 28 20 73 74 72 63 61 73 65 63 6d 70  e if( strcasecmp
ade0: 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 52 65 66  (zFieldName,"Ref
adf0: 65 72 65 72 3a 22 29 3d 3d 30 20 29 7b 0a 20 20  erer:")==0 ){.  
ae00: 20 20 20 20 7a 52 65 66 65 72 65 72 20 3d 20 53      zReferer = S
ae10: 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20  trDup(zVal);.   
ae20: 20 20 20 69 66 28 20 73 74 72 73 74 72 28 7a 56     if( strstr(zV
ae30: 61 6c 2c 20 22 64 65 76 69 64 73 2e 6e 65 74 2f  al, "devids.net/
ae40: 22 29 21 3d 30 20 29 7b 20 7a 52 65 66 65 72 65  ")!=0 ){ zRefere
ae50: 72 20 3d 20 22 64 65 76 69 64 73 2e 6e 65 74 2e  r = "devids.net.
ae60: 73 6d 75 74 22 3b 0a 20 20 20 20 20 20 20 20 46  smut";.        F
ae70: 6f 72 62 69 64 64 65 6e 28 5f 5f 4c 49 4e 45 5f  orbidden(__LINE_
ae80: 5f 29 3b 20 2f 2a 20 4c 4f 47 3a 20 52 65 66 65  _); /* LOG: Refe
ae90: 72 72 65 72 20 69 73 20 64 65 76 69 64 73 2e 6e  rrer is devids.n
aea0: 65 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  et */.      }.  
aeb0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
aec0: 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d  asecmp(zFieldNam
aed0: 65 2c 22 43 6f 6f 6b 69 65 3a 22 29 3d 3d 30 20  e,"Cookie:")==0 
aee0: 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6f 6b 69 65  ){.      zCookie
aef0: 20 3d 20 53 74 72 41 70 70 65 6e 64 28 7a 43 6f   = StrAppend(zCo
af00: 6f 6b 69 65 2c 22 3b 20 22 2c 7a 56 61 6c 29 3b  okie,"; ",zVal);
af10: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
af20: 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64  trcasecmp(zField
af30: 4e 61 6d 65 2c 22 43 6f 6e 6e 65 63 74 69 6f 6e  Name,"Connection
af40: 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  :")==0 ){.      
af50: 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a  if( strcasecmp(z
af60: 56 61 6c 2c 22 63 6c 6f 73 65 22 29 3d 3d 30 20  Val,"close")==0 
af70: 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65  ){.        close
af80: 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 31 3b 0a  Connection = 1;.
af90: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
afa0: 21 66 6f 72 63 65 43 6c 6f 73 65 20 26 26 20 73  !forceClose && s
afb0: 74 72 63 61 73 65 63 6d 70 28 7a 56 61 6c 2c 20  trcasecmp(zVal, 
afc0: 22 6b 65 65 70 2d 61 6c 69 76 65 22 29 3d 3d 30  "keep-alive")==0
afd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73   ){.        clos
afe0: 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 30 3b  eConnection = 0;
aff0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
b000: 73 65 20 69 66 28 20 73 74 72 63 61 73 65 63 6d  se if( strcasecm
b010: 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 48 6f  p(zFieldName,"Ho
b020: 73 74 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  st:")==0 ){.    
b030: 20 20 69 6e 74 20 69 6e 53 71 75 61 72 65 20 3d    int inSquare =
b040: 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63   0;.      char c
b050: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 61 6e 69  ;.      if( sani
b060: 74 69 7a 65 53 74 72 69 6e 67 28 7a 56 61 6c 29  tizeString(zVal)
b070: 20 29 7b 0a 20 20 20 20 20 20 20 20 46 6f 72 62   ){.        Forb
b080: 69 64 64 65 6e 28 5f 5f 4c 49 4e 45 5f 5f 29 3b  idden(__LINE__);
b090: 20 20 2f 2a 20 4c 4f 47 3a 20 49 6c 6c 65 67 61    /* LOG: Illega
b0a0: 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 48 4f 53  l content in HOS
b0b0: 54 3a 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  T: parameter */.
b0c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 48        }.      zH
b0d0: 74 74 70 48 6f 73 74 20 3d 20 53 74 72 44 75 70  ttpHost = StrDup
b0e0: 28 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 7a 53  (zVal);.      zS
b0f0: 65 72 76 65 72 50 6f 72 74 20 3d 20 7a 53 65 72  erverPort = zSer
b100: 76 65 72 4e 61 6d 65 20 3d 20 53 74 72 44 75 70  verName = StrDup
b110: 28 7a 48 74 74 70 48 6f 73 74 29 3b 0a 20 20 20  (zHttpHost);.   
b120: 20 20 20 77 68 69 6c 65 28 20 7a 53 65 72 76 65     while( zServe
b130: 72 50 6f 72 74 20 26 26 20 28 63 20 3d 20 2a 7a  rPort && (c = *z
b140: 53 65 72 76 65 72 50 6f 72 74 29 21 3d 30 0a 20  ServerPort)!=0. 
b150: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
b160: 28 63 21 3d 27 3a 27 20 7c 7c 20 69 6e 53 71 75  (c!=':' || inSqu
b170: 61 72 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  are) ){.        
b180: 69 66 28 20 63 3d 3d 27 5b 27 20 29 20 69 6e 53  if( c=='[' ) inS
b190: 71 75 61 72 65 20 3d 20 31 3b 0a 20 20 20 20 20  quare = 1;.     
b1a0: 20 20 20 69 66 28 20 63 3d 3d 27 5d 27 20 29 20     if( c==']' ) 
b1b0: 69 6e 53 71 75 61 72 65 20 3d 20 30 3b 0a 20 20  inSquare = 0;.  
b1c0: 20 20 20 20 20 20 7a 53 65 72 76 65 72 50 6f 72        zServerPor
b1d0: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
b1e0: 20 20 20 69 66 28 20 7a 53 65 72 76 65 72 50 6f     if( zServerPo
b1f0: 72 74 20 26 26 20 2a 7a 53 65 72 76 65 72 50 6f  rt && *zServerPo
b200: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 7a  rt ){.        *z
b210: 53 65 72 76 65 72 50 6f 72 74 20 3d 20 30 3b 0a  ServerPort = 0;.
b220: 20 20 20 20 20 20 20 20 7a 53 65 72 76 65 72 50          zServerP
b230: 6f 72 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ort++;.      }. 
b240: 20 20 20 20 20 69 66 28 20 7a 52 65 61 6c 50 6f       if( zRealPo
b250: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53  rt ){.        zS
b260: 65 72 76 65 72 50 6f 72 74 20 3d 20 53 74 72 44  erverPort = StrD
b270: 75 70 28 7a 52 65 61 6c 50 6f 72 74 29 3b 0a 20  up(zRealPort);. 
b280: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
b290: 20 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28   if( strcasecmp(
b2a0: 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 41 75 74 68  zFieldName,"Auth
b2b0: 6f 72 69 7a 61 74 69 6f 6e 3a 22 29 3d 3d 30 20  orization:")==0 
b2c0: 29 7b 0a 20 20 20 20 20 20 7a 41 75 74 68 54 79  ){.      zAuthTy
b2d0: 70 65 20 3d 20 47 65 74 46 69 72 73 74 45 6c 65  pe = GetFirstEle
b2e0: 6d 65 6e 74 28 53 74 72 44 75 70 28 7a 56 61 6c  ment(StrDup(zVal
b2f0: 29 2c 20 26 7a 41 75 74 68 41 72 67 29 3b 0a 20  ), &zAuthArg);. 
b300: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44     }.  }..  /* D
b310: 69 73 61 6c 6c 6f 77 20 72 65 71 75 65 73 74 73  isallow requests
b320: 20 66 72 6f 6d 20 63 65 72 74 61 69 6e 20 63 6c   from certain cl
b330: 69 65 6e 74 73 20 2a 2f 0a 20 20 69 66 28 20 7a  ients */.  if( z
b340: 41 67 65 6e 74 20 29 7b 0a 20 20 20 20 69 66 28  Agent ){.    if(
b350: 20 73 74 72 73 74 72 28 7a 41 67 65 6e 74 2c 20   strstr(zAgent, 
b360: 22 57 69 6e 64 6f 77 73 5f 39 22 29 21 3d 30 0a  "Windows_9")!=0.
b370: 20 20 20 20 20 7c 7c 20 73 74 72 73 74 72 28 7a       || strstr(z
b380: 41 67 65 6e 74 2c 20 22 44 6f 77 6e 6c 6f 61 64  Agent, "Download
b390: 5f 4d 61 73 74 65 72 22 29 21 3d 30 0a 20 20 20  _Master")!=0.   
b3a0: 20 20 7c 7c 20 73 74 72 73 74 72 28 7a 41 67 65    || strstr(zAge
b3b0: 6e 74 2c 20 22 45 7a 6f 6f 6d 73 2f 22 29 21 3d  nt, "Ezooms/")!=
b3c0: 30 0a 20 20 20 20 20 7c 7c 20 73 74 72 73 74 72  0.     || strstr
b3d0: 28 7a 41 67 65 6e 74 2c 20 22 48 54 54 72 61 63  (zAgent, "HTTrac
b3e0: 6b 22 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 73  k")!=0.     || s
b3f0: 74 72 73 74 72 28 7a 41 67 65 6e 74 2c 20 22 41  trstr(zAgent, "A
b400: 68 72 65 66 73 42 6f 74 22 29 21 3d 30 0a 20 20  hrefsBot")!=0.  
b410: 20 20 29 7b 0a 20 20 20 20 20 20 46 6f 72 62 69    ){.      Forbi
b420: 64 64 65 6e 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20  dden(__LINE__); 
b430: 20 2f 2a 20 4c 4f 47 3a 20 44 69 73 61 6c 6c 6f   /* LOG: Disallo
b440: 77 65 64 20 75 73 65 72 20 61 67 65 6e 74 20 2a  wed user agent *
b450: 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 20  /.    }.  }.#if 
b460: 30 0a 20 20 69 66 28 20 7a 52 65 66 65 72 65 72  0.  if( zReferer
b470: 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63   ){.    static c
b480: 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69 73  onst char *azDis
b490: 61 6c 6c 6f 77 5b 5d 20 3d 20 7b 0a 20 20 20 20  allow[] = {.    
b4a0: 20 20 22 73 6b 69 64 72 6f 77 63 72 61 63 6b 2e    "skidrowcrack.
b4b0: 63 6f 6d 22 2c 0a 20 20 20 20 20 20 22 68 6f 73  com",.      "hos
b4c0: 68 69 79 75 75 67 69 2e 74 69 73 74 6f 72 79 2e  hiyuugi.tistory.
b4d0: 63 6f 6d 22 2c 0a 20 20 20 20 20 20 22 73 6b 69  com",.      "ski
b4e0: 64 72 6f 77 67 61 6d 65 73 2e 6e 65 74 22 2c 0a  drowgames.net",.
b4f0: 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69      };.    int i
b500: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
b510: 3c 73 69 7a 65 6f 66 28 61 7a 44 69 73 61 6c 6c  <sizeof(azDisall
b520: 6f 77 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 73  ow)/sizeof(azDis
b530: 61 6c 6c 6f 77 5b 30 5d 29 3b 20 69 2b 2b 29 7b  allow[0]); i++){
b540: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 73 74  .      if( strst
b550: 72 28 7a 52 65 66 65 72 65 72 2c 20 61 7a 44 69  r(zReferer, azDi
b560: 73 61 6c 6c 6f 77 5b 69 5d 29 21 3d 30 20 29 7b  sallow[i])!=0 ){
b570: 0a 20 20 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e  .        NotFoun
b580: 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 20 2f 2a  d(__LINE__);  /*
b590: 20 4c 4f 47 3a 20 44 69 73 61 6c 6c 6f 77 65 64   LOG: Disallowed
b5a0: 20 72 65 66 65 72 72 65 72 20 2a 2f 0a 20 20 20   referrer */.   
b5b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
b5c0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65  endif..  /* Make
b5d0: 20 61 6e 20 65 78 74 72 61 20 65 66 66 6f 72 74   an extra effort
b5e0: 20 74 6f 20 67 65 74 20 61 20 76 61 6c 69 64 20   to get a valid 
b5f0: 73 65 72 76 65 72 20 6e 61 6d 65 20 61 6e 64 20  server name and 
b600: 70 6f 72 74 20 6e 75 6d 62 65 72 2e 0a 20 20 2a  port number..  *
b610: 2a 20 4f 6e 6c 79 20 4e 65 74 73 63 61 70 65 20  * Only Netscape 
b620: 70 72 6f 76 69 64 65 73 20 74 68 69 73 20 69 6e  provides this in
b630: 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74  formation.  If t
b640: 68 65 20 62 72 6f 77 73 65 72 20 69 73 0a 20 20  he browser is.  
b650: 2a 2a 20 49 6e 74 65 72 6e 65 74 20 45 78 70 6c  ** Internet Expl
b660: 6f 72 65 72 2c 20 74 68 65 6e 20 77 65 20 68 61  orer, then we ha
b670: 76 65 20 74 6f 20 66 69 6e 64 20 6f 75 74 20 74  ve to find out t
b680: 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  he information f
b690: 6f 72 0a 20 20 2a 2a 20 6f 75 72 73 65 6c 76 65  or.  ** ourselve
b6a0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 53  s..  */.  if( zS
b6b0: 65 72 76 65 72 4e 61 6d 65 3d 3d 30 20 29 7b 0a  erverName==0 ){.
b6c0: 20 20 20 20 7a 53 65 72 76 65 72 4e 61 6d 65 20      zServerName 
b6d0: 3d 20 53 61 66 65 4d 61 6c 6c 6f 63 28 20 31 30  = SafeMalloc( 10
b6e0: 30 20 29 3b 0a 20 20 20 20 67 65 74 68 6f 73 74  0 );.    gethost
b6f0: 6e 61 6d 65 28 7a 53 65 72 76 65 72 4e 61 6d 65  name(zServerName
b700: 2c 31 30 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ,100);.  }.  if(
b710: 20 7a 53 65 72 76 65 72 50 6f 72 74 3d 3d 30 20   zServerPort==0 
b720: 7c 7c 20 2a 7a 53 65 72 76 65 72 50 6f 72 74 3d  || *zServerPort=
b730: 3d 30 20 29 7b 0a 20 20 20 20 7a 53 65 72 76 65  =0 ){.    zServe
b740: 72 50 6f 72 74 20 3d 20 44 45 46 41 55 4c 54 5f  rPort = DEFAULT_
b750: 50 4f 52 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  PORT;.  }..  /* 
b760: 52 65 6d 6f 76 65 20 74 68 65 20 71 75 65 72 79  Remove the query
b770: 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 74 68 65   string from the
b780: 20 65 6e 64 20 6f 66 20 74 68 65 20 72 65 71 75   end of the requ
b790: 65 73 74 65 64 20 66 69 6c 65 2e 0a 20 20 2a 2f  ested file..  */
b7a0: 0a 20 20 66 6f 72 28 7a 3d 7a 53 63 72 69 70 74  .  for(z=zScript
b7b0: 3b 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 3f 27 3b  ; *z && *z!='?';
b7c0: 20 7a 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 2a 7a   z++){}.  if( *z
b7d0: 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 7a 51 75  =='?' ){.    zQu
b7e0: 65 72 79 53 75 66 66 69 78 20 3d 20 53 74 72 44  erySuffix = StrD
b7f0: 75 70 28 7a 29 3b 0a 20 20 20 20 2a 7a 20 3d 20  up(z);.    *z = 
b800: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
b810: 7a 51 75 65 72 79 53 75 66 66 69 78 20 3d 20 22  zQuerySuffix = "
b820: 22 3b 0a 20 20 7d 0a 20 20 7a 51 75 65 72 79 53  ";.  }.  zQueryS
b830: 74 72 69 6e 67 20 3d 20 2a 7a 51 75 65 72 79 53  tring = *zQueryS
b840: 75 66 66 69 78 20 3f 20 26 7a 51 75 65 72 79 53  uffix ? &zQueryS
b850: 75 66 66 69 78 5b 31 5d 20 3a 20 7a 51 75 65 72  uffix[1] : zQuer
b860: 79 53 75 66 66 69 78 3b 0a 0a 20 20 2f 2a 20 43  ySuffix;..  /* C
b870: 72 65 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20  reate a file to 
b880: 68 6f 6c 64 20 74 68 65 20 50 4f 53 54 20 71 75  hold the POST qu
b890: 65 72 79 20 64 61 74 61 2c 20 69 66 20 61 6e 79  ery data, if any
b8a0: 2e 20 20 57 65 20 68 61 76 65 20 74 6f 0a 20 20  .  We have to.  
b8b0: 2a 2a 20 64 6f 20 69 74 20 74 68 69 73 20 77 61  ** do it this wa
b8c0: 79 2e 20 20 57 65 20 63 61 6e 27 74 20 6a 75 73  y.  We can't jus
b8d0: 74 20 70 61 73 73 20 74 68 65 20 66 69 6c 65 20  t pass the file 
b8e0: 64 65 73 63 72 69 70 74 6f 72 20 64 6f 77 6e 20  descriptor down 
b8f0: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 63 68 69 6c  to.  ** the chil
b900: 64 20 70 72 6f 63 65 73 73 20 62 65 63 61 75 73  d process becaus
b910: 65 20 74 68 65 20 66 67 65 74 73 28 29 20 66 75  e the fgets() fu
b920: 6e 63 74 69 6f 6e 20 6d 61 79 20 68 61 76 65 20  nction may have 
b930: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 72 65 61  already.  ** rea
b940: 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 50 4f  d part of the PO
b950: 53 54 20 64 61 74 61 20 69 6e 74 6f 20 69 74 73  ST data into its
b960: 20 69 6e 74 65 72 6e 61 6c 20 62 75 66 66 65 72   internal buffer
b970: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 4d 65  ..  */.  if( zMe
b980: 74 68 6f 64 5b 30 5d 3d 3d 27 50 27 20 26 26 20  thod[0]=='P' && 
b990: 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 21 3d  zContentLength!=
b9a0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 65 6e  0 ){.    int len
b9b0: 20 3d 20 61 74 6f 69 28 7a 43 6f 6e 74 65 6e 74   = atoi(zContent
b9c0: 4c 65 6e 67 74 68 29 3b 0a 20 20 20 20 46 49 4c  Length);.    FIL
b9d0: 45 20 2a 6f 75 74 3b 0a 20 20 20 20 63 68 61 72  E *out;.    char
b9e0: 20 2a 7a 42 75 66 3b 0a 20 20 20 20 69 6e 74 20   *zBuf;.    int 
b9f0: 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e  n;..    if( len>
ba00: 4d 41 58 5f 43 4f 4e 54 45 4e 54 5f 4c 45 4e 47  MAX_CONTENT_LENG
ba10: 54 48 20 29 7b 0a 20 20 20 20 20 20 53 74 61 72  TH ){.      Star
ba20: 74 52 65 73 70 6f 6e 73 65 28 22 35 30 30 20 52  tResponse("500 R
ba30: 65 71 75 65 73 74 20 74 6f 6f 20 6c 61 72 67 65  equest too large
ba40: 22 29 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b  ");.      nOut +
ba50: 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  = printf(.      
ba60: 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a    "Content-type:
ba70: 20 74 65 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22   text/plain\r\n"
ba80: 0a 20 20 20 20 20 20 20 20 22 5c 72 5c 6e 22 0a  .        "\r\n".
ba90: 20 20 20 20 20 20 20 20 22 54 6f 6f 20 6d 75 63          "Too muc
baa0: 68 20 50 4f 53 54 20 64 61 74 61 5c 6e 22 0a 20  h POST data\n". 
bab0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 4d 61       );.      Ma
bac0: 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 5f 5f  keLogEntry(0, __
bad0: 4c 49 4e 45 5f 5f 29 3b 20 2f 2a 20 4c 4f 47 3a  LINE__); /* LOG:
bae0: 20 52 65 71 75 65 73 74 20 74 6f 6f 20 6c 61 72   Request too lar
baf0: 67 65 20 2a 2f 0a 20 20 20 20 20 20 65 78 69 74  ge */.      exit
bb00: 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  (0);.    }.    s
bb10: 70 72 69 6e 74 66 28 7a 54 6d 70 4e 61 6d 42 75  printf(zTmpNamBu
bb20: 66 2c 20 22 2f 74 6d 70 2f 2d 70 6f 73 74 2d 64  f, "/tmp/-post-d
bb30: 61 74 61 2d 58 58 58 58 58 58 22 29 3b 0a 20 20  ata-XXXXXX");.  
bb40: 20 20 7a 54 6d 70 4e 61 6d 20 3d 20 7a 54 6d 70    zTmpNam = zTmp
bb50: 4e 61 6d 42 75 66 3b 0a 20 20 20 20 69 66 28 20  NamBuf;.    if( 
bb60: 6d 6b 73 74 65 6d 70 28 7a 54 6d 70 4e 61 6d 29  mkstemp(zTmpNam)
bb70: 3c 30 20 29 7b 0a 20 20 20 20 20 20 4d 61 6c 66  <0 ){.      Malf
bb80: 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f  unction(__LINE__
bb90: 2c 20 20 2f 2a 20 4c 4f 47 3a 20 6d 6b 73 74 65  ,  /* LOG: mkste
bba0: 6d 70 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20  mp() failed */. 
bbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 43                "C
bbc0: 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 61 20 74  annot create a t
bbd0: 65 6d 70 20 66 69 6c 65 20 69 6e 20 77 68 69 63  emp file in whic
bbe0: 68 20 74 6f 20 73 74 6f 72 65 20 50 4f 53 54 20  h to store POST 
bbf0: 64 61 74 61 22 29 3b 0a 20 20 20 20 7d 0a 20 20  data");.    }.  
bc00: 20 20 6f 75 74 20 3d 20 66 6f 70 65 6e 28 7a 54    out = fopen(zT
bc10: 6d 70 4e 61 6d 2c 22 77 22 29 3b 0a 20 20 20 20  mpNam,"w");.    
bc20: 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20  if( out==0 ){.  
bc30: 20 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73      StartRespons
bc40: 65 28 22 35 30 30 20 43 61 6e 6e 6f 74 20 63 72  e("500 Cannot cr
bc50: 65 61 74 65 20 2f 74 6d 70 20 66 69 6c 65 22 29  eate /tmp file")
bc60: 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20  ;.      nOut += 
bc70: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
bc80: 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74  "Content-type: t
bc90: 65 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20  ext/plain\r\n". 
bca0: 20 20 20 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20         "\r\n".  
bcb0: 20 20 20 20 20 20 22 43 6f 75 6c 64 20 6e 6f 74        "Could not
bcc0: 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20 66 6f 72   open \"%s\" for
bcd0: 20 77 72 69 74 69 6e 67 5c 6e 22 2c 20 7a 54 6d   writing\n", zTm
bce0: 70 4e 61 6d 0a 20 20 20 20 20 20 29 3b 0a 20 20  pNam.      );.  
bcf0: 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79      MakeLogEntry
bd00: 28 30 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 2f  (0, __LINE__); /
bd10: 2a 20 4c 4f 47 3a 20 63 61 6e 6e 6f 74 20 63 72  * LOG: cannot cr
bd20: 65 61 74 65 20 74 65 6d 70 20 66 69 6c 65 20 66  eate temp file f
bd30: 6f 72 20 50 4f 53 54 20 2a 2f 0a 20 20 20 20 20  or POST */.     
bd40: 20 65 78 69 74 28 30 29 3b 0a 20 20 20 20 7d 0a   exit(0);.    }.
bd50: 20 20 20 20 7a 42 75 66 20 3d 20 53 61 66 65 4d      zBuf = SafeM
bd60: 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31 20 29 3b 0a  alloc( len+1 );.
bd70: 20 20 20 20 69 66 28 20 75 73 65 54 69 6d 65 6f      if( useTimeo
bd80: 75 74 20 29 20 61 6c 61 72 6d 28 31 35 20 2b 20  ut ) alarm(15 + 
bd90: 6c 65 6e 2f 32 30 30 30 29 3b 0a 20 20 20 20 6e  len/2000);.    n
bda0: 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 31 2c   = fread(zBuf,1,
bdb0: 6c 65 6e 2c 73 74 64 69 6e 29 3b 0a 20 20 20 20  len,stdin);.    
bdc0: 6e 49 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 66 77  nIn += n;.    fw
bdd0: 72 69 74 65 28 7a 42 75 66 2c 31 2c 6e 2c 6f 75  rite(zBuf,1,n,ou
bde0: 74 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 42 75  t);.    free(zBu
bdf0: 66 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 6f  f);.    fclose(o
be00: 75 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  ut);.  }..  /* M
be10: 61 6b 65 20 73 75 72 65 20 74 68 65 20 72 75 6e  ake sure the run
be20: 6e 69 6e 67 20 74 69 6d 65 20 69 73 20 6e 6f 74  ning time is not
be30: 20 74 6f 6f 20 67 72 65 61 74 20 2a 2f 0a 20 20   too great */.  
be40: 69 66 28 20 75 73 65 54 69 6d 65 6f 75 74 20 29  if( useTimeout )
be50: 20 61 6c 61 72 6d 28 31 30 29 3b 0a 0a 20 20 2f   alarm(10);..  /
be60: 2a 20 43 6f 6e 76 65 72 74 20 61 6c 6c 20 75 6e  * Convert all un
be70: 75 73 75 61 6c 20 63 68 61 72 61 63 74 65 72 73  usual characters
be80: 20 69 6e 20 74 68 65 20 73 63 72 69 70 74 20 6e   in the script n
be90: 61 6d 65 20 69 6e 74 6f 20 22 5f 22 2e 0a 20 20  ame into "_"..  
bea0: 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20  **.  ** This is 
beb0: 61 20 64 65 66 65 6e 73 65 20 61 67 61 69 6e 73  a defense agains
bec0: 74 20 76 61 72 69 6f 75 73 20 61 74 74 61 63 6b  t various attack
bed0: 73 2c 20 58 53 53 20 61 74 74 61 63 6b 73 20 69  s, XSS attacks i
bee0: 6e 20 70 61 72 74 69 63 75 6c 61 72 2e 0a 20 20  n particular..  
bef0: 2a 2f 0a 20 20 73 61 6e 69 74 69 7a 65 53 74 72  */.  sanitizeStr
bf00: 69 6e 67 28 7a 53 63 72 69 70 74 29 3b 0a 0a 20  ing(zScript);.. 
bf10: 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77   /* Do not allow
bf20: 20 22 2f 2e 22 20 6f 72 20 22 2f 2d 22 20 74 6f   "/." or "/-" to
bf30: 20 74 6f 20 6f 63 63 75 72 20 61 6e 79 77 68 65   to occur anywhe
bf40: 72 65 20 69 6e 20 74 68 65 20 65 6e 74 69 74 79  re in the entity
bf50: 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 54 68 69 73   name..  ** This
bf60: 20 70 72 65 76 65 6e 74 73 20 61 74 74 61 63 6b   prevents attack
bf70: 73 20 69 6e 76 6f 6c 76 69 6e 67 20 22 2e 2e 22  s involving ".."
bf80: 20 61 6e 64 20 61 6c 73 6f 20 61 6c 6c 6f 77 73   and also allows
bf90: 20 75 73 20 74 6f 20 63 72 65 61 74 65 0a 20 20   us to create.  
bfa0: 2a 2a 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72  ** files and dir
bfb0: 65 63 74 6f 72 69 65 73 20 77 68 6f 73 65 20 6e  ectories whose n
bfc0: 61 6d 65 73 20 62 65 67 69 6e 20 77 69 74 68 20  ames begin with 
bfd0: 22 2d 22 20 6f 72 20 22 2e 22 20 77 68 69 63 68  "-" or "." which
bfe0: 20 61 72 65 0a 20 20 2a 2a 20 69 6e 76 69 73 69   are.  ** invisi
bff0: 62 6c 65 20 74 6f 20 74 68 65 20 77 65 62 73 65  ble to the webse
c000: 72 76 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rver..  **.  ** 
c010: 45 78 63 65 70 74 69 6f 6e 3a 20 20 41 6c 6c 6f  Exception:  Allo
c020: 77 20 74 68 65 20 22 2f 2e 77 65 6c 6c 2d 6b 6e  w the "/.well-kn
c030: 6f 77 6e 2f 22 20 70 72 65 66 69 78 20 69 6e 20  own/" prefix in 
c040: 61 63 63 6f 72 64 61 6e 63 65 20 77 69 74 68 0a  accordance with.
c050: 20 20 2a 2a 20 52 46 43 2d 35 37 38 35 0a 20 20    ** RFC-5785.  
c060: 2a 2f 0a 20 20 66 6f 72 28 7a 3d 7a 53 63 72 69  */.  for(z=zScri
c070: 70 74 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20  pt; *z; z++){.  
c080: 20 20 69 66 28 20 2a 7a 3d 3d 27 2f 27 20 26 26    if( *z=='/' &&
c090: 20 28 7a 5b 31 5d 3d 3d 27 2e 27 20 7c 7c 20 7a   (z[1]=='.' || z
c0a0: 5b 31 5d 3d 3d 27 2d 27 29 0a 20 20 20 20 20 26  [1]=='-').     &
c0b0: 26 20 28 7a 3e 7a 53 63 72 69 70 74 20 7c 7c 20  & (z>zScript || 
c0c0: 73 74 72 6e 63 6d 70 28 7a 2c 22 2f 2e 77 65 6c  strncmp(z,"/.wel
c0d0: 6c 2d 6b 6e 6f 77 6e 2f 22 2c 31 33 29 21 3d 30  l-known/",13)!=0
c0e0: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20  ).    ){.       
c0f0: 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f  NotFound(__LINE_
c100: 5f 29 3b 20 2f 2a 20 4c 4f 47 3a 20 50 61 74 68  _); /* LOG: Path
c110: 20 65 6c 65 6d 65 6e 74 20 62 65 67 69 6e 73 20   element begins 
c120: 77 69 74 68 20 22 2e 22 20 6f 72 20 22 2d 22 20  with "." or "-" 
c130: 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  */.    }.  }..  
c140: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  /* Figure out wh
c150: 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74  at the root of t
c160: 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 73 68  he filesystem sh
c170: 6f 75 6c 64 20 62 65 2e 20 20 49 66 20 74 68 65  ould be.  If the
c180: 0a 20 20 2a 2a 20 48 54 54 50 5f 48 4f 53 54 20  .  ** HTTP_HOST 
c190: 70 61 72 61 6d 65 74 65 72 20 65 78 69 73 74 73  parameter exists
c1a0: 20 28 73 74 6f 72 65 64 20 69 6e 20 7a 48 74 74   (stored in zHtt
c1b0: 70 48 6f 73 74 29 20 74 68 65 6e 20 72 65 6d 6f  pHost) then remo
c1c0: 76 65 20 74 68 65 0a 20 20 2a 2a 20 70 6f 72 74  ve the.  ** port
c1d0: 20 6e 75 6d 62 65 72 20 66 72 6f 6d 20 74 68 65   number from the
c1e0: 20 65 6e 64 20 28 69 66 20 61 6e 79 29 2c 20 63   end (if any), c
c1f0: 6f 6e 76 65 72 74 20 61 6c 6c 20 63 68 61 72 61  onvert all chara
c200: 63 74 65 72 73 20 74 6f 20 6c 6f 77 65 72 0a 20  cters to lower. 
c210: 20 2a 2a 20 63 61 73 65 2c 20 61 6e 64 20 63 6f   ** case, and co
c220: 6e 76 65 72 74 20 61 6c 6c 20 22 2e 22 20 74 6f  nvert all "." to
c230: 20 22 5f 22 2e 20 20 54 68 65 6e 20 74 72 79 20   "_".  Then try 
c240: 74 6f 20 66 69 6e 64 20 61 20 64 69 72 65 63 74  to find a direct
c250: 6f 72 79 0a 20 20 2a 2a 20 77 69 74 68 20 74 68  ory.  ** with th
c260: 61 74 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  at name and the 
c270: 65 78 74 65 6e 73 69 6f 6e 20 2e 77 65 62 73 69  extension .websi
c280: 74 65 2e 20 20 49 66 20 6e 6f 74 20 66 6f 75 6e  te.  If not foun
c290: 64 2c 20 6c 6f 6f 6b 0a 20 20 2a 2a 20 66 6f 72  d, look.  ** for
c2a0: 20 22 64 65 66 61 75 6c 74 2e 77 65 62 73 69 74   "default.websit
c2b0: 65 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  e"..  */.  if( z
c2c0: 53 63 72 69 70 74 5b 30 5d 21 3d 27 2f 27 20 29  Script[0]!='/' )
c2d0: 7b 0a 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f  {.    NotFound(_
c2e0: 5f 4c 49 4e 45 5f 5f 29 3b 20 2f 2a 20 4c 4f 47  _LINE__); /* LOG
c2f0: 3a 20 55 52 49 20 64 6f 65 73 20 6e 6f 74 20 73  : URI does not s
c300: 74 61 72 74 20 77 69 74 68 20 22 2f 22 20 2a 2f  tart with "/" */
c310: 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72 6c 65  .  }.  if( strle
c320: 6e 28 7a 52 6f 6f 74 29 2b 34 30 20 3e 3d 20 73  n(zRoot)+40 >= s
c330: 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 20 29 7b 0a  izeof(zLine) ){.
c340: 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f       NotFound(__
c350: 4c 49 4e 45 5f 5f 29 3b 20 2f 2a 20 4c 4f 47 3a  LINE__); /* LOG:
c360: 20 55 52 49 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f   URI too long */
c370: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 48 74 74 70  .  }.  if( zHttp
c380: 48 6f 73 74 3d 3d 30 20 7c 7c 20 7a 48 74 74 70  Host==0 || zHttp
c390: 48 6f 73 74 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20  Host[0]==0 ){.  
c3a0: 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e    NotFound(__LIN
c3b0: 45 5f 5f 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 4d  E__);  /* LOG: M
c3c0: 69 73 73 69 6e 67 20 48 4f 53 54 3a 20 70 61 72  issing HOST: par
c3d0: 61 6d 65 74 65 72 20 2a 2f 0a 20 20 7d 65 6c 73  ameter */.  }els
c3e0: 65 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 48 74  e if( strlen(zHt
c3f0: 74 70 48 6f 73 74 29 2b 73 74 72 6c 65 6e 28 7a  tpHost)+strlen(z
c400: 52 6f 6f 74 29 2b 31 30 20 3e 3d 20 73 69 7a 65  Root)+10 >= size
c410: 6f 66 28 7a 4c 69 6e 65 29 20 29 7b 0a 20 20 20  of(zLine) ){.   
c420: 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45   NotFound(__LINE
c430: 5f 5f 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 48 4f  __);  /* LOG: HO
c440: 53 54 20 70 61 72 61 6d 65 74 65 72 20 74 6f 6f  ST parameter too
c450: 20 6c 6f 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65   long */.  }else
c460: 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c  {.    sprintf(zL
c470: 69 6e 65 2c 20 22 25 73 2f 25 73 22 2c 20 7a 52  ine, "%s/%s", zR
c480: 6f 6f 74 2c 20 7a 48 74 74 70 48 6f 73 74 29 3b  oot, zHttpHost);
c490: 0a 20 20 20 20 66 6f 72 28 69 3d 73 74 72 6c 65  .    for(i=strle
c4a0: 6e 28 7a 52 6f 6f 74 29 2b 31 3b 20 7a 4c 69 6e  n(zRoot)+1; zLin
c4b0: 65 5b 69 5d 20 26 26 20 7a 4c 69 6e 65 5b 69 5d  e[i] && zLine[i]
c4c0: 21 3d 27 3a 27 3b 20 69 2b 2b 29 7b 0a 20 20 20  !=':'; i++){.   
c4d0: 20 20 20 69 6e 74 20 63 20 3d 20 7a 4c 69 6e 65     int c = zLine
c4e0: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21  [i];.      if( !
c4f0: 69 73 61 6c 6e 75 6d 28 63 29 20 29 7b 0a 20 20  isalnum(c) ){.  
c500: 20 20 20 20 20 20 7a 4c 69 6e 65 5b 69 5d 20 3d        zLine[i] =
c510: 20 27 5f 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73   '_';.      }els
c520: 65 20 69 66 28 20 69 73 75 70 70 65 72 28 63 29  e if( isupper(c)
c530: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e   ){.        zLin
c540: 65 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72 28 63  e[i] = tolower(c
c550: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
c560: 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a 4c 69  .    strcpy(&zLi
c570: 6e 65 5b 69 5d 2c 20 22 2e 77 65 62 73 69 74 65  ne[i], ".website
c580: 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74  ");.  }.  if( st
c590: 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75  at(zLine,&statbu
c5a0: 66 29 20 7c 7c 20 21 53 5f 49 53 44 49 52 28 73  f) || !S_ISDIR(s
c5b0: 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20  tatbuf.st_mode) 
c5c0: 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  ){.    sprintf(z
c5d0: 4c 69 6e 65 2c 20 22 25 73 2f 64 65 66 61 75 6c  Line, "%s/defaul
c5e0: 74 2e 77 65 62 73 69 74 65 22 2c 20 7a 52 6f 6f  t.website", zRoo
c5f0: 74 29 3b 0a 20 20 20 20 69 66 28 20 73 74 61 74  t);.    if( stat
c600: 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75 66 29  (zLine,&statbuf)
c610: 20 7c 7c 20 21 53 5f 49 53 44 49 52 28 73 74 61   || !S_ISDIR(sta
c620: 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 7b  tbuf.st_mode) ){
c630: 0a 20 20 20 20 20 20 69 66 28 20 73 74 61 6e 64  .      if( stand
c640: 61 6c 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 20  alone ){.       
c650: 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20   sprintf(zLine, 
c660: 22 25 73 22 2c 20 7a 52 6f 6f 74 29 3b 0a 20 20  "%s", zRoot);.  
c670: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c680: 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49     NotFound(__LI
c690: 4e 45 5f 5f 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20  NE__);  /* LOG: 
c6a0: 2a 2e 77 65 62 73 69 74 65 20 70 65 72 6d 69 73  *.website permis
c6b0: 73 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 7d  sions */.      }
c6c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 48 6f  .    }.  }.  zHo
c6d0: 6d 65 20 3d 20 53 74 72 44 75 70 28 7a 4c 69 6e  me = StrDup(zLin
c6e0: 65 29 3b 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65  e);..  /* Change
c6f0: 20 64 69 72 65 63 74 6f 72 69 65 73 20 74 6f 20   directories to 
c700: 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
c710: 48 54 54 50 20 66 69 6c 65 73 79 73 74 65 6d 0a  HTTP filesystem.
c720: 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 64 69 72    */.  if( chdir
c730: 28 7a 48 6f 6d 65 29 21 3d 30 20 29 7b 0a 20 20  (zHome)!=0 ){.  
c740: 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30    char zBuf[1000
c750: 5d 3b 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69  ];.    Malfuncti
c760: 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 20 2f 2a  on(__LINE__,  /*
c770: 20 4c 4f 47 3a 20 63 68 64 69 72 28 29 20 66 61   LOG: chdir() fa
c780: 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  iled */.        
c790: 20 22 63 61 6e 6e 6f 74 20 63 68 64 69 72 20 74   "cannot chdir t
c7a0: 6f 20 5b 25 73 5d 20 66 72 6f 6d 20 5b 25 73 5d  o [%s] from [%s]
c7b0: 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 48 6f 6d  ",.         zHom
c7c0: 65 2c 20 67 65 74 63 77 64 28 7a 42 75 66 2c 39  e, getcwd(zBuf,9
c7d0: 39 39 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  99));.  }..  /* 
c7e0: 4c 6f 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  Locate the file 
c7f0: 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  in the filesyste
c800: 6d 2e 20 20 57 65 20 6d 69 67 68 74 20 68 61 76  m.  We might hav
c810: 65 20 74 6f 20 61 70 70 65 6e 64 0a 20 20 2a 2a  e to append.  **
c820: 20 74 68 65 20 6e 61 6d 65 20 22 69 6e 64 65 78   the name "index
c830: 2e 68 74 6d 6c 22 20 69 6e 20 6f 72 64 65 72 20  .html" in order 
c840: 74 6f 20 66 69 6e 64 20 69 74 2e 20 20 41 6e 79  to find it.  Any
c850: 20 65 78 63 65 73 73 20 70 61 74 68 0a 20 20 2a   excess path.  *
c860: 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  * information is
c870: 20 70 75 74 20 69 6e 74 6f 20 74 68 65 20 7a 50   put into the zP
c880: 61 74 68 49 6e 66 6f 20 76 61 72 69 61 62 6c 65  athInfo variable
c890: 2e 0a 20 20 2a 2f 0a 20 20 7a 4c 69 6e 65 5b 30  ..  */.  zLine[0
c8a0: 5d 20 3d 20 27 2e 27 3b 0a 20 20 69 20 3d 20 30  ] = '.';.  i = 0
c8b0: 3b 0a 20 20 77 68 69 6c 65 28 20 7a 53 63 72 69  ;.  while( zScri
c8c0: 70 74 5b 69 5d 20 29 7b 0a 20 20 20 20 77 68 69  pt[i] ){.    whi
c8d0: 6c 65 28 20 7a 53 63 72 69 70 74 5b 69 5d 20 26  le( zScript[i] &
c8e0: 26 20 7a 53 63 72 69 70 74 5b 69 5d 21 3d 27 2f  & zScript[i]!='/
c8f0: 27 20 29 7b 0a 20 20 20 20 20 20 7a 4c 69 6e 65  ' ){.      zLine
c900: 5b 69 2b 31 5d 20 3d 20 7a 53 63 72 69 70 74 5b  [i+1] = zScript[
c910: 69 5d 3b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20  i];.      i++;. 
c920: 20 20 20 7d 0a 20 20 20 20 7a 4c 69 6e 65 5b 69     }.    zLine[i
c930: 2b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  +1] = 0;.    if(
c940: 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61   stat(zLine,&sta
c950: 74 62 75 66 29 21 3d 30 20 29 7b 0a 20 20 20 20  tbuf)!=0 ){.    
c960: 20 20 69 6e 74 20 73 74 69 6c 6c 53 65 61 72 63    int stillSearc
c970: 68 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  hing = 1;.      
c980: 77 68 69 6c 65 28 20 73 74 69 6c 6c 53 65 61 72  while( stillSear
c990: 63 68 69 6e 67 20 26 26 20 69 3e 30 20 29 7b 0a  ching && i>0 ){.
c9a0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69          while( i
c9b0: 3e 30 20 26 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d  >0 && zLine[i]!=
c9c0: 27 2f 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20  '/' ){ i--; }.  
c9d0: 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a 4c        strcpy(&zL
c9e0: 69 6e 65 5b 69 5d 2c 20 22 2f 6e 6f 74 2d 66 6f  ine[i], "/not-fo
c9f0: 75 6e 64 2e 68 74 6d 6c 22 29 3b 0a 20 20 20 20  und.html");.    
ca00: 20 20 20 20 69 66 28 20 73 74 61 74 28 7a 4c 69      if( stat(zLi
ca10: 6e 65 2c 26 73 74 61 74 62 75 66 29 3d 3d 30 20  ne,&statbuf)==0 
ca20: 26 26 20 53 5f 49 53 52 45 47 28 73 74 61 74 62  && S_ISREG(statb
ca30: 75 66 2e 73 74 5f 6d 6f 64 65 29 0a 20 20 20 20  uf.st_mode).    
ca40: 20 20 20 20 20 20 20 20 26 26 20 61 63 63 65 73          && acces
ca50: 73 28 7a 4c 69 6e 65 2c 52 5f 4f 4b 29 3d 3d 30  s(zLine,R_OK)==0
ca60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 52   ){.          zR
ca70: 65 61 6c 53 63 72 69 70 74 20 3d 20 53 74 72 44  ealScript = StrD
ca80: 75 70 28 26 7a 4c 69 6e 65 5b 31 5d 29 3b 0a 20  up(&zLine[1]);. 
ca90: 20 20 20 20 20 20 20 20 20 52 65 64 69 72 65 63           Redirec
caa0: 74 28 7a 52 65 61 6c 53 63 72 69 70 74 2c 20 31  t(zRealScript, 1
cab0: 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 2f 2a 20  , __LINE__); /* 
cac0: 4c 4f 47 3a 20 72 65 64 69 72 65 63 74 20 74 6f  LOG: redirect to
cad0: 20 6e 6f 74 2d 66 6f 75 6e 64 20 2a 2f 0a 20 20   not-found */.  
cae0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
caf0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
cb00: 20 20 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20           i--;.  
cb10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
cb20: 20 20 20 20 20 20 69 66 28 20 73 74 69 6c 6c 53        if( stillS
cb30: 65 61 72 63 68 69 6e 67 20 29 20 4e 6f 74 46 6f  earching ) NotFo
cb40: 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 2f  und(__LINE__); /
cb50: 2a 20 4c 4f 47 3a 20 55 52 49 20 6e 6f 74 20 66  * LOG: URI not f
cb60: 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 62 72  ound */.      br
cb70: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
cb80: 66 28 20 53 5f 49 53 52 45 47 28 73 74 61 74 62  f( S_ISREG(statb
cb90: 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 7b 0a 20  uf.st_mode) ){. 
cba0: 20 20 20 20 20 69 66 28 20 61 63 63 65 73 73 28       if( access(
cbb0: 7a 4c 69 6e 65 2c 52 5f 4f 4b 29 20 29 7b 0a 20  zLine,R_OK) ){. 
cbc0: 20 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28         NotFound(
cbd0: 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 20 2f 2a 20 4c  __LINE__);  /* L
cbe0: 4f 47 3a 20 46 69 6c 65 20 6e 6f 74 20 72 65 61  OG: File not rea
cbf0: 64 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7d  dable */.      }
cc00: 0a 20 20 20 20 20 20 7a 52 65 61 6c 53 63 72 69  .      zRealScri
cc10: 70 74 20 3d 20 53 74 72 44 75 70 28 26 7a 4c 69  pt = StrDup(&zLi
cc20: 6e 65 5b 31 5d 29 3b 0a 20 20 20 20 20 20 62 72  ne[1]);.      br
cc30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
cc40: 66 28 20 7a 53 63 72 69 70 74 5b 69 5d 3d 3d 30  f( zScript[i]==0
cc50: 20 7c 7c 20 7a 53 63 72 69 70 74 5b 69 2b 31 5d   || zScript[i+1]
cc60: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72  ==0 ){.      str
cc70: 63 70 79 28 26 7a 4c 69 6e 65 5b 69 2b 31 5d 2c  cpy(&zLine[i+1],
cc80: 22 2f 69 6e 64 65 78 2e 68 74 6d 6c 22 29 3b 0a  "/index.html");.
cc90: 20 20 20 20 20 20 69 66 28 20 73 74 61 74 28 7a        if( stat(z
cca0: 4c 69 6e 65 2c 26 73 74 61 74 62 75 66 29 21 3d  Line,&statbuf)!=
ccb0: 30 20 7c 7c 20 21 53 5f 49 53 52 45 47 28 73 74  0 || !S_ISREG(st
ccc0: 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 0a  atbuf.st_mode) .
ccd0: 20 20 20 20 20 20 7c 7c 20 61 63 63 65 73 73 28        || access(
cce0: 7a 4c 69 6e 65 2c 52 5f 4f 4b 29 20 29 7b 0a 20  zLine,R_OK) ){. 
ccf0: 20 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a         strcpy(&z
cd00: 4c 69 6e 65 5b 69 2b 31 5d 2c 22 2f 69 6e 64 65  Line[i+1],"/inde
cd10: 78 2e 63 67 69 22 29 3b 0a 20 20 20 20 20 20 20  x.cgi");.       
cd20: 20 69 66 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c   if( stat(zLine,
cd30: 26 73 74 61 74 62 75 66 29 21 3d 30 20 7c 7c 20  &statbuf)!=0 || 
cd40: 21 53 5f 49 53 52 45 47 28 73 74 61 74 62 75 66  !S_ISREG(statbuf
cd50: 2e 73 74 5f 6d 6f 64 65 29 20 0a 20 20 20 20 20  .st_mode) .     
cd60: 20 20 20 7c 7c 20 61 63 63 65 73 73 28 7a 4c 69     || access(zLi
cd70: 6e 65 2c 52 5f 4f 4b 29 20 29 7b 0a 20 20 20 20  ne,R_OK) ){.    
cd80: 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f        NotFound(_
cd90: 5f 4c 49 4e 45 5f 5f 29 3b 20 2f 2a 20 4c 4f 47  _LINE__); /* LOG
cda0: 3a 20 55 52 49 20 69 73 20 61 20 64 69 72 65 63  : URI is a direc
cdb0: 74 6f 72 79 20 77 2f 6f 20 69 6e 64 65 78 2e 68  tory w/o index.h
cdc0: 74 6d 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  tml */.        }
cdd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
cde0: 52 65 61 6c 53 63 72 69 70 74 20 3d 20 53 74 72  RealScript = Str
cdf0: 44 75 70 28 26 7a 4c 69 6e 65 5b 31 5d 29 3b 0a  Dup(&zLine[1]);.
ce00: 20 20 20 20 20 20 69 66 28 20 7a 53 63 72 69 70        if( zScrip
ce10: 74 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t[i]==0 ){.     
ce20: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 71     /* If the req
ce30: 75 65 73 74 65 64 20 55 52 4c 20 64 6f 65 73 20  uested URL does 
ce40: 6e 6f 74 20 65 6e 64 20 77 69 74 68 20 22 2f 22  not end with "/"
ce50: 20 62 75 74 20 77 65 20 68 61 64 20 74 6f 0a 20   but we had to. 
ce60: 20 20 20 20 20 20 20 2a 2a 20 61 70 70 65 6e 64         ** append
ce70: 20 22 69 6e 64 65 78 2e 68 74 6d 6c 22 2c 20 74   "index.html", t
ce80: 68 65 6e 20 61 20 72 65 64 69 72 65 63 74 20 69  hen a redirect i
ce90: 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 4f 74  s necessary.  Ot
cea0: 68 65 72 77 69 73 65 0a 20 20 20 20 20 20 20 20  herwise.        
ceb0: 2a 2a 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72  ** none of the r
cec0: 65 6c 61 74 69 76 65 20 55 52 4c 73 20 69 6e 20  elative URLs in 
ced0: 74 68 65 20 64 65 6c 69 76 65 72 65 64 20 64 6f  the delivered do
cee0: 63 75 6d 65 6e 74 20 77 69 6c 6c 20 62 65 0a 20  cument will be. 
cef0: 20 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63         ** correc
cf00: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 52 65  t. */.        Re
cf10: 64 69 72 65 63 74 28 7a 52 65 61 6c 53 63 72 69  direct(zRealScri
cf20: 70 74 2c 31 2c 5f 5f 4c 49 4e 45 5f 5f 29 3b 20  pt,1,__LINE__); 
cf30: 2f 2a 20 4c 4f 47 3a 20 72 65 64 69 72 65 63 74  /* LOG: redirect
cf40: 20 74 6f 20 61 64 64 20 74 72 61 69 6c 69 6e 67   to add trailing
cf50: 20 2f 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65   / */.        re
cf60: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
cf70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
cf80: 0a 20 20 20 20 7a 4c 69 6e 65 5b 69 2b 31 5d 20  .    zLine[i+1] 
cf90: 3d 20 7a 53 63 72 69 70 74 5b 69 5d 3b 0a 20 20  = zScript[i];.  
cfa0: 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 7a 46 69    i++;.  }.  zFi
cfb0: 6c 65 20 3d 20 53 74 72 44 75 70 28 7a 4c 69 6e  le = StrDup(zLin
cfc0: 65 29 3b 0a 20 20 7a 50 61 74 68 49 6e 66 6f 20  e);.  zPathInfo 
cfd0: 3d 20 53 74 72 44 75 70 28 26 7a 53 63 72 69 70  = StrDup(&zScrip
cfe0: 74 5b 69 5d 29 3b 0a 20 20 6c 65 6e 46 69 6c 65  t[i]);.  lenFile
cff0: 20 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29   = strlen(zFile)
d000: 3b 0a 20 20 7a 44 69 72 20 3d 20 53 74 72 44 75  ;.  zDir = StrDu
d010: 70 28 7a 46 69 6c 65 29 3b 0a 20 20 66 6f 72 28  p(zFile);.  for(
d020: 69 3d 73 74 72 6c 65 6e 28 7a 44 69 72 29 2d 31  i=strlen(zDir)-1
d030: 3b 20 69 3e 30 20 26 26 20 7a 44 69 72 5b 69 5d  ; i>0 && zDir[i]
d040: 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 3b 0a 20  !='/'; i--){};. 
d050: 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20   if( i==0 ){.   
d060: 20 20 73 74 72 63 70 79 28 7a 44 69 72 2c 22 2f    strcpy(zDir,"/
d070: 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
d080: 20 20 7a 44 69 72 5b 69 5d 20 3d 20 30 3b 0a 20    zDir[i] = 0;. 
d090: 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   }..  /* Check t
d0a0: 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 69  o see if there i
d0b0: 73 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  s an authorizati
d0c0: 6f 6e 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  on file.  If the
d0d0: 72 65 20 69 73 2c 0a 20 20 2a 2a 20 70 72 6f 63  re is,.  ** proc
d0e0: 65 73 73 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73  ess it..  */.  s
d0f0: 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 25  printf(zLine, "%
d100: 73 2f 2d 61 75 74 68 22 2c 20 7a 44 69 72 29 3b  s/-auth", zDir);
d110: 0a 20 20 69 66 28 20 61 63 63 65 73 73 28 7a 4c  .  if( access(zL
d120: 69 6e 65 2c 52 5f 4f 4b 29 3d 3d 30 20 26 26 20  ine,R_OK)==0 && 
d130: 21 43 68 65 63 6b 42 61 73 69 63 41 75 74 68 6f  !CheckBasicAutho
d140: 72 69 7a 61 74 69 6f 6e 28 7a 4c 69 6e 65 29 20  rization(zLine) 
d150: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
d160: 54 61 6b 65 20 61 70 70 72 6f 70 72 69 61 74 65  Take appropriate
d170: 20 61 63 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69   action.  */.  i
d180: 66 28 20 28 73 74 61 74 62 75 66 2e 73 74 5f 6d  f( (statbuf.st_m
d190: 6f 64 65 20 26 20 30 31 30 30 29 3d 3d 30 31 30  ode & 0100)==010
d1a0: 30 20 26 26 20 61 63 63 65 73 73 28 7a 46 69 6c  0 && access(zFil
d1b0: 65 2c 58 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20  e,X_OK)==0 ){.  
d1c0: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
d1d0: 66 6f 6c 6c 6f 77 69 6e 67 73 20 73 74 61 74 69  followings stati
d1e0: 63 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  c variables are 
d1f0: 75 73 65 64 20 74 6f 20 73 65 74 75 70 20 74 68  used to setup th
d200: 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 0a 20 20  e environment.  
d210: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 43 47 49    ** for the CGI
d220: 20 73 63 72 69 70 74 0a 20 20 20 20 2a 2f 0a 20   script.    */. 
d230: 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a     static char *
d240: 64 65 66 61 75 6c 74 5f 70 61 74 68 20 3d 20 22  default_path = "
d250: 2f 62 69 6e 3a 2f 75 73 72 2f 62 69 6e 22 3b 0a  /bin:/usr/bin";.
d260: 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20      static char 
d270: 2a 67 61 74 65 77 61 79 5f 69 6e 74 65 72 66 61  *gateway_interfa
d280: 63 65 20 3d 20 22 43 47 49 2f 31 2e 30 22 3b 0a  ce = "CGI/1.0";.
d290: 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63      static struc
d2a0: 74 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  t {.      char *
d2b0: 7a 45 6e 76 4e 61 6d 65 3b 0a 20 20 20 20 20 20  zEnvName;.      
d2c0: 63 68 61 72 20 2a 2a 70 7a 45 6e 76 56 61 6c 75  char **pzEnvValu
d2d0: 65 3b 0a 20 20 20 20 7d 20 63 67 69 65 6e 76 5b  e;.    } cgienv[
d2e0: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 41  ] = {.      { "A
d2f0: 55 54 48 5f 54 59 50 45 22 2c 20 20 20 20 20 20  UTH_TYPE",      
d300: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 41               &zA
d310: 75 74 68 54 79 70 65 20 7d 2c 0a 20 20 20 20 20  uthType },.     
d320: 20 7b 20 22 41 55 54 48 5f 43 4f 4e 54 45 4e 54   { "AUTH_CONTENT
d330: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
d340: 20 20 26 7a 41 75 74 68 41 72 67 20 7d 2c 0a 20    &zAuthArg },. 
d350: 20 20 20 20 20 7b 20 22 43 4f 4e 54 45 4e 54 5f       { "CONTENT_
d360: 4c 45 4e 47 54 48 22 2c 20 20 20 20 20 20 20 20  LENGTH",        
d370: 20 20 20 20 20 20 26 7a 43 6f 6e 74 65 6e 74 4c        &zContentL
d380: 65 6e 67 74 68 20 7d 2c 0a 20 20 20 20 20 20 7b  ength },.      {
d390: 20 22 43 4f 4e 54 45 4e 54 5f 54 59 50 45 22 2c   "CONTENT_TYPE",
d3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3b0: 26 7a 43 6f 6e 74 65 6e 74 54 79 70 65 20 7d 2c  &zContentType },
d3c0: 0a 20 20 20 20 20 20 7b 20 22 44 4f 43 55 4d 45  .      { "DOCUME
d3d0: 4e 54 5f 52 4f 4f 54 22 2c 20 20 20 20 20 20 20  NT_ROOT",       
d3e0: 20 20 20 20 20 20 20 20 26 7a 48 6f 6d 65 20 7d          &zHome }
d3f0: 2c 0a 20 20 20 20 20 20 7b 20 22 47 41 54 45 57  ,.      { "GATEW
d400: 41 59 5f 49 4e 54 45 52 46 41 43 45 22 2c 20 20  AY_INTERFACE",  
d410: 20 20 20 20 20 20 20 20 20 26 67 61 74 65 77 61           &gatewa
d420: 79 5f 69 6e 74 65 72 66 61 63 65 20 7d 2c 0a 20  y_interface },. 
d430: 20 20 20 20 20 7b 20 22 48 54 54 50 5f 41 43 43       { "HTTP_ACC
d440: 45 50 54 22 2c 20 20 20 20 20 20 20 20 20 20 20  EPT",           
d450: 20 20 20 20 20 20 26 7a 41 63 63 65 70 74 20 7d        &zAccept }
d460: 2c 0a 20 20 20 20 20 20 7b 20 22 48 54 54 50 5f  ,.      { "HTTP_
d470: 41 43 43 45 50 54 5f 45 4e 43 4f 44 49 4e 47 22  ACCEPT_ENCODING"
d480: 2c 20 20 20 20 20 20 20 20 26 7a 41 63 63 65 70  ,        &zAccep
d490: 74 45 6e 63 6f 64 69 6e 67 20 7d 2c 0a 20 20 20  tEncoding },.   
d4a0: 20 20 20 7b 20 22 48 54 54 50 5f 43 4f 4f 4b 49     { "HTTP_COOKI
d4b0: 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  E",             
d4c0: 20 20 20 20 26 7a 43 6f 6f 6b 69 65 20 7d 2c 0a      &zCookie },.
d4d0: 20 20 20 20 20 20 7b 20 22 48 54 54 50 5f 48 4f        { "HTTP_HO
d4e0: 53 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ST",            
d4f0: 20 20 20 20 20 20 20 26 7a 48 74 74 70 48 6f 73         &zHttpHos
d500: 74 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 48 54  t },.      { "HT
d510: 54 50 5f 52 45 46 45 52 45 52 22 2c 20 20 20 20  TP_REFERER",    
d520: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 52 65              &zRe
d530: 66 65 72 65 72 20 7d 2c 0a 20 20 20 20 20 20 7b  ferer },.      {
d540: 20 22 48 54 54 50 5f 55 53 45 52 5f 41 47 45 4e   "HTTP_USER_AGEN
d550: 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  T",             
d560: 26 7a 41 67 65 6e 74 20 7d 2c 0a 20 20 20 20 20  &zAgent },.     
d570: 20 7b 20 22 50 41 54 48 22 2c 20 20 20 20 20 20   { "PATH",      
d580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d590: 20 20 26 64 65 66 61 75 6c 74 5f 70 61 74 68 20    &default_path 
d5a0: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 50 41 54 48  },.      { "PATH
d5b0: 5f 49 4e 46 4f 22 2c 20 20 20 20 20 20 20 20 20  _INFO",         
d5c0: 20 20 20 20 20 20 20 20 20 20 26 7a 50 61 74 68            &zPath
d5d0: 49 6e 66 6f 20 7d 2c 0a 20 20 20 20 20 20 7b 20  Info },.      { 
d5e0: 22 51 55 45 52 59 5f 53 54 52 49 4e 47 22 2c 20  "QUERY_STRING", 
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
d600: 7a 51 75 65 72 79 53 74 72 69 6e 67 20 7d 2c 0a  zQueryString },.
d610: 20 20 20 20 20 20 7b 20 22 52 45 4d 4f 54 45 5f        { "REMOTE_
d620: 41 44 44 52 22 2c 20 20 20 20 20 20 20 20 20 20  ADDR",          
d630: 20 20 20 20 20 20 20 26 7a 52 65 6d 6f 74 65 41         &zRemoteA
d640: 64 64 72 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  ddr },.      { "
d650: 52 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 22 2c  REQUEST_METHOD",
d660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
d670: 4d 65 74 68 6f 64 20 7d 2c 0a 20 20 20 20 20 20  Method },.      
d680: 7b 20 22 52 45 51 55 45 53 54 5f 55 52 49 22 2c  { "REQUEST_URI",
d690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6a0: 20 26 7a 53 63 72 69 70 74 20 7d 2c 0a 20 20 20   &zScript },.   
d6b0: 20 20 20 7b 20 22 52 45 4d 4f 54 45 5f 55 53 45     { "REMOTE_USE
d6c0: 52 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  R",             
d6d0: 20 20 20 20 26 7a 52 65 6d 6f 74 65 55 73 65 72      &zRemoteUser
d6e0: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 43 52   },.      { "SCR
d6f0: 49 50 54 5f 44 49 52 45 43 54 4f 52 59 22 2c 20  IPT_DIRECTORY", 
d700: 20 20 20 20 20 20 20 20 20 20 20 26 7a 44 69 72             &zDir
d710: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 43 52   },.      { "SCR
d720: 49 50 54 5f 46 49 4c 45 4e 41 4d 45 22 2c 20 20  IPT_FILENAME",  
d730: 20 20 20 20 20 20 20 20 20 20 20 26 7a 46 69 6c             &zFil
d740: 65 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 43  e },.      { "SC
d750: 52 49 50 54 5f 4e 41 4d 45 22 2c 20 20 20 20 20  RIPT_NAME",     
d760: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 52 65              &zRe
d770: 61 6c 53 63 72 69 70 74 20 7d 2c 0a 20 20 20 20  alScript },.    
d780: 20 20 7b 20 22 53 45 52 56 45 52 5f 4e 41 4d 45    { "SERVER_NAME
d790: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
d7a0: 20 20 20 26 7a 53 65 72 76 65 72 4e 61 6d 65 20     &zServerName 
d7b0: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 45 52 56  },.      { "SERV
d7c0: 45 52 5f 50 4f 52 54 22 2c 20 20 20 20 20 20 20  ER_PORT",       
d7d0: 20 20 20 20 20 20 20 20 20 20 26 7a 53 65 72 76            &zServ
d7e0: 65 72 50 6f 72 74 20 7d 2c 0a 20 20 20 20 20 20  erPort },.      
d7f0: 7b 20 22 53 45 52 56 45 52 5f 50 52 4f 54 4f 43  { "SERVER_PROTOC
d800: 4f 4c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  OL",            
d810: 20 26 7a 50 72 6f 74 6f 63 6f 6c 20 7d 2c 0a 20   &zProtocol },. 
d820: 20 20 20 7d 3b 0a 20 20 20 20 63 68 61 72 20 2a     };.    char *
d830: 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 3b 20 20  zBaseFilename;  
d840: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61         /* Filena
d850: 6d 65 20 77 69 74 68 6f 75 74 20 64 69 72 65 63  me without direc
d860: 74 6f 72 79 20 70 72 65 66 69 78 20 2a 2f 0a 20  tory prefix */. 
d870: 20 20 20 69 6e 74 20 73 65 65 6e 43 6f 6e 74 65     int seenConte
d880: 6e 74 4c 65 6e 67 74 68 20 3d 20 30 3b 20 20 20  ntLength = 0;   
d890: 2f 2a 20 54 72 75 65 20 69 66 20 43 6f 6e 74 65  /* True if Conte
d8a0: 6e 74 2d 6c 65 6e 67 74 68 3a 20 68 65 61 64 65  nt-length: heade
d8b0: 72 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  r seen */.    in
d8c0: 74 20 6e 52 65 73 20 3d 20 30 3b 20 20 20 20 20  t nRes = 0;     
d8d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
d8e0: 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 20 2a  tes of payload *
d8f0: 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61 6c 6c 6f  /.    int nMallo
d900: 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
d910: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
d920: 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74  pace allocated t
d930: 6f 20 61 52 65 73 20 2a 2f 0a 20 20 20 20 63 68  o aRes */.    ch
d940: 61 72 20 2a 61 52 65 73 20 3d 20 30 3b 20 20 20  ar *aRes = 0;   
d950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
d960: 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 20 20 2f 2a  yload */..    /*
d970: 20 49 66 20 69 74 73 20 65 78 65 63 75 74 61 62   If its executab
d980: 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 61  le, it must be a
d990: 20 43 47 49 20 70 72 6f 67 72 61 6d 2e 20 20 53   CGI program.  S
d9a0: 74 61 72 74 20 62 79 0a 20 20 20 20 2a 2a 20 63  tart by.    ** c
d9b0: 68 61 6e 67 69 6e 67 20 64 69 72 65 63 74 6f 72  hanging director
d9c0: 69 65 73 20 74 6f 20 74 68 65 20 64 69 72 65 63  ies to the direc
d9d0: 74 6f 72 79 20 68 6f 6c 64 69 6e 67 20 74 68 65  tory holding the
d9e0: 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20 2a 2f   program..    */
d9f0: 0a 20 20 20 20 69 66 28 20 63 68 64 69 72 28 7a  .    if( chdir(z
da00: 44 69 72 29 20 29 7b 0a 20 20 20 20 20 20 63 68  Dir) ){.      ch
da10: 61 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20  ar zBuf[1000];. 
da20: 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e       Malfunction
da30: 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a 20 4c 4f  (__LINE__, /* LO
da40: 47 3a 20 63 68 64 69 72 28 29 20 66 61 69 6c 65  G: chdir() faile
da50: 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  d */.           
da60: 22 63 61 6e 6e 6f 74 20 63 68 64 69 72 20 74 6f  "cannot chdir to
da70: 20 5b 25 73 5d 20 66 72 6f 6d 20 5b 25 73 5d 22   [%s] from [%s]"
da80: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 7a 44  , .           zD
da90: 69 72 2c 20 67 65 74 63 77 64 28 7a 42 75 66 2c  ir, getcwd(zBuf,
daa0: 39 39 39 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  999));.    }..  
dab0: 20 20 2f 2a 20 53 65 74 75 70 20 74 68 65 20 65    /* Setup the e
dac0: 6e 76 69 72 6f 6e 6d 65 6e 74 20 61 70 70 72 6f  nvironment appro
dad0: 70 72 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2f  priately..    */
dae0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
daf0: 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 63 67 69  (int)(sizeof(cgi
db00: 65 6e 76 29 2f 73 69 7a 65 6f 66 28 63 67 69 65  env)/sizeof(cgie
db10: 6e 76 5b 30 5d 29 29 3b 20 69 2b 2b 29 7b 0a 20  nv[0])); i++){. 
db20: 20 20 20 20 20 69 66 28 20 2a 63 67 69 65 6e 76       if( *cgienv
db30: 5b 69 5d 2e 70 7a 45 6e 76 56 61 6c 75 65 20 29  [i].pzEnvValue )
db40: 7b 0a 20 20 20 20 20 20 20 20 53 65 74 45 6e 76  {.        SetEnv
db50: 28 63 67 69 65 6e 76 5b 69 5d 2e 7a 45 6e 76 4e  (cgienv[i].zEnvN
db60: 61 6d 65 2c 2a 63 67 69 65 6e 76 5b 69 5d 2e 70  ame,*cgienv[i].p
db70: 7a 45 6e 76 56 61 6c 75 65 29 3b 0a 20 20 20 20  zEnvValue);.    
db80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
db90: 28 20 75 73 65 48 74 74 70 73 20 29 7b 0a 20 20  ( useHttps ){.  
dba0: 20 20 20 20 70 75 74 65 6e 76 28 22 48 54 54 50      putenv("HTTP
dbb0: 53 3d 6f 6e 22 29 3b 0a 20 20 20 20 7d 0a 0a 20  S=on");.    }.. 
dbc0: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 41 62 6f     /*.    ** Abo
dbd0: 72 74 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  rt with an error
dbe0: 20 69 66 20 74 68 65 20 43 47 49 20 73 63 72 69   if the CGI scri
dbf0: 70 74 20 69 73 20 77 72 69 74 61 62 6c 65 20 62  pt is writable b
dc00: 79 20 61 6e 79 6f 6e 65 20 6f 74 68 65 72 0a 20  y anyone other. 
dc10: 20 20 20 2a 2a 20 74 68 61 6e 20 69 74 73 20 6f     ** than its o
dc20: 77 6e 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  wner..    */.   
dc30: 20 69 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f   if( statbuf.st_
dc40: 6d 6f 64 65 20 26 20 30 30 32 32 20 29 7b 0a 20  mode & 0022 ){. 
dc50: 20 20 20 20 20 43 67 69 53 63 72 69 70 74 57 72       CgiScriptWr
dc60: 69 74 61 62 6c 65 28 29 3b 0a 20 20 20 20 7d 0a  itable();.    }.
dc70: 0a 20 20 20 20 2f 2a 20 46 6f 72 20 74 68 65 20  .    /* For the 
dc80: 50 4f 53 54 20 6d 65 74 68 6f 64 20 61 6c 6c 20  POST method all 
dc90: 69 6e 70 75 74 20 68 61 73 20 62 65 65 6e 20 77  input has been w
dca0: 72 69 74 74 65 6e 20 74 6f 20 61 20 74 65 6d 70  ritten to a temp
dcb0: 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 20 20  orary file,.    
dcc0: 2a 2a 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f  ** so we have to
dcd0: 20 72 65 64 69 72 65 63 74 20 69 6e 70 75 74 20   redirect input 
dce0: 74 6f 20 74 68 65 20 43 47 49 20 73 63 72 69 70  to the CGI scrip
dcf0: 74 20 66 72 6f 6d 20 74 68 61 74 20 66 69 6c 65  t from that file
dd00: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
dd10: 20 7a 4d 65 74 68 6f 64 5b 30 5d 3d 3d 27 50 27   zMethod[0]=='P'
dd20: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 75   ){.      if( du
dd30: 70 28 30 29 3c 30 20 29 7b 0a 20 20 20 20 20 20  p(0)<0 ){.      
dd40: 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f    Malfunction(__
dd50: 4c 49 4e 45 5f 5f 2c 20 20 2f 2a 20 4c 4f 47 3a  LINE__,  /* LOG:
dd60: 20 64 75 70 28 29 20 66 61 69 6c 65 64 20 2a 2f   dup() failed */
dd70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dd80: 20 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f 20       "Unable to 
dd90: 64 75 70 6c 69 63 61 74 69 6f 6e 20 66 69 6c 65  duplication file
dda0: 20 64 65 73 63 72 69 70 74 6f 72 20 30 22 29 3b   descriptor 0");
ddb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
ddc0: 6c 6f 73 65 28 30 29 3b 0a 20 20 20 20 20 20 6f  lose(0);.      o
ddd0: 70 65 6e 28 7a 54 6d 70 4e 61 6d 2c 20 4f 5f 52  pen(zTmpNam, O_R
dde0: 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 7d 0a 0a 20  DONLY);.    }.. 
ddf0: 20 20 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28     for(i=strlen(
de00: 7a 46 69 6c 65 29 2d 31 3b 20 69 3e 3d 30 20 26  zFile)-1; i>=0 &
de10: 26 20 7a 46 69 6c 65 5b 69 5d 21 3d 27 2f 27 3b  & zFile[i]!='/';
de20: 20 69 2d 2d 29 7b 7d 0a 20 20 20 20 7a 42 61 73   i--){}.    zBas
de30: 65 46 69 6c 65 6e 61 6d 65 20 3d 20 26 7a 46 69  eFilename = &zFi
de40: 6c 65 5b 69 2b 31 5d 3b 0a 20 20 20 20 69 66 28  le[i+1];.    if(
de50: 20 69 3e 3d 30 20 26 26 20 73 74 72 6e 63 6d 70   i>=0 && strncmp
de60: 28 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c 22  (zBaseFilename,"
de70: 6e 70 68 2d 22 2c 34 29 3d 3d 30 20 29 7b 0a 20  nph-",4)==0 ){. 
de80: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6e       /* If the n
de90: 61 6d 65 20 6f 66 20 74 68 65 20 43 47 49 20 73  ame of the CGI s
dea0: 63 72 69 70 74 20 62 65 67 69 6e 73 20 77 69 74  cript begins wit
deb0: 68 20 22 6e 70 68 2d 22 20 74 68 65 6e 20 77 65  h "nph-" then we
dec0: 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 64 65   are.      ** de
ded0: 61 6c 69 6e 67 20 77 69 74 68 20 61 20 22 6e 6f  aling with a "no
dee0: 6e 2d 70 61 72 73 65 64 20 68 65 61 64 65 72 73  n-parsed headers
def0: 22 20 43 47 49 20 73 63 72 69 70 74 2e 20 20 4a  " CGI script.  J
df00: 75 73 74 20 65 78 65 63 28 29 0a 20 20 20 20 20  ust exec().     
df10: 20 2a 2a 20 69 74 20 64 69 72 65 63 74 6c 79 20   ** it directly 
df20: 61 6e 64 20 6c 65 74 20 69 74 20 68 61 6e 64 6c  and let it handl
df30: 65 20 61 6c 6c 20 69 74 73 20 6f 77 6e 20 68 65  e all its own he
df40: 61 64 65 72 20 67 65 6e 65 72 61 74 69 6f 6e 2e  ader generation.
df50: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
df60: 65 78 65 63 6c 28 7a 42 61 73 65 46 69 6c 65 6e  execl(zBaseFilen
df70: 61 6d 65 2c 7a 42 61 73 65 46 69 6c 65 6e 61 6d  ame,zBaseFilenam
df80: 65 2c 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  e,(char*)0);.   
df90: 20 20 20 2f 2a 20 4e 4f 54 45 3a 20 4e 6f 20 6c     /* NOTE: No l
dfa0: 6f 67 20 65 6e 74 72 79 20 77 72 69 74 74 65 6e  og entry written
dfb0: 20 66 6f 72 20 6e 70 68 2d 20 73 63 72 69 70 74   for nph- script
dfc0: 73 20 2a 2f 0a 20 20 20 20 20 20 65 78 69 74 28  s */.      exit(
dfd0: 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  0);.    }..    /
dfe0: 2a 20 46 61 6c 6c 20 74 68 72 75 20 74 6f 20 68  * Fall thru to h
dff0: 65 72 65 20 6f 6e 6c 79 20 69 66 20 74 68 69 73  ere only if this
e000: 20 70 72 6f 63 65 73 73 20 28 74 68 65 20 73 65   process (the se
e010: 72 76 65 72 29 20 69 73 20 67 6f 69 6e 67 0a 20  rver) is going. 
e020: 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 61 6e     ** to read an
e030: 64 20 61 75 67 6d 65 6e 74 20 74 68 65 20 68 65  d augment the he
e040: 61 64 65 72 20 73 65 6e 74 20 62 61 63 6b 20 62  ader sent back b
e050: 79 20 74 68 65 20 43 47 49 20 70 72 6f 63 65 73  y the CGI proces
e060: 73 2e 0a 20 20 20 20 2a 2a 20 4f 70 65 6e 20 61  s..    ** Open a
e070: 20 70 69 70 65 20 74 6f 20 72 65 63 65 69 76 65   pipe to receive
e080: 20 74 68 65 20 6f 75 74 70 75 74 20 66 72 6f 6d   the output from
e090: 20 74 68 65 20 43 47 49 20 70 72 6f 63 65 73 73   the CGI process
e0a0: 2e 20 20 54 68 65 6e 0a 20 20 20 20 2a 2a 20 66  .  Then.    ** f
e0b0: 6f 72 6b 20 74 68 65 20 43 47 49 20 70 72 6f 63  ork the CGI proc
e0c0: 65 73 73 2e 20 20 4f 6e 63 65 20 65 76 65 72 79  ess.  Once every
e0d0: 74 68 69 6e 67 20 69 73 20 64 6f 6e 65 2c 20 77  thing is done, w
e0e0: 65 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20 20  e should be.    
e0f0: 2a 2a 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20  ** able to read 
e100: 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 43 47  the output of CG
e110: 49 20 6f 6e 20 74 68 65 20 22 69 6e 22 20 73 74  I on the "in" st
e120: 72 65 61 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ream..    */.   
e130: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 78 5b   {.      int px[
e140: 32 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 69  2];.      if( pi
e150: 70 65 28 70 78 29 20 29 7b 0a 20 20 20 20 20 20  pe(px) ){.      
e160: 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f    Malfunction(__
e170: 4c 49 4e 45 5f 5f 2c 20 2f 2a 20 4c 4f 47 3a 20  LINE__, /* LOG: 
e180: 70 69 70 65 28 29 20 66 61 69 6c 65 64 20 2a 2f  pipe() failed */
e190: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e1a0: 20 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f 20       "Unable to 
e1b0: 63 72 65 61 74 65 20 61 20 70 69 70 65 20 66 6f  create a pipe fo
e1c0: 72 20 74 68 65 20 43 47 49 20 70 72 6f 67 72 61  r the CGI progra
e1d0: 6d 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  m");.      }.   
e1e0: 20 20 20 69 66 28 20 66 6f 72 6b 28 29 3d 3d 30     if( fork()==0
e1f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73   ){.        clos
e200: 65 28 70 78 5b 30 5d 29 3b 0a 20 20 20 20 20 20  e(px[0]);.      
e210: 20 20 63 6c 6f 73 65 28 31 29 3b 0a 20 20 20 20    close(1);.    
e220: 20 20 20 20 69 66 28 20 64 75 70 28 70 78 5b 31      if( dup(px[1
e230: 5d 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  ])!=1 ){.       
e240: 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f     Malfunction(_
e250: 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a 20 4c 4f 47 3a  _LINE__, /* LOG:
e260: 20 64 75 70 28 29 20 66 61 69 6c 65 64 20 2a 2f   dup() failed */
e270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e280: 20 20 22 55 6e 61 62 6c 65 20 74 6f 20 64 75 70    "Unable to dup
e290: 6c 69 63 61 74 65 20 66 69 6c 65 20 64 65 73 63  licate file desc
e2a0: 72 69 70 74 6f 72 20 25 64 20 74 6f 20 31 22 2c  riptor %d to 1",
e2b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e2c0: 20 20 70 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20    px[1]);.      
e2d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 6c 6f 73    }.        clos
e2e0: 65 28 70 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20  e(px[1]);.      
e2f0: 20 20 65 78 65 63 6c 28 7a 42 61 73 65 46 69 6c    execl(zBaseFil
e300: 65 6e 61 6d 65 2c 20 7a 42 61 73 65 46 69 6c 65  ename, zBaseFile
e310: 6e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b  name, (char*)0);
e320: 0a 20 20 20 20 20 20 20 20 65 78 69 74 28 30 29  .        exit(0)
e330: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e340: 63 6c 6f 73 65 28 70 78 5b 31 5d 29 3b 0a 20 20  close(px[1]);.  
e350: 20 20 20 20 69 6e 20 3d 20 66 64 6f 70 65 6e 28      in = fdopen(
e360: 70 78 5b 30 5d 2c 20 22 72 22 29 3b 0a 20 20 20  px[0], "r");.   
e370: 20 7d 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30   }.    if( in==0
e380: 20 29 7b 0a 20 20 20 20 20 20 43 67 69 45 72 72   ){.      CgiErr
e390: 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  or();.    }..   
e3a0: 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 70 72 6f   /* Read and pro
e3b0: 63 65 73 73 20 74 68 65 20 66 69 72 73 74 20 6c  cess the first l
e3c0: 69 6e 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ine of the heade
e3d0: 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  r returned by th
e3e0: 65 0a 20 20 20 20 2a 2a 20 43 47 49 20 73 63 72  e.    ** CGI scr
e3f0: 69 70 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ipt..    */.    
e400: 69 66 28 20 75 73 65 54 69 6d 65 6f 75 74 20 29  if( useTimeout )
e410: 20 61 6c 61 72 6d 28 31 35 29 3b 0a 20 20 20 20   alarm(15);.    
e420: 77 68 69 6c 65 28 20 66 67 65 74 73 28 7a 4c 69  while( fgets(zLi
e430: 6e 65 2c 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29  ne,sizeof(zLine)
e440: 2c 69 6e 29 20 26 26 20 21 69 73 73 70 61 63 65  ,in) && !isspace
e450: 28 7a 4c 69 6e 65 5b 30 5d 29 20 29 7b 0a 20 20  (zLine[0]) ){.  
e460: 20 20 20 20 69 66 28 20 73 74 72 6e 63 61 73 65      if( strncase
e470: 63 6d 70 28 7a 4c 69 6e 65 2c 22 4c 6f 63 61 74  cmp(zLine,"Locat
e480: 69 6f 6e 3a 22 2c 39 29 3d 3d 30 20 29 7b 0a 20  ion:",9)==0 ){. 
e490: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
e4a0: 20 20 20 20 20 20 52 65 6d 6f 76 65 4e 65 77 6c        RemoveNewl
e4b0: 69 6e 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  ine(zLine);.    
e4c0: 20 20 20 20 7a 20 3d 20 26 7a 4c 69 6e 65 5b 31      z = &zLine[1
e4d0: 30 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  0];.        whil
e4e0: 65 28 20 69 73 73 70 61 63 65 28 2a 7a 29 20 29  e( isspace(*z) )
e4f0: 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20  { z++; }.       
e500: 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20   for(i=0; z[i]; 
e510: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
e520: 69 66 28 20 7a 5b 69 5d 3d 3d 27 3f 27 20 29 7b  if( z[i]=='?' ){
e530: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75  .            zQu
e540: 65 72 79 53 75 66 66 69 78 20 3d 20 53 74 72 44  erySuffix = StrD
e550: 75 70 28 22 22 29 3b 0a 20 20 20 20 20 20 20 20  up("");.        
e560: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
e570: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 69        .        i
e580: 66 28 20 7a 5b 30 5d 3d 3d 27 2f 27 20 26 26 20  f( z[0]=='/' && 
e590: 7a 5b 31 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  z[1]=='/' ){.   
e5a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 63         /* The sc
e5b0: 68 65 6d 65 20 69 73 20 6d 69 73 73 69 6e 67 2e  heme is missing.
e5c0: 20 20 41 64 64 20 69 74 20 69 6e 20 62 65 66 6f    Add it in befo
e5d0: 72 65 20 72 65 64 69 72 65 63 74 69 6e 67 20 2a  re redirecting *
e5e0: 2f 0a 20 20 20 20 20 20 20 20 20 20 53 74 61 72  /.          Star
e5f0: 74 52 65 73 70 6f 6e 73 65 28 22 33 30 32 20 52  tResponse("302 R
e600: 65 64 69 72 65 63 74 22 29 3b 0a 20 20 20 20 20  edirect");.     
e610: 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69       nOut += pri
e620: 6e 74 66 28 22 4c 6f 63 61 74 69 6f 6e 3a 20 25  ntf("Location: %
e630: 73 3a 25 73 25 73 5c 72 5c 6e 22 2c 7a 48 74 74  s:%s%s\r\n",zHtt
e640: 70 2c 7a 2c 7a 51 75 65 72 79 53 75 66 66 69 78  p,z,zQuerySuffix
e650: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  );.          con
e660: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
e670: 65 6c 73 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  else if( z[0]=='
e680: 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  /' ){.          
e690: 2f 2a 20 54 68 65 20 73 63 68 65 6d 65 20 61 6e  /* The scheme an
e6a0: 64 20 6e 65 74 77 6f 72 6b 20 6c 6f 63 61 74 69  d network locati
e6b0: 6f 6e 20 61 72 65 20 6d 69 73 73 69 6e 67 20 62  on are missing b
e6c0: 75 74 20 77 65 20 68 61 76 65 0a 20 20 20 20 20  ut we have.     
e6d0: 20 20 20 20 20 2a 2a 20 61 6e 20 61 62 73 6f 6c       ** an absol
e6e0: 75 74 65 20 70 61 74 68 2e 20 2a 2f 0a 20 20 20  ute path. */.   
e6f0: 20 20 20 20 20 20 20 52 65 64 69 72 65 63 74 28         Redirect(
e700: 7a 2c 20 30 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  z, 0, __LINE__);
e710: 20 2f 2a 20 4c 4f 47 3a 20 52 65 64 69 72 65 63   /* LOG: Redirec
e720: 74 20 66 72 6f 6d 20 43 47 49 20 2a 2f 0a 20 20  t from CGI */.  
e730: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
e740: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e750: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
e760: 73 65 65 20 69 66 20 74 68 65 72 65 20 69 73 20  see if there is 
e770: 61 20 73 63 68 65 6d 65 20 70 72 65 66 69 78 20  a scheme prefix 
e780: 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  */.        for(i
e790: 3d 30 3b 20 7a 5b 69 5d 20 26 26 20 7a 5b 69 5d  =0; z[i] && z[i]
e7a0: 21 3d 27 3a 27 20 26 26 20 7a 5b 69 5d 21 3d 27  !=':' && z[i]!='
e7b0: 2f 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20  /'; i++){}.     
e7c0: 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 3a 27     if( z[i]==':'
e7d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
e7e0: 20 57 65 20 68 61 76 65 20 61 20 73 63 68 65 6d   We have a schem
e7f0: 65 2e 20 20 41 73 73 75 6d 65 20 74 68 65 72 65  e.  Assume there
e800: 20 69 73 20 61 6e 20 61 62 73 6f 6c 75 74 65 20   is an absolute 
e810: 55 52 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  URL */.         
e820: 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22   StartResponse("
e830: 33 30 32 20 52 65 64 69 72 65 63 74 22 29 3b 0a  302 Redirect");.
e840: 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20 2b            nOut +
e850: 3d 20 70 72 69 6e 74 66 28 22 4c 6f 63 61 74 69  = printf("Locati
e860: 6f 6e 3a 20 25 73 25 73 5c 72 5c 6e 22 2c 7a 2c  on: %s%s\r\n",z,
e870: 7a 51 75 65 72 79 53 75 66 66 69 78 29 3b 0a 20  zQuerySuffix);. 
e880: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
e890: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
e8a0: 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20       /* Must be 
e8b0: 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
e8c0: 61 6d 65 2e 20 20 43 6f 6e 73 74 72 75 63 74 20  ame.  Construct 
e8d0: 74 68 65 20 61 62 73 6f 6c 75 74 65 20 70 61 74  the absolute pat
e8e0: 68 6e 61 6d 65 0a 20 20 20 20 20 20 20 20 2a 2a  hname.        **
e8f0: 20 61 6e 64 20 72 65 64 69 72 65 63 74 20 74 6f   and redirect to
e900: 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20   it. */.        
e910: 69 20 3d 20 73 74 72 6c 65 6e 28 7a 52 65 61 6c  i = strlen(zReal
e920: 53 63 72 69 70 74 29 3b 0a 20 20 20 20 20 20 20  Script);.       
e930: 20 77 68 69 6c 65 28 20 69 3e 30 20 26 26 20 7a   while( i>0 && z
e940: 52 65 61 6c 53 63 72 69 70 74 5b 69 2d 31 5d 21  RealScript[i-1]!
e950: 3d 27 2f 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20  ='/' ){ i--; }. 
e960: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3e         while( i>
e970: 30 20 26 26 20 7a 52 65 61 6c 53 63 72 69 70 74  0 && zRealScript
e980: 5b 69 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 69 2d  [i-1]=='/' ){ i-
e990: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 77 68 69  -; }.        whi
e9a0: 6c 65 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b 0a 20  le( *z=='.' ){. 
e9b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 31           if( z[1
e9c0: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
e9d0: 20 20 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20        z += 2;.  
e9e0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
e9f0: 28 20 7a 5b 31 5d 3d 3d 27 2e 27 20 26 26 20 7a  ( z[1]=='.' && z
ea00: 5b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [2]=='/' ){.    
ea10: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69          while( i
ea20: 3e 30 20 26 26 20 7a 52 65 61 6c 53 63 72 69 70  >0 && zRealScrip
ea30: 74 5b 69 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 69  t[i-1]!='/' ){ i
ea40: 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20  --; }.          
ea50: 20 20 77 68 69 6c 65 28 20 69 3e 30 20 26 26 20    while( i>0 && 
ea60: 7a 52 65 61 6c 53 63 72 69 70 74 5b 69 2d 31 5d  zRealScript[i-1]
ea70: 3d 3d 27 2f 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a  =='/' ){ i--; }.
ea80: 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 2b 3d              z +=
ea90: 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   3;.          }e
eaa0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
eab0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
eac0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
ead0: 0a 20 20 20 20 20 20 20 20 53 74 61 72 74 52 65  .        StartRe
eae0: 73 70 6f 6e 73 65 28 22 33 30 32 20 52 65 64 69  sponse("302 Redi
eaf0: 72 65 63 74 22 29 3b 0a 20 20 20 20 20 20 20 20  rect");.        
eb00: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22  nOut += printf("
eb10: 4c 6f 63 61 74 69 6f 6e 3a 20 25 73 3a 2f 2f 25  Location: %s://%
eb20: 73 22 2c 7a 48 74 74 70 2c 7a 53 65 72 76 65 72  s",zHttp,zServer
eb30: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
eb40: 66 28 20 73 74 72 63 6d 70 28 7a 53 65 72 76 65  f( strcmp(zServe
eb50: 72 50 6f 72 74 2c 22 38 30 22 29 20 29 7b 0a 20  rPort,"80") ){. 
eb60: 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d           nOut +=
eb70: 20 70 72 69 6e 74 66 28 22 3a 25 73 22 2c 7a 53   printf(":%s",zS
eb80: 65 72 76 65 72 50 6f 72 74 29 3b 0a 20 20 20 20  erverPort);.    
eb90: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 4f      }.        nO
eba0: 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 25 2e  ut += printf("%.
ebb0: 2a 73 2f 25 73 25 73 5c 72 5c 6e 5c 72 5c 6e 22  *s/%s%s\r\n\r\n"
ebc0: 2c 69 2c 7a 52 65 61 6c 53 63 72 69 70 74 2c 7a  ,i,zRealScript,z
ebd0: 2c 7a 51 75 65 72 79 53 75 66 66 69 78 29 3b 0a  ,zQuerySuffix);.
ebe0: 20 20 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45          MakeLogE
ebf0: 6e 74 72 79 28 30 2c 20 5f 5f 4c 49 4e 45 5f 5f  ntry(0, __LINE__
ec00: 29 3b 20 2f 2a 20 4c 4f 47 3a 20 43 47 49 20 72  ); /* LOG: CGI r
ec10: 65 64 69 72 65 63 74 20 2a 2f 0a 20 20 20 20 20  edirect */.     
ec20: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
ec30: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63   }else if( strnc
ec40: 61 73 65 63 6d 70 28 7a 4c 69 6e 65 2c 22 53 74  asecmp(zLine,"St
ec50: 61 74 75 73 3a 22 2c 37 29 3d 3d 30 20 29 7b 0a  atus:",7)==0 ){.
ec60: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
ec70: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 37 3b 20         for(i=7; 
ec80: 69 73 73 70 61 63 65 28 7a 4c 69 6e 65 5b 69 5d  isspace(zLine[i]
ec90: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  ); i++){}.      
eca0: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
ecb0: 28 22 25 73 20 25 73 22 2c 20 7a 50 72 6f 74 6f  ("%s %s", zProto
ecc0: 63 6f 6c 2c 20 26 7a 4c 69 6e 65 5b 69 5d 29 3b  col, &zLine[i]);
ecd0: 0a 20 20 20 20 20 20 20 20 73 74 72 6e 63 70 79  .        strncpy
ece0: 28 7a 52 65 70 6c 79 53 74 61 74 75 73 2c 20 26  (zReplyStatus, &
ecf0: 7a 4c 69 6e 65 5b 69 5d 2c 20 33 29 3b 0a 20 20  zLine[i], 3);.  
ed00: 20 20 20 20 20 20 7a 52 65 70 6c 79 53 74 61 74        zReplyStat
ed10: 75 73 5b 33 5d 20 3d 20 30 3b 0a 20 20 20 20 20  us[3] = 0;.     
ed20: 20 20 20 73 74 61 74 75 73 53 65 6e 74 20 3d 20     statusSent = 
ed30: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
ed40: 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e          if( strn
ed50: 63 61 73 65 63 6d 70 28 7a 4c 69 6e 65 2c 20 22  casecmp(zLine, "
ed60: 43 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74 68 3a 22  Content-length:"
ed70: 2c 20 31 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 14)==0 ){.    
ed80: 20 20 20 20 20 20 73 65 65 6e 43 6f 6e 74 65 6e        seenConten
ed90: 74 4c 65 6e 67 74 68 20 3d 20 31 3b 0a 20 20 20  tLength = 1;.   
eda0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 53       }.        S
edb0: 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 32 30  tartResponse("20
edc0: 30 20 4f 4b 22 29 3b 0a 20 20 20 20 20 20 20 20  0 OK");.        
edd0: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22  nOut += printf("
ede0: 25 73 22 2c 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  %s",zLine);.    
edf0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
ee00: 2a 20 43 6f 70 79 20 65 76 65 72 79 74 68 69 6e  * Copy everythin
ee10: 67 20 65 6c 73 65 20 74 68 72 75 20 77 69 74 68  g else thru with
ee20: 6f 75 74 20 63 68 61 6e 67 65 20 6f 72 20 61 6e  out change or an
ee30: 61 6c 79 73 69 73 2e 0a 20 20 20 20 2a 2f 0a 20  alysis..    */. 
ee40: 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65     StartResponse
ee50: 28 22 32 30 30 20 4f 4b 22 29 3b 0a 20 20 20 20  ("200 OK");.    
ee60: 69 66 28 20 75 73 65 54 69 6d 65 6f 75 74 20 29  if( useTimeout )
ee70: 20 61 6c 61 72 6d 28 36 30 2a 35 29 3b 0a 20 20   alarm(60*5);.  
ee80: 20 20 69 66 28 20 73 65 65 6e 43 6f 6e 74 65 6e    if( seenConten
ee90: 74 4c 65 6e 67 74 68 20 29 7b 0a 20 20 20 20 20  tLength ){.     
eea0: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
eeb0: 22 25 73 22 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20  "%s", zLine);.  
eec0: 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20      while( (c = 
eed0: 67 65 74 63 28 69 6e 29 29 21 3d 45 4f 46 20 29  getc(in))!=EOF )
eee0: 7b 0a 20 20 20 20 20 20 20 20 70 75 74 63 28 63  {.        putc(c
eef0: 2c 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20  ,stdout);.      
ef00: 20 20 6e 4f 75 74 2b 2b 3b 0a 20 20 20 20 20 20    nOut++;.      
ef10: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
ef20: 20 20 20 6e 52 65 73 20 3d 20 30 3b 0a 20 20 20     nRes = 0;.   
ef30: 20 20 20 6e 4d 61 6c 6c 6f 63 20 3d 20 31 30 30     nMalloc = 100
ef40: 30 3b 0a 20 20 20 20 20 20 61 52 65 73 20 3d 20  0;.      aRes = 
ef50: 6d 61 6c 6c 6f 63 28 6e 4d 61 6c 6c 6f 63 2b 31  malloc(nMalloc+1
ef60: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 52 65  );.      if( aRe
ef70: 73 3d 3d 30 20 29 20 4d 61 6c 66 75 6e 63 74 69  s==0 ) Malfuncti
ef80: 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 22 4f 75 74  on(__LINE__,"Out
ef90: 20 6f 66 20 6d 65 6d 6f 72 79 3a 20 25 64 20 62   of memory: %d b
efa0: 79 74 65 73 22 2c 20 6e 4d 61 6c 6c 6f 63 29 3b  ytes", nMalloc);
efb0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63  .      while( (c
efc0: 20 3d 20 67 65 74 63 28 69 6e 29 29 21 3d 45 4f   = getc(in))!=EO
efd0: 46 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  F ){.        if(
efe0: 20 6e 52 65 73 3e 3d 6e 4d 61 6c 6c 6f 63 20 29   nRes>=nMalloc )
eff0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4d 61 6c  {.          nMal
f000: 6c 6f 63 20 3d 20 6e 4d 61 6c 6c 6f 63 2a 32 3b  loc = nMalloc*2;
f010: 0a 20 20 20 20 20 20 20 20 20 20 61 52 65 73 20  .          aRes 
f020: 3d 20 72 65 61 6c 6c 6f 63 28 61 52 65 73 2c 20  = realloc(aRes, 
f030: 6e 4d 61 6c 6c 6f 63 2b 31 29 3b 0a 20 20 20 20  nMalloc+1);.    
f040: 20 20 20 20 20 20 69 66 28 20 61 52 65 73 3d 3d        if( aRes==
f050: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
f060: 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f    Malfunction(__
f070: 4c 49 4e 45 5f 5f 2c 20 22 4f 75 74 20 6f 66 20  LINE__, "Out of 
f080: 6d 65 6d 6f 72 79 3a 20 25 64 20 62 79 74 65 73  memory: %d bytes
f090: 22 2c 20 6e 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  ", nMalloc);.   
f0a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f0b0: 20 7d 0a 20 20 20 20 20 20 20 20 61 52 65 73 5b   }.        aRes[
f0c0: 6e 52 65 73 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20  nRes++] = c;.   
f0d0: 20 20 20 7d 0a 20 20 20 20 20 20 61 52 65 73 5b     }.      aRes[
f0e0: 6e 52 65 73 5d 20 3d 20 30 3b 0a 20 20 20 20 20  nRes] = 0;.     
f0f0: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
f100: 22 43 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74 68 3a  "Content-length:
f110: 20 25 64 5c 72 5c 6e 5c 72 5c 6e 25 73 22 2c 20   %d\r\n\r\n%s", 
f120: 6e 52 65 73 2c 20 61 52 65 73 29 3b 0a 20 20 20  nRes, aRes);.   
f130: 20 20 20 66 72 65 65 28 61 52 65 73 29 3b 0a 20     free(aRes);. 
f140: 20 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28     }.    fclose(
f150: 69 6e 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  in);.  }else if(
f160: 20 63 6f 75 6e 74 53 6c 61 73 68 65 73 28 7a 52   countSlashes(zR
f170: 65 61 6c 53 63 72 69 70 74 29 21 3d 63 6f 75 6e  ealScript)!=coun
f180: 74 53 6c 61 73 68 65 73 28 7a 53 63 72 69 70 74  tSlashes(zScript
f190: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  ) ){.    /* If t
f1a0: 68 65 20 72 65 71 75 65 73 74 20 55 52 49 20 66  he request URI f
f1b0: 6f 72 20 73 74 61 74 69 63 20 63 6f 6e 74 65 6e  or static conten
f1c0: 74 20 63 6f 6e 74 61 69 6e 73 20 6d 61 74 65 72  t contains mater
f1d0: 69 61 6c 20 70 61 73 74 20 74 68 65 0a 20 20 20  ial past the.   
f1e0: 20 2a 2a 20 61 63 74 75 61 6c 20 63 6f 6e 74 65   ** actual conte
f1f0: 6e 74 20 66 69 6c 65 20 6e 61 6d 65 2c 20 72 65  nt file name, re
f200: 70 6f 72 74 20 74 68 61 74 20 61 73 20 61 20 34  port that as a 4
f210: 30 34 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20  04 error. */.   
f220: 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45   NotFound(__LINE
f230: 5f 5f 29 3b 20 2f 2a 20 4c 4f 47 3a 20 45 78 63  __); /* LOG: Exc
f240: 65 73 73 20 55 52 49 20 63 6f 6e 74 65 6e 74 20  ess URI content 
f250: 70 61 73 74 20 73 74 61 74 69 63 20 66 69 6c 65  past static file
f260: 20 6e 61 6d 65 20 2a 2f 0a 20 20 7d 65 6c 73 65   name */.  }else
f270: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69  {.    /* If it i
f280: 73 6e 27 74 20 65 78 65 63 75 74 61 62 6c 65 20  sn't executable 
f290: 74 68 65 6e 20 69 74 0a 20 20 20 20 2a 2a 20 6d  then it.    ** m
f2a0: 75 73 74 20 61 20 73 69 6d 70 6c 65 20 66 69 6c  ust a simple fil
f2b0: 65 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  e that needs to 
f2c0: 62 65 20 63 6f 70 69 65 64 20 74 6f 20 6f 75 74  be copied to out
f2d0: 70 75 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  put..    */.    
f2e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6e  const char *zCon
f2f0: 74 65 6e 74 54 79 70 65 20 3d 20 47 65 74 4d 69  tentType = GetMi
f300: 6d 65 54 79 70 65 28 7a 46 69 6c 65 2c 20 6c 65  meType(zFile, le
f310: 6e 46 69 6c 65 29 3b 0a 0a 20 20 20 20 69 66 28  nFile);..    if(
f320: 20 7a 54 6d 70 4e 61 6d 20 29 20 75 6e 6c 69 6e   zTmpNam ) unlin
f330: 6b 28 7a 54 6d 70 4e 61 6d 29 3b 0a 20 20 20 20  k(zTmpNam);.    
f340: 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65  in = fopen(zFile
f350: 2c 22 72 22 29 3b 0a 20 20 20 20 69 66 28 20 69  ,"r");.    if( i
f360: 6e 3d 3d 30 20 29 20 4e 6f 74 46 6f 75 6e 64 28  n==0 ) NotFound(
f370: 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 2f 2a 20 4c 4f  __LINE__); /* LO
f380: 47 3a 20 66 6f 70 65 6e 28 29 20 66 61 69 6c 65  G: fopen() faile
f390: 64 20 66 6f 72 20 73 74 61 74 69 63 20 63 6f 6e  d for static con
f3a0: 74 65 6e 74 20 2a 2f 0a 20 20 20 20 53 74 61 72  tent */.    Star
f3b0: 74 52 65 73 70 6f 6e 73 65 28 22 32 30 30 20 4f  tResponse("200 O
f3c0: 4b 22 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d  K");.    nOut +=
f3d0: 20 44 61 74 65 54 61 67 28 22 4c 61 73 74 2d 4d   DateTag("Last-M
f3e0: 6f 64 69 66 69 65 64 22 2c 20 73 74 61 74 62 75  odified", statbu
f3f0: 66 2e 73 74 5f 6d 74 69 6d 65 29 3b 0a 20 20 20  f.st_mtime);.   
f400: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
f410: 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 25  "Content-type: %
f420: 73 5c 72 5c 6e 22 2c 7a 43 6f 6e 74 65 6e 74 54  s\r\n",zContentT
f430: 79 70 65 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b  ype);.    nOut +
f440: 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 74 65 6e  = printf("Conten
f450: 74 2d 6c 65 6e 67 74 68 3a 20 25 64 5c 72 5c 6e  t-length: %d\r\n
f460: 5c 72 5c 6e 22 2c 28 69 6e 74 29 73 74 61 74 62  \r\n",(int)statb
f470: 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20  uf.st_size);.   
f480: 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
f490: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
f4a0: 7a 4d 65 74 68 6f 64 2c 22 48 45 41 44 22 29 3d  zMethod,"HEAD")=
f4b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 4d 61 6b 65  =0 ){.      Make
f4c0: 4c 6f 67 45 6e 74 72 79 28 30 2c 20 5f 5f 4c 49  LogEntry(0, __LI
f4d0: 4e 45 5f 5f 29 3b 20 2f 2a 20 4c 4f 47 3a 20 4e  NE__); /* LOG: N
f4e0: 6f 72 6d 61 6c 20 48 45 41 44 20 72 65 70 6c 79  ormal HEAD reply
f4f0: 20 2a 2f 0a 20 20 20 20 20 20 66 63 6c 6f 73 65   */.      fclose
f500: 28 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75  (in);.      retu
f510: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rn;.    }.    if
f520: 28 20 75 73 65 54 69 6d 65 6f 75 74 20 29 20 61  ( useTimeout ) a
f530: 6c 61 72 6d 28 33 30 20 2b 20 73 74 61 74 62 75  larm(30 + statbu
f540: 66 2e 73 74 5f 73 69 7a 65 2f 31 30 30 30 29 3b  f.st_size/1000);
f550: 0a 23 69 66 64 65 66 20 6c 69 6e 75 78 0a 20 20  .#ifdef linux.  
f560: 20 20 7b 0a 20 20 20 20 20 20 6f 66 66 5f 74 20    {.      off_t 
f570: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
f580: 20 20 6e 4f 75 74 20 2b 3d 20 73 65 6e 64 66 69    nOut += sendfi
f590: 6c 65 28 66 69 6c 65 6e 6f 28 73 74 64 6f 75 74  le(fileno(stdout
f5a0: 29 2c 20 66 69 6c 65 6e 6f 28 69 6e 29 2c 20 26  ), fileno(in), &
f5b0: 6f 66 66 73 65 74 2c 20 73 74 61 74 62 75 66 2e  offset, statbuf.
f5c0: 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  st_size);.    }.
f5d0: 23 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65 28  #else.    while(
f5e0: 20 28 63 20 3d 20 67 65 74 63 28 69 6e 29 29 21   (c = getc(in))!
f5f0: 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20 20 70 75  =EOF ){.      pu
f600: 74 63 28 63 2c 73 74 64 6f 75 74 29 3b 0a 20 20  tc(c,stdout);.  
f610: 20 20 20 20 6e 4f 75 74 2b 2b 3b 0a 20 20 20 20      nOut++;.    
f620: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 66 63 6c  }.#endif.    fcl
f630: 6f 73 65 28 69 6e 29 3b 0a 20 20 7d 0a 20 20 66  ose(in);.  }.  f
f640: 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20  flush(stdout);. 
f650: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c   MakeLogEntry(0,
f660: 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 20 2f 2a 20   __LINE__);  /* 
f670: 4c 4f 47 3a 20 4e 6f 72 6d 61 6c 20 72 65 70 6c  LOG: Normal repl
f680: 79 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  y */..  /* The n
f690: 65 78 74 20 72 65 71 75 65 73 74 20 6d 75 73 74  ext request must
f6a0: 20 61 72 72 69 76 65 20 77 69 74 68 69 6e 20 33   arrive within 3
f6b0: 30 20 73 65 63 6f 6e 64 73 20 6f 72 20 77 65 20  0 seconds or we 
f6c0: 63 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65 63  close the connec
f6d0: 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6f 6d 69 74  tion.  */.  omit
f6e0: 4c 6f 67 20 3d 20 31 3b 0a 20 20 69 66 28 20 75  Log = 1;.  if( u
f6f0: 73 65 54 69 6d 65 6f 75 74 20 29 20 61 6c 61 72  seTimeout ) alar
f700: 6d 28 33 30 29 3b 0a 7d 0a 0a 23 64 65 66 69 6e  m(30);.}..#defin
f710: 65 20 4d 41 58 5f 50 41 52 41 4c 4c 45 4c 20 35  e MAX_PARALLEL 5
f720: 30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  0  /* Number of 
f730: 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 63 68 69  simultaneous chi
f740: 6c 64 72 65 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ldren */../*.** 
f750: 41 6c 6c 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  All possible for
f760: 6d 73 20 6f 66 20 61 6e 20 49 50 20 61 64 64 72  ms of an IP addr
f770: 65 73 73 2e 20 20 4e 65 65 64 65 64 20 74 6f 20  ess.  Needed to 
f780: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 47 43 43 20  work around GCC 
f790: 73 74 72 69 63 74 0a 2a 2a 20 61 6c 69 61 73 69  strict.** aliasi
f7a0: 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a 74 79 70  ng rules..*/.typ
f7b0: 65 64 65 66 20 75 6e 69 6f 6e 20 7b 0a 20 20 73  edef union {.  s
f7c0: 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 20 73  truct sockaddr s
f7d0: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
f7e0: 2f 2a 20 41 62 73 74 72 61 63 74 20 73 75 70 65  /* Abstract supe
f7f0: 72 63 6c 61 73 73 20 2a 2f 0a 20 20 73 74 72 75  rclass */.  stru
f800: 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 20 73  ct sockaddr_in s
f810: 61 34 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a4;          /* 
f820: 49 50 76 34 20 2a 2f 0a 20 20 73 74 72 75 63 74  IPv4 */.  struct
f830: 20 73 6f 63 6b 61 64 64 72 5f 69 6e 36 20 73 61   sockaddr_in6 sa
f840: 36 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 50  6;         /* IP
f850: 76 36 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  v6 */.  struct s
f860: 6f 63 6b 61 64 64 72 5f 73 74 6f 72 61 67 65 20  ockaddr_storage 
f870: 73 61 73 3b 20 20 20 20 20 2f 2a 20 53 68 6f 75  sas;     /* Shou
f880: 6c 64 20 62 65 20 74 68 65 20 6d 61 78 69 6d 75  ld be the maximu
f890: 6d 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 33  m of the above 3
f8a0: 20 2a 2f 0a 7d 20 61 64 64 72 65 73 73 3b 0a 0a   */.} address;..
f8b0: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20  /*.** Implement 
f8c0: 61 6e 20 48 54 54 50 20 73 65 72 76 65 72 20 64  an HTTP server d
f8d0: 61 65 6d 6f 6e 20 6c 69 73 74 65 6e 69 6e 67 20  aemon listening 
f8e0: 6f 6e 20 70 6f 72 74 20 69 50 6f 72 74 2e 0a 2a  on port iPort..*
f8f0: 2a 0a 2a 2a 20 41 73 20 6e 65 77 20 63 6f 6e 6e  *.** As new conn
f900: 65 63 74 69 6f 6e 73 20 61 72 72 69 76 65 2c 20  ections arrive, 
f910: 66 6f 72 6b 20 61 20 63 68 69 6c 64 20 61 6e 64  fork a child and
f920: 20 6c 65 74 20 63 68 69 6c 64 20 72 65 74 75 72   let child retur
f930: 6e 0a 2a 2a 20 6f 75 74 20 6f 66 20 74 68 69 73  n.** out of this
f940: 20 70 72 6f 63 65 64 75 72 65 20 63 61 6c 6c 2e   procedure call.
f950: 20 20 54 68 65 20 63 68 69 6c 64 20 77 69 6c 6c    The child will
f960: 20 68 61 6e 64 6c 65 20 74 68 65 20 72 65 71 75   handle the requ
f970: 65 73 74 2e 0a 2a 2a 20 54 68 65 20 70 61 72 65  est..** The pare
f980: 6e 74 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73  nt never returns
f990: 20 66 72 6f 6d 20 74 68 69 73 20 70 72 6f 63 65   from this proce
f9a0: 64 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  dure..**.** Retu
f9b0: 72 6e 20 30 20 74 6f 20 65 61 63 68 20 63 68 69  rn 0 to each chi
f9c0: 6c 64 20 61 73 20 69 74 20 72 75 6e 73 2e 20 20  ld as it runs.  
f9d0: 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 65 73 74  If unable to est
f9e0: 61 62 6c 69 73 68 20 61 0a 2a 2a 20 6c 69 73 74  ablish a.** list
f9f0: 65 6e 69 6e 67 20 73 6f 63 6b 65 74 2c 20 72 65  ening socket, re
fa00: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  turn non-zero..*
fa10: 2f 0a 69 6e 74 20 68 74 74 70 5f 73 65 72 76 65  /.int http_serve
fa20: 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  r(const char *zP
fa30: 6f 72 74 2c 20 69 6e 74 20 6c 6f 63 61 6c 4f 6e  ort, int localOn
fa40: 6c 79 29 7b 0a 20 20 69 6e 74 20 6c 69 73 74 65  ly){.  int liste
fa50: 6e 65 72 5b 32 30 5d 3b 20 20 20 20 20 20 20 20  ner[20];        
fa60: 20 20 20 20 2f 2a 20 54 68 65 20 73 65 72 76 65      /* The serve
fa70: 72 20 73 6f 63 6b 65 74 73 20 2a 2f 0a 20 20 69  r sockets */.  i
fa80: 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 3b 20 20  nt connection;  
fa90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
faa0: 20 73 6f 63 6b 65 74 20 66 6f 72 20 65 61 63 68   socket for each
fab0: 20 69 6e 64 69 76 69 64 75 61 6c 20 63 6f 6e 6e   individual conn
fac0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 66 64 5f 73  ection */.  fd_s
fad0: 65 74 20 72 65 61 64 66 64 73 3b 20 20 20 20 20  et readfds;     
fae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
faf0: 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  of file descript
fb00: 6f 72 73 20 66 6f 72 20 73 65 6c 65 63 74 28 29  ors for select()
fb10: 20 2a 2f 0a 20 20 61 64 64 72 65 73 73 20 69 6e   */.  address in
fb20: 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  addr;           
fb30: 20 20 20 2f 2a 20 52 65 6d 6f 74 65 20 61 64 64     /* Remote add
fb40: 72 65 73 73 20 2a 2f 0a 20 20 73 6f 63 6b 6c 65  ress */.  sockle
fb50: 6e 5f 74 20 6c 65 6e 61 64 64 72 3b 20 20 20 20  n_t lenaddr;    
fb60: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
fb70: 20 6f 66 20 74 68 65 20 69 6e 61 64 64 72 20 73   of the inaddr s
fb80: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e  tructure */.  in
fb90: 74 20 63 68 69 6c 64 3b 20 20 20 20 20 20 20 20  t child;        
fba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 49             /* PI
fbb0: 44 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  D of the child p
fbc0: 72 6f 63 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20  rocess */.  int 
fbd0: 6e 63 68 69 6c 64 72 65 6e 20 3d 20 30 3b 20 20  nchildren = 0;  
fbe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
fbf0: 65 72 20 6f 66 20 63 68 69 6c 64 20 70 72 6f 63  er of child proc
fc00: 65 73 73 65 73 20 2a 2f 0a 20 20 73 74 72 75 63  esses */.  struc
fc10: 74 20 74 69 6d 65 76 61 6c 20 64 65 6c 61 79 3b  t timeval delay;
fc20: 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6c          /* How l
fc30: 6f 6e 67 20 74 6f 20 77 61 69 74 20 69 6e 73 69  ong to wait insi
fc40: 64 65 20 73 65 6c 65 63 74 28 29 20 2a 2f 0a 20  de select() */. 
fc50: 20 69 6e 74 20 6f 70 74 20 3d 20 31 3b 20 20 20   int opt = 1;   
fc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fc70: 20 73 65 74 73 6f 63 6b 6f 70 74 20 66 6c 61 67   setsockopt flag
fc80: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61 64 64   */.  struct add
fc90: 72 69 6e 66 6f 20 73 48 69 6e 74 73 3b 20 20 20  rinfo sHints;   
fca0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 68 69     /* Address hi
fcb0: 6e 74 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nts */.  struct 
fcc0: 61 64 64 72 69 6e 66 6f 20 2a 70 41 64 64 72 73  addrinfo *pAddrs
fcd0: 2c 20 2a 70 3b 20 2f 2a 20 2a 2f 0a 20 20 69 6e  , *p; /* */.  in
fce0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
fcf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
fd00: 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 69  sult code */.  i
fd10: 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 6e 74 20 6d  nt i, n;.  int m
fd20: 61 78 46 64 20 3d 20 2d 31 3b 0a 20 20 0a 20 20  axFd = -1;.  .  
fd30: 6d 65 6d 73 65 74 28 26 73 48 69 6e 74 73 2c 20  memset(&sHints, 
fd40: 30 2c 20 73 69 7a 65 6f 66 28 73 48 69 6e 74 73  0, sizeof(sHints
fd50: 29 29 3b 0a 20 20 69 66 28 20 69 70 76 34 4f 6e  ));.  if( ipv4On
fd60: 6c 79 20 29 7b 0a 20 20 20 20 73 48 69 6e 74 73  ly ){.    sHints
fd70: 2e 61 69 5f 66 61 6d 69 6c 79 20 3d 20 50 46 5f  .ai_family = PF_
fd80: 49 4e 45 54 3b 0a 20 20 20 20 2f 2a 70 72 69 6e  INET;.    /*prin
fd90: 74 66 28 22 69 70 76 34 20 6f 6e 6c 79 5c 6e 22  tf("ipv4 only\n"
fda0: 29 3b 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28  );*/.  }else if(
fdb0: 20 69 70 76 36 4f 6e 6c 79 20 29 7b 0a 20 20 20   ipv6Only ){.   
fdc0: 20 73 48 69 6e 74 73 2e 61 69 5f 66 61 6d 69 6c   sHints.ai_famil
fdd0: 79 20 3d 20 50 46 5f 49 4e 45 54 36 3b 0a 20 20  y = PF_INET6;.  
fde0: 20 20 2f 2a 70 72 69 6e 74 66 28 22 69 70 76 36    /*printf("ipv6
fdf0: 20 6f 6e 6c 79 5c 6e 22 29 3b 2a 2f 0a 20 20 7d   only\n");*/.  }
fe00: 65 6c 73 65 7b 0a 20 20 20 20 73 48 69 6e 74 73  else{.    sHints
fe10: 2e 61 69 5f 66 61 6d 69 6c 79 20 3d 20 50 46 5f  .ai_family = PF_
fe20: 55 4e 53 50 45 43 3b 0a 20 20 7d 0a 20 20 73 48  UNSPEC;.  }.  sH
fe30: 69 6e 74 73 2e 61 69 5f 73 6f 63 6b 74 79 70 65  ints.ai_socktype
fe40: 20 3d 20 53 4f 43 4b 5f 53 54 52 45 41 4d 3b 0a   = SOCK_STREAM;.
fe50: 20 20 73 48 69 6e 74 73 2e 61 69 5f 66 6c 61 67    sHints.ai_flag
fe60: 73 20 3d 20 41 49 5f 50 41 53 53 49 56 45 3b 0a  s = AI_PASSIVE;.
fe70: 20 20 73 48 69 6e 74 73 2e 61 69 5f 70 72 6f 74    sHints.ai_prot
fe80: 6f 63 6f 6c 20 3d 20 30 3b 0a 20 20 72 63 20 3d  ocol = 0;.  rc =
fe90: 20 67 65 74 61 64 64 72 69 6e 66 6f 28 6c 6f 63   getaddrinfo(loc
fea0: 61 6c 4f 6e 6c 79 20 3f 20 22 6c 6f 63 61 6c 68  alOnly ? "localh
feb0: 6f 73 74 22 3a 20 30 2c 20 7a 50 6f 72 74 2c 20  ost": 0, zPort, 
fec0: 26 73 48 69 6e 74 73 2c 20 26 70 41 64 64 72 73  &sHints, &pAddrs
fed0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
fee0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
fef0: 72 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 67 65  r, "could not ge
ff00: 74 20 61 64 64 72 20 69 6e 66 6f 3a 20 25 73 22  t addr info: %s"
ff10: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  , .            r
ff20: 63 21 3d 45 41 49 5f 53 59 53 54 45 4d 20 3f 20  c!=EAI_SYSTEM ? 
ff30: 67 61 69 5f 73 74 72 65 72 72 6f 72 28 72 63 29  gai_strerror(rc)
ff40: 20 3a 20 73 74 72 65 72 72 6f 72 28 65 72 72 6e   : strerror(errn
ff50: 6f 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  o));.    return 
ff60: 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6e 3d 30  1;.  }.  for(n=0
ff70: 2c 20 70 3d 70 41 64 64 72 73 3b 20 6e 3c 28 69  , p=pAddrs; n<(i
ff80: 6e 74 29 28 73 69 7a 65 6f 66 28 6c 69 73 74 65  nt)(sizeof(liste
ff90: 6e 65 72 29 2f 73 69 7a 65 6f 66 28 6c 69 73 74  ner)/sizeof(list
ffa0: 65 6e 65 72 5b 30 5d 29 29 20 26 26 20 70 21 3d  ener[0])) && p!=
ffb0: 30 3b 0a 20 20 20 20 20 20 20 20 70 3d 70 2d 3e  0;.        p=p->
ffc0: 61 69 5f 6e 65 78 74 29 7b 0a 20 20 20 20 6c 69  ai_next){.    li
ffd0: 73 74 65 6e 65 72 5b 6e 5d 20 3d 20 73 6f 63 6b  stener[n] = sock
ffe0: 65 74 28 70 2d 3e 61 69 5f 66 61 6d 69 6c 79 2c  et(p->ai_family,
fff0: 20 70 2d 3e 61 69 5f 73 6f 63 6b 74 79 70 65 2c   p->ai_socktype,
10000 20 70 2d 3e 61 69 5f 70 72 6f 74 6f 63 6f 6c 29   p->ai_protocol)
10010 3b 0a 20 20 20 20 69 66 28 20 6c 69 73 74 65 6e  ;.    if( listen
10020 65 72 5b 6e 5d 3e 3d 30 20 29 7b 0a 20 20 20 20  er[n]>=0 ){.    
10030 20 20 2f 2a 20 69 66 20 77 65 20 63 61 6e 27 74    /* if we can't
10040 20 74 65 72 6d 69 6e 61 74 65 20 6e 69 63 65 6c   terminate nicel
10050 79 2c 20 61 74 20 6c 65 61 73 74 20 61 6c 6c 6f  y, at least allo
10060 77 20 74 68 65 20 73 6f 63 6b 65 74 20 74 6f 20  w the socket to 
10070 62 65 20 72 65 75 73 65 64 20 2a 2f 0a 20 20 20  be reused */.   
10080 20 20 20 73 65 74 73 6f 63 6b 6f 70 74 28 6c 69     setsockopt(li
10090 73 74 65 6e 65 72 5b 6e 5d 2c 20 53 4f 4c 5f 53  stener[n], SOL_S
100a0 4f 43 4b 45 54 2c 20 53 4f 5f 52 45 55 53 45 41  OCKET, SO_REUSEA
100b0 44 44 52 2c 26 6f 70 74 2c 20 73 69 7a 65 6f 66  DDR,&opt, sizeof
100c0 28 6f 70 74 29 29 3b 0a 20 20 20 20 20 20 0a 23  (opt));.      .#
100d0 69 66 20 64 65 66 69 6e 65 64 28 49 50 56 36 5f  if defined(IPV6_
100e0 56 36 4f 4e 4c 59 29 0a 20 20 20 20 20 20 69 66  V6ONLY).      if
100f0 28 20 70 2d 3e 61 69 5f 66 61 6d 69 6c 79 3d 3d  ( p->ai_family==
10100 41 46 5f 49 4e 45 54 36 20 29 7b 0a 20 20 20 20  AF_INET6 ){.    
10110 20 20 20 20 69 6e 74 20 76 36 6f 6e 6c 79 20 3d      int v6only =
10120 20 31 3b 0a 20 20 20 20 20 20 20 20 73 65 74 73   1;.        sets
10130 6f 63 6b 6f 70 74 28 6c 69 73 74 65 6e 65 72 5b  ockopt(listener[
10140 6e 5d 2c 20 49 50 50 52 4f 54 4f 5f 49 50 56 36  n], IPPROTO_IPV6
10150 2c 20 49 50 56 36 5f 56 36 4f 4e 4c 59 2c 0a 20  , IPV6_V6ONLY,. 
10160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10170 20 20 20 26 76 36 6f 6e 6c 79 2c 20 73 69 7a 65     &v6only, size
10180 6f 66 28 76 36 6f 6e 6c 79 29 29 3b 0a 20 20 20  of(v6only));.   
10190 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
101a0 20 20 0a 20 20 20 20 20 20 69 66 28 20 62 69 6e    .      if( bin
101b0 64 28 6c 69 73 74 65 6e 65 72 5b 6e 5d 2c 20 70  d(listener[n], p
101c0 2d 3e 61 69 5f 61 64 64 72 2c 20 70 2d 3e 61 69  ->ai_addr, p->ai
101d0 5f 61 64 64 72 6c 65 6e 29 3c 30 20 29 7b 0a 20  _addrlen)<0 ){. 
101e0 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 62         printf("b
101f0 69 6e 64 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e  ind failed: %s\n
10200 22 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72 6e  ", strerror(errn
10210 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 63 6c 6f  o));.        clo
10220 73 65 28 6c 69 73 74 65 6e 65 72 5b 6e 5d 29 3b  se(listener[n]);
10230 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
10240 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
10250 20 69 66 28 20 6c 69 73 74 65 6e 28 6c 69 73 74   if( listen(list
10260 65 6e 65 72 5b 6e 5d 2c 20 32 30 29 3c 30 20 29  ener[n], 20)<0 )
10270 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66  {.        printf
10280 28 22 6c 69 73 74 65 6e 28 29 20 66 61 69 6c 65  ("listen() faile
10290 64 3a 20 25 73 5c 6e 22 2c 20 73 74 72 65 72 72  d: %s\n", strerr
102a0 6f 72 28 65 72 72 6e 6f 29 29 3b 0a 20 20 20 20  or(errno));.    
102b0 20 20 20 20 63 6c 6f 73 65 28 6c 69 73 74 65 6e      close(listen
102c0 65 72 5b 6e 5d 29 3b 0a 20 20 20 20 20 20 20 20  er[n]);.        
102d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
102e0 7d 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  }.      n++;.   
102f0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d   }.  }.  if( n==
10300 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
10310 28 73 74 64 65 72 72 2c 20 22 63 61 6e 6e 6f 74  (stderr, "cannot
10320 20 6f 70 65 6e 20 61 6e 79 20 73 6f 63 6b 65 74   open any socket
10330 73 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  s\n");.    retur
10340 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c  n 1;.  }..  whil
10350 65 28 20 31 20 29 7b 0a 20 20 20 20 69 66 28 20  e( 1 ){.    if( 
10360 6e 63 68 69 6c 64 72 65 6e 3e 4d 41 58 5f 50 41  nchildren>MAX_PA
10370 52 41 4c 4c 45 4c 20 29 7b 0a 20 20 20 20 20 20  RALLEL ){.      
10380 2f 2a 20 53 6c 6f 77 20 64 6f 77 6e 20 69 66 20  /* Slow down if 
10390 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20  connections are 
103a0 61 72 72 69 76 69 6e 67 20 74 6f 6f 20 66 61 73  arriving too fas
103b0 74 20 2a 2f 0a 20 20 20 20 20 20 73 6c 65 65 70  t */.      sleep
103c0 28 20 6e 63 68 69 6c 64 72 65 6e 2d 4d 41 58 5f  ( nchildren-MAX_
103d0 50 41 52 41 4c 4c 45 4c 20 29 3b 0a 20 20 20 20  PARALLEL );.    
103e0 7d 0a 20 20 20 20 64 65 6c 61 79 2e 74 76 5f 73  }.    delay.tv_s
103f0 65 63 20 3d 20 36 30 3b 0a 20 20 20 20 64 65 6c  ec = 60;.    del
10400 61 79 2e 74 76 5f 75 73 65 63 20 3d 20 30 3b 0a  ay.tv_usec = 0;.
10410 20 20 20 20 46 44 5f 5a 45 52 4f 28 26 72 65 61      FD_ZERO(&rea
10420 64 66 64 73 29 3b 0a 20 20 20 20 66 6f 72 28 69  dfds);.    for(i
10430 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
10440 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 69 73       assert( lis
10450 74 65 6e 65 72 5b 69 5d 3e 3d 30 20 29 3b 0a 20  tener[i]>=0 );. 
10460 20 20 20 20 20 46 44 5f 53 45 54 28 20 6c 69 73       FD_SET( lis
10470 74 65 6e 65 72 5b 69 5d 2c 20 26 72 65 61 64 66  tener[i], &readf
10480 64 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  ds);.      if( l
10490 69 73 74 65 6e 65 72 5b 69 5d 3e 6d 61 78 46 64  istener[i]>maxFd
104a0 20 29 20 6d 61 78 46 64 20 3d 20 6c 69 73 74 65   ) maxFd = liste
104b0 6e 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  ner[i];.    }.  
104c0 20 20 73 65 6c 65 63 74 28 20 6d 61 78 46 64 2b    select( maxFd+
104d0 31 2c 20 26 72 65 61 64 66 64 73 2c 20 30 2c 20  1, &readfds, 0, 
104e0 30 2c 20 26 64 65 6c 61 79 29 3b 0a 20 20 20 20  0, &delay);.    
104f0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
10500 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 46 44  +){.      if( FD
10510 5f 49 53 53 45 54 28 6c 69 73 74 65 6e 65 72 5b  _ISSET(listener[
10520 69 5d 2c 20 26 72 65 61 64 66 64 73 29 20 29 7b  i], &readfds) ){
10530 0a 20 20 20 20 20 20 20 20 6c 65 6e 61 64 64 72  .        lenaddr
10540 20 3d 20 73 69 7a 65 6f 66 28 69 6e 61 64 64 72   = sizeof(inaddr
10550 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 6e 65  );.        conne
10560 63 74 69 6f 6e 20 3d 20 61 63 63 65 70 74 28 6c  ction = accept(l
10570 69 73 74 65 6e 65 72 5b 69 5d 2c 20 26 69 6e 61  istener[i], &ina
10580 64 64 72 2e 73 61 2c 20 26 6c 65 6e 61 64 64 72  ddr.sa, &lenaddr
10590 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
105a0 6f 6e 6e 65 63 74 69 6f 6e 3e 3d 30 20 29 7b 0a  onnection>=0 ){.
105b0 20 20 20 20 20 20 20 20 20 20 63 68 69 6c 64 20            child 
105c0 3d 20 66 6f 72 6b 28 29 3b 0a 20 20 20 20 20 20  = fork();.      
105d0 20 20 20 20 69 66 28 20 63 68 69 6c 64 21 3d 30      if( child!=0
105e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
105f0 69 66 28 20 63 68 69 6c 64 3e 30 20 29 20 6e 63  if( child>0 ) nc
10600 68 69 6c 64 72 65 6e 2b 2b 3b 0a 20 20 20 20 20  hildren++;.     
10610 20 20 20 20 20 20 20 63 6c 6f 73 65 28 63 6f 6e         close(con
10620 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  nection);.      
10630 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 66 28        /* printf(
10640 22 73 75 62 70 72 6f 63 65 73 73 20 25 64 20 73  "subprocess %d s
10650 74 61 72 74 65 64 2e 2e 2e 5c 6e 22 2c 20 63 68  tarted...\n", ch
10660 69 6c 64 29 3b 20 66 66 6c 75 73 68 28 73 74 64  ild); fflush(std
10670 6f 75 74 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20  out); */.       
10680 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10690 20 20 20 20 20 20 69 6e 74 20 6e 45 72 72 20 3d        int nErr =
106a0 20 30 2c 20 66 64 3b 0a 20 20 20 20 20 20 20 20   0, fd;.        
106b0 20 20 20 20 63 6c 6f 73 65 28 30 29 3b 0a 20 20      close(0);.  
106c0 20 20 20 20 20 20 20 20 20 20 66 64 20 3d 20 64            fd = d
106d0 75 70 28 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a  up(connection);.
106e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
106f0 66 64 21 3d 30 20 29 20 6e 45 72 72 2b 2b 3b 0a  fd!=0 ) nErr++;.
10700 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73              clos
10710 65 28 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(1);.          
10720 20 20 66 64 20 3d 20 64 75 70 28 63 6f 6e 6e 65    fd = dup(conne
10730 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20  ction);.        
10740 20 20 20 20 69 66 28 20 66 64 21 3d 31 20 29 20      if( fd!=1 ) 
10750 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
10760 20 20 20 20 63 6c 6f 73 65 28 63 6f 6e 6e 65 63      close(connec
10770 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  tion);.         
10780 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a     return nErr;.
10790 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
107a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
107b0 20 20 20 20 2f 2a 20 42 75 72 79 20 64 65 61 64      /* Bury dead
107c0 20 63 68 69 6c 64 72 65 6e 20 2a 2f 0a 20 20 20   children */.   
107d0 20 20 20 77 68 69 6c 65 28 20 28 63 68 69 6c 64     while( (child
107e0 20 3d 20 77 61 69 74 70 69 64 28 30 2c 20 30 2c   = waitpid(0, 0,
107f0 20 57 4e 4f 48 41 4e 47 29 29 3e 30 20 29 7b 0a   WNOHANG))>0 ){.
10800 20 20 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74          /* print
10810 66 28 22 70 72 6f 63 65 73 73 20 25 64 20 65 6e  f("process %d en
10820 64 73 5c 6e 22 2c 20 63 68 69 6c 64 29 3b 20 66  ds\n", child); f
10830 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 20 2a  flush(stdout); *
10840 2f 0a 20 20 20 20 20 20 20 20 6e 63 68 69 6c 64  /.        nchild
10850 72 65 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  ren--;.      }. 
10860 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4e 4f     }.  }.  /* NO
10870 54 20 52 45 41 43 48 45 44 20 2a 2f 20 20 0a 20  T REACHED */  . 
10880 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 0a 69 6e   exit(1);.}...in
10890 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c  t main(int argc,
108a0 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20   char **argv){. 
108b0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
108c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
108d0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
108e0 63 68 61 72 20 2a 7a 50 65 72 6d 55 73 65 72 20  char *zPermUser 
108f0 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 52 75 6e  = 0;      /* Run
10900 20 64 61 65 6d 6f 6e 20 77 69 74 68 20 74 68 69   daemon with thi
10910 73 20 75 73 65 72 27 73 20 70 65 72 6d 69 73 73  s user's permiss
10920 69 6f 6e 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ions */.  const 
10930 63 68 61 72 20 2a 7a 50 6f 72 74 20 3d 20 30 3b  char *zPort = 0;
10940 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74      /* Implement
10950 20 61 6e 20 48 54 54 50 20 73 65 72 76 65 72 20   an HTTP server 
10960 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 69 6e 74  process */.  int
10970 20 75 73 65 43 68 72 6f 6f 74 4a 61 69 6c 20 3d   useChrootJail =
10980 20 31 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 74   1;    /* True t
10990 6f 20 75 73 65 20 61 20 63 68 61 6e 67 65 2d 72  o use a change-r
109a0 6f 6f 74 20 6a 61 69 6c 20 2a 2f 0a 20 20 73 74  oot jail */.  st
109b0 72 75 63 74 20 70 61 73 73 77 64 20 2a 70 77 64  ruct passwd *pwd
109c0 20 3d 20 30 3b 20 20 20 2f 2a 20 49 6e 66 6f 72   = 0;   /* Infor
109d0 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
109e0 20 75 73 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 52   user */..  /* R
109f0 65 63 6f 72 64 20 74 68 65 20 74 69 6d 65 20 77  ecord the time w
10a00 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62  hen processing b
10a10 65 67 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 67 65  egins..  */.  ge
10a20 74 74 69 6d 65 6f 66 64 61 79 28 26 62 65 67 69  ttimeofday(&begi
10a30 6e 54 69 6d 65 2c 20 30 29 3b 0a 0a 20 20 2f 2a  nTime, 0);..  /*
10a40 20 50 61 72 73 65 20 63 6f 6d 6d 61 6e 64 2d 6c   Parse command-l
10a50 69 6e 65 20 61 72 67 75 6d 65 6e 74 73 0a 20 20  ine arguments.  
10a60 2a 2f 0a 20 20 77 68 69 6c 65 28 20 61 72 67 63  */.  while( argc
10a70 3e 31 20 26 26 20 61 72 67 76 5b 31 5d 5b 30 5d  >1 && argv[1][0]
10a80 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 63 68 61  =='-' ){.    cha
10a90 72 20 2a 7a 20 3d 20 61 72 67 76 5b 31 5d 3b 0a  r *z = argv[1];.
10aa0 20 20 20 20 63 68 61 72 20 2a 7a 41 72 67 20 3d      char *zArg =
10ab0 20 61 72 67 63 3e 3d 33 20 3f 20 61 72 67 76 5b   argc>=3 ? argv[
10ac0 32 5d 20 3a 20 22 30 22 3b 0a 20 20 20 20 69 66  2] : "0";.    if
10ad0 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a  ( z[0]=='-' && z
10ae0 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a  [1]=='-' ) z++;.
10af0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
10b00 2c 22 2d 75 73 65 72 22 29 3d 3d 30 20 29 7b 0a  ,"-user")==0 ){.
10b10 20 20 20 20 20 20 7a 50 65 72 6d 55 73 65 72 20        zPermUser 
10b20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 7d 65 6c 73  = zArg;.    }els
10b30 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
10b40 2d 72 6f 6f 74 22 29 3d 3d 30 20 29 7b 0a 20 20  -root")==0 ){.  
10b50 20 20 20 20 7a 52 6f 6f 74 20 3d 20 7a 41 72 67      zRoot = zArg
10b60 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
10b70 73 74 72 63 6d 70 28 7a 2c 22 2d 6c 6f 67 66 69  strcmp(z,"-logfi
10b80 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  le")==0 ){.     
10b90 20 7a 4c 6f 67 46 69 6c 65 20 3d 20 7a 41 72 67   zLogFile = zArg
10ba0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
10bb0 73 74 72 63 6d 70 28 7a 2c 22 2d 68 74 74 70 73  strcmp(z,"-https
10bc0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75  ")==0 ){.      u
10bd0 73 65 48 74 74 70 73 20 3d 20 61 74 6f 69 28 7a  seHttps = atoi(z
10be0 41 72 67 29 3b 0a 20 20 20 20 20 20 7a 48 74 74  Arg);.      zHtt
10bf0 70 20 3d 20 75 73 65 48 74 74 70 73 20 3f 20 22  p = useHttps ? "
10c00 68 74 74 70 73 22 20 3a 20 22 68 74 74 70 22 3b  https" : "http";
10c10 0a 20 20 20 20 20 20 69 66 28 20 75 73 65 48 74  .      if( useHt
10c20 74 70 73 20 29 20 7a 52 65 6d 6f 74 65 41 64 64  tps ) zRemoteAdd
10c30 72 20 3d 20 67 65 74 65 6e 76 28 22 52 45 4d 4f  r = getenv("REMO
10c40 54 45 5f 48 4f 53 54 22 29 3b 0a 20 20 20 20 7d  TE_HOST");.    }
10c50 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
10c60 7a 2c 20 22 2d 70 6f 72 74 22 29 3d 3d 30 20 29  z, "-port")==0 )
10c70 7b 0a 20 20 20 20 20 20 7a 50 6f 72 74 20 3d 20  {.      zPort = 
10c80 7a 41 72 67 3b 0a 20 20 20 20 20 20 73 74 61 6e  zArg;.      stan
10c90 64 61 6c 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20  dalone = 1;.    
10ca0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
10cb0 28 7a 2c 20 22 2d 66 61 6d 69 6c 79 22 29 3d 3d  (z, "-family")==
10cc0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  0 ){.      if( s
10cd0 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 69 70 76  trcmp(zArg, "ipv
10ce0 34 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  4")==0 ){.      
10cf0 20 20 69 70 76 34 4f 6e 6c 79 20 3d 20 31 3b 0a    ipv4Only = 1;.
10d00 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
10d10 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 69 70  strcmp(zArg, "ip
10d20 76 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  v6")==0 ){.     
10d30 20 20 20 69 70 76 36 4f 6e 6c 79 20 3d 20 31 3b     ipv6Only = 1;
10d40 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10d50 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f        Malfunctio
10d60 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 20 2f 2a 20  n(__LINE__,  /* 
10d70 4c 4f 47 3a 20 75 6e 6b 6e 6f 77 6e 20 49 50 20  LOG: unknown IP 
10d80 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20  protocol */.    
10d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10da0 22 75 6e 6b 6e 6f 77 6e 20 49 50 20 70 72 6f 74  "unknown IP prot
10db0 6f 63 6f 6c 3a 20 5b 25 73 5d 22 2c 20 7a 41 72  ocol: [%s]", zAr
10dc0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
10dd0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
10de0 28 7a 2c 20 22 2d 6a 61 69 6c 22 29 3d 3d 30 20  (z, "-jail")==0 
10df0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 74 6f  ){.      if( ato
10e00 69 28 7a 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20  i(zArg)==0 ){.  
10e10 20 20 20 20 20 20 75 73 65 43 68 72 6f 6f 74 4a        useChrootJ
10e20 61 69 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ail = 0;.      }
10e30 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
10e40 74 72 63 6d 70 28 7a 2c 20 22 2d 64 65 62 75 67  trcmp(z, "-debug
10e50 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
10e60 66 28 20 61 74 6f 69 28 7a 41 72 67 29 20 29 7b  f( atoi(zArg) ){
10e70 0a 20 20 20 20 20 20 20 20 75 73 65 54 69 6d 65  .        useTime
10e80 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  out = 0;.      }
10e90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10ea0 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f    Malfunction(__
10eb0 4c 49 4e 45 5f 5f 2c 20 2f 2a 20 4c 4f 47 3a 20  LINE__, /* LOG: 
10ec0 75 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64 2d  unknown command-
10ed0 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 20 6f 6e  line argument on
10ee0 20 6c 61 75 6e 63 68 20 2a 2f 0a 20 20 20 20 20   launch */.     
10ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 75 6e               "un
10f00 6b 6e 6f 77 6e 20 61 72 67 75 6d 65 6e 74 3a 20  known argument: 
10f10 5b 25 73 5d 22 2c 20 7a 29 3b 0a 20 20 20 20 7d  [%s]", z);.    }
10f20 0a 20 20 20 20 61 72 67 76 20 2b 3d 20 32 3b 0a  .    argv += 2;.
10f30 20 20 20 20 61 72 67 63 20 2d 3d 20 32 3b 0a 20      argc -= 2;. 
10f40 20 7d 0a 20 20 69 66 28 20 7a 52 6f 6f 74 3d 3d   }.  if( zRoot==
10f50 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61  0 ){.    if( sta
10f60 6e 64 61 6c 6f 6e 65 20 29 7b 0a 20 20 20 20 20  ndalone ){.     
10f70 20 7a 52 6f 6f 74 20 3d 20 22 2e 22 3b 0a 20 20   zRoot = ".";.  
10f80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d    }else{.      M
10f90 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e  alfunction(__LIN
10fa0 45 5f 5f 2c 20 2f 2a 20 4c 4f 47 3a 20 2d 2d 72  E__, /* LOG: --r
10fb0 6f 6f 74 20 61 72 67 75 6d 65 6e 74 20 6d 69 73  oot argument mis
10fc0 73 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20  sing */.        
10fd0 20 20 20 20 20 20 20 20 20 20 22 6e 6f 20 2d 2d            "no --
10fe0 72 6f 6f 74 20 73 70 65 63 69 66 69 65 64 22 29  root specified")
10ff0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
11000 20 2f 2a 20 43 68 61 6e 67 65 20 64 69 72 65 63   /* Change direc
11010 74 6f 72 69 65 73 20 74 6f 20 74 68 65 20 72 6f  tories to the ro
11020 6f 74 20 6f 66 20 74 68 65 20 48 54 54 50 20 66  ot of the HTTP f
11030 69 6c 65 73 79 73 74 65 6d 2e 20 20 54 68 65 6e  ilesystem.  Then
11040 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20 63  .  ** create a c
11050 68 72 6f 6f 74 20 6a 61 69 6c 20 74 68 65 72 65  hroot jail there
11060 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 64  ..  */.  if( chd
11070 69 72 28 7a 52 6f 6f 74 29 21 3d 30 20 29 7b 0a  ir(zRoot)!=0 ){.
11080 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28      Malfunction(
11090 5f 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a 20 4c 4f 47  __LINE__, /* LOG
110a0 3a 20 63 68 64 69 72 28 29 20 66 61 69 6c 65 64  : chdir() failed
110b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
110c0 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 68 61 6e      "cannot chan
110d0 67 65 20 74 6f 20 64 69 72 65 63 74 6f 72 79 20  ge to directory 
110e0 5b 25 73 5d 22 2c 20 7a 52 6f 6f 74 29 3b 0a 20  [%s]", zRoot);. 
110f0 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 69 6e 66   }..  /* Get inf
11100 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
11110 68 65 20 75 73 65 72 20 69 66 20 61 76 61 69 6c  he user if avail
11120 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 7a 50  able */.  if( zP
11130 65 72 6d 55 73 65 72 20 29 20 70 77 64 20 3d 20  ermUser ) pwd = 
11140 67 65 74 70 77 6e 61 6d 28 7a 50 65 72 6d 55 73  getpwnam(zPermUs
11150 65 72 29 3b 0a 0a 20 20 2f 2a 20 45 6e 74 65 72  er);..  /* Enter
11160 20 74 68 65 20 63 68 72 6f 6f 74 20 6a 61 69 6c   the chroot jail
11170 20 69 66 20 72 65 71 75 65 73 74 65 64 20 2a 2f   if requested */
11180 20 20 0a 20 20 69 66 28 20 7a 50 65 72 6d 55 73    .  if( zPermUs
11190 65 72 20 26 26 20 75 73 65 43 68 72 6f 6f 74 4a  er && useChrootJ
111a0 61 69 6c 20 26 26 20 67 65 74 75 69 64 28 29 3d  ail && getuid()=
111b0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 63 68  =0 ){.    if( ch
111c0 72 6f 6f 74 28 22 2e 22 29 3c 30 20 29 7b 0a 20  root(".")<0 ){. 
111d0 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e       Malfunction
111e0 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a 20 4c 4f  (__LINE__, /* LO
111f0 47 3a 20 63 68 72 6f 6f 74 28 29 20 66 61 69 6c  G: chroot() fail
11200 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
11210 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20          "unable 
11220 74 6f 20 63 72 65 61 74 65 20 63 68 72 6f 6f 74  to create chroot
11230 20 6a 61 69 6c 22 29 3b 0a 20 20 20 20 7d 65 6c   jail");.    }el
11240 73 65 7b 0a 20 20 20 20 20 20 7a 52 6f 6f 74 20  se{.      zRoot 
11250 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = "";.    }.  }.
11260 0a 20 20 2f 2a 20 41 63 74 69 76 61 74 65 20 74  .  /* Activate t
11270 68 65 20 73 65 72 76 65 72 2c 20 69 66 20 72 65  he server, if re
11280 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28  quested */.  if(
11290 20 7a 50 6f 72 74 20 26 26 20 68 74 74 70 5f 73   zPort && http_s
112a0 65 72 76 65 72 28 7a 50 6f 72 74 2c 20 30 29 20  erver(zPort, 0) 
112b0 29 7b 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69  ){.    Malfuncti
112c0 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a 20  on(__LINE__, /* 
112d0 4c 4f 47 3a 20 73 65 72 76 65 72 20 73 74 61 72  LOG: server star
112e0 74 75 70 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  tup failed */.  
112f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 66                "f
11300 61 69 6c 65 64 20 74 6f 20 73 74 61 72 74 20 73  ailed to start s
11310 65 72 76 65 72 22 29 3b 0a 20 20 7d 0a 0a 20 20  erver");.  }..  
11320 2f 2a 20 44 72 6f 70 20 72 6f 6f 74 20 70 72 69  /* Drop root pri
11330 76 69 6c 65 67 65 73 2e 0a 20 20 2a 2f 0a 20 20  vileges..  */.  
11340 69 66 28 20 7a 50 65 72 6d 55 73 65 72 20 29 7b  if( zPermUser ){
11350 0a 20 20 20 20 69 66 28 20 70 77 64 20 29 7b 0a  .    if( pwd ){.
11360 20 20 20 20 20 20 69 66 28 20 73 65 74 67 69 64        if( setgid
11370 28 70 77 64 2d 3e 70 77 5f 67 69 64 29 20 29 7b  (pwd->pw_gid) ){
11380 0a 20 20 20 20 20 20 20 20 4d 61 6c 66 75 6e 63  .        Malfunc
11390 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 2f  tion(__LINE__, /
113a0 2a 20 4c 4f 47 3a 20 73 65 74 67 69 64 28 29 20  * LOG: setgid() 
113b0 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
113c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
113d0 61 6e 6e 6f 74 20 73 65 74 20 67 72 6f 75 70 2d  annot set group-
113e0 69 64 20 74 6f 20 25 64 22 2c 20 70 77 64 2d 3e  id to %d", pwd->
113f0 70 77 5f 67 69 64 29 3b 0a 20 20 20 20 20 20 7d  pw_gid);.      }
11400 0a 20 20 20 20 20 20 69 66 28 20 73 65 74 75 69  .      if( setui
11410 64 28 70 77 64 2d 3e 70 77 5f 75 69 64 29 20 29  d(pwd->pw_uid) )
11420 7b 0a 20 20 20 20 20 20 20 20 4d 61 6c 66 75 6e  {.        Malfun
11430 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20  ction(__LINE__, 
11440 2f 2a 20 4c 4f 47 3a 20 73 65 74 75 69 64 28 29  /* LOG: setuid()
11450 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
11460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
11470 63 61 6e 6e 6f 74 20 73 65 74 20 75 73 65 72 2d  cannot set user-
11480 69 64 20 74 6f 20 25 64 22 2c 20 70 77 64 2d 3e  id to %d", pwd->
11490 70 77 5f 75 69 64 29 3b 0a 20 20 20 20 20 20 7d  pw_uid);.      }
114a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
114b0 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f    Malfunction(__
114c0 4c 49 4e 45 5f 5f 2c 20 2f 2a 20 4c 4f 47 3a 20  LINE__, /* LOG: 
114d0 75 6e 6b 6e 6f 77 6e 20 75 73 65 72 20 2a 2f 0a  unknown user */.
114e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114f0 20 20 22 6e 6f 20 73 75 63 68 20 75 73 65 72 20    "no such user 
11500 5b 25 73 5d 22 2c 20 7a 50 65 72 6d 55 73 65 72  [%s]", zPermUser
11510 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
11520 66 28 20 67 65 74 75 69 64 28 29 3d 3d 30 20 29  f( getuid()==0 )
11530 7b 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f  {.    Malfunctio
11540 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a 20 4c  n(__LINE__, /* L
11550 4f 47 3a 20 63 61 6e 6e 6f 74 20 72 75 6e 20 61  OG: cannot run a
11560 73 20 72 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20  s root */.      
11570 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f            "canno
11580 74 20 72 75 6e 20 61 73 20 72 6f 6f 74 22 29 3b  t run as root");
11590 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 74  .  }..  /* Get t
115a0 68 65 20 49 50 20 61 64 64 72 65 73 73 20 66 72  he IP address fr
115b0 6f 6d 20 77 68 65 6e 63 65 20 74 68 65 20 72 65  om whence the re
115c0 71 75 65 73 74 20 6f 72 69 67 69 6e 61 74 65 73  quest originates
115d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6d  .  */.  if( zRem
115e0 6f 74 65 41 64 64 72 3d 3d 30 20 29 7b 0a 20 20  oteAddr==0 ){.  
115f0 20 20 61 64 64 72 65 73 73 20 72 65 6d 6f 74 65    address remote
11600 41 64 64 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e  Addr;.    unsign
11610 65 64 20 69 6e 74 20 73 69 7a 65 20 3d 20 73 69  ed int size = si
11620 7a 65 6f 66 28 72 65 6d 6f 74 65 41 64 64 72 29  zeof(remoteAddr)
11630 3b 0a 20 20 20 20 63 68 61 72 20 7a 48 6f 73 74  ;.    char zHost
11640 5b 4e 49 5f 4d 41 58 48 4f 53 54 5d 3b 0a 20 20  [NI_MAXHOST];.  
11650 20 20 69 66 28 20 67 65 74 70 65 65 72 6e 61 6d    if( getpeernam
11660 65 28 30 2c 20 26 72 65 6d 6f 74 65 41 64 64 72  e(0, &remoteAddr
11670 2e 73 61 2c 20 26 73 69 7a 65 29 3e 3d 30 20 29  .sa, &size)>=0 )
11680 7b 0a 20 20 20 20 20 20 67 65 74 6e 61 6d 65 69  {.      getnamei
11690 6e 66 6f 28 26 72 65 6d 6f 74 65 41 64 64 72 2e  nfo(&remoteAddr.
116a0 73 61 2c 20 73 69 7a 65 2c 20 7a 48 6f 73 74 2c  sa, size, zHost,
116b0 20 73 69 7a 65 6f 66 28 7a 48 6f 73 74 29 2c 20   sizeof(zHost), 
116c0 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
116d0 20 20 20 20 20 20 20 20 4e 49 5f 4e 55 4d 45 52          NI_NUMER
116e0 49 43 48 4f 53 54 29 3b 0a 20 20 20 20 20 20 7a  ICHOST);.      z
116f0 52 65 6d 6f 74 65 41 64 64 72 20 3d 20 53 74 72  RemoteAddr = Str
11700 44 75 70 28 7a 48 6f 73 74 29 3b 0a 20 20 20 20  Dup(zHost);.    
11710 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63  }.  }..  /* Proc
11720 65 73 73 20 74 68 65 20 69 6e 70 75 74 20 73 74  ess the input st
11730 72 65 61 6d 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ream */.  for(i=
11740 30 3b 20 69 3c 31 30 30 3b 20 69 2b 2b 29 7b 0a  0; i<100; i++){.
11750 20 20 20 20 50 72 6f 63 65 73 73 4f 6e 65 52 65      ProcessOneRe
11760 71 75 65 73 74 28 30 29 3b 0a 20 20 7d 0a 20 20  quest(0);.  }.  
11770 50 72 6f 63 65 73 73 4f 6e 65 52 65 71 75 65 73  ProcessOneReques
11780 74 28 31 29 3b 0a 20 20 65 78 69 74 28 30 29 3b  t(1);.  exit(0);
11790 0a 7d 0a                                         .}.