Documentation Source Text

Hex Artifact Content
Login

Artifact a2e4fd7b6b186307f58f723067638d90f6a5606e:


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 0a 2a 2a 0a 2a 2a  root jail..**.**
0d80: 20 20 2d 2d 68 74 74 70 73 20 20 20 20 20 20 20    --https       
0d90: 20 20 20 49 6e 64 69 63 61 74 65 73 20 74 68 61     Indicates tha
0da0: 74 20 69 6e 70 75 74 20 69 73 20 63 6f 6d 69 6e  t input is comin
0db0: 67 20 6f 76 65 72 20 53 53 4c 20 61 6e 64 20 69  g over SSL and i
0dc0: 73 20 62 65 69 6e 67 0a 2a 2a 20 20 20 20 20 20  s being.**      
0dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 63               dec
0de0: 6f 64 65 64 20 75 70 73 74 72 65 61 6d 2c 20 70  oded upstream, p
0df0: 65 72 68 61 70 73 20 62 79 20 73 74 75 6e 6e 65  erhaps by stunne
0e00: 6c 2e 20 20 28 54 68 69 73 20 70 72 6f 67 72 61  l.  (This progra
0e10: 6d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  m.**            
0e20: 20 20 20 20 20 20 20 6f 6e 6c 79 20 75 6e 64 65         only unde
0e30: 72 73 74 61 6e 64 73 20 70 6c 61 69 6e 74 65 78  rstands plaintex
0e40: 74 2e 29 0a 2a 2a 0a 2a 2a 20 20 2d 2d 66 61 6d  t.).**.**  --fam
0e50: 69 6c 79 20 69 70 76 34 20 20 20 20 4f 6e 6c 79  ily ipv4    Only
0e60: 20 61 63 63 65 70 74 20 69 6e 70 75 74 20 66 72   accept input fr
0e70: 6f 6d 20 49 50 56 34 20 6f 72 20 49 50 56 36 2c  om IPV4 or IPV6,
0e80: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a   respectively..*
0e90: 2a 20 20 2d 2d 66 61 6d 69 6c 79 20 69 70 76 36  *  --family ipv6
0ea0: 20 20 20 20 54 68 65 73 65 20 6f 70 74 69 6f 6e      These option
0eb0: 73 20 61 72 65 20 6f 6e 6c 79 20 6d 65 61 6e 69  s are only meani
0ec0: 6e 67 66 75 6c 20 69 66 20 61 6c 74 68 74 74 70  ngful if althttp
0ed0: 64 20 69 73 20 72 75 6e 0a 2a 2a 20 20 20 20 20  d is run.**     
0ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
0ef0: 20 61 20 73 74 61 6e 64 2d 61 6c 6f 6e 65 20 73   a stand-alone s
0f00: 65 72 76 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 2d 2d  erver..**.**  --
0f10: 6a 61 69 6c 20 42 4f 4f 4c 45 41 4e 20 20 20 49  jail BOOLEAN   I
0f20: 6e 64 69 63 61 74 65 73 20 77 68 65 74 68 65 72  ndicates whether
0f30: 20 6f 72 20 6e 6f 74 20 74 6f 20 66 6f 72 6d 20   or not to form 
0f40: 61 20 63 68 72 6f 6f 74 20 6a 61 69 6c 20 69 66  a chroot jail if
0f50: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
0f60: 20 20 20 20 20 20 20 69 6e 69 74 69 61 6c 6c 79         initially
0f70: 20 72 75 6e 20 61 73 20 72 6f 6f 74 2e 20 20 54   run as root.  T
0f80: 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 74 72  he default is tr
0f90: 75 65 2c 20 73 6f 20 74 68 65 20 6f 6e 6c 79 0a  ue, so the only.
0fa0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0fb0: 20 20 20 20 20 75 73 65 66 75 6c 20 76 61 72 69       useful vari
0fc0: 61 6e 74 20 6f 66 20 74 68 69 73 20 6f 70 74 69  ant of this opti
0fd0: 6f 6e 20 69 73 20 22 2d 2d 6a 61 69 6c 20 30 22  on is "--jail 0"
0fe0: 20 77 68 69 63 68 20 70 72 65 76 65 6e 74 73 0a   which prevents.
0ff0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1000: 20 20 20 20 20 74 68 65 20 66 6f 72 6d 61 74 69       the formati
1010: 6f 6e 20 6f 66 20 74 68 65 20 63 68 72 6f 6f 74  on of the chroot
1020: 20 6a 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 20 2d 2d   jail..**.**  --
1030: 64 65 62 75 67 20 20 20 20 20 20 20 20 20 20 44  debug          D
1040: 69 73 61 62 6c 65 73 20 69 6e 70 75 74 20 74 69  isables input ti
1050: 6d 65 6f 75 74 73 2e 20 20 54 68 69 73 20 69 73  meouts.  This is
1060: 20 75 73 65 66 75 6c 20 66 6f 72 20 64 65 62 75   useful for debu
1070: 67 67 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  gging.**        
1080: 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
1090: 69 6e 70 75 74 73 20 69 73 20 62 65 69 6e 67 20  inputs is being 
10a0: 74 79 70 65 64 20 69 6e 20 6d 61 6e 75 61 6c 6c  typed in manuall
10b0: 79 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 6d 61 6e 64  y..**.** Command
10c0: 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 73 20 63 61  -line options ca
10d0: 6e 20 74 61 6b 65 20 65 69 74 68 65 72 20 6f 6e  n take either on
10e0: 65 20 6f 72 20 74 77 6f 20 69 6e 69 74 69 61 6c  e or two initial
10f0: 20 22 2d 22 20 63 68 61 72 61 63 74 65 72 73 2e   "-" characters.
1100: 0a 2a 2a 20 53 6f 20 22 2d 2d 64 65 62 75 67 22  .** So "--debug"
1110: 20 61 6e 64 20 22 2d 64 65 62 75 67 22 20 6d 65   and "-debug" me
1120: 61 6e 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  an the same thin
1130: 67 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 0a  g, for example..
1140: 2a 2a 0a 2a 2a 0a 2a 2a 20 53 65 63 75 72 69 74  **.**.** Securit
1150: 79 20 46 65 61 74 75 72 65 73 3a 0a 2a 2a 0a 2a  y Features:.**.*
1160: 2a 20 28 31 29 20 20 54 68 69 73 20 70 72 6f 67  * (1)  This prog
1170: 72 61 6d 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ram automaticall
1180: 79 20 70 75 74 73 20 69 74 73 65 6c 66 20 69 6e  y puts itself in
1190: 73 69 64 65 20 61 20 63 68 72 6f 6f 74 20 6a 61  side a chroot ja
11a0: 69 6c 20 69 66 0a 2a 2a 20 20 20 20 20 20 69 74  il if.**      it
11b0: 20 63 61 6e 20 61 6e 64 20 69 66 20 6e 6f 74 20   can and if not 
11c0: 73 70 65 63 69 66 69 63 61 6c 6c 79 20 70 72 6f  specifically pro
11d0: 68 69 62 69 74 65 64 20 62 79 20 74 68 65 20 22  hibited by the "
11e0: 2d 2d 6a 61 69 6c 20 30 22 0a 2a 2a 20 20 20 20  --jail 0".**    
11f0: 20 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f    command-line o
1200: 70 74 69 6f 6e 2e 20 20 54 68 65 20 72 6f 6f 74  ption.  The root
1210: 20 6f 66 20 74 68 65 20 6a 61 69 6c 20 69 73 20   of the jail is 
1220: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68  the directory th
1230: 61 74 0a 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61  at.**      conta
1240: 69 6e 73 20 74 68 65 20 76 61 72 69 6f 75 73 20  ins the various 
1250: 24 48 4f 53 54 2e 77 65 62 73 69 74 65 20 63 6f  $HOST.website co
1260: 6e 74 65 6e 74 20 73 75 62 64 69 72 65 63 74 6f  ntent subdirecto
1270: 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 32 29 20  ries..**.** (2) 
1280: 20 4e 6f 20 69 6e 70 75 74 20 69 73 20 72 65 61   No input is rea
1290: 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  d while this pro
12a0: 63 65 73 73 20 68 61 73 20 72 6f 6f 74 20 70 72  cess has root pr
12b0: 69 76 69 6c 65 67 65 73 2e 20 20 52 6f 6f 74 0a  ivileges.  Root.
12c0: 2a 2a 20 20 20 20 20 20 70 72 69 76 69 6c 65 67  **      privileg
12d0: 65 73 20 61 72 65 20 64 72 6f 70 70 65 64 20 70  es are dropped p
12e0: 72 69 6f 72 20 74 6f 20 72 65 61 64 69 6e 67 20  rior to reading 
12f0: 61 6e 79 20 69 6e 70 75 74 20 28 62 75 74 20 61  any input (but a
1300: 66 74 65 72 20 65 6e 74 65 72 69 6e 67 0a 2a 2a  fter entering.**
1310: 20 20 20 20 20 20 74 68 65 20 63 68 72 6f 6f 74        the chroot
1320: 20 6a 61 69 6c 2c 20 6f 66 20 63 6f 75 72 73 65   jail, of course
1330: 29 2e 20 20 49 66 20 72 6f 6f 74 20 70 72 69 76  ).  If root priv
1340: 69 6c 65 67 65 73 20 63 61 6e 6e 6f 74 20 62 65  ileges cannot be
1350: 20 64 72 6f 70 70 65 64 0a 2a 2a 20 20 20 20 20   dropped.**     
1360: 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 20 62 65   (for example be
1370: 63 61 75 73 65 20 74 68 65 20 2d 2d 75 73 65 72  cause the --user
1380: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70   command-line op
1390: 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64  tion was omitted
13a0: 20 6f 72 0a 2a 2a 20 20 20 20 20 20 62 65 63 61   or.**      beca
13b0: 75 73 65 20 74 68 65 20 75 73 65 72 20 73 70 65  use the user spe
13c0: 63 69 66 69 65 64 20 62 79 20 74 68 65 20 2d 2d  cified by the --
13d0: 75 73 65 72 20 6f 70 74 69 6f 6e 20 64 6f 65 73  user option does
13e0: 20 6e 6f 74 20 65 78 69 73 74 29 2c 20 0a 2a 2a   not exist), .**
13f0: 20 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 70        then the p
1400: 72 6f 63 65 73 73 20 61 62 6f 72 74 73 20 77 69  rocess aborts wi
1410: 74 68 20 61 6e 20 65 72 72 6f 72 20 70 72 69 6f  th an error prio
1420: 72 20 74 6f 20 72 65 61 64 69 6e 67 20 61 6e 79  r to reading any
1430: 20 69 6e 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 28 33   input..**.** (3
1440: 29 20 20 54 68 65 20 6c 65 6e 67 74 68 20 6f 66  )  The length of
1450: 20 61 6e 20 48 54 54 50 20 72 65 71 75 65 73 74   an HTTP request
1460: 20 69 73 20 6c 69 6d 69 74 65 64 20 74 6f 20 4d   is limited to M
1470: 41 58 5f 43 4f 4e 54 45 4e 54 5f 4c 45 4e 47 54  AX_CONTENT_LENGT
1480: 48 20 62 79 74 65 73 0a 2a 2a 20 20 20 20 20 20  H bytes.**      
1490: 28 64 65 66 61 75 6c 74 3a 20 32 30 20 6d 69 6c  (default: 20 mil
14a0: 6c 69 6f 6e 29 2e 20 20 41 6e 79 20 48 54 54 50  lion).  Any HTTP
14b0: 20 72 65 71 75 65 73 74 20 6c 6f 6e 67 65 72 20   request longer 
14c0: 74 68 61 6e 20 74 68 69 73 20 66 61 69 6c 73 0a  than this fails.
14d0: 2a 2a 20 20 20 20 20 20 77 69 74 68 20 61 6e 20  **      with an 
14e0: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 28 34 29  error..**.** (4)
14f0: 20 20 54 68 65 72 65 20 61 72 65 20 68 61 72 64    There are hard
1500: 2d 63 6f 64 65 64 20 74 69 6d 65 2d 6f 75 74 73  -coded time-outs
1510: 20 6f 6e 20 65 61 63 68 20 48 54 54 50 20 72 65   on each HTTP re
1520: 71 75 65 73 74 2e 20 20 49 66 20 74 68 69 73 20  quest.  If this 
1530: 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20  process.**      
1540: 77 61 69 74 73 20 6c 6f 6e 67 65 72 20 74 68 61  waits longer tha
1550: 6e 20 74 68 65 20 74 69 6d 65 6f 75 74 20 66 6f  n the timeout fo
1560: 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 72  r the complete r
1570: 65 71 75 65 73 74 2c 20 6f 72 20 66 6f 72 20 43  equest, or for C
1580: 47 49 0a 2a 2a 20 20 20 20 20 20 74 6f 20 66 69  GI.**      to fi
1590: 6e 69 73 68 20 72 75 6e 6e 69 6e 67 2c 20 74 68  nish running, th
15a0: 65 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  en this process 
15b0: 61 62 6f 72 74 73 2e 20 20 28 54 68 65 20 74 69  aborts.  (The ti
15c0: 6d 65 6f 75 74 20 66 65 61 74 75 72 65 0a 2a 2a  meout feature.**
15d0: 20 20 20 20 20 20 63 61 6e 20 62 65 20 64 69 73        can be dis
15e0: 61 62 6c 65 64 20 75 73 69 6e 67 20 74 68 65 20  abled using the 
15f0: 2d 2d 64 65 62 75 67 20 63 6f 6d 6d 61 6e 64 2d  --debug command-
1600: 6c 69 6e 65 20 6f 70 74 69 6f 6e 2e 29 0a 2a 2a  line option.).**
1610: 0a 2a 2a 20 28 35 29 20 20 49 66 20 74 68 65 20  .** (5)  If the 
1620: 48 54 54 50 5f 48 4f 53 54 20 72 65 71 75 65 73  HTTP_HOST reques
1630: 74 20 68 65 61 64 65 72 20 63 6f 6e 74 61 69 6e  t header contain
1640: 73 20 63 68 61 72 61 63 74 65 72 73 20 6f 74 68  s characters oth
1650: 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 20 20 20  er than.**      
1660: 5b 30 2d 39 61 2d 7a 41 2d 5a 2c 2d 2e 2f 3a 5f  [0-9a-zA-Z,-./:_
1670: 7e 5d 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69  ~] then the enti
1680: 72 65 20 72 65 71 75 65 73 74 20 69 73 20 72 65  re request is re
1690: 6a 65 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 28 36  jected..**.** (6
16a0: 29 20 20 41 6e 79 20 63 68 61 72 61 63 74 65 72  )  Any character
16b0: 73 20 69 6e 20 74 68 65 20 55 52 49 20 70 61 74  s in the URI pat
16c0: 68 6e 61 6d 65 20 6f 74 68 65 72 20 74 68 61 6e  hname other than
16d0: 20 5b 30 2d 39 61 2d 7a 41 2d 5a 2c 2d 2e 2f 3a   [0-9a-zA-Z,-./:
16e0: 5f 7e 5d 0a 2a 2a 20 20 20 20 20 20 61 72 65 20  _~].**      are 
16f0: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 22  converted into "
1700: 5f 22 2e 20 20 54 68 69 73 20 61 70 70 6c 69 65  _".  This applie
1710: 73 20 74 6f 20 74 68 65 20 70 61 74 68 6e 61 6d  s to the pathnam
1720: 65 20 6f 6e 6c 79 2c 20 6e 6f 74 0a 2a 2a 20 20  e only, not.**  
1730: 20 20 20 20 74 6f 20 74 68 65 20 71 75 65 72 79      to the query
1740: 20 70 61 72 61 6d 65 74 65 72 73 20 6f 72 20 66   parameters or f
1750: 72 61 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 28  ragment..**.** (
1760: 37 29 20 20 49 66 20 74 68 65 20 66 69 72 73 74  7)  If the first
1770: 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 61 6e   character of an
1780: 79 20 55 52 49 20 70 61 74 68 6e 61 6d 65 20 63  y URI pathname c
1790: 6f 6d 70 6f 6e 65 6e 74 20 69 73 20 22 2e 22 20  omponent is "." 
17a0: 6f 72 20 22 2d 22 0a 2a 2a 20 20 20 20 20 20 74  or "-".**      t
17b0: 68 65 6e 20 61 20 34 30 34 20 4e 6f 74 20 46 6f  hen a 404 Not Fo
17c0: 75 6e 64 20 72 65 70 6c 79 20 69 73 20 67 65 6e  und reply is gen
17d0: 65 72 61 74 65 64 2e 20 20 54 68 69 73 20 70 72  erated.  This pr
17e0: 65 76 65 6e 74 73 20 61 74 74 61 63 6b 73 0a 2a  events attacks.*
17f0: 2a 20 20 20 20 20 20 73 75 63 68 20 61 73 20 69  *      such as i
1800: 6e 63 6c 75 64 69 6e 67 20 22 2e 2e 22 20 6f 72  ncluding ".." or
1810: 20 22 2e 22 20 64 69 72 65 63 74 6f 72 79 20 65   "." directory e
1820: 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 70  lements in the p
1830: 61 74 68 6e 61 6d 65 0a 2a 2a 20 20 20 20 20 20  athname.**      
1840: 61 6e 64 20 61 6c 6c 6f 77 73 20 70 6c 61 63 69  and allows placi
1850: 6e 67 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72  ng files and dir
1860: 65 63 74 6f 72 69 65 73 20 69 6e 20 74 68 65 20  ectories in the 
1870: 63 6f 6e 74 65 6e 74 20 73 75 62 64 69 72 65 63  content subdirec
1880: 74 6f 72 79 0a 2a 2a 20 20 20 20 20 20 74 68 61  tory.**      tha
1890: 74 20 61 72 65 20 69 6e 76 69 73 69 62 6c 65 20  t are invisible 
18a0: 74 6f 20 61 6c 6c 20 48 54 54 50 20 72 65 71 75  to all HTTP requ
18b0: 65 73 74 73 2c 20 62 79 20 6d 61 6b 69 6e 67 20  ests, by making 
18c0: 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 20 20  the first .**   
18d0: 20 20 20 63 68 61 72 61 63 74 65 72 20 6f 66 20     character of 
18e0: 74 68 65 20 66 69 6c 65 20 6f 72 20 73 75 62 64  the file or subd
18f0: 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 20 22 2d  irectory name "-
1900: 22 20 6f 72 20 22 2e 22 2e 0a 2a 2a 0a 2a 2a 20  " or "."..**.** 
1910: 28 38 29 20 20 54 68 65 20 72 65 71 75 65 73 74  (8)  The request
1920: 20 55 52 49 20 6d 75 73 74 20 62 65 67 69 6e 20   URI must begin 
1930: 77 69 74 68 20 22 2f 22 20 6f 72 20 65 6c 73 65  with "/" or else
1940: 20 61 20 34 30 34 20 65 72 72 6f 72 20 69 73 20   a 404 error is 
1950: 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  generated..**.**
1960: 20 28 39 29 20 20 54 68 69 73 20 70 72 6f 67 72   (9)  This progr
1970: 61 6d 20 6e 65 76 65 72 20 73 65 74 73 20 74 68  am never sets th
1980: 65 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 65 6e  e value of an en
1990: 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
19a0: 6c 65 20 74 6f 20 61 0a 2a 2a 20 20 20 20 20 20  le to a.**      
19b0: 73 74 72 69 6e 67 20 74 68 61 74 20 62 65 67 69  string that begi
19c0: 6e 73 20 77 69 74 68 20 22 28 29 20 7b 22 2e 0a  ns with "() {"..
19d0: 2a 2a 0a 2a 2a 0a 2a 2a 20 42 61 73 69 63 20 41  **.**.** Basic A
19e0: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 3a 0a 2a 2a  uthorization:.**
19f0: 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
1a00: 22 2d 61 75 74 68 22 20 65 78 69 73 74 73 20 69  "-auth" exists i
1a10: 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63  n the same direc
1a20: 74 6f 72 79 20 61 73 20 74 68 65 20 63 6f 6e 74  tory as the cont
1a30: 65 6e 74 20 66 69 6c 65 0a 2a 2a 20 28 66 6f 72  ent file.** (for
1a40: 20 62 6f 74 68 20 73 74 61 74 69 63 20 63 6f 6e   both static con
1a50: 74 65 6e 74 20 61 6e 64 20 43 47 49 29 20 74 68  tent and CGI) th
1a60: 65 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 74  en it contains t
1a70: 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75  he information u
1a80: 73 65 64 0a 2a 2a 20 66 6f 72 20 62 61 73 69 63  sed.** for basic
1a90: 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 2e 20   authorization. 
1aa0: 20 54 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74   The file format
1ab0: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
1ac0: 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 42 6c 61 6e  **.**    *  Blan
1ad0: 6b 20 6c 69 6e 65 73 20 61 6e 64 20 6c 69 6e 65  k lines and line
1ae0: 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  s that begin wit
1af0: 68 20 27 23 27 20 61 72 65 20 69 67 6e 6f 72 65  h '#' are ignore
1b00: 64 0a 2a 2a 20 20 20 20 2a 20 20 22 68 74 74 70  d.**    *  "http
1b10: 2d 72 65 64 69 72 65 63 74 22 20 66 6f 72 63 65  -redirect" force
1b20: 73 20 61 20 72 65 64 69 72 65 63 74 20 74 6f 20  s a redirect to 
1b30: 48 54 54 50 53 20 69 66 20 6e 6f 74 20 74 68 65  HTTPS if not the
1b40: 72 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 20 20  re already.**   
1b50: 20 2a 20 20 22 68 74 74 70 73 2d 6f 6e 6c 79 22   *  "https-only"
1b60: 20 64 69 73 61 6c 6c 6f 77 73 20 6f 70 65 72 61   disallows opera
1b70: 74 69 6f 6e 20 69 6e 20 48 54 54 50 0a 2a 2a 20  tion in HTTP.** 
1b80: 20 20 20 2a 20 20 22 75 73 65 72 20 4e 41 4d 45     *  "user NAME
1b90: 20 4c 4f 47 49 4e 3a 50 41 53 53 57 4f 52 44 22   LOGIN:PASSWORD"
1ba0: 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69   checks to see i
1bb0: 66 20 4c 4f 47 49 4e 3a 50 41 53 53 57 4f 52 44  f LOGIN:PASSWORD
1bc0: 20 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 68 6f   .**       autho
1bd0: 72 69 7a 61 74 69 6f 6e 20 63 72 65 64 65 6e 74  rization credent
1be0: 69 61 6c 73 20 61 72 65 20 70 72 6f 76 69 64 65  ials are provide
1bf0: 64 2c 20 61 6e 64 20 69 66 20 73 6f 20 73 65 74  d, and if so set
1c00: 73 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 52  s the.**       R
1c10: 45 4d 4f 54 45 5f 55 53 45 52 20 74 6f 20 4e 41  EMOTE_USER to NA
1c20: 4d 45 2e 0a 2a 2a 20 20 20 20 2a 20 20 22 72 65  ME..**    *  "re
1c30: 61 6c 6d 20 54 45 58 54 22 20 73 65 74 73 20 74  alm TEXT" sets t
1c40: 68 65 20 72 65 61 6c 6d 20 74 6f 20 54 45 58 54  he realm to TEXT
1c50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 63 61  ..**.** There ca
1c60: 6e 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 22 75  n be multiple "u
1c70: 73 65 72 22 20 6c 69 6e 65 73 2e 20 20 49 66 20  ser" lines.  If 
1c80: 6e 6f 20 22 75 73 65 72 22 20 6c 69 6e 65 20 6d  no "user" line m
1c90: 61 74 63 68 65 73 2c 20 74 68 65 0a 2a 2a 20 72  atches, the.** r
1ca0: 65 71 75 65 73 74 20 66 61 69 6c 73 20 77 69 74  equest fails wit
1cb0: 68 20 61 20 34 30 31 20 65 72 72 6f 72 2e 0a 2a  h a 401 error..*
1cc0: 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69  /.#include <stdi
1cd0: 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63  o.h>.#include <c
1ce0: 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  type.h>.#include
1cf0: 20 3c 73 79 73 6c 6f 67 2e 68 3e 0a 23 69 6e 63   <syslog.h>.#inc
1d00: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a  lude <stdlib.h>.
1d10: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74  #include <sys/st
1d20: 61 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  at.h>.#include <
1d30: 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75  unistd.h>.#inclu
1d40: 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69 6e  de <fcntl.h>.#in
1d50: 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e  clude <string.h>
1d60: 0a 23 69 6e 63 6c 75 64 65 20 3c 70 77 64 2e 68  .#include <pwd.h
1d70: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  >.#include <sys/
1d80: 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  time.h>.#include
1d90: 20 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23   <sys/types.h>.#
1da0: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 6f 63  include <sys/soc
1db0: 6b 65 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ket.h>.#include 
1dc0: 3c 73 79 73 2f 77 61 69 74 2e 68 3e 0a 23 69 6e  <sys/wait.h>.#in
1dd0: 63 6c 75 64 65 20 3c 6e 65 74 69 6e 65 74 2f 69  clude <netinet/i
1de0: 6e 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61  n.h>.#include <a
1df0: 72 70 61 2f 69 6e 65 74 2e 68 3e 0a 23 69 6e 63  rpa/inet.h>.#inc
1e00: 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e 0a  lude <stdarg.h>.
1e10: 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68  #include <time.h
1e20: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  >.#include <sys/
1e30: 74 69 6d 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64  times.h>.#includ
1e40: 65 20 3c 6e 65 74 64 62 2e 68 3e 0a 23 69 6e 63  e <netdb.h>.#inc
1e50: 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 23  lude <errno.h>.#
1e60: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 72 65 73  include <sys/res
1e70: 6f 75 72 63 65 2e 68 3e 0a 23 69 66 64 65 66 20  ource.h>.#ifdef 
1e80: 6c 69 6e 75 78 0a 23 69 6e 63 6c 75 64 65 20 3c  linux.#include <
1e90: 73 79 73 2f 73 65 6e 64 66 69 6c 65 2e 68 3e 0a  sys/sendfile.h>.
1ea0: 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20  #endif.#include 
1eb0: 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 2f 2a 0a 2a  <assert.h>../*.*
1ec0: 2a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20  * Configure the 
1ed0: 73 65 72 76 65 72 20 62 79 20 73 65 74 74 69 6e  server by settin
1ee0: 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
1ef0: 6d 61 63 72 6f 73 20 61 6e 64 20 72 65 63 6f 6d  macros and recom
1f00: 70 69 6c 69 6e 67 2e 0a 2a 2f 0a 23 69 66 6e 64  piling..*/.#ifnd
1f10: 65 66 20 44 45 46 41 55 4c 54 5f 50 4f 52 54 0a  ef DEFAULT_PORT.
1f20: 23 64 65 66 69 6e 65 20 44 45 46 41 55 4c 54 5f  #define DEFAULT_
1f30: 50 4f 52 54 20 22 38 30 22 0a 23 65 6e 64 69 66  PORT "80".#endif
1f40: 0a 23 69 66 6e 64 65 66 20 4d 41 58 5f 43 4f 4e  .#ifndef MAX_CON
1f50: 54 45 4e 54 5f 4c 45 4e 47 54 48 0a 23 64 65 66  TENT_LENGTH.#def
1f60: 69 6e 65 20 4d 41 58 5f 43 4f 4e 54 45 4e 54 5f  ine MAX_CONTENT_
1f70: 4c 45 4e 47 54 48 20 32 30 30 30 30 30 30 30 0a  LENGTH 20000000.
1f80: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65  #endif../*.** We
1f90: 20 72 65 63 6f 72 64 20 6d 6f 73 74 20 6f 66 20   record most of 
1fa0: 74 68 65 20 73 74 61 74 65 20 69 6e 66 6f 72 6d  the state inform
1fb0: 61 74 69 6f 6e 20 61 73 20 67 6c 6f 62 61 6c 20  ation as global 
1fc0: 76 61 72 69 61 62 6c 65 73 2e 20 20 54 68 69 73  variables.  This
1fd0: 0a 2a 2a 20 73 61 76 65 73 20 68 61 76 69 6e 67  .** saves having
1fe0: 20 74 6f 20 70 61 73 73 20 69 6e 66 6f 72 6d 61   to pass informa
1ff0: 74 69 6f 6e 20 74 6f 20 73 75 62 72 6f 75 74 69  tion to subrouti
2000: 6e 65 73 20 61 73 20 70 61 72 61 6d 65 74 65 72  nes as parameter
2010: 73 2c 20 61 6e 64 0a 2a 2a 20 6d 61 6b 65 73 20  s, and.** makes 
2020: 74 68 65 20 65 78 65 63 75 74 61 62 6c 65 20 73  the executable s
2030: 6d 61 6c 6c 65 72 2e 2e 2e 0a 2a 2f 0a 73 74 61  maller....*/.sta
2040: 74 69 63 20 63 68 61 72 20 2a 7a 52 6f 6f 74 20  tic char *zRoot 
2050: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
2060: 20 52 6f 6f 74 20 64 69 72 65 63 74 6f 72 79 20   Root directory 
2070: 6f 66 20 74 68 65 20 77 65 62 73 69 74 65 20 2a  of the website *
2080: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a  /.static char *z
2090: 54 6d 70 4e 61 6d 20 3d 20 30 3b 20 20 20 20 20  TmpNam = 0;     
20a0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20     /* Name of a 
20b0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a  temporary file *
20c0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 54  /.static char zT
20d0: 6d 70 4e 61 6d 42 75 66 5b 35 30 30 5d 3b 20 20  mpNamBuf[500];  
20e0: 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68     /* Space to h
20f0: 6f 6c 64 20 74 68 65 20 74 65 6d 70 6f 72 61 72  old the temporar
2100: 79 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 73 74  y filename */.st
2110: 61 74 69 63 20 63 68 61 72 20 2a 7a 50 72 6f 74  atic char *zProt
2120: 6f 63 6f 6c 20 3d 20 30 3b 20 20 20 20 20 20 2f  ocol = 0;      /
2130: 2a 20 54 68 65 20 70 72 6f 74 6f 63 6f 6c 20 62  * The protocol b
2140: 65 69 6e 67 20 75 73 69 6e 67 20 62 79 20 74 68  eing using by th
2150: 65 20 62 72 6f 77 73 65 72 20 2a 2f 0a 73 74 61  e browser */.sta
2160: 74 69 63 20 63 68 61 72 20 2a 7a 4d 65 74 68 6f  tic char *zMetho
2170: 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  d = 0;        /*
2180: 20 54 68 65 20 6d 65 74 68 6f 64 2e 20 20 4d 75   The method.  Mu
2190: 73 74 20 62 65 20 47 45 54 20 2a 2f 0a 73 74 61  st be GET */.sta
21a0: 74 69 63 20 63 68 61 72 20 2a 7a 53 63 72 69 70  tic char *zScrip
21b0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  t = 0;        /*
21c0: 20 54 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 72   The object to r
21d0: 65 74 72 69 65 76 65 20 2a 2f 0a 73 74 61 74 69  etrieve */.stati
21e0: 63 20 63 68 61 72 20 2a 7a 52 65 61 6c 53 63 72  c char *zRealScr
21f0: 69 70 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 54  ipt = 0;    /* T
2200: 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74  he object to ret
2210: 72 69 65 76 65 2e 20 20 53 61 6d 65 20 61 73 20  rieve.  Same as 
2220: 7a 53 63 72 69 70 74 0a 20 20 20 20 20 20 20 20  zScript.        
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2240: 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 63 65           ** exce
2250: 70 74 20 6d 69 67 68 74 20 68 61 76 65 20 22 2f  pt might have "/
2260: 69 6e 64 65 78 2e 68 74 6d 6c 22 20 61 70 70 65  index.html" appe
2270: 6e 64 65 64 20 2a 2f 0a 73 74 61 74 69 63 20 63  nded */.static c
2280: 68 61 72 20 2a 7a 48 6f 6d 65 20 3d 20 30 3b 20  har *zHome = 0; 
2290: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22a0: 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69  directory contai
22b0: 6e 69 6e 67 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  ning content */.
22c0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 51 75  static char *zQu
22d0: 65 72 79 53 74 72 69 6e 67 20 3d 20 30 3b 20 20  eryString = 0;  
22e0: 20 2f 2a 20 54 68 65 20 71 75 65 72 79 20 73 74   /* The query st
22f0: 72 69 6e 67 20 6f 6e 20 74 68 65 20 65 6e 64 20  ring on the end 
2300: 6f 66 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 73  of the name */.s
2310: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 46 69 6c  tatic char *zFil
2320: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
2330: 2f 2a 20 54 68 65 20 66 69 6c 65 6e 61 6d 65 20  /* The filename 
2340: 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f  of the object to
2350: 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 73 74 61   retrieve */.sta
2360: 74 69 63 20 69 6e 74 20 6c 65 6e 46 69 6c 65 20  tic int lenFile 
2370: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
2380: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a   Length of the z
2390: 46 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 73 74 61  File name */.sta
23a0: 74 69 63 20 63 68 61 72 20 2a 7a 44 69 72 20 3d  tic char *zDir =
23b0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
23c0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72   Name of the dir
23d0: 65 63 74 6f 72 79 20 68 6f 6c 64 69 6e 67 20 7a  ectory holding z
23e0: 46 69 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20 63  File */.static c
23f0: 68 61 72 20 2a 7a 50 61 74 68 49 6e 66 6f 20 3d  har *zPathInfo =
2400: 20 30 3b 20 20 20 20 20 20 2f 2a 20 50 61 72 74   0;      /* Part
2410: 20 6f 66 20 74 68 65 20 70 61 74 68 6e 61 6d 65   of the pathname
2420: 20 70 61 73 74 20 74 68 65 20 66 69 6c 65 20 2a   past the file *
2430: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a  /.static char *z
2440: 41 67 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20  Agent = 0;      
2450: 20 20 20 2f 2a 20 57 68 61 74 20 74 79 70 65 20     /* What type 
2460: 69 66 20 62 72 6f 77 73 65 72 20 69 73 20 6d 61  if browser is ma
2470: 6b 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20  king this query 
2480: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
2490: 7a 53 65 72 76 65 72 4e 61 6d 65 20 3d 20 30 3b  zServerName = 0;
24a0: 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20      /* The name 
24b0: 61 66 74 65 72 20 74 68 65 20 68 74 74 70 3a 2f  after the http:/
24c0: 2f 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  / */.static char
24d0: 20 2a 7a 53 65 72 76 65 72 50 6f 72 74 20 3d 20   *zServerPort = 
24e0: 30 3b 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 72  0;    /* The por
24f0: 74 20 6e 75 6d 62 65 72 20 2a 2f 0a 73 74 61 74  t number */.stat
2500: 69 63 20 63 68 61 72 20 2a 7a 43 6f 6f 6b 69 65  ic char *zCookie
2510: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
2520: 43 6f 6f 6b 69 65 73 20 72 65 70 6f 72 74 65 64  Cookies reported
2530: 20 77 69 74 68 20 74 68 65 20 72 65 71 75 65 73   with the reques
2540: 74 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  t */.static char
2550: 20 2a 7a 48 74 74 70 48 6f 73 74 20 3d 20 30 3b   *zHttpHost = 0;
2560: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 61 63        /* Name ac
2570: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 77  cording to the w
2580: 65 62 20 62 72 6f 77 73 65 72 20 2a 2f 0a 73 74  eb browser */.st
2590: 61 74 69 63 20 63 68 61 72 20 2a 7a 52 65 61 6c  atic char *zReal
25a0: 50 6f 72 74 20 3d 20 30 3b 20 20 20 20 20 20 2f  Port = 0;      /
25b0: 2a 20 54 68 65 20 72 65 61 6c 20 54 43 50 20 70  * The real TCP p
25c0: 6f 72 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67  ort when running
25d0: 20 61 73 20 64 61 65 6d 6f 6e 20 2a 2f 0a 73 74   as daemon */.st
25e0: 61 74 69 63 20 63 68 61 72 20 2a 7a 52 65 6d 6f  atic char *zRemo
25f0: 74 65 41 64 64 72 20 3d 20 30 3b 20 20 20 20 2f  teAddr = 0;    /
2600: 2a 20 49 50 20 61 64 64 72 65 73 73 20 6f 66 20  * IP address of 
2610: 74 68 65 20 72 65 71 75 65 73 74 20 2a 2f 0a 73  the request */.s
2620: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 52 65 66  tatic char *zRef
2630: 65 72 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  erer = 0;       
2640: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70  /* Name of the p
2650: 61 67 65 20 74 68 61 74 20 72 65 66 65 72 65 64  age that refered
2660: 20 74 6f 20 75 73 20 2a 2f 0a 73 74 61 74 69 63   to us */.static
2670: 20 63 68 61 72 20 2a 7a 41 63 63 65 70 74 20 3d   char *zAccept =
2680: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 68   0;        /* Wh
2690: 61 74 20 66 6f 72 6d 61 74 73 20 77 69 6c 6c 20  at formats will 
26a0: 62 65 20 61 63 63 65 70 74 65 64 20 2a 2f 0a 73  be accepted */.s
26b0: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 43 6f 6e  tatic char *zCon
26c0: 74 65 6e 74 4c 65 6e 67 74 68 20 3d 20 30 3b 20  tentLength = 0; 
26d0: 2f 2a 20 43 6f 6e 74 65 6e 74 20 6c 65 6e 67 74  /* Content lengt
26e0: 68 20 72 65 70 6f 72 74 65 64 20 69 6e 20 74 68  h reported in th
26f0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 73 74 61 74  e header */.stat
2700: 69 63 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e  ic char *zConten
2710: 74 54 79 70 65 20 3d 20 30 3b 20 20 20 2f 2a 20  tType = 0;   /* 
2720: 43 6f 6e 74 65 6e 74 20 74 79 70 65 20 72 65 70  Content type rep
2730: 6f 72 74 65 64 20 69 6e 20 74 68 65 20 68 65 61  orted in the hea
2740: 64 65 72 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  der */.static ch
2750: 61 72 20 2a 7a 51 75 65 72 79 53 75 66 66 69 78  ar *zQuerySuffix
2760: 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 70   = 0;   /* The p
2770: 61 72 74 20 6f 66 20 74 68 65 20 55 52 4c 20 61  art of the URL a
2780: 66 74 65 72 20 74 68 65 20 66 69 72 73 74 20 3f  fter the first ?
2790: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
27a0: 2a 7a 41 75 74 68 54 79 70 65 20 3d 20 30 3b 20  *zAuthType = 0; 
27b0: 20 20 20 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a       /* Authoriz
27c0: 61 74 69 6f 6e 20 74 79 70 65 20 28 62 61 73 69  ation type (basi
27d0: 63 20 6f 72 20 64 69 67 65 73 74 29 20 2a 2f 0a  c or digest) */.
27e0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 41 75  static char *zAu
27f0: 74 68 41 72 67 20 3d 20 30 3b 20 20 20 20 20 20  thArg = 0;      
2800: 20 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74 69 6f   /* Authorizatio
2810: 6e 20 76 61 6c 75 65 73 20 2a 2f 0a 73 74 61 74  n values */.stat
2820: 69 63 20 63 68 61 72 20 2a 7a 52 65 6d 6f 74 65  ic char *zRemote
2830: 55 73 65 72 20 3d 20 30 3b 20 20 20 20 2f 2a 20  User = 0;    /* 
2840: 52 45 4d 4f 54 45 5f 55 53 45 52 20 73 65 74 20  REMOTE_USER set 
2850: 62 79 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  by authorization
2860: 20 6d 6f 64 75 6c 65 20 2a 2f 0a 73 74 61 74 69   module */.stati
2870: 63 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 20 20  c int nIn = 0;  
2880: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2890: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
28a0: 66 20 69 6e 70 75 74 20 2a 2f 0a 73 74 61 74 69  f input */.stati
28b0: 63 20 69 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 20  c int nOut = 0; 
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
28d0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
28e0: 66 20 6f 75 74 70 75 74 20 2a 2f 0a 73 74 61 74  f output */.stat
28f0: 69 63 20 63 68 61 72 20 7a 52 65 70 6c 79 53 74  ic char zReplySt
2900: 61 74 75 73 5b 34 5d 3b 20 20 20 20 20 2f 2a 20  atus[4];     /* 
2910: 52 65 70 6c 79 20 73 74 61 74 75 73 20 63 6f 64  Reply status cod
2920: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
2930: 73 74 61 74 75 73 53 65 6e 74 20 3d 20 30 3b 20  statusSent = 0; 
2940: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 61 66        /* True af
2950: 74 65 72 20 73 74 61 74 75 73 20 6c 69 6e 65 20  ter status line 
2960: 69 73 20 73 65 6e 74 20 2a 2f 0a 73 74 61 74 69  is sent */.stati
2970: 63 20 63 68 61 72 20 2a 7a 4c 6f 67 46 69 6c 65  c char *zLogFile
2980: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4c   = 0;       /* L
2990: 6f 67 20 74 6f 20 74 68 69 73 20 66 69 6c 65 20  og to this file 
29a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
29b0: 62 75 67 46 6c 61 67 20 3d 20 30 3b 20 20 20 20  bugFlag = 0;    
29c0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 62      /* True if b
29d0: 65 69 6e 67 20 64 65 62 75 67 67 65 64 20 2a 2f  eing debugged */
29e0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 74  .static struct t
29f0: 69 6d 65 76 61 6c 20 62 65 67 69 6e 54 69 6d 65  imeval beginTime
2a00: 3b 20 2f 2a 20 54 69 6d 65 20 77 68 65 6e 20 74  ; /* Time when t
2a10: 68 69 73 20 70 72 6f 63 65 73 73 20 73 74 61 72  his process star
2a20: 74 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ts */.static int
2a30: 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e   closeConnection
2a40: 20 3d 20 30 3b 20 20 2f 2a 20 54 72 75 65 20 74   = 0;  /* True t
2a50: 6f 20 73 65 6e 64 20 43 6f 6e 6e 65 63 74 69 6f  o send Connectio
2a60: 6e 3a 20 63 6c 6f 73 65 20 69 6e 20 72 65 70 6c  n: close in repl
2a70: 79 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  y */.static int 
2a80: 6e 52 65 71 75 65 73 74 20 3d 20 30 3b 20 20 20  nRequest = 0;   
2a90: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2aa0: 6f 66 20 72 65 71 75 65 73 74 73 20 70 72 6f 63  of requests proc
2ab0: 65 73 73 65 64 20 2a 2f 0a 73 74 61 74 69 63 20  essed */.static 
2ac0: 69 6e 74 20 6f 6d 69 74 4c 6f 67 20 3d 20 30 3b  int omitLog = 0;
2ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
2ae0: 6e 6f 74 20 6d 61 6b 65 20 6c 6f 67 66 69 6c 65  not make logfile
2af0: 20 65 6e 74 72 69 65 73 20 69 66 20 74 72 75 65   entries if true
2b00: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75   */.static int u
2b10: 73 65 48 74 74 70 73 20 3d 20 30 3b 20 20 20 20  seHttps = 0;    
2b20: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
2b30: 75 73 65 20 48 54 54 50 53 3a 20 69 6e 73 74 65  use HTTPS: inste
2b40: 61 64 20 6f 66 20 48 54 54 50 3a 20 2a 2f 0a 73  ad of HTTP: */.s
2b50: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 48 74 74  tatic char *zHtt
2b60: 70 20 3d 20 22 68 74 74 70 22 3b 20 20 20 20 20  p = "http";     
2b70: 2f 2a 20 68 74 74 70 20 6f 72 20 68 74 74 70 73  /* http or https
2b80: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75   */.static int u
2b90: 73 65 54 69 6d 65 6f 75 74 20 3d 20 31 3b 20 20  seTimeout = 1;  
2ba0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
2bb0: 75 73 65 20 74 69 6d 65 73 20 2a 2f 0a 73 74 61  use times */.sta
2bc0: 74 69 63 20 69 6e 74 20 73 74 61 6e 64 61 6c 6f  tic int standalo
2bd0: 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ne = 0;       /*
2be0: 20 52 75 6e 20 61 73 20 61 20 73 74 61 6e 64 61   Run as a standa
2bf0: 6c 6f 6e 65 20 73 65 72 76 65 72 20 28 6e 6f 20  lone server (no 
2c00: 69 6e 65 74 64 29 20 2a 2f 0a 73 74 61 74 69 63  inetd) */.static
2c10: 20 69 6e 74 20 69 70 76 36 4f 6e 6c 79 20 3d 20   int ipv6Only = 
2c20: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73  0;         /* Us
2c30: 65 20 49 50 76 36 20 6f 6e 6c 79 20 2a 2f 0a 73  e IPv6 only */.s
2c40: 74 61 74 69 63 20 69 6e 74 20 69 70 76 34 4f 6e  tatic int ipv4On
2c50: 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ly = 0;         
2c60: 2f 2a 20 55 73 65 20 49 50 76 34 20 6f 6e 6c 79  /* Use IPv4 only
2c70: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
2c80: 74 20 72 75 73 61 67 65 20 70 72 69 6f 72 53 65  t rusage priorSe
2c90: 6c 66 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73  lf;  /* Previous
2ca0: 6c 79 20 72 65 70 6f 72 74 20 53 45 4c 46 20 74  ly report SELF t
2cb0: 69 6d 65 20 2a 2f 0a 73 74 61 74 69 63 20 73 74  ime */.static st
2cc0: 72 75 63 74 20 72 75 73 61 67 65 20 70 72 69 6f  ruct rusage prio
2cd0: 72 43 68 69 6c 64 3b 20 2f 2a 20 50 72 65 76 69  rChild; /* Previ
2ce0: 6f 75 73 6c 79 20 72 65 70 6f 72 74 20 43 48 49  ously report CHI
2cf0: 4c 44 20 74 69 6d 65 20 2a 2f 0a 0a 2f 2a 0a 2a  LD time */../*.*
2d00: 2a 20 44 6f 75 62 6c 65 20 61 6e 79 20 64 6f 75  * Double any dou
2d10: 62 6c 65 2d 71 75 6f 74 65 20 63 68 61 72 61 63  ble-quote charac
2d20: 74 65 72 73 20 69 6e 20 61 20 73 74 72 69 6e 67  ters in a string
2d30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
2d40: 20 2a 45 73 63 61 70 65 28 63 68 61 72 20 2a 7a   *Escape(char *z
2d50: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
2d60: 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20 63   int n;.  char c
2d70: 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a  ;.  char *zOut;.
2d80: 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 3d 7a 5b    for(i=0; (c=z[
2d90: 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 22 27  i])!=0 && c!='"'
2da0: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 63  ; i++){}.  if( c
2db0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 3b 0a  ==0 ) return z;.
2dc0: 20 20 6e 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69    n = 1;.  for(i
2dd0: 2b 2b 3b 20 28 63 3d 7a 5b 69 5d 29 21 3d 30 3b  ++; (c=z[i])!=0;
2de0: 20 69 2b 2b 29 7b 20 69 66 28 20 63 3d 3d 27 22   i++){ if( c=='"
2df0: 27 20 29 20 6e 2b 2b 3b 20 7d 0a 20 20 7a 4f 75  ' ) n++; }.  zOu
2e00: 74 20 3d 20 6d 61 6c 6c 6f 63 28 20 69 2b 6e 2b  t = malloc( i+n+
2e10: 31 20 29 3b 0a 20 20 69 66 28 20 7a 4f 75 74 3d  1 );.  if( zOut=
2e20: 3d 30 20 29 20 72 65 74 75 72 6e 20 22 22 3b 0a  =0 ) return "";.
2e30: 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63 3d    for(i=j=0; (c=
2e40: 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a  z[i])!=0; i++){.
2e50: 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20      zOut[j++] = 
2e60: 63 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 22  c;.    if( c=='"
2e70: 27 20 29 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20  ' ) zOut[j++] = 
2e80: 63 3b 0a 20 20 7d 0a 20 20 7a 4f 75 74 5b 6a 5d  c;.  }.  zOut[j]
2e90: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a   = 0;.  return z
2ea0: 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  Out;.}../*.** Co
2eb0: 6e 76 65 72 74 20 61 20 73 74 72 75 63 74 20 74  nvert a struct t
2ec0: 69 6d 65 76 61 6c 20 69 6e 74 6f 20 61 6e 20 69  imeval into an i
2ed0: 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66  nteger number of
2ee0: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 0a 2a 2f   milliseconds.*/
2ef0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 76 6d 73  .static int tvms
2f00: 28 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20  (struct timeval 
2f10: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 69  *p){.  return (i
2f20: 6e 74 29 28 70 2d 3e 74 76 5f 73 65 63 2a 31 30  nt)(p->tv_sec*10
2f30: 30 30 30 30 30 20 2b 20 70 2d 3e 74 76 5f 75 73  00000 + p->tv_us
2f40: 65 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ec);.}../*.** Ma
2f50: 6b 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  ke an entry in t
2f60: 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 20 49 66  he log file.  If
2f70: 20 74 68 65 20 48 54 54 50 20 63 6f 6e 6e 65 63   the HTTP connec
2f80: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 0a 2a  tion should be.*
2f90: 2a 20 63 6c 6f 73 65 64 2c 20 74 68 65 6e 20 74  * closed, then t
2fa0: 65 72 6d 69 6e 61 74 65 20 74 68 69 73 20 70 72  erminate this pr
2fb0: 6f 63 65 73 73 2e 20 20 4f 74 68 65 72 77 69 73  ocess.  Otherwis
2fc0: 65 20 72 65 74 75 72 6e 2e 0a 2a 2f 0a 73 74 61  e return..*/.sta
2fd0: 74 69 63 20 76 6f 69 64 20 4d 61 6b 65 4c 6f 67  tic void MakeLog
2fe0: 45 6e 74 72 79 28 69 6e 74 20 65 78 69 74 43 6f  Entry(int exitCo
2ff0: 64 65 2c 20 69 6e 74 20 6c 69 6e 65 4e 75 6d 29  de, int lineNum)
3000: 7b 0a 20 20 46 49 4c 45 20 2a 6c 6f 67 3b 0a 20  {.  FILE *log;. 
3010: 20 69 66 28 20 7a 54 6d 70 4e 61 6d 20 29 7b 0a   if( zTmpNam ){.
3020: 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 54 6d 70 4e      unlink(zTmpN
3030: 61 6d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  am);.  }.  if( z
3040: 4c 6f 67 46 69 6c 65 20 26 26 20 21 6f 6d 69 74  LogFile && !omit
3050: 4c 6f 67 20 29 7b 0a 20 20 20 20 73 74 72 75 63  Log ){.    struc
3060: 74 20 74 69 6d 65 76 61 6c 20 6e 6f 77 3b 0a 20  t timeval now;. 
3070: 20 20 20 73 74 72 75 63 74 20 74 6d 20 2a 70 54     struct tm *pT
3080: 6d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 72 75  m;.    struct ru
3090: 73 61 67 65 20 73 65 6c 66 2c 20 63 68 69 6c 64  sage self, child
30a0: 72 65 6e 3b 0a 20 20 20 20 69 6e 74 20 77 61 69  ren;.    int wai
30b0: 74 53 74 61 74 75 73 3b 0a 20 20 20 20 63 68 61  tStatus;.    cha
30c0: 72 20 7a 44 61 74 65 5b 32 30 30 5d 3b 0a 20 20  r zDate[200];.  
30d0: 20 20 63 68 61 72 20 2a 7a 52 4d 20 3d 20 7a 52    char *zRM = zR
30e0: 65 6d 6f 74 65 55 73 65 72 20 3f 20 7a 52 65 6d  emoteUser ? zRem
30f0: 6f 74 65 55 73 65 72 20 3a 20 22 22 3b 0a 0a 20  oteUser : "";.. 
3100: 20 20 20 69 66 28 20 7a 53 63 72 69 70 74 3d 3d     if( zScript==
3110: 30 20 29 20 7a 53 63 72 69 70 74 20 3d 20 22 22  0 ) zScript = ""
3120: 3b 0a 20 20 20 20 69 66 28 20 7a 52 65 61 6c 53  ;.    if( zRealS
3130: 63 72 69 70 74 3d 3d 30 20 29 20 7a 52 65 61 6c  cript==0 ) zReal
3140: 53 63 72 69 70 74 20 3d 20 22 22 3b 0a 20 20 20  Script = "";.   
3150: 20 69 66 28 20 7a 52 65 6d 6f 74 65 41 64 64 72   if( zRemoteAddr
3160: 3d 3d 30 20 29 20 7a 52 65 6d 6f 74 65 41 64 64  ==0 ) zRemoteAdd
3170: 72 20 3d 20 22 22 3b 0a 20 20 20 20 69 66 28 20  r = "";.    if( 
3180: 7a 48 74 74 70 48 6f 73 74 3d 3d 30 20 29 20 7a  zHttpHost==0 ) z
3190: 48 74 74 70 48 6f 73 74 20 3d 20 22 22 3b 0a 20  HttpHost = "";. 
31a0: 20 20 20 69 66 28 20 7a 52 65 66 65 72 65 72 3d     if( zReferer=
31b0: 3d 30 20 29 20 7a 52 65 66 65 72 65 72 20 3d 20  =0 ) zReferer = 
31c0: 22 22 3b 0a 20 20 20 20 69 66 28 20 7a 41 67 65  "";.    if( zAge
31d0: 6e 74 3d 3d 30 20 29 20 7a 41 67 65 6e 74 20 3d  nt==0 ) zAgent =
31e0: 20 22 22 3b 0a 20 20 20 20 67 65 74 74 69 6d 65   "";.    gettime
31f0: 6f 66 64 61 79 28 26 6e 6f 77 2c 20 30 29 3b 0a  ofday(&now, 0);.
3200: 20 20 20 20 70 54 6d 20 3d 20 6c 6f 63 61 6c 74      pTm = localt
3210: 69 6d 65 28 26 6e 6f 77 2e 74 76 5f 73 65 63 29  ime(&now.tv_sec)
3220: 3b 0a 20 20 20 20 73 74 72 66 74 69 6d 65 28 7a  ;.    strftime(z
3230: 44 61 74 65 2c 20 73 69 7a 65 6f 66 28 7a 44 61  Date, sizeof(zDa
3240: 74 65 29 2c 20 22 25 59 2d 25 6d 2d 25 64 20 25  te), "%Y-%m-%d %
3250: 48 3a 25 4d 3a 25 53 22 2c 20 70 54 6d 29 3b 0a  H:%M:%S", pTm);.
3260: 20 20 20 20 77 61 69 74 70 69 64 28 2d 31 2c 20      waitpid(-1, 
3270: 26 77 61 69 74 53 74 61 74 75 73 2c 20 57 4e 4f  &waitStatus, WNO
3280: 48 41 4e 47 29 3b 0a 20 20 20 20 67 65 74 72 75  HANG);.    getru
3290: 73 61 67 65 28 52 55 53 41 47 45 5f 53 45 4c 46  sage(RUSAGE_SELF
32a0: 2c 20 26 73 65 6c 66 29 3b 0a 20 20 20 20 67 65  , &self);.    ge
32b0: 74 72 75 73 61 67 65 28 52 55 53 41 47 45 5f 43  trusage(RUSAGE_C
32c0: 48 49 4c 44 52 45 4e 2c 20 26 63 68 69 6c 64 72  HILDREN, &childr
32d0: 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 28 6c 6f  en);.    if( (lo
32e0: 67 20 3d 20 66 6f 70 65 6e 28 7a 4c 6f 67 46 69  g = fopen(zLogFi
32f0: 6c 65 2c 22 61 22 29 29 21 3d 30 20 29 7b 0a 23  le,"a"))!=0 ){.#
3300: 69 66 64 65 66 20 43 4f 4d 42 49 4e 45 44 5f 4c  ifdef COMBINED_L
3310: 4f 47 5f 46 4f 52 4d 41 54 0a 20 20 20 20 20 20  OG_FORMAT.      
3320: 73 74 72 66 74 69 6d 65 28 7a 44 61 74 65 2c 20  strftime(zDate, 
3330: 73 69 7a 65 6f 66 28 7a 44 61 74 65 29 2c 20 22  sizeof(zDate), "
3340: 25 64 2f 25 62 2f 25 59 3a 25 48 3a 25 4d 3a 25  %d/%b/%Y:%H:%M:%
3350: 53 20 25 7a 22 2c 20 70 54 6d 29 3b 0a 20 20 20  S %z", pTm);.   
3360: 20 20 20 66 70 72 69 6e 74 66 28 6c 6f 67 2c 20     fprintf(log, 
3370: 22 25 73 20 2d 20 2d 20 5b 25 73 5d 20 5c 22 25  "%s - - [%s] \"%
3380: 73 20 25 73 20 25 73 5c 22 20 25 73 20 25 64 20  s %s %s\" %s %d 
3390: 5c 22 25 73 5c 22 20 5c 22 25 73 5c 22 5c 6e 22  \"%s\" \"%s\"\n"
33a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
33b0: 7a 52 65 6d 6f 74 65 41 64 64 72 2c 20 7a 44 61  zRemoteAddr, zDa
33c0: 74 65 2c 20 7a 4d 65 74 68 6f 64 2c 20 7a 53 63  te, zMethod, zSc
33d0: 72 69 70 74 2c 20 7a 50 72 6f 74 6f 63 6f 6c 2c  ript, zProtocol,
33e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  .              z
33f0: 52 65 70 6c 79 53 74 61 74 75 73 2c 20 6e 4f 75  ReplyStatus, nOu
3400: 74 2c 20 7a 52 65 66 65 72 65 72 2c 20 7a 41 67  t, zReferer, zAg
3410: 65 6e 74 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ent);.#else.    
3420: 20 20 73 74 72 66 74 69 6d 65 28 7a 44 61 74 65    strftime(zDate
3430: 2c 20 73 69 7a 65 6f 66 28 7a 44 61 74 65 29 2c  , sizeof(zDate),
3440: 20 22 25 59 2d 25 6d 2d 25 64 20 25 48 3a 25 4d   "%Y-%m-%d %H:%M
3450: 3a 25 53 22 2c 20 70 54 6d 29 3b 0a 20 20 20 20  :%S", pTm);.    
3460: 20 20 2f 2a 20 4c 6f 67 20 72 65 63 6f 72 64 20    /* Log record 
3470: 66 69 6c 65 73 3a 0a 20 20 20 20 20 20 2a 2a 20  files:.      ** 
3480: 20 28 31 29 20 44 61 74 65 20 61 6e 64 20 74 69   (1) Date and ti
3490: 6d 65 0a 20 20 20 20 20 20 2a 2a 20 20 28 32 29  me.      **  (2)
34a0: 20 49 50 20 61 64 64 72 65 73 73 0a 20 20 20 20   IP address.    
34b0: 20 20 2a 2a 20 20 28 33 29 20 55 52 4c 20 62 65    **  (3) URL be
34c0: 69 6e 67 20 61 63 63 65 73 73 65 64 0a 20 20 20  ing accessed.   
34d0: 20 20 20 2a 2a 20 20 28 34 29 20 52 65 66 65 72     **  (4) Refer
34e0: 65 72 0a 20 20 20 20 20 20 2a 2a 20 20 28 35 29  er.      **  (5)
34f0: 20 52 65 70 6c 79 20 73 74 61 74 75 73 0a 20 20   Reply status.  
3500: 20 20 20 20 2a 2a 20 20 28 36 29 20 42 79 74 65      **  (6) Byte
3510: 73 20 72 65 63 65 69 76 65 64 0a 20 20 20 20 20  s received.     
3520: 20 2a 2a 20 20 28 37 29 20 42 79 74 65 73 20 73   **  (7) Bytes s
3530: 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 20 28 38  ent.      **  (8
3540: 29 20 53 65 6c 66 20 75 73 65 72 20 74 69 6d 65  ) Self user time
3550: 0a 20 20 20 20 20 20 2a 2a 20 20 28 39 29 20 53  .      **  (9) S
3560: 65 6c 66 20 73 79 73 74 65 6d 20 74 69 6d 65 0a  elf system time.
3570: 20 20 20 20 20 20 2a 2a 20 28 31 30 29 20 43 68        ** (10) Ch
3580: 69 6c 64 72 65 6e 20 75 73 65 72 20 74 69 6d 65  ildren user time
3590: 0a 20 20 20 20 20 20 2a 2a 20 28 31 31 29 20 43  .      ** (11) C
35a0: 68 69 6c 64 72 65 6e 20 73 79 73 74 65 6d 20 74  hildren system t
35b0: 69 6d 65 0a 20 20 20 20 20 20 2a 2a 20 28 31 32  ime.      ** (12
35c0: 29 20 54 6f 74 61 6c 20 77 61 6c 6c 2d 63 6c 6f  ) Total wall-clo
35d0: 63 6b 20 74 69 6d 65 0a 20 20 20 20 20 20 2a 2a  ck time.      **
35e0: 20 28 31 33 29 20 52 65 71 75 65 73 74 20 6e 75   (13) Request nu
35f0: 6d 62 65 72 20 66 6f 72 20 73 61 6d 65 20 54 43  mber for same TC
3600: 50 2f 49 50 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  P/IP connection.
3610: 20 20 20 20 20 20 2a 2a 20 28 31 34 29 20 55 73        ** (14) Us
3620: 65 72 20 61 67 65 6e 74 0a 20 20 20 20 20 20 2a  er agent.      *
3630: 2a 20 28 31 35 29 20 52 65 6d 6f 74 65 20 75 73  * (15) Remote us
3640: 65 72 0a 20 20 20 20 20 20 2a 2a 20 28 31 36 29  er.      ** (16)
3650: 20 42 79 74 65 73 20 6f 66 20 55 52 4c 20 74 68   Bytes of URL th
3660: 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  at correspond to
3670: 20 74 68 65 20 53 43 52 49 50 54 5f 4e 41 4d 45   the SCRIPT_NAME
3680: 0a 20 20 20 20 20 20 2a 2a 20 28 31 37 29 20 4c  .      ** (17) L
3690: 69 6e 65 20 6e 75 6d 62 65 72 20 69 6e 20 73 6f  ine number in so
36a0: 75 72 63 65 20 66 69 6c 65 0a 20 20 20 20 20 20  urce file.      
36b0: 2a 2f 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  */.      fprintf
36c0: 28 6c 6f 67 2c 0a 20 20 20 20 20 20 20 20 22 25  (log,.        "%
36d0: 73 2c 25 73 2c 5c 22 25 73 3a 2f 2f 25 73 25 73  s,%s,\"%s://%s%s
36e0: 5c 22 2c 5c 22 25 73 5c 22 2c 22 0a 20 20 20 20  \",\"%s\",".    
36f0: 20 20 20 20 20 20 20 22 25 73 2c 25 64 2c 25 64         "%s,%d,%d
3700: 2c 25 64 2c 25 64 2c 25 64 2c 25 64 2c 25 64 2c  ,%d,%d,%d,%d,%d,
3710: 25 64 2c 5c 22 25 73 5c 22 2c 5c 22 25 73 5c 22  %d,\"%s\",\"%s\"
3720: 2c 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ,%d,%d\n",.     
3730: 20 20 20 7a 44 61 74 65 2c 20 7a 52 65 6d 6f 74     zDate, zRemot
3740: 65 41 64 64 72 2c 20 7a 48 74 74 70 2c 20 45 73  eAddr, zHttp, Es
3750: 63 61 70 65 28 7a 48 74 74 70 48 6f 73 74 29 2c  cape(zHttpHost),
3760: 20 45 73 63 61 70 65 28 7a 53 63 72 69 70 74 29   Escape(zScript)
3770: 2c 0a 20 20 20 20 20 20 20 20 45 73 63 61 70 65  ,.        Escape
3780: 28 7a 52 65 66 65 72 65 72 29 2c 20 7a 52 65 70  (zReferer), zRep
3790: 6c 79 53 74 61 74 75 73 2c 20 6e 49 6e 2c 20 6e  lyStatus, nIn, n
37a0: 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 74 76 6d  Out,.        tvm
37b0: 73 28 26 73 65 6c 66 2e 72 75 5f 75 74 69 6d 65  s(&self.ru_utime
37c0: 29 20 2d 20 74 76 6d 73 28 26 70 72 69 6f 72 53  ) - tvms(&priorS
37d0: 65 6c 66 2e 72 75 5f 75 74 69 6d 65 29 2c 0a 20  elf.ru_utime),. 
37e0: 20 20 20 20 20 20 20 74 76 6d 73 28 26 73 65 6c         tvms(&sel
37f0: 66 2e 72 75 5f 73 74 69 6d 65 29 20 2d 20 74 76  f.ru_stime) - tv
3800: 6d 73 28 26 70 72 69 6f 72 53 65 6c 66 2e 72 75  ms(&priorSelf.ru
3810: 5f 73 74 69 6d 65 29 2c 0a 20 20 20 20 20 20 20  _stime),.       
3820: 20 74 76 6d 73 28 26 63 68 69 6c 64 72 65 6e 2e   tvms(&children.
3830: 72 75 5f 75 74 69 6d 65 29 20 2d 20 74 76 6d 73  ru_utime) - tvms
3840: 28 26 70 72 69 6f 72 43 68 69 6c 64 2e 72 75 5f  (&priorChild.ru_
3850: 75 74 69 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  utime),.        
3860: 74 76 6d 73 28 26 63 68 69 6c 64 72 65 6e 2e 72  tvms(&children.r
3870: 75 5f 73 74 69 6d 65 29 20 2d 20 74 76 6d 73 28  u_stime) - tvms(
3880: 26 70 72 69 6f 72 43 68 69 6c 64 2e 72 75 5f 73  &priorChild.ru_s
3890: 74 69 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 74  time),.        t
38a0: 76 6d 73 28 26 6e 6f 77 29 20 2d 20 74 76 6d 73  vms(&now) - tvms
38b0: 28 26 62 65 67 69 6e 54 69 6d 65 29 2c 0a 20 20  (&beginTime),.  
38c0: 20 20 20 20 20 20 6e 52 65 71 75 65 73 74 2c 20        nRequest, 
38d0: 45 73 63 61 70 65 28 7a 41 67 65 6e 74 29 2c 20  Escape(zAgent), 
38e0: 45 73 63 61 70 65 28 7a 52 4d 29 2c 0a 20 20 20  Escape(zRM),.   
38f0: 20 20 20 20 20 28 69 6e 74 29 28 73 74 72 6c 65       (int)(strle
3900: 6e 28 7a 48 74 74 70 29 2b 73 74 72 6c 65 6e 28  n(zHttp)+strlen(
3910: 7a 48 74 74 70 48 6f 73 74 29 2b 73 74 72 6c 65  zHttpHost)+strle
3920: 6e 28 7a 52 65 61 6c 53 63 72 69 70 74 29 2b 33  n(zRealScript)+3
3930: 29 2c 0a 20 20 20 20 20 20 20 20 6c 69 6e 65 4e  ),.        lineN
3940: 75 6d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  um.      );.    
3950: 20 20 70 72 69 6f 72 53 65 6c 66 20 3d 20 73 65    priorSelf = se
3960: 6c 66 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 43  lf;.      priorC
3970: 68 69 6c 64 20 3d 20 63 68 69 6c 64 72 65 6e 3b  hild = children;
3980: 0a 20 20 20 20 20 20 62 65 67 69 6e 54 69 6d 65  .      beginTime
3990: 20 3d 20 6e 6f 77 3b 0a 23 65 6e 64 69 66 0a 20   = now;.#endif. 
39a0: 20 20 20 20 20 66 63 6c 6f 73 65 28 6c 6f 67 29       fclose(log)
39b0: 3b 0a 20 20 20 20 20 20 6e 49 6e 20 3d 20 6e 4f  ;.      nIn = nO
39c0: 75 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ut = 0;.    }.  
39d0: 7d 0a 20 20 69 66 28 20 63 6c 6f 73 65 43 6f 6e  }.  if( closeCon
39e0: 6e 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 65  nection ){.    e
39f0: 78 69 74 28 65 78 69 74 43 6f 64 65 29 3b 0a 20  xit(exitCode);. 
3a00: 20 7d 0a 20 20 73 74 61 74 75 73 53 65 6e 74 20   }.  statusSent 
3a10: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  = 0;.}../*.** Al
3a20: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 73 61  locate memory sa
3a30: 66 65 6c 79 0a 2a 2f 0a 73 74 61 74 69 63 20 63  fely.*/.static c
3a40: 68 61 72 20 2a 53 61 66 65 4d 61 6c 6c 6f 63 28  har *SafeMalloc(
3a50: 20 69 6e 74 20 73 69 7a 65 20 29 7b 0a 20 20 63   int size ){.  c
3a60: 68 61 72 20 2a 70 3b 0a 0a 20 20 70 20 3d 20 28  har *p;..  p = (
3a70: 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 73 69 7a  char*)malloc(siz
3a80: 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  e);.  if( p==0 )
3a90: 7b 0a 20 20 20 20 73 74 72 63 70 79 28 7a 52 65  {.    strcpy(zRe
3aa0: 70 6c 79 53 74 61 74 75 73 2c 20 22 39 39 38 22  plyStatus, "998"
3ab0: 29 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e  );.    MakeLogEn
3ac0: 74 72 79 28 31 2c 5f 5f 4c 49 4e 45 5f 5f 29 3b  try(1,__LINE__);
3ad0: 20 20 2f 2a 20 4c 4f 47 3a 20 4d 61 6c 6c 6f 63    /* LOG: Malloc
3ae0: 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  () failed */.   
3af0: 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20   exit(1);.  }.  
3b00: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
3b10: 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
3b20: 20 6f 66 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20   of environment 
3b30: 76 61 72 69 61 62 6c 65 20 7a 56 61 72 20 74 6f  variable zVar to
3b40: 20 7a 56 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74   zValue..*/.stat
3b50: 69 63 20 76 6f 69 64 20 53 65 74 45 6e 76 28 63  ic void SetEnv(c
3b60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 72 2c  onst char *zVar,
3b70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61   const char *zVa
3b80: 6c 75 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b  lue){.  char *z;
3b90: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 66  .  int len;.  if
3ba0: 28 20 7a 56 61 6c 75 65 3d 3d 30 20 29 20 7a 56  ( zValue==0 ) zV
3bb0: 61 6c 75 65 3d 22 22 3b 0a 20 20 2f 2a 20 44 69  alue="";.  /* Di
3bc0: 73 61 62 6c 65 20 61 6e 20 61 74 74 65 6d 70 74  sable an attempt
3bd0: 65 64 20 62 61 73 68 64 6f 6f 72 20 61 74 74 61  ed bashdoor atta
3be0: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 73 74 72 6e  ck */.  if( strn
3bf0: 63 6d 70 28 7a 56 61 6c 75 65 2c 22 28 29 20 7b  cmp(zValue,"() {
3c00: 22 2c 34 29 3d 3d 30 20 29 20 7a 56 61 6c 75 65  ",4)==0 ) zValue
3c10: 20 3d 20 22 22 3b 0a 20 20 6c 65 6e 20 3d 20 73   = "";.  len = s
3c20: 74 72 6c 65 6e 28 7a 56 61 72 29 20 2b 20 73 74  trlen(zVar) + st
3c30: 72 6c 65 6e 28 7a 56 61 6c 75 65 29 20 2b 20 32  rlen(zValue) + 2
3c40: 3b 0a 20 20 7a 20 3d 20 53 61 66 65 4d 61 6c 6c  ;.  z = SafeMall
3c50: 6f 63 28 6c 65 6e 29 3b 0a 20 20 73 70 72 69 6e  oc(len);.  sprin
3c60: 74 66 28 7a 2c 22 25 73 3d 25 73 22 2c 7a 56 61  tf(z,"%s=%s",zVa
3c70: 72 2c 7a 56 61 6c 75 65 29 3b 0a 20 20 70 75 74  r,zValue);.  put
3c80: 65 6e 76 28 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  env(z);.}../*.**
3c90: 20 52 65 6d 6f 76 65 20 74 68 65 20 66 69 72 73   Remove the firs
3ca0: 74 20 73 70 61 63 65 2d 64 65 6c 69 6d 69 74 65  t space-delimite
3cb0: 64 20 74 6f 6b 65 6e 20 66 72 6f 6d 20 61 20 73  d token from a s
3cc0: 74 72 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  tring and return
3cd0: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
3ce0: 20 69 74 2e 20 20 41 64 64 20 61 20 4e 55 4c 4c   it.  Add a NULL
3cf0: 20 74 6f 20 74 68 65 20 73 74 72 69 6e 67 20 74   to the string t
3d00: 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
3d10: 74 6f 6b 65 6e 2e 0a 2a 2a 20 4d 61 6b 65 20 2a  token..** Make *
3d20: 7a 4c 65 66 74 4f 76 65 72 20 70 6f 69 6e 74 20  zLeftOver point 
3d30: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
3d40: 74 68 65 20 6e 65 78 74 20 74 6f 6b 65 6e 2e 0a  the next token..
3d50: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
3d60: 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28  GetFirstElement(
3d70: 63 68 61 72 20 2a 7a 49 6e 70 75 74 2c 20 63 68  char *zInput, ch
3d80: 61 72 20 2a 2a 7a 4c 65 66 74 4f 76 65 72 29 7b  ar **zLeftOver){
3d90: 0a 20 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74  .  char *zResult
3da0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 49 6e 70   = 0;.  if( zInp
3db0: 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ut==0 ){.    if(
3dc0: 20 7a 4c 65 66 74 4f 76 65 72 20 29 20 2a 7a 4c   zLeftOver ) *zL
3dd0: 65 66 74 4f 76 65 72 20 3d 20 30 3b 0a 20 20 20  eftOver = 0;.   
3de0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
3df0: 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28   while( isspace(
3e00: 2a 7a 49 6e 70 75 74 29 20 29 7b 20 7a 49 6e 70  *zInput) ){ zInp
3e10: 75 74 2b 2b 3b 20 7d 0a 20 20 7a 52 65 73 75 6c  ut++; }.  zResul
3e20: 74 20 3d 20 7a 49 6e 70 75 74 3b 0a 20 20 77 68  t = zInput;.  wh
3e30: 69 6c 65 28 20 2a 7a 49 6e 70 75 74 20 26 26 20  ile( *zInput && 
3e40: 21 69 73 73 70 61 63 65 28 2a 7a 49 6e 70 75 74  !isspace(*zInput
3e50: 29 20 29 7b 20 7a 49 6e 70 75 74 2b 2b 3b 20 7d  ) ){ zInput++; }
3e60: 0a 20 20 69 66 28 20 2a 7a 49 6e 70 75 74 20 29  .  if( *zInput )
3e70: 7b 0a 20 20 20 20 2a 7a 49 6e 70 75 74 20 3d 20  {.    *zInput = 
3e80: 30 3b 0a 20 20 20 20 7a 49 6e 70 75 74 2b 2b 3b  0;.    zInput++;
3e90: 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70  .    while( issp
3ea0: 61 63 65 28 2a 7a 49 6e 70 75 74 29 20 29 7b 20  ace(*zInput) ){ 
3eb0: 7a 49 6e 70 75 74 2b 2b 3b 20 7d 0a 20 20 7d 0a  zInput++; }.  }.
3ec0: 20 20 69 66 28 20 7a 4c 65 66 74 4f 76 65 72 20    if( zLeftOver 
3ed0: 29 7b 20 2a 7a 4c 65 66 74 4f 76 65 72 20 3d 20  ){ *zLeftOver = 
3ee0: 7a 49 6e 70 75 74 3b 20 7d 0a 20 20 72 65 74 75  zInput; }.  retu
3ef0: 72 6e 20 7a 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f  rn zResult;.}../
3f00: 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79  *.** Make a copy
3f10: 20 6f 66 20 61 20 73 74 72 69 6e 67 20 69 6e 74   of a string int
3f20: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
3f30: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a  d from malloc..*
3f40: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 53  /.static char *S
3f50: 74 72 44 75 70 28 63 6f 6e 73 74 20 63 68 61 72  trDup(const char
3f60: 20 2a 7a 53 72 63 29 7b 0a 20 20 63 68 61 72 20   *zSrc){.  char 
3f70: 2a 7a 44 65 73 74 3b 0a 20 20 69 6e 74 20 73 69  *zDest;.  int si
3f80: 7a 65 3b 0a 0a 20 20 69 66 28 20 7a 53 72 63 3d  ze;..  if( zSrc=
3f90: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
3fa0: 20 73 69 7a 65 20 3d 20 73 74 72 6c 65 6e 28 7a   size = strlen(z
3fb0: 53 72 63 29 20 2b 20 31 3b 0a 20 20 7a 44 65 73  Src) + 1;.  zDes
3fc0: 74 20 3d 20 28 63 68 61 72 2a 29 53 61 66 65 4d  t = (char*)SafeM
3fd0: 61 6c 6c 6f 63 28 20 73 69 7a 65 20 29 3b 0a 20  alloc( size );. 
3fe0: 20 73 74 72 63 70 79 28 7a 44 65 73 74 2c 7a 53   strcpy(zDest,zS
3ff0: 72 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 44  rc);.  return zD
4000: 65 73 74 3b 0a 7d 0a 73 74 61 74 69 63 20 63 68  est;.}.static ch
4010: 61 72 20 2a 53 74 72 41 70 70 65 6e 64 28 63 68  ar *StrAppend(ch
4020: 61 72 20 2a 7a 50 72 69 6f 72 2c 20 63 6f 6e 73  ar *zPrior, cons
4030: 74 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 63 6f  t char *zSep, co
4040: 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63 29 7b  nst char *zSrc){
4050: 0a 20 20 63 68 61 72 20 2a 7a 44 65 73 74 3b 0a  .  char *zDest;.
4060: 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 69 6e    int size;.  in
4070: 74 20 6e 31 2c 20 6e 32 3b 0a 0a 20 20 69 66 28  t n1, n2;..  if(
4080: 20 7a 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72   zSrc==0 ) retur
4090: 6e 20 30 3b 0a 20 20 69 66 28 20 7a 50 72 69 6f  n 0;.  if( zPrio
40a0: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 74  r==0 ) return St
40b0: 72 44 75 70 28 7a 53 72 63 29 3b 0a 20 20 73 69  rDup(zSrc);.  si
40c0: 7a 65 20 3d 20 28 6e 31 3d 73 74 72 6c 65 6e 28  ze = (n1=strlen(
40d0: 7a 53 72 63 29 29 20 2b 20 28 6e 32 3d 73 74 72  zSrc)) + (n2=str
40e0: 6c 65 6e 28 7a 53 65 70 29 29 20 2b 20 73 74 72  len(zSep)) + str
40f0: 6c 65 6e 28 7a 50 72 69 6f 72 29 20 2b 20 31 3b  len(zPrior) + 1;
4100: 0a 20 20 7a 44 65 73 74 20 3d 20 28 63 68 61 72  .  zDest = (char
4110: 2a 29 53 61 66 65 4d 61 6c 6c 6f 63 28 20 73 69  *)SafeMalloc( si
4120: 7a 65 20 29 3b 0a 20 20 73 74 72 63 70 79 28 7a  ze );.  strcpy(z
4130: 44 65 73 74 2c 7a 50 72 69 6f 72 29 3b 0a 20 20  Dest,zPrior);.  
4140: 66 72 65 65 28 7a 50 72 69 6f 72 29 3b 0a 20 20  free(zPrior);.  
4150: 73 74 72 63 70 79 28 26 7a 44 65 73 74 5b 6e 31  strcpy(&zDest[n1
4160: 5d 2c 7a 53 65 70 29 3b 0a 20 20 73 74 72 63 70  ],zSep);.  strcp
4170: 79 28 26 7a 44 65 73 74 5b 6e 31 2b 6e 32 5d 2c  y(&zDest[n1+n2],
4180: 7a 53 72 63 29 3b 0a 20 20 72 65 74 75 72 6e 20  zSrc);.  return 
4190: 7a 44 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zDest;.}../*.** 
41a0: 42 72 65 61 6b 20 61 20 6c 69 6e 65 20 61 74 20  Break a line at 
41b0: 74 68 65 20 66 69 72 73 74 20 5c 6e 20 6f 72 20  the first \n or 
41c0: 5c 72 20 63 68 61 72 61 63 74 65 72 20 73 65 65  \r character see
41d0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
41e0: 64 20 52 65 6d 6f 76 65 4e 65 77 6c 69 6e 65 28  d RemoveNewline(
41f0: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20  char *z){.  if( 
4200: 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  z==0 ) return;. 
4210: 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 2a 7a   while( *z && *z
4220: 21 3d 27 5c 6e 27 20 26 26 20 2a 7a 21 3d 27 5c  !='\n' && *z!='\
4230: 72 27 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 2a  r' ){ z++; }.  *
4240: 7a 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  z = 0;.}../*.** 
4250: 50 72 69 6e 74 20 61 20 64 61 74 65 20 74 61 67  Print a date tag
4260: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20   in the header. 
4270: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
4280: 20 74 61 67 20 69 73 20 7a 54 61 67 2e 0a 2a 2a   tag is zTag..**
4290: 20 54 68 65 20 64 61 74 65 20 69 73 20 64 65 74   The date is det
42a0: 65 72 6d 69 6e 65 64 20 66 72 6f 6d 20 74 68 65  ermined from the
42b0: 20 75 6e 69 78 20 74 69 6d 65 73 74 61 6d 70 20   unix timestamp 
42c0: 67 69 76 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  given..*/.static
42d0: 20 69 6e 74 20 44 61 74 65 54 61 67 28 63 6f 6e   int DateTag(con
42e0: 73 74 20 63 68 61 72 20 2a 7a 54 61 67 2c 20 74  st char *zTag, t
42f0: 69 6d 65 5f 74 20 74 29 7b 0a 20 20 73 74 72 75  ime_t t){.  stru
4300: 63 74 20 74 6d 20 2a 74 6d 3b 0a 20 20 63 68 61  ct tm *tm;.  cha
4310: 72 20 7a 44 61 74 65 5b 31 30 30 5d 3b 0a 20 20  r zDate[100];.  
4320: 74 6d 20 3d 20 67 6d 74 69 6d 65 28 26 74 29 3b  tm = gmtime(&t);
4330: 0a 20 20 73 74 72 66 74 69 6d 65 28 7a 44 61 74  .  strftime(zDat
4340: 65 2c 20 73 69 7a 65 6f 66 28 7a 44 61 74 65 29  e, sizeof(zDate)
4350: 2c 20 22 25 61 2c 20 25 64 20 20 25 62 20 25 59  , "%a, %d  %b %Y
4360: 20 25 48 3a 25 4d 3a 25 53 20 25 7a 22 2c 20 74   %H:%M:%S %z", t
4370: 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 72 69  m);.  return pri
4380: 6e 74 66 28 22 25 73 3a 20 25 73 5c 72 5c 6e 22  ntf("%s: %s\r\n"
4390: 2c 20 7a 54 61 67 2c 20 7a 44 61 74 65 29 3b 0a  , zTag, zDate);.
43a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  }../*.** Print t
43b0: 68 65 20 66 69 72 73 74 20 6c 69 6e 65 20 6f 66  he first line of
43c0: 20 61 20 72 65 73 70 6f 6e 73 65 20 66 6f 6c 6c   a response foll
43d0: 6f 77 65 64 20 62 79 20 74 68 65 20 73 65 72 76  owed by the serv
43e0: 65 72 20 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74  er type..*/.stat
43f0: 69 63 20 76 6f 69 64 20 53 74 61 72 74 52 65 73  ic void StartRes
4400: 70 6f 6e 73 65 28 63 6f 6e 73 74 20 63 68 61 72  ponse(const char
4410: 20 2a 7a 52 65 73 75 6c 74 43 6f 64 65 29 7b 0a   *zResultCode){.
4420: 20 20 74 69 6d 65 5f 74 20 6e 6f 77 3b 0a 20 20    time_t now;.  
4430: 74 69 6d 65 28 26 6e 6f 77 29 3b 0a 20 20 69 66  time(&now);.  if
4440: 28 20 73 74 61 74 75 73 53 65 6e 74 20 29 20 72  ( statusSent ) r
4450: 65 74 75 72 6e 3b 0a 20 20 6e 4f 75 74 20 2b 3d  eturn;.  nOut +=
4460: 20 70 72 69 6e 74 66 28 22 25 73 20 25 73 5c 72   printf("%s %s\r
4470: 5c 6e 22 2c 20 7a 50 72 6f 74 6f 63 6f 6c 2c 20  \n", zProtocol, 
4480: 7a 52 65 73 75 6c 74 43 6f 64 65 29 3b 0a 20 20  zResultCode);.  
4490: 73 74 72 6e 63 70 79 28 7a 52 65 70 6c 79 53 74  strncpy(zReplySt
44a0: 61 74 75 73 2c 20 7a 52 65 73 75 6c 74 43 6f 64  atus, zResultCod
44b0: 65 2c 20 33 29 3b 0a 20 20 7a 52 65 70 6c 79 53  e, 3);.  zReplyS
44c0: 74 61 74 75 73 5b 33 5d 20 3d 20 30 3b 0a 20 20  tatus[3] = 0;.  
44d0: 69 66 28 20 7a 52 65 70 6c 79 53 74 61 74 75 73  if( zReplyStatus
44e0: 5b 30 5d 3e 3d 27 34 27 20 29 7b 0a 20 20 20 20  [0]>='4' ){.    
44f0: 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20  closeConnection 
4500: 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  = 1;.  }.  if( c
4510: 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 29  loseConnection )
4520: 7b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72  {.    nOut += pr
4530: 69 6e 74 66 28 22 43 6f 6e 6e 65 63 74 69 6f 6e  intf("Connection
4540: 3a 20 63 6c 6f 73 65 5c 72 5c 6e 22 29 3b 0a 20  : close\r\n");. 
4550: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 75 74   }else{.    nOut
4560: 20 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 6e   += printf("Conn
4570: 65 63 74 69 6f 6e 3a 20 6b 65 65 70 2d 61 6c 69  ection: keep-ali
4580: 76 65 5c 72 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  ve\r\n");.  }.  
4590: 6e 4f 75 74 20 2b 3d 20 44 61 74 65 54 61 67 28  nOut += DateTag(
45a0: 22 44 61 74 65 22 2c 20 6e 6f 77 29 3b 0a 20 20  "Date", now);.  
45b0: 73 74 61 74 75 73 53 65 6e 74 20 3d 20 31 3b 0a  statusSent = 1;.
45c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68  }../*.** Tell th
45d0: 65 20 63 6c 69 65 6e 74 20 74 68 61 74 20 74 68  e client that th
45e0: 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 64  ere is no such d
45f0: 6f 63 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69  ocument.*/.stati
4600: 63 20 76 6f 69 64 20 4e 6f 74 46 6f 75 6e 64 28  c void NotFound(
4610: 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 53  int lineno){.  S
4620: 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 34 30  tartResponse("40
4630: 34 20 4e 6f 74 20 46 6f 75 6e 64 22 29 3b 0a 20  4 Not Found");. 
4640: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
4650: 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79  .    "Content-ty
4660: 70 65 3a 20 74 65 78 74 2f 68 74 6d 6c 5c 72 5c  pe: text/html\r\
4670: 6e 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20  n".    "\r\n".  
4680: 20 20 22 3c 68 65 61 64 3e 3c 74 69 74 6c 65 20    "<head><title 
4690: 6c 69 6e 65 6e 6f 3d 5c 22 25 64 5c 22 3e 4e 6f  lineno=\"%d\">No
46a0: 74 20 46 6f 75 6e 64 3c 2f 74 69 74 6c 65 3e 3c  t Found</title><
46b0: 2f 68 65 61 64 3e 5c 6e 22 0a 20 20 20 20 22 3c  /head>\n".    "<
46c0: 62 6f 64 79 3e 3c 68 31 3e 44 6f 63 75 6d 65 6e  body><h1>Documen
46d0: 74 20 4e 6f 74 20 46 6f 75 6e 64 3c 2f 68 31 3e  t Not Found</h1>
46e0: 5c 6e 22 0a 20 20 20 20 22 54 68 65 20 64 6f 63  \n".    "The doc
46f0: 75 6d 65 6e 74 20 25 73 20 69 73 20 6e 6f 74 20  ument %s is not 
4700: 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 69  available on thi
4710: 73 20 73 65 72 76 65 72 5c 6e 22 0a 20 20 20 20  s server\n".    
4720: 22 3c 2f 62 6f 64 79 3e 5c 6e 22 2c 20 6c 69 6e  "</body>\n", lin
4730: 65 6e 6f 2c 20 7a 53 63 72 69 70 74 29 3b 0a 20  eno, zScript);. 
4740: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c   MakeLogEntry(0,
4750: 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 65 78 69 74   lineno);.  exit
4760: 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65  (0);.}../*.** Te
4770: 6c 6c 20 74 68 65 20 63 6c 69 65 6e 74 20 74 68  ll the client th
4780: 61 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  at they are not 
4790: 77 65 6c 63 6f 6d 65 64 20 68 65 72 65 2e 0a 2a  welcomed here..*
47a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 46 6f  /.static void Fo
47b0: 72 62 69 64 64 65 6e 28 69 6e 74 20 6c 69 6e 65  rbidden(int line
47c0: 6e 6f 29 7b 0a 20 20 53 74 61 72 74 52 65 73 70  no){.  StartResp
47d0: 6f 6e 73 65 28 22 34 30 33 20 46 6f 72 62 69 64  onse("403 Forbid
47e0: 64 65 6e 22 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d  den");.  nOut +=
47f0: 20 70 72 69 6e 74 66 28 0a 20 20 20 20 22 43 6f   printf(.    "Co
4800: 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74  ntent-type: text
4810: 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20 20  /plain\r\n".    
4820: 22 5c 72 5c 6e 22 0a 20 20 20 20 22 41 63 63 65  "\r\n".    "Acce
4830: 73 73 20 64 65 6e 69 65 64 5c 6e 22 0a 20 20 29  ss denied\n".  )
4840: 3b 0a 20 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74  ;.  closeConnect
4850: 69 6f 6e 20 3d 20 31 3b 0a 20 20 4d 61 6b 65 4c  ion = 1;.  MakeL
4860: 6f 67 45 6e 74 72 79 28 30 2c 20 6c 69 6e 65 6e  ogEntry(0, linen
4870: 6f 29 3b 0a 20 20 65 78 69 74 28 30 29 3b 0a 7d  o);.  exit(0);.}
4880: 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68 65  ../*.** Tell the
4890: 20 63 6c 69 65 6e 74 20 74 68 61 74 20 61 75 74   client that aut
48a0: 68 6f 72 69 7a 61 74 69 6f 6e 20 69 73 20 72 65  horization is re
48b0: 71 75 69 72 65 64 20 74 6f 20 61 63 63 65 73 73  quired to access
48c0: 20 74 68 65 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74   the.** document
48d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
48e0: 20 4e 6f 74 41 75 74 68 6f 72 69 7a 65 64 28 63   NotAuthorized(c
48f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 61 6c  onst char *zReal
4900: 6d 29 7b 0a 20 20 53 74 61 72 74 52 65 73 70 6f  m){.  StartRespo
4910: 6e 73 65 28 22 34 30 31 20 41 75 74 68 6f 72 69  nse("401 Authori
4920: 7a 61 74 69 6f 6e 20 52 65 71 75 69 72 65 64 22  zation Required"
4930: 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69  );.  nOut += pri
4940: 6e 74 66 28 0a 20 20 20 20 22 57 57 57 2d 41 75  ntf(.    "WWW-Au
4950: 74 68 65 6e 74 69 63 61 74 65 3a 20 42 61 73 69  thenticate: Basi
4960: 63 20 72 65 61 6c 6d 3d 5c 22 25 73 5c 22 5c 72  c realm=\"%s\"\r
4970: 5c 6e 22 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74  \n".    "Content
4980: 2d 74 79 70 65 3a 20 74 65 78 74 2f 68 74 6d 6c  -type: text/html
4990: 5c 72 5c 6e 22 0a 20 20 20 20 22 5c 72 5c 6e 22  \r\n".    "\r\n"
49a0: 0a 20 20 20 20 22 3c 68 65 61 64 3e 3c 74 69 74  .    "<head><tit
49b0: 6c 65 3e 4e 6f 74 20 41 75 74 68 6f 72 69 7a 65  le>Not Authorize
49c0: 64 3c 2f 74 69 74 6c 65 3e 3c 2f 68 65 61 64 3e  d</title></head>
49d0: 5c 6e 22 0a 20 20 20 20 22 3c 62 6f 64 79 3e 3c  \n".    "<body><
49e0: 68 31 3e 34 30 31 20 4e 6f 74 20 41 75 74 68 6f  h1>401 Not Autho
49f0: 72 69 7a 65 64 3c 2f 68 31 3e 5c 6e 22 0a 20 20  rized</h1>\n".  
4a00: 20 20 22 41 20 6c 6f 67 69 6e 20 61 6e 64 20 70    "A login and p
4a10: 61 73 73 77 6f 72 64 20 61 72 65 20 72 65 71 75  assword are requ
4a20: 69 72 65 64 20 66 6f 72 20 74 68 69 73 20 64 6f  ired for this do
4a30: 63 75 6d 65 6e 74 5c 6e 22 0a 20 20 20 20 22 3c  cument\n".    "<
4a40: 2f 62 6f 64 79 3e 5c 6e 22 2c 20 7a 52 65 61 6c  /body>\n", zReal
4a50: 6d 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74  m);.  MakeLogEnt
4a60: 72 79 28 30 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  ry(0, __LINE__);
4a70: 20 20 2f 2a 20 4c 4f 47 3a 20 4e 6f 74 20 61 75    /* LOG: Not au
4a80: 74 68 6f 72 69 7a 65 64 20 2a 2f 0a 7d 0a 0a 2f  thorized */.}../
4a90: 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c  *.** Tell the cl
4aa0: 69 65 6e 74 20 74 68 61 74 20 74 68 65 72 65 20  ient that there 
4ab0: 69 73 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74  is an error in t
4ac0: 68 65 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74  he script..*/.st
4ad0: 61 74 69 63 20 76 6f 69 64 20 43 67 69 45 72 72  atic void CgiErr
4ae0: 6f 72 28 76 6f 69 64 29 7b 0a 20 20 53 74 61 72  or(void){.  Star
4af0: 74 52 65 73 70 6f 6e 73 65 28 22 35 30 30 20 45  tResponse("500 E
4b00: 72 72 6f 72 22 29 3b 0a 20 20 6e 4f 75 74 20 2b  rror");.  nOut +
4b10: 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20 22 43  = printf(.    "C
4b20: 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78  ontent-type: tex
4b30: 74 2f 68 74 6d 6c 5c 72 5c 6e 22 0a 20 20 20 20  t/html\r\n".    
4b40: 22 5c 72 5c 6e 22 0a 20 20 20 20 22 3c 68 65 61  "\r\n".    "<hea
4b50: 64 3e 3c 74 69 74 6c 65 3e 43 47 49 20 50 72 6f  d><title>CGI Pro
4b60: 67 72 61 6d 20 45 72 72 6f 72 3c 2f 74 69 74 6c  gram Error</titl
4b70: 65 3e 3c 2f 68 65 61 64 3e 5c 6e 22 0a 20 20 20  e></head>\n".   
4b80: 20 22 3c 62 6f 64 79 3e 3c 68 31 3e 43 47 49 20   "<body><h1>CGI 
4b90: 50 72 6f 67 72 61 6d 20 45 72 72 6f 72 3c 2f 68  Program Error</h
4ba0: 31 3e 5c 6e 22 0a 20 20 20 20 22 54 68 65 20 43  1>\n".    "The C
4bb0: 47 49 20 70 72 6f 67 72 61 6d 20 25 73 20 67 65  GI program %s ge
4bc0: 6e 65 72 61 74 65 64 20 61 6e 20 65 72 72 6f 72  nerated an error
4bd0: 5c 6e 22 0a 20 20 20 20 22 3c 2f 62 6f 64 79 3e  \n".    "</body>
4be0: 5c 6e 22 2c 20 7a 53 63 72 69 70 74 29 3b 0a 20  \n", zScript);. 
4bf0: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c   MakeLogEntry(0,
4c00: 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 20 2f 2a 20   __LINE__);  /* 
4c10: 4c 4f 47 3a 20 43 47 49 20 45 72 72 6f 72 20 2a  LOG: CGI Error *
4c20: 2f 0a 20 20 65 78 69 74 28 30 29 3b 0a 7d 0a 0a  /.  exit(0);.}..
4c30: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61  /*.** This is ca
4c40: 6c 6c 65 64 20 69 66 20 77 65 20 74 69 6d 65 6f  lled if we timeo
4c50: 75 74 20 6f 72 20 63 61 74 63 68 20 73 6f 6d 65  ut or catch some
4c60: 20 6f 74 68 65 72 20 6b 69 6e 64 20 6f 66 20 73   other kind of s
4c70: 69 67 6e 61 6c 2e 0a 2a 2a 20 4c 6f 67 20 61 6e  ignal..** Log an
4c80: 20 65 72 72 6f 72 20 63 6f 64 65 20 77 68 69 63   error code whic
4c90: 68 20 69 73 20 39 30 30 2b 69 53 69 67 20 61 6e  h is 900+iSig an
4ca0: 64 20 74 68 65 6e 20 71 75 69 74 2e 0a 2a 2f 0a  d then quit..*/.
4cb0: 73 74 61 74 69 63 20 76 6f 69 64 20 54 69 6d 65  static void Time
4cc0: 6f 75 74 28 69 6e 74 20 69 53 69 67 29 7b 0a 20  out(int iSig){. 
4cd0: 20 69 66 28 20 21 64 65 62 75 67 46 6c 61 67 20   if( !debugFlag 
4ce0: 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 63 72 69  ){.    if( zScri
4cf0: 70 74 20 26 26 20 7a 53 63 72 69 70 74 5b 30 5d  pt && zScript[0]
4d00: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a   ){.      char z
4d10: 42 75 66 5b 31 30 5d 3b 0a 20 20 20 20 20 20 7a  Buf[10];.      z
4d20: 42 75 66 5b 30 5d 20 3d 20 27 39 27 3b 0a 20 20  Buf[0] = '9';.  
4d30: 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20 27 30      zBuf[1] = '0
4d40: 27 20 2b 20 28 69 53 69 67 2f 31 30 29 25 31 30  ' + (iSig/10)%10
4d50: 3b 0a 20 20 20 20 20 20 7a 42 75 66 5b 32 5d 20  ;.      zBuf[2] 
4d60: 3d 20 27 30 27 20 2b 20 69 53 69 67 25 31 30 3b  = '0' + iSig%10;
4d70: 0a 20 20 20 20 20 20 7a 42 75 66 5b 33 5d 20 3d  .      zBuf[3] =
4d80: 20 30 3b 0a 20 20 20 20 20 20 73 74 72 63 70 79   0;.      strcpy
4d90: 28 7a 52 65 70 6c 79 53 74 61 74 75 73 2c 20 7a  (zReplyStatus, z
4da0: 42 75 66 29 3b 0a 20 20 20 20 20 20 4d 61 6b 65  Buf);.      Make
4db0: 4c 6f 67 45 6e 74 72 79 28 30 2c 20 5f 5f 4c 49  LogEntry(0, __LI
4dc0: 4e 45 5f 5f 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20  NE__);  /* LOG: 
4dd0: 54 69 6d 65 6f 75 74 20 2a 2f 0a 20 20 20 20 7d  Timeout */.    }
4de0: 0a 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20  .    exit(0);.  
4df0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20  }.}../*.** Tell 
4e00: 74 68 65 20 63 6c 69 65 6e 74 20 74 68 61 74 20  the client that 
4e10: 74 68 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f  there is an erro
4e20: 72 20 69 6e 20 74 68 65 20 73 63 72 69 70 74 2e  r in the script.
4e30: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4e40: 43 67 69 53 63 72 69 70 74 57 72 69 74 61 62 6c  CgiScriptWritabl
4e50: 65 28 76 6f 69 64 29 7b 0a 20 20 53 74 61 72 74  e(void){.  Start
4e60: 52 65 73 70 6f 6e 73 65 28 22 35 30 30 20 43 47  Response("500 CG
4e70: 49 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  I Configuration 
4e80: 45 72 72 6f 72 22 29 3b 0a 20 20 6e 4f 75 74 20  Error");.  nOut 
4e90: 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20 22  += printf(.    "
4ea0: 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65  Content-type: te
4eb0: 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20  xt/plain\r\n".  
4ec0: 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 22 54 68    "\r\n".    "Th
4ed0: 65 20 43 47 49 20 70 72 6f 67 72 61 6d 20 25 73  e CGI program %s
4ee0: 20 69 73 20 77 72 69 74 61 62 6c 65 20 62 79 20   is writable by 
4ef0: 75 73 65 72 73 20 6f 74 68 65 72 20 74 68 61 6e  users other than
4f00: 20 69 74 73 20 6f 77 6e 65 72 2e 5c 6e 22 2c 0a   its owner.\n",.
4f10: 20 20 20 20 7a 52 65 61 6c 53 63 72 69 70 74 29      zRealScript)
4f20: 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79  ;.  MakeLogEntry
4f30: 28 30 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 20  (0, __LINE__);  
4f40: 2f 2a 20 4c 4f 47 3a 20 43 47 49 20 73 63 72 69  /* LOG: CGI scri
4f50: 70 74 20 69 73 20 77 72 69 74 61 62 6c 65 20 2a  pt is writable *
4f60: 2f 0a 20 20 65 78 69 74 28 30 29 3b 20 20 20 20  /.  exit(0);    
4f70: 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c     .}../*.** Tel
4f80: 6c 20 74 68 65 20 63 6c 69 65 6e 74 20 74 68 61  l the client tha
4f90: 74 20 74 68 65 20 73 65 72 76 65 72 20 6d 61 6c  t the server mal
4fa0: 66 75 6e 63 74 69 6f 6e 65 64 2e 0a 2a 2f 0a 73  functioned..*/.s
4fb0: 74 61 74 69 63 20 76 6f 69 64 20 4d 61 6c 66 75  tatic void Malfu
4fc0: 6e 63 74 69 6f 6e 28 69 6e 74 20 6c 69 6e 65 6e  nction(int linen
4fd0: 75 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  um, const char *
4fe0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
4ff0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76   va_list ap;.  v
5000: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
5010: 6d 61 74 29 3b 0a 20 20 53 74 61 72 74 52 65 73  mat);.  StartRes
5020: 70 6f 6e 73 65 28 22 35 30 30 20 53 65 72 76 65  ponse("500 Serve
5030: 72 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 22 29 3b  r Malfunction");
5040: 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74  .  nOut += print
5050: 66 28 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d  f(.    "Content-
5060: 74 79 70 65 3a 20 74 65 78 74 2f 70 6c 61 69 6e  type: text/plain
5070: 5c 72 5c 6e 22 0a 20 20 20 20 22 5c 72 5c 6e 22  \r\n".    "\r\n"
5080: 0a 20 20 20 20 22 57 65 62 20 73 65 72 76 65 72  .    "Web server
5090: 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 65 64 3b 20   malfunctioned; 
50a0: 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 25 64 5c  error number %d\
50b0: 6e 5c 6e 22 2c 20 6c 69 6e 65 6e 75 6d 29 3b 0a  n\n", linenum);.
50c0: 20 20 69 66 28 20 7a 46 6f 72 6d 61 74 20 29 7b    if( zFormat ){
50d0: 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 76 70 72  .    nOut += vpr
50e0: 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70  intf(zFormat, ap
50f0: 29 3b 0a 20 20 7d 0a 20 20 4d 61 6b 65 4c 6f 67  );.  }.  MakeLog
5100: 45 6e 74 72 79 28 30 2c 20 6c 69 6e 65 6e 75 6d  Entry(0, linenum
5110: 29 3b 0a 20 20 65 78 69 74 28 30 29 3b 20 20 20  );.  exit(0);   
5120: 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f      .}../*.** Do
5130: 20 61 20 73 65 72 76 65 72 20 72 65 64 69 72 65   a server redire
5140: 63 74 20 74 6f 20 74 68 65 20 64 6f 63 75 6d 65  ct to the docume
5150: 6e 74 20 73 70 65 63 69 66 69 65 64 2e 20 20 54  nt specified.  T
5160: 68 65 20 64 6f 63 75 6d 65 6e 74 0a 2a 2a 20 6e  he document.** n
5170: 61 6d 65 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  ame not contain 
5180: 73 63 68 65 6d 65 20 6f 72 20 6e 65 74 77 6f 72  scheme or networ
5190: 6b 20 6c 6f 63 61 74 69 6f 6e 20 6f 72 20 74 68  k location or th
51a0: 65 20 71 75 65 72 79 20 73 74 72 69 6e 67 2e 0a  e query string..
51b0: 2a 2a 20 49 74 20 77 69 6c 6c 20 62 65 20 6a 75  ** It will be ju
51c0: 73 74 20 74 68 65 20 70 61 74 68 2e 0a 2a 2f 0a  st the path..*/.
51d0: 73 74 61 74 69 63 20 76 6f 69 64 20 52 65 64 69  static void Redi
51e0: 72 65 63 74 28 63 6f 6e 73 74 20 63 68 61 72 20  rect(const char 
51f0: 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 69 6e 69  *zPath, int fini
5200: 73 68 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  sh, int lineno){
5210: 0a 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65  .  StartResponse
5220: 28 22 33 30 32 20 54 65 6d 70 6f 72 61 72 79 20  ("302 Temporary 
5230: 52 65 64 69 72 65 63 74 22 29 3b 0a 20 20 69 66  Redirect");.  if
5240: 28 20 7a 53 65 72 76 65 72 50 6f 72 74 3d 3d 30  ( zServerPort==0
5250: 20 7c 7c 20 7a 53 65 72 76 65 72 50 6f 72 74 5b   || zServerPort[
5260: 30 5d 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28  0]==0 || strcmp(
5270: 7a 53 65 72 76 65 72 50 6f 72 74 2c 22 38 30 22  zServerPort,"80"
5280: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4f 75 74  )==0 ){.    nOut
5290: 20 2b 3d 20 70 72 69 6e 74 66 28 22 4c 6f 63 61   += printf("Loca
52a0: 74 69 6f 6e 3a 20 25 73 3a 2f 2f 25 73 25 73 25  tion: %s://%s%s%
52b0: 73 5c 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  s\r\n",.        
52c0: 20 20 20 20 20 20 20 20 20 20 20 7a 48 74 74 70             zHttp
52d0: 2c 20 7a 53 65 72 76 65 72 4e 61 6d 65 2c 20 7a  , zServerName, z
52e0: 50 61 74 68 2c 20 7a 51 75 65 72 79 53 75 66 66  Path, zQuerySuff
52f0: 69 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ix);.  }else{.  
5300: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
5310: 28 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73 3a 2f  ("Location: %s:/
5320: 2f 25 73 3a 25 73 25 73 25 73 5c 72 5c 6e 22 2c  /%s:%s%s%s\r\n",
5330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5340: 20 20 20 20 7a 48 74 74 70 2c 20 7a 53 65 72 76      zHttp, zServ
5350: 65 72 4e 61 6d 65 2c 20 7a 53 65 72 76 65 72 50  erName, zServerP
5360: 6f 72 74 2c 20 7a 50 61 74 68 2c 20 7a 51 75 65  ort, zPath, zQue
5370: 72 79 53 75 66 66 69 78 29 3b 0a 20 20 7d 0a 20  rySuffix);.  }. 
5380: 20 69 66 28 20 66 69 6e 69 73 68 20 29 7b 0a 20   if( finish ){. 
5390: 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74     nOut += print
53a0: 66 28 22 43 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74  f("Content-lengt
53b0: 68 3a 20 30 5c 72 5c 6e 22 29 3b 0a 20 20 20 20  h: 0\r\n");.    
53c0: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22  nOut += printf("
53d0: 5c 72 5c 6e 22 29 3b 0a 20 20 20 20 4d 61 6b 65  \r\n");.    Make
53e0: 4c 6f 67 45 6e 74 72 79 28 30 2c 20 6c 69 6e 65  LogEntry(0, line
53f0: 6e 6f 29 3b 0a 20 20 7d 0a 20 20 66 66 6c 75 73  no);.  }.  fflus
5400: 68 28 73 74 64 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a  h(stdout);.}../*
5410: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
5420: 6e 20 74 72 65 61 74 73 20 69 74 73 20 69 6e 70  n treats its inp
5430: 75 74 20 61 73 20 61 20 62 61 73 65 2d 36 34 20  ut as a base-64 
5440: 73 74 72 69 6e 67 20 61 6e 64 20 72 65 74 75 72  string and retur
5450: 6e 73 20 74 68 65 0a 2a 2a 20 64 65 63 6f 64 65  ns the.** decode
5460: 64 20 76 61 6c 75 65 20 6f 66 20 74 68 61 74 20  d value of that 
5470: 73 74 72 69 6e 67 2e 20 20 43 68 61 72 61 63 74  string.  Charact
5480: 65 72 73 20 6f 66 20 69 6e 70 75 74 20 74 68 61  ers of input tha
5490: 74 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 76 61 6c  t are not.** val
54a0: 69 64 20 62 61 73 65 2d 36 34 20 63 68 61 72 61  id base-64 chara
54b0: 63 74 65 72 73 20 28 73 75 63 68 20 61 73 20 73  cters (such as s
54c0: 70 61 63 65 73 20 61 6e 64 20 6e 65 77 6c 69 6e  paces and newlin
54d0: 65 73 29 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  es) are ignored.
54e0: 0a 2a 2f 0a 76 6f 69 64 20 44 65 63 6f 64 65 36  .*/.void Decode6
54f0: 34 28 63 68 61 72 20 2a 7a 36 34 29 7b 0a 20 20  4(char *z64){.  
5500: 63 68 61 72 20 2a 7a 44 61 74 61 3b 0a 20 20 69  char *zData;.  i
5510: 6e 74 20 6e 36 34 3b 0a 20 20 69 6e 74 20 69 2c  nt n64;.  int i,
5520: 20 6a 3b 0a 20 20 69 6e 74 20 61 2c 20 62 2c 20   j;.  int a, b, 
5530: 63 2c 20 64 3b 0a 20 20 73 74 61 74 69 63 20 69  c, d;.  static i
5540: 6e 74 20 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  nt isInit = 0;. 
5550: 20 73 74 61 74 69 63 20 69 6e 74 20 74 72 61 6e   static int tran
5560: 73 5b 31 32 38 5d 3b 0a 20 20 73 74 61 74 69 63  s[128];.  static
5570: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
5580: 42 61 73 65 5b 5d 20 3d 20 0a 20 20 20 20 22 41  Base[] = .    "A
5590: 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
55a0: 52 53 54 55 56 57 58 59 5a 61 62 63 64 65 66 67  RSTUVWXYZabcdefg
55b0: 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
55c0: 78 79 7a 30 31 32 33 34 35 36 37 38 39 2b 2f 22  xyz0123456789+/"
55d0: 3b 0a 0a 20 20 69 66 28 20 21 69 73 49 6e 69 74  ;..  if( !isInit
55e0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
55f0: 20 69 3c 31 32 38 3b 20 69 2b 2b 29 7b 20 74 72   i<128; i++){ tr
5600: 61 6e 73 5b 69 5d 20 3d 20 30 3b 20 7d 0a 20 20  ans[i] = 0; }.  
5610: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 42 61 73 65    for(i=0; zBase
5620: 5b 69 5d 3b 20 69 2b 2b 29 7b 20 74 72 61 6e 73  [i]; i++){ trans
5630: 5b 7a 42 61 73 65 5b 69 5d 20 26 20 30 78 37 66  [zBase[i] & 0x7f
5640: 5d 20 3d 20 69 3b 20 7d 0a 20 20 20 20 69 73 49  ] = i; }.    isI
5650: 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 6e  nit = 1;.  }.  n
5660: 36 34 20 3d 20 73 74 72 6c 65 6e 28 7a 36 34 29  64 = strlen(z64)
5670: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 36 34 3e 30  ;.  while( n64>0
5680: 20 26 26 20 7a 36 34 5b 6e 36 34 2d 31 5d 3d 3d   && z64[n64-1]==
5690: 27 3d 27 20 29 20 6e 36 34 2d 2d 3b 0a 20 20 7a  '=' ) n64--;.  z
56a0: 44 61 74 61 20 3d 20 7a 36 34 3b 0a 20 20 66 6f  Data = z64;.  fo
56b0: 72 28 69 3d 6a 3d 30 3b 20 69 2b 33 3c 6e 36 34  r(i=j=0; i+3<n64
56c0: 3b 20 69 2b 3d 34 29 7b 0a 20 20 20 20 61 20 3d  ; i+=4){.    a =
56d0: 20 74 72 61 6e 73 5b 7a 36 34 5b 69 5d 20 26 20   trans[z64[i] & 
56e0: 30 78 37 66 5d 3b 0a 20 20 20 20 62 20 3d 20 74  0x7f];.    b = t
56f0: 72 61 6e 73 5b 7a 36 34 5b 69 2b 31 5d 20 26 20  rans[z64[i+1] & 
5700: 30 78 37 66 5d 3b 0a 20 20 20 20 63 20 3d 20 74  0x7f];.    c = t
5710: 72 61 6e 73 5b 7a 36 34 5b 69 2b 32 5d 20 26 20  rans[z64[i+2] & 
5720: 30 78 37 66 5d 3b 0a 20 20 20 20 64 20 3d 20 74  0x7f];.    d = t
5730: 72 61 6e 73 5b 7a 36 34 5b 69 2b 33 5d 20 26 20  rans[z64[i+3] & 
5740: 30 78 37 66 5d 3b 0a 20 20 20 20 7a 44 61 74 61  0x7f];.    zData
5750: 5b 6a 2b 2b 5d 20 3d 20 28 28 61 3c 3c 32 29 20  [j++] = ((a<<2) 
5760: 26 20 30 78 66 63 29 20 7c 20 28 28 62 3e 3e 34  & 0xfc) | ((b>>4
5770: 29 20 26 20 30 78 30 33 29 3b 0a 20 20 20 20 7a  ) & 0x03);.    z
5780: 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28 62 3c  Data[j++] = ((b<
5790: 3c 34 29 20 26 20 30 78 66 30 29 20 7c 20 28 28  <4) & 0xf0) | ((
57a0: 63 3e 3e 32 29 20 26 20 30 78 30 66 29 3b 0a 20  c>>2) & 0x0f);. 
57b0: 20 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20     zData[j++] = 
57c0: 28 28 63 3c 3c 36 29 20 26 20 30 78 63 30 29 20  ((c<<6) & 0xc0) 
57d0: 7c 20 28 64 20 26 20 30 78 33 66 29 3b 0a 20 20  | (d & 0x3f);.  
57e0: 7d 0a 20 20 69 66 28 20 69 2b 32 3c 6e 36 34 20  }.  if( i+2<n64 
57f0: 29 7b 0a 20 20 20 20 61 20 3d 20 74 72 61 6e 73  ){.    a = trans
5800: 5b 7a 36 34 5b 69 5d 20 26 20 30 78 37 66 5d 3b  [z64[i] & 0x7f];
5810: 0a 20 20 20 20 62 20 3d 20 74 72 61 6e 73 5b 7a  .    b = trans[z
5820: 36 34 5b 69 2b 31 5d 20 26 20 30 78 37 66 5d 3b  64[i+1] & 0x7f];
5830: 0a 20 20 20 20 63 20 3d 20 74 72 61 6e 73 5b 7a  .    c = trans[z
5840: 36 34 5b 69 2b 32 5d 20 26 20 30 78 37 66 5d 3b  64[i+2] & 0x7f];
5850: 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20  .    zData[j++] 
5860: 3d 20 28 28 61 3c 3c 32 29 20 26 20 30 78 66 63  = ((a<<2) & 0xfc
5870: 29 20 7c 20 28 28 62 3e 3e 34 29 20 26 20 30 78  ) | ((b>>4) & 0x
5880: 30 33 29 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a  03);.    zData[j
5890: 2b 2b 5d 20 3d 20 28 28 62 3c 3c 34 29 20 26 20  ++] = ((b<<4) & 
58a0: 30 78 66 30 29 20 7c 20 28 28 63 3e 3e 32 29 20  0xf0) | ((c>>2) 
58b0: 26 20 30 78 30 66 29 3b 0a 20 20 7d 65 6c 73 65  & 0x0f);.  }else
58c0: 20 69 66 28 20 69 2b 31 3c 6e 36 34 20 29 7b 0a   if( i+1<n64 ){.
58d0: 20 20 20 20 61 20 3d 20 74 72 61 6e 73 5b 7a 36      a = trans[z6
58e0: 34 5b 69 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20  4[i] & 0x7f];.  
58f0: 20 20 62 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b    b = trans[z64[
5900: 69 2b 31 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20  i+1] & 0x7f];.  
5910: 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28    zData[j++] = (
5920: 28 61 3c 3c 32 29 20 26 20 30 78 66 63 29 20 7c  (a<<2) & 0xfc) |
5930: 20 28 28 62 3e 3e 34 29 20 26 20 30 78 30 33 29   ((b>>4) & 0x03)
5940: 3b 0a 20 20 7d 0a 20 20 7a 44 61 74 61 5b 6a 5d  ;.  }.  zData[j]
5950: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
5960: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 62  heck to see if b
5970: 61 73 69 63 20 61 75 74 68 6f 72 69 7a 61 74 69  asic authorizati
5980: 6f 6e 20 63 72 65 64 65 6e 74 69 61 6c 73 20 61  on credentials a
5990: 72 65 20 70 72 6f 76 69 64 65 64 20 66 6f 72 0a  re provided for.
59a0: 2a 2a 20 74 68 65 20 75 73 65 72 20 61 63 63 6f  ** the user acco
59b0: 72 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 66  rding to the inf
59c0: 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 7a 41 75 74  ormation in zAut
59d0: 68 46 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74  hFile.  Return t
59e0: 72 75 65 0a 2a 2a 20 69 66 20 61 75 74 68 6f 72  rue.** if author
59f0: 69 7a 65 64 2e 20 20 52 65 74 75 72 6e 20 66 61  ized.  Return fa
5a00: 6c 73 65 20 69 66 20 6e 6f 74 20 61 75 74 68 6f  lse if not autho
5a10: 72 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 69 6c  rized..**.** Fil
5a20: 65 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20  e format:.**.** 
5a30: 20 20 20 2a 20 20 42 6c 61 6e 6b 20 6c 69 6e 65     *  Blank line
5a40: 73 20 61 6e 64 20 6c 69 6e 65 73 20 74 68 61 74  s and lines that
5a50: 20 62 65 67 69 6e 20 77 69 74 68 20 27 23 27 20   begin with '#' 
5a60: 61 72 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 20  are ignored.**  
5a70: 20 20 2a 20 20 22 68 74 74 70 2d 72 65 64 69 72    *  "http-redir
5a80: 65 63 74 22 20 66 6f 72 63 65 73 20 61 20 72 65  ect" forces a re
5a90: 64 69 72 65 63 74 20 74 6f 20 48 54 54 50 53 20  direct to HTTPS 
5aa0: 69 66 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  if not there alr
5ab0: 65 61 64 79 0a 2a 2a 20 20 20 20 2a 20 20 22 68  eady.**    *  "h
5ac0: 74 74 70 73 2d 6f 6e 6c 79 22 20 64 69 73 61 6c  ttps-only" disal
5ad0: 6c 6f 77 73 20 6f 70 65 72 61 74 69 6f 6e 20 69  lows operation i
5ae0: 6e 20 48 54 54 50 0a 2a 2a 20 20 20 20 2a 20 20  n HTTP.**    *  
5af0: 22 75 73 65 72 20 4e 41 4d 45 20 4c 4f 47 49 4e  "user NAME LOGIN
5b00: 3a 50 41 53 53 57 4f 52 44 22 20 63 68 65 63 6b  :PASSWORD" check
5b10: 73 20 74 6f 20 73 65 65 20 69 66 20 4c 4f 47 49  s to see if LOGI
5b20: 4e 3a 50 41 53 53 57 4f 52 44 20 0a 2a 2a 20 20  N:PASSWORD .**  
5b30: 20 20 20 20 20 61 75 74 68 6f 72 69 7a 61 74 69       authorizati
5b40: 6f 6e 20 63 72 65 64 65 6e 74 69 61 6c 73 20 61  on credentials a
5b50: 72 65 20 70 72 6f 76 69 64 65 64 2c 20 61 6e 64  re provided, and
5b60: 20 69 66 20 73 6f 20 73 65 74 73 20 74 68 65 0a   if so sets the.
5b70: 2a 2a 20 20 20 20 20 20 20 52 45 4d 4f 54 45 5f  **       REMOTE_
5b80: 55 53 45 52 20 74 6f 20 4e 41 4d 45 2e 0a 2a 2a  USER to NAME..**
5b90: 20 20 20 20 2a 20 20 22 72 65 61 6c 6d 20 54 45      *  "realm TE
5ba0: 58 54 22 20 73 65 74 73 20 74 68 65 20 72 65 61  XT" sets the rea
5bb0: 6c 6d 20 74 6f 20 54 45 58 54 2e 0a 2a 2f 0a 73  lm to TEXT..*/.s
5bc0: 74 61 74 69 63 20 69 6e 74 20 43 68 65 63 6b 42  tatic int CheckB
5bd0: 61 73 69 63 41 75 74 68 6f 72 69 7a 61 74 69 6f  asicAuthorizatio
5be0: 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41  n(const char *zA
5bf0: 75 74 68 46 69 6c 65 29 7b 0a 20 20 46 49 4c 45  uthFile){.  FILE
5c00: 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 52   *in;.  char *zR
5c10: 65 61 6c 6d 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20  ealm = "unknown 
5c20: 72 65 61 6c 6d 22 3b 0a 20 20 63 68 61 72 20 2a  realm";.  char *
5c30: 7a 4c 6f 67 69 6e 50 73 77 64 3b 0a 20 20 63 68  zLoginPswd;.  ch
5c40: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63 68 61  ar *zName;.  cha
5c50: 72 20 7a 4c 69 6e 65 5b 32 30 30 30 5d 3b 0a 0a  r zLine[2000];..
5c60: 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 41 75    in = fopen(zAu
5c70: 74 68 46 69 6c 65 2c 20 22 72 22 29 3b 0a 20 20  thFile, "r");.  
5c80: 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  if( in==0 ){.   
5c90: 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45   NotFound(__LINE
5ca0: 5f 5f 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 43 61  __);  /* LOG: Ca
5cb0: 6e 6e 6f 74 20 6f 70 65 6e 20 2d 61 75 74 68 20  nnot open -auth 
5cc0: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 65 74 75  file */.    retu
5cd0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
5ce0: 7a 41 75 74 68 41 72 67 20 29 20 44 65 63 6f 64  zAuthArg ) Decod
5cf0: 65 36 34 28 7a 41 75 74 68 41 72 67 29 3b 0a 20  e64(zAuthArg);. 
5d00: 20 77 68 69 6c 65 28 20 66 67 65 74 73 28 7a 4c   while( fgets(zL
5d10: 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c 69 6e  ine, sizeof(zLin
5d20: 65 29 2c 20 69 6e 29 20 29 7b 0a 20 20 20 20 63  e), in) ){.    c
5d30: 68 61 72 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 3b  har *zFieldName;
5d40: 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 3b  .    char *zVal;
5d50: 0a 0a 20 20 20 20 7a 46 69 65 6c 64 4e 61 6d 65  ..    zFieldName
5d60: 20 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65   = GetFirstEleme
5d70: 6e 74 28 7a 4c 69 6e 65 2c 26 7a 56 61 6c 29 3b  nt(zLine,&zVal);
5d80: 0a 20 20 20 20 69 66 28 20 7a 46 69 65 6c 64 4e  .    if( zFieldN
5d90: 61 6d 65 3d 3d 30 20 7c 7c 20 2a 7a 46 69 65 6c  ame==0 || *zFiel
5da0: 64 4e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69  dName==0 ) conti
5db0: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 7a 46 69  nue;.    if( zFi
5dc0: 65 6c 64 4e 61 6d 65 5b 30 5d 3d 3d 27 23 27 20  eldName[0]=='#' 
5dd0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
5de0: 52 65 6d 6f 76 65 4e 65 77 6c 69 6e 65 28 7a 56  RemoveNewline(zV
5df0: 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72  al);.    if( str
5e00: 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 20  cmp(zFieldName, 
5e10: 22 72 65 61 6c 6d 22 29 3d 3d 30 20 29 7b 0a 20  "realm")==0 ){. 
5e20: 20 20 20 20 20 7a 52 65 61 6c 6d 20 3d 20 53 74       zRealm = St
5e30: 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20  rDup(zVal);.    
5e40: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
5e50: 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 75 73 65  (zFieldName,"use
5e60: 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
5e70: 69 66 28 20 7a 41 75 74 68 41 72 67 3d 3d 30 20  if( zAuthArg==0 
5e80: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
5e90: 20 20 7a 4e 61 6d 65 20 3d 20 47 65 74 46 69 72    zName = GetFir
5ea0: 73 74 45 6c 65 6d 65 6e 74 28 7a 56 61 6c 2c 20  stElement(zVal, 
5eb0: 26 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 7a 4c  &zVal);.      zL
5ec0: 6f 67 69 6e 50 73 77 64 20 3d 20 47 65 74 46 69  oginPswd = GetFi
5ed0: 72 73 74 45 6c 65 6d 65 6e 74 28 7a 56 61 6c 2c  rstElement(zVal,
5ee0: 20 26 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 69   &zVal);.      i
5ef0: 66 28 20 7a 4c 6f 67 69 6e 50 73 77 64 3d 3d 30  f( zLoginPswd==0
5f00: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
5f10: 20 20 20 69 66 28 20 7a 41 75 74 68 41 72 67 20     if( zAuthArg 
5f20: 26 26 20 73 74 72 63 6d 70 28 7a 41 75 74 68 41  && strcmp(zAuthA
5f30: 72 67 2c 7a 4c 6f 67 69 6e 50 73 77 64 29 3d 3d  rg,zLoginPswd)==
5f40: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65  0 ){.        zRe
5f50: 6d 6f 74 65 55 73 65 72 20 3d 20 53 74 72 44 75  moteUser = StrDu
5f60: 70 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  p(zName);.      
5f70: 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
5f80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
5f90: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
5fa0: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69  e if( strcmp(zFi
5fb0: 65 6c 64 4e 61 6d 65 2c 22 68 74 74 70 73 2d 6f  eldName,"https-o
5fc0: 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nly")==0 ){.    
5fd0: 20 20 69 66 28 20 21 75 73 65 48 74 74 70 73 20    if( !useHttps 
5fe0: 29 7b 0a 20 20 20 20 20 20 20 20 4e 6f 74 46 6f  ){.        NotFo
5ff0: 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 20  und(__LINE__);  
6000: 2f 2a 20 4c 4f 47 3a 20 20 68 74 74 70 20 72 65  /* LOG:  http re
6010: 71 75 65 73 74 20 6f 6e 20 68 74 74 70 73 2d 6f  quest on https-o
6020: 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  nly page */.    
6030: 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
6040: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
6050: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
6060: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
6070: 46 69 65 6c 64 4e 61 6d 65 2c 22 68 74 74 70 2d  FieldName,"http-
6080: 72 65 64 69 72 65 63 74 22 29 3d 3d 30 20 29 7b  redirect")==0 ){
6090: 0a 20 20 20 20 20 20 69 66 28 20 21 75 73 65 48  .      if( !useH
60a0: 74 74 70 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ttps ){.        
60b0: 7a 48 74 74 70 20 3d 20 22 68 74 74 70 73 22 3b  zHttp = "https";
60c0: 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66  .        sprintf
60d0: 28 7a 4c 69 6e 65 2c 20 22 25 73 25 73 22 2c 20  (zLine, "%s%s", 
60e0: 7a 53 63 72 69 70 74 2c 20 7a 50 61 74 68 49 6e  zScript, zPathIn
60f0: 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 52 65 64  fo);.        Red
6100: 69 72 65 63 74 28 7a 4c 69 6e 65 2c 20 31 2c 20  irect(zLine, 1, 
6110: 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 2f 2a 20 4c 4f  __LINE__); /* LO
6120: 47 3a 20 2d 61 75 74 68 20 72 65 64 69 72 65 63  G: -auth redirec
6130: 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 63 6c  t */.        fcl
6140: 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 20  ose(in);.       
6150: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
6160: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
6170: 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c      NotFound(__L
6180: 49 4e 45 5f 5f 29 3b 20 20 2f 2a 20 4c 4f 47 3a  INE__);  /* LOG:
6190: 20 20 6d 61 6c 66 6f 72 6d 65 64 20 65 6e 74 72    malformed entr
61a0: 79 20 69 6e 20 2d 61 75 74 68 20 66 69 6c 65 20  y in -auth file 
61b0: 2a 2f 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28  */.      fclose(
61c0: 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  in);.      retur
61d0: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 0;.    }.  }. 
61e0: 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 4e   fclose(in);.  N
61f0: 6f 74 41 75 74 68 6f 72 69 7a 65 64 28 7a 52 65  otAuthorized(zRe
6200: 61 6c 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  alm);.  return 0
6210: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 75 65 73 73  ;.}../*.** Guess
6220: 20 74 68 65 20 6d 69 6d 65 2d 74 79 70 65 20 6f   the mime-type o
6230: 66 20 61 20 64 6f 63 75 6d 65 6e 74 20 62 61 73  f a document bas
6240: 65 64 20 6f 6e 20 69 74 73 20 6e 61 6d 65 2e 0a  ed on its name..
6250: 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 47  */.const char *G
6260: 65 74 4d 69 6d 65 54 79 70 65 28 63 6f 6e 73 74  etMimeType(const
6270: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e   char *zName, in
6280: 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 63 6f 6e 73  t nName){.  cons
6290: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74  t char *z;.  int
62a0: 20 69 3b 0a 20 20 69 6e 74 20 66 69 72 73 74 2c   i;.  int first,
62b0: 20 6c 61 73 74 3b 0a 20 20 69 6e 74 20 6c 65 6e   last;.  int len
62c0: 3b 0a 20 20 63 68 61 72 20 7a 53 75 66 66 69 78  ;.  char zSuffix
62d0: 5b 32 30 5d 3b 0a 0a 20 20 2f 2a 20 41 20 74 61  [20];..  /* A ta
62e0: 62 6c 65 20 6f 66 20 6d 69 6d 65 74 79 70 65 73  ble of mimetypes
62f0: 20 62 61 73 65 64 20 6f 6e 20 66 69 6c 65 20 73   based on file s
6300: 75 66 66 69 78 65 73 2e 20 0a 20 20 2a 2a 20 53  uffixes. .  ** S
6310: 75 66 66 69 78 65 73 20 6d 75 73 74 20 62 65 20  uffixes must be 
6320: 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20  in sorted order 
6330: 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 64  so that we can d
6340: 6f 20 61 20 62 69 6e 61 72 79 0a 20 20 2a 2a 20  o a binary.  ** 
6350: 73 65 61 72 63 68 20 74 6f 20 66 69 6e 64 20 74  search to find t
6360: 68 65 20 6d 69 6d 65 2d 74 79 70 65 0a 20 20 2a  he mime-type.  *
6370: 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  /.  static const
6380: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f   struct {.    co
6390: 6e 73 74 20 63 68 61 72 20 2a 7a 53 75 66 66 69  nst char *zSuffi
63a0: 78 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  x;       /* The 
63b0: 66 69 6c 65 20 73 75 66 66 69 78 20 2a 2f 0a 20  file suffix */. 
63c0: 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20     int size;    
63d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
63e0: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73   Length of the s
63f0: 75 66 66 69 78 20 2a 2f 0a 20 20 20 20 63 6f 6e  uffix */.    con
6400: 73 74 20 63 68 61 72 20 2a 7a 4d 69 6d 65 74 79  st char *zMimety
6410: 70 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 63  pe;     /* The c
6420: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 6d 69 6d  orresponding mim
6430: 65 74 79 70 65 20 2a 2f 0a 20 20 7d 20 61 4d 69  etype */.  } aMi
6440: 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  me[] = {.    { "
6450: 61 69 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  ai",         2, 
6460: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 6f 73  "application/pos
6470: 74 73 63 72 69 70 74 22 20 20 20 20 20 20 20 20  tscript"        
6480: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 69      },.    { "ai
6490: 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  f",        3, "a
64a0: 75 64 69 6f 2f 78 2d 61 69 66 66 22 20 20 20 20  udio/x-aiff"    
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64c0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 69 66 63    },.    { "aifc
64d0: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 75 64  ",       4, "aud
64e0: 69 6f 2f 78 2d 61 69 66 66 22 20 20 20 20 20 20  io/x-aiff"      
64f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6500: 7d 2c 0a 20 20 20 20 7b 20 22 61 69 66 66 22 2c  },.    { "aiff",
6510: 20 20 20 20 20 20 20 34 2c 20 22 61 75 64 69 6f         4, "audio
6520: 2f 78 2d 61 69 66 66 22 20 20 20 20 20 20 20 20  /x-aiff"        
6530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6540: 0a 20 20 20 20 7b 20 22 61 72 6a 22 2c 20 20 20  .    { "arj",   
6550: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
6560: 74 69 6f 6e 2f 78 2d 61 72 6a 2d 63 6f 6d 70 72  tion/x-arj-compr
6570: 65 73 73 65 64 22 20 20 20 20 20 20 7d 2c 0a 20  essed"      },. 
6580: 20 20 20 7b 20 22 61 73 63 22 2c 20 20 20 20 20     { "asc",     
6590: 20 20 20 33 2c 20 22 74 65 78 74 2f 70 6c 61 69     3, "text/plai
65a0: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
65b0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
65c0: 20 7b 20 22 61 73 66 22 2c 20 20 20 20 20 20 20   { "asf",       
65d0: 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d   3, "video/x-ms-
65e0: 61 73 66 22 20 20 20 20 20 20 20 20 20 20 20 20  asf"            
65f0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6600: 20 22 61 73 78 22 2c 20 20 20 20 20 20 20 20 33   "asx",        3
6610: 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 61 73  , "video/x-ms-as
6620: 78 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x"              
6630: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6640: 61 75 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  au",         2, 
6650: 22 61 75 64 69 6f 2f 75 6c 61 77 22 20 20 20 20  "audio/ulaw"    
6660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6670: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 76      },.    { "av
6680: 69 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76  i",        3, "v
6690: 69 64 65 6f 2f 78 2d 6d 73 76 69 64 65 6f 22 20  ideo/x-msvideo" 
66a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66b0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 62 61 74 22    },.    { "bat"
66c0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
66d0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 6d 73 64 6f 73  lication/x-msdos
66e0: 2d 70 72 6f 67 72 61 6d 22 20 20 20 20 20 20 20  -program"       
66f0: 7d 2c 0a 20 20 20 20 7b 20 22 62 63 70 69 6f 22  },.    { "bcpio"
6700: 2c 20 20 20 20 20 20 35 2c 20 22 61 70 70 6c 69  ,      5, "appli
6710: 63 61 74 69 6f 6e 2f 78 2d 62 63 70 69 6f 22 20  cation/x-bcpio" 
6720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6730: 0a 20 20 20 20 7b 20 22 62 69 6e 22 2c 20 20 20  .    { "bin",   
6740: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
6750: 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61  tion/octet-strea
6760: 6d 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  m"          },. 
6770: 20 20 20 7b 20 22 63 22 2c 20 20 20 20 20 20 20     { "c",       
6780: 20 20 20 31 2c 20 22 74 65 78 74 2f 70 6c 61 69     1, "text/plai
6790: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
67a0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
67b0: 20 7b 20 22 63 63 22 2c 20 20 20 20 20 20 20 20   { "cc",        
67c0: 20 32 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22   2, "text/plain"
67d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67e0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
67f0: 20 22 63 63 61 64 22 2c 20 20 20 20 20 20 20 34   "ccad",       4
6800: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 63  , "application/c
6810: 6c 61 72 69 73 63 61 64 22 20 20 20 20 20 20 20  lariscad"       
6820: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6830: 63 64 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20  cdf",        3, 
6840: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6e  "application/x-n
6850: 65 74 63 64 66 22 20 20 20 20 20 20 20 20 20 20  etcdf"          
6860: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6c      },.    { "cl
6870: 61 73 73 22 2c 20 20 20 20 20 20 35 2c 20 22 61  ass",      5, "a
6880: 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74  pplication/octet
6890: 2d 73 74 72 65 61 6d 22 20 20 20 20 20 20 20 20  -stream"        
68a0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 64 22    },.    { "cod"
68b0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
68c0: 6c 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 72 69 6d  lication/vnd.rim
68d0: 2e 63 6f 64 22 20 20 20 20 20 20 20 20 20 20 20  .cod"           
68e0: 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 6d 22 2c 20  },.    { "com", 
68f0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
6900: 63 61 74 69 6f 6e 2f 78 2d 6d 73 64 6f 73 2d 70  cation/x-msdos-p
6910: 72 6f 67 72 61 6d 22 20 20 20 20 20 20 20 7d 2c  rogram"       },
6920: 0a 20 20 20 20 7b 20 22 63 70 69 6f 22 2c 20 20  .    { "cpio",  
6930: 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61       4, "applica
6940: 74 69 6f 6e 2f 78 2d 63 70 69 6f 22 20 20 20 20  tion/x-cpio"    
6950: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6960: 20 20 20 7b 20 22 63 70 74 22 2c 20 20 20 20 20     { "cpt",     
6970: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
6980: 6f 6e 2f 6d 61 63 2d 63 6f 6d 70 61 63 74 70 72  on/mac-compactpr
6990: 6f 22 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  o"        },.   
69a0: 20 7b 20 22 63 73 68 22 2c 20 20 20 20 20 20 20   { "csh",       
69b0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
69c0: 2f 78 2d 63 73 68 22 20 20 20 20 20 20 20 20 20  /x-csh"         
69d0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
69e0: 20 22 63 73 73 22 2c 20 20 20 20 20 20 20 20 33   "css",        3
69f0: 2c 20 22 74 65 78 74 2f 63 73 73 22 20 20 20 20  , "text/css"    
6a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a10: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6a20: 64 63 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20  dcr",        3, 
6a30: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 64  "application/x-d
6a40: 69 72 65 63 74 6f 72 22 20 20 20 20 20 20 20 20  irector"        
6a50: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 65      },.    { "de
6a60: 62 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  b",        3, "a
6a70: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 64 65 62  pplication/x-deb
6a80: 69 61 6e 2d 70 61 63 6b 61 67 65 22 20 20 20 20  ian-package"    
6a90: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 69 72 22    },.    { "dir"
6aa0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
6ab0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 64 69 72 65 63  lication/x-direc
6ac0: 74 6f 72 22 20 20 20 20 20 20 20 20 20 20 20 20  tor"            
6ad0: 7d 2c 0a 20 20 20 20 7b 20 22 64 6c 22 2c 20 20  },.    { "dl",  
6ae0: 20 20 20 20 20 20 20 32 2c 20 22 76 69 64 65 6f         2, "video
6af0: 2f 64 6c 22 20 20 20 20 20 20 20 20 20 20 20 20  /dl"            
6b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6b10: 0a 20 20 20 20 7b 20 22 64 6d 73 22 2c 20 20 20  .    { "dms",   
6b20: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
6b30: 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61  tion/octet-strea
6b40: 6d 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  m"          },. 
6b50: 20 20 20 7b 20 22 64 6f 63 22 2c 20 20 20 20 20     { "doc",     
6b60: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
6b70: 6f 6e 2f 6d 73 77 6f 72 64 22 20 20 20 20 20 20  on/msword"      
6b80: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6b90: 20 7b 20 22 64 72 77 22 2c 20 20 20 20 20 20 20   { "drw",       
6ba0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
6bb0: 2f 64 72 61 66 74 69 6e 67 22 20 20 20 20 20 20  /drafting"      
6bc0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6bd0: 20 22 64 76 69 22 2c 20 20 20 20 20 20 20 20 33   "dvi",        3
6be0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
6bf0: 2d 64 76 69 22 20 20 20 20 20 20 20 20 20 20 20  -dvi"           
6c00: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6c10: 64 77 67 22 2c 20 20 20 20 20 20 20 20 33 2c 20  dwg",        3, 
6c20: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 61 63 61  "application/aca
6c30: 64 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d"              
6c40: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 78      },.    { "dx
6c50: 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  f",        3, "a
6c60: 70 70 6c 69 63 61 74 69 6f 6e 2f 64 78 66 22 20  pplication/dxf" 
6c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c80: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 78 72 22    },.    { "dxr"
6c90: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
6ca0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 64 69 72 65 63  lication/x-direc
6cb0: 74 6f 72 22 20 20 20 20 20 20 20 20 20 20 20 20  tor"            
6cc0: 7d 2c 0a 20 20 20 20 7b 20 22 65 70 73 22 2c 20  },.    { "eps", 
6cd0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
6ce0: 63 61 74 69 6f 6e 2f 70 6f 73 74 73 63 72 69 70  cation/postscrip
6cf0: 74 22 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  t"            },
6d00: 0a 20 20 20 20 7b 20 22 65 74 78 22 2c 20 20 20  .    { "etx",   
6d10: 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 78 2d       3, "text/x-
6d20: 73 65 74 65 78 74 22 20 20 20 20 20 20 20 20 20  setext"         
6d30: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6d40: 20 20 20 7b 20 22 65 78 65 22 2c 20 20 20 20 20     { "exe",     
6d50: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
6d60: 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22  on/octet-stream"
6d70: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6d80: 20 7b 20 22 65 7a 22 2c 20 20 20 20 20 20 20 20   { "ez",        
6d90: 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   2, "application
6da0: 2f 61 6e 64 72 65 77 2d 69 6e 73 65 74 22 20 20  /andrew-inset"  
6db0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6dc0: 20 22 66 22 2c 20 20 20 20 20 20 20 20 20 20 31   "f",          1
6dd0: 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20  , "text/plain"  
6de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6df0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6e00: 66 39 30 22 2c 20 20 20 20 20 20 20 20 33 2c 20  f90",        3, 
6e10: 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20  "text/plain"    
6e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e30: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66 6c      },.    { "fl
6e40: 69 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76  i",        3, "v
6e50: 69 64 65 6f 2f 66 6c 69 22 20 20 20 20 20 20 20  ideo/fli"       
6e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e70: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66 6c 76 22    },.    { "flv"
6e80: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64  ,        3, "vid
6e90: 65 6f 2f 66 6c 76 22 20 20 20 20 20 20 20 20 20  eo/flv"         
6ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6eb0: 7d 2c 0a 20 20 20 20 7b 20 22 67 69 66 22 2c 20  },.    { "gif", 
6ec0: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
6ed0: 2f 67 69 66 22 20 20 20 20 20 20 20 20 20 20 20  /gif"           
6ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6ef0: 0a 20 20 20 20 7b 20 22 67 6c 22 2c 20 20 20 20  .    { "gl",    
6f00: 20 20 20 20 20 32 2c 20 22 76 69 64 65 6f 2f 67       2, "video/g
6f10: 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l"              
6f20: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6f30: 20 20 20 7b 20 22 67 74 61 72 22 2c 20 20 20 20     { "gtar",    
6f40: 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69     4, "applicati
6f50: 6f 6e 2f 78 2d 67 74 61 72 22 20 20 20 20 20 20  on/x-gtar"      
6f60: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6f70: 20 7b 20 22 67 7a 22 2c 20 20 20 20 20 20 20 20   { "gz",        
6f80: 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   2, "application
6f90: 2f 78 2d 67 7a 69 70 22 20 20 20 20 20 20 20 20  /x-gzip"        
6fa0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6fb0: 20 22 68 64 66 22 2c 20 20 20 20 20 20 20 20 33   "hdf",        3
6fc0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
6fd0: 2d 68 64 66 22 20 20 20 20 20 20 20 20 20 20 20  -hdf"           
6fe0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6ff0: 68 68 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  hh",         2, 
7000: 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20  "text/plain"    
7010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7020: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68 71      },.    { "hq
7030: 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  x",        3, "a
7040: 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 61 63 2d 62  pplication/mac-b
7050: 69 6e 68 65 78 34 30 22 20 20 20 20 20 20 20 20  inhex40"        
7060: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68 22 2c 20    },.    { "h", 
7070: 20 20 20 20 20 20 20 20 20 31 2c 20 22 74 65 78           1, "tex
7080: 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20  t/plain"        
7090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70a0: 7d 2c 0a 20 20 20 20 7b 20 22 68 74 6d 22 2c 20  },.    { "htm", 
70b0: 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f         3, "text/
70c0: 68 74 6d 6c 3b 20 63 68 61 72 73 65 74 3d 75 74  html; charset=ut
70d0: 66 2d 38 22 20 20 20 20 20 20 20 20 20 20 7d 2c  f-8"          },
70e0: 0a 20 20 20 20 7b 20 22 68 74 6d 6c 22 2c 20 20  .    { "html",  
70f0: 20 20 20 20 20 34 2c 20 22 74 65 78 74 2f 68 74       4, "text/ht
7100: 6d 6c 3b 20 63 68 61 72 73 65 74 3d 75 74 66 2d  ml; charset=utf-
7110: 38 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  8"          },. 
7120: 20 20 20 7b 20 22 69 63 65 22 2c 20 20 20 20 20     { "ice",     
7130: 20 20 20 33 2c 20 22 78 2d 63 6f 6e 66 65 72 65     3, "x-confere
7140: 6e 63 65 2f 78 2d 63 6f 6f 6c 74 61 6c 6b 22 20  nce/x-cooltalk" 
7150: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7160: 20 7b 20 22 69 65 66 22 2c 20 20 20 20 20 20 20   { "ief",       
7170: 20 33 2c 20 22 69 6d 61 67 65 2f 69 65 66 22 20   3, "image/ief" 
7180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7190: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
71a0: 20 22 69 67 65 73 22 2c 20 20 20 20 20 20 20 34   "iges",       4
71b0: 2c 20 22 6d 6f 64 65 6c 2f 69 67 65 73 22 20 20  , "model/iges"  
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71d0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
71e0: 69 67 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20  igs",        3, 
71f0: 22 6d 6f 64 65 6c 2f 69 67 65 73 22 20 20 20 20  "model/iges"    
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7210: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 70      },.    { "ip
7220: 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  s",        3, "a
7230: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 69 70 73  pplication/x-ips
7240: 63 72 69 70 74 22 20 20 20 20 20 20 20 20 20 20  cript"          
7250: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 70 78 22    },.    { "ipx"
7260: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
7270: 6c 69 63 61 74 69 6f 6e 2f 78 2d 69 70 69 78 22  lication/x-ipix"
7280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7290: 7d 2c 0a 20 20 20 20 7b 20 22 6a 61 64 22 2c 20  },.    { "jad", 
72a0: 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f         3, "text/
72b0: 76 6e 64 2e 73 75 6e 2e 6a 32 6d 65 2e 61 70 70  vnd.sun.j2me.app
72c0: 2d 64 65 73 63 72 69 70 74 6f 72 22 20 20 7d 2c  -descriptor"  },
72d0: 0a 20 20 20 20 7b 20 22 6a 61 72 22 2c 20 20 20  .    { "jar",   
72e0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
72f0: 74 69 6f 6e 2f 6a 61 76 61 2d 61 72 63 68 69 76  tion/java-archiv
7300: 65 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  e"          },. 
7310: 20 20 20 7b 20 22 6a 70 65 67 22 2c 20 20 20 20     { "jpeg",    
7320: 20 20 20 34 2c 20 22 69 6d 61 67 65 2f 6a 70 65     4, "image/jpe
7330: 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g"              
7340: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7350: 20 7b 20 22 6a 70 65 22 2c 20 20 20 20 20 20 20   { "jpe",       
7360: 20 33 2c 20 22 69 6d 61 67 65 2f 6a 70 65 67 22   3, "image/jpeg"
7370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7380: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7390: 20 22 6a 70 67 22 2c 20 20 20 20 20 20 20 20 33   "jpg",        3
73a0: 2c 20 22 69 6d 61 67 65 2f 6a 70 65 67 22 20 20  , "image/jpeg"  
73b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73c0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
73d0: 6a 73 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  js",         2, 
73e0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6a  "application/x-j
73f0: 61 76 61 73 63 72 69 70 74 22 20 20 20 20 20 20  avascript"      
7400: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6b 61      },.    { "ka
7410: 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  r",        3, "a
7420: 75 64 69 6f 2f 6d 69 64 69 22 20 20 20 20 20 20  udio/midi"      
7430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7440: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 61 74 65    },.    { "late
7450: 78 22 2c 20 20 20 20 20 20 35 2c 20 22 61 70 70  x",      5, "app
7460: 6c 69 63 61 74 69 6f 6e 2f 78 2d 6c 61 74 65 78  lication/x-latex
7470: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
7480: 7d 2c 0a 20 20 20 20 7b 20 22 6c 68 61 22 2c 20  },.    { "lha", 
7490: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
74a0: 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72  cation/octet-str
74b0: 65 61 6d 22 20 20 20 20 20 20 20 20 20 20 7d 2c  eam"          },
74c0: 0a 20 20 20 20 7b 20 22 6c 73 70 22 2c 20 20 20  .    { "lsp",   
74d0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
74e0: 74 69 6f 6e 2f 78 2d 6c 69 73 70 22 20 20 20 20  tion/x-lisp"    
74f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7500: 20 20 20 7b 20 22 6c 7a 68 22 2c 20 20 20 20 20     { "lzh",     
7510: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
7520: 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22  on/octet-stream"
7530: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7540: 20 7b 20 22 6d 22 2c 20 20 20 20 20 20 20 20 20   { "m",         
7550: 20 31 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22   1, "text/plain"
7560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7570: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7580: 20 22 6d 33 75 22 2c 20 20 20 20 20 20 20 20 33   "m3u",        3
7590: 2c 20 22 61 75 64 69 6f 2f 78 2d 6d 70 65 67 75  , "audio/x-mpegu
75a0: 72 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20  rl"             
75b0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
75c0: 6d 61 6e 22 2c 20 20 20 20 20 20 20 20 33 2c 20  man",        3, 
75d0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74  "application/x-t
75e0: 72 6f 66 66 2d 6d 61 6e 22 20 20 20 20 20 20 20  roff-man"       
75f0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 65      },.    { "me
7600: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61  ",         2, "a
7610: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72 6f  pplication/x-tro
7620: 66 66 2d 6d 65 22 20 20 20 20 20 20 20 20 20 20  ff-me"          
7630: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 65 73 68    },.    { "mesh
7640: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 6d 6f 64  ",       4, "mod
7650: 65 6c 2f 6d 65 73 68 22 20 20 20 20 20 20 20 20  el/mesh"        
7660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7670: 7d 2c 0a 20 20 20 20 7b 20 22 6d 69 64 22 2c 20  },.    { "mid", 
7680: 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f         3, "audio
7690: 2f 6d 69 64 69 22 20 20 20 20 20 20 20 20 20 20  /midi"          
76a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
76b0: 0a 20 20 20 20 7b 20 22 6d 69 64 69 22 2c 20 20  .    { "midi",  
76c0: 20 20 20 20 20 34 2c 20 22 61 75 64 69 6f 2f 6d       4, "audio/m
76d0: 69 64 69 22 20 20 20 20 20 20 20 20 20 20 20 20  idi"            
76e0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
76f0: 20 20 20 7b 20 22 6d 69 66 22 2c 20 20 20 20 20     { "mif",     
7700: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
7710: 6f 6e 2f 78 2d 6d 69 66 22 20 20 20 20 20 20 20  on/x-mif"       
7720: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7730: 20 7b 20 22 6d 69 6d 65 22 2c 20 20 20 20 20 20   { "mime",      
7740: 20 34 2c 20 22 77 77 77 2f 6d 69 6d 65 22 20 20   4, "www/mime"  
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7760: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7770: 20 22 6d 6f 76 69 65 22 2c 20 20 20 20 20 20 35   "movie",      5
7780: 2c 20 22 76 69 64 65 6f 2f 78 2d 73 67 69 2d 6d  , "video/x-sgi-m
7790: 6f 76 69 65 22 20 20 20 20 20 20 20 20 20 20 20  ovie"           
77a0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
77b0: 6d 6f 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20  mov",        3, 
77c0: 22 76 69 64 65 6f 2f 71 75 69 63 6b 74 69 6d 65  "video/quicktime
77d0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
77e0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70      },.    { "mp
77f0: 32 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  2",        3, "a
7800: 75 64 69 6f 2f 6d 70 65 67 22 20 20 20 20 20 20  udio/mpeg"      
7810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7820: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 32 22    },.    { "mp2"
7830: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64  ,        3, "vid
7840: 65 6f 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20  eo/mpeg"        
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7860: 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 33 22 2c 20  },.    { "mp3", 
7870: 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f         3, "audio
7880: 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20 20 20  /mpeg"          
7890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
78a0: 0a 20 20 20 20 7b 20 22 6d 70 65 67 22 2c 20 20  .    { "mpeg",  
78b0: 20 20 20 20 20 34 2c 20 22 76 69 64 65 6f 2f 6d       4, "video/m
78c0: 70 65 67 22 20 20 20 20 20 20 20 20 20 20 20 20  peg"            
78d0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
78e0: 20 20 20 7b 20 22 6d 70 65 22 2c 20 20 20 20 20     { "mpe",     
78f0: 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 6d 70 65     3, "video/mpe
7900: 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g"              
7910: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7920: 20 7b 20 22 6d 70 67 61 22 2c 20 20 20 20 20 20   { "mpga",      
7930: 20 34 2c 20 22 61 75 64 69 6f 2f 6d 70 65 67 22   4, "audio/mpeg"
7940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7950: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7960: 20 22 6d 70 67 22 2c 20 20 20 20 20 20 20 20 33   "mpg",        3
7970: 2c 20 22 76 69 64 65 6f 2f 6d 70 65 67 22 20 20  , "video/mpeg"  
7980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7990: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
79a0: 6d 73 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  ms",         2, 
79b0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74  "application/x-t
79c0: 72 6f 66 66 2d 6d 73 22 20 20 20 20 20 20 20 20  roff-ms"        
79d0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 73      },.    { "ms
79e0: 68 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 6d  h",        3, "m
79f0: 6f 64 65 6c 2f 6d 65 73 68 22 20 20 20 20 20 20  odel/mesh"      
7a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a10: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 63 22 2c    },.    { "nc",
7a20: 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70 70           2, "app
7a30: 6c 69 63 61 74 69 6f 6e 2f 78 2d 6e 65 74 63 64  lication/x-netcd
7a40: 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f"              
7a50: 7d 2c 0a 20 20 20 20 7b 20 22 6f 64 61 22 2c 20  },.    { "oda", 
7a60: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
7a70: 63 61 74 69 6f 6e 2f 6f 64 61 22 20 20 20 20 20  cation/oda"     
7a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7a90: 0a 20 20 20 20 7b 20 22 6f 67 67 22 2c 20 20 20  .    { "ogg",   
7aa0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
7ab0: 74 69 6f 6e 2f 6f 67 67 22 20 20 20 20 20 20 20  tion/ogg"       
7ac0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7ad0: 20 20 20 7b 20 22 6f 67 6d 22 2c 20 20 20 20 20     { "ogm",     
7ae0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
7af0: 6f 6e 2f 6f 67 67 22 20 20 20 20 20 20 20 20 20  on/ogg"         
7b00: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7b10: 20 7b 20 22 70 62 6d 22 2c 20 20 20 20 20 20 20   { "pbm",       
7b20: 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 70 6f 72   3, "image/x-por
7b30: 74 61 62 6c 65 2d 62 69 74 6d 61 70 22 20 20 20  table-bitmap"   
7b40: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7b50: 20 22 70 64 62 22 2c 20 20 20 20 20 20 20 20 33   "pdb",        3
7b60: 2c 20 22 63 68 65 6d 69 63 61 6c 2f 78 2d 70 64  , "chemical/x-pd
7b70: 62 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b"              
7b80: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7b90: 70 64 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20  pdf",        3, 
7ba0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 64 66  "application/pdf
7bb0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
7bc0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 67      },.    { "pg
7bd0: 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69  m",        3, "i
7be0: 6d 61 67 65 2f 78 2d 70 6f 72 74 61 62 6c 65 2d  mage/x-portable-
7bf0: 67 72 61 79 6d 61 70 22 20 20 20 20 20 20 20 20  graymap"        
7c00: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 67 6e 22    },.    { "pgn"
7c10: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
7c20: 6c 69 63 61 74 69 6f 6e 2f 78 2d 63 68 65 73 73  lication/x-chess
7c30: 2d 70 67 6e 22 20 20 20 20 20 20 20 20 20 20 20  -pgn"           
7c40: 7d 2c 0a 20 20 20 20 7b 20 22 70 67 70 22 2c 20  },.    { "pgp", 
7c50: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
7c60: 63 61 74 69 6f 6e 2f 70 67 70 22 20 20 20 20 20  cation/pgp"     
7c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7c80: 0a 20 20 20 20 7b 20 22 70 6c 22 2c 20 20 20 20  .    { "pl",    
7c90: 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61       2, "applica
7ca0: 74 69 6f 6e 2f 78 2d 70 65 72 6c 22 20 20 20 20  tion/x-perl"    
7cb0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7cc0: 20 20 20 7b 20 22 70 6d 22 2c 20 20 20 20 20 20     { "pm",      
7cd0: 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69     2, "applicati
7ce0: 6f 6e 2f 78 2d 70 65 72 6c 22 20 20 20 20 20 20  on/x-perl"      
7cf0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7d00: 20 7b 20 22 70 6e 67 22 2c 20 20 20 20 20 20 20   { "png",       
7d10: 20 33 2c 20 22 69 6d 61 67 65 2f 70 6e 67 22 20   3, "image/png" 
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d30: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7d40: 20 22 70 6e 6d 22 2c 20 20 20 20 20 20 20 20 33   "pnm",        3
7d50: 2c 20 22 69 6d 61 67 65 2f 78 2d 70 6f 72 74 61  , "image/x-porta
7d60: 62 6c 65 2d 61 6e 79 6d 61 70 22 20 20 20 20 20  ble-anymap"     
7d70: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7d80: 70 6f 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20  pot",        3, 
7d90: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 70  "application/msp
7da0: 6f 77 65 72 70 6f 69 6e 74 22 20 20 20 20 20 20  owerpoint"      
7db0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 70      },.    { "pp
7dc0: 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69  m",        3, "i
7dd0: 6d 61 67 65 2f 78 2d 70 6f 72 74 61 62 6c 65 2d  mage/x-portable-
7de0: 70 69 78 6d 61 70 22 20 20 20 20 20 20 20 20 20  pixmap"         
7df0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 70 73 22    },.    { "pps"
7e00: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
7e10: 6c 69 63 61 74 69 6f 6e 2f 6d 73 70 6f 77 65 72  lication/mspower
7e20: 70 6f 69 6e 74 22 20 20 20 20 20 20 20 20 20 20  point"          
7e30: 7d 2c 0a 20 20 20 20 7b 20 22 70 70 74 22 2c 20  },.    { "ppt", 
7e40: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
7e50: 63 61 74 69 6f 6e 2f 6d 73 70 6f 77 65 72 70 6f  cation/mspowerpo
7e60: 69 6e 74 22 20 20 20 20 20 20 20 20 20 20 7d 2c  int"          },
7e70: 0a 20 20 20 20 7b 20 22 70 70 7a 22 2c 20 20 20  .    { "ppz",   
7e80: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
7e90: 74 69 6f 6e 2f 6d 73 70 6f 77 65 72 70 6f 69 6e  tion/mspowerpoin
7ea0: 74 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  t"          },. 
7eb0: 20 20 20 7b 20 22 70 72 65 22 2c 20 20 20 20 20     { "pre",     
7ec0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
7ed0: 6f 6e 2f 78 2d 66 72 65 65 6c 61 6e 63 65 22 20  on/x-freelance" 
7ee0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7ef0: 20 7b 20 22 70 72 74 22 2c 20 20 20 20 20 20 20   { "prt",       
7f00: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
7f10: 2f 70 72 6f 5f 65 6e 67 22 20 20 20 20 20 20 20  /pro_eng"       
7f20: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7f30: 20 22 70 73 22 2c 20 20 20 20 20 20 20 20 20 32   "ps",         2
7f40: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70  , "application/p
7f50: 6f 73 74 73 63 72 69 70 74 22 20 20 20 20 20 20  ostscript"      
7f60: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7f70: 71 74 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  qt",         2, 
7f80: 22 76 69 64 65 6f 2f 71 75 69 63 6b 74 69 6d 65  "video/quicktime
7f90: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
7fa0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61      },.    { "ra
7fb0: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61  ",         2, "a
7fc0: 75 64 69 6f 2f 78 2d 72 65 61 6c 61 75 64 69 6f  udio/x-realaudio
7fd0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
7fe0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61 6d 22    },.    { "ram"
7ff0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64  ,        3, "aud
8000: 69 6f 2f 78 2d 70 6e 2d 72 65 61 6c 61 75 64 69  io/x-pn-realaudi
8010: 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o"              
8020: 7d 2c 0a 20 20 20 20 7b 20 22 72 61 72 22 2c 20  },.    { "rar", 
8030: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
8040: 63 61 74 69 6f 6e 2f 78 2d 72 61 72 2d 63 6f 6d  cation/x-rar-com
8050: 70 72 65 73 73 65 64 22 20 20 20 20 20 20 7d 2c  pressed"      },
8060: 0a 20 20 20 20 7b 20 22 72 61 73 22 2c 20 20 20  .    { "ras",   
8070: 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 63       3, "image/c
8080: 6d 75 2d 72 61 73 74 65 72 22 20 20 20 20 20 20  mu-raster"      
8090: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
80a0: 20 20 20 7b 20 22 72 61 73 22 2c 20 20 20 20 20     { "ras",     
80b0: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 63     3, "image/x-c
80c0: 6d 75 2d 72 61 73 74 65 72 22 20 20 20 20 20 20  mu-raster"      
80d0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
80e0: 20 7b 20 22 72 67 62 22 2c 20 20 20 20 20 20 20   { "rgb",       
80f0: 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 72 67 62   3, "image/x-rgb
8100: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8110: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8120: 20 22 72 6d 22 2c 20 20 20 20 20 20 20 20 20 32   "rm",         2
8130: 2c 20 22 61 75 64 69 6f 2f 78 2d 70 6e 2d 72 65  , "audio/x-pn-re
8140: 61 6c 61 75 64 69 6f 22 20 20 20 20 20 20 20 20  alaudio"        
8150: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8160: 72 6f 66 66 22 2c 20 20 20 20 20 20 20 34 2c 20  roff",       4, 
8170: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74  "application/x-t
8180: 72 6f 66 66 22 20 20 20 20 20 20 20 20 20 20 20  roff"           
8190: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 70      },.    { "rp
81a0: 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  m",        3, "a
81b0: 75 64 69 6f 2f 78 2d 70 6e 2d 72 65 61 6c 61 75  udio/x-pn-realau
81c0: 64 69 6f 2d 70 6c 75 67 69 6e 22 20 20 20 20 20  dio-plugin"     
81d0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 74 66 22    },.    { "rtf"
81e0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
81f0: 6c 69 63 61 74 69 6f 6e 2f 72 74 66 22 20 20 20  lication/rtf"   
8200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8210: 7d 2c 0a 20 20 20 20 7b 20 22 72 74 66 22 2c 20  },.    { "rtf", 
8220: 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f         3, "text/
8230: 72 74 66 22 20 20 20 20 20 20 20 20 20 20 20 20  rtf"            
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8250: 0a 20 20 20 20 7b 20 22 72 74 78 22 2c 20 20 20  .    { "rtx",   
8260: 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 72 69       3, "text/ri
8270: 63 68 74 65 78 74 22 20 20 20 20 20 20 20 20 20  chtext"         
8280: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8290: 20 20 20 7b 20 22 73 63 6d 22 2c 20 20 20 20 20     { "scm",     
82a0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
82b0: 6f 6e 2f 78 2d 6c 6f 74 75 73 73 63 72 65 65 6e  on/x-lotusscreen
82c0: 63 61 6d 22 20 20 20 20 20 20 7d 2c 0a 20 20 20  cam"      },.   
82d0: 20 7b 20 22 73 65 74 22 2c 20 20 20 20 20 20 20   { "set",       
82e0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
82f0: 2f 73 65 74 22 20 20 20 20 20 20 20 20 20 20 20  /set"           
8300: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8310: 20 22 73 67 6d 6c 22 2c 20 20 20 20 20 20 20 34   "sgml",       4
8320: 2c 20 22 74 65 78 74 2f 73 67 6d 6c 22 20 20 20  , "text/sgml"   
8330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8340: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8350: 73 67 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20  sgm",        3, 
8360: 22 74 65 78 74 2f 73 67 6d 6c 22 20 20 20 20 20  "text/sgml"     
8370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8380: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 68      },.    { "sh
8390: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61  ",         2, "a
83a0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 68 22  pplication/x-sh"
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83c0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 68 61 72    },.    { "shar
83d0: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70 70  ",       4, "app
83e0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 68 61 72 22  lication/x-shar"
83f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8400: 7d 2c 0a 20 20 20 20 7b 20 22 73 69 6c 6f 22 2c  },.    { "silo",
8410: 20 20 20 20 20 20 20 34 2c 20 22 6d 6f 64 65 6c         4, "model
8420: 2f 6d 65 73 68 22 20 20 20 20 20 20 20 20 20 20  /mesh"          
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8440: 0a 20 20 20 20 7b 20 22 73 69 74 22 2c 20 20 20  .    { "sit",   
8450: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
8460: 74 69 6f 6e 2f 78 2d 73 74 75 66 66 69 74 22 20  tion/x-stuffit" 
8470: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8480: 20 20 20 7b 20 22 73 6b 64 22 2c 20 20 20 20 20     { "skd",     
8490: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
84a0: 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20 20 20 20  on/x-koan"      
84b0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
84c0: 20 7b 20 22 73 6b 6d 22 2c 20 20 20 20 20 20 20   { "skm",       
84d0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
84e0: 2f 78 2d 6b 6f 61 6e 22 20 20 20 20 20 20 20 20  /x-koan"        
84f0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8500: 20 22 73 6b 70 22 2c 20 20 20 20 20 20 20 20 33   "skp",        3
8510: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
8520: 2d 6b 6f 61 6e 22 20 20 20 20 20 20 20 20 20 20  -koan"          
8530: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8540: 73 6b 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20  skt",        3, 
8550: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6b  "application/x-k
8560: 6f 61 6e 22 20 20 20 20 20 20 20 20 20 20 20 20  oan"            
8570: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d      },.    { "sm
8580: 69 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  i",        3, "a
8590: 70 70 6c 69 63 61 74 69 6f 6e 2f 73 6d 69 6c 22  pplication/smil"
85a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85b0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 69 6c    },.    { "smil
85c0: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70 70  ",       4, "app
85d0: 6c 69 63 61 74 69 6f 6e 2f 73 6d 69 6c 22 20 20  lication/smil"  
85e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85f0: 7d 2c 0a 20 20 20 20 7b 20 22 73 6e 64 22 2c 20  },.    { "snd", 
8600: 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f         3, "audio
8610: 2f 62 61 73 69 63 22 20 20 20 20 20 20 20 20 20  /basic"         
8620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8630: 0a 20 20 20 20 7b 20 22 73 6f 6c 22 2c 20 20 20  .    { "sol",   
8640: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
8650: 74 69 6f 6e 2f 73 6f 6c 69 64 73 22 20 20 20 20  tion/solids"    
8660: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8670: 20 20 20 7b 20 22 73 70 6c 22 2c 20 20 20 20 20     { "spl",     
8680: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
8690: 6f 6e 2f 78 2d 66 75 74 75 72 65 73 70 6c 61 73  on/x-futuresplas
86a0: 68 22 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  h"        },.   
86b0: 20 7b 20 22 73 72 63 22 2c 20 20 20 20 20 20 20   { "src",       
86c0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
86d0: 2f 78 2d 77 61 69 73 2d 73 6f 75 72 63 65 22 20  /x-wais-source" 
86e0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
86f0: 20 22 73 74 65 70 22 2c 20 20 20 20 20 20 20 34   "step",       4
8700: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 53  , "application/S
8710: 54 45 50 22 20 20 20 20 20 20 20 20 20 20 20 20  TEP"            
8720: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8730: 73 74 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20  stl",        3, 
8740: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 53 4c 41  "application/SLA
8750: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8760: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 74      },.    { "st
8770: 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  p",        3, "a
8780: 70 70 6c 69 63 61 74 69 6f 6e 2f 53 54 45 50 22  pplication/STEP"
8790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87a0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 76 34 63    },.    { "sv4c
87b0: 70 69 6f 22 2c 20 20 20 20 37 2c 20 22 61 70 70  pio",    7, "app
87c0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 76 34 63 70  lication/x-sv4cp
87d0: 69 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20  io"             
87e0: 7d 2c 0a 20 20 20 20 7b 20 22 73 76 34 63 72 63  },.    { "sv4crc
87f0: 22 2c 20 20 20 20 20 36 2c 20 22 61 70 70 6c 69  ",     6, "appli
8800: 63 61 74 69 6f 6e 2f 78 2d 73 76 34 63 72 63 22  cation/x-sv4crc"
8810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8820: 0a 20 20 20 20 7b 20 22 73 77 66 22 2c 20 20 20  .    { "swf",   
8830: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
8840: 74 69 6f 6e 2f 78 2d 73 68 6f 63 6b 77 61 76 65  tion/x-shockwave
8850: 2d 66 6c 61 73 68 22 20 20 20 20 20 7d 2c 0a 20  -flash"     },. 
8860: 20 20 20 7b 20 22 74 22 2c 20 20 20 20 20 20 20     { "t",       
8870: 20 20 20 31 2c 20 22 61 70 70 6c 69 63 61 74 69     1, "applicati
8880: 6f 6e 2f 78 2d 74 72 6f 66 66 22 20 20 20 20 20  on/x-troff"     
8890: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
88a0: 20 7b 20 22 74 61 72 22 2c 20 20 20 20 20 20 20   { "tar",       
88b0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
88c0: 2f 78 2d 74 61 72 22 20 20 20 20 20 20 20 20 20  /x-tar"         
88d0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
88e0: 20 22 74 63 6c 22 2c 20 20 20 20 20 20 20 20 33   "tcl",        3
88f0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
8900: 2d 74 63 6c 22 20 20 20 20 20 20 20 20 20 20 20  -tcl"           
8910: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8920: 74 65 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20  tex",        3, 
8930: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74  "application/x-t
8940: 65 78 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ex"             
8950: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 65      },.    { "te
8960: 78 69 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61  xi",       4, "a
8970: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 65 78  pplication/x-tex
8980: 69 6e 66 6f 22 20 20 20 20 20 20 20 20 20 20 20  info"           
8990: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 65 78 69    },.    { "texi
89a0: 6e 66 6f 22 2c 20 20 20 20 37 2c 20 22 61 70 70  nfo",    7, "app
89b0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 65 78 69 6e  lication/x-texin
89c0: 66 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20  fo"             
89d0: 7d 2c 0a 20 20 20 20 7b 20 22 74 67 7a 22 2c 20  },.    { "tgz", 
89e0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
89f0: 63 61 74 69 6f 6e 2f 78 2d 74 61 72 2d 67 7a 22  cation/x-tar-gz"
8a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8a10: 0a 20 20 20 20 7b 20 22 74 69 66 66 22 2c 20 20  .    { "tiff",  
8a20: 20 20 20 20 20 34 2c 20 22 69 6d 61 67 65 2f 74       4, "image/t
8a30: 69 66 66 22 20 20 20 20 20 20 20 20 20 20 20 20  iff"            
8a40: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8a50: 20 20 20 7b 20 22 74 69 66 22 2c 20 20 20 20 20     { "tif",     
8a60: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 74 69 66     3, "image/tif
8a70: 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f"              
8a80: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8a90: 20 7b 20 22 74 72 22 2c 20 20 20 20 20 20 20 20   { "tr",        
8aa0: 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   2, "application
8ab0: 2f 78 2d 74 72 6f 66 66 22 20 20 20 20 20 20 20  /x-troff"       
8ac0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8ad0: 20 22 74 73 69 22 2c 20 20 20 20 20 20 20 20 33   "tsi",        3
8ae0: 2c 20 22 61 75 64 69 6f 2f 54 53 50 2d 61 75 64  , "audio/TSP-aud
8af0: 69 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20  io"             
8b00: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8b10: 74 73 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20  tsp",        3, 
8b20: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 64 73 70  "application/dsp
8b30: 74 79 70 65 22 20 20 20 20 20 20 20 20 20 20 20  type"           
8b40: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 73      },.    { "ts
8b50: 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74  v",        3, "t
8b60: 65 78 74 2f 74 61 62 2d 73 65 70 61 72 61 74 65  ext/tab-separate
8b70: 64 2d 76 61 6c 75 65 73 22 20 20 20 20 20 20 20  d-values"       
8b80: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 78 74 22    },.    { "txt"
8b90: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65 78  ,        3, "tex
8ba0: 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20  t/plain"        
8bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bc0: 7d 2c 0a 20 20 20 20 7b 20 22 75 6e 76 22 2c 20  },.    { "unv", 
8bd0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
8be0: 63 61 74 69 6f 6e 2f 69 2d 64 65 61 73 22 20 20  cation/i-deas"  
8bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8c00: 0a 20 20 20 20 7b 20 22 75 73 74 61 72 22 2c 20  .    { "ustar", 
8c10: 20 20 20 20 20 35 2c 20 22 61 70 70 6c 69 63 61       5, "applica
8c20: 74 69 6f 6e 2f 78 2d 75 73 74 61 72 22 20 20 20  tion/x-ustar"   
8c30: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8c40: 20 20 20 7b 20 22 76 63 64 22 2c 20 20 20 20 20     { "vcd",     
8c50: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
8c60: 6f 6e 2f 78 2d 63 64 6c 69 6e 6b 22 20 20 20 20  on/x-cdlink"    
8c70: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8c80: 20 7b 20 22 76 64 61 22 2c 20 20 20 20 20 20 20   { "vda",       
8c90: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
8ca0: 2f 76 64 61 22 20 20 20 20 20 20 20 20 20 20 20  /vda"           
8cb0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8cc0: 20 22 76 69 76 22 2c 20 20 20 20 20 20 20 20 33   "viv",        3
8cd0: 2c 20 22 76 69 64 65 6f 2f 76 6e 64 2e 76 69 76  , "video/vnd.viv
8ce0: 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o"              
8cf0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8d00: 76 69 76 6f 22 2c 20 20 20 20 20 20 20 34 2c 20  vivo",       4, 
8d10: 22 76 69 64 65 6f 2f 76 6e 64 2e 76 69 76 6f 22  "video/vnd.vivo"
8d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d30: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 76 72      },.    { "vr
8d40: 6d 6c 22 2c 20 20 20 20 20 20 20 34 2c 20 22 6d  ml",       4, "m
8d50: 6f 64 65 6c 2f 76 72 6d 6c 22 20 20 20 20 20 20  odel/vrml"      
8d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d70: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 76 73 69 78    },.    { "vsix
8d80: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70 70  ",       4, "app
8d90: 6c 69 63 61 74 69 6f 6e 2f 76 73 69 78 22 20 20  lication/vsix"  
8da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8db0: 7d 2c 0a 20 20 20 20 7b 20 22 77 61 76 22 2c 20  },.    { "wav", 
8dc0: 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f         3, "audio
8dd0: 2f 78 2d 77 61 76 22 20 20 20 20 20 20 20 20 20  /x-wav"         
8de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8df0: 0a 20 20 20 20 7b 20 22 77 61 78 22 2c 20 20 20  .    { "wax",   
8e00: 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 78       3, "audio/x
8e10: 2d 6d 73 2d 77 61 78 22 20 20 20 20 20 20 20 20  -ms-wax"        
8e20: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8e30: 20 20 20 7b 20 22 77 69 6b 69 22 2c 20 20 20 20     { "wiki",    
8e40: 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69     4, "applicati
8e50: 6f 6e 2f 78 2d 66 6f 73 73 69 6c 2d 77 69 6b 69  on/x-fossil-wiki
8e60: 22 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  "         },.   
8e70: 20 7b 20 22 77 6d 61 22 2c 20 20 20 20 20 20 20   { "wma",       
8e80: 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 6d 73 2d   3, "audio/x-ms-
8e90: 77 6d 61 22 20 20 20 20 20 20 20 20 20 20 20 20  wma"            
8ea0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8eb0: 20 22 77 6d 76 22 2c 20 20 20 20 20 20 20 20 33   "wmv",        3
8ec0: 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 77 6d  , "video/x-ms-wm
8ed0: 76 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v"              
8ee0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8ef0: 77 6d 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20  wmx",        3, 
8f00: 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 77 6d 78 22  "video/x-ms-wmx"
8f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f20: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 72      },.    { "wr
8f30: 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 6d  l",        3, "m
8f40: 6f 64 65 6c 2f 76 72 6d 6c 22 20 20 20 20 20 20  odel/vrml"      
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f60: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 76 78 22    },.    { "wvx"
8f70: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64  ,        3, "vid
8f80: 65 6f 2f 78 2d 6d 73 2d 77 76 78 22 20 20 20 20  eo/x-ms-wvx"    
8f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fa0: 7d 2c 0a 20 20 20 20 7b 20 22 78 62 6d 22 2c 20  },.    { "xbm", 
8fb0: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
8fc0: 2f 78 2d 78 62 69 74 6d 61 70 22 20 20 20 20 20  /x-xbitmap"     
8fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8fe0: 0a 20 20 20 20 7b 20 22 78 6c 63 22 2c 20 20 20  .    { "xlc",   
8ff0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
9000: 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65  tion/vnd.ms-exce
9010: 6c 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  l"          },. 
9020: 20 20 20 7b 20 22 78 6c 6c 22 2c 20 20 20 20 20     { "xll",     
9030: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
9040: 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22  on/vnd.ms-excel"
9050: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9060: 20 7b 20 22 78 6c 6d 22 2c 20 20 20 20 20 20 20   { "xlm",       
9070: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
9080: 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20 20  /vnd.ms-excel"  
9090: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
90a0: 20 22 78 6c 73 22 2c 20 20 20 20 20 20 20 20 33   "xls",        3
90b0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76  , "application/v
90c0: 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20 20 20 20  nd.ms-excel"    
90d0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
90e0: 78 6c 77 22 2c 20 20 20 20 20 20 20 20 33 2c 20  xlw",        3, 
90f0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76 6e 64  "application/vnd
9100: 2e 6d 73 2d 65 78 63 65 6c 22 20 20 20 20 20 20  .ms-excel"      
9110: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 6d      },.    { "xm
9120: 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74  l",        3, "t
9130: 65 78 74 2f 78 6d 6c 22 20 20 20 20 20 20 20 20  ext/xml"        
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9150: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 70 6d 22    },.    { "xpm"
9160: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61  ,        3, "ima
9170: 67 65 2f 78 2d 78 70 69 78 6d 61 70 22 20 20 20  ge/x-xpixmap"   
9180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9190: 7d 2c 0a 20 20 20 20 7b 20 22 78 77 64 22 2c 20  },.    { "xwd", 
91a0: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
91b0: 2f 78 2d 78 77 69 6e 64 6f 77 64 75 6d 70 22 20  /x-xwindowdump" 
91c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
91d0: 0a 20 20 20 20 7b 20 22 78 79 7a 22 2c 20 20 20  .    { "xyz",   
91e0: 20 20 20 20 20 33 2c 20 22 63 68 65 6d 69 63 61       3, "chemica
91f0: 6c 2f 78 2d 70 64 62 22 20 20 20 20 20 20 20 20  l/x-pdb"        
9200: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
9210: 20 20 20 7b 20 22 7a 69 70 22 2c 20 20 20 20 20     { "zip",     
9220: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
9230: 6f 6e 2f 7a 69 70 22 20 20 20 20 20 20 20 20 20  on/zip"         
9240: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d            },.  }
9250: 3b 0a 0a 20 20 66 6f 72 28 69 3d 6e 4e 61 6d 65  ;..  for(i=nName
9260: 2d 31 3b 20 69 3e 30 20 26 26 20 7a 4e 61 6d 65  -1; i>0 && zName
9270: 5b 69 5d 21 3d 27 2e 27 3b 20 69 2d 2d 29 7b 7d  [i]!='.'; i--){}
9280: 0a 20 20 7a 20 3d 20 26 7a 4e 61 6d 65 5b 69 2b  .  z = &zName[i+
9290: 31 5d 3b 0a 20 20 6c 65 6e 20 3d 20 6e 4e 61 6d  1];.  len = nNam
92a0: 65 20 2d 20 69 3b 0a 20 20 69 66 28 20 6c 65 6e  e - i;.  if( len
92b0: 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 7a 53 75  <(int)sizeof(zSu
92c0: 66 66 69 78 29 2d 31 20 29 7b 0a 20 20 20 20 73  ffix)-1 ){.    s
92d0: 74 72 63 70 79 28 7a 53 75 66 66 69 78 2c 20 7a  trcpy(zSuffix, z
92e0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
92f0: 7a 53 75 66 66 69 78 5b 69 5d 3b 20 69 2b 2b 29  zSuffix[i]; i++)
9300: 20 7a 53 75 66 66 69 78 5b 69 5d 20 3d 20 74 6f   zSuffix[i] = to
9310: 6c 6f 77 65 72 28 7a 53 75 66 66 69 78 5b 69 5d  lower(zSuffix[i]
9320: 29 3b 0a 20 20 20 20 66 69 72 73 74 20 3d 20 30  );.    first = 0
9330: 3b 0a 20 20 20 20 6c 61 73 74 20 3d 20 73 69 7a  ;.    last = siz
9340: 65 6f 66 28 61 4d 69 6d 65 29 2f 73 69 7a 65 6f  eof(aMime)/sizeo
9350: 66 28 61 4d 69 6d 65 5b 30 5d 29 3b 0a 20 20 20  f(aMime[0]);.   
9360: 20 77 68 69 6c 65 28 20 66 69 72 73 74 3c 3d 6c   while( first<=l
9370: 61 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ast ){.      int
9380: 20 63 3b 0a 20 20 20 20 20 20 69 20 3d 20 28 66   c;.      i = (f
9390: 69 72 73 74 2b 6c 61 73 74 29 2f 32 3b 0a 20 20  irst+last)/2;.  
93a0: 20 20 20 20 63 20 3d 20 73 74 72 63 6d 70 28 7a      c = strcmp(z
93b0: 53 75 66 66 69 78 2c 20 61 4d 69 6d 65 5b 69 5d  Suffix, aMime[i]
93c0: 2e 7a 53 75 66 66 69 78 29 3b 0a 20 20 20 20 20  .zSuffix);.     
93d0: 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74 75   if( c==0 ) retu
93e0: 72 6e 20 61 4d 69 6d 65 5b 69 5d 2e 7a 4d 69 6d  rn aMime[i].zMim
93f0: 65 74 79 70 65 3b 0a 20 20 20 20 20 20 69 66 28  etype;.      if(
9400: 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c<0 ){.        
9410: 6c 61 73 74 20 3d 20 69 2d 31 3b 0a 20 20 20 20  last = i-1;.    
9420: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9430: 20 66 69 72 73 74 20 3d 20 69 2b 31 3b 0a 20 20   first = i+1;.  
9440: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9450: 20 20 72 65 74 75 72 6e 20 22 61 70 70 6c 69 63    return "applic
9460: 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65  ation/octet-stre
9470: 61 6d 22 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  am";.}../*.** Th
9480: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
9490: 65 20 63 6f 6e 74 61 69 6e 73 20 31 20 66 6f 72  e contains 1 for
94a0: 20 61 6c 6c 20 63 68 61 72 61 63 74 65 72 73 20   all characters 
94b0: 74 68 61 74 20 61 72 65 20 70 65 72 6d 69 74 74  that are permitt
94c0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 70 61 72  ed in.** the par
94d0: 74 20 6f 66 20 74 68 65 20 55 52 4c 20 62 65 66  t of the URL bef
94e0: 6f 72 65 20 74 68 65 20 71 75 65 72 79 20 70 61  ore the query pa
94f0: 72 61 6d 65 74 65 72 73 20 61 6e 64 20 66 72 61  rameters and fra
9500: 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  gment..**.** All
9510: 6f 77 65 64 20 63 68 61 72 61 63 74 65 72 73 3a  owed characters:
9520: 20 20 30 2d 39 61 2d 7a 41 2d 5a 2c 2d 2e 2f 3a    0-9a-zA-Z,-./:
9530: 5f 7e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 6c 6c 6f  _~.**.** Disallo
9540: 77 65 64 20 63 68 61 72 61 63 74 65 72 73 20 69  wed characters i
9550: 6e 63 6c 75 64 65 3a 20 20 21 22 23 24 25 26 27  nclude:  !"#$%&'
9560: 28 29 2a 2b 3b 3c 3d 3e 3f 5b 5c 5d 5e 7b 7c 7d  ()*+;<=>?[\]^{|}
9570: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
9580: 20 63 68 61 72 20 61 6c 6c 6f 77 65 64 49 6e 4e   char allowedInN
9590: 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ame[] = {.      
95a0: 2f 2a 20 20 78 30 20 20 78 31 20 20 78 32 20 20  /*  x0  x1  x2  
95b0: 78 33 20 20 78 34 20 20 78 35 20 20 78 36 20 20  x3  x4  x5  x6  
95c0: 78 37 20 20 78 38 20 20 78 39 20 20 78 61 20 20  x7  x8  x9  xa  
95d0: 78 62 20 20 78 63 20 20 78 64 20 20 78 65 20 20  xb  xc  xd  xe  
95e0: 78 66 20 2a 2f 0a 2f 2a 20 30 78 20 2a 2f 20 20  xf */./* 0x */  
95f0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9600: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9610: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9620: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a   0,  0,  0,  0,.
9630: 2f 2a 20 31 78 20 2a 2f 20 20 20 30 2c 20 20 30  /* 1x */   0,  0
9640: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9650: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9660: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9670: 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 32 78 20  ,  0,  0,./* 2x 
9680: 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20  */   0,  0,  0, 
9690: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
96a0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
96b0: 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   0,  1,  1,  1, 
96c0: 20 31 2c 0a 2f 2a 20 33 78 20 2a 2f 20 20 20 31   1,./* 3x */   1
96d0: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
96e0: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
96f0: 2c 20 20 31 2c 20 20 31 2c 20 20 30 2c 20 20 30  ,  1,  1,  0,  0
9700: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a  ,  0,  0,  0,./*
9710: 20 34 78 20 2a 2f 20 20 20 30 2c 20 20 31 2c 20   4x */   0,  1, 
9720: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
9730: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
9740: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
9750: 20 31 2c 20 20 31 2c 0a 2f 2a 20 35 78 20 2a 2f   1,  1,./* 5x */
9760: 20 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31     1,  1,  1,  1
9770: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
9780: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 30  ,  1,  1,  1,  0
9790: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 31  ,  0,  0,  0,  1
97a0: 2c 0a 2f 2a 20 36 78 20 2a 2f 20 20 20 30 2c 20  ,./* 6x */   0, 
97b0: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
97c0: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
97d0: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
97e0: 20 31 2c 20 20 31 2c 20 20 31 2c 0a 2f 2a 20 37   1,  1,  1,./* 7
97f0: 78 20 2a 2f 20 20 20 31 2c 20 20 31 2c 20 20 31  x */   1,  1,  1
9800: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
9810: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
9820: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 31  ,  0,  0,  0,  1
9830: 2c 20 20 30 2c 0a 2f 2a 20 38 78 20 2a 2f 20 20  ,  0,./* 8x */  
9840: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9850: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9860: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9870: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a   0,  0,  0,  0,.
9880: 2f 2a 20 39 78 20 2a 2f 20 20 20 30 2c 20 20 30  /* 9x */   0,  0
9890: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
98a0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
98b0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
98c0: 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 41 78 20  ,  0,  0,./* Ax 
98d0: 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20  */   0,  0,  0, 
98e0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
98f0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9900: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9910: 20 30 2c 0a 2f 2a 20 42 78 20 2a 2f 20 20 20 30   0,./* Bx */   0
9920: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9930: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9940: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9950: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a  ,  0,  0,  0,./*
9960: 20 43 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20   Cx */   0,  0, 
9970: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9980: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9990: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
99a0: 20 30 2c 20 20 30 2c 0a 2f 2a 20 44 78 20 2a 2f   0,  0,./* Dx */
99b0: 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30     0,  0,  0,  0
99c0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
99d0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
99e0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
99f0: 2c 0a 2f 2a 20 45 78 20 2a 2f 20 20 20 30 2c 20  ,./* Ex */   0, 
9a00: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9a10: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9a20: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9a30: 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 46   0,  0,  0,./* F
9a40: 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30  x */   0,  0,  0
9a50: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9a60: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9a70: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9a80: 2c 20 20 30 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ,  0,.};../*.** 
9a90: 52 65 6d 6f 76 65 20 61 6c 6c 20 64 69 73 61 6c  Remove all disal
9aa0: 6c 6f 77 65 64 20 63 68 61 72 61 63 74 65 72 73  lowed characters
9ab0: 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 73 74   in the input st
9ac0: 72 69 6e 67 20 7a 5b 5d 2e 20 20 43 6f 6e 76 65  ring z[].  Conve
9ad0: 72 74 20 61 6e 79 0a 2a 2a 20 64 69 73 61 6c 6c  rt any.** disall
9ae0: 6f 77 65 64 20 63 68 61 72 61 63 74 65 72 73 20  owed characters 
9af0: 69 6e 74 6f 20 22 5f 22 2e 0a 2a 2a 0a 2a 2a 20  into "_"..**.** 
9b00: 4e 6f 74 20 74 68 61 74 20 74 68 65 20 74 68 72  Not that the thr
9b10: 65 65 20 63 68 61 72 61 63 74 65 72 20 73 65 71  ee character seq
9b20: 75 65 6e 63 65 20 22 25 58 58 22 20 77 68 65 72  uence "%XX" wher
9b30: 65 20 58 20 69 73 20 61 6e 79 20 62 79 74 65 20  e X is any byte 
9b40: 69 73 0a 2a 2a 20 63 6f 6e 76 65 72 74 65 64 20  is.** converted 
9b50: 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 22 5f  into a single "_
9b60: 22 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a 0a  " character..**.
9b70: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
9b80: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
9b90: 72 73 20 63 6f 6e 76 65 72 74 65 64 2e 20 20 41  rs converted.  A
9ba0: 6e 20 22 25 58 58 22 20 2d 3e 20 22 5f 22 20 63  n "%XX" -> "_" c
9bb0: 6f 6e 76 65 72 73 69 6f 6e 0a 2a 2a 20 63 6f 75  onversion.** cou
9bc0: 6e 74 73 20 61 73 20 61 20 73 69 6e 67 6c 65 20  nts as a single 
9bd0: 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74  character..*/.st
9be0: 61 74 69 63 20 69 6e 74 20 73 61 6e 69 74 69 7a  atic int sanitiz
9bf0: 65 53 74 72 69 6e 67 28 63 68 61 72 20 2a 7a 29  eString(char *z)
9c00: 7b 0a 20 20 69 6e 74 20 6e 43 68 61 6e 67 65 20  {.  int nChange 
9c10: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a  = 0;.  while( *z
9c20: 20 29 7b 0a 20 20 20 20 69 66 28 20 21 61 6c 6c   ){.    if( !all
9c30: 6f 77 65 64 49 6e 4e 61 6d 65 5b 2a 28 75 6e 73  owedInName[*(uns
9c40: 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 5d 20 29  igned char*)z] )
9c50: 7b 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d  {.      if( *z==
9c60: 27 25 27 20 26 26 20 7a 5b 31 5d 21 3d 30 20 26  '%' && z[1]!=0 &
9c70: 26 20 7a 5b 32 5d 21 3d 30 20 29 7b 0a 20 20 20  & z[2]!=0 ){.   
9c80: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
9c90: 20 20 20 20 66 6f 72 28 69 3d 33 3b 20 28 7a 5b      for(i=3; (z[
9ca0: 69 2d 32 5d 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b  i-2] = z[i])!=0;
9cb0: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 7d 0a   i++){}.      }.
9cc0: 20 20 20 20 20 20 2a 7a 20 3d 20 27 5f 27 3b 0a        *z = '_';.
9cd0: 20 20 20 20 20 20 6e 43 68 61 6e 67 65 2b 2b 3b        nChange++;
9ce0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 2b 2b 3b 0a  .    }.    z++;.
9cf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68    }.  return nCh
9d00: 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ange;.}../*.** C
9d10: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
9d20: 6f 66 20 22 2f 22 20 63 68 61 72 61 63 74 65 72  of "/" character
9d30: 73 20 69 6e 20 61 20 73 74 72 69 6e 67 2e 0a 2a  s in a string..*
9d40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75  /.static int cou
9d50: 6e 74 53 6c 61 73 68 65 73 28 63 6f 6e 73 74 20  ntSlashes(const 
9d60: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
9d70: 6e 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  n = 0;.  while( 
9d80: 2a 7a 20 29 20 69 66 28 20 2a 28 7a 2b 2b 29 3d  *z ) if( *(z++)=
9d90: 3d 27 2f 27 20 29 20 6e 2b 2b 3b 0a 20 20 72 65  ='/' ) n++;.  re
9da0: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
9db0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72   This routine pr
9dc0: 6f 63 65 73 73 65 73 20 61 20 73 69 6e 67 6c 65  ocesses a single
9dd0: 20 48 54 54 50 20 72 65 71 75 65 73 74 20 6f 6e   HTTP request on
9de0: 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 20   standard input 
9df0: 61 6e 64 0a 2a 2a 20 73 65 6e 64 73 20 74 68 65  and.** sends the
9e00: 20 72 65 70 6c 79 20 74 6f 20 73 74 61 6e 64 61   reply to standa
9e10: 72 64 20 6f 75 74 70 75 74 2e 20 20 49 66 20 74  rd output.  If t
9e20: 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 31  he argument is 1
9e30: 20 69 74 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61   it means.** tha
9e40: 74 20 77 65 20 61 72 65 20 73 68 6f 75 6c 64 20  t we are should 
9e50: 63 6c 6f 73 65 20 74 68 65 20 73 6f 63 6b 65 74  close the socket
9e60: 20 77 69 74 68 6f 75 74 20 70 72 6f 63 65 73 73   without process
9e70: 69 6e 67 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a  ing additional.*
9e80: 2a 20 48 54 54 50 20 72 65 71 75 65 73 74 73 20  * HTTP requests 
9e90: 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e  after the curren
9ea0: 74 20 72 65 71 75 65 73 74 20 66 69 6e 69 73 68  t request finish
9eb0: 65 73 2e 20 20 30 20 6d 65 61 6e 73 20 77 65 20  es.  0 means we 
9ec0: 61 72 65 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 74  are.** allowed t
9ed0: 6f 20 6b 65 65 70 20 74 68 65 20 63 6f 6e 6e 65  o keep the conne
9ee0: 63 74 69 6f 6e 20 6f 70 65 6e 20 61 6e 64 20 74  ction open and t
9ef0: 6f 20 70 72 6f 63 65 73 73 20 61 64 64 69 74 69  o process additi
9f00: 6f 6e 61 6c 20 72 65 71 75 65 73 74 73 2e 0a 2a  onal requests..*
9f10: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
9f20: 61 79 20 63 68 6f 6f 73 65 20 74 6f 20 63 6c 6f  ay choose to clo
9f30: 73 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  se the connectio
9f40: 6e 20 65 76 65 6e 20 69 66 20 74 68 65 20 61 72  n even if the ar
9f50: 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 30 2e 0a  gument.** is 0..
9f60: 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  ** .** If the co
9f70: 6e 6e 65 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  nnection should 
9f80: 62 65 20 63 6c 6f 73 65 64 2c 20 74 68 69 73 20  be closed, this 
9f90: 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 65 78  routine calls ex
9fa0: 69 74 28 29 20 61 6e 64 0a 2a 2a 20 74 68 75 73  it() and.** thus
9fb0: 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73 2e 20   never returns. 
9fc0: 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   If this routine
9fd0: 20 64 6f 65 73 20 72 65 74 75 72 6e 20 69 74 20   does return it 
9fe0: 6d 65 61 6e 73 20 74 68 61 74 20 61 6e 6f 74 68  means that anoth
9ff0: 65 72 0a 2a 2a 20 48 54 54 50 20 72 65 71 75 65  er.** HTTP reque
a000: 73 74 20 6d 61 79 20 61 70 70 65 61 72 20 6f 6e  st may appear on
a010: 20 74 68 65 20 77 69 72 65 2e 0a 2a 2f 0a 76 6f   the wire..*/.vo
a020: 69 64 20 50 72 6f 63 65 73 73 4f 6e 65 52 65 71  id ProcessOneReq
a030: 75 65 73 74 28 69 6e 74 20 66 6f 72 63 65 43 6c  uest(int forceCl
a040: 6f 73 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 63  ose){.  int i, c
a050: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  ;.  char *z;    
a060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a070: 20 55 73 65 64 20 74 6f 20 70 61 72 73 65 20 75   Used to parse u
a080: 70 20 61 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  p a string */.  
a090: 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74  struct stat stat
a0a0: 62 75 66 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66  buf;      /* Inf
a0b0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
a0c0: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 72 65  he file to be re
a0d0: 74 72 69 65 76 65 64 20 2a 2f 0a 20 20 46 49 4c  trieved */.  FIL
a0e0: 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20  E *in;          
a0f0: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 72 65         /* For re
a100: 61 64 69 6e 67 20 66 72 6f 6d 20 43 47 49 20 73  ading from CGI s
a110: 63 72 69 70 74 73 20 2a 2f 0a 20 20 63 68 61 72  cripts */.  char
a120: 20 7a 4c 69 6e 65 5b 31 30 30 30 5d 3b 20 20 20   zLine[1000];   
a130: 20 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65        /* A buffe
a140: 72 20 66 6f 72 20 69 6e 70 75 74 20 6c 69 6e 65  r for input line
a150: 73 20 6f 72 20 66 6f 72 6d 69 6e 67 20 6e 61 6d  s or forming nam
a160: 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 61 6e  es */..  /* Chan
a170: 67 65 20 64 69 72 65 63 74 6f 72 69 65 73 20 74  ge directories t
a180: 6f 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68  o the root of th
a190: 65 20 48 54 54 50 20 66 69 6c 65 73 79 73 74 65  e HTTP filesyste
a1a0: 6d 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 64  m.  */.  if( chd
a1b0: 69 72 28 7a 52 6f 6f 74 5b 30 5d 20 3f 20 7a 52  ir(zRoot[0] ? zR
a1c0: 6f 6f 74 20 3a 20 22 2f 22 29 21 3d 30 20 29 7b  oot : "/")!=0 ){
a1d0: 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 31  .    char zBuf[1
a1e0: 30 30 30 5d 3b 0a 20 20 20 20 4d 61 6c 66 75 6e  000];.    Malfun
a1f0: 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20  ction(__LINE__, 
a200: 20 20 2f 2a 20 4c 4f 47 3a 20 63 68 64 69 72 28    /* LOG: chdir(
a210: 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20  ) failed */.    
a220: 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 68 64       "cannot chd
a230: 69 72 20 74 6f 20 5b 25 73 5d 20 66 72 6f 6d 20  ir to [%s] from 
a240: 5b 25 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20  [%s]",.         
a250: 7a 52 6f 6f 74 2c 20 67 65 74 63 77 64 28 7a 42  zRoot, getcwd(zB
a260: 75 66 2c 39 39 39 29 29 3b 0a 20 20 7d 0a 20 20  uf,999));.  }.  
a270: 6e 52 65 71 75 65 73 74 2b 2b 3b 0a 0a 20 20 2f  nRequest++;..  /
a280: 2a 0a 20 20 2a 2a 20 57 65 20 6d 75 73 74 20 72  *.  ** We must r
a290: 65 63 65 69 76 65 20 61 20 63 6f 6d 70 6c 65 74  eceive a complet
a2a0: 65 20 68 65 61 64 65 72 20 77 69 74 68 69 6e 20  e header within 
a2b0: 31 35 20 73 65 63 6f 6e 64 73 0a 20 20 2a 2f 0a  15 seconds.  */.
a2c0: 20 20 73 69 67 6e 61 6c 28 53 49 47 41 4c 52 4d    signal(SIGALRM
a2d0: 2c 20 54 69 6d 65 6f 75 74 29 3b 0a 20 20 73 69  , Timeout);.  si
a2e0: 67 6e 61 6c 28 53 49 47 53 45 47 56 2c 20 54 69  gnal(SIGSEGV, Ti
a2f0: 6d 65 6f 75 74 29 3b 0a 20 20 73 69 67 6e 61 6c  meout);.  signal
a300: 28 53 49 47 50 49 50 45 2c 20 54 69 6d 65 6f 75  (SIGPIPE, Timeou
a310: 74 29 3b 0a 20 20 69 66 28 20 75 73 65 54 69 6d  t);.  if( useTim
a320: 65 6f 75 74 20 29 20 61 6c 61 72 6d 28 31 35 29  eout ) alarm(15)
a330: 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  ;..  /* Get the 
a340: 66 69 72 73 74 20 6c 69 6e 65 20 6f 66 20 74 68  first line of th
a350: 65 20 72 65 71 75 65 73 74 20 61 6e 64 20 70 61  e request and pa
a360: 72 73 65 20 6f 75 74 20 74 68 65 0a 20 20 2a 2a  rse out the.  **
a370: 20 6d 65 74 68 6f 64 2c 20 74 68 65 20 73 63 72   method, the scr
a380: 69 70 74 20 61 6e 64 20 74 68 65 20 70 72 6f 74  ipt and the prot
a390: 6f 63 6f 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ocol..  */.  if(
a3a0: 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 73 69 7a   fgets(zLine,siz
a3b0: 65 6f 66 28 7a 4c 69 6e 65 29 2c 73 74 64 69 6e  eof(zLine),stdin
a3c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78 69 74  )==0 ){.    exit
a3d0: 28 30 29 3b 0a 20 20 7d 0a 20 20 6f 6d 69 74 4c  (0);.  }.  omitL
a3e0: 6f 67 20 3d 20 30 3b 0a 20 20 6e 49 6e 20 2b 3d  og = 0;.  nIn +=
a3f0: 20 73 74 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a   strlen(zLine);.
a400: 20 20 7a 4d 65 74 68 6f 64 20 3d 20 53 74 72 44    zMethod = StrD
a410: 75 70 28 47 65 74 46 69 72 73 74 45 6c 65 6d 65  up(GetFirstEleme
a420: 6e 74 28 7a 4c 69 6e 65 2c 26 7a 29 29 3b 0a 20  nt(zLine,&z));. 
a430: 20 7a 52 65 61 6c 53 63 72 69 70 74 20 3d 20 7a   zRealScript = z
a440: 53 63 72 69 70 74 20 3d 20 53 74 72 44 75 70 28  Script = StrDup(
a450: 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28  GetFirstElement(
a460: 7a 2c 26 7a 29 29 3b 0a 20 20 7a 50 72 6f 74 6f  z,&z));.  zProto
a470: 63 6f 6c 20 3d 20 53 74 72 44 75 70 28 47 65 74  col = StrDup(Get
a480: 46 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a 2c 26  FirstElement(z,&
a490: 7a 29 29 3b 0a 20 20 69 66 28 20 7a 50 72 6f 74  z));.  if( zProt
a4a0: 6f 63 6f 6c 3d 3d 30 20 7c 7c 20 73 74 72 6e 63  ocol==0 || strnc
a4b0: 6d 70 28 7a 50 72 6f 74 6f 63 6f 6c 2c 22 48 54  mp(zProtocol,"HT
a4c0: 54 50 2f 22 2c 35 29 21 3d 30 20 7c 7c 20 73 74  TP/",5)!=0 || st
a4d0: 72 6c 65 6e 28 7a 50 72 6f 74 6f 63 6f 6c 29 21  rlen(zProtocol)!
a4e0: 3d 38 20 29 7b 0a 20 20 20 20 53 74 61 72 74 52  =8 ){.    StartR
a4f0: 65 73 70 6f 6e 73 65 28 22 34 30 30 20 42 61 64  esponse("400 Bad
a500: 20 52 65 71 75 65 73 74 22 29 3b 0a 20 20 20 20   Request");.    
a510: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a  nOut += printf(.
a520: 20 20 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74        "Content-t
a530: 79 70 65 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c  ype: text/plain\
a540: 72 5c 6e 22 0a 20 20 20 20 20 20 22 5c 72 5c 6e  r\n".      "\r\n
a550: 22 0a 20 20 20 20 20 20 22 54 68 69 73 20 73 65  ".      "This se
a560: 72 76 65 72 20 64 6f 65 73 20 6e 6f 74 20 75 6e  rver does not un
a570: 64 65 72 73 74 61 6e 64 20 74 68 65 20 72 65 71  derstand the req
a580: 75 65 73 74 65 64 20 70 72 6f 74 6f 63 6f 6c 5c  uested protocol\
a590: 6e 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 4d 61  n".    );.    Ma
a5a0: 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 5f 5f  keLogEntry(0, __
a5b0: 4c 49 4e 45 5f 5f 29 3b 20 2f 2a 20 4c 4f 47 3a  LINE__); /* LOG:
a5c0: 20 62 61 64 20 70 72 6f 74 6f 63 6f 6c 20 69 6e   bad protocol in
a5d0: 20 48 54 54 50 20 68 65 61 64 65 72 20 2a 2f 0a   HTTP header */.
a5e0: 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20 7d      exit(0);.  }
a5f0: 0a 20 20 69 66 28 20 7a 53 63 72 69 70 74 5b 30  .  if( zScript[0
a600: 5d 3d 3d 30 20 29 20 4e 6f 74 46 6f 75 6e 64 28  ]==0 ) NotFound(
a610: 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 2f 2a 20 4c 4f  __LINE__); /* LO
a620: 47 3a 20 45 6d 70 74 79 20 72 65 71 75 65 73 74  G: Empty request
a630: 20 55 52 49 20 2a 2f 0a 20 20 69 66 28 20 66 6f   URI */.  if( fo
a640: 72 63 65 43 6c 6f 73 65 20 29 7b 0a 20 20 20 20  rceClose ){.    
a650: 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20  closeConnection 
a660: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
a670: 20 7a 50 72 6f 74 6f 63 6f 6c 5b 35 5d 3c 27 31   zProtocol[5]<'1
a680: 27 20 7c 7c 20 7a 50 72 6f 74 6f 63 6f 6c 5b 37  ' || zProtocol[7
a690: 5d 3c 27 31 27 20 29 7b 0a 20 20 20 20 63 6c 6f  ]<'1' ){.    clo
a6a0: 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 31  seConnection = 1
a6b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73  ;.  }..  /* This
a6c0: 20 76 65 72 79 20 73 69 6d 70 6c 65 20 73 65 72   very simple ser
a6d0: 76 65 72 20 6f 6e 6c 79 20 75 6e 64 65 72 73 74  ver only underst
a6e0: 61 6e 64 73 20 74 68 65 20 47 45 54 2c 20 50 4f  ands the GET, PO
a6f0: 53 54 0a 20 20 2a 2a 20 61 6e 64 20 48 45 41 44  ST.  ** and HEAD
a700: 20 6d 65 74 68 6f 64 73 0a 20 20 2a 2f 0a 20 20   methods.  */.  
a710: 69 66 28 20 73 74 72 63 6d 70 28 7a 4d 65 74 68  if( strcmp(zMeth
a720: 6f 64 2c 22 47 45 54 22 29 21 3d 30 20 26 26 20  od,"GET")!=0 && 
a730: 73 74 72 63 6d 70 28 7a 4d 65 74 68 6f 64 2c 22  strcmp(zMethod,"
a740: 50 4f 53 54 22 29 21 3d 30 0a 20 20 20 20 20 20  POST")!=0.      
a750: 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 65 74 68   && strcmp(zMeth
a760: 6f 64 2c 22 48 45 41 44 22 29 21 3d 30 20 29 7b  od,"HEAD")!=0 ){
a770: 0a 20 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e  .    StartRespon
a780: 73 65 28 22 35 30 31 20 4e 6f 74 20 49 6d 70 6c  se("501 Not Impl
a790: 65 6d 65 6e 74 65 64 22 29 3b 0a 20 20 20 20 6e  emented");.    n
a7a0: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20  Out += printf(. 
a7b0: 20 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79       "Content-ty
a7c0: 70 65 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c 72  pe: text/plain\r
a7d0: 5c 6e 22 0a 20 20 20 20 20 20 22 5c 72 5c 6e 22  \n".      "\r\n"
a7e0: 0a 20 20 20 20 20 20 22 54 68 65 20 25 73 20 6d  .      "The %s m
a7f0: 65 74 68 6f 64 20 69 73 20 6e 6f 74 20 69 6d 70  ethod is not imp
a800: 6c 65 6d 65 6e 74 65 64 20 6f 6e 20 74 68 69 73  lemented on this
a810: 20 73 65 72 76 65 72 2e 5c 6e 22 2c 0a 20 20 20   server.\n",.   
a820: 20 20 20 7a 4d 65 74 68 6f 64 29 3b 0a 20 20 20     zMethod);.   
a830: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c   MakeLogEntry(0,
a840: 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 2f 2a 20 4c   __LINE__); /* L
a850: 4f 47 3a 20 55 6e 6b 6e 6f 77 6e 20 72 65 71 75  OG: Unknown requ
a860: 65 73 74 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  est method */.  
a870: 20 20 65 78 69 74 28 30 29 3b 0a 20 20 7d 0a 0a    exit(0);.  }..
a880: 20 20 2f 2a 20 47 65 74 20 61 6c 6c 20 74 68 65    /* Get all the
a890: 20 6f 70 74 69 6f 6e 61 6c 20 66 69 65 6c 64 73   optional fields
a8a0: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 65   that follow the
a8b0: 20 66 69 72 73 74 20 6c 69 6e 65 2e 0a 20 20 2a   first line..  *
a8c0: 2f 0a 20 20 7a 43 6f 6f 6b 69 65 20 3d 20 30 3b  /.  zCookie = 0;
a8d0: 0a 20 20 7a 41 75 74 68 54 79 70 65 20 3d 20 30  .  zAuthType = 0
a8e0: 3b 0a 20 20 7a 52 65 6d 6f 74 65 55 73 65 72 20  ;.  zRemoteUser 
a8f0: 3d 20 30 3b 0a 20 20 7a 52 65 66 65 72 65 72 20  = 0;.  zReferer 
a900: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 66 67  = 0;.  while( fg
a910: 65 74 73 28 7a 4c 69 6e 65 2c 73 69 7a 65 6f 66  ets(zLine,sizeof
a920: 28 7a 4c 69 6e 65 29 2c 73 74 64 69 6e 29 20 29  (zLine),stdin) )
a930: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69 65  {.    char *zFie
a940: 6c 64 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72  ldName;.    char
a950: 20 2a 7a 56 61 6c 3b 0a 0a 20 20 20 20 6e 49 6e   *zVal;..    nIn
a960: 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 4c 69 6e 65   += strlen(zLine
a970: 29 3b 0a 20 20 20 20 7a 46 69 65 6c 64 4e 61 6d  );.    zFieldNam
a980: 65 20 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d  e = GetFirstElem
a990: 65 6e 74 28 7a 4c 69 6e 65 2c 26 7a 56 61 6c 29  ent(zLine,&zVal)
a9a0: 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 65 6c 64  ;.    if( zField
a9b0: 4e 61 6d 65 3d 3d 30 20 7c 7c 20 2a 7a 46 69 65  Name==0 || *zFie
a9c0: 6c 64 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61  ldName==0 ) brea
a9d0: 6b 3b 0a 20 20 20 20 52 65 6d 6f 76 65 4e 65 77  k;.    RemoveNew
a9e0: 6c 69 6e 65 28 7a 56 61 6c 29 3b 0a 20 20 20 20  line(zVal);.    
a9f0: 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a  if( strcasecmp(z
aa00: 46 69 65 6c 64 4e 61 6d 65 2c 22 55 73 65 72 2d  FieldName,"User-
aa10: 41 67 65 6e 74 3a 22 29 3d 3d 30 20 29 7b 0a 20  Agent:")==0 ){. 
aa20: 20 20 20 20 20 7a 41 67 65 6e 74 20 3d 20 53 74       zAgent = St
aa30: 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20  rDup(zVal);.    
aa40: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 61 73  }else if( strcas
aa50: 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c  ecmp(zFieldName,
aa60: 22 41 63 63 65 70 74 3a 22 29 3d 3d 30 20 29 7b  "Accept:")==0 ){
aa70: 0a 20 20 20 20 20 20 7a 41 63 63 65 70 74 20 3d  .      zAccept =
aa80: 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20   StrDup(zVal);. 
aa90: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
aaa0: 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61  casecmp(zFieldNa
aab0: 6d 65 2c 22 43 6f 6e 74 65 6e 74 2d 6c 65 6e 67  me,"Content-leng
aac0: 74 68 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  th:")==0 ){.    
aad0: 20 20 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68    zContentLength
aae0: 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b   = StrDup(zVal);
aaf0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
ab00: 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64  trcasecmp(zField
ab10: 4e 61 6d 65 2c 22 43 6f 6e 74 65 6e 74 2d 74 79  Name,"Content-ty
ab20: 70 65 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  pe:")==0 ){.    
ab30: 20 20 7a 43 6f 6e 74 65 6e 74 54 79 70 65 20 3d    zContentType =
ab40: 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20   StrDup(zVal);. 
ab50: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
ab60: 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61  casecmp(zFieldNa
ab70: 6d 65 2c 22 52 65 66 65 72 65 72 3a 22 29 3d 3d  me,"Referer:")==
ab80: 30 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 66 65  0 ){.      zRefe
ab90: 72 65 72 20 3d 20 53 74 72 44 75 70 28 7a 56 61  rer = StrDup(zVa
aba0: 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  l);.      if( st
abb0: 72 73 74 72 28 7a 56 61 6c 2c 20 22 64 65 76 69  rstr(zVal, "devi
abc0: 64 73 2e 6e 65 74 2f 22 29 21 3d 30 20 29 7b 20  ds.net/")!=0 ){ 
abd0: 7a 52 65 66 65 72 65 72 20 3d 20 22 64 65 76 69  zReferer = "devi
abe0: 64 73 2e 6e 65 74 2e 73 6d 75 74 22 3b 0a 20 20  ds.net.smut";.  
abf0: 20 20 20 20 20 20 46 6f 72 62 69 64 64 65 6e 28        Forbidden(
ac00: 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 2f 2a 20 4c 4f  __LINE__); /* LO
ac10: 47 3a 20 52 65 66 65 72 72 65 72 20 69 73 20 64  G: Referrer is d
ac20: 65 76 69 64 73 2e 6e 65 74 20 2a 2f 0a 20 20 20  evids.net */.   
ac30: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
ac40: 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46  f( strcasecmp(zF
ac50: 69 65 6c 64 4e 61 6d 65 2c 22 43 6f 6f 6b 69 65  ieldName,"Cookie
ac60: 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  :")==0 ){.      
ac70: 7a 43 6f 6f 6b 69 65 20 3d 20 53 74 72 41 70 70  zCookie = StrApp
ac80: 65 6e 64 28 7a 43 6f 6f 6b 69 65 2c 22 3b 20 22  end(zCookie,"; "
ac90: 2c 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  ,zVal);.    }els
aca0: 65 20 69 66 28 20 73 74 72 63 61 73 65 63 6d 70  e if( strcasecmp
acb0: 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 43 6f 6e  (zFieldName,"Con
acc0: 6e 65 63 74 69 6f 6e 3a 22 29 3d 3d 30 20 29 7b  nection:")==0 ){
acd0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 61  .      if( strca
ace0: 73 65 63 6d 70 28 7a 56 61 6c 2c 22 63 6c 6f 73  secmp(zVal,"clos
acf0: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
ad00: 20 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f    closeConnectio
ad10: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  n = 1;.      }el
ad20: 73 65 20 69 66 28 20 21 66 6f 72 63 65 43 6c 6f  se if( !forceClo
ad30: 73 65 20 26 26 20 73 74 72 63 61 73 65 63 6d 70  se && strcasecmp
ad40: 28 7a 56 61 6c 2c 20 22 6b 65 65 70 2d 61 6c 69  (zVal, "keep-ali
ad50: 76 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ve")==0 ){.     
ad60: 20 20 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69     closeConnecti
ad70: 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  on = 0;.      }.
ad80: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
ad90: 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e  rcasecmp(zFieldN
ada0: 61 6d 65 2c 22 48 6f 73 74 3a 22 29 3d 3d 30 20  ame,"Host:")==0 
adb0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 53  ){.      int inS
adc0: 71 75 61 72 65 20 3d 20 30 3b 0a 20 20 20 20 20  quare = 0;.     
add0: 20 63 68 61 72 20 63 3b 0a 20 20 20 20 20 20 69   char c;.      i
ade0: 66 28 20 73 61 6e 69 74 69 7a 65 53 74 72 69 6e  f( sanitizeStrin
adf0: 67 28 7a 56 61 6c 29 20 29 7b 0a 20 20 20 20 20  g(zVal) ){.     
ae00: 20 20 20 46 6f 72 62 69 64 64 65 6e 28 5f 5f 4c     Forbidden(__L
ae10: 49 4e 45 5f 5f 29 3b 20 20 2f 2a 20 4c 4f 47 3a  INE__);  /* LOG:
ae20: 20 49 6c 6c 65 67 61 6c 20 63 6f 6e 74 65 6e 74   Illegal content
ae30: 20 69 6e 20 48 4f 53 54 3a 20 70 61 72 61 6d 65   in HOST: parame
ae40: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ter */.      }. 
ae50: 20 20 20 20 20 7a 48 74 74 70 48 6f 73 74 20 3d       zHttpHost =
ae60: 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20   StrDup(zVal);. 
ae70: 20 20 20 20 20 7a 53 65 72 76 65 72 50 6f 72 74       zServerPort
ae80: 20 3d 20 7a 53 65 72 76 65 72 4e 61 6d 65 20 3d   = zServerName =
ae90: 20 53 74 72 44 75 70 28 7a 48 74 74 70 48 6f 73   StrDup(zHttpHos
aea0: 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
aeb0: 20 7a 53 65 72 76 65 72 50 6f 72 74 20 26 26 20   zServerPort && 
aec0: 28 63 20 3d 20 2a 7a 53 65 72 76 65 72 50 6f 72  (c = *zServerPor
aed0: 74 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  t)!=0.          
aee0: 20 20 20 20 26 26 20 28 63 21 3d 27 3a 27 20 7c      && (c!=':' |
aef0: 7c 20 69 6e 53 71 75 61 72 65 29 20 29 7b 0a 20  | inSquare) ){. 
af00: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5b         if( c=='[
af10: 27 20 29 20 69 6e 53 71 75 61 72 65 20 3d 20 31  ' ) inSquare = 1
af20: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  ;.        if( c=
af30: 3d 27 5d 27 20 29 20 69 6e 53 71 75 61 72 65 20  =']' ) inSquare 
af40: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 53 65  = 0;.        zSe
af50: 72 76 65 72 50 6f 72 74 2b 2b 3b 0a 20 20 20 20  rverPort++;.    
af60: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 53    }.      if( zS
af70: 65 72 76 65 72 50 6f 72 74 20 26 26 20 2a 7a 53  erverPort && *zS
af80: 65 72 76 65 72 50 6f 72 74 20 29 7b 0a 20 20 20  erverPort ){.   
af90: 20 20 20 20 20 2a 7a 53 65 72 76 65 72 50 6f 72       *zServerPor
afa0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a  t = 0;.        z
afb0: 53 65 72 76 65 72 50 6f 72 74 2b 2b 3b 0a 20 20  ServerPort++;.  
afc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
afd0: 7a 52 65 61 6c 50 6f 72 74 20 29 7b 0a 20 20 20  zRealPort ){.   
afe0: 20 20 20 20 20 7a 53 65 72 76 65 72 50 6f 72 74       zServerPort
aff0: 20 3d 20 53 74 72 44 75 70 28 7a 52 65 61 6c 50   = StrDup(zRealP
b000: 6f 72 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ort);.      }.  
b010: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
b020: 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d  asecmp(zFieldNam
b030: 65 2c 22 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e  e,"Authorization
b040: 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  :")==0 ){.      
b050: 7a 41 75 74 68 54 79 70 65 20 3d 20 47 65 74 46  zAuthType = GetF
b060: 69 72 73 74 45 6c 65 6d 65 6e 74 28 53 74 72 44  irstElement(StrD
b070: 75 70 28 7a 56 61 6c 29 2c 20 26 7a 41 75 74 68  up(zVal), &zAuth
b080: 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Arg);.    }.  }.
b090: 0a 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 72  .  /* Disallow r
b0a0: 65 71 75 65 73 74 73 20 66 72 6f 6d 20 63 65 72  equests from cer
b0b0: 74 61 69 6e 20 63 6c 69 65 6e 74 73 20 2a 2f 0a  tain clients */.
b0c0: 20 20 69 66 28 20 7a 41 67 65 6e 74 20 29 7b 0a    if( zAgent ){.
b0d0: 20 20 20 20 69 66 28 20 73 74 72 73 74 72 28 7a      if( strstr(z
b0e0: 41 67 65 6e 74 2c 20 22 57 69 6e 64 6f 77 73 5f  Agent, "Windows_
b0f0: 39 22 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 73  9")!=0.     || s
b100: 74 72 73 74 72 28 7a 41 67 65 6e 74 2c 20 22 44  trstr(zAgent, "D
b110: 6f 77 6e 6c 6f 61 64 5f 4d 61 73 74 65 72 22 29  ownload_Master")
b120: 21 3d 30 0a 20 20 20 20 20 7c 7c 20 73 74 72 73  !=0.     || strs
b130: 74 72 28 7a 41 67 65 6e 74 2c 20 22 45 7a 6f 6f  tr(zAgent, "Ezoo
b140: 6d 73 2f 22 29 21 3d 30 0a 20 20 20 2f 2a 7c 7c  ms/")!=0.   /*||
b150: 20 73 74 72 73 74 72 28 7a 41 67 65 6e 74 2c 20   strstr(zAgent, 
b160: 22 62 69 6e 67 62 6f 74 22 29 21 3d 30 2a 2f 0a  "bingbot")!=0*/.
b170: 20 20 20 20 20 7c 7c 20 73 74 72 73 74 72 28 7a       || strstr(z
b180: 41 67 65 6e 74 2c 20 22 41 68 72 65 66 73 42 6f  Agent, "AhrefsBo
b190: 74 22 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20  t")!=0.    ){.  
b1a0: 20 20 20 20 46 6f 72 62 69 64 64 65 6e 28 5f 5f      Forbidden(__
b1b0: 4c 49 4e 45 5f 5f 29 3b 20 20 2f 2a 20 4c 4f 47  LINE__);  /* LOG
b1c0: 3a 20 44 69 73 61 6c 6c 6f 77 65 64 20 75 73 65  : Disallowed use
b1d0: 72 20 61 67 65 6e 74 20 2a 2f 0a 20 20 20 20 7d  r agent */.    }
b1e0: 0a 20 20 7d 0a 23 69 66 20 30 0a 20 20 69 66 28  .  }.#if 0.  if(
b1f0: 20 7a 52 65 66 65 72 65 72 20 29 7b 0a 20 20 20   zReferer ){.   
b200: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
b210: 61 72 20 2a 61 7a 44 69 73 61 6c 6c 6f 77 5b 5d  ar *azDisallow[]
b220: 20 3d 20 7b 0a 20 20 20 20 20 20 22 73 6b 69 64   = {.      "skid
b230: 72 6f 77 63 72 61 63 6b 2e 63 6f 6d 22 2c 0a 20  rowcrack.com",. 
b240: 20 20 20 20 20 22 68 6f 73 68 69 79 75 75 67 69       "hoshiyuugi
b250: 2e 74 69 73 74 6f 72 79 2e 63 6f 6d 22 2c 0a 20  .tistory.com",. 
b260: 20 20 20 20 20 22 73 6b 69 64 72 6f 77 67 61 6d       "skidrowgam
b270: 65 73 2e 6e 65 74 22 2c 0a 20 20 20 20 7d 3b 0a  es.net",.    };.
b280: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
b290: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
b2a0: 28 61 7a 44 69 73 61 6c 6c 6f 77 29 2f 73 69 7a  (azDisallow)/siz
b2b0: 65 6f 66 28 61 7a 44 69 73 61 6c 6c 6f 77 5b 30  eof(azDisallow[0
b2c0: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
b2d0: 69 66 28 20 73 74 72 73 74 72 28 7a 52 65 66 65  if( strstr(zRefe
b2e0: 72 65 72 2c 20 61 7a 44 69 73 61 6c 6c 6f 77 5b  rer, azDisallow[
b2f0: 69 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  i])!=0 ){.      
b300: 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e    NotFound(__LIN
b310: 45 5f 5f 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 44  E__);  /* LOG: D
b320: 69 73 61 6c 6c 6f 77 65 64 20 72 65 66 65 72 72  isallowed referr
b330: 65 72 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  er */.      }.  
b340: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
b350: 20 20 2f 2a 20 4d 61 6b 65 20 61 6e 20 65 78 74    /* Make an ext
b360: 72 61 20 65 66 66 6f 72 74 20 74 6f 20 67 65 74  ra effort to get
b370: 20 61 20 76 61 6c 69 64 20 73 65 72 76 65 72 20   a valid server 
b380: 6e 61 6d 65 20 61 6e 64 20 70 6f 72 74 20 6e 75  name and port nu
b390: 6d 62 65 72 2e 0a 20 20 2a 2a 20 4f 6e 6c 79 20  mber..  ** Only 
b3a0: 4e 65 74 73 63 61 70 65 20 70 72 6f 76 69 64 65  Netscape provide
b3b0: 73 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  s this informati
b3c0: 6f 6e 2e 20 20 49 66 20 74 68 65 20 62 72 6f 77  on.  If the brow
b3d0: 73 65 72 20 69 73 0a 20 20 2a 2a 20 49 6e 74 65  ser is.  ** Inte
b3e0: 72 6e 65 74 20 45 78 70 6c 6f 72 65 72 2c 20 74  rnet Explorer, t
b3f0: 68 65 6e 20 77 65 20 68 61 76 65 20 74 6f 20 66  hen we have to f
b400: 69 6e 64 20 6f 75 74 20 74 68 65 20 69 6e 66 6f  ind out the info
b410: 72 6d 61 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a  rmation for.  **
b420: 20 6f 75 72 73 65 6c 76 65 73 2e 0a 20 20 2a 2f   ourselves..  */
b430: 0a 20 20 69 66 28 20 7a 53 65 72 76 65 72 4e 61  .  if( zServerNa
b440: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53 65  me==0 ){.    zSe
b450: 72 76 65 72 4e 61 6d 65 20 3d 20 53 61 66 65 4d  rverName = SafeM
b460: 61 6c 6c 6f 63 28 20 31 30 30 20 29 3b 0a 20 20  alloc( 100 );.  
b470: 20 20 67 65 74 68 6f 73 74 6e 61 6d 65 28 7a 53    gethostname(zS
b480: 65 72 76 65 72 4e 61 6d 65 2c 31 30 30 29 3b 0a  erverName,100);.
b490: 20 20 7d 0a 20 20 69 66 28 20 7a 53 65 72 76 65    }.  if( zServe
b4a0: 72 50 6f 72 74 3d 3d 30 20 7c 7c 20 2a 7a 53 65  rPort==0 || *zSe
b4b0: 72 76 65 72 50 6f 72 74 3d 3d 30 20 29 7b 0a 20  rverPort==0 ){. 
b4c0: 20 20 20 7a 53 65 72 76 65 72 50 6f 72 74 20 3d     zServerPort =
b4d0: 20 44 45 46 41 55 4c 54 5f 50 4f 52 54 3b 0a 20   DEFAULT_PORT;. 
b4e0: 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20   }..  /* Remove 
b4f0: 74 68 65 20 71 75 65 72 79 20 73 74 72 69 6e 67  the query string
b500: 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66   from the end of
b510: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 66   the requested f
b520: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ile..  */.  for(
b530: 7a 3d 7a 53 63 72 69 70 74 3b 20 2a 7a 20 26 26  z=zScript; *z &&
b540: 20 2a 7a 21 3d 27 3f 27 3b 20 7a 2b 2b 29 7b 7d   *z!='?'; z++){}
b550: 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 3f 27 20 29  .  if( *z=='?' )
b560: 7b 0a 20 20 20 20 7a 51 75 65 72 79 53 75 66 66  {.    zQuerySuff
b570: 69 78 20 3d 20 53 74 72 44 75 70 28 7a 29 3b 0a  ix = StrDup(z);.
b580: 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 7d 65      *z = 0;.  }e
b590: 6c 73 65 7b 0a 20 20 20 20 7a 51 75 65 72 79 53  lse{.    zQueryS
b5a0: 75 66 66 69 78 20 3d 20 22 22 3b 0a 20 20 7d 0a  uffix = "";.  }.
b5b0: 20 20 7a 51 75 65 72 79 53 74 72 69 6e 67 20 3d    zQueryString =
b5c0: 20 2a 7a 51 75 65 72 79 53 75 66 66 69 78 20 3f   *zQuerySuffix ?
b5d0: 20 26 7a 51 75 65 72 79 53 75 66 66 69 78 5b 31   &zQuerySuffix[1
b5e0: 5d 20 3a 20 7a 51 75 65 72 79 53 75 66 66 69 78  ] : zQuerySuffix
b5f0: 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 61  ;..  /* Create a
b600: 20 66 69 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68   file to hold th
b610: 65 20 50 4f 53 54 20 71 75 65 72 79 20 64 61 74  e POST query dat
b620: 61 2c 20 69 66 20 61 6e 79 2e 20 20 57 65 20 68  a, if any.  We h
b630: 61 76 65 20 74 6f 0a 20 20 2a 2a 20 64 6f 20 69  ave to.  ** do i
b640: 74 20 74 68 69 73 20 77 61 79 2e 20 20 57 65 20  t this way.  We 
b650: 63 61 6e 27 74 20 6a 75 73 74 20 70 61 73 73 20  can't just pass 
b660: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
b670: 74 6f 72 20 64 6f 77 6e 20 74 6f 0a 20 20 2a 2a  tor down to.  **
b680: 20 74 68 65 20 63 68 69 6c 64 20 70 72 6f 63 65   the child proce
b690: 73 73 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ss because the f
b6a0: 67 65 74 73 28 29 20 66 75 6e 63 74 69 6f 6e 20  gets() function 
b6b0: 6d 61 79 20 68 61 76 65 20 61 6c 72 65 61 64 79  may have already
b6c0: 0a 20 20 2a 2a 20 72 65 61 64 20 70 61 72 74 20  .  ** read part 
b6d0: 6f 66 20 74 68 65 20 50 4f 53 54 20 64 61 74 61  of the POST data
b6e0: 20 69 6e 74 6f 20 69 74 73 20 69 6e 74 65 72 6e   into its intern
b6f0: 61 6c 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a  al buffer..  */.
b700: 20 20 69 66 28 20 7a 4d 65 74 68 6f 64 5b 30 5d    if( zMethod[0]
b710: 3d 3d 27 50 27 20 26 26 20 7a 43 6f 6e 74 65 6e  =='P' && zConten
b720: 74 4c 65 6e 67 74 68 21 3d 30 20 29 7b 0a 20 20  tLength!=0 ){.  
b730: 20 20 69 6e 74 20 6c 65 6e 20 3d 20 61 74 6f 69    int len = atoi
b740: 28 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 29  (zContentLength)
b750: 3b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 3b  ;.    FILE *out;
b760: 0a 20 20 20 20 63 68 61 72 20 2a 7a 42 75 66 3b  .    char *zBuf;
b770: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20  .    int n;..   
b780: 20 69 66 28 20 6c 65 6e 3e 4d 41 58 5f 43 4f 4e   if( len>MAX_CON
b790: 54 45 4e 54 5f 4c 45 4e 47 54 48 20 29 7b 0a 20  TENT_LENGTH ){. 
b7a0: 20 20 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e       StartRespon
b7b0: 73 65 28 22 35 30 30 20 52 65 71 75 65 73 74 20  se("500 Request 
b7c0: 74 6f 6f 20 6c 61 72 67 65 22 29 3b 0a 20 20 20  too large");.   
b7d0: 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74     nOut += print
b7e0: 66 28 0a 20 20 20 20 20 20 20 20 22 43 6f 6e 74  f(.        "Cont
b7f0: 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 70  ent-type: text/p
b800: 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 20 20  lain\r\n".      
b810: 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 20 20 20    "\r\n".       
b820: 20 22 54 6f 6f 20 6d 75 63 68 20 50 4f 53 54 20   "Too much POST 
b830: 64 61 74 61 5c 6e 22 0a 20 20 20 20 20 20 29 3b  data\n".      );
b840: 0a 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e  .      MakeLogEn
b850: 74 72 79 28 30 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  try(0, __LINE__)
b860: 3b 20 2f 2a 20 4c 4f 47 3a 20 52 65 71 75 65 73  ; /* LOG: Reques
b870: 74 20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a 20  t too large */. 
b880: 20 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20       exit(0);.  
b890: 20 20 7d 0a 20 20 20 20 73 70 72 69 6e 74 66 28    }.    sprintf(
b8a0: 7a 54 6d 70 4e 61 6d 42 75 66 2c 20 22 2f 74 6d  zTmpNamBuf, "/tm
b8b0: 70 2f 2d 70 6f 73 74 2d 64 61 74 61 2d 58 58 58  p/-post-data-XXX
b8c0: 58 58 58 22 29 3b 0a 20 20 20 20 7a 54 6d 70 4e  XXX");.    zTmpN
b8d0: 61 6d 20 3d 20 7a 54 6d 70 4e 61 6d 42 75 66 3b  am = zTmpNamBuf;
b8e0: 0a 20 20 20 20 69 66 28 20 6d 6b 73 74 65 6d 70  .    if( mkstemp
b8f0: 28 7a 54 6d 70 4e 61 6d 29 3c 30 20 29 7b 0a 20  (zTmpNam)<0 ){. 
b900: 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e       Malfunction
b910: 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 20 2f 2a 20 4c  (__LINE__,  /* L
b920: 4f 47 3a 20 6d 6b 73 74 65 6d 70 28 29 20 66 61  OG: mkstemp() fa
b930: 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  iled */.        
b940: 20 20 20 20 20 20 20 22 43 61 6e 6e 6f 74 20 63         "Cannot c
b950: 72 65 61 74 65 20 61 20 74 65 6d 70 20 66 69 6c  reate a temp fil
b960: 65 20 69 6e 20 77 68 69 63 68 20 74 6f 20 73 74  e in which to st
b970: 6f 72 65 20 50 4f 53 54 20 64 61 74 61 22 29 3b  ore POST data");
b980: 0a 20 20 20 20 7d 0a 20 20 20 20 6f 75 74 20 3d  .    }.    out =
b990: 20 66 6f 70 65 6e 28 7a 54 6d 70 4e 61 6d 2c 22   fopen(zTmpNam,"
b9a0: 77 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74  w");.    if( out
b9b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 74 61  ==0 ){.      Sta
b9c0: 72 74 52 65 73 70 6f 6e 73 65 28 22 35 30 30 20  rtResponse("500 
b9d0: 43 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 2f 74  Cannot create /t
b9e0: 6d 70 20 66 69 6c 65 22 29 3b 0a 20 20 20 20 20  mp file");.     
b9f0: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
ba00: 0a 20 20 20 20 20 20 20 20 22 43 6f 6e 74 65 6e  .        "Conten
ba10: 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 70 6c 61  t-type: text/pla
ba20: 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 20 20 20 20  in\r\n".        
ba30: 22 5c 72 5c 6e 22 0a 20 20 20 20 20 20 20 20 22  "\r\n".        "
ba40: 43 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20 5c  Could not open \
ba50: 22 25 73 5c 22 20 66 6f 72 20 77 72 69 74 69 6e  "%s\" for writin
ba60: 67 5c 6e 22 2c 20 7a 54 6d 70 4e 61 6d 0a 20 20  g\n", zTmpNam.  
ba70: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 4d 61 6b      );.      Mak
ba80: 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 5f 5f 4c  eLogEntry(0, __L
ba90: 49 4e 45 5f 5f 29 3b 20 2f 2a 20 4c 4f 47 3a 20  INE__); /* LOG: 
baa0: 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 74 65  cannot create te
bab0: 6d 70 20 66 69 6c 65 20 66 6f 72 20 50 4f 53 54  mp file for POST
bac0: 20 2a 2f 0a 20 20 20 20 20 20 65 78 69 74 28 30   */.      exit(0
bad0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75  );.    }.    zBu
bae0: 66 20 3d 20 53 61 66 65 4d 61 6c 6c 6f 63 28 20  f = SafeMalloc( 
baf0: 6c 65 6e 2b 31 20 29 3b 0a 20 20 20 20 69 66 28  len+1 );.    if(
bb00: 20 75 73 65 54 69 6d 65 6f 75 74 20 29 20 61 6c   useTimeout ) al
bb10: 61 72 6d 28 31 35 20 2b 20 6c 65 6e 2f 32 30 30  arm(15 + len/200
bb20: 30 29 3b 0a 20 20 20 20 6e 20 3d 20 66 72 65 61  0);.    n = frea
bb30: 64 28 7a 42 75 66 2c 31 2c 6c 65 6e 2c 73 74 64  d(zBuf,1,len,std
bb40: 69 6e 29 3b 0a 20 20 20 20 6e 49 6e 20 2b 3d 20  in);.    nIn += 
bb50: 6e 3b 0a 20 20 20 20 66 77 72 69 74 65 28 7a 42  n;.    fwrite(zB
bb60: 75 66 2c 31 2c 6e 2c 6f 75 74 29 3b 0a 20 20 20  uf,1,n,out);.   
bb70: 20 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20   free(zBuf);.   
bb80: 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20   fclose(out);.  
bb90: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
bba0: 65 20 74 68 65 20 72 75 6e 6e 69 6e 67 20 74 69  e the running ti
bbb0: 6d 65 20 69 73 20 6e 6f 74 20 74 6f 6f 20 67 72  me is not too gr
bbc0: 65 61 74 20 2a 2f 0a 20 20 69 66 28 20 75 73 65  eat */.  if( use
bbd0: 54 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d 28  Timeout ) alarm(
bbe0: 31 30 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65  10);..  /* Conve
bbf0: 72 74 20 61 6c 6c 20 75 6e 75 73 75 61 6c 20 63  rt all unusual c
bc00: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
bc10: 20 73 63 72 69 70 74 20 6e 61 6d 65 20 69 6e 74   script name int
bc20: 6f 20 22 5f 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  o "_"..  **.  **
bc30: 20 54 68 69 73 20 69 73 20 61 20 64 65 66 65 6e   This is a defen
bc40: 73 65 20 61 67 61 69 6e 73 74 20 76 61 72 69 6f  se against vario
bc50: 75 73 20 61 74 74 61 63 6b 73 2c 20 58 53 53 20  us attacks, XSS 
bc60: 61 74 74 61 63 6b 73 20 69 6e 20 70 61 72 74 69  attacks in parti
bc70: 63 75 6c 61 72 2e 0a 20 20 2a 2f 0a 20 20 73 61  cular..  */.  sa
bc80: 6e 69 74 69 7a 65 53 74 72 69 6e 67 28 7a 53 63  nitizeString(zSc
bc90: 72 69 70 74 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20  ript);..  /* Do 
bca0: 6e 6f 74 20 61 6c 6c 6f 77 20 22 2f 2e 22 20 6f  not allow "/." o
bcb0: 72 20 22 2f 2d 22 20 74 6f 20 74 6f 20 6f 63 63  r "/-" to to occ
bcc0: 75 72 20 61 6e 79 77 68 65 72 65 20 69 6e 20 74  ur anywhere in t
bcd0: 68 65 20 65 6e 74 69 74 79 20 6e 61 6d 65 2e 0a  he entity name..
bce0: 20 20 2a 2a 20 54 68 69 73 20 70 72 65 76 65 6e    ** This preven
bcf0: 74 73 20 61 74 74 61 63 6b 73 20 69 6e 76 6f 6c  ts attacks invol
bd00: 76 69 6e 67 20 22 2e 2e 22 20 61 6e 64 20 61 6c  ving ".." and al
bd10: 73 6f 20 61 6c 6c 6f 77 73 20 75 73 20 74 6f 20  so allows us to 
bd20: 63 72 65 61 74 65 0a 20 20 2a 2a 20 66 69 6c 65  create.  ** file
bd30: 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65  s and directorie
bd40: 73 20 77 68 6f 73 65 20 6e 61 6d 65 73 20 62 65  s whose names be
bd50: 67 69 6e 20 77 69 74 68 20 22 2d 22 20 6f 72 20  gin with "-" or 
bd60: 22 2e 22 20 77 68 69 63 68 20 61 72 65 0a 20 20  "." which are.  
bd70: 2a 2a 20 69 6e 76 69 73 69 62 6c 65 20 74 6f 20  ** invisible to 
bd80: 74 68 65 20 77 65 62 73 65 72 76 65 72 2e 0a 20  the webserver.. 
bd90: 20 2a 2f 0a 20 20 66 6f 72 28 7a 3d 7a 53 63 72   */.  for(z=zScr
bda0: 69 70 74 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20  ipt; *z; z++){. 
bdb0: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2f 27 20 26     if( *z=='/' &
bdc0: 26 20 28 7a 5b 31 5d 3d 3d 27 2e 27 20 7c 7c 20  & (z[1]=='.' || 
bdd0: 7a 5b 31 5d 3d 3d 27 2d 27 29 20 29 7b 0a 20 20  z[1]=='-') ){.  
bde0: 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f       NotFound(__
bdf0: 4c 49 4e 45 5f 5f 29 3b 20 2f 2a 20 4c 4f 47 3a  LINE__); /* LOG:
be00: 20 50 61 74 68 20 65 6c 65 6d 65 6e 74 20 62 65   Path element be
be10: 67 69 6e 73 20 77 69 74 68 20 22 2e 22 20 6f 72  gins with "." or
be20: 20 22 2d 22 20 2a 2f 0a 20 20 20 20 7d 0a 20 20   "-" */.    }.  
be30: 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  }..  /* Figure o
be40: 75 74 20 77 68 61 74 20 74 68 65 20 72 6f 6f 74  ut what the root
be50: 20 6f 66 20 74 68 65 20 66 69 6c 65 73 79 73 74   of the filesyst
be60: 65 6d 20 73 68 6f 75 6c 64 20 62 65 2e 20 20 49  em should be.  I
be70: 66 20 74 68 65 0a 20 20 2a 2a 20 48 54 54 50 5f  f the.  ** HTTP_
be80: 48 4f 53 54 20 70 61 72 61 6d 65 74 65 72 20 65  HOST parameter e
be90: 78 69 73 74 73 20 28 73 74 6f 72 65 64 20 69 6e  xists (stored in
bea0: 20 7a 48 74 74 70 48 6f 73 74 29 20 74 68 65 6e   zHttpHost) then
beb0: 20 72 65 6d 6f 76 65 20 74 68 65 0a 20 20 2a 2a   remove the.  **
bec0: 20 70 6f 72 74 20 6e 75 6d 62 65 72 20 66 72 6f   port number fro
bed0: 6d 20 74 68 65 20 65 6e 64 20 28 69 66 20 61 6e  m the end (if an
bee0: 79 29 2c 20 63 6f 6e 76 65 72 74 20 61 6c 6c 20  y), convert all 
bef0: 63 68 61 72 61 63 74 65 72 73 20 74 6f 20 6c 6f  characters to lo
bf00: 77 65 72 0a 20 20 2a 2a 20 63 61 73 65 2c 20 61  wer.  ** case, a
bf10: 6e 64 20 63 6f 6e 76 65 72 74 20 61 6c 6c 20 22  nd convert all "
bf20: 2e 22 20 74 6f 20 22 5f 22 2e 20 20 54 68 65 6e  ." to "_".  Then
bf30: 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 20 64   try to find a d
bf40: 69 72 65 63 74 6f 72 79 0a 20 20 2a 2a 20 77 69  irectory.  ** wi
bf50: 74 68 20 74 68 61 74 20 6e 61 6d 65 20 61 6e 64  th that name and
bf60: 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 2e   the extension .
bf70: 77 65 62 73 69 74 65 2e 20 20 49 66 20 6e 6f 74  website.  If not
bf80: 20 66 6f 75 6e 64 2c 20 6c 6f 6f 6b 0a 20 20 2a   found, look.  *
bf90: 2a 20 66 6f 72 20 22 64 65 66 61 75 6c 74 2e 77  * for "default.w
bfa0: 65 62 73 69 74 65 22 2e 0a 20 20 2a 2f 0a 20 20  ebsite"..  */.  
bfb0: 69 66 28 20 7a 53 63 72 69 70 74 5b 30 5d 21 3d  if( zScript[0]!=
bfc0: 27 2f 27 20 29 7b 0a 20 20 20 20 4e 6f 74 46 6f  '/' ){.    NotFo
bfd0: 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 2f  und(__LINE__); /
bfe0: 2a 20 4c 4f 47 3a 20 55 52 49 20 64 6f 65 73 20  * LOG: URI does 
bff0: 6e 6f 74 20 73 74 61 72 74 20 77 69 74 68 20 22  not start with "
c000: 2f 22 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  /" */.  }.  if( 
c010: 73 74 72 6c 65 6e 28 7a 52 6f 6f 74 29 2b 34 30  strlen(zRoot)+40
c020: 20 3e 3d 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65   >= sizeof(zLine
c030: 29 20 29 7b 0a 20 20 20 20 20 4e 6f 74 46 6f 75  ) ){.     NotFou
c040: 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 2f 2a  nd(__LINE__); /*
c050: 20 4c 4f 47 3a 20 55 52 49 20 74 6f 6f 20 6c 6f   LOG: URI too lo
c060: 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ng */.  }.  if( 
c070: 7a 48 74 74 70 48 6f 73 74 3d 3d 30 20 7c 7c 20  zHttpHost==0 || 
c080: 7a 48 74 74 70 48 6f 73 74 5b 30 5d 3d 3d 30 20  zHttpHost[0]==0 
c090: 29 7b 0a 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28  ){.    NotFound(
c0a0: 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 20 2f 2a 20 4c  __LINE__);  /* L
c0b0: 4f 47 3a 20 4d 69 73 73 69 6e 67 20 48 4f 53 54  OG: Missing HOST
c0c0: 3a 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  : parameter */. 
c0d0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6c 65   }else if( strle
c0e0: 6e 28 7a 48 74 74 70 48 6f 73 74 29 2b 73 74 72  n(zHttpHost)+str
c0f0: 6c 65 6e 28 7a 52 6f 6f 74 29 2b 31 30 20 3e 3d  len(zRoot)+10 >=
c100: 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 20 29   sizeof(zLine) )
c110: 7b 0a 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f  {.    NotFound(_
c120: 5f 4c 49 4e 45 5f 5f 29 3b 20 20 2f 2a 20 4c 4f  _LINE__);  /* LO
c130: 47 3a 20 48 4f 53 54 20 70 61 72 61 6d 65 74 65  G: HOST paramete
c140: 72 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a 20 20  r too long */.  
c150: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 72 69 6e  }else{.    sprin
c160: 74 66 28 7a 4c 69 6e 65 2c 20 22 25 73 2f 25 73  tf(zLine, "%s/%s
c170: 22 2c 20 7a 52 6f 6f 74 2c 20 7a 48 74 74 70 48  ", zRoot, zHttpH
c180: 6f 73 74 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ost);.    for(i=
c190: 73 74 72 6c 65 6e 28 7a 52 6f 6f 74 29 2b 31 3b  strlen(zRoot)+1;
c1a0: 20 7a 4c 69 6e 65 5b 69 5d 20 26 26 20 7a 4c 69   zLine[i] && zLi
c1b0: 6e 65 5b 69 5d 21 3d 27 3a 27 3b 20 69 2b 2b 29  ne[i]!=':'; i++)
c1c0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 20 3d 20  {.      int c = 
c1d0: 7a 4c 69 6e 65 5b 69 5d 3b 0a 20 20 20 20 20 20  zLine[i];.      
c1e0: 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 63 29 20  if( !isalnum(c) 
c1f0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65  ){.        zLine
c200: 5b 69 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20  [i] = '_';.     
c210: 20 7d 65 6c 73 65 20 69 66 28 20 69 73 75 70 70   }else if( isupp
c220: 65 72 28 63 29 20 29 7b 0a 20 20 20 20 20 20 20  er(c) ){.       
c230: 20 7a 4c 69 6e 65 5b 69 5d 20 3d 20 74 6f 6c 6f   zLine[i] = tolo
c240: 77 65 72 28 63 29 3b 0a 20 20 20 20 20 20 7d 0a  wer(c);.      }.
c250: 20 20 20 20 7d 0a 20 20 20 20 73 74 72 63 70 79      }.    strcpy
c260: 28 26 7a 4c 69 6e 65 5b 69 5d 2c 20 22 2e 77 65  (&zLine[i], ".we
c270: 62 73 69 74 65 22 29 3b 0a 20 20 7d 0a 20 20 69  bsite");.  }.  i
c280: 66 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73  f( stat(zLine,&s
c290: 74 61 74 62 75 66 29 20 7c 7c 20 21 53 5f 49 53  tatbuf) || !S_IS
c2a0: 44 49 52 28 73 74 61 74 62 75 66 2e 73 74 5f 6d  DIR(statbuf.st_m
c2b0: 6f 64 65 29 20 29 7b 0a 20 20 20 20 73 70 72 69  ode) ){.    spri
c2c0: 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 25 73 2f 64  ntf(zLine, "%s/d
c2d0: 65 66 61 75 6c 74 2e 77 65 62 73 69 74 65 22 2c  efault.website",
c2e0: 20 7a 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28   zRoot);.    if(
c2f0: 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61   stat(zLine,&sta
c300: 74 62 75 66 29 20 7c 7c 20 21 53 5f 49 53 44 49  tbuf) || !S_ISDI
c310: 52 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64  R(statbuf.st_mod
c320: 65 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  e) ){.      if( 
c330: 73 74 61 6e 64 61 6c 6f 6e 65 20 29 7b 0a 20 20  standalone ){.  
c340: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c        sprintf(zL
c350: 69 6e 65 2c 20 22 25 73 22 2c 20 7a 52 6f 6f 74  ine, "%s", zRoot
c360: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
c370: 20 20 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64          NotFound
c380: 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 20 2f 2a 20  (__LINE__);  /* 
c390: 4c 4f 47 3a 20 2a 2e 77 65 62 73 69 74 65 20 70  LOG: *.website p
c3a0: 65 72 6d 69 73 73 69 6f 6e 73 20 2a 2f 0a 20 20  ermissions */.  
c3b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
c3c0: 20 20 7a 48 6f 6d 65 20 3d 20 53 74 72 44 75 70    zHome = StrDup
c3d0: 28 7a 4c 69 6e 65 29 3b 0a 0a 20 20 2f 2a 20 43  (zLine);..  /* C
c3e0: 68 61 6e 67 65 20 64 69 72 65 63 74 6f 72 69 65  hange directorie
c3f0: 73 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 6f 66  s to the root of
c400: 20 74 68 65 20 48 54 54 50 20 66 69 6c 65 73 79   the HTTP filesy
c410: 73 74 65 6d 0a 20 20 2a 2f 0a 20 20 69 66 28 20  stem.  */.  if( 
c420: 63 68 64 69 72 28 7a 48 6f 6d 65 29 21 3d 30 20  chdir(zHome)!=0 
c430: 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  ){.    char zBuf
c440: 5b 31 30 30 30 5d 3b 0a 20 20 20 20 4d 61 6c 66  [1000];.    Malf
c450: 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f  unction(__LINE__
c460: 2c 20 20 2f 2a 20 4c 4f 47 3a 20 63 68 64 69 72  ,  /* LOG: chdir
c470: 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  () failed */.   
c480: 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 68        "cannot ch
c490: 64 69 72 20 74 6f 20 5b 25 73 5d 20 66 72 6f 6d  dir to [%s] from
c4a0: 20 5b 25 73 5d 22 2c 0a 20 20 20 20 20 20 20 20   [%s]",.        
c4b0: 20 7a 48 6f 6d 65 2c 20 67 65 74 63 77 64 28 7a   zHome, getcwd(z
c4c0: 42 75 66 2c 39 39 39 29 29 3b 0a 20 20 7d 0a 0a  Buf,999));.  }..
c4d0: 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
c4e0: 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65  file in the file
c4f0: 73 79 73 74 65 6d 2e 20 20 57 65 20 6d 69 67 68  system.  We migh
c500: 74 20 68 61 76 65 20 74 6f 20 61 70 70 65 6e 64  t have to append
c510: 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20 22  .  ** the name "
c520: 69 6e 64 65 78 2e 68 74 6d 6c 22 20 69 6e 20 6f  index.html" in o
c530: 72 64 65 72 20 74 6f 20 66 69 6e 64 20 69 74 2e  rder to find it.
c540: 20 20 41 6e 79 20 65 78 63 65 73 73 20 70 61 74    Any excess pat
c550: 68 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  h.  ** informati
c560: 6f 6e 20 69 73 20 70 75 74 20 69 6e 74 6f 20 74  on is put into t
c570: 68 65 20 7a 50 61 74 68 49 6e 66 6f 20 76 61 72  he zPathInfo var
c580: 69 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4c  iable..  */.  zL
c590: 69 6e 65 5b 30 5d 20 3d 20 27 2e 27 3b 0a 20 20  ine[0] = '.';.  
c5a0: 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  i = 0;.  while( 
c5b0: 7a 53 63 72 69 70 74 5b 69 5d 20 29 7b 0a 20 20  zScript[i] ){.  
c5c0: 20 20 77 68 69 6c 65 28 20 7a 53 63 72 69 70 74    while( zScript
c5d0: 5b 69 5d 20 26 26 20 7a 53 63 72 69 70 74 5b 69  [i] && zScript[i
c5e0: 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]!='/' ){.      
c5f0: 7a 4c 69 6e 65 5b 69 2b 31 5d 20 3d 20 7a 53 63  zLine[i+1] = zSc
c600: 72 69 70 74 5b 69 5d 3b 0a 20 20 20 20 20 20 69  ript[i];.      i
c610: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4c  ++;.    }.    zL
c620: 69 6e 65 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20  ine[i+1] = 0;.  
c630: 20 20 69 66 28 20 73 74 61 74 28 7a 4c 69 6e 65    if( stat(zLine
c640: 2c 26 73 74 61 74 62 75 66 29 21 3d 30 20 29 7b  ,&statbuf)!=0 ){
c650: 0a 20 20 20 20 20 20 69 6e 74 20 73 74 69 6c 6c  .      int still
c660: 53 65 61 72 63 68 69 6e 67 20 3d 20 31 3b 0a 20  Searching = 1;. 
c670: 20 20 20 20 20 77 68 69 6c 65 28 20 73 74 69 6c       while( stil
c680: 6c 53 65 61 72 63 68 69 6e 67 20 26 26 20 69 3e  lSearching && i>
c690: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  0 ){.        whi
c6a0: 6c 65 28 20 69 3e 30 20 26 26 20 7a 4c 69 6e 65  le( i>0 && zLine
c6b0: 5b 69 5d 21 3d 27 2f 27 20 29 7b 20 69 2d 2d 3b  [i]!='/' ){ i--;
c6c0: 20 7d 0a 20 20 20 20 20 20 20 20 73 74 72 63 70   }.        strcp
c6d0: 79 28 26 7a 4c 69 6e 65 5b 69 5d 2c 20 22 2f 6e  y(&zLine[i], "/n
c6e0: 6f 74 2d 66 6f 75 6e 64 2e 68 74 6d 6c 22 29 3b  ot-found.html");
c6f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 61  .        if( sta
c700: 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75 66  t(zLine,&statbuf
c710: 29 3d 3d 30 20 26 26 20 53 5f 49 53 52 45 47 28  )==0 && S_ISREG(
c720: 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29  statbuf.st_mode)
c730: 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
c740: 61 63 63 65 73 73 28 7a 4c 69 6e 65 2c 52 5f 4f  access(zLine,R_O
c750: 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  K)==0 ){.       
c760: 20 20 20 7a 52 65 61 6c 53 63 72 69 70 74 20 3d     zRealScript =
c770: 20 53 74 72 44 75 70 28 26 7a 4c 69 6e 65 5b 31   StrDup(&zLine[1
c780: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 52 65  ]);.          Re
c790: 64 69 72 65 63 74 28 7a 52 65 61 6c 53 63 72 69  direct(zRealScri
c7a0: 70 74 2c 20 31 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  pt, 1, __LINE__)
c7b0: 3b 20 2f 2a 20 4c 4f 47 3a 20 72 65 64 69 72 65  ; /* LOG: redire
c7c0: 63 74 20 74 6f 20 6e 6f 74 2d 66 6f 75 6e 64 20  ct to not-found 
c7d0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  */.          ret
c7e0: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  urn;.        }el
c7f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 2d  se{.          i-
c800: 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  -;.        }.   
c810: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
c820: 74 69 6c 6c 53 65 61 72 63 68 69 6e 67 20 29 20  tillSearching ) 
c830: 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f  NotFound(__LINE_
c840: 5f 29 3b 20 2f 2a 20 4c 4f 47 3a 20 55 52 49 20  _); /* LOG: URI 
c850: 6e 6f 74 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20  not found */.   
c860: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c870: 20 20 20 20 69 66 28 20 53 5f 49 53 52 45 47 28      if( S_ISREG(
c880: 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29  statbuf.st_mode)
c890: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 63   ){.      if( ac
c8a0: 63 65 73 73 28 7a 4c 69 6e 65 2c 52 5f 4f 4b 29  cess(zLine,R_OK)
c8b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 4e 6f 74 46   ){.        NotF
c8c0: 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20  ound(__LINE__); 
c8d0: 20 2f 2a 20 4c 4f 47 3a 20 46 69 6c 65 20 6e 6f   /* LOG: File no
c8e0: 74 20 72 65 61 64 61 62 6c 65 20 2a 2f 0a 20 20  t readable */.  
c8f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 52 65 61      }.      zRea
c900: 6c 53 63 72 69 70 74 20 3d 20 53 74 72 44 75 70  lScript = StrDup
c910: 28 26 7a 4c 69 6e 65 5b 31 5d 29 3b 0a 20 20 20  (&zLine[1]);.   
c920: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c930: 20 20 20 20 69 66 28 20 7a 53 63 72 69 70 74 5b      if( zScript[
c940: 69 5d 3d 3d 30 20 7c 7c 20 7a 53 63 72 69 70 74  i]==0 || zScript
c950: 5b 69 2b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  [i+1]==0 ){.    
c960: 20 20 73 74 72 63 70 79 28 26 7a 4c 69 6e 65 5b    strcpy(&zLine[
c970: 69 2b 31 5d 2c 22 2f 69 6e 64 65 78 2e 68 74 6d  i+1],"/index.htm
c980: 6c 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  l");.      if( s
c990: 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62  tat(zLine,&statb
c9a0: 75 66 29 21 3d 30 20 7c 7c 20 21 53 5f 49 53 52  uf)!=0 || !S_ISR
c9b0: 45 47 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f  EG(statbuf.st_mo
c9c0: 64 65 29 20 0a 20 20 20 20 20 20 7c 7c 20 61 63  de) .      || ac
c9d0: 63 65 73 73 28 7a 4c 69 6e 65 2c 52 5f 4f 4b 29  cess(zLine,R_OK)
c9e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 63   ){.        strc
c9f0: 70 79 28 26 7a 4c 69 6e 65 5b 69 2b 31 5d 2c 22  py(&zLine[i+1],"
ca00: 2f 69 6e 64 65 78 2e 63 67 69 22 29 3b 0a 20 20  /index.cgi");.  
ca10: 20 20 20 20 20 20 69 66 28 20 73 74 61 74 28 7a        if( stat(z
ca20: 4c 69 6e 65 2c 26 73 74 61 74 62 75 66 29 21 3d  Line,&statbuf)!=
ca30: 30 20 7c 7c 20 21 53 5f 49 53 52 45 47 28 73 74  0 || !S_ISREG(st
ca40: 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 0a  atbuf.st_mode) .
ca50: 20 20 20 20 20 20 20 20 7c 7c 20 61 63 63 65 73          || acces
ca60: 73 28 7a 4c 69 6e 65 2c 52 5f 4f 4b 29 20 29 7b  s(zLine,R_OK) ){
ca70: 0a 20 20 20 20 20 20 20 20 20 20 4e 6f 74 46 6f  .          NotFo
ca80: 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 2f  und(__LINE__); /
ca90: 2a 20 4c 4f 47 3a 20 55 52 49 20 69 73 20 61 20  * LOG: URI is a 
caa0: 64 69 72 65 63 74 6f 72 79 20 77 2f 6f 20 69 6e  directory w/o in
cab0: 64 65 78 2e 68 74 6d 6c 20 2a 2f 0a 20 20 20 20  dex.html */.    
cac0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
cad0: 20 20 20 20 7a 52 65 61 6c 53 63 72 69 70 74 20      zRealScript 
cae0: 3d 20 53 74 72 44 75 70 28 26 7a 4c 69 6e 65 5b  = StrDup(&zLine[
caf0: 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  1]);.      if( z
cb00: 53 63 72 69 70 74 5b 69 5d 3d 3d 30 20 29 7b 0a  Script[i]==0 ){.
cb10: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
cb20: 65 20 72 65 71 75 65 73 74 65 64 20 55 52 4c 20  e requested URL 
cb30: 64 6f 65 73 20 6e 6f 74 20 65 6e 64 20 77 69 74  does not end wit
cb40: 68 20 22 2f 22 20 62 75 74 20 77 65 20 68 61 64  h "/" but we had
cb50: 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 61   to.        ** a
cb60: 70 70 65 6e 64 20 22 69 6e 64 65 78 2e 68 74 6d  ppend "index.htm
cb70: 6c 22 2c 20 74 68 65 6e 20 61 20 72 65 64 69 72  l", then a redir
cb80: 65 63 74 20 69 73 20 6e 65 63 65 73 73 61 72 79  ect is necessary
cb90: 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20  .  Otherwise.   
cba0: 20 20 20 20 20 2a 2a 20 6e 6f 6e 65 20 6f 66 20       ** none of 
cbb0: 74 68 65 20 72 65 6c 61 74 69 76 65 20 55 52 4c  the relative URL
cbc0: 73 20 69 6e 20 74 68 65 20 64 65 6c 69 76 65 72  s in the deliver
cbd0: 65 64 20 64 6f 63 75 6d 65 6e 74 20 77 69 6c 6c  ed document will
cbe0: 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63   be.        ** c
cbf0: 6f 72 72 65 63 74 2e 20 2a 2f 0a 20 20 20 20 20  orrect. */.     
cc00: 20 20 20 52 65 64 69 72 65 63 74 28 7a 52 65 61     Redirect(zRea
cc10: 6c 53 63 72 69 70 74 2c 31 2c 5f 5f 4c 49 4e 45  lScript,1,__LINE
cc20: 5f 5f 29 3b 20 2f 2a 20 4c 4f 47 3a 20 72 65 64  __); /* LOG: red
cc30: 69 72 65 63 74 20 74 6f 20 61 64 64 20 74 72 61  irect to add tra
cc40: 69 6c 69 6e 67 20 2f 20 2a 2f 0a 20 20 20 20 20  iling / */.     
cc50: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
cc60: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
cc70: 20 20 20 20 7d 0a 20 20 20 20 7a 4c 69 6e 65 5b      }.    zLine[
cc80: 69 2b 31 5d 20 3d 20 7a 53 63 72 69 70 74 5b 69  i+1] = zScript[i
cc90: 5d 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a  ];.    i++;.  }.
cca0: 20 20 7a 46 69 6c 65 20 3d 20 53 74 72 44 75 70    zFile = StrDup
ccb0: 28 7a 4c 69 6e 65 29 3b 0a 20 20 7a 50 61 74 68  (zLine);.  zPath
ccc0: 49 6e 66 6f 20 3d 20 53 74 72 44 75 70 28 26 7a  Info = StrDup(&z
ccd0: 53 63 72 69 70 74 5b 69 5d 29 3b 0a 20 20 6c 65  Script[i]);.  le
cce0: 6e 46 69 6c 65 20 3d 20 73 74 72 6c 65 6e 28 7a  nFile = strlen(z
ccf0: 46 69 6c 65 29 3b 0a 20 20 7a 44 69 72 20 3d 20  File);.  zDir = 
cd00: 53 74 72 44 75 70 28 7a 46 69 6c 65 29 3b 0a 20  StrDup(zFile);. 
cd10: 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 7a 44   for(i=strlen(zD
cd20: 69 72 29 2d 31 3b 20 69 3e 30 20 26 26 20 7a 44  ir)-1; i>0 && zD
cd30: 69 72 5b 69 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29  ir[i]!='/'; i--)
cd40: 7b 7d 3b 0a 20 20 69 66 28 20 69 3d 3d 30 20 29  {};.  if( i==0 )
cd50: 7b 0a 20 20 20 20 20 73 74 72 63 70 79 28 7a 44  {.     strcpy(zD
cd60: 69 72 2c 22 2f 22 29 3b 0a 20 20 7d 65 6c 73 65  ir,"/");.  }else
cd70: 7b 0a 20 20 20 20 20 7a 44 69 72 5b 69 5d 20 3d  {.     zDir[i] =
cd80: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68   0;.  }..  /* Ch
cd90: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
cda0: 65 72 65 20 69 73 20 61 6e 20 61 75 74 68 6f 72  ere is an author
cdb0: 69 7a 61 74 69 6f 6e 20 66 69 6c 65 2e 20 20 49  ization file.  I
cdc0: 66 20 74 68 65 72 65 20 69 73 2c 0a 20 20 2a 2a  f there is,.  **
cdd0: 20 70 72 6f 63 65 73 73 20 69 74 2e 0a 20 20 2a   process it..  *
cde0: 2f 0a 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e  /.  sprintf(zLin
cdf0: 65 2c 20 22 25 73 2f 2d 61 75 74 68 22 2c 20 7a  e, "%s/-auth", z
ce00: 44 69 72 29 3b 0a 20 20 69 66 28 20 61 63 63 65  Dir);.  if( acce
ce10: 73 73 28 7a 4c 69 6e 65 2c 52 5f 4f 4b 29 3d 3d  ss(zLine,R_OK)==
ce20: 30 20 26 26 20 21 43 68 65 63 6b 42 61 73 69 63  0 && !CheckBasic
ce30: 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e 28 7a 4c  Authorization(zL
ce40: 69 6e 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  ine) ) return;..
ce50: 20 20 2f 2a 20 54 61 6b 65 20 61 70 70 72 6f 70    /* Take approp
ce60: 72 69 61 74 65 20 61 63 74 69 6f 6e 0a 20 20 2a  riate action.  *
ce70: 2f 0a 20 20 69 66 28 20 28 73 74 61 74 62 75 66  /.  if( (statbuf
ce80: 2e 73 74 5f 6d 6f 64 65 20 26 20 30 31 30 30 29  .st_mode & 0100)
ce90: 3d 3d 30 31 30 30 20 26 26 20 61 63 63 65 73 73  ==0100 && access
cea0: 28 7a 46 69 6c 65 2c 58 5f 4f 4b 29 3d 3d 30 20  (zFile,X_OK)==0 
ceb0: 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
cec0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 73 20   The followings 
ced0: 73 74 61 74 69 63 20 76 61 72 69 61 62 6c 65 73  static variables
cee0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 65 74   are used to set
cef0: 75 70 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65  up the environme
cf00: 6e 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  nt.    ** for th
cf10: 65 20 43 47 49 20 73 63 72 69 70 74 0a 20 20 20  e CGI script.   
cf20: 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63   */.    static c
cf30: 68 61 72 20 2a 64 65 66 61 75 6c 74 5f 70 61 74  har *default_pat
cf40: 68 20 3d 20 22 2f 62 69 6e 3a 2f 75 73 72 2f 62  h = "/bin:/usr/b
cf50: 69 6e 22 3b 0a 20 20 20 20 73 74 61 74 69 63 20  in";.    static 
cf60: 63 68 61 72 20 2a 67 61 74 65 77 61 79 5f 69 6e  char *gateway_in
cf70: 74 65 72 66 61 63 65 20 3d 20 22 43 47 49 2f 31  terface = "CGI/1
cf80: 2e 30 22 3b 0a 20 20 20 20 73 74 61 74 69 63 20  .0";.    static 
cf90: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20 63  struct {.      c
cfa0: 68 61 72 20 2a 7a 45 6e 76 4e 61 6d 65 3b 0a 20  har *zEnvName;. 
cfb0: 20 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 45 6e       char **pzEn
cfc0: 76 56 61 6c 75 65 3b 0a 20 20 20 20 7d 20 63 67  vValue;.    } cg
cfd0: 69 65 6e 76 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  ienv[] = {.     
cfe0: 20 7b 20 22 41 55 54 48 5f 54 59 50 45 22 2c 20   { "AUTH_TYPE", 
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d000: 20 20 26 7a 41 75 74 68 54 79 70 65 20 7d 2c 0a    &zAuthType },.
d010: 20 20 20 20 20 20 7b 20 22 41 55 54 48 5f 43 4f        { "AUTH_CO
d020: 4e 54 45 4e 54 22 2c 20 20 20 20 20 20 20 20 20  NTENT",         
d030: 20 20 20 20 20 20 20 26 7a 41 75 74 68 41 72 67         &zAuthArg
d040: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 43 4f 4e   },.      { "CON
d050: 54 45 4e 54 5f 4c 45 4e 47 54 48 22 2c 20 20 20  TENT_LENGTH",   
d060: 20 20 20 20 20 20 20 20 20 20 20 26 7a 43 6f 6e             &zCon
d070: 74 65 6e 74 4c 65 6e 67 74 68 20 7d 2c 0a 20 20  tentLength },.  
d080: 20 20 20 20 7b 20 22 43 4f 4e 54 45 4e 54 5f 54      { "CONTENT_T
d090: 59 50 45 22 2c 20 20 20 20 20 20 20 20 20 20 20  YPE",           
d0a0: 20 20 20 20 20 26 7a 43 6f 6e 74 65 6e 74 54 79       &zContentTy
d0b0: 70 65 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 44  pe },.      { "D
d0c0: 4f 43 55 4d 45 4e 54 5f 52 4f 4f 54 22 2c 20 20  OCUMENT_ROOT",  
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 48               &zH
d0e0: 6f 6d 65 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  ome },.      { "
d0f0: 47 41 54 45 57 41 59 5f 49 4e 54 45 52 46 41 43  GATEWAY_INTERFAC
d100: 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 26 67  E",           &g
d110: 61 74 65 77 61 79 5f 69 6e 74 65 72 66 61 63 65  ateway_interface
d120: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 48 54 54   },.      { "HTT
d130: 50 5f 41 43 43 45 50 54 22 2c 20 20 20 20 20 20  P_ACCEPT",      
d140: 20 20 20 20 20 20 20 20 20 20 20 26 7a 41 63 63             &zAcc
d150: 65 70 74 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  ept },.      { "
d160: 48 54 54 50 5f 43 4f 4f 4b 49 45 22 2c 20 20 20  HTTP_COOKIE",   
d170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
d180: 43 6f 6f 6b 69 65 20 7d 2c 0a 20 20 20 20 20 20  Cookie },.      
d190: 7b 20 22 48 54 54 50 5f 48 4f 53 54 22 2c 20 20  { "HTTP_HOST",  
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1b0: 20 26 7a 48 74 74 70 48 6f 73 74 20 7d 2c 0a 20   &zHttpHost },. 
d1c0: 20 20 20 20 20 7b 20 22 48 54 54 50 5f 52 45 46       { "HTTP_REF
d1d0: 45 52 45 52 22 2c 20 20 20 20 20 20 20 20 20 20  ERER",          
d1e0: 20 20 20 20 20 20 26 7a 52 65 66 65 72 65 72 20        &zReferer 
d1f0: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 48 54 54 50  },.      { "HTTP
d200: 5f 55 53 45 52 5f 41 47 45 4e 54 22 2c 20 20 20  _USER_AGENT",   
d210: 20 20 20 20 20 20 20 20 20 20 26 7a 41 67 65 6e            &zAgen
d220: 74 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 50 41  t },.      { "PA
d230: 54 48 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  TH",            
d240: 20 20 20 20 20 20 20 20 20 20 20 20 26 64 65 66              &def
d250: 61 75 6c 74 5f 70 61 74 68 20 7d 2c 0a 20 20 20  ault_path },.   
d260: 20 20 20 7b 20 22 50 41 54 48 5f 49 4e 46 4f 22     { "PATH_INFO"
d270: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d280: 20 20 20 20 26 7a 50 61 74 68 49 6e 66 6f 20 7d      &zPathInfo }
d290: 2c 0a 20 20 20 20 20 20 7b 20 22 51 55 45 52 59  ,.      { "QUERY
d2a0: 5f 53 54 52 49 4e 47 22 2c 20 20 20 20 20 20 20  _STRING",       
d2b0: 20 20 20 20 20 20 20 20 20 26 7a 51 75 65 72 79           &zQuery
d2c0: 53 74 72 69 6e 67 20 7d 2c 0a 20 20 20 20 20 20  String },.      
d2d0: 7b 20 22 52 45 4d 4f 54 45 5f 41 44 44 52 22 2c  { "REMOTE_ADDR",
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2f0: 20 26 7a 52 65 6d 6f 74 65 41 64 64 72 20 7d 2c   &zRemoteAddr },
d300: 0a 20 20 20 20 20 20 7b 20 22 52 45 51 55 45 53  .      { "REQUES
d310: 54 5f 4d 45 54 48 4f 44 22 2c 20 20 20 20 20 20  T_METHOD",      
d320: 20 20 20 20 20 20 20 20 26 7a 4d 65 74 68 6f 64          &zMethod
d330: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 52 45 51   },.      { "REQ
d340: 55 45 53 54 5f 55 52 49 22 2c 20 20 20 20 20 20  UEST_URI",      
d350: 20 20 20 20 20 20 20 20 20 20 20 26 7a 53 63 72             &zScr
d360: 69 70 74 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  ipt },.      { "
d370: 52 45 4d 4f 54 45 5f 55 53 45 52 22 2c 20 20 20  REMOTE_USER",   
d380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
d390: 52 65 6d 6f 74 65 55 73 65 72 20 7d 2c 0a 20 20  RemoteUser },.  
d3a0: 20 20 20 20 7b 20 22 53 43 52 49 50 54 5f 44 49      { "SCRIPT_DI
d3b0: 52 45 43 54 4f 52 59 22 2c 20 20 20 20 20 20 20  RECTORY",       
d3c0: 20 20 20 20 20 26 7a 44 69 72 20 7d 2c 0a 20 20       &zDir },.  
d3d0: 20 20 20 20 7b 20 22 53 43 52 49 50 54 5f 46 49      { "SCRIPT_FI
d3e0: 4c 45 4e 41 4d 45 22 2c 20 20 20 20 20 20 20 20  LENAME",        
d3f0: 20 20 20 20 20 26 7a 46 69 6c 65 20 7d 2c 0a 20       &zFile },. 
d400: 20 20 20 20 20 7b 20 22 53 43 52 49 50 54 5f 4e       { "SCRIPT_N
d410: 41 4d 45 22 2c 20 20 20 20 20 20 20 20 20 20 20  AME",           
d420: 20 20 20 20 20 20 26 7a 52 65 61 6c 53 63 72 69        &zRealScri
d430: 70 74 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  pt },.      { "S
d440: 45 52 56 45 52 5f 4e 41 4d 45 22 2c 20 20 20 20  ERVER_NAME",    
d450: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 53               &zS
d460: 65 72 76 65 72 4e 61 6d 65 20 7d 2c 0a 20 20 20  erverName },.   
d470: 20 20 20 7b 20 22 53 45 52 56 45 52 5f 50 4f 52     { "SERVER_POR
d480: 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  T",             
d490: 20 20 20 20 26 7a 53 65 72 76 65 72 50 6f 72 74      &zServerPort
d4a0: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 45 52   },.      { "SER
d4b0: 56 45 52 5f 50 52 4f 54 4f 43 4f 4c 22 2c 20 20  VER_PROTOCOL",  
d4c0: 20 20 20 20 20 20 20 20 20 20 20 26 7a 50 72 6f             &zPro
d4d0: 74 6f 63 6f 6c 20 7d 2c 0a 20 20 20 20 7d 3b 0a  tocol },.    };.
d4e0: 20 20 20 20 63 68 61 72 20 2a 7a 42 61 73 65 46      char *zBaseF
d4f0: 69 6c 65 6e 61 6d 65 3b 20 20 20 2f 2a 20 46 69  ilename;   /* Fi
d500: 6c 65 6e 61 6d 65 20 77 69 74 68 6f 75 74 20 64  lename without d
d510: 69 72 65 63 74 6f 72 79 20 70 72 65 66 69 78 20  irectory prefix 
d520: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 69 74  */..    /* If it
d530: 73 20 65 78 65 63 75 74 61 62 6c 65 2c 20 69 74  s executable, it
d540: 20 6d 75 73 74 20 62 65 20 61 20 43 47 49 20 70   must be a CGI p
d550: 72 6f 67 72 61 6d 2e 20 20 53 74 61 72 74 20 62  rogram.  Start b
d560: 79 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67 69 6e  y.    ** changin
d570: 67 20 64 69 72 65 63 74 6f 72 69 65 73 20 74 6f  g directories to
d580: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 68   the directory h
d590: 6f 6c 64 69 6e 67 20 74 68 65 20 70 72 6f 67 72  olding the progr
d5a0: 61 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  am..    */.    i
d5b0: 66 28 20 63 68 64 69 72 28 7a 44 69 72 29 20 29  f( chdir(zDir) )
d5c0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 42 75  {.      char zBu
d5d0: 66 5b 31 30 30 30 5d 3b 0a 20 20 20 20 20 20 4d  f[1000];.      M
d5e0: 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e  alfunction(__LIN
d5f0: 45 5f 5f 2c 20 2f 2a 20 4c 4f 47 3a 20 63 68 64  E__, /* LOG: chd
d600: 69 72 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20  ir() failed */. 
d610: 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f            "canno
d620: 74 20 63 68 64 69 72 20 74 6f 20 5b 25 73 5d 20  t chdir to [%s] 
d630: 66 72 6f 6d 20 5b 25 73 5d 22 2c 20 0a 20 20 20  from [%s]", .   
d640: 20 20 20 20 20 20 20 20 7a 44 69 72 2c 20 67 65          zDir, ge
d650: 74 63 77 64 28 7a 42 75 66 2c 39 39 39 29 29 3b  tcwd(zBuf,999));
d660: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
d670: 65 74 75 70 20 74 68 65 20 65 6e 76 69 72 6f 6e  etup the environ
d680: 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65  ment appropriate
d690: 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ly..    */.    f
d6a0: 6f 72 28 69 3d 30 3b 20 69 3c 28 69 6e 74 29 28  or(i=0; i<(int)(
d6b0: 73 69 7a 65 6f 66 28 63 67 69 65 6e 76 29 2f 73  sizeof(cgienv)/s
d6c0: 69 7a 65 6f 66 28 63 67 69 65 6e 76 5b 30 5d 29  izeof(cgienv[0])
d6d0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
d6e0: 66 28 20 2a 63 67 69 65 6e 76 5b 69 5d 2e 70 7a  f( *cgienv[i].pz
d6f0: 45 6e 76 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  EnvValue ){.    
d700: 20 20 20 20 53 65 74 45 6e 76 28 63 67 69 65 6e      SetEnv(cgien
d710: 76 5b 69 5d 2e 7a 45 6e 76 4e 61 6d 65 2c 2a 63  v[i].zEnvName,*c
d720: 67 69 65 6e 76 5b 69 5d 2e 70 7a 45 6e 76 56 61  gienv[i].pzEnvVa
d730: 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lue);.      }.  
d740: 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65 48    }.    if( useH
d750: 74 74 70 73 20 29 7b 0a 20 20 20 20 20 20 70 75  ttps ){.      pu
d760: 74 65 6e 76 28 22 48 54 54 50 53 3d 6f 6e 22 29  tenv("HTTPS=on")
d770: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
d780: 20 20 20 20 2a 2a 20 41 62 6f 72 74 20 77 69 74      ** Abort wit
d790: 68 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68  h an error if th
d7a0: 65 20 43 47 49 20 73 63 72 69 70 74 20 69 73 20  e CGI script is 
d7b0: 77 72 69 74 61 62 6c 65 20 62 79 20 61 6e 79 6f  writable by anyo
d7c0: 6e 65 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20  ne other.    ** 
d7d0: 74 68 61 6e 20 69 74 73 20 6f 77 6e 65 72 2e 0a  than its owner..
d7e0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
d7f0: 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 20 26  tatbuf.st_mode &
d800: 20 30 30 32 32 20 29 7b 0a 20 20 20 20 20 20 43   0022 ){.      C
d810: 67 69 53 63 72 69 70 74 57 72 69 74 61 62 6c 65  giScriptWritable
d820: 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ();.    }..    /
d830: 2a 20 46 6f 72 20 74 68 65 20 50 4f 53 54 20 6d  * For the POST m
d840: 65 74 68 6f 64 20 61 6c 6c 20 69 6e 70 75 74 20  ethod all input 
d850: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
d860: 20 74 6f 20 61 20 74 65 6d 70 6f 72 61 72 79 20   to a temporary 
d870: 66 69 6c 65 2c 0a 20 20 20 20 2a 2a 20 73 6f 20  file,.    ** so 
d880: 77 65 20 68 61 76 65 20 74 6f 20 72 65 64 69 72  we have to redir
d890: 65 63 74 20 69 6e 70 75 74 20 74 6f 20 74 68 65  ect input to the
d8a0: 20 43 47 49 20 73 63 72 69 70 74 20 66 72 6f 6d   CGI script from
d8b0: 20 74 68 61 74 20 66 69 6c 65 2e 0a 20 20 20 20   that file..    
d8c0: 2a 2f 0a 20 20 20 20 69 66 28 20 7a 4d 65 74 68  */.    if( zMeth
d8d0: 6f 64 5b 30 5d 3d 3d 27 50 27 20 29 7b 0a 20 20  od[0]=='P' ){.  
d8e0: 20 20 20 20 69 66 28 20 64 75 70 28 30 29 3c 30      if( dup(0)<0
d8f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 61 6c 66   ){.        Malf
d900: 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f  unction(__LINE__
d910: 2c 20 20 2f 2a 20 4c 4f 47 3a 20 64 75 70 28 29  ,  /* LOG: dup()
d920: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
d930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
d940: 55 6e 61 62 6c 65 20 74 6f 20 64 75 70 6c 69 63  Unable to duplic
d950: 61 74 69 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  ation file descr
d960: 69 70 74 6f 72 20 30 22 29 3b 0a 20 20 20 20 20  iptor 0");.     
d970: 20 7d 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 30   }.      close(0
d980: 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e 28 7a 54  );.      open(zT
d990: 6d 70 4e 61 6d 2c 20 4f 5f 52 44 4f 4e 4c 59 29  mpNam, O_RDONLY)
d9a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  ;.    }..    for
d9b0: 28 69 3d 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29  (i=strlen(zFile)
d9c0: 2d 31 3b 20 69 3e 3d 30 20 26 26 20 7a 46 69 6c  -1; i>=0 && zFil
d9d0: 65 5b 69 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b  e[i]!='/'; i--){
d9e0: 7d 0a 20 20 20 20 7a 42 61 73 65 46 69 6c 65 6e  }.    zBaseFilen
d9f0: 61 6d 65 20 3d 20 26 7a 46 69 6c 65 5b 69 2b 31  ame = &zFile[i+1
da00: 5d 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 30 20  ];.    if( i>=0 
da10: 26 26 20 73 74 72 6e 63 6d 70 28 7a 42 61 73 65  && strncmp(zBase
da20: 46 69 6c 65 6e 61 6d 65 2c 22 6e 70 68 2d 22 2c  Filename,"nph-",
da30: 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  4)==0 ){.      /
da40: 2a 20 49 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  * If the name of
da50: 20 74 68 65 20 43 47 49 20 73 63 72 69 70 74 20   the CGI script 
da60: 62 65 67 69 6e 73 20 77 69 74 68 20 22 6e 70 68  begins with "nph
da70: 2d 22 20 74 68 65 6e 20 77 65 20 61 72 65 0a 20  -" then we are. 
da80: 20 20 20 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20       ** dealing 
da90: 77 69 74 68 20 61 20 22 6e 6f 6e 2d 70 61 72 73  with a "non-pars
daa0: 65 64 20 68 65 61 64 65 72 73 22 20 43 47 49 20  ed headers" CGI 
dab0: 73 63 72 69 70 74 2e 20 20 4a 75 73 74 20 65 78  script.  Just ex
dac0: 65 63 28 29 0a 20 20 20 20 20 20 2a 2a 20 69 74  ec().      ** it
dad0: 20 64 69 72 65 63 74 6c 79 20 61 6e 64 20 6c 65   directly and le
dae0: 74 20 69 74 20 68 61 6e 64 6c 65 20 61 6c 6c 20  t it handle all 
daf0: 69 74 73 20 6f 77 6e 20 68 65 61 64 65 72 20 67  its own header g
db00: 65 6e 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 20  eneration..     
db10: 20 2a 2f 0a 20 20 20 20 20 20 65 78 65 63 6c 28   */.      execl(
db20: 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c 7a 42  zBaseFilename,zB
db30: 61 73 65 46 69 6c 65 6e 61 6d 65 2c 28 63 68 61  aseFilename,(cha
db40: 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20  r*)0);.      /* 
db50: 4e 4f 54 45 3a 20 4e 6f 20 6c 6f 67 20 65 6e 74  NOTE: No log ent
db60: 72 79 20 77 72 69 74 74 65 6e 20 66 6f 72 20 6e  ry written for n
db70: 70 68 2d 20 73 63 72 69 70 74 73 20 2a 2f 0a 20  ph- scripts */. 
db80: 20 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20       exit(0);.  
db90: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 61 6c 6c    }..    /* Fall
dba0: 20 74 68 72 75 20 74 6f 20 68 65 72 65 20 6f 6e   thru to here on
dbb0: 6c 79 20 69 66 20 74 68 69 73 20 70 72 6f 63 65  ly if this proce
dbc0: 73 73 20 28 74 68 65 20 73 65 72 76 65 72 29 20  ss (the server) 
dbd0: 69 73 20 67 6f 69 6e 67 0a 20 20 20 20 2a 2a 20  is going.    ** 
dbe0: 74 6f 20 72 65 61 64 20 61 6e 64 20 61 75 67 6d  to read and augm
dbf0: 65 6e 74 20 74 68 65 20 68 65 61 64 65 72 20 73  ent the header s
dc00: 65 6e 74 20 62 61 63 6b 20 62 79 20 74 68 65 20  ent back by the 
dc10: 43 47 49 20 70 72 6f 63 65 73 73 2e 0a 20 20 20  CGI process..   
dc20: 20 2a 2a 20 4f 70 65 6e 20 61 20 70 69 70 65 20   ** Open a pipe 
dc30: 74 6f 20 72 65 63 65 69 76 65 20 74 68 65 20 6f  to receive the o
dc40: 75 74 70 75 74 20 66 72 6f 6d 20 74 68 65 20 43  utput from the C
dc50: 47 49 20 70 72 6f 63 65 73 73 2e 20 20 54 68 65  GI process.  The
dc60: 6e 0a 20 20 20 20 2a 2a 20 66 6f 72 6b 20 74 68  n.    ** fork th
dc70: 65 20 43 47 49 20 70 72 6f 63 65 73 73 2e 20 20  e CGI process.  
dc80: 4f 6e 63 65 20 65 76 65 72 79 74 68 69 6e 67 20  Once everything 
dc90: 69 73 20 64 6f 6e 65 2c 20 77 65 20 73 68 6f 75  is done, we shou
dca0: 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 61 62 6c  ld be.    ** abl
dcb0: 65 20 74 6f 20 72 65 61 64 20 74 68 65 20 6f 75  e to read the ou
dcc0: 74 70 75 74 20 6f 66 20 43 47 49 20 6f 6e 20 74  tput of CGI on t
dcd0: 68 65 20 22 69 6e 22 20 73 74 72 65 61 6d 2e 0a  he "in" stream..
dce0: 20 20 20 20 2a 2f 0a 20 20 20 20 7b 0a 20 20 20      */.    {.   
dcf0: 20 20 20 69 6e 74 20 70 78 5b 32 5d 3b 0a 20 20     int px[2];.  
dd00: 20 20 20 20 69 66 28 20 70 69 70 65 28 70 78 29      if( pipe(px)
dd10: 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 61 6c 66   ){.        Malf
dd20: 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f  unction(__LINE__
dd30: 2c 20 2f 2a 20 4c 4f 47 3a 20 70 69 70 65 28 29  , /* LOG: pipe()
dd40: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
dd60: 55 6e 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65  Unable to create
dd70: 20 61 20 70 69 70 65 20 66 6f 72 20 74 68 65 20   a pipe for the 
dd80: 43 47 49 20 70 72 6f 67 72 61 6d 22 29 3b 0a 20  CGI program");. 
dd90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
dda0: 20 66 6f 72 6b 28 29 3d 3d 30 20 29 7b 0a 20 20   fork()==0 ){.  
ddb0: 20 20 20 20 20 20 63 6c 6f 73 65 28 70 78 5b 30        close(px[0
ddc0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73  ]);.        clos
ddd0: 65 28 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  e(1);.        if
dde0: 28 20 64 75 70 28 70 78 5b 31 5d 29 21 3d 31 20  ( dup(px[1])!=1 
ddf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 4d 61 6c  ){.          Mal
de00: 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f  function(__LINE_
de10: 5f 2c 20 2f 2a 20 4c 4f 47 3a 20 64 75 70 28 29  _, /* LOG: dup()
de20: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
de30: 20 20 20 20 20 20 20 20 20 20 20 20 22 55 6e 61              "Una
de40: 62 6c 65 20 74 6f 20 64 75 70 6c 69 63 61 74 65  ble to duplicate
de50: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
de60: 20 25 64 20 74 6f 20 31 22 2c 0a 20 20 20 20 20   %d to 1",.     
de70: 20 20 20 20 20 20 20 20 20 20 20 20 70 78 5b 31              px[1
de80: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
de90: 20 20 20 20 20 20 63 6c 6f 73 65 28 70 78 5b 31        close(px[1
dea0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 65 78 65 63  ]);.        exec
deb0: 6c 28 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c  l(zBaseFilename,
dec0: 20 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c 20   zBaseFilename, 
ded0: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
dee0: 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20 20 20     exit(0);.    
def0: 20 20 7d 0a 20 20 20 20 20 20 63 6c 6f 73 65 28    }.      close(
df00: 70 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 6e  px[1]);.      in
df10: 20 3d 20 66 64 6f 70 65 6e 28 70 78 5b 30 5d 2c   = fdopen(px[0],
df20: 20 22 72 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20   "r");.    }.   
df30: 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20   if( in==0 ){.  
df40: 20 20 20 20 43 67 69 45 72 72 6f 72 28 29 3b 0a      CgiError();.
df50: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
df60: 61 64 20 61 6e 64 20 70 72 6f 63 65 73 73 20 74  ad and process t
df70: 68 65 20 66 69 72 73 74 20 6c 69 6e 65 20 6f 66  he first line of
df80: 20 74 68 65 20 68 65 61 64 65 72 20 72 65 74 75   the header retu
df90: 72 6e 65 64 20 62 79 20 74 68 65 0a 20 20 20 20  rned by the.    
dfa0: 2a 2a 20 43 47 49 20 73 63 72 69 70 74 2e 0a 20  ** CGI script.. 
dfb0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73     */.    if( us
dfc0: 65 54 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d  eTimeout ) alarm
dfd0: 28 31 35 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  (15);.    while(
dfe0: 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 73 69 7a   fgets(zLine,siz
dff0: 65 6f 66 28 7a 4c 69 6e 65 29 2c 69 6e 29 20 29  eof(zLine),in) )
e000: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  {.      if( strn
e010: 63 6d 70 28 7a 4c 69 6e 65 2c 22 4c 6f 63 61 74  cmp(zLine,"Locat
e020: 69 6f 6e 3a 22 2c 39 29 3d 3d 30 20 29 7b 0a 20  ion:",9)==0 ){. 
e030: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
e040: 20 20 20 20 20 20 52 65 6d 6f 76 65 4e 65 77 6c        RemoveNewl
e050: 69 6e 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  ine(zLine);.    
e060: 20 20 20 20 7a 20 3d 20 26 7a 4c 69 6e 65 5b 31      z = &zLine[1
e070: 30 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  0];.        whil
e080: 65 28 20 69 73 73 70 61 63 65 28 2a 7a 29 20 29  e( isspace(*z) )
e090: 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20  { z++; }.       
e0a0: 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20   for(i=0; z[i]; 
e0b0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
e0c0: 69 66 28 20 7a 5b 69 5d 3d 3d 27 3f 27 20 29 7b  if( z[i]=='?' ){
e0d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75  .            zQu
e0e0: 65 72 79 53 75 66 66 69 78 20 3d 20 53 74 72 44  erySuffix = StrD
e0f0: 75 70 28 22 22 29 3b 0a 20 20 20 20 20 20 20 20  up("");.        
e100: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
e110: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 69        .        i
e120: 66 28 20 7a 5b 30 5d 3d 3d 27 2f 27 20 26 26 20  f( z[0]=='/' && 
e130: 7a 5b 31 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  z[1]=='/' ){.   
e140: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 63         /* The sc
e150: 68 65 6d 65 20 69 73 20 6d 69 73 73 69 6e 67 2e  heme is missing.
e160: 20 20 41 64 64 20 69 74 20 69 6e 20 62 65 66 6f    Add it in befo
e170: 72 65 20 72 65 64 69 72 65 63 74 69 6e 67 20 2a  re redirecting *
e180: 2f 0a 20 20 20 20 20 20 20 20 20 20 53 74 61 72  /.          Star
e190: 74 52 65 73 70 6f 6e 73 65 28 22 33 30 32 20 52  tResponse("302 R
e1a0: 65 64 69 72 65 63 74 22 29 3b 0a 20 20 20 20 20  edirect");.     
e1b0: 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69       nOut += pri
e1c0: 6e 74 66 28 22 4c 6f 63 61 74 69 6f 6e 3a 20 25  ntf("Location: %
e1d0: 73 3a 25 73 25 73 5c 72 5c 6e 22 2c 7a 48 74 74  s:%s%s\r\n",zHtt
e1e0: 70 2c 7a 2c 7a 51 75 65 72 79 53 75 66 66 69 78  p,z,zQuerySuffix
e1f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
e200: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
e210: 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2f 27 20  e if( z[0]=='/' 
e220: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
e230: 54 68 65 20 73 63 68 65 6d 65 20 61 6e 64 20 6e  The scheme and n
e240: 65 74 77 6f 72 6b 20 6c 6f 63 61 74 69 6f 6e 20  etwork location 
e250: 61 72 65 20 6d 69 73 73 69 6e 67 20 62 75 74 20  are missing but 
e260: 77 65 20 68 61 76 65 0a 20 20 20 20 20 20 20 20  we have.        
e270: 20 20 2a 2a 20 61 6e 20 61 62 73 6f 6c 75 74 65    ** an absolute
e280: 20 70 61 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20   path. */.      
e290: 20 20 20 20 52 65 64 69 72 65 63 74 28 7a 2c 20      Redirect(z, 
e2a0: 30 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 2f 2a  0, __LINE__); /*
e2b0: 20 4c 4f 47 3a 20 52 65 64 69 72 65 63 74 20 66   LOG: Redirect f
e2c0: 72 6f 6d 20 43 47 49 20 2a 2f 0a 20 20 20 20 20  rom CGI */.     
e2d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e2e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
e2f0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
e300: 20 74 68 65 72 65 20 69 73 20 61 20 73 63 68 65   there is a sche
e310: 6d 65 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 20  me prefix */.   
e320: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b       for(i=0; z[
e330: 69 5d 20 26 26 20 7a 5b 69 5d 21 3d 27 3a 27 20  i] && z[i]!=':' 
e340: 26 26 20 7a 5b 69 5d 21 3d 27 2f 27 3b 20 69 2b  && z[i]!='/'; i+
e350: 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28  +){}.        if(
e360: 20 7a 5b 69 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20   z[i]==':' ){.  
e370: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61          /* We ha
e380: 76 65 20 61 20 73 63 68 65 6d 65 2e 20 20 41 73  ve a scheme.  As
e390: 73 75 6d 65 20 74 68 65 72 65 20 69 73 20 61 6e  sume there is an
e3a0: 20 61 62 73 6f 6c 75 74 65 20 55 52 4c 20 2a 2f   absolute URL */
e3b0: 0a 20 20 20 20 20 20 20 20 20 20 53 74 61 72 74  .          Start
e3c0: 52 65 73 70 6f 6e 73 65 28 22 33 30 32 20 52 65  Response("302 Re
e3d0: 64 69 72 65 63 74 22 29 3b 0a 20 20 20 20 20 20  direct");.      
e3e0: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
e3f0: 74 66 28 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73  tf("Location: %s
e400: 25 73 5c 72 5c 6e 22 2c 7a 2c 7a 51 75 65 72 79  %s\r\n",z,zQuery
e410: 53 75 66 66 69 78 29 3b 0a 20 20 20 20 20 20 20  Suffix);.       
e420: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
e430: 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d    }.        /* M
e440: 75 73 74 20 62 65 20 61 20 72 65 6c 61 74 69 76  ust be a relativ
e450: 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 43 6f 6e  e pathname.  Con
e460: 73 74 72 75 63 74 20 74 68 65 20 61 62 73 6f 6c  struct the absol
e470: 75 74 65 20 70 61 74 68 6e 61 6d 65 0a 20 20 20  ute pathname.   
e480: 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 64 69       ** and redi
e490: 72 65 63 74 20 74 6f 20 69 74 2e 20 2a 2f 0a 20  rect to it. */. 
e4a0: 20 20 20 20 20 20 20 69 20 3d 20 73 74 72 6c 65         i = strle
e4b0: 6e 28 7a 52 65 61 6c 53 63 72 69 70 74 29 3b 0a  n(zRealScript);.
e4c0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69          while( i
e4d0: 3e 30 20 26 26 20 7a 52 65 61 6c 53 63 72 69 70  >0 && zRealScrip
e4e0: 74 5b 69 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 69  t[i-1]!='/' ){ i
e4f0: 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 77 68  --; }.        wh
e500: 69 6c 65 28 20 69 3e 30 20 26 26 20 7a 52 65 61  ile( i>0 && zRea
e510: 6c 53 63 72 69 70 74 5b 69 2d 31 5d 3d 3d 27 2f  lScript[i-1]=='/
e520: 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20  ' ){ i--; }.    
e530: 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 3d 3d 27      while( *z=='
e540: 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  .' ){.          
e550: 69 66 28 20 7a 5b 31 5d 3d 3d 27 2f 27 20 29 7b  if( z[1]=='/' ){
e560: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 2b  .            z +
e570: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 2;.          }
e580: 65 6c 73 65 20 69 66 28 20 7a 5b 31 5d 3d 3d 27  else if( z[1]=='
e590: 2e 27 20 26 26 20 7a 5b 32 5d 3d 3d 27 2f 27 20  .' && z[2]=='/' 
e5a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77  ){.            w
e5b0: 68 69 6c 65 28 20 69 3e 30 20 26 26 20 7a 52 65  hile( i>0 && zRe
e5c0: 61 6c 53 63 72 69 70 74 5b 69 2d 31 5d 21 3d 27  alScript[i-1]!='
e5d0: 2f 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20  /' ){ i--; }.   
e5e0: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
e5f0: 69 3e 30 20 26 26 20 7a 52 65 61 6c 53 63 72 69  i>0 && zRealScri
e600: 70 74 5b 69 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20  pt[i-1]=='/' ){ 
e610: 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 20  i--; }.         
e620: 20 20 20 7a 20 2b 3d 20 33 3b 0a 20 20 20 20 20     z += 3;.     
e630: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e640: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e650: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
e660: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 53 74 61     }.        Sta
e670: 72 74 52 65 73 70 6f 6e 73 65 28 22 33 30 32 20  rtResponse("302 
e680: 52 65 64 69 72 65 63 74 22 29 3b 0a 20 20 20 20  Redirect");.    
e690: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
e6a0: 74 66 28 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73  tf("Location: %s
e6b0: 3a 2f 2f 25 73 22 2c 7a 48 74 74 70 2c 7a 53 65  ://%s",zHttp,zSe
e6c0: 72 76 65 72 4e 61 6d 65 29 3b 0a 20 20 20 20 20  rverName);.     
e6d0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 53     if( strcmp(zS
e6e0: 65 72 76 65 72 50 6f 72 74 2c 22 38 30 22 29 20  erverPort,"80") 
e6f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75  ){.          nOu
e700: 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 3a 25 73  t += printf(":%s
e710: 22 2c 7a 53 65 72 76 65 72 50 6f 72 74 29 3b 0a  ",zServerPort);.
e720: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e730: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
e740: 28 22 25 2e 2a 73 2f 25 73 25 73 5c 72 5c 6e 5c  ("%.*s/%s%s\r\n\
e750: 72 5c 6e 22 2c 69 2c 7a 52 65 61 6c 53 63 72 69  r\n",i,zRealScri
e760: 70 74 2c 7a 2c 7a 51 75 65 72 79 53 75 66 66 69  pt,z,zQuerySuffi
e770: 78 29 3b 0a 20 20 20 20 20 20 20 20 4d 61 6b 65  x);.        Make
e780: 4c 6f 67 45 6e 74 72 79 28 30 2c 20 5f 5f 4c 49  LogEntry(0, __LI
e790: 4e 45 5f 5f 29 3b 20 2f 2a 20 4c 4f 47 3a 20 43  NE__); /* LOG: C
e7a0: 47 49 20 72 65 64 69 72 65 63 74 20 2a 2f 0a 20  GI redirect */. 
e7b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
e7c0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
e7d0: 74 72 6e 63 6d 70 28 7a 4c 69 6e 65 2c 22 53 74  trncmp(zLine,"St
e7e0: 61 74 75 73 3a 22 2c 37 29 3d 3d 30 20 29 7b 0a  atus:",7)==0 ){.
e7f0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
e800: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 37 3b 20         for(i=7; 
e810: 69 73 73 70 61 63 65 28 7a 4c 69 6e 65 5b 69 5d  isspace(zLine[i]
e820: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  ); i++){}.      
e830: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
e840: 28 22 25 73 20 25 73 22 2c 20 7a 50 72 6f 74 6f  ("%s %s", zProto
e850: 63 6f 6c 2c 20 26 7a 4c 69 6e 65 5b 69 5d 29 3b  col, &zLine[i]);
e860: 0a 20 20 20 20 20 20 20 20 73 74 72 6e 63 70 79  .        strncpy
e870: 28 7a 52 65 70 6c 79 53 74 61 74 75 73 2c 20 26  (zReplyStatus, &
e880: 7a 4c 69 6e 65 5b 69 5d 2c 20 33 29 3b 0a 20 20  zLine[i], 3);.  
e890: 20 20 20 20 20 20 7a 52 65 70 6c 79 53 74 61 74        zReplyStat
e8a0: 75 73 5b 33 5d 20 3d 20 30 3b 0a 20 20 20 20 20  us[3] = 0;.     
e8b0: 20 20 20 73 74 61 74 75 73 53 65 6e 74 20 3d 20     statusSent = 
e8c0: 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  1;.        break
e8d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e8e0: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
e8f0: 20 20 20 20 20 20 53 74 61 72 74 52 65 73 70 6f        StartRespo
e900: 6e 73 65 28 22 32 30 30 20 4f 4b 22 29 3b 0a 20  nse("200 OK");. 
e910: 20 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70         nOut += p
e920: 72 69 6e 74 66 28 22 25 73 22 2c 7a 4c 69 6e 65  rintf("%s",zLine
e930: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
e940: 3d 30 3b 20 7a 4c 69 6e 65 5b 69 5d 20 26 26 20  =0; zLine[i] && 
e950: 21 69 73 73 70 61 63 65 28 7a 4c 69 6e 65 5b 69  !isspace(zLine[i
e960: 5d 29 20 26 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d  ]) && zLine[i]!=
e970: 27 3a 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  ':'; i++){}.    
e980: 20 20 20 20 69 66 28 20 69 3c 32 20 7c 7c 20 7a      if( i<2 || z
e990: 4c 69 6e 65 5b 69 5d 21 3d 27 3a 27 20 29 20 62  Line[i]!=':' ) b
e9a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
e9b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
e9c0: 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65   everything else
e9d0: 20 74 68 72 75 20 77 69 74 68 6f 75 74 20 63 68   thru without ch
e9e0: 61 6e 67 65 20 6f 72 20 61 6e 61 6c 79 73 69 73  ange or analysis
e9f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
ea00: 20 75 73 65 54 69 6d 65 6f 75 74 20 29 20 61 6c   useTimeout ) al
ea10: 61 72 6d 28 36 30 2a 35 29 3b 0a 20 20 20 20 77  arm(60*5);.    w
ea20: 68 69 6c 65 28 20 28 63 20 3d 20 67 65 74 63 28  hile( (c = getc(
ea30: 69 6e 29 29 21 3d 45 4f 46 20 29 7b 0a 20 20 20  in))!=EOF ){.   
ea40: 20 20 20 70 75 74 63 28 63 2c 73 74 64 6f 75 74     putc(c,stdout
ea50: 29 3b 0a 20 20 20 20 20 20 6e 4f 75 74 2b 2b 3b  );.      nOut++;
ea60: 0a 20 20 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73  .    }.    fclos
ea70: 65 28 69 6e 29 3b 0a 20 20 7d 65 6c 73 65 20 69  e(in);.  }else i
ea80: 66 28 20 63 6f 75 6e 74 53 6c 61 73 68 65 73 28  f( countSlashes(
ea90: 7a 52 65 61 6c 53 63 72 69 70 74 29 21 3d 63 6f  zRealScript)!=co
eaa0: 75 6e 74 53 6c 61 73 68 65 73 28 7a 53 63 72 69  untSlashes(zScri
eab0: 70 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  pt) ){.    /* If
eac0: 20 74 68 65 20 72 65 71 75 65 73 74 20 55 52 49   the request URI
ead0: 20 66 6f 72 20 73 74 61 74 69 63 20 63 6f 6e 74   for static cont
eae0: 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20 6d 61 74  ent contains mat
eaf0: 65 72 69 61 6c 20 70 61 73 74 20 74 68 65 0a 20  erial past the. 
eb00: 20 20 20 2a 2a 20 61 63 74 75 61 6c 20 63 6f 6e     ** actual con
eb10: 74 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 2c 20  tent file name, 
eb20: 72 65 70 6f 72 74 20 74 68 61 74 20 61 73 20 61  report that as a
eb30: 20 34 30 34 20 65 72 72 6f 72 2e 20 2a 2f 0a 20   404 error. */. 
eb40: 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49     NotFound(__LI
eb50: 4e 45 5f 5f 29 3b 20 2f 2a 20 4c 4f 47 3a 20 45  NE__); /* LOG: E
eb60: 78 63 65 73 73 20 55 52 49 20 63 6f 6e 74 65 6e  xcess URI conten
eb70: 74 20 70 61 73 74 20 73 74 61 74 69 63 20 66 69  t past static fi
eb80: 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 7d 65 6c  le name */.  }el
eb90: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74  se{.    /* If it
eba0: 20 69 73 6e 27 74 20 65 78 65 63 75 74 61 62 6c   isn't executabl
ebb0: 65 20 74 68 65 6e 20 69 74 0a 20 20 20 20 2a 2a  e then it.    **
ebc0: 20 6d 75 73 74 20 61 20 73 69 6d 70 6c 65 20 66   must a simple f
ebd0: 69 6c 65 20 74 68 61 74 20 6e 65 65 64 73 20 74  ile that needs t
ebe0: 6f 20 62 65 20 63 6f 70 69 65 64 20 74 6f 20 6f  o be copied to o
ebf0: 75 74 70 75 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  utput..    */.  
ec00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
ec10: 6f 6e 74 65 6e 74 54 79 70 65 20 3d 20 47 65 74  ontentType = Get
ec20: 4d 69 6d 65 54 79 70 65 28 7a 46 69 6c 65 2c 20  MimeType(zFile, 
ec30: 6c 65 6e 46 69 6c 65 29 3b 0a 0a 20 20 20 20 69  lenFile);..    i
ec40: 66 28 20 7a 54 6d 70 4e 61 6d 20 29 20 75 6e 6c  f( zTmpNam ) unl
ec50: 69 6e 6b 28 7a 54 6d 70 4e 61 6d 29 3b 0a 20 20  ink(zTmpNam);.  
ec60: 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69    in = fopen(zFi
ec70: 6c 65 2c 22 72 22 29 3b 0a 20 20 20 20 69 66 28  le,"r");.    if(
ec80: 20 69 6e 3d 3d 30 20 29 20 4e 6f 74 46 6f 75 6e   in==0 ) NotFoun
ec90: 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 2f 2a 20  d(__LINE__); /* 
eca0: 4c 4f 47 3a 20 66 6f 70 65 6e 28 29 20 66 61 69  LOG: fopen() fai
ecb0: 6c 65 64 20 66 6f 72 20 73 74 61 74 69 63 20 63  led for static c
ecc0: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20 53 74  ontent */.    St
ecd0: 61 72 74 52 65 73 70 6f 6e 73 65 28 22 32 30 30  artResponse("200
ece0: 20 4f 4b 22 29 3b 0a 20 20 20 20 6e 4f 75 74 20   OK");.    nOut 
ecf0: 2b 3d 20 44 61 74 65 54 61 67 28 22 4c 61 73 74  += DateTag("Last
ed00: 2d 4d 6f 64 69 66 69 65 64 22 2c 20 73 74 61 74  -Modified", stat
ed10: 62 75 66 2e 73 74 5f 6d 74 69 6d 65 29 3b 0a 20  buf.st_mtime);. 
ed20: 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74     nOut += print
ed30: 66 28 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a  f("Content-type:
ed40: 20 25 73 5c 72 5c 6e 22 2c 7a 43 6f 6e 74 65 6e   %s\r\n",zConten
ed50: 74 54 79 70 65 29 3b 0a 20 20 20 20 6e 4f 75 74  tType);.    nOut
ed60: 20 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 74   += printf("Cont
ed70: 65 6e 74 2d 6c 65 6e 67 74 68 3a 20 25 64 5c 72  ent-length: %d\r
ed80: 5c 6e 5c 72 5c 6e 22 2c 28 69 6e 74 29 73 74 61  \n\r\n",(int)sta
ed90: 74 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 20  tbuf.st_size);. 
eda0: 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74     fflush(stdout
edb0: 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  );.    if( strcm
edc0: 70 28 7a 4d 65 74 68 6f 64 2c 22 48 45 41 44 22  p(zMethod,"HEAD"
edd0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4d 61  )==0 ){.      Ma
ede0: 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 5f 5f  keLogEntry(0, __
edf0: 4c 49 4e 45 5f 5f 29 3b 20 2f 2a 20 4e 6f 72 6d  LINE__); /* Norm
ee00: 61 6c 20 48 45 41 44 20 72 65 70 6c 79 20 2a 2f  al HEAD reply */
ee10: 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69 6e  .      fclose(in
ee20: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
ee30: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
ee40: 73 65 54 69 6d 65 6f 75 74 20 29 20 61 6c 61 72  seTimeout ) alar
ee50: 6d 28 33 30 20 2b 20 73 74 61 74 62 75 66 2e 73  m(30 + statbuf.s
ee60: 74 5f 73 69 7a 65 2f 31 30 30 30 29 3b 0a 23 69  t_size/1000);.#i
ee70: 66 64 65 66 20 6c 69 6e 75 78 0a 20 20 20 20 7b  fdef linux.    {
ee80: 0a 20 20 20 20 20 20 6f 66 66 5f 74 20 6f 66 66  .      off_t off
ee90: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e  set = 0;.      n
eea0: 4f 75 74 20 2b 3d 20 73 65 6e 64 66 69 6c 65 28  Out += sendfile(
eeb0: 66 69 6c 65 6e 6f 28 73 74 64 6f 75 74 29 2c 20  fileno(stdout), 
eec0: 66 69 6c 65 6e 6f 28 69 6e 29 2c 20 26 6f 66 66  fileno(in), &off
eed0: 73 65 74 2c 20 73 74 61 74 62 75 66 2e 73 74 5f  set, statbuf.st_
eee0: 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6c  size);.    }.#el
eef0: 73 65 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63  se.    while( (c
ef00: 20 3d 20 67 65 74 63 28 69 6e 29 29 21 3d 45 4f   = getc(in))!=EO
ef10: 46 20 29 7b 0a 20 20 20 20 20 20 70 75 74 63 28  F ){.      putc(
ef20: 63 2c 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20  c,stdout);.     
ef30: 20 6e 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 23   nOut++;.    }.#
ef40: 65 6e 64 69 66 0a 20 20 20 20 66 63 6c 6f 73 65  endif.    fclose
ef50: 28 69 6e 29 3b 0a 20 20 7d 0a 20 20 66 66 6c 75  (in);.  }.  fflu
ef60: 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 4d 61  sh(stdout);.  Ma
ef70: 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 5f 5f  keLogEntry(0, __
ef80: 4c 49 4e 45 5f 5f 29 3b 20 20 2f 2a 20 4c 4f 47  LINE__);  /* LOG
ef90: 3a 20 4e 6f 72 6d 61 6c 20 72 65 70 6c 79 20 2a  : Normal reply *
efa0: 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  /..  /* The next
efb0: 20 72 65 71 75 65 73 74 20 6d 75 73 74 20 61 72   request must ar
efc0: 72 69 76 65 20 77 69 74 68 69 6e 20 33 30 20 73  rive within 30 s
efd0: 65 63 6f 6e 64 73 20 6f 72 20 77 65 20 63 6c 6f  econds or we clo
efe0: 73 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  se the connectio
eff0: 6e 0a 20 20 2a 2f 0a 20 20 6f 6d 69 74 4c 6f 67  n.  */.  omitLog
f000: 20 3d 20 31 3b 0a 20 20 69 66 28 20 75 73 65 54   = 1;.  if( useT
f010: 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d 28 33  imeout ) alarm(3
f020: 30 29 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 4d  0);.}..#define M
f030: 41 58 5f 50 41 52 41 4c 4c 45 4c 20 35 30 20 20  AX_PARALLEL 50  
f040: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 69 6d  /* Number of sim
f050: 75 6c 74 61 6e 65 6f 75 73 20 63 68 69 6c 64 72  ultaneous childr
f060: 65 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  en */../*.** All
f070: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 6d 73 20   possible forms 
f080: 6f 66 20 61 6e 20 49 50 20 61 64 64 72 65 73 73  of an IP address
f090: 2e 20 20 4e 65 65 64 65 64 20 74 6f 20 77 6f 72  .  Needed to wor
f0a0: 6b 20 61 72 6f 75 6e 64 20 47 43 43 20 73 74 72  k around GCC str
f0b0: 69 63 74 0a 2a 2a 20 61 6c 69 61 73 69 6e 67 20  ict.** aliasing 
f0c0: 72 75 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65  rules..*/.typede
f0d0: 66 20 75 6e 69 6f 6e 20 7b 0a 20 20 73 74 72 75  f union {.  stru
f0e0: 63 74 20 73 6f 63 6b 61 64 64 72 20 73 61 3b 20  ct sockaddr sa; 
f0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f100: 41 62 73 74 72 61 63 74 20 73 75 70 65 72 63 6c  Abstract supercl
f110: 61 73 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ass */.  struct 
f120: 73 6f 63 6b 61 64 64 72 5f 69 6e 20 73 61 34 3b  sockaddr_in sa4;
f130: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 50 76            /* IPv
f140: 34 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 6f  4 */.  struct so
f150: 63 6b 61 64 64 72 5f 69 6e 36 20 73 61 36 3b 20  ckaddr_in6 sa6; 
f160: 20 20 20 20 20 20 20 20 2f 2a 20 49 50 76 36 20          /* IPv6 
f170: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 6f 63 6b  */.  struct sock
f180: 61 64 64 72 5f 73 74 6f 72 61 67 65 20 73 61 73  addr_storage sas
f190: 3b 20 20 20 20 20 2f 2a 20 53 68 6f 75 6c 64 20  ;     /* Should 
f1a0: 62 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f  be the maximum o
f1b0: 66 20 74 68 65 20 61 62 6f 76 65 20 33 20 2a 2f  f the above 3 */
f1c0: 0a 7d 20 61 64 64 72 65 73 73 3b 0a 0a 2f 2a 0a  .} address;../*.
f1d0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 6e 20  ** Implement an 
f1e0: 48 54 54 50 20 73 65 72 76 65 72 20 64 61 65 6d  HTTP server daem
f1f0: 6f 6e 20 6c 69 73 74 65 6e 69 6e 67 20 6f 6e 20  on listening on 
f200: 70 6f 72 74 20 69 50 6f 72 74 2e 0a 2a 2a 0a 2a  port iPort..**.*
f210: 2a 20 41 73 20 6e 65 77 20 63 6f 6e 6e 65 63 74  * As new connect
f220: 69 6f 6e 73 20 61 72 72 69 76 65 2c 20 66 6f 72  ions arrive, for
f230: 6b 20 61 20 63 68 69 6c 64 20 61 6e 64 20 6c 65  k a child and le
f240: 74 20 63 68 69 6c 64 20 72 65 74 75 72 6e 0a 2a  t child return.*
f250: 2a 20 6f 75 74 20 6f 66 20 74 68 69 73 20 70 72  * out of this pr
f260: 6f 63 65 64 75 72 65 20 63 61 6c 6c 2e 20 20 54  ocedure call.  T
f270: 68 65 20 63 68 69 6c 64 20 77 69 6c 6c 20 68 61  he child will ha
f280: 6e 64 6c 65 20 74 68 65 20 72 65 71 75 65 73 74  ndle the request
f290: 2e 0a 2a 2a 20 54 68 65 20 70 61 72 65 6e 74 20  ..** The parent 
f2a0: 6e 65 76 65 72 20 72 65 74 75 72 6e 73 20 66 72  never returns fr
f2b0: 6f 6d 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  om this procedur
f2c0: 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
f2d0: 30 20 74 6f 20 65 61 63 68 20 63 68 69 6c 64 20  0 to each child 
f2e0: 61 73 20 69 74 20 72 75 6e 73 2e 20 20 49 66 20  as it runs.  If 
f2f0: 75 6e 61 62 6c 65 20 74 6f 20 65 73 74 61 62 6c  unable to establ
f300: 69 73 68 20 61 0a 2a 2a 20 6c 69 73 74 65 6e 69  ish a.** listeni
f310: 6e 67 20 73 6f 63 6b 65 74 2c 20 72 65 74 75 72  ng socket, retur
f320: 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 69  n non-zero..*/.i
f330: 6e 74 20 68 74 74 70 5f 73 65 72 76 65 72 28 63  nt http_server(c
f340: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 6f 72 74  onst char *zPort
f350: 2c 20 69 6e 74 20 6c 6f 63 61 6c 4f 6e 6c 79 29  , int localOnly)
f360: 7b 0a 20 20 69 6e 74 20 6c 69 73 74 65 6e 65 72  {.  int listener
f370: 5b 32 30 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [20];           
f380: 20 2f 2a 20 54 68 65 20 73 65 72 76 65 72 20 73   /* The server s
f390: 6f 63 6b 65 74 73 20 2a 2f 0a 20 20 69 6e 74 20  ockets */.  int 
f3a0: 63 6f 6e 6e 65 63 74 69 6f 6e 3b 20 20 20 20 20  connection;     
f3b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f           /* A so
f3c0: 63 6b 65 74 20 66 6f 72 20 65 61 63 68 20 69 6e  cket for each in
f3d0: 64 69 76 69 64 75 61 6c 20 63 6f 6e 6e 65 63 74  dividual connect
f3e0: 69 6f 6e 20 2a 2f 0a 20 20 66 64 5f 73 65 74 20  ion */.  fd_set 
f3f0: 72 65 61 64 66 64 73 3b 20 20 20 20 20 20 20 20  readfds;        
f400: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20        /* Set of 
f410: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
f420: 20 66 6f 72 20 73 65 6c 65 63 74 28 29 20 2a 2f   for select() */
f430: 0a 20 20 61 64 64 72 65 73 73 20 69 6e 61 64 64  .  address inadd
f440: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
f450: 2f 2a 20 52 65 6d 6f 74 65 20 61 64 64 72 65 73  /* Remote addres
f460: 73 20 2a 2f 0a 20 20 73 6f 63 6b 6c 65 6e 5f 74  s */.  socklen_t
f470: 20 6c 65 6e 61 64 64 72 3b 20 20 20 20 20 20 20   lenaddr;       
f480: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
f490: 20 74 68 65 20 69 6e 61 64 64 72 20 73 74 72 75   the inaddr stru
f4a0: 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 63  cture */.  int c
f4b0: 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  hild;           
f4c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 49 44 20 6f          /* PID o
f4d0: 66 20 74 68 65 20 63 68 69 6c 64 20 70 72 6f 63  f the child proc
f4e0: 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 63 68  ess */.  int nch
f4f0: 69 6c 64 72 65 6e 20 3d 20 30 3b 20 20 20 20 20  ildren = 0;     
f500: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
f510: 6f 66 20 63 68 69 6c 64 20 70 72 6f 63 65 73 73  of child process
f520: 65 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 74  es */.  struct t
f530: 69 6d 65 76 61 6c 20 64 65 6c 61 79 3b 20 20 20  imeval delay;   
f540: 20 20 20 20 20 2f 2a 20 48 6f 77 20 6c 6f 6e 67       /* How long
f550: 20 74 6f 20 77 61 69 74 20 69 6e 73 69 64 65 20   to wait inside 
f560: 73 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 69 6e  select() */.  in
f570: 74 20 6f 70 74 20 3d 20 31 3b 20 20 20 20 20 20  t opt = 1;      
f580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65             /* se
f590: 74 73 6f 63 6b 6f 70 74 20 66 6c 61 67 20 2a 2f  tsockopt flag */
f5a0: 0a 20 20 73 74 72 75 63 74 20 61 64 64 72 69 6e  .  struct addrin
f5b0: 66 6f 20 73 48 69 6e 74 73 3b 20 20 20 20 20 20  fo sHints;      
f5c0: 2f 2a 20 41 64 64 72 65 73 73 20 68 69 6e 74 73  /* Address hints
f5d0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61 64 64   */.  struct add
f5e0: 72 69 6e 66 6f 20 2a 70 41 64 64 72 73 2c 20 2a  rinfo *pAddrs, *
f5f0: 70 3b 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20 72  p; /* */.  int r
f600: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
f610: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
f620: 74 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  t code */.  int 
f630: 69 2c 20 6e 3b 0a 20 20 69 6e 74 20 6d 61 78 46  i, n;.  int maxF
f640: 64 20 3d 20 2d 31 3b 0a 20 20 0a 20 20 6d 65 6d  d = -1;.  .  mem
f650: 73 65 74 28 26 73 48 69 6e 74 73 2c 20 30 2c 20  set(&sHints, 0, 
f660: 73 69 7a 65 6f 66 28 73 48 69 6e 74 73 29 29 3b  sizeof(sHints));
f670: 0a 20 20 69 66 28 20 69 70 76 34 4f 6e 6c 79 20  .  if( ipv4Only 
f680: 29 7b 0a 20 20 20 20 73 48 69 6e 74 73 2e 61 69  ){.    sHints.ai
f690: 5f 66 61 6d 69 6c 79 20 3d 20 50 46 5f 49 4e 45  _family = PF_INE
f6a0: 54 3b 0a 20 20 20 20 2f 2a 70 72 69 6e 74 66 28  T;.    /*printf(
f6b0: 22 69 70 76 34 20 6f 6e 6c 79 5c 6e 22 29 3b 2a  "ipv4 only\n");*
f6c0: 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 70  /.  }else if( ip
f6d0: 76 36 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 48  v6Only ){.    sH
f6e0: 69 6e 74 73 2e 61 69 5f 66 61 6d 69 6c 79 20 3d  ints.ai_family =
f6f0: 20 50 46 5f 49 4e 45 54 36 3b 0a 20 20 20 20 2f   PF_INET6;.    /
f700: 2a 70 72 69 6e 74 66 28 22 69 70 76 36 20 6f 6e  *printf("ipv6 on
f710: 6c 79 5c 6e 22 29 3b 2a 2f 0a 20 20 7d 65 6c 73  ly\n");*/.  }els
f720: 65 7b 0a 20 20 20 20 73 48 69 6e 74 73 2e 61 69  e{.    sHints.ai
f730: 5f 66 61 6d 69 6c 79 20 3d 20 50 46 5f 55 4e 53  _family = PF_UNS
f740: 50 45 43 3b 0a 20 20 7d 0a 20 20 73 48 69 6e 74  PEC;.  }.  sHint
f750: 73 2e 61 69 5f 73 6f 63 6b 74 79 70 65 20 3d 20  s.ai_socktype = 
f760: 53 4f 43 4b 5f 53 54 52 45 41 4d 3b 0a 20 20 73  SOCK_STREAM;.  s
f770: 48 69 6e 74 73 2e 61 69 5f 66 6c 61 67 73 20 3d  Hints.ai_flags =
f780: 20 41 49 5f 50 41 53 53 49 56 45 3b 0a 20 20 73   AI_PASSIVE;.  s
f790: 48 69 6e 74 73 2e 61 69 5f 70 72 6f 74 6f 63 6f  Hints.ai_protoco
f7a0: 6c 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 67 65  l = 0;.  rc = ge
f7b0: 74 61 64 64 72 69 6e 66 6f 28 6c 6f 63 61 6c 4f  taddrinfo(localO
f7c0: 6e 6c 79 20 3f 20 22 6c 6f 63 61 6c 68 6f 73 74  nly ? "localhost
f7d0: 22 3a 20 30 2c 20 7a 50 6f 72 74 2c 20 26 73 48  ": 0, zPort, &sH
f7e0: 69 6e 74 73 2c 20 26 70 41 64 64 72 73 29 3b 0a  ints, &pAddrs);.
f7f0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
f800: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
f810: 22 63 6f 75 6c 64 20 6e 6f 74 20 67 65 74 20 61  "could not get a
f820: 64 64 72 20 69 6e 66 6f 3a 20 25 73 22 2c 20 0a  ddr info: %s", .
f830: 20 20 20 20 20 20 20 20 20 20 20 20 72 63 21 3d              rc!=
f840: 45 41 49 5f 53 59 53 54 45 4d 20 3f 20 67 61 69  EAI_SYSTEM ? gai
f850: 5f 73 74 72 65 72 72 6f 72 28 72 63 29 20 3a 20  _strerror(rc) : 
f860: 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 29  strerror(errno))
f870: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
f880: 20 20 7d 0a 20 20 66 6f 72 28 6e 3d 30 2c 20 70    }.  for(n=0, p
f890: 3d 70 41 64 64 72 73 3b 20 6e 3c 28 69 6e 74 29  =pAddrs; n<(int)
f8a0: 28 73 69 7a 65 6f 66 28 6c 69 73 74 65 6e 65 72  (sizeof(listener
f8b0: 29 2f 73 69 7a 65 6f 66 28 6c 69 73 74 65 6e 65  )/sizeof(listene
f8c0: 72 5b 30 5d 29 29 20 26 26 20 70 21 3d 30 3b 0a  r[0])) && p!=0;.
f8d0: 20 20 20 20 20 20 20 20 70 3d 70 2d 3e 61 69 5f          p=p->ai_
f8e0: 6e 65 78 74 29 7b 0a 20 20 20 20 6c 69 73 74 65  next){.    liste
f8f0: 6e 65 72 5b 6e 5d 20 3d 20 73 6f 63 6b 65 74 28  ner[n] = socket(
f900: 70 2d 3e 61 69 5f 66 61 6d 69 6c 79 2c 20 70 2d  p->ai_family, p-
f910: 3e 61 69 5f 73 6f 63 6b 74 79 70 65 2c 20 70 2d  >ai_socktype, p-
f920: 3e 61 69 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 20  >ai_protocol);. 
f930: 20 20 20 69 66 28 20 6c 69 73 74 65 6e 65 72 5b     if( listener[
f940: 6e 5d 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  n]>=0 ){.      /
f950: 2a 20 69 66 20 77 65 20 63 61 6e 27 74 20 74 65  * if we can't te
f960: 72 6d 69 6e 61 74 65 20 6e 69 63 65 6c 79 2c 20  rminate nicely, 
f970: 61 74 20 6c 65 61 73 74 20 61 6c 6c 6f 77 20 74  at least allow t
f980: 68 65 20 73 6f 63 6b 65 74 20 74 6f 20 62 65 20  he socket to be 
f990: 72 65 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20  reused */.      
f9a0: 73 65 74 73 6f 63 6b 6f 70 74 28 6c 69 73 74 65  setsockopt(liste
f9b0: 6e 65 72 5b 6e 5d 2c 20 53 4f 4c 5f 53 4f 43 4b  ner[n], SOL_SOCK
f9c0: 45 54 2c 20 53 4f 5f 52 45 55 53 45 41 44 44 52  ET, SO_REUSEADDR
f9d0: 2c 26 6f 70 74 2c 20 73 69 7a 65 6f 66 28 6f 70  ,&opt, sizeof(op
f9e0: 74 29 29 3b 0a 20 20 20 20 20 20 0a 23 69 66 20  t));.      .#if 
f9f0: 64 65 66 69 6e 65 64 28 49 50 56 36 5f 56 36 4f  defined(IPV6_V6O
fa00: 4e 4c 59 29 0a 20 20 20 20 20 20 69 66 28 20 70  NLY).      if( p
fa10: 2d 3e 61 69 5f 66 61 6d 69 6c 79 3d 3d 41 46 5f  ->ai_family==AF_
fa20: 49 4e 45 54 36 20 29 7b 0a 20 20 20 20 20 20 20  INET6 ){.       
fa30: 20 69 6e 74 20 76 36 6f 6e 6c 79 20 3d 20 31 3b   int v6only = 1;
fa40: 0a 20 20 20 20 20 20 20 20 73 65 74 73 6f 63 6b  .        setsock
fa50: 6f 70 74 28 6c 69 73 74 65 6e 65 72 5b 6e 5d 2c  opt(listener[n],
fa60: 20 49 50 50 52 4f 54 4f 5f 49 50 56 36 2c 20 49   IPPROTO_IPV6, I
fa70: 50 56 36 5f 56 36 4f 4e 4c 59 2c 0a 20 20 20 20  PV6_V6ONLY,.    
fa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa90: 26 76 36 6f 6e 6c 79 2c 20 73 69 7a 65 6f 66 28  &v6only, sizeof(
faa0: 76 36 6f 6e 6c 79 29 29 3b 0a 20 20 20 20 20 20  v6only));.      
fab0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 0a  }.#endif.      .
fac0: 20 20 20 20 20 20 69 66 28 20 62 69 6e 64 28 6c        if( bind(l
fad0: 69 73 74 65 6e 65 72 5b 6e 5d 2c 20 70 2d 3e 61  istener[n], p->a
fae0: 69 5f 61 64 64 72 2c 20 70 2d 3e 61 69 5f 61 64  i_addr, p->ai_ad
faf0: 64 72 6c 65 6e 29 3c 30 20 29 7b 0a 20 20 20 20  drlen)<0 ){.    
fb00: 20 20 20 20 70 72 69 6e 74 66 28 22 62 69 6e 64      printf("bind
fb10: 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20   failed: %s\n", 
fb20: 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 29  strerror(errno))
fb30: 3b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28  ;.        close(
fb40: 6c 69 73 74 65 6e 65 72 5b 6e 5d 29 3b 0a 20 20  listener[n]);.  
fb50: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
fb60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
fb70: 28 20 6c 69 73 74 65 6e 28 6c 69 73 74 65 6e 65  ( listen(listene
fb80: 72 5b 6e 5d 2c 20 32 30 29 3c 30 20 29 7b 0a 20  r[n], 20)<0 ){. 
fb90: 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 6c         printf("l
fba0: 69 73 74 65 6e 28 29 20 66 61 69 6c 65 64 3a 20  isten() failed: 
fbb0: 25 73 5c 6e 22 2c 20 73 74 72 65 72 72 6f 72 28  %s\n", strerror(
fbc0: 65 72 72 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20  errno));.       
fbd0: 20 63 6c 6f 73 65 28 6c 69 73 74 65 6e 65 72 5b   close(listener[
fbe0: 6e 5d 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  n]);.        con
fbf0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
fc00: 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a       n++;.    }.
fc10: 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29    }.  if( n==0 )
fc20: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
fc30: 64 65 72 72 2c 20 22 63 61 6e 6e 6f 74 20 6f 70  derr, "cannot op
fc40: 65 6e 20 61 6e 79 20 73 6f 63 6b 65 74 73 5c 6e  en any sockets\n
fc50: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ");.    return 1
fc60: 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
fc70: 31 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 63 68  1 ){.    if( nch
fc80: 69 6c 64 72 65 6e 3e 4d 41 58 5f 50 41 52 41 4c  ildren>MAX_PARAL
fc90: 4c 45 4c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  LEL ){.      /* 
fca0: 53 6c 6f 77 20 64 6f 77 6e 20 69 66 20 63 6f 6e  Slow down if con
fcb0: 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61 72 72  nections are arr
fcc0: 69 76 69 6e 67 20 74 6f 6f 20 66 61 73 74 20 2a  iving too fast *
fcd0: 2f 0a 20 20 20 20 20 20 73 6c 65 65 70 28 20 6e  /.      sleep( n
fce0: 63 68 69 6c 64 72 65 6e 2d 4d 41 58 5f 50 41 52  children-MAX_PAR
fcf0: 41 4c 4c 45 4c 20 29 3b 0a 20 20 20 20 7d 0a 20  ALLEL );.    }. 
fd00: 20 20 20 64 65 6c 61 79 2e 74 76 5f 73 65 63 20     delay.tv_sec 
fd10: 3d 20 36 30 3b 0a 20 20 20 20 64 65 6c 61 79 2e  = 60;.    delay.
fd20: 74 76 5f 75 73 65 63 20 3d 20 30 3b 0a 20 20 20  tv_usec = 0;.   
fd30: 20 46 44 5f 5a 45 52 4f 28 26 72 65 61 64 66 64   FD_ZERO(&readfd
fd40: 73 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  s);.    for(i=0;
fd50: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
fd60: 20 20 61 73 73 65 72 74 28 20 6c 69 73 74 65 6e    assert( listen
fd70: 65 72 5b 69 5d 3e 3d 30 20 29 3b 0a 20 20 20 20  er[i]>=0 );.    
fd80: 20 20 46 44 5f 53 45 54 28 20 6c 69 73 74 65 6e    FD_SET( listen
fd90: 65 72 5b 69 5d 2c 20 26 72 65 61 64 66 64 73 29  er[i], &readfds)
fda0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 69 73 74  ;.      if( list
fdb0: 65 6e 65 72 5b 69 5d 3e 6d 61 78 46 64 20 29 20  ener[i]>maxFd ) 
fdc0: 6d 61 78 46 64 20 3d 20 6c 69 73 74 65 6e 65 72  maxFd = listener
fdd0: 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  [i];.    }.    s
fde0: 65 6c 65 63 74 28 20 6d 61 78 46 64 2b 31 2c 20  elect( maxFd+1, 
fdf0: 26 72 65 61 64 66 64 73 2c 20 30 2c 20 30 2c 20  &readfds, 0, 0, 
fe00: 26 64 65 6c 61 79 29 3b 0a 20 20 20 20 66 6f 72  &delay);.    for
fe10: 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
fe20: 0a 20 20 20 20 20 20 69 66 28 20 46 44 5f 49 53  .      if( FD_IS
fe30: 53 45 54 28 6c 69 73 74 65 6e 65 72 5b 69 5d 2c  SET(listener[i],
fe40: 20 26 72 65 61 64 66 64 73 29 20 29 7b 0a 20 20   &readfds) ){.  
fe50: 20 20 20 20 20 20 6c 65 6e 61 64 64 72 20 3d 20        lenaddr = 
fe60: 73 69 7a 65 6f 66 28 69 6e 61 64 64 72 29 3b 0a  sizeof(inaddr);.
fe70: 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69          connecti
fe80: 6f 6e 20 3d 20 61 63 63 65 70 74 28 6c 69 73 74  on = accept(list
fe90: 65 6e 65 72 5b 69 5d 2c 20 26 69 6e 61 64 64 72  ener[i], &inaddr
fea0: 2e 73 61 2c 20 26 6c 65 6e 61 64 64 72 29 3b 0a  .sa, &lenaddr);.
feb0: 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e 6e          if( conn
fec0: 65 63 74 69 6f 6e 3e 3d 30 20 29 7b 0a 20 20 20  ection>=0 ){.   
fed0: 20 20 20 20 20 20 20 63 68 69 6c 64 20 3d 20 66         child = f
fee0: 6f 72 6b 28 29 3b 0a 20 20 20 20 20 20 20 20 20  ork();.         
fef0: 20 69 66 28 20 63 68 69 6c 64 21 3d 30 20 29 7b   if( child!=0 ){
ff00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
ff10: 20 63 68 69 6c 64 3e 30 20 29 20 6e 63 68 69 6c   child>0 ) nchil
ff20: 64 72 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  dren++;.        
ff30: 20 20 20 20 63 6c 6f 73 65 28 63 6f 6e 6e 65 63      close(connec
ff40: 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  tion);.         
ff50: 20 20 20 2f 2a 20 70 72 69 6e 74 66 28 22 73 75     /* printf("su
ff60: 62 70 72 6f 63 65 73 73 20 25 64 20 73 74 61 72  bprocess %d star
ff70: 74 65 64 2e 2e 2e 5c 6e 22 2c 20 63 68 69 6c 64  ted...\n", child
ff80: 29 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74  ); fflush(stdout
ff90: 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ); */.          
ffa0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
ffb0: 20 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 2c     int nErr = 0,
ffc0: 20 66 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20   fd;.           
ffd0: 20 63 6c 6f 73 65 28 30 29 3b 0a 20 20 20 20 20   close(0);.     
ffe0: 20 20 20 20 20 20 20 66 64 20 3d 20 64 75 70 28         fd = dup(
fff0: 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 20  connection);.   
10000 20 20 20 20 20 20 20 20 20 69 66 28 20 66 64 21           if( fd!
10010 3d 30 20 29 20 6e 45 72 72 2b 2b 3b 0a 20 20 20  =0 ) nErr++;.   
10020 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 31           close(1
10030 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
10040 64 20 3d 20 64 75 70 28 63 6f 6e 6e 65 63 74 69  d = dup(connecti
10050 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  on);.           
10060 20 69 66 28 20 66 64 21 3d 31 20 29 20 6e 45 72   if( fd!=1 ) nEr
10070 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r++;.           
10080 20 63 6c 6f 73 65 28 63 6f 6e 6e 65 63 74 69 6f   close(connectio
10090 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
100a0 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 20 20 20  return nErr;.   
100b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
100c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
100d0 20 2f 2a 20 42 75 72 79 20 64 65 61 64 20 63 68   /* Bury dead ch
100e0 69 6c 64 72 65 6e 20 2a 2f 0a 20 20 20 20 20 20  ildren */.      
100f0 77 68 69 6c 65 28 20 28 63 68 69 6c 64 20 3d 20  while( (child = 
10100 77 61 69 74 70 69 64 28 30 2c 20 30 2c 20 57 4e  waitpid(0, 0, WN
10110 4f 48 41 4e 47 29 29 3e 30 20 29 7b 0a 20 20 20  OHANG))>0 ){.   
10120 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 66 28 22       /* printf("
10130 70 72 6f 63 65 73 73 20 25 64 20 65 6e 64 73 5c  process %d ends\
10140 6e 22 2c 20 63 68 69 6c 64 29 3b 20 66 66 6c 75  n", child); fflu
10150 73 68 28 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20  sh(stdout); */. 
10160 20 20 20 20 20 20 20 6e 63 68 69 6c 64 72 65 6e         nchildren
10170 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
10180 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4e 4f 54 20 52  }.  }.  /* NOT R
10190 45 41 43 48 45 44 20 2a 2f 20 20 0a 20 20 65 78  EACHED */  .  ex
101a0 69 74 28 31 29 3b 0a 7d 0a 0a 0a 69 6e 74 20 6d  it(1);.}...int m
101b0 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68  ain(int argc, ch
101c0 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e  ar **argv){.  in
101d0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
101e0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
101f0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 63 68 61  counter */.  cha
10200 72 20 2a 7a 50 65 72 6d 55 73 65 72 20 3d 20 30  r *zPermUser = 0
10210 3b 20 20 20 20 20 20 2f 2a 20 52 75 6e 20 64 61  ;      /* Run da
10220 65 6d 6f 6e 20 77 69 74 68 20 74 68 69 73 20 75  emon with this u
10230 73 65 72 27 73 20 70 65 72 6d 69 73 73 69 6f 6e  ser's permission
10240 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
10250 72 20 2a 7a 50 6f 72 74 20 3d 20 30 3b 20 20 20  r *zPort = 0;   
10260 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 6e   /* Implement an
10270 20 48 54 54 50 20 73 65 72 76 65 72 20 70 72 6f   HTTP server pro
10280 63 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 75 73  cess */.  int us
10290 65 43 68 72 6f 6f 74 4a 61 69 6c 20 3d 20 31 3b  eChrootJail = 1;
102a0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75      /* True to u
102b0 73 65 20 61 20 63 68 61 6e 67 65 2d 72 6f 6f 74  se a change-root
102c0 20 6a 61 69 6c 20 2a 2f 0a 20 20 73 74 72 75 63   jail */.  struc
102d0 74 20 70 61 73 73 77 64 20 2a 70 77 64 20 3d 20  t passwd *pwd = 
102e0 30 3b 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74  0;   /* Informat
102f0 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 75 73  ion about the us
10300 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 63 6f  er */..  /* Reco
10310 72 64 20 74 68 65 20 74 69 6d 65 20 77 68 65 6e  rd the time when
10320 20 70 72 6f 63 65 73 73 69 6e 67 20 62 65 67 69   processing begi
10330 6e 73 2e 0a 20 20 2a 2f 0a 20 20 67 65 74 74 69  ns..  */.  getti
10340 6d 65 6f 66 64 61 79 28 26 62 65 67 69 6e 54 69  meofday(&beginTi
10350 6d 65 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 50 61  me, 0);..  /* Pa
10360 72 73 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  rse command-line
10370 20 61 72 67 75 6d 65 6e 74 73 0a 20 20 2a 2f 0a   arguments.  */.
10380 20 20 77 68 69 6c 65 28 20 61 72 67 63 3e 31 20    while( argc>1 
10390 26 26 20 61 72 67 76 5b 31 5d 5b 30 5d 3d 3d 27  && argv[1][0]=='
103a0 2d 27 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  -' ){.    char *
103b0 7a 20 3d 20 61 72 67 76 5b 31 5d 3b 0a 20 20 20  z = argv[1];.   
103c0 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 61 72   char *zArg = ar
103d0 67 63 3e 3d 33 20 3f 20 61 72 67 76 5b 32 5d 20  gc>=3 ? argv[2] 
103e0 3a 20 22 30 22 3b 0a 20 20 20 20 69 66 28 20 7a  : "0";.    if( z
103f0 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b 31 5d  [0]=='-' && z[1]
10400 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20  =='-' ) z++;.   
10410 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
10420 75 73 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20  user")==0 ){.   
10430 20 20 20 7a 50 65 72 6d 55 73 65 72 20 3d 20 7a     zPermUser = z
10440 41 72 67 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  Arg;.    }else i
10450 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 72 6f  f( strcmp(z,"-ro
10460 6f 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ot")==0 ){.     
10470 20 7a 52 6f 6f 74 20 3d 20 7a 41 72 67 3b 0a 20   zRoot = zArg;. 
10480 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
10490 63 6d 70 28 7a 2c 22 2d 6c 6f 67 66 69 6c 65 22  cmp(z,"-logfile"
104a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 4c  )==0 ){.      zL
104b0 6f 67 46 69 6c 65 20 3d 20 7a 41 72 67 3b 0a 20  ogFile = zArg;. 
104c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
104d0 63 6d 70 28 7a 2c 22 2d 68 74 74 70 73 22 29 3d  cmp(z,"-https")=
104e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 73 65 48  =0 ){.      useH
104f0 74 74 70 73 20 3d 20 61 74 6f 69 28 7a 41 72 67  ttps = atoi(zArg
10500 29 3b 0a 20 20 20 20 20 20 7a 48 74 74 70 20 3d  );.      zHttp =
10510 20 75 73 65 48 74 74 70 73 20 3f 20 22 68 74 74   useHttps ? "htt
10520 70 73 22 20 3a 20 22 68 74 74 70 22 3b 0a 20 20  ps" : "http";.  
10530 20 20 20 20 69 66 28 20 75 73 65 48 74 74 70 73      if( useHttps
10540 20 29 20 7a 52 65 6d 6f 74 65 41 64 64 72 20 3d   ) zRemoteAddr =
10550 20 67 65 74 65 6e 76 28 22 52 45 4d 4f 54 45 5f   getenv("REMOTE_
10560 48 4f 53 54 22 29 3b 0a 20 20 20 20 7d 65 6c 73  HOST");.    }els
10570 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20  e if( strcmp(z, 
10580 22 2d 70 6f 72 74 22 29 3d 3d 30 20 29 7b 0a 20  "-port")==0 ){. 
10590 20 20 20 20 20 7a 50 6f 72 74 20 3d 20 7a 41 72       zPort = zAr
105a0 67 3b 0a 20 20 20 20 20 20 73 74 61 6e 64 61 6c  g;.      standal
105b0 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  one = 1;.    }el
105c0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
105d0 20 22 2d 66 61 6d 69 6c 79 22 29 3d 3d 30 20 29   "-family")==0 )
105e0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
105f0 6d 70 28 7a 41 72 67 2c 20 22 69 70 76 34 22 29  mp(zArg, "ipv4")
10600 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
10610 70 76 34 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20  pv4Only = 1;.   
10620 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
10630 63 6d 70 28 7a 41 72 67 2c 20 22 69 70 76 36 22  cmp(zArg, "ipv6"
10640 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
10650 69 70 76 36 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  ipv6Only = 1;.  
10660 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10670 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f     Malfunction(_
10680 5f 4c 49 4e 45 5f 5f 2c 20 20 2f 2a 20 4c 4f 47  _LINE__,  /* LOG
10690 3a 20 75 6e 6b 6e 6f 77 6e 20 49 50 20 70 72 6f  : unknown IP pro
106a0 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20 20 20 20  tocol */.       
106b0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 75 6e               "un
106c0 6b 6e 6f 77 6e 20 49 50 20 70 72 6f 74 6f 63 6f  known IP protoco
106d0 6c 3a 20 5b 25 73 5d 22 2c 20 7a 41 72 67 29 3b  l: [%s]", zArg);
106e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
106f0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
10700 20 22 2d 6a 61 69 6c 22 29 3d 3d 30 20 29 7b 0a   "-jail")==0 ){.
10710 20 20 20 20 20 20 69 66 28 20 61 74 6f 69 28 7a        if( atoi(z
10720 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Arg)==0 ){.     
10730 20 20 20 75 73 65 43 68 72 6f 6f 74 4a 61 69 6c     useChrootJail
10740 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
10750 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
10760 6d 70 28 7a 2c 20 22 2d 64 65 62 75 67 22 29 3d  mp(z, "-debug")=
10770 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
10780 61 74 6f 69 28 7a 41 72 67 29 20 29 7b 0a 20 20  atoi(zArg) ){.  
10790 20 20 20 20 20 20 75 73 65 54 69 6d 65 6f 75 74        useTimeout
107a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
107b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d    }else{.      M
107c0 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e  alfunction(__LIN
107d0 45 5f 5f 2c 20 2f 2a 20 4c 4f 47 3a 20 75 6e 6b  E__, /* LOG: unk
107e0 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  nown command-lin
107f0 65 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20 6c 61  e argument on la
10800 75 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  unch */.        
10810 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f            "unkno
10820 77 6e 20 61 72 67 75 6d 65 6e 74 3a 20 5b 25 73  wn argument: [%s
10830 5d 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  ]", z);.    }.  
10840 20 20 61 72 67 76 20 2b 3d 20 32 3b 0a 20 20 20    argv += 2;.   
10850 20 61 72 67 63 20 2d 3d 20 32 3b 0a 20 20 7d 0a   argc -= 2;.  }.
10860 20 20 69 66 28 20 7a 52 6f 6f 74 3d 3d 30 20 29    if( zRoot==0 )
10870 7b 0a 20 20 20 20 69 66 28 20 73 74 61 6e 64 61  {.    if( standa
10880 6c 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 7a 52  lone ){.      zR
10890 6f 6f 74 20 3d 20 22 2e 22 3b 0a 20 20 20 20 7d  oot = ".";.    }
108a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d 61 6c 66  else{.      Malf
108b0 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f  unction(__LINE__
108c0 2c 20 2f 2a 20 4c 4f 47 3a 20 2d 2d 72 6f 6f 74  , /* LOG: --root
108d0 20 61 72 67 75 6d 65 6e 74 20 6d 69 73 73 69 6e   argument missin
108e0 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  g */.           
108f0 20 20 20 20 20 20 20 22 6e 6f 20 2d 2d 72 6f 6f         "no --roo
10900 74 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20  t specified");. 
10910 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a     }.  }.  .  /*
10920 20 43 68 61 6e 67 65 20 64 69 72 65 63 74 6f 72   Change director
10930 69 65 73 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  ies to the root 
10940 6f 66 20 74 68 65 20 48 54 54 50 20 66 69 6c 65  of the HTTP file
10950 73 79 73 74 65 6d 2e 20 20 54 68 65 6e 0a 20 20  system.  Then.  
10960 2a 2a 20 63 72 65 61 74 65 20 61 20 63 68 72 6f  ** create a chro
10970 6f 74 20 6a 61 69 6c 20 74 68 65 72 65 2e 0a 20  ot jail there.. 
10980 20 2a 2f 0a 20 20 69 66 28 20 63 68 64 69 72 28   */.  if( chdir(
10990 7a 52 6f 6f 74 29 21 3d 30 20 29 7b 0a 20 20 20  zRoot)!=0 ){.   
109a0 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c   Malfunction(__L
109b0 49 4e 45 5f 5f 2c 20 2f 2a 20 4c 4f 47 3a 20 63  INE__, /* LOG: c
109c0 68 64 69 72 28 29 20 66 61 69 6c 65 64 20 2a 2f  hdir() failed */
109d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
109e0 20 22 63 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20   "cannot change 
109f0 74 6f 20 64 69 72 65 63 74 6f 72 79 20 5b 25 73  to directory [%s
10a00 5d 22 2c 20 7a 52 6f 6f 74 29 3b 0a 20 20 7d 0a  ]", zRoot);.  }.
10a10 0a 20 20 2f 2a 20 47 65 74 20 69 6e 66 6f 72 6d  .  /* Get inform
10a20 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
10a30 75 73 65 72 20 69 66 20 61 76 61 69 6c 61 62 6c  user if availabl
10a40 65 20 2a 2f 0a 20 20 69 66 28 20 7a 50 65 72 6d  e */.  if( zPerm
10a50 55 73 65 72 20 29 20 70 77 64 20 3d 20 67 65 74  User ) pwd = get
10a60 70 77 6e 61 6d 28 7a 50 65 72 6d 55 73 65 72 29  pwnam(zPermUser)
10a70 3b 0a 0a 20 20 2f 2a 20 45 6e 74 65 72 20 74 68  ;..  /* Enter th
10a80 65 20 63 68 72 6f 6f 74 20 6a 61 69 6c 20 69 66  e chroot jail if
10a90 20 72 65 71 75 65 73 74 65 64 20 2a 2f 20 20 0a   requested */  .
10aa0 20 20 69 66 28 20 7a 50 65 72 6d 55 73 65 72 20    if( zPermUser 
10ab0 26 26 20 75 73 65 43 68 72 6f 6f 74 4a 61 69 6c  && useChrootJail
10ac0 20 26 26 20 67 65 74 75 69 64 28 29 3d 3d 30 20   && getuid()==0 
10ad0 29 7b 0a 20 20 20 20 69 66 28 20 63 68 72 6f 6f  ){.    if( chroo
10ae0 74 28 22 2e 22 29 3c 30 20 29 7b 0a 20 20 20 20  t(".")<0 ){.    
10af0 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f    Malfunction(__
10b00 4c 49 4e 45 5f 5f 2c 20 2f 2a 20 4c 4f 47 3a 20  LINE__, /* LOG: 
10b10 63 68 72 6f 6f 74 28 29 20 66 61 69 6c 65 64 20  chroot() failed 
10b20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
10b30 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20       "unable to 
10b40 63 72 65 61 74 65 20 63 68 72 6f 6f 74 20 6a 61  create chroot ja
10b50 69 6c 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  il");.    }else{
10b60 0a 20 20 20 20 20 20 7a 52 6f 6f 74 20 3d 20 22  .      zRoot = "
10b70 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  ";.    }.  }..  
10b80 2f 2a 20 41 63 74 69 76 61 74 65 20 74 68 65 20  /* Activate the 
10b90 73 65 72 76 65 72 2c 20 69 66 20 72 65 71 75 65  server, if reque
10ba0 73 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 7a 50  sted */.  if( zP
10bb0 6f 72 74 20 26 26 20 68 74 74 70 5f 73 65 72 76  ort && http_serv
10bc0 65 72 28 7a 50 6f 72 74 2c 20 30 29 20 29 7b 0a  er(zPort, 0) ){.
10bd0 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28      Malfunction(
10be0 5f 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a 20 4c 4f 47  __LINE__, /* LOG
10bf0 3a 20 73 65 72 76 65 72 20 73 74 61 72 74 75 70  : server startup
10c00 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
10c10 20 20 20 20 20 20 20 20 20 20 20 22 66 61 69 6c             "fail
10c20 65 64 20 74 6f 20 73 74 61 72 74 20 73 65 72 76  ed to start serv
10c30 65 72 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  er");.  }..  /* 
10c40 44 72 6f 70 20 72 6f 6f 74 20 70 72 69 76 69 6c  Drop root privil
10c50 65 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  eges..  */.  if(
10c60 20 7a 50 65 72 6d 55 73 65 72 20 29 7b 0a 20 20   zPermUser ){.  
10c70 20 20 69 66 28 20 70 77 64 20 29 7b 0a 20 20 20    if( pwd ){.   
10c80 20 20 20 69 66 28 20 73 65 74 67 69 64 28 70 77     if( setgid(pw
10c90 64 2d 3e 70 77 5f 67 69 64 29 20 29 7b 0a 20 20  d->pw_gid) ){.  
10ca0 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f        Malfunctio
10cb0 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a 20 4c  n(__LINE__, /* L
10cc0 4f 47 3a 20 73 65 74 67 69 64 28 29 20 66 61 69  OG: setgid() fai
10cd0 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  led */.         
10ce0 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e             "cann
10cf0 6f 74 20 73 65 74 20 67 72 6f 75 70 2d 69 64 20  ot set group-id 
10d00 74 6f 20 25 64 22 2c 20 70 77 64 2d 3e 70 77 5f  to %d", pwd->pw_
10d10 67 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  gid);.      }.  
10d20 20 20 20 20 69 66 28 20 73 65 74 75 69 64 28 70      if( setuid(p
10d30 77 64 2d 3e 70 77 5f 75 69 64 29 20 29 7b 0a 20  wd->pw_uid) ){. 
10d40 20 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69         Malfuncti
10d50 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a 20  on(__LINE__, /* 
10d60 4c 4f 47 3a 20 73 65 74 75 69 64 28 29 20 66 61  LOG: setuid() fa
10d70 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  iled */.        
10d80 20 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e              "can
10d90 6e 6f 74 20 73 65 74 20 75 73 65 72 2d 69 64 20  not set user-id 
10da0 74 6f 20 25 64 22 2c 20 70 77 64 2d 3e 70 77 5f  to %d", pwd->pw_
10db0 75 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  uid);.      }.  
10dc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d    }else{.      M
10dd0 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e  alfunction(__LIN
10de0 45 5f 5f 2c 20 2f 2a 20 4c 4f 47 3a 20 75 6e 6b  E__, /* LOG: unk
10df0 6e 6f 77 6e 20 75 73 65 72 20 2a 2f 0a 20 20 20  nown user */.   
10e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
10e10 6e 6f 20 73 75 63 68 20 75 73 65 72 20 5b 25 73  no such user [%s
10e20 5d 22 2c 20 7a 50 65 72 6d 55 73 65 72 29 3b 0a  ]", zPermUser);.
10e30 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
10e40 67 65 74 75 69 64 28 29 3d 3d 30 20 29 7b 0a 20  getuid()==0 ){. 
10e50 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f     Malfunction(_
10e60 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a 20 4c 4f 47 3a  _LINE__, /* LOG:
10e70 20 63 61 6e 6e 6f 74 20 72 75 6e 20 61 73 20 72   cannot run as r
10e80 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  oot */.         
10e90 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 72         "cannot r
10ea0 75 6e 20 61 73 20 72 6f 6f 74 22 29 3b 0a 20 20  un as root");.  
10eb0 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  }..  /* Get the 
10ec0 49 50 20 61 64 64 72 65 73 73 20 66 72 6f 6d 20  IP address from 
10ed0 77 68 65 6e 63 65 20 74 68 65 20 72 65 71 75 65  whence the reque
10ee0 73 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 20 20  st originates.  
10ef0 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6d 6f 74 65  */.  if( zRemote
10f00 41 64 64 72 3d 3d 30 20 29 7b 0a 20 20 20 20 61  Addr==0 ){.    a
10f10 64 64 72 65 73 73 20 72 65 6d 6f 74 65 41 64 64  ddress remoteAdd
10f20 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  r;.    unsigned 
10f30 69 6e 74 20 73 69 7a 65 20 3d 20 73 69 7a 65 6f  int size = sizeo
10f40 66 28 72 65 6d 6f 74 65 41 64 64 72 29 3b 0a 20  f(remoteAddr);. 
10f50 20 20 20 63 68 61 72 20 7a 48 6f 73 74 5b 4e 49     char zHost[NI
10f60 5f 4d 41 58 48 4f 53 54 5d 3b 0a 20 20 20 20 69  _MAXHOST];.    i
10f70 66 28 20 67 65 74 70 65 65 72 6e 61 6d 65 28 30  f( getpeername(0
10f80 2c 20 26 72 65 6d 6f 74 65 41 64 64 72 2e 73 61  , &remoteAddr.sa
10f90 2c 20 26 73 69 7a 65 29 3e 3d 30 20 29 7b 0a 20  , &size)>=0 ){. 
10fa0 20 20 20 20 20 67 65 74 6e 61 6d 65 69 6e 66 6f       getnameinfo
10fb0 28 26 72 65 6d 6f 74 65 41 64 64 72 2e 73 61 2c  (&remoteAddr.sa,
10fc0 20 73 69 7a 65 2c 20 7a 48 6f 73 74 2c 20 73 69   size, zHost, si
10fd0 7a 65 6f 66 28 7a 48 6f 73 74 29 2c 20 30 2c 20  zeof(zHost), 0, 
10fe0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
10ff0 20 20 20 20 20 4e 49 5f 4e 55 4d 45 52 49 43 48       NI_NUMERICH
11000 4f 53 54 29 3b 0a 20 20 20 20 20 20 7a 52 65 6d  OST);.      zRem
11010 6f 74 65 41 64 64 72 20 3d 20 53 74 72 44 75 70  oteAddr = StrDup
11020 28 7a 48 6f 73 74 29 3b 0a 20 20 20 20 7d 0a 20  (zHost);.    }. 
11030 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73   }..  /* Process
11040 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 65 61   the input strea
11050 6d 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  m */.  for(i=0; 
11060 69 3c 31 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<100; i++){.   
11070 20 50 72 6f 63 65 73 73 4f 6e 65 52 65 71 75 65   ProcessOneReque
11080 73 74 28 30 29 3b 0a 20 20 7d 0a 20 20 50 72 6f  st(0);.  }.  Pro
11090 63 65 73 73 4f 6e 65 52 65 71 75 65 73 74 28 31  cessOneRequest(1
110a0 29 3b 0a 20 20 65 78 69 74 28 30 29 3b 0a 7d 0a  );.  exit(0);.}.