Documentation Source Text

Hex Artifact Content
Login

Artifact aa3383c831b258b6d84b7c132b60b04151724333b1c686c8b272e31e817494c1:


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 73 69 7a 65  e_t size;.  size
56e0: 5f 74 20 6e 30 2c 20 6e 31 2c 20 6e 32 3b 0a 0a  _t n0, n1, n2;..
56f0: 20 20 69 66 28 20 7a 53 72 63 3d 3d 30 20 29 20    if( zSrc==0 ) 
5700: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
5710: 7a 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75  zPrior==0 ) retu
5720: 72 6e 20 53 74 72 44 75 70 28 7a 53 72 63 29 3b  rn StrDup(zSrc);
5730: 0a 20 20 6e 30 20 3d 20 73 74 72 6c 65 6e 28 7a  .  n0 = strlen(z
5740: 50 72 69 6f 72 29 3b 0a 20 20 6e 31 20 3d 20 73  Prior);.  n1 = s
5750: 74 72 6c 65 6e 28 7a 53 65 70 29 3b 0a 20 20 6e  trlen(zSep);.  n
5760: 32 20 3d 20 73 74 72 6c 65 6e 28 7a 53 72 63 29  2 = strlen(zSrc)
5770: 3b 0a 20 20 73 69 7a 65 20 3d 20 6e 30 2b 6e 31  ;.  size = n0+n1
5780: 2b 6e 32 2b 31 3b 0a 20 20 7a 44 65 73 74 20 3d  +n2+1;.  zDest =
5790: 20 28 63 68 61 72 2a 29 53 61 66 65 4d 61 6c 6c   (char*)SafeMall
57a0: 6f 63 28 20 73 69 7a 65 20 29 3b 0a 20 20 6d 65  oc( size );.  me
57b0: 6d 63 70 79 28 7a 44 65 73 74 2c 20 7a 50 72 69  mcpy(zDest, zPri
57c0: 6f 72 2c 20 6e 30 29 3b 0a 20 20 66 72 65 65 28  or, n0);.  free(
57d0: 7a 50 72 69 6f 72 29 3b 0a 20 20 6d 65 6d 63 70  zPrior);.  memcp
57e0: 79 28 26 7a 44 65 73 74 5b 6e 30 5d 2c 7a 53 65  y(&zDest[n0],zSe
57f0: 70 2c 6e 31 29 3b 0a 20 20 6d 65 6d 63 70 79 28  p,n1);.  memcpy(
5800: 26 7a 44 65 73 74 5b 6e 30 2b 6e 31 5d 2c 7a 53  &zDest[n0+n1],zS
5810: 72 63 2c 6e 32 2b 31 29 3b 0a 20 20 72 65 74 75  rc,n2+1);.  retu
5820: 72 6e 20 7a 44 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn zDest;.}../*.
5830: 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 45  ** Compare two E
5840: 54 61 67 20 76 61 6c 75 65 73 2e 20 52 65 74 75  Tag values. Retu
5850: 72 6e 20 30 20 69 66 20 74 68 65 79 20 6d 61 74  rn 0 if they mat
5860: 63 68 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20  ch and non-zero 
5870: 69 66 20 74 68 65 79 20 64 69 66 66 65 72 2e 0a  if they differ..
5880: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 65 20 6f 6e  **.** The one on
5890: 20 74 68 65 20 6c 65 66 74 20 6d 69 67 68 74 20   the left might 
58a0: 62 65 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  be a NULL pointe
58b0: 72 20 61 6e 64 20 69 74 20 6d 69 67 68 74 20 62  r and it might b
58c0: 65 20 71 75 6f 74 65 64 2e 0a 2a 2f 0a 73 74 61  e quoted..*/.sta
58d0: 74 69 63 20 69 6e 74 20 43 6f 6d 70 61 72 65 45  tic int CompareE
58e0: 74 61 67 73 28 63 6f 6e 73 74 20 63 68 61 72 20  tags(const char 
58f0: 2a 7a 41 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *zA, const char 
5900: 2a 7a 42 29 7b 0a 20 20 69 66 28 20 7a 41 3d 3d  *zB){.  if( zA==
5910: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
5920: 69 66 28 20 7a 41 5b 30 5d 3d 3d 27 22 27 20 29  if( zA[0]=='"' )
5930: 7b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 42 20 3d  {.    int lenB =
5940: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 29   (int)strlen(zB)
5950: 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d  ;.    if( strncm
5960: 70 28 7a 41 2b 31 2c 20 7a 42 2c 20 6c 65 6e 42  p(zA+1, zB, lenB
5970: 29 3d 3d 30 20 26 26 20 7a 41 5b 6c 65 6e 42 2b  )==0 && zA[lenB+
5980: 31 5d 3d 3d 27 22 27 20 29 20 72 65 74 75 72 6e  1]=='"' ) return
5990: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
59a0: 20 73 74 72 63 6d 70 28 7a 41 2c 20 7a 42 29 3b   strcmp(zA, zB);
59b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 72 65 61 6b 20  .}../*.** Break 
59c0: 61 20 6c 69 6e 65 20 61 74 20 74 68 65 20 66 69  a line at the fi
59d0: 72 73 74 20 5c 6e 20 6f 72 20 5c 72 20 63 68 61  rst \n or \r cha
59e0: 72 61 63 74 65 72 20 73 65 65 6e 2e 0a 2a 2f 0a  racter seen..*/.
59f0: 73 74 61 74 69 63 20 76 6f 69 64 20 52 65 6d 6f  static void Remo
5a00: 76 65 4e 65 77 6c 69 6e 65 28 63 68 61 72 20 2a  veNewline(char *
5a10: 7a 29 7b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  z){.  if( z==0 )
5a20: 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65   return;.  while
5a30: 28 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c 6e 27  ( *z && *z!='\n'
5a40: 20 26 26 20 2a 7a 21 3d 27 5c 72 27 20 29 7b 20   && *z!='\r' ){ 
5a50: 7a 2b 2b 3b 20 7d 0a 20 20 2a 7a 20 3d 20 30 3b  z++; }.  *z = 0;
5a60: 0a 7d 0a 0a 2f 2a 20 52 65 6e 64 65 72 20 73 65  .}../* Render se
5a70: 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30  conds since 1970
5a80: 20 61 73 20 61 6e 20 52 46 43 38 32 32 20 64 61   as an RFC822 da
5a90: 74 65 20 73 74 72 69 6e 67 2e 20 20 52 65 74 75  te string.  Retu
5aa0: 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
5ab0: 74 6f 20 74 68 61 74 20 73 74 72 69 6e 67 20 69  to that string i
5ac0: 6e 20 61 20 73 74 61 74 69 63 20 62 75 66 66 65  n a static buffe
5ad0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  r..*/.static cha
5ae0: 72 20 2a 52 66 63 38 32 32 44 61 74 65 28 74 69  r *Rfc822Date(ti
5af0: 6d 65 5f 74 20 74 29 7b 0a 20 20 73 74 72 75 63  me_t t){.  struc
5b00: 74 20 74 6d 20 2a 74 6d 3b 0a 20 20 73 74 61 74  t tm *tm;.  stat
5b10: 69 63 20 63 68 61 72 20 7a 44 61 74 65 5b 31 30  ic char zDate[10
5b20: 30 5d 3b 0a 20 20 74 6d 20 3d 20 67 6d 74 69 6d  0];.  tm = gmtim
5b30: 65 28 26 74 29 3b 0a 20 20 73 74 72 66 74 69 6d  e(&t);.  strftim
5b40: 65 28 7a 44 61 74 65 2c 20 73 69 7a 65 6f 66 28  e(zDate, sizeof(
5b50: 7a 44 61 74 65 29 2c 20 22 25 61 2c 20 25 64 20  zDate), "%a, %d 
5b60: 25 62 20 25 59 20 25 48 3a 25 4d 3a 25 53 20 25  %b %Y %H:%M:%S %
5b70: 7a 22 2c 20 74 6d 29 3b 0a 20 20 72 65 74 75 72  z", tm);.  retur
5b80: 6e 20 7a 44 61 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zDate;.}../*.*
5b90: 2a 20 50 72 69 6e 74 20 61 20 64 61 74 65 20 74  * Print a date t
5ba0: 61 67 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ag in the header
5bb0: 2e 20 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74  .  The name of t
5bc0: 68 65 20 74 61 67 20 69 73 20 7a 54 61 67 2e 0a  he tag is zTag..
5bd0: 2a 2a 20 54 68 65 20 64 61 74 65 20 69 73 20 64  ** The date is d
5be0: 65 74 65 72 6d 69 6e 65 64 20 66 72 6f 6d 20 74  etermined from t
5bf0: 68 65 20 75 6e 69 78 20 74 69 6d 65 73 74 61 6d  he unix timestam
5c00: 70 20 67 69 76 65 6e 2e 0a 2a 2f 0a 73 74 61 74  p given..*/.stat
5c10: 69 63 20 69 6e 74 20 44 61 74 65 54 61 67 28 63  ic int DateTag(c
5c20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 67 2c  onst char *zTag,
5c30: 20 74 69 6d 65 5f 74 20 74 29 7b 0a 20 20 72 65   time_t t){.  re
5c40: 74 75 72 6e 20 70 72 69 6e 74 66 28 22 25 73 3a  turn printf("%s:
5c50: 20 25 73 5c 72 5c 6e 22 2c 20 7a 54 61 67 2c 20   %s\r\n", zTag, 
5c60: 52 66 63 38 32 32 44 61 74 65 28 74 29 29 3b 0a  Rfc822Date(t));.
5c70: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61  }../*.** Parse a
5c80: 6e 20 52 46 43 38 32 32 2d 66 6f 72 6d 61 74 74  n RFC822-formatt
5c90: 65 64 20 74 69 6d 65 73 74 61 6d 70 20 61 73 20  ed timestamp as 
5ca0: 77 65 27 64 20 65 78 70 65 63 74 20 66 72 6f 6d  we'd expect from
5cb0: 20 48 54 54 50 20 61 6e 64 20 72 65 74 75 72 6e   HTTP and return
5cc0: 0a 2a 2a 20 61 20 55 6e 69 78 20 65 70 6f 63 68  .** a Unix epoch
5cd0: 20 74 69 6d 65 2e 20 3c 3d 20 7a 65 72 6f 20 69   time. <= zero i
5ce0: 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 66 61  s returned on fa
5cf0: 69 6c 75 72 65 2e 0a 2a 2f 0a 74 69 6d 65 5f 74  ilure..*/.time_t
5d00: 20 50 61 72 73 65 52 66 63 38 32 32 44 61 74 65   ParseRfc822Date
5d10: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61  (const char *zDa
5d20: 74 65 29 7b 0a 20 20 69 6e 74 20 6d 64 61 79 2c  te){.  int mday,
5d30: 20 6d 6f 6e 2c 20 79 65 61 72 2c 20 79 64 61 79   mon, year, yday
5d40: 2c 20 68 6f 75 72 2c 20 6d 69 6e 2c 20 73 65 63  , hour, min, sec
5d50: 3b 0a 20 20 63 68 61 72 20 7a 49 67 6e 6f 72 65  ;.  char zIgnore
5d60: 5b 34 5d 3b 0a 20 20 63 68 61 72 20 7a 4d 6f 6e  [4];.  char zMon
5d70: 74 68 5b 34 5d 3b 0a 20 20 73 74 61 74 69 63 20  th[4];.  static 
5d80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73  const char *cons
5d90: 74 20 61 7a 4d 6f 6e 74 68 73 5b 5d 20 3d 0a 20  t azMonths[] =. 
5da0: 20 20 20 7b 22 4a 61 6e 22 2c 20 22 46 65 62 22     {"Jan", "Feb"
5db0: 2c 20 22 4d 61 72 22 2c 20 22 41 70 72 22 2c 20  , "Mar", "Apr", 
5dc0: 22 4d 61 79 22 2c 20 22 4a 75 6e 22 2c 0a 20 20  "May", "Jun",.  
5dd0: 20 20 20 22 4a 75 6c 22 2c 20 22 41 75 67 22 2c     "Jul", "Aug",
5de0: 20 22 53 65 70 22 2c 20 22 4f 63 74 22 2c 20 22   "Sep", "Oct", "
5df0: 4e 6f 76 22 2c 20 22 44 65 63 22 2c 20 30 7d 3b  Nov", "Dec", 0};
5e00: 0a 20 20 69 66 28 20 37 3d 3d 73 73 63 61 6e 66  .  if( 7==sscanf
5e10: 28 7a 44 61 74 65 2c 20 22 25 33 5b 41 2d 5a 61  (zDate, "%3[A-Za
5e20: 2d 7a 5d 2c 20 25 64 20 25 33 5b 41 2d 5a 61 2d  -z], %d %3[A-Za-
5e30: 7a 5d 20 25 64 20 25 64 3a 25 64 3a 25 64 22 2c  z] %d %d:%d:%d",
5e40: 20 7a 49 67 6e 6f 72 65 2c 0a 20 20 20 20 20 20   zIgnore,.      
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e60: 20 26 6d 64 61 79 2c 20 7a 4d 6f 6e 74 68 2c 20   &mday, zMonth, 
5e70: 26 79 65 61 72 2c 20 26 68 6f 75 72 2c 20 26 6d  &year, &hour, &m
5e80: 69 6e 2c 20 26 73 65 63 29 29 7b 0a 20 20 20 20  in, &sec)){.    
5e90: 69 66 28 20 79 65 61 72 20 3e 20 31 39 30 30 20  if( year > 1900 
5ea0: 29 20 79 65 61 72 20 2d 3d 20 31 39 30 30 3b 0a  ) year -= 1900;.
5eb0: 20 20 20 20 66 6f 72 28 6d 6f 6e 3d 30 3b 20 61      for(mon=0; a
5ec0: 7a 4d 6f 6e 74 68 73 5b 6d 6f 6e 5d 3b 20 6d 6f  zMonths[mon]; mo
5ed0: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  n++){.      if( 
5ee0: 21 73 74 72 6e 63 6d 70 28 20 61 7a 4d 6f 6e 74  !strncmp( azMont
5ef0: 68 73 5b 6d 6f 6e 5d 2c 20 7a 4d 6f 6e 74 68 2c  hs[mon], zMonth,
5f00: 20 33 20 29 29 7b 0a 20 20 20 20 20 20 20 20 69   3 )){.        i
5f10: 6e 74 20 6e 44 61 79 3b 0a 20 20 20 20 20 20 20  nt nDay;.       
5f20: 20 69 6e 74 20 69 73 4c 65 61 70 59 72 3b 0a 20   int isLeapYr;. 
5f30: 20 20 20 20 20 20 20 73 74 61 74 69 63 20 69 6e         static in
5f40: 74 20 70 72 69 6f 72 44 61 79 73 5b 5d 20 3d 0a  t priorDays[] =.
5f50: 20 20 20 20 20 20 20 20 20 7b 20 20 30 2c 20 33           {  0, 3
5f60: 31 2c 20 35 39 2c 20 39 30 2c 31 32 30 2c 31 35  1, 59, 90,120,15
5f70: 31 2c 31 38 31 2c 32 31 32 2c 32 34 33 2c 32 37  1,181,212,243,27
5f80: 33 2c 33 30 34 2c 33 33 34 20 7d 3b 0a 20 20 20  3,304,334 };.   
5f90: 20 20 20 20 20 69 66 28 20 6d 6f 6e 3c 30 20 29       if( mon<0 )
5fa0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
5fb0: 6e 59 65 61 72 20 3d 20 28 31 31 20 2d 20 6d 6f  nYear = (11 - mo
5fc0: 6e 29 2f 31 32 3b 0a 20 20 20 20 20 20 20 20 20  n)/12;.         
5fd0: 20 79 65 61 72 20 2d 3d 20 6e 59 65 61 72 3b 0a   year -= nYear;.
5fe0: 20 20 20 20 20 20 20 20 20 20 6d 6f 6e 20 2b 3d            mon +=
5ff0: 20 6e 59 65 61 72 2a 31 32 3b 0a 20 20 20 20 20   nYear*12;.     
6000: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 6f 6e     }else if( mon
6010: 3e 31 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >11 ){.         
6020: 20 79 65 61 72 20 2b 3d 20 6d 6f 6e 2f 31 32 3b   year += mon/12;
6030: 0a 20 20 20 20 20 20 20 20 20 20 6d 6f 6e 20 25  .          mon %
6040: 3d 20 31 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = 12;.        }.
6050: 20 20 20 20 20 20 20 20 69 73 4c 65 61 70 59 72          isLeapYr
6060: 20 3d 20 79 65 61 72 25 34 3d 3d 30 20 26 26 20   = year%4==0 && 
6070: 28 79 65 61 72 25 31 30 30 21 3d 30 20 7c 7c 20  (year%100!=0 || 
6080: 28 79 65 61 72 2b 33 30 30 29 25 34 30 30 3d 3d  (year+300)%400==
6090: 30 29 3b 0a 20 20 20 20 20 20 20 20 79 64 61 79  0);.        yday
60a0: 20 3d 20 70 72 69 6f 72 44 61 79 73 5b 6d 6f 6e   = priorDays[mon
60b0: 5d 20 2b 20 6d 64 61 79 20 2d 20 31 3b 0a 20 20  ] + mday - 1;.  
60c0: 20 20 20 20 20 20 69 66 28 20 69 73 4c 65 61 70        if( isLeap
60d0: 59 72 20 26 26 20 6d 6f 6e 3e 31 20 29 20 79 64  Yr && mon>1 ) yd
60e0: 61 79 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 44  ay++;.        nD
60f0: 61 79 20 3d 20 28 79 65 61 72 2d 37 30 29 2a 33  ay = (year-70)*3
6100: 36 35 20 2b 20 28 79 65 61 72 2d 36 39 29 2f 34  65 + (year-69)/4
6110: 20 2d 20 79 65 61 72 2f 31 30 30 20 2b 20 28 79   - year/100 + (y
6120: 65 61 72 2b 33 30 30 29 2f 34 30 30 20 2b 20 79  ear+300)/400 + y
6130: 64 61 79 3b 0a 20 20 20 20 20 20 20 20 72 65 74  day;.        ret
6140: 75 72 6e 20 28 28 74 69 6d 65 5f 74 29 28 6e 44  urn ((time_t)(nD
6150: 61 79 2a 32 34 20 2b 20 68 6f 75 72 29 2a 36 30  ay*24 + hour)*60
6160: 20 2b 20 6d 69 6e 29 2a 36 30 20 2b 20 73 65 63   + min)*60 + sec
6170: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6180: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
6190: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 70 72  }../*.** Test pr
61a0: 6f 63 65 64 75 72 65 20 66 6f 72 20 50 61 72 73  ocedure for Pars
61b0: 65 52 66 63 38 32 32 44 61 74 65 0a 2a 2f 0a 76  eRfc822Date.*/.v
61c0: 6f 69 64 20 54 65 73 74 50 61 72 73 65 52 66 63  oid TestParseRfc
61d0: 38 32 32 44 61 74 65 28 76 6f 69 64 29 7b 0a 20  822Date(void){. 
61e0: 20 74 69 6d 65 5f 74 20 74 31 2c 20 74 32 3b 0a   time_t t1, t2;.
61f0: 20 20 66 6f 72 28 74 31 3d 30 3b 20 74 31 3c 30    for(t1=0; t1<0
6200: 78 37 66 66 66 66 66 66 66 3b 20 74 31 20 2b 3d  x7fffffff; t1 +=
6210: 20 31 32 37 29 7b 0a 20 20 20 20 74 32 20 3d 20   127){.    t2 = 
6220: 50 61 72 73 65 52 66 63 38 32 32 44 61 74 65 28  ParseRfc822Date(
6230: 52 66 63 38 32 32 44 61 74 65 28 74 31 29 29 3b  Rfc822Date(t1));
6240: 0a 20 20 20 20 61 73 73 65 72 74 28 20 74 31 3d  .    assert( t1=
6250: 3d 74 32 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  =t2 );.  }.}../*
6260: 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 66 69  .** Print the fi
6270: 72 73 74 20 6c 69 6e 65 20 6f 66 20 61 20 72 65  rst line of a re
6280: 73 70 6f 6e 73 65 20 66 6f 6c 6c 6f 77 65 64 20  sponse followed 
6290: 62 79 20 74 68 65 20 73 65 72 76 65 72 20 74 79  by the server ty
62a0: 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  pe..*/.static vo
62b0: 69 64 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65  id StartResponse
62c0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65  (const char *zRe
62d0: 73 75 6c 74 43 6f 64 65 29 7b 0a 20 20 74 69 6d  sultCode){.  tim
62e0: 65 5f 74 20 6e 6f 77 3b 0a 20 20 74 69 6d 65 28  e_t now;.  time(
62f0: 26 6e 6f 77 29 3b 0a 20 20 69 66 28 20 73 74 61  &now);.  if( sta
6300: 74 75 73 53 65 6e 74 20 29 20 72 65 74 75 72 6e  tusSent ) return
6310: 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e  ;.  nOut += prin
6320: 74 66 28 22 25 73 20 25 73 5c 72 5c 6e 22 2c 20  tf("%s %s\r\n", 
6330: 7a 50 72 6f 74 6f 63 6f 6c 2c 20 7a 52 65 73 75  zProtocol, zResu
6340: 6c 74 43 6f 64 65 29 3b 0a 20 20 73 74 72 6e 63  ltCode);.  strnc
6350: 70 79 28 7a 52 65 70 6c 79 53 74 61 74 75 73 2c  py(zReplyStatus,
6360: 20 7a 52 65 73 75 6c 74 43 6f 64 65 2c 20 33 29   zResultCode, 3)
6370: 3b 0a 20 20 7a 52 65 70 6c 79 53 74 61 74 75 73  ;.  zReplyStatus
6380: 5b 33 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a  [3] = 0;.  if( z
6390: 52 65 70 6c 79 53 74 61 74 75 73 5b 30 5d 3e 3d  ReplyStatus[0]>=
63a0: 27 34 27 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65  '4' ){.    close
63b0: 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 31 3b 0a  Connection = 1;.
63c0: 20 20 7d 0a 20 20 69 66 28 20 63 6c 6f 73 65 43    }.  if( closeC
63d0: 6f 6e 6e 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20  onnection ){.   
63e0: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
63f0: 22 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f  "Connection: clo
6400: 73 65 5c 72 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73  se\r\n");.  }els
6410: 65 7b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70  e{.    nOut += p
6420: 72 69 6e 74 66 28 22 43 6f 6e 6e 65 63 74 69 6f  rintf("Connectio
6430: 6e 3a 20 6b 65 65 70 2d 61 6c 69 76 65 5c 72 5c  n: keep-alive\r\
6440: 6e 22 29 3b 0a 20 20 7d 0a 20 20 6e 4f 75 74 20  n");.  }.  nOut 
6450: 2b 3d 20 44 61 74 65 54 61 67 28 22 44 61 74 65  += DateTag("Date
6460: 22 2c 20 6e 6f 77 29 3b 0a 20 20 73 74 61 74 75  ", now);.  statu
6470: 73 53 65 6e 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  sSent = 1;.}../*
6480: 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c 69  .** Tell the cli
6490: 65 6e 74 20 74 68 61 74 20 74 68 65 72 65 20 69  ent that there i
64a0: 73 20 6e 6f 20 73 75 63 68 20 64 6f 63 75 6d 65  s no such docume
64b0: 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  nt.*/.static voi
64c0: 64 20 4e 6f 74 46 6f 75 6e 64 28 69 6e 74 20 6c  d NotFound(int l
64d0: 69 6e 65 6e 6f 29 7b 0a 20 20 53 74 61 72 74 52  ineno){.  StartR
64e0: 65 73 70 6f 6e 73 65 28 22 34 30 34 20 4e 6f 74  esponse("404 Not
64f0: 20 46 6f 75 6e 64 22 29 3b 0a 20 20 6e 4f 75 74   Found");.  nOut
6500: 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20   += printf(.    
6510: 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74  "Content-type: t
6520: 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e 22 0a 20 20  ext/html\r\n".  
6530: 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 22 3c 68    "\r\n".    "<h
6540: 65 61 64 3e 3c 74 69 74 6c 65 20 6c 69 6e 65 6e  ead><title linen
6550: 6f 3d 5c 22 25 64 5c 22 3e 4e 6f 74 20 46 6f 75  o=\"%d\">Not Fou
6560: 6e 64 3c 2f 74 69 74 6c 65 3e 3c 2f 68 65 61 64  nd</title></head
6570: 3e 5c 6e 22 0a 20 20 20 20 22 3c 62 6f 64 79 3e  >\n".    "<body>
6580: 3c 68 31 3e 44 6f 63 75 6d 65 6e 74 20 4e 6f 74  <h1>Document Not
6590: 20 46 6f 75 6e 64 3c 2f 68 31 3e 5c 6e 22 0a 20   Found</h1>\n". 
65a0: 20 20 20 22 54 68 65 20 64 6f 63 75 6d 65 6e 74     "The document
65b0: 20 25 73 20 69 73 20 6e 6f 74 20 61 76 61 69 6c   %s is not avail
65c0: 61 62 6c 65 20 6f 6e 20 74 68 69 73 20 73 65 72  able on this ser
65d0: 76 65 72 5c 6e 22 0a 20 20 20 20 22 3c 2f 62 6f  ver\n".    "</bo
65e0: 64 79 3e 5c 6e 22 2c 20 6c 69 6e 65 6e 6f 2c 20  dy>\n", lineno, 
65f0: 7a 53 63 72 69 70 74 29 3b 0a 20 20 4d 61 6b 65  zScript);.  Make
6600: 4c 6f 67 45 6e 74 72 79 28 30 2c 20 6c 69 6e 65  LogEntry(0, line
6610: 6e 6f 29 3b 0a 20 20 65 78 69 74 28 30 29 3b 0a  no);.  exit(0);.
6620: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68  }../*.** Tell th
6630: 65 20 63 6c 69 65 6e 74 20 74 68 61 74 20 74 68  e client that th
6640: 65 79 20 61 72 65 20 6e 6f 74 20 77 65 6c 63 6f  ey are not welco
6650: 6d 65 64 20 68 65 72 65 2e 0a 2a 2f 0a 73 74 61  med here..*/.sta
6660: 74 69 63 20 76 6f 69 64 20 46 6f 72 62 69 64 64  tic void Forbidd
6670: 65 6e 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  en(int lineno){.
6680: 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28    StartResponse(
6690: 22 34 30 33 20 46 6f 72 62 69 64 64 65 6e 22 29  "403 Forbidden")
66a0: 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e  ;.  nOut += prin
66b0: 74 66 28 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74  tf(.    "Content
66c0: 2d 74 79 70 65 3a 20 74 65 78 74 2f 70 6c 61 69  -type: text/plai
66d0: 6e 5c 72 5c 6e 22 0a 20 20 20 20 22 5c 72 5c 6e  n\r\n".    "\r\n
66e0: 22 0a 20 20 20 20 22 41 63 63 65 73 73 20 64 65  ".    "Access de
66f0: 6e 69 65 64 5c 6e 22 0a 20 20 29 3b 0a 20 20 63  nied\n".  );.  c
6700: 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d  loseConnection =
6710: 20 31 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74   1;.  MakeLogEnt
6720: 72 79 28 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20  ry(0, lineno);. 
6730: 20 65 78 69 74 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a   exit(0);.}../*.
6740: 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c 69 65  ** Tell the clie
6750: 6e 74 20 74 68 61 74 20 61 75 74 68 6f 72 69 7a  nt that authoriz
6760: 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65  ation is require
6770: 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a  d to access the.
6780: 2a 2a 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** document..*/.
6790: 73 74 61 74 69 63 20 76 6f 69 64 20 4e 6f 74 41  static void NotA
67a0: 75 74 68 6f 72 69 7a 65 64 28 63 6f 6e 73 74 20  uthorized(const 
67b0: 63 68 61 72 20 2a 7a 52 65 61 6c 6d 29 7b 0a 20  char *zRealm){. 
67c0: 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22   StartResponse("
67d0: 34 30 31 20 41 75 74 68 6f 72 69 7a 61 74 69 6f  401 Authorizatio
67e0: 6e 20 52 65 71 75 69 72 65 64 22 29 3b 0a 20 20  n Required");.  
67f0: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a  nOut += printf(.
6800: 20 20 20 20 22 57 57 57 2d 41 75 74 68 65 6e 74      "WWW-Authent
6810: 69 63 61 74 65 3a 20 42 61 73 69 63 20 72 65 61  icate: Basic rea
6820: 6c 6d 3d 5c 22 25 73 5c 22 5c 72 5c 6e 22 0a 20  lm=\"%s\"\r\n". 
6830: 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65     "Content-type
6840: 3a 20 74 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e 22  : text/html\r\n"
6850: 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20  .    "\r\n".    
6860: 22 3c 68 65 61 64 3e 3c 74 69 74 6c 65 3e 4e 6f  "<head><title>No
6870: 74 20 41 75 74 68 6f 72 69 7a 65 64 3c 2f 74 69  t Authorized</ti
6880: 74 6c 65 3e 3c 2f 68 65 61 64 3e 5c 6e 22 0a 20  tle></head>\n". 
6890: 20 20 20 22 3c 62 6f 64 79 3e 3c 68 31 3e 34 30     "<body><h1>40
68a0: 31 20 4e 6f 74 20 41 75 74 68 6f 72 69 7a 65 64  1 Not Authorized
68b0: 3c 2f 68 31 3e 5c 6e 22 0a 20 20 20 20 22 41 20  </h1>\n".    "A 
68c0: 6c 6f 67 69 6e 20 61 6e 64 20 70 61 73 73 77 6f  login and passwo
68d0: 72 64 20 61 72 65 20 72 65 71 75 69 72 65 64 20  rd are required 
68e0: 66 6f 72 20 74 68 69 73 20 64 6f 63 75 6d 65 6e  for this documen
68f0: 74 5c 6e 22 0a 20 20 20 20 22 3c 2f 62 6f 64 79  t\n".    "</body
6900: 3e 5c 6e 22 2c 20 7a 52 65 61 6c 6d 29 3b 0a 20  >\n", zRealm);. 
6910: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c   MakeLogEntry(0,
6920: 20 31 31 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20   110);  /* LOG: 
6930: 4e 6f 74 20 61 75 74 68 6f 72 69 7a 65 64 20 2a  Not authorized *
6940: 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20  /.}../*.** Tell 
6950: 74 68 65 20 63 6c 69 65 6e 74 20 74 68 61 74 20  the client that 
6960: 74 68 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f  there is an erro
6970: 72 20 69 6e 20 74 68 65 20 73 63 72 69 70 74 2e  r in the script.
6980: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6990: 43 67 69 45 72 72 6f 72 28 76 6f 69 64 29 7b 0a  CgiError(void){.
69a0: 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28    StartResponse(
69b0: 22 35 30 30 20 45 72 72 6f 72 22 29 3b 0a 20 20  "500 Error");.  
69c0: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a  nOut += printf(.
69d0: 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70      "Content-typ
69e0: 65 3a 20 74 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e  e: text/html\r\n
69f0: 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20  ".    "\r\n".   
6a00: 20 22 3c 68 65 61 64 3e 3c 74 69 74 6c 65 3e 43   "<head><title>C
6a10: 47 49 20 50 72 6f 67 72 61 6d 20 45 72 72 6f 72  GI Program Error
6a20: 3c 2f 74 69 74 6c 65 3e 3c 2f 68 65 61 64 3e 5c  </title></head>\
6a30: 6e 22 0a 20 20 20 20 22 3c 62 6f 64 79 3e 3c 68  n".    "<body><h
6a40: 31 3e 43 47 49 20 50 72 6f 67 72 61 6d 20 45 72  1>CGI Program Er
6a50: 72 6f 72 3c 2f 68 31 3e 5c 6e 22 0a 20 20 20 20  ror</h1>\n".    
6a60: 22 54 68 65 20 43 47 49 20 70 72 6f 67 72 61 6d  "The CGI program
6a70: 20 25 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e   %s generated an
6a80: 20 65 72 72 6f 72 5c 6e 22 0a 20 20 20 20 22 3c   error\n".    "<
6a90: 2f 62 6f 64 79 3e 5c 6e 22 2c 20 7a 53 63 72 69  /body>\n", zScri
6aa0: 70 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e  pt);.  MakeLogEn
6ab0: 74 72 79 28 30 2c 20 31 32 30 29 3b 20 20 2f 2a  try(0, 120);  /*
6ac0: 20 4c 4f 47 3a 20 43 47 49 20 45 72 72 6f 72 20   LOG: CGI Error 
6ad0: 2a 2f 0a 20 20 65 78 69 74 28 30 29 3b 0a 7d 0a  */.  exit(0);.}.
6ae0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  ./*.** This is c
6af0: 61 6c 6c 65 64 20 69 66 20 77 65 20 74 69 6d 65  alled if we time
6b00: 6f 75 74 20 6f 72 20 63 61 74 63 68 20 73 6f 6d  out or catch som
6b10: 65 20 6f 74 68 65 72 20 6b 69 6e 64 20 6f 66 20  e other kind of 
6b20: 73 69 67 6e 61 6c 2e 0a 2a 2a 20 4c 6f 67 20 61  signal..** Log a
6b30: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 68 69  n error code whi
6b40: 63 68 20 69 73 20 39 30 30 2b 69 53 69 67 20 61  ch is 900+iSig a
6b50: 6e 64 20 74 68 65 6e 20 71 75 69 74 2e 0a 2a 2f  nd then quit..*/
6b60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 69 6d  .static void Tim
6b70: 65 6f 75 74 28 69 6e 74 20 69 53 69 67 29 7b 0a  eout(int iSig){.
6b80: 20 20 69 66 28 20 21 64 65 62 75 67 46 6c 61 67    if( !debugFlag
6b90: 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 63 72   ){.    if( zScr
6ba0: 69 70 74 20 26 26 20 7a 53 63 72 69 70 74 5b 30  ipt && zScript[0
6bb0: 5d 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ] ){.      char 
6bc0: 7a 42 75 66 5b 31 30 5d 3b 0a 20 20 20 20 20 20  zBuf[10];.      
6bd0: 7a 42 75 66 5b 30 5d 20 3d 20 27 39 27 3b 0a 20  zBuf[0] = '9';. 
6be0: 20 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20 27       zBuf[1] = '
6bf0: 30 27 20 2b 20 28 69 53 69 67 2f 31 30 29 25 31  0' + (iSig/10)%1
6c00: 30 3b 0a 20 20 20 20 20 20 7a 42 75 66 5b 32 5d  0;.      zBuf[2]
6c10: 20 3d 20 27 30 27 20 2b 20 69 53 69 67 25 31 30   = '0' + iSig%10
6c20: 3b 0a 20 20 20 20 20 20 7a 42 75 66 5b 33 5d 20  ;.      zBuf[3] 
6c30: 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 63 70  = 0;.      strcp
6c40: 79 28 7a 52 65 70 6c 79 53 74 61 74 75 73 2c 20  y(zReplyStatus, 
6c50: 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4d 61 6b  zBuf);.      Mak
6c60: 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 31 33 30  eLogEntry(0, 130
6c70: 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 54 69 6d 65  );  /* LOG: Time
6c80: 6f 75 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  out */.    }.   
6c90: 20 65 78 69 74 28 30 29 3b 0a 20 20 7d 0a 7d 0a   exit(0);.  }.}.
6ca0: 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20  ./*.** Tell the 
6cb0: 63 6c 69 65 6e 74 20 74 68 61 74 20 74 68 65 72  client that ther
6cc0: 65 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69 6e  e is an error in
6cd0: 20 74 68 65 20 73 63 72 69 70 74 2e 0a 2a 2f 0a   the script..*/.
6ce0: 73 74 61 74 69 63 20 76 6f 69 64 20 43 67 69 53  static void CgiS
6cf0: 63 72 69 70 74 57 72 69 74 61 62 6c 65 28 76 6f  criptWritable(vo
6d00: 69 64 29 7b 0a 20 20 53 74 61 72 74 52 65 73 70  id){.  StartResp
6d10: 6f 6e 73 65 28 22 35 30 30 20 43 47 49 20 43 6f  onse("500 CGI Co
6d20: 6e 66 69 67 75 72 61 74 69 6f 6e 20 45 72 72 6f  nfiguration Erro
6d30: 72 22 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70  r");.  nOut += p
6d40: 72 69 6e 74 66 28 0a 20 20 20 20 22 43 6f 6e 74  rintf(.    "Cont
6d50: 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 70  ent-type: text/p
6d60: 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 22 5c  lain\r\n".    "\
6d70: 72 5c 6e 22 0a 20 20 20 20 22 54 68 65 20 43 47  r\n".    "The CG
6d80: 49 20 70 72 6f 67 72 61 6d 20 25 73 20 69 73 20  I program %s is 
6d90: 77 72 69 74 61 62 6c 65 20 62 79 20 75 73 65 72  writable by user
6da0: 73 20 6f 74 68 65 72 20 74 68 61 6e 20 69 74 73  s other than its
6db0: 20 6f 77 6e 65 72 2e 5c 6e 22 2c 0a 20 20 20 20   owner.\n",.    
6dc0: 7a 52 65 61 6c 53 63 72 69 70 74 29 3b 0a 20 20  zRealScript);.  
6dd0: 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20  MakeLogEntry(0, 
6de0: 31 34 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 43  140);  /* LOG: C
6df0: 47 49 20 73 63 72 69 70 74 20 69 73 20 77 72 69  GI script is wri
6e00: 74 61 62 6c 65 20 2a 2f 0a 20 20 65 78 69 74 28  table */.  exit(
6e10: 30 29 3b 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a  0);       .}../*
6e20: 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c 69  .** Tell the cli
6e30: 65 6e 74 20 74 68 61 74 20 74 68 65 20 73 65 72  ent that the ser
6e40: 76 65 72 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 65  ver malfunctione
6e50: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
6e60: 64 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 69 6e  d Malfunction(in
6e70: 74 20 6c 69 6e 65 6e 75 6d 2c 20 63 6f 6e 73 74  t linenum, const
6e80: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
6e90: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
6ea0: 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ap;.  va_start(a
6eb0: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 53  p, zFormat);.  S
6ec0: 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 35 30  tartResponse("50
6ed0: 30 20 53 65 72 76 65 72 20 4d 61 6c 66 75 6e 63  0 Server Malfunc
6ee0: 74 69 6f 6e 22 29 3b 0a 20 20 6e 4f 75 74 20 2b  tion");.  nOut +
6ef0: 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20 22 43  = printf(.    "C
6f00: 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78  ontent-type: tex
6f10: 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20  t/plain\r\n".   
6f20: 20 22 5c 72 5c 6e 22 0a 20 20 20 20 22 57 65 62   "\r\n".    "Web
6f30: 20 73 65 72 76 65 72 20 6d 61 6c 66 75 6e 63 74   server malfunct
6f40: 69 6f 6e 65 64 3b 20 65 72 72 6f 72 20 6e 75 6d  ioned; error num
6f50: 62 65 72 20 25 64 5c 6e 5c 6e 22 2c 20 6c 69 6e  ber %d\n\n", lin
6f60: 65 6e 75 6d 29 3b 0a 20 20 69 66 28 20 7a 46 6f  enum);.  if( zFo
6f70: 72 6d 61 74 20 29 7b 0a 20 20 20 20 6e 4f 75 74  rmat ){.    nOut
6f80: 20 2b 3d 20 76 70 72 69 6e 74 66 28 7a 46 6f 72   += vprintf(zFor
6f90: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 70 72  mat, ap);.    pr
6fa0: 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20  intf("\n");.    
6fb0: 6e 4f 75 74 2b 2b 3b 0a 20 20 7d 0a 20 20 4d 61  nOut++;.  }.  Ma
6fc0: 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 6c 69  keLogEntry(0, li
6fd0: 6e 65 6e 75 6d 29 3b 0a 20 20 65 78 69 74 28 30  nenum);.  exit(0
6fe0: 29 3b 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a  );       .}../*.
6ff0: 2a 2a 20 44 6f 20 61 20 73 65 72 76 65 72 20 72  ** Do a server r
7000: 65 64 69 72 65 63 74 20 74 6f 20 74 68 65 20 64  edirect to the d
7010: 6f 63 75 6d 65 6e 74 20 73 70 65 63 69 66 69 65  ocument specifie
7020: 64 2e 20 20 54 68 65 20 64 6f 63 75 6d 65 6e 74  d.  The document
7030: 0a 2a 2a 20 6e 61 6d 65 20 6e 6f 74 20 63 6f 6e  .** name not con
7040: 74 61 69 6e 20 73 63 68 65 6d 65 20 6f 72 20 6e  tain scheme or n
7050: 65 74 77 6f 72 6b 20 6c 6f 63 61 74 69 6f 6e 20  etwork location 
7060: 6f 72 20 74 68 65 20 71 75 65 72 79 20 73 74 72  or the query str
7070: 69 6e 67 2e 0a 2a 2a 20 49 74 20 77 69 6c 6c 20  ing..** It will 
7080: 62 65 20 6a 75 73 74 20 74 68 65 20 70 61 74 68  be just the path
7090: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
70a0: 20 52 65 64 69 72 65 63 74 28 63 6f 6e 73 74 20   Redirect(const 
70b0: 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74  char *zPath, int
70c0: 20 66 69 6e 69 73 68 2c 20 69 6e 74 20 6c 69 6e   finish, int lin
70d0: 65 6e 6f 29 7b 0a 20 20 53 74 61 72 74 52 65 73  eno){.  StartRes
70e0: 70 6f 6e 73 65 28 22 33 30 32 20 54 65 6d 70 6f  ponse("302 Tempo
70f0: 72 61 72 79 20 52 65 64 69 72 65 63 74 22 29 3b  rary Redirect");
7100: 0a 20 20 69 66 28 20 7a 53 65 72 76 65 72 50 6f  .  if( zServerPo
7110: 72 74 3d 3d 30 20 7c 7c 20 7a 53 65 72 76 65 72  rt==0 || zServer
7120: 50 6f 72 74 5b 30 5d 3d 3d 30 20 7c 7c 20 73 74  Port[0]==0 || st
7130: 72 63 6d 70 28 7a 53 65 72 76 65 72 50 6f 72 74  rcmp(zServerPort
7140: 2c 22 38 30 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ,"80")==0 ){.   
7150: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
7160: 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73 3a 2f 2f  "Location: %s://
7170: 25 73 25 73 25 73 5c 72 5c 6e 22 2c 0a 20 20 20  %s%s%s\r\n",.   
7180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7190: 7a 48 74 74 70 2c 20 7a 53 65 72 76 65 72 4e 61  zHttp, zServerNa
71a0: 6d 65 2c 20 7a 50 61 74 68 2c 20 7a 51 75 65 72  me, zPath, zQuer
71b0: 79 53 75 66 66 69 78 29 3b 0a 20 20 7d 65 6c 73  ySuffix);.  }els
71c0: 65 7b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70  e{.    nOut += p
71d0: 72 69 6e 74 66 28 22 4c 6f 63 61 74 69 6f 6e 3a  rintf("Location:
71e0: 20 25 73 3a 2f 2f 25 73 3a 25 73 25 73 25 73 5c   %s://%s:%s%s%s\
71f0: 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  r\n",.          
7200: 20 20 20 20 20 20 20 20 20 7a 48 74 74 70 2c 20           zHttp, 
7210: 7a 53 65 72 76 65 72 4e 61 6d 65 2c 20 7a 53 65  zServerName, zSe
7220: 72 76 65 72 50 6f 72 74 2c 20 7a 50 61 74 68 2c  rverPort, zPath,
7230: 20 7a 51 75 65 72 79 53 75 66 66 69 78 29 3b 0a   zQuerySuffix);.
7240: 20 20 7d 0a 20 20 69 66 28 20 66 69 6e 69 73 68    }.  if( finish
7250: 20 29 7b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20   ){.    nOut += 
7260: 70 72 69 6e 74 66 28 22 43 6f 6e 74 65 6e 74 2d  printf("Content-
7270: 6c 65 6e 67 74 68 3a 20 30 5c 72 5c 6e 22 29 3b  length: 0\r\n");
7280: 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69  .    nOut += pri
7290: 6e 74 66 28 22 5c 72 5c 6e 22 29 3b 0a 20 20 20  ntf("\r\n");.   
72a0: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c   MakeLogEntry(0,
72b0: 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 20 20   lineno);.  }.  
72c0: 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
72d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
72e0: 6e 63 74 69 6f 6e 20 74 72 65 61 74 73 20 69 74  nction treats it
72f0: 73 20 69 6e 70 75 74 20 61 73 20 61 20 62 61 73  s input as a bas
7300: 65 2d 36 34 20 73 74 72 69 6e 67 20 61 6e 64 20  e-64 string and 
7310: 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 64  returns the.** d
7320: 65 63 6f 64 65 64 20 76 61 6c 75 65 20 6f 66 20  ecoded value of 
7330: 74 68 61 74 20 73 74 72 69 6e 67 2e 20 20 43 68  that string.  Ch
7340: 61 72 61 63 74 65 72 73 20 6f 66 20 69 6e 70 75  aracters of inpu
7350: 74 20 74 68 61 74 20 61 72 65 20 6e 6f 74 0a 2a  t that are not.*
7360: 2a 20 76 61 6c 69 64 20 62 61 73 65 2d 36 34 20  * valid base-64 
7370: 63 68 61 72 61 63 74 65 72 73 20 28 73 75 63 68  characters (such
7380: 20 61 73 20 73 70 61 63 65 73 20 61 6e 64 20 6e   as spaces and n
7390: 65 77 6c 69 6e 65 73 29 20 61 72 65 20 69 67 6e  ewlines) are ign
73a0: 6f 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 44 65  ored..*/.void De
73b0: 63 6f 64 65 36 34 28 63 68 61 72 20 2a 7a 36 34  code64(char *z64
73c0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 61  ){.  char *zData
73d0: 3b 0a 20 20 69 6e 74 20 6e 36 34 3b 0a 20 20 69  ;.  int n64;.  i
73e0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 61  nt i, j;.  int a
73f0: 2c 20 62 2c 20 63 2c 20 64 3b 0a 20 20 73 74 61  , b, c, d;.  sta
7400: 74 69 63 20 69 6e 74 20 69 73 49 6e 69 74 20 3d  tic int isInit =
7410: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   0;.  static int
7420: 20 74 72 61 6e 73 5b 31 32 38 5d 3b 0a 20 20 73   trans[128];.  s
7430: 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63  tatic unsigned c
7440: 68 61 72 20 7a 42 61 73 65 5b 5d 20 3d 20 0a 20  har zBase[] = . 
7450: 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c     "ABCDEFGHIJKL
7460: 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 61 62  MNOPQRSTUVWXYZab
7470: 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
7480: 73 74 75 76 77 78 79 7a 30 31 32 33 34 35 36 37  stuvwxyz01234567
7490: 38 39 2b 2f 22 3b 0a 0a 20 20 69 66 28 20 21 69  89+/";..  if( !i
74a0: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 66 6f 72  sInit ){.    for
74b0: 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b  (i=0; i<128; i++
74c0: 29 7b 20 74 72 61 6e 73 5b 69 5d 20 3d 20 30 3b  ){ trans[i] = 0;
74d0: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
74e0: 7a 42 61 73 65 5b 69 5d 3b 20 69 2b 2b 29 7b 20  zBase[i]; i++){ 
74f0: 74 72 61 6e 73 5b 7a 42 61 73 65 5b 69 5d 20 26  trans[zBase[i] &
7500: 20 30 78 37 66 5d 20 3d 20 69 3b 20 7d 0a 20 20   0x7f] = i; }.  
7510: 20 20 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20    isInit = 1;.  
7520: 7d 0a 20 20 6e 36 34 20 3d 20 73 74 72 6c 65 6e  }.  n64 = strlen
7530: 28 7a 36 34 29 3b 0a 20 20 77 68 69 6c 65 28 20  (z64);.  while( 
7540: 6e 36 34 3e 30 20 26 26 20 7a 36 34 5b 6e 36 34  n64>0 && z64[n64
7550: 2d 31 5d 3d 3d 27 3d 27 20 29 20 6e 36 34 2d 2d  -1]=='=' ) n64--
7560: 3b 0a 20 20 7a 44 61 74 61 20 3d 20 7a 36 34 3b  ;.  zData = z64;
7570: 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 2b  .  for(i=j=0; i+
7580: 33 3c 6e 36 34 3b 20 69 2b 3d 34 29 7b 0a 20 20  3<n64; i+=4){.  
7590: 20 20 61 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b    a = trans[z64[
75a0: 69 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20  i] & 0x7f];.    
75b0: 62 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b  b = trans[z64[i+
75c0: 31 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20  1] & 0x7f];.    
75d0: 63 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b  c = trans[z64[i+
75e0: 32 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20  2] & 0x7f];.    
75f0: 64 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b  d = trans[z64[i+
7600: 33 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20  3] & 0x7f];.    
7610: 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28 61  zData[j++] = ((a
7620: 3c 3c 32 29 20 26 20 30 78 66 63 29 20 7c 20 28  <<2) & 0xfc) | (
7630: 28 62 3e 3e 34 29 20 26 20 30 78 30 33 29 3b 0a  (b>>4) & 0x03);.
7640: 20 20 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d      zData[j++] =
7650: 20 28 28 62 3c 3c 34 29 20 26 20 30 78 66 30 29   ((b<<4) & 0xf0)
7660: 20 7c 20 28 28 63 3e 3e 32 29 20 26 20 30 78 30   | ((c>>2) & 0x0
7670: 66 29 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b  f);.    zData[j+
7680: 2b 5d 20 3d 20 28 28 63 3c 3c 36 29 20 26 20 30  +] = ((c<<6) & 0
7690: 78 63 30 29 20 7c 20 28 64 20 26 20 30 78 33 66  xc0) | (d & 0x3f
76a0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 2b 32  );.  }.  if( i+2
76b0: 3c 6e 36 34 20 29 7b 0a 20 20 20 20 61 20 3d 20  <n64 ){.    a = 
76c0: 74 72 61 6e 73 5b 7a 36 34 5b 69 5d 20 26 20 30  trans[z64[i] & 0
76d0: 78 37 66 5d 3b 0a 20 20 20 20 62 20 3d 20 74 72  x7f];.    b = tr
76e0: 61 6e 73 5b 7a 36 34 5b 69 2b 31 5d 20 26 20 30  ans[z64[i+1] & 0
76f0: 78 37 66 5d 3b 0a 20 20 20 20 63 20 3d 20 74 72  x7f];.    c = tr
7700: 61 6e 73 5b 7a 36 34 5b 69 2b 32 5d 20 26 20 30  ans[z64[i+2] & 0
7710: 78 37 66 5d 3b 0a 20 20 20 20 7a 44 61 74 61 5b  x7f];.    zData[
7720: 6a 2b 2b 5d 20 3d 20 28 28 61 3c 3c 32 29 20 26  j++] = ((a<<2) &
7730: 20 30 78 66 63 29 20 7c 20 28 28 62 3e 3e 34 29   0xfc) | ((b>>4)
7740: 20 26 20 30 78 30 33 29 3b 0a 20 20 20 20 7a 44   & 0x03);.    zD
7750: 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28 62 3c 3c  ata[j++] = ((b<<
7760: 34 29 20 26 20 30 78 66 30 29 20 7c 20 28 28 63  4) & 0xf0) | ((c
7770: 3e 3e 32 29 20 26 20 30 78 30 66 29 3b 0a 20 20  >>2) & 0x0f);.  
7780: 7d 65 6c 73 65 20 69 66 28 20 69 2b 31 3c 6e 36  }else if( i+1<n6
7790: 34 20 29 7b 0a 20 20 20 20 61 20 3d 20 74 72 61  4 ){.    a = tra
77a0: 6e 73 5b 7a 36 34 5b 69 5d 20 26 20 30 78 37 66  ns[z64[i] & 0x7f
77b0: 5d 3b 0a 20 20 20 20 62 20 3d 20 74 72 61 6e 73  ];.    b = trans
77c0: 5b 7a 36 34 5b 69 2b 31 5d 20 26 20 30 78 37 66  [z64[i+1] & 0x7f
77d0: 5d 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b 2b  ];.    zData[j++
77e0: 5d 20 3d 20 28 28 61 3c 3c 32 29 20 26 20 30 78  ] = ((a<<2) & 0x
77f0: 66 63 29 20 7c 20 28 28 62 3e 3e 34 29 20 26 20  fc) | ((b>>4) & 
7800: 30 78 30 33 29 3b 0a 20 20 7d 0a 20 20 7a 44 61  0x03);.  }.  zDa
7810: 74 61 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ta[j] = 0;.}../*
7820: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
7830: 20 69 66 20 62 61 73 69 63 20 61 75 74 68 6f 72   if basic author
7840: 69 7a 61 74 69 6f 6e 20 63 72 65 64 65 6e 74 69  ization credenti
7850: 61 6c 73 20 61 72 65 20 70 72 6f 76 69 64 65 64  als are provided
7860: 20 66 6f 72 0a 2a 2a 20 74 68 65 20 75 73 65 72   for.** the user
7870: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
7880: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  e information in
7890: 20 7a 41 75 74 68 46 69 6c 65 2e 20 20 52 65 74   zAuthFile.  Ret
78a0: 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 61  urn true.** if a
78b0: 75 74 68 6f 72 69 7a 65 64 2e 20 20 52 65 74 75  uthorized.  Retu
78c0: 72 6e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 20  rn false if not 
78d0: 61 75 74 68 6f 72 69 7a 65 64 2e 0a 2a 2a 0a 2a  authorized..**.*
78e0: 2a 20 46 69 6c 65 20 66 6f 72 6d 61 74 3a 0a 2a  * File format:.*
78f0: 2a 0a 2a 2a 20 20 20 20 2a 20 20 42 6c 61 6e 6b  *.**    *  Blank
7900: 20 6c 69 6e 65 73 20 61 6e 64 20 6c 69 6e 65 73   lines and lines
7910: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
7920: 20 27 23 27 20 61 72 65 20 69 67 6e 6f 72 65 64   '#' are ignored
7930: 0a 2a 2a 20 20 20 20 2a 20 20 22 68 74 74 70 2d  .**    *  "http-
7940: 72 65 64 69 72 65 63 74 22 20 66 6f 72 63 65 73  redirect" forces
7950: 20 61 20 72 65 64 69 72 65 63 74 20 74 6f 20 48   a redirect to H
7960: 54 54 50 53 20 69 66 20 6e 6f 74 20 74 68 65 72  TTPS if not ther
7970: 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 20 20 20  e already.**    
7980: 2a 20 20 22 68 74 74 70 73 2d 6f 6e 6c 79 22 20  *  "https-only" 
7990: 64 69 73 61 6c 6c 6f 77 73 20 6f 70 65 72 61 74  disallows operat
79a0: 69 6f 6e 20 69 6e 20 48 54 54 50 0a 2a 2a 20 20  ion in HTTP.**  
79b0: 20 20 2a 20 20 22 75 73 65 72 20 4e 41 4d 45 20    *  "user NAME 
79c0: 4c 4f 47 49 4e 3a 50 41 53 53 57 4f 52 44 22 20  LOGIN:PASSWORD" 
79d0: 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
79e0: 20 4c 4f 47 49 4e 3a 50 41 53 53 57 4f 52 44 20   LOGIN:PASSWORD 
79f0: 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 68 6f 72  .**       author
7a00: 69 7a 61 74 69 6f 6e 20 63 72 65 64 65 6e 74 69  ization credenti
7a10: 61 6c 73 20 61 72 65 20 70 72 6f 76 69 64 65 64  als are provided
7a20: 2c 20 61 6e 64 20 69 66 20 73 6f 20 73 65 74 73  , and if so sets
7a30: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 52 45   the.**       RE
7a40: 4d 4f 54 45 5f 55 53 45 52 20 74 6f 20 4e 41 4d  MOTE_USER to NAM
7a50: 45 2e 0a 2a 2a 20 20 20 20 2a 20 20 22 72 65 61  E..**    *  "rea
7a60: 6c 6d 20 54 45 58 54 22 20 73 65 74 73 20 74 68  lm TEXT" sets th
7a70: 65 20 72 65 61 6c 6d 20 74 6f 20 54 45 58 54 2e  e realm to TEXT.
7a80: 0a 2a 2a 20 20 20 20 2a 20 20 22 61 6e 79 6f 6e  .**    *  "anyon
7a90: 65 22 20 62 79 70 61 73 73 65 73 20 61 75 74 68  e" bypasses auth
7aa0: 65 6e 74 69 63 61 74 69 6f 6e 20 61 6e 64 20 61  entication and a
7ab0: 6c 6c 6f 77 73 20 61 6e 79 6f 6e 65 20 74 6f 20  llows anyone to 
7ac0: 73 65 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  see the.**      
7ad0: 20 66 69 6c 65 73 2e 20 20 55 73 65 66 75 6c 20   files.  Useful 
7ae0: 69 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 77  in combination w
7af0: 69 74 68 20 22 68 74 74 70 2d 72 65 64 69 72 65  ith "http-redire
7b00: 63 74 22 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ct".*/.static in
7b10: 74 20 43 68 65 63 6b 42 61 73 69 63 41 75 74 68  t CheckBasicAuth
7b20: 6f 72 69 7a 61 74 69 6f 6e 28 63 6f 6e 73 74 20  orization(const 
7b30: 63 68 61 72 20 2a 7a 41 75 74 68 46 69 6c 65 29  char *zAuthFile)
7b40: 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20  {.  FILE *in;.  
7b50: 63 68 61 72 20 2a 7a 52 65 61 6c 6d 20 3d 20 22  char *zRealm = "
7b60: 75 6e 6b 6e 6f 77 6e 20 72 65 61 6c 6d 22 3b 0a  unknown realm";.
7b70: 20 20 63 68 61 72 20 2a 7a 4c 6f 67 69 6e 50 73    char *zLoginPs
7b80: 77 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  wd;.  char *zNam
7b90: 65 3b 0a 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b  e;.  char zLine[
7ba0: 32 30 30 30 5d 3b 0a 0a 20 20 69 6e 20 3d 20 66  2000];..  in = f
7bb0: 6f 70 65 6e 28 7a 41 75 74 68 46 69 6c 65 2c 20  open(zAuthFile, 
7bc0: 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d  "rb");.  if( in=
7bd0: 3d 30 20 29 7b 0a 20 20 20 20 4e 6f 74 46 6f 75  =0 ){.    NotFou
7be0: 6e 64 28 31 35 30 29 3b 20 20 2f 2a 20 4c 4f 47  nd(150);  /* LOG
7bf0: 3a 20 43 61 6e 6e 6f 74 20 6f 70 65 6e 20 2d 61  : Cannot open -a
7c00: 75 74 68 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  uth file */.    
7c10: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
7c20: 69 66 28 20 7a 41 75 74 68 41 72 67 20 29 20 44  if( zAuthArg ) D
7c30: 65 63 6f 64 65 36 34 28 7a 41 75 74 68 41 72 67  ecode64(zAuthArg
7c40: 29 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74  );.  while( fget
7c50: 73 28 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f 66 28  s(zLine, sizeof(
7c60: 7a 4c 69 6e 65 29 2c 20 69 6e 29 20 29 7b 0a 20  zLine), in) ){. 
7c70: 20 20 20 63 68 61 72 20 2a 7a 46 69 65 6c 64 4e     char *zFieldN
7c80: 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ame;.    char *z
7c90: 56 61 6c 3b 0a 0a 20 20 20 20 7a 46 69 65 6c 64  Val;..    zField
7ca0: 4e 61 6d 65 20 3d 20 47 65 74 46 69 72 73 74 45  Name = GetFirstE
7cb0: 6c 65 6d 65 6e 74 28 7a 4c 69 6e 65 2c 26 7a 56  lement(zLine,&zV
7cc0: 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a 46 69  al);.    if( zFi
7cd0: 65 6c 64 4e 61 6d 65 3d 3d 30 20 7c 7c 20 2a 7a  eldName==0 || *z
7ce0: 46 69 65 6c 64 4e 61 6d 65 3d 3d 30 20 29 20 63  FieldName==0 ) c
7cf0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
7d00: 20 7a 46 69 65 6c 64 4e 61 6d 65 5b 30 5d 3d 3d   zFieldName[0]==
7d10: 27 23 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  '#' ) continue;.
7d20: 20 20 20 20 52 65 6d 6f 76 65 4e 65 77 6c 69 6e      RemoveNewlin
7d30: 65 28 7a 56 61 6c 29 3b 0a 20 20 20 20 69 66 28  e(zVal);.    if(
7d40: 20 73 74 72 63 6d 70 28 7a 46 69 65 6c 64 4e 61   strcmp(zFieldNa
7d50: 6d 65 2c 20 22 72 65 61 6c 6d 22 29 3d 3d 30 20  me, "realm")==0 
7d60: 29 7b 0a 20 20 20 20 20 20 7a 52 65 61 6c 6d 20  ){.      zRealm 
7d70: 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a  = StrDup(zVal);.
7d80: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
7d90: 72 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c  rcmp(zFieldName,
7da0: 22 75 73 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20  "user")==0 ){.  
7db0: 20 20 20 20 69 66 28 20 7a 41 75 74 68 41 72 67      if( zAuthArg
7dc0: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
7dd0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 47 65        zName = Ge
7de0: 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a 56  tFirstElement(zV
7df0: 61 6c 2c 20 26 7a 56 61 6c 29 3b 0a 20 20 20 20  al, &zVal);.    
7e00: 20 20 7a 4c 6f 67 69 6e 50 73 77 64 20 3d 20 47    zLoginPswd = G
7e10: 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a  etFirstElement(z
7e20: 56 61 6c 2c 20 26 7a 56 61 6c 29 3b 0a 20 20 20  Val, &zVal);.   
7e30: 20 20 20 69 66 28 20 7a 4c 6f 67 69 6e 50 73 77     if( zLoginPsw
7e40: 64 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  d==0 ) continue;
7e50: 0a 20 20 20 20 20 20 69 66 28 20 7a 41 75 74 68  .      if( zAuth
7e60: 41 72 67 20 26 26 20 73 74 72 63 6d 70 28 7a 41  Arg && strcmp(zA
7e70: 75 74 68 41 72 67 2c 7a 4c 6f 67 69 6e 50 73 77  uthArg,zLoginPsw
7e80: 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  d)==0 ){.       
7e90: 20 7a 52 65 6d 6f 74 65 55 73 65 72 20 3d 20 53   zRemoteUser = S
7ea0: 74 72 44 75 70 28 7a 4e 61 6d 65 29 3b 0a 20 20  trDup(zName);.  
7eb0: 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29        fclose(in)
7ec0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
7ed0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
7ee0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
7ef0: 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 68 74 74  (zFieldName,"htt
7f00: 70 73 2d 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a  ps-only")==0 ){.
7f10: 20 20 20 20 20 20 69 66 28 20 21 75 73 65 48 74        if( !useHt
7f20: 74 70 73 20 29 7b 0a 20 20 20 20 20 20 20 20 4e  tps ){.        N
7f30: 6f 74 46 6f 75 6e 64 28 31 36 30 29 3b 20 20 2f  otFound(160);  /
7f40: 2a 20 4c 4f 47 3a 20 20 68 74 74 70 20 72 65 71  * LOG:  http req
7f50: 75 65 73 74 20 6f 6e 20 68 74 74 70 73 2d 6f 6e  uest on https-on
7f60: 6c 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ly page */.     
7f70: 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
7f80: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
7f90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
7fa0: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46  se if( strcmp(zF
7fb0: 69 65 6c 64 4e 61 6d 65 2c 22 68 74 74 70 2d 72  ieldName,"http-r
7fc0: 65 64 69 72 65 63 74 22 29 3d 3d 30 20 29 7b 0a  edirect")==0 ){.
7fd0: 20 20 20 20 20 20 69 66 28 20 21 75 73 65 48 74        if( !useHt
7fe0: 74 70 73 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  tps ){.        z
7ff0: 48 74 74 70 20 3d 20 22 68 74 74 70 73 22 3b 0a  Http = "https";.
8000: 20 20 20 20 20 20 20 20 52 65 64 69 72 65 63 74          Redirect
8010: 28 7a 53 63 72 69 70 74 2c 20 31 2c 20 31 37 30  (zScript, 1, 170
8020: 29 3b 20 2f 2a 20 4c 4f 47 3a 20 2d 61 75 74 68  ); /* LOG: -auth
8030: 20 72 65 64 69 72 65 63 74 20 2a 2f 0a 20 20 20   redirect */.   
8040: 20 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b       fclose(in);
8050: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8060: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
8070: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
8080: 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 61 6e 79 6f  zFieldName,"anyo
8090: 6e 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ne")==0 ){.     
80a0: 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20   fclose(in);.   
80b0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
80c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4e 6f   }else{.      No
80d0: 74 46 6f 75 6e 64 28 31 38 30 29 3b 20 20 2f 2a  tFound(180);  /*
80e0: 20 4c 4f 47 3a 20 20 6d 61 6c 66 6f 72 6d 65 64   LOG:  malformed
80f0: 20 65 6e 74 72 79 20 69 6e 20 2d 61 75 74 68 20   entry in -auth 
8100: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 66 63  file */.      fc
8110: 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20  lose(in);.      
8120: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
8130: 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29    }.  fclose(in)
8140: 3b 0a 20 20 4e 6f 74 41 75 74 68 6f 72 69 7a 65  ;.  NotAuthorize
8150: 64 28 7a 52 65 61 6c 6d 29 3b 0a 20 20 72 65 74  d(zRealm);.  ret
8160: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
8170: 47 75 65 73 73 20 74 68 65 20 6d 69 6d 65 2d 74  Guess the mime-t
8180: 79 70 65 20 6f 66 20 61 20 64 6f 63 75 6d 65 6e  ype of a documen
8190: 74 20 62 61 73 65 64 20 6f 6e 20 69 74 73 20 6e  t based on its n
81a0: 61 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ame..*/.const ch
81b0: 61 72 20 2a 47 65 74 4d 69 6d 65 54 79 70 65 28  ar *GetMimeType(
81c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
81d0: 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20  e, int nName){. 
81e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
81f0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 66    int i;.  int f
8200: 69 72 73 74 2c 20 6c 61 73 74 3b 0a 20 20 69 6e  irst, last;.  in
8210: 74 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20 7a 53  t len;.  char zS
8220: 75 66 66 69 78 5b 32 30 5d 3b 0a 0a 20 20 2f 2a  uffix[20];..  /*
8230: 20 41 20 74 61 62 6c 65 20 6f 66 20 6d 69 6d 65   A table of mime
8240: 74 79 70 65 73 20 62 61 73 65 64 20 6f 6e 20 66  types based on f
8250: 69 6c 65 20 73 75 66 66 69 78 65 73 2e 20 0a 20  ile suffixes. . 
8260: 20 2a 2a 20 53 75 66 66 69 78 65 73 20 6d 75 73   ** Suffixes mus
8270: 74 20 62 65 20 69 6e 20 73 6f 72 74 65 64 20 6f  t be in sorted o
8280: 72 64 65 72 20 73 6f 20 74 68 61 74 20 77 65 20  rder so that we 
8290: 63 61 6e 20 64 6f 20 61 20 62 69 6e 61 72 79 0a  can do a binary.
82a0: 20 20 2a 2a 20 73 65 61 72 63 68 20 74 6f 20 66    ** search to f
82b0: 69 6e 64 20 74 68 65 20 6d 69 6d 65 2d 74 79 70  ind the mime-typ
82c0: 65 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  e.  */.  static 
82d0: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
82e0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
82f0: 53 75 66 66 69 78 3b 20 20 20 20 20 20 20 2f 2a  Suffix;       /*
8300: 20 54 68 65 20 66 69 6c 65 20 73 75 66 66 69 78   The file suffix
8310: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 69 7a 65   */.    int size
8320: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8330: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
8340: 74 68 65 20 73 75 66 66 69 78 20 2a 2f 0a 20 20  the suffix */.  
8350: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d    const char *zM
8360: 69 6d 65 74 79 70 65 3b 20 20 20 20 20 2f 2a 20  imetype;     /* 
8370: 54 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  The correspondin
8380: 67 20 6d 69 6d 65 74 79 70 65 20 2a 2f 0a 20 20  g mimetype */.  
8390: 7d 20 61 4d 69 6d 65 5b 5d 20 3d 20 7b 0a 20 20  } aMime[] = {.  
83a0: 20 20 7b 20 22 61 69 22 2c 20 20 20 20 20 20 20    { "ai",       
83b0: 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    2, "applicatio
83c0: 6e 2f 70 6f 73 74 73 63 72 69 70 74 22 20 20 20  n/postscript"   
83d0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
83e0: 7b 20 22 61 69 66 22 2c 20 20 20 20 20 20 20 20  { "aif",        
83f0: 33 2c 20 22 61 75 64 69 6f 2f 78 2d 61 69 66 66  3, "audio/x-aiff
8400: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8410: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8420: 22 61 69 66 63 22 2c 20 20 20 20 20 20 20 34 2c  "aifc",       4,
8430: 20 22 61 75 64 69 6f 2f 78 2d 61 69 66 66 22 20   "audio/x-aiff" 
8440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8450: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61       },.    { "a
8460: 69 66 66 22 2c 20 20 20 20 20 20 20 34 2c 20 22  iff",       4, "
8470: 61 75 64 69 6f 2f 78 2d 61 69 66 66 22 20 20 20  audio/x-aiff"   
8480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8490: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 72 6a     },.    { "arj
84a0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
84b0: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 61 72 6a 2d  plication/x-arj-
84c0: 63 6f 6d 70 72 65 73 73 65 64 22 20 20 20 20 20  compressed"     
84d0: 20 7d 2c 0a 20 20 20 20 7b 20 22 61 73 63 22 2c   },.    { "asc",
84e0: 20 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74          3, "text
84f0: 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20  /plain"         
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8510: 2c 0a 20 20 20 20 7b 20 22 61 73 66 22 2c 20 20  ,.    { "asf",  
8520: 20 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f        3, "video/
8530: 78 2d 6d 73 2d 61 73 66 22 20 20 20 20 20 20 20  x-ms-asf"       
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
8550: 20 20 20 20 7b 20 22 61 73 78 22 2c 20 20 20 20      { "asx",    
8560: 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d      3, "video/x-
8570: 6d 73 2d 61 73 78 22 20 20 20 20 20 20 20 20 20  ms-asx"         
8580: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8590: 20 20 7b 20 22 61 75 22 2c 20 20 20 20 20 20 20    { "au",       
85a0: 20 20 32 2c 20 22 61 75 64 69 6f 2f 75 6c 61 77    2, "audio/ulaw
85b0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
85c0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
85d0: 7b 20 22 61 76 69 22 2c 20 20 20 20 20 20 20 20  { "avi",        
85e0: 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 76 69  3, "video/x-msvi
85f0: 64 65 6f 22 20 20 20 20 20 20 20 20 20 20 20 20  deo"            
8600: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8610: 22 62 61 74 22 2c 20 20 20 20 20 20 20 20 33 2c  "bat",        3,
8620: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
8630: 6d 73 64 6f 73 2d 70 72 6f 67 72 61 6d 22 20 20  msdos-program"  
8640: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 62       },.    { "b
8650: 63 70 69 6f 22 2c 20 20 20 20 20 20 35 2c 20 22  cpio",      5, "
8660: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 62 63  application/x-bc
8670: 70 69 6f 22 20 20 20 20 20 20 20 20 20 20 20 20  pio"            
8680: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 62 69 6e     },.    { "bin
8690: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
86a0: 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d  plication/octet-
86b0: 73 74 72 65 61 6d 22 20 20 20 20 20 20 20 20 20  stream"         
86c0: 20 7d 2c 0a 20 20 20 20 7b 20 22 63 22 2c 20 20   },.    { "c",  
86d0: 20 20 20 20 20 20 20 20 31 2c 20 22 74 65 78 74          1, "text
86e0: 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20  /plain"         
86f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8700: 2c 0a 20 20 20 20 7b 20 22 63 63 22 2c 20 20 20  ,.    { "cc",   
8710: 20 20 20 20 20 20 32 2c 20 22 74 65 78 74 2f 70        2, "text/p
8720: 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20 20 20  lain"           
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
8740: 20 20 20 20 7b 20 22 63 63 61 64 22 2c 20 20 20      { "ccad",   
8750: 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74      4, "applicat
8760: 69 6f 6e 2f 63 6c 61 72 69 73 63 61 64 22 20 20  ion/clariscad"  
8770: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8780: 20 20 7b 20 22 63 64 66 22 2c 20 20 20 20 20 20    { "cdf",      
8790: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
87a0: 6e 2f 78 2d 6e 65 74 63 64 66 22 20 20 20 20 20  n/x-netcdf"     
87b0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
87c0: 7b 20 22 63 6c 61 73 73 22 2c 20 20 20 20 20 20  { "class",      
87d0: 35 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  5, "application/
87e0: 6f 63 74 65 74 2d 73 74 72 65 61 6d 22 20 20 20  octet-stream"   
87f0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8800: 22 63 6f 64 22 2c 20 20 20 20 20 20 20 20 33 2c  "cod",        3,
8810: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76 6e   "application/vn
8820: 64 2e 72 69 6d 2e 63 6f 64 22 20 20 20 20 20 20  d.rim.cod"      
8830: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63       },.    { "c
8840: 6f 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  om",        3, "
8850: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6d 73  application/x-ms
8860: 64 6f 73 2d 70 72 6f 67 72 61 6d 22 20 20 20 20  dos-program"    
8870: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 70 69     },.    { "cpi
8880: 6f 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70  o",       4, "ap
8890: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 63 70 69 6f  plication/x-cpio
88a0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
88b0: 20 7d 2c 0a 20 20 20 20 7b 20 22 63 70 74 22 2c   },.    { "cpt",
88c0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
88d0: 69 63 61 74 69 6f 6e 2f 6d 61 63 2d 63 6f 6d 70  ication/mac-comp
88e0: 61 63 74 70 72 6f 22 20 20 20 20 20 20 20 20 7d  actpro"        }
88f0: 2c 0a 20 20 20 20 7b 20 22 63 73 68 22 2c 20 20  ,.    { "csh",  
8900: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
8910: 61 74 69 6f 6e 2f 78 2d 63 73 68 22 20 20 20 20  ation/x-csh"    
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
8930: 20 20 20 20 7b 20 22 63 73 73 22 2c 20 20 20 20      { "css",    
8940: 20 20 20 20 33 2c 20 22 74 65 78 74 2f 63 73 73      3, "text/css
8950: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8960: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8970: 20 20 7b 20 22 64 63 72 22 2c 20 20 20 20 20 20    { "dcr",      
8980: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
8990: 6e 2f 78 2d 64 69 72 65 63 74 6f 72 22 20 20 20  n/x-director"   
89a0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
89b0: 7b 20 22 64 65 62 22 2c 20 20 20 20 20 20 20 20  { "deb",        
89c0: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
89d0: 78 2d 64 65 62 69 61 6e 2d 70 61 63 6b 61 67 65  x-debian-package
89e0: 22 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20  "      },.    { 
89f0: 22 64 69 72 22 2c 20 20 20 20 20 20 20 20 33 2c  "dir",        3,
8a00: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
8a10: 64 69 72 65 63 74 6f 72 22 20 20 20 20 20 20 20  director"       
8a20: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64       },.    { "d
8a30: 6c 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22  l",         2, "
8a40: 76 69 64 65 6f 2f 64 6c 22 20 20 20 20 20 20 20  video/dl"       
8a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a60: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 6d 73     },.    { "dms
8a70: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
8a80: 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d  plication/octet-
8a90: 73 74 72 65 61 6d 22 20 20 20 20 20 20 20 20 20  stream"         
8aa0: 20 7d 2c 0a 20 20 20 20 7b 20 22 64 6f 63 22 2c   },.    { "doc",
8ab0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
8ac0: 69 63 61 74 69 6f 6e 2f 6d 73 77 6f 72 64 22 20  ication/msword" 
8ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8ae0: 2c 0a 20 20 20 20 7b 20 22 64 72 77 22 2c 20 20  ,.    { "drw",  
8af0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
8b00: 61 74 69 6f 6e 2f 64 72 61 66 74 69 6e 67 22 20  ation/drafting" 
8b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
8b20: 20 20 20 20 7b 20 22 64 76 69 22 2c 20 20 20 20      { "dvi",    
8b30: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
8b40: 69 6f 6e 2f 78 2d 64 76 69 22 20 20 20 20 20 20  ion/x-dvi"      
8b50: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8b60: 20 20 7b 20 22 64 77 67 22 2c 20 20 20 20 20 20    { "dwg",      
8b70: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
8b80: 6e 2f 61 63 61 64 22 20 20 20 20 20 20 20 20 20  n/acad"         
8b90: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
8ba0: 7b 20 22 64 78 66 22 2c 20 20 20 20 20 20 20 20  { "dxf",        
8bb0: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
8bc0: 64 78 66 22 20 20 20 20 20 20 20 20 20 20 20 20  dxf"            
8bd0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8be0: 22 64 78 72 22 2c 20 20 20 20 20 20 20 20 33 2c  "dxr",        3,
8bf0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
8c00: 64 69 72 65 63 74 6f 72 22 20 20 20 20 20 20 20  director"       
8c10: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65       },.    { "e
8c20: 70 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ps",        3, "
8c30: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 6f 73 74  application/post
8c40: 73 63 72 69 70 74 22 20 20 20 20 20 20 20 20 20  script"         
8c50: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65 74 78     },.    { "etx
8c60: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65  ",        3, "te
8c70: 78 74 2f 78 2d 73 65 74 65 78 74 22 20 20 20 20  xt/x-setext"    
8c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c90: 20 7d 2c 0a 20 20 20 20 7b 20 22 65 78 65 22 2c   },.    { "exe",
8ca0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
8cb0: 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74  ication/octet-st
8cc0: 72 65 61 6d 22 20 20 20 20 20 20 20 20 20 20 7d  ream"          }
8cd0: 2c 0a 20 20 20 20 7b 20 22 65 7a 22 2c 20 20 20  ,.    { "ez",   
8ce0: 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63        2, "applic
8cf0: 61 74 69 6f 6e 2f 61 6e 64 72 65 77 2d 69 6e 73  ation/andrew-ins
8d00: 65 74 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  et"          },.
8d10: 20 20 20 20 7b 20 22 66 22 2c 20 20 20 20 20 20      { "f",      
8d20: 20 20 20 20 31 2c 20 22 74 65 78 74 2f 70 6c 61      1, "text/pla
8d30: 69 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20  in"             
8d40: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8d50: 20 20 7b 20 22 66 39 30 22 2c 20 20 20 20 20 20    { "f90",      
8d60: 20 20 33 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e    3, "text/plain
8d70: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8d80: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
8d90: 7b 20 22 66 6c 69 22 2c 20 20 20 20 20 20 20 20  { "fli",        
8da0: 33 2c 20 22 76 69 64 65 6f 2f 66 6c 69 22 20 20  3, "video/fli"  
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8dc0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8dd0: 22 66 6c 76 22 2c 20 20 20 20 20 20 20 20 33 2c  "flv",        3,
8de0: 20 22 76 69 64 65 6f 2f 66 6c 76 22 20 20 20 20   "video/flv"    
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e00: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 67       },.    { "g
8e10: 69 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  if",        3, "
8e20: 69 6d 61 67 65 2f 67 69 66 22 20 20 20 20 20 20  image/gif"      
8e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e40: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 67 6c 22     },.    { "gl"
8e50: 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 76 69  ,         2, "vi
8e60: 64 65 6f 2f 67 6c 22 20 20 20 20 20 20 20 20 20  deo/gl"         
8e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e80: 20 7d 2c 0a 20 20 20 20 7b 20 22 67 74 61 72 22   },.    { "gtar"
8e90: 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c  ,       4, "appl
8ea0: 69 63 61 74 69 6f 6e 2f 78 2d 67 74 61 72 22 20  ication/x-gtar" 
8eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8ec0: 2c 0a 20 20 20 20 7b 20 22 67 7a 22 2c 20 20 20  ,.    { "gz",   
8ed0: 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63        2, "applic
8ee0: 61 74 69 6f 6e 2f 78 2d 67 7a 69 70 22 20 20 20  ation/x-gzip"   
8ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
8f00: 20 20 20 20 7b 20 22 68 64 66 22 2c 20 20 20 20      { "hdf",    
8f10: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
8f20: 69 6f 6e 2f 78 2d 68 64 66 22 20 20 20 20 20 20  ion/x-hdf"      
8f30: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8f40: 20 20 7b 20 22 68 68 22 2c 20 20 20 20 20 20 20    { "hh",       
8f50: 20 20 32 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e    2, "text/plain
8f60: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8f70: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
8f80: 7b 20 22 68 71 78 22 2c 20 20 20 20 20 20 20 20  { "hqx",        
8f90: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
8fa0: 6d 61 63 2d 62 69 6e 68 65 78 34 30 22 20 20 20  mac-binhex40"   
8fb0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8fc0: 22 68 22 2c 20 20 20 20 20 20 20 20 20 20 31 2c  "h",          1,
8fd0: 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20 20   "text/plain"   
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ff0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68       },.    { "h
9000: 74 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  tm",        3, "
9010: 74 65 78 74 2f 68 74 6d 6c 3b 20 63 68 61 72 73  text/html; chars
9020: 65 74 3d 75 74 66 2d 38 22 20 20 20 20 20 20 20  et=utf-8"       
9030: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68 74 6d     },.    { "htm
9040: 6c 22 2c 20 20 20 20 20 20 20 34 2c 20 22 74 65  l",       4, "te
9050: 78 74 2f 68 74 6d 6c 3b 20 63 68 61 72 73 65 74  xt/html; charset
9060: 3d 75 74 66 2d 38 22 20 20 20 20 20 20 20 20 20  =utf-8"         
9070: 20 7d 2c 0a 20 20 20 20 7b 20 22 69 63 65 22 2c   },.    { "ice",
9080: 20 20 20 20 20 20 20 20 33 2c 20 22 78 2d 63 6f          3, "x-co
9090: 6e 66 65 72 65 6e 63 65 2f 78 2d 63 6f 6f 6c 74  nference/x-coolt
90a0: 61 6c 6b 22 20 20 20 20 20 20 20 20 20 20 20 7d  alk"           }
90b0: 2c 0a 20 20 20 20 7b 20 22 69 65 66 22 2c 20 20  ,.    { "ief",  
90c0: 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f        3, "image/
90d0: 69 65 66 22 20 20 20 20 20 20 20 20 20 20 20 20  ief"            
90e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
90f0: 20 20 20 20 7b 20 22 69 67 65 73 22 2c 20 20 20      { "iges",   
9100: 20 20 20 20 34 2c 20 22 6d 6f 64 65 6c 2f 69 67      4, "model/ig
9110: 65 73 22 20 20 20 20 20 20 20 20 20 20 20 20 20  es"             
9120: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
9130: 20 20 7b 20 22 69 67 73 22 2c 20 20 20 20 20 20    { "igs",      
9140: 20 20 33 2c 20 22 6d 6f 64 65 6c 2f 69 67 65 73    3, "model/iges
9150: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9160: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9170: 7b 20 22 69 70 73 22 2c 20 20 20 20 20 20 20 20  { "ips",        
9180: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
9190: 78 2d 69 70 73 63 72 69 70 74 22 20 20 20 20 20  x-ipscript"     
91a0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
91b0: 22 69 70 78 22 2c 20 20 20 20 20 20 20 20 33 2c  "ipx",        3,
91c0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
91d0: 69 70 69 78 22 20 20 20 20 20 20 20 20 20 20 20  ipix"           
91e0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a       },.    { "j
91f0: 61 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ad",        3, "
9200: 74 65 78 74 2f 76 6e 64 2e 73 75 6e 2e 6a 32 6d  text/vnd.sun.j2m
9210: 65 2e 61 70 70 2d 64 65 73 63 72 69 70 74 6f 72  e.app-descriptor
9220: 22 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 61 72  "  },.    { "jar
9230: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
9240: 70 6c 69 63 61 74 69 6f 6e 2f 6a 61 76 61 2d 61  plication/java-a
9250: 72 63 68 69 76 65 22 20 20 20 20 20 20 20 20 20  rchive"         
9260: 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 70 65 67 22   },.    { "jpeg"
9270: 2c 20 20 20 20 20 20 20 34 2c 20 22 69 6d 61 67  ,       4, "imag
9280: 65 2f 6a 70 65 67 22 20 20 20 20 20 20 20 20 20  e/jpeg"         
9290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
92a0: 2c 0a 20 20 20 20 7b 20 22 6a 70 65 22 2c 20 20  ,.    { "jpe",  
92b0: 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f        3, "image/
92c0: 6a 70 65 67 22 20 20 20 20 20 20 20 20 20 20 20  jpeg"           
92d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
92e0: 20 20 20 20 7b 20 22 6a 70 67 22 2c 20 20 20 20      { "jpg",    
92f0: 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 6a 70      3, "image/jp
9300: 65 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20  eg"             
9310: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
9320: 20 20 7b 20 22 6a 73 22 2c 20 20 20 20 20 20 20    { "js",       
9330: 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    2, "applicatio
9340: 6e 2f 78 2d 6a 61 76 61 73 63 72 69 70 74 22 20  n/x-javascript" 
9350: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9360: 7b 20 22 6b 61 72 22 2c 20 20 20 20 20 20 20 20  { "kar",        
9370: 33 2c 20 22 61 75 64 69 6f 2f 6d 69 64 69 22 20  3, "audio/midi" 
9380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9390: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
93a0: 22 6c 61 74 65 78 22 2c 20 20 20 20 20 20 35 2c  "latex",      5,
93b0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
93c0: 6c 61 74 65 78 22 20 20 20 20 20 20 20 20 20 20  latex"          
93d0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c       },.    { "l
93e0: 68 61 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ha",        3, "
93f0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65  application/octe
9400: 74 2d 73 74 72 65 61 6d 22 20 20 20 20 20 20 20  t-stream"       
9410: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 73 70     },.    { "lsp
9420: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
9430: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6c 69 73 70  plication/x-lisp
9440: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9450: 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 7a 68 22 2c   },.    { "lzh",
9460: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
9470: 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74  ication/octet-st
9480: 72 65 61 6d 22 20 20 20 20 20 20 20 20 20 20 7d  ream"          }
9490: 2c 0a 20 20 20 20 7b 20 22 6d 22 2c 20 20 20 20  ,.    { "m",    
94a0: 20 20 20 20 20 20 31 2c 20 22 74 65 78 74 2f 70        1, "text/p
94b0: 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20 20 20  lain"           
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
94d0: 20 20 20 20 7b 20 22 6d 33 75 22 2c 20 20 20 20      { "m3u",    
94e0: 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d      3, "audio/x-
94f0: 6d 70 65 67 75 72 6c 22 20 20 20 20 20 20 20 20  mpegurl"        
9500: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
9510: 20 20 7b 20 22 6d 61 6e 22 2c 20 20 20 20 20 20    { "man",      
9520: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
9530: 6e 2f 78 2d 74 72 6f 66 66 2d 6d 61 6e 22 20 20  n/x-troff-man"  
9540: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9550: 7b 20 22 6d 65 22 2c 20 20 20 20 20 20 20 20 20  { "me",         
9560: 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  2, "application/
9570: 78 2d 74 72 6f 66 66 2d 6d 65 22 20 20 20 20 20  x-troff-me"     
9580: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
9590: 22 6d 65 73 68 22 2c 20 20 20 20 20 20 20 34 2c  "mesh",       4,
95a0: 20 22 6d 6f 64 65 6c 2f 6d 65 73 68 22 20 20 20   "model/mesh"   
95b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95c0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d       },.    { "m
95d0: 69 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  id",        3, "
95e0: 61 75 64 69 6f 2f 6d 69 64 69 22 20 20 20 20 20  audio/midi"     
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9600: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 69 64     },.    { "mid
9610: 69 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 75  i",       4, "au
9620: 64 69 6f 2f 6d 69 64 69 22 20 20 20 20 20 20 20  dio/midi"       
9630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9640: 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 69 66 22 2c   },.    { "mif",
9650: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
9660: 69 63 61 74 69 6f 6e 2f 78 2d 6d 69 66 22 20 20  ication/x-mif"  
9670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
9680: 2c 0a 20 20 20 20 7b 20 22 6d 69 6d 65 22 2c 20  ,.    { "mime", 
9690: 20 20 20 20 20 20 34 2c 20 22 77 77 77 2f 6d 69        4, "www/mi
96a0: 6d 65 22 20 20 20 20 20 20 20 20 20 20 20 20 20  me"             
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
96c0: 20 20 20 20 7b 20 22 6d 6f 76 69 65 22 2c 20 20      { "movie",  
96d0: 20 20 20 20 35 2c 20 22 76 69 64 65 6f 2f 78 2d      5, "video/x-
96e0: 73 67 69 2d 6d 6f 76 69 65 22 20 20 20 20 20 20  sgi-movie"      
96f0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
9700: 20 20 7b 20 22 6d 6f 76 22 2c 20 20 20 20 20 20    { "mov",      
9710: 20 20 33 2c 20 22 76 69 64 65 6f 2f 71 75 69 63    3, "video/quic
9720: 6b 74 69 6d 65 22 20 20 20 20 20 20 20 20 20 20  ktime"          
9730: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9740: 7b 20 22 6d 70 32 22 2c 20 20 20 20 20 20 20 20  { "mp2",        
9750: 33 2c 20 22 61 75 64 69 6f 2f 6d 70 65 67 22 20  3, "audio/mpeg" 
9760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9770: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
9780: 22 6d 70 32 22 2c 20 20 20 20 20 20 20 20 33 2c  "mp2",        3,
9790: 20 22 76 69 64 65 6f 2f 6d 70 65 67 22 20 20 20   "video/mpeg"   
97a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97b0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d       },.    { "m
97c0: 70 33 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  p3",        3, "
97d0: 61 75 64 69 6f 2f 6d 70 65 67 22 20 20 20 20 20  audio/mpeg"     
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97f0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 65     },.    { "mpe
9800: 67 22 2c 20 20 20 20 20 20 20 34 2c 20 22 76 69  g",       4, "vi
9810: 64 65 6f 2f 6d 70 65 67 22 20 20 20 20 20 20 20  deo/mpeg"       
9820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9830: 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 65 22 2c   },.    { "mpe",
9840: 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64 65          3, "vide
9850: 6f 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20 20  o/mpeg"         
9860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
9870: 2c 0a 20 20 20 20 7b 20 22 6d 70 67 61 22 2c 20  ,.    { "mpga", 
9880: 20 20 20 20 20 20 34 2c 20 22 61 75 64 69 6f 2f        4, "audio/
9890: 6d 70 65 67 22 20 20 20 20 20 20 20 20 20 20 20  mpeg"           
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
98b0: 20 20 20 20 7b 20 22 6d 70 67 22 2c 20 20 20 20      { "mpg",    
98c0: 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 6d 70      3, "video/mp
98d0: 65 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20  eg"             
98e0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
98f0: 20 20 7b 20 22 6d 73 22 2c 20 20 20 20 20 20 20    { "ms",       
9900: 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    2, "applicatio
9910: 6e 2f 78 2d 74 72 6f 66 66 2d 6d 73 22 20 20 20  n/x-troff-ms"   
9920: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9930: 7b 20 22 6d 73 68 22 2c 20 20 20 20 20 20 20 20  { "msh",        
9940: 33 2c 20 22 6d 6f 64 65 6c 2f 6d 65 73 68 22 20  3, "model/mesh" 
9950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9960: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
9970: 22 6e 63 22 2c 20 20 20 20 20 20 20 20 20 32 2c  "nc",         2,
9980: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
9990: 6e 65 74 63 64 66 22 20 20 20 20 20 20 20 20 20  netcdf"         
99a0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f       },.    { "o
99b0: 64 61 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  da",        3, "
99c0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 64 61 22  application/oda"
99d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99e0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 67 67     },.    { "ogg
99f0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
9a00: 70 6c 69 63 61 74 69 6f 6e 2f 6f 67 67 22 20 20  plication/ogg"  
9a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a20: 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 67 6d 22 2c   },.    { "ogm",
9a30: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
9a40: 69 63 61 74 69 6f 6e 2f 6f 67 67 22 20 20 20 20  ication/ogg"    
9a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
9a60: 2c 0a 20 20 20 20 7b 20 22 70 62 6d 22 2c 20 20  ,.    { "pbm",  
9a70: 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f        3, "image/
9a80: 78 2d 70 6f 72 74 61 62 6c 65 2d 62 69 74 6d 61  x-portable-bitma
9a90: 70 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  p"           },.
9aa0: 20 20 20 20 7b 20 22 70 64 62 22 2c 20 20 20 20      { "pdb",    
9ab0: 20 20 20 20 33 2c 20 22 63 68 65 6d 69 63 61 6c      3, "chemical
9ac0: 2f 78 2d 70 64 62 22 20 20 20 20 20 20 20 20 20  /x-pdb"         
9ad0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
9ae0: 20 20 7b 20 22 70 64 66 22 2c 20 20 20 20 20 20    { "pdf",      
9af0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
9b00: 6e 2f 70 64 66 22 20 20 20 20 20 20 20 20 20 20  n/pdf"          
9b10: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9b20: 7b 20 22 70 67 6d 22 2c 20 20 20 20 20 20 20 20  { "pgm",        
9b30: 33 2c 20 22 69 6d 61 67 65 2f 78 2d 70 6f 72 74  3, "image/x-port
9b40: 61 62 6c 65 2d 67 72 61 79 6d 61 70 22 20 20 20  able-graymap"   
9b50: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
9b60: 22 70 67 6e 22 2c 20 20 20 20 20 20 20 20 33 2c  "pgn",        3,
9b70: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
9b80: 63 68 65 73 73 2d 70 67 6e 22 20 20 20 20 20 20  chess-pgn"      
9b90: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70       },.    { "p
9ba0: 67 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  gp",        3, "
9bb0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 67 70 22  application/pgp"
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bd0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 6c 22     },.    { "pl"
9be0: 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70  ,         2, "ap
9bf0: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 70 65 72 6c  plication/x-perl
9c00: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9c10: 20 7d 2c 0a 20 20 20 20 7b 20 22 70 6d 22 2c 20   },.    { "pm", 
9c20: 20 20 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c          2, "appl
9c30: 69 63 61 74 69 6f 6e 2f 78 2d 70 65 72 6c 22 20  ication/x-perl" 
9c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
9c50: 2c 0a 20 20 20 20 7b 20 22 70 6e 67 22 2c 20 20  ,.    { "png",  
9c60: 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f        3, "image/
9c70: 70 6e 67 22 20 20 20 20 20 20 20 20 20 20 20 20  png"            
9c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
9c90: 20 20 20 20 7b 20 22 70 6e 6d 22 2c 20 20 20 20      { "pnm",    
9ca0: 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d      3, "image/x-
9cb0: 70 6f 72 74 61 62 6c 65 2d 61 6e 79 6d 61 70 22  portable-anymap"
9cc0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
9cd0: 20 20 7b 20 22 70 6f 74 22 2c 20 20 20 20 20 20    { "pot",      
9ce0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
9cf0: 6e 2f 6d 73 70 6f 77 65 72 70 6f 69 6e 74 22 20  n/mspowerpoint" 
9d00: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9d10: 7b 20 22 70 70 6d 22 2c 20 20 20 20 20 20 20 20  { "ppm",        
9d20: 33 2c 20 22 69 6d 61 67 65 2f 78 2d 70 6f 72 74  3, "image/x-port
9d30: 61 62 6c 65 2d 70 69 78 6d 61 70 22 20 20 20 20  able-pixmap"    
9d40: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
9d50: 22 70 70 73 22 2c 20 20 20 20 20 20 20 20 33 2c  "pps",        3,
9d60: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73   "application/ms
9d70: 70 6f 77 65 72 70 6f 69 6e 74 22 20 20 20 20 20  powerpoint"     
9d80: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70       },.    { "p
9d90: 70 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  pt",        3, "
9da0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 70 6f  application/mspo
9db0: 77 65 72 70 6f 69 6e 74 22 20 20 20 20 20 20 20  werpoint"       
9dc0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 70 7a     },.    { "ppz
9dd0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
9de0: 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 70 6f 77 65  plication/mspowe
9df0: 72 70 6f 69 6e 74 22 20 20 20 20 20 20 20 20 20  rpoint"         
9e00: 20 7d 2c 0a 20 20 20 20 7b 20 22 70 72 65 22 2c   },.    { "pre",
9e10: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
9e20: 69 63 61 74 69 6f 6e 2f 78 2d 66 72 65 65 6c 61  ication/x-freela
9e30: 6e 63 65 22 20 20 20 20 20 20 20 20 20 20 20 7d  nce"           }
9e40: 2c 0a 20 20 20 20 7b 20 22 70 72 74 22 2c 20 20  ,.    { "prt",  
9e50: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
9e60: 61 74 69 6f 6e 2f 70 72 6f 5f 65 6e 67 22 20 20  ation/pro_eng"  
9e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
9e80: 20 20 20 20 7b 20 22 70 73 22 2c 20 20 20 20 20      { "ps",     
9e90: 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74      2, "applicat
9ea0: 69 6f 6e 2f 70 6f 73 74 73 63 72 69 70 74 22 20  ion/postscript" 
9eb0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
9ec0: 20 20 7b 20 22 71 74 22 2c 20 20 20 20 20 20 20    { "qt",       
9ed0: 20 20 32 2c 20 22 76 69 64 65 6f 2f 71 75 69 63    2, "video/quic
9ee0: 6b 74 69 6d 65 22 20 20 20 20 20 20 20 20 20 20  ktime"          
9ef0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9f00: 7b 20 22 72 61 22 2c 20 20 20 20 20 20 20 20 20  { "ra",         
9f10: 32 2c 20 22 61 75 64 69 6f 2f 78 2d 72 65 61 6c  2, "audio/x-real
9f20: 61 75 64 69 6f 22 20 20 20 20 20 20 20 20 20 20  audio"          
9f30: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
9f40: 22 72 61 6d 22 2c 20 20 20 20 20 20 20 20 33 2c  "ram",        3,
9f50: 20 22 61 75 64 69 6f 2f 78 2d 70 6e 2d 72 65 61   "audio/x-pn-rea
9f60: 6c 61 75 64 69 6f 22 20 20 20 20 20 20 20 20 20  laudio"         
9f70: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72       },.    { "r
9f80: 61 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ar",        3, "
9f90: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 72 61  application/x-ra
9fa0: 72 2d 63 6f 6d 70 72 65 73 73 65 64 22 20 20 20  r-compressed"   
9fb0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61 73     },.    { "ras
9fc0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d  ",        3, "im
9fd0: 61 67 65 2f 63 6d 75 2d 72 61 73 74 65 72 22 20  age/cmu-raster" 
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ff0: 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61 73 22 2c   },.    { "ras",
a000: 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67          3, "imag
a010: 65 2f 78 2d 63 6d 75 2d 72 61 73 74 65 72 22 20  e/x-cmu-raster" 
a020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
a030: 2c 0a 20 20 20 20 7b 20 22 72 67 62 22 2c 20 20  ,.    { "rgb",  
a040: 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f        3, "image/
a050: 78 2d 72 67 62 22 20 20 20 20 20 20 20 20 20 20  x-rgb"          
a060: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
a070: 20 20 20 20 7b 20 22 72 6d 22 2c 20 20 20 20 20      { "rm",     
a080: 20 20 20 20 32 2c 20 22 61 75 64 69 6f 2f 78 2d      2, "audio/x-
a090: 70 6e 2d 72 65 61 6c 61 75 64 69 6f 22 20 20 20  pn-realaudio"   
a0a0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
a0b0: 20 20 7b 20 22 72 6f 66 66 22 2c 20 20 20 20 20    { "roff",     
a0c0: 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    4, "applicatio
a0d0: 6e 2f 78 2d 74 72 6f 66 66 22 20 20 20 20 20 20  n/x-troff"      
a0e0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
a0f0: 7b 20 22 72 70 6d 22 2c 20 20 20 20 20 20 20 20  { "rpm",        
a100: 33 2c 20 22 61 75 64 69 6f 2f 78 2d 70 6e 2d 72  3, "audio/x-pn-r
a110: 65 61 6c 61 75 64 69 6f 2d 70 6c 75 67 69 6e 22  ealaudio-plugin"
a120: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
a130: 22 72 74 66 22 2c 20 20 20 20 20 20 20 20 33 2c  "rtf",        3,
a140: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 72 74   "application/rt
a150: 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f"              
a160: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72       },.    { "r
a170: 74 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  tf",        3, "
a180: 74 65 78 74 2f 72 74 66 22 20 20 20 20 20 20 20  text/rtf"       
a190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1a0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 74 78     },.    { "rtx
a1b0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65  ",        3, "te
a1c0: 78 74 2f 72 69 63 68 74 65 78 74 22 20 20 20 20  xt/richtext"    
a1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1e0: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 63 6d 22 2c   },.    { "scm",
a1f0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
a200: 69 63 61 74 69 6f 6e 2f 78 2d 6c 6f 74 75 73 73  ication/x-lotuss
a210: 63 72 65 65 6e 63 61 6d 22 20 20 20 20 20 20 7d  creencam"      }
a220: 2c 0a 20 20 20 20 7b 20 22 73 65 74 22 2c 20 20  ,.    { "set",  
a230: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
a240: 61 74 69 6f 6e 2f 73 65 74 22 20 20 20 20 20 20  ation/set"      
a250: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
a260: 20 20 20 20 7b 20 22 73 67 6d 6c 22 2c 20 20 20      { "sgml",   
a270: 20 20 20 20 34 2c 20 22 74 65 78 74 2f 73 67 6d      4, "text/sgm
a280: 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l"              
a290: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
a2a0: 20 20 7b 20 22 73 67 6d 22 2c 20 20 20 20 20 20    { "sgm",      
a2b0: 20 20 33 2c 20 22 74 65 78 74 2f 73 67 6d 6c 22    3, "text/sgml"
a2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2d0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
a2e0: 7b 20 22 73 68 22 2c 20 20 20 20 20 20 20 20 20  { "sh",         
a2f0: 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  2, "application/
a300: 78 2d 73 68 22 20 20 20 20 20 20 20 20 20 20 20  x-sh"           
a310: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
a320: 22 73 68 61 72 22 2c 20 20 20 20 20 20 20 34 2c  "shar",       4,
a330: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
a340: 73 68 61 72 22 20 20 20 20 20 20 20 20 20 20 20  shar"           
a350: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73       },.    { "s
a360: 69 6c 6f 22 2c 20 20 20 20 20 20 20 34 2c 20 22  ilo",       4, "
a370: 6d 6f 64 65 6c 2f 6d 65 73 68 22 20 20 20 20 20  model/mesh"     
a380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a390: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 69 74     },.    { "sit
a3a0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
a3b0: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 74 75 66  plication/x-stuf
a3c0: 66 69 74 22 20 20 20 20 20 20 20 20 20 20 20 20  fit"            
a3d0: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6b 64 22 2c   },.    { "skd",
a3e0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
a3f0: 69 63 61 74 69 6f 6e 2f 78 2d 6b 6f 61 6e 22 20  ication/x-koan" 
a400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
a410: 2c 0a 20 20 20 20 7b 20 22 73 6b 6d 22 2c 20 20  ,.    { "skm",  
a420: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
a430: 61 74 69 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20  ation/x-koan"   
a440: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
a450: 20 20 20 20 7b 20 22 73 6b 70 22 2c 20 20 20 20      { "skp",    
a460: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
a470: 69 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20 20 20  ion/x-koan"     
a480: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
a490: 20 20 7b 20 22 73 6b 74 22 2c 20 20 20 20 20 20    { "skt",      
a4a0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
a4b0: 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20 20 20 20 20  n/x-koan"       
a4c0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
a4d0: 7b 20 22 73 6d 69 22 2c 20 20 20 20 20 20 20 20  { "smi",        
a4e0: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
a4f0: 73 6d 69 6c 22 20 20 20 20 20 20 20 20 20 20 20  smil"           
a500: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
a510: 22 73 6d 69 6c 22 2c 20 20 20 20 20 20 20 34 2c  "smil",       4,
a520: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 73 6d   "application/sm
a530: 69 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20  il"             
a540: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73       },.    { "s
a550: 6e 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  nd",        3, "
a560: 61 75 64 69 6f 2f 62 61 73 69 63 22 20 20 20 20  audio/basic"    
a570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a580: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6f 6c     },.    { "sol
a590: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
a5a0: 70 6c 69 63 61 74 69 6f 6e 2f 73 6f 6c 69 64 73  plication/solids
a5b0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
a5c0: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 70 6c 22 2c   },.    { "spl",
a5d0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
a5e0: 69 63 61 74 69 6f 6e 2f 78 2d 66 75 74 75 72 65  ication/x-future
a5f0: 73 70 6c 61 73 68 22 20 20 20 20 20 20 20 20 7d  splash"        }
a600: 2c 0a 20 20 20 20 7b 20 22 73 72 63 22 2c 20 20  ,.    { "src",  
a610: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
a620: 61 74 69 6f 6e 2f 78 2d 77 61 69 73 2d 73 6f 75  ation/x-wais-sou
a630: 72 63 65 22 20 20 20 20 20 20 20 20 20 7d 2c 0a  rce"         },.
a640: 20 20 20 20 7b 20 22 73 74 65 70 22 2c 20 20 20      { "step",   
a650: 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74      4, "applicat
a660: 69 6f 6e 2f 53 54 45 50 22 20 20 20 20 20 20 20  ion/STEP"       
a670: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
a680: 20 20 7b 20 22 73 74 6c 22 2c 20 20 20 20 20 20    { "stl",      
a690: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
a6a0: 6e 2f 53 4c 41 22 20 20 20 20 20 20 20 20 20 20  n/SLA"          
a6b0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
a6c0: 7b 20 22 73 74 70 22 2c 20 20 20 20 20 20 20 20  { "stp",        
a6d0: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
a6e0: 53 54 45 50 22 20 20 20 20 20 20 20 20 20 20 20  STEP"           
a6f0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
a700: 22 73 76 34 63 70 69 6f 22 2c 20 20 20 20 37 2c  "sv4cpio",    7,
a710: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
a720: 73 76 34 63 70 69 6f 22 20 20 20 20 20 20 20 20  sv4cpio"        
a730: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73       },.    { "s
a740: 76 34 63 72 63 22 2c 20 20 20 20 20 36 2c 20 22  v4crc",     6, "
a750: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 76  application/x-sv
a760: 34 63 72 63 22 20 20 20 20 20 20 20 20 20 20 20  4crc"           
a770: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 76 67     },.    { "svg
a780: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d  ",        3, "im
a790: 61 67 65 2f 73 76 67 2b 78 6d 6c 22 20 20 20 20  age/svg+xml"    
a7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7b0: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 77 66 22 2c   },.    { "swf",
a7c0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
a7d0: 69 63 61 74 69 6f 6e 2f 78 2d 73 68 6f 63 6b 77  ication/x-shockw
a7e0: 61 76 65 2d 66 6c 61 73 68 22 20 20 20 20 20 7d  ave-flash"     }
a7f0: 2c 0a 20 20 20 20 7b 20 22 74 22 2c 20 20 20 20  ,.    { "t",    
a800: 20 20 20 20 20 20 31 2c 20 22 61 70 70 6c 69 63        1, "applic
a810: 61 74 69 6f 6e 2f 78 2d 74 72 6f 66 66 22 20 20  ation/x-troff"  
a820: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
a830: 20 20 20 20 7b 20 22 74 61 72 22 2c 20 20 20 20      { "tar",    
a840: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
a850: 69 6f 6e 2f 78 2d 74 61 72 22 20 20 20 20 20 20  ion/x-tar"      
a860: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
a870: 20 20 7b 20 22 74 63 6c 22 2c 20 20 20 20 20 20    { "tcl",      
a880: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
a890: 6e 2f 78 2d 74 63 6c 22 20 20 20 20 20 20 20 20  n/x-tcl"        
a8a0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
a8b0: 7b 20 22 74 65 78 22 2c 20 20 20 20 20 20 20 20  { "tex",        
a8c0: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
a8d0: 78 2d 74 65 78 22 20 20 20 20 20 20 20 20 20 20  x-tex"          
a8e0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
a8f0: 22 74 65 78 69 22 2c 20 20 20 20 20 20 20 34 2c  "texi",       4,
a900: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
a910: 74 65 78 69 6e 66 6f 22 20 20 20 20 20 20 20 20  texinfo"        
a920: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74       },.    { "t
a930: 65 78 69 6e 66 6f 22 2c 20 20 20 20 37 2c 20 22  exinfo",    7, "
a940: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 65  application/x-te
a950: 78 69 6e 66 6f 22 20 20 20 20 20 20 20 20 20 20  xinfo"          
a960: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 67 7a     },.    { "tgz
a970: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
a980: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 61 72 2d  plication/x-tar-
a990: 67 7a 22 20 20 20 20 20 20 20 20 20 20 20 20 20  gz"             
a9a0: 20 7d 2c 0a 20 20 20 20 7b 20 22 74 69 66 66 22   },.    { "tiff"
a9b0: 2c 20 20 20 20 20 20 20 34 2c 20 22 69 6d 61 67  ,       4, "imag
a9c0: 65 2f 74 69 66 66 22 20 20 20 20 20 20 20 20 20  e/tiff"         
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
a9e0: 2c 0a 20 20 20 20 7b 20 22 74 69 66 22 2c 20 20  ,.    { "tif",  
a9f0: 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f        3, "image/
aa00: 74 69 66 66 22 20 20 20 20 20 20 20 20 20 20 20  tiff"           
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
aa20: 20 20 20 20 7b 20 22 74 72 22 2c 20 20 20 20 20      { "tr",     
aa30: 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74      2, "applicat
aa40: 69 6f 6e 2f 78 2d 74 72 6f 66 66 22 20 20 20 20  ion/x-troff"    
aa50: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
aa60: 20 20 7b 20 22 74 73 69 22 2c 20 20 20 20 20 20    { "tsi",      
aa70: 20 20 33 2c 20 22 61 75 64 69 6f 2f 54 53 50 2d    3, "audio/TSP-
aa80: 61 75 64 69 6f 22 20 20 20 20 20 20 20 20 20 20  audio"          
aa90: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
aaa0: 7b 20 22 74 73 70 22 2c 20 20 20 20 20 20 20 20  { "tsp",        
aab0: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
aac0: 64 73 70 74 79 70 65 22 20 20 20 20 20 20 20 20  dsptype"        
aad0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
aae0: 22 74 73 76 22 2c 20 20 20 20 20 20 20 20 33 2c  "tsv",        3,
aaf0: 20 22 74 65 78 74 2f 74 61 62 2d 73 65 70 61 72   "text/tab-separ
ab00: 61 74 65 64 2d 76 61 6c 75 65 73 22 20 20 20 20  ated-values"    
ab10: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74       },.    { "t
ab20: 78 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  xt",        3, "
ab30: 74 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20 20  text/plain"     
ab40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab50: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 75 6e 76     },.    { "unv
ab60: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
ab70: 70 6c 69 63 61 74 69 6f 6e 2f 69 2d 64 65 61 73  plication/i-deas
ab80: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
ab90: 20 7d 2c 0a 20 20 20 20 7b 20 22 75 73 74 61 72   },.    { "ustar
aba0: 22 2c 20 20 20 20 20 20 35 2c 20 22 61 70 70 6c  ",      5, "appl
abb0: 69 63 61 74 69 6f 6e 2f 78 2d 75 73 74 61 72 22  ication/x-ustar"
abc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
abd0: 2c 0a 20 20 20 20 7b 20 22 76 63 64 22 2c 20 20  ,.    { "vcd",  
abe0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
abf0: 61 74 69 6f 6e 2f 78 2d 63 64 6c 69 6e 6b 22 20  ation/x-cdlink" 
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
ac10: 20 20 20 20 7b 20 22 76 64 61 22 2c 20 20 20 20      { "vda",    
ac20: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
ac30: 69 6f 6e 2f 76 64 61 22 20 20 20 20 20 20 20 20  ion/vda"        
ac40: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
ac50: 20 20 7b 20 22 76 69 76 22 2c 20 20 20 20 20 20    { "viv",      
ac60: 20 20 33 2c 20 22 76 69 64 65 6f 2f 76 6e 64 2e    3, "video/vnd.
ac70: 76 69 76 6f 22 20 20 20 20 20 20 20 20 20 20 20  vivo"           
ac80: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
ac90: 7b 20 22 76 69 76 6f 22 2c 20 20 20 20 20 20 20  { "vivo",       
aca0: 34 2c 20 22 76 69 64 65 6f 2f 76 6e 64 2e 76 69  4, "video/vnd.vi
acb0: 76 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20  vo"             
acc0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
acd0: 22 76 72 6d 6c 22 2c 20 20 20 20 20 20 20 34 2c  "vrml",       4,
ace0: 20 22 6d 6f 64 65 6c 2f 76 72 6d 6c 22 20 20 20   "model/vrml"   
acf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad00: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 76       },.    { "v
ad10: 73 69 78 22 2c 20 20 20 20 20 20 20 34 2c 20 22  six",       4, "
ad20: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76 73 69 78  application/vsix
ad30: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
ad40: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 61 76     },.    { "wav
ad50: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75  ",        3, "au
ad60: 64 69 6f 2f 78 2d 77 61 76 22 20 20 20 20 20 20  dio/x-wav"      
ad70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad80: 20 7d 2c 0a 20 20 20 20 7b 20 22 77 61 78 22 2c   },.    { "wax",
ad90: 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69          3, "audi
ada0: 6f 2f 78 2d 6d 73 2d 77 61 78 22 20 20 20 20 20  o/x-ms-wax"     
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
adc0: 2c 0a 20 20 20 20 7b 20 22 77 69 6b 69 22 2c 20  ,.    { "wiki", 
add0: 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63        4, "applic
ade0: 61 74 69 6f 6e 2f 78 2d 66 6f 73 73 69 6c 2d 77  ation/x-fossil-w
adf0: 69 6b 69 22 20 20 20 20 20 20 20 20 20 7d 2c 0a  iki"         },.
ae00: 20 20 20 20 7b 20 22 77 6d 61 22 2c 20 20 20 20      { "wma",    
ae10: 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d      3, "audio/x-
ae20: 6d 73 2d 77 6d 61 22 20 20 20 20 20 20 20 20 20  ms-wma"         
ae30: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
ae40: 20 20 7b 20 22 77 6d 76 22 2c 20 20 20 20 20 20    { "wmv",      
ae50: 20 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73    3, "video/x-ms
ae60: 2d 77 6d 76 22 20 20 20 20 20 20 20 20 20 20 20  -wmv"           
ae70: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
ae80: 7b 20 22 77 6d 78 22 2c 20 20 20 20 20 20 20 20  { "wmx",        
ae90: 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 77  3, "video/x-ms-w
aea0: 6d 78 22 20 20 20 20 20 20 20 20 20 20 20 20 20  mx"             
aeb0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
aec0: 22 77 72 6c 22 2c 20 20 20 20 20 20 20 20 33 2c  "wrl",        3,
aed0: 20 22 6d 6f 64 65 6c 2f 76 72 6d 6c 22 20 20 20   "model/vrml"   
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aef0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77       },.    { "w
af00: 76 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  vx",        3, "
af10: 76 69 64 65 6f 2f 78 2d 6d 73 2d 77 76 78 22 20  video/x-ms-wvx" 
af20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af30: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 62 6d     },.    { "xbm
af40: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d  ",        3, "im
af50: 61 67 65 2f 78 2d 78 62 69 74 6d 61 70 22 20 20  age/x-xbitmap"  
af60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af70: 20 7d 2c 0a 20 20 20 20 7b 20 22 78 6c 63 22 2c   },.    { "xlc",
af80: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
af90: 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65  ication/vnd.ms-e
afa0: 78 63 65 6c 22 20 20 20 20 20 20 20 20 20 20 7d  xcel"          }
afb0: 2c 0a 20 20 20 20 7b 20 22 78 6c 6c 22 2c 20 20  ,.    { "xll",  
afc0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
afd0: 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63  ation/vnd.ms-exc
afe0: 65 6c 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  el"          },.
aff0: 20 20 20 20 7b 20 22 78 6c 6d 22 2c 20 20 20 20      { "xlm",    
b000: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
b010: 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c  ion/vnd.ms-excel
b020: 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  "          },.  
b030: 20 20 7b 20 22 78 6c 73 22 2c 20 20 20 20 20 20    { "xls",      
b040: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
b050: 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20  n/vnd.ms-excel" 
b060: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
b070: 7b 20 22 78 6c 77 22 2c 20 20 20 20 20 20 20 20  { "xlw",        
b080: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
b090: 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20 20 20  vnd.ms-excel"   
b0a0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
b0b0: 22 78 6d 6c 22 2c 20 20 20 20 20 20 20 20 33 2c  "xml",        3,
b0c0: 20 22 74 65 78 74 2f 78 6d 6c 22 20 20 20 20 20   "text/xml"     
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0e0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78       },.    { "x
b0f0: 70 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  pm",        3, "
b100: 69 6d 61 67 65 2f 78 2d 78 70 69 78 6d 61 70 22  image/x-xpixmap"
b110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b120: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 77 64     },.    { "xwd
b130: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d  ",        3, "im
b140: 61 67 65 2f 78 2d 78 77 69 6e 64 6f 77 64 75 6d  age/x-xwindowdum
b150: 70 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p"              
b160: 20 7d 2c 0a 20 20 20 20 7b 20 22 78 79 7a 22 2c   },.    { "xyz",
b170: 20 20 20 20 20 20 20 20 33 2c 20 22 63 68 65 6d          3, "chem
b180: 69 63 61 6c 2f 78 2d 70 64 62 22 20 20 20 20 20  ical/x-pdb"     
b190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
b1a0: 2c 0a 20 20 20 20 7b 20 22 7a 69 70 22 2c 20 20  ,.    { "zip",  
b1b0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
b1c0: 61 74 69 6f 6e 2f 7a 69 70 22 20 20 20 20 20 20  ation/zip"      
b1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
b1e0: 20 20 7d 3b 0a 0a 20 20 66 6f 72 28 69 3d 6e 4e    };..  for(i=nN
b1f0: 61 6d 65 2d 31 3b 20 69 3e 30 20 26 26 20 7a 4e  ame-1; i>0 && zN
b200: 61 6d 65 5b 69 5d 21 3d 27 2e 27 3b 20 69 2d 2d  ame[i]!='.'; i--
b210: 29 7b 7d 0a 20 20 7a 20 3d 20 26 7a 4e 61 6d 65  ){}.  z = &zName
b220: 5b 69 2b 31 5d 3b 0a 20 20 6c 65 6e 20 3d 20 6e  [i+1];.  len = n
b230: 4e 61 6d 65 20 2d 20 69 3b 0a 20 20 69 66 28 20  Name - i;.  if( 
b240: 6c 65 6e 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28  len<(int)sizeof(
b250: 7a 53 75 66 66 69 78 29 2d 31 20 29 7b 0a 20 20  zSuffix)-1 ){.  
b260: 20 20 73 74 72 63 70 79 28 7a 53 75 66 66 69 78    strcpy(zSuffix
b270: 2c 20 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  , z);.    for(i=
b280: 30 3b 20 7a 53 75 66 66 69 78 5b 69 5d 3b 20 69  0; zSuffix[i]; i
b290: 2b 2b 29 20 7a 53 75 66 66 69 78 5b 69 5d 20 3d  ++) zSuffix[i] =
b2a0: 20 74 6f 6c 6f 77 65 72 28 7a 53 75 66 66 69 78   tolower(zSuffix
b2b0: 5b 69 5d 29 3b 0a 20 20 20 20 66 69 72 73 74 20  [i]);.    first 
b2c0: 3d 20 30 3b 0a 20 20 20 20 6c 61 73 74 20 3d 20  = 0;.    last = 
b2d0: 73 69 7a 65 6f 66 28 61 4d 69 6d 65 29 2f 73 69  sizeof(aMime)/si
b2e0: 7a 65 6f 66 28 61 4d 69 6d 65 5b 30 5d 29 3b 0a  zeof(aMime[0]);.
b2f0: 20 20 20 20 77 68 69 6c 65 28 20 66 69 72 73 74      while( first
b300: 3c 3d 6c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  <=last ){.      
b310: 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 20 3d  int c;.      i =
b320: 20 28 66 69 72 73 74 2b 6c 61 73 74 29 2f 32 3b   (first+last)/2;
b330: 0a 20 20 20 20 20 20 63 20 3d 20 73 74 72 63 6d  .      c = strcm
b340: 70 28 7a 53 75 66 66 69 78 2c 20 61 4d 69 6d 65  p(zSuffix, aMime
b350: 5b 69 5d 2e 7a 53 75 66 66 69 78 29 3b 0a 20 20  [i].zSuffix);.  
b360: 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72      if( c==0 ) r
b370: 65 74 75 72 6e 20 61 4d 69 6d 65 5b 69 5d 2e 7a  eturn aMime[i].z
b380: 4d 69 6d 65 74 79 70 65 3b 0a 20 20 20 20 20 20  Mimetype;.      
b390: 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20  if( c<0 ){.     
b3a0: 20 20 20 6c 61 73 74 20 3d 20 69 2d 31 3b 0a 20     last = i-1;. 
b3b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b3c0: 20 20 20 20 66 69 72 73 74 20 3d 20 69 2b 31 3b      first = i+1;
b3d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b3e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 61 70 70   }.  return "app
b3f0: 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73  lication/octet-s
b400: 74 72 65 61 6d 22 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tream";.}../*.**
b410: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
b420: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 31 20  able contains 1 
b430: 66 6f 72 20 61 6c 6c 20 63 68 61 72 61 63 74 65  for all characte
b440: 72 73 20 74 68 61 74 20 61 72 65 20 70 65 72 6d  rs that are perm
b450: 69 74 74 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  itted in.** the 
b460: 70 61 72 74 20 6f 66 20 74 68 65 20 55 52 4c 20  part of the URL 
b470: 62 65 66 6f 72 65 20 74 68 65 20 71 75 65 72 79  before the query
b480: 20 70 61 72 61 6d 65 74 65 72 73 20 61 6e 64 20   parameters and 
b490: 66 72 61 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  fragment..**.** 
b4a0: 41 6c 6c 6f 77 65 64 20 63 68 61 72 61 63 74 65  Allowed characte
b4b0: 72 73 3a 20 20 30 2d 39 61 2d 7a 41 2d 5a 2c 2d  rs:  0-9a-zA-Z,-
b4c0: 2e 2f 3a 5f 7e 0a 2a 2a 0a 2a 2a 20 44 69 73 61  ./:_~.**.** Disa
b4d0: 6c 6c 6f 77 65 64 20 63 68 61 72 61 63 74 65 72  llowed character
b4e0: 73 20 69 6e 63 6c 75 64 65 3a 20 20 21 22 23 24  s include:  !"#$
b4f0: 25 26 27 28 29 2a 2b 3b 3c 3d 3e 3f 5b 5c 5d 5e  %&'()*+;<=>?[\]^
b500: 7b 7c 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  {|}.*/.static co
b510: 6e 73 74 20 63 68 61 72 20 61 6c 6c 6f 77 65 64  nst char allowed
b520: 49 6e 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20  InName[] = {.   
b530: 20 20 20 2f 2a 20 20 78 30 20 20 78 31 20 20 78     /*  x0  x1  x
b540: 32 20 20 78 33 20 20 78 34 20 20 78 35 20 20 78  2  x3  x4  x5  x
b550: 36 20 20 78 37 20 20 78 38 20 20 78 39 20 20 78  6  x7  x8  x9  x
b560: 61 20 20 78 62 20 20 78 63 20 20 78 64 20 20 78  a  xb  xc  xd  x
b570: 65 20 20 78 66 20 2a 2f 0a 2f 2a 20 30 78 20 2a  e  xf */./* 0x *
b580: 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  /   0,  0,  0,  
b590: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b5a0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b5b0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b5c0: 30 2c 0a 2f 2a 20 31 78 20 2a 2f 20 20 20 30 2c  0,./* 1x */   0,
b5d0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b5e0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b5f0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b600: 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20    0,  0,  0,./* 
b610: 32 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20  2x */   0,  0,  
b620: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b630: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b640: 30 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20  0,  0,  1,  1,  
b650: 31 2c 20 20 31 2c 0a 2f 2a 20 33 78 20 2a 2f 20  1,  1,./* 3x */ 
b660: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
b670: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
b680: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 30 2c    1,  1,  1,  0,
b690: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b6a0: 0a 2f 2a 20 34 78 20 2a 2f 20 20 20 30 2c 20 20  ./* 4x */   0,  
b6b0: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
b6c0: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
b6d0: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
b6e0: 31 2c 20 20 31 2c 20 20 31 2c 0a 2f 2a 20 35 78  1,  1,  1,./* 5x
b6f0: 20 2a 2f 20 20 20 31 2c 20 20 31 2c 20 20 31 2c   */   1,  1,  1,
b700: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
b710: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
b720: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b730: 20 20 31 2c 0a 2f 2a 20 36 78 20 2a 2f 20 20 20    1,./* 6x */   
b740: 30 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  0,  1,  1,  1,  
b750: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
b760: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
b770: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 0a 2f  1,  1,  1,  1,./
b780: 2a 20 37 78 20 2a 2f 20 20 20 31 2c 20 20 31 2c  * 7x */   1,  1,
b790: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
b7a0: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
b7b0: 20 20 31 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    1,  0,  0,  0,
b7c0: 20 20 31 2c 20 20 30 2c 0a 2f 2a 20 38 78 20 2a    1,  0,./* 8x *
b7d0: 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  /   0,  0,  0,  
b7e0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b7f0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b800: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b810: 30 2c 0a 2f 2a 20 39 78 20 2a 2f 20 20 20 30 2c  0,./* 9x */   0,
b820: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b830: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b840: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b850: 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20    0,  0,  0,./* 
b860: 41 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20  Ax */   0,  0,  
b870: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b880: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b890: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b8a0: 30 2c 20 20 30 2c 0a 2f 2a 20 42 78 20 2a 2f 20  0,  0,./* Bx */ 
b8b0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b8c0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b8d0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b8e0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b8f0: 0a 2f 2a 20 43 78 20 2a 2f 20 20 20 30 2c 20 20  ./* Cx */   0,  
b900: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b910: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b920: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b930: 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 44 78  0,  0,  0,./* Dx
b940: 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c   */   0,  0,  0,
b950: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b960: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b970: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b980: 20 20 30 2c 0a 2f 2a 20 45 78 20 2a 2f 20 20 20    0,./* Ex */   
b990: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b9a0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b9b0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b9c0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f  0,  0,  0,  0,./
b9d0: 2a 20 46 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c  * Fx */   0,  0,
b9e0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b9f0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
ba00: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
ba10: 20 20 30 2c 20 20 30 2c 0a 7d 3b 0a 0a 2f 2a 0a    0,  0,.};../*.
ba20: 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 64 69  ** Remove all di
ba30: 73 61 6c 6c 6f 77 65 64 20 63 68 61 72 61 63 74  sallowed charact
ba40: 65 72 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74  ers in the input
ba50: 20 73 74 72 69 6e 67 20 7a 5b 5d 2e 20 20 43 6f   string z[].  Co
ba60: 6e 76 65 72 74 20 61 6e 79 0a 2a 2a 20 64 69 73  nvert any.** dis
ba70: 61 6c 6c 6f 77 65 64 20 63 68 61 72 61 63 74 65  allowed characte
ba80: 72 73 20 69 6e 74 6f 20 22 5f 22 2e 0a 2a 2a 0a  rs into "_"..**.
ba90: 2a 2a 20 4e 6f 74 20 74 68 61 74 20 74 68 65 20  ** Not that the 
baa0: 74 68 72 65 65 20 63 68 61 72 61 63 74 65 72 20  three character 
bab0: 73 65 71 75 65 6e 63 65 20 22 25 58 58 22 20 77  sequence "%XX" w
bac0: 68 65 72 65 20 58 20 69 73 20 61 6e 79 20 62 79  here X is any by
bad0: 74 65 20 69 73 0a 2a 2a 20 63 6f 6e 76 65 72 74  te is.** convert
bae0: 65 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  ed into a single
baf0: 20 22 5f 22 20 63 68 61 72 61 63 74 65 72 2e 0a   "_" character..
bb00: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
bb10: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   number of chara
bb20: 63 74 65 72 73 20 63 6f 6e 76 65 72 74 65 64 2e  cters converted.
bb30: 20 20 41 6e 20 22 25 58 58 22 20 2d 3e 20 22 5f    An "%XX" -> "_
bb40: 22 20 63 6f 6e 76 65 72 73 69 6f 6e 0a 2a 2a 20  " conversion.** 
bb50: 63 6f 75 6e 74 73 20 61 73 20 61 20 73 69 6e 67  counts as a sing
bb60: 6c 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f  le character..*/
bb70: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 6e 69  .static int sani
bb80: 74 69 7a 65 53 74 72 69 6e 67 28 63 68 61 72 20  tizeString(char 
bb90: 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 6e  *z){.  int nChan
bba0: 67 65 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  ge = 0;.  while(
bbb0: 20 2a 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 21   *z ){.    if( !
bbc0: 61 6c 6c 6f 77 65 64 49 6e 4e 61 6d 65 5b 2a 28  allowedInName[*(
bbd0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a  unsigned char*)z
bbe0: 5d 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 2a  ] ){.      if( *
bbf0: 7a 3d 3d 27 25 27 20 26 26 20 7a 5b 31 5d 21 3d  z=='%' && z[1]!=
bc00: 30 20 26 26 20 7a 5b 32 5d 21 3d 30 20 29 7b 0a  0 && z[2]!=0 ){.
bc10: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
bc20: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 33 3b 20         for(i=3; 
bc30: 28 7a 5b 69 2d 32 5d 20 3d 20 7a 5b 69 5d 29 21  (z[i-2] = z[i])!
bc40: 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20  =0; i++){}.     
bc50: 20 7d 0a 20 20 20 20 20 20 2a 7a 20 3d 20 27 5f   }.      *z = '_
bc60: 27 3b 0a 20 20 20 20 20 20 6e 43 68 61 6e 67 65  ';.      nChange
bc70: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 2b  ++;.    }.    z+
bc80: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
bc90: 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChange;.}../*.*
bca0: 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
bcb0: 65 72 20 6f 66 20 22 2f 22 20 63 68 61 72 61 63  er of "/" charac
bcc0: 74 65 72 73 20 69 6e 20 61 20 73 74 72 69 6e 67  ters in a string
bcd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bce0: 63 6f 75 6e 74 53 6c 61 73 68 65 73 28 63 6f 6e  countSlashes(con
bcf0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
bd00: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 77 68 69 6c  nt n = 0;.  whil
bd10: 65 28 20 2a 7a 20 29 20 69 66 28 20 2a 28 7a 2b  e( *z ) if( *(z+
bd20: 2b 29 3d 3d 27 2f 27 20 29 20 6e 2b 2b 3b 0a 20  +)=='/' ) n++;. 
bd30: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
bd40: 0a 2a 2a 20 53 65 6e 64 20 74 68 65 20 74 65 78  .** Send the tex
bd50: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6e 61  t of the file na
bd60: 6d 65 64 20 62 79 20 7a 46 69 6c 65 20 61 73 20  med by zFile as 
bd70: 74 68 65 20 72 65 70 6c 79 2e 20 20 55 73 65 20  the reply.  Use 
bd80: 74 68 65 0a 2a 2a 20 73 75 66 66 69 78 20 6f 6e  the.** suffix on
bd90: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
bda0: 7a 46 69 6c 65 20 6e 61 6d 65 20 74 6f 20 64 65  zFile name to de
bdb0: 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 69 6d 65  termine the mime
bdc0: 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  type..**.** Retu
bdd0: 72 6e 20 31 20 74 6f 20 6f 6d 69 74 20 6d 61 6b  rn 1 to omit mak
bde0: 69 6e 67 20 61 20 6c 6f 67 20 65 6e 74 72 79 20  ing a log entry 
bdf0: 66 6f 72 20 74 68 65 20 72 65 70 6c 79 2e 0a 2a  for the reply..*
be00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 65 6e  /.static int Sen
be10: 64 46 69 6c 65 28 0a 20 20 63 6f 6e 73 74 20 63  dFile(.  const c
be20: 68 61 72 20 2a 7a 46 69 6c 65 2c 20 20 20 20 20  har *zFile,     
be30: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
be40: 66 69 6c 65 20 74 6f 20 73 65 6e 64 20 2a 2f 0a  file to send */.
be50: 20 20 69 6e 74 20 6c 65 6e 46 69 6c 65 2c 20 20    int lenFile,  
be60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
be70: 67 74 68 20 6f 66 20 74 68 65 20 7a 46 69 6c 65  gth of the zFile
be80: 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a   name in bytes *
be90: 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  /.  struct stat 
bea0: 2a 70 53 74 61 74 20 20 20 20 20 20 2f 2a 20 52  *pStat      /* R
beb0: 65 73 75 6c 74 20 6f 66 20 61 20 73 74 61 74 28  esult of a stat(
bec0: 29 20 61 67 61 69 6e 73 74 20 7a 46 69 6c 65 20  ) against zFile 
bed0: 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
bee0: 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 54 79 70 65  ar *zContentType
bef0: 3b 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20  ;.  time_t t;.  
bf00: 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72  FILE *in;.  char
bf10: 20 7a 45 54 61 67 5b 31 30 30 5d 3b 0a 0a 20 20   zETag[100];..  
bf20: 7a 43 6f 6e 74 65 6e 74 54 79 70 65 20 3d 20 47  zContentType = G
bf30: 65 74 4d 69 6d 65 54 79 70 65 28 7a 46 69 6c 65  etMimeType(zFile
bf40: 2c 20 6c 65 6e 46 69 6c 65 29 3b 0a 20 20 69 66  , lenFile);.  if
bf50: 28 20 7a 54 6d 70 4e 61 6d 20 29 20 75 6e 6c 69  ( zTmpNam ) unli
bf60: 6e 6b 28 7a 54 6d 70 4e 61 6d 29 3b 0a 20 20 73  nk(zTmpNam);.  s
bf70: 70 72 69 6e 74 66 28 7a 45 54 61 67 2c 20 22 6d  printf(zETag, "m
bf80: 25 78 73 25 78 22 2c 20 28 69 6e 74 29 70 53 74  %xs%x", (int)pSt
bf90: 61 74 2d 3e 73 74 5f 6d 74 69 6d 65 2c 20 28 69  at->st_mtime, (i
bfa0: 6e 74 29 70 53 74 61 74 2d 3e 73 74 5f 73 69 7a  nt)pStat->st_siz
bfb0: 65 29 3b 0a 20 20 69 66 28 20 43 6f 6d 70 61 72  e);.  if( Compar
bfc0: 65 45 74 61 67 73 28 7a 49 66 4e 6f 6e 65 4d 61  eEtags(zIfNoneMa
bfd0: 74 63 68 2c 7a 45 54 61 67 29 3d 3d 30 0a 20 20  tch,zETag)==0.  
bfe0: 20 7c 7c 20 28 7a 49 66 4d 6f 64 69 66 69 65 64   || (zIfModified
bff0: 53 69 6e 63 65 21 3d 30 0a 20 20 20 20 20 20 20  Since!=0.       
c000: 20 26 26 20 28 74 20 3d 20 50 61 72 73 65 52 66   && (t = ParseRf
c010: 63 38 32 32 44 61 74 65 28 7a 49 66 4d 6f 64 69  c822Date(zIfModi
c020: 66 69 65 64 53 69 6e 63 65 29 29 3e 30 0a 20 20  fiedSince))>0.  
c030: 20 20 20 20 20 20 26 26 20 74 3e 3d 70 53 74 61        && t>=pSta
c040: 74 2d 3e 73 74 5f 6d 74 69 6d 65 29 0a 20 20 29  t->st_mtime).  )
c050: 7b 0a 20 20 20 20 53 74 61 72 74 52 65 73 70 6f  {.    StartRespo
c060: 6e 73 65 28 22 33 30 34 20 4e 6f 74 20 4d 6f 64  nse("304 Not Mod
c070: 69 66 69 65 64 22 29 3b 0a 20 20 20 20 6e 4f 75  ified");.    nOu
c080: 74 20 2b 3d 20 44 61 74 65 54 61 67 28 22 4c 61  t += DateTag("La
c090: 73 74 2d 4d 6f 64 69 66 69 65 64 22 2c 20 70 53  st-Modified", pS
c0a0: 74 61 74 2d 3e 73 74 5f 6d 74 69 6d 65 29 3b 0a  tat->st_mtime);.
c0b0: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
c0c0: 74 66 28 22 43 61 63 68 65 2d 43 6f 6e 74 72 6f  tf("Cache-Contro
c0d0: 6c 3a 20 6d 61 78 2d 61 67 65 3d 25 64 5c 72 5c  l: max-age=%d\r\
c0e0: 6e 22 2c 20 6d 78 41 67 65 29 3b 0a 20 20 20 20  n", mxAge);.    
c0f0: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22  nOut += printf("
c100: 45 54 61 67 3a 20 5c 22 25 73 5c 22 5c 72 5c 6e  ETag: \"%s\"\r\n
c110: 22 2c 20 7a 45 54 61 67 29 3b 0a 20 20 20 20 6e  ", zETag);.    n
c120: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 5c  Out += printf("\
c130: 72 5c 6e 22 29 3b 0a 20 20 20 20 66 66 6c 75 73  r\n");.    fflus
c140: 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 4d  h(stdout);.    M
c150: 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 34  akeLogEntry(0, 4
c160: 37 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 45 54  70);  /* LOG: ET
c170: 61 67 20 43 61 63 68 65 20 48 69 74 20 2a 2f 0a  ag Cache Hit */.
c180: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
c190: 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a  }.  in = fopen(z
c1a0: 46 69 6c 65 2c 22 72 62 22 29 3b 0a 20 20 69 66  File,"rb");.  if
c1b0: 28 20 69 6e 3d 3d 30 20 29 20 4e 6f 74 46 6f 75  ( in==0 ) NotFou
c1c0: 6e 64 28 34 38 30 29 3b 20 2f 2a 20 4c 4f 47 3a  nd(480); /* LOG:
c1d0: 20 66 6f 70 65 6e 28 29 20 66 61 69 6c 65 64 20   fopen() failed 
c1e0: 66 6f 72 20 73 74 61 74 69 63 20 63 6f 6e 74 65  for static conte
c1f0: 6e 74 20 2a 2f 0a 20 20 53 74 61 72 74 52 65 73  nt */.  StartRes
c200: 70 6f 6e 73 65 28 22 32 30 30 20 4f 4b 22 29 3b  ponse("200 OK");
c210: 0a 20 20 6e 4f 75 74 20 2b 3d 20 44 61 74 65 54  .  nOut += DateT
c220: 61 67 28 22 4c 61 73 74 2d 4d 6f 64 69 66 69 65  ag("Last-Modifie
c230: 64 22 2c 20 70 53 74 61 74 2d 3e 73 74 5f 6d 74  d", pStat->st_mt
c240: 69 6d 65 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20  ime);.  nOut += 
c250: 70 72 69 6e 74 66 28 22 43 61 63 68 65 2d 43 6f  printf("Cache-Co
c260: 6e 74 72 6f 6c 3a 20 6d 61 78 2d 61 67 65 3d 25  ntrol: max-age=%
c270: 64 5c 72 5c 6e 22 2c 20 6d 78 41 67 65 29 3b 0a  d\r\n", mxAge);.
c280: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
c290: 28 22 45 54 61 67 3a 20 5c 22 25 73 5c 22 5c 72  ("ETag: \"%s\"\r
c2a0: 5c 6e 22 2c 20 7a 45 54 61 67 29 3b 0a 20 20 6e  \n", zETag);.  n
c2b0: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 43  Out += printf("C
c2c0: 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 25 73 5c  ontent-type: %s\
c2d0: 72 5c 6e 22 2c 7a 43 6f 6e 74 65 6e 74 54 79 70  r\n",zContentTyp
c2e0: 65 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72  e);.  nOut += pr
c2f0: 69 6e 74 66 28 22 43 6f 6e 74 65 6e 74 2d 6c 65  intf("Content-le
c300: 6e 67 74 68 3a 20 25 64 5c 72 5c 6e 5c 72 5c 6e  ngth: %d\r\n\r\n
c310: 22 2c 28 69 6e 74 29 70 53 74 61 74 2d 3e 73 74  ",(int)pStat->st
c320: 5f 73 69 7a 65 29 3b 0a 20 20 66 66 6c 75 73 68  _size);.  fflush
c330: 28 73 74 64 6f 75 74 29 3b 0a 20 20 69 66 28 20  (stdout);.  if( 
c340: 73 74 72 63 6d 70 28 7a 4d 65 74 68 6f 64 2c 22  strcmp(zMethod,"
c350: 48 45 41 44 22 29 3d 3d 30 20 29 7b 0a 20 20 20  HEAD")==0 ){.   
c360: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c   MakeLogEntry(0,
c370: 20 32 29 3b 20 2f 2a 20 4c 4f 47 3a 20 4e 6f 72   2); /* LOG: Nor
c380: 6d 61 6c 20 48 45 41 44 20 72 65 70 6c 79 20 2a  mal HEAD reply *
c390: 2f 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29  /.    fclose(in)
c3a0: 3b 0a 20 20 20 20 66 66 6c 75 73 68 28 73 74 64  ;.    fflush(std
c3b0: 6f 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  out);.    return
c3c0: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73   1;.  }.  if( us
c3d0: 65 54 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d  eTimeout ) alarm
c3e0: 28 33 30 20 2b 20 70 53 74 61 74 2d 3e 73 74 5f  (30 + pStat->st_
c3f0: 73 69 7a 65 2f 31 30 30 30 29 3b 0a 23 69 66 64  size/1000);.#ifd
c400: 65 66 20 6c 69 6e 75 78 0a 20 20 7b 0a 20 20 20  ef linux.  {.   
c410: 20 6f 66 66 5f 74 20 6f 66 66 73 65 74 20 3d 20   off_t offset = 
c420: 30 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 73  0;.    nOut += s
c430: 65 6e 64 66 69 6c 65 28 66 69 6c 65 6e 6f 28 73  endfile(fileno(s
c440: 74 64 6f 75 74 29 2c 20 66 69 6c 65 6e 6f 28 69  tdout), fileno(i
c450: 6e 29 2c 20 26 6f 66 66 73 65 74 2c 20 70 53 74  n), &offset, pSt
c460: 61 74 2d 3e 73 74 5f 73 69 7a 65 29 3b 0a 20 20  at->st_size);.  
c470: 7d 0a 23 65 6c 73 65 0a 20 20 77 68 69 6c 65 28  }.#else.  while(
c480: 20 28 63 20 3d 20 67 65 74 63 28 69 6e 29 29 21   (c = getc(in))!
c490: 3d 45 4f 46 20 29 7b 0a 20 20 20 20 70 75 74 63  =EOF ){.    putc
c4a0: 28 63 2c 73 74 64 6f 75 74 29 3b 0a 20 20 20 20  (c,stdout);.    
c4b0: 6e 4f 75 74 2b 2b 3b 0a 20 20 7d 0a 23 65 6e 64  nOut++;.  }.#end
c4c0: 69 66 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  if.  fclose(in);
c4d0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
c4e0: 2f 2a 0a 2a 2a 20 41 20 43 47 49 20 6f 72 20 53  /*.** A CGI or S
c4f0: 43 47 49 20 73 63 72 69 70 74 20 68 61 73 20 72  CGI script has r
c500: 75 6e 20 61 6e 64 20 69 73 20 73 65 6e 64 69 6e  un and is sendin
c510: 67 20 69 74 73 20 72 65 70 6c 79 20 62 61 63 6b  g its reply back
c520: 20 61 63 72 6f 73 73 0a 2a 2a 20 74 68 65 20 63   across.** the c
c530: 68 61 6e 6e 65 6c 20 22 69 6e 22 2e 20 20 50 72  hannel "in".  Pr
c540: 6f 63 65 73 73 20 74 68 69 73 20 72 65 70 6c 79  ocess this reply
c550: 20 69 6e 74 6f 20 61 6e 20 61 70 70 72 6f 70 72   into an appropr
c560: 69 61 74 65 20 48 54 54 50 20 72 65 70 6c 79 2e  iate HTTP reply.
c570: 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 22 69  .** Close the "i
c580: 6e 22 20 63 68 61 6e 6e 65 6c 20 77 68 65 6e 20  n" channel when 
c590: 64 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  done..*/.static 
c5a0: 76 6f 69 64 20 43 67 69 48 61 6e 64 6c 65 52 65  void CgiHandleRe
c5b0: 70 6c 79 28 46 49 4c 45 20 2a 69 6e 29 7b 0a 20  ply(FILE *in){. 
c5c0: 20 69 6e 74 20 73 65 65 6e 43 6f 6e 74 65 6e 74   int seenContent
c5d0: 4c 65 6e 67 74 68 20 3d 20 30 3b 20 20 20 2f 2a  Length = 0;   /*
c5e0: 20 54 72 75 65 20 69 66 20 43 6f 6e 74 65 6e 74   True if Content
c5f0: 2d 6c 65 6e 67 74 68 3a 20 68 65 61 64 65 72 20  -length: header 
c600: 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 63 6f  seen */.  int co
c610: 6e 74 65 6e 74 4c 65 6e 67 74 68 20 3d 20 30 3b  ntentLength = 0;
c620: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
c630: 6e 74 65 6e 74 20 6c 65 6e 67 74 68 20 2a 2f 0a  ntent length */.
c640: 20 20 73 69 7a 65 5f 74 20 6e 52 65 73 20 3d 20    size_t nRes = 
c650: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
c660: 2a 20 42 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  * Bytes of paylo
c670: 61 64 20 2a 2f 0a 20 20 73 69 7a 65 5f 74 20 6e  ad */.  size_t n
c680: 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 20 20 20 20  Malloc = 0;     
c690: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
c6a0: 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
c6b0: 20 74 6f 20 61 52 65 73 20 2a 2f 0a 20 20 63 68   to aRes */.  ch
c6c0: 61 72 20 2a 61 52 65 73 20 3d 20 30 3b 20 20 20  ar *aRes = 0;   
c6d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
c6e0: 79 6c 6f 61 64 20 2a 2f 0a 20 20 69 6e 74 20 63  yload */.  int c
c6f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c700: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
c710: 63 68 61 72 61 63 74 65 72 20 66 72 6f 6d 20 69  character from i
c720: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20  n */.  char *z; 
c730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c740: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
c750: 6f 20 73 6f 6d 65 74 68 69 6e 67 20 69 6e 73 69  o something insi
c760: 64 65 20 6f 66 20 7a 4c 69 6e 65 20 2a 2f 0a 20  de of zLine */. 
c770: 20 63 68 61 72 20 7a 4c 69 6e 65 5b 31 30 30 30   char zLine[1000
c780: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ];            /*
c790: 20 4f 6e 65 20 6c 69 6e 65 20 6f 66 20 72 65 70   One line of rep
c7a0: 6c 79 20 66 72 6f 6d 20 74 68 65 20 43 47 49 20  ly from the CGI 
c7b0: 73 63 72 69 70 74 20 2a 2f 0a 0a 20 20 69 66 28  script */..  if(
c7c0: 20 75 73 65 54 69 6d 65 6f 75 74 20 29 20 61 6c   useTimeout ) al
c7d0: 61 72 6d 28 31 35 29 3b 0a 20 20 77 68 69 6c 65  arm(15);.  while
c7e0: 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 73 69  ( fgets(zLine,si
c7f0: 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 69 6e 29 20  zeof(zLine),in) 
c800: 26 26 20 21 69 73 73 70 61 63 65 28 28 75 6e 73  && !isspace((uns
c810: 69 67 6e 65 64 20 63 68 61 72 29 7a 4c 69 6e 65  igned char)zLine
c820: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 69 66 28 20  [0]) ){.    if( 
c830: 73 74 72 6e 63 61 73 65 63 6d 70 28 7a 4c 69 6e  strncasecmp(zLin
c840: 65 2c 22 4c 6f 63 61 74 69 6f 6e 3a 22 2c 39 29  e,"Location:",9)
c850: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 74 61  ==0 ){.      Sta
c860: 72 74 52 65 73 70 6f 6e 73 65 28 22 33 30 32 20  rtResponse("302 
c870: 52 65 64 69 72 65 63 74 22 29 3b 0a 20 20 20 20  Redirect");.    
c880: 20 20 52 65 6d 6f 76 65 4e 65 77 6c 69 6e 65 28    RemoveNewline(
c890: 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 7a 20  zLine);.      z 
c8a0: 3d 20 26 7a 4c 69 6e 65 5b 31 30 5d 3b 0a 20 20  = &zLine[10];.  
c8b0: 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61      while( isspa
c8c0: 63 65 28 2a 28 75 6e 73 69 67 6e 65 64 20 63 68  ce(*(unsigned ch
c8d0: 61 72 2a 29 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d  ar*)z) ){ z++; }
c8e0: 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70  .      nOut += p
c8f0: 72 69 6e 74 66 28 22 4c 6f 63 61 74 69 6f 6e 3a  rintf("Location:
c900: 20 25 73 5c 72 5c 6e 22 2c 7a 29 3b 0a 20 20 20   %s\r\n",z);.   
c910: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63   }else if( strnc
c920: 61 73 65 63 6d 70 28 7a 4c 69 6e 65 2c 22 53 74  asecmp(zLine,"St
c930: 61 74 75 73 3a 22 2c 37 29 3d 3d 30 20 29 7b 0a  atus:",7)==0 ){.
c940: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
c950: 20 20 20 66 6f 72 28 69 3d 37 3b 20 69 73 73 70     for(i=7; issp
c960: 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68  ace((unsigned ch
c970: 61 72 29 7a 4c 69 6e 65 5b 69 5d 29 3b 20 69 2b  ar)zLine[i]); i+
c980: 2b 29 7b 7d 0a 20 20 20 20 20 20 6e 4f 75 74 20  +){}.      nOut 
c990: 2b 3d 20 70 72 69 6e 74 66 28 22 25 73 20 25 73  += printf("%s %s
c9a0: 22 2c 20 7a 50 72 6f 74 6f 63 6f 6c 2c 20 26 7a  ", zProtocol, &z
c9b0: 4c 69 6e 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Line[i]);.      
c9c0: 73 74 72 6e 63 70 79 28 7a 52 65 70 6c 79 53 74  strncpy(zReplySt
c9d0: 61 74 75 73 2c 20 26 7a 4c 69 6e 65 5b 69 5d 2c  atus, &zLine[i],
c9e0: 20 33 29 3b 0a 20 20 20 20 20 20 7a 52 65 70 6c   3);.      zRepl
c9f0: 79 53 74 61 74 75 73 5b 33 5d 20 3d 20 30 3b 0a  yStatus[3] = 0;.
ca00: 20 20 20 20 20 20 73 74 61 74 75 73 53 65 6e 74        statusSent
ca10: 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
ca20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ca30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 31             /*  1
ca40: 32 33 34 35 36 37 38 39 20 31 32 33 34 35 20 2a  23456789 12345 *
ca50: 2f 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  /.      if( strn
ca60: 63 61 73 65 63 6d 70 28 7a 4c 69 6e 65 2c 20 22  casecmp(zLine, "
ca70: 43 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74 68 3a 22  Content-length:"
ca80: 2c 20 31 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 15)==0 ){.    
ca90: 20 20 20 20 73 65 65 6e 43 6f 6e 74 65 6e 74 4c      seenContentL
caa0: 65 6e 67 74 68 20 3d 20 31 3b 0a 20 20 20 20 20  ength = 1;.     
cab0: 20 20 20 63 6f 6e 74 65 6e 74 4c 65 6e 67 74 68     contentLength
cac0: 20 3d 20 61 74 6f 69 28 7a 4c 69 6e 65 2b 31 35   = atoi(zLine+15
cad0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
cae0: 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22   StartResponse("
caf0: 32 30 30 20 4f 4b 22 29 3b 0a 20 20 20 20 20 20  200 OK");.      
cb00: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22  nOut += printf("
cb10: 25 73 22 2c 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  %s",zLine);.    
cb20: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 70 79  }.  }..  /* Copy
cb30: 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65   everything else
cb40: 20 74 68 72 75 20 77 69 74 68 6f 75 74 20 63 68   thru without ch
cb50: 61 6e 67 65 20 6f 72 20 61 6e 61 6c 79 73 69 73  ange or analysis
cb60: 2e 0a 20 20 2a 2f 0a 20 20 53 74 61 72 74 52 65  ..  */.  StartRe
cb70: 73 70 6f 6e 73 65 28 22 32 30 30 20 4f 4b 22 29  sponse("200 OK")
cb80: 3b 0a 20 20 69 66 28 20 75 73 65 54 69 6d 65 6f  ;.  if( useTimeo
cb90: 75 74 20 29 20 61 6c 61 72 6d 28 36 30 2a 35 29  ut ) alarm(60*5)
cba0: 3b 0a 20 20 69 66 28 20 73 65 65 6e 43 6f 6e 74  ;.  if( seenCont
cbb0: 65 6e 74 4c 65 6e 67 74 68 20 29 7b 0a 20 20 20  entLength ){.   
cbc0: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
cbd0: 22 25 73 22 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20  "%s", zLine);.  
cbe0: 20 20 77 68 69 6c 65 28 20 28 63 6f 6e 74 65 6e    while( (conten
cbf0: 74 4c 65 6e 67 74 68 2d 2d 29 3e 30 20 26 26 20  tLength--)>0 && 
cc00: 28 63 20 3d 20 67 65 74 63 28 69 6e 29 29 21 3d  (c = getc(in))!=
cc10: 45 4f 46 20 29 7b 0a 20 20 20 20 20 20 70 75 74  EOF ){.      put
cc20: 63 28 63 2c 73 74 64 6f 75 74 29 3b 0a 20 20 20  c(c,stdout);.   
cc30: 20 20 20 6e 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d     nOut++;.    }
cc40: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 52  .  }else{.    nR
cc50: 65 73 20 3d 20 30 3b 0a 20 20 20 20 6e 4d 61 6c  es = 0;.    nMal
cc60: 6c 6f 63 20 3d 20 31 30 30 30 3b 0a 20 20 20 20  loc = 1000;.    
cc70: 61 52 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e 4d  aRes = malloc(nM
cc80: 61 6c 6c 6f 63 2b 31 29 3b 0a 20 20 20 20 69 66  alloc+1);.    if
cc90: 28 20 61 52 65 73 3d 3d 30 20 29 20 4d 61 6c 66  ( aRes==0 ) Malf
cca0: 75 6e 63 74 69 6f 6e 28 36 30 30 2c 22 4f 75 74  unction(600,"Out
ccb0: 20 6f 66 20 6d 65 6d 6f 72 79 3a 20 25 64 20 62   of memory: %d b
ccc0: 79 74 65 73 22 2c 20 6e 4d 61 6c 6c 6f 63 29 3b  ytes", nMalloc);
ccd0: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d  .    while( (c =
cce0: 20 67 65 74 63 28 69 6e 29 29 21 3d 45 4f 46 20   getc(in))!=EOF 
ccf0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 52 65  ){.      if( nRe
cd00: 73 3e 3d 6e 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20  s>=nMalloc ){.  
cd10: 20 20 20 20 20 20 6e 4d 61 6c 6c 6f 63 20 3d 20        nMalloc = 
cd20: 6e 4d 61 6c 6c 6f 63 2a 32 3b 0a 20 20 20 20 20  nMalloc*2;.     
cd30: 20 20 20 61 52 65 73 20 3d 20 72 65 61 6c 6c 6f     aRes = reallo
cd40: 63 28 61 52 65 73 2c 20 6e 4d 61 6c 6c 6f 63 2b  c(aRes, nMalloc+
cd50: 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
cd60: 61 52 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aRes==0 ){.     
cd70: 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f        Malfunctio
cd80: 6e 28 36 31 30 2c 20 22 4f 75 74 20 6f 66 20 6d  n(610, "Out of m
cd90: 65 6d 6f 72 79 3a 20 25 64 20 62 79 74 65 73 22  emory: %d bytes"
cda0: 2c 20 6e 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  , nMalloc);.    
cdb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
cdc0: 20 20 20 20 61 52 65 73 5b 6e 52 65 73 2b 2b 5d      aRes[nRes++]
cdd0: 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = c;.    }.    
cde0: 61 52 65 73 5b 6e 52 65 73 5d 20 3d 20 30 3b 0a  aRes[nRes] = 0;.
cdf0: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
ce00: 74 66 28 22 43 6f 6e 74 65 6e 74 2d 6c 65 6e 67  tf("Content-leng
ce10: 74 68 3a 20 25 64 5c 72 5c 6e 5c 72 5c 6e 25 73  th: %d\r\n\r\n%s
ce20: 22 2c 20 28 69 6e 74 29 6e 52 65 73 2c 20 61 52  ", (int)nRes, aR
ce30: 65 73 29 3b 0a 20 20 20 20 66 72 65 65 28 61 52  es);.    free(aR
ce40: 65 73 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73  es);.  }.  fclos
ce50: 65 28 69 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e(in);.}../*.** 
ce60: 53 65 6e 64 20 61 6e 20 53 43 47 49 20 72 65 71  Send an SCGI req
ce70: 75 65 73 74 20 74 6f 20 61 20 68 6f 73 74 20 69  uest to a host i
ce80: 64 65 6e 74 69 66 69 65 64 20 62 79 20 7a 46 69  dentified by zFi
ce90: 6c 65 20 61 6e 64 20 70 72 6f 63 65 73 73 20 74  le and process t
cea0: 68 65 0a 2a 2a 20 72 65 70 6c 79 2e 0a 2a 2f 0a  he.** reply..*/.
ceb0: 73 74 61 74 69 63 20 76 6f 69 64 20 53 65 6e 64  static void Send
cec0: 53 63 67 69 52 65 71 75 65 73 74 28 63 6f 6e 73  ScgiRequest(cons
ced0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 63  t char *zFile, c
cee0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 72 69  onst char *zScri
cef0: 70 74 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b  pt){.  FILE *in;
cf00: 0a 20 20 46 49 4c 45 20 2a 73 3b 0a 20 20 63 68  .  FILE *s;.  ch
cf10: 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 7a  ar *z;.  char *z
cf20: 48 6f 73 74 3b 0a 20 20 63 68 61 72 20 2a 7a 50  Host;.  char *zP
cf30: 6f 72 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ort = 0;.  char 
cf40: 2a 7a 52 65 6c 69 67 68 74 20 3d 20 30 3b 0a 20  *zRelight = 0;. 
cf50: 20 63 68 61 72 20 2a 7a 46 61 6c 6c 62 61 63 6b   char *zFallback
cf60: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
cf70: 20 20 69 6e 74 20 69 53 6f 63 6b 65 74 20 3d 20    int iSocket = 
cf80: 2d 31 3b 0a 20 20 73 74 72 75 63 74 20 61 64 64  -1;.  struct add
cf90: 72 69 6e 66 6f 20 68 69 6e 74 73 3b 0a 20 20 73  rinfo hints;.  s
cfa0: 74 72 75 63 74 20 61 64 64 72 69 6e 66 6f 20 2a  truct addrinfo *
cfb0: 61 69 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74  ai = 0;.  struct
cfc0: 20 61 64 64 72 69 6e 66 6f 20 2a 70 3b 0a 20 20   addrinfo *p;.  
cfd0: 63 68 61 72 20 2a 7a 48 64 72 3b 0a 20 20 73 69  char *zHdr;.  si
cfe0: 7a 65 5f 74 20 6e 48 64 72 20 3d 20 30 3b 0a 20  ze_t nHdr = 0;. 
cff0: 20 73 69 7a 65 5f 74 20 6e 48 64 72 41 6c 6c 6f   size_t nHdrAllo
d000: 63 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  c;.  int i;.  ch
d010: 61 72 20 7a 4c 69 6e 65 5b 31 30 30 30 5d 3b 0a  ar zLine[1000];.
d020: 20 20 63 68 61 72 20 7a 45 78 74 72 61 5b 31 30    char zExtra[10
d030: 30 30 5d 3b 0a 20 20 69 6e 20 3d 20 66 6f 70 65  00];.  in = fope
d040: 6e 28 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a  n(zFile, "rb");.
d050: 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20    if( in==0 ){. 
d060: 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 37     Malfunction(7
d070: 30 30 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e  00, "cannot open
d080: 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c   \"%s\"\n", zFil
d090: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 67  e);.  }.  if( fg
d0a0: 65 74 73 28 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f  ets(zLine, sizeo
d0b0: 66 28 7a 4c 69 6e 65 29 2d 31 2c 20 69 6e 29 3d  f(zLine)-1, in)=
d0c0: 3d 30 20 29 7b 0a 20 20 20 20 4d 61 6c 66 75 6e  =0 ){.    Malfun
d0d0: 63 74 69 6f 6e 28 37 30 31 2c 20 22 63 61 6e 6e  ction(701, "cann
d0e0: 6f 74 20 72 65 61 64 20 5c 22 25 73 5c 22 5c 6e  ot read \"%s\"\n
d0f0: 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 7d 0a 20  ", zFile);.  }. 
d100: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4c 69   if( strncmp(zLi
d110: 6e 65 2c 22 53 43 47 49 20 22 2c 35 29 21 3d 30  ne,"SCGI ",5)!=0
d120: 20 29 7b 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74   ){.    Malfunct
d130: 69 6f 6e 28 37 30 32 2c 20 22 6d 69 73 66 6f 72  ion(702, "misfor
d140: 6d 61 74 74 65 64 20 53 43 47 49 20 73 70 65 63  matted SCGI spec
d150: 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c   \"%s\"\n", zFil
d160: 65 29 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 7a 4c  e);.  }.  z = zL
d170: 69 6e 65 2b 35 3b 0a 20 20 7a 48 6f 73 74 20 3d  ine+5;.  zHost =
d180: 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74   GetFirstElement
d190: 28 7a 2c 26 7a 29 3b 0a 20 20 7a 50 6f 72 74 20  (z,&z);.  zPort 
d1a0: 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e  = GetFirstElemen
d1b0: 74 28 7a 2c 30 29 3b 0a 20 20 69 66 28 20 7a 48  t(z,0);.  if( zH
d1c0: 6f 73 74 3d 3d 30 20 7c 7c 20 7a 48 6f 73 74 5b  ost==0 || zHost[
d1d0: 30 5d 3d 3d 30 20 7c 7c 20 7a 50 6f 72 74 3d 3d  0]==0 || zPort==
d1e0: 30 20 7c 7c 20 7a 50 6f 72 74 5b 30 5d 3d 3d 30  0 || zPort[0]==0
d1f0: 20 29 7b 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74   ){.    Malfunct
d200: 69 6f 6e 28 37 30 33 2c 20 22 6d 69 73 66 6f 72  ion(703, "misfor
d210: 6d 61 74 74 65 64 20 53 43 47 49 20 73 70 65 63  matted SCGI spec
d220: 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c   \"%s\"\n", zFil
d230: 65 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  e);.  }.  while(
d240: 20 66 67 65 74 73 28 7a 45 78 74 72 61 2c 20 73   fgets(zExtra, s
d250: 69 7a 65 6f 66 28 7a 45 78 74 72 61 29 2d 31 2c  izeof(zExtra)-1,
d260: 20 69 6e 29 20 29 7b 0a 20 20 20 20 63 68 61 72   in) ){.    char
d270: 20 2a 7a 43 6d 64 20 3d 20 47 65 74 46 69 72 73   *zCmd = GetFirs
d280: 74 45 6c 65 6d 65 6e 74 28 7a 45 78 74 72 61 2c  tElement(zExtra,
d290: 26 7a 29 3b 0a 20 20 20 20 69 66 28 20 7a 43 6d  &z);.    if( zCm
d2a0: 64 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  d==0 ) continue;
d2b0: 0a 20 20 20 20 69 66 28 20 7a 43 6d 64 5b 30 5d  .    if( zCmd[0]
d2c0: 3d 3d 27 23 27 20 29 20 63 6f 6e 74 69 6e 75 65  =='#' ) continue
d2d0: 3b 0a 20 20 20 20 52 65 6d 6f 76 65 4e 65 77 6c  ;.    RemoveNewl
d2e0: 69 6e 65 28 7a 29 3b 0a 20 20 20 20 69 66 28 20  ine(z);.    if( 
d2f0: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 72 65  strcmp(zCmd, "re
d300: 6c 69 67 68 74 3a 22 29 3d 3d 30 20 29 7b 0a 20  light:")==0 ){. 
d310: 20 20 20 20 20 66 72 65 65 28 7a 52 65 6c 69 67       free(zRelig
d320: 68 74 29 3b 0a 20 20 20 20 20 20 7a 52 65 6c 69  ht);.      zReli
d330: 67 68 74 20 3d 20 53 74 72 44 75 70 28 7a 29 3b  ght = StrDup(z);
d340: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
d350: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
d360: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 66 61 6c  trcmp(zCmd, "fal
d370: 6c 62 61 63 6b 3a 22 29 3d 3d 30 20 29 7b 0a 20  lback:")==0 ){. 
d380: 20 20 20 20 20 66 72 65 65 28 7a 46 61 6c 6c 62       free(zFallb
d390: 61 63 6b 29 3b 0a 20 20 20 20 20 20 7a 46 61 6c  ack);.      zFal
d3a0: 6c 62 61 63 6b 20 3d 20 53 74 72 44 75 70 28 7a  lback = StrDup(z
d3b0: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  );.      continu
d3c0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4d 61 6c  e;.    }.    Mal
d3d0: 66 75 6e 63 74 69 6f 6e 28 37 30 34 2c 20 22 75  function(704, "u
d3e0: 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6c 69 6e 65  nrecognized line
d3f0: 20 69 6e 20 53 43 47 49 20 73 70 65 63 3a 20 5c   in SCGI spec: \
d400: 22 25 73 20 25 73 5c 22 5c 6e 22 2c 0a 20 20 20  "%s %s\"\n",.   
d410: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6d               zCm
d420: 64 2c 20 7a 20 3f 20 7a 20 3a 20 22 22 29 3b 0a  d, z ? z : "");.
d430: 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29    }.  fclose(in)
d440: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 68 69 6e 74  ;.  memset(&hint
d450: 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 74 72  s, 0, sizeof(str
d460: 75 63 74 20 61 64 64 72 69 6e 66 6f 29 29 3b 0a  uct addrinfo));.
d470: 20 20 68 69 6e 74 73 2e 61 69 5f 66 61 6d 69 6c    hints.ai_famil
d480: 79 20 3d 20 41 46 5f 55 4e 53 50 45 43 3b 0a 20  y = AF_UNSPEC;. 
d490: 20 68 69 6e 74 73 2e 61 69 5f 73 6f 63 6b 74 79   hints.ai_sockty
d4a0: 70 65 20 3d 20 53 4f 43 4b 5f 53 54 52 45 41 4d  pe = SOCK_STREAM
d4b0: 3b 0a 20 20 68 69 6e 74 73 2e 61 69 5f 70 72 6f  ;.  hints.ai_pro
d4c0: 74 6f 63 6f 6c 20 3d 20 49 50 50 52 4f 54 4f 5f  tocol = IPPROTO_
d4d0: 54 43 50 3b 0a 20 20 72 63 20 3d 20 67 65 74 61  TCP;.  rc = geta
d4e0: 64 64 72 69 6e 66 6f 28 7a 48 6f 73 74 2c 7a 50  ddrinfo(zHost,zP
d4f0: 6f 72 74 2c 26 68 69 6e 74 73 2c 26 61 69 29 3b  ort,&hints,&ai);
d500: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
d510: 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 37 30 34   Malfunction(704
d520: 2c 20 22 63 61 6e 6e 6f 74 20 72 65 73 6f 6c 76  , "cannot resolv
d530: 65 20 53 43 47 49 20 73 65 72 76 65 72 20 6e 61  e SCGI server na
d540: 6d 65 20 25 73 3a 25 73 5c 6e 25 73 5c 6e 22 2c  me %s:%s\n%s\n",
d550: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d560: 20 7a 48 6f 73 74 2c 20 7a 50 6f 72 74 2c 20 67   zHost, zPort, g
d570: 61 69 5f 73 74 72 65 72 72 6f 72 28 72 63 29 29  ai_strerror(rc))
d580: 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 31 29  ;.  }.  while(1)
d590: 7b 20 20 2f 2a 20 45 78 69 74 20 76 69 61 20 62  {  /* Exit via b
d5a0: 72 65 61 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28  reak */.    for(
d5b0: 70 3d 61 69 3b 20 70 3b 20 70 3d 70 2d 3e 61 69  p=ai; p; p=p->ai
d5c0: 5f 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 53  _next){.      iS
d5d0: 6f 63 6b 65 74 20 3d 20 73 6f 63 6b 65 74 28 70  ocket = socket(p
d5e0: 2d 3e 61 69 5f 66 61 6d 69 6c 79 2c 20 70 2d 3e  ->ai_family, p->
d5f0: 61 69 5f 73 6f 63 6b 74 79 70 65 2c 20 70 2d 3e  ai_socktype, p->
d600: 61 69 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 20 20  ai_protocol);.  
d610: 20 20 20 20 69 66 28 20 69 53 6f 63 6b 65 74 3c      if( iSocket<
d620: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
d630: 20 20 20 20 69 66 28 20 63 6f 6e 6e 65 63 74 28      if( connect(
d640: 69 53 6f 63 6b 65 74 2c 70 2d 3e 61 69 5f 61 64  iSocket,p->ai_ad
d650: 64 72 2c 70 2d 3e 61 69 5f 61 64 64 72 6c 65 6e  dr,p->ai_addrlen
d660: 29 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )>=0 ) break;.  
d670: 20 20 20 20 63 6c 6f 73 65 28 69 53 6f 63 6b 65      close(iSocke
d680: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
d690: 28 20 69 53 6f 63 6b 65 74 3c 30 20 7c 7c 20 28  ( iSocket<0 || (
d6a0: 73 20 3d 20 66 64 6f 70 65 6e 28 69 53 6f 63 6b  s = fdopen(iSock
d6b0: 65 74 2c 22 72 2b 22 29 29 3d 3d 30 20 29 7b 0a  et,"r+"))==0 ){.
d6c0: 20 20 20 20 20 20 69 66 28 20 69 53 6f 63 6b 65        if( iSocke
d6d0: 74 3e 3d 30 20 29 20 63 6c 6f 73 65 28 69 53 6f  t>=0 ) close(iSo
d6e0: 63 6b 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  cket);.      if(
d6f0: 20 7a 52 65 6c 69 67 68 74 20 29 7b 0a 20 20 20   zRelight ){.   
d700: 20 20 20 20 20 72 63 20 3d 20 73 79 73 74 65 6d       rc = system
d710: 28 7a 52 65 6c 69 67 68 74 29 3b 0a 20 20 20 20  (zRelight);.    
d720: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
d730: 20 20 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74          Malfunct
d740: 69 6f 6e 28 37 32 31 2c 22 52 65 6c 69 67 68 74  ion(721,"Relight
d750: 20 66 61 69 6c 65 64 20 77 69 74 68 20 25 64 3a   failed with %d:
d760: 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20   \"%s\"\n",.    
d770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d780: 20 20 72 63 2c 20 7a 52 65 6c 69 67 68 74 29 3b    rc, zRelight);
d790: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d7a0: 20 20 20 66 72 65 65 28 7a 52 65 6c 69 67 68 74     free(zRelight
d7b0: 29 3b 0a 20 20 20 20 20 20 20 20 7a 52 65 6c 69  );.        zReli
d7c0: 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ght = 0;.       
d7d0: 20 73 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 20   sleep(1);.     
d7e0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
d7f0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
d800: 46 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Fallback ){.    
d810: 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
d820: 73 74 61 74 62 75 66 3b 0a 20 20 20 20 20 20 20  statbuf;.       
d830: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 20   int rc;.       
d840: 20 6d 65 6d 73 65 74 28 26 73 74 61 74 62 75 66   memset(&statbuf
d850: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 74 61 74  , 0, sizeof(stat
d860: 62 75 66 29 29 3b 0a 20 20 20 20 20 20 20 20 69  buf));.        i
d870: 66 28 20 63 68 64 69 72 28 7a 44 69 72 29 20 29  f( chdir(zDir) )
d880: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  {.          char
d890: 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20 20   zBuf[1000];.   
d8a0: 20 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69         Malfuncti
d8b0: 6f 6e 28 37 32 30 2c 20 2f 2a 20 4c 4f 47 3a 20  on(720, /* LOG: 
d8c0: 63 68 64 69 72 28 29 20 66 61 69 6c 65 64 20 2a  chdir() failed *
d8d0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
d8e0: 20 22 63 61 6e 6e 6f 74 20 63 68 64 69 72 20 74   "cannot chdir t
d8f0: 6f 20 5b 25 73 5d 20 66 72 6f 6d 20 5b 25 73 5d  o [%s] from [%s]
d900: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
d910: 20 20 20 7a 44 69 72 2c 20 67 65 74 63 77 64 28     zDir, getcwd(
d920: 7a 42 75 66 2c 39 39 39 29 29 3b 0a 20 20 20 20  zBuf,999));.    
d930: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
d940: 20 3d 20 73 74 61 74 28 7a 46 61 6c 6c 62 61 63   = stat(zFallbac
d950: 6b 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20  k, &statbuf);.  
d960: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20        if( rc==0 
d970: 26 26 20 53 5f 49 53 52 45 47 28 73 74 61 74 62  && S_ISREG(statb
d980: 75 66 2e 73 74 5f 6d 6f 64 65 29 20 26 26 20 61  uf.st_mode) && a
d990: 63 63 65 73 73 28 7a 46 61 6c 6c 62 61 63 6b 2c  ccess(zFallback,
d9a0: 52 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  R_OK)==0 ){.    
d9b0: 20 20 20 20 20 20 63 6c 6f 73 65 43 6f 6e 6e 65        closeConne
d9c0: 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 20 20 20  ction = 1;.     
d9d0: 20 20 20 20 20 72 63 20 3d 20 53 65 6e 64 46 69       rc = SendFi
d9e0: 6c 65 28 7a 46 61 6c 6c 62 61 63 6b 2c 20 28 69  le(zFallback, (i
d9f0: 6e 74 29 73 74 72 6c 65 6e 28 7a 46 61 6c 6c 62  nt)strlen(zFallb
da00: 61 63 6b 29 2c 20 26 73 74 61 74 62 75 66 29 3b  ack), &statbuf);
da10: 0a 20 20 20 20 20 20 20 20 20 20 66 72 65 65 28  .          free(
da20: 7a 46 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  zFallback);.    
da30: 20 20 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20        exit(0);. 
da40: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
da50: 20 20 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74          Malfunct
da60: 69 6f 6e 28 37 30 36 2c 20 22 62 61 64 20 66 61  ion(706, "bad fa
da70: 6c 6c 62 61 63 6b 20 66 69 6c 65 3a 20 5c 22 25  llback file: \"%
da80: 73 5c 22 5c 6e 22 2c 20 7a 46 61 6c 6c 62 61 63  s\"\n", zFallbac
da90: 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  k);.        }.  
daa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 4d 61 6c 66      }.      Malf
dab0: 75 6e 63 74 69 6f 6e 28 37 30 37 2c 20 22 63 61  unction(707, "ca
dac0: 6e 6e 6f 74 20 6f 70 65 6e 20 73 6f 63 6b 65 74  nnot open socket
dad0: 20 74 6f 20 53 43 47 49 20 73 65 72 76 65 72 20   to SCGI server 
dae0: 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
daf0: 20 20 20 20 20 20 20 20 20 7a 53 63 72 69 70 74           zScript
db00: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  );.    }.    bre
db10: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 6e 48 64 72 41  ak;.  }..  nHdrA
db20: 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7a 48 64 72  lloc = 0;.  zHdr
db30: 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 43 6f 6e   = 0;.  if( zCon
db40: 74 65 6e 74 4c 65 6e 67 74 68 3d 3d 30 20 29 20  tentLength==0 ) 
db50: 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 20 3d  zContentLength =
db60: 20 22 30 22 3b 0a 20 20 7a 53 63 67 69 20 3d 20   "0";.  zScgi = 
db70: 22 31 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  "1";.  for(i=0; 
db80: 69 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 63  i<(int)(sizeof(c
db90: 67 69 65 6e 76 29 2f 73 69 7a 65 6f 66 28 63 67  gienv)/sizeof(cg
dba0: 69 65 6e 76 5b 30 5d 29 29 3b 20 69 2b 2b 29 7b  ienv[0])); i++){
dbb0: 0a 20 20 20 20 69 6e 74 20 6e 31 2c 20 6e 32 3b  .    int n1, n2;
dbc0: 0a 20 20 20 20 69 66 28 20 63 67 69 65 6e 76 5b  .    if( cgienv[
dbd0: 69 5d 2e 70 7a 45 6e 76 56 61 6c 75 65 5b 30 5d  i].pzEnvValue[0]
dbe0: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
dbf0: 20 20 20 20 6e 31 20 3d 20 28 69 6e 74 29 73 74      n1 = (int)st
dc00: 72 6c 65 6e 28 63 67 69 65 6e 76 5b 69 5d 2e 7a  rlen(cgienv[i].z
dc10: 45 6e 76 4e 61 6d 65 29 3b 0a 20 20 20 20 6e 32  EnvName);.    n2
dc20: 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 2a   = (int)strlen(*
dc30: 63 67 69 65 6e 76 5b 69 5d 2e 70 7a 45 6e 76 56  cgienv[i].pzEnvV
dc40: 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20 6e  alue);.    if( n
dc50: 31 2b 6e 32 2b 32 2b 6e 48 64 72 20 3e 3d 20 6e  1+n2+2+nHdr >= n
dc60: 48 64 72 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  HdrAlloc ){.    
dc70: 20 20 6e 48 64 72 41 6c 6c 6f 63 20 3d 20 6e 48    nHdrAlloc = nH
dc80: 64 72 20 2b 20 6e 31 20 2b 20 6e 32 20 2b 20 31  dr + n1 + n2 + 1
dc90: 30 30 30 3b 0a 20 20 20 20 20 20 7a 48 64 72 20  000;.      zHdr 
dca0: 3d 20 72 65 61 6c 6c 6f 63 28 7a 48 64 72 2c 20  = realloc(zHdr, 
dcb0: 6e 48 64 72 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  nHdrAlloc);.    
dcc0: 20 20 69 66 28 20 7a 48 64 72 3d 3d 30 20 29 7b    if( zHdr==0 ){
dcd0: 0a 20 20 20 20 20 20 20 20 4d 61 6c 66 75 6e 63  .        Malfunc
dce0: 74 69 6f 6e 28 37 30 36 2c 20 22 6f 75 74 20 6f  tion(706, "out o
dcf0: 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20  f memory");.    
dd00: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65    }.    }.    me
dd10: 6d 63 70 79 28 7a 48 64 72 2b 6e 48 64 72 2c 20  mcpy(zHdr+nHdr, 
dd20: 63 67 69 65 6e 76 5b 69 5d 2e 7a 45 6e 76 4e 61  cgienv[i].zEnvNa
dd30: 6d 65 2c 20 6e 31 29 3b 0a 20 20 20 20 6e 48 64  me, n1);.    nHd
dd40: 72 20 2b 3d 20 6e 31 3b 0a 20 20 20 20 7a 48 64  r += n1;.    zHd
dd50: 72 5b 6e 48 64 72 2b 2b 5d 20 3d 20 30 3b 0a 20  r[nHdr++] = 0;. 
dd60: 20 20 20 6d 65 6d 63 70 79 28 7a 48 64 72 2b 6e     memcpy(zHdr+n
dd70: 48 64 72 2c 20 2a 63 67 69 65 6e 76 5b 69 5d 2e  Hdr, *cgienv[i].
dd80: 70 7a 45 6e 76 56 61 6c 75 65 2c 20 6e 32 29 3b  pzEnvValue, n2);
dd90: 0a 20 20 20 20 6e 48 64 72 20 2b 3d 20 6e 32 3b  .    nHdr += n2;
dda0: 0a 20 20 20 20 7a 48 64 72 5b 6e 48 64 72 2b 2b  .    zHdr[nHdr++
ddb0: 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 53 63  ] = 0;.  }.  zSc
ddc0: 67 69 20 3d 20 30 3b 0a 20 20 66 70 72 69 6e 74  gi = 0;.  fprint
ddd0: 66 28 73 2c 22 25 64 3a 22 2c 28 69 6e 74 29 6e  f(s,"%d:",(int)n
dde0: 48 64 72 29 3b 0a 20 20 66 77 72 69 74 65 28 7a  Hdr);.  fwrite(z
ddf0: 48 64 72 2c 20 31 2c 20 6e 48 64 72 2c 20 73 29  Hdr, 1, nHdr, s)
de00: 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 2c 22 2c  ;.  fprintf(s,",
de10: 22 29 3b 0a 20 20 66 72 65 65 28 7a 48 64 72 29  ");.  free(zHdr)
de20: 3b 0a 20 20 69 66 28 20 7a 4d 65 74 68 6f 64 5b  ;.  if( zMethod[
de30: 30 5d 3d 3d 27 50 27 0a 20 20 20 26 26 20 61 74  0]=='P'.   && at
de40: 6f 69 28 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67 74  oi(zContentLengt
de50: 68 29 3e 30 20 0a 20 20 20 26 26 20 28 69 6e 20  h)>0 .   && (in 
de60: 3d 20 66 6f 70 65 6e 28 7a 54 6d 70 4e 61 6d 2c  = fopen(zTmpNam,
de70: 22 72 22 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  "r"))!=0 ){.    
de80: 73 69 7a 65 5f 74 20 6e 3b 0a 20 20 20 20 77 68  size_t n;.    wh
de90: 69 6c 65 28 20 28 6e 20 3d 20 66 72 65 61 64 28  ile( (n = fread(
dea0: 7a 4c 69 6e 65 2c 31 2c 73 69 7a 65 6f 66 28 7a  zLine,1,sizeof(z
deb0: 4c 69 6e 65 29 2c 69 6e 29 29 3e 30 20 29 7b 0a  Line),in))>0 ){.
dec0: 20 20 20 20 20 20 66 77 72 69 74 65 28 7a 4c 69        fwrite(zLi
ded0: 6e 65 2c 20 31 2c 20 6e 2c 20 73 29 3b 0a 20 20  ne, 1, n, s);.  
dee0: 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28 69    }.    fclose(i
def0: 6e 29 3b 0a 20 20 7d 0a 20 20 66 66 6c 75 73 68  n);.  }.  fflush
df00: 28 73 29 3b 0a 20 20 43 67 69 48 61 6e 64 6c 65  (s);.  CgiHandle
df10: 52 65 70 6c 79 28 73 29 3b 0a 7d 0a 0a 2f 2a 0a  Reply(s);.}../*.
df20: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
df30: 70 72 6f 63 65 73 73 65 73 20 61 20 73 69 6e 67  processes a sing
df40: 6c 65 20 48 54 54 50 20 72 65 71 75 65 73 74 20  le HTTP request 
df50: 6f 6e 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75  on standard inpu
df60: 74 20 61 6e 64 0a 2a 2a 20 73 65 6e 64 73 20 74  t and.** sends t
df70: 68 65 20 72 65 70 6c 79 20 74 6f 20 73 74 61 6e  he reply to stan
df80: 64 61 72 64 20 6f 75 74 70 75 74 2e 20 20 49 66  dard output.  If
df90: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   the argument is
dfa0: 20 31 20 69 74 20 6d 65 61 6e 73 0a 2a 2a 20 74   1 it means.** t
dfb0: 68 61 74 20 77 65 20 61 72 65 20 73 68 6f 75 6c  hat we are shoul
dfc0: 64 20 63 6c 6f 73 65 20 74 68 65 20 73 6f 63 6b  d close the sock
dfd0: 65 74 20 77 69 74 68 6f 75 74 20 70 72 6f 63 65  et without proce
dfe0: 73 73 69 6e 67 20 61 64 64 69 74 69 6f 6e 61 6c  ssing additional
dff0: 0a 2a 2a 20 48 54 54 50 20 72 65 71 75 65 73 74  .** HTTP request
e000: 73 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72  s after the curr
e010: 65 6e 74 20 72 65 71 75 65 73 74 20 66 69 6e 69  ent request fini
e020: 73 68 65 73 2e 20 20 30 20 6d 65 61 6e 73 20 77  shes.  0 means w
e030: 65 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 77 65 64  e are.** allowed
e040: 20 74 6f 20 6b 65 65 70 20 74 68 65 20 63 6f 6e   to keep the con
e050: 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 61 6e 64  nection open and
e060: 20 74 6f 20 70 72 6f 63 65 73 73 20 61 64 64 69   to process addi
e070: 74 69 6f 6e 61 6c 20 72 65 71 75 65 73 74 73 2e  tional requests.
e080: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
e090: 20 6d 61 79 20 63 68 6f 6f 73 65 20 74 6f 20 63   may choose to c
e0a0: 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  lose the connect
e0b0: 69 6f 6e 20 65 76 65 6e 20 69 66 20 74 68 65 20  ion even if the 
e0c0: 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 30  argument.** is 0
e0d0: 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
e0e0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 68 6f 75 6c  connection shoul
e0f0: 64 20 62 65 20 63 6c 6f 73 65 64 2c 20 74 68 69  d be closed, thi
e100: 73 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20  s routine calls 
e110: 65 78 69 74 28 29 20 61 6e 64 0a 2a 2a 20 74 68  exit() and.** th
e120: 75 73 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73  us never returns
e130: 2e 20 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  .  If this routi
e140: 6e 65 20 64 6f 65 73 20 72 65 74 75 72 6e 20 69  ne does return i
e150: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e 6f  t means that ano
e160: 74 68 65 72 0a 2a 2a 20 48 54 54 50 20 72 65 71  ther.** HTTP req
e170: 75 65 73 74 20 6d 61 79 20 61 70 70 65 61 72 20  uest may appear 
e180: 6f 6e 20 74 68 65 20 77 69 72 65 2e 0a 2a 2f 0a  on the wire..*/.
e190: 76 6f 69 64 20 50 72 6f 63 65 73 73 4f 6e 65 52  void ProcessOneR
e1a0: 65 71 75 65 73 74 28 69 6e 74 20 66 6f 72 63 65  equest(int force
e1b0: 43 6c 6f 73 65 29 7b 0a 20 20 69 6e 74 20 69 2c  Close){.  int i,
e1c0: 20 6a 2c 20 6a 30 3b 0a 20 20 63 68 61 72 20 2a   j, j0;.  char *
e1d0: 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
e1e0: 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 70      /* Used to p
e1f0: 61 72 73 65 20 75 70 20 61 20 73 74 72 69 6e 67  arse up a string
e200: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61   */.  struct sta
e210: 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20  t statbuf;      
e220: 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
e230: 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 74 6f  bout the file to
e240: 20 62 65 20 72 65 74 72 69 65 76 65 64 20 2a 2f   be retrieved */
e250: 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20  .  FILE *in;    
e260: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e270: 46 6f 72 20 72 65 61 64 69 6e 67 20 66 72 6f 6d  For reading from
e280: 20 43 47 49 20 73 63 72 69 70 74 73 20 2a 2f 0a   CGI scripts */.
e290: 23 69 66 64 65 66 20 4c 4f 47 5f 48 45 41 44 45  #ifdef LOG_HEADE
e2a0: 52 0a 20 20 46 49 4c 45 20 2a 68 64 72 4c 6f 67  R.  FILE *hdrLog
e2b0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
e2c0: 20 4c 6f 67 20 66 69 6c 65 20 66 6f 72 20 63 6f   Log file for co
e2d0: 6d 70 6c 65 74 65 20 68 65 61 64 65 72 20 63 6f  mplete header co
e2e0: 6e 74 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a  ntent */.#endif.
e2f0: 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b 31 30 30    char zLine[100
e300: 30 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  0];         /* A
e310: 20 62 75 66 66 65 72 20 66 6f 72 20 69 6e 70 75   buffer for inpu
e320: 74 20 6c 69 6e 65 73 20 6f 72 20 66 6f 72 6d 69  t lines or formi
e330: 6e 67 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 2f  ng names */..  /
e340: 2a 20 43 68 61 6e 67 65 20 64 69 72 65 63 74 6f  * Change directo
e350: 72 69 65 73 20 74 6f 20 74 68 65 20 72 6f 6f 74  ries to the root
e360: 20 6f 66 20 74 68 65 20 48 54 54 50 20 66 69 6c   of the HTTP fil
e370: 65 73 79 73 74 65 6d 0a 20 20 2a 2f 0a 20 20 69  esystem.  */.  i
e380: 66 28 20 63 68 64 69 72 28 7a 52 6f 6f 74 5b 30  f( chdir(zRoot[0
e390: 5d 20 3f 20 7a 52 6f 6f 74 20 3a 20 22 2f 22 29  ] ? zRoot : "/")
e3a0: 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  !=0 ){.    char 
e3b0: 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20 20 20  zBuf[1000];.    
e3c0: 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 31 39 30 2c  Malfunction(190,
e3d0: 20 20 20 2f 2a 20 4c 4f 47 3a 20 63 68 64 69 72     /* LOG: chdir
e3e0: 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  () failed */.   
e3f0: 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 68        "cannot ch
e400: 64 69 72 20 74 6f 20 5b 25 73 5d 20 66 72 6f 6d  dir to [%s] from
e410: 20 5b 25 73 5d 22 2c 0a 20 20 20 20 20 20 20 20   [%s]",.        
e420: 20 7a 52 6f 6f 74 2c 20 67 65 74 63 77 64 28 7a   zRoot, getcwd(z
e430: 42 75 66 2c 39 39 39 29 29 3b 0a 20 20 7d 0a 20  Buf,999));.  }. 
e440: 20 6e 52 65 71 75 65 73 74 2b 2b 3b 0a 0a 20 20   nRequest++;..  
e450: 2f 2a 0a 20 20 2a 2a 20 57 65 20 6d 75 73 74 20  /*.  ** We must 
e460: 72 65 63 65 69 76 65 20 61 20 63 6f 6d 70 6c 65  receive a comple
e470: 74 65 20 68 65 61 64 65 72 20 77 69 74 68 69 6e  te header within
e480: 20 31 35 20 73 65 63 6f 6e 64 73 0a 20 20 2a 2f   15 seconds.  */
e490: 0a 20 20 73 69 67 6e 61 6c 28 53 49 47 41 4c 52  .  signal(SIGALR
e4a0: 4d 2c 20 54 69 6d 65 6f 75 74 29 3b 0a 20 20 73  M, Timeout);.  s
e4b0: 69 67 6e 61 6c 28 53 49 47 53 45 47 56 2c 20 54  ignal(SIGSEGV, T
e4c0: 69 6d 65 6f 75 74 29 3b 0a 20 20 73 69 67 6e 61  imeout);.  signa
e4d0: 6c 28 53 49 47 50 49 50 45 2c 20 54 69 6d 65 6f  l(SIGPIPE, Timeo
e4e0: 75 74 29 3b 0a 20 20 69 66 28 20 75 73 65 54 69  ut);.  if( useTi
e4f0: 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d 28 31 35  meout ) alarm(15
e500: 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65  );..  /* Get the
e510: 20 66 69 72 73 74 20 6c 69 6e 65 20 6f 66 20 74   first line of t
e520: 68 65 20 72 65 71 75 65 73 74 20 61 6e 64 20 70  he request and p
e530: 61 72 73 65 20 6f 75 74 20 74 68 65 0a 20 20 2a  arse out the.  *
e540: 2a 20 6d 65 74 68 6f 64 2c 20 74 68 65 20 73 63  * method, the sc
e550: 72 69 70 74 20 61 6e 64 20 74 68 65 20 70 72 6f  ript and the pro
e560: 74 6f 63 6f 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66  tocol..  */.  if
e570: 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 73 69  ( fgets(zLine,si
e580: 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 73 74 64 69  zeof(zLine),stdi
e590: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78 69  n)==0 ){.    exi
e5a0: 74 28 30 29 3b 0a 20 20 7d 0a 20 20 6f 6d 69 74  t(0);.  }.  omit
e5b0: 4c 6f 67 20 3d 20 30 3b 0a 20 20 6e 49 6e 20 2b  Log = 0;.  nIn +
e5c0: 3d 20 73 74 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b  = strlen(zLine);
e5d0: 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65  ..  /* Parse the
e5e0: 20 66 69 72 73 74 20 6c 69 6e 65 20 6f 66 20 74   first line of t
e5f0: 68 65 20 48 54 54 50 20 72 65 71 75 65 73 74 20  he HTTP request 
e600: 2a 2f 0a 20 20 7a 4d 65 74 68 6f 64 20 3d 20 53  */.  zMethod = S
e610: 74 72 44 75 70 28 47 65 74 46 69 72 73 74 45 6c  trDup(GetFirstEl
e620: 65 6d 65 6e 74 28 7a 4c 69 6e 65 2c 26 7a 29 29  ement(zLine,&z))
e630: 3b 0a 20 20 7a 52 65 61 6c 53 63 72 69 70 74 20  ;.  zRealScript 
e640: 3d 20 7a 53 63 72 69 70 74 20 3d 20 53 74 72 44  = zScript = StrD
e650: 75 70 28 47 65 74 46 69 72 73 74 45 6c 65 6d 65  up(GetFirstEleme
e660: 6e 74 28 7a 2c 26 7a 29 29 3b 0a 20 20 7a 50 72  nt(z,&z));.  zPr
e670: 6f 74 6f 63 6f 6c 20 3d 20 53 74 72 44 75 70 28  otocol = StrDup(
e680: 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28  GetFirstElement(
e690: 7a 2c 26 7a 29 29 3b 0a 20 20 69 66 28 20 7a 50  z,&z));.  if( zP
e6a0: 72 6f 74 6f 63 6f 6c 3d 3d 30 20 7c 7c 20 73 74  rotocol==0 || st
e6b0: 72 6e 63 6d 70 28 7a 50 72 6f 74 6f 63 6f 6c 2c  rncmp(zProtocol,
e6c0: 22 48 54 54 50 2f 22 2c 35 29 21 3d 30 20 7c 7c  "HTTP/",5)!=0 ||
e6d0: 20 73 74 72 6c 65 6e 28 7a 50 72 6f 74 6f 63 6f   strlen(zProtoco
e6e0: 6c 29 21 3d 38 20 29 7b 0a 20 20 20 20 53 74 61  l)!=8 ){.    Sta
e6f0: 72 74 52 65 73 70 6f 6e 73 65 28 22 34 30 30 20  rtResponse("400 
e700: 42 61 64 20 52 65 71 75 65 73 74 22 29 3b 0a 20  Bad Request");. 
e710: 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74     nOut += print
e720: 66 28 0a 20 20 20 20 20 20 22 43 6f 6e 74 65 6e  f(.      "Conten
e730: 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 70 6c 61  t-type: text/pla
e740: 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 20 20 22 5c  in\r\n".      "\
e750: 72 5c 6e 22 0a 20 20 20 20 20 20 22 54 68 69 73  r\n".      "This
e760: 20 73 65 72 76 65 72 20 64 6f 65 73 20 6e 6f 74   server does not
e770: 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20   understand the 
e780: 72 65 71 75 65 73 74 65 64 20 70 72 6f 74 6f 63  requested protoc
e790: 6f 6c 5c 6e 22 0a 20 20 20 20 29 3b 0a 20 20 20  ol\n".    );.   
e7a0: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c   MakeLogEntry(0,
e7b0: 20 32 30 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 62   200); /* LOG: b
e7c0: 61 64 20 70 72 6f 74 6f 63 6f 6c 20 69 6e 20 48  ad protocol in H
e7d0: 54 54 50 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  TTP header */.  
e7e0: 20 20 65 78 69 74 28 30 29 3b 0a 20 20 7d 0a 20    exit(0);.  }. 
e7f0: 20 69 66 28 20 7a 53 63 72 69 70 74 5b 30 5d 3d   if( zScript[0]=
e800: 3d 30 20 29 20 4e 6f 74 46 6f 75 6e 64 28 32 31  =0 ) NotFound(21
e810: 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 45 6d 70 74  0); /* LOG: Empt
e820: 79 20 72 65 71 75 65 73 74 20 55 52 49 20 2a 2f  y request URI */
e830: 0a 20 20 69 66 28 20 66 6f 72 63 65 43 6c 6f 73  .  if( forceClos
e840: 65 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 43 6f  e ){.    closeCo
e850: 6e 6e 65 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20  nnection = 1;.  
e860: 7d 65 6c 73 65 20 69 66 28 20 7a 50 72 6f 74 6f  }else if( zProto
e870: 63 6f 6c 5b 35 5d 3c 27 31 27 20 7c 7c 20 7a 50  col[5]<'1' || zP
e880: 72 6f 74 6f 63 6f 6c 5b 37 5d 3c 27 31 27 20 29  rotocol[7]<'1' )
e890: 7b 0a 20 20 20 20 63 6c 6f 73 65 43 6f 6e 6e 65  {.    closeConne
e8a0: 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a  ction = 1;.  }..
e8b0: 20 20 2f 2a 20 54 68 69 73 20 76 65 72 79 20 73    /* This very s
e8c0: 69 6d 70 6c 65 20 73 65 72 76 65 72 20 6f 6e 6c  imple server onl
e8d0: 79 20 75 6e 64 65 72 73 74 61 6e 64 73 20 74 68  y understands th
e8e0: 65 20 47 45 54 2c 20 50 4f 53 54 0a 20 20 2a 2a  e GET, POST.  **
e8f0: 20 61 6e 64 20 48 45 41 44 20 6d 65 74 68 6f 64   and HEAD method
e900: 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 72  s.  */.  if( str
e910: 63 6d 70 28 7a 4d 65 74 68 6f 64 2c 22 47 45 54  cmp(zMethod,"GET
e920: 22 29 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28  ")!=0 && strcmp(
e930: 7a 4d 65 74 68 6f 64 2c 22 50 4f 53 54 22 29 21  zMethod,"POST")!
e940: 3d 30 0a 20 20 20 20 20 20 20 26 26 20 73 74 72  =0.       && str
e950: 63 6d 70 28 7a 4d 65 74 68 6f 64 2c 22 48 45 41  cmp(zMethod,"HEA
e960: 44 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 53 74  D")!=0 ){.    St
e970: 61 72 74 52 65 73 70 6f 6e 73 65 28 22 35 30 31  artResponse("501
e980: 20 4e 6f 74 20 49 6d 70 6c 65 6d 65 6e 74 65 64   Not Implemented
e990: 22 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20  ");.    nOut += 
e9a0: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22 43  printf(.      "C
e9b0: 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78  ontent-type: tex
e9c0: 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20  t/plain\r\n".   
e9d0: 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 20 20     "\r\n".      
e9e0: 22 54 68 65 20 25 73 20 6d 65 74 68 6f 64 20 69  "The %s method i
e9f0: 73 20 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65  s not implemente
ea00: 64 20 6f 6e 20 74 68 69 73 20 73 65 72 76 65 72  d on this server
ea10: 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 7a 4d 65 74  .\n",.      zMet
ea20: 68 6f 64 29 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f  hod);.    MakeLo
ea30: 67 45 6e 74 72 79 28 30 2c 20 32 32 30 29 3b 20  gEntry(0, 220); 
ea40: 2f 2a 20 4c 4f 47 3a 20 55 6e 6b 6e 6f 77 6e 20  /* LOG: Unknown 
ea50: 72 65 71 75 65 73 74 20 6d 65 74 68 6f 64 20 2a  request method *
ea60: 2f 0a 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20  /.    exit(0);. 
ea70: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
ea80: 65 20 69 73 20 61 20 6c 6f 67 20 66 69 6c 65 20  e is a log file 
ea90: 28 69 66 20 7a 4c 6f 67 46 69 6c 65 21 3d 30 29  (if zLogFile!=0)
eaa0: 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 74 68   and if the path
eab0: 6e 61 6d 65 20 69 6e 0a 20 20 2a 2a 20 74 68 65  name in.  ** the
eac0: 20 66 69 72 73 74 20 6c 69 6e 65 20 6f 66 20 74   first line of t
ead0: 68 65 20 68 74 74 70 20 72 65 71 75 65 73 74 20  he http request 
eae0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6d 61 67  contains the mag
eaf0: 69 63 20 73 74 72 69 6e 67 0a 20 20 2a 2a 20 22  ic string.  ** "
eb00: 46 75 6c 6c 48 65 61 64 65 72 4c 6f 67 22 20 74  FullHeaderLog" t
eb10: 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 6f  hen write the co
eb20: 6d 70 6c 65 74 65 20 68 65 61 64 65 72 20 74 65  mplete header te
eb30: 78 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  xt into the.  **
eb40: 20 66 69 6c 65 20 25 73 28 7a 4c 6f 67 46 69 6c   file %s(zLogFil
eb50: 65 29 2d 68 64 72 2e 20 20 4f 76 65 72 77 72 69  e)-hdr.  Overwri
eb60: 74 65 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  te the file.  Th
eb70: 69 73 20 69 73 20 66 6f 72 20 70 72 6f 74 6f 63  is is for protoc
eb80: 6f 6c 0a 20 20 2a 2a 20 64 65 62 75 67 67 69 6e  ol.  ** debuggin
eb90: 67 20 6f 6e 6c 79 20 61 6e 64 20 69 73 20 6f 6e  g only and is on
eba0: 6c 79 20 65 6e 61 62 6c 65 64 20 69 66 20 61 6c  ly enabled if al
ebb0: 74 68 74 74 70 64 20 69 73 20 63 6f 6d 70 69 6c  thttpd is compil
ebc0: 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65  ed with.  ** the
ebd0: 20 2d 44 4c 4f 47 5f 48 45 41 44 45 52 3d 31 20   -DLOG_HEADER=1 
ebe0: 6f 70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66  option..  */.#if
ebf0: 64 65 66 20 4c 4f 47 5f 48 45 41 44 45 52 0a 20  def LOG_HEADER. 
ec00: 20 69 66 28 20 7a 4c 6f 67 46 69 6c 65 0a 20 20   if( zLogFile.  
ec10: 20 26 26 20 73 74 72 73 74 72 28 7a 53 63 72 69   && strstr(zScri
ec20: 70 74 2c 22 46 75 6c 6c 48 65 61 64 65 72 4c 6f  pt,"FullHeaderLo
ec30: 67 22 29 21 3d 30 0a 20 20 20 26 26 20 73 74 72  g")!=0.   && str
ec40: 6c 65 6e 28 7a 4c 6f 67 46 69 6c 65 29 3c 73 69  len(zLogFile)<si
ec50: 7a 65 6f 66 28 7a 4c 69 6e 65 29 2d 35 30 0a 20  zeof(zLine)-50. 
ec60: 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28   ){.    sprintf(
ec70: 7a 4c 69 6e 65 2c 20 22 25 73 2d 68 64 72 22 2c  zLine, "%s-hdr",
ec80: 20 7a 4c 6f 67 46 69 6c 65 29 3b 0a 20 20 20 20   zLogFile);.    
ec90: 68 64 72 4c 6f 67 20 3d 20 66 6f 70 65 6e 28 7a  hdrLog = fopen(z
eca0: 4c 69 6e 65 2c 20 22 77 62 22 29 3b 0a 20 20 7d  Line, "wb");.  }
ecb0: 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 2f 2a 20 47  .#endif...  /* G
ecc0: 65 74 20 61 6c 6c 20 74 68 65 20 6f 70 74 69 6f  et all the optio
ecd0: 6e 61 6c 20 66 69 65 6c 64 73 20 74 68 61 74 20  nal fields that 
ece0: 66 6f 6c 6c 6f 77 20 74 68 65 20 66 69 72 73 74  follow the first
ecf0: 20 6c 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 7a 43   line..  */.  zC
ed00: 6f 6f 6b 69 65 20 3d 20 30 3b 0a 20 20 7a 41 75  ookie = 0;.  zAu
ed10: 74 68 54 79 70 65 20 3d 20 30 3b 0a 20 20 7a 52  thType = 0;.  zR
ed20: 65 6d 6f 74 65 55 73 65 72 20 3d 20 30 3b 0a 20  emoteUser = 0;. 
ed30: 20 7a 52 65 66 65 72 65 72 20 3d 20 30 3b 0a 20   zReferer = 0;. 
ed40: 20 7a 49 66 4e 6f 6e 65 4d 61 74 63 68 20 3d 20   zIfNoneMatch = 
ed50: 30 3b 0a 20 20 7a 49 66 4d 6f 64 69 66 69 65 64  0;.  zIfModified
ed60: 53 69 6e 63 65 20 3d 20 30 3b 0a 20 20 77 68 69  Since = 0;.  whi
ed70: 6c 65 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c  le( fgets(zLine,
ed80: 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 73 74  sizeof(zLine),st
ed90: 64 69 6e 29 20 29 7b 0a 20 20 20 20 63 68 61 72  din) ){.    char
eda0: 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 3b 0a 20 20   *zFieldName;.  
edb0: 20 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 0a 23    char *zVal;..#
edc0: 69 66 64 65 66 20 4c 4f 47 5f 48 45 41 44 45 52  ifdef LOG_HEADER
edd0: 0a 20 20 20 20 69 66 28 20 68 64 72 4c 6f 67 20  .    if( hdrLog 
ede0: 29 20 66 70 72 69 6e 74 66 28 68 64 72 4c 6f 67  ) fprintf(hdrLog
edf0: 2c 20 22 25 73 22 2c 20 7a 4c 69 6e 65 29 3b 0a  , "%s", zLine);.
ee00: 23 65 6e 64 69 66 0a 20 20 20 20 6e 49 6e 20 2b  #endif.    nIn +
ee10: 3d 20 73 74 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b  = strlen(zLine);
ee20: 0a 20 20 20 20 7a 46 69 65 6c 64 4e 61 6d 65 20  .    zFieldName 
ee30: 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e  = GetFirstElemen
ee40: 74 28 7a 4c 69 6e 65 2c 26 7a 56 61 6c 29 3b 0a  t(zLine,&zVal);.
ee50: 20 20 20 20 69 66 28 20 7a 46 69 65 6c 64 4e 61      if( zFieldNa
ee60: 6d 65 3d 3d 30 20 7c 7c 20 2a 7a 46 69 65 6c 64  me==0 || *zField
ee70: 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Name==0 ) break;
ee80: 0a 20 20 20 20 52 65 6d 6f 76 65 4e 65 77 6c 69  .    RemoveNewli
ee90: 6e 65 28 7a 56 61 6c 29 3b 0a 20 20 20 20 69 66  ne(zVal);.    if
eea0: 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69  ( strcasecmp(zFi
eeb0: 65 6c 64 4e 61 6d 65 2c 22 55 73 65 72 2d 41 67  eldName,"User-Ag
eec0: 65 6e 74 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ent:")==0 ){.   
eed0: 20 20 20 7a 41 67 65 6e 74 20 3d 20 53 74 72 44     zAgent = StrD
eee0: 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65  up(zVal);.    }e
eef0: 6c 73 65 20 69 66 28 20 73 74 72 63 61 73 65 63  lse if( strcasec
ef00: 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 41  mp(zFieldName,"A
ef10: 63 63 65 70 74 3a 22 29 3d 3d 30 20 29 7b 0a 20  ccept:")==0 ){. 
ef20: 20 20 20 20 20 7a 41 63 63 65 70 74 20 3d 20 53       zAccept = S
ef30: 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20  trDup(zVal);.   
ef40: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 61   }else if( strca
ef50: 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65  secmp(zFieldName
ef60: 2c 22 41 63 63 65 70 74 2d 45 6e 63 6f 64 69 6e  ,"Accept-Encodin
ef70: 67 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  g:")==0 ){.     
ef80: 20 7a 41 63 63 65 70 74 45 6e 63 6f 64 69 6e 67   zAcceptEncoding
ef90: 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b   = StrDup(zVal);
efa0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
efb0: 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64  trcasecmp(zField
efc0: 4e 61 6d 65 2c 22 43 6f 6e 74 65 6e 74 2d 6c 65  Name,"Content-le
efd0: 6e 67 74 68 3a 22 29 3d 3d 30 20 29 7b 0a 20 20  ngth:")==0 ){.  
efe0: 20 20 20 20 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67      zContentLeng
eff0: 74 68 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c  th = StrDup(zVal
f000: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
f010: 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65   strcasecmp(zFie
f020: 6c 64 4e 61 6d 65 2c 22 43 6f 6e 74 65 6e 74 2d  ldName,"Content-
f030: 74 79 70 65 3a 22 29 3d 3d 30 20 29 7b 0a 20 20  type:")==0 ){.  
f040: 20 20 20 20 7a 43 6f 6e 74 65 6e 74 54 79 70 65      zContentType
f050: 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b   = StrDup(zVal);
f060: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
f070: 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64  trcasecmp(zField
f080: 4e 61 6d 65 2c 22 52 65 66 65 72 65 72 3a 22 29  Name,"Referer:")
f090: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 52 65  ==0 ){.      zRe
f0a0: 66 65 72 65 72 20 3d 20 53 74 72 44 75 70 28 7a  ferer = StrDup(z
f0b0: 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Val);.      if( 
f0c0: 73 74 72 73 74 72 28 7a 56 61 6c 2c 20 22 64 65  strstr(zVal, "de
f0d0: 76 69 64 73 2e 6e 65 74 2f 22 29 21 3d 30 20 29  vids.net/")!=0 )
f0e0: 7b 20 7a 52 65 66 65 72 65 72 20 3d 20 22 64 65  { zReferer = "de
f0f0: 76 69 64 73 2e 6e 65 74 2e 73 6d 75 74 22 3b 0a  vids.net.smut";.
f100: 20 20 20 20 20 20 20 20 46 6f 72 62 69 64 64 65          Forbidde
f110: 6e 28 32 33 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20  n(230); /* LOG: 
f120: 52 65 66 65 72 72 65 72 20 69 73 20 64 65 76 69  Referrer is devi
f130: 64 73 2e 6e 65 74 20 2a 2f 0a 20 20 20 20 20 20  ds.net */.      
f140: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
f150: 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c  strcasecmp(zFiel
f160: 64 4e 61 6d 65 2c 22 43 6f 6f 6b 69 65 3a 22 29  dName,"Cookie:")
f170: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f  ==0 ){.      zCo
f180: 6f 6b 69 65 20 3d 20 53 74 72 41 70 70 65 6e 64  okie = StrAppend
f190: 28 7a 43 6f 6f 6b 69 65 2c 22 3b 20 22 2c 7a 56  (zCookie,"; ",zV
f1a0: 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  al);.    }else i
f1b0: 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46  f( strcasecmp(zF
f1c0: 69 65 6c 64 4e 61 6d 65 2c 22 43 6f 6e 6e 65 63  ieldName,"Connec
f1d0: 74 69 6f 6e 3a 22 29 3d 3d 30 20 29 7b 0a 20 20  tion:")==0 ){.  
f1e0: 20 20 20 20 69 66 28 20 73 74 72 63 61 73 65 63      if( strcasec
f1f0: 6d 70 28 7a 56 61 6c 2c 22 63 6c 6f 73 65 22 29  mp(zVal,"close")
f200: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
f210: 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d  loseConnection =
f220: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
f230: 69 66 28 20 21 66 6f 72 63 65 43 6c 6f 73 65 20  if( !forceClose 
f240: 26 26 20 73 74 72 63 61 73 65 63 6d 70 28 7a 56  && strcasecmp(zV
f250: 61 6c 2c 20 22 6b 65 65 70 2d 61 6c 69 76 65 22  al, "keep-alive"
f260: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
f270: 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20  closeConnection 
f280: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
f290: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 61   }else if( strca
f2a0: 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65  secmp(zFieldName
f2b0: 2c 22 48 6f 73 74 3a 22 29 3d 3d 30 20 29 7b 0a  ,"Host:")==0 ){.
f2c0: 20 20 20 20 20 20 69 6e 74 20 69 6e 53 71 75 61        int inSqua
f2d0: 72 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68  re = 0;.      ch
f2e0: 61 72 20 63 3b 0a 20 20 20 20 20 20 69 66 28 20  ar c;.      if( 
f2f0: 73 61 6e 69 74 69 7a 65 53 74 72 69 6e 67 28 7a  sanitizeString(z
f300: 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Val) ){.        
f310: 46 6f 72 62 69 64 64 65 6e 28 32 34 30 29 3b 20  Forbidden(240); 
f320: 20 2f 2a 20 4c 4f 47 3a 20 49 6c 6c 65 67 61 6c   /* LOG: Illegal
f330: 20 63 6f 6e 74 65 6e 74 20 69 6e 20 48 4f 53 54   content in HOST
f340: 3a 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  : parameter */. 
f350: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 48 74       }.      zHt
f360: 74 70 48 6f 73 74 20 3d 20 53 74 72 44 75 70 28  tpHost = StrDup(
f370: 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 7a 53 65  zVal);.      zSe
f380: 72 76 65 72 50 6f 72 74 20 3d 20 7a 53 65 72 76  rverPort = zServ
f390: 65 72 4e 61 6d 65 20 3d 20 53 74 72 44 75 70 28  erName = StrDup(
f3a0: 7a 48 74 74 70 48 6f 73 74 29 3b 0a 20 20 20 20  zHttpHost);.    
f3b0: 20 20 77 68 69 6c 65 28 20 7a 53 65 72 76 65 72    while( zServer
f3c0: 50 6f 72 74 20 26 26 20 28 63 20 3d 20 2a 7a 53  Port && (c = *zS
f3d0: 65 72 76 65 72 50 6f 72 74 29 21 3d 30 0a 20 20  erverPort)!=0.  
f3e0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
f3f0: 63 21 3d 27 3a 27 20 7c 7c 20 69 6e 53 71 75 61  c!=':' || inSqua
f400: 72 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  re) ){.        i
f410: 66 28 20 63 3d 3d 27 5b 27 20 29 20 69 6e 53 71  f( c=='[' ) inSq
f420: 75 61 72 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  uare = 1;.      
f430: 20 20 69 66 28 20 63 3d 3d 27 5d 27 20 29 20 69    if( c==']' ) i
f440: 6e 53 71 75 61 72 65 20 3d 20 30 3b 0a 20 20 20  nSquare = 0;.   
f450: 20 20 20 20 20 7a 53 65 72 76 65 72 50 6f 72 74       zServerPort
f460: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
f470: 20 20 69 66 28 20 7a 53 65 72 76 65 72 50 6f 72    if( zServerPor
f480: 74 20 26 26 20 2a 7a 53 65 72 76 65 72 50 6f 72  t && *zServerPor
f490: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 7a 53  t ){.        *zS
f4a0: 65 72 76 65 72 50 6f 72 74 20 3d 20 30 3b 0a 20  erverPort = 0;. 
f4b0: 20 20 20 20 20 20 20 7a 53 65 72 76 65 72 50 6f         zServerPo
f4c0: 72 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rt++;.      }.  
f4d0: 20 20 20 20 69 66 28 20 7a 52 65 61 6c 50 6f 72      if( zRealPor
f4e0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 65  t ){.        zSe
f4f0: 72 76 65 72 50 6f 72 74 20 3d 20 53 74 72 44 75  rverPort = StrDu
f500: 70 28 7a 52 65 61 6c 50 6f 72 74 29 3b 0a 20 20  p(zRealPort);.  
f510: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
f520: 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a  if( strcasecmp(z
f530: 46 69 65 6c 64 4e 61 6d 65 2c 22 41 75 74 68 6f  FieldName,"Autho
f540: 72 69 7a 61 74 69 6f 6e 3a 22 29 3d 3d 30 20 29  rization:")==0 )
f550: 7b 0a 20 20 20 20 20 20 7a 41 75 74 68 54 79 70  {.      zAuthTyp
f560: 65 20 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d  e = GetFirstElem
f570: 65 6e 74 28 53 74 72 44 75 70 28 7a 56 61 6c 29  ent(StrDup(zVal)
f580: 2c 20 26 7a 41 75 74 68 41 72 67 29 3b 0a 20 20  , &zAuthArg);.  
f590: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
f5a0: 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d  asecmp(zFieldNam
f5b0: 65 2c 22 49 66 2d 4e 6f 6e 65 2d 4d 61 74 63 68  e,"If-None-Match
f5c0: 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  :")==0 ){.      
f5d0: 7a 49 66 4e 6f 6e 65 4d 61 74 63 68 20 3d 20 53  zIfNoneMatch = S
f5e0: 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20  trDup(zVal);.   
f5f0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 61   }else if( strca
f600: 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65  secmp(zFieldName
f610: 2c 22 49 66 2d 4d 6f 64 69 66 69 65 64 2d 53 69  ,"If-Modified-Si
f620: 6e 63 65 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20  nce:")==0 ){.   
f630: 20 20 20 7a 49 66 4d 6f 64 69 66 69 65 64 53 69     zIfModifiedSi
f640: 6e 63 65 20 3d 20 53 74 72 44 75 70 28 7a 56 61  nce = StrDup(zVa
f650: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69  l);.    }.  }.#i
f660: 66 64 65 66 20 4c 4f 47 5f 48 45 41 44 45 52 0a  fdef LOG_HEADER.
f670: 20 20 69 66 28 20 68 64 72 4c 6f 67 20 29 20 66    if( hdrLog ) f
f680: 63 6c 6f 73 65 28 68 64 72 4c 6f 67 29 3b 0a 23  close(hdrLog);.#
f690: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 69 73 61  endif..  /* Disa
f6a0: 6c 6c 6f 77 20 72 65 71 75 65 73 74 73 20 66 72  llow requests fr
f6b0: 6f 6d 20 63 65 72 74 61 69 6e 20 63 6c 69 65 6e  om certain clien
f6c0: 74 73 20 2a 2f 0a 20 20 69 66 28 20 7a 41 67 65  ts */.  if( zAge
f6d0: 6e 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  nt ){.    if( st
f6e0: 72 73 74 72 28 7a 41 67 65 6e 74 2c 20 22 57 69  rstr(zAgent, "Wi
f6f0: 6e 64 6f 77 73 5f 39 22 29 21 3d 30 0a 20 20 20  ndows_9")!=0.   
f700: 20 20 7c 7c 20 73 74 72 73 74 72 28 7a 41 67 65    || strstr(zAge
f710: 6e 74 2c 20 22 44 6f 77 6e 6c 6f 61 64 5f 4d 61  nt, "Download_Ma
f720: 73 74 65 72 22 29 21 3d 30 0a 20 20 20 20 20 7c  ster")!=0.     |
f730: 7c 20 73 74 72 73 74 72 28 7a 41 67 65 6e 74 2c  | strstr(zAgent,
f740: 20 22 45 7a 6f 6f 6d 73 2f 22 29 21 3d 30 0a 20   "Ezooms/")!=0. 
f750: 20 20 20 20 7c 7c 20 73 74 72 73 74 72 28 7a 41      || strstr(zA
f760: 67 65 6e 74 2c 20 22 48 54 54 72 61 63 6b 22 29  gent, "HTTrack")
f770: 21 3d 30 0a 20 20 20 20 20 7c 7c 20 73 74 72 73  !=0.     || strs
f780: 74 72 28 7a 41 67 65 6e 74 2c 20 22 41 68 72 65  tr(zAgent, "Ahre
f790: 66 73 42 6f 74 22 29 21 3d 30 0a 20 20 20 20 29  fsBot")!=0.    )
f7a0: 7b 0a 20 20 20 20 20 20 46 6f 72 62 69 64 64 65  {.      Forbidde
f7b0: 6e 28 32 35 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a  n(250);  /* LOG:
f7c0: 20 44 69 73 61 6c 6c 6f 77 65 64 20 75 73 65 72   Disallowed user
f7d0: 20 61 67 65 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a   agent */.    }.
f7e0: 20 20 20 20 2f 2a 20 53 70 69 64 65 72 20 61 74      /* Spider at
f7f0: 74 61 63 6b 20 66 72 6f 6d 20 32 30 31 39 2d 30  tack from 2019-0
f800: 34 2d 32 34 20 2a 2f 0a 20 20 20 20 69 66 28 20  4-24 */.    if( 
f810: 73 74 72 63 6d 70 28 7a 41 67 65 6e 74 2c 0a 20  strcmp(zAgent,. 
f820: 20 20 20 20 20 20 20 20 20 20 20 22 4d 6f 7a 69             "Mozi
f830: 6c 6c 61 2f 35 2e 30 20 28 57 69 6e 64 6f 77 73  lla/5.0 (Windows
f840: 20 4e 54 20 31 30 2e 30 3b 20 57 4f 57 36 34 29   NT 10.0; WOW64)
f850: 20 41 70 70 6c 65 57 65 62 4b 69 74 2f 35 33 37   AppleWebKit/537
f860: 2e 33 36 20 22 0a 20 20 20 20 20 20 20 20 20 20  .36 ".          
f870: 20 20 22 28 4b 48 54 4d 4c 2c 20 6c 69 6b 65 20    "(KHTML, like 
f880: 47 65 63 6b 6f 29 20 43 68 72 6f 6d 65 2f 35 30  Gecko) Chrome/50
f890: 2e 30 2e 32 36 36 31 2e 31 30 32 20 53 61 66 61  .0.2661.102 Safa
f8a0: 72 69 2f 35 33 37 2e 33 36 22 29 3d 3d 30 20 29  ri/537.36")==0 )
f8b0: 7b 0a 20 20 20 20 20 20 46 6f 72 62 69 64 64 65  {.      Forbidde
f8c0: 6e 28 32 35 31 29 3b 20 20 2f 2a 20 4c 4f 47 3a  n(251);  /* LOG:
f8d0: 20 44 69 73 61 6c 6c 6f 77 65 64 20 75 73 65 72   Disallowed user
f8e0: 20 61 67 65 6e 74 20 28 32 30 31 39 30 34 32 34   agent (20190424
f8f0: 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ) */.    }.  }.#
f900: 69 66 20 30 0a 20 20 69 66 28 20 7a 52 65 66 65  if 0.  if( zRefe
f910: 72 65 72 20 29 7b 0a 20 20 20 20 73 74 61 74 69  rer ){.    stati
f920: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
f930: 44 69 73 61 6c 6c 6f 77 5b 5d 20 3d 20 7b 0a 20  Disallow[] = {. 
f940: 20 20 20 20 20 22 73 6b 69 64 72 6f 77 63 72 61       "skidrowcra
f950: 63 6b 2e 63 6f 6d 22 2c 0a 20 20 20 20 20 20 22  ck.com",.      "
f960: 68 6f 73 68 69 79 75 75 67 69 2e 74 69 73 74 6f  hoshiyuugi.tisto
f970: 72 79 2e 63 6f 6d 22 2c 0a 20 20 20 20 20 20 22  ry.com",.      "
f980: 73 6b 69 64 72 6f 77 67 61 6d 65 73 2e 6e 65 74  skidrowgames.net
f990: 22 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  ",.    };.    in
f9a0: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
f9b0: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 73  ; i<sizeof(azDis
f9c0: 61 6c 6c 6f 77 29 2f 73 69 7a 65 6f 66 28 61 7a  allow)/sizeof(az
f9d0: 44 69 73 61 6c 6c 6f 77 5b 30 5d 29 3b 20 69 2b  Disallow[0]); i+
f9e0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
f9f0: 72 73 74 72 28 7a 52 65 66 65 72 65 72 2c 20 61  rstr(zReferer, a
fa00: 7a 44 69 73 61 6c 6c 6f 77 5b 69 5d 29 21 3d 30  zDisallow[i])!=0
fa10: 20 29 7b 0a 20 20 20 20 20 20 20 20 4e 6f 74 46   ){.        NotF
fa20: 6f 75 6e 64 28 32 36 30 29 3b 20 20 2f 2a 20 4c  ound(260);  /* L
fa30: 4f 47 3a 20 44 69 73 61 6c 6c 6f 77 65 64 20 72  OG: Disallowed r
fa40: 65 66 65 72 72 65 72 20 2a 2f 0a 20 20 20 20 20  eferrer */.     
fa50: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
fa60: 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61  dif..  /* Make a
fa70: 6e 20 65 78 74 72 61 20 65 66 66 6f 72 74 20 74  n extra effort t
fa80: 6f 20 67 65 74 20 61 20 76 61 6c 69 64 20 73 65  o get a valid se
fa90: 72 76 65 72 20 6e 61 6d 65 20 61 6e 64 20 70 6f  rver name and po
faa0: 72 74 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2a 20  rt number..  ** 
fab0: 4f 6e 6c 79 20 4e 65 74 73 63 61 70 65 20 70 72  Only Netscape pr
fac0: 6f 76 69 64 65 73 20 74 68 69 73 20 69 6e 66 6f  ovides this info
fad0: 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  rmation.  If the
fae0: 20 62 72 6f 77 73 65 72 20 69 73 0a 20 20 2a 2a   browser is.  **
faf0: 20 49 6e 74 65 72 6e 65 74 20 45 78 70 6c 6f 72   Internet Explor
fb00: 65 72 2c 20 74 68 65 6e 20 77 65 20 68 61 76 65  er, then we have
fb10: 20 74 6f 20 66 69 6e 64 20 6f 75 74 20 74 68 65   to find out the
fb20: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
fb30: 0a 20 20 2a 2a 20 6f 75 72 73 65 6c 76 65 73 2e  .  ** ourselves.
fb40: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 53 65 72  .  */.  if( zSer
fb50: 76 65 72 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  verName==0 ){.  
fb60: 20 20 7a 53 65 72 76 65 72 4e 61 6d 65 20 3d 20    zServerName = 
fb70: 53 61 66 65 4d 61 6c 6c 6f 63 28 20 31 30 30 20  SafeMalloc( 100 
fb80: 29 3b 0a 20 20 20 20 67 65 74 68 6f 73 74 6e 61  );.    gethostna
fb90: 6d 65 28 7a 53 65 72 76 65 72 4e 61 6d 65 2c 31  me(zServerName,1
fba0: 30 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  00);.  }.  if( z
fbb0: 53 65 72 76 65 72 50 6f 72 74 3d 3d 30 20 7c 7c  ServerPort==0 ||
fbc0: 20 2a 7a 53 65 72 76 65 72 50 6f 72 74 3d 3d 30   *zServerPort==0
fbd0: 20 29 7b 0a 20 20 20 20 7a 53 65 72 76 65 72 50   ){.    zServerP
fbe0: 6f 72 74 20 3d 20 44 45 46 41 55 4c 54 5f 50 4f  ort = DEFAULT_PO
fbf0: 52 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  RT;.  }..  /* Re
fc00: 6d 6f 76 65 20 74 68 65 20 71 75 65 72 79 20 73  move the query s
fc10: 74 72 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 65  tring from the e
fc20: 6e 64 20 6f 66 20 74 68 65 20 72 65 71 75 65 73  nd of the reques
fc30: 74 65 64 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ted file..  */. 
fc40: 20 66 6f 72 28 7a 3d 7a 53 63 72 69 70 74 3b 20   for(z=zScript; 
fc50: 2a 7a 20 26 26 20 2a 7a 21 3d 27 3f 27 3b 20 7a  *z && *z!='?'; z
fc60: 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d  ++){}.  if( *z==
fc70: 27 3f 27 20 29 7b 0a 20 20 20 20 7a 51 75 65 72  '?' ){.    zQuer
fc80: 79 53 75 66 66 69 78 20 3d 20 53 74 72 44 75 70  ySuffix = StrDup
fc90: 28 7a 29 3b 0a 20 20 20 20 2a 7a 20 3d 20 30 3b  (z);.    *z = 0;
fca0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 51  .  }else{.    zQ
fcb0: 75 65 72 79 53 75 66 66 69 78 20 3d 20 22 22 3b  uerySuffix = "";
fcc0: 0a 20 20 7d 0a 20 20 7a 51 75 65 72 79 53 74 72  .  }.  zQueryStr
fcd0: 69 6e 67 20 3d 20 2a 7a 51 75 65 72 79 53 75 66  ing = *zQuerySuf
fce0: 66 69 78 20 3f 20 26 7a 51 75 65 72 79 53 75 66  fix ? &zQuerySuf
fcf0: 66 69 78 5b 31 5d 20 3a 20 7a 51 75 65 72 79 53  fix[1] : zQueryS
fd00: 75 66 66 69 78 3b 0a 0a 20 20 2f 2a 20 43 72 65  uffix;..  /* Cre
fd10: 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20 68 6f  ate a file to ho
fd20: 6c 64 20 74 68 65 20 50 4f 53 54 20 71 75 65 72  ld the POST quer
fd30: 79 20 64 61 74 61 2c 20 69 66 20 61 6e 79 2e 20  y data, if any. 
fd40: 20 57 65 20 68 61 76 65 20 74 6f 0a 20 20 2a 2a   We have to.  **
fd50: 20 64 6f 20 69 74 20 74 68 69 73 20 77 61 79 2e   do it this way.
fd60: 20 20 57 65 20 63 61 6e 27 74 20 6a 75 73 74 20    We can't just 
fd70: 70 61 73 73 20 74 68 65 20 66 69 6c 65 20 64 65  pass the file de
fd80: 73 63 72 69 70 74 6f 72 20 64 6f 77 6e 20 74 6f  scriptor down to
fd90: 0a 20 20 2a 2a 20 74 68 65 20 63 68 69 6c 64 20  .  ** the child 
fda0: 70 72 6f 63 65 73 73 20 62 65 63 61 75 73 65 20  process because 
fdb0: 74 68 65 20 66 67 65 74 73 28 29 20 66 75 6e 63  the fgets() func
fdc0: 74 69 6f 6e 20 6d 61 79 20 68 61 76 65 20 61 6c  tion may have al
fdd0: 72 65 61 64 79 0a 20 20 2a 2a 20 72 65 61 64 20  ready.  ** read 
fde0: 70 61 72 74 20 6f 66 20 74 68 65 20 50 4f 53 54  part of the POST
fdf0: 20 64 61 74 61 20 69 6e 74 6f 20 69 74 73 20 69   data into its i
fe00: 6e 74 65 72 6e 61 6c 20 62 75 66 66 65 72 2e 0a  nternal buffer..
fe10: 20 20 2a 2f 0a 20 20 69 66 28 20 7a 4d 65 74 68    */.  if( zMeth
fe20: 6f 64 5b 30 5d 3d 3d 27 50 27 20 26 26 20 7a 43  od[0]=='P' && zC
fe30: 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 21 3d 30 20  ontentLength!=0 
fe40: 29 7b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65  ){.    size_t le
fe50: 6e 20 3d 20 61 74 6f 69 28 7a 43 6f 6e 74 65 6e  n = atoi(zConten
fe60: 74 4c 65 6e 67 74 68 29 3b 0a 20 20 20 20 46 49  tLength);.    FI
fe70: 4c 45 20 2a 6f 75 74 3b 0a 20 20 20 20 63 68 61  LE *out;.    cha
fe80: 72 20 2a 7a 42 75 66 3b 0a 20 20 20 20 69 6e 74  r *zBuf;.    int
fe90: 20 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6c 65 6e   n;..    if( len
fea0: 3e 4d 41 58 5f 43 4f 4e 54 45 4e 54 5f 4c 45 4e  >MAX_CONTENT_LEN
feb0: 47 54 48 20 29 7b 0a 20 20 20 20 20 20 53 74 61  GTH ){.      Sta
fec0: 72 74 52 65 73 70 6f 6e 73 65 28 22 35 30 30 20  rtResponse("500 
fed0: 52 65 71 75 65 73 74 20 74 6f 6f 20 6c 61 72 67  Request too larg
fee0: 65 22 29 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20  e");.      nOut 
fef0: 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20  += printf(.     
ff00: 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65     "Content-type
ff10: 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e  : text/plain\r\n
ff20: 22 0a 20 20 20 20 20 20 20 20 22 5c 72 5c 6e 22  ".        "\r\n"
ff30: 0a 20 20 20 20 20 20 20 20 22 54 6f 6f 20 6d 75  .        "Too mu
ff40: 63 68 20 50 4f 53 54 20 64 61 74 61 5c 6e 22 0a  ch POST data\n".
ff50: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 4d        );.      M
ff60: 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 32  akeLogEntry(0, 2
ff70: 37 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 52 65 71  70); /* LOG: Req
ff80: 75 65 73 74 20 74 6f 6f 20 6c 61 72 67 65 20 2a  uest too large *
ff90: 2f 0a 20 20 20 20 20 20 65 78 69 74 28 30 29 3b  /.      exit(0);
ffa0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 70 72 69 6e  .    }.    sprin
ffb0: 74 66 28 7a 54 6d 70 4e 61 6d 42 75 66 2c 20 22  tf(zTmpNamBuf, "
ffc0: 2f 74 6d 70 2f 2d 70 6f 73 74 2d 64 61 74 61 2d  /tmp/-post-data-
ffd0: 58 58 58 58 58 58 22 29 3b 0a 20 20 20 20 7a 54  XXXXXX");.    zT
ffe0: 6d 70 4e 61 6d 20 3d 20 7a 54 6d 70 4e 61 6d 42  mpNam = zTmpNamB
fff0: 75 66 3b 0a 20 20 20 20 69 66 28 20 6d 6b 73 74  uf;.    if( mkst
10000 65 6d 70 28 7a 54 6d 70 4e 61 6d 29 3c 30 20 29  emp(zTmpNam)<0 )
10010 7b 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74  {.      Malfunct
10020 69 6f 6e 28 32 38 30 2c 20 20 2f 2a 20 4c 4f 47  ion(280,  /* LOG
10030 3a 20 6d 6b 73 74 65 6d 70 28 29 20 66 61 69 6c  : mkstemp() fail
10040 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
10050 20 20 20 20 20 22 43 61 6e 6e 6f 74 20 63 72 65       "Cannot cre
10060 61 74 65 20 61 20 74 65 6d 70 20 66 69 6c 65 20  ate a temp file 
10070 69 6e 20 77 68 69 63 68 20 74 6f 20 73 74 6f 72  in which to stor
10080 65 20 50 4f 53 54 20 64 61 74 61 22 29 3b 0a 20  e POST data");. 
10090 20 20 20 7d 0a 20 20 20 20 6f 75 74 20 3d 20 66     }.    out = f
100a0 6f 70 65 6e 28 7a 54 6d 70 4e 61 6d 2c 22 77 62  open(zTmpNam,"wb
100b0 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 3d  ");.    if( out=
100c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 74 61 72  =0 ){.      Star
100d0 74 52 65 73 70 6f 6e 73 65 28 22 35 30 30 20 43  tResponse("500 C
100e0 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 2f 74 6d  annot create /tm
100f0 70 20 66 69 6c 65 22 29 3b 0a 20 20 20 20 20 20  p file");.      
10100 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a  nOut += printf(.
10110 20 20 20 20 20 20 20 20 22 43 6f 6e 74 65 6e 74          "Content
10120 2d 74 79 70 65 3a 20 74 65 78 74 2f 70 6c 61 69  -type: text/plai
10130 6e 5c 72 5c 6e 22 0a 20 20 20 20 20 20 20 20 22  n\r\n".        "
10140 5c 72 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 43  \r\n".        "C
10150 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20 5c 22  ould not open \"
10160 25 73 5c 22 20 66 6f 72 20 77 72 69 74 69 6e 67  %s\" for writing
10170 5c 6e 22 2c 20 7a 54 6d 70 4e 61 6d 0a 20 20 20  \n", zTmpNam.   
10180 20 20 20 29 3b 0a 20 20 20 20 20 20 4d 61 6b 65     );.      Make
10190 4c 6f 67 45 6e 74 72 79 28 30 2c 20 32 39 30 29  LogEntry(0, 290)
101a0 3b 20 2f 2a 20 4c 4f 47 3a 20 63 61 6e 6e 6f 74  ; /* LOG: cannot
101b0 20 63 72 65 61 74 65 20 74 65 6d 70 20 66 69 6c   create temp fil
101c0 65 20 66 6f 72 20 50 4f 53 54 20 2a 2f 0a 20 20  e for POST */.  
101d0 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20 20      exit(0);.   
101e0 20 7d 0a 20 20 20 20 7a 42 75 66 20 3d 20 53 61   }.    zBuf = Sa
101f0 66 65 4d 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31 20  feMalloc( len+1 
10200 29 3b 0a 20 20 20 20 69 66 28 20 75 73 65 54 69  );.    if( useTi
10210 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d 28 31 35  meout ) alarm(15
10220 20 2b 20 6c 65 6e 2f 32 30 30 30 29 3b 0a 20 20   + len/2000);.  
10230 20 20 6e 20 3d 20 66 72 65 61 64 28 7a 42 75 66    n = fread(zBuf
10240 2c 31 2c 6c 65 6e 2c 73 74 64 69 6e 29 3b 0a 20  ,1,len,stdin);. 
10250 20 20 20 6e 49 6e 20 2b 3d 20 6e 3b 0a 20 20 20     nIn += n;.   
10260 20 66 77 72 69 74 65 28 7a 42 75 66 2c 31 2c 6e   fwrite(zBuf,1,n
10270 2c 6f 75 74 29 3b 0a 20 20 20 20 66 72 65 65 28  ,out);.    free(
10280 7a 42 75 66 29 3b 0a 20 20 20 20 66 63 6c 6f 73  zBuf);.    fclos
10290 65 28 6f 75 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  e(out);.  }..  /
102a0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
102b0 72 75 6e 6e 69 6e 67 20 74 69 6d 65 20 69 73 20  running time is 
102c0 6e 6f 74 20 74 6f 6f 20 67 72 65 61 74 20 2a 2f  not too great */
102d0 0a 20 20 69 66 28 20 75 73 65 54 69 6d 65 6f 75  .  if( useTimeou
102e0 74 20 29 20 61 6c 61 72 6d 28 31 30 29 3b 0a 0a  t ) alarm(10);..
102f0 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 61 6c 6c    /* Convert all
10300 20 75 6e 75 73 75 61 6c 20 63 68 61 72 61 63 74   unusual charact
10310 65 72 73 20 69 6e 20 74 68 65 20 73 63 72 69 70  ers in the scrip
10320 74 20 6e 61 6d 65 20 69 6e 74 6f 20 22 5f 22 2e  t name into "_".
10330 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
10340 69 73 20 61 20 64 65 66 65 6e 73 65 20 61 67 61  is a defense aga
10350 69 6e 73 74 20 76 61 72 69 6f 75 73 20 61 74 74  inst various att
10360 61 63 6b 73 2c 20 58 53 53 20 61 74 74 61 63 6b  acks, XSS attack
10370 73 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 2e  s in particular.
10380 0a 20 20 2a 2f 0a 20 20 73 61 6e 69 74 69 7a 65  .  */.  sanitize
10390 53 74 72 69 6e 67 28 7a 53 63 72 69 70 74 29 3b  String(zScript);
103a0 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c  ..  /* Do not al
103b0 6c 6f 77 20 22 2f 2e 22 20 6f 72 20 22 2f 2d 22  low "/." or "/-"
103c0 20 74 6f 20 74 6f 20 6f 63 63 75 72 20 61 6e 79   to to occur any
103d0 77 68 65 72 65 20 69 6e 20 74 68 65 20 65 6e 74  where in the ent
103e0 69 74 79 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 54  ity name..  ** T
103f0 68 69 73 20 70 72 65 76 65 6e 74 73 20 61 74 74  his prevents att
10400 61 63 6b 73 20 69 6e 76 6f 6c 76 69 6e 67 20 22  acks involving "
10410 2e 2e 22 20 61 6e 64 20 61 6c 73 6f 20 61 6c 6c  .." and also all
10420 6f 77 73 20 75 73 20 74 6f 20 63 72 65 61 74 65  ows us to create
10430 0a 20 20 2a 2a 20 66 69 6c 65 73 20 61 6e 64 20  .  ** files and 
10440 64 69 72 65 63 74 6f 72 69 65 73 20 77 68 6f 73  directories whos
10450 65 20 6e 61 6d 65 73 20 62 65 67 69 6e 20 77 69  e names begin wi
10460 74 68 20 22 2d 22 20 6f 72 20 22 2e 22 20 77 68  th "-" or "." wh
10470 69 63 68 20 61 72 65 0a 20 20 2a 2a 20 69 6e 76  ich are.  ** inv
10480 69 73 69 62 6c 65 20 74 6f 20 74 68 65 20 77 65  isible to the we
10490 62 73 65 72 76 65 72 2e 0a 20 20 2a 2a 0a 20 20  bserver..  **.  
104a0 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 41  ** Exception:  A
104b0 6c 6c 6f 77 20 74 68 65 20 22 2f 2e 77 65 6c 6c  llow the "/.well
104c0 2d 6b 6e 6f 77 6e 2f 22 20 70 72 65 66 69 78 20  -known/" prefix 
104d0 69 6e 20 61 63 63 6f 72 64 61 6e 63 65 20 77 69  in accordance wi
104e0 74 68 0a 20 20 2a 2a 20 52 46 43 2d 35 37 38 35  th.  ** RFC-5785
104f0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 7a 3d 7a 53  .  */.  for(z=zS
10500 63 72 69 70 74 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b  cript; *z; z++){
10510 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2f 27  .    if( *z=='/'
10520 20 26 26 20 28 7a 5b 31 5d 3d 3d 27 2e 27 20 7c   && (z[1]=='.' |
10530 7c 20 7a 5b 31 5d 3d 3d 27 2d 27 29 0a 20 20 20  | z[1]=='-').   
10540 20 20 26 26 20 28 7a 3e 7a 53 63 72 69 70 74 20    && (z>zScript 
10550 7c 7c 20 73 74 72 6e 63 6d 70 28 7a 2c 22 2f 2e  || strncmp(z,"/.
10560 77 65 6c 6c 2d 6b 6e 6f 77 6e 2f 22 2c 31 33 29  well-known/",13)
10570 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0).    ){.    
10580 20 20 20 4e 6f 74 46 6f 75 6e 64 28 33 30 30 29     NotFound(300)
10590 3b 20 2f 2a 20 4c 4f 47 3a 20 50 61 74 68 20 65  ; /* LOG: Path e
105a0 6c 65 6d 65 6e 74 20 62 65 67 69 6e 73 20 77 69  lement begins wi
105b0 74 68 20 22 2e 22 20 6f 72 20 22 2d 22 20 2a 2f  th "." or "-" */
105c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
105d0 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 61 74   Figure out what
105e0 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
105f0 20 66 69 6c 65 73 79 73 74 65 6d 20 73 68 6f 75   filesystem shou
10600 6c 64 20 62 65 2e 20 20 49 66 20 74 68 65 0a 20  ld be.  If the. 
10610 20 2a 2a 20 48 54 54 50 5f 48 4f 53 54 20 70 61   ** HTTP_HOST pa
10620 72 61 6d 65 74 65 72 20 65 78 69 73 74 73 20 28  rameter exists (
10630 73 74 6f 72 65 64 20 69 6e 20 7a 48 74 74 70 48  stored in zHttpH
10640 6f 73 74 29 20 74 68 65 6e 20 72 65 6d 6f 76 65  ost) then remove
10650 20 74 68 65 0a 20 20 2a 2a 20 70 6f 72 74 20 6e   the.  ** port n
10660 75 6d 62 65 72 20 66 72 6f 6d 20 74 68 65 20 65  umber from the e
10670 6e 64 20 28 69 66 20 61 6e 79 29 2c 20 63 6f 6e  nd (if any), con
10680 76 65 72 74 20 61 6c 6c 20 63 68 61 72 61 63 74  vert all charact
10690 65 72 73 20 74 6f 20 6c 6f 77 65 72 0a 20 20 2a  ers to lower.  *
106a0 2a 20 63 61 73 65 2c 20 61 6e 64 20 63 6f 6e 76  * case, and conv
106b0 65 72 74 20 6e 6f 6e 2d 61 6c 70 68 61 6e 75 6d  ert non-alphanum
106c0 62 65 72 20 63 68 61 72 61 63 74 65 72 73 20 28  ber characters (
106d0 69 6e 63 6c 75 64 69 6e 67 20 22 2e 22 29 20 74  including ".") t
106e0 6f 20 22 5f 22 2e 0a 20 20 2a 2a 20 54 68 65 6e  o "_"..  ** Then
106f0 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 20 64   try to find a d
10700 69 72 65 63 74 6f 72 79 20 77 69 74 68 20 74 68  irectory with th
10710 61 74 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  at name and the 
10720 65 78 74 65 6e 73 69 6f 6e 20 2e 77 65 62 73 69  extension .websi
10730 74 65 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 74 20  te..  ** If not 
10740 66 6f 75 6e 64 2c 20 6c 6f 6f 6b 20 66 6f 72 20  found, look for 
10750 22 64 65 66 61 75 6c 74 2e 77 65 62 73 69 74 65  "default.website
10760 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 53  "..  */.  if( zS
10770 63 72 69 70 74 5b 30 5d 21 3d 27 2f 27 20 29 7b  cript[0]!='/' ){
10780 0a 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 33 31  .    NotFound(31
10790 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 55 52 49 20  0); /* LOG: URI 
107a0 64 6f 65 73 20 6e 6f 74 20 73 74 61 72 74 20 77  does not start w
107b0 69 74 68 20 22 2f 22 20 2a 2f 0a 20 20 7d 0a 20  ith "/" */.  }. 
107c0 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 52 6f 6f   if( strlen(zRoo
107d0 74 29 2b 34 30 20 3e 3d 20 73 69 7a 65 6f 66 28  t)+40 >= sizeof(
107e0 7a 4c 69 6e 65 29 20 29 7b 0a 20 20 20 20 4e 6f  zLine) ){.    No
107f0 74 46 6f 75 6e 64 28 33 32 30 29 3b 20 2f 2a 20  tFound(320); /* 
10800 4c 4f 47 3a 20 55 52 49 20 74 6f 6f 20 6c 6f 6e  LOG: URI too lon
10810 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 7a  g */.  }.  if( z
10820 48 74 74 70 48 6f 73 74 3d 3d 30 20 7c 7c 20 7a  HttpHost==0 || z
10830 48 74 74 70 48 6f 73 74 5b 30 5d 3d 3d 30 20 29  HttpHost[0]==0 )
10840 7b 0a 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 33  {.    NotFound(3
10850 33 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 4d 69  30);  /* LOG: Mi
10860 73 73 69 6e 67 20 48 4f 53 54 3a 20 70 61 72 61  ssing HOST: para
10870 6d 65 74 65 72 20 2a 2f 0a 20 20 7d 65 6c 73 65  meter */.  }else
10880 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 48 74 74   if( strlen(zHtt
10890 70 48 6f 73 74 29 2b 73 74 72 6c 65 6e 28 7a 52  pHost)+strlen(zR
108a0 6f 6f 74 29 2b 31 30 20 3e 3d 20 73 69 7a 65 6f  oot)+10 >= sizeo
108b0 66 28 7a 4c 69 6e 65 29 20 29 7b 0a 20 20 20 20  f(zLine) ){.    
108c0 4e 6f 74 46 6f 75 6e 64 28 33 34 30 29 3b 20 20  NotFound(340);  
108d0 2f 2a 20 4c 4f 47 3a 20 48 4f 53 54 20 70 61 72  /* LOG: HOST par
108e0 61 6d 65 74 65 72 20 74 6f 6f 20 6c 6f 6e 67 20  ameter too long 
108f0 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
10900 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22  sprintf(zLine, "
10910 25 73 2f 25 73 22 2c 20 7a 52 6f 6f 74 2c 20 7a  %s/%s", zRoot, z
10920 48 74 74 70 48 6f 73 74 29 3b 0a 20 20 20 20 66  HttpHost);.    f
10930 6f 72 28 69 3d 73 74 72 6c 65 6e 28 7a 52 6f 6f  or(i=strlen(zRoo
10940 74 29 2b 31 3b 20 7a 4c 69 6e 65 5b 69 5d 20 26  t)+1; zLine[i] &
10950 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d 27 3a 27 3b  & zLine[i]!=':';
10960 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 6e 73   i++){.      uns
10970 69 67 6e 65 64 20 63 68 61 72 20 63 20 3d 20 28  igned char c = (
10980 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 4c  unsigned char)zL
10990 69 6e 65 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  ine[i];.      if
109a0 28 20 21 69 73 61 6c 6e 75 6d 28 63 29 20 29 7b  ( !isalnum(c) ){
109b0 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 69  .        zLine[i
109c0 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 7d  ] = '_';.      }
109d0 65 6c 73 65 20 69 66 28 20 69 73 75 70 70 65 72  else if( isupper
109e0 28 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  (c) ){.        z
109f0 4c 69 6e 65 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65  Line[i] = tolowe
10a00 72 28 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  r(c);.      }.  
10a10 20 20 7d 0a 20 20 20 20 73 74 72 63 70 79 28 26    }.    strcpy(&
10a20 7a 4c 69 6e 65 5b 69 5d 2c 20 22 2e 77 65 62 73  zLine[i], ".webs
10a30 69 74 65 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ite");.  }.  if(
10a40 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61   stat(zLine,&sta
10a50 74 62 75 66 29 20 7c 7c 20 21 53 5f 49 53 44 49  tbuf) || !S_ISDI
10a60 52 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64  R(statbuf.st_mod
10a70 65 29 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74  e) ){.    sprint
10a80 66 28 7a 4c 69 6e 65 2c 20 22 25 73 2f 64 65 66  f(zLine, "%s/def
10a90 61 75 6c 74 2e 77 65 62 73 69 74 65 22 2c 20 7a  ault.website", z
10aa0 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 73  Root);.    if( s
10ab0 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62  tat(zLine,&statb
10ac0 75 66 29 20 7c 7c 20 21 53 5f 49 53 44 49 52 28  uf) || !S_ISDIR(
10ad0 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29  statbuf.st_mode)
10ae0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74   ){.      if( st
10af0 61 6e 64 61 6c 6f 6e 65 20 29 7b 0a 20 20 20 20  andalone ){.    
10b00 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e      sprintf(zLin
10b10 65 2c 20 22 25 73 22 2c 20 7a 52 6f 6f 74 29 3b  e, "%s", zRoot);
10b20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10b30 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 33        NotFound(3
10b40 35 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 2a 2e  50);  /* LOG: *.
10b50 77 65 62 73 69 74 65 20 70 65 72 6d 69 73 73 69  website permissi
10b60 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ons */.      }. 
10b70 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 48 6f 6d 65     }.  }.  zHome
10b80 20 3d 20 53 74 72 44 75 70 28 7a 4c 69 6e 65 29   = StrDup(zLine)
10b90 3b 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 64  ;..  /* Change d
10ba0 69 72 65 63 74 6f 72 69 65 73 20 74 6f 20 74 68  irectories to th
10bb0 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 48 54  e root of the HT
10bc0 54 50 20 66 69 6c 65 73 79 73 74 65 6d 0a 20 20  TP filesystem.  
10bd0 2a 2f 0a 20 20 69 66 28 20 63 68 64 69 72 28 7a  */.  if( chdir(z
10be0 48 6f 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Home)!=0 ){.    
10bf0 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b  char zBuf[1000];
10c00 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e  .    Malfunction
10c10 28 33 36 30 2c 20 20 2f 2a 20 4c 4f 47 3a 20 63  (360,  /* LOG: c
10c20 68 64 69 72 28 29 20 66 61 69 6c 65 64 20 2a 2f  hdir() failed */
10c30 0a 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f  .         "canno
10c40 74 20 63 68 64 69 72 20 74 6f 20 5b 25 73 5d 20  t chdir to [%s] 
10c50 66 72 6f 6d 20 5b 25 73 5d 22 2c 0a 20 20 20 20  from [%s]",.    
10c60 20 20 20 20 20 7a 48 6f 6d 65 2c 20 67 65 74 63       zHome, getc
10c70 77 64 28 7a 42 75 66 2c 39 39 39 29 29 3b 0a 20  wd(zBuf,999));. 
10c80 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
10c90 74 68 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  the file in the 
10ca0 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 57 65 20  filesystem.  We 
10cb0 6d 69 67 68 74 20 68 61 76 65 20 74 6f 20 61 70  might have to ap
10cc0 70 65 6e 64 0a 20 20 2a 2a 20 61 20 6e 61 6d 65  pend.  ** a name
10cd0 20 6c 69 6b 65 20 22 2f 68 6f 6d 65 22 20 6f 72   like "/home" or
10ce0 20 22 2f 69 6e 64 65 78 2e 68 74 6d 6c 22 20 6f   "/index.html" o
10cf0 72 20 22 2f 69 6e 64 65 78 2e 63 67 69 22 20 69  r "/index.cgi" i
10d00 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20 74 6f 20  n order.  ** to 
10d10 66 69 6e 64 20 69 74 2e 20 20 41 6e 79 20 65 78  find it.  Any ex
10d20 63 65 73 73 20 70 61 74 68 20 69 6e 66 6f 72 6d  cess path inform
10d30 61 74 69 6f 6e 20 69 73 20 70 75 74 20 69 6e 74  ation is put int
10d40 6f 20 74 68 65 0a 20 20 2a 2a 20 7a 50 61 74 68  o the.  ** zPath
10d50 49 6e 66 6f 20 76 61 72 69 61 62 6c 65 2e 0a 20  Info variable.. 
10d60 20 2a 2f 0a 20 20 6a 20 3d 20 6a 30 20 3d 20 28   */.  j = j0 = (
10d70 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4c 69 6e 65  int)strlen(zLine
10d80 29 3b 0a 20 20 69 20 3d 20 30 3b 0a 20 20 77 68  );.  i = 0;.  wh
10d90 69 6c 65 28 20 7a 53 63 72 69 70 74 5b 69 5d 20  ile( zScript[i] 
10da0 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 53  ){.    while( zS
10db0 63 72 69 70 74 5b 69 5d 20 26 26 20 28 69 3d 3d  cript[i] && (i==
10dc0 30 20 7c 7c 20 7a 53 63 72 69 70 74 5b 69 5d 21  0 || zScript[i]!
10dd0 3d 27 2f 27 29 20 29 7b 0a 20 20 20 20 20 20 7a  ='/') ){.      z
10de0 4c 69 6e 65 5b 6a 5d 20 3d 20 7a 53 63 72 69 70  Line[j] = zScrip
10df0 74 5b 69 5d 3b 0a 20 20 20 20 20 20 69 2b 2b 3b  t[i];.      i++;
10e00 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20   j++;.    }.    
10e10 7a 4c 69 6e 65 5b 6a 5d 20 3d 20 30 3b 0a 20 20  zLine[j] = 0;.  
10e20 20 20 69 66 28 20 73 74 61 74 28 7a 4c 69 6e 65    if( stat(zLine
10e30 2c 26 73 74 61 74 62 75 66 29 21 3d 30 20 29 7b  ,&statbuf)!=0 ){
10e40 0a 20 20 20 20 20 20 69 6e 74 20 73 74 69 6c 6c  .      int still
10e50 53 65 61 72 63 68 69 6e 67 20 3d 20 31 3b 0a 20  Searching = 1;. 
10e60 20 20 20 20 20 77 68 69 6c 65 28 20 73 74 69 6c       while( stil
10e70 6c 53 65 61 72 63 68 69 6e 67 20 26 26 20 69 3e  lSearching && i>
10e80 30 20 26 26 20 6a 3e 6a 30 20 29 7b 0a 20 20 20  0 && j>j0 ){.   
10e90 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 6a 30       while( j>j0
10ea0 20 26 26 20 7a 4c 69 6e 65 5b 6a 2d 31 5d 21 3d   && zLine[j-1]!=
10eb0 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20  '/' ){ j--; }.  
10ec0 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a 4c        strcpy(&zL
10ed0 69 6e 65 5b 6a 2d 31 5d 2c 20 22 2f 6e 6f 74 2d  ine[j-1], "/not-
10ee0 66 6f 75 6e 64 2e 68 74 6d 6c 22 29 3b 0a 20 20  found.html");.  
10ef0 20 20 20 20 20 20 69 66 28 20 73 74 61 74 28 7a        if( stat(z
10f00 4c 69 6e 65 2c 26 73 74 61 74 62 75 66 29 3d 3d  Line,&statbuf)==
10f10 30 20 26 26 20 53 5f 49 53 52 45 47 28 73 74 61  0 && S_ISREG(sta
10f20 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29 0a 20 20  tbuf.st_mode).  
10f30 20 20 20 20 20 20 20 20 20 20 26 26 20 61 63 63            && acc
10f40 65 73 73 28 7a 4c 69 6e 65 2c 52 5f 4f 4b 29 3d  ess(zLine,R_OK)=
10f50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
10f60 7a 52 65 61 6c 53 63 72 69 70 74 20 3d 20 53 74  zRealScript = St
10f70 72 44 75 70 28 26 7a 4c 69 6e 65 5b 6a 30 5d 29  rDup(&zLine[j0])
10f80 3b 0a 20 20 20 20 20 20 20 20 20 20 52 65 64 69  ;.          Redi
10f90 72 65 63 74 28 7a 52 65 61 6c 53 63 72 69 70 74  rect(zRealScript
10fa0 2c 20 31 2c 20 33 37 30 29 3b 20 2f 2a 20 4c 4f  , 1, 370); /* LO
10fb0 47 3a 20 72 65 64 69 72 65 63 74 20 74 6f 20 6e  G: redirect to n
10fc0 6f 74 2d 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  ot-found */.    
10fd0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
10fe0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10ff0 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20         j--;.    
11000 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11010 20 20 20 20 69 66 28 20 73 74 69 6c 6c 53 65 61      if( stillSea
11020 72 63 68 69 6e 67 20 29 20 4e 6f 74 46 6f 75 6e  rching ) NotFoun
11030 64 28 33 38 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20  d(380); /* LOG: 
11040 55 52 49 20 6e 6f 74 20 66 6f 75 6e 64 20 2a 2f  URI not found */
11050 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11060 20 20 7d 0a 20 20 20 20 69 66 28 20 53 5f 49 53    }.    if( S_IS
11070 52 45 47 28 73 74 61 74 62 75 66 2e 73 74 5f 6d  REG(statbuf.st_m
11080 6f 64 65 29 20 29 7b 0a 20 20 20 20 20 20 69 66  ode) ){.      if
11090 28 20 61 63 63 65 73 73 28 7a 4c 69 6e 65 2c 52  ( access(zLine,R
110a0 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20  _OK) ){.        
110b0 4e 6f 74 46 6f 75 6e 64 28 33 39 30 29 3b 20 20  NotFound(390);  
110c0 2f 2a 20 4c 4f 47 3a 20 46 69 6c 65 20 6e 6f 74  /* LOG: File not
110d0 20 72 65 61 64 61 62 6c 65 20 2a 2f 0a 20 20 20   readable */.   
110e0 20 20 20 7d 0a 20 20 20 20 20 20 7a 52 65 61 6c     }.      zReal
110f0 53 63 72 69 70 74 20 3d 20 53 74 72 44 75 70 28  Script = StrDup(
11100 26 7a 4c 69 6e 65 5b 6a 30 5d 29 3b 0a 20 20 20  &zLine[j0]);.   
11110 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11120 20 20 20 20 69 66 28 20 7a 53 63 72 69 70 74 5b      if( zScript[
11130 69 5d 3d 3d 30 20 7c 7c 20 7a 53 63 72 69 70 74  i]==0 || zScript
11140 5b 69 2b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  [i+1]==0 ){.    
11150 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
11160 68 61 72 20 2a 61 7a 49 6e 64 65 78 5b 5d 20 3d  har *azIndex[] =
11170 20 7b 20 22 2f 68 6f 6d 65 22 2c 20 22 2f 69 6e   { "/home", "/in
11180 64 65 78 2e 68 74 6d 6c 22 2c 20 22 69 6e 64 65  dex.html", "inde
11190 78 2e 63 67 69 22 20 7d 3b 0a 20 20 20 20 20 20  x.cgi" };.      
111a0 69 6e 74 20 6b 20 3d 20 6a 3e 30 20 26 26 20 7a  int k = j>0 && z
111b0 4c 69 6e 65 5b 6a 2d 31 5d 3d 3d 27 2f 27 20 3f  Line[j-1]=='/' ?
111c0 20 6a 2d 31 20 3a 20 6a 3b 0a 20 20 20 20 20 20   j-1 : j;.      
111d0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6a 6a 3b  unsigned int jj;
111e0 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b  .      for(jj=0;
111f0 20 6a 6a 3c 73 69 7a 65 6f 66 28 61 7a 49 6e 64   jj<sizeof(azInd
11200 65 78 29 2f 73 69 7a 65 6f 66 28 61 7a 49 6e 64  ex)/sizeof(azInd
11210 65 78 5b 30 5d 29 3b 20 6a 6a 2b 2b 29 7b 0a 20  ex[0]); jj++){. 
11220 20 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a         strcpy(&z
11230 4c 69 6e 65 5b 6b 5d 2c 61 7a 49 6e 64 65 78 5b  Line[k],azIndex[
11240 6a 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  jj]);.        if
11250 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74  ( stat(zLine,&st
11260 61 74 62 75 66 29 21 3d 30 20 29 20 63 6f 6e 74  atbuf)!=0 ) cont
11270 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
11280 28 20 21 53 5f 49 53 52 45 47 28 73 74 61 74 62  ( !S_ISREG(statb
11290 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f  uf.st_mode) ) co
112a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
112b0 69 66 28 20 61 63 63 65 73 73 28 7a 4c 69 6e 65  if( access(zLine
112c0 2c 52 5f 4f 4b 29 20 29 20 63 6f 6e 74 69 6e 75  ,R_OK) ) continu
112d0 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
112e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
112f0 69 66 28 20 6a 6a 3e 3d 73 69 7a 65 6f 66 28 61  if( jj>=sizeof(a
11300 7a 49 6e 64 65 78 29 2f 73 69 7a 65 6f 66 28 61  zIndex)/sizeof(a
11310 7a 49 6e 64 65 78 5b 30 5d 29 20 29 7b 0a 20 20  zIndex[0]) ){.  
11320 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 34        NotFound(4
11330 30 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 55 52 49  00); /* LOG: URI
11340 20 69 73 20 61 20 64 69 72 65 63 74 6f 72 79 20   is a directory 
11350 77 2f 6f 20 69 6e 64 65 78 2e 68 74 6d 6c 20 2a  w/o index.html *
11360 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
11370 7a 52 65 61 6c 53 63 72 69 70 74 20 3d 20 53 74  zRealScript = St
11380 72 44 75 70 28 26 7a 4c 69 6e 65 5b 6a 30 5d 29  rDup(&zLine[j0])
11390 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 53 63 72  ;.      if( zScr
113a0 69 70 74 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20  ipt[i]==0 ){.   
113b0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72       /* If the r
113c0 65 71 75 65 73 74 65 64 20 55 52 4c 20 64 6f 65  equested URL doe
113d0 73 20 6e 6f 74 20 65 6e 64 20 77 69 74 68 20 22  s not end with "
113e0 2f 22 20 62 75 74 20 77 65 20 68 61 64 20 74 6f  /" but we had to
113f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 65  .        ** appe
11400 6e 64 20 22 69 6e 64 65 78 2e 68 74 6d 6c 22 2c  nd "index.html",
11410 20 74 68 65 6e 20 61 20 72 65 64 69 72 65 63 74   then a redirect
11420 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20   is necessary.  
11430 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 20 20  Otherwise.      
11440 20 20 2a 2a 20 6e 6f 6e 65 20 6f 66 20 74 68 65    ** none of the
11450 20 72 65 6c 61 74 69 76 65 20 55 52 4c 73 20 69   relative URLs i
11460 6e 20 74 68 65 20 64 65 6c 69 76 65 72 65 64 20  n the delivered 
11470 64 6f 63 75 6d 65 6e 74 20 77 69 6c 6c 20 62 65  document will be
11480 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  .        ** corr
11490 65 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ect. */.        
114a0 52 65 64 69 72 65 63 74 28 7a 52 65 61 6c 53 63  Redirect(zRealSc
114b0 72 69 70 74 2c 31 2c 34 31 30 29 3b 20 2f 2a 20  ript,1,410); /* 
114c0 4c 4f 47 3a 20 72 65 64 69 72 65 63 74 20 74 6f  LOG: redirect to
114d0 20 61 64 64 20 74 72 61 69 6c 69 6e 67 20 2f 20   add trailing / 
114e0 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
114f0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
11500 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
11510 20 20 7a 4c 69 6e 65 5b 6a 5d 20 3d 20 7a 53 63    zLine[j] = zSc
11520 72 69 70 74 5b 69 5d 3b 0a 20 20 20 20 69 2b 2b  ript[i];.    i++
11530 3b 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 7a 46 69  ; j++;.  }.  zFi
11540 6c 65 20 3d 20 53 74 72 44 75 70 28 7a 4c 69 6e  le = StrDup(zLin
11550 65 29 3b 0a 20 20 7a 50 61 74 68 49 6e 66 6f 20  e);.  zPathInfo 
11560 3d 20 53 74 72 44 75 70 28 26 7a 53 63 72 69 70  = StrDup(&zScrip
11570 74 5b 69 5d 29 3b 0a 20 20 6c 65 6e 46 69 6c 65  t[i]);.  lenFile
11580 20 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29   = strlen(zFile)
11590 3b 0a 20 20 7a 44 69 72 20 3d 20 53 74 72 44 75  ;.  zDir = StrDu
115a0 70 28 7a 46 69 6c 65 29 3b 0a 20 20 66 6f 72 28  p(zFile);.  for(
115b0 69 3d 73 74 72 6c 65 6e 28 7a 44 69 72 29 2d 31  i=strlen(zDir)-1
115c0 3b 20 69 3e 30 20 26 26 20 7a 44 69 72 5b 69 5d  ; i>0 && zDir[i]
115d0 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 3b 0a 20  !='/'; i--){};. 
115e0 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20   if( i==0 ){.   
115f0 20 20 73 74 72 63 70 79 28 7a 44 69 72 2c 22 2f    strcpy(zDir,"/
11600 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
11610 20 20 7a 44 69 72 5b 69 5d 20 3d 20 30 3b 0a 20    zDir[i] = 0;. 
11620 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   }..  /* Check t
11630 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 69  o see if there i
11640 73 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  s an authorizati
11650 6f 6e 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  on file.  If the
11660 72 65 20 69 73 2c 0a 20 20 2a 2a 20 70 72 6f 63  re is,.  ** proc
11670 65 73 73 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73  ess it..  */.  s
11680 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 25  printf(zLine, "%
11690 73 2f 2d 61 75 74 68 22 2c 20 7a 44 69 72 29 3b  s/-auth", zDir);
116a0 0a 20 20 69 66 28 20 61 63 63 65 73 73 28 7a 4c  .  if( access(zL
116b0 69 6e 65 2c 52 5f 4f 4b 29 3d 3d 30 20 26 26 20  ine,R_OK)==0 && 
116c0 21 43 68 65 63 6b 42 61 73 69 63 41 75 74 68 6f  !CheckBasicAutho
116d0 72 69 7a 61 74 69 6f 6e 28 7a 4c 69 6e 65 29 20  rization(zLine) 
116e0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
116f0 54 61 6b 65 20 61 70 70 72 6f 70 72 69 61 74 65  Take appropriate
11700 20 61 63 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69   action.  */.  i
11710 66 28 20 28 73 74 61 74 62 75 66 2e 73 74 5f 6d  f( (statbuf.st_m
11720 6f 64 65 20 26 20 30 31 30 30 29 3d 3d 30 31 30  ode & 0100)==010
11730 30 20 26 26 20 61 63 63 65 73 73 28 7a 46 69 6c  0 && access(zFil
11740 65 2c 58 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20  e,X_OK)==0 ){.  
11750 20 20 63 68 61 72 20 2a 7a 42 61 73 65 46 69 6c    char *zBaseFil
11760 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f  ename;         /
11770 2a 20 46 69 6c 65 6e 61 6d 65 20 77 69 74 68 6f  * Filename witho
11780 75 74 20 64 69 72 65 63 74 6f 72 79 20 70 72 65  ut directory pre
11790 66 69 78 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20  fix */..    /*. 
117a0 20 20 20 2a 2a 20 41 62 6f 72 74 20 77 69 74 68     ** Abort with
117b0 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65   an error if the
117c0 20 43 47 49 20 73 63 72 69 70 74 20 69 73 20 77   CGI script is w
117d0 72 69 74 61 62 6c 65 20 62 79 20 61 6e 79 6f 6e  ritable by anyon
117e0 65 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74  e other.    ** t
117f0 68 61 6e 20 69 74 73 20 6f 77 6e 65 72 2e 0a 20  han its owner.. 
11800 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74     */.    if( st
11810 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 20 26 20  atbuf.st_mode & 
11820 30 30 32 32 20 29 7b 0a 20 20 20 20 20 20 43 67  0022 ){.      Cg
11830 69 53 63 72 69 70 74 57 72 69 74 61 62 6c 65 28  iScriptWritable(
11840 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
11850 20 49 66 20 69 74 73 20 65 78 65 63 75 74 61 62   If its executab
11860 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 61  le, it must be a
11870 20 43 47 49 20 70 72 6f 67 72 61 6d 2e 20 20 53   CGI program.  S
11880 74 61 72 74 20 62 79 0a 20 20 20 20 2a 2a 20 63  tart by.    ** c
11890 68 61 6e 67 69 6e 67 20 64 69 72 65 63 74 6f 72  hanging director
118a0 69 65 73 20 74 6f 20 74 68 65 20 64 69 72 65 63  ies to the direc
118b0 74 6f 72 79 20 68 6f 6c 64 69 6e 67 20 74 68 65  tory holding the
118c0 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20 2a 2f   program..    */
118d0 0a 20 20 20 20 69 66 28 20 63 68 64 69 72 28 7a  .    if( chdir(z
118e0 44 69 72 29 20 29 7b 0a 20 20 20 20 20 20 63 68  Dir) ){.      ch
118f0 61 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20  ar zBuf[1000];. 
11900 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e       Malfunction
11910 28 34 32 30 2c 20 2f 2a 20 4c 4f 47 3a 20 63 68  (420, /* LOG: ch
11920 64 69 72 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a  dir() failed */.
11930 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e             "cann
11940 6f 74 20 63 68 64 69 72 20 74 6f 20 5b 25 73 5d  ot chdir to [%s]
11950 20 66 72 6f 6d 20 5b 25 73 5d 22 2c 20 0a 20 20   from [%s]", .  
11960 20 20 20 20 20 20 20 20 20 7a 44 69 72 2c 20 67           zDir, g
11970 65 74 63 77 64 28 7a 42 75 66 2c 39 39 39 29 29  etcwd(zBuf,999))
11980 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11990 43 6f 6d 70 75 74 65 20 74 68 65 20 62 61 73 65  Compute the base
119a0 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65   filename of the
119b0 20 43 47 49 20 73 63 72 69 70 74 20 2a 2f 0a 20   CGI script */. 
119c0 20 20 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28     for(i=strlen(
119d0 7a 46 69 6c 65 29 2d 31 3b 20 69 3e 3d 30 20 26  zFile)-1; i>=0 &
119e0 26 20 7a 46 69 6c 65 5b 69 5d 21 3d 27 2f 27 3b  & zFile[i]!='/';
119f0 20 69 2d 2d 29 7b 7d 0a 20 20 20 20 7a 42 61 73   i--){}.    zBas
11a00 65 46 69 6c 65 6e 61 6d 65 20 3d 20 26 7a 46 69  eFilename = &zFi
11a10 6c 65 5b 69 2b 31 5d 3b 0a 0a 20 20 20 20 2f 2a  le[i+1];..    /*
11a20 20 53 65 74 75 70 20 74 68 65 20 65 6e 76 69 72   Setup the envir
11a30 6f 6e 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61  onment appropria
11a40 74 65 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tely..    */.   
11a50 20 70 75 74 65 6e 76 28 22 47 41 54 45 57 41 59   putenv("GATEWAY
11a60 5f 49 4e 54 45 52 46 41 43 45 3d 43 47 49 2f 31  _INTERFACE=CGI/1
11a70 2e 30 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  .0");.    for(i=
11a80 30 3b 20 69 3c 28 69 6e 74 29 28 73 69 7a 65 6f  0; i<(int)(sizeo
11a90 66 28 63 67 69 65 6e 76 29 2f 73 69 7a 65 6f 66  f(cgienv)/sizeof
11aa0 28 63 67 69 65 6e 76 5b 30 5d 29 29 3b 20 69 2b  (cgienv[0])); i+
11ab0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 2a 63  +){.      if( *c
11ac0 67 69 65 6e 76 5b 69 5d 2e 70 7a 45 6e 76 56 61  gienv[i].pzEnvVa
11ad0 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 53  lue ){.        S
11ae0 65 74 45 6e 76 28 63 67 69 65 6e 76 5b 69 5d 2e  etEnv(cgienv[i].
11af0 7a 45 6e 76 4e 61 6d 65 2c 2a 63 67 69 65 6e 76  zEnvName,*cgienv
11b00 5b 69 5d 2e 70 7a 45 6e 76 56 61 6c 75 65 29 3b  [i].pzEnvValue);
11b10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11b20 20 20 20 69 66 28 20 75 73 65 48 74 74 70 73 20     if( useHttps 
11b30 29 7b 0a 20 20 20 20 20 20 70 75 74 65 6e 76 28  ){.      putenv(
11b40 22 48 54 54 50 53 3d 6f 6e 22 29 3b 0a 20 20 20  "HTTPS=on");.   
11b50 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 74   }..    /* For t
11b60 68 65 20 50 4f 53 54 20 6d 65 74 68 6f 64 20 61  he POST method a
11b70 6c 6c 20 69 6e 70 75 74 20 68 61 73 20 62 65 65  ll input has bee
11b80 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 74  n written to a t
11b90 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20  emporary file,. 
11ba0 20 20 20 2a 2a 20 73 6f 20 77 65 20 68 61 76 65     ** so we have
11bb0 20 74 6f 20 72 65 64 69 72 65 63 74 20 69 6e 70   to redirect inp
11bc0 75 74 20 74 6f 20 74 68 65 20 43 47 49 20 73 63  ut to the CGI sc
11bd0 72 69 70 74 20 66 72 6f 6d 20 74 68 61 74 20 66  ript from that f
11be0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
11bf0 69 66 28 20 7a 4d 65 74 68 6f 64 5b 30 5d 3d 3d  if( zMethod[0]==
11c00 27 50 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28  'P' ){.      if(
11c10 20 64 75 70 28 30 29 3c 30 20 29 7b 0a 20 20 20   dup(0)<0 ){.   
11c20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e       Malfunction
11c30 28 34 33 30 2c 20 20 2f 2a 20 4c 4f 47 3a 20 64  (430,  /* LOG: d
11c40 75 70 28 30 29 20 66 61 69 6c 65 64 20 2a 2f 0a  up(0) failed */.
11c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c60 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f 20 64      "Unable to d
11c70 75 70 6c 69 63 61 74 69 6f 6e 20 66 69 6c 65 20  uplication file 
11c80 64 65 73 63 72 69 70 74 6f 72 20 30 22 29 3b 0a  descriptor 0");.
11c90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c        }.      cl
11ca0 6f 73 65 28 30 29 3b 0a 20 20 20 20 20 20 6f 70  ose(0);.      op
11cb0 65 6e 28 7a 54 6d 70 4e 61 6d 2c 20 4f 5f 52 44  en(zTmpNam, O_RD
11cc0 4f 4e 4c 59 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ONLY);.    }..  
11cd0 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 42    if( strncmp(zB
11ce0 61 73 65 46 69 6c 65 6e 61 6d 65 2c 22 6e 70 68  aseFilename,"nph
11cf0 2d 22 2c 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20  -",4)==0 ){.    
11d00 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 61 6d 65    /* If the name
11d10 20 6f 66 20 74 68 65 20 43 47 49 20 73 63 72 69   of the CGI scri
11d20 70 74 20 62 65 67 69 6e 73 20 77 69 74 68 20 22  pt begins with "
11d30 6e 70 68 2d 22 20 74 68 65 6e 20 77 65 20 61 72  nph-" then we ar
11d40 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 61 6c 69  e.      ** deali
11d50 6e 67 20 77 69 74 68 20 61 20 22 6e 6f 6e 2d 70  ng with a "non-p
11d60 61 72 73 65 64 20 68 65 61 64 65 72 73 22 20 43  arsed headers" C
11d70 47 49 20 73 63 72 69 70 74 2e 20 20 4a 75 73 74  GI script.  Just
11d80 20 65 78 65 63 28 29 0a 20 20 20 20 20 20 2a 2a   exec().      **
11d90 20 69 74 20 64 69 72 65 63 74 6c 79 20 61 6e 64   it directly and
11da0 20 6c 65 74 20 69 74 20 68 61 6e 64 6c 65 20 61   let it handle a
11db0 6c 6c 20 69 74 73 20 6f 77 6e 20 68 65 61 64 65  ll its own heade
11dc0 72 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a 20 20  r generation..  
11dd0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 65 78 65      */.      exe
11de0 63 6c 28 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65  cl(zBaseFilename
11df0 2c 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c 28  ,zBaseFilename,(
11e00 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
11e10 2f 2a 20 4e 4f 54 45 3a 20 4e 6f 20 6c 6f 67 20  /* NOTE: No log 
11e20 65 6e 74 72 79 20 77 72 69 74 74 65 6e 20 66 6f  entry written fo
11e30 72 20 6e 70 68 2d 20 73 63 72 69 70 74 73 20 2a  r nph- scripts *
11e40 2f 0a 20 20 20 20 20 20 65 78 69 74 28 30 29 3b  /.      exit(0);
11e50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46  .    }..    /* F
11e60 61 6c 6c 20 74 68 72 75 20 74 6f 20 68 65 72 65  all thru to here
11e70 20 6f 6e 6c 79 20 69 66 20 74 68 69 73 20 70 72   only if this pr
11e80 6f 63 65 73 73 20 28 74 68 65 20 73 65 72 76 65  ocess (the serve
11e90 72 29 20 69 73 20 67 6f 69 6e 67 0a 20 20 20 20  r) is going.    
11ea0 2a 2a 20 74 6f 20 72 65 61 64 20 61 6e 64 20 61  ** to read and a
11eb0 75 67 6d 65 6e 74 20 74 68 65 20 68 65 61 64 65  ugment the heade
11ec0 72 20 73 65 6e 74 20 62 61 63 6b 20 62 79 20 74  r sent back by t
11ed0 68 65 20 43 47 49 20 70 72 6f 63 65 73 73 2e 0a  he CGI process..
11ee0 20 20 20 20 2a 2a 20 4f 70 65 6e 20 61 20 70 69      ** Open a pi
11ef0 70 65 20 74 6f 20 72 65 63 65 69 76 65 20 74 68  pe to receive th
11f00 65 20 6f 75 74 70 75 74 20 66 72 6f 6d 20 74 68  e output from th
11f10 65 20 43 47 49 20 70 72 6f 63 65 73 73 2e 20 20  e CGI process.  
11f20 54 68 65 6e 0a 20 20 20 20 2a 2a 20 66 6f 72 6b  Then.    ** fork
11f30 20 74 68 65 20 43 47 49 20 70 72 6f 63 65 73 73   the CGI process
11f40 2e 20 20 4f 6e 63 65 20 65 76 65 72 79 74 68 69  .  Once everythi
11f50 6e 67 20 69 73 20 64 6f 6e 65 2c 20 77 65 20 73  ng is done, we s
11f60 68 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20  hould be.    ** 
11f70 61 62 6c 65 20 74 6f 20 72 65 61 64 20 74 68 65  able to read the
11f80 20 6f 75 74 70 75 74 20 6f 66 20 43 47 49 20 6f   output of CGI o
11f90 6e 20 74 68 65 20 22 69 6e 22 20 73 74 72 65 61  n the "in" strea
11fa0 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7b 0a  m..    */.    {.
11fb0 20 20 20 20 20 20 69 6e 74 20 70 78 5b 32 5d 3b        int px[2];
11fc0 0a 20 20 20 20 20 20 69 66 28 20 70 69 70 65 28  .      if( pipe(
11fd0 70 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 4d  px) ){.        M
11fe0 61 6c 66 75 6e 63 74 69 6f 6e 28 34 34 30 2c 20  alfunction(440, 
11ff0 2f 2a 20 4c 4f 47 3a 20 70 69 70 65 28 29 20 66  /* LOG: pipe() f
12000 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  ailed */.       
12010 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55 6e               "Un
12020 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61  able to create a
12030 20 70 69 70 65 20 66 6f 72 20 74 68 65 20 43 47   pipe for the CG
12040 49 20 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20  I program");.   
12050 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 66     }.      if( f
12060 6f 72 6b 28 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ork()==0 ){.    
12070 20 20 20 20 63 6c 6f 73 65 28 70 78 5b 30 5d 29      close(px[0])
12080 3b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28  ;.        close(
12090 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
120a0 64 75 70 28 70 78 5b 31 5d 29 21 3d 31 20 29 7b  dup(px[1])!=1 ){
120b0 0a 20 20 20 20 20 20 20 20 20 20 4d 61 6c 66 75  .          Malfu
120c0 6e 63 74 69 6f 6e 28 34 35 30 2c 20 2f 2a 20 4c  nction(450, /* L
120d0 4f 47 3a 20 64 75 70 28 31 29 20 66 61 69 6c 65  OG: dup(1) faile
120e0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  d */.           
120f0 20 20 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f        "Unable to
12100 20 64 75 70 6c 69 63 61 74 65 20 66 69 6c 65 20   duplicate file 
12110 64 65 73 63 72 69 70 74 6f 72 20 25 64 20 74 6f  descriptor %d to
12120 20 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20   1",.           
12130 20 20 20 20 20 20 70 78 5b 31 5d 29 3b 0a 20 20        px[1]);.  
12140 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12150 63 6c 6f 73 65 28 70 78 5b 31 5d 29 3b 0a 20 20  close(px[1]);.  
12160 20 20 20 20 20 20 66 6f 72 28 69 3d 33 3b 20 63        for(i=3; c
12170 6c 6f 73 65 28 69 29 3d 3d 30 3b 20 69 2b 2b 29  lose(i)==0; i++)
12180 7b 7d 0a 20 20 20 20 20 20 20 20 65 78 65 63 6c  {}.        execl
12190 28 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c 20  (zBaseFilename, 
121a0 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c 20 28  zBaseFilename, (
121b0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
121c0 20 20 65 78 69 74 28 30 29 3b 0a 20 20 20 20 20    exit(0);.     
121d0 20 7d 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 70   }.      close(p
121e0 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 6e 20  x[1]);.      in 
121f0 3d 20 66 64 6f 70 65 6e 28 70 78 5b 30 5d 2c 20  = fdopen(px[0], 
12200 22 72 62 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  "rb");.    }.   
12210 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20   if( in==0 ){.  
12220 20 20 20 20 43 67 69 45 72 72 6f 72 28 29 3b 0a      CgiError();.
12230 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12240 20 43 67 69 48 61 6e 64 6c 65 52 65 70 6c 79 28   CgiHandleReply(
12250 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  in);.    }.  }el
12260 73 65 20 69 66 28 20 6c 65 6e 46 69 6c 65 3e 35  se if( lenFile>5
12270 20 26 26 20 73 74 72 63 6d 70 28 26 7a 46 69 6c   && strcmp(&zFil
12280 65 5b 6c 65 6e 46 69 6c 65 2d 35 5d 2c 22 2e 73  e[lenFile-5],".s
12290 63 67 69 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  cgi")==0 ){.    
122a0 2f 2a 20 41 6e 79 20 66 69 6c 65 20 74 68 61 74  /* Any file that
122b0 20 65 6e 64 73 20 77 69 74 68 20 22 2e 73 63 67   ends with ".scg
122c0 69 22 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  i" is assumed to
122d0 20 62 65 20 74 65 78 74 20 6f 66 20 74 68 65 0a   be text of the.
122e0 20 20 20 20 2a 2a 20 66 6f 72 6d 3a 0a 20 20 20      ** form:.   
122f0 20 2a 2a 20 20 20 20 20 53 43 47 49 20 68 6f 73   **     SCGI hos
12300 74 6e 61 6d 65 20 70 6f 72 74 0a 20 20 20 20 2a  tname port.    *
12310 2a 20 4f 70 65 6e 20 61 20 54 43 50 2f 49 50 20  * Open a TCP/IP 
12320 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68  connection to th
12330 61 74 20 68 6f 73 74 20 61 6e 64 20 73 65 6e 64  at host and send
12340 20 69 74 20 61 6e 20 53 43 47 49 20 72 65 71 75   it an SCGI requ
12350 65 73 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 53  est.    */.    S
12360 65 6e 64 53 63 67 69 52 65 71 75 65 73 74 28 7a  endScgiRequest(z
12370 46 69 6c 65 2c 20 7a 53 63 72 69 70 74 29 3b 0a  File, zScript);.
12380 20 20 7d 65 6c 73 65 20 69 66 28 20 63 6f 75 6e    }else if( coun
12390 74 53 6c 61 73 68 65 73 28 7a 52 65 61 6c 53 63  tSlashes(zRealSc
123a0 72 69 70 74 29 21 3d 63 6f 75 6e 74 53 6c 61 73  ript)!=countSlas
123b0 68 65 73 28 7a 53 63 72 69 70 74 29 20 29 7b 0a  hes(zScript) ){.
123c0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65      /* If the re
123d0 71 75 65 73 74 20 55 52 49 20 66 6f 72 20 73 74  quest URI for st
123e0 61 74 69 63 20 63 6f 6e 74 65 6e 74 20 63 6f 6e  atic content con
123f0 74 61 69 6e 73 20 6d 61 74 65 72 69 61 6c 20 70  tains material p
12400 61 73 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 61  ast the.    ** a
12410 63 74 75 61 6c 20 63 6f 6e 74 65 6e 74 20 66 69  ctual content fi
12420 6c 65 20 6e 61 6d 65 2c 20 72 65 70 6f 72 74 20  le name, report 
12430 74 68 61 74 20 61 73 20 61 20 34 30 34 20 65 72  that as a 404 er
12440 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 4e 6f 74 46  ror. */.    NotF
12450 6f 75 6e 64 28 34 36 30 29 3b 20 2f 2a 20 4c 4f  ound(460); /* LO
12460 47 3a 20 45 78 63 65 73 73 20 55 52 49 20 63 6f  G: Excess URI co
12470 6e 74 65 6e 74 20 70 61 73 74 20 73 74 61 74 69  ntent past stati
12480 63 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20  c file name */. 
12490 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
124a0 66 20 69 74 20 69 73 6e 27 74 20 65 78 65 63 75  f it isn't execu
124b0 74 61 62 6c 65 20 74 68 65 6e 20 69 74 0a 20 20  table then it.  
124c0 20 20 2a 2a 20 6d 75 73 74 20 61 20 73 69 6d 70    ** must a simp
124d0 6c 65 20 66 69 6c 65 20 74 68 61 74 20 6e 65 65  le file that nee
124e0 64 73 20 74 6f 20 62 65 20 63 6f 70 69 65 64 20  ds to be copied 
124f0 74 6f 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 2a  to output..    *
12500 2f 0a 20 20 20 20 69 66 28 20 53 65 6e 64 46 69  /.    if( SendFi
12510 6c 65 28 7a 46 69 6c 65 2c 20 6c 65 6e 46 69 6c  le(zFile, lenFil
12520 65 2c 20 26 73 74 61 74 62 75 66 29 20 29 20 72  e, &statbuf) ) r
12530 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 66 6c  eturn;.  }.  ffl
12540 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 4d  ush(stdout);.  M
12550 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 30  akeLogEntry(0, 0
12560 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 4e 6f 72 6d  );  /* LOG: Norm
12570 61 6c 20 72 65 70 6c 79 20 2a 2f 0a 0a 20 20 2f  al reply */..  /
12580 2a 20 54 68 65 20 6e 65 78 74 20 72 65 71 75 65  * The next reque
12590 73 74 20 6d 75 73 74 20 61 72 72 69 76 65 20 77  st must arrive w
125a0 69 74 68 69 6e 20 33 30 20 73 65 63 6f 6e 64 73  ithin 30 seconds
125b0 20 6f 72 20 77 65 20 63 6c 6f 73 65 20 74 68 65   or we close the
125c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 2a 2f   connection.  */
125d0 0a 20 20 6f 6d 69 74 4c 6f 67 20 3d 20 31 3b 0a  .  omitLog = 1;.
125e0 20 20 69 66 28 20 75 73 65 54 69 6d 65 6f 75 74    if( useTimeout
125f0 20 29 20 61 6c 61 72 6d 28 33 30 29 3b 0a 7d 0a   ) alarm(30);.}.
12600 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 52  .#define MAX_PAR
12610 41 4c 4c 45 4c 20 35 30 20 20 2f 2a 20 4e 75 6d  ALLEL 50  /* Num
12620 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65  ber of simultane
12630 6f 75 73 20 63 68 69 6c 64 72 65 6e 20 2a 2f 0a  ous children */.
12640 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 70 6f 73 73 69  ./*.** All possi
12650 62 6c 65 20 66 6f 72 6d 73 20 6f 66 20 61 6e 20  ble forms of an 
12660 49 50 20 61 64 64 72 65 73 73 2e 20 20 4e 65 65  IP address.  Nee
12670 64 65 64 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75  ded to work arou
12680 6e 64 20 47 43 43 20 73 74 72 69 63 74 0a 2a 2a  nd GCC strict.**
12690 20 61 6c 69 61 73 69 6e 67 20 72 75 6c 65 73 2e   aliasing rules.
126a0 0a 2a 2f 0a 74 79 70 65 64 65 66 20 75 6e 69 6f  .*/.typedef unio
126b0 6e 20 7b 0a 20 20 73 74 72 75 63 74 20 73 6f 63  n {.  struct soc
126c0 6b 61 64 64 72 20 73 61 3b 20 20 20 20 20 20 20  kaddr sa;       
126d0 20 20 20 20 20 20 20 2f 2a 20 41 62 73 74 72 61         /* Abstra
126e0 63 74 20 73 75 70 65 72 63 6c 61 73 73 20 2a 2f  ct superclass */
126f0 0a 20 20 73 74 72 75 63 74 20 73 6f 63 6b 61 64  .  struct sockad
12700 64 72 5f 69 6e 20 73 61 34 3b 20 20 20 20 20 20  dr_in sa4;      
12710 20 20 20 20 2f 2a 20 49 50 76 34 20 2a 2f 0a 20      /* IPv4 */. 
12720 20 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72   struct sockaddr
12730 5f 69 6e 36 20 73 61 36 3b 20 20 20 20 20 20 20  _in6 sa6;       
12740 20 20 2f 2a 20 49 50 76 36 20 2a 2f 0a 20 20 73    /* IPv6 */.  s
12750 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 73  truct sockaddr_s
12760 74 6f 72 61 67 65 20 73 61 73 3b 20 20 20 20 20  torage sas;     
12770 2f 2a 20 53 68 6f 75 6c 64 20 62 65 20 74 68 65  /* Should be the
12780 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
12790 61 62 6f 76 65 20 33 20 2a 2f 0a 7d 20 61 64 64  above 3 */.} add
127a0 72 65 73 73 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  ress;../*.** Imp
127b0 6c 65 6d 65 6e 74 20 61 6e 20 48 54 54 50 20 73  lement an HTTP s
127c0 65 72 76 65 72 20 64 61 65 6d 6f 6e 20 6c 69 73  erver daemon lis
127d0 74 65 6e 69 6e 67 20 6f 6e 20 70 6f 72 74 20 69  tening on port i
127e0 50 6f 72 74 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 6e  Port..**.** As n
127f0 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ew connections a
12800 72 72 69 76 65 2c 20 66 6f 72 6b 20 61 20 63 68  rrive, fork a ch
12810 69 6c 64 20 61 6e 64 20 6c 65 74 20 63 68 69 6c  ild and let chil
12820 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6f 75 74 20  d return.** out 
12830 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  of this procedur
12840 65 20 63 61 6c 6c 2e 20 20 54 68 65 20 63 68 69  e call.  The chi
12850 6c 64 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 74  ld will handle t
12860 68 65 20 72 65 71 75 65 73 74 2e 0a 2a 2a 20 54  he request..** T
12870 68 65 20 70 61 72 65 6e 74 20 6e 65 76 65 72 20  he parent never 
12880 72 65 74 75 72 6e 73 20 66 72 6f 6d 20 74 68 69  returns from thi
12890 73 20 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2a 0a  s procedure..**.
128a0 2a 2a 20 52 65 74 75 72 6e 20 30 20 74 6f 20 65  ** Return 0 to e
128b0 61 63 68 20 63 68 69 6c 64 20 61 73 20 69 74 20  ach child as it 
128c0 72 75 6e 73 2e 20 20 49 66 20 75 6e 61 62 6c 65  runs.  If unable
128d0 20 74 6f 20 65 73 74 61 62 6c 69 73 68 20 61 0a   to establish a.
128e0 2a 2a 20 6c 69 73 74 65 6e 69 6e 67 20 73 6f 63  ** listening soc
128f0 6b 65 74 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d  ket, return non-
12900 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 68 74 74  zero..*/.int htt
12910 70 5f 73 65 72 76 65 72 28 63 6f 6e 73 74 20 63  p_server(const c
12920 68 61 72 20 2a 7a 50 6f 72 74 2c 20 69 6e 74 20  har *zPort, int 
12930 6c 6f 63 61 6c 4f 6e 6c 79 29 7b 0a 20 20 69 6e  localOnly){.  in
12940 74 20 6c 69 73 74 65 6e 65 72 5b 32 30 5d 3b 20  t listener[20]; 
12950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
12960 65 20 73 65 72 76 65 72 20 73 6f 63 6b 65 74 73  e server sockets
12970 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 6e 65 63   */.  int connec
12980 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  tion;           
12990 20 20 20 2f 2a 20 41 20 73 6f 63 6b 65 74 20 66     /* A socket f
129a0 6f 72 20 65 61 63 68 20 69 6e 64 69 76 69 64 75  or each individu
129b0 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  al connection */
129c0 0a 20 20 66 64 5f 73 65 74 20 72 65 61 64 66 64  .  fd_set readfd
129d0 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
129e0 2f 2a 20 53 65 74 20 6f 66 20 66 69 6c 65 20 64  /* Set of file d
129f0 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 73  escriptors for s
12a00 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 61 64 64  elect() */.  add
12a10 72 65 73 73 20 69 6e 61 64 64 72 3b 20 20 20 20  ress inaddr;    
12a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d            /* Rem
12a30 6f 74 65 20 61 64 64 72 65 73 73 20 2a 2f 0a 20  ote address */. 
12a40 20 73 6f 63 6b 6c 65 6e 5f 74 20 6c 65 6e 61 64   socklen_t lenad
12a50 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dr;           /*
12a60 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 69   Length of the i
12a70 6e 61 64 64 72 20 73 74 72 75 63 74 75 72 65 20  naddr structure 
12a80 2a 2f 0a 20 20 69 6e 74 20 63 68 69 6c 64 3b 20  */.  int child; 
12a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12aa0 20 20 2f 2a 20 50 49 44 20 6f 66 20 74 68 65 20    /* PID of the 
12ab0 63 68 69 6c 64 20 70 72 6f 63 65 73 73 20 2a 2f  child process */
12ac0 0a 20 20 69 6e 74 20 6e 63 68 69 6c 64 72 65 6e  .  int nchildren
12ad0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
12ae0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 69  /* Number of chi
12af0 6c 64 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a  ld processes */.
12b00 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c    struct timeval
12b10 20 64 65 6c 61 79 3b 20 20 20 20 20 20 20 20 2f   delay;        /
12b20 2a 20 48 6f 77 20 6c 6f 6e 67 20 74 6f 20 77 61  * How long to wa
12b30 69 74 20 69 6e 73 69 64 65 20 73 65 6c 65 63 74  it inside select
12b40 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 74 20  () */.  int opt 
12b50 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
12b60 20 20 20 20 20 2f 2a 20 73 65 74 73 6f 63 6b 6f       /* setsocko
12b70 70 74 20 66 6c 61 67 20 2a 2f 0a 20 20 73 74 72  pt flag */.  str
12b80 75 63 74 20 61 64 64 72 69 6e 66 6f 20 73 48 69  uct addrinfo sHi
12b90 6e 74 73 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  nts;      /* Add
12ba0 72 65 73 73 20 68 69 6e 74 73 20 2a 2f 0a 20 20  ress hints */.  
12bb0 73 74 72 75 63 74 20 61 64 64 72 69 6e 66 6f 20  struct addrinfo 
12bc0 2a 70 41 64 64 72 73 2c 20 2a 70 3b 20 2f 2a 20  *pAddrs, *p; /* 
12bd0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
12be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bf0 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
12c00 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a   */.  int i, n;.
12c10 20 20 69 6e 74 20 6d 61 78 46 64 20 3d 20 2d 31    int maxFd = -1
12c20 3b 0a 20 20 0a 20 20 6d 65 6d 73 65 74 28 26 73  ;.  .  memset(&s
12c30 48 69 6e 74 73 2c 20 30 2c 20 73 69 7a 65 6f 66  Hints, 0, sizeof
12c40 28 73 48 69 6e 74 73 29 29 3b 0a 20 20 69 66 28  (sHints));.  if(
12c50 20 69 70 76 34 4f 6e 6c 79 20 29 7b 0a 20 20 20   ipv4Only ){.   
12c60 20 73 48 69 6e 74 73 2e 61 69 5f 66 61 6d 69 6c   sHints.ai_famil
12c70 79 20 3d 20 50 46 5f 49 4e 45 54 3b 0a 20 20 20  y = PF_INET;.   
12c80 20 2f 2a 70 72 69 6e 74 66 28 22 69 70 76 34 20   /*printf("ipv4 
12c90 6f 6e 6c 79 5c 6e 22 29 3b 2a 2f 0a 20 20 7d 65  only\n");*/.  }e
12ca0 6c 73 65 20 69 66 28 20 69 70 76 36 4f 6e 6c 79  lse if( ipv6Only
12cb0 20 29 7b 0a 20 20 20 20 73 48 69 6e 74 73 2e 61   ){.    sHints.a
12cc0 69 5f 66 61 6d 69 6c 79 20 3d 20 50 46 5f 49 4e  i_family = PF_IN
12cd0 45 54 36 3b 0a 20 20 20 20 2f 2a 70 72 69 6e 74  ET6;.    /*print
12ce0 66 28 22 69 70 76 36 20 6f 6e 6c 79 5c 6e 22 29  f("ipv6 only\n")
12cf0 3b 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;*/.  }else{.   
12d00 20 73 48 69 6e 74 73 2e 61 69 5f 66 61 6d 69 6c   sHints.ai_famil
12d10 79 20 3d 20 50 46 5f 55 4e 53 50 45 43 3b 0a 20  y = PF_UNSPEC;. 
12d20 20 7d 0a 20 20 73 48 69 6e 74 73 2e 61 69 5f 73   }.  sHints.ai_s
12d30 6f 63 6b 74 79 70 65 20 3d 20 53 4f 43 4b 5f 53  ocktype = SOCK_S
12d40 54 52 45 41 4d 3b 0a 20 20 73 48 69 6e 74 73 2e  TREAM;.  sHints.
12d50 61 69 5f 66 6c 61 67 73 20 3d 20 41 49 5f 50 41  ai_flags = AI_PA
12d60 53 53 49 56 45 3b 0a 20 20 73 48 69 6e 74 73 2e  SSIVE;.  sHints.
12d70 61 69 5f 70 72 6f 74 6f 63 6f 6c 20 3d 20 30 3b  ai_protocol = 0;
12d80 0a 20 20 72 63 20 3d 20 67 65 74 61 64 64 72 69  .  rc = getaddri
12d90 6e 66 6f 28 6c 6f 63 61 6c 4f 6e 6c 79 20 3f 20  nfo(localOnly ? 
12da0 22 6c 6f 63 61 6c 68 6f 73 74 22 3a 20 30 2c 20  "localhost": 0, 
12db0 7a 50 6f 72 74 2c 20 26 73 48 69 6e 74 73 2c 20  zPort, &sHints, 
12dc0 26 70 41 64 64 72 73 29 3b 0a 20 20 69 66 28 20  &pAddrs);.  if( 
12dd0 72 63 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  rc ){.    fprint
12de0 66 28 73 74 64 65 72 72 2c 20 22 63 6f 75 6c 64  f(stderr, "could
12df0 20 6e 6f 74 20 67 65 74 20 61 64 64 72 20 69 6e   not get addr in
12e00 66 6f 3a 20 25 73 22 2c 20 0a 20 20 20 20 20 20  fo: %s", .      
12e10 20 20 20 20 20 20 72 63 21 3d 45 41 49 5f 53 59        rc!=EAI_SY
12e20 53 54 45 4d 20 3f 20 67 61 69 5f 73 74 72 65 72  STEM ? gai_strer
12e30 72 6f 72 28 72 63 29 20 3a 20 73 74 72 65 72 72  ror(rc) : strerr
12e40 6f 72 28 65 72 72 6e 6f 29 29 3b 0a 20 20 20 20  or(errno));.    
12e50 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
12e60 66 6f 72 28 6e 3d 30 2c 20 70 3d 70 41 64 64 72  for(n=0, p=pAddr
12e70 73 3b 20 6e 3c 28 69 6e 74 29 28 73 69 7a 65 6f  s; n<(int)(sizeo
12e80 66 28 6c 69 73 74 65 6e 65 72 29 2f 73 69 7a 65  f(listener)/size
12e90 6f 66 28 6c 69 73 74 65 6e 65 72 5b 30 5d 29 29  of(listener[0]))
12ea0 20 26 26 20 70 21 3d 30 3b 0a 20 20 20 20 20 20   && p!=0;.      
12eb0 20 20 70 3d 70 2d 3e 61 69 5f 6e 65 78 74 29 7b    p=p->ai_next){
12ec0 0a 20 20 20 20 6c 69 73 74 65 6e 65 72 5b 6e 5d  .    listener[n]
12ed0 20 3d 20 73 6f 63 6b 65 74 28 70 2d 3e 61 69 5f   = socket(p->ai_
12ee0 66 61 6d 69 6c 79 2c 20 70 2d 3e 61 69 5f 73 6f  family, p->ai_so
12ef0 63 6b 74 79 70 65 2c 20 70 2d 3e 61 69 5f 70 72  cktype, p->ai_pr
12f00 6f 74 6f 63 6f 6c 29 3b 0a 20 20 20 20 69 66 28  otocol);.    if(
12f10 20 6c 69 73 74 65 6e 65 72 5b 6e 5d 3e 3d 30 20   listener[n]>=0 
12f20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77  ){.      /* if w
12f30 65 20 63 61 6e 27 74 20 74 65 72 6d 69 6e 61 74  e can't terminat
12f40 65 20 6e 69 63 65 6c 79 2c 20 61 74 20 6c 65 61  e nicely, at lea
12f50 73 74 20 61 6c 6c 6f 77 20 74 68 65 20 73 6f 63  st allow the soc
12f60 6b 65 74 20 74 6f 20 62 65 20 72 65 75 73 65 64  ket to be reused
12f70 20 2a 2f 0a 20 20 20 20 20 20 73 65 74 73 6f 63   */.      setsoc
12f80 6b 6f 70 74 28 6c 69 73 74 65 6e 65 72 5b 6e 5d  kopt(listener[n]
12f90 2c 20 53 4f 4c 5f 53 4f 43 4b 45 54 2c 20 53 4f  , SOL_SOCKET, SO
12fa0 5f 52 45 55 53 45 41 44 44 52 2c 26 6f 70 74 2c  _REUSEADDR,&opt,
12fb0 20 73 69 7a 65 6f 66 28 6f 70 74 29 29 3b 0a 20   sizeof(opt));. 
12fc0 20 20 20 20 20 0a 23 69 66 20 64 65 66 69 6e 65       .#if define
12fd0 64 28 49 50 56 36 5f 56 36 4f 4e 4c 59 29 0a 20  d(IPV6_V6ONLY). 
12fe0 20 20 20 20 20 69 66 28 20 70 2d 3e 61 69 5f 66       if( p->ai_f
12ff0 61 6d 69 6c 79 3d 3d 41 46 5f 49 4e 45 54 36 20  amily==AF_INET6 
13000 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 76  ){.        int v
13010 36 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20  6only = 1;.     
13020 20 20 20 73 65 74 73 6f 63 6b 6f 70 74 28 6c 69     setsockopt(li
13030 73 74 65 6e 65 72 5b 6e 5d 2c 20 49 50 50 52 4f  stener[n], IPPRO
13040 54 4f 5f 49 50 56 36 2c 20 49 50 56 36 5f 56 36  TO_IPV6, IPV6_V6
13050 4f 4e 4c 59 2c 0a 20 20 20 20 20 20 20 20 20 20  ONLY,.          
13060 20 20 20 20 20 20 20 20 20 20 26 76 36 6f 6e 6c            &v6onl
13070 79 2c 20 73 69 7a 65 6f 66 28 76 36 6f 6e 6c 79  y, sizeof(v6only
13080 29 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ));.      }.#end
13090 69 66 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  if.      .      
130a0 69 66 28 20 62 69 6e 64 28 6c 69 73 74 65 6e 65  if( bind(listene
130b0 72 5b 6e 5d 2c 20 70 2d 3e 61 69 5f 61 64 64 72  r[n], p->ai_addr
130c0 2c 20 70 2d 3e 61 69 5f 61 64 64 72 6c 65 6e 29  , p->ai_addrlen)
130d0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  <0 ){.        pr
130e0 69 6e 74 66 28 22 62 69 6e 64 20 66 61 69 6c 65  intf("bind faile
130f0 64 3a 20 25 73 5c 6e 22 2c 20 73 74 72 65 72 72  d: %s\n", strerr
13100 6f 72 28 65 72 72 6e 6f 29 29 3b 0a 20 20 20 20  or(errno));.    
13110 20 20 20 20 63 6c 6f 73 65 28 6c 69 73 74 65 6e      close(listen
13120 65 72 5b 6e 5d 29 3b 0a 20 20 20 20 20 20 20 20  er[n]);.        
13130 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
13140 7d 0a 20 20 20 20 20 20 69 66 28 20 6c 69 73 74  }.      if( list
13150 65 6e 28 6c 69 73 74 65 6e 65 72 5b 6e 5d 2c 20  en(listener[n], 
13160 32 30 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  20)<0 ){.       
13170 20 70 72 69 6e 74 66 28 22 6c 69 73 74 65 6e 28   printf("listen(
13180 29 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c  ) failed: %s\n",
13190 20 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29   strerror(errno)
131a0 29 3b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65  );.        close
131b0 28 6c 69 73 74 65 6e 65 72 5b 6e 5d 29 3b 0a 20  (listener[n]);. 
131c0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
131d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
131e0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
131f0 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
13200 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
13210 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 61 6e 79  "cannot open any
13220 20 73 6f 63 6b 65 74 73 5c 6e 22 29 3b 0a 20 20   sockets\n");.  
13230 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
13240 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
13250 20 20 20 69 66 28 20 6e 63 68 69 6c 64 72 65 6e     if( nchildren
13260 3e 4d 41 58 5f 50 41 52 41 4c 4c 45 4c 20 29 7b  >MAX_PARALLEL ){
13270 0a 20 20 20 20 20 20 2f 2a 20 53 6c 6f 77 20 64  .      /* Slow d
13280 6f 77 6e 20 69 66 20 63 6f 6e 6e 65 63 74 69 6f  own if connectio
13290 6e 73 20 61 72 65 20 61 72 72 69 76 69 6e 67 20  ns are arriving 
132a0 74 6f 6f 20 66 61 73 74 20 2a 2f 0a 20 20 20 20  too fast */.    
132b0 20 20 73 6c 65 65 70 28 20 6e 63 68 69 6c 64 72    sleep( nchildr
132c0 65 6e 2d 4d 41 58 5f 50 41 52 41 4c 4c 45 4c 20  en-MAX_PARALLEL 
132d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 6c  );.    }.    del
132e0 61 79 2e 74 76 5f 73 65 63 20 3d 20 36 30 3b 0a  ay.tv_sec = 60;.
132f0 20 20 20 20 64 65 6c 61 79 2e 74 76 5f 75 73 65      delay.tv_use
13300 63 20 3d 20 30 3b 0a 20 20 20 20 46 44 5f 5a 45  c = 0;.    FD_ZE
13310 52 4f 28 26 72 65 61 64 66 64 73 29 3b 0a 20 20  RO(&readfds);.  
13320 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
13330 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
13340 72 74 28 20 6c 69 73 74 65 6e 65 72 5b 69 5d 3e  rt( listener[i]>
13350 3d 30 20 29 3b 0a 20 20 20 20 20 20 46 44 5f 53  =0 );.      FD_S
13360 45 54 28 20 6c 69 73 74 65 6e 65 72 5b 69 5d 2c  ET( listener[i],
13370 20 26 72 65 61 64 66 64 73 29 3b 0a 20 20 20 20   &readfds);.    
13380 20 20 69 66 28 20 6c 69 73 74 65 6e 65 72 5b 69    if( listener[i
13390 5d 3e 6d 61 78 46 64 20 29 20 6d 61 78 46 64 20  ]>maxFd ) maxFd 
133a0 3d 20 6c 69 73 74 65 6e 65 72 5b 69 5d 3b 0a 20  = listener[i];. 
133b0 20 20 20 7d 0a 20 20 20 20 73 65 6c 65 63 74 28     }.    select(
133c0 20 6d 61 78 46 64 2b 31 2c 20 26 72 65 61 64 66   maxFd+1, &readf
133d0 64 73 2c 20 30 2c 20 30 2c 20 26 64 65 6c 61 79  ds, 0, 0, &delay
133e0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
133f0 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
13400 20 69 66 28 20 46 44 5f 49 53 53 45 54 28 6c 69   if( FD_ISSET(li
13410 73 74 65 6e 65 72 5b 69 5d 2c 20 26 72 65 61 64  stener[i], &read
13420 66 64 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20  fds) ){.        
13430 6c 65 6e 61 64 64 72 20 3d 20 73 69 7a 65 6f 66  lenaddr = sizeof
13440 28 69 6e 61 64 64 72 29 3b 0a 20 20 20 20 20 20  (inaddr);.      
13450 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 61    connection = a
13460 63 63 65 70 74 28 6c 69 73 74 65 6e 65 72 5b 69  ccept(listener[i
13470 5d 2c 20 26 69 6e 61 64 64 72 2e 73 61 2c 20 26  ], &inaddr.sa, &
13480 6c 65 6e 61 64 64 72 29 3b 0a 20 20 20 20 20 20  lenaddr);.      
13490 20 20 69 66 28 20 63 6f 6e 6e 65 63 74 69 6f 6e    if( connection
134a0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
134b0 20 63 68 69 6c 64 20 3d 20 66 6f 72 6b 28 29 3b   child = fork();
134c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
134d0 68 69 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 20  hild!=0 ){.     
134e0 20 20 20 20 20 20 20 69 66 28 20 63 68 69 6c 64         if( child
134f0 3e 30 20 29 20 6e 63 68 69 6c 64 72 65 6e 2b 2b  >0 ) nchildren++
13500 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6c  ;.            cl
13510 6f 73 65 28 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b  ose(connection);
13520 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
13530 70 72 69 6e 74 66 28 22 73 75 62 70 72 6f 63 65  printf("subproce
13540 73 73 20 25 64 20 73 74 61 72 74 65 64 2e 2e 2e  ss %d started...
13550 5c 6e 22 2c 20 63 68 69 6c 64 29 3b 20 66 66 6c  \n", child); ffl
13560 75 73 68 28 73 74 64 6f 75 74 29 3b 20 2a 2f 0a  ush(stdout); */.
13570 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
13580 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
13590 20 6e 45 72 72 20 3d 20 30 2c 20 66 64 3b 0a 20   nErr = 0, fd;. 
135a0 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
135b0 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (0);.           
135c0 20 66 64 20 3d 20 64 75 70 28 63 6f 6e 6e 65 63   fd = dup(connec
135d0 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  tion);.         
135e0 20 20 20 69 66 28 20 66 64 21 3d 30 20 29 20 6e     if( fd!=0 ) n
135f0 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Err++;.         
13600 20 20 20 63 6c 6f 73 65 28 31 29 3b 0a 20 20 20     close(1);.   
13610 20 20 20 20 20 20 20 20 20 66 64 20 3d 20 64 75           fd = du
13620 70 28 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20  p(connection);. 
13630 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66             if( f
13640 64 21 3d 31 20 29 20 6e 45 72 72 2b 2b 3b 0a 20  d!=1 ) nErr++;. 
13650 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
13660 28 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20 20  (connection);.  
13670 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
13680 20 6e 45 72 72 3b 0a 20 20 20 20 20 20 20 20 20   nErr;.         
13690 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
136a0 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 42 75     }.      /* Bu
136b0 72 79 20 64 65 61 64 20 63 68 69 6c 64 72 65 6e  ry dead children
136c0 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28   */.      while(
136d0 20 28 63 68 69 6c 64 20 3d 20 77 61 69 74 70 69   (child = waitpi
136e0 64 28 30 2c 20 30 2c 20 57 4e 4f 48 41 4e 47 29  d(0, 0, WNOHANG)
136f0 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  )>0 ){.        /
13700 2a 20 70 72 69 6e 74 66 28 22 70 72 6f 63 65 73  * printf("proces
13710 73 20 25 64 20 65 6e 64 73 5c 6e 22 2c 20 63 68  s %d ends\n", ch
13720 69 6c 64 29 3b 20 66 66 6c 75 73 68 28 73 74 64  ild); fflush(std
13730 6f 75 74 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20  out); */.       
13740 20 6e 63 68 69 6c 64 72 65 6e 2d 2d 3b 0a 20 20   nchildren--;.  
13750 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
13760 20 20 2f 2a 20 4e 4f 54 20 52 45 41 43 48 45 44    /* NOT REACHED
13770 20 2a 2f 20 20 0a 20 20 65 78 69 74 28 31 29 3b   */  .  exit(1);
13780 0a 7d 0a 0a 0a 69 6e 74 20 6d 61 69 6e 28 69 6e  .}...int main(in
13790 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61  t argc, char **a
137a0 72 67 76 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  rgv){.  int i;  
137b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137c0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
137d0 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 65  r */.  char *zPe
137e0 72 6d 55 73 65 72 20 3d 20 30 3b 20 20 20 20 20  rmUser = 0;     
137f0 20 2f 2a 20 52 75 6e 20 64 61 65 6d 6f 6e 20 77   /* Run daemon w
13800 69 74 68 20 74 68 69 73 20 75 73 65 72 27 73 20  ith this user's 
13810 70 65 72 6d 69 73 73 69 6f 6e 73 20 2a 2f 0a 20  permissions */. 
13820 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 6f   const char *zPo
13830 72 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6d  rt = 0;    /* Im
13840 70 6c 65 6d 65 6e 74 20 61 6e 20 48 54 54 50 20  plement an HTTP 
13850 73 65 72 76 65 72 20 70 72 6f 63 65 73 73 20 2a  server process *
13860 2f 0a 20 20 69 6e 74 20 75 73 65 43 68 72 6f 6f  /.  int useChroo
13870 74 4a 61 69 6c 20 3d 20 31 3b 20 20 20 20 2f 2a  tJail = 1;    /*
13880 20 54 72 75 65 20 74 6f 20 75 73 65 20 61 20 63   True to use a c
13890 68 61 6e 67 65 2d 72 6f 6f 74 20 6a 61 69 6c 20  hange-root jail 
138a0 2a 2f 0a 20 20 73 74 72 75 63 74 20 70 61 73 73  */.  struct pass
138b0 77 64 20 2a 70 77 64 20 3d 20 30 3b 20 20 20 2f  wd *pwd = 0;   /
138c0 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
138d0 6f 75 74 20 74 68 65 20 75 73 65 72 20 2a 2f 0a  out the user */.
138e0 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65  .  /* Record the
138f0 20 74 69 6d 65 20 77 68 65 6e 20 70 72 6f 63 65   time when proce
13900 73 73 69 6e 67 20 62 65 67 69 6e 73 2e 0a 20 20  ssing begins..  
13910 2a 2f 0a 20 20 67 65 74 74 69 6d 65 6f 66 64 61  */.  gettimeofda
13920 79 28 26 62 65 67 69 6e 54 69 6d 65 2c 20 30 29  y(&beginTime, 0)
13930 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 63 6f  ;..  /* Parse co
13940 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d  mmand-line argum
13950 65 6e 74 73 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  ents.  */.  whil
13960 65 28 20 61 72 67 63 3e 31 20 26 26 20 61 72 67  e( argc>1 && arg
13970 76 5b 31 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a  v[1][0]=='-' ){.
13980 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 72      char *z = ar
13990 67 76 5b 31 5d 3b 0a 20 20 20 20 63 68 61 72 20  gv[1];.    char 
139a0 2a 7a 41 72 67 20 3d 20 61 72 67 63 3e 3d 33 20  *zArg = argc>=3 
139b0 3f 20 61 72 67 76 5b 32 5d 20 3a 20 22 30 22 3b  ? argv[2] : "0";
139c0 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  .    if( z[0]=='
139d0 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20  -' && z[1]=='-' 
139e0 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 73  ) z++;.    if( s
139f0 74 72 63 6d 70 28 7a 2c 22 2d 75 73 65 72 22 29  trcmp(z,"-user")
13a00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 50 65  ==0 ){.      zPe
13a10 72 6d 55 73 65 72 20 3d 20 7a 41 72 67 3b 0a 20  rmUser = zArg;. 
13a20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
13a30 63 6d 70 28 7a 2c 22 2d 72 6f 6f 74 22 29 3d 3d  cmp(z,"-root")==
13a40 30 20 29 7b 0a 20 20 20 20 20 20 7a 52 6f 6f 74  0 ){.      zRoot
13a50 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 7d 65 6c   = zArg;.    }el
13a60 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
13a70 22 2d 6c 6f 67 66 69 6c 65 22 29 3d 3d 30 20 29  "-logfile")==0 )
13a80 7b 0a 20 20 20 20 20 20 7a 4c 6f 67 46 69 6c 65  {.      zLogFile
13a90 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 7d 65 6c   = zArg;.    }el
13aa0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
13ab0 22 2d 6d 61 78 2d 61 67 65 22 29 3d 3d 30 20 29  "-max-age")==0 )
13ac0 7b 0a 20 20 20 20 20 20 6d 78 41 67 65 20 3d 20  {.      mxAge = 
13ad0 61 74 6f 69 28 7a 41 72 67 29 3b 0a 20 20 20 20  atoi(zArg);.    
13ae0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
13af0 28 7a 2c 22 2d 68 74 74 70 73 22 29 3d 3d 30 20  (z,"-https")==0 
13b00 29 7b 0a 20 20 20 20 20 20 75 73 65 48 74 74 70  ){.      useHttp
13b10 73 20 3d 20 61 74 6f 69 28 7a 41 72 67 29 3b 0a  s = atoi(zArg);.
13b20 20 20 20 20 20 20 7a 48 74 74 70 20 3d 20 75 73        zHttp = us
13b30 65 48 74 74 70 73 20 3f 20 22 68 74 74 70 73 22  eHttps ? "https"
13b40 20 3a 20 22 68 74 74 70 22 3b 0a 20 20 20 20 20   : "http";.     
13b50 20 69 66 28 20 75 73 65 48 74 74 70 73 20 29 20   if( useHttps ) 
13b60 7a 52 65 6d 6f 74 65 41 64 64 72 20 3d 20 67 65  zRemoteAddr = ge
13b70 74 65 6e 76 28 22 52 45 4d 4f 54 45 5f 48 4f 53  tenv("REMOTE_HOS
13b80 54 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  T");.    }else i
13b90 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 70  f( strcmp(z, "-p
13ba0 6f 72 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ort")==0 ){.    
13bb0 20 20 7a 50 6f 72 74 20 3d 20 7a 41 72 67 3b 0a    zPort = zArg;.
13bc0 20 20 20 20 20 20 73 74 61 6e 64 61 6c 6f 6e 65        standalone
13bd0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
13be0 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d  if( strcmp(z, "-
13bf0 66 61 6d 69 6c 79 22 29 3d 3d 30 20 29 7b 0a 20  family")==0 ){. 
13c00 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
13c10 7a 41 72 67 2c 20 22 69 70 76 34 22 29 3d 3d 30  zArg, "ipv4")==0
13c20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 70 76 34   ){.        ipv4
13c30 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  Only = 1;.      
13c40 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
13c50 28 7a 41 72 67 2c 20 22 69 70 76 36 22 29 3d 3d  (zArg, "ipv6")==
13c60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 70 76  0 ){.        ipv
13c70 36 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20  6Only = 1;.     
13c80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13c90 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 35 30 30 2c  Malfunction(500,
13ca0 20 20 2f 2a 20 4c 4f 47 3a 20 75 6e 6b 6e 6f 77    /* LOG: unknow
13cb0 6e 20 49 50 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f  n IP protocol */
13cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13cd0 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 49 50       "unknown IP
13ce0 20 70 72 6f 74 6f 63 6f 6c 3a 20 5b 25 73 5d 5c   protocol: [%s]\
13cf0 6e 22 2c 20 7a 41 72 67 29 3b 0a 20 20 20 20 20  n", zArg);.     
13d00 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
13d10 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 6a 61 69   strcmp(z, "-jai
13d20 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  l")==0 ){.      
13d30 69 66 28 20 61 74 6f 69 28 7a 41 72 67 29 3d 3d  if( atoi(zArg)==
13d40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 73 65  0 ){.        use
13d50 43 68 72 6f 6f 74 4a 61 69 6c 20 3d 20 30 3b 0a  ChrootJail = 0;.
13d60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
13d70 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20  e if( strcmp(z, 
13d80 22 2d 64 65 62 75 67 22 29 3d 3d 30 20 29 7b 0a  "-debug")==0 ){.
13d90 20 20 20 20 20 20 69 66 28 20 61 74 6f 69 28 7a        if( atoi(z
13da0 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Arg) ){.        
13db0 75 73 65 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a  useTimeout = 0;.
13dc0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
13dd0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20  e if( strcmp(z, 
13de0 22 2d 69 6e 70 75 74 22 29 3d 3d 30 20 29 7b 0a  "-input")==0 ){.
13df0 20 20 20 20 20 20 66 63 6c 6f 73 65 28 73 74 64        fclose(std
13e00 69 6e 29 3b 0a 20 20 20 20 20 20 73 74 64 69 6e  in);.      stdin
13e10 20 3d 20 66 6f 70 65 6e 28 7a 41 72 67 2c 20 22   = fopen(zArg, "
13e20 72 62 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rb");.      if( 
13e30 73 74 64 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  stdin==0 ){.    
13e40 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28      Malfunction(
13e50 35 30 31 2c 20 2f 2a 20 4c 4f 47 3a 20 63 61 6e  501, /* LOG: can
13e60 6e 6f 74 20 6f 70 65 6e 20 2d 2d 69 6e 70 75 74  not open --input
13e70 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20   file */.       
13e80 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 61               "ca
13e90 6e 6e 6f 74 20 6f 70 65 6e 20 2d 2d 69 6e 70 75  nnot open --inpu
13ea0 74 20 66 69 6c 65 20 5c 22 25 73 5c 22 5c 6e 22  t file \"%s\"\n"
13eb0 2c 20 7a 41 72 67 29 3b 0a 20 20 20 20 20 20 7d  , zArg);.      }
13ec0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
13ed0 74 72 63 6d 70 28 7a 2c 20 22 2d 64 61 74 65 74  trcmp(z, "-datet
13ee0 65 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  est")==0 ){.    
13ef0 20 20 54 65 73 74 50 61 72 73 65 52 66 63 38 32    TestParseRfc82
13f00 32 44 61 74 65 28 29 3b 0a 20 20 20 20 20 20 70  2Date();.      p
13f10 72 69 6e 74 66 28 22 4f 6b 5c 6e 22 29 3b 0a 20  rintf("Ok\n");. 
13f20 20 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20       exit(0);.  
13f30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d    }else{.      M
13f40 61 6c 66 75 6e 63 74 69 6f 6e 28 35 31 30 2c 20  alfunction(510, 
13f50 2f 2a 20 4c 4f 47 3a 20 75 6e 6b 6e 6f 77 6e 20  /* LOG: unknown 
13f60 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67  command-line arg
13f70 75 6d 65 6e 74 20 6f 6e 20 6c 61 75 6e 63 68 20  ument on launch 
13f80 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
13f90 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 61 72       "unknown ar
13fa0 67 75 6d 65 6e 74 3a 20 5b 25 73 5d 5c 6e 22 2c  gument: [%s]\n",
13fb0 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   z);.    }.    a
13fc0 72 67 76 20 2b 3d 20 32 3b 0a 20 20 20 20 61 72  rgv += 2;.    ar
13fd0 67 63 20 2d 3d 20 32 3b 0a 20 20 7d 0a 20 20 69  gc -= 2;.  }.  i
13fe0 66 28 20 7a 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20  f( zRoot==0 ){. 
13ff0 20 20 20 69 66 28 20 73 74 61 6e 64 61 6c 6f 6e     if( standalon
14000 65 20 29 7b 0a 20 20 20 20 20 20 7a 52 6f 6f 74  e ){.      zRoot
14010 20 3d 20 22 2e 22 3b 0a 20 20 20 20 7d 65 6c 73   = ".";.    }els
14020 65 7b 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e 63  e{.      Malfunc
14030 74 69 6f 6e 28 35 32 30 2c 20 2f 2a 20 4c 4f 47  tion(520, /* LOG
14040 3a 20 2d 2d 72 6f 6f 74 20 61 72 67 75 6d 65 6e  : --root argumen
14050 74 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 20  t missing */.   
14060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
14070 6e 6f 20 2d 2d 72 6f 6f 74 20 73 70 65 63 69 66  no --root specif
14080 69 65 64 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ied");.    }.  }
14090 0a 20 20 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20  .  .  /* Change 
140a0 64 69 72 65 63 74 6f 72 69 65 73 20 74 6f 20 74  directories to t
140b0 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 48  he root of the H
140c0 54 54 50 20 66 69 6c 65 73 79 73 74 65 6d 2e 20  TTP filesystem. 
140d0 20 54 68 65 6e 0a 20 20 2a 2a 20 63 72 65 61 74   Then.  ** creat
140e0 65 20 61 20 63 68 72 6f 6f 74 20 6a 61 69 6c 20  e a chroot jail 
140f0 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  there..  */.  if
14100 28 20 63 68 64 69 72 28 7a 52 6f 6f 74 29 21 3d  ( chdir(zRoot)!=
14110 30 20 29 7b 0a 20 20 20 20 4d 61 6c 66 75 6e 63  0 ){.    Malfunc
14120 74 69 6f 6e 28 35 33 30 2c 20 2f 2a 20 4c 4f 47  tion(530, /* LOG
14130 3a 20 63 68 64 69 72 28 29 20 66 61 69 6c 65 64  : chdir() failed
14140 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
14150 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 68 61 6e      "cannot chan
14160 67 65 20 74 6f 20 64 69 72 65 63 74 6f 72 79 20  ge to directory 
14170 5b 25 73 5d 22 2c 20 7a 52 6f 6f 74 29 3b 0a 20  [%s]", zRoot);. 
14180 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 69 6e 66   }..  /* Get inf
14190 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
141a0 68 65 20 75 73 65 72 20 69 66 20 61 76 61 69 6c  he user if avail
141b0 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 7a 50  able */.  if( zP
141c0 65 72 6d 55 73 65 72 20 29 20 70 77 64 20 3d 20  ermUser ) pwd = 
141d0 67 65 74 70 77 6e 61 6d 28 7a 50 65 72 6d 55 73  getpwnam(zPermUs
141e0 65 72 29 3b 0a 0a 20 20 2f 2a 20 45 6e 74 65 72  er);..  /* Enter
141f0 20 74 68 65 20 63 68 72 6f 6f 74 20 6a 61 69 6c   the chroot jail
14200 20 69 66 20 72 65 71 75 65 73 74 65 64 20 2a 2f   if requested */
14210 20 20 0a 20 20 69 66 28 20 7a 50 65 72 6d 55 73    .  if( zPermUs
14220 65 72 20 26 26 20 75 73 65 43 68 72 6f 6f 74 4a  er && useChrootJ
14230 61 69 6c 20 26 26 20 67 65 74 75 69 64 28 29 3d  ail && getuid()=
14240 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 63 68  =0 ){.    if( ch
14250 72 6f 6f 74 28 22 2e 22 29 3c 30 20 29 7b 0a 20  root(".")<0 ){. 
14260 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e       Malfunction
14270 28 35 34 30 2c 20 2f 2a 20 4c 4f 47 3a 20 63 68  (540, /* LOG: ch
14280 72 6f 6f 74 28 29 20 66 61 69 6c 65 64 20 2a 2f  root() failed */
14290 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
142a0 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 72     "unable to cr
142b0 65 61 74 65 20 63 68 72 6f 6f 74 20 6a 61 69 6c  eate chroot jail
142c0 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ");.    }else{. 
142d0 20 20 20 20 20 7a 52 6f 6f 74 20 3d 20 22 22 3b       zRoot = "";
142e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
142f0 20 41 63 74 69 76 61 74 65 20 74 68 65 20 73 65   Activate the se
14300 72 76 65 72 2c 20 69 66 20 72 65 71 75 65 73 74  rver, if request
14310 65 64 20 2a 2f 0a 20 20 69 66 28 20 7a 50 6f 72  ed */.  if( zPor
14320 74 20 26 26 20 68 74 74 70 5f 73 65 72 76 65 72  t && http_server
14330 28 7a 50 6f 72 74 2c 20 30 29 20 29 7b 0a 20 20  (zPort, 0) ){.  
14340 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 35 35    Malfunction(55
14350 30 2c 20 2f 2a 20 4c 4f 47 3a 20 73 65 72 76 65  0, /* LOG: serve
14360 72 20 73 74 61 72 74 75 70 20 66 61 69 6c 65 64  r startup failed
14370 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
14380 20 20 20 20 22 66 61 69 6c 65 64 20 74 6f 20 73      "failed to s
14390 74 61 72 74 20 73 65 72 76 65 72 22 29 3b 0a 20  tart server");. 
143a0 20 7d 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 72 6f   }..  /* Drop ro
143b0 6f 74 20 70 72 69 76 69 6c 65 67 65 73 2e 0a 20  ot privileges.. 
143c0 20 2a 2f 0a 20 20 69 66 28 20 7a 50 65 72 6d 55   */.  if( zPermU
143d0 73 65 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ser ){.    if( p
143e0 77 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  wd ){.      if( 
143f0 73 65 74 67 69 64 28 70 77 64 2d 3e 70 77 5f 67  setgid(pwd->pw_g
14400 69 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 4d  id) ){.        M
14410 61 6c 66 75 6e 63 74 69 6f 6e 28 35 36 30 2c 20  alfunction(560, 
14420 2f 2a 20 4c 4f 47 3a 20 73 65 74 67 69 64 28 29  /* LOG: setgid()
14430 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
14440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
14450 63 61 6e 6e 6f 74 20 73 65 74 20 67 72 6f 75 70  cannot set group
14460 2d 69 64 20 74 6f 20 25 64 22 2c 20 70 77 64 2d  -id to %d", pwd-
14470 3e 70 77 5f 67 69 64 29 3b 0a 20 20 20 20 20 20  >pw_gid);.      
14480 7d 0a 20 20 20 20 20 20 69 66 28 20 73 65 74 75  }.      if( setu
14490 69 64 28 70 77 64 2d 3e 70 77 5f 75 69 64 29 20  id(pwd->pw_uid) 
144a0 29 7b 0a 20 20 20 20 20 20 20 20 4d 61 6c 66 75  ){.        Malfu
144b0 6e 63 74 69 6f 6e 28 35 37 30 2c 20 2f 2a 20 4c  nction(570, /* L
144c0 4f 47 3a 20 73 65 74 75 69 64 28 29 20 66 61 69  OG: setuid() fai
144d0 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  led */.         
144e0 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e             "cann
144f0 6f 74 20 73 65 74 20 75 73 65 72 2d 69 64 20 74  ot set user-id t
14500 6f 20 25 64 22 2c 20 70 77 64 2d 3e 70 77 5f 75  o %d", pwd->pw_u
14510 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  id);.      }.   
14520 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d 61   }else{.      Ma
14530 6c 66 75 6e 63 74 69 6f 6e 28 35 38 30 2c 20 2f  lfunction(580, /
14540 2a 20 4c 4f 47 3a 20 75 6e 6b 6e 6f 77 6e 20 75  * LOG: unknown u
14550 73 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ser */.         
14560 20 20 20 20 20 20 20 20 20 22 6e 6f 20 73 75 63           "no suc
14570 68 20 75 73 65 72 20 5b 25 73 5d 22 2c 20 7a 50  h user [%s]", zP
14580 65 72 6d 55 73 65 72 29 3b 0a 20 20 20 20 7d 0a  ermUser);.    }.
14590 20 20 7d 0a 20 20 69 66 28 20 67 65 74 75 69 64    }.  if( getuid
145a0 28 29 3d 3d 30 20 29 7b 0a 20 20 20 20 4d 61 6c  ()==0 ){.    Mal
145b0 66 75 6e 63 74 69 6f 6e 28 35 39 30 2c 20 2f 2a  function(590, /*
145c0 20 4c 4f 47 3a 20 63 61 6e 6e 6f 74 20 72 75 6e   LOG: cannot run
145d0 20 61 73 20 72 6f 6f 74 20 2a 2f 0a 20 20 20 20   as root */.    
145e0 20 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e              "can
145f0 6e 6f 74 20 72 75 6e 20 61 73 20 72 6f 6f 74 22  not run as root"
14600 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74  );.  }..  /* Get
14610 20 74 68 65 20 49 50 20 61 64 64 72 65 73 73 20   the IP address 
14620 66 72 6f 6d 20 77 68 65 6e 63 65 20 74 68 65 20  from whence the 
14630 72 65 71 75 65 73 74 20 6f 72 69 67 69 6e 61 74  request originat
14640 65 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52  es.  */.  if( zR
14650 65 6d 6f 74 65 41 64 64 72 3d 3d 30 20 29 7b 0a  emoteAddr==0 ){.
14660 20 20 20 20 61 64 64 72 65 73 73 20 72 65 6d 6f      address remo
14670 74 65 41 64 64 72 3b 0a 20 20 20 20 75 6e 73 69  teAddr;.    unsi
14680 67 6e 65 64 20 69 6e 74 20 73 69 7a 65 20 3d 20  gned int size = 
14690 73 69 7a 65 6f 66 28 72 65 6d 6f 74 65 41 64 64  sizeof(remoteAdd
146a0 72 29 3b 0a 20 20 20 20 63 68 61 72 20 7a 48 6f  r);.    char zHo
146b0 73 74 5b 4e 49 5f 4d 41 58 48 4f 53 54 5d 3b 0a  st[NI_MAXHOST];.
146c0 20 20 20 20 69 66 28 20 67 65 74 70 65 65 72 6e      if( getpeern
146d0 61 6d 65 28 30 2c 20 26 72 65 6d 6f 74 65 41 64  ame(0, &remoteAd
146e0 64 72 2e 73 61 2c 20 26 73 69 7a 65 29 3e 3d 30  dr.sa, &size)>=0
146f0 20 29 7b 0a 20 20 20 20 20 20 67 65 74 6e 61 6d   ){.      getnam
14700 65 69 6e 66 6f 28 26 72 65 6d 6f 74 65 41 64 64  einfo(&remoteAdd
14710 72 2e 73 61 2c 20 73 69 7a 65 2c 20 7a 48 6f 73  r.sa, size, zHos
14720 74 2c 20 73 69 7a 65 6f 66 28 7a 48 6f 73 74 29  t, sizeof(zHost)
14730 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
14740 20 20 20 20 20 20 20 20 20 20 4e 49 5f 4e 55 4d            NI_NUM
14750 45 52 49 43 48 4f 53 54 29 3b 0a 20 20 20 20 20  ERICHOST);.     
14760 20 7a 52 65 6d 6f 74 65 41 64 64 72 20 3d 20 53   zRemoteAddr = S
14770 74 72 44 75 70 28 7a 48 6f 73 74 29 3b 0a 20 20  trDup(zHost);.  
14780 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 52    }.  }.  if( zR
14790 65 6d 6f 74 65 41 64 64 72 21 3d 30 0a 20 20 20  emoteAddr!=0.   
147a0 26 26 20 73 74 72 6e 63 6d 70 28 7a 52 65 6d 6f  && strncmp(zRemo
147b0 74 65 41 64 64 72 2c 20 22 3a 3a 66 66 66 66 3a  teAddr, "::ffff:
147c0 22 2c 20 37 29 3d 3d 30 0a 20 20 20 26 26 20 73  ", 7)==0.   && s
147d0 74 72 63 68 72 28 7a 52 65 6d 6f 74 65 41 64 64  trchr(zRemoteAdd
147e0 72 2b 37 2c 20 27 3a 27 29 3d 3d 30 0a 20 20 20  r+7, ':')==0.   
147f0 26 26 20 73 74 72 63 68 72 28 7a 52 65 6d 6f 74  && strchr(zRemot
14800 65 41 64 64 72 2b 37 2c 20 27 2e 27 29 21 3d 30  eAddr+7, '.')!=0
14810 0a 20 20 29 7b 0a 20 20 20 20 7a 52 65 6d 6f 74  .  ){.    zRemot
14820 65 41 64 64 72 20 2b 3d 20 37 3b 0a 20 20 7d 0a  eAddr += 7;.  }.
14830 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68  .  /* Process th
14840 65 20 69 6e 70 75 74 20 73 74 72 65 61 6d 20 2a  e input stream *
14850 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31  /.  for(i=0; i<1
14860 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 72  00; i++){.    Pr
14870 6f 63 65 73 73 4f 6e 65 52 65 71 75 65 73 74 28  ocessOneRequest(
14880 30 29 3b 0a 20 20 7d 0a 20 20 50 72 6f 63 65 73  0);.  }.  Proces
14890 73 4f 6e 65 52 65 71 75 65 73 74 28 31 29 3b 0a  sOneRequest(1);.
148a0 20 20 65 78 69 74 28 30 29 3b 0a 7d 0a 0a 23 69    exit(0);.}..#i
148b0 66 20 30 0a 2f 2a 20 43 6f 70 79 2f 70 61 73 74  f 0./* Copy/past
148c0 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  e the following 
148d0 74 65 78 74 20 69 6e 74 6f 20 53 51 4c 69 74 65  text into SQLite
148e0 20 74 6f 20 67 65 6e 65 72 61 74 65 20 74 68 65   to generate the
148f0 20 78 72 65 66 0a 2a 2a 20 74 61 62 6c 65 20 74   xref.** table t
14900 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61 6c  hat describes al
14910 6c 20 65 72 72 6f 72 20 63 6f 64 65 73 2e 0a 2a  l error codes..*
14920 2f 0a 42 45 47 49 4e 3b 0a 43 52 45 41 54 45 20  /.BEGIN;.CREATE 
14930 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49  TABLE IF NOT EXI
14940 53 54 53 20 78 72 65 66 28 6c 69 6e 65 6e 6f 20  STS xref(lineno 
14950 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
14960 4b 45 59 2c 20 64 65 73 63 20 54 45 58 54 29 3b  KEY, desc TEXT);
14970 0a 44 45 4c 45 54 45 20 46 52 4f 4d 20 58 72 65  .DELETE FROM Xre
14980 66 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  f;.INSERT INTO x
14990 72 65 66 20 56 41 4c 55 45 53 28 31 30 30 2c 27  ref VALUES(100,'
149a0 4d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 27  Malloc() failed'
149b0 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  );.INSERT INTO x
149c0 72 65 66 20 56 41 4c 55 45 53 28 31 31 30 2c 27  ref VALUES(110,'
149d0 4e 6f 74 20 61 75 74 68 6f 72 69 7a 65 64 27 29  Not authorized')
149e0 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72  ;.INSERT INTO xr
149f0 65 66 20 56 41 4c 55 45 53 28 31 32 30 2c 27 43  ef VALUES(120,'C
14a00 47 49 20 45 72 72 6f 72 27 29 3b 0a 49 4e 53 45  GI Error');.INSE
14a10 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
14a20 55 45 53 28 31 33 30 2c 27 54 69 6d 65 6f 75 74  UES(130,'Timeout
14a30 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
14a40 78 72 65 66 20 56 41 4c 55 45 53 28 31 34 30 2c  xref VALUES(140,
14a50 27 43 47 49 20 73 63 72 69 70 74 20 69 73 20 77  'CGI script is w
14a60 72 69 74 61 62 6c 65 27 29 3b 0a 49 4e 53 45 52  ritable');.INSER
14a70 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
14a80 45 53 28 31 35 30 2c 27 43 61 6e 6e 6f 74 20 6f  ES(150,'Cannot o
14a90 70 65 6e 20 2d 61 75 74 68 20 66 69 6c 65 27 29  pen -auth file')
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 31 36 30 2c 27 68  ef VALUES(160,'h
14ac0 74 74 70 20 72 65 71 75 65 73 74 20 6f 6e 20 68  ttp request on h
14ad0 74 74 70 73 2d 6f 6e 6c 79 20 70 61 67 65 27 29  ttps-only page')
14ae0 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72  ;.INSERT INTO xr
14af0 65 66 20 56 41 4c 55 45 53 28 31 37 30 2c 27 2d  ef VALUES(170,'-
14b00 61 75 74 68 20 72 65 64 69 72 65 63 74 27 29 3b  auth redirect');
14b10 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65  .INSERT INTO xre
14b20 66 20 56 41 4c 55 45 53 28 31 38 30 2c 27 6d 61  f VALUES(180,'ma
14b30 6c 66 6f 72 6d 65 64 20 65 6e 74 72 79 20 69 6e  lformed entry in
14b40 20 2d 61 75 74 68 20 66 69 6c 65 27 29 3b 0a 49   -auth file');.I
14b50 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
14b60 56 41 4c 55 45 53 28 31 39 30 2c 27 63 68 64 69  VALUES(190,'chdi
14b70 72 28 29 20 66 61 69 6c 65 64 27 29 3b 0a 49 4e  r() failed');.IN
14b80 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56  SERT INTO xref V
14b90 41 4c 55 45 53 28 32 30 30 2c 27 62 61 64 20 70  ALUES(200,'bad p
14ba0 72 6f 74 6f 63 6f 6c 20 69 6e 20 48 54 54 50 20  rotocol in HTTP 
14bb0 68 65 61 64 65 72 27 29 3b 0a 49 4e 53 45 52 54  header');.INSERT
14bc0 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45   INTO xref VALUE
14bd0 53 28 32 31 30 2c 27 45 6d 70 74 79 20 72 65 71  S(210,'Empty req
14be0 75 65 73 74 20 55 52 49 27 29 3b 0a 49 4e 53 45  uest URI');.INSE
14bf0 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
14c00 55 45 53 28 32 32 30 2c 27 55 6e 6b 6e 6f 77 6e  UES(220,'Unknown
14c10 20 72 65 71 75 65 73 74 20 6d 65 74 68 6f 64 27   request method'
14c20 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  );.INSERT INTO x
14c30 72 65 66 20 56 41 4c 55 45 53 28 32 33 30 2c 27  ref VALUES(230,'
14c40 52 65 66 65 72 72 65 72 20 69 73 20 64 65 76 69  Referrer is devi
14c50 64 73 2e 6e 65 74 27 29 3b 0a 49 4e 53 45 52 54  ds.net');.INSERT
14c60 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45   INTO xref VALUE
14c70 53 28 32 34 30 2c 27 49 6c 6c 65 67 61 6c 20 63  S(240,'Illegal c
14c80 6f 6e 74 65 6e 74 20 69 6e 20 48 4f 53 54 3a 20  ontent in HOST: 
14c90 70 61 72 61 6d 65 74 65 72 27 29 3b 0a 49 4e 53  parameter');.INS
14ca0 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41  ERT INTO xref VA
14cb0 4c 55 45 53 28 32 35 30 2c 27 44 69 73 61 6c 6c  LUES(250,'Disall
14cc0 6f 77 65 64 20 75 73 65 72 20 61 67 65 6e 74 27  owed user agent'
14cd0 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  );.INSERT INTO x
14ce0 72 65 66 20 56 41 4c 55 45 53 28 32 36 30 2c 27  ref VALUES(260,'
14cf0 44 69 73 61 6c 6c 6f 77 65 64 20 72 65 66 65 72  Disallowed refer
14d00 72 65 72 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  rer');.INSERT IN
14d10 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 32  TO xref VALUES(2
14d20 37 30 2c 27 52 65 71 75 65 73 74 20 74 6f 6f 20  70,'Request too 
14d30 6c 61 72 67 65 27 29 3b 0a 49 4e 53 45 52 54 20  large');.INSERT 
14d40 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53  INTO xref VALUES
14d50 28 32 38 30 2c 27 6d 6b 73 74 65 6d 70 28 29 20  (280,'mkstemp() 
14d60 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54  failed');.INSERT
14d70 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45   INTO xref VALUE
14d80 53 28 32 39 30 2c 27 63 61 6e 6e 6f 74 20 63 72  S(290,'cannot cr
14d90 65 61 74 65 20 74 65 6d 70 20 66 69 6c 65 20 66  eate temp file f
14da0 6f 72 20 50 4f 53 54 20 63 6f 6e 74 65 6e 74 27  or POST content'
14db0 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  );.INSERT INTO x
14dc0 72 65 66 20 56 41 4c 55 45 53 28 33 30 30 2c 27  ref VALUES(300,'
14dd0 50 61 74 68 20 65 6c 65 6d 65 6e 74 20 62 65 67  Path element beg
14de0 69 6e 73 20 77 69 74 68 20 2e 20 6f 72 20 2d 27  ins with . or -'
14df0 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  );.INSERT INTO x
14e00 72 65 66 20 56 41 4c 55 45 53 28 33 31 30 2c 27  ref VALUES(310,'
14e10 55 52 49 20 64 6f 65 73 20 6e 6f 74 20 73 74 61  URI does not sta
14e20 72 74 20 77 69 74 68 20 2f 27 29 3b 0a 49 4e 53  rt with /');.INS
14e30 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41  ERT INTO xref VA
14e40 4c 55 45 53 28 33 32 30 2c 27 55 52 49 20 74 6f  LUES(320,'URI to
14e50 6f 20 6c 6f 6e 67 27 29 3b 0a 49 4e 53 45 52 54  o long');.INSERT
14e60 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45   INTO xref VALUE
14e70 53 28 33 33 30 2c 27 4d 69 73 73 69 6e 67 20 48  S(330,'Missing H
14e80 4f 53 54 3a 20 70 61 72 61 6d 65 74 65 72 27 29  OST: parameter')
14e90 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72  ;.INSERT INTO xr
14ea0 65 66 20 56 41 4c 55 45 53 28 33 34 30 2c 27 48  ef VALUES(340,'H
14eb0 4f 53 54 20 70 61 72 61 6d 65 74 65 72 20 74 6f  OST parameter to
14ec0 6f 20 6c 6f 6e 67 27 29 3b 0a 49 4e 53 45 52 54  o long');.INSERT
14ed0 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45   INTO xref VALUE
14ee0 53 28 33 35 30 2c 27 2a 2e 77 65 62 73 69 74 65  S(350,'*.website
14ef0 20 70 65 72 6d 69 73 73 69 6f 6e 73 27 29 3b 0a   permissions');.
14f00 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66  INSERT INTO xref
14f10 20 56 41 4c 55 45 53 28 33 36 30 2c 27 63 68 64   VALUES(360,'chd
14f20 69 72 28 29 20 66 61 69 6c 65 64 27 29 3b 0a 49  ir() failed');.I
14f30 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
14f40 56 41 4c 55 45 53 28 33 37 30 2c 27 72 65 64 69  VALUES(370,'redi
14f50 72 65 63 74 20 74 6f 20 6e 6f 74 2d 66 6f 75 6e  rect to not-foun
14f60 64 20 70 61 67 65 27 29 3b 0a 49 4e 53 45 52 54  d page');.INSERT
14f70 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45   INTO xref VALUE
14f80 53 28 33 38 30 2c 27 55 52 49 20 6e 6f 74 20 66  S(380,'URI not f
14f90 6f 75 6e 64 27 29 3b 0a 49 4e 53 45 52 54 20 49  ound');.INSERT I
14fa0 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28  NTO xref VALUES(
14fb0 33 39 30 2c 27 46 69 6c 65 20 6e 6f 74 20 72 65  390,'File not re
14fc0 61 64 61 62 6c 65 27 29 3b 0a 49 4e 53 45 52 54  adable');.INSERT
14fd0 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45   INTO xref VALUE
14fe0 53 28 34 30 30 2c 27 55 52 49 20 69 73 20 61 20  S(400,'URI is a 
14ff0 64 69 72 65 63 74 6f 72 79 20 77 2f 6f 20 69 6e  directory w/o in
15000 64 65 78 2e 68 74 6d 6c 27 29 3b 0a 49 4e 53 45  dex.html');.INSE
15010 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
15020 55 45 53 28 34 31 30 2c 27 72 65 64 69 72 65 63  UES(410,'redirec
15030 74 20 74 6f 20 61 64 64 20 74 72 61 69 6c 69 6e  t to add trailin
15040 67 20 2f 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  g /');.INSERT IN
15050 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 34  TO xref VALUES(4
15060 32 30 2c 27 63 68 64 69 72 28 29 20 66 61 69 6c  20,'chdir() fail
15070 65 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54  ed');.INSERT INT
15080 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 34 33  O xref VALUES(43
15090 30 2c 27 64 75 70 28 30 29 20 66 61 69 6c 65 64  0,'dup(0) failed
150a0 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
150b0 78 72 65 66 20 56 41 4c 55 45 53 28 34 34 30 2c  xref VALUES(440,
150c0 27 70 69 70 65 28 29 20 66 61 69 6c 65 64 27 29  'pipe() failed')
150d0 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72  ;.INSERT INTO xr
150e0 65 66 20 56 41 4c 55 45 53 28 34 35 30 2c 27 64  ef VALUES(450,'d
150f0 75 70 28 31 29 20 66 61 69 6c 65 64 27 29 3b 0a  up(1) failed');.
15100 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66  INSERT INTO xref
15110 20 56 41 4c 55 45 53 28 34 36 30 2c 27 45 78 63   VALUES(460,'Exc
15120 65 73 73 20 55 52 49 20 63 6f 6e 74 65 6e 74 20  ess URI content 
15130 70 61 73 74 20 73 74 61 74 69 63 20 66 69 6c 65  past static file
15140 20 6e 61 6d 65 27 29 3b 0a 49 4e 53 45 52 54 20   name');.INSERT 
15150 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53  INTO xref VALUES
15160 28 34 37 30 2c 27 45 54 61 67 20 43 61 63 68 65  (470,'ETag Cache
15170 20 48 69 74 27 29 3b 0a 49 4e 53 45 52 54 20 49   Hit');.INSERT I
15180 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28  NTO xref VALUES(
15190 34 38 30 2c 27 66 6f 70 65 6e 28 29 20 66 61 69  480,'fopen() fai
151a0 6c 65 64 20 66 6f 72 20 73 74 61 74 69 63 20 63  led for static c
151b0 6f 6e 74 65 6e 74 27 29 3b 0a 49 4e 53 45 52 54  ontent');.INSERT
151c0 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45   INTO xref VALUE
151d0 53 28 32 2c 27 4e 6f 72 6d 61 6c 20 48 45 41 44  S(2,'Normal HEAD
151e0 20 72 65 70 6c 79 27 29 3b 0a 49 4e 53 45 52 54   reply');.INSERT
151f0 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45   INTO xref VALUE
15200 53 28 30 2c 27 4e 6f 72 6d 61 6c 20 72 65 70 6c  S(0,'Normal repl
15210 79 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f  y');.INSERT INTO
15220 20 78 72 65 66 20 56 41 4c 55 45 53 28 35 30 30   xref VALUES(500
15230 2c 27 75 6e 6b 6e 6f 77 6e 20 49 50 20 70 72 6f  ,'unknown IP pro
15240 74 6f 63 6f 6c 27 29 3b 0a 49 4e 53 45 52 54 20  tocol');.INSERT 
15250 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53  INTO xref VALUES
15260 28 35 30 31 2c 27 63 61 6e 6e 6f 74 20 6f 70 65  (501,'cannot ope
15270 6e 20 2d 2d 69 6e 70 75 74 20 66 69 6c 65 27 29  n --input file')
15280 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72  ;.INSERT INTO xr
15290 65 66 20 56 41 4c 55 45 53 28 35 31 30 2c 27 75  ef VALUES(510,'u
152a0 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64 2d 6c  nknown command-l
152b0 69 6e 65 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20  ine argument on 
152c0 6c 61 75 6e 63 68 27 29 3b 0a 49 4e 53 45 52 54  launch');.INSERT
152d0 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45   INTO xref VALUE
152e0 53 28 35 32 30 2c 27 2d 2d 72 6f 6f 74 20 61 72  S(520,'--root ar
152f0 67 75 6d 65 6e 74 20 6d 69 73 73 69 6e 67 27 29  gument missing')
15300 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72  ;.INSERT INTO xr
15310 65 66 20 56 41 4c 55 45 53 28 35 33 30 2c 27 63  ef VALUES(530,'c
15320 68 64 69 72 28 29 20 66 61 69 6c 65 64 27 29 3b  hdir() failed');
15330 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65  .INSERT INTO xre
15340 66 20 56 41 4c 55 45 53 28 35 34 30 2c 27 63 68  f VALUES(540,'ch
15350 72 6f 6f 74 28 29 20 66 61 69 6c 65 64 27 29 3b  root() failed');
15360 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65  .INSERT INTO xre
15370 66 20 56 41 4c 55 45 53 28 35 35 30 2c 27 73 65  f VALUES(550,'se
15380 72 76 65 72 20 73 74 61 72 74 75 70 20 66 61 69  rver startup fai
15390 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  led');.INSERT IN
153a0 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 35  TO xref VALUES(5
153b0 36 30 2c 27 73 65 74 67 69 64 28 29 20 66 61 69  60,'setgid() fai
153c0 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  led');.INSERT IN
153d0 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 35  TO xref VALUES(5
153e0 37 30 2c 27 73 65 74 75 69 64 28 29 20 66 61 69  70,'setuid() fai
153f0 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  led');.INSERT IN
15400 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 35  TO xref VALUES(5
15410 38 30 2c 27 75 6e 6b 6e 6f 77 6e 20 75 73 65 72  80,'unknown user
15420 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
15430 78 72 65 66 20 56 41 4c 55 45 53 28 35 39 30 2c  xref VALUES(590,
15440 27 63 61 6e 6e 6f 74 20 72 75 6e 20 61 73 20 72  'cannot run as r
15450 6f 6f 74 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  oot');.INSERT IN
15460 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 36  TO xref VALUES(6
15470 30 30 2c 27 6d 61 6c 6c 6f 63 28 29 20 66 61 69  00,'malloc() fai
15480 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  led');.INSERT IN
15490 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 36  TO xref VALUES(6
154a0 31 30 2c 27 6d 61 6c 6c 6f 63 28 29 20 66 61 69  10,'malloc() fai
154b0 6c 65 64 27 29 3b 0a 43 4f 4d 4d 49 54 3b 0a 23  led');.COMMIT;.#
154c0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 20 2a 2f 0a  endif /* SQL */.