Documentation Source Text

Hex Artifact Content
Login

Artifact a2af00f59fa48c9d76ef1314e0e6edab45be27a16af73ec1f67e4755035c7989:


0000: 2f 2a 0a 2a 2a 20 41 20 73 6d 61 6c 6c 2c 20 73  /*.** A small, s
0010: 69 6d 70 6c 65 20 48 54 54 50 20 73 65 72 76 65  imple HTTP serve
0020: 72 2e 0a 2a 2a 0a 2a 2a 20 46 65 61 74 75 72 65  r..**.** Feature
0030: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 4c  s:.**.**     * L
0040: 61 75 6e 63 68 65 64 20 66 72 6f 6d 20 69 6e 65  aunched from ine
0050: 74 64 2f 78 69 6e 65 74 64 2f 73 74 75 6e 6e 65  td/xinetd/stunne
0060: 6c 34 2c 20 6f 72 20 61 73 20 61 20 73 74 61 6e  l4, or as a stan
0070: 64 2d 61 6c 6f 6e 65 20 73 65 72 76 65 72 0a 2a  d-alone server.*
0080: 2a 20 20 20 20 20 2a 20 4f 6e 65 20 70 72 6f 63  *     * One proc
0090: 65 73 73 20 70 65 72 20 72 65 71 75 65 73 74 0a  ess per request.
00a0: 2a 2a 20 20 20 20 20 2a 20 44 65 6c 69 76 65 72  **     * Deliver
00b0: 20 73 74 61 74 69 63 20 63 6f 6e 74 65 6e 74 20   static content 
00c0: 6f 72 20 72 75 6e 20 43 47 49 20 6f 72 20 53 43  or run CGI or SC
00d0: 47 49 0a 2a 2a 20 20 20 20 20 2a 20 56 69 72 74  GI.**     * Virt
00e0: 75 61 6c 20 73 69 74 65 73 20 62 61 73 65 64 20  ual sites based 
00f0: 6f 6e 20 74 68 65 20 22 48 6f 73 74 3a 22 20 70  on the "Host:" p
0100: 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 48  roperty of the H
0110: 54 54 50 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  TTP header.**   
0120: 20 20 2a 20 52 75 6e 73 20 69 6e 20 61 20 63 68    * Runs in a ch
0130: 72 6f 6f 74 20 6a 61 69 6c 0a 2a 2a 20 20 20 20  root jail.**    
0140: 20 2a 20 55 6e 69 66 69 65 64 20 6c 6f 67 20 66   * Unified log f
0150: 69 6c 65 20 69 6e 20 61 20 43 53 56 20 66 6f 72  ile in a CSV for
0160: 6d 61 74 0a 2a 2a 20 20 20 20 20 2a 20 53 6d 61  mat.**     * Sma
0170: 6c 6c 20 63 6f 64 65 20 62 61 73 65 20 28 74 68  ll code base (th
0180: 69 73 20 31 20 66 69 6c 65 29 20 74 6f 20 66 61  is 1 file) to fa
0190: 63 69 6c 69 74 61 74 65 20 73 65 63 75 72 69 74  cilitate securit
01a0: 79 20 61 75 64 69 74 69 6e 67 0a 2a 2a 20 20 20  y auditing.**   
01b0: 20 20 2a 20 53 69 6d 70 6c 65 20 73 65 74 75 70    * Simple setup
01c0: 20 2d 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61 74   - no configurat
01d0: 69 6f 6e 20 66 69 6c 65 73 20 74 6f 20 6d 69 73  ion files to mis
01e0: 63 6f 6e 66 69 67 75 72 65 0a 2a 2a 20 0a 2a 2a  configure.** .**
01f0: 20 54 68 69 73 20 66 69 6c 65 20 69 6d 70 6c 65   This file imple
0200: 6d 65 6e 74 73 20 61 20 73 6d 61 6c 6c 20 61 6e  ments a small an
0210: 64 20 73 69 6d 70 6c 65 20 62 75 74 20 73 65 63  d simple but sec
0220: 75 72 65 20 61 6e 64 20 65 66 66 65 63 74 69 76  ure and effectiv
0230: 65 20 77 65 62 0a 2a 2a 20 73 65 72 76 65 72 2e  e web.** server.
0240: 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 66    There are no f
0250: 72 69 6c 6c 73 2e 20 20 41 6e 79 74 68 69 6e 67  rills.  Anything
0260: 20 74 68 61 74 20 63 6f 75 6c 64 20 62 65 20 72   that could be r
0270: 65 61 73 6f 6e 61 62 6c 79 0a 2a 2a 20 6f 6d 69  easonably.** omi
0280: 74 74 65 64 20 68 61 73 20 62 65 65 6e 2e 0a 2a  tted has been..*
0290: 2a 0a 2a 2a 20 53 65 74 75 70 20 72 75 6c 65 73  *.** Setup rules
02a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 4c  :.**.**    (1) L
02b0: 61 75 6e 63 68 20 61 73 20 72 6f 6f 74 20 66 72  aunch as root fr
02c0: 6f 6d 20 69 6e 65 74 64 20 6c 69 6b 65 20 74 68  om inetd like th
02d0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
02e0: 20 20 20 20 20 68 74 74 70 64 20 2d 6c 6f 67 66       httpd -logf
02f0: 69 6c 65 20 6c 6f 67 66 69 6c 65 20 2d 72 6f 6f  ile logfile -roo
0300: 74 20 2f 68 6f 6d 65 2f 77 77 77 20 2d 75 73 65  t /home/www -use
0310: 72 20 6e 6f 62 6f 64 79 0a 2a 2a 0a 2a 2a 20 20  r nobody.**.**  
0320: 20 20 20 20 20 20 49 74 20 77 69 6c 6c 20 61 75        It will au
0330: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 72 6f  tomatically chro
0340: 6f 74 20 74 6f 20 2f 68 6f 6d 65 2f 77 77 77 20  ot to /home/www 
0350: 61 6e 64 20 62 65 63 6f 6d 65 20 75 73 65 72 20  and become user 
0360: 22 6e 6f 62 6f 64 79 22 2e 0a 2a 2a 20 20 20 20  "nobody"..**    
0370: 20 20 20 20 54 68 65 20 6c 6f 67 66 69 6c 65 20      The logfile 
0380: 6e 61 6d 65 20 73 68 6f 75 6c 64 20 62 65 20 72  name should be r
0390: 65 6c 61 74 69 76 65 20 74 6f 20 74 68 65 20 63  elative to the c
03a0: 68 72 6f 6f 74 20 6a 61 69 6c 2e 0a 2a 2a 0a 2a  hroot jail..**.*
03b0: 2a 20 20 20 20 28 32 29 20 44 69 72 65 63 74 6f  *    (2) Directo
03c0: 72 69 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ries of the form
03d0: 20 22 2a 2e 77 65 62 73 69 74 65 22 20 28 65 78   "*.website" (ex
03e0: 3a 20 77 77 77 5f 73 71 6c 69 74 65 5f 6f 72 67  : www_sqlite_org
03f0: 2e 77 65 62 73 69 74 65 29 0a 2a 2a 20 20 20 20  .website).**    
0400: 20 20 20 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74      contain cont
0410: 65 6e 74 2e 20 20 54 68 65 20 64 69 72 65 63 74  ent.  The direct
0420: 6f 72 79 20 69 73 20 63 68 6f 73 65 6e 20 62 61  ory is chosen ba
0430: 73 65 64 20 6f 6e 20 74 68 65 20 48 54 54 50 5f  sed on the HTTP_
0440: 48 4f 53 54 0a 2a 2a 20 20 20 20 20 20 20 20 72  HOST.**        r
0450: 65 71 75 65 73 74 20 68 65 61 64 65 72 2e 20 20  equest header.  
0460: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 48  If there is no H
0470: 54 54 50 5f 48 4f 53 54 20 68 65 61 64 65 72 20  TTP_HOST header 
0480: 6f 72 20 69 66 20 74 68 65 0a 2a 2a 20 20 20 20  or if the.**    
0490: 20 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e      correspondin
04a0: 67 20 68 6f 73 74 20 64 69 72 65 63 74 6f 72 79  g host directory
04b0: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
04c0: 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 20   then the.**    
04d0: 20 20 20 20 22 64 65 66 61 75 6c 74 2e 77 65 62      "default.web
04e0: 73 69 74 65 22 20 69 73 20 75 73 65 64 2e 20 20  site" is used.  
04f0: 49 66 20 74 68 65 20 48 54 54 50 5f 48 4f 53 54  If the HTTP_HOST
0500: 20 68 65 61 64 65 72 20 63 6f 6e 74 61 69 6e 73   header contains
0510: 20 61 6e 79 0a 2a 2a 20 20 20 20 20 20 20 20 63   any.**        c
0520: 68 61 72 61 74 65 72 73 20 6f 74 68 65 72 20 74  haraters other t
0530: 68 61 6e 20 5b 61 2d 7a 41 2d 5a 30 2d 39 5f 2e  han [a-zA-Z0-9_.
0540: 2c 2a 7e 2f 5d 20 74 68 65 6e 20 61 20 34 30 33  ,*~/] then a 403
0550: 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 20 20 20   error is.**    
0560: 20 20 20 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a      generated..*
0570: 2a 0a 2a 2a 20 20 20 20 28 33 29 20 41 6e 79 20  *.**    (3) Any 
0580: 66 69 6c 65 20 6f 72 20 64 69 72 65 63 74 6f 72  file or director
0590: 79 20 77 68 6f 73 65 20 6e 61 6d 65 20 62 65 67  y whose name beg
05a0: 69 6e 73 20 77 69 74 68 20 22 2e 22 20 6f 72 20  ins with "." or 
05b0: 22 2d 22 20 69 73 20 69 67 6e 6f 72 65 64 2c 0a  "-" is ignored,.
05c0: 2a 2a 20 20 20 20 20 20 20 20 65 78 63 65 70 74  **        except
05d0: 20 66 6f 72 20 2f 2e 77 65 6c 6c 2d 6b 6e 6f 77   for /.well-know
05e0: 6e 2f 20 61 74 20 74 68 65 20 74 6f 70 2d 6c 65  n/ at the top-le
05f0: 76 65 6c 2e 20 20 54 68 65 20 65 78 63 65 70 74  vel.  The except
0600: 69 6f 6e 20 69 73 20 66 6f 72 0a 2a 2a 20 20 20  ion is for.**   
0610: 20 20 20 20 20 52 46 43 2d 35 37 38 35 20 74 6f       RFC-5785 to
0620: 20 61 6c 6c 6f 77 20 6c 65 74 73 65 6e 63 72 79   allow letsencry
0630: 70 74 20 6f 72 20 63 65 72 74 62 6f 74 20 74 6f  pt or certbot to
0640: 20 67 65 6e 65 72 61 74 65 20 61 20 54 53 4c 20   generate a TSL 
0650: 63 65 72 74 0a 2a 2a 20 20 20 20 20 20 20 20 75  cert.**        u
0660: 73 69 6e 67 20 77 65 62 72 6f 6f 74 2e 0a 2a 2a  sing webroot..**
0670: 0a 2a 2a 20 20 20 20 28 34 29 20 43 68 61 72 61  .**    (4) Chara
0680: 63 74 65 72 73 20 6f 74 68 65 72 20 74 68 61 6e  cters other than
0690: 20 5b 30 2d 39 61 2d 7a 41 2d 5a 2c 2d 2e 2f 3a   [0-9a-zA-Z,-./:
06a0: 5f 7e 5d 20 61 6e 64 20 61 6e 79 20 25 48 48 20  _~] and any %HH 
06b0: 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 20 20  characters.**   
06c0: 20 20 20 20 20 65 73 63 61 70 65 73 20 69 6e 20       escapes in 
06d0: 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 72 65  the filename are
06e0: 20 61 6c 6c 20 74 72 61 6e 73 6c 61 74 65 64 20   all translated 
06f0: 69 6e 74 6f 20 22 5f 22 2e 20 20 54 68 69 73 20  into "_".  This 
0700: 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 64  is.**        a d
0710: 65 66 65 6e 73 65 20 61 67 61 69 6e 73 74 20 63  efense against c
0720: 72 6f 73 73 2d 73 69 74 65 20 73 63 72 69 70 74  ross-site script
0730: 69 6e 67 20 61 74 74 61 63 6b 73 20 61 6e 64 20  ing attacks and 
0740: 6f 74 68 65 72 20 6d 69 73 63 68 69 65 66 2e 0a  other mischief..
0750: 2a 2a 0a 2a 2a 20 20 20 20 28 35 29 20 45 78 65  **.**    (5) Exe
0760: 63 75 74 61 62 6c 65 20 66 69 6c 65 73 20 61 72  cutable files ar
0770: 65 20 72 75 6e 20 61 73 20 43 47 49 2e 20 20 46  e run as CGI.  F
0780: 69 6c 65 73 20 77 68 6f 73 65 20 6e 61 6d 65 20  iles whose name 
0790: 65 6e 64 73 20 77 69 74 68 20 22 2e 73 63 67 69  ends with ".scgi
07a0: 22 0a 2a 2a 20 20 20 20 20 20 20 20 74 72 69 67  ".**        trig
07b0: 67 65 72 20 61 6e 64 20 53 43 47 49 20 72 65 71  ger and SCGI req
07c0: 75 65 73 74 20 28 73 65 65 20 69 74 65 6d 20 31  uest (see item 1
07d0: 30 20 62 65 6c 6f 77 29 2e 20 20 41 6c 6c 20 6f  0 below).  All o
07e0: 74 68 65 72 20 66 69 6c 65 73 0a 2a 2a 20 20 20  ther files.**   
07f0: 20 20 20 20 20 61 72 65 20 64 65 6c 69 76 65 72       are deliver
0800: 65 64 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  ed as is..**.** 
0810: 20 20 20 28 36 29 20 46 6f 72 20 53 53 4c 20 73     (6) For SSL s
0820: 75 70 70 6f 72 74 20 75 73 65 20 73 74 75 6e 6e  upport use stunn
0830: 65 6c 20 61 6e 64 20 61 64 64 20 74 68 65 20 2d  el and add the -
0840: 68 74 74 70 73 20 31 20 6f 70 74 69 6f 6e 20 6f  https 1 option o
0850: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
0860: 68 74 74 70 64 20 63 6f 6d 6d 61 6e 64 2d 6c 69  httpd command-li
0870: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 37 29  ne..**.**    (7)
0880: 20 49 66 20 61 20 66 69 6c 65 20 6e 61 6d 65 64   If a file named
0890: 20 22 2d 61 75 74 68 22 20 65 78 69 73 74 73 20   "-auth" exists 
08a0: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65  in the same dire
08b0: 63 74 6f 72 79 20 61 73 20 74 68 65 20 66 69 6c  ctory as the fil
08c0: 65 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 62  e to.**        b
08d0: 65 20 72 75 6e 20 61 73 20 43 47 49 20 6f 72 20  e run as CGI or 
08e0: 74 6f 20 62 65 20 64 65 6c 69 76 65 72 65 64 2c  to be delivered,
08f0: 20 74 68 65 6e 20 69 74 20 63 6f 6e 74 61 69 6e   then it contain
0900: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  s information.**
0910: 20 20 20 20 20 20 20 20 66 6f 72 20 48 54 54 50          for HTTP
0920: 20 42 61 73 69 63 20 61 75 74 68 6f 72 69 7a 61   Basic authoriza
0930: 74 69 6f 6e 2e 20 20 53 65 65 20 66 69 6c 65 20  tion.  See file 
0940: 66 6f 72 6d 61 74 20 64 65 74 61 69 6c 73 20 62  format details b
0950: 65 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  elow..**.**    (
0960: 38 29 20 54 6f 20 72 75 6e 20 61 73 20 61 20 73  8) To run as a s
0970: 74 61 6e 64 2d 61 6c 6f 6e 65 20 73 65 72 76 65  tand-alone serve
0980: 72 2c 20 73 69 6d 70 6c 79 20 61 64 64 20 74 68  r, simply add th
0990: 65 20 22 2d 70 6f 72 74 20 4e 22 20 63 6f 6d 6d  e "-port N" comm
09a0: 61 6e 64 2d 6c 69 6e 65 0a 2a 2a 20 20 20 20 20  and-line.**     
09b0: 20 20 20 6f 70 74 69 6f 6e 20 74 6f 20 64 65 66     option to def
09c0: 69 6e 65 20 77 68 69 63 68 20 54 43 50 20 70 6f  ine which TCP po
09d0: 72 74 20 74 6f 20 6c 69 73 74 65 6e 20 6f 6e 2e  rt to listen on.
09e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 39 29 20 46 6f  .**.**    (9) Fo
09f0: 72 20 73 74 61 74 69 63 20 63 6f 6e 74 65 6e 74  r static content
0a00: 2c 20 74 68 65 20 6d 69 6d 65 74 79 70 65 20 69  , the mimetype i
0a10: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
0a20: 74 68 65 20 66 69 6c 65 20 73 75 66 66 69 78 0a  the file suffix.
0a30: 2a 2a 20 20 20 20 20 20 20 20 75 73 69 6e 67 20  **        using 
0a40: 61 20 74 61 62 6c 65 20 62 75 69 6c 74 20 69 6e  a table built in
0a50: 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f  to the source co
0a60: 64 65 20 62 65 6c 6f 77 2e 20 20 49 66 20 79 6f  de below.  If yo
0a70: 75 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 20 20  u have.**       
0a80: 20 75 6e 75 73 75 61 6c 20 63 6f 6e 74 65 6e 74   unusual content
0a90: 20 66 69 6c 65 73 2c 20 79 6f 75 20 6d 69 67 68   files, you migh
0aa0: 74 20 6e 65 65 64 20 74 6f 20 65 78 74 65 6e 64  t need to extend
0ab0: 20 74 68 69 73 20 74 61 62 6c 65 2e 0a 2a 2a 0a   this table..**.
0ac0: 2a 2a 20 20 20 28 31 30 29 20 43 6f 6e 74 65 6e  **   (10) Conten
0ad0: 74 20 66 69 6c 65 73 20 74 68 61 74 20 65 6e 64  t files that end
0ae0: 20 77 69 74 68 20 22 2e 73 63 67 69 22 20 61 6e   with ".scgi" an
0af0: 64 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 74  d that contain t
0b00: 65 78 74 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20  ext of the.**   
0b10: 20 20 20 20 20 66 6f 72 6d 20 22 53 43 47 49 20       form "SCGI 
0b20: 68 6f 73 74 6e 61 6d 65 20 70 6f 72 74 22 20 77  hostname port" w
0b30: 69 6c 6c 20 66 6f 72 6d 61 74 20 61 6e 20 53 43  ill format an SC
0b40: 47 49 20 72 65 71 75 65 73 74 20 61 6e 64 20 73  GI request and s
0b50: 65 6e 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 20  end it.**       
0b60: 20 74 6f 20 68 6f 73 74 6e 61 6d 65 3a 70 6f 72   to hostname:por
0b70: 74 2c 20 74 68 65 20 72 65 6c 61 79 20 62 61 63  t, the relay bac
0b80: 6b 20 74 68 65 20 72 65 70 6c 79 2e 20 20 45 72  k the reply.  Er
0b90: 72 6f 72 20 62 65 68 61 76 69 6f 72 20 69 73 0a  ror behavior is.
0ba0: 2a 2a 20 20 20 20 20 20 20 20 64 65 74 65 72 6d  **        determ
0bb0: 69 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65  ined by subseque
0bc0: 6e 74 20 6c 69 6e 65 73 20 6f 66 20 74 68 65 20  nt lines of the 
0bd0: 2e 73 63 67 69 20 66 69 6c 65 2e 20 20 53 65 65  .scgi file.  See
0be0: 20 53 43 47 49 20 62 65 6c 6f 77 0a 2a 2a 20 20   SCGI below.**  
0bf0: 20 20 20 20 20 20 66 6f 72 20 64 65 74 61 69 6c        for detail
0c00: 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 6d 61 6e 64  s..**.** Command
0c10: 2d 6c 69 6e 65 20 4f 70 74 69 6f 6e 73 3a 0a 2a  -line Options:.*
0c20: 2a 0a 2a 2a 20 20 2d 2d 72 6f 6f 74 20 44 49 52  *.**  --root DIR
0c30: 20 20 20 20 20 20 20 44 65 66 69 6e 65 73 20 74         Defines t
0c40: 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61  he directory tha
0c50: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  t contains the v
0c60: 61 72 69 6f 75 73 0a 2a 2a 20 20 20 20 20 20 20  arious.**       
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 24 48 4f 53              $HOS
0c80: 54 2e 77 65 62 73 69 74 65 20 73 75 62 64 69 72  T.website subdir
0c90: 65 63 74 6f 72 69 65 73 2c 20 65 61 63 68 20 63  ectories, each c
0ca0: 6f 6e 74 61 69 6e 69 6e 67 20 77 65 62 20 63 6f  ontaining web co
0cb0: 6e 74 65 6e 74 20 0a 2a 2a 20 20 20 20 20 20 20  ntent .**       
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
0cd0: 61 20 73 69 6e 67 6c 65 20 76 69 72 74 75 61 6c  a single virtual
0ce0: 20 68 6f 73 74 2e 20 20 49 66 20 6c 61 75 6e 63   host.  If launc
0cf0: 68 65 64 20 61 73 20 72 6f 6f 74 20 61 6e 64 20  hed as root and 
0d00: 69 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  if.**           
0d10: 20 20 20 20 20 20 20 20 22 2d 2d 75 73 65 72 20          "--user 
0d20: 55 53 45 52 22 20 61 6c 73 6f 20 61 70 70 65 61  USER" also appea
0d30: 72 73 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e  rs on the comman
0d40: 64 2d 6c 69 6e 65 20 61 6e 64 20 69 66 0a 2a 2a  d-line and if.**
0d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d60: 20 20 20 22 2d 2d 6a 61 69 6c 20 30 22 20 69 73     "--jail 0" is
0d70: 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74   omitted, then t
0d80: 68 65 20 70 72 6f 63 65 73 73 20 72 75 6e 73 20  he process runs 
0d90: 69 6e 20 61 20 63 68 72 6f 6f 74 0a 2a 2a 20 20  in a chroot.**  
0da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0db0: 20 6a 61 69 6c 20 72 6f 6f 74 65 64 20 61 74 20   jail rooted at 
0dc0: 74 68 69 73 20 64 69 72 65 63 74 6f 72 79 20 61  this directory a
0dd0: 6e 64 20 75 6e 64 65 72 20 74 68 65 20 75 73 65  nd under the use
0de0: 72 69 64 20 55 53 45 52 2e 0a 2a 2a 20 20 20 20  rid USER..**    
0df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
0e00: 68 69 73 20 6f 70 74 69 6f 6e 20 69 73 20 72 65  his option is re
0e10: 71 75 69 72 65 64 20 66 6f 72 20 78 69 6e 65 74  quired for xinet
0e20: 64 20 6c 61 75 6e 63 68 20 62 75 74 20 64 65 66  d launch but def
0e30: 61 75 6c 74 73 0a 2a 2a 20 20 20 20 20 20 20 20  aults.**        
0e40: 20 20 20 20 20 20 20 20 20 20 20 74 6f 20 22 2e             to ".
0e50: 22 20 66 6f 72 20 61 20 73 74 61 6e 64 2d 61 6c  " for a stand-al
0e60: 6f 6e 65 20 77 65 62 20 73 65 72 76 65 72 2e 0a  one web server..
0e70: 2a 2a 0a 2a 2a 20 20 2d 2d 70 6f 72 74 20 4e 20  **.**  --port N 
0e80: 20 20 20 20 20 20 20 20 52 75 6e 20 69 6e 20 73          Run in s
0e90: 74 61 6e 64 61 6c 6f 6e 65 20 6d 6f 64 65 20 6c  tandalone mode l
0ea0: 69 73 74 65 6e 69 6e 67 20 6f 6e 20 54 43 50 20  istening on TCP 
0eb0: 70 6f 72 74 20 4e 0a 2a 2a 0a 2a 2a 20 20 2d 2d  port N.**.**  --
0ec0: 75 73 65 72 20 55 53 45 52 20 20 20 20 20 20 44  user USER      D
0ed0: 65 66 69 6e 65 20 74 68 65 20 75 73 65 72 20 75  efine the user u
0ee0: 6e 64 65 72 20 77 68 69 63 68 20 74 68 65 20 70  nder which the p
0ef0: 72 6f 63 65 73 73 20 73 68 6f 75 6c 64 20 72 75  rocess should ru
0f00: 6e 20 69 66 0a 2a 2a 20 20 20 20 20 20 20 20 20  n if.**         
0f10: 20 20 20 20 20 20 20 20 20 20 6f 72 69 67 69 6e            origin
0f20: 61 6c 6c 79 20 6c 61 75 6e 63 68 65 64 20 61 73  ally launched as
0f30: 20 72 6f 6f 74 2e 20 20 54 68 69 73 20 70 72 6f   root.  This pro
0f40: 63 65 73 73 20 77 69 6c 6c 20 72 65 66 75 73 65  cess will refuse
0f50: 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   to.**          
0f60: 20 20 20 20 20 20 20 20 20 72 75 6e 20 61 73 20           run as 
0f70: 72 6f 6f 74 20 28 66 6f 72 20 73 65 63 75 72 69  root (for securi
0f80: 74 79 29 2e 20 20 49 66 20 74 68 69 73 20 6f 70  ty).  If this op
0f90: 74 69 6f 6e 20 69 73 20 6f 6d 69 74 74 65 64 20  tion is omitted 
0fa0: 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
0fb0: 20 20 20 20 20 20 20 20 20 74 68 65 20 70 72 6f           the pro
0fc0: 63 65 73 73 20 69 73 20 6c 61 75 6e 63 68 65 64  cess is launched
0fd0: 20 61 73 20 72 6f 6f 74 2c 20 69 74 20 77 69 6c   as root, it wil
0fe0: 6c 20 61 62 6f 72 74 20 77 69 74 68 6f 75 74 0a  l abort without.
0ff0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1000: 20 20 20 20 20 70 72 6f 63 65 73 73 69 6e 67 20       processing 
1010: 61 6e 79 20 48 54 54 50 20 72 65 71 75 65 73 74  any HTTP request
1020: 73 2e 0a 2a 2a 0a 2a 2a 20 20 2d 2d 6c 6f 67 66  s..**.**  --logf
1030: 69 6c 65 20 46 49 4c 45 20 20 20 41 70 70 65 6e  ile FILE   Appen
1040: 64 20 61 20 73 69 6e 67 6c 65 2d 6c 69 6e 65 2c  d a single-line,
1050: 20 43 53 56 2d 66 6f 72 6d 61 74 2c 20 6c 6f 67   CSV-format, log
1060: 20 66 69 6c 65 20 65 6e 74 72 79 20 74 6f 20 46   file entry to F
1070: 49 4c 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ILE.**          
1080: 20 20 20 20 20 20 20 20 20 66 6f 72 20 65 61 63           for eac
1090: 68 20 48 54 54 50 20 72 65 71 75 65 73 74 2e 20  h HTTP request. 
10a0: 20 46 49 4c 45 20 73 68 6f 75 6c 64 20 62 65 20   FILE should be 
10b0: 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e  a full pathname.
10c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
10d0: 20 20 20 20 20 20 54 68 65 20 46 49 4c 45 20 6e        The FILE n
10e0: 61 6d 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  ame is interpret
10f0: 65 64 20 69 6e 73 69 64 65 20 74 68 65 20 63 68  ed inside the ch
1100: 72 6f 6f 74 20 6a 61 69 6c 2e 20 20 54 68 65 0a  root jail.  The.
1110: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1120: 20 20 20 20 20 46 49 4c 45 20 6e 61 6d 65 20 69       FILE name i
1130: 73 20 65 78 70 61 6e 64 65 64 20 75 73 69 6e 67  s expanded using
1140: 20 73 74 72 66 74 69 6d 65 28 29 20 69 66 20 69   strftime() if i
1150: 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 20 20  t contains.**   
1160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1170: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 27 25 27  at least one '%'
1180: 20 61 6e 64 20 69 73 20 6e 6f 74 20 74 6f 6f 20   and is not too 
1190: 6c 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 2d 2d 68  long..**.**  --h
11a0: 74 74 70 73 20 20 20 20 20 20 20 20 20 20 49 6e  ttps          In
11b0: 64 69 63 61 74 65 73 20 74 68 61 74 20 69 6e 70  dicates that inp
11c0: 75 74 20 69 73 20 63 6f 6d 69 6e 67 20 6f 76 65  ut is coming ove
11d0: 72 20 53 53 4c 20 61 6e 64 20 69 73 20 62 65 69  r SSL and is bei
11e0: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ng.**           
11f0: 20 20 20 20 20 20 20 20 64 65 63 6f 64 65 64 20          decoded 
1200: 75 70 73 74 72 65 61 6d 2c 20 70 65 72 68 61 70  upstream, perhap
1210: 73 20 62 79 20 73 74 75 6e 6e 65 6c 2e 20 20 28  s by stunnel.  (
1220: 54 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  This program.** 
1230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1240: 20 20 6f 6e 6c 79 20 75 6e 64 65 72 73 74 61 6e    only understan
1250: 64 73 20 70 6c 61 69 6e 74 65 78 74 2e 29 0a 2a  ds plaintext.).*
1260: 2a 0a 2a 2a 20 20 2d 2d 66 61 6d 69 6c 79 20 69  *.**  --family i
1270: 70 76 34 20 20 20 20 4f 6e 6c 79 20 61 63 63 65  pv4    Only acce
1280: 70 74 20 69 6e 70 75 74 20 66 72 6f 6d 20 49 50  pt input from IP
1290: 56 34 20 6f 72 20 49 50 56 36 2c 20 72 65 73 70  V4 or IPV6, resp
12a0: 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 20 2d 2d  ectively..**  --
12b0: 66 61 6d 69 6c 79 20 69 70 76 36 20 20 20 20 54  family ipv6    T
12c0: 68 65 73 65 20 6f 70 74 69 6f 6e 73 20 61 72 65  hese options are
12d0: 20 6f 6e 6c 79 20 6d 65 61 6e 69 6e 67 66 75 6c   only meaningful
12e0: 20 69 66 20 61 6c 74 68 74 74 70 64 20 69 73 20   if althttpd is 
12f0: 72 75 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  run.**          
1300: 20 20 20 20 20 20 20 20 20 61 73 20 61 20 73 74           as a st
1310: 61 6e 64 2d 61 6c 6f 6e 65 20 73 65 72 76 65 72  and-alone server
1320: 2e 0a 2a 2a 0a 2a 2a 20 20 2d 2d 6a 61 69 6c 20  ..**.**  --jail 
1330: 42 4f 4f 4c 45 41 4e 20 20 20 49 6e 64 69 63 61  BOOLEAN   Indica
1340: 74 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e  tes whether or n
1350: 6f 74 20 74 6f 20 66 6f 72 6d 20 61 20 63 68 72  ot to form a chr
1360: 6f 6f 74 20 6a 61 69 6c 20 69 66 20 0a 2a 2a 20  oot jail if .** 
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1380: 20 20 69 6e 69 74 69 61 6c 6c 79 20 72 75 6e 20    initially run 
1390: 61 73 20 72 6f 6f 74 2e 20 20 54 68 65 20 64 65  as root.  The de
13a0: 66 61 75 6c 74 20 69 73 20 74 72 75 65 2c 20 73  fault is true, s
13b0: 6f 20 74 68 65 20 6f 6e 6c 79 0a 2a 2a 20 20 20  o the only.**   
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d0: 75 73 65 66 75 6c 20 76 61 72 69 61 6e 74 20 6f  useful variant o
13e0: 66 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 69 73  f this option is
13f0: 20 22 2d 2d 6a 61 69 6c 20 30 22 20 77 68 69 63   "--jail 0" whic
1400: 68 20 70 72 65 76 65 6e 74 73 0a 2a 2a 20 20 20  h prevents.**   
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 74 68 65 20 66 6f 72 6d 61 74 69 6f 6e 20 6f 66  the formation of
1430: 20 74 68 65 20 63 68 72 6f 6f 74 20 6a 61 69 6c   the chroot jail
1440: 2e 0a 2a 2a 0a 2a 2a 20 20 2d 2d 6d 61 78 2d 61  ..**.**  --max-a
1450: 67 65 20 53 45 43 20 20 20 20 54 68 65 20 76 61  ge SEC    The va
1460: 6c 75 65 20 66 6f 72 20 22 43 61 63 68 65 2d 43  lue for "Cache-C
1470: 6f 6e 74 72 6f 6c 3a 20 6d 61 78 2d 61 67 65 3d  ontrol: max-age=
1480: 25 64 22 2e 20 20 44 65 66 61 75 6c 74 73 20 74  %d".  Defaults t
1490: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
14a0: 20 20 20 20 20 20 20 31 32 30 20 73 65 63 6f 6e         120 secon
14b0: 64 73 2e 0a 2a 2a 0a 2a 2a 20 20 2d 2d 64 65 62  ds..**.**  --deb
14c0: 75 67 20 20 20 20 20 20 20 20 20 20 44 69 73 61  ug          Disa
14d0: 62 6c 65 73 20 69 6e 70 75 74 20 74 69 6d 65 6f  bles input timeo
14e0: 75 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  uts.  This is us
14f0: 65 66 75 6c 20 66 6f 72 20 64 65 62 75 67 67 69  eful for debuggi
1500: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ng.**           
1510: 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 6e 70          when inp
1520: 75 74 73 20 69 73 20 62 65 69 6e 67 20 74 79 70  uts is being typ
1530: 65 64 20 69 6e 20 6d 61 6e 75 61 6c 6c 79 2e 0a  ed in manually..
1540: 2a 2a 0a 2a 2a 20 43 6f 6d 6d 61 6e 64 2d 6c 69  **.** Command-li
1550: 6e 65 20 6f 70 74 69 6f 6e 73 20 63 61 6e 20 74  ne options can t
1560: 61 6b 65 20 65 69 74 68 65 72 20 6f 6e 65 20 6f  ake either one o
1570: 72 20 74 77 6f 20 69 6e 69 74 69 61 6c 20 22 2d  r two initial "-
1580: 22 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a  " characters..**
1590: 20 53 6f 20 22 2d 2d 64 65 62 75 67 22 20 61 6e   So "--debug" an
15a0: 64 20 22 2d 64 65 62 75 67 22 20 6d 65 61 6e 20  d "-debug" mean 
15b0: 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2c 20  the same thing, 
15c0: 66 6f 72 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 0a  for example..**.
15d0: 2a 2a 0a 2a 2a 20 53 65 63 75 72 69 74 79 20 46  **.** Security F
15e0: 65 61 74 75 72 65 73 3a 0a 2a 2a 0a 2a 2a 20 28  eatures:.**.** (
15f0: 31 29 20 20 54 68 69 73 20 70 72 6f 67 72 61 6d  1)  This program
1600: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 70   automatically p
1610: 75 74 73 20 69 74 73 65 6c 66 20 69 6e 73 69 64  uts itself insid
1620: 65 20 61 20 63 68 72 6f 6f 74 20 6a 61 69 6c 20  e a chroot jail 
1630: 69 66 0a 2a 2a 20 20 20 20 20 20 69 74 20 63 61  if.**      it ca
1640: 6e 20 61 6e 64 20 69 66 20 6e 6f 74 20 73 70 65  n and if not spe
1650: 63 69 66 69 63 61 6c 6c 79 20 70 72 6f 68 69 62  cifically prohib
1660: 69 74 65 64 20 62 79 20 74 68 65 20 22 2d 2d 6a  ited by the "--j
1670: 61 69 6c 20 30 22 0a 2a 2a 20 20 20 20 20 20 63  ail 0".**      c
1680: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69  ommand-line opti
1690: 6f 6e 2e 20 20 54 68 65 20 72 6f 6f 74 20 6f 66  on.  The root of
16a0: 20 74 68 65 20 6a 61 69 6c 20 69 73 20 74 68 65   the jail is the
16b0: 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 0a   directory that.
16c0: 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 73  **      contains
16d0: 20 74 68 65 20 76 61 72 69 6f 75 73 20 24 48 4f   the various $HO
16e0: 53 54 2e 77 65 62 73 69 74 65 20 63 6f 6e 74 65  ST.website conte
16f0: 6e 74 20 73 75 62 64 69 72 65 63 74 6f 72 69 65  nt subdirectorie
1700: 73 2e 0a 2a 2a 0a 2a 2a 20 28 32 29 20 20 4e 6f  s..**.** (2)  No
1710: 20 69 6e 70 75 74 20 69 73 20 72 65 61 64 20 77   input is read w
1720: 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
1730: 73 20 68 61 73 20 72 6f 6f 74 20 70 72 69 76 69  s has root privi
1740: 6c 65 67 65 73 2e 20 20 52 6f 6f 74 0a 2a 2a 20  leges.  Root.** 
1750: 20 20 20 20 20 70 72 69 76 69 6c 65 67 65 73 20       privileges 
1760: 61 72 65 20 64 72 6f 70 70 65 64 20 70 72 69 6f  are dropped prio
1770: 72 20 74 6f 20 72 65 61 64 69 6e 67 20 61 6e 79  r to reading any
1780: 20 69 6e 70 75 74 20 28 62 75 74 20 61 66 74 65   input (but afte
1790: 72 20 65 6e 74 65 72 69 6e 67 0a 2a 2a 20 20 20  r entering.**   
17a0: 20 20 20 74 68 65 20 63 68 72 6f 6f 74 20 6a 61     the chroot ja
17b0: 69 6c 2c 20 6f 66 20 63 6f 75 72 73 65 29 2e 20  il, of course). 
17c0: 20 49 66 20 72 6f 6f 74 20 70 72 69 76 69 6c 65   If root privile
17d0: 67 65 73 20 63 61 6e 6e 6f 74 20 62 65 20 64 72  ges cannot be dr
17e0: 6f 70 70 65 64 0a 2a 2a 20 20 20 20 20 20 28 66  opped.**      (f
17f0: 6f 72 20 65 78 61 6d 70 6c 65 20 62 65 63 61 75  or example becau
1800: 73 65 20 74 68 65 20 2d 2d 75 73 65 72 20 63 6f  se the --user co
1810: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f  mmand-line optio
1820: 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 20 6f 72  n was omitted or
1830: 0a 2a 2a 20 20 20 20 20 20 62 65 63 61 75 73 65  .**      because
1840: 20 74 68 65 20 75 73 65 72 20 73 70 65 63 69 66   the user specif
1850: 69 65 64 20 62 79 20 74 68 65 20 2d 2d 75 73 65  ied by the --use
1860: 72 20 6f 70 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  r option does no
1870: 74 20 65 78 69 73 74 29 2c 20 0a 2a 2a 20 20 20  t exist), .**   
1880: 20 20 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63     then the proc
1890: 65 73 73 20 61 62 6f 72 74 73 20 77 69 74 68 20  ess aborts with 
18a0: 61 6e 20 65 72 72 6f 72 20 70 72 69 6f 72 20 74  an error prior t
18b0: 6f 20 72 65 61 64 69 6e 67 20 61 6e 79 20 69 6e  o reading any in
18c0: 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20 20  put..**.** (3)  
18d0: 54 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 61 6e  The length of an
18e0: 20 48 54 54 50 20 72 65 71 75 65 73 74 20 69 73   HTTP request is
18f0: 20 6c 69 6d 69 74 65 64 20 74 6f 20 4d 41 58 5f   limited to MAX_
1900: 43 4f 4e 54 45 4e 54 5f 4c 45 4e 47 54 48 20 62  CONTENT_LENGTH b
1910: 79 74 65 73 0a 2a 2a 20 20 20 20 20 20 28 64 65  ytes.**      (de
1920: 66 61 75 6c 74 3a 20 32 35 30 20 6d 69 6c 6c 69  fault: 250 milli
1930: 6f 6e 29 2e 20 20 41 6e 79 20 48 54 54 50 20 72  on).  Any HTTP r
1940: 65 71 75 65 73 74 20 6c 6f 6e 67 65 72 20 74 68  equest longer th
1950: 61 6e 20 74 68 69 73 20 66 61 69 6c 73 0a 2a 2a  an this fails.**
1960: 20 20 20 20 20 20 77 69 74 68 20 61 6e 20 65 72        with an er
1970: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 28 34 29 20 20  ror..**.** (4)  
1980: 54 68 65 72 65 20 61 72 65 20 68 61 72 64 2d 63  There are hard-c
1990: 6f 64 65 64 20 74 69 6d 65 2d 6f 75 74 73 20 6f  oded time-outs o
19a0: 6e 20 65 61 63 68 20 48 54 54 50 20 72 65 71 75  n each HTTP requ
19b0: 65 73 74 2e 20 20 49 66 20 74 68 69 73 20 70 72  est.  If this pr
19c0: 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 77 61  ocess.**      wa
19d0: 69 74 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20  its longer than 
19e0: 74 68 65 20 74 69 6d 65 6f 75 74 20 66 6f 72 20  the timeout for 
19f0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 72 65 71  the complete req
1a00: 75 65 73 74 2c 20 6f 72 20 66 6f 72 20 43 47 49  uest, or for CGI
1a10: 0a 2a 2a 20 20 20 20 20 20 74 6f 20 66 69 6e 69  .**      to fini
1a20: 73 68 20 72 75 6e 6e 69 6e 67 2c 20 74 68 65 6e  sh running, then
1a30: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 61 62   this process ab
1a40: 6f 72 74 73 2e 20 20 28 54 68 65 20 74 69 6d 65  orts.  (The time
1a50: 6f 75 74 20 66 65 61 74 75 72 65 0a 2a 2a 20 20  out feature.**  
1a60: 20 20 20 20 63 61 6e 20 62 65 20 64 69 73 61 62      can be disab
1a70: 6c 65 64 20 75 73 69 6e 67 20 74 68 65 20 2d 2d  led using the --
1a80: 64 65 62 75 67 20 63 6f 6d 6d 61 6e 64 2d 6c 69  debug command-li
1a90: 6e 65 20 6f 70 74 69 6f 6e 2e 29 0a 2a 2a 0a 2a  ne option.).**.*
1aa0: 2a 20 28 35 29 20 20 49 66 20 74 68 65 20 48 54  * (5)  If the HT
1ab0: 54 50 5f 48 4f 53 54 20 72 65 71 75 65 73 74 20  TP_HOST request 
1ac0: 68 65 61 64 65 72 20 63 6f 6e 74 61 69 6e 73 20  header contains 
1ad0: 63 68 61 72 61 63 74 65 72 73 20 6f 74 68 65 72  characters other
1ae0: 20 74 68 61 6e 0a 2a 2a 20 20 20 20 20 20 5b 30   than.**      [0
1af0: 2d 39 61 2d 7a 41 2d 5a 2c 2d 2e 2f 3a 5f 7e 5d  -9a-zA-Z,-./:_~]
1b00: 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65   then the entire
1b10: 20 72 65 71 75 65 73 74 20 69 73 20 72 65 6a 65   request is reje
1b20: 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 28 36 29 20  cted..**.** (6) 
1b30: 20 41 6e 79 20 63 68 61 72 61 63 74 65 72 73 20   Any characters 
1b40: 69 6e 20 74 68 65 20 55 52 49 20 70 61 74 68 6e  in the URI pathn
1b50: 61 6d 65 20 6f 74 68 65 72 20 74 68 61 6e 20 5b  ame other than [
1b60: 30 2d 39 61 2d 7a 41 2d 5a 2c 2d 2e 2f 3a 5f 7e  0-9a-zA-Z,-./:_~
1b70: 5d 0a 2a 2a 20 20 20 20 20 20 61 72 65 20 63 6f  ].**      are co
1b80: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 22 5f 22  nverted into "_"
1b90: 2e 20 20 54 68 69 73 20 61 70 70 6c 69 65 73 20  .  This applies 
1ba0: 74 6f 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20  to the pathname 
1bb0: 6f 6e 6c 79 2c 20 6e 6f 74 0a 2a 2a 20 20 20 20  only, not.**    
1bc0: 20 20 74 6f 20 74 68 65 20 71 75 65 72 79 20 70    to the query p
1bd0: 61 72 61 6d 65 74 65 72 73 20 6f 72 20 66 72 61  arameters or fra
1be0: 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 28 37 29  gment..**.** (7)
1bf0: 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20 63    If the first c
1c00: 68 61 72 61 63 74 65 72 20 6f 66 20 61 6e 79 20  haracter of any 
1c10: 55 52 49 20 70 61 74 68 6e 61 6d 65 20 63 6f 6d  URI pathname com
1c20: 70 6f 6e 65 6e 74 20 69 73 20 22 2e 22 20 6f 72  ponent is "." or
1c30: 20 22 2d 22 0a 2a 2a 20 20 20 20 20 20 74 68 65   "-".**      the
1c40: 6e 20 61 20 34 30 34 20 4e 6f 74 20 46 6f 75 6e  n a 404 Not Foun
1c50: 64 20 72 65 70 6c 79 20 69 73 20 67 65 6e 65 72  d reply is gener
1c60: 61 74 65 64 2e 20 20 54 68 69 73 20 70 72 65 76  ated.  This prev
1c70: 65 6e 74 73 20 61 74 74 61 63 6b 73 0a 2a 2a 20  ents attacks.** 
1c80: 20 20 20 20 20 73 75 63 68 20 61 73 20 69 6e 63       such as inc
1c90: 6c 75 64 69 6e 67 20 22 2e 2e 22 20 6f 72 20 22  luding ".." or "
1ca0: 2e 22 20 64 69 72 65 63 74 6f 72 79 20 65 6c 65  ." directory ele
1cb0: 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 70 61 74  ments in the pat
1cc0: 68 6e 61 6d 65 0a 2a 2a 20 20 20 20 20 20 61 6e  hname.**      an
1cd0: 64 20 61 6c 6c 6f 77 73 20 70 6c 61 63 69 6e 67  d allows placing
1ce0: 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63   files and direc
1cf0: 74 6f 72 69 65 73 20 69 6e 20 74 68 65 20 63 6f  tories in the co
1d00: 6e 74 65 6e 74 20 73 75 62 64 69 72 65 63 74 6f  ntent subdirecto
1d10: 72 79 0a 2a 2a 20 20 20 20 20 20 74 68 61 74 20  ry.**      that 
1d20: 61 72 65 20 69 6e 76 69 73 69 62 6c 65 20 74 6f  are invisible to
1d30: 20 61 6c 6c 20 48 54 54 50 20 72 65 71 75 65 73   all HTTP reques
1d40: 74 73 2c 20 62 79 20 6d 61 6b 69 6e 67 20 74 68  ts, by making th
1d50: 65 20 66 69 72 73 74 20 0a 2a 2a 20 20 20 20 20  e first .**     
1d60: 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
1d70: 65 20 66 69 6c 65 20 6f 72 20 73 75 62 64 69 72  e file or subdir
1d80: 65 63 74 6f 72 79 20 6e 61 6d 65 20 22 2d 22 20  ectory name "-" 
1d90: 6f 72 20 22 2e 22 2e 0a 2a 2a 0a 2a 2a 20 28 38  or "."..**.** (8
1da0: 29 20 20 54 68 65 20 72 65 71 75 65 73 74 20 55  )  The request U
1db0: 52 49 20 6d 75 73 74 20 62 65 67 69 6e 20 77 69  RI must begin wi
1dc0: 74 68 20 22 2f 22 20 6f 72 20 65 6c 73 65 20 61  th "/" or else a
1dd0: 20 34 30 34 20 65 72 72 6f 72 20 69 73 20 67 65   404 error is ge
1de0: 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 28  nerated..**.** (
1df0: 39 29 20 20 54 68 69 73 20 70 72 6f 67 72 61 6d  9)  This program
1e00: 20 6e 65 76 65 72 20 73 65 74 73 20 74 68 65 20   never sets the 
1e10: 76 61 6c 75 65 20 6f 66 20 61 6e 20 65 6e 76 69  value of an envi
1e20: 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
1e30: 20 74 6f 20 61 0a 2a 2a 20 20 20 20 20 20 73 74   to a.**      st
1e40: 72 69 6e 67 20 74 68 61 74 20 62 65 67 69 6e 73  ring that begins
1e50: 20 77 69 74 68 20 22 28 29 20 7b 22 2e 0a 2a 2a   with "() {"..**
1e60: 0a 2a 2a 20 53 65 63 75 72 69 74 79 20 41 75 64  .** Security Aud
1e70: 69 74 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 54 68 69  iting:.**.** Thi
1e80: 73 20 77 65 62 73 65 72 76 65 72 20 6d 6f 73 74  s webserver most
1e90: 6c 79 20 6f 6e 6c 79 20 73 65 72 76 65 73 20 73  ly only serves s
1ea0: 74 61 74 69 63 20 63 6f 6e 74 65 6e 74 2e 20 20  tatic content.  
1eb0: 41 6e 79 20 73 65 63 75 72 69 74 79 20 72 69 73  Any security ris
1ec0: 6b 20 77 69 6c 6c 0a 2a 2a 20 63 6f 6d 65 20 66  k will.** come f
1ed0: 72 6f 6d 20 43 47 49 20 61 6e 64 20 53 43 47 49  rom CGI and SCGI
1ee0: 2e 20 20 54 6f 20 63 68 65 63 6b 20 61 6e 20 69  .  To check an i
1ef0: 6e 73 74 61 6c 6c 61 74 69 6f 6e 20 66 6f 72 20  nstallation for 
1f00: 73 65 63 75 72 69 74 79 2c 20 74 68 65 6e 2c 20  security, then, 
1f10: 69 74 0a 2a 2a 20 6d 61 6b 65 73 20 73 65 6e 73  it.** makes sens
1f20: 65 20 74 6f 20 66 6f 63 75 73 20 6f 6e 20 74 68  e to focus on th
1f30: 65 20 43 47 49 20 61 6e 64 20 53 43 47 49 20 73  e CGI and SCGI s
1f40: 63 72 69 70 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  cripts..**.** To
1f50: 20 6c 6f 63 61 6c 20 61 6c 6c 20 43 47 49 20 66   local all CGI f
1f60: 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iles:.**.**     
1f70: 20 20 20 20 20 66 69 6e 64 20 2a 2e 77 65 62 73       find *.webs
1f80: 69 74 65 20 2d 65 78 65 63 75 74 61 62 6c 65 20  ite -executable 
1f90: 2d 74 79 70 65 20 66 20 2d 70 72 69 6e 74 0a 2a  -type f -print.*
1fa0: 2a 20 20 20 20 20 4f 52 3a 20 20 66 69 6e 64 20  *     OR:  find 
1fb0: 2a 2e 77 65 62 73 69 74 65 20 2d 70 65 72 6d 20  *.website -perm 
1fc0: 2b 30 31 31 31 20 2d 74 79 70 65 20 66 20 2d 70  +0111 -type f -p
1fd0: 72 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  rint.**.** The f
1fe0: 69 72 73 74 20 66 6f 72 6d 20 6f 66 20 74 68 65  irst form of the
1ff0: 20 22 66 69 6e 64 22 20 63 6f 6d 6d 61 6e 64 20   "find" command 
2000: 69 73 20 70 72 65 66 65 72 72 65 64 2c 20 62 75  is preferred, bu
2010: 74 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72  t is only suppor
2020: 74 65 64 0a 2a 2a 20 62 79 20 47 4e 55 20 66 69  ted.** by GNU fi
2030: 6e 64 2e 20 20 4f 6e 20 61 20 4d 61 63 2c 20 79  nd.  On a Mac, y
2040: 6f 75 27 6c 6c 20 68 61 76 65 20 74 6f 20 75 73  ou'll have to us
2050: 65 20 74 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  e the second for
2060: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 66 69 6e 64  m..**.** To find
2070: 20 61 6c 6c 20 53 43 47 49 20 66 69 6c 65 73 3a   all SCGI files:
2080: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
2090: 66 69 6e 64 20 2a 2e 77 65 62 73 69 74 65 20 2d  find *.website -
20a0: 6e 61 6d 65 20 27 2a 2e 73 63 67 69 27 20 2d 74  name '*.scgi' -t
20b0: 79 70 65 20 66 20 2d 70 72 69 6e 74 0a 2a 2a 0a  ype f -print.**.
20c0: 2a 2a 20 49 66 20 61 6e 79 20 66 69 6c 65 20 69  ** If any file i
20d0: 73 20 61 20 73 65 63 75 72 69 74 79 20 63 6f 6e  s a security con
20e0: 63 65 72 6e 2c 20 69 74 20 63 61 6e 20 62 65 20  cern, it can be 
20f0: 64 69 73 61 62 6c 65 64 20 6f 6e 20 61 20 6c 69  disabled on a li
2100: 76 65 0a 2a 2a 20 69 6e 73 74 61 6c 6c 61 74 69  ve.** installati
2110: 6f 6e 20 62 79 20 74 75 72 6e 69 6e 67 20 6f 66  on by turning of
2120: 66 20 72 65 61 64 20 70 65 72 6d 69 73 73 69 6f  f read permissio
2130: 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ns:.**.**       
2140: 20 20 20 63 68 6d 6f 64 20 30 30 30 30 20 66 69     chmod 0000 fi
2150: 6c 65 2d 6f 66 2d 63 6f 6e 63 65 72 6e 0a 2a 2a  le-of-concern.**
2160: 0a 2a 2a 20 53 43 47 49 20 53 70 65 63 69 66 69  .** SCGI Specifi
2170: 63 61 74 69 6f 6e 20 46 69 6c 65 73 3a 0a 2a 2a  cation Files:.**
2180: 0a 2a 2a 20 43 6f 6e 74 65 6e 74 20 66 69 6c 65  .** Content file
2190: 73 20 28 66 69 6c 65 73 20 77 69 74 68 6f 75 74  s (files without
21a0: 20 74 68 65 20 65 78 65 63 75 74 65 20 62 69 74   the execute bit
21b0: 20 73 65 74 29 20 74 68 61 74 20 65 6e 64 20 77   set) that end w
21c0: 69 74 68 20 22 2e 73 63 67 69 22 0a 2a 2a 20 73  ith ".scgi".** s
21d0: 70 65 63 69 66 79 20 61 20 63 6f 6e 6e 65 63 74  pecify a connect
21e0: 69 6f 6e 20 74 6f 20 61 6e 20 53 43 47 49 20 73  ion to an SCGI s
21f0: 65 72 76 65 72 2e 20 20 54 68 65 20 66 6f 72 6d  erver.  The form
2200: 61 74 20 6f 66 20 74 68 65 20 2e 73 63 67 69 20  at of the .scgi 
2210: 66 69 6c 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 20  file.** follows 
2220: 74 68 69 73 20 74 65 6d 70 6c 61 74 65 3a 0a 2a  this template:.*
2230: 2a 0a 2a 2a 20 20 20 20 20 20 53 43 47 49 20 68  *.**      SCGI h
2240: 6f 73 74 6e 61 6d 65 20 70 6f 72 74 0a 2a 2a 20  ostname port.** 
2250: 20 20 20 20 20 66 61 6c 6c 62 61 63 6b 3a 20 66       fallback: f
2260: 61 6c 6c 62 61 63 6b 2d 66 69 6c 65 6e 61 6d 65  allback-filename
2270: 0a 2a 2a 20 20 20 20 20 20 72 65 6c 69 67 68 74  .**      relight
2280: 3a 20 72 65 6c 69 67 68 74 2d 63 6f 6d 6d 61 6e  : relight-comman
2290: 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  d.**.** The firs
22a0: 74 20 6c 69 6e 65 20 73 70 65 63 69 66 69 65 73  t line specifies
22b0: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 61 6e   the location an
22c0: 64 20 54 43 50 2f 49 50 20 70 6f 72 74 20 6f 66  d TCP/IP port of
22d0: 20 74 68 65 20 53 43 47 49 20 73 65 72 76 65 72   the SCGI server
22e0: 0a 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 68 61  .** that will ha
22f0: 6e 64 6c 65 20 74 68 65 20 72 65 71 75 65 73 74  ndle the request
2300: 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 6c 69  .  Subsequent li
2310: 6e 65 73 20 64 65 74 65 72 6d 69 6e 65 20 77 68  nes determine wh
2320: 61 74 20 74 6f 20 64 6f 20 69 66 0a 2a 2a 20 74  at to do if.** t
2330: 68 65 20 53 43 47 49 20 73 65 72 76 65 72 20 63  he SCGI server c
2340: 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 74 61 63 74  annot be contact
2350: 65 64 2e 20 20 49 66 20 74 68 65 20 22 72 65 6c  ed.  If the "rel
2360: 69 67 68 74 3a 22 20 6c 69 6e 65 20 69 73 20 70  ight:" line is p
2370: 72 65 73 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20  resent,.** then 
2380: 74 68 65 20 72 65 6c 69 67 68 74 2d 63 6f 6d 6d  the relight-comm
2390: 61 6e 64 20 69 73 20 72 75 6e 20 75 73 69 6e 67  and is run using
23a0: 20 73 79 73 74 65 6d 28 29 20 61 6e 64 20 74 68   system() and th
23b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 0a  e connection is.
23c0: 2a 2a 20 72 65 74 72 69 65 64 20 61 66 74 65 72  ** retried after
23d0: 20 61 20 31 2d 73 65 63 6f 6e 64 20 64 65 6c 61   a 1-second dela
23e0: 79 2e 20 20 55 73 65 20 22 26 22 20 61 74 20 74  y.  Use "&" at t
23f0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 65  he end of the re
2400: 6c 69 67 68 74 2d 63 6f 6d 6d 61 6e 64 0a 2a 2a  light-command.**
2410: 20 74 6f 20 72 75 6e 20 69 74 20 69 6e 20 74 68   to run it in th
2420: 65 20 62 61 63 6b 67 72 6f 75 6e 64 2e 20 20 4d  e background.  M
2430: 61 6b 65 20 73 75 72 65 20 74 68 65 20 72 65 6c  ake sure the rel
2440: 69 67 68 74 2d 63 6f 6d 6d 61 6e 64 20 64 6f 65  ight-command doe
2450: 73 20 6e 6f 74 0a 2a 2a 20 73 65 6e 64 20 67 65  s not.** send ge
2460: 6e 65 72 61 74 65 20 6f 75 74 70 75 74 2c 20 6f  nerate output, o
2470: 72 20 74 68 61 74 20 6f 75 74 70 75 74 20 77 69  r that output wi
2480: 6c 6c 20 62 65 63 6f 6d 65 20 70 61 72 74 20 6f  ll become part o
2490: 66 20 74 68 65 20 53 43 47 49 20 72 65 70 6c 79  f the SCGI reply
24a0: 2e 0a 2a 2a 20 41 64 64 20 61 20 22 3e 2f 64 65  ..** Add a ">/de
24b0: 76 2f 6e 75 6c 6c 22 20 73 75 66 66 69 78 20 28  v/null" suffix (
24c0: 62 65 66 6f 72 65 20 74 68 65 20 22 26 22 29 20  before the "&") 
24d0: 74 6f 20 74 68 65 20 72 65 6c 69 67 68 74 2d 63  to the relight-c
24e0: 6f 6d 6d 61 6e 64 20 69 66 0a 2a 2a 20 6e 65 63  ommand if.** nec
24f0: 65 73 73 61 72 79 20 74 6f 20 73 75 70 70 72 65  essary to suppre
2500: 73 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 74  ss output.  If t
2510: 68 65 72 65 20 69 73 20 6e 6f 20 72 65 6c 69 67  here is no relig
2520: 68 74 2d 63 6f 6d 6d 61 6e 64 2c 20 6f 72 20 69  ht-command, or i
2530: 66 20 74 68 65 0a 2a 2a 20 72 65 6c 69 67 68 74  f the.** relight
2540: 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 62 75   is attempted bu
2550: 74 20 74 68 65 20 53 43 47 49 20 73 65 72 76 65  t the SCGI serve
2560: 72 20 73 74 69 6c 6c 20 63 61 6e 6e 6f 74 20 62  r still cannot b
2570: 65 20 63 6f 6e 74 61 63 74 65 64 2c 20 74 68 65  e contacted, the
2580: 6e 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  n.** the content
2590: 20 6f 66 20 74 68 65 20 66 61 6c 6c 62 61 63 6b   of the fallback
25a0: 2d 66 69 6c 65 6e 61 6d 65 20 66 69 6c 65 20 69  -filename file i
25b0: 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 61 20  s returned as a 
25c0: 73 75 62 73 74 69 74 75 74 65 20 66 6f 72 0a 2a  substitute for.*
25d0: 2a 20 74 68 65 20 53 43 47 49 20 72 65 71 75 65  * the SCGI reque
25e0: 73 74 2e 20 20 54 68 65 20 6d 69 6d 65 74 79 70  st.  The mimetyp
25f0: 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
2600: 62 79 20 74 68 65 20 73 75 66 66 69 78 20 6f 6e  by the suffix on
2610: 20 74 68 65 0a 2a 2a 20 66 61 6c 6c 62 61 63 6b   the.** fallback
2620: 2d 66 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 20  -filename.  The 
2630: 66 61 6c 6c 62 61 63 6b 2d 66 69 6c 65 6e 61 6d  fallback-filenam
2640: 65 20 77 6f 75 6c 64 20 74 79 70 69 63 61 6c 6c  e would typicall
2650: 79 20 62 65 20 61 6e 20 65 72 72 6f 72 0a 2a 2a  y be an error.**
2660: 20 6d 65 73 73 61 67 65 20 69 6e 64 69 63 61 74   message indicat
2670: 69 6e 67 20 74 68 61 74 20 74 68 65 20 73 65 72  ing that the ser
2680: 76 69 63 65 20 69 73 20 74 65 6d 70 6f 72 61 72  vice is temporar
2690: 69 6c 79 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e  ily unavailable.
26a0: 0a 2a 2a 0a 2a 2a 20 42 61 73 69 63 20 41 75 74  .**.** Basic Aut
26b0: 68 6f 72 69 7a 61 74 69 6f 6e 3a 0a 2a 2a 0a 2a  horization:.**.*
26c0: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 22 2d  * If the file "-
26d0: 61 75 74 68 22 20 65 78 69 73 74 73 20 69 6e 20  auth" exists in 
26e0: 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f  the same directo
26f0: 72 79 20 61 73 20 74 68 65 20 63 6f 6e 74 65 6e  ry as the conten
2700: 74 20 66 69 6c 65 0a 2a 2a 20 28 66 6f 72 20 62  t file.** (for b
2710: 6f 74 68 20 73 74 61 74 69 63 20 63 6f 6e 74 65  oth static conte
2720: 6e 74 20 61 6e 64 20 43 47 49 29 20 74 68 65 6e  nt and CGI) then
2730: 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   it contains the
2740: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65   information use
2750: 64 0a 2a 2a 20 66 6f 72 20 62 61 73 69 63 20 61  d.** for basic a
2760: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 2e 20 20 54  uthorization.  T
2770: 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  he file format i
2780: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
2790: 0a 2a 2a 20 20 20 20 2a 20 20 42 6c 61 6e 6b 20  .**    *  Blank 
27a0: 6c 69 6e 65 73 20 61 6e 64 20 6c 69 6e 65 73 20  lines and lines 
27b0: 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20  that begin with 
27c0: 27 23 27 20 61 72 65 20 69 67 6e 6f 72 65 64 0a  '#' are ignored.
27d0: 2a 2a 20 20 20 20 2a 20 20 22 68 74 74 70 2d 72  **    *  "http-r
27e0: 65 64 69 72 65 63 74 22 20 66 6f 72 63 65 73 20  edirect" forces 
27f0: 61 20 72 65 64 69 72 65 63 74 20 74 6f 20 48 54  a redirect to HT
2800: 54 50 53 20 69 66 20 6e 6f 74 20 74 68 65 72 65  TPS if not there
2810: 20 61 6c 72 65 61 64 79 0a 2a 2a 20 20 20 20 2a   already.**    *
2820: 20 20 22 68 74 74 70 73 2d 6f 6e 6c 79 22 20 64    "https-only" d
2830: 69 73 61 6c 6c 6f 77 73 20 6f 70 65 72 61 74 69  isallows operati
2840: 6f 6e 20 69 6e 20 48 54 54 50 0a 2a 2a 20 20 20  on in HTTP.**   
2850: 20 2a 20 20 22 75 73 65 72 20 4e 41 4d 45 20 4c   *  "user NAME L
2860: 4f 47 49 4e 3a 50 41 53 53 57 4f 52 44 22 20 63  OGIN:PASSWORD" c
2870: 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
2880: 4c 4f 47 49 4e 3a 50 41 53 53 57 4f 52 44 20 0a  LOGIN:PASSWORD .
2890: 2a 2a 20 20 20 20 20 20 20 61 75 74 68 6f 72 69  **       authori
28a0: 7a 61 74 69 6f 6e 20 63 72 65 64 65 6e 74 69 61  zation credentia
28b0: 6c 73 20 61 72 65 20 70 72 6f 76 69 64 65 64 2c  ls are provided,
28c0: 20 61 6e 64 20 69 66 20 73 6f 20 73 65 74 73 20   and if so sets 
28d0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 52 45 4d  the.**       REM
28e0: 4f 54 45 5f 55 53 45 52 20 74 6f 20 4e 41 4d 45  OTE_USER to NAME
28f0: 2e 0a 2a 2a 20 20 20 20 2a 20 20 22 72 65 61 6c  ..**    *  "real
2900: 6d 20 54 45 58 54 22 20 73 65 74 73 20 74 68 65  m TEXT" sets the
2910: 20 72 65 61 6c 6d 20 74 6f 20 54 45 58 54 2e 0a   realm to TEXT..
2920: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 63 61 6e 20  **.** There can 
2930: 62 65 20 6d 75 6c 74 69 70 6c 65 20 22 75 73 65  be multiple "use
2940: 72 22 20 6c 69 6e 65 73 2e 20 20 49 66 20 6e 6f  r" lines.  If no
2950: 20 22 75 73 65 72 22 20 6c 69 6e 65 20 6d 61 74   "user" line mat
2960: 63 68 65 73 2c 20 74 68 65 0a 2a 2a 20 72 65 71  ches, the.** req
2970: 75 65 73 74 20 66 61 69 6c 73 20 77 69 74 68 20  uest fails with 
2980: 61 20 34 30 31 20 65 72 72 6f 72 2e 0a 2a 2a 0a  a 401 error..**.
2990: 2a 2a 20 42 65 63 61 75 73 65 20 6f 66 20 73 65  ** Because of se
29a0: 63 75 72 69 74 79 20 72 75 6c 65 20 28 37 29 2c  curity rule (7),
29b0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   there is no way
29c0: 20 66 6f 72 20 74 68 65 20 63 6f 6e 74 65 6e 74   for the content
29d0: 20 6f 66 20 74 68 65 20 22 2d 61 75 74 68 22 0a   of the "-auth".
29e0: 2a 2a 20 66 69 6c 65 20 74 6f 20 6c 65 61 6b 20  ** file to leak 
29f0: 6f 75 74 20 76 69 61 20 48 54 54 50 20 72 65 71  out via HTTP req
2a00: 75 65 73 74 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  uest..*/.#includ
2a10: 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63  e <stdio.h>.#inc
2a20: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23  lude <ctype.h>.#
2a30: 69 6e 63 6c 75 64 65 20 3c 73 79 73 6c 6f 67 2e  include <syslog.
2a40: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h>.#include <std
2a50: 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  lib.h>.#include 
2a60: 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e  <sys/stat.h>.#in
2a70: 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e  clude <unistd.h>
2a80: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
2a90: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
2aa0: 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ring.h>.#include
2ab0: 20 3c 70 77 64 2e 68 3e 0a 23 69 6e 63 6c 75 64   <pwd.h>.#includ
2ac0: 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23  e <sys/time.h>.#
2ad0: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70  include <sys/typ
2ae0: 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  es.h>.#include <
2af0: 73 79 73 2f 73 6f 63 6b 65 74 2e 68 3e 0a 23 69  sys/socket.h>.#i
2b00: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 77 61 69 74  nclude <sys/wait
2b10: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6e 65  .h>.#include <ne
2b20: 74 69 6e 65 74 2f 69 6e 2e 68 3e 0a 23 69 6e 63  tinet/in.h>.#inc
2b30: 6c 75 64 65 20 3c 61 72 70 61 2f 69 6e 65 74 2e  lude <arpa/inet.
2b40: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h>.#include <std
2b50: 61 72 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  arg.h>.#include 
2b60: 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  <time.h>.#includ
2b70: 65 20 3c 73 79 73 2f 74 69 6d 65 73 2e 68 3e 0a  e <sys/times.h>.
2b80: 23 69 6e 63 6c 75 64 65 20 3c 6e 65 74 64 62 2e  #include <netdb.
2b90: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
2ba0: 6e 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  no.h>.#include <
2bb0: 73 79 73 2f 72 65 73 6f 75 72 63 65 2e 68 3e 0a  sys/resource.h>.
2bc0: 23 69 6e 63 6c 75 64 65 20 3c 73 69 67 6e 61 6c  #include <signal
2bd0: 2e 68 3e 0a 23 69 66 64 65 66 20 6c 69 6e 75 78  .h>.#ifdef linux
2be0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73  .#include <sys/s
2bf0: 65 6e 64 66 69 6c 65 2e 68 3e 0a 23 65 6e 64 69  endfile.h>.#endi
2c00: 66 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65  f.#include <asse
2c10: 72 74 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  rt.h>../*.** Con
2c20: 66 69 67 75 72 65 20 74 68 65 20 73 65 72 76 65  figure the serve
2c30: 72 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  r by setting the
2c40: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
2c50: 73 20 61 6e 64 20 72 65 63 6f 6d 70 69 6c 69 6e  s and recompilin
2c60: 67 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 44 45  g..*/.#ifndef DE
2c70: 46 41 55 4c 54 5f 50 4f 52 54 0a 23 64 65 66 69  FAULT_PORT.#defi
2c80: 6e 65 20 44 45 46 41 55 4c 54 5f 50 4f 52 54 20  ne DEFAULT_PORT 
2c90: 22 38 30 22 20 20 20 20 20 20 20 20 20 20 20 20  "80"            
2ca0: 20 2f 2a 20 44 65 66 61 75 6c 74 20 54 43 50 20   /* Default TCP 
2cb0: 70 6f 72 74 20 66 6f 72 20 48 54 54 50 20 2a 2f  port for HTTP */
2cc0: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
2cd0: 4d 41 58 5f 43 4f 4e 54 45 4e 54 5f 4c 45 4e 47  MAX_CONTENT_LENG
2ce0: 54 48 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 43  TH.#define MAX_C
2cf0: 4f 4e 54 45 4e 54 5f 4c 45 4e 47 54 48 20 32 35  ONTENT_LENGTH 25
2d00: 30 30 30 30 30 30 30 20 20 2f 2a 20 4d 61 78 20  0000000  /* Max 
2d10: 6c 65 6e 67 74 68 20 6f 66 20 48 54 54 50 20 72  length of HTTP r
2d20: 65 71 75 65 73 74 20 63 6f 6e 74 65 6e 74 20 2a  equest content *
2d30: 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
2d40: 57 65 20 72 65 63 6f 72 64 20 6d 6f 73 74 20 6f  We record most o
2d50: 66 20 74 68 65 20 73 74 61 74 65 20 69 6e 66 6f  f the state info
2d60: 72 6d 61 74 69 6f 6e 20 61 73 20 67 6c 6f 62 61  rmation as globa
2d70: 6c 20 76 61 72 69 61 62 6c 65 73 2e 20 20 54 68  l variables.  Th
2d80: 69 73 0a 2a 2a 20 73 61 76 65 73 20 68 61 76 69  is.** saves havi
2d90: 6e 67 20 74 6f 20 70 61 73 73 20 69 6e 66 6f 72  ng to pass infor
2da0: 6d 61 74 69 6f 6e 20 74 6f 20 73 75 62 72 6f 75  mation to subrou
2db0: 74 69 6e 65 73 20 61 73 20 70 61 72 61 6d 65 74  tines as paramet
2dc0: 65 72 73 2c 20 61 6e 64 0a 2a 2a 20 6d 61 6b 65  ers, and.** make
2dd0: 73 20 74 68 65 20 65 78 65 63 75 74 61 62 6c 65  s the executable
2de0: 20 73 6d 61 6c 6c 65 72 2e 2e 2e 0a 2a 2f 0a 73   smaller....*/.s
2df0: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 52 6f 6f  tatic char *zRoo
2e00: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
2e10: 2f 2a 20 52 6f 6f 74 20 64 69 72 65 63 74 6f 72  /* Root director
2e20: 79 20 6f 66 20 74 68 65 20 77 65 62 73 69 74 65  y of the website
2e30: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
2e40: 2a 7a 54 6d 70 4e 61 6d 20 3d 20 30 3b 20 20 20  *zTmpNam = 0;   
2e50: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2e60: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
2e70: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
2e80: 7a 54 6d 70 4e 61 6d 42 75 66 5b 35 30 30 5d 3b  zTmpNamBuf[500];
2e90: 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f       /* Space to
2ea0: 20 68 6f 6c 64 20 74 68 65 20 74 65 6d 70 6f 72   hold the tempor
2eb0: 61 72 79 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a  ary filename */.
2ec0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 50 72  static char *zPr
2ed0: 6f 74 6f 63 6f 6c 20 3d 20 30 3b 20 20 20 20 20  otocol = 0;     
2ee0: 20 2f 2a 20 54 68 65 20 70 72 6f 74 6f 63 6f 6c   /* The protocol
2ef0: 20 62 65 69 6e 67 20 75 73 69 6e 67 20 62 79 20   being using by 
2f00: 74 68 65 20 62 72 6f 77 73 65 72 20 2a 2f 0a 73  the browser */.s
2f10: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 4d 65 74  tatic char *zMet
2f20: 68 6f 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  hod = 0;        
2f30: 2f 2a 20 54 68 65 20 6d 65 74 68 6f 64 2e 20 20  /* The method.  
2f40: 4d 75 73 74 20 62 65 20 47 45 54 20 2a 2f 0a 73  Must be GET */.s
2f50: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 53 63 72  tatic char *zScr
2f60: 69 70 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ipt = 0;        
2f70: 2f 2a 20 54 68 65 20 6f 62 6a 65 63 74 20 74 6f  /* The object to
2f80: 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 73 74 61   retrieve */.sta
2f90: 74 69 63 20 63 68 61 72 20 2a 7a 52 65 61 6c 53  tic char *zRealS
2fa0: 63 72 69 70 74 20 3d 20 30 3b 20 20 20 20 2f 2a  cript = 0;    /*
2fb0: 20 54 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 72   The object to r
2fc0: 65 74 72 69 65 76 65 2e 20 20 53 61 6d 65 20 61  etrieve.  Same a
2fd0: 73 20 7a 53 63 72 69 70 74 0a 20 20 20 20 20 20  s zScript.      
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78             ** ex
3000: 63 65 70 74 20 6d 69 67 68 74 20 68 61 76 65 20  cept might have 
3010: 22 2f 69 6e 64 65 78 2e 68 74 6d 6c 22 20 61 70  "/index.html" ap
3020: 70 65 6e 64 65 64 20 2a 2f 0a 73 74 61 74 69 63  pended */.static
3030: 20 63 68 61 72 20 2a 7a 48 6f 6d 65 20 3d 20 30   char *zHome = 0
3040: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
3050: 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74  e directory cont
3060: 61 69 6e 69 6e 67 20 63 6f 6e 74 65 6e 74 20 2a  aining content *
3070: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a  /.static char *z
3080: 51 75 65 72 79 53 74 72 69 6e 67 20 3d 20 30 3b  QueryString = 0;
3090: 20 20 20 2f 2a 20 54 68 65 20 71 75 65 72 79 20     /* The query 
30a0: 73 74 72 69 6e 67 20 6f 6e 20 74 68 65 20 65 6e  string on the en
30b0: 64 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 2a 2f  d of the name */
30c0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 46  .static char *zF
30d0: 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ile = 0;        
30e0: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 6e 61 6d    /* The filenam
30f0: 65 20 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 20  e of the object 
3100: 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 73  to retrieve */.s
3110: 74 61 74 69 63 20 69 6e 74 20 6c 65 6e 46 69 6c  tatic int lenFil
3120: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
3130: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65  /* Length of the
3140: 20 7a 46 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 73   zFile name */.s
3150: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 44 69 72  tatic char *zDir
3160: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
3170: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
3180: 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 69 6e 67  irectory holding
3190: 20 7a 46 69 6c 65 20 2a 2f 0a 73 74 61 74 69 63   zFile */.static
31a0: 20 63 68 61 72 20 2a 7a 50 61 74 68 49 6e 66 6f   char *zPathInfo
31b0: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 50 61   = 0;      /* Pa
31c0: 72 74 20 6f 66 20 74 68 65 20 70 61 74 68 6e 61  rt of the pathna
31d0: 6d 65 20 70 61 73 74 20 74 68 65 20 66 69 6c 65  me past the file
31e0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
31f0: 2a 7a 41 67 65 6e 74 20 3d 20 30 3b 20 20 20 20  *zAgent = 0;    
3200: 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 79 70       /* What typ
3210: 65 20 69 66 20 62 72 6f 77 73 65 72 20 69 73 20  e if browser is 
3220: 6d 61 6b 69 6e 67 20 74 68 69 73 20 71 75 65 72  making this quer
3230: 79 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  y */.static char
3240: 20 2a 7a 53 65 72 76 65 72 4e 61 6d 65 20 3d 20   *zServerName = 
3250: 30 3b 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d  0;    /* The nam
3260: 65 20 61 66 74 65 72 20 74 68 65 20 68 74 74 70  e after the http
3270: 3a 2f 2f 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  :// */.static ch
3280: 61 72 20 2a 7a 53 65 72 76 65 72 50 6f 72 74 20  ar *zServerPort 
3290: 3d 20 30 3b 20 20 20 20 2f 2a 20 54 68 65 20 70  = 0;    /* The p
32a0: 6f 72 74 20 6e 75 6d 62 65 72 20 2a 2f 0a 73 74  ort number */.st
32b0: 61 74 69 63 20 63 68 61 72 20 2a 7a 43 6f 6f 6b  atic char *zCook
32c0: 69 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  ie = 0;        /
32d0: 2a 20 43 6f 6f 6b 69 65 73 20 72 65 70 6f 72 74  * Cookies report
32e0: 65 64 20 77 69 74 68 20 74 68 65 20 72 65 71 75  ed with the requ
32f0: 65 73 74 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  est */.static ch
3300: 61 72 20 2a 7a 48 74 74 70 48 6f 73 74 20 3d 20  ar *zHttpHost = 
3310: 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  0;      /* Name 
3320: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
3330: 20 77 65 62 20 62 72 6f 77 73 65 72 20 2a 2f 0a   web browser */.
3340: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 52 65  static char *zRe
3350: 61 6c 50 6f 72 74 20 3d 20 30 3b 20 20 20 20 20  alPort = 0;     
3360: 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 54 43 50   /* The real TCP
3370: 20 70 6f 72 74 20 77 68 65 6e 20 72 75 6e 6e 69   port when runni
3380: 6e 67 20 61 73 20 64 61 65 6d 6f 6e 20 2a 2f 0a  ng as daemon */.
3390: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 52 65  static char *zRe
33a0: 6d 6f 74 65 41 64 64 72 20 3d 20 30 3b 20 20 20  moteAddr = 0;   
33b0: 20 2f 2a 20 49 50 20 61 64 64 72 65 73 73 20 6f   /* IP address o
33c0: 66 20 74 68 65 20 72 65 71 75 65 73 74 20 2a 2f  f the request */
33d0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 52  .static char *zR
33e0: 65 66 65 72 65 72 20 3d 20 30 3b 20 20 20 20 20  eferer = 0;     
33f0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
3400: 20 70 61 67 65 20 74 68 61 74 20 72 65 66 65 72   page that refer
3410: 65 64 20 74 6f 20 75 73 20 2a 2f 0a 73 74 61 74  ed to us */.stat
3420: 69 63 20 63 68 61 72 20 2a 7a 41 63 63 65 70 74  ic char *zAccept
3430: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
3440: 57 68 61 74 20 66 6f 72 6d 61 74 73 20 77 69 6c  What formats wil
3450: 6c 20 62 65 20 61 63 63 65 70 74 65 64 20 2a 2f  l be accepted */
3460: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 41  .static char *zA
3470: 63 63 65 70 74 45 6e 63 6f 64 69 6e 67 20 3d 30  cceptEncoding =0
3480: 3b 20 2f 2a 20 67 7a 69 70 20 6f 72 20 64 65 66  ; /* gzip or def
3490: 61 75 6c 74 20 2a 2f 0a 73 74 61 74 69 63 20 63  ault */.static c
34a0: 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 4c 65 6e  har *zContentLen
34b0: 67 74 68 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74  gth = 0; /* Cont
34c0: 65 6e 74 20 6c 65 6e 67 74 68 20 72 65 70 6f 72  ent length repor
34d0: 74 65 64 20 69 6e 20 74 68 65 20 68 65 61 64 65  ted in the heade
34e0: 72 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  r */.static char
34f0: 20 2a 7a 43 6f 6e 74 65 6e 74 54 79 70 65 20 3d   *zContentType =
3500: 20 30 3b 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74   0;   /* Content
3510: 20 74 79 70 65 20 72 65 70 6f 72 74 65 64 20 69   type reported i
3520: 6e 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  n the header */.
3530: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 51 75  static char *zQu
3540: 65 72 79 53 75 66 66 69 78 20 3d 20 30 3b 20 20  erySuffix = 0;  
3550: 20 2f 2a 20 54 68 65 20 70 61 72 74 20 6f 66 20   /* The part of 
3560: 74 68 65 20 55 52 4c 20 61 66 74 65 72 20 74 68  the URL after th
3570: 65 20 66 69 72 73 74 20 3f 20 2a 2f 0a 73 74 61  e first ? */.sta
3580: 74 69 63 20 63 68 61 72 20 2a 7a 41 75 74 68 54  tic char *zAuthT
3590: 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  ype = 0;      /*
35a0: 20 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   Authorization t
35b0: 79 70 65 20 28 62 61 73 69 63 20 6f 72 20 64 69  ype (basic or di
35c0: 67 65 73 74 29 20 2a 2f 0a 73 74 61 74 69 63 20  gest) */.static 
35d0: 63 68 61 72 20 2a 7a 41 75 74 68 41 72 67 20 3d  char *zAuthArg =
35e0: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41 75 74   0;       /* Aut
35f0: 68 6f 72 69 7a 61 74 69 6f 6e 20 76 61 6c 75 65  horization value
3600: 73 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  s */.static char
3610: 20 2a 7a 52 65 6d 6f 74 65 55 73 65 72 20 3d 20   *zRemoteUser = 
3620: 30 3b 20 20 20 20 2f 2a 20 52 45 4d 4f 54 45 5f  0;    /* REMOTE_
3630: 55 53 45 52 20 73 65 74 20 62 79 20 61 75 74 68  USER set by auth
3640: 6f 72 69 7a 61 74 69 6f 6e 20 6d 6f 64 75 6c 65  orization module
3650: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
3660: 2a 7a 49 66 4e 6f 6e 65 4d 61 74 63 68 3d 20 30  *zIfNoneMatch= 0
3670: 3b 20 20 20 20 2f 2a 20 54 68 65 20 49 66 2d 4e  ;    /* The If-N
3680: 6f 6e 65 2d 4d 61 74 63 68 20 68 65 61 64 65 72  one-Match header
3690: 20 76 61 6c 75 65 20 2a 2f 0a 73 74 61 74 69 63   value */.static
36a0: 20 63 68 61 72 20 2a 7a 49 66 4d 6f 64 69 66 69   char *zIfModifi
36b0: 65 64 53 69 6e 63 65 3d 30 3b 20 2f 2a 20 54 68  edSince=0; /* Th
36c0: 65 20 49 66 2d 4d 6f 64 69 66 69 65 64 2d 53 69  e If-Modified-Si
36d0: 6e 63 65 20 68 65 61 64 65 72 20 76 61 6c 75 65  nce header value
36e0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e   */.static int n
36f0: 49 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  In = 0;         
3700: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3710: 66 20 62 79 74 65 73 20 6f 66 20 69 6e 70 75 74  f bytes of input
3720: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e   */.static int n
3730: 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Out = 0;        
3740: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3750: 66 20 62 79 74 65 73 20 6f 66 20 6f 75 74 70 75  f bytes of outpu
3760: 74 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  t */.static char
3770: 20 7a 52 65 70 6c 79 53 74 61 74 75 73 5b 34 5d   zReplyStatus[4]
3780: 3b 20 20 20 20 20 2f 2a 20 52 65 70 6c 79 20 73  ;     /* Reply s
3790: 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 73 74  tatus code */.st
37a0: 61 74 69 63 20 69 6e 74 20 73 74 61 74 75 73 53  atic int statusS
37b0: 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ent = 0;       /
37c0: 2a 20 54 72 75 65 20 61 66 74 65 72 20 73 74 61  * True after sta
37d0: 74 75 73 20 6c 69 6e 65 20 69 73 20 73 65 6e 74  tus line is sent
37e0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
37f0: 2a 7a 4c 6f 67 46 69 6c 65 20 3d 20 30 3b 20 20  *zLogFile = 0;  
3800: 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 6f 20 74       /* Log to t
3810: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 73 74 61 74  his file */.stat
3820: 69 63 20 69 6e 74 20 64 65 62 75 67 46 6c 61 67  ic int debugFlag
3830: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
3840: 54 72 75 65 20 69 66 20 62 65 69 6e 67 20 64 65  True if being de
3850: 62 75 67 67 65 64 20 2a 2f 0a 73 74 61 74 69 63  bugged */.static
3860: 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20   struct timeval 
3870: 62 65 67 69 6e 54 69 6d 65 3b 20 2f 2a 20 54 69  beginTime; /* Ti
3880: 6d 65 20 77 68 65 6e 20 74 68 69 73 20 70 72 6f  me when this pro
3890: 63 65 73 73 20 73 74 61 72 74 73 20 2a 2f 0a 73  cess starts */.s
38a0: 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 43  tatic int closeC
38b0: 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 30 3b 20 20  onnection = 0;  
38c0: 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 6e 64 20  /* True to send 
38d0: 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f 73  Connection: clos
38e0: 65 20 69 6e 20 72 65 70 6c 79 20 2a 2f 0a 73 74  e in reply */.st
38f0: 61 74 69 63 20 69 6e 74 20 6e 52 65 71 75 65 73  atic int nReques
3900: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  t = 0;         /
3910: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 71 75  * Number of requ
3920: 65 73 74 73 20 70 72 6f 63 65 73 73 65 64 20 2a  ests processed *
3930: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 6d 69  /.static int omi
3940: 74 4c 6f 67 20 3d 20 30 3b 20 20 20 20 20 20 20  tLog = 0;       
3950: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6d 61 6b     /* Do not mak
3960: 65 20 6c 6f 67 66 69 6c 65 20 65 6e 74 72 69 65  e logfile entrie
3970: 73 20 69 66 20 74 72 75 65 20 2a 2f 0a 73 74 61  s if true */.sta
3980: 74 69 63 20 69 6e 74 20 75 73 65 48 74 74 70 73  tic int useHttps
3990: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
39a0: 20 54 72 75 65 20 74 6f 20 75 73 65 20 48 54 54   True to use HTT
39b0: 50 53 3a 20 69 6e 73 74 65 61 64 20 6f 66 20 48  PS: instead of H
39c0: 54 54 50 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63  TTP: */.static c
39d0: 68 61 72 20 2a 7a 48 74 74 70 20 3d 20 22 68 74  har *zHttp = "ht
39e0: 74 70 22 3b 20 20 20 20 20 2f 2a 20 68 74 74 70  tp";     /* http
39f0: 20 6f 72 20 68 74 74 70 73 20 2a 2f 0a 73 74 61   or https */.sta
3a00: 74 69 63 20 69 6e 74 20 75 73 65 54 69 6d 65 6f  tic int useTimeo
3a10: 75 74 20 3d 20 31 3b 20 20 20 20 20 20 20 2f 2a  ut = 1;       /*
3a20: 20 54 72 75 65 20 74 6f 20 75 73 65 20 74 69 6d   True to use tim
3a30: 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es */.static int
3a40: 20 73 74 61 6e 64 61 6c 6f 6e 65 20 3d 20 30 3b   standalone = 0;
3a50: 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 20 61 73         /* Run as
3a60: 20 61 20 73 74 61 6e 64 61 6c 6f 6e 65 20 73 65   a standalone se
3a70: 72 76 65 72 20 28 6e 6f 20 69 6e 65 74 64 29 20  rver (no inetd) 
3a80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 70  */.static int ip
3a90: 76 36 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20  v6Only = 0;     
3aa0: 20 20 20 20 2f 2a 20 55 73 65 20 49 50 76 36 20      /* Use IPv6 
3ab0: 6f 6e 6c 79 20 2a 2f 0a 73 74 61 74 69 63 20 69  only */.static i
3ac0: 6e 74 20 69 70 76 34 4f 6e 6c 79 20 3d 20 30 3b  nt ipv4Only = 0;
3ad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
3ae0: 49 50 76 34 20 6f 6e 6c 79 20 2a 2f 0a 73 74 61  IPv4 only */.sta
3af0: 74 69 63 20 73 74 72 75 63 74 20 72 75 73 61 67  tic struct rusag
3b00: 65 20 70 72 69 6f 72 53 65 6c 66 3b 20 20 2f 2a  e priorSelf;  /*
3b10: 20 50 72 65 76 69 6f 75 73 6c 79 20 72 65 70 6f   Previously repo
3b20: 72 74 20 53 45 4c 46 20 74 69 6d 65 20 2a 2f 0a  rt SELF time */.
3b30: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 72 75  static struct ru
3b40: 73 61 67 65 20 70 72 69 6f 72 43 68 69 6c 64 3b  sage priorChild;
3b50: 20 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79 20 72   /* Previously r
3b60: 65 70 6f 72 74 20 43 48 49 4c 44 20 74 69 6d 65  eport CHILD time
3b70: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d   */.static int m
3b80: 78 41 67 65 20 3d 20 31 32 30 3b 20 20 20 20 20  xAge = 120;     
3b90: 20 20 20 20 20 2f 2a 20 43 61 63 68 65 2d 63 6f       /* Cache-co
3ba0: 6e 74 72 6f 6c 20 6d 61 78 2d 61 67 65 20 2a 2f  ntrol max-age */
3bb0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 65  .static char *de
3bc0: 66 61 75 6c 74 5f 70 61 74 68 20 3d 20 22 2f 62  fault_path = "/b
3bd0: 69 6e 3a 2f 75 73 72 2f 62 69 6e 22 3b 20 20 2f  in:/usr/bin";  /
3be0: 2a 20 44 65 66 61 75 6c 74 20 50 41 54 48 20 76  * Default PATH v
3bf0: 61 72 69 61 62 6c 65 20 2a 2f 0a 73 74 61 74 69  ariable */.stati
3c00: 63 20 63 68 61 72 20 2a 7a 53 63 67 69 20 3d 20  c char *zScgi = 
3c10: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  0;          /* V
3c20: 61 6c 75 65 20 6f 66 20 74 68 65 20 53 43 47 49  alue of the SCGI
3c30: 20 65 6e 76 20 76 61 72 69 61 62 6c 65 20 2a 2f   env variable */
3c40: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 70 70 69 6e 67 20  ../*.** Mapping 
3c50: 62 65 74 77 65 65 6e 20 43 47 49 20 76 61 72 69  between CGI vari
3c60: 61 62 6c 65 20 6e 61 6d 65 73 20 61 6e 64 20 76  able names and v
3c70: 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 0a  alues stored in.
3c80: 2a 2a 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ** global variab
3c90: 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  les..*/.static s
3ca0: 74 72 75 63 74 20 7b 0a 20 20 63 68 61 72 20 2a  truct {.  char *
3cb0: 7a 45 6e 76 4e 61 6d 65 3b 0a 20 20 63 68 61 72  zEnvName;.  char
3cc0: 20 2a 2a 70 7a 45 6e 76 56 61 6c 75 65 3b 0a 7d   **pzEnvValue;.}
3cd0: 20 63 67 69 65 6e 76 5b 5d 20 3d 20 7b 0a 20 20   cgienv[] = {.  
3ce0: 7b 20 22 43 4f 4e 54 45 4e 54 5f 4c 45 4e 47 54  { "CONTENT_LENGT
3cf0: 48 22 2c 20 20 20 20 20 20 20 20 20 20 26 7a 43  H",          &zC
3d00: 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 20 7d 2c 20  ontentLength }, 
3d10: 2f 2a 20 4d 75 73 74 20 62 65 20 66 69 72 73 74  /* Must be first
3d20: 20 66 6f 72 20 53 43 47 49 20 2a 2f 0a 20 20 7b   for SCGI */.  {
3d30: 20 22 41 55 54 48 5f 54 59 50 45 22 2c 20 20 20   "AUTH_TYPE",   
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d50: 26 7a 41 75 74 68 54 79 70 65 20 7d 2c 0a 20 20  &zAuthType },.  
3d60: 7b 20 22 41 55 54 48 5f 43 4f 4e 54 45 4e 54 22  { "AUTH_CONTENT"
3d70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3d80: 20 26 7a 41 75 74 68 41 72 67 20 7d 2c 0a 20 20   &zAuthArg },.  
3d90: 7b 20 22 43 4f 4e 54 45 4e 54 5f 54 59 50 45 22  { "CONTENT_TYPE"
3da0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3db0: 20 26 7a 43 6f 6e 74 65 6e 74 54 79 70 65 20 7d   &zContentType }
3dc0: 2c 0a 20 20 7b 20 22 44 4f 43 55 4d 45 4e 54 5f  ,.  { "DOCUMENT_
3dd0: 52 4f 4f 54 22 2c 20 20 20 20 20 20 20 20 20 20  ROOT",          
3de0: 20 20 20 20 20 26 7a 48 6f 6d 65 20 7d 2c 0a 20       &zHome },. 
3df0: 20 7b 20 22 48 54 54 50 5f 41 43 43 45 50 54 22   { "HTTP_ACCEPT"
3e00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3e10: 20 20 26 7a 41 63 63 65 70 74 20 7d 2c 0a 20 20    &zAccept },.  
3e20: 7b 20 22 48 54 54 50 5f 41 43 43 45 50 54 5f 45  { "HTTP_ACCEPT_E
3e30: 4e 43 4f 44 49 4e 47 22 2c 20 20 20 20 20 20 20  NCODING",       
3e40: 20 26 7a 41 63 63 65 70 74 45 6e 63 6f 64 69 6e   &zAcceptEncodin
3e50: 67 20 7d 2c 0a 20 20 7b 20 22 48 54 54 50 5f 43  g },.  { "HTTP_C
3e60: 4f 4f 4b 49 45 22 2c 20 20 20 20 20 20 20 20 20  OOKIE",         
3e70: 20 20 20 20 20 20 20 20 26 7a 43 6f 6f 6b 69 65          &zCookie
3e80: 20 7d 2c 0a 20 20 7b 20 22 48 54 54 50 5f 48 4f   },.  { "HTTP_HO
3e90: 53 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ST",            
3ea0: 20 20 20 20 20 20 20 26 7a 48 74 74 70 48 6f 73         &zHttpHos
3eb0: 74 20 7d 2c 0a 20 20 7b 20 22 48 54 54 50 5f 49  t },.  { "HTTP_I
3ec0: 46 5f 4d 4f 44 49 46 49 45 44 5f 53 49 4e 43 45  F_MODIFIED_SINCE
3ed0: 22 2c 20 20 20 20 20 20 26 7a 49 66 4d 6f 64 69  ",      &zIfModi
3ee0: 66 69 65 64 53 69 6e 63 65 20 7d 2c 0a 20 20 7b  fiedSince },.  {
3ef0: 20 22 48 54 54 50 5f 49 46 5f 4e 4f 4e 45 5f 4d   "HTTP_IF_NONE_M
3f00: 41 54 43 48 22 2c 20 20 20 20 20 20 20 20 20 20  ATCH",          
3f10: 26 7a 49 66 4e 6f 6e 65 4d 61 74 63 68 20 7d 2c  &zIfNoneMatch },
3f20: 0a 20 20 7b 20 22 48 54 54 50 5f 52 45 46 45 52  .  { "HTTP_REFER
3f30: 45 52 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ER",            
3f40: 20 20 20 20 26 7a 52 65 66 65 72 65 72 20 7d 2c      &zReferer },
3f50: 0a 20 20 7b 20 22 48 54 54 50 5f 55 53 45 52 5f  .  { "HTTP_USER_
3f60: 41 47 45 4e 54 22 2c 20 20 20 20 20 20 20 20 20  AGENT",         
3f70: 20 20 20 20 26 7a 41 67 65 6e 74 20 7d 2c 0a 20      &zAgent },. 
3f80: 20 7b 20 22 50 41 54 48 22 2c 20 20 20 20 20 20   { "PATH",      
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fa0: 20 20 26 64 65 66 61 75 6c 74 5f 70 61 74 68 20    &default_path 
3fb0: 7d 2c 0a 20 20 7b 20 22 50 41 54 48 5f 49 4e 46  },.  { "PATH_INF
3fc0: 4f 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  O",             
3fd0: 20 20 20 20 20 20 26 7a 50 61 74 68 49 6e 66 6f        &zPathInfo
3fe0: 20 7d 2c 0a 20 20 7b 20 22 51 55 45 52 59 5f 53   },.  { "QUERY_S
3ff0: 54 52 49 4e 47 22 2c 20 20 20 20 20 20 20 20 20  TRING",         
4000: 20 20 20 20 20 20 20 26 7a 51 75 65 72 79 53 74         &zQuerySt
4010: 72 69 6e 67 20 7d 2c 0a 20 20 7b 20 22 52 45 4d  ring },.  { "REM
4020: 4f 54 45 5f 41 44 44 52 22 2c 20 20 20 20 20 20  OTE_ADDR",      
4030: 20 20 20 20 20 20 20 20 20 20 20 26 7a 52 65 6d             &zRem
4040: 6f 74 65 41 64 64 72 20 7d 2c 0a 20 20 7b 20 22  oteAddr },.  { "
4050: 52 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 22 2c  REQUEST_METHOD",
4060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
4070: 4d 65 74 68 6f 64 20 7d 2c 0a 20 20 7b 20 22 52  Method },.  { "R
4080: 45 51 55 45 53 54 5f 55 52 49 22 2c 20 20 20 20  EQUEST_URI",    
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 53               &zS
40a0: 63 72 69 70 74 20 7d 2c 0a 20 20 7b 20 22 52 45  cript },.  { "RE
40b0: 4d 4f 54 45 5f 55 53 45 52 22 2c 20 20 20 20 20  MOTE_USER",     
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 52 65              &zRe
40d0: 6d 6f 74 65 55 73 65 72 20 7d 2c 0a 20 20 7b 20  moteUser },.  { 
40e0: 22 53 43 47 49 22 2c 20 20 20 20 20 20 20 20 20  "SCGI",         
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
4100: 7a 53 63 67 69 20 7d 2c 0a 20 20 7b 20 22 53 43  zScgi },.  { "SC
4110: 52 49 50 54 5f 44 49 52 45 43 54 4f 52 59 22 2c  RIPT_DIRECTORY",
4120: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 44 69              &zDi
4130: 72 20 7d 2c 0a 20 20 7b 20 22 53 43 52 49 50 54  r },.  { "SCRIPT
4140: 5f 46 49 4c 45 4e 41 4d 45 22 2c 20 20 20 20 20  _FILENAME",     
4150: 20 20 20 20 20 20 20 20 26 7a 46 69 6c 65 20 7d          &zFile }
4160: 2c 0a 20 20 7b 20 22 53 43 52 49 50 54 5f 4e 41  ,.  { "SCRIPT_NA
4170: 4d 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ME",            
4180: 20 20 20 20 20 26 7a 52 65 61 6c 53 63 72 69 70       &zRealScrip
4190: 74 20 7d 2c 0a 20 20 7b 20 22 53 45 52 56 45 52  t },.  { "SERVER
41a0: 5f 4e 41 4d 45 22 2c 20 20 20 20 20 20 20 20 20  _NAME",         
41b0: 20 20 20 20 20 20 20 20 26 7a 53 65 72 76 65 72          &zServer
41c0: 4e 61 6d 65 20 7d 2c 0a 20 20 7b 20 22 53 45 52  Name },.  { "SER
41d0: 56 45 52 5f 50 4f 52 54 22 2c 20 20 20 20 20 20  VER_PORT",      
41e0: 20 20 20 20 20 20 20 20 20 20 20 26 7a 53 65 72             &zSer
41f0: 76 65 72 50 6f 72 74 20 7d 2c 0a 20 20 7b 20 22  verPort },.  { "
4200: 53 45 52 56 45 52 5f 50 52 4f 54 4f 43 4f 4c 22  SERVER_PROTOCOL"
4210: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a  ,             &z
4220: 50 72 6f 74 6f 63 6f 6c 20 7d 2c 0a 7d 3b 0a 0a  Protocol },.};..
4230: 0a 2f 2a 0a 2a 2a 20 44 6f 75 62 6c 65 20 61 6e  ./*.** Double an
4240: 79 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 20 63  y double-quote c
4250: 68 61 72 61 63 74 65 72 73 20 69 6e 20 61 20 73  haracters in a s
4260: 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
4270: 20 63 68 61 72 20 2a 45 73 63 61 70 65 28 63 68   char *Escape(ch
4280: 61 72 20 2a 7a 29 7b 0a 20 20 73 69 7a 65 5f 74  ar *z){.  size_t
4290: 20 69 2c 20 6a 3b 0a 20 20 73 69 7a 65 5f 74 20   i, j;.  size_t 
42a0: 6e 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 63  n;.  char c;.  c
42b0: 68 61 72 20 2a 7a 4f 75 74 3b 0a 20 20 66 6f 72  har *zOut;.  for
42c0: 28 69 3d 30 3b 20 28 63 3d 7a 5b 69 5d 29 21 3d  (i=0; (c=z[i])!=
42d0: 30 20 26 26 20 63 21 3d 27 22 27 3b 20 69 2b 2b  0 && c!='"'; i++
42e0: 29 7b 7d 0a 20 20 69 66 28 20 63 3d 3d 30 20 29  ){}.  if( c==0 )
42f0: 20 72 65 74 75 72 6e 20 7a 3b 0a 20 20 6e 20 3d   return z;.  n =
4300: 20 31 3b 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 28   1;.  for(i++; (
4310: 63 3d 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29  c=z[i])!=0; i++)
4320: 7b 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 6e  { if( c=='"' ) n
4330: 2b 2b 3b 20 7d 0a 20 20 7a 4f 75 74 20 3d 20 6d  ++; }.  zOut = m
4340: 61 6c 6c 6f 63 28 20 69 2b 6e 2b 31 20 29 3b 0a  alloc( i+n+1 );.
4350: 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 20    if( zOut==0 ) 
4360: 72 65 74 75 72 6e 20 22 22 3b 0a 20 20 66 6f 72  return "";.  for
4370: 28 69 3d 6a 3d 30 3b 20 28 63 3d 7a 5b 69 5d 29  (i=j=0; (c=z[i])
4380: 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a  !=0; i++){.    z
4390: 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20  Out[j++] = c;.  
43a0: 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 7a    if( c=='"' ) z
43b0: 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20  Out[j++] = c;.  
43c0: 7d 0a 20 20 7a 4f 75 74 5b 6a 5d 20 3d 20 30 3b  }.  zOut[j] = 0;
43d0: 0a 20 20 72 65 74 75 72 6e 20 7a 4f 75 74 3b 0a  .  return zOut;.
43e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
43f0: 20 61 20 73 74 72 75 63 74 20 74 69 6d 65 76 61   a struct timeva
4400: 6c 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65  l into an intege
4410: 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  r number of mill
4420: 69 73 65 63 6f 6e 64 73 0a 2a 2f 0a 73 74 61 74  iseconds.*/.stat
4430: 69 63 20 69 6e 74 20 74 76 6d 73 28 73 74 72 75  ic int tvms(stru
4440: 63 74 20 74 69 6d 65 76 61 6c 20 2a 70 29 7b 0a  ct timeval *p){.
4450: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28 70    return (int)(p
4460: 2d 3e 74 76 5f 73 65 63 2a 31 30 30 30 30 30 30  ->tv_sec*1000000
4470: 20 2b 20 70 2d 3e 74 76 5f 75 73 65 63 29 3b 0a   + p->tv_usec);.
4480: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 6e  }../*.** Make an
4490: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6c 6f   entry in the lo
44a0: 67 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 20  g file.  If the 
44b0: 48 54 54 50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  HTTP connection 
44c0: 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 63 6c 6f  should be.** clo
44d0: 73 65 64 2c 20 74 68 65 6e 20 74 65 72 6d 69 6e  sed, then termin
44e0: 61 74 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ate this process
44f0: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 72 65 74  .  Otherwise ret
4500: 75 72 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  urn..*/.static v
4510: 6f 69 64 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79  oid MakeLogEntry
4520: 28 69 6e 74 20 65 78 69 74 43 6f 64 65 2c 20 69  (int exitCode, i
4530: 6e 74 20 6c 69 6e 65 4e 75 6d 29 7b 0a 20 20 46  nt lineNum){.  F
4540: 49 4c 45 20 2a 6c 6f 67 3b 0a 20 20 69 66 28 20  ILE *log;.  if( 
4550: 7a 54 6d 70 4e 61 6d 20 29 7b 0a 20 20 20 20 75  zTmpNam ){.    u
4560: 6e 6c 69 6e 6b 28 7a 54 6d 70 4e 61 6d 29 3b 0a  nlink(zTmpNam);.
4570: 20 20 7d 0a 20 20 69 66 28 20 7a 4c 6f 67 46 69    }.  if( zLogFi
4580: 6c 65 20 26 26 20 21 6f 6d 69 74 4c 6f 67 20 29  le && !omitLog )
4590: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 74 69 6d  {.    struct tim
45a0: 65 76 61 6c 20 6e 6f 77 3b 0a 20 20 20 20 73 74  eval now;.    st
45b0: 72 75 63 74 20 74 6d 20 2a 70 54 6d 3b 0a 20 20  ruct tm *pTm;.  
45c0: 20 20 73 74 72 75 63 74 20 72 75 73 61 67 65 20    struct rusage 
45d0: 73 65 6c 66 2c 20 63 68 69 6c 64 72 65 6e 3b 0a  self, children;.
45e0: 20 20 20 20 69 6e 74 20 77 61 69 74 53 74 61 74      int waitStat
45f0: 75 73 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 52  us;.    char *zR
4600: 4d 20 3d 20 7a 52 65 6d 6f 74 65 55 73 65 72 20  M = zRemoteUser 
4610: 3f 20 7a 52 65 6d 6f 74 65 55 73 65 72 20 3a 20  ? zRemoteUser : 
4620: 22 22 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 46  "";.    char *zF
4630: 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 73 69 7a  ilename;.    siz
4640: 65 5f 74 20 73 7a 3b 0a 20 20 20 20 63 68 61 72  e_t sz;.    char
4650: 20 7a 44 61 74 65 5b 32 30 30 5d 3b 0a 20 20 20   zDate[200];.   
4660: 20 63 68 61 72 20 7a 45 78 70 4c 6f 67 46 69 6c   char zExpLogFil
4670: 65 5b 35 30 30 5d 3b 0a 0a 20 20 20 20 69 66 28  e[500];..    if(
4680: 20 7a 53 63 72 69 70 74 3d 3d 30 20 29 20 7a 53   zScript==0 ) zS
4690: 63 72 69 70 74 20 3d 20 22 22 3b 0a 20 20 20 20  cript = "";.    
46a0: 69 66 28 20 7a 52 65 61 6c 53 63 72 69 70 74 3d  if( zRealScript=
46b0: 3d 30 20 29 20 7a 52 65 61 6c 53 63 72 69 70 74  =0 ) zRealScript
46c0: 20 3d 20 22 22 3b 0a 20 20 20 20 69 66 28 20 7a   = "";.    if( z
46d0: 52 65 6d 6f 74 65 41 64 64 72 3d 3d 30 20 29 20  RemoteAddr==0 ) 
46e0: 7a 52 65 6d 6f 74 65 41 64 64 72 20 3d 20 22 22  zRemoteAddr = ""
46f0: 3b 0a 20 20 20 20 69 66 28 20 7a 48 74 74 70 48  ;.    if( zHttpH
4700: 6f 73 74 3d 3d 30 20 29 20 7a 48 74 74 70 48 6f  ost==0 ) zHttpHo
4710: 73 74 20 3d 20 22 22 3b 0a 20 20 20 20 69 66 28  st = "";.    if(
4720: 20 7a 52 65 66 65 72 65 72 3d 3d 30 20 29 20 7a   zReferer==0 ) z
4730: 52 65 66 65 72 65 72 20 3d 20 22 22 3b 0a 20 20  Referer = "";.  
4740: 20 20 69 66 28 20 7a 41 67 65 6e 74 3d 3d 30 20    if( zAgent==0 
4750: 29 20 7a 41 67 65 6e 74 20 3d 20 22 22 3b 0a 20  ) zAgent = "";. 
4760: 20 20 20 67 65 74 74 69 6d 65 6f 66 64 61 79 28     gettimeofday(
4770: 26 6e 6f 77 2c 20 30 29 3b 0a 20 20 20 20 70 54  &now, 0);.    pT
4780: 6d 20 3d 20 6c 6f 63 61 6c 74 69 6d 65 28 26 6e  m = localtime(&n
4790: 6f 77 2e 74 76 5f 73 65 63 29 3b 0a 20 20 20 20  ow.tv_sec);.    
47a0: 73 74 72 66 74 69 6d 65 28 7a 44 61 74 65 2c 20  strftime(zDate, 
47b0: 73 69 7a 65 6f 66 28 7a 44 61 74 65 29 2c 20 22  sizeof(zDate), "
47c0: 25 59 2d 25 6d 2d 25 64 20 25 48 3a 25 4d 3a 25  %Y-%m-%d %H:%M:%
47d0: 53 22 2c 20 70 54 6d 29 3b 0a 20 20 20 20 73 7a  S", pTm);.    sz
47e0: 20 3d 20 73 74 72 66 74 69 6d 65 28 7a 45 78 70   = strftime(zExp
47f0: 4c 6f 67 46 69 6c 65 2c 20 73 69 7a 65 6f 66 28  LogFile, sizeof(
4800: 7a 45 78 70 4c 6f 67 46 69 6c 65 29 2c 20 7a 4c  zExpLogFile), zL
4810: 6f 67 46 69 6c 65 2c 20 70 54 6d 29 3b 0a 20 20  ogFile, pTm);.  
4820: 20 20 69 66 28 20 73 7a 3e 30 20 26 26 20 73 7a    if( sz>0 && sz
4830: 3c 73 69 7a 65 6f 66 28 7a 45 78 70 4c 6f 67 46  <sizeof(zExpLogF
4840: 69 6c 65 29 2d 32 20 29 7b 0a 20 20 20 20 20 20  ile)-2 ){.      
4850: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 45 78 70  zFilename = zExp
4860: 4c 6f 67 46 69 6c 65 3b 0a 20 20 20 20 7d 65 6c  LogFile;.    }el
4870: 73 65 7b 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e  se{.      zFilen
4880: 61 6d 65 20 3d 20 7a 4c 6f 67 46 69 6c 65 3b 0a  ame = zLogFile;.
4890: 20 20 20 20 7d 0a 20 20 20 20 77 61 69 74 70 69      }.    waitpi
48a0: 64 28 2d 31 2c 20 26 77 61 69 74 53 74 61 74 75  d(-1, &waitStatu
48b0: 73 2c 20 57 4e 4f 48 41 4e 47 29 3b 0a 20 20 20  s, WNOHANG);.   
48c0: 20 67 65 74 72 75 73 61 67 65 28 52 55 53 41 47   getrusage(RUSAG
48d0: 45 5f 53 45 4c 46 2c 20 26 73 65 6c 66 29 3b 0a  E_SELF, &self);.
48e0: 20 20 20 20 67 65 74 72 75 73 61 67 65 28 52 55      getrusage(RU
48f0: 53 41 47 45 5f 43 48 49 4c 44 52 45 4e 2c 20 26  SAGE_CHILDREN, &
4900: 63 68 69 6c 64 72 65 6e 29 3b 0a 20 20 20 20 69  children);.    i
4910: 66 28 20 28 6c 6f 67 20 3d 20 66 6f 70 65 6e 28  f( (log = fopen(
4920: 7a 46 69 6c 65 6e 61 6d 65 2c 22 61 22 29 29 21  zFilename,"a"))!
4930: 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 43 4f 4d  =0 ){.#ifdef COM
4940: 42 49 4e 45 44 5f 4c 4f 47 5f 46 4f 52 4d 41 54  BINED_LOG_FORMAT
4950: 0a 20 20 20 20 20 20 73 74 72 66 74 69 6d 65 28  .      strftime(
4960: 7a 44 61 74 65 2c 20 73 69 7a 65 6f 66 28 7a 44  zDate, sizeof(zD
4970: 61 74 65 29 2c 20 22 25 64 2f 25 62 2f 25 59 3a  ate), "%d/%b/%Y:
4980: 25 48 3a 25 4d 3a 25 53 20 25 7a 22 2c 20 70 54  %H:%M:%S %z", pT
4990: 6d 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  m);.      fprint
49a0: 66 28 6c 6f 67 2c 20 22 25 73 20 2d 20 2d 20 5b  f(log, "%s - - [
49b0: 25 73 5d 20 5c 22 25 73 20 25 73 20 25 73 5c 22  %s] \"%s %s %s\"
49c0: 20 25 73 20 25 64 20 5c 22 25 73 5c 22 20 5c 22   %s %d \"%s\" \"
49d0: 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %s\"\n",.       
49e0: 20 20 20 20 20 20 20 7a 52 65 6d 6f 74 65 41 64         zRemoteAd
49f0: 64 72 2c 20 7a 44 61 74 65 2c 20 7a 4d 65 74 68  dr, zDate, zMeth
4a00: 6f 64 2c 20 7a 53 63 72 69 70 74 2c 20 7a 50 72  od, zScript, zPr
4a10: 6f 74 6f 63 6f 6c 2c 0a 20 20 20 20 20 20 20 20  otocol,.        
4a20: 20 20 20 20 20 20 7a 52 65 70 6c 79 53 74 61 74        zReplyStat
4a30: 75 73 2c 20 6e 4f 75 74 2c 20 7a 52 65 66 65 72  us, nOut, zRefer
4a40: 65 72 2c 20 7a 41 67 65 6e 74 29 3b 0a 23 65 6c  er, zAgent);.#el
4a50: 73 65 0a 20 20 20 20 20 20 73 74 72 66 74 69 6d  se.      strftim
4a60: 65 28 7a 44 61 74 65 2c 20 73 69 7a 65 6f 66 28  e(zDate, sizeof(
4a70: 7a 44 61 74 65 29 2c 20 22 25 59 2d 25 6d 2d 25  zDate), "%Y-%m-%
4a80: 64 20 25 48 3a 25 4d 3a 25 53 22 2c 20 70 54 6d  d %H:%M:%S", pTm
4a90: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20  );.      /* Log 
4aa0: 72 65 63 6f 72 64 20 66 69 6c 65 73 3a 0a 20 20  record files:.  
4ab0: 20 20 20 20 2a 2a 20 20 28 31 29 20 44 61 74 65      **  (1) Date
4ac0: 20 61 6e 64 20 74 69 6d 65 0a 20 20 20 20 20 20   and time.      
4ad0: 2a 2a 20 20 28 32 29 20 49 50 20 61 64 64 72 65  **  (2) IP addre
4ae0: 73 73 0a 20 20 20 20 20 20 2a 2a 20 20 28 33 29  ss.      **  (3)
4af0: 20 55 52 4c 20 62 65 69 6e 67 20 61 63 63 65 73   URL being acces
4b00: 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 20 28 34  sed.      **  (4
4b10: 29 20 52 65 66 65 72 65 72 0a 20 20 20 20 20 20  ) Referer.      
4b20: 2a 2a 20 20 28 35 29 20 52 65 70 6c 79 20 73 74  **  (5) Reply st
4b30: 61 74 75 73 0a 20 20 20 20 20 20 2a 2a 20 20 28  atus.      **  (
4b40: 36 29 20 42 79 74 65 73 20 72 65 63 65 69 76 65  6) Bytes receive
4b50: 64 0a 20 20 20 20 20 20 2a 2a 20 20 28 37 29 20  d.      **  (7) 
4b60: 42 79 74 65 73 20 73 65 6e 74 0a 20 20 20 20 20  Bytes sent.     
4b70: 20 2a 2a 20 20 28 38 29 20 53 65 6c 66 20 75 73   **  (8) Self us
4b80: 65 72 20 74 69 6d 65 0a 20 20 20 20 20 20 2a 2a  er time.      **
4b90: 20 20 28 39 29 20 53 65 6c 66 20 73 79 73 74 65    (9) Self syste
4ba0: 6d 20 74 69 6d 65 0a 20 20 20 20 20 20 2a 2a 20  m time.      ** 
4bb0: 28 31 30 29 20 43 68 69 6c 64 72 65 6e 20 75 73  (10) Children us
4bc0: 65 72 20 74 69 6d 65 0a 20 20 20 20 20 20 2a 2a  er time.      **
4bd0: 20 28 31 31 29 20 43 68 69 6c 64 72 65 6e 20 73   (11) Children s
4be0: 79 73 74 65 6d 20 74 69 6d 65 0a 20 20 20 20 20  ystem time.     
4bf0: 20 2a 2a 20 28 31 32 29 20 54 6f 74 61 6c 20 77   ** (12) Total w
4c00: 61 6c 6c 2d 63 6c 6f 63 6b 20 74 69 6d 65 0a 20  all-clock time. 
4c10: 20 20 20 20 20 2a 2a 20 28 31 33 29 20 52 65 71       ** (13) Req
4c20: 75 65 73 74 20 6e 75 6d 62 65 72 20 66 6f 72 20  uest number for 
4c30: 73 61 6d 65 20 54 43 50 2f 49 50 20 63 6f 6e 6e  same TCP/IP conn
4c40: 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ection.      ** 
4c50: 28 31 34 29 20 55 73 65 72 20 61 67 65 6e 74 0a  (14) User agent.
4c60: 20 20 20 20 20 20 2a 2a 20 28 31 35 29 20 52 65        ** (15) Re
4c70: 6d 6f 74 65 20 75 73 65 72 0a 20 20 20 20 20 20  mote user.      
4c80: 2a 2a 20 28 31 36 29 20 42 79 74 65 73 20 6f 66  ** (16) Bytes of
4c90: 20 55 52 4c 20 74 68 61 74 20 63 6f 72 72 65 73   URL that corres
4ca0: 70 6f 6e 64 20 74 6f 20 74 68 65 20 53 43 52 49  pond to the SCRI
4cb0: 50 54 5f 4e 41 4d 45 0a 20 20 20 20 20 20 2a 2a  PT_NAME.      **
4cc0: 20 28 31 37 29 20 4c 69 6e 65 20 6e 75 6d 62 65   (17) Line numbe
4cd0: 72 20 69 6e 20 73 6f 75 72 63 65 20 66 69 6c 65  r in source file
4ce0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
4cf0: 66 70 72 69 6e 74 66 28 6c 6f 67 2c 0a 20 20 20  fprintf(log,.   
4d00: 20 20 20 20 20 22 25 73 2c 25 73 2c 5c 22 25 73       "%s,%s,\"%s
4d10: 3a 2f 2f 25 73 25 73 5c 22 2c 5c 22 25 73 5c 22  ://%s%s\",\"%s\"
4d20: 2c 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 25  ,".           "%
4d30: 73 2c 25 64 2c 25 64 2c 25 64 2c 25 64 2c 25 64  s,%d,%d,%d,%d,%d
4d40: 2c 25 64 2c 25 64 2c 25 64 2c 5c 22 25 73 5c 22  ,%d,%d,%d,\"%s\"
4d50: 2c 5c 22 25 73 5c 22 2c 25 64 2c 25 64 5c 6e 22  ,\"%s\",%d,%d\n"
4d60: 2c 0a 20 20 20 20 20 20 20 20 7a 44 61 74 65 2c  ,.        zDate,
4d70: 20 7a 52 65 6d 6f 74 65 41 64 64 72 2c 20 7a 48   zRemoteAddr, zH
4d80: 74 74 70 2c 20 45 73 63 61 70 65 28 7a 48 74 74  ttp, Escape(zHtt
4d90: 70 48 6f 73 74 29 2c 20 45 73 63 61 70 65 28 7a  pHost), Escape(z
4da0: 53 63 72 69 70 74 29 2c 0a 20 20 20 20 20 20 20  Script),.       
4db0: 20 45 73 63 61 70 65 28 7a 52 65 66 65 72 65 72   Escape(zReferer
4dc0: 29 2c 20 7a 52 65 70 6c 79 53 74 61 74 75 73 2c  ), zReplyStatus,
4dd0: 20 6e 49 6e 2c 20 6e 4f 75 74 2c 0a 20 20 20 20   nIn, nOut,.    
4de0: 20 20 20 20 74 76 6d 73 28 26 73 65 6c 66 2e 72      tvms(&self.r
4df0: 75 5f 75 74 69 6d 65 29 20 2d 20 74 76 6d 73 28  u_utime) - tvms(
4e00: 26 70 72 69 6f 72 53 65 6c 66 2e 72 75 5f 75 74  &priorSelf.ru_ut
4e10: 69 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 74 76  ime),.        tv
4e20: 6d 73 28 26 73 65 6c 66 2e 72 75 5f 73 74 69 6d  ms(&self.ru_stim
4e30: 65 29 20 2d 20 74 76 6d 73 28 26 70 72 69 6f 72  e) - tvms(&prior
4e40: 53 65 6c 66 2e 72 75 5f 73 74 69 6d 65 29 2c 0a  Self.ru_stime),.
4e50: 20 20 20 20 20 20 20 20 74 76 6d 73 28 26 63 68          tvms(&ch
4e60: 69 6c 64 72 65 6e 2e 72 75 5f 75 74 69 6d 65 29  ildren.ru_utime)
4e70: 20 2d 20 74 76 6d 73 28 26 70 72 69 6f 72 43 68   - tvms(&priorCh
4e80: 69 6c 64 2e 72 75 5f 75 74 69 6d 65 29 2c 0a 20  ild.ru_utime),. 
4e90: 20 20 20 20 20 20 20 74 76 6d 73 28 26 63 68 69         tvms(&chi
4ea0: 6c 64 72 65 6e 2e 72 75 5f 73 74 69 6d 65 29 20  ldren.ru_stime) 
4eb0: 2d 20 74 76 6d 73 28 26 70 72 69 6f 72 43 68 69  - tvms(&priorChi
4ec0: 6c 64 2e 72 75 5f 73 74 69 6d 65 29 2c 0a 20 20  ld.ru_stime),.  
4ed0: 20 20 20 20 20 20 74 76 6d 73 28 26 6e 6f 77 29        tvms(&now)
4ee0: 20 2d 20 74 76 6d 73 28 26 62 65 67 69 6e 54 69   - tvms(&beginTi
4ef0: 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 6e 52 65  me),.        nRe
4f00: 71 75 65 73 74 2c 20 45 73 63 61 70 65 28 7a 41  quest, Escape(zA
4f10: 67 65 6e 74 29 2c 20 45 73 63 61 70 65 28 7a 52  gent), Escape(zR
4f20: 4d 29 2c 0a 20 20 20 20 20 20 20 20 28 69 6e 74  M),.        (int
4f30: 29 28 73 74 72 6c 65 6e 28 7a 48 74 74 70 29 2b  )(strlen(zHttp)+
4f40: 73 74 72 6c 65 6e 28 7a 48 74 74 70 48 6f 73 74  strlen(zHttpHost
4f50: 29 2b 73 74 72 6c 65 6e 28 7a 52 65 61 6c 53 63  )+strlen(zRealSc
4f60: 72 69 70 74 29 2b 33 29 2c 0a 20 20 20 20 20 20  ript)+3),.      
4f70: 20 20 6c 69 6e 65 4e 75 6d 0a 20 20 20 20 20 20    lineNum.      
4f80: 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 53 65  );.      priorSe
4f90: 6c 66 20 3d 20 73 65 6c 66 3b 0a 20 20 20 20 20  lf = self;.     
4fa0: 20 70 72 69 6f 72 43 68 69 6c 64 20 3d 20 63 68   priorChild = ch
4fb0: 69 6c 64 72 65 6e 3b 0a 20 20 20 20 20 20 62 65  ildren;.      be
4fc0: 67 69 6e 54 69 6d 65 20 3d 20 6e 6f 77 3b 0a 23  ginTime = now;.#
4fd0: 65 6e 64 69 66 0a 20 20 20 20 20 20 66 63 6c 6f  endif.      fclo
4fe0: 73 65 28 6c 6f 67 29 3b 0a 20 20 20 20 20 20 6e  se(log);.      n
4ff0: 49 6e 20 3d 20 6e 4f 75 74 20 3d 20 30 3b 0a 20  In = nOut = 0;. 
5000: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 63     }.  }.  if( c
5010: 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 29  loseConnection )
5020: 7b 0a 20 20 20 20 65 78 69 74 28 65 78 69 74 43  {.    exit(exitC
5030: 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 73 74 61 74  ode);.  }.  stat
5040: 75 73 53 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  usSent = 0;.}../
5050: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65  *.** Allocate me
5060: 6d 6f 72 79 20 73 61 66 65 6c 79 0a 2a 2f 0a 73  mory safely.*/.s
5070: 74 61 74 69 63 20 63 68 61 72 20 2a 53 61 66 65  tatic char *Safe
5080: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 5f 74 20 73  Malloc( size_t s
5090: 69 7a 65 20 29 7b 0a 20 20 63 68 61 72 20 2a 70  ize ){.  char *p
50a0: 3b 0a 0a 20 20 70 20 3d 20 28 63 68 61 72 2a 29  ;..  p = (char*)
50b0: 6d 61 6c 6c 6f 63 28 73 69 7a 65 29 3b 0a 20 20  malloc(size);.  
50c0: 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
50d0: 73 74 72 63 70 79 28 7a 52 65 70 6c 79 53 74 61  strcpy(zReplySta
50e0: 74 75 73 2c 20 22 39 39 38 22 29 3b 0a 20 20 20  tus, "998");.   
50f0: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 31 2c   MakeLogEntry(1,
5100: 31 30 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 4d  100);  /* LOG: M
5110: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 2a  alloc() failed *
5120: 2f 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  /.    exit(1);. 
5130: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
5140: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
5150: 76 61 6c 75 65 20 6f 66 20 65 6e 76 69 72 6f 6e  value of environ
5160: 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 7a 56  ment variable zV
5170: 61 72 20 74 6f 20 7a 56 61 6c 75 65 2e 0a 2a 2f  ar to zValue..*/
5180: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 65 74  .static void Set
5190: 45 6e 76 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  Env(const char *
51a0: 7a 56 61 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  zVar, const char
51b0: 20 2a 7a 56 61 6c 75 65 29 7b 0a 20 20 63 68 61   *zValue){.  cha
51c0: 72 20 2a 7a 3b 0a 20 20 73 69 7a 65 5f 74 20 6c  r *z;.  size_t l
51d0: 65 6e 3b 0a 20 20 69 66 28 20 7a 56 61 6c 75 65  en;.  if( zValue
51e0: 3d 3d 30 20 29 20 7a 56 61 6c 75 65 3d 22 22 3b  ==0 ) zValue="";
51f0: 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 61 6e  .  /* Disable an
5200: 20 61 74 74 65 6d 70 74 65 64 20 62 61 73 68 64   attempted bashd
5210: 6f 6f 72 20 61 74 74 61 63 6b 20 2a 2f 0a 20 20  oor attack */.  
5220: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 56 61 6c  if( strncmp(zVal
5230: 75 65 2c 22 28 29 20 7b 22 2c 34 29 3d 3d 30 20  ue,"() {",4)==0 
5240: 29 20 7a 56 61 6c 75 65 20 3d 20 22 22 3b 0a 20  ) zValue = "";. 
5250: 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 56   len = strlen(zV
5260: 61 72 29 20 2b 20 73 74 72 6c 65 6e 28 7a 56 61  ar) + strlen(zVa
5270: 6c 75 65 29 20 2b 20 32 3b 0a 20 20 7a 20 3d 20  lue) + 2;.  z = 
5280: 53 61 66 65 4d 61 6c 6c 6f 63 28 6c 65 6e 29 3b  SafeMalloc(len);
5290: 0a 20 20 73 70 72 69 6e 74 66 28 7a 2c 22 25 73  .  sprintf(z,"%s
52a0: 3d 25 73 22 2c 7a 56 61 72 2c 7a 56 61 6c 75 65  =%s",zVar,zValue
52b0: 29 3b 0a 20 20 70 75 74 65 6e 76 28 7a 29 3b 0a  );.  putenv(z);.
52c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
52d0: 74 68 65 20 66 69 72 73 74 20 73 70 61 63 65 2d  the first space-
52e0: 64 65 6c 69 6d 69 74 65 64 20 74 6f 6b 65 6e 20  delimited token 
52f0: 66 72 6f 6d 20 61 20 73 74 72 69 6e 67 20 61 6e  from a string an
5300: 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f  d return.** a po
5310: 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 41 64  inter to it.  Ad
5320: 64 20 61 20 4e 55 4c 4c 20 74 6f 20 74 68 65 20  d a NULL to the 
5330: 73 74 72 69 6e 67 20 74 6f 20 74 65 72 6d 69 6e  string to termin
5340: 61 74 65 20 74 68 65 20 74 6f 6b 65 6e 2e 0a 2a  ate the token..*
5350: 2a 20 4d 61 6b 65 20 2a 7a 4c 65 66 74 4f 76 65  * Make *zLeftOve
5360: 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  r point to the s
5370: 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74  tart of the next
5380: 20 74 6f 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69   token..*/.stati
5390: 63 20 63 68 61 72 20 2a 47 65 74 46 69 72 73 74  c char *GetFirst
53a0: 45 6c 65 6d 65 6e 74 28 63 68 61 72 20 2a 7a 49  Element(char *zI
53b0: 6e 70 75 74 2c 20 63 68 61 72 20 2a 2a 7a 4c 65  nput, char **zLe
53c0: 66 74 4f 76 65 72 29 7b 0a 20 20 63 68 61 72 20  ftOver){.  char 
53d0: 2a 7a 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20  *zResult = 0;.  
53e0: 69 66 28 20 7a 49 6e 70 75 74 3d 3d 30 20 29 7b  if( zInput==0 ){
53f0: 0a 20 20 20 20 69 66 28 20 7a 4c 65 66 74 4f 76  .    if( zLeftOv
5400: 65 72 20 29 20 2a 7a 4c 65 66 74 4f 76 65 72 20  er ) *zLeftOver 
5410: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
5420: 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  0;.  }.  while( 
5430: 69 73 73 70 61 63 65 28 2a 28 75 6e 73 69 67 6e  isspace(*(unsign
5440: 65 64 20 63 68 61 72 2a 29 7a 49 6e 70 75 74 29  ed char*)zInput)
5450: 20 29 7b 20 7a 49 6e 70 75 74 2b 2b 3b 20 7d 0a   ){ zInput++; }.
5460: 20 20 7a 52 65 73 75 6c 74 20 3d 20 7a 49 6e 70    zResult = zInp
5470: 75 74 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 49  ut;.  while( *zI
5480: 6e 70 75 74 20 26 26 20 21 69 73 73 70 61 63 65  nput && !isspace
5490: 28 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  (*(unsigned char
54a0: 2a 29 7a 49 6e 70 75 74 29 20 29 7b 20 7a 49 6e  *)zInput) ){ zIn
54b0: 70 75 74 2b 2b 3b 20 7d 0a 20 20 69 66 28 20 2a  put++; }.  if( *
54c0: 7a 49 6e 70 75 74 20 29 7b 0a 20 20 20 20 2a 7a  zInput ){.    *z
54d0: 49 6e 70 75 74 20 3d 20 30 3b 0a 20 20 20 20 7a  Input = 0;.    z
54e0: 49 6e 70 75 74 2b 2b 3b 0a 20 20 20 20 77 68 69  Input++;.    whi
54f0: 6c 65 28 20 69 73 73 70 61 63 65 28 2a 28 75 6e  le( isspace(*(un
5500: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 49 6e  signed char*)zIn
5510: 70 75 74 29 20 29 7b 20 7a 49 6e 70 75 74 2b 2b  put) ){ zInput++
5520: 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4c  ; }.  }.  if( zL
5530: 65 66 74 4f 76 65 72 20 29 7b 20 2a 7a 4c 65 66  eftOver ){ *zLef
5540: 74 4f 76 65 72 20 3d 20 7a 49 6e 70 75 74 3b 20  tOver = zInput; 
5550: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 73 75  }.  return zResu
5560: 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  lt;.}../*.** Mak
5570: 65 20 61 20 63 6f 70 79 20 6f 66 20 61 20 73 74  e a copy of a st
5580: 72 69 6e 67 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  ring into memory
5590: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
55a0: 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  alloc..*/.static
55b0: 20 63 68 61 72 20 2a 53 74 72 44 75 70 28 63 6f   char *StrDup(co
55c0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63 29 7b  nst char *zSrc){
55d0: 0a 20 20 63 68 61 72 20 2a 7a 44 65 73 74 3b 0a  .  char *zDest;.
55e0: 20 20 73 69 7a 65 5f 74 20 73 69 7a 65 3b 0a 0a    size_t size;..
55f0: 20 20 69 66 28 20 7a 53 72 63 3d 3d 30 20 29 20    if( zSrc==0 ) 
5600: 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 69 7a 65  return 0;.  size
5610: 20 3d 20 73 74 72 6c 65 6e 28 7a 53 72 63 29 20   = strlen(zSrc) 
5620: 2b 20 31 3b 0a 20 20 7a 44 65 73 74 20 3d 20 28  + 1;.  zDest = (
5630: 63 68 61 72 2a 29 53 61 66 65 4d 61 6c 6c 6f 63  char*)SafeMalloc
5640: 28 20 73 69 7a 65 20 29 3b 0a 20 20 73 74 72 63  ( size );.  strc
5650: 70 79 28 7a 44 65 73 74 2c 7a 53 72 63 29 3b 0a  py(zDest,zSrc);.
5660: 20 20 72 65 74 75 72 6e 20 7a 44 65 73 74 3b 0a    return zDest;.
5670: 7d 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 53  }.static char *S
5680: 74 72 41 70 70 65 6e 64 28 63 68 61 72 20 2a 7a  trAppend(char *z
5690: 50 72 69 6f 72 2c 20 63 6f 6e 73 74 20 63 68 61  Prior, const cha
56a0: 72 20 2a 7a 53 65 70 2c 20 63 6f 6e 73 74 20 63  r *zSep, const c
56b0: 68 61 72 20 2a 7a 53 72 63 29 7b 0a 20 20 63 68  har *zSrc){.  ch
56c0: 61 72 20 2a 7a 44 65 73 74 3b 0a 20 20 73 69 7a  ar *zDest;.  siz
56d0: 65 5f 74 20 73 69 7a 65 3b 0a 20 20 73 69 7a 65  e_t size;.  size
56e0: 5f 74 20 6e 30 2c 20 6e 31 2c 20 6e 32 3b 0a 0a  _t n0, n1, n2;..
56f0: 20 20 69 66 28 20 7a 53 72 63 3d 3d 30 20 29 20    if( zSrc==0 ) 
5700: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
5710: 7a 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75  zPrior==0 ) retu
5720: 72 6e 20 53 74 72 44 75 70 28 7a 53 72 63 29 3b  rn StrDup(zSrc);
5730: 0a 20 20 6e 30 20 3d 20 73 74 72 6c 65 6e 28 7a  .  n0 = strlen(z
5740: 50 72 69 6f 72 29 3b 0a 20 20 6e 31 20 3d 20 73  Prior);.  n1 = s
5750: 74 72 6c 65 6e 28 7a 53 65 70 29 3b 0a 20 20 6e  trlen(zSep);.  n
5760: 32 20 3d 20 73 74 72 6c 65 6e 28 7a 53 72 63 29  2 = strlen(zSrc)
5770: 3b 0a 20 20 73 69 7a 65 20 3d 20 6e 30 2b 6e 31  ;.  size = n0+n1
5780: 2b 6e 32 2b 31 3b 0a 20 20 7a 44 65 73 74 20 3d  +n2+1;.  zDest =
5790: 20 28 63 68 61 72 2a 29 53 61 66 65 4d 61 6c 6c   (char*)SafeMall
57a0: 6f 63 28 20 73 69 7a 65 20 29 3b 0a 20 20 6d 65  oc( size );.  me
57b0: 6d 63 70 79 28 7a 44 65 73 74 2c 20 7a 50 72 69  mcpy(zDest, zPri
57c0: 6f 72 2c 20 6e 30 29 3b 0a 20 20 66 72 65 65 28  or, n0);.  free(
57d0: 7a 50 72 69 6f 72 29 3b 0a 20 20 6d 65 6d 63 70  zPrior);.  memcp
57e0: 79 28 26 7a 44 65 73 74 5b 6e 30 5d 2c 7a 53 65  y(&zDest[n0],zSe
57f0: 70 2c 6e 31 29 3b 0a 20 20 6d 65 6d 63 70 79 28  p,n1);.  memcpy(
5800: 26 7a 44 65 73 74 5b 6e 30 2b 6e 31 5d 2c 7a 53  &zDest[n0+n1],zS
5810: 72 63 2c 6e 32 2b 31 29 3b 0a 20 20 72 65 74 75  rc,n2+1);.  retu
5820: 72 6e 20 7a 44 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn zDest;.}../*.
5830: 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 45  ** Compare two E
5840: 54 61 67 20 76 61 6c 75 65 73 2e 20 52 65 74 75  Tag values. Retu
5850: 72 6e 20 30 20 69 66 20 74 68 65 79 20 6d 61 74  rn 0 if they mat
5860: 63 68 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20  ch and non-zero 
5870: 69 66 20 74 68 65 79 20 64 69 66 66 65 72 2e 0a  if they differ..
5880: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 65 20 6f 6e  **.** The one on
5890: 20 74 68 65 20 6c 65 66 74 20 6d 69 67 68 74 20   the left might 
58a0: 62 65 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  be a NULL pointe
58b0: 72 20 61 6e 64 20 69 74 20 6d 69 67 68 74 20 62  r and it might b
58c0: 65 20 71 75 6f 74 65 64 2e 0a 2a 2f 0a 73 74 61  e quoted..*/.sta
58d0: 74 69 63 20 69 6e 74 20 43 6f 6d 70 61 72 65 45  tic int CompareE
58e0: 74 61 67 73 28 63 6f 6e 73 74 20 63 68 61 72 20  tags(const char 
58f0: 2a 7a 41 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *zA, const char 
5900: 2a 7a 42 29 7b 0a 20 20 69 66 28 20 7a 41 3d 3d  *zB){.  if( zA==
5910: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
5920: 69 66 28 20 7a 41 5b 30 5d 3d 3d 27 22 27 20 29  if( zA[0]=='"' )
5930: 7b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 42 20 3d  {.    int lenB =
5940: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 29   (int)strlen(zB)
5950: 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d  ;.    if( strncm
5960: 70 28 7a 41 2b 31 2c 20 7a 42 2c 20 6c 65 6e 42  p(zA+1, zB, lenB
5970: 29 3d 3d 30 20 26 26 20 7a 41 5b 6c 65 6e 42 2b  )==0 && zA[lenB+
5980: 31 5d 3d 3d 27 22 27 20 29 20 72 65 74 75 72 6e  1]=='"' ) return
5990: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
59a0: 20 73 74 72 63 6d 70 28 7a 41 2c 20 7a 42 29 3b   strcmp(zA, zB);
59b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 72 65 61 6b 20  .}../*.** Break 
59c0: 61 20 6c 69 6e 65 20 61 74 20 74 68 65 20 66 69  a line at the fi
59d0: 72 73 74 20 5c 6e 20 6f 72 20 5c 72 20 63 68 61  rst \n or \r cha
59e0: 72 61 63 74 65 72 20 73 65 65 6e 2e 0a 2a 2f 0a  racter seen..*/.
59f0: 73 74 61 74 69 63 20 76 6f 69 64 20 52 65 6d 6f  static void Remo
5a00: 76 65 4e 65 77 6c 69 6e 65 28 63 68 61 72 20 2a  veNewline(char *
5a10: 7a 29 7b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  z){.  if( z==0 )
5a20: 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65   return;.  while
5a30: 28 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c 6e 27  ( *z && *z!='\n'
5a40: 20 26 26 20 2a 7a 21 3d 27 5c 72 27 20 29 7b 20   && *z!='\r' ){ 
5a50: 7a 2b 2b 3b 20 7d 0a 20 20 2a 7a 20 3d 20 30 3b  z++; }.  *z = 0;
5a60: 0a 7d 0a 0a 2f 2a 20 52 65 6e 64 65 72 20 73 65  .}../* Render se
5a70: 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30  conds since 1970
5a80: 20 61 73 20 61 6e 20 52 46 43 38 32 32 20 64 61   as an RFC822 da
5a90: 74 65 20 73 74 72 69 6e 67 2e 20 20 52 65 74 75  te string.  Retu
5aa0: 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
5ab0: 74 6f 20 74 68 61 74 20 73 74 72 69 6e 67 20 69  to that string i
5ac0: 6e 20 61 20 73 74 61 74 69 63 20 62 75 66 66 65  n a static buffe
5ad0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  r..*/.static cha
5ae0: 72 20 2a 52 66 63 38 32 32 44 61 74 65 28 74 69  r *Rfc822Date(ti
5af0: 6d 65 5f 74 20 74 29 7b 0a 20 20 73 74 72 75 63  me_t t){.  struc
5b00: 74 20 74 6d 20 2a 74 6d 3b 0a 20 20 73 74 61 74  t tm *tm;.  stat
5b10: 69 63 20 63 68 61 72 20 7a 44 61 74 65 5b 31 30  ic char zDate[10
5b20: 30 5d 3b 0a 20 20 74 6d 20 3d 20 67 6d 74 69 6d  0];.  tm = gmtim
5b30: 65 28 26 74 29 3b 0a 20 20 73 74 72 66 74 69 6d  e(&t);.  strftim
5b40: 65 28 7a 44 61 74 65 2c 20 73 69 7a 65 6f 66 28  e(zDate, sizeof(
5b50: 7a 44 61 74 65 29 2c 20 22 25 61 2c 20 25 64 20  zDate), "%a, %d 
5b60: 25 62 20 25 59 20 25 48 3a 25 4d 3a 25 53 20 25  %b %Y %H:%M:%S %
5b70: 7a 22 2c 20 74 6d 29 3b 0a 20 20 72 65 74 75 72  z", tm);.  retur
5b80: 6e 20 7a 44 61 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zDate;.}../*.*
5b90: 2a 20 50 72 69 6e 74 20 61 20 64 61 74 65 20 74  * Print a date t
5ba0: 61 67 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ag in the header
5bb0: 2e 20 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74  .  The name of t
5bc0: 68 65 20 74 61 67 20 69 73 20 7a 54 61 67 2e 0a  he tag is zTag..
5bd0: 2a 2a 20 54 68 65 20 64 61 74 65 20 69 73 20 64  ** The date is d
5be0: 65 74 65 72 6d 69 6e 65 64 20 66 72 6f 6d 20 74  etermined from t
5bf0: 68 65 20 75 6e 69 78 20 74 69 6d 65 73 74 61 6d  he unix timestam
5c00: 70 20 67 69 76 65 6e 2e 0a 2a 2f 0a 73 74 61 74  p given..*/.stat
5c10: 69 63 20 69 6e 74 20 44 61 74 65 54 61 67 28 63  ic int DateTag(c
5c20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 67 2c  onst char *zTag,
5c30: 20 74 69 6d 65 5f 74 20 74 29 7b 0a 20 20 72 65   time_t t){.  re
5c40: 74 75 72 6e 20 70 72 69 6e 74 66 28 22 25 73 3a  turn printf("%s:
5c50: 20 25 73 5c 72 5c 6e 22 2c 20 7a 54 61 67 2c 20   %s\r\n", zTag, 
5c60: 52 66 63 38 32 32 44 61 74 65 28 74 29 29 3b 0a  Rfc822Date(t));.
5c70: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61  }../*.** Parse a
5c80: 6e 20 52 46 43 38 32 32 2d 66 6f 72 6d 61 74 74  n RFC822-formatt
5c90: 65 64 20 74 69 6d 65 73 74 61 6d 70 20 61 73 20  ed timestamp as 
5ca0: 77 65 27 64 20 65 78 70 65 63 74 20 66 72 6f 6d  we'd expect from
5cb0: 20 48 54 54 50 20 61 6e 64 20 72 65 74 75 72 6e   HTTP and return
5cc0: 0a 2a 2a 20 61 20 55 6e 69 78 20 65 70 6f 63 68  .** a Unix epoch
5cd0: 20 74 69 6d 65 2e 20 3c 3d 20 7a 65 72 6f 20 69   time. <= zero i
5ce0: 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 66 61  s returned on fa
5cf0: 69 6c 75 72 65 2e 0a 2a 2f 0a 74 69 6d 65 5f 74  ilure..*/.time_t
5d00: 20 50 61 72 73 65 52 66 63 38 32 32 44 61 74 65   ParseRfc822Date
5d10: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61  (const char *zDa
5d20: 74 65 29 7b 0a 20 20 69 6e 74 20 6d 64 61 79 2c  te){.  int mday,
5d30: 20 6d 6f 6e 2c 20 79 65 61 72 2c 20 79 64 61 79   mon, year, yday
5d40: 2c 20 68 6f 75 72 2c 20 6d 69 6e 2c 20 73 65 63  , hour, min, sec
5d50: 3b 0a 20 20 63 68 61 72 20 7a 49 67 6e 6f 72 65  ;.  char zIgnore
5d60: 5b 34 5d 3b 0a 20 20 63 68 61 72 20 7a 4d 6f 6e  [4];.  char zMon
5d70: 74 68 5b 34 5d 3b 0a 20 20 73 74 61 74 69 63 20  th[4];.  static 
5d80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73  const char *cons
5d90: 74 20 61 7a 4d 6f 6e 74 68 73 5b 5d 20 3d 0a 20  t azMonths[] =. 
5da0: 20 20 20 7b 22 4a 61 6e 22 2c 20 22 46 65 62 22     {"Jan", "Feb"
5db0: 2c 20 22 4d 61 72 22 2c 20 22 41 70 72 22 2c 20  , "Mar", "Apr", 
5dc0: 22 4d 61 79 22 2c 20 22 4a 75 6e 22 2c 0a 20 20  "May", "Jun",.  
5dd0: 20 20 20 22 4a 75 6c 22 2c 20 22 41 75 67 22 2c     "Jul", "Aug",
5de0: 20 22 53 65 70 22 2c 20 22 4f 63 74 22 2c 20 22   "Sep", "Oct", "
5df0: 4e 6f 76 22 2c 20 22 44 65 63 22 2c 20 30 7d 3b  Nov", "Dec", 0};
5e00: 0a 20 20 69 66 28 20 37 3d 3d 73 73 63 61 6e 66  .  if( 7==sscanf
5e10: 28 7a 44 61 74 65 2c 20 22 25 33 5b 41 2d 5a 61  (zDate, "%3[A-Za
5e20: 2d 7a 5d 2c 20 25 64 20 25 33 5b 41 2d 5a 61 2d  -z], %d %3[A-Za-
5e30: 7a 5d 20 25 64 20 25 64 3a 25 64 3a 25 64 22 2c  z] %d %d:%d:%d",
5e40: 20 7a 49 67 6e 6f 72 65 2c 0a 20 20 20 20 20 20   zIgnore,.      
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e60: 20 26 6d 64 61 79 2c 20 7a 4d 6f 6e 74 68 2c 20   &mday, zMonth, 
5e70: 26 79 65 61 72 2c 20 26 68 6f 75 72 2c 20 26 6d  &year, &hour, &m
5e80: 69 6e 2c 20 26 73 65 63 29 29 7b 0a 20 20 20 20  in, &sec)){.    
5e90: 69 66 28 20 79 65 61 72 20 3e 20 31 39 30 30 20  if( year > 1900 
5ea0: 29 20 79 65 61 72 20 2d 3d 20 31 39 30 30 3b 0a  ) year -= 1900;.
5eb0: 20 20 20 20 66 6f 72 28 6d 6f 6e 3d 30 3b 20 61      for(mon=0; a
5ec0: 7a 4d 6f 6e 74 68 73 5b 6d 6f 6e 5d 3b 20 6d 6f  zMonths[mon]; mo
5ed0: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  n++){.      if( 
5ee0: 21 73 74 72 6e 63 6d 70 28 20 61 7a 4d 6f 6e 74  !strncmp( azMont
5ef0: 68 73 5b 6d 6f 6e 5d 2c 20 7a 4d 6f 6e 74 68 2c  hs[mon], zMonth,
5f00: 20 33 20 29 29 7b 0a 20 20 20 20 20 20 20 20 69   3 )){.        i
5f10: 6e 74 20 6e 44 61 79 3b 0a 20 20 20 20 20 20 20  nt nDay;.       
5f20: 20 69 6e 74 20 69 73 4c 65 61 70 59 72 3b 0a 20   int isLeapYr;. 
5f30: 20 20 20 20 20 20 20 73 74 61 74 69 63 20 69 6e         static in
5f40: 74 20 70 72 69 6f 72 44 61 79 73 5b 5d 20 3d 0a  t priorDays[] =.
5f50: 20 20 20 20 20 20 20 20 20 7b 20 20 30 2c 20 33           {  0, 3
5f60: 31 2c 20 35 39 2c 20 39 30 2c 31 32 30 2c 31 35  1, 59, 90,120,15
5f70: 31 2c 31 38 31 2c 32 31 32 2c 32 34 33 2c 32 37  1,181,212,243,27
5f80: 33 2c 33 30 34 2c 33 33 34 20 7d 3b 0a 20 20 20  3,304,334 };.   
5f90: 20 20 20 20 20 69 66 28 20 6d 6f 6e 3c 30 20 29       if( mon<0 )
5fa0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
5fb0: 6e 59 65 61 72 20 3d 20 28 31 31 20 2d 20 6d 6f  nYear = (11 - mo
5fc0: 6e 29 2f 31 32 3b 0a 20 20 20 20 20 20 20 20 20  n)/12;.         
5fd0: 20 79 65 61 72 20 2d 3d 20 6e 59 65 61 72 3b 0a   year -= nYear;.
5fe0: 20 20 20 20 20 20 20 20 20 20 6d 6f 6e 20 2b 3d            mon +=
5ff0: 20 6e 59 65 61 72 2a 31 32 3b 0a 20 20 20 20 20   nYear*12;.     
6000: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 6f 6e     }else if( mon
6010: 3e 31 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >11 ){.         
6020: 20 79 65 61 72 20 2b 3d 20 6d 6f 6e 2f 31 32 3b   year += mon/12;
6030: 0a 20 20 20 20 20 20 20 20 20 20 6d 6f 6e 20 25  .          mon %
6040: 3d 20 31 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = 12;.        }.
6050: 20 20 20 20 20 20 20 20 69 73 4c 65 61 70 59 72          isLeapYr
6060: 20 3d 20 79 65 61 72 25 34 3d 3d 30 20 26 26 20   = year%4==0 && 
6070: 28 79 65 61 72 25 31 30 30 21 3d 30 20 7c 7c 20  (year%100!=0 || 
6080: 28 79 65 61 72 2b 33 30 30 29 25 34 30 30 3d 3d  (year+300)%400==
6090: 30 29 3b 0a 20 20 20 20 20 20 20 20 79 64 61 79  0);.        yday
60a0: 20 3d 20 70 72 69 6f 72 44 61 79 73 5b 6d 6f 6e   = priorDays[mon
60b0: 5d 20 2b 20 6d 64 61 79 20 2d 20 31 3b 0a 20 20  ] + mday - 1;.  
60c0: 20 20 20 20 20 20 69 66 28 20 69 73 4c 65 61 70        if( isLeap
60d0: 59 72 20 26 26 20 6d 6f 6e 3e 31 20 29 20 79 64  Yr && mon>1 ) yd
60e0: 61 79 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 44  ay++;.        nD
60f0: 61 79 20 3d 20 28 79 65 61 72 2d 37 30 29 2a 33  ay = (year-70)*3
6100: 36 35 20 2b 20 28 79 65 61 72 2d 36 39 29 2f 34  65 + (year-69)/4
6110: 20 2d 20 79 65 61 72 2f 31 30 30 20 2b 20 28 79   - year/100 + (y
6120: 65 61 72 2b 33 30 30 29 2f 34 30 30 20 2b 20 79  ear+300)/400 + y
6130: 64 61 79 3b 0a 20 20 20 20 20 20 20 20 72 65 74  day;.        ret
6140: 75 72 6e 20 28 28 74 69 6d 65 5f 74 29 28 6e 44  urn ((time_t)(nD
6150: 61 79 2a 32 34 20 2b 20 68 6f 75 72 29 2a 36 30  ay*24 + hour)*60
6160: 20 2b 20 6d 69 6e 29 2a 36 30 20 2b 20 73 65 63   + min)*60 + sec
6170: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6180: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
6190: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 70 72  }../*.** Test pr
61a0: 6f 63 65 64 75 72 65 20 66 6f 72 20 50 61 72 73  ocedure for Pars
61b0: 65 52 66 63 38 32 32 44 61 74 65 0a 2a 2f 0a 76  eRfc822Date.*/.v
61c0: 6f 69 64 20 54 65 73 74 50 61 72 73 65 52 66 63  oid TestParseRfc
61d0: 38 32 32 44 61 74 65 28 76 6f 69 64 29 7b 0a 20  822Date(void){. 
61e0: 20 74 69 6d 65 5f 74 20 74 31 2c 20 74 32 3b 0a   time_t t1, t2;.
61f0: 20 20 66 6f 72 28 74 31 3d 30 3b 20 74 31 3c 30    for(t1=0; t1<0
6200: 78 37 66 66 66 66 66 66 66 3b 20 74 31 20 2b 3d  x7fffffff; t1 +=
6210: 20 31 32 37 29 7b 0a 20 20 20 20 74 32 20 3d 20   127){.    t2 = 
6220: 50 61 72 73 65 52 66 63 38 32 32 44 61 74 65 28  ParseRfc822Date(
6230: 52 66 63 38 32 32 44 61 74 65 28 74 31 29 29 3b  Rfc822Date(t1));
6240: 0a 20 20 20 20 61 73 73 65 72 74 28 20 74 31 3d  .    assert( t1=
6250: 3d 74 32 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  =t2 );.  }.}../*
6260: 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 66 69  .** Print the fi
6270: 72 73 74 20 6c 69 6e 65 20 6f 66 20 61 20 72 65  rst line of a re
6280: 73 70 6f 6e 73 65 20 66 6f 6c 6c 6f 77 65 64 20  sponse followed 
6290: 62 79 20 74 68 65 20 73 65 72 76 65 72 20 74 79  by the server ty
62a0: 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  pe..*/.static vo
62b0: 69 64 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65  id StartResponse
62c0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65  (const char *zRe
62d0: 73 75 6c 74 43 6f 64 65 29 7b 0a 20 20 74 69 6d  sultCode){.  tim
62e0: 65 5f 74 20 6e 6f 77 3b 0a 20 20 74 69 6d 65 28  e_t now;.  time(
62f0: 26 6e 6f 77 29 3b 0a 20 20 69 66 28 20 73 74 61  &now);.  if( sta
6300: 74 75 73 53 65 6e 74 20 29 20 72 65 74 75 72 6e  tusSent ) return
6310: 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e  ;.  nOut += prin
6320: 74 66 28 22 25 73 20 25 73 5c 72 5c 6e 22 2c 20  tf("%s %s\r\n", 
6330: 7a 50 72 6f 74 6f 63 6f 6c 2c 20 7a 52 65 73 75  zProtocol, zResu
6340: 6c 74 43 6f 64 65 29 3b 0a 20 20 73 74 72 6e 63  ltCode);.  strnc
6350: 70 79 28 7a 52 65 70 6c 79 53 74 61 74 75 73 2c  py(zReplyStatus,
6360: 20 7a 52 65 73 75 6c 74 43 6f 64 65 2c 20 33 29   zResultCode, 3)
6370: 3b 0a 20 20 7a 52 65 70 6c 79 53 74 61 74 75 73  ;.  zReplyStatus
6380: 5b 33 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a  [3] = 0;.  if( z
6390: 52 65 70 6c 79 53 74 61 74 75 73 5b 30 5d 3e 3d  ReplyStatus[0]>=
63a0: 27 34 27 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65  '4' ){.    close
63b0: 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 31 3b 0a  Connection = 1;.
63c0: 20 20 7d 0a 20 20 69 66 28 20 63 6c 6f 73 65 43    }.  if( closeC
63d0: 6f 6e 6e 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20  onnection ){.   
63e0: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
63f0: 22 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f  "Connection: clo
6400: 73 65 5c 72 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73  se\r\n");.  }els
6410: 65 7b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70  e{.    nOut += p
6420: 72 69 6e 74 66 28 22 43 6f 6e 6e 65 63 74 69 6f  rintf("Connectio
6430: 6e 3a 20 6b 65 65 70 2d 61 6c 69 76 65 5c 72 5c  n: keep-alive\r\
6440: 6e 22 29 3b 0a 20 20 7d 0a 20 20 6e 4f 75 74 20  n");.  }.  nOut 
6450: 2b 3d 20 44 61 74 65 54 61 67 28 22 44 61 74 65  += DateTag("Date
6460: 22 2c 20 6e 6f 77 29 3b 0a 20 20 73 74 61 74 75  ", now);.  statu
6470: 73 53 65 6e 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  sSent = 1;.}../*
6480: 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c 69  .** Tell the cli
6490: 65 6e 74 20 74 68 61 74 20 74 68 65 72 65 20 69  ent that there i
64a0: 73 20 6e 6f 20 73 75 63 68 20 64 6f 63 75 6d 65  s no such docume
64b0: 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  nt.*/.static voi
64c0: 64 20 4e 6f 74 46 6f 75 6e 64 28 69 6e 74 20 6c  d NotFound(int l
64d0: 69 6e 65 6e 6f 29 7b 0a 20 20 53 74 61 72 74 52  ineno){.  StartR
64e0: 65 73 70 6f 6e 73 65 28 22 34 30 34 20 4e 6f 74  esponse("404 Not
64f0: 20 46 6f 75 6e 64 22 29 3b 0a 20 20 6e 4f 75 74   Found");.  nOut
6500: 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20   += printf(.    
6510: 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74  "Content-type: t
6520: 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e 22 0a 20 20  ext/html\r\n".  
6530: 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 22 3c 68    "\r\n".    "<h
6540: 65 61 64 3e 3c 74 69 74 6c 65 20 6c 69 6e 65 6e  ead><title linen
6550: 6f 3d 5c 22 25 64 5c 22 3e 4e 6f 74 20 46 6f 75  o=\"%d\">Not Fou
6560: 6e 64 3c 2f 74 69 74 6c 65 3e 3c 2f 68 65 61 64  nd</title></head
6570: 3e 5c 6e 22 0a 20 20 20 20 22 3c 62 6f 64 79 3e  >\n".    "<body>
6580: 3c 68 31 3e 44 6f 63 75 6d 65 6e 74 20 4e 6f 74  <h1>Document Not
6590: 20 46 6f 75 6e 64 3c 2f 68 31 3e 5c 6e 22 0a 20   Found</h1>\n". 
65a0: 20 20 20 22 54 68 65 20 64 6f 63 75 6d 65 6e 74     "The document
65b0: 20 25 73 20 69 73 20 6e 6f 74 20 61 76 61 69 6c   %s is not avail
65c0: 61 62 6c 65 20 6f 6e 20 74 68 69 73 20 73 65 72  able on this ser
65d0: 76 65 72 5c 6e 22 0a 20 20 20 20 22 3c 2f 62 6f  ver\n".    "</bo
65e0: 64 79 3e 5c 6e 22 2c 20 6c 69 6e 65 6e 6f 2c 20  dy>\n", lineno, 
65f0: 7a 53 63 72 69 70 74 29 3b 0a 20 20 4d 61 6b 65  zScript);.  Make
6600: 4c 6f 67 45 6e 74 72 79 28 30 2c 20 6c 69 6e 65  LogEntry(0, line
6610: 6e 6f 29 3b 0a 20 20 65 78 69 74 28 30 29 3b 0a  no);.  exit(0);.
6620: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68  }../*.** Tell th
6630: 65 20 63 6c 69 65 6e 74 20 74 68 61 74 20 74 68  e client that th
6640: 65 79 20 61 72 65 20 6e 6f 74 20 77 65 6c 63 6f  ey are not welco
6650: 6d 65 64 20 68 65 72 65 2e 0a 2a 2f 0a 73 74 61  med here..*/.sta
6660: 74 69 63 20 76 6f 69 64 20 46 6f 72 62 69 64 64  tic void Forbidd
6670: 65 6e 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  en(int lineno){.
6680: 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28    StartResponse(
6690: 22 34 30 33 20 46 6f 72 62 69 64 64 65 6e 22 29  "403 Forbidden")
66a0: 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e  ;.  nOut += prin
66b0: 74 66 28 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74  tf(.    "Content
66c0: 2d 74 79 70 65 3a 20 74 65 78 74 2f 70 6c 61 69  -type: text/plai
66d0: 6e 5c 72 5c 6e 22 0a 20 20 20 20 22 5c 72 5c 6e  n\r\n".    "\r\n
66e0: 22 0a 20 20 20 20 22 41 63 63 65 73 73 20 64 65  ".    "Access de
66f0: 6e 69 65 64 5c 6e 22 0a 20 20 29 3b 0a 20 20 63  nied\n".  );.  c
6700: 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d  loseConnection =
6710: 20 31 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74   1;.  MakeLogEnt
6720: 72 79 28 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20  ry(0, lineno);. 
6730: 20 65 78 69 74 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a   exit(0);.}../*.
6740: 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c 69 65  ** Tell the clie
6750: 6e 74 20 74 68 61 74 20 61 75 74 68 6f 72 69 7a  nt that authoriz
6760: 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65  ation is require
6770: 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a  d to access the.
6780: 2a 2a 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** document..*/.
6790: 73 74 61 74 69 63 20 76 6f 69 64 20 4e 6f 74 41  static void NotA
67a0: 75 74 68 6f 72 69 7a 65 64 28 63 6f 6e 73 74 20  uthorized(const 
67b0: 63 68 61 72 20 2a 7a 52 65 61 6c 6d 29 7b 0a 20  char *zRealm){. 
67c0: 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22   StartResponse("
67d0: 34 30 31 20 41 75 74 68 6f 72 69 7a 61 74 69 6f  401 Authorizatio
67e0: 6e 20 52 65 71 75 69 72 65 64 22 29 3b 0a 20 20  n Required");.  
67f0: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a  nOut += printf(.
6800: 20 20 20 20 22 57 57 57 2d 41 75 74 68 65 6e 74      "WWW-Authent
6810: 69 63 61 74 65 3a 20 42 61 73 69 63 20 72 65 61  icate: Basic rea
6820: 6c 6d 3d 5c 22 25 73 5c 22 5c 72 5c 6e 22 0a 20  lm=\"%s\"\r\n". 
6830: 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65     "Content-type
6840: 3a 20 74 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e 22  : text/html\r\n"
6850: 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20  .    "\r\n".    
6860: 22 3c 68 65 61 64 3e 3c 74 69 74 6c 65 3e 4e 6f  "<head><title>No
6870: 74 20 41 75 74 68 6f 72 69 7a 65 64 3c 2f 74 69  t Authorized</ti
6880: 74 6c 65 3e 3c 2f 68 65 61 64 3e 5c 6e 22 0a 20  tle></head>\n". 
6890: 20 20 20 22 3c 62 6f 64 79 3e 3c 68 31 3e 34 30     "<body><h1>40
68a0: 31 20 4e 6f 74 20 41 75 74 68 6f 72 69 7a 65 64  1 Not Authorized
68b0: 3c 2f 68 31 3e 5c 6e 22 0a 20 20 20 20 22 41 20  </h1>\n".    "A 
68c0: 6c 6f 67 69 6e 20 61 6e 64 20 70 61 73 73 77 6f  login and passwo
68d0: 72 64 20 61 72 65 20 72 65 71 75 69 72 65 64 20  rd are required 
68e0: 66 6f 72 20 74 68 69 73 20 64 6f 63 75 6d 65 6e  for this documen
68f0: 74 5c 6e 22 0a 20 20 20 20 22 3c 2f 62 6f 64 79  t\n".    "</body
6900: 3e 5c 6e 22 2c 20 7a 52 65 61 6c 6d 29 3b 0a 20  >\n", zRealm);. 
6910: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c   MakeLogEntry(0,
6920: 20 31 31 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20   110);  /* LOG: 
6930: 4e 6f 74 20 61 75 74 68 6f 72 69 7a 65 64 20 2a  Not authorized *
6940: 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20  /.}../*.** Tell 
6950: 74 68 65 20 63 6c 69 65 6e 74 20 74 68 61 74 20  the client that 
6960: 74 68 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f  there is an erro
6970: 72 20 69 6e 20 74 68 65 20 73 63 72 69 70 74 2e  r in the script.
6980: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6990: 43 67 69 45 72 72 6f 72 28 76 6f 69 64 29 7b 0a  CgiError(void){.
69a0: 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28    StartResponse(
69b0: 22 35 30 30 20 45 72 72 6f 72 22 29 3b 0a 20 20  "500 Error");.  
69c0: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a  nOut += printf(.
69d0: 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70      "Content-typ
69e0: 65 3a 20 74 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e  e: text/html\r\n
69f0: 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20  ".    "\r\n".   
6a00: 20 22 3c 68 65 61 64 3e 3c 74 69 74 6c 65 3e 43   "<head><title>C
6a10: 47 49 20 50 72 6f 67 72 61 6d 20 45 72 72 6f 72  GI Program Error
6a20: 3c 2f 74 69 74 6c 65 3e 3c 2f 68 65 61 64 3e 5c  </title></head>\
6a30: 6e 22 0a 20 20 20 20 22 3c 62 6f 64 79 3e 3c 68  n".    "<body><h
6a40: 31 3e 43 47 49 20 50 72 6f 67 72 61 6d 20 45 72  1>CGI Program Er
6a50: 72 6f 72 3c 2f 68 31 3e 5c 6e 22 0a 20 20 20 20  ror</h1>\n".    
6a60: 22 54 68 65 20 43 47 49 20 70 72 6f 67 72 61 6d  "The CGI program
6a70: 20 25 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e   %s generated an
6a80: 20 65 72 72 6f 72 5c 6e 22 0a 20 20 20 20 22 3c   error\n".    "<
6a90: 2f 62 6f 64 79 3e 5c 6e 22 2c 20 7a 53 63 72 69  /body>\n", zScri
6aa0: 70 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e  pt);.  MakeLogEn
6ab0: 74 72 79 28 30 2c 20 31 32 30 29 3b 20 20 2f 2a  try(0, 120);  /*
6ac0: 20 4c 4f 47 3a 20 43 47 49 20 45 72 72 6f 72 20   LOG: CGI Error 
6ad0: 2a 2f 0a 20 20 65 78 69 74 28 30 29 3b 0a 7d 0a  */.  exit(0);.}.
6ae0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  ./*.** This is c
6af0: 61 6c 6c 65 64 20 69 66 20 77 65 20 74 69 6d 65  alled if we time
6b00: 6f 75 74 20 6f 72 20 63 61 74 63 68 20 73 6f 6d  out or catch som
6b10: 65 20 6f 74 68 65 72 20 6b 69 6e 64 20 6f 66 20  e other kind of 
6b20: 73 69 67 6e 61 6c 2e 0a 2a 2a 20 4c 6f 67 20 61  signal..** Log a
6b30: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 68 69  n error code whi
6b40: 63 68 20 69 73 20 39 30 30 2b 69 53 69 67 20 61  ch is 900+iSig a
6b50: 6e 64 20 74 68 65 6e 20 71 75 69 74 2e 0a 2a 2f  nd then quit..*/
6b60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 69 6d  .static void Tim
6b70: 65 6f 75 74 28 69 6e 74 20 69 53 69 67 29 7b 0a  eout(int iSig){.
6b80: 20 20 69 66 28 20 21 64 65 62 75 67 46 6c 61 67    if( !debugFlag
6b90: 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 63 72   ){.    if( zScr
6ba0: 69 70 74 20 26 26 20 7a 53 63 72 69 70 74 5b 30  ipt && zScript[0
6bb0: 5d 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ] ){.      char 
6bc0: 7a 42 75 66 5b 31 30 5d 3b 0a 20 20 20 20 20 20  zBuf[10];.      
6bd0: 7a 42 75 66 5b 30 5d 20 3d 20 27 39 27 3b 0a 20  zBuf[0] = '9';. 
6be0: 20 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20 27       zBuf[1] = '
6bf0: 30 27 20 2b 20 28 69 53 69 67 2f 31 30 29 25 31  0' + (iSig/10)%1
6c00: 30 3b 0a 20 20 20 20 20 20 7a 42 75 66 5b 32 5d  0;.      zBuf[2]
6c10: 20 3d 20 27 30 27 20 2b 20 69 53 69 67 25 31 30   = '0' + iSig%10
6c20: 3b 0a 20 20 20 20 20 20 7a 42 75 66 5b 33 5d 20  ;.      zBuf[3] 
6c30: 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 63 70  = 0;.      strcp
6c40: 79 28 7a 52 65 70 6c 79 53 74 61 74 75 73 2c 20  y(zReplyStatus, 
6c50: 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4d 61 6b  zBuf);.      Mak
6c60: 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 31 33 30  eLogEntry(0, 130
6c70: 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 54 69 6d 65  );  /* LOG: Time
6c80: 6f 75 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  out */.    }.   
6c90: 20 65 78 69 74 28 30 29 3b 0a 20 20 7d 0a 7d 0a   exit(0);.  }.}.
6ca0: 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20  ./*.** Tell the 
6cb0: 63 6c 69 65 6e 74 20 74 68 61 74 20 74 68 65 72  client that ther
6cc0: 65 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69 6e  e is an error in
6cd0: 20 74 68 65 20 73 63 72 69 70 74 2e 0a 2a 2f 0a   the script..*/.
6ce0: 73 74 61 74 69 63 20 76 6f 69 64 20 43 67 69 53  static void CgiS
6cf0: 63 72 69 70 74 57 72 69 74 61 62 6c 65 28 76 6f  criptWritable(vo
6d00: 69 64 29 7b 0a 20 20 53 74 61 72 74 52 65 73 70  id){.  StartResp
6d10: 6f 6e 73 65 28 22 35 30 30 20 43 47 49 20 43 6f  onse("500 CGI Co
6d20: 6e 66 69 67 75 72 61 74 69 6f 6e 20 45 72 72 6f  nfiguration Erro
6d30: 72 22 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70  r");.  nOut += p
6d40: 72 69 6e 74 66 28 0a 20 20 20 20 22 43 6f 6e 74  rintf(.    "Cont
6d50: 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 70  ent-type: text/p
6d60: 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 22 5c  lain\r\n".    "\
6d70: 72 5c 6e 22 0a 20 20 20 20 22 54 68 65 20 43 47  r\n".    "The CG
6d80: 49 20 70 72 6f 67 72 61 6d 20 25 73 20 69 73 20  I program %s is 
6d90: 77 72 69 74 61 62 6c 65 20 62 79 20 75 73 65 72  writable by user
6da0: 73 20 6f 74 68 65 72 20 74 68 61 6e 20 69 74 73  s other than its
6db0: 20 6f 77 6e 65 72 2e 5c 6e 22 2c 0a 20 20 20 20   owner.\n",.    
6dc0: 7a 52 65 61 6c 53 63 72 69 70 74 29 3b 0a 20 20  zRealScript);.  
6dd0: 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20  MakeLogEntry(0, 
6de0: 31 34 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 43  140);  /* LOG: C
6df0: 47 49 20 73 63 72 69 70 74 20 69 73 20 77 72 69  GI script is wri
6e00: 74 61 62 6c 65 20 2a 2f 0a 20 20 65 78 69 74 28  table */.  exit(
6e10: 30 29 3b 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a  0);       .}../*
6e20: 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c 69  .** Tell the cli
6e30: 65 6e 74 20 74 68 61 74 20 74 68 65 20 73 65 72  ent that the ser
6e40: 76 65 72 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 65  ver malfunctione
6e50: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
6e60: 64 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 69 6e  d Malfunction(in
6e70: 74 20 6c 69 6e 65 6e 75 6d 2c 20 63 6f 6e 73 74  t linenum, const
6e80: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
6e90: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
6ea0: 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ap;.  va_start(a
6eb0: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 53  p, zFormat);.  S
6ec0: 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 35 30  tartResponse("50
6ed0: 30 20 53 65 72 76 65 72 20 4d 61 6c 66 75 6e 63  0 Server Malfunc
6ee0: 74 69 6f 6e 22 29 3b 0a 20 20 6e 4f 75 74 20 2b  tion");.  nOut +
6ef0: 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20 22 43  = printf(.    "C
6f00: 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78  ontent-type: tex
6f10: 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20  t/plain\r\n".   
6f20: 20 22 5c 72 5c 6e 22 0a 20 20 20 20 22 57 65 62   "\r\n".    "Web
6f30: 20 73 65 72 76 65 72 20 6d 61 6c 66 75 6e 63 74   server malfunct
6f40: 69 6f 6e 65 64 3b 20 65 72 72 6f 72 20 6e 75 6d  ioned; error num
6f50: 62 65 72 20 25 64 5c 6e 5c 6e 22 2c 20 6c 69 6e  ber %d\n\n", lin
6f60: 65 6e 75 6d 29 3b 0a 20 20 69 66 28 20 7a 46 6f  enum);.  if( zFo
6f70: 72 6d 61 74 20 29 7b 0a 20 20 20 20 6e 4f 75 74  rmat ){.    nOut
6f80: 20 2b 3d 20 76 70 72 69 6e 74 66 28 7a 46 6f 72   += vprintf(zFor
6f90: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 20 20  mat, ap);.  }.  
6fa0: 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20  MakeLogEntry(0, 
6fb0: 6c 69 6e 65 6e 75 6d 29 3b 0a 20 20 65 78 69 74  linenum);.  exit
6fc0: 28 30 29 3b 20 20 20 20 20 20 20 0a 7d 0a 0a 2f  (0);       .}../
6fd0: 2a 0a 2a 2a 20 44 6f 20 61 20 73 65 72 76 65 72  *.** Do a server
6fe0: 20 72 65 64 69 72 65 63 74 20 74 6f 20 74 68 65   redirect to the
6ff0: 20 64 6f 63 75 6d 65 6e 74 20 73 70 65 63 69 66   document specif
7000: 69 65 64 2e 20 20 54 68 65 20 64 6f 63 75 6d 65  ied.  The docume
7010: 6e 74 0a 2a 2a 20 6e 61 6d 65 20 6e 6f 74 20 63  nt.** name not c
7020: 6f 6e 74 61 69 6e 20 73 63 68 65 6d 65 20 6f 72  ontain scheme or
7030: 20 6e 65 74 77 6f 72 6b 20 6c 6f 63 61 74 69 6f   network locatio
7040: 6e 20 6f 72 20 74 68 65 20 71 75 65 72 79 20 73  n or the query s
7050: 74 72 69 6e 67 2e 0a 2a 2a 20 49 74 20 77 69 6c  tring..** It wil
7060: 6c 20 62 65 20 6a 75 73 74 20 74 68 65 20 70 61  l be just the pa
7070: 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  th..*/.static vo
7080: 69 64 20 52 65 64 69 72 65 63 74 28 63 6f 6e 73  id Redirect(cons
7090: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69  t char *zPath, i
70a0: 6e 74 20 66 69 6e 69 73 68 2c 20 69 6e 74 20 6c  nt finish, int l
70b0: 69 6e 65 6e 6f 29 7b 0a 20 20 53 74 61 72 74 52  ineno){.  StartR
70c0: 65 73 70 6f 6e 73 65 28 22 33 30 32 20 54 65 6d  esponse("302 Tem
70d0: 70 6f 72 61 72 79 20 52 65 64 69 72 65 63 74 22  porary Redirect"
70e0: 29 3b 0a 20 20 69 66 28 20 7a 53 65 72 76 65 72  );.  if( zServer
70f0: 50 6f 72 74 3d 3d 30 20 7c 7c 20 7a 53 65 72 76  Port==0 || zServ
7100: 65 72 50 6f 72 74 5b 30 5d 3d 3d 30 20 7c 7c 20  erPort[0]==0 || 
7110: 73 74 72 63 6d 70 28 7a 53 65 72 76 65 72 50 6f  strcmp(zServerPo
7120: 72 74 2c 22 38 30 22 29 3d 3d 30 20 29 7b 0a 20  rt,"80")==0 ){. 
7130: 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74     nOut += print
7140: 66 28 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73 3a  f("Location: %s:
7150: 2f 2f 25 73 25 73 25 73 5c 72 5c 6e 22 2c 0a 20  //%s%s%s\r\n",. 
7160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7170: 20 20 7a 48 74 74 70 2c 20 7a 53 65 72 76 65 72    zHttp, zServer
7180: 4e 61 6d 65 2c 20 7a 50 61 74 68 2c 20 7a 51 75  Name, zPath, zQu
7190: 65 72 79 53 75 66 66 69 78 29 3b 0a 20 20 7d 65  erySuffix);.  }e
71a0: 6c 73 65 7b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d  lse{.    nOut +=
71b0: 20 70 72 69 6e 74 66 28 22 4c 6f 63 61 74 69 6f   printf("Locatio
71c0: 6e 3a 20 25 73 3a 2f 2f 25 73 3a 25 73 25 73 25  n: %s://%s:%s%s%
71d0: 73 5c 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  s\r\n",.        
71e0: 20 20 20 20 20 20 20 20 20 20 20 7a 48 74 74 70             zHttp
71f0: 2c 20 7a 53 65 72 76 65 72 4e 61 6d 65 2c 20 7a  , zServerName, z
7200: 53 65 72 76 65 72 50 6f 72 74 2c 20 7a 50 61 74  ServerPort, zPat
7210: 68 2c 20 7a 51 75 65 72 79 53 75 66 66 69 78 29  h, zQuerySuffix)
7220: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 69 6e 69  ;.  }.  if( fini
7230: 73 68 20 29 7b 0a 20 20 20 20 6e 4f 75 74 20 2b  sh ){.    nOut +
7240: 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 74 65 6e  = printf("Conten
7250: 74 2d 6c 65 6e 67 74 68 3a 20 30 5c 72 5c 6e 22  t-length: 0\r\n"
7260: 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70  );.    nOut += p
7270: 72 69 6e 74 66 28 22 5c 72 5c 6e 22 29 3b 0a 20  rintf("\r\n");. 
7280: 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28     MakeLogEntry(
7290: 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a  0, lineno);.  }.
72a0: 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29    fflush(stdout)
72b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
72c0: 66 75 6e 63 74 69 6f 6e 20 74 72 65 61 74 73 20  function treats 
72d0: 69 74 73 20 69 6e 70 75 74 20 61 73 20 61 20 62  its input as a b
72e0: 61 73 65 2d 36 34 20 73 74 72 69 6e 67 20 61 6e  ase-64 string an
72f0: 64 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  d returns the.**
7300: 20 64 65 63 6f 64 65 64 20 76 61 6c 75 65 20 6f   decoded value o
7310: 66 20 74 68 61 74 20 73 74 72 69 6e 67 2e 20 20  f that string.  
7320: 43 68 61 72 61 63 74 65 72 73 20 6f 66 20 69 6e  Characters of in
7330: 70 75 74 20 74 68 61 74 20 61 72 65 20 6e 6f 74  put that are not
7340: 0a 2a 2a 20 76 61 6c 69 64 20 62 61 73 65 2d 36  .** valid base-6
7350: 34 20 63 68 61 72 61 63 74 65 72 73 20 28 73 75  4 characters (su
7360: 63 68 20 61 73 20 73 70 61 63 65 73 20 61 6e 64  ch as spaces and
7370: 20 6e 65 77 6c 69 6e 65 73 29 20 61 72 65 20 69   newlines) are i
7380: 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  gnored..*/.void 
7390: 44 65 63 6f 64 65 36 34 28 63 68 61 72 20 2a 7a  Decode64(char *z
73a0: 36 34 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 61  64){.  char *zDa
73b0: 74 61 3b 0a 20 20 69 6e 74 20 6e 36 34 3b 0a 20  ta;.  int n64;. 
73c0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
73d0: 20 61 2c 20 62 2c 20 63 2c 20 64 3b 0a 20 20 73   a, b, c, d;.  s
73e0: 74 61 74 69 63 20 69 6e 74 20 69 73 49 6e 69 74  tatic int isInit
73f0: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69   = 0;.  static i
7400: 6e 74 20 74 72 61 6e 73 5b 31 32 38 5d 3b 0a 20  nt trans[128];. 
7410: 20 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64   static unsigned
7420: 20 63 68 61 72 20 7a 42 61 73 65 5b 5d 20 3d 20   char zBase[] = 
7430: 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a  .    "ABCDEFGHIJ
7440: 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
7450: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
7460: 71 72 73 74 75 76 77 78 79 7a 30 31 32 33 34 35  qrstuvwxyz012345
7470: 36 37 38 39 2b 2f 22 3b 0a 0a 20 20 69 66 28 20  6789+/";..  if( 
7480: 21 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 66  !isInit ){.    f
7490: 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69  or(i=0; i<128; i
74a0: 2b 2b 29 7b 20 74 72 61 6e 73 5b 69 5d 20 3d 20  ++){ trans[i] = 
74b0: 30 3b 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30  0; }.    for(i=0
74c0: 3b 20 7a 42 61 73 65 5b 69 5d 3b 20 69 2b 2b 29  ; zBase[i]; i++)
74d0: 7b 20 74 72 61 6e 73 5b 7a 42 61 73 65 5b 69 5d  { trans[zBase[i]
74e0: 20 26 20 30 78 37 66 5d 20 3d 20 69 3b 20 7d 0a   & 0x7f] = i; }.
74f0: 20 20 20 20 69 73 49 6e 69 74 20 3d 20 31 3b 0a      isInit = 1;.
7500: 20 20 7d 0a 20 20 6e 36 34 20 3d 20 73 74 72 6c    }.  n64 = strl
7510: 65 6e 28 7a 36 34 29 3b 0a 20 20 77 68 69 6c 65  en(z64);.  while
7520: 28 20 6e 36 34 3e 30 20 26 26 20 7a 36 34 5b 6e  ( n64>0 && z64[n
7530: 36 34 2d 31 5d 3d 3d 27 3d 27 20 29 20 6e 36 34  64-1]=='=' ) n64
7540: 2d 2d 3b 0a 20 20 7a 44 61 74 61 20 3d 20 7a 36  --;.  zData = z6
7550: 34 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  4;.  for(i=j=0; 
7560: 69 2b 33 3c 6e 36 34 3b 20 69 2b 3d 34 29 7b 0a  i+3<n64; i+=4){.
7570: 20 20 20 20 61 20 3d 20 74 72 61 6e 73 5b 7a 36      a = trans[z6
7580: 34 5b 69 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20  4[i] & 0x7f];.  
7590: 20 20 62 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b    b = trans[z64[
75a0: 69 2b 31 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20  i+1] & 0x7f];.  
75b0: 20 20 63 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b    c = trans[z64[
75c0: 69 2b 32 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20  i+2] & 0x7f];.  
75d0: 20 20 64 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b    d = trans[z64[
75e0: 69 2b 33 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20  i+3] & 0x7f];.  
75f0: 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28    zData[j++] = (
7600: 28 61 3c 3c 32 29 20 26 20 30 78 66 63 29 20 7c  (a<<2) & 0xfc) |
7610: 20 28 28 62 3e 3e 34 29 20 26 20 30 78 30 33 29   ((b>>4) & 0x03)
7620: 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d  ;.    zData[j++]
7630: 20 3d 20 28 28 62 3c 3c 34 29 20 26 20 30 78 66   = ((b<<4) & 0xf
7640: 30 29 20 7c 20 28 28 63 3e 3e 32 29 20 26 20 30  0) | ((c>>2) & 0
7650: 78 30 66 29 3b 0a 20 20 20 20 7a 44 61 74 61 5b  x0f);.    zData[
7660: 6a 2b 2b 5d 20 3d 20 28 28 63 3c 3c 36 29 20 26  j++] = ((c<<6) &
7670: 20 30 78 63 30 29 20 7c 20 28 64 20 26 20 30 78   0xc0) | (d & 0x
7680: 33 66 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  3f);.  }.  if( i
7690: 2b 32 3c 6e 36 34 20 29 7b 0a 20 20 20 20 61 20  +2<n64 ){.    a 
76a0: 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 5d 20 26  = trans[z64[i] &
76b0: 20 30 78 37 66 5d 3b 0a 20 20 20 20 62 20 3d 20   0x7f];.    b = 
76c0: 74 72 61 6e 73 5b 7a 36 34 5b 69 2b 31 5d 20 26  trans[z64[i+1] &
76d0: 20 30 78 37 66 5d 3b 0a 20 20 20 20 63 20 3d 20   0x7f];.    c = 
76e0: 74 72 61 6e 73 5b 7a 36 34 5b 69 2b 32 5d 20 26  trans[z64[i+2] &
76f0: 20 30 78 37 66 5d 3b 0a 20 20 20 20 7a 44 61 74   0x7f];.    zDat
7700: 61 5b 6a 2b 2b 5d 20 3d 20 28 28 61 3c 3c 32 29  a[j++] = ((a<<2)
7710: 20 26 20 30 78 66 63 29 20 7c 20 28 28 62 3e 3e   & 0xfc) | ((b>>
7720: 34 29 20 26 20 30 78 30 33 29 3b 0a 20 20 20 20  4) & 0x03);.    
7730: 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28 62  zData[j++] = ((b
7740: 3c 3c 34 29 20 26 20 30 78 66 30 29 20 7c 20 28  <<4) & 0xf0) | (
7750: 28 63 3e 3e 32 29 20 26 20 30 78 30 66 29 3b 0a  (c>>2) & 0x0f);.
7760: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 2b 31 3c    }else if( i+1<
7770: 6e 36 34 20 29 7b 0a 20 20 20 20 61 20 3d 20 74  n64 ){.    a = t
7780: 72 61 6e 73 5b 7a 36 34 5b 69 5d 20 26 20 30 78  rans[z64[i] & 0x
7790: 37 66 5d 3b 0a 20 20 20 20 62 20 3d 20 74 72 61  7f];.    b = tra
77a0: 6e 73 5b 7a 36 34 5b 69 2b 31 5d 20 26 20 30 78  ns[z64[i+1] & 0x
77b0: 37 66 5d 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a  7f];.    zData[j
77c0: 2b 2b 5d 20 3d 20 28 28 61 3c 3c 32 29 20 26 20  ++] = ((a<<2) & 
77d0: 30 78 66 63 29 20 7c 20 28 28 62 3e 3e 34 29 20  0xfc) | ((b>>4) 
77e0: 26 20 30 78 30 33 29 3b 0a 20 20 7d 0a 20 20 7a  & 0x03);.  }.  z
77f0: 44 61 74 61 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a  Data[j] = 0;.}..
7800: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
7810: 65 65 20 69 66 20 62 61 73 69 63 20 61 75 74 68  ee if basic auth
7820: 6f 72 69 7a 61 74 69 6f 6e 20 63 72 65 64 65 6e  orization creden
7830: 74 69 61 6c 73 20 61 72 65 20 70 72 6f 76 69 64  tials are provid
7840: 65 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20 75 73  ed for.** the us
7850: 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  er according to 
7860: 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
7870: 69 6e 20 7a 41 75 74 68 46 69 6c 65 2e 20 20 52  in zAuthFile.  R
7880: 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66  eturn true.** if
7890: 20 61 75 74 68 6f 72 69 7a 65 64 2e 20 20 52 65   authorized.  Re
78a0: 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 6e 6f  turn false if no
78b0: 74 20 61 75 74 68 6f 72 69 7a 65 64 2e 0a 2a 2a  t authorized..**
78c0: 0a 2a 2a 20 46 69 6c 65 20 66 6f 72 6d 61 74 3a  .** File format:
78d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 42 6c 61  .**.**    *  Bla
78e0: 6e 6b 20 6c 69 6e 65 73 20 61 6e 64 20 6c 69 6e  nk lines and lin
78f0: 65 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  es that begin wi
7900: 74 68 20 27 23 27 20 61 72 65 20 69 67 6e 6f 72  th '#' are ignor
7910: 65 64 0a 2a 2a 20 20 20 20 2a 20 20 22 68 74 74  ed.**    *  "htt
7920: 70 2d 72 65 64 69 72 65 63 74 22 20 66 6f 72 63  p-redirect" forc
7930: 65 73 20 61 20 72 65 64 69 72 65 63 74 20 74 6f  es a redirect to
7940: 20 48 54 54 50 53 20 69 66 20 6e 6f 74 20 74 68   HTTPS if not th
7950: 65 72 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 20  ere already.**  
7960: 20 20 2a 20 20 22 68 74 74 70 73 2d 6f 6e 6c 79    *  "https-only
7970: 22 20 64 69 73 61 6c 6c 6f 77 73 20 6f 70 65 72  " disallows oper
7980: 61 74 69 6f 6e 20 69 6e 20 48 54 54 50 0a 2a 2a  ation in HTTP.**
7990: 20 20 20 20 2a 20 20 22 75 73 65 72 20 4e 41 4d      *  "user NAM
79a0: 45 20 4c 4f 47 49 4e 3a 50 41 53 53 57 4f 52 44  E LOGIN:PASSWORD
79b0: 22 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  " checks to see 
79c0: 69 66 20 4c 4f 47 49 4e 3a 50 41 53 53 57 4f 52  if LOGIN:PASSWOR
79d0: 44 20 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 68  D .**       auth
79e0: 6f 72 69 7a 61 74 69 6f 6e 20 63 72 65 64 65 6e  orization creden
79f0: 74 69 61 6c 73 20 61 72 65 20 70 72 6f 76 69 64  tials are provid
7a00: 65 64 2c 20 61 6e 64 20 69 66 20 73 6f 20 73 65  ed, and if so se
7a10: 74 73 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  ts the.**       
7a20: 52 45 4d 4f 54 45 5f 55 53 45 52 20 74 6f 20 4e  REMOTE_USER to N
7a30: 41 4d 45 2e 0a 2a 2a 20 20 20 20 2a 20 20 22 72  AME..**    *  "r
7a40: 65 61 6c 6d 20 54 45 58 54 22 20 73 65 74 73 20  ealm TEXT" sets 
7a50: 74 68 65 20 72 65 61 6c 6d 20 74 6f 20 54 45 58  the realm to TEX
7a60: 54 2e 0a 2a 2a 20 20 20 20 2a 20 20 22 61 6e 79  T..**    *  "any
7a70: 6f 6e 65 22 20 62 79 70 61 73 73 65 73 20 61 75  one" bypasses au
7a80: 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 61 6e 64  thentication and
7a90: 20 61 6c 6c 6f 77 73 20 61 6e 79 6f 6e 65 20 74   allows anyone t
7aa0: 6f 20 73 65 65 20 74 68 65 0a 2a 2a 20 20 20 20  o see the.**    
7ab0: 20 20 20 66 69 6c 65 73 2e 20 20 55 73 65 66 75     files.  Usefu
7ac0: 6c 20 69 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  l in combination
7ad0: 20 77 69 74 68 20 22 68 74 74 70 2d 72 65 64 69   with "http-redi
7ae0: 72 65 63 74 22 0a 2a 2f 0a 73 74 61 74 69 63 20  rect".*/.static 
7af0: 69 6e 74 20 43 68 65 63 6b 42 61 73 69 63 41 75  int CheckBasicAu
7b00: 74 68 6f 72 69 7a 61 74 69 6f 6e 28 63 6f 6e 73  thorization(cons
7b10: 74 20 63 68 61 72 20 2a 7a 41 75 74 68 46 69 6c  t char *zAuthFil
7b20: 65 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a  e){.  FILE *in;.
7b30: 20 20 63 68 61 72 20 2a 7a 52 65 61 6c 6d 20 3d    char *zRealm =
7b40: 20 22 75 6e 6b 6e 6f 77 6e 20 72 65 61 6c 6d 22   "unknown realm"
7b50: 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 67 69 6e  ;.  char *zLogin
7b60: 50 73 77 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4e  Pswd;.  char *zN
7b70: 61 6d 65 3b 0a 20 20 63 68 61 72 20 7a 4c 69 6e  ame;.  char zLin
7b80: 65 5b 32 30 30 30 5d 3b 0a 0a 20 20 69 6e 20 3d  e[2000];..  in =
7b90: 20 66 6f 70 65 6e 28 7a 41 75 74 68 46 69 6c 65   fopen(zAuthFile
7ba0: 2c 20 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69  , "rb");.  if( i
7bb0: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 4e 6f 74 46  n==0 ){.    NotF
7bc0: 6f 75 6e 64 28 31 35 30 29 3b 20 20 2f 2a 20 4c  ound(150);  /* L
7bd0: 4f 47 3a 20 43 61 6e 6e 6f 74 20 6f 70 65 6e 20  OG: Cannot open 
7be0: 2d 61 75 74 68 20 66 69 6c 65 20 2a 2f 0a 20 20  -auth file */.  
7bf0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7c00: 20 20 69 66 28 20 7a 41 75 74 68 41 72 67 20 29    if( zAuthArg )
7c10: 20 44 65 63 6f 64 65 36 34 28 7a 41 75 74 68 41   Decode64(zAuthA
7c20: 72 67 29 3b 0a 20 20 77 68 69 6c 65 28 20 66 67  rg);.  while( fg
7c30: 65 74 73 28 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f  ets(zLine, sizeo
7c40: 66 28 7a 4c 69 6e 65 29 2c 20 69 6e 29 20 29 7b  f(zLine), in) ){
7c50: 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69 65 6c  .    char *zFiel
7c60: 64 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20  dName;.    char 
7c70: 2a 7a 56 61 6c 3b 0a 0a 20 20 20 20 7a 46 69 65  *zVal;..    zFie
7c80: 6c 64 4e 61 6d 65 20 3d 20 47 65 74 46 69 72 73  ldName = GetFirs
7c90: 74 45 6c 65 6d 65 6e 74 28 7a 4c 69 6e 65 2c 26  tElement(zLine,&
7ca0: 7a 56 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a  zVal);.    if( z
7cb0: 46 69 65 6c 64 4e 61 6d 65 3d 3d 30 20 7c 7c 20  FieldName==0 || 
7cc0: 2a 7a 46 69 65 6c 64 4e 61 6d 65 3d 3d 30 20 29  *zFieldName==0 )
7cd0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
7ce0: 66 28 20 7a 46 69 65 6c 64 4e 61 6d 65 5b 30 5d  f( zFieldName[0]
7cf0: 3d 3d 27 23 27 20 29 20 63 6f 6e 74 69 6e 75 65  =='#' ) continue
7d00: 3b 0a 20 20 20 20 52 65 6d 6f 76 65 4e 65 77 6c  ;.    RemoveNewl
7d10: 69 6e 65 28 7a 56 61 6c 29 3b 0a 20 20 20 20 69  ine(zVal);.    i
7d20: 66 28 20 73 74 72 63 6d 70 28 7a 46 69 65 6c 64  f( strcmp(zField
7d30: 4e 61 6d 65 2c 20 22 72 65 61 6c 6d 22 29 3d 3d  Name, "realm")==
7d40: 30 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 61 6c  0 ){.      zReal
7d50: 6d 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29  m = StrDup(zVal)
7d60: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
7d70: 73 74 72 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d  strcmp(zFieldNam
7d80: 65 2c 22 75 73 65 72 22 29 3d 3d 30 20 29 7b 0a  e,"user")==0 ){.
7d90: 20 20 20 20 20 20 69 66 28 20 7a 41 75 74 68 41        if( zAuthA
7da0: 72 67 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  rg==0 ) continue
7db0: 3b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  ;.      zName = 
7dc0: 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28  GetFirstElement(
7dd0: 7a 56 61 6c 2c 20 26 7a 56 61 6c 29 3b 0a 20 20  zVal, &zVal);.  
7de0: 20 20 20 20 7a 4c 6f 67 69 6e 50 73 77 64 20 3d      zLoginPswd =
7df0: 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74   GetFirstElement
7e00: 28 7a 56 61 6c 2c 20 26 7a 56 61 6c 29 3b 0a 20  (zVal, &zVal);. 
7e10: 20 20 20 20 20 69 66 28 20 7a 4c 6f 67 69 6e 50       if( zLoginP
7e20: 73 77 64 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  swd==0 ) continu
7e30: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 75  e;.      if( zAu
7e40: 74 68 41 72 67 20 26 26 20 73 74 72 63 6d 70 28  thArg && strcmp(
7e50: 7a 41 75 74 68 41 72 67 2c 7a 4c 6f 67 69 6e 50  zAuthArg,zLoginP
7e60: 73 77 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  swd)==0 ){.     
7e70: 20 20 20 7a 52 65 6d 6f 74 65 55 73 65 72 20 3d     zRemoteUser =
7e80: 20 53 74 72 44 75 70 28 7a 4e 61 6d 65 29 3b 0a   StrDup(zName);.
7e90: 20 20 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69          fclose(i
7ea0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  n);.        retu
7eb0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
7ec0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
7ed0: 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 68  mp(zFieldName,"h
7ee0: 74 74 70 73 2d 6f 6e 6c 79 22 29 3d 3d 30 20 29  ttps-only")==0 )
7ef0: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 75 73 65  {.      if( !use
7f00: 48 74 74 70 73 20 29 7b 0a 20 20 20 20 20 20 20  Https ){.       
7f10: 20 4e 6f 74 46 6f 75 6e 64 28 31 36 30 29 3b 20   NotFound(160); 
7f20: 20 2f 2a 20 4c 4f 47 3a 20 20 68 74 74 70 20 72   /* LOG:  http r
7f30: 65 71 75 65 73 74 20 6f 6e 20 68 74 74 70 73 2d  equest on https-
7f40: 6f 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 20 20 20  only page */.   
7f50: 20 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b       fclose(in);
7f60: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
7f70: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
7f80: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
7f90: 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 68 74 74 70  zFieldName,"http
7fa0: 2d 72 65 64 69 72 65 63 74 22 29 3d 3d 30 20 29  -redirect")==0 )
7fb0: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 75 73 65  {.      if( !use
7fc0: 48 74 74 70 73 20 29 7b 0a 20 20 20 20 20 20 20  Https ){.       
7fd0: 20 7a 48 74 74 70 20 3d 20 22 68 74 74 70 73 22   zHttp = "https"
7fe0: 3b 0a 20 20 20 20 20 20 20 20 52 65 64 69 72 65  ;.        Redire
7ff0: 63 74 28 7a 53 63 72 69 70 74 2c 20 31 2c 20 31  ct(zScript, 1, 1
8000: 37 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 2d 61 75  70); /* LOG: -au
8010: 74 68 20 72 65 64 69 72 65 63 74 20 2a 2f 0a 20  th redirect */. 
8020: 20 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69 6e         fclose(in
8030: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
8040: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
8050: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
8060: 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 61 6e  p(zFieldName,"an
8070: 79 6f 6e 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  yone")==0 ){.   
8080: 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
8090: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
80a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
80b0: 4e 6f 74 46 6f 75 6e 64 28 31 38 30 29 3b 20 20  NotFound(180);  
80c0: 2f 2a 20 4c 4f 47 3a 20 20 6d 61 6c 66 6f 72 6d  /* LOG:  malform
80d0: 65 64 20 65 6e 74 72 79 20 69 6e 20 2d 61 75 74  ed entry in -aut
80e0: 68 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20  h file */.      
80f0: 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20  fclose(in);.    
8100: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
8110: 7d 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69  }.  }.  fclose(i
8120: 6e 29 3b 0a 20 20 4e 6f 74 41 75 74 68 6f 72 69  n);.  NotAuthori
8130: 7a 65 64 28 7a 52 65 61 6c 6d 29 3b 0a 20 20 72  zed(zRealm);.  r
8140: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
8150: 2a 20 47 75 65 73 73 20 74 68 65 20 6d 69 6d 65  * Guess the mime
8160: 2d 74 79 70 65 20 6f 66 20 61 20 64 6f 63 75 6d  -type of a docum
8170: 65 6e 74 20 62 61 73 65 64 20 6f 6e 20 69 74 73  ent based on its
8180: 20 6e 61 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   name..*/.const 
8190: 63 68 61 72 20 2a 47 65 74 4d 69 6d 65 54 79 70  char *GetMimeTyp
81a0: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  e(const char *zN
81b0: 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b  ame, int nName){
81c0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
81d0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
81e0: 20 66 69 72 73 74 2c 20 6c 61 73 74 3b 0a 20 20   first, last;.  
81f0: 69 6e 74 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20  int len;.  char 
8200: 7a 53 75 66 66 69 78 5b 32 30 5d 3b 0a 0a 20 20  zSuffix[20];..  
8210: 2f 2a 20 41 20 74 61 62 6c 65 20 6f 66 20 6d 69  /* A table of mi
8220: 6d 65 74 79 70 65 73 20 62 61 73 65 64 20 6f 6e  metypes based on
8230: 20 66 69 6c 65 20 73 75 66 66 69 78 65 73 2e 20   file suffixes. 
8240: 0a 20 20 2a 2a 20 53 75 66 66 69 78 65 73 20 6d  .  ** Suffixes m
8250: 75 73 74 20 62 65 20 69 6e 20 73 6f 72 74 65 64  ust be in sorted
8260: 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20 77   order so that w
8270: 65 20 63 61 6e 20 64 6f 20 61 20 62 69 6e 61 72  e can do a binar
8280: 79 0a 20 20 2a 2a 20 73 65 61 72 63 68 20 74 6f  y.  ** search to
8290: 20 66 69 6e 64 20 74 68 65 20 6d 69 6d 65 2d 74   find the mime-t
82a0: 79 70 65 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69  ype.  */.  stati
82b0: 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
82c0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
82d0: 2a 7a 53 75 66 66 69 78 3b 20 20 20 20 20 20 20  *zSuffix;       
82e0: 2f 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66 66  /* The file suff
82f0: 69 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 69  ix */.    int si
8300: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
8310: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
8320: 66 20 74 68 65 20 73 75 66 66 69 78 20 2a 2f 0a  f the suffix */.
8330: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
8340: 7a 4d 69 6d 65 74 79 70 65 3b 20 20 20 20 20 2f  zMimetype;     /
8350: 2a 20 54 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  * The correspond
8360: 69 6e 67 20 6d 69 6d 65 74 79 70 65 20 2a 2f 0a  ing mimetype */.
8370: 20 20 7d 20 61 4d 69 6d 65 5b 5d 20 3d 20 7b 0a    } aMime[] = {.
8380: 20 20 20 20 7b 20 22 61 69 22 2c 20 20 20 20 20      { "ai",     
8390: 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74      2, "applicat
83a0: 69 6f 6e 2f 70 6f 73 74 73 63 72 69 70 74 22 20  ion/postscript" 
83b0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
83c0: 20 20 7b 20 22 61 69 66 22 2c 20 20 20 20 20 20    { "aif",      
83d0: 20 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 61 69    3, "audio/x-ai
83e0: 66 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ff"             
83f0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
8400: 7b 20 22 61 69 66 63 22 2c 20 20 20 20 20 20 20  { "aifc",       
8410: 34 2c 20 22 61 75 64 69 6f 2f 78 2d 61 69 66 66  4, "audio/x-aiff
8420: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8430: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8440: 22 61 69 66 66 22 2c 20 20 20 20 20 20 20 34 2c  "aiff",       4,
8450: 20 22 61 75 64 69 6f 2f 78 2d 61 69 66 66 22 20   "audio/x-aiff" 
8460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8470: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61       },.    { "a
8480: 72 6a 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  rj",        3, "
8490: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 61 72  application/x-ar
84a0: 6a 2d 63 6f 6d 70 72 65 73 73 65 64 22 20 20 20  j-compressed"   
84b0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 73 63     },.    { "asc
84c0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65  ",        3, "te
84d0: 78 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20  xt/plain"       
84e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84f0: 20 7d 2c 0a 20 20 20 20 7b 20 22 61 73 66 22 2c   },.    { "asf",
8500: 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64 65          3, "vide
8510: 6f 2f 78 2d 6d 73 2d 61 73 66 22 20 20 20 20 20  o/x-ms-asf"     
8520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8530: 2c 0a 20 20 20 20 7b 20 22 61 73 78 22 2c 20 20  ,.    { "asx",  
8540: 20 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f        3, "video/
8550: 78 2d 6d 73 2d 61 73 78 22 20 20 20 20 20 20 20  x-ms-asx"       
8560: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
8570: 20 20 20 20 7b 20 22 61 75 22 2c 20 20 20 20 20      { "au",     
8580: 20 20 20 20 32 2c 20 22 61 75 64 69 6f 2f 75 6c      2, "audio/ul
8590: 61 77 22 20 20 20 20 20 20 20 20 20 20 20 20 20  aw"             
85a0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
85b0: 20 20 7b 20 22 61 76 69 22 2c 20 20 20 20 20 20    { "avi",      
85c0: 20 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73    3, "video/x-ms
85d0: 76 69 64 65 6f 22 20 20 20 20 20 20 20 20 20 20  video"          
85e0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
85f0: 7b 20 22 62 61 74 22 2c 20 20 20 20 20 20 20 20  { "bat",        
8600: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
8610: 78 2d 6d 73 64 6f 73 2d 70 72 6f 67 72 61 6d 22  x-msdos-program"
8620: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8630: 22 62 63 70 69 6f 22 2c 20 20 20 20 20 20 35 2c  "bcpio",      5,
8640: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
8650: 62 63 70 69 6f 22 20 20 20 20 20 20 20 20 20 20  bcpio"          
8660: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 62       },.    { "b
8670: 69 6e 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  in",        3, "
8680: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65  application/octe
8690: 74 2d 73 74 72 65 61 6d 22 20 20 20 20 20 20 20  t-stream"       
86a0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 22 2c     },.    { "c",
86b0: 20 20 20 20 20 20 20 20 20 20 31 2c 20 22 74 65            1, "te
86c0: 78 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20  xt/plain"       
86d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86e0: 20 7d 2c 0a 20 20 20 20 7b 20 22 63 63 22 2c 20   },.    { "cc", 
86f0: 20 20 20 20 20 20 20 20 32 2c 20 22 74 65 78 74          2, "text
8700: 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20  /plain"         
8710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8720: 2c 0a 20 20 20 20 7b 20 22 63 63 61 64 22 2c 20  ,.    { "ccad", 
8730: 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63        4, "applic
8740: 61 74 69 6f 6e 2f 63 6c 61 72 69 73 63 61 64 22  ation/clariscad"
8750: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
8760: 20 20 20 20 7b 20 22 63 64 66 22 2c 20 20 20 20      { "cdf",    
8770: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
8780: 69 6f 6e 2f 78 2d 6e 65 74 63 64 66 22 20 20 20  ion/x-netcdf"   
8790: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
87a0: 20 20 7b 20 22 63 6c 61 73 73 22 2c 20 20 20 20    { "class",    
87b0: 20 20 35 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    5, "applicatio
87c0: 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22 20  n/octet-stream" 
87d0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
87e0: 7b 20 22 63 6f 64 22 2c 20 20 20 20 20 20 20 20  { "cod",        
87f0: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
8800: 76 6e 64 2e 72 69 6d 2e 63 6f 64 22 20 20 20 20  vnd.rim.cod"    
8810: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8820: 22 63 6f 6d 22 2c 20 20 20 20 20 20 20 20 33 2c  "com",        3,
8830: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
8840: 6d 73 64 6f 73 2d 70 72 6f 67 72 61 6d 22 20 20  msdos-program"  
8850: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63       },.    { "c
8860: 70 69 6f 22 2c 20 20 20 20 20 20 20 34 2c 20 22  pio",       4, "
8870: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 63 70  application/x-cp
8880: 69 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20  io"             
8890: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 70 74     },.    { "cpt
88a0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
88b0: 70 6c 69 63 61 74 69 6f 6e 2f 6d 61 63 2d 63 6f  plication/mac-co
88c0: 6d 70 61 63 74 70 72 6f 22 20 20 20 20 20 20 20  mpactpro"       
88d0: 20 7d 2c 0a 20 20 20 20 7b 20 22 63 73 68 22 2c   },.    { "csh",
88e0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
88f0: 69 63 61 74 69 6f 6e 2f 78 2d 63 73 68 22 20 20  ication/x-csh"  
8900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8910: 2c 0a 20 20 20 20 7b 20 22 63 73 73 22 2c 20 20  ,.    { "css",  
8920: 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 63        3, "text/c
8930: 73 73 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ss"             
8940: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
8950: 20 20 20 20 7b 20 22 64 63 72 22 2c 20 20 20 20      { "dcr",    
8960: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
8970: 69 6f 6e 2f 78 2d 64 69 72 65 63 74 6f 72 22 20  ion/x-director" 
8980: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8990: 20 20 7b 20 22 64 65 62 22 2c 20 20 20 20 20 20    { "deb",      
89a0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
89b0: 6e 2f 78 2d 64 65 62 69 61 6e 2d 70 61 63 6b 61  n/x-debian-packa
89c0: 67 65 22 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  ge"      },.    
89d0: 7b 20 22 64 69 72 22 2c 20 20 20 20 20 20 20 20  { "dir",        
89e0: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
89f0: 78 2d 64 69 72 65 63 74 6f 72 22 20 20 20 20 20  x-director"     
8a00: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8a10: 22 64 6c 22 2c 20 20 20 20 20 20 20 20 20 32 2c  "dl",         2,
8a20: 20 22 76 69 64 65 6f 2f 64 6c 22 20 20 20 20 20   "video/dl"     
8a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a40: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64       },.    { "d
8a50: 6d 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ms",        3, "
8a60: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65  application/octe
8a70: 74 2d 73 74 72 65 61 6d 22 20 20 20 20 20 20 20  t-stream"       
8a80: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 6f 63     },.    { "doc
8a90: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
8aa0: 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 77 6f 72 64  plication/msword
8ab0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8ac0: 20 7d 2c 0a 20 20 20 20 7b 20 22 64 72 77 22 2c   },.    { "drw",
8ad0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
8ae0: 69 63 61 74 69 6f 6e 2f 64 72 61 66 74 69 6e 67  ication/drafting
8af0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  "              }
8b00: 2c 0a 20 20 20 20 7b 20 22 64 76 69 22 2c 20 20  ,.    { "dvi",  
8b10: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
8b20: 61 74 69 6f 6e 2f 78 2d 64 76 69 22 20 20 20 20  ation/x-dvi"    
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
8b40: 20 20 20 20 7b 20 22 64 77 67 22 2c 20 20 20 20      { "dwg",    
8b50: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
8b60: 69 6f 6e 2f 61 63 61 64 22 20 20 20 20 20 20 20  ion/acad"       
8b70: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8b80: 20 20 7b 20 22 64 78 66 22 2c 20 20 20 20 20 20    { "dxf",      
8b90: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
8ba0: 6e 2f 64 78 66 22 20 20 20 20 20 20 20 20 20 20  n/dxf"          
8bb0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
8bc0: 7b 20 22 64 78 72 22 2c 20 20 20 20 20 20 20 20  { "dxr",        
8bd0: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
8be0: 78 2d 64 69 72 65 63 74 6f 72 22 20 20 20 20 20  x-director"     
8bf0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8c00: 22 65 70 73 22 2c 20 20 20 20 20 20 20 20 33 2c  "eps",        3,
8c10: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 6f   "application/po
8c20: 73 74 73 63 72 69 70 74 22 20 20 20 20 20 20 20  stscript"       
8c30: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65       },.    { "e
8c40: 74 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  tx",        3, "
8c50: 74 65 78 74 2f 78 2d 73 65 74 65 78 74 22 20 20  text/x-setext"  
8c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c70: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65 78 65     },.    { "exe
8c80: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
8c90: 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d  plication/octet-
8ca0: 73 74 72 65 61 6d 22 20 20 20 20 20 20 20 20 20  stream"         
8cb0: 20 7d 2c 0a 20 20 20 20 7b 20 22 65 7a 22 2c 20   },.    { "ez", 
8cc0: 20 20 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c          2, "appl
8cd0: 69 63 61 74 69 6f 6e 2f 61 6e 64 72 65 77 2d 69  ication/andrew-i
8ce0: 6e 73 65 74 22 20 20 20 20 20 20 20 20 20 20 7d  nset"          }
8cf0: 2c 0a 20 20 20 20 7b 20 22 66 22 2c 20 20 20 20  ,.    { "f",    
8d00: 20 20 20 20 20 20 31 2c 20 22 74 65 78 74 2f 70        1, "text/p
8d10: 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20 20 20  lain"           
8d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
8d30: 20 20 20 20 7b 20 22 66 39 30 22 2c 20 20 20 20      { "f90",    
8d40: 20 20 20 20 33 2c 20 22 74 65 78 74 2f 70 6c 61      3, "text/pla
8d50: 69 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20  in"             
8d60: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8d70: 20 20 7b 20 22 66 6c 69 22 2c 20 20 20 20 20 20    { "fli",      
8d80: 20 20 33 2c 20 22 76 69 64 65 6f 2f 66 6c 69 22    3, "video/fli"
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8da0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
8db0: 7b 20 22 66 6c 76 22 2c 20 20 20 20 20 20 20 20  { "flv",        
8dc0: 33 2c 20 22 76 69 64 65 6f 2f 66 6c 76 22 20 20  3, "video/flv"  
8dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8de0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8df0: 22 67 69 66 22 2c 20 20 20 20 20 20 20 20 33 2c  "gif",        3,
8e00: 20 22 69 6d 61 67 65 2f 67 69 66 22 20 20 20 20   "image/gif"    
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e20: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 67       },.    { "g
8e30: 6c 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22  l",         2, "
8e40: 76 69 64 65 6f 2f 67 6c 22 20 20 20 20 20 20 20  video/gl"       
8e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e60: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 67 74 61     },.    { "gta
8e70: 72 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70  r",       4, "ap
8e80: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 67 74 61 72  plication/x-gtar
8e90: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8ea0: 20 7d 2c 0a 20 20 20 20 7b 20 22 67 7a 22 2c 20   },.    { "gz", 
8eb0: 20 20 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c          2, "appl
8ec0: 69 63 61 74 69 6f 6e 2f 78 2d 67 7a 69 70 22 20  ication/x-gzip" 
8ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8ee0: 2c 0a 20 20 20 20 7b 20 22 68 64 66 22 2c 20 20  ,.    { "hdf",  
8ef0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
8f00: 61 74 69 6f 6e 2f 78 2d 68 64 66 22 20 20 20 20  ation/x-hdf"    
8f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
8f20: 20 20 20 20 7b 20 22 68 68 22 2c 20 20 20 20 20      { "hh",     
8f30: 20 20 20 20 32 2c 20 22 74 65 78 74 2f 70 6c 61      2, "text/pla
8f40: 69 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20  in"             
8f50: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8f60: 20 20 7b 20 22 68 71 78 22 2c 20 20 20 20 20 20    { "hqx",      
8f70: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
8f80: 6e 2f 6d 61 63 2d 62 69 6e 68 65 78 34 30 22 20  n/mac-binhex40" 
8f90: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
8fa0: 7b 20 22 68 22 2c 20 20 20 20 20 20 20 20 20 20  { "h",          
8fb0: 31 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20  1, "text/plain" 
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fd0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8fe0: 22 68 74 6d 22 2c 20 20 20 20 20 20 20 20 33 2c  "htm",        3,
8ff0: 20 22 74 65 78 74 2f 68 74 6d 6c 3b 20 63 68 61   "text/html; cha
9000: 72 73 65 74 3d 75 74 66 2d 38 22 20 20 20 20 20  rset=utf-8"     
9010: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68       },.    { "h
9020: 74 6d 6c 22 2c 20 20 20 20 20 20 20 34 2c 20 22  tml",       4, "
9030: 74 65 78 74 2f 68 74 6d 6c 3b 20 63 68 61 72 73  text/html; chars
9040: 65 74 3d 75 74 66 2d 38 22 20 20 20 20 20 20 20  et=utf-8"       
9050: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 63 65     },.    { "ice
9060: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 78 2d  ",        3, "x-
9070: 63 6f 6e 66 65 72 65 6e 63 65 2f 78 2d 63 6f 6f  conference/x-coo
9080: 6c 74 61 6c 6b 22 20 20 20 20 20 20 20 20 20 20  ltalk"          
9090: 20 7d 2c 0a 20 20 20 20 7b 20 22 69 65 66 22 2c   },.    { "ief",
90a0: 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67          3, "imag
90b0: 65 2f 69 65 66 22 20 20 20 20 20 20 20 20 20 20  e/ief"          
90c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
90d0: 2c 0a 20 20 20 20 7b 20 22 69 67 65 73 22 2c 20  ,.    { "iges", 
90e0: 20 20 20 20 20 20 34 2c 20 22 6d 6f 64 65 6c 2f        4, "model/
90f0: 69 67 65 73 22 20 20 20 20 20 20 20 20 20 20 20  iges"           
9100: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
9110: 20 20 20 20 7b 20 22 69 67 73 22 2c 20 20 20 20      { "igs",    
9120: 20 20 20 20 33 2c 20 22 6d 6f 64 65 6c 2f 69 67      3, "model/ig
9130: 65 73 22 20 20 20 20 20 20 20 20 20 20 20 20 20  es"             
9140: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
9150: 20 20 7b 20 22 69 70 73 22 2c 20 20 20 20 20 20    { "ips",      
9160: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
9170: 6e 2f 78 2d 69 70 73 63 72 69 70 74 22 20 20 20  n/x-ipscript"   
9180: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9190: 7b 20 22 69 70 78 22 2c 20 20 20 20 20 20 20 20  { "ipx",        
91a0: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
91b0: 78 2d 69 70 69 78 22 20 20 20 20 20 20 20 20 20  x-ipix"         
91c0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
91d0: 22 6a 61 64 22 2c 20 20 20 20 20 20 20 20 33 2c  "jad",        3,
91e0: 20 22 74 65 78 74 2f 76 6e 64 2e 73 75 6e 2e 6a   "text/vnd.sun.j
91f0: 32 6d 65 2e 61 70 70 2d 64 65 73 63 72 69 70 74  2me.app-descript
9200: 6f 72 22 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a  or"  },.    { "j
9210: 61 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ar",        3, "
9220: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6a 61 76 61  application/java
9230: 2d 61 72 63 68 69 76 65 22 20 20 20 20 20 20 20  -archive"       
9240: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 70 65     },.    { "jpe
9250: 67 22 2c 20 20 20 20 20 20 20 34 2c 20 22 69 6d  g",       4, "im
9260: 61 67 65 2f 6a 70 65 67 22 20 20 20 20 20 20 20  age/jpeg"       
9270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9280: 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 70 65 22 2c   },.    { "jpe",
9290: 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67          3, "imag
92a0: 65 2f 6a 70 65 67 22 20 20 20 20 20 20 20 20 20  e/jpeg"         
92b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
92c0: 2c 0a 20 20 20 20 7b 20 22 6a 70 67 22 2c 20 20  ,.    { "jpg",  
92d0: 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f        3, "image/
92e0: 6a 70 65 67 22 20 20 20 20 20 20 20 20 20 20 20  jpeg"           
92f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
9300: 20 20 20 20 7b 20 22 6a 73 22 2c 20 20 20 20 20      { "js",     
9310: 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74      2, "applicat
9320: 69 6f 6e 2f 78 2d 6a 61 76 61 73 63 72 69 70 74  ion/x-javascript
9330: 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  "          },.  
9340: 20 20 7b 20 22 6b 61 72 22 2c 20 20 20 20 20 20    { "kar",      
9350: 20 20 33 2c 20 22 61 75 64 69 6f 2f 6d 69 64 69    3, "audio/midi
9360: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9370: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9380: 7b 20 22 6c 61 74 65 78 22 2c 20 20 20 20 20 20  { "latex",      
9390: 35 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  5, "application/
93a0: 78 2d 6c 61 74 65 78 22 20 20 20 20 20 20 20 20  x-latex"        
93b0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
93c0: 22 6c 68 61 22 2c 20 20 20 20 20 20 20 20 33 2c  "lha",        3,
93d0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63   "application/oc
93e0: 74 65 74 2d 73 74 72 65 61 6d 22 20 20 20 20 20  tet-stream"     
93f0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c       },.    { "l
9400: 73 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  sp",        3, "
9410: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6c 69  application/x-li
9420: 73 70 22 20 20 20 20 20 20 20 20 20 20 20 20 20  sp"             
9430: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 7a 68     },.    { "lzh
9440: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
9450: 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d  plication/octet-
9460: 73 74 72 65 61 6d 22 20 20 20 20 20 20 20 20 20  stream"         
9470: 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 22 2c 20 20   },.    { "m",  
9480: 20 20 20 20 20 20 20 20 31 2c 20 22 74 65 78 74          1, "text
9490: 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20  /plain"         
94a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
94b0: 2c 0a 20 20 20 20 7b 20 22 6d 33 75 22 2c 20 20  ,.    { "m3u",  
94c0: 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f        3, "audio/
94d0: 78 2d 6d 70 65 67 75 72 6c 22 20 20 20 20 20 20  x-mpegurl"      
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
94f0: 20 20 20 20 7b 20 22 6d 61 6e 22 2c 20 20 20 20      { "man",    
9500: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
9510: 69 6f 6e 2f 78 2d 74 72 6f 66 66 2d 6d 61 6e 22  ion/x-troff-man"
9520: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
9530: 20 20 7b 20 22 6d 65 22 2c 20 20 20 20 20 20 20    { "me",       
9540: 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    2, "applicatio
9550: 6e 2f 78 2d 74 72 6f 66 66 2d 6d 65 22 20 20 20  n/x-troff-me"   
9560: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9570: 7b 20 22 6d 65 73 68 22 2c 20 20 20 20 20 20 20  { "mesh",       
9580: 34 2c 20 22 6d 6f 64 65 6c 2f 6d 65 73 68 22 20  4, "model/mesh" 
9590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95a0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
95b0: 22 6d 69 64 22 2c 20 20 20 20 20 20 20 20 33 2c  "mid",        3,
95c0: 20 22 61 75 64 69 6f 2f 6d 69 64 69 22 20 20 20   "audio/midi"   
95d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95e0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d       },.    { "m
95f0: 69 64 69 22 2c 20 20 20 20 20 20 20 34 2c 20 22  idi",       4, "
9600: 61 75 64 69 6f 2f 6d 69 64 69 22 20 20 20 20 20  audio/midi"     
9610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9620: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 69 66     },.    { "mif
9630: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
9640: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6d 69 66 22  plication/x-mif"
9650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9660: 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 69 6d 65 22   },.    { "mime"
9670: 2c 20 20 20 20 20 20 20 34 2c 20 22 77 77 77 2f  ,       4, "www/
9680: 6d 69 6d 65 22 20 20 20 20 20 20 20 20 20 20 20  mime"           
9690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
96a0: 2c 0a 20 20 20 20 7b 20 22 6d 6f 76 69 65 22 2c  ,.    { "movie",
96b0: 20 20 20 20 20 20 35 2c 20 22 76 69 64 65 6f 2f        5, "video/
96c0: 78 2d 73 67 69 2d 6d 6f 76 69 65 22 20 20 20 20  x-sgi-movie"    
96d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
96e0: 20 20 20 20 7b 20 22 6d 6f 76 22 2c 20 20 20 20      { "mov",    
96f0: 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 71 75      3, "video/qu
9700: 69 63 6b 74 69 6d 65 22 20 20 20 20 20 20 20 20  icktime"        
9710: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
9720: 20 20 7b 20 22 6d 70 32 22 2c 20 20 20 20 20 20    { "mp2",      
9730: 20 20 33 2c 20 22 61 75 64 69 6f 2f 6d 70 65 67    3, "audio/mpeg
9740: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9750: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9760: 7b 20 22 6d 70 32 22 2c 20 20 20 20 20 20 20 20  { "mp2",        
9770: 33 2c 20 22 76 69 64 65 6f 2f 6d 70 65 67 22 20  3, "video/mpeg" 
9780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9790: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
97a0: 22 6d 70 33 22 2c 20 20 20 20 20 20 20 20 33 2c  "mp3",        3,
97b0: 20 22 61 75 64 69 6f 2f 6d 70 65 67 22 20 20 20   "audio/mpeg"   
97c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97d0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d       },.    { "m
97e0: 70 65 67 22 2c 20 20 20 20 20 20 20 34 2c 20 22  peg",       4, "
97f0: 76 69 64 65 6f 2f 6d 70 65 67 22 20 20 20 20 20  video/mpeg"     
9800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9810: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 65     },.    { "mpe
9820: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69  ",        3, "vi
9830: 64 65 6f 2f 6d 70 65 67 22 20 20 20 20 20 20 20  deo/mpeg"       
9840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9850: 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 67 61 22   },.    { "mpga"
9860: 2c 20 20 20 20 20 20 20 34 2c 20 22 61 75 64 69  ,       4, "audi
9870: 6f 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20 20  o/mpeg"         
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
9890: 2c 0a 20 20 20 20 7b 20 22 6d 70 67 22 2c 20 20  ,.    { "mpg",  
98a0: 20 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f        3, "video/
98b0: 6d 70 65 67 22 20 20 20 20 20 20 20 20 20 20 20  mpeg"           
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
98d0: 20 20 20 20 7b 20 22 6d 73 22 2c 20 20 20 20 20      { "ms",     
98e0: 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74      2, "applicat
98f0: 69 6f 6e 2f 78 2d 74 72 6f 66 66 2d 6d 73 22 20  ion/x-troff-ms" 
9900: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
9910: 20 20 7b 20 22 6d 73 68 22 2c 20 20 20 20 20 20    { "msh",      
9920: 20 20 33 2c 20 22 6d 6f 64 65 6c 2f 6d 65 73 68    3, "model/mesh
9930: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9940: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9950: 7b 20 22 6e 63 22 2c 20 20 20 20 20 20 20 20 20  { "nc",         
9960: 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  2, "application/
9970: 78 2d 6e 65 74 63 64 66 22 20 20 20 20 20 20 20  x-netcdf"       
9980: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
9990: 22 6f 64 61 22 2c 20 20 20 20 20 20 20 20 33 2c  "oda",        3,
99a0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 64   "application/od
99b0: 61 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a"              
99c0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f       },.    { "o
99d0: 67 67 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  gg",        3, "
99e0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 67 67 22  application/ogg"
99f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a00: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 67 6d     },.    { "ogm
9a10: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
9a20: 70 6c 69 63 61 74 69 6f 6e 2f 6f 67 67 22 20 20  plication/ogg"  
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a40: 20 7d 2c 0a 20 20 20 20 7b 20 22 70 62 6d 22 2c   },.    { "pbm",
9a50: 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67          3, "imag
9a60: 65 2f 78 2d 70 6f 72 74 61 62 6c 65 2d 62 69 74  e/x-portable-bit
9a70: 6d 61 70 22 20 20 20 20 20 20 20 20 20 20 20 7d  map"           }
9a80: 2c 0a 20 20 20 20 7b 20 22 70 64 62 22 2c 20 20  ,.    { "pdb",  
9a90: 20 20 20 20 20 20 33 2c 20 22 63 68 65 6d 69 63        3, "chemic
9aa0: 61 6c 2f 78 2d 70 64 62 22 20 20 20 20 20 20 20  al/x-pdb"       
9ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
9ac0: 20 20 20 20 7b 20 22 70 64 66 22 2c 20 20 20 20      { "pdf",    
9ad0: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
9ae0: 69 6f 6e 2f 70 64 66 22 20 20 20 20 20 20 20 20  ion/pdf"        
9af0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
9b00: 20 20 7b 20 22 70 67 6d 22 2c 20 20 20 20 20 20    { "pgm",      
9b10: 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 70 6f    3, "image/x-po
9b20: 72 74 61 62 6c 65 2d 67 72 61 79 6d 61 70 22 20  rtable-graymap" 
9b30: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9b40: 7b 20 22 70 67 6e 22 2c 20 20 20 20 20 20 20 20  { "pgn",        
9b50: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
9b60: 78 2d 63 68 65 73 73 2d 70 67 6e 22 20 20 20 20  x-chess-pgn"    
9b70: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
9b80: 22 70 67 70 22 2c 20 20 20 20 20 20 20 20 33 2c  "pgp",        3,
9b90: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 67   "application/pg
9ba0: 70 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p"              
9bb0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70       },.    { "p
9bc0: 6c 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22  l",         2, "
9bd0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 70 65  application/x-pe
9be0: 72 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20  rl"             
9bf0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 6d 22     },.    { "pm"
9c00: 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70  ,         2, "ap
9c10: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 70 65 72 6c  plication/x-perl
9c20: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9c30: 20 7d 2c 0a 20 20 20 20 7b 20 22 70 6e 67 22 2c   },.    { "png",
9c40: 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67          3, "imag
9c50: 65 2f 70 6e 67 22 20 20 20 20 20 20 20 20 20 20  e/png"          
9c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
9c70: 2c 0a 20 20 20 20 7b 20 22 70 6e 6d 22 2c 20 20  ,.    { "pnm",  
9c80: 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f        3, "image/
9c90: 78 2d 70 6f 72 74 61 62 6c 65 2d 61 6e 79 6d 61  x-portable-anyma
9ca0: 70 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  p"           },.
9cb0: 20 20 20 20 7b 20 22 70 6f 74 22 2c 20 20 20 20      { "pot",    
9cc0: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
9cd0: 69 6f 6e 2f 6d 73 70 6f 77 65 72 70 6f 69 6e 74  ion/mspowerpoint
9ce0: 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  "          },.  
9cf0: 20 20 7b 20 22 70 70 6d 22 2c 20 20 20 20 20 20    { "ppm",      
9d00: 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 70 6f    3, "image/x-po
9d10: 72 74 61 62 6c 65 2d 70 69 78 6d 61 70 22 20 20  rtable-pixmap"  
9d20: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9d30: 7b 20 22 70 70 73 22 2c 20 20 20 20 20 20 20 20  { "pps",        
9d40: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
9d50: 6d 73 70 6f 77 65 72 70 6f 69 6e 74 22 20 20 20  mspowerpoint"   
9d60: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
9d70: 22 70 70 74 22 2c 20 20 20 20 20 20 20 20 33 2c  "ppt",        3,
9d80: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73   "application/ms
9d90: 70 6f 77 65 72 70 6f 69 6e 74 22 20 20 20 20 20  powerpoint"     
9da0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70       },.    { "p
9db0: 70 7a 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  pz",        3, "
9dc0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 70 6f  application/mspo
9dd0: 77 65 72 70 6f 69 6e 74 22 20 20 20 20 20 20 20  werpoint"       
9de0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 72 65     },.    { "pre
9df0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
9e00: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 66 72 65 65  plication/x-free
9e10: 6c 61 6e 63 65 22 20 20 20 20 20 20 20 20 20 20  lance"          
9e20: 20 7d 2c 0a 20 20 20 20 7b 20 22 70 72 74 22 2c   },.    { "prt",
9e30: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
9e40: 69 63 61 74 69 6f 6e 2f 70 72 6f 5f 65 6e 67 22  ication/pro_eng"
9e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
9e60: 2c 0a 20 20 20 20 7b 20 22 70 73 22 2c 20 20 20  ,.    { "ps",   
9e70: 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63        2, "applic
9e80: 61 74 69 6f 6e 2f 70 6f 73 74 73 63 72 69 70 74  ation/postscript
9e90: 22 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  "            },.
9ea0: 20 20 20 20 7b 20 22 71 74 22 2c 20 20 20 20 20      { "qt",     
9eb0: 20 20 20 20 32 2c 20 22 76 69 64 65 6f 2f 71 75      2, "video/qu
9ec0: 69 63 6b 74 69 6d 65 22 20 20 20 20 20 20 20 20  icktime"        
9ed0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
9ee0: 20 20 7b 20 22 72 61 22 2c 20 20 20 20 20 20 20    { "ra",       
9ef0: 20 20 32 2c 20 22 61 75 64 69 6f 2f 78 2d 72 65    2, "audio/x-re
9f00: 61 6c 61 75 64 69 6f 22 20 20 20 20 20 20 20 20  alaudio"        
9f10: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9f20: 7b 20 22 72 61 6d 22 2c 20 20 20 20 20 20 20 20  { "ram",        
9f30: 33 2c 20 22 61 75 64 69 6f 2f 78 2d 70 6e 2d 72  3, "audio/x-pn-r
9f40: 65 61 6c 61 75 64 69 6f 22 20 20 20 20 20 20 20  ealaudio"       
9f50: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
9f60: 22 72 61 72 22 2c 20 20 20 20 20 20 20 20 33 2c  "rar",        3,
9f70: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
9f80: 72 61 72 2d 63 6f 6d 70 72 65 73 73 65 64 22 20  rar-compressed" 
9f90: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72       },.    { "r
9fa0: 61 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  as",        3, "
9fb0: 69 6d 61 67 65 2f 63 6d 75 2d 72 61 73 74 65 72  image/cmu-raster
9fc0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9fd0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61 73     },.    { "ras
9fe0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d  ",        3, "im
9ff0: 61 67 65 2f 78 2d 63 6d 75 2d 72 61 73 74 65 72  age/x-cmu-raster
a000: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
a010: 20 7d 2c 0a 20 20 20 20 7b 20 22 72 67 62 22 2c   },.    { "rgb",
a020: 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67          3, "imag
a030: 65 2f 78 2d 72 67 62 22 20 20 20 20 20 20 20 20  e/x-rgb"        
a040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
a050: 2c 0a 20 20 20 20 7b 20 22 72 6d 22 2c 20 20 20  ,.    { "rm",   
a060: 20 20 20 20 20 20 32 2c 20 22 61 75 64 69 6f 2f        2, "audio/
a070: 78 2d 70 6e 2d 72 65 61 6c 61 75 64 69 6f 22 20  x-pn-realaudio" 
a080: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
a090: 20 20 20 20 7b 20 22 72 6f 66 66 22 2c 20 20 20      { "roff",   
a0a0: 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74      4, "applicat
a0b0: 69 6f 6e 2f 78 2d 74 72 6f 66 66 22 20 20 20 20  ion/x-troff"    
a0c0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
a0d0: 20 20 7b 20 22 72 70 6d 22 2c 20 20 20 20 20 20    { "rpm",      
a0e0: 20 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 70 6e    3, "audio/x-pn
a0f0: 2d 72 65 61 6c 61 75 64 69 6f 2d 70 6c 75 67 69  -realaudio-plugi
a100: 6e 22 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  n"       },.    
a110: 7b 20 22 72 74 66 22 2c 20 20 20 20 20 20 20 20  { "rtf",        
a120: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
a130: 72 74 66 22 20 20 20 20 20 20 20 20 20 20 20 20  rtf"            
a140: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
a150: 22 72 74 66 22 2c 20 20 20 20 20 20 20 20 33 2c  "rtf",        3,
a160: 20 22 74 65 78 74 2f 72 74 66 22 20 20 20 20 20   "text/rtf"     
a170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a180: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72       },.    { "r
a190: 74 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  tx",        3, "
a1a0: 74 65 78 74 2f 72 69 63 68 74 65 78 74 22 20 20  text/richtext"  
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1c0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 63 6d     },.    { "scm
a1d0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
a1e0: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6c 6f 74 75  plication/x-lotu
a1f0: 73 73 63 72 65 65 6e 63 61 6d 22 20 20 20 20 20  sscreencam"     
a200: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 65 74 22 2c   },.    { "set",
a210: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
a220: 69 63 61 74 69 6f 6e 2f 73 65 74 22 20 20 20 20  ication/set"    
a230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
a240: 2c 0a 20 20 20 20 7b 20 22 73 67 6d 6c 22 2c 20  ,.    { "sgml", 
a250: 20 20 20 20 20 20 34 2c 20 22 74 65 78 74 2f 73        4, "text/s
a260: 67 6d 6c 22 20 20 20 20 20 20 20 20 20 20 20 20  gml"            
a270: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
a280: 20 20 20 20 7b 20 22 73 67 6d 22 2c 20 20 20 20      { "sgm",    
a290: 20 20 20 20 33 2c 20 22 74 65 78 74 2f 73 67 6d      3, "text/sgm
a2a0: 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l"              
a2b0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
a2c0: 20 20 7b 20 22 73 68 22 2c 20 20 20 20 20 20 20    { "sh",       
a2d0: 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    2, "applicatio
a2e0: 6e 2f 78 2d 73 68 22 20 20 20 20 20 20 20 20 20  n/x-sh"         
a2f0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
a300: 7b 20 22 73 68 61 72 22 2c 20 20 20 20 20 20 20  { "shar",       
a310: 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  4, "application/
a320: 78 2d 73 68 61 72 22 20 20 20 20 20 20 20 20 20  x-shar"         
a330: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
a340: 22 73 69 6c 6f 22 2c 20 20 20 20 20 20 20 34 2c  "silo",       4,
a350: 20 22 6d 6f 64 65 6c 2f 6d 65 73 68 22 20 20 20   "model/mesh"   
a360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a370: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73       },.    { "s
a380: 69 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  it",        3, "
a390: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 74  application/x-st
a3a0: 75 66 66 69 74 22 20 20 20 20 20 20 20 20 20 20  uffit"          
a3b0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6b 64     },.    { "skd
a3c0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
a3d0: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6b 6f 61 6e  plication/x-koan
a3e0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
a3f0: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6b 6d 22 2c   },.    { "skm",
a400: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
a410: 69 63 61 74 69 6f 6e 2f 78 2d 6b 6f 61 6e 22 20  ication/x-koan" 
a420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
a430: 2c 0a 20 20 20 20 7b 20 22 73 6b 70 22 2c 20 20  ,.    { "skp",  
a440: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
a450: 61 74 69 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20  ation/x-koan"   
a460: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
a470: 20 20 20 20 7b 20 22 73 6b 74 22 2c 20 20 20 20      { "skt",    
a480: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
a490: 69 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20 20 20  ion/x-koan"     
a4a0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
a4b0: 20 20 7b 20 22 73 6d 69 22 2c 20 20 20 20 20 20    { "smi",      
a4c0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
a4d0: 6e 2f 73 6d 69 6c 22 20 20 20 20 20 20 20 20 20  n/smil"         
a4e0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
a4f0: 7b 20 22 73 6d 69 6c 22 2c 20 20 20 20 20 20 20  { "smil",       
a500: 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  4, "application/
a510: 73 6d 69 6c 22 20 20 20 20 20 20 20 20 20 20 20  smil"           
a520: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
a530: 22 73 6e 64 22 2c 20 20 20 20 20 20 20 20 33 2c  "snd",        3,
a540: 20 22 61 75 64 69 6f 2f 62 61 73 69 63 22 20 20   "audio/basic"  
a550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a560: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73       },.    { "s
a570: 6f 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ol",        3, "
a580: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 73 6f 6c 69  application/soli
a590: 64 73 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ds"             
a5a0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 70 6c     },.    { "spl
a5b0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
a5c0: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 66 75 74 75  plication/x-futu
a5d0: 72 65 73 70 6c 61 73 68 22 20 20 20 20 20 20 20  resplash"       
a5e0: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 72 63 22 2c   },.    { "src",
a5f0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
a600: 69 63 61 74 69 6f 6e 2f 78 2d 77 61 69 73 2d 73  ication/x-wais-s
a610: 6f 75 72 63 65 22 20 20 20 20 20 20 20 20 20 7d  ource"         }
a620: 2c 0a 20 20 20 20 7b 20 22 73 74 65 70 22 2c 20  ,.    { "step", 
a630: 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63        4, "applic
a640: 61 74 69 6f 6e 2f 53 54 45 50 22 20 20 20 20 20  ation/STEP"     
a650: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
a660: 20 20 20 20 7b 20 22 73 74 6c 22 2c 20 20 20 20      { "stl",    
a670: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
a680: 69 6f 6e 2f 53 4c 41 22 20 20 20 20 20 20 20 20  ion/SLA"        
a690: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
a6a0: 20 20 7b 20 22 73 74 70 22 2c 20 20 20 20 20 20    { "stp",      
a6b0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
a6c0: 6e 2f 53 54 45 50 22 20 20 20 20 20 20 20 20 20  n/STEP"         
a6d0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
a6e0: 7b 20 22 73 76 34 63 70 69 6f 22 2c 20 20 20 20  { "sv4cpio",    
a6f0: 37 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  7, "application/
a700: 78 2d 73 76 34 63 70 69 6f 22 20 20 20 20 20 20  x-sv4cpio"      
a710: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
a720: 22 73 76 34 63 72 63 22 2c 20 20 20 20 20 36 2c  "sv4crc",     6,
a730: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
a740: 73 76 34 63 72 63 22 20 20 20 20 20 20 20 20 20  sv4crc"         
a750: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73       },.    { "s
a760: 76 67 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  vg",        3, "
a770: 69 6d 61 67 65 2f 73 76 67 2b 78 6d 6c 22 20 20  image/svg+xml"  
a780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a790: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 77 66     },.    { "swf
a7a0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
a7b0: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 68 6f 63  plication/x-shoc
a7c0: 6b 77 61 76 65 2d 66 6c 61 73 68 22 20 20 20 20  kwave-flash"    
a7d0: 20 7d 2c 0a 20 20 20 20 7b 20 22 74 22 2c 20 20   },.    { "t",  
a7e0: 20 20 20 20 20 20 20 20 31 2c 20 22 61 70 70 6c          1, "appl
a7f0: 69 63 61 74 69 6f 6e 2f 78 2d 74 72 6f 66 66 22  ication/x-troff"
a800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
a810: 2c 0a 20 20 20 20 7b 20 22 74 61 72 22 2c 20 20  ,.    { "tar",  
a820: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
a830: 61 74 69 6f 6e 2f 78 2d 74 61 72 22 20 20 20 20  ation/x-tar"    
a840: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
a850: 20 20 20 20 7b 20 22 74 63 6c 22 2c 20 20 20 20      { "tcl",    
a860: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
a870: 69 6f 6e 2f 78 2d 74 63 6c 22 20 20 20 20 20 20  ion/x-tcl"      
a880: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
a890: 20 20 7b 20 22 74 65 78 22 2c 20 20 20 20 20 20    { "tex",      
a8a0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
a8b0: 6e 2f 78 2d 74 65 78 22 20 20 20 20 20 20 20 20  n/x-tex"        
a8c0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
a8d0: 7b 20 22 74 65 78 69 22 2c 20 20 20 20 20 20 20  { "texi",       
a8e0: 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  4, "application/
a8f0: 78 2d 74 65 78 69 6e 66 6f 22 20 20 20 20 20 20  x-texinfo"      
a900: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
a910: 22 74 65 78 69 6e 66 6f 22 2c 20 20 20 20 37 2c  "texinfo",    7,
a920: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
a930: 74 65 78 69 6e 66 6f 22 20 20 20 20 20 20 20 20  texinfo"        
a940: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74       },.    { "t
a950: 67 7a 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  gz",        3, "
a960: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 61  application/x-ta
a970: 72 2d 67 7a 22 20 20 20 20 20 20 20 20 20 20 20  r-gz"           
a980: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 69 66     },.    { "tif
a990: 66 22 2c 20 20 20 20 20 20 20 34 2c 20 22 69 6d  f",       4, "im
a9a0: 61 67 65 2f 74 69 66 66 22 20 20 20 20 20 20 20  age/tiff"       
a9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9c0: 20 7d 2c 0a 20 20 20 20 7b 20 22 74 69 66 22 2c   },.    { "tif",
a9d0: 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67          3, "imag
a9e0: 65 2f 74 69 66 66 22 20 20 20 20 20 20 20 20 20  e/tiff"         
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
aa00: 2c 0a 20 20 20 20 7b 20 22 74 72 22 2c 20 20 20  ,.    { "tr",   
aa10: 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63        2, "applic
aa20: 61 74 69 6f 6e 2f 78 2d 74 72 6f 66 66 22 20 20  ation/x-troff"  
aa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
aa40: 20 20 20 20 7b 20 22 74 73 69 22 2c 20 20 20 20      { "tsi",    
aa50: 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 54 53      3, "audio/TS
aa60: 50 2d 61 75 64 69 6f 22 20 20 20 20 20 20 20 20  P-audio"        
aa70: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
aa80: 20 20 7b 20 22 74 73 70 22 2c 20 20 20 20 20 20    { "tsp",      
aa90: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
aaa0: 6e 2f 64 73 70 74 79 70 65 22 20 20 20 20 20 20  n/dsptype"      
aab0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
aac0: 7b 20 22 74 73 76 22 2c 20 20 20 20 20 20 20 20  { "tsv",        
aad0: 33 2c 20 22 74 65 78 74 2f 74 61 62 2d 73 65 70  3, "text/tab-sep
aae0: 61 72 61 74 65 64 2d 76 61 6c 75 65 73 22 20 20  arated-values"  
aaf0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
ab00: 22 74 78 74 22 2c 20 20 20 20 20 20 20 20 33 2c  "txt",        3,
ab10: 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20 20   "text/plain"   
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab30: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 75       },.    { "u
ab40: 6e 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  nv",        3, "
ab50: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 69 2d 64 65  application/i-de
ab60: 61 73 22 20 20 20 20 20 20 20 20 20 20 20 20 20  as"             
ab70: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 75 73 74     },.    { "ust
ab80: 61 72 22 2c 20 20 20 20 20 20 35 2c 20 22 61 70  ar",      5, "ap
ab90: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 75 73 74 61  plication/x-usta
aba0: 72 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r"              
abb0: 20 7d 2c 0a 20 20 20 20 7b 20 22 76 63 64 22 2c   },.    { "vcd",
abc0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
abd0: 69 63 61 74 69 6f 6e 2f 78 2d 63 64 6c 69 6e 6b  ication/x-cdlink
abe0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  "              }
abf0: 2c 0a 20 20 20 20 7b 20 22 76 64 61 22 2c 20 20  ,.    { "vda",  
ac00: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
ac10: 61 74 69 6f 6e 2f 76 64 61 22 20 20 20 20 20 20  ation/vda"      
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
ac30: 20 20 20 20 7b 20 22 76 69 76 22 2c 20 20 20 20      { "viv",    
ac40: 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 76 6e      3, "video/vn
ac50: 64 2e 76 69 76 6f 22 20 20 20 20 20 20 20 20 20  d.vivo"         
ac60: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
ac70: 20 20 7b 20 22 76 69 76 6f 22 2c 20 20 20 20 20    { "vivo",     
ac80: 20 20 34 2c 20 22 76 69 64 65 6f 2f 76 6e 64 2e    4, "video/vnd.
ac90: 76 69 76 6f 22 20 20 20 20 20 20 20 20 20 20 20  vivo"           
aca0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
acb0: 7b 20 22 76 72 6d 6c 22 2c 20 20 20 20 20 20 20  { "vrml",       
acc0: 34 2c 20 22 6d 6f 64 65 6c 2f 76 72 6d 6c 22 20  4, "model/vrml" 
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ace0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
acf0: 22 76 73 69 78 22 2c 20 20 20 20 20 20 20 34 2c  "vsix",       4,
ad00: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76 73   "application/vs
ad10: 69 78 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ix"             
ad20: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77       },.    { "w
ad30: 61 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  av",        3, "
ad40: 61 75 64 69 6f 2f 78 2d 77 61 76 22 20 20 20 20  audio/x-wav"    
ad50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad60: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 61 78     },.    { "wax
ad70: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75  ",        3, "au
ad80: 64 69 6f 2f 78 2d 6d 73 2d 77 61 78 22 20 20 20  dio/x-ms-wax"   
ad90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ada0: 20 7d 2c 0a 20 20 20 20 7b 20 22 77 69 6b 69 22   },.    { "wiki"
adb0: 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c  ,       4, "appl
adc0: 69 63 61 74 69 6f 6e 2f 78 2d 66 6f 73 73 69 6c  ication/x-fossil
add0: 2d 77 69 6b 69 22 20 20 20 20 20 20 20 20 20 7d  -wiki"         }
ade0: 2c 0a 20 20 20 20 7b 20 22 77 6d 61 22 2c 20 20  ,.    { "wma",  
adf0: 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f        3, "audio/
ae00: 78 2d 6d 73 2d 77 6d 61 22 20 20 20 20 20 20 20  x-ms-wma"       
ae10: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
ae20: 20 20 20 20 7b 20 22 77 6d 76 22 2c 20 20 20 20      { "wmv",    
ae30: 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d      3, "video/x-
ae40: 6d 73 2d 77 6d 76 22 20 20 20 20 20 20 20 20 20  ms-wmv"         
ae50: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
ae60: 20 20 7b 20 22 77 6d 78 22 2c 20 20 20 20 20 20    { "wmx",      
ae70: 20 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73    3, "video/x-ms
ae80: 2d 77 6d 78 22 20 20 20 20 20 20 20 20 20 20 20  -wmx"           
ae90: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
aea0: 7b 20 22 77 72 6c 22 2c 20 20 20 20 20 20 20 20  { "wrl",        
aeb0: 33 2c 20 22 6d 6f 64 65 6c 2f 76 72 6d 6c 22 20  3, "model/vrml" 
aec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aed0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
aee0: 22 77 76 78 22 2c 20 20 20 20 20 20 20 20 33 2c  "wvx",        3,
aef0: 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 77 76 78   "video/x-ms-wvx
af00: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
af10: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78       },.    { "x
af20: 62 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  bm",        3, "
af30: 69 6d 61 67 65 2f 78 2d 78 62 69 74 6d 61 70 22  image/x-xbitmap"
af40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af50: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 6c 63     },.    { "xlc
af60: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
af70: 70 6c 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73  plication/vnd.ms
af80: 2d 65 78 63 65 6c 22 20 20 20 20 20 20 20 20 20  -excel"         
af90: 20 7d 2c 0a 20 20 20 20 7b 20 22 78 6c 6c 22 2c   },.    { "xll",
afa0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
afb0: 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65  ication/vnd.ms-e
afc0: 78 63 65 6c 22 20 20 20 20 20 20 20 20 20 20 7d  xcel"          }
afd0: 2c 0a 20 20 20 20 7b 20 22 78 6c 6d 22 2c 20 20  ,.    { "xlm",  
afe0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
aff0: 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63  ation/vnd.ms-exc
b000: 65 6c 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  el"          },.
b010: 20 20 20 20 7b 20 22 78 6c 73 22 2c 20 20 20 20      { "xls",    
b020: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
b030: 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c  ion/vnd.ms-excel
b040: 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  "          },.  
b050: 20 20 7b 20 22 78 6c 77 22 2c 20 20 20 20 20 20    { "xlw",      
b060: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
b070: 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20  n/vnd.ms-excel" 
b080: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
b090: 7b 20 22 78 6d 6c 22 2c 20 20 20 20 20 20 20 20  { "xml",        
b0a0: 33 2c 20 22 74 65 78 74 2f 78 6d 6c 22 20 20 20  3, "text/xml"   
b0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0c0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
b0d0: 22 78 70 6d 22 2c 20 20 20 20 20 20 20 20 33 2c  "xpm",        3,
b0e0: 20 22 69 6d 61 67 65 2f 78 2d 78 70 69 78 6d 61   "image/x-xpixma
b0f0: 70 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p"              
b100: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78       },.    { "x
b110: 77 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  wd",        3, "
b120: 69 6d 61 67 65 2f 78 2d 78 77 69 6e 64 6f 77 64  image/x-xwindowd
b130: 75 6d 70 22 20 20 20 20 20 20 20 20 20 20 20 20  ump"            
b140: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 79 7a     },.    { "xyz
b150: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 63 68  ",        3, "ch
b160: 65 6d 69 63 61 6c 2f 78 2d 70 64 62 22 20 20 20  emical/x-pdb"   
b170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b180: 20 7d 2c 0a 20 20 20 20 7b 20 22 7a 69 70 22 2c   },.    { "zip",
b190: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
b1a0: 69 63 61 74 69 6f 6e 2f 7a 69 70 22 20 20 20 20  ication/zip"    
b1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
b1c0: 2c 0a 20 20 7d 3b 0a 0a 20 20 66 6f 72 28 69 3d  ,.  };..  for(i=
b1d0: 6e 4e 61 6d 65 2d 31 3b 20 69 3e 30 20 26 26 20  nName-1; i>0 && 
b1e0: 7a 4e 61 6d 65 5b 69 5d 21 3d 27 2e 27 3b 20 69  zName[i]!='.'; i
b1f0: 2d 2d 29 7b 7d 0a 20 20 7a 20 3d 20 26 7a 4e 61  --){}.  z = &zNa
b200: 6d 65 5b 69 2b 31 5d 3b 0a 20 20 6c 65 6e 20 3d  me[i+1];.  len =
b210: 20 6e 4e 61 6d 65 20 2d 20 69 3b 0a 20 20 69 66   nName - i;.  if
b220: 28 20 6c 65 6e 3c 28 69 6e 74 29 73 69 7a 65 6f  ( len<(int)sizeo
b230: 66 28 7a 53 75 66 66 69 78 29 2d 31 20 29 7b 0a  f(zSuffix)-1 ){.
b240: 20 20 20 20 73 74 72 63 70 79 28 7a 53 75 66 66      strcpy(zSuff
b250: 69 78 2c 20 7a 29 3b 0a 20 20 20 20 66 6f 72 28  ix, z);.    for(
b260: 69 3d 30 3b 20 7a 53 75 66 66 69 78 5b 69 5d 3b  i=0; zSuffix[i];
b270: 20 69 2b 2b 29 20 7a 53 75 66 66 69 78 5b 69 5d   i++) zSuffix[i]
b280: 20 3d 20 74 6f 6c 6f 77 65 72 28 7a 53 75 66 66   = tolower(zSuff
b290: 69 78 5b 69 5d 29 3b 0a 20 20 20 20 66 69 72 73  ix[i]);.    firs
b2a0: 74 20 3d 20 30 3b 0a 20 20 20 20 6c 61 73 74 20  t = 0;.    last 
b2b0: 3d 20 73 69 7a 65 6f 66 28 61 4d 69 6d 65 29 2f  = sizeof(aMime)/
b2c0: 73 69 7a 65 6f 66 28 61 4d 69 6d 65 5b 30 5d 29  sizeof(aMime[0])
b2d0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 66 69 72  ;.    while( fir
b2e0: 73 74 3c 3d 6c 61 73 74 20 29 7b 0a 20 20 20 20  st<=last ){.    
b2f0: 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 69    int c;.      i
b300: 20 3d 20 28 66 69 72 73 74 2b 6c 61 73 74 29 2f   = (first+last)/
b310: 32 3b 0a 20 20 20 20 20 20 63 20 3d 20 73 74 72  2;.      c = str
b320: 63 6d 70 28 7a 53 75 66 66 69 78 2c 20 61 4d 69  cmp(zSuffix, aMi
b330: 6d 65 5b 69 5d 2e 7a 53 75 66 66 69 78 29 3b 0a  me[i].zSuffix);.
b340: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
b350: 20 72 65 74 75 72 6e 20 61 4d 69 6d 65 5b 69 5d   return aMime[i]
b360: 2e 7a 4d 69 6d 65 74 79 70 65 3b 0a 20 20 20 20  .zMimetype;.    
b370: 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20    if( c<0 ){.   
b380: 20 20 20 20 20 6c 61 73 74 20 3d 20 69 2d 31 3b       last = i-1;
b390: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b3a0: 20 20 20 20 20 20 66 69 72 73 74 20 3d 20 69 2b        first = i+
b3b0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
b3c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 61  .  }.  return "a
b3d0: 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74  pplication/octet
b3e0: 2d 73 74 72 65 61 6d 22 3b 0a 7d 0a 0a 2f 2a 0a  -stream";.}../*.
b3f0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
b400: 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20   table contains 
b410: 31 20 66 6f 72 20 61 6c 6c 20 63 68 61 72 61 63  1 for all charac
b420: 74 65 72 73 20 74 68 61 74 20 61 72 65 20 70 65  ters that are pe
b430: 72 6d 69 74 74 65 64 20 69 6e 0a 2a 2a 20 74 68  rmitted in.** th
b440: 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 55 52  e part of the UR
b450: 4c 20 62 65 66 6f 72 65 20 74 68 65 20 71 75 65  L before the que
b460: 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 61 6e  ry parameters an
b470: 64 20 66 72 61 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d fragment..**.*
b480: 2a 20 41 6c 6c 6f 77 65 64 20 63 68 61 72 61 63  * Allowed charac
b490: 74 65 72 73 3a 20 20 30 2d 39 61 2d 7a 41 2d 5a  ters:  0-9a-zA-Z
b4a0: 2c 2d 2e 2f 3a 5f 7e 0a 2a 2a 0a 2a 2a 20 44 69  ,-./:_~.**.** Di
b4b0: 73 61 6c 6c 6f 77 65 64 20 63 68 61 72 61 63 74  sallowed charact
b4c0: 65 72 73 20 69 6e 63 6c 75 64 65 3a 20 20 21 22  ers include:  !"
b4d0: 23 24 25 26 27 28 29 2a 2b 3b 3c 3d 3e 3f 5b 5c  #$%&'()*+;<=>?[\
b4e0: 5d 5e 7b 7c 7d 0a 2a 2f 0a 73 74 61 74 69 63 20  ]^{|}.*/.static 
b4f0: 63 6f 6e 73 74 20 63 68 61 72 20 61 6c 6c 6f 77  const char allow
b500: 65 64 49 6e 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20  edInName[] = {. 
b510: 20 20 20 20 20 2f 2a 20 20 78 30 20 20 78 31 20       /*  x0  x1 
b520: 20 78 32 20 20 78 33 20 20 78 34 20 20 78 35 20   x2  x3  x4  x5 
b530: 20 78 36 20 20 78 37 20 20 78 38 20 20 78 39 20   x6  x7  x8  x9 
b540: 20 78 61 20 20 78 62 20 20 78 63 20 20 78 64 20   xa  xb  xc  xd 
b550: 20 78 65 20 20 78 66 20 2a 2f 0a 2f 2a 20 30 78   xe  xf */./* 0x
b560: 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c   */   0,  0,  0,
b570: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b580: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b590: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b5a0: 20 20 30 2c 0a 2f 2a 20 31 78 20 2a 2f 20 20 20    0,./* 1x */   
b5b0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b5c0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b5d0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b5e0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f  0,  0,  0,  0,./
b5f0: 2a 20 32 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c  * 2x */   0,  0,
b600: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b610: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b620: 20 20 30 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c    0,  0,  1,  1,
b630: 20 20 31 2c 20 20 31 2c 0a 2f 2a 20 33 78 20 2a    1,  1,./* 3x *
b640: 2f 20 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  /   1,  1,  1,  
b650: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
b660: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
b670: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b680: 30 2c 0a 2f 2a 20 34 78 20 2a 2f 20 20 20 30 2c  0,./* 4x */   0,
b690: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
b6a0: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
b6b0: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
b6c0: 20 20 31 2c 20 20 31 2c 20 20 31 2c 0a 2f 2a 20    1,  1,  1,./* 
b6d0: 35 78 20 2a 2f 20 20 20 31 2c 20 20 31 2c 20 20  5x */   1,  1,  
b6e0: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
b6f0: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
b700: 31 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  1,  0,  0,  0,  
b710: 30 2c 20 20 31 2c 0a 2f 2a 20 36 78 20 2a 2f 20  0,  1,./* 6x */ 
b720: 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    0,  1,  1,  1,
b730: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
b740: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
b750: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
b760: 0a 2f 2a 20 37 78 20 2a 2f 20 20 20 31 2c 20 20  ./* 7x */   1,  
b770: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
b780: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
b790: 31 2c 20 20 31 2c 20 20 30 2c 20 20 30 2c 20 20  1,  1,  0,  0,  
b7a0: 30 2c 20 20 31 2c 20 20 30 2c 0a 2f 2a 20 38 78  0,  1,  0,./* 8x
b7b0: 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c   */   0,  0,  0,
b7c0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b7d0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b7e0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b7f0: 20 20 30 2c 0a 2f 2a 20 39 78 20 2a 2f 20 20 20    0,./* 9x */   
b800: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b810: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b820: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b830: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f  0,  0,  0,  0,./
b840: 2a 20 41 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c  * Ax */   0,  0,
b850: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b860: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b870: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b880: 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 42 78 20 2a    0,  0,./* Bx *
b890: 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  /   0,  0,  0,  
b8a0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b8b0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b8c0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b8d0: 30 2c 0a 2f 2a 20 43 78 20 2a 2f 20 20 20 30 2c  0,./* Cx */   0,
b8e0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b8f0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b900: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b910: 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20    0,  0,  0,./* 
b920: 44 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20  Dx */   0,  0,  
b930: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b940: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b950: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b960: 30 2c 20 20 30 2c 0a 2f 2a 20 45 78 20 2a 2f 20  0,  0,./* Ex */ 
b970: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b980: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b990: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b9a0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b9b0: 0a 2f 2a 20 46 78 20 2a 2f 20 20 20 30 2c 20 20  ./* Fx */   0,  
b9c0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b9d0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b9e0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b9f0: 30 2c 20 20 30 2c 20 20 30 2c 0a 7d 3b 0a 0a 2f  0,  0,  0,.};../
ba00: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20  *.** Remove all 
ba10: 64 69 73 61 6c 6c 6f 77 65 64 20 63 68 61 72 61  disallowed chara
ba20: 63 74 65 72 73 20 69 6e 20 74 68 65 20 69 6e 70  cters in the inp
ba30: 75 74 20 73 74 72 69 6e 67 20 7a 5b 5d 2e 20 20  ut string z[].  
ba40: 43 6f 6e 76 65 72 74 20 61 6e 79 0a 2a 2a 20 64  Convert any.** d
ba50: 69 73 61 6c 6c 6f 77 65 64 20 63 68 61 72 61 63  isallowed charac
ba60: 74 65 72 73 20 69 6e 74 6f 20 22 5f 22 2e 0a 2a  ters into "_"..*
ba70: 2a 0a 2a 2a 20 4e 6f 74 20 74 68 61 74 20 74 68  *.** Not that th
ba80: 65 20 74 68 72 65 65 20 63 68 61 72 61 63 74 65  e three characte
ba90: 72 20 73 65 71 75 65 6e 63 65 20 22 25 58 58 22  r sequence "%XX"
baa0: 20 77 68 65 72 65 20 58 20 69 73 20 61 6e 79 20   where X is any 
bab0: 62 79 74 65 20 69 73 0a 2a 2a 20 63 6f 6e 76 65  byte is.** conve
bac0: 72 74 65 64 20 69 6e 74 6f 20 61 20 73 69 6e 67  rted into a sing
bad0: 6c 65 20 22 5f 22 20 63 68 61 72 61 63 74 65 72  le "_" character
bae0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
baf0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
bb00: 72 61 63 74 65 72 73 20 63 6f 6e 76 65 72 74 65  racters converte
bb10: 64 2e 20 20 41 6e 20 22 25 58 58 22 20 2d 3e 20  d.  An "%XX" -> 
bb20: 22 5f 22 20 63 6f 6e 76 65 72 73 69 6f 6e 0a 2a  "_" conversion.*
bb30: 2a 20 63 6f 75 6e 74 73 20 61 73 20 61 20 73 69  * counts as a si
bb40: 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72 2e 0a  ngle character..
bb50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
bb60: 6e 69 74 69 7a 65 53 74 72 69 6e 67 28 63 68 61  nitizeString(cha
bb70: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 43 68  r *z){.  int nCh
bb80: 61 6e 67 65 20 3d 20 30 3b 0a 20 20 77 68 69 6c  ange = 0;.  whil
bb90: 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 69 66 28  e( *z ){.    if(
bba0: 20 21 61 6c 6c 6f 77 65 64 49 6e 4e 61 6d 65 5b   !allowedInName[
bbb0: 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  *(unsigned char*
bbc0: 29 7a 5d 20 29 7b 0a 20 20 20 20 20 20 69 66 28  )z] ){.      if(
bbd0: 20 2a 7a 3d 3d 27 25 27 20 26 26 20 7a 5b 31 5d   *z=='%' && z[1]
bbe0: 21 3d 30 20 26 26 20 7a 5b 32 5d 21 3d 30 20 29  !=0 && z[2]!=0 )
bbf0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  {.        int i;
bc00: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 33  .        for(i=3
bc10: 3b 20 28 7a 5b 69 2d 32 5d 20 3d 20 7a 5b 69 5d  ; (z[i-2] = z[i]
bc20: 29 21 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  )!=0; i++){}.   
bc30: 20 20 20 7d 0a 20 20 20 20 20 20 2a 7a 20 3d 20     }.      *z = 
bc40: 27 5f 27 3b 0a 20 20 20 20 20 20 6e 43 68 61 6e  '_';.      nChan
bc50: 67 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge++;.    }.    
bc60: 7a 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  z++;.  }.  retur
bc70: 6e 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  n nChange;.}../*
bc80: 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
bc90: 6d 62 65 72 20 6f 66 20 22 2f 22 20 63 68 61 72  mber of "/" char
bca0: 61 63 74 65 72 73 20 69 6e 20 61 20 73 74 72 69  acters in a stri
bcb0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
bcc0: 74 20 63 6f 75 6e 74 53 6c 61 73 68 65 73 28 63  t countSlashes(c
bcd0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
bce0: 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 77 68   int n = 0;.  wh
bcf0: 69 6c 65 28 20 2a 7a 20 29 20 69 66 28 20 2a 28  ile( *z ) if( *(
bd00: 7a 2b 2b 29 3d 3d 27 2f 27 20 29 20 6e 2b 2b 3b  z++)=='/' ) n++;
bd10: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
bd20: 2f 2a 0a 2a 2a 20 53 65 6e 64 20 74 68 65 20 74  /*.** Send the t
bd30: 65 78 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ext of the file 
bd40: 6e 61 6d 65 64 20 62 79 20 7a 46 69 6c 65 20 61  named by zFile a
bd50: 73 20 74 68 65 20 72 65 70 6c 79 2e 20 20 55 73  s the reply.  Us
bd60: 65 20 74 68 65 0a 2a 2a 20 73 75 66 66 69 78 20  e the.** suffix 
bd70: 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  on the end of th
bd80: 65 20 7a 46 69 6c 65 20 6e 61 6d 65 20 74 6f 20  e zFile name to 
bd90: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 69  determine the mi
bda0: 6d 65 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  metype..**.** Re
bdb0: 74 75 72 6e 20 31 20 74 6f 20 6f 6d 69 74 20 6d  turn 1 to omit m
bdc0: 61 6b 69 6e 67 20 61 20 6c 6f 67 20 65 6e 74 72  aking a log entr
bdd0: 79 20 66 6f 72 20 74 68 65 20 72 65 70 6c 79 2e  y for the reply.
bde0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
bdf0: 65 6e 64 46 69 6c 65 28 0a 20 20 63 6f 6e 73 74  endFile(.  const
be00: 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 20 20   char *zFile,   
be10: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
be20: 65 20 66 69 6c 65 20 74 6f 20 73 65 6e 64 20 2a  e file to send *
be30: 2f 0a 20 20 69 6e 74 20 6c 65 6e 46 69 6c 65 2c  /.  int lenFile,
be40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
be50: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a 46 69  ength of the zFi
be60: 6c 65 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73  le name in bytes
be70: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61   */.  struct sta
be80: 74 20 2a 70 53 74 61 74 20 20 20 20 20 20 2f 2a  t *pStat      /*
be90: 20 52 65 73 75 6c 74 20 6f 66 20 61 20 73 74 61   Result of a sta
bea0: 74 28 29 20 61 67 61 69 6e 73 74 20 7a 46 69 6c  t() against zFil
beb0: 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  e */.){.  const 
bec0: 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 54 79  char *zContentTy
bed0: 70 65 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 74  pe;.  int c;.  t
bee0: 69 6d 65 5f 74 20 74 3b 0a 20 20 46 49 4c 45 20  ime_t t;.  FILE 
bef0: 2a 69 6e 3b 0a 20 20 63 68 61 72 20 7a 45 54 61  *in;.  char zETa
bf00: 67 5b 31 30 30 5d 3b 0a 0a 20 20 7a 43 6f 6e 74  g[100];..  zCont
bf10: 65 6e 74 54 79 70 65 20 3d 20 47 65 74 4d 69 6d  entType = GetMim
bf20: 65 54 79 70 65 28 7a 46 69 6c 65 2c 20 6c 65 6e  eType(zFile, len
bf30: 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d  File);.  if( zTm
bf40: 70 4e 61 6d 20 29 20 75 6e 6c 69 6e 6b 28 7a 54  pNam ) unlink(zT
bf50: 6d 70 4e 61 6d 29 3b 0a 20 20 73 70 72 69 6e 74  mpNam);.  sprint
bf60: 66 28 7a 45 54 61 67 2c 20 22 6d 25 78 73 25 78  f(zETag, "m%xs%x
bf70: 22 2c 20 28 69 6e 74 29 70 53 74 61 74 2d 3e 73  ", (int)pStat->s
bf80: 74 5f 6d 74 69 6d 65 2c 20 28 69 6e 74 29 70 53  t_mtime, (int)pS
bf90: 74 61 74 2d 3e 73 74 5f 73 69 7a 65 29 3b 0a 20  tat->st_size);. 
bfa0: 20 69 66 28 20 43 6f 6d 70 61 72 65 45 74 61 67   if( CompareEtag
bfb0: 73 28 7a 49 66 4e 6f 6e 65 4d 61 74 63 68 2c 7a  s(zIfNoneMatch,z
bfc0: 45 54 61 67 29 3d 3d 30 0a 20 20 20 7c 7c 20 28  ETag)==0.   || (
bfd0: 7a 49 66 4d 6f 64 69 66 69 65 64 53 69 6e 63 65  zIfModifiedSince
bfe0: 21 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 28  !=0.        && (
bff0: 74 20 3d 20 50 61 72 73 65 52 66 63 38 32 32 44  t = ParseRfc822D
c000: 61 74 65 28 7a 49 66 4d 6f 64 69 66 69 65 64 53  ate(zIfModifiedS
c010: 69 6e 63 65 29 29 3e 30 0a 20 20 20 20 20 20 20  ince))>0.       
c020: 20 26 26 20 74 3e 3d 70 53 74 61 74 2d 3e 73 74   && t>=pStat->st
c030: 5f 6d 74 69 6d 65 29 0a 20 20 29 7b 0a 20 20 20  _mtime).  ){.   
c040: 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22   StartResponse("
c050: 33 30 34 20 4e 6f 74 20 4d 6f 64 69 66 69 65 64  304 Not Modified
c060: 22 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20  ");.    nOut += 
c070: 44 61 74 65 54 61 67 28 22 4c 61 73 74 2d 4d 6f  DateTag("Last-Mo
c080: 64 69 66 69 65 64 22 2c 20 70 53 74 61 74 2d 3e  dified", pStat->
c090: 73 74 5f 6d 74 69 6d 65 29 3b 0a 20 20 20 20 6e  st_mtime);.    n
c0a0: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 43  Out += printf("C
c0b0: 61 63 68 65 2d 43 6f 6e 74 72 6f 6c 3a 20 6d 61  ache-Control: ma
c0c0: 78 2d 61 67 65 3d 25 64 5c 72 5c 6e 22 2c 20 6d  x-age=%d\r\n", m
c0d0: 78 41 67 65 29 3b 0a 20 20 20 20 6e 4f 75 74 20  xAge);.    nOut 
c0e0: 2b 3d 20 70 72 69 6e 74 66 28 22 45 54 61 67 3a  += printf("ETag:
c0f0: 20 5c 22 25 73 5c 22 5c 72 5c 6e 22 2c 20 7a 45   \"%s\"\r\n", zE
c100: 54 61 67 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b  Tag);.    nOut +
c110: 3d 20 70 72 69 6e 74 66 28 22 5c 72 5c 6e 22 29  = printf("\r\n")
c120: 3b 0a 20 20 20 20 66 66 6c 75 73 68 28 73 74 64  ;.    fflush(std
c130: 6f 75 74 29 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f  out);.    MakeLo
c140: 67 45 6e 74 72 79 28 30 2c 20 34 37 30 29 3b 20  gEntry(0, 470); 
c150: 20 2f 2a 20 4c 4f 47 3a 20 45 54 61 67 20 43 61   /* LOG: ETag Ca
c160: 63 68 65 20 48 69 74 20 2a 2f 0a 20 20 20 20 72  che Hit */.    r
c170: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
c180: 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c  n = fopen(zFile,
c190: 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d  "rb");.  if( in=
c1a0: 3d 30 20 29 20 4e 6f 74 46 6f 75 6e 64 28 34 38  =0 ) NotFound(48
c1b0: 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 66 6f 70 65  0); /* LOG: fope
c1c0: 6e 28 29 20 66 61 69 6c 65 64 20 66 6f 72 20 73  n() failed for s
c1d0: 74 61 74 69 63 20 63 6f 6e 74 65 6e 74 20 2a 2f  tatic content */
c1e0: 0a 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65  .  StartResponse
c1f0: 28 22 32 30 30 20 4f 4b 22 29 3b 0a 20 20 6e 4f  ("200 OK");.  nO
c200: 75 74 20 2b 3d 20 44 61 74 65 54 61 67 28 22 4c  ut += DateTag("L
c210: 61 73 74 2d 4d 6f 64 69 66 69 65 64 22 2c 20 70  ast-Modified", p
c220: 53 74 61 74 2d 3e 73 74 5f 6d 74 69 6d 65 29 3b  Stat->st_mtime);
c230: 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74  .  nOut += print
c240: 66 28 22 43 61 63 68 65 2d 43 6f 6e 74 72 6f 6c  f("Cache-Control
c250: 3a 20 6d 61 78 2d 61 67 65 3d 25 64 5c 72 5c 6e  : max-age=%d\r\n
c260: 22 2c 20 6d 78 41 67 65 29 3b 0a 20 20 6e 4f 75  ", mxAge);.  nOu
c270: 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 45 54 61  t += printf("ETa
c280: 67 3a 20 5c 22 25 73 5c 22 5c 72 5c 6e 22 2c 20  g: \"%s\"\r\n", 
c290: 7a 45 54 61 67 29 3b 0a 20 20 6e 4f 75 74 20 2b  zETag);.  nOut +
c2a0: 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 74 65 6e  = printf("Conten
c2b0: 74 2d 74 79 70 65 3a 20 25 73 5c 72 5c 6e 22 2c  t-type: %s\r\n",
c2c0: 7a 43 6f 6e 74 65 6e 74 54 79 70 65 29 3b 0a 20  zContentType);. 
c2d0: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
c2e0: 22 43 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74 68 3a  "Content-length:
c2f0: 20 25 64 5c 72 5c 6e 5c 72 5c 6e 22 2c 28 69 6e   %d\r\n\r\n",(in
c300: 74 29 70 53 74 61 74 2d 3e 73 74 5f 73 69 7a 65  t)pStat->st_size
c310: 29 3b 0a 20 20 66 66 6c 75 73 68 28 73 74 64 6f  );.  fflush(stdo
c320: 75 74 29 3b 0a 20 20 69 66 28 20 73 74 72 63 6d  ut);.  if( strcm
c330: 70 28 7a 4d 65 74 68 6f 64 2c 22 48 45 41 44 22  p(zMethod,"HEAD"
c340: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 4d 61 6b 65  )==0 ){.    Make
c350: 4c 6f 67 45 6e 74 72 79 28 30 2c 20 32 29 3b 20  LogEntry(0, 2); 
c360: 2f 2a 20 4c 4f 47 3a 20 4e 6f 72 6d 61 6c 20 48  /* LOG: Normal H
c370: 45 41 44 20 72 65 70 6c 79 20 2a 2f 0a 20 20 20  EAD reply */.   
c380: 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20   fclose(in);.   
c390: 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
c3a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
c3b0: 20 7d 0a 20 20 69 66 28 20 75 73 65 54 69 6d 65   }.  if( useTime
c3c0: 6f 75 74 20 29 20 61 6c 61 72 6d 28 33 30 20 2b  out ) alarm(30 +
c3d0: 20 70 53 74 61 74 2d 3e 73 74 5f 73 69 7a 65 2f   pStat->st_size/
c3e0: 31 30 30 30 29 3b 0a 23 69 66 64 65 66 20 6c 69  1000);.#ifdef li
c3f0: 6e 75 78 0a 20 20 7b 0a 20 20 20 20 6f 66 66 5f  nux.  {.    off_
c400: 74 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  t offset = 0;.  
c410: 20 20 6e 4f 75 74 20 2b 3d 20 73 65 6e 64 66 69    nOut += sendfi
c420: 6c 65 28 66 69 6c 65 6e 6f 28 73 74 64 6f 75 74  le(fileno(stdout
c430: 29 2c 20 66 69 6c 65 6e 6f 28 69 6e 29 2c 20 26  ), fileno(in), &
c440: 6f 66 66 73 65 74 2c 20 70 53 74 61 74 2d 3e 73  offset, pStat->s
c450: 74 5f 73 69 7a 65 29 3b 0a 20 20 7d 0a 23 65 6c  t_size);.  }.#el
c460: 73 65 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d  se.  while( (c =
c470: 20 67 65 74 63 28 69 6e 29 29 21 3d 45 4f 46 20   getc(in))!=EOF 
c480: 29 7b 0a 20 20 20 20 70 75 74 63 28 63 2c 73 74  ){.    putc(c,st
c490: 64 6f 75 74 29 3b 0a 20 20 20 20 6e 4f 75 74 2b  dout);.    nOut+
c4a0: 2b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  +;.  }.#endif.  
c4b0: 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 72 65  fclose(in);.  re
c4c0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
c4d0: 20 41 20 43 47 49 20 6f 72 20 53 43 47 49 20 73   A CGI or SCGI s
c4e0: 63 72 69 70 74 20 68 61 73 20 72 75 6e 20 61 6e  cript has run an
c4f0: 64 20 69 73 20 73 65 6e 64 69 6e 67 20 69 74 73  d is sending its
c500: 20 72 65 70 6c 79 20 62 61 63 6b 20 61 63 72 6f   reply back acro
c510: 73 73 0a 2a 2a 20 74 68 65 20 63 68 61 6e 6e 65  ss.** the channe
c520: 6c 20 22 69 6e 22 2e 20 20 50 72 6f 63 65 73 73  l "in".  Process
c530: 20 74 68 69 73 20 72 65 70 6c 79 20 69 6e 74 6f   this reply into
c540: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
c550: 48 54 54 50 20 72 65 70 6c 79 2e 0a 2a 2a 20 43  HTTP reply..** C
c560: 6c 6f 73 65 20 74 68 65 20 22 69 6e 22 20 63 68  lose the "in" ch
c570: 61 6e 6e 65 6c 20 77 68 65 6e 20 64 6f 6e 65 2e  annel when done.
c580: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c590: 43 67 69 48 61 6e 64 6c 65 52 65 70 6c 79 28 46  CgiHandleReply(F
c5a0: 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 69 6e 74 20  ILE *in){.  int 
c5b0: 73 65 65 6e 43 6f 6e 74 65 6e 74 4c 65 6e 67 74  seenContentLengt
c5c0: 68 20 3d 20 30 3b 20 20 20 2f 2a 20 54 72 75 65  h = 0;   /* True
c5d0: 20 69 66 20 43 6f 6e 74 65 6e 74 2d 6c 65 6e 67   if Content-leng
c5e0: 74 68 3a 20 68 65 61 64 65 72 20 73 65 65 6e 20  th: header seen 
c5f0: 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 74 65 6e 74  */.  int content
c600: 4c 65 6e 67 74 68 20 3d 20 30 3b 20 20 20 20 20  Length = 0;     
c610: 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74    /* The content
c620: 20 6c 65 6e 67 74 68 20 2a 2f 0a 20 20 73 69 7a   length */.  siz
c630: 65 5f 74 20 6e 52 65 73 20 3d 20 30 3b 20 20 20  e_t nRes = 0;   
c640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
c650: 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 20 2a 2f  es of payload */
c660: 0a 20 20 73 69 7a 65 5f 74 20 6e 4d 61 6c 6c 6f  .  size_t nMallo
c670: 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
c680: 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63  /* Bytes of spac
c690: 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 61  e allocated to a
c6a0: 52 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  Res */.  char *a
c6b0: 52 65 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Res = 0;        
c6c0: 20 20 20 20 20 20 2f 2a 20 50 61 79 6c 6f 61 64        /* Payload
c6d0: 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20   */.  int c;    
c6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6f0: 20 20 20 2f 2a 20 4e 65 78 74 20 63 68 61 72 61     /* Next chara
c700: 63 74 65 72 20 66 72 6f 6d 20 69 6e 20 2a 2f 0a  cter from in */.
c710: 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20    char *z;      
c720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c730: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 6f 6d  * Pointer to som
c740: 65 74 68 69 6e 67 20 69 6e 73 69 64 65 20 6f 66  ething inside of
c750: 20 7a 4c 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72   zLine */.  char
c760: 20 7a 4c 69 6e 65 5b 31 30 30 30 5d 3b 20 20 20   zLine[1000];   
c770: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
c780: 6c 69 6e 65 20 6f 66 20 72 65 70 6c 79 20 66 72  line of reply fr
c790: 6f 6d 20 74 68 65 20 43 47 49 20 73 63 72 69 70  om the CGI scrip
c7a0: 74 20 2a 2f 0a 0a 20 20 69 66 28 20 75 73 65 54  t */..  if( useT
c7b0: 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d 28 31  imeout ) alarm(1
c7c0: 35 29 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65  5);.  while( fge
c7d0: 74 73 28 7a 4c 69 6e 65 2c 73 69 7a 65 6f 66 28  ts(zLine,sizeof(
c7e0: 7a 4c 69 6e 65 29 2c 69 6e 29 20 26 26 20 21 69  zLine),in) && !i
c7f0: 73 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64  sspace((unsigned
c800: 20 63 68 61 72 29 7a 4c 69 6e 65 5b 30 5d 29 20   char)zLine[0]) 
c810: 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63  ){.    if( strnc
c820: 61 73 65 63 6d 70 28 7a 4c 69 6e 65 2c 22 4c 6f  asecmp(zLine,"Lo
c830: 63 61 74 69 6f 6e 3a 22 2c 39 29 3d 3d 30 20 29  cation:",9)==0 )
c840: 7b 0a 20 20 20 20 20 20 53 74 61 72 74 52 65 73  {.      StartRes
c850: 70 6f 6e 73 65 28 22 33 30 32 20 52 65 64 69 72  ponse("302 Redir
c860: 65 63 74 22 29 3b 0a 20 20 20 20 20 20 52 65 6d  ect");.      Rem
c870: 6f 76 65 4e 65 77 6c 69 6e 65 28 7a 4c 69 6e 65  oveNewline(zLine
c880: 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26 7a 4c  );.      z = &zL
c890: 69 6e 65 5b 31 30 5d 3b 0a 20 20 20 20 20 20 77  ine[10];.      w
c8a0: 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 28  hile( isspace(*(
c8b0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a  unsigned char*)z
c8c0: 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ z++; }.    
c8d0: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
c8e0: 28 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73 5c 72  ("Location: %s\r
c8f0: 5c 6e 22 2c 7a 29 3b 0a 20 20 20 20 7d 65 6c 73  \n",z);.    }els
c900: 65 20 69 66 28 20 73 74 72 6e 63 61 73 65 63 6d  e if( strncasecm
c910: 70 28 7a 4c 69 6e 65 2c 22 53 74 61 74 75 73 3a  p(zLine,"Status:
c920: 22 2c 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ",7)==0 ){.     
c930: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
c940: 72 28 69 3d 37 3b 20 69 73 73 70 61 63 65 28 28  r(i=7; isspace((
c950: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 4c  unsigned char)zL
c960: 69 6e 65 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a  ine[i]); i++){}.
c970: 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72        nOut += pr
c980: 69 6e 74 66 28 22 25 73 20 25 73 22 2c 20 7a 50  intf("%s %s", zP
c990: 72 6f 74 6f 63 6f 6c 2c 20 26 7a 4c 69 6e 65 5b  rotocol, &zLine[
c9a0: 69 5d 29 3b 0a 20 20 20 20 20 20 73 74 72 6e 63  i]);.      strnc
c9b0: 70 79 28 7a 52 65 70 6c 79 53 74 61 74 75 73 2c  py(zReplyStatus,
c9c0: 20 26 7a 4c 69 6e 65 5b 69 5d 2c 20 33 29 3b 0a   &zLine[i], 3);.
c9d0: 20 20 20 20 20 20 7a 52 65 70 6c 79 53 74 61 74        zReplyStat
c9e0: 75 73 5b 33 5d 20 3d 20 30 3b 0a 20 20 20 20 20  us[3] = 0;.     
c9f0: 20 73 74 61 74 75 73 53 65 6e 74 20 3d 20 31 3b   statusSent = 1;
ca00: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ca10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca20: 20 20 20 20 20 20 2f 2a 20 20 31 32 33 34 35 36        /*  123456
ca30: 37 38 39 20 31 32 33 34 35 20 2a 2f 0a 20 20 20  789 12345 */.   
ca40: 20 20 20 69 66 28 20 73 74 72 6e 63 61 73 65 63     if( strncasec
ca50: 6d 70 28 7a 4c 69 6e 65 2c 20 22 43 6f 6e 74 65  mp(zLine, "Conte
ca60: 6e 74 2d 6c 65 6e 67 74 68 3a 22 2c 20 31 35 29  nt-length:", 15)
ca70: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
ca80: 65 65 6e 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68  eenContentLength
ca90: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f   = 1;.        co
caa0: 6e 74 65 6e 74 4c 65 6e 67 74 68 20 3d 20 61 74  ntentLength = at
cab0: 6f 69 28 7a 4c 69 6e 65 2b 31 35 29 3b 0a 20 20  oi(zLine+15);.  
cac0: 20 20 20 20 7d 0a 20 20 20 20 20 20 53 74 61 72      }.      Star
cad0: 74 52 65 73 70 6f 6e 73 65 28 22 32 30 30 20 4f  tResponse("200 O
cae0: 4b 22 29 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20  K");.      nOut 
caf0: 2b 3d 20 70 72 69 6e 74 66 28 22 25 73 22 2c 7a  += printf("%s",z
cb00: 4c 69 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Line);.    }.  }
cb10: 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 65 76 65 72  ..  /* Copy ever
cb20: 79 74 68 69 6e 67 20 65 6c 73 65 20 74 68 72 75  ything else thru
cb30: 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 65 20   without change 
cb40: 6f 72 20 61 6e 61 6c 79 73 69 73 2e 0a 20 20 2a  or analysis..  *
cb50: 2f 0a 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73  /.  StartRespons
cb60: 65 28 22 32 30 30 20 4f 4b 22 29 3b 0a 20 20 69  e("200 OK");.  i
cb70: 66 28 20 75 73 65 54 69 6d 65 6f 75 74 20 29 20  f( useTimeout ) 
cb80: 61 6c 61 72 6d 28 36 30 2a 35 29 3b 0a 20 20 69  alarm(60*5);.  i
cb90: 66 28 20 73 65 65 6e 43 6f 6e 74 65 6e 74 4c 65  f( seenContentLe
cba0: 6e 67 74 68 20 29 7b 0a 20 20 20 20 6e 4f 75 74  ngth ){.    nOut
cbb0: 20 2b 3d 20 70 72 69 6e 74 66 28 22 25 73 22 2c   += printf("%s",
cbc0: 20 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 77 68 69   zLine);.    whi
cbd0: 6c 65 28 20 28 63 6f 6e 74 65 6e 74 4c 65 6e 67  le( (contentLeng
cbe0: 74 68 2d 2d 29 3e 30 20 26 26 20 28 63 20 3d 20  th--)>0 && (c = 
cbf0: 67 65 74 63 28 69 6e 29 29 21 3d 45 4f 46 20 29  getc(in))!=EOF )
cc00: 7b 0a 20 20 20 20 20 20 70 75 74 63 28 63 2c 73  {.      putc(c,s
cc10: 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 6e 4f  tdout);.      nO
cc20: 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ut++;.    }.  }e
cc30: 6c 73 65 7b 0a 20 20 20 20 6e 52 65 73 20 3d 20  lse{.    nRes = 
cc40: 30 3b 0a 20 20 20 20 6e 4d 61 6c 6c 6f 63 20 3d  0;.    nMalloc =
cc50: 20 31 30 30 30 3b 0a 20 20 20 20 61 52 65 73 20   1000;.    aRes 
cc60: 3d 20 6d 61 6c 6c 6f 63 28 6e 4d 61 6c 6c 6f 63  = malloc(nMalloc
cc70: 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 61 52 65  +1);.    if( aRe
cc80: 73 3d 3d 30 20 29 20 4d 61 6c 66 75 6e 63 74 69  s==0 ) Malfuncti
cc90: 6f 6e 28 36 30 30 2c 22 4f 75 74 20 6f 66 20 6d  on(600,"Out of m
cca0: 65 6d 6f 72 79 3a 20 25 64 20 62 79 74 65 73 22  emory: %d bytes"
ccb0: 2c 20 6e 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  , nMalloc);.    
ccc0: 77 68 69 6c 65 28 20 28 63 20 3d 20 67 65 74 63  while( (c = getc
ccd0: 28 69 6e 29 29 21 3d 45 4f 46 20 29 7b 0a 20 20  (in))!=EOF ){.  
cce0: 20 20 20 20 69 66 28 20 6e 52 65 73 3e 3d 6e 4d      if( nRes>=nM
ccf0: 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  alloc ){.       
cd00: 20 6e 4d 61 6c 6c 6f 63 20 3d 20 6e 4d 61 6c 6c   nMalloc = nMall
cd10: 6f 63 2a 32 3b 0a 20 20 20 20 20 20 20 20 61 52  oc*2;.        aR
cd20: 65 73 20 3d 20 72 65 61 6c 6c 6f 63 28 61 52 65  es = realloc(aRe
cd30: 73 2c 20 6e 4d 61 6c 6c 6f 63 2b 31 29 3b 0a 20  s, nMalloc+1);. 
cd40: 20 20 20 20 20 20 20 69 66 28 20 61 52 65 73 3d         if( aRes=
cd50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
cd60: 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 36 31 30   Malfunction(610
cd70: 2c 20 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  , "Out of memory
cd80: 3a 20 25 64 20 62 79 74 65 73 22 2c 20 6e 4d 61  : %d bytes", nMa
cd90: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 7d  lloc);.        }
cda0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
cdb0: 52 65 73 5b 6e 52 65 73 2b 2b 5d 20 3d 20 63 3b  Res[nRes++] = c;
cdc0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 52 65 73 5b  .    }.    aRes[
cdd0: 6e 52 65 73 5d 20 3d 20 30 3b 0a 20 20 20 20 6e  nRes] = 0;.    n
cde0: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 43  Out += printf("C
cdf0: 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74 68 3a 20 25  ontent-length: %
ce00: 64 5c 72 5c 6e 5c 72 5c 6e 25 73 22 2c 20 28 69  d\r\n\r\n%s", (i
ce10: 6e 74 29 6e 52 65 73 2c 20 61 52 65 73 29 3b 0a  nt)nRes, aRes);.
ce20: 20 20 20 20 66 72 65 65 28 61 52 65 73 29 3b 0a      free(aRes);.
ce30: 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29    }.  fclose(in)
ce40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 6e 64 20  ;.}../*.** Send 
ce50: 61 6e 20 53 43 47 49 20 72 65 71 75 65 73 74 20  an SCGI request 
ce60: 74 6f 20 61 20 68 6f 73 74 20 69 64 65 6e 74 69  to a host identi
ce70: 66 69 65 64 20 62 79 20 7a 46 69 6c 65 20 61 6e  fied by zFile an
ce80: 64 20 70 72 6f 63 65 73 73 20 74 68 65 0a 2a 2a  d process the.**
ce90: 20 72 65 70 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69   reply..*/.stati
cea0: 63 20 76 6f 69 64 20 53 65 6e 64 53 63 67 69 52  c void SendScgiR
ceb0: 65 71 75 65 73 74 28 63 6f 6e 73 74 20 63 68 61  equest(const cha
cec0: 72 20 2a 7a 46 69 6c 65 2c 20 63 6f 6e 73 74 20  r *zFile, const 
ced0: 63 68 61 72 20 2a 7a 53 63 72 69 70 74 29 7b 0a  char *zScript){.
cee0: 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 46 49    FILE *in;.  FI
cef0: 4c 45 20 2a 73 3b 0a 20 20 63 68 61 72 20 2a 7a  LE *s;.  char *z
cf00: 3b 0a 20 20 63 68 61 72 20 2a 7a 48 6f 73 74 3b  ;.  char *zHost;
cf10: 0a 20 20 63 68 61 72 20 2a 7a 50 6f 72 74 20 3d  .  char *zPort =
cf20: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 6c   0;.  char *zRel
cf30: 69 67 68 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  ight = 0;.  char
cf40: 20 2a 7a 46 61 6c 6c 62 61 63 6b 20 3d 20 30 3b   *zFallback = 0;
cf50: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
cf60: 20 69 53 6f 63 6b 65 74 20 3d 20 2d 31 3b 0a 20   iSocket = -1;. 
cf70: 20 73 74 72 75 63 74 20 61 64 64 72 69 6e 66 6f   struct addrinfo
cf80: 20 68 69 6e 74 73 3b 0a 20 20 73 74 72 75 63 74   hints;.  struct
cf90: 20 61 64 64 72 69 6e 66 6f 20 2a 61 69 20 3d 20   addrinfo *ai = 
cfa0: 30 3b 0a 20 20 73 74 72 75 63 74 20 61 64 64 72  0;.  struct addr
cfb0: 69 6e 66 6f 20 2a 70 3b 0a 20 20 63 68 61 72 20  info *p;.  char 
cfc0: 2a 7a 48 64 72 3b 0a 20 20 73 69 7a 65 5f 74 20  *zHdr;.  size_t 
cfd0: 6e 48 64 72 20 3d 20 30 3b 0a 20 20 73 69 7a 65  nHdr = 0;.  size
cfe0: 5f 74 20 6e 48 64 72 41 6c 6c 6f 63 3b 0a 20 20  _t nHdrAlloc;.  
cff0: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 7a 4c  int i;.  char zL
d000: 69 6e 65 5b 31 30 30 30 5d 3b 0a 20 20 63 68 61  ine[1000];.  cha
d010: 72 20 7a 45 78 74 72 61 5b 31 30 30 30 5d 3b 0a  r zExtra[1000];.
d020: 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69    in = fopen(zFi
d030: 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 69 66 28  le, "rb");.  if(
d040: 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 4d 61   in==0 ){.    Ma
d050: 6c 66 75 6e 63 74 69 6f 6e 28 37 30 30 2c 20 22  lfunction(700, "
d060: 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73  cannot open \"%s
d070: 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20  \"\n", zFile);. 
d080: 20 7d 0a 20 20 69 66 28 20 66 67 65 74 73 28 7a   }.  if( fgets(z
d090: 4c 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c 69  Line, sizeof(zLi
d0a0: 6e 65 29 2d 31 2c 20 69 6e 29 3d 3d 30 20 29 7b  ne)-1, in)==0 ){
d0b0: 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e  .    Malfunction
d0c0: 28 37 30 31 2c 20 22 63 61 6e 6e 6f 74 20 72 65  (701, "cannot re
d0d0: 61 64 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46  ad \"%s\"\n", zF
d0e0: 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ile);.  }.  if( 
d0f0: 73 74 72 6e 63 6d 70 28 7a 4c 69 6e 65 2c 22 53  strncmp(zLine,"S
d100: 43 47 49 20 22 2c 35 29 21 3d 30 20 29 7b 0a 20  CGI ",5)!=0 ){. 
d110: 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 37     Malfunction(7
d120: 30 32 2c 20 22 6d 69 73 66 6f 72 6d 61 74 74 65  02, "misformatte
d130: 64 20 53 43 47 49 20 73 70 65 63 20 5c 22 25 73  d SCGI spec \"%s
d140: 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20  \"\n", zFile);. 
d150: 20 7d 0a 20 20 7a 20 3d 20 7a 4c 69 6e 65 2b 35   }.  z = zLine+5
d160: 3b 0a 20 20 7a 48 6f 73 74 20 3d 20 47 65 74 46  ;.  zHost = GetF
d170: 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a 2c 26 7a  irstElement(z,&z
d180: 29 3b 0a 20 20 7a 50 6f 72 74 20 3d 20 47 65 74  );.  zPort = Get
d190: 46 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a 2c 30  FirstElement(z,0
d1a0: 29 3b 0a 20 20 69 66 28 20 7a 48 6f 73 74 3d 3d  );.  if( zHost==
d1b0: 30 20 7c 7c 20 7a 48 6f 73 74 5b 30 5d 3d 3d 30  0 || zHost[0]==0
d1c0: 20 7c 7c 20 7a 50 6f 72 74 3d 3d 30 20 7c 7c 20   || zPort==0 || 
d1d0: 7a 50 6f 72 74 5b 30 5d 3d 3d 30 20 29 7b 0a 20  zPort[0]==0 ){. 
d1e0: 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 37     Malfunction(7
d1f0: 30 33 2c 20 22 6d 69 73 66 6f 72 6d 61 74 74 65  03, "misformatte
d200: 64 20 53 43 47 49 20 73 70 65 63 20 5c 22 25 73  d SCGI spec \"%s
d210: 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20  \"\n", zFile);. 
d220: 20 7d 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74   }.  while( fget
d230: 73 28 7a 45 78 74 72 61 2c 20 73 69 7a 65 6f 66  s(zExtra, sizeof
d240: 28 7a 45 78 74 72 61 29 2d 31 2c 20 69 6e 29 20  (zExtra)-1, in) 
d250: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6d  ){.    char *zCm
d260: 64 20 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d  d = GetFirstElem
d270: 65 6e 74 28 7a 45 78 74 72 61 2c 26 7a 29 3b 0a  ent(zExtra,&z);.
d280: 20 20 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20      if( zCmd==0 
d290: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
d2a0: 69 66 28 20 7a 43 6d 64 5b 30 5d 3d 3d 27 23 27  if( zCmd[0]=='#'
d2b0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
d2c0: 20 52 65 6d 6f 76 65 4e 65 77 6c 69 6e 65 28 7a   RemoveNewline(z
d2d0: 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  );.    if( strcm
d2e0: 70 28 7a 43 6d 64 2c 20 22 72 65 6c 69 67 68 74  p(zCmd, "relight
d2f0: 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  :")==0 ){.      
d300: 66 72 65 65 28 7a 52 65 6c 69 67 68 74 29 3b 0a  free(zRelight);.
d310: 20 20 20 20 20 20 7a 52 65 6c 69 67 68 74 20 3d        zRelight =
d320: 20 53 74 72 44 75 70 28 7a 29 3b 0a 20 20 20 20   StrDup(z);.    
d330: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
d340: 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  }.    if( strcmp
d350: 28 7a 43 6d 64 2c 20 22 66 61 6c 6c 62 61 63 6b  (zCmd, "fallback
d360: 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  :")==0 ){.      
d370: 66 72 65 65 28 7a 46 61 6c 6c 62 61 63 6b 29 3b  free(zFallback);
d380: 0a 20 20 20 20 20 20 7a 46 61 6c 6c 62 61 63 6b  .      zFallback
d390: 20 3d 20 53 74 72 44 75 70 28 7a 29 3b 0a 20 20   = StrDup(z);.  
d3a0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
d3b0: 20 20 7d 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74    }.    Malfunct
d3c0: 69 6f 6e 28 37 30 34 2c 20 22 75 6e 72 65 63 6f  ion(704, "unreco
d3d0: 67 6e 69 7a 65 64 20 6c 69 6e 65 20 69 6e 20 53  gnized line in S
d3e0: 43 47 49 20 73 70 65 63 3a 20 5c 22 25 73 20 25  CGI spec: \"%s %
d3f0: 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  s\"\n",.        
d400: 20 20 20 20 20 20 20 20 7a 43 6d 64 2c 20 7a 20          zCmd, z 
d410: 3f 20 7a 20 3a 20 22 22 29 3b 0a 20 20 7d 0a 20  ? z : "");.  }. 
d420: 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 6d   fclose(in);.  m
d430: 65 6d 73 65 74 28 26 68 69 6e 74 73 2c 20 30 2c  emset(&hints, 0,
d440: 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 61   sizeof(struct a
d450: 64 64 72 69 6e 66 6f 29 29 3b 0a 20 20 68 69 6e  ddrinfo));.  hin
d460: 74 73 2e 61 69 5f 66 61 6d 69 6c 79 20 3d 20 41  ts.ai_family = A
d470: 46 5f 55 4e 53 50 45 43 3b 0a 20 20 68 69 6e 74  F_UNSPEC;.  hint
d480: 73 2e 61 69 5f 73 6f 63 6b 74 79 70 65 20 3d 20  s.ai_socktype = 
d490: 53 4f 43 4b 5f 53 54 52 45 41 4d 3b 0a 20 20 68  SOCK_STREAM;.  h
d4a0: 69 6e 74 73 2e 61 69 5f 70 72 6f 74 6f 63 6f 6c  ints.ai_protocol
d4b0: 20 3d 20 49 50 50 52 4f 54 4f 5f 54 43 50 3b 0a   = IPPROTO_TCP;.
d4c0: 20 20 72 63 20 3d 20 67 65 74 61 64 64 72 69 6e    rc = getaddrin
d4d0: 66 6f 28 7a 48 6f 73 74 2c 7a 50 6f 72 74 2c 26  fo(zHost,zPort,&
d4e0: 68 69 6e 74 73 2c 26 61 69 29 3b 0a 20 20 69 66  hints,&ai);.  if
d4f0: 28 20 72 63 20 29 7b 0a 20 20 20 20 4d 61 6c 66  ( rc ){.    Malf
d500: 75 6e 63 74 69 6f 6e 28 37 30 34 2c 20 22 63 61  unction(704, "ca
d510: 6e 6e 6f 74 20 72 65 73 6f 6c 76 65 20 53 43 47  nnot resolve SCG
d520: 49 20 73 65 72 76 65 72 20 6e 61 6d 65 20 25 73  I server name %s
d530: 3a 25 73 5c 6e 25 73 5c 6e 22 2c 0a 20 20 20 20  :%s\n%s\n",.    
d540: 20 20 20 20 20 20 20 20 20 20 20 20 7a 48 6f 73              zHos
d550: 74 2c 20 7a 50 6f 72 74 2c 20 67 61 69 5f 73 74  t, zPort, gai_st
d560: 72 65 72 72 6f 72 28 72 63 29 29 3b 0a 20 20 7d  rerror(rc));.  }
d570: 0a 20 20 77 68 69 6c 65 28 31 29 7b 20 20 2f 2a  .  while(1){  /*
d580: 20 45 78 69 74 20 76 69 61 20 62 72 65 61 6b 20   Exit via break 
d590: 2a 2f 0a 20 20 20 20 66 6f 72 28 70 3d 61 69 3b  */.    for(p=ai;
d5a0: 20 70 3b 20 70 3d 70 2d 3e 61 69 5f 6e 65 78 74   p; p=p->ai_next
d5b0: 29 7b 0a 20 20 20 20 20 20 69 53 6f 63 6b 65 74  ){.      iSocket
d5c0: 20 3d 20 73 6f 63 6b 65 74 28 70 2d 3e 61 69 5f   = socket(p->ai_
d5d0: 66 61 6d 69 6c 79 2c 20 70 2d 3e 61 69 5f 73 6f  family, p->ai_so
d5e0: 63 6b 74 79 70 65 2c 20 70 2d 3e 61 69 5f 70 72  cktype, p->ai_pr
d5f0: 6f 74 6f 63 6f 6c 29 3b 0a 20 20 20 20 20 20 69  otocol);.      i
d600: 66 28 20 69 53 6f 63 6b 65 74 3c 30 20 29 20 63  f( iSocket<0 ) c
d610: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
d620: 66 28 20 63 6f 6e 6e 65 63 74 28 69 53 6f 63 6b  f( connect(iSock
d630: 65 74 2c 70 2d 3e 61 69 5f 61 64 64 72 2c 70 2d  et,p->ai_addr,p-
d640: 3e 61 69 5f 61 64 64 72 6c 65 6e 29 3e 3d 30 20  >ai_addrlen)>=0 
d650: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ) break;.      c
d660: 6c 6f 73 65 28 69 53 6f 63 6b 65 74 29 3b 0a 20  lose(iSocket);. 
d670: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 53 6f     }.    if( iSo
d680: 63 6b 65 74 3c 30 20 7c 7c 20 28 73 20 3d 20 66  cket<0 || (s = f
d690: 64 6f 70 65 6e 28 69 53 6f 63 6b 65 74 2c 22 72  dopen(iSocket,"r
d6a0: 2b 22 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  +"))==0 ){.     
d6b0: 20 69 66 28 20 69 53 6f 63 6b 65 74 3e 3d 30 20   if( iSocket>=0 
d6c0: 29 20 63 6c 6f 73 65 28 69 53 6f 63 6b 65 74 29  ) close(iSocket)
d6d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 65 6c  ;.      if( zRel
d6e0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ight ){.        
d6f0: 72 63 20 3d 20 73 79 73 74 65 6d 28 7a 52 65 6c  rc = system(zRel
d700: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 69  ight);.        i
d710: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
d720: 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 37     Malfunction(7
d730: 32 31 2c 22 52 65 6c 69 67 68 74 20 66 61 69 6c  21,"Relight fail
d740: 65 64 20 77 69 74 68 20 25 64 3a 20 5c 22 25 73  ed with %d: \"%s
d750: 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  \"\n",.         
d760: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 2c               rc,
d770: 20 7a 52 65 6c 69 67 68 74 29 3b 0a 20 20 20 20   zRelight);.    
d780: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 72      }.        fr
d790: 65 65 28 7a 52 65 6c 69 67 68 74 29 3b 0a 20 20  ee(zRelight);.  
d7a0: 20 20 20 20 20 20 7a 52 65 6c 69 67 68 74 20 3d        zRelight =
d7b0: 20 30 3b 0a 20 20 20 20 20 20 20 20 73 6c 65 65   0;.        slee
d7c0: 70 28 31 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  p(1);.        co
d7d0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
d7e0: 20 20 20 20 20 20 69 66 28 20 7a 46 61 6c 6c 62        if( zFallb
d7f0: 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ack ){.        s
d800: 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62  truct stat statb
d810: 75 66 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  uf;.        int 
d820: 72 63 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  rc;.        mems
d830: 65 74 28 26 73 74 61 74 62 75 66 2c 20 30 2c 20  et(&statbuf, 0, 
d840: 73 69 7a 65 6f 66 28 73 74 61 74 62 75 66 29 29  sizeof(statbuf))
d850: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 68  ;.        if( ch
d860: 64 69 72 28 7a 44 69 72 29 20 29 7b 0a 20 20 20  dir(zDir) ){.   
d870: 20 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66         char zBuf
d880: 5b 31 30 30 30 5d 3b 0a 20 20 20 20 20 20 20 20  [1000];.        
d890: 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 37 32    Malfunction(72
d8a0: 30 2c 20 2f 2a 20 4c 4f 47 3a 20 63 68 64 69 72  0, /* LOG: chdir
d8b0: 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  () failed */.   
d8c0: 20 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e              "can
d8d0: 6e 6f 74 20 63 68 64 69 72 20 74 6f 20 5b 25 73  not chdir to [%s
d8e0: 5d 20 66 72 6f 6d 20 5b 25 73 5d 22 2c 20 0a 20  ] from [%s]", . 
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 44                zD
d900: 69 72 2c 20 67 65 74 63 77 64 28 7a 42 75 66 2c  ir, getcwd(zBuf,
d910: 39 39 39 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  999));.        }
d920: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 74  .        rc = st
d930: 61 74 28 7a 46 61 6c 6c 62 61 63 6b 2c 20 26 73  at(zFallback, &s
d940: 74 61 74 62 75 66 29 3b 0a 20 20 20 20 20 20 20  tatbuf);.       
d950: 20 69 66 28 20 72 63 3d 3d 30 20 26 26 20 53 5f   if( rc==0 && S_
d960: 49 53 52 45 47 28 73 74 61 74 62 75 66 2e 73 74  ISREG(statbuf.st
d970: 5f 6d 6f 64 65 29 20 26 26 20 61 63 63 65 73 73  _mode) && access
d980: 28 7a 46 61 6c 6c 62 61 63 6b 2c 52 5f 4f 4b 29  (zFallback,R_OK)
d990: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
d9a0: 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e   closeConnection
d9b0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
d9c0: 72 63 20 3d 20 53 65 6e 64 46 69 6c 65 28 7a 46  rc = SendFile(zF
d9d0: 61 6c 6c 62 61 63 6b 2c 20 28 69 6e 74 29 73 74  allback, (int)st
d9e0: 72 6c 65 6e 28 7a 46 61 6c 6c 62 61 63 6b 29 2c  rlen(zFallback),
d9f0: 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20   &statbuf);.    
da00: 20 20 20 20 20 20 66 72 65 65 28 7a 46 61 6c 6c        free(zFall
da10: 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  back);.         
da20: 20 65 78 69 74 28 30 29 3b 0a 20 20 20 20 20 20   exit(0);.      
da30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
da40: 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 37     Malfunction(7
da50: 30 36 2c 20 22 62 61 64 20 66 61 6c 6c 62 61 63  06, "bad fallbac
da60: 6b 20 66 69 6c 65 3a 20 5c 22 25 73 5c 22 5c 6e  k file: \"%s\"\n
da70: 22 2c 20 7a 46 61 6c 6c 62 61 63 6b 29 3b 0a 20  ", zFallback);. 
da80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
da90: 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69  .      Malfuncti
daa0: 6f 6e 28 37 30 37 2c 20 22 63 61 6e 6e 6f 74 20  on(707, "cannot 
dab0: 6f 70 65 6e 20 73 6f 63 6b 65 74 20 74 6f 20 53  open socket to S
dac0: 43 47 49 20 73 65 72 76 65 72 20 25 73 5c 6e 22  CGI server %s\n"
dad0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
dae0: 20 20 20 20 7a 53 63 72 69 70 74 29 3b 0a 20 20      zScript);.  
daf0: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
db00: 20 7d 0a 0a 20 20 6e 48 64 72 41 6c 6c 6f 63 20   }..  nHdrAlloc 
db10: 3d 20 30 3b 0a 20 20 7a 48 64 72 20 3d 20 30 3b  = 0;.  zHdr = 0;
db20: 0a 20 20 69 66 28 20 7a 43 6f 6e 74 65 6e 74 4c  .  if( zContentL
db30: 65 6e 67 74 68 3d 3d 30 20 29 20 7a 43 6f 6e 74  ength==0 ) zCont
db40: 65 6e 74 4c 65 6e 67 74 68 20 3d 20 22 30 22 3b  entLength = "0";
db50: 0a 20 20 7a 53 63 67 69 20 3d 20 22 31 22 3b 0a  .  zScgi = "1";.
db60: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 69 6e    for(i=0; i<(in
db70: 74 29 28 73 69 7a 65 6f 66 28 63 67 69 65 6e 76  t)(sizeof(cgienv
db80: 29 2f 73 69 7a 65 6f 66 28 63 67 69 65 6e 76 5b  )/sizeof(cgienv[
db90: 30 5d 29 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  0])); i++){.    
dba0: 69 6e 74 20 6e 31 2c 20 6e 32 3b 0a 20 20 20 20  int n1, n2;.    
dbb0: 69 66 28 20 63 67 69 65 6e 76 5b 69 5d 2e 70 7a  if( cgienv[i].pz
dbc0: 45 6e 76 56 61 6c 75 65 5b 30 5d 3d 3d 30 20 29  EnvValue[0]==0 )
dbd0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e   continue;.    n
dbe0: 31 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  1 = (int)strlen(
dbf0: 63 67 69 65 6e 76 5b 69 5d 2e 7a 45 6e 76 4e 61  cgienv[i].zEnvNa
dc00: 6d 65 29 3b 0a 20 20 20 20 6e 32 20 3d 20 28 69  me);.    n2 = (i
dc10: 6e 74 29 73 74 72 6c 65 6e 28 2a 63 67 69 65 6e  nt)strlen(*cgien
dc20: 76 5b 69 5d 2e 70 7a 45 6e 76 56 61 6c 75 65 29  v[i].pzEnvValue)
dc30: 3b 0a 20 20 20 20 69 66 28 20 6e 31 2b 6e 32 2b  ;.    if( n1+n2+
dc40: 32 2b 6e 48 64 72 20 3e 3d 20 6e 48 64 72 41 6c  2+nHdr >= nHdrAl
dc50: 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 6e 48 64  loc ){.      nHd
dc60: 72 41 6c 6c 6f 63 20 3d 20 6e 48 64 72 20 2b 20  rAlloc = nHdr + 
dc70: 6e 31 20 2b 20 6e 32 20 2b 20 31 30 30 30 3b 0a  n1 + n2 + 1000;.
dc80: 20 20 20 20 20 20 7a 48 64 72 20 3d 20 72 65 61        zHdr = rea
dc90: 6c 6c 6f 63 28 7a 48 64 72 2c 20 6e 48 64 72 41  lloc(zHdr, nHdrA
dca0: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 69 66 28  lloc);.      if(
dcb0: 20 7a 48 64 72 3d 3d 30 20 29 7b 0a 20 20 20 20   zHdr==0 ){.    
dcc0: 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28      Malfunction(
dcd0: 37 30 36 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d  706, "out of mem
dce0: 6f 72 79 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ory");.      }. 
dcf0: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
dd00: 7a 48 64 72 2b 6e 48 64 72 2c 20 63 67 69 65 6e  zHdr+nHdr, cgien
dd10: 76 5b 69 5d 2e 7a 45 6e 76 4e 61 6d 65 2c 20 6e  v[i].zEnvName, n
dd20: 31 29 3b 0a 20 20 20 20 6e 48 64 72 20 2b 3d 20  1);.    nHdr += 
dd30: 6e 31 3b 0a 20 20 20 20 7a 48 64 72 5b 6e 48 64  n1;.    zHdr[nHd
dd40: 72 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 6d 65  r++] = 0;.    me
dd50: 6d 63 70 79 28 7a 48 64 72 2b 6e 48 64 72 2c 20  mcpy(zHdr+nHdr, 
dd60: 2a 63 67 69 65 6e 76 5b 69 5d 2e 70 7a 45 6e 76  *cgienv[i].pzEnv
dd70: 56 61 6c 75 65 2c 20 6e 32 29 3b 0a 20 20 20 20  Value, n2);.    
dd80: 6e 48 64 72 20 2b 3d 20 6e 32 3b 0a 20 20 20 20  nHdr += n2;.    
dd90: 7a 48 64 72 5b 6e 48 64 72 2b 2b 5d 20 3d 20 30  zHdr[nHdr++] = 0
dda0: 3b 0a 20 20 7d 0a 20 20 7a 53 63 67 69 20 3d 20  ;.  }.  zScgi = 
ddb0: 30 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 2c 22  0;.  fprintf(s,"
ddc0: 25 64 3a 22 2c 28 69 6e 74 29 6e 48 64 72 29 3b  %d:",(int)nHdr);
ddd0: 0a 20 20 66 77 72 69 74 65 28 7a 48 64 72 2c 20  .  fwrite(zHdr, 
dde0: 31 2c 20 6e 48 64 72 2c 20 73 29 3b 0a 20 20 66  1, nHdr, s);.  f
ddf0: 70 72 69 6e 74 66 28 73 2c 22 2c 22 29 3b 0a 20  printf(s,",");. 
de00: 20 66 72 65 65 28 7a 48 64 72 29 3b 0a 20 20 69   free(zHdr);.  i
de10: 66 28 20 7a 4d 65 74 68 6f 64 5b 30 5d 3d 3d 27  f( zMethod[0]=='
de20: 50 27 0a 20 20 20 26 26 20 61 74 6f 69 28 7a 43  P'.   && atoi(zC
de30: 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 29 3e 30 20  ontentLength)>0 
de40: 0a 20 20 20 26 26 20 28 69 6e 20 3d 20 66 6f 70  .   && (in = fop
de50: 65 6e 28 7a 54 6d 70 4e 61 6d 2c 22 72 22 29 29  en(zTmpNam,"r"))
de60: 21 3d 30 20 29 7b 0a 20 20 20 20 73 69 7a 65 5f  !=0 ){.    size_
de70: 74 20 6e 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  t n;.    while( 
de80: 28 6e 20 3d 20 66 72 65 61 64 28 7a 4c 69 6e 65  (n = fread(zLine
de90: 2c 31 2c 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29  ,1,sizeof(zLine)
dea0: 2c 69 6e 29 29 3e 30 20 29 7b 0a 20 20 20 20 20  ,in))>0 ){.     
deb0: 20 66 77 72 69 74 65 28 7a 4c 69 6e 65 2c 20 31   fwrite(zLine, 1
dec0: 2c 20 6e 2c 20 73 29 3b 0a 20 20 20 20 7d 0a 20  , n, s);.    }. 
ded0: 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
dee0: 20 7d 0a 20 20 66 66 6c 75 73 68 28 73 29 3b 0a   }.  fflush(s);.
def0: 20 20 43 67 69 48 61 6e 64 6c 65 52 65 70 6c 79    CgiHandleReply
df00: 28 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  (s);.}../*.** Th
df10: 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65  is routine proce
df20: 73 73 65 73 20 61 20 73 69 6e 67 6c 65 20 48 54  sses a single HT
df30: 54 50 20 72 65 71 75 65 73 74 20 6f 6e 20 73 74  TP request on st
df40: 61 6e 64 61 72 64 20 69 6e 70 75 74 20 61 6e 64  andard input and
df50: 0a 2a 2a 20 73 65 6e 64 73 20 74 68 65 20 72 65  .** sends the re
df60: 70 6c 79 20 74 6f 20 73 74 61 6e 64 61 72 64 20  ply to standard 
df70: 6f 75 74 70 75 74 2e 20 20 49 66 20 74 68 65 20  output.  If the 
df80: 61 72 67 75 6d 65 6e 74 20 69 73 20 31 20 69 74  argument is 1 it
df90: 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 77   means.** that w
dfa0: 65 20 61 72 65 20 73 68 6f 75 6c 64 20 63 6c 6f  e are should clo
dfb0: 73 65 20 74 68 65 20 73 6f 63 6b 65 74 20 77 69  se the socket wi
dfc0: 74 68 6f 75 74 20 70 72 6f 63 65 73 73 69 6e 67  thout processing
dfd0: 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 48   additional.** H
dfe0: 54 54 50 20 72 65 71 75 65 73 74 73 20 61 66 74  TTP requests aft
dff0: 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  er the current r
e000: 65 71 75 65 73 74 20 66 69 6e 69 73 68 65 73 2e  equest finishes.
e010: 20 20 30 20 6d 65 61 6e 73 20 77 65 20 61 72 65    0 means we are
e020: 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6b  .** allowed to k
e030: 65 65 70 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  eep the connecti
e040: 6f 6e 20 6f 70 65 6e 20 61 6e 64 20 74 6f 20 70  on open and to p
e050: 72 6f 63 65 73 73 20 61 64 64 69 74 69 6f 6e 61  rocess additiona
e060: 6c 20 72 65 71 75 65 73 74 73 2e 0a 2a 2a 20 54  l requests..** T
e070: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20  his routine may 
e080: 63 68 6f 6f 73 65 20 74 6f 20 63 6c 6f 73 65 20  choose to close 
e090: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 65  the connection e
e0a0: 76 65 6e 20 69 66 20 74 68 65 20 61 72 67 75 6d  ven if the argum
e0b0: 65 6e 74 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2a 20  ent.** is 0..** 
e0c0: 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 6e 65  .** If the conne
e0d0: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  ction should be 
e0e0: 63 6c 6f 73 65 64 2c 20 74 68 69 73 20 72 6f 75  closed, this rou
e0f0: 74 69 6e 65 20 63 61 6c 6c 73 20 65 78 69 74 28  tine calls exit(
e100: 29 20 61 6e 64 0a 2a 2a 20 74 68 75 73 20 6e 65  ) and.** thus ne
e110: 76 65 72 20 72 65 74 75 72 6e 73 2e 20 20 49 66  ver returns.  If
e120: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   this routine do
e130: 65 73 20 72 65 74 75 72 6e 20 69 74 20 6d 65 61  es return it mea
e140: 6e 73 20 74 68 61 74 20 61 6e 6f 74 68 65 72 0a  ns that another.
e150: 2a 2a 20 48 54 54 50 20 72 65 71 75 65 73 74 20  ** HTTP request 
e160: 6d 61 79 20 61 70 70 65 61 72 20 6f 6e 20 74 68  may appear on th
e170: 65 20 77 69 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e wire..*/.void 
e180: 50 72 6f 63 65 73 73 4f 6e 65 52 65 71 75 65 73  ProcessOneReques
e190: 74 28 69 6e 74 20 66 6f 72 63 65 43 6c 6f 73 65  t(int forceClose
e1a0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6a  ){.  int i, j, j
e1b0: 30 2c 20 63 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  0, c;.  char *z;
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 70 61 72    /* Used to par
e1e0: 73 65 20 75 70 20 61 20 73 74 72 69 6e 67 20 2a  se up a string *
e1f0: 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  /.  struct stat 
e200: 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 2f 2a  statbuf;      /*
e210: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
e220: 75 74 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  ut the file to b
e230: 65 20 72 65 74 72 69 65 76 65 64 20 2a 2f 0a 20  e retrieved */. 
e240: 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20   FILE *in;      
e250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
e260: 72 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 43  r reading from C
e270: 47 49 20 73 63 72 69 70 74 73 20 2a 2f 0a 23 69  GI scripts */.#i
e280: 66 64 65 66 20 4c 4f 47 5f 48 45 41 44 45 52 0a  fdef LOG_HEADER.
e290: 20 20 46 49 4c 45 20 2a 68 64 72 4c 6f 67 20 3d    FILE *hdrLog =
e2a0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c   0;         /* L
e2b0: 6f 67 20 66 69 6c 65 20 66 6f 72 20 63 6f 6d 70  og file for comp
e2c0: 6c 65 74 65 20 68 65 61 64 65 72 20 63 6f 6e 74  lete header cont
e2d0: 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ent */.#endif.  
e2e0: 63 68 61 72 20 7a 4c 69 6e 65 5b 31 30 30 30 5d  char zLine[1000]
e2f0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62  ;         /* A b
e300: 75 66 66 65 72 20 66 6f 72 20 69 6e 70 75 74 20  uffer for input 
e310: 6c 69 6e 65 73 20 6f 72 20 66 6f 72 6d 69 6e 67  lines or forming
e320: 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20   names */..  /* 
e330: 43 68 61 6e 67 65 20 64 69 72 65 63 74 6f 72 69  Change directori
e340: 65 73 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 6f  es to the root o
e350: 66 20 74 68 65 20 48 54 54 50 20 66 69 6c 65 73  f the HTTP files
e360: 79 73 74 65 6d 0a 20 20 2a 2f 0a 20 20 69 66 28  ystem.  */.  if(
e370: 20 63 68 64 69 72 28 7a 52 6f 6f 74 5b 30 5d 20   chdir(zRoot[0] 
e380: 3f 20 7a 52 6f 6f 74 20 3a 20 22 2f 22 29 21 3d  ? zRoot : "/")!=
e390: 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42  0 ){.    char zB
e3a0: 75 66 5b 31 30 30 30 5d 3b 0a 20 20 20 20 4d 61  uf[1000];.    Ma
e3b0: 6c 66 75 6e 63 74 69 6f 6e 28 31 39 30 2c 20 20  lfunction(190,  
e3c0: 20 2f 2a 20 4c 4f 47 3a 20 63 68 64 69 72 28 29   /* LOG: chdir()
e3d0: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
e3e0: 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 68 64 69      "cannot chdi
e3f0: 72 20 74 6f 20 5b 25 73 5d 20 66 72 6f 6d 20 5b  r to [%s] from [
e400: 25 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 7a  %s]",.         z
e410: 52 6f 6f 74 2c 20 67 65 74 63 77 64 28 7a 42 75  Root, getcwd(zBu
e420: 66 2c 39 39 39 29 29 3b 0a 20 20 7d 0a 20 20 6e  f,999));.  }.  n
e430: 52 65 71 75 65 73 74 2b 2b 3b 0a 0a 20 20 2f 2a  Request++;..  /*
e440: 0a 20 20 2a 2a 20 57 65 20 6d 75 73 74 20 72 65  .  ** We must re
e450: 63 65 69 76 65 20 61 20 63 6f 6d 70 6c 65 74 65  ceive a complete
e460: 20 68 65 61 64 65 72 20 77 69 74 68 69 6e 20 31   header within 1
e470: 35 20 73 65 63 6f 6e 64 73 0a 20 20 2a 2f 0a 20  5 seconds.  */. 
e480: 20 73 69 67 6e 61 6c 28 53 49 47 41 4c 52 4d 2c   signal(SIGALRM,
e490: 20 54 69 6d 65 6f 75 74 29 3b 0a 20 20 73 69 67   Timeout);.  sig
e4a0: 6e 61 6c 28 53 49 47 53 45 47 56 2c 20 54 69 6d  nal(SIGSEGV, Tim
e4b0: 65 6f 75 74 29 3b 0a 20 20 73 69 67 6e 61 6c 28  eout);.  signal(
e4c0: 53 49 47 50 49 50 45 2c 20 54 69 6d 65 6f 75 74  SIGPIPE, Timeout
e4d0: 29 3b 0a 20 20 69 66 28 20 75 73 65 54 69 6d 65  );.  if( useTime
e4e0: 6f 75 74 20 29 20 61 6c 61 72 6d 28 31 35 29 3b  out ) alarm(15);
e4f0: 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 66  ..  /* Get the f
e500: 69 72 73 74 20 6c 69 6e 65 20 6f 66 20 74 68 65  irst line of the
e510: 20 72 65 71 75 65 73 74 20 61 6e 64 20 70 61 72   request and par
e520: 73 65 20 6f 75 74 20 74 68 65 0a 20 20 2a 2a 20  se out the.  ** 
e530: 6d 65 74 68 6f 64 2c 20 74 68 65 20 73 63 72 69  method, the scri
e540: 70 74 20 61 6e 64 20 74 68 65 20 70 72 6f 74 6f  pt and the proto
e550: 63 6f 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  col..  */.  if( 
e560: 66 67 65 74 73 28 7a 4c 69 6e 65 2c 73 69 7a 65  fgets(zLine,size
e570: 6f 66 28 7a 4c 69 6e 65 29 2c 73 74 64 69 6e 29  of(zLine),stdin)
e580: 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78 69 74 28  ==0 ){.    exit(
e590: 30 29 3b 0a 20 20 7d 0a 20 20 6f 6d 69 74 4c 6f  0);.  }.  omitLo
e5a0: 67 20 3d 20 30 3b 0a 20 20 6e 49 6e 20 2b 3d 20  g = 0;.  nIn += 
e5b0: 73 74 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a 0a  strlen(zLine);..
e5c0: 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 66    /* Parse the f
e5d0: 69 72 73 74 20 6c 69 6e 65 20 6f 66 20 74 68 65  irst line of the
e5e0: 20 48 54 54 50 20 72 65 71 75 65 73 74 20 2a 2f   HTTP request */
e5f0: 0a 20 20 7a 4d 65 74 68 6f 64 20 3d 20 53 74 72  .  zMethod = Str
e600: 44 75 70 28 47 65 74 46 69 72 73 74 45 6c 65 6d  Dup(GetFirstElem
e610: 65 6e 74 28 7a 4c 69 6e 65 2c 26 7a 29 29 3b 0a  ent(zLine,&z));.
e620: 20 20 7a 52 65 61 6c 53 63 72 69 70 74 20 3d 20    zRealScript = 
e630: 7a 53 63 72 69 70 74 20 3d 20 53 74 72 44 75 70  zScript = StrDup
e640: 28 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74  (GetFirstElement
e650: 28 7a 2c 26 7a 29 29 3b 0a 20 20 7a 50 72 6f 74  (z,&z));.  zProt
e660: 6f 63 6f 6c 20 3d 20 53 74 72 44 75 70 28 47 65  ocol = StrDup(Ge
e670: 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a 2c  tFirstElement(z,
e680: 26 7a 29 29 3b 0a 20 20 69 66 28 20 7a 50 72 6f  &z));.  if( zPro
e690: 74 6f 63 6f 6c 3d 3d 30 20 7c 7c 20 73 74 72 6e  tocol==0 || strn
e6a0: 63 6d 70 28 7a 50 72 6f 74 6f 63 6f 6c 2c 22 48  cmp(zProtocol,"H
e6b0: 54 54 50 2f 22 2c 35 29 21 3d 30 20 7c 7c 20 73  TTP/",5)!=0 || s
e6c0: 74 72 6c 65 6e 28 7a 50 72 6f 74 6f 63 6f 6c 29  trlen(zProtocol)
e6d0: 21 3d 38 20 29 7b 0a 20 20 20 20 53 74 61 72 74  !=8 ){.    Start
e6e0: 52 65 73 70 6f 6e 73 65 28 22 34 30 30 20 42 61  Response("400 Ba
e6f0: 64 20 52 65 71 75 65 73 74 22 29 3b 0a 20 20 20  d Request");.   
e700: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
e710: 0a 20 20 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d  .      "Content-
e720: 74 79 70 65 3a 20 74 65 78 74 2f 70 6c 61 69 6e  type: text/plain
e730: 5c 72 5c 6e 22 0a 20 20 20 20 20 20 22 5c 72 5c  \r\n".      "\r\
e740: 6e 22 0a 20 20 20 20 20 20 22 54 68 69 73 20 73  n".      "This s
e750: 65 72 76 65 72 20 64 6f 65 73 20 6e 6f 74 20 75  erver does not u
e760: 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 72 65  nderstand the re
e770: 71 75 65 73 74 65 64 20 70 72 6f 74 6f 63 6f 6c  quested protocol
e780: 5c 6e 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 4d  \n".    );.    M
e790: 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 32  akeLogEntry(0, 2
e7a0: 30 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 62 61 64  00); /* LOG: bad
e7b0: 20 70 72 6f 74 6f 63 6f 6c 20 69 6e 20 48 54 54   protocol in HTT
e7c0: 50 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  P header */.    
e7d0: 65 78 69 74 28 30 29 3b 0a 20 20 7d 0a 20 20 69  exit(0);.  }.  i
e7e0: 66 28 20 7a 53 63 72 69 70 74 5b 30 5d 3d 3d 30  f( zScript[0]==0
e7f0: 20 29 20 4e 6f 74 46 6f 75 6e 64 28 32 31 30 29   ) NotFound(210)
e800: 3b 20 2f 2a 20 4c 4f 47 3a 20 45 6d 70 74 79 20  ; /* LOG: Empty 
e810: 72 65 71 75 65 73 74 20 55 52 49 20 2a 2f 0a 20  request URI */. 
e820: 20 69 66 28 20 66 6f 72 63 65 43 6c 6f 73 65 20   if( forceClose 
e830: 29 7b 0a 20 20 20 20 63 6c 6f 73 65 43 6f 6e 6e  ){.    closeConn
e840: 65 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d 65  ection = 1;.  }e
e850: 6c 73 65 20 69 66 28 20 7a 50 72 6f 74 6f 63 6f  lse if( zProtoco
e860: 6c 5b 35 5d 3c 27 31 27 20 7c 7c 20 7a 50 72 6f  l[5]<'1' || zPro
e870: 74 6f 63 6f 6c 5b 37 5d 3c 27 31 27 20 29 7b 0a  tocol[7]<'1' ){.
e880: 20 20 20 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74      closeConnect
e890: 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  ion = 1;.  }..  
e8a0: 2f 2a 20 54 68 69 73 20 76 65 72 79 20 73 69 6d  /* This very sim
e8b0: 70 6c 65 20 73 65 72 76 65 72 20 6f 6e 6c 79 20  ple server only 
e8c0: 75 6e 64 65 72 73 74 61 6e 64 73 20 74 68 65 20  understands the 
e8d0: 47 45 54 2c 20 50 4f 53 54 0a 20 20 2a 2a 20 61  GET, POST.  ** a
e8e0: 6e 64 20 48 45 41 44 20 6d 65 74 68 6f 64 73 0a  nd HEAD methods.
e8f0: 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 72 63 6d    */.  if( strcm
e900: 70 28 7a 4d 65 74 68 6f 64 2c 22 47 45 54 22 29  p(zMethod,"GET")
e910: 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d  !=0 && strcmp(zM
e920: 65 74 68 6f 64 2c 22 50 4f 53 54 22 29 21 3d 30  ethod,"POST")!=0
e930: 0a 20 20 20 20 20 20 20 26 26 20 73 74 72 63 6d  .       && strcm
e940: 70 28 7a 4d 65 74 68 6f 64 2c 22 48 45 41 44 22  p(zMethod,"HEAD"
e950: 29 21 3d 30 20 29 7b 0a 20 20 20 20 53 74 61 72  )!=0 ){.    Star
e960: 74 52 65 73 70 6f 6e 73 65 28 22 35 30 31 20 4e  tResponse("501 N
e970: 6f 74 20 49 6d 70 6c 65 6d 65 6e 74 65 64 22 29  ot Implemented")
e980: 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72  ;.    nOut += pr
e990: 69 6e 74 66 28 0a 20 20 20 20 20 20 22 43 6f 6e  intf(.      "Con
e9a0: 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f  tent-type: text/
e9b0: 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 20  plain\r\n".     
e9c0: 20 22 5c 72 5c 6e 22 0a 20 20 20 20 20 20 22 54   "\r\n".      "T
e9d0: 68 65 20 25 73 20 6d 65 74 68 6f 64 20 69 73 20  he %s method is 
e9e0: 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  not implemented 
e9f0: 6f 6e 20 74 68 69 73 20 73 65 72 76 65 72 2e 5c  on this server.\
ea00: 6e 22 2c 0a 20 20 20 20 20 20 7a 4d 65 74 68 6f  n",.      zMetho
ea10: 64 29 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f 67 45  d);.    MakeLogE
ea20: 6e 74 72 79 28 30 2c 20 32 32 30 29 3b 20 2f 2a  ntry(0, 220); /*
ea30: 20 4c 4f 47 3a 20 55 6e 6b 6e 6f 77 6e 20 72 65   LOG: Unknown re
ea40: 71 75 65 73 74 20 6d 65 74 68 6f 64 20 2a 2f 0a  quest method */.
ea50: 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20 7d      exit(0);.  }
ea60: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
ea70: 69 73 20 61 20 6c 6f 67 20 66 69 6c 65 20 28 69  is a log file (i
ea80: 66 20 7a 4c 6f 67 46 69 6c 65 21 3d 30 29 20 61  f zLogFile!=0) a
ea90: 6e 64 20 69 66 20 74 68 65 20 70 61 74 68 6e 61  nd if the pathna
eaa0: 6d 65 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 66  me in.  ** the f
eab0: 69 72 73 74 20 6c 69 6e 65 20 6f 66 20 74 68 65  irst line of the
eac0: 20 68 74 74 70 20 72 65 71 75 65 73 74 20 63 6f   http request co
ead0: 6e 74 61 69 6e 73 20 74 68 65 20 6d 61 67 69 63  ntains the magic
eae0: 20 73 74 72 69 6e 67 0a 20 20 2a 2a 20 22 46 75   string.  ** "Fu
eaf0: 6c 6c 48 65 61 64 65 72 4c 6f 67 22 20 74 68 65  llHeaderLog" the
eb00: 6e 20 77 72 69 74 65 20 74 68 65 20 63 6f 6d 70  n write the comp
eb10: 6c 65 74 65 20 68 65 61 64 65 72 20 74 65 78 74  lete header text
eb20: 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66   into the.  ** f
eb30: 69 6c 65 20 25 73 28 7a 4c 6f 67 46 69 6c 65 29  ile %s(zLogFile)
eb40: 2d 68 64 72 2e 20 20 4f 76 65 72 77 72 69 74 65  -hdr.  Overwrite
eb50: 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 69 73   the file.  This
eb60: 20 69 73 20 66 6f 72 20 70 72 6f 74 6f 63 6f 6c   is for protocol
eb70: 0a 20 20 2a 2a 20 64 65 62 75 67 67 69 6e 67 20  .  ** debugging 
eb80: 6f 6e 6c 79 20 61 6e 64 20 69 73 20 6f 6e 6c 79  only and is only
eb90: 20 65 6e 61 62 6c 65 64 20 69 66 20 61 6c 74 68   enabled if alth
eba0: 74 74 70 64 20 69 73 20 63 6f 6d 70 69 6c 65 64  ttpd is compiled
ebb0: 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 2d   with.  ** the -
ebc0: 44 4c 4f 47 5f 48 45 41 44 45 52 3d 31 20 6f 70  DLOG_HEADER=1 op
ebd0: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  tion..  */.#ifde
ebe0: 66 20 4c 4f 47 5f 48 45 41 44 45 52 0a 20 20 69  f LOG_HEADER.  i
ebf0: 66 28 20 7a 4c 6f 67 46 69 6c 65 0a 20 20 20 26  f( zLogFile.   &
ec00: 26 20 73 74 72 73 74 72 28 7a 53 63 72 69 70 74  & strstr(zScript
ec10: 2c 22 46 75 6c 6c 48 65 61 64 65 72 4c 6f 67 22  ,"FullHeaderLog"
ec20: 29 21 3d 30 0a 20 20 20 26 26 20 73 74 72 6c 65  )!=0.   && strle
ec30: 6e 28 7a 4c 6f 67 46 69 6c 65 29 3c 73 69 7a 65  n(zLogFile)<size
ec40: 6f 66 28 7a 4c 69 6e 65 29 2d 35 30 0a 20 20 29  of(zLine)-50.  )
ec50: 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c  {.    sprintf(zL
ec60: 69 6e 65 2c 20 22 25 73 2d 68 64 72 22 2c 20 7a  ine, "%s-hdr", z
ec70: 4c 6f 67 46 69 6c 65 29 3b 0a 20 20 20 20 68 64  LogFile);.    hd
ec80: 72 4c 6f 67 20 3d 20 66 6f 70 65 6e 28 7a 4c 69  rLog = fopen(zLi
ec90: 6e 65 2c 20 22 77 62 22 29 3b 0a 20 20 7d 0a 23  ne, "wb");.  }.#
eca0: 65 6e 64 69 66 0a 0a 0a 20 20 2f 2a 20 47 65 74  endif...  /* Get
ecb0: 20 61 6c 6c 20 74 68 65 20 6f 70 74 69 6f 6e 61   all the optiona
ecc0: 6c 20 66 69 65 6c 64 73 20 74 68 61 74 20 66 6f  l fields that fo
ecd0: 6c 6c 6f 77 20 74 68 65 20 66 69 72 73 74 20 6c  llow the first l
ece0: 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 7a 43 6f 6f  ine..  */.  zCoo
ecf0: 6b 69 65 20 3d 20 30 3b 0a 20 20 7a 41 75 74 68  kie = 0;.  zAuth
ed00: 54 79 70 65 20 3d 20 30 3b 0a 20 20 7a 52 65 6d  Type = 0;.  zRem
ed10: 6f 74 65 55 73 65 72 20 3d 20 30 3b 0a 20 20 7a  oteUser = 0;.  z
ed20: 52 65 66 65 72 65 72 20 3d 20 30 3b 0a 20 20 7a  Referer = 0;.  z
ed30: 49 66 4e 6f 6e 65 4d 61 74 63 68 20 3d 20 30 3b  IfNoneMatch = 0;
ed40: 0a 20 20 7a 49 66 4d 6f 64 69 66 69 65 64 53 69  .  zIfModifiedSi
ed50: 6e 63 65 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  nce = 0;.  while
ed60: 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 73 69  ( fgets(zLine,si
ed70: 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 73 74 64 69  zeof(zLine),stdi
ed80: 6e 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  n) ){.    char *
ed90: 7a 46 69 65 6c 64 4e 61 6d 65 3b 0a 20 20 20 20  zFieldName;.    
eda0: 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 0a 23 69 66  char *zVal;..#if
edb0: 64 65 66 20 4c 4f 47 5f 48 45 41 44 45 52 0a 20  def LOG_HEADER. 
edc0: 20 20 20 69 66 28 20 68 64 72 4c 6f 67 20 29 20     if( hdrLog ) 
edd0: 66 70 72 69 6e 74 66 28 68 64 72 4c 6f 67 2c 20  fprintf(hdrLog, 
ede0: 22 25 73 22 2c 20 7a 4c 69 6e 65 29 3b 0a 23 65  "%s", zLine);.#e
edf0: 6e 64 69 66 0a 20 20 20 20 6e 49 6e 20 2b 3d 20  ndif.    nIn += 
ee00: 73 74 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20  strlen(zLine);. 
ee10: 20 20 20 7a 46 69 65 6c 64 4e 61 6d 65 20 3d 20     zFieldName = 
ee20: 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28  GetFirstElement(
ee30: 7a 4c 69 6e 65 2c 26 7a 56 61 6c 29 3b 0a 20 20  zLine,&zVal);.  
ee40: 20 20 69 66 28 20 7a 46 69 65 6c 64 4e 61 6d 65    if( zFieldName
ee50: 3d 3d 30 20 7c 7c 20 2a 7a 46 69 65 6c 64 4e 61  ==0 || *zFieldNa
ee60: 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  me==0 ) break;. 
ee70: 20 20 20 52 65 6d 6f 76 65 4e 65 77 6c 69 6e 65     RemoveNewline
ee80: 28 7a 56 61 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zVal);.    if( 
ee90: 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c  strcasecmp(zFiel
eea0: 64 4e 61 6d 65 2c 22 55 73 65 72 2d 41 67 65 6e  dName,"User-Agen
eeb0: 74 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t:")==0 ){.     
eec0: 20 7a 41 67 65 6e 74 20 3d 20 53 74 72 44 75 70   zAgent = StrDup
eed0: 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  (zVal);.    }els
eee0: 65 20 69 66 28 20 73 74 72 63 61 73 65 63 6d 70  e if( strcasecmp
eef0: 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 41 63 63  (zFieldName,"Acc
ef00: 65 70 74 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ept:")==0 ){.   
ef10: 20 20 20 7a 41 63 63 65 70 74 20 3d 20 53 74 72     zAccept = Str
ef20: 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d  Dup(zVal);.    }
ef30: 65 6c 73 65 20 69 66 28 20 73 74 72 63 61 73 65  else if( strcase
ef40: 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22  cmp(zFieldName,"
ef50: 41 63 63 65 70 74 2d 45 6e 63 6f 64 69 6e 67 3a  Accept-Encoding:
ef60: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  ")==0 ){.      z
ef70: 41 63 63 65 70 74 45 6e 63 6f 64 69 6e 67 20 3d  AcceptEncoding =
ef80: 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20   StrDup(zVal);. 
ef90: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
efa0: 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61  casecmp(zFieldNa
efb0: 6d 65 2c 22 43 6f 6e 74 65 6e 74 2d 6c 65 6e 67  me,"Content-leng
efc0: 74 68 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  th:")==0 ){.    
efd0: 20 20 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68    zContentLength
efe0: 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b   = StrDup(zVal);
eff0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
f000: 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64  trcasecmp(zField
f010: 4e 61 6d 65 2c 22 43 6f 6e 74 65 6e 74 2d 74 79  Name,"Content-ty
f020: 70 65 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  pe:")==0 ){.    
f030: 20 20 7a 43 6f 6e 74 65 6e 74 54 79 70 65 20 3d    zContentType =
f040: 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20   StrDup(zVal);. 
f050: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
f060: 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61  casecmp(zFieldNa
f070: 6d 65 2c 22 52 65 66 65 72 65 72 3a 22 29 3d 3d  me,"Referer:")==
f080: 30 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 66 65  0 ){.      zRefe
f090: 72 65 72 20 3d 20 53 74 72 44 75 70 28 7a 56 61  rer = StrDup(zVa
f0a0: 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  l);.      if( st
f0b0: 72 73 74 72 28 7a 56 61 6c 2c 20 22 64 65 76 69  rstr(zVal, "devi
f0c0: 64 73 2e 6e 65 74 2f 22 29 21 3d 30 20 29 7b 20  ds.net/")!=0 ){ 
f0d0: 7a 52 65 66 65 72 65 72 20 3d 20 22 64 65 76 69  zReferer = "devi
f0e0: 64 73 2e 6e 65 74 2e 73 6d 75 74 22 3b 0a 20 20  ds.net.smut";.  
f0f0: 20 20 20 20 20 20 46 6f 72 62 69 64 64 65 6e 28        Forbidden(
f100: 32 33 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 52 65  230); /* LOG: Re
f110: 66 65 72 72 65 72 20 69 73 20 64 65 76 69 64 73  ferrer is devids
f120: 2e 6e 65 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  .net */.      }.
f130: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
f140: 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e  rcasecmp(zFieldN
f150: 61 6d 65 2c 22 43 6f 6f 6b 69 65 3a 22 29 3d 3d  ame,"Cookie:")==
f160: 30 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6f 6b  0 ){.      zCook
f170: 69 65 20 3d 20 53 74 72 41 70 70 65 6e 64 28 7a  ie = StrAppend(z
f180: 43 6f 6f 6b 69 65 2c 22 3b 20 22 2c 7a 56 61 6c  Cookie,"; ",zVal
f190: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
f1a0: 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65   strcasecmp(zFie
f1b0: 6c 64 4e 61 6d 65 2c 22 43 6f 6e 6e 65 63 74 69  ldName,"Connecti
f1c0: 6f 6e 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  on:")==0 ){.    
f1d0: 20 20 69 66 28 20 73 74 72 63 61 73 65 63 6d 70    if( strcasecmp
f1e0: 28 7a 56 61 6c 2c 22 63 6c 6f 73 65 22 29 3d 3d  (zVal,"close")==
f1f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f  0 ){.        clo
f200: 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 31  seConnection = 1
f210: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
f220: 28 20 21 66 6f 72 63 65 43 6c 6f 73 65 20 26 26  ( !forceClose &&
f230: 20 73 74 72 63 61 73 65 63 6d 70 28 7a 56 61 6c   strcasecmp(zVal
f240: 2c 20 22 6b 65 65 70 2d 61 6c 69 76 65 22 29 3d  , "keep-alive")=
f250: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c  =0 ){.        cl
f260: 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20  oseConnection = 
f270: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
f280: 65 6c 73 65 20 69 66 28 20 73 74 72 63 61 73 65  else if( strcase
f290: 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22  cmp(zFieldName,"
f2a0: 48 6f 73 74 3a 22 29 3d 3d 30 20 29 7b 0a 20 20  Host:")==0 ){.  
f2b0: 20 20 20 20 69 6e 74 20 69 6e 53 71 75 61 72 65      int inSquare
f2c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72   = 0;.      char
f2d0: 20 63 3b 0a 20 20 20 20 20 20 69 66 28 20 73 61   c;.      if( sa
f2e0: 6e 69 74 69 7a 65 53 74 72 69 6e 67 28 7a 56 61  nitizeString(zVa
f2f0: 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 46 6f  l) ){.        Fo
f300: 72 62 69 64 64 65 6e 28 32 34 30 29 3b 20 20 2f  rbidden(240);  /
f310: 2a 20 4c 4f 47 3a 20 49 6c 6c 65 67 61 6c 20 63  * LOG: Illegal c
f320: 6f 6e 74 65 6e 74 20 69 6e 20 48 4f 53 54 3a 20  ontent in HOST: 
f330: 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 20  parameter */.   
f340: 20 20 20 7d 0a 20 20 20 20 20 20 7a 48 74 74 70     }.      zHttp
f350: 48 6f 73 74 20 3d 20 53 74 72 44 75 70 28 7a 56  Host = StrDup(zV
f360: 61 6c 29 3b 0a 20 20 20 20 20 20 7a 53 65 72 76  al);.      zServ
f370: 65 72 50 6f 72 74 20 3d 20 7a 53 65 72 76 65 72  erPort = zServer
f380: 4e 61 6d 65 20 3d 20 53 74 72 44 75 70 28 7a 48  Name = StrDup(zH
f390: 74 74 70 48 6f 73 74 29 3b 0a 20 20 20 20 20 20  ttpHost);.      
f3a0: 77 68 69 6c 65 28 20 7a 53 65 72 76 65 72 50 6f  while( zServerPo
f3b0: 72 74 20 26 26 20 28 63 20 3d 20 2a 7a 53 65 72  rt && (c = *zSer
f3c0: 76 65 72 50 6f 72 74 29 21 3d 30 0a 20 20 20 20  verPort)!=0.    
f3d0: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 63 21            && (c!
f3e0: 3d 27 3a 27 20 7c 7c 20 69 6e 53 71 75 61 72 65  =':' || inSquare
f3f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
f400: 20 63 3d 3d 27 5b 27 20 29 20 69 6e 53 71 75 61   c=='[' ) inSqua
f410: 72 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  re = 1;.        
f420: 69 66 28 20 63 3d 3d 27 5d 27 20 29 20 69 6e 53  if( c==']' ) inS
f430: 71 75 61 72 65 20 3d 20 30 3b 0a 20 20 20 20 20  quare = 0;.     
f440: 20 20 20 7a 53 65 72 76 65 72 50 6f 72 74 2b 2b     zServerPort++
f450: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f460: 69 66 28 20 7a 53 65 72 76 65 72 50 6f 72 74 20  if( zServerPort 
f470: 26 26 20 2a 7a 53 65 72 76 65 72 50 6f 72 74 20  && *zServerPort 
f480: 29 7b 0a 20 20 20 20 20 20 20 20 2a 7a 53 65 72  ){.        *zSer
f490: 76 65 72 50 6f 72 74 20 3d 20 30 3b 0a 20 20 20  verPort = 0;.   
f4a0: 20 20 20 20 20 7a 53 65 72 76 65 72 50 6f 72 74       zServerPort
f4b0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
f4c0: 20 20 69 66 28 20 7a 52 65 61 6c 50 6f 72 74 20    if( zRealPort 
f4d0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 65 72 76  ){.        zServ
f4e0: 65 72 50 6f 72 74 20 3d 20 53 74 72 44 75 70 28  erPort = StrDup(
f4f0: 7a 52 65 61 6c 50 6f 72 74 29 3b 0a 20 20 20 20  zRealPort);.    
f500: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
f510: 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69  ( strcasecmp(zFi
f520: 65 6c 64 4e 61 6d 65 2c 22 41 75 74 68 6f 72 69  eldName,"Authori
f530: 7a 61 74 69 6f 6e 3a 22 29 3d 3d 30 20 29 7b 0a  zation:")==0 ){.
f540: 20 20 20 20 20 20 7a 41 75 74 68 54 79 70 65 20        zAuthType 
f550: 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e  = GetFirstElemen
f560: 74 28 53 74 72 44 75 70 28 7a 56 61 6c 29 2c 20  t(StrDup(zVal), 
f570: 26 7a 41 75 74 68 41 72 67 29 3b 0a 20 20 20 20  &zAuthArg);.    
f580: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 61 73  }else if( strcas
f590: 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c  ecmp(zFieldName,
f5a0: 22 49 66 2d 4e 6f 6e 65 2d 4d 61 74 63 68 3a 22  "If-None-Match:"
f5b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 49  )==0 ){.      zI
f5c0: 66 4e 6f 6e 65 4d 61 74 63 68 20 3d 20 53 74 72  fNoneMatch = Str
f5d0: 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d  Dup(zVal);.    }
f5e0: 65 6c 73 65 20 69 66 28 20 73 74 72 63 61 73 65  else if( strcase
f5f0: 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22  cmp(zFieldName,"
f600: 49 66 2d 4d 6f 64 69 66 69 65 64 2d 53 69 6e 63  If-Modified-Sinc
f610: 65 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  e:")==0 ){.     
f620: 20 7a 49 66 4d 6f 64 69 66 69 65 64 53 69 6e 63   zIfModifiedSinc
f630: 65 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29  e = StrDup(zVal)
f640: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64  ;.    }.  }.#ifd
f650: 65 66 20 4c 4f 47 5f 48 45 41 44 45 52 0a 20 20  ef LOG_HEADER.  
f660: 69 66 28 20 68 64 72 4c 6f 67 20 29 20 66 63 6c  if( hdrLog ) fcl
f670: 6f 73 65 28 68 64 72 4c 6f 67 29 3b 0a 23 65 6e  ose(hdrLog);.#en
f680: 64 69 66 0a 0a 20 20 2f 2a 20 44 69 73 61 6c 6c  dif..  /* Disall
f690: 6f 77 20 72 65 71 75 65 73 74 73 20 66 72 6f 6d  ow requests from
f6a0: 20 63 65 72 74 61 69 6e 20 63 6c 69 65 6e 74 73   certain clients
f6b0: 20 2a 2f 0a 20 20 69 66 28 20 7a 41 67 65 6e 74   */.  if( zAgent
f6c0: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 73   ){.    if( strs
f6d0: 74 72 28 7a 41 67 65 6e 74 2c 20 22 57 69 6e 64  tr(zAgent, "Wind
f6e0: 6f 77 73 5f 39 22 29 21 3d 30 0a 20 20 20 20 20  ows_9")!=0.     
f6f0: 7c 7c 20 73 74 72 73 74 72 28 7a 41 67 65 6e 74  || strstr(zAgent
f700: 2c 20 22 44 6f 77 6e 6c 6f 61 64 5f 4d 61 73 74  , "Download_Mast
f710: 65 72 22 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20  er")!=0.     || 
f720: 73 74 72 73 74 72 28 7a 41 67 65 6e 74 2c 20 22  strstr(zAgent, "
f730: 45 7a 6f 6f 6d 73 2f 22 29 21 3d 30 0a 20 20 20  Ezooms/")!=0.   
f740: 20 20 7c 7c 20 73 74 72 73 74 72 28 7a 41 67 65    || strstr(zAge
f750: 6e 74 2c 20 22 48 54 54 72 61 63 6b 22 29 21 3d  nt, "HTTrack")!=
f760: 30 0a 20 20 20 20 20 7c 7c 20 73 74 72 73 74 72  0.     || strstr
f770: 28 7a 41 67 65 6e 74 2c 20 22 41 68 72 65 66 73  (zAgent, "Ahrefs
f780: 42 6f 74 22 29 21 3d 30 0a 20 20 20 20 29 7b 0a  Bot")!=0.    ){.
f790: 20 20 20 20 20 20 46 6f 72 62 69 64 64 65 6e 28        Forbidden(
f7a0: 32 35 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 44  250);  /* LOG: D
f7b0: 69 73 61 6c 6c 6f 77 65 64 20 75 73 65 72 20 61  isallowed user a
f7c0: 67 65 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  gent */.    }.  
f7d0: 7d 0a 23 69 66 20 30 0a 20 20 69 66 28 20 7a 52  }.#if 0.  if( zR
f7e0: 65 66 65 72 65 72 20 29 7b 0a 20 20 20 20 73 74  eferer ){.    st
f7f0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
f800: 2a 61 7a 44 69 73 61 6c 6c 6f 77 5b 5d 20 3d 20  *azDisallow[] = 
f810: 7b 0a 20 20 20 20 20 20 22 73 6b 69 64 72 6f 77  {.      "skidrow
f820: 63 72 61 63 6b 2e 63 6f 6d 22 2c 0a 20 20 20 20  crack.com",.    
f830: 20 20 22 68 6f 73 68 69 79 75 75 67 69 2e 74 69    "hoshiyuugi.ti
f840: 73 74 6f 72 79 2e 63 6f 6d 22 2c 0a 20 20 20 20  story.com",.    
f850: 20 20 22 73 6b 69 64 72 6f 77 67 61 6d 65 73 2e    "skidrowgames.
f860: 6e 65 74 22 2c 0a 20 20 20 20 7d 3b 0a 20 20 20  net",.    };.   
f870: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
f880: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a  i=0; i<sizeof(az
f890: 44 69 73 61 6c 6c 6f 77 29 2f 73 69 7a 65 6f 66  Disallow)/sizeof
f8a0: 28 61 7a 44 69 73 61 6c 6c 6f 77 5b 30 5d 29 3b  (azDisallow[0]);
f8b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
f8c0: 20 73 74 72 73 74 72 28 7a 52 65 66 65 72 65 72   strstr(zReferer
f8d0: 2c 20 61 7a 44 69 73 61 6c 6c 6f 77 5b 69 5d 29  , azDisallow[i])
f8e0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4e  !=0 ){.        N
f8f0: 6f 74 46 6f 75 6e 64 28 32 36 30 29 3b 20 20 2f  otFound(260);  /
f900: 2a 20 4c 4f 47 3a 20 44 69 73 61 6c 6c 6f 77 65  * LOG: Disallowe
f910: 64 20 72 65 66 65 72 72 65 72 20 2a 2f 0a 20 20  d referrer */.  
f920: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
f930: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b  #endif..  /* Mak
f940: 65 20 61 6e 20 65 78 74 72 61 20 65 66 66 6f 72  e an extra effor
f950: 74 20 74 6f 20 67 65 74 20 61 20 76 61 6c 69 64  t to get a valid
f960: 20 73 65 72 76 65 72 20 6e 61 6d 65 20 61 6e 64   server name and
f970: 20 70 6f 72 74 20 6e 75 6d 62 65 72 2e 0a 20 20   port number..  
f980: 2a 2a 20 4f 6e 6c 79 20 4e 65 74 73 63 61 70 65  ** Only Netscape
f990: 20 70 72 6f 76 69 64 65 73 20 74 68 69 73 20 69   provides this i
f9a0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20  nformation.  If 
f9b0: 74 68 65 20 62 72 6f 77 73 65 72 20 69 73 0a 20  the browser is. 
f9c0: 20 2a 2a 20 49 6e 74 65 72 6e 65 74 20 45 78 70   ** Internet Exp
f9d0: 6c 6f 72 65 72 2c 20 74 68 65 6e 20 77 65 20 68  lorer, then we h
f9e0: 61 76 65 20 74 6f 20 66 69 6e 64 20 6f 75 74 20  ave to find out 
f9f0: 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
fa00: 66 6f 72 0a 20 20 2a 2a 20 6f 75 72 73 65 6c 76  for.  ** ourselv
fa10: 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  es..  */.  if( z
fa20: 53 65 72 76 65 72 4e 61 6d 65 3d 3d 30 20 29 7b  ServerName==0 ){
fa30: 0a 20 20 20 20 7a 53 65 72 76 65 72 4e 61 6d 65  .    zServerName
fa40: 20 3d 20 53 61 66 65 4d 61 6c 6c 6f 63 28 20 31   = SafeMalloc( 1
fa50: 30 30 20 29 3b 0a 20 20 20 20 67 65 74 68 6f 73  00 );.    gethos
fa60: 74 6e 61 6d 65 28 7a 53 65 72 76 65 72 4e 61 6d  tname(zServerNam
fa70: 65 2c 31 30 30 29 3b 0a 20 20 7d 0a 20 20 69 66  e,100);.  }.  if
fa80: 28 20 7a 53 65 72 76 65 72 50 6f 72 74 3d 3d 30  ( zServerPort==0
fa90: 20 7c 7c 20 2a 7a 53 65 72 76 65 72 50 6f 72 74   || *zServerPort
faa0: 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53 65 72 76  ==0 ){.    zServ
fab0: 65 72 50 6f 72 74 20 3d 20 44 45 46 41 55 4c 54  erPort = DEFAULT
fac0: 5f 50 4f 52 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _PORT;.  }..  /*
fad0: 20 52 65 6d 6f 76 65 20 74 68 65 20 71 75 65 72   Remove the quer
fae0: 79 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 74 68  y string from th
faf0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 65 71  e end of the req
fb00: 75 65 73 74 65 64 20 66 69 6c 65 2e 0a 20 20 2a  uested file..  *
fb10: 2f 0a 20 20 66 6f 72 28 7a 3d 7a 53 63 72 69 70  /.  for(z=zScrip
fb20: 74 3b 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 3f 27  t; *z && *z!='?'
fb30: 3b 20 7a 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 2a  ; z++){}.  if( *
fb40: 7a 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 7a 51  z=='?' ){.    zQ
fb50: 75 65 72 79 53 75 66 66 69 78 20 3d 20 53 74 72  uerySuffix = Str
fb60: 44 75 70 28 7a 29 3b 0a 20 20 20 20 2a 7a 20 3d  Dup(z);.    *z =
fb70: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
fb80: 20 7a 51 75 65 72 79 53 75 66 66 69 78 20 3d 20   zQuerySuffix = 
fb90: 22 22 3b 0a 20 20 7d 0a 20 20 7a 51 75 65 72 79  "";.  }.  zQuery
fba0: 53 74 72 69 6e 67 20 3d 20 2a 7a 51 75 65 72 79  String = *zQuery
fbb0: 53 75 66 66 69 78 20 3f 20 26 7a 51 75 65 72 79  Suffix ? &zQuery
fbc0: 53 75 66 66 69 78 5b 31 5d 20 3a 20 7a 51 75 65  Suffix[1] : zQue
fbd0: 72 79 53 75 66 66 69 78 3b 0a 0a 20 20 2f 2a 20  rySuffix;..  /* 
fbe0: 43 72 65 61 74 65 20 61 20 66 69 6c 65 20 74 6f  Create a file to
fbf0: 20 68 6f 6c 64 20 74 68 65 20 50 4f 53 54 20 71   hold the POST q
fc00: 75 65 72 79 20 64 61 74 61 2c 20 69 66 20 61 6e  uery data, if an
fc10: 79 2e 20 20 57 65 20 68 61 76 65 20 74 6f 0a 20  y.  We have to. 
fc20: 20 2a 2a 20 64 6f 20 69 74 20 74 68 69 73 20 77   ** do it this w
fc30: 61 79 2e 20 20 57 65 20 63 61 6e 27 74 20 6a 75  ay.  We can't ju
fc40: 73 74 20 70 61 73 73 20 74 68 65 20 66 69 6c 65  st pass the file
fc50: 20 64 65 73 63 72 69 70 74 6f 72 20 64 6f 77 6e   descriptor down
fc60: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 63 68 69   to.  ** the chi
fc70: 6c 64 20 70 72 6f 63 65 73 73 20 62 65 63 61 75  ld process becau
fc80: 73 65 20 74 68 65 20 66 67 65 74 73 28 29 20 66  se the fgets() f
fc90: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 68 61 76 65  unction may have
fca0: 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 72 65   already.  ** re
fcb0: 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 50  ad part of the P
fcc0: 4f 53 54 20 64 61 74 61 20 69 6e 74 6f 20 69 74  OST data into it
fcd0: 73 20 69 6e 74 65 72 6e 61 6c 20 62 75 66 66 65  s internal buffe
fce0: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 4d  r..  */.  if( zM
fcf0: 65 74 68 6f 64 5b 30 5d 3d 3d 27 50 27 20 26 26  ethod[0]=='P' &&
fd00: 20 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 21   zContentLength!
fd10: 3d 30 20 29 7b 0a 20 20 20 20 73 69 7a 65 5f 74  =0 ){.    size_t
fd20: 20 6c 65 6e 20 3d 20 61 74 6f 69 28 7a 43 6f 6e   len = atoi(zCon
fd30: 74 65 6e 74 4c 65 6e 67 74 68 29 3b 0a 20 20 20  tentLength);.   
fd40: 20 46 49 4c 45 20 2a 6f 75 74 3b 0a 20 20 20 20   FILE *out;.    
fd50: 63 68 61 72 20 2a 7a 42 75 66 3b 0a 20 20 20 20  char *zBuf;.    
fd60: 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 69 66 28 20  int n;..    if( 
fd70: 6c 65 6e 3e 4d 41 58 5f 43 4f 4e 54 45 4e 54 5f  len>MAX_CONTENT_
fd80: 4c 45 4e 47 54 48 20 29 7b 0a 20 20 20 20 20 20  LENGTH ){.      
fd90: 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 35  StartResponse("5
fda0: 30 30 20 52 65 71 75 65 73 74 20 74 6f 6f 20 6c  00 Request too l
fdb0: 61 72 67 65 22 29 3b 0a 20 20 20 20 20 20 6e 4f  arge");.      nO
fdc0: 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20  ut += printf(.  
fdd0: 20 20 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74        "Content-t
fde0: 79 70 65 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c  ype: text/plain\
fdf0: 72 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 5c 72  r\n".        "\r
fe00: 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 54 6f 6f  \n".        "Too
fe10: 20 6d 75 63 68 20 50 4f 53 54 20 64 61 74 61 5c   much POST data\
fe20: 6e 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  n".      );.    
fe30: 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30    MakeLogEntry(0
fe40: 2c 20 32 37 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20  , 270); /* LOG: 
fe50: 52 65 71 75 65 73 74 20 74 6f 6f 20 6c 61 72 67  Request too larg
fe60: 65 20 2a 2f 0a 20 20 20 20 20 20 65 78 69 74 28  e */.      exit(
fe70: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 70  0);.    }.    sp
fe80: 72 69 6e 74 66 28 7a 54 6d 70 4e 61 6d 42 75 66  rintf(zTmpNamBuf
fe90: 2c 20 22 2f 74 6d 70 2f 2d 70 6f 73 74 2d 64 61  , "/tmp/-post-da
fea0: 74 61 2d 58 58 58 58 58 58 22 29 3b 0a 20 20 20  ta-XXXXXX");.   
feb0: 20 7a 54 6d 70 4e 61 6d 20 3d 20 7a 54 6d 70 4e   zTmpNam = zTmpN
fec0: 61 6d 42 75 66 3b 0a 20 20 20 20 69 66 28 20 6d  amBuf;.    if( m
fed0: 6b 73 74 65 6d 70 28 7a 54 6d 70 4e 61 6d 29 3c  kstemp(zTmpNam)<
fee0: 30 20 29 7b 0a 20 20 20 20 20 20 4d 61 6c 66 75  0 ){.      Malfu
fef0: 6e 63 74 69 6f 6e 28 32 38 30 2c 20 20 2f 2a 20  nction(280,  /* 
ff00: 4c 4f 47 3a 20 6d 6b 73 74 65 6d 70 28 29 20 66  LOG: mkstemp() f
ff10: 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  ailed */.       
ff20: 20 20 20 20 20 20 20 20 22 43 61 6e 6e 6f 74 20          "Cannot 
ff30: 63 72 65 61 74 65 20 61 20 74 65 6d 70 20 66 69  create a temp fi
ff40: 6c 65 20 69 6e 20 77 68 69 63 68 20 74 6f 20 73  le in which to s
ff50: 74 6f 72 65 20 50 4f 53 54 20 64 61 74 61 22 29  tore POST data")
ff60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 75 74 20  ;.    }.    out 
ff70: 3d 20 66 6f 70 65 6e 28 7a 54 6d 70 4e 61 6d 2c  = fopen(zTmpNam,
ff80: 22 77 62 22 29 3b 0a 20 20 20 20 69 66 28 20 6f  "wb");.    if( o
ff90: 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53  ut==0 ){.      S
ffa0: 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 35 30  tartResponse("50
ffb0: 30 20 43 61 6e 6e 6f 74 20 63 72 65 61 74 65 20  0 Cannot create 
ffc0: 2f 74 6d 70 20 66 69 6c 65 22 29 3b 0a 20 20 20  /tmp file");.   
ffd0: 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74     nOut += print
ffe0: 66 28 0a 20 20 20 20 20 20 20 20 22 43 6f 6e 74  f(.        "Cont
fff0: 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 70  ent-type: text/p
10000 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 20 20  lain\r\n".      
10010 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 20 20 20    "\r\n".       
10020 20 22 43 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e   "Could not open
10030 20 5c 22 25 73 5c 22 20 66 6f 72 20 77 72 69 74   \"%s\" for writ
10040 69 6e 67 5c 6e 22 2c 20 7a 54 6d 70 4e 61 6d 0a  ing\n", zTmpNam.
10050 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 4d        );.      M
10060 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 32  akeLogEntry(0, 2
10070 39 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 63 61 6e  90); /* LOG: can
10080 6e 6f 74 20 63 72 65 61 74 65 20 74 65 6d 70 20  not create temp 
10090 66 69 6c 65 20 66 6f 72 20 50 4f 53 54 20 2a 2f  file for POST */
100a0 0a 20 20 20 20 20 20 65 78 69 74 28 30 29 3b 0a  .      exit(0);.
100b0 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 20 3d      }.    zBuf =
100c0 20 53 61 66 65 4d 61 6c 6c 6f 63 28 20 6c 65 6e   SafeMalloc( len
100d0 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 75 73  +1 );.    if( us
100e0 65 54 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d  eTimeout ) alarm
100f0 28 31 35 20 2b 20 6c 65 6e 2f 32 30 30 30 29 3b  (15 + len/2000);
10100 0a 20 20 20 20 6e 20 3d 20 66 72 65 61 64 28 7a  .    n = fread(z
10110 42 75 66 2c 31 2c 6c 65 6e 2c 73 74 64 69 6e 29  Buf,1,len,stdin)
10120 3b 0a 20 20 20 20 6e 49 6e 20 2b 3d 20 6e 3b 0a  ;.    nIn += n;.
10130 20 20 20 20 66 77 72 69 74 65 28 7a 42 75 66 2c      fwrite(zBuf,
10140 31 2c 6e 2c 6f 75 74 29 3b 0a 20 20 20 20 66 72  1,n,out);.    fr
10150 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 66 63  ee(zBuf);.    fc
10160 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 7d 0a 0a  lose(out);.  }..
10170 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
10180 68 65 20 72 75 6e 6e 69 6e 67 20 74 69 6d 65 20  he running time 
10190 69 73 20 6e 6f 74 20 74 6f 6f 20 67 72 65 61 74  is not too great
101a0 20 2a 2f 0a 20 20 69 66 28 20 75 73 65 54 69 6d   */.  if( useTim
101b0 65 6f 75 74 20 29 20 61 6c 61 72 6d 28 31 30 29  eout ) alarm(10)
101c0 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  ;..  /* Convert 
101d0 61 6c 6c 20 75 6e 75 73 75 61 6c 20 63 68 61 72  all unusual char
101e0 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73 63  acters in the sc
101f0 72 69 70 74 20 6e 61 6d 65 20 69 6e 74 6f 20 22  ript name into "
10200 5f 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  _"..  **.  ** Th
10210 69 73 20 69 73 20 61 20 64 65 66 65 6e 73 65 20  is is a defense 
10220 61 67 61 69 6e 73 74 20 76 61 72 69 6f 75 73 20  against various 
10230 61 74 74 61 63 6b 73 2c 20 58 53 53 20 61 74 74  attacks, XSS att
10240 61 63 6b 73 20 69 6e 20 70 61 72 74 69 63 75 6c  acks in particul
10250 61 72 2e 0a 20 20 2a 2f 0a 20 20 73 61 6e 69 74  ar..  */.  sanit
10260 69 7a 65 53 74 72 69 6e 67 28 7a 53 63 72 69 70  izeString(zScrip
10270 74 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74  t);..  /* Do not
10280 20 61 6c 6c 6f 77 20 22 2f 2e 22 20 6f 72 20 22   allow "/." or "
10290 2f 2d 22 20 74 6f 20 74 6f 20 6f 63 63 75 72 20  /-" to to occur 
102a0 61 6e 79 77 68 65 72 65 20 69 6e 20 74 68 65 20  anywhere in the 
102b0 65 6e 74 69 74 79 20 6e 61 6d 65 2e 0a 20 20 2a  entity name..  *
102c0 2a 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20  * This prevents 
102d0 61 74 74 61 63 6b 73 20 69 6e 76 6f 6c 76 69 6e  attacks involvin
102e0 67 20 22 2e 2e 22 20 61 6e 64 20 61 6c 73 6f 20  g ".." and also 
102f0 61 6c 6c 6f 77 73 20 75 73 20 74 6f 20 63 72 65  allows us to cre
10300 61 74 65 0a 20 20 2a 2a 20 66 69 6c 65 73 20 61  ate.  ** files a
10310 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 77  nd directories w
10320 68 6f 73 65 20 6e 61 6d 65 73 20 62 65 67 69 6e  hose names begin
10330 20 77 69 74 68 20 22 2d 22 20 6f 72 20 22 2e 22   with "-" or "."
10340 20 77 68 69 63 68 20 61 72 65 0a 20 20 2a 2a 20   which are.  ** 
10350 69 6e 76 69 73 69 62 6c 65 20 74 6f 20 74 68 65  invisible to the
10360 20 77 65 62 73 65 72 76 65 72 2e 0a 20 20 2a 2a   webserver..  **
10370 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a  .  ** Exception:
10380 20 20 41 6c 6c 6f 77 20 74 68 65 20 22 2f 2e 77    Allow the "/.w
10390 65 6c 6c 2d 6b 6e 6f 77 6e 2f 22 20 70 72 65 66  ell-known/" pref
103a0 69 78 20 69 6e 20 61 63 63 6f 72 64 61 6e 63 65  ix in accordance
103b0 20 77 69 74 68 0a 20 20 2a 2a 20 52 46 43 2d 35   with.  ** RFC-5
103c0 37 38 35 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 7a  785.  */.  for(z
103d0 3d 7a 53 63 72 69 70 74 3b 20 2a 7a 3b 20 7a 2b  =zScript; *z; z+
103e0 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  +){.    if( *z==
103f0 27 2f 27 20 26 26 20 28 7a 5b 31 5d 3d 3d 27 2e  '/' && (z[1]=='.
10400 27 20 7c 7c 20 7a 5b 31 5d 3d 3d 27 2d 27 29 0a  ' || z[1]=='-').
10410 20 20 20 20 20 26 26 20 28 7a 3e 7a 53 63 72 69       && (z>zScri
10420 70 74 20 7c 7c 20 73 74 72 6e 63 6d 70 28 7a 2c  pt || strncmp(z,
10430 22 2f 2e 77 65 6c 6c 2d 6b 6e 6f 77 6e 2f 22 2c  "/.well-known/",
10440 31 33 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20  13)!=0).    ){. 
10450 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 33        NotFound(3
10460 30 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 50 61 74  00); /* LOG: Pat
10470 68 20 65 6c 65 6d 65 6e 74 20 62 65 67 69 6e 73  h element begins
10480 20 77 69 74 68 20 22 2e 22 20 6f 72 20 22 2d 22   with "." or "-"
10490 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   */.    }.  }.. 
104a0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
104b0 68 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20  hat the root of 
104c0 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 73  the filesystem s
104d0 68 6f 75 6c 64 20 62 65 2e 20 20 49 66 20 74 68  hould be.  If th
104e0 65 0a 20 20 2a 2a 20 48 54 54 50 5f 48 4f 53 54  e.  ** HTTP_HOST
104f0 20 70 61 72 61 6d 65 74 65 72 20 65 78 69 73 74   parameter exist
10500 73 20 28 73 74 6f 72 65 64 20 69 6e 20 7a 48 74  s (stored in zHt
10510 74 70 48 6f 73 74 29 20 74 68 65 6e 20 72 65 6d  tpHost) then rem
10520 6f 76 65 20 74 68 65 0a 20 20 2a 2a 20 70 6f 72  ove the.  ** por
10530 74 20 6e 75 6d 62 65 72 20 66 72 6f 6d 20 74 68  t number from th
10540 65 20 65 6e 64 20 28 69 66 20 61 6e 79 29 2c 20  e end (if any), 
10550 63 6f 6e 76 65 72 74 20 61 6c 6c 20 63 68 61 72  convert all char
10560 61 63 74 65 72 73 20 74 6f 20 6c 6f 77 65 72 0a  acters to lower.
10570 20 20 2a 2a 20 63 61 73 65 2c 20 61 6e 64 20 63    ** case, and c
10580 6f 6e 76 65 72 74 20 6e 6f 6e 2d 61 6c 70 68 61  onvert non-alpha
10590 6e 75 6d 62 65 72 20 63 68 61 72 61 63 74 65 72  number character
105a0 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 22 2e 22  s (including "."
105b0 29 20 74 6f 20 22 5f 22 2e 0a 20 20 2a 2a 20 54  ) to "_"..  ** T
105c0 68 65 6e 20 74 72 79 20 74 6f 20 66 69 6e 64 20  hen try to find 
105d0 61 20 64 69 72 65 63 74 6f 72 79 20 77 69 74 68  a directory with
105e0 20 74 68 61 74 20 6e 61 6d 65 20 61 6e 64 20 74   that name and t
105f0 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 2e 77 65  he extension .we
10600 62 73 69 74 65 2e 0a 20 20 2a 2a 20 49 66 20 6e  bsite..  ** If n
10610 6f 74 20 66 6f 75 6e 64 2c 20 6c 6f 6f 6b 20 66  ot found, look f
10620 6f 72 20 22 64 65 66 61 75 6c 74 2e 77 65 62 73  or "default.webs
10630 69 74 65 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ite"..  */.  if(
10640 20 7a 53 63 72 69 70 74 5b 30 5d 21 3d 27 2f 27   zScript[0]!='/'
10650 20 29 7b 0a 20 20 20 20 4e 6f 74 46 6f 75 6e 64   ){.    NotFound
10660 28 33 31 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 55  (310); /* LOG: U
10670 52 49 20 64 6f 65 73 20 6e 6f 74 20 73 74 61 72  RI does not star
10680 74 20 77 69 74 68 20 22 2f 22 20 2a 2f 0a 20 20  t with "/" */.  
10690 7d 0a 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a  }.  if( strlen(z
106a0 52 6f 6f 74 29 2b 34 30 20 3e 3d 20 73 69 7a 65  Root)+40 >= size
106b0 6f 66 28 7a 4c 69 6e 65 29 20 29 7b 0a 20 20 20  of(zLine) ){.   
106c0 20 4e 6f 74 46 6f 75 6e 64 28 33 32 30 29 3b 20   NotFound(320); 
106d0 2f 2a 20 4c 4f 47 3a 20 55 52 49 20 74 6f 6f 20  /* LOG: URI too 
106e0 6c 6f 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  long */.  }.  if
106f0 28 20 7a 48 74 74 70 48 6f 73 74 3d 3d 30 20 7c  ( zHttpHost==0 |
10700 7c 20 7a 48 74 74 70 48 6f 73 74 5b 30 5d 3d 3d  | zHttpHost[0]==
10710 30 20 29 7b 0a 20 20 20 20 4e 6f 74 46 6f 75 6e  0 ){.    NotFoun
10720 64 28 33 33 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a  d(330);  /* LOG:
10730 20 4d 69 73 73 69 6e 67 20 48 4f 53 54 3a 20 70   Missing HOST: p
10740 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 7d 65  arameter */.  }e
10750 6c 73 65 20 69 66 28 20 73 74 72 6c 65 6e 28 7a  lse if( strlen(z
10760 48 74 74 70 48 6f 73 74 29 2b 73 74 72 6c 65 6e  HttpHost)+strlen
10770 28 7a 52 6f 6f 74 29 2b 31 30 20 3e 3d 20 73 69  (zRoot)+10 >= si
10780 7a 65 6f 66 28 7a 4c 69 6e 65 29 20 29 7b 0a 20  zeof(zLine) ){. 
10790 20 20 20 4e 6f 74 46 6f 75 6e 64 28 33 34 30 29     NotFound(340)
107a0 3b 20 20 2f 2a 20 4c 4f 47 3a 20 48 4f 53 54 20  ;  /* LOG: HOST 
107b0 70 61 72 61 6d 65 74 65 72 20 74 6f 6f 20 6c 6f  parameter too lo
107c0 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  ng */.  }else{. 
107d0 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65     sprintf(zLine
107e0 2c 20 22 25 73 2f 25 73 22 2c 20 7a 52 6f 6f 74  , "%s/%s", zRoot
107f0 2c 20 7a 48 74 74 70 48 6f 73 74 29 3b 0a 20 20  , zHttpHost);.  
10800 20 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 7a    for(i=strlen(z
10810 52 6f 6f 74 29 2b 31 3b 20 7a 4c 69 6e 65 5b 69  Root)+1; zLine[i
10820 5d 20 26 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d 27  ] && zLine[i]!='
10830 3a 27 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  :'; i++){.      
10840 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 20  unsigned char c 
10850 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
10860 29 7a 4c 69 6e 65 5b 69 5d 3b 0a 20 20 20 20 20  )zLine[i];.     
10870 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 63 29   if( !isalnum(c)
10880 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e   ){.        zLin
10890 65 5b 69 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20  e[i] = '_';.    
108a0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 75 70    }else if( isup
108b0 70 65 72 28 63 29 20 29 7b 0a 20 20 20 20 20 20  per(c) ){.      
108c0 20 20 7a 4c 69 6e 65 5b 69 5d 20 3d 20 74 6f 6c    zLine[i] = tol
108d0 6f 77 65 72 28 63 29 3b 0a 20 20 20 20 20 20 7d  ower(c);.      }
108e0 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 72 63 70  .    }.    strcp
108f0 79 28 26 7a 4c 69 6e 65 5b 69 5d 2c 20 22 2e 77  y(&zLine[i], ".w
10900 65 62 73 69 74 65 22 29 3b 0a 20 20 7d 0a 20 20  ebsite");.  }.  
10910 69 66 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26  if( stat(zLine,&
10920 73 74 61 74 62 75 66 29 20 7c 7c 20 21 53 5f 49  statbuf) || !S_I
10930 53 44 49 52 28 73 74 61 74 62 75 66 2e 73 74 5f  SDIR(statbuf.st_
10940 6d 6f 64 65 29 20 29 7b 0a 20 20 20 20 73 70 72  mode) ){.    spr
10950 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 25 73 2f  intf(zLine, "%s/
10960 64 65 66 61 75 6c 74 2e 77 65 62 73 69 74 65 22  default.website"
10970 2c 20 7a 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66  , zRoot);.    if
10980 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74  ( stat(zLine,&st
10990 61 74 62 75 66 29 20 7c 7c 20 21 53 5f 49 53 44  atbuf) || !S_ISD
109a0 49 52 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f  IR(statbuf.st_mo
109b0 64 65 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  de) ){.      if(
109c0 20 73 74 61 6e 64 61 6c 6f 6e 65 20 29 7b 0a 20   standalone ){. 
109d0 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a         sprintf(z
109e0 4c 69 6e 65 2c 20 22 25 73 22 2c 20 7a 52 6f 6f  Line, "%s", zRoo
109f0 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
10a00 0a 20 20 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e  .        NotFoun
10a10 64 28 33 35 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a  d(350);  /* LOG:
10a20 20 2a 2e 77 65 62 73 69 74 65 20 70 65 72 6d 69   *.website permi
10a30 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20  ssions */.      
10a40 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 48  }.    }.  }.  zH
10a50 6f 6d 65 20 3d 20 53 74 72 44 75 70 28 7a 4c 69  ome = StrDup(zLi
10a60 6e 65 29 3b 0a 0a 20 20 2f 2a 20 43 68 61 6e 67  ne);..  /* Chang
10a70 65 20 64 69 72 65 63 74 6f 72 69 65 73 20 74 6f  e directories to
10a80 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
10a90 20 48 54 54 50 20 66 69 6c 65 73 79 73 74 65 6d   HTTP filesystem
10aa0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 64 69  .  */.  if( chdi
10ab0 72 28 7a 48 6f 6d 65 29 21 3d 30 20 29 7b 0a 20  r(zHome)!=0 ){. 
10ac0 20 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30     char zBuf[100
10ad0 30 5d 3b 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74  0];.    Malfunct
10ae0 69 6f 6e 28 33 36 30 2c 20 20 2f 2a 20 4c 4f 47  ion(360,  /* LOG
10af0 3a 20 63 68 64 69 72 28 29 20 66 61 69 6c 65 64  : chdir() failed
10b00 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 22 63 61   */.         "ca
10b10 6e 6e 6f 74 20 63 68 64 69 72 20 74 6f 20 5b 25  nnot chdir to [%
10b20 73 5d 20 66 72 6f 6d 20 5b 25 73 5d 22 2c 0a 20  s] from [%s]",. 
10b30 20 20 20 20 20 20 20 20 7a 48 6f 6d 65 2c 20 67          zHome, g
10b40 65 74 63 77 64 28 7a 42 75 66 2c 39 39 39 29 29  etcwd(zBuf,999))
10b50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
10b60 74 65 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74  te the file in t
10b70 68 65 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20  he filesystem.  
10b80 57 65 20 6d 69 67 68 74 20 68 61 76 65 20 74 6f  We might have to
10b90 20 61 70 70 65 6e 64 0a 20 20 2a 2a 20 74 68 65   append.  ** the
10ba0 20 6e 61 6d 65 20 22 69 6e 64 65 78 2e 68 74 6d   name "index.htm
10bb0 6c 22 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66  l" in order to f
10bc0 69 6e 64 20 69 74 2e 20 20 41 6e 79 20 65 78 63  ind it.  Any exc
10bd0 65 73 73 20 70 61 74 68 0a 20 20 2a 2a 20 69 6e  ess path.  ** in
10be0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 70 75 74  formation is put
10bf0 20 69 6e 74 6f 20 74 68 65 20 7a 50 61 74 68 49   into the zPathI
10c00 6e 66 6f 20 76 61 72 69 61 62 6c 65 2e 0a 20 20  nfo variable..  
10c10 2a 2f 0a 20 20 6a 20 3d 20 6a 30 20 3d 20 28 69  */.  j = j0 = (i
10c20 6e 74 29 73 74 72 6c 65 6e 28 7a 4c 69 6e 65 29  nt)strlen(zLine)
10c30 3b 0a 20 20 69 20 3d 20 30 3b 0a 20 20 77 68 69  ;.  i = 0;.  whi
10c40 6c 65 28 20 7a 53 63 72 69 70 74 5b 69 5d 20 29  le( zScript[i] )
10c50 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 53 63  {.    while( zSc
10c60 72 69 70 74 5b 69 5d 20 26 26 20 28 69 3d 3d 30  ript[i] && (i==0
10c70 20 7c 7c 20 7a 53 63 72 69 70 74 5b 69 5d 21 3d   || zScript[i]!=
10c80 27 2f 27 29 20 29 7b 0a 20 20 20 20 20 20 7a 4c  '/') ){.      zL
10c90 69 6e 65 5b 6a 5d 20 3d 20 7a 53 63 72 69 70 74  ine[j] = zScript
10ca0 5b 69 5d 3b 0a 20 20 20 20 20 20 69 2b 2b 3b 20  [i];.      i++; 
10cb0 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  j++;.    }.    z
10cc0 4c 69 6e 65 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20  Line[j] = 0;.   
10cd0 20 69 66 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c   if( stat(zLine,
10ce0 26 73 74 61 74 62 75 66 29 21 3d 30 20 29 7b 0a  &statbuf)!=0 ){.
10cf0 20 20 20 20 20 20 69 6e 74 20 73 74 69 6c 6c 53        int stillS
10d00 65 61 72 63 68 69 6e 67 20 3d 20 31 3b 0a 20 20  earching = 1;.  
10d10 20 20 20 20 77 68 69 6c 65 28 20 73 74 69 6c 6c      while( still
10d20 53 65 61 72 63 68 69 6e 67 20 26 26 20 69 3e 30  Searching && i>0
10d30 20 26 26 20 6a 3e 6a 30 20 29 7b 0a 20 20 20 20   && j>j0 ){.    
10d40 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 6a 30 20      while( j>j0 
10d50 26 26 20 7a 4c 69 6e 65 5b 6a 2d 31 5d 21 3d 27  && zLine[j-1]!='
10d60 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20  /' ){ j--; }.   
10d70 20 20 20 20 20 73 74 72 63 70 79 28 26 7a 4c 69       strcpy(&zLi
10d80 6e 65 5b 6a 2d 31 5d 2c 20 22 2f 6e 6f 74 2d 66  ne[j-1], "/not-f
10d90 6f 75 6e 64 2e 68 74 6d 6c 22 29 3b 0a 20 20 20  ound.html");.   
10da0 20 20 20 20 20 69 66 28 20 73 74 61 74 28 7a 4c       if( stat(zL
10db0 69 6e 65 2c 26 73 74 61 74 62 75 66 29 3d 3d 30  ine,&statbuf)==0
10dc0 20 26 26 20 53 5f 49 53 52 45 47 28 73 74 61 74   && S_ISREG(stat
10dd0 62 75 66 2e 73 74 5f 6d 6f 64 65 29 0a 20 20 20  buf.st_mode).   
10de0 20 20 20 20 20 20 20 20 20 26 26 20 61 63 63 65           && acce
10df0 73 73 28 7a 4c 69 6e 65 2c 52 5f 4f 4b 29 3d 3d  ss(zLine,R_OK)==
10e00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
10e10 52 65 61 6c 53 63 72 69 70 74 20 3d 20 53 74 72  RealScript = Str
10e20 44 75 70 28 26 7a 4c 69 6e 65 5b 6a 30 5d 29 3b  Dup(&zLine[j0]);
10e30 0a 20 20 20 20 20 20 20 20 20 20 52 65 64 69 72  .          Redir
10e40 65 63 74 28 7a 52 65 61 6c 53 63 72 69 70 74 2c  ect(zRealScript,
10e50 20 31 2c 20 33 37 30 29 3b 20 2f 2a 20 4c 4f 47   1, 370); /* LOG
10e60 3a 20 72 65 64 69 72 65 63 74 20 74 6f 20 6e 6f  : redirect to no
10e70 74 2d 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  t-found */.     
10e80 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
10e90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10ea0 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20        j--;.     
10eb0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
10ec0 20 20 20 69 66 28 20 73 74 69 6c 6c 53 65 61 72     if( stillSear
10ed0 63 68 69 6e 67 20 29 20 4e 6f 74 46 6f 75 6e 64  ching ) NotFound
10ee0 28 33 38 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 55  (380); /* LOG: U
10ef0 52 49 20 6e 6f 74 20 66 6f 75 6e 64 20 2a 2f 0a  RI not found */.
10f00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10f10 20 7d 0a 20 20 20 20 69 66 28 20 53 5f 49 53 52   }.    if( S_ISR
10f20 45 47 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f  EG(statbuf.st_mo
10f30 64 65 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  de) ){.      if(
10f40 20 61 63 63 65 73 73 28 7a 4c 69 6e 65 2c 52 5f   access(zLine,R_
10f50 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 4e  OK) ){.        N
10f60 6f 74 46 6f 75 6e 64 28 33 39 30 29 3b 20 20 2f  otFound(390);  /
10f70 2a 20 4c 4f 47 3a 20 46 69 6c 65 20 6e 6f 74 20  * LOG: File not 
10f80 72 65 61 64 61 62 6c 65 20 2a 2f 0a 20 20 20 20  readable */.    
10f90 20 20 7d 0a 20 20 20 20 20 20 7a 52 65 61 6c 53    }.      zRealS
10fa0 63 72 69 70 74 20 3d 20 53 74 72 44 75 70 28 26  cript = StrDup(&
10fb0 7a 4c 69 6e 65 5b 6a 30 5d 29 3b 0a 20 20 20 20  zLine[j0]);.    
10fc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
10fd0 20 20 20 69 66 28 20 7a 53 63 72 69 70 74 5b 69     if( zScript[i
10fe0 5d 3d 3d 30 20 7c 7c 20 7a 53 63 72 69 70 74 5b  ]==0 || zScript[
10ff0 69 2b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  i+1]==0 ){.     
11000 20 69 6e 74 20 6b 20 3d 20 6a 3e 30 20 26 26 20   int k = j>0 && 
11010 7a 4c 69 6e 65 5b 6a 2d 31 5d 3d 3d 27 2f 27 20  zLine[j-1]=='/' 
11020 3f 20 6a 2d 31 20 3a 20 6a 3b 0a 20 20 20 20 20  ? j-1 : j;.     
11030 20 73 74 72 63 70 79 28 26 7a 4c 69 6e 65 5b 6b   strcpy(&zLine[k
11040 5d 2c 22 2f 69 6e 64 65 78 2e 68 74 6d 6c 22 29  ],"/index.html")
11050 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 61 74  ;.      if( stat
11060 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75 66 29  (zLine,&statbuf)
11070 21 3d 30 20 7c 7c 20 21 53 5f 49 53 52 45 47 28  !=0 || !S_ISREG(
11080 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29  statbuf.st_mode)
11090 20 0a 20 20 20 20 20 20 7c 7c 20 61 63 63 65 73   .      || acces
110a0 73 28 7a 4c 69 6e 65 2c 52 5f 4f 4b 29 20 29 7b  s(zLine,R_OK) ){
110b0 0a 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28  .        strcpy(
110c0 26 7a 4c 69 6e 65 5b 6b 5d 2c 22 2f 69 6e 64 65  &zLine[k],"/inde
110d0 78 2e 63 67 69 22 29 3b 0a 20 20 20 20 20 20 20  x.cgi");.       
110e0 20 69 66 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c   if( stat(zLine,
110f0 26 73 74 61 74 62 75 66 29 21 3d 30 20 7c 7c 20  &statbuf)!=0 || 
11100 21 53 5f 49 53 52 45 47 28 73 74 61 74 62 75 66  !S_ISREG(statbuf
11110 2e 73 74 5f 6d 6f 64 65 29 20 0a 20 20 20 20 20  .st_mode) .     
11120 20 20 20 7c 7c 20 61 63 63 65 73 73 28 7a 4c 69     || access(zLi
11130 6e 65 2c 52 5f 4f 4b 29 20 29 7b 0a 20 20 20 20  ne,R_OK) ){.    
11140 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 34        NotFound(4
11150 30 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 55 52 49  00); /* LOG: URI
11160 20 69 73 20 61 20 64 69 72 65 63 74 6f 72 79 20   is a directory 
11170 77 2f 6f 20 69 6e 64 65 78 2e 68 74 6d 6c 20 2a  w/o index.html *
11180 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
11190 20 20 7d 0a 20 20 20 20 20 20 7a 52 65 61 6c 53    }.      zRealS
111a0 63 72 69 70 74 20 3d 20 53 74 72 44 75 70 28 26  cript = StrDup(&
111b0 7a 4c 69 6e 65 5b 6a 30 5d 29 3b 0a 20 20 20 20  zLine[j0]);.    
111c0 20 20 69 66 28 20 7a 53 63 72 69 70 74 5b 69 5d    if( zScript[i]
111d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
111e0 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  * If the request
111f0 65 64 20 55 52 4c 20 64 6f 65 73 20 6e 6f 74 20  ed URL does not 
11200 65 6e 64 20 77 69 74 68 20 22 2f 22 20 62 75 74  end with "/" but
11210 20 77 65 20 68 61 64 20 74 6f 0a 20 20 20 20 20   we had to.     
11220 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 22 69 6e     ** append "in
11230 64 65 78 2e 68 74 6d 6c 22 2c 20 74 68 65 6e 20  dex.html", then 
11240 61 20 72 65 64 69 72 65 63 74 20 69 73 20 6e 65  a redirect is ne
11250 63 65 73 73 61 72 79 2e 20 20 4f 74 68 65 72 77  cessary.  Otherw
11260 69 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  ise.        ** n
11270 6f 6e 65 20 6f 66 20 74 68 65 20 72 65 6c 61 74  one of the relat
11280 69 76 65 20 55 52 4c 73 20 69 6e 20 74 68 65 20  ive URLs in the 
11290 64 65 6c 69 76 65 72 65 64 20 64 6f 63 75 6d 65  delivered docume
112a0 6e 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  nt will be.     
112b0 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 2e 20 2a     ** correct. *
112c0 2f 0a 20 20 20 20 20 20 20 20 52 65 64 69 72 65  /.        Redire
112d0 63 74 28 7a 52 65 61 6c 53 63 72 69 70 74 2c 31  ct(zRealScript,1
112e0 2c 34 31 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 72  ,410); /* LOG: r
112f0 65 64 69 72 65 63 74 20 74 6f 20 61 64 64 20 74  edirect to add t
11300 72 61 69 6c 69 6e 67 20 2f 20 2a 2f 0a 20 20 20  railing / */.   
11310 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
11320 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
11330 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4c 69 6e  ;.    }.    zLin
11340 65 5b 6a 5d 20 3d 20 7a 53 63 72 69 70 74 5b 69  e[j] = zScript[i
11350 5d 3b 0a 20 20 20 20 69 2b 2b 3b 20 6a 2b 2b 3b  ];.    i++; j++;
11360 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 20 3d 20 53  .  }.  zFile = S
11370 74 72 44 75 70 28 7a 4c 69 6e 65 29 3b 0a 20 20  trDup(zLine);.  
11380 7a 50 61 74 68 49 6e 66 6f 20 3d 20 53 74 72 44  zPathInfo = StrD
11390 75 70 28 26 7a 53 63 72 69 70 74 5b 69 5d 29 3b  up(&zScript[i]);
113a0 0a 20 20 6c 65 6e 46 69 6c 65 20 3d 20 73 74 72  .  lenFile = str
113b0 6c 65 6e 28 7a 46 69 6c 65 29 3b 0a 20 20 7a 44  len(zFile);.  zD
113c0 69 72 20 3d 20 53 74 72 44 75 70 28 7a 46 69 6c  ir = StrDup(zFil
113d0 65 29 3b 0a 20 20 66 6f 72 28 69 3d 73 74 72 6c  e);.  for(i=strl
113e0 65 6e 28 7a 44 69 72 29 2d 31 3b 20 69 3e 30 20  en(zDir)-1; i>0 
113f0 26 26 20 7a 44 69 72 5b 69 5d 21 3d 27 2f 27 3b  && zDir[i]!='/';
11400 20 69 2d 2d 29 7b 7d 3b 0a 20 20 69 66 28 20 69   i--){};.  if( i
11410 3d 3d 30 20 29 7b 0a 20 20 20 20 20 73 74 72 63  ==0 ){.     strc
11420 70 79 28 7a 44 69 72 2c 22 2f 22 29 3b 0a 20 20  py(zDir,"/");.  
11430 7d 65 6c 73 65 7b 0a 20 20 20 20 20 7a 44 69 72  }else{.     zDir
11440 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  [i] = 0;.  }..  
11450 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
11460 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 61  if there is an a
11470 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 69 6c  uthorization fil
11480 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 2c  e.  If there is,
11490 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 69 74  .  ** process it
114a0 2e 0a 20 20 2a 2f 0a 20 20 73 70 72 69 6e 74 66  ..  */.  sprintf
114b0 28 7a 4c 69 6e 65 2c 20 22 25 73 2f 2d 61 75 74  (zLine, "%s/-aut
114c0 68 22 2c 20 7a 44 69 72 29 3b 0a 20 20 69 66 28  h", zDir);.  if(
114d0 20 61 63 63 65 73 73 28 7a 4c 69 6e 65 2c 52 5f   access(zLine,R_
114e0 4f 4b 29 3d 3d 30 20 26 26 20 21 43 68 65 63 6b  OK)==0 && !Check
114f0 42 61 73 69 63 41 75 74 68 6f 72 69 7a 61 74 69  BasicAuthorizati
11500 6f 6e 28 7a 4c 69 6e 65 29 20 29 20 72 65 74 75  on(zLine) ) retu
11510 72 6e 3b 0a 0a 20 20 2f 2a 20 54 61 6b 65 20 61  rn;..  /* Take a
11520 70 70 72 6f 70 72 69 61 74 65 20 61 63 74 69 6f  ppropriate actio
11530 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 73 74  n.  */.  if( (st
11540 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 20 26 20  atbuf.st_mode & 
11550 30 31 30 30 29 3d 3d 30 31 30 30 20 26 26 20 61  0100)==0100 && a
11560 63 63 65 73 73 28 7a 46 69 6c 65 2c 58 5f 4f 4b  ccess(zFile,X_OK
11570 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  )==0 ){.    char
11580 20 2a 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 3b   *zBaseFilename;
11590 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
115a0 6e 61 6d 65 20 77 69 74 68 6f 75 74 20 64 69 72  name without dir
115b0 65 63 74 6f 72 79 20 70 72 65 66 69 78 20 2a 2f  ectory prefix */
115c0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
115d0 41 62 6f 72 74 20 77 69 74 68 20 61 6e 20 65 72  Abort with an er
115e0 72 6f 72 20 69 66 20 74 68 65 20 43 47 49 20 73  ror if the CGI s
115f0 63 72 69 70 74 20 69 73 20 77 72 69 74 61 62 6c  cript is writabl
11600 65 20 62 79 20 61 6e 79 6f 6e 65 20 6f 74 68 65  e by anyone othe
11610 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 69 74  r.    ** than it
11620 73 20 6f 77 6e 65 72 2e 0a 20 20 20 20 2a 2f 0a  s owner..    */.
11630 20 20 20 20 69 66 28 20 73 74 61 74 62 75 66 2e      if( statbuf.
11640 73 74 5f 6d 6f 64 65 20 26 20 30 30 32 32 20 29  st_mode & 0022 )
11650 7b 0a 20 20 20 20 20 20 43 67 69 53 63 72 69 70  {.      CgiScrip
11660 74 57 72 69 74 61 62 6c 65 28 29 3b 0a 20 20 20  tWritable();.   
11670 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 69 74   }..    /* If it
11680 73 20 65 78 65 63 75 74 61 62 6c 65 2c 20 69 74  s executable, it
11690 20 6d 75 73 74 20 62 65 20 61 20 43 47 49 20 70   must be a CGI p
116a0 72 6f 67 72 61 6d 2e 20 20 53 74 61 72 74 20 62  rogram.  Start b
116b0 79 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67 69 6e  y.    ** changin
116c0 67 20 64 69 72 65 63 74 6f 72 69 65 73 20 74 6f  g directories to
116d0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 68   the directory h
116e0 6f 6c 64 69 6e 67 20 74 68 65 20 70 72 6f 67 72  olding the progr
116f0 61 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  am..    */.    i
11700 66 28 20 63 68 64 69 72 28 7a 44 69 72 29 20 29  f( chdir(zDir) )
11710 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 42 75  {.      char zBu
11720 66 5b 31 30 30 30 5d 3b 0a 20 20 20 20 20 20 4d  f[1000];.      M
11730 61 6c 66 75 6e 63 74 69 6f 6e 28 34 32 30 2c 20  alfunction(420, 
11740 2f 2a 20 4c 4f 47 3a 20 63 68 64 69 72 28 29 20  /* LOG: chdir() 
11750 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
11760 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 68 64       "cannot chd
11770 69 72 20 74 6f 20 5b 25 73 5d 20 66 72 6f 6d 20  ir to [%s] from 
11780 5b 25 73 5d 22 2c 20 0a 20 20 20 20 20 20 20 20  [%s]", .        
11790 20 20 20 7a 44 69 72 2c 20 67 65 74 63 77 64 28     zDir, getcwd(
117a0 7a 42 75 66 2c 39 39 39 29 29 3b 0a 20 20 20 20  zBuf,999));.    
117b0 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  }..    /* Comput
117c0 65 20 74 68 65 20 62 61 73 65 20 66 69 6c 65 6e  e the base filen
117d0 61 6d 65 20 6f 66 20 74 68 65 20 43 47 49 20 73  ame of the CGI s
117e0 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 66 6f 72  cript */.    for
117f0 28 69 3d 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29  (i=strlen(zFile)
11800 2d 31 3b 20 69 3e 3d 30 20 26 26 20 7a 46 69 6c  -1; i>=0 && zFil
11810 65 5b 69 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b  e[i]!='/'; i--){
11820 7d 0a 20 20 20 20 7a 42 61 73 65 46 69 6c 65 6e  }.    zBaseFilen
11830 61 6d 65 20 3d 20 26 7a 46 69 6c 65 5b 69 2b 31  ame = &zFile[i+1
11840 5d 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 75 70  ];..    /* Setup
11850 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74   the environment
11860 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 0a   appropriately..
11870 20 20 20 20 2a 2f 0a 20 20 20 20 70 75 74 65 6e      */.    puten
11880 76 28 22 47 41 54 45 57 41 59 5f 49 4e 54 45 52  v("GATEWAY_INTER
11890 46 41 43 45 3d 43 47 49 2f 31 2e 30 22 29 3b 0a  FACE=CGI/1.0");.
118a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28      for(i=0; i<(
118b0 69 6e 74 29 28 73 69 7a 65 6f 66 28 63 67 69 65  int)(sizeof(cgie
118c0 6e 76 29 2f 73 69 7a 65 6f 66 28 63 67 69 65 6e  nv)/sizeof(cgien
118d0 76 5b 30 5d 29 29 3b 20 69 2b 2b 29 7b 0a 20 20  v[0])); i++){.  
118e0 20 20 20 20 69 66 28 20 2a 63 67 69 65 6e 76 5b      if( *cgienv[
118f0 69 5d 2e 70 7a 45 6e 76 56 61 6c 75 65 20 29 7b  i].pzEnvValue ){
11900 0a 20 20 20 20 20 20 20 20 53 65 74 45 6e 76 28  .        SetEnv(
11910 63 67 69 65 6e 76 5b 69 5d 2e 7a 45 6e 76 4e 61  cgienv[i].zEnvNa
11920 6d 65 2c 2a 63 67 69 65 6e 76 5b 69 5d 2e 70 7a  me,*cgienv[i].pz
11930 45 6e 76 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  EnvValue);.     
11940 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
11950 20 75 73 65 48 74 74 70 73 20 29 7b 0a 20 20 20   useHttps ){.   
11960 20 20 20 70 75 74 65 6e 76 28 22 48 54 54 50 53     putenv("HTTPS
11970 3d 6f 6e 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  =on");.    }..  
11980 20 20 2f 2a 20 46 6f 72 20 74 68 65 20 50 4f 53    /* For the POS
11990 54 20 6d 65 74 68 6f 64 20 61 6c 6c 20 69 6e 70  T method all inp
119a0 75 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  ut has been writ
119b0 74 65 6e 20 74 6f 20 61 20 74 65 6d 70 6f 72 61  ten to a tempora
119c0 72 79 20 66 69 6c 65 2c 0a 20 20 20 20 2a 2a 20  ry file,.    ** 
119d0 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 72 65  so we have to re
119e0 64 69 72 65 63 74 20 69 6e 70 75 74 20 74 6f 20  direct input to 
119f0 74 68 65 20 43 47 49 20 73 63 72 69 70 74 20 66  the CGI script f
11a00 72 6f 6d 20 74 68 61 74 20 66 69 6c 65 2e 0a 20  rom that file.. 
11a10 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 4d     */.    if( zM
11a20 65 74 68 6f 64 5b 30 5d 3d 3d 27 50 27 20 29 7b  ethod[0]=='P' ){
11a30 0a 20 20 20 20 20 20 69 66 28 20 64 75 70 28 30  .      if( dup(0
11a40 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4d  )<0 ){.        M
11a50 61 6c 66 75 6e 63 74 69 6f 6e 28 34 33 30 2c 20  alfunction(430, 
11a60 20 2f 2a 20 4c 4f 47 3a 20 64 75 70 28 30 29 20   /* LOG: dup(0) 
11a70 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
11a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55                "U
11a90 6e 61 62 6c 65 20 74 6f 20 64 75 70 6c 69 63 61  nable to duplica
11aa0 74 69 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  tion file descri
11ab0 70 74 6f 72 20 30 22 29 3b 0a 20 20 20 20 20 20  ptor 0");.      
11ac0 7d 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 30 29  }.      close(0)
11ad0 3b 0a 20 20 20 20 20 20 6f 70 65 6e 28 7a 54 6d  ;.      open(zTm
11ae0 70 4e 61 6d 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b  pNam, O_RDONLY);
11af0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
11b00 73 74 72 6e 63 6d 70 28 7a 42 61 73 65 46 69 6c  strncmp(zBaseFil
11b10 65 6e 61 6d 65 2c 22 6e 70 68 2d 22 2c 34 29 3d  ename,"nph-",4)=
11b20 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
11b30 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  f the name of th
11b40 65 20 43 47 49 20 73 63 72 69 70 74 20 62 65 67  e CGI script beg
11b50 69 6e 73 20 77 69 74 68 20 22 6e 70 68 2d 22 20  ins with "nph-" 
11b60 74 68 65 6e 20 77 65 20 61 72 65 0a 20 20 20 20  then we are.    
11b70 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74    ** dealing wit
11b80 68 20 61 20 22 6e 6f 6e 2d 70 61 72 73 65 64 20  h a "non-parsed 
11b90 68 65 61 64 65 72 73 22 20 43 47 49 20 73 63 72  headers" CGI scr
11ba0 69 70 74 2e 20 20 4a 75 73 74 20 65 78 65 63 28  ipt.  Just exec(
11bb0 29 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 64 69  ).      ** it di
11bc0 72 65 63 74 6c 79 20 61 6e 64 20 6c 65 74 20 69  rectly and let i
11bd0 74 20 68 61 6e 64 6c 65 20 61 6c 6c 20 69 74 73  t handle all its
11be0 20 6f 77 6e 20 68 65 61 64 65 72 20 67 65 6e 65   own header gene
11bf0 72 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  ration..      */
11c00 0a 20 20 20 20 20 20 65 78 65 63 6c 28 7a 42 61  .      execl(zBa
11c10 73 65 46 69 6c 65 6e 61 6d 65 2c 7a 42 61 73 65  seFilename,zBase
11c20 46 69 6c 65 6e 61 6d 65 2c 28 63 68 61 72 2a 29  Filename,(char*)
11c30 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4e 4f 54  0);.      /* NOT
11c40 45 3a 20 4e 6f 20 6c 6f 67 20 65 6e 74 72 79 20  E: No log entry 
11c50 77 72 69 74 74 65 6e 20 66 6f 72 20 6e 70 68 2d  written for nph-
11c60 20 73 63 72 69 70 74 73 20 2a 2f 0a 20 20 20 20   scripts */.    
11c70 20 20 65 78 69 74 28 30 29 3b 0a 20 20 20 20 7d    exit(0);.    }
11c80 0a 0a 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68  ..    /* Fall th
11c90 72 75 20 74 6f 20 68 65 72 65 20 6f 6e 6c 79 20  ru to here only 
11ca0 69 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  if this process 
11cb0 28 74 68 65 20 73 65 72 76 65 72 29 20 69 73 20  (the server) is 
11cc0 67 6f 69 6e 67 0a 20 20 20 20 2a 2a 20 74 6f 20  going.    ** to 
11cd0 72 65 61 64 20 61 6e 64 20 61 75 67 6d 65 6e 74  read and augment
11ce0 20 74 68 65 20 68 65 61 64 65 72 20 73 65 6e 74   the header sent
11cf0 20 62 61 63 6b 20 62 79 20 74 68 65 20 43 47 49   back by the CGI
11d00 20 70 72 6f 63 65 73 73 2e 0a 20 20 20 20 2a 2a   process..    **
11d10 20 4f 70 65 6e 20 61 20 70 69 70 65 20 74 6f 20   Open a pipe to 
11d20 72 65 63 65 69 76 65 20 74 68 65 20 6f 75 74 70  receive the outp
11d30 75 74 20 66 72 6f 6d 20 74 68 65 20 43 47 49 20  ut from the CGI 
11d40 70 72 6f 63 65 73 73 2e 20 20 54 68 65 6e 0a 20  process.  Then. 
11d50 20 20 20 2a 2a 20 66 6f 72 6b 20 74 68 65 20 43     ** fork the C
11d60 47 49 20 70 72 6f 63 65 73 73 2e 20 20 4f 6e 63  GI process.  Onc
11d70 65 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  e everything is 
11d80 64 6f 6e 65 2c 20 77 65 20 73 68 6f 75 6c 64 20  done, we should 
11d90 62 65 0a 20 20 20 20 2a 2a 20 61 62 6c 65 20 74  be.    ** able t
11da0 6f 20 72 65 61 64 20 74 68 65 20 6f 75 74 70 75  o read the outpu
11db0 74 20 6f 66 20 43 47 49 20 6f 6e 20 74 68 65 20  t of CGI on the 
11dc0 22 69 6e 22 20 73 74 72 65 61 6d 2e 0a 20 20 20  "in" stream..   
11dd0 20 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20   */.    {.      
11de0 69 6e 74 20 70 78 5b 32 5d 3b 0a 20 20 20 20 20  int px[2];.     
11df0 20 69 66 28 20 70 69 70 65 28 70 78 29 20 29 7b   if( pipe(px) ){
11e00 0a 20 20 20 20 20 20 20 20 4d 61 6c 66 75 6e 63  .        Malfunc
11e10 74 69 6f 6e 28 34 34 30 2c 20 2f 2a 20 4c 4f 47  tion(440, /* LOG
11e20 3a 20 70 69 70 65 28 29 20 66 61 69 6c 65 64 20  : pipe() failed 
11e30 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
11e40 20 20 20 20 20 20 20 22 55 6e 61 62 6c 65 20 74         "Unable t
11e50 6f 20 63 72 65 61 74 65 20 61 20 70 69 70 65 20  o create a pipe 
11e60 66 6f 72 20 74 68 65 20 43 47 49 20 70 72 6f 67  for the CGI prog
11e70 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ram");.      }. 
11e80 20 20 20 20 20 69 66 28 20 66 6f 72 6b 28 29 3d       if( fork()=
11e90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c  =0 ){.        cl
11ea0 6f 73 65 28 70 78 5b 30 5d 29 3b 0a 20 20 20 20  ose(px[0]);.    
11eb0 20 20 20 20 63 6c 6f 73 65 28 31 29 3b 0a 20 20      close(1);.  
11ec0 20 20 20 20 20 20 69 66 28 20 64 75 70 28 70 78        if( dup(px
11ed0 5b 31 5d 29 21 3d 31 20 29 7b 0a 20 20 20 20 20  [1])!=1 ){.     
11ee0 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e       Malfunction
11ef0 28 34 35 30 2c 20 2f 2a 20 4c 4f 47 3a 20 64 75  (450, /* LOG: du
11f00 70 28 31 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20  p(1) failed */. 
11f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f20 22 55 6e 61 62 6c 65 20 74 6f 20 64 75 70 6c 69  "Unable to dupli
11f30 63 61 74 65 20 66 69 6c 65 20 64 65 73 63 72 69  cate file descri
11f40 70 74 6f 72 20 25 64 20 74 6f 20 31 22 2c 0a 20  ptor %d to 1",. 
11f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f60 70 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  px[1]);.        
11f70 7d 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28  }.        close(
11f80 70 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  px[1]);.        
11f90 66 6f 72 28 69 3d 33 3b 20 63 6c 6f 73 65 28 69  for(i=3; close(i
11fa0 29 3d 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  )==0; i++){}.   
11fb0 20 20 20 20 20 65 78 65 63 6c 28 7a 42 61 73 65       execl(zBase
11fc0 46 69 6c 65 6e 61 6d 65 2c 20 7a 42 61 73 65 46  Filename, zBaseF
11fd0 69 6c 65 6e 61 6d 65 2c 20 28 63 68 61 72 2a 29  ilename, (char*)
11fe0 30 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74  0);.        exit
11ff0 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (0);.      }.   
12000 20 20 20 63 6c 6f 73 65 28 70 78 5b 31 5d 29 3b     close(px[1]);
12010 0a 20 20 20 20 20 20 69 6e 20 3d 20 66 64 6f 70  .      in = fdop
12020 65 6e 28 70 78 5b 30 5d 2c 20 22 72 62 22 29 3b  en(px[0], "rb");
12030 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
12040 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 43 67  n==0 ){.      Cg
12050 69 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 65  iError();.    }e
12060 6c 73 65 7b 0a 20 20 20 20 20 20 43 67 69 48 61  lse{.      CgiHa
12070 6e 64 6c 65 52 65 70 6c 79 28 69 6e 29 3b 0a 20  ndleReply(in);. 
12080 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
12090 20 6c 65 6e 46 69 6c 65 3e 35 20 26 26 20 73 74   lenFile>5 && st
120a0 72 63 6d 70 28 26 7a 46 69 6c 65 5b 6c 65 6e 46  rcmp(&zFile[lenF
120b0 69 6c 65 2d 35 5d 2c 22 2e 73 63 67 69 22 29 3d  ile-5],".scgi")=
120c0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 79  =0 ){.    /* Any
120d0 20 66 69 6c 65 20 74 68 61 74 20 65 6e 64 73 20   file that ends 
120e0 77 69 74 68 20 22 2e 73 63 67 69 22 20 69 73 20  with ".scgi" is 
120f0 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 74 65  assumed to be te
12100 78 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  xt of the.    **
12110 20 66 6f 72 6d 3a 0a 20 20 20 20 2a 2a 20 20 20   form:.    **   
12120 20 20 53 43 47 49 20 68 6f 73 74 6e 61 6d 65 20    SCGI hostname 
12130 70 6f 72 74 0a 20 20 20 20 2a 2a 20 4f 70 65 6e  port.    ** Open
12140 20 61 20 54 43 50 2f 49 50 20 63 6f 6e 6e 65 63   a TCP/IP connec
12150 74 69 6f 6e 20 74 6f 20 74 68 61 74 20 68 6f 73  tion to that hos
12160 74 20 61 6e 64 20 73 65 6e 64 20 69 74 20 61 6e  t and send it an
12170 20 53 43 47 49 20 72 65 71 75 65 73 74 0a 20 20   SCGI request.  
12180 20 20 2a 2f 0a 20 20 20 20 53 65 6e 64 53 63 67    */.    SendScg
12190 69 52 65 71 75 65 73 74 28 7a 46 69 6c 65 2c 20  iRequest(zFile, 
121a0 7a 53 63 72 69 70 74 29 3b 0a 20 20 7d 65 6c 73  zScript);.  }els
121b0 65 20 69 66 28 20 63 6f 75 6e 74 53 6c 61 73 68  e if( countSlash
121c0 65 73 28 7a 52 65 61 6c 53 63 72 69 70 74 29 21  es(zRealScript)!
121d0 3d 63 6f 75 6e 74 53 6c 61 73 68 65 73 28 7a 53  =countSlashes(zS
121e0 63 72 69 70 74 29 20 29 7b 0a 20 20 20 20 2f 2a  cript) ){.    /*
121f0 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 20   If the request 
12200 55 52 49 20 66 6f 72 20 73 74 61 74 69 63 20 63  URI for static c
12210 6f 6e 74 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20  ontent contains 
12220 6d 61 74 65 72 69 61 6c 20 70 61 73 74 20 74 68  material past th
12230 65 0a 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 20  e.    ** actual 
12240 63 6f 6e 74 65 6e 74 20 66 69 6c 65 20 6e 61 6d  content file nam
12250 65 2c 20 72 65 70 6f 72 74 20 74 68 61 74 20 61  e, report that a
12260 73 20 61 20 34 30 34 20 65 72 72 6f 72 2e 20 2a  s a 404 error. *
12270 2f 0a 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 34  /.    NotFound(4
12280 36 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 45 78 63  60); /* LOG: Exc
12290 65 73 73 20 55 52 49 20 63 6f 6e 74 65 6e 74 20  ess URI content 
122a0 70 61 73 74 20 73 74 61 74 69 63 20 66 69 6c 65  past static file
122b0 20 6e 61 6d 65 20 2a 2f 0a 20 20 7d 65 6c 73 65   name */.  }else
122c0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69  {.    /* If it i
122d0 73 6e 27 74 20 65 78 65 63 75 74 61 62 6c 65 20  sn't executable 
122e0 74 68 65 6e 20 69 74 0a 20 20 20 20 2a 2a 20 6d  then it.    ** m
122f0 75 73 74 20 61 20 73 69 6d 70 6c 65 20 66 69 6c  ust a simple fil
12300 65 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  e that needs to 
12310 62 65 20 63 6f 70 69 65 64 20 74 6f 20 6f 75 74  be copied to out
12320 70 75 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  put..    */.    
12330 69 66 28 20 53 65 6e 64 46 69 6c 65 28 7a 46 69  if( SendFile(zFi
12340 6c 65 2c 20 6c 65 6e 46 69 6c 65 2c 20 26 73 74  le, lenFile, &st
12350 61 74 62 75 66 29 20 29 20 72 65 74 75 72 6e 3b  atbuf) ) return;
12360 0a 20 20 7d 0a 20 20 66 66 6c 75 73 68 28 73 74  .  }.  fflush(st
12370 64 6f 75 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67  dout);.  MakeLog
12380 45 6e 74 72 79 28 30 2c 20 30 29 3b 20 20 2f 2a  Entry(0, 0);  /*
12390 20 4c 4f 47 3a 20 4e 6f 72 6d 61 6c 20 72 65 70   LOG: Normal rep
123a0 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  ly */..  /* The 
123b0 6e 65 78 74 20 72 65 71 75 65 73 74 20 6d 75 73  next request mus
123c0 74 20 61 72 72 69 76 65 20 77 69 74 68 69 6e 20  t arrive within 
123d0 33 30 20 73 65 63 6f 6e 64 73 20 6f 72 20 77 65  30 seconds or we
123e0 20 63 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65   close the conne
123f0 63 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6f 6d 69  ction.  */.  omi
12400 74 4c 6f 67 20 3d 20 31 3b 0a 20 20 69 66 28 20  tLog = 1;.  if( 
12410 75 73 65 54 69 6d 65 6f 75 74 20 29 20 61 6c 61  useTimeout ) ala
12420 72 6d 28 33 30 29 3b 0a 7d 0a 0a 23 64 65 66 69  rm(30);.}..#defi
12430 6e 65 20 4d 41 58 5f 50 41 52 41 4c 4c 45 4c 20  ne MAX_PARALLEL 
12440 35 30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  50  /* Number of
12450 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 63 68   simultaneous ch
12460 69 6c 64 72 65 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ildren */../*.**
12470 20 41 6c 6c 20 70 6f 73 73 69 62 6c 65 20 66 6f   All possible fo
12480 72 6d 73 20 6f 66 20 61 6e 20 49 50 20 61 64 64  rms of an IP add
12490 72 65 73 73 2e 20 20 4e 65 65 64 65 64 20 74 6f  ress.  Needed to
124a0 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 47 43 43   work around GCC
124b0 20 73 74 72 69 63 74 0a 2a 2a 20 61 6c 69 61 73   strict.** alias
124c0 69 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a 74 79  ing rules..*/.ty
124d0 70 65 64 65 66 20 75 6e 69 6f 6e 20 7b 0a 20 20  pedef union {.  
124e0 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 20  struct sockaddr 
124f0 73 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sa;             
12500 20 2f 2a 20 41 62 73 74 72 61 63 74 20 73 75 70   /* Abstract sup
12510 65 72 63 6c 61 73 73 20 2a 2f 0a 20 20 73 74 72  erclass */.  str
12520 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 20  uct sockaddr_in 
12530 73 61 34 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  sa4;          /*
12540 20 49 50 76 34 20 2a 2f 0a 20 20 73 74 72 75 63   IPv4 */.  struc
12550 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 36 20 73  t sockaddr_in6 s
12560 61 36 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  a6;         /* I
12570 50 76 36 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  Pv6 */.  struct 
12580 73 6f 63 6b 61 64 64 72 5f 73 74 6f 72 61 67 65  sockaddr_storage
12590 20 73 61 73 3b 20 20 20 20 20 2f 2a 20 53 68 6f   sas;     /* Sho
125a0 75 6c 64 20 62 65 20 74 68 65 20 6d 61 78 69 6d  uld be the maxim
125b0 75 6d 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20  um of the above 
125c0 33 20 2a 2f 0a 7d 20 61 64 64 72 65 73 73 3b 0a  3 */.} address;.
125d0 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
125e0 20 61 6e 20 48 54 54 50 20 73 65 72 76 65 72 20   an HTTP server 
125f0 64 61 65 6d 6f 6e 20 6c 69 73 74 65 6e 69 6e 67  daemon listening
12600 20 6f 6e 20 70 6f 72 74 20 69 50 6f 72 74 2e 0a   on port iPort..
12610 2a 2a 0a 2a 2a 20 41 73 20 6e 65 77 20 63 6f 6e  **.** As new con
12620 6e 65 63 74 69 6f 6e 73 20 61 72 72 69 76 65 2c  nections arrive,
12630 20 66 6f 72 6b 20 61 20 63 68 69 6c 64 20 61 6e   fork a child an
12640 64 20 6c 65 74 20 63 68 69 6c 64 20 72 65 74 75  d let child retu
12650 72 6e 0a 2a 2a 20 6f 75 74 20 6f 66 20 74 68 69  rn.** out of thi
12660 73 20 70 72 6f 63 65 64 75 72 65 20 63 61 6c 6c  s procedure call
12670 2e 20 20 54 68 65 20 63 68 69 6c 64 20 77 69 6c  .  The child wil
12680 6c 20 68 61 6e 64 6c 65 20 74 68 65 20 72 65 71  l handle the req
12690 75 65 73 74 2e 0a 2a 2a 20 54 68 65 20 70 61 72  uest..** The par
126a0 65 6e 74 20 6e 65 76 65 72 20 72 65 74 75 72 6e  ent never return
126b0 73 20 66 72 6f 6d 20 74 68 69 73 20 70 72 6f 63  s from this proc
126c0 65 64 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  edure..**.** Ret
126d0 75 72 6e 20 30 20 74 6f 20 65 61 63 68 20 63 68  urn 0 to each ch
126e0 69 6c 64 20 61 73 20 69 74 20 72 75 6e 73 2e 20  ild as it runs. 
126f0 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 65 73   If unable to es
12700 74 61 62 6c 69 73 68 20 61 0a 2a 2a 20 6c 69 73  tablish a.** lis
12710 74 65 6e 69 6e 67 20 73 6f 63 6b 65 74 2c 20 72  tening socket, r
12720 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  eturn non-zero..
12730 2a 2f 0a 69 6e 74 20 68 74 74 70 5f 73 65 72 76  */.int http_serv
12740 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  er(const char *z
12750 50 6f 72 74 2c 20 69 6e 74 20 6c 6f 63 61 6c 4f  Port, int localO
12760 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 6c 69 73 74  nly){.  int list
12770 65 6e 65 72 5b 32 30 5d 3b 20 20 20 20 20 20 20  ener[20];       
12780 20 20 20 20 20 2f 2a 20 54 68 65 20 73 65 72 76       /* The serv
12790 65 72 20 73 6f 63 6b 65 74 73 20 2a 2f 0a 20 20  er sockets */.  
127a0 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 3b 20  int connection; 
127b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
127c0 41 20 73 6f 63 6b 65 74 20 66 6f 72 20 65 61 63  A socket for eac
127d0 68 20 69 6e 64 69 76 69 64 75 61 6c 20 63 6f 6e  h individual con
127e0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 66 64 5f  nection */.  fd_
127f0 73 65 74 20 72 65 61 64 66 64 73 3b 20 20 20 20  set readfds;    
12800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
12810 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69 70   of file descrip
12820 74 6f 72 73 20 66 6f 72 20 73 65 6c 65 63 74 28  tors for select(
12830 29 20 2a 2f 0a 20 20 61 64 64 72 65 73 73 20 69  ) */.  address i
12840 6e 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20  naddr;          
12850 20 20 20 20 2f 2a 20 52 65 6d 6f 74 65 20 61 64      /* Remote ad
12860 64 72 65 73 73 20 2a 2f 0a 20 20 73 6f 63 6b 6c  dress */.  sockl
12870 65 6e 5f 74 20 6c 65 6e 61 64 64 72 3b 20 20 20  en_t lenaddr;   
12880 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
12890 68 20 6f 66 20 74 68 65 20 69 6e 61 64 64 72 20  h of the inaddr 
128a0 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
128b0 6e 74 20 63 68 69 6c 64 3b 20 20 20 20 20 20 20  nt child;       
128c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
128d0 49 44 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  ID of the child 
128e0 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 69 6e 74  process */.  int
128f0 20 6e 63 68 69 6c 64 72 65 6e 20 3d 20 30 3b 20   nchildren = 0; 
12900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
12910 62 65 72 20 6f 66 20 63 68 69 6c 64 20 70 72 6f  ber of child pro
12920 63 65 73 73 65 73 20 2a 2f 0a 20 20 73 74 72 75  cesses */.  stru
12930 63 74 20 74 69 6d 65 76 61 6c 20 64 65 6c 61 79  ct timeval delay
12940 3b 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20  ;        /* How 
12950 6c 6f 6e 67 20 74 6f 20 77 61 69 74 20 69 6e 73  long to wait ins
12960 69 64 65 20 73 65 6c 65 63 74 28 29 20 2a 2f 0a  ide select() */.
12970 20 20 69 6e 74 20 6f 70 74 20 3d 20 31 3b 20 20    int opt = 1;  
12980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12990 2a 20 73 65 74 73 6f 63 6b 6f 70 74 20 66 6c 61  * setsockopt fla
129a0 67 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61 64  g */.  struct ad
129b0 64 72 69 6e 66 6f 20 73 48 69 6e 74 73 3b 20 20  drinfo sHints;  
129c0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 68      /* Address h
129d0 69 6e 74 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  ints */.  struct
129e0 20 61 64 64 72 69 6e 66 6f 20 2a 70 41 64 64 72   addrinfo *pAddr
129f0 73 2c 20 2a 70 3b 20 2f 2a 20 2a 2f 0a 20 20 69  s, *p; /* */.  i
12a00 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
12a10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
12a20 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
12a30 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 6e 74 20  int i, n;.  int 
12a40 6d 61 78 46 64 20 3d 20 2d 31 3b 0a 20 20 0a 20  maxFd = -1;.  . 
12a50 20 6d 65 6d 73 65 74 28 26 73 48 69 6e 74 73 2c   memset(&sHints,
12a60 20 30 2c 20 73 69 7a 65 6f 66 28 73 48 69 6e 74   0, sizeof(sHint
12a70 73 29 29 3b 0a 20 20 69 66 28 20 69 70 76 34 4f  s));.  if( ipv4O
12a80 6e 6c 79 20 29 7b 0a 20 20 20 20 73 48 69 6e 74  nly ){.    sHint
12a90 73 2e 61 69 5f 66 61 6d 69 6c 79 20 3d 20 50 46  s.ai_family = PF
12aa0 5f 49 4e 45 54 3b 0a 20 20 20 20 2f 2a 70 72 69  _INET;.    /*pri
12ab0 6e 74 66 28 22 69 70 76 34 20 6f 6e 6c 79 5c 6e  ntf("ipv4 only\n
12ac0 22 29 3b 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66  ");*/.  }else if
12ad0 28 20 69 70 76 36 4f 6e 6c 79 20 29 7b 0a 20 20  ( ipv6Only ){.  
12ae0 20 20 73 48 69 6e 74 73 2e 61 69 5f 66 61 6d 69    sHints.ai_fami
12af0 6c 79 20 3d 20 50 46 5f 49 4e 45 54 36 3b 0a 20  ly = PF_INET6;. 
12b00 20 20 20 2f 2a 70 72 69 6e 74 66 28 22 69 70 76     /*printf("ipv
12b10 36 20 6f 6e 6c 79 5c 6e 22 29 3b 2a 2f 0a 20 20  6 only\n");*/.  
12b20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 48 69 6e 74  }else{.    sHint
12b30 73 2e 61 69 5f 66 61 6d 69 6c 79 20 3d 20 50 46  s.ai_family = PF
12b40 5f 55 4e 53 50 45 43 3b 0a 20 20 7d 0a 20 20 73  _UNSPEC;.  }.  s
12b50 48 69 6e 74 73 2e 61 69 5f 73 6f 63 6b 74 79 70  Hints.ai_socktyp
12b60 65 20 3d 20 53 4f 43 4b 5f 53 54 52 45 41 4d 3b  e = SOCK_STREAM;
12b70 0a 20 20 73 48 69 6e 74 73 2e 61 69 5f 66 6c 61  .  sHints.ai_fla
12b80 67 73 20 3d 20 41 49 5f 50 41 53 53 49 56 45 3b  gs = AI_PASSIVE;
12b90 0a 20 20 73 48 69 6e 74 73 2e 61 69 5f 70 72 6f  .  sHints.ai_pro
12ba0 74 6f 63 6f 6c 20 3d 20 30 3b 0a 20 20 72 63 20  tocol = 0;.  rc 
12bb0 3d 20 67 65 74 61 64 64 72 69 6e 66 6f 28 6c 6f  = getaddrinfo(lo
12bc0 63 61 6c 4f 6e 6c 79 20 3f 20 22 6c 6f 63 61 6c  calOnly ? "local
12bd0 68 6f 73 74 22 3a 20 30 2c 20 7a 50 6f 72 74 2c  host": 0, zPort,
12be0 20 26 73 48 69 6e 74 73 2c 20 26 70 41 64 64 72   &sHints, &pAddr
12bf0 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  s);.  if( rc ){.
12c00 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
12c10 72 72 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 67  rr, "could not g
12c20 65 74 20 61 64 64 72 20 69 6e 66 6f 3a 20 25 73  et addr info: %s
12c30 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
12c40 72 63 21 3d 45 41 49 5f 53 59 53 54 45 4d 20 3f  rc!=EAI_SYSTEM ?
12c50 20 67 61 69 5f 73 74 72 65 72 72 6f 72 28 72 63   gai_strerror(rc
12c60 29 20 3a 20 73 74 72 65 72 72 6f 72 28 65 72 72  ) : strerror(err
12c70 6e 6f 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  no));.    return
12c80 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6e 3d   1;.  }.  for(n=
12c90 30 2c 20 70 3d 70 41 64 64 72 73 3b 20 6e 3c 28  0, p=pAddrs; n<(
12ca0 69 6e 74 29 28 73 69 7a 65 6f 66 28 6c 69 73 74  int)(sizeof(list
12cb0 65 6e 65 72 29 2f 73 69 7a 65 6f 66 28 6c 69 73  ener)/sizeof(lis
12cc0 74 65 6e 65 72 5b 30 5d 29 29 20 26 26 20 70 21  tener[0])) && p!
12cd0 3d 30 3b 0a 20 20 20 20 20 20 20 20 70 3d 70 2d  =0;.        p=p-
12ce0 3e 61 69 5f 6e 65 78 74 29 7b 0a 20 20 20 20 6c  >ai_next){.    l
12cf0 69 73 74 65 6e 65 72 5b 6e 5d 20 3d 20 73 6f 63  istener[n] = soc
12d00 6b 65 74 28 70 2d 3e 61 69 5f 66 61 6d 69 6c 79  ket(p->ai_family
12d10 2c 20 70 2d 3e 61 69 5f 73 6f 63 6b 74 79 70 65  , p->ai_socktype
12d20 2c 20 70 2d 3e 61 69 5f 70 72 6f 74 6f 63 6f 6c  , p->ai_protocol
12d30 29 3b 0a 20 20 20 20 69 66 28 20 6c 69 73 74 65  );.    if( liste
12d40 6e 65 72 5b 6e 5d 3e 3d 30 20 29 7b 0a 20 20 20  ner[n]>=0 ){.   
12d50 20 20 20 2f 2a 20 69 66 20 77 65 20 63 61 6e 27     /* if we can'
12d60 74 20 74 65 72 6d 69 6e 61 74 65 20 6e 69 63 65  t terminate nice
12d70 6c 79 2c 20 61 74 20 6c 65 61 73 74 20 61 6c 6c  ly, at least all
12d80 6f 77 20 74 68 65 20 73 6f 63 6b 65 74 20 74 6f  ow the socket to
12d90 20 62 65 20 72 65 75 73 65 64 20 2a 2f 0a 20 20   be reused */.  
12da0 20 20 20 20 73 65 74 73 6f 63 6b 6f 70 74 28 6c      setsockopt(l
12db0 69 73 74 65 6e 65 72 5b 6e 5d 2c 20 53 4f 4c 5f  istener[n], SOL_
12dc0 53 4f 43 4b 45 54 2c 20 53 4f 5f 52 45 55 53 45  SOCKET, SO_REUSE
12dd0 41 44 44 52 2c 26 6f 70 74 2c 20 73 69 7a 65 6f  ADDR,&opt, sizeo
12de0 66 28 6f 70 74 29 29 3b 0a 20 20 20 20 20 20 0a  f(opt));.      .
12df0 23 69 66 20 64 65 66 69 6e 65 64 28 49 50 56 36  #if defined(IPV6
12e00 5f 56 36 4f 4e 4c 59 29 0a 20 20 20 20 20 20 69  _V6ONLY).      i
12e10 66 28 20 70 2d 3e 61 69 5f 66 61 6d 69 6c 79 3d  f( p->ai_family=
12e20 3d 41 46 5f 49 4e 45 54 36 20 29 7b 0a 20 20 20  =AF_INET6 ){.   
12e30 20 20 20 20 20 69 6e 74 20 76 36 6f 6e 6c 79 20       int v6only 
12e40 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 65 74  = 1;.        set
12e50 73 6f 63 6b 6f 70 74 28 6c 69 73 74 65 6e 65 72  sockopt(listener
12e60 5b 6e 5d 2c 20 49 50 50 52 4f 54 4f 5f 49 50 56  [n], IPPROTO_IPV
12e70 36 2c 20 49 50 56 36 5f 56 36 4f 4e 4c 59 2c 0a  6, IPV6_V6ONLY,.
12e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e90 20 20 20 20 26 76 36 6f 6e 6c 79 2c 20 73 69 7a      &v6only, siz
12ea0 65 6f 66 28 76 36 6f 6e 6c 79 29 29 3b 0a 20 20  eof(v6only));.  
12eb0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
12ec0 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 62 69     .      if( bi
12ed0 6e 64 28 6c 69 73 74 65 6e 65 72 5b 6e 5d 2c 20  nd(listener[n], 
12ee0 70 2d 3e 61 69 5f 61 64 64 72 2c 20 70 2d 3e 61  p->ai_addr, p->a
12ef0 69 5f 61 64 64 72 6c 65 6e 29 3c 30 20 29 7b 0a  i_addrlen)<0 ){.
12f00 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
12f10 62 69 6e 64 20 66 61 69 6c 65 64 3a 20 25 73 5c  bind failed: %s\
12f20 6e 22 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72  n", strerror(err
12f30 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 63 6c  no));.        cl
12f40 6f 73 65 28 6c 69 73 74 65 6e 65 72 5b 6e 5d 29  ose(listener[n])
12f50 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
12f60 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
12f70 20 20 69 66 28 20 6c 69 73 74 65 6e 28 6c 69 73    if( listen(lis
12f80 74 65 6e 65 72 5b 6e 5d 2c 20 32 30 29 3c 30 20  tener[n], 20)<0 
12f90 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74  ){.        print
12fa0 66 28 22 6c 69 73 74 65 6e 28 29 20 66 61 69 6c  f("listen() fail
12fb0 65 64 3a 20 25 73 5c 6e 22 2c 20 73 74 72 65 72  ed: %s\n", strer
12fc0 72 6f 72 28 65 72 72 6e 6f 29 29 3b 0a 20 20 20  ror(errno));.   
12fd0 20 20 20 20 20 63 6c 6f 73 65 28 6c 69 73 74 65       close(liste
12fe0 6e 65 72 5b 6e 5d 29 3b 0a 20 20 20 20 20 20 20  ner[n]);.       
12ff0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
13000 20 7d 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20   }.      n++;.  
13010 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d    }.  }.  if( n=
13020 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
13030 66 28 73 74 64 65 72 72 2c 20 22 63 61 6e 6e 6f  f(stderr, "canno
13040 74 20 6f 70 65 6e 20 61 6e 79 20 73 6f 63 6b 65  t open any socke
13050 74 73 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75  ts\n");.    retu
13060 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  rn 1;.  }..  whi
13070 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 66 28  le( 1 ){.    if(
13080 20 6e 63 68 69 6c 64 72 65 6e 3e 4d 41 58 5f 50   nchildren>MAX_P
13090 41 52 41 4c 4c 45 4c 20 29 7b 0a 20 20 20 20 20  ARALLEL ){.     
130a0 20 2f 2a 20 53 6c 6f 77 20 64 6f 77 6e 20 69 66   /* Slow down if
130b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
130c0 20 61 72 72 69 76 69 6e 67 20 74 6f 6f 20 66 61   arriving too fa
130d0 73 74 20 2a 2f 0a 20 20 20 20 20 20 73 6c 65 65  st */.      slee
130e0 70 28 20 6e 63 68 69 6c 64 72 65 6e 2d 4d 41 58  p( nchildren-MAX
130f0 5f 50 41 52 41 4c 4c 45 4c 20 29 3b 0a 20 20 20  _PARALLEL );.   
13100 20 7d 0a 20 20 20 20 64 65 6c 61 79 2e 74 76 5f   }.    delay.tv_
13110 73 65 63 20 3d 20 36 30 3b 0a 20 20 20 20 64 65  sec = 60;.    de
13120 6c 61 79 2e 74 76 5f 75 73 65 63 20 3d 20 30 3b  lay.tv_usec = 0;
13130 0a 20 20 20 20 46 44 5f 5a 45 52 4f 28 26 72 65  .    FD_ZERO(&re
13140 61 64 66 64 73 29 3b 0a 20 20 20 20 66 6f 72 28  adfds);.    for(
13150 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
13160 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 69        assert( li
13170 73 74 65 6e 65 72 5b 69 5d 3e 3d 30 20 29 3b 0a  stener[i]>=0 );.
13180 20 20 20 20 20 20 46 44 5f 53 45 54 28 20 6c 69        FD_SET( li
13190 73 74 65 6e 65 72 5b 69 5d 2c 20 26 72 65 61 64  stener[i], &read
131a0 66 64 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  fds);.      if( 
131b0 6c 69 73 74 65 6e 65 72 5b 69 5d 3e 6d 61 78 46  listener[i]>maxF
131c0 64 20 29 20 6d 61 78 46 64 20 3d 20 6c 69 73 74  d ) maxFd = list
131d0 65 6e 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  ener[i];.    }. 
131e0 20 20 20 73 65 6c 65 63 74 28 20 6d 61 78 46 64     select( maxFd
131f0 2b 31 2c 20 26 72 65 61 64 66 64 73 2c 20 30 2c  +1, &readfds, 0,
13200 20 30 2c 20 26 64 65 6c 61 79 29 3b 0a 20 20 20   0, &delay);.   
13210 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
13220 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 46  ++){.      if( F
13230 44 5f 49 53 53 45 54 28 6c 69 73 74 65 6e 65 72  D_ISSET(listener
13240 5b 69 5d 2c 20 26 72 65 61 64 66 64 73 29 20 29  [i], &readfds) )
13250 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 61 64 64  {.        lenadd
13260 72 20 3d 20 73 69 7a 65 6f 66 28 69 6e 61 64 64  r = sizeof(inadd
13270 72 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 6e  r);.        conn
13280 65 63 74 69 6f 6e 20 3d 20 61 63 63 65 70 74 28  ection = accept(
13290 6c 69 73 74 65 6e 65 72 5b 69 5d 2c 20 26 69 6e  listener[i], &in
132a0 61 64 64 72 2e 73 61 2c 20 26 6c 65 6e 61 64 64  addr.sa, &lenadd
132b0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
132c0 63 6f 6e 6e 65 63 74 69 6f 6e 3e 3d 30 20 29 7b  connection>=0 ){
132d0 0a 20 20 20 20 20 20 20 20 20 20 63 68 69 6c 64  .          child
132e0 20 3d 20 66 6f 72 6b 28 29 3b 0a 20 20 20 20 20   = fork();.     
132f0 20 20 20 20 20 69 66 28 20 63 68 69 6c 64 21 3d       if( child!=
13300 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
13310 20 69 66 28 20 63 68 69 6c 64 3e 30 20 29 20 6e   if( child>0 ) n
13320 63 68 69 6c 64 72 65 6e 2b 2b 3b 0a 20 20 20 20  children++;.    
13330 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 63 6f          close(co
13340 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  nnection);.     
13350 20 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 66         /* printf
13360 28 22 73 75 62 70 72 6f 63 65 73 73 20 25 64 20  ("subprocess %d 
13370 73 74 61 72 74 65 64 2e 2e 2e 5c 6e 22 2c 20 63  started...\n", c
13380 68 69 6c 64 29 3b 20 66 66 6c 75 73 68 28 73 74  hild); fflush(st
13390 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 20 20 20 20  dout); */.      
133a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
133b0 20 20 20 20 20 20 20 69 6e 74 20 6e 45 72 72 20         int nErr 
133c0 3d 20 30 2c 20 66 64 3b 0a 20 20 20 20 20 20 20  = 0, fd;.       
133d0 20 20 20 20 20 63 6c 6f 73 65 28 30 29 3b 0a 20       close(0);. 
133e0 20 20 20 20 20 20 20 20 20 20 20 66 64 20 3d 20             fd = 
133f0 64 75 70 28 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b  dup(connection);
13400 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
13410 20 66 64 21 3d 30 20 29 20 6e 45 72 72 2b 2b 3b   fd!=0 ) nErr++;
13420 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f  .            clo
13430 73 65 28 31 29 3b 0a 20 20 20 20 20 20 20 20 20  se(1);.         
13440 20 20 20 66 64 20 3d 20 64 75 70 28 63 6f 6e 6e     fd = dup(conn
13450 65 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20  ection);.       
13460 20 20 20 20 20 69 66 28 20 66 64 21 3d 31 20 29       if( fd!=1 )
13470 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20   nErr++;.       
13480 20 20 20 20 20 63 6c 6f 73 65 28 63 6f 6e 6e 65       close(conne
13490 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20  ction);.        
134a0 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b      return nErr;
134b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
134c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
134d0 20 20 20 20 20 2f 2a 20 42 75 72 79 20 64 65 61       /* Bury dea
134e0 64 20 63 68 69 6c 64 72 65 6e 20 2a 2f 0a 20 20  d children */.  
134f0 20 20 20 20 77 68 69 6c 65 28 20 28 63 68 69 6c      while( (chil
13500 64 20 3d 20 77 61 69 74 70 69 64 28 30 2c 20 30  d = waitpid(0, 0
13510 2c 20 57 4e 4f 48 41 4e 47 29 29 3e 30 20 29 7b  , WNOHANG))>0 ){
13520 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 72 69 6e  .        /* prin
13530 74 66 28 22 70 72 6f 63 65 73 73 20 25 64 20 65  tf("process %d e
13540 6e 64 73 5c 6e 22 2c 20 63 68 69 6c 64 29 3b 20  nds\n", child); 
13550 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 20  fflush(stdout); 
13560 2a 2f 0a 20 20 20 20 20 20 20 20 6e 63 68 69 6c  */.        nchil
13570 64 72 65 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a  dren--;.      }.
13580 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4e      }.  }.  /* N
13590 4f 54 20 52 45 41 43 48 45 44 20 2a 2f 20 20 0a  OT REACHED */  .
135a0 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 0a 69    exit(1);.}...i
135b0 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63  nt main(int argc
135c0 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a  , char **argv){.
135d0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
135e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
135f0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
13600 20 63 68 61 72 20 2a 7a 50 65 72 6d 55 73 65 72   char *zPermUser
13610 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 52 75   = 0;      /* Ru
13620 6e 20 64 61 65 6d 6f 6e 20 77 69 74 68 20 74 68  n daemon with th
13630 69 73 20 75 73 65 72 27 73 20 70 65 72 6d 69 73  is user's permis
13640 73 69 6f 6e 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  sions */.  const
13650 20 63 68 61 72 20 2a 7a 50 6f 72 74 20 3d 20 30   char *zPort = 0
13660 3b 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e  ;    /* Implemen
13670 74 20 61 6e 20 48 54 54 50 20 73 65 72 76 65 72  t an HTTP server
13680 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 69 6e   process */.  in
13690 74 20 75 73 65 43 68 72 6f 6f 74 4a 61 69 6c 20  t useChrootJail 
136a0 3d 20 31 3b 20 20 20 20 2f 2a 20 54 72 75 65 20  = 1;    /* True 
136b0 74 6f 20 75 73 65 20 61 20 63 68 61 6e 67 65 2d  to use a change-
136c0 72 6f 6f 74 20 6a 61 69 6c 20 2a 2f 0a 20 20 73  root jail */.  s
136d0 74 72 75 63 74 20 70 61 73 73 77 64 20 2a 70 77  truct passwd *pw
136e0 64 20 3d 20 30 3b 20 20 20 2f 2a 20 49 6e 66 6f  d = 0;   /* Info
136f0 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
13700 65 20 75 73 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20  e user */..  /* 
13710 52 65 63 6f 72 64 20 74 68 65 20 74 69 6d 65 20  Record the time 
13720 77 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  when processing 
13730 62 65 67 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 67  begins..  */.  g
13740 65 74 74 69 6d 65 6f 66 64 61 79 28 26 62 65 67  ettimeofday(&beg
13750 69 6e 54 69 6d 65 2c 20 30 29 3b 0a 0a 20 20 2f  inTime, 0);..  /
13760 2a 20 50 61 72 73 65 20 63 6f 6d 6d 61 6e 64 2d  * Parse command-
13770 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 73 0a 20  line arguments. 
13780 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 61 72 67   */.  while( arg
13790 63 3e 31 20 26 26 20 61 72 67 76 5b 31 5d 5b 30  c>1 && argv[1][0
137a0 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 63 68  ]=='-' ){.    ch
137b0 61 72 20 2a 7a 20 3d 20 61 72 67 76 5b 31 5d 3b  ar *z = argv[1];
137c0 0a 20 20 20 20 63 68 61 72 20 2a 7a 41 72 67 20  .    char *zArg 
137d0 3d 20 61 72 67 63 3e 3d 33 20 3f 20 61 72 67 76  = argc>=3 ? argv
137e0 5b 32 5d 20 3a 20 22 30 22 3b 0a 20 20 20 20 69  [2] : "0";.    i
137f0 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20  f( z[0]=='-' && 
13800 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b  z[1]=='-' ) z++;
13810 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
13820 7a 2c 22 2d 75 73 65 72 22 29 3d 3d 30 20 29 7b  z,"-user")==0 ){
13830 0a 20 20 20 20 20 20 7a 50 65 72 6d 55 73 65 72  .      zPermUser
13840 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 7d 65 6c   = zArg;.    }el
13850 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
13860 22 2d 72 6f 6f 74 22 29 3d 3d 30 20 29 7b 0a 20  "-root")==0 ){. 
13870 20 20 20 20 20 7a 52 6f 6f 74 20 3d 20 7a 41 72       zRoot = zAr
13880 67 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  g;.    }else if(
13890 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6c 6f 67 66   strcmp(z,"-logf
138a0 69 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ile")==0 ){.    
138b0 20 20 7a 4c 6f 67 46 69 6c 65 20 3d 20 7a 41 72    zLogFile = zAr
138c0 67 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  g;.    }else if(
138d0 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6d 61 78 2d   strcmp(z,"-max-
138e0 61 67 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  age")==0 ){.    
138f0 20 20 6d 78 41 67 65 20 3d 20 61 74 6f 69 28 7a    mxAge = atoi(z
13900 41 72 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Arg);.    }else 
13910 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 68  if( strcmp(z,"-h
13920 74 74 70 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ttps")==0 ){.   
13930 20 20 20 75 73 65 48 74 74 70 73 20 3d 20 61 74     useHttps = at
13940 6f 69 28 7a 41 72 67 29 3b 0a 20 20 20 20 20 20  oi(zArg);.      
13950 7a 48 74 74 70 20 3d 20 75 73 65 48 74 74 70 73  zHttp = useHttps
13960 20 3f 20 22 68 74 74 70 73 22 20 3a 20 22 68 74   ? "https" : "ht
13970 74 70 22 3b 0a 20 20 20 20 20 20 69 66 28 20 75  tp";.      if( u
13980 73 65 48 74 74 70 73 20 29 20 7a 52 65 6d 6f 74  seHttps ) zRemot
13990 65 41 64 64 72 20 3d 20 67 65 74 65 6e 76 28 22  eAddr = getenv("
139a0 52 45 4d 4f 54 45 5f 48 4f 53 54 22 29 3b 0a 20  REMOTE_HOST");. 
139b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
139c0 63 6d 70 28 7a 2c 20 22 2d 70 6f 72 74 22 29 3d  cmp(z, "-port")=
139d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 50 6f 72  =0 ){.      zPor
139e0 74 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 20 20  t = zArg;.      
139f0 73 74 61 6e 64 61 6c 6f 6e 65 20 3d 20 31 3b 0a  standalone = 1;.
13a00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
13a10 72 63 6d 70 28 7a 2c 20 22 2d 66 61 6d 69 6c 79  rcmp(z, "-family
13a20 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
13a30 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20  f( strcmp(zArg, 
13a40 22 69 70 76 34 22 29 3d 3d 30 20 29 7b 0a 20 20  "ipv4")==0 ){.  
13a50 20 20 20 20 20 20 69 70 76 34 4f 6e 6c 79 20 3d        ipv4Only =
13a60 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
13a70 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
13a80 20 22 69 70 76 36 22 29 3d 3d 30 20 29 7b 0a 20   "ipv6")==0 ){. 
13a90 20 20 20 20 20 20 20 69 70 76 36 4f 6e 6c 79 20         ipv6Only 
13aa0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
13ab0 7b 0a 20 20 20 20 20 20 20 20 4d 61 6c 66 75 6e  {.        Malfun
13ac0 63 74 69 6f 6e 28 35 30 30 2c 20 20 2f 2a 20 4c  ction(500,  /* L
13ad0 4f 47 3a 20 75 6e 6b 6e 6f 77 6e 20 49 50 20 70  OG: unknown IP p
13ae0 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20 20  rotocol */.     
13af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
13b00 75 6e 6b 6e 6f 77 6e 20 49 50 20 70 72 6f 74 6f  unknown IP proto
13b10 63 6f 6c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 41  col: [%s]\n", zA
13b20 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rg);.      }.   
13b30 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
13b40 70 28 7a 2c 20 22 2d 6a 61 69 6c 22 29 3d 3d 30  p(z, "-jail")==0
13b50 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 74   ){.      if( at
13b60 6f 69 28 7a 41 72 67 29 3d 3d 30 20 29 7b 0a 20  oi(zArg)==0 ){. 
13b70 20 20 20 20 20 20 20 75 73 65 43 68 72 6f 6f 74         useChroot
13b80 4a 61 69 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Jail = 0;.      
13b90 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
13ba0 73 74 72 63 6d 70 28 7a 2c 20 22 2d 64 65 62 75  strcmp(z, "-debu
13bb0 67 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  g")==0 ){.      
13bc0 69 66 28 20 61 74 6f 69 28 7a 41 72 67 29 20 29  if( atoi(zArg) )
13bd0 7b 0a 20 20 20 20 20 20 20 20 75 73 65 54 69 6d  {.        useTim
13be0 65 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  eout = 0;.      
13bf0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
13c00 73 74 72 63 6d 70 28 7a 2c 20 22 2d 69 6e 70 75  strcmp(z, "-inpu
13c10 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
13c20 66 63 6c 6f 73 65 28 73 74 64 69 6e 29 3b 0a 20  fclose(stdin);. 
13c30 20 20 20 20 20 73 74 64 69 6e 20 3d 20 66 6f 70       stdin = fop
13c40 65 6e 28 7a 41 72 67 2c 20 22 72 62 22 29 3b 0a  en(zArg, "rb");.
13c50 20 20 20 20 20 20 69 66 28 20 73 74 64 69 6e 3d        if( stdin=
13c60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 61  =0 ){.        Ma
13c70 6c 66 75 6e 63 74 69 6f 6e 28 35 30 31 2c 20 2f  lfunction(501, /
13c80 2a 20 4c 4f 47 3a 20 63 61 6e 6e 6f 74 20 6f 70  * LOG: cannot op
13c90 65 6e 20 2d 2d 69 6e 70 75 74 20 66 69 6c 65 20  en --input file 
13ca0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
13cb0 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 6f         "cannot o
13cc0 70 65 6e 20 2d 2d 69 6e 70 75 74 20 66 69 6c 65  pen --input file
13cd0 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 41 72 67   \"%s\"\n", zArg
13ce0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
13cf0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
13d00 7a 2c 20 22 2d 64 61 74 65 74 65 73 74 22 29 3d  z, "-datetest")=
13d10 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 65 73 74  =0 ){.      Test
13d20 50 61 72 73 65 52 66 63 38 32 32 44 61 74 65 28  ParseRfc822Date(
13d30 29 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  );.      printf(
13d40 22 4f 6b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65  "Ok\n");.      e
13d50 78 69 74 28 30 29 3b 0a 20 20 20 20 7d 65 6c 73  xit(0);.    }els
13d60 65 7b 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e 63  e{.      Malfunc
13d70 74 69 6f 6e 28 35 31 30 2c 20 2f 2a 20 4c 4f 47  tion(510, /* LOG
13d80 3a 20 75 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e  : unknown comman
13d90 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 20  d-line argument 
13da0 6f 6e 20 6c 61 75 6e 63 68 20 2a 2f 0a 20 20 20  on launch */.   
13db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
13dc0 75 6e 6b 6e 6f 77 6e 20 61 72 67 75 6d 65 6e 74  unknown argument
13dd0 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20  : [%s]\n", z);. 
13de0 20 20 20 7d 0a 20 20 20 20 61 72 67 76 20 2b 3d     }.    argv +=
13df0 20 32 3b 0a 20 20 20 20 61 72 67 63 20 2d 3d 20   2;.    argc -= 
13e00 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 52 6f  2;.  }.  if( zRo
13e10 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ot==0 ){.    if(
13e20 20 73 74 61 6e 64 61 6c 6f 6e 65 20 29 7b 0a 20   standalone ){. 
13e30 20 20 20 20 20 7a 52 6f 6f 74 20 3d 20 22 2e 22       zRoot = "."
13e40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13e50 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 35     Malfunction(5
13e60 32 30 2c 20 2f 2a 20 4c 4f 47 3a 20 2d 2d 72 6f  20, /* LOG: --ro
13e70 6f 74 20 61 72 67 75 6d 65 6e 74 20 6d 69 73 73  ot argument miss
13e80 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ing */.         
13e90 20 20 20 20 20 20 20 20 20 22 6e 6f 20 2d 2d 72           "no --r
13ea0 6f 6f 74 20 73 70 65 63 69 66 69 65 64 22 29 3b  oot specified");
13eb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
13ec0 2f 2a 20 43 68 61 6e 67 65 20 64 69 72 65 63 74  /* Change direct
13ed0 6f 72 69 65 73 20 74 6f 20 74 68 65 20 72 6f 6f  ories to the roo
13ee0 74 20 6f 66 20 74 68 65 20 48 54 54 50 20 66 69  t of the HTTP fi
13ef0 6c 65 73 79 73 74 65 6d 2e 20 20 54 68 65 6e 0a  lesystem.  Then.
13f00 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20 63 68    ** create a ch
13f10 72 6f 6f 74 20 6a 61 69 6c 20 74 68 65 72 65 2e  root jail there.
13f20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 64 69  .  */.  if( chdi
13f30 72 28 7a 52 6f 6f 74 29 21 3d 30 20 29 7b 0a 20  r(zRoot)!=0 ){. 
13f40 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 35     Malfunction(5
13f50 33 30 2c 20 2f 2a 20 4c 4f 47 3a 20 63 68 64 69  30, /* LOG: chdi
13f60 72 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  r() failed */.  
13f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
13f80 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20 74 6f 20  annot change to 
13f90 64 69 72 65 63 74 6f 72 79 20 5b 25 73 5d 22 2c  directory [%s]",
13fa0 20 7a 52 6f 6f 74 29 3b 0a 20 20 7d 0a 0a 20 20   zRoot);.  }..  
13fb0 2f 2a 20 47 65 74 20 69 6e 66 6f 72 6d 61 74 69  /* Get informati
13fc0 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 75 73 65  on about the use
13fd0 72 20 69 66 20 61 76 61 69 6c 61 62 6c 65 20 2a  r if available *
13fe0 2f 0a 20 20 69 66 28 20 7a 50 65 72 6d 55 73 65  /.  if( zPermUse
13ff0 72 20 29 20 70 77 64 20 3d 20 67 65 74 70 77 6e  r ) pwd = getpwn
14000 61 6d 28 7a 50 65 72 6d 55 73 65 72 29 3b 0a 0a  am(zPermUser);..
14010 20 20 2f 2a 20 45 6e 74 65 72 20 74 68 65 20 63    /* Enter the c
14020 68 72 6f 6f 74 20 6a 61 69 6c 20 69 66 20 72 65  hroot jail if re
14030 71 75 65 73 74 65 64 20 2a 2f 20 20 0a 20 20 69  quested */  .  i
14040 66 28 20 7a 50 65 72 6d 55 73 65 72 20 26 26 20  f( zPermUser && 
14050 75 73 65 43 68 72 6f 6f 74 4a 61 69 6c 20 26 26  useChrootJail &&
14060 20 67 65 74 75 69 64 28 29 3d 3d 30 20 29 7b 0a   getuid()==0 ){.
14070 20 20 20 20 69 66 28 20 63 68 72 6f 6f 74 28 22      if( chroot("
14080 2e 22 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 4d  .")<0 ){.      M
14090 61 6c 66 75 6e 63 74 69 6f 6e 28 35 34 30 2c 20  alfunction(540, 
140a0 2f 2a 20 4c 4f 47 3a 20 63 68 72 6f 6f 74 28 29  /* LOG: chroot()
140b0 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
140c0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 75 6e               "un
140d0 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 63  able to create c
140e0 68 72 6f 6f 74 20 6a 61 69 6c 22 29 3b 0a 20 20  hroot jail");.  
140f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
14100 52 6f 6f 74 20 3d 20 22 22 3b 0a 20 20 20 20 7d  Root = "";.    }
14110 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 74 69 76  .  }..  /* Activ
14120 61 74 65 20 74 68 65 20 73 65 72 76 65 72 2c 20  ate the server, 
14130 69 66 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a  if requested */.
14140 20 20 69 66 28 20 7a 50 6f 72 74 20 26 26 20 68    if( zPort && h
14150 74 74 70 5f 73 65 72 76 65 72 28 7a 50 6f 72 74  ttp_server(zPort
14160 2c 20 30 29 20 29 7b 0a 20 20 20 20 4d 61 6c 66  , 0) ){.    Malf
14170 75 6e 63 74 69 6f 6e 28 35 35 30 2c 20 2f 2a 20  unction(550, /* 
14180 4c 4f 47 3a 20 73 65 72 76 65 72 20 73 74 61 72  LOG: server star
14190 74 75 70 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  tup failed */.  
141a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 66                "f
141b0 61 69 6c 65 64 20 74 6f 20 73 74 61 72 74 20 73  ailed to start s
141c0 65 72 76 65 72 22 29 3b 0a 20 20 7d 0a 0a 20 20  erver");.  }..  
141d0 2f 2a 20 44 72 6f 70 20 72 6f 6f 74 20 70 72 69  /* Drop root pri
141e0 76 69 6c 65 67 65 73 2e 0a 20 20 2a 2f 0a 20 20  vileges..  */.  
141f0 69 66 28 20 7a 50 65 72 6d 55 73 65 72 20 29 7b  if( zPermUser ){
14200 0a 20 20 20 20 69 66 28 20 70 77 64 20 29 7b 0a  .    if( pwd ){.
14210 20 20 20 20 20 20 69 66 28 20 73 65 74 67 69 64        if( setgid
14220 28 70 77 64 2d 3e 70 77 5f 67 69 64 29 20 29 7b  (pwd->pw_gid) ){
14230 0a 20 20 20 20 20 20 20 20 4d 61 6c 66 75 6e 63  .        Malfunc
14240 74 69 6f 6e 28 35 36 30 2c 20 2f 2a 20 4c 4f 47  tion(560, /* LOG
14250 3a 20 73 65 74 67 69 64 28 29 20 66 61 69 6c 65  : setgid() faile
14260 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  d */.           
14270 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74           "cannot
14280 20 73 65 74 20 67 72 6f 75 70 2d 69 64 20 74 6f   set group-id to
14290 20 25 64 22 2c 20 70 77 64 2d 3e 70 77 5f 67 69   %d", pwd->pw_gi
142a0 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d);.      }.    
142b0 20 20 69 66 28 20 73 65 74 75 69 64 28 70 77 64    if( setuid(pwd
142c0 2d 3e 70 77 5f 75 69 64 29 20 29 7b 0a 20 20 20  ->pw_uid) ){.   
142d0 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e       Malfunction
142e0 28 35 37 30 2c 20 2f 2a 20 4c 4f 47 3a 20 73 65  (570, /* LOG: se
142f0 74 75 69 64 28 29 20 66 61 69 6c 65 64 20 2a 2f  tuid() failed */
14300 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14310 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 73 65 74       "cannot set
14320 20 75 73 65 72 2d 69 64 20 74 6f 20 25 64 22 2c   user-id to %d",
14330 20 70 77 64 2d 3e 70 77 5f 75 69 64 29 3b 0a 20   pwd->pw_uid);. 
14340 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
14350 7b 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74  {.      Malfunct
14360 69 6f 6e 28 35 38 30 2c 20 2f 2a 20 4c 4f 47 3a  ion(580, /* LOG:
14370 20 75 6e 6b 6e 6f 77 6e 20 75 73 65 72 20 2a 2f   unknown user */
14380 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14390 20 20 20 22 6e 6f 20 73 75 63 68 20 75 73 65 72     "no such user
143a0 20 5b 25 73 5d 22 2c 20 7a 50 65 72 6d 55 73 65   [%s]", zPermUse
143b0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
143c0 69 66 28 20 67 65 74 75 69 64 28 29 3d 3d 30 20  if( getuid()==0 
143d0 29 7b 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69  ){.    Malfuncti
143e0 6f 6e 28 35 39 30 2c 20 2f 2a 20 4c 4f 47 3a 20  on(590, /* LOG: 
143f0 63 61 6e 6e 6f 74 20 72 75 6e 20 61 73 20 72 6f  cannot run as ro
14400 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ot */.          
14410 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 72 75        "cannot ru
14420 6e 20 61 73 20 72 6f 6f 74 22 29 3b 0a 20 20 7d  n as root");.  }
14430 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 49  ..  /* Get the I
14440 50 20 61 64 64 72 65 73 73 20 66 72 6f 6d 20 77  P address from w
14450 68 65 6e 63 65 20 74 68 65 20 72 65 71 75 65 73  hence the reques
14460 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 20 20 2a  t originates.  *
14470 2f 0a 20 20 69 66 28 20 7a 52 65 6d 6f 74 65 41  /.  if( zRemoteA
14480 64 64 72 3d 3d 30 20 29 7b 0a 20 20 20 20 61 64  ddr==0 ){.    ad
14490 64 72 65 73 73 20 72 65 6d 6f 74 65 41 64 64 72  dress remoteAddr
144a0 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69  ;.    unsigned i
144b0 6e 74 20 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66  nt size = sizeof
144c0 28 72 65 6d 6f 74 65 41 64 64 72 29 3b 0a 20 20  (remoteAddr);.  
144d0 20 20 63 68 61 72 20 7a 48 6f 73 74 5b 4e 49 5f    char zHost[NI_
144e0 4d 41 58 48 4f 53 54 5d 3b 0a 20 20 20 20 69 66  MAXHOST];.    if
144f0 28 20 67 65 74 70 65 65 72 6e 61 6d 65 28 30 2c  ( getpeername(0,
14500 20 26 72 65 6d 6f 74 65 41 64 64 72 2e 73 61 2c   &remoteAddr.sa,
14510 20 26 73 69 7a 65 29 3e 3d 30 20 29 7b 0a 20 20   &size)>=0 ){.  
14520 20 20 20 20 67 65 74 6e 61 6d 65 69 6e 66 6f 28      getnameinfo(
14530 26 72 65 6d 6f 74 65 41 64 64 72 2e 73 61 2c 20  &remoteAddr.sa, 
14540 73 69 7a 65 2c 20 7a 48 6f 73 74 2c 20 73 69 7a  size, zHost, siz
14550 65 6f 66 28 7a 48 6f 73 74 29 2c 20 30 2c 20 30  eof(zHost), 0, 0
14560 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14570 20 20 20 20 4e 49 5f 4e 55 4d 45 52 49 43 48 4f      NI_NUMERICHO
14580 53 54 29 3b 0a 20 20 20 20 20 20 7a 52 65 6d 6f  ST);.      zRemo
14590 74 65 41 64 64 72 20 3d 20 53 74 72 44 75 70 28  teAddr = StrDup(
145a0 7a 48 6f 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  zHost);.    }.  
145b0 7d 0a 20 20 69 66 28 20 7a 52 65 6d 6f 74 65 41  }.  if( zRemoteA
145c0 64 64 72 21 3d 30 0a 20 20 20 26 26 20 73 74 72  ddr!=0.   && str
145d0 6e 63 6d 70 28 7a 52 65 6d 6f 74 65 41 64 64 72  ncmp(zRemoteAddr
145e0 2c 20 22 3a 3a 66 66 66 66 3a 22 2c 20 37 29 3d  , "::ffff:", 7)=
145f0 3d 30 0a 20 20 20 26 26 20 73 74 72 63 68 72 28  =0.   && strchr(
14600 7a 52 65 6d 6f 74 65 41 64 64 72 2b 37 2c 20 27  zRemoteAddr+7, '
14610 3a 27 29 3d 3d 30 0a 20 20 20 26 26 20 73 74 72  :')==0.   && str
14620 63 68 72 28 7a 52 65 6d 6f 74 65 41 64 64 72 2b  chr(zRemoteAddr+
14630 37 2c 20 27 2e 27 29 21 3d 30 0a 20 20 29 7b 0a  7, '.')!=0.  ){.
14640 20 20 20 20 7a 52 65 6d 6f 74 65 41 64 64 72 20      zRemoteAddr 
14650 2b 3d 20 37 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  += 7;.  }..  /* 
14660 50 72 6f 63 65 73 73 20 74 68 65 20 69 6e 70 75  Process the inpu
14670 74 20 73 74 72 65 61 6d 20 2a 2f 0a 20 20 66 6f  t stream */.  fo
14680 72 28 69 3d 30 3b 20 69 3c 31 30 30 3b 20 69 2b  r(i=0; i<100; i+
14690 2b 29 7b 0a 20 20 20 20 50 72 6f 63 65 73 73 4f  +){.    ProcessO
146a0 6e 65 52 65 71 75 65 73 74 28 30 29 3b 0a 20 20  neRequest(0);.  
146b0 7d 0a 20 20 50 72 6f 63 65 73 73 4f 6e 65 52 65  }.  ProcessOneRe
146c0 71 75 65 73 74 28 31 29 3b 0a 20 20 65 78 69 74  quest(1);.  exit
146d0 28 30 29 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a  (0);.}..#if 0./*
146e0 20 43 6f 70 79 2f 70 61 73 74 65 20 74 68 65 20   Copy/paste the 
146f0 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 78 74 20 69  following text i
14700 6e 74 6f 20 53 51 4c 69 74 65 20 74 6f 20 67 65  nto SQLite to ge
14710 6e 65 72 61 74 65 20 74 68 65 20 78 72 65 66 0a  nerate the xref.
14720 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20 64 65  ** table that de
14730 73 63 72 69 62 65 73 20 61 6c 6c 20 65 72 72 6f  scribes all erro
14740 72 20 63 6f 64 65 73 2e 0a 2a 2f 0a 42 45 47 49  r codes..*/.BEGI
14750 4e 3b 0a 43 52 45 41 54 45 20 54 41 42 4c 45 20  N;.CREATE TABLE 
14760 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 78 72  IF NOT EXISTS xr
14770 65 66 28 6c 69 6e 65 6e 6f 20 49 4e 54 45 47 45  ef(lineno INTEGE
14780 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 64  R PRIMARY KEY, d
14790 65 73 63 20 54 45 58 54 29 3b 0a 44 45 4c 45 54  esc TEXT);.DELET
147a0 45 20 46 52 4f 4d 20 58 72 65 66 3b 0a 49 4e 53  E FROM Xref;.INS
147b0 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41  ERT INTO xref VA
147c0 4c 55 45 53 28 31 30 30 2c 27 4d 61 6c 6c 6f 63  LUES(100,'Malloc
147d0 28 29 20 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53  () failed');.INS
147e0 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41  ERT INTO xref VA
147f0 4c 55 45 53 28 31 31 30 2c 27 4e 6f 74 20 61 75  LUES(110,'Not au
14800 74 68 6f 72 69 7a 65 64 27 29 3b 0a 49 4e 53 45  thorized');.INSE
14810 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
14820 55 45 53 28 31 32 30 2c 27 43 47 49 20 45 72 72  UES(120,'CGI Err
14830 6f 72 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54  or');.INSERT INT
14840 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 31 33  O xref VALUES(13
14850 30 2c 27 54 69 6d 65 6f 75 74 27 29 3b 0a 49 4e  0,'Timeout');.IN
14860 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56  SERT INTO xref V
14870 41 4c 55 45 53 28 31 34 30 2c 27 43 47 49 20 73  ALUES(140,'CGI s
14880 63 72 69 70 74 20 69 73 20 77 72 69 74 61 62 6c  cript is writabl
14890 65 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f  e');.INSERT INTO
148a0 20 78 72 65 66 20 56 41 4c 55 45 53 28 31 35 30   xref VALUES(150
148b0 2c 27 43 61 6e 6e 6f 74 20 6f 70 65 6e 20 2d 61  ,'Cannot open -a
148c0 75 74 68 20 66 69 6c 65 27 29 3b 0a 49 4e 53 45  uth file');.INSE
148d0 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
148e0 55 45 53 28 31 36 30 2c 27 68 74 74 70 20 72 65  UES(160,'http re
148f0 71 75 65 73 74 20 6f 6e 20 68 74 74 70 73 2d 6f  quest on https-o
14900 6e 6c 79 20 70 61 67 65 27 29 3b 0a 49 4e 53 45  nly page');.INSE
14910 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
14920 55 45 53 28 31 37 30 2c 27 2d 61 75 74 68 20 72  UES(170,'-auth r
14930 65 64 69 72 65 63 74 27 29 3b 0a 49 4e 53 45 52  edirect');.INSER
14940 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
14950 45 53 28 31 38 30 2c 27 6d 61 6c 66 6f 72 6d 65  ES(180,'malforme
14960 64 20 65 6e 74 72 79 20 69 6e 20 2d 61 75 74 68  d entry in -auth
14970 20 66 69 6c 65 27 29 3b 0a 49 4e 53 45 52 54 20   file');.INSERT 
14980 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53  INTO xref VALUES
14990 28 31 39 30 2c 27 63 68 64 69 72 28 29 20 66 61  (190,'chdir() fa
149a0 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54 20 49  iled');.INSERT I
149b0 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28  NTO xref VALUES(
149c0 32 30 30 2c 27 62 61 64 20 70 72 6f 74 6f 63 6f  200,'bad protoco
149d0 6c 20 69 6e 20 48 54 54 50 20 68 65 61 64 65 72  l in HTTP header
149e0 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
149f0 78 72 65 66 20 56 41 4c 55 45 53 28 32 31 30 2c  xref VALUES(210,
14a00 27 45 6d 70 74 79 20 72 65 71 75 65 73 74 20 55  'Empty request U
14a10 52 49 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54  RI');.INSERT INT
14a20 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 32 32  O xref VALUES(22
14a30 30 2c 27 55 6e 6b 6e 6f 77 6e 20 72 65 71 75 65  0,'Unknown reque
14a40 73 74 20 6d 65 74 68 6f 64 27 29 3b 0a 49 4e 53  st method');.INS
14a50 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41  ERT INTO xref VA
14a60 4c 55 45 53 28 32 33 30 2c 27 52 65 66 65 72 72  LUES(230,'Referr
14a70 65 72 20 69 73 20 64 65 76 69 64 73 2e 6e 65 74  er is devids.net
14a80 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
14a90 78 72 65 66 20 56 41 4c 55 45 53 28 32 34 30 2c  xref VALUES(240,
14aa0 27 49 6c 6c 65 67 61 6c 20 63 6f 6e 74 65 6e 74  'Illegal content
14ab0 20 69 6e 20 48 4f 53 54 3a 20 70 61 72 61 6d 65   in HOST: parame
14ac0 74 65 72 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  ter');.INSERT IN
14ad0 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 32  TO xref VALUES(2
14ae0 35 30 2c 27 44 69 73 61 6c 6c 6f 77 65 64 20 75  50,'Disallowed u
14af0 73 65 72 20 61 67 65 6e 74 27 29 3b 0a 49 4e 53  ser agent');.INS
14b00 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41  ERT INTO xref VA
14b10 4c 55 45 53 28 32 36 30 2c 27 44 69 73 61 6c 6c  LUES(260,'Disall
14b20 6f 77 65 64 20 72 65 66 65 72 72 65 72 27 29 3b  owed referrer');
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 32 37 30 2c 27 52 65  f VALUES(270,'Re
14b50 71 75 65 73 74 20 74 6f 6f 20 6c 61 72 67 65 27  quest too large'
14b60 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  );.INSERT INTO x
14b70 72 65 66 20 56 41 4c 55 45 53 28 32 38 30 2c 27  ref VALUES(280,'
14b80 6d 6b 73 74 65 6d 70 28 29 20 66 61 69 6c 65 64  mkstemp() failed
14b90 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
14ba0 78 72 65 66 20 56 41 4c 55 45 53 28 32 39 30 2c  xref VALUES(290,
14bb0 27 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 74  'cannot create t
14bc0 65 6d 70 20 66 69 6c 65 20 66 6f 72 20 50 4f 53  emp file for POS
14bd0 54 20 63 6f 6e 74 65 6e 74 27 29 3b 0a 49 4e 53  T content');.INS
14be0 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41  ERT INTO xref VA
14bf0 4c 55 45 53 28 33 30 30 2c 27 50 61 74 68 20 65  LUES(300,'Path e
14c00 6c 65 6d 65 6e 74 20 62 65 67 69 6e 73 20 77 69  lement begins wi
14c10 74 68 20 2e 20 6f 72 20 2d 27 29 3b 0a 49 4e 53  th . or -');.INS
14c20 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41  ERT INTO xref VA
14c30 4c 55 45 53 28 33 31 30 2c 27 55 52 49 20 64 6f  LUES(310,'URI do
14c40 65 73 20 6e 6f 74 20 73 74 61 72 74 20 77 69 74  es not start wit
14c50 68 20 2f 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  h /');.INSERT IN
14c60 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 33  TO xref VALUES(3
14c70 32 30 2c 27 55 52 49 20 74 6f 6f 20 6c 6f 6e 67  20,'URI too long
14c80 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
14c90 78 72 65 66 20 56 41 4c 55 45 53 28 33 33 30 2c  xref VALUES(330,
14ca0 27 4d 69 73 73 69 6e 67 20 48 4f 53 54 3a 20 70  'Missing HOST: p
14cb0 61 72 61 6d 65 74 65 72 27 29 3b 0a 49 4e 53 45  arameter');.INSE
14cc0 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
14cd0 55 45 53 28 33 34 30 2c 27 48 4f 53 54 20 70 61  UES(340,'HOST pa
14ce0 72 61 6d 65 74 65 72 20 74 6f 6f 20 6c 6f 6e 67  rameter too long
14cf0 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
14d00 78 72 65 66 20 56 41 4c 55 45 53 28 33 35 30 2c  xref VALUES(350,
14d10 27 2a 2e 77 65 62 73 69 74 65 20 70 65 72 6d 69  '*.website permi
14d20 73 73 69 6f 6e 73 27 29 3b 0a 49 4e 53 45 52 54  ssions');.INSERT
14d30 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45   INTO xref VALUE
14d40 53 28 33 36 30 2c 27 63 68 64 69 72 28 29 20 66  S(360,'chdir() f
14d50 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54 20  ailed');.INSERT 
14d60 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53  INTO xref VALUES
14d70 28 33 37 30 2c 27 72 65 64 69 72 65 63 74 20 74  (370,'redirect t
14d80 6f 20 6e 6f 74 2d 66 6f 75 6e 64 20 70 61 67 65  o not-found page
14d90 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
14da0 78 72 65 66 20 56 41 4c 55 45 53 28 33 38 30 2c  xref VALUES(380,
14db0 27 55 52 49 20 6e 6f 74 20 66 6f 75 6e 64 27 29  'URI not found')
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 33 39 30 2c 27 46  ef VALUES(390,'F
14de0 69 6c 65 20 6e 6f 74 20 72 65 61 64 61 62 6c 65  ile not readable
14df0 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
14e00 78 72 65 66 20 56 41 4c 55 45 53 28 34 30 30 2c  xref VALUES(400,
14e10 27 55 52 49 20 69 73 20 61 20 64 69 72 65 63 74  'URI is a direct
14e20 6f 72 79 20 77 2f 6f 20 69 6e 64 65 78 2e 68 74  ory w/o index.ht
14e30 6d 6c 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54  ml');.INSERT INT
14e40 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 34 31  O xref VALUES(41
14e50 30 2c 27 72 65 64 69 72 65 63 74 20 74 6f 20 61  0,'redirect to a
14e60 64 64 20 74 72 61 69 6c 69 6e 67 20 2f 27 29 3b  dd trailing /');
14e70 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65  .INSERT INTO xre
14e80 66 20 56 41 4c 55 45 53 28 34 32 30 2c 27 63 68  f VALUES(420,'ch
14e90 64 69 72 28 29 20 66 61 69 6c 65 64 27 29 3b 0a  dir() failed');.
14ea0 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66  INSERT INTO xref
14eb0 20 56 41 4c 55 45 53 28 34 33 30 2c 27 64 75 70   VALUES(430,'dup
14ec0 28 30 29 20 66 61 69 6c 65 64 27 29 3b 0a 49 4e  (0) failed');.IN
14ed0 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56  SERT INTO xref V
14ee0 41 4c 55 45 53 28 34 34 30 2c 27 70 69 70 65 28  ALUES(440,'pipe(
14ef0 29 20 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45  ) failed');.INSE
14f00 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
14f10 55 45 53 28 34 35 30 2c 27 64 75 70 28 31 29 20  UES(450,'dup(1) 
14f20 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54  failed');.INSERT
14f30 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45   INTO xref VALUE
14f40 53 28 34 36 30 2c 27 45 78 63 65 73 73 20 55 52  S(460,'Excess UR
14f50 49 20 63 6f 6e 74 65 6e 74 20 70 61 73 74 20 73  I content past s
14f60 74 61 74 69 63 20 66 69 6c 65 20 6e 61 6d 65 27  tatic file name'
14f70 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  );.INSERT INTO x
14f80 72 65 66 20 56 41 4c 55 45 53 28 34 37 30 2c 27  ref VALUES(470,'
14f90 45 54 61 67 20 43 61 63 68 65 20 48 69 74 27 29  ETag Cache Hit')
14fa0 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72  ;.INSERT INTO xr
14fb0 65 66 20 56 41 4c 55 45 53 28 34 38 30 2c 27 66  ef VALUES(480,'f
14fc0 6f 70 65 6e 28 29 20 66 61 69 6c 65 64 20 66 6f  open() failed fo
14fd0 72 20 73 74 61 74 69 63 20 63 6f 6e 74 65 6e 74  r static content
14fe0 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
14ff0 78 72 65 66 20 56 41 4c 55 45 53 28 32 2c 27 4e  xref VALUES(2,'N
15000 6f 72 6d 61 6c 20 48 45 41 44 20 72 65 70 6c 79  ormal HEAD reply
15010 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
15020 78 72 65 66 20 56 41 4c 55 45 53 28 30 2c 27 4e  xref VALUES(0,'N
15030 6f 72 6d 61 6c 20 72 65 70 6c 79 27 29 3b 0a 49  ormal reply');.I
15040 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
15050 56 41 4c 55 45 53 28 35 30 30 2c 27 75 6e 6b 6e  VALUES(500,'unkn
15060 6f 77 6e 20 49 50 20 70 72 6f 74 6f 63 6f 6c 27  own IP protocol'
15070 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  );.INSERT INTO x
15080 72 65 66 20 56 41 4c 55 45 53 28 35 30 31 2c 27  ref VALUES(501,'
15090 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 2d 2d 69 6e  cannot open --in
150a0 70 75 74 20 66 69 6c 65 27 29 3b 0a 49 4e 53 45  put file');.INSE
150b0 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
150c0 55 45 53 28 35 31 30 2c 27 75 6e 6b 6e 6f 77 6e  UES(510,'unknown
150d0 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72   command-line ar
150e0 67 75 6d 65 6e 74 20 6f 6e 20 6c 61 75 6e 63 68  gument on launch
150f0 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
15100 78 72 65 66 20 56 41 4c 55 45 53 28 35 32 30 2c  xref VALUES(520,
15110 27 2d 2d 72 6f 6f 74 20 61 72 67 75 6d 65 6e 74  '--root argument
15120 20 6d 69 73 73 69 6e 67 27 29 3b 0a 49 4e 53 45   missing');.INSE
15130 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
15140 55 45 53 28 35 33 30 2c 27 63 68 64 69 72 28 29  UES(530,'chdir()
15150 20 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52   failed');.INSER
15160 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
15170 45 53 28 35 34 30 2c 27 63 68 72 6f 6f 74 28 29  ES(540,'chroot()
15180 20 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52   failed');.INSER
15190 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
151a0 45 53 28 35 35 30 2c 27 73 65 72 76 65 72 20 73  ES(550,'server s
151b0 74 61 72 74 75 70 20 66 61 69 6c 65 64 27 29 3b  tartup failed');
151c0 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65  .INSERT INTO xre
151d0 66 20 56 41 4c 55 45 53 28 35 36 30 2c 27 73 65  f VALUES(560,'se
151e0 74 67 69 64 28 29 20 66 61 69 6c 65 64 27 29 3b  tgid() failed');
151f0 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65  .INSERT INTO xre
15200 66 20 56 41 4c 55 45 53 28 35 37 30 2c 27 73 65  f VALUES(570,'se
15210 74 75 69 64 28 29 20 66 61 69 6c 65 64 27 29 3b  tuid() failed');
15220 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65  .INSERT INTO xre
15230 66 20 56 41 4c 55 45 53 28 35 38 30 2c 27 75 6e  f VALUES(580,'un
15240 6b 6e 6f 77 6e 20 75 73 65 72 27 29 3b 0a 49 4e  known user');.IN
15250 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56  SERT INTO xref V
15260 41 4c 55 45 53 28 35 39 30 2c 27 63 61 6e 6e 6f  ALUES(590,'canno
15270 74 20 72 75 6e 20 61 73 20 72 6f 6f 74 27 29 3b  t run as root');
15280 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65  .INSERT INTO xre
15290 66 20 56 41 4c 55 45 53 28 36 30 30 2c 27 6d 61  f VALUES(600,'ma
152a0 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 27 29 3b  lloc() failed');
152b0 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65  .INSERT INTO xre
152c0 66 20 56 41 4c 55 45 53 28 36 31 30 2c 27 6d 61  f VALUES(610,'ma
152d0 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 27 29 3b  lloc() failed');
152e0 0a 43 4f 4d 4d 49 54 3b 0a 23 65 6e 64 69 66 20  .COMMIT;.#endif 
152f0 2f 2a 20 53 51 4c 20 2a 2f 0a                    /* SQL */.