Documentation Source Text

Hex Artifact Content
Login

Artifact ed121485467612fe3102b93ec4eab51b6948769ef56b045a06ecf43fbab99054:


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 2f 78 69 6e 65 74 64 2f 73 74 75 6e 6e 65  td/xinetd/stunne
0060: 6c 34 2c 20 6f 72 20 61 73 20 61 20 73 74 61 6e  l4, or as a stan
0070: 64 2d 61 6c 6f 6e 65 20 73 65 72 76 65 72 0a 2a  d-alone server.*
0080: 2a 20 20 20 20 20 2a 20 4f 6e 65 20 70 72 6f 63  *     * One proc
0090: 65 73 73 20 70 65 72 20 72 65 71 75 65 73 74 0a  ess per request.
00a0: 2a 2a 20 20 20 20 20 2a 20 44 65 6c 69 76 65 72  **     * Deliver
00b0: 20 73 74 61 74 69 63 20 63 6f 6e 74 65 6e 74 20   static content 
00c0: 6f 72 20 72 75 6e 20 43 47 49 20 6f 72 20 53 43  or run CGI or SC
00d0: 47 49 0a 2a 2a 20 20 20 20 20 2a 20 56 69 72 74  GI.**     * Virt
00e0: 75 61 6c 20 73 69 74 65 73 20 62 61 73 65 64 20  ual sites based 
00f0: 6f 6e 20 74 68 65 20 22 48 6f 73 74 3a 22 20 70  on the "Host:" p
0100: 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 48  roperty of the H
0110: 54 54 50 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  TTP header.**   
0120: 20 20 2a 20 52 75 6e 73 20 69 6e 20 61 20 63 68    * Runs in a ch
0130: 72 6f 6f 74 20 6a 61 69 6c 0a 2a 2a 20 20 20 20  root jail.**    
0140: 20 2a 20 55 6e 69 66 69 65 64 20 6c 6f 67 20 66   * Unified log f
0150: 69 6c 65 20 69 6e 20 61 20 43 53 56 20 66 6f 72  ile in a CSV for
0160: 6d 61 74 0a 2a 2a 20 20 20 20 20 2a 20 53 6d 61  mat.**     * Sma
0170: 6c 6c 20 63 6f 64 65 20 62 61 73 65 20 28 74 68  ll code base (th
0180: 69 73 20 31 20 66 69 6c 65 29 20 74 6f 20 66 61  is 1 file) to fa
0190: 63 69 6c 69 74 61 74 65 20 73 65 63 75 72 69 74  cilitate securit
01a0: 79 20 61 75 64 69 74 69 6e 67 0a 2a 2a 20 20 20  y auditing.**   
01b0: 20 20 2a 20 53 69 6d 70 6c 65 20 73 65 74 75 70    * Simple setup
01c0: 20 2d 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61 74   - no configurat
01d0: 69 6f 6e 20 66 69 6c 65 73 20 74 6f 20 6d 69 73  ion files to mis
01e0: 63 6f 6e 66 69 67 75 72 65 0a 2a 2a 20 0a 2a 2a  configure.** .**
01f0: 20 54 68 69 73 20 66 69 6c 65 20 69 6d 70 6c 65   This file imple
0200: 6d 65 6e 74 73 20 61 20 73 6d 61 6c 6c 20 61 6e  ments a small an
0210: 64 20 73 69 6d 70 6c 65 20 62 75 74 20 73 65 63  d simple but sec
0220: 75 72 65 20 61 6e 64 20 65 66 66 65 63 74 69 76  ure and effectiv
0230: 65 20 77 65 62 0a 2a 2a 20 73 65 72 76 65 72 2e  e web.** server.
0240: 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 66    There are no f
0250: 72 69 6c 6c 73 2e 20 20 41 6e 79 74 68 69 6e 67  rills.  Anything
0260: 20 74 68 61 74 20 63 6f 75 6c 64 20 62 65 20 72   that could be r
0270: 65 61 73 6f 6e 61 62 6c 79 0a 2a 2a 20 6f 6d 69  easonably.** omi
0280: 74 74 65 64 20 68 61 73 20 62 65 65 6e 2e 0a 2a  tted has been..*
0290: 2a 0a 2a 2a 20 53 65 74 75 70 20 72 75 6c 65 73  *.** Setup rules
02a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 4c  :.**.**    (1) L
02b0: 61 75 6e 63 68 20 61 73 20 72 6f 6f 74 20 66 72  aunch as root fr
02c0: 6f 6d 20 69 6e 65 74 64 20 6c 69 6b 65 20 74 68  om inetd like th
02d0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
02e0: 20 20 20 20 20 68 74 74 70 64 20 2d 6c 6f 67 66       httpd -logf
02f0: 69 6c 65 20 6c 6f 67 66 69 6c 65 20 2d 72 6f 6f  ile logfile -roo
0300: 74 20 2f 68 6f 6d 65 2f 77 77 77 20 2d 75 73 65  t /home/www -use
0310: 72 20 6e 6f 62 6f 64 79 0a 2a 2a 0a 2a 2a 20 20  r nobody.**.**  
0320: 20 20 20 20 20 20 49 74 20 77 69 6c 6c 20 61 75        It will au
0330: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 72 6f  tomatically chro
0340: 6f 74 20 74 6f 20 2f 68 6f 6d 65 2f 77 77 77 20  ot to /home/www 
0350: 61 6e 64 20 62 65 63 6f 6d 65 20 75 73 65 72 20  and become user 
0360: 22 6e 6f 62 6f 64 79 22 2e 0a 2a 2a 20 20 20 20  "nobody"..**    
0370: 20 20 20 20 54 68 65 20 6c 6f 67 66 69 6c 65 20      The logfile 
0380: 6e 61 6d 65 20 73 68 6f 75 6c 64 20 62 65 20 72  name should be r
0390: 65 6c 61 74 69 76 65 20 74 6f 20 74 68 65 20 63  elative to the c
03a0: 68 72 6f 6f 74 20 6a 61 69 6c 2e 0a 2a 2a 0a 2a  hroot jail..**.*
03b0: 2a 20 20 20 20 28 32 29 20 44 69 72 65 63 74 6f  *    (2) Directo
03c0: 72 69 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ries of the form
03d0: 20 22 2a 2e 77 65 62 73 69 74 65 22 20 28 65 78   "*.website" (ex
03e0: 3a 20 77 77 77 5f 73 71 6c 69 74 65 5f 6f 72 67  : www_sqlite_org
03f0: 2e 77 65 62 73 69 74 65 29 0a 2a 2a 20 20 20 20  .website).**    
0400: 20 20 20 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74      contain cont
0410: 65 6e 74 2e 20 20 54 68 65 20 64 69 72 65 63 74  ent.  The direct
0420: 6f 72 79 20 69 73 20 63 68 6f 73 65 6e 20 62 61  ory is chosen ba
0430: 73 65 64 20 6f 6e 20 74 68 65 20 48 54 54 50 5f  sed on the HTTP_
0440: 48 4f 53 54 0a 2a 2a 20 20 20 20 20 20 20 20 72  HOST.**        r
0450: 65 71 75 65 73 74 20 68 65 61 64 65 72 2e 20 20  equest header.  
0460: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 48  If there is no H
0470: 54 54 50 5f 48 4f 53 54 20 68 65 61 64 65 72 20  TTP_HOST header 
0480: 6f 72 20 69 66 20 74 68 65 0a 2a 2a 20 20 20 20  or if the.**    
0490: 20 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e      correspondin
04a0: 67 20 68 6f 73 74 20 64 69 72 65 63 74 6f 72 79  g host directory
04b0: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
04c0: 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 20   then the.**    
04d0: 20 20 20 20 22 64 65 66 61 75 6c 74 2e 77 65 62      "default.web
04e0: 73 69 74 65 22 20 69 73 20 75 73 65 64 2e 20 20  site" is used.  
04f0: 49 66 20 74 68 65 20 48 54 54 50 5f 48 4f 53 54  If the HTTP_HOST
0500: 20 68 65 61 64 65 72 20 63 6f 6e 74 61 69 6e 73   header contains
0510: 20 61 6e 79 0a 2a 2a 20 20 20 20 20 20 20 20 63   any.**        c
0520: 68 61 72 61 74 65 72 73 20 6f 74 68 65 72 20 74  haraters other t
0530: 68 61 6e 20 5b 61 2d 7a 41 2d 5a 30 2d 39 5f 2e  han [a-zA-Z0-9_.
0540: 2c 2a 7e 2f 5d 20 74 68 65 6e 20 61 20 34 30 33  ,*~/] then a 403
0550: 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 20 20 20   error is.**    
0560: 20 20 20 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a      generated..*
0570: 2a 0a 2a 2a 20 20 20 20 28 33 29 20 41 6e 79 20  *.**    (3) Any 
0580: 66 69 6c 65 20 6f 72 20 64 69 72 65 63 74 6f 72  file or director
0590: 79 20 77 68 6f 73 65 20 6e 61 6d 65 20 62 65 67  y whose name beg
05a0: 69 6e 73 20 77 69 74 68 20 22 2e 22 20 6f 72 20  ins with "." or 
05b0: 22 2d 22 20 69 73 20 69 67 6e 6f 72 65 64 2c 0a  "-" is ignored,.
05c0: 2a 2a 20 20 20 20 20 20 20 20 65 78 63 65 70 74  **        except
05d0: 20 66 6f 72 20 2f 2e 77 65 6c 6c 2d 6b 6e 6f 77   for /.well-know
05e0: 6e 2f 20 61 74 20 74 68 65 20 74 6f 70 2d 6c 65  n/ at the top-le
05f0: 76 65 6c 2e 20 20 54 68 65 20 65 78 63 65 70 74  vel.  The except
0600: 69 6f 6e 20 69 73 20 66 6f 72 0a 2a 2a 20 20 20  ion is for.**   
0610: 20 20 20 20 20 52 46 43 2d 35 37 38 35 20 74 6f       RFC-5785 to
0620: 20 61 6c 6c 6f 77 20 6c 65 74 73 65 6e 63 72 79   allow letsencry
0630: 70 74 20 6f 72 20 63 65 72 74 62 6f 74 20 74 6f  pt or certbot to
0640: 20 67 65 6e 65 72 61 74 65 20 61 20 54 53 4c 20   generate a TSL 
0650: 63 65 72 74 0a 2a 2a 20 20 20 20 20 20 20 20 75  cert.**        u
0660: 73 69 6e 67 20 77 65 62 72 6f 6f 74 2e 0a 2a 2a  sing webroot..**
0670: 0a 2a 2a 20 20 20 20 28 34 29 20 43 68 61 72 61  .**    (4) Chara
0680: 63 74 65 72 73 20 6f 74 68 65 72 20 74 68 61 6e  cters other than
0690: 20 5b 30 2d 39 61 2d 7a 41 2d 5a 2c 2d 2e 2f 3a   [0-9a-zA-Z,-./:
06a0: 5f 7e 5d 20 61 6e 64 20 61 6e 79 20 25 48 48 20  _~] and any %HH 
06b0: 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 20 20  characters.**   
06c0: 20 20 20 20 20 65 73 63 61 70 65 73 20 69 6e 20       escapes in 
06d0: 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 72 65  the filename are
06e0: 20 61 6c 6c 20 74 72 61 6e 73 6c 61 74 65 64 20   all translated 
06f0: 69 6e 74 6f 20 22 5f 22 2e 20 20 54 68 69 73 20  into "_".  This 
0700: 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 64  is.**        a d
0710: 65 66 65 6e 73 65 20 61 67 61 69 6e 73 74 20 63  efense against c
0720: 72 6f 73 73 2d 73 69 74 65 20 73 63 72 69 70 74  ross-site script
0730: 69 6e 67 20 61 74 74 61 63 6b 73 20 61 6e 64 20  ing attacks and 
0740: 6f 74 68 65 72 20 6d 69 73 63 68 69 65 66 2e 0a  other mischief..
0750: 2a 2a 0a 2a 2a 20 20 20 20 28 35 29 20 45 78 65  **.**    (5) Exe
0760: 63 75 74 61 62 6c 65 20 66 69 6c 65 73 20 61 72  cutable files ar
0770: 65 20 72 75 6e 20 61 73 20 43 47 49 2e 20 20 46  e run as CGI.  F
0780: 69 6c 65 73 20 77 68 6f 73 65 20 6e 61 6d 65 20  iles whose name 
0790: 65 6e 64 73 20 77 69 74 68 20 22 2e 73 63 67 69  ends with ".scgi
07a0: 22 0a 2a 2a 20 20 20 20 20 20 20 20 74 72 69 67  ".**        trig
07b0: 67 65 72 20 61 6e 64 20 53 43 47 49 20 72 65 71  ger and SCGI req
07c0: 75 65 73 74 20 28 73 65 65 20 69 74 65 6d 20 31  uest (see item 1
07d0: 30 20 62 65 6c 6f 77 29 2e 20 20 41 6c 6c 20 6f  0 below).  All o
07e0: 74 68 65 72 20 66 69 6c 65 73 0a 2a 2a 20 20 20  ther files.**   
07f0: 20 20 20 20 20 61 72 65 20 64 65 6c 69 76 65 72       are deliver
0800: 65 64 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  ed as is..**.** 
0810: 20 20 20 28 36 29 20 46 6f 72 20 53 53 4c 20 73     (6) For SSL s
0820: 75 70 70 6f 72 74 20 75 73 65 20 73 74 75 6e 6e  upport use stunn
0830: 65 6c 20 61 6e 64 20 61 64 64 20 74 68 65 20 2d  el and add the -
0840: 68 74 74 70 73 20 31 20 6f 70 74 69 6f 6e 20 6f  https 1 option o
0850: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
0860: 68 74 74 70 64 20 63 6f 6d 6d 61 6e 64 2d 6c 69  httpd command-li
0870: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 37 29  ne..**.**    (7)
0880: 20 49 66 20 61 20 66 69 6c 65 20 6e 61 6d 65 64   If a file named
0890: 20 22 2d 61 75 74 68 22 20 65 78 69 73 74 73 20   "-auth" exists 
08a0: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65  in the same dire
08b0: 63 74 6f 72 79 20 61 73 20 74 68 65 20 66 69 6c  ctory as the fil
08c0: 65 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 62  e to.**        b
08d0: 65 20 72 75 6e 20 61 73 20 43 47 49 20 6f 72 20  e run as CGI or 
08e0: 74 6f 20 62 65 20 64 65 6c 69 76 65 72 65 64 2c  to be delivered,
08f0: 20 74 68 65 6e 20 69 74 20 63 6f 6e 74 61 69 6e   then it contain
0900: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  s information.**
0910: 20 20 20 20 20 20 20 20 66 6f 72 20 48 54 54 50          for HTTP
0920: 20 42 61 73 69 63 20 61 75 74 68 6f 72 69 7a 61   Basic authoriza
0930: 74 69 6f 6e 2e 20 20 53 65 65 20 66 69 6c 65 20  tion.  See file 
0940: 66 6f 72 6d 61 74 20 64 65 74 61 69 6c 73 20 62  format details b
0950: 65 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  elow..**.**    (
0960: 38 29 20 54 6f 20 72 75 6e 20 61 73 20 61 20 73  8) To run as a s
0970: 74 61 6e 64 2d 61 6c 6f 6e 65 20 73 65 72 76 65  tand-alone serve
0980: 72 2c 20 73 69 6d 70 6c 79 20 61 64 64 20 74 68  r, simply add th
0990: 65 20 22 2d 70 6f 72 74 20 4e 22 20 63 6f 6d 6d  e "-port N" comm
09a0: 61 6e 64 2d 6c 69 6e 65 0a 2a 2a 20 20 20 20 20  and-line.**     
09b0: 20 20 20 6f 70 74 69 6f 6e 20 74 6f 20 64 65 66     option to def
09c0: 69 6e 65 20 77 68 69 63 68 20 54 43 50 20 70 6f  ine which TCP po
09d0: 72 74 20 74 6f 20 6c 69 73 74 65 6e 20 6f 6e 2e  rt to listen on.
09e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 39 29 20 46 6f  .**.**    (9) Fo
09f0: 72 20 73 74 61 74 69 63 20 63 6f 6e 74 65 6e 74  r static content
0a00: 2c 20 74 68 65 20 6d 69 6d 65 74 79 70 65 20 69  , the mimetype i
0a10: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
0a20: 74 68 65 20 66 69 6c 65 20 73 75 66 66 69 78 0a  the file suffix.
0a30: 2a 2a 20 20 20 20 20 20 20 20 75 73 69 6e 67 20  **        using 
0a40: 61 20 74 61 62 6c 65 20 62 75 69 6c 74 20 69 6e  a table built in
0a50: 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f  to the source co
0a60: 64 65 20 62 65 6c 6f 77 2e 20 20 49 66 20 79 6f  de below.  If yo
0a70: 75 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 20 20  u have.**       
0a80: 20 75 6e 75 73 75 61 6c 20 63 6f 6e 74 65 6e 74   unusual content
0a90: 20 66 69 6c 65 73 2c 20 79 6f 75 20 6d 69 67 68   files, you migh
0aa0: 74 20 6e 65 65 64 20 74 6f 20 65 78 74 65 6e 64  t need to extend
0ab0: 20 74 68 69 73 20 74 61 62 6c 65 2e 0a 2a 2a 0a   this table..**.
0ac0: 2a 2a 20 20 20 28 31 30 29 20 43 6f 6e 74 65 6e  **   (10) Conten
0ad0: 74 20 66 69 6c 65 73 20 74 68 61 74 20 65 6e 64  t files that end
0ae0: 20 77 69 74 68 20 22 2e 73 63 67 69 22 20 61 6e   with ".scgi" an
0af0: 64 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 74  d that contain t
0b00: 65 78 74 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20  ext of the.**   
0b10: 20 20 20 20 20 66 6f 72 6d 20 22 53 43 47 49 20       form "SCGI 
0b20: 68 6f 73 74 6e 61 6d 65 20 70 6f 72 74 22 20 77  hostname port" w
0b30: 69 6c 6c 20 66 6f 72 6d 61 74 20 61 6e 20 53 43  ill format an SC
0b40: 47 49 20 72 65 71 75 65 73 74 20 61 6e 64 20 73  GI request and s
0b50: 65 6e 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 20  end it.**       
0b60: 20 74 6f 20 68 6f 73 74 6e 61 6d 65 3a 70 6f 72   to hostname:por
0b70: 74 2c 20 74 68 65 20 72 65 6c 61 79 20 62 61 63  t, the relay bac
0b80: 6b 20 74 68 65 20 72 65 70 6c 79 2e 20 20 45 72  k the reply.  Er
0b90: 72 6f 72 20 62 65 68 61 76 69 6f 72 20 69 73 0a  ror behavior is.
0ba0: 2a 2a 20 20 20 20 20 20 20 20 64 65 74 65 72 6d  **        determ
0bb0: 69 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65  ined by subseque
0bc0: 6e 74 20 6c 69 6e 65 73 20 6f 66 20 74 68 65 20  nt lines of the 
0bd0: 2e 73 63 67 69 20 66 69 6c 65 2e 20 20 53 65 65  .scgi file.  See
0be0: 20 53 43 47 49 20 62 65 6c 6f 77 0a 2a 2a 20 20   SCGI below.**  
0bf0: 20 20 20 20 20 20 66 6f 72 20 64 65 74 61 69 6c        for detail
0c00: 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 6d 61 6e 64  s..**.** Command
0c10: 2d 6c 69 6e 65 20 4f 70 74 69 6f 6e 73 3a 0a 2a  -line Options:.*
0c20: 2a 0a 2a 2a 20 20 2d 2d 72 6f 6f 74 20 44 49 52  *.**  --root DIR
0c30: 20 20 20 20 20 20 20 44 65 66 69 6e 65 73 20 74         Defines t
0c40: 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61  he directory tha
0c50: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  t contains the v
0c60: 61 72 69 6f 75 73 0a 2a 2a 20 20 20 20 20 20 20  arious.**       
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 24 48 4f 53              $HOS
0c80: 54 2e 77 65 62 73 69 74 65 20 73 75 62 64 69 72  T.website subdir
0c90: 65 63 74 6f 72 69 65 73 2c 20 65 61 63 68 20 63  ectories, each c
0ca0: 6f 6e 74 61 69 6e 69 6e 67 20 77 65 62 20 63 6f  ontaining web co
0cb0: 6e 74 65 6e 74 20 0a 2a 2a 20 20 20 20 20 20 20  ntent .**       
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
0cd0: 61 20 73 69 6e 67 6c 65 20 76 69 72 74 75 61 6c  a single virtual
0ce0: 20 68 6f 73 74 2e 20 20 49 66 20 6c 61 75 6e 63   host.  If launc
0cf0: 68 65 64 20 61 73 20 72 6f 6f 74 20 61 6e 64 20  hed as root and 
0d00: 69 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  if.**           
0d10: 20 20 20 20 20 20 20 20 22 2d 2d 75 73 65 72 20          "--user 
0d20: 55 53 45 52 22 20 61 6c 73 6f 20 61 70 70 65 61  USER" also appea
0d30: 72 73 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e  rs on the comman
0d40: 64 2d 6c 69 6e 65 20 61 6e 64 20 69 66 0a 2a 2a  d-line and if.**
0d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d60: 20 20 20 22 2d 2d 6a 61 69 6c 20 30 22 20 69 73     "--jail 0" is
0d70: 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74   omitted, then t
0d80: 68 65 20 70 72 6f 63 65 73 73 20 72 75 6e 73 20  he process runs 
0d90: 69 6e 20 61 20 63 68 72 6f 6f 74 0a 2a 2a 20 20  in a chroot.**  
0da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0db0: 20 6a 61 69 6c 20 72 6f 6f 74 65 64 20 61 74 20   jail rooted at 
0dc0: 74 68 69 73 20 64 69 72 65 63 74 6f 72 79 20 61  this directory a
0dd0: 6e 64 20 75 6e 64 65 72 20 74 68 65 20 75 73 65  nd under the use
0de0: 72 69 64 20 55 53 45 52 2e 0a 2a 2a 20 20 20 20  rid USER..**    
0df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
0e00: 68 69 73 20 6f 70 74 69 6f 6e 20 69 73 20 72 65  his option is re
0e10: 71 75 69 72 65 64 20 66 6f 72 20 78 69 6e 65 74  quired for xinet
0e20: 64 20 6c 61 75 6e 63 68 20 62 75 74 20 64 65 66  d launch but def
0e30: 61 75 6c 74 73 0a 2a 2a 20 20 20 20 20 20 20 20  aults.**        
0e40: 20 20 20 20 20 20 20 20 20 20 20 74 6f 20 22 2e             to ".
0e50: 22 20 66 6f 72 20 61 20 73 74 61 6e 64 2d 61 6c  " for a stand-al
0e60: 6f 6e 65 20 77 65 62 20 73 65 72 76 65 72 2e 0a  one web server..
0e70: 2a 2a 0a 2a 2a 20 20 2d 2d 70 6f 72 74 20 4e 20  **.**  --port N 
0e80: 20 20 20 20 20 20 20 20 52 75 6e 20 69 6e 20 73          Run in s
0e90: 74 61 6e 64 61 6c 6f 6e 65 20 6d 6f 64 65 20 6c  tandalone mode l
0ea0: 69 73 74 65 6e 69 6e 67 20 6f 6e 20 54 43 50 20  istening on TCP 
0eb0: 70 6f 72 74 20 4e 0a 2a 2a 0a 2a 2a 20 20 2d 2d  port N.**.**  --
0ec0: 75 73 65 72 20 55 53 45 52 20 20 20 20 20 20 44  user USER      D
0ed0: 65 66 69 6e 65 20 74 68 65 20 75 73 65 72 20 75  efine the user u
0ee0: 6e 64 65 72 20 77 68 69 63 68 20 74 68 65 20 70  nder which the p
0ef0: 72 6f 63 65 73 73 20 73 68 6f 75 6c 64 20 72 75  rocess should ru
0f00: 6e 20 69 66 0a 2a 2a 20 20 20 20 20 20 20 20 20  n if.**         
0f10: 20 20 20 20 20 20 20 20 20 20 6f 72 69 67 69 6e            origin
0f20: 61 6c 6c 79 20 6c 61 75 6e 63 68 65 64 20 61 73  ally launched as
0f30: 20 72 6f 6f 74 2e 20 20 54 68 69 73 20 70 72 6f   root.  This pro
0f40: 63 65 73 73 20 77 69 6c 6c 20 72 65 66 75 73 65  cess will refuse
0f50: 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   to.**          
0f60: 20 20 20 20 20 20 20 20 20 72 75 6e 20 61 73 20           run as 
0f70: 72 6f 6f 74 20 28 66 6f 72 20 73 65 63 75 72 69  root (for securi
0f80: 74 79 29 2e 20 20 49 66 20 74 68 69 73 20 6f 70  ty).  If this op
0f90: 74 69 6f 6e 20 69 73 20 6f 6d 69 74 74 65 64 20  tion is omitted 
0fa0: 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
0fb0: 20 20 20 20 20 20 20 20 20 74 68 65 20 70 72 6f           the pro
0fc0: 63 65 73 73 20 69 73 20 6c 61 75 6e 63 68 65 64  cess is launched
0fd0: 20 61 73 20 72 6f 6f 74 2c 20 69 74 20 77 69 6c   as root, it wil
0fe0: 6c 20 61 62 6f 72 74 20 77 69 74 68 6f 75 74 0a  l abort without.
0ff0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1000: 20 20 20 20 20 70 72 6f 63 65 73 73 69 6e 67 20       processing 
1010: 61 6e 79 20 48 54 54 50 20 72 65 71 75 65 73 74  any HTTP request
1020: 73 2e 0a 2a 2a 0a 2a 2a 20 20 2d 2d 6c 6f 67 66  s..**.**  --logf
1030: 69 6c 65 20 46 49 4c 45 20 20 20 41 70 70 65 6e  ile FILE   Appen
1040: 64 20 61 20 73 69 6e 67 6c 65 2d 6c 69 6e 65 2c  d a single-line,
1050: 20 43 53 56 2d 66 6f 72 6d 61 74 2c 20 6c 6f 67   CSV-format, log
1060: 20 66 69 6c 65 20 65 6e 74 72 79 20 74 6f 20 46   file entry to F
1070: 49 4c 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ILE.**          
1080: 20 20 20 20 20 20 20 20 20 66 6f 72 20 65 61 63           for eac
1090: 68 20 48 54 54 50 20 72 65 71 75 65 73 74 2e 20  h HTTP request. 
10a0: 20 46 49 4c 45 20 73 68 6f 75 6c 64 20 62 65 20   FILE should be 
10b0: 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e  a full pathname.
10c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
10d0: 20 20 20 20 20 20 54 68 65 20 46 49 4c 45 20 6e        The FILE n
10e0: 61 6d 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  ame is interpret
10f0: 65 64 20 69 6e 73 69 64 65 20 74 68 65 20 63 68  ed inside the ch
1100: 72 6f 6f 74 20 6a 61 69 6c 2e 20 20 54 68 65 0a  root jail.  The.
1110: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1120: 20 20 20 20 20 46 49 4c 45 20 6e 61 6d 65 20 69       FILE name i
1130: 73 20 65 78 70 61 6e 64 65 64 20 75 73 69 6e 67  s expanded using
1140: 20 73 74 72 66 74 69 6d 65 28 29 20 69 66 20 69   strftime() if i
1150: 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 20 20  t contains.**   
1160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1170: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 27 25 27  at least one '%'
1180: 20 61 6e 64 20 69 73 20 6e 6f 74 20 74 6f 6f 20   and is not too 
1190: 6c 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 2d 2d 68  long..**.**  --h
11a0: 74 74 70 73 20 20 20 20 20 20 20 20 20 20 49 6e  ttps          In
11b0: 64 69 63 61 74 65 73 20 74 68 61 74 20 69 6e 70  dicates that inp
11c0: 75 74 20 69 73 20 63 6f 6d 69 6e 67 20 6f 76 65  ut is coming ove
11d0: 72 20 53 53 4c 20 61 6e 64 20 69 73 20 62 65 69  r SSL and is bei
11e0: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ng.**           
11f0: 20 20 20 20 20 20 20 20 64 65 63 6f 64 65 64 20          decoded 
1200: 75 70 73 74 72 65 61 6d 2c 20 70 65 72 68 61 70  upstream, perhap
1210: 73 20 62 79 20 73 74 75 6e 6e 65 6c 2e 20 20 28  s by stunnel.  (
1220: 54 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  This program.** 
1230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1240: 20 20 6f 6e 6c 79 20 75 6e 64 65 72 73 74 61 6e    only understan
1250: 64 73 20 70 6c 61 69 6e 74 65 78 74 2e 29 0a 2a  ds plaintext.).*
1260: 2a 0a 2a 2a 20 20 2d 2d 66 61 6d 69 6c 79 20 69  *.**  --family i
1270: 70 76 34 20 20 20 20 4f 6e 6c 79 20 61 63 63 65  pv4    Only acce
1280: 70 74 20 69 6e 70 75 74 20 66 72 6f 6d 20 49 50  pt input from IP
1290: 56 34 20 6f 72 20 49 50 56 36 2c 20 72 65 73 70  V4 or IPV6, resp
12a0: 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 20 2d 2d  ectively..**  --
12b0: 66 61 6d 69 6c 79 20 69 70 76 36 20 20 20 20 54  family ipv6    T
12c0: 68 65 73 65 20 6f 70 74 69 6f 6e 73 20 61 72 65  hese options are
12d0: 20 6f 6e 6c 79 20 6d 65 61 6e 69 6e 67 66 75 6c   only meaningful
12e0: 20 69 66 20 61 6c 74 68 74 74 70 64 20 69 73 20   if althttpd is 
12f0: 72 75 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  run.**          
1300: 20 20 20 20 20 20 20 20 20 61 73 20 61 20 73 74           as a st
1310: 61 6e 64 2d 61 6c 6f 6e 65 20 73 65 72 76 65 72  and-alone server
1320: 2e 0a 2a 2a 0a 2a 2a 20 20 2d 2d 6a 61 69 6c 20  ..**.**  --jail 
1330: 42 4f 4f 4c 45 41 4e 20 20 20 49 6e 64 69 63 61  BOOLEAN   Indica
1340: 74 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e  tes whether or n
1350: 6f 74 20 74 6f 20 66 6f 72 6d 20 61 20 63 68 72  ot to form a chr
1360: 6f 6f 74 20 6a 61 69 6c 20 69 66 20 0a 2a 2a 20  oot jail if .** 
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1380: 20 20 69 6e 69 74 69 61 6c 6c 79 20 72 75 6e 20    initially run 
1390: 61 73 20 72 6f 6f 74 2e 20 20 54 68 65 20 64 65  as root.  The de
13a0: 66 61 75 6c 74 20 69 73 20 74 72 75 65 2c 20 73  fault is true, s
13b0: 6f 20 74 68 65 20 6f 6e 6c 79 0a 2a 2a 20 20 20  o the only.**   
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d0: 75 73 65 66 75 6c 20 76 61 72 69 61 6e 74 20 6f  useful variant o
13e0: 66 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 69 73  f this option is
13f0: 20 22 2d 2d 6a 61 69 6c 20 30 22 20 77 68 69 63   "--jail 0" whic
1400: 68 20 70 72 65 76 65 6e 74 73 0a 2a 2a 20 20 20  h prevents.**   
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 74 68 65 20 66 6f 72 6d 61 74 69 6f 6e 20 6f 66  the formation of
1430: 20 74 68 65 20 63 68 72 6f 6f 74 20 6a 61 69 6c   the chroot jail
1440: 2e 0a 2a 2a 0a 2a 2a 20 20 2d 2d 6d 61 78 2d 61  ..**.**  --max-a
1450: 67 65 20 53 45 43 20 20 20 20 54 68 65 20 76 61  ge SEC    The va
1460: 6c 75 65 20 66 6f 72 20 22 43 61 63 68 65 2d 43  lue for "Cache-C
1470: 6f 6e 74 72 6f 6c 3a 20 6d 61 78 2d 61 67 65 3d  ontrol: max-age=
1480: 25 64 22 2e 20 20 44 65 66 61 75 6c 74 73 20 74  %d".  Defaults t
1490: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
14a0: 20 20 20 20 20 20 20 31 32 30 20 73 65 63 6f 6e         120 secon
14b0: 64 73 2e 0a 2a 2a 0a 2a 2a 20 20 2d 2d 64 65 62  ds..**.**  --deb
14c0: 75 67 20 20 20 20 20 20 20 20 20 20 44 69 73 61  ug          Disa
14d0: 62 6c 65 73 20 69 6e 70 75 74 20 74 69 6d 65 6f  bles input timeo
14e0: 75 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  uts.  This is us
14f0: 65 66 75 6c 20 66 6f 72 20 64 65 62 75 67 67 69  eful for debuggi
1500: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ng.**           
1510: 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 6e 70          when inp
1520: 75 74 73 20 69 73 20 62 65 69 6e 67 20 74 79 70  uts is being typ
1530: 65 64 20 69 6e 20 6d 61 6e 75 61 6c 6c 79 2e 0a  ed in manually..
1540: 2a 2a 0a 2a 2a 20 43 6f 6d 6d 61 6e 64 2d 6c 69  **.** Command-li
1550: 6e 65 20 6f 70 74 69 6f 6e 73 20 63 61 6e 20 74  ne options can t
1560: 61 6b 65 20 65 69 74 68 65 72 20 6f 6e 65 20 6f  ake either one o
1570: 72 20 74 77 6f 20 69 6e 69 74 69 61 6c 20 22 2d  r two initial "-
1580: 22 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a  " characters..**
1590: 20 53 6f 20 22 2d 2d 64 65 62 75 67 22 20 61 6e   So "--debug" an
15a0: 64 20 22 2d 64 65 62 75 67 22 20 6d 65 61 6e 20  d "-debug" mean 
15b0: 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2c 20  the same thing, 
15c0: 66 6f 72 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 0a  for example..**.
15d0: 2a 2a 0a 2a 2a 20 53 65 63 75 72 69 74 79 20 46  **.** Security F
15e0: 65 61 74 75 72 65 73 3a 0a 2a 2a 0a 2a 2a 20 28  eatures:.**.** (
15f0: 31 29 20 20 54 68 69 73 20 70 72 6f 67 72 61 6d  1)  This program
1600: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 70   automatically p
1610: 75 74 73 20 69 74 73 65 6c 66 20 69 6e 73 69 64  uts itself insid
1620: 65 20 61 20 63 68 72 6f 6f 74 20 6a 61 69 6c 20  e a chroot jail 
1630: 69 66 0a 2a 2a 20 20 20 20 20 20 69 74 20 63 61  if.**      it ca
1640: 6e 20 61 6e 64 20 69 66 20 6e 6f 74 20 73 70 65  n and if not spe
1650: 63 69 66 69 63 61 6c 6c 79 20 70 72 6f 68 69 62  cifically prohib
1660: 69 74 65 64 20 62 79 20 74 68 65 20 22 2d 2d 6a  ited by the "--j
1670: 61 69 6c 20 30 22 0a 2a 2a 20 20 20 20 20 20 63  ail 0".**      c
1680: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69  ommand-line opti
1690: 6f 6e 2e 20 20 54 68 65 20 72 6f 6f 74 20 6f 66  on.  The root of
16a0: 20 74 68 65 20 6a 61 69 6c 20 69 73 20 74 68 65   the jail is the
16b0: 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 0a   directory that.
16c0: 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 73  **      contains
16d0: 20 74 68 65 20 76 61 72 69 6f 75 73 20 24 48 4f   the various $HO
16e0: 53 54 2e 77 65 62 73 69 74 65 20 63 6f 6e 74 65  ST.website conte
16f0: 6e 74 20 73 75 62 64 69 72 65 63 74 6f 72 69 65  nt subdirectorie
1700: 73 2e 0a 2a 2a 0a 2a 2a 20 28 32 29 20 20 4e 6f  s..**.** (2)  No
1710: 20 69 6e 70 75 74 20 69 73 20 72 65 61 64 20 77   input is read w
1720: 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
1730: 73 20 68 61 73 20 72 6f 6f 74 20 70 72 69 76 69  s has root privi
1740: 6c 65 67 65 73 2e 20 20 52 6f 6f 74 0a 2a 2a 20  leges.  Root.** 
1750: 20 20 20 20 20 70 72 69 76 69 6c 65 67 65 73 20       privileges 
1760: 61 72 65 20 64 72 6f 70 70 65 64 20 70 72 69 6f  are dropped prio
1770: 72 20 74 6f 20 72 65 61 64 69 6e 67 20 61 6e 79  r to reading any
1780: 20 69 6e 70 75 74 20 28 62 75 74 20 61 66 74 65   input (but afte
1790: 72 20 65 6e 74 65 72 69 6e 67 0a 2a 2a 20 20 20  r entering.**   
17a0: 20 20 20 74 68 65 20 63 68 72 6f 6f 74 20 6a 61     the chroot ja
17b0: 69 6c 2c 20 6f 66 20 63 6f 75 72 73 65 29 2e 20  il, of course). 
17c0: 20 49 66 20 72 6f 6f 74 20 70 72 69 76 69 6c 65   If root privile
17d0: 67 65 73 20 63 61 6e 6e 6f 74 20 62 65 20 64 72  ges cannot be dr
17e0: 6f 70 70 65 64 0a 2a 2a 20 20 20 20 20 20 28 66  opped.**      (f
17f0: 6f 72 20 65 78 61 6d 70 6c 65 20 62 65 63 61 75  or example becau
1800: 73 65 20 74 68 65 20 2d 2d 75 73 65 72 20 63 6f  se the --user co
1810: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f  mmand-line optio
1820: 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 20 6f 72  n was omitted or
1830: 0a 2a 2a 20 20 20 20 20 20 62 65 63 61 75 73 65  .**      because
1840: 20 74 68 65 20 75 73 65 72 20 73 70 65 63 69 66   the user specif
1850: 69 65 64 20 62 79 20 74 68 65 20 2d 2d 75 73 65  ied by the --use
1860: 72 20 6f 70 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  r option does no
1870: 74 20 65 78 69 73 74 29 2c 20 0a 2a 2a 20 20 20  t exist), .**   
1880: 20 20 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63     then the proc
1890: 65 73 73 20 61 62 6f 72 74 73 20 77 69 74 68 20  ess aborts with 
18a0: 61 6e 20 65 72 72 6f 72 20 70 72 69 6f 72 20 74  an error prior t
18b0: 6f 20 72 65 61 64 69 6e 67 20 61 6e 79 20 69 6e  o reading any in
18c0: 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20 20  put..**.** (3)  
18d0: 54 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 61 6e  The length of an
18e0: 20 48 54 54 50 20 72 65 71 75 65 73 74 20 69 73   HTTP request is
18f0: 20 6c 69 6d 69 74 65 64 20 74 6f 20 4d 41 58 5f   limited to MAX_
1900: 43 4f 4e 54 45 4e 54 5f 4c 45 4e 47 54 48 20 62  CONTENT_LENGTH b
1910: 79 74 65 73 0a 2a 2a 20 20 20 20 20 20 28 64 65  ytes.**      (de
1920: 66 61 75 6c 74 3a 20 32 35 30 20 6d 69 6c 6c 69  fault: 250 milli
1930: 6f 6e 29 2e 20 20 41 6e 79 20 48 54 54 50 20 72  on).  Any HTTP r
1940: 65 71 75 65 73 74 20 6c 6f 6e 67 65 72 20 74 68  equest longer th
1950: 61 6e 20 74 68 69 73 20 66 61 69 6c 73 0a 2a 2a  an this fails.**
1960: 20 20 20 20 20 20 77 69 74 68 20 61 6e 20 65 72        with an er
1970: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 28 34 29 20 20  ror..**.** (4)  
1980: 54 68 65 72 65 20 61 72 65 20 68 61 72 64 2d 63  There are hard-c
1990: 6f 64 65 64 20 74 69 6d 65 2d 6f 75 74 73 20 6f  oded time-outs o
19a0: 6e 20 65 61 63 68 20 48 54 54 50 20 72 65 71 75  n each HTTP requ
19b0: 65 73 74 2e 20 20 49 66 20 74 68 69 73 20 70 72  est.  If this pr
19c0: 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 77 61  ocess.**      wa
19d0: 69 74 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20  its longer than 
19e0: 74 68 65 20 74 69 6d 65 6f 75 74 20 66 6f 72 20  the timeout for 
19f0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 72 65 71  the complete req
1a00: 75 65 73 74 2c 20 6f 72 20 66 6f 72 20 43 47 49  uest, or for CGI
1a10: 0a 2a 2a 20 20 20 20 20 20 74 6f 20 66 69 6e 69  .**      to fini
1a20: 73 68 20 72 75 6e 6e 69 6e 67 2c 20 74 68 65 6e  sh running, then
1a30: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 61 62   this process ab
1a40: 6f 72 74 73 2e 20 20 28 54 68 65 20 74 69 6d 65  orts.  (The time
1a50: 6f 75 74 20 66 65 61 74 75 72 65 0a 2a 2a 20 20  out feature.**  
1a60: 20 20 20 20 63 61 6e 20 62 65 20 64 69 73 61 62      can be disab
1a70: 6c 65 64 20 75 73 69 6e 67 20 74 68 65 20 2d 2d  led using the --
1a80: 64 65 62 75 67 20 63 6f 6d 6d 61 6e 64 2d 6c 69  debug command-li
1a90: 6e 65 20 6f 70 74 69 6f 6e 2e 29 0a 2a 2a 0a 2a  ne option.).**.*
1aa0: 2a 20 28 35 29 20 20 49 66 20 74 68 65 20 48 54  * (5)  If the HT
1ab0: 54 50 5f 48 4f 53 54 20 72 65 71 75 65 73 74 20  TP_HOST request 
1ac0: 68 65 61 64 65 72 20 63 6f 6e 74 61 69 6e 73 20  header contains 
1ad0: 63 68 61 72 61 63 74 65 72 73 20 6f 74 68 65 72  characters other
1ae0: 20 74 68 61 6e 0a 2a 2a 20 20 20 20 20 20 5b 30   than.**      [0
1af0: 2d 39 61 2d 7a 41 2d 5a 2c 2d 2e 2f 3a 5f 7e 5d  -9a-zA-Z,-./:_~]
1b00: 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65   then the entire
1b10: 20 72 65 71 75 65 73 74 20 69 73 20 72 65 6a 65   request is reje
1b20: 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 28 36 29 20  cted..**.** (6) 
1b30: 20 41 6e 79 20 63 68 61 72 61 63 74 65 72 73 20   Any characters 
1b40: 69 6e 20 74 68 65 20 55 52 49 20 70 61 74 68 6e  in the URI pathn
1b50: 61 6d 65 20 6f 74 68 65 72 20 74 68 61 6e 20 5b  ame other than [
1b60: 30 2d 39 61 2d 7a 41 2d 5a 2c 2d 2e 2f 3a 5f 7e  0-9a-zA-Z,-./:_~
1b70: 5d 0a 2a 2a 20 20 20 20 20 20 61 72 65 20 63 6f  ].**      are co
1b80: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 22 5f 22  nverted into "_"
1b90: 2e 20 20 54 68 69 73 20 61 70 70 6c 69 65 73 20  .  This applies 
1ba0: 74 6f 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20  to the pathname 
1bb0: 6f 6e 6c 79 2c 20 6e 6f 74 0a 2a 2a 20 20 20 20  only, not.**    
1bc0: 20 20 74 6f 20 74 68 65 20 71 75 65 72 79 20 70    to the query p
1bd0: 61 72 61 6d 65 74 65 72 73 20 6f 72 20 66 72 61  arameters or fra
1be0: 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 28 37 29  gment..**.** (7)
1bf0: 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20 63    If the first c
1c00: 68 61 72 61 63 74 65 72 20 6f 66 20 61 6e 79 20  haracter of any 
1c10: 55 52 49 20 70 61 74 68 6e 61 6d 65 20 63 6f 6d  URI pathname com
1c20: 70 6f 6e 65 6e 74 20 69 73 20 22 2e 22 20 6f 72  ponent is "." or
1c30: 20 22 2d 22 0a 2a 2a 20 20 20 20 20 20 74 68 65   "-".**      the
1c40: 6e 20 61 20 34 30 34 20 4e 6f 74 20 46 6f 75 6e  n a 404 Not Foun
1c50: 64 20 72 65 70 6c 79 20 69 73 20 67 65 6e 65 72  d reply is gener
1c60: 61 74 65 64 2e 20 20 54 68 69 73 20 70 72 65 76  ated.  This prev
1c70: 65 6e 74 73 20 61 74 74 61 63 6b 73 0a 2a 2a 20  ents attacks.** 
1c80: 20 20 20 20 20 73 75 63 68 20 61 73 20 69 6e 63       such as inc
1c90: 6c 75 64 69 6e 67 20 22 2e 2e 22 20 6f 72 20 22  luding ".." or "
1ca0: 2e 22 20 64 69 72 65 63 74 6f 72 79 20 65 6c 65  ." directory ele
1cb0: 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 70 61 74  ments in the pat
1cc0: 68 6e 61 6d 65 0a 2a 2a 20 20 20 20 20 20 61 6e  hname.**      an
1cd0: 64 20 61 6c 6c 6f 77 73 20 70 6c 61 63 69 6e 67  d allows placing
1ce0: 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63   files and direc
1cf0: 74 6f 72 69 65 73 20 69 6e 20 74 68 65 20 63 6f  tories in the co
1d00: 6e 74 65 6e 74 20 73 75 62 64 69 72 65 63 74 6f  ntent subdirecto
1d10: 72 79 0a 2a 2a 20 20 20 20 20 20 74 68 61 74 20  ry.**      that 
1d20: 61 72 65 20 69 6e 76 69 73 69 62 6c 65 20 74 6f  are invisible to
1d30: 20 61 6c 6c 20 48 54 54 50 20 72 65 71 75 65 73   all HTTP reques
1d40: 74 73 2c 20 62 79 20 6d 61 6b 69 6e 67 20 74 68  ts, by making th
1d50: 65 20 66 69 72 73 74 20 0a 2a 2a 20 20 20 20 20  e first .**     
1d60: 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
1d70: 65 20 66 69 6c 65 20 6f 72 20 73 75 62 64 69 72  e file or subdir
1d80: 65 63 74 6f 72 79 20 6e 61 6d 65 20 22 2d 22 20  ectory name "-" 
1d90: 6f 72 20 22 2e 22 2e 0a 2a 2a 0a 2a 2a 20 28 38  or "."..**.** (8
1da0: 29 20 20 54 68 65 20 72 65 71 75 65 73 74 20 55  )  The request U
1db0: 52 49 20 6d 75 73 74 20 62 65 67 69 6e 20 77 69  RI must begin wi
1dc0: 74 68 20 22 2f 22 20 6f 72 20 65 6c 73 65 20 61  th "/" or else a
1dd0: 20 34 30 34 20 65 72 72 6f 72 20 69 73 20 67 65   404 error is ge
1de0: 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 28  nerated..**.** (
1df0: 39 29 20 20 54 68 69 73 20 70 72 6f 67 72 61 6d  9)  This program
1e00: 20 6e 65 76 65 72 20 73 65 74 73 20 74 68 65 20   never sets the 
1e10: 76 61 6c 75 65 20 6f 66 20 61 6e 20 65 6e 76 69  value of an envi
1e20: 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
1e30: 20 74 6f 20 61 0a 2a 2a 20 20 20 20 20 20 73 74   to a.**      st
1e40: 72 69 6e 67 20 74 68 61 74 20 62 65 67 69 6e 73  ring that begins
1e50: 20 77 69 74 68 20 22 28 29 20 7b 22 2e 0a 2a 2a   with "() {"..**
1e60: 0a 2a 2a 20 53 65 63 75 72 69 74 79 20 41 75 64  .** Security Aud
1e70: 69 74 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 54 68 69  iting:.**.** Thi
1e80: 73 20 77 65 62 73 65 72 76 65 72 20 6d 6f 73 74  s webserver most
1e90: 6c 79 20 6f 6e 6c 79 20 73 65 72 76 65 73 20 73  ly only serves s
1ea0: 74 61 74 69 63 20 63 6f 6e 74 65 6e 74 2e 20 20  tatic content.  
1eb0: 41 6e 79 20 73 65 63 75 72 69 74 79 20 72 69 73  Any security ris
1ec0: 6b 20 77 69 6c 6c 0a 2a 2a 20 63 6f 6d 65 20 66  k will.** come f
1ed0: 72 6f 6d 20 43 47 49 20 61 6e 64 20 53 43 47 49  rom CGI and SCGI
1ee0: 2e 20 20 54 6f 20 63 68 65 63 6b 20 61 6e 20 69  .  To check an i
1ef0: 6e 73 74 61 6c 6c 61 74 69 6f 6e 20 66 6f 72 20  nstallation for 
1f00: 73 65 63 75 72 69 74 79 2c 20 74 68 65 6e 2c 20  security, then, 
1f10: 69 74 0a 2a 2a 20 6d 61 6b 65 73 20 73 65 6e 73  it.** makes sens
1f20: 65 20 74 6f 20 66 6f 63 75 73 20 6f 6e 20 74 68  e to focus on th
1f30: 65 20 43 47 49 20 61 6e 64 20 53 43 47 49 20 73  e CGI and SCGI s
1f40: 63 72 69 70 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  cripts..**.** To
1f50: 20 6c 6f 63 61 6c 20 61 6c 6c 20 43 47 49 20 66   local all CGI f
1f60: 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iles:.**.**     
1f70: 20 20 20 20 20 66 69 6e 64 20 2a 2e 77 65 62 73       find *.webs
1f80: 69 74 65 20 2d 65 78 65 63 75 74 61 62 6c 65 20  ite -executable 
1f90: 2d 74 79 70 65 20 66 20 2d 70 72 69 6e 74 0a 2a  -type f -print.*
1fa0: 2a 20 20 20 20 20 4f 52 3a 20 20 66 69 6e 64 20  *     OR:  find 
1fb0: 2a 2e 77 65 62 73 69 74 65 20 2d 70 65 72 6d 20  *.website -perm 
1fc0: 2b 30 31 31 31 20 2d 74 79 70 65 20 66 20 2d 70  +0111 -type f -p
1fd0: 72 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  rint.**.** The f
1fe0: 69 72 73 74 20 66 6f 72 6d 20 6f 66 20 74 68 65  irst form of the
1ff0: 20 22 66 69 6e 64 22 20 63 6f 6d 6d 61 6e 64 20   "find" command 
2000: 69 73 20 70 72 65 66 65 72 72 65 64 2c 20 62 75  is preferred, bu
2010: 74 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72  t is only suppor
2020: 74 65 64 0a 2a 2a 20 62 79 20 47 4e 55 20 66 69  ted.** by GNU fi
2030: 6e 64 2e 20 20 4f 6e 20 61 20 4d 61 63 2c 20 79  nd.  On a Mac, y
2040: 6f 75 27 6c 6c 20 68 61 76 65 20 74 6f 20 75 73  ou'll have to us
2050: 65 20 74 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  e the second for
2060: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 66 69 6e 64  m..**.** To find
2070: 20 61 6c 6c 20 53 43 47 49 20 66 69 6c 65 73 3a   all SCGI files:
2080: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
2090: 66 69 6e 64 20 2a 2e 77 65 62 73 69 74 65 20 2d  find *.website -
20a0: 6e 61 6d 65 20 27 2a 2e 73 63 67 69 27 20 2d 74  name '*.scgi' -t
20b0: 79 70 65 20 66 20 2d 70 72 69 6e 74 0a 2a 2a 0a  ype f -print.**.
20c0: 2a 2a 20 49 66 20 61 6e 79 20 66 69 6c 65 20 69  ** If any file i
20d0: 73 20 61 20 73 65 63 75 72 69 74 79 20 63 6f 6e  s a security con
20e0: 63 65 72 6e 2c 20 69 74 20 63 61 6e 20 62 65 20  cern, it can be 
20f0: 64 69 73 61 62 6c 65 64 20 6f 6e 20 61 20 6c 69  disabled on a li
2100: 76 65 0a 2a 2a 20 69 6e 73 74 61 6c 6c 61 74 69  ve.** installati
2110: 6f 6e 20 62 79 20 74 75 72 6e 69 6e 67 20 6f 66  on by turning of
2120: 66 20 72 65 61 64 20 70 65 72 6d 69 73 73 69 6f  f read permissio
2130: 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ns:.**.**       
2140: 20 20 20 63 68 6d 6f 64 20 30 30 30 30 20 66 69     chmod 0000 fi
2150: 6c 65 2d 6f 66 2d 63 6f 6e 63 65 72 6e 0a 2a 2a  le-of-concern.**
2160: 0a 2a 2a 20 53 43 47 49 20 53 70 65 63 69 66 69  .** SCGI Specifi
2170: 63 61 74 69 6f 6e 20 46 69 6c 65 73 3a 0a 2a 2a  cation Files:.**
2180: 0a 2a 2a 20 43 6f 6e 74 65 6e 74 20 66 69 6c 65  .** Content file
2190: 73 20 28 66 69 6c 65 73 20 77 69 74 68 6f 75 74  s (files without
21a0: 20 74 68 65 20 65 78 65 63 75 74 65 20 62 69 74   the execute bit
21b0: 20 73 65 74 29 20 74 68 61 74 20 65 6e 64 20 77   set) that end w
21c0: 69 74 68 20 22 2e 73 63 67 69 22 0a 2a 2a 20 73  ith ".scgi".** s
21d0: 70 65 63 69 66 79 20 61 20 63 6f 6e 6e 65 63 74  pecify a connect
21e0: 69 6f 6e 20 74 6f 20 61 6e 20 53 43 47 49 20 73  ion to an SCGI s
21f0: 65 72 76 65 72 2e 20 20 54 68 65 20 66 6f 72 6d  erver.  The form
2200: 61 74 20 6f 66 20 74 68 65 20 2e 73 63 67 69 20  at of the .scgi 
2210: 66 69 6c 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 20  file.** follows 
2220: 74 68 69 73 20 74 65 6d 70 6c 61 74 65 3a 0a 2a  this template:.*
2230: 2a 0a 2a 2a 20 20 20 20 20 20 53 43 47 49 20 68  *.**      SCGI h
2240: 6f 73 74 6e 61 6d 65 20 70 6f 72 74 0a 2a 2a 20  ostname port.** 
2250: 20 20 20 20 20 66 61 6c 6c 62 61 63 6b 3a 20 66       fallback: f
2260: 61 6c 6c 62 61 63 6b 2d 66 69 6c 65 6e 61 6d 65  allback-filename
2270: 0a 2a 2a 20 20 20 20 20 20 72 65 6c 69 67 68 74  .**      relight
2280: 3a 20 72 65 6c 69 67 68 74 2d 63 6f 6d 6d 61 6e  : relight-comman
2290: 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  d.**.** The firs
22a0: 74 20 6c 69 6e 65 20 73 70 65 63 69 66 69 65 73  t line specifies
22b0: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 61 6e   the location an
22c0: 64 20 54 43 50 2f 49 50 20 70 6f 72 74 20 6f 66  d TCP/IP port of
22d0: 20 74 68 65 20 53 43 47 49 20 73 65 72 76 65 72   the SCGI server
22e0: 0a 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 68 61  .** that will ha
22f0: 6e 64 6c 65 20 74 68 65 20 72 65 71 75 65 73 74  ndle the request
2300: 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 6c 69  .  Subsequent li
2310: 6e 65 73 20 64 65 74 65 72 6d 69 6e 65 20 77 68  nes determine wh
2320: 61 74 20 74 6f 20 64 6f 20 69 66 0a 2a 2a 20 74  at to do if.** t
2330: 68 65 20 53 43 47 49 20 73 65 72 76 65 72 20 63  he SCGI server c
2340: 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 74 61 63 74  annot be contact
2350: 65 64 2e 20 20 49 66 20 74 68 65 20 22 72 65 6c  ed.  If the "rel
2360: 69 67 68 74 3a 22 20 6c 69 6e 65 20 69 73 20 70  ight:" line is p
2370: 72 65 73 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20  resent,.** then 
2380: 74 68 65 20 72 65 6c 69 67 68 74 2d 63 6f 6d 6d  the relight-comm
2390: 61 6e 64 20 69 73 20 72 75 6e 20 75 73 69 6e 67  and is run using
23a0: 20 73 79 73 74 65 6d 28 29 20 61 6e 64 20 74 68   system() and th
23b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 0a  e connection is.
23c0: 2a 2a 20 72 65 74 72 69 65 64 20 61 66 74 65 72  ** retried after
23d0: 20 61 20 31 2d 73 65 63 6f 6e 64 20 64 65 6c 61   a 1-second dela
23e0: 79 2e 20 20 55 73 65 20 22 26 22 20 61 74 20 74  y.  Use "&" at t
23f0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 65  he end of the re
2400: 6c 69 67 68 74 2d 63 6f 6d 6d 61 6e 64 0a 2a 2a  light-command.**
2410: 20 74 6f 20 72 75 6e 20 69 74 20 69 6e 20 74 68   to run it in th
2420: 65 20 62 61 63 6b 67 72 6f 75 6e 64 2e 20 20 4d  e background.  M
2430: 61 6b 65 20 73 75 72 65 20 74 68 65 20 72 65 6c  ake sure the rel
2440: 69 67 68 74 2d 63 6f 6d 6d 61 6e 64 20 64 6f 65  ight-command doe
2450: 73 20 6e 6f 74 0a 2a 2a 20 73 65 6e 64 20 67 65  s not.** send ge
2460: 6e 65 72 61 74 65 20 6f 75 74 70 75 74 2c 20 6f  nerate output, o
2470: 72 20 74 68 61 74 20 6f 75 74 70 75 74 20 77 69  r that output wi
2480: 6c 6c 20 62 65 63 6f 6d 65 20 70 61 72 74 20 6f  ll become part o
2490: 66 20 74 68 65 20 53 43 47 49 20 72 65 70 6c 79  f the SCGI reply
24a0: 2e 0a 2a 2a 20 41 64 64 20 61 20 22 3e 2f 64 65  ..** Add a ">/de
24b0: 76 2f 6e 75 6c 6c 22 20 73 75 66 66 69 78 20 28  v/null" suffix (
24c0: 62 65 66 6f 72 65 20 74 68 65 20 22 26 22 29 20  before the "&") 
24d0: 74 6f 20 74 68 65 20 72 65 6c 69 67 68 74 2d 63  to the relight-c
24e0: 6f 6d 6d 61 6e 64 20 69 66 0a 2a 2a 20 6e 65 63  ommand if.** nec
24f0: 65 73 73 61 72 79 20 74 6f 20 73 75 70 70 72 65  essary to suppre
2500: 73 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 74  ss output.  If t
2510: 68 65 72 65 20 69 73 20 6e 6f 20 72 65 6c 69 67  here is no relig
2520: 68 74 2d 63 6f 6d 6d 61 6e 64 2c 20 6f 72 20 69  ht-command, or i
2530: 66 20 74 68 65 0a 2a 2a 20 72 65 6c 69 67 68 74  f the.** relight
2540: 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 62 75   is attempted bu
2550: 74 20 74 68 65 20 53 43 47 49 20 73 65 72 76 65  t the SCGI serve
2560: 72 20 73 74 69 6c 6c 20 63 61 6e 6e 6f 74 20 62  r still cannot b
2570: 65 20 63 6f 6e 74 61 63 74 65 64 2c 20 74 68 65  e contacted, the
2580: 6e 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  n.** the content
2590: 20 6f 66 20 74 68 65 20 66 61 6c 6c 62 61 63 6b   of the fallback
25a0: 2d 66 69 6c 65 6e 61 6d 65 20 66 69 6c 65 20 69  -filename file i
25b0: 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 61 20  s returned as a 
25c0: 73 75 62 73 74 69 74 75 74 65 20 66 6f 72 0a 2a  substitute for.*
25d0: 2a 20 74 68 65 20 53 43 47 49 20 72 65 71 75 65  * the SCGI reque
25e0: 73 74 2e 20 20 54 68 65 20 6d 69 6d 65 74 79 70  st.  The mimetyp
25f0: 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
2600: 62 79 20 74 68 65 20 73 75 66 66 69 78 20 6f 6e  by the suffix on
2610: 20 74 68 65 0a 2a 2a 20 66 61 6c 6c 62 61 63 6b   the.** fallback
2620: 2d 66 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 20  -filename.  The 
2630: 66 61 6c 6c 62 61 63 6b 2d 66 69 6c 65 6e 61 6d  fallback-filenam
2640: 65 20 77 6f 75 6c 64 20 74 79 70 69 63 61 6c 6c  e would typicall
2650: 79 20 62 65 20 61 6e 20 65 72 72 6f 72 0a 2a 2a  y be an error.**
2660: 20 6d 65 73 73 61 67 65 20 69 6e 64 69 63 61 74   message indicat
2670: 69 6e 67 20 74 68 61 74 20 74 68 65 20 73 65 72  ing that the ser
2680: 76 69 63 65 20 69 73 20 74 65 6d 70 6f 72 61 72  vice is temporar
2690: 69 6c 79 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e  ily unavailable.
26a0: 0a 2a 2a 0a 2a 2a 20 42 61 73 69 63 20 41 75 74  .**.** Basic Aut
26b0: 68 6f 72 69 7a 61 74 69 6f 6e 3a 0a 2a 2a 0a 2a  horization:.**.*
26c0: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 22 2d  * If the file "-
26d0: 61 75 74 68 22 20 65 78 69 73 74 73 20 69 6e 20  auth" exists in 
26e0: 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f  the same directo
26f0: 72 79 20 61 73 20 74 68 65 20 63 6f 6e 74 65 6e  ry as the conten
2700: 74 20 66 69 6c 65 0a 2a 2a 20 28 66 6f 72 20 62  t file.** (for b
2710: 6f 74 68 20 73 74 61 74 69 63 20 63 6f 6e 74 65  oth static conte
2720: 6e 74 20 61 6e 64 20 43 47 49 29 20 74 68 65 6e  nt and CGI) then
2730: 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   it contains the
2740: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65   information use
2750: 64 0a 2a 2a 20 66 6f 72 20 62 61 73 69 63 20 61  d.** for basic a
2760: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 2e 20 20 54  uthorization.  T
2770: 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  he file format i
2780: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
2790: 0a 2a 2a 20 20 20 20 2a 20 20 42 6c 61 6e 6b 20  .**    *  Blank 
27a0: 6c 69 6e 65 73 20 61 6e 64 20 6c 69 6e 65 73 20  lines and lines 
27b0: 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20  that begin with 
27c0: 27 23 27 20 61 72 65 20 69 67 6e 6f 72 65 64 0a  '#' are ignored.
27d0: 2a 2a 20 20 20 20 2a 20 20 22 68 74 74 70 2d 72  **    *  "http-r
27e0: 65 64 69 72 65 63 74 22 20 66 6f 72 63 65 73 20  edirect" forces 
27f0: 61 20 72 65 64 69 72 65 63 74 20 74 6f 20 48 54  a redirect to HT
2800: 54 50 53 20 69 66 20 6e 6f 74 20 74 68 65 72 65  TPS if not there
2810: 20 61 6c 72 65 61 64 79 0a 2a 2a 20 20 20 20 2a   already.**    *
2820: 20 20 22 68 74 74 70 73 2d 6f 6e 6c 79 22 20 64    "https-only" d
2830: 69 73 61 6c 6c 6f 77 73 20 6f 70 65 72 61 74 69  isallows operati
2840: 6f 6e 20 69 6e 20 48 54 54 50 0a 2a 2a 20 20 20  on in HTTP.**   
2850: 20 2a 20 20 22 75 73 65 72 20 4e 41 4d 45 20 4c   *  "user NAME L
2860: 4f 47 49 4e 3a 50 41 53 53 57 4f 52 44 22 20 63  OGIN:PASSWORD" c
2870: 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
2880: 4c 4f 47 49 4e 3a 50 41 53 53 57 4f 52 44 20 0a  LOGIN:PASSWORD .
2890: 2a 2a 20 20 20 20 20 20 20 61 75 74 68 6f 72 69  **       authori
28a0: 7a 61 74 69 6f 6e 20 63 72 65 64 65 6e 74 69 61  zation credentia
28b0: 6c 73 20 61 72 65 20 70 72 6f 76 69 64 65 64 2c  ls are provided,
28c0: 20 61 6e 64 20 69 66 20 73 6f 20 73 65 74 73 20   and if so sets 
28d0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 52 45 4d  the.**       REM
28e0: 4f 54 45 5f 55 53 45 52 20 74 6f 20 4e 41 4d 45  OTE_USER to NAME
28f0: 2e 0a 2a 2a 20 20 20 20 2a 20 20 22 72 65 61 6c  ..**    *  "real
2900: 6d 20 54 45 58 54 22 20 73 65 74 73 20 74 68 65  m TEXT" sets the
2910: 20 72 65 61 6c 6d 20 74 6f 20 54 45 58 54 2e 0a   realm to TEXT..
2920: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 63 61 6e 20  **.** There can 
2930: 62 65 20 6d 75 6c 74 69 70 6c 65 20 22 75 73 65  be multiple "use
2940: 72 22 20 6c 69 6e 65 73 2e 20 20 49 66 20 6e 6f  r" lines.  If no
2950: 20 22 75 73 65 72 22 20 6c 69 6e 65 20 6d 61 74   "user" line mat
2960: 63 68 65 73 2c 20 74 68 65 0a 2a 2a 20 72 65 71  ches, the.** req
2970: 75 65 73 74 20 66 61 69 6c 73 20 77 69 74 68 20  uest fails with 
2980: 61 20 34 30 31 20 65 72 72 6f 72 2e 0a 2a 2a 0a  a 401 error..**.
2990: 2a 2a 20 42 65 63 61 75 73 65 20 6f 66 20 73 65  ** Because of se
29a0: 63 75 72 69 74 79 20 72 75 6c 65 20 28 37 29 2c  curity rule (7),
29b0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   there is no way
29c0: 20 66 6f 72 20 74 68 65 20 63 6f 6e 74 65 6e 74   for the content
29d0: 20 6f 66 20 74 68 65 20 22 2d 61 75 74 68 22 0a   of the "-auth".
29e0: 2a 2a 20 66 69 6c 65 20 74 6f 20 6c 65 61 6b 20  ** file to leak 
29f0: 6f 75 74 20 76 69 61 20 48 54 54 50 20 72 65 71  out via HTTP req
2a00: 75 65 73 74 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  uest..*/.#includ
2a10: 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63  e <stdio.h>.#inc
2a20: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23  lude <ctype.h>.#
2a30: 69 6e 63 6c 75 64 65 20 3c 73 79 73 6c 6f 67 2e  include <syslog.
2a40: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h>.#include <std
2a50: 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  lib.h>.#include 
2a60: 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e  <sys/stat.h>.#in
2a70: 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e  clude <unistd.h>
2a80: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
2a90: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
2aa0: 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ring.h>.#include
2ab0: 20 3c 70 77 64 2e 68 3e 0a 23 69 6e 63 6c 75 64   <pwd.h>.#includ
2ac0: 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23  e <sys/time.h>.#
2ad0: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70  include <sys/typ
2ae0: 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  es.h>.#include <
2af0: 73 79 73 2f 73 6f 63 6b 65 74 2e 68 3e 0a 23 69  sys/socket.h>.#i
2b00: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 77 61 69 74  nclude <sys/wait
2b10: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6e 65  .h>.#include <ne
2b20: 74 69 6e 65 74 2f 69 6e 2e 68 3e 0a 23 69 6e 63  tinet/in.h>.#inc
2b30: 6c 75 64 65 20 3c 61 72 70 61 2f 69 6e 65 74 2e  lude <arpa/inet.
2b40: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h>.#include <std
2b50: 61 72 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  arg.h>.#include 
2b60: 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  <time.h>.#includ
2b70: 65 20 3c 73 79 73 2f 74 69 6d 65 73 2e 68 3e 0a  e <sys/times.h>.
2b80: 23 69 6e 63 6c 75 64 65 20 3c 6e 65 74 64 62 2e  #include <netdb.
2b90: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
2ba0: 6e 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  no.h>.#include <
2bb0: 73 79 73 2f 72 65 73 6f 75 72 63 65 2e 68 3e 0a  sys/resource.h>.
2bc0: 23 69 6e 63 6c 75 64 65 20 3c 73 69 67 6e 61 6c  #include <signal
2bd0: 2e 68 3e 0a 23 69 66 64 65 66 20 6c 69 6e 75 78  .h>.#ifdef linux
2be0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73  .#include <sys/s
2bf0: 65 6e 64 66 69 6c 65 2e 68 3e 0a 23 65 6e 64 69  endfile.h>.#endi
2c00: 66 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65  f.#include <asse
2c10: 72 74 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  rt.h>../*.** Con
2c20: 66 69 67 75 72 65 20 74 68 65 20 73 65 72 76 65  figure the serve
2c30: 72 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  r by setting the
2c40: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
2c50: 73 20 61 6e 64 20 72 65 63 6f 6d 70 69 6c 69 6e  s and recompilin
2c60: 67 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 44 45  g..*/.#ifndef DE
2c70: 46 41 55 4c 54 5f 50 4f 52 54 0a 23 64 65 66 69  FAULT_PORT.#defi
2c80: 6e 65 20 44 45 46 41 55 4c 54 5f 50 4f 52 54 20  ne DEFAULT_PORT 
2c90: 22 38 30 22 20 20 20 20 20 20 20 20 20 20 20 20  "80"            
2ca0: 20 2f 2a 20 44 65 66 61 75 6c 74 20 54 43 50 20   /* Default TCP 
2cb0: 70 6f 72 74 20 66 6f 72 20 48 54 54 50 20 2a 2f  port for HTTP */
2cc0: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
2cd0: 4d 41 58 5f 43 4f 4e 54 45 4e 54 5f 4c 45 4e 47  MAX_CONTENT_LENG
2ce0: 54 48 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 43  TH.#define MAX_C
2cf0: 4f 4e 54 45 4e 54 5f 4c 45 4e 47 54 48 20 32 35  ONTENT_LENGTH 25
2d00: 30 30 30 30 30 30 30 20 20 2f 2a 20 4d 61 78 20  0000000  /* Max 
2d10: 6c 65 6e 67 74 68 20 6f 66 20 48 54 54 50 20 72  length of HTTP r
2d20: 65 71 75 65 73 74 20 63 6f 6e 74 65 6e 74 20 2a  equest content *
2d30: 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
2d40: 57 65 20 72 65 63 6f 72 64 20 6d 6f 73 74 20 6f  We record most o
2d50: 66 20 74 68 65 20 73 74 61 74 65 20 69 6e 66 6f  f the state info
2d60: 72 6d 61 74 69 6f 6e 20 61 73 20 67 6c 6f 62 61  rmation as globa
2d70: 6c 20 76 61 72 69 61 62 6c 65 73 2e 20 20 54 68  l variables.  Th
2d80: 69 73 0a 2a 2a 20 73 61 76 65 73 20 68 61 76 69  is.** saves havi
2d90: 6e 67 20 74 6f 20 70 61 73 73 20 69 6e 66 6f 72  ng to pass infor
2da0: 6d 61 74 69 6f 6e 20 74 6f 20 73 75 62 72 6f 75  mation to subrou
2db0: 74 69 6e 65 73 20 61 73 20 70 61 72 61 6d 65 74  tines as paramet
2dc0: 65 72 73 2c 20 61 6e 64 0a 2a 2a 20 6d 61 6b 65  ers, and.** make
2dd0: 73 20 74 68 65 20 65 78 65 63 75 74 61 62 6c 65  s the executable
2de0: 20 73 6d 61 6c 6c 65 72 2e 2e 2e 0a 2a 2f 0a 73   smaller....*/.s
2df0: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 52 6f 6f  tatic char *zRoo
2e00: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
2e10: 2f 2a 20 52 6f 6f 74 20 64 69 72 65 63 74 6f 72  /* Root director
2e20: 79 20 6f 66 20 74 68 65 20 77 65 62 73 69 74 65  y of the website
2e30: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
2e40: 2a 7a 54 6d 70 4e 61 6d 20 3d 20 30 3b 20 20 20  *zTmpNam = 0;   
2e50: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2e60: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
2e70: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
2e80: 7a 54 6d 70 4e 61 6d 42 75 66 5b 35 30 30 5d 3b  zTmpNamBuf[500];
2e90: 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f       /* Space to
2ea0: 20 68 6f 6c 64 20 74 68 65 20 74 65 6d 70 6f 72   hold the tempor
2eb0: 61 72 79 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a  ary filename */.
2ec0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 50 72  static char *zPr
2ed0: 6f 74 6f 63 6f 6c 20 3d 20 30 3b 20 20 20 20 20  otocol = 0;     
2ee0: 20 2f 2a 20 54 68 65 20 70 72 6f 74 6f 63 6f 6c   /* The protocol
2ef0: 20 62 65 69 6e 67 20 75 73 69 6e 67 20 62 79 20   being using by 
2f00: 74 68 65 20 62 72 6f 77 73 65 72 20 2a 2f 0a 73  the browser */.s
2f10: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 4d 65 74  tatic char *zMet
2f20: 68 6f 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  hod = 0;        
2f30: 2f 2a 20 54 68 65 20 6d 65 74 68 6f 64 2e 20 20  /* The method.  
2f40: 4d 75 73 74 20 62 65 20 47 45 54 20 2a 2f 0a 73  Must be GET */.s
2f50: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 53 63 72  tatic char *zScr
2f60: 69 70 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ipt = 0;        
2f70: 2f 2a 20 54 68 65 20 6f 62 6a 65 63 74 20 74 6f  /* The object to
2f80: 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 73 74 61   retrieve */.sta
2f90: 74 69 63 20 63 68 61 72 20 2a 7a 52 65 61 6c 53  tic char *zRealS
2fa0: 63 72 69 70 74 20 3d 20 30 3b 20 20 20 20 2f 2a  cript = 0;    /*
2fb0: 20 54 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 72   The object to r
2fc0: 65 74 72 69 65 76 65 2e 20 20 53 61 6d 65 20 61  etrieve.  Same a
2fd0: 73 20 7a 53 63 72 69 70 74 0a 20 20 20 20 20 20  s zScript.      
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78             ** ex
3000: 63 65 70 74 20 6d 69 67 68 74 20 68 61 76 65 20  cept might have 
3010: 22 2f 69 6e 64 65 78 2e 68 74 6d 6c 22 20 61 70  "/index.html" ap
3020: 70 65 6e 64 65 64 20 2a 2f 0a 73 74 61 74 69 63  pended */.static
3030: 20 63 68 61 72 20 2a 7a 48 6f 6d 65 20 3d 20 30   char *zHome = 0
3040: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
3050: 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74  e directory cont
3060: 61 69 6e 69 6e 67 20 63 6f 6e 74 65 6e 74 20 2a  aining content *
3070: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a  /.static char *z
3080: 51 75 65 72 79 53 74 72 69 6e 67 20 3d 20 30 3b  QueryString = 0;
3090: 20 20 20 2f 2a 20 54 68 65 20 71 75 65 72 79 20     /* The query 
30a0: 73 74 72 69 6e 67 20 6f 6e 20 74 68 65 20 65 6e  string on the en
30b0: 64 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 2a 2f  d of the name */
30c0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 46  .static char *zF
30d0: 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ile = 0;        
30e0: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 6e 61 6d    /* The filenam
30f0: 65 20 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 20  e of the object 
3100: 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 73  to retrieve */.s
3110: 74 61 74 69 63 20 69 6e 74 20 6c 65 6e 46 69 6c  tatic int lenFil
3120: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
3130: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65  /* Length of the
3140: 20 7a 46 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 73   zFile name */.s
3150: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 44 69 72  tatic char *zDir
3160: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
3170: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
3180: 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 69 6e 67  irectory holding
3190: 20 7a 46 69 6c 65 20 2a 2f 0a 73 74 61 74 69 63   zFile */.static
31a0: 20 63 68 61 72 20 2a 7a 50 61 74 68 49 6e 66 6f   char *zPathInfo
31b0: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 50 61   = 0;      /* Pa
31c0: 72 74 20 6f 66 20 74 68 65 20 70 61 74 68 6e 61  rt of the pathna
31d0: 6d 65 20 70 61 73 74 20 74 68 65 20 66 69 6c 65  me past the file
31e0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
31f0: 2a 7a 41 67 65 6e 74 20 3d 20 30 3b 20 20 20 20  *zAgent = 0;    
3200: 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 79 70       /* What typ
3210: 65 20 69 66 20 62 72 6f 77 73 65 72 20 69 73 20  e if browser is 
3220: 6d 61 6b 69 6e 67 20 74 68 69 73 20 71 75 65 72  making this quer
3230: 79 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  y */.static char
3240: 20 2a 7a 53 65 72 76 65 72 4e 61 6d 65 20 3d 20   *zServerName = 
3250: 30 3b 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d  0;    /* The nam
3260: 65 20 61 66 74 65 72 20 74 68 65 20 68 74 74 70  e after the http
3270: 3a 2f 2f 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  :// */.static ch
3280: 61 72 20 2a 7a 53 65 72 76 65 72 50 6f 72 74 20  ar *zServerPort 
3290: 3d 20 30 3b 20 20 20 20 2f 2a 20 54 68 65 20 70  = 0;    /* The p
32a0: 6f 72 74 20 6e 75 6d 62 65 72 20 2a 2f 0a 73 74  ort number */.st
32b0: 61 74 69 63 20 63 68 61 72 20 2a 7a 43 6f 6f 6b  atic char *zCook
32c0: 69 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  ie = 0;        /
32d0: 2a 20 43 6f 6f 6b 69 65 73 20 72 65 70 6f 72 74  * Cookies report
32e0: 65 64 20 77 69 74 68 20 74 68 65 20 72 65 71 75  ed with the requ
32f0: 65 73 74 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  est */.static ch
3300: 61 72 20 2a 7a 48 74 74 70 48 6f 73 74 20 3d 20  ar *zHttpHost = 
3310: 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  0;      /* Name 
3320: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
3330: 20 77 65 62 20 62 72 6f 77 73 65 72 20 2a 2f 0a   web browser */.
3340: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 52 65  static char *zRe
3350: 61 6c 50 6f 72 74 20 3d 20 30 3b 20 20 20 20 20  alPort = 0;     
3360: 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 54 43 50   /* The real TCP
3370: 20 70 6f 72 74 20 77 68 65 6e 20 72 75 6e 6e 69   port when runni
3380: 6e 67 20 61 73 20 64 61 65 6d 6f 6e 20 2a 2f 0a  ng as daemon */.
3390: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 52 65  static char *zRe
33a0: 6d 6f 74 65 41 64 64 72 20 3d 20 30 3b 20 20 20  moteAddr = 0;   
33b0: 20 2f 2a 20 49 50 20 61 64 64 72 65 73 73 20 6f   /* IP address o
33c0: 66 20 74 68 65 20 72 65 71 75 65 73 74 20 2a 2f  f the request */
33d0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 52  .static char *zR
33e0: 65 66 65 72 65 72 20 3d 20 30 3b 20 20 20 20 20  eferer = 0;     
33f0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
3400: 20 70 61 67 65 20 74 68 61 74 20 72 65 66 65 72   page that refer
3410: 65 64 20 74 6f 20 75 73 20 2a 2f 0a 73 74 61 74  ed to us */.stat
3420: 69 63 20 63 68 61 72 20 2a 7a 41 63 63 65 70 74  ic char *zAccept
3430: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
3440: 57 68 61 74 20 66 6f 72 6d 61 74 73 20 77 69 6c  What formats wil
3450: 6c 20 62 65 20 61 63 63 65 70 74 65 64 20 2a 2f  l be accepted */
3460: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 41  .static char *zA
3470: 63 63 65 70 74 45 6e 63 6f 64 69 6e 67 20 3d 30  cceptEncoding =0
3480: 3b 20 2f 2a 20 67 7a 69 70 20 6f 72 20 64 65 66  ; /* gzip or def
3490: 61 75 6c 74 20 2a 2f 0a 73 74 61 74 69 63 20 63  ault */.static c
34a0: 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 4c 65 6e  har *zContentLen
34b0: 67 74 68 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74  gth = 0; /* Cont
34c0: 65 6e 74 20 6c 65 6e 67 74 68 20 72 65 70 6f 72  ent length repor
34d0: 74 65 64 20 69 6e 20 74 68 65 20 68 65 61 64 65  ted in the heade
34e0: 72 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  r */.static char
34f0: 20 2a 7a 43 6f 6e 74 65 6e 74 54 79 70 65 20 3d   *zContentType =
3500: 20 30 3b 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74   0;   /* Content
3510: 20 74 79 70 65 20 72 65 70 6f 72 74 65 64 20 69   type reported i
3520: 6e 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  n the header */.
3530: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 51 75  static char *zQu
3540: 65 72 79 53 75 66 66 69 78 20 3d 20 30 3b 20 20  erySuffix = 0;  
3550: 20 2f 2a 20 54 68 65 20 70 61 72 74 20 6f 66 20   /* The part of 
3560: 74 68 65 20 55 52 4c 20 61 66 74 65 72 20 74 68  the URL after th
3570: 65 20 66 69 72 73 74 20 3f 20 2a 2f 0a 73 74 61  e first ? */.sta
3580: 74 69 63 20 63 68 61 72 20 2a 7a 41 75 74 68 54  tic char *zAuthT
3590: 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  ype = 0;      /*
35a0: 20 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   Authorization t
35b0: 79 70 65 20 28 62 61 73 69 63 20 6f 72 20 64 69  ype (basic or di
35c0: 67 65 73 74 29 20 2a 2f 0a 73 74 61 74 69 63 20  gest) */.static 
35d0: 63 68 61 72 20 2a 7a 41 75 74 68 41 72 67 20 3d  char *zAuthArg =
35e0: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41 75 74   0;       /* Aut
35f0: 68 6f 72 69 7a 61 74 69 6f 6e 20 76 61 6c 75 65  horization value
3600: 73 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  s */.static char
3610: 20 2a 7a 52 65 6d 6f 74 65 55 73 65 72 20 3d 20   *zRemoteUser = 
3620: 30 3b 20 20 20 20 2f 2a 20 52 45 4d 4f 54 45 5f  0;    /* REMOTE_
3630: 55 53 45 52 20 73 65 74 20 62 79 20 61 75 74 68  USER set by auth
3640: 6f 72 69 7a 61 74 69 6f 6e 20 6d 6f 64 75 6c 65  orization module
3650: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
3660: 2a 7a 49 66 4e 6f 6e 65 4d 61 74 63 68 3d 20 30  *zIfNoneMatch= 0
3670: 3b 20 20 20 20 2f 2a 20 54 68 65 20 49 66 2d 4e  ;    /* The If-N
3680: 6f 6e 65 2d 4d 61 74 63 68 20 68 65 61 64 65 72  one-Match header
3690: 20 76 61 6c 75 65 20 2a 2f 0a 73 74 61 74 69 63   value */.static
36a0: 20 63 68 61 72 20 2a 7a 49 66 4d 6f 64 69 66 69   char *zIfModifi
36b0: 65 64 53 69 6e 63 65 3d 30 3b 20 2f 2a 20 54 68  edSince=0; /* Th
36c0: 65 20 49 66 2d 4d 6f 64 69 66 69 65 64 2d 53 69  e If-Modified-Si
36d0: 6e 63 65 20 68 65 61 64 65 72 20 76 61 6c 75 65  nce header value
36e0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e   */.static int n
36f0: 49 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  In = 0;         
3700: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3710: 66 20 62 79 74 65 73 20 6f 66 20 69 6e 70 75 74  f bytes of input
3720: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e   */.static int n
3730: 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Out = 0;        
3740: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3750: 66 20 62 79 74 65 73 20 6f 66 20 6f 75 74 70 75  f bytes of outpu
3760: 74 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  t */.static char
3770: 20 7a 52 65 70 6c 79 53 74 61 74 75 73 5b 34 5d   zReplyStatus[4]
3780: 3b 20 20 20 20 20 2f 2a 20 52 65 70 6c 79 20 73  ;     /* Reply s
3790: 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 73 74  tatus code */.st
37a0: 61 74 69 63 20 69 6e 74 20 73 74 61 74 75 73 53  atic int statusS
37b0: 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ent = 0;       /
37c0: 2a 20 54 72 75 65 20 61 66 74 65 72 20 73 74 61  * True after sta
37d0: 74 75 73 20 6c 69 6e 65 20 69 73 20 73 65 6e 74  tus line is sent
37e0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
37f0: 2a 7a 4c 6f 67 46 69 6c 65 20 3d 20 30 3b 20 20  *zLogFile = 0;  
3800: 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 6f 20 74       /* Log to t
3810: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 73 74 61 74  his file */.stat
3820: 69 63 20 69 6e 74 20 64 65 62 75 67 46 6c 61 67  ic int debugFlag
3830: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
3840: 54 72 75 65 20 69 66 20 62 65 69 6e 67 20 64 65  True if being de
3850: 62 75 67 67 65 64 20 2a 2f 0a 73 74 61 74 69 63  bugged */.static
3860: 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20   struct timeval 
3870: 62 65 67 69 6e 54 69 6d 65 3b 20 2f 2a 20 54 69  beginTime; /* Ti
3880: 6d 65 20 77 68 65 6e 20 74 68 69 73 20 70 72 6f  me when this pro
3890: 63 65 73 73 20 73 74 61 72 74 73 20 2a 2f 0a 73  cess starts */.s
38a0: 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 43  tatic int closeC
38b0: 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 30 3b 20 20  onnection = 0;  
38c0: 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 6e 64 20  /* True to send 
38d0: 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f 73  Connection: clos
38e0: 65 20 69 6e 20 72 65 70 6c 79 20 2a 2f 0a 73 74  e in reply */.st
38f0: 61 74 69 63 20 69 6e 74 20 6e 52 65 71 75 65 73  atic int nReques
3900: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  t = 0;         /
3910: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 71 75  * Number of requ
3920: 65 73 74 73 20 70 72 6f 63 65 73 73 65 64 20 2a  ests processed *
3930: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 6d 69  /.static int omi
3940: 74 4c 6f 67 20 3d 20 30 3b 20 20 20 20 20 20 20  tLog = 0;       
3950: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6d 61 6b     /* Do not mak
3960: 65 20 6c 6f 67 66 69 6c 65 20 65 6e 74 72 69 65  e logfile entrie
3970: 73 20 69 66 20 74 72 75 65 20 2a 2f 0a 73 74 61  s if true */.sta
3980: 74 69 63 20 69 6e 74 20 75 73 65 48 74 74 70 73  tic int useHttps
3990: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
39a0: 20 54 72 75 65 20 74 6f 20 75 73 65 20 48 54 54   True to use HTT
39b0: 50 53 3a 20 69 6e 73 74 65 61 64 20 6f 66 20 48  PS: instead of H
39c0: 54 54 50 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63  TTP: */.static c
39d0: 68 61 72 20 2a 7a 48 74 74 70 20 3d 20 22 68 74  har *zHttp = "ht
39e0: 74 70 22 3b 20 20 20 20 20 2f 2a 20 68 74 74 70  tp";     /* http
39f0: 20 6f 72 20 68 74 74 70 73 20 2a 2f 0a 73 74 61   or https */.sta
3a00: 74 69 63 20 69 6e 74 20 75 73 65 54 69 6d 65 6f  tic int useTimeo
3a10: 75 74 20 3d 20 31 3b 20 20 20 20 20 20 20 2f 2a  ut = 1;       /*
3a20: 20 54 72 75 65 20 74 6f 20 75 73 65 20 74 69 6d   True to use tim
3a30: 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es */.static int
3a40: 20 73 74 61 6e 64 61 6c 6f 6e 65 20 3d 20 30 3b   standalone = 0;
3a50: 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 20 61 73         /* Run as
3a60: 20 61 20 73 74 61 6e 64 61 6c 6f 6e 65 20 73 65   a standalone se
3a70: 72 76 65 72 20 28 6e 6f 20 69 6e 65 74 64 29 20  rver (no inetd) 
3a80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 70  */.static int ip
3a90: 76 36 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20  v6Only = 0;     
3aa0: 20 20 20 20 2f 2a 20 55 73 65 20 49 50 76 36 20      /* Use IPv6 
3ab0: 6f 6e 6c 79 20 2a 2f 0a 73 74 61 74 69 63 20 69  only */.static i
3ac0: 6e 74 20 69 70 76 34 4f 6e 6c 79 20 3d 20 30 3b  nt ipv4Only = 0;
3ad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
3ae0: 49 50 76 34 20 6f 6e 6c 79 20 2a 2f 0a 73 74 61  IPv4 only */.sta
3af0: 74 69 63 20 73 74 72 75 63 74 20 72 75 73 61 67  tic struct rusag
3b00: 65 20 70 72 69 6f 72 53 65 6c 66 3b 20 20 2f 2a  e priorSelf;  /*
3b10: 20 50 72 65 76 69 6f 75 73 6c 79 20 72 65 70 6f   Previously repo
3b20: 72 74 20 53 45 4c 46 20 74 69 6d 65 20 2a 2f 0a  rt SELF time */.
3b30: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 72 75  static struct ru
3b40: 73 61 67 65 20 70 72 69 6f 72 43 68 69 6c 64 3b  sage priorChild;
3b50: 20 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79 20 72   /* Previously r
3b60: 65 70 6f 72 74 20 43 48 49 4c 44 20 74 69 6d 65  eport CHILD time
3b70: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d   */.static int m
3b80: 78 41 67 65 20 3d 20 31 32 30 3b 20 20 20 20 20  xAge = 120;     
3b90: 20 20 20 20 20 2f 2a 20 43 61 63 68 65 2d 63 6f       /* Cache-co
3ba0: 6e 74 72 6f 6c 20 6d 61 78 2d 61 67 65 20 2a 2f  ntrol max-age */
3bb0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 65  .static char *de
3bc0: 66 61 75 6c 74 5f 70 61 74 68 20 3d 20 22 2f 62  fault_path = "/b
3bd0: 69 6e 3a 2f 75 73 72 2f 62 69 6e 22 3b 20 20 2f  in:/usr/bin";  /
3be0: 2a 20 44 65 66 61 75 6c 74 20 50 41 54 48 20 76  * Default PATH v
3bf0: 61 72 69 61 62 6c 65 20 2a 2f 0a 73 74 61 74 69  ariable */.stati
3c00: 63 20 63 68 61 72 20 2a 7a 53 63 67 69 20 3d 20  c char *zScgi = 
3c10: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  0;          /* V
3c20: 61 6c 75 65 20 6f 66 20 74 68 65 20 53 43 47 49  alue of the SCGI
3c30: 20 65 6e 76 20 76 61 72 69 61 62 6c 65 20 2a 2f   env variable */
3c40: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 70 70 69 6e 67 20  ../*.** Mapping 
3c50: 62 65 74 77 65 65 6e 20 43 47 49 20 76 61 72 69  between CGI vari
3c60: 61 62 6c 65 20 6e 61 6d 65 73 20 61 6e 64 20 76  able names and v
3c70: 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 0a  alues stored in.
3c80: 2a 2a 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ** global variab
3c90: 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  les..*/.static s
3ca0: 74 72 75 63 74 20 7b 0a 20 20 63 68 61 72 20 2a  truct {.  char *
3cb0: 7a 45 6e 76 4e 61 6d 65 3b 0a 20 20 63 68 61 72  zEnvName;.  char
3cc0: 20 2a 2a 70 7a 45 6e 76 56 61 6c 75 65 3b 0a 7d   **pzEnvValue;.}
3cd0: 20 63 67 69 65 6e 76 5b 5d 20 3d 20 7b 0a 20 20   cgienv[] = {.  
3ce0: 7b 20 22 43 4f 4e 54 45 4e 54 5f 4c 45 4e 47 54  { "CONTENT_LENGT
3cf0: 48 22 2c 20 20 20 20 20 20 20 20 20 20 26 7a 43  H",          &zC
3d00: 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 20 7d 2c 20  ontentLength }, 
3d10: 2f 2a 20 4d 75 73 74 20 62 65 20 66 69 72 73 74  /* Must be first
3d20: 20 66 6f 72 20 53 43 47 49 20 2a 2f 0a 20 20 7b   for SCGI */.  {
3d30: 20 22 41 55 54 48 5f 54 59 50 45 22 2c 20 20 20   "AUTH_TYPE",   
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d50: 26 7a 41 75 74 68 54 79 70 65 20 7d 2c 0a 20 20  &zAuthType },.  
3d60: 7b 20 22 41 55 54 48 5f 43 4f 4e 54 45 4e 54 22  { "AUTH_CONTENT"
3d70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3d80: 20 26 7a 41 75 74 68 41 72 67 20 7d 2c 0a 20 20   &zAuthArg },.  
3d90: 7b 20 22 43 4f 4e 54 45 4e 54 5f 54 59 50 45 22  { "CONTENT_TYPE"
3da0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3db0: 20 26 7a 43 6f 6e 74 65 6e 74 54 79 70 65 20 7d   &zContentType }
3dc0: 2c 0a 20 20 7b 20 22 44 4f 43 55 4d 45 4e 54 5f  ,.  { "DOCUMENT_
3dd0: 52 4f 4f 54 22 2c 20 20 20 20 20 20 20 20 20 20  ROOT",          
3de0: 20 20 20 20 20 26 7a 48 6f 6d 65 20 7d 2c 0a 20       &zHome },. 
3df0: 20 7b 20 22 48 54 54 50 5f 41 43 43 45 50 54 22   { "HTTP_ACCEPT"
3e00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3e10: 20 20 26 7a 41 63 63 65 70 74 20 7d 2c 0a 20 20    &zAccept },.  
3e20: 7b 20 22 48 54 54 50 5f 41 43 43 45 50 54 5f 45  { "HTTP_ACCEPT_E
3e30: 4e 43 4f 44 49 4e 47 22 2c 20 20 20 20 20 20 20  NCODING",       
3e40: 20 26 7a 41 63 63 65 70 74 45 6e 63 6f 64 69 6e   &zAcceptEncodin
3e50: 67 20 7d 2c 0a 20 20 7b 20 22 48 54 54 50 5f 43  g },.  { "HTTP_C
3e60: 4f 4f 4b 49 45 22 2c 20 20 20 20 20 20 20 20 20  OOKIE",         
3e70: 20 20 20 20 20 20 20 20 26 7a 43 6f 6f 6b 69 65          &zCookie
3e80: 20 7d 2c 0a 20 20 7b 20 22 48 54 54 50 5f 48 4f   },.  { "HTTP_HO
3e90: 53 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ST",            
3ea0: 20 20 20 20 20 20 20 26 7a 48 74 74 70 48 6f 73         &zHttpHos
3eb0: 74 20 7d 2c 0a 20 20 7b 20 22 48 54 54 50 5f 49  t },.  { "HTTP_I
3ec0: 46 5f 4d 4f 44 49 46 49 45 44 5f 53 49 4e 43 45  F_MODIFIED_SINCE
3ed0: 22 2c 20 20 20 20 20 20 26 7a 49 66 4d 6f 64 69  ",      &zIfModi
3ee0: 66 69 65 64 53 69 6e 63 65 20 7d 2c 0a 20 20 7b  fiedSince },.  {
3ef0: 20 22 48 54 54 50 5f 49 46 5f 4e 4f 4e 45 5f 4d   "HTTP_IF_NONE_M
3f00: 41 54 43 48 22 2c 20 20 20 20 20 20 20 20 20 20  ATCH",          
3f10: 26 7a 49 66 4e 6f 6e 65 4d 61 74 63 68 20 7d 2c  &zIfNoneMatch },
3f20: 0a 20 20 7b 20 22 48 54 54 50 5f 52 45 46 45 52  .  { "HTTP_REFER
3f30: 45 52 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ER",            
3f40: 20 20 20 20 26 7a 52 65 66 65 72 65 72 20 7d 2c      &zReferer },
3f50: 0a 20 20 7b 20 22 48 54 54 50 5f 55 53 45 52 5f  .  { "HTTP_USER_
3f60: 41 47 45 4e 54 22 2c 20 20 20 20 20 20 20 20 20  AGENT",         
3f70: 20 20 20 20 26 7a 41 67 65 6e 74 20 7d 2c 0a 20      &zAgent },. 
3f80: 20 7b 20 22 50 41 54 48 22 2c 20 20 20 20 20 20   { "PATH",      
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fa0: 20 20 26 64 65 66 61 75 6c 74 5f 70 61 74 68 20    &default_path 
3fb0: 7d 2c 0a 20 20 7b 20 22 50 41 54 48 5f 49 4e 46  },.  { "PATH_INF
3fc0: 4f 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  O",             
3fd0: 20 20 20 20 20 20 26 7a 50 61 74 68 49 6e 66 6f        &zPathInfo
3fe0: 20 7d 2c 0a 20 20 7b 20 22 51 55 45 52 59 5f 53   },.  { "QUERY_S
3ff0: 54 52 49 4e 47 22 2c 20 20 20 20 20 20 20 20 20  TRING",         
4000: 20 20 20 20 20 20 20 26 7a 51 75 65 72 79 53 74         &zQuerySt
4010: 72 69 6e 67 20 7d 2c 0a 20 20 7b 20 22 52 45 4d  ring },.  { "REM
4020: 4f 54 45 5f 41 44 44 52 22 2c 20 20 20 20 20 20  OTE_ADDR",      
4030: 20 20 20 20 20 20 20 20 20 20 20 26 7a 52 65 6d             &zRem
4040: 6f 74 65 41 64 64 72 20 7d 2c 0a 20 20 7b 20 22  oteAddr },.  { "
4050: 52 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 22 2c  REQUEST_METHOD",
4060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
4070: 4d 65 74 68 6f 64 20 7d 2c 0a 20 20 7b 20 22 52  Method },.  { "R
4080: 45 51 55 45 53 54 5f 55 52 49 22 2c 20 20 20 20  EQUEST_URI",    
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 53               &zS
40a0: 63 72 69 70 74 20 7d 2c 0a 20 20 7b 20 22 52 45  cript },.  { "RE
40b0: 4d 4f 54 45 5f 55 53 45 52 22 2c 20 20 20 20 20  MOTE_USER",     
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 52 65              &zRe
40d0: 6d 6f 74 65 55 73 65 72 20 7d 2c 0a 20 20 7b 20  moteUser },.  { 
40e0: 22 53 43 47 49 22 2c 20 20 20 20 20 20 20 20 20  "SCGI",         
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
4100: 7a 53 63 67 69 20 7d 2c 0a 20 20 7b 20 22 53 43  zScgi },.  { "SC
4110: 52 49 50 54 5f 44 49 52 45 43 54 4f 52 59 22 2c  RIPT_DIRECTORY",
4120: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 44 69              &zDi
4130: 72 20 7d 2c 0a 20 20 7b 20 22 53 43 52 49 50 54  r },.  { "SCRIPT
4140: 5f 46 49 4c 45 4e 41 4d 45 22 2c 20 20 20 20 20  _FILENAME",     
4150: 20 20 20 20 20 20 20 20 26 7a 46 69 6c 65 20 7d          &zFile }
4160: 2c 0a 20 20 7b 20 22 53 43 52 49 50 54 5f 4e 41  ,.  { "SCRIPT_NA
4170: 4d 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ME",            
4180: 20 20 20 20 20 26 7a 52 65 61 6c 53 63 72 69 70       &zRealScrip
4190: 74 20 7d 2c 0a 20 20 7b 20 22 53 45 52 56 45 52  t },.  { "SERVER
41a0: 5f 4e 41 4d 45 22 2c 20 20 20 20 20 20 20 20 20  _NAME",         
41b0: 20 20 20 20 20 20 20 20 26 7a 53 65 72 76 65 72          &zServer
41c0: 4e 61 6d 65 20 7d 2c 0a 20 20 7b 20 22 53 45 52  Name },.  { "SER
41d0: 56 45 52 5f 50 4f 52 54 22 2c 20 20 20 20 20 20  VER_PORT",      
41e0: 20 20 20 20 20 20 20 20 20 20 20 26 7a 53 65 72             &zSer
41f0: 76 65 72 50 6f 72 74 20 7d 2c 0a 20 20 7b 20 22  verPort },.  { "
4200: 53 45 52 56 45 52 5f 50 52 4f 54 4f 43 4f 4c 22  SERVER_PROTOCOL"
4210: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a  ,             &z
4220: 50 72 6f 74 6f 63 6f 6c 20 7d 2c 0a 7d 3b 0a 0a  Protocol },.};..
4230: 0a 2f 2a 0a 2a 2a 20 44 6f 75 62 6c 65 20 61 6e  ./*.** Double an
4240: 79 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 20 63  y double-quote c
4250: 68 61 72 61 63 74 65 72 73 20 69 6e 20 61 20 73  haracters in a s
4260: 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
4270: 20 63 68 61 72 20 2a 45 73 63 61 70 65 28 63 68   char *Escape(ch
4280: 61 72 20 2a 7a 29 7b 0a 20 20 73 69 7a 65 5f 74  ar *z){.  size_t
4290: 20 69 2c 20 6a 3b 0a 20 20 73 69 7a 65 5f 74 20   i, j;.  size_t 
42a0: 6e 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 63  n;.  char c;.  c
42b0: 68 61 72 20 2a 7a 4f 75 74 3b 0a 20 20 66 6f 72  har *zOut;.  for
42c0: 28 69 3d 30 3b 20 28 63 3d 7a 5b 69 5d 29 21 3d  (i=0; (c=z[i])!=
42d0: 30 20 26 26 20 63 21 3d 27 22 27 3b 20 69 2b 2b  0 && c!='"'; i++
42e0: 29 7b 7d 0a 20 20 69 66 28 20 63 3d 3d 30 20 29  ){}.  if( c==0 )
42f0: 20 72 65 74 75 72 6e 20 7a 3b 0a 20 20 6e 20 3d   return z;.  n =
4300: 20 31 3b 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 28   1;.  for(i++; (
4310: 63 3d 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29  c=z[i])!=0; i++)
4320: 7b 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 6e  { if( c=='"' ) n
4330: 2b 2b 3b 20 7d 0a 20 20 7a 4f 75 74 20 3d 20 6d  ++; }.  zOut = m
4340: 61 6c 6c 6f 63 28 20 69 2b 6e 2b 31 20 29 3b 0a  alloc( i+n+1 );.
4350: 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 20    if( zOut==0 ) 
4360: 72 65 74 75 72 6e 20 22 22 3b 0a 20 20 66 6f 72  return "";.  for
4370: 28 69 3d 6a 3d 30 3b 20 28 63 3d 7a 5b 69 5d 29  (i=j=0; (c=z[i])
4380: 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a  !=0; i++){.    z
4390: 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20  Out[j++] = c;.  
43a0: 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 7a    if( c=='"' ) z
43b0: 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20  Out[j++] = c;.  
43c0: 7d 0a 20 20 7a 4f 75 74 5b 6a 5d 20 3d 20 30 3b  }.  zOut[j] = 0;
43d0: 0a 20 20 72 65 74 75 72 6e 20 7a 4f 75 74 3b 0a  .  return zOut;.
43e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
43f0: 20 61 20 73 74 72 75 63 74 20 74 69 6d 65 76 61   a struct timeva
4400: 6c 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65  l into an intege
4410: 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  r number of mill
4420: 69 73 65 63 6f 6e 64 73 0a 2a 2f 0a 73 74 61 74  iseconds.*/.stat
4430: 69 63 20 69 6e 74 20 74 76 6d 73 28 73 74 72 75  ic int tvms(stru
4440: 63 74 20 74 69 6d 65 76 61 6c 20 2a 70 29 7b 0a  ct timeval *p){.
4450: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28 70    return (int)(p
4460: 2d 3e 74 76 5f 73 65 63 2a 31 30 30 30 30 30 30  ->tv_sec*1000000
4470: 20 2b 20 70 2d 3e 74 76 5f 75 73 65 63 29 3b 0a   + p->tv_usec);.
4480: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 6e  }../*.** Make an
4490: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6c 6f   entry in the lo
44a0: 67 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 20  g file.  If the 
44b0: 48 54 54 50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  HTTP connection 
44c0: 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 63 6c 6f  should be.** clo
44d0: 73 65 64 2c 20 74 68 65 6e 20 74 65 72 6d 69 6e  sed, then termin
44e0: 61 74 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ate this process
44f0: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 72 65 74  .  Otherwise ret
4500: 75 72 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  urn..*/.static v
4510: 6f 69 64 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79  oid MakeLogEntry
4520: 28 69 6e 74 20 65 78 69 74 43 6f 64 65 2c 20 69  (int exitCode, i
4530: 6e 74 20 6c 69 6e 65 4e 75 6d 29 7b 0a 20 20 46  nt lineNum){.  F
4540: 49 4c 45 20 2a 6c 6f 67 3b 0a 20 20 69 66 28 20  ILE *log;.  if( 
4550: 7a 54 6d 70 4e 61 6d 20 29 7b 0a 20 20 20 20 75  zTmpNam ){.    u
4560: 6e 6c 69 6e 6b 28 7a 54 6d 70 4e 61 6d 29 3b 0a  nlink(zTmpNam);.
4570: 20 20 7d 0a 20 20 69 66 28 20 7a 4c 6f 67 46 69    }.  if( zLogFi
4580: 6c 65 20 26 26 20 21 6f 6d 69 74 4c 6f 67 20 29  le && !omitLog )
4590: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 74 69 6d  {.    struct tim
45a0: 65 76 61 6c 20 6e 6f 77 3b 0a 20 20 20 20 73 74  eval now;.    st
45b0: 72 75 63 74 20 74 6d 20 2a 70 54 6d 3b 0a 20 20  ruct tm *pTm;.  
45c0: 20 20 73 74 72 75 63 74 20 72 75 73 61 67 65 20    struct rusage 
45d0: 73 65 6c 66 2c 20 63 68 69 6c 64 72 65 6e 3b 0a  self, children;.
45e0: 20 20 20 20 69 6e 74 20 77 61 69 74 53 74 61 74      int waitStat
45f0: 75 73 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 52  us;.    char *zR
4600: 4d 20 3d 20 7a 52 65 6d 6f 74 65 55 73 65 72 20  M = zRemoteUser 
4610: 3f 20 7a 52 65 6d 6f 74 65 55 73 65 72 20 3a 20  ? zRemoteUser : 
4620: 22 22 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 46  "";.    char *zF
4630: 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 73 69 7a  ilename;.    siz
4640: 65 5f 74 20 73 7a 3b 0a 20 20 20 20 63 68 61 72  e_t sz;.    char
4650: 20 7a 44 61 74 65 5b 32 30 30 5d 3b 0a 20 20 20   zDate[200];.   
4660: 20 63 68 61 72 20 7a 45 78 70 4c 6f 67 46 69 6c   char zExpLogFil
4670: 65 5b 35 30 30 5d 3b 0a 0a 20 20 20 20 69 66 28  e[500];..    if(
4680: 20 7a 53 63 72 69 70 74 3d 3d 30 20 29 20 7a 53   zScript==0 ) zS
4690: 63 72 69 70 74 20 3d 20 22 22 3b 0a 20 20 20 20  cript = "";.    
46a0: 69 66 28 20 7a 52 65 61 6c 53 63 72 69 70 74 3d  if( zRealScript=
46b0: 3d 30 20 29 20 7a 52 65 61 6c 53 63 72 69 70 74  =0 ) zRealScript
46c0: 20 3d 20 22 22 3b 0a 20 20 20 20 69 66 28 20 7a   = "";.    if( z
46d0: 52 65 6d 6f 74 65 41 64 64 72 3d 3d 30 20 29 20  RemoteAddr==0 ) 
46e0: 7a 52 65 6d 6f 74 65 41 64 64 72 20 3d 20 22 22  zRemoteAddr = ""
46f0: 3b 0a 20 20 20 20 69 66 28 20 7a 48 74 74 70 48  ;.    if( zHttpH
4700: 6f 73 74 3d 3d 30 20 29 20 7a 48 74 74 70 48 6f  ost==0 ) zHttpHo
4710: 73 74 20 3d 20 22 22 3b 0a 20 20 20 20 69 66 28  st = "";.    if(
4720: 20 7a 52 65 66 65 72 65 72 3d 3d 30 20 29 20 7a   zReferer==0 ) z
4730: 52 65 66 65 72 65 72 20 3d 20 22 22 3b 0a 20 20  Referer = "";.  
4740: 20 20 69 66 28 20 7a 41 67 65 6e 74 3d 3d 30 20    if( zAgent==0 
4750: 29 20 7a 41 67 65 6e 74 20 3d 20 22 22 3b 0a 20  ) zAgent = "";. 
4760: 20 20 20 67 65 74 74 69 6d 65 6f 66 64 61 79 28     gettimeofday(
4770: 26 6e 6f 77 2c 20 30 29 3b 0a 20 20 20 20 70 54  &now, 0);.    pT
4780: 6d 20 3d 20 6c 6f 63 61 6c 74 69 6d 65 28 26 6e  m = localtime(&n
4790: 6f 77 2e 74 76 5f 73 65 63 29 3b 0a 20 20 20 20  ow.tv_sec);.    
47a0: 73 74 72 66 74 69 6d 65 28 7a 44 61 74 65 2c 20  strftime(zDate, 
47b0: 73 69 7a 65 6f 66 28 7a 44 61 74 65 29 2c 20 22  sizeof(zDate), "
47c0: 25 59 2d 25 6d 2d 25 64 20 25 48 3a 25 4d 3a 25  %Y-%m-%d %H:%M:%
47d0: 53 22 2c 20 70 54 6d 29 3b 0a 20 20 20 20 73 7a  S", pTm);.    sz
47e0: 20 3d 20 73 74 72 66 74 69 6d 65 28 7a 45 78 70   = strftime(zExp
47f0: 4c 6f 67 46 69 6c 65 2c 20 73 69 7a 65 6f 66 28  LogFile, sizeof(
4800: 7a 45 78 70 4c 6f 67 46 69 6c 65 29 2c 20 7a 4c  zExpLogFile), zL
4810: 6f 67 46 69 6c 65 2c 20 70 54 6d 29 3b 0a 20 20  ogFile, pTm);.  
4820: 20 20 69 66 28 20 73 7a 3e 30 20 26 26 20 73 7a    if( sz>0 && sz
4830: 3c 73 69 7a 65 6f 66 28 7a 45 78 70 4c 6f 67 46  <sizeof(zExpLogF
4840: 69 6c 65 29 2d 32 20 29 7b 0a 20 20 20 20 20 20  ile)-2 ){.      
4850: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 45 78 70  zFilename = zExp
4860: 4c 6f 67 46 69 6c 65 3b 0a 20 20 20 20 7d 65 6c  LogFile;.    }el
4870: 73 65 7b 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e  se{.      zFilen
4880: 61 6d 65 20 3d 20 7a 4c 6f 67 46 69 6c 65 3b 0a  ame = zLogFile;.
4890: 20 20 20 20 7d 0a 20 20 20 20 77 61 69 74 70 69      }.    waitpi
48a0: 64 28 2d 31 2c 20 26 77 61 69 74 53 74 61 74 75  d(-1, &waitStatu
48b0: 73 2c 20 57 4e 4f 48 41 4e 47 29 3b 0a 20 20 20  s, WNOHANG);.   
48c0: 20 67 65 74 72 75 73 61 67 65 28 52 55 53 41 47   getrusage(RUSAG
48d0: 45 5f 53 45 4c 46 2c 20 26 73 65 6c 66 29 3b 0a  E_SELF, &self);.
48e0: 20 20 20 20 67 65 74 72 75 73 61 67 65 28 52 55      getrusage(RU
48f0: 53 41 47 45 5f 43 48 49 4c 44 52 45 4e 2c 20 26  SAGE_CHILDREN, &
4900: 63 68 69 6c 64 72 65 6e 29 3b 0a 20 20 20 20 69  children);.    i
4910: 66 28 20 28 6c 6f 67 20 3d 20 66 6f 70 65 6e 28  f( (log = fopen(
4920: 7a 46 69 6c 65 6e 61 6d 65 2c 22 61 22 29 29 21  zFilename,"a"))!
4930: 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 43 4f 4d  =0 ){.#ifdef COM
4940: 42 49 4e 45 44 5f 4c 4f 47 5f 46 4f 52 4d 41 54  BINED_LOG_FORMAT
4950: 0a 20 20 20 20 20 20 73 74 72 66 74 69 6d 65 28  .      strftime(
4960: 7a 44 61 74 65 2c 20 73 69 7a 65 6f 66 28 7a 44  zDate, sizeof(zD
4970: 61 74 65 29 2c 20 22 25 64 2f 25 62 2f 25 59 3a  ate), "%d/%b/%Y:
4980: 25 48 3a 25 4d 3a 25 53 20 25 7a 22 2c 20 70 54  %H:%M:%S %z", pT
4990: 6d 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  m);.      fprint
49a0: 66 28 6c 6f 67 2c 20 22 25 73 20 2d 20 2d 20 5b  f(log, "%s - - [
49b0: 25 73 5d 20 5c 22 25 73 20 25 73 20 25 73 5c 22  %s] \"%s %s %s\"
49c0: 20 25 73 20 25 64 20 5c 22 25 73 5c 22 20 5c 22   %s %d \"%s\" \"
49d0: 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %s\"\n",.       
49e0: 20 20 20 20 20 20 20 7a 52 65 6d 6f 74 65 41 64         zRemoteAd
49f0: 64 72 2c 20 7a 44 61 74 65 2c 20 7a 4d 65 74 68  dr, zDate, zMeth
4a00: 6f 64 2c 20 7a 53 63 72 69 70 74 2c 20 7a 50 72  od, zScript, zPr
4a10: 6f 74 6f 63 6f 6c 2c 0a 20 20 20 20 20 20 20 20  otocol,.        
4a20: 20 20 20 20 20 20 7a 52 65 70 6c 79 53 74 61 74        zReplyStat
4a30: 75 73 2c 20 6e 4f 75 74 2c 20 7a 52 65 66 65 72  us, nOut, zRefer
4a40: 65 72 2c 20 7a 41 67 65 6e 74 29 3b 0a 23 65 6c  er, zAgent);.#el
4a50: 73 65 0a 20 20 20 20 20 20 73 74 72 66 74 69 6d  se.      strftim
4a60: 65 28 7a 44 61 74 65 2c 20 73 69 7a 65 6f 66 28  e(zDate, sizeof(
4a70: 7a 44 61 74 65 29 2c 20 22 25 59 2d 25 6d 2d 25  zDate), "%Y-%m-%
4a80: 64 20 25 48 3a 25 4d 3a 25 53 22 2c 20 70 54 6d  d %H:%M:%S", pTm
4a90: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20  );.      /* Log 
4aa0: 72 65 63 6f 72 64 20 66 69 6c 65 73 3a 0a 20 20  record files:.  
4ab0: 20 20 20 20 2a 2a 20 20 28 31 29 20 44 61 74 65      **  (1) Date
4ac0: 20 61 6e 64 20 74 69 6d 65 0a 20 20 20 20 20 20   and time.      
4ad0: 2a 2a 20 20 28 32 29 20 49 50 20 61 64 64 72 65  **  (2) IP addre
4ae0: 73 73 0a 20 20 20 20 20 20 2a 2a 20 20 28 33 29  ss.      **  (3)
4af0: 20 55 52 4c 20 62 65 69 6e 67 20 61 63 63 65 73   URL being acces
4b00: 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 20 28 34  sed.      **  (4
4b10: 29 20 52 65 66 65 72 65 72 0a 20 20 20 20 20 20  ) Referer.      
4b20: 2a 2a 20 20 28 35 29 20 52 65 70 6c 79 20 73 74  **  (5) Reply st
4b30: 61 74 75 73 0a 20 20 20 20 20 20 2a 2a 20 20 28  atus.      **  (
4b40: 36 29 20 42 79 74 65 73 20 72 65 63 65 69 76 65  6) Bytes receive
4b50: 64 0a 20 20 20 20 20 20 2a 2a 20 20 28 37 29 20  d.      **  (7) 
4b60: 42 79 74 65 73 20 73 65 6e 74 0a 20 20 20 20 20  Bytes sent.     
4b70: 20 2a 2a 20 20 28 38 29 20 53 65 6c 66 20 75 73   **  (8) Self us
4b80: 65 72 20 74 69 6d 65 0a 20 20 20 20 20 20 2a 2a  er time.      **
4b90: 20 20 28 39 29 20 53 65 6c 66 20 73 79 73 74 65    (9) Self syste
4ba0: 6d 20 74 69 6d 65 0a 20 20 20 20 20 20 2a 2a 20  m time.      ** 
4bb0: 28 31 30 29 20 43 68 69 6c 64 72 65 6e 20 75 73  (10) Children us
4bc0: 65 72 20 74 69 6d 65 0a 20 20 20 20 20 20 2a 2a  er time.      **
4bd0: 20 28 31 31 29 20 43 68 69 6c 64 72 65 6e 20 73   (11) Children s
4be0: 79 73 74 65 6d 20 74 69 6d 65 0a 20 20 20 20 20  ystem time.     
4bf0: 20 2a 2a 20 28 31 32 29 20 54 6f 74 61 6c 20 77   ** (12) Total w
4c00: 61 6c 6c 2d 63 6c 6f 63 6b 20 74 69 6d 65 0a 20  all-clock time. 
4c10: 20 20 20 20 20 2a 2a 20 28 31 33 29 20 52 65 71       ** (13) Req
4c20: 75 65 73 74 20 6e 75 6d 62 65 72 20 66 6f 72 20  uest number for 
4c30: 73 61 6d 65 20 54 43 50 2f 49 50 20 63 6f 6e 6e  same TCP/IP conn
4c40: 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ection.      ** 
4c50: 28 31 34 29 20 55 73 65 72 20 61 67 65 6e 74 0a  (14) User agent.
4c60: 20 20 20 20 20 20 2a 2a 20 28 31 35 29 20 52 65        ** (15) Re
4c70: 6d 6f 74 65 20 75 73 65 72 0a 20 20 20 20 20 20  mote user.      
4c80: 2a 2a 20 28 31 36 29 20 42 79 74 65 73 20 6f 66  ** (16) Bytes of
4c90: 20 55 52 4c 20 74 68 61 74 20 63 6f 72 72 65 73   URL that corres
4ca0: 70 6f 6e 64 20 74 6f 20 74 68 65 20 53 43 52 49  pond to the SCRI
4cb0: 50 54 5f 4e 41 4d 45 0a 20 20 20 20 20 20 2a 2a  PT_NAME.      **
4cc0: 20 28 31 37 29 20 4c 69 6e 65 20 6e 75 6d 62 65   (17) Line numbe
4cd0: 72 20 69 6e 20 73 6f 75 72 63 65 20 66 69 6c 65  r in source file
4ce0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
4cf0: 66 70 72 69 6e 74 66 28 6c 6f 67 2c 0a 20 20 20  fprintf(log,.   
4d00: 20 20 20 20 20 22 25 73 2c 25 73 2c 5c 22 25 73       "%s,%s,\"%s
4d10: 3a 2f 2f 25 73 25 73 5c 22 2c 5c 22 25 73 5c 22  ://%s%s\",\"%s\"
4d20: 2c 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 25  ,".           "%
4d30: 73 2c 25 64 2c 25 64 2c 25 64 2c 25 64 2c 25 64  s,%d,%d,%d,%d,%d
4d40: 2c 25 64 2c 25 64 2c 25 64 2c 5c 22 25 73 5c 22  ,%d,%d,%d,\"%s\"
4d50: 2c 5c 22 25 73 5c 22 2c 25 64 2c 25 64 5c 6e 22  ,\"%s\",%d,%d\n"
4d60: 2c 0a 20 20 20 20 20 20 20 20 7a 44 61 74 65 2c  ,.        zDate,
4d70: 20 7a 52 65 6d 6f 74 65 41 64 64 72 2c 20 7a 48   zRemoteAddr, zH
4d80: 74 74 70 2c 20 45 73 63 61 70 65 28 7a 48 74 74  ttp, Escape(zHtt
4d90: 70 48 6f 73 74 29 2c 20 45 73 63 61 70 65 28 7a  pHost), Escape(z
4da0: 53 63 72 69 70 74 29 2c 0a 20 20 20 20 20 20 20  Script),.       
4db0: 20 45 73 63 61 70 65 28 7a 52 65 66 65 72 65 72   Escape(zReferer
4dc0: 29 2c 20 7a 52 65 70 6c 79 53 74 61 74 75 73 2c  ), zReplyStatus,
4dd0: 20 6e 49 6e 2c 20 6e 4f 75 74 2c 0a 20 20 20 20   nIn, nOut,.    
4de0: 20 20 20 20 74 76 6d 73 28 26 73 65 6c 66 2e 72      tvms(&self.r
4df0: 75 5f 75 74 69 6d 65 29 20 2d 20 74 76 6d 73 28  u_utime) - tvms(
4e00: 26 70 72 69 6f 72 53 65 6c 66 2e 72 75 5f 75 74  &priorSelf.ru_ut
4e10: 69 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 74 76  ime),.        tv
4e20: 6d 73 28 26 73 65 6c 66 2e 72 75 5f 73 74 69 6d  ms(&self.ru_stim
4e30: 65 29 20 2d 20 74 76 6d 73 28 26 70 72 69 6f 72  e) - tvms(&prior
4e40: 53 65 6c 66 2e 72 75 5f 73 74 69 6d 65 29 2c 0a  Self.ru_stime),.
4e50: 20 20 20 20 20 20 20 20 74 76 6d 73 28 26 63 68          tvms(&ch
4e60: 69 6c 64 72 65 6e 2e 72 75 5f 75 74 69 6d 65 29  ildren.ru_utime)
4e70: 20 2d 20 74 76 6d 73 28 26 70 72 69 6f 72 43 68   - tvms(&priorCh
4e80: 69 6c 64 2e 72 75 5f 75 74 69 6d 65 29 2c 0a 20  ild.ru_utime),. 
4e90: 20 20 20 20 20 20 20 74 76 6d 73 28 26 63 68 69         tvms(&chi
4ea0: 6c 64 72 65 6e 2e 72 75 5f 73 74 69 6d 65 29 20  ldren.ru_stime) 
4eb0: 2d 20 74 76 6d 73 28 26 70 72 69 6f 72 43 68 69  - tvms(&priorChi
4ec0: 6c 64 2e 72 75 5f 73 74 69 6d 65 29 2c 0a 20 20  ld.ru_stime),.  
4ed0: 20 20 20 20 20 20 74 76 6d 73 28 26 6e 6f 77 29        tvms(&now)
4ee0: 20 2d 20 74 76 6d 73 28 26 62 65 67 69 6e 54 69   - tvms(&beginTi
4ef0: 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 6e 52 65  me),.        nRe
4f00: 71 75 65 73 74 2c 20 45 73 63 61 70 65 28 7a 41  quest, Escape(zA
4f10: 67 65 6e 74 29 2c 20 45 73 63 61 70 65 28 7a 52  gent), Escape(zR
4f20: 4d 29 2c 0a 20 20 20 20 20 20 20 20 28 69 6e 74  M),.        (int
4f30: 29 28 73 74 72 6c 65 6e 28 7a 48 74 74 70 29 2b  )(strlen(zHttp)+
4f40: 73 74 72 6c 65 6e 28 7a 48 74 74 70 48 6f 73 74  strlen(zHttpHost
4f50: 29 2b 73 74 72 6c 65 6e 28 7a 52 65 61 6c 53 63  )+strlen(zRealSc
4f60: 72 69 70 74 29 2b 33 29 2c 0a 20 20 20 20 20 20  ript)+3),.      
4f70: 20 20 6c 69 6e 65 4e 75 6d 0a 20 20 20 20 20 20    lineNum.      
4f80: 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 53 65  );.      priorSe
4f90: 6c 66 20 3d 20 73 65 6c 66 3b 0a 20 20 20 20 20  lf = self;.     
4fa0: 20 70 72 69 6f 72 43 68 69 6c 64 20 3d 20 63 68   priorChild = ch
4fb0: 69 6c 64 72 65 6e 3b 0a 20 20 20 20 20 20 62 65  ildren;.      be
4fc0: 67 69 6e 54 69 6d 65 20 3d 20 6e 6f 77 3b 0a 23  ginTime = now;.#
4fd0: 65 6e 64 69 66 0a 20 20 20 20 20 20 66 63 6c 6f  endif.      fclo
4fe0: 73 65 28 6c 6f 67 29 3b 0a 20 20 20 20 20 20 6e  se(log);.      n
4ff0: 49 6e 20 3d 20 6e 4f 75 74 20 3d 20 30 3b 0a 20  In = nOut = 0;. 
5000: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 63     }.  }.  if( c
5010: 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 29  loseConnection )
5020: 7b 0a 20 20 20 20 65 78 69 74 28 65 78 69 74 43  {.    exit(exitC
5030: 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 73 74 61 74  ode);.  }.  stat
5040: 75 73 53 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  usSent = 0;.}../
5050: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65  *.** Allocate me
5060: 6d 6f 72 79 20 73 61 66 65 6c 79 0a 2a 2f 0a 73  mory safely.*/.s
5070: 74 61 74 69 63 20 63 68 61 72 20 2a 53 61 66 65  tatic char *Safe
5080: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 5f 74 20 73  Malloc( size_t s
5090: 69 7a 65 20 29 7b 0a 20 20 63 68 61 72 20 2a 70  ize ){.  char *p
50a0: 3b 0a 0a 20 20 70 20 3d 20 28 63 68 61 72 2a 29  ;..  p = (char*)
50b0: 6d 61 6c 6c 6f 63 28 73 69 7a 65 29 3b 0a 20 20  malloc(size);.  
50c0: 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
50d0: 73 74 72 63 70 79 28 7a 52 65 70 6c 79 53 74 61  strcpy(zReplySta
50e0: 74 75 73 2c 20 22 39 39 38 22 29 3b 0a 20 20 20  tus, "998");.   
50f0: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 31 2c   MakeLogEntry(1,
5100: 31 30 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 4d  100);  /* LOG: M
5110: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 2a  alloc() failed *
5120: 2f 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  /.    exit(1);. 
5130: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
5140: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
5150: 76 61 6c 75 65 20 6f 66 20 65 6e 76 69 72 6f 6e  value of environ
5160: 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 7a 56  ment variable zV
5170: 61 72 20 74 6f 20 7a 56 61 6c 75 65 2e 0a 2a 2f  ar to zValue..*/
5180: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 65 74  .static void Set
5190: 45 6e 76 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  Env(const char *
51a0: 7a 56 61 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  zVar, const char
51b0: 20 2a 7a 56 61 6c 75 65 29 7b 0a 20 20 63 68 61   *zValue){.  cha
51c0: 72 20 2a 7a 3b 0a 20 20 73 69 7a 65 5f 74 20 6c  r *z;.  size_t l
51d0: 65 6e 3b 0a 20 20 69 66 28 20 7a 56 61 6c 75 65  en;.  if( zValue
51e0: 3d 3d 30 20 29 20 7a 56 61 6c 75 65 3d 22 22 3b  ==0 ) zValue="";
51f0: 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 61 6e  .  /* Disable an
5200: 20 61 74 74 65 6d 70 74 65 64 20 62 61 73 68 64   attempted bashd
5210: 6f 6f 72 20 61 74 74 61 63 6b 20 2a 2f 0a 20 20  oor attack */.  
5220: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 56 61 6c  if( strncmp(zVal
5230: 75 65 2c 22 28 29 20 7b 22 2c 34 29 3d 3d 30 20  ue,"() {",4)==0 
5240: 29 20 7a 56 61 6c 75 65 20 3d 20 22 22 3b 0a 20  ) zValue = "";. 
5250: 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 56   len = strlen(zV
5260: 61 72 29 20 2b 20 73 74 72 6c 65 6e 28 7a 56 61  ar) + strlen(zVa
5270: 6c 75 65 29 20 2b 20 32 3b 0a 20 20 7a 20 3d 20  lue) + 2;.  z = 
5280: 53 61 66 65 4d 61 6c 6c 6f 63 28 6c 65 6e 29 3b  SafeMalloc(len);
5290: 0a 20 20 73 70 72 69 6e 74 66 28 7a 2c 22 25 73  .  sprintf(z,"%s
52a0: 3d 25 73 22 2c 7a 56 61 72 2c 7a 56 61 6c 75 65  =%s",zVar,zValue
52b0: 29 3b 0a 20 20 70 75 74 65 6e 76 28 7a 29 3b 0a  );.  putenv(z);.
52c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
52d0: 74 68 65 20 66 69 72 73 74 20 73 70 61 63 65 2d  the first space-
52e0: 64 65 6c 69 6d 69 74 65 64 20 74 6f 6b 65 6e 20  delimited token 
52f0: 66 72 6f 6d 20 61 20 73 74 72 69 6e 67 20 61 6e  from a string an
5300: 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f  d return.** a po
5310: 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 41 64  inter to it.  Ad
5320: 64 20 61 20 4e 55 4c 4c 20 74 6f 20 74 68 65 20  d a NULL to the 
5330: 73 74 72 69 6e 67 20 74 6f 20 74 65 72 6d 69 6e  string to termin
5340: 61 74 65 20 74 68 65 20 74 6f 6b 65 6e 2e 0a 2a  ate the token..*
5350: 2a 20 4d 61 6b 65 20 2a 7a 4c 65 66 74 4f 76 65  * Make *zLeftOve
5360: 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  r point to the s
5370: 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74  tart of the next
5380: 20 74 6f 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69   token..*/.stati
5390: 63 20 63 68 61 72 20 2a 47 65 74 46 69 72 73 74  c char *GetFirst
53a0: 45 6c 65 6d 65 6e 74 28 63 68 61 72 20 2a 7a 49  Element(char *zI
53b0: 6e 70 75 74 2c 20 63 68 61 72 20 2a 2a 7a 4c 65  nput, char **zLe
53c0: 66 74 4f 76 65 72 29 7b 0a 20 20 63 68 61 72 20  ftOver){.  char 
53d0: 2a 7a 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20  *zResult = 0;.  
53e0: 69 66 28 20 7a 49 6e 70 75 74 3d 3d 30 20 29 7b  if( zInput==0 ){
53f0: 0a 20 20 20 20 69 66 28 20 7a 4c 65 66 74 4f 76  .    if( zLeftOv
5400: 65 72 20 29 20 2a 7a 4c 65 66 74 4f 76 65 72 20  er ) *zLeftOver 
5410: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
5420: 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  0;.  }.  while( 
5430: 69 73 73 70 61 63 65 28 2a 28 75 6e 73 69 67 6e  isspace(*(unsign
5440: 65 64 20 63 68 61 72 2a 29 7a 49 6e 70 75 74 29  ed char*)zInput)
5450: 20 29 7b 20 7a 49 6e 70 75 74 2b 2b 3b 20 7d 0a   ){ zInput++; }.
5460: 20 20 7a 52 65 73 75 6c 74 20 3d 20 7a 49 6e 70    zResult = zInp
5470: 75 74 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 49  ut;.  while( *zI
5480: 6e 70 75 74 20 26 26 20 21 69 73 73 70 61 63 65  nput && !isspace
5490: 28 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  (*(unsigned char
54a0: 2a 29 7a 49 6e 70 75 74 29 20 29 7b 20 7a 49 6e  *)zInput) ){ zIn
54b0: 70 75 74 2b 2b 3b 20 7d 0a 20 20 69 66 28 20 2a  put++; }.  if( *
54c0: 7a 49 6e 70 75 74 20 29 7b 0a 20 20 20 20 2a 7a  zInput ){.    *z
54d0: 49 6e 70 75 74 20 3d 20 30 3b 0a 20 20 20 20 7a  Input = 0;.    z
54e0: 49 6e 70 75 74 2b 2b 3b 0a 20 20 20 20 77 68 69  Input++;.    whi
54f0: 6c 65 28 20 69 73 73 70 61 63 65 28 2a 28 75 6e  le( isspace(*(un
5500: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 49 6e  signed char*)zIn
5510: 70 75 74 29 20 29 7b 20 7a 49 6e 70 75 74 2b 2b  put) ){ zInput++
5520: 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4c  ; }.  }.  if( zL
5530: 65 66 74 4f 76 65 72 20 29 7b 20 2a 7a 4c 65 66  eftOver ){ *zLef
5540: 74 4f 76 65 72 20 3d 20 7a 49 6e 70 75 74 3b 20  tOver = zInput; 
5550: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 73 75  }.  return zResu
5560: 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  lt;.}../*.** Mak
5570: 65 20 61 20 63 6f 70 79 20 6f 66 20 61 20 73 74  e a copy of a st
5580: 72 69 6e 67 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  ring into memory
5590: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
55a0: 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  alloc..*/.static
55b0: 20 63 68 61 72 20 2a 53 74 72 44 75 70 28 63 6f   char *StrDup(co
55c0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63 29 7b  nst char *zSrc){
55d0: 0a 20 20 63 68 61 72 20 2a 7a 44 65 73 74 3b 0a  .  char *zDest;.
55e0: 20 20 73 69 7a 65 5f 74 20 73 69 7a 65 3b 0a 0a    size_t size;..
55f0: 20 20 69 66 28 20 7a 53 72 63 3d 3d 30 20 29 20    if( zSrc==0 ) 
5600: 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 69 7a 65  return 0;.  size
5610: 20 3d 20 73 74 72 6c 65 6e 28 7a 53 72 63 29 20   = strlen(zSrc) 
5620: 2b 20 31 3b 0a 20 20 7a 44 65 73 74 20 3d 20 28  + 1;.  zDest = (
5630: 63 68 61 72 2a 29 53 61 66 65 4d 61 6c 6c 6f 63  char*)SafeMalloc
5640: 28 20 73 69 7a 65 20 29 3b 0a 20 20 73 74 72 63  ( size );.  strc
5650: 70 79 28 7a 44 65 73 74 2c 7a 53 72 63 29 3b 0a  py(zDest,zSrc);.
5660: 20 20 72 65 74 75 72 6e 20 7a 44 65 73 74 3b 0a    return zDest;.
5670: 7d 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 53  }.static char *S
5680: 74 72 41 70 70 65 6e 64 28 63 68 61 72 20 2a 7a  trAppend(char *z
5690: 50 72 69 6f 72 2c 20 63 6f 6e 73 74 20 63 68 61  Prior, const cha
56a0: 72 20 2a 7a 53 65 70 2c 20 63 6f 6e 73 74 20 63  r *zSep, const c
56b0: 68 61 72 20 2a 7a 53 72 63 29 7b 0a 20 20 63 68  har *zSrc){.  ch
56c0: 61 72 20 2a 7a 44 65 73 74 3b 0a 20 20 73 69 7a  ar *zDest;.  siz
56d0: 65 5f 74 20 73 69 7a 65 3b 0a 20 20 69 6e 74 20  e_t size;.  int 
56e0: 6e 31 2c 20 6e 32 3b 0a 0a 20 20 69 66 28 20 7a  n1, n2;..  if( z
56f0: 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
5700: 30 3b 0a 20 20 69 66 28 20 7a 50 72 69 6f 72 3d  0;.  if( zPrior=
5710: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 74 72 44  =0 ) return StrD
5720: 75 70 28 7a 53 72 63 29 3b 0a 20 20 73 69 7a 65  up(zSrc);.  size
5730: 20 3d 20 28 6e 31 3d 73 74 72 6c 65 6e 28 7a 53   = (n1=strlen(zS
5740: 72 63 29 29 20 2b 20 28 6e 32 3d 73 74 72 6c 65  rc)) + (n2=strle
5750: 6e 28 7a 53 65 70 29 29 20 2b 20 73 74 72 6c 65  n(zSep)) + strle
5760: 6e 28 7a 50 72 69 6f 72 29 20 2b 20 31 3b 0a 20  n(zPrior) + 1;. 
5770: 20 7a 44 65 73 74 20 3d 20 28 63 68 61 72 2a 29   zDest = (char*)
5780: 53 61 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  SafeMalloc( size
5790: 20 29 3b 0a 20 20 73 74 72 63 70 79 28 7a 44 65   );.  strcpy(zDe
57a0: 73 74 2c 7a 50 72 69 6f 72 29 3b 0a 20 20 66 72  st,zPrior);.  fr
57b0: 65 65 28 7a 50 72 69 6f 72 29 3b 0a 20 20 73 74  ee(zPrior);.  st
57c0: 72 63 70 79 28 26 7a 44 65 73 74 5b 6e 31 5d 2c  rcpy(&zDest[n1],
57d0: 7a 53 65 70 29 3b 0a 20 20 73 74 72 63 70 79 28  zSep);.  strcpy(
57e0: 26 7a 44 65 73 74 5b 6e 31 2b 6e 32 5d 2c 7a 53  &zDest[n1+n2],zS
57f0: 72 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 44  rc);.  return zD
5800: 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  est;.}../*.** Co
5810: 6d 70 61 72 65 20 74 77 6f 20 45 54 61 67 20 76  mpare two ETag v
5820: 61 6c 75 65 73 2e 20 52 65 74 75 72 6e 20 30 20  alues. Return 0 
5830: 69 66 20 74 68 65 79 20 6d 61 74 63 68 20 61 6e  if they match an
5840: 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  d non-zero if th
5850: 65 79 20 64 69 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  ey differ..**.**
5860: 20 54 68 65 20 6f 6e 65 20 6f 6e 20 74 68 65 20   The one on the 
5870: 6c 65 66 74 20 6d 69 67 68 74 20 62 65 20 61 20  left might be a 
5880: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 6e 64  NULL pointer and
5890: 20 69 74 20 6d 69 67 68 74 20 62 65 20 71 75 6f   it might be quo
58a0: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
58b0: 6e 74 20 43 6f 6d 70 61 72 65 45 74 61 67 73 28  nt CompareEtags(
58c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c 20  const char *zA, 
58d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 29 7b  const char *zB){
58e0: 0a 20 20 69 66 28 20 7a 41 3d 3d 30 20 29 20 72  .  if( zA==0 ) r
58f0: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 7a  eturn 1;.  if( z
5900: 41 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20  A[0]=='"' ){.   
5910: 20 69 6e 74 20 6c 65 6e 42 20 3d 20 28 69 6e 74   int lenB = (int
5920: 29 73 74 72 6c 65 6e 28 7a 42 29 3b 0a 20 20 20  )strlen(zB);.   
5930: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 41 2b   if( strncmp(zA+
5940: 31 2c 20 7a 42 2c 20 6c 65 6e 42 29 3d 3d 30 20  1, zB, lenB)==0 
5950: 26 26 20 7a 41 5b 6c 65 6e 42 2b 31 5d 3d 3d 27  && zA[lenB+1]=='
5960: 22 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  "' ) return 0;. 
5970: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 74 72 63   }.  return strc
5980: 6d 70 28 7a 41 2c 20 7a 42 29 3b 0a 7d 0a 0a 2f  mp(zA, zB);.}../
5990: 2a 0a 2a 2a 20 42 72 65 61 6b 20 61 20 6c 69 6e  *.** Break a lin
59a0: 65 20 61 74 20 74 68 65 20 66 69 72 73 74 20 5c  e at the first \
59b0: 6e 20 6f 72 20 5c 72 20 63 68 61 72 61 63 74 65  n or \r characte
59c0: 72 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69  r seen..*/.stati
59d0: 63 20 76 6f 69 64 20 52 65 6d 6f 76 65 4e 65 77  c void RemoveNew
59e0: 6c 69 6e 65 28 63 68 61 72 20 2a 7a 29 7b 0a 20  line(char *z){. 
59f0: 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
5a00: 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20  rn;.  while( *z 
5a10: 26 26 20 2a 7a 21 3d 27 5c 6e 27 20 26 26 20 2a  && *z!='\n' && *
5a20: 7a 21 3d 27 5c 72 27 20 29 7b 20 7a 2b 2b 3b 20  z!='\r' ){ z++; 
5a30: 7d 0a 20 20 2a 7a 20 3d 20 30 3b 0a 7d 0a 0a 2f  }.  *z = 0;.}../
5a40: 2a 20 52 65 6e 64 65 72 20 73 65 63 6f 6e 64 73  * Render seconds
5a50: 20 73 69 6e 63 65 20 31 39 37 30 20 61 73 20 61   since 1970 as a
5a60: 6e 20 52 46 43 38 32 32 20 64 61 74 65 20 73 74  n RFC822 date st
5a70: 72 69 6e 67 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  ring.  Return.**
5a80: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
5a90: 61 74 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73  at string in a s
5aa0: 74 61 74 69 63 20 62 75 66 66 65 72 2e 0a 2a 2f  tatic buffer..*/
5ab0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 52 66  .static char *Rf
5ac0: 63 38 32 32 44 61 74 65 28 74 69 6d 65 5f 74 20  c822Date(time_t 
5ad0: 74 29 7b 0a 20 20 73 74 72 75 63 74 20 74 6d 20  t){.  struct tm 
5ae0: 2a 74 6d 3b 0a 20 20 73 74 61 74 69 63 20 63 68  *tm;.  static ch
5af0: 61 72 20 7a 44 61 74 65 5b 31 30 30 5d 3b 0a 20  ar zDate[100];. 
5b00: 20 74 6d 20 3d 20 67 6d 74 69 6d 65 28 26 74 29   tm = gmtime(&t)
5b10: 3b 0a 20 20 73 74 72 66 74 69 6d 65 28 7a 44 61  ;.  strftime(zDa
5b20: 74 65 2c 20 73 69 7a 65 6f 66 28 7a 44 61 74 65  te, sizeof(zDate
5b30: 29 2c 20 22 25 61 2c 20 25 64 20 25 62 20 25 59  ), "%a, %d %b %Y
5b40: 20 25 48 3a 25 4d 3a 25 53 20 25 7a 22 2c 20 74   %H:%M:%S %z", t
5b50: 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 44 61  m);.  return zDa
5b60: 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69  te;.}../*.** Pri
5b70: 6e 74 20 61 20 64 61 74 65 20 74 61 67 20 69 6e  nt a date tag in
5b80: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
5b90: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
5ba0: 67 20 69 73 20 7a 54 61 67 2e 0a 2a 2a 20 54 68  g is zTag..** Th
5bb0: 65 20 64 61 74 65 20 69 73 20 64 65 74 65 72 6d  e date is determ
5bc0: 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 75 6e  ined from the un
5bd0: 69 78 20 74 69 6d 65 73 74 61 6d 70 20 67 69 76  ix timestamp giv
5be0: 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  en..*/.static in
5bf0: 74 20 44 61 74 65 54 61 67 28 63 6f 6e 73 74 20  t DateTag(const 
5c00: 63 68 61 72 20 2a 7a 54 61 67 2c 20 74 69 6d 65  char *zTag, time
5c10: 5f 74 20 74 29 7b 0a 20 20 72 65 74 75 72 6e 20  _t t){.  return 
5c20: 70 72 69 6e 74 66 28 22 25 73 3a 20 25 73 5c 72  printf("%s: %s\r
5c30: 5c 6e 22 2c 20 7a 54 61 67 2c 20 52 66 63 38 32  \n", zTag, Rfc82
5c40: 32 44 61 74 65 28 74 29 29 3b 0a 7d 0a 0a 2f 2a  2Date(t));.}../*
5c50: 0a 2a 2a 20 50 61 72 73 65 20 61 6e 20 52 46 43  .** Parse an RFC
5c60: 38 32 32 2d 66 6f 72 6d 61 74 74 65 64 20 74 69  822-formatted ti
5c70: 6d 65 73 74 61 6d 70 20 61 73 20 77 65 27 64 20  mestamp as we'd 
5c80: 65 78 70 65 63 74 20 66 72 6f 6d 20 48 54 54 50  expect from HTTP
5c90: 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61   and return.** a
5ca0: 20 55 6e 69 78 20 65 70 6f 63 68 20 74 69 6d 65   Unix epoch time
5cb0: 2e 20 3c 3d 20 7a 65 72 6f 20 69 73 20 72 65 74  . <= zero is ret
5cc0: 75 72 6e 65 64 20 6f 6e 20 66 61 69 6c 75 72 65  urned on failure
5cd0: 2e 0a 2a 2f 0a 74 69 6d 65 5f 74 20 50 61 72 73  ..*/.time_t Pars
5ce0: 65 52 66 63 38 32 32 44 61 74 65 28 63 6f 6e 73  eRfc822Date(cons
5cf0: 74 20 63 68 61 72 20 2a 7a 44 61 74 65 29 7b 0a  t char *zDate){.
5d00: 20 20 69 6e 74 20 6d 64 61 79 2c 20 6d 6f 6e 2c    int mday, mon,
5d10: 20 79 65 61 72 2c 20 79 64 61 79 2c 20 68 6f 75   year, yday, hou
5d20: 72 2c 20 6d 69 6e 2c 20 73 65 63 3b 0a 20 20 63  r, min, sec;.  c
5d30: 68 61 72 20 7a 49 67 6e 6f 72 65 5b 34 5d 3b 0a  har zIgnore[4];.
5d40: 20 20 63 68 61 72 20 7a 4d 6f 6e 74 68 5b 34 5d    char zMonth[4]
5d50: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
5d60: 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 61 7a 4d   char *const azM
5d70: 6f 6e 74 68 73 5b 5d 20 3d 0a 20 20 20 20 7b 22  onths[] =.    {"
5d80: 4a 61 6e 22 2c 20 22 46 65 62 22 2c 20 22 4d 61  Jan", "Feb", "Ma
5d90: 72 22 2c 20 22 41 70 72 22 2c 20 22 4d 61 79 22  r", "Apr", "May"
5da0: 2c 20 22 4a 75 6e 22 2c 0a 20 20 20 20 20 22 4a  , "Jun",.     "J
5db0: 75 6c 22 2c 20 22 41 75 67 22 2c 20 22 53 65 70  ul", "Aug", "Sep
5dc0: 22 2c 20 22 4f 63 74 22 2c 20 22 4e 6f 76 22 2c  ", "Oct", "Nov",
5dd0: 20 22 44 65 63 22 2c 20 30 7d 3b 0a 20 20 69 66   "Dec", 0};.  if
5de0: 28 20 37 3d 3d 73 73 63 61 6e 66 28 7a 44 61 74  ( 7==sscanf(zDat
5df0: 65 2c 20 22 25 33 5b 41 2d 5a 61 2d 7a 5d 2c 20  e, "%3[A-Za-z], 
5e00: 25 64 20 25 33 5b 41 2d 5a 61 2d 7a 5d 20 25 64  %d %3[A-Za-z] %d
5e10: 20 25 64 3a 25 64 3a 25 64 22 2c 20 7a 49 67 6e   %d:%d:%d", zIgn
5e20: 6f 72 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ore,.           
5e30: 20 20 20 20 20 20 20 20 20 20 20 20 26 6d 64 61              &mda
5e40: 79 2c 20 7a 4d 6f 6e 74 68 2c 20 26 79 65 61 72  y, zMonth, &year
5e50: 2c 20 26 68 6f 75 72 2c 20 26 6d 69 6e 2c 20 26  , &hour, &min, &
5e60: 73 65 63 29 29 7b 0a 20 20 20 20 69 66 28 20 79  sec)){.    if( y
5e70: 65 61 72 20 3e 20 31 39 30 30 20 29 20 79 65 61  ear > 1900 ) yea
5e80: 72 20 2d 3d 20 31 39 30 30 3b 0a 20 20 20 20 66  r -= 1900;.    f
5e90: 6f 72 28 6d 6f 6e 3d 30 3b 20 61 7a 4d 6f 6e 74  or(mon=0; azMont
5ea0: 68 73 5b 6d 6f 6e 5d 3b 20 6d 6f 6e 2b 2b 29 7b  hs[mon]; mon++){
5eb0: 0a 20 20 20 20 20 20 69 66 28 20 21 73 74 72 6e  .      if( !strn
5ec0: 63 6d 70 28 20 61 7a 4d 6f 6e 74 68 73 5b 6d 6f  cmp( azMonths[mo
5ed0: 6e 5d 2c 20 7a 4d 6f 6e 74 68 2c 20 33 20 29 29  n], zMonth, 3 ))
5ee0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 44  {.        int nD
5ef0: 61 79 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ay;.        int 
5f00: 69 73 4c 65 61 70 59 72 3b 0a 20 20 20 20 20 20  isLeapYr;.      
5f10: 20 20 73 74 61 74 69 63 20 69 6e 74 20 70 72 69    static int pri
5f20: 6f 72 44 61 79 73 5b 5d 20 3d 0a 20 20 20 20 20  orDays[] =.     
5f30: 20 20 20 20 7b 20 20 30 2c 20 33 31 2c 20 35 39      {  0, 31, 59
5f40: 2c 20 39 30 2c 31 32 30 2c 31 35 31 2c 31 38 31  , 90,120,151,181
5f50: 2c 32 31 32 2c 32 34 33 2c 32 37 33 2c 33 30 34  ,212,243,273,304
5f60: 2c 33 33 34 20 7d 3b 0a 20 20 20 20 20 20 20 20  ,334 };.        
5f70: 69 66 28 20 6d 6f 6e 3c 30 20 29 7b 0a 20 20 20  if( mon<0 ){.   
5f80: 20 20 20 20 20 20 20 69 6e 74 20 6e 59 65 61 72         int nYear
5f90: 20 3d 20 28 31 31 20 2d 20 6d 6f 6e 29 2f 31 32   = (11 - mon)/12
5fa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 79 65 61 72  ;.          year
5fb0: 20 2d 3d 20 6e 59 65 61 72 3b 0a 20 20 20 20 20   -= nYear;.     
5fc0: 20 20 20 20 20 6d 6f 6e 20 2b 3d 20 6e 59 65 61       mon += nYea
5fd0: 72 2a 31 32 3b 0a 20 20 20 20 20 20 20 20 7d 65  r*12;.        }e
5fe0: 6c 73 65 20 69 66 28 20 6d 6f 6e 3e 31 31 20 29  lse if( mon>11 )
5ff0: 7b 0a 20 20 20 20 20 20 20 20 20 20 79 65 61 72  {.          year
6000: 20 2b 3d 20 6d 6f 6e 2f 31 32 3b 0a 20 20 20 20   += mon/12;.    
6010: 20 20 20 20 20 20 6d 6f 6e 20 25 3d 20 31 32 3b        mon %= 12;
6020: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6030: 20 20 20 69 73 4c 65 61 70 59 72 20 3d 20 79 65     isLeapYr = ye
6040: 61 72 25 34 3d 3d 30 20 26 26 20 28 79 65 61 72  ar%4==0 && (year
6050: 25 31 30 30 21 3d 30 20 7c 7c 20 28 79 65 61 72  %100!=0 || (year
6060: 2b 33 30 30 29 25 34 30 30 3d 3d 30 29 3b 0a 20  +300)%400==0);. 
6070: 20 20 20 20 20 20 20 79 64 61 79 20 3d 20 70 72         yday = pr
6080: 69 6f 72 44 61 79 73 5b 6d 6f 6e 5d 20 2b 20 6d  iorDays[mon] + m
6090: 64 61 79 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  day - 1;.       
60a0: 20 69 66 28 20 69 73 4c 65 61 70 59 72 20 26 26   if( isLeapYr &&
60b0: 20 6d 6f 6e 3e 31 20 29 20 79 64 61 79 2b 2b 3b   mon>1 ) yday++;
60c0: 0a 20 20 20 20 20 20 20 20 6e 44 61 79 20 3d 20  .        nDay = 
60d0: 28 79 65 61 72 2d 37 30 29 2a 33 36 35 20 2b 20  (year-70)*365 + 
60e0: 28 79 65 61 72 2d 36 39 29 2f 34 20 2d 20 79 65  (year-69)/4 - ye
60f0: 61 72 2f 31 30 30 20 2b 20 28 79 65 61 72 2b 33  ar/100 + (year+3
6100: 30 30 29 2f 34 30 30 20 2b 20 79 64 61 79 3b 0a  00)/400 + yday;.
6110: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 28          return (
6120: 28 74 69 6d 65 5f 74 29 28 6e 44 61 79 2a 32 34  (time_t)(nDay*24
6130: 20 2b 20 68 6f 75 72 29 2a 36 30 20 2b 20 6d 69   + hour)*60 + mi
6140: 6e 29 2a 36 30 20 2b 20 73 65 63 3b 0a 20 20 20  n)*60 + sec;.   
6150: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
6160: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
6170: 0a 2a 2a 20 54 65 73 74 20 70 72 6f 63 65 64 75  .** Test procedu
6180: 72 65 20 66 6f 72 20 50 61 72 73 65 52 66 63 38  re for ParseRfc8
6190: 32 32 44 61 74 65 0a 2a 2f 0a 76 6f 69 64 20 54  22Date.*/.void T
61a0: 65 73 74 50 61 72 73 65 52 66 63 38 32 32 44 61  estParseRfc822Da
61b0: 74 65 28 76 6f 69 64 29 7b 0a 20 20 74 69 6d 65  te(void){.  time
61c0: 5f 74 20 74 31 2c 20 74 32 3b 0a 20 20 66 6f 72  _t t1, t2;.  for
61d0: 28 74 31 3d 30 3b 20 74 31 3c 30 78 37 66 66 66  (t1=0; t1<0x7fff
61e0: 66 66 66 66 3b 20 74 31 20 2b 3d 20 31 32 37 29  ffff; t1 += 127)
61f0: 7b 0a 20 20 20 20 74 32 20 3d 20 50 61 72 73 65  {.    t2 = Parse
6200: 52 66 63 38 32 32 44 61 74 65 28 52 66 63 38 32  Rfc822Date(Rfc82
6210: 32 44 61 74 65 28 74 31 29 29 3b 0a 20 20 20 20  2Date(t1));.    
6220: 61 73 73 65 72 74 28 20 74 31 3d 3d 74 32 20 29  assert( t1==t2 )
6230: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
6240: 72 69 6e 74 20 74 68 65 20 66 69 72 73 74 20 6c  rint the first l
6250: 69 6e 65 20 6f 66 20 61 20 72 65 73 70 6f 6e 73  ine of a respons
6260: 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68  e followed by th
6270: 65 20 73 65 72 76 65 72 20 74 79 70 65 2e 0a 2a  e server type..*
6280: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 74  /.static void St
6290: 61 72 74 52 65 73 70 6f 6e 73 65 28 63 6f 6e 73  artResponse(cons
62a0: 74 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 43  t char *zResultC
62b0: 6f 64 65 29 7b 0a 20 20 74 69 6d 65 5f 74 20 6e  ode){.  time_t n
62c0: 6f 77 3b 0a 20 20 74 69 6d 65 28 26 6e 6f 77 29  ow;.  time(&now)
62d0: 3b 0a 20 20 69 66 28 20 73 74 61 74 75 73 53 65  ;.  if( statusSe
62e0: 6e 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e  nt ) return;.  n
62f0: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 25  Out += printf("%
6300: 73 20 25 73 5c 72 5c 6e 22 2c 20 7a 50 72 6f 74  s %s\r\n", zProt
6310: 6f 63 6f 6c 2c 20 7a 52 65 73 75 6c 74 43 6f 64  ocol, zResultCod
6320: 65 29 3b 0a 20 20 73 74 72 6e 63 70 79 28 7a 52  e);.  strncpy(zR
6330: 65 70 6c 79 53 74 61 74 75 73 2c 20 7a 52 65 73  eplyStatus, zRes
6340: 75 6c 74 43 6f 64 65 2c 20 33 29 3b 0a 20 20 7a  ultCode, 3);.  z
6350: 52 65 70 6c 79 53 74 61 74 75 73 5b 33 5d 20 3d  ReplyStatus[3] =
6360: 20 30 3b 0a 20 20 69 66 28 20 7a 52 65 70 6c 79   0;.  if( zReply
6370: 53 74 61 74 75 73 5b 30 5d 3e 3d 27 34 27 20 29  Status[0]>='4' )
6380: 7b 0a 20 20 20 20 63 6c 6f 73 65 43 6f 6e 6e 65  {.    closeConne
6390: 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d 0a 20  ction = 1;.  }. 
63a0: 20 69 66 28 20 63 6c 6f 73 65 43 6f 6e 6e 65 63   if( closeConnec
63b0: 74 69 6f 6e 20 29 7b 0a 20 20 20 20 6e 4f 75 74  tion ){.    nOut
63c0: 20 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 6e   += printf("Conn
63d0: 65 63 74 69 6f 6e 3a 20 63 6c 6f 73 65 5c 72 5c  ection: close\r\
63e0: 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n");.  }else{.  
63f0: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
6400: 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 6b 65  ("Connection: ke
6410: 65 70 2d 61 6c 69 76 65 5c 72 5c 6e 22 29 3b 0a  ep-alive\r\n");.
6420: 20 20 7d 0a 20 20 6e 4f 75 74 20 2b 3d 20 44 61    }.  nOut += Da
6430: 74 65 54 61 67 28 22 44 61 74 65 22 2c 20 6e 6f  teTag("Date", no
6440: 77 29 3b 0a 20 20 73 74 61 74 75 73 53 65 6e 74  w);.  statusSent
6450: 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 1;.}../*.** T
6460: 65 6c 6c 20 74 68 65 20 63 6c 69 65 6e 74 20 74  ell the client t
6470: 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
6480: 73 75 63 68 20 64 6f 63 75 6d 65 6e 74 0a 2a 2f  such document.*/
6490: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4e 6f 74  .static void Not
64a0: 46 6f 75 6e 64 28 69 6e 74 20 6c 69 6e 65 6e 6f  Found(int lineno
64b0: 29 7b 0a 20 20 53 74 61 72 74 52 65 73 70 6f 6e  ){.  StartRespon
64c0: 73 65 28 22 34 30 34 20 4e 6f 74 20 46 6f 75 6e  se("404 Not Foun
64d0: 64 22 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70  d");.  nOut += p
64e0: 72 69 6e 74 66 28 0a 20 20 20 20 22 43 6f 6e 74  rintf(.    "Cont
64f0: 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 68  ent-type: text/h
6500: 74 6d 6c 5c 72 5c 6e 22 0a 20 20 20 20 22 5c 72  tml\r\n".    "\r
6510: 5c 6e 22 0a 20 20 20 20 22 3c 68 65 61 64 3e 3c  \n".    "<head><
6520: 74 69 74 6c 65 20 6c 69 6e 65 6e 6f 3d 5c 22 25  title lineno=\"%
6530: 64 5c 22 3e 4e 6f 74 20 46 6f 75 6e 64 3c 2f 74  d\">Not Found</t
6540: 69 74 6c 65 3e 3c 2f 68 65 61 64 3e 5c 6e 22 0a  itle></head>\n".
6550: 20 20 20 20 22 3c 62 6f 64 79 3e 3c 68 31 3e 44      "<body><h1>D
6560: 6f 63 75 6d 65 6e 74 20 4e 6f 74 20 46 6f 75 6e  ocument Not Foun
6570: 64 3c 2f 68 31 3e 5c 6e 22 0a 20 20 20 20 22 54  d</h1>\n".    "T
6580: 68 65 20 64 6f 63 75 6d 65 6e 74 20 25 73 20 69  he document %s i
6590: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
65a0: 6f 6e 20 74 68 69 73 20 73 65 72 76 65 72 5c 6e  on this server\n
65b0: 22 0a 20 20 20 20 22 3c 2f 62 6f 64 79 3e 5c 6e  ".    "</body>\n
65c0: 22 2c 20 6c 69 6e 65 6e 6f 2c 20 7a 53 63 72 69  ", lineno, zScri
65d0: 70 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e  pt);.  MakeLogEn
65e0: 74 72 79 28 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a  try(0, lineno);.
65f0: 20 20 65 78 69 74 28 30 29 3b 0a 7d 0a 0a 2f 2a    exit(0);.}../*
6600: 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c 69  .** Tell the cli
6610: 65 6e 74 20 74 68 61 74 20 74 68 65 79 20 61 72  ent that they ar
6620: 65 20 6e 6f 74 20 77 65 6c 63 6f 6d 65 64 20 68  e not welcomed h
6630: 65 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ere..*/.static v
6640: 6f 69 64 20 46 6f 72 62 69 64 64 65 6e 28 69 6e  oid Forbidden(in
6650: 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 53 74 61  t lineno){.  Sta
6660: 72 74 52 65 73 70 6f 6e 73 65 28 22 34 30 33 20  rtResponse("403 
6670: 46 6f 72 62 69 64 64 65 6e 22 29 3b 0a 20 20 6e  Forbidden");.  n
6680: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20  Out += printf(. 
6690: 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65     "Content-type
66a0: 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e  : text/plain\r\n
66b0: 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20  ".    "\r\n".   
66c0: 20 22 41 63 63 65 73 73 20 64 65 6e 69 65 64 5c   "Access denied\
66d0: 6e 22 0a 20 20 29 3b 0a 20 20 63 6c 6f 73 65 43  n".  );.  closeC
66e0: 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 31 3b 0a 20  onnection = 1;. 
66f0: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c   MakeLogEntry(0,
6700: 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 65 78 69 74   lineno);.  exit
6710: 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65  (0);.}../*.** Te
6720: 6c 6c 20 74 68 65 20 63 6c 69 65 6e 74 20 74 68  ll the client th
6730: 61 74 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  at authorization
6740: 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
6750: 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 64 6f  access the.** do
6760: 63 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  cument..*/.stati
6770: 63 20 76 6f 69 64 20 4e 6f 74 41 75 74 68 6f 72  c void NotAuthor
6780: 69 7a 65 64 28 63 6f 6e 73 74 20 63 68 61 72 20  ized(const char 
6790: 2a 7a 52 65 61 6c 6d 29 7b 0a 20 20 53 74 61 72  *zRealm){.  Star
67a0: 74 52 65 73 70 6f 6e 73 65 28 22 34 30 31 20 41  tResponse("401 A
67b0: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 52 65 71  uthorization Req
67c0: 75 69 72 65 64 22 29 3b 0a 20 20 6e 4f 75 74 20  uired");.  nOut 
67d0: 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20 22  += printf(.    "
67e0: 57 57 57 2d 41 75 74 68 65 6e 74 69 63 61 74 65  WWW-Authenticate
67f0: 3a 20 42 61 73 69 63 20 72 65 61 6c 6d 3d 5c 22  : Basic realm=\"
6800: 25 73 5c 22 5c 72 5c 6e 22 0a 20 20 20 20 22 43  %s\"\r\n".    "C
6810: 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78  ontent-type: tex
6820: 74 2f 68 74 6d 6c 5c 72 5c 6e 22 0a 20 20 20 20  t/html\r\n".    
6830: 22 5c 72 5c 6e 22 0a 20 20 20 20 22 3c 68 65 61  "\r\n".    "<hea
6840: 64 3e 3c 74 69 74 6c 65 3e 4e 6f 74 20 41 75 74  d><title>Not Aut
6850: 68 6f 72 69 7a 65 64 3c 2f 74 69 74 6c 65 3e 3c  horized</title><
6860: 2f 68 65 61 64 3e 5c 6e 22 0a 20 20 20 20 22 3c  /head>\n".    "<
6870: 62 6f 64 79 3e 3c 68 31 3e 34 30 31 20 4e 6f 74  body><h1>401 Not
6880: 20 41 75 74 68 6f 72 69 7a 65 64 3c 2f 68 31 3e   Authorized</h1>
6890: 5c 6e 22 0a 20 20 20 20 22 41 20 6c 6f 67 69 6e  \n".    "A login
68a0: 20 61 6e 64 20 70 61 73 73 77 6f 72 64 20 61 72   and password ar
68b0: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74  e required for t
68c0: 68 69 73 20 64 6f 63 75 6d 65 6e 74 5c 6e 22 0a  his document\n".
68d0: 20 20 20 20 22 3c 2f 62 6f 64 79 3e 5c 6e 22 2c      "</body>\n",
68e0: 20 7a 52 65 61 6c 6d 29 3b 0a 20 20 4d 61 6b 65   zRealm);.  Make
68f0: 4c 6f 67 45 6e 74 72 79 28 30 2c 20 31 31 30 29  LogEntry(0, 110)
6900: 3b 20 20 2f 2a 20 4c 4f 47 3a 20 4e 6f 74 20 61  ;  /* LOG: Not a
6910: 75 74 68 6f 72 69 7a 65 64 20 2a 2f 0a 7d 0a 0a  uthorized */.}..
6920: 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63  /*.** Tell the c
6930: 6c 69 65 6e 74 20 74 68 61 74 20 74 68 65 72 65  lient that there
6940: 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69 6e 20   is an error in 
6950: 74 68 65 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73  the script..*/.s
6960: 74 61 74 69 63 20 76 6f 69 64 20 43 67 69 45 72  tatic void CgiEr
6970: 72 6f 72 28 76 6f 69 64 29 7b 0a 20 20 53 74 61  ror(void){.  Sta
6980: 72 74 52 65 73 70 6f 6e 73 65 28 22 35 30 30 20  rtResponse("500 
6990: 45 72 72 6f 72 22 29 3b 0a 20 20 6e 4f 75 74 20  Error");.  nOut 
69a0: 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20 22  += printf(.    "
69b0: 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65  Content-type: te
69c0: 78 74 2f 68 74 6d 6c 5c 72 5c 6e 22 0a 20 20 20  xt/html\r\n".   
69d0: 20 22 5c 72 5c 6e 22 0a 20 20 20 20 22 3c 68 65   "\r\n".    "<he
69e0: 61 64 3e 3c 74 69 74 6c 65 3e 43 47 49 20 50 72  ad><title>CGI Pr
69f0: 6f 67 72 61 6d 20 45 72 72 6f 72 3c 2f 74 69 74  ogram Error</tit
6a00: 6c 65 3e 3c 2f 68 65 61 64 3e 5c 6e 22 0a 20 20  le></head>\n".  
6a10: 20 20 22 3c 62 6f 64 79 3e 3c 68 31 3e 43 47 49    "<body><h1>CGI
6a20: 20 50 72 6f 67 72 61 6d 20 45 72 72 6f 72 3c 2f   Program Error</
6a30: 68 31 3e 5c 6e 22 0a 20 20 20 20 22 54 68 65 20  h1>\n".    "The 
6a40: 43 47 49 20 70 72 6f 67 72 61 6d 20 25 73 20 67  CGI program %s g
6a50: 65 6e 65 72 61 74 65 64 20 61 6e 20 65 72 72 6f  enerated an erro
6a60: 72 5c 6e 22 0a 20 20 20 20 22 3c 2f 62 6f 64 79  r\n".    "</body
6a70: 3e 5c 6e 22 2c 20 7a 53 63 72 69 70 74 29 3b 0a  >\n", zScript);.
6a80: 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30    MakeLogEntry(0
6a90: 2c 20 31 32 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a  , 120);  /* LOG:
6aa0: 20 43 47 49 20 45 72 72 6f 72 20 2a 2f 0a 20 20   CGI Error */.  
6ab0: 65 78 69 74 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  exit(0);.}../*.*
6ac0: 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  * This is called
6ad0: 20 69 66 20 77 65 20 74 69 6d 65 6f 75 74 20 6f   if we timeout o
6ae0: 72 20 63 61 74 63 68 20 73 6f 6d 65 20 6f 74 68  r catch some oth
6af0: 65 72 20 6b 69 6e 64 20 6f 66 20 73 69 67 6e 61  er kind of signa
6b00: 6c 2e 0a 2a 2a 20 4c 6f 67 20 61 6e 20 65 72 72  l..** Log an err
6b10: 6f 72 20 63 6f 64 65 20 77 68 69 63 68 20 69 73  or code which is
6b20: 20 39 30 30 2b 69 53 69 67 20 61 6e 64 20 74 68   900+iSig and th
6b30: 65 6e 20 71 75 69 74 2e 0a 2a 2f 0a 73 74 61 74  en quit..*/.stat
6b40: 69 63 20 76 6f 69 64 20 54 69 6d 65 6f 75 74 28  ic void Timeout(
6b50: 69 6e 74 20 69 53 69 67 29 7b 0a 20 20 69 66 28  int iSig){.  if(
6b60: 20 21 64 65 62 75 67 46 6c 61 67 20 29 7b 0a 20   !debugFlag ){. 
6b70: 20 20 20 69 66 28 20 7a 53 63 72 69 70 74 20 26     if( zScript &
6b80: 26 20 7a 53 63 72 69 70 74 5b 30 5d 20 29 7b 0a  & zScript[0] ){.
6b90: 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b        char zBuf[
6ba0: 31 30 5d 3b 0a 20 20 20 20 20 20 7a 42 75 66 5b  10];.      zBuf[
6bb0: 30 5d 20 3d 20 27 39 27 3b 0a 20 20 20 20 20 20  0] = '9';.      
6bc0: 7a 42 75 66 5b 31 5d 20 3d 20 27 30 27 20 2b 20  zBuf[1] = '0' + 
6bd0: 28 69 53 69 67 2f 31 30 29 25 31 30 3b 0a 20 20  (iSig/10)%10;.  
6be0: 20 20 20 20 7a 42 75 66 5b 32 5d 20 3d 20 27 30      zBuf[2] = '0
6bf0: 27 20 2b 20 69 53 69 67 25 31 30 3b 0a 20 20 20  ' + iSig%10;.   
6c00: 20 20 20 7a 42 75 66 5b 33 5d 20 3d 20 30 3b 0a     zBuf[3] = 0;.
6c10: 20 20 20 20 20 20 73 74 72 63 70 79 28 7a 52 65        strcpy(zRe
6c20: 70 6c 79 53 74 61 74 75 73 2c 20 7a 42 75 66 29  plyStatus, zBuf)
6c30: 3b 0a 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45  ;.      MakeLogE
6c40: 6e 74 72 79 28 30 2c 20 31 33 30 29 3b 20 20 2f  ntry(0, 130);  /
6c50: 2a 20 4c 4f 47 3a 20 54 69 6d 65 6f 75 74 20 2a  * LOG: Timeout *
6c60: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 69 74  /.    }.    exit
6c70: 28 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (0);.  }.}../*.*
6c80: 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c 69 65 6e  * Tell the clien
6c90: 74 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  t that there is 
6ca0: 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  an error in the 
6cb0: 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69  script..*/.stati
6cc0: 63 20 76 6f 69 64 20 43 67 69 53 63 72 69 70 74  c void CgiScript
6cd0: 57 72 69 74 61 62 6c 65 28 76 6f 69 64 29 7b 0a  Writable(void){.
6ce0: 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28    StartResponse(
6cf0: 22 35 30 30 20 43 47 49 20 43 6f 6e 66 69 67 75  "500 CGI Configu
6d00: 72 61 74 69 6f 6e 20 45 72 72 6f 72 22 29 3b 0a  ration Error");.
6d10: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
6d20: 28 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74  (.    "Content-t
6d30: 79 70 65 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c  ype: text/plain\
6d40: 72 5c 6e 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a  r\n".    "\r\n".
6d50: 20 20 20 20 22 54 68 65 20 43 47 49 20 70 72 6f      "The CGI pro
6d60: 67 72 61 6d 20 25 73 20 69 73 20 77 72 69 74 61  gram %s is writa
6d70: 62 6c 65 20 62 79 20 75 73 65 72 73 20 6f 74 68  ble by users oth
6d80: 65 72 20 74 68 61 6e 20 69 74 73 20 6f 77 6e 65  er than its owne
6d90: 72 2e 5c 6e 22 2c 0a 20 20 20 20 7a 52 65 61 6c  r.\n",.    zReal
6da0: 53 63 72 69 70 74 29 3b 0a 20 20 4d 61 6b 65 4c  Script);.  MakeL
6db0: 6f 67 45 6e 74 72 79 28 30 2c 20 31 34 30 29 3b  ogEntry(0, 140);
6dc0: 20 20 2f 2a 20 4c 4f 47 3a 20 43 47 49 20 73 63    /* LOG: CGI sc
6dd0: 72 69 70 74 20 69 73 20 77 72 69 74 61 62 6c 65  ript is writable
6de0: 20 2a 2f 0a 20 20 65 78 69 74 28 30 29 3b 20 20   */.  exit(0);  
6df0: 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54       .}../*.** T
6e00: 65 6c 6c 20 74 68 65 20 63 6c 69 65 6e 74 20 74  ell the client t
6e10: 68 61 74 20 74 68 65 20 73 65 72 76 65 72 20 6d  hat the server m
6e20: 61 6c 66 75 6e 63 74 69 6f 6e 65 64 2e 0a 2a 2f  alfunctioned..*/
6e30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d 61 6c  .static void Mal
6e40: 66 75 6e 63 74 69 6f 6e 28 69 6e 74 20 6c 69 6e  function(int lin
6e50: 65 6e 75 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72  enum, const char
6e60: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
6e70: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
6e80: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
6e90: 6f 72 6d 61 74 29 3b 0a 20 20 53 74 61 72 74 52  ormat);.  StartR
6ea0: 65 73 70 6f 6e 73 65 28 22 35 30 30 20 53 65 72  esponse("500 Ser
6eb0: 76 65 72 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 22  ver Malfunction"
6ec0: 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69  );.  nOut += pri
6ed0: 6e 74 66 28 0a 20 20 20 20 22 43 6f 6e 74 65 6e  ntf(.    "Conten
6ee0: 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 70 6c 61  t-type: text/pla
6ef0: 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 22 5c 72 5c  in\r\n".    "\r\
6f00: 6e 22 0a 20 20 20 20 22 57 65 62 20 73 65 72 76  n".    "Web serv
6f10: 65 72 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 65 64  er malfunctioned
6f20: 3b 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 25  ; error number %
6f30: 64 5c 6e 5c 6e 22 2c 20 6c 69 6e 65 6e 75 6d 29  d\n\n", linenum)
6f40: 3b 0a 20 20 69 66 28 20 7a 46 6f 72 6d 61 74 20  ;.  if( zFormat 
6f50: 29 7b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 76  ){.    nOut += v
6f60: 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20  printf(zFormat, 
6f70: 61 70 29 3b 0a 20 20 7d 0a 20 20 4d 61 6b 65 4c  ap);.  }.  MakeL
6f80: 6f 67 45 6e 74 72 79 28 30 2c 20 6c 69 6e 65 6e  ogEntry(0, linen
6f90: 75 6d 29 3b 0a 20 20 65 78 69 74 28 30 29 3b 20  um);.  exit(0); 
6fa0: 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20        .}../*.** 
6fb0: 44 6f 20 61 20 73 65 72 76 65 72 20 72 65 64 69  Do a server redi
6fc0: 72 65 63 74 20 74 6f 20 74 68 65 20 64 6f 63 75  rect to the docu
6fd0: 6d 65 6e 74 20 73 70 65 63 69 66 69 65 64 2e 20  ment specified. 
6fe0: 20 54 68 65 20 64 6f 63 75 6d 65 6e 74 0a 2a 2a   The document.**
6ff0: 20 6e 61 6d 65 20 6e 6f 74 20 63 6f 6e 74 61 69   name not contai
7000: 6e 20 73 63 68 65 6d 65 20 6f 72 20 6e 65 74 77  n scheme or netw
7010: 6f 72 6b 20 6c 6f 63 61 74 69 6f 6e 20 6f 72 20  ork location or 
7020: 74 68 65 20 71 75 65 72 79 20 73 74 72 69 6e 67  the query string
7030: 2e 0a 2a 2a 20 49 74 20 77 69 6c 6c 20 62 65 20  ..** It will be 
7040: 6a 75 73 74 20 74 68 65 20 70 61 74 68 2e 0a 2a  just the path..*
7050: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 52 65  /.static void Re
7060: 64 69 72 65 63 74 28 63 6f 6e 73 74 20 63 68 61  direct(const cha
7070: 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 69  r *zPath, int fi
7080: 6e 69 73 68 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f  nish, int lineno
7090: 29 7b 0a 20 20 53 74 61 72 74 52 65 73 70 6f 6e  ){.  StartRespon
70a0: 73 65 28 22 33 30 32 20 54 65 6d 70 6f 72 61 72  se("302 Temporar
70b0: 79 20 52 65 64 69 72 65 63 74 22 29 3b 0a 20 20  y Redirect");.  
70c0: 69 66 28 20 7a 53 65 72 76 65 72 50 6f 72 74 3d  if( zServerPort=
70d0: 3d 30 20 7c 7c 20 7a 53 65 72 76 65 72 50 6f 72  =0 || zServerPor
70e0: 74 5b 30 5d 3d 3d 30 20 7c 7c 20 73 74 72 63 6d  t[0]==0 || strcm
70f0: 70 28 7a 53 65 72 76 65 72 50 6f 72 74 2c 22 38  p(zServerPort,"8
7100: 30 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4f  0")==0 ){.    nO
7110: 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 4c 6f  ut += printf("Lo
7120: 63 61 74 69 6f 6e 3a 20 25 73 3a 2f 2f 25 73 25  cation: %s://%s%
7130: 73 25 73 5c 72 5c 6e 22 2c 0a 20 20 20 20 20 20  s%s\r\n",.      
7140: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 48 74               zHt
7150: 74 70 2c 20 7a 53 65 72 76 65 72 4e 61 6d 65 2c  tp, zServerName,
7160: 20 7a 50 61 74 68 2c 20 7a 51 75 65 72 79 53 75   zPath, zQuerySu
7170: 66 66 69 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ffix);.  }else{.
7180: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
7190: 74 66 28 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73  tf("Location: %s
71a0: 3a 2f 2f 25 73 3a 25 73 25 73 25 73 5c 72 5c 6e  ://%s:%s%s%s\r\n
71b0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
71c0: 20 20 20 20 20 20 7a 48 74 74 70 2c 20 7a 53 65        zHttp, zSe
71d0: 72 76 65 72 4e 61 6d 65 2c 20 7a 53 65 72 76 65  rverName, zServe
71e0: 72 50 6f 72 74 2c 20 7a 50 61 74 68 2c 20 7a 51  rPort, zPath, zQ
71f0: 75 65 72 79 53 75 66 66 69 78 29 3b 0a 20 20 7d  uerySuffix);.  }
7200: 0a 20 20 69 66 28 20 66 69 6e 69 73 68 20 29 7b  .  if( finish ){
7210: 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69  .    nOut += pri
7220: 6e 74 66 28 22 43 6f 6e 74 65 6e 74 2d 6c 65 6e  ntf("Content-len
7230: 67 74 68 3a 20 30 5c 72 5c 6e 22 29 3b 0a 20 20  gth: 0\r\n");.  
7240: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
7250: 28 22 5c 72 5c 6e 22 29 3b 0a 20 20 20 20 4d 61  ("\r\n");.    Ma
7260: 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 6c 69  keLogEntry(0, li
7270: 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 20 20 66 66 6c  neno);.  }.  ffl
7280: 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 7d 0a 0a  ush(stdout);.}..
7290: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
72a0: 69 6f 6e 20 74 72 65 61 74 73 20 69 74 73 20 69  ion treats its i
72b0: 6e 70 75 74 20 61 73 20 61 20 62 61 73 65 2d 36  nput as a base-6
72c0: 34 20 73 74 72 69 6e 67 20 61 6e 64 20 72 65 74  4 string and ret
72d0: 75 72 6e 73 20 74 68 65 0a 2a 2a 20 64 65 63 6f  urns the.** deco
72e0: 64 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68 61  ded value of tha
72f0: 74 20 73 74 72 69 6e 67 2e 20 20 43 68 61 72 61  t string.  Chara
7300: 63 74 65 72 73 20 6f 66 20 69 6e 70 75 74 20 74  cters of input t
7310: 68 61 74 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 76  hat are not.** v
7320: 61 6c 69 64 20 62 61 73 65 2d 36 34 20 63 68 61  alid base-64 cha
7330: 72 61 63 74 65 72 73 20 28 73 75 63 68 20 61 73  racters (such as
7340: 20 73 70 61 63 65 73 20 61 6e 64 20 6e 65 77 6c   spaces and newl
7350: 69 6e 65 73 29 20 61 72 65 20 69 67 6e 6f 72 65  ines) are ignore
7360: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 44 65 63 6f 64  d..*/.void Decod
7370: 65 36 34 28 63 68 61 72 20 2a 7a 36 34 29 7b 0a  e64(char *z64){.
7380: 20 20 63 68 61 72 20 2a 7a 44 61 74 61 3b 0a 20    char *zData;. 
7390: 20 69 6e 74 20 6e 36 34 3b 0a 20 20 69 6e 74 20   int n64;.  int 
73a0: 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 61 2c 20 62  i, j;.  int a, b
73b0: 2c 20 63 2c 20 64 3b 0a 20 20 73 74 61 74 69 63  , c, d;.  static
73c0: 20 69 6e 74 20 69 73 49 6e 69 74 20 3d 20 30 3b   int isInit = 0;
73d0: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 74 72  .  static int tr
73e0: 61 6e 73 5b 31 32 38 5d 3b 0a 20 20 73 74 61 74  ans[128];.  stat
73f0: 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ic unsigned char
7400: 20 7a 42 61 73 65 5b 5d 20 3d 20 0a 20 20 20 20   zBase[] = .    
7410: 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
7420: 50 51 52 53 54 55 56 57 58 59 5a 61 62 63 64 65  PQRSTUVWXYZabcde
7430: 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
7440: 76 77 78 79 7a 30 31 32 33 34 35 36 37 38 39 2b  vwxyz0123456789+
7450: 2f 22 3b 0a 0a 20 20 69 66 28 20 21 69 73 49 6e  /";..  if( !isIn
7460: 69 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  it ){.    for(i=
7470: 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b 29 7b 20  0; i<128; i++){ 
7480: 74 72 61 6e 73 5b 69 5d 20 3d 20 30 3b 20 7d 0a  trans[i] = 0; }.
7490: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 42 61      for(i=0; zBa
74a0: 73 65 5b 69 5d 3b 20 69 2b 2b 29 7b 20 74 72 61  se[i]; i++){ tra
74b0: 6e 73 5b 7a 42 61 73 65 5b 69 5d 20 26 20 30 78  ns[zBase[i] & 0x
74c0: 37 66 5d 20 3d 20 69 3b 20 7d 0a 20 20 20 20 69  7f] = i; }.    i
74d0: 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  sInit = 1;.  }. 
74e0: 20 6e 36 34 20 3d 20 73 74 72 6c 65 6e 28 7a 36   n64 = strlen(z6
74f0: 34 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 36 34  4);.  while( n64
7500: 3e 30 20 26 26 20 7a 36 34 5b 6e 36 34 2d 31 5d  >0 && z64[n64-1]
7510: 3d 3d 27 3d 27 20 29 20 6e 36 34 2d 2d 3b 0a 20  =='=' ) n64--;. 
7520: 20 7a 44 61 74 61 20 3d 20 7a 36 34 3b 0a 20 20   zData = z64;.  
7530: 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 2b 33 3c 6e  for(i=j=0; i+3<n
7540: 36 34 3b 20 69 2b 3d 34 29 7b 0a 20 20 20 20 61  64; i+=4){.    a
7550: 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 5d 20   = trans[z64[i] 
7560: 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 62 20 3d  & 0x7f];.    b =
7570: 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b 31 5d 20   trans[z64[i+1] 
7580: 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 63 20 3d  & 0x7f];.    c =
7590: 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b 32 5d 20   trans[z64[i+2] 
75a0: 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 64 20 3d  & 0x7f];.    d =
75b0: 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b 33 5d 20   trans[z64[i+3] 
75c0: 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 7a 44 61  & 0x7f];.    zDa
75d0: 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28 61 3c 3c 32  ta[j++] = ((a<<2
75e0: 29 20 26 20 30 78 66 63 29 20 7c 20 28 28 62 3e  ) & 0xfc) | ((b>
75f0: 3e 34 29 20 26 20 30 78 30 33 29 3b 0a 20 20 20  >4) & 0x03);.   
7600: 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28   zData[j++] = ((
7610: 62 3c 3c 34 29 20 26 20 30 78 66 30 29 20 7c 20  b<<4) & 0xf0) | 
7620: 28 28 63 3e 3e 32 29 20 26 20 30 78 30 66 29 3b  ((c>>2) & 0x0f);
7630: 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20  .    zData[j++] 
7640: 3d 20 28 28 63 3c 3c 36 29 20 26 20 30 78 63 30  = ((c<<6) & 0xc0
7650: 29 20 7c 20 28 64 20 26 20 30 78 33 66 29 3b 0a  ) | (d & 0x3f);.
7660: 20 20 7d 0a 20 20 69 66 28 20 69 2b 32 3c 6e 36    }.  if( i+2<n6
7670: 34 20 29 7b 0a 20 20 20 20 61 20 3d 20 74 72 61  4 ){.    a = tra
7680: 6e 73 5b 7a 36 34 5b 69 5d 20 26 20 30 78 37 66  ns[z64[i] & 0x7f
7690: 5d 3b 0a 20 20 20 20 62 20 3d 20 74 72 61 6e 73  ];.    b = trans
76a0: 5b 7a 36 34 5b 69 2b 31 5d 20 26 20 30 78 37 66  [z64[i+1] & 0x7f
76b0: 5d 3b 0a 20 20 20 20 63 20 3d 20 74 72 61 6e 73  ];.    c = trans
76c0: 5b 7a 36 34 5b 69 2b 32 5d 20 26 20 30 78 37 66  [z64[i+2] & 0x7f
76d0: 5d 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b 2b  ];.    zData[j++
76e0: 5d 20 3d 20 28 28 61 3c 3c 32 29 20 26 20 30 78  ] = ((a<<2) & 0x
76f0: 66 63 29 20 7c 20 28 28 62 3e 3e 34 29 20 26 20  fc) | ((b>>4) & 
7700: 30 78 30 33 29 3b 0a 20 20 20 20 7a 44 61 74 61  0x03);.    zData
7710: 5b 6a 2b 2b 5d 20 3d 20 28 28 62 3c 3c 34 29 20  [j++] = ((b<<4) 
7720: 26 20 30 78 66 30 29 20 7c 20 28 28 63 3e 3e 32  & 0xf0) | ((c>>2
7730: 29 20 26 20 30 78 30 66 29 3b 0a 20 20 7d 65 6c  ) & 0x0f);.  }el
7740: 73 65 20 69 66 28 20 69 2b 31 3c 6e 36 34 20 29  se if( i+1<n64 )
7750: 7b 0a 20 20 20 20 61 20 3d 20 74 72 61 6e 73 5b  {.    a = trans[
7760: 7a 36 34 5b 69 5d 20 26 20 30 78 37 66 5d 3b 0a  z64[i] & 0x7f];.
7770: 20 20 20 20 62 20 3d 20 74 72 61 6e 73 5b 7a 36      b = trans[z6
7780: 34 5b 69 2b 31 5d 20 26 20 30 78 37 66 5d 3b 0a  4[i+1] & 0x7f];.
7790: 20 20 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d      zData[j++] =
77a0: 20 28 28 61 3c 3c 32 29 20 26 20 30 78 66 63 29   ((a<<2) & 0xfc)
77b0: 20 7c 20 28 28 62 3e 3e 34 29 20 26 20 30 78 30   | ((b>>4) & 0x0
77c0: 33 29 3b 0a 20 20 7d 0a 20 20 7a 44 61 74 61 5b  3);.  }.  zData[
77d0: 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  j] = 0;.}../*.**
77e0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
77f0: 20 62 61 73 69 63 20 61 75 74 68 6f 72 69 7a 61   basic authoriza
7800: 74 69 6f 6e 20 63 72 65 64 65 6e 74 69 61 6c 73  tion credentials
7810: 20 61 72 65 20 70 72 6f 76 69 64 65 64 20 66 6f   are provided fo
7820: 72 0a 2a 2a 20 74 68 65 20 75 73 65 72 20 61 63  r.** the user ac
7830: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 69  cording to the i
7840: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 7a 41  nformation in zA
7850: 75 74 68 46 69 6c 65 2e 20 20 52 65 74 75 72 6e  uthFile.  Return
7860: 20 74 72 75 65 0a 2a 2a 20 69 66 20 61 75 74 68   true.** if auth
7870: 6f 72 69 7a 65 64 2e 20 20 52 65 74 75 72 6e 20  orized.  Return 
7880: 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 61 75 74  false if not aut
7890: 68 6f 72 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  horized..**.** F
78a0: 69 6c 65 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a  ile format:.**.*
78b0: 2a 20 20 20 20 2a 20 20 42 6c 61 6e 6b 20 6c 69  *    *  Blank li
78c0: 6e 65 73 20 61 6e 64 20 6c 69 6e 65 73 20 74 68  nes and lines th
78d0: 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 27 23  at begin with '#
78e0: 27 20 61 72 65 20 69 67 6e 6f 72 65 64 0a 2a 2a  ' are ignored.**
78f0: 20 20 20 20 2a 20 20 22 68 74 74 70 2d 72 65 64      *  "http-red
7900: 69 72 65 63 74 22 20 66 6f 72 63 65 73 20 61 20  irect" forces a 
7910: 72 65 64 69 72 65 63 74 20 74 6f 20 48 54 54 50  redirect to HTTP
7920: 53 20 69 66 20 6e 6f 74 20 74 68 65 72 65 20 61  S if not there a
7930: 6c 72 65 61 64 79 0a 2a 2a 20 20 20 20 2a 20 20  lready.**    *  
7940: 22 68 74 74 70 73 2d 6f 6e 6c 79 22 20 64 69 73  "https-only" dis
7950: 61 6c 6c 6f 77 73 20 6f 70 65 72 61 74 69 6f 6e  allows operation
7960: 20 69 6e 20 48 54 54 50 0a 2a 2a 20 20 20 20 2a   in HTTP.**    *
7970: 20 20 22 75 73 65 72 20 4e 41 4d 45 20 4c 4f 47    "user NAME LOG
7980: 49 4e 3a 50 41 53 53 57 4f 52 44 22 20 63 68 65  IN:PASSWORD" che
7990: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 4c 4f  cks to see if LO
79a0: 47 49 4e 3a 50 41 53 53 57 4f 52 44 20 0a 2a 2a  GIN:PASSWORD .**
79b0: 20 20 20 20 20 20 20 61 75 74 68 6f 72 69 7a 61         authoriza
79c0: 74 69 6f 6e 20 63 72 65 64 65 6e 74 69 61 6c 73  tion credentials
79d0: 20 61 72 65 20 70 72 6f 76 69 64 65 64 2c 20 61   are provided, a
79e0: 6e 64 20 69 66 20 73 6f 20 73 65 74 73 20 74 68  nd if so sets th
79f0: 65 0a 2a 2a 20 20 20 20 20 20 20 52 45 4d 4f 54  e.**       REMOT
7a00: 45 5f 55 53 45 52 20 74 6f 20 4e 41 4d 45 2e 0a  E_USER to NAME..
7a10: 2a 2a 20 20 20 20 2a 20 20 22 72 65 61 6c 6d 20  **    *  "realm 
7a20: 54 45 58 54 22 20 73 65 74 73 20 74 68 65 20 72  TEXT" sets the r
7a30: 65 61 6c 6d 20 74 6f 20 54 45 58 54 2e 0a 2a 2a  ealm to TEXT..**
7a40: 20 20 20 20 2a 20 20 22 61 6e 79 6f 6e 65 22 20      *  "anyone" 
7a50: 62 79 70 61 73 73 65 73 20 61 75 74 68 65 6e 74  bypasses authent
7a60: 69 63 61 74 69 6f 6e 20 61 6e 64 20 61 6c 6c 6f  ication and allo
7a70: 77 73 20 61 6e 79 6f 6e 65 20 74 6f 20 73 65 65  ws anyone to see
7a80: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 66 69   the.**       fi
7a90: 6c 65 73 2e 20 20 55 73 65 66 75 6c 20 69 6e 20  les.  Useful in 
7aa0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 77 69 74 68  combination with
7ab0: 20 22 68 74 74 70 2d 72 65 64 69 72 65 63 74 22   "http-redirect"
7ac0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 43  .*/.static int C
7ad0: 68 65 63 6b 42 61 73 69 63 41 75 74 68 6f 72 69  heckBasicAuthori
7ae0: 7a 61 74 69 6f 6e 28 63 6f 6e 73 74 20 63 68 61  zation(const cha
7af0: 72 20 2a 7a 41 75 74 68 46 69 6c 65 29 7b 0a 20  r *zAuthFile){. 
7b00: 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61   FILE *in;.  cha
7b10: 72 20 2a 7a 52 65 61 6c 6d 20 3d 20 22 75 6e 6b  r *zRealm = "unk
7b20: 6e 6f 77 6e 20 72 65 61 6c 6d 22 3b 0a 20 20 63  nown realm";.  c
7b30: 68 61 72 20 2a 7a 4c 6f 67 69 6e 50 73 77 64 3b  har *zLoginPswd;
7b40: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
7b50: 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b 32 30 30    char zLine[200
7b60: 30 5d 3b 0a 0a 20 20 69 6e 20 3d 20 66 6f 70 65  0];..  in = fope
7b70: 6e 28 7a 41 75 74 68 46 69 6c 65 2c 20 22 72 62  n(zAuthFile, "rb
7b80: 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20  ");.  if( in==0 
7b90: 29 7b 0a 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28  ){.    NotFound(
7ba0: 31 35 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 43  150);  /* LOG: C
7bb0: 61 6e 6e 6f 74 20 6f 70 65 6e 20 2d 61 75 74 68  annot open -auth
7bc0: 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 65 74   file */.    ret
7bd0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
7be0: 20 7a 41 75 74 68 41 72 67 20 29 20 44 65 63 6f   zAuthArg ) Deco
7bf0: 64 65 36 34 28 7a 41 75 74 68 41 72 67 29 3b 0a  de64(zAuthArg);.
7c00: 20 20 77 68 69 6c 65 28 20 66 67 65 74 73 28 7a    while( fgets(z
7c10: 4c 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c 69  Line, sizeof(zLi
7c20: 6e 65 29 2c 20 69 6e 29 20 29 7b 0a 20 20 20 20  ne), in) ){.    
7c30: 63 68 61 72 20 2a 7a 46 69 65 6c 64 4e 61 6d 65  char *zFieldName
7c40: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c  ;.    char *zVal
7c50: 3b 0a 0a 20 20 20 20 7a 46 69 65 6c 64 4e 61 6d  ;..    zFieldNam
7c60: 65 20 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d  e = GetFirstElem
7c70: 65 6e 74 28 7a 4c 69 6e 65 2c 26 7a 56 61 6c 29  ent(zLine,&zVal)
7c80: 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 65 6c 64  ;.    if( zField
7c90: 4e 61 6d 65 3d 3d 30 20 7c 7c 20 2a 7a 46 69 65  Name==0 || *zFie
7ca0: 6c 64 4e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74  ldName==0 ) cont
7cb0: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 7a 46  inue;.    if( zF
7cc0: 69 65 6c 64 4e 61 6d 65 5b 30 5d 3d 3d 27 23 27  ieldName[0]=='#'
7cd0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7ce0: 20 52 65 6d 6f 76 65 4e 65 77 6c 69 6e 65 28 7a   RemoveNewline(z
7cf0: 56 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 73 74  Val);.    if( st
7d00: 72 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c  rcmp(zFieldName,
7d10: 20 22 72 65 61 6c 6d 22 29 3d 3d 30 20 29 7b 0a   "realm")==0 ){.
7d20: 20 20 20 20 20 20 7a 52 65 61 6c 6d 20 3d 20 53        zRealm = S
7d30: 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20  trDup(zVal);.   
7d40: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
7d50: 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 75 73  p(zFieldName,"us
7d60: 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  er")==0 ){.     
7d70: 20 69 66 28 20 7a 41 75 74 68 41 72 67 3d 3d 30   if( zAuthArg==0
7d80: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7d90: 20 20 20 7a 4e 61 6d 65 20 3d 20 47 65 74 46 69     zName = GetFi
7da0: 72 73 74 45 6c 65 6d 65 6e 74 28 7a 56 61 6c 2c  rstElement(zVal,
7db0: 20 26 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 7a   &zVal);.      z
7dc0: 4c 6f 67 69 6e 50 73 77 64 20 3d 20 47 65 74 46  LoginPswd = GetF
7dd0: 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a 56 61 6c  irstElement(zVal
7de0: 2c 20 26 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20  , &zVal);.      
7df0: 69 66 28 20 7a 4c 6f 67 69 6e 50 73 77 64 3d 3d  if( zLoginPswd==
7e00: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
7e10: 20 20 20 20 69 66 28 20 7a 41 75 74 68 41 72 67      if( zAuthArg
7e20: 20 26 26 20 73 74 72 63 6d 70 28 7a 41 75 74 68   && strcmp(zAuth
7e30: 41 72 67 2c 7a 4c 6f 67 69 6e 50 73 77 64 29 3d  Arg,zLoginPswd)=
7e40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52  =0 ){.        zR
7e50: 65 6d 6f 74 65 55 73 65 72 20 3d 20 53 74 72 44  emoteUser = StrD
7e60: 75 70 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  up(zName);.     
7e70: 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
7e80: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
7e90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
7ea0: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46  se if( strcmp(zF
7eb0: 69 65 6c 64 4e 61 6d 65 2c 22 68 74 74 70 73 2d  ieldName,"https-
7ec0: 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20  only")==0 ){.   
7ed0: 20 20 20 69 66 28 20 21 75 73 65 48 74 74 70 73     if( !useHttps
7ee0: 20 29 7b 0a 20 20 20 20 20 20 20 20 4e 6f 74 46   ){.        NotF
7ef0: 6f 75 6e 64 28 31 36 30 29 3b 20 20 2f 2a 20 4c  ound(160);  /* L
7f00: 4f 47 3a 20 20 68 74 74 70 20 72 65 71 75 65 73  OG:  http reques
7f10: 74 20 6f 6e 20 68 74 74 70 73 2d 6f 6e 6c 79 20  t on https-only 
7f20: 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
7f30: 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20  fclose(in);.    
7f40: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7f50: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
7f60: 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 65 6c  if( strcmp(zFiel
7f70: 64 4e 61 6d 65 2c 22 68 74 74 70 2d 72 65 64 69  dName,"http-redi
7f80: 72 65 63 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  rect")==0 ){.   
7f90: 20 20 20 69 66 28 20 21 75 73 65 48 74 74 70 73     if( !useHttps
7fa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 48 74 74   ){.        zHtt
7fb0: 70 20 3d 20 22 68 74 74 70 73 22 3b 0a 20 20 20  p = "https";.   
7fc0: 20 20 20 20 20 52 65 64 69 72 65 63 74 28 7a 53       Redirect(zS
7fd0: 63 72 69 70 74 2c 20 31 2c 20 31 37 30 29 3b 20  cript, 1, 170); 
7fe0: 2f 2a 20 4c 4f 47 3a 20 2d 61 75 74 68 20 72 65  /* LOG: -auth re
7ff0: 64 69 72 65 63 74 20 2a 2f 0a 20 20 20 20 20 20  direct */.      
8000: 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
8010: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
8020: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
8030: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69  e if( strcmp(zFi
8040: 65 6c 64 4e 61 6d 65 2c 22 61 6e 79 6f 6e 65 22  eldName,"anyone"
8050: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 63  )==0 ){.      fc
8060: 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20  lose(in);.      
8070: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 65  return 1;.    }e
8080: 6c 73 65 7b 0a 20 20 20 20 20 20 4e 6f 74 46 6f  lse{.      NotFo
8090: 75 6e 64 28 31 38 30 29 3b 20 20 2f 2a 20 4c 4f  und(180);  /* LO
80a0: 47 3a 20 20 6d 61 6c 66 6f 72 6d 65 64 20 65 6e  G:  malformed en
80b0: 74 72 79 20 69 6e 20 2d 61 75 74 68 20 66 69 6c  try in -auth fil
80c0: 65 20 2a 2f 0a 20 20 20 20 20 20 66 63 6c 6f 73  e */.      fclos
80d0: 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74  e(in);.      ret
80e0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
80f0: 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20  .  fclose(in);. 
8100: 20 4e 6f 74 41 75 74 68 6f 72 69 7a 65 64 28 7a   NotAuthorized(z
8110: 52 65 61 6c 6d 29 3b 0a 20 20 72 65 74 75 72 6e  Realm);.  return
8120: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 75 65   0;.}../*.** Gue
8130: 73 73 20 74 68 65 20 6d 69 6d 65 2d 74 79 70 65  ss the mime-type
8140: 20 6f 66 20 61 20 64 6f 63 75 6d 65 6e 74 20 62   of a document b
8150: 61 73 65 64 20 6f 6e 20 69 74 73 20 6e 61 6d 65  ased on its name
8160: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
8170: 2a 47 65 74 4d 69 6d 65 54 79 70 65 28 63 6f 6e  *GetMimeType(con
8180: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
8190: 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 63 6f  int nName){.  co
81a0: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  nst char *z;.  i
81b0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 66 69 72 73  nt i;.  int firs
81c0: 74 2c 20 6c 61 73 74 3b 0a 20 20 69 6e 74 20 6c  t, last;.  int l
81d0: 65 6e 3b 0a 20 20 63 68 61 72 20 7a 53 75 66 66  en;.  char zSuff
81e0: 69 78 5b 32 30 5d 3b 0a 0a 20 20 2f 2a 20 41 20  ix[20];..  /* A 
81f0: 74 61 62 6c 65 20 6f 66 20 6d 69 6d 65 74 79 70  table of mimetyp
8200: 65 73 20 62 61 73 65 64 20 6f 6e 20 66 69 6c 65  es based on file
8210: 20 73 75 66 66 69 78 65 73 2e 20 0a 20 20 2a 2a   suffixes. .  **
8220: 20 53 75 66 66 69 78 65 73 20 6d 75 73 74 20 62   Suffixes must b
8230: 65 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  e in sorted orde
8240: 72 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  r so that we can
8250: 20 64 6f 20 61 20 62 69 6e 61 72 79 0a 20 20 2a   do a binary.  *
8260: 2a 20 73 65 61 72 63 68 20 74 6f 20 66 69 6e 64  * search to find
8270: 20 74 68 65 20 6d 69 6d 65 2d 74 79 70 65 0a 20   the mime-type. 
8280: 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   */.  static con
8290: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
82a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 75 66  const char *zSuf
82b0: 66 69 78 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  fix;       /* Th
82c0: 65 20 66 69 6c 65 20 73 75 66 66 69 78 20 2a 2f  e file suffix */
82d0: 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  .    int size;  
82e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82f0: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65  /* Length of the
8300: 20 73 75 66 66 69 78 20 2a 2f 0a 20 20 20 20 63   suffix */.    c
8310: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 69 6d 65  onst char *zMime
8320: 74 79 70 65 3b 20 20 20 20 20 2f 2a 20 54 68 65  type;     /* The
8330: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 6d   corresponding m
8340: 69 6d 65 74 79 70 65 20 2a 2f 0a 20 20 7d 20 61  imetype */.  } a
8350: 4d 69 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  Mime[] = {.    {
8360: 20 22 61 69 22 2c 20 20 20 20 20 20 20 20 20 32   "ai",         2
8370: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70  , "application/p
8380: 6f 73 74 73 63 72 69 70 74 22 20 20 20 20 20 20  ostscript"      
8390: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
83a0: 61 69 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20  aif",        3, 
83b0: 22 61 75 64 69 6f 2f 78 2d 61 69 66 66 22 20 20  "audio/x-aiff"  
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83d0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 69      },.    { "ai
83e0: 66 63 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61  fc",       4, "a
83f0: 75 64 69 6f 2f 78 2d 61 69 66 66 22 20 20 20 20  udio/x-aiff"    
8400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8410: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 69 66 66    },.    { "aiff
8420: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 75 64  ",       4, "aud
8430: 69 6f 2f 78 2d 61 69 66 66 22 20 20 20 20 20 20  io/x-aiff"      
8440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8450: 7d 2c 0a 20 20 20 20 7b 20 22 61 72 6a 22 2c 20  },.    { "arj", 
8460: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
8470: 63 61 74 69 6f 6e 2f 78 2d 61 72 6a 2d 63 6f 6d  cation/x-arj-com
8480: 70 72 65 73 73 65 64 22 20 20 20 20 20 20 7d 2c  pressed"      },
8490: 0a 20 20 20 20 7b 20 22 61 73 63 22 2c 20 20 20  .    { "asc",   
84a0: 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 70 6c       3, "text/pl
84b0: 61 69 6e 22 20 20 20 20 20 20 20 20 20 20 20 20  ain"            
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
84d0: 20 20 20 7b 20 22 61 73 66 22 2c 20 20 20 20 20     { "asf",     
84e0: 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d     3, "video/x-m
84f0: 73 2d 61 73 66 22 20 20 20 20 20 20 20 20 20 20  s-asf"          
8500: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8510: 20 7b 20 22 61 73 78 22 2c 20 20 20 20 20 20 20   { "asx",       
8520: 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d   3, "video/x-ms-
8530: 61 73 78 22 20 20 20 20 20 20 20 20 20 20 20 20  asx"            
8540: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8550: 20 22 61 75 22 2c 20 20 20 20 20 20 20 20 20 32   "au",         2
8560: 2c 20 22 61 75 64 69 6f 2f 75 6c 61 77 22 20 20  , "audio/ulaw"  
8570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8580: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8590: 61 76 69 22 2c 20 20 20 20 20 20 20 20 33 2c 20  avi",        3, 
85a0: 22 76 69 64 65 6f 2f 78 2d 6d 73 76 69 64 65 6f  "video/x-msvideo
85b0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
85c0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 62 61      },.    { "ba
85d0: 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  t",        3, "a
85e0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6d 73 64  pplication/x-msd
85f0: 6f 73 2d 70 72 6f 67 72 61 6d 22 20 20 20 20 20  os-program"     
8600: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 62 63 70 69    },.    { "bcpi
8610: 6f 22 2c 20 20 20 20 20 20 35 2c 20 22 61 70 70  o",      5, "app
8620: 6c 69 63 61 74 69 6f 6e 2f 78 2d 62 63 70 69 6f  lication/x-bcpio
8630: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8640: 7d 2c 0a 20 20 20 20 7b 20 22 62 69 6e 22 2c 20  },.    { "bin", 
8650: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
8660: 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72  cation/octet-str
8670: 65 61 6d 22 20 20 20 20 20 20 20 20 20 20 7d 2c  eam"          },
8680: 0a 20 20 20 20 7b 20 22 63 22 2c 20 20 20 20 20  .    { "c",     
8690: 20 20 20 20 20 31 2c 20 22 74 65 78 74 2f 70 6c       1, "text/pl
86a0: 61 69 6e 22 20 20 20 20 20 20 20 20 20 20 20 20  ain"            
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
86c0: 20 20 20 7b 20 22 63 63 22 2c 20 20 20 20 20 20     { "cc",      
86d0: 20 20 20 32 2c 20 22 74 65 78 74 2f 70 6c 61 69     2, "text/plai
86e0: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
86f0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8700: 20 7b 20 22 63 63 61 64 22 2c 20 20 20 20 20 20   { "ccad",      
8710: 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   4, "application
8720: 2f 63 6c 61 72 69 73 63 61 64 22 20 20 20 20 20  /clariscad"     
8730: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8740: 20 22 63 64 66 22 2c 20 20 20 20 20 20 20 20 33   "cdf",        3
8750: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
8760: 2d 6e 65 74 63 64 66 22 20 20 20 20 20 20 20 20  -netcdf"        
8770: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8780: 63 6c 61 73 73 22 2c 20 20 20 20 20 20 35 2c 20  class",      5, 
8790: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74  "application/oct
87a0: 65 74 2d 73 74 72 65 61 6d 22 20 20 20 20 20 20  et-stream"      
87b0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f      },.    { "co
87c0: 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  d",        3, "a
87d0: 70 70 6c 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 72  pplication/vnd.r
87e0: 69 6d 2e 63 6f 64 22 20 20 20 20 20 20 20 20 20  im.cod"         
87f0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 6d 22    },.    { "com"
8800: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
8810: 6c 69 63 61 74 69 6f 6e 2f 78 2d 6d 73 64 6f 73  lication/x-msdos
8820: 2d 70 72 6f 67 72 61 6d 22 20 20 20 20 20 20 20  -program"       
8830: 7d 2c 0a 20 20 20 20 7b 20 22 63 70 69 6f 22 2c  },.    { "cpio",
8840: 20 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69         4, "appli
8850: 63 61 74 69 6f 6e 2f 78 2d 63 70 69 6f 22 20 20  cation/x-cpio"  
8860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8870: 0a 20 20 20 20 7b 20 22 63 70 74 22 2c 20 20 20  .    { "cpt",   
8880: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
8890: 74 69 6f 6e 2f 6d 61 63 2d 63 6f 6d 70 61 63 74  tion/mac-compact
88a0: 70 72 6f 22 20 20 20 20 20 20 20 20 7d 2c 0a 20  pro"        },. 
88b0: 20 20 20 7b 20 22 63 73 68 22 2c 20 20 20 20 20     { "csh",     
88c0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
88d0: 6f 6e 2f 78 2d 63 73 68 22 20 20 20 20 20 20 20  on/x-csh"       
88e0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
88f0: 20 7b 20 22 63 73 73 22 2c 20 20 20 20 20 20 20   { "css",       
8900: 20 33 2c 20 22 74 65 78 74 2f 63 73 73 22 20 20   3, "text/css"  
8910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8920: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8930: 20 22 64 63 72 22 2c 20 20 20 20 20 20 20 20 33   "dcr",        3
8940: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
8950: 2d 64 69 72 65 63 74 6f 72 22 20 20 20 20 20 20  -director"      
8960: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8970: 64 65 62 22 2c 20 20 20 20 20 20 20 20 33 2c 20  deb",        3, 
8980: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 64  "application/x-d
8990: 65 62 69 61 6e 2d 70 61 63 6b 61 67 65 22 20 20  ebian-package"  
89a0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 69      },.    { "di
89b0: 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  r",        3, "a
89c0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 64 69 72  pplication/x-dir
89d0: 65 63 74 6f 72 22 20 20 20 20 20 20 20 20 20 20  ector"          
89e0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 6c 22 2c    },.    { "dl",
89f0: 20 20 20 20 20 20 20 20 20 32 2c 20 22 76 69 64           2, "vid
8a00: 65 6f 2f 64 6c 22 20 20 20 20 20 20 20 20 20 20  eo/dl"          
8a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a20: 7d 2c 0a 20 20 20 20 7b 20 22 64 6d 73 22 2c 20  },.    { "dms", 
8a30: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
8a40: 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72  cation/octet-str
8a50: 65 61 6d 22 20 20 20 20 20 20 20 20 20 20 7d 2c  eam"          },
8a60: 0a 20 20 20 20 7b 20 22 64 6f 63 22 2c 20 20 20  .    { "doc",   
8a70: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
8a80: 74 69 6f 6e 2f 6d 73 77 6f 72 64 22 20 20 20 20  tion/msword"    
8a90: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8aa0: 20 20 20 7b 20 22 64 72 77 22 2c 20 20 20 20 20     { "drw",     
8ab0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
8ac0: 6f 6e 2f 64 72 61 66 74 69 6e 67 22 20 20 20 20  on/drafting"    
8ad0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8ae0: 20 7b 20 22 64 76 69 22 2c 20 20 20 20 20 20 20   { "dvi",       
8af0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
8b00: 2f 78 2d 64 76 69 22 20 20 20 20 20 20 20 20 20  /x-dvi"         
8b10: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8b20: 20 22 64 77 67 22 2c 20 20 20 20 20 20 20 20 33   "dwg",        3
8b30: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 61  , "application/a
8b40: 63 61 64 22 20 20 20 20 20 20 20 20 20 20 20 20  cad"            
8b50: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8b60: 64 78 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20  dxf",        3, 
8b70: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 64 78 66  "application/dxf
8b80: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8b90: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 78      },.    { "dx
8ba0: 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  r",        3, "a
8bb0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 64 69 72  pplication/x-dir
8bc0: 65 63 74 6f 72 22 20 20 20 20 20 20 20 20 20 20  ector"          
8bd0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65 70 73 22    },.    { "eps"
8be0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
8bf0: 6c 69 63 61 74 69 6f 6e 2f 70 6f 73 74 73 63 72  lication/postscr
8c00: 69 70 74 22 20 20 20 20 20 20 20 20 20 20 20 20  ipt"            
8c10: 7d 2c 0a 20 20 20 20 7b 20 22 65 74 78 22 2c 20  },.    { "etx", 
8c20: 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f         3, "text/
8c30: 78 2d 73 65 74 65 78 74 22 20 20 20 20 20 20 20  x-setext"       
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8c50: 0a 20 20 20 20 7b 20 22 65 78 65 22 2c 20 20 20  .    { "exe",   
8c60: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
8c70: 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61  tion/octet-strea
8c80: 6d 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  m"          },. 
8c90: 20 20 20 7b 20 22 65 7a 22 2c 20 20 20 20 20 20     { "ez",      
8ca0: 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69     2, "applicati
8cb0: 6f 6e 2f 61 6e 64 72 65 77 2d 69 6e 73 65 74 22  on/andrew-inset"
8cc0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8cd0: 20 7b 20 22 66 22 2c 20 20 20 20 20 20 20 20 20   { "f",         
8ce0: 20 31 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22   1, "text/plain"
8cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d00: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8d10: 20 22 66 39 30 22 2c 20 20 20 20 20 20 20 20 33   "f90",        3
8d20: 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20  , "text/plain"  
8d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d40: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8d50: 66 6c 69 22 2c 20 20 20 20 20 20 20 20 33 2c 20  fli",        3, 
8d60: 22 76 69 64 65 6f 2f 66 6c 69 22 20 20 20 20 20  "video/fli"     
8d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d80: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66 6c      },.    { "fl
8d90: 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76  v",        3, "v
8da0: 69 64 65 6f 2f 66 6c 76 22 20 20 20 20 20 20 20  ideo/flv"       
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8dc0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 67 69 66 22    },.    { "gif"
8dd0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61  ,        3, "ima
8de0: 67 65 2f 67 69 66 22 20 20 20 20 20 20 20 20 20  ge/gif"         
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e00: 7d 2c 0a 20 20 20 20 7b 20 22 67 6c 22 2c 20 20  },.    { "gl",  
8e10: 20 20 20 20 20 20 20 32 2c 20 22 76 69 64 65 6f         2, "video
8e20: 2f 67 6c 22 20 20 20 20 20 20 20 20 20 20 20 20  /gl"            
8e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8e40: 0a 20 20 20 20 7b 20 22 67 74 61 72 22 2c 20 20  .    { "gtar",  
8e50: 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61       4, "applica
8e60: 74 69 6f 6e 2f 78 2d 67 74 61 72 22 20 20 20 20  tion/x-gtar"    
8e70: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8e80: 20 20 20 7b 20 22 67 7a 22 2c 20 20 20 20 20 20     { "gz",      
8e90: 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69     2, "applicati
8ea0: 6f 6e 2f 78 2d 67 7a 69 70 22 20 20 20 20 20 20  on/x-gzip"      
8eb0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8ec0: 20 7b 20 22 68 64 66 22 2c 20 20 20 20 20 20 20   { "hdf",       
8ed0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
8ee0: 2f 78 2d 68 64 66 22 20 20 20 20 20 20 20 20 20  /x-hdf"         
8ef0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8f00: 20 22 68 68 22 2c 20 20 20 20 20 20 20 20 20 32   "hh",         2
8f10: 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20  , "text/plain"  
8f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f30: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8f40: 68 71 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20  hqx",        3, 
8f50: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 61 63  "application/mac
8f60: 2d 62 69 6e 68 65 78 34 30 22 20 20 20 20 20 20  -binhex40"      
8f70: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68 22      },.    { "h"
8f80: 2c 20 20 20 20 20 20 20 20 20 20 31 2c 20 22 74  ,          1, "t
8f90: 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20  ext/plain"      
8fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fb0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68 74 6d 22    },.    { "htm"
8fc0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65 78  ,        3, "tex
8fd0: 74 2f 68 74 6d 6c 3b 20 63 68 61 72 73 65 74 3d  t/html; charset=
8fe0: 75 74 66 2d 38 22 20 20 20 20 20 20 20 20 20 20  utf-8"          
8ff0: 7d 2c 0a 20 20 20 20 7b 20 22 68 74 6d 6c 22 2c  },.    { "html",
9000: 20 20 20 20 20 20 20 34 2c 20 22 74 65 78 74 2f         4, "text/
9010: 68 74 6d 6c 3b 20 63 68 61 72 73 65 74 3d 75 74  html; charset=ut
9020: 66 2d 38 22 20 20 20 20 20 20 20 20 20 20 7d 2c  f-8"          },
9030: 0a 20 20 20 20 7b 20 22 69 63 65 22 2c 20 20 20  .    { "ice",   
9040: 20 20 20 20 20 33 2c 20 22 78 2d 63 6f 6e 66 65       3, "x-confe
9050: 72 65 6e 63 65 2f 78 2d 63 6f 6f 6c 74 61 6c 6b  rence/x-cooltalk
9060: 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  "           },. 
9070: 20 20 20 7b 20 22 69 65 66 22 2c 20 20 20 20 20     { "ief",     
9080: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 69 65 66     3, "image/ief
9090: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
90a0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
90b0: 20 7b 20 22 69 67 65 73 22 2c 20 20 20 20 20 20   { "iges",      
90c0: 20 34 2c 20 22 6d 6f 64 65 6c 2f 69 67 65 73 22   4, "model/iges"
90d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90e0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
90f0: 20 22 69 67 73 22 2c 20 20 20 20 20 20 20 20 33   "igs",        3
9100: 2c 20 22 6d 6f 64 65 6c 2f 69 67 65 73 22 20 20  , "model/iges"  
9110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9120: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
9130: 69 70 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20  ips",        3, 
9140: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 69  "application/x-i
9150: 70 73 63 72 69 70 74 22 20 20 20 20 20 20 20 20  pscript"        
9160: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 70      },.    { "ip
9170: 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  x",        3, "a
9180: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 69 70 69  pplication/x-ipi
9190: 78 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x"              
91a0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 61 64 22    },.    { "jad"
91b0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65 78  ,        3, "tex
91c0: 74 2f 76 6e 64 2e 73 75 6e 2e 6a 32 6d 65 2e 61  t/vnd.sun.j2me.a
91d0: 70 70 2d 64 65 73 63 72 69 70 74 6f 72 22 20 20  pp-descriptor"  
91e0: 7d 2c 0a 20 20 20 20 7b 20 22 6a 61 72 22 2c 20  },.    { "jar", 
91f0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
9200: 63 61 74 69 6f 6e 2f 6a 61 76 61 2d 61 72 63 68  cation/java-arch
9210: 69 76 65 22 20 20 20 20 20 20 20 20 20 20 7d 2c  ive"          },
9220: 0a 20 20 20 20 7b 20 22 6a 70 65 67 22 2c 20 20  .    { "jpeg",  
9230: 20 20 20 20 20 34 2c 20 22 69 6d 61 67 65 2f 6a       4, "image/j
9240: 70 65 67 22 20 20 20 20 20 20 20 20 20 20 20 20  peg"            
9250: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
9260: 20 20 20 7b 20 22 6a 70 65 22 2c 20 20 20 20 20     { "jpe",     
9270: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 6a 70 65     3, "image/jpe
9280: 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g"              
9290: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
92a0: 20 7b 20 22 6a 70 67 22 2c 20 20 20 20 20 20 20   { "jpg",       
92b0: 20 33 2c 20 22 69 6d 61 67 65 2f 6a 70 65 67 22   3, "image/jpeg"
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92d0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
92e0: 20 22 6a 73 22 2c 20 20 20 20 20 20 20 20 20 32   "js",         2
92f0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
9300: 2d 6a 61 76 61 73 63 72 69 70 74 22 20 20 20 20  -javascript"    
9310: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
9320: 6b 61 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20  kar",        3, 
9330: 22 61 75 64 69 6f 2f 6d 69 64 69 22 20 20 20 20  "audio/midi"    
9340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9350: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 61      },.    { "la
9360: 74 65 78 22 2c 20 20 20 20 20 20 35 2c 20 22 61  tex",      5, "a
9370: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6c 61 74  pplication/x-lat
9380: 65 78 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ex"             
9390: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 68 61 22    },.    { "lha"
93a0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
93b0: 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73  lication/octet-s
93c0: 74 72 65 61 6d 22 20 20 20 20 20 20 20 20 20 20  tream"          
93d0: 7d 2c 0a 20 20 20 20 7b 20 22 6c 73 70 22 2c 20  },.    { "lsp", 
93e0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
93f0: 63 61 74 69 6f 6e 2f 78 2d 6c 69 73 70 22 20 20  cation/x-lisp"  
9400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
9410: 0a 20 20 20 20 7b 20 22 6c 7a 68 22 2c 20 20 20  .    { "lzh",   
9420: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
9430: 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61  tion/octet-strea
9440: 6d 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  m"          },. 
9450: 20 20 20 7b 20 22 6d 22 2c 20 20 20 20 20 20 20     { "m",       
9460: 20 20 20 31 2c 20 22 74 65 78 74 2f 70 6c 61 69     1, "text/plai
9470: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
9480: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9490: 20 7b 20 22 6d 33 75 22 2c 20 20 20 20 20 20 20   { "m3u",       
94a0: 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 6d 70 65   3, "audio/x-mpe
94b0: 67 75 72 6c 22 20 20 20 20 20 20 20 20 20 20 20  gurl"           
94c0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
94d0: 20 22 6d 61 6e 22 2c 20 20 20 20 20 20 20 20 33   "man",        3
94e0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
94f0: 2d 74 72 6f 66 66 2d 6d 61 6e 22 20 20 20 20 20  -troff-man"     
9500: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
9510: 6d 65 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  me",         2, 
9520: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74  "application/x-t
9530: 72 6f 66 66 2d 6d 65 22 20 20 20 20 20 20 20 20  roff-me"        
9540: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 65      },.    { "me
9550: 73 68 22 2c 20 20 20 20 20 20 20 34 2c 20 22 6d  sh",       4, "m
9560: 6f 64 65 6c 2f 6d 65 73 68 22 20 20 20 20 20 20  odel/mesh"      
9570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9580: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 69 64 22    },.    { "mid"
9590: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64  ,        3, "aud
95a0: 69 6f 2f 6d 69 64 69 22 20 20 20 20 20 20 20 20  io/midi"        
95b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95c0: 7d 2c 0a 20 20 20 20 7b 20 22 6d 69 64 69 22 2c  },.    { "midi",
95d0: 20 20 20 20 20 20 20 34 2c 20 22 61 75 64 69 6f         4, "audio
95e0: 2f 6d 69 64 69 22 20 20 20 20 20 20 20 20 20 20  /midi"          
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
9600: 0a 20 20 20 20 7b 20 22 6d 69 66 22 2c 20 20 20  .    { "mif",   
9610: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
9620: 74 69 6f 6e 2f 78 2d 6d 69 66 22 20 20 20 20 20  tion/x-mif"     
9630: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
9640: 20 20 20 7b 20 22 6d 69 6d 65 22 2c 20 20 20 20     { "mime",    
9650: 20 20 20 34 2c 20 22 77 77 77 2f 6d 69 6d 65 22     4, "www/mime"
9660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9670: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9680: 20 7b 20 22 6d 6f 76 69 65 22 2c 20 20 20 20 20   { "movie",     
9690: 20 35 2c 20 22 76 69 64 65 6f 2f 78 2d 73 67 69   5, "video/x-sgi
96a0: 2d 6d 6f 76 69 65 22 20 20 20 20 20 20 20 20 20  -movie"         
96b0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
96c0: 20 22 6d 6f 76 22 2c 20 20 20 20 20 20 20 20 33   "mov",        3
96d0: 2c 20 22 76 69 64 65 6f 2f 71 75 69 63 6b 74 69  , "video/quickti
96e0: 6d 65 22 20 20 20 20 20 20 20 20 20 20 20 20 20  me"             
96f0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
9700: 6d 70 32 22 2c 20 20 20 20 20 20 20 20 33 2c 20  mp2",        3, 
9710: 22 61 75 64 69 6f 2f 6d 70 65 67 22 20 20 20 20  "audio/mpeg"    
9720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9730: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70      },.    { "mp
9740: 32 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76  2",        3, "v
9750: 69 64 65 6f 2f 6d 70 65 67 22 20 20 20 20 20 20  ideo/mpeg"      
9760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9770: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 33 22    },.    { "mp3"
9780: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64  ,        3, "aud
9790: 69 6f 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20  io/mpeg"        
97a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97b0: 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 65 67 22 2c  },.    { "mpeg",
97c0: 20 20 20 20 20 20 20 34 2c 20 22 76 69 64 65 6f         4, "video
97d0: 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20 20 20  /mpeg"          
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
97f0: 0a 20 20 20 20 7b 20 22 6d 70 65 22 2c 20 20 20  .    { "mpe",   
9800: 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 6d       3, "video/m
9810: 70 65 67 22 20 20 20 20 20 20 20 20 20 20 20 20  peg"            
9820: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
9830: 20 20 20 7b 20 22 6d 70 67 61 22 2c 20 20 20 20     { "mpga",    
9840: 20 20 20 34 2c 20 22 61 75 64 69 6f 2f 6d 70 65     4, "audio/mpe
9850: 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g"              
9860: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9870: 20 7b 20 22 6d 70 67 22 2c 20 20 20 20 20 20 20   { "mpg",       
9880: 20 33 2c 20 22 76 69 64 65 6f 2f 6d 70 65 67 22   3, "video/mpeg"
9890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98a0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
98b0: 20 22 6d 73 22 2c 20 20 20 20 20 20 20 20 20 32   "ms",         2
98c0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
98d0: 2d 74 72 6f 66 66 2d 6d 73 22 20 20 20 20 20 20  -troff-ms"      
98e0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
98f0: 6d 73 68 22 2c 20 20 20 20 20 20 20 20 33 2c 20  msh",        3, 
9900: 22 6d 6f 64 65 6c 2f 6d 65 73 68 22 20 20 20 20  "model/mesh"    
9910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9920: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 63      },.    { "nc
9930: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61  ",         2, "a
9940: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6e 65 74  pplication/x-net
9950: 63 64 66 22 20 20 20 20 20 20 20 20 20 20 20 20  cdf"            
9960: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 64 61 22    },.    { "oda"
9970: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
9980: 6c 69 63 61 74 69 6f 6e 2f 6f 64 61 22 20 20 20  lication/oda"   
9990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99a0: 7d 2c 0a 20 20 20 20 7b 20 22 6f 67 67 22 2c 20  },.    { "ogg", 
99b0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
99c0: 63 61 74 69 6f 6e 2f 6f 67 67 22 20 20 20 20 20  cation/ogg"     
99d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
99e0: 0a 20 20 20 20 7b 20 22 6f 67 6d 22 2c 20 20 20  .    { "ogm",   
99f0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
9a00: 74 69 6f 6e 2f 6f 67 67 22 20 20 20 20 20 20 20  tion/ogg"       
9a10: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
9a20: 20 20 20 7b 20 22 70 62 6d 22 2c 20 20 20 20 20     { "pbm",     
9a30: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 70     3, "image/x-p
9a40: 6f 72 74 61 62 6c 65 2d 62 69 74 6d 61 70 22 20  ortable-bitmap" 
9a50: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9a60: 20 7b 20 22 70 64 62 22 2c 20 20 20 20 20 20 20   { "pdb",       
9a70: 20 33 2c 20 22 63 68 65 6d 69 63 61 6c 2f 78 2d   3, "chemical/x-
9a80: 70 64 62 22 20 20 20 20 20 20 20 20 20 20 20 20  pdb"            
9a90: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
9aa0: 20 22 70 64 66 22 2c 20 20 20 20 20 20 20 20 33   "pdf",        3
9ab0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70  , "application/p
9ac0: 64 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20  df"             
9ad0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
9ae0: 70 67 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20  pgm",        3, 
9af0: 22 69 6d 61 67 65 2f 78 2d 70 6f 72 74 61 62 6c  "image/x-portabl
9b00: 65 2d 67 72 61 79 6d 61 70 22 20 20 20 20 20 20  e-graymap"      
9b10: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 67      },.    { "pg
9b20: 6e 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  n",        3, "a
9b30: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 63 68 65  pplication/x-che
9b40: 73 73 2d 70 67 6e 22 20 20 20 20 20 20 20 20 20  ss-pgn"         
9b50: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 67 70 22    },.    { "pgp"
9b60: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
9b70: 6c 69 63 61 74 69 6f 6e 2f 70 67 70 22 20 20 20  lication/pgp"   
9b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b90: 7d 2c 0a 20 20 20 20 7b 20 22 70 6c 22 2c 20 20  },.    { "pl",  
9ba0: 20 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69         2, "appli
9bb0: 63 61 74 69 6f 6e 2f 78 2d 70 65 72 6c 22 20 20  cation/x-perl"  
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
9bd0: 0a 20 20 20 20 7b 20 22 70 6d 22 2c 20 20 20 20  .    { "pm",    
9be0: 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61       2, "applica
9bf0: 74 69 6f 6e 2f 78 2d 70 65 72 6c 22 20 20 20 20  tion/x-perl"    
9c00: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
9c10: 20 20 20 7b 20 22 70 6e 67 22 2c 20 20 20 20 20     { "png",     
9c20: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 70 6e 67     3, "image/png
9c30: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9c40: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9c50: 20 7b 20 22 70 6e 6d 22 2c 20 20 20 20 20 20 20   { "pnm",       
9c60: 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 70 6f 72   3, "image/x-por
9c70: 74 61 62 6c 65 2d 61 6e 79 6d 61 70 22 20 20 20  table-anymap"   
9c80: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
9c90: 20 22 70 6f 74 22 2c 20 20 20 20 20 20 20 20 33   "pot",        3
9ca0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d  , "application/m
9cb0: 73 70 6f 77 65 72 70 6f 69 6e 74 22 20 20 20 20  spowerpoint"    
9cc0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
9cd0: 70 70 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20  ppm",        3, 
9ce0: 22 69 6d 61 67 65 2f 78 2d 70 6f 72 74 61 62 6c  "image/x-portabl
9cf0: 65 2d 70 69 78 6d 61 70 22 20 20 20 20 20 20 20  e-pixmap"       
9d00: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 70      },.    { "pp
9d10: 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  s",        3, "a
9d20: 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 70 6f 77  pplication/mspow
9d30: 65 72 70 6f 69 6e 74 22 20 20 20 20 20 20 20 20  erpoint"        
9d40: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 70 74 22    },.    { "ppt"
9d50: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
9d60: 6c 69 63 61 74 69 6f 6e 2f 6d 73 70 6f 77 65 72  lication/mspower
9d70: 70 6f 69 6e 74 22 20 20 20 20 20 20 20 20 20 20  point"          
9d80: 7d 2c 0a 20 20 20 20 7b 20 22 70 70 7a 22 2c 20  },.    { "ppz", 
9d90: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
9da0: 63 61 74 69 6f 6e 2f 6d 73 70 6f 77 65 72 70 6f  cation/mspowerpo
9db0: 69 6e 74 22 20 20 20 20 20 20 20 20 20 20 7d 2c  int"          },
9dc0: 0a 20 20 20 20 7b 20 22 70 72 65 22 2c 20 20 20  .    { "pre",   
9dd0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
9de0: 74 69 6f 6e 2f 78 2d 66 72 65 65 6c 61 6e 63 65  tion/x-freelance
9df0: 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  "           },. 
9e00: 20 20 20 7b 20 22 70 72 74 22 2c 20 20 20 20 20     { "prt",     
9e10: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
9e20: 6f 6e 2f 70 72 6f 5f 65 6e 67 22 20 20 20 20 20  on/pro_eng"     
9e30: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9e40: 20 7b 20 22 70 73 22 2c 20 20 20 20 20 20 20 20   { "ps",        
9e50: 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   2, "application
9e60: 2f 70 6f 73 74 73 63 72 69 70 74 22 20 20 20 20  /postscript"    
9e70: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
9e80: 20 22 71 74 22 2c 20 20 20 20 20 20 20 20 20 32   "qt",         2
9e90: 2c 20 22 76 69 64 65 6f 2f 71 75 69 63 6b 74 69  , "video/quickti
9ea0: 6d 65 22 20 20 20 20 20 20 20 20 20 20 20 20 20  me"             
9eb0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
9ec0: 72 61 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  ra",         2, 
9ed0: 22 61 75 64 69 6f 2f 78 2d 72 65 61 6c 61 75 64  "audio/x-realaud
9ee0: 69 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20  io"             
9ef0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61      },.    { "ra
9f00: 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  m",        3, "a
9f10: 75 64 69 6f 2f 78 2d 70 6e 2d 72 65 61 6c 61 75  udio/x-pn-realau
9f20: 64 69 6f 22 20 20 20 20 20 20 20 20 20 20 20 20  dio"            
9f30: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61 72 22    },.    { "rar"
9f40: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
9f50: 6c 69 63 61 74 69 6f 6e 2f 78 2d 72 61 72 2d 63  lication/x-rar-c
9f60: 6f 6d 70 72 65 73 73 65 64 22 20 20 20 20 20 20  ompressed"      
9f70: 7d 2c 0a 20 20 20 20 7b 20 22 72 61 73 22 2c 20  },.    { "ras", 
9f80: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
9f90: 2f 63 6d 75 2d 72 61 73 74 65 72 22 20 20 20 20  /cmu-raster"    
9fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
9fb0: 0a 20 20 20 20 7b 20 22 72 61 73 22 2c 20 20 20  .    { "ras",   
9fc0: 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78       3, "image/x
9fd0: 2d 63 6d 75 2d 72 61 73 74 65 72 22 20 20 20 20  -cmu-raster"    
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
9ff0: 20 20 20 7b 20 22 72 67 62 22 2c 20 20 20 20 20     { "rgb",     
a000: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 72     3, "image/x-r
a010: 67 62 22 20 20 20 20 20 20 20 20 20 20 20 20 20  gb"             
a020: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
a030: 20 7b 20 22 72 6d 22 2c 20 20 20 20 20 20 20 20   { "rm",        
a040: 20 32 2c 20 22 61 75 64 69 6f 2f 78 2d 70 6e 2d   2, "audio/x-pn-
a050: 72 65 61 6c 61 75 64 69 6f 22 20 20 20 20 20 20  realaudio"      
a060: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
a070: 20 22 72 6f 66 66 22 2c 20 20 20 20 20 20 20 34   "roff",       4
a080: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
a090: 2d 74 72 6f 66 66 22 20 20 20 20 20 20 20 20 20  -troff"         
a0a0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
a0b0: 72 70 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20  rpm",        3, 
a0c0: 22 61 75 64 69 6f 2f 78 2d 70 6e 2d 72 65 61 6c  "audio/x-pn-real
a0d0: 61 75 64 69 6f 2d 70 6c 75 67 69 6e 22 20 20 20  audio-plugin"   
a0e0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 74      },.    { "rt
a0f0: 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  f",        3, "a
a100: 70 70 6c 69 63 61 74 69 6f 6e 2f 72 74 66 22 20  pplication/rtf" 
a110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a120: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 74 66 22    },.    { "rtf"
a130: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65 78  ,        3, "tex
a140: 74 2f 72 74 66 22 20 20 20 20 20 20 20 20 20 20  t/rtf"          
a150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a160: 7d 2c 0a 20 20 20 20 7b 20 22 72 74 78 22 2c 20  },.    { "rtx", 
a170: 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f         3, "text/
a180: 72 69 63 68 74 65 78 74 22 20 20 20 20 20 20 20  richtext"       
a190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
a1a0: 0a 20 20 20 20 7b 20 22 73 63 6d 22 2c 20 20 20  .    { "scm",   
a1b0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
a1c0: 74 69 6f 6e 2f 78 2d 6c 6f 74 75 73 73 63 72 65  tion/x-lotusscre
a1d0: 65 6e 63 61 6d 22 20 20 20 20 20 20 7d 2c 0a 20  encam"      },. 
a1e0: 20 20 20 7b 20 22 73 65 74 22 2c 20 20 20 20 20     { "set",     
a1f0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
a200: 6f 6e 2f 73 65 74 22 20 20 20 20 20 20 20 20 20  on/set"         
a210: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
a220: 20 7b 20 22 73 67 6d 6c 22 2c 20 20 20 20 20 20   { "sgml",      
a230: 20 34 2c 20 22 74 65 78 74 2f 73 67 6d 6c 22 20   4, "text/sgml" 
a240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a250: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
a260: 20 22 73 67 6d 22 2c 20 20 20 20 20 20 20 20 33   "sgm",        3
a270: 2c 20 22 74 65 78 74 2f 73 67 6d 6c 22 20 20 20  , "text/sgml"   
a280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a290: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
a2a0: 73 68 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  sh",         2, 
a2b0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73  "application/x-s
a2c0: 68 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h"              
a2d0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 68      },.    { "sh
a2e0: 61 72 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61  ar",       4, "a
a2f0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 68 61  pplication/x-sha
a300: 72 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r"              
a310: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 69 6c 6f    },.    { "silo
a320: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 6d 6f 64  ",       4, "mod
a330: 65 6c 2f 6d 65 73 68 22 20 20 20 20 20 20 20 20  el/mesh"        
a340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a350: 7d 2c 0a 20 20 20 20 7b 20 22 73 69 74 22 2c 20  },.    { "sit", 
a360: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
a370: 63 61 74 69 6f 6e 2f 78 2d 73 74 75 66 66 69 74  cation/x-stuffit
a380: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  "             },
a390: 0a 20 20 20 20 7b 20 22 73 6b 64 22 2c 20 20 20  .    { "skd",   
a3a0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
a3b0: 74 69 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20 20  tion/x-koan"    
a3c0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
a3d0: 20 20 20 7b 20 22 73 6b 6d 22 2c 20 20 20 20 20     { "skm",     
a3e0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
a3f0: 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20 20 20 20  on/x-koan"      
a400: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
a410: 20 7b 20 22 73 6b 70 22 2c 20 20 20 20 20 20 20   { "skp",       
a420: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
a430: 2f 78 2d 6b 6f 61 6e 22 20 20 20 20 20 20 20 20  /x-koan"        
a440: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
a450: 20 22 73 6b 74 22 2c 20 20 20 20 20 20 20 20 33   "skt",        3
a460: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
a470: 2d 6b 6f 61 6e 22 20 20 20 20 20 20 20 20 20 20  -koan"          
a480: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
a490: 73 6d 69 22 2c 20 20 20 20 20 20 20 20 33 2c 20  smi",        3, 
a4a0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 73 6d 69  "application/smi
a4b0: 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l"              
a4c0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d      },.    { "sm
a4d0: 69 6c 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61  il",       4, "a
a4e0: 70 70 6c 69 63 61 74 69 6f 6e 2f 73 6d 69 6c 22  pplication/smil"
a4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a500: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6e 64 22    },.    { "snd"
a510: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64  ,        3, "aud
a520: 69 6f 2f 62 61 73 69 63 22 20 20 20 20 20 20 20  io/basic"       
a530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a540: 7d 2c 0a 20 20 20 20 7b 20 22 73 6f 6c 22 2c 20  },.    { "sol", 
a550: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
a560: 63 61 74 69 6f 6e 2f 73 6f 6c 69 64 73 22 20 20  cation/solids"  
a570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
a580: 0a 20 20 20 20 7b 20 22 73 70 6c 22 2c 20 20 20  .    { "spl",   
a590: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
a5a0: 74 69 6f 6e 2f 78 2d 66 75 74 75 72 65 73 70 6c  tion/x-futurespl
a5b0: 61 73 68 22 20 20 20 20 20 20 20 20 7d 2c 0a 20  ash"        },. 
a5c0: 20 20 20 7b 20 22 73 72 63 22 2c 20 20 20 20 20     { "src",     
a5d0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
a5e0: 6f 6e 2f 78 2d 77 61 69 73 2d 73 6f 75 72 63 65  on/x-wais-source
a5f0: 22 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  "         },.   
a600: 20 7b 20 22 73 74 65 70 22 2c 20 20 20 20 20 20   { "step",      
a610: 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   4, "application
a620: 2f 53 54 45 50 22 20 20 20 20 20 20 20 20 20 20  /STEP"          
a630: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
a640: 20 22 73 74 6c 22 2c 20 20 20 20 20 20 20 20 33   "stl",        3
a650: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 53  , "application/S
a660: 4c 41 22 20 20 20 20 20 20 20 20 20 20 20 20 20  LA"             
a670: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
a680: 73 74 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20  stp",        3, 
a690: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 53 54 45  "application/STE
a6a0: 50 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  P"              
a6b0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 76      },.    { "sv
a6c0: 34 63 70 69 6f 22 2c 20 20 20 20 37 2c 20 22 61  4cpio",    7, "a
a6d0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 76 34  pplication/x-sv4
a6e0: 63 70 69 6f 22 20 20 20 20 20 20 20 20 20 20 20  cpio"           
a6f0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 76 34 63    },.    { "sv4c
a700: 72 63 22 2c 20 20 20 20 20 36 2c 20 22 61 70 70  rc",     6, "app
a710: 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 76 34 63 72  lication/x-sv4cr
a720: 63 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c"              
a730: 7d 2c 0a 20 20 20 20 7b 20 22 73 76 67 22 2c 20  },.    { "svg", 
a740: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
a750: 2f 73 76 67 2b 78 6d 6c 22 20 20 20 20 20 20 20  /svg+xml"       
a760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
a770: 0a 20 20 20 20 7b 20 22 73 77 66 22 2c 20 20 20  .    { "swf",   
a780: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
a790: 74 69 6f 6e 2f 78 2d 73 68 6f 63 6b 77 61 76 65  tion/x-shockwave
a7a0: 2d 66 6c 61 73 68 22 20 20 20 20 20 7d 2c 0a 20  -flash"     },. 
a7b0: 20 20 20 7b 20 22 74 22 2c 20 20 20 20 20 20 20     { "t",       
a7c0: 20 20 20 31 2c 20 22 61 70 70 6c 69 63 61 74 69     1, "applicati
a7d0: 6f 6e 2f 78 2d 74 72 6f 66 66 22 20 20 20 20 20  on/x-troff"     
a7e0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
a7f0: 20 7b 20 22 74 61 72 22 2c 20 20 20 20 20 20 20   { "tar",       
a800: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
a810: 2f 78 2d 74 61 72 22 20 20 20 20 20 20 20 20 20  /x-tar"         
a820: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
a830: 20 22 74 63 6c 22 2c 20 20 20 20 20 20 20 20 33   "tcl",        3
a840: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
a850: 2d 74 63 6c 22 20 20 20 20 20 20 20 20 20 20 20  -tcl"           
a860: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
a870: 74 65 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20  tex",        3, 
a880: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74  "application/x-t
a890: 65 78 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ex"             
a8a0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 65      },.    { "te
a8b0: 78 69 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61  xi",       4, "a
a8c0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 65 78  pplication/x-tex
a8d0: 69 6e 66 6f 22 20 20 20 20 20 20 20 20 20 20 20  info"           
a8e0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 65 78 69    },.    { "texi
a8f0: 6e 66 6f 22 2c 20 20 20 20 37 2c 20 22 61 70 70  nfo",    7, "app
a900: 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 65 78 69 6e  lication/x-texin
a910: 66 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20  fo"             
a920: 7d 2c 0a 20 20 20 20 7b 20 22 74 67 7a 22 2c 20  },.    { "tgz", 
a930: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
a940: 63 61 74 69 6f 6e 2f 78 2d 74 61 72 2d 67 7a 22  cation/x-tar-gz"
a950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
a960: 0a 20 20 20 20 7b 20 22 74 69 66 66 22 2c 20 20  .    { "tiff",  
a970: 20 20 20 20 20 34 2c 20 22 69 6d 61 67 65 2f 74       4, "image/t
a980: 69 66 66 22 20 20 20 20 20 20 20 20 20 20 20 20  iff"            
a990: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
a9a0: 20 20 20 7b 20 22 74 69 66 22 2c 20 20 20 20 20     { "tif",     
a9b0: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 74 69 66     3, "image/tif
a9c0: 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f"              
a9d0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
a9e0: 20 7b 20 22 74 72 22 2c 20 20 20 20 20 20 20 20   { "tr",        
a9f0: 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   2, "application
aa00: 2f 78 2d 74 72 6f 66 66 22 20 20 20 20 20 20 20  /x-troff"       
aa10: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
aa20: 20 22 74 73 69 22 2c 20 20 20 20 20 20 20 20 33   "tsi",        3
aa30: 2c 20 22 61 75 64 69 6f 2f 54 53 50 2d 61 75 64  , "audio/TSP-aud
aa40: 69 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20  io"             
aa50: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
aa60: 74 73 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20  tsp",        3, 
aa70: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 64 73 70  "application/dsp
aa80: 74 79 70 65 22 20 20 20 20 20 20 20 20 20 20 20  type"           
aa90: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 73      },.    { "ts
aaa0: 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74  v",        3, "t
aab0: 65 78 74 2f 74 61 62 2d 73 65 70 61 72 61 74 65  ext/tab-separate
aac0: 64 2d 76 61 6c 75 65 73 22 20 20 20 20 20 20 20  d-values"       
aad0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 78 74 22    },.    { "txt"
aae0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65 78  ,        3, "tex
aaf0: 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20  t/plain"        
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab10: 7d 2c 0a 20 20 20 20 7b 20 22 75 6e 76 22 2c 20  },.    { "unv", 
ab20: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
ab30: 63 61 74 69 6f 6e 2f 69 2d 64 65 61 73 22 20 20  cation/i-deas"  
ab40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
ab50: 0a 20 20 20 20 7b 20 22 75 73 74 61 72 22 2c 20  .    { "ustar", 
ab60: 20 20 20 20 20 35 2c 20 22 61 70 70 6c 69 63 61       5, "applica
ab70: 74 69 6f 6e 2f 78 2d 75 73 74 61 72 22 20 20 20  tion/x-ustar"   
ab80: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
ab90: 20 20 20 7b 20 22 76 63 64 22 2c 20 20 20 20 20     { "vcd",     
aba0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
abb0: 6f 6e 2f 78 2d 63 64 6c 69 6e 6b 22 20 20 20 20  on/x-cdlink"    
abc0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
abd0: 20 7b 20 22 76 64 61 22 2c 20 20 20 20 20 20 20   { "vda",       
abe0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
abf0: 2f 76 64 61 22 20 20 20 20 20 20 20 20 20 20 20  /vda"           
ac00: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
ac10: 20 22 76 69 76 22 2c 20 20 20 20 20 20 20 20 33   "viv",        3
ac20: 2c 20 22 76 69 64 65 6f 2f 76 6e 64 2e 76 69 76  , "video/vnd.viv
ac30: 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o"              
ac40: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
ac50: 76 69 76 6f 22 2c 20 20 20 20 20 20 20 34 2c 20  vivo",       4, 
ac60: 22 76 69 64 65 6f 2f 76 6e 64 2e 76 69 76 6f 22  "video/vnd.vivo"
ac70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac80: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 76 72      },.    { "vr
ac90: 6d 6c 22 2c 20 20 20 20 20 20 20 34 2c 20 22 6d  ml",       4, "m
aca0: 6f 64 65 6c 2f 76 72 6d 6c 22 20 20 20 20 20 20  odel/vrml"      
acb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acc0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 76 73 69 78    },.    { "vsix
acd0: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70 70  ",       4, "app
ace0: 6c 69 63 61 74 69 6f 6e 2f 76 73 69 78 22 20 20  lication/vsix"  
acf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad00: 7d 2c 0a 20 20 20 20 7b 20 22 77 61 76 22 2c 20  },.    { "wav", 
ad10: 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f         3, "audio
ad20: 2f 78 2d 77 61 76 22 20 20 20 20 20 20 20 20 20  /x-wav"         
ad30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
ad40: 0a 20 20 20 20 7b 20 22 77 61 78 22 2c 20 20 20  .    { "wax",   
ad50: 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 78       3, "audio/x
ad60: 2d 6d 73 2d 77 61 78 22 20 20 20 20 20 20 20 20  -ms-wax"        
ad70: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
ad80: 20 20 20 7b 20 22 77 69 6b 69 22 2c 20 20 20 20     { "wiki",    
ad90: 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69     4, "applicati
ada0: 6f 6e 2f 78 2d 66 6f 73 73 69 6c 2d 77 69 6b 69  on/x-fossil-wiki
adb0: 22 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  "         },.   
adc0: 20 7b 20 22 77 6d 61 22 2c 20 20 20 20 20 20 20   { "wma",       
add0: 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 6d 73 2d   3, "audio/x-ms-
ade0: 77 6d 61 22 20 20 20 20 20 20 20 20 20 20 20 20  wma"            
adf0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
ae00: 20 22 77 6d 76 22 2c 20 20 20 20 20 20 20 20 33   "wmv",        3
ae10: 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 77 6d  , "video/x-ms-wm
ae20: 76 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v"              
ae30: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
ae40: 77 6d 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20  wmx",        3, 
ae50: 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 77 6d 78 22  "video/x-ms-wmx"
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae70: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 72      },.    { "wr
ae80: 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 6d  l",        3, "m
ae90: 6f 64 65 6c 2f 76 72 6d 6c 22 20 20 20 20 20 20  odel/vrml"      
aea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aeb0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 76 78 22    },.    { "wvx"
aec0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64  ,        3, "vid
aed0: 65 6f 2f 78 2d 6d 73 2d 77 76 78 22 20 20 20 20  eo/x-ms-wvx"    
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aef0: 7d 2c 0a 20 20 20 20 7b 20 22 78 62 6d 22 2c 20  },.    { "xbm", 
af00: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
af10: 2f 78 2d 78 62 69 74 6d 61 70 22 20 20 20 20 20  /x-xbitmap"     
af20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
af30: 0a 20 20 20 20 7b 20 22 78 6c 63 22 2c 20 20 20  .    { "xlc",   
af40: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
af50: 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65  tion/vnd.ms-exce
af60: 6c 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  l"          },. 
af70: 20 20 20 7b 20 22 78 6c 6c 22 2c 20 20 20 20 20     { "xll",     
af80: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
af90: 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22  on/vnd.ms-excel"
afa0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
afb0: 20 7b 20 22 78 6c 6d 22 2c 20 20 20 20 20 20 20   { "xlm",       
afc0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
afd0: 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20 20  /vnd.ms-excel"  
afe0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
aff0: 20 22 78 6c 73 22 2c 20 20 20 20 20 20 20 20 33   "xls",        3
b000: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76  , "application/v
b010: 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20 20 20 20  nd.ms-excel"    
b020: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
b030: 78 6c 77 22 2c 20 20 20 20 20 20 20 20 33 2c 20  xlw",        3, 
b040: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76 6e 64  "application/vnd
b050: 2e 6d 73 2d 65 78 63 65 6c 22 20 20 20 20 20 20  .ms-excel"      
b060: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 6d      },.    { "xm
b070: 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74  l",        3, "t
b080: 65 78 74 2f 78 6d 6c 22 20 20 20 20 20 20 20 20  ext/xml"        
b090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0a0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 70 6d 22    },.    { "xpm"
b0b0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61  ,        3, "ima
b0c0: 67 65 2f 78 2d 78 70 69 78 6d 61 70 22 20 20 20  ge/x-xpixmap"   
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0e0: 7d 2c 0a 20 20 20 20 7b 20 22 78 77 64 22 2c 20  },.    { "xwd", 
b0f0: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
b100: 2f 78 2d 78 77 69 6e 64 6f 77 64 75 6d 70 22 20  /x-xwindowdump" 
b110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
b120: 0a 20 20 20 20 7b 20 22 78 79 7a 22 2c 20 20 20  .    { "xyz",   
b130: 20 20 20 20 20 33 2c 20 22 63 68 65 6d 69 63 61       3, "chemica
b140: 6c 2f 78 2d 70 64 62 22 20 20 20 20 20 20 20 20  l/x-pdb"        
b150: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
b160: 20 20 20 7b 20 22 7a 69 70 22 2c 20 20 20 20 20     { "zip",     
b170: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
b180: 6f 6e 2f 7a 69 70 22 20 20 20 20 20 20 20 20 20  on/zip"         
b190: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d            },.  }
b1a0: 3b 0a 0a 20 20 66 6f 72 28 69 3d 6e 4e 61 6d 65  ;..  for(i=nName
b1b0: 2d 31 3b 20 69 3e 30 20 26 26 20 7a 4e 61 6d 65  -1; i>0 && zName
b1c0: 5b 69 5d 21 3d 27 2e 27 3b 20 69 2d 2d 29 7b 7d  [i]!='.'; i--){}
b1d0: 0a 20 20 7a 20 3d 20 26 7a 4e 61 6d 65 5b 69 2b  .  z = &zName[i+
b1e0: 31 5d 3b 0a 20 20 6c 65 6e 20 3d 20 6e 4e 61 6d  1];.  len = nNam
b1f0: 65 20 2d 20 69 3b 0a 20 20 69 66 28 20 6c 65 6e  e - i;.  if( len
b200: 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 7a 53 75  <(int)sizeof(zSu
b210: 66 66 69 78 29 2d 31 20 29 7b 0a 20 20 20 20 73  ffix)-1 ){.    s
b220: 74 72 63 70 79 28 7a 53 75 66 66 69 78 2c 20 7a  trcpy(zSuffix, z
b230: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
b240: 7a 53 75 66 66 69 78 5b 69 5d 3b 20 69 2b 2b 29  zSuffix[i]; i++)
b250: 20 7a 53 75 66 66 69 78 5b 69 5d 20 3d 20 74 6f   zSuffix[i] = to
b260: 6c 6f 77 65 72 28 7a 53 75 66 66 69 78 5b 69 5d  lower(zSuffix[i]
b270: 29 3b 0a 20 20 20 20 66 69 72 73 74 20 3d 20 30  );.    first = 0
b280: 3b 0a 20 20 20 20 6c 61 73 74 20 3d 20 73 69 7a  ;.    last = siz
b290: 65 6f 66 28 61 4d 69 6d 65 29 2f 73 69 7a 65 6f  eof(aMime)/sizeo
b2a0: 66 28 61 4d 69 6d 65 5b 30 5d 29 3b 0a 20 20 20  f(aMime[0]);.   
b2b0: 20 77 68 69 6c 65 28 20 66 69 72 73 74 3c 3d 6c   while( first<=l
b2c0: 61 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ast ){.      int
b2d0: 20 63 3b 0a 20 20 20 20 20 20 69 20 3d 20 28 66   c;.      i = (f
b2e0: 69 72 73 74 2b 6c 61 73 74 29 2f 32 3b 0a 20 20  irst+last)/2;.  
b2f0: 20 20 20 20 63 20 3d 20 73 74 72 63 6d 70 28 7a      c = strcmp(z
b300: 53 75 66 66 69 78 2c 20 61 4d 69 6d 65 5b 69 5d  Suffix, aMime[i]
b310: 2e 7a 53 75 66 66 69 78 29 3b 0a 20 20 20 20 20  .zSuffix);.     
b320: 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74 75   if( c==0 ) retu
b330: 72 6e 20 61 4d 69 6d 65 5b 69 5d 2e 7a 4d 69 6d  rn aMime[i].zMim
b340: 65 74 79 70 65 3b 0a 20 20 20 20 20 20 69 66 28  etype;.      if(
b350: 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c<0 ){.        
b360: 6c 61 73 74 20 3d 20 69 2d 31 3b 0a 20 20 20 20  last = i-1;.    
b370: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b380: 20 66 69 72 73 74 20 3d 20 69 2b 31 3b 0a 20 20   first = i+1;.  
b390: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
b3a0: 20 20 72 65 74 75 72 6e 20 22 61 70 70 6c 69 63    return "applic
b3b0: 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65  ation/octet-stre
b3c0: 61 6d 22 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  am";.}../*.** Th
b3d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
b3e0: 65 20 63 6f 6e 74 61 69 6e 73 20 31 20 66 6f 72  e contains 1 for
b3f0: 20 61 6c 6c 20 63 68 61 72 61 63 74 65 72 73 20   all characters 
b400: 74 68 61 74 20 61 72 65 20 70 65 72 6d 69 74 74  that are permitt
b410: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 70 61 72  ed in.** the par
b420: 74 20 6f 66 20 74 68 65 20 55 52 4c 20 62 65 66  t of the URL bef
b430: 6f 72 65 20 74 68 65 20 71 75 65 72 79 20 70 61  ore the query pa
b440: 72 61 6d 65 74 65 72 73 20 61 6e 64 20 66 72 61  rameters and fra
b450: 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  gment..**.** All
b460: 6f 77 65 64 20 63 68 61 72 61 63 74 65 72 73 3a  owed characters:
b470: 20 20 30 2d 39 61 2d 7a 41 2d 5a 2c 2d 2e 2f 3a    0-9a-zA-Z,-./:
b480: 5f 7e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 6c 6c 6f  _~.**.** Disallo
b490: 77 65 64 20 63 68 61 72 61 63 74 65 72 73 20 69  wed characters i
b4a0: 6e 63 6c 75 64 65 3a 20 20 21 22 23 24 25 26 27  nclude:  !"#$%&'
b4b0: 28 29 2a 2b 3b 3c 3d 3e 3f 5b 5c 5d 5e 7b 7c 7d  ()*+;<=>?[\]^{|}
b4c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
b4d0: 20 63 68 61 72 20 61 6c 6c 6f 77 65 64 49 6e 4e   char allowedInN
b4e0: 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ame[] = {.      
b4f0: 2f 2a 20 20 78 30 20 20 78 31 20 20 78 32 20 20  /*  x0  x1  x2  
b500: 78 33 20 20 78 34 20 20 78 35 20 20 78 36 20 20  x3  x4  x5  x6  
b510: 78 37 20 20 78 38 20 20 78 39 20 20 78 61 20 20  x7  x8  x9  xa  
b520: 78 62 20 20 78 63 20 20 78 64 20 20 78 65 20 20  xb  xc  xd  xe  
b530: 78 66 20 2a 2f 0a 2f 2a 20 30 78 20 2a 2f 20 20  xf */./* 0x */  
b540: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
b550: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
b560: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
b570: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a   0,  0,  0,  0,.
b580: 2f 2a 20 31 78 20 2a 2f 20 20 20 30 2c 20 20 30  /* 1x */   0,  0
b590: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
b5a0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
b5b0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
b5c0: 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 32 78 20  ,  0,  0,./* 2x 
b5d0: 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20  */   0,  0,  0, 
b5e0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
b5f0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
b600: 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   0,  1,  1,  1, 
b610: 20 31 2c 0a 2f 2a 20 33 78 20 2a 2f 20 20 20 31   1,./* 3x */   1
b620: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
b630: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
b640: 2c 20 20 31 2c 20 20 31 2c 20 20 30 2c 20 20 30  ,  1,  1,  0,  0
b650: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a  ,  0,  0,  0,./*
b660: 20 34 78 20 2a 2f 20 20 20 30 2c 20 20 31 2c 20   4x */   0,  1, 
b670: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
b680: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
b690: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
b6a0: 20 31 2c 20 20 31 2c 0a 2f 2a 20 35 78 20 2a 2f   1,  1,./* 5x */
b6b0: 20 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31     1,  1,  1,  1
b6c0: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
b6d0: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 30  ,  1,  1,  1,  0
b6e0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 31  ,  0,  0,  0,  1
b6f0: 2c 0a 2f 2a 20 36 78 20 2a 2f 20 20 20 30 2c 20  ,./* 6x */   0, 
b700: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
b710: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
b720: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
b730: 20 31 2c 20 20 31 2c 20 20 31 2c 0a 2f 2a 20 37   1,  1,  1,./* 7
b740: 78 20 2a 2f 20 20 20 31 2c 20 20 31 2c 20 20 31  x */   1,  1,  1
b750: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
b760: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
b770: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 31  ,  0,  0,  0,  1
b780: 2c 20 20 30 2c 0a 2f 2a 20 38 78 20 2a 2f 20 20  ,  0,./* 8x */  
b790: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
b7a0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
b7b0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
b7c0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a   0,  0,  0,  0,.
b7d0: 2f 2a 20 39 78 20 2a 2f 20 20 20 30 2c 20 20 30  /* 9x */   0,  0
b7e0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
b7f0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
b800: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
b810: 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 41 78 20  ,  0,  0,./* Ax 
b820: 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20  */   0,  0,  0, 
b830: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
b840: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
b850: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
b860: 20 30 2c 0a 2f 2a 20 42 78 20 2a 2f 20 20 20 30   0,./* Bx */   0
b870: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
b880: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
b890: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
b8a0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a  ,  0,  0,  0,./*
b8b0: 20 43 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20   Cx */   0,  0, 
b8c0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
b8d0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
b8e0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
b8f0: 20 30 2c 20 20 30 2c 0a 2f 2a 20 44 78 20 2a 2f   0,  0,./* Dx */
b900: 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30     0,  0,  0,  0
b910: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
b920: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
b930: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
b940: 2c 0a 2f 2a 20 45 78 20 2a 2f 20 20 20 30 2c 20  ,./* Ex */   0, 
b950: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
b960: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
b970: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
b980: 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 46   0,  0,  0,./* F
b990: 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30  x */   0,  0,  0
b9a0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
b9b0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
b9c0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
b9d0: 2c 20 20 30 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ,  0,.};../*.** 
b9e0: 52 65 6d 6f 76 65 20 61 6c 6c 20 64 69 73 61 6c  Remove all disal
b9f0: 6c 6f 77 65 64 20 63 68 61 72 61 63 74 65 72 73  lowed characters
ba00: 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 73 74   in the input st
ba10: 72 69 6e 67 20 7a 5b 5d 2e 20 20 43 6f 6e 76 65  ring z[].  Conve
ba20: 72 74 20 61 6e 79 0a 2a 2a 20 64 69 73 61 6c 6c  rt any.** disall
ba30: 6f 77 65 64 20 63 68 61 72 61 63 74 65 72 73 20  owed characters 
ba40: 69 6e 74 6f 20 22 5f 22 2e 0a 2a 2a 0a 2a 2a 20  into "_"..**.** 
ba50: 4e 6f 74 20 74 68 61 74 20 74 68 65 20 74 68 72  Not that the thr
ba60: 65 65 20 63 68 61 72 61 63 74 65 72 20 73 65 71  ee character seq
ba70: 75 65 6e 63 65 20 22 25 58 58 22 20 77 68 65 72  uence "%XX" wher
ba80: 65 20 58 20 69 73 20 61 6e 79 20 62 79 74 65 20  e X is any byte 
ba90: 69 73 0a 2a 2a 20 63 6f 6e 76 65 72 74 65 64 20  is.** converted 
baa0: 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 22 5f  into a single "_
bab0: 22 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a 0a  " character..**.
bac0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
bad0: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
bae0: 72 73 20 63 6f 6e 76 65 72 74 65 64 2e 20 20 41  rs converted.  A
baf0: 6e 20 22 25 58 58 22 20 2d 3e 20 22 5f 22 20 63  n "%XX" -> "_" c
bb00: 6f 6e 76 65 72 73 69 6f 6e 0a 2a 2a 20 63 6f 75  onversion.** cou
bb10: 6e 74 73 20 61 73 20 61 20 73 69 6e 67 6c 65 20  nts as a single 
bb20: 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74  character..*/.st
bb30: 61 74 69 63 20 69 6e 74 20 73 61 6e 69 74 69 7a  atic int sanitiz
bb40: 65 53 74 72 69 6e 67 28 63 68 61 72 20 2a 7a 29  eString(char *z)
bb50: 7b 0a 20 20 69 6e 74 20 6e 43 68 61 6e 67 65 20  {.  int nChange 
bb60: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a  = 0;.  while( *z
bb70: 20 29 7b 0a 20 20 20 20 69 66 28 20 21 61 6c 6c   ){.    if( !all
bb80: 6f 77 65 64 49 6e 4e 61 6d 65 5b 2a 28 75 6e 73  owedInName[*(uns
bb90: 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 5d 20 29  igned char*)z] )
bba0: 7b 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d  {.      if( *z==
bbb0: 27 25 27 20 26 26 20 7a 5b 31 5d 21 3d 30 20 26  '%' && z[1]!=0 &
bbc0: 26 20 7a 5b 32 5d 21 3d 30 20 29 7b 0a 20 20 20  & z[2]!=0 ){.   
bbd0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
bbe0: 20 20 20 20 66 6f 72 28 69 3d 33 3b 20 28 7a 5b      for(i=3; (z[
bbf0: 69 2d 32 5d 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b  i-2] = z[i])!=0;
bc00: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 7d 0a   i++){}.      }.
bc10: 20 20 20 20 20 20 2a 7a 20 3d 20 27 5f 27 3b 0a        *z = '_';.
bc20: 20 20 20 20 20 20 6e 43 68 61 6e 67 65 2b 2b 3b        nChange++;
bc30: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 2b 2b 3b 0a  .    }.    z++;.
bc40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68    }.  return nCh
bc50: 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ange;.}../*.** C
bc60: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
bc70: 6f 66 20 22 2f 22 20 63 68 61 72 61 63 74 65 72  of "/" character
bc80: 73 20 69 6e 20 61 20 73 74 72 69 6e 67 2e 0a 2a  s in a string..*
bc90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75  /.static int cou
bca0: 6e 74 53 6c 61 73 68 65 73 28 63 6f 6e 73 74 20  ntSlashes(const 
bcb0: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
bcc0: 6e 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  n = 0;.  while( 
bcd0: 2a 7a 20 29 20 69 66 28 20 2a 28 7a 2b 2b 29 3d  *z ) if( *(z++)=
bce0: 3d 27 2f 27 20 29 20 6e 2b 2b 3b 0a 20 20 72 65  ='/' ) n++;.  re
bcf0: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
bd00: 20 53 65 6e 64 20 74 68 65 20 74 65 78 74 20 6f   Send the text o
bd10: 66 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64  f the file named
bd20: 20 62 79 20 7a 46 69 6c 65 20 61 73 20 74 68 65   by zFile as the
bd30: 20 72 65 70 6c 79 2e 20 20 55 73 65 20 74 68 65   reply.  Use the
bd40: 0a 2a 2a 20 73 75 66 66 69 78 20 6f 6e 20 74 68  .** suffix on th
bd50: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 7a 46 69  e end of the zFi
bd60: 6c 65 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72  le name to deter
bd70: 6d 69 6e 65 20 74 68 65 20 6d 69 6d 65 74 79 70  mine the mimetyp
bd80: 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
bd90: 31 20 74 6f 20 6f 6d 69 74 20 6d 61 6b 69 6e 67  1 to omit making
bda0: 20 61 20 6c 6f 67 20 65 6e 74 72 79 20 66 6f 72   a log entry for
bdb0: 20 74 68 65 20 72 65 70 6c 79 2e 0a 2a 2f 0a 73   the reply..*/.s
bdc0: 74 61 74 69 63 20 69 6e 74 20 53 65 6e 64 46 69  tatic int SendFi
bdd0: 6c 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  le(.  const char
bde0: 20 2a 7a 46 69 6c 65 2c 20 20 20 20 20 20 2f 2a   *zFile,      /*
bdf0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
be00: 65 20 74 6f 20 73 65 6e 64 20 2a 2f 0a 20 20 69  e to send */.  i
be10: 6e 74 20 6c 65 6e 46 69 6c 65 2c 20 20 20 20 20  nt lenFile,     
be20: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
be30: 20 6f 66 20 74 68 65 20 7a 46 69 6c 65 20 6e 61   of the zFile na
be40: 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  me in bytes */. 
be50: 20 73 74 72 75 63 74 20 73 74 61 74 20 2a 70 53   struct stat *pS
be60: 74 61 74 20 20 20 20 20 20 2f 2a 20 52 65 73 75  tat      /* Resu
be70: 6c 74 20 6f 66 20 61 20 73 74 61 74 28 29 20 61  lt of a stat() a
be80: 67 61 69 6e 73 74 20 7a 46 69 6c 65 20 2a 2f 0a  gainst zFile */.
be90: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
bea0: 2a 7a 43 6f 6e 74 65 6e 74 54 79 70 65 3b 0a 20  *zContentType;. 
beb0: 20 69 6e 74 20 63 3b 0a 20 20 74 69 6d 65 5f 74   int c;.  time_t
bec0: 20 74 3b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a   t;.  FILE *in;.
bed0: 20 20 63 68 61 72 20 7a 45 54 61 67 5b 31 30 30    char zETag[100
bee0: 5d 3b 0a 0a 20 20 7a 43 6f 6e 74 65 6e 74 54 79  ];..  zContentTy
bef0: 70 65 20 3d 20 47 65 74 4d 69 6d 65 54 79 70 65  pe = GetMimeType
bf00: 28 7a 46 69 6c 65 2c 20 6c 65 6e 46 69 6c 65 29  (zFile, lenFile)
bf10: 3b 0a 20 20 69 66 28 20 7a 54 6d 70 4e 61 6d 20  ;.  if( zTmpNam 
bf20: 29 20 75 6e 6c 69 6e 6b 28 7a 54 6d 70 4e 61 6d  ) unlink(zTmpNam
bf30: 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 45 54  );.  sprintf(zET
bf40: 61 67 2c 20 22 6d 25 78 73 25 78 22 2c 20 28 69  ag, "m%xs%x", (i
bf50: 6e 74 29 70 53 74 61 74 2d 3e 73 74 5f 6d 74 69  nt)pStat->st_mti
bf60: 6d 65 2c 20 28 69 6e 74 29 70 53 74 61 74 2d 3e  me, (int)pStat->
bf70: 73 74 5f 73 69 7a 65 29 3b 0a 20 20 69 66 28 20  st_size);.  if( 
bf80: 43 6f 6d 70 61 72 65 45 74 61 67 73 28 7a 49 66  CompareEtags(zIf
bf90: 4e 6f 6e 65 4d 61 74 63 68 2c 7a 45 54 61 67 29  NoneMatch,zETag)
bfa0: 3d 3d 30 0a 20 20 20 7c 7c 20 28 7a 49 66 4d 6f  ==0.   || (zIfMo
bfb0: 64 69 66 69 65 64 53 69 6e 63 65 21 3d 30 0a 20  difiedSince!=0. 
bfc0: 20 20 20 20 20 20 20 26 26 20 28 74 20 3d 20 50         && (t = P
bfd0: 61 72 73 65 52 66 63 38 32 32 44 61 74 65 28 7a  arseRfc822Date(z
bfe0: 49 66 4d 6f 64 69 66 69 65 64 53 69 6e 63 65 29  IfModifiedSince)
bff0: 29 3e 30 0a 20 20 20 20 20 20 20 20 26 26 20 74  )>0.        && t
c000: 3e 3d 70 53 74 61 74 2d 3e 73 74 5f 6d 74 69 6d  >=pStat->st_mtim
c010: 65 29 0a 20 20 29 7b 0a 20 20 20 20 53 74 61 72  e).  ){.    Star
c020: 74 52 65 73 70 6f 6e 73 65 28 22 33 30 34 20 4e  tResponse("304 N
c030: 6f 74 20 4d 6f 64 69 66 69 65 64 22 29 3b 0a 20  ot Modified");. 
c040: 20 20 20 6e 4f 75 74 20 2b 3d 20 44 61 74 65 54     nOut += DateT
c050: 61 67 28 22 4c 61 73 74 2d 4d 6f 64 69 66 69 65  ag("Last-Modifie
c060: 64 22 2c 20 70 53 74 61 74 2d 3e 73 74 5f 6d 74  d", pStat->st_mt
c070: 69 6d 65 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b  ime);.    nOut +
c080: 3d 20 70 72 69 6e 74 66 28 22 43 61 63 68 65 2d  = printf("Cache-
c090: 43 6f 6e 74 72 6f 6c 3a 20 6d 61 78 2d 61 67 65  Control: max-age
c0a0: 3d 25 64 5c 72 5c 6e 22 2c 20 6d 78 41 67 65 29  =%d\r\n", mxAge)
c0b0: 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72  ;.    nOut += pr
c0c0: 69 6e 74 66 28 22 45 54 61 67 3a 20 5c 22 25 73  intf("ETag: \"%s
c0d0: 5c 22 5c 72 5c 6e 22 2c 20 7a 45 54 61 67 29 3b  \"\r\n", zETag);
c0e0: 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69  .    nOut += pri
c0f0: 6e 74 66 28 22 5c 72 5c 6e 22 29 3b 0a 20 20 20  ntf("\r\n");.   
c100: 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
c110: 0a 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72  .    MakeLogEntr
c120: 79 28 30 2c 20 34 37 30 29 3b 20 20 2f 2a 20 4c  y(0, 470);  /* L
c130: 4f 47 3a 20 45 54 61 67 20 43 61 63 68 65 20 48  OG: ETag Cache H
c140: 69 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  it */.    return
c150: 20 31 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d 20 66   1;.  }.  in = f
c160: 6f 70 65 6e 28 7a 46 69 6c 65 2c 22 72 62 22 29  open(zFile,"rb")
c170: 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20  ;.  if( in==0 ) 
c180: 4e 6f 74 46 6f 75 6e 64 28 34 38 30 29 3b 20 2f  NotFound(480); /
c190: 2a 20 4c 4f 47 3a 20 66 6f 70 65 6e 28 29 20 66  * LOG: fopen() f
c1a0: 61 69 6c 65 64 20 66 6f 72 20 73 74 61 74 69 63  ailed for static
c1b0: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 53 74   content */.  St
c1c0: 61 72 74 52 65 73 70 6f 6e 73 65 28 22 32 30 30  artResponse("200
c1d0: 20 4f 4b 22 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d   OK");.  nOut +=
c1e0: 20 44 61 74 65 54 61 67 28 22 4c 61 73 74 2d 4d   DateTag("Last-M
c1f0: 6f 64 69 66 69 65 64 22 2c 20 70 53 74 61 74 2d  odified", pStat-
c200: 3e 73 74 5f 6d 74 69 6d 65 29 3b 0a 20 20 6e 4f  >st_mtime);.  nO
c210: 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 43 61  ut += printf("Ca
c220: 63 68 65 2d 43 6f 6e 74 72 6f 6c 3a 20 6d 61 78  che-Control: max
c230: 2d 61 67 65 3d 25 64 5c 72 5c 6e 22 2c 20 6d 78  -age=%d\r\n", mx
c240: 41 67 65 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20  Age);.  nOut += 
c250: 70 72 69 6e 74 66 28 22 45 54 61 67 3a 20 5c 22  printf("ETag: \"
c260: 25 73 5c 22 5c 72 5c 6e 22 2c 20 7a 45 54 61 67  %s\"\r\n", zETag
c270: 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69  );.  nOut += pri
c280: 6e 74 66 28 22 43 6f 6e 74 65 6e 74 2d 74 79 70  ntf("Content-typ
c290: 65 3a 20 25 73 5c 72 5c 6e 22 2c 7a 43 6f 6e 74  e: %s\r\n",zCont
c2a0: 65 6e 74 54 79 70 65 29 3b 0a 20 20 6e 4f 75 74  entType);.  nOut
c2b0: 20 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 74   += printf("Cont
c2c0: 65 6e 74 2d 6c 65 6e 67 74 68 3a 20 25 64 5c 72  ent-length: %d\r
c2d0: 5c 6e 5c 72 5c 6e 22 2c 28 69 6e 74 29 70 53 74  \n\r\n",(int)pSt
c2e0: 61 74 2d 3e 73 74 5f 73 69 7a 65 29 3b 0a 20 20  at->st_size);.  
c2f0: 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
c300: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4d 65    if( strcmp(zMe
c310: 74 68 6f 64 2c 22 48 45 41 44 22 29 3d 3d 30 20  thod,"HEAD")==0 
c320: 29 7b 0a 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e  ){.    MakeLogEn
c330: 74 72 79 28 30 2c 20 32 29 3b 20 2f 2a 20 4c 4f  try(0, 2); /* LO
c340: 47 3a 20 4e 6f 72 6d 61 6c 20 48 45 41 44 20 72  G: Normal HEAD r
c350: 65 70 6c 79 20 2a 2f 0a 20 20 20 20 66 63 6c 6f  eply */.    fclo
c360: 73 65 28 69 6e 29 3b 0a 20 20 20 20 66 66 6c 75  se(in);.    fflu
c370: 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20  sh(stdout);.    
c380: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
c390: 69 66 28 20 75 73 65 54 69 6d 65 6f 75 74 20 29  if( useTimeout )
c3a0: 20 61 6c 61 72 6d 28 33 30 20 2b 20 70 53 74 61   alarm(30 + pSta
c3b0: 74 2d 3e 73 74 5f 73 69 7a 65 2f 31 30 30 30 29  t->st_size/1000)
c3c0: 3b 0a 23 69 66 64 65 66 20 6c 69 6e 75 78 0a 20  ;.#ifdef linux. 
c3d0: 20 7b 0a 20 20 20 20 6f 66 66 5f 74 20 6f 66 66   {.    off_t off
c3e0: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 6e 4f 75  set = 0;.    nOu
c3f0: 74 20 2b 3d 20 73 65 6e 64 66 69 6c 65 28 66 69  t += sendfile(fi
c400: 6c 65 6e 6f 28 73 74 64 6f 75 74 29 2c 20 66 69  leno(stdout), fi
c410: 6c 65 6e 6f 28 69 6e 29 2c 20 26 6f 66 66 73 65  leno(in), &offse
c420: 74 2c 20 70 53 74 61 74 2d 3e 73 74 5f 73 69 7a  t, pStat->st_siz
c430: 65 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20  e);.  }.#else.  
c440: 77 68 69 6c 65 28 20 28 63 20 3d 20 67 65 74 63  while( (c = getc
c450: 28 69 6e 29 29 21 3d 45 4f 46 20 29 7b 0a 20 20  (in))!=EOF ){.  
c460: 20 20 70 75 74 63 28 63 2c 73 74 64 6f 75 74 29    putc(c,stdout)
c470: 3b 0a 20 20 20 20 6e 4f 75 74 2b 2b 3b 0a 20 20  ;.    nOut++;.  
c480: 7d 0a 23 65 6e 64 69 66 0a 20 20 66 63 6c 6f 73  }.#endif.  fclos
c490: 65 28 69 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(in);.  return 
c4a0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 43 47  0;.}../*.** A CG
c4b0: 49 20 6f 72 20 53 43 47 49 20 73 63 72 69 70 74  I or SCGI script
c4c0: 20 68 61 73 20 72 75 6e 20 61 6e 64 20 69 73 20   has run and is 
c4d0: 73 65 6e 64 69 6e 67 20 69 74 73 20 72 65 70 6c  sending its repl
c4e0: 79 20 62 61 63 6b 20 61 63 72 6f 73 73 0a 2a 2a  y back across.**
c4f0: 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 22 69 6e   the channel "in
c500: 22 2e 20 20 50 72 6f 63 65 73 73 20 74 68 69 73  ".  Process this
c510: 20 72 65 70 6c 79 20 69 6e 74 6f 20 61 6e 20 61   reply into an a
c520: 70 70 72 6f 70 72 69 61 74 65 20 48 54 54 50 20  ppropriate HTTP 
c530: 72 65 70 6c 79 2e 0a 2a 2a 20 43 6c 6f 73 65 20  reply..** Close 
c540: 74 68 65 20 22 69 6e 22 20 63 68 61 6e 6e 65 6c  the "in" channel
c550: 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 2a 2f 0a 73   when done..*/.s
c560: 74 61 74 69 63 20 76 6f 69 64 20 43 67 69 48 61  tatic void CgiHa
c570: 6e 64 6c 65 52 65 70 6c 79 28 46 49 4c 45 20 2a  ndleReply(FILE *
c580: 69 6e 29 7b 0a 20 20 69 6e 74 20 73 65 65 6e 43  in){.  int seenC
c590: 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 20 3d 20 30  ontentLength = 0
c5a0: 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 43  ;   /* True if C
c5b0: 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74 68 3a 20 68  ontent-length: h
c5c0: 65 61 64 65 72 20 73 65 65 6e 20 2a 2f 0a 20 20  eader seen */.  
c5d0: 69 6e 74 20 63 6f 6e 74 65 6e 74 4c 65 6e 67 74  int contentLengt
c5e0: 68 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  h = 0;       /* 
c5f0: 54 68 65 20 63 6f 6e 74 65 6e 74 20 6c 65 6e 67  The content leng
c600: 74 68 20 2a 2f 0a 20 20 73 69 7a 65 5f 74 20 6e  th */.  size_t n
c610: 52 65 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Res = 0;        
c620: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
c630: 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 73 69   payload */.  si
c640: 7a 65 5f 74 20 6e 4d 61 6c 6c 6f 63 20 3d 20 30  ze_t nMalloc = 0
c650: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79  ;          /* By
c660: 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  tes of space all
c670: 6f 63 61 74 65 64 20 74 6f 20 61 52 65 73 20 2a  ocated to aRes *
c680: 2f 0a 20 20 63 68 61 72 20 2a 61 52 65 73 20 3d  /.  char *aRes =
c690: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
c6a0: 20 2f 2a 20 50 61 79 6c 6f 61 64 20 2a 2f 0a 20   /* Payload */. 
c6b0: 20 69 6e 74 20 63 3b 20 20 20 20 20 20 20 20 20   int c;         
c6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c6d0: 20 4e 65 78 74 20 63 68 61 72 61 63 74 65 72 20   Next character 
c6e0: 66 72 6f 6d 20 69 6e 20 2a 2f 0a 20 20 63 68 61  from in */.  cha
c6f0: 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20  r *z;           
c700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
c710: 6e 74 65 72 20 74 6f 20 73 6f 6d 65 74 68 69 6e  nter to somethin
c720: 67 20 69 6e 73 69 64 65 20 6f 66 20 7a 4c 69 6e  g inside of zLin
c730: 65 20 2a 2f 0a 20 20 63 68 61 72 20 7a 4c 69 6e  e */.  char zLin
c740: 65 5b 31 30 30 30 5d 3b 20 20 20 20 20 20 20 20  e[1000];        
c750: 20 20 20 20 2f 2a 20 4f 6e 65 20 6c 69 6e 65 20      /* One line 
c760: 6f 66 20 72 65 70 6c 79 20 66 72 6f 6d 20 74 68  of reply from th
c770: 65 20 43 47 49 20 73 63 72 69 70 74 20 2a 2f 0a  e CGI script */.
c780: 0a 20 20 69 66 28 20 75 73 65 54 69 6d 65 6f 75  .  if( useTimeou
c790: 74 20 29 20 61 6c 61 72 6d 28 31 35 29 3b 0a 20  t ) alarm(15);. 
c7a0: 20 77 68 69 6c 65 28 20 66 67 65 74 73 28 7a 4c   while( fgets(zL
c7b0: 69 6e 65 2c 73 69 7a 65 6f 66 28 7a 4c 69 6e 65  ine,sizeof(zLine
c7c0: 29 2c 69 6e 29 20 26 26 20 21 69 73 73 70 61 63  ),in) && !isspac
c7d0: 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e((unsigned char
c7e0: 29 7a 4c 69 6e 65 5b 30 5d 29 20 29 7b 0a 20 20  )zLine[0]) ){.  
c7f0: 20 20 69 66 28 20 73 74 72 6e 63 61 73 65 63 6d    if( strncasecm
c800: 70 28 7a 4c 69 6e 65 2c 22 4c 6f 63 61 74 69 6f  p(zLine,"Locatio
c810: 6e 3a 22 2c 39 29 3d 3d 30 20 29 7b 0a 20 20 20  n:",9)==0 ){.   
c820: 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65     StartResponse
c830: 28 22 33 30 32 20 52 65 64 69 72 65 63 74 22 29  ("302 Redirect")
c840: 3b 0a 20 20 20 20 20 20 52 65 6d 6f 76 65 4e 65  ;.      RemoveNe
c850: 77 6c 69 6e 65 28 7a 4c 69 6e 65 29 3b 0a 20 20  wline(zLine);.  
c860: 20 20 20 20 7a 20 3d 20 26 7a 4c 69 6e 65 5b 31      z = &zLine[1
c870: 30 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  0];.      while(
c880: 20 69 73 73 70 61 63 65 28 2a 28 75 6e 73 69 67   isspace(*(unsig
c890: 6e 65 64 20 63 68 61 72 2a 29 7a 29 20 29 7b 20  ned char*)z) ){ 
c8a0: 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 6e 4f 75  z++; }.      nOu
c8b0: 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 4c 6f 63  t += printf("Loc
c8c0: 61 74 69 6f 6e 3a 20 25 73 5c 72 5c 6e 22 2c 7a  ation: %s\r\n",z
c8d0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
c8e0: 20 73 74 72 6e 63 61 73 65 63 6d 70 28 7a 4c 69   strncasecmp(zLi
c8f0: 6e 65 2c 22 53 74 61 74 75 73 3a 22 2c 37 29 3d  ne,"Status:",7)=
c900: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
c910: 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 37  i;.      for(i=7
c920: 3b 20 69 73 73 70 61 63 65 28 28 75 6e 73 69 67  ; isspace((unsig
c930: 6e 65 64 20 63 68 61 72 29 7a 4c 69 6e 65 5b 69  ned char)zLine[i
c940: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20  ]); i++){}.     
c950: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
c960: 22 25 73 20 25 73 22 2c 20 7a 50 72 6f 74 6f 63  "%s %s", zProtoc
c970: 6f 6c 2c 20 26 7a 4c 69 6e 65 5b 69 5d 29 3b 0a  ol, &zLine[i]);.
c980: 20 20 20 20 20 20 73 74 72 6e 63 70 79 28 7a 52        strncpy(zR
c990: 65 70 6c 79 53 74 61 74 75 73 2c 20 26 7a 4c 69  eplyStatus, &zLi
c9a0: 6e 65 5b 69 5d 2c 20 33 29 3b 0a 20 20 20 20 20  ne[i], 3);.     
c9b0: 20 7a 52 65 70 6c 79 53 74 61 74 75 73 5b 33 5d   zReplyStatus[3]
c9c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61 74   = 0;.      stat
c9d0: 75 73 53 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20  usSent = 1;.    
c9e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
c9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca00: 20 2f 2a 20 20 31 32 33 34 35 36 37 38 39 20 31   /*  123456789 1
ca10: 32 33 34 35 20 2a 2f 0a 20 20 20 20 20 20 69 66  2345 */.      if
ca20: 28 20 73 74 72 6e 63 61 73 65 63 6d 70 28 7a 4c  ( strncasecmp(zL
ca30: 69 6e 65 2c 20 22 43 6f 6e 74 65 6e 74 2d 6c 65  ine, "Content-le
ca40: 6e 67 74 68 3a 22 2c 20 31 35 29 3d 3d 30 20 29  ngth:", 15)==0 )
ca50: 7b 0a 20 20 20 20 20 20 20 20 73 65 65 6e 43 6f  {.        seenCo
ca60: 6e 74 65 6e 74 4c 65 6e 67 74 68 20 3d 20 31 3b  ntentLength = 1;
ca70: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 6e 74  .        content
ca80: 4c 65 6e 67 74 68 20 3d 20 61 74 6f 69 28 7a 4c  Length = atoi(zL
ca90: 69 6e 65 2b 31 35 29 3b 0a 20 20 20 20 20 20 7d  ine+15);.      }
caa0: 0a 20 20 20 20 20 20 53 74 61 72 74 52 65 73 70  .      StartResp
cab0: 6f 6e 73 65 28 22 32 30 30 20 4f 4b 22 29 3b 0a  onse("200 OK");.
cac0: 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72        nOut += pr
cad0: 69 6e 74 66 28 22 25 73 22 2c 7a 4c 69 6e 65 29  intf("%s",zLine)
cae0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
caf0: 2a 20 43 6f 70 79 20 65 76 65 72 79 74 68 69 6e  * Copy everythin
cb00: 67 20 65 6c 73 65 20 74 68 72 75 20 77 69 74 68  g else thru with
cb10: 6f 75 74 20 63 68 61 6e 67 65 20 6f 72 20 61 6e  out change or an
cb20: 61 6c 79 73 69 73 2e 0a 20 20 2a 2f 0a 20 20 53  alysis..  */.  S
cb30: 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 32 30  tartResponse("20
cb40: 30 20 4f 4b 22 29 3b 0a 20 20 69 66 28 20 75 73  0 OK");.  if( us
cb50: 65 54 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d  eTimeout ) alarm
cb60: 28 36 30 2a 35 29 3b 0a 20 20 69 66 28 20 73 65  (60*5);.  if( se
cb70: 65 6e 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 20  enContentLength 
cb80: 29 7b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70  ){.    nOut += p
cb90: 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 4c 69 6e  rintf("%s", zLin
cba0: 65 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  e);.    while( (
cbb0: 63 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 2d 2d 29  contentLength--)
cbc0: 3e 30 20 26 26 20 28 63 20 3d 20 67 65 74 63 28  >0 && (c = getc(
cbd0: 69 6e 29 29 21 3d 45 4f 46 20 29 7b 0a 20 20 20  in))!=EOF ){.   
cbe0: 20 20 20 70 75 74 63 28 63 2c 73 74 64 6f 75 74     putc(c,stdout
cbf0: 29 3b 0a 20 20 20 20 20 20 6e 4f 75 74 2b 2b 3b  );.      nOut++;
cc00: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
cc10: 20 20 20 20 6e 52 65 73 20 3d 20 30 3b 0a 20 20      nRes = 0;.  
cc20: 20 20 6e 4d 61 6c 6c 6f 63 20 3d 20 31 30 30 30    nMalloc = 1000
cc30: 3b 0a 20 20 20 20 61 52 65 73 20 3d 20 6d 61 6c  ;.    aRes = mal
cc40: 6c 6f 63 28 6e 4d 61 6c 6c 6f 63 2b 31 29 3b 0a  loc(nMalloc+1);.
cc50: 20 20 20 20 69 66 28 20 61 52 65 73 3d 3d 30 20      if( aRes==0 
cc60: 29 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 36 30  ) Malfunction(60
cc70: 30 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  0,"Out of memory
cc80: 3a 20 25 64 20 62 79 74 65 73 22 2c 20 6e 4d 61  : %d bytes", nMa
cc90: 6c 6c 6f 63 29 3b 0a 20 20 20 20 77 68 69 6c 65  lloc);.    while
cca0: 28 20 28 63 20 3d 20 67 65 74 63 28 69 6e 29 29  ( (c = getc(in))
ccb0: 21 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20 20 69  !=EOF ){.      i
ccc0: 66 28 20 6e 52 65 73 3e 3d 6e 4d 61 6c 6c 6f 63  f( nRes>=nMalloc
ccd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4d 61 6c   ){.        nMal
cce0: 6c 6f 63 20 3d 20 6e 4d 61 6c 6c 6f 63 2a 32 3b  loc = nMalloc*2;
ccf0: 0a 20 20 20 20 20 20 20 20 61 52 65 73 20 3d 20  .        aRes = 
cd00: 72 65 61 6c 6c 6f 63 28 61 52 65 73 2c 20 6e 4d  realloc(aRes, nM
cd10: 61 6c 6c 6f 63 2b 31 29 3b 0a 20 20 20 20 20 20  alloc+1);.      
cd20: 20 20 69 66 28 20 61 52 65 73 3d 3d 30 20 29 7b    if( aRes==0 ){
cd30: 0a 20 20 20 20 20 20 20 20 20 20 20 4d 61 6c 66  .           Malf
cd40: 75 6e 63 74 69 6f 6e 28 36 31 30 2c 20 22 4f 75  unction(610, "Ou
cd50: 74 20 6f 66 20 6d 65 6d 6f 72 79 3a 20 25 64 20  t of memory: %d 
cd60: 62 79 74 65 73 22 2c 20 6e 4d 61 6c 6c 6f 63 29  bytes", nMalloc)
cd70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
cd80: 20 20 7d 0a 20 20 20 20 20 20 61 52 65 73 5b 6e    }.      aRes[n
cd90: 52 65 73 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20  Res++] = c;.    
cda0: 7d 0a 20 20 20 20 61 52 65 73 5b 6e 52 65 73 5d  }.    aRes[nRes]
cdb0: 20 3d 20 30 3b 0a 20 20 20 20 6e 4f 75 74 20 2b   = 0;.    nOut +
cdc0: 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 74 65 6e  = printf("Conten
cdd0: 74 2d 6c 65 6e 67 74 68 3a 20 25 64 5c 72 5c 6e  t-length: %d\r\n
cde0: 5c 72 5c 6e 25 73 22 2c 20 28 69 6e 74 29 6e 52  \r\n%s", (int)nR
cdf0: 65 73 2c 20 61 52 65 73 29 3b 0a 20 20 20 20 66  es, aRes);.    f
ce00: 72 65 65 28 61 52 65 73 29 3b 0a 20 20 7d 0a 20  ree(aRes);.  }. 
ce10: 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 7d 0a 0a   fclose(in);.}..
ce20: 2f 2a 0a 2a 2a 20 53 65 6e 64 20 61 6e 20 53 43  /*.** Send an SC
ce30: 47 49 20 72 65 71 75 65 73 74 20 74 6f 20 61 20  GI request to a 
ce40: 68 6f 73 74 20 69 64 65 6e 74 69 66 69 65 64 20  host identified 
ce50: 62 79 20 7a 46 69 6c 65 20 61 6e 64 20 70 72 6f  by zFile and pro
ce60: 63 65 73 73 20 74 68 65 0a 2a 2a 20 72 65 70 6c  cess the.** repl
ce70: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
ce80: 64 20 53 65 6e 64 53 63 67 69 52 65 71 75 65 73  d SendScgiReques
ce90: 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  t(const char *zF
cea0: 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ile, const char 
ceb0: 2a 7a 53 63 72 69 70 74 29 7b 0a 20 20 46 49 4c  *zScript){.  FIL
cec0: 45 20 2a 69 6e 3b 0a 20 20 46 49 4c 45 20 2a 73  E *in;.  FILE *s
ced0: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63  ;.  char *z;.  c
cee0: 68 61 72 20 2a 7a 48 6f 73 74 3b 0a 20 20 63 68  har *zHost;.  ch
cef0: 61 72 20 2a 7a 50 6f 72 74 20 3d 20 30 3b 0a 20  ar *zPort = 0;. 
cf00: 20 63 68 61 72 20 2a 7a 52 65 6c 69 67 68 74 20   char *zRelight 
cf10: 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 46 61  = 0;.  char *zFa
cf20: 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 69 6e  llback = 0;.  in
cf30: 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 53 6f 63  t rc;.  int iSoc
cf40: 6b 65 74 20 3d 20 2d 31 3b 0a 20 20 73 74 72 75  ket = -1;.  stru
cf50: 63 74 20 61 64 64 72 69 6e 66 6f 20 68 69 6e 74  ct addrinfo hint
cf60: 73 3b 0a 20 20 73 74 72 75 63 74 20 61 64 64 72  s;.  struct addr
cf70: 69 6e 66 6f 20 2a 61 69 20 3d 20 30 3b 0a 20 20  info *ai = 0;.  
cf80: 73 74 72 75 63 74 20 61 64 64 72 69 6e 66 6f 20  struct addrinfo 
cf90: 2a 70 3b 0a 20 20 63 68 61 72 20 2a 7a 48 64 72  *p;.  char *zHdr
cfa0: 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 48 64 72 20  ;.  size_t nHdr 
cfb0: 3d 20 30 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 48  = 0;.  size_t nH
cfc0: 64 72 41 6c 6c 6f 63 3b 0a 20 20 69 6e 74 20 69  drAlloc;.  int i
cfd0: 3b 0a 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b 31  ;.  char zLine[1
cfe0: 30 30 30 5d 3b 0a 20 20 63 68 61 72 20 7a 45 78  000];.  char zEx
cff0: 74 72 61 5b 31 30 30 30 5d 3b 0a 20 20 69 6e 20  tra[1000];.  in 
d000: 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22  = fopen(zFile, "
d010: 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d  rb");.  if( in==
d020: 30 20 29 7b 0a 20 20 20 20 4d 61 6c 66 75 6e 63  0 ){.    Malfunc
d030: 74 69 6f 6e 28 37 30 30 2c 20 22 63 61 6e 6e 6f  tion(700, "canno
d040: 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22  t open \"%s\"\n"
d050: 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20  , zFile);.  }.  
d060: 69 66 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c  if( fgets(zLine,
d070: 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2d 31   sizeof(zLine)-1
d080: 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , in)==0 ){.    
d090: 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 37 30 31 2c  Malfunction(701,
d0a0: 20 22 63 61 6e 6e 6f 74 20 72 65 61 64 20 5c 22   "cannot read \"
d0b0: 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b  %s\"\n", zFile);
d0c0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72 6e 63  .  }.  if( strnc
d0d0: 6d 70 28 7a 4c 69 6e 65 2c 22 53 43 47 49 20 22  mp(zLine,"SCGI "
d0e0: 2c 35 29 21 3d 30 20 29 7b 0a 20 20 20 20 4d 61  ,5)!=0 ){.    Ma
d0f0: 6c 66 75 6e 63 74 69 6f 6e 28 37 30 32 2c 20 22  lfunction(702, "
d100: 6d 69 73 66 6f 72 6d 61 74 74 65 64 20 53 43 47  misformatted SCG
d110: 49 20 73 70 65 63 20 5c 22 25 73 5c 22 5c 6e 22  I spec \"%s\"\n"
d120: 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20  , zFile);.  }.  
d130: 7a 20 3d 20 7a 4c 69 6e 65 2b 35 3b 0a 20 20 7a  z = zLine+5;.  z
d140: 48 6f 73 74 20 3d 20 47 65 74 46 69 72 73 74 45  Host = GetFirstE
d150: 6c 65 6d 65 6e 74 28 7a 2c 26 7a 29 3b 0a 20 20  lement(z,&z);.  
d160: 7a 50 6f 72 74 20 3d 20 47 65 74 46 69 72 73 74  zPort = GetFirst
d170: 45 6c 65 6d 65 6e 74 28 7a 2c 30 29 3b 0a 20 20  Element(z,0);.  
d180: 69 66 28 20 7a 48 6f 73 74 3d 3d 30 20 7c 7c 20  if( zHost==0 || 
d190: 7a 48 6f 73 74 5b 30 5d 3d 3d 30 20 7c 7c 20 7a  zHost[0]==0 || z
d1a0: 50 6f 72 74 3d 3d 30 20 7c 7c 20 7a 50 6f 72 74  Port==0 || zPort
d1b0: 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 4d 61  [0]==0 ){.    Ma
d1c0: 6c 66 75 6e 63 74 69 6f 6e 28 37 30 33 2c 20 22  lfunction(703, "
d1d0: 6d 69 73 66 6f 72 6d 61 74 74 65 64 20 53 43 47  misformatted SCG
d1e0: 49 20 73 70 65 63 20 5c 22 25 73 5c 22 5c 6e 22  I spec \"%s\"\n"
d1f0: 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20  , zFile);.  }.  
d200: 77 68 69 6c 65 28 20 66 67 65 74 73 28 7a 45 78  while( fgets(zEx
d210: 74 72 61 2c 20 73 69 7a 65 6f 66 28 7a 45 78 74  tra, sizeof(zExt
d220: 72 61 29 2d 31 2c 20 69 6e 29 20 29 7b 0a 20 20  ra)-1, in) ){.  
d230: 20 20 63 68 61 72 20 2a 7a 43 6d 64 20 3d 20 47    char *zCmd = G
d240: 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a  etFirstElement(z
d250: 45 78 74 72 61 2c 26 7a 29 3b 0a 20 20 20 20 69  Extra,&z);.    i
d260: 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20 63 6f 6e  f( zCmd==0 ) con
d270: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 7a  tinue;.    if( z
d280: 43 6d 64 5b 30 5d 3d 3d 27 23 27 20 29 20 63 6f  Cmd[0]=='#' ) co
d290: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 52 65 6d 6f  ntinue;.    Remo
d2a0: 76 65 4e 65 77 6c 69 6e 65 28 7a 29 3b 0a 20 20  veNewline(z);.  
d2b0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d    if( strcmp(zCm
d2c0: 64 2c 20 22 72 65 6c 69 67 68 74 3a 22 29 3d 3d  d, "relight:")==
d2d0: 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28  0 ){.      free(
d2e0: 7a 52 65 6c 69 67 68 74 29 3b 0a 20 20 20 20 20  zRelight);.     
d2f0: 20 7a 52 65 6c 69 67 68 74 20 3d 20 53 74 72 44   zRelight = StrD
d300: 75 70 28 7a 29 3b 0a 20 20 20 20 20 20 63 6f 6e  up(z);.      con
d310: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
d320: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
d330: 2c 20 22 66 61 6c 6c 62 61 63 6b 3a 22 29 3d 3d  , "fallback:")==
d340: 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28  0 ){.      free(
d350: 7a 46 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  zFallback);.    
d360: 20 20 7a 46 61 6c 6c 62 61 63 6b 20 3d 20 53 74    zFallback = St
d370: 72 44 75 70 28 7a 29 3b 0a 20 20 20 20 20 20 63  rDup(z);.      c
d380: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
d390: 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 37     Malfunction(7
d3a0: 30 34 2c 20 22 75 6e 72 65 63 6f 67 6e 69 7a 65  04, "unrecognize
d3b0: 64 20 6c 69 6e 65 20 69 6e 20 53 43 47 49 20 73  d line in SCGI s
d3c0: 70 65 63 3a 20 5c 22 25 73 20 25 73 5c 22 5c 6e  pec: \"%s %s\"\n
d3d0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
d3e0: 20 20 20 7a 43 6d 64 2c 20 7a 20 3f 20 7a 20 3a     zCmd, z ? z :
d3f0: 20 22 22 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f   "");.  }.  fclo
d400: 73 65 28 69 6e 29 3b 0a 20 20 6d 65 6d 73 65 74  se(in);.  memset
d410: 28 26 68 69 6e 74 73 2c 20 30 2c 20 73 69 7a 65  (&hints, 0, size
d420: 6f 66 28 73 74 72 75 63 74 20 61 64 64 72 69 6e  of(struct addrin
d430: 66 6f 29 29 3b 0a 20 20 68 69 6e 74 73 2e 61 69  fo));.  hints.ai
d440: 5f 66 61 6d 69 6c 79 20 3d 20 41 46 5f 55 4e 53  _family = AF_UNS
d450: 50 45 43 3b 0a 20 20 68 69 6e 74 73 2e 61 69 5f  PEC;.  hints.ai_
d460: 73 6f 63 6b 74 79 70 65 20 3d 20 53 4f 43 4b 5f  socktype = SOCK_
d470: 53 54 52 45 41 4d 3b 0a 20 20 68 69 6e 74 73 2e  STREAM;.  hints.
d480: 61 69 5f 70 72 6f 74 6f 63 6f 6c 20 3d 20 49 50  ai_protocol = IP
d490: 50 52 4f 54 4f 5f 54 43 50 3b 0a 20 20 72 63 20  PROTO_TCP;.  rc 
d4a0: 3d 20 67 65 74 61 64 64 72 69 6e 66 6f 28 7a 48  = getaddrinfo(zH
d4b0: 6f 73 74 2c 7a 50 6f 72 74 2c 26 68 69 6e 74 73  ost,zPort,&hints
d4c0: 2c 26 61 69 29 3b 0a 20 20 69 66 28 20 72 63 20  ,&ai);.  if( rc 
d4d0: 29 7b 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69  ){.    Malfuncti
d4e0: 6f 6e 28 37 30 34 2c 20 22 63 61 6e 6e 6f 74 20  on(704, "cannot 
d4f0: 72 65 73 6f 6c 76 65 20 53 43 47 49 20 73 65 72  resolve SCGI ser
d500: 76 65 72 20 6e 61 6d 65 20 25 73 3a 25 73 5c 6e  ver name %s:%s\n
d510: 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
d520: 20 20 20 20 20 20 20 7a 48 6f 73 74 2c 20 7a 50         zHost, zP
d530: 6f 72 74 2c 20 67 61 69 5f 73 74 72 65 72 72 6f  ort, gai_strerro
d540: 72 28 72 63 29 29 3b 0a 20 20 7d 0a 20 20 77 68  r(rc));.  }.  wh
d550: 69 6c 65 28 31 29 7b 20 20 2f 2a 20 45 78 69 74  ile(1){  /* Exit
d560: 20 76 69 61 20 62 72 65 61 6b 20 2a 2f 0a 20 20   via break */.  
d570: 20 20 66 6f 72 28 70 3d 61 69 3b 20 70 3b 20 70    for(p=ai; p; p
d580: 3d 70 2d 3e 61 69 5f 6e 65 78 74 29 7b 0a 20 20  =p->ai_next){.  
d590: 20 20 20 20 69 53 6f 63 6b 65 74 20 3d 20 73 6f      iSocket = so
d5a0: 63 6b 65 74 28 70 2d 3e 61 69 5f 66 61 6d 69 6c  cket(p->ai_famil
d5b0: 79 2c 20 70 2d 3e 61 69 5f 73 6f 63 6b 74 79 70  y, p->ai_socktyp
d5c0: 65 2c 20 70 2d 3e 61 69 5f 70 72 6f 74 6f 63 6f  e, p->ai_protoco
d5d0: 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 53  l);.      if( iS
d5e0: 6f 63 6b 65 74 3c 30 20 29 20 63 6f 6e 74 69 6e  ocket<0 ) contin
d5f0: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f  ue;.      if( co
d600: 6e 6e 65 63 74 28 69 53 6f 63 6b 65 74 2c 70 2d  nnect(iSocket,p-
d610: 3e 61 69 5f 61 64 64 72 2c 70 2d 3e 61 69 5f 61  >ai_addr,p->ai_a
d620: 64 64 72 6c 65 6e 29 3e 3d 30 20 29 20 62 72 65  ddrlen)>=0 ) bre
d630: 61 6b 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28  ak;.      close(
d640: 69 53 6f 63 6b 65 74 29 3b 0a 20 20 20 20 7d 0a  iSocket);.    }.
d650: 20 20 20 20 69 66 28 20 69 53 6f 63 6b 65 74 3c      if( iSocket<
d660: 30 20 7c 7c 20 28 73 20 3d 20 66 64 6f 70 65 6e  0 || (s = fdopen
d670: 28 69 53 6f 63 6b 65 74 2c 22 72 2b 22 29 29 3d  (iSocket,"r+"))=
d680: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
d690: 69 53 6f 63 6b 65 74 3e 3d 30 20 29 20 63 6c 6f  iSocket>=0 ) clo
d6a0: 73 65 28 69 53 6f 63 6b 65 74 29 3b 0a 20 20 20  se(iSocket);.   
d6b0: 20 20 20 69 66 28 20 7a 52 65 6c 69 67 68 74 20     if( zRelight 
d6c0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
d6d0: 73 79 73 74 65 6d 28 7a 52 65 6c 69 67 68 74 29  system(zRelight)
d6e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
d6f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 4d 61   ){.          Ma
d700: 6c 66 75 6e 63 74 69 6f 6e 28 37 32 31 2c 22 52  lfunction(721,"R
d710: 65 6c 69 67 68 74 20 66 61 69 6c 65 64 20 77 69  elight failed wi
d720: 74 68 20 25 64 3a 20 5c 22 25 73 5c 22 5c 6e 22  th %d: \"%s\"\n"
d730: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d740: 20 20 20 20 20 20 20 20 72 63 2c 20 7a 52 65 6c          rc, zRel
d750: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  ight);.        }
d760: 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 52  .        free(zR
d770: 65 6c 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  elight);.       
d780: 20 7a 52 65 6c 69 67 68 74 20 3d 20 30 3b 0a 20   zRelight = 0;. 
d790: 20 20 20 20 20 20 20 73 6c 65 65 70 28 31 29 3b         sleep(1);
d7a0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
d7b0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
d7c0: 20 69 66 28 20 7a 46 61 6c 6c 62 61 63 6b 20 29   if( zFallback )
d7d0: 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
d7e0: 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 0a 20   stat statbuf;. 
d7f0: 20 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20         int rc;. 
d800: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73         memset(&s
d810: 74 61 74 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f  tatbuf, 0, sizeo
d820: 66 28 73 74 61 74 62 75 66 29 29 3b 0a 20 20 20  f(statbuf));.   
d830: 20 20 20 20 20 69 66 28 20 63 68 64 69 72 28 7a       if( chdir(z
d840: 44 69 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Dir) ){.        
d850: 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30    char zBuf[1000
d860: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 4d 61 6c  ];.          Mal
d870: 66 75 6e 63 74 69 6f 6e 28 37 32 30 2c 20 2f 2a  function(720, /*
d880: 20 4c 4f 47 3a 20 63 68 64 69 72 28 29 20 66 61   LOG: chdir() fa
d890: 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  iled */.        
d8a0: 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63         "cannot c
d8b0: 68 64 69 72 20 74 6f 20 5b 25 73 5d 20 66 72 6f  hdir to [%s] fro
d8c0: 6d 20 5b 25 73 5d 22 2c 20 0a 20 20 20 20 20 20  m [%s]", .      
d8d0: 20 20 20 20 20 20 20 20 20 7a 44 69 72 2c 20 67           zDir, g
d8e0: 65 74 63 77 64 28 7a 42 75 66 2c 39 39 39 29 29  etcwd(zBuf,999))
d8f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d900: 20 20 20 20 72 63 20 3d 20 73 74 61 74 28 7a 46      rc = stat(zF
d910: 61 6c 6c 62 61 63 6b 2c 20 26 73 74 61 74 62 75  allback, &statbu
d920: 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  f);.        if( 
d930: 72 63 3d 3d 30 20 26 26 20 53 5f 49 53 52 45 47  rc==0 && S_ISREG
d940: 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65  (statbuf.st_mode
d950: 29 20 26 26 20 61 63 63 65 73 73 28 7a 46 61 6c  ) && access(zFal
d960: 6c 62 61 63 6b 2c 52 5f 4f 4b 29 3d 3d 30 20 29  lback,R_OK)==0 )
d970: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  {.          clos
d980: 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 31 3b  eConnection = 1;
d990: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
d9a0: 53 65 6e 64 46 69 6c 65 28 7a 46 61 6c 6c 62 61  SendFile(zFallba
d9b0: 63 6b 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  ck, (int)strlen(
d9c0: 7a 46 61 6c 6c 62 61 63 6b 29 2c 20 26 73 74 61  zFallback), &sta
d9d0: 74 62 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20  tbuf);.         
d9e0: 20 66 72 65 65 28 7a 46 61 6c 6c 62 61 63 6b 29   free(zFallback)
d9f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 69 74  ;.          exit
da00: 28 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  (0);.        }el
da10: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 4d 61  se{.          Ma
da20: 6c 66 75 6e 63 74 69 6f 6e 28 37 30 36 2c 20 22  lfunction(706, "
da30: 62 61 64 20 66 61 6c 6c 62 61 63 6b 20 66 69 6c  bad fallback fil
da40: 65 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46  e: \"%s\"\n", zF
da50: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20  allback);.      
da60: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
da70: 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 37 30    Malfunction(70
da80: 37 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  7, "cannot open 
da90: 73 6f 63 6b 65 74 20 74 6f 20 53 43 47 49 20 73  socket to SCGI s
daa0: 65 72 76 65 72 20 25 73 5c 6e 22 2c 0a 20 20 20  erver %s\n",.   
dab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
dac0: 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 20  Script);.    }. 
dad0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
dae0: 20 6e 48 64 72 41 6c 6c 6f 63 20 3d 20 30 3b 0a   nHdrAlloc = 0;.
daf0: 20 20 7a 48 64 72 20 3d 20 30 3b 0a 20 20 69 66    zHdr = 0;.  if
db00: 28 20 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68  ( zContentLength
db10: 3d 3d 30 20 29 20 7a 43 6f 6e 74 65 6e 74 4c 65  ==0 ) zContentLe
db20: 6e 67 74 68 20 3d 20 22 30 22 3b 0a 20 20 7a 53  ngth = "0";.  zS
db30: 63 67 69 20 3d 20 22 31 22 3b 0a 20 20 66 6f 72  cgi = "1";.  for
db40: 28 69 3d 30 3b 20 69 3c 28 69 6e 74 29 28 73 69  (i=0; i<(int)(si
db50: 7a 65 6f 66 28 63 67 69 65 6e 76 29 2f 73 69 7a  zeof(cgienv)/siz
db60: 65 6f 66 28 63 67 69 65 6e 76 5b 30 5d 29 29 3b  eof(cgienv[0]));
db70: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e   i++){.    int n
db80: 31 2c 20 6e 32 3b 0a 20 20 20 20 69 66 28 20 63  1, n2;.    if( c
db90: 67 69 65 6e 76 5b 69 5d 2e 70 7a 45 6e 76 56 61  gienv[i].pzEnvVa
dba0: 6c 75 65 5b 30 5d 3d 3d 30 20 29 20 63 6f 6e 74  lue[0]==0 ) cont
dbb0: 69 6e 75 65 3b 0a 20 20 20 20 6e 31 20 3d 20 28  inue;.    n1 = (
dbc0: 69 6e 74 29 73 74 72 6c 65 6e 28 63 67 69 65 6e  int)strlen(cgien
dbd0: 76 5b 69 5d 2e 7a 45 6e 76 4e 61 6d 65 29 3b 0a  v[i].zEnvName);.
dbe0: 20 20 20 20 6e 32 20 3d 20 28 69 6e 74 29 73 74      n2 = (int)st
dbf0: 72 6c 65 6e 28 2a 63 67 69 65 6e 76 5b 69 5d 2e  rlen(*cgienv[i].
dc00: 70 7a 45 6e 76 56 61 6c 75 65 29 3b 0a 20 20 20  pzEnvValue);.   
dc10: 20 69 66 28 20 6e 31 2b 6e 32 2b 32 2b 6e 48 64   if( n1+n2+2+nHd
dc20: 72 20 3e 3d 20 6e 48 64 72 41 6c 6c 6f 63 20 29  r >= nHdrAlloc )
dc30: 7b 0a 20 20 20 20 20 20 6e 48 64 72 41 6c 6c 6f  {.      nHdrAllo
dc40: 63 20 3d 20 6e 48 64 72 20 2b 20 6e 31 20 2b 20  c = nHdr + n1 + 
dc50: 6e 32 20 2b 20 31 30 30 30 3b 0a 20 20 20 20 20  n2 + 1000;.     
dc60: 20 7a 48 64 72 20 3d 20 72 65 61 6c 6c 6f 63 28   zHdr = realloc(
dc70: 7a 48 64 72 2c 20 6e 48 64 72 41 6c 6c 6f 63 29  zHdr, nHdrAlloc)
dc80: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 48 64 72  ;.      if( zHdr
dc90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4d  ==0 ){.        M
dca0: 61 6c 66 75 6e 63 74 69 6f 6e 28 37 30 36 2c 20  alfunction(706, 
dcb0: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29  "out of memory")
dcc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dcd0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 64 72 2b      memcpy(zHdr+
dce0: 6e 48 64 72 2c 20 63 67 69 65 6e 76 5b 69 5d 2e  nHdr, cgienv[i].
dcf0: 7a 45 6e 76 4e 61 6d 65 2c 20 6e 31 29 3b 0a 20  zEnvName, n1);. 
dd00: 20 20 20 6e 48 64 72 20 2b 3d 20 6e 31 3b 0a 20     nHdr += n1;. 
dd10: 20 20 20 7a 48 64 72 5b 6e 48 64 72 2b 2b 5d 20     zHdr[nHdr++] 
dd20: 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  = 0;.    memcpy(
dd30: 7a 48 64 72 2b 6e 48 64 72 2c 20 2a 63 67 69 65  zHdr+nHdr, *cgie
dd40: 6e 76 5b 69 5d 2e 70 7a 45 6e 76 56 61 6c 75 65  nv[i].pzEnvValue
dd50: 2c 20 6e 32 29 3b 0a 20 20 20 20 6e 48 64 72 20  , n2);.    nHdr 
dd60: 2b 3d 20 6e 32 3b 0a 20 20 20 20 7a 48 64 72 5b  += n2;.    zHdr[
dd70: 6e 48 64 72 2b 2b 5d 20 3d 20 30 3b 0a 20 20 7d  nHdr++] = 0;.  }
dd80: 0a 20 20 7a 53 63 67 69 20 3d 20 30 3b 0a 20 20  .  zScgi = 0;.  
dd90: 66 70 72 69 6e 74 66 28 73 2c 22 25 64 3a 22 2c  fprintf(s,"%d:",
dda0: 28 69 6e 74 29 6e 48 64 72 29 3b 0a 20 20 66 77  (int)nHdr);.  fw
ddb0: 72 69 74 65 28 7a 48 64 72 2c 20 31 2c 20 6e 48  rite(zHdr, 1, nH
ddc0: 64 72 2c 20 73 29 3b 0a 20 20 66 70 72 69 6e 74  dr, s);.  fprint
ddd0: 66 28 73 2c 22 2c 22 29 3b 0a 20 20 66 72 65 65  f(s,",");.  free
dde0: 28 7a 48 64 72 29 3b 0a 20 20 69 66 28 20 7a 4d  (zHdr);.  if( zM
ddf0: 65 74 68 6f 64 5b 30 5d 3d 3d 27 50 27 0a 20 20  ethod[0]=='P'.  
de00: 20 26 26 20 61 74 6f 69 28 7a 43 6f 6e 74 65 6e   && atoi(zConten
de10: 74 4c 65 6e 67 74 68 29 3e 30 20 0a 20 20 20 26  tLength)>0 .   &
de20: 26 20 28 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 54  & (in = fopen(zT
de30: 6d 70 4e 61 6d 2c 22 72 22 29 29 21 3d 30 20 29  mpNam,"r"))!=0 )
de40: 7b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 3b 0a  {.    size_t n;.
de50: 20 20 20 20 77 68 69 6c 65 28 20 28 6e 20 3d 20      while( (n = 
de60: 66 72 65 61 64 28 7a 4c 69 6e 65 2c 31 2c 73 69  fread(zLine,1,si
de70: 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 69 6e 29 29  zeof(zLine),in))
de80: 3e 30 20 29 7b 0a 20 20 20 20 20 20 66 77 72 69  >0 ){.      fwri
de90: 74 65 28 7a 4c 69 6e 65 2c 20 31 2c 20 6e 2c 20  te(zLine, 1, n, 
dea0: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 63  s);.    }.    fc
deb0: 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 7d 0a 20 20  lose(in);.  }.  
dec0: 66 66 6c 75 73 68 28 73 29 3b 0a 20 20 43 67 69  fflush(s);.  Cgi
ded0: 48 61 6e 64 6c 65 52 65 70 6c 79 28 73 29 3b 0a  HandleReply(s);.
dee0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
def0: 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20  utine processes 
df00: 61 20 73 69 6e 67 6c 65 20 48 54 54 50 20 72 65  a single HTTP re
df10: 71 75 65 73 74 20 6f 6e 20 73 74 61 6e 64 61 72  quest on standar
df20: 64 20 69 6e 70 75 74 20 61 6e 64 0a 2a 2a 20 73  d input and.** s
df30: 65 6e 64 73 20 74 68 65 20 72 65 70 6c 79 20 74  ends the reply t
df40: 6f 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75  o standard outpu
df50: 74 2e 20 20 49 66 20 74 68 65 20 61 72 67 75 6d  t.  If the argum
df60: 65 6e 74 20 69 73 20 31 20 69 74 20 6d 65 61 6e  ent is 1 it mean
df70: 73 0a 2a 2a 20 74 68 61 74 20 77 65 20 61 72 65  s.** that we are
df80: 20 73 68 6f 75 6c 64 20 63 6c 6f 73 65 20 74 68   should close th
df90: 65 20 73 6f 63 6b 65 74 20 77 69 74 68 6f 75 74  e socket without
dfa0: 20 70 72 6f 63 65 73 73 69 6e 67 20 61 64 64 69   processing addi
dfb0: 74 69 6f 6e 61 6c 0a 2a 2a 20 48 54 54 50 20 72  tional.** HTTP r
dfc0: 65 71 75 65 73 74 73 20 61 66 74 65 72 20 74 68  equests after th
dfd0: 65 20 63 75 72 72 65 6e 74 20 72 65 71 75 65 73  e current reques
dfe0: 74 20 66 69 6e 69 73 68 65 73 2e 20 20 30 20 6d  t finishes.  0 m
dff0: 65 61 6e 73 20 77 65 20 61 72 65 0a 2a 2a 20 61  eans we are.** a
e000: 6c 6c 6f 77 65 64 20 74 6f 20 6b 65 65 70 20 74  llowed to keep t
e010: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70  he connection op
e020: 65 6e 20 61 6e 64 20 74 6f 20 70 72 6f 63 65 73  en and to proces
e030: 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 72 65 71  s additional req
e040: 75 65 73 74 73 2e 0a 2a 2a 20 54 68 69 73 20 72  uests..** This r
e050: 6f 75 74 69 6e 65 20 6d 61 79 20 63 68 6f 6f 73  outine may choos
e060: 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 63  e to close the c
e070: 6f 6e 6e 65 63 74 69 6f 6e 20 65 76 65 6e 20 69  onnection even i
e080: 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 0a 2a  f the argument.*
e090: 2a 20 69 73 20 30 2e 0a 2a 2a 20 0a 2a 2a 20 49  * is 0..** .** I
e0a0: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
e0b0: 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65   should be close
e0c0: 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
e0d0: 63 61 6c 6c 73 20 65 78 69 74 28 29 20 61 6e 64  calls exit() and
e0e0: 0a 2a 2a 20 74 68 75 73 20 6e 65 76 65 72 20 72  .** thus never r
e0f0: 65 74 75 72 6e 73 2e 20 20 49 66 20 74 68 69 73  eturns.  If this
e100: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 72 65   routine does re
e110: 74 75 72 6e 20 69 74 20 6d 65 61 6e 73 20 74 68  turn it means th
e120: 61 74 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 48 54  at another.** HT
e130: 54 50 20 72 65 71 75 65 73 74 20 6d 61 79 20 61  TP request may a
e140: 70 70 65 61 72 20 6f 6e 20 74 68 65 20 77 69 72  ppear on the wir
e150: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 50 72 6f 63 65  e..*/.void Proce
e160: 73 73 4f 6e 65 52 65 71 75 65 73 74 28 69 6e 74  ssOneRequest(int
e170: 20 66 6f 72 63 65 43 6c 6f 73 65 29 7b 0a 20 20   forceClose){.  
e180: 69 6e 74 20 69 2c 20 6a 2c 20 6a 30 2c 20 63 3b  int i, j, j0, c;
e190: 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
e1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e1b0: 55 73 65 64 20 74 6f 20 70 61 72 73 65 20 75 70  Used to parse up
e1c0: 20 61 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 73   a string */.  s
e1d0: 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62  truct stat statb
e1e0: 75 66 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f  uf;      /* Info
e1f0: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
e200: 65 20 66 69 6c 65 20 74 6f 20 62 65 20 72 65 74  e file to be ret
e210: 72 69 65 76 65 64 20 2a 2f 0a 20 20 46 49 4c 45  rieved */.  FILE
e220: 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20   *in;           
e230: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 72 65 61        /* For rea
e240: 64 69 6e 67 20 66 72 6f 6d 20 43 47 49 20 73 63  ding from CGI sc
e250: 72 69 70 74 73 20 2a 2f 0a 23 69 66 64 65 66 20  ripts */.#ifdef 
e260: 4c 4f 47 5f 48 45 41 44 45 52 0a 20 20 46 49 4c  LOG_HEADER.  FIL
e270: 45 20 2a 68 64 72 4c 6f 67 20 3d 20 30 3b 20 20  E *hdrLog = 0;  
e280: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 66 69         /* Log fi
e290: 6c 65 20 66 6f 72 20 63 6f 6d 70 6c 65 74 65 20  le for complete 
e2a0: 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a  header content *
e2b0: 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20  /.#endif.  char 
e2c0: 7a 4c 69 6e 65 5b 31 30 30 30 5d 3b 20 20 20 20  zLine[1000];    
e2d0: 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72       /* A buffer
e2e0: 20 66 6f 72 20 69 6e 70 75 74 20 6c 69 6e 65 73   for input lines
e2f0: 20 6f 72 20 66 6f 72 6d 69 6e 67 20 6e 61 6d 65   or forming name
e300: 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 61 6e 67  s */..  /* Chang
e310: 65 20 64 69 72 65 63 74 6f 72 69 65 73 20 74 6f  e directories to
e320: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
e330: 20 48 54 54 50 20 66 69 6c 65 73 79 73 74 65 6d   HTTP filesystem
e340: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 64 69  .  */.  if( chdi
e350: 72 28 7a 52 6f 6f 74 5b 30 5d 20 3f 20 7a 52 6f  r(zRoot[0] ? zRo
e360: 6f 74 20 3a 20 22 2f 22 29 21 3d 30 20 29 7b 0a  ot : "/")!=0 ){.
e370: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30      char zBuf[10
e380: 30 30 5d 3b 0a 20 20 20 20 4d 61 6c 66 75 6e 63  00];.    Malfunc
e390: 74 69 6f 6e 28 31 39 30 2c 20 20 20 2f 2a 20 4c  tion(190,   /* L
e3a0: 4f 47 3a 20 63 68 64 69 72 28 29 20 66 61 69 6c  OG: chdir() fail
e3b0: 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 22  ed */.         "
e3c0: 63 61 6e 6e 6f 74 20 63 68 64 69 72 20 74 6f 20  cannot chdir to 
e3d0: 5b 25 73 5d 20 66 72 6f 6d 20 5b 25 73 5d 22 2c  [%s] from [%s]",
e3e0: 0a 20 20 20 20 20 20 20 20 20 7a 52 6f 6f 74 2c  .         zRoot,
e3f0: 20 67 65 74 63 77 64 28 7a 42 75 66 2c 39 39 39   getcwd(zBuf,999
e400: 29 29 3b 0a 20 20 7d 0a 20 20 6e 52 65 71 75 65  ));.  }.  nReque
e410: 73 74 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  st++;..  /*.  **
e420: 20 57 65 20 6d 75 73 74 20 72 65 63 65 69 76 65   We must receive
e430: 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64   a complete head
e440: 65 72 20 77 69 74 68 69 6e 20 31 35 20 73 65 63  er within 15 sec
e450: 6f 6e 64 73 0a 20 20 2a 2f 0a 20 20 73 69 67 6e  onds.  */.  sign
e460: 61 6c 28 53 49 47 41 4c 52 4d 2c 20 54 69 6d 65  al(SIGALRM, Time
e470: 6f 75 74 29 3b 0a 20 20 73 69 67 6e 61 6c 28 53  out);.  signal(S
e480: 49 47 53 45 47 56 2c 20 54 69 6d 65 6f 75 74 29  IGSEGV, Timeout)
e490: 3b 0a 20 20 73 69 67 6e 61 6c 28 53 49 47 50 49  ;.  signal(SIGPI
e4a0: 50 45 2c 20 54 69 6d 65 6f 75 74 29 3b 0a 20 20  PE, Timeout);.  
e4b0: 69 66 28 20 75 73 65 54 69 6d 65 6f 75 74 20 29  if( useTimeout )
e4c0: 20 61 6c 61 72 6d 28 31 35 29 3b 0a 0a 20 20 2f   alarm(15);..  /
e4d0: 2a 20 47 65 74 20 74 68 65 20 66 69 72 73 74 20  * Get the first 
e4e0: 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65 71 75  line of the requ
e4f0: 65 73 74 20 61 6e 64 20 70 61 72 73 65 20 6f 75  est and parse ou
e500: 74 20 74 68 65 0a 20 20 2a 2a 20 6d 65 74 68 6f  t the.  ** metho
e510: 64 2c 20 74 68 65 20 73 63 72 69 70 74 20 61 6e  d, the script an
e520: 64 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2e 0a  d the protocol..
e530: 20 20 2a 2f 0a 20 20 69 66 28 20 66 67 65 74 73    */.  if( fgets
e540: 28 7a 4c 69 6e 65 2c 73 69 7a 65 6f 66 28 7a 4c  (zLine,sizeof(zL
e550: 69 6e 65 29 2c 73 74 64 69 6e 29 3d 3d 30 20 29  ine),stdin)==0 )
e560: 7b 0a 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20  {.    exit(0);. 
e570: 20 7d 0a 20 20 6f 6d 69 74 4c 6f 67 20 3d 20 30   }.  omitLog = 0
e580: 3b 0a 20 20 6e 49 6e 20 2b 3d 20 73 74 72 6c 65  ;.  nIn += strle
e590: 6e 28 7a 4c 69 6e 65 29 3b 0a 0a 20 20 2f 2a 20  n(zLine);..  /* 
e5a0: 50 61 72 73 65 20 74 68 65 20 66 69 72 73 74 20  Parse the first 
e5b0: 6c 69 6e 65 20 6f 66 20 74 68 65 20 48 54 54 50  line of the HTTP
e5c0: 20 72 65 71 75 65 73 74 20 2a 2f 0a 20 20 7a 4d   request */.  zM
e5d0: 65 74 68 6f 64 20 3d 20 53 74 72 44 75 70 28 47  ethod = StrDup(G
e5e0: 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a  etFirstElement(z
e5f0: 4c 69 6e 65 2c 26 7a 29 29 3b 0a 20 20 7a 52 65  Line,&z));.  zRe
e600: 61 6c 53 63 72 69 70 74 20 3d 20 7a 53 63 72 69  alScript = zScri
e610: 70 74 20 3d 20 53 74 72 44 75 70 28 47 65 74 46  pt = StrDup(GetF
e620: 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a 2c 26 7a  irstElement(z,&z
e630: 29 29 3b 0a 20 20 7a 50 72 6f 74 6f 63 6f 6c 20  ));.  zProtocol 
e640: 3d 20 53 74 72 44 75 70 28 47 65 74 46 69 72 73  = StrDup(GetFirs
e650: 74 45 6c 65 6d 65 6e 74 28 7a 2c 26 7a 29 29 3b  tElement(z,&z));
e660: 0a 20 20 69 66 28 20 7a 50 72 6f 74 6f 63 6f 6c  .  if( zProtocol
e670: 3d 3d 30 20 7c 7c 20 73 74 72 6e 63 6d 70 28 7a  ==0 || strncmp(z
e680: 50 72 6f 74 6f 63 6f 6c 2c 22 48 54 54 50 2f 22  Protocol,"HTTP/"
e690: 2c 35 29 21 3d 30 20 7c 7c 20 73 74 72 6c 65 6e  ,5)!=0 || strlen
e6a0: 28 7a 50 72 6f 74 6f 63 6f 6c 29 21 3d 38 20 29  (zProtocol)!=8 )
e6b0: 7b 0a 20 20 20 20 53 74 61 72 74 52 65 73 70 6f  {.    StartRespo
e6c0: 6e 73 65 28 22 34 30 30 20 42 61 64 20 52 65 71  nse("400 Bad Req
e6d0: 75 65 73 74 22 29 3b 0a 20 20 20 20 6e 4f 75 74  uest");.    nOut
e6e0: 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20   += printf(.    
e6f0: 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a    "Content-type:
e700: 20 74 65 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22   text/plain\r\n"
e710: 0a 20 20 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20  .      "\r\n".  
e720: 20 20 20 20 22 54 68 69 73 20 73 65 72 76 65 72      "This server
e730: 20 64 6f 65 73 20 6e 6f 74 20 75 6e 64 65 72 73   does not unders
e740: 74 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74  tand the request
e750: 65 64 20 70 72 6f 74 6f 63 6f 6c 5c 6e 22 0a 20  ed protocol\n". 
e760: 20 20 20 29 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f     );.    MakeLo
e770: 67 45 6e 74 72 79 28 30 2c 20 32 30 30 29 3b 20  gEntry(0, 200); 
e780: 2f 2a 20 4c 4f 47 3a 20 62 61 64 20 70 72 6f 74  /* LOG: bad prot
e790: 6f 63 6f 6c 20 69 6e 20 48 54 54 50 20 68 65 61  ocol in HTTP hea
e7a0: 64 65 72 20 2a 2f 0a 20 20 20 20 65 78 69 74 28  der */.    exit(
e7b0: 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 53  0);.  }.  if( zS
e7c0: 63 72 69 70 74 5b 30 5d 3d 3d 30 20 29 20 4e 6f  cript[0]==0 ) No
e7d0: 74 46 6f 75 6e 64 28 32 31 30 29 3b 20 2f 2a 20  tFound(210); /* 
e7e0: 4c 4f 47 3a 20 45 6d 70 74 79 20 72 65 71 75 65  LOG: Empty reque
e7f0: 73 74 20 55 52 49 20 2a 2f 0a 20 20 69 66 28 20  st URI */.  if( 
e800: 66 6f 72 63 65 43 6c 6f 73 65 20 29 7b 0a 20 20  forceClose ){.  
e810: 20 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f    closeConnectio
e820: 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  n = 1;.  }else i
e830: 66 28 20 7a 50 72 6f 74 6f 63 6f 6c 5b 35 5d 3c  f( zProtocol[5]<
e840: 27 31 27 20 7c 7c 20 7a 50 72 6f 74 6f 63 6f 6c  '1' || zProtocol
e850: 5b 37 5d 3c 27 31 27 20 29 7b 0a 20 20 20 20 63  [7]<'1' ){.    c
e860: 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d  loseConnection =
e870: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68   1;.  }..  /* Th
e880: 69 73 20 76 65 72 79 20 73 69 6d 70 6c 65 20 73  is very simple s
e890: 65 72 76 65 72 20 6f 6e 6c 79 20 75 6e 64 65 72  erver only under
e8a0: 73 74 61 6e 64 73 20 74 68 65 20 47 45 54 2c 20  stands the GET, 
e8b0: 50 4f 53 54 0a 20 20 2a 2a 20 61 6e 64 20 48 45  POST.  ** and HE
e8c0: 41 44 20 6d 65 74 68 6f 64 73 0a 20 20 2a 2f 0a  AD methods.  */.
e8d0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4d 65    if( strcmp(zMe
e8e0: 74 68 6f 64 2c 22 47 45 54 22 29 21 3d 30 20 26  thod,"GET")!=0 &
e8f0: 26 20 73 74 72 63 6d 70 28 7a 4d 65 74 68 6f 64  & strcmp(zMethod
e900: 2c 22 50 4f 53 54 22 29 21 3d 30 0a 20 20 20 20  ,"POST")!=0.    
e910: 20 20 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 65     && strcmp(zMe
e920: 74 68 6f 64 2c 22 48 45 41 44 22 29 21 3d 30 20  thod,"HEAD")!=0 
e930: 29 7b 0a 20 20 20 20 53 74 61 72 74 52 65 73 70  ){.    StartResp
e940: 6f 6e 73 65 28 22 35 30 31 20 4e 6f 74 20 49 6d  onse("501 Not Im
e950: 70 6c 65 6d 65 6e 74 65 64 22 29 3b 0a 20 20 20  plemented");.   
e960: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
e970: 0a 20 20 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d  .      "Content-
e980: 74 79 70 65 3a 20 74 65 78 74 2f 70 6c 61 69 6e  type: text/plain
e990: 5c 72 5c 6e 22 0a 20 20 20 20 20 20 22 5c 72 5c  \r\n".      "\r\
e9a0: 6e 22 0a 20 20 20 20 20 20 22 54 68 65 20 25 73  n".      "The %s
e9b0: 20 6d 65 74 68 6f 64 20 69 73 20 6e 6f 74 20 69   method is not i
e9c0: 6d 70 6c 65 6d 65 6e 74 65 64 20 6f 6e 20 74 68  mplemented on th
e9d0: 69 73 20 73 65 72 76 65 72 2e 5c 6e 22 2c 0a 20  is server.\n",. 
e9e0: 20 20 20 20 20 7a 4d 65 74 68 6f 64 29 3b 0a 20       zMethod);. 
e9f0: 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28     MakeLogEntry(
ea00: 30 2c 20 32 32 30 29 3b 20 2f 2a 20 4c 4f 47 3a  0, 220); /* LOG:
ea10: 20 55 6e 6b 6e 6f 77 6e 20 72 65 71 75 65 73 74   Unknown request
ea20: 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 20 20 65   method */.    e
ea30: 78 69 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  xit(0);.  }..  /
ea40: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
ea50: 6c 6f 67 20 66 69 6c 65 20 28 69 66 20 7a 4c 6f  log file (if zLo
ea60: 67 46 69 6c 65 21 3d 30 29 20 61 6e 64 20 69 66  gFile!=0) and if
ea70: 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 69 6e   the pathname in
ea80: 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
ea90: 6c 69 6e 65 20 6f 66 20 74 68 65 20 68 74 74 70  line of the http
eaa0: 20 72 65 71 75 65 73 74 20 63 6f 6e 74 61 69 6e   request contain
eab0: 73 20 74 68 65 20 6d 61 67 69 63 20 73 74 72 69  s the magic stri
eac0: 6e 67 0a 20 20 2a 2a 20 22 46 75 6c 6c 48 65 61  ng.  ** "FullHea
ead0: 64 65 72 4c 6f 67 22 20 74 68 65 6e 20 77 72 69  derLog" then wri
eae0: 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  te the complete 
eaf0: 68 65 61 64 65 72 20 74 65 78 74 20 69 6e 74 6f  header text into
eb00: 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 25   the.  ** file %
eb10: 73 28 7a 4c 6f 67 46 69 6c 65 29 2d 68 64 72 2e  s(zLogFile)-hdr.
eb20: 20 20 4f 76 65 72 77 72 69 74 65 20 74 68 65 20    Overwrite the 
eb30: 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20 66  file.  This is f
eb40: 6f 72 20 70 72 6f 74 6f 63 6f 6c 0a 20 20 2a 2a  or protocol.  **
eb50: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 20   debugging only 
eb60: 61 6e 64 20 69 73 20 6f 6e 6c 79 20 65 6e 61 62  and is only enab
eb70: 6c 65 64 20 69 66 20 61 6c 74 68 74 74 70 64 20  led if althttpd 
eb80: 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  is compiled with
eb90: 0a 20 20 2a 2a 20 74 68 65 20 2d 44 4c 4f 47 5f  .  ** the -DLOG_
eba0: 48 45 41 44 45 52 3d 31 20 6f 70 74 69 6f 6e 2e  HEADER=1 option.
ebb0: 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 4c 4f 47  .  */.#ifdef LOG
ebc0: 5f 48 45 41 44 45 52 0a 20 20 69 66 28 20 7a 4c  _HEADER.  if( zL
ebd0: 6f 67 46 69 6c 65 0a 20 20 20 26 26 20 73 74 72  ogFile.   && str
ebe0: 73 74 72 28 7a 53 63 72 69 70 74 2c 22 46 75 6c  str(zScript,"Ful
ebf0: 6c 48 65 61 64 65 72 4c 6f 67 22 29 21 3d 30 0a  lHeaderLog")!=0.
ec00: 20 20 20 26 26 20 73 74 72 6c 65 6e 28 7a 4c 6f     && strlen(zLo
ec10: 67 46 69 6c 65 29 3c 73 69 7a 65 6f 66 28 7a 4c  gFile)<sizeof(zL
ec20: 69 6e 65 29 2d 35 30 0a 20 20 29 7b 0a 20 20 20  ine)-50.  ){.   
ec30: 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20   sprintf(zLine, 
ec40: 22 25 73 2d 68 64 72 22 2c 20 7a 4c 6f 67 46 69  "%s-hdr", zLogFi
ec50: 6c 65 29 3b 0a 20 20 20 20 68 64 72 4c 6f 67 20  le);.    hdrLog 
ec60: 3d 20 66 6f 70 65 6e 28 7a 4c 69 6e 65 2c 20 22  = fopen(zLine, "
ec70: 77 62 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  wb");.  }.#endif
ec80: 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 61 6c 6c 20  ...  /* Get all 
ec90: 74 68 65 20 6f 70 74 69 6f 6e 61 6c 20 66 69 65  the optional fie
eca0: 6c 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  lds that follow 
ecb0: 74 68 65 20 66 69 72 73 74 20 6c 69 6e 65 2e 0a  the first line..
ecc0: 20 20 2a 2f 0a 20 20 7a 43 6f 6f 6b 69 65 20 3d    */.  zCookie =
ecd0: 20 30 3b 0a 20 20 7a 41 75 74 68 54 79 70 65 20   0;.  zAuthType 
ece0: 3d 20 30 3b 0a 20 20 7a 52 65 6d 6f 74 65 55 73  = 0;.  zRemoteUs
ecf0: 65 72 20 3d 20 30 3b 0a 20 20 7a 52 65 66 65 72  er = 0;.  zRefer
ed00: 65 72 20 3d 20 30 3b 0a 20 20 7a 49 66 4e 6f 6e  er = 0;.  zIfNon
ed10: 65 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 7a 49  eMatch = 0;.  zI
ed20: 66 4d 6f 64 69 66 69 65 64 53 69 6e 63 65 20 3d  fModifiedSince =
ed30: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65   0;.  while( fge
ed40: 74 73 28 7a 4c 69 6e 65 2c 73 69 7a 65 6f 66 28  ts(zLine,sizeof(
ed50: 7a 4c 69 6e 65 29 2c 73 74 64 69 6e 29 20 29 7b  zLine),stdin) ){
ed60: 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69 65 6c  .    char *zFiel
ed70: 64 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20  dName;.    char 
ed80: 2a 7a 56 61 6c 3b 0a 0a 23 69 66 64 65 66 20 4c  *zVal;..#ifdef L
ed90: 4f 47 5f 48 45 41 44 45 52 0a 20 20 20 20 69 66  OG_HEADER.    if
eda0: 28 20 68 64 72 4c 6f 67 20 29 20 66 70 72 69 6e  ( hdrLog ) fprin
edb0: 74 66 28 68 64 72 4c 6f 67 2c 20 22 25 73 22 2c  tf(hdrLog, "%s",
edc0: 20 7a 4c 69 6e 65 29 3b 0a 23 65 6e 64 69 66 0a   zLine);.#endif.
edd0: 20 20 20 20 6e 49 6e 20 2b 3d 20 73 74 72 6c 65      nIn += strle
ede0: 6e 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 7a 46  n(zLine);.    zF
edf0: 69 65 6c 64 4e 61 6d 65 20 3d 20 47 65 74 46 69  ieldName = GetFi
ee00: 72 73 74 45 6c 65 6d 65 6e 74 28 7a 4c 69 6e 65  rstElement(zLine
ee10: 2c 26 7a 56 61 6c 29 3b 0a 20 20 20 20 69 66 28  ,&zVal);.    if(
ee20: 20 7a 46 69 65 6c 64 4e 61 6d 65 3d 3d 30 20 7c   zFieldName==0 |
ee30: 7c 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 3d 3d 30  | *zFieldName==0
ee40: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 52 65   ) break;.    Re
ee50: 6d 6f 76 65 4e 65 77 6c 69 6e 65 28 7a 56 61 6c  moveNewline(zVal
ee60: 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 61  );.    if( strca
ee70: 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65  secmp(zFieldName
ee80: 2c 22 55 73 65 72 2d 41 67 65 6e 74 3a 22 29 3d  ,"User-Agent:")=
ee90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 41 67 65  =0 ){.      zAge
eea0: 6e 74 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c  nt = StrDup(zVal
eeb0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
eec0: 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65   strcasecmp(zFie
eed0: 6c 64 4e 61 6d 65 2c 22 41 63 63 65 70 74 3a 22  ldName,"Accept:"
eee0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 41  )==0 ){.      zA
eef0: 63 63 65 70 74 20 3d 20 53 74 72 44 75 70 28 7a  ccept = StrDup(z
ef00: 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Val);.    }else 
ef10: 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a  if( strcasecmp(z
ef20: 46 69 65 6c 64 4e 61 6d 65 2c 22 41 63 63 65 70  FieldName,"Accep
ef30: 74 2d 45 6e 63 6f 64 69 6e 67 3a 22 29 3d 3d 30  t-Encoding:")==0
ef40: 20 29 7b 0a 20 20 20 20 20 20 7a 41 63 63 65 70   ){.      zAccep
ef50: 74 45 6e 63 6f 64 69 6e 67 20 3d 20 53 74 72 44  tEncoding = StrD
ef60: 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65  up(zVal);.    }e
ef70: 6c 73 65 20 69 66 28 20 73 74 72 63 61 73 65 63  lse if( strcasec
ef80: 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 43  mp(zFieldName,"C
ef90: 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74 68 3a 22 29  ontent-length:")
efa0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f  ==0 ){.      zCo
efb0: 6e 74 65 6e 74 4c 65 6e 67 74 68 20 3d 20 53 74  ntentLength = St
efc0: 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20  rDup(zVal);.    
efd0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 61 73  }else if( strcas
efe0: 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c  ecmp(zFieldName,
eff0: 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 22 29  "Content-type:")
f000: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f  ==0 ){.      zCo
f010: 6e 74 65 6e 74 54 79 70 65 20 3d 20 53 74 72 44  ntentType = StrD
f020: 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65  up(zVal);.    }e
f030: 6c 73 65 20 69 66 28 20 73 74 72 63 61 73 65 63  lse if( strcasec
f040: 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 52  mp(zFieldName,"R
f050: 65 66 65 72 65 72 3a 22 29 3d 3d 30 20 29 7b 0a  eferer:")==0 ){.
f060: 20 20 20 20 20 20 7a 52 65 66 65 72 65 72 20 3d        zReferer =
f070: 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20   StrDup(zVal);. 
f080: 20 20 20 20 20 69 66 28 20 73 74 72 73 74 72 28       if( strstr(
f090: 7a 56 61 6c 2c 20 22 64 65 76 69 64 73 2e 6e 65  zVal, "devids.ne
f0a0: 74 2f 22 29 21 3d 30 20 29 7b 20 7a 52 65 66 65  t/")!=0 ){ zRefe
f0b0: 72 65 72 20 3d 20 22 64 65 76 69 64 73 2e 6e 65  rer = "devids.ne
f0c0: 74 2e 73 6d 75 74 22 3b 0a 20 20 20 20 20 20 20  t.smut";.       
f0d0: 20 46 6f 72 62 69 64 64 65 6e 28 32 33 30 29 3b   Forbidden(230);
f0e0: 20 2f 2a 20 4c 4f 47 3a 20 52 65 66 65 72 72 65   /* LOG: Referre
f0f0: 72 20 69 73 20 64 65 76 69 64 73 2e 6e 65 74 20  r is devids.net 
f100: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
f110: 65 6c 73 65 20 69 66 28 20 73 74 72 63 61 73 65  else if( strcase
f120: 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22  cmp(zFieldName,"
f130: 43 6f 6f 6b 69 65 3a 22 29 3d 3d 30 20 29 7b 0a  Cookie:")==0 ){.
f140: 20 20 20 20 20 20 7a 43 6f 6f 6b 69 65 20 3d 20        zCookie = 
f150: 53 74 72 41 70 70 65 6e 64 28 7a 43 6f 6f 6b 69  StrAppend(zCooki
f160: 65 2c 22 3b 20 22 2c 7a 56 61 6c 29 3b 0a 20 20  e,"; ",zVal);.  
f170: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
f180: 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d  asecmp(zFieldNam
f190: 65 2c 22 43 6f 6e 6e 65 63 74 69 6f 6e 3a 22 29  e,"Connection:")
f1a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
f1b0: 20 73 74 72 63 61 73 65 63 6d 70 28 7a 56 61 6c   strcasecmp(zVal
f1c0: 2c 22 63 6c 6f 73 65 22 29 3d 3d 30 20 29 7b 0a  ,"close")==0 ){.
f1d0: 20 20 20 20 20 20 20 20 63 6c 6f 73 65 43 6f 6e          closeCon
f1e0: 6e 65 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 20  nection = 1;.   
f1f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 66 6f     }else if( !fo
f200: 72 63 65 43 6c 6f 73 65 20 26 26 20 73 74 72 63  rceClose && strc
f210: 61 73 65 63 6d 70 28 7a 56 61 6c 2c 20 22 6b 65  asecmp(zVal, "ke
f220: 65 70 2d 61 6c 69 76 65 22 29 3d 3d 30 20 29 7b  ep-alive")==0 ){
f230: 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 43 6f  .        closeCo
f240: 6e 6e 65 63 74 69 6f 6e 20 3d 20 30 3b 0a 20 20  nnection = 0;.  
f250: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
f260: 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a  if( strcasecmp(z
f270: 46 69 65 6c 64 4e 61 6d 65 2c 22 48 6f 73 74 3a  FieldName,"Host:
f280: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
f290: 6e 74 20 69 6e 53 71 75 61 72 65 20 3d 20 30 3b  nt inSquare = 0;
f2a0: 0a 20 20 20 20 20 20 63 68 61 72 20 63 3b 0a 20  .      char c;. 
f2b0: 20 20 20 20 20 69 66 28 20 73 61 6e 69 74 69 7a       if( sanitiz
f2c0: 65 53 74 72 69 6e 67 28 7a 56 61 6c 29 20 29 7b  eString(zVal) ){
f2d0: 0a 20 20 20 20 20 20 20 20 46 6f 72 62 69 64 64  .        Forbidd
f2e0: 65 6e 28 32 34 30 29 3b 20 20 2f 2a 20 4c 4f 47  en(240);  /* LOG
f2f0: 3a 20 49 6c 6c 65 67 61 6c 20 63 6f 6e 74 65 6e  : Illegal conten
f300: 74 20 69 6e 20 48 4f 53 54 3a 20 70 61 72 61 6d  t in HOST: param
f310: 65 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  eter */.      }.
f320: 20 20 20 20 20 20 7a 48 74 74 70 48 6f 73 74 20        zHttpHost 
f330: 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a  = StrDup(zVal);.
f340: 20 20 20 20 20 20 7a 53 65 72 76 65 72 50 6f 72        zServerPor
f350: 74 20 3d 20 7a 53 65 72 76 65 72 4e 61 6d 65 20  t = zServerName 
f360: 3d 20 53 74 72 44 75 70 28 7a 48 74 74 70 48 6f  = StrDup(zHttpHo
f370: 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  st);.      while
f380: 28 20 7a 53 65 72 76 65 72 50 6f 72 74 20 26 26  ( zServerPort &&
f390: 20 28 63 20 3d 20 2a 7a 53 65 72 76 65 72 50 6f   (c = *zServerPo
f3a0: 72 74 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  rt)!=0.         
f3b0: 20 20 20 20 20 26 26 20 28 63 21 3d 27 3a 27 20       && (c!=':' 
f3c0: 7c 7c 20 69 6e 53 71 75 61 72 65 29 20 29 7b 0a  || inSquare) ){.
f3d0: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
f3e0: 5b 27 20 29 20 69 6e 53 71 75 61 72 65 20 3d 20  [' ) inSquare = 
f3f0: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  1;.        if( c
f400: 3d 3d 27 5d 27 20 29 20 69 6e 53 71 75 61 72 65  ==']' ) inSquare
f410: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 53   = 0;.        zS
f420: 65 72 76 65 72 50 6f 72 74 2b 2b 3b 0a 20 20 20  erverPort++;.   
f430: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
f440: 53 65 72 76 65 72 50 6f 72 74 20 26 26 20 2a 7a  ServerPort && *z
f450: 53 65 72 76 65 72 50 6f 72 74 20 29 7b 0a 20 20  ServerPort ){.  
f460: 20 20 20 20 20 20 2a 7a 53 65 72 76 65 72 50 6f        *zServerPo
f470: 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  rt = 0;.        
f480: 7a 53 65 72 76 65 72 50 6f 72 74 2b 2b 3b 0a 20  zServerPort++;. 
f490: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
f4a0: 20 7a 52 65 61 6c 50 6f 72 74 20 29 7b 0a 20 20   zRealPort ){.  
f4b0: 20 20 20 20 20 20 7a 53 65 72 76 65 72 50 6f 72        zServerPor
f4c0: 74 20 3d 20 53 74 72 44 75 70 28 7a 52 65 61 6c  t = StrDup(zReal
f4d0: 50 6f 72 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Port);.      }. 
f4e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
f4f0: 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61  casecmp(zFieldNa
f500: 6d 65 2c 22 41 75 74 68 6f 72 69 7a 61 74 69 6f  me,"Authorizatio
f510: 6e 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  n:")==0 ){.     
f520: 20 7a 41 75 74 68 54 79 70 65 20 3d 20 47 65 74   zAuthType = Get
f530: 46 69 72 73 74 45 6c 65 6d 65 6e 74 28 53 74 72  FirstElement(Str
f540: 44 75 70 28 7a 56 61 6c 29 2c 20 26 7a 41 75 74  Dup(zVal), &zAut
f550: 68 41 72 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  hArg);.    }else
f560: 20 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28   if( strcasecmp(
f570: 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 49 66 2d 4e  zFieldName,"If-N
f580: 6f 6e 65 2d 4d 61 74 63 68 3a 22 29 3d 3d 30 20  one-Match:")==0 
f590: 29 7b 0a 20 20 20 20 20 20 7a 49 66 4e 6f 6e 65  ){.      zIfNone
f5a0: 4d 61 74 63 68 20 3d 20 53 74 72 44 75 70 28 7a  Match = StrDup(z
f5b0: 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Val);.    }else 
f5c0: 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a  if( strcasecmp(z
f5d0: 46 69 65 6c 64 4e 61 6d 65 2c 22 49 66 2d 4d 6f  FieldName,"If-Mo
f5e0: 64 69 66 69 65 64 2d 53 69 6e 63 65 3a 22 29 3d  dified-Since:")=
f5f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 49 66 4d  =0 ){.      zIfM
f600: 6f 64 69 66 69 65 64 53 69 6e 63 65 20 3d 20 53  odifiedSince = S
f610: 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20  trDup(zVal);.   
f620: 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 4c 4f   }.  }.#ifdef LO
f630: 47 5f 48 45 41 44 45 52 0a 20 20 69 66 28 20 68  G_HEADER.  if( h
f640: 64 72 4c 6f 67 20 29 20 66 63 6c 6f 73 65 28 68  drLog ) fclose(h
f650: 64 72 4c 6f 67 29 3b 0a 23 65 6e 64 69 66 0a 0a  drLog);.#endif..
f660: 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 72 65    /* Disallow re
f670: 71 75 65 73 74 73 20 66 72 6f 6d 20 63 65 72 74  quests from cert
f680: 61 69 6e 20 63 6c 69 65 6e 74 73 20 2a 2f 0a 20  ain clients */. 
f690: 20 69 66 28 20 7a 41 67 65 6e 74 20 29 7b 0a 20   if( zAgent ){. 
f6a0: 20 20 20 69 66 28 20 73 74 72 73 74 72 28 7a 41     if( strstr(zA
f6b0: 67 65 6e 74 2c 20 22 57 69 6e 64 6f 77 73 5f 39  gent, "Windows_9
f6c0: 22 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 73 74  ")!=0.     || st
f6d0: 72 73 74 72 28 7a 41 67 65 6e 74 2c 20 22 44 6f  rstr(zAgent, "Do
f6e0: 77 6e 6c 6f 61 64 5f 4d 61 73 74 65 72 22 29 21  wnload_Master")!
f6f0: 3d 30 0a 20 20 20 20 20 7c 7c 20 73 74 72 73 74  =0.     || strst
f700: 72 28 7a 41 67 65 6e 74 2c 20 22 45 7a 6f 6f 6d  r(zAgent, "Ezoom
f710: 73 2f 22 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20  s/")!=0.     || 
f720: 73 74 72 73 74 72 28 7a 41 67 65 6e 74 2c 20 22  strstr(zAgent, "
f730: 48 54 54 72 61 63 6b 22 29 21 3d 30 0a 20 20 20  HTTrack")!=0.   
f740: 20 20 7c 7c 20 73 74 72 73 74 72 28 7a 41 67 65    || strstr(zAge
f750: 6e 74 2c 20 22 41 68 72 65 66 73 42 6f 74 22 29  nt, "AhrefsBot")
f760: 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=0.    ){.     
f770: 20 46 6f 72 62 69 64 64 65 6e 28 32 35 30 29 3b   Forbidden(250);
f780: 20 20 2f 2a 20 4c 4f 47 3a 20 44 69 73 61 6c 6c    /* LOG: Disall
f790: 6f 77 65 64 20 75 73 65 72 20 61 67 65 6e 74 20  owed user agent 
f7a0: 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66  */.    }.  }.#if
f7b0: 20 30 0a 20 20 69 66 28 20 7a 52 65 66 65 72 65   0.  if( zRefere
f7c0: 72 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  r ){.    static 
f7d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69  const char *azDi
f7e0: 73 61 6c 6c 6f 77 5b 5d 20 3d 20 7b 0a 20 20 20  sallow[] = {.   
f7f0: 20 20 20 22 73 6b 69 64 72 6f 77 63 72 61 63 6b     "skidrowcrack
f800: 2e 63 6f 6d 22 2c 0a 20 20 20 20 20 20 22 68 6f  .com",.      "ho
f810: 73 68 69 79 75 75 67 69 2e 74 69 73 74 6f 72 79  shiyuugi.tistory
f820: 2e 63 6f 6d 22 2c 0a 20 20 20 20 20 20 22 73 6b  .com",.      "sk
f830: 69 64 72 6f 77 67 61 6d 65 73 2e 6e 65 74 22 2c  idrowgames.net",
f840: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
f850: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
f860: 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 73 61 6c  i<sizeof(azDisal
f870: 6c 6f 77 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69  low)/sizeof(azDi
f880: 73 61 6c 6c 6f 77 5b 30 5d 29 3b 20 69 2b 2b 29  sallow[0]); i++)
f890: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 73  {.      if( strs
f8a0: 74 72 28 7a 52 65 66 65 72 65 72 2c 20 61 7a 44  tr(zReferer, azD
f8b0: 69 73 61 6c 6c 6f 77 5b 69 5d 29 21 3d 30 20 29  isallow[i])!=0 )
f8c0: 7b 0a 20 20 20 20 20 20 20 20 4e 6f 74 46 6f 75  {.        NotFou
f8d0: 6e 64 28 32 36 30 29 3b 20 20 2f 2a 20 4c 4f 47  nd(260);  /* LOG
f8e0: 3a 20 44 69 73 61 6c 6c 6f 77 65 64 20 72 65 66  : Disallowed ref
f8f0: 65 72 72 65 72 20 2a 2f 0a 20 20 20 20 20 20 7d  errer */.      }
f900: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
f910: 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 6e 20  f..  /* Make an 
f920: 65 78 74 72 61 20 65 66 66 6f 72 74 20 74 6f 20  extra effort to 
f930: 67 65 74 20 61 20 76 61 6c 69 64 20 73 65 72 76  get a valid serv
f940: 65 72 20 6e 61 6d 65 20 61 6e 64 20 70 6f 72 74  er name and port
f950: 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2a 20 4f 6e   number..  ** On
f960: 6c 79 20 4e 65 74 73 63 61 70 65 20 70 72 6f 76  ly Netscape prov
f970: 69 64 65 73 20 74 68 69 73 20 69 6e 66 6f 72 6d  ides this inform
f980: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 62  ation.  If the b
f990: 72 6f 77 73 65 72 20 69 73 0a 20 20 2a 2a 20 49  rowser is.  ** I
f9a0: 6e 74 65 72 6e 65 74 20 45 78 70 6c 6f 72 65 72  nternet Explorer
f9b0: 2c 20 74 68 65 6e 20 77 65 20 68 61 76 65 20 74  , then we have t
f9c0: 6f 20 66 69 6e 64 20 6f 75 74 20 74 68 65 20 69  o find out the i
f9d0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 0a 20  nformation for. 
f9e0: 20 2a 2a 20 6f 75 72 73 65 6c 76 65 73 2e 0a 20   ** ourselves.. 
f9f0: 20 2a 2f 0a 20 20 69 66 28 20 7a 53 65 72 76 65   */.  if( zServe
fa00: 72 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  rName==0 ){.    
fa10: 7a 53 65 72 76 65 72 4e 61 6d 65 20 3d 20 53 61  zServerName = Sa
fa20: 66 65 4d 61 6c 6c 6f 63 28 20 31 30 30 20 29 3b  feMalloc( 100 );
fa30: 0a 20 20 20 20 67 65 74 68 6f 73 74 6e 61 6d 65  .    gethostname
fa40: 28 7a 53 65 72 76 65 72 4e 61 6d 65 2c 31 30 30  (zServerName,100
fa50: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 53 65  );.  }.  if( zSe
fa60: 72 76 65 72 50 6f 72 74 3d 3d 30 20 7c 7c 20 2a  rverPort==0 || *
fa70: 7a 53 65 72 76 65 72 50 6f 72 74 3d 3d 30 20 29  zServerPort==0 )
fa80: 7b 0a 20 20 20 20 7a 53 65 72 76 65 72 50 6f 72  {.    zServerPor
fa90: 74 20 3d 20 44 45 46 41 55 4c 54 5f 50 4f 52 54  t = DEFAULT_PORT
faa0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f  ;.  }..  /* Remo
fab0: 76 65 20 74 68 65 20 71 75 65 72 79 20 73 74 72  ve the query str
fac0: 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 65 6e 64  ing from the end
fad0: 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65   of the requeste
fae0: 64 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66  d file..  */.  f
faf0: 6f 72 28 7a 3d 7a 53 63 72 69 70 74 3b 20 2a 7a  or(z=zScript; *z
fb00: 20 26 26 20 2a 7a 21 3d 27 3f 27 3b 20 7a 2b 2b   && *z!='?'; z++
fb10: 29 7b 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 3f  ){}.  if( *z=='?
fb20: 27 20 29 7b 0a 20 20 20 20 7a 51 75 65 72 79 53  ' ){.    zQueryS
fb30: 75 66 66 69 78 20 3d 20 53 74 72 44 75 70 28 7a  uffix = StrDup(z
fb40: 29 3b 0a 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20  );.    *z = 0;. 
fb50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 51 75 65   }else{.    zQue
fb60: 72 79 53 75 66 66 69 78 20 3d 20 22 22 3b 0a 20  rySuffix = "";. 
fb70: 20 7d 0a 20 20 7a 51 75 65 72 79 53 74 72 69 6e   }.  zQueryStrin
fb80: 67 20 3d 20 2a 7a 51 75 65 72 79 53 75 66 66 69  g = *zQuerySuffi
fb90: 78 20 3f 20 26 7a 51 75 65 72 79 53 75 66 66 69  x ? &zQuerySuffi
fba0: 78 5b 31 5d 20 3a 20 7a 51 75 65 72 79 53 75 66  x[1] : zQuerySuf
fbb0: 66 69 78 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  fix;..  /* Creat
fbc0: 65 20 61 20 66 69 6c 65 20 74 6f 20 68 6f 6c 64  e a file to hold
fbd0: 20 74 68 65 20 50 4f 53 54 20 71 75 65 72 79 20   the POST query 
fbe0: 64 61 74 61 2c 20 69 66 20 61 6e 79 2e 20 20 57  data, if any.  W
fbf0: 65 20 68 61 76 65 20 74 6f 0a 20 20 2a 2a 20 64  e have to.  ** d
fc00: 6f 20 69 74 20 74 68 69 73 20 77 61 79 2e 20 20  o it this way.  
fc10: 57 65 20 63 61 6e 27 74 20 6a 75 73 74 20 70 61  We can't just pa
fc20: 73 73 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ss the file desc
fc30: 72 69 70 74 6f 72 20 64 6f 77 6e 20 74 6f 0a 20  riptor down to. 
fc40: 20 2a 2a 20 74 68 65 20 63 68 69 6c 64 20 70 72   ** the child pr
fc50: 6f 63 65 73 73 20 62 65 63 61 75 73 65 20 74 68  ocess because th
fc60: 65 20 66 67 65 74 73 28 29 20 66 75 6e 63 74 69  e fgets() functi
fc70: 6f 6e 20 6d 61 79 20 68 61 76 65 20 61 6c 72 65  on may have alre
fc80: 61 64 79 0a 20 20 2a 2a 20 72 65 61 64 20 70 61  ady.  ** read pa
fc90: 72 74 20 6f 66 20 74 68 65 20 50 4f 53 54 20 64  rt of the POST d
fca0: 61 74 61 20 69 6e 74 6f 20 69 74 73 20 69 6e 74  ata into its int
fcb0: 65 72 6e 61 6c 20 62 75 66 66 65 72 2e 0a 20 20  ernal buffer..  
fcc0: 2a 2f 0a 20 20 69 66 28 20 7a 4d 65 74 68 6f 64  */.  if( zMethod
fcd0: 5b 30 5d 3d 3d 27 50 27 20 26 26 20 7a 43 6f 6e  [0]=='P' && zCon
fce0: 74 65 6e 74 4c 65 6e 67 74 68 21 3d 30 20 29 7b  tentLength!=0 ){
fcf0: 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 20  .    size_t len 
fd00: 3d 20 61 74 6f 69 28 7a 43 6f 6e 74 65 6e 74 4c  = atoi(zContentL
fd10: 65 6e 67 74 68 29 3b 0a 20 20 20 20 46 49 4c 45  ength);.    FILE
fd20: 20 2a 6f 75 74 3b 0a 20 20 20 20 63 68 61 72 20   *out;.    char 
fd30: 2a 7a 42 75 66 3b 0a 20 20 20 20 69 6e 74 20 6e  *zBuf;.    int n
fd40: 3b 0a 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 4d  ;..    if( len>M
fd50: 41 58 5f 43 4f 4e 54 45 4e 54 5f 4c 45 4e 47 54  AX_CONTENT_LENGT
fd60: 48 20 29 7b 0a 20 20 20 20 20 20 53 74 61 72 74  H ){.      Start
fd70: 52 65 73 70 6f 6e 73 65 28 22 35 30 30 20 52 65  Response("500 Re
fd80: 71 75 65 73 74 20 74 6f 6f 20 6c 61 72 67 65 22  quest too large"
fd90: 29 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d  );.      nOut +=
fda0: 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20   printf(.       
fdb0: 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20   "Content-type: 
fdc0: 74 65 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a  text/plain\r\n".
fdd0: 20 20 20 20 20 20 20 20 22 5c 72 5c 6e 22 0a 20          "\r\n". 
fde0: 20 20 20 20 20 20 20 22 54 6f 6f 20 6d 75 63 68         "Too much
fdf0: 20 50 4f 53 54 20 64 61 74 61 5c 6e 22 0a 20 20   POST data\n".  
fe00: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 4d 61 6b      );.      Mak
fe10: 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 32 37 30  eLogEntry(0, 270
fe20: 29 3b 20 2f 2a 20 4c 4f 47 3a 20 52 65 71 75 65  ); /* LOG: Reque
fe30: 73 74 20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a  st too large */.
fe40: 20 20 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20        exit(0);. 
fe50: 20 20 20 7d 0a 20 20 20 20 73 70 72 69 6e 74 66     }.    sprintf
fe60: 28 7a 54 6d 70 4e 61 6d 42 75 66 2c 20 22 2f 74  (zTmpNamBuf, "/t
fe70: 6d 70 2f 2d 70 6f 73 74 2d 64 61 74 61 2d 58 58  mp/-post-data-XX
fe80: 58 58 58 58 22 29 3b 0a 20 20 20 20 7a 54 6d 70  XXXX");.    zTmp
fe90: 4e 61 6d 20 3d 20 7a 54 6d 70 4e 61 6d 42 75 66  Nam = zTmpNamBuf
fea0: 3b 0a 20 20 20 20 69 66 28 20 6d 6b 73 74 65 6d  ;.    if( mkstem
feb0: 70 28 7a 54 6d 70 4e 61 6d 29 3c 30 20 29 7b 0a  p(zTmpNam)<0 ){.
fec0: 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f        Malfunctio
fed0: 6e 28 32 38 30 2c 20 20 2f 2a 20 4c 4f 47 3a 20  n(280,  /* LOG: 
fee0: 6d 6b 73 74 65 6d 70 28 29 20 66 61 69 6c 65 64  mkstemp() failed
fef0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
ff00: 20 20 20 22 43 61 6e 6e 6f 74 20 63 72 65 61 74     "Cannot creat
ff10: 65 20 61 20 74 65 6d 70 20 66 69 6c 65 20 69 6e  e a temp file in
ff20: 20 77 68 69 63 68 20 74 6f 20 73 74 6f 72 65 20   which to store 
ff30: 50 4f 53 54 20 64 61 74 61 22 29 3b 0a 20 20 20  POST data");.   
ff40: 20 7d 0a 20 20 20 20 6f 75 74 20 3d 20 66 6f 70   }.    out = fop
ff50: 65 6e 28 7a 54 6d 70 4e 61 6d 2c 22 77 62 22 29  en(zTmpNam,"wb")
ff60: 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 3d 3d 30  ;.    if( out==0
ff70: 20 29 7b 0a 20 20 20 20 20 20 53 74 61 72 74 52   ){.      StartR
ff80: 65 73 70 6f 6e 73 65 28 22 35 30 30 20 43 61 6e  esponse("500 Can
ff90: 6e 6f 74 20 63 72 65 61 74 65 20 2f 74 6d 70 20  not create /tmp 
ffa0: 66 69 6c 65 22 29 3b 0a 20 20 20 20 20 20 6e 4f  file");.      nO
ffb0: 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20  ut += printf(.  
ffc0: 20 20 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74        "Content-t
ffd0: 79 70 65 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c  ype: text/plain\
ffe0: 72 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 5c 72  r\n".        "\r
fff0: 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 43 6f 75  \n".        "Cou
10000 6c 64 20 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73  ld not open \"%s
10010 5c 22 20 66 6f 72 20 77 72 69 74 69 6e 67 5c 6e  \" for writing\n
10020 22 2c 20 7a 54 6d 70 4e 61 6d 0a 20 20 20 20 20  ", zTmpNam.     
10030 20 29 3b 0a 20 20 20 20 20 20 4d 61 6b 65 4c 6f   );.      MakeLo
10040 67 45 6e 74 72 79 28 30 2c 20 32 39 30 29 3b 20  gEntry(0, 290); 
10050 2f 2a 20 4c 4f 47 3a 20 63 61 6e 6e 6f 74 20 63  /* LOG: cannot c
10060 72 65 61 74 65 20 74 65 6d 70 20 66 69 6c 65 20  reate temp file 
10070 66 6f 72 20 50 4f 53 54 20 2a 2f 0a 20 20 20 20  for POST */.    
10080 20 20 65 78 69 74 28 30 29 3b 0a 20 20 20 20 7d    exit(0);.    }
10090 0a 20 20 20 20 7a 42 75 66 20 3d 20 53 61 66 65  .    zBuf = Safe
100a0 4d 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31 20 29 3b  Malloc( len+1 );
100b0 0a 20 20 20 20 69 66 28 20 75 73 65 54 69 6d 65  .    if( useTime
100c0 6f 75 74 20 29 20 61 6c 61 72 6d 28 31 35 20 2b  out ) alarm(15 +
100d0 20 6c 65 6e 2f 32 30 30 30 29 3b 0a 20 20 20 20   len/2000);.    
100e0 6e 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 31  n = fread(zBuf,1
100f0 2c 6c 65 6e 2c 73 74 64 69 6e 29 3b 0a 20 20 20  ,len,stdin);.   
10100 20 6e 49 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 66   nIn += n;.    f
10110 77 72 69 74 65 28 7a 42 75 66 2c 31 2c 6e 2c 6f  write(zBuf,1,n,o
10120 75 74 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 42  ut);.    free(zB
10130 75 66 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28  uf);.    fclose(
10140 6f 75 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  out);.  }..  /* 
10150 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 72 75  Make sure the ru
10160 6e 6e 69 6e 67 20 74 69 6d 65 20 69 73 20 6e 6f  nning time is no
10170 74 20 74 6f 6f 20 67 72 65 61 74 20 2a 2f 0a 20  t too great */. 
10180 20 69 66 28 20 75 73 65 54 69 6d 65 6f 75 74 20   if( useTimeout 
10190 29 20 61 6c 61 72 6d 28 31 30 29 3b 0a 0a 20 20  ) alarm(10);..  
101a0 2f 2a 20 43 6f 6e 76 65 72 74 20 61 6c 6c 20 75  /* Convert all u
101b0 6e 75 73 75 61 6c 20 63 68 61 72 61 63 74 65 72  nusual character
101c0 73 20 69 6e 20 74 68 65 20 73 63 72 69 70 74 20  s in the script 
101d0 6e 61 6d 65 20 69 6e 74 6f 20 22 5f 22 2e 0a 20  name into "_".. 
101e0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73   **.  ** This is
101f0 20 61 20 64 65 66 65 6e 73 65 20 61 67 61 69 6e   a defense again
10200 73 74 20 76 61 72 69 6f 75 73 20 61 74 74 61 63  st various attac
10210 6b 73 2c 20 58 53 53 20 61 74 74 61 63 6b 73 20  ks, XSS attacks 
10220 69 6e 20 70 61 72 74 69 63 75 6c 61 72 2e 0a 20  in particular.. 
10230 20 2a 2f 0a 20 20 73 61 6e 69 74 69 7a 65 53 74   */.  sanitizeSt
10240 72 69 6e 67 28 7a 53 63 72 69 70 74 29 3b 0a 0a  ring(zScript);..
10250 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f    /* Do not allo
10260 77 20 22 2f 2e 22 20 6f 72 20 22 2f 2d 22 20 74  w "/." or "/-" t
10270 6f 20 74 6f 20 6f 63 63 75 72 20 61 6e 79 77 68  o to occur anywh
10280 65 72 65 20 69 6e 20 74 68 65 20 65 6e 74 69 74  ere in the entit
10290 79 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 54 68 69  y name..  ** Thi
102a0 73 20 70 72 65 76 65 6e 74 73 20 61 74 74 61 63  s prevents attac
102b0 6b 73 20 69 6e 76 6f 6c 76 69 6e 67 20 22 2e 2e  ks involving "..
102c0 22 20 61 6e 64 20 61 6c 73 6f 20 61 6c 6c 6f 77  " and also allow
102d0 73 20 75 73 20 74 6f 20 63 72 65 61 74 65 0a 20  s us to create. 
102e0 20 2a 2a 20 66 69 6c 65 73 20 61 6e 64 20 64 69   ** files and di
102f0 72 65 63 74 6f 72 69 65 73 20 77 68 6f 73 65 20  rectories whose 
10300 6e 61 6d 65 73 20 62 65 67 69 6e 20 77 69 74 68  names begin with
10310 20 22 2d 22 20 6f 72 20 22 2e 22 20 77 68 69 63   "-" or "." whic
10320 68 20 61 72 65 0a 20 20 2a 2a 20 69 6e 76 69 73  h are.  ** invis
10330 69 62 6c 65 20 74 6f 20 74 68 65 20 77 65 62 73  ible to the webs
10340 65 72 76 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  erver..  **.  **
10350 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 41 6c 6c   Exception:  All
10360 6f 77 20 74 68 65 20 22 2f 2e 77 65 6c 6c 2d 6b  ow the "/.well-k
10370 6e 6f 77 6e 2f 22 20 70 72 65 66 69 78 20 69 6e  nown/" prefix in
10380 20 61 63 63 6f 72 64 61 6e 63 65 20 77 69 74 68   accordance with
10390 0a 20 20 2a 2a 20 52 46 43 2d 35 37 38 35 0a 20  .  ** RFC-5785. 
103a0 20 2a 2f 0a 20 20 66 6f 72 28 7a 3d 7a 53 63 72   */.  for(z=zScr
103b0 69 70 74 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20  ipt; *z; z++){. 
103c0 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2f 27 20 26     if( *z=='/' &
103d0 26 20 28 7a 5b 31 5d 3d 3d 27 2e 27 20 7c 7c 20  & (z[1]=='.' || 
103e0 7a 5b 31 5d 3d 3d 27 2d 27 29 0a 20 20 20 20 20  z[1]=='-').     
103f0 26 26 20 28 7a 3e 7a 53 63 72 69 70 74 20 7c 7c  && (z>zScript ||
10400 20 73 74 72 6e 63 6d 70 28 7a 2c 22 2f 2e 77 65   strncmp(z,"/.we
10410 6c 6c 2d 6b 6e 6f 77 6e 2f 22 2c 31 33 29 21 3d  ll-known/",13)!=
10420 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0).    ){.      
10430 20 4e 6f 74 46 6f 75 6e 64 28 33 30 30 29 3b 20   NotFound(300); 
10440 2f 2a 20 4c 4f 47 3a 20 50 61 74 68 20 65 6c 65  /* LOG: Path ele
10450 6d 65 6e 74 20 62 65 67 69 6e 73 20 77 69 74 68  ment begins with
10460 20 22 2e 22 20 6f 72 20 22 2d 22 20 2a 2f 0a 20   "." or "-" */. 
10470 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
10480 69 67 75 72 65 20 6f 75 74 20 77 68 61 74 20 74  igure out what t
10490 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 66  he root of the f
104a0 69 6c 65 73 79 73 74 65 6d 20 73 68 6f 75 6c 64  ilesystem should
104b0 20 62 65 2e 20 20 49 66 20 74 68 65 0a 20 20 2a   be.  If the.  *
104c0 2a 20 48 54 54 50 5f 48 4f 53 54 20 70 61 72 61  * HTTP_HOST para
104d0 6d 65 74 65 72 20 65 78 69 73 74 73 20 28 73 74  meter exists (st
104e0 6f 72 65 64 20 69 6e 20 7a 48 74 74 70 48 6f 73  ored in zHttpHos
104f0 74 29 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74  t) then remove t
10500 68 65 0a 20 20 2a 2a 20 70 6f 72 74 20 6e 75 6d  he.  ** port num
10510 62 65 72 20 66 72 6f 6d 20 74 68 65 20 65 6e 64  ber from the end
10520 20 28 69 66 20 61 6e 79 29 2c 20 63 6f 6e 76 65   (if any), conve
10530 72 74 20 61 6c 6c 20 63 68 61 72 61 63 74 65 72  rt all character
10540 73 20 74 6f 20 6c 6f 77 65 72 0a 20 20 2a 2a 20  s to lower.  ** 
10550 63 61 73 65 2c 20 61 6e 64 20 63 6f 6e 76 65 72  case, and conver
10560 74 20 6e 6f 6e 2d 61 6c 70 68 61 6e 75 6d 62 65  t non-alphanumbe
10570 72 20 63 68 61 72 61 63 74 65 72 73 20 28 69 6e  r characters (in
10580 63 6c 75 64 69 6e 67 20 22 2e 22 29 20 74 6f 20  cluding ".") to 
10590 22 5f 22 2e 0a 20 20 2a 2a 20 54 68 65 6e 20 74  "_"..  ** Then t
105a0 72 79 20 74 6f 20 66 69 6e 64 20 61 20 64 69 72  ry to find a dir
105b0 65 63 74 6f 72 79 20 77 69 74 68 20 74 68 61 74  ectory with that
105c0 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 65 78   name and the ex
105d0 74 65 6e 73 69 6f 6e 20 2e 77 65 62 73 69 74 65  tension .website
105e0 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 74 20 66 6f  ..  ** If not fo
105f0 75 6e 64 2c 20 6c 6f 6f 6b 20 66 6f 72 20 22 64  und, look for "d
10600 65 66 61 75 6c 74 2e 77 65 62 73 69 74 65 22 2e  efault.website".
10610 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 53 63 72  .  */.  if( zScr
10620 69 70 74 5b 30 5d 21 3d 27 2f 27 20 29 7b 0a 20  ipt[0]!='/' ){. 
10630 20 20 20 4e 6f 74 46 6f 75 6e 64 28 33 31 30 29     NotFound(310)
10640 3b 20 2f 2a 20 4c 4f 47 3a 20 55 52 49 20 64 6f  ; /* LOG: URI do
10650 65 73 20 6e 6f 74 20 73 74 61 72 74 20 77 69 74  es not start wit
10660 68 20 22 2f 22 20 2a 2f 0a 20 20 7d 0a 20 20 69  h "/" */.  }.  i
10670 66 28 20 73 74 72 6c 65 6e 28 7a 52 6f 6f 74 29  f( strlen(zRoot)
10680 2b 34 30 20 3e 3d 20 73 69 7a 65 6f 66 28 7a 4c  +40 >= sizeof(zL
10690 69 6e 65 29 20 29 7b 0a 20 20 20 20 4e 6f 74 46  ine) ){.    NotF
106a0 6f 75 6e 64 28 33 32 30 29 3b 20 2f 2a 20 4c 4f  ound(320); /* LO
106b0 47 3a 20 55 52 49 20 74 6f 6f 20 6c 6f 6e 67 20  G: URI too long 
106c0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 7a 48 74  */.  }.  if( zHt
106d0 74 70 48 6f 73 74 3d 3d 30 20 7c 7c 20 7a 48 74  tpHost==0 || zHt
106e0 74 70 48 6f 73 74 5b 30 5d 3d 3d 30 20 29 7b 0a  tpHost[0]==0 ){.
106f0 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 33 33 30      NotFound(330
10700 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 4d 69 73 73  );  /* LOG: Miss
10710 69 6e 67 20 48 4f 53 54 3a 20 70 61 72 61 6d 65  ing HOST: parame
10720 74 65 72 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69  ter */.  }else i
10730 66 28 20 73 74 72 6c 65 6e 28 7a 48 74 74 70 48  f( strlen(zHttpH
10740 6f 73 74 29 2b 73 74 72 6c 65 6e 28 7a 52 6f 6f  ost)+strlen(zRoo
10750 74 29 2b 31 30 20 3e 3d 20 73 69 7a 65 6f 66 28  t)+10 >= sizeof(
10760 7a 4c 69 6e 65 29 20 29 7b 0a 20 20 20 20 4e 6f  zLine) ){.    No
10770 74 46 6f 75 6e 64 28 33 34 30 29 3b 20 20 2f 2a  tFound(340);  /*
10780 20 4c 4f 47 3a 20 48 4f 53 54 20 70 61 72 61 6d   LOG: HOST param
10790 65 74 65 72 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f  eter too long */
107a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70  .  }else{.    sp
107b0 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 25 73  rintf(zLine, "%s
107c0 2f 25 73 22 2c 20 7a 52 6f 6f 74 2c 20 7a 48 74  /%s", zRoot, zHt
107d0 74 70 48 6f 73 74 29 3b 0a 20 20 20 20 66 6f 72  tpHost);.    for
107e0 28 69 3d 73 74 72 6c 65 6e 28 7a 52 6f 6f 74 29  (i=strlen(zRoot)
107f0 2b 31 3b 20 7a 4c 69 6e 65 5b 69 5d 20 26 26 20  +1; zLine[i] && 
10800 7a 4c 69 6e 65 5b 69 5d 21 3d 27 3a 27 3b 20 69  zLine[i]!=':'; i
10810 2b 2b 29 7b 0a 20 20 20 20 20 20 75 6e 73 69 67  ++){.      unsig
10820 6e 65 64 20 63 68 61 72 20 63 20 3d 20 28 75 6e  ned char c = (un
10830 73 69 67 6e 65 64 20 63 68 61 72 29 7a 4c 69 6e  signed char)zLin
10840 65 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  e[i];.      if( 
10850 21 69 73 61 6c 6e 75 6d 28 63 29 20 29 7b 0a 20  !isalnum(c) ){. 
10860 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 69 5d 20         zLine[i] 
10870 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 7d 65 6c  = '_';.      }el
10880 73 65 20 69 66 28 20 69 73 75 70 70 65 72 28 63  se if( isupper(c
10890 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69  ) ){.        zLi
108a0 6e 65 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72 28  ne[i] = tolower(
108b0 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
108c0 7d 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a 4c  }.    strcpy(&zL
108d0 69 6e 65 5b 69 5d 2c 20 22 2e 77 65 62 73 69 74  ine[i], ".websit
108e0 65 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  e");.  }.  if( s
108f0 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62  tat(zLine,&statb
10900 75 66 29 20 7c 7c 20 21 53 5f 49 53 44 49 52 28  uf) || !S_ISDIR(
10910 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29  statbuf.st_mode)
10920 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28   ){.    sprintf(
10930 7a 4c 69 6e 65 2c 20 22 25 73 2f 64 65 66 61 75  zLine, "%s/defau
10940 6c 74 2e 77 65 62 73 69 74 65 22 2c 20 7a 52 6f  lt.website", zRo
10950 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 73 74 61  ot);.    if( sta
10960 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75 66  t(zLine,&statbuf
10970 29 20 7c 7c 20 21 53 5f 49 53 44 49 52 28 73 74  ) || !S_ISDIR(st
10980 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29  atbuf.st_mode) )
10990 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 61 6e  {.      if( stan
109a0 64 61 6c 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20  dalone ){.      
109b0 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c    sprintf(zLine,
109c0 20 22 25 73 22 2c 20 7a 52 6f 6f 74 29 3b 0a 20   "%s", zRoot);. 
109d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
109e0 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 33 35 30      NotFound(350
109f0 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 2a 2e 77 65  );  /* LOG: *.we
10a00 62 73 69 74 65 20 70 65 72 6d 69 73 73 69 6f 6e  bsite permission
10a10 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  s */.      }.   
10a20 20 7d 0a 20 20 7d 0a 20 20 7a 48 6f 6d 65 20 3d   }.  }.  zHome =
10a30 20 53 74 72 44 75 70 28 7a 4c 69 6e 65 29 3b 0a   StrDup(zLine);.
10a40 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 64 69 72  .  /* Change dir
10a50 65 63 74 6f 72 69 65 73 20 74 6f 20 74 68 65 20  ectories to the 
10a60 72 6f 6f 74 20 6f 66 20 74 68 65 20 48 54 54 50  root of the HTTP
10a70 20 66 69 6c 65 73 79 73 74 65 6d 0a 20 20 2a 2f   filesystem.  */
10a80 0a 20 20 69 66 28 20 63 68 64 69 72 28 7a 48 6f  .  if( chdir(zHo
10a90 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68  me)!=0 ){.    ch
10aa0 61 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20  ar zBuf[1000];. 
10ab0 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 33     Malfunction(3
10ac0 36 30 2c 20 20 2f 2a 20 4c 4f 47 3a 20 63 68 64  60,  /* LOG: chd
10ad0 69 72 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20  ir() failed */. 
10ae0 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20          "cannot 
10af0 63 68 64 69 72 20 74 6f 20 5b 25 73 5d 20 66 72  chdir to [%s] fr
10b00 6f 6d 20 5b 25 73 5d 22 2c 0a 20 20 20 20 20 20  om [%s]",.      
10b10 20 20 20 7a 48 6f 6d 65 2c 20 67 65 74 63 77 64     zHome, getcwd
10b20 28 7a 42 75 66 2c 39 39 39 29 29 3b 0a 20 20 7d  (zBuf,999));.  }
10b30 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
10b40 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69  e file in the fi
10b50 6c 65 73 79 73 74 65 6d 2e 20 20 57 65 20 6d 69  lesystem.  We mi
10b60 67 68 74 20 68 61 76 65 20 74 6f 20 61 70 70 65  ght have to appe
10b70 6e 64 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65  nd.  ** the name
10b80 20 22 69 6e 64 65 78 2e 68 74 6d 6c 22 20 69 6e   "index.html" in
10b90 20 6f 72 64 65 72 20 74 6f 20 66 69 6e 64 20 69   order to find i
10ba0 74 2e 20 20 41 6e 79 20 65 78 63 65 73 73 20 70  t.  Any excess p
10bb0 61 74 68 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61  ath.  ** informa
10bc0 74 69 6f 6e 20 69 73 20 70 75 74 20 69 6e 74 6f  tion is put into
10bd0 20 74 68 65 20 7a 50 61 74 68 49 6e 66 6f 20 76   the zPathInfo v
10be0 61 72 69 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ariable..  */.  
10bf0 6a 20 3d 20 6a 30 20 3d 20 28 69 6e 74 29 73 74  j = j0 = (int)st
10c00 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20 20 69  rlen(zLine);.  i
10c10 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 7a   = 0;.  while( z
10c20 53 63 72 69 70 74 5b 69 5d 20 29 7b 0a 20 20 20  Script[i] ){.   
10c30 20 77 68 69 6c 65 28 20 7a 53 63 72 69 70 74 5b   while( zScript[
10c40 69 5d 20 26 26 20 28 69 3d 3d 30 20 7c 7c 20 7a  i] && (i==0 || z
10c50 53 63 72 69 70 74 5b 69 5d 21 3d 27 2f 27 29 20  Script[i]!='/') 
10c60 29 7b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6a  ){.      zLine[j
10c70 5d 20 3d 20 7a 53 63 72 69 70 74 5b 69 5d 3b 0a  ] = zScript[i];.
10c80 20 20 20 20 20 20 69 2b 2b 3b 20 6a 2b 2b 3b 0a        i++; j++;.
10c90 20 20 20 20 7d 0a 20 20 20 20 7a 4c 69 6e 65 5b      }.    zLine[
10ca0 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  j] = 0;.    if( 
10cb0 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74  stat(zLine,&stat
10cc0 62 75 66 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  buf)!=0 ){.     
10cd0 20 69 6e 74 20 73 74 69 6c 6c 53 65 61 72 63 68   int stillSearch
10ce0 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 77  ing = 1;.      w
10cf0 68 69 6c 65 28 20 73 74 69 6c 6c 53 65 61 72 63  hile( stillSearc
10d00 68 69 6e 67 20 26 26 20 69 3e 30 20 26 26 20 6a  hing && i>0 && j
10d10 3e 6a 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77  >j0 ){.        w
10d20 68 69 6c 65 28 20 6a 3e 6a 30 20 26 26 20 7a 4c  hile( j>j0 && zL
10d30 69 6e 65 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b  ine[j-1]!='/' ){
10d40 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20   j--; }.        
10d50 73 74 72 63 70 79 28 26 7a 4c 69 6e 65 5b 6a 2d  strcpy(&zLine[j-
10d60 31 5d 2c 20 22 2f 6e 6f 74 2d 66 6f 75 6e 64 2e  1], "/not-found.
10d70 68 74 6d 6c 22 29 3b 0a 20 20 20 20 20 20 20 20  html");.        
10d80 69 66 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26  if( stat(zLine,&
10d90 73 74 61 74 62 75 66 29 3d 3d 30 20 26 26 20 53  statbuf)==0 && S
10da0 5f 49 53 52 45 47 28 73 74 61 74 62 75 66 2e 73  _ISREG(statbuf.s
10db0 74 5f 6d 6f 64 65 29 0a 20 20 20 20 20 20 20 20  t_mode).        
10dc0 20 20 20 20 26 26 20 61 63 63 65 73 73 28 7a 4c      && access(zL
10dd0 69 6e 65 2c 52 5f 4f 4b 29 3d 3d 30 20 29 7b 0a  ine,R_OK)==0 ){.
10de0 20 20 20 20 20 20 20 20 20 20 7a 52 65 61 6c 53            zRealS
10df0 63 72 69 70 74 20 3d 20 53 74 72 44 75 70 28 26  cript = StrDup(&
10e00 7a 4c 69 6e 65 5b 6a 30 5d 29 3b 0a 20 20 20 20  zLine[j0]);.    
10e10 20 20 20 20 20 20 52 65 64 69 72 65 63 74 28 7a        Redirect(z
10e20 52 65 61 6c 53 63 72 69 70 74 2c 20 31 2c 20 33  RealScript, 1, 3
10e30 37 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 72 65 64  70); /* LOG: red
10e40 69 72 65 63 74 20 74 6f 20 6e 6f 74 2d 66 6f 75  irect to not-fou
10e50 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nd */.          
10e60 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
10e70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
10e80 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a   j--;.        }.
10e90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
10ea0 28 20 73 74 69 6c 6c 53 65 61 72 63 68 69 6e 67  ( stillSearching
10eb0 20 29 20 4e 6f 74 46 6f 75 6e 64 28 33 38 30 29   ) NotFound(380)
10ec0 3b 20 2f 2a 20 4c 4f 47 3a 20 55 52 49 20 6e 6f  ; /* LOG: URI no
10ed0 74 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  t found */.     
10ee0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
10ef0 20 20 69 66 28 20 53 5f 49 53 52 45 47 28 73 74    if( S_ISREG(st
10f00 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29  atbuf.st_mode) )
10f10 7b 0a 20 20 20 20 20 20 69 66 28 20 61 63 63 65  {.      if( acce
10f20 73 73 28 7a 4c 69 6e 65 2c 52 5f 4f 4b 29 20 29  ss(zLine,R_OK) )
10f30 7b 0a 20 20 20 20 20 20 20 20 4e 6f 74 46 6f 75  {.        NotFou
10f40 6e 64 28 33 39 30 29 3b 20 20 2f 2a 20 4c 4f 47  nd(390);  /* LOG
10f50 3a 20 46 69 6c 65 20 6e 6f 74 20 72 65 61 64 61  : File not reada
10f60 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ble */.      }. 
10f70 20 20 20 20 20 7a 52 65 61 6c 53 63 72 69 70 74       zRealScript
10f80 20 3d 20 53 74 72 44 75 70 28 26 7a 4c 69 6e 65   = StrDup(&zLine
10f90 5b 6a 30 5d 29 3b 0a 20 20 20 20 20 20 62 72 65  [j0]);.      bre
10fa0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
10fb0 28 20 7a 53 63 72 69 70 74 5b 69 5d 3d 3d 30 20  ( zScript[i]==0 
10fc0 7c 7c 20 7a 53 63 72 69 70 74 5b 69 2b 31 5d 3d  || zScript[i+1]=
10fd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
10fe0 6b 20 3d 20 6a 3e 30 20 26 26 20 7a 4c 69 6e 65  k = j>0 && zLine
10ff0 5b 6a 2d 31 5d 3d 3d 27 2f 27 20 3f 20 6a 2d 31  [j-1]=='/' ? j-1
11000 20 3a 20 6a 3b 0a 20 20 20 20 20 20 73 74 72 63   : j;.      strc
11010 70 79 28 26 7a 4c 69 6e 65 5b 6b 5d 2c 22 2f 69  py(&zLine[k],"/i
11020 6e 64 65 78 2e 68 74 6d 6c 22 29 3b 0a 20 20 20  ndex.html");.   
11030 20 20 20 69 66 28 20 73 74 61 74 28 7a 4c 69 6e     if( stat(zLin
11040 65 2c 26 73 74 61 74 62 75 66 29 21 3d 30 20 7c  e,&statbuf)!=0 |
11050 7c 20 21 53 5f 49 53 52 45 47 28 73 74 61 74 62  | !S_ISREG(statb
11060 75 66 2e 73 74 5f 6d 6f 64 65 29 20 0a 20 20 20  uf.st_mode) .   
11070 20 20 20 7c 7c 20 61 63 63 65 73 73 28 7a 4c 69     || access(zLi
11080 6e 65 2c 52 5f 4f 4b 29 20 29 7b 0a 20 20 20 20  ne,R_OK) ){.    
11090 20 20 20 20 73 74 72 63 70 79 28 26 7a 4c 69 6e      strcpy(&zLin
110a0 65 5b 6b 5d 2c 22 2f 69 6e 64 65 78 2e 63 67 69  e[k],"/index.cgi
110b0 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ");.        if( 
110c0 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74  stat(zLine,&stat
110d0 62 75 66 29 21 3d 30 20 7c 7c 20 21 53 5f 49 53  buf)!=0 || !S_IS
110e0 52 45 47 28 73 74 61 74 62 75 66 2e 73 74 5f 6d  REG(statbuf.st_m
110f0 6f 64 65 29 20 0a 20 20 20 20 20 20 20 20 7c 7c  ode) .        ||
11100 20 61 63 63 65 73 73 28 7a 4c 69 6e 65 2c 52 5f   access(zLine,R_
11110 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OK) ){.         
11120 20 4e 6f 74 46 6f 75 6e 64 28 34 30 30 29 3b 20   NotFound(400); 
11130 2f 2a 20 4c 4f 47 3a 20 55 52 49 20 69 73 20 61  /* LOG: URI is a
11140 20 64 69 72 65 63 74 6f 72 79 20 77 2f 6f 20 69   directory w/o i
11150 6e 64 65 78 2e 68 74 6d 6c 20 2a 2f 0a 20 20 20  ndex.html */.   
11160 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
11170 20 20 20 20 20 7a 52 65 61 6c 53 63 72 69 70 74       zRealScript
11180 20 3d 20 53 74 72 44 75 70 28 26 7a 4c 69 6e 65   = StrDup(&zLine
11190 5b 6a 30 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  [j0]);.      if(
111a0 20 7a 53 63 72 69 70 74 5b 69 5d 3d 3d 30 20 29   zScript[i]==0 )
111b0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
111c0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 55 52  the requested UR
111d0 4c 20 64 6f 65 73 20 6e 6f 74 20 65 6e 64 20 77  L does not end w
111e0 69 74 68 20 22 2f 22 20 62 75 74 20 77 65 20 68  ith "/" but we h
111f0 61 64 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  ad to.        **
11200 20 61 70 70 65 6e 64 20 22 69 6e 64 65 78 2e 68   append "index.h
11210 74 6d 6c 22 2c 20 74 68 65 6e 20 61 20 72 65 64  tml", then a red
11220 69 72 65 63 74 20 69 73 20 6e 65 63 65 73 73 61  irect is necessa
11230 72 79 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 20  ry.  Otherwise. 
11240 20 20 20 20 20 20 20 2a 2a 20 6e 6f 6e 65 20 6f         ** none o
11250 66 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 55  f the relative U
11260 52 4c 73 20 69 6e 20 74 68 65 20 64 65 6c 69 76  RLs in the deliv
11270 65 72 65 64 20 64 6f 63 75 6d 65 6e 74 20 77 69  ered document wi
11280 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ll be.        **
11290 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 20 20 20   correct. */.   
112a0 20 20 20 20 20 52 65 64 69 72 65 63 74 28 7a 52       Redirect(zR
112b0 65 61 6c 53 63 72 69 70 74 2c 31 2c 34 31 30 29  ealScript,1,410)
112c0 3b 20 2f 2a 20 4c 4f 47 3a 20 72 65 64 69 72 65  ; /* LOG: redire
112d0 63 74 20 74 6f 20 61 64 64 20 74 72 61 69 6c 69  ct to add traili
112e0 6e 67 20 2f 20 2a 2f 0a 20 20 20 20 20 20 20 20  ng / */.        
112f0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
11300 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11310 20 7d 0a 20 20 20 20 7a 4c 69 6e 65 5b 6a 5d 20   }.    zLine[j] 
11320 3d 20 7a 53 63 72 69 70 74 5b 69 5d 3b 0a 20 20  = zScript[i];.  
11330 20 20 69 2b 2b 3b 20 6a 2b 2b 3b 0a 20 20 7d 0a    i++; j++;.  }.
11340 20 20 7a 46 69 6c 65 20 3d 20 53 74 72 44 75 70    zFile = StrDup
11350 28 7a 4c 69 6e 65 29 3b 0a 20 20 7a 50 61 74 68  (zLine);.  zPath
11360 49 6e 66 6f 20 3d 20 53 74 72 44 75 70 28 26 7a  Info = StrDup(&z
11370 53 63 72 69 70 74 5b 69 5d 29 3b 0a 20 20 6c 65  Script[i]);.  le
11380 6e 46 69 6c 65 20 3d 20 73 74 72 6c 65 6e 28 7a  nFile = strlen(z
11390 46 69 6c 65 29 3b 0a 20 20 7a 44 69 72 20 3d 20  File);.  zDir = 
113a0 53 74 72 44 75 70 28 7a 46 69 6c 65 29 3b 0a 20  StrDup(zFile);. 
113b0 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 7a 44   for(i=strlen(zD
113c0 69 72 29 2d 31 3b 20 69 3e 30 20 26 26 20 7a 44  ir)-1; i>0 && zD
113d0 69 72 5b 69 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29  ir[i]!='/'; i--)
113e0 7b 7d 3b 0a 20 20 69 66 28 20 69 3d 3d 30 20 29  {};.  if( i==0 )
113f0 7b 0a 20 20 20 20 20 73 74 72 63 70 79 28 7a 44  {.     strcpy(zD
11400 69 72 2c 22 2f 22 29 3b 0a 20 20 7d 65 6c 73 65  ir,"/");.  }else
11410 7b 0a 20 20 20 20 20 7a 44 69 72 5b 69 5d 20 3d  {.     zDir[i] =
11420 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68   0;.  }..  /* Ch
11430 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
11440 65 72 65 20 69 73 20 61 6e 20 61 75 74 68 6f 72  ere is an author
11450 69 7a 61 74 69 6f 6e 20 66 69 6c 65 2e 20 20 49  ization file.  I
11460 66 20 74 68 65 72 65 20 69 73 2c 0a 20 20 2a 2a  f there is,.  **
11470 20 70 72 6f 63 65 73 73 20 69 74 2e 0a 20 20 2a   process it..  *
11480 2f 0a 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e  /.  sprintf(zLin
11490 65 2c 20 22 25 73 2f 2d 61 75 74 68 22 2c 20 7a  e, "%s/-auth", z
114a0 44 69 72 29 3b 0a 20 20 69 66 28 20 61 63 63 65  Dir);.  if( acce
114b0 73 73 28 7a 4c 69 6e 65 2c 52 5f 4f 4b 29 3d 3d  ss(zLine,R_OK)==
114c0 30 20 26 26 20 21 43 68 65 63 6b 42 61 73 69 63  0 && !CheckBasic
114d0 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e 28 7a 4c  Authorization(zL
114e0 69 6e 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  ine) ) return;..
114f0 20 20 2f 2a 20 54 61 6b 65 20 61 70 70 72 6f 70    /* Take approp
11500 72 69 61 74 65 20 61 63 74 69 6f 6e 0a 20 20 2a  riate action.  *
11510 2f 0a 20 20 69 66 28 20 28 73 74 61 74 62 75 66  /.  if( (statbuf
11520 2e 73 74 5f 6d 6f 64 65 20 26 20 30 31 30 30 29  .st_mode & 0100)
11530 3d 3d 30 31 30 30 20 26 26 20 61 63 63 65 73 73  ==0100 && access
11540 28 7a 46 69 6c 65 2c 58 5f 4f 4b 29 3d 3d 30 20  (zFile,X_OK)==0 
11550 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 42 61  ){.    char *zBa
11560 73 65 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  seFilename;     
11570 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20      /* Filename 
11580 77 69 74 68 6f 75 74 20 64 69 72 65 63 74 6f 72  without director
11590 79 20 70 72 65 66 69 78 20 2a 2f 0a 0a 20 20 20  y prefix */..   
115a0 20 2f 2a 0a 20 20 20 20 2a 2a 20 41 62 6f 72 74   /*.    ** Abort
115b0 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 69   with an error i
115c0 66 20 74 68 65 20 43 47 49 20 73 63 72 69 70 74  f the CGI script
115d0 20 69 73 20 77 72 69 74 61 62 6c 65 20 62 79 20   is writable by 
115e0 61 6e 79 6f 6e 65 20 6f 74 68 65 72 0a 20 20 20  anyone other.   
115f0 20 2a 2a 20 74 68 61 6e 20 69 74 73 20 6f 77 6e   ** than its own
11600 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  er..    */.    i
11610 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f  f( statbuf.st_mo
11620 64 65 20 26 20 30 30 32 32 20 29 7b 0a 20 20 20  de & 0022 ){.   
11630 20 20 20 43 67 69 53 63 72 69 70 74 57 72 69 74     CgiScriptWrit
11640 61 62 6c 65 28 29 3b 0a 20 20 20 20 7d 0a 0a 20  able();.    }.. 
11650 20 20 20 2f 2a 20 49 66 20 69 74 73 20 65 78 65     /* If its exe
11660 63 75 74 61 62 6c 65 2c 20 69 74 20 6d 75 73 74  cutable, it must
11670 20 62 65 20 61 20 43 47 49 20 70 72 6f 67 72 61   be a CGI progra
11680 6d 2e 20 20 53 74 61 72 74 20 62 79 0a 20 20 20  m.  Start by.   
11690 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 64 69 72   ** changing dir
116a0 65 63 74 6f 72 69 65 73 20 74 6f 20 74 68 65 20  ectories to the 
116b0 64 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 69 6e  directory holdin
116c0 67 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20  g the program.. 
116d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 68     */.    if( ch
116e0 64 69 72 28 7a 44 69 72 29 20 29 7b 0a 20 20 20  dir(zDir) ){.   
116f0 20 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30     char zBuf[100
11700 30 5d 3b 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e  0];.      Malfun
11710 63 74 69 6f 6e 28 34 32 30 2c 20 2f 2a 20 4c 4f  ction(420, /* LO
11720 47 3a 20 63 68 64 69 72 28 29 20 66 61 69 6c 65  G: chdir() faile
11730 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  d */.           
11740 22 63 61 6e 6e 6f 74 20 63 68 64 69 72 20 74 6f  "cannot chdir to
11750 20 5b 25 73 5d 20 66 72 6f 6d 20 5b 25 73 5d 22   [%s] from [%s]"
11760 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 7a 44  , .           zD
11770 69 72 2c 20 67 65 74 63 77 64 28 7a 42 75 66 2c  ir, getcwd(zBuf,
11780 39 39 39 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  999));.    }..  
11790 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
117a0 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 6f   base filename o
117b0 66 20 74 68 65 20 43 47 49 20 73 63 72 69 70 74  f the CGI script
117c0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 73 74   */.    for(i=st
117d0 72 6c 65 6e 28 7a 46 69 6c 65 29 2d 31 3b 20 69  rlen(zFile)-1; i
117e0 3e 3d 30 20 26 26 20 7a 46 69 6c 65 5b 69 5d 21  >=0 && zFile[i]!
117f0 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 20  ='/'; i--){}.   
11800 20 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 20 3d   zBaseFilename =
11810 20 26 7a 46 69 6c 65 5b 69 2b 31 5d 3b 0a 0a 20   &zFile[i+1];.. 
11820 20 20 20 2f 2a 20 53 65 74 75 70 20 74 68 65 20     /* Setup the 
11830 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 61 70 70 72  environment appr
11840 6f 70 72 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a  opriately..    *
11850 2f 0a 20 20 20 20 70 75 74 65 6e 76 28 22 47 41  /.    putenv("GA
11860 54 45 57 41 59 5f 49 4e 54 45 52 46 41 43 45 3d  TEWAY_INTERFACE=
11870 43 47 49 2f 31 2e 30 22 29 3b 0a 20 20 20 20 66  CGI/1.0");.    f
11880 6f 72 28 69 3d 30 3b 20 69 3c 28 69 6e 74 29 28  or(i=0; i<(int)(
11890 73 69 7a 65 6f 66 28 63 67 69 65 6e 76 29 2f 73  sizeof(cgienv)/s
118a0 69 7a 65 6f 66 28 63 67 69 65 6e 76 5b 30 5d 29  izeof(cgienv[0])
118b0 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
118c0 66 28 20 2a 63 67 69 65 6e 76 5b 69 5d 2e 70 7a  f( *cgienv[i].pz
118d0 45 6e 76 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  EnvValue ){.    
118e0 20 20 20 20 53 65 74 45 6e 76 28 63 67 69 65 6e      SetEnv(cgien
118f0 76 5b 69 5d 2e 7a 45 6e 76 4e 61 6d 65 2c 2a 63  v[i].zEnvName,*c
11900 67 69 65 6e 76 5b 69 5d 2e 70 7a 45 6e 76 56 61  gienv[i].pzEnvVa
11910 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lue);.      }.  
11920 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65 48    }.    if( useH
11930 74 74 70 73 20 29 7b 0a 20 20 20 20 20 20 70 75  ttps ){.      pu
11940 74 65 6e 76 28 22 48 54 54 50 53 3d 6f 6e 22 29  tenv("HTTPS=on")
11950 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11960 46 6f 72 20 74 68 65 20 50 4f 53 54 20 6d 65 74  For the POST met
11970 68 6f 64 20 61 6c 6c 20 69 6e 70 75 74 20 68 61  hod all input ha
11980 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
11990 6f 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  o a temporary fi
119a0 6c 65 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 77 65  le,.    ** so we
119b0 20 68 61 76 65 20 74 6f 20 72 65 64 69 72 65 63   have to redirec
119c0 74 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 43  t input to the C
119d0 47 49 20 73 63 72 69 70 74 20 66 72 6f 6d 20 74  GI script from t
119e0 68 61 74 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  hat file..    */
119f0 0a 20 20 20 20 69 66 28 20 7a 4d 65 74 68 6f 64  .    if( zMethod
11a00 5b 30 5d 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20  [0]=='P' ){.    
11a10 20 20 69 66 28 20 64 75 70 28 30 29 3c 30 20 29    if( dup(0)<0 )
11a20 7b 0a 20 20 20 20 20 20 20 20 4d 61 6c 66 75 6e  {.        Malfun
11a30 63 74 69 6f 6e 28 34 33 30 2c 20 20 2f 2a 20 4c  ction(430,  /* L
11a40 4f 47 3a 20 64 75 70 28 30 29 20 66 61 69 6c 65  OG: dup(0) faile
11a50 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  d */.           
11a60 20 20 20 20 20 20 20 20 20 22 55 6e 61 62 6c 65           "Unable
11a70 20 74 6f 20 64 75 70 6c 69 63 61 74 69 6f 6e 20   to duplication 
11a80 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
11a90 30 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0");.      }.   
11aa0 20 20 20 63 6c 6f 73 65 28 30 29 3b 0a 20 20 20     close(0);.   
11ab0 20 20 20 6f 70 65 6e 28 7a 54 6d 70 4e 61 6d 2c     open(zTmpNam,
11ac0 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 20 20   O_RDONLY);.    
11ad0 7d 0a 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63  }..    if( strnc
11ae0 6d 70 28 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65  mp(zBaseFilename
11af0 2c 22 6e 70 68 2d 22 2c 34 29 3d 3d 30 20 29 7b  ,"nph-",4)==0 ){
11b00 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
11b10 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 43 47 49   name of the CGI
11b20 20 73 63 72 69 70 74 20 62 65 67 69 6e 73 20 77   script begins w
11b30 69 74 68 20 22 6e 70 68 2d 22 20 74 68 65 6e 20  ith "nph-" then 
11b40 77 65 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20  we are.      ** 
11b50 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 22  dealing with a "
11b60 6e 6f 6e 2d 70 61 72 73 65 64 20 68 65 61 64 65  non-parsed heade
11b70 72 73 22 20 43 47 49 20 73 63 72 69 70 74 2e 20  rs" CGI script. 
11b80 20 4a 75 73 74 20 65 78 65 63 28 29 0a 20 20 20   Just exec().   
11b90 20 20 20 2a 2a 20 69 74 20 64 69 72 65 63 74 6c     ** it directl
11ba0 79 20 61 6e 64 20 6c 65 74 20 69 74 20 68 61 6e  y and let it han
11bb0 64 6c 65 20 61 6c 6c 20 69 74 73 20 6f 77 6e 20  dle all its own 
11bc0 68 65 61 64 65 72 20 67 65 6e 65 72 61 74 69 6f  header generatio
11bd0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
11be0 20 20 65 78 65 63 6c 28 7a 42 61 73 65 46 69 6c    execl(zBaseFil
11bf0 65 6e 61 6d 65 2c 7a 42 61 73 65 46 69 6c 65 6e  ename,zBaseFilen
11c00 61 6d 65 2c 28 63 68 61 72 2a 29 30 29 3b 0a 20  ame,(char*)0);. 
11c10 20 20 20 20 20 2f 2a 20 4e 4f 54 45 3a 20 4e 6f       /* NOTE: No
11c20 20 6c 6f 67 20 65 6e 74 72 79 20 77 72 69 74 74   log entry writt
11c30 65 6e 20 66 6f 72 20 6e 70 68 2d 20 73 63 72 69  en for nph- scri
11c40 70 74 73 20 2a 2f 0a 20 20 20 20 20 20 65 78 69  pts */.      exi
11c50 74 28 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  t(0);.    }..   
11c60 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 74 6f   /* Fall thru to
11c70 20 68 65 72 65 20 6f 6e 6c 79 20 69 66 20 74 68   here only if th
11c80 69 73 20 70 72 6f 63 65 73 73 20 28 74 68 65 20  is process (the 
11c90 73 65 72 76 65 72 29 20 69 73 20 67 6f 69 6e 67  server) is going
11ca0 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20  .    ** to read 
11cb0 61 6e 64 20 61 75 67 6d 65 6e 74 20 74 68 65 20  and augment the 
11cc0 68 65 61 64 65 72 20 73 65 6e 74 20 62 61 63 6b  header sent back
11cd0 20 62 79 20 74 68 65 20 43 47 49 20 70 72 6f 63   by the CGI proc
11ce0 65 73 73 2e 0a 20 20 20 20 2a 2a 20 4f 70 65 6e  ess..    ** Open
11cf0 20 61 20 70 69 70 65 20 74 6f 20 72 65 63 65 69   a pipe to recei
11d00 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 66 72  ve the output fr
11d10 6f 6d 20 74 68 65 20 43 47 49 20 70 72 6f 63 65  om the CGI proce
11d20 73 73 2e 20 20 54 68 65 6e 0a 20 20 20 20 2a 2a  ss.  Then.    **
11d30 20 66 6f 72 6b 20 74 68 65 20 43 47 49 20 70 72   fork the CGI pr
11d40 6f 63 65 73 73 2e 20 20 4f 6e 63 65 20 65 76 65  ocess.  Once eve
11d50 72 79 74 68 69 6e 67 20 69 73 20 64 6f 6e 65 2c  rything is done,
11d60 20 77 65 20 73 68 6f 75 6c 64 20 62 65 0a 20 20   we should be.  
11d70 20 20 2a 2a 20 61 62 6c 65 20 74 6f 20 72 65 61    ** able to rea
11d80 64 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  d the output of 
11d90 43 47 49 20 6f 6e 20 74 68 65 20 22 69 6e 22 20  CGI on the "in" 
11da0 73 74 72 65 61 6d 2e 0a 20 20 20 20 2a 2f 0a 20  stream..    */. 
11db0 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 70     {.      int p
11dc0 78 5b 32 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  x[2];.      if( 
11dd0 70 69 70 65 28 70 78 29 20 29 7b 0a 20 20 20 20  pipe(px) ){.    
11de0 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28      Malfunction(
11df0 34 34 30 2c 20 2f 2a 20 4c 4f 47 3a 20 70 69 70  440, /* LOG: pip
11e00 65 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  e() failed */.  
11e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e20 20 20 22 55 6e 61 62 6c 65 20 74 6f 20 63 72 65    "Unable to cre
11e30 61 74 65 20 61 20 70 69 70 65 20 66 6f 72 20 74  ate a pipe for t
11e40 68 65 20 43 47 49 20 70 72 6f 67 72 61 6d 22 29  he CGI program")
11e50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11e60 69 66 28 20 66 6f 72 6b 28 29 3d 3d 30 20 29 7b  if( fork()==0 ){
11e70 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 70  .        close(p
11e80 78 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 63  x[0]);.        c
11e90 6c 6f 73 65 28 31 29 3b 0a 20 20 20 20 20 20 20  lose(1);.       
11ea0 20 69 66 28 20 64 75 70 28 70 78 5b 31 5d 29 21   if( dup(px[1])!
11eb0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
11ec0 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 34 35 30 2c  Malfunction(450,
11ed0 20 2f 2a 20 4c 4f 47 3a 20 64 75 70 28 31 29 20   /* LOG: dup(1) 
11ee0 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
11ef0 20 20 20 20 20 20 20 20 20 20 20 22 55 6e 61 62             "Unab
11f00 6c 65 20 74 6f 20 64 75 70 6c 69 63 61 74 65 20  le to duplicate 
11f10 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
11f20 25 64 20 74 6f 20 31 22 2c 0a 20 20 20 20 20 20  %d to 1",.      
11f30 20 20 20 20 20 20 20 20 20 20 20 70 78 5b 31 5d             px[1]
11f40 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
11f50 20 20 20 20 20 63 6c 6f 73 65 28 70 78 5b 31 5d       close(px[1]
11f60 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
11f70 3d 33 3b 20 63 6c 6f 73 65 28 69 29 3d 3d 30 3b  =3; close(i)==0;
11f80 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   i++){}.        
11f90 65 78 65 63 6c 28 7a 42 61 73 65 46 69 6c 65 6e  execl(zBaseFilen
11fa0 61 6d 65 2c 20 7a 42 61 73 65 46 69 6c 65 6e 61  ame, zBaseFilena
11fb0 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  me, (char*)0);. 
11fc0 20 20 20 20 20 20 20 65 78 69 74 28 30 29 3b 0a         exit(0);.
11fd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c        }.      cl
11fe0 6f 73 65 28 70 78 5b 31 5d 29 3b 0a 20 20 20 20  ose(px[1]);.    
11ff0 20 20 69 6e 20 3d 20 66 64 6f 70 65 6e 28 70 78    in = fdopen(px
12000 5b 30 5d 2c 20 22 72 62 22 29 3b 0a 20 20 20 20  [0], "rb");.    
12010 7d 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20  }.    if( in==0 
12020 29 7b 0a 20 20 20 20 20 20 43 67 69 45 72 72 6f  ){.      CgiErro
12030 72 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  r();.    }else{.
12040 20 20 20 20 20 20 43 67 69 48 61 6e 64 6c 65 52        CgiHandleR
12050 65 70 6c 79 28 69 6e 29 3b 0a 20 20 20 20 7d 0a  eply(in);.    }.
12060 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 6e 46    }else if( lenF
12070 69 6c 65 3e 35 20 26 26 20 73 74 72 63 6d 70 28  ile>5 && strcmp(
12080 26 7a 46 69 6c 65 5b 6c 65 6e 46 69 6c 65 2d 35  &zFile[lenFile-5
12090 5d 2c 22 2e 73 63 67 69 22 29 3d 3d 30 20 29 7b  ],".scgi")==0 ){
120a0 0a 20 20 20 20 2f 2a 20 41 6e 79 20 66 69 6c 65  .    /* Any file
120b0 20 74 68 61 74 20 65 6e 64 73 20 77 69 74 68 20   that ends with 
120c0 22 2e 73 63 67 69 22 20 69 73 20 61 73 73 75 6d  ".scgi" is assum
120d0 65 64 20 74 6f 20 62 65 20 74 65 78 74 20 6f 66  ed to be text of
120e0 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 6f 72 6d   the.    ** form
120f0 3a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 43 47  :.    **     SCG
12100 49 20 68 6f 73 74 6e 61 6d 65 20 70 6f 72 74 0a  I hostname port.
12110 20 20 20 20 2a 2a 20 4f 70 65 6e 20 61 20 54 43      ** Open a TC
12120 50 2f 49 50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  P/IP connection 
12130 74 6f 20 74 68 61 74 20 68 6f 73 74 20 61 6e 64  to that host and
12140 20 73 65 6e 64 20 69 74 20 61 6e 20 53 43 47 49   send it an SCGI
12150 20 72 65 71 75 65 73 74 0a 20 20 20 20 2a 2f 0a   request.    */.
12160 20 20 20 20 53 65 6e 64 53 63 67 69 52 65 71 75      SendScgiRequ
12170 65 73 74 28 7a 46 69 6c 65 2c 20 7a 53 63 72 69  est(zFile, zScri
12180 70 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  pt);.  }else if(
12190 20 63 6f 75 6e 74 53 6c 61 73 68 65 73 28 7a 52   countSlashes(zR
121a0 65 61 6c 53 63 72 69 70 74 29 21 3d 63 6f 75 6e  ealScript)!=coun
121b0 74 53 6c 61 73 68 65 73 28 7a 53 63 72 69 70 74  tSlashes(zScript
121c0 29 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  ) ){.    /* If t
121d0 68 65 20 72 65 71 75 65 73 74 20 55 52 49 20 66  he request URI f
121e0 6f 72 20 73 74 61 74 69 63 20 63 6f 6e 74 65 6e  or static conten
121f0 74 20 63 6f 6e 74 61 69 6e 73 20 6d 61 74 65 72  t contains mater
12200 69 61 6c 20 70 61 73 74 20 74 68 65 0a 20 20 20  ial past the.   
12210 20 2a 2a 20 61 63 74 75 61 6c 20 63 6f 6e 74 65   ** actual conte
12220 6e 74 20 66 69 6c 65 20 6e 61 6d 65 2c 20 72 65  nt file name, re
12230 70 6f 72 74 20 74 68 61 74 20 61 73 20 61 20 34  port that as a 4
12240 30 34 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20  04 error. */.   
12250 20 4e 6f 74 46 6f 75 6e 64 28 34 36 30 29 3b 20   NotFound(460); 
12260 2f 2a 20 4c 4f 47 3a 20 45 78 63 65 73 73 20 55  /* LOG: Excess U
12270 52 49 20 63 6f 6e 74 65 6e 74 20 70 61 73 74 20  RI content past 
12280 73 74 61 74 69 63 20 66 69 6c 65 20 6e 61 6d 65  static file name
12290 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
122a0 20 2f 2a 20 49 66 20 69 74 20 69 73 6e 27 74 20   /* If it isn't 
122b0 65 78 65 63 75 74 61 62 6c 65 20 74 68 65 6e 20  executable then 
122c0 69 74 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 61  it.    ** must a
122d0 20 73 69 6d 70 6c 65 20 66 69 6c 65 20 74 68 61   simple file tha
122e0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63 6f  t needs to be co
122f0 70 69 65 64 20 74 6f 20 6f 75 74 70 75 74 2e 0a  pied to output..
12300 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 53      */.    if( S
12310 65 6e 64 46 69 6c 65 28 7a 46 69 6c 65 2c 20 6c  endFile(zFile, l
12320 65 6e 46 69 6c 65 2c 20 26 73 74 61 74 62 75 66  enFile, &statbuf
12330 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a  ) ) return;.  }.
12340 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29    fflush(stdout)
12350 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79  ;.  MakeLogEntry
12360 28 30 2c 20 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a  (0, 0);  /* LOG:
12370 20 4e 6f 72 6d 61 6c 20 72 65 70 6c 79 20 2a 2f   Normal reply */
12380 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  ..  /* The next 
12390 72 65 71 75 65 73 74 20 6d 75 73 74 20 61 72 72  request must arr
123a0 69 76 65 20 77 69 74 68 69 6e 20 33 30 20 73 65  ive within 30 se
123b0 63 6f 6e 64 73 20 6f 72 20 77 65 20 63 6c 6f 73  conds or we clos
123c0 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  e the connection
123d0 0a 20 20 2a 2f 0a 20 20 6f 6d 69 74 4c 6f 67 20  .  */.  omitLog 
123e0 3d 20 31 3b 0a 20 20 69 66 28 20 75 73 65 54 69  = 1;.  if( useTi
123f0 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d 28 33 30  meout ) alarm(30
12400 29 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 4d 41  );.}..#define MA
12410 58 5f 50 41 52 41 4c 4c 45 4c 20 35 30 20 20 2f  X_PARALLEL 50  /
12420 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75  * Number of simu
12430 6c 74 61 6e 65 6f 75 73 20 63 68 69 6c 64 72 65  ltaneous childre
12440 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20  n */../*.** All 
12450 70 6f 73 73 69 62 6c 65 20 66 6f 72 6d 73 20 6f  possible forms o
12460 66 20 61 6e 20 49 50 20 61 64 64 72 65 73 73 2e  f an IP address.
12470 20 20 4e 65 65 64 65 64 20 74 6f 20 77 6f 72 6b    Needed to work
12480 20 61 72 6f 75 6e 64 20 47 43 43 20 73 74 72 69   around GCC stri
12490 63 74 0a 2a 2a 20 61 6c 69 61 73 69 6e 67 20 72  ct.** aliasing r
124a0 75 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ules..*/.typedef
124b0 20 75 6e 69 6f 6e 20 7b 0a 20 20 73 74 72 75 63   union {.  struc
124c0 74 20 73 6f 63 6b 61 64 64 72 20 73 61 3b 20 20  t sockaddr sa;  
124d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
124e0 62 73 74 72 61 63 74 20 73 75 70 65 72 63 6c 61  bstract supercla
124f0 73 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ss */.  struct s
12500 6f 63 6b 61 64 64 72 5f 69 6e 20 73 61 34 3b 20  ockaddr_in sa4; 
12510 20 20 20 20 20 20 20 20 20 2f 2a 20 49 50 76 34           /* IPv4
12520 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 6f 63   */.  struct soc
12530 6b 61 64 64 72 5f 69 6e 36 20 73 61 36 3b 20 20  kaddr_in6 sa6;  
12540 20 20 20 20 20 20 20 2f 2a 20 49 50 76 36 20 2a         /* IPv6 *
12550 2f 0a 20 20 73 74 72 75 63 74 20 73 6f 63 6b 61  /.  struct socka
12560 64 64 72 5f 73 74 6f 72 61 67 65 20 73 61 73 3b  ddr_storage sas;
12570 20 20 20 20 20 2f 2a 20 53 68 6f 75 6c 64 20 62       /* Should b
12580 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66  e the maximum of
12590 20 74 68 65 20 61 62 6f 76 65 20 33 20 2a 2f 0a   the above 3 */.
125a0 7d 20 61 64 64 72 65 73 73 3b 0a 0a 2f 2a 0a 2a  } address;../*.*
125b0 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 48  * Implement an H
125c0 54 54 50 20 73 65 72 76 65 72 20 64 61 65 6d 6f  TTP server daemo
125d0 6e 20 6c 69 73 74 65 6e 69 6e 67 20 6f 6e 20 70  n listening on p
125e0 6f 72 74 20 69 50 6f 72 74 2e 0a 2a 2a 0a 2a 2a  ort iPort..**.**
125f0 20 41 73 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69   As new connecti
12600 6f 6e 73 20 61 72 72 69 76 65 2c 20 66 6f 72 6b  ons arrive, fork
12610 20 61 20 63 68 69 6c 64 20 61 6e 64 20 6c 65 74   a child and let
12620 20 63 68 69 6c 64 20 72 65 74 75 72 6e 0a 2a 2a   child return.**
12630 20 6f 75 74 20 6f 66 20 74 68 69 73 20 70 72 6f   out of this pro
12640 63 65 64 75 72 65 20 63 61 6c 6c 2e 20 20 54 68  cedure call.  Th
12650 65 20 63 68 69 6c 64 20 77 69 6c 6c 20 68 61 6e  e child will han
12660 64 6c 65 20 74 68 65 20 72 65 71 75 65 73 74 2e  dle the request.
12670 0a 2a 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6e  .** The parent n
12680 65 76 65 72 20 72 65 74 75 72 6e 73 20 66 72 6f  ever returns fro
12690 6d 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  m this procedure
126a0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
126b0 20 74 6f 20 65 61 63 68 20 63 68 69 6c 64 20 61   to each child a
126c0 73 20 69 74 20 72 75 6e 73 2e 20 20 49 66 20 75  s it runs.  If u
126d0 6e 61 62 6c 65 20 74 6f 20 65 73 74 61 62 6c 69  nable to establi
126e0 73 68 20 61 0a 2a 2a 20 6c 69 73 74 65 6e 69 6e  sh a.** listenin
126f0 67 20 73 6f 63 6b 65 74 2c 20 72 65 74 75 72 6e  g socket, return
12700 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e   non-zero..*/.in
12710 74 20 68 74 74 70 5f 73 65 72 76 65 72 28 63 6f  t http_server(co
12720 6e 73 74 20 63 68 61 72 20 2a 7a 50 6f 72 74 2c  nst char *zPort,
12730 20 69 6e 74 20 6c 6f 63 61 6c 4f 6e 6c 79 29 7b   int localOnly){
12740 0a 20 20 69 6e 74 20 6c 69 73 74 65 6e 65 72 5b  .  int listener[
12750 32 30 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  20];            
12760 2f 2a 20 54 68 65 20 73 65 72 76 65 72 20 73 6f  /* The server so
12770 63 6b 65 74 73 20 2a 2f 0a 20 20 69 6e 74 20 63  ckets */.  int c
12780 6f 6e 6e 65 63 74 69 6f 6e 3b 20 20 20 20 20 20  onnection;      
12790 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 63          /* A soc
127a0 6b 65 74 20 66 6f 72 20 65 61 63 68 20 69 6e 64  ket for each ind
127b0 69 76 69 64 75 61 6c 20 63 6f 6e 6e 65 63 74 69  ividual connecti
127c0 6f 6e 20 2a 2f 0a 20 20 66 64 5f 73 65 74 20 72  on */.  fd_set r
127d0 65 61 64 66 64 73 3b 20 20 20 20 20 20 20 20 20  eadfds;         
127e0 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 66       /* Set of f
127f0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
12800 66 6f 72 20 73 65 6c 65 63 74 28 29 20 2a 2f 0a  for select() */.
12810 20 20 61 64 64 72 65 73 73 20 69 6e 61 64 64 72    address inaddr
12820 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
12830 2a 20 52 65 6d 6f 74 65 20 61 64 64 72 65 73 73  * Remote address
12840 20 2a 2f 0a 20 20 73 6f 63 6b 6c 65 6e 5f 74 20   */.  socklen_t 
12850 6c 65 6e 61 64 64 72 3b 20 20 20 20 20 20 20 20  lenaddr;        
12860 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
12870 74 68 65 20 69 6e 61 64 64 72 20 73 74 72 75 63  the inaddr struc
12880 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68  ture */.  int ch
12890 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ild;            
128a0 20 20 20 20 20 20 20 2f 2a 20 50 49 44 20 6f 66         /* PID of
128b0 20 74 68 65 20 63 68 69 6c 64 20 70 72 6f 63 65   the child proce
128c0 73 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 63 68 69  ss */.  int nchi
128d0 6c 64 72 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  ldren = 0;      
128e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
128f0 66 20 63 68 69 6c 64 20 70 72 6f 63 65 73 73 65  f child processe
12900 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 74 69  s */.  struct ti
12910 6d 65 76 61 6c 20 64 65 6c 61 79 3b 20 20 20 20  meval delay;    
12920 20 20 20 20 2f 2a 20 48 6f 77 20 6c 6f 6e 67 20      /* How long 
12930 74 6f 20 77 61 69 74 20 69 6e 73 69 64 65 20 73  to wait inside s
12940 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 69 6e 74  elect() */.  int
12950 20 6f 70 74 20 3d 20 31 3b 20 20 20 20 20 20 20   opt = 1;       
12960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 74            /* set
12970 73 6f 63 6b 6f 70 74 20 66 6c 61 67 20 2a 2f 0a  sockopt flag */.
12980 20 20 73 74 72 75 63 74 20 61 64 64 72 69 6e 66    struct addrinf
12990 6f 20 73 48 69 6e 74 73 3b 20 20 20 20 20 20 2f  o sHints;      /
129a0 2a 20 41 64 64 72 65 73 73 20 68 69 6e 74 73 20  * Address hints 
129b0 2a 2f 0a 20 20 73 74 72 75 63 74 20 61 64 64 72  */.  struct addr
129c0 69 6e 66 6f 20 2a 70 41 64 64 72 73 2c 20 2a 70  info *pAddrs, *p
129d0 3b 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ; /* */.  int rc
129e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
129f0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
12a00 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
12a10 2c 20 6e 3b 0a 20 20 69 6e 74 20 6d 61 78 46 64  , n;.  int maxFd
12a20 20 3d 20 2d 31 3b 0a 20 20 0a 20 20 6d 65 6d 73   = -1;.  .  mems
12a30 65 74 28 26 73 48 69 6e 74 73 2c 20 30 2c 20 73  et(&sHints, 0, s
12a40 69 7a 65 6f 66 28 73 48 69 6e 74 73 29 29 3b 0a  izeof(sHints));.
12a50 20 20 69 66 28 20 69 70 76 34 4f 6e 6c 79 20 29    if( ipv4Only )
12a60 7b 0a 20 20 20 20 73 48 69 6e 74 73 2e 61 69 5f  {.    sHints.ai_
12a70 66 61 6d 69 6c 79 20 3d 20 50 46 5f 49 4e 45 54  family = PF_INET
12a80 3b 0a 20 20 20 20 2f 2a 70 72 69 6e 74 66 28 22  ;.    /*printf("
12a90 69 70 76 34 20 6f 6e 6c 79 5c 6e 22 29 3b 2a 2f  ipv4 only\n");*/
12aa0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 70 76  .  }else if( ipv
12ab0 36 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 48 69  6Only ){.    sHi
12ac0 6e 74 73 2e 61 69 5f 66 61 6d 69 6c 79 20 3d 20  nts.ai_family = 
12ad0 50 46 5f 49 4e 45 54 36 3b 0a 20 20 20 20 2f 2a  PF_INET6;.    /*
12ae0 70 72 69 6e 74 66 28 22 69 70 76 36 20 6f 6e 6c  printf("ipv6 onl
12af0 79 5c 6e 22 29 3b 2a 2f 0a 20 20 7d 65 6c 73 65  y\n");*/.  }else
12b00 7b 0a 20 20 20 20 73 48 69 6e 74 73 2e 61 69 5f  {.    sHints.ai_
12b10 66 61 6d 69 6c 79 20 3d 20 50 46 5f 55 4e 53 50  family = PF_UNSP
12b20 45 43 3b 0a 20 20 7d 0a 20 20 73 48 69 6e 74 73  EC;.  }.  sHints
12b30 2e 61 69 5f 73 6f 63 6b 74 79 70 65 20 3d 20 53  .ai_socktype = S
12b40 4f 43 4b 5f 53 54 52 45 41 4d 3b 0a 20 20 73 48  OCK_STREAM;.  sH
12b50 69 6e 74 73 2e 61 69 5f 66 6c 61 67 73 20 3d 20  ints.ai_flags = 
12b60 41 49 5f 50 41 53 53 49 56 45 3b 0a 20 20 73 48  AI_PASSIVE;.  sH
12b70 69 6e 74 73 2e 61 69 5f 70 72 6f 74 6f 63 6f 6c  ints.ai_protocol
12b80 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 67 65 74   = 0;.  rc = get
12b90 61 64 64 72 69 6e 66 6f 28 6c 6f 63 61 6c 4f 6e  addrinfo(localOn
12ba0 6c 79 20 3f 20 22 6c 6f 63 61 6c 68 6f 73 74 22  ly ? "localhost"
12bb0 3a 20 30 2c 20 7a 50 6f 72 74 2c 20 26 73 48 69  : 0, zPort, &sHi
12bc0 6e 74 73 2c 20 26 70 41 64 64 72 73 29 3b 0a 20  nts, &pAddrs);. 
12bd0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 66   if( rc ){.    f
12be0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
12bf0 63 6f 75 6c 64 20 6e 6f 74 20 67 65 74 20 61 64  could not get ad
12c00 64 72 20 69 6e 66 6f 3a 20 25 73 22 2c 20 0a 20  dr info: %s", . 
12c10 20 20 20 20 20 20 20 20 20 20 20 72 63 21 3d 45             rc!=E
12c20 41 49 5f 53 59 53 54 45 4d 20 3f 20 67 61 69 5f  AI_SYSTEM ? gai_
12c30 73 74 72 65 72 72 6f 72 28 72 63 29 20 3a 20 73  strerror(rc) : s
12c40 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 29 3b  trerror(errno));
12c50 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
12c60 20 7d 0a 20 20 66 6f 72 28 6e 3d 30 2c 20 70 3d   }.  for(n=0, p=
12c70 70 41 64 64 72 73 3b 20 6e 3c 28 69 6e 74 29 28  pAddrs; n<(int)(
12c80 73 69 7a 65 6f 66 28 6c 69 73 74 65 6e 65 72 29  sizeof(listener)
12c90 2f 73 69 7a 65 6f 66 28 6c 69 73 74 65 6e 65 72  /sizeof(listener
12ca0 5b 30 5d 29 29 20 26 26 20 70 21 3d 30 3b 0a 20  [0])) && p!=0;. 
12cb0 20 20 20 20 20 20 20 70 3d 70 2d 3e 61 69 5f 6e         p=p->ai_n
12cc0 65 78 74 29 7b 0a 20 20 20 20 6c 69 73 74 65 6e  ext){.    listen
12cd0 65 72 5b 6e 5d 20 3d 20 73 6f 63 6b 65 74 28 70  er[n] = socket(p
12ce0 2d 3e 61 69 5f 66 61 6d 69 6c 79 2c 20 70 2d 3e  ->ai_family, p->
12cf0 61 69 5f 73 6f 63 6b 74 79 70 65 2c 20 70 2d 3e  ai_socktype, p->
12d00 61 69 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 20 20  ai_protocol);.  
12d10 20 20 69 66 28 20 6c 69 73 74 65 6e 65 72 5b 6e    if( listener[n
12d20 5d 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ]>=0 ){.      /*
12d30 20 69 66 20 77 65 20 63 61 6e 27 74 20 74 65 72   if we can't ter
12d40 6d 69 6e 61 74 65 20 6e 69 63 65 6c 79 2c 20 61  minate nicely, a
12d50 74 20 6c 65 61 73 74 20 61 6c 6c 6f 77 20 74 68  t least allow th
12d60 65 20 73 6f 63 6b 65 74 20 74 6f 20 62 65 20 72  e socket to be r
12d70 65 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 73  eused */.      s
12d80 65 74 73 6f 63 6b 6f 70 74 28 6c 69 73 74 65 6e  etsockopt(listen
12d90 65 72 5b 6e 5d 2c 20 53 4f 4c 5f 53 4f 43 4b 45  er[n], SOL_SOCKE
12da0 54 2c 20 53 4f 5f 52 45 55 53 45 41 44 44 52 2c  T, SO_REUSEADDR,
12db0 26 6f 70 74 2c 20 73 69 7a 65 6f 66 28 6f 70 74  &opt, sizeof(opt
12dc0 29 29 3b 0a 20 20 20 20 20 20 0a 23 69 66 20 64  ));.      .#if d
12dd0 65 66 69 6e 65 64 28 49 50 56 36 5f 56 36 4f 4e  efined(IPV6_V6ON
12de0 4c 59 29 0a 20 20 20 20 20 20 69 66 28 20 70 2d  LY).      if( p-
12df0 3e 61 69 5f 66 61 6d 69 6c 79 3d 3d 41 46 5f 49  >ai_family==AF_I
12e00 4e 45 54 36 20 29 7b 0a 20 20 20 20 20 20 20 20  NET6 ){.        
12e10 69 6e 74 20 76 36 6f 6e 6c 79 20 3d 20 31 3b 0a  int v6only = 1;.
12e20 20 20 20 20 20 20 20 20 73 65 74 73 6f 63 6b 6f          setsocko
12e30 70 74 28 6c 69 73 74 65 6e 65 72 5b 6e 5d 2c 20  pt(listener[n], 
12e40 49 50 50 52 4f 54 4f 5f 49 50 56 36 2c 20 49 50  IPPROTO_IPV6, IP
12e50 56 36 5f 56 36 4f 4e 4c 59 2c 0a 20 20 20 20 20  V6_V6ONLY,.     
12e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
12e70 76 36 6f 6e 6c 79 2c 20 73 69 7a 65 6f 66 28 76  v6only, sizeof(v
12e80 36 6f 6e 6c 79 29 29 3b 0a 20 20 20 20 20 20 7d  6only));.      }
12e90 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 0a 20  .#endif.      . 
12ea0 20 20 20 20 20 69 66 28 20 62 69 6e 64 28 6c 69       if( bind(li
12eb0 73 74 65 6e 65 72 5b 6e 5d 2c 20 70 2d 3e 61 69  stener[n], p->ai
12ec0 5f 61 64 64 72 2c 20 70 2d 3e 61 69 5f 61 64 64  _addr, p->ai_add
12ed0 72 6c 65 6e 29 3c 30 20 29 7b 0a 20 20 20 20 20  rlen)<0 ){.     
12ee0 20 20 20 70 72 69 6e 74 66 28 22 62 69 6e 64 20     printf("bind 
12ef0 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20 73  failed: %s\n", s
12f00 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 29 3b  trerror(errno));
12f10 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 6c  .        close(l
12f20 69 73 74 65 6e 65 72 5b 6e 5d 29 3b 0a 20 20 20  istener[n]);.   
12f30 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
12f40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
12f50 20 6c 69 73 74 65 6e 28 6c 69 73 74 65 6e 65 72   listen(listener
12f60 5b 6e 5d 2c 20 32 30 29 3c 30 20 29 7b 0a 20 20  [n], 20)<0 ){.  
12f70 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 6c 69        printf("li
12f80 73 74 65 6e 28 29 20 66 61 69 6c 65 64 3a 20 25  sten() failed: %
12f90 73 5c 6e 22 2c 20 73 74 72 65 72 72 6f 72 28 65  s\n", strerror(e
12fa0 72 72 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20  rrno));.        
12fb0 63 6c 6f 73 65 28 6c 69 73 74 65 6e 65 72 5b 6e  close(listener[n
12fc0 5d 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  ]);.        cont
12fd0 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
12fe0 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20      n++;.    }. 
12ff0 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b   }.  if( n==0 ){
13000 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
13010 65 72 72 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65  err, "cannot ope
13020 6e 20 61 6e 79 20 73 6f 63 6b 65 74 73 5c 6e 22  n any sockets\n"
13030 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
13040 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 31  .  }..  while( 1
13050 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 63 68 69   ){.    if( nchi
13060 6c 64 72 65 6e 3e 4d 41 58 5f 50 41 52 41 4c 4c  ldren>MAX_PARALL
13070 45 4c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53  EL ){.      /* S
13080 6c 6f 77 20 64 6f 77 6e 20 69 66 20 63 6f 6e 6e  low down if conn
13090 65 63 74 69 6f 6e 73 20 61 72 65 20 61 72 72 69  ections are arri
130a0 76 69 6e 67 20 74 6f 6f 20 66 61 73 74 20 2a 2f  ving too fast */
130b0 0a 20 20 20 20 20 20 73 6c 65 65 70 28 20 6e 63  .      sleep( nc
130c0 68 69 6c 64 72 65 6e 2d 4d 41 58 5f 50 41 52 41  hildren-MAX_PARA
130d0 4c 4c 45 4c 20 29 3b 0a 20 20 20 20 7d 0a 20 20  LLEL );.    }.  
130e0 20 20 64 65 6c 61 79 2e 74 76 5f 73 65 63 20 3d    delay.tv_sec =
130f0 20 36 30 3b 0a 20 20 20 20 64 65 6c 61 79 2e 74   60;.    delay.t
13100 76 5f 75 73 65 63 20 3d 20 30 3b 0a 20 20 20 20  v_usec = 0;.    
13110 46 44 5f 5a 45 52 4f 28 26 72 65 61 64 66 64 73  FD_ZERO(&readfds
13120 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
13130 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
13140 20 61 73 73 65 72 74 28 20 6c 69 73 74 65 6e 65   assert( listene
13150 72 5b 69 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20  r[i]>=0 );.     
13160 20 46 44 5f 53 45 54 28 20 6c 69 73 74 65 6e 65   FD_SET( listene
13170 72 5b 69 5d 2c 20 26 72 65 61 64 66 64 73 29 3b  r[i], &readfds);
13180 0a 20 20 20 20 20 20 69 66 28 20 6c 69 73 74 65  .      if( liste
13190 6e 65 72 5b 69 5d 3e 6d 61 78 46 64 20 29 20 6d  ner[i]>maxFd ) m
131a0 61 78 46 64 20 3d 20 6c 69 73 74 65 6e 65 72 5b  axFd = listener[
131b0 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65  i];.    }.    se
131c0 6c 65 63 74 28 20 6d 61 78 46 64 2b 31 2c 20 26  lect( maxFd+1, &
131d0 72 65 61 64 66 64 73 2c 20 30 2c 20 30 2c 20 26  readfds, 0, 0, &
131e0 64 65 6c 61 79 29 3b 0a 20 20 20 20 66 6f 72 28  delay);.    for(
131f0 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
13200 20 20 20 20 20 20 69 66 28 20 46 44 5f 49 53 53        if( FD_ISS
13210 45 54 28 6c 69 73 74 65 6e 65 72 5b 69 5d 2c 20  ET(listener[i], 
13220 26 72 65 61 64 66 64 73 29 20 29 7b 0a 20 20 20  &readfds) ){.   
13230 20 20 20 20 20 6c 65 6e 61 64 64 72 20 3d 20 73       lenaddr = s
13240 69 7a 65 6f 66 28 69 6e 61 64 64 72 29 3b 0a 20  izeof(inaddr);. 
13250 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f         connectio
13260 6e 20 3d 20 61 63 63 65 70 74 28 6c 69 73 74 65  n = accept(liste
13270 6e 65 72 5b 69 5d 2c 20 26 69 6e 61 64 64 72 2e  ner[i], &inaddr.
13280 73 61 2c 20 26 6c 65 6e 61 64 64 72 29 3b 0a 20  sa, &lenaddr);. 
13290 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e 6e 65         if( conne
132a0 63 74 69 6f 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  ction>=0 ){.    
132b0 20 20 20 20 20 20 63 68 69 6c 64 20 3d 20 66 6f        child = fo
132c0 72 6b 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rk();.          
132d0 69 66 28 20 63 68 69 6c 64 21 3d 30 20 29 7b 0a  if( child!=0 ){.
132e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
132f0 63 68 69 6c 64 3e 30 20 29 20 6e 63 68 69 6c 64  child>0 ) nchild
13300 72 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  ren++;.         
13310 20 20 20 63 6c 6f 73 65 28 63 6f 6e 6e 65 63 74     close(connect
13320 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ion);.          
13330 20 20 2f 2a 20 70 72 69 6e 74 66 28 22 73 75 62    /* printf("sub
13340 70 72 6f 63 65 73 73 20 25 64 20 73 74 61 72 74  process %d start
13350 65 64 2e 2e 2e 5c 6e 22 2c 20 63 68 69 6c 64 29  ed...\n", child)
13360 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  ; fflush(stdout)
13370 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7d  ; */.          }
13380 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
13390 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 2c 20    int nErr = 0, 
133a0 66 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  fd;.            
133b0 63 6c 6f 73 65 28 30 29 3b 0a 20 20 20 20 20 20  close(0);.      
133c0 20 20 20 20 20 20 66 64 20 3d 20 64 75 70 28 63        fd = dup(c
133d0 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 20 20  onnection);.    
133e0 20 20 20 20 20 20 20 20 69 66 28 20 66 64 21 3d          if( fd!=
133f0 30 20 29 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  0 ) nErr++;.    
13400 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 31 29          close(1)
13410 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 64  ;.            fd
13420 20 3d 20 64 75 70 28 63 6f 6e 6e 65 63 74 69 6f   = dup(connectio
13430 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
13440 69 66 28 20 66 64 21 3d 31 20 29 20 6e 45 72 72  if( fd!=1 ) nErr
13450 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
13460 63 6c 6f 73 65 28 63 6f 6e 6e 65 63 74 69 6f 6e  close(connection
13470 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
13480 65 74 75 72 6e 20 6e 45 72 72 3b 0a 20 20 20 20  eturn nErr;.    
13490 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
134a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
134b0 2f 2a 20 42 75 72 79 20 64 65 61 64 20 63 68 69  /* Bury dead chi
134c0 6c 64 72 65 6e 20 2a 2f 0a 20 20 20 20 20 20 77  ldren */.      w
134d0 68 69 6c 65 28 20 28 63 68 69 6c 64 20 3d 20 77  hile( (child = w
134e0 61 69 74 70 69 64 28 30 2c 20 30 2c 20 57 4e 4f  aitpid(0, 0, WNO
134f0 48 41 4e 47 29 29 3e 30 20 29 7b 0a 20 20 20 20  HANG))>0 ){.    
13500 20 20 20 20 2f 2a 20 70 72 69 6e 74 66 28 22 70      /* printf("p
13510 72 6f 63 65 73 73 20 25 64 20 65 6e 64 73 5c 6e  rocess %d ends\n
13520 22 2c 20 63 68 69 6c 64 29 3b 20 66 66 6c 75 73  ", child); fflus
13530 68 28 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20  h(stdout); */.  
13540 20 20 20 20 20 20 6e 63 68 69 6c 64 72 65 6e 2d        nchildren-
13550 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  -;.      }.    }
13560 0a 20 20 7d 0a 20 20 2f 2a 20 4e 4f 54 20 52 45  .  }.  /* NOT RE
13570 41 43 48 45 44 20 2a 2f 20 20 0a 20 20 65 78 69  ACHED */  .  exi
13580 74 28 31 29 3b 0a 7d 0a 0a 0a 69 6e 74 20 6d 61  t(1);.}...int ma
13590 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61  in(int argc, cha
135a0 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74  r **argv){.  int
135b0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
135c0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
135d0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 63 68 61 72  ounter */.  char
135e0 20 2a 7a 50 65 72 6d 55 73 65 72 20 3d 20 30 3b   *zPermUser = 0;
135f0 20 20 20 20 20 20 2f 2a 20 52 75 6e 20 64 61 65        /* Run dae
13600 6d 6f 6e 20 77 69 74 68 20 74 68 69 73 20 75 73  mon with this us
13610 65 72 27 73 20 70 65 72 6d 69 73 73 69 6f 6e 73  er's permissions
13620 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
13630 20 2a 7a 50 6f 72 74 20 3d 20 30 3b 20 20 20 20   *zPort = 0;    
13640 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 6e 20  /* Implement an 
13650 48 54 54 50 20 73 65 72 76 65 72 20 70 72 6f 63  HTTP server proc
13660 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  ess */.  int use
13670 43 68 72 6f 6f 74 4a 61 69 6c 20 3d 20 31 3b 20  ChrootJail = 1; 
13680 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73     /* True to us
13690 65 20 61 20 63 68 61 6e 67 65 2d 72 6f 6f 74 20  e a change-root 
136a0 6a 61 69 6c 20 2a 2f 0a 20 20 73 74 72 75 63 74  jail */.  struct
136b0 20 70 61 73 73 77 64 20 2a 70 77 64 20 3d 20 30   passwd *pwd = 0
136c0 3b 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69  ;   /* Informati
136d0 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 75 73 65  on about the use
136e0 72 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 63 6f 72  r */..  /* Recor
136f0 64 20 74 68 65 20 74 69 6d 65 20 77 68 65 6e 20  d the time when 
13700 70 72 6f 63 65 73 73 69 6e 67 20 62 65 67 69 6e  processing begin
13710 73 2e 0a 20 20 2a 2f 0a 20 20 67 65 74 74 69 6d  s..  */.  gettim
13720 65 6f 66 64 61 79 28 26 62 65 67 69 6e 54 69 6d  eofday(&beginTim
13730 65 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 50 61 72  e, 0);..  /* Par
13740 73 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  se command-line 
13750 61 72 67 75 6d 65 6e 74 73 0a 20 20 2a 2f 0a 20  arguments.  */. 
13760 20 77 68 69 6c 65 28 20 61 72 67 63 3e 31 20 26   while( argc>1 &
13770 26 20 61 72 67 76 5b 31 5d 5b 30 5d 3d 3d 27 2d  & argv[1][0]=='-
13780 27 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ' ){.    char *z
13790 20 3d 20 61 72 67 76 5b 31 5d 3b 0a 20 20 20 20   = argv[1];.    
137a0 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 61 72 67  char *zArg = arg
137b0 63 3e 3d 33 20 3f 20 61 72 67 76 5b 32 5d 20 3a  c>=3 ? argv[2] :
137c0 20 22 30 22 3b 0a 20 20 20 20 69 66 28 20 7a 5b   "0";.    if( z[
137d0 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b 31 5d 3d  0]=='-' && z[1]=
137e0 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  ='-' ) z++;.    
137f0 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 75  if( strcmp(z,"-u
13800 73 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ser")==0 ){.    
13810 20 20 7a 50 65 72 6d 55 73 65 72 20 3d 20 7a 41    zPermUser = zA
13820 72 67 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  rg;.    }else if
13830 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 72 6f 6f  ( strcmp(z,"-roo
13840 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
13850 7a 52 6f 6f 74 20 3d 20 7a 41 72 67 3b 0a 20 20  zRoot = zArg;.  
13860 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
13870 6d 70 28 7a 2c 22 2d 6c 6f 67 66 69 6c 65 22 29  mp(z,"-logfile")
13880 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 4c 6f  ==0 ){.      zLo
13890 67 46 69 6c 65 20 3d 20 7a 41 72 67 3b 0a 20 20  gFile = zArg;.  
138a0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
138b0 6d 70 28 7a 2c 22 2d 6d 61 78 2d 61 67 65 22 29  mp(z,"-max-age")
138c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 78 41  ==0 ){.      mxA
138d0 67 65 20 3d 20 61 74 6f 69 28 7a 41 72 67 29 3b  ge = atoi(zArg);
138e0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
138f0 74 72 63 6d 70 28 7a 2c 22 2d 68 74 74 70 73 22  trcmp(z,"-https"
13900 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 73  )==0 ){.      us
13910 65 48 74 74 70 73 20 3d 20 61 74 6f 69 28 7a 41  eHttps = atoi(zA
13920 72 67 29 3b 0a 20 20 20 20 20 20 7a 48 74 74 70  rg);.      zHttp
13930 20 3d 20 75 73 65 48 74 74 70 73 20 3f 20 22 68   = useHttps ? "h
13940 74 74 70 73 22 20 3a 20 22 68 74 74 70 22 3b 0a  ttps" : "http";.
13950 20 20 20 20 20 20 69 66 28 20 75 73 65 48 74 74        if( useHtt
13960 70 73 20 29 20 7a 52 65 6d 6f 74 65 41 64 64 72  ps ) zRemoteAddr
13970 20 3d 20 67 65 74 65 6e 76 28 22 52 45 4d 4f 54   = getenv("REMOT
13980 45 5f 48 4f 53 54 22 29 3b 0a 20 20 20 20 7d 65  E_HOST");.    }e
13990 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
139a0 2c 20 22 2d 70 6f 72 74 22 29 3d 3d 30 20 29 7b  , "-port")==0 ){
139b0 0a 20 20 20 20 20 20 7a 50 6f 72 74 20 3d 20 7a  .      zPort = z
139c0 41 72 67 3b 0a 20 20 20 20 20 20 73 74 61 6e 64  Arg;.      stand
139d0 61 6c 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d  alone = 1;.    }
139e0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
139f0 7a 2c 20 22 2d 66 61 6d 69 6c 79 22 29 3d 3d 30  z, "-family")==0
13a00 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74   ){.      if( st
13a10 72 63 6d 70 28 7a 41 72 67 2c 20 22 69 70 76 34  rcmp(zArg, "ipv4
13a20 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
13a30 20 69 70 76 34 4f 6e 6c 79 20 3d 20 31 3b 0a 20   ipv4Only = 1;. 
13a40 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
13a50 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 69 70 76  trcmp(zArg, "ipv
13a60 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  6")==0 ){.      
13a70 20 20 69 70 76 36 4f 6e 6c 79 20 3d 20 31 3b 0a    ipv6Only = 1;.
13a80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13a90 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e       Malfunction
13aa0 28 35 30 30 2c 20 20 2f 2a 20 4c 4f 47 3a 20 75  (500,  /* LOG: u
13ab0 6e 6b 6e 6f 77 6e 20 49 50 20 70 72 6f 74 6f 63  nknown IP protoc
13ac0 6f 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ol */.          
13ad0 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f            "unkno
13ae0 77 6e 20 49 50 20 70 72 6f 74 6f 63 6f 6c 3a 20  wn IP protocol: 
13af0 5b 25 73 5d 5c 6e 22 2c 20 7a 41 72 67 29 3b 0a  [%s]\n", zArg);.
13b00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
13b10 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20  e if( strcmp(z, 
13b20 22 2d 6a 61 69 6c 22 29 3d 3d 30 20 29 7b 0a 20  "-jail")==0 ){. 
13b30 20 20 20 20 20 69 66 28 20 61 74 6f 69 28 7a 41       if( atoi(zA
13b40 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rg)==0 ){.      
13b50 20 20 75 73 65 43 68 72 6f 6f 74 4a 61 69 6c 20    useChrootJail 
13b60 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
13b70 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
13b80 70 28 7a 2c 20 22 2d 64 65 62 75 67 22 29 3d 3d  p(z, "-debug")==
13b90 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  0 ){.      if( a
13ba0 74 6f 69 28 7a 41 72 67 29 20 29 7b 0a 20 20 20  toi(zArg) ){.   
13bb0 20 20 20 20 20 75 73 65 54 69 6d 65 6f 75 74 20       useTimeout 
13bc0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
13bd0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
13be0 70 28 7a 2c 20 22 2d 69 6e 70 75 74 22 29 3d 3d  p(z, "-input")==
13bf0 30 20 29 7b 0a 20 20 20 20 20 20 66 63 6c 6f 73  0 ){.      fclos
13c00 65 28 73 74 64 69 6e 29 3b 0a 20 20 20 20 20 20  e(stdin);.      
13c10 73 74 64 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 41  stdin = fopen(zA
13c20 72 67 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 20  rg, "rb");.     
13c30 20 69 66 28 20 73 74 64 69 6e 3d 3d 30 20 29 7b   if( stdin==0 ){
13c40 0a 20 20 20 20 20 20 20 20 4d 61 6c 66 75 6e 63  .        Malfunc
13c50 74 69 6f 6e 28 35 30 31 2c 20 2f 2a 20 4c 4f 47  tion(501, /* LOG
13c60 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 2d 2d  : cannot open --
13c70 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
13c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c90 20 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 2d    "cannot open -
13ca0 2d 69 6e 70 75 74 20 66 69 6c 65 20 5c 22 25 73  -input file \"%s
13cb0 5c 22 5c 6e 22 2c 20 7a 41 72 67 29 3b 0a 20 20  \"\n", zArg);.  
13cc0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
13cd0 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d  if( strcmp(z, "-
13ce0 64 61 74 65 74 65 73 74 22 29 3d 3d 30 20 29 7b  datetest")==0 ){
13cf0 0a 20 20 20 20 20 20 54 65 73 74 50 61 72 73 65  .      TestParse
13d00 52 66 63 38 32 32 44 61 74 65 28 29 3b 0a 20 20  Rfc822Date();.  
13d10 20 20 20 20 70 72 69 6e 74 66 28 22 4f 6b 5c 6e      printf("Ok\n
13d20 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 30  ");.      exit(0
13d30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
13d40 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28      Malfunction(
13d50 35 31 30 2c 20 2f 2a 20 4c 4f 47 3a 20 75 6e 6b  510, /* LOG: unk
13d60 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  nown command-lin
13d70 65 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20 6c 61  e argument on la
13d80 75 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  unch */.        
13d90 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f            "unkno
13da0 77 6e 20 61 72 67 75 6d 65 6e 74 3a 20 5b 25 73  wn argument: [%s
13db0 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a  ]\n", z);.    }.
13dc0 20 20 20 20 61 72 67 76 20 2b 3d 20 32 3b 0a 20      argv += 2;. 
13dd0 20 20 20 61 72 67 63 20 2d 3d 20 32 3b 0a 20 20     argc -= 2;.  
13de0 7d 0a 20 20 69 66 28 20 7a 52 6f 6f 74 3d 3d 30  }.  if( zRoot==0
13df0 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61 6e   ){.    if( stan
13e00 64 61 6c 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20  dalone ){.      
13e10 7a 52 6f 6f 74 20 3d 20 22 2e 22 3b 0a 20 20 20  zRoot = ".";.   
13e20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d 61   }else{.      Ma
13e30 6c 66 75 6e 63 74 69 6f 6e 28 35 32 30 2c 20 2f  lfunction(520, /
13e40 2a 20 4c 4f 47 3a 20 2d 2d 72 6f 6f 74 20 61 72  * LOG: --root ar
13e50 67 75 6d 65 6e 74 20 6d 69 73 73 69 6e 67 20 2a  gument missing *
13e60 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
13e70 20 20 20 20 22 6e 6f 20 2d 2d 72 6f 6f 74 20 73      "no --root s
13e80 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20  pecified");.    
13e90 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 43 68  }.  }.  .  /* Ch
13ea0 61 6e 67 65 20 64 69 72 65 63 74 6f 72 69 65 73  ange directories
13eb0 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   to the root of 
13ec0 74 68 65 20 48 54 54 50 20 66 69 6c 65 73 79 73  the HTTP filesys
13ed0 74 65 6d 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20  tem.  Then.  ** 
13ee0 63 72 65 61 74 65 20 61 20 63 68 72 6f 6f 74 20  create a chroot 
13ef0 6a 61 69 6c 20 74 68 65 72 65 2e 0a 20 20 2a 2f  jail there..  */
13f00 0a 20 20 69 66 28 20 63 68 64 69 72 28 7a 52 6f  .  if( chdir(zRo
13f10 6f 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 4d 61  ot)!=0 ){.    Ma
13f20 6c 66 75 6e 63 74 69 6f 6e 28 35 33 30 2c 20 2f  lfunction(530, /
13f30 2a 20 4c 4f 47 3a 20 63 68 64 69 72 28 29 20 66  * LOG: chdir() f
13f40 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  ailed */.       
13f50 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74           "cannot
13f60 20 63 68 61 6e 67 65 20 74 6f 20 64 69 72 65 63   change to direc
13f70 74 6f 72 79 20 5b 25 73 5d 22 2c 20 7a 52 6f 6f  tory [%s]", zRoo
13f80 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  t);.  }..  /* Ge
13f90 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  t information ab
13fa0 6f 75 74 20 74 68 65 20 75 73 65 72 20 69 66 20  out the user if 
13fb0 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69  available */.  i
13fc0 66 28 20 7a 50 65 72 6d 55 73 65 72 20 29 20 70  f( zPermUser ) p
13fd0 77 64 20 3d 20 67 65 74 70 77 6e 61 6d 28 7a 50  wd = getpwnam(zP
13fe0 65 72 6d 55 73 65 72 29 3b 0a 0a 20 20 2f 2a 20  ermUser);..  /* 
13ff0 45 6e 74 65 72 20 74 68 65 20 63 68 72 6f 6f 74  Enter the chroot
14000 20 6a 61 69 6c 20 69 66 20 72 65 71 75 65 73 74   jail if request
14010 65 64 20 2a 2f 20 20 0a 20 20 69 66 28 20 7a 50  ed */  .  if( zP
14020 65 72 6d 55 73 65 72 20 26 26 20 75 73 65 43 68  ermUser && useCh
14030 72 6f 6f 74 4a 61 69 6c 20 26 26 20 67 65 74 75  rootJail && getu
14040 69 64 28 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  id()==0 ){.    i
14050 66 28 20 63 68 72 6f 6f 74 28 22 2e 22 29 3c 30  f( chroot(".")<0
14060 20 29 7b 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e   ){.      Malfun
14070 63 74 69 6f 6e 28 35 34 30 2c 20 2f 2a 20 4c 4f  ction(540, /* LO
14080 47 3a 20 63 68 72 6f 6f 74 28 29 20 66 61 69 6c  G: chroot() fail
14090 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
140a0 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20          "unable 
140b0 74 6f 20 63 72 65 61 74 65 20 63 68 72 6f 6f 74  to create chroot
140c0 20 6a 61 69 6c 22 29 3b 0a 20 20 20 20 7d 65 6c   jail");.    }el
140d0 73 65 7b 0a 20 20 20 20 20 20 7a 52 6f 6f 74 20  se{.      zRoot 
140e0 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = "";.    }.  }.
140f0 0a 20 20 2f 2a 20 41 63 74 69 76 61 74 65 20 74  .  /* Activate t
14100 68 65 20 73 65 72 76 65 72 2c 20 69 66 20 72 65  he server, if re
14110 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28  quested */.  if(
14120 20 7a 50 6f 72 74 20 26 26 20 68 74 74 70 5f 73   zPort && http_s
14130 65 72 76 65 72 28 7a 50 6f 72 74 2c 20 30 29 20  erver(zPort, 0) 
14140 29 7b 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69  ){.    Malfuncti
14150 6f 6e 28 35 35 30 2c 20 2f 2a 20 4c 4f 47 3a 20  on(550, /* LOG: 
14160 73 65 72 76 65 72 20 73 74 61 72 74 75 70 20 66  server startup f
14170 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  ailed */.       
14180 20 20 20 20 20 20 20 20 20 22 66 61 69 6c 65 64           "failed
14190 20 74 6f 20 73 74 61 72 74 20 73 65 72 76 65 72   to start server
141a0 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 72  ");.  }..  /* Dr
141b0 6f 70 20 72 6f 6f 74 20 70 72 69 76 69 6c 65 67  op root privileg
141c0 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  es..  */.  if( z
141d0 50 65 72 6d 55 73 65 72 20 29 7b 0a 20 20 20 20  PermUser ){.    
141e0 69 66 28 20 70 77 64 20 29 7b 0a 20 20 20 20 20  if( pwd ){.     
141f0 20 69 66 28 20 73 65 74 67 69 64 28 70 77 64 2d   if( setgid(pwd-
14200 3e 70 77 5f 67 69 64 29 20 29 7b 0a 20 20 20 20  >pw_gid) ){.    
14210 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28      Malfunction(
14220 35 36 30 2c 20 2f 2a 20 4c 4f 47 3a 20 73 65 74  560, /* LOG: set
14230 67 69 64 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a  gid() failed */.
14240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14250 20 20 20 20 22 63 61 6e 6e 6f 74 20 73 65 74 20      "cannot set 
14260 67 72 6f 75 70 2d 69 64 20 74 6f 20 25 64 22 2c  group-id to %d",
14270 20 70 77 64 2d 3e 70 77 5f 67 69 64 29 3b 0a 20   pwd->pw_gid);. 
14280 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
14290 20 73 65 74 75 69 64 28 70 77 64 2d 3e 70 77 5f   setuid(pwd->pw_
142a0 75 69 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  uid) ){.        
142b0 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 35 37 30 2c  Malfunction(570,
142c0 20 2f 2a 20 4c 4f 47 3a 20 73 65 74 75 69 64 28   /* LOG: setuid(
142d0 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20  ) failed */.    
142e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142f0 22 63 61 6e 6e 6f 74 20 73 65 74 20 75 73 65 72  "cannot set user
14300 2d 69 64 20 74 6f 20 25 64 22 2c 20 70 77 64 2d  -id to %d", pwd-
14310 3e 70 77 5f 75 69 64 29 3b 0a 20 20 20 20 20 20  >pw_uid);.      
14320 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
14330 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 35     Malfunction(5
14340 38 30 2c 20 2f 2a 20 4c 4f 47 3a 20 75 6e 6b 6e  80, /* LOG: unkn
14350 6f 77 6e 20 75 73 65 72 20 2a 2f 0a 20 20 20 20  own user */.    
14360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 6e                "n
14370 6f 20 73 75 63 68 20 75 73 65 72 20 5b 25 73 5d  o such user [%s]
14380 22 2c 20 7a 50 65 72 6d 55 73 65 72 29 3b 0a 20  ", zPermUser);. 
14390 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 67     }.  }.  if( g
143a0 65 74 75 69 64 28 29 3d 3d 30 20 29 7b 0a 20 20  etuid()==0 ){.  
143b0 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 35 39    Malfunction(59
143c0 30 2c 20 2f 2a 20 4c 4f 47 3a 20 63 61 6e 6e 6f  0, /* LOG: canno
143d0 74 20 72 75 6e 20 61 73 20 72 6f 6f 74 20 2a 2f  t run as root */
143e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
143f0 20 22 63 61 6e 6e 6f 74 20 72 75 6e 20 61 73 20   "cannot run as 
14400 72 6f 6f 74 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f  root");.  }..  /
14410 2a 20 47 65 74 20 74 68 65 20 49 50 20 61 64 64  * Get the IP add
14420 72 65 73 73 20 66 72 6f 6d 20 77 68 65 6e 63 65  ress from whence
14430 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 72 69   the request ori
14440 67 69 6e 61 74 65 73 0a 20 20 2a 2f 0a 20 20 69  ginates.  */.  i
14450 66 28 20 7a 52 65 6d 6f 74 65 41 64 64 72 3d 3d  f( zRemoteAddr==
14460 30 20 29 7b 0a 20 20 20 20 61 64 64 72 65 73 73  0 ){.    address
14470 20 72 65 6d 6f 74 65 41 64 64 72 3b 0a 20 20 20   remoteAddr;.   
14480 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 73 69   unsigned int si
14490 7a 65 20 3d 20 73 69 7a 65 6f 66 28 72 65 6d 6f  ze = sizeof(remo
144a0 74 65 41 64 64 72 29 3b 0a 20 20 20 20 63 68 61  teAddr);.    cha
144b0 72 20 7a 48 6f 73 74 5b 4e 49 5f 4d 41 58 48 4f  r zHost[NI_MAXHO
144c0 53 54 5d 3b 0a 20 20 20 20 69 66 28 20 67 65 74  ST];.    if( get
144d0 70 65 65 72 6e 61 6d 65 28 30 2c 20 26 72 65 6d  peername(0, &rem
144e0 6f 74 65 41 64 64 72 2e 73 61 2c 20 26 73 69 7a  oteAddr.sa, &siz
144f0 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  e)>=0 ){.      g
14500 65 74 6e 61 6d 65 69 6e 66 6f 28 26 72 65 6d 6f  etnameinfo(&remo
14510 74 65 41 64 64 72 2e 73 61 2c 20 73 69 7a 65 2c  teAddr.sa, size,
14520 20 7a 48 6f 73 74 2c 20 73 69 7a 65 6f 66 28 7a   zHost, sizeof(z
14530 48 6f 73 74 29 2c 20 30 2c 20 30 2c 0a 20 20 20  Host), 0, 0,.   
14540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
14550 49 5f 4e 55 4d 45 52 49 43 48 4f 53 54 29 3b 0a  I_NUMERICHOST);.
14560 20 20 20 20 20 20 7a 52 65 6d 6f 74 65 41 64 64        zRemoteAdd
14570 72 20 3d 20 53 74 72 44 75 70 28 7a 48 6f 73 74  r = StrDup(zHost
14580 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
14590 66 28 20 7a 52 65 6d 6f 74 65 41 64 64 72 21 3d  f( zRemoteAddr!=
145a0 30 0a 20 20 20 26 26 20 73 74 72 6e 63 6d 70 28  0.   && strncmp(
145b0 7a 52 65 6d 6f 74 65 41 64 64 72 2c 20 22 3a 3a  zRemoteAddr, "::
145c0 66 66 66 66 3a 22 2c 20 37 29 3d 3d 30 0a 20 20  ffff:", 7)==0.  
145d0 20 26 26 20 73 74 72 63 68 72 28 7a 52 65 6d 6f   && strchr(zRemo
145e0 74 65 41 64 64 72 2b 37 2c 20 27 3a 27 29 3d 3d  teAddr+7, ':')==
145f0 30 0a 20 20 20 26 26 20 73 74 72 63 68 72 28 7a  0.   && strchr(z
14600 52 65 6d 6f 74 65 41 64 64 72 2b 37 2c 20 27 2e  RemoteAddr+7, '.
14610 27 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 7a  ')!=0.  ){.    z
14620 52 65 6d 6f 74 65 41 64 64 72 20 2b 3d 20 37 3b  RemoteAddr += 7;
14630 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
14640 73 73 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  ss the input str
14650 65 61 6d 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  eam */.  for(i=0
14660 3b 20 69 3c 31 30 30 3b 20 69 2b 2b 29 7b 0a 20  ; i<100; i++){. 
14670 20 20 20 50 72 6f 63 65 73 73 4f 6e 65 52 65 71     ProcessOneReq
14680 75 65 73 74 28 30 29 3b 0a 20 20 7d 0a 20 20 50  uest(0);.  }.  P
14690 72 6f 63 65 73 73 4f 6e 65 52 65 71 75 65 73 74  rocessOneRequest
146a0 28 31 29 3b 0a 20 20 65 78 69 74 28 30 29 3b 0a  (1);.  exit(0);.
146b0 7d 0a 0a 23 69 66 20 30 0a 2f 2a 20 43 6f 70 79  }..#if 0./* Copy
146c0 2f 70 61 73 74 65 20 74 68 65 20 66 6f 6c 6c 6f  /paste the follo
146d0 77 69 6e 67 20 74 65 78 74 20 69 6e 74 6f 20 53  wing text into S
146e0 51 4c 69 74 65 20 74 6f 20 67 65 6e 65 72 61 74  QLite to generat
146f0 65 20 74 68 65 20 78 72 65 66 0a 2a 2a 20 74 61  e the xref.** ta
14700 62 6c 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ble that describ
14710 65 73 20 61 6c 6c 20 65 72 72 6f 72 20 63 6f 64  es all error cod
14720 65 73 2e 0a 2a 2f 0a 42 45 47 49 4e 3b 0a 43 52  es..*/.BEGIN;.CR
14730 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
14740 54 20 45 58 49 53 54 53 20 78 72 65 66 28 6c 69  T EXISTS xref(li
14750 6e 65 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49  neno INTEGER PRI
14760 4d 41 52 59 20 4b 45 59 2c 20 64 65 73 63 20 54  MARY KEY, desc T
14770 45 58 54 29 3b 0a 44 45 4c 45 54 45 20 46 52 4f  EXT);.DELETE FRO
14780 4d 20 58 72 65 66 3b 0a 49 4e 53 45 52 54 20 49  M Xref;.INSERT I
14790 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28  NTO xref VALUES(
147a0 31 30 30 2c 27 4d 61 6c 6c 6f 63 28 29 20 66 61  100,'Malloc() fa
147b0 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54 20 49  iled');.INSERT I
147c0 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28  NTO xref VALUES(
147d0 31 31 30 2c 27 4e 6f 74 20 61 75 74 68 6f 72 69  110,'Not authori
147e0 7a 65 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  zed');.INSERT IN
147f0 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 31  TO xref VALUES(1
14800 32 30 2c 27 43 47 49 20 45 72 72 6f 72 27 29 3b  20,'CGI Error');
14810 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65  .INSERT INTO xre
14820 66 20 56 41 4c 55 45 53 28 31 33 30 2c 27 54 69  f VALUES(130,'Ti
14830 6d 65 6f 75 74 27 29 3b 0a 49 4e 53 45 52 54 20  meout');.INSERT 
14840 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53  INTO xref VALUES
14850 28 31 34 30 2c 27 43 47 49 20 73 63 72 69 70 74  (140,'CGI script
14860 20 69 73 20 77 72 69 74 61 62 6c 65 27 29 3b 0a   is writable');.
14870 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66  INSERT INTO xref
14880 20 56 41 4c 55 45 53 28 31 35 30 2c 27 43 61 6e   VALUES(150,'Can
14890 6e 6f 74 20 6f 70 65 6e 20 2d 61 75 74 68 20 66  not open -auth f
148a0 69 6c 65 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  ile');.INSERT IN
148b0 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 31  TO xref VALUES(1
148c0 36 30 2c 27 68 74 74 70 20 72 65 71 75 65 73 74  60,'http request
148d0 20 6f 6e 20 68 74 74 70 73 2d 6f 6e 6c 79 20 70   on https-only p
148e0 61 67 65 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  age');.INSERT IN
148f0 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 31  TO xref VALUES(1
14900 37 30 2c 27 2d 61 75 74 68 20 72 65 64 69 72 65  70,'-auth redire
14910 63 74 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54  ct');.INSERT INT
14920 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 31 38  O xref VALUES(18
14930 30 2c 27 6d 61 6c 66 6f 72 6d 65 64 20 65 6e 74  0,'malformed ent
14940 72 79 20 69 6e 20 2d 61 75 74 68 20 66 69 6c 65  ry in -auth file
14950 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
14960 78 72 65 66 20 56 41 4c 55 45 53 28 31 39 30 2c  xref VALUES(190,
14970 27 63 68 64 69 72 28 29 20 66 61 69 6c 65 64 27  'chdir() failed'
14980 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  );.INSERT INTO x
14990 72 65 66 20 56 41 4c 55 45 53 28 32 30 30 2c 27  ref VALUES(200,'
149a0 62 61 64 20 70 72 6f 74 6f 63 6f 6c 20 69 6e 20  bad protocol in 
149b0 48 54 54 50 20 68 65 61 64 65 72 27 29 3b 0a 49  HTTP header');.I
149c0 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
149d0 56 41 4c 55 45 53 28 32 31 30 2c 27 45 6d 70 74  VALUES(210,'Empt
149e0 79 20 72 65 71 75 65 73 74 20 55 52 49 27 29 3b  y request URI');
149f0 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65  .INSERT INTO xre
14a00 66 20 56 41 4c 55 45 53 28 32 32 30 2c 27 55 6e  f VALUES(220,'Un
14a10 6b 6e 6f 77 6e 20 72 65 71 75 65 73 74 20 6d 65  known request me
14a20 74 68 6f 64 27 29 3b 0a 49 4e 53 45 52 54 20 49  thod');.INSERT I
14a30 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28  NTO xref VALUES(
14a40 32 33 30 2c 27 52 65 66 65 72 72 65 72 20 69 73  230,'Referrer is
14a50 20 64 65 76 69 64 73 2e 6e 65 74 27 29 3b 0a 49   devids.net');.I
14a60 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
14a70 56 41 4c 55 45 53 28 32 34 30 2c 27 49 6c 6c 65  VALUES(240,'Ille
14a80 67 61 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 48  gal content in H
14a90 4f 53 54 3a 20 70 61 72 61 6d 65 74 65 72 27 29  OST: parameter')
14aa0 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72  ;.INSERT INTO xr
14ab0 65 66 20 56 41 4c 55 45 53 28 32 35 30 2c 27 44  ef VALUES(250,'D
14ac0 69 73 61 6c 6c 6f 77 65 64 20 75 73 65 72 20 61  isallowed user a
14ad0 67 65 6e 74 27 29 3b 0a 49 4e 53 45 52 54 20 49  gent');.INSERT I
14ae0 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28  NTO xref VALUES(
14af0 32 36 30 2c 27 44 69 73 61 6c 6c 6f 77 65 64 20  260,'Disallowed 
14b00 72 65 66 65 72 72 65 72 27 29 3b 0a 49 4e 53 45  referrer');.INSE
14b10 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
14b20 55 45 53 28 32 37 30 2c 27 52 65 71 75 65 73 74  UES(270,'Request
14b30 20 74 6f 6f 20 6c 61 72 67 65 27 29 3b 0a 49 4e   too large');.IN
14b40 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56  SERT INTO xref V
14b50 41 4c 55 45 53 28 32 38 30 2c 27 6d 6b 73 74 65  ALUES(280,'mkste
14b60 6d 70 28 29 20 66 61 69 6c 65 64 27 29 3b 0a 49  mp() failed');.I
14b70 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
14b80 56 41 4c 55 45 53 28 32 39 30 2c 27 63 61 6e 6e  VALUES(290,'cann
14b90 6f 74 20 63 72 65 61 74 65 20 74 65 6d 70 20 66  ot create temp f
14ba0 69 6c 65 20 66 6f 72 20 50 4f 53 54 20 63 6f 6e  ile for POST con
14bb0 74 65 6e 74 27 29 3b 0a 49 4e 53 45 52 54 20 49  tent');.INSERT I
14bc0 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28  NTO xref VALUES(
14bd0 33 30 30 2c 27 50 61 74 68 20 65 6c 65 6d 65 6e  300,'Path elemen
14be0 74 20 62 65 67 69 6e 73 20 77 69 74 68 20 2e 20  t begins with . 
14bf0 6f 72 20 2d 27 29 3b 0a 49 4e 53 45 52 54 20 49  or -');.INSERT I
14c00 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28  NTO xref VALUES(
14c10 33 31 30 2c 27 55 52 49 20 64 6f 65 73 20 6e 6f  310,'URI does no
14c20 74 20 73 74 61 72 74 20 77 69 74 68 20 2f 27 29  t start with /')
14c30 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72  ;.INSERT INTO xr
14c40 65 66 20 56 41 4c 55 45 53 28 33 32 30 2c 27 55  ef VALUES(320,'U
14c50 52 49 20 74 6f 6f 20 6c 6f 6e 67 27 29 3b 0a 49  RI too long');.I
14c60 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
14c70 56 41 4c 55 45 53 28 33 33 30 2c 27 4d 69 73 73  VALUES(330,'Miss
14c80 69 6e 67 20 48 4f 53 54 3a 20 70 61 72 61 6d 65  ing HOST: parame
14c90 74 65 72 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  ter');.INSERT IN
14ca0 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 33  TO xref VALUES(3
14cb0 34 30 2c 27 48 4f 53 54 20 70 61 72 61 6d 65 74  40,'HOST paramet
14cc0 65 72 20 74 6f 6f 20 6c 6f 6e 67 27 29 3b 0a 49  er too long');.I
14cd0 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
14ce0 56 41 4c 55 45 53 28 33 35 30 2c 27 2a 2e 77 65  VALUES(350,'*.we
14cf0 62 73 69 74 65 20 70 65 72 6d 69 73 73 69 6f 6e  bsite permission
14d00 73 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f  s');.INSERT INTO
14d10 20 78 72 65 66 20 56 41 4c 55 45 53 28 33 36 30   xref VALUES(360
14d20 2c 27 63 68 64 69 72 28 29 20 66 61 69 6c 65 64  ,'chdir() failed
14d30 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
14d40 78 72 65 66 20 56 41 4c 55 45 53 28 33 37 30 2c  xref VALUES(370,
14d50 27 72 65 64 69 72 65 63 74 20 74 6f 20 6e 6f 74  'redirect to not
14d60 2d 66 6f 75 6e 64 20 70 61 67 65 27 29 3b 0a 49  -found page');.I
14d70 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
14d80 56 41 4c 55 45 53 28 33 38 30 2c 27 55 52 49 20  VALUES(380,'URI 
14d90 6e 6f 74 20 66 6f 75 6e 64 27 29 3b 0a 49 4e 53  not found');.INS
14da0 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41  ERT INTO xref VA
14db0 4c 55 45 53 28 33 39 30 2c 27 46 69 6c 65 20 6e  LUES(390,'File n
14dc0 6f 74 20 72 65 61 64 61 62 6c 65 27 29 3b 0a 49  ot readable');.I
14dd0 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
14de0 56 41 4c 55 45 53 28 34 30 30 2c 27 55 52 49 20  VALUES(400,'URI 
14df0 69 73 20 61 20 64 69 72 65 63 74 6f 72 79 20 77  is a directory w
14e00 2f 6f 20 69 6e 64 65 78 2e 68 74 6d 6c 27 29 3b  /o index.html');
14e10 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65  .INSERT INTO xre
14e20 66 20 56 41 4c 55 45 53 28 34 31 30 2c 27 72 65  f VALUES(410,'re
14e30 64 69 72 65 63 74 20 74 6f 20 61 64 64 20 74 72  direct to add tr
14e40 61 69 6c 69 6e 67 20 2f 27 29 3b 0a 49 4e 53 45  ailing /');.INSE
14e50 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
14e60 55 45 53 28 34 32 30 2c 27 63 68 64 69 72 28 29  UES(420,'chdir()
14e70 20 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52   failed');.INSER
14e80 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
14e90 45 53 28 34 33 30 2c 27 64 75 70 28 30 29 20 66  ES(430,'dup(0) f
14ea0 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54 20  ailed');.INSERT 
14eb0 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53  INTO xref VALUES
14ec0 28 34 34 30 2c 27 70 69 70 65 28 29 20 66 61 69  (440,'pipe() fai
14ed0 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  led');.INSERT IN
14ee0 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 34  TO xref VALUES(4
14ef0 35 30 2c 27 64 75 70 28 31 29 20 66 61 69 6c 65  50,'dup(1) faile
14f00 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f  d');.INSERT INTO
14f10 20 78 72 65 66 20 56 41 4c 55 45 53 28 34 36 30   xref VALUES(460
14f20 2c 27 45 78 63 65 73 73 20 55 52 49 20 63 6f 6e  ,'Excess URI con
14f30 74 65 6e 74 20 70 61 73 74 20 73 74 61 74 69 63  tent past static
14f40 20 66 69 6c 65 20 6e 61 6d 65 27 29 3b 0a 49 4e   file name');.IN
14f50 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56  SERT INTO xref V
14f60 41 4c 55 45 53 28 34 37 30 2c 27 45 54 61 67 20  ALUES(470,'ETag 
14f70 43 61 63 68 65 20 48 69 74 27 29 3b 0a 49 4e 53  Cache Hit');.INS
14f80 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41  ERT INTO xref VA
14f90 4c 55 45 53 28 34 38 30 2c 27 66 6f 70 65 6e 28  LUES(480,'fopen(
14fa0 29 20 66 61 69 6c 65 64 20 66 6f 72 20 73 74 61  ) failed for sta
14fb0 74 69 63 20 63 6f 6e 74 65 6e 74 27 29 3b 0a 49  tic content');.I
14fc0 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
14fd0 56 41 4c 55 45 53 28 32 2c 27 4e 6f 72 6d 61 6c  VALUES(2,'Normal
14fe0 20 48 45 41 44 20 72 65 70 6c 79 27 29 3b 0a 49   HEAD reply');.I
14ff0 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
15000 56 41 4c 55 45 53 28 30 2c 27 4e 6f 72 6d 61 6c  VALUES(0,'Normal
15010 20 72 65 70 6c 79 27 29 3b 0a 49 4e 53 45 52 54   reply');.INSERT
15020 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45   INTO xref VALUE
15030 53 28 35 30 30 2c 27 75 6e 6b 6e 6f 77 6e 20 49  S(500,'unknown I
15040 50 20 70 72 6f 74 6f 63 6f 6c 27 29 3b 0a 49 4e  P protocol');.IN
15050 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56  SERT INTO xref V
15060 41 4c 55 45 53 28 35 30 31 2c 27 63 61 6e 6e 6f  ALUES(501,'canno
15070 74 20 6f 70 65 6e 20 2d 2d 69 6e 70 75 74 20 66  t open --input f
15080 69 6c 65 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  ile');.INSERT IN
15090 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 35  TO xref VALUES(5
150a0 31 30 2c 27 75 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d  10,'unknown comm
150b0 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e  and-line argumen
150c0 74 20 6f 6e 20 6c 61 75 6e 63 68 27 29 3b 0a 49  t on launch');.I
150d0 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
150e0 56 41 4c 55 45 53 28 35 32 30 2c 27 2d 2d 72 6f  VALUES(520,'--ro
150f0 6f 74 20 61 72 67 75 6d 65 6e 74 20 6d 69 73 73  ot argument miss
15100 69 6e 67 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  ing');.INSERT IN
15110 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 35  TO xref VALUES(5
15120 33 30 2c 27 63 68 64 69 72 28 29 20 66 61 69 6c  30,'chdir() fail
15130 65 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54  ed');.INSERT INT
15140 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 35 34  O xref VALUES(54
15150 30 2c 27 63 68 72 6f 6f 74 28 29 20 66 61 69 6c  0,'chroot() fail
15160 65 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54  ed');.INSERT INT
15170 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 35 35  O xref VALUES(55
15180 30 2c 27 73 65 72 76 65 72 20 73 74 61 72 74 75  0,'server startu
15190 70 20 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45  p failed');.INSE
151a0 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
151b0 55 45 53 28 35 36 30 2c 27 73 65 74 67 69 64 28  UES(560,'setgid(
151c0 29 20 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45  ) failed');.INSE
151d0 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
151e0 55 45 53 28 35 37 30 2c 27 73 65 74 75 69 64 28  UES(570,'setuid(
151f0 29 20 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45  ) failed');.INSE
15200 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
15210 55 45 53 28 35 38 30 2c 27 75 6e 6b 6e 6f 77 6e  UES(580,'unknown
15220 20 75 73 65 72 27 29 3b 0a 49 4e 53 45 52 54 20   user');.INSERT 
15230 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53  INTO xref VALUES
15240 28 35 39 30 2c 27 63 61 6e 6e 6f 74 20 72 75 6e  (590,'cannot run
15250 20 61 73 20 72 6f 6f 74 27 29 3b 0a 49 4e 53 45   as root');.INSE
15260 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
15270 55 45 53 28 36 30 30 2c 27 6d 61 6c 6c 6f 63 28  UES(600,'malloc(
15280 29 20 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45  ) failed');.INSE
15290 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
152a0 55 45 53 28 36 31 30 2c 27 6d 61 6c 6c 6f 63 28  UES(610,'malloc(
152b0 29 20 66 61 69 6c 65 64 27 29 3b 0a 43 4f 4d 4d  ) failed');.COMM
152c0 49 54 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  IT;.#endif /* SQ
152d0 4c 20 2a 2f 0a                                   L */.