Documentation Source Text

Hex Artifact Content
Login

Artifact 59537dfd3c8f98e587d6c247a82e9b95a1ae0592:


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: 0a 2a 2a 20 42 61 73 69 63 20 41 75 74 68 6f 72  .** Basic Author
1970: 69 7a 61 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 49  ization:.**.** I
1980: 66 20 74 68 65 20 66 69 6c 65 20 22 2d 61 75 74  f the file "-aut
1990: 68 22 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  h" exists in the
19a0: 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20   same directory 
19b0: 61 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66  as the content f
19c0: 69 6c 65 0a 2a 2a 20 28 66 6f 72 20 62 6f 74 68  ile.** (for both
19d0: 20 73 74 61 74 69 63 20 63 6f 6e 74 65 6e 74 20   static content 
19e0: 61 6e 64 20 43 47 49 29 20 74 68 65 6e 20 69 74  and CGI) then it
19f0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e   contains the in
1a00: 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 0a 2a  formation used.*
1a10: 2a 20 66 6f 72 20 62 61 73 69 63 20 61 75 74 68  * for basic auth
1a20: 6f 72 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20  orization.  The 
1a30: 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61  file format is a
1a40: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
1a50: 20 20 20 20 2a 20 20 42 6c 61 6e 6b 20 6c 69 6e      *  Blank lin
1a60: 65 73 20 61 6e 64 20 6c 69 6e 65 73 20 74 68 61  es and lines tha
1a70: 74 20 62 65 67 69 6e 20 77 69 74 68 20 27 23 27  t begin with '#'
1a80: 20 61 72 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20   are ignored.** 
1a90: 20 20 20 2a 20 20 22 68 74 74 70 2d 72 65 64 69     *  "http-redi
1aa0: 72 65 63 74 22 20 66 6f 72 63 65 73 20 61 20 72  rect" forces a r
1ab0: 65 64 69 72 65 63 74 20 74 6f 20 48 54 54 50 53  edirect to HTTPS
1ac0: 20 69 66 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   if not there al
1ad0: 72 65 61 64 79 0a 2a 2a 20 20 20 20 2a 20 20 22  ready.**    *  "
1ae0: 68 74 74 70 73 2d 6f 6e 6c 79 22 20 64 69 73 61  https-only" disa
1af0: 6c 6c 6f 77 73 20 6f 70 65 72 61 74 69 6f 6e 20  llows operation 
1b00: 69 6e 20 48 54 54 50 0a 2a 2a 20 20 20 20 2a 20  in HTTP.**    * 
1b10: 20 22 75 73 65 72 20 4e 41 4d 45 20 4c 4f 47 49   "user NAME LOGI
1b20: 4e 3a 50 41 53 53 57 4f 52 44 22 20 63 68 65 63  N:PASSWORD" chec
1b30: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 4c 4f 47  ks to see if LOG
1b40: 49 4e 3a 50 41 53 53 57 4f 52 44 20 0a 2a 2a 20  IN:PASSWORD .** 
1b50: 20 20 20 20 20 20 61 75 74 68 6f 72 69 7a 61 74        authorizat
1b60: 69 6f 6e 20 63 72 65 64 65 6e 74 69 61 6c 73 20  ion credentials 
1b70: 61 72 65 20 70 72 6f 76 69 64 65 64 2c 20 61 6e  are provided, an
1b80: 64 20 69 66 20 73 6f 20 73 65 74 73 20 74 68 65  d if so sets the
1b90: 0a 2a 2a 20 20 20 20 20 20 20 52 45 4d 4f 54 45  .**       REMOTE
1ba0: 5f 55 53 45 52 20 74 6f 20 4e 41 4d 45 2e 0a 2a  _USER to NAME..*
1bb0: 2a 20 20 20 20 2a 20 20 22 72 65 61 6c 6d 20 54  *    *  "realm T
1bc0: 45 58 54 22 20 73 65 74 73 20 74 68 65 20 72 65  EXT" sets the re
1bd0: 61 6c 6d 20 74 6f 20 54 45 58 54 2e 0a 2a 2a 0a  alm to TEXT..**.
1be0: 2a 2a 20 54 68 65 72 65 20 63 61 6e 20 62 65 20  ** There can be 
1bf0: 6d 75 6c 74 69 70 6c 65 20 22 75 73 65 72 22 20  multiple "user" 
1c00: 6c 69 6e 65 73 2e 20 20 49 66 20 6e 6f 20 22 75  lines.  If no "u
1c10: 73 65 72 22 20 6c 69 6e 65 20 6d 61 74 63 68 65  ser" line matche
1c20: 73 2c 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73  s, the.** reques
1c30: 74 20 66 61 69 6c 73 20 77 69 74 68 20 61 20 34  t fails with a 4
1c40: 30 31 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 69 6e  01 error..*/.#in
1c50: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
1c60: 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e  #include <ctype.
1c70: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
1c80: 6c 6f 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  log.h>.#include 
1c90: 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c  <stdlib.h>.#incl
1ca0: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
1cb0: 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74  .#include <unist
1cc0: 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66  d.h>.#include <f
1cd0: 63 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  cntl.h>.#include
1ce0: 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63   <string.h>.#inc
1cf0: 6c 75 64 65 20 3c 70 77 64 2e 68 3e 0a 23 69 6e  lude <pwd.h>.#in
1d00: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1d10: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
1d20: 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75  /types.h>.#inclu
1d30: 64 65 20 3c 73 79 73 2f 73 6f 63 6b 65 74 2e 68  de <sys/socket.h
1d40: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  >.#include <sys/
1d50: 77 61 69 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  wait.h>.#include
1d60: 20 3c 6e 65 74 69 6e 65 74 2f 69 6e 2e 68 3e 0a   <netinet/in.h>.
1d70: 23 69 6e 63 6c 75 64 65 20 3c 61 72 70 61 2f 69  #include <arpa/i
1d80: 6e 65 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  net.h>.#include 
1d90: 3c 73 74 64 61 72 67 2e 68 3e 0a 23 69 6e 63 6c  <stdarg.h>.#incl
1da0: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1db0: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 73  clude <sys/times
1dc0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6e 65  .h>.#include <ne
1dd0: 74 64 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  tdb.h>.#include 
1de0: 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 6e 63 6c 75  <errno.h>.#inclu
1df0: 64 65 20 3c 73 79 73 2f 72 65 73 6f 75 72 63 65  de <sys/resource
1e00: 2e 68 3e 0a 23 69 66 64 65 66 20 6c 69 6e 75 78  .h>.#ifdef linux
1e10: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73  .#include <sys/s
1e20: 65 6e 64 66 69 6c 65 2e 68 3e 0a 23 65 6e 64 69  endfile.h>.#endi
1e30: 66 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65  f.#include <asse
1e40: 72 74 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  rt.h>../*.** Con
1e50: 66 69 67 75 72 65 20 74 68 65 20 73 65 72 76 65  figure the serve
1e60: 72 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  r by setting the
1e70: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
1e80: 73 20 61 6e 64 20 72 65 63 6f 6d 70 69 6c 69 6e  s and recompilin
1e90: 67 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 44 45  g..*/.#ifndef DE
1ea0: 46 41 55 4c 54 5f 50 4f 52 54 0a 23 64 65 66 69  FAULT_PORT.#defi
1eb0: 6e 65 20 44 45 46 41 55 4c 54 5f 50 4f 52 54 20  ne DEFAULT_PORT 
1ec0: 22 38 30 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e  "80".#endif.#ifn
1ed0: 64 65 66 20 4d 41 58 5f 43 4f 4e 54 45 4e 54 5f  def MAX_CONTENT_
1ee0: 4c 45 4e 47 54 48 0a 23 64 65 66 69 6e 65 20 4d  LENGTH.#define M
1ef0: 41 58 5f 43 4f 4e 54 45 4e 54 5f 4c 45 4e 47 54  AX_CONTENT_LENGT
1f00: 48 20 32 30 30 30 30 30 30 30 0a 23 65 6e 64 69  H 20000000.#endi
1f10: 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 72 65 63 6f  f../*.** We reco
1f20: 72 64 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 73  rd most of the s
1f30: 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tate information
1f40: 20 61 73 20 67 6c 6f 62 61 6c 20 76 61 72 69 61   as global varia
1f50: 62 6c 65 73 2e 20 20 54 68 69 73 0a 2a 2a 20 73  bles.  This.** s
1f60: 61 76 65 73 20 68 61 76 69 6e 67 20 74 6f 20 70  aves having to p
1f70: 61 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ass information 
1f80: 74 6f 20 73 75 62 72 6f 75 74 69 6e 65 73 20 61  to subroutines a
1f90: 73 20 70 61 72 61 6d 65 74 65 72 73 2c 20 61 6e  s parameters, an
1fa0: 64 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 65  d.** makes the e
1fb0: 78 65 63 75 74 61 62 6c 65 20 73 6d 61 6c 6c 65  xecutable smalle
1fc0: 72 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  r....*/.static c
1fd0: 68 61 72 20 2a 7a 52 6f 6f 74 20 3d 20 30 3b 20  har *zRoot = 0; 
1fe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
1ff0: 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68   directory of th
2000: 65 20 77 65 62 73 69 74 65 20 2a 2f 0a 73 74 61  e website */.sta
2010: 74 69 63 20 63 68 61 72 20 2a 7a 54 6d 70 4e 61  tic char *zTmpNa
2020: 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  m = 0;        /*
2030: 20 4e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f   Name of a tempo
2040: 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 73 74 61  rary file */.sta
2050: 74 69 63 20 63 68 61 72 20 7a 54 6d 70 4e 61 6d  tic char zTmpNam
2060: 42 75 66 5b 35 30 30 5d 3b 20 20 20 20 20 2f 2a  Buf[500];     /*
2070: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
2080: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
2090: 65 6e 61 6d 65 20 2a 2f 0a 73 74 61 74 69 63 20  ename */.static 
20a0: 63 68 61 72 20 2a 7a 50 72 6f 74 6f 63 6f 6c 20  char *zProtocol 
20b0: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  = 0;      /* The
20c0: 20 70 72 6f 74 6f 63 6f 6c 20 62 65 69 6e 67 20   protocol being 
20d0: 75 73 69 6e 67 20 62 79 20 74 68 65 20 62 72 6f  using by the bro
20e0: 77 73 65 72 20 2a 2f 0a 73 74 61 74 69 63 20 63  wser */.static c
20f0: 68 61 72 20 2a 7a 4d 65 74 68 6f 64 20 3d 20 30  har *zMethod = 0
2100: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
2110: 6d 65 74 68 6f 64 2e 20 20 4d 75 73 74 20 62 65  method.  Must be
2120: 20 47 45 54 20 2a 2f 0a 73 74 61 74 69 63 20 63   GET */.static c
2130: 68 61 72 20 2a 7a 53 63 72 69 70 74 20 3d 20 30  har *zScript = 0
2140: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
2150: 6f 62 6a 65 63 74 20 74 6f 20 72 65 74 72 69 65  object to retrie
2160: 76 65 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  ve */.static cha
2170: 72 20 2a 7a 52 65 61 6c 53 63 72 69 70 74 20 3d  r *zRealScript =
2180: 20 30 3b 20 20 20 20 2f 2a 20 54 68 65 20 6f 62   0;    /* The ob
2190: 6a 65 63 74 20 74 6f 20 72 65 74 72 69 65 76 65  ject to retrieve
21a0: 2e 20 20 53 61 6d 65 20 61 73 20 7a 53 63 72 69  .  Same as zScri
21b0: 70 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  pt.             
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d0: 20 20 20 20 2a 2a 20 65 78 63 65 70 74 20 6d 69      ** except mi
21e0: 67 68 74 20 68 61 76 65 20 22 2f 69 6e 64 65 78  ght have "/index
21f0: 2e 68 74 6d 6c 22 20 61 70 70 65 6e 64 65 64 20  .html" appended 
2200: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
2210: 7a 48 6f 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  zHome = 0;      
2220: 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63      /* The direc
2230: 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
2240: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 73 74 61 74 69  content */.stati
2250: 63 20 63 68 61 72 20 2a 7a 51 75 65 72 79 53 74  c char *zQuerySt
2260: 72 69 6e 67 20 3d 20 30 3b 20 20 20 2f 2a 20 54  ring = 0;   /* T
2270: 68 65 20 71 75 65 72 79 20 73 74 72 69 6e 67 20  he query string 
2280: 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  on the end of th
2290: 65 20 6e 61 6d 65 20 2a 2f 0a 73 74 61 74 69 63  e name */.static
22a0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 30   char *zFile = 0
22b0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
22c0: 65 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68  e filename of th
22d0: 65 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74 72  e object to retr
22e0: 69 65 76 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  ieve */.static i
22f0: 6e 74 20 6c 65 6e 46 69 6c 65 20 3d 20 30 3b 20  nt lenFile = 0; 
2300: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
2310: 74 68 20 6f 66 20 74 68 65 20 7a 46 69 6c 65 20  th of the zFile 
2320: 6e 61 6d 65 20 2a 2f 0a 73 74 61 74 69 63 20 63  name */.static c
2330: 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 20 20  har *zDir = 0;  
2340: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
2350: 20 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72   of the director
2360: 79 20 68 6f 6c 64 69 6e 67 20 7a 46 69 6c 65 20  y holding zFile 
2370: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
2380: 7a 50 61 74 68 49 6e 66 6f 20 3d 20 30 3b 20 20  zPathInfo = 0;  
2390: 20 20 20 20 2f 2a 20 50 61 72 74 20 6f 66 20 74      /* Part of t
23a0: 68 65 20 70 61 74 68 6e 61 6d 65 20 70 61 73 74  he pathname past
23b0: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 73 74 61   the file */.sta
23c0: 74 69 63 20 63 68 61 72 20 2a 7a 41 67 65 6e 74  tic char *zAgent
23d0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
23e0: 20 57 68 61 74 20 74 79 70 65 20 69 66 20 62 72   What type if br
23f0: 6f 77 73 65 72 20 69 73 20 6d 61 6b 69 6e 67 20  owser is making 
2400: 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 73 74  this query */.st
2410: 61 74 69 63 20 63 68 61 72 20 2a 7a 53 65 72 76  atic char *zServ
2420: 65 72 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f  erName = 0;    /
2430: 2a 20 54 68 65 20 6e 61 6d 65 20 61 66 74 65 72  * The name after
2440: 20 74 68 65 20 68 74 74 70 3a 2f 2f 20 2a 2f 0a   the http:// */.
2450: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 53 65  static char *zSe
2460: 72 76 65 72 50 6f 72 74 20 3d 20 30 3b 20 20 20  rverPort = 0;   
2470: 20 2f 2a 20 54 68 65 20 70 6f 72 74 20 6e 75 6d   /* The port num
2480: 62 65 72 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  ber */.static ch
2490: 61 72 20 2a 7a 43 6f 6f 6b 69 65 20 3d 20 30 3b  ar *zCookie = 0;
24a0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6f 6b 69          /* Cooki
24b0: 65 73 20 72 65 70 6f 72 74 65 64 20 77 69 74 68  es reported with
24c0: 20 74 68 65 20 72 65 71 75 65 73 74 20 2a 2f 0a   the request */.
24d0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 48 74  static char *zHt
24e0: 74 70 48 6f 73 74 20 3d 20 30 3b 20 20 20 20 20  tpHost = 0;     
24f0: 20 2f 2a 20 4e 61 6d 65 20 61 63 63 6f 72 64 69   /* Name accordi
2500: 6e 67 20 74 6f 20 74 68 65 20 77 65 62 20 62 72  ng to the web br
2510: 6f 77 73 65 72 20 2a 2f 0a 73 74 61 74 69 63 20  owser */.static 
2520: 63 68 61 72 20 2a 7a 52 65 61 6c 50 6f 72 74 20  char *zRealPort 
2530: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  = 0;      /* The
2540: 20 72 65 61 6c 20 54 43 50 20 70 6f 72 74 20 77   real TCP port w
2550: 68 65 6e 20 72 75 6e 6e 69 6e 67 20 61 73 20 64  hen running as d
2560: 61 65 6d 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20  aemon */.static 
2570: 63 68 61 72 20 2a 7a 52 65 6d 6f 74 65 41 64 64  char *zRemoteAdd
2580: 72 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 50 20  r = 0;    /* IP 
2590: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 72  address of the r
25a0: 65 71 75 65 73 74 20 2a 2f 0a 73 74 61 74 69 63  equest */.static
25b0: 20 63 68 61 72 20 2a 7a 52 65 66 65 72 65 72 20   char *zReferer 
25c0: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  = 0;       /* Na
25d0: 6d 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  me of the page t
25e0: 68 61 74 20 72 65 66 65 72 65 64 20 74 6f 20 75  hat refered to u
25f0: 73 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  s */.static char
2600: 20 2a 7a 41 63 63 65 70 74 20 3d 20 30 3b 20 20   *zAccept = 0;  
2610: 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 66 6f        /* What fo
2620: 72 6d 61 74 73 20 77 69 6c 6c 20 62 65 20 61 63  rmats will be ac
2630: 63 65 70 74 65 64 20 2a 2f 0a 73 74 61 74 69 63  cepted */.static
2640: 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 4c   char *zContentL
2650: 65 6e 67 74 68 20 3d 20 30 3b 20 2f 2a 20 43 6f  ength = 0; /* Co
2660: 6e 74 65 6e 74 20 6c 65 6e 67 74 68 20 72 65 70  ntent length rep
2670: 6f 72 74 65 64 20 69 6e 20 74 68 65 20 68 65 61  orted in the hea
2680: 64 65 72 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  der */.static ch
2690: 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 54 79 70 65  ar *zContentType
26a0: 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 6e 74 65   = 0;   /* Conte
26b0: 6e 74 20 74 79 70 65 20 72 65 70 6f 72 74 65 64  nt type reported
26c0: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 2a   in the header *
26d0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a  /.static char *z
26e0: 51 75 65 72 79 53 75 66 66 69 78 20 3d 20 30 3b  QuerySuffix = 0;
26f0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 74 20 6f     /* The part o
2700: 66 20 74 68 65 20 55 52 4c 20 61 66 74 65 72 20  f the URL after 
2710: 74 68 65 20 66 69 72 73 74 20 3f 20 2a 2f 0a 73  the first ? */.s
2720: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 41 75 74  tatic char *zAut
2730: 68 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20  hType = 0;      
2740: 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e  /* Authorization
2750: 20 74 79 70 65 20 28 62 61 73 69 63 20 6f 72 20   type (basic or 
2760: 64 69 67 65 73 74 29 20 2a 2f 0a 73 74 61 74 69  digest) */.stati
2770: 63 20 63 68 61 72 20 2a 7a 41 75 74 68 41 72 67  c char *zAuthArg
2780: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41   = 0;       /* A
2790: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 76 61 6c  uthorization val
27a0: 75 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  ues */.static ch
27b0: 61 72 20 2a 7a 52 65 6d 6f 74 65 55 73 65 72 20  ar *zRemoteUser 
27c0: 3d 20 30 3b 20 20 20 20 2f 2a 20 52 45 4d 4f 54  = 0;    /* REMOT
27d0: 45 5f 55 53 45 52 20 73 65 74 20 62 79 20 61 75  E_USER set by au
27e0: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 6d 6f 64 75  thorization modu
27f0: 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  le */.static int
2800: 20 6e 49 6e 20 3d 20 30 3b 20 20 20 20 20 20 20   nIn = 0;       
2810: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2820: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 69 6e 70   of bytes of inp
2830: 75 74 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ut */.static int
2840: 20 6e 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20   nOut = 0;      
2850: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2860: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6f 75 74   of bytes of out
2870: 70 75 74 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  put */.static ch
2880: 61 72 20 7a 52 65 70 6c 79 53 74 61 74 75 73 5b  ar zReplyStatus[
2890: 34 5d 3b 20 20 20 20 20 2f 2a 20 52 65 70 6c 79  4];     /* Reply
28a0: 20 73 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a   status code */.
28b0: 73 74 61 74 69 63 20 69 6e 74 20 73 74 61 74 75  static int statu
28c0: 73 53 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20  sSent = 0;      
28d0: 20 2f 2a 20 54 72 75 65 20 61 66 74 65 72 20 73   /* True after s
28e0: 74 61 74 75 73 20 6c 69 6e 65 20 69 73 20 73 65  tatus line is se
28f0: 6e 74 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  nt */.static cha
2900: 72 20 2a 7a 4c 6f 67 46 69 6c 65 20 3d 20 30 3b  r *zLogFile = 0;
2910: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 6f         /* Log to
2920: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 73 74   this file */.st
2930: 61 74 69 63 20 69 6e 74 20 64 65 62 75 67 46 6c  atic int debugFl
2940: 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  ag = 0;        /
2950: 2a 20 54 72 75 65 20 69 66 20 62 65 69 6e 67 20  * True if being 
2960: 64 65 62 75 67 67 65 64 20 2a 2f 0a 73 74 61 74  debugged */.stat
2970: 69 63 20 73 74 72 75 63 74 20 74 69 6d 65 76 61  ic struct timeva
2980: 6c 20 62 65 67 69 6e 54 69 6d 65 3b 20 2f 2a 20  l beginTime; /* 
2990: 54 69 6d 65 20 77 68 65 6e 20 74 68 69 73 20 70  Time when this p
29a0: 72 6f 63 65 73 73 20 73 74 61 72 74 73 20 2a 2f  rocess starts */
29b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73  .static int clos
29c0: 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 30 3b  eConnection = 0;
29d0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 6e    /* True to sen
29e0: 64 20 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c  d Connection: cl
29f0: 6f 73 65 20 69 6e 20 72 65 70 6c 79 20 2a 2f 0a  ose in reply */.
2a00: 73 74 61 74 69 63 20 69 6e 74 20 6e 52 65 71 75  static int nRequ
2a10: 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  est = 0;        
2a20: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
2a30: 71 75 65 73 74 73 20 70 72 6f 63 65 73 73 65 64  quests processed
2a40: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f   */.static int o
2a50: 6d 69 74 4c 6f 67 20 3d 20 30 3b 20 20 20 20 20  mitLog = 0;     
2a60: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6d       /* Do not m
2a70: 61 6b 65 20 6c 6f 67 66 69 6c 65 20 65 6e 74 72  ake logfile entr
2a80: 69 65 73 20 69 66 20 74 72 75 65 20 2a 2f 0a 73  ies if true */.s
2a90: 74 61 74 69 63 20 69 6e 74 20 75 73 65 48 74 74  tatic int useHtt
2aa0: 70 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ps = 0;         
2ab0: 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 48  /* True to use H
2ac0: 54 54 50 53 3a 20 69 6e 73 74 65 61 64 20 6f 66  TTPS: instead of
2ad0: 20 48 54 54 50 3a 20 2a 2f 0a 73 74 61 74 69 63   HTTP: */.static
2ae0: 20 63 68 61 72 20 2a 7a 48 74 74 70 20 3d 20 22   char *zHttp = "
2af0: 68 74 74 70 22 3b 20 20 20 20 20 2f 2a 20 68 74  http";     /* ht
2b00: 74 70 20 6f 72 20 68 74 74 70 73 20 2a 2f 0a 73  tp or https */.s
2b10: 74 61 74 69 63 20 69 6e 74 20 75 73 65 54 69 6d  tatic int useTim
2b20: 65 6f 75 74 20 3d 20 31 3b 20 20 20 20 20 20 20  eout = 1;       
2b30: 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 74  /* True to use t
2b40: 69 6d 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  imes */.static i
2b50: 6e 74 20 73 74 61 6e 64 61 6c 6f 6e 65 20 3d 20  nt standalone = 
2b60: 30 3b 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 20  0;       /* Run 
2b70: 61 73 20 61 20 73 74 61 6e 64 61 6c 6f 6e 65 20  as a standalone 
2b80: 73 65 72 76 65 72 20 28 6e 6f 20 69 6e 65 74 64  server (no inetd
2b90: 29 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ) */.static int 
2ba0: 69 70 76 36 4f 6e 6c 79 20 3d 20 30 3b 20 20 20  ipv6Only = 0;   
2bb0: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 49 50 76        /* Use IPv
2bc0: 36 20 6f 6e 6c 79 20 2a 2f 0a 73 74 61 74 69 63  6 only */.static
2bd0: 20 69 6e 74 20 69 70 76 34 4f 6e 6c 79 20 3d 20   int ipv4Only = 
2be0: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73  0;         /* Us
2bf0: 65 20 49 50 76 34 20 6f 6e 6c 79 20 2a 2f 0a 73  e IPv4 only */.s
2c00: 74 61 74 69 63 20 73 74 72 75 63 74 20 72 75 73  tatic struct rus
2c10: 61 67 65 20 70 72 69 6f 72 53 65 6c 66 3b 20 20  age priorSelf;  
2c20: 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79 20 72 65  /* Previously re
2c30: 70 6f 72 74 20 53 45 4c 46 20 74 69 6d 65 20 2a  port SELF time *
2c40: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
2c50: 72 75 73 61 67 65 20 70 72 69 6f 72 43 68 69 6c  rusage priorChil
2c60: 64 3b 20 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79  d; /* Previously
2c70: 20 72 65 70 6f 72 74 20 43 48 49 4c 44 20 74 69   report CHILD ti
2c80: 6d 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 6f 75  me */../*.** Dou
2c90: 62 6c 65 20 61 6e 79 20 64 6f 75 62 6c 65 2d 71  ble any double-q
2ca0: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 20  uote characters 
2cb0: 69 6e 20 61 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  in a string..*/.
2cc0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 45 73 63  static char *Esc
2cd0: 61 70 65 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20  ape(char *z){.  
2ce0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
2cf0: 6e 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 63  n;.  char c;.  c
2d00: 68 61 72 20 2a 7a 4f 75 74 3b 0a 20 20 66 6f 72  har *zOut;.  for
2d10: 28 69 3d 30 3b 20 28 63 3d 7a 5b 69 5d 29 21 3d  (i=0; (c=z[i])!=
2d20: 30 20 26 26 20 63 21 3d 27 22 27 3b 20 69 2b 2b  0 && c!='"'; i++
2d30: 29 7b 7d 0a 20 20 69 66 28 20 63 3d 3d 30 20 29  ){}.  if( c==0 )
2d40: 20 72 65 74 75 72 6e 20 7a 3b 0a 20 20 6e 20 3d   return z;.  n =
2d50: 20 31 3b 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 28   1;.  for(i++; (
2d60: 63 3d 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29  c=z[i])!=0; i++)
2d70: 7b 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 6e  { if( c=='"' ) n
2d80: 2b 2b 3b 20 7d 0a 20 20 7a 4f 75 74 20 3d 20 6d  ++; }.  zOut = m
2d90: 61 6c 6c 6f 63 28 20 69 2b 6e 2b 31 20 29 3b 0a  alloc( i+n+1 );.
2da0: 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 20    if( zOut==0 ) 
2db0: 72 65 74 75 72 6e 20 22 22 3b 0a 20 20 66 6f 72  return "";.  for
2dc0: 28 69 3d 6a 3d 30 3b 20 28 63 3d 7a 5b 69 5d 29  (i=j=0; (c=z[i])
2dd0: 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a  !=0; i++){.    z
2de0: 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20  Out[j++] = c;.  
2df0: 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 7a    if( c=='"' ) z
2e00: 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20  Out[j++] = c;.  
2e10: 7d 0a 20 20 7a 4f 75 74 5b 6a 5d 20 3d 20 30 3b  }.  zOut[j] = 0;
2e20: 0a 20 20 72 65 74 75 72 6e 20 7a 4f 75 74 3b 0a  .  return zOut;.
2e30: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
2e40: 20 61 20 73 74 72 75 63 74 20 74 69 6d 65 76 61   a struct timeva
2e50: 6c 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65  l into an intege
2e60: 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  r number of mill
2e70: 69 73 65 63 6f 6e 64 73 0a 2a 2f 0a 73 74 61 74  iseconds.*/.stat
2e80: 69 63 20 69 6e 74 20 74 76 6d 73 28 73 74 72 75  ic int tvms(stru
2e90: 63 74 20 74 69 6d 65 76 61 6c 20 2a 70 29 7b 0a  ct timeval *p){.
2ea0: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28 70    return (int)(p
2eb0: 2d 3e 74 76 5f 73 65 63 2a 31 30 30 30 30 30 30  ->tv_sec*1000000
2ec0: 20 2b 20 70 2d 3e 74 76 5f 75 73 65 63 29 3b 0a   + p->tv_usec);.
2ed0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 6e  }../*.** Make an
2ee0: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6c 6f   entry in the lo
2ef0: 67 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 20  g file.  If the 
2f00: 48 54 54 50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  HTTP connection 
2f10: 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 63 6c 6f  should be.** clo
2f20: 73 65 64 2c 20 74 68 65 6e 20 74 65 72 6d 69 6e  sed, then termin
2f30: 61 74 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ate this process
2f40: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 72 65 74  .  Otherwise ret
2f50: 75 72 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  urn..*/.static v
2f60: 6f 69 64 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79  oid MakeLogEntry
2f70: 28 69 6e 74 20 61 29 7b 0a 20 20 46 49 4c 45 20  (int a){.  FILE 
2f80: 2a 6c 6f 67 3b 0a 20 20 69 66 28 20 7a 54 6d 70  *log;.  if( zTmp
2f90: 4e 61 6d 20 29 7b 0a 20 20 20 20 75 6e 6c 69 6e  Nam ){.    unlin
2fa0: 6b 28 7a 54 6d 70 4e 61 6d 29 3b 0a 20 20 7d 0a  k(zTmpNam);.  }.
2fb0: 20 20 69 66 28 20 7a 4c 6f 67 46 69 6c 65 20 26    if( zLogFile &
2fc0: 26 20 21 6f 6d 69 74 4c 6f 67 20 29 7b 0a 20 20  & !omitLog ){.  
2fd0: 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c    struct timeval
2fe0: 20 6e 6f 77 3b 0a 20 20 20 20 73 74 72 75 63 74   now;.    struct
2ff0: 20 74 6d 20 2a 70 54 6d 3b 0a 20 20 20 20 73 74   tm *pTm;.    st
3000: 72 75 63 74 20 72 75 73 61 67 65 20 73 65 6c 66  ruct rusage self
3010: 2c 20 63 68 69 6c 64 72 65 6e 3b 0a 20 20 20 20  , children;.    
3020: 69 6e 74 20 77 61 69 74 53 74 61 74 75 73 3b 0a  int waitStatus;.
3030: 20 20 20 20 63 68 61 72 20 7a 44 61 74 65 5b 32      char zDate[2
3040: 30 30 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  00];.    char *z
3050: 52 4d 20 3d 20 7a 52 65 6d 6f 74 65 55 73 65 72  RM = zRemoteUser
3060: 20 3f 20 7a 52 65 6d 6f 74 65 55 73 65 72 20 3a   ? zRemoteUser :
3070: 20 22 22 3b 0a 0a 20 20 20 20 69 66 28 20 7a 53   "";..    if( zS
3080: 63 72 69 70 74 3d 3d 30 20 29 20 7a 53 63 72 69  cript==0 ) zScri
3090: 70 74 20 3d 20 22 22 3b 0a 20 20 20 20 69 66 28  pt = "";.    if(
30a0: 20 7a 52 65 61 6c 53 63 72 69 70 74 3d 3d 30 20   zRealScript==0 
30b0: 29 20 7a 52 65 61 6c 53 63 72 69 70 74 20 3d 20  ) zRealScript = 
30c0: 22 22 3b 0a 20 20 20 20 69 66 28 20 7a 52 65 6d  "";.    if( zRem
30d0: 6f 74 65 41 64 64 72 3d 3d 30 20 29 20 7a 52 65  oteAddr==0 ) zRe
30e0: 6d 6f 74 65 41 64 64 72 20 3d 20 22 22 3b 0a 20  moteAddr = "";. 
30f0: 20 20 20 69 66 28 20 7a 48 74 74 70 48 6f 73 74     if( zHttpHost
3100: 3d 3d 30 20 29 20 7a 48 74 74 70 48 6f 73 74 20  ==0 ) zHttpHost 
3110: 3d 20 22 22 3b 0a 20 20 20 20 69 66 28 20 7a 52  = "";.    if( zR
3120: 65 66 65 72 65 72 3d 3d 30 20 29 20 7a 52 65 66  eferer==0 ) zRef
3130: 65 72 65 72 20 3d 20 22 22 3b 0a 20 20 20 20 69  erer = "";.    i
3140: 66 28 20 7a 41 67 65 6e 74 3d 3d 30 20 29 20 7a  f( zAgent==0 ) z
3150: 41 67 65 6e 74 20 3d 20 22 22 3b 0a 20 20 20 20  Agent = "";.    
3160: 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 6e 6f  gettimeofday(&no
3170: 77 2c 20 30 29 3b 0a 20 20 20 20 70 54 6d 20 3d  w, 0);.    pTm =
3180: 20 6c 6f 63 61 6c 74 69 6d 65 28 26 6e 6f 77 2e   localtime(&now.
3190: 74 76 5f 73 65 63 29 3b 0a 20 20 20 20 73 74 72  tv_sec);.    str
31a0: 66 74 69 6d 65 28 7a 44 61 74 65 2c 20 73 69 7a  ftime(zDate, siz
31b0: 65 6f 66 28 7a 44 61 74 65 29 2c 20 22 25 59 2d  eof(zDate), "%Y-
31c0: 25 6d 2d 25 64 20 25 48 3a 25 4d 3a 25 53 22 2c  %m-%d %H:%M:%S",
31d0: 20 70 54 6d 29 3b 0a 20 20 20 20 77 61 69 74 70   pTm);.    waitp
31e0: 69 64 28 2d 31 2c 20 26 77 61 69 74 53 74 61 74  id(-1, &waitStat
31f0: 75 73 2c 20 57 4e 4f 48 41 4e 47 29 3b 0a 20 20  us, WNOHANG);.  
3200: 20 20 67 65 74 72 75 73 61 67 65 28 52 55 53 41    getrusage(RUSA
3210: 47 45 5f 53 45 4c 46 2c 20 26 73 65 6c 66 29 3b  GE_SELF, &self);
3220: 0a 20 20 20 20 67 65 74 72 75 73 61 67 65 28 52  .    getrusage(R
3230: 55 53 41 47 45 5f 43 48 49 4c 44 52 45 4e 2c 20  USAGE_CHILDREN, 
3240: 26 63 68 69 6c 64 72 65 6e 29 3b 0a 20 20 20 20  &children);.    
3250: 69 66 28 20 28 6c 6f 67 20 3d 20 66 6f 70 65 6e  if( (log = fopen
3260: 28 7a 4c 6f 67 46 69 6c 65 2c 22 61 22 29 29 21  (zLogFile,"a"))!
3270: 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 43 4f 4d  =0 ){.#ifdef COM
3280: 42 49 4e 45 44 5f 4c 4f 47 5f 46 4f 52 4d 41 54  BINED_LOG_FORMAT
3290: 0a 20 20 20 20 20 20 73 74 72 66 74 69 6d 65 28  .      strftime(
32a0: 7a 44 61 74 65 2c 20 73 69 7a 65 6f 66 28 7a 44  zDate, sizeof(zD
32b0: 61 74 65 29 2c 20 22 25 64 2f 25 62 2f 25 59 3a  ate), "%d/%b/%Y:
32c0: 25 48 3a 25 4d 3a 25 53 20 25 7a 22 2c 20 70 54  %H:%M:%S %z", pT
32d0: 6d 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  m);.      fprint
32e0: 66 28 6c 6f 67 2c 20 22 25 73 20 2d 20 2d 20 5b  f(log, "%s - - [
32f0: 25 73 5d 20 5c 22 25 73 20 25 73 20 25 73 5c 22  %s] \"%s %s %s\"
3300: 20 25 73 20 25 64 20 5c 22 25 73 5c 22 20 5c 22   %s %d \"%s\" \"
3310: 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %s\"\n",.       
3320: 20 20 20 20 20 20 20 7a 52 65 6d 6f 74 65 41 64         zRemoteAd
3330: 64 72 2c 20 7a 44 61 74 65 2c 20 7a 4d 65 74 68  dr, zDate, zMeth
3340: 6f 64 2c 20 7a 53 63 72 69 70 74 2c 20 7a 50 72  od, zScript, zPr
3350: 6f 74 6f 63 6f 6c 2c 0a 20 20 20 20 20 20 20 20  otocol,.        
3360: 20 20 20 20 20 20 7a 52 65 70 6c 79 53 74 61 74        zReplyStat
3370: 75 73 2c 20 6e 4f 75 74 2c 20 7a 52 65 66 65 72  us, nOut, zRefer
3380: 65 72 2c 20 7a 41 67 65 6e 74 29 3b 0a 23 65 6c  er, zAgent);.#el
3390: 73 65 0a 20 20 20 20 20 20 73 74 72 66 74 69 6d  se.      strftim
33a0: 65 28 7a 44 61 74 65 2c 20 73 69 7a 65 6f 66 28  e(zDate, sizeof(
33b0: 7a 44 61 74 65 29 2c 20 22 25 59 2d 25 6d 2d 25  zDate), "%Y-%m-%
33c0: 64 20 25 48 3a 25 4d 3a 25 53 22 2c 20 70 54 6d  d %H:%M:%S", pTm
33d0: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20  );.      /* Log 
33e0: 72 65 63 6f 72 64 20 66 69 6c 65 73 3a 0a 20 20  record files:.  
33f0: 20 20 20 20 2a 2a 20 20 28 31 29 20 44 61 74 65      **  (1) Date
3400: 20 61 6e 64 20 74 69 6d 65 0a 20 20 20 20 20 20   and time.      
3410: 2a 2a 20 20 28 32 29 20 49 50 20 61 64 64 72 65  **  (2) IP addre
3420: 73 73 0a 20 20 20 20 20 20 2a 2a 20 20 28 33 29  ss.      **  (3)
3430: 20 55 52 4c 20 62 65 69 6e 67 20 61 63 63 65 73   URL being acces
3440: 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 20 28 34  sed.      **  (4
3450: 29 20 52 65 66 65 72 65 72 0a 20 20 20 20 20 20  ) Referer.      
3460: 2a 2a 20 20 28 35 29 20 52 65 70 6c 79 20 73 74  **  (5) Reply st
3470: 61 74 75 73 0a 20 20 20 20 20 20 2a 2a 20 20 28  atus.      **  (
3480: 36 29 20 42 79 74 65 73 20 72 65 63 65 69 76 65  6) Bytes receive
3490: 64 0a 20 20 20 20 20 20 2a 2a 20 20 28 37 29 20  d.      **  (7) 
34a0: 42 79 74 65 73 20 73 65 6e 74 0a 20 20 20 20 20  Bytes sent.     
34b0: 20 2a 2a 20 20 28 38 29 20 53 65 6c 66 20 75 73   **  (8) Self us
34c0: 65 72 20 74 69 6d 65 0a 20 20 20 20 20 20 2a 2a  er time.      **
34d0: 20 20 28 39 29 20 53 65 6c 66 20 73 79 73 74 65    (9) Self syste
34e0: 6d 20 74 69 6d 65 0a 20 20 20 20 20 20 2a 2a 20  m time.      ** 
34f0: 28 31 30 29 20 43 68 69 6c 64 72 65 6e 20 75 73  (10) Children us
3500: 65 72 20 74 69 6d 65 0a 20 20 20 20 20 20 2a 2a  er time.      **
3510: 20 28 31 31 29 20 43 68 69 6c 64 72 65 6e 20 73   (11) Children s
3520: 79 73 74 65 6d 20 74 69 6d 65 0a 20 20 20 20 20  ystem time.     
3530: 20 2a 2a 20 28 31 32 29 20 54 6f 74 61 6c 20 77   ** (12) Total w
3540: 61 6c 6c 2d 63 6c 6f 63 6b 20 74 69 6d 65 0a 20  all-clock time. 
3550: 20 20 20 20 20 2a 2a 20 28 31 33 29 20 52 65 71       ** (13) Req
3560: 75 65 73 74 20 6e 75 6d 62 65 72 20 66 6f 72 20  uest number for 
3570: 73 61 6d 65 20 54 43 50 2f 49 50 20 63 6f 6e 6e  same TCP/IP conn
3580: 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ection.      ** 
3590: 28 31 34 29 20 55 73 65 72 20 61 67 65 6e 74 0a  (14) User agent.
35a0: 20 20 20 20 20 20 2a 2a 20 28 31 35 29 20 52 65        ** (15) Re
35b0: 6d 6f 74 65 20 75 73 65 72 0a 20 20 20 20 20 20  mote user.      
35c0: 2a 2a 20 28 31 36 29 20 42 79 74 65 73 20 6f 66  ** (16) Bytes of
35d0: 20 55 52 4c 20 74 68 61 74 20 63 6f 72 72 65 73   URL that corres
35e0: 70 6f 6e 64 20 74 6f 20 74 68 65 20 53 43 52 49  pond to the SCRI
35f0: 50 54 5f 4e 41 4d 45 0a 20 20 20 20 20 20 2a 2f  PT_NAME.      */
3600: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6c  .      fprintf(l
3610: 6f 67 2c 0a 20 20 20 20 20 20 20 20 22 25 73 2c  og,.        "%s,
3620: 25 73 2c 5c 22 25 73 3a 2f 2f 25 73 25 73 5c 22  %s,\"%s://%s%s\"
3630: 2c 5c 22 25 73 5c 22 2c 22 0a 20 20 20 20 20 20  ,\"%s\",".      
3640: 20 20 20 20 20 22 25 73 2c 25 64 2c 25 64 2c 25       "%s,%d,%d,%
3650: 64 2c 25 64 2c 25 64 2c 25 64 2c 25 64 2c 25 64  d,%d,%d,%d,%d,%d
3660: 2c 5c 22 25 73 5c 22 2c 5c 22 25 73 5c 22 2c 25  ,\"%s\",\"%s\",%
3670: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 7a 44  d\n",.        zD
3680: 61 74 65 2c 20 7a 52 65 6d 6f 74 65 41 64 64 72  ate, zRemoteAddr
3690: 2c 20 7a 48 74 74 70 2c 20 45 73 63 61 70 65 28  , zHttp, Escape(
36a0: 7a 48 74 74 70 48 6f 73 74 29 2c 20 45 73 63 61  zHttpHost), Esca
36b0: 70 65 28 7a 53 63 72 69 70 74 29 2c 0a 20 20 20  pe(zScript),.   
36c0: 20 20 20 20 20 45 73 63 61 70 65 28 7a 52 65 66       Escape(zRef
36d0: 65 72 65 72 29 2c 20 7a 52 65 70 6c 79 53 74 61  erer), zReplySta
36e0: 74 75 73 2c 20 6e 49 6e 2c 20 6e 4f 75 74 2c 0a  tus, nIn, nOut,.
36f0: 20 20 20 20 20 20 20 20 74 76 6d 73 28 26 73 65          tvms(&se
3700: 6c 66 2e 72 75 5f 75 74 69 6d 65 29 20 2d 20 74  lf.ru_utime) - t
3710: 76 6d 73 28 26 70 72 69 6f 72 53 65 6c 66 2e 72  vms(&priorSelf.r
3720: 75 5f 75 74 69 6d 65 29 2c 0a 20 20 20 20 20 20  u_utime),.      
3730: 20 20 74 76 6d 73 28 26 73 65 6c 66 2e 72 75 5f    tvms(&self.ru_
3740: 73 74 69 6d 65 29 20 2d 20 74 76 6d 73 28 26 70  stime) - tvms(&p
3750: 72 69 6f 72 53 65 6c 66 2e 72 75 5f 73 74 69 6d  riorSelf.ru_stim
3760: 65 29 2c 0a 20 20 20 20 20 20 20 20 74 76 6d 73  e),.        tvms
3770: 28 26 63 68 69 6c 64 72 65 6e 2e 72 75 5f 75 74  (&children.ru_ut
3780: 69 6d 65 29 20 2d 20 74 76 6d 73 28 26 70 72 69  ime) - tvms(&pri
3790: 6f 72 43 68 69 6c 64 2e 72 75 5f 75 74 69 6d 65  orChild.ru_utime
37a0: 29 2c 0a 20 20 20 20 20 20 20 20 74 76 6d 73 28  ),.        tvms(
37b0: 26 63 68 69 6c 64 72 65 6e 2e 72 75 5f 73 74 69  &children.ru_sti
37c0: 6d 65 29 20 2d 20 74 76 6d 73 28 26 70 72 69 6f  me) - tvms(&prio
37d0: 72 43 68 69 6c 64 2e 72 75 5f 73 74 69 6d 65 29  rChild.ru_stime)
37e0: 2c 0a 20 20 20 20 20 20 20 20 74 76 6d 73 28 26  ,.        tvms(&
37f0: 6e 6f 77 29 20 2d 20 74 76 6d 73 28 26 62 65 67  now) - tvms(&beg
3800: 69 6e 54 69 6d 65 29 2c 0a 20 20 20 20 20 20 20  inTime),.       
3810: 20 6e 52 65 71 75 65 73 74 2c 20 45 73 63 61 70   nRequest, Escap
3820: 65 28 7a 41 67 65 6e 74 29 2c 20 45 73 63 61 70  e(zAgent), Escap
3830: 65 28 7a 52 4d 29 2c 0a 20 20 20 20 20 20 20 20  e(zRM),.        
3840: 28 69 6e 74 29 28 73 74 72 6c 65 6e 28 7a 48 74  (int)(strlen(zHt
3850: 74 70 29 2b 73 74 72 6c 65 6e 28 7a 48 74 74 70  tp)+strlen(zHttp
3860: 48 6f 73 74 29 2b 73 74 72 6c 65 6e 28 7a 52 65  Host)+strlen(zRe
3870: 61 6c 53 63 72 69 70 74 29 2b 33 29 0a 20 20 20  alScript)+3).   
3880: 20 20 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6f     );.      prio
3890: 72 53 65 6c 66 20 3d 20 73 65 6c 66 3b 0a 20 20  rSelf = self;.  
38a0: 20 20 20 20 70 72 69 6f 72 43 68 69 6c 64 20 3d      priorChild =
38b0: 20 63 68 69 6c 64 72 65 6e 3b 0a 20 20 20 20 20   children;.     
38c0: 20 62 65 67 69 6e 54 69 6d 65 20 3d 20 6e 6f 77   beginTime = now
38d0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66  ;.#endif.      f
38e0: 63 6c 6f 73 65 28 6c 6f 67 29 3b 0a 20 20 20 20  close(log);.    
38f0: 20 20 6e 49 6e 20 3d 20 6e 4f 75 74 20 3d 20 30    nIn = nOut = 0
3900: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
3910: 28 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f  ( closeConnectio
3920: 6e 20 29 7b 0a 20 20 20 20 65 78 69 74 28 61 29  n ){.    exit(a)
3930: 3b 0a 20 20 7d 0a 20 20 73 74 61 74 75 73 53 65  ;.  }.  statusSe
3940: 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nt = 0;.}../*.**
3950: 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
3960: 20 73 61 66 65 6c 79 0a 2a 2f 0a 73 74 61 74 69   safely.*/.stati
3970: 63 20 63 68 61 72 20 2a 53 61 66 65 4d 61 6c 6c  c char *SafeMall
3980: 6f 63 28 20 69 6e 74 20 73 69 7a 65 20 29 7b 0a  oc( int size ){.
3990: 20 20 63 68 61 72 20 2a 70 3b 0a 0a 20 20 70 20    char *p;..  p 
39a0: 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28  = (char*)malloc(
39b0: 73 69 7a 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  size);.  if( p==
39c0: 30 20 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28  0 ){.    strcpy(
39d0: 7a 52 65 70 6c 79 53 74 61 74 75 73 2c 20 22 39  zReplyStatus, "9
39e0: 39 38 22 29 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f  98");.    MakeLo
39f0: 67 45 6e 74 72 79 28 31 29 3b 0a 20 20 20 20 65  gEntry(1);.    e
3a00: 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 72 65  xit(1);.  }.  re
3a10: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
3a20: 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Set the value o
3a30: 66 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  f environment va
3a40: 72 69 61 62 6c 65 20 7a 56 61 72 20 74 6f 20 7a  riable zVar to z
3a50: 56 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  Value..*/.static
3a60: 20 76 6f 69 64 20 53 65 74 45 6e 76 28 63 6f 6e   void SetEnv(con
3a70: 73 74 20 63 68 61 72 20 2a 7a 56 61 72 2c 20 63  st char *zVar, c
3a80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 75  onst char *zValu
3a90: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  e){.  char *z;. 
3aa0: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 66 28 20   int len;.  if( 
3ab0: 7a 56 61 6c 75 65 3d 3d 30 20 29 20 7a 56 61 6c  zValue==0 ) zVal
3ac0: 75 65 3d 22 22 3b 0a 20 20 6c 65 6e 20 3d 20 73  ue="";.  len = s
3ad0: 74 72 6c 65 6e 28 7a 56 61 72 29 20 2b 20 73 74  trlen(zVar) + st
3ae0: 72 6c 65 6e 28 7a 56 61 6c 75 65 29 20 2b 20 32  rlen(zValue) + 2
3af0: 3b 0a 20 20 7a 20 3d 20 53 61 66 65 4d 61 6c 6c  ;.  z = SafeMall
3b00: 6f 63 28 6c 65 6e 29 3b 0a 20 20 73 70 72 69 6e  oc(len);.  sprin
3b10: 74 66 28 7a 2c 22 25 73 3d 25 73 22 2c 7a 56 61  tf(z,"%s=%s",zVa
3b20: 72 2c 7a 56 61 6c 75 65 29 3b 0a 20 20 70 75 74  r,zValue);.  put
3b30: 65 6e 76 28 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  env(z);.}../*.**
3b40: 20 52 65 6d 6f 76 65 20 74 68 65 20 66 69 72 73   Remove the firs
3b50: 74 20 73 70 61 63 65 2d 64 65 6c 69 6d 69 74 65  t space-delimite
3b60: 64 20 74 6f 6b 65 6e 20 66 72 6f 6d 20 61 20 73  d token from a s
3b70: 74 72 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  tring and return
3b80: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
3b90: 20 69 74 2e 20 20 41 64 64 20 61 20 4e 55 4c 4c   it.  Add a NULL
3ba0: 20 74 6f 20 74 68 65 20 73 74 72 69 6e 67 20 74   to the string t
3bb0: 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
3bc0: 74 6f 6b 65 6e 2e 0a 2a 2a 20 4d 61 6b 65 20 2a  token..** Make *
3bd0: 7a 4c 65 66 74 4f 76 65 72 20 70 6f 69 6e 74 20  zLeftOver point 
3be0: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
3bf0: 74 68 65 20 6e 65 78 74 20 74 6f 6b 65 6e 2e 0a  the next token..
3c00: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
3c10: 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28  GetFirstElement(
3c20: 63 68 61 72 20 2a 7a 49 6e 70 75 74 2c 20 63 68  char *zInput, ch
3c30: 61 72 20 2a 2a 7a 4c 65 66 74 4f 76 65 72 29 7b  ar **zLeftOver){
3c40: 0a 20 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74  .  char *zResult
3c50: 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 49 6e 70   = 0;.  if( zInp
3c60: 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ut==0 ){.    if(
3c70: 20 7a 4c 65 66 74 4f 76 65 72 20 29 20 2a 7a 4c   zLeftOver ) *zL
3c80: 65 66 74 4f 76 65 72 20 3d 20 30 3b 0a 20 20 20  eftOver = 0;.   
3c90: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
3ca0: 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28   while( isspace(
3cb0: 2a 7a 49 6e 70 75 74 29 20 29 7b 20 7a 49 6e 70  *zInput) ){ zInp
3cc0: 75 74 2b 2b 3b 20 7d 0a 20 20 7a 52 65 73 75 6c  ut++; }.  zResul
3cd0: 74 20 3d 20 7a 49 6e 70 75 74 3b 0a 20 20 77 68  t = zInput;.  wh
3ce0: 69 6c 65 28 20 2a 7a 49 6e 70 75 74 20 26 26 20  ile( *zInput && 
3cf0: 21 69 73 73 70 61 63 65 28 2a 7a 49 6e 70 75 74  !isspace(*zInput
3d00: 29 20 29 7b 20 7a 49 6e 70 75 74 2b 2b 3b 20 7d  ) ){ zInput++; }
3d10: 0a 20 20 69 66 28 20 2a 7a 49 6e 70 75 74 20 29  .  if( *zInput )
3d20: 7b 0a 20 20 20 20 2a 7a 49 6e 70 75 74 20 3d 20  {.    *zInput = 
3d30: 30 3b 0a 20 20 20 20 7a 49 6e 70 75 74 2b 2b 3b  0;.    zInput++;
3d40: 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70  .    while( issp
3d50: 61 63 65 28 2a 7a 49 6e 70 75 74 29 20 29 7b 20  ace(*zInput) ){ 
3d60: 7a 49 6e 70 75 74 2b 2b 3b 20 7d 0a 20 20 7d 0a  zInput++; }.  }.
3d70: 20 20 69 66 28 20 7a 4c 65 66 74 4f 76 65 72 20    if( zLeftOver 
3d80: 29 7b 20 2a 7a 4c 65 66 74 4f 76 65 72 20 3d 20  ){ *zLeftOver = 
3d90: 7a 49 6e 70 75 74 3b 20 7d 0a 20 20 72 65 74 75  zInput; }.  retu
3da0: 72 6e 20 7a 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f  rn zResult;.}../
3db0: 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79  *.** Make a copy
3dc0: 20 6f 66 20 61 20 73 74 72 69 6e 67 20 69 6e 74   of a string int
3dd0: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
3de0: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a  d from malloc..*
3df0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 53  /.static char *S
3e00: 74 72 44 75 70 28 63 6f 6e 73 74 20 63 68 61 72  trDup(const char
3e10: 20 2a 7a 53 72 63 29 7b 0a 20 20 63 68 61 72 20   *zSrc){.  char 
3e20: 2a 7a 44 65 73 74 3b 0a 20 20 69 6e 74 20 73 69  *zDest;.  int si
3e30: 7a 65 3b 0a 0a 20 20 69 66 28 20 7a 53 72 63 3d  ze;..  if( zSrc=
3e40: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
3e50: 20 73 69 7a 65 20 3d 20 73 74 72 6c 65 6e 28 7a   size = strlen(z
3e60: 53 72 63 29 20 2b 20 31 3b 0a 20 20 7a 44 65 73  Src) + 1;.  zDes
3e70: 74 20 3d 20 28 63 68 61 72 2a 29 53 61 66 65 4d  t = (char*)SafeM
3e80: 61 6c 6c 6f 63 28 20 73 69 7a 65 20 29 3b 0a 20  alloc( size );. 
3e90: 20 73 74 72 63 70 79 28 7a 44 65 73 74 2c 7a 53   strcpy(zDest,zS
3ea0: 72 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 44  rc);.  return zD
3eb0: 65 73 74 3b 0a 7d 0a 73 74 61 74 69 63 20 63 68  est;.}.static ch
3ec0: 61 72 20 2a 53 74 72 41 70 70 65 6e 64 28 63 68  ar *StrAppend(ch
3ed0: 61 72 20 2a 7a 50 72 69 6f 72 2c 20 63 6f 6e 73  ar *zPrior, cons
3ee0: 74 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 63 6f  t char *zSep, co
3ef0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63 29 7b  nst char *zSrc){
3f00: 0a 20 20 63 68 61 72 20 2a 7a 44 65 73 74 3b 0a  .  char *zDest;.
3f10: 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 69 6e    int size;.  in
3f20: 74 20 6e 31 2c 20 6e 32 3b 0a 0a 20 20 69 66 28  t n1, n2;..  if(
3f30: 20 7a 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72   zSrc==0 ) retur
3f40: 6e 20 30 3b 0a 20 20 69 66 28 20 7a 50 72 69 6f  n 0;.  if( zPrio
3f50: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 74  r==0 ) return St
3f60: 72 44 75 70 28 7a 53 72 63 29 3b 0a 20 20 73 69  rDup(zSrc);.  si
3f70: 7a 65 20 3d 20 28 6e 31 3d 73 74 72 6c 65 6e 28  ze = (n1=strlen(
3f80: 7a 53 72 63 29 29 20 2b 20 28 6e 32 3d 73 74 72  zSrc)) + (n2=str
3f90: 6c 65 6e 28 7a 53 65 70 29 29 20 2b 20 73 74 72  len(zSep)) + str
3fa0: 6c 65 6e 28 7a 50 72 69 6f 72 29 20 2b 20 31 3b  len(zPrior) + 1;
3fb0: 0a 20 20 7a 44 65 73 74 20 3d 20 28 63 68 61 72  .  zDest = (char
3fc0: 2a 29 53 61 66 65 4d 61 6c 6c 6f 63 28 20 73 69  *)SafeMalloc( si
3fd0: 7a 65 20 29 3b 0a 20 20 73 74 72 63 70 79 28 7a  ze );.  strcpy(z
3fe0: 44 65 73 74 2c 7a 50 72 69 6f 72 29 3b 0a 20 20  Dest,zPrior);.  
3ff0: 66 72 65 65 28 7a 50 72 69 6f 72 29 3b 0a 20 20  free(zPrior);.  
4000: 73 74 72 63 70 79 28 26 7a 44 65 73 74 5b 6e 31  strcpy(&zDest[n1
4010: 5d 2c 7a 53 65 70 29 3b 0a 20 20 73 74 72 63 70  ],zSep);.  strcp
4020: 79 28 26 7a 44 65 73 74 5b 6e 31 2b 6e 32 5d 2c  y(&zDest[n1+n2],
4030: 7a 53 72 63 29 3b 0a 20 20 72 65 74 75 72 6e 20  zSrc);.  return 
4040: 7a 44 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zDest;.}../*.** 
4050: 42 72 65 61 6b 20 61 20 6c 69 6e 65 20 61 74 20  Break a line at 
4060: 74 68 65 20 66 69 72 73 74 20 5c 6e 20 6f 72 20  the first \n or 
4070: 5c 72 20 63 68 61 72 61 63 74 65 72 20 73 65 65  \r character see
4080: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
4090: 64 20 52 65 6d 6f 76 65 4e 65 77 6c 69 6e 65 28  d RemoveNewline(
40a0: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20  char *z){.  if( 
40b0: 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  z==0 ) return;. 
40c0: 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 2a 7a   while( *z && *z
40d0: 21 3d 27 5c 6e 27 20 26 26 20 2a 7a 21 3d 27 5c  !='\n' && *z!='\
40e0: 72 27 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 2a  r' ){ z++; }.  *
40f0: 7a 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  z = 0;.}../*.** 
4100: 50 72 69 6e 74 20 61 20 64 61 74 65 20 74 61 67  Print a date tag
4110: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20   in the header. 
4120: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
4130: 20 74 61 67 20 69 73 20 7a 54 61 67 2e 0a 2a 2a   tag is zTag..**
4140: 20 54 68 65 20 64 61 74 65 20 69 73 20 64 65 74   The date is det
4150: 65 72 6d 69 6e 65 64 20 66 72 6f 6d 20 74 68 65  ermined from the
4160: 20 75 6e 69 78 20 74 69 6d 65 73 74 61 6d 70 20   unix timestamp 
4170: 67 69 76 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  given..*/.static
4180: 20 69 6e 74 20 44 61 74 65 54 61 67 28 63 6f 6e   int DateTag(con
4190: 73 74 20 63 68 61 72 20 2a 7a 54 61 67 2c 20 74  st char *zTag, t
41a0: 69 6d 65 5f 74 20 74 29 7b 0a 20 20 73 74 72 75  ime_t t){.  stru
41b0: 63 74 20 74 6d 20 2a 74 6d 3b 0a 20 20 63 68 61  ct tm *tm;.  cha
41c0: 72 20 7a 44 61 74 65 5b 31 30 30 5d 3b 0a 20 20  r zDate[100];.  
41d0: 74 6d 20 3d 20 67 6d 74 69 6d 65 28 26 74 29 3b  tm = gmtime(&t);
41e0: 0a 20 20 73 74 72 66 74 69 6d 65 28 7a 44 61 74  .  strftime(zDat
41f0: 65 2c 20 73 69 7a 65 6f 66 28 7a 44 61 74 65 29  e, sizeof(zDate)
4200: 2c 20 22 25 61 2c 20 25 64 20 20 25 62 20 25 59  , "%a, %d  %b %Y
4210: 20 25 48 3a 25 4d 3a 25 53 20 25 7a 22 2c 20 74   %H:%M:%S %z", t
4220: 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 72 69  m);.  return pri
4230: 6e 74 66 28 22 25 73 3a 20 25 73 5c 72 5c 6e 22  ntf("%s: %s\r\n"
4240: 2c 20 7a 54 61 67 2c 20 7a 44 61 74 65 29 3b 0a  , zTag, zDate);.
4250: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  }../*.** Print t
4260: 68 65 20 66 69 72 73 74 20 6c 69 6e 65 20 6f 66  he first line of
4270: 20 61 20 72 65 73 70 6f 6e 73 65 20 66 6f 6c 6c   a response foll
4280: 6f 77 65 64 20 62 79 20 74 68 65 20 73 65 72 76  owed by the serv
4290: 65 72 20 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74  er type..*/.stat
42a0: 69 63 20 76 6f 69 64 20 53 74 61 72 74 52 65 73  ic void StartRes
42b0: 70 6f 6e 73 65 28 63 6f 6e 73 74 20 63 68 61 72  ponse(const char
42c0: 20 2a 7a 52 65 73 75 6c 74 43 6f 64 65 29 7b 0a   *zResultCode){.
42d0: 20 20 74 69 6d 65 5f 74 20 6e 6f 77 3b 0a 20 20    time_t now;.  
42e0: 74 69 6d 65 28 26 6e 6f 77 29 3b 0a 20 20 69 66  time(&now);.  if
42f0: 28 20 73 74 61 74 75 73 53 65 6e 74 20 29 20 72  ( statusSent ) r
4300: 65 74 75 72 6e 3b 0a 20 20 6e 4f 75 74 20 2b 3d  eturn;.  nOut +=
4310: 20 70 72 69 6e 74 66 28 22 25 73 20 25 73 5c 72   printf("%s %s\r
4320: 5c 6e 22 2c 20 7a 50 72 6f 74 6f 63 6f 6c 2c 20  \n", zProtocol, 
4330: 7a 52 65 73 75 6c 74 43 6f 64 65 29 3b 0a 20 20  zResultCode);.  
4340: 73 74 72 6e 63 70 79 28 7a 52 65 70 6c 79 53 74  strncpy(zReplySt
4350: 61 74 75 73 2c 20 7a 52 65 73 75 6c 74 43 6f 64  atus, zResultCod
4360: 65 2c 20 33 29 3b 0a 20 20 7a 52 65 70 6c 79 53  e, 3);.  zReplyS
4370: 74 61 74 75 73 5b 33 5d 20 3d 20 30 3b 0a 20 20  tatus[3] = 0;.  
4380: 69 66 28 20 7a 52 65 70 6c 79 53 74 61 74 75 73  if( zReplyStatus
4390: 5b 30 5d 3e 3d 27 34 27 20 29 7b 0a 20 20 20 20  [0]>='4' ){.    
43a0: 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20  closeConnection 
43b0: 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  = 1;.  }.  if( c
43c0: 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 29  loseConnection )
43d0: 7b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72  {.    nOut += pr
43e0: 69 6e 74 66 28 22 43 6f 6e 6e 65 63 74 69 6f 6e  intf("Connection
43f0: 3a 20 63 6c 6f 73 65 5c 72 5c 6e 22 29 3b 0a 20  : close\r\n");. 
4400: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 75 74   }else{.    nOut
4410: 20 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 6e   += printf("Conn
4420: 65 63 74 69 6f 6e 3a 20 6b 65 65 70 2d 61 6c 69  ection: keep-ali
4430: 76 65 5c 72 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  ve\r\n");.  }.  
4440: 6e 4f 75 74 20 2b 3d 20 44 61 74 65 54 61 67 28  nOut += DateTag(
4450: 22 44 61 74 65 22 2c 20 6e 6f 77 29 3b 0a 20 20  "Date", now);.  
4460: 73 74 61 74 75 73 53 65 6e 74 20 3d 20 31 3b 0a  statusSent = 1;.
4470: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68  }../*.** Tell th
4480: 65 20 63 6c 69 65 6e 74 20 74 68 61 74 20 74 68  e client that th
4490: 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 64  ere is no such d
44a0: 6f 63 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69  ocument.*/.stati
44b0: 63 20 76 6f 69 64 20 4e 6f 74 46 6f 75 6e 64 28  c void NotFound(
44c0: 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 53  int lineno){.  S
44d0: 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 34 30  tartResponse("40
44e0: 34 20 4e 6f 74 20 46 6f 75 6e 64 22 29 3b 0a 20  4 Not Found");. 
44f0: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
4500: 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79  .    "Content-ty
4510: 70 65 3a 20 74 65 78 74 2f 68 74 6d 6c 5c 72 5c  pe: text/html\r\
4520: 6e 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20  n".    "\r\n".  
4530: 20 20 22 3c 68 65 61 64 3e 3c 74 69 74 6c 65 20    "<head><title 
4540: 6c 69 6e 65 6e 6f 3d 5c 22 25 64 5c 22 3e 4e 6f  lineno=\"%d\">No
4550: 74 20 46 6f 75 6e 64 3c 2f 74 69 74 6c 65 3e 3c  t Found</title><
4560: 2f 68 65 61 64 3e 5c 6e 22 0a 20 20 20 20 22 3c  /head>\n".    "<
4570: 62 6f 64 79 3e 3c 68 31 3e 44 6f 63 75 6d 65 6e  body><h1>Documen
4580: 74 20 4e 6f 74 20 46 6f 75 6e 64 3c 2f 68 31 3e  t Not Found</h1>
4590: 5c 6e 22 0a 20 20 20 20 22 54 68 65 20 64 6f 63  \n".    "The doc
45a0: 75 6d 65 6e 74 20 25 73 20 69 73 20 6e 6f 74 20  ument %s is not 
45b0: 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 69  available on thi
45c0: 73 20 73 65 72 76 65 72 5c 6e 22 0a 20 20 20 20  s server\n".    
45d0: 22 3c 2f 62 6f 64 79 3e 5c 6e 22 2c 20 6c 69 6e  "</body>\n", lin
45e0: 65 6e 6f 2c 20 7a 53 63 72 69 70 74 29 3b 0a 20  eno, zScript);. 
45f0: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 29   MakeLogEntry(0)
4600: 3b 0a 20 20 65 78 69 74 28 30 29 3b 0a 7d 0a 0a  ;.  exit(0);.}..
4610: 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63  /*.** Tell the c
4620: 6c 69 65 6e 74 20 74 68 61 74 20 74 68 65 79 20  lient that they 
4630: 61 72 65 20 6e 6f 74 20 77 65 6c 63 6f 6d 65 64  are not welcomed
4640: 20 68 65 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   here..*/.static
4650: 20 76 6f 69 64 20 46 6f 72 62 69 64 64 65 6e 28   void Forbidden(
4660: 76 6f 69 64 29 7b 0a 20 20 53 74 61 72 74 52 65  void){.  StartRe
4670: 73 70 6f 6e 73 65 28 22 34 30 33 20 46 6f 72 62  sponse("403 Forb
4680: 69 64 64 65 6e 22 29 3b 0a 20 20 6e 4f 75 74 20  idden");.  nOut 
4690: 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20 22  += printf(.    "
46a0: 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65  Content-type: te
46b0: 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20  xt/plain\r\n".  
46c0: 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 22 41 63    "\r\n".    "Ac
46d0: 63 65 73 73 20 64 65 6e 69 65 64 5c 6e 22 0a 20  cess denied\n". 
46e0: 20 29 3b 0a 20 20 63 6c 6f 73 65 43 6f 6e 6e 65   );.  closeConne
46f0: 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 4d 61 6b  ction = 1;.  Mak
4700: 65 4c 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20 20  eLogEntry(0);.  
4710: 65 78 69 74 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  exit(0);.}../*.*
4720: 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c 69 65 6e  * Tell the clien
4730: 74 20 74 68 61 74 20 61 75 74 68 6f 72 69 7a 61  t that authoriza
4740: 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64  tion is required
4750: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a   to access the.*
4760: 2a 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  * document..*/.s
4770: 74 61 74 69 63 20 76 6f 69 64 20 4e 6f 74 41 75  tatic void NotAu
4780: 74 68 6f 72 69 7a 65 64 28 63 6f 6e 73 74 20 63  thorized(const c
4790: 68 61 72 20 2a 7a 52 65 61 6c 6d 29 7b 0a 20 20  har *zRealm){.  
47a0: 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 34  StartResponse("4
47b0: 30 31 20 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e  01 Authorization
47c0: 20 52 65 71 75 69 72 65 64 22 29 3b 0a 20 20 6e   Required");.  n
47d0: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20  Out += printf(. 
47e0: 20 20 20 22 57 57 57 2d 41 75 74 68 65 6e 74 69     "WWW-Authenti
47f0: 63 61 74 65 3a 20 42 61 73 69 63 20 72 65 61 6c  cate: Basic real
4800: 6d 3d 5c 22 25 73 5c 22 5c 72 5c 6e 22 0a 20 20  m=\"%s\"\r\n".  
4810: 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a    "Content-type:
4820: 20 74 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e 22 0a   text/html\r\n".
4830: 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 22      "\r\n".    "
4840: 3c 68 65 61 64 3e 3c 74 69 74 6c 65 3e 4e 6f 74  <head><title>Not
4850: 20 41 75 74 68 6f 72 69 7a 65 64 3c 2f 74 69 74   Authorized</tit
4860: 6c 65 3e 3c 2f 68 65 61 64 3e 5c 6e 22 0a 20 20  le></head>\n".  
4870: 20 20 22 3c 62 6f 64 79 3e 3c 68 31 3e 34 30 31    "<body><h1>401
4880: 20 4e 6f 74 20 41 75 74 68 6f 72 69 7a 65 64 3c   Not Authorized<
4890: 2f 68 31 3e 5c 6e 22 0a 20 20 20 20 22 41 20 6c  /h1>\n".    "A l
48a0: 6f 67 69 6e 20 61 6e 64 20 70 61 73 73 77 6f 72  ogin and passwor
48b0: 64 20 61 72 65 20 72 65 71 75 69 72 65 64 20 66  d are required f
48c0: 6f 72 20 74 68 69 73 20 64 6f 63 75 6d 65 6e 74  or this document
48d0: 5c 6e 22 0a 20 20 20 20 22 3c 2f 62 6f 64 79 3e  \n".    "</body>
48e0: 5c 6e 22 2c 20 7a 52 65 61 6c 6d 29 3b 0a 20 20  \n", zRealm);.  
48f0: 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 29 3b  MakeLogEntry(0);
4900: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74  .}../*.** Tell t
4910: 68 65 20 63 6c 69 65 6e 74 20 74 68 61 74 20 74  he client that t
4920: 68 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72  here is an error
4930: 20 69 6e 20 74 68 65 20 73 63 72 69 70 74 2e 0a   in the script..
4940: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43  */.static void C
4950: 67 69 45 72 72 6f 72 28 76 6f 69 64 29 7b 0a 20  giError(void){. 
4960: 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22   StartResponse("
4970: 35 30 30 20 45 72 72 6f 72 22 29 3b 0a 20 20 6e  500 Error");.  n
4980: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20  Out += printf(. 
4990: 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65     "Content-type
49a0: 3a 20 74 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e 22  : text/html\r\n"
49b0: 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20  .    "\r\n".    
49c0: 22 3c 68 65 61 64 3e 3c 74 69 74 6c 65 3e 43 47  "<head><title>CG
49d0: 49 20 50 72 6f 67 72 61 6d 20 45 72 72 6f 72 3c  I Program Error<
49e0: 2f 74 69 74 6c 65 3e 3c 2f 68 65 61 64 3e 5c 6e  /title></head>\n
49f0: 22 0a 20 20 20 20 22 3c 62 6f 64 79 3e 3c 68 31  ".    "<body><h1
4a00: 3e 43 47 49 20 50 72 6f 67 72 61 6d 20 45 72 72  >CGI Program Err
4a10: 6f 72 3c 2f 68 31 3e 5c 6e 22 0a 20 20 20 20 22  or</h1>\n".    "
4a20: 54 68 65 20 43 47 49 20 70 72 6f 67 72 61 6d 20  The CGI program 
4a30: 25 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e 20  %s generated an 
4a40: 65 72 72 6f 72 5c 6e 22 0a 20 20 20 20 22 3c 2f  error\n".    "</
4a50: 62 6f 64 79 3e 5c 6e 22 2c 20 7a 53 63 72 69 70  body>\n", zScrip
4a60: 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74  t);.  MakeLogEnt
4a70: 72 79 28 30 29 3b 0a 20 20 65 78 69 74 28 30 29  ry(0);.  exit(0)
4a80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
4a90: 69 73 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20  is called if we 
4aa0: 74 69 6d 65 6f 75 74 20 6f 72 20 63 61 74 63 68  timeout or catch
4ab0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 6b 69 6e 64   some other kind
4ac0: 20 6f 66 20 73 69 67 6e 61 6c 2e 0a 2a 2a 20 4c   of signal..** L
4ad0: 6f 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  og an error code
4ae0: 20 77 68 69 63 68 20 69 73 20 39 30 30 2b 69 53   which is 900+iS
4af0: 69 67 20 61 6e 64 20 74 68 65 6e 20 71 75 69 74  ig and then quit
4b00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4b10: 20 54 69 6d 65 6f 75 74 28 69 6e 74 20 69 53 69   Timeout(int iSi
4b20: 67 29 7b 0a 20 20 69 66 28 20 21 64 65 62 75 67  g){.  if( !debug
4b30: 46 6c 61 67 20 29 7b 0a 20 20 20 20 69 66 28 20  Flag ){.    if( 
4b40: 7a 53 63 72 69 70 74 20 26 26 20 7a 53 63 72 69  zScript && zScri
4b50: 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 63  pt[0] ){.      c
4b60: 68 61 72 20 7a 42 75 66 5b 31 30 5d 3b 0a 20 20  har zBuf[10];.  
4b70: 20 20 20 20 7a 42 75 66 5b 30 5d 20 3d 20 27 39      zBuf[0] = '9
4b80: 27 3b 0a 20 20 20 20 20 20 7a 42 75 66 5b 31 5d  ';.      zBuf[1]
4b90: 20 3d 20 27 30 27 20 2b 20 28 69 53 69 67 2f 31   = '0' + (iSig/1
4ba0: 30 29 25 31 30 3b 0a 20 20 20 20 20 20 7a 42 75  0)%10;.      zBu
4bb0: 66 5b 32 5d 20 3d 20 27 30 27 20 2b 20 69 53 69  f[2] = '0' + iSi
4bc0: 67 25 31 30 3b 0a 20 20 20 20 20 20 7a 42 75 66  g%10;.      zBuf
4bd0: 5b 33 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  [3] = 0;.      s
4be0: 74 72 63 70 79 28 7a 52 65 70 6c 79 53 74 61 74  trcpy(zReplyStat
4bf0: 75 73 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20  us, zBuf);.     
4c00: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 29   MakeLogEntry(0)
4c10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 69 74  ;.    }.    exit
4c20: 28 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (0);.  }.}../*.*
4c30: 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c 69 65 6e  * Tell the clien
4c40: 74 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  t that there is 
4c50: 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  an error in the 
4c60: 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69  script..*/.stati
4c70: 63 20 76 6f 69 64 20 43 67 69 53 63 72 69 70 74  c void CgiScript
4c80: 57 72 69 74 61 62 6c 65 28 76 6f 69 64 29 7b 0a  Writable(void){.
4c90: 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28    StartResponse(
4ca0: 22 35 30 30 20 43 47 49 20 43 6f 6e 66 69 67 75  "500 CGI Configu
4cb0: 72 61 74 69 6f 6e 20 45 72 72 6f 72 22 29 3b 0a  ration Error");.
4cc0: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
4cd0: 28 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74  (.    "Content-t
4ce0: 79 70 65 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c  ype: text/plain\
4cf0: 72 5c 6e 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a  r\n".    "\r\n".
4d00: 20 20 20 20 22 54 68 65 20 43 47 49 20 70 72 6f      "The CGI pro
4d10: 67 72 61 6d 20 25 73 20 69 73 20 77 72 69 74 61  gram %s is writa
4d20: 62 6c 65 20 62 79 20 75 73 65 72 73 20 6f 74 68  ble by users oth
4d30: 65 72 20 74 68 61 6e 20 69 74 73 20 6f 77 6e 65  er than its owne
4d40: 72 2e 5c 6e 22 2c 0a 20 20 20 20 7a 52 65 61 6c  r.\n",.    zReal
4d50: 53 63 72 69 70 74 29 3b 0a 20 20 4d 61 6b 65 4c  Script);.  MakeL
4d60: 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20 20 65 78  ogEntry(0);.  ex
4d70: 69 74 28 30 29 3b 20 20 20 20 20 20 20 0a 7d 0a  it(0);       .}.
4d80: 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20  ./*.** Tell the 
4d90: 63 6c 69 65 6e 74 20 74 68 61 74 20 74 68 65 20  client that the 
4da0: 73 65 72 76 65 72 20 6d 61 6c 66 75 6e 63 74 69  server malfuncti
4db0: 6f 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oned..*/.static 
4dc0: 76 6f 69 64 20 4d 61 6c 66 75 6e 63 74 69 6f 6e  void Malfunction
4dd0: 28 69 6e 74 20 6c 69 6e 65 6e 75 6d 2c 20 63 6f  (int linenum, co
4de0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
4df0: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
4e00: 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72  st ap;.  va_star
4e10: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
4e20: 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28    StartResponse(
4e30: 22 35 30 30 20 53 65 72 76 65 72 20 4d 61 6c 66  "500 Server Malf
4e40: 75 6e 63 74 69 6f 6e 22 29 3b 0a 20 20 6e 4f 75  unction");.  nOu
4e50: 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20  t += printf(.   
4e60: 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20   "Content-type: 
4e70: 74 65 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a  text/plain\r\n".
4e80: 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 22      "\r\n".    "
4e90: 57 65 62 20 73 65 72 76 65 72 20 6d 61 6c 66 75  Web server malfu
4ea0: 6e 63 74 69 6f 6e 65 64 3b 20 65 72 72 6f 72 20  nctioned; error 
4eb0: 6e 75 6d 62 65 72 20 25 64 5c 6e 5c 6e 22 2c 20  number %d\n\n", 
4ec0: 6c 69 6e 65 6e 75 6d 29 3b 0a 20 20 69 66 28 20  linenum);.  if( 
4ed0: 7a 46 6f 72 6d 61 74 20 29 7b 0a 20 20 20 20 6e  zFormat ){.    n
4ee0: 4f 75 74 20 2b 3d 20 76 70 72 69 6e 74 66 28 7a  Out += vprintf(z
4ef0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d  Format, ap);.  }
4f00: 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28  .  MakeLogEntry(
4f10: 30 29 3b 0a 20 20 65 78 69 74 28 30 29 3b 20 20  0);.  exit(0);  
4f20: 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44       .}../*.** D
4f30: 6f 20 61 20 73 65 72 76 65 72 20 72 65 64 69 72  o a server redir
4f40: 65 63 74 20 74 6f 20 74 68 65 20 64 6f 63 75 6d  ect to the docum
4f50: 65 6e 74 20 73 70 65 63 69 66 69 65 64 2e 20 20  ent specified.  
4f60: 54 68 65 20 64 6f 63 75 6d 65 6e 74 0a 2a 2a 20  The document.** 
4f70: 6e 61 6d 65 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  name not contain
4f80: 20 73 63 68 65 6d 65 20 6f 72 20 6e 65 74 77 6f   scheme or netwo
4f90: 72 6b 20 6c 6f 63 61 74 69 6f 6e 20 6f 72 20 74  rk location or t
4fa0: 68 65 20 71 75 65 72 79 20 73 74 72 69 6e 67 2e  he query string.
4fb0: 0a 2a 2a 20 49 74 20 77 69 6c 6c 20 62 65 20 6a  .** It will be j
4fc0: 75 73 74 20 74 68 65 20 70 61 74 68 2e 0a 2a 2f  ust the path..*/
4fd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 52 65 64  .static void Red
4fe0: 69 72 65 63 74 28 63 6f 6e 73 74 20 63 68 61 72  irect(const char
4ff0: 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 69 6e   *zPath, int fin
5000: 69 73 68 29 7b 0a 20 20 53 74 61 72 74 52 65 73  ish){.  StartRes
5010: 70 6f 6e 73 65 28 22 33 30 32 20 54 65 6d 70 6f  ponse("302 Tempo
5020: 72 61 72 79 20 52 65 64 69 72 65 63 74 22 29 3b  rary Redirect");
5030: 0a 20 20 69 66 28 20 7a 53 65 72 76 65 72 50 6f  .  if( zServerPo
5040: 72 74 3d 3d 30 20 7c 7c 20 7a 53 65 72 76 65 72  rt==0 || zServer
5050: 50 6f 72 74 5b 30 5d 3d 3d 30 20 7c 7c 20 73 74  Port[0]==0 || st
5060: 72 63 6d 70 28 7a 53 65 72 76 65 72 50 6f 72 74  rcmp(zServerPort
5070: 2c 22 38 30 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ,"80")==0 ){.   
5080: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
5090: 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73 3a 2f 2f  "Location: %s://
50a0: 25 73 25 73 25 73 5c 72 5c 6e 22 2c 0a 20 20 20  %s%s%s\r\n",.   
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 7a 48 74 74 70 2c 20 7a 53 65 72 76 65 72 4e 61  zHttp, zServerNa
50d0: 6d 65 2c 20 7a 50 61 74 68 2c 20 7a 51 75 65 72  me, zPath, zQuer
50e0: 79 53 75 66 66 69 78 29 3b 0a 20 20 7d 65 6c 73  ySuffix);.  }els
50f0: 65 7b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70  e{.    nOut += p
5100: 72 69 6e 74 66 28 22 4c 6f 63 61 74 69 6f 6e 3a  rintf("Location:
5110: 20 25 73 3a 2f 2f 25 73 3a 25 73 25 73 25 73 5c   %s://%s:%s%s%s\
5120: 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  r\n",.          
5130: 20 20 20 20 20 20 20 20 20 7a 48 74 74 70 2c 20           zHttp, 
5140: 7a 53 65 72 76 65 72 4e 61 6d 65 2c 20 7a 53 65  zServerName, zSe
5150: 72 76 65 72 50 6f 72 74 2c 20 7a 50 61 74 68 2c  rverPort, zPath,
5160: 20 7a 51 75 65 72 79 53 75 66 66 69 78 29 3b 0a   zQuerySuffix);.
5170: 20 20 7d 0a 20 20 69 66 28 20 66 69 6e 69 73 68    }.  if( finish
5180: 20 29 7b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20   ){.    nOut += 
5190: 70 72 69 6e 74 66 28 22 43 6f 6e 74 65 6e 74 2d  printf("Content-
51a0: 6c 65 6e 67 74 68 3a 20 30 5c 72 5c 6e 22 29 3b  length: 0\r\n");
51b0: 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69  .    nOut += pri
51c0: 6e 74 66 28 22 5c 72 5c 6e 22 29 3b 0a 20 20 20  ntf("\r\n");.   
51d0: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 29   MakeLogEntry(0)
51e0: 3b 0a 20 20 7d 0a 20 20 66 66 6c 75 73 68 28 73  ;.  }.  fflush(s
51f0: 74 64 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tdout);.}../*.**
5200: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74   This function t
5210: 72 65 61 74 73 20 69 74 73 20 69 6e 70 75 74 20  reats its input 
5220: 61 73 20 61 20 62 61 73 65 2d 36 34 20 73 74 72  as a base-64 str
5230: 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 73 20  ing and returns 
5240: 74 68 65 0a 2a 2a 20 64 65 63 6f 64 65 64 20 76  the.** decoded v
5250: 61 6c 75 65 20 6f 66 20 74 68 61 74 20 73 74 72  alue of that str
5260: 69 6e 67 2e 20 20 43 68 61 72 61 63 74 65 72 73  ing.  Characters
5270: 20 6f 66 20 69 6e 70 75 74 20 74 68 61 74 20 61   of input that a
5280: 72 65 20 6e 6f 74 0a 2a 2a 20 76 61 6c 69 64 20  re not.** valid 
5290: 62 61 73 65 2d 36 34 20 63 68 61 72 61 63 74 65  base-64 characte
52a0: 72 73 20 28 73 75 63 68 20 61 73 20 73 70 61 63  rs (such as spac
52b0: 65 73 20 61 6e 64 20 6e 65 77 6c 69 6e 65 73 29  es and newlines)
52c0: 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f   are ignored..*/
52d0: 0a 76 6f 69 64 20 44 65 63 6f 64 65 36 34 28 63  .void Decode64(c
52e0: 68 61 72 20 2a 7a 36 34 29 7b 0a 20 20 63 68 61  har *z64){.  cha
52f0: 72 20 2a 7a 44 61 74 61 3b 0a 20 20 69 6e 74 20  r *zData;.  int 
5300: 6e 36 34 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  n64;.  int i, j;
5310: 0a 20 20 69 6e 74 20 61 2c 20 62 2c 20 63 2c 20  .  int a, b, c, 
5320: 64 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  d;.  static int 
5330: 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 73 74  isInit = 0;.  st
5340: 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73 5b 31  atic int trans[1
5350: 32 38 5d 3b 0a 20 20 73 74 61 74 69 63 20 75 6e  28];.  static un
5360: 73 69 67 6e 65 64 20 63 68 61 72 20 7a 42 61 73  signed char zBas
5370: 65 5b 5d 20 3d 20 0a 20 20 20 20 22 41 42 43 44  e[] = .    "ABCD
5380: 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
5390: 55 56 57 58 59 5a 61 62 63 64 65 66 67 68 69 6a  UVWXYZabcdefghij
53a0: 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a  klmnopqrstuvwxyz
53b0: 30 31 32 33 34 35 36 37 38 39 2b 2f 22 3b 0a 0a  0123456789+/";..
53c0: 20 20 69 66 28 20 21 69 73 49 6e 69 74 20 29 7b    if( !isInit ){
53d0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
53e0: 31 32 38 3b 20 69 2b 2b 29 7b 20 74 72 61 6e 73  128; i++){ trans
53f0: 5b 69 5d 20 3d 20 30 3b 20 7d 0a 20 20 20 20 66  [i] = 0; }.    f
5400: 6f 72 28 69 3d 30 3b 20 7a 42 61 73 65 5b 69 5d  or(i=0; zBase[i]
5410: 3b 20 69 2b 2b 29 7b 20 74 72 61 6e 73 5b 7a 42  ; i++){ trans[zB
5420: 61 73 65 5b 69 5d 20 26 20 30 78 37 66 5d 20 3d  ase[i] & 0x7f] =
5430: 20 69 3b 20 7d 0a 20 20 20 20 69 73 49 6e 69 74   i; }.    isInit
5440: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 6e 36 34 20   = 1;.  }.  n64 
5450: 3d 20 73 74 72 6c 65 6e 28 7a 36 34 29 3b 0a 20  = strlen(z64);. 
5460: 20 77 68 69 6c 65 28 20 6e 36 34 3e 30 20 26 26   while( n64>0 &&
5470: 20 7a 36 34 5b 6e 36 34 2d 31 5d 3d 3d 27 3d 27   z64[n64-1]=='='
5480: 20 29 20 6e 36 34 2d 2d 3b 0a 20 20 7a 44 61 74   ) n64--;.  zDat
5490: 61 20 3d 20 7a 36 34 3b 0a 20 20 66 6f 72 28 69  a = z64;.  for(i
54a0: 3d 6a 3d 30 3b 20 69 2b 33 3c 6e 36 34 3b 20 69  =j=0; i+3<n64; i
54b0: 2b 3d 34 29 7b 0a 20 20 20 20 61 20 3d 20 74 72  +=4){.    a = tr
54c0: 61 6e 73 5b 7a 36 34 5b 69 5d 20 26 20 30 78 37  ans[z64[i] & 0x7
54d0: 66 5d 3b 0a 20 20 20 20 62 20 3d 20 74 72 61 6e  f];.    b = tran
54e0: 73 5b 7a 36 34 5b 69 2b 31 5d 20 26 20 30 78 37  s[z64[i+1] & 0x7
54f0: 66 5d 3b 0a 20 20 20 20 63 20 3d 20 74 72 61 6e  f];.    c = tran
5500: 73 5b 7a 36 34 5b 69 2b 32 5d 20 26 20 30 78 37  s[z64[i+2] & 0x7
5510: 66 5d 3b 0a 20 20 20 20 64 20 3d 20 74 72 61 6e  f];.    d = tran
5520: 73 5b 7a 36 34 5b 69 2b 33 5d 20 26 20 30 78 37  s[z64[i+3] & 0x7
5530: 66 5d 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b  f];.    zData[j+
5540: 2b 5d 20 3d 20 28 28 61 3c 3c 32 29 20 26 20 30  +] = ((a<<2) & 0
5550: 78 66 63 29 20 7c 20 28 28 62 3e 3e 34 29 20 26  xfc) | ((b>>4) &
5560: 20 30 78 30 33 29 3b 0a 20 20 20 20 7a 44 61 74   0x03);.    zDat
5570: 61 5b 6a 2b 2b 5d 20 3d 20 28 28 62 3c 3c 34 29  a[j++] = ((b<<4)
5580: 20 26 20 30 78 66 30 29 20 7c 20 28 28 63 3e 3e   & 0xf0) | ((c>>
5590: 32 29 20 26 20 30 78 30 66 29 3b 0a 20 20 20 20  2) & 0x0f);.    
55a0: 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28 63  zData[j++] = ((c
55b0: 3c 3c 36 29 20 26 20 30 78 63 30 29 20 7c 20 28  <<6) & 0xc0) | (
55c0: 64 20 26 20 30 78 33 66 29 3b 0a 20 20 7d 0a 20  d & 0x3f);.  }. 
55d0: 20 69 66 28 20 69 2b 32 3c 6e 36 34 20 29 7b 0a   if( i+2<n64 ){.
55e0: 20 20 20 20 61 20 3d 20 74 72 61 6e 73 5b 7a 36      a = trans[z6
55f0: 34 5b 69 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20  4[i] & 0x7f];.  
5600: 20 20 62 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b    b = trans[z64[
5610: 69 2b 31 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20  i+1] & 0x7f];.  
5620: 20 20 63 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b    c = trans[z64[
5630: 69 2b 32 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20  i+2] & 0x7f];.  
5640: 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28    zData[j++] = (
5650: 28 61 3c 3c 32 29 20 26 20 30 78 66 63 29 20 7c  (a<<2) & 0xfc) |
5660: 20 28 28 62 3e 3e 34 29 20 26 20 30 78 30 33 29   ((b>>4) & 0x03)
5670: 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d  ;.    zData[j++]
5680: 20 3d 20 28 28 62 3c 3c 34 29 20 26 20 30 78 66   = ((b<<4) & 0xf
5690: 30 29 20 7c 20 28 28 63 3e 3e 32 29 20 26 20 30  0) | ((c>>2) & 0
56a0: 78 30 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  x0f);.  }else if
56b0: 28 20 69 2b 31 3c 6e 36 34 20 29 7b 0a 20 20 20  ( i+1<n64 ){.   
56c0: 20 61 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69   a = trans[z64[i
56d0: 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 62  ] & 0x7f];.    b
56e0: 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b 31   = trans[z64[i+1
56f0: 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 7a  ] & 0x7f];.    z
5700: 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28 61 3c  Data[j++] = ((a<
5710: 3c 32 29 20 26 20 30 78 66 63 29 20 7c 20 28 28  <2) & 0xfc) | ((
5720: 62 3e 3e 34 29 20 26 20 30 78 30 33 29 3b 0a 20  b>>4) & 0x03);. 
5730: 20 7d 0a 20 20 7a 44 61 74 61 5b 6a 5d 20 3d 20   }.  zData[j] = 
5740: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  0;.}../*.** Chec
5750: 6b 20 74 6f 20 73 65 65 20 69 66 20 62 61 73 69  k to see if basi
5760: 63 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  c authorization 
5770: 63 72 65 64 65 6e 74 69 61 6c 73 20 61 72 65 20  credentials are 
5780: 70 72 6f 76 69 64 65 64 20 66 6f 72 0a 2a 2a 20  provided for.** 
5790: 74 68 65 20 75 73 65 72 20 61 63 63 6f 72 64 69  the user accordi
57a0: 6e 67 20 74 6f 20 74 68 65 20 69 6e 66 6f 72 6d  ng to the inform
57b0: 61 74 69 6f 6e 20 69 6e 20 7a 41 75 74 68 46 69  ation in zAuthFi
57c0: 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  le.  Return true
57d0: 0a 2a 2a 20 69 66 20 61 75 74 68 6f 72 69 7a 65  .** if authorize
57e0: 64 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  d.  Return false
57f0: 20 69 66 20 6e 6f 74 20 61 75 74 68 6f 72 69 7a   if not authoriz
5800: 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 69 6c 65 20 66  ed..**.** File f
5810: 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ormat:.**.**    
5820: 2a 20 20 42 6c 61 6e 6b 20 6c 69 6e 65 73 20 61  *  Blank lines a
5830: 6e 64 20 6c 69 6e 65 73 20 74 68 61 74 20 62 65  nd lines that be
5840: 67 69 6e 20 77 69 74 68 20 27 23 27 20 61 72 65  gin with '#' are
5850: 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 20 20 20 2a   ignored.**    *
5860: 20 20 22 68 74 74 70 2d 72 65 64 69 72 65 63 74    "http-redirect
5870: 22 20 66 6f 72 63 65 73 20 61 20 72 65 64 69 72  " forces a redir
5880: 65 63 74 20 74 6f 20 48 54 54 50 53 20 69 66 20  ect to HTTPS if 
5890: 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64  not there alread
58a0: 79 0a 2a 2a 20 20 20 20 2a 20 20 22 68 74 74 70  y.**    *  "http
58b0: 73 2d 6f 6e 6c 79 22 20 64 69 73 61 6c 6c 6f 77  s-only" disallow
58c0: 73 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 20 48  s operation in H
58d0: 54 54 50 0a 2a 2a 20 20 20 20 2a 20 20 22 75 73  TTP.**    *  "us
58e0: 65 72 20 4e 41 4d 45 20 4c 4f 47 49 4e 3a 50 41  er NAME LOGIN:PA
58f0: 53 53 57 4f 52 44 22 20 63 68 65 63 6b 73 20 74  SSWORD" checks t
5900: 6f 20 73 65 65 20 69 66 20 4c 4f 47 49 4e 3a 50  o see if LOGIN:P
5910: 41 53 53 57 4f 52 44 20 0a 2a 2a 20 20 20 20 20  ASSWORD .**     
5920: 20 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20    authorization 
5930: 63 72 65 64 65 6e 74 69 61 6c 73 20 61 72 65 20  credentials are 
5940: 70 72 6f 76 69 64 65 64 2c 20 61 6e 64 20 69 66  provided, and if
5950: 20 73 6f 20 73 65 74 73 20 74 68 65 0a 2a 2a 20   so sets the.** 
5960: 20 20 20 20 20 20 52 45 4d 4f 54 45 5f 55 53 45        REMOTE_USE
5970: 52 20 74 6f 20 4e 41 4d 45 2e 0a 2a 2a 20 20 20  R to NAME..**   
5980: 20 2a 20 20 22 72 65 61 6c 6d 20 54 45 58 54 22   *  "realm TEXT"
5990: 20 73 65 74 73 20 74 68 65 20 72 65 61 6c 6d 20   sets the realm 
59a0: 74 6f 20 54 45 58 54 2e 0a 2a 2f 0a 73 74 61 74  to TEXT..*/.stat
59b0: 69 63 20 69 6e 74 20 43 68 65 63 6b 42 61 73 69  ic int CheckBasi
59c0: 63 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e 28 63  cAuthorization(c
59d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 75 74 68  onst char *zAuth
59e0: 46 69 6c 65 29 7b 0a 20 20 46 49 4c 45 20 2a 69  File){.  FILE *i
59f0: 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 61 6c  n;.  char *zReal
5a00: 6d 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 72 65 61  m = "unknown rea
5a10: 6c 6d 22 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f  lm";.  char *zLo
5a20: 67 69 6e 50 73 77 64 3b 0a 20 20 63 68 61 72 20  ginPswd;.  char 
5a30: 2a 7a 4e 61 6d 65 3b 0a 20 20 63 68 61 72 20 7a  *zName;.  char z
5a40: 4c 69 6e 65 5b 32 30 30 30 5d 3b 0a 0a 20 20 69  Line[2000];..  i
5a50: 6e 20 3d 20 66 6f 70 65 6e 28 7a 41 75 74 68 46  n = fopen(zAuthF
5a60: 69 6c 65 2c 20 22 72 22 29 3b 0a 20 20 69 66 28  ile, "r");.  if(
5a70: 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 4e 6f   in==0 ){.    No
5a80: 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29  tFound(__LINE__)
5a90: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
5aa0: 20 20 7d 0a 20 20 69 66 28 20 7a 41 75 74 68 41    }.  if( zAuthA
5ab0: 72 67 20 29 20 44 65 63 6f 64 65 36 34 28 7a 41  rg ) Decode64(zA
5ac0: 75 74 68 41 72 67 29 3b 0a 20 20 77 68 69 6c 65  uthArg);.  while
5ad0: 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 20 73  ( fgets(zLine, s
5ae0: 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 69 6e  izeof(zLine), in
5af0: 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ) ){.    char *z
5b00: 46 69 65 6c 64 4e 61 6d 65 3b 0a 20 20 20 20 63  FieldName;.    c
5b10: 68 61 72 20 2a 7a 56 61 6c 3b 0a 0a 20 20 20 20  har *zVal;..    
5b20: 7a 46 69 65 6c 64 4e 61 6d 65 20 3d 20 47 65 74  zFieldName = Get
5b30: 46 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a 4c 69  FirstElement(zLi
5b40: 6e 65 2c 26 7a 56 61 6c 29 3b 0a 20 20 20 20 69  ne,&zVal);.    i
5b50: 66 28 20 7a 46 69 65 6c 64 4e 61 6d 65 3d 3d 30  f( zFieldName==0
5b60: 20 7c 7c 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 3d   || *zFieldName=
5b70: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
5b80: 20 20 20 69 66 28 20 7a 46 69 65 6c 64 4e 61 6d     if( zFieldNam
5b90: 65 5b 30 5d 3d 3d 27 23 27 20 29 20 63 6f 6e 74  e[0]=='#' ) cont
5ba0: 69 6e 75 65 3b 0a 20 20 20 20 52 65 6d 6f 76 65  inue;.    Remove
5bb0: 4e 65 77 6c 69 6e 65 28 7a 56 61 6c 29 3b 0a 20  Newline(zVal);. 
5bc0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46     if( strcmp(zF
5bd0: 69 65 6c 64 4e 61 6d 65 2c 20 22 72 65 61 6c 6d  ieldName, "realm
5be0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  ")==0 ){.      z
5bf0: 52 65 61 6c 6d 20 3d 20 53 74 72 44 75 70 28 7a  Realm = StrDup(z
5c00: 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Val);.    }else 
5c10: 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 65 6c  if( strcmp(zFiel
5c20: 64 4e 61 6d 65 2c 22 75 73 65 72 22 29 3d 3d 30  dName,"user")==0
5c30: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 41   ){.      if( zA
5c40: 75 74 68 41 72 67 3d 3d 30 20 29 20 63 6f 6e 74  uthArg==0 ) cont
5c50: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7a 4e 61 6d  inue;.      zNam
5c60: 65 20 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d  e = GetFirstElem
5c70: 65 6e 74 28 7a 56 61 6c 2c 20 26 7a 56 61 6c 29  ent(zVal, &zVal)
5c80: 3b 0a 20 20 20 20 20 20 7a 4c 6f 67 69 6e 50 73  ;.      zLoginPs
5c90: 77 64 20 3d 20 47 65 74 46 69 72 73 74 45 6c 65  wd = GetFirstEle
5ca0: 6d 65 6e 74 28 7a 56 61 6c 2c 20 26 7a 56 61 6c  ment(zVal, &zVal
5cb0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 6f  );.      if( zLo
5cc0: 67 69 6e 50 73 77 64 3d 3d 30 20 29 20 63 6f 6e  ginPswd==0 ) con
5cd0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
5ce0: 20 7a 41 75 74 68 41 72 67 20 26 26 20 73 74 72   zAuthArg && str
5cf0: 63 6d 70 28 7a 41 75 74 68 41 72 67 2c 7a 4c 6f  cmp(zAuthArg,zLo
5d00: 67 69 6e 50 73 77 64 29 3d 3d 30 20 29 7b 0a 20  ginPswd)==0 ){. 
5d10: 20 20 20 20 20 20 20 7a 52 65 6d 6f 74 65 55 73         zRemoteUs
5d20: 65 72 20 3d 20 53 74 72 44 75 70 28 7a 4e 61 6d  er = StrDup(zNam
5d30: 65 29 3b 0a 20 20 20 20 20 20 20 20 66 63 6c 6f  e);.        fclo
5d40: 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  se(in);.        
5d50: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
5d60: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
5d70: 73 74 72 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d  strcmp(zFieldNam
5d80: 65 2c 22 68 74 74 70 73 2d 6f 6e 6c 79 22 29 3d  e,"https-only")=
5d90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
5da0: 21 75 73 65 48 74 74 70 73 20 29 7b 0a 20 20 20  !useHttps ){.   
5db0: 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f       NotFound(__
5dc0: 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20  LINE__);.       
5dd0: 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20   fclose(in);.   
5de0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
5df0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
5e00: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 65   if( strcmp(zFie
5e10: 6c 64 4e 61 6d 65 2c 22 68 74 74 70 2d 72 65 64  ldName,"http-red
5e20: 69 72 65 63 74 22 29 3d 3d 30 20 29 7b 0a 20 20  irect")==0 ){.  
5e30: 20 20 20 20 69 66 28 20 21 75 73 65 48 74 74 70      if( !useHttp
5e40: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 48 74  s ){.        zHt
5e50: 74 70 20 3d 20 22 68 74 74 70 73 22 3b 0a 20 20  tp = "https";.  
5e60: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c        sprintf(zL
5e70: 69 6e 65 2c 20 22 25 73 25 73 22 2c 20 7a 53 63  ine, "%s%s", zSc
5e80: 72 69 70 74 2c 20 7a 50 61 74 68 49 6e 66 6f 29  ript, zPathInfo)
5e90: 3b 0a 20 20 20 20 20 20 20 20 52 65 64 69 72 65  ;.        Redire
5ea0: 63 74 28 7a 4c 69 6e 65 2c 20 31 29 3b 0a 20 20  ct(zLine, 1);.  
5eb0: 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29        fclose(in)
5ec0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
5ed0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
5ee0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4e 6f 74  }else{.      Not
5ef0: 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b  Found(__LINE__);
5f00: 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69 6e  .      fclose(in
5f10: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
5f20: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  0;.    }.  }.  f
5f30: 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 4e 6f 74  close(in);.  Not
5f40: 41 75 74 68 6f 72 69 7a 65 64 28 7a 52 65 61 6c  Authorized(zReal
5f50: 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  m);.  return 0;.
5f60: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 75 65 73 73 20 74  }../*.** Guess t
5f70: 68 65 20 6d 69 6d 65 2d 74 79 70 65 20 6f 66 20  he mime-type of 
5f80: 61 20 64 6f 63 75 6d 65 6e 74 20 62 61 73 65 64  a document based
5f90: 20 6f 6e 20 69 74 73 20 6e 61 6d 65 2e 0a 2a 2f   on its name..*/
5fa0: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 47 65 74  .const char *Get
5fb0: 4d 69 6d 65 54 79 70 65 28 63 6f 6e 73 74 20 63  MimeType(const c
5fc0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20  har *zName, int 
5fd0: 6e 4e 61 6d 65 29 7b 0a 20 20 63 6f 6e 73 74 20  nName){.  const 
5fe0: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 69  char *z;.  int i
5ff0: 3b 0a 20 20 69 6e 74 20 66 69 72 73 74 2c 20 6c  ;.  int first, l
6000: 61 73 74 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a  ast;.  int len;.
6010: 20 20 63 68 61 72 20 7a 53 75 66 66 69 78 5b 32    char zSuffix[2
6020: 30 5d 3b 0a 0a 20 20 2f 2a 20 41 20 74 61 62 6c  0];..  /* A tabl
6030: 65 20 6f 66 20 6d 69 6d 65 74 79 70 65 73 20 62  e of mimetypes b
6040: 61 73 65 64 20 6f 6e 20 66 69 6c 65 20 73 75 66  ased on file suf
6050: 66 69 78 65 73 2e 20 0a 20 20 2a 2a 20 53 75 66  fixes. .  ** Suf
6060: 66 69 78 65 73 20 6d 75 73 74 20 62 65 20 69 6e  fixes must be in
6070: 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20 73 6f   sorted order so
6080: 20 74 68 61 74 20 77 65 20 63 61 6e 20 64 6f 20   that we can do 
6090: 61 20 62 69 6e 61 72 79 0a 20 20 2a 2a 20 73 65  a binary.  ** se
60a0: 61 72 63 68 20 74 6f 20 66 69 6e 64 20 74 68 65  arch to find the
60b0: 20 6d 69 6d 65 2d 74 79 70 65 0a 20 20 2a 2f 0a   mime-type.  */.
60c0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
60d0: 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73  truct {.    cons
60e0: 74 20 63 68 61 72 20 2a 7a 53 75 66 66 69 78 3b  t char *zSuffix;
60f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
6100: 6c 65 20 73 75 66 66 69 78 20 2a 2f 0a 20 20 20  le suffix */.   
6110: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
6120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
6130: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 75 66  ength of the suf
6140: 66 69 78 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  fix */.    const
6150: 20 63 68 61 72 20 2a 7a 4d 69 6d 65 74 79 70 65   char *zMimetype
6160: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 72  ;     /* The cor
6170: 72 65 73 70 6f 6e 64 69 6e 67 20 6d 69 6d 65 74  responding mimet
6180: 79 70 65 20 2a 2f 0a 20 20 7d 20 61 4d 69 6d 65  ype */.  } aMime
6190: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 61 69  [] = {.    { "ai
61a0: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61  ",         2, "a
61b0: 70 70 6c 69 63 61 74 69 6f 6e 2f 70 6f 73 74 73  pplication/posts
61c0: 63 72 69 70 74 22 20 20 20 20 20 20 20 20 20 20  cript"          
61d0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 69 66 22    },.    { "aif"
61e0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64  ,        3, "aud
61f0: 69 6f 2f 78 2d 61 69 66 66 22 20 20 20 20 20 20  io/x-aiff"      
6200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6210: 7d 2c 0a 20 20 20 20 7b 20 22 61 69 66 63 22 2c  },.    { "aifc",
6220: 20 20 20 20 20 20 20 34 2c 20 22 61 75 64 69 6f         4, "audio
6230: 2f 78 2d 61 69 66 66 22 20 20 20 20 20 20 20 20  /x-aiff"        
6240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6250: 0a 20 20 20 20 7b 20 22 61 69 66 66 22 2c 20 20  .    { "aiff",  
6260: 20 20 20 20 20 34 2c 20 22 61 75 64 69 6f 2f 78       4, "audio/x
6270: 2d 61 69 66 66 22 20 20 20 20 20 20 20 20 20 20  -aiff"          
6280: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6290: 20 20 20 7b 20 22 61 72 6a 22 2c 20 20 20 20 20     { "arj",     
62a0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
62b0: 6f 6e 2f 78 2d 61 72 6a 2d 63 6f 6d 70 72 65 73  on/x-arj-compres
62c0: 73 65 64 22 20 20 20 20 20 20 7d 2c 0a 20 20 20  sed"      },.   
62d0: 20 7b 20 22 61 73 63 22 2c 20 20 20 20 20 20 20   { "asc",       
62e0: 20 33 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22   3, "text/plain"
62f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6300: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6310: 20 22 61 73 66 22 2c 20 20 20 20 20 20 20 20 33   "asf",        3
6320: 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 61 73  , "video/x-ms-as
6330: 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f"              
6340: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6350: 61 73 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20  asx",        3, 
6360: 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 61 73 78 22  "video/x-ms-asx"
6370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6380: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 75      },.    { "au
6390: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61  ",         2, "a
63a0: 75 64 69 6f 2f 75 6c 61 77 22 20 20 20 20 20 20  udio/ulaw"      
63b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63c0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 76 69 22    },.    { "avi"
63d0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64  ,        3, "vid
63e0: 65 6f 2f 78 2d 6d 73 76 69 64 65 6f 22 20 20 20  eo/x-msvideo"   
63f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6400: 7d 2c 0a 20 20 20 20 7b 20 22 62 61 74 22 2c 20  },.    { "bat", 
6410: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
6420: 63 61 74 69 6f 6e 2f 78 2d 6d 73 64 6f 73 2d 70  cation/x-msdos-p
6430: 72 6f 67 72 61 6d 22 20 20 20 20 20 20 20 7d 2c  rogram"       },
6440: 0a 20 20 20 20 7b 20 22 62 63 70 69 6f 22 2c 20  .    { "bcpio", 
6450: 20 20 20 20 20 35 2c 20 22 61 70 70 6c 69 63 61       5, "applica
6460: 74 69 6f 6e 2f 78 2d 62 63 70 69 6f 22 20 20 20  tion/x-bcpio"   
6470: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6480: 20 20 20 7b 20 22 62 69 6e 22 2c 20 20 20 20 20     { "bin",     
6490: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
64a0: 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22  on/octet-stream"
64b0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
64c0: 20 7b 20 22 63 22 2c 20 20 20 20 20 20 20 20 20   { "c",         
64d0: 20 31 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22   1, "text/plain"
64e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64f0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6500: 20 22 63 63 22 2c 20 20 20 20 20 20 20 20 20 32   "cc",         2
6510: 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20  , "text/plain"  
6520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6530: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6540: 63 63 61 64 22 2c 20 20 20 20 20 20 20 34 2c 20  ccad",       4, 
6550: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 63 6c 61  "application/cla
6560: 72 69 73 63 61 64 22 20 20 20 20 20 20 20 20 20  riscad"         
6570: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 64      },.    { "cd
6580: 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  f",        3, "a
6590: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6e 65 74  pplication/x-net
65a0: 63 64 66 22 20 20 20 20 20 20 20 20 20 20 20 20  cdf"            
65b0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6c 61 73    },.    { "clas
65c0: 73 22 2c 20 20 20 20 20 20 35 2c 20 22 61 70 70  s",      5, "app
65d0: 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73  lication/octet-s
65e0: 74 72 65 61 6d 22 20 20 20 20 20 20 20 20 20 20  tream"          
65f0: 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 64 22 2c 20  },.    { "cod", 
6600: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
6610: 63 61 74 69 6f 6e 2f 76 6e 64 2e 72 69 6d 2e 63  cation/vnd.rim.c
6620: 6f 64 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c  od"           },
6630: 0a 20 20 20 20 7b 20 22 63 6f 6d 22 2c 20 20 20  .    { "com",   
6640: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
6650: 74 69 6f 6e 2f 78 2d 6d 73 64 6f 73 2d 70 72 6f  tion/x-msdos-pro
6660: 67 72 61 6d 22 20 20 20 20 20 20 20 7d 2c 0a 20  gram"       },. 
6670: 20 20 20 7b 20 22 63 70 69 6f 22 2c 20 20 20 20     { "cpio",    
6680: 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69     4, "applicati
6690: 6f 6e 2f 78 2d 63 70 69 6f 22 20 20 20 20 20 20  on/x-cpio"      
66a0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
66b0: 20 7b 20 22 63 70 74 22 2c 20 20 20 20 20 20 20   { "cpt",       
66c0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
66d0: 2f 6d 61 63 2d 63 6f 6d 70 61 63 74 70 72 6f 22  /mac-compactpro"
66e0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
66f0: 20 22 63 73 68 22 2c 20 20 20 20 20 20 20 20 33   "csh",        3
6700: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
6710: 2d 63 73 68 22 20 20 20 20 20 20 20 20 20 20 20  -csh"           
6720: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6730: 63 73 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20  css",        3, 
6740: 22 74 65 78 74 2f 63 73 73 22 20 20 20 20 20 20  "text/css"      
6750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6760: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 63      },.    { "dc
6770: 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  r",        3, "a
6780: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 64 69 72  pplication/x-dir
6790: 65 63 74 6f 72 22 20 20 20 20 20 20 20 20 20 20  ector"          
67a0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 65 62 22    },.    { "deb"
67b0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
67c0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 64 65 62 69 61  lication/x-debia
67d0: 6e 2d 70 61 63 6b 61 67 65 22 20 20 20 20 20 20  n-package"      
67e0: 7d 2c 0a 20 20 20 20 7b 20 22 64 69 72 22 2c 20  },.    { "dir", 
67f0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
6800: 63 61 74 69 6f 6e 2f 78 2d 64 69 72 65 63 74 6f  cation/x-directo
6810: 72 22 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  r"            },
6820: 0a 20 20 20 20 7b 20 22 64 6c 22 2c 20 20 20 20  .    { "dl",    
6830: 20 20 20 20 20 32 2c 20 22 76 69 64 65 6f 2f 64       2, "video/d
6840: 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l"              
6850: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6860: 20 20 20 7b 20 22 64 6d 73 22 2c 20 20 20 20 20     { "dms",     
6870: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
6880: 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22  on/octet-stream"
6890: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
68a0: 20 7b 20 22 64 6f 63 22 2c 20 20 20 20 20 20 20   { "doc",       
68b0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
68c0: 2f 6d 73 77 6f 72 64 22 20 20 20 20 20 20 20 20  /msword"        
68d0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
68e0: 20 22 64 72 77 22 2c 20 20 20 20 20 20 20 20 33   "drw",        3
68f0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 64  , "application/d
6900: 72 61 66 74 69 6e 67 22 20 20 20 20 20 20 20 20  rafting"        
6910: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6920: 64 76 69 22 2c 20 20 20 20 20 20 20 20 33 2c 20  dvi",        3, 
6930: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 64  "application/x-d
6940: 76 69 22 20 20 20 20 20 20 20 20 20 20 20 20 20  vi"             
6950: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 77      },.    { "dw
6960: 67 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  g",        3, "a
6970: 70 70 6c 69 63 61 74 69 6f 6e 2f 61 63 61 64 22  pplication/acad"
6980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6990: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 78 66 22    },.    { "dxf"
69a0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
69b0: 6c 69 63 61 74 69 6f 6e 2f 64 78 66 22 20 20 20  lication/dxf"   
69c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69d0: 7d 2c 0a 20 20 20 20 7b 20 22 64 78 72 22 2c 20  },.    { "dxr", 
69e0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
69f0: 63 61 74 69 6f 6e 2f 78 2d 64 69 72 65 63 74 6f  cation/x-directo
6a00: 72 22 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  r"            },
6a10: 0a 20 20 20 20 7b 20 22 65 70 73 22 2c 20 20 20  .    { "eps",   
6a20: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
6a30: 74 69 6f 6e 2f 70 6f 73 74 73 63 72 69 70 74 22  tion/postscript"
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6a50: 20 20 20 7b 20 22 65 74 78 22 2c 20 20 20 20 20     { "etx",     
6a60: 20 20 20 33 2c 20 22 74 65 78 74 2f 78 2d 73 65     3, "text/x-se
6a70: 74 65 78 74 22 20 20 20 20 20 20 20 20 20 20 20  text"           
6a80: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6a90: 20 7b 20 22 65 78 65 22 2c 20 20 20 20 20 20 20   { "exe",       
6aa0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
6ab0: 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22 20 20  /octet-stream"  
6ac0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6ad0: 20 22 65 7a 22 2c 20 20 20 20 20 20 20 20 20 32   "ez",         2
6ae0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 61  , "application/a
6af0: 6e 64 72 65 77 2d 69 6e 73 65 74 22 20 20 20 20  ndrew-inset"    
6b00: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6b10: 66 22 2c 20 20 20 20 20 20 20 20 20 20 31 2c 20  f",          1, 
6b20: 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20  "text/plain"    
6b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b40: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66 39      },.    { "f9
6b50: 30 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74  0",        3, "t
6b60: 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20  ext/plain"      
6b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b80: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66 6c 69 22    },.    { "fli"
6b90: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64  ,        3, "vid
6ba0: 65 6f 2f 66 6c 69 22 20 20 20 20 20 20 20 20 20  eo/fli"         
6bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bc0: 7d 2c 0a 20 20 20 20 7b 20 22 66 6c 76 22 2c 20  },.    { "flv", 
6bd0: 20 20 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f         3, "video
6be0: 2f 66 6c 76 22 20 20 20 20 20 20 20 20 20 20 20  /flv"           
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6c00: 0a 20 20 20 20 7b 20 22 67 69 66 22 2c 20 20 20  .    { "gif",   
6c10: 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 67       3, "image/g
6c20: 69 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20  if"             
6c30: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6c40: 20 20 20 7b 20 22 67 6c 22 2c 20 20 20 20 20 20     { "gl",      
6c50: 20 20 20 32 2c 20 22 76 69 64 65 6f 2f 67 6c 22     2, "video/gl"
6c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c70: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6c80: 20 7b 20 22 67 74 61 72 22 2c 20 20 20 20 20 20   { "gtar",      
6c90: 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   4, "application
6ca0: 2f 78 2d 67 74 61 72 22 20 20 20 20 20 20 20 20  /x-gtar"        
6cb0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6cc0: 20 22 67 7a 22 2c 20 20 20 20 20 20 20 20 20 32   "gz",         2
6cd0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
6ce0: 2d 67 7a 69 70 22 20 20 20 20 20 20 20 20 20 20  -gzip"          
6cf0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6d00: 68 64 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20  hdf",        3, 
6d10: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 68  "application/x-h
6d20: 64 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20  df"             
6d30: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68 68      },.    { "hh
6d40: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 74  ",         2, "t
6d50: 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20  ext/plain"      
6d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d70: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68 71 78 22    },.    { "hqx"
6d80: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
6d90: 6c 69 63 61 74 69 6f 6e 2f 6d 61 63 2d 62 69 6e  lication/mac-bin
6da0: 68 65 78 34 30 22 20 20 20 20 20 20 20 20 20 20  hex40"          
6db0: 7d 2c 0a 20 20 20 20 7b 20 22 68 22 2c 20 20 20  },.    { "h",   
6dc0: 20 20 20 20 20 20 20 31 2c 20 22 74 65 78 74 2f         1, "text/
6dd0: 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20 20  plain"          
6de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6df0: 0a 20 20 20 20 7b 20 22 68 74 6d 22 2c 20 20 20  .    { "htm",   
6e00: 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 68 74       3, "text/ht
6e10: 6d 6c 3b 20 63 68 61 72 73 65 74 3d 75 74 66 2d  ml; charset=utf-
6e20: 38 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  8"          },. 
6e30: 20 20 20 7b 20 22 68 74 6d 6c 22 2c 20 20 20 20     { "html",    
6e40: 20 20 20 34 2c 20 22 74 65 78 74 2f 68 74 6d 6c     4, "text/html
6e50: 3b 20 63 68 61 72 73 65 74 3d 75 74 66 2d 38 22  ; charset=utf-8"
6e60: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6e70: 20 7b 20 22 69 63 65 22 2c 20 20 20 20 20 20 20   { "ice",       
6e80: 20 33 2c 20 22 78 2d 63 6f 6e 66 65 72 65 6e 63   3, "x-conferenc
6e90: 65 2f 78 2d 63 6f 6f 6c 74 61 6c 6b 22 20 20 20  e/x-cooltalk"   
6ea0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6eb0: 20 22 69 65 66 22 2c 20 20 20 20 20 20 20 20 33   "ief",        3
6ec0: 2c 20 22 69 6d 61 67 65 2f 69 65 66 22 20 20 20  , "image/ief"   
6ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ee0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6ef0: 69 67 65 73 22 2c 20 20 20 20 20 20 20 34 2c 20  iges",       4, 
6f00: 22 6d 6f 64 65 6c 2f 69 67 65 73 22 20 20 20 20  "model/iges"    
6f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f20: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 67      },.    { "ig
6f30: 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 6d  s",        3, "m
6f40: 6f 64 65 6c 2f 69 67 65 73 22 20 20 20 20 20 20  odel/iges"      
6f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f60: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 70 73 22    },.    { "ips"
6f70: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
6f80: 6c 69 63 61 74 69 6f 6e 2f 78 2d 69 70 73 63 72  lication/x-ipscr
6f90: 69 70 74 22 20 20 20 20 20 20 20 20 20 20 20 20  ipt"            
6fa0: 7d 2c 0a 20 20 20 20 7b 20 22 69 70 78 22 2c 20  },.    { "ipx", 
6fb0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
6fc0: 63 61 74 69 6f 6e 2f 78 2d 69 70 69 78 22 20 20  cation/x-ipix"  
6fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6fe0: 0a 20 20 20 20 7b 20 22 6a 61 64 22 2c 20 20 20  .    { "jad",   
6ff0: 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 76 6e       3, "text/vn
7000: 64 2e 73 75 6e 2e 6a 32 6d 65 2e 61 70 70 2d 64  d.sun.j2me.app-d
7010: 65 73 63 72 69 70 74 6f 72 22 20 20 7d 2c 0a 20  escriptor"  },. 
7020: 20 20 20 7b 20 22 6a 61 72 22 2c 20 20 20 20 20     { "jar",     
7030: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
7040: 6f 6e 2f 6a 61 76 61 2d 61 72 63 68 69 76 65 22  on/java-archive"
7050: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7060: 20 7b 20 22 6a 70 65 67 22 2c 20 20 20 20 20 20   { "jpeg",      
7070: 20 34 2c 20 22 69 6d 61 67 65 2f 6a 70 65 67 22   4, "image/jpeg"
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7090: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
70a0: 20 22 6a 70 65 22 2c 20 20 20 20 20 20 20 20 33   "jpe",        3
70b0: 2c 20 22 69 6d 61 67 65 2f 6a 70 65 67 22 20 20  , "image/jpeg"  
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70d0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
70e0: 6a 70 67 22 2c 20 20 20 20 20 20 20 20 33 2c 20  jpg",        3, 
70f0: 22 69 6d 61 67 65 2f 6a 70 65 67 22 20 20 20 20  "image/jpeg"    
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7110: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73      },.    { "js
7120: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61  ",         2, "a
7130: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6a 61 76  pplication/x-jav
7140: 61 73 63 72 69 70 74 22 20 20 20 20 20 20 20 20  ascript"        
7150: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6b 61 72 22    },.    { "kar"
7160: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64  ,        3, "aud
7170: 69 6f 2f 6d 69 64 69 22 20 20 20 20 20 20 20 20  io/midi"        
7180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7190: 7d 2c 0a 20 20 20 20 7b 20 22 6c 61 74 65 78 22  },.    { "latex"
71a0: 2c 20 20 20 20 20 20 35 2c 20 22 61 70 70 6c 69  ,      5, "appli
71b0: 63 61 74 69 6f 6e 2f 78 2d 6c 61 74 65 78 22 20  cation/x-latex" 
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
71d0: 0a 20 20 20 20 7b 20 22 6c 68 61 22 2c 20 20 20  .    { "lha",   
71e0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
71f0: 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61  tion/octet-strea
7200: 6d 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  m"          },. 
7210: 20 20 20 7b 20 22 6c 73 70 22 2c 20 20 20 20 20     { "lsp",     
7220: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
7230: 6f 6e 2f 78 2d 6c 69 73 70 22 20 20 20 20 20 20  on/x-lisp"      
7240: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7250: 20 7b 20 22 6c 7a 68 22 2c 20 20 20 20 20 20 20   { "lzh",       
7260: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
7270: 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22 20 20  /octet-stream"  
7280: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7290: 20 22 6d 22 2c 20 20 20 20 20 20 20 20 20 20 31   "m",          1
72a0: 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20  , "text/plain"  
72b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72c0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
72d0: 6d 33 75 22 2c 20 20 20 20 20 20 20 20 33 2c 20  m3u",        3, 
72e0: 22 61 75 64 69 6f 2f 78 2d 6d 70 65 67 75 72 6c  "audio/x-mpegurl
72f0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
7300: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 61      },.    { "ma
7310: 6e 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  n",        3, "a
7320: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72 6f  pplication/x-tro
7330: 66 66 2d 6d 61 6e 22 20 20 20 20 20 20 20 20 20  ff-man"         
7340: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 65 22 2c    },.    { "me",
7350: 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70 70           2, "app
7360: 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72 6f 66 66  lication/x-troff
7370: 2d 6d 65 22 20 20 20 20 20 20 20 20 20 20 20 20  -me"            
7380: 7d 2c 0a 20 20 20 20 7b 20 22 6d 65 73 68 22 2c  },.    { "mesh",
7390: 20 20 20 20 20 20 20 34 2c 20 22 6d 6f 64 65 6c         4, "model
73a0: 2f 6d 65 73 68 22 20 20 20 20 20 20 20 20 20 20  /mesh"          
73b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
73c0: 0a 20 20 20 20 7b 20 22 6d 69 64 22 2c 20 20 20  .    { "mid",   
73d0: 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 6d       3, "audio/m
73e0: 69 64 69 22 20 20 20 20 20 20 20 20 20 20 20 20  idi"            
73f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7400: 20 20 20 7b 20 22 6d 69 64 69 22 2c 20 20 20 20     { "midi",    
7410: 20 20 20 34 2c 20 22 61 75 64 69 6f 2f 6d 69 64     4, "audio/mid
7420: 69 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i"              
7430: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7440: 20 7b 20 22 6d 69 66 22 2c 20 20 20 20 20 20 20   { "mif",       
7450: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
7460: 2f 78 2d 6d 69 66 22 20 20 20 20 20 20 20 20 20  /x-mif"         
7470: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7480: 20 22 6d 69 6d 65 22 2c 20 20 20 20 20 20 20 34   "mime",       4
7490: 2c 20 22 77 77 77 2f 6d 69 6d 65 22 20 20 20 20  , "www/mime"    
74a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74b0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
74c0: 6d 6f 76 69 65 22 2c 20 20 20 20 20 20 35 2c 20  movie",      5, 
74d0: 22 76 69 64 65 6f 2f 78 2d 73 67 69 2d 6d 6f 76  "video/x-sgi-mov
74e0: 69 65 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ie"             
74f0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 6f      },.    { "mo
7500: 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76  v",        3, "v
7510: 69 64 65 6f 2f 71 75 69 63 6b 74 69 6d 65 22 20  ideo/quicktime" 
7520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7530: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 32 22    },.    { "mp2"
7540: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64  ,        3, "aud
7550: 69 6f 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20  io/mpeg"        
7560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7570: 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 32 22 2c 20  },.    { "mp2", 
7580: 20 20 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f         3, "video
7590: 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20 20 20  /mpeg"          
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
75b0: 0a 20 20 20 20 7b 20 22 6d 70 33 22 2c 20 20 20  .    { "mp3",   
75c0: 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 6d       3, "audio/m
75d0: 70 65 67 22 20 20 20 20 20 20 20 20 20 20 20 20  peg"            
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
75f0: 20 20 20 7b 20 22 6d 70 65 67 22 2c 20 20 20 20     { "mpeg",    
7600: 20 20 20 34 2c 20 22 76 69 64 65 6f 2f 6d 70 65     4, "video/mpe
7610: 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g"              
7620: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7630: 20 7b 20 22 6d 70 65 22 2c 20 20 20 20 20 20 20   { "mpe",       
7640: 20 33 2c 20 22 76 69 64 65 6f 2f 6d 70 65 67 22   3, "video/mpeg"
7650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7660: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7670: 20 22 6d 70 67 61 22 2c 20 20 20 20 20 20 20 34   "mpga",       4
7680: 2c 20 22 61 75 64 69 6f 2f 6d 70 65 67 22 20 20  , "audio/mpeg"  
7690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76a0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
76b0: 6d 70 67 22 2c 20 20 20 20 20 20 20 20 33 2c 20  mpg",        3, 
76c0: 22 76 69 64 65 6f 2f 6d 70 65 67 22 20 20 20 20  "video/mpeg"    
76d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76e0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 73      },.    { "ms
76f0: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61  ",         2, "a
7700: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72 6f  pplication/x-tro
7710: 66 66 2d 6d 73 22 20 20 20 20 20 20 20 20 20 20  ff-ms"          
7720: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 73 68 22    },.    { "msh"
7730: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 6d 6f 64  ,        3, "mod
7740: 65 6c 2f 6d 65 73 68 22 20 20 20 20 20 20 20 20  el/mesh"        
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7760: 7d 2c 0a 20 20 20 20 7b 20 22 6e 63 22 2c 20 20  },.    { "nc",  
7770: 20 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69         2, "appli
7780: 63 61 74 69 6f 6e 2f 78 2d 6e 65 74 63 64 66 22  cation/x-netcdf"
7790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
77a0: 0a 20 20 20 20 7b 20 22 6f 64 61 22 2c 20 20 20  .    { "oda",   
77b0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
77c0: 74 69 6f 6e 2f 6f 64 61 22 20 20 20 20 20 20 20  tion/oda"       
77d0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
77e0: 20 20 20 7b 20 22 6f 67 67 22 2c 20 20 20 20 20     { "ogg",     
77f0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
7800: 6f 6e 2f 6f 67 67 22 20 20 20 20 20 20 20 20 20  on/ogg"         
7810: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7820: 20 7b 20 22 6f 67 6d 22 2c 20 20 20 20 20 20 20   { "ogm",       
7830: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
7840: 2f 6f 67 67 22 20 20 20 20 20 20 20 20 20 20 20  /ogg"           
7850: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7860: 20 22 70 62 6d 22 2c 20 20 20 20 20 20 20 20 33   "pbm",        3
7870: 2c 20 22 69 6d 61 67 65 2f 78 2d 70 6f 72 74 61  , "image/x-porta
7880: 62 6c 65 2d 62 69 74 6d 61 70 22 20 20 20 20 20  ble-bitmap"     
7890: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
78a0: 70 64 62 22 2c 20 20 20 20 20 20 20 20 33 2c 20  pdb",        3, 
78b0: 22 63 68 65 6d 69 63 61 6c 2f 78 2d 70 64 62 22  "chemical/x-pdb"
78c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78d0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 64      },.    { "pd
78e0: 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  f",        3, "a
78f0: 70 70 6c 69 63 61 74 69 6f 6e 2f 70 64 66 22 20  pplication/pdf" 
7900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7910: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 67 6d 22    },.    { "pgm"
7920: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61  ,        3, "ima
7930: 67 65 2f 78 2d 70 6f 72 74 61 62 6c 65 2d 67 72  ge/x-portable-gr
7940: 61 79 6d 61 70 22 20 20 20 20 20 20 20 20 20 20  aymap"          
7950: 7d 2c 0a 20 20 20 20 7b 20 22 70 67 6e 22 2c 20  },.    { "pgn", 
7960: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
7970: 63 61 74 69 6f 6e 2f 78 2d 63 68 65 73 73 2d 70  cation/x-chess-p
7980: 67 6e 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c  gn"           },
7990: 0a 20 20 20 20 7b 20 22 70 67 70 22 2c 20 20 20  .    { "pgp",   
79a0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
79b0: 74 69 6f 6e 2f 70 67 70 22 20 20 20 20 20 20 20  tion/pgp"       
79c0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
79d0: 20 20 20 7b 20 22 70 6c 22 2c 20 20 20 20 20 20     { "pl",      
79e0: 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69     2, "applicati
79f0: 6f 6e 2f 78 2d 70 65 72 6c 22 20 20 20 20 20 20  on/x-perl"      
7a00: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7a10: 20 7b 20 22 70 6d 22 2c 20 20 20 20 20 20 20 20   { "pm",        
7a20: 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   2, "application
7a30: 2f 78 2d 70 65 72 6c 22 20 20 20 20 20 20 20 20  /x-perl"        
7a40: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7a50: 20 22 70 6e 67 22 2c 20 20 20 20 20 20 20 20 33   "png",        3
7a60: 2c 20 22 69 6d 61 67 65 2f 70 6e 67 22 20 20 20  , "image/png"   
7a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a80: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7a90: 70 6e 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20  pnm",        3, 
7aa0: 22 69 6d 61 67 65 2f 78 2d 70 6f 72 74 61 62 6c  "image/x-portabl
7ab0: 65 2d 61 6e 79 6d 61 70 22 20 20 20 20 20 20 20  e-anymap"       
7ac0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 6f      },.    { "po
7ad0: 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  t",        3, "a
7ae0: 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 70 6f 77  pplication/mspow
7af0: 65 72 70 6f 69 6e 74 22 20 20 20 20 20 20 20 20  erpoint"        
7b00: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 70 6d 22    },.    { "ppm"
7b10: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61  ,        3, "ima
7b20: 67 65 2f 78 2d 70 6f 72 74 61 62 6c 65 2d 70 69  ge/x-portable-pi
7b30: 78 6d 61 70 22 20 20 20 20 20 20 20 20 20 20 20  xmap"           
7b40: 7d 2c 0a 20 20 20 20 7b 20 22 70 70 73 22 2c 20  },.    { "pps", 
7b50: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
7b60: 63 61 74 69 6f 6e 2f 6d 73 70 6f 77 65 72 70 6f  cation/mspowerpo
7b70: 69 6e 74 22 20 20 20 20 20 20 20 20 20 20 7d 2c  int"          },
7b80: 0a 20 20 20 20 7b 20 22 70 70 74 22 2c 20 20 20  .    { "ppt",   
7b90: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
7ba0: 74 69 6f 6e 2f 6d 73 70 6f 77 65 72 70 6f 69 6e  tion/mspowerpoin
7bb0: 74 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  t"          },. 
7bc0: 20 20 20 7b 20 22 70 70 7a 22 2c 20 20 20 20 20     { "ppz",     
7bd0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
7be0: 6f 6e 2f 6d 73 70 6f 77 65 72 70 6f 69 6e 74 22  on/mspowerpoint"
7bf0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7c00: 20 7b 20 22 70 72 65 22 2c 20 20 20 20 20 20 20   { "pre",       
7c10: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
7c20: 2f 78 2d 66 72 65 65 6c 61 6e 63 65 22 20 20 20  /x-freelance"   
7c30: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7c40: 20 22 70 72 74 22 2c 20 20 20 20 20 20 20 20 33   "prt",        3
7c50: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70  , "application/p
7c60: 72 6f 5f 65 6e 67 22 20 20 20 20 20 20 20 20 20  ro_eng"         
7c70: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7c80: 70 73 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  ps",         2, 
7c90: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 6f 73  "application/pos
7ca0: 74 73 63 72 69 70 74 22 20 20 20 20 20 20 20 20  tscript"        
7cb0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 71 74      },.    { "qt
7cc0: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 76  ",         2, "v
7cd0: 69 64 65 6f 2f 71 75 69 63 6b 74 69 6d 65 22 20  ideo/quicktime" 
7ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cf0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61 22 2c    },.    { "ra",
7d00: 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 75 64           2, "aud
7d10: 69 6f 2f 78 2d 72 65 61 6c 61 75 64 69 6f 22 20  io/x-realaudio" 
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d30: 7d 2c 0a 20 20 20 20 7b 20 22 72 61 6d 22 2c 20  },.    { "ram", 
7d40: 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f         3, "audio
7d50: 2f 78 2d 70 6e 2d 72 65 61 6c 61 75 64 69 6f 22  /x-pn-realaudio"
7d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7d70: 0a 20 20 20 20 7b 20 22 72 61 72 22 2c 20 20 20  .    { "rar",   
7d80: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
7d90: 74 69 6f 6e 2f 78 2d 72 61 72 2d 63 6f 6d 70 72  tion/x-rar-compr
7da0: 65 73 73 65 64 22 20 20 20 20 20 20 7d 2c 0a 20  essed"      },. 
7db0: 20 20 20 7b 20 22 72 61 73 22 2c 20 20 20 20 20     { "ras",     
7dc0: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 63 6d 75     3, "image/cmu
7dd0: 2d 72 61 73 74 65 72 22 20 20 20 20 20 20 20 20  -raster"        
7de0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7df0: 20 7b 20 22 72 61 73 22 2c 20 20 20 20 20 20 20   { "ras",       
7e00: 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 63 6d 75   3, "image/x-cmu
7e10: 2d 72 61 73 74 65 72 22 20 20 20 20 20 20 20 20  -raster"        
7e20: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7e30: 20 22 72 67 62 22 2c 20 20 20 20 20 20 20 20 33   "rgb",        3
7e40: 2c 20 22 69 6d 61 67 65 2f 78 2d 72 67 62 22 20  , "image/x-rgb" 
7e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e60: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7e70: 72 6d 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  rm",         2, 
7e80: 22 61 75 64 69 6f 2f 78 2d 70 6e 2d 72 65 61 6c  "audio/x-pn-real
7e90: 61 75 64 69 6f 22 20 20 20 20 20 20 20 20 20 20  audio"          
7ea0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 6f      },.    { "ro
7eb0: 66 66 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61  ff",       4, "a
7ec0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72 6f  pplication/x-tro
7ed0: 66 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ff"             
7ee0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 70 6d 22    },.    { "rpm"
7ef0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64  ,        3, "aud
7f00: 69 6f 2f 78 2d 70 6e 2d 72 65 61 6c 61 75 64 69  io/x-pn-realaudi
7f10: 6f 2d 70 6c 75 67 69 6e 22 20 20 20 20 20 20 20  o-plugin"       
7f20: 7d 2c 0a 20 20 20 20 7b 20 22 72 74 66 22 2c 20  },.    { "rtf", 
7f30: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
7f40: 63 61 74 69 6f 6e 2f 72 74 66 22 20 20 20 20 20  cation/rtf"     
7f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7f60: 0a 20 20 20 20 7b 20 22 72 74 66 22 2c 20 20 20  .    { "rtf",   
7f70: 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 72 74       3, "text/rt
7f80: 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f"              
7f90: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7fa0: 20 20 20 7b 20 22 72 74 78 22 2c 20 20 20 20 20     { "rtx",     
7fb0: 20 20 20 33 2c 20 22 74 65 78 74 2f 72 69 63 68     3, "text/rich
7fc0: 74 65 78 74 22 20 20 20 20 20 20 20 20 20 20 20  text"           
7fd0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7fe0: 20 7b 20 22 73 63 6d 22 2c 20 20 20 20 20 20 20   { "scm",       
7ff0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
8000: 2f 78 2d 6c 6f 74 75 73 73 63 72 65 65 6e 63 61  /x-lotusscreenca
8010: 6d 22 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  m"      },.    {
8020: 20 22 73 65 74 22 2c 20 20 20 20 20 20 20 20 33   "set",        3
8030: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 73  , "application/s
8040: 65 74 22 20 20 20 20 20 20 20 20 20 20 20 20 20  et"             
8050: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8060: 73 67 6d 6c 22 2c 20 20 20 20 20 20 20 34 2c 20  sgml",       4, 
8070: 22 74 65 78 74 2f 73 67 6d 6c 22 20 20 20 20 20  "text/sgml"     
8080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8090: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 67      },.    { "sg
80a0: 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74  m",        3, "t
80b0: 65 78 74 2f 73 67 6d 6c 22 20 20 20 20 20 20 20  ext/sgml"       
80c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80d0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 68 22 2c    },.    { "sh",
80e0: 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70 70           2, "app
80f0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 68 22 20 20  lication/x-sh"  
8100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8110: 7d 2c 0a 20 20 20 20 7b 20 22 73 68 61 72 22 2c  },.    { "shar",
8120: 20 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69         4, "appli
8130: 63 61 74 69 6f 6e 2f 78 2d 73 68 61 72 22 20 20  cation/x-shar"  
8140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8150: 0a 20 20 20 20 7b 20 22 73 69 6c 6f 22 2c 20 20  .    { "silo",  
8160: 20 20 20 20 20 34 2c 20 22 6d 6f 64 65 6c 2f 6d       4, "model/m
8170: 65 73 68 22 20 20 20 20 20 20 20 20 20 20 20 20  esh"            
8180: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8190: 20 20 20 7b 20 22 73 69 74 22 2c 20 20 20 20 20     { "sit",     
81a0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
81b0: 6f 6e 2f 78 2d 73 74 75 66 66 69 74 22 20 20 20  on/x-stuffit"   
81c0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
81d0: 20 7b 20 22 73 6b 64 22 2c 20 20 20 20 20 20 20   { "skd",       
81e0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
81f0: 2f 78 2d 6b 6f 61 6e 22 20 20 20 20 20 20 20 20  /x-koan"        
8200: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8210: 20 22 73 6b 6d 22 2c 20 20 20 20 20 20 20 20 33   "skm",        3
8220: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
8230: 2d 6b 6f 61 6e 22 20 20 20 20 20 20 20 20 20 20  -koan"          
8240: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8250: 73 6b 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20  skp",        3, 
8260: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6b  "application/x-k
8270: 6f 61 6e 22 20 20 20 20 20 20 20 20 20 20 20 20  oan"            
8280: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6b      },.    { "sk
8290: 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  t",        3, "a
82a0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6b 6f 61  pplication/x-koa
82b0: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
82c0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 69 22    },.    { "smi"
82d0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
82e0: 6c 69 63 61 74 69 6f 6e 2f 73 6d 69 6c 22 20 20  lication/smil"  
82f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8300: 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 69 6c 22 2c  },.    { "smil",
8310: 20 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69         4, "appli
8320: 63 61 74 69 6f 6e 2f 73 6d 69 6c 22 20 20 20 20  cation/smil"    
8330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8340: 0a 20 20 20 20 7b 20 22 73 6e 64 22 2c 20 20 20  .    { "snd",   
8350: 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 62       3, "audio/b
8360: 61 73 69 63 22 20 20 20 20 20 20 20 20 20 20 20  asic"           
8370: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8380: 20 20 20 7b 20 22 73 6f 6c 22 2c 20 20 20 20 20     { "sol",     
8390: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
83a0: 6f 6e 2f 73 6f 6c 69 64 73 22 20 20 20 20 20 20  on/solids"      
83b0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
83c0: 20 7b 20 22 73 70 6c 22 2c 20 20 20 20 20 20 20   { "spl",       
83d0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
83e0: 2f 78 2d 66 75 74 75 72 65 73 70 6c 61 73 68 22  /x-futuresplash"
83f0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8400: 20 22 73 72 63 22 2c 20 20 20 20 20 20 20 20 33   "src",        3
8410: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
8420: 2d 77 61 69 73 2d 73 6f 75 72 63 65 22 20 20 20  -wais-source"   
8430: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8440: 73 74 65 70 22 2c 20 20 20 20 20 20 20 34 2c 20  step",       4, 
8450: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 53 54 45  "application/STE
8460: 50 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  P"              
8470: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 74      },.    { "st
8480: 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  l",        3, "a
8490: 70 70 6c 69 63 61 74 69 6f 6e 2f 53 4c 41 22 20  pplication/SLA" 
84a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84b0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 74 70 22    },.    { "stp"
84c0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
84d0: 6c 69 63 61 74 69 6f 6e 2f 53 54 45 50 22 20 20  lication/STEP"  
84e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84f0: 7d 2c 0a 20 20 20 20 7b 20 22 73 76 34 63 70 69  },.    { "sv4cpi
8500: 6f 22 2c 20 20 20 20 37 2c 20 22 61 70 70 6c 69  o",    7, "appli
8510: 63 61 74 69 6f 6e 2f 78 2d 73 76 34 63 70 69 6f  cation/x-sv4cpio
8520: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  "             },
8530: 0a 20 20 20 20 7b 20 22 73 76 34 63 72 63 22 2c  .    { "sv4crc",
8540: 20 20 20 20 20 36 2c 20 22 61 70 70 6c 69 63 61       6, "applica
8550: 74 69 6f 6e 2f 78 2d 73 76 34 63 72 63 22 20 20  tion/x-sv4crc"  
8560: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8570: 20 20 20 7b 20 22 73 77 66 22 2c 20 20 20 20 20     { "swf",     
8580: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
8590: 6f 6e 2f 78 2d 73 68 6f 63 6b 77 61 76 65 2d 66  on/x-shockwave-f
85a0: 6c 61 73 68 22 20 20 20 20 20 7d 2c 0a 20 20 20  lash"     },.   
85b0: 20 7b 20 22 74 22 2c 20 20 20 20 20 20 20 20 20   { "t",         
85c0: 20 31 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   1, "application
85d0: 2f 78 2d 74 72 6f 66 66 22 20 20 20 20 20 20 20  /x-troff"       
85e0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
85f0: 20 22 74 61 72 22 2c 20 20 20 20 20 20 20 20 33   "tar",        3
8600: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
8610: 2d 74 61 72 22 20 20 20 20 20 20 20 20 20 20 20  -tar"           
8620: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8630: 74 63 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20  tcl",        3, 
8640: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74  "application/x-t
8650: 63 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20  cl"             
8660: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 65      },.    { "te
8670: 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  x",        3, "a
8680: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 65 78  pplication/x-tex
8690: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
86a0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 65 78 69    },.    { "texi
86b0: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70 70  ",       4, "app
86c0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 65 78 69 6e  lication/x-texin
86d0: 66 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20  fo"             
86e0: 7d 2c 0a 20 20 20 20 7b 20 22 74 65 78 69 6e 66  },.    { "texinf
86f0: 6f 22 2c 20 20 20 20 37 2c 20 22 61 70 70 6c 69  o",    7, "appli
8700: 63 61 74 69 6f 6e 2f 78 2d 74 65 78 69 6e 66 6f  cation/x-texinfo
8710: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  "             },
8720: 0a 20 20 20 20 7b 20 22 74 67 7a 22 2c 20 20 20  .    { "tgz",   
8730: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
8740: 74 69 6f 6e 2f 78 2d 74 61 72 2d 67 7a 22 20 20  tion/x-tar-gz"  
8750: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8760: 20 20 20 7b 20 22 74 69 66 66 22 2c 20 20 20 20     { "tiff",    
8770: 20 20 20 34 2c 20 22 69 6d 61 67 65 2f 74 69 66     4, "image/tif
8780: 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f"              
8790: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
87a0: 20 7b 20 22 74 69 66 22 2c 20 20 20 20 20 20 20   { "tif",       
87b0: 20 33 2c 20 22 69 6d 61 67 65 2f 74 69 66 66 22   3, "image/tiff"
87c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87d0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
87e0: 20 22 74 72 22 2c 20 20 20 20 20 20 20 20 20 32   "tr",         2
87f0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
8800: 2d 74 72 6f 66 66 22 20 20 20 20 20 20 20 20 20  -troff"         
8810: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8820: 74 73 69 22 2c 20 20 20 20 20 20 20 20 33 2c 20  tsi",        3, 
8830: 22 61 75 64 69 6f 2f 54 53 50 2d 61 75 64 69 6f  "audio/TSP-audio
8840: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8850: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 73      },.    { "ts
8860: 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  p",        3, "a
8870: 70 70 6c 69 63 61 74 69 6f 6e 2f 64 73 70 74 79  pplication/dspty
8880: 70 65 22 20 20 20 20 20 20 20 20 20 20 20 20 20  pe"             
8890: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 73 76 22    },.    { "tsv"
88a0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65 78  ,        3, "tex
88b0: 74 2f 74 61 62 2d 73 65 70 61 72 61 74 65 64 2d  t/tab-separated-
88c0: 76 61 6c 75 65 73 22 20 20 20 20 20 20 20 20 20  values"         
88d0: 7d 2c 0a 20 20 20 20 7b 20 22 74 78 74 22 2c 20  },.    { "txt", 
88e0: 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f         3, "text/
88f0: 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20 20  plain"          
8900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8910: 0a 20 20 20 20 7b 20 22 75 6e 76 22 2c 20 20 20  .    { "unv",   
8920: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
8930: 74 69 6f 6e 2f 69 2d 64 65 61 73 22 20 20 20 20  tion/i-deas"    
8940: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8950: 20 20 20 7b 20 22 75 73 74 61 72 22 2c 20 20 20     { "ustar",   
8960: 20 20 20 35 2c 20 22 61 70 70 6c 69 63 61 74 69     5, "applicati
8970: 6f 6e 2f 78 2d 75 73 74 61 72 22 20 20 20 20 20  on/x-ustar"     
8980: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8990: 20 7b 20 22 76 63 64 22 2c 20 20 20 20 20 20 20   { "vcd",       
89a0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
89b0: 2f 78 2d 63 64 6c 69 6e 6b 22 20 20 20 20 20 20  /x-cdlink"      
89c0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
89d0: 20 22 76 64 61 22 2c 20 20 20 20 20 20 20 20 33   "vda",        3
89e0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76  , "application/v
89f0: 64 61 22 20 20 20 20 20 20 20 20 20 20 20 20 20  da"             
8a00: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8a10: 76 69 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20  viv",        3, 
8a20: 22 76 69 64 65 6f 2f 76 6e 64 2e 76 69 76 6f 22  "video/vnd.vivo"
8a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a40: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 76 69      },.    { "vi
8a50: 76 6f 22 2c 20 20 20 20 20 20 20 34 2c 20 22 76  vo",       4, "v
8a60: 69 64 65 6f 2f 76 6e 64 2e 76 69 76 6f 22 20 20  ideo/vnd.vivo"  
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a80: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 76 72 6d 6c    },.    { "vrml
8a90: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 6d 6f 64  ",       4, "mod
8aa0: 65 6c 2f 76 72 6d 6c 22 20 20 20 20 20 20 20 20  el/vrml"        
8ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ac0: 7d 2c 0a 20 20 20 20 7b 20 22 76 73 69 78 22 2c  },.    { "vsix",
8ad0: 20 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69         4, "appli
8ae0: 63 61 74 69 6f 6e 2f 76 73 69 78 22 20 20 20 20  cation/vsix"    
8af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8b00: 0a 20 20 20 20 7b 20 22 77 61 76 22 2c 20 20 20  .    { "wav",   
8b10: 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 78       3, "audio/x
8b20: 2d 77 61 76 22 20 20 20 20 20 20 20 20 20 20 20  -wav"           
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8b40: 20 20 20 7b 20 22 77 61 78 22 2c 20 20 20 20 20     { "wax",     
8b50: 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 6d     3, "audio/x-m
8b60: 73 2d 77 61 78 22 20 20 20 20 20 20 20 20 20 20  s-wax"          
8b70: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8b80: 20 7b 20 22 77 69 6b 69 22 2c 20 20 20 20 20 20   { "wiki",      
8b90: 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   4, "application
8ba0: 2f 78 2d 66 6f 73 73 69 6c 2d 77 69 6b 69 22 20  /x-fossil-wiki" 
8bb0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8bc0: 20 22 77 6d 61 22 2c 20 20 20 20 20 20 20 20 33   "wma",        3
8bd0: 2c 20 22 61 75 64 69 6f 2f 78 2d 6d 73 2d 77 6d  , "audio/x-ms-wm
8be0: 61 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a"              
8bf0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8c00: 77 6d 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20  wmv",        3, 
8c10: 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 77 6d 76 22  "video/x-ms-wmv"
8c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c30: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 6d      },.    { "wm
8c40: 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76  x",        3, "v
8c50: 69 64 65 6f 2f 78 2d 6d 73 2d 77 6d 78 22 20 20  ideo/x-ms-wmx"  
8c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c70: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 72 6c 22    },.    { "wrl"
8c80: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 6d 6f 64  ,        3, "mod
8c90: 65 6c 2f 76 72 6d 6c 22 20 20 20 20 20 20 20 20  el/vrml"        
8ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cb0: 7d 2c 0a 20 20 20 20 7b 20 22 77 76 78 22 2c 20  },.    { "wvx", 
8cc0: 20 20 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f         3, "video
8cd0: 2f 78 2d 6d 73 2d 77 76 78 22 20 20 20 20 20 20  /x-ms-wvx"      
8ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8cf0: 0a 20 20 20 20 7b 20 22 78 62 6d 22 2c 20 20 20  .    { "xbm",   
8d00: 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78       3, "image/x
8d10: 2d 78 62 69 74 6d 61 70 22 20 20 20 20 20 20 20  -xbitmap"       
8d20: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8d30: 20 20 20 7b 20 22 78 6c 63 22 2c 20 20 20 20 20     { "xlc",     
8d40: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
8d50: 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22  on/vnd.ms-excel"
8d60: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8d70: 20 7b 20 22 78 6c 6c 22 2c 20 20 20 20 20 20 20   { "xll",       
8d80: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
8d90: 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20 20  /vnd.ms-excel"  
8da0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8db0: 20 22 78 6c 6d 22 2c 20 20 20 20 20 20 20 20 33   "xlm",        3
8dc0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76  , "application/v
8dd0: 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20 20 20 20  nd.ms-excel"    
8de0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8df0: 78 6c 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20  xls",        3, 
8e00: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76 6e 64  "application/vnd
8e10: 2e 6d 73 2d 65 78 63 65 6c 22 20 20 20 20 20 20  .ms-excel"      
8e20: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 6c      },.    { "xl
8e30: 77 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  w",        3, "a
8e40: 70 70 6c 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d  pplication/vnd.m
8e50: 73 2d 65 78 63 65 6c 22 20 20 20 20 20 20 20 20  s-excel"        
8e60: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 6d 6c 22    },.    { "xml"
8e70: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65 78  ,        3, "tex
8e80: 74 2f 78 6d 6c 22 20 20 20 20 20 20 20 20 20 20  t/xml"          
8e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ea0: 7d 2c 0a 20 20 20 20 7b 20 22 78 70 6d 22 2c 20  },.    { "xpm", 
8eb0: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
8ec0: 2f 78 2d 78 70 69 78 6d 61 70 22 20 20 20 20 20  /x-xpixmap"     
8ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8ee0: 0a 20 20 20 20 7b 20 22 78 77 64 22 2c 20 20 20  .    { "xwd",   
8ef0: 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78       3, "image/x
8f00: 2d 78 77 69 6e 64 6f 77 64 75 6d 70 22 20 20 20  -xwindowdump"   
8f10: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8f20: 20 20 20 7b 20 22 78 79 7a 22 2c 20 20 20 20 20     { "xyz",     
8f30: 20 20 20 33 2c 20 22 63 68 65 6d 69 63 61 6c 2f     3, "chemical/
8f40: 78 2d 70 64 62 22 20 20 20 20 20 20 20 20 20 20  x-pdb"          
8f50: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8f60: 20 7b 20 22 7a 69 70 22 2c 20 20 20 20 20 20 20   { "zip",       
8f70: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
8f80: 2f 7a 69 70 22 20 20 20 20 20 20 20 20 20 20 20  /zip"           
8f90: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a          },.  };.
8fa0: 0a 20 20 66 6f 72 28 69 3d 6e 4e 61 6d 65 2d 31  .  for(i=nName-1
8fb0: 3b 20 69 3e 30 20 26 26 20 7a 4e 61 6d 65 5b 69  ; i>0 && zName[i
8fc0: 5d 21 3d 27 2e 27 3b 20 69 2d 2d 29 7b 7d 0a 20  ]!='.'; i--){}. 
8fd0: 20 7a 20 3d 20 26 7a 4e 61 6d 65 5b 69 2b 31 5d   z = &zName[i+1]
8fe0: 3b 0a 20 20 6c 65 6e 20 3d 20 6e 4e 61 6d 65 20  ;.  len = nName 
8ff0: 2d 20 69 3b 0a 20 20 69 66 28 20 6c 65 6e 3c 28  - i;.  if( len<(
9000: 69 6e 74 29 73 69 7a 65 6f 66 28 7a 53 75 66 66  int)sizeof(zSuff
9010: 69 78 29 2d 31 20 29 7b 0a 20 20 20 20 73 74 72  ix)-1 ){.    str
9020: 63 70 79 28 7a 53 75 66 66 69 78 2c 20 7a 29 3b  cpy(zSuffix, z);
9030: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 53  .    for(i=0; zS
9040: 75 66 66 69 78 5b 69 5d 3b 20 69 2b 2b 29 20 7a  uffix[i]; i++) z
9050: 53 75 66 66 69 78 5b 69 5d 20 3d 20 74 6f 6c 6f  Suffix[i] = tolo
9060: 77 65 72 28 7a 53 75 66 66 69 78 5b 69 5d 29 3b  wer(zSuffix[i]);
9070: 0a 20 20 20 20 66 69 72 73 74 20 3d 20 30 3b 0a  .    first = 0;.
9080: 20 20 20 20 6c 61 73 74 20 3d 20 73 69 7a 65 6f      last = sizeo
9090: 66 28 61 4d 69 6d 65 29 2f 73 69 7a 65 6f 66 28  f(aMime)/sizeof(
90a0: 61 4d 69 6d 65 5b 30 5d 29 3b 0a 20 20 20 20 77  aMime[0]);.    w
90b0: 68 69 6c 65 28 20 66 69 72 73 74 3c 3d 6c 61 73  hile( first<=las
90c0: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63  t ){.      int c
90d0: 3b 0a 20 20 20 20 20 20 69 20 3d 20 28 66 69 72  ;.      i = (fir
90e0: 73 74 2b 6c 61 73 74 29 2f 32 3b 0a 20 20 20 20  st+last)/2;.    
90f0: 20 20 63 20 3d 20 73 74 72 63 6d 70 28 7a 53 75    c = strcmp(zSu
9100: 66 66 69 78 2c 20 61 4d 69 6d 65 5b 69 5d 2e 7a  ffix, aMime[i].z
9110: 53 75 66 66 69 78 29 3b 0a 20 20 20 20 20 20 69  Suffix);.      i
9120: 66 28 20 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( c==0 ) return
9130: 20 61 4d 69 6d 65 5b 69 5d 2e 7a 4d 69 6d 65 74   aMime[i].zMimet
9140: 79 70 65 3b 0a 20 20 20 20 20 20 69 66 28 20 63  ype;.      if( c
9150: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61  <0 ){.        la
9160: 73 74 20 3d 20 69 2d 31 3b 0a 20 20 20 20 20 20  st = i-1;.      
9170: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
9180: 69 72 73 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20  irst = i+1;.    
9190: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
91a0: 72 65 74 75 72 6e 20 22 61 70 70 6c 69 63 61 74  return "applicat
91b0: 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d  ion/octet-stream
91c0: 22 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ";.}../*.** The 
91d0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
91e0: 63 6f 6e 74 61 69 6e 73 20 31 20 66 6f 72 20 61  contains 1 for a
91f0: 6c 6c 20 63 68 61 72 61 63 74 65 72 73 20 74 68  ll characters th
9200: 61 74 20 61 72 65 20 70 65 72 6d 69 74 74 65 64  at are permitted
9210: 20 69 6e 0a 2a 2a 20 74 68 65 20 70 61 72 74 20   in.** the part 
9220: 6f 66 20 74 68 65 20 55 52 4c 20 62 65 66 6f 72  of the URL befor
9230: 65 20 74 68 65 20 71 75 65 72 79 20 70 61 72 61  e the query para
9240: 6d 65 74 65 72 73 20 61 6e 64 20 66 72 61 67 6d  meters and fragm
9250: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f 77  ent..**.** Allow
9260: 65 64 20 63 68 61 72 61 63 74 65 72 73 3a 20 20  ed characters:  
9270: 30 2d 39 61 2d 7a 41 2d 5a 2c 2d 2e 2f 3a 5f 7e  0-9a-zA-Z,-./:_~
9280: 0a 2a 2a 0a 2a 2a 20 44 69 73 61 6c 6c 6f 77 65  .**.** Disallowe
9290: 64 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 63  d characters inc
92a0: 6c 75 64 65 3a 20 20 21 22 23 24 25 26 27 28 29  lude:  !"#$%&'()
92b0: 2a 2b 3b 3c 3d 3e 3f 5b 5c 5d 5e 7b 7c 7d 0a 2a  *+;<=>?[\]^{|}.*
92c0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
92d0: 68 61 72 20 61 6c 6c 6f 77 65 64 49 6e 4e 61 6d  har allowedInNam
92e0: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 2f 2a  e[] = {.      /*
92f0: 20 20 78 30 20 20 78 31 20 20 78 32 20 20 78 33    x0  x1  x2  x3
9300: 20 20 78 34 20 20 78 35 20 20 78 36 20 20 78 37    x4  x5  x6  x7
9310: 20 20 78 38 20 20 78 39 20 20 78 61 20 20 78 62    x8  x9  xa  xb
9320: 20 20 78 63 20 20 78 64 20 20 78 65 20 20 78 66    xc  xd  xe  xf
9330: 20 2a 2f 0a 2f 2a 20 30 78 20 2a 2f 20 20 20 30   */./* 0x */   0
9340: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9350: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9360: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9370: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a  ,  0,  0,  0,./*
9380: 20 31 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20   1x */   0,  0, 
9390: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
93a0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
93b0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
93c0: 20 30 2c 20 20 30 2c 0a 2f 2a 20 32 78 20 2a 2f   0,  0,./* 2x */
93d0: 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30     0,  0,  0,  0
93e0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
93f0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9400: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
9410: 2c 0a 2f 2a 20 33 78 20 2a 2f 20 20 20 31 2c 20  ,./* 3x */   1, 
9420: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
9430: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
9440: 20 31 2c 20 20 31 2c 20 20 30 2c 20 20 30 2c 20   1,  1,  0,  0, 
9450: 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 34   0,  0,  0,./* 4
9460: 78 20 2a 2f 20 20 20 30 2c 20 20 31 2c 20 20 31  x */   0,  1,  1
9470: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
9480: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
9490: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
94a0: 2c 20 20 31 2c 0a 2f 2a 20 35 78 20 2a 2f 20 20  ,  1,./* 5x */  
94b0: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
94c0: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
94d0: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 30 2c 20   1,  1,  1,  0, 
94e0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 31 2c 0a   0,  0,  0,  1,.
94f0: 2f 2a 20 36 78 20 2a 2f 20 20 20 30 2c 20 20 31  /* 6x */   0,  1
9500: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
9510: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
9520: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
9530: 2c 20 20 31 2c 20 20 31 2c 0a 2f 2a 20 37 78 20  ,  1,  1,./* 7x 
9540: 2a 2f 20 20 20 31 2c 20 20 31 2c 20 20 31 2c 20  */   1,  1,  1, 
9550: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
9560: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
9570: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 31 2c 20   0,  0,  0,  1, 
9580: 20 30 2c 0a 2f 2a 20 38 78 20 2a 2f 20 20 20 30   0,./* 8x */   0
9590: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
95a0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
95b0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
95c0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a  ,  0,  0,  0,./*
95d0: 20 39 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20   9x */   0,  0, 
95e0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
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 0a 2f 2a 20 41 78 20 2a 2f   0,  0,./* Ax */
9620: 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30     0,  0,  0,  0
9630: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  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 0a 2f 2a 20 42 78 20 2a 2f 20 20 20 30 2c 20  ,./* Bx */   0, 
9670: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9680: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  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 0a 2f 2a 20 43   0,  0,  0,./* C
96b0: 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30  x */   0,  0,  0
96c0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
96d0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
96e0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
96f0: 2c 20 20 30 2c 0a 2f 2a 20 44 78 20 2a 2f 20 20  ,  0,./* Dx */  
9700: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9710: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9720: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9730: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a   0,  0,  0,  0,.
9740: 2f 2a 20 45 78 20 2a 2f 20 20 20 30 2c 20 20 30  /* Ex */   0,  0
9750: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9760: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9770: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9780: 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 46 78 20  ,  0,  0,./* Fx 
9790: 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20  */   0,  0,  0, 
97a0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
97b0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
97c0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
97d0: 20 30 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65   0,.};../*.** Re
97e0: 6d 6f 76 65 20 61 6c 6c 20 64 69 73 61 6c 6c 6f  move all disallo
97f0: 77 65 64 20 63 68 61 72 61 63 74 65 72 73 20 69  wed characters i
9800: 6e 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  n the input stri
9810: 6e 67 20 7a 5b 5d 2e 20 20 43 6f 6e 76 65 72 74  ng z[].  Convert
9820: 20 61 6e 79 0a 2a 2a 20 64 69 73 61 6c 6c 6f 77   any.** disallow
9830: 65 64 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  ed characters in
9840: 74 6f 20 22 5f 22 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  to "_"..**.** No
9850: 74 20 74 68 61 74 20 74 68 65 20 74 68 72 65 65  t that the three
9860: 20 63 68 61 72 61 63 74 65 72 20 73 65 71 75 65   character seque
9870: 6e 63 65 20 22 25 58 58 22 20 77 68 65 72 65 20  nce "%XX" where 
9880: 58 20 69 73 20 61 6e 79 20 62 79 74 65 20 69 73  X is any byte is
9890: 0a 2a 2a 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  .** converted in
98a0: 74 6f 20 61 20 73 69 6e 67 6c 65 20 22 5f 22 20  to a single "_" 
98b0: 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a  character..**.**
98c0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
98d0: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
98e0: 20 63 6f 6e 76 65 72 74 65 64 2e 20 20 41 6e 20   converted.  An 
98f0: 22 25 58 58 22 20 2d 3e 20 22 5f 22 20 63 6f 6e  "%XX" -> "_" con
9900: 76 65 72 73 69 6f 6e 0a 2a 2a 20 63 6f 75 6e 74  version.** count
9910: 73 20 61 73 20 61 20 73 69 6e 67 6c 65 20 63 68  s as a single ch
9920: 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  aracter..*/.stat
9930: 69 63 20 69 6e 74 20 73 61 6e 69 74 69 7a 65 53  ic int sanitizeS
9940: 74 72 69 6e 67 28 63 68 61 72 20 2a 7a 29 7b 0a  tring(char *z){.
9950: 20 20 69 6e 74 20 6e 43 68 61 6e 67 65 20 3d 20    int nChange = 
9960: 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20 29  0;.  while( *z )
9970: 7b 0a 20 20 20 20 69 66 28 20 21 61 6c 6c 6f 77  {.    if( !allow
9980: 65 64 49 6e 4e 61 6d 65 5b 2a 28 75 6e 73 69 67  edInName[*(unsig
9990: 6e 65 64 20 63 68 61 72 2a 29 7a 5d 20 29 7b 0a  ned char*)z] ){.
99a0: 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 25        if( *z=='%
99b0: 27 20 26 26 20 7a 5b 31 5d 21 3d 30 20 26 26 20  ' && z[1]!=0 && 
99c0: 7a 5b 32 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20  z[2]!=0 ){.     
99d0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
99e0: 20 20 66 6f 72 28 69 3d 33 3b 20 28 7a 5b 69 2d    for(i=3; (z[i-
99f0: 32 5d 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69  2] = z[i])!=0; i
9a00: 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 7d 0a 20 20  ++){}.      }.  
9a10: 20 20 20 20 2a 7a 20 3d 20 27 5f 27 3b 0a 20 20      *z = '_';.  
9a20: 20 20 20 20 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20      nChange++;. 
9a30: 20 20 20 7d 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20     }.    z++;.  
9a40: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 61 6e  }.  return nChan
9a50: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75  ge;.}../*.** Cou
9a60: 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
9a70: 20 22 2f 22 20 63 68 61 72 61 63 74 65 72 73 20   "/" characters 
9a80: 69 6e 20 61 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  in a string..*/.
9a90: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
9aa0: 53 6c 61 73 68 65 73 28 63 6f 6e 73 74 20 63 68  Slashes(const ch
9ab0: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 20  ar *z){.  int n 
9ac0: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a  = 0;.  while( *z
9ad0: 20 29 20 69 66 28 20 2a 28 7a 2b 2b 29 3d 3d 27   ) if( *(z++)=='
9ae0: 2f 27 20 29 20 6e 2b 2b 3b 0a 20 20 72 65 74 75  /' ) n++;.  retu
9af0: 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn n;.}../*.** T
9b00: 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63  his routine proc
9b10: 65 73 73 65 73 20 61 20 73 69 6e 67 6c 65 20 48  esses a single H
9b20: 54 54 50 20 72 65 71 75 65 73 74 20 6f 6e 20 73  TTP request on s
9b30: 74 61 6e 64 61 72 64 20 69 6e 70 75 74 20 61 6e  tandard input an
9b40: 64 0a 2a 2a 20 73 65 6e 64 73 20 74 68 65 20 72  d.** sends the r
9b50: 65 70 6c 79 20 74 6f 20 73 74 61 6e 64 61 72 64  eply to standard
9b60: 20 6f 75 74 70 75 74 2e 20 20 49 66 20 74 68 65   output.  If the
9b70: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 31 20 69   argument is 1 i
9b80: 74 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20  t means.** that 
9b90: 77 65 20 61 72 65 20 73 68 6f 75 6c 64 20 63 6c  we are should cl
9ba0: 6f 73 65 20 74 68 65 20 73 6f 63 6b 65 74 20 77  ose the socket w
9bb0: 69 74 68 6f 75 74 20 70 72 6f 63 65 73 73 69 6e  ithout processin
9bc0: 67 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  g additional.** 
9bd0: 48 54 54 50 20 72 65 71 75 65 73 74 73 20 61 66  HTTP requests af
9be0: 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ter the current 
9bf0: 72 65 71 75 65 73 74 20 66 69 6e 69 73 68 65 73  request finishes
9c00: 2e 20 20 30 20 6d 65 61 6e 73 20 77 65 20 61 72  .  0 means we ar
9c10: 65 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 74 6f 20  e.** allowed to 
9c20: 6b 65 65 70 20 74 68 65 20 63 6f 6e 6e 65 63 74  keep the connect
9c30: 69 6f 6e 20 6f 70 65 6e 20 61 6e 64 20 74 6f 20  ion open and to 
9c40: 70 72 6f 63 65 73 73 20 61 64 64 69 74 69 6f 6e  process addition
9c50: 61 6c 20 72 65 71 75 65 73 74 73 2e 0a 2a 2a 20  al requests..** 
9c60: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79  This routine may
9c70: 20 63 68 6f 6f 73 65 20 74 6f 20 63 6c 6f 73 65   choose to close
9c80: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
9c90: 65 76 65 6e 20 69 66 20 74 68 65 20 61 72 67 75  even if the argu
9ca0: 6d 65 6e 74 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2a  ment.** is 0..**
9cb0: 20 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 6e   .** If the conn
9cc0: 65 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  ection should be
9cd0: 20 63 6c 6f 73 65 64 2c 20 74 68 69 73 20 72 6f   closed, this ro
9ce0: 75 74 69 6e 65 20 63 61 6c 6c 73 20 65 78 69 74  utine calls exit
9cf0: 28 29 20 61 6e 64 0a 2a 2a 20 74 68 75 73 20 6e  () and.** thus n
9d00: 65 76 65 72 20 72 65 74 75 72 6e 73 2e 20 20 49  ever returns.  I
9d10: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64  f this routine d
9d20: 6f 65 73 20 72 65 74 75 72 6e 20 69 74 20 6d 65  oes return it me
9d30: 61 6e 73 20 74 68 61 74 20 61 6e 6f 74 68 65 72  ans that another
9d40: 0a 2a 2a 20 48 54 54 50 20 72 65 71 75 65 73 74  .** HTTP request
9d50: 20 6d 61 79 20 61 70 70 65 61 72 20 6f 6e 20 74   may appear on t
9d60: 68 65 20 77 69 72 65 2e 0a 2a 2f 0a 76 6f 69 64  he wire..*/.void
9d70: 20 50 72 6f 63 65 73 73 4f 6e 65 52 65 71 75 65   ProcessOneReque
9d80: 73 74 28 69 6e 74 20 66 6f 72 63 65 43 6c 6f 73  st(int forceClos
9d90: 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 63 3b 0a  e){.  int i, c;.
9da0: 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20    char *z;      
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
9dc0: 73 65 64 20 74 6f 20 70 61 72 73 65 20 75 70 20  sed to parse up 
9dd0: 61 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 73 74  a string */.  st
9de0: 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75  ruct stat statbu
9df0: 66 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72  f;      /* Infor
9e00: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
9e10: 20 66 69 6c 65 20 74 6f 20 62 65 20 72 65 74 72   file to be retr
9e20: 69 65 76 65 64 20 2a 2f 0a 20 20 46 49 4c 45 20  ieved */.  FILE 
9e30: 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  *in;            
9e40: 20 20 20 20 20 2f 2a 20 46 6f 72 20 72 65 61 64       /* For read
9e50: 69 6e 67 20 66 72 6f 6d 20 43 47 49 20 73 63 72  ing from CGI scr
9e60: 69 70 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 7a  ipts */.  char z
9e70: 4c 69 6e 65 5b 31 30 30 30 5d 3b 20 20 20 20 20  Line[1000];     
9e80: 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20      /* A buffer 
9e90: 66 6f 72 20 69 6e 70 75 74 20 6c 69 6e 65 73 20  for input lines 
9ea0: 6f 72 20 66 6f 72 6d 69 6e 67 20 6e 61 6d 65 73  or forming names
9eb0: 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65   */..  /* Change
9ec0: 20 64 69 72 65 63 74 6f 72 69 65 73 20 74 6f 20   directories to 
9ed0: 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
9ee0: 48 54 54 50 20 66 69 6c 65 73 79 73 74 65 6d 0a  HTTP filesystem.
9ef0: 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 64 69 72    */.  if( chdir
9f00: 28 7a 52 6f 6f 74 5b 30 5d 20 3f 20 7a 52 6f 6f  (zRoot[0] ? zRoo
9f10: 74 20 3a 20 22 2f 22 29 21 3d 30 20 29 7b 0a 20  t : "/")!=0 ){. 
9f20: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30     char zBuf[100
9f30: 30 5d 3b 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74  0];.    Malfunct
9f40: 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 63  ion(__LINE__, "c
9f50: 61 6e 6e 6f 74 20 63 68 64 69 72 20 74 6f 20 5b  annot chdir to [
9f60: 25 73 5d 20 66 72 6f 6d 20 5b 25 73 5d 22 2c 0a  %s] from [%s]",.
9f70: 20 20 20 20 20 20 20 20 20 7a 52 6f 6f 74 2c 20           zRoot, 
9f80: 67 65 74 63 77 64 28 7a 42 75 66 2c 39 39 39 29  getcwd(zBuf,999)
9f90: 29 3b 0a 20 20 7d 0a 20 20 6e 52 65 71 75 65 73  );.  }.  nReques
9fa0: 74 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  t++;..  /*.  ** 
9fb0: 57 65 20 6d 75 73 74 20 72 65 63 65 69 76 65 20  We must receive 
9fc0: 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  a complete heade
9fd0: 72 20 77 69 74 68 69 6e 20 31 35 20 73 65 63 6f  r within 15 seco
9fe0: 6e 64 73 0a 20 20 2a 2f 0a 20 20 73 69 67 6e 61  nds.  */.  signa
9ff0: 6c 28 53 49 47 41 4c 52 4d 2c 20 54 69 6d 65 6f  l(SIGALRM, Timeo
a000: 75 74 29 3b 0a 20 20 73 69 67 6e 61 6c 28 53 49  ut);.  signal(SI
a010: 47 53 45 47 56 2c 20 54 69 6d 65 6f 75 74 29 3b  GSEGV, Timeout);
a020: 0a 20 20 73 69 67 6e 61 6c 28 53 49 47 50 49 50  .  signal(SIGPIP
a030: 45 2c 20 54 69 6d 65 6f 75 74 29 3b 0a 20 20 69  E, Timeout);.  i
a040: 66 28 20 75 73 65 54 69 6d 65 6f 75 74 20 29 20  f( useTimeout ) 
a050: 61 6c 61 72 6d 28 31 35 29 3b 0a 0a 20 20 2f 2a  alarm(15);..  /*
a060: 20 47 65 74 20 74 68 65 20 66 69 72 73 74 20 6c   Get the first l
a070: 69 6e 65 20 6f 66 20 74 68 65 20 72 65 71 75 65  ine of the reque
a080: 73 74 20 61 6e 64 20 70 61 72 73 65 20 6f 75 74  st and parse out
a090: 20 74 68 65 0a 20 20 2a 2a 20 6d 65 74 68 6f 64   the.  ** method
a0a0: 2c 20 74 68 65 20 73 63 72 69 70 74 20 61 6e 64  , the script and
a0b0: 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2e 0a 20   the protocol.. 
a0c0: 20 2a 2f 0a 20 20 69 66 28 20 66 67 65 74 73 28   */.  if( fgets(
a0d0: 7a 4c 69 6e 65 2c 73 69 7a 65 6f 66 28 7a 4c 69  zLine,sizeof(zLi
a0e0: 6e 65 29 2c 73 74 64 69 6e 29 3d 3d 30 20 29 7b  ne),stdin)==0 ){
a0f0: 0a 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20  .    exit(0);.  
a100: 7d 0a 20 20 6f 6d 69 74 4c 6f 67 20 3d 20 30 3b  }.  omitLog = 0;
a110: 0a 20 20 6e 49 6e 20 2b 3d 20 73 74 72 6c 65 6e  .  nIn += strlen
a120: 28 7a 4c 69 6e 65 29 3b 0a 20 20 7a 4d 65 74 68  (zLine);.  zMeth
a130: 6f 64 20 3d 20 53 74 72 44 75 70 28 47 65 74 46  od = StrDup(GetF
a140: 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a 4c 69 6e  irstElement(zLin
a150: 65 2c 26 7a 29 29 3b 0a 20 20 7a 52 65 61 6c 53  e,&z));.  zRealS
a160: 63 72 69 70 74 20 3d 20 7a 53 63 72 69 70 74 20  cript = zScript 
a170: 3d 20 53 74 72 44 75 70 28 47 65 74 46 69 72 73  = StrDup(GetFirs
a180: 74 45 6c 65 6d 65 6e 74 28 7a 2c 26 7a 29 29 3b  tElement(z,&z));
a190: 0a 20 20 7a 50 72 6f 74 6f 63 6f 6c 20 3d 20 53  .  zProtocol = S
a1a0: 74 72 44 75 70 28 47 65 74 46 69 72 73 74 45 6c  trDup(GetFirstEl
a1b0: 65 6d 65 6e 74 28 7a 2c 26 7a 29 29 3b 0a 20 20  ement(z,&z));.  
a1c0: 69 66 28 20 7a 50 72 6f 74 6f 63 6f 6c 3d 3d 30  if( zProtocol==0
a1d0: 20 7c 7c 20 73 74 72 6e 63 6d 70 28 7a 50 72 6f   || strncmp(zPro
a1e0: 74 6f 63 6f 6c 2c 22 48 54 54 50 2f 22 2c 35 29  tocol,"HTTP/",5)
a1f0: 21 3d 30 20 7c 7c 20 73 74 72 6c 65 6e 28 7a 50  !=0 || strlen(zP
a200: 72 6f 74 6f 63 6f 6c 29 21 3d 38 20 29 7b 0a 20  rotocol)!=8 ){. 
a210: 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65     StartResponse
a220: 28 22 34 30 30 20 42 61 64 20 52 65 71 75 65 73  ("400 Bad Reques
a230: 74 22 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d  t");.    nOut +=
a240: 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22   printf(.      "
a250: 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65  Content-type: te
a260: 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20  xt/plain\r\n".  
a270: 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 20      "\r\n".     
a280: 20 22 54 68 69 73 20 73 65 72 76 65 72 20 64 6f   "This server do
a290: 65 73 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e  es not understan
a2a0: 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  d the requested 
a2b0: 70 72 6f 74 6f 63 6f 6c 5c 6e 22 0a 20 20 20 20  protocol\n".    
a2c0: 29 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e  );.    MakeLogEn
a2d0: 74 72 79 28 30 29 3b 0a 20 20 20 20 65 78 69 74  try(0);.    exit
a2e0: 28 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  (0);.  }.  if( z
a2f0: 53 63 72 69 70 74 5b 30 5d 3d 3d 30 20 29 20 4e  Script[0]==0 ) N
a300: 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f  otFound(__LINE__
a310: 29 3b 0a 20 20 69 66 28 20 66 6f 72 63 65 43 6c  );.  if( forceCl
a320: 6f 73 65 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65  ose ){.    close
a330: 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 31 3b 0a  Connection = 1;.
a340: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 72 6f    }else if( zPro
a350: 74 6f 63 6f 6c 5b 35 5d 3c 27 31 27 20 7c 7c 20  tocol[5]<'1' || 
a360: 7a 50 72 6f 74 6f 63 6f 6c 5b 37 5d 3c 27 31 27  zProtocol[7]<'1'
a370: 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 43 6f 6e   ){.    closeCon
a380: 6e 65 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d  nection = 1;.  }
a390: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 76 65 72 79  ..  /* This very
a3a0: 20 73 69 6d 70 6c 65 20 73 65 72 76 65 72 20 6f   simple server o
a3b0: 6e 6c 79 20 75 6e 64 65 72 73 74 61 6e 64 73 20  nly understands 
a3c0: 74 68 65 20 47 45 54 2c 20 50 4f 53 54 0a 20 20  the GET, POST.  
a3d0: 2a 2a 20 61 6e 64 20 48 45 41 44 20 6d 65 74 68  ** and HEAD meth
a3e0: 6f 64 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ods.  */.  if( s
a3f0: 74 72 63 6d 70 28 7a 4d 65 74 68 6f 64 2c 22 47  trcmp(zMethod,"G
a400: 45 54 22 29 21 3d 30 20 26 26 20 73 74 72 63 6d  ET")!=0 && strcm
a410: 70 28 7a 4d 65 74 68 6f 64 2c 22 50 4f 53 54 22  p(zMethod,"POST"
a420: 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20 73  )!=0.       && s
a430: 74 72 63 6d 70 28 7a 4d 65 74 68 6f 64 2c 22 48  trcmp(zMethod,"H
a440: 45 41 44 22 29 21 3d 30 20 29 7b 0a 20 20 20 20  EAD")!=0 ){.    
a450: 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 35  StartResponse("5
a460: 30 31 20 4e 6f 74 20 49 6d 70 6c 65 6d 65 6e 74  01 Not Implement
a470: 65 64 22 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b  ed");.    nOut +
a480: 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  = printf(.      
a490: 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74  "Content-type: t
a4a0: 65 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20  ext/plain\r\n". 
a4b0: 20 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20       "\r\n".    
a4c0: 20 20 22 54 68 65 20 25 73 20 6d 65 74 68 6f 64    "The %s method
a4d0: 20 69 73 20 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e   is not implemen
a4e0: 74 65 64 20 6f 6e 20 74 68 69 73 20 73 65 72 76  ted on this serv
a4f0: 65 72 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 7a 4d  er.\n",.      zM
a500: 65 74 68 6f 64 29 3b 0a 20 20 20 20 4d 61 6b 65  ethod);.    Make
a510: 4c 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20 20 20  LogEntry(0);.   
a520: 20 65 78 69 74 28 30 29 3b 0a 20 20 7d 0a 0a 20   exit(0);.  }.. 
a530: 20 2f 2a 20 47 65 74 20 61 6c 6c 20 74 68 65 20   /* Get all the 
a540: 6f 70 74 69 6f 6e 61 6c 20 66 69 65 6c 64 73 20  optional fields 
a550: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 65 20  that follow the 
a560: 66 69 72 73 74 20 6c 69 6e 65 2e 0a 20 20 2a 2f  first line..  */
a570: 0a 20 20 7a 43 6f 6f 6b 69 65 20 3d 20 30 3b 0a  .  zCookie = 0;.
a580: 20 20 7a 41 75 74 68 54 79 70 65 20 3d 20 30 3b    zAuthType = 0;
a590: 0a 20 20 7a 52 65 6d 6f 74 65 55 73 65 72 20 3d  .  zRemoteUser =
a5a0: 20 30 3b 0a 20 20 7a 52 65 66 65 72 65 72 20 3d   0;.  zReferer =
a5b0: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65   0;.  while( fge
a5c0: 74 73 28 7a 4c 69 6e 65 2c 73 69 7a 65 6f 66 28  ts(zLine,sizeof(
a5d0: 7a 4c 69 6e 65 29 2c 73 74 64 69 6e 29 20 29 7b  zLine),stdin) ){
a5e0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69 65 6c  .    char *zFiel
a5f0: 64 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20  dName;.    char 
a600: 2a 7a 56 61 6c 3b 0a 0a 20 20 20 20 6e 49 6e 20  *zVal;..    nIn 
a610: 2b 3d 20 73 74 72 6c 65 6e 28 7a 4c 69 6e 65 29  += strlen(zLine)
a620: 3b 0a 20 20 20 20 7a 46 69 65 6c 64 4e 61 6d 65  ;.    zFieldName
a630: 20 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65   = GetFirstEleme
a640: 6e 74 28 7a 4c 69 6e 65 2c 26 7a 56 61 6c 29 3b  nt(zLine,&zVal);
a650: 0a 20 20 20 20 69 66 28 20 7a 46 69 65 6c 64 4e  .    if( zFieldN
a660: 61 6d 65 3d 3d 30 20 7c 7c 20 2a 7a 46 69 65 6c  ame==0 || *zFiel
a670: 64 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b  dName==0 ) break
a680: 3b 0a 20 20 20 20 52 65 6d 6f 76 65 4e 65 77 6c  ;.    RemoveNewl
a690: 69 6e 65 28 7a 56 61 6c 29 3b 0a 20 20 20 20 69  ine(zVal);.    i
a6a0: 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46  f( strcasecmp(zF
a6b0: 69 65 6c 64 4e 61 6d 65 2c 22 55 73 65 72 2d 41  ieldName,"User-A
a6c0: 67 65 6e 74 3a 22 29 3d 3d 30 20 29 7b 0a 20 20  gent:")==0 ){.  
a6d0: 20 20 20 20 7a 41 67 65 6e 74 20 3d 20 53 74 72      zAgent = Str
a6e0: 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d  Dup(zVal);.    }
a6f0: 65 6c 73 65 20 69 66 28 20 73 74 72 63 61 73 65  else if( strcase
a700: 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22  cmp(zFieldName,"
a710: 41 63 63 65 70 74 3a 22 29 3d 3d 30 20 29 7b 0a  Accept:")==0 ){.
a720: 20 20 20 20 20 20 7a 41 63 63 65 70 74 20 3d 20        zAccept = 
a730: 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20  StrDup(zVal);.  
a740: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
a750: 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d  asecmp(zFieldNam
a760: 65 2c 22 43 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74  e,"Content-lengt
a770: 68 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  h:")==0 ){.     
a780: 20 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 20   zContentLength 
a790: 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a  = StrDup(zVal);.
a7a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
a7b0: 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e  rcasecmp(zFieldN
a7c0: 61 6d 65 2c 22 43 6f 6e 74 65 6e 74 2d 74 79 70  ame,"Content-typ
a7d0: 65 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  e:")==0 ){.     
a7e0: 20 7a 43 6f 6e 74 65 6e 74 54 79 70 65 20 3d 20   zContentType = 
a7f0: 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20  StrDup(zVal);.  
a800: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
a810: 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d  asecmp(zFieldNam
a820: 65 2c 22 52 65 66 65 72 65 72 3a 22 29 3d 3d 30  e,"Referer:")==0
a830: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74   ){.      if( st
a840: 72 73 74 72 28 7a 56 61 6c 2c 20 22 64 65 76 69  rstr(zVal, "devi
a850: 64 73 2e 6e 65 74 2f 22 29 21 3d 30 20 29 20 46  ds.net/")!=0 ) F
a860: 6f 72 62 69 64 64 65 6e 28 29 3b 0a 20 20 20 20  orbidden();.    
a870: 20 20 7a 52 65 66 65 72 65 72 20 3d 20 53 74 72    zReferer = Str
a880: 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d  Dup(zVal);.    }
a890: 65 6c 73 65 20 69 66 28 20 73 74 72 63 61 73 65  else if( strcase
a8a0: 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22  cmp(zFieldName,"
a8b0: 43 6f 6f 6b 69 65 3a 22 29 3d 3d 30 20 29 7b 0a  Cookie:")==0 ){.
a8c0: 20 20 20 20 20 20 7a 43 6f 6f 6b 69 65 20 3d 20        zCookie = 
a8d0: 53 74 72 41 70 70 65 6e 64 28 7a 43 6f 6f 6b 69  StrAppend(zCooki
a8e0: 65 2c 22 3b 20 22 2c 7a 56 61 6c 29 3b 0a 20 20  e,"; ",zVal);.  
a8f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
a900: 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d  asecmp(zFieldNam
a910: 65 2c 22 43 6f 6e 6e 65 63 74 69 6f 6e 3a 22 29  e,"Connection:")
a920: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
a930: 20 73 74 72 63 61 73 65 63 6d 70 28 7a 56 61 6c   strcasecmp(zVal
a940: 2c 22 63 6c 6f 73 65 22 29 3d 3d 30 20 29 7b 0a  ,"close")==0 ){.
a950: 20 20 20 20 20 20 20 20 63 6c 6f 73 65 43 6f 6e          closeCon
a960: 6e 65 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 20  nection = 1;.   
a970: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 66 6f     }else if( !fo
a980: 72 63 65 43 6c 6f 73 65 20 26 26 20 73 74 72 63  rceClose && strc
a990: 61 73 65 63 6d 70 28 7a 56 61 6c 2c 20 22 6b 65  asecmp(zVal, "ke
a9a0: 65 70 2d 61 6c 69 76 65 22 29 3d 3d 30 20 29 7b  ep-alive")==0 ){
a9b0: 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 43 6f  .        closeCo
a9c0: 6e 6e 65 63 74 69 6f 6e 20 3d 20 30 3b 0a 20 20  nnection = 0;.  
a9d0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
a9e0: 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a  if( strcasecmp(z
a9f0: 46 69 65 6c 64 4e 61 6d 65 2c 22 48 6f 73 74 3a  FieldName,"Host:
aa00: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
aa10: 6e 74 20 69 6e 53 71 75 61 72 65 20 3d 20 30 3b  nt inSquare = 0;
aa20: 0a 20 20 20 20 20 20 63 68 61 72 20 63 3b 0a 20  .      char c;. 
aa30: 20 20 20 20 20 69 66 28 20 73 61 6e 69 74 69 7a       if( sanitiz
aa40: 65 53 74 72 69 6e 67 28 7a 56 61 6c 29 20 29 20  eString(zVal) ) 
aa50: 46 6f 72 62 69 64 64 65 6e 28 29 3b 0a 20 20 20  Forbidden();.   
aa60: 20 20 20 7a 48 74 74 70 48 6f 73 74 20 3d 20 53     zHttpHost = S
aa70: 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20  trDup(zVal);.   
aa80: 20 20 20 7a 53 65 72 76 65 72 50 6f 72 74 20 3d     zServerPort =
aa90: 20 7a 53 65 72 76 65 72 4e 61 6d 65 20 3d 20 53   zServerName = S
aaa0: 74 72 44 75 70 28 7a 48 74 74 70 48 6f 73 74 29  trDup(zHttpHost)
aab0: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a  ;.      while( z
aac0: 53 65 72 76 65 72 50 6f 72 74 20 26 26 20 28 63  ServerPort && (c
aad0: 20 3d 20 2a 7a 53 65 72 76 65 72 50 6f 72 74 29   = *zServerPort)
aae0: 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  !=0.            
aaf0: 20 20 26 26 20 28 63 21 3d 27 3a 27 20 7c 7c 20    && (c!=':' || 
ab00: 69 6e 53 71 75 61 72 65 29 20 29 7b 0a 20 20 20  inSquare) ){.   
ab10: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5b 27 20       if( c=='[' 
ab20: 29 20 69 6e 53 71 75 61 72 65 20 3d 20 31 3b 0a  ) inSquare = 1;.
ab30: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
ab40: 5d 27 20 29 20 69 6e 53 71 75 61 72 65 20 3d 20  ]' ) inSquare = 
ab50: 30 3b 0a 20 20 20 20 20 20 20 20 7a 53 65 72 76  0;.        zServ
ab60: 65 72 50 6f 72 74 2b 2b 3b 0a 20 20 20 20 20 20  erPort++;.      
ab70: 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 53 65 72  }.      if( zSer
ab80: 76 65 72 50 6f 72 74 20 26 26 20 2a 7a 53 65 72  verPort && *zSer
ab90: 76 65 72 50 6f 72 74 20 29 7b 0a 20 20 20 20 20  verPort ){.     
aba0: 20 20 20 2a 7a 53 65 72 76 65 72 50 6f 72 74 20     *zServerPort 
abb0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 53 65  = 0;.        zSe
abc0: 72 76 65 72 50 6f 72 74 2b 2b 3b 0a 20 20 20 20  rverPort++;.    
abd0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 52    }.      if( zR
abe0: 65 61 6c 50 6f 72 74 20 29 7b 0a 20 20 20 20 20  ealPort ){.     
abf0: 20 20 20 7a 53 65 72 76 65 72 50 6f 72 74 20 3d     zServerPort =
ac00: 20 53 74 72 44 75 70 28 7a 52 65 61 6c 50 6f 72   StrDup(zRealPor
ac10: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
ac20: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 61 73  }else if( strcas
ac30: 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c  ecmp(zFieldName,
ac40: 22 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e 3a 22  "Authorization:"
ac50: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 41  )==0 ){.      zA
ac60: 75 74 68 54 79 70 65 20 3d 20 47 65 74 46 69 72  uthType = GetFir
ac70: 73 74 45 6c 65 6d 65 6e 74 28 53 74 72 44 75 70  stElement(StrDup
ac80: 28 7a 56 61 6c 29 2c 20 26 7a 41 75 74 68 41 72  (zVal), &zAuthAr
ac90: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  g);.    }.  }.. 
aca0: 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 72 65 71   /* Disallow req
acb0: 75 65 73 74 73 20 66 72 6f 6d 20 63 65 72 74 61  uests from certa
acc0: 69 6e 20 63 6c 69 65 6e 74 73 20 2a 2f 0a 20 20  in clients */.  
acd0: 69 66 28 20 7a 41 67 65 6e 74 20 29 7b 0a 20 20  if( zAgent ){.  
ace0: 20 20 69 66 28 20 73 74 72 73 74 72 28 7a 41 67    if( strstr(zAg
acf0: 65 6e 74 2c 20 22 57 69 6e 64 6f 77 73 5f 39 22  ent, "Windows_9"
ad00: 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 73 74 72  )!=0.     || str
ad10: 73 74 72 28 7a 41 67 65 6e 74 2c 20 22 44 6f 77  str(zAgent, "Dow
ad20: 6e 6c 6f 61 64 5f 4d 61 73 74 65 72 22 29 21 3d  nload_Master")!=
ad30: 30 0a 20 20 20 20 20 7c 7c 20 73 74 72 73 74 72  0.     || strstr
ad40: 28 7a 41 67 65 6e 74 2c 20 22 45 7a 6f 6f 6d 73  (zAgent, "Ezooms
ad50: 2f 22 29 21 3d 30 0a 20 20 20 2f 2a 7c 7c 20 73  /")!=0.   /*|| s
ad60: 74 72 73 74 72 28 7a 41 67 65 6e 74 2c 20 22 62  trstr(zAgent, "b
ad70: 69 6e 67 62 6f 74 22 29 21 3d 30 2a 2f 0a 20 20  ingbot")!=0*/.  
ad80: 20 20 20 7c 7c 20 73 74 72 73 74 72 28 7a 41 67     || strstr(zAg
ad90: 65 6e 74 2c 20 22 41 68 72 65 66 73 42 6f 74 22  ent, "AhrefsBot"
ada0: 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )!=0.    ){.    
adb0: 20 20 46 6f 72 62 69 64 64 65 6e 28 29 3b 0a 20    Forbidden();. 
adc0: 20 20 20 7d 0a 20 20 7d 0a 23 69 66 20 30 0a 20     }.  }.#if 0. 
add0: 20 69 66 28 20 7a 52 65 66 65 72 65 72 20 29 7b   if( zReferer ){
ade0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
adf0: 74 20 63 68 61 72 20 2a 61 7a 44 69 73 61 6c 6c  t char *azDisall
ae00: 6f 77 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 22  ow[] = {.      "
ae10: 73 6b 69 64 72 6f 77 63 72 61 63 6b 2e 63 6f 6d  skidrowcrack.com
ae20: 22 2c 0a 20 20 20 20 20 20 22 68 6f 73 68 69 79  ",.      "hoshiy
ae30: 75 75 67 69 2e 74 69 73 74 6f 72 79 2e 63 6f 6d  uugi.tistory.com
ae40: 22 2c 0a 20 20 20 20 20 20 22 73 6b 69 64 72 6f  ",.      "skidro
ae50: 77 67 61 6d 65 73 2e 6e 65 74 22 2c 0a 20 20 20  wgames.net",.   
ae60: 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   };.    int i;. 
ae70: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
ae80: 7a 65 6f 66 28 61 7a 44 69 73 61 6c 6c 6f 77 29  zeof(azDisallow)
ae90: 2f 73 69 7a 65 6f 66 28 61 7a 44 69 73 61 6c 6c  /sizeof(azDisall
aea0: 6f 77 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ow[0]); i++){.  
aeb0: 20 20 20 20 69 66 28 20 73 74 72 73 74 72 28 7a      if( strstr(z
aec0: 52 65 66 65 72 65 72 2c 20 61 7a 44 69 73 61 6c  Referer, azDisal
aed0: 6c 6f 77 5b 69 5d 29 21 3d 30 20 29 20 4e 6f 74  low[i])!=0 ) Not
aee0: 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b  Found(__LINE__);
aef0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
af00: 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 6e 20  f..  /* Make an 
af10: 65 78 74 72 61 20 65 66 66 6f 72 74 20 74 6f 20  extra effort to 
af20: 67 65 74 20 61 20 76 61 6c 69 64 20 73 65 72 76  get a valid serv
af30: 65 72 20 6e 61 6d 65 20 61 6e 64 20 70 6f 72 74  er name and port
af40: 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2a 20 4f 6e   number..  ** On
af50: 6c 79 20 4e 65 74 73 63 61 70 65 20 70 72 6f 76  ly Netscape prov
af60: 69 64 65 73 20 74 68 69 73 20 69 6e 66 6f 72 6d  ides this inform
af70: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 62  ation.  If the b
af80: 72 6f 77 73 65 72 20 69 73 0a 20 20 2a 2a 20 49  rowser is.  ** I
af90: 6e 74 65 72 6e 65 74 20 45 78 70 6c 6f 72 65 72  nternet Explorer
afa0: 2c 20 74 68 65 6e 20 77 65 20 68 61 76 65 20 74  , then we have t
afb0: 6f 20 66 69 6e 64 20 6f 75 74 20 74 68 65 20 69  o find out the i
afc0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 0a 20  nformation for. 
afd0: 20 2a 2a 20 6f 75 72 73 65 6c 76 65 73 2e 0a 20   ** ourselves.. 
afe0: 20 2a 2f 0a 20 20 69 66 28 20 7a 53 65 72 76 65   */.  if( zServe
aff0: 72 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  rName==0 ){.    
b000: 7a 53 65 72 76 65 72 4e 61 6d 65 20 3d 20 53 61  zServerName = Sa
b010: 66 65 4d 61 6c 6c 6f 63 28 20 31 30 30 20 29 3b  feMalloc( 100 );
b020: 0a 20 20 20 20 67 65 74 68 6f 73 74 6e 61 6d 65  .    gethostname
b030: 28 7a 53 65 72 76 65 72 4e 61 6d 65 2c 31 30 30  (zServerName,100
b040: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 53 65  );.  }.  if( zSe
b050: 72 76 65 72 50 6f 72 74 3d 3d 30 20 7c 7c 20 2a  rverPort==0 || *
b060: 7a 53 65 72 76 65 72 50 6f 72 74 3d 3d 30 20 29  zServerPort==0 )
b070: 7b 0a 20 20 20 20 7a 53 65 72 76 65 72 50 6f 72  {.    zServerPor
b080: 74 20 3d 20 44 45 46 41 55 4c 54 5f 50 4f 52 54  t = DEFAULT_PORT
b090: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f  ;.  }..  /* Remo
b0a0: 76 65 20 74 68 65 20 71 75 65 72 79 20 73 74 72  ve the query str
b0b0: 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 65 6e 64  ing from the end
b0c0: 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65   of the requeste
b0d0: 64 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66  d file..  */.  f
b0e0: 6f 72 28 7a 3d 7a 53 63 72 69 70 74 3b 20 2a 7a  or(z=zScript; *z
b0f0: 20 26 26 20 2a 7a 21 3d 27 3f 27 3b 20 7a 2b 2b   && *z!='?'; z++
b100: 29 7b 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 3f  ){}.  if( *z=='?
b110: 27 20 29 7b 0a 20 20 20 20 7a 51 75 65 72 79 53  ' ){.    zQueryS
b120: 75 66 66 69 78 20 3d 20 53 74 72 44 75 70 28 7a  uffix = StrDup(z
b130: 29 3b 0a 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20  );.    *z = 0;. 
b140: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 51 75 65   }else{.    zQue
b150: 72 79 53 75 66 66 69 78 20 3d 20 22 22 3b 0a 20  rySuffix = "";. 
b160: 20 7d 0a 20 20 7a 51 75 65 72 79 53 74 72 69 6e   }.  zQueryStrin
b170: 67 20 3d 20 2a 7a 51 75 65 72 79 53 75 66 66 69  g = *zQuerySuffi
b180: 78 20 3f 20 26 7a 51 75 65 72 79 53 75 66 66 69  x ? &zQuerySuffi
b190: 78 5b 31 5d 20 3a 20 7a 51 75 65 72 79 53 75 66  x[1] : zQuerySuf
b1a0: 66 69 78 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  fix;..  /* Creat
b1b0: 65 20 61 20 66 69 6c 65 20 74 6f 20 68 6f 6c 64  e a file to hold
b1c0: 20 74 68 65 20 50 4f 53 54 20 71 75 65 72 79 20   the POST query 
b1d0: 64 61 74 61 2c 20 69 66 20 61 6e 79 2e 20 20 57  data, if any.  W
b1e0: 65 20 68 61 76 65 20 74 6f 0a 20 20 2a 2a 20 64  e have to.  ** d
b1f0: 6f 20 69 74 20 74 68 69 73 20 77 61 79 2e 20 20  o it this way.  
b200: 57 65 20 63 61 6e 27 74 20 6a 75 73 74 20 70 61  We can't just pa
b210: 73 73 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ss the file desc
b220: 72 69 70 74 6f 72 20 64 6f 77 6e 20 74 6f 0a 20  riptor down to. 
b230: 20 2a 2a 20 74 68 65 20 63 68 69 6c 64 20 70 72   ** the child pr
b240: 6f 63 65 73 73 20 62 65 63 61 75 73 65 20 74 68  ocess because th
b250: 65 20 66 67 65 74 73 28 29 20 66 75 6e 63 74 69  e fgets() functi
b260: 6f 6e 20 6d 61 79 20 68 61 76 65 20 61 6c 72 65  on may have alre
b270: 61 64 79 0a 20 20 2a 2a 20 72 65 61 64 20 70 61  ady.  ** read pa
b280: 72 74 20 6f 66 20 74 68 65 20 50 4f 53 54 20 64  rt of the POST d
b290: 61 74 61 20 69 6e 74 6f 20 69 74 73 20 69 6e 74  ata into its int
b2a0: 65 72 6e 61 6c 20 62 75 66 66 65 72 2e 0a 20 20  ernal buffer..  
b2b0: 2a 2f 0a 20 20 69 66 28 20 7a 4d 65 74 68 6f 64  */.  if( zMethod
b2c0: 5b 30 5d 3d 3d 27 50 27 20 26 26 20 7a 43 6f 6e  [0]=='P' && zCon
b2d0: 74 65 6e 74 4c 65 6e 67 74 68 21 3d 30 20 29 7b  tentLength!=0 ){
b2e0: 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 61  .    int len = a
b2f0: 74 6f 69 28 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67  toi(zContentLeng
b300: 74 68 29 3b 0a 20 20 20 20 46 49 4c 45 20 2a 6f  th);.    FILE *o
b310: 75 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 42  ut;.    char *zB
b320: 75 66 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 0a  uf;.    int n;..
b330: 20 20 20 20 69 66 28 20 6c 65 6e 3e 4d 41 58 5f      if( len>MAX_
b340: 43 4f 4e 54 45 4e 54 5f 4c 45 4e 47 54 48 20 29  CONTENT_LENGTH )
b350: 7b 0a 20 20 20 20 20 20 53 74 61 72 74 52 65 73  {.      StartRes
b360: 70 6f 6e 73 65 28 22 35 30 30 20 52 65 71 75 65  ponse("500 Reque
b370: 73 74 20 74 6f 6f 20 6c 61 72 67 65 22 29 3b 0a  st too large");.
b380: 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72        nOut += pr
b390: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 43  intf(.        "C
b3a0: 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78  ontent-type: tex
b3b0: 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20  t/plain\r\n".   
b3c0: 20 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20       "\r\n".    
b3d0: 20 20 20 20 22 54 6f 6f 20 6d 75 63 68 20 50 4f      "Too much PO
b3e0: 53 54 20 64 61 74 61 5c 6e 22 0a 20 20 20 20 20  ST data\n".     
b3f0: 20 29 3b 0a 20 20 20 20 20 20 4d 61 6b 65 4c 6f   );.      MakeLo
b400: 67 45 6e 74 72 79 28 30 29 3b 0a 20 20 20 20 20  gEntry(0);.     
b410: 20 65 78 69 74 28 30 29 3b 0a 20 20 20 20 7d 0a   exit(0);.    }.
b420: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 54 6d 70      sprintf(zTmp
b430: 4e 61 6d 42 75 66 2c 20 22 2f 74 6d 70 2f 2d 70  NamBuf, "/tmp/-p
b440: 6f 73 74 2d 64 61 74 61 2d 58 58 58 58 58 58 22  ost-data-XXXXXX"
b450: 29 3b 0a 20 20 20 20 7a 54 6d 70 4e 61 6d 20 3d  );.    zTmpNam =
b460: 20 7a 54 6d 70 4e 61 6d 42 75 66 3b 0a 20 20 20   zTmpNamBuf;.   
b470: 20 6d 6b 73 74 65 6d 70 28 7a 54 6d 70 4e 61 6d   mkstemp(zTmpNam
b480: 29 3b 0a 20 20 20 20 6f 75 74 20 3d 20 66 6f 70  );.    out = fop
b490: 65 6e 28 7a 54 6d 70 4e 61 6d 2c 22 77 22 29 3b  en(zTmpNam,"w");
b4a0: 0a 20 20 20 20 69 66 28 20 6f 75 74 3d 3d 30 20  .    if( out==0 
b4b0: 29 7b 0a 20 20 20 20 20 20 53 74 61 72 74 52 65  ){.      StartRe
b4c0: 73 70 6f 6e 73 65 28 22 35 30 30 20 43 61 6e 6e  sponse("500 Cann
b4d0: 6f 74 20 63 72 65 61 74 65 20 2f 74 6d 70 20 66  ot create /tmp f
b4e0: 69 6c 65 22 29 3b 0a 20 20 20 20 20 20 6e 4f 75  ile");.      nOu
b4f0: 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20  t += printf(.   
b500: 20 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79       "Content-ty
b510: 70 65 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c 72  pe: text/plain\r
b520: 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 5c 72 5c  \n".        "\r\
b530: 6e 22 0a 20 20 20 20 20 20 20 20 22 43 6f 75 6c  n".        "Coul
b540: 64 20 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c  d not open \"%s\
b550: 22 20 66 6f 72 20 77 72 69 74 69 6e 67 5c 6e 22  " for writing\n"
b560: 2c 20 7a 54 6d 70 4e 61 6d 0a 20 20 20 20 20 20  , zTmpNam.      
b570: 29 3b 0a 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67  );.      MakeLog
b580: 45 6e 74 72 79 28 30 29 3b 0a 20 20 20 20 20 20  Entry(0);.      
b590: 65 78 69 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20  exit(0);.    }. 
b5a0: 20 20 20 7a 42 75 66 20 3d 20 53 61 66 65 4d 61     zBuf = SafeMa
b5b0: 6c 6c 6f 63 28 20 6c 65 6e 20 29 3b 0a 20 20 20  lloc( len );.   
b5c0: 20 69 66 28 20 75 73 65 54 69 6d 65 6f 75 74 20   if( useTimeout 
b5d0: 29 20 61 6c 61 72 6d 28 31 35 20 2b 20 6c 65 6e  ) alarm(15 + len
b5e0: 2f 32 30 30 30 29 3b 0a 20 20 20 20 6e 20 3d 20  /2000);.    n = 
b5f0: 66 72 65 61 64 28 7a 42 75 66 2c 31 2c 6c 65 6e  fread(zBuf,1,len
b600: 2c 73 74 64 69 6e 29 3b 0a 20 20 20 20 6e 49 6e  ,stdin);.    nIn
b610: 20 2b 3d 20 6e 3b 0a 20 20 20 20 66 77 72 69 74   += n;.    fwrit
b620: 65 28 7a 42 75 66 2c 31 2c 6e 2c 6f 75 74 29 3b  e(zBuf,1,n,out);
b630: 0a 20 20 20 20 66 72 65 65 28 7a 42 75 66 29 3b  .    free(zBuf);
b640: 0a 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29  .    fclose(out)
b650: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
b660: 20 73 75 72 65 20 74 68 65 20 72 75 6e 6e 69 6e   sure the runnin
b670: 67 20 74 69 6d 65 20 69 73 20 6e 6f 74 20 74 6f  g time is not to
b680: 6f 20 67 72 65 61 74 20 2a 2f 0a 20 20 69 66 28  o great */.  if(
b690: 20 75 73 65 54 69 6d 65 6f 75 74 20 29 20 61 6c   useTimeout ) al
b6a0: 61 72 6d 28 31 30 29 3b 0a 0a 20 20 2f 2a 20 43  arm(10);..  /* C
b6b0: 6f 6e 76 65 72 74 20 61 6c 6c 20 75 6e 75 73 75  onvert all unusu
b6c0: 61 6c 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  al characters in
b6d0: 20 74 68 65 20 73 63 72 69 70 74 20 6e 61 6d 65   the script name
b6e0: 20 69 6e 74 6f 20 22 5f 22 2e 0a 20 20 2a 2a 0a   into "_"..  **.
b6f0: 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61 20 64    ** This is a d
b700: 65 66 65 6e 73 65 20 61 67 61 69 6e 73 74 20 76  efense against v
b710: 61 72 69 6f 75 73 20 61 74 74 61 63 6b 73 2c 20  arious attacks, 
b720: 58 53 53 20 61 74 74 61 63 6b 73 20 69 6e 20 70  XSS attacks in p
b730: 61 72 74 69 63 75 6c 61 72 2e 0a 20 20 2a 2f 0a  articular..  */.
b740: 20 20 73 61 6e 69 74 69 7a 65 53 74 72 69 6e 67    sanitizeString
b750: 28 7a 53 63 72 69 70 74 29 3b 0a 0a 20 20 2f 2a  (zScript);..  /*
b760: 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 22 2f   Do not allow "/
b770: 2e 22 20 6f 72 20 22 2f 2d 22 20 74 6f 20 74 6f  ." or "/-" to to
b780: 20 6f 63 63 75 72 20 61 6e 79 77 68 65 72 65 20   occur anywhere 
b790: 69 6e 20 74 68 65 20 65 6e 74 69 74 79 20 6e 61  in the entity na
b7a0: 6d 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72  me..  ** This pr
b7b0: 65 76 65 6e 74 73 20 61 74 74 61 63 6b 73 20 69  events attacks i
b7c0: 6e 76 6f 6c 76 69 6e 67 20 22 2e 2e 22 20 61 6e  nvolving ".." an
b7d0: 64 20 61 6c 73 6f 20 61 6c 6c 6f 77 73 20 75 73  d also allows us
b7e0: 20 74 6f 20 63 72 65 61 74 65 0a 20 20 2a 2a 20   to create.  ** 
b7f0: 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74  files and direct
b800: 6f 72 69 65 73 20 77 68 6f 73 65 20 6e 61 6d 65  ories whose name
b810: 73 20 62 65 67 69 6e 20 77 69 74 68 20 22 2d 22  s begin with "-"
b820: 20 6f 72 20 22 2e 22 20 77 68 69 63 68 20 61 72   or "." which ar
b830: 65 0a 20 20 2a 2a 20 69 6e 76 69 73 69 62 6c 65  e.  ** invisible
b840: 20 74 6f 20 74 68 65 20 77 65 62 73 65 72 76 65   to the webserve
b850: 72 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 7a 3d  r..  */.  for(z=
b860: 7a 53 63 72 69 70 74 3b 20 2a 7a 3b 20 7a 2b 2b  zScript; *z; z++
b870: 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27  ){.    if( *z=='
b880: 2f 27 20 26 26 20 28 7a 5b 31 5d 3d 3d 27 2e 27  /' && (z[1]=='.'
b890: 20 7c 7c 20 7a 5b 31 5d 3d 3d 27 2d 27 29 20 29   || z[1]=='-') )
b8a0: 7b 0a 20 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e  {.       NotFoun
b8b0: 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  d(__LINE__);.   
b8c0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67   }.  }..  /* Fig
b8d0: 75 72 65 20 6f 75 74 20 77 68 61 74 20 74 68 65  ure out what the
b8e0: 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 66 69 6c   root of the fil
b8f0: 65 73 79 73 74 65 6d 20 73 68 6f 75 6c 64 20 62  esystem should b
b900: 65 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  e.  If the.  ** 
b910: 48 54 54 50 5f 48 4f 53 54 20 70 61 72 61 6d 65  HTTP_HOST parame
b920: 74 65 72 20 65 78 69 73 74 73 20 28 73 74 6f 72  ter exists (stor
b930: 65 64 20 69 6e 20 7a 48 74 74 70 48 6f 73 74 29  ed in zHttpHost)
b940: 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65   then remove the
b950: 0a 20 20 2a 2a 20 70 6f 72 74 20 6e 75 6d 62 65  .  ** port numbe
b960: 72 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 28  r from the end (
b970: 69 66 20 61 6e 79 29 2c 20 63 6f 6e 76 65 72 74  if any), convert
b980: 20 61 6c 6c 20 63 68 61 72 61 63 74 65 72 73 20   all characters 
b990: 74 6f 20 6c 6f 77 65 72 0a 20 20 2a 2a 20 63 61  to lower.  ** ca
b9a0: 73 65 2c 20 61 6e 64 20 63 6f 6e 76 65 72 74 20  se, and convert 
b9b0: 61 6c 6c 20 22 2e 22 20 74 6f 20 22 5f 22 2e 20  all "." to "_". 
b9c0: 20 54 68 65 6e 20 74 72 79 20 74 6f 20 66 69 6e   Then try to fin
b9d0: 64 20 61 20 64 69 72 65 63 74 6f 72 79 0a 20 20  d a directory.  
b9e0: 2a 2a 20 77 69 74 68 20 74 68 61 74 20 6e 61 6d  ** with that nam
b9f0: 65 20 61 6e 64 20 74 68 65 20 65 78 74 65 6e 73  e and the extens
ba00: 69 6f 6e 20 2e 77 65 62 73 69 74 65 2e 20 20 49  ion .website.  I
ba10: 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c 6f 6f  f not found, loo
ba20: 6b 0a 20 20 2a 2a 20 66 6f 72 20 22 64 65 66 61  k.  ** for "defa
ba30: 75 6c 74 2e 77 65 62 73 69 74 65 22 2e 0a 20 20  ult.website"..  
ba40: 2a 2f 0a 20 20 69 66 28 20 7a 53 63 72 69 70 74  */.  if( zScript
ba50: 5b 30 5d 21 3d 27 2f 27 20 29 20 4e 6f 74 46 6f  [0]!='/' ) NotFo
ba60: 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  und(__LINE__);. 
ba70: 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 52 6f 6f   if( strlen(zRoo
ba80: 74 29 2b 34 30 20 3e 3d 20 73 69 7a 65 6f 66 28  t)+40 >= sizeof(
ba90: 7a 4c 69 6e 65 29 20 29 20 4e 6f 74 46 6f 75 6e  zLine) ) NotFoun
baa0: 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 69  d(__LINE__);.  i
bab0: 66 28 20 7a 48 74 74 70 48 6f 73 74 3d 3d 30 20  f( zHttpHost==0 
bac0: 7c 7c 20 7a 48 74 74 70 48 6f 73 74 5b 30 5d 3d  || zHttpHost[0]=
bad0: 3d 30 20 29 7b 0a 20 20 20 20 4e 6f 74 46 6f 75  =0 ){.    NotFou
bae0: 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  nd(__LINE__);.  
baf0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6c 65 6e  }else if( strlen
bb00: 28 7a 48 74 74 70 48 6f 73 74 29 2b 73 74 72 6c  (zHttpHost)+strl
bb10: 65 6e 28 7a 52 6f 6f 74 29 2b 31 30 20 3e 3d 20  en(zRoot)+10 >= 
bb20: 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 20 29 7b  sizeof(zLine) ){
bb30: 0a 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f  .    NotFound(__
bb40: 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65  LINE__);.  }else
bb50: 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c  {.    sprintf(zL
bb60: 69 6e 65 2c 20 22 25 73 2f 25 73 22 2c 20 7a 52  ine, "%s/%s", zR
bb70: 6f 6f 74 2c 20 7a 48 74 74 70 48 6f 73 74 29 3b  oot, zHttpHost);
bb80: 0a 20 20 20 20 66 6f 72 28 69 3d 73 74 72 6c 65  .    for(i=strle
bb90: 6e 28 7a 52 6f 6f 74 29 2b 31 3b 20 7a 4c 69 6e  n(zRoot)+1; zLin
bba0: 65 5b 69 5d 20 26 26 20 7a 4c 69 6e 65 5b 69 5d  e[i] && zLine[i]
bbb0: 21 3d 27 3a 27 3b 20 69 2b 2b 29 7b 0a 20 20 20  !=':'; i++){.   
bbc0: 20 20 20 69 6e 74 20 63 20 3d 20 7a 4c 69 6e 65     int c = zLine
bbd0: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21  [i];.      if( !
bbe0: 69 73 61 6c 6e 75 6d 28 63 29 20 29 7b 0a 20 20  isalnum(c) ){.  
bbf0: 20 20 20 20 20 20 7a 4c 69 6e 65 5b 69 5d 20 3d        zLine[i] =
bc00: 20 27 5f 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73   '_';.      }els
bc10: 65 20 69 66 28 20 69 73 75 70 70 65 72 28 63 29  e if( isupper(c)
bc20: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e   ){.        zLin
bc30: 65 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72 28 63  e[i] = tolower(c
bc40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
bc50: 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a 4c 69  .    strcpy(&zLi
bc60: 6e 65 5b 69 5d 2c 20 22 2e 77 65 62 73 69 74 65  ne[i], ".website
bc70: 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74  ");.  }.  if( st
bc80: 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75  at(zLine,&statbu
bc90: 66 29 20 7c 7c 20 21 53 5f 49 53 44 49 52 28 73  f) || !S_ISDIR(s
bca0: 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20  tatbuf.st_mode) 
bcb0: 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  ){.    sprintf(z
bcc0: 4c 69 6e 65 2c 20 22 25 73 2f 64 65 66 61 75 6c  Line, "%s/defaul
bcd0: 74 2e 77 65 62 73 69 74 65 22 2c 20 7a 52 6f 6f  t.website", zRoo
bce0: 74 29 3b 0a 20 20 20 20 69 66 28 20 73 74 61 74  t);.    if( stat
bcf0: 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75 66 29  (zLine,&statbuf)
bd00: 20 7c 7c 20 21 53 5f 49 53 44 49 52 28 73 74 61   || !S_ISDIR(sta
bd10: 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 7b  tbuf.st_mode) ){
bd20: 0a 20 20 20 20 20 20 69 66 28 20 73 74 61 6e 64  .      if( stand
bd30: 61 6c 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 20  alone ){.       
bd40: 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20   sprintf(zLine, 
bd50: 22 25 73 22 2c 20 7a 52 6f 6f 74 29 3b 0a 20 20  "%s", zRoot);.  
bd60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
bd70: 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49     NotFound(__LI
bd80: 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  NE__);.      }. 
bd90: 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 48 6f 6d 65     }.  }.  zHome
bda0: 20 3d 20 53 74 72 44 75 70 28 7a 4c 69 6e 65 29   = StrDup(zLine)
bdb0: 3b 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 64  ;..  /* Change d
bdc0: 69 72 65 63 74 6f 72 69 65 73 20 74 6f 20 74 68  irectories to th
bdd0: 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 48 54  e root of the HT
bde0: 54 50 20 66 69 6c 65 73 79 73 74 65 6d 0a 20 20  TP filesystem.  
bdf0: 2a 2f 0a 20 20 69 66 28 20 63 68 64 69 72 28 7a  */.  if( chdir(z
be00: 48 6f 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Home)!=0 ){.    
be10: 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b  char zBuf[1000];
be20: 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e  .    Malfunction
be30: 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 63 61 6e 6e  (__LINE__, "cann
be40: 6f 74 20 63 68 64 69 72 20 74 6f 20 5b 25 73 5d  ot chdir to [%s]
be50: 20 66 72 6f 6d 20 5b 25 73 5d 22 2c 0a 20 20 20   from [%s]",.   
be60: 20 20 20 20 20 20 7a 48 6f 6d 65 2c 20 67 65 74        zHome, get
be70: 63 77 64 28 7a 42 75 66 2c 39 39 39 29 29 3b 0a  cwd(zBuf,999));.
be80: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
be90: 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74 68 65   the file in the
bea0: 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 57 65   filesystem.  We
beb0: 20 6d 69 67 68 74 20 68 61 76 65 20 74 6f 20 61   might have to a
bec0: 70 70 65 6e 64 0a 20 20 2a 2a 20 74 68 65 20 6e  ppend.  ** the n
bed0: 61 6d 65 20 22 69 6e 64 65 78 2e 68 74 6d 6c 22  ame "index.html"
bee0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 69 6e   in order to fin
bef0: 64 20 69 74 2e 20 20 41 6e 79 20 65 78 63 65 73  d it.  Any exces
bf00: 73 20 70 61 74 68 0a 20 20 2a 2a 20 69 6e 66 6f  s path.  ** info
bf10: 72 6d 61 74 69 6f 6e 20 69 73 20 70 75 74 20 69  rmation is put i
bf20: 6e 74 6f 20 74 68 65 20 7a 50 61 74 68 49 6e 66  nto the zPathInf
bf30: 6f 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 2a 2f  o variable..  */
bf40: 0a 20 20 7a 4c 69 6e 65 5b 30 5d 20 3d 20 27 2e  .  zLine[0] = '.
bf50: 27 3b 0a 20 20 69 20 3d 20 30 3b 0a 20 20 77 68  ';.  i = 0;.  wh
bf60: 69 6c 65 28 20 7a 53 63 72 69 70 74 5b 69 5d 20  ile( zScript[i] 
bf70: 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 53  ){.    while( zS
bf80: 63 72 69 70 74 5b 69 5d 20 26 26 20 7a 53 63 72  cript[i] && zScr
bf90: 69 70 74 5b 69 5d 21 3d 27 2f 27 20 29 7b 0a 20  ipt[i]!='/' ){. 
bfa0: 20 20 20 20 20 7a 4c 69 6e 65 5b 69 2b 31 5d 20       zLine[i+1] 
bfb0: 3d 20 7a 53 63 72 69 70 74 5b 69 5d 3b 0a 20 20  = zScript[i];.  
bfc0: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20      i++;.    }. 
bfd0: 20 20 20 7a 4c 69 6e 65 5b 69 2b 31 5d 20 3d 20     zLine[i+1] = 
bfe0: 30 3b 0a 20 20 20 20 69 66 28 20 73 74 61 74 28  0;.    if( stat(
bff0: 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75 66 29 21  zLine,&statbuf)!
c000: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
c010: 73 74 69 6c 6c 53 65 61 72 63 68 69 6e 67 20 3d  stillSearching =
c020: 20 31 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   1;.      while(
c030: 20 73 74 69 6c 6c 53 65 61 72 63 68 69 6e 67 20   stillSearching 
c040: 26 26 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20  && i>0 ){.      
c050: 20 20 77 68 69 6c 65 28 20 69 3e 30 20 26 26 20    while( i>0 && 
c060: 7a 4c 69 6e 65 5b 69 5d 21 3d 27 2f 27 20 29 7b  zLine[i]!='/' ){
c070: 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20   i--; }.        
c080: 73 74 72 63 70 79 28 26 7a 4c 69 6e 65 5b 69 5d  strcpy(&zLine[i]
c090: 2c 20 22 2f 6e 6f 74 2d 66 6f 75 6e 64 2e 68 74  , "/not-found.ht
c0a0: 6d 6c 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ml");.        if
c0b0: 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74  ( stat(zLine,&st
c0c0: 61 74 62 75 66 29 3d 3d 30 20 26 26 20 53 5f 49  atbuf)==0 && S_I
c0d0: 53 52 45 47 28 73 74 61 74 62 75 66 2e 73 74 5f  SREG(statbuf.st_
c0e0: 6d 6f 64 65 29 0a 20 20 20 20 20 20 20 20 20 20  mode).          
c0f0: 20 20 26 26 20 61 63 63 65 73 73 28 7a 4c 69 6e    && access(zLin
c100: 65 2c 52 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20  e,R_OK)==0 ){.  
c110: 20 20 20 20 20 20 20 20 7a 52 65 61 6c 53 63 72          zRealScr
c120: 69 70 74 20 3d 20 53 74 72 44 75 70 28 26 7a 4c  ipt = StrDup(&zL
c130: 69 6e 65 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  ine[1]);.       
c140: 20 20 20 52 65 64 69 72 65 63 74 28 7a 52 65 61     Redirect(zRea
c150: 6c 53 63 72 69 70 74 2c 20 31 29 3b 0a 20 20 20  lScript, 1);.   
c160: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
c170: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
c180: 20 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20          i--;.   
c190: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
c1a0: 20 20 20 20 20 69 66 28 20 73 74 69 6c 6c 53 65       if( stillSe
c1b0: 61 72 63 68 69 6e 67 20 29 20 4e 6f 74 46 6f 75  arching ) NotFou
c1c0: 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  nd(__LINE__);.  
c1d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
c1e0: 0a 20 20 20 20 69 66 28 20 53 5f 49 53 52 45 47  .    if( S_ISREG
c1f0: 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65  (statbuf.st_mode
c200: 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ) ){.      if( a
c210: 63 63 65 73 73 28 7a 4c 69 6e 65 2c 52 5f 4f 4b  ccess(zLine,R_OK
c220: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 4e 6f 74  ) ){.        Not
c230: 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b  Found(__LINE__);
c240: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
c250: 52 65 61 6c 53 63 72 69 70 74 20 3d 20 53 74 72  RealScript = Str
c260: 44 75 70 28 26 7a 4c 69 6e 65 5b 31 5d 29 3b 0a  Dup(&zLine[1]);.
c270: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c280: 20 7d 0a 20 20 20 20 69 66 28 20 7a 53 63 72 69   }.    if( zScri
c290: 70 74 5b 69 5d 3d 3d 30 20 7c 7c 20 7a 53 63 72  pt[i]==0 || zScr
c2a0: 69 70 74 5b 69 2b 31 5d 3d 3d 30 20 29 7b 0a 20  ipt[i+1]==0 ){. 
c2b0: 20 20 20 20 20 73 74 72 63 70 79 28 26 7a 4c 69       strcpy(&zLi
c2c0: 6e 65 5b 69 2b 31 5d 2c 22 2f 69 6e 64 65 78 2e  ne[i+1],"/index.
c2d0: 68 74 6d 6c 22 29 3b 0a 20 20 20 20 20 20 69 66  html");.      if
c2e0: 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74  ( stat(zLine,&st
c2f0: 61 74 62 75 66 29 21 3d 30 20 7c 7c 20 21 53 5f  atbuf)!=0 || !S_
c300: 49 53 52 45 47 28 73 74 61 74 62 75 66 2e 73 74  ISREG(statbuf.st
c310: 5f 6d 6f 64 65 29 20 0a 20 20 20 20 20 20 7c 7c  _mode) .      ||
c320: 20 61 63 63 65 73 73 28 7a 4c 69 6e 65 2c 52 5f   access(zLine,R_
c330: 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  OK) ){.        s
c340: 74 72 63 70 79 28 26 7a 4c 69 6e 65 5b 69 2b 31  trcpy(&zLine[i+1
c350: 5d 2c 22 2f 69 6e 64 65 78 2e 63 67 69 22 29 3b  ],"/index.cgi");
c360: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 61  .        if( sta
c370: 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75 66  t(zLine,&statbuf
c380: 29 21 3d 30 20 7c 7c 20 21 53 5f 49 53 52 45 47  )!=0 || !S_ISREG
c390: 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65  (statbuf.st_mode
c3a0: 29 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 61 63  ) .        || ac
c3b0: 63 65 73 73 28 7a 4c 69 6e 65 2c 52 5f 4f 4b 29  cess(zLine,R_OK)
c3c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 4e 6f   ){.          No
c3d0: 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29  tFound(__LINE__)
c3e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c3f0: 20 20 7d 0a 20 20 20 20 20 20 7a 52 65 61 6c 53    }.      zRealS
c400: 63 72 69 70 74 20 3d 20 53 74 72 44 75 70 28 26  cript = StrDup(&
c410: 7a 4c 69 6e 65 5b 31 5d 29 3b 0a 20 20 20 20 20  zLine[1]);.     
c420: 20 69 66 28 20 7a 53 63 72 69 70 74 5b 69 5d 3d   if( zScript[i]=
c430: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
c440: 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
c450: 64 20 55 52 4c 20 64 6f 65 73 20 6e 6f 74 20 65  d URL does not e
c460: 6e 64 20 77 69 74 68 20 22 2f 22 20 62 75 74 20  nd with "/" but 
c470: 77 65 20 68 61 64 20 74 6f 0a 20 20 20 20 20 20  we had to.      
c480: 20 20 2a 2a 20 61 70 70 65 6e 64 20 22 69 6e 64    ** append "ind
c490: 65 78 2e 68 74 6d 6c 22 2c 20 74 68 65 6e 20 61  ex.html", then a
c4a0: 20 72 65 64 69 72 65 63 74 20 69 73 20 6e 65 63   redirect is nec
c4b0: 65 73 73 61 72 79 2e 20 20 4f 74 68 65 72 77 69  essary.  Otherwi
c4c0: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  se.        ** no
c4d0: 6e 65 20 6f 66 20 74 68 65 20 72 65 6c 61 74 69  ne of the relati
c4e0: 76 65 20 55 52 4c 73 20 69 6e 20 74 68 65 20 64  ve URLs in the d
c4f0: 65 6c 69 76 65 72 65 64 20 64 6f 63 75 6d 65 6e  elivered documen
c500: 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  t will be.      
c510: 20 20 2a 2a 20 63 6f 72 72 65 63 74 2e 20 2a 2f    ** correct. */
c520: 0a 20 20 20 20 20 20 20 20 52 65 64 69 72 65 63  .        Redirec
c530: 74 28 7a 52 65 61 6c 53 63 72 69 70 74 2c 20 31  t(zRealScript, 1
c540: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
c550: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
c560: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
c570: 20 20 7a 4c 69 6e 65 5b 69 2b 31 5d 20 3d 20 7a    zLine[i+1] = z
c580: 53 63 72 69 70 74 5b 69 5d 3b 0a 20 20 20 20 69  Script[i];.    i
c590: 2b 2b 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 20  ++;.  }.  zFile 
c5a0: 3d 20 53 74 72 44 75 70 28 7a 4c 69 6e 65 29 3b  = StrDup(zLine);
c5b0: 0a 20 20 7a 50 61 74 68 49 6e 66 6f 20 3d 20 53  .  zPathInfo = S
c5c0: 74 72 44 75 70 28 26 7a 53 63 72 69 70 74 5b 69  trDup(&zScript[i
c5d0: 5d 29 3b 0a 20 20 6c 65 6e 46 69 6c 65 20 3d 20  ]);.  lenFile = 
c5e0: 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 3b 0a 20  strlen(zFile);. 
c5f0: 20 7a 44 69 72 20 3d 20 53 74 72 44 75 70 28 7a   zDir = StrDup(z
c600: 46 69 6c 65 29 3b 0a 20 20 66 6f 72 28 69 3d 73  File);.  for(i=s
c610: 74 72 6c 65 6e 28 7a 44 69 72 29 2d 31 3b 20 69  trlen(zDir)-1; i
c620: 3e 30 20 26 26 20 7a 44 69 72 5b 69 5d 21 3d 27  >0 && zDir[i]!='
c630: 2f 27 3b 20 69 2d 2d 29 7b 7d 3b 0a 20 20 69 66  /'; i--){};.  if
c640: 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 73  ( i==0 ){.     s
c650: 74 72 63 70 79 28 7a 44 69 72 2c 22 2f 22 29 3b  trcpy(zDir,"/");
c660: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 7a  .  }else{.     z
c670: 44 69 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a  Dir[i] = 0;.  }.
c680: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
c690: 65 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ee if there is a
c6a0: 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  n authorization 
c6b0: 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20  file.  If there 
c6c0: 69 73 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73  is,.  ** process
c6d0: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 70 72 69   it..  */.  spri
c6e0: 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 25 73 2f 2d  ntf(zLine, "%s/-
c6f0: 61 75 74 68 22 2c 20 7a 44 69 72 29 3b 0a 20 20  auth", zDir);.  
c700: 69 66 28 20 61 63 63 65 73 73 28 7a 4c 69 6e 65  if( access(zLine
c710: 2c 52 5f 4f 4b 29 3d 3d 30 20 26 26 20 21 43 68  ,R_OK)==0 && !Ch
c720: 65 63 6b 42 61 73 69 63 41 75 74 68 6f 72 69 7a  eckBasicAuthoriz
c730: 61 74 69 6f 6e 28 7a 4c 69 6e 65 29 20 29 20 72  ation(zLine) ) r
c740: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 61 6b  eturn;..  /* Tak
c750: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 61 63  e appropriate ac
c760: 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  tion.  */.  if( 
c770: 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65  (statbuf.st_mode
c780: 20 26 20 30 31 30 30 29 3d 3d 30 31 30 30 20 26   & 0100)==0100 &
c790: 26 20 61 63 63 65 73 73 28 7a 46 69 6c 65 2c 58  & access(zFile,X
c7a0: 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  _OK)==0 ){.    /
c7b0: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c  *.    ** The fol
c7c0: 6c 6f 77 69 6e 67 73 20 73 74 61 74 69 63 20 76  lowings static v
c7d0: 61 72 69 61 62 6c 65 73 20 61 72 65 20 75 73 65  ariables are use
c7e0: 64 20 74 6f 20 73 65 74 75 70 20 74 68 65 20 65  d to setup the e
c7f0: 6e 76 69 72 6f 6e 6d 65 6e 74 0a 20 20 20 20 2a  nvironment.    *
c800: 2a 20 66 6f 72 20 74 68 65 20 43 47 49 20 73 63  * for the CGI sc
c810: 72 69 70 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ript.    */.    
c820: 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 65 66  static char *def
c830: 61 75 6c 74 5f 70 61 74 68 20 3d 20 22 2f 62 69  ault_path = "/bi
c840: 6e 3a 2f 75 73 72 2f 62 69 6e 22 3b 0a 20 20 20  n:/usr/bin";.   
c850: 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 67 61   static char *ga
c860: 74 65 77 61 79 5f 69 6e 74 65 72 66 61 63 65 20  teway_interface 
c870: 3d 20 22 43 47 49 2f 31 2e 30 22 3b 0a 20 20 20  = "CGI/1.0";.   
c880: 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 7b   static struct {
c890: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 6e  .      char *zEn
c8a0: 76 4e 61 6d 65 3b 0a 20 20 20 20 20 20 63 68 61  vName;.      cha
c8b0: 72 20 2a 2a 70 7a 45 6e 76 56 61 6c 75 65 3b 0a  r **pzEnvValue;.
c8c0: 20 20 20 20 7d 20 63 67 69 65 6e 76 5b 5d 20 3d      } cgienv[] =
c8d0: 20 7b 0a 20 20 20 20 20 20 7b 20 22 41 55 54 48   {.      { "AUTH
c8e0: 5f 54 59 50 45 22 2c 20 20 20 20 20 20 20 20 20  _TYPE",         
c8f0: 20 20 20 20 20 20 20 20 20 20 26 7a 41 75 74 68            &zAuth
c900: 54 79 70 65 20 7d 2c 0a 20 20 20 20 20 20 7b 20  Type },.      { 
c910: 22 41 55 54 48 5f 43 4f 4e 54 45 4e 54 22 2c 20  "AUTH_CONTENT", 
c920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
c930: 7a 41 75 74 68 41 72 67 20 7d 2c 0a 20 20 20 20  zAuthArg },.    
c940: 20 20 7b 20 22 43 4f 4e 54 45 4e 54 5f 4c 45 4e    { "CONTENT_LEN
c950: 47 54 48 22 2c 20 20 20 20 20 20 20 20 20 20 20  GTH",           
c960: 20 20 20 26 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67     &zContentLeng
c970: 74 68 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 43  th },.      { "C
c980: 4f 4e 54 45 4e 54 5f 54 59 50 45 22 2c 20 20 20  ONTENT_TYPE",   
c990: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 43               &zC
c9a0: 6f 6e 74 65 6e 74 54 79 70 65 20 7d 2c 0a 20 20  ontentType },.  
c9b0: 20 20 20 20 7b 20 22 44 4f 43 55 4d 45 4e 54 5f      { "DOCUMENT_
c9c0: 52 4f 4f 54 22 2c 20 20 20 20 20 20 20 20 20 20  ROOT",          
c9d0: 20 20 20 20 20 26 7a 48 6f 6d 65 20 7d 2c 0a 20       &zHome },. 
c9e0: 20 20 20 20 20 7b 20 22 47 41 54 45 57 41 59 5f       { "GATEWAY_
c9f0: 49 4e 54 45 52 46 41 43 45 22 2c 20 20 20 20 20  INTERFACE",     
ca00: 20 20 20 20 20 20 26 67 61 74 65 77 61 79 5f 69        &gateway_i
ca10: 6e 74 65 72 66 61 63 65 20 7d 2c 0a 20 20 20 20  nterface },.    
ca20: 20 20 7b 20 22 48 54 54 50 5f 41 43 43 45 50 54    { "HTTP_ACCEPT
ca30: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
ca40: 20 20 20 26 7a 41 63 63 65 70 74 20 7d 2c 0a 20     &zAccept },. 
ca50: 20 20 20 20 20 7b 20 22 48 54 54 50 5f 43 4f 4f       { "HTTP_COO
ca60: 4b 49 45 22 2c 20 20 20 20 20 20 20 20 20 20 20  KIE",           
ca70: 20 20 20 20 20 20 26 7a 43 6f 6f 6b 69 65 20 7d        &zCookie }
ca80: 2c 0a 20 20 20 20 20 20 7b 20 22 48 54 54 50 5f  ,.      { "HTTP_
ca90: 48 4f 53 54 22 2c 20 20 20 20 20 20 20 20 20 20  HOST",          
caa0: 20 20 20 20 20 20 20 20 20 26 7a 48 74 74 70 48           &zHttpH
cab0: 6f 73 74 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  ost },.      { "
cac0: 48 54 54 50 5f 52 45 46 45 52 45 52 22 2c 20 20  HTTP_REFERER",  
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
cae0: 52 65 66 65 72 65 72 20 7d 2c 0a 20 20 20 20 20  Referer },.     
caf0: 20 7b 20 22 48 54 54 50 5f 55 53 45 52 5f 41 47   { "HTTP_USER_AG
cb00: 45 4e 54 22 2c 20 20 20 20 20 20 20 20 20 20 20  ENT",           
cb10: 20 20 26 7a 41 67 65 6e 74 20 7d 2c 0a 20 20 20    &zAgent },.   
cb20: 20 20 20 7b 20 22 50 41 54 48 22 2c 20 20 20 20     { "PATH",    
cb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb40: 20 20 20 20 26 64 65 66 61 75 6c 74 5f 70 61 74      &default_pat
cb50: 68 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 50 41  h },.      { "PA
cb60: 54 48 5f 49 4e 46 4f 22 2c 20 20 20 20 20 20 20  TH_INFO",       
cb70: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 50 61              &zPa
cb80: 74 68 49 6e 66 6f 20 7d 2c 0a 20 20 20 20 20 20  thInfo },.      
cb90: 7b 20 22 51 55 45 52 59 5f 53 54 52 49 4e 47 22  { "QUERY_STRING"
cba0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
cbb0: 20 26 7a 51 75 65 72 79 53 74 72 69 6e 67 20 7d   &zQueryString }
cbc0: 2c 0a 20 20 20 20 20 20 7b 20 22 52 45 4d 4f 54  ,.      { "REMOT
cbd0: 45 5f 41 44 44 52 22 2c 20 20 20 20 20 20 20 20  E_ADDR",        
cbe0: 20 20 20 20 20 20 20 20 20 26 7a 52 65 6d 6f 74           &zRemot
cbf0: 65 41 64 64 72 20 7d 2c 0a 20 20 20 20 20 20 7b  eAddr },.      {
cc00: 20 22 52 45 51 55 45 53 54 5f 4d 45 54 48 4f 44   "REQUEST_METHOD
cc10: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
cc20: 26 7a 4d 65 74 68 6f 64 20 7d 2c 0a 20 20 20 20  &zMethod },.    
cc30: 20 20 7b 20 22 52 45 51 55 45 53 54 5f 55 52 49    { "REQUEST_URI
cc40: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
cc50: 20 20 20 26 7a 53 63 72 69 70 74 20 7d 2c 0a 20     &zScript },. 
cc60: 20 20 20 20 20 7b 20 22 52 45 4d 4f 54 45 5f 55       { "REMOTE_U
cc70: 53 45 52 22 2c 20 20 20 20 20 20 20 20 20 20 20  SER",           
cc80: 20 20 20 20 20 20 26 7a 52 65 6d 6f 74 65 55 73        &zRemoteUs
cc90: 65 72 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  er },.      { "S
cca0: 43 52 49 50 54 5f 44 49 52 45 43 54 4f 52 59 22  CRIPT_DIRECTORY"
ccb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 44  ,            &zD
ccc0: 69 72 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  ir },.      { "S
ccd0: 43 52 49 50 54 5f 46 49 4c 45 4e 41 4d 45 22 2c  CRIPT_FILENAME",
cce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 46               &zF
ccf0: 69 6c 65 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  ile },.      { "
cd00: 53 43 52 49 50 54 5f 4e 41 4d 45 22 2c 20 20 20  SCRIPT_NAME",   
cd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
cd20: 52 65 61 6c 53 63 72 69 70 74 20 7d 2c 0a 20 20  RealScript },.  
cd30: 20 20 20 20 7b 20 22 53 45 52 56 45 52 5f 4e 41      { "SERVER_NA
cd40: 4d 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ME",            
cd50: 20 20 20 20 20 26 7a 53 65 72 76 65 72 4e 61 6d       &zServerNam
cd60: 65 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 45  e },.      { "SE
cd70: 52 56 45 52 5f 50 4f 52 54 22 2c 20 20 20 20 20  RVER_PORT",     
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 53 65              &zSe
cd90: 72 76 65 72 50 6f 72 74 20 7d 2c 0a 20 20 20 20  rverPort },.    
cda0: 20 20 7b 20 22 53 45 52 56 45 52 5f 50 52 4f 54    { "SERVER_PROT
cdb0: 4f 43 4f 4c 22 2c 20 20 20 20 20 20 20 20 20 20  OCOL",          
cdc0: 20 20 20 26 7a 50 72 6f 74 6f 63 6f 6c 20 7d 2c     &zProtocol },
cdd0: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 68 61 72  .    };.    char
cde0: 20 2a 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 3b   *zBaseFilename;
cdf0: 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 77     /* Filename w
ce00: 69 74 68 6f 75 74 20 64 69 72 65 63 74 6f 72 79  ithout directory
ce10: 20 70 72 65 66 69 78 20 2a 2f 0a 0a 20 20 20 20   prefix */..    
ce20: 2f 2a 20 49 66 20 69 74 73 20 65 78 65 63 75 74  /* If its execut
ce30: 61 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65  able, it must be
ce40: 20 61 20 43 47 49 20 70 72 6f 67 72 61 6d 2e 20   a CGI program. 
ce50: 20 53 74 61 72 74 20 62 79 0a 20 20 20 20 2a 2a   Start by.    **
ce60: 20 63 68 61 6e 67 69 6e 67 20 64 69 72 65 63 74   changing direct
ce70: 6f 72 69 65 73 20 74 6f 20 74 68 65 20 64 69 72  ories to the dir
ce80: 65 63 74 6f 72 79 20 68 6f 6c 64 69 6e 67 20 74  ectory holding t
ce90: 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20  he program..    
cea0: 2a 2f 0a 20 20 20 20 69 66 28 20 63 68 64 69 72  */.    if( chdir
ceb0: 28 7a 44 69 72 29 20 29 7b 0a 20 20 20 20 20 20  (zDir) ){.      
cec0: 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b  char zBuf[1000];
ced0: 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69  .      Malfuncti
cee0: 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 63 61  on(__LINE__, "ca
cef0: 6e 6e 6f 74 20 63 68 64 69 72 20 74 6f 20 5b 25  nnot chdir to [%
cf00: 73 5d 20 66 72 6f 6d 20 5b 25 73 5d 22 2c 20 0a  s] from [%s]", .
cf10: 20 20 20 20 20 20 20 20 20 20 20 7a 44 69 72 2c             zDir,
cf20: 20 67 65 74 63 77 64 28 7a 42 75 66 2c 39 39 39   getcwd(zBuf,999
cf30: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
cf40: 2a 20 53 65 74 75 70 20 74 68 65 20 65 6e 76 69  * Setup the envi
cf50: 72 6f 6e 6d 65 6e 74 20 61 70 70 72 6f 70 72 69  ronment appropri
cf60: 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ately..    */.  
cf70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 69 6e    for(i=0; i<(in
cf80: 74 29 28 73 69 7a 65 6f 66 28 63 67 69 65 6e 76  t)(sizeof(cgienv
cf90: 29 2f 73 69 7a 65 6f 66 28 63 67 69 65 6e 76 5b  )/sizeof(cgienv[
cfa0: 30 5d 29 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  0])); i++){.    
cfb0: 20 20 69 66 28 20 2a 63 67 69 65 6e 76 5b 69 5d    if( *cgienv[i]
cfc0: 2e 70 7a 45 6e 76 56 61 6c 75 65 20 29 7b 0a 20  .pzEnvValue ){. 
cfd0: 20 20 20 20 20 20 20 53 65 74 45 6e 76 28 63 67         SetEnv(cg
cfe0: 69 65 6e 76 5b 69 5d 2e 7a 45 6e 76 4e 61 6d 65  ienv[i].zEnvName
cff0: 2c 2a 63 67 69 65 6e 76 5b 69 5d 2e 70 7a 45 6e  ,*cgienv[i].pzEn
d000: 76 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d  vValue);.      }
d010: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
d020: 73 65 48 74 74 70 73 20 29 7b 0a 20 20 20 20 20  seHttps ){.     
d030: 20 70 75 74 65 6e 76 28 22 48 54 54 50 53 3d 6f   putenv("HTTPS=o
d040: 6e 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n");.    }..    
d050: 2f 2a 0a 20 20 20 20 2a 2a 20 41 62 6f 72 74 20  /*.    ** Abort 
d060: 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 69 66  with an error if
d070: 20 74 68 65 20 43 47 49 20 73 63 72 69 70 74 20   the CGI script 
d080: 69 73 20 77 72 69 74 61 62 6c 65 20 62 79 20 61  is writable by a
d090: 6e 79 6f 6e 65 20 6f 74 68 65 72 0a 20 20 20 20  nyone other.    
d0a0: 2a 2a 20 74 68 61 6e 20 69 74 73 20 6f 77 6e 65  ** than its owne
d0b0: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
d0c0: 28 20 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64  ( statbuf.st_mod
d0d0: 65 20 26 20 30 30 32 32 20 29 7b 0a 20 20 20 20  e & 0022 ){.    
d0e0: 20 20 43 67 69 53 63 72 69 70 74 57 72 69 74 61    CgiScriptWrita
d0f0: 62 6c 65 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ble();.    }..  
d100: 20 20 2f 2a 20 46 6f 72 20 74 68 65 20 50 4f 53    /* For the POS
d110: 54 20 6d 65 74 68 6f 64 20 61 6c 6c 20 69 6e 70  T method all inp
d120: 75 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  ut has been writ
d130: 74 65 6e 20 74 6f 20 61 20 74 65 6d 70 6f 72 61  ten to a tempora
d140: 72 79 20 66 69 6c 65 2c 0a 20 20 20 20 2a 2a 20  ry file,.    ** 
d150: 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 72 65  so we have to re
d160: 64 69 72 65 63 74 20 69 6e 70 75 74 20 74 6f 20  direct input to 
d170: 74 68 65 20 43 47 49 20 73 63 72 69 70 74 20 66  the CGI script f
d180: 72 6f 6d 20 74 68 61 74 20 66 69 6c 65 2e 0a 20  rom that file.. 
d190: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 4d     */.    if( zM
d1a0: 65 74 68 6f 64 5b 30 5d 3d 3d 27 50 27 20 29 7b  ethod[0]=='P' ){
d1b0: 0a 20 20 20 20 20 20 64 75 70 28 30 29 3b 0a 20  .      dup(0);. 
d1c0: 20 20 20 20 20 63 6c 6f 73 65 28 30 29 3b 0a 20       close(0);. 
d1d0: 20 20 20 20 20 6f 70 65 6e 28 7a 54 6d 70 4e 61       open(zTmpNa
d1e0: 6d 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20  m, O_RDONLY);.  
d1f0: 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 73    }..    for(i=s
d200: 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2d 31 3b 20  trlen(zFile)-1; 
d210: 69 3e 3d 30 20 26 26 20 7a 46 69 6c 65 5b 69 5d  i>=0 && zFile[i]
d220: 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20  !='/'; i--){}.  
d230: 20 20 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 20    zBaseFilename 
d240: 3d 20 26 7a 46 69 6c 65 5b 69 2b 31 5d 3b 0a 20  = &zFile[i+1];. 
d250: 20 20 20 69 66 28 20 69 3e 3d 30 20 26 26 20 73     if( i>=0 && s
d260: 74 72 6e 63 6d 70 28 7a 42 61 73 65 46 69 6c 65  trncmp(zBaseFile
d270: 6e 61 6d 65 2c 22 6e 70 68 2d 22 2c 34 29 3d 3d  name,"nph-",4)==
d280: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  0 ){.      /* If
d290: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
d2a0: 20 43 47 49 20 73 63 72 69 70 74 20 62 65 67 69   CGI script begi
d2b0: 6e 73 20 77 69 74 68 20 22 6e 70 68 2d 22 20 74  ns with "nph-" t
d2c0: 68 65 6e 20 77 65 20 61 72 65 0a 20 20 20 20 20  hen we are.     
d2d0: 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68   ** dealing with
d2e0: 20 61 20 22 6e 6f 6e 2d 70 61 72 73 65 64 20 68   a "non-parsed h
d2f0: 65 61 64 65 72 73 22 20 43 47 49 20 73 63 72 69  eaders" CGI scri
d300: 70 74 2e 20 20 4a 75 73 74 20 65 78 65 63 28 29  pt.  Just exec()
d310: 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 64 69 72  .      ** it dir
d320: 65 63 74 6c 79 20 61 6e 64 20 6c 65 74 20 69 74  ectly and let it
d330: 20 68 61 6e 64 6c 65 20 61 6c 6c 20 69 74 73 20   handle all its 
d340: 6f 77 6e 20 68 65 61 64 65 72 20 67 65 6e 65 72  own header gener
d350: 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ation..      */.
d360: 20 20 20 20 20 20 65 78 65 63 6c 28 7a 42 61 73        execl(zBas
d370: 65 46 69 6c 65 6e 61 6d 65 2c 7a 42 61 73 65 46  eFilename,zBaseF
d380: 69 6c 65 6e 61 6d 65 2c 28 63 68 61 72 2a 29 30  ilename,(char*)0
d390: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4e 4f 54 45  );.      /* NOTE
d3a0: 3a 20 4e 6f 20 6c 6f 67 20 65 6e 74 72 79 20 77  : No log entry w
d3b0: 72 69 74 74 65 6e 20 66 6f 72 20 6e 70 68 2d 20  ritten for nph- 
d3c0: 73 63 72 69 70 74 73 20 2a 2f 0a 20 20 20 20 20  scripts */.     
d3d0: 20 65 78 69 74 28 30 29 3b 0a 20 20 20 20 7d 0a   exit(0);.    }.
d3e0: 0a 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72  .    /* Fall thr
d3f0: 75 20 74 6f 20 68 65 72 65 20 6f 6e 6c 79 20 69  u to here only i
d400: 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 28  f this process (
d410: 74 68 65 20 73 65 72 76 65 72 29 20 69 73 20 67  the server) is g
d420: 6f 69 6e 67 0a 20 20 20 20 2a 2a 20 74 6f 20 72  oing.    ** to r
d430: 65 61 64 20 61 6e 64 20 61 75 67 6d 65 6e 74 20  ead and augment 
d440: 74 68 65 20 68 65 61 64 65 72 20 73 65 6e 74 20  the header sent 
d450: 62 61 63 6b 20 62 79 20 74 68 65 20 43 47 49 20  back by the CGI 
d460: 70 72 6f 63 65 73 73 2e 0a 20 20 20 20 2a 2a 20  process..    ** 
d470: 4f 70 65 6e 20 61 20 70 69 70 65 20 74 6f 20 72  Open a pipe to r
d480: 65 63 65 69 76 65 20 74 68 65 20 6f 75 74 70 75  eceive the outpu
d490: 74 20 66 72 6f 6d 20 74 68 65 20 43 47 49 20 70  t from the CGI p
d4a0: 72 6f 63 65 73 73 2e 20 20 54 68 65 6e 0a 20 20  rocess.  Then.  
d4b0: 20 20 2a 2a 20 66 6f 72 6b 20 74 68 65 20 43 47    ** fork the CG
d4c0: 49 20 70 72 6f 63 65 73 73 2e 20 20 4f 6e 63 65  I process.  Once
d4d0: 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 64   everything is d
d4e0: 6f 6e 65 2c 20 77 65 20 73 68 6f 75 6c 64 20 62  one, we should b
d4f0: 65 0a 20 20 20 20 2a 2a 20 61 62 6c 65 20 74 6f  e.    ** able to
d500: 20 72 65 61 64 20 74 68 65 20 6f 75 74 70 75 74   read the output
d510: 20 6f 66 20 43 47 49 20 6f 6e 20 74 68 65 20 22   of CGI on the "
d520: 69 6e 22 20 73 74 72 65 61 6d 2e 0a 20 20 20 20  in" stream..    
d530: 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69  */.    {.      i
d540: 6e 74 20 70 78 5b 32 5d 3b 0a 20 20 20 20 20 20  nt px[2];.      
d550: 70 69 70 65 28 70 78 29 3b 0a 20 20 20 20 20 20  pipe(px);.      
d560: 69 66 28 20 66 6f 72 6b 28 29 3d 3d 30 20 29 7b  if( fork()==0 ){
d570: 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 70  .        close(p
d580: 78 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 63  x[0]);.        c
d590: 6c 6f 73 65 28 31 29 3b 0a 20 20 20 20 20 20 20  lose(1);.       
d5a0: 20 64 75 70 28 70 78 5b 31 5d 29 3b 0a 20 20 20   dup(px[1]);.   
d5b0: 20 20 20 20 20 63 6c 6f 73 65 28 70 78 5b 31 5d       close(px[1]
d5c0: 29 3b 0a 20 20 20 20 20 20 20 20 65 78 65 63 6c  );.        execl
d5d0: 28 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c 20  (zBaseFilename, 
d5e0: 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c 20 28  zBaseFilename, (
d5f0: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
d600: 20 20 65 78 69 74 28 30 29 3b 0a 20 20 20 20 20    exit(0);.     
d610: 20 7d 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 70   }.      close(p
d620: 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 6e 20  x[1]);.      in 
d630: 3d 20 66 64 6f 70 65 6e 28 70 78 5b 30 5d 2c 20  = fdopen(px[0], 
d640: 22 72 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  "r");.    }.    
d650: 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  if( in==0 ){.   
d660: 20 20 20 43 67 69 45 72 72 6f 72 28 29 3b 0a 20     CgiError();. 
d670: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 61     }..    /* Rea
d680: 64 20 61 6e 64 20 70 72 6f 63 65 73 73 20 74 68  d and process th
d690: 65 20 66 69 72 73 74 20 6c 69 6e 65 20 6f 66 20  e first line of 
d6a0: 74 68 65 20 68 65 61 64 65 72 20 72 65 74 75 72  the header retur
d6b0: 6e 65 64 20 62 79 20 74 68 65 0a 20 20 20 20 2a  ned by the.    *
d6c0: 2a 20 43 47 49 20 73 63 72 69 70 74 2e 0a 20 20  * CGI script..  
d6d0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 65    */.    if( use
d6e0: 54 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d 28  Timeout ) alarm(
d6f0: 31 35 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  15);.    while( 
d700: 66 67 65 74 73 28 7a 4c 69 6e 65 2c 73 69 7a 65  fgets(zLine,size
d710: 6f 66 28 7a 4c 69 6e 65 29 2c 69 6e 29 20 29 7b  of(zLine),in) ){
d720: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63  .      if( strnc
d730: 6d 70 28 7a 4c 69 6e 65 2c 22 4c 6f 63 61 74 69  mp(zLine,"Locati
d740: 6f 6e 3a 22 2c 39 29 3d 3d 30 20 29 7b 0a 20 20  on:",9)==0 ){.  
d750: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
d760: 20 20 20 20 20 52 65 6d 6f 76 65 4e 65 77 6c 69       RemoveNewli
d770: 6e 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20  ne(zLine);.     
d780: 20 20 20 7a 20 3d 20 26 7a 4c 69 6e 65 5b 31 30     z = &zLine[10
d790: 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ];.        while
d7a0: 28 20 69 73 73 70 61 63 65 28 2a 7a 29 20 29 7b  ( isspace(*z) ){
d7b0: 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20   z++; }.        
d7c0: 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
d7d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
d7e0: 66 28 20 7a 5b 69 5d 3d 3d 27 3f 27 20 29 7b 0a  f( z[i]=='?' ){.
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65              zQue
d800: 72 79 53 75 66 66 69 78 20 3d 20 53 74 72 44 75  rySuffix = StrDu
d810: 70 28 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20  p("");.         
d820: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
d830: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 69 66       .        if
d840: 28 20 7a 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 7a  ( z[0]=='/' && z
d850: 5b 31 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [1]=='/' ){.    
d860: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 63 68        /* The sch
d870: 65 6d 65 20 69 73 20 6d 69 73 73 69 6e 67 2e 20  eme is missing. 
d880: 20 41 64 64 20 69 74 20 69 6e 20 62 65 66 6f 72   Add it in befor
d890: 65 20 72 65 64 69 72 65 63 74 69 6e 67 20 2a 2f  e redirecting */
d8a0: 0a 20 20 20 20 20 20 20 20 20 20 53 74 61 72 74  .          Start
d8b0: 52 65 73 70 6f 6e 73 65 28 22 33 30 32 20 52 65  Response("302 Re
d8c0: 64 69 72 65 63 74 22 29 3b 0a 20 20 20 20 20 20  direct");.      
d8d0: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
d8e0: 74 66 28 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73  tf("Location: %s
d8f0: 3a 25 73 25 73 5c 72 5c 6e 22 2c 7a 48 74 74 70  :%s%s\r\n",zHttp
d900: 2c 7a 2c 7a 51 75 65 72 79 53 75 66 66 69 78 29  ,z,zQuerySuffix)
d910: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
d920: 6b 3b 20 2f 2a 20 44 4b 20 2a 2f 0a 20 20 20 20  k; /* DK */.    
d930: 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74        MakeLogEnt
d940: 72 79 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20  ry(0);.         
d950: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
d960: 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30 5d 3d   }else if( z[0]=
d970: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
d980: 20 20 2f 2a 20 54 68 65 20 73 63 68 65 6d 65 20    /* The scheme 
d990: 61 6e 64 20 6e 65 74 77 6f 72 6b 20 6c 6f 63 61  and network loca
d9a0: 74 69 6f 6e 20 61 72 65 20 6d 69 73 73 69 6e 67  tion are missing
d9b0: 20 62 75 74 20 77 65 20 68 61 76 65 0a 20 20 20   but we have.   
d9c0: 20 20 20 20 20 20 20 2a 2a 20 61 6e 20 61 62 73         ** an abs
d9d0: 6f 6c 75 74 65 20 70 61 74 68 2e 20 2a 2f 0a 20  olute path. */. 
d9e0: 20 20 20 20 20 20 20 20 20 52 65 64 69 72 65 63           Redirec
d9f0: 74 28 7a 2c 20 30 29 3b 20 2f 2a 20 44 4b 20 2a  t(z, 0); /* DK *
da00: 2f 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  /.          brea
da10: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
da20: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
da30: 20 73 65 65 20 69 66 20 74 68 65 72 65 20 69 73   see if there is
da40: 20 61 20 73 63 68 65 6d 65 20 70 72 65 66 69 78   a scheme prefix
da50: 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
da60: 69 3d 30 3b 20 7a 5b 69 5d 20 26 26 20 7a 5b 69  i=0; z[i] && z[i
da70: 5d 21 3d 27 3a 27 20 26 26 20 7a 5b 69 5d 21 3d  ]!=':' && z[i]!=
da80: 27 2f 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  '/'; i++){}.    
da90: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 3a      if( z[i]==':
daa0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ' ){.          /
dab0: 2a 20 57 65 20 68 61 76 65 20 61 20 73 63 68 65  * We have a sche
dac0: 6d 65 2e 20 20 41 73 73 75 6d 65 20 74 68 65 72  me.  Assume ther
dad0: 65 20 69 73 20 61 6e 20 61 62 73 6f 6c 75 74 65  e is an absolute
dae0: 20 55 52 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20   URL */.        
daf0: 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28    StartResponse(
db00: 22 33 30 32 20 52 65 64 69 72 65 63 74 22 29 3b  "302 Redirect");
db10: 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20  .          nOut 
db20: 2b 3d 20 70 72 69 6e 74 66 28 22 4c 6f 63 61 74  += printf("Locat
db30: 69 6f 6e 3a 20 25 73 25 73 5c 72 5c 6e 22 2c 7a  ion: %s%s\r\n",z
db40: 2c 7a 51 75 65 72 79 53 75 66 66 69 78 29 3b 0a  ,zQuerySuffix);.
db50: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
db60: 20 2f 2a 20 44 4b 20 2a 2f 0a 20 20 20 20 20 20   /* DK */.      
db70: 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79      MakeLogEntry
db80: 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  (0);.          r
db90: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d  eturn;.        }
dba0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74  .        /* Must
dbb0: 20 62 65 20 61 20 72 65 6c 61 74 69 76 65 20 70   be a relative p
dbc0: 61 74 68 6e 61 6d 65 2e 20 20 43 6f 6e 73 74 72  athname.  Constr
dbd0: 75 63 74 20 74 68 65 20 61 62 73 6f 6c 75 74 65  uct the absolute
dbe0: 20 70 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20   pathname.      
dbf0: 20 20 2a 2a 20 61 6e 64 20 72 65 64 69 72 65 63    ** and redirec
dc00: 74 20 74 6f 20 69 74 2e 20 2a 2f 0a 20 20 20 20  t to it. */.    
dc10: 20 20 20 20 69 20 3d 20 73 74 72 6c 65 6e 28 7a      i = strlen(z
dc20: 52 65 61 6c 53 63 72 69 70 74 29 3b 0a 20 20 20  RealScript);.   
dc30: 20 20 20 20 20 77 68 69 6c 65 28 20 69 3e 30 20       while( i>0 
dc40: 26 26 20 7a 52 65 61 6c 53 63 72 69 70 74 5b 69  && zRealScript[i
dc50: 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 69 2d 2d 3b  -1]!='/' ){ i--;
dc60: 20 7d 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65   }.        while
dc70: 28 20 69 3e 30 20 26 26 20 7a 52 65 61 6c 53 63  ( i>0 && zRealSc
dc80: 72 69 70 74 5b 69 2d 31 5d 3d 3d 27 2f 27 20 29  ript[i-1]=='/' )
dc90: 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20  { i--; }.       
dca0: 20 77 68 69 6c 65 28 20 2a 7a 3d 3d 27 2e 27 20   while( *z=='.' 
dcb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
dcc0: 20 7a 5b 31 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20   z[1]=='/' ){.  
dcd0: 20 20 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 32            z += 2
dce0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
dcf0: 65 20 69 66 28 20 7a 5b 31 5d 3d 3d 27 2e 27 20  e if( z[1]=='.' 
dd00: 26 26 20 7a 5b 32 5d 3d 3d 27 2f 27 20 29 7b 0a  && z[2]=='/' ){.
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c              whil
dd20: 65 28 20 69 3e 30 20 26 26 20 7a 52 65 61 6c 53  e( i>0 && zRealS
dd30: 63 72 69 70 74 5b 69 2d 31 5d 21 3d 27 2f 27 20  cript[i-1]!='/' 
dd40: 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ i--; }.      
dd50: 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3e 30        while( i>0
dd60: 20 26 26 20 7a 52 65 61 6c 53 63 72 69 70 74 5b   && zRealScript[
dd70: 69 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 69 2d 2d  i-1]=='/' ){ i--
dd80: 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ; }.            
dd90: 7a 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20 20  z += 3;.        
dda0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ddb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ddc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ddd0: 7d 0a 20 20 20 20 20 20 20 20 53 74 61 72 74 52  }.        StartR
dde0: 65 73 70 6f 6e 73 65 28 22 33 30 32 20 52 65 64  esponse("302 Red
ddf0: 69 72 65 63 74 22 29 3b 0a 20 20 20 20 20 20 20  irect");.       
de00: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
de10: 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73 3a 2f 2f  "Location: %s://
de20: 25 73 22 2c 7a 48 74 74 70 2c 7a 53 65 72 76 65  %s",zHttp,zServe
de30: 72 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  rName);.        
de40: 69 66 28 20 73 74 72 63 6d 70 28 7a 53 65 72 76  if( strcmp(zServ
de50: 65 72 50 6f 72 74 2c 22 38 30 22 29 20 29 7b 0a  erPort,"80") ){.
de60: 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20 2b            nOut +
de70: 3d 20 70 72 69 6e 74 66 28 22 3a 25 73 22 2c 7a  = printf(":%s",z
de80: 53 65 72 76 65 72 50 6f 72 74 29 3b 0a 20 20 20  ServerPort);.   
de90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
dea0: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 25  Out += printf("%
deb0: 2e 2a 73 2f 25 73 25 73 5c 72 5c 6e 5c 72 5c 6e  .*s/%s%s\r\n\r\n
dec0: 22 2c 69 2c 7a 52 65 61 6c 53 63 72 69 70 74 2c  ",i,zRealScript,
ded0: 7a 2c 7a 51 75 65 72 79 53 75 66 66 69 78 29 3b  z,zQuerySuffix);
dee0: 0a 20 20 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67  .        MakeLog
def0: 45 6e 74 72 79 28 30 29 3b 0a 20 20 20 20 20 20  Entry(0);.      
df00: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
df10: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d  }else if( strncm
df20: 70 28 7a 4c 69 6e 65 2c 22 53 74 61 74 75 73 3a  p(zLine,"Status:
df30: 22 2c 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ",7)==0 ){.     
df40: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
df50: 20 20 66 6f 72 28 69 3d 37 3b 20 69 73 73 70 61    for(i=7; isspa
df60: 63 65 28 7a 4c 69 6e 65 5b 69 5d 29 3b 20 69 2b  ce(zLine[i]); i+
df70: 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 6e 4f 75  +){}.        nOu
df80: 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 25 73 20  t += printf("%s 
df90: 25 73 22 2c 20 7a 50 72 6f 74 6f 63 6f 6c 2c 20  %s", zProtocol, 
dfa0: 26 7a 4c 69 6e 65 5b 69 5d 29 3b 0a 20 20 20 20  &zLine[i]);.    
dfb0: 20 20 20 20 73 74 72 6e 63 70 79 28 7a 52 65 70      strncpy(zRep
dfc0: 6c 79 53 74 61 74 75 73 2c 20 26 7a 4c 69 6e 65  lyStatus, &zLine
dfd0: 5b 69 5d 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  [i], 3);.       
dfe0: 20 7a 52 65 70 6c 79 53 74 61 74 75 73 5b 33 5d   zReplyStatus[3]
dff0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 74   = 0;.        st
e000: 61 74 75 73 53 65 6e 74 20 3d 20 31 3b 0a 20 20  atusSent = 1;.  
e010: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e020: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e030: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
e040: 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22   StartResponse("
e050: 32 30 30 20 4f 4b 22 29 3b 0a 20 20 20 20 20 20  200 OK");.      
e060: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
e070: 28 22 25 73 22 2c 7a 4c 69 6e 65 29 3b 0a 20 20  ("%s",zLine);.  
e080: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a        for(i=0; z
e090: 4c 69 6e 65 5b 69 5d 20 26 26 20 21 69 73 73 70  Line[i] && !issp
e0a0: 61 63 65 28 7a 4c 69 6e 65 5b 69 5d 29 20 26 26  ace(zLine[i]) &&
e0b0: 20 7a 4c 69 6e 65 5b 69 5d 21 3d 27 3a 27 3b 20   zLine[i]!=':'; 
e0c0: 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 69  i++){}.        i
e0d0: 66 28 20 69 3c 32 20 7c 7c 20 7a 4c 69 6e 65 5b  f( i<2 || zLine[
e0e0: 69 5d 21 3d 27 3a 27 20 29 20 62 72 65 61 6b 3b  i]!=':' ) break;
e0f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
e100: 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 76 65 72      /* Copy ever
e110: 79 74 68 69 6e 67 20 65 6c 73 65 20 74 68 72 75  ything else thru
e120: 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 65 20   without change 
e130: 6f 72 20 61 6e 61 6c 79 73 69 73 2e 0a 20 20 20  or analysis..   
e140: 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 65 54   */.    if( useT
e150: 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d 28 36  imeout ) alarm(6
e160: 30 2a 35 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  0*5);.    while(
e170: 20 28 63 20 3d 20 67 65 74 63 28 69 6e 29 29 21   (c = getc(in))!
e180: 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20 20 70 75  =EOF ){.      pu
e190: 74 63 28 63 2c 73 74 64 6f 75 74 29 3b 0a 20 20  tc(c,stdout);.  
e1a0: 20 20 20 20 6e 4f 75 74 2b 2b 3b 0a 20 20 20 20      nOut++;.    
e1b0: 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29  }.    fclose(in)
e1c0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63 6f  ;.  }else if( co
e1d0: 75 6e 74 53 6c 61 73 68 65 73 28 7a 52 65 61 6c  untSlashes(zReal
e1e0: 53 63 72 69 70 74 29 21 3d 63 6f 75 6e 74 53 6c  Script)!=countSl
e1f0: 61 73 68 65 73 28 7a 53 63 72 69 70 74 29 20 29  ashes(zScript) )
e200: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
e210: 72 65 71 75 65 73 74 20 55 52 49 20 66 6f 72 20  request URI for 
e220: 73 74 61 74 69 63 20 63 6f 6e 74 65 6e 74 20 63  static content c
e230: 6f 6e 74 61 69 6e 73 20 6d 61 74 65 72 69 61 6c  ontains material
e240: 20 70 61 73 74 20 74 68 65 0a 20 20 20 20 2a 2a   past the.    **
e250: 20 61 63 74 75 61 6c 20 63 6f 6e 74 65 6e 74 20   actual content 
e260: 66 69 6c 65 20 6e 61 6d 65 2c 20 72 65 70 6f 72  file name, repor
e270: 74 20 74 68 61 74 20 61 73 20 61 20 34 30 34 20  t that as a 404 
e280: 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 4e 6f  error. */.    No
e290: 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29  tFound(__LINE__)
e2a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
e2b0: 2a 20 49 66 20 69 74 20 69 73 6e 27 74 20 65 78  * If it isn't ex
e2c0: 65 63 75 74 61 62 6c 65 20 74 68 65 6e 20 69 74  ecutable then it
e2d0: 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 61 20 73  .    ** must a s
e2e0: 69 6d 70 6c 65 20 66 69 6c 65 20 74 68 61 74 20  imple file that 
e2f0: 6e 65 65 64 73 20 74 6f 20 62 65 20 63 6f 70 69  needs to be copi
e300: 65 64 20 74 6f 20 6f 75 74 70 75 74 2e 0a 20 20  ed to output..  
e310: 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63    */.    const c
e320: 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 54 79 70  har *zContentTyp
e330: 65 20 3d 20 47 65 74 4d 69 6d 65 54 79 70 65 28  e = GetMimeType(
e340: 7a 46 69 6c 65 2c 20 6c 65 6e 46 69 6c 65 29 3b  zFile, lenFile);
e350: 0a 0a 20 20 20 20 69 66 28 20 7a 54 6d 70 4e 61  ..    if( zTmpNa
e360: 6d 20 29 20 75 6e 6c 69 6e 6b 28 7a 54 6d 70 4e  m ) unlink(zTmpN
e370: 61 6d 29 3b 0a 20 20 20 20 69 6e 20 3d 20 66 6f  am);.    in = fo
e380: 70 65 6e 28 7a 46 69 6c 65 2c 22 72 22 29 3b 0a  pen(zFile,"r");.
e390: 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20      if( in==0 ) 
e3a0: 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f  NotFound(__LINE_
e3b0: 5f 29 3b 0a 20 20 20 20 53 74 61 72 74 52 65 73  _);.    StartRes
e3c0: 70 6f 6e 73 65 28 22 32 30 30 20 4f 4b 22 29 3b  ponse("200 OK");
e3d0: 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 44 61 74  .    nOut += Dat
e3e0: 65 54 61 67 28 22 4c 61 73 74 2d 4d 6f 64 69 66  eTag("Last-Modif
e3f0: 69 65 64 22 2c 20 73 74 61 74 62 75 66 2e 73 74  ied", statbuf.st
e400: 5f 6d 74 69 6d 65 29 3b 0a 20 20 20 20 6e 4f 75  _mtime);.    nOu
e410: 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e  t += printf("Con
e420: 74 65 6e 74 2d 74 79 70 65 3a 20 25 73 5c 72 5c  tent-type: %s\r\
e430: 6e 22 2c 7a 43 6f 6e 74 65 6e 74 54 79 70 65 29  n",zContentType)
e440: 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72  ;.    nOut += pr
e450: 69 6e 74 66 28 22 43 6f 6e 74 65 6e 74 2d 6c 65  intf("Content-le
e460: 6e 67 74 68 3a 20 25 64 5c 72 5c 6e 5c 72 5c 6e  ngth: %d\r\n\r\n
e470: 22 2c 28 69 6e 74 29 73 74 61 74 62 75 66 2e 73  ",(int)statbuf.s
e480: 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 66 66 6c  t_size);.    ffl
e490: 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20  ush(stdout);.   
e4a0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4d 65 74   if( strcmp(zMet
e4b0: 68 6f 64 2c 22 48 45 41 44 22 29 3d 3d 30 20 29  hod,"HEAD")==0 )
e4c0: 7b 0a 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45  {.      MakeLogE
e4d0: 6e 74 72 79 28 30 29 3b 0a 20 20 20 20 20 20 66  ntry(0);.      f
e4e0: 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20  close(in);.     
e4f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
e500: 20 20 20 69 66 28 20 75 73 65 54 69 6d 65 6f 75     if( useTimeou
e510: 74 20 29 20 61 6c 61 72 6d 28 33 30 20 2b 20 73  t ) alarm(30 + s
e520: 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 2f 31  tatbuf.st_size/1
e530: 30 30 30 29 3b 0a 23 69 66 64 65 66 20 6c 69 6e  000);.#ifdef lin
e540: 75 78 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 6f  ux.    {.      o
e550: 66 66 5f 74 20 6f 66 66 73 65 74 20 3d 20 30 3b  ff_t offset = 0;
e560: 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 73  .      nOut += s
e570: 65 6e 64 66 69 6c 65 28 66 69 6c 65 6e 6f 28 73  endfile(fileno(s
e580: 74 64 6f 75 74 29 2c 20 66 69 6c 65 6e 6f 28 69  tdout), fileno(i
e590: 6e 29 2c 20 26 6f 66 66 73 65 74 2c 20 73 74 61  n), &offset, sta
e5a0: 74 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 20  tbuf.st_size);. 
e5b0: 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 77     }.#else.    w
e5c0: 68 69 6c 65 28 20 28 63 20 3d 20 67 65 74 63 28  hile( (c = getc(
e5d0: 69 6e 29 29 21 3d 45 4f 46 20 29 7b 0a 20 20 20  in))!=EOF ){.   
e5e0: 20 20 20 70 75 74 63 28 63 2c 73 74 64 6f 75 74     putc(c,stdout
e5f0: 29 3b 0a 20 20 20 20 20 20 6e 4f 75 74 2b 2b 3b  );.      nOut++;
e600: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
e610: 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
e620: 7d 0a 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75  }.  fflush(stdou
e630: 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74  t);.  MakeLogEnt
e640: 72 79 28 30 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  ry(0);..  /* The
e650: 20 6e 65 78 74 20 72 65 71 75 65 73 74 20 6d 75   next request mu
e660: 73 74 20 61 72 72 69 76 65 20 77 69 74 68 69 6e  st arrive within
e670: 20 33 30 20 73 65 63 6f 6e 64 73 20 6f 72 20 77   30 seconds or w
e680: 65 20 63 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e  e close the conn
e690: 65 63 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6f 6d  ection.  */.  om
e6a0: 69 74 4c 6f 67 20 3d 20 31 3b 0a 20 20 69 66 28  itLog = 1;.  if(
e6b0: 20 75 73 65 54 69 6d 65 6f 75 74 20 29 20 61 6c   useTimeout ) al
e6c0: 61 72 6d 28 33 30 29 3b 0a 7d 0a 0a 23 64 65 66  arm(30);.}..#def
e6d0: 69 6e 65 20 4d 41 58 5f 50 41 52 41 4c 4c 45 4c  ine MAX_PARALLEL
e6e0: 20 35 30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f   50  /* Number o
e6f0: 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 63  f simultaneous c
e700: 68 69 6c 64 72 65 6e 20 2a 2f 0a 0a 2f 2a 0a 2a  hildren */../*.*
e710: 2a 20 41 6c 6c 20 70 6f 73 73 69 62 6c 65 20 66  * All possible f
e720: 6f 72 6d 73 20 6f 66 20 61 6e 20 49 50 20 61 64  orms of an IP ad
e730: 64 72 65 73 73 2e 20 20 4e 65 65 64 65 64 20 74  dress.  Needed t
e740: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 47 43  o work around GC
e750: 43 20 73 74 72 69 63 74 0a 2a 2a 20 61 6c 69 61  C strict.** alia
e760: 73 69 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a 74  sing rules..*/.t
e770: 79 70 65 64 65 66 20 75 6e 69 6f 6e 20 7b 0a 20  ypedef union {. 
e780: 20 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72   struct sockaddr
e790: 20 73 61 3b 20 20 20 20 20 20 20 20 20 20 20 20   sa;            
e7a0: 20 20 2f 2a 20 41 62 73 74 72 61 63 74 20 73 75    /* Abstract su
e7b0: 70 65 72 63 6c 61 73 73 20 2a 2f 0a 20 20 73 74  perclass */.  st
e7c0: 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e  ruct sockaddr_in
e7d0: 20 73 61 34 3b 20 20 20 20 20 20 20 20 20 20 2f   sa4;          /
e7e0: 2a 20 49 50 76 34 20 2a 2f 0a 20 20 73 74 72 75  * IPv4 */.  stru
e7f0: 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 36 20  ct sockaddr_in6 
e800: 73 61 36 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  sa6;         /* 
e810: 49 50 76 36 20 2a 2f 0a 20 20 73 74 72 75 63 74  IPv6 */.  struct
e820: 20 73 6f 63 6b 61 64 64 72 5f 73 74 6f 72 61 67   sockaddr_storag
e830: 65 20 73 61 73 3b 20 20 20 20 20 2f 2a 20 53 68  e sas;     /* Sh
e840: 6f 75 6c 64 20 62 65 20 74 68 65 20 6d 61 78 69  ould be the maxi
e850: 6d 75 6d 20 6f 66 20 74 68 65 20 61 62 6f 76 65  mum of the above
e860: 20 33 20 2a 2f 0a 7d 20 61 64 64 72 65 73 73 3b   3 */.} address;
e870: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
e880: 74 20 61 6e 20 48 54 54 50 20 73 65 72 76 65 72  t an HTTP server
e890: 20 64 61 65 6d 6f 6e 20 6c 69 73 74 65 6e 69 6e   daemon listenin
e8a0: 67 20 6f 6e 20 70 6f 72 74 20 69 50 6f 72 74 2e  g on port iPort.
e8b0: 0a 2a 2a 0a 2a 2a 20 41 73 20 6e 65 77 20 63 6f  .**.** As new co
e8c0: 6e 6e 65 63 74 69 6f 6e 73 20 61 72 72 69 76 65  nnections arrive
e8d0: 2c 20 66 6f 72 6b 20 61 20 63 68 69 6c 64 20 61  , fork a child a
e8e0: 6e 64 20 6c 65 74 20 63 68 69 6c 64 20 72 65 74  nd let child ret
e8f0: 75 72 6e 0a 2a 2a 20 6f 75 74 20 6f 66 20 74 68  urn.** out of th
e900: 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 61 6c  is procedure cal
e910: 6c 2e 20 20 54 68 65 20 63 68 69 6c 64 20 77 69  l.  The child wi
e920: 6c 6c 20 68 61 6e 64 6c 65 20 74 68 65 20 72 65  ll handle the re
e930: 71 75 65 73 74 2e 0a 2a 2a 20 54 68 65 20 70 61  quest..** The pa
e940: 72 65 6e 74 20 6e 65 76 65 72 20 72 65 74 75 72  rent never retur
e950: 6e 73 20 66 72 6f 6d 20 74 68 69 73 20 70 72 6f  ns from this pro
e960: 63 65 64 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  cedure..**.** Re
e970: 74 75 72 6e 20 30 20 74 6f 20 65 61 63 68 20 63  turn 0 to each c
e980: 68 69 6c 64 20 61 73 20 69 74 20 72 75 6e 73 2e  hild as it runs.
e990: 20 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 65    If unable to e
e9a0: 73 74 61 62 6c 69 73 68 20 61 0a 2a 2a 20 6c 69  stablish a.** li
e9b0: 73 74 65 6e 69 6e 67 20 73 6f 63 6b 65 74 2c 20  stening socket, 
e9c0: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e  return non-zero.
e9d0: 0a 2a 2f 0a 69 6e 74 20 68 74 74 70 5f 73 65 72  .*/.int http_ser
e9e0: 76 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ver(const char *
e9f0: 7a 50 6f 72 74 2c 20 69 6e 74 20 6c 6f 63 61 6c  zPort, int local
ea00: 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 6c 69 73  Only){.  int lis
ea10: 74 65 6e 65 72 5b 32 30 5d 3b 20 20 20 20 20 20  tener[20];      
ea20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 65 72        /* The ser
ea30: 76 65 72 20 73 6f 63 6b 65 74 73 20 2a 2f 0a 20  ver sockets */. 
ea40: 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 3b   int connection;
ea50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ea60: 20 41 20 73 6f 63 6b 65 74 20 66 6f 72 20 65 61   A socket for ea
ea70: 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 63 6f  ch individual co
ea80: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 66 64  nnection */.  fd
ea90: 5f 73 65 74 20 72 65 61 64 66 64 73 3b 20 20 20  _set readfds;   
eaa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
eab0: 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69  t of file descri
eac0: 70 74 6f 72 73 20 66 6f 72 20 73 65 6c 65 63 74  ptors for select
ead0: 28 29 20 2a 2f 0a 20 20 61 64 64 72 65 73 73 20  () */.  address 
eae0: 69 6e 61 64 64 72 3b 20 20 20 20 20 20 20 20 20  inaddr;         
eaf0: 20 20 20 20 20 2f 2a 20 52 65 6d 6f 74 65 20 61       /* Remote a
eb00: 64 64 72 65 73 73 20 2a 2f 0a 20 20 73 6f 63 6b  ddress */.  sock
eb10: 6c 65 6e 5f 74 20 6c 65 6e 61 64 64 72 3b 20 20  len_t lenaddr;  
eb20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
eb30: 74 68 20 6f 66 20 74 68 65 20 69 6e 61 64 64 72  th of the inaddr
eb40: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
eb50: 69 6e 74 20 63 68 69 6c 64 3b 20 20 20 20 20 20  int child;      
eb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eb70: 50 49 44 20 6f 66 20 74 68 65 20 63 68 69 6c 64  PID of the child
eb80: 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 69 6e   process */.  in
eb90: 74 20 6e 63 68 69 6c 64 72 65 6e 20 3d 20 30 3b  t nchildren = 0;
eba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
ebb0: 6d 62 65 72 20 6f 66 20 63 68 69 6c 64 20 70 72  mber of child pr
ebc0: 6f 63 65 73 73 65 73 20 2a 2f 0a 20 20 73 74 72  ocesses */.  str
ebd0: 75 63 74 20 74 69 6d 65 76 61 6c 20 64 65 6c 61  uct timeval dela
ebe0: 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77  y;        /* How
ebf0: 20 6c 6f 6e 67 20 74 6f 20 77 61 69 74 20 69 6e   long to wait in
ec00: 73 69 64 65 20 73 65 6c 65 63 74 28 29 20 2a 2f  side select() */
ec10: 0a 20 20 69 6e 74 20 6f 70 74 20 3d 20 31 3b 20  .  int opt = 1; 
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec30: 2f 2a 20 73 65 74 73 6f 63 6b 6f 70 74 20 66 6c  /* setsockopt fl
ec40: 61 67 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61  ag */.  struct a
ec50: 64 64 72 69 6e 66 6f 20 73 48 69 6e 74 73 3b 20  ddrinfo sHints; 
ec60: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
ec70: 68 69 6e 74 73 20 2a 2f 0a 20 20 73 74 72 75 63  hints */.  struc
ec80: 74 20 61 64 64 72 69 6e 66 6f 20 2a 70 41 64 64  t addrinfo *pAdd
ec90: 72 73 2c 20 2a 70 3b 20 2f 2a 20 2a 2f 0a 20 20  rs, *p; /* */.  
eca0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
ecb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ecc0: 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
ecd0: 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 6e 74   int i, n;.  int
ece0: 20 6d 61 78 46 64 20 3d 20 2d 31 3b 0a 20 20 0a   maxFd = -1;.  .
ecf0: 20 20 6d 65 6d 73 65 74 28 26 73 48 69 6e 74 73    memset(&sHints
ed00: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 48 69 6e  , 0, sizeof(sHin
ed10: 74 73 29 29 3b 0a 20 20 69 66 28 20 69 70 76 34  ts));.  if( ipv4
ed20: 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 48 69 6e  Only ){.    sHin
ed30: 74 73 2e 61 69 5f 66 61 6d 69 6c 79 20 3d 20 50  ts.ai_family = P
ed40: 46 5f 49 4e 45 54 3b 0a 20 20 20 20 2f 2a 70 72  F_INET;.    /*pr
ed50: 69 6e 74 66 28 22 69 70 76 34 20 6f 6e 6c 79 5c  intf("ipv4 only\
ed60: 6e 22 29 3b 2a 2f 0a 20 20 7d 65 6c 73 65 20 69  n");*/.  }else i
ed70: 66 28 20 69 70 76 36 4f 6e 6c 79 20 29 7b 0a 20  f( ipv6Only ){. 
ed80: 20 20 20 73 48 69 6e 74 73 2e 61 69 5f 66 61 6d     sHints.ai_fam
ed90: 69 6c 79 20 3d 20 50 46 5f 49 4e 45 54 36 3b 0a  ily = PF_INET6;.
eda0: 20 20 20 20 2f 2a 70 72 69 6e 74 66 28 22 69 70      /*printf("ip
edb0: 76 36 20 6f 6e 6c 79 5c 6e 22 29 3b 2a 2f 0a 20  v6 only\n");*/. 
edc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 48 69 6e   }else{.    sHin
edd0: 74 73 2e 61 69 5f 66 61 6d 69 6c 79 20 3d 20 50  ts.ai_family = P
ede0: 46 5f 55 4e 53 50 45 43 3b 0a 20 20 7d 0a 20 20  F_UNSPEC;.  }.  
edf0: 73 48 69 6e 74 73 2e 61 69 5f 73 6f 63 6b 74 79  sHints.ai_sockty
ee00: 70 65 20 3d 20 53 4f 43 4b 5f 53 54 52 45 41 4d  pe = SOCK_STREAM
ee10: 3b 0a 20 20 73 48 69 6e 74 73 2e 61 69 5f 66 6c  ;.  sHints.ai_fl
ee20: 61 67 73 20 3d 20 41 49 5f 50 41 53 53 49 56 45  ags = AI_PASSIVE
ee30: 3b 0a 20 20 73 48 69 6e 74 73 2e 61 69 5f 70 72  ;.  sHints.ai_pr
ee40: 6f 74 6f 63 6f 6c 20 3d 20 30 3b 0a 20 20 72 63  otocol = 0;.  rc
ee50: 20 3d 20 67 65 74 61 64 64 72 69 6e 66 6f 28 6c   = getaddrinfo(l
ee60: 6f 63 61 6c 4f 6e 6c 79 20 3f 20 22 6c 6f 63 61  ocalOnly ? "loca
ee70: 6c 68 6f 73 74 22 3a 20 30 2c 20 7a 50 6f 72 74  lhost": 0, zPort
ee80: 2c 20 26 73 48 69 6e 74 73 2c 20 26 70 41 64 64  , &sHints, &pAdd
ee90: 72 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  rs);.  if( rc ){
eea0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
eeb0: 65 72 72 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20  err, "could not 
eec0: 67 65 74 20 61 64 64 72 20 69 6e 66 6f 3a 20 25  get addr info: %
eed0: 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  s", .           
eee0: 20 72 63 21 3d 45 41 49 5f 53 59 53 54 45 4d 20   rc!=EAI_SYSTEM 
eef0: 3f 20 67 61 69 5f 73 74 72 65 72 72 6f 72 28 72  ? gai_strerror(r
ef00: 63 29 20 3a 20 73 74 72 65 72 72 6f 72 28 65 72  c) : strerror(er
ef10: 72 6e 6f 29 29 3b 0a 20 20 20 20 72 65 74 75 72  rno));.    retur
ef20: 6e 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6e  n 1;.  }.  for(n
ef30: 3d 30 2c 20 70 3d 70 41 64 64 72 73 3b 20 6e 3c  =0, p=pAddrs; n<
ef40: 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 6c 69 73  (int)(sizeof(lis
ef50: 74 65 6e 65 72 29 2f 73 69 7a 65 6f 66 28 6c 69  tener)/sizeof(li
ef60: 73 74 65 6e 65 72 5b 30 5d 29 29 20 26 26 20 70  stener[0])) && p
ef70: 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 70 3d 70  !=0;.        p=p
ef80: 2d 3e 61 69 5f 6e 65 78 74 29 7b 0a 20 20 20 20  ->ai_next){.    
ef90: 6c 69 73 74 65 6e 65 72 5b 6e 5d 20 3d 20 73 6f  listener[n] = so
efa0: 63 6b 65 74 28 70 2d 3e 61 69 5f 66 61 6d 69 6c  cket(p->ai_famil
efb0: 79 2c 20 70 2d 3e 61 69 5f 73 6f 63 6b 74 79 70  y, p->ai_socktyp
efc0: 65 2c 20 70 2d 3e 61 69 5f 70 72 6f 74 6f 63 6f  e, p->ai_protoco
efd0: 6c 29 3b 0a 20 20 20 20 69 66 28 20 6c 69 73 74  l);.    if( list
efe0: 65 6e 65 72 5b 6e 5d 3e 3d 30 20 29 7b 0a 20 20  ener[n]>=0 ){.  
eff0: 20 20 20 20 2f 2a 20 69 66 20 77 65 20 63 61 6e      /* if we can
f000: 27 74 20 74 65 72 6d 69 6e 61 74 65 20 6e 69 63  't terminate nic
f010: 65 6c 79 2c 20 61 74 20 6c 65 61 73 74 20 61 6c  ely, at least al
f020: 6c 6f 77 20 74 68 65 20 73 6f 63 6b 65 74 20 74  low the socket t
f030: 6f 20 62 65 20 72 65 75 73 65 64 20 2a 2f 0a 20  o be reused */. 
f040: 20 20 20 20 20 73 65 74 73 6f 63 6b 6f 70 74 28       setsockopt(
f050: 6c 69 73 74 65 6e 65 72 5b 6e 5d 2c 20 53 4f 4c  listener[n], SOL
f060: 5f 53 4f 43 4b 45 54 2c 20 53 4f 5f 52 45 55 53  _SOCKET, SO_REUS
f070: 45 41 44 44 52 2c 26 6f 70 74 2c 20 73 69 7a 65  EADDR,&opt, size
f080: 6f 66 28 6f 70 74 29 29 3b 0a 20 20 20 20 20 20  of(opt));.      
f090: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 49 50 56  .#if defined(IPV
f0a0: 36 5f 56 36 4f 4e 4c 59 29 0a 20 20 20 20 20 20  6_V6ONLY).      
f0b0: 69 66 28 20 70 2d 3e 61 69 5f 66 61 6d 69 6c 79  if( p->ai_family
f0c0: 3d 3d 41 46 5f 49 4e 45 54 36 20 29 7b 0a 20 20  ==AF_INET6 ){.  
f0d0: 20 20 20 20 20 20 69 6e 74 20 76 36 6f 6e 6c 79        int v6only
f0e0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 65   = 1;.        se
f0f0: 74 73 6f 63 6b 6f 70 74 28 6c 69 73 74 65 6e 65  tsockopt(listene
f100: 72 5b 6e 5d 2c 20 49 50 50 52 4f 54 4f 5f 49 50  r[n], IPPROTO_IP
f110: 56 36 2c 20 49 50 56 36 5f 56 36 4f 4e 4c 59 2c  V6, IPV6_V6ONLY,
f120: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f130: 20 20 20 20 20 26 76 36 6f 6e 6c 79 2c 20 73 69       &v6only, si
f140: 7a 65 6f 66 28 76 36 6f 6e 6c 79 29 29 3b 0a 20  zeof(v6only));. 
f150: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
f160: 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 62      .      if( b
f170: 69 6e 64 28 6c 69 73 74 65 6e 65 72 5b 6e 5d 2c  ind(listener[n],
f180: 20 70 2d 3e 61 69 5f 61 64 64 72 2c 20 70 2d 3e   p->ai_addr, p->
f190: 61 69 5f 61 64 64 72 6c 65 6e 29 3c 30 20 29 7b  ai_addrlen)<0 ){
f1a0: 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28  .        printf(
f1b0: 22 62 69 6e 64 20 66 61 69 6c 65 64 3a 20 25 73  "bind failed: %s
f1c0: 5c 6e 22 2c 20 73 74 72 65 72 72 6f 72 28 65 72  \n", strerror(er
f1d0: 72 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 63  rno));.        c
f1e0: 6c 6f 73 65 28 6c 69 73 74 65 6e 65 72 5b 6e 5d  lose(listener[n]
f1f0: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
f200: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
f210: 20 20 20 69 66 28 20 6c 69 73 74 65 6e 28 6c 69     if( listen(li
f220: 73 74 65 6e 65 72 5b 6e 5d 2c 20 32 30 29 3c 30  stener[n], 20)<0
f230: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e   ){.        prin
f240: 74 66 28 22 6c 69 73 74 65 6e 28 29 20 66 61 69  tf("listen() fai
f250: 6c 65 64 3a 20 25 73 5c 6e 22 2c 20 73 74 72 65  led: %s\n", stre
f260: 72 72 6f 72 28 65 72 72 6e 6f 29 29 3b 0a 20 20  rror(errno));.  
f270: 20 20 20 20 20 20 63 6c 6f 73 65 28 6c 69 73 74        close(list
f280: 65 6e 65 72 5b 6e 5d 29 3b 0a 20 20 20 20 20 20  ener[n]);.      
f290: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
f2a0: 20 20 7d 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20    }.      n++;. 
f2b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e     }.  }.  if( n
f2c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ==0 ){.    fprin
f2d0: 74 66 28 73 74 64 65 72 72 2c 20 22 63 61 6e 6e  tf(stderr, "cann
f2e0: 6f 74 20 6f 70 65 6e 20 61 6e 79 20 73 6f 63 6b  ot open any sock
f2f0: 65 74 73 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74  ets\n");.    ret
f300: 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 77 68  urn 1;.  }..  wh
f310: 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 66  ile( 1 ){.    if
f320: 28 20 6e 63 68 69 6c 64 72 65 6e 3e 4d 41 58 5f  ( nchildren>MAX_
f330: 50 41 52 41 4c 4c 45 4c 20 29 7b 0a 20 20 20 20  PARALLEL ){.    
f340: 20 20 2f 2a 20 53 6c 6f 77 20 64 6f 77 6e 20 69    /* Slow down i
f350: 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  f connections ar
f360: 65 20 61 72 72 69 76 69 6e 67 20 74 6f 6f 20 66  e arriving too f
f370: 61 73 74 20 2a 2f 0a 20 20 20 20 20 20 73 6c 65  ast */.      sle
f380: 65 70 28 20 6e 63 68 69 6c 64 72 65 6e 2d 4d 41  ep( nchildren-MA
f390: 58 5f 50 41 52 41 4c 4c 45 4c 20 29 3b 0a 20 20  X_PARALLEL );.  
f3a0: 20 20 7d 0a 20 20 20 20 64 65 6c 61 79 2e 74 76    }.    delay.tv
f3b0: 5f 73 65 63 20 3d 20 36 30 3b 0a 20 20 20 20 64  _sec = 60;.    d
f3c0: 65 6c 61 79 2e 74 76 5f 75 73 65 63 20 3d 20 30  elay.tv_usec = 0
f3d0: 3b 0a 20 20 20 20 46 44 5f 5a 45 52 4f 28 26 72  ;.    FD_ZERO(&r
f3e0: 65 61 64 66 64 73 29 3b 0a 20 20 20 20 66 6f 72  eadfds);.    for
f3f0: 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
f400: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c  .      assert( l
f410: 69 73 74 65 6e 65 72 5b 69 5d 3e 3d 30 20 29 3b  istener[i]>=0 );
f420: 0a 20 20 20 20 20 20 46 44 5f 53 45 54 28 20 6c  .      FD_SET( l
f430: 69 73 74 65 6e 65 72 5b 69 5d 2c 20 26 72 65 61  istener[i], &rea
f440: 64 66 64 73 29 3b 0a 20 20 20 20 20 20 69 66 28  dfds);.      if(
f450: 20 6c 69 73 74 65 6e 65 72 5b 69 5d 3e 6d 61 78   listener[i]>max
f460: 46 64 20 29 20 6d 61 78 46 64 20 3d 20 6c 69 73  Fd ) maxFd = lis
f470: 74 65 6e 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a  tener[i];.    }.
f480: 20 20 20 20 73 65 6c 65 63 74 28 20 6d 61 78 46      select( maxF
f490: 64 2b 31 2c 20 26 72 65 61 64 66 64 73 2c 20 30  d+1, &readfds, 0
f4a0: 2c 20 30 2c 20 26 64 65 6c 61 79 29 3b 0a 20 20  , 0, &delay);.  
f4b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
f4c0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
f4d0: 46 44 5f 49 53 53 45 54 28 6c 69 73 74 65 6e 65  FD_ISSET(listene
f4e0: 72 5b 69 5d 2c 20 26 72 65 61 64 66 64 73 29 20  r[i], &readfds) 
f4f0: 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 61 64  ){.        lenad
f500: 64 72 20 3d 20 73 69 7a 65 6f 66 28 69 6e 61 64  dr = sizeof(inad
f510: 64 72 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  dr);.        con
f520: 6e 65 63 74 69 6f 6e 20 3d 20 61 63 63 65 70 74  nection = accept
f530: 28 6c 69 73 74 65 6e 65 72 5b 69 5d 2c 20 26 69  (listener[i], &i
f540: 6e 61 64 64 72 2e 73 61 2c 20 26 6c 65 6e 61 64  naddr.sa, &lenad
f550: 64 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  dr);.        if(
f560: 20 63 6f 6e 6e 65 63 74 69 6f 6e 3e 3d 30 20 29   connection>=0 )
f570: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 69 6c  {.          chil
f580: 64 20 3d 20 66 6f 72 6b 28 29 3b 0a 20 20 20 20  d = fork();.    
f590: 20 20 20 20 20 20 69 66 28 20 63 68 69 6c 64 21        if( child!
f5a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
f5b0: 20 20 69 66 28 20 63 68 69 6c 64 3e 30 20 29 20    if( child>0 ) 
f5c0: 6e 63 68 69 6c 64 72 65 6e 2b 2b 3b 0a 20 20 20  nchildren++;.   
f5d0: 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 63           close(c
f5e0: 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 20 20  onnection);.    
f5f0: 20 20 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74          /* print
f600: 66 28 22 73 75 62 70 72 6f 63 65 73 73 20 25 64  f("subprocess %d
f610: 20 73 74 61 72 74 65 64 2e 2e 2e 5c 6e 22 2c 20   started...\n", 
f620: 63 68 69 6c 64 29 3b 20 66 66 6c 75 73 68 28 73  child); fflush(s
f630: 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 20 20 20  tdout); */.     
f640: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f650: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 45 72 72          int nErr
f660: 20 3d 20 30 2c 20 66 64 3b 0a 20 20 20 20 20 20   = 0, fd;.      
f670: 20 20 20 20 20 20 63 6c 6f 73 65 28 30 29 3b 0a        close(0);.
f680: 20 20 20 20 20 20 20 20 20 20 20 20 66 64 20 3d              fd =
f690: 20 64 75 70 28 63 6f 6e 6e 65 63 74 69 6f 6e 29   dup(connection)
f6a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
f6b0: 28 20 66 64 21 3d 30 20 29 20 6e 45 72 72 2b 2b  ( fd!=0 ) nErr++
f6c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6c  ;.            cl
f6d0: 6f 73 65 28 31 29 3b 0a 20 20 20 20 20 20 20 20  ose(1);.        
f6e0: 20 20 20 20 66 64 20 3d 20 64 75 70 28 63 6f 6e      fd = dup(con
f6f0: 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  nection);.      
f700: 20 20 20 20 20 20 69 66 28 20 66 64 21 3d 31 20        if( fd!=1 
f710: 29 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ) nErr++;.      
f720: 20 20 20 20 20 20 63 6c 6f 73 65 28 63 6f 6e 6e        close(conn
f730: 65 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20  ection);.       
f740: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72       return nErr
f750: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
f760: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f770: 20 20 20 20 20 20 2f 2a 20 42 75 72 79 20 64 65        /* Bury de
f780: 61 64 20 63 68 69 6c 64 72 65 6e 20 2a 2f 0a 20  ad children */. 
f790: 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 68 69       while( (chi
f7a0: 6c 64 20 3d 20 77 61 69 74 70 69 64 28 30 2c 20  ld = waitpid(0, 
f7b0: 30 2c 20 57 4e 4f 48 41 4e 47 29 29 3e 30 20 29  0, WNOHANG))>0 )
f7c0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 72 69  {.        /* pri
f7d0: 6e 74 66 28 22 70 72 6f 63 65 73 73 20 25 64 20  ntf("process %d 
f7e0: 65 6e 64 73 5c 6e 22 2c 20 63 68 69 6c 64 29 3b  ends\n", child);
f7f0: 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
f800: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 63 68 69   */.        nchi
f810: 6c 64 72 65 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d  ldren--;.      }
f820: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
f830: 4e 4f 54 20 52 45 41 43 48 45 44 20 2a 2f 20 20  NOT REACHED */  
f840: 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 0a  .  exit(1);.}...
f850: 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67  int main(int arg
f860: 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b  c, char **argv){
f870: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
f880: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f890: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
f8a0: 20 20 63 68 61 72 20 2a 7a 50 65 72 6d 55 73 65    char *zPermUse
f8b0: 72 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 52  r = 0;      /* R
f8c0: 75 6e 20 64 61 65 6d 6f 6e 20 77 69 74 68 20 74  un daemon with t
f8d0: 68 69 73 20 75 73 65 72 27 73 20 70 65 72 6d 69  his user's permi
f8e0: 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 63 6f 6e 73  ssions */.  cons
f8f0: 74 20 63 68 61 72 20 2a 7a 50 6f 72 74 20 3d 20  t char *zPort = 
f900: 30 3b 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65  0;    /* Impleme
f910: 6e 74 20 61 6e 20 48 54 54 50 20 73 65 72 76 65  nt an HTTP serve
f920: 72 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 69  r process */.  i
f930: 6e 74 20 75 73 65 43 68 72 6f 6f 74 4a 61 69 6c  nt useChrootJail
f940: 20 3d 20 31 3b 20 20 20 20 2f 2a 20 54 72 75 65   = 1;    /* True
f950: 20 74 6f 20 75 73 65 20 61 20 63 68 61 6e 67 65   to use a change
f960: 2d 72 6f 6f 74 20 6a 61 69 6c 20 2a 2f 0a 20 20  -root jail */.  
f970: 73 74 72 75 63 74 20 70 61 73 73 77 64 20 2a 70  struct passwd *p
f980: 77 64 20 3d 20 30 3b 20 20 20 2f 2a 20 49 6e 66  wd = 0;   /* Inf
f990: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
f9a0: 68 65 20 75 73 65 72 20 2a 2f 0a 0a 20 20 2f 2a  he user */..  /*
f9b0: 20 52 65 63 6f 72 64 20 74 68 65 20 74 69 6d 65   Record the time
f9c0: 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67   when processing
f9d0: 20 62 65 67 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20   begins..  */.  
f9e0: 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 62 65  gettimeofday(&be
f9f0: 67 69 6e 54 69 6d 65 2c 20 30 29 3b 0a 0a 20 20  ginTime, 0);..  
fa00: 2f 2a 20 50 61 72 73 65 20 63 6f 6d 6d 61 6e 64  /* Parse command
fa10: 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 73 0a  -line arguments.
fa20: 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 61 72    */.  while( ar
fa30: 67 63 3e 31 20 26 26 20 61 72 67 76 5b 31 5d 5b  gc>1 && argv[1][
fa40: 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 63  0]=='-' ){.    c
fa50: 68 61 72 20 2a 7a 20 3d 20 61 72 67 76 5b 31 5d  har *z = argv[1]
fa60: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 41 72 67  ;.    char *zArg
fa70: 20 3d 20 61 72 67 63 3e 3d 33 20 3f 20 61 72 67   = argc>=3 ? arg
fa80: 76 5b 32 5d 20 3a 20 22 30 22 3b 0a 20 20 20 20  v[2] : "0";.    
fa90: 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26  if( z[0]=='-' &&
faa0: 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b   z[1]=='-' ) z++
fab0: 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  ;.    if( strcmp
fac0: 28 7a 2c 22 2d 75 73 65 72 22 29 3d 3d 30 20 29  (z,"-user")==0 )
fad0: 7b 0a 20 20 20 20 20 20 7a 50 65 72 6d 55 73 65  {.      zPermUse
fae0: 72 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 7d 65  r = zArg;.    }e
faf0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
fb00: 2c 22 2d 72 6f 6f 74 22 29 3d 3d 30 20 29 7b 0a  ,"-root")==0 ){.
fb10: 20 20 20 20 20 20 7a 52 6f 6f 74 20 3d 20 7a 41        zRoot = zA
fb20: 72 67 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  rg;.    }else if
fb30: 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6c 6f 67  ( strcmp(z,"-log
fb40: 66 69 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  file")==0 ){.   
fb50: 20 20 20 7a 4c 6f 67 46 69 6c 65 20 3d 20 7a 41     zLogFile = zA
fb60: 72 67 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  rg;.    }else if
fb70: 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 68 74 74  ( strcmp(z,"-htt
fb80: 70 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ps")==0 ){.     
fb90: 20 75 73 65 48 74 74 70 73 20 3d 20 61 74 6f 69   useHttps = atoi
fba0: 28 7a 41 72 67 29 3b 0a 20 20 20 20 20 20 7a 48  (zArg);.      zH
fbb0: 74 74 70 20 3d 20 75 73 65 48 74 74 70 73 20 3f  ttp = useHttps ?
fbc0: 20 22 68 74 74 70 22 20 3a 20 22 68 74 74 70 73   "http" : "https
fbd0: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ";.    }else if(
fbe0: 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 70 6f 72   strcmp(z, "-por
fbf0: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
fc00: 7a 50 6f 72 74 20 3d 20 7a 41 72 67 3b 0a 20 20  zPort = zArg;.  
fc10: 20 20 20 20 73 74 61 6e 64 61 6c 6f 6e 65 20 3d      standalone =
fc20: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
fc30: 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 66 61  ( strcmp(z, "-fa
fc40: 6d 69 6c 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20  mily")==0 ){.   
fc50: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41     if( strcmp(zA
fc60: 72 67 2c 20 22 69 70 76 34 22 29 3d 3d 30 20 29  rg, "ipv4")==0 )
fc70: 7b 0a 20 20 20 20 20 20 20 20 69 70 76 34 4f 6e  {.        ipv4On
fc80: 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  ly = 1;.      }e
fc90: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
fca0: 41 72 67 2c 20 22 69 70 76 36 22 29 3d 3d 30 20  Arg, "ipv6")==0 
fcb0: 29 7b 0a 20 20 20 20 20 20 20 20 69 70 76 36 4f  ){.        ipv6O
fcc0: 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  nly = 1;.      }
fcd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4d 61  else{.        Ma
fce0: 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45  lfunction(__LINE
fcf0: 5f 5f 2c 20 22 75 6e 6b 6e 6f 77 6e 20 49 50 20  __, "unknown IP 
fd00: 70 72 6f 74 6f 63 6f 6c 3a 20 5b 25 73 5d 22 2c  protocol: [%s]",
fd10: 20 7a 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a   zArg);.      }.
fd20: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
fd30: 72 63 6d 70 28 7a 2c 20 22 2d 6a 61 69 6c 22 29  rcmp(z, "-jail")
fd40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
fd50: 20 61 74 6f 69 28 7a 41 72 67 29 3d 3d 30 20 29   atoi(zArg)==0 )
fd60: 7b 0a 20 20 20 20 20 20 20 20 75 73 65 43 68 72  {.        useChr
fd70: 6f 6f 74 4a 61 69 6c 20 3d 20 30 3b 0a 20 20 20  ootJail = 0;.   
fd80: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
fd90: 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 64  f( strcmp(z, "-d
fda0: 65 62 75 67 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ebug")==0 ){.   
fdb0: 20 20 20 69 66 28 20 61 74 6f 69 28 7a 41 72 67     if( atoi(zArg
fdc0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75 73 65  ) ){.        use
fdd0: 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 20 20 20  Timeout = 0;.   
fde0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
fdf0: 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f        Malfunctio
fe00: 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 75 6e 6b  n(__LINE__, "unk
fe10: 6e 6f 77 6e 20 61 72 67 75 6d 65 6e 74 3a 20 5b  nown argument: [
fe20: 25 73 5d 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a  %s]", z);.    }.
fe30: 20 20 20 20 61 72 67 76 20 2b 3d 20 32 3b 0a 20      argv += 2;. 
fe40: 20 20 20 61 72 67 63 20 2d 3d 20 32 3b 0a 20 20     argc -= 2;.  
fe50: 7d 0a 20 20 69 66 28 20 7a 52 6f 6f 74 3d 3d 30  }.  if( zRoot==0
fe60: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61 6e   ){.    if( stan
fe70: 64 61 6c 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20  dalone ){.      
fe80: 7a 52 6f 6f 74 20 3d 20 22 2e 22 3b 0a 20 20 20  zRoot = ".";.   
fe90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d 61   }else{.      Ma
fea0: 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45  lfunction(__LINE
feb0: 5f 5f 2c 20 22 6e 6f 20 2d 2d 72 6f 6f 74 20 73  __, "no --root s
fec0: 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20  pecified");.    
fed0: 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 43 68  }.  }.  .  /* Ch
fee0: 61 6e 67 65 20 64 69 72 65 63 74 6f 72 69 65 73  ange directories
fef0: 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   to the root of 
ff00: 74 68 65 20 48 54 54 50 20 66 69 6c 65 73 79 73  the HTTP filesys
ff10: 74 65 6d 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20  tem.  Then.  ** 
ff20: 63 72 65 61 74 65 20 61 20 63 68 72 6f 6f 74 20  create a chroot 
ff30: 6a 61 69 6c 20 74 68 65 72 65 2e 0a 20 20 2a 2f  jail there..  */
ff40: 0a 20 20 69 66 28 20 63 68 64 69 72 28 7a 52 6f  .  if( chdir(zRo
ff50: 6f 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 4d 61  ot)!=0 ){.    Ma
ff60: 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45  lfunction(__LINE
ff70: 5f 5f 2c 20 22 63 61 6e 6e 6f 74 20 63 68 61 6e  __, "cannot chan
ff80: 67 65 20 74 6f 20 64 69 72 65 63 74 6f 72 79 20  ge to directory 
ff90: 5b 25 73 5d 22 2c 20 7a 52 6f 6f 74 29 3b 0a 20  [%s]", zRoot);. 
ffa0: 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 69 6e 66   }..  /* Get inf
ffb0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
ffc0: 68 65 20 75 73 65 72 20 69 66 20 61 76 61 69 6c  he user if avail
ffd0: 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 7a 50  able */.  if( zP
ffe0: 65 72 6d 55 73 65 72 20 29 20 70 77 64 20 3d 20  ermUser ) pwd = 
fff0: 67 65 74 70 77 6e 61 6d 28 7a 50 65 72 6d 55 73  getpwnam(zPermUs
10000 65 72 29 3b 0a 0a 20 20 2f 2a 20 45 6e 74 65 72  er);..  /* Enter
10010 20 74 68 65 20 63 68 72 6f 6f 74 20 6a 61 69 6c   the chroot jail
10020 20 69 66 20 72 65 71 75 65 73 74 65 64 20 2a 2f   if requested */
10030 20 20 0a 20 20 69 66 28 20 7a 50 65 72 6d 55 73    .  if( zPermUs
10040 65 72 20 26 26 20 75 73 65 43 68 72 6f 6f 74 4a  er && useChrootJ
10050 61 69 6c 20 26 26 20 67 65 74 75 69 64 28 29 3d  ail && getuid()=
10060 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 63 68  =0 ){.    if( ch
10070 72 6f 6f 74 28 22 2e 22 29 3c 30 20 29 7b 0a 20  root(".")<0 ){. 
10080 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e       Malfunction
10090 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 75 6e 61 62  (__LINE__, "unab
100a0 6c 65 20 74 6f 20 63 72 65 61 74 65 20 63 68 72  le to create chr
100b0 6f 6f 74 20 6a 61 69 6c 22 29 3b 0a 20 20 20 20  oot jail");.    
100c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 52 6f  }else{.      zRo
100d0 6f 74 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20  ot = "";.    }. 
100e0 20 7d 0a 0a 20 20 2f 2a 20 41 63 74 69 76 61 74   }..  /* Activat
100f0 65 20 74 68 65 20 73 65 72 76 65 72 2c 20 69 66  e the server, if
10100 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20   requested */.  
10110 69 66 28 20 7a 50 6f 72 74 20 26 26 20 68 74 74  if( zPort && htt
10120 70 5f 73 65 72 76 65 72 28 7a 50 6f 72 74 2c 20  p_server(zPort, 
10130 30 29 20 29 7b 0a 20 20 20 20 4d 61 6c 66 75 6e  0) ){.    Malfun
10140 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20  ction(__LINE__, 
10150 22 66 61 69 6c 65 64 20 74 6f 20 73 74 61 72 74  "failed to start
10160 20 73 65 72 76 65 72 22 29 3b 0a 20 20 7d 0a 0a   server");.  }..
10170 20 20 2f 2a 20 44 72 6f 70 20 72 6f 6f 74 20 70    /* Drop root p
10180 72 69 76 69 6c 65 67 65 73 2e 0a 20 20 2a 2f 0a  rivileges..  */.
10190 20 20 69 66 28 20 7a 50 65 72 6d 55 73 65 72 20    if( zPermUser 
101a0 29 7b 0a 20 20 20 20 69 66 28 20 70 77 64 20 29  ){.    if( pwd )
101b0 7b 0a 20 20 20 20 20 20 73 65 74 67 69 64 28 70  {.      setgid(p
101c0 77 64 2d 3e 70 77 5f 67 69 64 29 3b 0a 20 20 20  wd->pw_gid);.   
101d0 20 20 20 73 65 74 75 69 64 28 70 77 64 2d 3e 70     setuid(pwd->p
101e0 77 5f 75 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73  w_uid);.    }els
101f0 65 7b 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e 63  e{.      Malfunc
10200 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22  tion(__LINE__, "
10210 6e 6f 20 73 75 63 68 20 75 73 65 72 20 5b 25 73  no such user [%s
10220 5d 22 2c 20 7a 50 65 72 6d 55 73 65 72 29 3b 0a  ]", zPermUser);.
10230 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
10240 67 65 74 75 69 64 28 29 3d 3d 30 20 29 7b 0a 20  getuid()==0 ){. 
10250 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f     Malfunction(_
10260 5f 4c 49 4e 45 5f 5f 2c 20 22 63 61 6e 6e 6f 74  _LINE__, "cannot
10270 20 72 75 6e 20 61 73 20 72 6f 6f 74 22 29 3b 0a   run as root");.
10280 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68    }..  /* Get th
10290 65 20 49 50 20 61 64 64 72 65 73 73 20 66 72 6f  e IP address fro
102a0 6d 20 77 68 65 6e 63 65 20 74 68 65 20 72 65 71  m whence the req
102b0 75 65 73 74 20 6f 72 69 67 69 6e 61 74 65 73 0a  uest originates.
102c0 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 61 64 64    */.  {.    add
102d0 72 65 73 73 20 72 65 6d 6f 74 65 41 64 64 72 3b  ress remoteAddr;
102e0 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  .    unsigned in
102f0 74 20 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28  t size = sizeof(
10300 72 65 6d 6f 74 65 41 64 64 72 29 3b 0a 20 20 20  remoteAddr);.   
10310 20 63 68 61 72 20 7a 48 6f 73 74 5b 4e 49 5f 4d   char zHost[NI_M
10320 41 58 48 4f 53 54 5d 3b 0a 20 20 20 20 69 66 28  AXHOST];.    if(
10330 20 67 65 74 70 65 65 72 6e 61 6d 65 28 30 2c 20   getpeername(0, 
10340 26 72 65 6d 6f 74 65 41 64 64 72 2e 73 61 2c 20  &remoteAddr.sa, 
10350 26 73 69 7a 65 29 3e 3d 30 20 29 7b 0a 20 20 20  &size)>=0 ){.   
10360 20 20 20 67 65 74 6e 61 6d 65 69 6e 66 6f 28 26     getnameinfo(&
10370 72 65 6d 6f 74 65 41 64 64 72 2e 73 61 2c 20 73  remoteAddr.sa, s
10380 69 7a 65 2c 20 7a 48 6f 73 74 2c 20 73 69 7a 65  ize, zHost, size
10390 6f 66 28 7a 48 6f 73 74 29 2c 20 30 2c 20 30 2c  of(zHost), 0, 0,
103a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
103b0 20 20 20 4e 49 5f 4e 55 4d 45 52 49 43 48 4f 53     NI_NUMERICHOS
103c0 54 29 3b 0a 20 20 20 20 20 20 7a 52 65 6d 6f 74  T);.      zRemot
103d0 65 41 64 64 72 20 3d 20 53 74 72 44 75 70 28 7a  eAddr = StrDup(z
103e0 48 6f 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Host);.    }.  }
103f0 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74  ..  /* Process t
10400 68 65 20 69 6e 70 75 74 20 73 74 72 65 61 6d 20  he input stream 
10410 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
10420 31 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50  100; i++){.    P
10430 72 6f 63 65 73 73 4f 6e 65 52 65 71 75 65 73 74  rocessOneRequest
10440 28 30 29 3b 0a 20 20 7d 0a 20 20 50 72 6f 63 65  (0);.  }.  Proce
10450 73 73 4f 6e 65 52 65 71 75 65 73 74 28 31 29 3b  ssOneRequest(1);
10460 0a 20 20 65 78 69 74 28 30 29 3b 0a 7d 0a        .  exit(0);.}.