Documentation Source Text

Hex Artifact Content
Login

Artifact 45d891467a0b45f8e5af3a427c5a43fa9b3d8f8ae2b59232c555019b630f3a25:


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 4c 53 20   generate a TLS 
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 69 53 74 61 74 75 73 2c 20 69 6e 74 20 66 69   iStatus, int fi
70d0: 6e 69 73 68 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f  nish, int lineno
70e0: 29 7b 0a 20 20 73 77 69 74 63 68 28 20 69 53 74  ){.  switch( iSt
70f0: 61 74 75 73 20 29 7b 0a 20 20 20 20 63 61 73 65  atus ){.    case
7100: 20 33 30 31 3a 0a 20 20 20 20 20 20 53 74 61 72   301:.      Star
7110: 74 52 65 73 70 6f 6e 73 65 28 22 33 30 31 20 50  tResponse("301 P
7120: 65 72 6d 61 6e 65 6e 74 20 52 65 64 69 72 65 63  ermanent Redirec
7130: 74 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  t");.      break
7140: 3b 0a 20 20 20 20 63 61 73 65 20 33 30 38 3a 0a  ;.    case 308:.
7150: 20 20 20 20 20 20 53 74 61 72 74 52 65 73 70 6f        StartRespo
7160: 6e 73 65 28 22 33 30 38 20 50 65 72 6d 61 6e 65  nse("308 Permane
7170: 6e 74 20 52 65 64 69 72 65 63 74 22 29 3b 0a 20  nt Redirect");. 
7180: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7190: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 53  default:.      S
71a0: 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 33 30  tartResponse("30
71b0: 32 20 54 65 6d 70 6f 72 61 72 79 20 52 65 64 69  2 Temporary Redi
71c0: 72 65 63 74 22 29 3b 0a 20 20 20 20 20 20 62 72  rect");.      br
71d0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 53 74 61 72 74  eak;.  }.  Start
71e0: 52 65 73 70 6f 6e 73 65 28 22 33 30 32 20 54 65  Response("302 Te
71f0: 6d 70 6f 72 61 72 79 20 52 65 64 69 72 65 63 74  mporary Redirect
7200: 22 29 3b 0a 20 20 69 66 28 20 7a 53 65 72 76 65  ");.  if( zServe
7210: 72 50 6f 72 74 3d 3d 30 20 7c 7c 20 7a 53 65 72  rPort==0 || zSer
7220: 76 65 72 50 6f 72 74 5b 30 5d 3d 3d 30 20 7c 7c  verPort[0]==0 ||
7230: 20 73 74 72 63 6d 70 28 7a 53 65 72 76 65 72 50   strcmp(zServerP
7240: 6f 72 74 2c 22 38 30 22 29 3d 3d 30 20 29 7b 0a  ort,"80")==0 ){.
7250: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
7260: 74 66 28 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73  tf("Location: %s
7270: 3a 2f 2f 25 73 25 73 25 73 5c 72 5c 6e 22 2c 0a  ://%s%s%s\r\n",.
7280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7290: 20 20 20 7a 48 74 74 70 2c 20 7a 53 65 72 76 65     zHttp, zServe
72a0: 72 4e 61 6d 65 2c 20 7a 50 61 74 68 2c 20 7a 51  rName, zPath, zQ
72b0: 75 65 72 79 53 75 66 66 69 78 29 3b 0a 20 20 7d  uerySuffix);.  }
72c0: 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 75 74 20 2b  else{.    nOut +
72d0: 3d 20 70 72 69 6e 74 66 28 22 4c 6f 63 61 74 69  = printf("Locati
72e0: 6f 6e 3a 20 25 73 3a 2f 2f 25 73 3a 25 73 25 73  on: %s://%s:%s%s
72f0: 25 73 5c 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %s\r\n",.       
7300: 20 20 20 20 20 20 20 20 20 20 20 20 7a 48 74 74              zHtt
7310: 70 2c 20 7a 53 65 72 76 65 72 4e 61 6d 65 2c 20  p, zServerName, 
7320: 7a 53 65 72 76 65 72 50 6f 72 74 2c 20 7a 50 61  zServerPort, zPa
7330: 74 68 2c 20 7a 51 75 65 72 79 53 75 66 66 69 78  th, zQuerySuffix
7340: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 69 6e  );.  }.  if( fin
7350: 69 73 68 20 29 7b 0a 20 20 20 20 6e 4f 75 74 20  ish ){.    nOut 
7360: 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 74 65  += printf("Conte
7370: 6e 74 2d 6c 65 6e 67 74 68 3a 20 30 5c 72 5c 6e  nt-length: 0\r\n
7380: 22 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20  ");.    nOut += 
7390: 70 72 69 6e 74 66 28 22 5c 72 5c 6e 22 29 3b 0a  printf("\r\n");.
73a0: 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79      MakeLogEntry
73b0: 28 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d  (0, lineno);.  }
73c0: 0a 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74  .  fflush(stdout
73d0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
73e0: 20 66 75 6e 63 74 69 6f 6e 20 74 72 65 61 74 73   function treats
73f0: 20 69 74 73 20 69 6e 70 75 74 20 61 73 20 61 20   its input as a 
7400: 62 61 73 65 2d 36 34 20 73 74 72 69 6e 67 20 61  base-64 string a
7410: 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  nd returns the.*
7420: 2a 20 64 65 63 6f 64 65 64 20 76 61 6c 75 65 20  * decoded value 
7430: 6f 66 20 74 68 61 74 20 73 74 72 69 6e 67 2e 20  of that string. 
7440: 20 43 68 61 72 61 63 74 65 72 73 20 6f 66 20 69   Characters of i
7450: 6e 70 75 74 20 74 68 61 74 20 61 72 65 20 6e 6f  nput that are no
7460: 74 0a 2a 2a 20 76 61 6c 69 64 20 62 61 73 65 2d  t.** valid base-
7470: 36 34 20 63 68 61 72 61 63 74 65 72 73 20 28 73  64 characters (s
7480: 75 63 68 20 61 73 20 73 70 61 63 65 73 20 61 6e  uch as spaces an
7490: 64 20 6e 65 77 6c 69 6e 65 73 29 20 61 72 65 20  d newlines) are 
74a0: 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64  ignored..*/.void
74b0: 20 44 65 63 6f 64 65 36 34 28 63 68 61 72 20 2a   Decode64(char *
74c0: 7a 36 34 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44  z64){.  char *zD
74d0: 61 74 61 3b 0a 20 20 69 6e 74 20 6e 36 34 3b 0a  ata;.  int n64;.
74e0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
74f0: 74 20 61 2c 20 62 2c 20 63 2c 20 64 3b 0a 20 20  t a, b, c, d;.  
7500: 73 74 61 74 69 63 20 69 6e 74 20 69 73 49 6e 69  static int isIni
7510: 74 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  t = 0;.  static 
7520: 69 6e 74 20 74 72 61 6e 73 5b 31 32 38 5d 3b 0a  int trans[128];.
7530: 20 20 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65    static unsigne
7540: 64 20 63 68 61 72 20 7a 42 61 73 65 5b 5d 20 3d  d char zBase[] =
7550: 20 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49   .    "ABCDEFGHI
7560: 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59  JKLMNOPQRSTUVWXY
7570: 5a 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  Zabcdefghijklmno
7580: 70 71 72 73 74 75 76 77 78 79 7a 30 31 32 33 34  pqrstuvwxyz01234
7590: 35 36 37 38 39 2b 2f 22 3b 0a 0a 20 20 69 66 28  56789+/";..  if(
75a0: 20 21 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20   !isInit ){.    
75b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20  for(i=0; i<128; 
75c0: 69 2b 2b 29 7b 20 74 72 61 6e 73 5b 69 5d 20 3d  i++){ trans[i] =
75d0: 20 30 3b 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d   0; }.    for(i=
75e0: 30 3b 20 7a 42 61 73 65 5b 69 5d 3b 20 69 2b 2b  0; zBase[i]; i++
75f0: 29 7b 20 74 72 61 6e 73 5b 7a 42 61 73 65 5b 69  ){ trans[zBase[i
7600: 5d 20 26 20 30 78 37 66 5d 20 3d 20 69 3b 20 7d  ] & 0x7f] = i; }
7610: 0a 20 20 20 20 69 73 49 6e 69 74 20 3d 20 31 3b  .    isInit = 1;
7620: 0a 20 20 7d 0a 20 20 6e 36 34 20 3d 20 73 74 72  .  }.  n64 = str
7630: 6c 65 6e 28 7a 36 34 29 3b 0a 20 20 77 68 69 6c  len(z64);.  whil
7640: 65 28 20 6e 36 34 3e 30 20 26 26 20 7a 36 34 5b  e( n64>0 && z64[
7650: 6e 36 34 2d 31 5d 3d 3d 27 3d 27 20 29 20 6e 36  n64-1]=='=' ) n6
7660: 34 2d 2d 3b 0a 20 20 7a 44 61 74 61 20 3d 20 7a  4--;.  zData = z
7670: 36 34 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  64;.  for(i=j=0;
7680: 20 69 2b 33 3c 6e 36 34 3b 20 69 2b 3d 34 29 7b   i+3<n64; i+=4){
7690: 0a 20 20 20 20 61 20 3d 20 74 72 61 6e 73 5b 7a  .    a = trans[z
76a0: 36 34 5b 69 5d 20 26 20 30 78 37 66 5d 3b 0a 20  64[i] & 0x7f];. 
76b0: 20 20 20 62 20 3d 20 74 72 61 6e 73 5b 7a 36 34     b = trans[z64
76c0: 5b 69 2b 31 5d 20 26 20 30 78 37 66 5d 3b 0a 20  [i+1] & 0x7f];. 
76d0: 20 20 20 63 20 3d 20 74 72 61 6e 73 5b 7a 36 34     c = trans[z64
76e0: 5b 69 2b 32 5d 20 26 20 30 78 37 66 5d 3b 0a 20  [i+2] & 0x7f];. 
76f0: 20 20 20 64 20 3d 20 74 72 61 6e 73 5b 7a 36 34     d = trans[z64
7700: 5b 69 2b 33 5d 20 26 20 30 78 37 66 5d 3b 0a 20  [i+3] & 0x7f];. 
7710: 20 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20     zData[j++] = 
7720: 28 28 61 3c 3c 32 29 20 26 20 30 78 66 63 29 20  ((a<<2) & 0xfc) 
7730: 7c 20 28 28 62 3e 3e 34 29 20 26 20 30 78 30 33  | ((b>>4) & 0x03
7740: 29 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b 2b  );.    zData[j++
7750: 5d 20 3d 20 28 28 62 3c 3c 34 29 20 26 20 30 78  ] = ((b<<4) & 0x
7760: 66 30 29 20 7c 20 28 28 63 3e 3e 32 29 20 26 20  f0) | ((c>>2) & 
7770: 30 78 30 66 29 3b 0a 20 20 20 20 7a 44 61 74 61  0x0f);.    zData
7780: 5b 6a 2b 2b 5d 20 3d 20 28 28 63 3c 3c 36 29 20  [j++] = ((c<<6) 
7790: 26 20 30 78 63 30 29 20 7c 20 28 64 20 26 20 30  & 0xc0) | (d & 0
77a0: 78 33 66 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  x3f);.  }.  if( 
77b0: 69 2b 32 3c 6e 36 34 20 29 7b 0a 20 20 20 20 61  i+2<n64 ){.    a
77c0: 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 5d 20   = trans[z64[i] 
77d0: 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 62 20 3d  & 0x7f];.    b =
77e0: 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b 31 5d 20   trans[z64[i+1] 
77f0: 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 63 20 3d  & 0x7f];.    c =
7800: 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b 32 5d 20   trans[z64[i+2] 
7810: 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 7a 44 61  & 0x7f];.    zDa
7820: 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28 61 3c 3c 32  ta[j++] = ((a<<2
7830: 29 20 26 20 30 78 66 63 29 20 7c 20 28 28 62 3e  ) & 0xfc) | ((b>
7840: 3e 34 29 20 26 20 30 78 30 33 29 3b 0a 20 20 20  >4) & 0x03);.   
7850: 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28   zData[j++] = ((
7860: 62 3c 3c 34 29 20 26 20 30 78 66 30 29 20 7c 20  b<<4) & 0xf0) | 
7870: 28 28 63 3e 3e 32 29 20 26 20 30 78 30 66 29 3b  ((c>>2) & 0x0f);
7880: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 2b 31  .  }else if( i+1
7890: 3c 6e 36 34 20 29 7b 0a 20 20 20 20 61 20 3d 20  <n64 ){.    a = 
78a0: 74 72 61 6e 73 5b 7a 36 34 5b 69 5d 20 26 20 30  trans[z64[i] & 0
78b0: 78 37 66 5d 3b 0a 20 20 20 20 62 20 3d 20 74 72  x7f];.    b = tr
78c0: 61 6e 73 5b 7a 36 34 5b 69 2b 31 5d 20 26 20 30  ans[z64[i+1] & 0
78d0: 78 37 66 5d 3b 0a 20 20 20 20 7a 44 61 74 61 5b  x7f];.    zData[
78e0: 6a 2b 2b 5d 20 3d 20 28 28 61 3c 3c 32 29 20 26  j++] = ((a<<2) &
78f0: 20 30 78 66 63 29 20 7c 20 28 28 62 3e 3e 34 29   0xfc) | ((b>>4)
7900: 20 26 20 30 78 30 33 29 3b 0a 20 20 7d 0a 20 20   & 0x03);.  }.  
7910: 7a 44 61 74 61 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a  zData[j] = 0;.}.
7920: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
7930: 73 65 65 20 69 66 20 62 61 73 69 63 20 61 75 74  see if basic aut
7940: 68 6f 72 69 7a 61 74 69 6f 6e 20 63 72 65 64 65  horization crede
7950: 6e 74 69 61 6c 73 20 61 72 65 20 70 72 6f 76 69  ntials are provi
7960: 64 65 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20 75  ded for.** the u
7970: 73 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ser according to
7980: 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
7990: 20 69 6e 20 7a 41 75 74 68 46 69 6c 65 2e 20 20   in zAuthFile.  
79a0: 52 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69  Return true.** i
79b0: 66 20 61 75 74 68 6f 72 69 7a 65 64 2e 20 20 52  f authorized.  R
79c0: 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 6e  eturn false if n
79d0: 6f 74 20 61 75 74 68 6f 72 69 7a 65 64 2e 0a 2a  ot authorized..*
79e0: 2a 0a 2a 2a 20 46 69 6c 65 20 66 6f 72 6d 61 74  *.** File format
79f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 42 6c  :.**.**    *  Bl
7a00: 61 6e 6b 20 6c 69 6e 65 73 20 61 6e 64 20 6c 69  ank lines and li
7a10: 6e 65 73 20 74 68 61 74 20 62 65 67 69 6e 20 77  nes that begin w
7a20: 69 74 68 20 27 23 27 20 61 72 65 20 69 67 6e 6f  ith '#' are igno
7a30: 72 65 64 0a 2a 2a 20 20 20 20 2a 20 20 22 68 74  red.**    *  "ht
7a40: 74 70 2d 72 65 64 69 72 65 63 74 22 20 66 6f 72  tp-redirect" for
7a50: 63 65 73 20 61 20 72 65 64 69 72 65 63 74 20 74  ces a redirect t
7a60: 6f 20 48 54 54 50 53 20 69 66 20 6e 6f 74 20 74  o HTTPS if not t
7a70: 68 65 72 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20  here already.** 
7a80: 20 20 20 2a 20 20 22 68 74 74 70 73 2d 6f 6e 6c     *  "https-onl
7a90: 79 22 20 64 69 73 61 6c 6c 6f 77 73 20 6f 70 65  y" disallows ope
7aa0: 72 61 74 69 6f 6e 20 69 6e 20 48 54 54 50 0a 2a  ration in HTTP.*
7ab0: 2a 20 20 20 20 2a 20 20 22 75 73 65 72 20 4e 41  *    *  "user NA
7ac0: 4d 45 20 4c 4f 47 49 4e 3a 50 41 53 53 57 4f 52  ME LOGIN:PASSWOR
7ad0: 44 22 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  D" checks to see
7ae0: 20 69 66 20 4c 4f 47 49 4e 3a 50 41 53 53 57 4f   if LOGIN:PASSWO
7af0: 52 44 20 0a 2a 2a 20 20 20 20 20 20 20 61 75 74  RD .**       aut
7b00: 68 6f 72 69 7a 61 74 69 6f 6e 20 63 72 65 64 65  horization crede
7b10: 6e 74 69 61 6c 73 20 61 72 65 20 70 72 6f 76 69  ntials are provi
7b20: 64 65 64 2c 20 61 6e 64 20 69 66 20 73 6f 20 73  ded, and if so s
7b30: 65 74 73 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ets the.**      
7b40: 20 52 45 4d 4f 54 45 5f 55 53 45 52 20 74 6f 20   REMOTE_USER to 
7b50: 4e 41 4d 45 2e 0a 2a 2a 20 20 20 20 2a 20 20 22  NAME..**    *  "
7b60: 72 65 61 6c 6d 20 54 45 58 54 22 20 73 65 74 73  realm TEXT" sets
7b70: 20 74 68 65 20 72 65 61 6c 6d 20 74 6f 20 54 45   the realm to TE
7b80: 58 54 2e 0a 2a 2a 20 20 20 20 2a 20 20 22 61 6e  XT..**    *  "an
7b90: 79 6f 6e 65 22 20 62 79 70 61 73 73 65 73 20 61  yone" bypasses a
7ba0: 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 61 6e  uthentication an
7bb0: 64 20 61 6c 6c 6f 77 73 20 61 6e 79 6f 6e 65 20  d allows anyone 
7bc0: 74 6f 20 73 65 65 20 74 68 65 0a 2a 2a 20 20 20  to see the.**   
7bd0: 20 20 20 20 66 69 6c 65 73 2e 20 20 55 73 65 66      files.  Usef
7be0: 75 6c 20 69 6e 20 63 6f 6d 62 69 6e 61 74 69 6f  ul in combinatio
7bf0: 6e 20 77 69 74 68 20 22 68 74 74 70 2d 72 65 64  n with "http-red
7c00: 69 72 65 63 74 22 0a 2a 2f 0a 73 74 61 74 69 63  irect".*/.static
7c10: 20 69 6e 74 20 43 68 65 63 6b 42 61 73 69 63 41   int CheckBasicA
7c20: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 28 63 6f 6e  uthorization(con
7c30: 73 74 20 63 68 61 72 20 2a 7a 41 75 74 68 46 69  st char *zAuthFi
7c40: 6c 65 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b  le){.  FILE *in;
7c50: 0a 20 20 63 68 61 72 20 2a 7a 52 65 61 6c 6d 20  .  char *zRealm 
7c60: 3d 20 22 75 6e 6b 6e 6f 77 6e 20 72 65 61 6c 6d  = "unknown realm
7c70: 22 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 67 69  ";.  char *zLogi
7c80: 6e 50 73 77 64 3b 0a 20 20 63 68 61 72 20 2a 7a  nPswd;.  char *z
7c90: 4e 61 6d 65 3b 0a 20 20 63 68 61 72 20 7a 4c 69  Name;.  char zLi
7ca0: 6e 65 5b 32 30 30 30 5d 3b 0a 0a 20 20 69 6e 20  ne[2000];..  in 
7cb0: 3d 20 66 6f 70 65 6e 28 7a 41 75 74 68 46 69 6c  = fopen(zAuthFil
7cc0: 65 2c 20 22 72 62 22 29 3b 0a 20 20 69 66 28 20  e, "rb");.  if( 
7cd0: 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 4e 6f 74  in==0 ){.    Not
7ce0: 46 6f 75 6e 64 28 31 35 30 29 3b 20 20 2f 2a 20  Found(150);  /* 
7cf0: 4c 4f 47 3a 20 43 61 6e 6e 6f 74 20 6f 70 65 6e  LOG: Cannot open
7d00: 20 2d 61 75 74 68 20 66 69 6c 65 20 2a 2f 0a 20   -auth file */. 
7d10: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7d20: 0a 20 20 69 66 28 20 7a 41 75 74 68 41 72 67 20  .  if( zAuthArg 
7d30: 29 20 44 65 63 6f 64 65 36 34 28 7a 41 75 74 68  ) Decode64(zAuth
7d40: 41 72 67 29 3b 0a 20 20 77 68 69 6c 65 28 20 66  Arg);.  while( f
7d50: 67 65 74 73 28 7a 4c 69 6e 65 2c 20 73 69 7a 65  gets(zLine, size
7d60: 6f 66 28 7a 4c 69 6e 65 29 2c 20 69 6e 29 20 29  of(zLine), in) )
7d70: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69 65  {.    char *zFie
7d80: 6c 64 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72  ldName;.    char
7d90: 20 2a 7a 56 61 6c 3b 0a 0a 20 20 20 20 7a 46 69   *zVal;..    zFi
7da0: 65 6c 64 4e 61 6d 65 20 3d 20 47 65 74 46 69 72  eldName = GetFir
7db0: 73 74 45 6c 65 6d 65 6e 74 28 7a 4c 69 6e 65 2c  stElement(zLine,
7dc0: 26 7a 56 61 6c 29 3b 0a 20 20 20 20 69 66 28 20  &zVal);.    if( 
7dd0: 7a 46 69 65 6c 64 4e 61 6d 65 3d 3d 30 20 7c 7c  zFieldName==0 ||
7de0: 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 3d 3d 30 20   *zFieldName==0 
7df0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7e00: 69 66 28 20 7a 46 69 65 6c 64 4e 61 6d 65 5b 30  if( zFieldName[0
7e10: 5d 3d 3d 27 23 27 20 29 20 63 6f 6e 74 69 6e 75  ]=='#' ) continu
7e20: 65 3b 0a 20 20 20 20 52 65 6d 6f 76 65 4e 65 77  e;.    RemoveNew
7e30: 6c 69 6e 65 28 7a 56 61 6c 29 3b 0a 20 20 20 20  line(zVal);.    
7e40: 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 65 6c  if( strcmp(zFiel
7e50: 64 4e 61 6d 65 2c 20 22 72 65 61 6c 6d 22 29 3d  dName, "realm")=
7e60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 61  =0 ){.      zRea
7e70: 6c 6d 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c  lm = StrDup(zVal
7e80: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
7e90: 20 73 74 72 63 6d 70 28 7a 46 69 65 6c 64 4e 61   strcmp(zFieldNa
7ea0: 6d 65 2c 22 75 73 65 72 22 29 3d 3d 30 20 29 7b  me,"user")==0 ){
7eb0: 0a 20 20 20 20 20 20 69 66 28 20 7a 41 75 74 68  .      if( zAuth
7ec0: 41 72 67 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Arg==0 ) continu
7ed0: 65 3b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  e;.      zName =
7ee0: 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74   GetFirstElement
7ef0: 28 7a 56 61 6c 2c 20 26 7a 56 61 6c 29 3b 0a 20  (zVal, &zVal);. 
7f00: 20 20 20 20 20 7a 4c 6f 67 69 6e 50 73 77 64 20       zLoginPswd 
7f10: 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e  = GetFirstElemen
7f20: 74 28 7a 56 61 6c 2c 20 26 7a 56 61 6c 29 3b 0a  t(zVal, &zVal);.
7f30: 20 20 20 20 20 20 69 66 28 20 7a 4c 6f 67 69 6e        if( zLogin
7f40: 50 73 77 64 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Pswd==0 ) contin
7f50: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41  ue;.      if( zA
7f60: 75 74 68 41 72 67 20 26 26 20 73 74 72 63 6d 70  uthArg && strcmp
7f70: 28 7a 41 75 74 68 41 72 67 2c 7a 4c 6f 67 69 6e  (zAuthArg,zLogin
7f80: 50 73 77 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Pswd)==0 ){.    
7f90: 20 20 20 20 7a 52 65 6d 6f 74 65 55 73 65 72 20      zRemoteUser 
7fa0: 3d 20 53 74 72 44 75 70 28 7a 4e 61 6d 65 29 3b  = StrDup(zName);
7fb0: 0a 20 20 20 20 20 20 20 20 66 63 6c 6f 73 65 28  .        fclose(
7fc0: 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  in);.        ret
7fd0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
7fe0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
7ff0: 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22  cmp(zFieldName,"
8000: 68 74 74 70 73 2d 6f 6e 6c 79 22 29 3d 3d 30 20  https-only")==0 
8010: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 75 73  ){.      if( !us
8020: 65 48 74 74 70 73 20 29 7b 0a 20 20 20 20 20 20  eHttps ){.      
8030: 20 20 4e 6f 74 46 6f 75 6e 64 28 31 36 30 29 3b    NotFound(160);
8040: 20 20 2f 2a 20 4c 4f 47 3a 20 20 68 74 74 70 20    /* LOG:  http 
8050: 72 65 71 75 65 73 74 20 6f 6e 20 68 74 74 70 73  request on https
8060: 2d 6f 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 20 20  -only page */.  
8070: 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29        fclose(in)
8080: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
8090: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
80a0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
80b0: 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 68 74 74  (zFieldName,"htt
80c0: 70 2d 72 65 64 69 72 65 63 74 22 29 3d 3d 30 20  p-redirect")==0 
80d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 75 73  ){.      if( !us
80e0: 65 48 74 74 70 73 20 29 7b 0a 20 20 20 20 20 20  eHttps ){.      
80f0: 20 20 7a 48 74 74 70 20 3d 20 22 68 74 74 70 73    zHttp = "https
8100: 22 3b 0a 20 20 20 20 20 20 20 20 52 65 64 69 72  ";.        Redir
8110: 65 63 74 28 7a 53 63 72 69 70 74 2c 20 33 30 31  ect(zScript, 301
8120: 2c 20 31 2c 20 31 37 30 29 3b 20 2f 2a 20 4c 4f  , 1, 170); /* LO
8130: 47 3a 20 2d 61 75 74 68 20 72 65 64 69 72 65 63  G: -auth redirec
8140: 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 63 6c  t */.        fcl
8150: 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 20  ose(in);.       
8160: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
8170: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
8180: 20 73 74 72 63 6d 70 28 7a 46 69 65 6c 64 4e 61   strcmp(zFieldNa
8190: 6d 65 2c 22 61 6e 79 6f 6e 65 22 29 3d 3d 30 20  me,"anyone")==0 
81a0: 29 7b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28  ){.      fclose(
81b0: 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  in);.      retur
81c0: 6e 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  n 1;.    }else{.
81d0: 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 31        NotFound(1
81e0: 38 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 20 6d  80);  /* LOG:  m
81f0: 61 6c 66 6f 72 6d 65 64 20 65 6e 74 72 79 20 69  alformed entry i
8200: 6e 20 2d 61 75 74 68 20 66 69 6c 65 20 2a 2f 0a  n -auth file */.
8210: 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29        fclose(in)
8220: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
8230: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 63  ;.    }.  }.  fc
8240: 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 4e 6f 74 41  lose(in);.  NotA
8250: 75 74 68 6f 72 69 7a 65 64 28 7a 52 65 61 6c 6d  uthorized(zRealm
8260: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
8270: 0a 0a 2f 2a 0a 2a 2a 20 47 75 65 73 73 20 74 68  ../*.** Guess th
8280: 65 20 6d 69 6d 65 2d 74 79 70 65 20 6f 66 20 61  e mime-type of a
8290: 20 64 6f 63 75 6d 65 6e 74 20 62 61 73 65 64 20   document based 
82a0: 6f 6e 20 69 74 73 20 6e 61 6d 65 2e 0a 2a 2f 0a  on its name..*/.
82b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 47 65 74 4d  const char *GetM
82c0: 69 6d 65 54 79 70 65 28 63 6f 6e 73 74 20 63 68  imeType(const ch
82d0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e  ar *zName, int n
82e0: 4e 61 6d 65 29 7b 0a 20 20 63 6f 6e 73 74 20 63  Name){.  const c
82f0: 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 69 3b  har *z;.  int i;
8300: 0a 20 20 69 6e 74 20 66 69 72 73 74 2c 20 6c 61  .  int first, la
8310: 73 74 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  st;.  int len;. 
8320: 20 63 68 61 72 20 7a 53 75 66 66 69 78 5b 32 30   char zSuffix[20
8330: 5d 3b 0a 0a 20 20 2f 2a 20 41 20 74 61 62 6c 65  ];..  /* A table
8340: 20 6f 66 20 6d 69 6d 65 74 79 70 65 73 20 62 61   of mimetypes ba
8350: 73 65 64 20 6f 6e 20 66 69 6c 65 20 73 75 66 66  sed on file suff
8360: 69 78 65 73 2e 20 0a 20 20 2a 2a 20 53 75 66 66  ixes. .  ** Suff
8370: 69 78 65 73 20 6d 75 73 74 20 62 65 20 69 6e 20  ixes must be in 
8380: 73 6f 72 74 65 64 20 6f 72 64 65 72 20 73 6f 20  sorted order so 
8390: 74 68 61 74 20 77 65 20 63 61 6e 20 64 6f 20 61  that we can do a
83a0: 20 62 69 6e 61 72 79 0a 20 20 2a 2a 20 73 65 61   binary.  ** sea
83b0: 72 63 68 20 74 6f 20 66 69 6e 64 20 74 68 65 20  rch to find the 
83c0: 6d 69 6d 65 2d 74 79 70 65 0a 20 20 2a 2f 0a 20  mime-type.  */. 
83d0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
83e0: 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ruct {.    const
83f0: 20 63 68 61 72 20 2a 7a 53 75 66 66 69 78 3b 20   char *zSuffix; 
8400: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
8410: 65 20 73 75 66 66 69 78 20 2a 2f 0a 20 20 20 20  e suffix */.    
8420: 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
8430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
8440: 6e 67 74 68 20 6f 66 20 74 68 65 20 73 75 66 66  ngth of the suff
8450: 69 78 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  ix */.    const 
8460: 63 68 61 72 20 2a 7a 4d 69 6d 65 74 79 70 65 3b  char *zMimetype;
8470: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 72 72       /* The corr
8480: 65 73 70 6f 6e 64 69 6e 67 20 6d 69 6d 65 74 79  esponding mimety
8490: 70 65 20 2a 2f 0a 20 20 7d 20 61 4d 69 6d 65 5b  pe */.  } aMime[
84a0: 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 61 69 22  ] = {.    { "ai"
84b0: 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70  ,         2, "ap
84c0: 70 6c 69 63 61 74 69 6f 6e 2f 70 6f 73 74 73 63  plication/postsc
84d0: 72 69 70 74 22 20 20 20 20 20 20 20 20 20 20 20  ript"           
84e0: 20 7d 2c 0a 20 20 20 20 7b 20 22 61 69 66 22 2c   },.    { "aif",
84f0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69          3, "audi
8500: 6f 2f 78 2d 61 69 66 66 22 20 20 20 20 20 20 20  o/x-aiff"       
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8520: 2c 0a 20 20 20 20 7b 20 22 61 69 66 63 22 2c 20  ,.    { "aifc", 
8530: 20 20 20 20 20 20 34 2c 20 22 61 75 64 69 6f 2f        4, "audio/
8540: 78 2d 61 69 66 66 22 20 20 20 20 20 20 20 20 20  x-aiff"         
8550: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
8560: 20 20 20 20 7b 20 22 61 69 66 66 22 2c 20 20 20      { "aiff",   
8570: 20 20 20 20 34 2c 20 22 61 75 64 69 6f 2f 78 2d      4, "audio/x-
8580: 61 69 66 66 22 20 20 20 20 20 20 20 20 20 20 20  aiff"           
8590: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
85a0: 20 20 7b 20 22 61 72 6a 22 2c 20 20 20 20 20 20    { "arj",      
85b0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
85c0: 6e 2f 78 2d 61 72 6a 2d 63 6f 6d 70 72 65 73 73  n/x-arj-compress
85d0: 65 64 22 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  ed"      },.    
85e0: 7b 20 22 61 73 63 22 2c 20 20 20 20 20 20 20 20  { "asc",        
85f0: 33 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20  3, "text/plain" 
8600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8610: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8620: 22 61 73 66 22 2c 20 20 20 20 20 20 20 20 33 2c  "asf",        3,
8630: 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 61 73 66   "video/x-ms-asf
8640: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8650: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61       },.    { "a
8660: 73 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  sx",        3, "
8670: 76 69 64 65 6f 2f 78 2d 6d 73 2d 61 73 78 22 20  video/x-ms-asx" 
8680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8690: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 75 22     },.    { "au"
86a0: 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 75  ,         2, "au
86b0: 64 69 6f 2f 75 6c 61 77 22 20 20 20 20 20 20 20  dio/ulaw"       
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86d0: 20 7d 2c 0a 20 20 20 20 7b 20 22 61 76 69 22 2c   },.    { "avi",
86e0: 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64 65          3, "vide
86f0: 6f 2f 78 2d 6d 73 76 69 64 65 6f 22 20 20 20 20  o/x-msvideo"    
8700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8710: 2c 0a 20 20 20 20 7b 20 22 62 61 74 22 2c 20 20  ,.    { "bat",  
8720: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
8730: 61 74 69 6f 6e 2f 78 2d 6d 73 64 6f 73 2d 70 72  ation/x-msdos-pr
8740: 6f 67 72 61 6d 22 20 20 20 20 20 20 20 7d 2c 0a  ogram"       },.
8750: 20 20 20 20 7b 20 22 62 63 70 69 6f 22 2c 20 20      { "bcpio",  
8760: 20 20 20 20 35 2c 20 22 61 70 70 6c 69 63 61 74      5, "applicat
8770: 69 6f 6e 2f 78 2d 62 63 70 69 6f 22 20 20 20 20  ion/x-bcpio"    
8780: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8790: 20 20 7b 20 22 62 69 6e 22 2c 20 20 20 20 20 20    { "bin",      
87a0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
87b0: 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22 20  n/octet-stream" 
87c0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
87d0: 7b 20 22 63 22 2c 20 20 20 20 20 20 20 20 20 20  { "c",          
87e0: 31 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20  1, "text/plain" 
87f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8800: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8810: 22 63 63 22 2c 20 20 20 20 20 20 20 20 20 32 2c  "cc",         2,
8820: 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20 20   "text/plain"   
8830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8840: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63       },.    { "c
8850: 63 61 64 22 2c 20 20 20 20 20 20 20 34 2c 20 22  cad",       4, "
8860: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 63 6c 61 72  application/clar
8870: 69 73 63 61 64 22 20 20 20 20 20 20 20 20 20 20  iscad"          
8880: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 64 66     },.    { "cdf
8890: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
88a0: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6e 65 74 63  plication/x-netc
88b0: 64 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20  df"             
88c0: 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6c 61 73 73   },.    { "class
88d0: 22 2c 20 20 20 20 20 20 35 2c 20 22 61 70 70 6c  ",      5, "appl
88e0: 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74  ication/octet-st
88f0: 72 65 61 6d 22 20 20 20 20 20 20 20 20 20 20 7d  ream"          }
8900: 2c 0a 20 20 20 20 7b 20 22 63 6f 64 22 2c 20 20  ,.    { "cod",  
8910: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
8920: 61 74 69 6f 6e 2f 76 6e 64 2e 72 69 6d 2e 63 6f  ation/vnd.rim.co
8930: 64 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  d"           },.
8940: 20 20 20 20 7b 20 22 63 6f 6d 22 2c 20 20 20 20      { "com",    
8950: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
8960: 69 6f 6e 2f 78 2d 6d 73 64 6f 73 2d 70 72 6f 67  ion/x-msdos-prog
8970: 72 61 6d 22 20 20 20 20 20 20 20 7d 2c 0a 20 20  ram"       },.  
8980: 20 20 7b 20 22 63 70 69 6f 22 2c 20 20 20 20 20    { "cpio",     
8990: 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    4, "applicatio
89a0: 6e 2f 78 2d 63 70 69 6f 22 20 20 20 20 20 20 20  n/x-cpio"       
89b0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
89c0: 7b 20 22 63 70 74 22 2c 20 20 20 20 20 20 20 20  { "cpt",        
89d0: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
89e0: 6d 61 63 2d 63 6f 6d 70 61 63 74 70 72 6f 22 20  mac-compactpro" 
89f0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8a00: 22 63 73 68 22 2c 20 20 20 20 20 20 20 20 33 2c  "csh",        3,
8a10: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
8a20: 63 73 68 22 20 20 20 20 20 20 20 20 20 20 20 20  csh"            
8a30: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63       },.    { "c
8a40: 73 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ss",        3, "
8a50: 74 65 78 74 2f 63 73 73 22 20 20 20 20 20 20 20  text/css"       
8a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a70: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 63 72     },.    { "dcr
8a80: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
8a90: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 64 69 72 65  plication/x-dire
8aa0: 63 74 6f 72 22 20 20 20 20 20 20 20 20 20 20 20  ctor"           
8ab0: 20 7d 2c 0a 20 20 20 20 7b 20 22 64 65 62 22 2c   },.    { "deb",
8ac0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
8ad0: 69 63 61 74 69 6f 6e 2f 78 2d 64 65 62 69 61 6e  ication/x-debian
8ae0: 2d 70 61 63 6b 61 67 65 22 20 20 20 20 20 20 7d  -package"      }
8af0: 2c 0a 20 20 20 20 7b 20 22 64 69 72 22 2c 20 20  ,.    { "dir",  
8b00: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
8b10: 61 74 69 6f 6e 2f 78 2d 64 69 72 65 63 74 6f 72  ation/x-director
8b20: 22 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  "            },.
8b30: 20 20 20 20 7b 20 22 64 6c 22 2c 20 20 20 20 20      { "dl",     
8b40: 20 20 20 20 32 2c 20 22 76 69 64 65 6f 2f 64 6c      2, "video/dl
8b50: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8b60: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8b70: 20 20 7b 20 22 64 6d 73 22 2c 20 20 20 20 20 20    { "dms",      
8b80: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
8b90: 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22 20  n/octet-stream" 
8ba0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
8bb0: 7b 20 22 64 6f 63 22 2c 20 20 20 20 20 20 20 20  { "doc",        
8bc0: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
8bd0: 6d 73 77 6f 72 64 22 20 20 20 20 20 20 20 20 20  msword"         
8be0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8bf0: 22 64 72 77 22 2c 20 20 20 20 20 20 20 20 33 2c  "drw",        3,
8c00: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 64 72   "application/dr
8c10: 61 66 74 69 6e 67 22 20 20 20 20 20 20 20 20 20  afting"         
8c20: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64       },.    { "d
8c30: 76 69 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  vi",        3, "
8c40: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 64 76  application/x-dv
8c50: 69 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i"              
8c60: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 77 67     },.    { "dwg
8c70: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
8c80: 70 6c 69 63 61 74 69 6f 6e 2f 61 63 61 64 22 20  plication/acad" 
8c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ca0: 20 7d 2c 0a 20 20 20 20 7b 20 22 64 78 66 22 2c   },.    { "dxf",
8cb0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
8cc0: 69 63 61 74 69 6f 6e 2f 64 78 66 22 20 20 20 20  ication/dxf"    
8cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8ce0: 2c 0a 20 20 20 20 7b 20 22 64 78 72 22 2c 20 20  ,.    { "dxr",  
8cf0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
8d00: 61 74 69 6f 6e 2f 78 2d 64 69 72 65 63 74 6f 72  ation/x-director
8d10: 22 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  "            },.
8d20: 20 20 20 20 7b 20 22 65 70 73 22 2c 20 20 20 20      { "eps",    
8d30: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
8d40: 69 6f 6e 2f 70 6f 73 74 73 63 72 69 70 74 22 20  ion/postscript" 
8d50: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8d60: 20 20 7b 20 22 65 74 78 22 2c 20 20 20 20 20 20    { "etx",      
8d70: 20 20 33 2c 20 22 74 65 78 74 2f 78 2d 73 65 74    3, "text/x-set
8d80: 65 78 74 22 20 20 20 20 20 20 20 20 20 20 20 20  ext"            
8d90: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
8da0: 7b 20 22 65 78 65 22 2c 20 20 20 20 20 20 20 20  { "exe",        
8db0: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
8dc0: 6f 63 74 65 74 2d 73 74 72 65 61 6d 22 20 20 20  octet-stream"   
8dd0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8de0: 22 65 7a 22 2c 20 20 20 20 20 20 20 20 20 32 2c  "ez",         2,
8df0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 61 6e   "application/an
8e00: 64 72 65 77 2d 69 6e 73 65 74 22 20 20 20 20 20  drew-inset"     
8e10: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66       },.    { "f
8e20: 22 2c 20 20 20 20 20 20 20 20 20 20 31 2c 20 22  ",          1, "
8e30: 74 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20 20  text/plain"     
8e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e50: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66 39 30     },.    { "f90
8e60: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65  ",        3, "te
8e70: 78 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20  xt/plain"       
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e90: 20 7d 2c 0a 20 20 20 20 7b 20 22 66 6c 69 22 2c   },.    { "fli",
8ea0: 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64 65          3, "vide
8eb0: 6f 2f 66 6c 69 22 20 20 20 20 20 20 20 20 20 20  o/fli"          
8ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8ed0: 2c 0a 20 20 20 20 7b 20 22 66 6c 76 22 2c 20 20  ,.    { "flv",  
8ee0: 20 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f        3, "video/
8ef0: 66 6c 76 22 20 20 20 20 20 20 20 20 20 20 20 20  flv"            
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
8f10: 20 20 20 20 7b 20 22 67 69 66 22 2c 20 20 20 20      { "gif",    
8f20: 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 67 69      3, "image/gi
8f30: 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f"              
8f40: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8f50: 20 20 7b 20 22 67 6c 22 2c 20 20 20 20 20 20 20    { "gl",       
8f60: 20 20 32 2c 20 22 76 69 64 65 6f 2f 67 6c 22 20    2, "video/gl" 
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f80: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
8f90: 7b 20 22 67 74 61 72 22 2c 20 20 20 20 20 20 20  { "gtar",       
8fa0: 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  4, "application/
8fb0: 78 2d 67 74 61 72 22 20 20 20 20 20 20 20 20 20  x-gtar"         
8fc0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8fd0: 22 67 7a 22 2c 20 20 20 20 20 20 20 20 20 32 2c  "gz",         2,
8fe0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
8ff0: 67 7a 69 70 22 20 20 20 20 20 20 20 20 20 20 20  gzip"           
9000: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68       },.    { "h
9010: 64 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  df",        3, "
9020: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 68 64  application/x-hd
9030: 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f"              
9040: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68 68 22     },.    { "hh"
9050: 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 74 65  ,         2, "te
9060: 78 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20  xt/plain"       
9070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9080: 20 7d 2c 0a 20 20 20 20 7b 20 22 68 71 78 22 2c   },.    { "hqx",
9090: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
90a0: 69 63 61 74 69 6f 6e 2f 6d 61 63 2d 62 69 6e 68  ication/mac-binh
90b0: 65 78 34 30 22 20 20 20 20 20 20 20 20 20 20 7d  ex40"          }
90c0: 2c 0a 20 20 20 20 7b 20 22 68 22 2c 20 20 20 20  ,.    { "h",    
90d0: 20 20 20 20 20 20 31 2c 20 22 74 65 78 74 2f 70        1, "text/p
90e0: 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20 20 20  lain"           
90f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
9100: 20 20 20 20 7b 20 22 68 74 6d 22 2c 20 20 20 20      { "htm",    
9110: 20 20 20 20 33 2c 20 22 74 65 78 74 2f 68 74 6d      3, "text/htm
9120: 6c 3b 20 63 68 61 72 73 65 74 3d 75 74 66 2d 38  l; charset=utf-8
9130: 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  "          },.  
9140: 20 20 7b 20 22 68 74 6d 6c 22 2c 20 20 20 20 20    { "html",     
9150: 20 20 34 2c 20 22 74 65 78 74 2f 68 74 6d 6c 3b    4, "text/html;
9160: 20 63 68 61 72 73 65 74 3d 75 74 66 2d 38 22 20   charset=utf-8" 
9170: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9180: 7b 20 22 69 63 65 22 2c 20 20 20 20 20 20 20 20  { "ice",        
9190: 33 2c 20 22 78 2d 63 6f 6e 66 65 72 65 6e 63 65  3, "x-conference
91a0: 2f 78 2d 63 6f 6f 6c 74 61 6c 6b 22 20 20 20 20  /x-cooltalk"    
91b0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
91c0: 22 69 65 66 22 2c 20 20 20 20 20 20 20 20 33 2c  "ief",        3,
91d0: 20 22 69 6d 61 67 65 2f 69 65 66 22 20 20 20 20   "image/ief"    
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91f0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69       },.    { "i
9200: 67 65 73 22 2c 20 20 20 20 20 20 20 34 2c 20 22  ges",       4, "
9210: 6d 6f 64 65 6c 2f 69 67 65 73 22 20 20 20 20 20  model/iges"     
9220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9230: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 67 73     },.    { "igs
9240: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 6d 6f  ",        3, "mo
9250: 64 65 6c 2f 69 67 65 73 22 20 20 20 20 20 20 20  del/iges"       
9260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9270: 20 7d 2c 0a 20 20 20 20 7b 20 22 69 70 73 22 2c   },.    { "ips",
9280: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
9290: 69 63 61 74 69 6f 6e 2f 78 2d 69 70 73 63 72 69  ication/x-ipscri
92a0: 70 74 22 20 20 20 20 20 20 20 20 20 20 20 20 7d  pt"            }
92b0: 2c 0a 20 20 20 20 7b 20 22 69 70 78 22 2c 20 20  ,.    { "ipx",  
92c0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
92d0: 61 74 69 6f 6e 2f 78 2d 69 70 69 78 22 20 20 20  ation/x-ipix"   
92e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
92f0: 20 20 20 20 7b 20 22 6a 61 64 22 2c 20 20 20 20      { "jad",    
9300: 20 20 20 20 33 2c 20 22 74 65 78 74 2f 76 6e 64      3, "text/vnd
9310: 2e 73 75 6e 2e 6a 32 6d 65 2e 61 70 70 2d 64 65  .sun.j2me.app-de
9320: 73 63 72 69 70 74 6f 72 22 20 20 7d 2c 0a 20 20  scriptor"  },.  
9330: 20 20 7b 20 22 6a 61 72 22 2c 20 20 20 20 20 20    { "jar",      
9340: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
9350: 6e 2f 6a 61 76 61 2d 61 72 63 68 69 76 65 22 20  n/java-archive" 
9360: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9370: 7b 20 22 6a 70 65 67 22 2c 20 20 20 20 20 20 20  { "jpeg",       
9380: 34 2c 20 22 69 6d 61 67 65 2f 6a 70 65 67 22 20  4, "image/jpeg" 
9390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93a0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
93b0: 22 6a 70 65 22 2c 20 20 20 20 20 20 20 20 33 2c  "jpe",        3,
93c0: 20 22 69 6d 61 67 65 2f 6a 70 65 67 22 20 20 20   "image/jpeg"   
93d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93e0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a       },.    { "j
93f0: 70 67 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  pg",        3, "
9400: 69 6d 61 67 65 2f 6a 70 65 67 22 20 20 20 20 20  image/jpeg"     
9410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9420: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 22     },.    { "js"
9430: 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70  ,         2, "ap
9440: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6a 61 76 61  plication/x-java
9450: 73 63 72 69 70 74 22 20 20 20 20 20 20 20 20 20  script"         
9460: 20 7d 2c 0a 20 20 20 20 7b 20 22 6b 61 72 22 2c   },.    { "kar",
9470: 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69          3, "audi
9480: 6f 2f 6d 69 64 69 22 20 20 20 20 20 20 20 20 20  o/midi"         
9490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
94a0: 2c 0a 20 20 20 20 7b 20 22 6c 61 74 65 78 22 2c  ,.    { "latex",
94b0: 20 20 20 20 20 20 35 2c 20 22 61 70 70 6c 69 63        5, "applic
94c0: 61 74 69 6f 6e 2f 78 2d 6c 61 74 65 78 22 20 20  ation/x-latex"  
94d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
94e0: 20 20 20 20 7b 20 22 6c 68 61 22 2c 20 20 20 20      { "lha",    
94f0: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
9500: 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d  ion/octet-stream
9510: 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  "          },.  
9520: 20 20 7b 20 22 6c 73 70 22 2c 20 20 20 20 20 20    { "lsp",      
9530: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
9540: 6e 2f 78 2d 6c 69 73 70 22 20 20 20 20 20 20 20  n/x-lisp"       
9550: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9560: 7b 20 22 6c 7a 68 22 2c 20 20 20 20 20 20 20 20  { "lzh",        
9570: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
9580: 6f 63 74 65 74 2d 73 74 72 65 61 6d 22 20 20 20  octet-stream"   
9590: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
95a0: 22 6d 22 2c 20 20 20 20 20 20 20 20 20 20 31 2c  "m",          1,
95b0: 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20 20   "text/plain"   
95c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95d0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d       },.    { "m
95e0: 33 75 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  3u",        3, "
95f0: 61 75 64 69 6f 2f 78 2d 6d 70 65 67 75 72 6c 22  audio/x-mpegurl"
9600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9610: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 61 6e     },.    { "man
9620: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
9630: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72 6f 66  plication/x-trof
9640: 66 2d 6d 61 6e 22 20 20 20 20 20 20 20 20 20 20  f-man"          
9650: 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 65 22 2c 20   },.    { "me", 
9660: 20 20 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c          2, "appl
9670: 69 63 61 74 69 6f 6e 2f 78 2d 74 72 6f 66 66 2d  ication/x-troff-
9680: 6d 65 22 20 20 20 20 20 20 20 20 20 20 20 20 7d  me"            }
9690: 2c 0a 20 20 20 20 7b 20 22 6d 65 73 68 22 2c 20  ,.    { "mesh", 
96a0: 20 20 20 20 20 20 34 2c 20 22 6d 6f 64 65 6c 2f        4, "model/
96b0: 6d 65 73 68 22 20 20 20 20 20 20 20 20 20 20 20  mesh"           
96c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
96d0: 20 20 20 20 7b 20 22 6d 69 64 22 2c 20 20 20 20      { "mid",    
96e0: 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 6d 69      3, "audio/mi
96f0: 64 69 22 20 20 20 20 20 20 20 20 20 20 20 20 20  di"             
9700: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
9710: 20 20 7b 20 22 6d 69 64 69 22 2c 20 20 20 20 20    { "midi",     
9720: 20 20 34 2c 20 22 61 75 64 69 6f 2f 6d 69 64 69    4, "audio/midi
9730: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9740: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9750: 7b 20 22 6d 69 66 22 2c 20 20 20 20 20 20 20 20  { "mif",        
9760: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
9770: 78 2d 6d 69 66 22 20 20 20 20 20 20 20 20 20 20  x-mif"          
9780: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
9790: 22 6d 69 6d 65 22 2c 20 20 20 20 20 20 20 34 2c  "mime",       4,
97a0: 20 22 77 77 77 2f 6d 69 6d 65 22 20 20 20 20 20   "www/mime"     
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97c0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d       },.    { "m
97d0: 6f 76 69 65 22 2c 20 20 20 20 20 20 35 2c 20 22  ovie",      5, "
97e0: 76 69 64 65 6f 2f 78 2d 73 67 69 2d 6d 6f 76 69  video/x-sgi-movi
97f0: 65 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e"              
9800: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 6f 76     },.    { "mov
9810: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69  ",        3, "vi
9820: 64 65 6f 2f 71 75 69 63 6b 74 69 6d 65 22 20 20  deo/quicktime"  
9830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9840: 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 32 22 2c   },.    { "mp2",
9850: 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69          3, "audi
9860: 6f 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20 20  o/mpeg"         
9870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
9880: 2c 0a 20 20 20 20 7b 20 22 6d 70 32 22 2c 20 20  ,.    { "mp2",  
9890: 20 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f        3, "video/
98a0: 6d 70 65 67 22 20 20 20 20 20 20 20 20 20 20 20  mpeg"           
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
98c0: 20 20 20 20 7b 20 22 6d 70 33 22 2c 20 20 20 20      { "mp3",    
98d0: 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 6d 70      3, "audio/mp
98e0: 65 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20  eg"             
98f0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
9900: 20 20 7b 20 22 6d 70 65 67 22 2c 20 20 20 20 20    { "mpeg",     
9910: 20 20 34 2c 20 22 76 69 64 65 6f 2f 6d 70 65 67    4, "video/mpeg
9920: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9930: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9940: 7b 20 22 6d 70 65 22 2c 20 20 20 20 20 20 20 20  { "mpe",        
9950: 33 2c 20 22 76 69 64 65 6f 2f 6d 70 65 67 22 20  3, "video/mpeg" 
9960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9970: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
9980: 22 6d 70 67 61 22 2c 20 20 20 20 20 20 20 34 2c  "mpga",       4,
9990: 20 22 61 75 64 69 6f 2f 6d 70 65 67 22 20 20 20   "audio/mpeg"   
99a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99b0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d       },.    { "m
99c0: 70 67 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  pg",        3, "
99d0: 76 69 64 65 6f 2f 6d 70 65 67 22 20 20 20 20 20  video/mpeg"     
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99f0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 73 22     },.    { "ms"
9a00: 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70  ,         2, "ap
9a10: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72 6f 66  plication/x-trof
9a20: 66 2d 6d 73 22 20 20 20 20 20 20 20 20 20 20 20  f-ms"           
9a30: 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 73 68 22 2c   },.    { "msh",
9a40: 20 20 20 20 20 20 20 20 33 2c 20 22 6d 6f 64 65          3, "mode
9a50: 6c 2f 6d 65 73 68 22 20 20 20 20 20 20 20 20 20  l/mesh"         
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
9a70: 2c 0a 20 20 20 20 7b 20 22 6e 63 22 2c 20 20 20  ,.    { "nc",   
9a80: 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63        2, "applic
9a90: 61 74 69 6f 6e 2f 78 2d 6e 65 74 63 64 66 22 20  ation/x-netcdf" 
9aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
9ab0: 20 20 20 20 7b 20 22 6f 64 61 22 2c 20 20 20 20      { "oda",    
9ac0: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
9ad0: 69 6f 6e 2f 6f 64 61 22 20 20 20 20 20 20 20 20  ion/oda"        
9ae0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
9af0: 20 20 7b 20 22 6f 67 67 22 2c 20 20 20 20 20 20    { "ogg",      
9b00: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
9b10: 6e 2f 6f 67 67 22 20 20 20 20 20 20 20 20 20 20  n/ogg"          
9b20: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9b30: 7b 20 22 6f 67 6d 22 2c 20 20 20 20 20 20 20 20  { "ogm",        
9b40: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
9b50: 6f 67 67 22 20 20 20 20 20 20 20 20 20 20 20 20  ogg"            
9b60: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
9b70: 22 70 62 6d 22 2c 20 20 20 20 20 20 20 20 33 2c  "pbm",        3,
9b80: 20 22 69 6d 61 67 65 2f 78 2d 70 6f 72 74 61 62   "image/x-portab
9b90: 6c 65 2d 62 69 74 6d 61 70 22 20 20 20 20 20 20  le-bitmap"      
9ba0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70       },.    { "p
9bb0: 64 62 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  db",        3, "
9bc0: 63 68 65 6d 69 63 61 6c 2f 78 2d 70 64 62 22 20  chemical/x-pdb" 
9bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9be0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 64 66     },.    { "pdf
9bf0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
9c00: 70 6c 69 63 61 74 69 6f 6e 2f 70 64 66 22 20 20  plication/pdf"  
9c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c20: 20 7d 2c 0a 20 20 20 20 7b 20 22 70 67 6d 22 2c   },.    { "pgm",
9c30: 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67          3, "imag
9c40: 65 2f 78 2d 70 6f 72 74 61 62 6c 65 2d 67 72 61  e/x-portable-gra
9c50: 79 6d 61 70 22 20 20 20 20 20 20 20 20 20 20 7d  ymap"          }
9c60: 2c 0a 20 20 20 20 7b 20 22 70 67 6e 22 2c 20 20  ,.    { "pgn",  
9c70: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
9c80: 61 74 69 6f 6e 2f 78 2d 63 68 65 73 73 2d 70 67  ation/x-chess-pg
9c90: 6e 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  n"           },.
9ca0: 20 20 20 20 7b 20 22 70 67 70 22 2c 20 20 20 20      { "pgp",    
9cb0: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
9cc0: 69 6f 6e 2f 70 67 70 22 20 20 20 20 20 20 20 20  ion/pgp"        
9cd0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
9ce0: 20 20 7b 20 22 70 6c 22 2c 20 20 20 20 20 20 20    { "pl",       
9cf0: 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    2, "applicatio
9d00: 6e 2f 78 2d 70 65 72 6c 22 20 20 20 20 20 20 20  n/x-perl"       
9d10: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9d20: 7b 20 22 70 6d 22 2c 20 20 20 20 20 20 20 20 20  { "pm",         
9d30: 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  2, "application/
9d40: 78 2d 70 65 72 6c 22 20 20 20 20 20 20 20 20 20  x-perl"         
9d50: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
9d60: 22 70 6e 67 22 2c 20 20 20 20 20 20 20 20 33 2c  "png",        3,
9d70: 20 22 69 6d 61 67 65 2f 70 6e 67 22 20 20 20 20   "image/png"    
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d90: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70       },.    { "p
9da0: 6e 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  nm",        3, "
9db0: 69 6d 61 67 65 2f 78 2d 70 6f 72 74 61 62 6c 65  image/x-portable
9dc0: 2d 61 6e 79 6d 61 70 22 20 20 20 20 20 20 20 20  -anymap"        
9dd0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 6f 74     },.    { "pot
9de0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
9df0: 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 70 6f 77 65  plication/mspowe
9e00: 72 70 6f 69 6e 74 22 20 20 20 20 20 20 20 20 20  rpoint"         
9e10: 20 7d 2c 0a 20 20 20 20 7b 20 22 70 70 6d 22 2c   },.    { "ppm",
9e20: 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67          3, "imag
9e30: 65 2f 78 2d 70 6f 72 74 61 62 6c 65 2d 70 69 78  e/x-portable-pix
9e40: 6d 61 70 22 20 20 20 20 20 20 20 20 20 20 20 7d  map"           }
9e50: 2c 0a 20 20 20 20 7b 20 22 70 70 73 22 2c 20 20  ,.    { "pps",  
9e60: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
9e70: 61 74 69 6f 6e 2f 6d 73 70 6f 77 65 72 70 6f 69  ation/mspowerpoi
9e80: 6e 74 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  nt"          },.
9e90: 20 20 20 20 7b 20 22 70 70 74 22 2c 20 20 20 20      { "ppt",    
9ea0: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
9eb0: 69 6f 6e 2f 6d 73 70 6f 77 65 72 70 6f 69 6e 74  ion/mspowerpoint
9ec0: 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  "          },.  
9ed0: 20 20 7b 20 22 70 70 7a 22 2c 20 20 20 20 20 20    { "ppz",      
9ee0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
9ef0: 6e 2f 6d 73 70 6f 77 65 72 70 6f 69 6e 74 22 20  n/mspowerpoint" 
9f00: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9f10: 7b 20 22 70 72 65 22 2c 20 20 20 20 20 20 20 20  { "pre",        
9f20: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
9f30: 78 2d 66 72 65 65 6c 61 6e 63 65 22 20 20 20 20  x-freelance"    
9f40: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
9f50: 22 70 72 74 22 2c 20 20 20 20 20 20 20 20 33 2c  "prt",        3,
9f60: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 72   "application/pr
9f70: 6f 5f 65 6e 67 22 20 20 20 20 20 20 20 20 20 20  o_eng"          
9f80: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70       },.    { "p
9f90: 73 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22  s",         2, "
9fa0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 6f 73 74  application/post
9fb0: 73 63 72 69 70 74 22 20 20 20 20 20 20 20 20 20  script"         
9fc0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 71 74 22     },.    { "qt"
9fd0: 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 76 69  ,         2, "vi
9fe0: 64 65 6f 2f 71 75 69 63 6b 74 69 6d 65 22 20 20  deo/quicktime"  
9ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a000: 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61 22 2c 20   },.    { "ra", 
a010: 20 20 20 20 20 20 20 20 32 2c 20 22 61 75 64 69          2, "audi
a020: 6f 2f 78 2d 72 65 61 6c 61 75 64 69 6f 22 20 20  o/x-realaudio"  
a030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
a040: 2c 0a 20 20 20 20 7b 20 22 72 61 6d 22 2c 20 20  ,.    { "ram",  
a050: 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f        3, "audio/
a060: 78 2d 70 6e 2d 72 65 61 6c 61 75 64 69 6f 22 20  x-pn-realaudio" 
a070: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
a080: 20 20 20 20 7b 20 22 72 61 72 22 2c 20 20 20 20      { "rar",    
a090: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
a0a0: 69 6f 6e 2f 78 2d 72 61 72 2d 63 6f 6d 70 72 65  ion/x-rar-compre
a0b0: 73 73 65 64 22 20 20 20 20 20 20 7d 2c 0a 20 20  ssed"      },.  
a0c0: 20 20 7b 20 22 72 61 73 22 2c 20 20 20 20 20 20    { "ras",      
a0d0: 20 20 33 2c 20 22 69 6d 61 67 65 2f 63 6d 75 2d    3, "image/cmu-
a0e0: 72 61 73 74 65 72 22 20 20 20 20 20 20 20 20 20  raster"         
a0f0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
a100: 7b 20 22 72 61 73 22 2c 20 20 20 20 20 20 20 20  { "ras",        
a110: 33 2c 20 22 69 6d 61 67 65 2f 78 2d 63 6d 75 2d  3, "image/x-cmu-
a120: 72 61 73 74 65 72 22 20 20 20 20 20 20 20 20 20  raster"         
a130: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
a140: 22 72 67 62 22 2c 20 20 20 20 20 20 20 20 33 2c  "rgb",        3,
a150: 20 22 69 6d 61 67 65 2f 78 2d 72 67 62 22 20 20   "image/x-rgb"  
a160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a170: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72       },.    { "r
a180: 6d 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22  m",         2, "
a190: 61 75 64 69 6f 2f 78 2d 70 6e 2d 72 65 61 6c 61  audio/x-pn-reala
a1a0: 75 64 69 6f 22 20 20 20 20 20 20 20 20 20 20 20  udio"           
a1b0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 6f 66     },.    { "rof
a1c0: 66 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70  f",       4, "ap
a1d0: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72 6f 66  plication/x-trof
a1e0: 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f"              
a1f0: 20 7d 2c 0a 20 20 20 20 7b 20 22 72 70 6d 22 2c   },.    { "rpm",
a200: 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69          3, "audi
a210: 6f 2f 78 2d 70 6e 2d 72 65 61 6c 61 75 64 69 6f  o/x-pn-realaudio
a220: 2d 70 6c 75 67 69 6e 22 20 20 20 20 20 20 20 7d  -plugin"       }
a230: 2c 0a 20 20 20 20 7b 20 22 72 74 66 22 2c 20 20  ,.    { "rtf",  
a240: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
a250: 61 74 69 6f 6e 2f 72 74 66 22 20 20 20 20 20 20  ation/rtf"      
a260: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
a270: 20 20 20 20 7b 20 22 72 74 66 22 2c 20 20 20 20      { "rtf",    
a280: 20 20 20 20 33 2c 20 22 74 65 78 74 2f 72 74 66      3, "text/rtf
a290: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
a2a0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
a2b0: 20 20 7b 20 22 72 74 78 22 2c 20 20 20 20 20 20    { "rtx",      
a2c0: 20 20 33 2c 20 22 74 65 78 74 2f 72 69 63 68 74    3, "text/richt
a2d0: 65 78 74 22 20 20 20 20 20 20 20 20 20 20 20 20  ext"            
a2e0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
a2f0: 7b 20 22 73 63 6d 22 2c 20 20 20 20 20 20 20 20  { "scm",        
a300: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
a310: 78 2d 6c 6f 74 75 73 73 63 72 65 65 6e 63 61 6d  x-lotusscreencam
a320: 22 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20  "      },.    { 
a330: 22 73 65 74 22 2c 20 20 20 20 20 20 20 20 33 2c  "set",        3,
a340: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 73 65   "application/se
a350: 74 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t"              
a360: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73       },.    { "s
a370: 67 6d 6c 22 2c 20 20 20 20 20 20 20 34 2c 20 22  gml",       4, "
a380: 74 65 78 74 2f 73 67 6d 6c 22 20 20 20 20 20 20  text/sgml"      
a390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3a0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 67 6d     },.    { "sgm
a3b0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65  ",        3, "te
a3c0: 78 74 2f 73 67 6d 6c 22 20 20 20 20 20 20 20 20  xt/sgml"        
a3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3e0: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 68 22 2c 20   },.    { "sh", 
a3f0: 20 20 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c          2, "appl
a400: 69 63 61 74 69 6f 6e 2f 78 2d 73 68 22 20 20 20  ication/x-sh"   
a410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
a420: 2c 0a 20 20 20 20 7b 20 22 73 68 61 72 22 2c 20  ,.    { "shar", 
a430: 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63        4, "applic
a440: 61 74 69 6f 6e 2f 78 2d 73 68 61 72 22 20 20 20  ation/x-shar"   
a450: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
a460: 20 20 20 20 7b 20 22 73 69 6c 6f 22 2c 20 20 20      { "silo",   
a470: 20 20 20 20 34 2c 20 22 6d 6f 64 65 6c 2f 6d 65      4, "model/me
a480: 73 68 22 20 20 20 20 20 20 20 20 20 20 20 20 20  sh"             
a490: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
a4a0: 20 20 7b 20 22 73 69 74 22 2c 20 20 20 20 20 20    { "sit",      
a4b0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
a4c0: 6e 2f 78 2d 73 74 75 66 66 69 74 22 20 20 20 20  n/x-stuffit"    
a4d0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
a4e0: 7b 20 22 73 6b 64 22 2c 20 20 20 20 20 20 20 20  { "skd",        
a4f0: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
a500: 78 2d 6b 6f 61 6e 22 20 20 20 20 20 20 20 20 20  x-koan"         
a510: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
a520: 22 73 6b 6d 22 2c 20 20 20 20 20 20 20 20 33 2c  "skm",        3,
a530: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
a540: 6b 6f 61 6e 22 20 20 20 20 20 20 20 20 20 20 20  koan"           
a550: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73       },.    { "s
a560: 6b 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  kp",        3, "
a570: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6b 6f  application/x-ko
a580: 61 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20  an"             
a590: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6b 74     },.    { "skt
a5a0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
a5b0: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6b 6f 61 6e  plication/x-koan
a5c0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
a5d0: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 69 22 2c   },.    { "smi",
a5e0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
a5f0: 69 63 61 74 69 6f 6e 2f 73 6d 69 6c 22 20 20 20  ication/smil"   
a600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
a610: 2c 0a 20 20 20 20 7b 20 22 73 6d 69 6c 22 2c 20  ,.    { "smil", 
a620: 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63        4, "applic
a630: 61 74 69 6f 6e 2f 73 6d 69 6c 22 20 20 20 20 20  ation/smil"     
a640: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
a650: 20 20 20 20 7b 20 22 73 6e 64 22 2c 20 20 20 20      { "snd",    
a660: 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 62 61      3, "audio/ba
a670: 73 69 63 22 20 20 20 20 20 20 20 20 20 20 20 20  sic"            
a680: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
a690: 20 20 7b 20 22 73 6f 6c 22 2c 20 20 20 20 20 20    { "sol",      
a6a0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
a6b0: 6e 2f 73 6f 6c 69 64 73 22 20 20 20 20 20 20 20  n/solids"       
a6c0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
a6d0: 7b 20 22 73 70 6c 22 2c 20 20 20 20 20 20 20 20  { "spl",        
a6e0: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
a6f0: 78 2d 66 75 74 75 72 65 73 70 6c 61 73 68 22 20  x-futuresplash" 
a700: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
a710: 22 73 72 63 22 2c 20 20 20 20 20 20 20 20 33 2c  "src",        3,
a720: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
a730: 77 61 69 73 2d 73 6f 75 72 63 65 22 20 20 20 20  wais-source"    
a740: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73       },.    { "s
a750: 74 65 70 22 2c 20 20 20 20 20 20 20 34 2c 20 22  tep",       4, "
a760: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 53 54 45 50  application/STEP
a770: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
a780: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 74 6c     },.    { "stl
a790: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
a7a0: 70 6c 69 63 61 74 69 6f 6e 2f 53 4c 41 22 20 20  plication/SLA"  
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7c0: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 74 70 22 2c   },.    { "stp",
a7d0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
a7e0: 69 63 61 74 69 6f 6e 2f 53 54 45 50 22 20 20 20  ication/STEP"   
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
a800: 2c 0a 20 20 20 20 7b 20 22 73 76 34 63 70 69 6f  ,.    { "sv4cpio
a810: 22 2c 20 20 20 20 37 2c 20 22 61 70 70 6c 69 63  ",    7, "applic
a820: 61 74 69 6f 6e 2f 78 2d 73 76 34 63 70 69 6f 22  ation/x-sv4cpio"
a830: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
a840: 20 20 20 20 7b 20 22 73 76 34 63 72 63 22 2c 20      { "sv4crc", 
a850: 20 20 20 20 36 2c 20 22 61 70 70 6c 69 63 61 74      6, "applicat
a860: 69 6f 6e 2f 78 2d 73 76 34 63 72 63 22 20 20 20  ion/x-sv4crc"   
a870: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
a880: 20 20 7b 20 22 73 76 67 22 2c 20 20 20 20 20 20    { "svg",      
a890: 20 20 33 2c 20 22 69 6d 61 67 65 2f 73 76 67 2b    3, "image/svg+
a8a0: 78 6d 6c 22 20 20 20 20 20 20 20 20 20 20 20 20  xml"            
a8b0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
a8c0: 7b 20 22 73 77 66 22 2c 20 20 20 20 20 20 20 20  { "swf",        
a8d0: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
a8e0: 78 2d 73 68 6f 63 6b 77 61 76 65 2d 66 6c 61 73  x-shockwave-flas
a8f0: 68 22 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20  h"     },.    { 
a900: 22 74 22 2c 20 20 20 20 20 20 20 20 20 20 31 2c  "t",          1,
a910: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
a920: 74 72 6f 66 66 22 20 20 20 20 20 20 20 20 20 20  troff"          
a930: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74       },.    { "t
a940: 61 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ar",        3, "
a950: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 61  application/x-ta
a960: 72 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r"              
a970: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 63 6c     },.    { "tcl
a980: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
a990: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 63 6c 22  plication/x-tcl"
a9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9b0: 20 7d 2c 0a 20 20 20 20 7b 20 22 74 65 78 22 2c   },.    { "tex",
a9c0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
a9d0: 69 63 61 74 69 6f 6e 2f 78 2d 74 65 78 22 20 20  ication/x-tex"  
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
a9f0: 2c 0a 20 20 20 20 7b 20 22 74 65 78 69 22 2c 20  ,.    { "texi", 
aa00: 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63        4, "applic
aa10: 61 74 69 6f 6e 2f 78 2d 74 65 78 69 6e 66 6f 22  ation/x-texinfo"
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
aa30: 20 20 20 20 7b 20 22 74 65 78 69 6e 66 6f 22 2c      { "texinfo",
aa40: 20 20 20 20 37 2c 20 22 61 70 70 6c 69 63 61 74      7, "applicat
aa50: 69 6f 6e 2f 78 2d 74 65 78 69 6e 66 6f 22 20 20  ion/x-texinfo"  
aa60: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
aa70: 20 20 7b 20 22 74 67 7a 22 2c 20 20 20 20 20 20    { "tgz",      
aa80: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
aa90: 6e 2f 78 2d 74 61 72 2d 67 7a 22 20 20 20 20 20  n/x-tar-gz"     
aaa0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
aab0: 7b 20 22 74 69 66 66 22 2c 20 20 20 20 20 20 20  { "tiff",       
aac0: 34 2c 20 22 69 6d 61 67 65 2f 74 69 66 66 22 20  4, "image/tiff" 
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aae0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
aaf0: 22 74 69 66 22 2c 20 20 20 20 20 20 20 20 33 2c  "tif",        3,
ab00: 20 22 69 6d 61 67 65 2f 74 69 66 66 22 20 20 20   "image/tiff"   
ab10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab20: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74       },.    { "t
ab30: 72 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22  r",         2, "
ab40: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72  application/x-tr
ab50: 6f 66 66 22 20 20 20 20 20 20 20 20 20 20 20 20  off"            
ab60: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 73 69     },.    { "tsi
ab70: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75  ",        3, "au
ab80: 64 69 6f 2f 54 53 50 2d 61 75 64 69 6f 22 20 20  dio/TSP-audio"  
ab90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aba0: 20 7d 2c 0a 20 20 20 20 7b 20 22 74 73 70 22 2c   },.    { "tsp",
abb0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
abc0: 69 63 61 74 69 6f 6e 2f 64 73 70 74 79 70 65 22  ication/dsptype"
abd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
abe0: 2c 0a 20 20 20 20 7b 20 22 74 73 76 22 2c 20 20  ,.    { "tsv",  
abf0: 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 74        3, "text/t
ac00: 61 62 2d 73 65 70 61 72 61 74 65 64 2d 76 61 6c  ab-separated-val
ac10: 75 65 73 22 20 20 20 20 20 20 20 20 20 7d 2c 0a  ues"         },.
ac20: 20 20 20 20 7b 20 22 74 78 74 22 2c 20 20 20 20      { "txt",    
ac30: 20 20 20 20 33 2c 20 22 74 65 78 74 2f 70 6c 61      3, "text/pla
ac40: 69 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20  in"             
ac50: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
ac60: 20 20 7b 20 22 75 6e 76 22 2c 20 20 20 20 20 20    { "unv",      
ac70: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
ac80: 6e 2f 69 2d 64 65 61 73 22 20 20 20 20 20 20 20  n/i-deas"       
ac90: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
aca0: 7b 20 22 75 73 74 61 72 22 2c 20 20 20 20 20 20  { "ustar",      
acb0: 35 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  5, "application/
acc0: 78 2d 75 73 74 61 72 22 20 20 20 20 20 20 20 20  x-ustar"        
acd0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
ace0: 22 76 63 64 22 2c 20 20 20 20 20 20 20 20 33 2c  "vcd",        3,
acf0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
ad00: 63 64 6c 69 6e 6b 22 20 20 20 20 20 20 20 20 20  cdlink"         
ad10: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 76       },.    { "v
ad20: 64 61 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  da",        3, "
ad30: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76 64 61 22  application/vda"
ad40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad50: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 76 69 76     },.    { "viv
ad60: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69  ",        3, "vi
ad70: 64 65 6f 2f 76 6e 64 2e 76 69 76 6f 22 20 20 20  deo/vnd.vivo"   
ad80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad90: 20 7d 2c 0a 20 20 20 20 7b 20 22 76 69 76 6f 22   },.    { "vivo"
ada0: 2c 20 20 20 20 20 20 20 34 2c 20 22 76 69 64 65  ,       4, "vide
adb0: 6f 2f 76 6e 64 2e 76 69 76 6f 22 20 20 20 20 20  o/vnd.vivo"     
adc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
add0: 2c 0a 20 20 20 20 7b 20 22 76 72 6d 6c 22 2c 20  ,.    { "vrml", 
ade0: 20 20 20 20 20 20 34 2c 20 22 6d 6f 64 65 6c 2f        4, "model/
adf0: 76 72 6d 6c 22 20 20 20 20 20 20 20 20 20 20 20  vrml"           
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
ae10: 20 20 20 20 7b 20 22 76 73 69 78 22 2c 20 20 20      { "vsix",   
ae20: 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74      4, "applicat
ae30: 69 6f 6e 2f 76 73 69 78 22 20 20 20 20 20 20 20  ion/vsix"       
ae40: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
ae50: 20 20 7b 20 22 77 61 76 22 2c 20 20 20 20 20 20    { "wav",      
ae60: 20 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 77 61    3, "audio/x-wa
ae70: 76 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v"              
ae80: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
ae90: 7b 20 22 77 61 78 22 2c 20 20 20 20 20 20 20 20  { "wax",        
aea0: 33 2c 20 22 61 75 64 69 6f 2f 78 2d 6d 73 2d 77  3, "audio/x-ms-w
aeb0: 61 78 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ax"             
aec0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
aed0: 22 77 69 6b 69 22 2c 20 20 20 20 20 20 20 34 2c  "wiki",       4,
aee0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
aef0: 66 6f 73 73 69 6c 2d 77 69 6b 69 22 20 20 20 20  fossil-wiki"    
af00: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77       },.    { "w
af10: 6d 61 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ma",        3, "
af20: 61 75 64 69 6f 2f 78 2d 6d 73 2d 77 6d 61 22 20  audio/x-ms-wma" 
af30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af40: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 6d 76     },.    { "wmv
af50: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69  ",        3, "vi
af60: 64 65 6f 2f 78 2d 6d 73 2d 77 6d 76 22 20 20 20  deo/x-ms-wmv"   
af70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af80: 20 7d 2c 0a 20 20 20 20 7b 20 22 77 6d 78 22 2c   },.    { "wmx",
af90: 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64 65          3, "vide
afa0: 6f 2f 78 2d 6d 73 2d 77 6d 78 22 20 20 20 20 20  o/x-ms-wmx"     
afb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
afc0: 2c 0a 20 20 20 20 7b 20 22 77 72 6c 22 2c 20 20  ,.    { "wrl",  
afd0: 20 20 20 20 20 20 33 2c 20 22 6d 6f 64 65 6c 2f        3, "model/
afe0: 76 72 6d 6c 22 20 20 20 20 20 20 20 20 20 20 20  vrml"           
aff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
b000: 20 20 20 20 7b 20 22 77 76 78 22 2c 20 20 20 20      { "wvx",    
b010: 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d      3, "video/x-
b020: 6d 73 2d 77 76 78 22 20 20 20 20 20 20 20 20 20  ms-wvx"         
b030: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
b040: 20 20 7b 20 22 78 62 6d 22 2c 20 20 20 20 20 20    { "xbm",      
b050: 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 78 62    3, "image/x-xb
b060: 69 74 6d 61 70 22 20 20 20 20 20 20 20 20 20 20  itmap"          
b070: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
b080: 7b 20 22 78 6c 63 22 2c 20 20 20 20 20 20 20 20  { "xlc",        
b090: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
b0a0: 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20 20 20  vnd.ms-excel"   
b0b0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
b0c0: 22 78 6c 6c 22 2c 20 20 20 20 20 20 20 20 33 2c  "xll",        3,
b0d0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76 6e   "application/vn
b0e0: 64 2e 6d 73 2d 65 78 63 65 6c 22 20 20 20 20 20  d.ms-excel"     
b0f0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78       },.    { "x
b100: 6c 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  lm",        3, "
b110: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76 6e 64 2e  application/vnd.
b120: 6d 73 2d 65 78 63 65 6c 22 20 20 20 20 20 20 20  ms-excel"       
b130: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 6c 73     },.    { "xls
b140: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
b150: 70 6c 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73  plication/vnd.ms
b160: 2d 65 78 63 65 6c 22 20 20 20 20 20 20 20 20 20  -excel"         
b170: 20 7d 2c 0a 20 20 20 20 7b 20 22 78 6c 77 22 2c   },.    { "xlw",
b180: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
b190: 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65  ication/vnd.ms-e
b1a0: 78 63 65 6c 22 20 20 20 20 20 20 20 20 20 20 7d  xcel"          }
b1b0: 2c 0a 20 20 20 20 7b 20 22 78 6d 6c 22 2c 20 20  ,.    { "xml",  
b1c0: 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 78        3, "text/x
b1d0: 6d 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ml"             
b1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
b1f0: 20 20 20 20 7b 20 22 78 70 6d 22 2c 20 20 20 20      { "xpm",    
b200: 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d      3, "image/x-
b210: 78 70 69 78 6d 61 70 22 20 20 20 20 20 20 20 20  xpixmap"        
b220: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
b230: 20 20 7b 20 22 78 77 64 22 2c 20 20 20 20 20 20    { "xwd",      
b240: 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 78 77    3, "image/x-xw
b250: 69 6e 64 6f 77 64 75 6d 70 22 20 20 20 20 20 20  indowdump"      
b260: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
b270: 7b 20 22 78 79 7a 22 2c 20 20 20 20 20 20 20 20  { "xyz",        
b280: 33 2c 20 22 63 68 65 6d 69 63 61 6c 2f 78 2d 70  3, "chemical/x-p
b290: 64 62 22 20 20 20 20 20 20 20 20 20 20 20 20 20  db"             
b2a0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
b2b0: 22 7a 69 70 22 2c 20 20 20 20 20 20 20 20 33 2c  "zip",        3,
b2c0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 7a 69   "application/zi
b2d0: 70 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p"              
b2e0: 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 0a 20 20       },.  };..  
b2f0: 66 6f 72 28 69 3d 6e 4e 61 6d 65 2d 31 3b 20 69  for(i=nName-1; i
b300: 3e 30 20 26 26 20 7a 4e 61 6d 65 5b 69 5d 21 3d  >0 && zName[i]!=
b310: 27 2e 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 7a 20  '.'; i--){}.  z 
b320: 3d 20 26 7a 4e 61 6d 65 5b 69 2b 31 5d 3b 0a 20  = &zName[i+1];. 
b330: 20 6c 65 6e 20 3d 20 6e 4e 61 6d 65 20 2d 20 69   len = nName - i
b340: 3b 0a 20 20 69 66 28 20 6c 65 6e 3c 28 69 6e 74  ;.  if( len<(int
b350: 29 73 69 7a 65 6f 66 28 7a 53 75 66 66 69 78 29  )sizeof(zSuffix)
b360: 2d 31 20 29 7b 0a 20 20 20 20 73 74 72 63 70 79  -1 ){.    strcpy
b370: 28 7a 53 75 66 66 69 78 2c 20 7a 29 3b 0a 20 20  (zSuffix, z);.  
b380: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 53 75 66 66    for(i=0; zSuff
b390: 69 78 5b 69 5d 3b 20 69 2b 2b 29 20 7a 53 75 66  ix[i]; i++) zSuf
b3a0: 66 69 78 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72  fix[i] = tolower
b3b0: 28 7a 53 75 66 66 69 78 5b 69 5d 29 3b 0a 20 20  (zSuffix[i]);.  
b3c0: 20 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20    first = 0;.   
b3d0: 20 6c 61 73 74 20 3d 20 73 69 7a 65 6f 66 28 61   last = sizeof(a
b3e0: 4d 69 6d 65 29 2f 73 69 7a 65 6f 66 28 61 4d 69  Mime)/sizeof(aMi
b3f0: 6d 65 5b 30 5d 29 3b 0a 20 20 20 20 77 68 69 6c  me[0]);.    whil
b400: 65 28 20 66 69 72 73 74 3c 3d 6c 61 73 74 20 29  e( first<=last )
b410: 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20  {.      int c;. 
b420: 20 20 20 20 20 69 20 3d 20 28 66 69 72 73 74 2b       i = (first+
b430: 6c 61 73 74 29 2f 32 3b 0a 20 20 20 20 20 20 63  last)/2;.      c
b440: 20 3d 20 73 74 72 63 6d 70 28 7a 53 75 66 66 69   = strcmp(zSuffi
b450: 78 2c 20 61 4d 69 6d 65 5b 69 5d 2e 7a 53 75 66  x, aMime[i].zSuf
b460: 66 69 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20  fix);.      if( 
b470: 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 4d  c==0 ) return aM
b480: 69 6d 65 5b 69 5d 2e 7a 4d 69 6d 65 74 79 70 65  ime[i].zMimetype
b490: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30 20  ;.      if( c<0 
b4a0: 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 20  ){.        last 
b4b0: 3d 20 69 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c  = i-1;.      }el
b4c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 66 69 72 73  se{.        firs
b4d0: 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20 7d  t = i+1;.      }
b4e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
b4f0: 75 72 6e 20 22 61 70 70 6c 69 63 61 74 69 6f 6e  urn "application
b500: 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22 3b 0a  /octet-stream";.
b510: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
b520: 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 63 6f 6e  lowing table con
b530: 74 61 69 6e 73 20 31 20 66 6f 72 20 61 6c 6c 20  tains 1 for all 
b540: 63 68 61 72 61 63 74 65 72 73 20 74 68 61 74 20  characters that 
b550: 61 72 65 20 70 65 72 6d 69 74 74 65 64 20 69 6e  are permitted in
b560: 0a 2a 2a 20 74 68 65 20 70 61 72 74 20 6f 66 20  .** the part of 
b570: 74 68 65 20 55 52 4c 20 62 65 66 6f 72 65 20 74  the URL before t
b580: 68 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  he query paramet
b590: 65 72 73 20 61 6e 64 20 66 72 61 67 6d 65 6e 74  ers and fragment
b5a0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20  ..**.** Allowed 
b5b0: 63 68 61 72 61 63 74 65 72 73 3a 20 20 30 2d 39  characters:  0-9
b5c0: 61 2d 7a 41 2d 5a 2c 2d 2e 2f 3a 5f 7e 0a 2a 2a  a-zA-Z,-./:_~.**
b5d0: 0a 2a 2a 20 44 69 73 61 6c 6c 6f 77 65 64 20 63  .** Disallowed c
b5e0: 68 61 72 61 63 74 65 72 73 20 69 6e 63 6c 75 64  haracters includ
b5f0: 65 3a 20 20 21 22 23 24 25 26 27 28 29 2a 2b 3b  e:  !"#$%&'()*+;
b600: 3c 3d 3e 3f 5b 5c 5d 5e 7b 7c 7d 0a 2a 2f 0a 73  <=>?[\]^{|}.*/.s
b610: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
b620: 20 61 6c 6c 6f 77 65 64 49 6e 4e 61 6d 65 5b 5d   allowedInName[]
b630: 20 3d 20 7b 0a 20 20 20 20 20 20 2f 2a 20 20 78   = {.      /*  x
b640: 30 20 20 78 31 20 20 78 32 20 20 78 33 20 20 78  0  x1  x2  x3  x
b650: 34 20 20 78 35 20 20 78 36 20 20 78 37 20 20 78  4  x5  x6  x7  x
b660: 38 20 20 78 39 20 20 78 61 20 20 78 62 20 20 78  8  x9  xa  xb  x
b670: 63 20 20 78 64 20 20 78 65 20 20 78 66 20 2a 2f  c  xd  xe  xf */
b680: 0a 2f 2a 20 30 78 20 2a 2f 20 20 20 30 2c 20 20  ./* 0x */   0,  
b690: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b6a0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b6b0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b6c0: 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 31 78  0,  0,  0,./* 1x
b6d0: 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c   */   0,  0,  0,
b6e0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b6f0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b700: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b710: 20 20 30 2c 0a 2f 2a 20 32 78 20 2a 2f 20 20 20    0,./* 2x */   
b720: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b730: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b740: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b750: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 0a 2f  1,  1,  1,  1,./
b760: 2a 20 33 78 20 2a 2f 20 20 20 31 2c 20 20 31 2c  * 3x */   1,  1,
b770: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
b780: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
b790: 20 20 31 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    1,  0,  0,  0,
b7a0: 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 34 78 20 2a    0,  0,./* 4x *
b7b0: 2f 20 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20  /   0,  1,  1,  
b7c0: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
b7d0: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
b7e0: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
b7f0: 31 2c 0a 2f 2a 20 35 78 20 2a 2f 20 20 20 31 2c  1,./* 5x */   1,
b800: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
b810: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
b820: 20 20 31 2c 20 20 31 2c 20 20 30 2c 20 20 30 2c    1,  1,  0,  0,
b830: 20 20 30 2c 20 20 30 2c 20 20 31 2c 0a 2f 2a 20    0,  0,  1,./* 
b840: 36 78 20 2a 2f 20 20 20 30 2c 20 20 31 2c 20 20  6x */   0,  1,  
b850: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
b860: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
b870: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
b880: 31 2c 20 20 31 2c 0a 2f 2a 20 37 78 20 2a 2f 20  1,  1,./* 7x */ 
b890: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
b8a0: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
b8b0: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 30 2c    1,  1,  1,  0,
b8c0: 20 20 30 2c 20 20 30 2c 20 20 31 2c 20 20 30 2c    0,  0,  1,  0,
b8d0: 0a 2f 2a 20 38 78 20 2a 2f 20 20 20 30 2c 20 20  ./* 8x */   0,  
b8e0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b8f0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  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 0a 2f 2a 20 39 78  0,  0,  0,./* 9x
b920: 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c   */   0,  0,  0,
b930: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b940: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  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 0a 2f 2a 20 41 78 20 2a 2f 20 20 20    0,./* Ax */   
b970: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b980: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
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 0a 2f  0,  0,  0,  0,./
b9b0: 2a 20 42 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c  * Bx */   0,  0,
b9c0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b9d0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  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 0a 2f 2a 20 43 78 20 2a    0,  0,./* Cx *
ba00: 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  /   0,  0,  0,  
ba10: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
ba20: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
ba30: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
ba40: 30 2c 0a 2f 2a 20 44 78 20 2a 2f 20 20 20 30 2c  0,./* Dx */   0,
ba50: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
ba60: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
ba70: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
ba80: 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20    0,  0,  0,./* 
ba90: 45 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20  Ex */   0,  0,  
baa0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
bab0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
bac0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
bad0: 30 2c 20 20 30 2c 0a 2f 2a 20 46 78 20 2a 2f 20  0,  0,./* Fx */ 
bae0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
baf0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
bb00: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
bb10: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
bb20: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  .};../*.** Remov
bb30: 65 20 61 6c 6c 20 64 69 73 61 6c 6c 6f 77 65 64  e all disallowed
bb40: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
bb50: 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20  he input string 
bb60: 7a 5b 5d 2e 20 20 43 6f 6e 76 65 72 74 20 61 6e  z[].  Convert an
bb70: 79 0a 2a 2a 20 64 69 73 61 6c 6c 6f 77 65 64 20  y.** disallowed 
bb80: 63 68 61 72 61 63 74 65 72 73 20 69 6e 74 6f 20  characters into 
bb90: 22 5f 22 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 74  "_"..**.** Not t
bba0: 68 61 74 20 74 68 65 20 74 68 72 65 65 20 63 68  hat the three ch
bbb0: 61 72 61 63 74 65 72 20 73 65 71 75 65 6e 63 65  aracter sequence
bbc0: 20 22 25 58 58 22 20 77 68 65 72 65 20 58 20 69   "%XX" where X i
bbd0: 73 20 61 6e 79 20 62 79 74 65 20 69 73 0a 2a 2a  s any byte is.**
bbe0: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
bbf0: 61 20 73 69 6e 67 6c 65 20 22 5f 22 20 63 68 61  a single "_" cha
bc00: 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65  racter..**.** Re
bc10: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
bc20: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 63 6f  of characters co
bc30: 6e 76 65 72 74 65 64 2e 20 20 41 6e 20 22 25 58  nverted.  An "%X
bc40: 58 22 20 2d 3e 20 22 5f 22 20 63 6f 6e 76 65 72  X" -> "_" conver
bc50: 73 69 6f 6e 0a 2a 2a 20 63 6f 75 6e 74 73 20 61  sion.** counts a
bc60: 73 20 61 20 73 69 6e 67 6c 65 20 63 68 61 72 61  s a single chara
bc70: 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cter..*/.static 
bc80: 69 6e 74 20 73 61 6e 69 74 69 7a 65 53 74 72 69  int sanitizeStri
bc90: 6e 67 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  ng(char *z){.  i
bca0: 6e 74 20 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  nt nChange = 0;.
bcb0: 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
bcc0: 20 20 20 69 66 28 20 21 61 6c 6c 6f 77 65 64 49     if( !allowedI
bcd0: 6e 4e 61 6d 65 5b 2a 28 75 6e 73 69 67 6e 65 64  nName[*(unsigned
bce0: 20 63 68 61 72 2a 29 7a 5d 20 29 7b 0a 20 20 20   char*)z] ){.   
bcf0: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 25 27 20 26     if( *z=='%' &
bd00: 26 20 7a 5b 31 5d 21 3d 30 20 26 26 20 7a 5b 32  & z[1]!=0 && z[2
bd10: 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]!=0 ){.        
bd20: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66  int i;.        f
bd30: 6f 72 28 69 3d 33 3b 20 28 7a 5b 69 2d 32 5d 20  or(i=3; (z[i-2] 
bd40: 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29  = z[i])!=0; i++)
bd50: 7b 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  {}.      }.     
bd60: 20 2a 7a 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20   *z = '_';.     
bd70: 20 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20 20 20 20   nChange++;.    
bd80: 7d 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 0a 20  }.    z++;.  }. 
bd90: 20 72 65 74 75 72 6e 20 6e 43 68 61 6e 67 65 3b   return nChange;
bda0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  .}../*.** Count 
bdb0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 2f  the number of "/
bdc0: 22 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  " characters in 
bdd0: 61 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61  a string..*/.sta
bde0: 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 53 6c 61  tic int countSla
bdf0: 73 68 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20  shes(const char 
be00: 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  *z){.  int n = 0
be10: 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 20  ;.  while( *z ) 
be20: 69 66 28 20 2a 28 7a 2b 2b 29 3d 3d 27 2f 27 20  if( *(z++)=='/' 
be30: 29 20 6e 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  ) n++;.  return 
be40: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 6e 64  n;.}../*.** Send
be50: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   the text of the
be60: 20 66 69 6c 65 20 6e 61 6d 65 64 20 62 79 20 7a   file named by z
be70: 46 69 6c 65 20 61 73 20 74 68 65 20 72 65 70 6c  File as the repl
be80: 79 2e 20 20 55 73 65 20 74 68 65 0a 2a 2a 20 73  y.  Use the.** s
be90: 75 66 66 69 78 20 6f 6e 20 74 68 65 20 65 6e 64  uffix on the end
bea0: 20 6f 66 20 74 68 65 20 7a 46 69 6c 65 20 6e 61   of the zFile na
beb0: 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  me to determine 
bec0: 74 68 65 20 6d 69 6d 65 74 79 70 65 2e 0a 2a 2a  the mimetype..**
bed0: 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 74 6f 20  .** Return 1 to 
bee0: 6f 6d 69 74 20 6d 61 6b 69 6e 67 20 61 20 6c 6f  omit making a lo
bef0: 67 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  g entry for the 
bf00: 72 65 70 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  reply..*/.static
bf10: 20 69 6e 74 20 53 65 6e 64 46 69 6c 65 28 0a 20   int SendFile(. 
bf20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
bf30: 6c 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  le,      /* Name
bf40: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20   of the file to 
bf50: 73 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  send */.  int le
bf60: 6e 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  nFile,          
bf70: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
bf80: 68 65 20 7a 46 69 6c 65 20 6e 61 6d 65 20 69 6e  he zFile name in
bf90: 20 62 79 74 65 73 20 2a 2f 0a 20 20 73 74 72 75   bytes */.  stru
bfa0: 63 74 20 73 74 61 74 20 2a 70 53 74 61 74 20 20  ct stat *pStat  
bfb0: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
bfc0: 20 61 20 73 74 61 74 28 29 20 61 67 61 69 6e 73   a stat() agains
bfd0: 74 20 7a 46 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  t zFile */.){.  
bfe0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6e  const char *zCon
bff0: 74 65 6e 74 54 79 70 65 3b 0a 20 20 74 69 6d 65  tentType;.  time
c000: 5f 74 20 74 3b 0a 20 20 46 49 4c 45 20 2a 69 6e  _t t;.  FILE *in
c010: 3b 0a 20 20 63 68 61 72 20 7a 45 54 61 67 5b 31  ;.  char zETag[1
c020: 30 30 5d 3b 0a 0a 20 20 7a 43 6f 6e 74 65 6e 74  00];..  zContent
c030: 54 79 70 65 20 3d 20 47 65 74 4d 69 6d 65 54 79  Type = GetMimeTy
c040: 70 65 28 7a 46 69 6c 65 2c 20 6c 65 6e 46 69 6c  pe(zFile, lenFil
c050: 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 4e 61  e);.  if( zTmpNa
c060: 6d 20 29 20 75 6e 6c 69 6e 6b 28 7a 54 6d 70 4e  m ) unlink(zTmpN
c070: 61 6d 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a  am);.  sprintf(z
c080: 45 54 61 67 2c 20 22 6d 25 78 73 25 78 22 2c 20  ETag, "m%xs%x", 
c090: 28 69 6e 74 29 70 53 74 61 74 2d 3e 73 74 5f 6d  (int)pStat->st_m
c0a0: 74 69 6d 65 2c 20 28 69 6e 74 29 70 53 74 61 74  time, (int)pStat
c0b0: 2d 3e 73 74 5f 73 69 7a 65 29 3b 0a 20 20 69 66  ->st_size);.  if
c0c0: 28 20 43 6f 6d 70 61 72 65 45 74 61 67 73 28 7a  ( CompareEtags(z
c0d0: 49 66 4e 6f 6e 65 4d 61 74 63 68 2c 7a 45 54 61  IfNoneMatch,zETa
c0e0: 67 29 3d 3d 30 0a 20 20 20 7c 7c 20 28 7a 49 66  g)==0.   || (zIf
c0f0: 4d 6f 64 69 66 69 65 64 53 69 6e 63 65 21 3d 30  ModifiedSince!=0
c100: 0a 20 20 20 20 20 20 20 20 26 26 20 28 74 20 3d  .        && (t =
c110: 20 50 61 72 73 65 52 66 63 38 32 32 44 61 74 65   ParseRfc822Date
c120: 28 7a 49 66 4d 6f 64 69 66 69 65 64 53 69 6e 63  (zIfModifiedSinc
c130: 65 29 29 3e 30 0a 20 20 20 20 20 20 20 20 26 26  e))>0.        &&
c140: 20 74 3e 3d 70 53 74 61 74 2d 3e 73 74 5f 6d 74   t>=pStat->st_mt
c150: 69 6d 65 29 0a 20 20 29 7b 0a 20 20 20 20 53 74  ime).  ){.    St
c160: 61 72 74 52 65 73 70 6f 6e 73 65 28 22 33 30 34  artResponse("304
c170: 20 4e 6f 74 20 4d 6f 64 69 66 69 65 64 22 29 3b   Not Modified");
c180: 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 44 61 74  .    nOut += Dat
c190: 65 54 61 67 28 22 4c 61 73 74 2d 4d 6f 64 69 66  eTag("Last-Modif
c1a0: 69 65 64 22 2c 20 70 53 74 61 74 2d 3e 73 74 5f  ied", pStat->st_
c1b0: 6d 74 69 6d 65 29 3b 0a 20 20 20 20 6e 4f 75 74  mtime);.    nOut
c1c0: 20 2b 3d 20 70 72 69 6e 74 66 28 22 43 61 63 68   += printf("Cach
c1d0: 65 2d 43 6f 6e 74 72 6f 6c 3a 20 6d 61 78 2d 61  e-Control: max-a
c1e0: 67 65 3d 25 64 5c 72 5c 6e 22 2c 20 6d 78 41 67  ge=%d\r\n", mxAg
c1f0: 65 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20  e);.    nOut += 
c200: 70 72 69 6e 74 66 28 22 45 54 61 67 3a 20 5c 22  printf("ETag: \"
c210: 25 73 5c 22 5c 72 5c 6e 22 2c 20 7a 45 54 61 67  %s\"\r\n", zETag
c220: 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70  );.    nOut += p
c230: 72 69 6e 74 66 28 22 5c 72 5c 6e 22 29 3b 0a 20  rintf("\r\n");. 
c240: 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74     fflush(stdout
c250: 29 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e  );.    MakeLogEn
c260: 74 72 79 28 30 2c 20 34 37 30 29 3b 20 20 2f 2a  try(0, 470);  /*
c270: 20 4c 4f 47 3a 20 45 54 61 67 20 43 61 63 68 65   LOG: ETag Cache
c280: 20 48 69 74 20 2a 2f 0a 20 20 20 20 72 65 74 75   Hit */.    retu
c290: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d  rn 1;.  }.  in =
c2a0: 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 22 72 62   fopen(zFile,"rb
c2b0: 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20  ");.  if( in==0 
c2c0: 29 20 4e 6f 74 46 6f 75 6e 64 28 34 38 30 29 3b  ) NotFound(480);
c2d0: 20 2f 2a 20 4c 4f 47 3a 20 66 6f 70 65 6e 28 29   /* LOG: fopen()
c2e0: 20 66 61 69 6c 65 64 20 66 6f 72 20 73 74 61 74   failed for stat
c2f0: 69 63 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ic content */.  
c300: 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 32  StartResponse("2
c310: 30 30 20 4f 4b 22 29 3b 0a 20 20 6e 4f 75 74 20  00 OK");.  nOut 
c320: 2b 3d 20 44 61 74 65 54 61 67 28 22 4c 61 73 74  += DateTag("Last
c330: 2d 4d 6f 64 69 66 69 65 64 22 2c 20 70 53 74 61  -Modified", pSta
c340: 74 2d 3e 73 74 5f 6d 74 69 6d 65 29 3b 0a 20 20  t->st_mtime);.  
c350: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22  nOut += printf("
c360: 43 61 63 68 65 2d 43 6f 6e 74 72 6f 6c 3a 20 6d  Cache-Control: m
c370: 61 78 2d 61 67 65 3d 25 64 5c 72 5c 6e 22 2c 20  ax-age=%d\r\n", 
c380: 6d 78 41 67 65 29 3b 0a 20 20 6e 4f 75 74 20 2b  mxAge);.  nOut +
c390: 3d 20 70 72 69 6e 74 66 28 22 45 54 61 67 3a 20  = printf("ETag: 
c3a0: 5c 22 25 73 5c 22 5c 72 5c 6e 22 2c 20 7a 45 54  \"%s\"\r\n", zET
c3b0: 61 67 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70  ag);.  nOut += p
c3c0: 72 69 6e 74 66 28 22 43 6f 6e 74 65 6e 74 2d 74  rintf("Content-t
c3d0: 79 70 65 3a 20 25 73 5c 72 5c 6e 22 2c 7a 43 6f  ype: %s\r\n",zCo
c3e0: 6e 74 65 6e 74 54 79 70 65 29 3b 0a 20 20 6e 4f  ntentType);.  nO
c3f0: 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f  ut += printf("Co
c400: 6e 74 65 6e 74 2d 6c 65 6e 67 74 68 3a 20 25 64  ntent-length: %d
c410: 5c 72 5c 6e 5c 72 5c 6e 22 2c 28 69 6e 74 29 70  \r\n\r\n",(int)p
c420: 53 74 61 74 2d 3e 73 74 5f 73 69 7a 65 29 3b 0a  Stat->st_size);.
c430: 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29    fflush(stdout)
c440: 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a  ;.  if( strcmp(z
c450: 4d 65 74 68 6f 64 2c 22 48 45 41 44 22 29 3d 3d  Method,"HEAD")==
c460: 30 20 29 7b 0a 20 20 20 20 4d 61 6b 65 4c 6f 67  0 ){.    MakeLog
c470: 45 6e 74 72 79 28 30 2c 20 32 29 3b 20 2f 2a 20  Entry(0, 2); /* 
c480: 4c 4f 47 3a 20 4e 6f 72 6d 61 6c 20 48 45 41 44  LOG: Normal HEAD
c490: 20 72 65 70 6c 79 20 2a 2f 0a 20 20 20 20 66 63   reply */.    fc
c4a0: 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 66 66  lose(in);.    ff
c4b0: 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20  lush(stdout);.  
c4c0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
c4d0: 20 20 69 66 28 20 75 73 65 54 69 6d 65 6f 75 74    if( useTimeout
c4e0: 20 29 20 61 6c 61 72 6d 28 33 30 20 2b 20 70 53   ) alarm(30 + pS
c4f0: 74 61 74 2d 3e 73 74 5f 73 69 7a 65 2f 31 30 30  tat->st_size/100
c500: 30 29 3b 0a 23 69 66 64 65 66 20 6c 69 6e 75 78  0);.#ifdef linux
c510: 0a 20 20 7b 0a 20 20 20 20 6f 66 66 5f 74 20 6f  .  {.    off_t o
c520: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 6e  ffset = 0;.    n
c530: 4f 75 74 20 2b 3d 20 73 65 6e 64 66 69 6c 65 28  Out += sendfile(
c540: 66 69 6c 65 6e 6f 28 73 74 64 6f 75 74 29 2c 20  fileno(stdout), 
c550: 66 69 6c 65 6e 6f 28 69 6e 29 2c 20 26 6f 66 66  fileno(in), &off
c560: 73 65 74 2c 20 70 53 74 61 74 2d 3e 73 74 5f 73  set, pStat->st_s
c570: 69 7a 65 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  ize);.  }.#else.
c580: 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20    {.    int c;. 
c590: 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 67     while( (c = g
c5a0: 65 74 63 28 69 6e 29 29 21 3d 45 4f 46 20 29 7b  etc(in))!=EOF ){
c5b0: 0a 20 20 20 20 20 20 70 75 74 63 28 63 2c 73 74  .      putc(c,st
c5c0: 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 6e 4f 75  dout);.      nOu
c5d0: 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  t++;.    }.  }.#
c5e0: 65 6e 64 69 66 0a 20 20 66 63 6c 6f 73 65 28 69  endif.  fclose(i
c5f0: 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  n);.  return 0;.
c600: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 43 47 49 20 6f  }../*.** A CGI o
c610: 72 20 53 43 47 49 20 73 63 72 69 70 74 20 68 61  r SCGI script ha
c620: 73 20 72 75 6e 20 61 6e 64 20 69 73 20 73 65 6e  s run and is sen
c630: 64 69 6e 67 20 69 74 73 20 72 65 70 6c 79 20 62  ding its reply b
c640: 61 63 6b 20 61 63 72 6f 73 73 0a 2a 2a 20 74 68  ack across.** th
c650: 65 20 63 68 61 6e 6e 65 6c 20 22 69 6e 22 2e 20  e channel "in". 
c660: 20 50 72 6f 63 65 73 73 20 74 68 69 73 20 72 65   Process this re
c670: 70 6c 79 20 69 6e 74 6f 20 61 6e 20 61 70 70 72  ply into an appr
c680: 6f 70 72 69 61 74 65 20 48 54 54 50 20 72 65 70  opriate HTTP rep
c690: 6c 79 2e 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ly..** Close the
c6a0: 20 22 69 6e 22 20 63 68 61 6e 6e 65 6c 20 77 68   "in" channel wh
c6b0: 65 6e 20 64 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74  en done..*/.stat
c6c0: 69 63 20 76 6f 69 64 20 43 67 69 48 61 6e 64 6c  ic void CgiHandl
c6d0: 65 52 65 70 6c 79 28 46 49 4c 45 20 2a 69 6e 29  eReply(FILE *in)
c6e0: 7b 0a 20 20 69 6e 74 20 73 65 65 6e 43 6f 6e 74  {.  int seenCont
c6f0: 65 6e 74 4c 65 6e 67 74 68 20 3d 20 30 3b 20 20  entLength = 0;  
c700: 20 2f 2a 20 54 72 75 65 20 69 66 20 43 6f 6e 74   /* True if Cont
c710: 65 6e 74 2d 6c 65 6e 67 74 68 3a 20 68 65 61 64  ent-length: head
c720: 65 72 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74  er seen */.  int
c730: 20 63 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 20 3d   contentLength =
c740: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65   0;       /* The
c750: 20 63 6f 6e 74 65 6e 74 20 6c 65 6e 67 74 68 20   content length 
c760: 2a 2f 0a 20 20 73 69 7a 65 5f 74 20 6e 52 65 73  */.  size_t nRes
c770: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
c780: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 70 61    /* Bytes of pa
c790: 79 6c 6f 61 64 20 2a 2f 0a 20 20 73 69 7a 65 5f  yload */.  size_
c7a0: 74 20 6e 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 20  t nMalloc = 0;  
c7b0: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
c7c0: 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
c7d0: 74 65 64 20 74 6f 20 61 52 65 73 20 2a 2f 0a 20  ted to aRes */. 
c7e0: 20 63 68 61 72 20 2a 61 52 65 73 20 3d 20 30 3b   char *aRes = 0;
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c800: 20 50 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 69 6e   Payload */.  in
c810: 74 20 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  t c;            
c820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
c830: 78 74 20 63 68 61 72 61 63 74 65 72 20 66 72 6f  xt character fro
c840: 6d 20 69 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  m in */.  char *
c850: 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
c860: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
c870: 72 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 20 69  r to something i
c880: 6e 73 69 64 65 20 6f 66 20 7a 4c 69 6e 65 20 2a  nside of zLine *
c890: 2f 0a 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b 31  /.  char zLine[1
c8a0: 30 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20 20  000];           
c8b0: 20 2f 2a 20 4f 6e 65 20 6c 69 6e 65 20 6f 66 20   /* One line of 
c8c0: 72 65 70 6c 79 20 66 72 6f 6d 20 74 68 65 20 43  reply from the C
c8d0: 47 49 20 73 63 72 69 70 74 20 2a 2f 0a 0a 20 20  GI script */..  
c8e0: 69 66 28 20 75 73 65 54 69 6d 65 6f 75 74 20 29  if( useTimeout )
c8f0: 20 61 6c 61 72 6d 28 31 35 29 3b 0a 20 20 77 68   alarm(15);.  wh
c900: 69 6c 65 28 20 66 67 65 74 73 28 7a 4c 69 6e 65  ile( fgets(zLine
c910: 2c 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 69  ,sizeof(zLine),i
c920: 6e 29 20 26 26 20 21 69 73 73 70 61 63 65 28 28  n) && !isspace((
c930: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 4c  unsigned char)zL
c940: 69 6e 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20 69  ine[0]) ){.    i
c950: 66 28 20 73 74 72 6e 63 61 73 65 63 6d 70 28 7a  f( strncasecmp(z
c960: 4c 69 6e 65 2c 22 4c 6f 63 61 74 69 6f 6e 3a 22  Line,"Location:"
c970: 2c 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,9)==0 ){.      
c980: 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 33  StartResponse("3
c990: 30 32 20 52 65 64 69 72 65 63 74 22 29 3b 0a 20  02 Redirect");. 
c9a0: 20 20 20 20 20 52 65 6d 6f 76 65 4e 65 77 6c 69       RemoveNewli
c9b0: 6e 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20  ne(zLine);.     
c9c0: 20 7a 20 3d 20 26 7a 4c 69 6e 65 5b 31 30 5d 3b   z = &zLine[10];
c9d0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 73  .      while( is
c9e0: 73 70 61 63 65 28 2a 28 75 6e 73 69 67 6e 65 64  space(*(unsigned
c9f0: 20 63 68 61 72 2a 29 7a 29 20 29 7b 20 7a 2b 2b   char*)z) ){ z++
ca00: 3b 20 7d 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b  ; }.      nOut +
ca10: 3d 20 70 72 69 6e 74 66 28 22 4c 6f 63 61 74 69  = printf("Locati
ca20: 6f 6e 3a 20 25 73 5c 72 5c 6e 22 2c 7a 29 3b 0a  on: %s\r\n",z);.
ca30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
ca40: 72 6e 63 61 73 65 63 6d 70 28 7a 4c 69 6e 65 2c  rncasecmp(zLine,
ca50: 22 53 74 61 74 75 73 3a 22 2c 37 29 3d 3d 30 20  "Status:",7)==0 
ca60: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
ca70: 20 20 20 20 20 20 66 6f 72 28 69 3d 37 3b 20 69        for(i=7; i
ca80: 73 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64  sspace((unsigned
ca90: 20 63 68 61 72 29 7a 4c 69 6e 65 5b 69 5d 29 3b   char)zLine[i]);
caa0: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 6e 4f   i++){}.      nO
cab0: 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 25 73  ut += printf("%s
cac0: 20 25 73 22 2c 20 7a 50 72 6f 74 6f 63 6f 6c 2c   %s", zProtocol,
cad0: 20 26 7a 4c 69 6e 65 5b 69 5d 29 3b 0a 20 20 20   &zLine[i]);.   
cae0: 20 20 20 73 74 72 6e 63 70 79 28 7a 52 65 70 6c     strncpy(zRepl
caf0: 79 53 74 61 74 75 73 2c 20 26 7a 4c 69 6e 65 5b  yStatus, &zLine[
cb00: 69 5d 2c 20 33 29 3b 0a 20 20 20 20 20 20 7a 52  i], 3);.      zR
cb10: 65 70 6c 79 53 74 61 74 75 73 5b 33 5d 20 3d 20  eplyStatus[3] = 
cb20: 30 3b 0a 20 20 20 20 20 20 73 74 61 74 75 73 53  0;.      statusS
cb30: 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  ent = 1;.    }el
cb40: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
cb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cb60: 20 20 31 32 33 34 35 36 37 38 39 20 31 32 33 34    123456789 1234
cb70: 35 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  5 */.      if( s
cb80: 74 72 6e 63 61 73 65 63 6d 70 28 7a 4c 69 6e 65  trncasecmp(zLine
cb90: 2c 20 22 43 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74  , "Content-lengt
cba0: 68 3a 22 2c 20 31 35 29 3d 3d 30 20 29 7b 0a 20  h:", 15)==0 ){. 
cbb0: 20 20 20 20 20 20 20 73 65 65 6e 43 6f 6e 74 65         seenConte
cbc0: 6e 74 4c 65 6e 67 74 68 20 3d 20 31 3b 0a 20 20  ntLength = 1;.  
cbd0: 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 4c 65 6e        contentLen
cbe0: 67 74 68 20 3d 20 61 74 6f 69 28 7a 4c 69 6e 65  gth = atoi(zLine
cbf0: 2b 31 35 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  +15);.      }.  
cc00: 20 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73      StartRespons
cc10: 65 28 22 32 30 30 20 4f 4b 22 29 3b 0a 20 20 20  e("200 OK");.   
cc20: 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74     nOut += print
cc30: 66 28 22 25 73 22 2c 7a 4c 69 6e 65 29 3b 0a 20  f("%s",zLine);. 
cc40: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
cc50: 6f 70 79 20 65 76 65 72 79 74 68 69 6e 67 20 65  opy everything e
cc60: 6c 73 65 20 74 68 72 75 20 77 69 74 68 6f 75 74  lse thru without
cc70: 20 63 68 61 6e 67 65 20 6f 72 20 61 6e 61 6c 79   change or analy
cc80: 73 69 73 2e 0a 20 20 2a 2f 0a 20 20 53 74 61 72  sis..  */.  Star
cc90: 74 52 65 73 70 6f 6e 73 65 28 22 32 30 30 20 4f  tResponse("200 O
cca0: 4b 22 29 3b 0a 20 20 69 66 28 20 75 73 65 54 69  K");.  if( useTi
ccb0: 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d 28 36 30  meout ) alarm(60
ccc0: 2a 35 29 3b 0a 20 20 69 66 28 20 73 65 65 6e 43  *5);.  if( seenC
ccd0: 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 20 29 7b 0a  ontentLength ){.
cce0: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
ccf0: 74 66 28 22 25 73 22 2c 20 7a 4c 69 6e 65 29 3b  tf("%s", zLine);
cd00: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 6f 6e  .    while( (con
cd10: 74 65 6e 74 4c 65 6e 67 74 68 2d 2d 29 3e 30 20  tentLength--)>0 
cd20: 26 26 20 28 63 20 3d 20 67 65 74 63 28 69 6e 29  && (c = getc(in)
cd30: 29 21 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20 20  )!=EOF ){.      
cd40: 70 75 74 63 28 63 2c 73 74 64 6f 75 74 29 3b 0a  putc(c,stdout);.
cd50: 20 20 20 20 20 20 6e 4f 75 74 2b 2b 3b 0a 20 20        nOut++;.  
cd60: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
cd70: 20 6e 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 6e   nRes = 0;.    n
cd80: 4d 61 6c 6c 6f 63 20 3d 20 31 30 30 30 3b 0a 20  Malloc = 1000;. 
cd90: 20 20 20 61 52 65 73 20 3d 20 6d 61 6c 6c 6f 63     aRes = malloc
cda0: 28 6e 4d 61 6c 6c 6f 63 2b 31 29 3b 0a 20 20 20  (nMalloc+1);.   
cdb0: 20 69 66 28 20 61 52 65 73 3d 3d 30 20 29 20 4d   if( aRes==0 ) M
cdc0: 61 6c 66 75 6e 63 74 69 6f 6e 28 36 30 30 2c 22  alfunction(600,"
cdd0: 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 3a 20 25  Out of memory: %
cde0: 64 20 62 79 74 65 73 22 2c 20 6e 4d 61 6c 6c 6f  d bytes", nMallo
cdf0: 63 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  c);.    while( (
ce00: 63 20 3d 20 67 65 74 63 28 69 6e 29 29 21 3d 45  c = getc(in))!=E
ce10: 4f 46 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OF ){.      if( 
ce20: 6e 52 65 73 3e 3d 6e 4d 61 6c 6c 6f 63 20 29 7b  nRes>=nMalloc ){
ce30: 0a 20 20 20 20 20 20 20 20 6e 4d 61 6c 6c 6f 63  .        nMalloc
ce40: 20 3d 20 6e 4d 61 6c 6c 6f 63 2a 32 3b 0a 20 20   = nMalloc*2;.  
ce50: 20 20 20 20 20 20 61 52 65 73 20 3d 20 72 65 61        aRes = rea
ce60: 6c 6c 6f 63 28 61 52 65 73 2c 20 6e 4d 61 6c 6c  lloc(aRes, nMall
ce70: 6f 63 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69  oc+1);.        i
ce80: 66 28 20 61 52 65 73 3d 3d 30 20 29 7b 0a 20 20  f( aRes==0 ){.  
ce90: 20 20 20 20 20 20 20 20 20 4d 61 6c 66 75 6e 63           Malfunc
cea0: 74 69 6f 6e 28 36 31 30 2c 20 22 4f 75 74 20 6f  tion(610, "Out o
ceb0: 66 20 6d 65 6d 6f 72 79 3a 20 25 64 20 62 79 74  f memory: %d byt
cec0: 65 73 22 2c 20 6e 4d 61 6c 6c 6f 63 29 3b 0a 20  es", nMalloc);. 
ced0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
cee0: 0a 20 20 20 20 20 20 61 52 65 73 5b 6e 52 65 73  .      aRes[nRes
cef0: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20  ++] = c;.    }. 
cf00: 20 20 20 61 52 65 73 5b 6e 52 65 73 5d 20 3d 20     aRes[nRes] = 
cf10: 30 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70  0;.    nOut += p
cf20: 72 69 6e 74 66 28 22 43 6f 6e 74 65 6e 74 2d 6c  rintf("Content-l
cf30: 65 6e 67 74 68 3a 20 25 64 5c 72 5c 6e 5c 72 5c  ength: %d\r\n\r\
cf40: 6e 25 73 22 2c 20 28 69 6e 74 29 6e 52 65 73 2c  n%s", (int)nRes,
cf50: 20 61 52 65 73 29 3b 0a 20 20 20 20 66 72 65 65   aRes);.    free
cf60: 28 61 52 65 73 29 3b 0a 20 20 7d 0a 20 20 66 63  (aRes);.  }.  fc
cf70: 6c 6f 73 65 28 69 6e 29 3b 0a 7d 0a 0a 2f 2a 0a  lose(in);.}../*.
cf80: 2a 2a 20 53 65 6e 64 20 61 6e 20 53 43 47 49 20  ** Send an SCGI 
cf90: 72 65 71 75 65 73 74 20 74 6f 20 61 20 68 6f 73  request to a hos
cfa0: 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  t identified by 
cfb0: 7a 46 69 6c 65 20 61 6e 64 20 70 72 6f 63 65 73  zFile and proces
cfc0: 73 20 74 68 65 0a 2a 2a 20 72 65 70 6c 79 2e 0a  s the.** reply..
cfd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53  */.static void S
cfe0: 65 6e 64 53 63 67 69 52 65 71 75 65 73 74 28 63  endScgiRequest(c
cff0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
d000: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
d010: 63 72 69 70 74 29 7b 0a 20 20 46 49 4c 45 20 2a  cript){.  FILE *
d020: 69 6e 3b 0a 20 20 46 49 4c 45 20 2a 73 3b 0a 20  in;.  FILE *s;. 
d030: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72   char *z;.  char
d040: 20 2a 7a 48 6f 73 74 3b 0a 20 20 63 68 61 72 20   *zHost;.  char 
d050: 2a 7a 50 6f 72 74 20 3d 20 30 3b 0a 20 20 63 68  *zPort = 0;.  ch
d060: 61 72 20 2a 7a 52 65 6c 69 67 68 74 20 3d 20 30  ar *zRelight = 0
d070: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 61 6c 6c 62  ;.  char *zFallb
d080: 61 63 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ack = 0;.  int r
d090: 63 3b 0a 20 20 69 6e 74 20 69 53 6f 63 6b 65 74  c;.  int iSocket
d0a0: 20 3d 20 2d 31 3b 0a 20 20 73 74 72 75 63 74 20   = -1;.  struct 
d0b0: 61 64 64 72 69 6e 66 6f 20 68 69 6e 74 73 3b 0a  addrinfo hints;.
d0c0: 20 20 73 74 72 75 63 74 20 61 64 64 72 69 6e 66    struct addrinf
d0d0: 6f 20 2a 61 69 20 3d 20 30 3b 0a 20 20 73 74 72  o *ai = 0;.  str
d0e0: 75 63 74 20 61 64 64 72 69 6e 66 6f 20 2a 70 3b  uct addrinfo *p;
d0f0: 0a 20 20 63 68 61 72 20 2a 7a 48 64 72 3b 0a 20  .  char *zHdr;. 
d100: 20 73 69 7a 65 5f 74 20 6e 48 64 72 20 3d 20 30   size_t nHdr = 0
d110: 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 48 64 72 41  ;.  size_t nHdrA
d120: 6c 6c 6f 63 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  lloc;.  int i;. 
d130: 20 63 68 61 72 20 7a 4c 69 6e 65 5b 31 30 30 30   char zLine[1000
d140: 5d 3b 0a 20 20 63 68 61 72 20 7a 45 78 74 72 61  ];.  char zExtra
d150: 5b 31 30 30 30 5d 3b 0a 20 20 69 6e 20 3d 20 66  [1000];.  in = f
d160: 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 72 62 22  open(zFile, "rb"
d170: 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29  );.  if( in==0 )
d180: 7b 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f  {.    Malfunctio
d190: 6e 28 37 30 30 2c 20 22 63 61 6e 6e 6f 74 20 6f  n(700, "cannot o
d1a0: 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a  pen \"%s\"\n", z
d1b0: 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  File);.  }.  if(
d1c0: 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 20 73 69   fgets(zLine, si
d1d0: 7a 65 6f 66 28 7a 4c 69 6e 65 29 2d 31 2c 20 69  zeof(zLine)-1, i
d1e0: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 4d 61 6c  n)==0 ){.    Mal
d1f0: 66 75 6e 63 74 69 6f 6e 28 37 30 31 2c 20 22 63  function(701, "c
d200: 61 6e 6e 6f 74 20 72 65 61 64 20 5c 22 25 73 5c  annot read \"%s\
d210: 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20  "\n", zFile);.  
d220: 7d 0a 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28  }.  if( strncmp(
d230: 7a 4c 69 6e 65 2c 22 53 43 47 49 20 22 2c 35 29  zLine,"SCGI ",5)
d240: 21 3d 30 20 29 7b 0a 20 20 20 20 4d 61 6c 66 75  !=0 ){.    Malfu
d250: 6e 63 74 69 6f 6e 28 37 30 32 2c 20 22 6d 69 73  nction(702, "mis
d260: 66 6f 72 6d 61 74 74 65 64 20 53 43 47 49 20 73  formatted SCGI s
d270: 70 65 63 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a  pec \"%s\"\n", z
d280: 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 7a 20 3d  File);.  }.  z =
d290: 20 7a 4c 69 6e 65 2b 35 3b 0a 20 20 7a 48 6f 73   zLine+5;.  zHos
d2a0: 74 20 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d  t = GetFirstElem
d2b0: 65 6e 74 28 7a 2c 26 7a 29 3b 0a 20 20 7a 50 6f  ent(z,&z);.  zPo
d2c0: 72 74 20 3d 20 47 65 74 46 69 72 73 74 45 6c 65  rt = GetFirstEle
d2d0: 6d 65 6e 74 28 7a 2c 30 29 3b 0a 20 20 69 66 28  ment(z,0);.  if(
d2e0: 20 7a 48 6f 73 74 3d 3d 30 20 7c 7c 20 7a 48 6f   zHost==0 || zHo
d2f0: 73 74 5b 30 5d 3d 3d 30 20 7c 7c 20 7a 50 6f 72  st[0]==0 || zPor
d300: 74 3d 3d 30 20 7c 7c 20 7a 50 6f 72 74 5b 30 5d  t==0 || zPort[0]
d310: 3d 3d 30 20 29 7b 0a 20 20 20 20 4d 61 6c 66 75  ==0 ){.    Malfu
d320: 6e 63 74 69 6f 6e 28 37 30 33 2c 20 22 6d 69 73  nction(703, "mis
d330: 66 6f 72 6d 61 74 74 65 64 20 53 43 47 49 20 73  formatted SCGI s
d340: 70 65 63 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a  pec \"%s\"\n", z
d350: 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 77 68 69  File);.  }.  whi
d360: 6c 65 28 20 66 67 65 74 73 28 7a 45 78 74 72 61  le( fgets(zExtra
d370: 2c 20 73 69 7a 65 6f 66 28 7a 45 78 74 72 61 29  , sizeof(zExtra)
d380: 2d 31 2c 20 69 6e 29 20 29 7b 0a 20 20 20 20 63  -1, in) ){.    c
d390: 68 61 72 20 2a 7a 43 6d 64 20 3d 20 47 65 74 46  har *zCmd = GetF
d3a0: 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a 45 78 74  irstElement(zExt
d3b0: 72 61 2c 26 7a 29 3b 0a 20 20 20 20 69 66 28 20  ra,&z);.    if( 
d3c0: 7a 43 6d 64 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  zCmd==0 ) contin
d3d0: 75 65 3b 0a 20 20 20 20 69 66 28 20 7a 43 6d 64  ue;.    if( zCmd
d3e0: 5b 30 5d 3d 3d 27 23 27 20 29 20 63 6f 6e 74 69  [0]=='#' ) conti
d3f0: 6e 75 65 3b 0a 20 20 20 20 52 65 6d 6f 76 65 4e  nue;.    RemoveN
d400: 65 77 6c 69 6e 65 28 7a 29 3b 0a 20 20 20 20 69  ewline(z);.    i
d410: 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20  f( strcmp(zCmd, 
d420: 22 72 65 6c 69 67 68 74 3a 22 29 3d 3d 30 20 29  "relight:")==0 )
d430: 7b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 52 65  {.      free(zRe
d440: 6c 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7a 52  light);.      zR
d450: 65 6c 69 67 68 74 20 3d 20 53 74 72 44 75 70 28  elight = StrDup(
d460: 7a 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  z);.      contin
d470: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
d480: 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22  ( strcmp(zCmd, "
d490: 66 61 6c 6c 62 61 63 6b 3a 22 29 3d 3d 30 20 29  fallback:")==0 )
d4a0: 7b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 46 61  {.      free(zFa
d4b0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 7a  llback);.      z
d4c0: 46 61 6c 6c 62 61 63 6b 20 3d 20 53 74 72 44 75  Fallback = StrDu
d4d0: 70 28 7a 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74  p(z);.      cont
d4e0: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
d4f0: 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 37 30 34 2c  Malfunction(704,
d500: 20 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6c   "unrecognized l
d510: 69 6e 65 20 69 6e 20 53 43 47 49 20 73 70 65 63  ine in SCGI spec
d520: 3a 20 5c 22 25 73 20 25 73 5c 22 5c 6e 22 2c 0a  : \"%s %s\"\n",.
d530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d540: 7a 43 6d 64 2c 20 7a 20 3f 20 7a 20 3a 20 22 22  zCmd, z ? z : ""
d550: 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28  );.  }.  fclose(
d560: 69 6e 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 68  in);.  memset(&h
d570: 69 6e 74 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ints, 0, sizeof(
d580: 73 74 72 75 63 74 20 61 64 64 72 69 6e 66 6f 29  struct addrinfo)
d590: 29 3b 0a 20 20 68 69 6e 74 73 2e 61 69 5f 66 61  );.  hints.ai_fa
d5a0: 6d 69 6c 79 20 3d 20 41 46 5f 55 4e 53 50 45 43  mily = AF_UNSPEC
d5b0: 3b 0a 20 20 68 69 6e 74 73 2e 61 69 5f 73 6f 63  ;.  hints.ai_soc
d5c0: 6b 74 79 70 65 20 3d 20 53 4f 43 4b 5f 53 54 52  ktype = SOCK_STR
d5d0: 45 41 4d 3b 0a 20 20 68 69 6e 74 73 2e 61 69 5f  EAM;.  hints.ai_
d5e0: 70 72 6f 74 6f 63 6f 6c 20 3d 20 49 50 50 52 4f  protocol = IPPRO
d5f0: 54 4f 5f 54 43 50 3b 0a 20 20 72 63 20 3d 20 67  TO_TCP;.  rc = g
d600: 65 74 61 64 64 72 69 6e 66 6f 28 7a 48 6f 73 74  etaddrinfo(zHost
d610: 2c 7a 50 6f 72 74 2c 26 68 69 6e 74 73 2c 26 61  ,zPort,&hints,&a
d620: 69 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  i);.  if( rc ){.
d630: 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28      Malfunction(
d640: 37 30 34 2c 20 22 63 61 6e 6e 6f 74 20 72 65 73  704, "cannot res
d650: 6f 6c 76 65 20 53 43 47 49 20 73 65 72 76 65 72  olve SCGI server
d660: 20 6e 61 6d 65 20 25 73 3a 25 73 5c 6e 25 73 5c   name %s:%s\n%s\
d670: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
d680: 20 20 20 20 7a 48 6f 73 74 2c 20 7a 50 6f 72 74      zHost, zPort
d690: 2c 20 67 61 69 5f 73 74 72 65 72 72 6f 72 28 72  , gai_strerror(r
d6a0: 63 29 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  c));.  }.  while
d6b0: 28 31 29 7b 20 20 2f 2a 20 45 78 69 74 20 76 69  (1){  /* Exit vi
d6c0: 61 20 62 72 65 61 6b 20 2a 2f 0a 20 20 20 20 66  a break */.    f
d6d0: 6f 72 28 70 3d 61 69 3b 20 70 3b 20 70 3d 70 2d  or(p=ai; p; p=p-
d6e0: 3e 61 69 5f 6e 65 78 74 29 7b 0a 20 20 20 20 20  >ai_next){.     
d6f0: 20 69 53 6f 63 6b 65 74 20 3d 20 73 6f 63 6b 65   iSocket = socke
d700: 74 28 70 2d 3e 61 69 5f 66 61 6d 69 6c 79 2c 20  t(p->ai_family, 
d710: 70 2d 3e 61 69 5f 73 6f 63 6b 74 79 70 65 2c 20  p->ai_socktype, 
d720: 70 2d 3e 61 69 5f 70 72 6f 74 6f 63 6f 6c 29 3b  p->ai_protocol);
d730: 0a 20 20 20 20 20 20 69 66 28 20 69 53 6f 63 6b  .      if( iSock
d740: 65 74 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  et<0 ) continue;
d750: 0a 20 20 20 20 20 20 69 66 28 20 63 6f 6e 6e 65  .      if( conne
d760: 63 74 28 69 53 6f 63 6b 65 74 2c 70 2d 3e 61 69  ct(iSocket,p->ai
d770: 5f 61 64 64 72 2c 70 2d 3e 61 69 5f 61 64 64 72  _addr,p->ai_addr
d780: 6c 65 6e 29 3e 3d 30 20 29 20 62 72 65 61 6b 3b  len)>=0 ) break;
d790: 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 69 53 6f  .      close(iSo
d7a0: 63 6b 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  cket);.    }.   
d7b0: 20 69 66 28 20 69 53 6f 63 6b 65 74 3c 30 20 7c   if( iSocket<0 |
d7c0: 7c 20 28 73 20 3d 20 66 64 6f 70 65 6e 28 69 53  | (s = fdopen(iS
d7d0: 6f 63 6b 65 74 2c 22 72 2b 22 29 29 3d 3d 30 20  ocket,"r+"))==0 
d7e0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53 6f  ){.      if( iSo
d7f0: 63 6b 65 74 3e 3d 30 20 29 20 63 6c 6f 73 65 28  cket>=0 ) close(
d800: 69 53 6f 63 6b 65 74 29 3b 0a 20 20 20 20 20 20  iSocket);.      
d810: 69 66 28 20 7a 52 65 6c 69 67 68 74 20 29 7b 0a  if( zRelight ){.
d820: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 79 73          rc = sys
d830: 74 65 6d 28 7a 52 65 6c 69 67 68 74 29 3b 0a 20  tem(zRelight);. 
d840: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
d850: 0a 20 20 20 20 20 20 20 20 20 20 4d 61 6c 66 75  .          Malfu
d860: 6e 63 74 69 6f 6e 28 37 32 31 2c 22 52 65 6c 69  nction(721,"Reli
d870: 67 68 74 20 66 61 69 6c 65 64 20 77 69 74 68 20  ght failed with 
d880: 25 64 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20  %d: \"%s\"\n",. 
d890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8a0: 20 20 20 20 20 72 63 2c 20 7a 52 65 6c 69 67 68       rc, zReligh
d8b0: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
d8c0: 20 20 20 20 20 20 66 72 65 65 28 7a 52 65 6c 69        free(zReli
d8d0: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 7a 52  ght);.        zR
d8e0: 65 6c 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20  elight = 0;.    
d8f0: 20 20 20 20 73 6c 65 65 70 28 31 29 3b 0a 20 20      sleep(1);.  
d900: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
d910: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
d920: 28 20 7a 46 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  ( zFallback ){. 
d930: 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74         struct st
d940: 61 74 20 73 74 61 74 62 75 66 3b 0a 20 20 20 20  at statbuf;.    
d950: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
d960: 20 20 20 20 6d 65 6d 73 65 74 28 26 73 74 61 74      memset(&stat
d970: 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  buf, 0, sizeof(s
d980: 74 61 74 62 75 66 29 29 3b 0a 20 20 20 20 20 20  tatbuf));.      
d990: 20 20 69 66 28 20 63 68 64 69 72 28 7a 44 69 72    if( chdir(zDir
d9a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  ) ){.          c
d9b0: 68 61 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a  har zBuf[1000];.
d9c0: 20 20 20 20 20 20 20 20 20 20 4d 61 6c 66 75 6e            Malfun
d9d0: 63 74 69 6f 6e 28 37 32 30 2c 20 2f 2a 20 4c 4f  ction(720, /* LO
d9e0: 47 3a 20 63 68 64 69 72 28 29 20 66 61 69 6c 65  G: chdir() faile
d9f0: 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  d */.           
da00: 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 68 64 69      "cannot chdi
da10: 72 20 74 6f 20 5b 25 73 5d 20 66 72 6f 6d 20 5b  r to [%s] from [
da20: 25 73 5d 22 2c 20 0a 20 20 20 20 20 20 20 20 20  %s]", .         
da30: 20 20 20 20 20 20 7a 44 69 72 2c 20 67 65 74 63        zDir, getc
da40: 77 64 28 7a 42 75 66 2c 39 39 39 29 29 3b 0a 20  wd(zBuf,999));. 
da50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
da60: 20 72 63 20 3d 20 73 74 61 74 28 7a 46 61 6c 6c   rc = stat(zFall
da70: 62 61 63 6b 2c 20 26 73 74 61 74 62 75 66 29 3b  back, &statbuf);
da80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
da90: 3d 30 20 26 26 20 53 5f 49 53 52 45 47 28 73 74  =0 && S_ISREG(st
daa0: 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 26  atbuf.st_mode) &
dab0: 26 20 61 63 63 65 73 73 28 7a 46 61 6c 6c 62 61  & access(zFallba
dac0: 63 6b 2c 52 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20  ck,R_OK)==0 ){. 
dad0: 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 43 6f           closeCo
dae0: 6e 6e 65 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20  nnection = 1;.  
daf0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 65 6e          rc = Sen
db00: 64 46 69 6c 65 28 7a 46 61 6c 6c 62 61 63 6b 2c  dFile(zFallback,
db10: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46 61   (int)strlen(zFa
db20: 6c 6c 62 61 63 6b 29 2c 20 26 73 74 61 74 62 75  llback), &statbu
db30: 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 72  f);.          fr
db40: 65 65 28 7a 46 61 6c 6c 62 61 63 6b 29 3b 0a 20  ee(zFallback);. 
db50: 20 20 20 20 20 20 20 20 20 65 78 69 74 28 30 29           exit(0)
db60: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
db70: 0a 20 20 20 20 20 20 20 20 20 20 4d 61 6c 66 75  .          Malfu
db80: 6e 63 74 69 6f 6e 28 37 30 36 2c 20 22 62 61 64  nction(706, "bad
db90: 20 66 61 6c 6c 62 61 63 6b 20 66 69 6c 65 3a 20   fallback file: 
dba0: 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 61 6c 6c  \"%s\"\n", zFall
dbb0: 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d  back);.        }
dbc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4d  .      }.      M
dbd0: 61 6c 66 75 6e 63 74 69 6f 6e 28 37 30 37 2c 20  alfunction(707, 
dbe0: 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 6f 63  "cannot open soc
dbf0: 6b 65 74 20 74 6f 20 53 43 47 49 20 73 65 72 76  ket to SCGI serv
dc00: 65 72 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  er %s\n",.      
dc10: 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 72              zScr
dc20: 69 70 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ipt);.    }.    
dc30: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 6e 48  break;.  }..  nH
dc40: 64 72 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7a  drAlloc = 0;.  z
dc50: 48 64 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a  Hdr = 0;.  if( z
dc60: 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 3d 3d 30  ContentLength==0
dc70: 20 29 20 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67 74   ) zContentLengt
dc80: 68 20 3d 20 22 30 22 3b 0a 20 20 7a 53 63 67 69  h = "0";.  zScgi
dc90: 20 3d 20 22 31 22 3b 0a 20 20 66 6f 72 28 69 3d   = "1";.  for(i=
dca0: 30 3b 20 69 3c 28 69 6e 74 29 28 73 69 7a 65 6f  0; i<(int)(sizeo
dcb0: 66 28 63 67 69 65 6e 76 29 2f 73 69 7a 65 6f 66  f(cgienv)/sizeof
dcc0: 28 63 67 69 65 6e 76 5b 30 5d 29 29 3b 20 69 2b  (cgienv[0])); i+
dcd0: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 31 2c 20  +){.    int n1, 
dce0: 6e 32 3b 0a 20 20 20 20 69 66 28 20 63 67 69 65  n2;.    if( cgie
dcf0: 6e 76 5b 69 5d 2e 70 7a 45 6e 76 56 61 6c 75 65  nv[i].pzEnvValue
dd00: 5b 30 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [0]==0 ) continu
dd10: 65 3b 0a 20 20 20 20 6e 31 20 3d 20 28 69 6e 74  e;.    n1 = (int
dd20: 29 73 74 72 6c 65 6e 28 63 67 69 65 6e 76 5b 69  )strlen(cgienv[i
dd30: 5d 2e 7a 45 6e 76 4e 61 6d 65 29 3b 0a 20 20 20  ].zEnvName);.   
dd40: 20 6e 32 20 3d 20 28 69 6e 74 29 73 74 72 6c 65   n2 = (int)strle
dd50: 6e 28 2a 63 67 69 65 6e 76 5b 69 5d 2e 70 7a 45  n(*cgienv[i].pzE
dd60: 6e 76 56 61 6c 75 65 29 3b 0a 20 20 20 20 69 66  nvValue);.    if
dd70: 28 20 6e 31 2b 6e 32 2b 32 2b 6e 48 64 72 20 3e  ( n1+n2+2+nHdr >
dd80: 3d 20 6e 48 64 72 41 6c 6c 6f 63 20 29 7b 0a 20  = nHdrAlloc ){. 
dd90: 20 20 20 20 20 6e 48 64 72 41 6c 6c 6f 63 20 3d       nHdrAlloc =
dda0: 20 6e 48 64 72 20 2b 20 6e 31 20 2b 20 6e 32 20   nHdr + n1 + n2 
ddb0: 2b 20 31 30 30 30 3b 0a 20 20 20 20 20 20 7a 48  + 1000;.      zH
ddc0: 64 72 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 48 64  dr = realloc(zHd
ddd0: 72 2c 20 6e 48 64 72 41 6c 6c 6f 63 29 3b 0a 20  r, nHdrAlloc);. 
dde0: 20 20 20 20 20 69 66 28 20 7a 48 64 72 3d 3d 30       if( zHdr==0
ddf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 61 6c 66   ){.        Malf
de00: 75 6e 63 74 69 6f 6e 28 37 30 36 2c 20 22 6f 75  unction(706, "ou
de10: 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20  t of memory");. 
de20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
de30: 20 6d 65 6d 63 70 79 28 7a 48 64 72 2b 6e 48 64   memcpy(zHdr+nHd
de40: 72 2c 20 63 67 69 65 6e 76 5b 69 5d 2e 7a 45 6e  r, cgienv[i].zEn
de50: 76 4e 61 6d 65 2c 20 6e 31 29 3b 0a 20 20 20 20  vName, n1);.    
de60: 6e 48 64 72 20 2b 3d 20 6e 31 3b 0a 20 20 20 20  nHdr += n1;.    
de70: 7a 48 64 72 5b 6e 48 64 72 2b 2b 5d 20 3d 20 30  zHdr[nHdr++] = 0
de80: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 64  ;.    memcpy(zHd
de90: 72 2b 6e 48 64 72 2c 20 2a 63 67 69 65 6e 76 5b  r+nHdr, *cgienv[
dea0: 69 5d 2e 70 7a 45 6e 76 56 61 6c 75 65 2c 20 6e  i].pzEnvValue, n
deb0: 32 29 3b 0a 20 20 20 20 6e 48 64 72 20 2b 3d 20  2);.    nHdr += 
dec0: 6e 32 3b 0a 20 20 20 20 7a 48 64 72 5b 6e 48 64  n2;.    zHdr[nHd
ded0: 72 2b 2b 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  r++] = 0;.  }.  
dee0: 7a 53 63 67 69 20 3d 20 30 3b 0a 20 20 66 70 72  zScgi = 0;.  fpr
def0: 69 6e 74 66 28 73 2c 22 25 64 3a 22 2c 28 69 6e  intf(s,"%d:",(in
df00: 74 29 6e 48 64 72 29 3b 0a 20 20 66 77 72 69 74  t)nHdr);.  fwrit
df10: 65 28 7a 48 64 72 2c 20 31 2c 20 6e 48 64 72 2c  e(zHdr, 1, nHdr,
df20: 20 73 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73   s);.  fprintf(s
df30: 2c 22 2c 22 29 3b 0a 20 20 66 72 65 65 28 7a 48  ,",");.  free(zH
df40: 64 72 29 3b 0a 20 20 69 66 28 20 7a 4d 65 74 68  dr);.  if( zMeth
df50: 6f 64 5b 30 5d 3d 3d 27 50 27 0a 20 20 20 26 26  od[0]=='P'.   &&
df60: 20 61 74 6f 69 28 7a 43 6f 6e 74 65 6e 74 4c 65   atoi(zContentLe
df70: 6e 67 74 68 29 3e 30 20 0a 20 20 20 26 26 20 28  ngth)>0 .   && (
df80: 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 54 6d 70 4e  in = fopen(zTmpN
df90: 61 6d 2c 22 72 22 29 29 21 3d 30 20 29 7b 0a 20  am,"r"))!=0 ){. 
dfa0: 20 20 20 73 69 7a 65 5f 74 20 6e 3b 0a 20 20 20     size_t n;.   
dfb0: 20 77 68 69 6c 65 28 20 28 6e 20 3d 20 66 72 65   while( (n = fre
dfc0: 61 64 28 7a 4c 69 6e 65 2c 31 2c 73 69 7a 65 6f  ad(zLine,1,sizeo
dfd0: 66 28 7a 4c 69 6e 65 29 2c 69 6e 29 29 3e 30 20  f(zLine),in))>0 
dfe0: 29 7b 0a 20 20 20 20 20 20 66 77 72 69 74 65 28  ){.      fwrite(
dff0: 7a 4c 69 6e 65 2c 20 31 2c 20 6e 2c 20 73 29 3b  zLine, 1, n, s);
e000: 0a 20 20 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73  .    }.    fclos
e010: 65 28 69 6e 29 3b 0a 20 20 7d 0a 20 20 66 66 6c  e(in);.  }.  ffl
e020: 75 73 68 28 73 29 3b 0a 20 20 43 67 69 48 61 6e  ush(s);.  CgiHan
e030: 64 6c 65 52 65 70 6c 79 28 73 29 3b 0a 7d 0a 0a  dleReply(s);.}..
e040: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
e050: 6e 65 20 70 72 6f 63 65 73 73 65 73 20 61 20 73  ne processes a s
e060: 69 6e 67 6c 65 20 48 54 54 50 20 72 65 71 75 65  ingle HTTP reque
e070: 73 74 20 6f 6e 20 73 74 61 6e 64 61 72 64 20 69  st on standard i
e080: 6e 70 75 74 20 61 6e 64 0a 2a 2a 20 73 65 6e 64  nput and.** send
e090: 73 20 74 68 65 20 72 65 70 6c 79 20 74 6f 20 73  s the reply to s
e0a0: 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74 2e 20  tandard output. 
e0b0: 20 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   If the argument
e0c0: 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 0a 2a   is 1 it means.*
e0d0: 2a 20 74 68 61 74 20 77 65 20 61 72 65 20 73 68  * that we are sh
e0e0: 6f 75 6c 64 20 63 6c 6f 73 65 20 74 68 65 20 73  ould close the s
e0f0: 6f 63 6b 65 74 20 77 69 74 68 6f 75 74 20 70 72  ocket without pr
e100: 6f 63 65 73 73 69 6e 67 20 61 64 64 69 74 69 6f  ocessing additio
e110: 6e 61 6c 0a 2a 2a 20 48 54 54 50 20 72 65 71 75  nal.** HTTP requ
e120: 65 73 74 73 20 61 66 74 65 72 20 74 68 65 20 63  ests after the c
e130: 75 72 72 65 6e 74 20 72 65 71 75 65 73 74 20 66  urrent request f
e140: 69 6e 69 73 68 65 73 2e 20 20 30 20 6d 65 61 6e  inishes.  0 mean
e150: 73 20 77 65 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  s we are.** allo
e160: 77 65 64 20 74 6f 20 6b 65 65 70 20 74 68 65 20  wed to keep the 
e170: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20  connection open 
e180: 61 6e 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61  and to process a
e190: 64 64 69 74 69 6f 6e 61 6c 20 72 65 71 75 65 73  dditional reques
e1a0: 74 73 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ts..** This rout
e1b0: 69 6e 65 20 6d 61 79 20 63 68 6f 6f 73 65 20 74  ine may choose t
e1c0: 6f 20 63 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e  o close the conn
e1d0: 65 63 74 69 6f 6e 20 65 76 65 6e 20 69 66 20 74  ection even if t
e1e0: 68 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  he argument.** i
e1f0: 73 20 30 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  s 0..** .** If t
e200: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 68  he connection sh
e210: 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 2c 20  ould be closed, 
e220: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6c  this routine cal
e230: 6c 73 20 65 78 69 74 28 29 20 61 6e 64 0a 2a 2a  ls exit() and.**
e240: 20 74 68 75 73 20 6e 65 76 65 72 20 72 65 74 75   thus never retu
e250: 72 6e 73 2e 20 20 49 66 20 74 68 69 73 20 72 6f  rns.  If this ro
e260: 75 74 69 6e 65 20 64 6f 65 73 20 72 65 74 75 72  utine does retur
e270: 6e 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  n it means that 
e280: 61 6e 6f 74 68 65 72 0a 2a 2a 20 48 54 54 50 20  another.** HTTP 
e290: 72 65 71 75 65 73 74 20 6d 61 79 20 61 70 70 65  request may appe
e2a0: 61 72 20 6f 6e 20 74 68 65 20 77 69 72 65 2e 0a  ar on the wire..
e2b0: 2a 2f 0a 76 6f 69 64 20 50 72 6f 63 65 73 73 4f  */.void ProcessO
e2c0: 6e 65 52 65 71 75 65 73 74 28 69 6e 74 20 66 6f  neRequest(int fo
e2d0: 72 63 65 43 6c 6f 73 65 29 7b 0a 20 20 69 6e 74  rceClose){.  int
e2e0: 20 69 2c 20 6a 2c 20 6a 30 3b 0a 20 20 63 68 61   i, j, j0;.  cha
e2f0: 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20  r *z;           
e300: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
e310: 6f 20 70 61 72 73 65 20 75 70 20 61 20 73 74 72  o parse up a str
e320: 69 6e 67 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ing */.  struct 
e330: 73 74 61 74 20 73 74 61 74 62 75 66 3b 20 20 20  stat statbuf;   
e340: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
e350: 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65  n about the file
e360: 20 74 6f 20 62 65 20 72 65 74 72 69 65 76 65 64   to be retrieved
e370: 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 20   */.  FILE *in; 
e380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e390: 2f 2a 20 46 6f 72 20 72 65 61 64 69 6e 67 20 66  /* For reading f
e3a0: 72 6f 6d 20 43 47 49 20 73 63 72 69 70 74 73 20  rom CGI scripts 
e3b0: 2a 2f 0a 23 69 66 64 65 66 20 4c 4f 47 5f 48 45  */.#ifdef LOG_HE
e3c0: 41 44 45 52 0a 20 20 46 49 4c 45 20 2a 68 64 72  ADER.  FILE *hdr
e3d0: 4c 6f 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Log = 0;        
e3e0: 20 2f 2a 20 4c 6f 67 20 66 69 6c 65 20 66 6f 72   /* Log file for
e3f0: 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
e400: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 23 65 6e 64   content */.#end
e410: 69 66 0a 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b  if.  char zLine[
e420: 31 30 30 30 5d 3b 20 20 20 20 20 20 20 20 20 2f  1000];         /
e430: 2a 20 41 20 62 75 66 66 65 72 20 66 6f 72 20 69  * A buffer for i
e440: 6e 70 75 74 20 6c 69 6e 65 73 20 6f 72 20 66 6f  nput lines or fo
e450: 72 6d 69 6e 67 20 6e 61 6d 65 73 20 2a 2f 0a 0a  rming names */..
e460: 20 20 2f 2a 20 43 68 61 6e 67 65 20 64 69 72 65    /* Change dire
e470: 63 74 6f 72 69 65 73 20 74 6f 20 74 68 65 20 72  ctories to the r
e480: 6f 6f 74 20 6f 66 20 74 68 65 20 48 54 54 50 20  oot of the HTTP 
e490: 66 69 6c 65 73 79 73 74 65 6d 0a 20 20 2a 2f 0a  filesystem.  */.
e4a0: 20 20 69 66 28 20 63 68 64 69 72 28 7a 52 6f 6f    if( chdir(zRoo
e4b0: 74 5b 30 5d 20 3f 20 7a 52 6f 6f 74 20 3a 20 22  t[0] ? zRoot : "
e4c0: 2f 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68  /")!=0 ){.    ch
e4d0: 61 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20  ar zBuf[1000];. 
e4e0: 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 31     Malfunction(1
e4f0: 39 30 2c 20 20 20 2f 2a 20 4c 4f 47 3a 20 63 68  90,   /* LOG: ch
e500: 64 69 72 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a  dir() failed */.
e510: 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74           "cannot
e520: 20 63 68 64 69 72 20 74 6f 20 5b 25 73 5d 20 66   chdir to [%s] f
e530: 72 6f 6d 20 5b 25 73 5d 22 2c 0a 20 20 20 20 20  rom [%s]",.     
e540: 20 20 20 20 7a 52 6f 6f 74 2c 20 67 65 74 63 77      zRoot, getcw
e550: 64 28 7a 42 75 66 2c 39 39 39 29 29 3b 0a 20 20  d(zBuf,999));.  
e560: 7d 0a 20 20 6e 52 65 71 75 65 73 74 2b 2b 3b 0a  }.  nRequest++;.
e570: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 6d 75  .  /*.  ** We mu
e580: 73 74 20 72 65 63 65 69 76 65 20 61 20 63 6f 6d  st receive a com
e590: 70 6c 65 74 65 20 68 65 61 64 65 72 20 77 69 74  plete header wit
e5a0: 68 69 6e 20 31 35 20 73 65 63 6f 6e 64 73 0a 20  hin 15 seconds. 
e5b0: 20 2a 2f 0a 20 20 73 69 67 6e 61 6c 28 53 49 47   */.  signal(SIG
e5c0: 41 4c 52 4d 2c 20 54 69 6d 65 6f 75 74 29 3b 0a  ALRM, Timeout);.
e5d0: 20 20 73 69 67 6e 61 6c 28 53 49 47 53 45 47 56    signal(SIGSEGV
e5e0: 2c 20 54 69 6d 65 6f 75 74 29 3b 0a 20 20 73 69  , Timeout);.  si
e5f0: 67 6e 61 6c 28 53 49 47 50 49 50 45 2c 20 54 69  gnal(SIGPIPE, Ti
e600: 6d 65 6f 75 74 29 3b 0a 20 20 69 66 28 20 75 73  meout);.  if( us
e610: 65 54 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d  eTimeout ) alarm
e620: 28 31 35 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20  (15);..  /* Get 
e630: 74 68 65 20 66 69 72 73 74 20 6c 69 6e 65 20 6f  the first line o
e640: 66 20 74 68 65 20 72 65 71 75 65 73 74 20 61 6e  f the request an
e650: 64 20 70 61 72 73 65 20 6f 75 74 20 74 68 65 0a  d parse out the.
e660: 20 20 2a 2a 20 6d 65 74 68 6f 64 2c 20 74 68 65    ** method, the
e670: 20 73 63 72 69 70 74 20 61 6e 64 20 74 68 65 20   script and the 
e680: 70 72 6f 74 6f 63 6f 6c 2e 0a 20 20 2a 2f 0a 20  protocol..  */. 
e690: 20 69 66 28 20 66 67 65 74 73 28 7a 4c 69 6e 65   if( fgets(zLine
e6a0: 2c 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 73  ,sizeof(zLine),s
e6b0: 74 64 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tdin)==0 ){.    
e6c0: 65 78 69 74 28 30 29 3b 0a 20 20 7d 0a 20 20 6f  exit(0);.  }.  o
e6d0: 6d 69 74 4c 6f 67 20 3d 20 30 3b 0a 20 20 6e 49  mitLog = 0;.  nI
e6e0: 6e 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 4c 69 6e  n += strlen(zLin
e6f0: 65 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20  e);..  /* Parse 
e700: 74 68 65 20 66 69 72 73 74 20 6c 69 6e 65 20 6f  the first line o
e710: 66 20 74 68 65 20 48 54 54 50 20 72 65 71 75 65  f the HTTP reque
e720: 73 74 20 2a 2f 0a 20 20 7a 4d 65 74 68 6f 64 20  st */.  zMethod 
e730: 3d 20 53 74 72 44 75 70 28 47 65 74 46 69 72 73  = StrDup(GetFirs
e740: 74 45 6c 65 6d 65 6e 74 28 7a 4c 69 6e 65 2c 26  tElement(zLine,&
e750: 7a 29 29 3b 0a 20 20 7a 52 65 61 6c 53 63 72 69  z));.  zRealScri
e760: 70 74 20 3d 20 7a 53 63 72 69 70 74 20 3d 20 53  pt = zScript = S
e770: 74 72 44 75 70 28 47 65 74 46 69 72 73 74 45 6c  trDup(GetFirstEl
e780: 65 6d 65 6e 74 28 7a 2c 26 7a 29 29 3b 0a 20 20  ement(z,&z));.  
e790: 7a 50 72 6f 74 6f 63 6f 6c 20 3d 20 53 74 72 44  zProtocol = StrD
e7a0: 75 70 28 47 65 74 46 69 72 73 74 45 6c 65 6d 65  up(GetFirstEleme
e7b0: 6e 74 28 7a 2c 26 7a 29 29 3b 0a 20 20 69 66 28  nt(z,&z));.  if(
e7c0: 20 7a 50 72 6f 74 6f 63 6f 6c 3d 3d 30 20 7c 7c   zProtocol==0 ||
e7d0: 20 73 74 72 6e 63 6d 70 28 7a 50 72 6f 74 6f 63   strncmp(zProtoc
e7e0: 6f 6c 2c 22 48 54 54 50 2f 22 2c 35 29 21 3d 30  ol,"HTTP/",5)!=0
e7f0: 20 7c 7c 20 73 74 72 6c 65 6e 28 7a 50 72 6f 74   || strlen(zProt
e800: 6f 63 6f 6c 29 21 3d 38 20 29 7b 0a 20 20 20 20  ocol)!=8 ){.    
e810: 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 34  StartResponse("4
e820: 30 30 20 42 61 64 20 52 65 71 75 65 73 74 22 29  00 Bad Request")
e830: 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72  ;.    nOut += pr
e840: 69 6e 74 66 28 0a 20 20 20 20 20 20 22 43 6f 6e  intf(.      "Con
e850: 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f  tent-type: text/
e860: 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 20  plain\r\n".     
e870: 20 22 5c 72 5c 6e 22 0a 20 20 20 20 20 20 22 54   "\r\n".      "T
e880: 68 69 73 20 73 65 72 76 65 72 20 64 6f 65 73 20  his server does 
e890: 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74  not understand t
e8a0: 68 65 20 72 65 71 75 65 73 74 65 64 20 70 72 6f  he requested pro
e8b0: 74 6f 63 6f 6c 5c 6e 22 0a 20 20 20 20 29 3b 0a  tocol\n".    );.
e8c0: 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79      MakeLogEntry
e8d0: 28 30 2c 20 32 30 30 29 3b 20 2f 2a 20 4c 4f 47  (0, 200); /* LOG
e8e0: 3a 20 62 61 64 20 70 72 6f 74 6f 63 6f 6c 20 69  : bad protocol i
e8f0: 6e 20 48 54 54 50 20 68 65 61 64 65 72 20 2a 2f  n HTTP header */
e900: 0a 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20  .    exit(0);.  
e910: 7d 0a 20 20 69 66 28 20 7a 53 63 72 69 70 74 5b  }.  if( zScript[
e920: 30 5d 3d 3d 30 20 29 20 4e 6f 74 46 6f 75 6e 64  0]==0 ) NotFound
e930: 28 32 31 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 45  (210); /* LOG: E
e940: 6d 70 74 79 20 72 65 71 75 65 73 74 20 55 52 49  mpty request URI
e950: 20 2a 2f 0a 20 20 69 66 28 20 66 6f 72 63 65 43   */.  if( forceC
e960: 6c 6f 73 65 20 29 7b 0a 20 20 20 20 63 6c 6f 73  lose ){.    clos
e970: 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 31 3b  eConnection = 1;
e980: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 72  .  }else if( zPr
e990: 6f 74 6f 63 6f 6c 5b 35 5d 3c 27 31 27 20 7c 7c  otocol[5]<'1' ||
e9a0: 20 7a 50 72 6f 74 6f 63 6f 6c 5b 37 5d 3c 27 31   zProtocol[7]<'1
e9b0: 27 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 43 6f  ' ){.    closeCo
e9c0: 6e 6e 65 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20  nnection = 1;.  
e9d0: 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 76 65 72  }..  /* This ver
e9e0: 79 20 73 69 6d 70 6c 65 20 73 65 72 76 65 72 20  y simple server 
e9f0: 6f 6e 6c 79 20 75 6e 64 65 72 73 74 61 6e 64 73  only understands
ea00: 20 74 68 65 20 47 45 54 2c 20 50 4f 53 54 0a 20   the GET, POST. 
ea10: 20 2a 2a 20 61 6e 64 20 48 45 41 44 20 6d 65 74   ** and HEAD met
ea20: 68 6f 64 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  hods.  */.  if( 
ea30: 73 74 72 63 6d 70 28 7a 4d 65 74 68 6f 64 2c 22  strcmp(zMethod,"
ea40: 47 45 54 22 29 21 3d 30 20 26 26 20 73 74 72 63  GET")!=0 && strc
ea50: 6d 70 28 7a 4d 65 74 68 6f 64 2c 22 50 4f 53 54  mp(zMethod,"POST
ea60: 22 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20  ")!=0.       && 
ea70: 73 74 72 63 6d 70 28 7a 4d 65 74 68 6f 64 2c 22  strcmp(zMethod,"
ea80: 48 45 41 44 22 29 21 3d 30 20 29 7b 0a 20 20 20  HEAD")!=0 ){.   
ea90: 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22   StartResponse("
eaa0: 35 30 31 20 4e 6f 74 20 49 6d 70 6c 65 6d 65 6e  501 Not Implemen
eab0: 74 65 64 22 29 3b 0a 20 20 20 20 6e 4f 75 74 20  ted");.    nOut 
eac0: 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20  += printf(.     
ead0: 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20   "Content-type: 
eae0: 74 65 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a  text/plain\r\n".
eaf0: 20 20 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20        "\r\n".   
eb00: 20 20 20 22 54 68 65 20 25 73 20 6d 65 74 68 6f     "The %s metho
eb10: 64 20 69 73 20 6e 6f 74 20 69 6d 70 6c 65 6d 65  d is not impleme
eb20: 6e 74 65 64 20 6f 6e 20 74 68 69 73 20 73 65 72  nted on this ser
eb30: 76 65 72 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 7a  ver.\n",.      z
eb40: 4d 65 74 68 6f 64 29 3b 0a 20 20 20 20 4d 61 6b  Method);.    Mak
eb50: 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 32 32 30  eLogEntry(0, 220
eb60: 29 3b 20 2f 2a 20 4c 4f 47 3a 20 55 6e 6b 6e 6f  ); /* LOG: Unkno
eb70: 77 6e 20 72 65 71 75 65 73 74 20 6d 65 74 68 6f  wn request metho
eb80: 64 20 2a 2f 0a 20 20 20 20 65 78 69 74 28 30 29  d */.    exit(0)
eb90: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
eba0: 68 65 72 65 20 69 73 20 61 20 6c 6f 67 20 66 69  here is a log fi
ebb0: 6c 65 20 28 69 66 20 7a 4c 6f 67 46 69 6c 65 21  le (if zLogFile!
ebc0: 3d 30 29 20 61 6e 64 20 69 66 20 74 68 65 20 70  =0) and if the p
ebd0: 61 74 68 6e 61 6d 65 20 69 6e 0a 20 20 2a 2a 20  athname in.  ** 
ebe0: 74 68 65 20 66 69 72 73 74 20 6c 69 6e 65 20 6f  the first line o
ebf0: 66 20 74 68 65 20 68 74 74 70 20 72 65 71 75 65  f the http reque
ec00: 73 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  st contains the 
ec10: 6d 61 67 69 63 20 73 74 72 69 6e 67 0a 20 20 2a  magic string.  *
ec20: 2a 20 22 46 75 6c 6c 48 65 61 64 65 72 4c 6f 67  * "FullHeaderLog
ec30: 22 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  " then write the
ec40: 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
ec50: 20 74 65 78 74 20 69 6e 74 6f 20 74 68 65 0a 20   text into the. 
ec60: 20 2a 2a 20 66 69 6c 65 20 25 73 28 7a 4c 6f 67   ** file %s(zLog
ec70: 46 69 6c 65 29 2d 68 64 72 2e 20 20 4f 76 65 72  File)-hdr.  Over
ec80: 77 72 69 74 65 20 74 68 65 20 66 69 6c 65 2e 20  write the file. 
ec90: 20 54 68 69 73 20 69 73 20 66 6f 72 20 70 72 6f   This is for pro
eca0: 74 6f 63 6f 6c 0a 20 20 2a 2a 20 64 65 62 75 67  tocol.  ** debug
ecb0: 67 69 6e 67 20 6f 6e 6c 79 20 61 6e 64 20 69 73  ging only and is
ecc0: 20 6f 6e 6c 79 20 65 6e 61 62 6c 65 64 20 69 66   only enabled if
ecd0: 20 61 6c 74 68 74 74 70 64 20 69 73 20 63 6f 6d   althttpd is com
ece0: 70 69 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a 20  piled with.  ** 
ecf0: 74 68 65 20 2d 44 4c 4f 47 5f 48 45 41 44 45 52  the -DLOG_HEADER
ed00: 3d 31 20 6f 70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  =1 option..  */.
ed10: 23 69 66 64 65 66 20 4c 4f 47 5f 48 45 41 44 45  #ifdef LOG_HEADE
ed20: 52 0a 20 20 69 66 28 20 7a 4c 6f 67 46 69 6c 65  R.  if( zLogFile
ed30: 0a 20 20 20 26 26 20 73 74 72 73 74 72 28 7a 53  .   && strstr(zS
ed40: 63 72 69 70 74 2c 22 46 75 6c 6c 48 65 61 64 65  cript,"FullHeade
ed50: 72 4c 6f 67 22 29 21 3d 30 0a 20 20 20 26 26 20  rLog")!=0.   && 
ed60: 73 74 72 6c 65 6e 28 7a 4c 6f 67 46 69 6c 65 29  strlen(zLogFile)
ed70: 3c 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2d 35  <sizeof(zLine)-5
ed80: 30 0a 20 20 29 7b 0a 20 20 20 20 73 70 72 69 6e  0.  ){.    sprin
ed90: 74 66 28 7a 4c 69 6e 65 2c 20 22 25 73 2d 68 64  tf(zLine, "%s-hd
eda0: 72 22 2c 20 7a 4c 6f 67 46 69 6c 65 29 3b 0a 20  r", zLogFile);. 
edb0: 20 20 20 68 64 72 4c 6f 67 20 3d 20 66 6f 70 65     hdrLog = fope
edc0: 6e 28 7a 4c 69 6e 65 2c 20 22 77 62 22 29 3b 0a  n(zLine, "wb");.
edd0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 2f    }.#endif...  /
ede0: 2a 20 47 65 74 20 61 6c 6c 20 74 68 65 20 6f 70  * Get all the op
edf0: 74 69 6f 6e 61 6c 20 66 69 65 6c 64 73 20 74 68  tional fields th
ee00: 61 74 20 66 6f 6c 6c 6f 77 20 74 68 65 20 66 69  at follow the fi
ee10: 72 73 74 20 6c 69 6e 65 2e 0a 20 20 2a 2f 0a 20  rst line..  */. 
ee20: 20 7a 43 6f 6f 6b 69 65 20 3d 20 30 3b 0a 20 20   zCookie = 0;.  
ee30: 7a 41 75 74 68 54 79 70 65 20 3d 20 30 3b 0a 20  zAuthType = 0;. 
ee40: 20 7a 52 65 6d 6f 74 65 55 73 65 72 20 3d 20 30   zRemoteUser = 0
ee50: 3b 0a 20 20 7a 52 65 66 65 72 65 72 20 3d 20 30  ;.  zReferer = 0
ee60: 3b 0a 20 20 7a 49 66 4e 6f 6e 65 4d 61 74 63 68  ;.  zIfNoneMatch
ee70: 20 3d 20 30 3b 0a 20 20 7a 49 66 4d 6f 64 69 66   = 0;.  zIfModif
ee80: 69 65 64 53 69 6e 63 65 20 3d 20 30 3b 0a 20 20  iedSince = 0;.  
ee90: 77 68 69 6c 65 28 20 66 67 65 74 73 28 7a 4c 69  while( fgets(zLi
eea0: 6e 65 2c 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29  ne,sizeof(zLine)
eeb0: 2c 73 74 64 69 6e 29 20 29 7b 0a 20 20 20 20 63  ,stdin) ){.    c
eec0: 68 61 72 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 3b  har *zFieldName;
eed0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 3b  .    char *zVal;
eee0: 0a 0a 23 69 66 64 65 66 20 4c 4f 47 5f 48 45 41  ..#ifdef LOG_HEA
eef0: 44 45 52 0a 20 20 20 20 69 66 28 20 68 64 72 4c  DER.    if( hdrL
ef00: 6f 67 20 29 20 66 70 72 69 6e 74 66 28 68 64 72  og ) fprintf(hdr
ef10: 4c 6f 67 2c 20 22 25 73 22 2c 20 7a 4c 69 6e 65  Log, "%s", zLine
ef20: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 6e 49  );.#endif.    nI
ef30: 6e 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 4c 69 6e  n += strlen(zLin
ef40: 65 29 3b 0a 20 20 20 20 7a 46 69 65 6c 64 4e 61  e);.    zFieldNa
ef50: 6d 65 20 3d 20 47 65 74 46 69 72 73 74 45 6c 65  me = GetFirstEle
ef60: 6d 65 6e 74 28 7a 4c 69 6e 65 2c 26 7a 56 61 6c  ment(zLine,&zVal
ef70: 29 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 65 6c  );.    if( zFiel
ef80: 64 4e 61 6d 65 3d 3d 30 20 7c 7c 20 2a 7a 46 69  dName==0 || *zFi
ef90: 65 6c 64 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65  eldName==0 ) bre
efa0: 61 6b 3b 0a 20 20 20 20 52 65 6d 6f 76 65 4e 65  ak;.    RemoveNe
efb0: 77 6c 69 6e 65 28 7a 56 61 6c 29 3b 0a 20 20 20  wline(zVal);.   
efc0: 20 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28   if( strcasecmp(
efd0: 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 55 73 65 72  zFieldName,"User
efe0: 2d 41 67 65 6e 74 3a 22 29 3d 3d 30 20 29 7b 0a  -Agent:")==0 ){.
eff0: 20 20 20 20 20 20 7a 41 67 65 6e 74 20 3d 20 53        zAgent = S
f000: 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20  trDup(zVal);.   
f010: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 61   }else if( strca
f020: 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65  secmp(zFieldName
f030: 2c 22 41 63 63 65 70 74 3a 22 29 3d 3d 30 20 29  ,"Accept:")==0 )
f040: 7b 0a 20 20 20 20 20 20 7a 41 63 63 65 70 74 20  {.      zAccept 
f050: 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a  = StrDup(zVal);.
f060: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
f070: 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e  rcasecmp(zFieldN
f080: 61 6d 65 2c 22 41 63 63 65 70 74 2d 45 6e 63 6f  ame,"Accept-Enco
f090: 64 69 6e 67 3a 22 29 3d 3d 30 20 29 7b 0a 20 20  ding:")==0 ){.  
f0a0: 20 20 20 20 7a 41 63 63 65 70 74 45 6e 63 6f 64      zAcceptEncod
f0b0: 69 6e 67 20 3d 20 53 74 72 44 75 70 28 7a 56 61  ing = StrDup(zVa
f0c0: 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  l);.    }else if
f0d0: 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69  ( strcasecmp(zFi
f0e0: 65 6c 64 4e 61 6d 65 2c 22 43 6f 6e 74 65 6e 74  eldName,"Content
f0f0: 2d 6c 65 6e 67 74 68 3a 22 29 3d 3d 30 20 29 7b  -length:")==0 ){
f100: 0a 20 20 20 20 20 20 7a 43 6f 6e 74 65 6e 74 4c  .      zContentL
f110: 65 6e 67 74 68 20 3d 20 53 74 72 44 75 70 28 7a  ength = StrDup(z
f120: 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Val);.    }else 
f130: 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a  if( strcasecmp(z
f140: 46 69 65 6c 64 4e 61 6d 65 2c 22 43 6f 6e 74 65  FieldName,"Conte
f150: 6e 74 2d 74 79 70 65 3a 22 29 3d 3d 30 20 29 7b  nt-type:")==0 ){
f160: 0a 20 20 20 20 20 20 7a 43 6f 6e 74 65 6e 74 54  .      zContentT
f170: 79 70 65 20 3d 20 53 74 72 44 75 70 28 7a 56 61  ype = StrDup(zVa
f180: 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  l);.    }else if
f190: 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69  ( strcasecmp(zFi
f1a0: 65 6c 64 4e 61 6d 65 2c 22 52 65 66 65 72 65 72  eldName,"Referer
f1b0: 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  :")==0 ){.      
f1c0: 7a 52 65 66 65 72 65 72 20 3d 20 53 74 72 44 75  zReferer = StrDu
f1d0: 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 69  p(zVal);.      i
f1e0: 66 28 20 73 74 72 73 74 72 28 7a 56 61 6c 2c 20  f( strstr(zVal, 
f1f0: 22 64 65 76 69 64 73 2e 6e 65 74 2f 22 29 21 3d  "devids.net/")!=
f200: 30 20 29 7b 20 7a 52 65 66 65 72 65 72 20 3d 20  0 ){ zReferer = 
f210: 22 64 65 76 69 64 73 2e 6e 65 74 2e 73 6d 75 74  "devids.net.smut
f220: 22 3b 0a 20 20 20 20 20 20 20 20 46 6f 72 62 69  ";.        Forbi
f230: 64 64 65 6e 28 32 33 30 29 3b 20 2f 2a 20 4c 4f  dden(230); /* LO
f240: 47 3a 20 52 65 66 65 72 72 65 72 20 69 73 20 64  G: Referrer is d
f250: 65 76 69 64 73 2e 6e 65 74 20 2a 2f 0a 20 20 20  evids.net */.   
f260: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
f270: 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46  f( strcasecmp(zF
f280: 69 65 6c 64 4e 61 6d 65 2c 22 43 6f 6f 6b 69 65  ieldName,"Cookie
f290: 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  :")==0 ){.      
f2a0: 7a 43 6f 6f 6b 69 65 20 3d 20 53 74 72 41 70 70  zCookie = StrApp
f2b0: 65 6e 64 28 7a 43 6f 6f 6b 69 65 2c 22 3b 20 22  end(zCookie,"; "
f2c0: 2c 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  ,zVal);.    }els
f2d0: 65 20 69 66 28 20 73 74 72 63 61 73 65 63 6d 70  e if( strcasecmp
f2e0: 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 43 6f 6e  (zFieldName,"Con
f2f0: 6e 65 63 74 69 6f 6e 3a 22 29 3d 3d 30 20 29 7b  nection:")==0 ){
f300: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 61  .      if( strca
f310: 73 65 63 6d 70 28 7a 56 61 6c 2c 22 63 6c 6f 73  secmp(zVal,"clos
f320: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
f330: 20 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f    closeConnectio
f340: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  n = 1;.      }el
f350: 73 65 20 69 66 28 20 21 66 6f 72 63 65 43 6c 6f  se if( !forceClo
f360: 73 65 20 26 26 20 73 74 72 63 61 73 65 63 6d 70  se && strcasecmp
f370: 28 7a 56 61 6c 2c 20 22 6b 65 65 70 2d 61 6c 69  (zVal, "keep-ali
f380: 76 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ve")==0 ){.     
f390: 20 20 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69     closeConnecti
f3a0: 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  on = 0;.      }.
f3b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
f3c0: 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e  rcasecmp(zFieldN
f3d0: 61 6d 65 2c 22 48 6f 73 74 3a 22 29 3d 3d 30 20  ame,"Host:")==0 
f3e0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 53  ){.      int inS
f3f0: 71 75 61 72 65 20 3d 20 30 3b 0a 20 20 20 20 20  quare = 0;.     
f400: 20 63 68 61 72 20 63 3b 0a 20 20 20 20 20 20 69   char c;.      i
f410: 66 28 20 73 61 6e 69 74 69 7a 65 53 74 72 69 6e  f( sanitizeStrin
f420: 67 28 7a 56 61 6c 29 20 29 7b 0a 20 20 20 20 20  g(zVal) ){.     
f430: 20 20 20 46 6f 72 62 69 64 64 65 6e 28 32 34 30     Forbidden(240
f440: 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 49 6c 6c 65  );  /* LOG: Ille
f450: 67 61 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 48  gal content in H
f460: 4f 53 54 3a 20 70 61 72 61 6d 65 74 65 72 20 2a  OST: parameter *
f470: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
f480: 7a 48 74 74 70 48 6f 73 74 20 3d 20 53 74 72 44  zHttpHost = StrD
f490: 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20  up(zVal);.      
f4a0: 7a 53 65 72 76 65 72 50 6f 72 74 20 3d 20 7a 53  zServerPort = zS
f4b0: 65 72 76 65 72 4e 61 6d 65 20 3d 20 53 74 72 44  erverName = StrD
f4c0: 75 70 28 7a 48 74 74 70 48 6f 73 74 29 3b 0a 20  up(zHttpHost);. 
f4d0: 20 20 20 20 20 77 68 69 6c 65 28 20 7a 53 65 72       while( zSer
f4e0: 76 65 72 50 6f 72 74 20 26 26 20 28 63 20 3d 20  verPort && (c = 
f4f0: 2a 7a 53 65 72 76 65 72 50 6f 72 74 29 21 3d 30  *zServerPort)!=0
f500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
f510: 26 20 28 63 21 3d 27 3a 27 20 7c 7c 20 69 6e 53  & (c!=':' || inS
f520: 71 75 61 72 65 29 20 29 7b 0a 20 20 20 20 20 20  quare) ){.      
f530: 20 20 69 66 28 20 63 3d 3d 27 5b 27 20 29 20 69    if( c=='[' ) i
f540: 6e 53 71 75 61 72 65 20 3d 20 31 3b 0a 20 20 20  nSquare = 1;.   
f550: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5d 27 20       if( c==']' 
f560: 29 20 69 6e 53 71 75 61 72 65 20 3d 20 30 3b 0a  ) inSquare = 0;.
f570: 20 20 20 20 20 20 20 20 7a 53 65 72 76 65 72 50          zServerP
f580: 6f 72 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ort++;.      }. 
f590: 20 20 20 20 20 69 66 28 20 7a 53 65 72 76 65 72       if( zServer
f5a0: 50 6f 72 74 20 26 26 20 2a 7a 53 65 72 76 65 72  Port && *zServer
f5b0: 50 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Port ){.        
f5c0: 2a 7a 53 65 72 76 65 72 50 6f 72 74 20 3d 20 30  *zServerPort = 0
f5d0: 3b 0a 20 20 20 20 20 20 20 20 7a 53 65 72 76 65  ;.        zServe
f5e0: 72 50 6f 72 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  rPort++;.      }
f5f0: 0a 20 20 20 20 20 20 69 66 28 20 7a 52 65 61 6c  .      if( zReal
f600: 50 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Port ){.        
f610: 7a 53 65 72 76 65 72 50 6f 72 74 20 3d 20 53 74  zServerPort = St
f620: 72 44 75 70 28 7a 52 65 61 6c 50 6f 72 74 29 3b  rDup(zRealPort);
f630: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
f640: 73 65 20 69 66 28 20 73 74 72 63 61 73 65 63 6d  se if( strcasecm
f650: 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 41 75  p(zFieldName,"Au
f660: 74 68 6f 72 69 7a 61 74 69 6f 6e 3a 22 29 3d 3d  thorization:")==
f670: 30 20 29 7b 0a 20 20 20 20 20 20 7a 41 75 74 68  0 ){.      zAuth
f680: 54 79 70 65 20 3d 20 47 65 74 46 69 72 73 74 45  Type = GetFirstE
f690: 6c 65 6d 65 6e 74 28 53 74 72 44 75 70 28 7a 56  lement(StrDup(zV
f6a0: 61 6c 29 2c 20 26 7a 41 75 74 68 41 72 67 29 3b  al), &zAuthArg);
f6b0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
f6c0: 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64  trcasecmp(zField
f6d0: 4e 61 6d 65 2c 22 49 66 2d 4e 6f 6e 65 2d 4d 61  Name,"If-None-Ma
f6e0: 74 63 68 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20  tch:")==0 ){.   
f6f0: 20 20 20 7a 49 66 4e 6f 6e 65 4d 61 74 63 68 20     zIfNoneMatch 
f700: 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a  = StrDup(zVal);.
f710: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
f720: 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e  rcasecmp(zFieldN
f730: 61 6d 65 2c 22 49 66 2d 4d 6f 64 69 66 69 65 64  ame,"If-Modified
f740: 2d 53 69 6e 63 65 3a 22 29 3d 3d 30 20 29 7b 0a  -Since:")==0 ){.
f750: 20 20 20 20 20 20 7a 49 66 4d 6f 64 69 66 69 65        zIfModifie
f760: 64 53 69 6e 63 65 20 3d 20 53 74 72 44 75 70 28  dSince = StrDup(
f770: 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  zVal);.    }.  }
f780: 0a 23 69 66 64 65 66 20 4c 4f 47 5f 48 45 41 44  .#ifdef LOG_HEAD
f790: 45 52 0a 20 20 69 66 28 20 68 64 72 4c 6f 67 20  ER.  if( hdrLog 
f7a0: 29 20 66 63 6c 6f 73 65 28 68 64 72 4c 6f 67 29  ) fclose(hdrLog)
f7b0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  ;.#endif..  /* D
f7c0: 69 73 61 6c 6c 6f 77 20 72 65 71 75 65 73 74 73  isallow requests
f7d0: 20 66 72 6f 6d 20 63 65 72 74 61 69 6e 20 63 6c   from certain cl
f7e0: 69 65 6e 74 73 20 2a 2f 0a 20 20 69 66 28 20 7a  ients */.  if( z
f7f0: 41 67 65 6e 74 20 29 7b 0a 20 20 20 20 69 66 28  Agent ){.    if(
f800: 20 73 74 72 73 74 72 28 7a 41 67 65 6e 74 2c 20   strstr(zAgent, 
f810: 22 57 69 6e 64 6f 77 73 5f 39 22 29 21 3d 30 0a  "Windows_9")!=0.
f820: 20 20 20 20 20 7c 7c 20 73 74 72 73 74 72 28 7a       || strstr(z
f830: 41 67 65 6e 74 2c 20 22 44 6f 77 6e 6c 6f 61 64  Agent, "Download
f840: 5f 4d 61 73 74 65 72 22 29 21 3d 30 0a 20 20 20  _Master")!=0.   
f850: 20 20 7c 7c 20 73 74 72 73 74 72 28 7a 41 67 65    || strstr(zAge
f860: 6e 74 2c 20 22 45 7a 6f 6f 6d 73 2f 22 29 21 3d  nt, "Ezooms/")!=
f870: 30 0a 20 20 20 20 20 7c 7c 20 73 74 72 73 74 72  0.     || strstr
f880: 28 7a 41 67 65 6e 74 2c 20 22 48 54 54 72 61 63  (zAgent, "HTTrac
f890: 6b 22 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 73  k")!=0.     || s
f8a0: 74 72 73 74 72 28 7a 41 67 65 6e 74 2c 20 22 41  trstr(zAgent, "A
f8b0: 68 72 65 66 73 42 6f 74 22 29 21 3d 30 0a 20 20  hrefsBot")!=0.  
f8c0: 20 20 29 7b 0a 20 20 20 20 20 20 46 6f 72 62 69    ){.      Forbi
f8d0: 64 64 65 6e 28 32 35 30 29 3b 20 20 2f 2a 20 4c  dden(250);  /* L
f8e0: 4f 47 3a 20 44 69 73 61 6c 6c 6f 77 65 64 20 75  OG: Disallowed u
f8f0: 73 65 72 20 61 67 65 6e 74 20 2a 2f 0a 20 20 20  ser agent */.   
f900: 20 7d 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 20   }.#if 0.    /* 
f910: 53 70 69 64 65 72 20 61 74 74 61 63 6b 20 66 72  Spider attack fr
f920: 6f 6d 20 32 30 31 39 2d 30 34 2d 32 34 20 2a 2f  om 2019-04-24 */
f930: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
f940: 7a 41 67 65 6e 74 2c 0a 20 20 20 20 20 20 20 20  zAgent,.        
f950: 20 20 20 20 22 4d 6f 7a 69 6c 6c 61 2f 35 2e 30      "Mozilla/5.0
f960: 20 28 57 69 6e 64 6f 77 73 20 4e 54 20 31 30 2e   (Windows NT 10.
f970: 30 3b 20 57 4f 57 36 34 29 20 41 70 70 6c 65 57  0; WOW64) AppleW
f980: 65 62 4b 69 74 2f 35 33 37 2e 33 36 20 22 0a 20  ebKit/537.36 ". 
f990: 20 20 20 20 20 20 20 20 20 20 20 22 28 4b 48 54             "(KHT
f9a0: 4d 4c 2c 20 6c 69 6b 65 20 47 65 63 6b 6f 29 20  ML, like Gecko) 
f9b0: 43 68 72 6f 6d 65 2f 35 30 2e 30 2e 32 36 36 31  Chrome/50.0.2661
f9c0: 2e 31 30 32 20 53 61 66 61 72 69 2f 35 33 37 2e  .102 Safari/537.
f9d0: 33 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  36")==0 ){.     
f9e0: 20 46 6f 72 62 69 64 64 65 6e 28 32 35 31 29 3b   Forbidden(251);
f9f0: 20 20 2f 2a 20 4c 4f 47 3a 20 44 69 73 61 6c 6c    /* LOG: Disall
fa00: 6f 77 65 64 20 75 73 65 72 20 61 67 65 6e 74 20  owed user agent 
fa10: 28 32 30 31 39 30 34 32 34 29 20 2a 2f 0a 20 20  (20190424) */.  
fa20: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23    }.#endif.  }.#
fa30: 69 66 20 30 0a 20 20 69 66 28 20 7a 52 65 66 65  if 0.  if( zRefe
fa40: 72 65 72 20 29 7b 0a 20 20 20 20 73 74 61 74 69  rer ){.    stati
fa50: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
fa60: 44 69 73 61 6c 6c 6f 77 5b 5d 20 3d 20 7b 0a 20  Disallow[] = {. 
fa70: 20 20 20 20 20 22 73 6b 69 64 72 6f 77 63 72 61       "skidrowcra
fa80: 63 6b 2e 63 6f 6d 22 2c 0a 20 20 20 20 20 20 22  ck.com",.      "
fa90: 68 6f 73 68 69 79 75 75 67 69 2e 74 69 73 74 6f  hoshiyuugi.tisto
faa0: 72 79 2e 63 6f 6d 22 2c 0a 20 20 20 20 20 20 22  ry.com",.      "
fab0: 73 6b 69 64 72 6f 77 67 61 6d 65 73 2e 6e 65 74  skidrowgames.net
fac0: 22 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  ",.    };.    in
fad0: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
fae0: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 73  ; i<sizeof(azDis
faf0: 61 6c 6c 6f 77 29 2f 73 69 7a 65 6f 66 28 61 7a  allow)/sizeof(az
fb00: 44 69 73 61 6c 6c 6f 77 5b 30 5d 29 3b 20 69 2b  Disallow[0]); i+
fb10: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
fb20: 72 73 74 72 28 7a 52 65 66 65 72 65 72 2c 20 61  rstr(zReferer, a
fb30: 7a 44 69 73 61 6c 6c 6f 77 5b 69 5d 29 21 3d 30  zDisallow[i])!=0
fb40: 20 29 7b 0a 20 20 20 20 20 20 20 20 4e 6f 74 46   ){.        NotF
fb50: 6f 75 6e 64 28 32 36 30 29 3b 20 20 2f 2a 20 4c  ound(260);  /* L
fb60: 4f 47 3a 20 44 69 73 61 6c 6c 6f 77 65 64 20 72  OG: Disallowed r
fb70: 65 66 65 72 72 65 72 20 2a 2f 0a 20 20 20 20 20  eferrer */.     
fb80: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
fb90: 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61  dif..  /* Make a
fba0: 6e 20 65 78 74 72 61 20 65 66 66 6f 72 74 20 74  n extra effort t
fbb0: 6f 20 67 65 74 20 61 20 76 61 6c 69 64 20 73 65  o get a valid se
fbc0: 72 76 65 72 20 6e 61 6d 65 20 61 6e 64 20 70 6f  rver name and po
fbd0: 72 74 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2a 20  rt number..  ** 
fbe0: 4f 6e 6c 79 20 4e 65 74 73 63 61 70 65 20 70 72  Only Netscape pr
fbf0: 6f 76 69 64 65 73 20 74 68 69 73 20 69 6e 66 6f  ovides this info
fc00: 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  rmation.  If the
fc10: 20 62 72 6f 77 73 65 72 20 69 73 0a 20 20 2a 2a   browser is.  **
fc20: 20 49 6e 74 65 72 6e 65 74 20 45 78 70 6c 6f 72   Internet Explor
fc30: 65 72 2c 20 74 68 65 6e 20 77 65 20 68 61 76 65  er, then we have
fc40: 20 74 6f 20 66 69 6e 64 20 6f 75 74 20 74 68 65   to find out the
fc50: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
fc60: 0a 20 20 2a 2a 20 6f 75 72 73 65 6c 76 65 73 2e  .  ** ourselves.
fc70: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 53 65 72  .  */.  if( zSer
fc80: 76 65 72 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  verName==0 ){.  
fc90: 20 20 7a 53 65 72 76 65 72 4e 61 6d 65 20 3d 20    zServerName = 
fca0: 53 61 66 65 4d 61 6c 6c 6f 63 28 20 31 30 30 20  SafeMalloc( 100 
fcb0: 29 3b 0a 20 20 20 20 67 65 74 68 6f 73 74 6e 61  );.    gethostna
fcc0: 6d 65 28 7a 53 65 72 76 65 72 4e 61 6d 65 2c 31  me(zServerName,1
fcd0: 30 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  00);.  }.  if( z
fce0: 53 65 72 76 65 72 50 6f 72 74 3d 3d 30 20 7c 7c  ServerPort==0 ||
fcf0: 20 2a 7a 53 65 72 76 65 72 50 6f 72 74 3d 3d 30   *zServerPort==0
fd00: 20 29 7b 0a 20 20 20 20 7a 53 65 72 76 65 72 50   ){.    zServerP
fd10: 6f 72 74 20 3d 20 44 45 46 41 55 4c 54 5f 50 4f  ort = DEFAULT_PO
fd20: 52 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  RT;.  }..  /* Re
fd30: 6d 6f 76 65 20 74 68 65 20 71 75 65 72 79 20 73  move the query s
fd40: 74 72 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 65  tring from the e
fd50: 6e 64 20 6f 66 20 74 68 65 20 72 65 71 75 65 73  nd of the reques
fd60: 74 65 64 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ted file..  */. 
fd70: 20 66 6f 72 28 7a 3d 7a 53 63 72 69 70 74 3b 20   for(z=zScript; 
fd80: 2a 7a 20 26 26 20 2a 7a 21 3d 27 3f 27 3b 20 7a  *z && *z!='?'; z
fd90: 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d  ++){}.  if( *z==
fda0: 27 3f 27 20 29 7b 0a 20 20 20 20 7a 51 75 65 72  '?' ){.    zQuer
fdb0: 79 53 75 66 66 69 78 20 3d 20 53 74 72 44 75 70  ySuffix = StrDup
fdc0: 28 7a 29 3b 0a 20 20 20 20 2a 7a 20 3d 20 30 3b  (z);.    *z = 0;
fdd0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 51  .  }else{.    zQ
fde0: 75 65 72 79 53 75 66 66 69 78 20 3d 20 22 22 3b  uerySuffix = "";
fdf0: 0a 20 20 7d 0a 20 20 7a 51 75 65 72 79 53 74 72  .  }.  zQueryStr
fe00: 69 6e 67 20 3d 20 2a 7a 51 75 65 72 79 53 75 66  ing = *zQuerySuf
fe10: 66 69 78 20 3f 20 26 7a 51 75 65 72 79 53 75 66  fix ? &zQuerySuf
fe20: 66 69 78 5b 31 5d 20 3a 20 7a 51 75 65 72 79 53  fix[1] : zQueryS
fe30: 75 66 66 69 78 3b 0a 0a 20 20 2f 2a 20 43 72 65  uffix;..  /* Cre
fe40: 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20 68 6f  ate a file to ho
fe50: 6c 64 20 74 68 65 20 50 4f 53 54 20 71 75 65 72  ld the POST quer
fe60: 79 20 64 61 74 61 2c 20 69 66 20 61 6e 79 2e 20  y data, if any. 
fe70: 20 57 65 20 68 61 76 65 20 74 6f 0a 20 20 2a 2a   We have to.  **
fe80: 20 64 6f 20 69 74 20 74 68 69 73 20 77 61 79 2e   do it this way.
fe90: 20 20 57 65 20 63 61 6e 27 74 20 6a 75 73 74 20    We can't just 
fea0: 70 61 73 73 20 74 68 65 20 66 69 6c 65 20 64 65  pass the file de
feb0: 73 63 72 69 70 74 6f 72 20 64 6f 77 6e 20 74 6f  scriptor down to
fec0: 0a 20 20 2a 2a 20 74 68 65 20 63 68 69 6c 64 20  .  ** the child 
fed0: 70 72 6f 63 65 73 73 20 62 65 63 61 75 73 65 20  process because 
fee0: 74 68 65 20 66 67 65 74 73 28 29 20 66 75 6e 63  the fgets() func
fef0: 74 69 6f 6e 20 6d 61 79 20 68 61 76 65 20 61 6c  tion may have al
ff00: 72 65 61 64 79 0a 20 20 2a 2a 20 72 65 61 64 20  ready.  ** read 
ff10: 70 61 72 74 20 6f 66 20 74 68 65 20 50 4f 53 54  part of the POST
ff20: 20 64 61 74 61 20 69 6e 74 6f 20 69 74 73 20 69   data into its i
ff30: 6e 74 65 72 6e 61 6c 20 62 75 66 66 65 72 2e 0a  nternal buffer..
ff40: 20 20 2a 2f 0a 20 20 69 66 28 20 7a 4d 65 74 68    */.  if( zMeth
ff50: 6f 64 5b 30 5d 3d 3d 27 50 27 20 26 26 20 7a 43  od[0]=='P' && zC
ff60: 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 21 3d 30 20  ontentLength!=0 
ff70: 29 7b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65  ){.    size_t le
ff80: 6e 20 3d 20 61 74 6f 69 28 7a 43 6f 6e 74 65 6e  n = atoi(zConten
ff90: 74 4c 65 6e 67 74 68 29 3b 0a 20 20 20 20 46 49  tLength);.    FI
ffa0: 4c 45 20 2a 6f 75 74 3b 0a 20 20 20 20 63 68 61  LE *out;.    cha
ffb0: 72 20 2a 7a 42 75 66 3b 0a 20 20 20 20 69 6e 74  r *zBuf;.    int
ffc0: 20 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6c 65 6e   n;..    if( len
ffd0: 3e 4d 41 58 5f 43 4f 4e 54 45 4e 54 5f 4c 45 4e  >MAX_CONTENT_LEN
ffe0: 47 54 48 20 29 7b 0a 20 20 20 20 20 20 53 74 61  GTH ){.      Sta
fff0: 72 74 52 65 73 70 6f 6e 73 65 28 22 35 30 30 20  rtResponse("500 
10000 52 65 71 75 65 73 74 20 74 6f 6f 20 6c 61 72 67  Request too larg
10010 65 22 29 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20  e");.      nOut 
10020 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20  += printf(.     
10030 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65     "Content-type
10040 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e  : text/plain\r\n
10050 22 0a 20 20 20 20 20 20 20 20 22 5c 72 5c 6e 22  ".        "\r\n"
10060 0a 20 20 20 20 20 20 20 20 22 54 6f 6f 20 6d 75  .        "Too mu
10070 63 68 20 50 4f 53 54 20 64 61 74 61 5c 6e 22 0a  ch POST data\n".
10080 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 4d        );.      M
10090 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 32  akeLogEntry(0, 2
100a0 37 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 52 65 71  70); /* LOG: Req
100b0 75 65 73 74 20 74 6f 6f 20 6c 61 72 67 65 20 2a  uest too large *
100c0 2f 0a 20 20 20 20 20 20 65 78 69 74 28 30 29 3b  /.      exit(0);
100d0 0a 20 20 20 20 7d 0a 20 20 20 20 73 70 72 69 6e  .    }.    sprin
100e0 74 66 28 7a 54 6d 70 4e 61 6d 42 75 66 2c 20 22  tf(zTmpNamBuf, "
100f0 2f 74 6d 70 2f 2d 70 6f 73 74 2d 64 61 74 61 2d  /tmp/-post-data-
10100 58 58 58 58 58 58 22 29 3b 0a 20 20 20 20 7a 54  XXXXXX");.    zT
10110 6d 70 4e 61 6d 20 3d 20 7a 54 6d 70 4e 61 6d 42  mpNam = zTmpNamB
10120 75 66 3b 0a 20 20 20 20 69 66 28 20 6d 6b 73 74  uf;.    if( mkst
10130 65 6d 70 28 7a 54 6d 70 4e 61 6d 29 3c 30 20 29  emp(zTmpNam)<0 )
10140 7b 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74  {.      Malfunct
10150 69 6f 6e 28 32 38 30 2c 20 20 2f 2a 20 4c 4f 47  ion(280,  /* LOG
10160 3a 20 6d 6b 73 74 65 6d 70 28 29 20 66 61 69 6c  : mkstemp() fail
10170 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
10180 20 20 20 20 20 22 43 61 6e 6e 6f 74 20 63 72 65       "Cannot cre
10190 61 74 65 20 61 20 74 65 6d 70 20 66 69 6c 65 20  ate a temp file 
101a0 69 6e 20 77 68 69 63 68 20 74 6f 20 73 74 6f 72  in which to stor
101b0 65 20 50 4f 53 54 20 64 61 74 61 22 29 3b 0a 20  e POST data");. 
101c0 20 20 20 7d 0a 20 20 20 20 6f 75 74 20 3d 20 66     }.    out = f
101d0 6f 70 65 6e 28 7a 54 6d 70 4e 61 6d 2c 22 77 62  open(zTmpNam,"wb
101e0 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 3d  ");.    if( out=
101f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 74 61 72  =0 ){.      Star
10200 74 52 65 73 70 6f 6e 73 65 28 22 35 30 30 20 43  tResponse("500 C
10210 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 2f 74 6d  annot create /tm
10220 70 20 66 69 6c 65 22 29 3b 0a 20 20 20 20 20 20  p file");.      
10230 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a  nOut += printf(.
10240 20 20 20 20 20 20 20 20 22 43 6f 6e 74 65 6e 74          "Content
10250 2d 74 79 70 65 3a 20 74 65 78 74 2f 70 6c 61 69  -type: text/plai
10260 6e 5c 72 5c 6e 22 0a 20 20 20 20 20 20 20 20 22  n\r\n".        "
10270 5c 72 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 43  \r\n".        "C
10280 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20 5c 22  ould not open \"
10290 25 73 5c 22 20 66 6f 72 20 77 72 69 74 69 6e 67  %s\" for writing
102a0 5c 6e 22 2c 20 7a 54 6d 70 4e 61 6d 0a 20 20 20  \n", zTmpNam.   
102b0 20 20 20 29 3b 0a 20 20 20 20 20 20 4d 61 6b 65     );.      Make
102c0 4c 6f 67 45 6e 74 72 79 28 30 2c 20 32 39 30 29  LogEntry(0, 290)
102d0 3b 20 2f 2a 20 4c 4f 47 3a 20 63 61 6e 6e 6f 74  ; /* LOG: cannot
102e0 20 63 72 65 61 74 65 20 74 65 6d 70 20 66 69 6c   create temp fil
102f0 65 20 66 6f 72 20 50 4f 53 54 20 2a 2f 0a 20 20  e for POST */.  
10300 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20 20      exit(0);.   
10310 20 7d 0a 20 20 20 20 7a 42 75 66 20 3d 20 53 61   }.    zBuf = Sa
10320 66 65 4d 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31 20  feMalloc( len+1 
10330 29 3b 0a 20 20 20 20 69 66 28 20 75 73 65 54 69  );.    if( useTi
10340 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d 28 31 35  meout ) alarm(15
10350 20 2b 20 6c 65 6e 2f 32 30 30 30 29 3b 0a 20 20   + len/2000);.  
10360 20 20 6e 20 3d 20 66 72 65 61 64 28 7a 42 75 66    n = fread(zBuf
10370 2c 31 2c 6c 65 6e 2c 73 74 64 69 6e 29 3b 0a 20  ,1,len,stdin);. 
10380 20 20 20 6e 49 6e 20 2b 3d 20 6e 3b 0a 20 20 20     nIn += n;.   
10390 20 66 77 72 69 74 65 28 7a 42 75 66 2c 31 2c 6e   fwrite(zBuf,1,n
103a0 2c 6f 75 74 29 3b 0a 20 20 20 20 66 72 65 65 28  ,out);.    free(
103b0 7a 42 75 66 29 3b 0a 20 20 20 20 66 63 6c 6f 73  zBuf);.    fclos
103c0 65 28 6f 75 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  e(out);.  }..  /
103d0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
103e0 72 75 6e 6e 69 6e 67 20 74 69 6d 65 20 69 73 20  running time is 
103f0 6e 6f 74 20 74 6f 6f 20 67 72 65 61 74 20 2a 2f  not too great */
10400 0a 20 20 69 66 28 20 75 73 65 54 69 6d 65 6f 75  .  if( useTimeou
10410 74 20 29 20 61 6c 61 72 6d 28 31 30 29 3b 0a 0a  t ) alarm(10);..
10420 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 61 6c 6c    /* Convert all
10430 20 75 6e 75 73 75 61 6c 20 63 68 61 72 61 63 74   unusual charact
10440 65 72 73 20 69 6e 20 74 68 65 20 73 63 72 69 70  ers in the scrip
10450 74 20 6e 61 6d 65 20 69 6e 74 6f 20 22 5f 22 2e  t name into "_".
10460 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
10470 69 73 20 61 20 64 65 66 65 6e 73 65 20 61 67 61  is a defense aga
10480 69 6e 73 74 20 76 61 72 69 6f 75 73 20 61 74 74  inst various att
10490 61 63 6b 73 2c 20 58 53 53 20 61 74 74 61 63 6b  acks, XSS attack
104a0 73 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 2e  s in particular.
104b0 0a 20 20 2a 2f 0a 20 20 73 61 6e 69 74 69 7a 65  .  */.  sanitize
104c0 53 74 72 69 6e 67 28 7a 53 63 72 69 70 74 29 3b  String(zScript);
104d0 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c  ..  /* Do not al
104e0 6c 6f 77 20 22 2f 2e 22 20 6f 72 20 22 2f 2d 22  low "/." or "/-"
104f0 20 74 6f 20 74 6f 20 6f 63 63 75 72 20 61 6e 79   to to occur any
10500 77 68 65 72 65 20 69 6e 20 74 68 65 20 65 6e 74  where in the ent
10510 69 74 79 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 54  ity name..  ** T
10520 68 69 73 20 70 72 65 76 65 6e 74 73 20 61 74 74  his prevents att
10530 61 63 6b 73 20 69 6e 76 6f 6c 76 69 6e 67 20 22  acks involving "
10540 2e 2e 22 20 61 6e 64 20 61 6c 73 6f 20 61 6c 6c  .." and also all
10550 6f 77 73 20 75 73 20 74 6f 20 63 72 65 61 74 65  ows us to create
10560 0a 20 20 2a 2a 20 66 69 6c 65 73 20 61 6e 64 20  .  ** files and 
10570 64 69 72 65 63 74 6f 72 69 65 73 20 77 68 6f 73  directories whos
10580 65 20 6e 61 6d 65 73 20 62 65 67 69 6e 20 77 69  e names begin wi
10590 74 68 20 22 2d 22 20 6f 72 20 22 2e 22 20 77 68  th "-" or "." wh
105a0 69 63 68 20 61 72 65 0a 20 20 2a 2a 20 69 6e 76  ich are.  ** inv
105b0 69 73 69 62 6c 65 20 74 6f 20 74 68 65 20 77 65  isible to the we
105c0 62 73 65 72 76 65 72 2e 0a 20 20 2a 2a 0a 20 20  bserver..  **.  
105d0 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 41  ** Exception:  A
105e0 6c 6c 6f 77 20 74 68 65 20 22 2f 2e 77 65 6c 6c  llow the "/.well
105f0 2d 6b 6e 6f 77 6e 2f 22 20 70 72 65 66 69 78 20  -known/" prefix 
10600 69 6e 20 61 63 63 6f 72 64 61 6e 63 65 20 77 69  in accordance wi
10610 74 68 0a 20 20 2a 2a 20 52 46 43 2d 35 37 38 35  th.  ** RFC-5785
10620 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 7a 3d 7a 53  .  */.  for(z=zS
10630 63 72 69 70 74 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b  cript; *z; z++){
10640 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2f 27  .    if( *z=='/'
10650 20 26 26 20 28 7a 5b 31 5d 3d 3d 27 2e 27 20 7c   && (z[1]=='.' |
10660 7c 20 7a 5b 31 5d 3d 3d 27 2d 27 29 0a 20 20 20  | z[1]=='-').   
10670 20 20 26 26 20 28 7a 3e 7a 53 63 72 69 70 74 20    && (z>zScript 
10680 7c 7c 20 73 74 72 6e 63 6d 70 28 7a 2c 22 2f 2e  || strncmp(z,"/.
10690 77 65 6c 6c 2d 6b 6e 6f 77 6e 2f 22 2c 31 33 29  well-known/",13)
106a0 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0).    ){.    
106b0 20 20 20 4e 6f 74 46 6f 75 6e 64 28 33 30 30 29     NotFound(300)
106c0 3b 20 2f 2a 20 4c 4f 47 3a 20 50 61 74 68 20 65  ; /* LOG: Path e
106d0 6c 65 6d 65 6e 74 20 62 65 67 69 6e 73 20 77 69  lement begins wi
106e0 74 68 20 22 2e 22 20 6f 72 20 22 2d 22 20 2a 2f  th "." or "-" */
106f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10700 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 61 74   Figure out what
10710 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
10720 20 66 69 6c 65 73 79 73 74 65 6d 20 73 68 6f 75   filesystem shou
10730 6c 64 20 62 65 2e 20 20 49 66 20 74 68 65 0a 20  ld be.  If the. 
10740 20 2a 2a 20 48 54 54 50 5f 48 4f 53 54 20 70 61   ** HTTP_HOST pa
10750 72 61 6d 65 74 65 72 20 65 78 69 73 74 73 20 28  rameter exists (
10760 73 74 6f 72 65 64 20 69 6e 20 7a 48 74 74 70 48  stored in zHttpH
10770 6f 73 74 29 20 74 68 65 6e 20 72 65 6d 6f 76 65  ost) then remove
10780 20 74 68 65 0a 20 20 2a 2a 20 70 6f 72 74 20 6e   the.  ** port n
10790 75 6d 62 65 72 20 66 72 6f 6d 20 74 68 65 20 65  umber from the e
107a0 6e 64 20 28 69 66 20 61 6e 79 29 2c 20 63 6f 6e  nd (if any), con
107b0 76 65 72 74 20 61 6c 6c 20 63 68 61 72 61 63 74  vert all charact
107c0 65 72 73 20 74 6f 20 6c 6f 77 65 72 0a 20 20 2a  ers to lower.  *
107d0 2a 20 63 61 73 65 2c 20 61 6e 64 20 63 6f 6e 76  * case, and conv
107e0 65 72 74 20 6e 6f 6e 2d 61 6c 70 68 61 6e 75 6d  ert non-alphanum
107f0 62 65 72 20 63 68 61 72 61 63 74 65 72 73 20 28  ber characters (
10800 69 6e 63 6c 75 64 69 6e 67 20 22 2e 22 29 20 74  including ".") t
10810 6f 20 22 5f 22 2e 0a 20 20 2a 2a 20 54 68 65 6e  o "_"..  ** Then
10820 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 20 64   try to find a d
10830 69 72 65 63 74 6f 72 79 20 77 69 74 68 20 74 68  irectory with th
10840 61 74 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  at name and the 
10850 65 78 74 65 6e 73 69 6f 6e 20 2e 77 65 62 73 69  extension .websi
10860 74 65 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 74 20  te..  ** If not 
10870 66 6f 75 6e 64 2c 20 6c 6f 6f 6b 20 66 6f 72 20  found, look for 
10880 22 64 65 66 61 75 6c 74 2e 77 65 62 73 69 74 65  "default.website
10890 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 53  "..  */.  if( zS
108a0 63 72 69 70 74 5b 30 5d 21 3d 27 2f 27 20 29 7b  cript[0]!='/' ){
108b0 0a 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 33 31  .    NotFound(31
108c0 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 55 52 49 20  0); /* LOG: URI 
108d0 64 6f 65 73 20 6e 6f 74 20 73 74 61 72 74 20 77  does not start w
108e0 69 74 68 20 22 2f 22 20 2a 2f 0a 20 20 7d 0a 20  ith "/" */.  }. 
108f0 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 52 6f 6f   if( strlen(zRoo
10900 74 29 2b 34 30 20 3e 3d 20 73 69 7a 65 6f 66 28  t)+40 >= sizeof(
10910 7a 4c 69 6e 65 29 20 29 7b 0a 20 20 20 20 4e 6f  zLine) ){.    No
10920 74 46 6f 75 6e 64 28 33 32 30 29 3b 20 2f 2a 20  tFound(320); /* 
10930 4c 4f 47 3a 20 55 52 49 20 74 6f 6f 20 6c 6f 6e  LOG: URI too lon
10940 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 7a  g */.  }.  if( z
10950 48 74 74 70 48 6f 73 74 3d 3d 30 20 7c 7c 20 7a  HttpHost==0 || z
10960 48 74 74 70 48 6f 73 74 5b 30 5d 3d 3d 30 20 29  HttpHost[0]==0 )
10970 7b 0a 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 33  {.    NotFound(3
10980 33 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 4d 69  30);  /* LOG: Mi
10990 73 73 69 6e 67 20 48 4f 53 54 3a 20 70 61 72 61  ssing HOST: para
109a0 6d 65 74 65 72 20 2a 2f 0a 20 20 7d 65 6c 73 65  meter */.  }else
109b0 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 48 74 74   if( strlen(zHtt
109c0 70 48 6f 73 74 29 2b 73 74 72 6c 65 6e 28 7a 52  pHost)+strlen(zR
109d0 6f 6f 74 29 2b 31 30 20 3e 3d 20 73 69 7a 65 6f  oot)+10 >= sizeo
109e0 66 28 7a 4c 69 6e 65 29 20 29 7b 0a 20 20 20 20  f(zLine) ){.    
109f0 4e 6f 74 46 6f 75 6e 64 28 33 34 30 29 3b 20 20  NotFound(340);  
10a00 2f 2a 20 4c 4f 47 3a 20 48 4f 53 54 20 70 61 72  /* LOG: HOST par
10a10 61 6d 65 74 65 72 20 74 6f 6f 20 6c 6f 6e 67 20  ameter too long 
10a20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
10a30 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22  sprintf(zLine, "
10a40 25 73 2f 25 73 22 2c 20 7a 52 6f 6f 74 2c 20 7a  %s/%s", zRoot, z
10a50 48 74 74 70 48 6f 73 74 29 3b 0a 20 20 20 20 66  HttpHost);.    f
10a60 6f 72 28 69 3d 73 74 72 6c 65 6e 28 7a 52 6f 6f  or(i=strlen(zRoo
10a70 74 29 2b 31 3b 20 7a 4c 69 6e 65 5b 69 5d 20 26  t)+1; zLine[i] &
10a80 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d 27 3a 27 3b  & zLine[i]!=':';
10a90 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 6e 73   i++){.      uns
10aa0 69 67 6e 65 64 20 63 68 61 72 20 63 20 3d 20 28  igned char c = (
10ab0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 4c  unsigned char)zL
10ac0 69 6e 65 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  ine[i];.      if
10ad0 28 20 21 69 73 61 6c 6e 75 6d 28 63 29 20 29 7b  ( !isalnum(c) ){
10ae0 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 69  .        zLine[i
10af0 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 7d  ] = '_';.      }
10b00 65 6c 73 65 20 69 66 28 20 69 73 75 70 70 65 72  else if( isupper
10b10 28 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  (c) ){.        z
10b20 4c 69 6e 65 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65  Line[i] = tolowe
10b30 72 28 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  r(c);.      }.  
10b40 20 20 7d 0a 20 20 20 20 73 74 72 63 70 79 28 26    }.    strcpy(&
10b50 7a 4c 69 6e 65 5b 69 5d 2c 20 22 2e 77 65 62 73  zLine[i], ".webs
10b60 69 74 65 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ite");.  }.  if(
10b70 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61   stat(zLine,&sta
10b80 74 62 75 66 29 20 7c 7c 20 21 53 5f 49 53 44 49  tbuf) || !S_ISDI
10b90 52 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64  R(statbuf.st_mod
10ba0 65 29 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74  e) ){.    sprint
10bb0 66 28 7a 4c 69 6e 65 2c 20 22 25 73 2f 64 65 66  f(zLine, "%s/def
10bc0 61 75 6c 74 2e 77 65 62 73 69 74 65 22 2c 20 7a  ault.website", z
10bd0 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 73  Root);.    if( s
10be0 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62  tat(zLine,&statb
10bf0 75 66 29 20 7c 7c 20 21 53 5f 49 53 44 49 52 28  uf) || !S_ISDIR(
10c00 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29  statbuf.st_mode)
10c10 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74   ){.      if( st
10c20 61 6e 64 61 6c 6f 6e 65 20 29 7b 0a 20 20 20 20  andalone ){.    
10c30 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e      sprintf(zLin
10c40 65 2c 20 22 25 73 22 2c 20 7a 52 6f 6f 74 29 3b  e, "%s", zRoot);
10c50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10c60 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 33        NotFound(3
10c70 35 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 2a 2e  50);  /* LOG: *.
10c80 77 65 62 73 69 74 65 20 70 65 72 6d 69 73 73 69  website permissi
10c90 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ons */.      }. 
10ca0 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 48 6f 6d 65     }.  }.  zHome
10cb0 20 3d 20 53 74 72 44 75 70 28 7a 4c 69 6e 65 29   = StrDup(zLine)
10cc0 3b 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 64  ;..  /* Change d
10cd0 69 72 65 63 74 6f 72 69 65 73 20 74 6f 20 74 68  irectories to th
10ce0 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 48 54  e root of the HT
10cf0 54 50 20 66 69 6c 65 73 79 73 74 65 6d 0a 20 20  TP filesystem.  
10d00 2a 2f 0a 20 20 69 66 28 20 63 68 64 69 72 28 7a  */.  if( chdir(z
10d10 48 6f 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Home)!=0 ){.    
10d20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b  char zBuf[1000];
10d30 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e  .    Malfunction
10d40 28 33 36 30 2c 20 20 2f 2a 20 4c 4f 47 3a 20 63  (360,  /* LOG: c
10d50 68 64 69 72 28 29 20 66 61 69 6c 65 64 20 2a 2f  hdir() failed */
10d60 0a 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f  .         "canno
10d70 74 20 63 68 64 69 72 20 74 6f 20 5b 25 73 5d 20  t chdir to [%s] 
10d80 66 72 6f 6d 20 5b 25 73 5d 22 2c 0a 20 20 20 20  from [%s]",.    
10d90 20 20 20 20 20 7a 48 6f 6d 65 2c 20 67 65 74 63       zHome, getc
10da0 77 64 28 7a 42 75 66 2c 39 39 39 29 29 3b 0a 20  wd(zBuf,999));. 
10db0 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
10dc0 74 68 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  the file in the 
10dd0 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 57 65 20  filesystem.  We 
10de0 6d 69 67 68 74 20 68 61 76 65 20 74 6f 20 61 70  might have to ap
10df0 70 65 6e 64 0a 20 20 2a 2a 20 61 20 6e 61 6d 65  pend.  ** a name
10e00 20 6c 69 6b 65 20 22 2f 68 6f 6d 65 22 20 6f 72   like "/home" or
10e10 20 22 2f 69 6e 64 65 78 2e 68 74 6d 6c 22 20 6f   "/index.html" o
10e20 72 20 22 2f 69 6e 64 65 78 2e 63 67 69 22 20 69  r "/index.cgi" i
10e30 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20 74 6f 20  n order.  ** to 
10e40 66 69 6e 64 20 69 74 2e 20 20 41 6e 79 20 65 78  find it.  Any ex
10e50 63 65 73 73 20 70 61 74 68 20 69 6e 66 6f 72 6d  cess path inform
10e60 61 74 69 6f 6e 20 69 73 20 70 75 74 20 69 6e 74  ation is put int
10e70 6f 20 74 68 65 0a 20 20 2a 2a 20 7a 50 61 74 68  o the.  ** zPath
10e80 49 6e 66 6f 20 76 61 72 69 61 62 6c 65 2e 0a 20  Info variable.. 
10e90 20 2a 2f 0a 20 20 6a 20 3d 20 6a 30 20 3d 20 28   */.  j = j0 = (
10ea0 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4c 69 6e 65  int)strlen(zLine
10eb0 29 3b 0a 20 20 69 20 3d 20 30 3b 0a 20 20 77 68  );.  i = 0;.  wh
10ec0 69 6c 65 28 20 7a 53 63 72 69 70 74 5b 69 5d 20  ile( zScript[i] 
10ed0 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 53  ){.    while( zS
10ee0 63 72 69 70 74 5b 69 5d 20 26 26 20 28 69 3d 3d  cript[i] && (i==
10ef0 30 20 7c 7c 20 7a 53 63 72 69 70 74 5b 69 5d 21  0 || zScript[i]!
10f00 3d 27 2f 27 29 20 29 7b 0a 20 20 20 20 20 20 7a  ='/') ){.      z
10f10 4c 69 6e 65 5b 6a 5d 20 3d 20 7a 53 63 72 69 70  Line[j] = zScrip
10f20 74 5b 69 5d 3b 0a 20 20 20 20 20 20 69 2b 2b 3b  t[i];.      i++;
10f30 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20   j++;.    }.    
10f40 7a 4c 69 6e 65 5b 6a 5d 20 3d 20 30 3b 0a 20 20  zLine[j] = 0;.  
10f50 20 20 69 66 28 20 73 74 61 74 28 7a 4c 69 6e 65    if( stat(zLine
10f60 2c 26 73 74 61 74 62 75 66 29 21 3d 30 20 29 7b  ,&statbuf)!=0 ){
10f70 0a 20 20 20 20 20 20 69 6e 74 20 73 74 69 6c 6c  .      int still
10f80 53 65 61 72 63 68 69 6e 67 20 3d 20 31 3b 0a 20  Searching = 1;. 
10f90 20 20 20 20 20 77 68 69 6c 65 28 20 73 74 69 6c       while( stil
10fa0 6c 53 65 61 72 63 68 69 6e 67 20 26 26 20 69 3e  lSearching && i>
10fb0 30 20 26 26 20 6a 3e 6a 30 20 29 7b 0a 20 20 20  0 && j>j0 ){.   
10fc0 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 6a 30       while( j>j0
10fd0 20 26 26 20 7a 4c 69 6e 65 5b 6a 2d 31 5d 21 3d   && zLine[j-1]!=
10fe0 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20  '/' ){ j--; }.  
10ff0 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a 4c        strcpy(&zL
11000 69 6e 65 5b 6a 2d 31 5d 2c 20 22 2f 6e 6f 74 2d  ine[j-1], "/not-
11010 66 6f 75 6e 64 2e 68 74 6d 6c 22 29 3b 0a 20 20  found.html");.  
11020 20 20 20 20 20 20 69 66 28 20 73 74 61 74 28 7a        if( stat(z
11030 4c 69 6e 65 2c 26 73 74 61 74 62 75 66 29 3d 3d  Line,&statbuf)==
11040 30 20 26 26 20 53 5f 49 53 52 45 47 28 73 74 61  0 && S_ISREG(sta
11050 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29 0a 20 20  tbuf.st_mode).  
11060 20 20 20 20 20 20 20 20 20 20 26 26 20 61 63 63            && acc
11070 65 73 73 28 7a 4c 69 6e 65 2c 52 5f 4f 4b 29 3d  ess(zLine,R_OK)=
11080 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11090 7a 52 65 61 6c 53 63 72 69 70 74 20 3d 20 53 74  zRealScript = St
110a0 72 44 75 70 28 26 7a 4c 69 6e 65 5b 6a 30 5d 29  rDup(&zLine[j0])
110b0 3b 0a 20 20 20 20 20 20 20 20 20 20 52 65 64 69  ;.          Redi
110c0 72 65 63 74 28 7a 52 65 61 6c 53 63 72 69 70 74  rect(zRealScript
110d0 2c 20 33 30 32 2c 20 31 2c 20 33 37 30 29 3b 20  , 302, 1, 370); 
110e0 2f 2a 20 4c 4f 47 3a 20 72 65 64 69 72 65 63 74  /* LOG: redirect
110f0 20 74 6f 20 6e 6f 74 2d 66 6f 75 6e 64 20 2a 2f   to not-found */
11100 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
11110 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  n;.        }else
11120 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 2d 2d 3b  {.          j--;
11130 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11140 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 74 69   }.      if( sti
11150 6c 6c 53 65 61 72 63 68 69 6e 67 20 29 20 4e 6f  llSearching ) No
11160 74 46 6f 75 6e 64 28 33 38 30 29 3b 20 2f 2a 20  tFound(380); /* 
11170 4c 4f 47 3a 20 55 52 49 20 6e 6f 74 20 66 6f 75  LOG: URI not fou
11180 6e 64 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  nd */.      brea
11190 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
111a0 20 53 5f 49 53 52 45 47 28 73 74 61 74 62 75 66   S_ISREG(statbuf
111b0 2e 73 74 5f 6d 6f 64 65 29 20 29 7b 0a 20 20 20  .st_mode) ){.   
111c0 20 20 20 69 66 28 20 61 63 63 65 73 73 28 7a 4c     if( access(zL
111d0 69 6e 65 2c 52 5f 4f 4b 29 20 29 7b 0a 20 20 20  ine,R_OK) ){.   
111e0 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 33 39       NotFound(39
111f0 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 46 69 6c  0);  /* LOG: Fil
11200 65 20 6e 6f 74 20 72 65 61 64 61 62 6c 65 20 2a  e not readable *
11210 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
11220 7a 52 65 61 6c 53 63 72 69 70 74 20 3d 20 53 74  zRealScript = St
11230 72 44 75 70 28 26 7a 4c 69 6e 65 5b 6a 30 5d 29  rDup(&zLine[j0])
11240 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
11250 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 53 63     }.    if( zSc
11260 72 69 70 74 5b 69 5d 3d 3d 30 20 7c 7c 20 7a 53  ript[i]==0 || zS
11270 63 72 69 70 74 5b 69 2b 31 5d 3d 3d 30 20 29 7b  cript[i+1]==0 ){
11280 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
11290 6e 73 74 20 63 68 61 72 20 2a 61 7a 49 6e 64 65  nst char *azInde
112a0 78 5b 5d 20 3d 20 7b 20 22 2f 68 6f 6d 65 22 2c  x[] = { "/home",
112b0 20 22 2f 69 6e 64 65 78 2e 68 74 6d 6c 22 2c 20   "/index.html", 
112c0 22 2f 69 6e 64 65 78 2e 63 67 69 22 20 7d 3b 0a  "/index.cgi" };.
112d0 20 20 20 20 20 20 69 6e 74 20 6b 20 3d 20 6a 3e        int k = j>
112e0 30 20 26 26 20 7a 4c 69 6e 65 5b 6a 2d 31 5d 3d  0 && zLine[j-1]=
112f0 3d 27 2f 27 20 3f 20 6a 2d 31 20 3a 20 6a 3b 0a  ='/' ? j-1 : j;.
11300 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
11310 6e 74 20 6a 6a 3b 0a 20 20 20 20 20 20 66 6f 72  nt jj;.      for
11320 28 6a 6a 3d 30 3b 20 6a 6a 3c 73 69 7a 65 6f 66  (jj=0; jj<sizeof
11330 28 61 7a 49 6e 64 65 78 29 2f 73 69 7a 65 6f 66  (azIndex)/sizeof
11340 28 61 7a 49 6e 64 65 78 5b 30 5d 29 3b 20 6a 6a  (azIndex[0]); jj
11350 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ++){.        str
11360 63 70 79 28 26 7a 4c 69 6e 65 5b 6b 5d 2c 61 7a  cpy(&zLine[k],az
11370 49 6e 64 65 78 5b 6a 6a 5d 29 3b 0a 20 20 20 20  Index[jj]);.    
11380 20 20 20 20 69 66 28 20 73 74 61 74 28 7a 4c 69      if( stat(zLi
11390 6e 65 2c 26 73 74 61 74 62 75 66 29 21 3d 30 20  ne,&statbuf)!=0 
113a0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
113b0 20 20 20 20 69 66 28 20 21 53 5f 49 53 52 45 47      if( !S_ISREG
113c0 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65  (statbuf.st_mode
113d0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
113e0 20 20 20 20 20 20 69 66 28 20 61 63 63 65 73 73        if( access
113f0 28 7a 4c 69 6e 65 2c 52 5f 4f 4b 29 20 29 20 63  (zLine,R_OK) ) c
11400 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
11410 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
11420 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d 73 69        if( jj>=si
11430 7a 65 6f 66 28 61 7a 49 6e 64 65 78 29 2f 73 69  zeof(azIndex)/si
11440 7a 65 6f 66 28 61 7a 49 6e 64 65 78 5b 30 5d 29  zeof(azIndex[0])
11450 20 29 7b 0a 20 20 20 20 20 20 20 20 4e 6f 74 46   ){.        NotF
11460 6f 75 6e 64 28 34 30 30 29 3b 20 2f 2a 20 4c 4f  ound(400); /* LO
11470 47 3a 20 55 52 49 20 69 73 20 61 20 64 69 72 65  G: URI is a dire
11480 63 74 6f 72 79 20 77 2f 6f 20 69 6e 64 65 78 2e  ctory w/o index.
11490 68 74 6d 6c 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  html */.      }.
114a0 20 20 20 20 20 20 7a 52 65 61 6c 53 63 72 69 70        zRealScrip
114b0 74 20 3d 20 53 74 72 44 75 70 28 26 7a 4c 69 6e  t = StrDup(&zLin
114c0 65 5b 6a 30 5d 29 3b 0a 20 20 20 20 20 20 69 66  e[j0]);.      if
114d0 28 20 7a 53 63 72 69 70 74 5b 69 5d 3d 3d 30 20  ( zScript[i]==0 
114e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
114f0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 55   the requested U
11500 52 4c 20 64 6f 65 73 20 6e 6f 74 20 65 6e 64 20  RL does not end 
11510 77 69 74 68 20 22 2f 22 20 62 75 74 20 77 65 20  with "/" but we 
11520 68 61 64 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  had to.        *
11530 2a 20 61 70 70 65 6e 64 20 22 69 6e 64 65 78 2e  * append "index.
11540 68 74 6d 6c 22 2c 20 74 68 65 6e 20 61 20 72 65  html", then a re
11550 64 69 72 65 63 74 20 69 73 20 6e 65 63 65 73 73  direct is necess
11560 61 72 79 2e 20 20 4f 74 68 65 72 77 69 73 65 0a  ary.  Otherwise.
11570 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 6e 65 20          ** none 
11580 6f 66 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  of the relative 
11590 55 52 4c 73 20 69 6e 20 74 68 65 20 64 65 6c 69  URLs in the deli
115a0 76 65 72 65 64 20 64 6f 63 75 6d 65 6e 74 20 77  vered document w
115b0 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
115c0 2a 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 20 20  * correct. */.  
115d0 20 20 20 20 20 20 52 65 64 69 72 65 63 74 28 7a        Redirect(z
115e0 52 65 61 6c 53 63 72 69 70 74 2c 33 30 31 2c 31  RealScript,301,1
115f0 2c 34 31 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 72  ,410); /* LOG: r
11600 65 64 69 72 65 63 74 20 74 6f 20 61 64 64 20 74  edirect to add t
11610 72 61 69 6c 69 6e 67 20 2f 20 2a 2f 0a 20 20 20  railing / */.   
11620 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
11630 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
11640 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4c 69 6e  ;.    }.    zLin
11650 65 5b 6a 5d 20 3d 20 7a 53 63 72 69 70 74 5b 69  e[j] = zScript[i
11660 5d 3b 0a 20 20 20 20 69 2b 2b 3b 20 6a 2b 2b 3b  ];.    i++; j++;
11670 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 20 3d 20 53  .  }.  zFile = S
11680 74 72 44 75 70 28 7a 4c 69 6e 65 29 3b 0a 20 20  trDup(zLine);.  
11690 7a 50 61 74 68 49 6e 66 6f 20 3d 20 53 74 72 44  zPathInfo = StrD
116a0 75 70 28 26 7a 53 63 72 69 70 74 5b 69 5d 29 3b  up(&zScript[i]);
116b0 0a 20 20 6c 65 6e 46 69 6c 65 20 3d 20 73 74 72  .  lenFile = str
116c0 6c 65 6e 28 7a 46 69 6c 65 29 3b 0a 20 20 7a 44  len(zFile);.  zD
116d0 69 72 20 3d 20 53 74 72 44 75 70 28 7a 46 69 6c  ir = StrDup(zFil
116e0 65 29 3b 0a 20 20 66 6f 72 28 69 3d 73 74 72 6c  e);.  for(i=strl
116f0 65 6e 28 7a 44 69 72 29 2d 31 3b 20 69 3e 30 20  en(zDir)-1; i>0 
11700 26 26 20 7a 44 69 72 5b 69 5d 21 3d 27 2f 27 3b  && zDir[i]!='/';
11710 20 69 2d 2d 29 7b 7d 3b 0a 20 20 69 66 28 20 69   i--){};.  if( i
11720 3d 3d 30 20 29 7b 0a 20 20 20 20 20 73 74 72 63  ==0 ){.     strc
11730 70 79 28 7a 44 69 72 2c 22 2f 22 29 3b 0a 20 20  py(zDir,"/");.  
11740 7d 65 6c 73 65 7b 0a 20 20 20 20 20 7a 44 69 72  }else{.     zDir
11750 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  [i] = 0;.  }..  
11760 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
11770 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 61  if there is an a
11780 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 69 6c  uthorization fil
11790 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 2c  e.  If there is,
117a0 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 69 74  .  ** process it
117b0 2e 0a 20 20 2a 2f 0a 20 20 73 70 72 69 6e 74 66  ..  */.  sprintf
117c0 28 7a 4c 69 6e 65 2c 20 22 25 73 2f 2d 61 75 74  (zLine, "%s/-aut
117d0 68 22 2c 20 7a 44 69 72 29 3b 0a 20 20 69 66 28  h", zDir);.  if(
117e0 20 61 63 63 65 73 73 28 7a 4c 69 6e 65 2c 52 5f   access(zLine,R_
117f0 4f 4b 29 3d 3d 30 20 26 26 20 21 43 68 65 63 6b  OK)==0 && !Check
11800 42 61 73 69 63 41 75 74 68 6f 72 69 7a 61 74 69  BasicAuthorizati
11810 6f 6e 28 7a 4c 69 6e 65 29 20 29 20 72 65 74 75  on(zLine) ) retu
11820 72 6e 3b 0a 0a 20 20 2f 2a 20 54 61 6b 65 20 61  rn;..  /* Take a
11830 70 70 72 6f 70 72 69 61 74 65 20 61 63 74 69 6f  ppropriate actio
11840 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 73 74  n.  */.  if( (st
11850 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 20 26 20  atbuf.st_mode & 
11860 30 31 30 30 29 3d 3d 30 31 30 30 20 26 26 20 61  0100)==0100 && a
11870 63 63 65 73 73 28 7a 46 69 6c 65 2c 58 5f 4f 4b  ccess(zFile,X_OK
11880 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  )==0 ){.    char
11890 20 2a 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 3b   *zBaseFilename;
118a0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
118b0 6e 61 6d 65 20 77 69 74 68 6f 75 74 20 64 69 72  name without dir
118c0 65 63 74 6f 72 79 20 70 72 65 66 69 78 20 2a 2f  ectory prefix */
118d0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
118e0 41 62 6f 72 74 20 77 69 74 68 20 61 6e 20 65 72  Abort with an er
118f0 72 6f 72 20 69 66 20 74 68 65 20 43 47 49 20 73  ror if the CGI s
11900 63 72 69 70 74 20 69 73 20 77 72 69 74 61 62 6c  cript is writabl
11910 65 20 62 79 20 61 6e 79 6f 6e 65 20 6f 74 68 65  e by anyone othe
11920 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 69 74  r.    ** than it
11930 73 20 6f 77 6e 65 72 2e 0a 20 20 20 20 2a 2f 0a  s owner..    */.
11940 20 20 20 20 69 66 28 20 73 74 61 74 62 75 66 2e      if( statbuf.
11950 73 74 5f 6d 6f 64 65 20 26 20 30 30 32 32 20 29  st_mode & 0022 )
11960 7b 0a 20 20 20 20 20 20 43 67 69 53 63 72 69 70  {.      CgiScrip
11970 74 57 72 69 74 61 62 6c 65 28 29 3b 0a 20 20 20  tWritable();.   
11980 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 69 74   }..    /* If it
11990 73 20 65 78 65 63 75 74 61 62 6c 65 2c 20 69 74  s executable, it
119a0 20 6d 75 73 74 20 62 65 20 61 20 43 47 49 20 70   must be a CGI p
119b0 72 6f 67 72 61 6d 2e 20 20 53 74 61 72 74 20 62  rogram.  Start b
119c0 79 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67 69 6e  y.    ** changin
119d0 67 20 64 69 72 65 63 74 6f 72 69 65 73 20 74 6f  g directories to
119e0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 68   the directory h
119f0 6f 6c 64 69 6e 67 20 74 68 65 20 70 72 6f 67 72  olding the progr
11a00 61 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  am..    */.    i
11a10 66 28 20 63 68 64 69 72 28 7a 44 69 72 29 20 29  f( chdir(zDir) )
11a20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 42 75  {.      char zBu
11a30 66 5b 31 30 30 30 5d 3b 0a 20 20 20 20 20 20 4d  f[1000];.      M
11a40 61 6c 66 75 6e 63 74 69 6f 6e 28 34 32 30 2c 20  alfunction(420, 
11a50 2f 2a 20 4c 4f 47 3a 20 63 68 64 69 72 28 29 20  /* LOG: chdir() 
11a60 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
11a70 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 68 64       "cannot chd
11a80 69 72 20 74 6f 20 5b 25 73 5d 20 66 72 6f 6d 20  ir to [%s] from 
11a90 5b 25 73 5d 22 2c 20 0a 20 20 20 20 20 20 20 20  [%s]", .        
11aa0 20 20 20 7a 44 69 72 2c 20 67 65 74 63 77 64 28     zDir, getcwd(
11ab0 7a 42 75 66 2c 39 39 39 29 29 3b 0a 20 20 20 20  zBuf,999));.    
11ac0 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  }..    /* Comput
11ad0 65 20 74 68 65 20 62 61 73 65 20 66 69 6c 65 6e  e the base filen
11ae0 61 6d 65 20 6f 66 20 74 68 65 20 43 47 49 20 73  ame of the CGI s
11af0 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 66 6f 72  cript */.    for
11b00 28 69 3d 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29  (i=strlen(zFile)
11b10 2d 31 3b 20 69 3e 3d 30 20 26 26 20 7a 46 69 6c  -1; i>=0 && zFil
11b20 65 5b 69 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b  e[i]!='/'; i--){
11b30 7d 0a 20 20 20 20 7a 42 61 73 65 46 69 6c 65 6e  }.    zBaseFilen
11b40 61 6d 65 20 3d 20 26 7a 46 69 6c 65 5b 69 2b 31  ame = &zFile[i+1
11b50 5d 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 75 70  ];..    /* Setup
11b60 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74   the environment
11b70 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 0a   appropriately..
11b80 20 20 20 20 2a 2f 0a 20 20 20 20 70 75 74 65 6e      */.    puten
11b90 76 28 22 47 41 54 45 57 41 59 5f 49 4e 54 45 52  v("GATEWAY_INTER
11ba0 46 41 43 45 3d 43 47 49 2f 31 2e 30 22 29 3b 0a  FACE=CGI/1.0");.
11bb0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28      for(i=0; i<(
11bc0 69 6e 74 29 28 73 69 7a 65 6f 66 28 63 67 69 65  int)(sizeof(cgie
11bd0 6e 76 29 2f 73 69 7a 65 6f 66 28 63 67 69 65 6e  nv)/sizeof(cgien
11be0 76 5b 30 5d 29 29 3b 20 69 2b 2b 29 7b 0a 20 20  v[0])); i++){.  
11bf0 20 20 20 20 69 66 28 20 2a 63 67 69 65 6e 76 5b      if( *cgienv[
11c00 69 5d 2e 70 7a 45 6e 76 56 61 6c 75 65 20 29 7b  i].pzEnvValue ){
11c10 0a 20 20 20 20 20 20 20 20 53 65 74 45 6e 76 28  .        SetEnv(
11c20 63 67 69 65 6e 76 5b 69 5d 2e 7a 45 6e 76 4e 61  cgienv[i].zEnvNa
11c30 6d 65 2c 2a 63 67 69 65 6e 76 5b 69 5d 2e 70 7a  me,*cgienv[i].pz
11c40 45 6e 76 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  EnvValue);.     
11c50 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
11c60 20 75 73 65 48 74 74 70 73 20 29 7b 0a 20 20 20   useHttps ){.   
11c70 20 20 20 70 75 74 65 6e 76 28 22 48 54 54 50 53     putenv("HTTPS
11c80 3d 6f 6e 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  =on");.    }..  
11c90 20 20 2f 2a 20 46 6f 72 20 74 68 65 20 50 4f 53    /* For the POS
11ca0 54 20 6d 65 74 68 6f 64 20 61 6c 6c 20 69 6e 70  T method all inp
11cb0 75 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  ut has been writ
11cc0 74 65 6e 20 74 6f 20 61 20 74 65 6d 70 6f 72 61  ten to a tempora
11cd0 72 79 20 66 69 6c 65 2c 0a 20 20 20 20 2a 2a 20  ry file,.    ** 
11ce0 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 72 65  so we have to re
11cf0 64 69 72 65 63 74 20 69 6e 70 75 74 20 74 6f 20  direct input to 
11d00 74 68 65 20 43 47 49 20 73 63 72 69 70 74 20 66  the CGI script f
11d10 72 6f 6d 20 74 68 61 74 20 66 69 6c 65 2e 0a 20  rom that file.. 
11d20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 4d     */.    if( zM
11d30 65 74 68 6f 64 5b 30 5d 3d 3d 27 50 27 20 29 7b  ethod[0]=='P' ){
11d40 0a 20 20 20 20 20 20 69 66 28 20 64 75 70 28 30  .      if( dup(0
11d50 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4d  )<0 ){.        M
11d60 61 6c 66 75 6e 63 74 69 6f 6e 28 34 33 30 2c 20  alfunction(430, 
11d70 20 2f 2a 20 4c 4f 47 3a 20 64 75 70 28 30 29 20   /* LOG: dup(0) 
11d80 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
11d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55                "U
11da0 6e 61 62 6c 65 20 74 6f 20 64 75 70 6c 69 63 61  nable to duplica
11db0 74 69 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  tion file descri
11dc0 70 74 6f 72 20 30 22 29 3b 0a 20 20 20 20 20 20  ptor 0");.      
11dd0 7d 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 30 29  }.      close(0)
11de0 3b 0a 20 20 20 20 20 20 6f 70 65 6e 28 7a 54 6d  ;.      open(zTm
11df0 70 4e 61 6d 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b  pNam, O_RDONLY);
11e00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
11e10 73 74 72 6e 63 6d 70 28 7a 42 61 73 65 46 69 6c  strncmp(zBaseFil
11e20 65 6e 61 6d 65 2c 22 6e 70 68 2d 22 2c 34 29 3d  ename,"nph-",4)=
11e30 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
11e40 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  f the name of th
11e50 65 20 43 47 49 20 73 63 72 69 70 74 20 62 65 67  e CGI script beg
11e60 69 6e 73 20 77 69 74 68 20 22 6e 70 68 2d 22 20  ins with "nph-" 
11e70 74 68 65 6e 20 77 65 20 61 72 65 0a 20 20 20 20  then we are.    
11e80 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74    ** dealing wit
11e90 68 20 61 20 22 6e 6f 6e 2d 70 61 72 73 65 64 20  h a "non-parsed 
11ea0 68 65 61 64 65 72 73 22 20 43 47 49 20 73 63 72  headers" CGI scr
11eb0 69 70 74 2e 20 20 4a 75 73 74 20 65 78 65 63 28  ipt.  Just exec(
11ec0 29 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 64 69  ).      ** it di
11ed0 72 65 63 74 6c 79 20 61 6e 64 20 6c 65 74 20 69  rectly and let i
11ee0 74 20 68 61 6e 64 6c 65 20 61 6c 6c 20 69 74 73  t handle all its
11ef0 20 6f 77 6e 20 68 65 61 64 65 72 20 67 65 6e 65   own header gene
11f00 72 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  ration..      */
11f10 0a 20 20 20 20 20 20 65 78 65 63 6c 28 7a 42 61  .      execl(zBa
11f20 73 65 46 69 6c 65 6e 61 6d 65 2c 7a 42 61 73 65  seFilename,zBase
11f30 46 69 6c 65 6e 61 6d 65 2c 28 63 68 61 72 2a 29  Filename,(char*)
11f40 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4e 4f 54  0);.      /* NOT
11f50 45 3a 20 4e 6f 20 6c 6f 67 20 65 6e 74 72 79 20  E: No log entry 
11f60 77 72 69 74 74 65 6e 20 66 6f 72 20 6e 70 68 2d  written for nph-
11f70 20 73 63 72 69 70 74 73 20 2a 2f 0a 20 20 20 20   scripts */.    
11f80 20 20 65 78 69 74 28 30 29 3b 0a 20 20 20 20 7d    exit(0);.    }
11f90 0a 0a 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68  ..    /* Fall th
11fa0 72 75 20 74 6f 20 68 65 72 65 20 6f 6e 6c 79 20  ru to here only 
11fb0 69 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  if this process 
11fc0 28 74 68 65 20 73 65 72 76 65 72 29 20 69 73 20  (the server) is 
11fd0 67 6f 69 6e 67 0a 20 20 20 20 2a 2a 20 74 6f 20  going.    ** to 
11fe0 72 65 61 64 20 61 6e 64 20 61 75 67 6d 65 6e 74  read and augment
11ff0 20 74 68 65 20 68 65 61 64 65 72 20 73 65 6e 74   the header sent
12000 20 62 61 63 6b 20 62 79 20 74 68 65 20 43 47 49   back by the CGI
12010 20 70 72 6f 63 65 73 73 2e 0a 20 20 20 20 2a 2a   process..    **
12020 20 4f 70 65 6e 20 61 20 70 69 70 65 20 74 6f 20   Open a pipe to 
12030 72 65 63 65 69 76 65 20 74 68 65 20 6f 75 74 70  receive the outp
12040 75 74 20 66 72 6f 6d 20 74 68 65 20 43 47 49 20  ut from the CGI 
12050 70 72 6f 63 65 73 73 2e 20 20 54 68 65 6e 0a 20  process.  Then. 
12060 20 20 20 2a 2a 20 66 6f 72 6b 20 74 68 65 20 43     ** fork the C
12070 47 49 20 70 72 6f 63 65 73 73 2e 20 20 4f 6e 63  GI process.  Onc
12080 65 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  e everything is 
12090 64 6f 6e 65 2c 20 77 65 20 73 68 6f 75 6c 64 20  done, we should 
120a0 62 65 0a 20 20 20 20 2a 2a 20 61 62 6c 65 20 74  be.    ** able t
120b0 6f 20 72 65 61 64 20 74 68 65 20 6f 75 74 70 75  o read the outpu
120c0 74 20 6f 66 20 43 47 49 20 6f 6e 20 74 68 65 20  t of CGI on the 
120d0 22 69 6e 22 20 73 74 72 65 61 6d 2e 0a 20 20 20  "in" stream..   
120e0 20 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20   */.    {.      
120f0 69 6e 74 20 70 78 5b 32 5d 3b 0a 20 20 20 20 20  int px[2];.     
12100 20 69 66 28 20 70 69 70 65 28 70 78 29 20 29 7b   if( pipe(px) ){
12110 0a 20 20 20 20 20 20 20 20 4d 61 6c 66 75 6e 63  .        Malfunc
12120 74 69 6f 6e 28 34 34 30 2c 20 2f 2a 20 4c 4f 47  tion(440, /* LOG
12130 3a 20 70 69 70 65 28 29 20 66 61 69 6c 65 64 20  : pipe() failed 
12140 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
12150 20 20 20 20 20 20 20 22 55 6e 61 62 6c 65 20 74         "Unable t
12160 6f 20 63 72 65 61 74 65 20 61 20 70 69 70 65 20  o create a pipe 
12170 66 6f 72 20 74 68 65 20 43 47 49 20 70 72 6f 67  for the CGI prog
12180 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ram");.      }. 
12190 20 20 20 20 20 69 66 28 20 66 6f 72 6b 28 29 3d       if( fork()=
121a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c  =0 ){.        cl
121b0 6f 73 65 28 70 78 5b 30 5d 29 3b 0a 20 20 20 20  ose(px[0]);.    
121c0 20 20 20 20 63 6c 6f 73 65 28 31 29 3b 0a 20 20      close(1);.  
121d0 20 20 20 20 20 20 69 66 28 20 64 75 70 28 70 78        if( dup(px
121e0 5b 31 5d 29 21 3d 31 20 29 7b 0a 20 20 20 20 20  [1])!=1 ){.     
121f0 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e       Malfunction
12200 28 34 35 30 2c 20 2f 2a 20 4c 4f 47 3a 20 64 75  (450, /* LOG: du
12210 70 28 31 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20  p(1) failed */. 
12220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12230 22 55 6e 61 62 6c 65 20 74 6f 20 64 75 70 6c 69  "Unable to dupli
12240 63 61 74 65 20 66 69 6c 65 20 64 65 73 63 72 69  cate file descri
12250 70 74 6f 72 20 25 64 20 74 6f 20 31 22 2c 0a 20  ptor %d to 1",. 
12260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12270 70 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  px[1]);.        
12280 7d 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28  }.        close(
12290 70 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  px[1]);.        
122a0 66 6f 72 28 69 3d 33 3b 20 63 6c 6f 73 65 28 69  for(i=3; close(i
122b0 29 3d 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  )==0; i++){}.   
122c0 20 20 20 20 20 65 78 65 63 6c 28 7a 42 61 73 65       execl(zBase
122d0 46 69 6c 65 6e 61 6d 65 2c 20 7a 42 61 73 65 46  Filename, zBaseF
122e0 69 6c 65 6e 61 6d 65 2c 20 28 63 68 61 72 2a 29  ilename, (char*)
122f0 30 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74  0);.        exit
12300 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (0);.      }.   
12310 20 20 20 63 6c 6f 73 65 28 70 78 5b 31 5d 29 3b     close(px[1]);
12320 0a 20 20 20 20 20 20 69 6e 20 3d 20 66 64 6f 70  .      in = fdop
12330 65 6e 28 70 78 5b 30 5d 2c 20 22 72 62 22 29 3b  en(px[0], "rb");
12340 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
12350 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 43 67  n==0 ){.      Cg
12360 69 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 65  iError();.    }e
12370 6c 73 65 7b 0a 20 20 20 20 20 20 43 67 69 48 61  lse{.      CgiHa
12380 6e 64 6c 65 52 65 70 6c 79 28 69 6e 29 3b 0a 20  ndleReply(in);. 
12390 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
123a0 20 6c 65 6e 46 69 6c 65 3e 35 20 26 26 20 73 74   lenFile>5 && st
123b0 72 63 6d 70 28 26 7a 46 69 6c 65 5b 6c 65 6e 46  rcmp(&zFile[lenF
123c0 69 6c 65 2d 35 5d 2c 22 2e 73 63 67 69 22 29 3d  ile-5],".scgi")=
123d0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 79  =0 ){.    /* Any
123e0 20 66 69 6c 65 20 74 68 61 74 20 65 6e 64 73 20   file that ends 
123f0 77 69 74 68 20 22 2e 73 63 67 69 22 20 69 73 20  with ".scgi" is 
12400 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 74 65  assumed to be te
12410 78 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  xt of the.    **
12420 20 66 6f 72 6d 3a 0a 20 20 20 20 2a 2a 20 20 20   form:.    **   
12430 20 20 53 43 47 49 20 68 6f 73 74 6e 61 6d 65 20    SCGI hostname 
12440 70 6f 72 74 0a 20 20 20 20 2a 2a 20 4f 70 65 6e  port.    ** Open
12450 20 61 20 54 43 50 2f 49 50 20 63 6f 6e 6e 65 63   a TCP/IP connec
12460 74 69 6f 6e 20 74 6f 20 74 68 61 74 20 68 6f 73  tion to that hos
12470 74 20 61 6e 64 20 73 65 6e 64 20 69 74 20 61 6e  t and send it an
12480 20 53 43 47 49 20 72 65 71 75 65 73 74 0a 20 20   SCGI request.  
12490 20 20 2a 2f 0a 20 20 20 20 53 65 6e 64 53 63 67    */.    SendScg
124a0 69 52 65 71 75 65 73 74 28 7a 46 69 6c 65 2c 20  iRequest(zFile, 
124b0 7a 53 63 72 69 70 74 29 3b 0a 20 20 7d 65 6c 73  zScript);.  }els
124c0 65 20 69 66 28 20 63 6f 75 6e 74 53 6c 61 73 68  e if( countSlash
124d0 65 73 28 7a 52 65 61 6c 53 63 72 69 70 74 29 21  es(zRealScript)!
124e0 3d 63 6f 75 6e 74 53 6c 61 73 68 65 73 28 7a 53  =countSlashes(zS
124f0 63 72 69 70 74 29 20 29 7b 0a 20 20 20 20 2f 2a  cript) ){.    /*
12500 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 20   If the request 
12510 55 52 49 20 66 6f 72 20 73 74 61 74 69 63 20 63  URI for static c
12520 6f 6e 74 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20  ontent contains 
12530 6d 61 74 65 72 69 61 6c 20 70 61 73 74 20 74 68  material past th
12540 65 0a 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 20  e.    ** actual 
12550 63 6f 6e 74 65 6e 74 20 66 69 6c 65 20 6e 61 6d  content file nam
12560 65 2c 20 72 65 70 6f 72 74 20 74 68 61 74 20 61  e, report that a
12570 73 20 61 20 34 30 34 20 65 72 72 6f 72 2e 20 2a  s a 404 error. *
12580 2f 0a 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 34  /.    NotFound(4
12590 36 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 45 78 63  60); /* LOG: Exc
125a0 65 73 73 20 55 52 49 20 63 6f 6e 74 65 6e 74 20  ess URI content 
125b0 70 61 73 74 20 73 74 61 74 69 63 20 66 69 6c 65  past static file
125c0 20 6e 61 6d 65 20 2a 2f 0a 20 20 7d 65 6c 73 65   name */.  }else
125d0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69  {.    /* If it i
125e0 73 6e 27 74 20 65 78 65 63 75 74 61 62 6c 65 20  sn't executable 
125f0 74 68 65 6e 20 69 74 0a 20 20 20 20 2a 2a 20 6d  then it.    ** m
12600 75 73 74 20 61 20 73 69 6d 70 6c 65 20 66 69 6c  ust a simple fil
12610 65 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  e that needs to 
12620 62 65 20 63 6f 70 69 65 64 20 74 6f 20 6f 75 74  be copied to out
12630 70 75 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  put..    */.    
12640 69 66 28 20 53 65 6e 64 46 69 6c 65 28 7a 46 69  if( SendFile(zFi
12650 6c 65 2c 20 6c 65 6e 46 69 6c 65 2c 20 26 73 74  le, lenFile, &st
12660 61 74 62 75 66 29 20 29 20 72 65 74 75 72 6e 3b  atbuf) ) return;
12670 0a 20 20 7d 0a 20 20 66 66 6c 75 73 68 28 73 74  .  }.  fflush(st
12680 64 6f 75 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67  dout);.  MakeLog
12690 45 6e 74 72 79 28 30 2c 20 30 29 3b 20 20 2f 2a  Entry(0, 0);  /*
126a0 20 4c 4f 47 3a 20 4e 6f 72 6d 61 6c 20 72 65 70   LOG: Normal rep
126b0 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  ly */..  /* The 
126c0 6e 65 78 74 20 72 65 71 75 65 73 74 20 6d 75 73  next request mus
126d0 74 20 61 72 72 69 76 65 20 77 69 74 68 69 6e 20  t arrive within 
126e0 33 30 20 73 65 63 6f 6e 64 73 20 6f 72 20 77 65  30 seconds or we
126f0 20 63 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65   close the conne
12700 63 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6f 6d 69  ction.  */.  omi
12710 74 4c 6f 67 20 3d 20 31 3b 0a 20 20 69 66 28 20  tLog = 1;.  if( 
12720 75 73 65 54 69 6d 65 6f 75 74 20 29 20 61 6c 61  useTimeout ) ala
12730 72 6d 28 33 30 29 3b 0a 7d 0a 0a 23 64 65 66 69  rm(30);.}..#defi
12740 6e 65 20 4d 41 58 5f 50 41 52 41 4c 4c 45 4c 20  ne MAX_PARALLEL 
12750 35 30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  50  /* Number of
12760 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 63 68   simultaneous ch
12770 69 6c 64 72 65 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ildren */../*.**
12780 20 41 6c 6c 20 70 6f 73 73 69 62 6c 65 20 66 6f   All possible fo
12790 72 6d 73 20 6f 66 20 61 6e 20 49 50 20 61 64 64  rms of an IP add
127a0 72 65 73 73 2e 20 20 4e 65 65 64 65 64 20 74 6f  ress.  Needed to
127b0 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 47 43 43   work around GCC
127c0 20 73 74 72 69 63 74 0a 2a 2a 20 61 6c 69 61 73   strict.** alias
127d0 69 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a 74 79  ing rules..*/.ty
127e0 70 65 64 65 66 20 75 6e 69 6f 6e 20 7b 0a 20 20  pedef union {.  
127f0 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 20  struct sockaddr 
12800 73 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sa;             
12810 20 2f 2a 20 41 62 73 74 72 61 63 74 20 73 75 70   /* Abstract sup
12820 65 72 63 6c 61 73 73 20 2a 2f 0a 20 20 73 74 72  erclass */.  str
12830 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 20  uct sockaddr_in 
12840 73 61 34 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  sa4;          /*
12850 20 49 50 76 34 20 2a 2f 0a 20 20 73 74 72 75 63   IPv4 */.  struc
12860 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 36 20 73  t sockaddr_in6 s
12870 61 36 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  a6;         /* I
12880 50 76 36 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  Pv6 */.  struct 
12890 73 6f 63 6b 61 64 64 72 5f 73 74 6f 72 61 67 65  sockaddr_storage
128a0 20 73 61 73 3b 20 20 20 20 20 2f 2a 20 53 68 6f   sas;     /* Sho
128b0 75 6c 64 20 62 65 20 74 68 65 20 6d 61 78 69 6d  uld be the maxim
128c0 75 6d 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20  um of the above 
128d0 33 20 2a 2f 0a 7d 20 61 64 64 72 65 73 73 3b 0a  3 */.} address;.
128e0 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
128f0 20 61 6e 20 48 54 54 50 20 73 65 72 76 65 72 20   an HTTP server 
12900 64 61 65 6d 6f 6e 20 6c 69 73 74 65 6e 69 6e 67  daemon listening
12910 20 6f 6e 20 70 6f 72 74 20 69 50 6f 72 74 2e 0a   on port iPort..
12920 2a 2a 0a 2a 2a 20 41 73 20 6e 65 77 20 63 6f 6e  **.** As new con
12930 6e 65 63 74 69 6f 6e 73 20 61 72 72 69 76 65 2c  nections arrive,
12940 20 66 6f 72 6b 20 61 20 63 68 69 6c 64 20 61 6e   fork a child an
12950 64 20 6c 65 74 20 63 68 69 6c 64 20 72 65 74 75  d let child retu
12960 72 6e 0a 2a 2a 20 6f 75 74 20 6f 66 20 74 68 69  rn.** out of thi
12970 73 20 70 72 6f 63 65 64 75 72 65 20 63 61 6c 6c  s procedure call
12980 2e 20 20 54 68 65 20 63 68 69 6c 64 20 77 69 6c  .  The child wil
12990 6c 20 68 61 6e 64 6c 65 20 74 68 65 20 72 65 71  l handle the req
129a0 75 65 73 74 2e 0a 2a 2a 20 54 68 65 20 70 61 72  uest..** The par
129b0 65 6e 74 20 6e 65 76 65 72 20 72 65 74 75 72 6e  ent never return
129c0 73 20 66 72 6f 6d 20 74 68 69 73 20 70 72 6f 63  s from this proc
129d0 65 64 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  edure..**.** Ret
129e0 75 72 6e 20 30 20 74 6f 20 65 61 63 68 20 63 68  urn 0 to each ch
129f0 69 6c 64 20 61 73 20 69 74 20 72 75 6e 73 2e 20  ild as it runs. 
12a00 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 65 73   If unable to es
12a10 74 61 62 6c 69 73 68 20 61 0a 2a 2a 20 6c 69 73  tablish a.** lis
12a20 74 65 6e 69 6e 67 20 73 6f 63 6b 65 74 2c 20 72  tening socket, r
12a30 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  eturn non-zero..
12a40 2a 2f 0a 69 6e 74 20 68 74 74 70 5f 73 65 72 76  */.int http_serv
12a50 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  er(const char *z
12a60 50 6f 72 74 2c 20 69 6e 74 20 6c 6f 63 61 6c 4f  Port, int localO
12a70 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 6c 69 73 74  nly){.  int list
12a80 65 6e 65 72 5b 32 30 5d 3b 20 20 20 20 20 20 20  ener[20];       
12a90 20 20 20 20 20 2f 2a 20 54 68 65 20 73 65 72 76       /* The serv
12aa0 65 72 20 73 6f 63 6b 65 74 73 20 2a 2f 0a 20 20  er sockets */.  
12ab0 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 3b 20  int connection; 
12ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12ad0 41 20 73 6f 63 6b 65 74 20 66 6f 72 20 65 61 63  A socket for eac
12ae0 68 20 69 6e 64 69 76 69 64 75 61 6c 20 63 6f 6e  h individual con
12af0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 66 64 5f  nection */.  fd_
12b00 73 65 74 20 72 65 61 64 66 64 73 3b 20 20 20 20  set readfds;    
12b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
12b20 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69 70   of file descrip
12b30 74 6f 72 73 20 66 6f 72 20 73 65 6c 65 63 74 28  tors for select(
12b40 29 20 2a 2f 0a 20 20 61 64 64 72 65 73 73 20 69  ) */.  address i
12b50 6e 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20  naddr;          
12b60 20 20 20 20 2f 2a 20 52 65 6d 6f 74 65 20 61 64      /* Remote ad
12b70 64 72 65 73 73 20 2a 2f 0a 20 20 73 6f 63 6b 6c  dress */.  sockl
12b80 65 6e 5f 74 20 6c 65 6e 61 64 64 72 3b 20 20 20  en_t lenaddr;   
12b90 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
12ba0 68 20 6f 66 20 74 68 65 20 69 6e 61 64 64 72 20  h of the inaddr 
12bb0 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
12bc0 6e 74 20 63 68 69 6c 64 3b 20 20 20 20 20 20 20  nt child;       
12bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
12be0 49 44 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  ID of the child 
12bf0 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 69 6e 74  process */.  int
12c00 20 6e 63 68 69 6c 64 72 65 6e 20 3d 20 30 3b 20   nchildren = 0; 
12c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
12c20 62 65 72 20 6f 66 20 63 68 69 6c 64 20 70 72 6f  ber of child pro
12c30 63 65 73 73 65 73 20 2a 2f 0a 20 20 73 74 72 75  cesses */.  stru
12c40 63 74 20 74 69 6d 65 76 61 6c 20 64 65 6c 61 79  ct timeval delay
12c50 3b 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20  ;        /* How 
12c60 6c 6f 6e 67 20 74 6f 20 77 61 69 74 20 69 6e 73  long to wait ins
12c70 69 64 65 20 73 65 6c 65 63 74 28 29 20 2a 2f 0a  ide select() */.
12c80 20 20 69 6e 74 20 6f 70 74 20 3d 20 31 3b 20 20    int opt = 1;  
12c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12ca0 2a 20 73 65 74 73 6f 63 6b 6f 70 74 20 66 6c 61  * setsockopt fla
12cb0 67 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61 64  g */.  struct ad
12cc0 64 72 69 6e 66 6f 20 73 48 69 6e 74 73 3b 20 20  drinfo sHints;  
12cd0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 68      /* Address h
12ce0 69 6e 74 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  ints */.  struct
12cf0 20 61 64 64 72 69 6e 66 6f 20 2a 70 41 64 64 72   addrinfo *pAddr
12d00 73 2c 20 2a 70 3b 20 2f 2a 20 2a 2f 0a 20 20 69  s, *p; /* */.  i
12d10 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
12d20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
12d30 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
12d40 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 6e 74 20  int i, n;.  int 
12d50 6d 61 78 46 64 20 3d 20 2d 31 3b 0a 20 20 0a 20  maxFd = -1;.  . 
12d60 20 6d 65 6d 73 65 74 28 26 73 48 69 6e 74 73 2c   memset(&sHints,
12d70 20 30 2c 20 73 69 7a 65 6f 66 28 73 48 69 6e 74   0, sizeof(sHint
12d80 73 29 29 3b 0a 20 20 69 66 28 20 69 70 76 34 4f  s));.  if( ipv4O
12d90 6e 6c 79 20 29 7b 0a 20 20 20 20 73 48 69 6e 74  nly ){.    sHint
12da0 73 2e 61 69 5f 66 61 6d 69 6c 79 20 3d 20 50 46  s.ai_family = PF
12db0 5f 49 4e 45 54 3b 0a 20 20 20 20 2f 2a 70 72 69  _INET;.    /*pri
12dc0 6e 74 66 28 22 69 70 76 34 20 6f 6e 6c 79 5c 6e  ntf("ipv4 only\n
12dd0 22 29 3b 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66  ");*/.  }else if
12de0 28 20 69 70 76 36 4f 6e 6c 79 20 29 7b 0a 20 20  ( ipv6Only ){.  
12df0 20 20 73 48 69 6e 74 73 2e 61 69 5f 66 61 6d 69    sHints.ai_fami
12e00 6c 79 20 3d 20 50 46 5f 49 4e 45 54 36 3b 0a 20  ly = PF_INET6;. 
12e10 20 20 20 2f 2a 70 72 69 6e 74 66 28 22 69 70 76     /*printf("ipv
12e20 36 20 6f 6e 6c 79 5c 6e 22 29 3b 2a 2f 0a 20 20  6 only\n");*/.  
12e30 7d 65 6c 73 65 7b 0a 20 20 20 20 73 48 69 6e 74  }else{.    sHint
12e40 73 2e 61 69 5f 66 61 6d 69 6c 79 20 3d 20 50 46  s.ai_family = PF
12e50 5f 55 4e 53 50 45 43 3b 0a 20 20 7d 0a 20 20 73  _UNSPEC;.  }.  s
12e60 48 69 6e 74 73 2e 61 69 5f 73 6f 63 6b 74 79 70  Hints.ai_socktyp
12e70 65 20 3d 20 53 4f 43 4b 5f 53 54 52 45 41 4d 3b  e = SOCK_STREAM;
12e80 0a 20 20 73 48 69 6e 74 73 2e 61 69 5f 66 6c 61  .  sHints.ai_fla
12e90 67 73 20 3d 20 41 49 5f 50 41 53 53 49 56 45 3b  gs = AI_PASSIVE;
12ea0 0a 20 20 73 48 69 6e 74 73 2e 61 69 5f 70 72 6f  .  sHints.ai_pro
12eb0 74 6f 63 6f 6c 20 3d 20 30 3b 0a 20 20 72 63 20  tocol = 0;.  rc 
12ec0 3d 20 67 65 74 61 64 64 72 69 6e 66 6f 28 6c 6f  = getaddrinfo(lo
12ed0 63 61 6c 4f 6e 6c 79 20 3f 20 22 6c 6f 63 61 6c  calOnly ? "local
12ee0 68 6f 73 74 22 3a 20 30 2c 20 7a 50 6f 72 74 2c  host": 0, zPort,
12ef0 20 26 73 48 69 6e 74 73 2c 20 26 70 41 64 64 72   &sHints, &pAddr
12f00 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  s);.  if( rc ){.
12f10 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
12f20 72 72 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 67  rr, "could not g
12f30 65 74 20 61 64 64 72 20 69 6e 66 6f 3a 20 25 73  et addr info: %s
12f40 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
12f50 72 63 21 3d 45 41 49 5f 53 59 53 54 45 4d 20 3f  rc!=EAI_SYSTEM ?
12f60 20 67 61 69 5f 73 74 72 65 72 72 6f 72 28 72 63   gai_strerror(rc
12f70 29 20 3a 20 73 74 72 65 72 72 6f 72 28 65 72 72  ) : strerror(err
12f80 6e 6f 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  no));.    return
12f90 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6e 3d   1;.  }.  for(n=
12fa0 30 2c 20 70 3d 70 41 64 64 72 73 3b 20 6e 3c 28  0, p=pAddrs; n<(
12fb0 69 6e 74 29 28 73 69 7a 65 6f 66 28 6c 69 73 74  int)(sizeof(list
12fc0 65 6e 65 72 29 2f 73 69 7a 65 6f 66 28 6c 69 73  ener)/sizeof(lis
12fd0 74 65 6e 65 72 5b 30 5d 29 29 20 26 26 20 70 21  tener[0])) && p!
12fe0 3d 30 3b 0a 20 20 20 20 20 20 20 20 70 3d 70 2d  =0;.        p=p-
12ff0 3e 61 69 5f 6e 65 78 74 29 7b 0a 20 20 20 20 6c  >ai_next){.    l
13000 69 73 74 65 6e 65 72 5b 6e 5d 20 3d 20 73 6f 63  istener[n] = soc
13010 6b 65 74 28 70 2d 3e 61 69 5f 66 61 6d 69 6c 79  ket(p->ai_family
13020 2c 20 70 2d 3e 61 69 5f 73 6f 63 6b 74 79 70 65  , p->ai_socktype
13030 2c 20 70 2d 3e 61 69 5f 70 72 6f 74 6f 63 6f 6c  , p->ai_protocol
13040 29 3b 0a 20 20 20 20 69 66 28 20 6c 69 73 74 65  );.    if( liste
13050 6e 65 72 5b 6e 5d 3e 3d 30 20 29 7b 0a 20 20 20  ner[n]>=0 ){.   
13060 20 20 20 2f 2a 20 69 66 20 77 65 20 63 61 6e 27     /* if we can'
13070 74 20 74 65 72 6d 69 6e 61 74 65 20 6e 69 63 65  t terminate nice
13080 6c 79 2c 20 61 74 20 6c 65 61 73 74 20 61 6c 6c  ly, at least all
13090 6f 77 20 74 68 65 20 73 6f 63 6b 65 74 20 74 6f  ow the socket to
130a0 20 62 65 20 72 65 75 73 65 64 20 2a 2f 0a 20 20   be reused */.  
130b0 20 20 20 20 73 65 74 73 6f 63 6b 6f 70 74 28 6c      setsockopt(l
130c0 69 73 74 65 6e 65 72 5b 6e 5d 2c 20 53 4f 4c 5f  istener[n], SOL_
130d0 53 4f 43 4b 45 54 2c 20 53 4f 5f 52 45 55 53 45  SOCKET, SO_REUSE
130e0 41 44 44 52 2c 26 6f 70 74 2c 20 73 69 7a 65 6f  ADDR,&opt, sizeo
130f0 66 28 6f 70 74 29 29 3b 0a 20 20 20 20 20 20 0a  f(opt));.      .
13100 23 69 66 20 64 65 66 69 6e 65 64 28 49 50 56 36  #if defined(IPV6
13110 5f 56 36 4f 4e 4c 59 29 0a 20 20 20 20 20 20 69  _V6ONLY).      i
13120 66 28 20 70 2d 3e 61 69 5f 66 61 6d 69 6c 79 3d  f( p->ai_family=
13130 3d 41 46 5f 49 4e 45 54 36 20 29 7b 0a 20 20 20  =AF_INET6 ){.   
13140 20 20 20 20 20 69 6e 74 20 76 36 6f 6e 6c 79 20       int v6only 
13150 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 65 74  = 1;.        set
13160 73 6f 63 6b 6f 70 74 28 6c 69 73 74 65 6e 65 72  sockopt(listener
13170 5b 6e 5d 2c 20 49 50 50 52 4f 54 4f 5f 49 50 56  [n], IPPROTO_IPV
13180 36 2c 20 49 50 56 36 5f 56 36 4f 4e 4c 59 2c 0a  6, IPV6_V6ONLY,.
13190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131a0 20 20 20 20 26 76 36 6f 6e 6c 79 2c 20 73 69 7a      &v6only, siz
131b0 65 6f 66 28 76 36 6f 6e 6c 79 29 29 3b 0a 20 20  eof(v6only));.  
131c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
131d0 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 62 69     .      if( bi
131e0 6e 64 28 6c 69 73 74 65 6e 65 72 5b 6e 5d 2c 20  nd(listener[n], 
131f0 70 2d 3e 61 69 5f 61 64 64 72 2c 20 70 2d 3e 61  p->ai_addr, p->a
13200 69 5f 61 64 64 72 6c 65 6e 29 3c 30 20 29 7b 0a  i_addrlen)<0 ){.
13210 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
13220 62 69 6e 64 20 66 61 69 6c 65 64 3a 20 25 73 5c  bind failed: %s\
13230 6e 22 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72  n", strerror(err
13240 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 63 6c  no));.        cl
13250 6f 73 65 28 6c 69 73 74 65 6e 65 72 5b 6e 5d 29  ose(listener[n])
13260 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
13270 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
13280 20 20 69 66 28 20 6c 69 73 74 65 6e 28 6c 69 73    if( listen(lis
13290 74 65 6e 65 72 5b 6e 5d 2c 20 32 30 29 3c 30 20  tener[n], 20)<0 
132a0 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74  ){.        print
132b0 66 28 22 6c 69 73 74 65 6e 28 29 20 66 61 69 6c  f("listen() fail
132c0 65 64 3a 20 25 73 5c 6e 22 2c 20 73 74 72 65 72  ed: %s\n", strer
132d0 72 6f 72 28 65 72 72 6e 6f 29 29 3b 0a 20 20 20  ror(errno));.   
132e0 20 20 20 20 20 63 6c 6f 73 65 28 6c 69 73 74 65       close(liste
132f0 6e 65 72 5b 6e 5d 29 3b 0a 20 20 20 20 20 20 20  ner[n]);.       
13300 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
13310 20 7d 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20   }.      n++;.  
13320 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d    }.  }.  if( n=
13330 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
13340 66 28 73 74 64 65 72 72 2c 20 22 63 61 6e 6e 6f  f(stderr, "canno
13350 74 20 6f 70 65 6e 20 61 6e 79 20 73 6f 63 6b 65  t open any socke
13360 74 73 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75  ts\n");.    retu
13370 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  rn 1;.  }..  whi
13380 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 66 28  le( 1 ){.    if(
13390 20 6e 63 68 69 6c 64 72 65 6e 3e 4d 41 58 5f 50   nchildren>MAX_P
133a0 41 52 41 4c 4c 45 4c 20 29 7b 0a 20 20 20 20 20  ARALLEL ){.     
133b0 20 2f 2a 20 53 6c 6f 77 20 64 6f 77 6e 20 69 66   /* Slow down if
133c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
133d0 20 61 72 72 69 76 69 6e 67 20 74 6f 6f 20 66 61   arriving too fa
133e0 73 74 20 2a 2f 0a 20 20 20 20 20 20 73 6c 65 65  st */.      slee
133f0 70 28 20 6e 63 68 69 6c 64 72 65 6e 2d 4d 41 58  p( nchildren-MAX
13400 5f 50 41 52 41 4c 4c 45 4c 20 29 3b 0a 20 20 20  _PARALLEL );.   
13410 20 7d 0a 20 20 20 20 64 65 6c 61 79 2e 74 76 5f   }.    delay.tv_
13420 73 65 63 20 3d 20 36 30 3b 0a 20 20 20 20 64 65  sec = 60;.    de
13430 6c 61 79 2e 74 76 5f 75 73 65 63 20 3d 20 30 3b  lay.tv_usec = 0;
13440 0a 20 20 20 20 46 44 5f 5a 45 52 4f 28 26 72 65  .    FD_ZERO(&re
13450 61 64 66 64 73 29 3b 0a 20 20 20 20 66 6f 72 28  adfds);.    for(
13460 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
13470 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 69        assert( li
13480 73 74 65 6e 65 72 5b 69 5d 3e 3d 30 20 29 3b 0a  stener[i]>=0 );.
13490 20 20 20 20 20 20 46 44 5f 53 45 54 28 20 6c 69        FD_SET( li
134a0 73 74 65 6e 65 72 5b 69 5d 2c 20 26 72 65 61 64  stener[i], &read
134b0 66 64 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  fds);.      if( 
134c0 6c 69 73 74 65 6e 65 72 5b 69 5d 3e 6d 61 78 46  listener[i]>maxF
134d0 64 20 29 20 6d 61 78 46 64 20 3d 20 6c 69 73 74  d ) maxFd = list
134e0 65 6e 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  ener[i];.    }. 
134f0 20 20 20 73 65 6c 65 63 74 28 20 6d 61 78 46 64     select( maxFd
13500 2b 31 2c 20 26 72 65 61 64 66 64 73 2c 20 30 2c  +1, &readfds, 0,
13510 20 30 2c 20 26 64 65 6c 61 79 29 3b 0a 20 20 20   0, &delay);.   
13520 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
13530 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 46  ++){.      if( F
13540 44 5f 49 53 53 45 54 28 6c 69 73 74 65 6e 65 72  D_ISSET(listener
13550 5b 69 5d 2c 20 26 72 65 61 64 66 64 73 29 20 29  [i], &readfds) )
13560 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 61 64 64  {.        lenadd
13570 72 20 3d 20 73 69 7a 65 6f 66 28 69 6e 61 64 64  r = sizeof(inadd
13580 72 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 6e  r);.        conn
13590 65 63 74 69 6f 6e 20 3d 20 61 63 63 65 70 74 28  ection = accept(
135a0 6c 69 73 74 65 6e 65 72 5b 69 5d 2c 20 26 69 6e  listener[i], &in
135b0 61 64 64 72 2e 73 61 2c 20 26 6c 65 6e 61 64 64  addr.sa, &lenadd
135c0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
135d0 63 6f 6e 6e 65 63 74 69 6f 6e 3e 3d 30 20 29 7b  connection>=0 ){
135e0 0a 20 20 20 20 20 20 20 20 20 20 63 68 69 6c 64  .          child
135f0 20 3d 20 66 6f 72 6b 28 29 3b 0a 20 20 20 20 20   = fork();.     
13600 20 20 20 20 20 69 66 28 20 63 68 69 6c 64 21 3d       if( child!=
13610 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
13620 20 69 66 28 20 63 68 69 6c 64 3e 30 20 29 20 6e   if( child>0 ) n
13630 63 68 69 6c 64 72 65 6e 2b 2b 3b 0a 20 20 20 20  children++;.    
13640 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 63 6f          close(co
13650 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  nnection);.     
13660 20 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 66         /* printf
13670 28 22 73 75 62 70 72 6f 63 65 73 73 20 25 64 20  ("subprocess %d 
13680 73 74 61 72 74 65 64 2e 2e 2e 5c 6e 22 2c 20 63  started...\n", c
13690 68 69 6c 64 29 3b 20 66 66 6c 75 73 68 28 73 74  hild); fflush(st
136a0 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 20 20 20 20  dout); */.      
136b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
136c0 20 20 20 20 20 20 20 69 6e 74 20 6e 45 72 72 20         int nErr 
136d0 3d 20 30 2c 20 66 64 3b 0a 20 20 20 20 20 20 20  = 0, fd;.       
136e0 20 20 20 20 20 63 6c 6f 73 65 28 30 29 3b 0a 20       close(0);. 
136f0 20 20 20 20 20 20 20 20 20 20 20 66 64 20 3d 20             fd = 
13700 64 75 70 28 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b  dup(connection);
13710 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
13720 20 66 64 21 3d 30 20 29 20 6e 45 72 72 2b 2b 3b   fd!=0 ) nErr++;
13730 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f  .            clo
13740 73 65 28 31 29 3b 0a 20 20 20 20 20 20 20 20 20  se(1);.         
13750 20 20 20 66 64 20 3d 20 64 75 70 28 63 6f 6e 6e     fd = dup(conn
13760 65 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20  ection);.       
13770 20 20 20 20 20 69 66 28 20 66 64 21 3d 31 20 29       if( fd!=1 )
13780 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20   nErr++;.       
13790 20 20 20 20 20 63 6c 6f 73 65 28 63 6f 6e 6e 65       close(conne
137a0 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20  ction);.        
137b0 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b      return nErr;
137c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
137d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
137e0 20 20 20 20 20 2f 2a 20 42 75 72 79 20 64 65 61       /* Bury dea
137f0 64 20 63 68 69 6c 64 72 65 6e 20 2a 2f 0a 20 20  d children */.  
13800 20 20 20 20 77 68 69 6c 65 28 20 28 63 68 69 6c      while( (chil
13810 64 20 3d 20 77 61 69 74 70 69 64 28 30 2c 20 30  d = waitpid(0, 0
13820 2c 20 57 4e 4f 48 41 4e 47 29 29 3e 30 20 29 7b  , WNOHANG))>0 ){
13830 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 72 69 6e  .        /* prin
13840 74 66 28 22 70 72 6f 63 65 73 73 20 25 64 20 65  tf("process %d e
13850 6e 64 73 5c 6e 22 2c 20 63 68 69 6c 64 29 3b 20  nds\n", child); 
13860 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 20  fflush(stdout); 
13870 2a 2f 0a 20 20 20 20 20 20 20 20 6e 63 68 69 6c  */.        nchil
13880 64 72 65 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a  dren--;.      }.
13890 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4e      }.  }.  /* N
138a0 4f 54 20 52 45 41 43 48 45 44 20 2a 2f 20 20 0a  OT REACHED */  .
138b0 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 0a 69    exit(1);.}...i
138c0 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63  nt main(int argc
138d0 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a  , char **argv){.
138e0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
138f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
13900 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
13910 20 63 68 61 72 20 2a 7a 50 65 72 6d 55 73 65 72   char *zPermUser
13920 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 52 75   = 0;      /* Ru
13930 6e 20 64 61 65 6d 6f 6e 20 77 69 74 68 20 74 68  n daemon with th
13940 69 73 20 75 73 65 72 27 73 20 70 65 72 6d 69 73  is user's permis
13950 73 69 6f 6e 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  sions */.  const
13960 20 63 68 61 72 20 2a 7a 50 6f 72 74 20 3d 20 30   char *zPort = 0
13970 3b 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e  ;    /* Implemen
13980 74 20 61 6e 20 48 54 54 50 20 73 65 72 76 65 72  t an HTTP server
13990 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 69 6e   process */.  in
139a0 74 20 75 73 65 43 68 72 6f 6f 74 4a 61 69 6c 20  t useChrootJail 
139b0 3d 20 31 3b 20 20 20 20 2f 2a 20 54 72 75 65 20  = 1;    /* True 
139c0 74 6f 20 75 73 65 20 61 20 63 68 61 6e 67 65 2d  to use a change-
139d0 72 6f 6f 74 20 6a 61 69 6c 20 2a 2f 0a 20 20 73  root jail */.  s
139e0 74 72 75 63 74 20 70 61 73 73 77 64 20 2a 70 77  truct passwd *pw
139f0 64 20 3d 20 30 3b 20 20 20 2f 2a 20 49 6e 66 6f  d = 0;   /* Info
13a00 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
13a10 65 20 75 73 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20  e user */..  /* 
13a20 52 65 63 6f 72 64 20 74 68 65 20 74 69 6d 65 20  Record the time 
13a30 77 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  when processing 
13a40 62 65 67 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 67  begins..  */.  g
13a50 65 74 74 69 6d 65 6f 66 64 61 79 28 26 62 65 67  ettimeofday(&beg
13a60 69 6e 54 69 6d 65 2c 20 30 29 3b 0a 0a 20 20 2f  inTime, 0);..  /
13a70 2a 20 50 61 72 73 65 20 63 6f 6d 6d 61 6e 64 2d  * Parse command-
13a80 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 73 0a 20  line arguments. 
13a90 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 61 72 67   */.  while( arg
13aa0 63 3e 31 20 26 26 20 61 72 67 76 5b 31 5d 5b 30  c>1 && argv[1][0
13ab0 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 63 68  ]=='-' ){.    ch
13ac0 61 72 20 2a 7a 20 3d 20 61 72 67 76 5b 31 5d 3b  ar *z = argv[1];
13ad0 0a 20 20 20 20 63 68 61 72 20 2a 7a 41 72 67 20  .    char *zArg 
13ae0 3d 20 61 72 67 63 3e 3d 33 20 3f 20 61 72 67 76  = argc>=3 ? argv
13af0 5b 32 5d 20 3a 20 22 30 22 3b 0a 20 20 20 20 69  [2] : "0";.    i
13b00 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20  f( z[0]=='-' && 
13b10 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b  z[1]=='-' ) z++;
13b20 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
13b30 7a 2c 22 2d 75 73 65 72 22 29 3d 3d 30 20 29 7b  z,"-user")==0 ){
13b40 0a 20 20 20 20 20 20 7a 50 65 72 6d 55 73 65 72  .      zPermUser
13b50 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 7d 65 6c   = zArg;.    }el
13b60 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
13b70 22 2d 72 6f 6f 74 22 29 3d 3d 30 20 29 7b 0a 20  "-root")==0 ){. 
13b80 20 20 20 20 20 7a 52 6f 6f 74 20 3d 20 7a 41 72       zRoot = zAr
13b90 67 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  g;.    }else if(
13ba0 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6c 6f 67 66   strcmp(z,"-logf
13bb0 69 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ile")==0 ){.    
13bc0 20 20 7a 4c 6f 67 46 69 6c 65 20 3d 20 7a 41 72    zLogFile = zAr
13bd0 67 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  g;.    }else if(
13be0 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6d 61 78 2d   strcmp(z,"-max-
13bf0 61 67 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  age")==0 ){.    
13c00 20 20 6d 78 41 67 65 20 3d 20 61 74 6f 69 28 7a    mxAge = atoi(z
13c10 41 72 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Arg);.    }else 
13c20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 68  if( strcmp(z,"-h
13c30 74 74 70 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ttps")==0 ){.   
13c40 20 20 20 75 73 65 48 74 74 70 73 20 3d 20 61 74     useHttps = at
13c50 6f 69 28 7a 41 72 67 29 3b 0a 20 20 20 20 20 20  oi(zArg);.      
13c60 7a 48 74 74 70 20 3d 20 75 73 65 48 74 74 70 73  zHttp = useHttps
13c70 20 3f 20 22 68 74 74 70 73 22 20 3a 20 22 68 74   ? "https" : "ht
13c80 74 70 22 3b 0a 20 20 20 20 20 20 69 66 28 20 75  tp";.      if( u
13c90 73 65 48 74 74 70 73 20 29 20 7a 52 65 6d 6f 74  seHttps ) zRemot
13ca0 65 41 64 64 72 20 3d 20 67 65 74 65 6e 76 28 22  eAddr = getenv("
13cb0 52 45 4d 4f 54 45 5f 48 4f 53 54 22 29 3b 0a 20  REMOTE_HOST");. 
13cc0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
13cd0 63 6d 70 28 7a 2c 20 22 2d 70 6f 72 74 22 29 3d  cmp(z, "-port")=
13ce0 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 50 6f 72  =0 ){.      zPor
13cf0 74 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 20 20  t = zArg;.      
13d00 73 74 61 6e 64 61 6c 6f 6e 65 20 3d 20 31 3b 0a  standalone = 1;.
13d10 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
13d20 72 63 6d 70 28 7a 2c 20 22 2d 66 61 6d 69 6c 79  rcmp(z, "-family
13d30 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
13d40 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20  f( strcmp(zArg, 
13d50 22 69 70 76 34 22 29 3d 3d 30 20 29 7b 0a 20 20  "ipv4")==0 ){.  
13d60 20 20 20 20 20 20 69 70 76 34 4f 6e 6c 79 20 3d        ipv4Only =
13d70 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
13d80 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
13d90 20 22 69 70 76 36 22 29 3d 3d 30 20 29 7b 0a 20   "ipv6")==0 ){. 
13da0 20 20 20 20 20 20 20 69 70 76 36 4f 6e 6c 79 20         ipv6Only 
13db0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
13dc0 7b 0a 20 20 20 20 20 20 20 20 4d 61 6c 66 75 6e  {.        Malfun
13dd0 63 74 69 6f 6e 28 35 30 30 2c 20 20 2f 2a 20 4c  ction(500,  /* L
13de0 4f 47 3a 20 75 6e 6b 6e 6f 77 6e 20 49 50 20 70  OG: unknown IP p
13df0 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20 20  rotocol */.     
13e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
13e10 75 6e 6b 6e 6f 77 6e 20 49 50 20 70 72 6f 74 6f  unknown IP proto
13e20 63 6f 6c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 41  col: [%s]\n", zA
13e30 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rg);.      }.   
13e40 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
13e50 70 28 7a 2c 20 22 2d 6a 61 69 6c 22 29 3d 3d 30  p(z, "-jail")==0
13e60 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 74   ){.      if( at
13e70 6f 69 28 7a 41 72 67 29 3d 3d 30 20 29 7b 0a 20  oi(zArg)==0 ){. 
13e80 20 20 20 20 20 20 20 75 73 65 43 68 72 6f 6f 74         useChroot
13e90 4a 61 69 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Jail = 0;.      
13ea0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
13eb0 73 74 72 63 6d 70 28 7a 2c 20 22 2d 64 65 62 75  strcmp(z, "-debu
13ec0 67 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  g")==0 ){.      
13ed0 69 66 28 20 61 74 6f 69 28 7a 41 72 67 29 20 29  if( atoi(zArg) )
13ee0 7b 0a 20 20 20 20 20 20 20 20 75 73 65 54 69 6d  {.        useTim
13ef0 65 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  eout = 0;.      
13f00 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
13f10 73 74 72 63 6d 70 28 7a 2c 20 22 2d 69 6e 70 75  strcmp(z, "-inpu
13f20 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
13f30 69 66 28 20 66 72 65 6f 70 65 6e 28 7a 41 72 67  if( freopen(zArg
13f40 2c 20 22 72 62 22 2c 20 73 74 64 69 6e 29 3d 3d  , "rb", stdin)==
13f50 30 20 7c 7c 20 73 74 64 69 6e 3d 3d 30 20 29 7b  0 || stdin==0 ){
13f60 0a 20 20 20 20 20 20 20 20 4d 61 6c 66 75 6e 63  .        Malfunc
13f70 74 69 6f 6e 28 35 30 31 2c 20 2f 2a 20 4c 4f 47  tion(501, /* LOG
13f80 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 2d 2d  : cannot open --
13f90 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
13fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fb0 20 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 2d    "cannot open -
13fc0 2d 69 6e 70 75 74 20 66 69 6c 65 20 5c 22 25 73  -input file \"%s
13fd0 5c 22 5c 6e 22 2c 20 7a 41 72 67 29 3b 0a 20 20  \"\n", zArg);.  
13fe0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
13ff0 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d  if( strcmp(z, "-
14000 64 61 74 65 74 65 73 74 22 29 3d 3d 30 20 29 7b  datetest")==0 ){
14010 0a 20 20 20 20 20 20 54 65 73 74 50 61 72 73 65  .      TestParse
14020 52 66 63 38 32 32 44 61 74 65 28 29 3b 0a 20 20  Rfc822Date();.  
14030 20 20 20 20 70 72 69 6e 74 66 28 22 4f 6b 5c 6e      printf("Ok\n
14040 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 30  ");.      exit(0
14050 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
14060 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28      Malfunction(
14070 35 31 30 2c 20 2f 2a 20 4c 4f 47 3a 20 75 6e 6b  510, /* LOG: unk
14080 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  nown command-lin
14090 65 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20 6c 61  e argument on la
140a0 75 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  unch */.        
140b0 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f            "unkno
140c0 77 6e 20 61 72 67 75 6d 65 6e 74 3a 20 5b 25 73  wn argument: [%s
140d0 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a  ]\n", z);.    }.
140e0 20 20 20 20 61 72 67 76 20 2b 3d 20 32 3b 0a 20      argv += 2;. 
140f0 20 20 20 61 72 67 63 20 2d 3d 20 32 3b 0a 20 20     argc -= 2;.  
14100 7d 0a 20 20 69 66 28 20 7a 52 6f 6f 74 3d 3d 30  }.  if( zRoot==0
14110 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61 6e   ){.    if( stan
14120 64 61 6c 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20  dalone ){.      
14130 7a 52 6f 6f 74 20 3d 20 22 2e 22 3b 0a 20 20 20  zRoot = ".";.   
14140 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d 61   }else{.      Ma
14150 6c 66 75 6e 63 74 69 6f 6e 28 35 32 30 2c 20 2f  lfunction(520, /
14160 2a 20 4c 4f 47 3a 20 2d 2d 72 6f 6f 74 20 61 72  * LOG: --root ar
14170 67 75 6d 65 6e 74 20 6d 69 73 73 69 6e 67 20 2a  gument missing *
14180 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
14190 20 20 20 20 22 6e 6f 20 2d 2d 72 6f 6f 74 20 73      "no --root s
141a0 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20  pecified");.    
141b0 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 43 68  }.  }.  .  /* Ch
141c0 61 6e 67 65 20 64 69 72 65 63 74 6f 72 69 65 73  ange directories
141d0 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   to the root of 
141e0 74 68 65 20 48 54 54 50 20 66 69 6c 65 73 79 73  the HTTP filesys
141f0 74 65 6d 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20  tem.  Then.  ** 
14200 63 72 65 61 74 65 20 61 20 63 68 72 6f 6f 74 20  create a chroot 
14210 6a 61 69 6c 20 74 68 65 72 65 2e 0a 20 20 2a 2f  jail there..  */
14220 0a 20 20 69 66 28 20 63 68 64 69 72 28 7a 52 6f  .  if( chdir(zRo
14230 6f 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 4d 61  ot)!=0 ){.    Ma
14240 6c 66 75 6e 63 74 69 6f 6e 28 35 33 30 2c 20 2f  lfunction(530, /
14250 2a 20 4c 4f 47 3a 20 63 68 64 69 72 28 29 20 66  * LOG: chdir() f
14260 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  ailed */.       
14270 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74           "cannot
14280 20 63 68 61 6e 67 65 20 74 6f 20 64 69 72 65 63   change to direc
14290 74 6f 72 79 20 5b 25 73 5d 22 2c 20 7a 52 6f 6f  tory [%s]", zRoo
142a0 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  t);.  }..  /* Ge
142b0 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  t information ab
142c0 6f 75 74 20 74 68 65 20 75 73 65 72 20 69 66 20  out the user if 
142d0 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69  available */.  i
142e0 66 28 20 7a 50 65 72 6d 55 73 65 72 20 29 20 70  f( zPermUser ) p
142f0 77 64 20 3d 20 67 65 74 70 77 6e 61 6d 28 7a 50  wd = getpwnam(zP
14300 65 72 6d 55 73 65 72 29 3b 0a 0a 20 20 2f 2a 20  ermUser);..  /* 
14310 45 6e 74 65 72 20 74 68 65 20 63 68 72 6f 6f 74  Enter the chroot
14320 20 6a 61 69 6c 20 69 66 20 72 65 71 75 65 73 74   jail if request
14330 65 64 20 2a 2f 20 20 0a 20 20 69 66 28 20 7a 50  ed */  .  if( zP
14340 65 72 6d 55 73 65 72 20 26 26 20 75 73 65 43 68  ermUser && useCh
14350 72 6f 6f 74 4a 61 69 6c 20 26 26 20 67 65 74 75  rootJail && getu
14360 69 64 28 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  id()==0 ){.    i
14370 66 28 20 63 68 72 6f 6f 74 28 22 2e 22 29 3c 30  f( chroot(".")<0
14380 20 29 7b 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e   ){.      Malfun
14390 63 74 69 6f 6e 28 35 34 30 2c 20 2f 2a 20 4c 4f  ction(540, /* LO
143a0 47 3a 20 63 68 72 6f 6f 74 28 29 20 66 61 69 6c  G: chroot() fail
143b0 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
143c0 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20          "unable 
143d0 74 6f 20 63 72 65 61 74 65 20 63 68 72 6f 6f 74  to create chroot
143e0 20 6a 61 69 6c 22 29 3b 0a 20 20 20 20 7d 65 6c   jail");.    }el
143f0 73 65 7b 0a 20 20 20 20 20 20 7a 52 6f 6f 74 20  se{.      zRoot 
14400 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = "";.    }.  }.
14410 0a 20 20 2f 2a 20 41 63 74 69 76 61 74 65 20 74  .  /* Activate t
14420 68 65 20 73 65 72 76 65 72 2c 20 69 66 20 72 65  he server, if re
14430 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28  quested */.  if(
14440 20 7a 50 6f 72 74 20 26 26 20 68 74 74 70 5f 73   zPort && http_s
14450 65 72 76 65 72 28 7a 50 6f 72 74 2c 20 30 29 20  erver(zPort, 0) 
14460 29 7b 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69  ){.    Malfuncti
14470 6f 6e 28 35 35 30 2c 20 2f 2a 20 4c 4f 47 3a 20  on(550, /* LOG: 
14480 73 65 72 76 65 72 20 73 74 61 72 74 75 70 20 66  server startup f
14490 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  ailed */.       
144a0 20 20 20 20 20 20 20 20 20 22 66 61 69 6c 65 64           "failed
144b0 20 74 6f 20 73 74 61 72 74 20 73 65 72 76 65 72   to start server
144c0 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 72  ");.  }..  /* Dr
144d0 6f 70 20 72 6f 6f 74 20 70 72 69 76 69 6c 65 67  op root privileg
144e0 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  es..  */.  if( z
144f0 50 65 72 6d 55 73 65 72 20 29 7b 0a 20 20 20 20  PermUser ){.    
14500 69 66 28 20 70 77 64 20 29 7b 0a 20 20 20 20 20  if( pwd ){.     
14510 20 69 66 28 20 73 65 74 67 69 64 28 70 77 64 2d   if( setgid(pwd-
14520 3e 70 77 5f 67 69 64 29 20 29 7b 0a 20 20 20 20  >pw_gid) ){.    
14530 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28      Malfunction(
14540 35 36 30 2c 20 2f 2a 20 4c 4f 47 3a 20 73 65 74  560, /* LOG: set
14550 67 69 64 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a  gid() failed */.
14560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14570 20 20 20 20 22 63 61 6e 6e 6f 74 20 73 65 74 20      "cannot set 
14580 67 72 6f 75 70 2d 69 64 20 74 6f 20 25 64 22 2c  group-id to %d",
14590 20 70 77 64 2d 3e 70 77 5f 67 69 64 29 3b 0a 20   pwd->pw_gid);. 
145a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
145b0 20 73 65 74 75 69 64 28 70 77 64 2d 3e 70 77 5f   setuid(pwd->pw_
145c0 75 69 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  uid) ){.        
145d0 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 35 37 30 2c  Malfunction(570,
145e0 20 2f 2a 20 4c 4f 47 3a 20 73 65 74 75 69 64 28   /* LOG: setuid(
145f0 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20  ) failed */.    
14600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14610 22 63 61 6e 6e 6f 74 20 73 65 74 20 75 73 65 72  "cannot set user
14620 2d 69 64 20 74 6f 20 25 64 22 2c 20 70 77 64 2d  -id to %d", pwd-
14630 3e 70 77 5f 75 69 64 29 3b 0a 20 20 20 20 20 20  >pw_uid);.      
14640 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
14650 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 35     Malfunction(5
14660 38 30 2c 20 2f 2a 20 4c 4f 47 3a 20 75 6e 6b 6e  80, /* LOG: unkn
14670 6f 77 6e 20 75 73 65 72 20 2a 2f 0a 20 20 20 20  own user */.    
14680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 6e                "n
14690 6f 20 73 75 63 68 20 75 73 65 72 20 5b 25 73 5d  o such user [%s]
146a0 22 2c 20 7a 50 65 72 6d 55 73 65 72 29 3b 0a 20  ", zPermUser);. 
146b0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 67     }.  }.  if( g
146c0 65 74 75 69 64 28 29 3d 3d 30 20 29 7b 0a 20 20  etuid()==0 ){.  
146d0 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 35 39    Malfunction(59
146e0 30 2c 20 2f 2a 20 4c 4f 47 3a 20 63 61 6e 6e 6f  0, /* LOG: canno
146f0 74 20 72 75 6e 20 61 73 20 72 6f 6f 74 20 2a 2f  t run as root */
14700 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14710 20 22 63 61 6e 6e 6f 74 20 72 75 6e 20 61 73 20   "cannot run as 
14720 72 6f 6f 74 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f  root");.  }..  /
14730 2a 20 47 65 74 20 74 68 65 20 49 50 20 61 64 64  * Get the IP add
14740 72 65 73 73 20 66 72 6f 6d 20 77 68 65 6e 63 65  ress from whence
14750 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 72 69   the request ori
14760 67 69 6e 61 74 65 73 0a 20 20 2a 2f 0a 20 20 69  ginates.  */.  i
14770 66 28 20 7a 52 65 6d 6f 74 65 41 64 64 72 3d 3d  f( zRemoteAddr==
14780 30 20 29 7b 0a 20 20 20 20 61 64 64 72 65 73 73  0 ){.    address
14790 20 72 65 6d 6f 74 65 41 64 64 72 3b 0a 20 20 20   remoteAddr;.   
147a0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 73 69   unsigned int si
147b0 7a 65 20 3d 20 73 69 7a 65 6f 66 28 72 65 6d 6f  ze = sizeof(remo
147c0 74 65 41 64 64 72 29 3b 0a 20 20 20 20 63 68 61  teAddr);.    cha
147d0 72 20 7a 48 6f 73 74 5b 4e 49 5f 4d 41 58 48 4f  r zHost[NI_MAXHO
147e0 53 54 5d 3b 0a 20 20 20 20 69 66 28 20 67 65 74  ST];.    if( get
147f0 70 65 65 72 6e 61 6d 65 28 30 2c 20 26 72 65 6d  peername(0, &rem
14800 6f 74 65 41 64 64 72 2e 73 61 2c 20 26 73 69 7a  oteAddr.sa, &siz
14810 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  e)>=0 ){.      g
14820 65 74 6e 61 6d 65 69 6e 66 6f 28 26 72 65 6d 6f  etnameinfo(&remo
14830 74 65 41 64 64 72 2e 73 61 2c 20 73 69 7a 65 2c  teAddr.sa, size,
14840 20 7a 48 6f 73 74 2c 20 73 69 7a 65 6f 66 28 7a   zHost, sizeof(z
14850 48 6f 73 74 29 2c 20 30 2c 20 30 2c 0a 20 20 20  Host), 0, 0,.   
14860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
14870 49 5f 4e 55 4d 45 52 49 43 48 4f 53 54 29 3b 0a  I_NUMERICHOST);.
14880 20 20 20 20 20 20 7a 52 65 6d 6f 74 65 41 64 64        zRemoteAdd
14890 72 20 3d 20 53 74 72 44 75 70 28 7a 48 6f 73 74  r = StrDup(zHost
148a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
148b0 66 28 20 7a 52 65 6d 6f 74 65 41 64 64 72 21 3d  f( zRemoteAddr!=
148c0 30 0a 20 20 20 26 26 20 73 74 72 6e 63 6d 70 28  0.   && strncmp(
148d0 7a 52 65 6d 6f 74 65 41 64 64 72 2c 20 22 3a 3a  zRemoteAddr, "::
148e0 66 66 66 66 3a 22 2c 20 37 29 3d 3d 30 0a 20 20  ffff:", 7)==0.  
148f0 20 26 26 20 73 74 72 63 68 72 28 7a 52 65 6d 6f   && strchr(zRemo
14900 74 65 41 64 64 72 2b 37 2c 20 27 3a 27 29 3d 3d  teAddr+7, ':')==
14910 30 0a 20 20 20 26 26 20 73 74 72 63 68 72 28 7a  0.   && strchr(z
14920 52 65 6d 6f 74 65 41 64 64 72 2b 37 2c 20 27 2e  RemoteAddr+7, '.
14930 27 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 7a  ')!=0.  ){.    z
14940 52 65 6d 6f 74 65 41 64 64 72 20 2b 3d 20 37 3b  RemoteAddr += 7;
14950 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
14960 73 73 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  ss the input str
14970 65 61 6d 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  eam */.  for(i=0
14980 3b 20 69 3c 31 30 30 3b 20 69 2b 2b 29 7b 0a 20  ; i<100; i++){. 
14990 20 20 20 50 72 6f 63 65 73 73 4f 6e 65 52 65 71     ProcessOneReq
149a0 75 65 73 74 28 30 29 3b 0a 20 20 7d 0a 20 20 50  uest(0);.  }.  P
149b0 72 6f 63 65 73 73 4f 6e 65 52 65 71 75 65 73 74  rocessOneRequest
149c0 28 31 29 3b 0a 20 20 65 78 69 74 28 30 29 3b 0a  (1);.  exit(0);.
149d0 7d 0a 0a 23 69 66 20 30 0a 2f 2a 20 43 6f 70 79  }..#if 0./* Copy
149e0 2f 70 61 73 74 65 20 74 68 65 20 66 6f 6c 6c 6f  /paste the follo
149f0 77 69 6e 67 20 74 65 78 74 20 69 6e 74 6f 20 53  wing text into S
14a00 51 4c 69 74 65 20 74 6f 20 67 65 6e 65 72 61 74  QLite to generat
14a10 65 20 74 68 65 20 78 72 65 66 0a 2a 2a 20 74 61  e the xref.** ta
14a20 62 6c 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ble that describ
14a30 65 73 20 61 6c 6c 20 65 72 72 6f 72 20 63 6f 64  es all error cod
14a40 65 73 2e 0a 2a 2f 0a 42 45 47 49 4e 3b 0a 43 52  es..*/.BEGIN;.CR
14a50 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
14a60 54 20 45 58 49 53 54 53 20 78 72 65 66 28 6c 69  T EXISTS xref(li
14a70 6e 65 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49  neno INTEGER PRI
14a80 4d 41 52 59 20 4b 45 59 2c 20 64 65 73 63 20 54  MARY KEY, desc T
14a90 45 58 54 29 3b 0a 44 45 4c 45 54 45 20 46 52 4f  EXT);.DELETE FRO
14aa0 4d 20 58 72 65 66 3b 0a 49 4e 53 45 52 54 20 49  M Xref;.INSERT I
14ab0 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28  NTO xref VALUES(
14ac0 31 30 30 2c 27 4d 61 6c 6c 6f 63 28 29 20 66 61  100,'Malloc() fa
14ad0 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54 20 49  iled');.INSERT I
14ae0 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28  NTO xref VALUES(
14af0 31 31 30 2c 27 4e 6f 74 20 61 75 74 68 6f 72 69  110,'Not authori
14b00 7a 65 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  zed');.INSERT IN
14b10 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 31  TO xref VALUES(1
14b20 32 30 2c 27 43 47 49 20 45 72 72 6f 72 27 29 3b  20,'CGI Error');
14b30 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65  .INSERT INTO xre
14b40 66 20 56 41 4c 55 45 53 28 31 33 30 2c 27 54 69  f VALUES(130,'Ti
14b50 6d 65 6f 75 74 27 29 3b 0a 49 4e 53 45 52 54 20  meout');.INSERT 
14b60 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53  INTO xref VALUES
14b70 28 31 34 30 2c 27 43 47 49 20 73 63 72 69 70 74  (140,'CGI script
14b80 20 69 73 20 77 72 69 74 61 62 6c 65 27 29 3b 0a   is writable');.
14b90 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66  INSERT INTO xref
14ba0 20 56 41 4c 55 45 53 28 31 35 30 2c 27 43 61 6e   VALUES(150,'Can
14bb0 6e 6f 74 20 6f 70 65 6e 20 2d 61 75 74 68 20 66  not open -auth f
14bc0 69 6c 65 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  ile');.INSERT IN
14bd0 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 31  TO xref VALUES(1
14be0 36 30 2c 27 68 74 74 70 20 72 65 71 75 65 73 74  60,'http request
14bf0 20 6f 6e 20 68 74 74 70 73 2d 6f 6e 6c 79 20 70   on https-only p
14c00 61 67 65 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  age');.INSERT IN
14c10 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 31  TO xref VALUES(1
14c20 37 30 2c 27 2d 61 75 74 68 20 72 65 64 69 72 65  70,'-auth redire
14c30 63 74 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54  ct');.INSERT INT
14c40 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 31 38  O xref VALUES(18
14c50 30 2c 27 6d 61 6c 66 6f 72 6d 65 64 20 65 6e 74  0,'malformed ent
14c60 72 79 20 69 6e 20 2d 61 75 74 68 20 66 69 6c 65  ry in -auth file
14c70 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
14c80 78 72 65 66 20 56 41 4c 55 45 53 28 31 39 30 2c  xref VALUES(190,
14c90 27 63 68 64 69 72 28 29 20 66 61 69 6c 65 64 27  'chdir() failed'
14ca0 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  );.INSERT INTO x
14cb0 72 65 66 20 56 41 4c 55 45 53 28 32 30 30 2c 27  ref VALUES(200,'
14cc0 62 61 64 20 70 72 6f 74 6f 63 6f 6c 20 69 6e 20  bad protocol in 
14cd0 48 54 54 50 20 68 65 61 64 65 72 27 29 3b 0a 49  HTTP header');.I
14ce0 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
14cf0 56 41 4c 55 45 53 28 32 31 30 2c 27 45 6d 70 74  VALUES(210,'Empt
14d00 79 20 72 65 71 75 65 73 74 20 55 52 49 27 29 3b  y request URI');
14d10 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65  .INSERT INTO xre
14d20 66 20 56 41 4c 55 45 53 28 32 32 30 2c 27 55 6e  f VALUES(220,'Un
14d30 6b 6e 6f 77 6e 20 72 65 71 75 65 73 74 20 6d 65  known request me
14d40 74 68 6f 64 27 29 3b 0a 49 4e 53 45 52 54 20 49  thod');.INSERT I
14d50 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28  NTO xref VALUES(
14d60 32 33 30 2c 27 52 65 66 65 72 72 65 72 20 69 73  230,'Referrer is
14d70 20 64 65 76 69 64 73 2e 6e 65 74 27 29 3b 0a 49   devids.net');.I
14d80 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
14d90 56 41 4c 55 45 53 28 32 34 30 2c 27 49 6c 6c 65  VALUES(240,'Ille
14da0 67 61 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 48  gal content in H
14db0 4f 53 54 3a 20 70 61 72 61 6d 65 74 65 72 27 29  OST: parameter')
14dc0 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72  ;.INSERT INTO xr
14dd0 65 66 20 56 41 4c 55 45 53 28 32 35 30 2c 27 44  ef VALUES(250,'D
14de0 69 73 61 6c 6c 6f 77 65 64 20 75 73 65 72 20 61  isallowed user a
14df0 67 65 6e 74 27 29 3b 0a 49 4e 53 45 52 54 20 49  gent');.INSERT I
14e00 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28  NTO xref VALUES(
14e10 32 36 30 2c 27 44 69 73 61 6c 6c 6f 77 65 64 20  260,'Disallowed 
14e20 72 65 66 65 72 72 65 72 27 29 3b 0a 49 4e 53 45  referrer');.INSE
14e30 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
14e40 55 45 53 28 32 37 30 2c 27 52 65 71 75 65 73 74  UES(270,'Request
14e50 20 74 6f 6f 20 6c 61 72 67 65 27 29 3b 0a 49 4e   too large');.IN
14e60 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56  SERT INTO xref V
14e70 41 4c 55 45 53 28 32 38 30 2c 27 6d 6b 73 74 65  ALUES(280,'mkste
14e80 6d 70 28 29 20 66 61 69 6c 65 64 27 29 3b 0a 49  mp() failed');.I
14e90 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
14ea0 56 41 4c 55 45 53 28 32 39 30 2c 27 63 61 6e 6e  VALUES(290,'cann
14eb0 6f 74 20 63 72 65 61 74 65 20 74 65 6d 70 20 66  ot create temp f
14ec0 69 6c 65 20 66 6f 72 20 50 4f 53 54 20 63 6f 6e  ile for POST con
14ed0 74 65 6e 74 27 29 3b 0a 49 4e 53 45 52 54 20 49  tent');.INSERT I
14ee0 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28  NTO xref VALUES(
14ef0 33 30 30 2c 27 50 61 74 68 20 65 6c 65 6d 65 6e  300,'Path elemen
14f00 74 20 62 65 67 69 6e 73 20 77 69 74 68 20 2e 20  t begins with . 
14f10 6f 72 20 2d 27 29 3b 0a 49 4e 53 45 52 54 20 49  or -');.INSERT I
14f20 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28  NTO xref VALUES(
14f30 33 31 30 2c 27 55 52 49 20 64 6f 65 73 20 6e 6f  310,'URI does no
14f40 74 20 73 74 61 72 74 20 77 69 74 68 20 2f 27 29  t start with /')
14f50 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72  ;.INSERT INTO xr
14f60 65 66 20 56 41 4c 55 45 53 28 33 32 30 2c 27 55  ef VALUES(320,'U
14f70 52 49 20 74 6f 6f 20 6c 6f 6e 67 27 29 3b 0a 49  RI too long');.I
14f80 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
14f90 56 41 4c 55 45 53 28 33 33 30 2c 27 4d 69 73 73  VALUES(330,'Miss
14fa0 69 6e 67 20 48 4f 53 54 3a 20 70 61 72 61 6d 65  ing HOST: parame
14fb0 74 65 72 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  ter');.INSERT IN
14fc0 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 33  TO xref VALUES(3
14fd0 34 30 2c 27 48 4f 53 54 20 70 61 72 61 6d 65 74  40,'HOST paramet
14fe0 65 72 20 74 6f 6f 20 6c 6f 6e 67 27 29 3b 0a 49  er too long');.I
14ff0 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
15000 56 41 4c 55 45 53 28 33 35 30 2c 27 2a 2e 77 65  VALUES(350,'*.we
15010 62 73 69 74 65 20 70 65 72 6d 69 73 73 69 6f 6e  bsite permission
15020 73 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f  s');.INSERT INTO
15030 20 78 72 65 66 20 56 41 4c 55 45 53 28 33 36 30   xref VALUES(360
15040 2c 27 63 68 64 69 72 28 29 20 66 61 69 6c 65 64  ,'chdir() failed
15050 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
15060 78 72 65 66 20 56 41 4c 55 45 53 28 33 37 30 2c  xref VALUES(370,
15070 27 72 65 64 69 72 65 63 74 20 74 6f 20 6e 6f 74  'redirect to not
15080 2d 66 6f 75 6e 64 20 70 61 67 65 27 29 3b 0a 49  -found page');.I
15090 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
150a0 56 41 4c 55 45 53 28 33 38 30 2c 27 55 52 49 20  VALUES(380,'URI 
150b0 6e 6f 74 20 66 6f 75 6e 64 27 29 3b 0a 49 4e 53  not found');.INS
150c0 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41  ERT INTO xref VA
150d0 4c 55 45 53 28 33 39 30 2c 27 46 69 6c 65 20 6e  LUES(390,'File n
150e0 6f 74 20 72 65 61 64 61 62 6c 65 27 29 3b 0a 49  ot readable');.I
150f0 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
15100 56 41 4c 55 45 53 28 34 30 30 2c 27 55 52 49 20  VALUES(400,'URI 
15110 69 73 20 61 20 64 69 72 65 63 74 6f 72 79 20 77  is a directory w
15120 2f 6f 20 69 6e 64 65 78 2e 68 74 6d 6c 27 29 3b  /o index.html');
15130 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65  .INSERT INTO xre
15140 66 20 56 41 4c 55 45 53 28 34 31 30 2c 27 72 65  f VALUES(410,'re
15150 64 69 72 65 63 74 20 74 6f 20 61 64 64 20 74 72  direct to add tr
15160 61 69 6c 69 6e 67 20 2f 27 29 3b 0a 49 4e 53 45  ailing /');.INSE
15170 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
15180 55 45 53 28 34 32 30 2c 27 63 68 64 69 72 28 29  UES(420,'chdir()
15190 20 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52   failed');.INSER
151a0 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
151b0 45 53 28 34 33 30 2c 27 64 75 70 28 30 29 20 66  ES(430,'dup(0) f
151c0 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54 20  ailed');.INSERT 
151d0 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53  INTO xref VALUES
151e0 28 34 34 30 2c 27 70 69 70 65 28 29 20 66 61 69  (440,'pipe() fai
151f0 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  led');.INSERT IN
15200 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 34  TO xref VALUES(4
15210 35 30 2c 27 64 75 70 28 31 29 20 66 61 69 6c 65  50,'dup(1) faile
15220 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f  d');.INSERT INTO
15230 20 78 72 65 66 20 56 41 4c 55 45 53 28 34 36 30   xref VALUES(460
15240 2c 27 45 78 63 65 73 73 20 55 52 49 20 63 6f 6e  ,'Excess URI con
15250 74 65 6e 74 20 70 61 73 74 20 73 74 61 74 69 63  tent past static
15260 20 66 69 6c 65 20 6e 61 6d 65 27 29 3b 0a 49 4e   file name');.IN
15270 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56  SERT INTO xref V
15280 41 4c 55 45 53 28 34 37 30 2c 27 45 54 61 67 20  ALUES(470,'ETag 
15290 43 61 63 68 65 20 48 69 74 27 29 3b 0a 49 4e 53  Cache Hit');.INS
152a0 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41  ERT INTO xref VA
152b0 4c 55 45 53 28 34 38 30 2c 27 66 6f 70 65 6e 28  LUES(480,'fopen(
152c0 29 20 66 61 69 6c 65 64 20 66 6f 72 20 73 74 61  ) failed for sta
152d0 74 69 63 20 63 6f 6e 74 65 6e 74 27 29 3b 0a 49  tic content');.I
152e0 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
152f0 56 41 4c 55 45 53 28 32 2c 27 4e 6f 72 6d 61 6c  VALUES(2,'Normal
15300 20 48 45 41 44 20 72 65 70 6c 79 27 29 3b 0a 49   HEAD reply');.I
15310 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
15320 56 41 4c 55 45 53 28 30 2c 27 4e 6f 72 6d 61 6c  VALUES(0,'Normal
15330 20 72 65 70 6c 79 27 29 3b 0a 49 4e 53 45 52 54   reply');.INSERT
15340 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45   INTO xref VALUE
15350 53 28 35 30 30 2c 27 75 6e 6b 6e 6f 77 6e 20 49  S(500,'unknown I
15360 50 20 70 72 6f 74 6f 63 6f 6c 27 29 3b 0a 49 4e  P protocol');.IN
15370 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56  SERT INTO xref V
15380 41 4c 55 45 53 28 35 30 31 2c 27 63 61 6e 6e 6f  ALUES(501,'canno
15390 74 20 6f 70 65 6e 20 2d 2d 69 6e 70 75 74 20 66  t open --input f
153a0 69 6c 65 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  ile');.INSERT IN
153b0 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 35  TO xref VALUES(5
153c0 31 30 2c 27 75 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d  10,'unknown comm
153d0 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e  and-line argumen
153e0 74 20 6f 6e 20 6c 61 75 6e 63 68 27 29 3b 0a 49  t on launch');.I
153f0 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
15400 56 41 4c 55 45 53 28 35 32 30 2c 27 2d 2d 72 6f  VALUES(520,'--ro
15410 6f 74 20 61 72 67 75 6d 65 6e 74 20 6d 69 73 73  ot argument miss
15420 69 6e 67 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  ing');.INSERT IN
15430 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 35  TO xref VALUES(5
15440 33 30 2c 27 63 68 64 69 72 28 29 20 66 61 69 6c  30,'chdir() fail
15450 65 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54  ed');.INSERT INT
15460 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 35 34  O xref VALUES(54
15470 30 2c 27 63 68 72 6f 6f 74 28 29 20 66 61 69 6c  0,'chroot() fail
15480 65 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54  ed');.INSERT INT
15490 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 35 35  O xref VALUES(55
154a0 30 2c 27 73 65 72 76 65 72 20 73 74 61 72 74 75  0,'server startu
154b0 70 20 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45  p failed');.INSE
154c0 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
154d0 55 45 53 28 35 36 30 2c 27 73 65 74 67 69 64 28  UES(560,'setgid(
154e0 29 20 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45  ) failed');.INSE
154f0 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
15500 55 45 53 28 35 37 30 2c 27 73 65 74 75 69 64 28  UES(570,'setuid(
15510 29 20 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45  ) failed');.INSE
15520 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
15530 55 45 53 28 35 38 30 2c 27 75 6e 6b 6e 6f 77 6e  UES(580,'unknown
15540 20 75 73 65 72 27 29 3b 0a 49 4e 53 45 52 54 20   user');.INSERT 
15550 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53  INTO xref VALUES
15560 28 35 39 30 2c 27 63 61 6e 6e 6f 74 20 72 75 6e  (590,'cannot run
15570 20 61 73 20 72 6f 6f 74 27 29 3b 0a 49 4e 53 45   as root');.INSE
15580 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
15590 55 45 53 28 36 30 30 2c 27 6d 61 6c 6c 6f 63 28  UES(600,'malloc(
155a0 29 20 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45  ) failed');.INSE
155b0 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
155c0 55 45 53 28 36 31 30 2c 27 6d 61 6c 6c 6f 63 28  UES(610,'malloc(
155d0 29 20 66 61 69 6c 65 64 27 29 3b 0a 43 4f 4d 4d  ) failed');.COMM
155e0 49 54 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  IT;.#endif /* SQ
155f0 4c 20 2a 2f 0a                                   L */.