Documentation Source Text

Hex Artifact Content
Login

Artifact cd8790b27f3c6557d9fca3f5aa48f9e9ab4f1dba5ab83d6ecef015532f1396b5:


0000: 2f 2a 0a 2a 2a 20 41 20 73 6d 61 6c 6c 2c 20 73  /*.** A small, s
0010: 69 6d 70 6c 65 20 48 54 54 50 20 73 65 72 76 65  imple HTTP serve
0020: 72 2e 0a 2a 2a 0a 2a 2a 20 46 65 61 74 75 72 65  r..**.** Feature
0030: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 4c  s:.**.**     * L
0040: 61 75 6e 63 68 65 64 20 66 72 6f 6d 20 69 6e 65  aunched from ine
0050: 74 64 2f 78 69 6e 65 74 64 2f 73 74 75 6e 6e 65  td/xinetd/stunne
0060: 6c 34 2c 20 6f 72 20 61 73 20 61 20 73 74 61 6e  l4, or as a stan
0070: 64 2d 61 6c 6f 6e 65 20 73 65 72 76 65 72 0a 2a  d-alone server.*
0080: 2a 20 20 20 20 20 2a 20 4f 6e 65 20 70 72 6f 63  *     * One proc
0090: 65 73 73 20 70 65 72 20 72 65 71 75 65 73 74 0a  ess per request.
00a0: 2a 2a 20 20 20 20 20 2a 20 44 65 6c 69 76 65 72  **     * Deliver
00b0: 20 73 74 61 74 69 63 20 63 6f 6e 74 65 6e 74 20   static content 
00c0: 6f 72 20 72 75 6e 20 43 47 49 20 6f 72 20 53 43  or run CGI or SC
00d0: 47 49 0a 2a 2a 20 20 20 20 20 2a 20 56 69 72 74  GI.**     * Virt
00e0: 75 61 6c 20 73 69 74 65 73 20 62 61 73 65 64 20  ual sites based 
00f0: 6f 6e 20 74 68 65 20 22 48 6f 73 74 3a 22 20 70  on the "Host:" p
0100: 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 48  roperty of the H
0110: 54 54 50 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  TTP header.**   
0120: 20 20 2a 20 52 75 6e 73 20 69 6e 20 61 20 63 68    * Runs in a ch
0130: 72 6f 6f 74 20 6a 61 69 6c 0a 2a 2a 20 20 20 20  root jail.**    
0140: 20 2a 20 55 6e 69 66 69 65 64 20 6c 6f 67 20 66   * Unified log f
0150: 69 6c 65 20 69 6e 20 61 20 43 53 56 20 66 6f 72  ile in a CSV for
0160: 6d 61 74 0a 2a 2a 20 20 20 20 20 2a 20 53 6d 61  mat.**     * Sma
0170: 6c 6c 20 63 6f 64 65 20 62 61 73 65 20 28 74 68  ll code base (th
0180: 69 73 20 31 20 66 69 6c 65 29 20 74 6f 20 66 61  is 1 file) to fa
0190: 63 69 6c 69 74 61 74 65 20 73 65 63 75 72 69 74  cilitate securit
01a0: 79 20 61 75 64 69 74 69 6e 67 0a 2a 2a 20 20 20  y auditing.**   
01b0: 20 20 2a 20 53 69 6d 70 6c 65 20 73 65 74 75 70    * Simple setup
01c0: 20 2d 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61 74   - no configurat
01d0: 69 6f 6e 20 66 69 6c 65 73 20 74 6f 20 6d 69 73  ion files to mis
01e0: 63 6f 6e 66 69 67 75 72 65 0a 2a 2a 20 0a 2a 2a  configure.** .**
01f0: 20 54 68 69 73 20 66 69 6c 65 20 69 6d 70 6c 65   This file imple
0200: 6d 65 6e 74 73 20 61 20 73 6d 61 6c 6c 20 61 6e  ments a small an
0210: 64 20 73 69 6d 70 6c 65 20 62 75 74 20 73 65 63  d simple but sec
0220: 75 72 65 20 61 6e 64 20 65 66 66 65 63 74 69 76  ure and effectiv
0230: 65 20 77 65 62 0a 2a 2a 20 73 65 72 76 65 72 2e  e web.** server.
0240: 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 66    There are no f
0250: 72 69 6c 6c 73 2e 20 20 41 6e 79 74 68 69 6e 67  rills.  Anything
0260: 20 74 68 61 74 20 63 6f 75 6c 64 20 62 65 20 72   that could be r
0270: 65 61 73 6f 6e 61 62 6c 79 0a 2a 2a 20 6f 6d 69  easonably.** omi
0280: 74 74 65 64 20 68 61 73 20 62 65 65 6e 2e 0a 2a  tted has been..*
0290: 2a 0a 2a 2a 20 53 65 74 75 70 20 72 75 6c 65 73  *.** Setup rules
02a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 4c  :.**.**    (1) L
02b0: 61 75 6e 63 68 20 61 73 20 72 6f 6f 74 20 66 72  aunch as root fr
02c0: 6f 6d 20 69 6e 65 74 64 20 6c 69 6b 65 20 74 68  om inetd like th
02d0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
02e0: 20 20 20 20 20 68 74 74 70 64 20 2d 6c 6f 67 66       httpd -logf
02f0: 69 6c 65 20 6c 6f 67 66 69 6c 65 20 2d 72 6f 6f  ile logfile -roo
0300: 74 20 2f 68 6f 6d 65 2f 77 77 77 20 2d 75 73 65  t /home/www -use
0310: 72 20 6e 6f 62 6f 64 79 0a 2a 2a 0a 2a 2a 20 20  r nobody.**.**  
0320: 20 20 20 20 20 20 49 74 20 77 69 6c 6c 20 61 75        It will au
0330: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 72 6f  tomatically chro
0340: 6f 74 20 74 6f 20 2f 68 6f 6d 65 2f 77 77 77 20  ot to /home/www 
0350: 61 6e 64 20 62 65 63 6f 6d 65 20 75 73 65 72 20  and become user 
0360: 22 6e 6f 62 6f 64 79 22 2e 0a 2a 2a 20 20 20 20  "nobody"..**    
0370: 20 20 20 20 54 68 65 20 6c 6f 67 66 69 6c 65 20      The logfile 
0380: 6e 61 6d 65 20 73 68 6f 75 6c 64 20 62 65 20 72  name should be r
0390: 65 6c 61 74 69 76 65 20 74 6f 20 74 68 65 20 63  elative to the c
03a0: 68 72 6f 6f 74 20 6a 61 69 6c 2e 0a 2a 2a 0a 2a  hroot jail..**.*
03b0: 2a 20 20 20 20 28 32 29 20 44 69 72 65 63 74 6f  *    (2) Directo
03c0: 72 69 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ries of the form
03d0: 20 22 2a 2e 77 65 62 73 69 74 65 22 20 28 65 78   "*.website" (ex
03e0: 3a 20 77 77 77 5f 73 71 6c 69 74 65 5f 6f 72 67  : www_sqlite_org
03f0: 2e 77 65 62 73 69 74 65 29 0a 2a 2a 20 20 20 20  .website).**    
0400: 20 20 20 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74      contain cont
0410: 65 6e 74 2e 20 20 54 68 65 20 64 69 72 65 63 74  ent.  The direct
0420: 6f 72 79 20 69 73 20 63 68 6f 73 65 6e 20 62 61  ory is chosen ba
0430: 73 65 64 20 6f 6e 20 74 68 65 20 48 54 54 50 5f  sed on the HTTP_
0440: 48 4f 53 54 0a 2a 2a 20 20 20 20 20 20 20 20 72  HOST.**        r
0450: 65 71 75 65 73 74 20 68 65 61 64 65 72 2e 20 20  equest header.  
0460: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 48  If there is no H
0470: 54 54 50 5f 48 4f 53 54 20 68 65 61 64 65 72 20  TTP_HOST header 
0480: 6f 72 20 69 66 20 74 68 65 0a 2a 2a 20 20 20 20  or if the.**    
0490: 20 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e      correspondin
04a0: 67 20 68 6f 73 74 20 64 69 72 65 63 74 6f 72 79  g host directory
04b0: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
04c0: 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 20   then the.**    
04d0: 20 20 20 20 22 64 65 66 61 75 6c 74 2e 77 65 62      "default.web
04e0: 73 69 74 65 22 20 69 73 20 75 73 65 64 2e 20 20  site" is used.  
04f0: 49 66 20 74 68 65 20 48 54 54 50 5f 48 4f 53 54  If the HTTP_HOST
0500: 20 68 65 61 64 65 72 20 63 6f 6e 74 61 69 6e 73   header contains
0510: 20 61 6e 79 0a 2a 2a 20 20 20 20 20 20 20 20 63   any.**        c
0520: 68 61 72 61 74 65 72 73 20 6f 74 68 65 72 20 74  haraters other t
0530: 68 61 6e 20 5b 61 2d 7a 41 2d 5a 30 2d 39 5f 2e  han [a-zA-Z0-9_.
0540: 2c 2a 7e 2f 5d 20 74 68 65 6e 20 61 20 34 30 33  ,*~/] then a 403
0550: 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 20 20 20   error is.**    
0560: 20 20 20 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a      generated..*
0570: 2a 0a 2a 2a 20 20 20 20 28 33 29 20 41 6e 79 20  *.**    (3) Any 
0580: 66 69 6c 65 20 6f 72 20 64 69 72 65 63 74 6f 72  file or director
0590: 79 20 77 68 6f 73 65 20 6e 61 6d 65 20 62 65 67  y whose name beg
05a0: 69 6e 73 20 77 69 74 68 20 22 2e 22 20 6f 72 20  ins with "." or 
05b0: 22 2d 22 20 69 73 20 69 67 6e 6f 72 65 64 2c 0a  "-" is ignored,.
05c0: 2a 2a 20 20 20 20 20 20 20 20 65 78 63 65 70 74  **        except
05d0: 20 66 6f 72 20 2f 2e 77 65 6c 6c 2d 6b 6e 6f 77   for /.well-know
05e0: 6e 2f 20 61 74 20 74 68 65 20 74 6f 70 2d 6c 65  n/ at the top-le
05f0: 76 65 6c 2e 20 20 54 68 65 20 65 78 63 65 70 74  vel.  The except
0600: 69 6f 6e 20 69 73 20 66 6f 72 0a 2a 2a 20 20 20  ion is for.**   
0610: 20 20 20 20 20 52 46 43 2d 35 37 38 35 20 74 6f       RFC-5785 to
0620: 20 61 6c 6c 6f 77 20 6c 65 74 73 65 6e 63 72 79   allow letsencry
0630: 70 74 20 6f 72 20 63 65 72 74 62 6f 74 20 74 6f  pt or certbot to
0640: 20 67 65 6e 65 72 61 74 65 20 61 20 54 53 4c 20   generate a TSL 
0650: 63 65 72 74 0a 2a 2a 20 20 20 20 20 20 20 20 75  cert.**        u
0660: 73 69 6e 67 20 77 65 62 72 6f 6f 74 2e 0a 2a 2a  sing webroot..**
0670: 0a 2a 2a 20 20 20 20 28 34 29 20 43 68 61 72 61  .**    (4) Chara
0680: 63 74 65 72 73 20 6f 74 68 65 72 20 74 68 61 6e  cters other than
0690: 20 5b 30 2d 39 61 2d 7a 41 2d 5a 2c 2d 2e 2f 3a   [0-9a-zA-Z,-./:
06a0: 5f 7e 5d 20 61 6e 64 20 61 6e 79 20 25 48 48 20  _~] and any %HH 
06b0: 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 20 20  characters.**   
06c0: 20 20 20 20 20 65 73 63 61 70 65 73 20 69 6e 20       escapes in 
06d0: 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 72 65  the filename are
06e0: 20 61 6c 6c 20 74 72 61 6e 73 6c 61 74 65 64 20   all translated 
06f0: 69 6e 74 6f 20 22 5f 22 2e 20 20 54 68 69 73 20  into "_".  This 
0700: 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 64  is.**        a d
0710: 65 66 65 6e 73 65 20 61 67 61 69 6e 73 74 20 63  efense against c
0720: 72 6f 73 73 2d 73 69 74 65 20 73 63 72 69 70 74  ross-site script
0730: 69 6e 67 20 61 74 74 61 63 6b 73 20 61 6e 64 20  ing attacks and 
0740: 6f 74 68 65 72 20 6d 69 73 63 68 69 65 66 2e 0a  other mischief..
0750: 2a 2a 0a 2a 2a 20 20 20 20 28 35 29 20 45 78 65  **.**    (5) Exe
0760: 63 75 74 61 62 6c 65 20 66 69 6c 65 73 20 61 72  cutable files ar
0770: 65 20 72 75 6e 20 61 73 20 43 47 49 2e 20 20 46  e run as CGI.  F
0780: 69 6c 65 73 20 77 68 6f 73 65 20 6e 61 6d 65 20  iles whose name 
0790: 65 6e 64 73 20 77 69 74 68 20 22 2e 73 63 67 69  ends with ".scgi
07a0: 22 0a 2a 2a 20 20 20 20 20 20 20 20 74 72 69 67  ".**        trig
07b0: 67 65 72 20 61 6e 64 20 53 43 47 49 20 72 65 71  ger and SCGI req
07c0: 75 65 73 74 20 28 73 65 65 20 69 74 65 6d 20 31  uest (see item 1
07d0: 30 20 62 65 6c 6f 77 29 2e 20 20 41 6c 6c 20 6f  0 below).  All o
07e0: 74 68 65 72 20 66 69 6c 65 73 0a 2a 2a 20 20 20  ther files.**   
07f0: 20 20 20 20 20 61 72 65 20 64 65 6c 69 76 65 72       are deliver
0800: 65 64 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  ed as is..**.** 
0810: 20 20 20 28 36 29 20 46 6f 72 20 53 53 4c 20 73     (6) For SSL s
0820: 75 70 70 6f 72 74 20 75 73 65 20 73 74 75 6e 6e  upport use stunn
0830: 65 6c 20 61 6e 64 20 61 64 64 20 74 68 65 20 2d  el and add the -
0840: 68 74 74 70 73 20 31 20 6f 70 74 69 6f 6e 20 6f  https 1 option o
0850: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
0860: 68 74 74 70 64 20 63 6f 6d 6d 61 6e 64 2d 6c 69  httpd command-li
0870: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 37 29  ne..**.**    (7)
0880: 20 49 66 20 61 20 66 69 6c 65 20 6e 61 6d 65 64   If a file named
0890: 20 22 2d 61 75 74 68 22 20 65 78 69 73 74 73 20   "-auth" exists 
08a0: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65  in the same dire
08b0: 63 74 6f 72 79 20 61 73 20 74 68 65 20 66 69 6c  ctory as the fil
08c0: 65 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 62  e to.**        b
08d0: 65 20 72 75 6e 20 61 73 20 43 47 49 20 6f 72 20  e run as CGI or 
08e0: 74 6f 20 62 65 20 64 65 6c 69 76 65 72 65 64 2c  to be delivered,
08f0: 20 74 68 65 6e 20 69 74 20 63 6f 6e 74 61 69 6e   then it contain
0900: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  s information.**
0910: 20 20 20 20 20 20 20 20 66 6f 72 20 48 54 54 50          for HTTP
0920: 20 42 61 73 69 63 20 61 75 74 68 6f 72 69 7a 61   Basic authoriza
0930: 74 69 6f 6e 2e 20 20 53 65 65 20 66 69 6c 65 20  tion.  See file 
0940: 66 6f 72 6d 61 74 20 64 65 74 61 69 6c 73 20 62  format details b
0950: 65 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  elow..**.**    (
0960: 38 29 20 54 6f 20 72 75 6e 20 61 73 20 61 20 73  8) To run as a s
0970: 74 61 6e 64 2d 61 6c 6f 6e 65 20 73 65 72 76 65  tand-alone serve
0980: 72 2c 20 73 69 6d 70 6c 79 20 61 64 64 20 74 68  r, simply add th
0990: 65 20 22 2d 70 6f 72 74 20 4e 22 20 63 6f 6d 6d  e "-port N" comm
09a0: 61 6e 64 2d 6c 69 6e 65 0a 2a 2a 20 20 20 20 20  and-line.**     
09b0: 20 20 20 6f 70 74 69 6f 6e 20 74 6f 20 64 65 66     option to def
09c0: 69 6e 65 20 77 68 69 63 68 20 54 43 50 20 70 6f  ine which TCP po
09d0: 72 74 20 74 6f 20 6c 69 73 74 65 6e 20 6f 6e 2e  rt to listen on.
09e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 39 29 20 46 6f  .**.**    (9) Fo
09f0: 72 20 73 74 61 74 69 63 20 63 6f 6e 74 65 6e 74  r static content
0a00: 2c 20 74 68 65 20 6d 69 6d 65 74 79 70 65 20 69  , the mimetype i
0a10: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
0a20: 74 68 65 20 66 69 6c 65 20 73 75 66 66 69 78 0a  the file suffix.
0a30: 2a 2a 20 20 20 20 20 20 20 20 75 73 69 6e 67 20  **        using 
0a40: 61 20 74 61 62 6c 65 20 62 75 69 6c 74 20 69 6e  a table built in
0a50: 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f  to the source co
0a60: 64 65 20 62 65 6c 6f 77 2e 20 20 49 66 20 79 6f  de below.  If yo
0a70: 75 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 20 20  u have.**       
0a80: 20 75 6e 75 73 75 61 6c 20 63 6f 6e 74 65 6e 74   unusual content
0a90: 20 66 69 6c 65 73 2c 20 79 6f 75 20 6d 69 67 68   files, you migh
0aa0: 74 20 6e 65 65 64 20 74 6f 20 65 78 74 65 6e 64  t need to extend
0ab0: 20 74 68 69 73 20 74 61 62 6c 65 2e 0a 2a 2a 0a   this table..**.
0ac0: 2a 2a 20 20 20 28 31 30 29 20 43 6f 6e 74 65 6e  **   (10) Conten
0ad0: 74 20 66 69 6c 65 73 20 74 68 61 74 20 65 6e 64  t files that end
0ae0: 20 77 69 74 68 20 22 2e 73 63 67 69 22 20 61 6e   with ".scgi" an
0af0: 64 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 74  d that contain t
0b00: 65 78 74 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20  ext of the.**   
0b10: 20 20 20 20 20 66 6f 72 6d 20 22 53 43 47 49 20       form "SCGI 
0b20: 68 6f 73 74 6e 61 6d 65 20 70 6f 72 74 22 20 77  hostname port" w
0b30: 69 6c 6c 20 66 6f 72 6d 61 74 20 61 6e 20 53 43  ill format an SC
0b40: 47 49 20 72 65 71 75 65 73 74 20 61 6e 64 20 73  GI request and s
0b50: 65 6e 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 20  end it.**       
0b60: 20 74 6f 20 68 6f 73 74 6e 61 6d 65 3a 70 6f 72   to hostname:por
0b70: 74 2c 20 74 68 65 20 72 65 6c 61 79 20 62 61 63  t, the relay bac
0b80: 6b 20 74 68 65 20 72 65 70 6c 79 2e 20 20 45 72  k the reply.  Er
0b90: 72 6f 72 20 62 65 68 61 76 69 6f 72 20 69 73 0a  ror behavior is.
0ba0: 2a 2a 20 20 20 20 20 20 20 20 64 65 74 65 72 6d  **        determ
0bb0: 69 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65  ined by subseque
0bc0: 6e 74 20 6c 69 6e 65 73 20 6f 66 20 74 68 65 20  nt lines of the 
0bd0: 2e 73 63 67 69 20 66 69 6c 65 2e 20 20 53 65 65  .scgi file.  See
0be0: 20 53 43 47 49 20 62 65 6c 6f 77 0a 2a 2a 20 20   SCGI below.**  
0bf0: 20 20 20 20 20 20 66 6f 72 20 64 65 74 61 69 6c        for detail
0c00: 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 6d 61 6e 64  s..**.** Command
0c10: 2d 6c 69 6e 65 20 4f 70 74 69 6f 6e 73 3a 0a 2a  -line Options:.*
0c20: 2a 0a 2a 2a 20 20 2d 2d 72 6f 6f 74 20 44 49 52  *.**  --root DIR
0c30: 20 20 20 20 20 20 20 44 65 66 69 6e 65 73 20 74         Defines t
0c40: 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61  he directory tha
0c50: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  t contains the v
0c60: 61 72 69 6f 75 73 0a 2a 2a 20 20 20 20 20 20 20  arious.**       
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 24 48 4f 53              $HOS
0c80: 54 2e 77 65 62 73 69 74 65 20 73 75 62 64 69 72  T.website subdir
0c90: 65 63 74 6f 72 69 65 73 2c 20 65 61 63 68 20 63  ectories, each c
0ca0: 6f 6e 74 61 69 6e 69 6e 67 20 77 65 62 20 63 6f  ontaining web co
0cb0: 6e 74 65 6e 74 20 0a 2a 2a 20 20 20 20 20 20 20  ntent .**       
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
0cd0: 61 20 73 69 6e 67 6c 65 20 76 69 72 74 75 61 6c  a single virtual
0ce0: 20 68 6f 73 74 2e 20 20 49 66 20 6c 61 75 6e 63   host.  If launc
0cf0: 68 65 64 20 61 73 20 72 6f 6f 74 20 61 6e 64 20  hed as root and 
0d00: 69 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  if.**           
0d10: 20 20 20 20 20 20 20 20 22 2d 2d 75 73 65 72 20          "--user 
0d20: 55 53 45 52 22 20 61 6c 73 6f 20 61 70 70 65 61  USER" also appea
0d30: 72 73 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e  rs on the comman
0d40: 64 2d 6c 69 6e 65 20 61 6e 64 20 69 66 0a 2a 2a  d-line and if.**
0d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d60: 20 20 20 22 2d 2d 6a 61 69 6c 20 30 22 20 69 73     "--jail 0" is
0d70: 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74   omitted, then t
0d80: 68 65 20 70 72 6f 63 65 73 73 20 72 75 6e 73 20  he process runs 
0d90: 69 6e 20 61 20 63 68 72 6f 6f 74 0a 2a 2a 20 20  in a chroot.**  
0da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0db0: 20 6a 61 69 6c 20 72 6f 6f 74 65 64 20 61 74 20   jail rooted at 
0dc0: 74 68 69 73 20 64 69 72 65 63 74 6f 72 79 20 61  this directory a
0dd0: 6e 64 20 75 6e 64 65 72 20 74 68 65 20 75 73 65  nd under the use
0de0: 72 69 64 20 55 53 45 52 2e 0a 2a 2a 20 20 20 20  rid USER..**    
0df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
0e00: 68 69 73 20 6f 70 74 69 6f 6e 20 69 73 20 72 65  his option is re
0e10: 71 75 69 72 65 64 20 66 6f 72 20 78 69 6e 65 74  quired for xinet
0e20: 64 20 6c 61 75 6e 63 68 20 62 75 74 20 64 65 66  d launch but def
0e30: 61 75 6c 74 73 0a 2a 2a 20 20 20 20 20 20 20 20  aults.**        
0e40: 20 20 20 20 20 20 20 20 20 20 20 74 6f 20 22 2e             to ".
0e50: 22 20 66 6f 72 20 61 20 73 74 61 6e 64 2d 61 6c  " for a stand-al
0e60: 6f 6e 65 20 77 65 62 20 73 65 72 76 65 72 2e 0a  one web server..
0e70: 2a 2a 0a 2a 2a 20 20 2d 2d 70 6f 72 74 20 4e 20  **.**  --port N 
0e80: 20 20 20 20 20 20 20 20 52 75 6e 20 69 6e 20 73          Run in s
0e90: 74 61 6e 64 61 6c 6f 6e 65 20 6d 6f 64 65 20 6c  tandalone mode l
0ea0: 69 73 74 65 6e 69 6e 67 20 6f 6e 20 54 43 50 20  istening on TCP 
0eb0: 70 6f 72 74 20 4e 0a 2a 2a 0a 2a 2a 20 20 2d 2d  port N.**.**  --
0ec0: 75 73 65 72 20 55 53 45 52 20 20 20 20 20 20 44  user USER      D
0ed0: 65 66 69 6e 65 20 74 68 65 20 75 73 65 72 20 75  efine the user u
0ee0: 6e 64 65 72 20 77 68 69 63 68 20 74 68 65 20 70  nder which the p
0ef0: 72 6f 63 65 73 73 20 73 68 6f 75 6c 64 20 72 75  rocess should ru
0f00: 6e 20 69 66 0a 2a 2a 20 20 20 20 20 20 20 20 20  n if.**         
0f10: 20 20 20 20 20 20 20 20 20 20 6f 72 69 67 69 6e            origin
0f20: 61 6c 6c 79 20 6c 61 75 6e 63 68 65 64 20 61 73  ally launched as
0f30: 20 72 6f 6f 74 2e 20 20 54 68 69 73 20 70 72 6f   root.  This pro
0f40: 63 65 73 73 20 77 69 6c 6c 20 72 65 66 75 73 65  cess will refuse
0f50: 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   to.**          
0f60: 20 20 20 20 20 20 20 20 20 72 75 6e 20 61 73 20           run as 
0f70: 72 6f 6f 74 20 28 66 6f 72 20 73 65 63 75 72 69  root (for securi
0f80: 74 79 29 2e 20 20 49 66 20 74 68 69 73 20 6f 70  ty).  If this op
0f90: 74 69 6f 6e 20 69 73 20 6f 6d 69 74 74 65 64 20  tion is omitted 
0fa0: 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
0fb0: 20 20 20 20 20 20 20 20 20 74 68 65 20 70 72 6f           the pro
0fc0: 63 65 73 73 20 69 73 20 6c 61 75 6e 63 68 65 64  cess is launched
0fd0: 20 61 73 20 72 6f 6f 74 2c 20 69 74 20 77 69 6c   as root, it wil
0fe0: 6c 20 61 62 6f 72 74 20 77 69 74 68 6f 75 74 0a  l abort without.
0ff0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1000: 20 20 20 20 20 70 72 6f 63 65 73 73 69 6e 67 20       processing 
1010: 61 6e 79 20 48 54 54 50 20 72 65 71 75 65 73 74  any HTTP request
1020: 73 2e 0a 2a 2a 0a 2a 2a 20 20 2d 2d 6c 6f 67 66  s..**.**  --logf
1030: 69 6c 65 20 46 49 4c 45 20 20 20 41 70 70 65 6e  ile FILE   Appen
1040: 64 20 61 20 73 69 6e 67 6c 65 2d 6c 69 6e 65 2c  d a single-line,
1050: 20 43 53 56 2d 66 6f 72 6d 61 74 2c 20 6c 6f 67   CSV-format, log
1060: 20 66 69 6c 65 20 65 6e 74 72 79 20 74 6f 20 46   file entry to F
1070: 49 4c 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ILE.**          
1080: 20 20 20 20 20 20 20 20 20 66 6f 72 20 65 61 63           for eac
1090: 68 20 48 54 54 50 20 72 65 71 75 65 73 74 2e 20  h HTTP request. 
10a0: 20 46 49 4c 45 20 73 68 6f 75 6c 64 20 62 65 20   FILE should be 
10b0: 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e  a full pathname.
10c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
10d0: 20 20 20 20 20 20 54 68 65 20 46 49 4c 45 20 6e        The FILE n
10e0: 61 6d 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  ame is interpret
10f0: 65 64 20 69 6e 73 69 64 65 20 74 68 65 20 63 68  ed inside the ch
1100: 72 6f 6f 74 20 6a 61 69 6c 2e 20 20 54 68 65 0a  root jail.  The.
1110: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1120: 20 20 20 20 20 46 49 4c 45 20 6e 61 6d 65 20 69       FILE name i
1130: 73 20 65 78 70 61 6e 64 65 64 20 75 73 69 6e 67  s expanded using
1140: 20 73 74 72 66 74 69 6d 65 28 29 20 69 66 20 69   strftime() if i
1150: 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 20 20  t contains.**   
1160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1170: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 27 25 27  at least one '%'
1180: 20 61 6e 64 20 69 73 20 6e 6f 74 20 74 6f 6f 20   and is not too 
1190: 6c 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 2d 2d 68  long..**.**  --h
11a0: 74 74 70 73 20 20 20 20 20 20 20 20 20 20 49 6e  ttps          In
11b0: 64 69 63 61 74 65 73 20 74 68 61 74 20 69 6e 70  dicates that inp
11c0: 75 74 20 69 73 20 63 6f 6d 69 6e 67 20 6f 76 65  ut is coming ove
11d0: 72 20 53 53 4c 20 61 6e 64 20 69 73 20 62 65 69  r SSL and is bei
11e0: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ng.**           
11f0: 20 20 20 20 20 20 20 20 64 65 63 6f 64 65 64 20          decoded 
1200: 75 70 73 74 72 65 61 6d 2c 20 70 65 72 68 61 70  upstream, perhap
1210: 73 20 62 79 20 73 74 75 6e 6e 65 6c 2e 20 20 28  s by stunnel.  (
1220: 54 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  This program.** 
1230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1240: 20 20 6f 6e 6c 79 20 75 6e 64 65 72 73 74 61 6e    only understan
1250: 64 73 20 70 6c 61 69 6e 74 65 78 74 2e 29 0a 2a  ds plaintext.).*
1260: 2a 0a 2a 2a 20 20 2d 2d 66 61 6d 69 6c 79 20 69  *.**  --family i
1270: 70 76 34 20 20 20 20 4f 6e 6c 79 20 61 63 63 65  pv4    Only acce
1280: 70 74 20 69 6e 70 75 74 20 66 72 6f 6d 20 49 50  pt input from IP
1290: 56 34 20 6f 72 20 49 50 56 36 2c 20 72 65 73 70  V4 or IPV6, resp
12a0: 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 20 2d 2d  ectively..**  --
12b0: 66 61 6d 69 6c 79 20 69 70 76 36 20 20 20 20 54  family ipv6    T
12c0: 68 65 73 65 20 6f 70 74 69 6f 6e 73 20 61 72 65  hese options are
12d0: 20 6f 6e 6c 79 20 6d 65 61 6e 69 6e 67 66 75 6c   only meaningful
12e0: 20 69 66 20 61 6c 74 68 74 74 70 64 20 69 73 20   if althttpd is 
12f0: 72 75 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  run.**          
1300: 20 20 20 20 20 20 20 20 20 61 73 20 61 20 73 74           as a st
1310: 61 6e 64 2d 61 6c 6f 6e 65 20 73 65 72 76 65 72  and-alone server
1320: 2e 0a 2a 2a 0a 2a 2a 20 20 2d 2d 6a 61 69 6c 20  ..**.**  --jail 
1330: 42 4f 4f 4c 45 41 4e 20 20 20 49 6e 64 69 63 61  BOOLEAN   Indica
1340: 74 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e  tes whether or n
1350: 6f 74 20 74 6f 20 66 6f 72 6d 20 61 20 63 68 72  ot to form a chr
1360: 6f 6f 74 20 6a 61 69 6c 20 69 66 20 0a 2a 2a 20  oot jail if .** 
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1380: 20 20 69 6e 69 74 69 61 6c 6c 79 20 72 75 6e 20    initially run 
1390: 61 73 20 72 6f 6f 74 2e 20 20 54 68 65 20 64 65  as root.  The de
13a0: 66 61 75 6c 74 20 69 73 20 74 72 75 65 2c 20 73  fault is true, s
13b0: 6f 20 74 68 65 20 6f 6e 6c 79 0a 2a 2a 20 20 20  o the only.**   
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d0: 75 73 65 66 75 6c 20 76 61 72 69 61 6e 74 20 6f  useful variant o
13e0: 66 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 69 73  f this option is
13f0: 20 22 2d 2d 6a 61 69 6c 20 30 22 20 77 68 69 63   "--jail 0" whic
1400: 68 20 70 72 65 76 65 6e 74 73 0a 2a 2a 20 20 20  h prevents.**   
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 74 68 65 20 66 6f 72 6d 61 74 69 6f 6e 20 6f 66  the formation of
1430: 20 74 68 65 20 63 68 72 6f 6f 74 20 6a 61 69 6c   the chroot jail
1440: 2e 0a 2a 2a 0a 2a 2a 20 20 2d 2d 6d 61 78 2d 61  ..**.**  --max-a
1450: 67 65 20 53 45 43 20 20 20 20 54 68 65 20 76 61  ge SEC    The va
1460: 6c 75 65 20 66 6f 72 20 22 43 61 63 68 65 2d 43  lue for "Cache-C
1470: 6f 6e 74 72 6f 6c 3a 20 6d 61 78 2d 61 67 65 3d  ontrol: max-age=
1480: 25 64 22 2e 20 20 44 65 66 61 75 6c 74 73 20 74  %d".  Defaults t
1490: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
14a0: 20 20 20 20 20 20 20 31 32 30 20 73 65 63 6f 6e         120 secon
14b0: 64 73 2e 0a 2a 2a 0a 2a 2a 20 20 2d 2d 64 65 62  ds..**.**  --deb
14c0: 75 67 20 20 20 20 20 20 20 20 20 20 44 69 73 61  ug          Disa
14d0: 62 6c 65 73 20 69 6e 70 75 74 20 74 69 6d 65 6f  bles input timeo
14e0: 75 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  uts.  This is us
14f0: 65 66 75 6c 20 66 6f 72 20 64 65 62 75 67 67 69  eful for debuggi
1500: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ng.**           
1510: 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 6e 70          when inp
1520: 75 74 73 20 69 73 20 62 65 69 6e 67 20 74 79 70  uts is being typ
1530: 65 64 20 69 6e 20 6d 61 6e 75 61 6c 6c 79 2e 0a  ed in manually..
1540: 2a 2a 0a 2a 2a 20 43 6f 6d 6d 61 6e 64 2d 6c 69  **.** Command-li
1550: 6e 65 20 6f 70 74 69 6f 6e 73 20 63 61 6e 20 74  ne options can t
1560: 61 6b 65 20 65 69 74 68 65 72 20 6f 6e 65 20 6f  ake either one o
1570: 72 20 74 77 6f 20 69 6e 69 74 69 61 6c 20 22 2d  r two initial "-
1580: 22 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a  " characters..**
1590: 20 53 6f 20 22 2d 2d 64 65 62 75 67 22 20 61 6e   So "--debug" an
15a0: 64 20 22 2d 64 65 62 75 67 22 20 6d 65 61 6e 20  d "-debug" mean 
15b0: 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2c 20  the same thing, 
15c0: 66 6f 72 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 0a  for example..**.
15d0: 2a 2a 0a 2a 2a 20 53 65 63 75 72 69 74 79 20 46  **.** Security F
15e0: 65 61 74 75 72 65 73 3a 0a 2a 2a 0a 2a 2a 20 28  eatures:.**.** (
15f0: 31 29 20 20 54 68 69 73 20 70 72 6f 67 72 61 6d  1)  This program
1600: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 70   automatically p
1610: 75 74 73 20 69 74 73 65 6c 66 20 69 6e 73 69 64  uts itself insid
1620: 65 20 61 20 63 68 72 6f 6f 74 20 6a 61 69 6c 20  e a chroot jail 
1630: 69 66 0a 2a 2a 20 20 20 20 20 20 69 74 20 63 61  if.**      it ca
1640: 6e 20 61 6e 64 20 69 66 20 6e 6f 74 20 73 70 65  n and if not spe
1650: 63 69 66 69 63 61 6c 6c 79 20 70 72 6f 68 69 62  cifically prohib
1660: 69 74 65 64 20 62 79 20 74 68 65 20 22 2d 2d 6a  ited by the "--j
1670: 61 69 6c 20 30 22 0a 2a 2a 20 20 20 20 20 20 63  ail 0".**      c
1680: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69  ommand-line opti
1690: 6f 6e 2e 20 20 54 68 65 20 72 6f 6f 74 20 6f 66  on.  The root of
16a0: 20 74 68 65 20 6a 61 69 6c 20 69 73 20 74 68 65   the jail is the
16b0: 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 0a   directory that.
16c0: 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 73  **      contains
16d0: 20 74 68 65 20 76 61 72 69 6f 75 73 20 24 48 4f   the various $HO
16e0: 53 54 2e 77 65 62 73 69 74 65 20 63 6f 6e 74 65  ST.website conte
16f0: 6e 74 20 73 75 62 64 69 72 65 63 74 6f 72 69 65  nt subdirectorie
1700: 73 2e 0a 2a 2a 0a 2a 2a 20 28 32 29 20 20 4e 6f  s..**.** (2)  No
1710: 20 69 6e 70 75 74 20 69 73 20 72 65 61 64 20 77   input is read w
1720: 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
1730: 73 20 68 61 73 20 72 6f 6f 74 20 70 72 69 76 69  s has root privi
1740: 6c 65 67 65 73 2e 20 20 52 6f 6f 74 0a 2a 2a 20  leges.  Root.** 
1750: 20 20 20 20 20 70 72 69 76 69 6c 65 67 65 73 20       privileges 
1760: 61 72 65 20 64 72 6f 70 70 65 64 20 70 72 69 6f  are dropped prio
1770: 72 20 74 6f 20 72 65 61 64 69 6e 67 20 61 6e 79  r to reading any
1780: 20 69 6e 70 75 74 20 28 62 75 74 20 61 66 74 65   input (but afte
1790: 72 20 65 6e 74 65 72 69 6e 67 0a 2a 2a 20 20 20  r entering.**   
17a0: 20 20 20 74 68 65 20 63 68 72 6f 6f 74 20 6a 61     the chroot ja
17b0: 69 6c 2c 20 6f 66 20 63 6f 75 72 73 65 29 2e 20  il, of course). 
17c0: 20 49 66 20 72 6f 6f 74 20 70 72 69 76 69 6c 65   If root privile
17d0: 67 65 73 20 63 61 6e 6e 6f 74 20 62 65 20 64 72  ges cannot be dr
17e0: 6f 70 70 65 64 0a 2a 2a 20 20 20 20 20 20 28 66  opped.**      (f
17f0: 6f 72 20 65 78 61 6d 70 6c 65 20 62 65 63 61 75  or example becau
1800: 73 65 20 74 68 65 20 2d 2d 75 73 65 72 20 63 6f  se the --user co
1810: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f  mmand-line optio
1820: 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 20 6f 72  n was omitted or
1830: 0a 2a 2a 20 20 20 20 20 20 62 65 63 61 75 73 65  .**      because
1840: 20 74 68 65 20 75 73 65 72 20 73 70 65 63 69 66   the user specif
1850: 69 65 64 20 62 79 20 74 68 65 20 2d 2d 75 73 65  ied by the --use
1860: 72 20 6f 70 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  r option does no
1870: 74 20 65 78 69 73 74 29 2c 20 0a 2a 2a 20 20 20  t exist), .**   
1880: 20 20 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63     then the proc
1890: 65 73 73 20 61 62 6f 72 74 73 20 77 69 74 68 20  ess aborts with 
18a0: 61 6e 20 65 72 72 6f 72 20 70 72 69 6f 72 20 74  an error prior t
18b0: 6f 20 72 65 61 64 69 6e 67 20 61 6e 79 20 69 6e  o reading any in
18c0: 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20 20  put..**.** (3)  
18d0: 54 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 61 6e  The length of an
18e0: 20 48 54 54 50 20 72 65 71 75 65 73 74 20 69 73   HTTP request is
18f0: 20 6c 69 6d 69 74 65 64 20 74 6f 20 4d 41 58 5f   limited to MAX_
1900: 43 4f 4e 54 45 4e 54 5f 4c 45 4e 47 54 48 20 62  CONTENT_LENGTH b
1910: 79 74 65 73 0a 2a 2a 20 20 20 20 20 20 28 64 65  ytes.**      (de
1920: 66 61 75 6c 74 3a 20 32 35 30 20 6d 69 6c 6c 69  fault: 250 milli
1930: 6f 6e 29 2e 20 20 41 6e 79 20 48 54 54 50 20 72  on).  Any HTTP r
1940: 65 71 75 65 73 74 20 6c 6f 6e 67 65 72 20 74 68  equest longer th
1950: 61 6e 20 74 68 69 73 20 66 61 69 6c 73 0a 2a 2a  an this fails.**
1960: 20 20 20 20 20 20 77 69 74 68 20 61 6e 20 65 72        with an er
1970: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 28 34 29 20 20  ror..**.** (4)  
1980: 54 68 65 72 65 20 61 72 65 20 68 61 72 64 2d 63  There are hard-c
1990: 6f 64 65 64 20 74 69 6d 65 2d 6f 75 74 73 20 6f  oded time-outs o
19a0: 6e 20 65 61 63 68 20 48 54 54 50 20 72 65 71 75  n each HTTP requ
19b0: 65 73 74 2e 20 20 49 66 20 74 68 69 73 20 70 72  est.  If this pr
19c0: 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 77 61  ocess.**      wa
19d0: 69 74 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20  its longer than 
19e0: 74 68 65 20 74 69 6d 65 6f 75 74 20 66 6f 72 20  the timeout for 
19f0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 72 65 71  the complete req
1a00: 75 65 73 74 2c 20 6f 72 20 66 6f 72 20 43 47 49  uest, or for CGI
1a10: 0a 2a 2a 20 20 20 20 20 20 74 6f 20 66 69 6e 69  .**      to fini
1a20: 73 68 20 72 75 6e 6e 69 6e 67 2c 20 74 68 65 6e  sh running, then
1a30: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 61 62   this process ab
1a40: 6f 72 74 73 2e 20 20 28 54 68 65 20 74 69 6d 65  orts.  (The time
1a50: 6f 75 74 20 66 65 61 74 75 72 65 0a 2a 2a 20 20  out feature.**  
1a60: 20 20 20 20 63 61 6e 20 62 65 20 64 69 73 61 62      can be disab
1a70: 6c 65 64 20 75 73 69 6e 67 20 74 68 65 20 2d 2d  led using the --
1a80: 64 65 62 75 67 20 63 6f 6d 6d 61 6e 64 2d 6c 69  debug command-li
1a90: 6e 65 20 6f 70 74 69 6f 6e 2e 29 0a 2a 2a 0a 2a  ne option.).**.*
1aa0: 2a 20 28 35 29 20 20 49 66 20 74 68 65 20 48 54  * (5)  If the HT
1ab0: 54 50 5f 48 4f 53 54 20 72 65 71 75 65 73 74 20  TP_HOST request 
1ac0: 68 65 61 64 65 72 20 63 6f 6e 74 61 69 6e 73 20  header contains 
1ad0: 63 68 61 72 61 63 74 65 72 73 20 6f 74 68 65 72  characters other
1ae0: 20 74 68 61 6e 0a 2a 2a 20 20 20 20 20 20 5b 30   than.**      [0
1af0: 2d 39 61 2d 7a 41 2d 5a 2c 2d 2e 2f 3a 5f 7e 5d  -9a-zA-Z,-./:_~]
1b00: 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65   then the entire
1b10: 20 72 65 71 75 65 73 74 20 69 73 20 72 65 6a 65   request is reje
1b20: 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 28 36 29 20  cted..**.** (6) 
1b30: 20 41 6e 79 20 63 68 61 72 61 63 74 65 72 73 20   Any characters 
1b40: 69 6e 20 74 68 65 20 55 52 49 20 70 61 74 68 6e  in the URI pathn
1b50: 61 6d 65 20 6f 74 68 65 72 20 74 68 61 6e 20 5b  ame other than [
1b60: 30 2d 39 61 2d 7a 41 2d 5a 2c 2d 2e 2f 3a 5f 7e  0-9a-zA-Z,-./:_~
1b70: 5d 0a 2a 2a 20 20 20 20 20 20 61 72 65 20 63 6f  ].**      are co
1b80: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 22 5f 22  nverted into "_"
1b90: 2e 20 20 54 68 69 73 20 61 70 70 6c 69 65 73 20  .  This applies 
1ba0: 74 6f 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20  to the pathname 
1bb0: 6f 6e 6c 79 2c 20 6e 6f 74 0a 2a 2a 20 20 20 20  only, not.**    
1bc0: 20 20 74 6f 20 74 68 65 20 71 75 65 72 79 20 70    to the query p
1bd0: 61 72 61 6d 65 74 65 72 73 20 6f 72 20 66 72 61  arameters or fra
1be0: 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 28 37 29  gment..**.** (7)
1bf0: 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20 63    If the first c
1c00: 68 61 72 61 63 74 65 72 20 6f 66 20 61 6e 79 20  haracter of any 
1c10: 55 52 49 20 70 61 74 68 6e 61 6d 65 20 63 6f 6d  URI pathname com
1c20: 70 6f 6e 65 6e 74 20 69 73 20 22 2e 22 20 6f 72  ponent is "." or
1c30: 20 22 2d 22 0a 2a 2a 20 20 20 20 20 20 74 68 65   "-".**      the
1c40: 6e 20 61 20 34 30 34 20 4e 6f 74 20 46 6f 75 6e  n a 404 Not Foun
1c50: 64 20 72 65 70 6c 79 20 69 73 20 67 65 6e 65 72  d reply is gener
1c60: 61 74 65 64 2e 20 20 54 68 69 73 20 70 72 65 76  ated.  This prev
1c70: 65 6e 74 73 20 61 74 74 61 63 6b 73 0a 2a 2a 20  ents attacks.** 
1c80: 20 20 20 20 20 73 75 63 68 20 61 73 20 69 6e 63       such as inc
1c90: 6c 75 64 69 6e 67 20 22 2e 2e 22 20 6f 72 20 22  luding ".." or "
1ca0: 2e 22 20 64 69 72 65 63 74 6f 72 79 20 65 6c 65  ." directory ele
1cb0: 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 70 61 74  ments in the pat
1cc0: 68 6e 61 6d 65 0a 2a 2a 20 20 20 20 20 20 61 6e  hname.**      an
1cd0: 64 20 61 6c 6c 6f 77 73 20 70 6c 61 63 69 6e 67  d allows placing
1ce0: 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63   files and direc
1cf0: 74 6f 72 69 65 73 20 69 6e 20 74 68 65 20 63 6f  tories in the co
1d00: 6e 74 65 6e 74 20 73 75 62 64 69 72 65 63 74 6f  ntent subdirecto
1d10: 72 79 0a 2a 2a 20 20 20 20 20 20 74 68 61 74 20  ry.**      that 
1d20: 61 72 65 20 69 6e 76 69 73 69 62 6c 65 20 74 6f  are invisible to
1d30: 20 61 6c 6c 20 48 54 54 50 20 72 65 71 75 65 73   all HTTP reques
1d40: 74 73 2c 20 62 79 20 6d 61 6b 69 6e 67 20 74 68  ts, by making th
1d50: 65 20 66 69 72 73 74 20 0a 2a 2a 20 20 20 20 20  e first .**     
1d60: 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
1d70: 65 20 66 69 6c 65 20 6f 72 20 73 75 62 64 69 72  e file or subdir
1d80: 65 63 74 6f 72 79 20 6e 61 6d 65 20 22 2d 22 20  ectory name "-" 
1d90: 6f 72 20 22 2e 22 2e 0a 2a 2a 0a 2a 2a 20 28 38  or "."..**.** (8
1da0: 29 20 20 54 68 65 20 72 65 71 75 65 73 74 20 55  )  The request U
1db0: 52 49 20 6d 75 73 74 20 62 65 67 69 6e 20 77 69  RI must begin wi
1dc0: 74 68 20 22 2f 22 20 6f 72 20 65 6c 73 65 20 61  th "/" or else a
1dd0: 20 34 30 34 20 65 72 72 6f 72 20 69 73 20 67 65   404 error is ge
1de0: 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 28  nerated..**.** (
1df0: 39 29 20 20 54 68 69 73 20 70 72 6f 67 72 61 6d  9)  This program
1e00: 20 6e 65 76 65 72 20 73 65 74 73 20 74 68 65 20   never sets the 
1e10: 76 61 6c 75 65 20 6f 66 20 61 6e 20 65 6e 76 69  value of an envi
1e20: 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
1e30: 20 74 6f 20 61 0a 2a 2a 20 20 20 20 20 20 73 74   to a.**      st
1e40: 72 69 6e 67 20 74 68 61 74 20 62 65 67 69 6e 73  ring that begins
1e50: 20 77 69 74 68 20 22 28 29 20 7b 22 2e 0a 2a 2a   with "() {"..**
1e60: 0a 2a 2a 20 53 65 63 75 72 69 74 79 20 41 75 64  .** Security Aud
1e70: 69 74 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 54 68 69  iting:.**.** Thi
1e80: 73 20 77 65 62 73 65 72 76 65 72 20 6d 6f 73 74  s webserver most
1e90: 6c 79 20 6f 6e 6c 79 20 73 65 72 76 65 73 20 73  ly only serves s
1ea0: 74 61 74 69 63 20 63 6f 6e 74 65 6e 74 2e 20 20  tatic content.  
1eb0: 41 6e 79 20 73 65 63 75 72 69 74 79 20 72 69 73  Any security ris
1ec0: 6b 20 77 69 6c 6c 0a 2a 2a 20 63 6f 6d 65 20 66  k will.** come f
1ed0: 72 6f 6d 20 43 47 49 20 61 6e 64 20 53 43 47 49  rom CGI and SCGI
1ee0: 2e 20 20 54 6f 20 63 68 65 63 6b 20 61 6e 20 69  .  To check an i
1ef0: 6e 73 74 61 6c 6c 61 74 69 6f 6e 20 66 6f 72 20  nstallation for 
1f00: 73 65 63 75 72 69 74 79 2c 20 74 68 65 6e 2c 20  security, then, 
1f10: 69 74 0a 2a 2a 20 6d 61 6b 65 73 20 73 65 6e 73  it.** makes sens
1f20: 65 20 74 6f 20 66 6f 63 75 73 20 6f 6e 20 74 68  e to focus on th
1f30: 65 20 43 47 49 20 61 6e 64 20 53 43 47 49 20 73  e CGI and SCGI s
1f40: 63 72 69 70 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  cripts..**.** To
1f50: 20 6c 6f 63 61 6c 20 61 6c 6c 20 43 47 49 20 66   local all CGI f
1f60: 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iles:.**.**     
1f70: 20 20 20 20 20 66 69 6e 64 20 2a 2e 77 65 62 73       find *.webs
1f80: 69 74 65 20 2d 65 78 65 63 75 74 61 62 6c 65 20  ite -executable 
1f90: 2d 74 79 70 65 20 66 20 2d 70 72 69 6e 74 0a 2a  -type f -print.*
1fa0: 2a 20 20 20 20 20 4f 52 3a 20 20 66 69 6e 64 20  *     OR:  find 
1fb0: 2a 2e 77 65 62 73 69 74 65 20 2d 70 65 72 6d 20  *.website -perm 
1fc0: 2b 30 31 31 31 20 2d 74 79 70 65 20 66 20 2d 70  +0111 -type f -p
1fd0: 72 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  rint.**.** The f
1fe0: 69 72 73 74 20 66 6f 72 6d 20 6f 66 20 74 68 65  irst form of the
1ff0: 20 22 66 69 6e 64 22 20 63 6f 6d 6d 61 6e 64 20   "find" command 
2000: 69 73 20 70 72 65 66 65 72 72 65 64 2c 20 62 75  is preferred, bu
2010: 74 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72  t is only suppor
2020: 74 65 64 0a 2a 2a 20 62 79 20 47 4e 55 20 66 69  ted.** by GNU fi
2030: 6e 64 2e 20 20 4f 6e 20 61 20 4d 61 63 2c 20 79  nd.  On a Mac, y
2040: 6f 75 27 6c 6c 20 68 61 76 65 20 74 6f 20 75 73  ou'll have to us
2050: 65 20 74 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  e the second for
2060: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 66 69 6e 64  m..**.** To find
2070: 20 61 6c 6c 20 53 43 47 49 20 66 69 6c 65 73 3a   all SCGI files:
2080: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
2090: 66 69 6e 64 20 2a 2e 77 65 62 73 69 74 65 20 2d  find *.website -
20a0: 6e 61 6d 65 20 27 2a 2e 73 63 67 69 27 20 2d 74  name '*.scgi' -t
20b0: 79 70 65 20 66 20 2d 70 72 69 6e 74 0a 2a 2a 0a  ype f -print.**.
20c0: 2a 2a 20 49 66 20 61 6e 79 20 66 69 6c 65 20 69  ** If any file i
20d0: 73 20 61 20 73 65 63 75 72 69 74 79 20 63 6f 6e  s a security con
20e0: 63 65 72 6e 2c 20 69 74 20 63 61 6e 20 62 65 20  cern, it can be 
20f0: 64 69 73 61 62 6c 65 64 20 6f 6e 20 61 20 6c 69  disabled on a li
2100: 76 65 0a 2a 2a 20 69 6e 73 74 61 6c 6c 61 74 69  ve.** installati
2110: 6f 6e 20 62 79 20 74 75 72 6e 69 6e 67 20 6f 66  on by turning of
2120: 66 20 72 65 61 64 20 70 65 72 6d 69 73 73 69 6f  f read permissio
2130: 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ns:.**.**       
2140: 20 20 20 63 68 6d 6f 64 20 30 30 30 30 20 66 69     chmod 0000 fi
2150: 6c 65 2d 6f 66 2d 63 6f 6e 63 65 72 6e 0a 2a 2a  le-of-concern.**
2160: 0a 2a 2a 20 53 43 47 49 20 53 70 65 63 69 66 69  .** SCGI Specifi
2170: 63 61 74 69 6f 6e 20 46 69 6c 65 73 3a 0a 2a 2a  cation Files:.**
2180: 0a 2a 2a 20 43 6f 6e 74 65 6e 74 20 66 69 6c 65  .** Content file
2190: 73 20 28 66 69 6c 65 73 20 77 69 74 68 6f 75 74  s (files without
21a0: 20 74 68 65 20 65 78 65 63 75 74 65 20 62 69 74   the execute bit
21b0: 20 73 65 74 29 20 74 68 61 74 20 65 6e 64 20 77   set) that end w
21c0: 69 74 68 20 22 2e 73 63 67 69 22 0a 2a 2a 20 73  ith ".scgi".** s
21d0: 70 65 63 69 66 79 20 61 20 63 6f 6e 6e 65 63 74  pecify a connect
21e0: 69 6f 6e 20 74 6f 20 61 6e 20 53 43 47 49 20 73  ion to an SCGI s
21f0: 65 72 76 65 72 2e 20 20 54 68 65 20 66 6f 72 6d  erver.  The form
2200: 61 74 20 6f 66 20 74 68 65 20 2e 73 63 67 69 20  at of the .scgi 
2210: 66 69 6c 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 20  file.** follows 
2220: 74 68 69 73 20 74 65 6d 70 6c 61 74 65 3a 0a 2a  this template:.*
2230: 2a 0a 2a 2a 20 20 20 20 20 20 53 43 47 49 20 68  *.**      SCGI h
2240: 6f 73 74 6e 61 6d 65 20 70 6f 72 74 0a 2a 2a 20  ostname port.** 
2250: 20 20 20 20 20 66 61 6c 6c 62 61 63 6b 3a 20 66       fallback: f
2260: 61 6c 6c 62 61 63 6b 2d 66 69 6c 65 6e 61 6d 65  allback-filename
2270: 0a 2a 2a 20 20 20 20 20 20 72 65 6c 69 67 68 74  .**      relight
2280: 3a 20 72 65 6c 69 67 68 74 2d 63 6f 6d 6d 61 6e  : relight-comman
2290: 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  d.**.** The firs
22a0: 74 20 6c 69 6e 65 20 73 70 65 63 69 66 69 65 73  t line specifies
22b0: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 61 6e   the location an
22c0: 64 20 54 43 50 2f 49 50 20 70 6f 72 74 20 6f 66  d TCP/IP port of
22d0: 20 74 68 65 20 53 43 47 49 20 73 65 72 76 65 72   the SCGI server
22e0: 0a 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 68 61  .** that will ha
22f0: 6e 64 6c 65 20 74 68 65 20 72 65 71 75 65 73 74  ndle the request
2300: 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 6c 69  .  Subsequent li
2310: 6e 65 73 20 64 65 74 65 72 6d 69 6e 65 20 77 68  nes determine wh
2320: 61 74 20 74 6f 20 64 6f 20 69 66 0a 2a 2a 20 74  at to do if.** t
2330: 68 65 20 53 43 47 49 20 73 65 72 76 65 72 20 63  he SCGI server c
2340: 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 74 61 63 74  annot be contact
2350: 65 64 2e 20 20 49 66 20 74 68 65 20 22 72 65 6c  ed.  If the "rel
2360: 69 67 68 74 3a 22 20 6c 69 6e 65 20 69 73 20 70  ight:" line is p
2370: 72 65 73 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20  resent,.** then 
2380: 74 68 65 20 72 65 6c 69 67 68 74 2d 63 6f 6d 6d  the relight-comm
2390: 61 6e 64 20 69 73 20 72 75 6e 20 75 73 69 6e 67  and is run using
23a0: 20 73 79 73 74 65 6d 28 29 20 61 6e 64 20 74 68   system() and th
23b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 0a  e connection is.
23c0: 2a 2a 20 72 65 74 72 69 65 64 20 61 66 74 65 72  ** retried after
23d0: 20 61 20 31 2d 73 65 63 6f 6e 64 20 64 65 6c 61   a 1-second dela
23e0: 79 2e 20 20 55 73 65 20 22 26 22 20 61 74 20 74  y.  Use "&" at t
23f0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 65  he end of the re
2400: 6c 69 67 68 74 2d 63 6f 6d 6d 61 6e 64 0a 2a 2a  light-command.**
2410: 20 74 6f 20 72 75 6e 20 69 74 20 69 6e 20 74 68   to run it in th
2420: 65 20 62 61 63 6b 67 72 6f 75 6e 64 2e 20 20 4d  e background.  M
2430: 61 6b 65 20 73 75 72 65 20 74 68 65 20 72 65 6c  ake sure the rel
2440: 69 67 68 74 2d 63 6f 6d 6d 61 6e 64 20 64 6f 65  ight-command doe
2450: 73 20 6e 6f 74 0a 2a 2a 20 73 65 6e 64 20 67 65  s not.** send ge
2460: 6e 65 72 61 74 65 20 6f 75 74 70 75 74 2c 20 6f  nerate output, o
2470: 72 20 74 68 61 74 20 6f 75 74 70 75 74 20 77 69  r that output wi
2480: 6c 6c 20 62 65 63 6f 6d 65 20 70 61 72 74 20 6f  ll become part o
2490: 66 20 74 68 65 20 53 43 47 49 20 72 65 70 6c 79  f the SCGI reply
24a0: 2e 0a 2a 2a 20 41 64 64 20 61 20 22 3e 2f 64 65  ..** Add a ">/de
24b0: 76 2f 6e 75 6c 6c 22 20 73 75 66 66 69 78 20 28  v/null" suffix (
24c0: 62 65 66 6f 72 65 20 74 68 65 20 22 26 22 29 20  before the "&") 
24d0: 74 6f 20 74 68 65 20 72 65 6c 69 67 68 74 2d 63  to the relight-c
24e0: 6f 6d 6d 61 6e 64 20 69 66 0a 2a 2a 20 6e 65 63  ommand if.** nec
24f0: 65 73 73 61 72 79 20 74 6f 20 73 75 70 70 72 65  essary to suppre
2500: 73 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 74  ss output.  If t
2510: 68 65 72 65 20 69 73 20 6e 6f 20 72 65 6c 69 67  here is no relig
2520: 68 74 2d 63 6f 6d 6d 61 6e 64 2c 20 6f 72 20 69  ht-command, or i
2530: 66 20 74 68 65 0a 2a 2a 20 72 65 6c 69 67 68 74  f the.** relight
2540: 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 62 75   is attempted bu
2550: 74 20 74 68 65 20 53 43 47 49 20 73 65 72 76 65  t the SCGI serve
2560: 72 20 73 74 69 6c 6c 20 63 61 6e 6e 6f 74 20 62  r still cannot b
2570: 65 20 63 6f 6e 74 61 63 74 65 64 2c 20 74 68 65  e contacted, the
2580: 6e 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  n.** the content
2590: 20 6f 66 20 74 68 65 20 66 61 6c 6c 62 61 63 6b   of the fallback
25a0: 2d 66 69 6c 65 6e 61 6d 65 20 66 69 6c 65 20 69  -filename file i
25b0: 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 61 20  s returned as a 
25c0: 73 75 62 73 74 69 74 75 74 65 20 66 6f 72 0a 2a  substitute for.*
25d0: 2a 20 74 68 65 20 53 43 47 49 20 72 65 71 75 65  * the SCGI reque
25e0: 73 74 2e 20 20 54 68 65 20 6d 69 6d 65 74 79 70  st.  The mimetyp
25f0: 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
2600: 62 79 20 74 68 65 20 73 75 66 66 69 78 20 6f 6e  by the suffix on
2610: 20 74 68 65 0a 2a 2a 20 66 61 6c 6c 62 61 63 6b   the.** fallback
2620: 2d 66 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 20  -filename.  The 
2630: 66 61 6c 6c 62 61 63 6b 2d 66 69 6c 65 6e 61 6d  fallback-filenam
2640: 65 20 77 6f 75 6c 64 20 74 79 70 69 63 61 6c 6c  e would typicall
2650: 79 20 62 65 20 61 6e 20 65 72 72 6f 72 0a 2a 2a  y be an error.**
2660: 20 6d 65 73 73 61 67 65 20 69 6e 64 69 63 61 74   message indicat
2670: 69 6e 67 20 74 68 61 74 20 74 68 65 20 73 65 72  ing that the ser
2680: 76 69 63 65 20 69 73 20 74 65 6d 70 6f 72 61 72  vice is temporar
2690: 69 6c 79 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e  ily unavailable.
26a0: 0a 2a 2a 0a 2a 2a 20 42 61 73 69 63 20 41 75 74  .**.** Basic Aut
26b0: 68 6f 72 69 7a 61 74 69 6f 6e 3a 0a 2a 2a 0a 2a  horization:.**.*
26c0: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 22 2d  * If the file "-
26d0: 61 75 74 68 22 20 65 78 69 73 74 73 20 69 6e 20  auth" exists in 
26e0: 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f  the same directo
26f0: 72 79 20 61 73 20 74 68 65 20 63 6f 6e 74 65 6e  ry as the conten
2700: 74 20 66 69 6c 65 0a 2a 2a 20 28 66 6f 72 20 62  t file.** (for b
2710: 6f 74 68 20 73 74 61 74 69 63 20 63 6f 6e 74 65  oth static conte
2720: 6e 74 20 61 6e 64 20 43 47 49 29 20 74 68 65 6e  nt and CGI) then
2730: 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   it contains the
2740: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65   information use
2750: 64 0a 2a 2a 20 66 6f 72 20 62 61 73 69 63 20 61  d.** for basic a
2760: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 2e 20 20 54  uthorization.  T
2770: 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  he file format i
2780: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
2790: 0a 2a 2a 20 20 20 20 2a 20 20 42 6c 61 6e 6b 20  .**    *  Blank 
27a0: 6c 69 6e 65 73 20 61 6e 64 20 6c 69 6e 65 73 20  lines and lines 
27b0: 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20  that begin with 
27c0: 27 23 27 20 61 72 65 20 69 67 6e 6f 72 65 64 0a  '#' are ignored.
27d0: 2a 2a 20 20 20 20 2a 20 20 22 68 74 74 70 2d 72  **    *  "http-r
27e0: 65 64 69 72 65 63 74 22 20 66 6f 72 63 65 73 20  edirect" forces 
27f0: 61 20 72 65 64 69 72 65 63 74 20 74 6f 20 48 54  a redirect to HT
2800: 54 50 53 20 69 66 20 6e 6f 74 20 74 68 65 72 65  TPS if not there
2810: 20 61 6c 72 65 61 64 79 0a 2a 2a 20 20 20 20 2a   already.**    *
2820: 20 20 22 68 74 74 70 73 2d 6f 6e 6c 79 22 20 64    "https-only" d
2830: 69 73 61 6c 6c 6f 77 73 20 6f 70 65 72 61 74 69  isallows operati
2840: 6f 6e 20 69 6e 20 48 54 54 50 0a 2a 2a 20 20 20  on in HTTP.**   
2850: 20 2a 20 20 22 75 73 65 72 20 4e 41 4d 45 20 4c   *  "user NAME L
2860: 4f 47 49 4e 3a 50 41 53 53 57 4f 52 44 22 20 63  OGIN:PASSWORD" c
2870: 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
2880: 4c 4f 47 49 4e 3a 50 41 53 53 57 4f 52 44 20 0a  LOGIN:PASSWORD .
2890: 2a 2a 20 20 20 20 20 20 20 61 75 74 68 6f 72 69  **       authori
28a0: 7a 61 74 69 6f 6e 20 63 72 65 64 65 6e 74 69 61  zation credentia
28b0: 6c 73 20 61 72 65 20 70 72 6f 76 69 64 65 64 2c  ls are provided,
28c0: 20 61 6e 64 20 69 66 20 73 6f 20 73 65 74 73 20   and if so sets 
28d0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 52 45 4d  the.**       REM
28e0: 4f 54 45 5f 55 53 45 52 20 74 6f 20 4e 41 4d 45  OTE_USER to NAME
28f0: 2e 0a 2a 2a 20 20 20 20 2a 20 20 22 72 65 61 6c  ..**    *  "real
2900: 6d 20 54 45 58 54 22 20 73 65 74 73 20 74 68 65  m TEXT" sets the
2910: 20 72 65 61 6c 6d 20 74 6f 20 54 45 58 54 2e 0a   realm to TEXT..
2920: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 63 61 6e 20  **.** There can 
2930: 62 65 20 6d 75 6c 74 69 70 6c 65 20 22 75 73 65  be multiple "use
2940: 72 22 20 6c 69 6e 65 73 2e 20 20 49 66 20 6e 6f  r" lines.  If no
2950: 20 22 75 73 65 72 22 20 6c 69 6e 65 20 6d 61 74   "user" line mat
2960: 63 68 65 73 2c 20 74 68 65 0a 2a 2a 20 72 65 71  ches, the.** req
2970: 75 65 73 74 20 66 61 69 6c 73 20 77 69 74 68 20  uest fails with 
2980: 61 20 34 30 31 20 65 72 72 6f 72 2e 0a 2a 2a 0a  a 401 error..**.
2990: 2a 2a 20 42 65 63 61 75 73 65 20 6f 66 20 73 65  ** Because of se
29a0: 63 75 72 69 74 79 20 72 75 6c 65 20 28 37 29 2c  curity rule (7),
29b0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   there is no way
29c0: 20 66 6f 72 20 74 68 65 20 63 6f 6e 74 65 6e 74   for the content
29d0: 20 6f 66 20 74 68 65 20 22 2d 61 75 74 68 22 0a   of the "-auth".
29e0: 2a 2a 20 66 69 6c 65 20 74 6f 20 6c 65 61 6b 20  ** file to leak 
29f0: 6f 75 74 20 76 69 61 20 48 54 54 50 20 72 65 71  out via HTTP req
2a00: 75 65 73 74 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  uest..*/.#includ
2a10: 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63  e <stdio.h>.#inc
2a20: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23  lude <ctype.h>.#
2a30: 69 6e 63 6c 75 64 65 20 3c 73 79 73 6c 6f 67 2e  include <syslog.
2a40: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h>.#include <std
2a50: 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  lib.h>.#include 
2a60: 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e  <sys/stat.h>.#in
2a70: 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e  clude <unistd.h>
2a80: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
2a90: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
2aa0: 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ring.h>.#include
2ab0: 20 3c 70 77 64 2e 68 3e 0a 23 69 6e 63 6c 75 64   <pwd.h>.#includ
2ac0: 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23  e <sys/time.h>.#
2ad0: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70  include <sys/typ
2ae0: 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  es.h>.#include <
2af0: 73 79 73 2f 73 6f 63 6b 65 74 2e 68 3e 0a 23 69  sys/socket.h>.#i
2b00: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 77 61 69 74  nclude <sys/wait
2b10: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6e 65  .h>.#include <ne
2b20: 74 69 6e 65 74 2f 69 6e 2e 68 3e 0a 23 69 6e 63  tinet/in.h>.#inc
2b30: 6c 75 64 65 20 3c 61 72 70 61 2f 69 6e 65 74 2e  lude <arpa/inet.
2b40: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h>.#include <std
2b50: 61 72 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  arg.h>.#include 
2b60: 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  <time.h>.#includ
2b70: 65 20 3c 73 79 73 2f 74 69 6d 65 73 2e 68 3e 0a  e <sys/times.h>.
2b80: 23 69 6e 63 6c 75 64 65 20 3c 6e 65 74 64 62 2e  #include <netdb.
2b90: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
2ba0: 6e 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  no.h>.#include <
2bb0: 73 79 73 2f 72 65 73 6f 75 72 63 65 2e 68 3e 0a  sys/resource.h>.
2bc0: 23 69 6e 63 6c 75 64 65 20 3c 73 69 67 6e 61 6c  #include <signal
2bd0: 2e 68 3e 0a 23 69 66 64 65 66 20 6c 69 6e 75 78  .h>.#ifdef linux
2be0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73  .#include <sys/s
2bf0: 65 6e 64 66 69 6c 65 2e 68 3e 0a 23 65 6e 64 69  endfile.h>.#endi
2c00: 66 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65  f.#include <asse
2c10: 72 74 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  rt.h>../*.** Con
2c20: 66 69 67 75 72 65 20 74 68 65 20 73 65 72 76 65  figure the serve
2c30: 72 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  r by setting the
2c40: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
2c50: 73 20 61 6e 64 20 72 65 63 6f 6d 70 69 6c 69 6e  s and recompilin
2c60: 67 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 44 45  g..*/.#ifndef DE
2c70: 46 41 55 4c 54 5f 50 4f 52 54 0a 23 64 65 66 69  FAULT_PORT.#defi
2c80: 6e 65 20 44 45 46 41 55 4c 54 5f 50 4f 52 54 20  ne DEFAULT_PORT 
2c90: 22 38 30 22 20 20 20 20 20 20 20 20 20 20 20 20  "80"            
2ca0: 20 2f 2a 20 44 65 66 61 75 6c 74 20 54 43 50 20   /* Default TCP 
2cb0: 70 6f 72 74 20 66 6f 72 20 48 54 54 50 20 2a 2f  port for HTTP */
2cc0: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
2cd0: 4d 41 58 5f 43 4f 4e 54 45 4e 54 5f 4c 45 4e 47  MAX_CONTENT_LENG
2ce0: 54 48 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 43  TH.#define MAX_C
2cf0: 4f 4e 54 45 4e 54 5f 4c 45 4e 47 54 48 20 32 35  ONTENT_LENGTH 25
2d00: 30 30 30 30 30 30 30 20 20 2f 2a 20 4d 61 78 20  0000000  /* Max 
2d10: 6c 65 6e 67 74 68 20 6f 66 20 48 54 54 50 20 72  length of HTTP r
2d20: 65 71 75 65 73 74 20 63 6f 6e 74 65 6e 74 20 2a  equest content *
2d30: 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
2d40: 57 65 20 72 65 63 6f 72 64 20 6d 6f 73 74 20 6f  We record most o
2d50: 66 20 74 68 65 20 73 74 61 74 65 20 69 6e 66 6f  f the state info
2d60: 72 6d 61 74 69 6f 6e 20 61 73 20 67 6c 6f 62 61  rmation as globa
2d70: 6c 20 76 61 72 69 61 62 6c 65 73 2e 20 20 54 68  l variables.  Th
2d80: 69 73 0a 2a 2a 20 73 61 76 65 73 20 68 61 76 69  is.** saves havi
2d90: 6e 67 20 74 6f 20 70 61 73 73 20 69 6e 66 6f 72  ng to pass infor
2da0: 6d 61 74 69 6f 6e 20 74 6f 20 73 75 62 72 6f 75  mation to subrou
2db0: 74 69 6e 65 73 20 61 73 20 70 61 72 61 6d 65 74  tines as paramet
2dc0: 65 72 73 2c 20 61 6e 64 0a 2a 2a 20 6d 61 6b 65  ers, and.** make
2dd0: 73 20 74 68 65 20 65 78 65 63 75 74 61 62 6c 65  s the executable
2de0: 20 73 6d 61 6c 6c 65 72 2e 2e 2e 0a 2a 2f 0a 73   smaller....*/.s
2df0: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 52 6f 6f  tatic char *zRoo
2e00: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
2e10: 2f 2a 20 52 6f 6f 74 20 64 69 72 65 63 74 6f 72  /* Root director
2e20: 79 20 6f 66 20 74 68 65 20 77 65 62 73 69 74 65  y of the website
2e30: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
2e40: 2a 7a 54 6d 70 4e 61 6d 20 3d 20 30 3b 20 20 20  *zTmpNam = 0;   
2e50: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2e60: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
2e70: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
2e80: 7a 54 6d 70 4e 61 6d 42 75 66 5b 35 30 30 5d 3b  zTmpNamBuf[500];
2e90: 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f       /* Space to
2ea0: 20 68 6f 6c 64 20 74 68 65 20 74 65 6d 70 6f 72   hold the tempor
2eb0: 61 72 79 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a  ary filename */.
2ec0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 50 72  static char *zPr
2ed0: 6f 74 6f 63 6f 6c 20 3d 20 30 3b 20 20 20 20 20  otocol = 0;     
2ee0: 20 2f 2a 20 54 68 65 20 70 72 6f 74 6f 63 6f 6c   /* The protocol
2ef0: 20 62 65 69 6e 67 20 75 73 69 6e 67 20 62 79 20   being using by 
2f00: 74 68 65 20 62 72 6f 77 73 65 72 20 2a 2f 0a 73  the browser */.s
2f10: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 4d 65 74  tatic char *zMet
2f20: 68 6f 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  hod = 0;        
2f30: 2f 2a 20 54 68 65 20 6d 65 74 68 6f 64 2e 20 20  /* The method.  
2f40: 4d 75 73 74 20 62 65 20 47 45 54 20 2a 2f 0a 73  Must be GET */.s
2f50: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 53 63 72  tatic char *zScr
2f60: 69 70 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ipt = 0;        
2f70: 2f 2a 20 54 68 65 20 6f 62 6a 65 63 74 20 74 6f  /* The object to
2f80: 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 73 74 61   retrieve */.sta
2f90: 74 69 63 20 63 68 61 72 20 2a 7a 52 65 61 6c 53  tic char *zRealS
2fa0: 63 72 69 70 74 20 3d 20 30 3b 20 20 20 20 2f 2a  cript = 0;    /*
2fb0: 20 54 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 72   The object to r
2fc0: 65 74 72 69 65 76 65 2e 20 20 53 61 6d 65 20 61  etrieve.  Same a
2fd0: 73 20 7a 53 63 72 69 70 74 0a 20 20 20 20 20 20  s zScript.      
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78             ** ex
3000: 63 65 70 74 20 6d 69 67 68 74 20 68 61 76 65 20  cept might have 
3010: 22 2f 69 6e 64 65 78 2e 68 74 6d 6c 22 20 61 70  "/index.html" ap
3020: 70 65 6e 64 65 64 20 2a 2f 0a 73 74 61 74 69 63  pended */.static
3030: 20 63 68 61 72 20 2a 7a 48 6f 6d 65 20 3d 20 30   char *zHome = 0
3040: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
3050: 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74  e directory cont
3060: 61 69 6e 69 6e 67 20 63 6f 6e 74 65 6e 74 20 2a  aining content *
3070: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a  /.static char *z
3080: 51 75 65 72 79 53 74 72 69 6e 67 20 3d 20 30 3b  QueryString = 0;
3090: 20 20 20 2f 2a 20 54 68 65 20 71 75 65 72 79 20     /* The query 
30a0: 73 74 72 69 6e 67 20 6f 6e 20 74 68 65 20 65 6e  string on the en
30b0: 64 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 2a 2f  d of the name */
30c0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 46  .static char *zF
30d0: 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ile = 0;        
30e0: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 6e 61 6d    /* The filenam
30f0: 65 20 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 20  e of the object 
3100: 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 73  to retrieve */.s
3110: 74 61 74 69 63 20 69 6e 74 20 6c 65 6e 46 69 6c  tatic int lenFil
3120: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
3130: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65  /* Length of the
3140: 20 7a 46 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 73   zFile name */.s
3150: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 44 69 72  tatic char *zDir
3160: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
3170: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
3180: 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 69 6e 67  irectory holding
3190: 20 7a 46 69 6c 65 20 2a 2f 0a 73 74 61 74 69 63   zFile */.static
31a0: 20 63 68 61 72 20 2a 7a 50 61 74 68 49 6e 66 6f   char *zPathInfo
31b0: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 50 61   = 0;      /* Pa
31c0: 72 74 20 6f 66 20 74 68 65 20 70 61 74 68 6e 61  rt of the pathna
31d0: 6d 65 20 70 61 73 74 20 74 68 65 20 66 69 6c 65  me past the file
31e0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
31f0: 2a 7a 41 67 65 6e 74 20 3d 20 30 3b 20 20 20 20  *zAgent = 0;    
3200: 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 79 70       /* What typ
3210: 65 20 69 66 20 62 72 6f 77 73 65 72 20 69 73 20  e if browser is 
3220: 6d 61 6b 69 6e 67 20 74 68 69 73 20 71 75 65 72  making this quer
3230: 79 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  y */.static char
3240: 20 2a 7a 53 65 72 76 65 72 4e 61 6d 65 20 3d 20   *zServerName = 
3250: 30 3b 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d  0;    /* The nam
3260: 65 20 61 66 74 65 72 20 74 68 65 20 68 74 74 70  e after the http
3270: 3a 2f 2f 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  :// */.static ch
3280: 61 72 20 2a 7a 53 65 72 76 65 72 50 6f 72 74 20  ar *zServerPort 
3290: 3d 20 30 3b 20 20 20 20 2f 2a 20 54 68 65 20 70  = 0;    /* The p
32a0: 6f 72 74 20 6e 75 6d 62 65 72 20 2a 2f 0a 73 74  ort number */.st
32b0: 61 74 69 63 20 63 68 61 72 20 2a 7a 43 6f 6f 6b  atic char *zCook
32c0: 69 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  ie = 0;        /
32d0: 2a 20 43 6f 6f 6b 69 65 73 20 72 65 70 6f 72 74  * Cookies report
32e0: 65 64 20 77 69 74 68 20 74 68 65 20 72 65 71 75  ed with the requ
32f0: 65 73 74 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  est */.static ch
3300: 61 72 20 2a 7a 48 74 74 70 48 6f 73 74 20 3d 20  ar *zHttpHost = 
3310: 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  0;      /* Name 
3320: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
3330: 20 77 65 62 20 62 72 6f 77 73 65 72 20 2a 2f 0a   web browser */.
3340: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 52 65  static char *zRe
3350: 61 6c 50 6f 72 74 20 3d 20 30 3b 20 20 20 20 20  alPort = 0;     
3360: 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 54 43 50   /* The real TCP
3370: 20 70 6f 72 74 20 77 68 65 6e 20 72 75 6e 6e 69   port when runni
3380: 6e 67 20 61 73 20 64 61 65 6d 6f 6e 20 2a 2f 0a  ng as daemon */.
3390: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 52 65  static char *zRe
33a0: 6d 6f 74 65 41 64 64 72 20 3d 20 30 3b 20 20 20  moteAddr = 0;   
33b0: 20 2f 2a 20 49 50 20 61 64 64 72 65 73 73 20 6f   /* IP address o
33c0: 66 20 74 68 65 20 72 65 71 75 65 73 74 20 2a 2f  f the request */
33d0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 52  .static char *zR
33e0: 65 66 65 72 65 72 20 3d 20 30 3b 20 20 20 20 20  eferer = 0;     
33f0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
3400: 20 70 61 67 65 20 74 68 61 74 20 72 65 66 65 72   page that refer
3410: 65 64 20 74 6f 20 75 73 20 2a 2f 0a 73 74 61 74  ed to us */.stat
3420: 69 63 20 63 68 61 72 20 2a 7a 41 63 63 65 70 74  ic char *zAccept
3430: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
3440: 57 68 61 74 20 66 6f 72 6d 61 74 73 20 77 69 6c  What formats wil
3450: 6c 20 62 65 20 61 63 63 65 70 74 65 64 20 2a 2f  l be accepted */
3460: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 41  .static char *zA
3470: 63 63 65 70 74 45 6e 63 6f 64 69 6e 67 20 3d 30  cceptEncoding =0
3480: 3b 20 2f 2a 20 67 7a 69 70 20 6f 72 20 64 65 66  ; /* gzip or def
3490: 61 75 6c 74 20 2a 2f 0a 73 74 61 74 69 63 20 63  ault */.static c
34a0: 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 4c 65 6e  har *zContentLen
34b0: 67 74 68 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74  gth = 0; /* Cont
34c0: 65 6e 74 20 6c 65 6e 67 74 68 20 72 65 70 6f 72  ent length repor
34d0: 74 65 64 20 69 6e 20 74 68 65 20 68 65 61 64 65  ted in the heade
34e0: 72 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  r */.static char
34f0: 20 2a 7a 43 6f 6e 74 65 6e 74 54 79 70 65 20 3d   *zContentType =
3500: 20 30 3b 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74   0;   /* Content
3510: 20 74 79 70 65 20 72 65 70 6f 72 74 65 64 20 69   type reported i
3520: 6e 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  n the header */.
3530: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 51 75  static char *zQu
3540: 65 72 79 53 75 66 66 69 78 20 3d 20 30 3b 20 20  erySuffix = 0;  
3550: 20 2f 2a 20 54 68 65 20 70 61 72 74 20 6f 66 20   /* The part of 
3560: 74 68 65 20 55 52 4c 20 61 66 74 65 72 20 74 68  the URL after th
3570: 65 20 66 69 72 73 74 20 3f 20 2a 2f 0a 73 74 61  e first ? */.sta
3580: 74 69 63 20 63 68 61 72 20 2a 7a 41 75 74 68 54  tic char *zAuthT
3590: 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  ype = 0;      /*
35a0: 20 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   Authorization t
35b0: 79 70 65 20 28 62 61 73 69 63 20 6f 72 20 64 69  ype (basic or di
35c0: 67 65 73 74 29 20 2a 2f 0a 73 74 61 74 69 63 20  gest) */.static 
35d0: 63 68 61 72 20 2a 7a 41 75 74 68 41 72 67 20 3d  char *zAuthArg =
35e0: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41 75 74   0;       /* Aut
35f0: 68 6f 72 69 7a 61 74 69 6f 6e 20 76 61 6c 75 65  horization value
3600: 73 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  s */.static char
3610: 20 2a 7a 52 65 6d 6f 74 65 55 73 65 72 20 3d 20   *zRemoteUser = 
3620: 30 3b 20 20 20 20 2f 2a 20 52 45 4d 4f 54 45 5f  0;    /* REMOTE_
3630: 55 53 45 52 20 73 65 74 20 62 79 20 61 75 74 68  USER set by auth
3640: 6f 72 69 7a 61 74 69 6f 6e 20 6d 6f 64 75 6c 65  orization module
3650: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
3660: 2a 7a 49 66 4e 6f 6e 65 4d 61 74 63 68 3d 20 30  *zIfNoneMatch= 0
3670: 3b 20 20 20 20 2f 2a 20 54 68 65 20 49 66 2d 4e  ;    /* The If-N
3680: 6f 6e 65 2d 4d 61 74 63 68 20 68 65 61 64 65 72  one-Match header
3690: 20 76 61 6c 75 65 20 2a 2f 0a 73 74 61 74 69 63   value */.static
36a0: 20 63 68 61 72 20 2a 7a 49 66 4d 6f 64 69 66 69   char *zIfModifi
36b0: 65 64 53 69 6e 63 65 3d 30 3b 20 2f 2a 20 54 68  edSince=0; /* Th
36c0: 65 20 49 66 2d 4d 6f 64 69 66 69 65 64 2d 53 69  e If-Modified-Si
36d0: 6e 63 65 20 68 65 61 64 65 72 20 76 61 6c 75 65  nce header value
36e0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e   */.static int n
36f0: 49 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  In = 0;         
3700: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3710: 66 20 62 79 74 65 73 20 6f 66 20 69 6e 70 75 74  f bytes of input
3720: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e   */.static int n
3730: 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Out = 0;        
3740: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3750: 66 20 62 79 74 65 73 20 6f 66 20 6f 75 74 70 75  f bytes of outpu
3760: 74 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  t */.static char
3770: 20 7a 52 65 70 6c 79 53 74 61 74 75 73 5b 34 5d   zReplyStatus[4]
3780: 3b 20 20 20 20 20 2f 2a 20 52 65 70 6c 79 20 73  ;     /* Reply s
3790: 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 73 74  tatus code */.st
37a0: 61 74 69 63 20 69 6e 74 20 73 74 61 74 75 73 53  atic int statusS
37b0: 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ent = 0;       /
37c0: 2a 20 54 72 75 65 20 61 66 74 65 72 20 73 74 61  * True after sta
37d0: 74 75 73 20 6c 69 6e 65 20 69 73 20 73 65 6e 74  tus line is sent
37e0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
37f0: 2a 7a 4c 6f 67 46 69 6c 65 20 3d 20 30 3b 20 20  *zLogFile = 0;  
3800: 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 6f 20 74       /* Log to t
3810: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 73 74 61 74  his file */.stat
3820: 69 63 20 69 6e 74 20 64 65 62 75 67 46 6c 61 67  ic int debugFlag
3830: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
3840: 54 72 75 65 20 69 66 20 62 65 69 6e 67 20 64 65  True if being de
3850: 62 75 67 67 65 64 20 2a 2f 0a 73 74 61 74 69 63  bugged */.static
3860: 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20   struct timeval 
3870: 62 65 67 69 6e 54 69 6d 65 3b 20 2f 2a 20 54 69  beginTime; /* Ti
3880: 6d 65 20 77 68 65 6e 20 74 68 69 73 20 70 72 6f  me when this pro
3890: 63 65 73 73 20 73 74 61 72 74 73 20 2a 2f 0a 73  cess starts */.s
38a0: 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 43  tatic int closeC
38b0: 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 30 3b 20 20  onnection = 0;  
38c0: 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 6e 64 20  /* True to send 
38d0: 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f 73  Connection: clos
38e0: 65 20 69 6e 20 72 65 70 6c 79 20 2a 2f 0a 73 74  e in reply */.st
38f0: 61 74 69 63 20 69 6e 74 20 6e 52 65 71 75 65 73  atic int nReques
3900: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  t = 0;         /
3910: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 71 75  * Number of requ
3920: 65 73 74 73 20 70 72 6f 63 65 73 73 65 64 20 2a  ests processed *
3930: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 6d 69  /.static int omi
3940: 74 4c 6f 67 20 3d 20 30 3b 20 20 20 20 20 20 20  tLog = 0;       
3950: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6d 61 6b     /* Do not mak
3960: 65 20 6c 6f 67 66 69 6c 65 20 65 6e 74 72 69 65  e logfile entrie
3970: 73 20 69 66 20 74 72 75 65 20 2a 2f 0a 73 74 61  s if true */.sta
3980: 74 69 63 20 69 6e 74 20 75 73 65 48 74 74 70 73  tic int useHttps
3990: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
39a0: 20 54 72 75 65 20 74 6f 20 75 73 65 20 48 54 54   True to use HTT
39b0: 50 53 3a 20 69 6e 73 74 65 61 64 20 6f 66 20 48  PS: instead of H
39c0: 54 54 50 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63  TTP: */.static c
39d0: 68 61 72 20 2a 7a 48 74 74 70 20 3d 20 22 68 74  har *zHttp = "ht
39e0: 74 70 22 3b 20 20 20 20 20 2f 2a 20 68 74 74 70  tp";     /* http
39f0: 20 6f 72 20 68 74 74 70 73 20 2a 2f 0a 73 74 61   or https */.sta
3a00: 74 69 63 20 69 6e 74 20 75 73 65 54 69 6d 65 6f  tic int useTimeo
3a10: 75 74 20 3d 20 31 3b 20 20 20 20 20 20 20 2f 2a  ut = 1;       /*
3a20: 20 54 72 75 65 20 74 6f 20 75 73 65 20 74 69 6d   True to use tim
3a30: 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es */.static int
3a40: 20 73 74 61 6e 64 61 6c 6f 6e 65 20 3d 20 30 3b   standalone = 0;
3a50: 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 20 61 73         /* Run as
3a60: 20 61 20 73 74 61 6e 64 61 6c 6f 6e 65 20 73 65   a standalone se
3a70: 72 76 65 72 20 28 6e 6f 20 69 6e 65 74 64 29 20  rver (no inetd) 
3a80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 70  */.static int ip
3a90: 76 36 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20  v6Only = 0;     
3aa0: 20 20 20 20 2f 2a 20 55 73 65 20 49 50 76 36 20      /* Use IPv6 
3ab0: 6f 6e 6c 79 20 2a 2f 0a 73 74 61 74 69 63 20 69  only */.static i
3ac0: 6e 74 20 69 70 76 34 4f 6e 6c 79 20 3d 20 30 3b  nt ipv4Only = 0;
3ad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
3ae0: 49 50 76 34 20 6f 6e 6c 79 20 2a 2f 0a 73 74 61  IPv4 only */.sta
3af0: 74 69 63 20 73 74 72 75 63 74 20 72 75 73 61 67  tic struct rusag
3b00: 65 20 70 72 69 6f 72 53 65 6c 66 3b 20 20 2f 2a  e priorSelf;  /*
3b10: 20 50 72 65 76 69 6f 75 73 6c 79 20 72 65 70 6f   Previously repo
3b20: 72 74 20 53 45 4c 46 20 74 69 6d 65 20 2a 2f 0a  rt SELF time */.
3b30: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 72 75  static struct ru
3b40: 73 61 67 65 20 70 72 69 6f 72 43 68 69 6c 64 3b  sage priorChild;
3b50: 20 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79 20 72   /* Previously r
3b60: 65 70 6f 72 74 20 43 48 49 4c 44 20 74 69 6d 65  eport CHILD time
3b70: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d   */.static int m
3b80: 78 41 67 65 20 3d 20 31 32 30 3b 20 20 20 20 20  xAge = 120;     
3b90: 20 20 20 20 20 2f 2a 20 43 61 63 68 65 2d 63 6f       /* Cache-co
3ba0: 6e 74 72 6f 6c 20 6d 61 78 2d 61 67 65 20 2a 2f  ntrol max-age */
3bb0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 65  .static char *de
3bc0: 66 61 75 6c 74 5f 70 61 74 68 20 3d 20 22 2f 62  fault_path = "/b
3bd0: 69 6e 3a 2f 75 73 72 2f 62 69 6e 22 3b 20 20 2f  in:/usr/bin";  /
3be0: 2a 20 44 65 66 61 75 6c 74 20 50 41 54 48 20 76  * Default PATH v
3bf0: 61 72 69 61 62 6c 65 20 2a 2f 0a 73 74 61 74 69  ariable */.stati
3c00: 63 20 63 68 61 72 20 2a 7a 53 63 67 69 20 3d 20  c char *zScgi = 
3c10: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  0;          /* V
3c20: 61 6c 75 65 20 6f 66 20 74 68 65 20 53 43 47 49  alue of the SCGI
3c30: 20 65 6e 76 20 76 61 72 69 61 62 6c 65 20 2a 2f   env variable */
3c40: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 70 70 69 6e 67 20  ../*.** Mapping 
3c50: 62 65 74 77 65 65 6e 20 43 47 49 20 76 61 72 69  between CGI vari
3c60: 61 62 6c 65 20 6e 61 6d 65 73 20 61 6e 64 20 76  able names and v
3c70: 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 0a  alues stored in.
3c80: 2a 2a 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ** global variab
3c90: 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  les..*/.static s
3ca0: 74 72 75 63 74 20 7b 0a 20 20 63 68 61 72 20 2a  truct {.  char *
3cb0: 7a 45 6e 76 4e 61 6d 65 3b 0a 20 20 63 68 61 72  zEnvName;.  char
3cc0: 20 2a 2a 70 7a 45 6e 76 56 61 6c 75 65 3b 0a 7d   **pzEnvValue;.}
3cd0: 20 63 67 69 65 6e 76 5b 5d 20 3d 20 7b 0a 20 20   cgienv[] = {.  
3ce0: 7b 20 22 43 4f 4e 54 45 4e 54 5f 4c 45 4e 47 54  { "CONTENT_LENGT
3cf0: 48 22 2c 20 20 20 20 20 20 20 20 20 20 26 7a 43  H",          &zC
3d00: 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 20 7d 2c 20  ontentLength }, 
3d10: 2f 2a 20 4d 75 73 74 20 62 65 20 66 69 72 73 74  /* Must be first
3d20: 20 66 6f 72 20 53 43 47 49 20 2a 2f 0a 20 20 7b   for SCGI */.  {
3d30: 20 22 41 55 54 48 5f 54 59 50 45 22 2c 20 20 20   "AUTH_TYPE",   
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d50: 26 7a 41 75 74 68 54 79 70 65 20 7d 2c 0a 20 20  &zAuthType },.  
3d60: 7b 20 22 41 55 54 48 5f 43 4f 4e 54 45 4e 54 22  { "AUTH_CONTENT"
3d70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3d80: 20 26 7a 41 75 74 68 41 72 67 20 7d 2c 0a 20 20   &zAuthArg },.  
3d90: 7b 20 22 43 4f 4e 54 45 4e 54 5f 54 59 50 45 22  { "CONTENT_TYPE"
3da0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3db0: 20 26 7a 43 6f 6e 74 65 6e 74 54 79 70 65 20 7d   &zContentType }
3dc0: 2c 0a 20 20 7b 20 22 44 4f 43 55 4d 45 4e 54 5f  ,.  { "DOCUMENT_
3dd0: 52 4f 4f 54 22 2c 20 20 20 20 20 20 20 20 20 20  ROOT",          
3de0: 20 20 20 20 20 26 7a 48 6f 6d 65 20 7d 2c 0a 20       &zHome },. 
3df0: 20 7b 20 22 48 54 54 50 5f 41 43 43 45 50 54 22   { "HTTP_ACCEPT"
3e00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3e10: 20 20 26 7a 41 63 63 65 70 74 20 7d 2c 0a 20 20    &zAccept },.  
3e20: 7b 20 22 48 54 54 50 5f 41 43 43 45 50 54 5f 45  { "HTTP_ACCEPT_E
3e30: 4e 43 4f 44 49 4e 47 22 2c 20 20 20 20 20 20 20  NCODING",       
3e40: 20 26 7a 41 63 63 65 70 74 45 6e 63 6f 64 69 6e   &zAcceptEncodin
3e50: 67 20 7d 2c 0a 20 20 7b 20 22 48 54 54 50 5f 43  g },.  { "HTTP_C
3e60: 4f 4f 4b 49 45 22 2c 20 20 20 20 20 20 20 20 20  OOKIE",         
3e70: 20 20 20 20 20 20 20 20 26 7a 43 6f 6f 6b 69 65          &zCookie
3e80: 20 7d 2c 0a 20 20 7b 20 22 48 54 54 50 5f 48 4f   },.  { "HTTP_HO
3e90: 53 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ST",            
3ea0: 20 20 20 20 20 20 20 26 7a 48 74 74 70 48 6f 73         &zHttpHos
3eb0: 74 20 7d 2c 0a 20 20 7b 20 22 48 54 54 50 5f 49  t },.  { "HTTP_I
3ec0: 46 5f 4d 4f 44 49 46 49 45 44 5f 53 49 4e 43 45  F_MODIFIED_SINCE
3ed0: 22 2c 20 20 20 20 20 20 26 7a 49 66 4d 6f 64 69  ",      &zIfModi
3ee0: 66 69 65 64 53 69 6e 63 65 20 7d 2c 0a 20 20 7b  fiedSince },.  {
3ef0: 20 22 48 54 54 50 5f 49 46 5f 4e 4f 4e 45 5f 4d   "HTTP_IF_NONE_M
3f00: 41 54 43 48 22 2c 20 20 20 20 20 20 20 20 20 20  ATCH",          
3f10: 26 7a 49 66 4e 6f 6e 65 4d 61 74 63 68 20 7d 2c  &zIfNoneMatch },
3f20: 0a 20 20 7b 20 22 48 54 54 50 5f 52 45 46 45 52  .  { "HTTP_REFER
3f30: 45 52 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ER",            
3f40: 20 20 20 20 26 7a 52 65 66 65 72 65 72 20 7d 2c      &zReferer },
3f50: 0a 20 20 7b 20 22 48 54 54 50 5f 55 53 45 52 5f  .  { "HTTP_USER_
3f60: 41 47 45 4e 54 22 2c 20 20 20 20 20 20 20 20 20  AGENT",         
3f70: 20 20 20 20 26 7a 41 67 65 6e 74 20 7d 2c 0a 20      &zAgent },. 
3f80: 20 7b 20 22 50 41 54 48 22 2c 20 20 20 20 20 20   { "PATH",      
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fa0: 20 20 26 64 65 66 61 75 6c 74 5f 70 61 74 68 20    &default_path 
3fb0: 7d 2c 0a 20 20 7b 20 22 50 41 54 48 5f 49 4e 46  },.  { "PATH_INF
3fc0: 4f 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  O",             
3fd0: 20 20 20 20 20 20 26 7a 50 61 74 68 49 6e 66 6f        &zPathInfo
3fe0: 20 7d 2c 0a 20 20 7b 20 22 51 55 45 52 59 5f 53   },.  { "QUERY_S
3ff0: 54 52 49 4e 47 22 2c 20 20 20 20 20 20 20 20 20  TRING",         
4000: 20 20 20 20 20 20 20 26 7a 51 75 65 72 79 53 74         &zQuerySt
4010: 72 69 6e 67 20 7d 2c 0a 20 20 7b 20 22 52 45 4d  ring },.  { "REM
4020: 4f 54 45 5f 41 44 44 52 22 2c 20 20 20 20 20 20  OTE_ADDR",      
4030: 20 20 20 20 20 20 20 20 20 20 20 26 7a 52 65 6d             &zRem
4040: 6f 74 65 41 64 64 72 20 7d 2c 0a 20 20 7b 20 22  oteAddr },.  { "
4050: 52 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 22 2c  REQUEST_METHOD",
4060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
4070: 4d 65 74 68 6f 64 20 7d 2c 0a 20 20 7b 20 22 52  Method },.  { "R
4080: 45 51 55 45 53 54 5f 55 52 49 22 2c 20 20 20 20  EQUEST_URI",    
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 53               &zS
40a0: 63 72 69 70 74 20 7d 2c 0a 20 20 7b 20 22 52 45  cript },.  { "RE
40b0: 4d 4f 54 45 5f 55 53 45 52 22 2c 20 20 20 20 20  MOTE_USER",     
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 52 65              &zRe
40d0: 6d 6f 74 65 55 73 65 72 20 7d 2c 0a 20 20 7b 20  moteUser },.  { 
40e0: 22 53 43 47 49 22 2c 20 20 20 20 20 20 20 20 20  "SCGI",         
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
4100: 7a 53 63 67 69 20 7d 2c 0a 20 20 7b 20 22 53 43  zScgi },.  { "SC
4110: 52 49 50 54 5f 44 49 52 45 43 54 4f 52 59 22 2c  RIPT_DIRECTORY",
4120: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 44 69              &zDi
4130: 72 20 7d 2c 0a 20 20 7b 20 22 53 43 52 49 50 54  r },.  { "SCRIPT
4140: 5f 46 49 4c 45 4e 41 4d 45 22 2c 20 20 20 20 20  _FILENAME",     
4150: 20 20 20 20 20 20 20 20 26 7a 46 69 6c 65 20 7d          &zFile }
4160: 2c 0a 20 20 7b 20 22 53 43 52 49 50 54 5f 4e 41  ,.  { "SCRIPT_NA
4170: 4d 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ME",            
4180: 20 20 20 20 20 26 7a 52 65 61 6c 53 63 72 69 70       &zRealScrip
4190: 74 20 7d 2c 0a 20 20 7b 20 22 53 45 52 56 45 52  t },.  { "SERVER
41a0: 5f 4e 41 4d 45 22 2c 20 20 20 20 20 20 20 20 20  _NAME",         
41b0: 20 20 20 20 20 20 20 20 26 7a 53 65 72 76 65 72          &zServer
41c0: 4e 61 6d 65 20 7d 2c 0a 20 20 7b 20 22 53 45 52  Name },.  { "SER
41d0: 56 45 52 5f 50 4f 52 54 22 2c 20 20 20 20 20 20  VER_PORT",      
41e0: 20 20 20 20 20 20 20 20 20 20 20 26 7a 53 65 72             &zSer
41f0: 76 65 72 50 6f 72 74 20 7d 2c 0a 20 20 7b 20 22  verPort },.  { "
4200: 53 45 52 56 45 52 5f 50 52 4f 54 4f 43 4f 4c 22  SERVER_PROTOCOL"
4210: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a  ,             &z
4220: 50 72 6f 74 6f 63 6f 6c 20 7d 2c 0a 7d 3b 0a 0a  Protocol },.};..
4230: 0a 2f 2a 0a 2a 2a 20 44 6f 75 62 6c 65 20 61 6e  ./*.** Double an
4240: 79 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 20 63  y double-quote c
4250: 68 61 72 61 63 74 65 72 73 20 69 6e 20 61 20 73  haracters in a s
4260: 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
4270: 20 63 68 61 72 20 2a 45 73 63 61 70 65 28 63 68   char *Escape(ch
4280: 61 72 20 2a 7a 29 7b 0a 20 20 73 69 7a 65 5f 74  ar *z){.  size_t
4290: 20 69 2c 20 6a 3b 0a 20 20 73 69 7a 65 5f 74 20   i, j;.  size_t 
42a0: 6e 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 63  n;.  char c;.  c
42b0: 68 61 72 20 2a 7a 4f 75 74 3b 0a 20 20 66 6f 72  har *zOut;.  for
42c0: 28 69 3d 30 3b 20 28 63 3d 7a 5b 69 5d 29 21 3d  (i=0; (c=z[i])!=
42d0: 30 20 26 26 20 63 21 3d 27 22 27 3b 20 69 2b 2b  0 && c!='"'; i++
42e0: 29 7b 7d 0a 20 20 69 66 28 20 63 3d 3d 30 20 29  ){}.  if( c==0 )
42f0: 20 72 65 74 75 72 6e 20 7a 3b 0a 20 20 6e 20 3d   return z;.  n =
4300: 20 31 3b 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 28   1;.  for(i++; (
4310: 63 3d 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29  c=z[i])!=0; i++)
4320: 7b 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 6e  { if( c=='"' ) n
4330: 2b 2b 3b 20 7d 0a 20 20 7a 4f 75 74 20 3d 20 6d  ++; }.  zOut = m
4340: 61 6c 6c 6f 63 28 20 69 2b 6e 2b 31 20 29 3b 0a  alloc( i+n+1 );.
4350: 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 20    if( zOut==0 ) 
4360: 72 65 74 75 72 6e 20 22 22 3b 0a 20 20 66 6f 72  return "";.  for
4370: 28 69 3d 6a 3d 30 3b 20 28 63 3d 7a 5b 69 5d 29  (i=j=0; (c=z[i])
4380: 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a  !=0; i++){.    z
4390: 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20  Out[j++] = c;.  
43a0: 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 7a    if( c=='"' ) z
43b0: 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20  Out[j++] = c;.  
43c0: 7d 0a 20 20 7a 4f 75 74 5b 6a 5d 20 3d 20 30 3b  }.  zOut[j] = 0;
43d0: 0a 20 20 72 65 74 75 72 6e 20 7a 4f 75 74 3b 0a  .  return zOut;.
43e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
43f0: 20 61 20 73 74 72 75 63 74 20 74 69 6d 65 76 61   a struct timeva
4400: 6c 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65  l into an intege
4410: 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  r number of mill
4420: 69 73 65 63 6f 6e 64 73 0a 2a 2f 0a 73 74 61 74  iseconds.*/.stat
4430: 69 63 20 69 6e 74 20 74 76 6d 73 28 73 74 72 75  ic int tvms(stru
4440: 63 74 20 74 69 6d 65 76 61 6c 20 2a 70 29 7b 0a  ct timeval *p){.
4450: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28 70    return (int)(p
4460: 2d 3e 74 76 5f 73 65 63 2a 31 30 30 30 30 30 30  ->tv_sec*1000000
4470: 20 2b 20 70 2d 3e 74 76 5f 75 73 65 63 29 3b 0a   + p->tv_usec);.
4480: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 6e  }../*.** Make an
4490: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6c 6f   entry in the lo
44a0: 67 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 20  g file.  If the 
44b0: 48 54 54 50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  HTTP connection 
44c0: 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 63 6c 6f  should be.** clo
44d0: 73 65 64 2c 20 74 68 65 6e 20 74 65 72 6d 69 6e  sed, then termin
44e0: 61 74 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ate this process
44f0: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 72 65 74  .  Otherwise ret
4500: 75 72 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  urn..*/.static v
4510: 6f 69 64 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79  oid MakeLogEntry
4520: 28 69 6e 74 20 65 78 69 74 43 6f 64 65 2c 20 69  (int exitCode, i
4530: 6e 74 20 6c 69 6e 65 4e 75 6d 29 7b 0a 20 20 46  nt lineNum){.  F
4540: 49 4c 45 20 2a 6c 6f 67 3b 0a 20 20 69 66 28 20  ILE *log;.  if( 
4550: 7a 54 6d 70 4e 61 6d 20 29 7b 0a 20 20 20 20 75  zTmpNam ){.    u
4560: 6e 6c 69 6e 6b 28 7a 54 6d 70 4e 61 6d 29 3b 0a  nlink(zTmpNam);.
4570: 20 20 7d 0a 20 20 69 66 28 20 7a 4c 6f 67 46 69    }.  if( zLogFi
4580: 6c 65 20 26 26 20 21 6f 6d 69 74 4c 6f 67 20 29  le && !omitLog )
4590: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 74 69 6d  {.    struct tim
45a0: 65 76 61 6c 20 6e 6f 77 3b 0a 20 20 20 20 73 74  eval now;.    st
45b0: 72 75 63 74 20 74 6d 20 2a 70 54 6d 3b 0a 20 20  ruct tm *pTm;.  
45c0: 20 20 73 74 72 75 63 74 20 72 75 73 61 67 65 20    struct rusage 
45d0: 73 65 6c 66 2c 20 63 68 69 6c 64 72 65 6e 3b 0a  self, children;.
45e0: 20 20 20 20 69 6e 74 20 77 61 69 74 53 74 61 74      int waitStat
45f0: 75 73 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 52  us;.    char *zR
4600: 4d 20 3d 20 7a 52 65 6d 6f 74 65 55 73 65 72 20  M = zRemoteUser 
4610: 3f 20 7a 52 65 6d 6f 74 65 55 73 65 72 20 3a 20  ? zRemoteUser : 
4620: 22 22 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 46  "";.    char *zF
4630: 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 73 69 7a  ilename;.    siz
4640: 65 5f 74 20 73 7a 3b 0a 20 20 20 20 63 68 61 72  e_t sz;.    char
4650: 20 7a 44 61 74 65 5b 32 30 30 5d 3b 0a 20 20 20   zDate[200];.   
4660: 20 63 68 61 72 20 7a 45 78 70 4c 6f 67 46 69 6c   char zExpLogFil
4670: 65 5b 35 30 30 5d 3b 0a 0a 20 20 20 20 69 66 28  e[500];..    if(
4680: 20 7a 53 63 72 69 70 74 3d 3d 30 20 29 20 7a 53   zScript==0 ) zS
4690: 63 72 69 70 74 20 3d 20 22 22 3b 0a 20 20 20 20  cript = "";.    
46a0: 69 66 28 20 7a 52 65 61 6c 53 63 72 69 70 74 3d  if( zRealScript=
46b0: 3d 30 20 29 20 7a 52 65 61 6c 53 63 72 69 70 74  =0 ) zRealScript
46c0: 20 3d 20 22 22 3b 0a 20 20 20 20 69 66 28 20 7a   = "";.    if( z
46d0: 52 65 6d 6f 74 65 41 64 64 72 3d 3d 30 20 29 20  RemoteAddr==0 ) 
46e0: 7a 52 65 6d 6f 74 65 41 64 64 72 20 3d 20 22 22  zRemoteAddr = ""
46f0: 3b 0a 20 20 20 20 69 66 28 20 7a 48 74 74 70 48  ;.    if( zHttpH
4700: 6f 73 74 3d 3d 30 20 29 20 7a 48 74 74 70 48 6f  ost==0 ) zHttpHo
4710: 73 74 20 3d 20 22 22 3b 0a 20 20 20 20 69 66 28  st = "";.    if(
4720: 20 7a 52 65 66 65 72 65 72 3d 3d 30 20 29 20 7a   zReferer==0 ) z
4730: 52 65 66 65 72 65 72 20 3d 20 22 22 3b 0a 20 20  Referer = "";.  
4740: 20 20 69 66 28 20 7a 41 67 65 6e 74 3d 3d 30 20    if( zAgent==0 
4750: 29 20 7a 41 67 65 6e 74 20 3d 20 22 22 3b 0a 20  ) zAgent = "";. 
4760: 20 20 20 67 65 74 74 69 6d 65 6f 66 64 61 79 28     gettimeofday(
4770: 26 6e 6f 77 2c 20 30 29 3b 0a 20 20 20 20 70 54  &now, 0);.    pT
4780: 6d 20 3d 20 6c 6f 63 61 6c 74 69 6d 65 28 26 6e  m = localtime(&n
4790: 6f 77 2e 74 76 5f 73 65 63 29 3b 0a 20 20 20 20  ow.tv_sec);.    
47a0: 73 74 72 66 74 69 6d 65 28 7a 44 61 74 65 2c 20  strftime(zDate, 
47b0: 73 69 7a 65 6f 66 28 7a 44 61 74 65 29 2c 20 22  sizeof(zDate), "
47c0: 25 59 2d 25 6d 2d 25 64 20 25 48 3a 25 4d 3a 25  %Y-%m-%d %H:%M:%
47d0: 53 22 2c 20 70 54 6d 29 3b 0a 20 20 20 20 73 7a  S", pTm);.    sz
47e0: 20 3d 20 73 74 72 66 74 69 6d 65 28 7a 45 78 70   = strftime(zExp
47f0: 4c 6f 67 46 69 6c 65 2c 20 73 69 7a 65 6f 66 28  LogFile, sizeof(
4800: 7a 45 78 70 4c 6f 67 46 69 6c 65 29 2c 20 7a 4c  zExpLogFile), zL
4810: 6f 67 46 69 6c 65 2c 20 70 54 6d 29 3b 0a 20 20  ogFile, pTm);.  
4820: 20 20 69 66 28 20 73 7a 3e 30 20 26 26 20 73 7a    if( sz>0 && sz
4830: 3c 73 69 7a 65 6f 66 28 7a 45 78 70 4c 6f 67 46  <sizeof(zExpLogF
4840: 69 6c 65 29 2d 32 20 29 7b 0a 20 20 20 20 20 20  ile)-2 ){.      
4850: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 45 78 70  zFilename = zExp
4860: 4c 6f 67 46 69 6c 65 3b 0a 20 20 20 20 7d 65 6c  LogFile;.    }el
4870: 73 65 7b 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e  se{.      zFilen
4880: 61 6d 65 20 3d 20 7a 4c 6f 67 46 69 6c 65 3b 0a  ame = zLogFile;.
4890: 20 20 20 20 7d 0a 20 20 20 20 77 61 69 74 70 69      }.    waitpi
48a0: 64 28 2d 31 2c 20 26 77 61 69 74 53 74 61 74 75  d(-1, &waitStatu
48b0: 73 2c 20 57 4e 4f 48 41 4e 47 29 3b 0a 20 20 20  s, WNOHANG);.   
48c0: 20 67 65 74 72 75 73 61 67 65 28 52 55 53 41 47   getrusage(RUSAG
48d0: 45 5f 53 45 4c 46 2c 20 26 73 65 6c 66 29 3b 0a  E_SELF, &self);.
48e0: 20 20 20 20 67 65 74 72 75 73 61 67 65 28 52 55      getrusage(RU
48f0: 53 41 47 45 5f 43 48 49 4c 44 52 45 4e 2c 20 26  SAGE_CHILDREN, &
4900: 63 68 69 6c 64 72 65 6e 29 3b 0a 20 20 20 20 69  children);.    i
4910: 66 28 20 28 6c 6f 67 20 3d 20 66 6f 70 65 6e 28  f( (log = fopen(
4920: 7a 46 69 6c 65 6e 61 6d 65 2c 22 61 22 29 29 21  zFilename,"a"))!
4930: 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 43 4f 4d  =0 ){.#ifdef COM
4940: 42 49 4e 45 44 5f 4c 4f 47 5f 46 4f 52 4d 41 54  BINED_LOG_FORMAT
4950: 0a 20 20 20 20 20 20 73 74 72 66 74 69 6d 65 28  .      strftime(
4960: 7a 44 61 74 65 2c 20 73 69 7a 65 6f 66 28 7a 44  zDate, sizeof(zD
4970: 61 74 65 29 2c 20 22 25 64 2f 25 62 2f 25 59 3a  ate), "%d/%b/%Y:
4980: 25 48 3a 25 4d 3a 25 53 20 25 7a 22 2c 20 70 54  %H:%M:%S %z", pT
4990: 6d 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  m);.      fprint
49a0: 66 28 6c 6f 67 2c 20 22 25 73 20 2d 20 2d 20 5b  f(log, "%s - - [
49b0: 25 73 5d 20 5c 22 25 73 20 25 73 20 25 73 5c 22  %s] \"%s %s %s\"
49c0: 20 25 73 20 25 64 20 5c 22 25 73 5c 22 20 5c 22   %s %d \"%s\" \"
49d0: 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %s\"\n",.       
49e0: 20 20 20 20 20 20 20 7a 52 65 6d 6f 74 65 41 64         zRemoteAd
49f0: 64 72 2c 20 7a 44 61 74 65 2c 20 7a 4d 65 74 68  dr, zDate, zMeth
4a00: 6f 64 2c 20 7a 53 63 72 69 70 74 2c 20 7a 50 72  od, zScript, zPr
4a10: 6f 74 6f 63 6f 6c 2c 0a 20 20 20 20 20 20 20 20  otocol,.        
4a20: 20 20 20 20 20 20 7a 52 65 70 6c 79 53 74 61 74        zReplyStat
4a30: 75 73 2c 20 6e 4f 75 74 2c 20 7a 52 65 66 65 72  us, nOut, zRefer
4a40: 65 72 2c 20 7a 41 67 65 6e 74 29 3b 0a 23 65 6c  er, zAgent);.#el
4a50: 73 65 0a 20 20 20 20 20 20 73 74 72 66 74 69 6d  se.      strftim
4a60: 65 28 7a 44 61 74 65 2c 20 73 69 7a 65 6f 66 28  e(zDate, sizeof(
4a70: 7a 44 61 74 65 29 2c 20 22 25 59 2d 25 6d 2d 25  zDate), "%Y-%m-%
4a80: 64 20 25 48 3a 25 4d 3a 25 53 22 2c 20 70 54 6d  d %H:%M:%S", pTm
4a90: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20  );.      /* Log 
4aa0: 72 65 63 6f 72 64 20 66 69 6c 65 73 3a 0a 20 20  record files:.  
4ab0: 20 20 20 20 2a 2a 20 20 28 31 29 20 44 61 74 65      **  (1) Date
4ac0: 20 61 6e 64 20 74 69 6d 65 0a 20 20 20 20 20 20   and time.      
4ad0: 2a 2a 20 20 28 32 29 20 49 50 20 61 64 64 72 65  **  (2) IP addre
4ae0: 73 73 0a 20 20 20 20 20 20 2a 2a 20 20 28 33 29  ss.      **  (3)
4af0: 20 55 52 4c 20 62 65 69 6e 67 20 61 63 63 65 73   URL being acces
4b00: 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 20 28 34  sed.      **  (4
4b10: 29 20 52 65 66 65 72 65 72 0a 20 20 20 20 20 20  ) Referer.      
4b20: 2a 2a 20 20 28 35 29 20 52 65 70 6c 79 20 73 74  **  (5) Reply st
4b30: 61 74 75 73 0a 20 20 20 20 20 20 2a 2a 20 20 28  atus.      **  (
4b40: 36 29 20 42 79 74 65 73 20 72 65 63 65 69 76 65  6) Bytes receive
4b50: 64 0a 20 20 20 20 20 20 2a 2a 20 20 28 37 29 20  d.      **  (7) 
4b60: 42 79 74 65 73 20 73 65 6e 74 0a 20 20 20 20 20  Bytes sent.     
4b70: 20 2a 2a 20 20 28 38 29 20 53 65 6c 66 20 75 73   **  (8) Self us
4b80: 65 72 20 74 69 6d 65 0a 20 20 20 20 20 20 2a 2a  er time.      **
4b90: 20 20 28 39 29 20 53 65 6c 66 20 73 79 73 74 65    (9) Self syste
4ba0: 6d 20 74 69 6d 65 0a 20 20 20 20 20 20 2a 2a 20  m time.      ** 
4bb0: 28 31 30 29 20 43 68 69 6c 64 72 65 6e 20 75 73  (10) Children us
4bc0: 65 72 20 74 69 6d 65 0a 20 20 20 20 20 20 2a 2a  er time.      **
4bd0: 20 28 31 31 29 20 43 68 69 6c 64 72 65 6e 20 73   (11) Children s
4be0: 79 73 74 65 6d 20 74 69 6d 65 0a 20 20 20 20 20  ystem time.     
4bf0: 20 2a 2a 20 28 31 32 29 20 54 6f 74 61 6c 20 77   ** (12) Total w
4c00: 61 6c 6c 2d 63 6c 6f 63 6b 20 74 69 6d 65 0a 20  all-clock time. 
4c10: 20 20 20 20 20 2a 2a 20 28 31 33 29 20 52 65 71       ** (13) Req
4c20: 75 65 73 74 20 6e 75 6d 62 65 72 20 66 6f 72 20  uest number for 
4c30: 73 61 6d 65 20 54 43 50 2f 49 50 20 63 6f 6e 6e  same TCP/IP conn
4c40: 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ection.      ** 
4c50: 28 31 34 29 20 55 73 65 72 20 61 67 65 6e 74 0a  (14) User agent.
4c60: 20 20 20 20 20 20 2a 2a 20 28 31 35 29 20 52 65        ** (15) Re
4c70: 6d 6f 74 65 20 75 73 65 72 0a 20 20 20 20 20 20  mote user.      
4c80: 2a 2a 20 28 31 36 29 20 42 79 74 65 73 20 6f 66  ** (16) Bytes of
4c90: 20 55 52 4c 20 74 68 61 74 20 63 6f 72 72 65 73   URL that corres
4ca0: 70 6f 6e 64 20 74 6f 20 74 68 65 20 53 43 52 49  pond to the SCRI
4cb0: 50 54 5f 4e 41 4d 45 0a 20 20 20 20 20 20 2a 2a  PT_NAME.      **
4cc0: 20 28 31 37 29 20 4c 69 6e 65 20 6e 75 6d 62 65   (17) Line numbe
4cd0: 72 20 69 6e 20 73 6f 75 72 63 65 20 66 69 6c 65  r in source file
4ce0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
4cf0: 66 70 72 69 6e 74 66 28 6c 6f 67 2c 0a 20 20 20  fprintf(log,.   
4d00: 20 20 20 20 20 22 25 73 2c 25 73 2c 5c 22 25 73       "%s,%s,\"%s
4d10: 3a 2f 2f 25 73 25 73 5c 22 2c 5c 22 25 73 5c 22  ://%s%s\",\"%s\"
4d20: 2c 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 25  ,".           "%
4d30: 73 2c 25 64 2c 25 64 2c 25 64 2c 25 64 2c 25 64  s,%d,%d,%d,%d,%d
4d40: 2c 25 64 2c 25 64 2c 25 64 2c 5c 22 25 73 5c 22  ,%d,%d,%d,\"%s\"
4d50: 2c 5c 22 25 73 5c 22 2c 25 64 2c 25 64 5c 6e 22  ,\"%s\",%d,%d\n"
4d60: 2c 0a 20 20 20 20 20 20 20 20 7a 44 61 74 65 2c  ,.        zDate,
4d70: 20 7a 52 65 6d 6f 74 65 41 64 64 72 2c 20 7a 48   zRemoteAddr, zH
4d80: 74 74 70 2c 20 45 73 63 61 70 65 28 7a 48 74 74  ttp, Escape(zHtt
4d90: 70 48 6f 73 74 29 2c 20 45 73 63 61 70 65 28 7a  pHost), Escape(z
4da0: 53 63 72 69 70 74 29 2c 0a 20 20 20 20 20 20 20  Script),.       
4db0: 20 45 73 63 61 70 65 28 7a 52 65 66 65 72 65 72   Escape(zReferer
4dc0: 29 2c 20 7a 52 65 70 6c 79 53 74 61 74 75 73 2c  ), zReplyStatus,
4dd0: 20 6e 49 6e 2c 20 6e 4f 75 74 2c 0a 20 20 20 20   nIn, nOut,.    
4de0: 20 20 20 20 74 76 6d 73 28 26 73 65 6c 66 2e 72      tvms(&self.r
4df0: 75 5f 75 74 69 6d 65 29 20 2d 20 74 76 6d 73 28  u_utime) - tvms(
4e00: 26 70 72 69 6f 72 53 65 6c 66 2e 72 75 5f 75 74  &priorSelf.ru_ut
4e10: 69 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 74 76  ime),.        tv
4e20: 6d 73 28 26 73 65 6c 66 2e 72 75 5f 73 74 69 6d  ms(&self.ru_stim
4e30: 65 29 20 2d 20 74 76 6d 73 28 26 70 72 69 6f 72  e) - tvms(&prior
4e40: 53 65 6c 66 2e 72 75 5f 73 74 69 6d 65 29 2c 0a  Self.ru_stime),.
4e50: 20 20 20 20 20 20 20 20 74 76 6d 73 28 26 63 68          tvms(&ch
4e60: 69 6c 64 72 65 6e 2e 72 75 5f 75 74 69 6d 65 29  ildren.ru_utime)
4e70: 20 2d 20 74 76 6d 73 28 26 70 72 69 6f 72 43 68   - tvms(&priorCh
4e80: 69 6c 64 2e 72 75 5f 75 74 69 6d 65 29 2c 0a 20  ild.ru_utime),. 
4e90: 20 20 20 20 20 20 20 74 76 6d 73 28 26 63 68 69         tvms(&chi
4ea0: 6c 64 72 65 6e 2e 72 75 5f 73 74 69 6d 65 29 20  ldren.ru_stime) 
4eb0: 2d 20 74 76 6d 73 28 26 70 72 69 6f 72 43 68 69  - tvms(&priorChi
4ec0: 6c 64 2e 72 75 5f 73 74 69 6d 65 29 2c 0a 20 20  ld.ru_stime),.  
4ed0: 20 20 20 20 20 20 74 76 6d 73 28 26 6e 6f 77 29        tvms(&now)
4ee0: 20 2d 20 74 76 6d 73 28 26 62 65 67 69 6e 54 69   - tvms(&beginTi
4ef0: 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 6e 52 65  me),.        nRe
4f00: 71 75 65 73 74 2c 20 45 73 63 61 70 65 28 7a 41  quest, Escape(zA
4f10: 67 65 6e 74 29 2c 20 45 73 63 61 70 65 28 7a 52  gent), Escape(zR
4f20: 4d 29 2c 0a 20 20 20 20 20 20 20 20 28 69 6e 74  M),.        (int
4f30: 29 28 73 74 72 6c 65 6e 28 7a 48 74 74 70 29 2b  )(strlen(zHttp)+
4f40: 73 74 72 6c 65 6e 28 7a 48 74 74 70 48 6f 73 74  strlen(zHttpHost
4f50: 29 2b 73 74 72 6c 65 6e 28 7a 52 65 61 6c 53 63  )+strlen(zRealSc
4f60: 72 69 70 74 29 2b 33 29 2c 0a 20 20 20 20 20 20  ript)+3),.      
4f70: 20 20 6c 69 6e 65 4e 75 6d 0a 20 20 20 20 20 20    lineNum.      
4f80: 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 53 65  );.      priorSe
4f90: 6c 66 20 3d 20 73 65 6c 66 3b 0a 20 20 20 20 20  lf = self;.     
4fa0: 20 70 72 69 6f 72 43 68 69 6c 64 20 3d 20 63 68   priorChild = ch
4fb0: 69 6c 64 72 65 6e 3b 0a 20 20 20 20 20 20 62 65  ildren;.      be
4fc0: 67 69 6e 54 69 6d 65 20 3d 20 6e 6f 77 3b 0a 23  ginTime = now;.#
4fd0: 65 6e 64 69 66 0a 20 20 20 20 20 20 66 63 6c 6f  endif.      fclo
4fe0: 73 65 28 6c 6f 67 29 3b 0a 20 20 20 20 20 20 6e  se(log);.      n
4ff0: 49 6e 20 3d 20 6e 4f 75 74 20 3d 20 30 3b 0a 20  In = nOut = 0;. 
5000: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 63     }.  }.  if( c
5010: 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 29  loseConnection )
5020: 7b 0a 20 20 20 20 65 78 69 74 28 65 78 69 74 43  {.    exit(exitC
5030: 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 73 74 61 74  ode);.  }.  stat
5040: 75 73 53 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  usSent = 0;.}../
5050: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65  *.** Allocate me
5060: 6d 6f 72 79 20 73 61 66 65 6c 79 0a 2a 2f 0a 73  mory safely.*/.s
5070: 74 61 74 69 63 20 63 68 61 72 20 2a 53 61 66 65  tatic char *Safe
5080: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 5f 74 20 73  Malloc( size_t s
5090: 69 7a 65 20 29 7b 0a 20 20 63 68 61 72 20 2a 70  ize ){.  char *p
50a0: 3b 0a 0a 20 20 70 20 3d 20 28 63 68 61 72 2a 29  ;..  p = (char*)
50b0: 6d 61 6c 6c 6f 63 28 73 69 7a 65 29 3b 0a 20 20  malloc(size);.  
50c0: 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
50d0: 73 74 72 63 70 79 28 7a 52 65 70 6c 79 53 74 61  strcpy(zReplySta
50e0: 74 75 73 2c 20 22 39 39 38 22 29 3b 0a 20 20 20  tus, "998");.   
50f0: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 31 2c   MakeLogEntry(1,
5100: 31 30 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 4d  100);  /* LOG: M
5110: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 2a  alloc() failed *
5120: 2f 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  /.    exit(1);. 
5130: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
5140: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
5150: 76 61 6c 75 65 20 6f 66 20 65 6e 76 69 72 6f 6e  value of environ
5160: 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 7a 56  ment variable zV
5170: 61 72 20 74 6f 20 7a 56 61 6c 75 65 2e 0a 2a 2f  ar to zValue..*/
5180: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 65 74  .static void Set
5190: 45 6e 76 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  Env(const char *
51a0: 7a 56 61 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  zVar, const char
51b0: 20 2a 7a 56 61 6c 75 65 29 7b 0a 20 20 63 68 61   *zValue){.  cha
51c0: 72 20 2a 7a 3b 0a 20 20 73 69 7a 65 5f 74 20 6c  r *z;.  size_t l
51d0: 65 6e 3b 0a 20 20 69 66 28 20 7a 56 61 6c 75 65  en;.  if( zValue
51e0: 3d 3d 30 20 29 20 7a 56 61 6c 75 65 3d 22 22 3b  ==0 ) zValue="";
51f0: 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 61 6e  .  /* Disable an
5200: 20 61 74 74 65 6d 70 74 65 64 20 62 61 73 68 64   attempted bashd
5210: 6f 6f 72 20 61 74 74 61 63 6b 20 2a 2f 0a 20 20  oor attack */.  
5220: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 56 61 6c  if( strncmp(zVal
5230: 75 65 2c 22 28 29 20 7b 22 2c 34 29 3d 3d 30 20  ue,"() {",4)==0 
5240: 29 20 7a 56 61 6c 75 65 20 3d 20 22 22 3b 0a 20  ) zValue = "";. 
5250: 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 56   len = strlen(zV
5260: 61 72 29 20 2b 20 73 74 72 6c 65 6e 28 7a 56 61  ar) + strlen(zVa
5270: 6c 75 65 29 20 2b 20 32 3b 0a 20 20 7a 20 3d 20  lue) + 2;.  z = 
5280: 53 61 66 65 4d 61 6c 6c 6f 63 28 6c 65 6e 29 3b  SafeMalloc(len);
5290: 0a 20 20 73 70 72 69 6e 74 66 28 7a 2c 22 25 73  .  sprintf(z,"%s
52a0: 3d 25 73 22 2c 7a 56 61 72 2c 7a 56 61 6c 75 65  =%s",zVar,zValue
52b0: 29 3b 0a 20 20 70 75 74 65 6e 76 28 7a 29 3b 0a  );.  putenv(z);.
52c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
52d0: 74 68 65 20 66 69 72 73 74 20 73 70 61 63 65 2d  the first space-
52e0: 64 65 6c 69 6d 69 74 65 64 20 74 6f 6b 65 6e 20  delimited token 
52f0: 66 72 6f 6d 20 61 20 73 74 72 69 6e 67 20 61 6e  from a string an
5300: 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f  d return.** a po
5310: 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 41 64  inter to it.  Ad
5320: 64 20 61 20 4e 55 4c 4c 20 74 6f 20 74 68 65 20  d a NULL to the 
5330: 73 74 72 69 6e 67 20 74 6f 20 74 65 72 6d 69 6e  string to termin
5340: 61 74 65 20 74 68 65 20 74 6f 6b 65 6e 2e 0a 2a  ate the token..*
5350: 2a 20 4d 61 6b 65 20 2a 7a 4c 65 66 74 4f 76 65  * Make *zLeftOve
5360: 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  r point to the s
5370: 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74  tart of the next
5380: 20 74 6f 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69   token..*/.stati
5390: 63 20 63 68 61 72 20 2a 47 65 74 46 69 72 73 74  c char *GetFirst
53a0: 45 6c 65 6d 65 6e 74 28 63 68 61 72 20 2a 7a 49  Element(char *zI
53b0: 6e 70 75 74 2c 20 63 68 61 72 20 2a 2a 7a 4c 65  nput, char **zLe
53c0: 66 74 4f 76 65 72 29 7b 0a 20 20 63 68 61 72 20  ftOver){.  char 
53d0: 2a 7a 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20  *zResult = 0;.  
53e0: 69 66 28 20 7a 49 6e 70 75 74 3d 3d 30 20 29 7b  if( zInput==0 ){
53f0: 0a 20 20 20 20 69 66 28 20 7a 4c 65 66 74 4f 76  .    if( zLeftOv
5400: 65 72 20 29 20 2a 7a 4c 65 66 74 4f 76 65 72 20  er ) *zLeftOver 
5410: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
5420: 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  0;.  }.  while( 
5430: 69 73 73 70 61 63 65 28 2a 28 75 6e 73 69 67 6e  isspace(*(unsign
5440: 65 64 20 63 68 61 72 2a 29 7a 49 6e 70 75 74 29  ed char*)zInput)
5450: 20 29 7b 20 7a 49 6e 70 75 74 2b 2b 3b 20 7d 0a   ){ zInput++; }.
5460: 20 20 7a 52 65 73 75 6c 74 20 3d 20 7a 49 6e 70    zResult = zInp
5470: 75 74 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 49  ut;.  while( *zI
5480: 6e 70 75 74 20 26 26 20 21 69 73 73 70 61 63 65  nput && !isspace
5490: 28 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  (*(unsigned char
54a0: 2a 29 7a 49 6e 70 75 74 29 20 29 7b 20 7a 49 6e  *)zInput) ){ zIn
54b0: 70 75 74 2b 2b 3b 20 7d 0a 20 20 69 66 28 20 2a  put++; }.  if( *
54c0: 7a 49 6e 70 75 74 20 29 7b 0a 20 20 20 20 2a 7a  zInput ){.    *z
54d0: 49 6e 70 75 74 20 3d 20 30 3b 0a 20 20 20 20 7a  Input = 0;.    z
54e0: 49 6e 70 75 74 2b 2b 3b 0a 20 20 20 20 77 68 69  Input++;.    whi
54f0: 6c 65 28 20 69 73 73 70 61 63 65 28 2a 28 75 6e  le( isspace(*(un
5500: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 49 6e  signed char*)zIn
5510: 70 75 74 29 20 29 7b 20 7a 49 6e 70 75 74 2b 2b  put) ){ zInput++
5520: 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4c  ; }.  }.  if( zL
5530: 65 66 74 4f 76 65 72 20 29 7b 20 2a 7a 4c 65 66  eftOver ){ *zLef
5540: 74 4f 76 65 72 20 3d 20 7a 49 6e 70 75 74 3b 20  tOver = zInput; 
5550: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 73 75  }.  return zResu
5560: 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  lt;.}../*.** Mak
5570: 65 20 61 20 63 6f 70 79 20 6f 66 20 61 20 73 74  e a copy of a st
5580: 72 69 6e 67 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  ring into memory
5590: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
55a0: 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  alloc..*/.static
55b0: 20 63 68 61 72 20 2a 53 74 72 44 75 70 28 63 6f   char *StrDup(co
55c0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63 29 7b  nst char *zSrc){
55d0: 0a 20 20 63 68 61 72 20 2a 7a 44 65 73 74 3b 0a  .  char *zDest;.
55e0: 20 20 73 69 7a 65 5f 74 20 73 69 7a 65 3b 0a 0a    size_t size;..
55f0: 20 20 69 66 28 20 7a 53 72 63 3d 3d 30 20 29 20    if( zSrc==0 ) 
5600: 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 69 7a 65  return 0;.  size
5610: 20 3d 20 73 74 72 6c 65 6e 28 7a 53 72 63 29 20   = strlen(zSrc) 
5620: 2b 20 31 3b 0a 20 20 7a 44 65 73 74 20 3d 20 28  + 1;.  zDest = (
5630: 63 68 61 72 2a 29 53 61 66 65 4d 61 6c 6c 6f 63  char*)SafeMalloc
5640: 28 20 73 69 7a 65 20 29 3b 0a 20 20 73 74 72 63  ( size );.  strc
5650: 70 79 28 7a 44 65 73 74 2c 7a 53 72 63 29 3b 0a  py(zDest,zSrc);.
5660: 20 20 72 65 74 75 72 6e 20 7a 44 65 73 74 3b 0a    return zDest;.
5670: 7d 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 53  }.static char *S
5680: 74 72 41 70 70 65 6e 64 28 63 68 61 72 20 2a 7a  trAppend(char *z
5690: 50 72 69 6f 72 2c 20 63 6f 6e 73 74 20 63 68 61  Prior, const cha
56a0: 72 20 2a 7a 53 65 70 2c 20 63 6f 6e 73 74 20 63  r *zSep, const c
56b0: 68 61 72 20 2a 7a 53 72 63 29 7b 0a 20 20 63 68  har *zSrc){.  ch
56c0: 61 72 20 2a 7a 44 65 73 74 3b 0a 20 20 73 69 7a  ar *zDest;.  siz
56d0: 65 5f 74 20 73 69 7a 65 3b 0a 20 20 73 69 7a 65  e_t size;.  size
56e0: 5f 74 20 6e 30 2c 20 6e 31 2c 20 6e 32 3b 0a 0a  _t n0, n1, n2;..
56f0: 20 20 69 66 28 20 7a 53 72 63 3d 3d 30 20 29 20    if( zSrc==0 ) 
5700: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
5710: 7a 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75  zPrior==0 ) retu
5720: 72 6e 20 53 74 72 44 75 70 28 7a 53 72 63 29 3b  rn StrDup(zSrc);
5730: 0a 20 20 6e 30 20 3d 20 73 74 72 6c 65 6e 28 7a  .  n0 = strlen(z
5740: 50 72 69 6f 72 29 3b 0a 20 20 6e 31 20 3d 20 73  Prior);.  n1 = s
5750: 74 72 6c 65 6e 28 7a 53 65 70 29 3b 0a 20 20 6e  trlen(zSep);.  n
5760: 32 20 3d 20 73 74 72 6c 65 6e 28 7a 53 72 63 29  2 = strlen(zSrc)
5770: 3b 0a 20 20 73 69 7a 65 20 3d 20 6e 30 2b 6e 31  ;.  size = n0+n1
5780: 2b 6e 32 2b 31 3b 0a 20 20 7a 44 65 73 74 20 3d  +n2+1;.  zDest =
5790: 20 28 63 68 61 72 2a 29 53 61 66 65 4d 61 6c 6c   (char*)SafeMall
57a0: 6f 63 28 20 73 69 7a 65 20 29 3b 0a 20 20 6d 65  oc( size );.  me
57b0: 6d 63 70 79 28 7a 44 65 73 74 2c 20 7a 50 72 69  mcpy(zDest, zPri
57c0: 6f 72 2c 20 6e 30 29 3b 0a 20 20 66 72 65 65 28  or, n0);.  free(
57d0: 7a 50 72 69 6f 72 29 3b 0a 20 20 6d 65 6d 63 70  zPrior);.  memcp
57e0: 79 28 26 7a 44 65 73 74 5b 6e 30 5d 2c 7a 53 65  y(&zDest[n0],zSe
57f0: 70 2c 6e 31 29 3b 0a 20 20 6d 65 6d 63 70 79 28  p,n1);.  memcpy(
5800: 26 7a 44 65 73 74 5b 6e 30 2b 6e 31 5d 2c 7a 53  &zDest[n0+n1],zS
5810: 72 63 2c 6e 32 2b 31 29 3b 0a 20 20 72 65 74 75  rc,n2+1);.  retu
5820: 72 6e 20 7a 44 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn zDest;.}../*.
5830: 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 45  ** Compare two E
5840: 54 61 67 20 76 61 6c 75 65 73 2e 20 52 65 74 75  Tag values. Retu
5850: 72 6e 20 30 20 69 66 20 74 68 65 79 20 6d 61 74  rn 0 if they mat
5860: 63 68 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20  ch and non-zero 
5870: 69 66 20 74 68 65 79 20 64 69 66 66 65 72 2e 0a  if they differ..
5880: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 65 20 6f 6e  **.** The one on
5890: 20 74 68 65 20 6c 65 66 74 20 6d 69 67 68 74 20   the left might 
58a0: 62 65 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  be a NULL pointe
58b0: 72 20 61 6e 64 20 69 74 20 6d 69 67 68 74 20 62  r and it might b
58c0: 65 20 71 75 6f 74 65 64 2e 0a 2a 2f 0a 73 74 61  e quoted..*/.sta
58d0: 74 69 63 20 69 6e 74 20 43 6f 6d 70 61 72 65 45  tic int CompareE
58e0: 74 61 67 73 28 63 6f 6e 73 74 20 63 68 61 72 20  tags(const char 
58f0: 2a 7a 41 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *zA, const char 
5900: 2a 7a 42 29 7b 0a 20 20 69 66 28 20 7a 41 3d 3d  *zB){.  if( zA==
5910: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
5920: 69 66 28 20 7a 41 5b 30 5d 3d 3d 27 22 27 20 29  if( zA[0]=='"' )
5930: 7b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 42 20 3d  {.    int lenB =
5940: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 29   (int)strlen(zB)
5950: 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d  ;.    if( strncm
5960: 70 28 7a 41 2b 31 2c 20 7a 42 2c 20 6c 65 6e 42  p(zA+1, zB, lenB
5970: 29 3d 3d 30 20 26 26 20 7a 41 5b 6c 65 6e 42 2b  )==0 && zA[lenB+
5980: 31 5d 3d 3d 27 22 27 20 29 20 72 65 74 75 72 6e  1]=='"' ) return
5990: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
59a0: 20 73 74 72 63 6d 70 28 7a 41 2c 20 7a 42 29 3b   strcmp(zA, zB);
59b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 72 65 61 6b 20  .}../*.** Break 
59c0: 61 20 6c 69 6e 65 20 61 74 20 74 68 65 20 66 69  a line at the fi
59d0: 72 73 74 20 5c 6e 20 6f 72 20 5c 72 20 63 68 61  rst \n or \r cha
59e0: 72 61 63 74 65 72 20 73 65 65 6e 2e 0a 2a 2f 0a  racter seen..*/.
59f0: 73 74 61 74 69 63 20 76 6f 69 64 20 52 65 6d 6f  static void Remo
5a00: 76 65 4e 65 77 6c 69 6e 65 28 63 68 61 72 20 2a  veNewline(char *
5a10: 7a 29 7b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  z){.  if( z==0 )
5a20: 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65   return;.  while
5a30: 28 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c 6e 27  ( *z && *z!='\n'
5a40: 20 26 26 20 2a 7a 21 3d 27 5c 72 27 20 29 7b 20   && *z!='\r' ){ 
5a50: 7a 2b 2b 3b 20 7d 0a 20 20 2a 7a 20 3d 20 30 3b  z++; }.  *z = 0;
5a60: 0a 7d 0a 0a 2f 2a 20 52 65 6e 64 65 72 20 73 65  .}../* Render se
5a70: 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30  conds since 1970
5a80: 20 61 73 20 61 6e 20 52 46 43 38 32 32 20 64 61   as an RFC822 da
5a90: 74 65 20 73 74 72 69 6e 67 2e 20 20 52 65 74 75  te string.  Retu
5aa0: 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
5ab0: 74 6f 20 74 68 61 74 20 73 74 72 69 6e 67 20 69  to that string i
5ac0: 6e 20 61 20 73 74 61 74 69 63 20 62 75 66 66 65  n a static buffe
5ad0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  r..*/.static cha
5ae0: 72 20 2a 52 66 63 38 32 32 44 61 74 65 28 74 69  r *Rfc822Date(ti
5af0: 6d 65 5f 74 20 74 29 7b 0a 20 20 73 74 72 75 63  me_t t){.  struc
5b00: 74 20 74 6d 20 2a 74 6d 3b 0a 20 20 73 74 61 74  t tm *tm;.  stat
5b10: 69 63 20 63 68 61 72 20 7a 44 61 74 65 5b 31 30  ic char zDate[10
5b20: 30 5d 3b 0a 20 20 74 6d 20 3d 20 67 6d 74 69 6d  0];.  tm = gmtim
5b30: 65 28 26 74 29 3b 0a 20 20 73 74 72 66 74 69 6d  e(&t);.  strftim
5b40: 65 28 7a 44 61 74 65 2c 20 73 69 7a 65 6f 66 28  e(zDate, sizeof(
5b50: 7a 44 61 74 65 29 2c 20 22 25 61 2c 20 25 64 20  zDate), "%a, %d 
5b60: 25 62 20 25 59 20 25 48 3a 25 4d 3a 25 53 20 25  %b %Y %H:%M:%S %
5b70: 7a 22 2c 20 74 6d 29 3b 0a 20 20 72 65 74 75 72  z", tm);.  retur
5b80: 6e 20 7a 44 61 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zDate;.}../*.*
5b90: 2a 20 50 72 69 6e 74 20 61 20 64 61 74 65 20 74  * Print a date t
5ba0: 61 67 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ag in the header
5bb0: 2e 20 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74  .  The name of t
5bc0: 68 65 20 74 61 67 20 69 73 20 7a 54 61 67 2e 0a  he tag is zTag..
5bd0: 2a 2a 20 54 68 65 20 64 61 74 65 20 69 73 20 64  ** The date is d
5be0: 65 74 65 72 6d 69 6e 65 64 20 66 72 6f 6d 20 74  etermined from t
5bf0: 68 65 20 75 6e 69 78 20 74 69 6d 65 73 74 61 6d  he unix timestam
5c00: 70 20 67 69 76 65 6e 2e 0a 2a 2f 0a 73 74 61 74  p given..*/.stat
5c10: 69 63 20 69 6e 74 20 44 61 74 65 54 61 67 28 63  ic int DateTag(c
5c20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 67 2c  onst char *zTag,
5c30: 20 74 69 6d 65 5f 74 20 74 29 7b 0a 20 20 72 65   time_t t){.  re
5c40: 74 75 72 6e 20 70 72 69 6e 74 66 28 22 25 73 3a  turn printf("%s:
5c50: 20 25 73 5c 72 5c 6e 22 2c 20 7a 54 61 67 2c 20   %s\r\n", zTag, 
5c60: 52 66 63 38 32 32 44 61 74 65 28 74 29 29 3b 0a  Rfc822Date(t));.
5c70: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61  }../*.** Parse a
5c80: 6e 20 52 46 43 38 32 32 2d 66 6f 72 6d 61 74 74  n RFC822-formatt
5c90: 65 64 20 74 69 6d 65 73 74 61 6d 70 20 61 73 20  ed timestamp as 
5ca0: 77 65 27 64 20 65 78 70 65 63 74 20 66 72 6f 6d  we'd expect from
5cb0: 20 48 54 54 50 20 61 6e 64 20 72 65 74 75 72 6e   HTTP and return
5cc0: 0a 2a 2a 20 61 20 55 6e 69 78 20 65 70 6f 63 68  .** a Unix epoch
5cd0: 20 74 69 6d 65 2e 20 3c 3d 20 7a 65 72 6f 20 69   time. <= zero i
5ce0: 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 66 61  s returned on fa
5cf0: 69 6c 75 72 65 2e 0a 2a 2f 0a 74 69 6d 65 5f 74  ilure..*/.time_t
5d00: 20 50 61 72 73 65 52 66 63 38 32 32 44 61 74 65   ParseRfc822Date
5d10: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61  (const char *zDa
5d20: 74 65 29 7b 0a 20 20 69 6e 74 20 6d 64 61 79 2c  te){.  int mday,
5d30: 20 6d 6f 6e 2c 20 79 65 61 72 2c 20 79 64 61 79   mon, year, yday
5d40: 2c 20 68 6f 75 72 2c 20 6d 69 6e 2c 20 73 65 63  , hour, min, sec
5d50: 3b 0a 20 20 63 68 61 72 20 7a 49 67 6e 6f 72 65  ;.  char zIgnore
5d60: 5b 34 5d 3b 0a 20 20 63 68 61 72 20 7a 4d 6f 6e  [4];.  char zMon
5d70: 74 68 5b 34 5d 3b 0a 20 20 73 74 61 74 69 63 20  th[4];.  static 
5d80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73  const char *cons
5d90: 74 20 61 7a 4d 6f 6e 74 68 73 5b 5d 20 3d 0a 20  t azMonths[] =. 
5da0: 20 20 20 7b 22 4a 61 6e 22 2c 20 22 46 65 62 22     {"Jan", "Feb"
5db0: 2c 20 22 4d 61 72 22 2c 20 22 41 70 72 22 2c 20  , "Mar", "Apr", 
5dc0: 22 4d 61 79 22 2c 20 22 4a 75 6e 22 2c 0a 20 20  "May", "Jun",.  
5dd0: 20 20 20 22 4a 75 6c 22 2c 20 22 41 75 67 22 2c     "Jul", "Aug",
5de0: 20 22 53 65 70 22 2c 20 22 4f 63 74 22 2c 20 22   "Sep", "Oct", "
5df0: 4e 6f 76 22 2c 20 22 44 65 63 22 2c 20 30 7d 3b  Nov", "Dec", 0};
5e00: 0a 20 20 69 66 28 20 37 3d 3d 73 73 63 61 6e 66  .  if( 7==sscanf
5e10: 28 7a 44 61 74 65 2c 20 22 25 33 5b 41 2d 5a 61  (zDate, "%3[A-Za
5e20: 2d 7a 5d 2c 20 25 64 20 25 33 5b 41 2d 5a 61 2d  -z], %d %3[A-Za-
5e30: 7a 5d 20 25 64 20 25 64 3a 25 64 3a 25 64 22 2c  z] %d %d:%d:%d",
5e40: 20 7a 49 67 6e 6f 72 65 2c 0a 20 20 20 20 20 20   zIgnore,.      
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e60: 20 26 6d 64 61 79 2c 20 7a 4d 6f 6e 74 68 2c 20   &mday, zMonth, 
5e70: 26 79 65 61 72 2c 20 26 68 6f 75 72 2c 20 26 6d  &year, &hour, &m
5e80: 69 6e 2c 20 26 73 65 63 29 29 7b 0a 20 20 20 20  in, &sec)){.    
5e90: 69 66 28 20 79 65 61 72 20 3e 20 31 39 30 30 20  if( year > 1900 
5ea0: 29 20 79 65 61 72 20 2d 3d 20 31 39 30 30 3b 0a  ) year -= 1900;.
5eb0: 20 20 20 20 66 6f 72 28 6d 6f 6e 3d 30 3b 20 61      for(mon=0; a
5ec0: 7a 4d 6f 6e 74 68 73 5b 6d 6f 6e 5d 3b 20 6d 6f  zMonths[mon]; mo
5ed0: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  n++){.      if( 
5ee0: 21 73 74 72 6e 63 6d 70 28 20 61 7a 4d 6f 6e 74  !strncmp( azMont
5ef0: 68 73 5b 6d 6f 6e 5d 2c 20 7a 4d 6f 6e 74 68 2c  hs[mon], zMonth,
5f00: 20 33 20 29 29 7b 0a 20 20 20 20 20 20 20 20 69   3 )){.        i
5f10: 6e 74 20 6e 44 61 79 3b 0a 20 20 20 20 20 20 20  nt nDay;.       
5f20: 20 69 6e 74 20 69 73 4c 65 61 70 59 72 3b 0a 20   int isLeapYr;. 
5f30: 20 20 20 20 20 20 20 73 74 61 74 69 63 20 69 6e         static in
5f40: 74 20 70 72 69 6f 72 44 61 79 73 5b 5d 20 3d 0a  t priorDays[] =.
5f50: 20 20 20 20 20 20 20 20 20 7b 20 20 30 2c 20 33           {  0, 3
5f60: 31 2c 20 35 39 2c 20 39 30 2c 31 32 30 2c 31 35  1, 59, 90,120,15
5f70: 31 2c 31 38 31 2c 32 31 32 2c 32 34 33 2c 32 37  1,181,212,243,27
5f80: 33 2c 33 30 34 2c 33 33 34 20 7d 3b 0a 20 20 20  3,304,334 };.   
5f90: 20 20 20 20 20 69 66 28 20 6d 6f 6e 3c 30 20 29       if( mon<0 )
5fa0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
5fb0: 6e 59 65 61 72 20 3d 20 28 31 31 20 2d 20 6d 6f  nYear = (11 - mo
5fc0: 6e 29 2f 31 32 3b 0a 20 20 20 20 20 20 20 20 20  n)/12;.         
5fd0: 20 79 65 61 72 20 2d 3d 20 6e 59 65 61 72 3b 0a   year -= nYear;.
5fe0: 20 20 20 20 20 20 20 20 20 20 6d 6f 6e 20 2b 3d            mon +=
5ff0: 20 6e 59 65 61 72 2a 31 32 3b 0a 20 20 20 20 20   nYear*12;.     
6000: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 6f 6e     }else if( mon
6010: 3e 31 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >11 ){.         
6020: 20 79 65 61 72 20 2b 3d 20 6d 6f 6e 2f 31 32 3b   year += mon/12;
6030: 0a 20 20 20 20 20 20 20 20 20 20 6d 6f 6e 20 25  .          mon %
6040: 3d 20 31 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = 12;.        }.
6050: 20 20 20 20 20 20 20 20 69 73 4c 65 61 70 59 72          isLeapYr
6060: 20 3d 20 79 65 61 72 25 34 3d 3d 30 20 26 26 20   = year%4==0 && 
6070: 28 79 65 61 72 25 31 30 30 21 3d 30 20 7c 7c 20  (year%100!=0 || 
6080: 28 79 65 61 72 2b 33 30 30 29 25 34 30 30 3d 3d  (year+300)%400==
6090: 30 29 3b 0a 20 20 20 20 20 20 20 20 79 64 61 79  0);.        yday
60a0: 20 3d 20 70 72 69 6f 72 44 61 79 73 5b 6d 6f 6e   = priorDays[mon
60b0: 5d 20 2b 20 6d 64 61 79 20 2d 20 31 3b 0a 20 20  ] + mday - 1;.  
60c0: 20 20 20 20 20 20 69 66 28 20 69 73 4c 65 61 70        if( isLeap
60d0: 59 72 20 26 26 20 6d 6f 6e 3e 31 20 29 20 79 64  Yr && mon>1 ) yd
60e0: 61 79 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 44  ay++;.        nD
60f0: 61 79 20 3d 20 28 79 65 61 72 2d 37 30 29 2a 33  ay = (year-70)*3
6100: 36 35 20 2b 20 28 79 65 61 72 2d 36 39 29 2f 34  65 + (year-69)/4
6110: 20 2d 20 79 65 61 72 2f 31 30 30 20 2b 20 28 79   - year/100 + (y
6120: 65 61 72 2b 33 30 30 29 2f 34 30 30 20 2b 20 79  ear+300)/400 + y
6130: 64 61 79 3b 0a 20 20 20 20 20 20 20 20 72 65 74  day;.        ret
6140: 75 72 6e 20 28 28 74 69 6d 65 5f 74 29 28 6e 44  urn ((time_t)(nD
6150: 61 79 2a 32 34 20 2b 20 68 6f 75 72 29 2a 36 30  ay*24 + hour)*60
6160: 20 2b 20 6d 69 6e 29 2a 36 30 20 2b 20 73 65 63   + min)*60 + sec
6170: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6180: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
6190: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 70 72  }../*.** Test pr
61a0: 6f 63 65 64 75 72 65 20 66 6f 72 20 50 61 72 73  ocedure for Pars
61b0: 65 52 66 63 38 32 32 44 61 74 65 0a 2a 2f 0a 76  eRfc822Date.*/.v
61c0: 6f 69 64 20 54 65 73 74 50 61 72 73 65 52 66 63  oid TestParseRfc
61d0: 38 32 32 44 61 74 65 28 76 6f 69 64 29 7b 0a 20  822Date(void){. 
61e0: 20 74 69 6d 65 5f 74 20 74 31 2c 20 74 32 3b 0a   time_t t1, t2;.
61f0: 20 20 66 6f 72 28 74 31 3d 30 3b 20 74 31 3c 30    for(t1=0; t1<0
6200: 78 37 66 66 66 66 66 66 66 3b 20 74 31 20 2b 3d  x7fffffff; t1 +=
6210: 20 31 32 37 29 7b 0a 20 20 20 20 74 32 20 3d 20   127){.    t2 = 
6220: 50 61 72 73 65 52 66 63 38 32 32 44 61 74 65 28  ParseRfc822Date(
6230: 52 66 63 38 32 32 44 61 74 65 28 74 31 29 29 3b  Rfc822Date(t1));
6240: 0a 20 20 20 20 61 73 73 65 72 74 28 20 74 31 3d  .    assert( t1=
6250: 3d 74 32 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  =t2 );.  }.}../*
6260: 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 66 69  .** Print the fi
6270: 72 73 74 20 6c 69 6e 65 20 6f 66 20 61 20 72 65  rst line of a re
6280: 73 70 6f 6e 73 65 20 66 6f 6c 6c 6f 77 65 64 20  sponse followed 
6290: 62 79 20 74 68 65 20 73 65 72 76 65 72 20 74 79  by the server ty
62a0: 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  pe..*/.static vo
62b0: 69 64 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65  id StartResponse
62c0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65  (const char *zRe
62d0: 73 75 6c 74 43 6f 64 65 29 7b 0a 20 20 74 69 6d  sultCode){.  tim
62e0: 65 5f 74 20 6e 6f 77 3b 0a 20 20 74 69 6d 65 28  e_t now;.  time(
62f0: 26 6e 6f 77 29 3b 0a 20 20 69 66 28 20 73 74 61  &now);.  if( sta
6300: 74 75 73 53 65 6e 74 20 29 20 72 65 74 75 72 6e  tusSent ) return
6310: 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e  ;.  nOut += prin
6320: 74 66 28 22 25 73 20 25 73 5c 72 5c 6e 22 2c 20  tf("%s %s\r\n", 
6330: 7a 50 72 6f 74 6f 63 6f 6c 2c 20 7a 52 65 73 75  zProtocol, zResu
6340: 6c 74 43 6f 64 65 29 3b 0a 20 20 73 74 72 6e 63  ltCode);.  strnc
6350: 70 79 28 7a 52 65 70 6c 79 53 74 61 74 75 73 2c  py(zReplyStatus,
6360: 20 7a 52 65 73 75 6c 74 43 6f 64 65 2c 20 33 29   zResultCode, 3)
6370: 3b 0a 20 20 7a 52 65 70 6c 79 53 74 61 74 75 73  ;.  zReplyStatus
6380: 5b 33 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a  [3] = 0;.  if( z
6390: 52 65 70 6c 79 53 74 61 74 75 73 5b 30 5d 3e 3d  ReplyStatus[0]>=
63a0: 27 34 27 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65  '4' ){.    close
63b0: 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 31 3b 0a  Connection = 1;.
63c0: 20 20 7d 0a 20 20 69 66 28 20 63 6c 6f 73 65 43    }.  if( closeC
63d0: 6f 6e 6e 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20  onnection ){.   
63e0: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
63f0: 22 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f  "Connection: clo
6400: 73 65 5c 72 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73  se\r\n");.  }els
6410: 65 7b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70  e{.    nOut += p
6420: 72 69 6e 74 66 28 22 43 6f 6e 6e 65 63 74 69 6f  rintf("Connectio
6430: 6e 3a 20 6b 65 65 70 2d 61 6c 69 76 65 5c 72 5c  n: keep-alive\r\
6440: 6e 22 29 3b 0a 20 20 7d 0a 20 20 6e 4f 75 74 20  n");.  }.  nOut 
6450: 2b 3d 20 44 61 74 65 54 61 67 28 22 44 61 74 65  += DateTag("Date
6460: 22 2c 20 6e 6f 77 29 3b 0a 20 20 73 74 61 74 75  ", now);.  statu
6470: 73 53 65 6e 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  sSent = 1;.}../*
6480: 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c 69  .** Tell the cli
6490: 65 6e 74 20 74 68 61 74 20 74 68 65 72 65 20 69  ent that there i
64a0: 73 20 6e 6f 20 73 75 63 68 20 64 6f 63 75 6d 65  s no such docume
64b0: 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  nt.*/.static voi
64c0: 64 20 4e 6f 74 46 6f 75 6e 64 28 69 6e 74 20 6c  d NotFound(int l
64d0: 69 6e 65 6e 6f 29 7b 0a 20 20 53 74 61 72 74 52  ineno){.  StartR
64e0: 65 73 70 6f 6e 73 65 28 22 34 30 34 20 4e 6f 74  esponse("404 Not
64f0: 20 46 6f 75 6e 64 22 29 3b 0a 20 20 6e 4f 75 74   Found");.  nOut
6500: 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20   += printf(.    
6510: 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74  "Content-type: t
6520: 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e 22 0a 20 20  ext/html\r\n".  
6530: 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 22 3c 68    "\r\n".    "<h
6540: 65 61 64 3e 3c 74 69 74 6c 65 20 6c 69 6e 65 6e  ead><title linen
6550: 6f 3d 5c 22 25 64 5c 22 3e 4e 6f 74 20 46 6f 75  o=\"%d\">Not Fou
6560: 6e 64 3c 2f 74 69 74 6c 65 3e 3c 2f 68 65 61 64  nd</title></head
6570: 3e 5c 6e 22 0a 20 20 20 20 22 3c 62 6f 64 79 3e  >\n".    "<body>
6580: 3c 68 31 3e 44 6f 63 75 6d 65 6e 74 20 4e 6f 74  <h1>Document Not
6590: 20 46 6f 75 6e 64 3c 2f 68 31 3e 5c 6e 22 0a 20   Found</h1>\n". 
65a0: 20 20 20 22 54 68 65 20 64 6f 63 75 6d 65 6e 74     "The document
65b0: 20 25 73 20 69 73 20 6e 6f 74 20 61 76 61 69 6c   %s is not avail
65c0: 61 62 6c 65 20 6f 6e 20 74 68 69 73 20 73 65 72  able on this ser
65d0: 76 65 72 5c 6e 22 0a 20 20 20 20 22 3c 2f 62 6f  ver\n".    "</bo
65e0: 64 79 3e 5c 6e 22 2c 20 6c 69 6e 65 6e 6f 2c 20  dy>\n", lineno, 
65f0: 7a 53 63 72 69 70 74 29 3b 0a 20 20 4d 61 6b 65  zScript);.  Make
6600: 4c 6f 67 45 6e 74 72 79 28 30 2c 20 6c 69 6e 65  LogEntry(0, line
6610: 6e 6f 29 3b 0a 20 20 65 78 69 74 28 30 29 3b 0a  no);.  exit(0);.
6620: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68  }../*.** Tell th
6630: 65 20 63 6c 69 65 6e 74 20 74 68 61 74 20 74 68  e client that th
6640: 65 79 20 61 72 65 20 6e 6f 74 20 77 65 6c 63 6f  ey are not welco
6650: 6d 65 64 20 68 65 72 65 2e 0a 2a 2f 0a 73 74 61  med here..*/.sta
6660: 74 69 63 20 76 6f 69 64 20 46 6f 72 62 69 64 64  tic void Forbidd
6670: 65 6e 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  en(int lineno){.
6680: 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28    StartResponse(
6690: 22 34 30 33 20 46 6f 72 62 69 64 64 65 6e 22 29  "403 Forbidden")
66a0: 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e  ;.  nOut += prin
66b0: 74 66 28 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74  tf(.    "Content
66c0: 2d 74 79 70 65 3a 20 74 65 78 74 2f 70 6c 61 69  -type: text/plai
66d0: 6e 5c 72 5c 6e 22 0a 20 20 20 20 22 5c 72 5c 6e  n\r\n".    "\r\n
66e0: 22 0a 20 20 20 20 22 41 63 63 65 73 73 20 64 65  ".    "Access de
66f0: 6e 69 65 64 5c 6e 22 0a 20 20 29 3b 0a 20 20 63  nied\n".  );.  c
6700: 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d  loseConnection =
6710: 20 31 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74   1;.  MakeLogEnt
6720: 72 79 28 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20  ry(0, lineno);. 
6730: 20 65 78 69 74 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a   exit(0);.}../*.
6740: 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c 69 65  ** Tell the clie
6750: 6e 74 20 74 68 61 74 20 61 75 74 68 6f 72 69 7a  nt that authoriz
6760: 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65  ation is require
6770: 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a  d to access the.
6780: 2a 2a 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** document..*/.
6790: 73 74 61 74 69 63 20 76 6f 69 64 20 4e 6f 74 41  static void NotA
67a0: 75 74 68 6f 72 69 7a 65 64 28 63 6f 6e 73 74 20  uthorized(const 
67b0: 63 68 61 72 20 2a 7a 52 65 61 6c 6d 29 7b 0a 20  char *zRealm){. 
67c0: 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22   StartResponse("
67d0: 34 30 31 20 41 75 74 68 6f 72 69 7a 61 74 69 6f  401 Authorizatio
67e0: 6e 20 52 65 71 75 69 72 65 64 22 29 3b 0a 20 20  n Required");.  
67f0: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a  nOut += printf(.
6800: 20 20 20 20 22 57 57 57 2d 41 75 74 68 65 6e 74      "WWW-Authent
6810: 69 63 61 74 65 3a 20 42 61 73 69 63 20 72 65 61  icate: Basic rea
6820: 6c 6d 3d 5c 22 25 73 5c 22 5c 72 5c 6e 22 0a 20  lm=\"%s\"\r\n". 
6830: 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65     "Content-type
6840: 3a 20 74 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e 22  : text/html\r\n"
6850: 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20  .    "\r\n".    
6860: 22 3c 68 65 61 64 3e 3c 74 69 74 6c 65 3e 4e 6f  "<head><title>No
6870: 74 20 41 75 74 68 6f 72 69 7a 65 64 3c 2f 74 69  t Authorized</ti
6880: 74 6c 65 3e 3c 2f 68 65 61 64 3e 5c 6e 22 0a 20  tle></head>\n". 
6890: 20 20 20 22 3c 62 6f 64 79 3e 3c 68 31 3e 34 30     "<body><h1>40
68a0: 31 20 4e 6f 74 20 41 75 74 68 6f 72 69 7a 65 64  1 Not Authorized
68b0: 3c 2f 68 31 3e 5c 6e 22 0a 20 20 20 20 22 41 20  </h1>\n".    "A 
68c0: 6c 6f 67 69 6e 20 61 6e 64 20 70 61 73 73 77 6f  login and passwo
68d0: 72 64 20 61 72 65 20 72 65 71 75 69 72 65 64 20  rd are required 
68e0: 66 6f 72 20 74 68 69 73 20 64 6f 63 75 6d 65 6e  for this documen
68f0: 74 5c 6e 22 0a 20 20 20 20 22 3c 2f 62 6f 64 79  t\n".    "</body
6900: 3e 5c 6e 22 2c 20 7a 52 65 61 6c 6d 29 3b 0a 20  >\n", zRealm);. 
6910: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c   MakeLogEntry(0,
6920: 20 31 31 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20   110);  /* LOG: 
6930: 4e 6f 74 20 61 75 74 68 6f 72 69 7a 65 64 20 2a  Not authorized *
6940: 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20  /.}../*.** Tell 
6950: 74 68 65 20 63 6c 69 65 6e 74 20 74 68 61 74 20  the client that 
6960: 74 68 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f  there is an erro
6970: 72 20 69 6e 20 74 68 65 20 73 63 72 69 70 74 2e  r in the script.
6980: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6990: 43 67 69 45 72 72 6f 72 28 76 6f 69 64 29 7b 0a  CgiError(void){.
69a0: 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28    StartResponse(
69b0: 22 35 30 30 20 45 72 72 6f 72 22 29 3b 0a 20 20  "500 Error");.  
69c0: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a  nOut += printf(.
69d0: 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70      "Content-typ
69e0: 65 3a 20 74 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e  e: text/html\r\n
69f0: 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20  ".    "\r\n".   
6a00: 20 22 3c 68 65 61 64 3e 3c 74 69 74 6c 65 3e 43   "<head><title>C
6a10: 47 49 20 50 72 6f 67 72 61 6d 20 45 72 72 6f 72  GI Program Error
6a20: 3c 2f 74 69 74 6c 65 3e 3c 2f 68 65 61 64 3e 5c  </title></head>\
6a30: 6e 22 0a 20 20 20 20 22 3c 62 6f 64 79 3e 3c 68  n".    "<body><h
6a40: 31 3e 43 47 49 20 50 72 6f 67 72 61 6d 20 45 72  1>CGI Program Er
6a50: 72 6f 72 3c 2f 68 31 3e 5c 6e 22 0a 20 20 20 20  ror</h1>\n".    
6a60: 22 54 68 65 20 43 47 49 20 70 72 6f 67 72 61 6d  "The CGI program
6a70: 20 25 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e   %s generated an
6a80: 20 65 72 72 6f 72 5c 6e 22 0a 20 20 20 20 22 3c   error\n".    "<
6a90: 2f 62 6f 64 79 3e 5c 6e 22 2c 20 7a 53 63 72 69  /body>\n", zScri
6aa0: 70 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e  pt);.  MakeLogEn
6ab0: 74 72 79 28 30 2c 20 31 32 30 29 3b 20 20 2f 2a  try(0, 120);  /*
6ac0: 20 4c 4f 47 3a 20 43 47 49 20 45 72 72 6f 72 20   LOG: CGI Error 
6ad0: 2a 2f 0a 20 20 65 78 69 74 28 30 29 3b 0a 7d 0a  */.  exit(0);.}.
6ae0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  ./*.** This is c
6af0: 61 6c 6c 65 64 20 69 66 20 77 65 20 74 69 6d 65  alled if we time
6b00: 6f 75 74 20 6f 72 20 63 61 74 63 68 20 73 6f 6d  out or catch som
6b10: 65 20 6f 74 68 65 72 20 6b 69 6e 64 20 6f 66 20  e other kind of 
6b20: 73 69 67 6e 61 6c 2e 0a 2a 2a 20 4c 6f 67 20 61  signal..** Log a
6b30: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 68 69  n error code whi
6b40: 63 68 20 69 73 20 39 30 30 2b 69 53 69 67 20 61  ch is 900+iSig a
6b50: 6e 64 20 74 68 65 6e 20 71 75 69 74 2e 0a 2a 2f  nd then quit..*/
6b60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 69 6d  .static void Tim
6b70: 65 6f 75 74 28 69 6e 74 20 69 53 69 67 29 7b 0a  eout(int iSig){.
6b80: 20 20 69 66 28 20 21 64 65 62 75 67 46 6c 61 67    if( !debugFlag
6b90: 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 63 72   ){.    if( zScr
6ba0: 69 70 74 20 26 26 20 7a 53 63 72 69 70 74 5b 30  ipt && zScript[0
6bb0: 5d 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ] ){.      char 
6bc0: 7a 42 75 66 5b 31 30 5d 3b 0a 20 20 20 20 20 20  zBuf[10];.      
6bd0: 7a 42 75 66 5b 30 5d 20 3d 20 27 39 27 3b 0a 20  zBuf[0] = '9';. 
6be0: 20 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20 27       zBuf[1] = '
6bf0: 30 27 20 2b 20 28 69 53 69 67 2f 31 30 29 25 31  0' + (iSig/10)%1
6c00: 30 3b 0a 20 20 20 20 20 20 7a 42 75 66 5b 32 5d  0;.      zBuf[2]
6c10: 20 3d 20 27 30 27 20 2b 20 69 53 69 67 25 31 30   = '0' + iSig%10
6c20: 3b 0a 20 20 20 20 20 20 7a 42 75 66 5b 33 5d 20  ;.      zBuf[3] 
6c30: 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 63 70  = 0;.      strcp
6c40: 79 28 7a 52 65 70 6c 79 53 74 61 74 75 73 2c 20  y(zReplyStatus, 
6c50: 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4d 61 6b  zBuf);.      Mak
6c60: 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 31 33 30  eLogEntry(0, 130
6c70: 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 54 69 6d 65  );  /* LOG: Time
6c80: 6f 75 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  out */.    }.   
6c90: 20 65 78 69 74 28 30 29 3b 0a 20 20 7d 0a 7d 0a   exit(0);.  }.}.
6ca0: 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20  ./*.** Tell the 
6cb0: 63 6c 69 65 6e 74 20 74 68 61 74 20 74 68 65 72  client that ther
6cc0: 65 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69 6e  e is an error in
6cd0: 20 74 68 65 20 73 63 72 69 70 74 2e 0a 2a 2f 0a   the script..*/.
6ce0: 73 74 61 74 69 63 20 76 6f 69 64 20 43 67 69 53  static void CgiS
6cf0: 63 72 69 70 74 57 72 69 74 61 62 6c 65 28 76 6f  criptWritable(vo
6d00: 69 64 29 7b 0a 20 20 53 74 61 72 74 52 65 73 70  id){.  StartResp
6d10: 6f 6e 73 65 28 22 35 30 30 20 43 47 49 20 43 6f  onse("500 CGI Co
6d20: 6e 66 69 67 75 72 61 74 69 6f 6e 20 45 72 72 6f  nfiguration Erro
6d30: 72 22 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70  r");.  nOut += p
6d40: 72 69 6e 74 66 28 0a 20 20 20 20 22 43 6f 6e 74  rintf(.    "Cont
6d50: 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 70  ent-type: text/p
6d60: 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 22 5c  lain\r\n".    "\
6d70: 72 5c 6e 22 0a 20 20 20 20 22 54 68 65 20 43 47  r\n".    "The CG
6d80: 49 20 70 72 6f 67 72 61 6d 20 25 73 20 69 73 20  I program %s is 
6d90: 77 72 69 74 61 62 6c 65 20 62 79 20 75 73 65 72  writable by user
6da0: 73 20 6f 74 68 65 72 20 74 68 61 6e 20 69 74 73  s other than its
6db0: 20 6f 77 6e 65 72 2e 5c 6e 22 2c 0a 20 20 20 20   owner.\n",.    
6dc0: 7a 52 65 61 6c 53 63 72 69 70 74 29 3b 0a 20 20  zRealScript);.  
6dd0: 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20  MakeLogEntry(0, 
6de0: 31 34 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 43  140);  /* LOG: C
6df0: 47 49 20 73 63 72 69 70 74 20 69 73 20 77 72 69  GI script is wri
6e00: 74 61 62 6c 65 20 2a 2f 0a 20 20 65 78 69 74 28  table */.  exit(
6e10: 30 29 3b 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a  0);       .}../*
6e20: 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c 69  .** Tell the cli
6e30: 65 6e 74 20 74 68 61 74 20 74 68 65 20 73 65 72  ent that the ser
6e40: 76 65 72 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 65  ver malfunctione
6e50: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
6e60: 64 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 69 6e  d Malfunction(in
6e70: 74 20 6c 69 6e 65 6e 75 6d 2c 20 63 6f 6e 73 74  t linenum, const
6e80: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
6e90: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
6ea0: 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ap;.  va_start(a
6eb0: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 53  p, zFormat);.  S
6ec0: 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 35 30  tartResponse("50
6ed0: 30 20 53 65 72 76 65 72 20 4d 61 6c 66 75 6e 63  0 Server Malfunc
6ee0: 74 69 6f 6e 22 29 3b 0a 20 20 6e 4f 75 74 20 2b  tion");.  nOut +
6ef0: 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20 22 43  = printf(.    "C
6f00: 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78  ontent-type: tex
6f10: 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20  t/plain\r\n".   
6f20: 20 22 5c 72 5c 6e 22 0a 20 20 20 20 22 57 65 62   "\r\n".    "Web
6f30: 20 73 65 72 76 65 72 20 6d 61 6c 66 75 6e 63 74   server malfunct
6f40: 69 6f 6e 65 64 3b 20 65 72 72 6f 72 20 6e 75 6d  ioned; error num
6f50: 62 65 72 20 25 64 5c 6e 5c 6e 22 2c 20 6c 69 6e  ber %d\n\n", lin
6f60: 65 6e 75 6d 29 3b 0a 20 20 69 66 28 20 7a 46 6f  enum);.  if( zFo
6f70: 72 6d 61 74 20 29 7b 0a 20 20 20 20 6e 4f 75 74  rmat ){.    nOut
6f80: 20 2b 3d 20 76 70 72 69 6e 74 66 28 7a 46 6f 72   += vprintf(zFor
6f90: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 70 72  mat, ap);.    pr
6fa0: 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20  intf("\n");.    
6fb0: 6e 4f 75 74 2b 2b 3b 0a 20 20 7d 0a 20 20 4d 61  nOut++;.  }.  Ma
6fc0: 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 6c 69  keLogEntry(0, li
6fd0: 6e 65 6e 75 6d 29 3b 0a 20 20 65 78 69 74 28 30  nenum);.  exit(0
6fe0: 29 3b 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a  );       .}../*.
6ff0: 2a 2a 20 44 6f 20 61 20 73 65 72 76 65 72 20 72  ** Do a server r
7000: 65 64 69 72 65 63 74 20 74 6f 20 74 68 65 20 64  edirect to the d
7010: 6f 63 75 6d 65 6e 74 20 73 70 65 63 69 66 69 65  ocument specifie
7020: 64 2e 20 20 54 68 65 20 64 6f 63 75 6d 65 6e 74  d.  The document
7030: 0a 2a 2a 20 6e 61 6d 65 20 6e 6f 74 20 63 6f 6e  .** name not con
7040: 74 61 69 6e 20 73 63 68 65 6d 65 20 6f 72 20 6e  tain scheme or n
7050: 65 74 77 6f 72 6b 20 6c 6f 63 61 74 69 6f 6e 20  etwork location 
7060: 6f 72 20 74 68 65 20 71 75 65 72 79 20 73 74 72  or the query str
7070: 69 6e 67 2e 0a 2a 2a 20 49 74 20 77 69 6c 6c 20  ing..** It will 
7080: 62 65 20 6a 75 73 74 20 74 68 65 20 70 61 74 68  be just the path
7090: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
70a0: 20 52 65 64 69 72 65 63 74 28 63 6f 6e 73 74 20   Redirect(const 
70b0: 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74  char *zPath, int
70c0: 20 66 69 6e 69 73 68 2c 20 69 6e 74 20 6c 69 6e   finish, int lin
70d0: 65 6e 6f 29 7b 0a 20 20 53 74 61 72 74 52 65 73  eno){.  StartRes
70e0: 70 6f 6e 73 65 28 22 33 30 32 20 54 65 6d 70 6f  ponse("302 Tempo
70f0: 72 61 72 79 20 52 65 64 69 72 65 63 74 22 29 3b  rary Redirect");
7100: 0a 20 20 69 66 28 20 7a 53 65 72 76 65 72 50 6f  .  if( zServerPo
7110: 72 74 3d 3d 30 20 7c 7c 20 7a 53 65 72 76 65 72  rt==0 || zServer
7120: 50 6f 72 74 5b 30 5d 3d 3d 30 20 7c 7c 20 73 74  Port[0]==0 || st
7130: 72 63 6d 70 28 7a 53 65 72 76 65 72 50 6f 72 74  rcmp(zServerPort
7140: 2c 22 38 30 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ,"80")==0 ){.   
7150: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
7160: 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73 3a 2f 2f  "Location: %s://
7170: 25 73 25 73 25 73 5c 72 5c 6e 22 2c 0a 20 20 20  %s%s%s\r\n",.   
7180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7190: 7a 48 74 74 70 2c 20 7a 53 65 72 76 65 72 4e 61  zHttp, zServerNa
71a0: 6d 65 2c 20 7a 50 61 74 68 2c 20 7a 51 75 65 72  me, zPath, zQuer
71b0: 79 53 75 66 66 69 78 29 3b 0a 20 20 7d 65 6c 73  ySuffix);.  }els
71c0: 65 7b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70  e{.    nOut += p
71d0: 72 69 6e 74 66 28 22 4c 6f 63 61 74 69 6f 6e 3a  rintf("Location:
71e0: 20 25 73 3a 2f 2f 25 73 3a 25 73 25 73 25 73 5c   %s://%s:%s%s%s\
71f0: 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  r\n",.          
7200: 20 20 20 20 20 20 20 20 20 7a 48 74 74 70 2c 20           zHttp, 
7210: 7a 53 65 72 76 65 72 4e 61 6d 65 2c 20 7a 53 65  zServerName, zSe
7220: 72 76 65 72 50 6f 72 74 2c 20 7a 50 61 74 68 2c  rverPort, zPath,
7230: 20 7a 51 75 65 72 79 53 75 66 66 69 78 29 3b 0a   zQuerySuffix);.
7240: 20 20 7d 0a 20 20 69 66 28 20 66 69 6e 69 73 68    }.  if( finish
7250: 20 29 7b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20   ){.    nOut += 
7260: 70 72 69 6e 74 66 28 22 43 6f 6e 74 65 6e 74 2d  printf("Content-
7270: 6c 65 6e 67 74 68 3a 20 30 5c 72 5c 6e 22 29 3b  length: 0\r\n");
7280: 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69  .    nOut += pri
7290: 6e 74 66 28 22 5c 72 5c 6e 22 29 3b 0a 20 20 20  ntf("\r\n");.   
72a0: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c   MakeLogEntry(0,
72b0: 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 20 20   lineno);.  }.  
72c0: 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
72d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
72e0: 6e 63 74 69 6f 6e 20 74 72 65 61 74 73 20 69 74  nction treats it
72f0: 73 20 69 6e 70 75 74 20 61 73 20 61 20 62 61 73  s input as a bas
7300: 65 2d 36 34 20 73 74 72 69 6e 67 20 61 6e 64 20  e-64 string and 
7310: 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 64  returns the.** d
7320: 65 63 6f 64 65 64 20 76 61 6c 75 65 20 6f 66 20  ecoded value of 
7330: 74 68 61 74 20 73 74 72 69 6e 67 2e 20 20 43 68  that string.  Ch
7340: 61 72 61 63 74 65 72 73 20 6f 66 20 69 6e 70 75  aracters of inpu
7350: 74 20 74 68 61 74 20 61 72 65 20 6e 6f 74 0a 2a  t that are not.*
7360: 2a 20 76 61 6c 69 64 20 62 61 73 65 2d 36 34 20  * valid base-64 
7370: 63 68 61 72 61 63 74 65 72 73 20 28 73 75 63 68  characters (such
7380: 20 61 73 20 73 70 61 63 65 73 20 61 6e 64 20 6e   as spaces and n
7390: 65 77 6c 69 6e 65 73 29 20 61 72 65 20 69 67 6e  ewlines) are ign
73a0: 6f 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 44 65  ored..*/.void De
73b0: 63 6f 64 65 36 34 28 63 68 61 72 20 2a 7a 36 34  code64(char *z64
73c0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 61  ){.  char *zData
73d0: 3b 0a 20 20 69 6e 74 20 6e 36 34 3b 0a 20 20 69  ;.  int n64;.  i
73e0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 61  nt i, j;.  int a
73f0: 2c 20 62 2c 20 63 2c 20 64 3b 0a 20 20 73 74 61  , b, c, d;.  sta
7400: 74 69 63 20 69 6e 74 20 69 73 49 6e 69 74 20 3d  tic int isInit =
7410: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   0;.  static int
7420: 20 74 72 61 6e 73 5b 31 32 38 5d 3b 0a 20 20 73   trans[128];.  s
7430: 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63  tatic unsigned c
7440: 68 61 72 20 7a 42 61 73 65 5b 5d 20 3d 20 0a 20  har zBase[] = . 
7450: 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c     "ABCDEFGHIJKL
7460: 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 61 62  MNOPQRSTUVWXYZab
7470: 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
7480: 73 74 75 76 77 78 79 7a 30 31 32 33 34 35 36 37  stuvwxyz01234567
7490: 38 39 2b 2f 22 3b 0a 0a 20 20 69 66 28 20 21 69  89+/";..  if( !i
74a0: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 66 6f 72  sInit ){.    for
74b0: 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b  (i=0; i<128; i++
74c0: 29 7b 20 74 72 61 6e 73 5b 69 5d 20 3d 20 30 3b  ){ trans[i] = 0;
74d0: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
74e0: 7a 42 61 73 65 5b 69 5d 3b 20 69 2b 2b 29 7b 20  zBase[i]; i++){ 
74f0: 74 72 61 6e 73 5b 7a 42 61 73 65 5b 69 5d 20 26  trans[zBase[i] &
7500: 20 30 78 37 66 5d 20 3d 20 69 3b 20 7d 0a 20 20   0x7f] = i; }.  
7510: 20 20 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20    isInit = 1;.  
7520: 7d 0a 20 20 6e 36 34 20 3d 20 73 74 72 6c 65 6e  }.  n64 = strlen
7530: 28 7a 36 34 29 3b 0a 20 20 77 68 69 6c 65 28 20  (z64);.  while( 
7540: 6e 36 34 3e 30 20 26 26 20 7a 36 34 5b 6e 36 34  n64>0 && z64[n64
7550: 2d 31 5d 3d 3d 27 3d 27 20 29 20 6e 36 34 2d 2d  -1]=='=' ) n64--
7560: 3b 0a 20 20 7a 44 61 74 61 20 3d 20 7a 36 34 3b  ;.  zData = z64;
7570: 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 2b  .  for(i=j=0; i+
7580: 33 3c 6e 36 34 3b 20 69 2b 3d 34 29 7b 0a 20 20  3<n64; i+=4){.  
7590: 20 20 61 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b    a = trans[z64[
75a0: 69 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20  i] & 0x7f];.    
75b0: 62 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b  b = trans[z64[i+
75c0: 31 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20  1] & 0x7f];.    
75d0: 63 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b  c = trans[z64[i+
75e0: 32 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20  2] & 0x7f];.    
75f0: 64 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b  d = trans[z64[i+
7600: 33 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20  3] & 0x7f];.    
7610: 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28 61  zData[j++] = ((a
7620: 3c 3c 32 29 20 26 20 30 78 66 63 29 20 7c 20 28  <<2) & 0xfc) | (
7630: 28 62 3e 3e 34 29 20 26 20 30 78 30 33 29 3b 0a  (b>>4) & 0x03);.
7640: 20 20 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d      zData[j++] =
7650: 20 28 28 62 3c 3c 34 29 20 26 20 30 78 66 30 29   ((b<<4) & 0xf0)
7660: 20 7c 20 28 28 63 3e 3e 32 29 20 26 20 30 78 30   | ((c>>2) & 0x0
7670: 66 29 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b  f);.    zData[j+
7680: 2b 5d 20 3d 20 28 28 63 3c 3c 36 29 20 26 20 30  +] = ((c<<6) & 0
7690: 78 63 30 29 20 7c 20 28 64 20 26 20 30 78 33 66  xc0) | (d & 0x3f
76a0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 2b 32  );.  }.  if( i+2
76b0: 3c 6e 36 34 20 29 7b 0a 20 20 20 20 61 20 3d 20  <n64 ){.    a = 
76c0: 74 72 61 6e 73 5b 7a 36 34 5b 69 5d 20 26 20 30  trans[z64[i] & 0
76d0: 78 37 66 5d 3b 0a 20 20 20 20 62 20 3d 20 74 72  x7f];.    b = tr
76e0: 61 6e 73 5b 7a 36 34 5b 69 2b 31 5d 20 26 20 30  ans[z64[i+1] & 0
76f0: 78 37 66 5d 3b 0a 20 20 20 20 63 20 3d 20 74 72  x7f];.    c = tr
7700: 61 6e 73 5b 7a 36 34 5b 69 2b 32 5d 20 26 20 30  ans[z64[i+2] & 0
7710: 78 37 66 5d 3b 0a 20 20 20 20 7a 44 61 74 61 5b  x7f];.    zData[
7720: 6a 2b 2b 5d 20 3d 20 28 28 61 3c 3c 32 29 20 26  j++] = ((a<<2) &
7730: 20 30 78 66 63 29 20 7c 20 28 28 62 3e 3e 34 29   0xfc) | ((b>>4)
7740: 20 26 20 30 78 30 33 29 3b 0a 20 20 20 20 7a 44   & 0x03);.    zD
7750: 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28 62 3c 3c  ata[j++] = ((b<<
7760: 34 29 20 26 20 30 78 66 30 29 20 7c 20 28 28 63  4) & 0xf0) | ((c
7770: 3e 3e 32 29 20 26 20 30 78 30 66 29 3b 0a 20 20  >>2) & 0x0f);.  
7780: 7d 65 6c 73 65 20 69 66 28 20 69 2b 31 3c 6e 36  }else if( i+1<n6
7790: 34 20 29 7b 0a 20 20 20 20 61 20 3d 20 74 72 61  4 ){.    a = tra
77a0: 6e 73 5b 7a 36 34 5b 69 5d 20 26 20 30 78 37 66  ns[z64[i] & 0x7f
77b0: 5d 3b 0a 20 20 20 20 62 20 3d 20 74 72 61 6e 73  ];.    b = trans
77c0: 5b 7a 36 34 5b 69 2b 31 5d 20 26 20 30 78 37 66  [z64[i+1] & 0x7f
77d0: 5d 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b 2b  ];.    zData[j++
77e0: 5d 20 3d 20 28 28 61 3c 3c 32 29 20 26 20 30 78  ] = ((a<<2) & 0x
77f0: 66 63 29 20 7c 20 28 28 62 3e 3e 34 29 20 26 20  fc) | ((b>>4) & 
7800: 30 78 30 33 29 3b 0a 20 20 7d 0a 20 20 7a 44 61  0x03);.  }.  zDa
7810: 74 61 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ta[j] = 0;.}../*
7820: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
7830: 20 69 66 20 62 61 73 69 63 20 61 75 74 68 6f 72   if basic author
7840: 69 7a 61 74 69 6f 6e 20 63 72 65 64 65 6e 74 69  ization credenti
7850: 61 6c 73 20 61 72 65 20 70 72 6f 76 69 64 65 64  als are provided
7860: 20 66 6f 72 0a 2a 2a 20 74 68 65 20 75 73 65 72   for.** the user
7870: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
7880: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  e information in
7890: 20 7a 41 75 74 68 46 69 6c 65 2e 20 20 52 65 74   zAuthFile.  Ret
78a0: 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 61  urn true.** if a
78b0: 75 74 68 6f 72 69 7a 65 64 2e 20 20 52 65 74 75  uthorized.  Retu
78c0: 72 6e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 20  rn false if not 
78d0: 61 75 74 68 6f 72 69 7a 65 64 2e 0a 2a 2a 0a 2a  authorized..**.*
78e0: 2a 20 46 69 6c 65 20 66 6f 72 6d 61 74 3a 0a 2a  * File format:.*
78f0: 2a 0a 2a 2a 20 20 20 20 2a 20 20 42 6c 61 6e 6b  *.**    *  Blank
7900: 20 6c 69 6e 65 73 20 61 6e 64 20 6c 69 6e 65 73   lines and lines
7910: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
7920: 20 27 23 27 20 61 72 65 20 69 67 6e 6f 72 65 64   '#' are ignored
7930: 0a 2a 2a 20 20 20 20 2a 20 20 22 68 74 74 70 2d  .**    *  "http-
7940: 72 65 64 69 72 65 63 74 22 20 66 6f 72 63 65 73  redirect" forces
7950: 20 61 20 72 65 64 69 72 65 63 74 20 74 6f 20 48   a redirect to H
7960: 54 54 50 53 20 69 66 20 6e 6f 74 20 74 68 65 72  TTPS if not ther
7970: 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 20 20 20  e already.**    
7980: 2a 20 20 22 68 74 74 70 73 2d 6f 6e 6c 79 22 20  *  "https-only" 
7990: 64 69 73 61 6c 6c 6f 77 73 20 6f 70 65 72 61 74  disallows operat
79a0: 69 6f 6e 20 69 6e 20 48 54 54 50 0a 2a 2a 20 20  ion in HTTP.**  
79b0: 20 20 2a 20 20 22 75 73 65 72 20 4e 41 4d 45 20    *  "user NAME 
79c0: 4c 4f 47 49 4e 3a 50 41 53 53 57 4f 52 44 22 20  LOGIN:PASSWORD" 
79d0: 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
79e0: 20 4c 4f 47 49 4e 3a 50 41 53 53 57 4f 52 44 20   LOGIN:PASSWORD 
79f0: 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 68 6f 72  .**       author
7a00: 69 7a 61 74 69 6f 6e 20 63 72 65 64 65 6e 74 69  ization credenti
7a10: 61 6c 73 20 61 72 65 20 70 72 6f 76 69 64 65 64  als are provided
7a20: 2c 20 61 6e 64 20 69 66 20 73 6f 20 73 65 74 73  , and if so sets
7a30: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 52 45   the.**       RE
7a40: 4d 4f 54 45 5f 55 53 45 52 20 74 6f 20 4e 41 4d  MOTE_USER to NAM
7a50: 45 2e 0a 2a 2a 20 20 20 20 2a 20 20 22 72 65 61  E..**    *  "rea
7a60: 6c 6d 20 54 45 58 54 22 20 73 65 74 73 20 74 68  lm TEXT" sets th
7a70: 65 20 72 65 61 6c 6d 20 74 6f 20 54 45 58 54 2e  e realm to TEXT.
7a80: 0a 2a 2a 20 20 20 20 2a 20 20 22 61 6e 79 6f 6e  .**    *  "anyon
7a90: 65 22 20 62 79 70 61 73 73 65 73 20 61 75 74 68  e" bypasses auth
7aa0: 65 6e 74 69 63 61 74 69 6f 6e 20 61 6e 64 20 61  entication and a
7ab0: 6c 6c 6f 77 73 20 61 6e 79 6f 6e 65 20 74 6f 20  llows anyone to 
7ac0: 73 65 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  see the.**      
7ad0: 20 66 69 6c 65 73 2e 20 20 55 73 65 66 75 6c 20   files.  Useful 
7ae0: 69 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 77  in combination w
7af0: 69 74 68 20 22 68 74 74 70 2d 72 65 64 69 72 65  ith "http-redire
7b00: 63 74 22 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ct".*/.static in
7b10: 74 20 43 68 65 63 6b 42 61 73 69 63 41 75 74 68  t CheckBasicAuth
7b20: 6f 72 69 7a 61 74 69 6f 6e 28 63 6f 6e 73 74 20  orization(const 
7b30: 63 68 61 72 20 2a 7a 41 75 74 68 46 69 6c 65 29  char *zAuthFile)
7b40: 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20  {.  FILE *in;.  
7b50: 63 68 61 72 20 2a 7a 52 65 61 6c 6d 20 3d 20 22  char *zRealm = "
7b60: 75 6e 6b 6e 6f 77 6e 20 72 65 61 6c 6d 22 3b 0a  unknown realm";.
7b70: 20 20 63 68 61 72 20 2a 7a 4c 6f 67 69 6e 50 73    char *zLoginPs
7b80: 77 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  wd;.  char *zNam
7b90: 65 3b 0a 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b  e;.  char zLine[
7ba0: 32 30 30 30 5d 3b 0a 0a 20 20 69 6e 20 3d 20 66  2000];..  in = f
7bb0: 6f 70 65 6e 28 7a 41 75 74 68 46 69 6c 65 2c 20  open(zAuthFile, 
7bc0: 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d  "rb");.  if( in=
7bd0: 3d 30 20 29 7b 0a 20 20 20 20 4e 6f 74 46 6f 75  =0 ){.    NotFou
7be0: 6e 64 28 31 35 30 29 3b 20 20 2f 2a 20 4c 4f 47  nd(150);  /* LOG
7bf0: 3a 20 43 61 6e 6e 6f 74 20 6f 70 65 6e 20 2d 61  : Cannot open -a
7c00: 75 74 68 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  uth file */.    
7c10: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
7c20: 69 66 28 20 7a 41 75 74 68 41 72 67 20 29 20 44  if( zAuthArg ) D
7c30: 65 63 6f 64 65 36 34 28 7a 41 75 74 68 41 72 67  ecode64(zAuthArg
7c40: 29 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74  );.  while( fget
7c50: 73 28 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f 66 28  s(zLine, sizeof(
7c60: 7a 4c 69 6e 65 29 2c 20 69 6e 29 20 29 7b 0a 20  zLine), in) ){. 
7c70: 20 20 20 63 68 61 72 20 2a 7a 46 69 65 6c 64 4e     char *zFieldN
7c80: 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ame;.    char *z
7c90: 56 61 6c 3b 0a 0a 20 20 20 20 7a 46 69 65 6c 64  Val;..    zField
7ca0: 4e 61 6d 65 20 3d 20 47 65 74 46 69 72 73 74 45  Name = GetFirstE
7cb0: 6c 65 6d 65 6e 74 28 7a 4c 69 6e 65 2c 26 7a 56  lement(zLine,&zV
7cc0: 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a 46 69  al);.    if( zFi
7cd0: 65 6c 64 4e 61 6d 65 3d 3d 30 20 7c 7c 20 2a 7a  eldName==0 || *z
7ce0: 46 69 65 6c 64 4e 61 6d 65 3d 3d 30 20 29 20 63  FieldName==0 ) c
7cf0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
7d00: 20 7a 46 69 65 6c 64 4e 61 6d 65 5b 30 5d 3d 3d   zFieldName[0]==
7d10: 27 23 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  '#' ) continue;.
7d20: 20 20 20 20 52 65 6d 6f 76 65 4e 65 77 6c 69 6e      RemoveNewlin
7d30: 65 28 7a 56 61 6c 29 3b 0a 20 20 20 20 69 66 28  e(zVal);.    if(
7d40: 20 73 74 72 63 6d 70 28 7a 46 69 65 6c 64 4e 61   strcmp(zFieldNa
7d50: 6d 65 2c 20 22 72 65 61 6c 6d 22 29 3d 3d 30 20  me, "realm")==0 
7d60: 29 7b 0a 20 20 20 20 20 20 7a 52 65 61 6c 6d 20  ){.      zRealm 
7d70: 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a  = StrDup(zVal);.
7d80: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
7d90: 72 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c  rcmp(zFieldName,
7da0: 22 75 73 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20  "user")==0 ){.  
7db0: 20 20 20 20 69 66 28 20 7a 41 75 74 68 41 72 67      if( zAuthArg
7dc0: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
7dd0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 47 65        zName = Ge
7de0: 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a 56  tFirstElement(zV
7df0: 61 6c 2c 20 26 7a 56 61 6c 29 3b 0a 20 20 20 20  al, &zVal);.    
7e00: 20 20 7a 4c 6f 67 69 6e 50 73 77 64 20 3d 20 47    zLoginPswd = G
7e10: 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a  etFirstElement(z
7e20: 56 61 6c 2c 20 26 7a 56 61 6c 29 3b 0a 20 20 20  Val, &zVal);.   
7e30: 20 20 20 69 66 28 20 7a 4c 6f 67 69 6e 50 73 77     if( zLoginPsw
7e40: 64 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  d==0 ) continue;
7e50: 0a 20 20 20 20 20 20 69 66 28 20 7a 41 75 74 68  .      if( zAuth
7e60: 41 72 67 20 26 26 20 73 74 72 63 6d 70 28 7a 41  Arg && strcmp(zA
7e70: 75 74 68 41 72 67 2c 7a 4c 6f 67 69 6e 50 73 77  uthArg,zLoginPsw
7e80: 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  d)==0 ){.       
7e90: 20 7a 52 65 6d 6f 74 65 55 73 65 72 20 3d 20 53   zRemoteUser = S
7ea0: 74 72 44 75 70 28 7a 4e 61 6d 65 29 3b 0a 20 20  trDup(zName);.  
7eb0: 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29        fclose(in)
7ec0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
7ed0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
7ee0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
7ef0: 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 68 74 74  (zFieldName,"htt
7f00: 70 73 2d 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a  ps-only")==0 ){.
7f10: 20 20 20 20 20 20 69 66 28 20 21 75 73 65 48 74        if( !useHt
7f20: 74 70 73 20 29 7b 0a 20 20 20 20 20 20 20 20 4e  tps ){.        N
7f30: 6f 74 46 6f 75 6e 64 28 31 36 30 29 3b 20 20 2f  otFound(160);  /
7f40: 2a 20 4c 4f 47 3a 20 20 68 74 74 70 20 72 65 71  * LOG:  http req
7f50: 75 65 73 74 20 6f 6e 20 68 74 74 70 73 2d 6f 6e  uest on https-on
7f60: 6c 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ly page */.     
7f70: 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
7f80: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
7f90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
7fa0: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46  se if( strcmp(zF
7fb0: 69 65 6c 64 4e 61 6d 65 2c 22 68 74 74 70 2d 72  ieldName,"http-r
7fc0: 65 64 69 72 65 63 74 22 29 3d 3d 30 20 29 7b 0a  edirect")==0 ){.
7fd0: 20 20 20 20 20 20 69 66 28 20 21 75 73 65 48 74        if( !useHt
7fe0: 74 70 73 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  tps ){.        z
7ff0: 48 74 74 70 20 3d 20 22 68 74 74 70 73 22 3b 0a  Http = "https";.
8000: 20 20 20 20 20 20 20 20 52 65 64 69 72 65 63 74          Redirect
8010: 28 7a 53 63 72 69 70 74 2c 20 31 2c 20 31 37 30  (zScript, 1, 170
8020: 29 3b 20 2f 2a 20 4c 4f 47 3a 20 2d 61 75 74 68  ); /* LOG: -auth
8030: 20 72 65 64 69 72 65 63 74 20 2a 2f 0a 20 20 20   redirect */.   
8040: 20 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b       fclose(in);
8050: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8060: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
8070: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
8080: 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 61 6e 79 6f  zFieldName,"anyo
8090: 6e 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ne")==0 ){.     
80a0: 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20   fclose(in);.   
80b0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
80c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4e 6f   }else{.      No
80d0: 74 46 6f 75 6e 64 28 31 38 30 29 3b 20 20 2f 2a  tFound(180);  /*
80e0: 20 4c 4f 47 3a 20 20 6d 61 6c 66 6f 72 6d 65 64   LOG:  malformed
80f0: 20 65 6e 74 72 79 20 69 6e 20 2d 61 75 74 68 20   entry in -auth 
8100: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 66 63  file */.      fc
8110: 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20  lose(in);.      
8120: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
8130: 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29    }.  fclose(in)
8140: 3b 0a 20 20 4e 6f 74 41 75 74 68 6f 72 69 7a 65  ;.  NotAuthorize
8150: 64 28 7a 52 65 61 6c 6d 29 3b 0a 20 20 72 65 74  d(zRealm);.  ret
8160: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
8170: 47 75 65 73 73 20 74 68 65 20 6d 69 6d 65 2d 74  Guess the mime-t
8180: 79 70 65 20 6f 66 20 61 20 64 6f 63 75 6d 65 6e  ype of a documen
8190: 74 20 62 61 73 65 64 20 6f 6e 20 69 74 73 20 6e  t based on its n
81a0: 61 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ame..*/.const ch
81b0: 61 72 20 2a 47 65 74 4d 69 6d 65 54 79 70 65 28  ar *GetMimeType(
81c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
81d0: 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20  e, int nName){. 
81e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
81f0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 66    int i;.  int f
8200: 69 72 73 74 2c 20 6c 61 73 74 3b 0a 20 20 69 6e  irst, last;.  in
8210: 74 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20 7a 53  t len;.  char zS
8220: 75 66 66 69 78 5b 32 30 5d 3b 0a 0a 20 20 2f 2a  uffix[20];..  /*
8230: 20 41 20 74 61 62 6c 65 20 6f 66 20 6d 69 6d 65   A table of mime
8240: 74 79 70 65 73 20 62 61 73 65 64 20 6f 6e 20 66  types based on f
8250: 69 6c 65 20 73 75 66 66 69 78 65 73 2e 20 0a 20  ile suffixes. . 
8260: 20 2a 2a 20 53 75 66 66 69 78 65 73 20 6d 75 73   ** Suffixes mus
8270: 74 20 62 65 20 69 6e 20 73 6f 72 74 65 64 20 6f  t be in sorted o
8280: 72 64 65 72 20 73 6f 20 74 68 61 74 20 77 65 20  rder so that we 
8290: 63 61 6e 20 64 6f 20 61 20 62 69 6e 61 72 79 0a  can do a binary.
82a0: 20 20 2a 2a 20 73 65 61 72 63 68 20 74 6f 20 66    ** search to f
82b0: 69 6e 64 20 74 68 65 20 6d 69 6d 65 2d 74 79 70  ind the mime-typ
82c0: 65 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  e.  */.  static 
82d0: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
82e0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
82f0: 53 75 66 66 69 78 3b 20 20 20 20 20 20 20 2f 2a  Suffix;       /*
8300: 20 54 68 65 20 66 69 6c 65 20 73 75 66 66 69 78   The file suffix
8310: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 69 7a 65   */.    int size
8320: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8330: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
8340: 74 68 65 20 73 75 66 66 69 78 20 2a 2f 0a 20 20  the suffix */.  
8350: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d    const char *zM
8360: 69 6d 65 74 79 70 65 3b 20 20 20 20 20 2f 2a 20  imetype;     /* 
8370: 54 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  The correspondin
8380: 67 20 6d 69 6d 65 74 79 70 65 20 2a 2f 0a 20 20  g mimetype */.  
8390: 7d 20 61 4d 69 6d 65 5b 5d 20 3d 20 7b 0a 20 20  } aMime[] = {.  
83a0: 20 20 7b 20 22 61 69 22 2c 20 20 20 20 20 20 20    { "ai",       
83b0: 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    2, "applicatio
83c0: 6e 2f 70 6f 73 74 73 63 72 69 70 74 22 20 20 20  n/postscript"   
83d0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
83e0: 7b 20 22 61 69 66 22 2c 20 20 20 20 20 20 20 20  { "aif",        
83f0: 33 2c 20 22 61 75 64 69 6f 2f 78 2d 61 69 66 66  3, "audio/x-aiff
8400: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8410: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8420: 22 61 69 66 63 22 2c 20 20 20 20 20 20 20 34 2c  "aifc",       4,
8430: 20 22 61 75 64 69 6f 2f 78 2d 61 69 66 66 22 20   "audio/x-aiff" 
8440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8450: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61       },.    { "a
8460: 69 66 66 22 2c 20 20 20 20 20 20 20 34 2c 20 22  iff",       4, "
8470: 61 75 64 69 6f 2f 78 2d 61 69 66 66 22 20 20 20  audio/x-aiff"   
8480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8490: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 72 6a     },.    { "arj
84a0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
84b0: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 61 72 6a 2d  plication/x-arj-
84c0: 63 6f 6d 70 72 65 73 73 65 64 22 20 20 20 20 20  compressed"     
84d0: 20 7d 2c 0a 20 20 20 20 7b 20 22 61 73 63 22 2c   },.    { "asc",
84e0: 20 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74          3, "text
84f0: 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20  /plain"         
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8510: 2c 0a 20 20 20 20 7b 20 22 61 73 66 22 2c 20 20  ,.    { "asf",  
8520: 20 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f        3, "video/
8530: 78 2d 6d 73 2d 61 73 66 22 20 20 20 20 20 20 20  x-ms-asf"       
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
8550: 20 20 20 20 7b 20 22 61 73 78 22 2c 20 20 20 20      { "asx",    
8560: 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d      3, "video/x-
8570: 6d 73 2d 61 73 78 22 20 20 20 20 20 20 20 20 20  ms-asx"         
8580: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8590: 20 20 7b 20 22 61 75 22 2c 20 20 20 20 20 20 20    { "au",       
85a0: 20 20 32 2c 20 22 61 75 64 69 6f 2f 75 6c 61 77    2, "audio/ulaw
85b0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
85c0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
85d0: 7b 20 22 61 76 69 22 2c 20 20 20 20 20 20 20 20  { "avi",        
85e0: 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 76 69  3, "video/x-msvi
85f0: 64 65 6f 22 20 20 20 20 20 20 20 20 20 20 20 20  deo"            
8600: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8610: 22 62 61 74 22 2c 20 20 20 20 20 20 20 20 33 2c  "bat",        3,
8620: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
8630: 6d 73 64 6f 73 2d 70 72 6f 67 72 61 6d 22 20 20  msdos-program"  
8640: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 62       },.    { "b
8650: 63 70 69 6f 22 2c 20 20 20 20 20 20 35 2c 20 22  cpio",      5, "
8660: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 62 63  application/x-bc
8670: 70 69 6f 22 20 20 20 20 20 20 20 20 20 20 20 20  pio"            
8680: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 62 69 6e     },.    { "bin
8690: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
86a0: 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d  plication/octet-
86b0: 73 74 72 65 61 6d 22 20 20 20 20 20 20 20 20 20  stream"         
86c0: 20 7d 2c 0a 20 20 20 20 7b 20 22 63 22 2c 20 20   },.    { "c",  
86d0: 20 20 20 20 20 20 20 20 31 2c 20 22 74 65 78 74          1, "text
86e0: 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20  /plain"         
86f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8700: 2c 0a 20 20 20 20 7b 20 22 63 63 22 2c 20 20 20  ,.    { "cc",   
8710: 20 20 20 20 20 20 32 2c 20 22 74 65 78 74 2f 70        2, "text/p
8720: 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20 20 20  lain"           
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
8740: 20 20 20 20 7b 20 22 63 63 61 64 22 2c 20 20 20      { "ccad",   
8750: 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74      4, "applicat
8760: 69 6f 6e 2f 63 6c 61 72 69 73 63 61 64 22 20 20  ion/clariscad"  
8770: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8780: 20 20 7b 20 22 63 64 66 22 2c 20 20 20 20 20 20    { "cdf",      
8790: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
87a0: 6e 2f 78 2d 6e 65 74 63 64 66 22 20 20 20 20 20  n/x-netcdf"     
87b0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
87c0: 7b 20 22 63 6c 61 73 73 22 2c 20 20 20 20 20 20  { "class",      
87d0: 35 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  5, "application/
87e0: 6f 63 74 65 74 2d 73 74 72 65 61 6d 22 20 20 20  octet-stream"   
87f0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8800: 22 63 6f 64 22 2c 20 20 20 20 20 20 20 20 33 2c  "cod",        3,
8810: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76 6e   "application/vn
8820: 64 2e 72 69 6d 2e 63 6f 64 22 20 20 20 20 20 20  d.rim.cod"      
8830: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63       },.    { "c
8840: 6f 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  om",        3, "
8850: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6d 73  application/x-ms
8860: 64 6f 73 2d 70 72 6f 67 72 61 6d 22 20 20 20 20  dos-program"    
8870: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 70 69     },.    { "cpi
8880: 6f 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70  o",       4, "ap
8890: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 63 70 69 6f  plication/x-cpio
88a0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
88b0: 20 7d 2c 0a 20 20 20 20 7b 20 22 63 70 74 22 2c   },.    { "cpt",
88c0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
88d0: 69 63 61 74 69 6f 6e 2f 6d 61 63 2d 63 6f 6d 70  ication/mac-comp
88e0: 61 63 74 70 72 6f 22 20 20 20 20 20 20 20 20 7d  actpro"        }
88f0: 2c 0a 20 20 20 20 7b 20 22 63 73 68 22 2c 20 20  ,.    { "csh",  
8900: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
8910: 61 74 69 6f 6e 2f 78 2d 63 73 68 22 20 20 20 20  ation/x-csh"    
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
8930: 20 20 20 20 7b 20 22 63 73 73 22 2c 20 20 20 20      { "css",    
8940: 20 20 20 20 33 2c 20 22 74 65 78 74 2f 63 73 73      3, "text/css
8950: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8960: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8970: 20 20 7b 20 22 64 63 72 22 2c 20 20 20 20 20 20    { "dcr",      
8980: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
8990: 6e 2f 78 2d 64 69 72 65 63 74 6f 72 22 20 20 20  n/x-director"   
89a0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
89b0: 7b 20 22 64 65 62 22 2c 20 20 20 20 20 20 20 20  { "deb",        
89c0: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
89d0: 78 2d 64 65 62 69 61 6e 2d 70 61 63 6b 61 67 65  x-debian-package
89e0: 22 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20  "      },.    { 
89f0: 22 64 69 72 22 2c 20 20 20 20 20 20 20 20 33 2c  "dir",        3,
8a00: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
8a10: 64 69 72 65 63 74 6f 72 22 20 20 20 20 20 20 20  director"       
8a20: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64       },.    { "d
8a30: 6c 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22  l",         2, "
8a40: 76 69 64 65 6f 2f 64 6c 22 20 20 20 20 20 20 20  video/dl"       
8a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a60: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 6d 73     },.    { "dms
8a70: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
8a80: 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d  plication/octet-
8a90: 73 74 72 65 61 6d 22 20 20 20 20 20 20 20 20 20  stream"         
8aa0: 20 7d 2c 0a 20 20 20 20 7b 20 22 64 6f 63 22 2c   },.    { "doc",
8ab0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
8ac0: 69 63 61 74 69 6f 6e 2f 6d 73 77 6f 72 64 22 20  ication/msword" 
8ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8ae0: 2c 0a 20 20 20 20 7b 20 22 64 72 77 22 2c 20 20  ,.    { "drw",  
8af0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
8b00: 61 74 69 6f 6e 2f 64 72 61 66 74 69 6e 67 22 20  ation/drafting" 
8b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
8b20: 20 20 20 20 7b 20 22 64 76 69 22 2c 20 20 20 20      { "dvi",    
8b30: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
8b40: 69 6f 6e 2f 78 2d 64 76 69 22 20 20 20 20 20 20  ion/x-dvi"      
8b50: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8b60: 20 20 7b 20 22 64 77 67 22 2c 20 20 20 20 20 20    { "dwg",      
8b70: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
8b80: 6e 2f 61 63 61 64 22 20 20 20 20 20 20 20 20 20  n/acad"         
8b90: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
8ba0: 7b 20 22 64 78 66 22 2c 20 20 20 20 20 20 20 20  { "dxf",        
8bb0: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
8bc0: 64 78 66 22 20 20 20 20 20 20 20 20 20 20 20 20  dxf"            
8bd0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8be0: 22 64 78 72 22 2c 20 20 20 20 20 20 20 20 33 2c  "dxr",        3,
8bf0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
8c00: 64 69 72 65 63 74 6f 72 22 20 20 20 20 20 20 20  director"       
8c10: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65       },.    { "e
8c20: 70 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ps",        3, "
8c30: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 6f 73 74  application/post
8c40: 73 63 72 69 70 74 22 20 20 20 20 20 20 20 20 20  script"         
8c50: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65 74 78     },.    { "etx
8c60: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65  ",        3, "te
8c70: 78 74 2f 78 2d 73 65 74 65 78 74 22 20 20 20 20  xt/x-setext"    
8c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c90: 20 7d 2c 0a 20 20 20 20 7b 20 22 65 78 65 22 2c   },.    { "exe",
8ca0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
8cb0: 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74  ication/octet-st
8cc0: 72 65 61 6d 22 20 20 20 20 20 20 20 20 20 20 7d  ream"          }
8cd0: 2c 0a 20 20 20 20 7b 20 22 65 7a 22 2c 20 20 20  ,.    { "ez",   
8ce0: 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63        2, "applic
8cf0: 61 74 69 6f 6e 2f 61 6e 64 72 65 77 2d 69 6e 73  ation/andrew-ins
8d00: 65 74 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  et"          },.
8d10: 20 20 20 20 7b 20 22 66 22 2c 20 20 20 20 20 20      { "f",      
8d20: 20 20 20 20 31 2c 20 22 74 65 78 74 2f 70 6c 61      1, "text/pla
8d30: 69 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20  in"             
8d40: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8d50: 20 20 7b 20 22 66 39 30 22 2c 20 20 20 20 20 20    { "f90",      
8d60: 20 20 33 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e    3, "text/plain
8d70: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8d80: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
8d90: 7b 20 22 66 6c 69 22 2c 20 20 20 20 20 20 20 20  { "fli",        
8da0: 33 2c 20 22 76 69 64 65 6f 2f 66 6c 69 22 20 20  3, "video/fli"  
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8dc0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8dd0: 22 66 6c 76 22 2c 20 20 20 20 20 20 20 20 33 2c  "flv",        3,
8de0: 20 22 76 69 64 65 6f 2f 66 6c 76 22 20 20 20 20   "video/flv"    
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e00: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 67       },.    { "g
8e10: 69 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  if",        3, "
8e20: 69 6d 61 67 65 2f 67 69 66 22 20 20 20 20 20 20  image/gif"      
8e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e40: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 67 6c 22     },.    { "gl"
8e50: 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 76 69  ,         2, "vi
8e60: 64 65 6f 2f 67 6c 22 20 20 20 20 20 20 20 20 20  deo/gl"         
8e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e80: 20 7d 2c 0a 20 20 20 20 7b 20 22 67 74 61 72 22   },.    { "gtar"
8e90: 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c  ,       4, "appl
8ea0: 69 63 61 74 69 6f 6e 2f 78 2d 67 74 61 72 22 20  ication/x-gtar" 
8eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8ec0: 2c 0a 20 20 20 20 7b 20 22 67 7a 22 2c 20 20 20  ,.    { "gz",   
8ed0: 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63        2, "applic
8ee0: 61 74 69 6f 6e 2f 78 2d 67 7a 69 70 22 20 20 20  ation/x-gzip"   
8ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
8f00: 20 20 20 20 7b 20 22 68 64 66 22 2c 20 20 20 20      { "hdf",    
8f10: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
8f20: 69 6f 6e 2f 78 2d 68 64 66 22 20 20 20 20 20 20  ion/x-hdf"      
8f30: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8f40: 20 20 7b 20 22 68 68 22 2c 20 20 20 20 20 20 20    { "hh",       
8f50: 20 20 32 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e    2, "text/plain
8f60: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8f70: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
8f80: 7b 20 22 68 71 78 22 2c 20 20 20 20 20 20 20 20  { "hqx",        
8f90: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
8fa0: 6d 61 63 2d 62 69 6e 68 65 78 34 30 22 20 20 20  mac-binhex40"   
8fb0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8fc0: 22 68 22 2c 20 20 20 20 20 20 20 20 20 20 31 2c  "h",          1,
8fd0: 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20 20   "text/plain"   
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ff0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68       },.    { "h
9000: 74 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  tm",        3, "
9010: 74 65 78 74 2f 68 74 6d 6c 3b 20 63 68 61 72 73  text/html; chars
9020: 65 74 3d 75 74 66 2d 38 22 20 20 20 20 20 20 20  et=utf-8"       
9030: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68 74 6d     },.    { "htm
9040: 6c 22 2c 20 20 20 20 20 20 20 34 2c 20 22 74 65  l",       4, "te
9050: 78 74 2f 68 74 6d 6c 3b 20 63 68 61 72 73 65 74  xt/html; charset
9060: 3d 75 74 66 2d 38 22 20 20 20 20 20 20 20 20 20  =utf-8"         
9070: 20 7d 2c 0a 20 20 20 20 7b 20 22 69 63 65 22 2c   },.    { "ice",
9080: 20 20 20 20 20 20 20 20 33 2c 20 22 78 2d 63 6f          3, "x-co
9090: 6e 66 65 72 65 6e 63 65 2f 78 2d 63 6f 6f 6c 74  nference/x-coolt
90a0: 61 6c 6b 22 20 20 20 20 20 20 20 20 20 20 20 7d  alk"           }
90b0: 2c 0a 20 20 20 20 7b 20 22 69 65 66 22 2c 20 20  ,.    { "ief",  
90c0: 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f        3, "image/
90d0: 69 65 66 22 20 20 20 20 20 20 20 20 20 20 20 20  ief"            
90e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
90f0: 20 20 20 20 7b 20 22 69 67 65 73 22 2c 20 20 20      { "iges",   
9100: 20 20 20 20 34 2c 20 22 6d 6f 64 65 6c 2f 69 67      4, "model/ig
9110: 65 73 22 20 20 20 20 20 20 20 20 20 20 20 20 20  es"             
9120: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
9130: 20 20 7b 20 22 69 67 73 22 2c 20 20 20 20 20 20    { "igs",      
9140: 20 20 33 2c 20 22 6d 6f 64 65 6c 2f 69 67 65 73    3, "model/iges
9150: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9160: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9170: 7b 20 22 69 70 73 22 2c 20 20 20 20 20 20 20 20  { "ips",        
9180: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
9190: 78 2d 69 70 73 63 72 69 70 74 22 20 20 20 20 20  x-ipscript"     
91a0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
91b0: 22 69 70 78 22 2c 20 20 20 20 20 20 20 20 33 2c  "ipx",        3,
91c0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
91d0: 69 70 69 78 22 20 20 20 20 20 20 20 20 20 20 20  ipix"           
91e0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a       },.    { "j
91f0: 61 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ad",        3, "
9200: 74 65 78 74 2f 76 6e 64 2e 73 75 6e 2e 6a 32 6d  text/vnd.sun.j2m
9210: 65 2e 61 70 70 2d 64 65 73 63 72 69 70 74 6f 72  e.app-descriptor
9220: 22 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 61 72  "  },.    { "jar
9230: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
9240: 70 6c 69 63 61 74 69 6f 6e 2f 6a 61 76 61 2d 61  plication/java-a
9250: 72 63 68 69 76 65 22 20 20 20 20 20 20 20 20 20  rchive"         
9260: 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 70 65 67 22   },.    { "jpeg"
9270: 2c 20 20 20 20 20 20 20 34 2c 20 22 69 6d 61 67  ,       4, "imag
9280: 65 2f 6a 70 65 67 22 20 20 20 20 20 20 20 20 20  e/jpeg"         
9290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
92a0: 2c 0a 20 20 20 20 7b 20 22 6a 70 65 22 2c 20 20  ,.    { "jpe",  
92b0: 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f        3, "image/
92c0: 6a 70 65 67 22 20 20 20 20 20 20 20 20 20 20 20  jpeg"           
92d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
92e0: 20 20 20 20 7b 20 22 6a 70 67 22 2c 20 20 20 20      { "jpg",    
92f0: 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 6a 70      3, "image/jp
9300: 65 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20  eg"             
9310: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
9320: 20 20 7b 20 22 6a 73 22 2c 20 20 20 20 20 20 20    { "js",       
9330: 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    2, "applicatio
9340: 6e 2f 78 2d 6a 61 76 61 73 63 72 69 70 74 22 20  n/x-javascript" 
9350: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9360: 7b 20 22 6b 61 72 22 2c 20 20 20 20 20 20 20 20  { "kar",        
9370: 33 2c 20 22 61 75 64 69 6f 2f 6d 69 64 69 22 20  3, "audio/midi" 
9380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9390: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
93a0: 22 6c 61 74 65 78 22 2c 20 20 20 20 20 20 35 2c  "latex",      5,
93b0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
93c0: 6c 61 74 65 78 22 20 20 20 20 20 20 20 20 20 20  latex"          
93d0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c       },.    { "l
93e0: 68 61 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ha",        3, "
93f0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65  application/octe
9400: 74 2d 73 74 72 65 61 6d 22 20 20 20 20 20 20 20  t-stream"       
9410: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 73 70     },.    { "lsp
9420: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
9430: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6c 69 73 70  plication/x-lisp
9440: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9450: 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 7a 68 22 2c   },.    { "lzh",
9460: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
9470: 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74  ication/octet-st
9480: 72 65 61 6d 22 20 20 20 20 20 20 20 20 20 20 7d  ream"          }
9490: 2c 0a 20 20 20 20 7b 20 22 6d 22 2c 20 20 20 20  ,.    { "m",    
94a0: 20 20 20 20 20 20 31 2c 20 22 74 65 78 74 2f 70        1, "text/p
94b0: 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20 20 20  lain"           
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
94d0: 20 20 20 20 7b 20 22 6d 33 75 22 2c 20 20 20 20      { "m3u",    
94e0: 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d      3, "audio/x-
94f0: 6d 70 65 67 75 72 6c 22 20 20 20 20 20 20 20 20  mpegurl"        
9500: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
9510: 20 20 7b 20 22 6d 61 6e 22 2c 20 20 20 20 20 20    { "man",      
9520: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
9530: 6e 2f 78 2d 74 72 6f 66 66 2d 6d 61 6e 22 20 20  n/x-troff-man"  
9540: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9550: 7b 20 22 6d 65 22 2c 20 20 20 20 20 20 20 20 20  { "me",         
9560: 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  2, "application/
9570: 78 2d 74 72 6f 66 66 2d 6d 65 22 20 20 20 20 20  x-troff-me"     
9580: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
9590: 22 6d 65 73 68 22 2c 20 20 20 20 20 20 20 34 2c  "mesh",       4,
95a0: 20 22 6d 6f 64 65 6c 2f 6d 65 73 68 22 20 20 20   "model/mesh"   
95b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95c0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d       },.    { "m
95d0: 69 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  id",        3, "
95e0: 61 75 64 69 6f 2f 6d 69 64 69 22 20 20 20 20 20  audio/midi"     
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9600: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 69 64     },.    { "mid
9610: 69 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 75  i",       4, "au
9620: 64 69 6f 2f 6d 69 64 69 22 20 20 20 20 20 20 20  dio/midi"       
9630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9640: 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 69 66 22 2c   },.    { "mif",
9650: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
9660: 69 63 61 74 69 6f 6e 2f 78 2d 6d 69 66 22 20 20  ication/x-mif"  
9670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
9680: 2c 0a 20 20 20 20 7b 20 22 6d 69 6d 65 22 2c 20  ,.    { "mime", 
9690: 20 20 20 20 20 20 34 2c 20 22 77 77 77 2f 6d 69        4, "www/mi
96a0: 6d 65 22 20 20 20 20 20 20 20 20 20 20 20 20 20  me"             
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
96c0: 20 20 20 20 7b 20 22 6d 6f 76 69 65 22 2c 20 20      { "movie",  
96d0: 20 20 20 20 35 2c 20 22 76 69 64 65 6f 2f 78 2d      5, "video/x-
96e0: 73 67 69 2d 6d 6f 76 69 65 22 20 20 20 20 20 20  sgi-movie"      
96f0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
9700: 20 20 7b 20 22 6d 6f 76 22 2c 20 20 20 20 20 20    { "mov",      
9710: 20 20 33 2c 20 22 76 69 64 65 6f 2f 71 75 69 63    3, "video/quic
9720: 6b 74 69 6d 65 22 20 20 20 20 20 20 20 20 20 20  ktime"          
9730: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9740: 7b 20 22 6d 70 32 22 2c 20 20 20 20 20 20 20 20  { "mp2",        
9750: 33 2c 20 22 61 75 64 69 6f 2f 6d 70 65 67 22 20  3, "audio/mpeg" 
9760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9770: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
9780: 22 6d 70 32 22 2c 20 20 20 20 20 20 20 20 33 2c  "mp2",        3,
9790: 20 22 76 69 64 65 6f 2f 6d 70 65 67 22 20 20 20   "video/mpeg"   
97a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97b0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d       },.    { "m
97c0: 70 33 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  p3",        3, "
97d0: 61 75 64 69 6f 2f 6d 70 65 67 22 20 20 20 20 20  audio/mpeg"     
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97f0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 65     },.    { "mpe
9800: 67 22 2c 20 20 20 20 20 20 20 34 2c 20 22 76 69  g",       4, "vi
9810: 64 65 6f 2f 6d 70 65 67 22 20 20 20 20 20 20 20  deo/mpeg"       
9820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9830: 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 65 22 2c   },.    { "mpe",
9840: 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64 65          3, "vide
9850: 6f 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20 20  o/mpeg"         
9860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
9870: 2c 0a 20 20 20 20 7b 20 22 6d 70 67 61 22 2c 20  ,.    { "mpga", 
9880: 20 20 20 20 20 20 34 2c 20 22 61 75 64 69 6f 2f        4, "audio/
9890: 6d 70 65 67 22 20 20 20 20 20 20 20 20 20 20 20  mpeg"           
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
98b0: 20 20 20 20 7b 20 22 6d 70 67 22 2c 20 20 20 20      { "mpg",    
98c0: 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 6d 70      3, "video/mp
98d0: 65 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20  eg"             
98e0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
98f0: 20 20 7b 20 22 6d 73 22 2c 20 20 20 20 20 20 20    { "ms",       
9900: 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    2, "applicatio
9910: 6e 2f 78 2d 74 72 6f 66 66 2d 6d 73 22 20 20 20  n/x-troff-ms"   
9920: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9930: 7b 20 22 6d 73 68 22 2c 20 20 20 20 20 20 20 20  { "msh",        
9940: 33 2c 20 22 6d 6f 64 65 6c 2f 6d 65 73 68 22 20  3, "model/mesh" 
9950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9960: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
9970: 22 6e 63 22 2c 20 20 20 20 20 20 20 20 20 32 2c  "nc",         2,
9980: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
9990: 6e 65 74 63 64 66 22 20 20 20 20 20 20 20 20 20  netcdf"         
99a0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f       },.    { "o
99b0: 64 61 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  da",        3, "
99c0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 64 61 22  application/oda"
99d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99e0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 67 67     },.    { "ogg
99f0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
9a00: 70 6c 69 63 61 74 69 6f 6e 2f 6f 67 67 22 20 20  plication/ogg"  
9a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a20: 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 67 6d 22 2c   },.    { "ogm",
9a30: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
9a40: 69 63 61 74 69 6f 6e 2f 6f 67 67 22 20 20 20 20  ication/ogg"    
9a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
9a60: 2c 0a 20 20 20 20 7b 20 22 70 62 6d 22 2c 20 20  ,.    { "pbm",  
9a70: 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f        3, "image/
9a80: 78 2d 70 6f 72 74 61 62 6c 65 2d 62 69 74 6d 61  x-portable-bitma
9a90: 70 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  p"           },.
9aa0: 20 20 20 20 7b 20 22 70 64 62 22 2c 20 20 20 20      { "pdb",    
9ab0: 20 20 20 20 33 2c 20 22 63 68 65 6d 69 63 61 6c      3, "chemical
9ac0: 2f 78 2d 70 64 62 22 20 20 20 20 20 20 20 20 20  /x-pdb"         
9ad0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
9ae0: 20 20 7b 20 22 70 64 66 22 2c 20 20 20 20 20 20    { "pdf",      
9af0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
9b00: 6e 2f 70 64 66 22 20 20 20 20 20 20 20 20 20 20  n/pdf"          
9b10: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9b20: 7b 20 22 70 67 6d 22 2c 20 20 20 20 20 20 20 20  { "pgm",        
9b30: 33 2c 20 22 69 6d 61 67 65 2f 78 2d 70 6f 72 74  3, "image/x-port
9b40: 61 62 6c 65 2d 67 72 61 79 6d 61 70 22 20 20 20  able-graymap"   
9b50: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
9b60: 22 70 67 6e 22 2c 20 20 20 20 20 20 20 20 33 2c  "pgn",        3,
9b70: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
9b80: 63 68 65 73 73 2d 70 67 6e 22 20 20 20 20 20 20  chess-pgn"      
9b90: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70       },.    { "p
9ba0: 67 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  gp",        3, "
9bb0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 67 70 22  application/pgp"
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bd0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 6c 22     },.    { "pl"
9be0: 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70  ,         2, "ap
9bf0: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 70 65 72 6c  plication/x-perl
9c00: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9c10: 20 7d 2c 0a 20 20 20 20 7b 20 22 70 6d 22 2c 20   },.    { "pm", 
9c20: 20 20 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c          2, "appl
9c30: 69 63 61 74 69 6f 6e 2f 78 2d 70 65 72 6c 22 20  ication/x-perl" 
9c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
9c50: 2c 0a 20 20 20 20 7b 20 22 70 6e 67 22 2c 20 20  ,.    { "png",  
9c60: 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f        3, "image/
9c70: 70 6e 67 22 20 20 20 20 20 20 20 20 20 20 20 20  png"            
9c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
9c90: 20 20 20 20 7b 20 22 70 6e 6d 22 2c 20 20 20 20      { "pnm",    
9ca0: 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d      3, "image/x-
9cb0: 70 6f 72 74 61 62 6c 65 2d 61 6e 79 6d 61 70 22  portable-anymap"
9cc0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
9cd0: 20 20 7b 20 22 70 6f 74 22 2c 20 20 20 20 20 20    { "pot",      
9ce0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
9cf0: 6e 2f 6d 73 70 6f 77 65 72 70 6f 69 6e 74 22 20  n/mspowerpoint" 
9d00: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9d10: 7b 20 22 70 70 6d 22 2c 20 20 20 20 20 20 20 20  { "ppm",        
9d20: 33 2c 20 22 69 6d 61 67 65 2f 78 2d 70 6f 72 74  3, "image/x-port
9d30: 61 62 6c 65 2d 70 69 78 6d 61 70 22 20 20 20 20  able-pixmap"    
9d40: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
9d50: 22 70 70 73 22 2c 20 20 20 20 20 20 20 20 33 2c  "pps",        3,
9d60: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73   "application/ms
9d70: 70 6f 77 65 72 70 6f 69 6e 74 22 20 20 20 20 20  powerpoint"     
9d80: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70       },.    { "p
9d90: 70 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  pt",        3, "
9da0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 70 6f  application/mspo
9db0: 77 65 72 70 6f 69 6e 74 22 20 20 20 20 20 20 20  werpoint"       
9dc0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 70 7a     },.    { "ppz
9dd0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
9de0: 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 70 6f 77 65  plication/mspowe
9df0: 72 70 6f 69 6e 74 22 20 20 20 20 20 20 20 20 20  rpoint"         
9e00: 20 7d 2c 0a 20 20 20 20 7b 20 22 70 72 65 22 2c   },.    { "pre",
9e10: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
9e20: 69 63 61 74 69 6f 6e 2f 78 2d 66 72 65 65 6c 61  ication/x-freela
9e30: 6e 63 65 22 20 20 20 20 20 20 20 20 20 20 20 7d  nce"           }
9e40: 2c 0a 20 20 20 20 7b 20 22 70 72 74 22 2c 20 20  ,.    { "prt",  
9e50: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
9e60: 61 74 69 6f 6e 2f 70 72 6f 5f 65 6e 67 22 20 20  ation/pro_eng"  
9e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
9e80: 20 20 20 20 7b 20 22 70 73 22 2c 20 20 20 20 20      { "ps",     
9e90: 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74      2, "applicat
9ea0: 69 6f 6e 2f 70 6f 73 74 73 63 72 69 70 74 22 20  ion/postscript" 
9eb0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
9ec0: 20 20 7b 20 22 71 74 22 2c 20 20 20 20 20 20 20    { "qt",       
9ed0: 20 20 32 2c 20 22 76 69 64 65 6f 2f 71 75 69 63    2, "video/quic
9ee0: 6b 74 69 6d 65 22 20 20 20 20 20 20 20 20 20 20  ktime"          
9ef0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9f00: 7b 20 22 72 61 22 2c 20 20 20 20 20 20 20 20 20  { "ra",         
9f10: 32 2c 20 22 61 75 64 69 6f 2f 78 2d 72 65 61 6c  2, "audio/x-real
9f20: 61 75 64 69 6f 22 20 20 20 20 20 20 20 20 20 20  audio"          
9f30: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
9f40: 22 72 61 6d 22 2c 20 20 20 20 20 20 20 20 33 2c  "ram",        3,
9f50: 20 22 61 75 64 69 6f 2f 78 2d 70 6e 2d 72 65 61   "audio/x-pn-rea
9f60: 6c 61 75 64 69 6f 22 20 20 20 20 20 20 20 20 20  laudio"         
9f70: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72       },.    { "r
9f80: 61 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ar",        3, "
9f90: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 72 61  application/x-ra
9fa0: 72 2d 63 6f 6d 70 72 65 73 73 65 64 22 20 20 20  r-compressed"   
9fb0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61 73     },.    { "ras
9fc0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d  ",        3, "im
9fd0: 61 67 65 2f 63 6d 75 2d 72 61 73 74 65 72 22 20  age/cmu-raster" 
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ff0: 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61 73 22 2c   },.    { "ras",
a000: 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67          3, "imag
a010: 65 2f 78 2d 63 6d 75 2d 72 61 73 74 65 72 22 20  e/x-cmu-raster" 
a020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
a030: 2c 0a 20 20 20 20 7b 20 22 72 67 62 22 2c 20 20  ,.    { "rgb",  
a040: 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f        3, "image/
a050: 78 2d 72 67 62 22 20 20 20 20 20 20 20 20 20 20  x-rgb"          
a060: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
a070: 20 20 20 20 7b 20 22 72 6d 22 2c 20 20 20 20 20      { "rm",     
a080: 20 20 20 20 32 2c 20 22 61 75 64 69 6f 2f 78 2d      2, "audio/x-
a090: 70 6e 2d 72 65 61 6c 61 75 64 69 6f 22 20 20 20  pn-realaudio"   
a0a0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
a0b0: 20 20 7b 20 22 72 6f 66 66 22 2c 20 20 20 20 20    { "roff",     
a0c0: 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    4, "applicatio
a0d0: 6e 2f 78 2d 74 72 6f 66 66 22 20 20 20 20 20 20  n/x-troff"      
a0e0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
a0f0: 7b 20 22 72 70 6d 22 2c 20 20 20 20 20 20 20 20  { "rpm",        
a100: 33 2c 20 22 61 75 64 69 6f 2f 78 2d 70 6e 2d 72  3, "audio/x-pn-r
a110: 65 61 6c 61 75 64 69 6f 2d 70 6c 75 67 69 6e 22  ealaudio-plugin"
a120: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
a130: 22 72 74 66 22 2c 20 20 20 20 20 20 20 20 33 2c  "rtf",        3,
a140: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 72 74   "application/rt
a150: 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f"              
a160: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72       },.    { "r
a170: 74 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  tf",        3, "
a180: 74 65 78 74 2f 72 74 66 22 20 20 20 20 20 20 20  text/rtf"       
a190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1a0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 74 78     },.    { "rtx
a1b0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65  ",        3, "te
a1c0: 78 74 2f 72 69 63 68 74 65 78 74 22 20 20 20 20  xt/richtext"    
a1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1e0: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 63 6d 22 2c   },.    { "scm",
a1f0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
a200: 69 63 61 74 69 6f 6e 2f 78 2d 6c 6f 74 75 73 73  ication/x-lotuss
a210: 63 72 65 65 6e 63 61 6d 22 20 20 20 20 20 20 7d  creencam"      }
a220: 2c 0a 20 20 20 20 7b 20 22 73 65 74 22 2c 20 20  ,.    { "set",  
a230: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
a240: 61 74 69 6f 6e 2f 73 65 74 22 20 20 20 20 20 20  ation/set"      
a250: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
a260: 20 20 20 20 7b 20 22 73 67 6d 6c 22 2c 20 20 20      { "sgml",   
a270: 20 20 20 20 34 2c 20 22 74 65 78 74 2f 73 67 6d      4, "text/sgm
a280: 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l"              
a290: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
a2a0: 20 20 7b 20 22 73 67 6d 22 2c 20 20 20 20 20 20    { "sgm",      
a2b0: 20 20 33 2c 20 22 74 65 78 74 2f 73 67 6d 6c 22    3, "text/sgml"
a2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2d0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
a2e0: 7b 20 22 73 68 22 2c 20 20 20 20 20 20 20 20 20  { "sh",         
a2f0: 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  2, "application/
a300: 78 2d 73 68 22 20 20 20 20 20 20 20 20 20 20 20  x-sh"           
a310: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
a320: 22 73 68 61 72 22 2c 20 20 20 20 20 20 20 34 2c  "shar",       4,
a330: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
a340: 73 68 61 72 22 20 20 20 20 20 20 20 20 20 20 20  shar"           
a350: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73       },.    { "s
a360: 69 6c 6f 22 2c 20 20 20 20 20 20 20 34 2c 20 22  ilo",       4, "
a370: 6d 6f 64 65 6c 2f 6d 65 73 68 22 20 20 20 20 20  model/mesh"     
a380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a390: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 69 74     },.    { "sit
a3a0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
a3b0: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 74 75 66  plication/x-stuf
a3c0: 66 69 74 22 20 20 20 20 20 20 20 20 20 20 20 20  fit"            
a3d0: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6b 64 22 2c   },.    { "skd",
a3e0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
a3f0: 69 63 61 74 69 6f 6e 2f 78 2d 6b 6f 61 6e 22 20  ication/x-koan" 
a400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
a410: 2c 0a 20 20 20 20 7b 20 22 73 6b 6d 22 2c 20 20  ,.    { "skm",  
a420: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
a430: 61 74 69 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20  ation/x-koan"   
a440: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
a450: 20 20 20 20 7b 20 22 73 6b 70 22 2c 20 20 20 20      { "skp",    
a460: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
a470: 69 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20 20 20  ion/x-koan"     
a480: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
a490: 20 20 7b 20 22 73 6b 74 22 2c 20 20 20 20 20 20    { "skt",      
a4a0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
a4b0: 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20 20 20 20 20  n/x-koan"       
a4c0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
a4d0: 7b 20 22 73 6d 69 22 2c 20 20 20 20 20 20 20 20  { "smi",        
a4e0: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
a4f0: 73 6d 69 6c 22 20 20 20 20 20 20 20 20 20 20 20  smil"           
a500: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
a510: 22 73 6d 69 6c 22 2c 20 20 20 20 20 20 20 34 2c  "smil",       4,
a520: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 73 6d   "application/sm
a530: 69 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20  il"             
a540: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73       },.    { "s
a550: 6e 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  nd",        3, "
a560: 61 75 64 69 6f 2f 62 61 73 69 63 22 20 20 20 20  audio/basic"    
a570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a580: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6f 6c     },.    { "sol
a590: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
a5a0: 70 6c 69 63 61 74 69 6f 6e 2f 73 6f 6c 69 64 73  plication/solids
a5b0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
a5c0: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 70 6c 22 2c   },.    { "spl",
a5d0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
a5e0: 69 63 61 74 69 6f 6e 2f 78 2d 66 75 74 75 72 65  ication/x-future
a5f0: 73 70 6c 61 73 68 22 20 20 20 20 20 20 20 20 7d  splash"        }
a600: 2c 0a 20 20 20 20 7b 20 22 73 72 63 22 2c 20 20  ,.    { "src",  
a610: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
a620: 61 74 69 6f 6e 2f 78 2d 77 61 69 73 2d 73 6f 75  ation/x-wais-sou
a630: 72 63 65 22 20 20 20 20 20 20 20 20 20 7d 2c 0a  rce"         },.
a640: 20 20 20 20 7b 20 22 73 74 65 70 22 2c 20 20 20      { "step",   
a650: 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74      4, "applicat
a660: 69 6f 6e 2f 53 54 45 50 22 20 20 20 20 20 20 20  ion/STEP"       
a670: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
a680: 20 20 7b 20 22 73 74 6c 22 2c 20 20 20 20 20 20    { "stl",      
a690: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
a6a0: 6e 2f 53 4c 41 22 20 20 20 20 20 20 20 20 20 20  n/SLA"          
a6b0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
a6c0: 7b 20 22 73 74 70 22 2c 20 20 20 20 20 20 20 20  { "stp",        
a6d0: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
a6e0: 53 54 45 50 22 20 20 20 20 20 20 20 20 20 20 20  STEP"           
a6f0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
a700: 22 73 76 34 63 70 69 6f 22 2c 20 20 20 20 37 2c  "sv4cpio",    7,
a710: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
a720: 73 76 34 63 70 69 6f 22 20 20 20 20 20 20 20 20  sv4cpio"        
a730: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73       },.    { "s
a740: 76 34 63 72 63 22 2c 20 20 20 20 20 36 2c 20 22  v4crc",     6, "
a750: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 76  application/x-sv
a760: 34 63 72 63 22 20 20 20 20 20 20 20 20 20 20 20  4crc"           
a770: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 76 67     },.    { "svg
a780: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d  ",        3, "im
a790: 61 67 65 2f 73 76 67 2b 78 6d 6c 22 20 20 20 20  age/svg+xml"    
a7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7b0: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 77 66 22 2c   },.    { "swf",
a7c0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
a7d0: 69 63 61 74 69 6f 6e 2f 78 2d 73 68 6f 63 6b 77  ication/x-shockw
a7e0: 61 76 65 2d 66 6c 61 73 68 22 20 20 20 20 20 7d  ave-flash"     }
a7f0: 2c 0a 20 20 20 20 7b 20 22 74 22 2c 20 20 20 20  ,.    { "t",    
a800: 20 20 20 20 20 20 31 2c 20 22 61 70 70 6c 69 63        1, "applic
a810: 61 74 69 6f 6e 2f 78 2d 74 72 6f 66 66 22 20 20  ation/x-troff"  
a820: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
a830: 20 20 20 20 7b 20 22 74 61 72 22 2c 20 20 20 20      { "tar",    
a840: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
a850: 69 6f 6e 2f 78 2d 74 61 72 22 20 20 20 20 20 20  ion/x-tar"      
a860: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
a870: 20 20 7b 20 22 74 63 6c 22 2c 20 20 20 20 20 20    { "tcl",      
a880: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
a890: 6e 2f 78 2d 74 63 6c 22 20 20 20 20 20 20 20 20  n/x-tcl"        
a8a0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
a8b0: 7b 20 22 74 65 78 22 2c 20 20 20 20 20 20 20 20  { "tex",        
a8c0: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
a8d0: 78 2d 74 65 78 22 20 20 20 20 20 20 20 20 20 20  x-tex"          
a8e0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
a8f0: 22 74 65 78 69 22 2c 20 20 20 20 20 20 20 34 2c  "texi",       4,
a900: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
a910: 74 65 78 69 6e 66 6f 22 20 20 20 20 20 20 20 20  texinfo"        
a920: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74       },.    { "t
a930: 65 78 69 6e 66 6f 22 2c 20 20 20 20 37 2c 20 22  exinfo",    7, "
a940: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 65  application/x-te
a950: 78 69 6e 66 6f 22 20 20 20 20 20 20 20 20 20 20  xinfo"          
a960: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 67 7a     },.    { "tgz
a970: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
a980: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 61 72 2d  plication/x-tar-
a990: 67 7a 22 20 20 20 20 20 20 20 20 20 20 20 20 20  gz"             
a9a0: 20 7d 2c 0a 20 20 20 20 7b 20 22 74 69 66 66 22   },.    { "tiff"
a9b0: 2c 20 20 20 20 20 20 20 34 2c 20 22 69 6d 61 67  ,       4, "imag
a9c0: 65 2f 74 69 66 66 22 20 20 20 20 20 20 20 20 20  e/tiff"         
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
a9e0: 2c 0a 20 20 20 20 7b 20 22 74 69 66 22 2c 20 20  ,.    { "tif",  
a9f0: 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f        3, "image/
aa00: 74 69 66 66 22 20 20 20 20 20 20 20 20 20 20 20  tiff"           
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
aa20: 20 20 20 20 7b 20 22 74 72 22 2c 20 20 20 20 20      { "tr",     
aa30: 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74      2, "applicat
aa40: 69 6f 6e 2f 78 2d 74 72 6f 66 66 22 20 20 20 20  ion/x-troff"    
aa50: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
aa60: 20 20 7b 20 22 74 73 69 22 2c 20 20 20 20 20 20    { "tsi",      
aa70: 20 20 33 2c 20 22 61 75 64 69 6f 2f 54 53 50 2d    3, "audio/TSP-
aa80: 61 75 64 69 6f 22 20 20 20 20 20 20 20 20 20 20  audio"          
aa90: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
aaa0: 7b 20 22 74 73 70 22 2c 20 20 20 20 20 20 20 20  { "tsp",        
aab0: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
aac0: 64 73 70 74 79 70 65 22 20 20 20 20 20 20 20 20  dsptype"        
aad0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
aae0: 22 74 73 76 22 2c 20 20 20 20 20 20 20 20 33 2c  "tsv",        3,
aaf0: 20 22 74 65 78 74 2f 74 61 62 2d 73 65 70 61 72   "text/tab-separ
ab00: 61 74 65 64 2d 76 61 6c 75 65 73 22 20 20 20 20  ated-values"    
ab10: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74       },.    { "t
ab20: 78 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  xt",        3, "
ab30: 74 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20 20  text/plain"     
ab40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab50: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 75 6e 76     },.    { "unv
ab60: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
ab70: 70 6c 69 63 61 74 69 6f 6e 2f 69 2d 64 65 61 73  plication/i-deas
ab80: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
ab90: 20 7d 2c 0a 20 20 20 20 7b 20 22 75 73 74 61 72   },.    { "ustar
aba0: 22 2c 20 20 20 20 20 20 35 2c 20 22 61 70 70 6c  ",      5, "appl
abb0: 69 63 61 74 69 6f 6e 2f 78 2d 75 73 74 61 72 22  ication/x-ustar"
abc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
abd0: 2c 0a 20 20 20 20 7b 20 22 76 63 64 22 2c 20 20  ,.    { "vcd",  
abe0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
abf0: 61 74 69 6f 6e 2f 78 2d 63 64 6c 69 6e 6b 22 20  ation/x-cdlink" 
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
ac10: 20 20 20 20 7b 20 22 76 64 61 22 2c 20 20 20 20      { "vda",    
ac20: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
ac30: 69 6f 6e 2f 76 64 61 22 20 20 20 20 20 20 20 20  ion/vda"        
ac40: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
ac50: 20 20 7b 20 22 76 69 76 22 2c 20 20 20 20 20 20    { "viv",      
ac60: 20 20 33 2c 20 22 76 69 64 65 6f 2f 76 6e 64 2e    3, "video/vnd.
ac70: 76 69 76 6f 22 20 20 20 20 20 20 20 20 20 20 20  vivo"           
ac80: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
ac90: 7b 20 22 76 69 76 6f 22 2c 20 20 20 20 20 20 20  { "vivo",       
aca0: 34 2c 20 22 76 69 64 65 6f 2f 76 6e 64 2e 76 69  4, "video/vnd.vi
acb0: 76 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20  vo"             
acc0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
acd0: 22 76 72 6d 6c 22 2c 20 20 20 20 20 20 20 34 2c  "vrml",       4,
ace0: 20 22 6d 6f 64 65 6c 2f 76 72 6d 6c 22 20 20 20   "model/vrml"   
acf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad00: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 76       },.    { "v
ad10: 73 69 78 22 2c 20 20 20 20 20 20 20 34 2c 20 22  six",       4, "
ad20: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76 73 69 78  application/vsix
ad30: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
ad40: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 61 76     },.    { "wav
ad50: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75  ",        3, "au
ad60: 64 69 6f 2f 78 2d 77 61 76 22 20 20 20 20 20 20  dio/x-wav"      
ad70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad80: 20 7d 2c 0a 20 20 20 20 7b 20 22 77 61 78 22 2c   },.    { "wax",
ad90: 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69          3, "audi
ada0: 6f 2f 78 2d 6d 73 2d 77 61 78 22 20 20 20 20 20  o/x-ms-wax"     
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
adc0: 2c 0a 20 20 20 20 7b 20 22 77 69 6b 69 22 2c 20  ,.    { "wiki", 
add0: 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63        4, "applic
ade0: 61 74 69 6f 6e 2f 78 2d 66 6f 73 73 69 6c 2d 77  ation/x-fossil-w
adf0: 69 6b 69 22 20 20 20 20 20 20 20 20 20 7d 2c 0a  iki"         },.
ae00: 20 20 20 20 7b 20 22 77 6d 61 22 2c 20 20 20 20      { "wma",    
ae10: 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d      3, "audio/x-
ae20: 6d 73 2d 77 6d 61 22 20 20 20 20 20 20 20 20 20  ms-wma"         
ae30: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
ae40: 20 20 7b 20 22 77 6d 76 22 2c 20 20 20 20 20 20    { "wmv",      
ae50: 20 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73    3, "video/x-ms
ae60: 2d 77 6d 76 22 20 20 20 20 20 20 20 20 20 20 20  -wmv"           
ae70: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
ae80: 7b 20 22 77 6d 78 22 2c 20 20 20 20 20 20 20 20  { "wmx",        
ae90: 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 77  3, "video/x-ms-w
aea0: 6d 78 22 20 20 20 20 20 20 20 20 20 20 20 20 20  mx"             
aeb0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
aec0: 22 77 72 6c 22 2c 20 20 20 20 20 20 20 20 33 2c  "wrl",        3,
aed0: 20 22 6d 6f 64 65 6c 2f 76 72 6d 6c 22 20 20 20   "model/vrml"   
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aef0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77       },.    { "w
af00: 76 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  vx",        3, "
af10: 76 69 64 65 6f 2f 78 2d 6d 73 2d 77 76 78 22 20  video/x-ms-wvx" 
af20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af30: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 62 6d     },.    { "xbm
af40: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d  ",        3, "im
af50: 61 67 65 2f 78 2d 78 62 69 74 6d 61 70 22 20 20  age/x-xbitmap"  
af60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af70: 20 7d 2c 0a 20 20 20 20 7b 20 22 78 6c 63 22 2c   },.    { "xlc",
af80: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
af90: 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65  ication/vnd.ms-e
afa0: 78 63 65 6c 22 20 20 20 20 20 20 20 20 20 20 7d  xcel"          }
afb0: 2c 0a 20 20 20 20 7b 20 22 78 6c 6c 22 2c 20 20  ,.    { "xll",  
afc0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
afd0: 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63  ation/vnd.ms-exc
afe0: 65 6c 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  el"          },.
aff0: 20 20 20 20 7b 20 22 78 6c 6d 22 2c 20 20 20 20      { "xlm",    
b000: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
b010: 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c  ion/vnd.ms-excel
b020: 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  "          },.  
b030: 20 20 7b 20 22 78 6c 73 22 2c 20 20 20 20 20 20    { "xls",      
b040: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
b050: 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20  n/vnd.ms-excel" 
b060: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
b070: 7b 20 22 78 6c 77 22 2c 20 20 20 20 20 20 20 20  { "xlw",        
b080: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
b090: 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20 20 20  vnd.ms-excel"   
b0a0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
b0b0: 22 78 6d 6c 22 2c 20 20 20 20 20 20 20 20 33 2c  "xml",        3,
b0c0: 20 22 74 65 78 74 2f 78 6d 6c 22 20 20 20 20 20   "text/xml"     
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0e0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78       },.    { "x
b0f0: 70 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  pm",        3, "
b100: 69 6d 61 67 65 2f 78 2d 78 70 69 78 6d 61 70 22  image/x-xpixmap"
b110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b120: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 77 64     },.    { "xwd
b130: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d  ",        3, "im
b140: 61 67 65 2f 78 2d 78 77 69 6e 64 6f 77 64 75 6d  age/x-xwindowdum
b150: 70 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p"              
b160: 20 7d 2c 0a 20 20 20 20 7b 20 22 78 79 7a 22 2c   },.    { "xyz",
b170: 20 20 20 20 20 20 20 20 33 2c 20 22 63 68 65 6d          3, "chem
b180: 69 63 61 6c 2f 78 2d 70 64 62 22 20 20 20 20 20  ical/x-pdb"     
b190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
b1a0: 2c 0a 20 20 20 20 7b 20 22 7a 69 70 22 2c 20 20  ,.    { "zip",  
b1b0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
b1c0: 61 74 69 6f 6e 2f 7a 69 70 22 20 20 20 20 20 20  ation/zip"      
b1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
b1e0: 20 20 7d 3b 0a 0a 20 20 66 6f 72 28 69 3d 6e 4e    };..  for(i=nN
b1f0: 61 6d 65 2d 31 3b 20 69 3e 30 20 26 26 20 7a 4e  ame-1; i>0 && zN
b200: 61 6d 65 5b 69 5d 21 3d 27 2e 27 3b 20 69 2d 2d  ame[i]!='.'; i--
b210: 29 7b 7d 0a 20 20 7a 20 3d 20 26 7a 4e 61 6d 65  ){}.  z = &zName
b220: 5b 69 2b 31 5d 3b 0a 20 20 6c 65 6e 20 3d 20 6e  [i+1];.  len = n
b230: 4e 61 6d 65 20 2d 20 69 3b 0a 20 20 69 66 28 20  Name - i;.  if( 
b240: 6c 65 6e 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28  len<(int)sizeof(
b250: 7a 53 75 66 66 69 78 29 2d 31 20 29 7b 0a 20 20  zSuffix)-1 ){.  
b260: 20 20 73 74 72 63 70 79 28 7a 53 75 66 66 69 78    strcpy(zSuffix
b270: 2c 20 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  , z);.    for(i=
b280: 30 3b 20 7a 53 75 66 66 69 78 5b 69 5d 3b 20 69  0; zSuffix[i]; i
b290: 2b 2b 29 20 7a 53 75 66 66 69 78 5b 69 5d 20 3d  ++) zSuffix[i] =
b2a0: 20 74 6f 6c 6f 77 65 72 28 7a 53 75 66 66 69 78   tolower(zSuffix
b2b0: 5b 69 5d 29 3b 0a 20 20 20 20 66 69 72 73 74 20  [i]);.    first 
b2c0: 3d 20 30 3b 0a 20 20 20 20 6c 61 73 74 20 3d 20  = 0;.    last = 
b2d0: 73 69 7a 65 6f 66 28 61 4d 69 6d 65 29 2f 73 69  sizeof(aMime)/si
b2e0: 7a 65 6f 66 28 61 4d 69 6d 65 5b 30 5d 29 3b 0a  zeof(aMime[0]);.
b2f0: 20 20 20 20 77 68 69 6c 65 28 20 66 69 72 73 74      while( first
b300: 3c 3d 6c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  <=last ){.      
b310: 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 20 3d  int c;.      i =
b320: 20 28 66 69 72 73 74 2b 6c 61 73 74 29 2f 32 3b   (first+last)/2;
b330: 0a 20 20 20 20 20 20 63 20 3d 20 73 74 72 63 6d  .      c = strcm
b340: 70 28 7a 53 75 66 66 69 78 2c 20 61 4d 69 6d 65  p(zSuffix, aMime
b350: 5b 69 5d 2e 7a 53 75 66 66 69 78 29 3b 0a 20 20  [i].zSuffix);.  
b360: 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72      if( c==0 ) r
b370: 65 74 75 72 6e 20 61 4d 69 6d 65 5b 69 5d 2e 7a  eturn aMime[i].z
b380: 4d 69 6d 65 74 79 70 65 3b 0a 20 20 20 20 20 20  Mimetype;.      
b390: 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20  if( c<0 ){.     
b3a0: 20 20 20 6c 61 73 74 20 3d 20 69 2d 31 3b 0a 20     last = i-1;. 
b3b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b3c0: 20 20 20 20 66 69 72 73 74 20 3d 20 69 2b 31 3b      first = i+1;
b3d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b3e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 61 70 70   }.  return "app
b3f0: 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73  lication/octet-s
b400: 74 72 65 61 6d 22 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tream";.}../*.**
b410: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
b420: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 31 20  able contains 1 
b430: 66 6f 72 20 61 6c 6c 20 63 68 61 72 61 63 74 65  for all characte
b440: 72 73 20 74 68 61 74 20 61 72 65 20 70 65 72 6d  rs that are perm
b450: 69 74 74 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  itted in.** the 
b460: 70 61 72 74 20 6f 66 20 74 68 65 20 55 52 4c 20  part of the URL 
b470: 62 65 66 6f 72 65 20 74 68 65 20 71 75 65 72 79  before the query
b480: 20 70 61 72 61 6d 65 74 65 72 73 20 61 6e 64 20   parameters and 
b490: 66 72 61 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  fragment..**.** 
b4a0: 41 6c 6c 6f 77 65 64 20 63 68 61 72 61 63 74 65  Allowed characte
b4b0: 72 73 3a 20 20 30 2d 39 61 2d 7a 41 2d 5a 2c 2d  rs:  0-9a-zA-Z,-
b4c0: 2e 2f 3a 5f 7e 0a 2a 2a 0a 2a 2a 20 44 69 73 61  ./:_~.**.** Disa
b4d0: 6c 6c 6f 77 65 64 20 63 68 61 72 61 63 74 65 72  llowed character
b4e0: 73 20 69 6e 63 6c 75 64 65 3a 20 20 21 22 23 24  s include:  !"#$
b4f0: 25 26 27 28 29 2a 2b 3b 3c 3d 3e 3f 5b 5c 5d 5e  %&'()*+;<=>?[\]^
b500: 7b 7c 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  {|}.*/.static co
b510: 6e 73 74 20 63 68 61 72 20 61 6c 6c 6f 77 65 64  nst char allowed
b520: 49 6e 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20  InName[] = {.   
b530: 20 20 20 2f 2a 20 20 78 30 20 20 78 31 20 20 78     /*  x0  x1  x
b540: 32 20 20 78 33 20 20 78 34 20 20 78 35 20 20 78  2  x3  x4  x5  x
b550: 36 20 20 78 37 20 20 78 38 20 20 78 39 20 20 78  6  x7  x8  x9  x
b560: 61 20 20 78 62 20 20 78 63 20 20 78 64 20 20 78  a  xb  xc  xd  x
b570: 65 20 20 78 66 20 2a 2f 0a 2f 2a 20 30 78 20 2a  e  xf */./* 0x *
b580: 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  /   0,  0,  0,  
b590: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b5a0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b5b0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b5c0: 30 2c 0a 2f 2a 20 31 78 20 2a 2f 20 20 20 30 2c  0,./* 1x */   0,
b5d0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b5e0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b5f0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b600: 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20    0,  0,  0,./* 
b610: 32 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20  2x */   0,  0,  
b620: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b630: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b640: 30 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20  0,  0,  1,  1,  
b650: 31 2c 20 20 31 2c 0a 2f 2a 20 33 78 20 2a 2f 20  1,  1,./* 3x */ 
b660: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
b670: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
b680: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 30 2c    1,  1,  1,  0,
b690: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b6a0: 0a 2f 2a 20 34 78 20 2a 2f 20 20 20 30 2c 20 20  ./* 4x */   0,  
b6b0: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
b6c0: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
b6d0: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
b6e0: 31 2c 20 20 31 2c 20 20 31 2c 0a 2f 2a 20 35 78  1,  1,  1,./* 5x
b6f0: 20 2a 2f 20 20 20 31 2c 20 20 31 2c 20 20 31 2c   */   1,  1,  1,
b700: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
b710: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
b720: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b730: 20 20 31 2c 0a 2f 2a 20 36 78 20 2a 2f 20 20 20    1,./* 6x */   
b740: 30 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  0,  1,  1,  1,  
b750: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
b760: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
b770: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 0a 2f  1,  1,  1,  1,./
b780: 2a 20 37 78 20 2a 2f 20 20 20 31 2c 20 20 31 2c  * 7x */   1,  1,
b790: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
b7a0: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
b7b0: 20 20 31 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    1,  0,  0,  0,
b7c0: 20 20 31 2c 20 20 30 2c 0a 2f 2a 20 38 78 20 2a    1,  0,./* 8x *
b7d0: 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  /   0,  0,  0,  
b7e0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b7f0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b800: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b810: 30 2c 0a 2f 2a 20 39 78 20 2a 2f 20 20 20 30 2c  0,./* 9x */   0,
b820: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b830: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b840: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b850: 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20    0,  0,  0,./* 
b860: 41 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20  Ax */   0,  0,  
b870: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b880: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b890: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b8a0: 30 2c 20 20 30 2c 0a 2f 2a 20 42 78 20 2a 2f 20  0,  0,./* Bx */ 
b8b0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b8c0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b8d0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b8e0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b8f0: 0a 2f 2a 20 43 78 20 2a 2f 20 20 20 30 2c 20 20  ./* Cx */   0,  
b900: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b910: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b920: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b930: 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 44 78  0,  0,  0,./* Dx
b940: 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c   */   0,  0,  0,
b950: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b960: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b970: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b980: 20 20 30 2c 0a 2f 2a 20 45 78 20 2a 2f 20 20 20    0,./* Ex */   
b990: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b9a0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b9b0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
b9c0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f  0,  0,  0,  0,./
b9d0: 2a 20 46 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c  * Fx */   0,  0,
b9e0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
b9f0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
ba00: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
ba10: 20 20 30 2c 20 20 30 2c 0a 7d 3b 0a 0a 2f 2a 0a    0,  0,.};../*.
ba20: 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 64 69  ** Remove all di
ba30: 73 61 6c 6c 6f 77 65 64 20 63 68 61 72 61 63 74  sallowed charact
ba40: 65 72 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74  ers in the input
ba50: 20 73 74 72 69 6e 67 20 7a 5b 5d 2e 20 20 43 6f   string z[].  Co
ba60: 6e 76 65 72 74 20 61 6e 79 0a 2a 2a 20 64 69 73  nvert any.** dis
ba70: 61 6c 6c 6f 77 65 64 20 63 68 61 72 61 63 74 65  allowed characte
ba80: 72 73 20 69 6e 74 6f 20 22 5f 22 2e 0a 2a 2a 0a  rs into "_"..**.
ba90: 2a 2a 20 4e 6f 74 20 74 68 61 74 20 74 68 65 20  ** Not that the 
baa0: 74 68 72 65 65 20 63 68 61 72 61 63 74 65 72 20  three character 
bab0: 73 65 71 75 65 6e 63 65 20 22 25 58 58 22 20 77  sequence "%XX" w
bac0: 68 65 72 65 20 58 20 69 73 20 61 6e 79 20 62 79  here X is any by
bad0: 74 65 20 69 73 0a 2a 2a 20 63 6f 6e 76 65 72 74  te is.** convert
bae0: 65 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  ed into a single
baf0: 20 22 5f 22 20 63 68 61 72 61 63 74 65 72 2e 0a   "_" character..
bb00: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
bb10: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   number of chara
bb20: 63 74 65 72 73 20 63 6f 6e 76 65 72 74 65 64 2e  cters converted.
bb30: 20 20 41 6e 20 22 25 58 58 22 20 2d 3e 20 22 5f    An "%XX" -> "_
bb40: 22 20 63 6f 6e 76 65 72 73 69 6f 6e 0a 2a 2a 20  " conversion.** 
bb50: 63 6f 75 6e 74 73 20 61 73 20 61 20 73 69 6e 67  counts as a sing
bb60: 6c 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f  le character..*/
bb70: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 6e 69  .static int sani
bb80: 74 69 7a 65 53 74 72 69 6e 67 28 63 68 61 72 20  tizeString(char 
bb90: 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 6e  *z){.  int nChan
bba0: 67 65 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  ge = 0;.  while(
bbb0: 20 2a 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 21   *z ){.    if( !
bbc0: 61 6c 6c 6f 77 65 64 49 6e 4e 61 6d 65 5b 2a 28  allowedInName[*(
bbd0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a  unsigned char*)z
bbe0: 5d 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 2a  ] ){.      if( *
bbf0: 7a 3d 3d 27 25 27 20 26 26 20 7a 5b 31 5d 21 3d  z=='%' && z[1]!=
bc00: 30 20 26 26 20 7a 5b 32 5d 21 3d 30 20 29 7b 0a  0 && z[2]!=0 ){.
bc10: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
bc20: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 33 3b 20         for(i=3; 
bc30: 28 7a 5b 69 2d 32 5d 20 3d 20 7a 5b 69 5d 29 21  (z[i-2] = z[i])!
bc40: 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20  =0; i++){}.     
bc50: 20 7d 0a 20 20 20 20 20 20 2a 7a 20 3d 20 27 5f   }.      *z = '_
bc60: 27 3b 0a 20 20 20 20 20 20 6e 43 68 61 6e 67 65  ';.      nChange
bc70: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 2b  ++;.    }.    z+
bc80: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
bc90: 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChange;.}../*.*
bca0: 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
bcb0: 65 72 20 6f 66 20 22 2f 22 20 63 68 61 72 61 63  er of "/" charac
bcc0: 74 65 72 73 20 69 6e 20 61 20 73 74 72 69 6e 67  ters in a string
bcd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bce0: 63 6f 75 6e 74 53 6c 61 73 68 65 73 28 63 6f 6e  countSlashes(con
bcf0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
bd00: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 77 68 69 6c  nt n = 0;.  whil
bd10: 65 28 20 2a 7a 20 29 20 69 66 28 20 2a 28 7a 2b  e( *z ) if( *(z+
bd20: 2b 29 3d 3d 27 2f 27 20 29 20 6e 2b 2b 3b 0a 20  +)=='/' ) n++;. 
bd30: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
bd40: 0a 2a 2a 20 53 65 6e 64 20 74 68 65 20 74 65 78  .** Send the tex
bd50: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6e 61  t of the file na
bd60: 6d 65 64 20 62 79 20 7a 46 69 6c 65 20 61 73 20  med by zFile as 
bd70: 74 68 65 20 72 65 70 6c 79 2e 20 20 55 73 65 20  the reply.  Use 
bd80: 74 68 65 0a 2a 2a 20 73 75 66 66 69 78 20 6f 6e  the.** suffix on
bd90: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
bda0: 7a 46 69 6c 65 20 6e 61 6d 65 20 74 6f 20 64 65  zFile name to de
bdb0: 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 69 6d 65  termine the mime
bdc0: 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  type..**.** Retu
bdd0: 72 6e 20 31 20 74 6f 20 6f 6d 69 74 20 6d 61 6b  rn 1 to omit mak
bde0: 69 6e 67 20 61 20 6c 6f 67 20 65 6e 74 72 79 20  ing a log entry 
bdf0: 66 6f 72 20 74 68 65 20 72 65 70 6c 79 2e 0a 2a  for the reply..*
be00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 65 6e  /.static int Sen
be10: 64 46 69 6c 65 28 0a 20 20 63 6f 6e 73 74 20 63  dFile(.  const c
be20: 68 61 72 20 2a 7a 46 69 6c 65 2c 20 20 20 20 20  har *zFile,     
be30: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
be40: 66 69 6c 65 20 74 6f 20 73 65 6e 64 20 2a 2f 0a  file to send */.
be50: 20 20 69 6e 74 20 6c 65 6e 46 69 6c 65 2c 20 20    int lenFile,  
be60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
be70: 67 74 68 20 6f 66 20 74 68 65 20 7a 46 69 6c 65  gth of the zFile
be80: 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a   name in bytes *
be90: 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  /.  struct stat 
bea0: 2a 70 53 74 61 74 20 20 20 20 20 20 2f 2a 20 52  *pStat      /* R
beb0: 65 73 75 6c 74 20 6f 66 20 61 20 73 74 61 74 28  esult of a stat(
bec0: 29 20 61 67 61 69 6e 73 74 20 7a 46 69 6c 65 20  ) against zFile 
bed0: 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
bee0: 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 54 79 70 65  ar *zContentType
bef0: 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 74 69 6d  ;.  int c;.  tim
bf00: 65 5f 74 20 74 3b 0a 20 20 46 49 4c 45 20 2a 69  e_t t;.  FILE *i
bf10: 6e 3b 0a 20 20 63 68 61 72 20 7a 45 54 61 67 5b  n;.  char zETag[
bf20: 31 30 30 5d 3b 0a 0a 20 20 7a 43 6f 6e 74 65 6e  100];..  zConten
bf30: 74 54 79 70 65 20 3d 20 47 65 74 4d 69 6d 65 54  tType = GetMimeT
bf40: 79 70 65 28 7a 46 69 6c 65 2c 20 6c 65 6e 46 69  ype(zFile, lenFi
bf50: 6c 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 4e  le);.  if( zTmpN
bf60: 61 6d 20 29 20 75 6e 6c 69 6e 6b 28 7a 54 6d 70  am ) unlink(zTmp
bf70: 4e 61 6d 29 3b 0a 20 20 73 70 72 69 6e 74 66 28  Nam);.  sprintf(
bf80: 7a 45 54 61 67 2c 20 22 6d 25 78 73 25 78 22 2c  zETag, "m%xs%x",
bf90: 20 28 69 6e 74 29 70 53 74 61 74 2d 3e 73 74 5f   (int)pStat->st_
bfa0: 6d 74 69 6d 65 2c 20 28 69 6e 74 29 70 53 74 61  mtime, (int)pSta
bfb0: 74 2d 3e 73 74 5f 73 69 7a 65 29 3b 0a 20 20 69  t->st_size);.  i
bfc0: 66 28 20 43 6f 6d 70 61 72 65 45 74 61 67 73 28  f( CompareEtags(
bfd0: 7a 49 66 4e 6f 6e 65 4d 61 74 63 68 2c 7a 45 54  zIfNoneMatch,zET
bfe0: 61 67 29 3d 3d 30 0a 20 20 20 7c 7c 20 28 7a 49  ag)==0.   || (zI
bff0: 66 4d 6f 64 69 66 69 65 64 53 69 6e 63 65 21 3d  fModifiedSince!=
c000: 30 0a 20 20 20 20 20 20 20 20 26 26 20 28 74 20  0.        && (t 
c010: 3d 20 50 61 72 73 65 52 66 63 38 32 32 44 61 74  = ParseRfc822Dat
c020: 65 28 7a 49 66 4d 6f 64 69 66 69 65 64 53 69 6e  e(zIfModifiedSin
c030: 63 65 29 29 3e 30 0a 20 20 20 20 20 20 20 20 26  ce))>0.        &
c040: 26 20 74 3e 3d 70 53 74 61 74 2d 3e 73 74 5f 6d  & t>=pStat->st_m
c050: 74 69 6d 65 29 0a 20 20 29 7b 0a 20 20 20 20 53  time).  ){.    S
c060: 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 33 30  tartResponse("30
c070: 34 20 4e 6f 74 20 4d 6f 64 69 66 69 65 64 22 29  4 Not Modified")
c080: 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 44 61  ;.    nOut += Da
c090: 74 65 54 61 67 28 22 4c 61 73 74 2d 4d 6f 64 69  teTag("Last-Modi
c0a0: 66 69 65 64 22 2c 20 70 53 74 61 74 2d 3e 73 74  fied", pStat->st
c0b0: 5f 6d 74 69 6d 65 29 3b 0a 20 20 20 20 6e 4f 75  _mtime);.    nOu
c0c0: 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 43 61 63  t += printf("Cac
c0d0: 68 65 2d 43 6f 6e 74 72 6f 6c 3a 20 6d 61 78 2d  he-Control: max-
c0e0: 61 67 65 3d 25 64 5c 72 5c 6e 22 2c 20 6d 78 41  age=%d\r\n", mxA
c0f0: 67 65 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d  ge);.    nOut +=
c100: 20 70 72 69 6e 74 66 28 22 45 54 61 67 3a 20 5c   printf("ETag: \
c110: 22 25 73 5c 22 5c 72 5c 6e 22 2c 20 7a 45 54 61  "%s\"\r\n", zETa
c120: 67 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20  g);.    nOut += 
c130: 70 72 69 6e 74 66 28 22 5c 72 5c 6e 22 29 3b 0a  printf("\r\n");.
c140: 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75      fflush(stdou
c150: 74 29 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f 67 45  t);.    MakeLogE
c160: 6e 74 72 79 28 30 2c 20 34 37 30 29 3b 20 20 2f  ntry(0, 470);  /
c170: 2a 20 4c 4f 47 3a 20 45 54 61 67 20 43 61 63 68  * LOG: ETag Cach
c180: 65 20 48 69 74 20 2a 2f 0a 20 20 20 20 72 65 74  e Hit */.    ret
c190: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 6e 20  urn 1;.  }.  in 
c1a0: 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 22 72  = fopen(zFile,"r
c1b0: 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30  b");.  if( in==0
c1c0: 20 29 20 4e 6f 74 46 6f 75 6e 64 28 34 38 30 29   ) NotFound(480)
c1d0: 3b 20 2f 2a 20 4c 4f 47 3a 20 66 6f 70 65 6e 28  ; /* LOG: fopen(
c1e0: 29 20 66 61 69 6c 65 64 20 66 6f 72 20 73 74 61  ) failed for sta
c1f0: 74 69 63 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  tic content */. 
c200: 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22   StartResponse("
c210: 32 30 30 20 4f 4b 22 29 3b 0a 20 20 6e 4f 75 74  200 OK");.  nOut
c220: 20 2b 3d 20 44 61 74 65 54 61 67 28 22 4c 61 73   += DateTag("Las
c230: 74 2d 4d 6f 64 69 66 69 65 64 22 2c 20 70 53 74  t-Modified", pSt
c240: 61 74 2d 3e 73 74 5f 6d 74 69 6d 65 29 3b 0a 20  at->st_mtime);. 
c250: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
c260: 22 43 61 63 68 65 2d 43 6f 6e 74 72 6f 6c 3a 20  "Cache-Control: 
c270: 6d 61 78 2d 61 67 65 3d 25 64 5c 72 5c 6e 22 2c  max-age=%d\r\n",
c280: 20 6d 78 41 67 65 29 3b 0a 20 20 6e 4f 75 74 20   mxAge);.  nOut 
c290: 2b 3d 20 70 72 69 6e 74 66 28 22 45 54 61 67 3a  += printf("ETag:
c2a0: 20 5c 22 25 73 5c 22 5c 72 5c 6e 22 2c 20 7a 45   \"%s\"\r\n", zE
c2b0: 54 61 67 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20  Tag);.  nOut += 
c2c0: 70 72 69 6e 74 66 28 22 43 6f 6e 74 65 6e 74 2d  printf("Content-
c2d0: 74 79 70 65 3a 20 25 73 5c 72 5c 6e 22 2c 7a 43  type: %s\r\n",zC
c2e0: 6f 6e 74 65 6e 74 54 79 70 65 29 3b 0a 20 20 6e  ontentType);.  n
c2f0: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 43  Out += printf("C
c300: 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74 68 3a 20 25  ontent-length: %
c310: 64 5c 72 5c 6e 5c 72 5c 6e 22 2c 28 69 6e 74 29  d\r\n\r\n",(int)
c320: 70 53 74 61 74 2d 3e 73 74 5f 73 69 7a 65 29 3b  pStat->st_size);
c330: 0a 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74  .  fflush(stdout
c340: 29 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  );.  if( strcmp(
c350: 7a 4d 65 74 68 6f 64 2c 22 48 45 41 44 22 29 3d  zMethod,"HEAD")=
c360: 3d 30 20 29 7b 0a 20 20 20 20 4d 61 6b 65 4c 6f  =0 ){.    MakeLo
c370: 67 45 6e 74 72 79 28 30 2c 20 32 29 3b 20 2f 2a  gEntry(0, 2); /*
c380: 20 4c 4f 47 3a 20 4e 6f 72 6d 61 6c 20 48 45 41   LOG: Normal HEA
c390: 44 20 72 65 70 6c 79 20 2a 2f 0a 20 20 20 20 66  D reply */.    f
c3a0: 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 66  close(in);.    f
c3b0: 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20  flush(stdout);. 
c3c0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
c3d0: 0a 20 20 69 66 28 20 75 73 65 54 69 6d 65 6f 75  .  if( useTimeou
c3e0: 74 20 29 20 61 6c 61 72 6d 28 33 30 20 2b 20 70  t ) alarm(30 + p
c3f0: 53 74 61 74 2d 3e 73 74 5f 73 69 7a 65 2f 31 30  Stat->st_size/10
c400: 30 30 29 3b 0a 23 69 66 64 65 66 20 6c 69 6e 75  00);.#ifdef linu
c410: 78 0a 20 20 7b 0a 20 20 20 20 6f 66 66 5f 74 20  x.  {.    off_t 
c420: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
c430: 6e 4f 75 74 20 2b 3d 20 73 65 6e 64 66 69 6c 65  nOut += sendfile
c440: 28 66 69 6c 65 6e 6f 28 73 74 64 6f 75 74 29 2c  (fileno(stdout),
c450: 20 66 69 6c 65 6e 6f 28 69 6e 29 2c 20 26 6f 66   fileno(in), &of
c460: 66 73 65 74 2c 20 70 53 74 61 74 2d 3e 73 74 5f  fset, pStat->st_
c470: 73 69 7a 65 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  size);.  }.#else
c480: 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 67  .  while( (c = g
c490: 65 74 63 28 69 6e 29 29 21 3d 45 4f 46 20 29 7b  etc(in))!=EOF ){
c4a0: 0a 20 20 20 20 70 75 74 63 28 63 2c 73 74 64 6f  .    putc(c,stdo
c4b0: 75 74 29 3b 0a 20 20 20 20 6e 4f 75 74 2b 2b 3b  ut);.    nOut++;
c4c0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 63  .  }.#endif.  fc
c4d0: 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 72 65 74 75  lose(in);.  retu
c4e0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
c4f0: 20 43 47 49 20 6f 72 20 53 43 47 49 20 73 63 72   CGI or SCGI scr
c500: 69 70 74 20 68 61 73 20 72 75 6e 20 61 6e 64 20  ipt has run and 
c510: 69 73 20 73 65 6e 64 69 6e 67 20 69 74 73 20 72  is sending its r
c520: 65 70 6c 79 20 62 61 63 6b 20 61 63 72 6f 73 73  eply back across
c530: 0a 2a 2a 20 74 68 65 20 63 68 61 6e 6e 65 6c 20  .** the channel 
c540: 22 69 6e 22 2e 20 20 50 72 6f 63 65 73 73 20 74  "in".  Process t
c550: 68 69 73 20 72 65 70 6c 79 20 69 6e 74 6f 20 61  his reply into a
c560: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 48 54  n appropriate HT
c570: 54 50 20 72 65 70 6c 79 2e 0a 2a 2a 20 43 6c 6f  TP reply..** Clo
c580: 73 65 20 74 68 65 20 22 69 6e 22 20 63 68 61 6e  se the "in" chan
c590: 6e 65 6c 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 2a  nel when done..*
c5a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 67  /.static void Cg
c5b0: 69 48 61 6e 64 6c 65 52 65 70 6c 79 28 46 49 4c  iHandleReply(FIL
c5c0: 45 20 2a 69 6e 29 7b 0a 20 20 69 6e 74 20 73 65  E *in){.  int se
c5d0: 65 6e 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 20  enContentLength 
c5e0: 3d 20 30 3b 20 20 20 2f 2a 20 54 72 75 65 20 69  = 0;   /* True i
c5f0: 66 20 43 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74 68  f Content-length
c600: 3a 20 68 65 61 64 65 72 20 73 65 65 6e 20 2a 2f  : header seen */
c610: 0a 20 20 69 6e 74 20 63 6f 6e 74 65 6e 74 4c 65  .  int contentLe
c620: 6e 67 74 68 20 3d 20 30 3b 20 20 20 20 20 20 20  ngth = 0;       
c630: 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6c  /* The content l
c640: 65 6e 67 74 68 20 2a 2f 0a 20 20 73 69 7a 65 5f  ength */.  size_
c650: 74 20 6e 52 65 73 20 3d 20 30 3b 20 20 20 20 20  t nRes = 0;     
c660: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
c670: 20 6f 66 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20   of payload */. 
c680: 20 73 69 7a 65 5f 74 20 6e 4d 61 6c 6c 6f 63 20   size_t nMalloc 
c690: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
c6a0: 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   Bytes of space 
c6b0: 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 61 52 65  allocated to aRe
c6c0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 52 65  s */.  char *aRe
c6d0: 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
c6e0: 20 20 20 20 2f 2a 20 50 61 79 6c 6f 61 64 20 2a      /* Payload *
c6f0: 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20 20  /.  int c;      
c700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c710: 20 2f 2a 20 4e 65 78 74 20 63 68 61 72 61 63 74   /* Next charact
c720: 65 72 20 66 72 6f 6d 20 69 6e 20 2a 2f 0a 20 20  er from in */.  
c730: 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20  char *z;        
c740: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c750: 50 6f 69 6e 74 65 72 20 74 6f 20 73 6f 6d 65 74  Pointer to somet
c760: 68 69 6e 67 20 69 6e 73 69 64 65 20 6f 66 20 7a  hing inside of z
c770: 4c 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 7a  Line */.  char z
c780: 4c 69 6e 65 5b 31 30 30 30 5d 3b 20 20 20 20 20  Line[1000];     
c790: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6c 69         /* One li
c7a0: 6e 65 20 6f 66 20 72 65 70 6c 79 20 66 72 6f 6d  ne of reply from
c7b0: 20 74 68 65 20 43 47 49 20 73 63 72 69 70 74 20   the CGI script 
c7c0: 2a 2f 0a 0a 20 20 69 66 28 20 75 73 65 54 69 6d  */..  if( useTim
c7d0: 65 6f 75 74 20 29 20 61 6c 61 72 6d 28 31 35 29  eout ) alarm(15)
c7e0: 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74 73  ;.  while( fgets
c7f0: 28 7a 4c 69 6e 65 2c 73 69 7a 65 6f 66 28 7a 4c  (zLine,sizeof(zL
c800: 69 6e 65 29 2c 69 6e 29 20 26 26 20 21 69 73 73  ine),in) && !iss
c810: 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20 63  pace((unsigned c
c820: 68 61 72 29 7a 4c 69 6e 65 5b 30 5d 29 20 29 7b  har)zLine[0]) ){
c830: 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 61 73  .    if( strncas
c840: 65 63 6d 70 28 7a 4c 69 6e 65 2c 22 4c 6f 63 61  ecmp(zLine,"Loca
c850: 74 69 6f 6e 3a 22 2c 39 29 3d 3d 30 20 29 7b 0a  tion:",9)==0 ){.
c860: 20 20 20 20 20 20 53 74 61 72 74 52 65 73 70 6f        StartRespo
c870: 6e 73 65 28 22 33 30 32 20 52 65 64 69 72 65 63  nse("302 Redirec
c880: 74 22 29 3b 0a 20 20 20 20 20 20 52 65 6d 6f 76  t");.      Remov
c890: 65 4e 65 77 6c 69 6e 65 28 7a 4c 69 6e 65 29 3b  eNewline(zLine);
c8a0: 0a 20 20 20 20 20 20 7a 20 3d 20 26 7a 4c 69 6e  .      z = &zLin
c8b0: 65 5b 31 30 5d 3b 0a 20 20 20 20 20 20 77 68 69  e[10];.      whi
c8c0: 6c 65 28 20 69 73 73 70 61 63 65 28 2a 28 75 6e  le( isspace(*(un
c8d0: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 29 20  signed char*)z) 
c8e0: 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20  ){ z++; }.      
c8f0: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22  nOut += printf("
c900: 4c 6f 63 61 74 69 6f 6e 3a 20 25 73 5c 72 5c 6e  Location: %s\r\n
c910: 22 2c 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ",z);.    }else 
c920: 69 66 28 20 73 74 72 6e 63 61 73 65 63 6d 70 28  if( strncasecmp(
c930: 7a 4c 69 6e 65 2c 22 53 74 61 74 75 73 3a 22 2c  zLine,"Status:",
c940: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  7)==0 ){.      i
c950: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
c960: 69 3d 37 3b 20 69 73 73 70 61 63 65 28 28 75 6e  i=7; isspace((un
c970: 73 69 67 6e 65 64 20 63 68 61 72 29 7a 4c 69 6e  signed char)zLin
c980: 65 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20  e[i]); i++){}.  
c990: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
c9a0: 74 66 28 22 25 73 20 25 73 22 2c 20 7a 50 72 6f  tf("%s %s", zPro
c9b0: 74 6f 63 6f 6c 2c 20 26 7a 4c 69 6e 65 5b 69 5d  tocol, &zLine[i]
c9c0: 29 3b 0a 20 20 20 20 20 20 73 74 72 6e 63 70 79  );.      strncpy
c9d0: 28 7a 52 65 70 6c 79 53 74 61 74 75 73 2c 20 26  (zReplyStatus, &
c9e0: 7a 4c 69 6e 65 5b 69 5d 2c 20 33 29 3b 0a 20 20  zLine[i], 3);.  
c9f0: 20 20 20 20 7a 52 65 70 6c 79 53 74 61 74 75 73      zReplyStatus
ca00: 5b 33 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  [3] = 0;.      s
ca10: 74 61 74 75 73 53 65 6e 74 20 3d 20 31 3b 0a 20  tatusSent = 1;. 
ca20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca40: 20 20 20 20 2f 2a 20 20 31 32 33 34 35 36 37 38      /*  12345678
ca50: 39 20 31 32 33 34 35 20 2a 2f 0a 20 20 20 20 20  9 12345 */.     
ca60: 20 69 66 28 20 73 74 72 6e 63 61 73 65 63 6d 70   if( strncasecmp
ca70: 28 7a 4c 69 6e 65 2c 20 22 43 6f 6e 74 65 6e 74  (zLine, "Content
ca80: 2d 6c 65 6e 67 74 68 3a 22 2c 20 31 35 29 3d 3d  -length:", 15)==
ca90: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 65  0 ){.        see
caa0: 6e 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 20 3d  nContentLength =
cab0: 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   1;.        cont
cac0: 65 6e 74 4c 65 6e 67 74 68 20 3d 20 61 74 6f 69  entLength = atoi
cad0: 28 7a 4c 69 6e 65 2b 31 35 29 3b 0a 20 20 20 20  (zLine+15);.    
cae0: 20 20 7d 0a 20 20 20 20 20 20 53 74 61 72 74 52    }.      StartR
caf0: 65 73 70 6f 6e 73 65 28 22 32 30 30 20 4f 4b 22  esponse("200 OK"
cb00: 29 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d  );.      nOut +=
cb10: 20 70 72 69 6e 74 66 28 22 25 73 22 2c 7a 4c 69   printf("%s",zLi
cb20: 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ne);.    }.  }..
cb30: 20 20 2f 2a 20 43 6f 70 79 20 65 76 65 72 79 74    /* Copy everyt
cb40: 68 69 6e 67 20 65 6c 73 65 20 74 68 72 75 20 77  hing else thru w
cb50: 69 74 68 6f 75 74 20 63 68 61 6e 67 65 20 6f 72  ithout change or
cb60: 20 61 6e 61 6c 79 73 69 73 2e 0a 20 20 2a 2f 0a   analysis..  */.
cb70: 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28    StartResponse(
cb80: 22 32 30 30 20 4f 4b 22 29 3b 0a 20 20 69 66 28  "200 OK");.  if(
cb90: 20 75 73 65 54 69 6d 65 6f 75 74 20 29 20 61 6c   useTimeout ) al
cba0: 61 72 6d 28 36 30 2a 35 29 3b 0a 20 20 69 66 28  arm(60*5);.  if(
cbb0: 20 73 65 65 6e 43 6f 6e 74 65 6e 74 4c 65 6e 67   seenContentLeng
cbc0: 74 68 20 29 7b 0a 20 20 20 20 6e 4f 75 74 20 2b  th ){.    nOut +
cbd0: 3d 20 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a  = printf("%s", z
cbe0: 4c 69 6e 65 29 3b 0a 20 20 20 20 77 68 69 6c 65  Line);.    while
cbf0: 28 20 28 63 6f 6e 74 65 6e 74 4c 65 6e 67 74 68  ( (contentLength
cc00: 2d 2d 29 3e 30 20 26 26 20 28 63 20 3d 20 67 65  --)>0 && (c = ge
cc10: 74 63 28 69 6e 29 29 21 3d 45 4f 46 20 29 7b 0a  tc(in))!=EOF ){.
cc20: 20 20 20 20 20 20 70 75 74 63 28 63 2c 73 74 64        putc(c,std
cc30: 6f 75 74 29 3b 0a 20 20 20 20 20 20 6e 4f 75 74  out);.      nOut
cc40: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ++;.    }.  }els
cc50: 65 7b 0a 20 20 20 20 6e 52 65 73 20 3d 20 30 3b  e{.    nRes = 0;
cc60: 0a 20 20 20 20 6e 4d 61 6c 6c 6f 63 20 3d 20 31  .    nMalloc = 1
cc70: 30 30 30 3b 0a 20 20 20 20 61 52 65 73 20 3d 20  000;.    aRes = 
cc80: 6d 61 6c 6c 6f 63 28 6e 4d 61 6c 6c 6f 63 2b 31  malloc(nMalloc+1
cc90: 29 3b 0a 20 20 20 20 69 66 28 20 61 52 65 73 3d  );.    if( aRes=
cca0: 3d 30 20 29 20 4d 61 6c 66 75 6e 63 74 69 6f 6e  =0 ) Malfunction
ccb0: 28 36 30 30 2c 22 4f 75 74 20 6f 66 20 6d 65 6d  (600,"Out of mem
ccc0: 6f 72 79 3a 20 25 64 20 62 79 74 65 73 22 2c 20  ory: %d bytes", 
ccd0: 6e 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 77 68  nMalloc);.    wh
cce0: 69 6c 65 28 20 28 63 20 3d 20 67 65 74 63 28 69  ile( (c = getc(i
ccf0: 6e 29 29 21 3d 45 4f 46 20 29 7b 0a 20 20 20 20  n))!=EOF ){.    
cd00: 20 20 69 66 28 20 6e 52 65 73 3e 3d 6e 4d 61 6c    if( nRes>=nMal
cd10: 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  loc ){.        n
cd20: 4d 61 6c 6c 6f 63 20 3d 20 6e 4d 61 6c 6c 6f 63  Malloc = nMalloc
cd30: 2a 32 3b 0a 20 20 20 20 20 20 20 20 61 52 65 73  *2;.        aRes
cd40: 20 3d 20 72 65 61 6c 6c 6f 63 28 61 52 65 73 2c   = realloc(aRes,
cd50: 20 6e 4d 61 6c 6c 6f 63 2b 31 29 3b 0a 20 20 20   nMalloc+1);.   
cd60: 20 20 20 20 20 69 66 28 20 61 52 65 73 3d 3d 30       if( aRes==0
cd70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 4d   ){.           M
cd80: 61 6c 66 75 6e 63 74 69 6f 6e 28 36 31 30 2c 20  alfunction(610, 
cd90: 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 3a 20  "Out of memory: 
cda0: 25 64 20 62 79 74 65 73 22 2c 20 6e 4d 61 6c 6c  %d bytes", nMall
cdb0: 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  oc);.        }. 
cdc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 52 65       }.      aRe
cdd0: 73 5b 6e 52 65 73 2b 2b 5d 20 3d 20 63 3b 0a 20  s[nRes++] = c;. 
cde0: 20 20 20 7d 0a 20 20 20 20 61 52 65 73 5b 6e 52     }.    aRes[nR
cdf0: 65 73 5d 20 3d 20 30 3b 0a 20 20 20 20 6e 4f 75  es] = 0;.    nOu
ce00: 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e  t += printf("Con
ce10: 74 65 6e 74 2d 6c 65 6e 67 74 68 3a 20 25 64 5c  tent-length: %d\
ce20: 72 5c 6e 5c 72 5c 6e 25 73 22 2c 20 28 69 6e 74  r\n\r\n%s", (int
ce30: 29 6e 52 65 73 2c 20 61 52 65 73 29 3b 0a 20 20  )nRes, aRes);.  
ce40: 20 20 66 72 65 65 28 61 52 65 73 29 3b 0a 20 20    free(aRes);.  
ce50: 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a  }.  fclose(in);.
ce60: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 6e 64 20 61 6e  }../*.** Send an
ce70: 20 53 43 47 49 20 72 65 71 75 65 73 74 20 74 6f   SCGI request to
ce80: 20 61 20 68 6f 73 74 20 69 64 65 6e 74 69 66 69   a host identifi
ce90: 65 64 20 62 79 20 7a 46 69 6c 65 20 61 6e 64 20  ed by zFile and 
cea0: 70 72 6f 63 65 73 73 20 74 68 65 0a 2a 2a 20 72  process the.** r
ceb0: 65 70 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eply..*/.static 
cec0: 76 6f 69 64 20 53 65 6e 64 53 63 67 69 52 65 71  void SendScgiReq
ced0: 75 65 73 74 28 63 6f 6e 73 74 20 63 68 61 72 20  uest(const char 
cee0: 2a 7a 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68  *zFile, const ch
cef0: 61 72 20 2a 7a 53 63 72 69 70 74 29 7b 0a 20 20  ar *zScript){.  
cf00: 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 46 49 4c 45  FILE *in;.  FILE
cf10: 20 2a 73 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a   *s;.  char *z;.
cf20: 20 20 63 68 61 72 20 2a 7a 48 6f 73 74 3b 0a 20    char *zHost;. 
cf30: 20 63 68 61 72 20 2a 7a 50 6f 72 74 20 3d 20 30   char *zPort = 0
cf40: 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 6c 69 67  ;.  char *zRelig
cf50: 68 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  ht = 0;.  char *
cf60: 7a 46 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  zFallback = 0;. 
cf70: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
cf80: 53 6f 63 6b 65 74 20 3d 20 2d 31 3b 0a 20 20 73  Socket = -1;.  s
cf90: 74 72 75 63 74 20 61 64 64 72 69 6e 66 6f 20 68  truct addrinfo h
cfa0: 69 6e 74 73 3b 0a 20 20 73 74 72 75 63 74 20 61  ints;.  struct a
cfb0: 64 64 72 69 6e 66 6f 20 2a 61 69 20 3d 20 30 3b  ddrinfo *ai = 0;
cfc0: 0a 20 20 73 74 72 75 63 74 20 61 64 64 72 69 6e  .  struct addrin
cfd0: 66 6f 20 2a 70 3b 0a 20 20 63 68 61 72 20 2a 7a  fo *p;.  char *z
cfe0: 48 64 72 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 48  Hdr;.  size_t nH
cff0: 64 72 20 3d 20 30 3b 0a 20 20 73 69 7a 65 5f 74  dr = 0;.  size_t
d000: 20 6e 48 64 72 41 6c 6c 6f 63 3b 0a 20 20 69 6e   nHdrAlloc;.  in
d010: 74 20 69 3b 0a 20 20 63 68 61 72 20 7a 4c 69 6e  t i;.  char zLin
d020: 65 5b 31 30 30 30 5d 3b 0a 20 20 63 68 61 72 20  e[1000];.  char 
d030: 7a 45 78 74 72 61 5b 31 30 30 30 5d 3b 0a 20 20  zExtra[1000];.  
d040: 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65  in = fopen(zFile
d050: 2c 20 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69  , "rb");.  if( i
d060: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 4d 61 6c 66  n==0 ){.    Malf
d070: 75 6e 63 74 69 6f 6e 28 37 30 30 2c 20 22 63 61  unction(700, "ca
d080: 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22  nnot open \"%s\"
d090: 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 7d  \n", zFile);.  }
d0a0: 0a 20 20 69 66 28 20 66 67 65 74 73 28 7a 4c 69  .  if( fgets(zLi
d0b0: 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65  ne, sizeof(zLine
d0c0: 29 2d 31 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20  )-1, in)==0 ){. 
d0d0: 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 37     Malfunction(7
d0e0: 30 31 2c 20 22 63 61 6e 6e 6f 74 20 72 65 61 64  01, "cannot read
d0f0: 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c   \"%s\"\n", zFil
d100: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74  e);.  }.  if( st
d110: 72 6e 63 6d 70 28 7a 4c 69 6e 65 2c 22 53 43 47  rncmp(zLine,"SCG
d120: 49 20 22 2c 35 29 21 3d 30 20 29 7b 0a 20 20 20  I ",5)!=0 ){.   
d130: 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 37 30 32   Malfunction(702
d140: 2c 20 22 6d 69 73 66 6f 72 6d 61 74 74 65 64 20  , "misformatted 
d150: 53 43 47 49 20 73 70 65 63 20 5c 22 25 73 5c 22  SCGI spec \"%s\"
d160: 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 7d  \n", zFile);.  }
d170: 0a 20 20 7a 20 3d 20 7a 4c 69 6e 65 2b 35 3b 0a  .  z = zLine+5;.
d180: 20 20 7a 48 6f 73 74 20 3d 20 47 65 74 46 69 72    zHost = GetFir
d190: 73 74 45 6c 65 6d 65 6e 74 28 7a 2c 26 7a 29 3b  stElement(z,&z);
d1a0: 0a 20 20 7a 50 6f 72 74 20 3d 20 47 65 74 46 69  .  zPort = GetFi
d1b0: 72 73 74 45 6c 65 6d 65 6e 74 28 7a 2c 30 29 3b  rstElement(z,0);
d1c0: 0a 20 20 69 66 28 20 7a 48 6f 73 74 3d 3d 30 20  .  if( zHost==0 
d1d0: 7c 7c 20 7a 48 6f 73 74 5b 30 5d 3d 3d 30 20 7c  || zHost[0]==0 |
d1e0: 7c 20 7a 50 6f 72 74 3d 3d 30 20 7c 7c 20 7a 50  | zPort==0 || zP
d1f0: 6f 72 74 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20  ort[0]==0 ){.   
d200: 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 37 30 33   Malfunction(703
d210: 2c 20 22 6d 69 73 66 6f 72 6d 61 74 74 65 64 20  , "misformatted 
d220: 53 43 47 49 20 73 70 65 63 20 5c 22 25 73 5c 22  SCGI spec \"%s\"
d230: 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 7d  \n", zFile);.  }
d240: 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74 73 28  .  while( fgets(
d250: 7a 45 78 74 72 61 2c 20 73 69 7a 65 6f 66 28 7a  zExtra, sizeof(z
d260: 45 78 74 72 61 29 2d 31 2c 20 69 6e 29 20 29 7b  Extra)-1, in) ){
d270: 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6d 64 20  .    char *zCmd 
d280: 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e  = GetFirstElemen
d290: 74 28 7a 45 78 74 72 61 2c 26 7a 29 3b 0a 20 20  t(zExtra,&z);.  
d2a0: 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20    if( zCmd==0 ) 
d2b0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
d2c0: 28 20 7a 43 6d 64 5b 30 5d 3d 3d 27 23 27 20 29  ( zCmd[0]=='#' )
d2d0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 52   continue;.    R
d2e0: 65 6d 6f 76 65 4e 65 77 6c 69 6e 65 28 7a 29 3b  emoveNewline(z);
d2f0: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
d300: 7a 43 6d 64 2c 20 22 72 65 6c 69 67 68 74 3a 22  zCmd, "relight:"
d310: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72  )==0 ){.      fr
d320: 65 65 28 7a 52 65 6c 69 67 68 74 29 3b 0a 20 20  ee(zRelight);.  
d330: 20 20 20 20 7a 52 65 6c 69 67 68 74 20 3d 20 53      zRelight = S
d340: 74 72 44 75 70 28 7a 29 3b 0a 20 20 20 20 20 20  trDup(z);.      
d350: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
d360: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
d370: 43 6d 64 2c 20 22 66 61 6c 6c 62 61 63 6b 3a 22  Cmd, "fallback:"
d380: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72  )==0 ){.      fr
d390: 65 65 28 7a 46 61 6c 6c 62 61 63 6b 29 3b 0a 20  ee(zFallback);. 
d3a0: 20 20 20 20 20 7a 46 61 6c 6c 62 61 63 6b 20 3d       zFallback =
d3b0: 20 53 74 72 44 75 70 28 7a 29 3b 0a 20 20 20 20   StrDup(z);.    
d3c0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
d3d0: 7d 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f  }.    Malfunctio
d3e0: 6e 28 37 30 34 2c 20 22 75 6e 72 65 63 6f 67 6e  n(704, "unrecogn
d3f0: 69 7a 65 64 20 6c 69 6e 65 20 69 6e 20 53 43 47  ized line in SCG
d400: 49 20 73 70 65 63 3a 20 5c 22 25 73 20 25 73 5c  I spec: \"%s %s\
d410: 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  "\n",.          
d420: 20 20 20 20 20 20 7a 43 6d 64 2c 20 7a 20 3f 20        zCmd, z ? 
d430: 7a 20 3a 20 22 22 29 3b 0a 20 20 7d 0a 20 20 66  z : "");.  }.  f
d440: 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 6d 65 6d  close(in);.  mem
d450: 73 65 74 28 26 68 69 6e 74 73 2c 20 30 2c 20 73  set(&hints, 0, s
d460: 69 7a 65 6f 66 28 73 74 72 75 63 74 20 61 64 64  izeof(struct add
d470: 72 69 6e 66 6f 29 29 3b 0a 20 20 68 69 6e 74 73  rinfo));.  hints
d480: 2e 61 69 5f 66 61 6d 69 6c 79 20 3d 20 41 46 5f  .ai_family = AF_
d490: 55 4e 53 50 45 43 3b 0a 20 20 68 69 6e 74 73 2e  UNSPEC;.  hints.
d4a0: 61 69 5f 73 6f 63 6b 74 79 70 65 20 3d 20 53 4f  ai_socktype = SO
d4b0: 43 4b 5f 53 54 52 45 41 4d 3b 0a 20 20 68 69 6e  CK_STREAM;.  hin
d4c0: 74 73 2e 61 69 5f 70 72 6f 74 6f 63 6f 6c 20 3d  ts.ai_protocol =
d4d0: 20 49 50 50 52 4f 54 4f 5f 54 43 50 3b 0a 20 20   IPPROTO_TCP;.  
d4e0: 72 63 20 3d 20 67 65 74 61 64 64 72 69 6e 66 6f  rc = getaddrinfo
d4f0: 28 7a 48 6f 73 74 2c 7a 50 6f 72 74 2c 26 68 69  (zHost,zPort,&hi
d500: 6e 74 73 2c 26 61 69 29 3b 0a 20 20 69 66 28 20  nts,&ai);.  if( 
d510: 72 63 20 29 7b 0a 20 20 20 20 4d 61 6c 66 75 6e  rc ){.    Malfun
d520: 63 74 69 6f 6e 28 37 30 34 2c 20 22 63 61 6e 6e  ction(704, "cann
d530: 6f 74 20 72 65 73 6f 6c 76 65 20 53 43 47 49 20  ot resolve SCGI 
d540: 73 65 72 76 65 72 20 6e 61 6d 65 20 25 73 3a 25  server name %s:%
d550: 73 5c 6e 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  s\n%s\n",.      
d560: 20 20 20 20 20 20 20 20 20 20 7a 48 6f 73 74 2c            zHost,
d570: 20 7a 50 6f 72 74 2c 20 67 61 69 5f 73 74 72 65   zPort, gai_stre
d580: 72 72 6f 72 28 72 63 29 29 3b 0a 20 20 7d 0a 20  rror(rc));.  }. 
d590: 20 77 68 69 6c 65 28 31 29 7b 20 20 2f 2a 20 45   while(1){  /* E
d5a0: 78 69 74 20 76 69 61 20 62 72 65 61 6b 20 2a 2f  xit via break */
d5b0: 0a 20 20 20 20 66 6f 72 28 70 3d 61 69 3b 20 70  .    for(p=ai; p
d5c0: 3b 20 70 3d 70 2d 3e 61 69 5f 6e 65 78 74 29 7b  ; p=p->ai_next){
d5d0: 0a 20 20 20 20 20 20 69 53 6f 63 6b 65 74 20 3d  .      iSocket =
d5e0: 20 73 6f 63 6b 65 74 28 70 2d 3e 61 69 5f 66 61   socket(p->ai_fa
d5f0: 6d 69 6c 79 2c 20 70 2d 3e 61 69 5f 73 6f 63 6b  mily, p->ai_sock
d600: 74 79 70 65 2c 20 70 2d 3e 61 69 5f 70 72 6f 74  type, p->ai_prot
d610: 6f 63 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  ocol);.      if(
d620: 20 69 53 6f 63 6b 65 74 3c 30 20 29 20 63 6f 6e   iSocket<0 ) con
d630: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
d640: 20 63 6f 6e 6e 65 63 74 28 69 53 6f 63 6b 65 74   connect(iSocket
d650: 2c 70 2d 3e 61 69 5f 61 64 64 72 2c 70 2d 3e 61  ,p->ai_addr,p->a
d660: 69 5f 61 64 64 72 6c 65 6e 29 3e 3d 30 20 29 20  i_addrlen)>=0 ) 
d670: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 6c 6f  break;.      clo
d680: 73 65 28 69 53 6f 63 6b 65 74 29 3b 0a 20 20 20  se(iSocket);.   
d690: 20 7d 0a 20 20 20 20 69 66 28 20 69 53 6f 63 6b   }.    if( iSock
d6a0: 65 74 3c 30 20 7c 7c 20 28 73 20 3d 20 66 64 6f  et<0 || (s = fdo
d6b0: 70 65 6e 28 69 53 6f 63 6b 65 74 2c 22 72 2b 22  pen(iSocket,"r+"
d6c0: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ))==0 ){.      i
d6d0: 66 28 20 69 53 6f 63 6b 65 74 3e 3d 30 20 29 20  f( iSocket>=0 ) 
d6e0: 63 6c 6f 73 65 28 69 53 6f 63 6b 65 74 29 3b 0a  close(iSocket);.
d6f0: 20 20 20 20 20 20 69 66 28 20 7a 52 65 6c 69 67        if( zRelig
d700: 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ht ){.        rc
d710: 20 3d 20 73 79 73 74 65 6d 28 7a 52 65 6c 69 67   = system(zRelig
d720: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ht);.        if(
d730: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
d740: 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 37 32 31   Malfunction(721
d750: 2c 22 52 65 6c 69 67 68 74 20 66 61 69 6c 65 64  ,"Relight failed
d760: 20 77 69 74 68 20 25 64 3a 20 5c 22 25 73 5c 22   with %d: \"%s\"
d770: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
d780: 20 20 20 20 20 20 20 20 20 20 20 72 63 2c 20 7a             rc, z
d790: 52 65 6c 69 67 68 74 29 3b 0a 20 20 20 20 20 20  Relight);.      
d7a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 66 72 65 65    }.        free
d7b0: 28 7a 52 65 6c 69 67 68 74 29 3b 0a 20 20 20 20  (zRelight);.    
d7c0: 20 20 20 20 7a 52 65 6c 69 67 68 74 20 3d 20 30      zRelight = 0
d7d0: 3b 0a 20 20 20 20 20 20 20 20 73 6c 65 65 70 28  ;.        sleep(
d7e0: 31 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  1);.        cont
d7f0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
d800: 20 20 20 20 69 66 28 20 7a 46 61 6c 6c 62 61 63      if( zFallbac
d810: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  k ){.        str
d820: 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66  uct stat statbuf
d830: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63  ;.        int rc
d840: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
d850: 28 26 73 74 61 74 62 75 66 2c 20 30 2c 20 73 69  (&statbuf, 0, si
d860: 7a 65 6f 66 28 73 74 61 74 62 75 66 29 29 3b 0a  zeof(statbuf));.
d870: 20 20 20 20 20 20 20 20 69 66 28 20 63 68 64 69          if( chdi
d880: 72 28 7a 44 69 72 29 20 29 7b 0a 20 20 20 20 20  r(zDir) ){.     
d890: 20 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 31       char zBuf[1
d8a0: 30 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  000];.          
d8b0: 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 37 32 30 2c  Malfunction(720,
d8c0: 20 2f 2a 20 4c 4f 47 3a 20 63 68 64 69 72 28 29   /* LOG: chdir()
d8d0: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
d8e0: 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f            "canno
d8f0: 74 20 63 68 64 69 72 20 74 6f 20 5b 25 73 5d 20  t chdir to [%s] 
d900: 66 72 6f 6d 20 5b 25 73 5d 22 2c 20 0a 20 20 20  from [%s]", .   
d910: 20 20 20 20 20 20 20 20 20 20 20 20 7a 44 69 72              zDir
d920: 2c 20 67 65 74 63 77 64 28 7a 42 75 66 2c 39 39  , getcwd(zBuf,99
d930: 39 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  9));.        }. 
d940: 20 20 20 20 20 20 20 72 63 20 3d 20 73 74 61 74         rc = stat
d950: 28 7a 46 61 6c 6c 62 61 63 6b 2c 20 26 73 74 61  (zFallback, &sta
d960: 74 62 75 66 29 3b 0a 20 20 20 20 20 20 20 20 69  tbuf);.        i
d970: 66 28 20 72 63 3d 3d 30 20 26 26 20 53 5f 49 53  f( rc==0 && S_IS
d980: 52 45 47 28 73 74 61 74 62 75 66 2e 73 74 5f 6d  REG(statbuf.st_m
d990: 6f 64 65 29 20 26 26 20 61 63 63 65 73 73 28 7a  ode) && access(z
d9a0: 46 61 6c 6c 62 61 63 6b 2c 52 5f 4f 4b 29 3d 3d  Fallback,R_OK)==
d9b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  0 ){.          c
d9c0: 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d  loseConnection =
d9d0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   1;.          rc
d9e0: 20 3d 20 53 65 6e 64 46 69 6c 65 28 7a 46 61 6c   = SendFile(zFal
d9f0: 6c 62 61 63 6b 2c 20 28 69 6e 74 29 73 74 72 6c  lback, (int)strl
da00: 65 6e 28 7a 46 61 6c 6c 62 61 63 6b 29 2c 20 26  en(zFallback), &
da10: 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20 20 20  statbuf);.      
da20: 20 20 20 20 66 72 65 65 28 7a 46 61 6c 6c 62 61      free(zFallba
da30: 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65  ck);.          e
da40: 78 69 74 28 30 29 3b 0a 20 20 20 20 20 20 20 20  xit(0);.        
da50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
da60: 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 37 30 36   Malfunction(706
da70: 2c 20 22 62 61 64 20 66 61 6c 6c 62 61 63 6b 20  , "bad fallback 
da80: 66 69 6c 65 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c  file: \"%s\"\n",
da90: 20 7a 46 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20   zFallback);.   
daa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
dab0: 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e       Malfunction
dac0: 28 37 30 37 2c 20 22 63 61 6e 6e 6f 74 20 6f 70  (707, "cannot op
dad0: 65 6e 20 73 6f 63 6b 65 74 20 74 6f 20 53 43 47  en socket to SCG
dae0: 49 20 73 65 72 76 65 72 20 25 73 5c 6e 22 2c 0a  I server %s\n",.
daf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db00: 20 20 7a 53 63 72 69 70 74 29 3b 0a 20 20 20 20    zScript);.    
db10: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
db20: 0a 0a 20 20 6e 48 64 72 41 6c 6c 6f 63 20 3d 20  ..  nHdrAlloc = 
db30: 30 3b 0a 20 20 7a 48 64 72 20 3d 20 30 3b 0a 20  0;.  zHdr = 0;. 
db40: 20 69 66 28 20 7a 43 6f 6e 74 65 6e 74 4c 65 6e   if( zContentLen
db50: 67 74 68 3d 3d 30 20 29 20 7a 43 6f 6e 74 65 6e  gth==0 ) zConten
db60: 74 4c 65 6e 67 74 68 20 3d 20 22 30 22 3b 0a 20  tLength = "0";. 
db70: 20 7a 53 63 67 69 20 3d 20 22 31 22 3b 0a 20 20   zScgi = "1";.  
db80: 66 6f 72 28 69 3d 30 3b 20 69 3c 28 69 6e 74 29  for(i=0; i<(int)
db90: 28 73 69 7a 65 6f 66 28 63 67 69 65 6e 76 29 2f  (sizeof(cgienv)/
dba0: 73 69 7a 65 6f 66 28 63 67 69 65 6e 76 5b 30 5d  sizeof(cgienv[0]
dbb0: 29 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  )); i++){.    in
dbc0: 74 20 6e 31 2c 20 6e 32 3b 0a 20 20 20 20 69 66  t n1, n2;.    if
dbd0: 28 20 63 67 69 65 6e 76 5b 69 5d 2e 70 7a 45 6e  ( cgienv[i].pzEn
dbe0: 76 56 61 6c 75 65 5b 30 5d 3d 3d 30 20 29 20 63  vValue[0]==0 ) c
dbf0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 31 20  ontinue;.    n1 
dc00: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 63 67  = (int)strlen(cg
dc10: 69 65 6e 76 5b 69 5d 2e 7a 45 6e 76 4e 61 6d 65  ienv[i].zEnvName
dc20: 29 3b 0a 20 20 20 20 6e 32 20 3d 20 28 69 6e 74  );.    n2 = (int
dc30: 29 73 74 72 6c 65 6e 28 2a 63 67 69 65 6e 76 5b  )strlen(*cgienv[
dc40: 69 5d 2e 70 7a 45 6e 76 56 61 6c 75 65 29 3b 0a  i].pzEnvValue);.
dc50: 20 20 20 20 69 66 28 20 6e 31 2b 6e 32 2b 32 2b      if( n1+n2+2+
dc60: 6e 48 64 72 20 3e 3d 20 6e 48 64 72 41 6c 6c 6f  nHdr >= nHdrAllo
dc70: 63 20 29 7b 0a 20 20 20 20 20 20 6e 48 64 72 41  c ){.      nHdrA
dc80: 6c 6c 6f 63 20 3d 20 6e 48 64 72 20 2b 20 6e 31  lloc = nHdr + n1
dc90: 20 2b 20 6e 32 20 2b 20 31 30 30 30 3b 0a 20 20   + n2 + 1000;.  
dca0: 20 20 20 20 7a 48 64 72 20 3d 20 72 65 61 6c 6c      zHdr = reall
dcb0: 6f 63 28 7a 48 64 72 2c 20 6e 48 64 72 41 6c 6c  oc(zHdr, nHdrAll
dcc0: 6f 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  oc);.      if( z
dcd0: 48 64 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Hdr==0 ){.      
dce0: 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 37 30    Malfunction(70
dcf0: 36 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  6, "out of memor
dd00: 79 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  y");.      }.   
dd10: 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48   }.    memcpy(zH
dd20: 64 72 2b 6e 48 64 72 2c 20 63 67 69 65 6e 76 5b  dr+nHdr, cgienv[
dd30: 69 5d 2e 7a 45 6e 76 4e 61 6d 65 2c 20 6e 31 29  i].zEnvName, n1)
dd40: 3b 0a 20 20 20 20 6e 48 64 72 20 2b 3d 20 6e 31  ;.    nHdr += n1
dd50: 3b 0a 20 20 20 20 7a 48 64 72 5b 6e 48 64 72 2b  ;.    zHdr[nHdr+
dd60: 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 63  +] = 0;.    memc
dd70: 70 79 28 7a 48 64 72 2b 6e 48 64 72 2c 20 2a 63  py(zHdr+nHdr, *c
dd80: 67 69 65 6e 76 5b 69 5d 2e 70 7a 45 6e 76 56 61  gienv[i].pzEnvVa
dd90: 6c 75 65 2c 20 6e 32 29 3b 0a 20 20 20 20 6e 48  lue, n2);.    nH
dda0: 64 72 20 2b 3d 20 6e 32 3b 0a 20 20 20 20 7a 48  dr += n2;.    zH
ddb0: 64 72 5b 6e 48 64 72 2b 2b 5d 20 3d 20 30 3b 0a  dr[nHdr++] = 0;.
ddc0: 20 20 7d 0a 20 20 7a 53 63 67 69 20 3d 20 30 3b    }.  zScgi = 0;
ddd0: 0a 20 20 66 70 72 69 6e 74 66 28 73 2c 22 25 64  .  fprintf(s,"%d
dde0: 3a 22 2c 28 69 6e 74 29 6e 48 64 72 29 3b 0a 20  :",(int)nHdr);. 
ddf0: 20 66 77 72 69 74 65 28 7a 48 64 72 2c 20 31 2c   fwrite(zHdr, 1,
de00: 20 6e 48 64 72 2c 20 73 29 3b 0a 20 20 66 70 72   nHdr, s);.  fpr
de10: 69 6e 74 66 28 73 2c 22 2c 22 29 3b 0a 20 20 66  intf(s,",");.  f
de20: 72 65 65 28 7a 48 64 72 29 3b 0a 20 20 69 66 28  ree(zHdr);.  if(
de30: 20 7a 4d 65 74 68 6f 64 5b 30 5d 3d 3d 27 50 27   zMethod[0]=='P'
de40: 0a 20 20 20 26 26 20 61 74 6f 69 28 7a 43 6f 6e  .   && atoi(zCon
de50: 74 65 6e 74 4c 65 6e 67 74 68 29 3e 30 20 0a 20  tentLength)>0 . 
de60: 20 20 26 26 20 28 69 6e 20 3d 20 66 6f 70 65 6e    && (in = fopen
de70: 28 7a 54 6d 70 4e 61 6d 2c 22 72 22 29 29 21 3d  (zTmpNam,"r"))!=
de80: 30 20 29 7b 0a 20 20 20 20 73 69 7a 65 5f 74 20  0 ){.    size_t 
de90: 6e 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 6e  n;.    while( (n
dea0: 20 3d 20 66 72 65 61 64 28 7a 4c 69 6e 65 2c 31   = fread(zLine,1
deb0: 2c 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 69  ,sizeof(zLine),i
dec0: 6e 29 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 66  n))>0 ){.      f
ded0: 77 72 69 74 65 28 7a 4c 69 6e 65 2c 20 31 2c 20  write(zLine, 1, 
dee0: 6e 2c 20 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  n, s);.    }.   
def0: 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 7d   fclose(in);.  }
df00: 0a 20 20 66 66 6c 75 73 68 28 73 29 3b 0a 20 20  .  fflush(s);.  
df10: 43 67 69 48 61 6e 64 6c 65 52 65 70 6c 79 28 73  CgiHandleReply(s
df20: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
df30: 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73   routine process
df40: 65 73 20 61 20 73 69 6e 67 6c 65 20 48 54 54 50  es a single HTTP
df50: 20 72 65 71 75 65 73 74 20 6f 6e 20 73 74 61 6e   request on stan
df60: 64 61 72 64 20 69 6e 70 75 74 20 61 6e 64 0a 2a  dard input and.*
df70: 2a 20 73 65 6e 64 73 20 74 68 65 20 72 65 70 6c  * sends the repl
df80: 79 20 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75  y to standard ou
df90: 74 70 75 74 2e 20 20 49 66 20 74 68 65 20 61 72  tput.  If the ar
dfa0: 67 75 6d 65 6e 74 20 69 73 20 31 20 69 74 20 6d  gument is 1 it m
dfb0: 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 77 65 20  eans.** that we 
dfc0: 61 72 65 20 73 68 6f 75 6c 64 20 63 6c 6f 73 65  are should close
dfd0: 20 74 68 65 20 73 6f 63 6b 65 74 20 77 69 74 68   the socket with
dfe0: 6f 75 74 20 70 72 6f 63 65 73 73 69 6e 67 20 61  out processing a
dff0: 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 48 54 54  dditional.** HTT
e000: 50 20 72 65 71 75 65 73 74 73 20 61 66 74 65 72  P requests after
e010: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 71   the current req
e020: 75 65 73 74 20 66 69 6e 69 73 68 65 73 2e 20 20  uest finishes.  
e030: 30 20 6d 65 61 6e 73 20 77 65 20 61 72 65 0a 2a  0 means we are.*
e040: 2a 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6b 65 65  * allowed to kee
e050: 70 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  p the connection
e060: 20 6f 70 65 6e 20 61 6e 64 20 74 6f 20 70 72 6f   open and to pro
e070: 63 65 73 73 20 61 64 64 69 74 69 6f 6e 61 6c 20  cess additional 
e080: 72 65 71 75 65 73 74 73 2e 0a 2a 2a 20 54 68 69  requests..** Thi
e090: 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 63 68  s routine may ch
e0a0: 6f 6f 73 65 20 74 6f 20 63 6c 6f 73 65 20 74 68  oose to close th
e0b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 65 76 65  e connection eve
e0c0: 6e 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e  n if the argumen
e0d0: 74 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2a 20 0a 2a  t.** is 0..** .*
e0e0: 2a 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  * If the connect
e0f0: 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 6c  ion should be cl
e100: 6f 73 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  osed, this routi
e110: 6e 65 20 63 61 6c 6c 73 20 65 78 69 74 28 29 20  ne calls exit() 
e120: 61 6e 64 0a 2a 2a 20 74 68 75 73 20 6e 65 76 65  and.** thus neve
e130: 72 20 72 65 74 75 72 6e 73 2e 20 20 49 66 20 74  r returns.  If t
e140: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
e150: 20 72 65 74 75 72 6e 20 69 74 20 6d 65 61 6e 73   return it means
e160: 20 74 68 61 74 20 61 6e 6f 74 68 65 72 0a 2a 2a   that another.**
e170: 20 48 54 54 50 20 72 65 71 75 65 73 74 20 6d 61   HTTP request ma
e180: 79 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20  y appear on the 
e190: 77 69 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 50 72  wire..*/.void Pr
e1a0: 6f 63 65 73 73 4f 6e 65 52 65 71 75 65 73 74 28  ocessOneRequest(
e1b0: 69 6e 74 20 66 6f 72 63 65 43 6c 6f 73 65 29 7b  int forceClose){
e1c0: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6a 30 2c  .  int i, j, j0,
e1d0: 20 63 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20   c;.  char *z;  
e1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1f0: 2f 2a 20 55 73 65 64 20 74 6f 20 70 61 72 73 65  /* Used to parse
e200: 20 75 70 20 61 20 73 74 72 69 6e 67 20 2a 2f 0a   up a string */.
e210: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
e220: 61 74 62 75 66 3b 20 20 20 20 20 20 2f 2a 20 49  atbuf;      /* I
e230: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
e240: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
e250: 72 65 74 72 69 65 76 65 64 20 2a 2f 0a 20 20 46  retrieved */.  F
e260: 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20  ILE *in;        
e270: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
e280: 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 43 47 49  reading from CGI
e290: 20 73 63 72 69 70 74 73 20 2a 2f 0a 23 69 66 64   scripts */.#ifd
e2a0: 65 66 20 4c 4f 47 5f 48 45 41 44 45 52 0a 20 20  ef LOG_HEADER.  
e2b0: 46 49 4c 45 20 2a 68 64 72 4c 6f 67 20 3d 20 30  FILE *hdrLog = 0
e2c0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67  ;         /* Log
e2d0: 20 66 69 6c 65 20 66 6f 72 20 63 6f 6d 70 6c 65   file for comple
e2e0: 74 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e  te header conten
e2f0: 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68  t */.#endif.  ch
e300: 61 72 20 7a 4c 69 6e 65 5b 31 30 30 30 5d 3b 20  ar zLine[1000]; 
e310: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 75 66          /* A buf
e320: 66 65 72 20 66 6f 72 20 69 6e 70 75 74 20 6c 69  fer for input li
e330: 6e 65 73 20 6f 72 20 66 6f 72 6d 69 6e 67 20 6e  nes or forming n
e340: 61 6d 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68  ames */..  /* Ch
e350: 61 6e 67 65 20 64 69 72 65 63 74 6f 72 69 65 73  ange directories
e360: 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   to the root of 
e370: 74 68 65 20 48 54 54 50 20 66 69 6c 65 73 79 73  the HTTP filesys
e380: 74 65 6d 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  tem.  */.  if( c
e390: 68 64 69 72 28 7a 52 6f 6f 74 5b 30 5d 20 3f 20  hdir(zRoot[0] ? 
e3a0: 7a 52 6f 6f 74 20 3a 20 22 2f 22 29 21 3d 30 20  zRoot : "/")!=0 
e3b0: 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  ){.    char zBuf
e3c0: 5b 31 30 30 30 5d 3b 0a 20 20 20 20 4d 61 6c 66  [1000];.    Malf
e3d0: 75 6e 63 74 69 6f 6e 28 31 39 30 2c 20 20 20 2f  unction(190,   /
e3e0: 2a 20 4c 4f 47 3a 20 63 68 64 69 72 28 29 20 66  * LOG: chdir() f
e3f0: 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  ailed */.       
e400: 20 20 22 63 61 6e 6e 6f 74 20 63 68 64 69 72 20    "cannot chdir 
e410: 74 6f 20 5b 25 73 5d 20 66 72 6f 6d 20 5b 25 73  to [%s] from [%s
e420: 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 52 6f  ]",.         zRo
e430: 6f 74 2c 20 67 65 74 63 77 64 28 7a 42 75 66 2c  ot, getcwd(zBuf,
e440: 39 39 39 29 29 3b 0a 20 20 7d 0a 20 20 6e 52 65  999));.  }.  nRe
e450: 71 75 65 73 74 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20  quest++;..  /*. 
e460: 20 2a 2a 20 57 65 20 6d 75 73 74 20 72 65 63 65   ** We must rece
e470: 69 76 65 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  ive a complete h
e480: 65 61 64 65 72 20 77 69 74 68 69 6e 20 31 35 20  eader within 15 
e490: 73 65 63 6f 6e 64 73 0a 20 20 2a 2f 0a 20 20 73  seconds.  */.  s
e4a0: 69 67 6e 61 6c 28 53 49 47 41 4c 52 4d 2c 20 54  ignal(SIGALRM, T
e4b0: 69 6d 65 6f 75 74 29 3b 0a 20 20 73 69 67 6e 61  imeout);.  signa
e4c0: 6c 28 53 49 47 53 45 47 56 2c 20 54 69 6d 65 6f  l(SIGSEGV, Timeo
e4d0: 75 74 29 3b 0a 20 20 73 69 67 6e 61 6c 28 53 49  ut);.  signal(SI
e4e0: 47 50 49 50 45 2c 20 54 69 6d 65 6f 75 74 29 3b  GPIPE, Timeout);
e4f0: 0a 20 20 69 66 28 20 75 73 65 54 69 6d 65 6f 75  .  if( useTimeou
e500: 74 20 29 20 61 6c 61 72 6d 28 31 35 29 3b 0a 0a  t ) alarm(15);..
e510: 20 20 2f 2a 20 47 65 74 20 74 68 65 20 66 69 72    /* Get the fir
e520: 73 74 20 6c 69 6e 65 20 6f 66 20 74 68 65 20 72  st line of the r
e530: 65 71 75 65 73 74 20 61 6e 64 20 70 61 72 73 65  equest and parse
e540: 20 6f 75 74 20 74 68 65 0a 20 20 2a 2a 20 6d 65   out the.  ** me
e550: 74 68 6f 64 2c 20 74 68 65 20 73 63 72 69 70 74  thod, the script
e560: 20 61 6e 64 20 74 68 65 20 70 72 6f 74 6f 63 6f   and the protoco
e570: 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 66 67  l..  */.  if( fg
e580: 65 74 73 28 7a 4c 69 6e 65 2c 73 69 7a 65 6f 66  ets(zLine,sizeof
e590: 28 7a 4c 69 6e 65 29 2c 73 74 64 69 6e 29 3d 3d  (zLine),stdin)==
e5a0: 30 20 29 7b 0a 20 20 20 20 65 78 69 74 28 30 29  0 ){.    exit(0)
e5b0: 3b 0a 20 20 7d 0a 20 20 6f 6d 69 74 4c 6f 67 20  ;.  }.  omitLog 
e5c0: 3d 20 30 3b 0a 20 20 6e 49 6e 20 2b 3d 20 73 74  = 0;.  nIn += st
e5d0: 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a 0a 20 20  rlen(zLine);..  
e5e0: 2f 2a 20 50 61 72 73 65 20 74 68 65 20 66 69 72  /* Parse the fir
e5f0: 73 74 20 6c 69 6e 65 20 6f 66 20 74 68 65 20 48  st line of the H
e600: 54 54 50 20 72 65 71 75 65 73 74 20 2a 2f 0a 20  TTP request */. 
e610: 20 7a 4d 65 74 68 6f 64 20 3d 20 53 74 72 44 75   zMethod = StrDu
e620: 70 28 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e  p(GetFirstElemen
e630: 74 28 7a 4c 69 6e 65 2c 26 7a 29 29 3b 0a 20 20  t(zLine,&z));.  
e640: 7a 52 65 61 6c 53 63 72 69 70 74 20 3d 20 7a 53  zRealScript = zS
e650: 63 72 69 70 74 20 3d 20 53 74 72 44 75 70 28 47  cript = StrDup(G
e660: 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a  etFirstElement(z
e670: 2c 26 7a 29 29 3b 0a 20 20 7a 50 72 6f 74 6f 63  ,&z));.  zProtoc
e680: 6f 6c 20 3d 20 53 74 72 44 75 70 28 47 65 74 46  ol = StrDup(GetF
e690: 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a 2c 26 7a  irstElement(z,&z
e6a0: 29 29 3b 0a 20 20 69 66 28 20 7a 50 72 6f 74 6f  ));.  if( zProto
e6b0: 63 6f 6c 3d 3d 30 20 7c 7c 20 73 74 72 6e 63 6d  col==0 || strncm
e6c0: 70 28 7a 50 72 6f 74 6f 63 6f 6c 2c 22 48 54 54  p(zProtocol,"HTT
e6d0: 50 2f 22 2c 35 29 21 3d 30 20 7c 7c 20 73 74 72  P/",5)!=0 || str
e6e0: 6c 65 6e 28 7a 50 72 6f 74 6f 63 6f 6c 29 21 3d  len(zProtocol)!=
e6f0: 38 20 29 7b 0a 20 20 20 20 53 74 61 72 74 52 65  8 ){.    StartRe
e700: 73 70 6f 6e 73 65 28 22 34 30 30 20 42 61 64 20  sponse("400 Bad 
e710: 52 65 71 75 65 73 74 22 29 3b 0a 20 20 20 20 6e  Request");.    n
e720: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20  Out += printf(. 
e730: 20 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79       "Content-ty
e740: 70 65 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c 72  pe: text/plain\r
e750: 5c 6e 22 0a 20 20 20 20 20 20 22 5c 72 5c 6e 22  \n".      "\r\n"
e760: 0a 20 20 20 20 20 20 22 54 68 69 73 20 73 65 72  .      "This ser
e770: 76 65 72 20 64 6f 65 73 20 6e 6f 74 20 75 6e 64  ver does not und
e780: 65 72 73 74 61 6e 64 20 74 68 65 20 72 65 71 75  erstand the requ
e790: 65 73 74 65 64 20 70 72 6f 74 6f 63 6f 6c 5c 6e  ested protocol\n
e7a0: 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 4d 61 6b  ".    );.    Mak
e7b0: 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 32 30 30  eLogEntry(0, 200
e7c0: 29 3b 20 2f 2a 20 4c 4f 47 3a 20 62 61 64 20 70  ); /* LOG: bad p
e7d0: 72 6f 74 6f 63 6f 6c 20 69 6e 20 48 54 54 50 20  rotocol in HTTP 
e7e0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 65 78  header */.    ex
e7f0: 69 74 28 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  it(0);.  }.  if(
e800: 20 7a 53 63 72 69 70 74 5b 30 5d 3d 3d 30 20 29   zScript[0]==0 )
e810: 20 4e 6f 74 46 6f 75 6e 64 28 32 31 30 29 3b 20   NotFound(210); 
e820: 2f 2a 20 4c 4f 47 3a 20 45 6d 70 74 79 20 72 65  /* LOG: Empty re
e830: 71 75 65 73 74 20 55 52 49 20 2a 2f 0a 20 20 69  quest URI */.  i
e840: 66 28 20 66 6f 72 63 65 43 6c 6f 73 65 20 29 7b  f( forceClose ){
e850: 0a 20 20 20 20 63 6c 6f 73 65 43 6f 6e 6e 65 63  .    closeConnec
e860: 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  tion = 1;.  }els
e870: 65 20 69 66 28 20 7a 50 72 6f 74 6f 63 6f 6c 5b  e if( zProtocol[
e880: 35 5d 3c 27 31 27 20 7c 7c 20 7a 50 72 6f 74 6f  5]<'1' || zProto
e890: 63 6f 6c 5b 37 5d 3c 27 31 27 20 29 7b 0a 20 20  col[7]<'1' ){.  
e8a0: 20 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f    closeConnectio
e8b0: 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n = 1;.  }..  /*
e8c0: 20 54 68 69 73 20 76 65 72 79 20 73 69 6d 70 6c   This very simpl
e8d0: 65 20 73 65 72 76 65 72 20 6f 6e 6c 79 20 75 6e  e server only un
e8e0: 64 65 72 73 74 61 6e 64 73 20 74 68 65 20 47 45  derstands the GE
e8f0: 54 2c 20 50 4f 53 54 0a 20 20 2a 2a 20 61 6e 64  T, POST.  ** and
e900: 20 48 45 41 44 20 6d 65 74 68 6f 64 73 0a 20 20   HEAD methods.  
e910: 2a 2f 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  */.  if( strcmp(
e920: 7a 4d 65 74 68 6f 64 2c 22 47 45 54 22 29 21 3d  zMethod,"GET")!=
e930: 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 65 74  0 && strcmp(zMet
e940: 68 6f 64 2c 22 50 4f 53 54 22 29 21 3d 30 0a 20  hod,"POST")!=0. 
e950: 20 20 20 20 20 20 26 26 20 73 74 72 63 6d 70 28        && strcmp(
e960: 7a 4d 65 74 68 6f 64 2c 22 48 45 41 44 22 29 21  zMethod,"HEAD")!
e970: 3d 30 20 29 7b 0a 20 20 20 20 53 74 61 72 74 52  =0 ){.    StartR
e980: 65 73 70 6f 6e 73 65 28 22 35 30 31 20 4e 6f 74  esponse("501 Not
e990: 20 49 6d 70 6c 65 6d 65 6e 74 65 64 22 29 3b 0a   Implemented");.
e9a0: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
e9b0: 74 66 28 0a 20 20 20 20 20 20 22 43 6f 6e 74 65  tf(.      "Conte
e9c0: 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 70 6c  nt-type: text/pl
e9d0: 61 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 20 20 22  ain\r\n".      "
e9e0: 5c 72 5c 6e 22 0a 20 20 20 20 20 20 22 54 68 65  \r\n".      "The
e9f0: 20 25 73 20 6d 65 74 68 6f 64 20 69 73 20 6e 6f   %s method is no
ea00: 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 6f 6e  t implemented on
ea10: 20 74 68 69 73 20 73 65 72 76 65 72 2e 5c 6e 22   this server.\n"
ea20: 2c 0a 20 20 20 20 20 20 7a 4d 65 74 68 6f 64 29  ,.      zMethod)
ea30: 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74  ;.    MakeLogEnt
ea40: 72 79 28 30 2c 20 32 32 30 29 3b 20 2f 2a 20 4c  ry(0, 220); /* L
ea50: 4f 47 3a 20 55 6e 6b 6e 6f 77 6e 20 72 65 71 75  OG: Unknown requ
ea60: 65 73 74 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  est method */.  
ea70: 20 20 65 78 69 74 28 30 29 3b 0a 20 20 7d 0a 0a    exit(0);.  }..
ea80: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
ea90: 20 61 20 6c 6f 67 20 66 69 6c 65 20 28 69 66 20   a log file (if 
eaa0: 7a 4c 6f 67 46 69 6c 65 21 3d 30 29 20 61 6e 64  zLogFile!=0) and
eab0: 20 69 66 20 74 68 65 20 70 61 74 68 6e 61 6d 65   if the pathname
eac0: 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 66 69 72   in.  ** the fir
ead0: 73 74 20 6c 69 6e 65 20 6f 66 20 74 68 65 20 68  st line of the h
eae0: 74 74 70 20 72 65 71 75 65 73 74 20 63 6f 6e 74  ttp request cont
eaf0: 61 69 6e 73 20 74 68 65 20 6d 61 67 69 63 20 73  ains the magic s
eb00: 74 72 69 6e 67 0a 20 20 2a 2a 20 22 46 75 6c 6c  tring.  ** "Full
eb10: 48 65 61 64 65 72 4c 6f 67 22 20 74 68 65 6e 20  HeaderLog" then 
eb20: 77 72 69 74 65 20 74 68 65 20 63 6f 6d 70 6c 65  write the comple
eb30: 74 65 20 68 65 61 64 65 72 20 74 65 78 74 20 69  te header text i
eb40: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c  nto the.  ** fil
eb50: 65 20 25 73 28 7a 4c 6f 67 46 69 6c 65 29 2d 68  e %s(zLogFile)-h
eb60: 64 72 2e 20 20 4f 76 65 72 77 72 69 74 65 20 74  dr.  Overwrite t
eb70: 68 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  he file.  This i
eb80: 73 20 66 6f 72 20 70 72 6f 74 6f 63 6f 6c 0a 20  s for protocol. 
eb90: 20 2a 2a 20 64 65 62 75 67 67 69 6e 67 20 6f 6e   ** debugging on
eba0: 6c 79 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 65  ly and is only e
ebb0: 6e 61 62 6c 65 64 20 69 66 20 61 6c 74 68 74 74  nabled if althtt
ebc0: 70 64 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77  pd is compiled w
ebd0: 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 2d 44 4c  ith.  ** the -DL
ebe0: 4f 47 5f 48 45 41 44 45 52 3d 31 20 6f 70 74 69  OG_HEADER=1 opti
ebf0: 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  on..  */.#ifdef 
ec00: 4c 4f 47 5f 48 45 41 44 45 52 0a 20 20 69 66 28  LOG_HEADER.  if(
ec10: 20 7a 4c 6f 67 46 69 6c 65 0a 20 20 20 26 26 20   zLogFile.   && 
ec20: 73 74 72 73 74 72 28 7a 53 63 72 69 70 74 2c 22  strstr(zScript,"
ec30: 46 75 6c 6c 48 65 61 64 65 72 4c 6f 67 22 29 21  FullHeaderLog")!
ec40: 3d 30 0a 20 20 20 26 26 20 73 74 72 6c 65 6e 28  =0.   && strlen(
ec50: 7a 4c 6f 67 46 69 6c 65 29 3c 73 69 7a 65 6f 66  zLogFile)<sizeof
ec60: 28 7a 4c 69 6e 65 29 2d 35 30 0a 20 20 29 7b 0a  (zLine)-50.  ){.
ec70: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e      sprintf(zLin
ec80: 65 2c 20 22 25 73 2d 68 64 72 22 2c 20 7a 4c 6f  e, "%s-hdr", zLo
ec90: 67 46 69 6c 65 29 3b 0a 20 20 20 20 68 64 72 4c  gFile);.    hdrL
eca0: 6f 67 20 3d 20 66 6f 70 65 6e 28 7a 4c 69 6e 65  og = fopen(zLine
ecb0: 2c 20 22 77 62 22 29 3b 0a 20 20 7d 0a 23 65 6e  , "wb");.  }.#en
ecc0: 64 69 66 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 61  dif...  /* Get a
ecd0: 6c 6c 20 74 68 65 20 6f 70 74 69 6f 6e 61 6c 20  ll the optional 
ece0: 66 69 65 6c 64 73 20 74 68 61 74 20 66 6f 6c 6c  fields that foll
ecf0: 6f 77 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e  ow the first lin
ed00: 65 2e 0a 20 20 2a 2f 0a 20 20 7a 43 6f 6f 6b 69  e..  */.  zCooki
ed10: 65 20 3d 20 30 3b 0a 20 20 7a 41 75 74 68 54 79  e = 0;.  zAuthTy
ed20: 70 65 20 3d 20 30 3b 0a 20 20 7a 52 65 6d 6f 74  pe = 0;.  zRemot
ed30: 65 55 73 65 72 20 3d 20 30 3b 0a 20 20 7a 52 65  eUser = 0;.  zRe
ed40: 66 65 72 65 72 20 3d 20 30 3b 0a 20 20 7a 49 66  ferer = 0;.  zIf
ed50: 4e 6f 6e 65 4d 61 74 63 68 20 3d 20 30 3b 0a 20  NoneMatch = 0;. 
ed60: 20 7a 49 66 4d 6f 64 69 66 69 65 64 53 69 6e 63   zIfModifiedSinc
ed70: 65 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  e = 0;.  while( 
ed80: 66 67 65 74 73 28 7a 4c 69 6e 65 2c 73 69 7a 65  fgets(zLine,size
ed90: 6f 66 28 7a 4c 69 6e 65 29 2c 73 74 64 69 6e 29  of(zLine),stdin)
eda0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 46   ){.    char *zF
edb0: 69 65 6c 64 4e 61 6d 65 3b 0a 20 20 20 20 63 68  ieldName;.    ch
edc0: 61 72 20 2a 7a 56 61 6c 3b 0a 0a 23 69 66 64 65  ar *zVal;..#ifde
edd0: 66 20 4c 4f 47 5f 48 45 41 44 45 52 0a 20 20 20  f LOG_HEADER.   
ede0: 20 69 66 28 20 68 64 72 4c 6f 67 20 29 20 66 70   if( hdrLog ) fp
edf0: 72 69 6e 74 66 28 68 64 72 4c 6f 67 2c 20 22 25  rintf(hdrLog, "%
ee00: 73 22 2c 20 7a 4c 69 6e 65 29 3b 0a 23 65 6e 64  s", zLine);.#end
ee10: 69 66 0a 20 20 20 20 6e 49 6e 20 2b 3d 20 73 74  if.    nIn += st
ee20: 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20 20 20  rlen(zLine);.   
ee30: 20 7a 46 69 65 6c 64 4e 61 6d 65 20 3d 20 47 65   zFieldName = Ge
ee40: 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a 4c  tFirstElement(zL
ee50: 69 6e 65 2c 26 7a 56 61 6c 29 3b 0a 20 20 20 20  ine,&zVal);.    
ee60: 69 66 28 20 7a 46 69 65 6c 64 4e 61 6d 65 3d 3d  if( zFieldName==
ee70: 30 20 7c 7c 20 2a 7a 46 69 65 6c 64 4e 61 6d 65  0 || *zFieldName
ee80: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
ee90: 20 52 65 6d 6f 76 65 4e 65 77 6c 69 6e 65 28 7a   RemoveNewline(z
eea0: 56 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 73 74  Val);.    if( st
eeb0: 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e  rcasecmp(zFieldN
eec0: 61 6d 65 2c 22 55 73 65 72 2d 41 67 65 6e 74 3a  ame,"User-Agent:
eed0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  ")==0 ){.      z
eee0: 41 67 65 6e 74 20 3d 20 53 74 72 44 75 70 28 7a  Agent = StrDup(z
eef0: 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Val);.    }else 
ef00: 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a  if( strcasecmp(z
ef10: 46 69 65 6c 64 4e 61 6d 65 2c 22 41 63 63 65 70  FieldName,"Accep
ef20: 74 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t:")==0 ){.     
ef30: 20 7a 41 63 63 65 70 74 20 3d 20 53 74 72 44 75   zAccept = StrDu
ef40: 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c  p(zVal);.    }el
ef50: 73 65 20 69 66 28 20 73 74 72 63 61 73 65 63 6d  se if( strcasecm
ef60: 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 41 63  p(zFieldName,"Ac
ef70: 63 65 70 74 2d 45 6e 63 6f 64 69 6e 67 3a 22 29  cept-Encoding:")
ef80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 41 63  ==0 ){.      zAc
ef90: 63 65 70 74 45 6e 63 6f 64 69 6e 67 20 3d 20 53  ceptEncoding = S
efa0: 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20  trDup(zVal);.   
efb0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 61   }else if( strca
efc0: 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65  secmp(zFieldName
efd0: 2c 22 43 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74 68  ,"Content-length
efe0: 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  :")==0 ){.      
eff0: 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 20 3d  zContentLength =
f000: 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20   StrDup(zVal);. 
f010: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
f020: 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61  casecmp(zFieldNa
f030: 6d 65 2c 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65  me,"Content-type
f040: 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  :")==0 ){.      
f050: 7a 43 6f 6e 74 65 6e 74 54 79 70 65 20 3d 20 53  zContentType = S
f060: 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20  trDup(zVal);.   
f070: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 61   }else if( strca
f080: 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65  secmp(zFieldName
f090: 2c 22 52 65 66 65 72 65 72 3a 22 29 3d 3d 30 20  ,"Referer:")==0 
f0a0: 29 7b 0a 20 20 20 20 20 20 7a 52 65 66 65 72 65  ){.      zRefere
f0b0: 72 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29  r = StrDup(zVal)
f0c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 73  ;.      if( strs
f0d0: 74 72 28 7a 56 61 6c 2c 20 22 64 65 76 69 64 73  tr(zVal, "devids
f0e0: 2e 6e 65 74 2f 22 29 21 3d 30 20 29 7b 20 7a 52  .net/")!=0 ){ zR
f0f0: 65 66 65 72 65 72 20 3d 20 22 64 65 76 69 64 73  eferer = "devids
f100: 2e 6e 65 74 2e 73 6d 75 74 22 3b 0a 20 20 20 20  .net.smut";.    
f110: 20 20 20 20 46 6f 72 62 69 64 64 65 6e 28 32 33      Forbidden(23
f120: 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 52 65 66 65  0); /* LOG: Refe
f130: 72 72 65 72 20 69 73 20 64 65 76 69 64 73 2e 6e  rrer is devids.n
f140: 65 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  et */.      }.  
f150: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
f160: 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d  asecmp(zFieldNam
f170: 65 2c 22 43 6f 6f 6b 69 65 3a 22 29 3d 3d 30 20  e,"Cookie:")==0 
f180: 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6f 6b 69 65  ){.      zCookie
f190: 20 3d 20 53 74 72 41 70 70 65 6e 64 28 7a 43 6f   = StrAppend(zCo
f1a0: 6f 6b 69 65 2c 22 3b 20 22 2c 7a 56 61 6c 29 3b  okie,"; ",zVal);
f1b0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
f1c0: 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64  trcasecmp(zField
f1d0: 4e 61 6d 65 2c 22 43 6f 6e 6e 65 63 74 69 6f 6e  Name,"Connection
f1e0: 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  :")==0 ){.      
f1f0: 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a  if( strcasecmp(z
f200: 56 61 6c 2c 22 63 6c 6f 73 65 22 29 3d 3d 30 20  Val,"close")==0 
f210: 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65  ){.        close
f220: 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 31 3b 0a  Connection = 1;.
f230: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f240: 21 66 6f 72 63 65 43 6c 6f 73 65 20 26 26 20 73  !forceClose && s
f250: 74 72 63 61 73 65 63 6d 70 28 7a 56 61 6c 2c 20  trcasecmp(zVal, 
f260: 22 6b 65 65 70 2d 61 6c 69 76 65 22 29 3d 3d 30  "keep-alive")==0
f270: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73   ){.        clos
f280: 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 30 3b  eConnection = 0;
f290: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
f2a0: 73 65 20 69 66 28 20 73 74 72 63 61 73 65 63 6d  se if( strcasecm
f2b0: 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 48 6f  p(zFieldName,"Ho
f2c0: 73 74 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  st:")==0 ){.    
f2d0: 20 20 69 6e 74 20 69 6e 53 71 75 61 72 65 20 3d    int inSquare =
f2e0: 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63   0;.      char c
f2f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 61 6e 69  ;.      if( sani
f300: 74 69 7a 65 53 74 72 69 6e 67 28 7a 56 61 6c 29  tizeString(zVal)
f310: 20 29 7b 0a 20 20 20 20 20 20 20 20 46 6f 72 62   ){.        Forb
f320: 69 64 64 65 6e 28 32 34 30 29 3b 20 20 2f 2a 20  idden(240);  /* 
f330: 4c 4f 47 3a 20 49 6c 6c 65 67 61 6c 20 63 6f 6e  LOG: Illegal con
f340: 74 65 6e 74 20 69 6e 20 48 4f 53 54 3a 20 70 61  tent in HOST: pa
f350: 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 20 20 20  rameter */.     
f360: 20 7d 0a 20 20 20 20 20 20 7a 48 74 74 70 48 6f   }.      zHttpHo
f370: 73 74 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c  st = StrDup(zVal
f380: 29 3b 0a 20 20 20 20 20 20 7a 53 65 72 76 65 72  );.      zServer
f390: 50 6f 72 74 20 3d 20 7a 53 65 72 76 65 72 4e 61  Port = zServerNa
f3a0: 6d 65 20 3d 20 53 74 72 44 75 70 28 7a 48 74 74  me = StrDup(zHtt
f3b0: 70 48 6f 73 74 29 3b 0a 20 20 20 20 20 20 77 68  pHost);.      wh
f3c0: 69 6c 65 28 20 7a 53 65 72 76 65 72 50 6f 72 74  ile( zServerPort
f3d0: 20 26 26 20 28 63 20 3d 20 2a 7a 53 65 72 76 65   && (c = *zServe
f3e0: 72 50 6f 72 74 29 21 3d 30 0a 20 20 20 20 20 20  rPort)!=0.      
f3f0: 20 20 20 20 20 20 20 20 26 26 20 28 63 21 3d 27          && (c!='
f400: 3a 27 20 7c 7c 20 69 6e 53 71 75 61 72 65 29 20  :' || inSquare) 
f410: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
f420: 3d 3d 27 5b 27 20 29 20 69 6e 53 71 75 61 72 65  =='[' ) inSquare
f430: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66   = 1;.        if
f440: 28 20 63 3d 3d 27 5d 27 20 29 20 69 6e 53 71 75  ( c==']' ) inSqu
f450: 61 72 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  are = 0;.       
f460: 20 7a 53 65 72 76 65 72 50 6f 72 74 2b 2b 3b 0a   zServerPort++;.
f470: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
f480: 28 20 7a 53 65 72 76 65 72 50 6f 72 74 20 26 26  ( zServerPort &&
f490: 20 2a 7a 53 65 72 76 65 72 50 6f 72 74 20 29 7b   *zServerPort ){
f4a0: 0a 20 20 20 20 20 20 20 20 2a 7a 53 65 72 76 65  .        *zServe
f4b0: 72 50 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20  rPort = 0;.     
f4c0: 20 20 20 7a 53 65 72 76 65 72 50 6f 72 74 2b 2b     zServerPort++
f4d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f4e0: 69 66 28 20 7a 52 65 61 6c 50 6f 72 74 20 29 7b  if( zRealPort ){
f4f0: 0a 20 20 20 20 20 20 20 20 7a 53 65 72 76 65 72  .        zServer
f500: 50 6f 72 74 20 3d 20 53 74 72 44 75 70 28 7a 52  Port = StrDup(zR
f510: 65 61 6c 50 6f 72 74 29 3b 0a 20 20 20 20 20 20  ealPort);.      
f520: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
f530: 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c  strcasecmp(zFiel
f540: 64 4e 61 6d 65 2c 22 41 75 74 68 6f 72 69 7a 61  dName,"Authoriza
f550: 74 69 6f 6e 3a 22 29 3d 3d 30 20 29 7b 0a 20 20  tion:")==0 ){.  
f560: 20 20 20 20 7a 41 75 74 68 54 79 70 65 20 3d 20      zAuthType = 
f570: 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28  GetFirstElement(
f580: 53 74 72 44 75 70 28 7a 56 61 6c 29 2c 20 26 7a  StrDup(zVal), &z
f590: 41 75 74 68 41 72 67 29 3b 0a 20 20 20 20 7d 65  AuthArg);.    }e
f5a0: 6c 73 65 20 69 66 28 20 73 74 72 63 61 73 65 63  lse if( strcasec
f5b0: 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 49  mp(zFieldName,"I
f5c0: 66 2d 4e 6f 6e 65 2d 4d 61 74 63 68 3a 22 29 3d  f-None-Match:")=
f5d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 49 66 4e  =0 ){.      zIfN
f5e0: 6f 6e 65 4d 61 74 63 68 20 3d 20 53 74 72 44 75  oneMatch = StrDu
f5f0: 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c  p(zVal);.    }el
f600: 73 65 20 69 66 28 20 73 74 72 63 61 73 65 63 6d  se if( strcasecm
f610: 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 49 66  p(zFieldName,"If
f620: 2d 4d 6f 64 69 66 69 65 64 2d 53 69 6e 63 65 3a  -Modified-Since:
f630: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  ")==0 ){.      z
f640: 49 66 4d 6f 64 69 66 69 65 64 53 69 6e 63 65 20  IfModifiedSince 
f650: 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a  = StrDup(zVal);.
f660: 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66      }.  }.#ifdef
f670: 20 4c 4f 47 5f 48 45 41 44 45 52 0a 20 20 69 66   LOG_HEADER.  if
f680: 28 20 68 64 72 4c 6f 67 20 29 20 66 63 6c 6f 73  ( hdrLog ) fclos
f690: 65 28 68 64 72 4c 6f 67 29 3b 0a 23 65 6e 64 69  e(hdrLog);.#endi
f6a0: 66 0a 0a 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77  f..  /* Disallow
f6b0: 20 72 65 71 75 65 73 74 73 20 66 72 6f 6d 20 63   requests from c
f6c0: 65 72 74 61 69 6e 20 63 6c 69 65 6e 74 73 20 2a  ertain clients *
f6d0: 2f 0a 20 20 69 66 28 20 7a 41 67 65 6e 74 20 29  /.  if( zAgent )
f6e0: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 73 74 72  {.    if( strstr
f6f0: 28 7a 41 67 65 6e 74 2c 20 22 57 69 6e 64 6f 77  (zAgent, "Window
f700: 73 5f 39 22 29 21 3d 30 0a 20 20 20 20 20 7c 7c  s_9")!=0.     ||
f710: 20 73 74 72 73 74 72 28 7a 41 67 65 6e 74 2c 20   strstr(zAgent, 
f720: 22 44 6f 77 6e 6c 6f 61 64 5f 4d 61 73 74 65 72  "Download_Master
f730: 22 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 73 74  ")!=0.     || st
f740: 72 73 74 72 28 7a 41 67 65 6e 74 2c 20 22 45 7a  rstr(zAgent, "Ez
f750: 6f 6f 6d 73 2f 22 29 21 3d 30 0a 20 20 20 20 20  ooms/")!=0.     
f760: 7c 7c 20 73 74 72 73 74 72 28 7a 41 67 65 6e 74  || strstr(zAgent
f770: 2c 20 22 48 54 54 72 61 63 6b 22 29 21 3d 30 0a  , "HTTrack")!=0.
f780: 20 20 20 20 20 7c 7c 20 73 74 72 73 74 72 28 7a       || strstr(z
f790: 41 67 65 6e 74 2c 20 22 41 68 72 65 66 73 42 6f  Agent, "AhrefsBo
f7a0: 74 22 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20  t")!=0.    ){.  
f7b0: 20 20 20 20 46 6f 72 62 69 64 64 65 6e 28 32 35      Forbidden(25
f7c0: 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 44 69 73  0);  /* LOG: Dis
f7d0: 61 6c 6c 6f 77 65 64 20 75 73 65 72 20 61 67 65  allowed user age
f7e0: 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  nt */.    }.  }.
f7f0: 23 69 66 20 30 0a 20 20 69 66 28 20 7a 52 65 66  #if 0.  if( zRef
f800: 65 72 65 72 20 29 7b 0a 20 20 20 20 73 74 61 74  erer ){.    stat
f810: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
f820: 7a 44 69 73 61 6c 6c 6f 77 5b 5d 20 3d 20 7b 0a  zDisallow[] = {.
f830: 20 20 20 20 20 20 22 73 6b 69 64 72 6f 77 63 72        "skidrowcr
f840: 61 63 6b 2e 63 6f 6d 22 2c 0a 20 20 20 20 20 20  ack.com",.      
f850: 22 68 6f 73 68 69 79 75 75 67 69 2e 74 69 73 74  "hoshiyuugi.tist
f860: 6f 72 79 2e 63 6f 6d 22 2c 0a 20 20 20 20 20 20  ory.com",.      
f870: 22 73 6b 69 64 72 6f 77 67 61 6d 65 73 2e 6e 65  "skidrowgames.ne
f880: 74 22 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69  t",.    };.    i
f890: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
f8a0: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69  0; i<sizeof(azDi
f8b0: 73 61 6c 6c 6f 77 29 2f 73 69 7a 65 6f 66 28 61  sallow)/sizeof(a
f8c0: 7a 44 69 73 61 6c 6c 6f 77 5b 30 5d 29 3b 20 69  zDisallow[0]); i
f8d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
f8e0: 74 72 73 74 72 28 7a 52 65 66 65 72 65 72 2c 20  trstr(zReferer, 
f8f0: 61 7a 44 69 73 61 6c 6c 6f 77 5b 69 5d 29 21 3d  azDisallow[i])!=
f900: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4e 6f 74  0 ){.        Not
f910: 46 6f 75 6e 64 28 32 36 30 29 3b 20 20 2f 2a 20  Found(260);  /* 
f920: 4c 4f 47 3a 20 44 69 73 61 6c 6c 6f 77 65 64 20  LOG: Disallowed 
f930: 72 65 66 65 72 72 65 72 20 2a 2f 0a 20 20 20 20  referrer */.    
f940: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
f950: 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ndif..  /* Make 
f960: 61 6e 20 65 78 74 72 61 20 65 66 66 6f 72 74 20  an extra effort 
f970: 74 6f 20 67 65 74 20 61 20 76 61 6c 69 64 20 73  to get a valid s
f980: 65 72 76 65 72 20 6e 61 6d 65 20 61 6e 64 20 70  erver name and p
f990: 6f 72 74 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2a  ort number..  **
f9a0: 20 4f 6e 6c 79 20 4e 65 74 73 63 61 70 65 20 70   Only Netscape p
f9b0: 72 6f 76 69 64 65 73 20 74 68 69 73 20 69 6e 66  rovides this inf
f9c0: 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68  ormation.  If th
f9d0: 65 20 62 72 6f 77 73 65 72 20 69 73 0a 20 20 2a  e browser is.  *
f9e0: 2a 20 49 6e 74 65 72 6e 65 74 20 45 78 70 6c 6f  * Internet Explo
f9f0: 72 65 72 2c 20 74 68 65 6e 20 77 65 20 68 61 76  rer, then we hav
fa00: 65 20 74 6f 20 66 69 6e 64 20 6f 75 74 20 74 68  e to find out th
fa10: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  e information fo
fa20: 72 0a 20 20 2a 2a 20 6f 75 72 73 65 6c 76 65 73  r.  ** ourselves
fa30: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 53 65  ..  */.  if( zSe
fa40: 72 76 65 72 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  rverName==0 ){. 
fa50: 20 20 20 7a 53 65 72 76 65 72 4e 61 6d 65 20 3d     zServerName =
fa60: 20 53 61 66 65 4d 61 6c 6c 6f 63 28 20 31 30 30   SafeMalloc( 100
fa70: 20 29 3b 0a 20 20 20 20 67 65 74 68 6f 73 74 6e   );.    gethostn
fa80: 61 6d 65 28 7a 53 65 72 76 65 72 4e 61 6d 65 2c  ame(zServerName,
fa90: 31 30 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  100);.  }.  if( 
faa0: 7a 53 65 72 76 65 72 50 6f 72 74 3d 3d 30 20 7c  zServerPort==0 |
fab0: 7c 20 2a 7a 53 65 72 76 65 72 50 6f 72 74 3d 3d  | *zServerPort==
fac0: 30 20 29 7b 0a 20 20 20 20 7a 53 65 72 76 65 72  0 ){.    zServer
fad0: 50 6f 72 74 20 3d 20 44 45 46 41 55 4c 54 5f 50  Port = DEFAULT_P
fae0: 4f 52 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ORT;.  }..  /* R
faf0: 65 6d 6f 76 65 20 74 68 65 20 71 75 65 72 79 20  emove the query 
fb00: 73 74 72 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  string from the 
fb10: 65 6e 64 20 6f 66 20 74 68 65 20 72 65 71 75 65  end of the reque
fb20: 73 74 65 64 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  sted file..  */.
fb30: 20 20 66 6f 72 28 7a 3d 7a 53 63 72 69 70 74 3b    for(z=zScript;
fb40: 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 3f 27 3b 20   *z && *z!='?'; 
fb50: 7a 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 2a 7a 3d  z++){}.  if( *z=
fb60: 3d 27 3f 27 20 29 7b 0a 20 20 20 20 7a 51 75 65  ='?' ){.    zQue
fb70: 72 79 53 75 66 66 69 78 20 3d 20 53 74 72 44 75  rySuffix = StrDu
fb80: 70 28 7a 29 3b 0a 20 20 20 20 2a 7a 20 3d 20 30  p(z);.    *z = 0
fb90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
fba0: 51 75 65 72 79 53 75 66 66 69 78 20 3d 20 22 22  QuerySuffix = ""
fbb0: 3b 0a 20 20 7d 0a 20 20 7a 51 75 65 72 79 53 74  ;.  }.  zQuerySt
fbc0: 72 69 6e 67 20 3d 20 2a 7a 51 75 65 72 79 53 75  ring = *zQuerySu
fbd0: 66 66 69 78 20 3f 20 26 7a 51 75 65 72 79 53 75  ffix ? &zQuerySu
fbe0: 66 66 69 78 5b 31 5d 20 3a 20 7a 51 75 65 72 79  ffix[1] : zQuery
fbf0: 53 75 66 66 69 78 3b 0a 0a 20 20 2f 2a 20 43 72  Suffix;..  /* Cr
fc00: 65 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20 68  eate a file to h
fc10: 6f 6c 64 20 74 68 65 20 50 4f 53 54 20 71 75 65  old the POST que
fc20: 72 79 20 64 61 74 61 2c 20 69 66 20 61 6e 79 2e  ry data, if any.
fc30: 20 20 57 65 20 68 61 76 65 20 74 6f 0a 20 20 2a    We have to.  *
fc40: 2a 20 64 6f 20 69 74 20 74 68 69 73 20 77 61 79  * do it this way
fc50: 2e 20 20 57 65 20 63 61 6e 27 74 20 6a 75 73 74  .  We can't just
fc60: 20 70 61 73 73 20 74 68 65 20 66 69 6c 65 20 64   pass the file d
fc70: 65 73 63 72 69 70 74 6f 72 20 64 6f 77 6e 20 74  escriptor down t
fc80: 6f 0a 20 20 2a 2a 20 74 68 65 20 63 68 69 6c 64  o.  ** the child
fc90: 20 70 72 6f 63 65 73 73 20 62 65 63 61 75 73 65   process because
fca0: 20 74 68 65 20 66 67 65 74 73 28 29 20 66 75 6e   the fgets() fun
fcb0: 63 74 69 6f 6e 20 6d 61 79 20 68 61 76 65 20 61  ction may have a
fcc0: 6c 72 65 61 64 79 0a 20 20 2a 2a 20 72 65 61 64  lready.  ** read
fcd0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 50 4f 53   part of the POS
fce0: 54 20 64 61 74 61 20 69 6e 74 6f 20 69 74 73 20  T data into its 
fcf0: 69 6e 74 65 72 6e 61 6c 20 62 75 66 66 65 72 2e  internal buffer.
fd00: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 4d 65 74  .  */.  if( zMet
fd10: 68 6f 64 5b 30 5d 3d 3d 27 50 27 20 26 26 20 7a  hod[0]=='P' && z
fd20: 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 21 3d 30  ContentLength!=0
fd30: 20 29 7b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c   ){.    size_t l
fd40: 65 6e 20 3d 20 61 74 6f 69 28 7a 43 6f 6e 74 65  en = atoi(zConte
fd50: 6e 74 4c 65 6e 67 74 68 29 3b 0a 20 20 20 20 46  ntLength);.    F
fd60: 49 4c 45 20 2a 6f 75 74 3b 0a 20 20 20 20 63 68  ILE *out;.    ch
fd70: 61 72 20 2a 7a 42 75 66 3b 0a 20 20 20 20 69 6e  ar *zBuf;.    in
fd80: 74 20 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6c 65  t n;..    if( le
fd90: 6e 3e 4d 41 58 5f 43 4f 4e 54 45 4e 54 5f 4c 45  n>MAX_CONTENT_LE
fda0: 4e 47 54 48 20 29 7b 0a 20 20 20 20 20 20 53 74  NGTH ){.      St
fdb0: 61 72 74 52 65 73 70 6f 6e 73 65 28 22 35 30 30  artResponse("500
fdc0: 20 52 65 71 75 65 73 74 20 74 6f 6f 20 6c 61 72   Request too lar
fdd0: 67 65 22 29 3b 0a 20 20 20 20 20 20 6e 4f 75 74  ge");.      nOut
fde0: 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20   += printf(.    
fdf0: 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70      "Content-typ
fe00: 65 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c 72 5c  e: text/plain\r\
fe10: 6e 22 0a 20 20 20 20 20 20 20 20 22 5c 72 5c 6e  n".        "\r\n
fe20: 22 0a 20 20 20 20 20 20 20 20 22 54 6f 6f 20 6d  ".        "Too m
fe30: 75 63 68 20 50 4f 53 54 20 64 61 74 61 5c 6e 22  uch POST data\n"
fe40: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
fe50: 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20  MakeLogEntry(0, 
fe60: 32 37 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 52 65  270); /* LOG: Re
fe70: 71 75 65 73 74 20 74 6f 6f 20 6c 61 72 67 65 20  quest too large 
fe80: 2a 2f 0a 20 20 20 20 20 20 65 78 69 74 28 30 29  */.      exit(0)
fe90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 70 72 69  ;.    }.    spri
fea0: 6e 74 66 28 7a 54 6d 70 4e 61 6d 42 75 66 2c 20  ntf(zTmpNamBuf, 
feb0: 22 2f 74 6d 70 2f 2d 70 6f 73 74 2d 64 61 74 61  "/tmp/-post-data
fec0: 2d 58 58 58 58 58 58 22 29 3b 0a 20 20 20 20 7a  -XXXXXX");.    z
fed0: 54 6d 70 4e 61 6d 20 3d 20 7a 54 6d 70 4e 61 6d  TmpNam = zTmpNam
fee0: 42 75 66 3b 0a 20 20 20 20 69 66 28 20 6d 6b 73  Buf;.    if( mks
fef0: 74 65 6d 70 28 7a 54 6d 70 4e 61 6d 29 3c 30 20  temp(zTmpNam)<0 
ff00: 29 7b 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e 63  ){.      Malfunc
ff10: 74 69 6f 6e 28 32 38 30 2c 20 20 2f 2a 20 4c 4f  tion(280,  /* LO
ff20: 47 3a 20 6d 6b 73 74 65 6d 70 28 29 20 66 61 69  G: mkstemp() fai
ff30: 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  led */.         
ff40: 20 20 20 20 20 20 22 43 61 6e 6e 6f 74 20 63 72        "Cannot cr
ff50: 65 61 74 65 20 61 20 74 65 6d 70 20 66 69 6c 65  eate a temp file
ff60: 20 69 6e 20 77 68 69 63 68 20 74 6f 20 73 74 6f   in which to sto
ff70: 72 65 20 50 4f 53 54 20 64 61 74 61 22 29 3b 0a  re POST data");.
ff80: 20 20 20 20 7d 0a 20 20 20 20 6f 75 74 20 3d 20      }.    out = 
ff90: 66 6f 70 65 6e 28 7a 54 6d 70 4e 61 6d 2c 22 77  fopen(zTmpNam,"w
ffa0: 62 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74  b");.    if( out
ffb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 74 61  ==0 ){.      Sta
ffc0: 72 74 52 65 73 70 6f 6e 73 65 28 22 35 30 30 20  rtResponse("500 
ffd0: 43 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 2f 74  Cannot create /t
ffe0: 6d 70 20 66 69 6c 65 22 29 3b 0a 20 20 20 20 20  mp file");.     
fff0: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
10000 0a 20 20 20 20 20 20 20 20 22 43 6f 6e 74 65 6e  .        "Conten
10010 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 70 6c 61  t-type: text/pla
10020 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 20 20 20 20  in\r\n".        
10030 22 5c 72 5c 6e 22 0a 20 20 20 20 20 20 20 20 22  "\r\n".        "
10040 43 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20 5c  Could not open \
10050 22 25 73 5c 22 20 66 6f 72 20 77 72 69 74 69 6e  "%s\" for writin
10060 67 5c 6e 22 2c 20 7a 54 6d 70 4e 61 6d 0a 20 20  g\n", zTmpNam.  
10070 20 20 20 20 29 3b 0a 20 20 20 20 20 20 4d 61 6b      );.      Mak
10080 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 32 39 30  eLogEntry(0, 290
10090 29 3b 20 2f 2a 20 4c 4f 47 3a 20 63 61 6e 6e 6f  ); /* LOG: canno
100a0 74 20 63 72 65 61 74 65 20 74 65 6d 70 20 66 69  t create temp fi
100b0 6c 65 20 66 6f 72 20 50 4f 53 54 20 2a 2f 0a 20  le for POST */. 
100c0 20 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20       exit(0);.  
100d0 20 20 7d 0a 20 20 20 20 7a 42 75 66 20 3d 20 53    }.    zBuf = S
100e0 61 66 65 4d 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31  afeMalloc( len+1
100f0 20 29 3b 0a 20 20 20 20 69 66 28 20 75 73 65 54   );.    if( useT
10100 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d 28 31  imeout ) alarm(1
10110 35 20 2b 20 6c 65 6e 2f 32 30 30 30 29 3b 0a 20  5 + len/2000);. 
10120 20 20 20 6e 20 3d 20 66 72 65 61 64 28 7a 42 75     n = fread(zBu
10130 66 2c 31 2c 6c 65 6e 2c 73 74 64 69 6e 29 3b 0a  f,1,len,stdin);.
10140 20 20 20 20 6e 49 6e 20 2b 3d 20 6e 3b 0a 20 20      nIn += n;.  
10150 20 20 66 77 72 69 74 65 28 7a 42 75 66 2c 31 2c    fwrite(zBuf,1,
10160 6e 2c 6f 75 74 29 3b 0a 20 20 20 20 66 72 65 65  n,out);.    free
10170 28 7a 42 75 66 29 3b 0a 20 20 20 20 66 63 6c 6f  (zBuf);.    fclo
10180 73 65 28 6f 75 74 29 3b 0a 20 20 7d 0a 0a 20 20  se(out);.  }..  
10190 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
101a0 20 72 75 6e 6e 69 6e 67 20 74 69 6d 65 20 69 73   running time is
101b0 20 6e 6f 74 20 74 6f 6f 20 67 72 65 61 74 20 2a   not too great *
101c0 2f 0a 20 20 69 66 28 20 75 73 65 54 69 6d 65 6f  /.  if( useTimeo
101d0 75 74 20 29 20 61 6c 61 72 6d 28 31 30 29 3b 0a  ut ) alarm(10);.
101e0 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 61 6c  .  /* Convert al
101f0 6c 20 75 6e 75 73 75 61 6c 20 63 68 61 72 61 63  l unusual charac
10200 74 65 72 73 20 69 6e 20 74 68 65 20 73 63 72 69  ters in the scri
10210 70 74 20 6e 61 6d 65 20 69 6e 74 6f 20 22 5f 22  pt name into "_"
10220 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
10230 20 69 73 20 61 20 64 65 66 65 6e 73 65 20 61 67   is a defense ag
10240 61 69 6e 73 74 20 76 61 72 69 6f 75 73 20 61 74  ainst various at
10250 74 61 63 6b 73 2c 20 58 53 53 20 61 74 74 61 63  tacks, XSS attac
10260 6b 73 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72  ks in particular
10270 2e 0a 20 20 2a 2f 0a 20 20 73 61 6e 69 74 69 7a  ..  */.  sanitiz
10280 65 53 74 72 69 6e 67 28 7a 53 63 72 69 70 74 29  eString(zScript)
10290 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61  ;..  /* Do not a
102a0 6c 6c 6f 77 20 22 2f 2e 22 20 6f 72 20 22 2f 2d  llow "/." or "/-
102b0 22 20 74 6f 20 74 6f 20 6f 63 63 75 72 20 61 6e  " to to occur an
102c0 79 77 68 65 72 65 20 69 6e 20 74 68 65 20 65 6e  ywhere in the en
102d0 74 69 74 79 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20  tity name..  ** 
102e0 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 61 74  This prevents at
102f0 74 61 63 6b 73 20 69 6e 76 6f 6c 76 69 6e 67 20  tacks involving 
10300 22 2e 2e 22 20 61 6e 64 20 61 6c 73 6f 20 61 6c  ".." and also al
10310 6c 6f 77 73 20 75 73 20 74 6f 20 63 72 65 61 74  lows us to creat
10320 65 0a 20 20 2a 2a 20 66 69 6c 65 73 20 61 6e 64  e.  ** files and
10330 20 64 69 72 65 63 74 6f 72 69 65 73 20 77 68 6f   directories who
10340 73 65 20 6e 61 6d 65 73 20 62 65 67 69 6e 20 77  se names begin w
10350 69 74 68 20 22 2d 22 20 6f 72 20 22 2e 22 20 77  ith "-" or "." w
10360 68 69 63 68 20 61 72 65 0a 20 20 2a 2a 20 69 6e  hich are.  ** in
10370 76 69 73 69 62 6c 65 20 74 6f 20 74 68 65 20 77  visible to the w
10380 65 62 73 65 72 76 65 72 2e 0a 20 20 2a 2a 0a 20  ebserver..  **. 
10390 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20   ** Exception:  
103a0 41 6c 6c 6f 77 20 74 68 65 20 22 2f 2e 77 65 6c  Allow the "/.wel
103b0 6c 2d 6b 6e 6f 77 6e 2f 22 20 70 72 65 66 69 78  l-known/" prefix
103c0 20 69 6e 20 61 63 63 6f 72 64 61 6e 63 65 20 77   in accordance w
103d0 69 74 68 0a 20 20 2a 2a 20 52 46 43 2d 35 37 38  ith.  ** RFC-578
103e0 35 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 7a 3d 7a  5.  */.  for(z=z
103f0 53 63 72 69 70 74 3b 20 2a 7a 3b 20 7a 2b 2b 29  Script; *z; z++)
10400 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2f  {.    if( *z=='/
10410 27 20 26 26 20 28 7a 5b 31 5d 3d 3d 27 2e 27 20  ' && (z[1]=='.' 
10420 7c 7c 20 7a 5b 31 5d 3d 3d 27 2d 27 29 0a 20 20  || z[1]=='-').  
10430 20 20 20 26 26 20 28 7a 3e 7a 53 63 72 69 70 74     && (z>zScript
10440 20 7c 7c 20 73 74 72 6e 63 6d 70 28 7a 2c 22 2f   || strncmp(z,"/
10450 2e 77 65 6c 6c 2d 6b 6e 6f 77 6e 2f 22 2c 31 33  .well-known/",13
10460 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0).    ){.   
10470 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 33 30 30      NotFound(300
10480 29 3b 20 2f 2a 20 4c 4f 47 3a 20 50 61 74 68 20  ); /* LOG: Path 
10490 65 6c 65 6d 65 6e 74 20 62 65 67 69 6e 73 20 77  element begins w
104a0 69 74 68 20 22 2e 22 20 6f 72 20 22 2d 22 20 2a  ith "." or "-" *
104b0 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  /.    }.  }..  /
104c0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 61  * Figure out wha
104d0 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68  t the root of th
104e0 65 20 66 69 6c 65 73 79 73 74 65 6d 20 73 68 6f  e filesystem sho
104f0 75 6c 64 20 62 65 2e 20 20 49 66 20 74 68 65 0a  uld be.  If the.
10500 20 20 2a 2a 20 48 54 54 50 5f 48 4f 53 54 20 70    ** HTTP_HOST p
10510 61 72 61 6d 65 74 65 72 20 65 78 69 73 74 73 20  arameter exists 
10520 28 73 74 6f 72 65 64 20 69 6e 20 7a 48 74 74 70  (stored in zHttp
10530 48 6f 73 74 29 20 74 68 65 6e 20 72 65 6d 6f 76  Host) then remov
10540 65 20 74 68 65 0a 20 20 2a 2a 20 70 6f 72 74 20  e the.  ** port 
10550 6e 75 6d 62 65 72 20 66 72 6f 6d 20 74 68 65 20  number from the 
10560 65 6e 64 20 28 69 66 20 61 6e 79 29 2c 20 63 6f  end (if any), co
10570 6e 76 65 72 74 20 61 6c 6c 20 63 68 61 72 61 63  nvert all charac
10580 74 65 72 73 20 74 6f 20 6c 6f 77 65 72 0a 20 20  ters to lower.  
10590 2a 2a 20 63 61 73 65 2c 20 61 6e 64 20 63 6f 6e  ** case, and con
105a0 76 65 72 74 20 6e 6f 6e 2d 61 6c 70 68 61 6e 75  vert non-alphanu
105b0 6d 62 65 72 20 63 68 61 72 61 63 74 65 72 73 20  mber characters 
105c0 28 69 6e 63 6c 75 64 69 6e 67 20 22 2e 22 29 20  (including ".") 
105d0 74 6f 20 22 5f 22 2e 0a 20 20 2a 2a 20 54 68 65  to "_"..  ** The
105e0 6e 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 20  n try to find a 
105f0 64 69 72 65 63 74 6f 72 79 20 77 69 74 68 20 74  directory with t
10600 68 61 74 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  hat name and the
10610 20 65 78 74 65 6e 73 69 6f 6e 20 2e 77 65 62 73   extension .webs
10620 69 74 65 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 74  ite..  ** If not
10630 20 66 6f 75 6e 64 2c 20 6c 6f 6f 6b 20 66 6f 72   found, look for
10640 20 22 64 65 66 61 75 6c 74 2e 77 65 62 73 69 74   "default.websit
10650 65 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  e"..  */.  if( z
10660 53 63 72 69 70 74 5b 30 5d 21 3d 27 2f 27 20 29  Script[0]!='/' )
10670 7b 0a 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 33  {.    NotFound(3
10680 31 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 55 52 49  10); /* LOG: URI
10690 20 64 6f 65 73 20 6e 6f 74 20 73 74 61 72 74 20   does not start 
106a0 77 69 74 68 20 22 2f 22 20 2a 2f 0a 20 20 7d 0a  with "/" */.  }.
106b0 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 52 6f    if( strlen(zRo
106c0 6f 74 29 2b 34 30 20 3e 3d 20 73 69 7a 65 6f 66  ot)+40 >= sizeof
106d0 28 7a 4c 69 6e 65 29 20 29 7b 0a 20 20 20 20 4e  (zLine) ){.    N
106e0 6f 74 46 6f 75 6e 64 28 33 32 30 29 3b 20 2f 2a  otFound(320); /*
106f0 20 4c 4f 47 3a 20 55 52 49 20 74 6f 6f 20 6c 6f   LOG: URI too lo
10700 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ng */.  }.  if( 
10710 7a 48 74 74 70 48 6f 73 74 3d 3d 30 20 7c 7c 20  zHttpHost==0 || 
10720 7a 48 74 74 70 48 6f 73 74 5b 30 5d 3d 3d 30 20  zHttpHost[0]==0 
10730 29 7b 0a 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28  ){.    NotFound(
10740 33 33 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 4d  330);  /* LOG: M
10750 69 73 73 69 6e 67 20 48 4f 53 54 3a 20 70 61 72  issing HOST: par
10760 61 6d 65 74 65 72 20 2a 2f 0a 20 20 7d 65 6c 73  ameter */.  }els
10770 65 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 48 74  e if( strlen(zHt
10780 74 70 48 6f 73 74 29 2b 73 74 72 6c 65 6e 28 7a  tpHost)+strlen(z
10790 52 6f 6f 74 29 2b 31 30 20 3e 3d 20 73 69 7a 65  Root)+10 >= size
107a0 6f 66 28 7a 4c 69 6e 65 29 20 29 7b 0a 20 20 20  of(zLine) ){.   
107b0 20 4e 6f 74 46 6f 75 6e 64 28 33 34 30 29 3b 20   NotFound(340); 
107c0 20 2f 2a 20 4c 4f 47 3a 20 48 4f 53 54 20 70 61   /* LOG: HOST pa
107d0 72 61 6d 65 74 65 72 20 74 6f 6f 20 6c 6f 6e 67  rameter too long
107e0 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
107f0 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20   sprintf(zLine, 
10800 22 25 73 2f 25 73 22 2c 20 7a 52 6f 6f 74 2c 20  "%s/%s", zRoot, 
10810 7a 48 74 74 70 48 6f 73 74 29 3b 0a 20 20 20 20  zHttpHost);.    
10820 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 7a 52 6f  for(i=strlen(zRo
10830 6f 74 29 2b 31 3b 20 7a 4c 69 6e 65 5b 69 5d 20  ot)+1; zLine[i] 
10840 26 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d 27 3a 27  && zLine[i]!=':'
10850 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 6e  ; i++){.      un
10860 73 69 67 6e 65 64 20 63 68 61 72 20 63 20 3d 20  signed char c = 
10870 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
10880 4c 69 6e 65 5b 69 5d 3b 0a 20 20 20 20 20 20 69  Line[i];.      i
10890 66 28 20 21 69 73 61 6c 6e 75 6d 28 63 29 20 29  f( !isalnum(c) )
108a0 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b  {.        zLine[
108b0 69 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20  i] = '_';.      
108c0 7d 65 6c 73 65 20 69 66 28 20 69 73 75 70 70 65  }else if( isuppe
108d0 72 28 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  r(c) ){.        
108e0 7a 4c 69 6e 65 5b 69 5d 20 3d 20 74 6f 6c 6f 77  zLine[i] = tolow
108f0 65 72 28 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  er(c);.      }. 
10900 20 20 20 7d 0a 20 20 20 20 73 74 72 63 70 79 28     }.    strcpy(
10910 26 7a 4c 69 6e 65 5b 69 5d 2c 20 22 2e 77 65 62  &zLine[i], ".web
10920 73 69 74 65 22 29 3b 0a 20 20 7d 0a 20 20 69 66  site");.  }.  if
10930 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74  ( stat(zLine,&st
10940 61 74 62 75 66 29 20 7c 7c 20 21 53 5f 49 53 44  atbuf) || !S_ISD
10950 49 52 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f  IR(statbuf.st_mo
10960 64 65 29 20 29 7b 0a 20 20 20 20 73 70 72 69 6e  de) ){.    sprin
10970 74 66 28 7a 4c 69 6e 65 2c 20 22 25 73 2f 64 65  tf(zLine, "%s/de
10980 66 61 75 6c 74 2e 77 65 62 73 69 74 65 22 2c 20  fault.website", 
10990 7a 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20  zRoot);.    if( 
109a0 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74  stat(zLine,&stat
109b0 62 75 66 29 20 7c 7c 20 21 53 5f 49 53 44 49 52  buf) || !S_ISDIR
109c0 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65  (statbuf.st_mode
109d0 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ) ){.      if( s
109e0 74 61 6e 64 61 6c 6f 6e 65 20 29 7b 0a 20 20 20  tandalone ){.   
109f0 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 69       sprintf(zLi
10a00 6e 65 2c 20 22 25 73 22 2c 20 7a 52 6f 6f 74 29  ne, "%s", zRoot)
10a10 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
10a20 20 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28         NotFound(
10a30 33 35 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 2a  350);  /* LOG: *
10a40 2e 77 65 62 73 69 74 65 20 70 65 72 6d 69 73 73  .website permiss
10a50 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  ions */.      }.
10a60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 48 6f 6d      }.  }.  zHom
10a70 65 20 3d 20 53 74 72 44 75 70 28 7a 4c 69 6e 65  e = StrDup(zLine
10a80 29 3b 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20  );..  /* Change 
10a90 64 69 72 65 63 74 6f 72 69 65 73 20 74 6f 20 74  directories to t
10aa0 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 48  he root of the H
10ab0 54 54 50 20 66 69 6c 65 73 79 73 74 65 6d 0a 20  TTP filesystem. 
10ac0 20 2a 2f 0a 20 20 69 66 28 20 63 68 64 69 72 28   */.  if( chdir(
10ad0 7a 48 6f 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zHome)!=0 ){.   
10ae0 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30 5d   char zBuf[1000]
10af0 3b 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f  ;.    Malfunctio
10b00 6e 28 33 36 30 2c 20 20 2f 2a 20 4c 4f 47 3a 20  n(360,  /* LOG: 
10b10 63 68 64 69 72 28 29 20 66 61 69 6c 65 64 20 2a  chdir() failed *
10b20 2f 0a 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e  /.         "cann
10b30 6f 74 20 63 68 64 69 72 20 74 6f 20 5b 25 73 5d  ot chdir to [%s]
10b40 20 66 72 6f 6d 20 5b 25 73 5d 22 2c 0a 20 20 20   from [%s]",.   
10b50 20 20 20 20 20 20 7a 48 6f 6d 65 2c 20 67 65 74        zHome, get
10b60 63 77 64 28 7a 42 75 66 2c 39 39 39 29 29 3b 0a  cwd(zBuf,999));.
10b70 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
10b80 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74 68 65   the file in the
10b90 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 57 65   filesystem.  We
10ba0 20 6d 69 67 68 74 20 68 61 76 65 20 74 6f 20 61   might have to a
10bb0 70 70 65 6e 64 0a 20 20 2a 2a 20 74 68 65 20 6e  ppend.  ** the n
10bc0 61 6d 65 20 22 69 6e 64 65 78 2e 68 74 6d 6c 22  ame "index.html"
10bd0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 69 6e   in order to fin
10be0 64 20 69 74 2e 20 20 41 6e 79 20 65 78 63 65 73  d it.  Any exces
10bf0 73 20 70 61 74 68 0a 20 20 2a 2a 20 69 6e 66 6f  s path.  ** info
10c00 72 6d 61 74 69 6f 6e 20 69 73 20 70 75 74 20 69  rmation is put i
10c10 6e 74 6f 20 74 68 65 20 7a 50 61 74 68 49 6e 66  nto the zPathInf
10c20 6f 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 2a 2f  o variable..  */
10c30 0a 20 20 6a 20 3d 20 6a 30 20 3d 20 28 69 6e 74  .  j = j0 = (int
10c40 29 73 74 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a  )strlen(zLine);.
10c50 20 20 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65    i = 0;.  while
10c60 28 20 7a 53 63 72 69 70 74 5b 69 5d 20 29 7b 0a  ( zScript[i] ){.
10c70 20 20 20 20 77 68 69 6c 65 28 20 7a 53 63 72 69      while( zScri
10c80 70 74 5b 69 5d 20 26 26 20 28 69 3d 3d 30 20 7c  pt[i] && (i==0 |
10c90 7c 20 7a 53 63 72 69 70 74 5b 69 5d 21 3d 27 2f  | zScript[i]!='/
10ca0 27 29 20 29 7b 0a 20 20 20 20 20 20 7a 4c 69 6e  ') ){.      zLin
10cb0 65 5b 6a 5d 20 3d 20 7a 53 63 72 69 70 74 5b 69  e[j] = zScript[i
10cc0 5d 3b 0a 20 20 20 20 20 20 69 2b 2b 3b 20 6a 2b  ];.      i++; j+
10cd0 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4c 69  +;.    }.    zLi
10ce0 6e 65 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 69  ne[j] = 0;.    i
10cf0 66 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73  f( stat(zLine,&s
10d00 74 61 74 62 75 66 29 21 3d 30 20 29 7b 0a 20 20  tatbuf)!=0 ){.  
10d10 20 20 20 20 69 6e 74 20 73 74 69 6c 6c 53 65 61      int stillSea
10d20 72 63 68 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20  rching = 1;.    
10d30 20 20 77 68 69 6c 65 28 20 73 74 69 6c 6c 53 65    while( stillSe
10d40 61 72 63 68 69 6e 67 20 26 26 20 69 3e 30 20 26  arching && i>0 &
10d50 26 20 6a 3e 6a 30 20 29 7b 0a 20 20 20 20 20 20  & j>j0 ){.      
10d60 20 20 77 68 69 6c 65 28 20 6a 3e 6a 30 20 26 26    while( j>j0 &&
10d70 20 7a 4c 69 6e 65 5b 6a 2d 31 5d 21 3d 27 2f 27   zLine[j-1]!='/'
10d80 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ j--; }.     
10d90 20 20 20 73 74 72 63 70 79 28 26 7a 4c 69 6e 65     strcpy(&zLine
10da0 5b 6a 2d 31 5d 2c 20 22 2f 6e 6f 74 2d 66 6f 75  [j-1], "/not-fou
10db0 6e 64 2e 68 74 6d 6c 22 29 3b 0a 20 20 20 20 20  nd.html");.     
10dc0 20 20 20 69 66 28 20 73 74 61 74 28 7a 4c 69 6e     if( stat(zLin
10dd0 65 2c 26 73 74 61 74 62 75 66 29 3d 3d 30 20 26  e,&statbuf)==0 &
10de0 26 20 53 5f 49 53 52 45 47 28 73 74 61 74 62 75  & S_ISREG(statbu
10df0 66 2e 73 74 5f 6d 6f 64 65 29 0a 20 20 20 20 20  f.st_mode).     
10e00 20 20 20 20 20 20 20 26 26 20 61 63 63 65 73 73         && access
10e10 28 7a 4c 69 6e 65 2c 52 5f 4f 4b 29 3d 3d 30 20  (zLine,R_OK)==0 
10e20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 52 65  ){.          zRe
10e30 61 6c 53 63 72 69 70 74 20 3d 20 53 74 72 44 75  alScript = StrDu
10e40 70 28 26 7a 4c 69 6e 65 5b 6a 30 5d 29 3b 0a 20  p(&zLine[j0]);. 
10e50 20 20 20 20 20 20 20 20 20 52 65 64 69 72 65 63           Redirec
10e60 74 28 7a 52 65 61 6c 53 63 72 69 70 74 2c 20 31  t(zRealScript, 1
10e70 2c 20 33 37 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20  , 370); /* LOG: 
10e80 72 65 64 69 72 65 63 74 20 74 6f 20 6e 6f 74 2d  redirect to not-
10e90 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  found */.       
10ea0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
10eb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10ec0 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20      j--;.       
10ed0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
10ee0 20 69 66 28 20 73 74 69 6c 6c 53 65 61 72 63 68   if( stillSearch
10ef0 69 6e 67 20 29 20 4e 6f 74 46 6f 75 6e 64 28 33  ing ) NotFound(3
10f00 38 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 55 52 49  80); /* LOG: URI
10f10 20 6e 6f 74 20 66 6f 75 6e 64 20 2a 2f 0a 20 20   not found */.  
10f20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10f30 0a 20 20 20 20 69 66 28 20 53 5f 49 53 52 45 47  .    if( S_ISREG
10f40 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65  (statbuf.st_mode
10f50 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ) ){.      if( a
10f60 63 63 65 73 73 28 7a 4c 69 6e 65 2c 52 5f 4f 4b  ccess(zLine,R_OK
10f70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 4e 6f 74  ) ){.        Not
10f80 46 6f 75 6e 64 28 33 39 30 29 3b 20 20 2f 2a 20  Found(390);  /* 
10f90 4c 4f 47 3a 20 46 69 6c 65 20 6e 6f 74 20 72 65  LOG: File not re
10fa0 61 64 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  adable */.      
10fb0 7d 0a 20 20 20 20 20 20 7a 52 65 61 6c 53 63 72  }.      zRealScr
10fc0 69 70 74 20 3d 20 53 74 72 44 75 70 28 26 7a 4c  ipt = StrDup(&zL
10fd0 69 6e 65 5b 6a 30 5d 29 3b 0a 20 20 20 20 20 20  ine[j0]);.      
10fe0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
10ff0 20 69 66 28 20 7a 53 63 72 69 70 74 5b 69 5d 3d   if( zScript[i]=
11000 3d 30 20 7c 7c 20 7a 53 63 72 69 70 74 5b 69 2b  =0 || zScript[i+
11010 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  1]==0 ){.      s
11020 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
11030 20 2a 61 7a 49 6e 64 65 78 5b 5d 20 3d 20 7b 20   *azIndex[] = { 
11040 22 2f 69 6e 64 65 78 2e 68 74 6d 6c 22 2c 20 22  "/index.html", "
11050 2f 68 6f 6d 65 22 2c 20 22 69 6e 64 65 78 2e 63  /home", "index.c
11060 67 69 22 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74  gi" };.      int
11070 20 6b 20 3d 20 6a 3e 30 20 26 26 20 7a 4c 69 6e   k = j>0 && zLin
11080 65 5b 6a 2d 31 5d 3d 3d 27 2f 27 20 3f 20 6a 2d  e[j-1]=='/' ? j-
11090 31 20 3a 20 6a 3b 0a 20 20 20 20 20 20 69 6e 74  1 : j;.      int
110a0 20 6a 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a   jj;.      for(j
110b0 6a 3d 30 3b 20 6a 6a 3c 73 69 7a 65 6f 66 28 61  j=0; jj<sizeof(a
110c0 7a 49 6e 64 65 78 29 2f 73 69 7a 65 6f 66 28 61  zIndex)/sizeof(a
110d0 7a 49 6e 64 65 78 5b 30 5d 29 3b 20 6a 6a 2b 2b  zIndex[0]); jj++
110e0 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70  ){.        strcp
110f0 79 28 26 7a 4c 69 6e 65 5b 6b 5d 2c 61 7a 49 6e  y(&zLine[k],azIn
11100 64 65 78 5b 6a 6a 5d 29 3b 0a 20 20 20 20 20 20  dex[jj]);.      
11110 20 20 69 66 28 20 73 74 61 74 28 7a 4c 69 6e 65    if( stat(zLine
11120 2c 26 73 74 61 74 62 75 66 29 21 3d 30 20 29 20  ,&statbuf)!=0 ) 
11130 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
11140 20 20 69 66 28 20 21 53 5f 49 53 52 45 47 28 73    if( !S_ISREG(s
11150 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20  tatbuf.st_mode) 
11160 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
11170 20 20 20 20 69 66 28 20 61 63 63 65 73 73 28 7a      if( access(z
11180 4c 69 6e 65 2c 52 5f 4f 4b 29 20 29 20 63 6f 6e  Line,R_OK) ) con
11190 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 62  tinue;.        b
111a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
111b0 20 20 20 20 69 66 28 20 6a 6a 3e 3d 73 69 7a 65      if( jj>=size
111c0 6f 66 28 61 7a 49 6e 64 65 78 29 2f 73 69 7a 65  of(azIndex)/size
111d0 6f 66 28 61 7a 49 6e 64 65 78 5b 30 5d 29 20 29  of(azIndex[0]) )
111e0 7b 0a 20 20 20 20 20 20 20 20 4e 6f 74 46 6f 75  {.        NotFou
111f0 6e 64 28 34 30 30 29 3b 20 2f 2a 20 4c 4f 47 3a  nd(400); /* LOG:
11200 20 55 52 49 20 69 73 20 61 20 64 69 72 65 63 74   URI is a direct
11210 6f 72 79 20 77 2f 6f 20 69 6e 64 65 78 2e 68 74  ory w/o index.ht
11220 6d 6c 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  ml */.      }.  
11230 20 20 20 20 7a 52 65 61 6c 53 63 72 69 70 74 20      zRealScript 
11240 3d 20 53 74 72 44 75 70 28 26 7a 4c 69 6e 65 5b  = StrDup(&zLine[
11250 6a 30 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  j0]);.      if( 
11260 7a 53 63 72 69 70 74 5b 69 5d 3d 3d 30 20 29 7b  zScript[i]==0 ){
11270 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
11280 68 65 20 72 65 71 75 65 73 74 65 64 20 55 52 4c  he requested URL
11290 20 64 6f 65 73 20 6e 6f 74 20 65 6e 64 20 77 69   does not end wi
112a0 74 68 20 22 2f 22 20 62 75 74 20 77 65 20 68 61  th "/" but we ha
112b0 64 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  d to.        ** 
112c0 61 70 70 65 6e 64 20 22 69 6e 64 65 78 2e 68 74  append "index.ht
112d0 6d 6c 22 2c 20 74 68 65 6e 20 61 20 72 65 64 69  ml", then a redi
112e0 72 65 63 74 20 69 73 20 6e 65 63 65 73 73 61 72  rect is necessar
112f0 79 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 20 20  y.  Otherwise.  
11300 20 20 20 20 20 20 2a 2a 20 6e 6f 6e 65 20 6f 66        ** none of
11310 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 55 52   the relative UR
11320 4c 73 20 69 6e 20 74 68 65 20 64 65 6c 69 76 65  Ls in the delive
11330 72 65 64 20 64 6f 63 75 6d 65 6e 74 20 77 69 6c  red document wil
11340 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
11350 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 20 20 20 20  correct. */.    
11360 20 20 20 20 52 65 64 69 72 65 63 74 28 7a 52 65      Redirect(zRe
11370 61 6c 53 63 72 69 70 74 2c 31 2c 34 31 30 29 3b  alScript,1,410);
11380 20 2f 2a 20 4c 4f 47 3a 20 72 65 64 69 72 65 63   /* LOG: redirec
11390 74 20 74 6f 20 61 64 64 20 74 72 61 69 6c 69 6e  t to add trailin
113a0 67 20 2f 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  g / */.        r
113b0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
113c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
113d0 7d 0a 20 20 20 20 7a 4c 69 6e 65 5b 6a 5d 20 3d  }.    zLine[j] =
113e0 20 7a 53 63 72 69 70 74 5b 69 5d 3b 0a 20 20 20   zScript[i];.   
113f0 20 69 2b 2b 3b 20 6a 2b 2b 3b 0a 20 20 7d 0a 20   i++; j++;.  }. 
11400 20 7a 46 69 6c 65 20 3d 20 53 74 72 44 75 70 28   zFile = StrDup(
11410 7a 4c 69 6e 65 29 3b 0a 20 20 7a 50 61 74 68 49  zLine);.  zPathI
11420 6e 66 6f 20 3d 20 53 74 72 44 75 70 28 26 7a 53  nfo = StrDup(&zS
11430 63 72 69 70 74 5b 69 5d 29 3b 0a 20 20 6c 65 6e  cript[i]);.  len
11440 46 69 6c 65 20 3d 20 73 74 72 6c 65 6e 28 7a 46  File = strlen(zF
11450 69 6c 65 29 3b 0a 20 20 7a 44 69 72 20 3d 20 53  ile);.  zDir = S
11460 74 72 44 75 70 28 7a 46 69 6c 65 29 3b 0a 20 20  trDup(zFile);.  
11470 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 7a 44 69  for(i=strlen(zDi
11480 72 29 2d 31 3b 20 69 3e 30 20 26 26 20 7a 44 69  r)-1; i>0 && zDi
11490 72 5b 69 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b  r[i]!='/'; i--){
114a0 7d 3b 0a 20 20 69 66 28 20 69 3d 3d 30 20 29 7b  };.  if( i==0 ){
114b0 0a 20 20 20 20 20 73 74 72 63 70 79 28 7a 44 69  .     strcpy(zDi
114c0 72 2c 22 2f 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  r,"/");.  }else{
114d0 0a 20 20 20 20 20 7a 44 69 72 5b 69 5d 20 3d 20  .     zDir[i] = 
114e0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  0;.  }..  /* Che
114f0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
11500 72 65 20 69 73 20 61 6e 20 61 75 74 68 6f 72 69  re is an authori
11510 7a 61 74 69 6f 6e 20 66 69 6c 65 2e 20 20 49 66  zation file.  If
11520 20 74 68 65 72 65 20 69 73 2c 0a 20 20 2a 2a 20   there is,.  ** 
11530 70 72 6f 63 65 73 73 20 69 74 2e 0a 20 20 2a 2f  process it..  */
11540 0a 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65  .  sprintf(zLine
11550 2c 20 22 25 73 2f 2d 61 75 74 68 22 2c 20 7a 44  , "%s/-auth", zD
11560 69 72 29 3b 0a 20 20 69 66 28 20 61 63 63 65 73  ir);.  if( acces
11570 73 28 7a 4c 69 6e 65 2c 52 5f 4f 4b 29 3d 3d 30  s(zLine,R_OK)==0
11580 20 26 26 20 21 43 68 65 63 6b 42 61 73 69 63 41   && !CheckBasicA
11590 75 74 68 6f 72 69 7a 61 74 69 6f 6e 28 7a 4c 69  uthorization(zLi
115a0 6e 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ne) ) return;.. 
115b0 20 2f 2a 20 54 61 6b 65 20 61 70 70 72 6f 70 72   /* Take appropr
115c0 69 61 74 65 20 61 63 74 69 6f 6e 0a 20 20 2a 2f  iate action.  */
115d0 0a 20 20 69 66 28 20 28 73 74 61 74 62 75 66 2e  .  if( (statbuf.
115e0 73 74 5f 6d 6f 64 65 20 26 20 30 31 30 30 29 3d  st_mode & 0100)=
115f0 3d 30 31 30 30 20 26 26 20 61 63 63 65 73 73 28  =0100 && access(
11600 7a 46 69 6c 65 2c 58 5f 4f 4b 29 3d 3d 30 20 29  zFile,X_OK)==0 )
11610 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 42 61 73  {.    char *zBas
11620 65 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  eFilename;      
11630 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 77     /* Filename w
11640 69 74 68 6f 75 74 20 64 69 72 65 63 74 6f 72 79  ithout directory
11650 20 70 72 65 66 69 78 20 2a 2f 0a 0a 20 20 20 20   prefix */..    
11660 2f 2a 0a 20 20 20 20 2a 2a 20 41 62 6f 72 74 20  /*.    ** Abort 
11670 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 69 66  with an error if
11680 20 74 68 65 20 43 47 49 20 73 63 72 69 70 74 20   the CGI script 
11690 69 73 20 77 72 69 74 61 62 6c 65 20 62 79 20 61  is writable by a
116a0 6e 79 6f 6e 65 20 6f 74 68 65 72 0a 20 20 20 20  nyone other.    
116b0 2a 2a 20 74 68 61 6e 20 69 74 73 20 6f 77 6e 65  ** than its owne
116c0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
116d0 28 20 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64  ( statbuf.st_mod
116e0 65 20 26 20 30 30 32 32 20 29 7b 0a 20 20 20 20  e & 0022 ){.    
116f0 20 20 43 67 69 53 63 72 69 70 74 57 72 69 74 61    CgiScriptWrita
11700 62 6c 65 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ble();.    }..  
11710 20 20 2f 2a 20 49 66 20 69 74 73 20 65 78 65 63    /* If its exec
11720 75 74 61 62 6c 65 2c 20 69 74 20 6d 75 73 74 20  utable, it must 
11730 62 65 20 61 20 43 47 49 20 70 72 6f 67 72 61 6d  be a CGI program
11740 2e 20 20 53 74 61 72 74 20 62 79 0a 20 20 20 20  .  Start by.    
11750 2a 2a 20 63 68 61 6e 67 69 6e 67 20 64 69 72 65  ** changing dire
11760 63 74 6f 72 69 65 73 20 74 6f 20 74 68 65 20 64  ctories to the d
11770 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 69 6e 67  irectory holding
11780 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20 20   the program..  
11790 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 68 64    */.    if( chd
117a0 69 72 28 7a 44 69 72 29 20 29 7b 0a 20 20 20 20  ir(zDir) ){.    
117b0 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30    char zBuf[1000
117c0 5d 3b 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e 63  ];.      Malfunc
117d0 74 69 6f 6e 28 34 32 30 2c 20 2f 2a 20 4c 4f 47  tion(420, /* LOG
117e0 3a 20 63 68 64 69 72 28 29 20 66 61 69 6c 65 64  : chdir() failed
117f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 22   */.           "
11800 63 61 6e 6e 6f 74 20 63 68 64 69 72 20 74 6f 20  cannot chdir to 
11810 5b 25 73 5d 20 66 72 6f 6d 20 5b 25 73 5d 22 2c  [%s] from [%s]",
11820 20 0a 20 20 20 20 20 20 20 20 20 20 20 7a 44 69   .           zDi
11830 72 2c 20 67 65 74 63 77 64 28 7a 42 75 66 2c 39  r, getcwd(zBuf,9
11840 39 39 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  99));.    }..   
11850 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
11860 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 6f 66  base filename of
11870 20 74 68 65 20 43 47 49 20 73 63 72 69 70 74 20   the CGI script 
11880 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 73 74 72  */.    for(i=str
11890 6c 65 6e 28 7a 46 69 6c 65 29 2d 31 3b 20 69 3e  len(zFile)-1; i>
118a0 3d 30 20 26 26 20 7a 46 69 6c 65 5b 69 5d 21 3d  =0 && zFile[i]!=
118b0 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 20 20  '/'; i--){}.    
118c0 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 20 3d 20  zBaseFilename = 
118d0 26 7a 46 69 6c 65 5b 69 2b 31 5d 3b 0a 0a 20 20  &zFile[i+1];..  
118e0 20 20 2f 2a 20 53 65 74 75 70 20 74 68 65 20 65    /* Setup the e
118f0 6e 76 69 72 6f 6e 6d 65 6e 74 20 61 70 70 72 6f  nvironment appro
11900 70 72 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2f  priately..    */
11910 0a 20 20 20 20 70 75 74 65 6e 76 28 22 47 41 54  .    putenv("GAT
11920 45 57 41 59 5f 49 4e 54 45 52 46 41 43 45 3d 43  EWAY_INTERFACE=C
11930 47 49 2f 31 2e 30 22 29 3b 0a 20 20 20 20 66 6f  GI/1.0");.    fo
11940 72 28 69 3d 30 3b 20 69 3c 28 69 6e 74 29 28 73  r(i=0; i<(int)(s
11950 69 7a 65 6f 66 28 63 67 69 65 6e 76 29 2f 73 69  izeof(cgienv)/si
11960 7a 65 6f 66 28 63 67 69 65 6e 76 5b 30 5d 29 29  zeof(cgienv[0]))
11970 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
11980 28 20 2a 63 67 69 65 6e 76 5b 69 5d 2e 70 7a 45  ( *cgienv[i].pzE
11990 6e 76 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20  nvValue ){.     
119a0 20 20 20 53 65 74 45 6e 76 28 63 67 69 65 6e 76     SetEnv(cgienv
119b0 5b 69 5d 2e 7a 45 6e 76 4e 61 6d 65 2c 2a 63 67  [i].zEnvName,*cg
119c0 69 65 6e 76 5b 69 5d 2e 70 7a 45 6e 76 56 61 6c  ienv[i].pzEnvVal
119d0 75 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ue);.      }.   
119e0 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65 48 74   }.    if( useHt
119f0 74 70 73 20 29 7b 0a 20 20 20 20 20 20 70 75 74  tps ){.      put
11a00 65 6e 76 28 22 48 54 54 50 53 3d 6f 6e 22 29 3b  env("HTTPS=on");
11a10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46  .    }..    /* F
11a20 6f 72 20 74 68 65 20 50 4f 53 54 20 6d 65 74 68  or the POST meth
11a30 6f 64 20 61 6c 6c 20 69 6e 70 75 74 20 68 61 73  od all input has
11a40 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
11a50 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
11a60 65 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 77 65 20  e,.    ** so we 
11a70 68 61 76 65 20 74 6f 20 72 65 64 69 72 65 63 74  have to redirect
11a80 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 43 47   input to the CG
11a90 49 20 73 63 72 69 70 74 20 66 72 6f 6d 20 74 68  I script from th
11aa0 61 74 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  at file..    */.
11ab0 20 20 20 20 69 66 28 20 7a 4d 65 74 68 6f 64 5b      if( zMethod[
11ac0 30 5d 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20  0]=='P' ){.     
11ad0 20 69 66 28 20 64 75 70 28 30 29 3c 30 20 29 7b   if( dup(0)<0 ){
11ae0 0a 20 20 20 20 20 20 20 20 4d 61 6c 66 75 6e 63  .        Malfunc
11af0 74 69 6f 6e 28 34 33 30 2c 20 20 2f 2a 20 4c 4f  tion(430,  /* LO
11b00 47 3a 20 64 75 70 28 30 29 20 66 61 69 6c 65 64  G: dup(0) failed
11b10 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
11b20 20 20 20 20 20 20 20 20 22 55 6e 61 62 6c 65 20          "Unable 
11b30 74 6f 20 64 75 70 6c 69 63 61 74 69 6f 6e 20 66  to duplication f
11b40 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 30  ile descriptor 0
11b50 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
11b60 20 20 63 6c 6f 73 65 28 30 29 3b 0a 20 20 20 20    close(0);.    
11b70 20 20 6f 70 65 6e 28 7a 54 6d 70 4e 61 6d 2c 20    open(zTmpNam, 
11b80 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 7d  O_RDONLY);.    }
11b90 0a 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d  ..    if( strncm
11ba0 70 28 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c  p(zBaseFilename,
11bb0 22 6e 70 68 2d 22 2c 34 29 3d 3d 30 20 29 7b 0a  "nph-",4)==0 ){.
11bc0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
11bd0 6e 61 6d 65 20 6f 66 20 74 68 65 20 43 47 49 20  name of the CGI 
11be0 73 63 72 69 70 74 20 62 65 67 69 6e 73 20 77 69  script begins wi
11bf0 74 68 20 22 6e 70 68 2d 22 20 74 68 65 6e 20 77  th "nph-" then w
11c00 65 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 64  e are.      ** d
11c10 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 22 6e  ealing with a "n
11c20 6f 6e 2d 70 61 72 73 65 64 20 68 65 61 64 65 72  on-parsed header
11c30 73 22 20 43 47 49 20 73 63 72 69 70 74 2e 20 20  s" CGI script.  
11c40 4a 75 73 74 20 65 78 65 63 28 29 0a 20 20 20 20  Just exec().    
11c50 20 20 2a 2a 20 69 74 20 64 69 72 65 63 74 6c 79    ** it directly
11c60 20 61 6e 64 20 6c 65 74 20 69 74 20 68 61 6e 64   and let it hand
11c70 6c 65 20 61 6c 6c 20 69 74 73 20 6f 77 6e 20 68  le all its own h
11c80 65 61 64 65 72 20 67 65 6e 65 72 61 74 69 6f 6e  eader generation
11c90 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
11ca0 20 65 78 65 63 6c 28 7a 42 61 73 65 46 69 6c 65   execl(zBaseFile
11cb0 6e 61 6d 65 2c 7a 42 61 73 65 46 69 6c 65 6e 61  name,zBaseFilena
11cc0 6d 65 2c 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  me,(char*)0);.  
11cd0 20 20 20 20 2f 2a 20 4e 4f 54 45 3a 20 4e 6f 20      /* NOTE: No 
11ce0 6c 6f 67 20 65 6e 74 72 79 20 77 72 69 74 74 65  log entry writte
11cf0 6e 20 66 6f 72 20 6e 70 68 2d 20 73 63 72 69 70  n for nph- scrip
11d00 74 73 20 2a 2f 0a 20 20 20 20 20 20 65 78 69 74  ts */.      exit
11d10 28 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  (0);.    }..    
11d20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 74 6f 20  /* Fall thru to 
11d30 68 65 72 65 20 6f 6e 6c 79 20 69 66 20 74 68 69  here only if thi
11d40 73 20 70 72 6f 63 65 73 73 20 28 74 68 65 20 73  s process (the s
11d50 65 72 76 65 72 29 20 69 73 20 67 6f 69 6e 67 0a  erver) is going.
11d60 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 61      ** to read a
11d70 6e 64 20 61 75 67 6d 65 6e 74 20 74 68 65 20 68  nd augment the h
11d80 65 61 64 65 72 20 73 65 6e 74 20 62 61 63 6b 20  eader sent back 
11d90 62 79 20 74 68 65 20 43 47 49 20 70 72 6f 63 65  by the CGI proce
11da0 73 73 2e 0a 20 20 20 20 2a 2a 20 4f 70 65 6e 20  ss..    ** Open 
11db0 61 20 70 69 70 65 20 74 6f 20 72 65 63 65 69 76  a pipe to receiv
11dc0 65 20 74 68 65 20 6f 75 74 70 75 74 20 66 72 6f  e the output fro
11dd0 6d 20 74 68 65 20 43 47 49 20 70 72 6f 63 65 73  m the CGI proces
11de0 73 2e 20 20 54 68 65 6e 0a 20 20 20 20 2a 2a 20  s.  Then.    ** 
11df0 66 6f 72 6b 20 74 68 65 20 43 47 49 20 70 72 6f  fork the CGI pro
11e00 63 65 73 73 2e 20 20 4f 6e 63 65 20 65 76 65 72  cess.  Once ever
11e10 79 74 68 69 6e 67 20 69 73 20 64 6f 6e 65 2c 20  ything is done, 
11e20 77 65 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20  we should be.   
11e30 20 2a 2a 20 61 62 6c 65 20 74 6f 20 72 65 61 64   ** able to read
11e40 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 43   the output of C
11e50 47 49 20 6f 6e 20 74 68 65 20 22 69 6e 22 20 73  GI on the "in" s
11e60 74 72 65 61 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20  tream..    */.  
11e70 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 78    {.      int px
11e80 5b 32 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [2];.      if( p
11e90 69 70 65 28 70 78 29 20 29 7b 0a 20 20 20 20 20  ipe(px) ){.     
11ea0 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 34     Malfunction(4
11eb0 34 30 2c 20 2f 2a 20 4c 4f 47 3a 20 70 69 70 65  40, /* LOG: pipe
11ec0 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  () failed */.   
11ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ee0 20 22 55 6e 61 62 6c 65 20 74 6f 20 63 72 65 61   "Unable to crea
11ef0 74 65 20 61 20 70 69 70 65 20 66 6f 72 20 74 68  te a pipe for th
11f00 65 20 43 47 49 20 70 72 6f 67 72 61 6d 22 29 3b  e CGI program");
11f10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
11f20 66 28 20 66 6f 72 6b 28 29 3d 3d 30 20 29 7b 0a  f( fork()==0 ){.
11f30 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 70 78          close(px
11f40 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 63 6c  [0]);.        cl
11f50 6f 73 65 28 31 29 3b 0a 20 20 20 20 20 20 20 20  ose(1);.        
11f60 69 66 28 20 64 75 70 28 70 78 5b 31 5d 29 21 3d  if( dup(px[1])!=
11f70 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 4d  1 ){.          M
11f80 61 6c 66 75 6e 63 74 69 6f 6e 28 34 35 30 2c 20  alfunction(450, 
11f90 2f 2a 20 4c 4f 47 3a 20 64 75 70 28 31 29 20 66  /* LOG: dup(1) f
11fa0 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  ailed */.       
11fb0 20 20 20 20 20 20 20 20 20 20 22 55 6e 61 62 6c            "Unabl
11fc0 65 20 74 6f 20 64 75 70 6c 69 63 61 74 65 20 66  e to duplicate f
11fd0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 25  ile descriptor %
11fe0 64 20 74 6f 20 31 22 2c 0a 20 20 20 20 20 20 20  d to 1",.       
11ff0 20 20 20 20 20 20 20 20 20 20 70 78 5b 31 5d 29            px[1])
12000 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12010 20 20 20 20 63 6c 6f 73 65 28 70 78 5b 31 5d 29      close(px[1])
12020 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
12030 33 3b 20 63 6c 6f 73 65 28 69 29 3d 3d 30 3b 20  3; close(i)==0; 
12040 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 65  i++){}.        e
12050 78 65 63 6c 28 7a 42 61 73 65 46 69 6c 65 6e 61  xecl(zBaseFilena
12060 6d 65 2c 20 7a 42 61 73 65 46 69 6c 65 6e 61 6d  me, zBaseFilenam
12070 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  e, (char*)0);.  
12080 20 20 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20        exit(0);. 
12090 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 6f       }.      clo
120a0 73 65 28 70 78 5b 31 5d 29 3b 0a 20 20 20 20 20  se(px[1]);.     
120b0 20 69 6e 20 3d 20 66 64 6f 70 65 6e 28 70 78 5b   in = fdopen(px[
120c0 30 5d 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 7d  0], "rb");.    }
120d0 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29  .    if( in==0 )
120e0 7b 0a 20 20 20 20 20 20 43 67 69 45 72 72 6f 72  {.      CgiError
120f0 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ();.    }else{. 
12100 20 20 20 20 20 43 67 69 48 61 6e 64 6c 65 52 65       CgiHandleRe
12110 70 6c 79 28 69 6e 29 3b 0a 20 20 20 20 7d 0a 20  ply(in);.    }. 
12120 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 6e 46 69   }else if( lenFi
12130 6c 65 3e 35 20 26 26 20 73 74 72 63 6d 70 28 26  le>5 && strcmp(&
12140 7a 46 69 6c 65 5b 6c 65 6e 46 69 6c 65 2d 35 5d  zFile[lenFile-5]
12150 2c 22 2e 73 63 67 69 22 29 3d 3d 30 20 29 7b 0a  ,".scgi")==0 ){.
12160 20 20 20 20 2f 2a 20 41 6e 79 20 66 69 6c 65 20      /* Any file 
12170 74 68 61 74 20 65 6e 64 73 20 77 69 74 68 20 22  that ends with "
12180 2e 73 63 67 69 22 20 69 73 20 61 73 73 75 6d 65  .scgi" is assume
12190 64 20 74 6f 20 62 65 20 74 65 78 74 20 6f 66 20  d to be text of 
121a0 74 68 65 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 3a  the.    ** form:
121b0 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 43 47 49  .    **     SCGI
121c0 20 68 6f 73 74 6e 61 6d 65 20 70 6f 72 74 0a 20   hostname port. 
121d0 20 20 20 2a 2a 20 4f 70 65 6e 20 61 20 54 43 50     ** Open a TCP
121e0 2f 49 50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  /IP connection t
121f0 6f 20 74 68 61 74 20 68 6f 73 74 20 61 6e 64 20  o that host and 
12200 73 65 6e 64 20 69 74 20 61 6e 20 53 43 47 49 20  send it an SCGI 
12210 72 65 71 75 65 73 74 0a 20 20 20 20 2a 2f 0a 20  request.    */. 
12220 20 20 20 53 65 6e 64 53 63 67 69 52 65 71 75 65     SendScgiReque
12230 73 74 28 7a 46 69 6c 65 2c 20 7a 53 63 72 69 70  st(zFile, zScrip
12240 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  t);.  }else if( 
12250 63 6f 75 6e 74 53 6c 61 73 68 65 73 28 7a 52 65  countSlashes(zRe
12260 61 6c 53 63 72 69 70 74 29 21 3d 63 6f 75 6e 74  alScript)!=count
12270 53 6c 61 73 68 65 73 28 7a 53 63 72 69 70 74 29  Slashes(zScript)
12280 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
12290 65 20 72 65 71 75 65 73 74 20 55 52 49 20 66 6f  e request URI fo
122a0 72 20 73 74 61 74 69 63 20 63 6f 6e 74 65 6e 74  r static content
122b0 20 63 6f 6e 74 61 69 6e 73 20 6d 61 74 65 72 69   contains materi
122c0 61 6c 20 70 61 73 74 20 74 68 65 0a 20 20 20 20  al past the.    
122d0 2a 2a 20 61 63 74 75 61 6c 20 63 6f 6e 74 65 6e  ** actual conten
122e0 74 20 66 69 6c 65 20 6e 61 6d 65 2c 20 72 65 70  t file name, rep
122f0 6f 72 74 20 74 68 61 74 20 61 73 20 61 20 34 30  ort that as a 40
12300 34 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20  4 error. */.    
12310 4e 6f 74 46 6f 75 6e 64 28 34 36 30 29 3b 20 2f  NotFound(460); /
12320 2a 20 4c 4f 47 3a 20 45 78 63 65 73 73 20 55 52  * LOG: Excess UR
12330 49 20 63 6f 6e 74 65 6e 74 20 70 61 73 74 20 73  I content past s
12340 74 61 74 69 63 20 66 69 6c 65 20 6e 61 6d 65 20  tatic file name 
12350 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
12360 2f 2a 20 49 66 20 69 74 20 69 73 6e 27 74 20 65  /* If it isn't e
12370 78 65 63 75 74 61 62 6c 65 20 74 68 65 6e 20 69  xecutable then i
12380 74 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 61 20  t.    ** must a 
12390 73 69 6d 70 6c 65 20 66 69 6c 65 20 74 68 61 74  simple file that
123a0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63 6f 70   needs to be cop
123b0 69 65 64 20 74 6f 20 6f 75 74 70 75 74 2e 0a 20  ied to output.. 
123c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 65     */.    if( Se
123d0 6e 64 46 69 6c 65 28 7a 46 69 6c 65 2c 20 6c 65  ndFile(zFile, le
123e0 6e 46 69 6c 65 2c 20 26 73 74 61 74 62 75 66 29  nFile, &statbuf)
123f0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20   ) return;.  }. 
12400 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
12410 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28  .  MakeLogEntry(
12420 30 2c 20 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20  0, 0);  /* LOG: 
12430 4e 6f 72 6d 61 6c 20 72 65 70 6c 79 20 2a 2f 0a  Normal reply */.
12440 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72  .  /* The next r
12450 65 71 75 65 73 74 20 6d 75 73 74 20 61 72 72 69  equest must arri
12460 76 65 20 77 69 74 68 69 6e 20 33 30 20 73 65 63  ve within 30 sec
12470 6f 6e 64 73 20 6f 72 20 77 65 20 63 6c 6f 73 65  onds or we close
12480 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a   the connection.
12490 20 20 2a 2f 0a 20 20 6f 6d 69 74 4c 6f 67 20 3d    */.  omitLog =
124a0 20 31 3b 0a 20 20 69 66 28 20 75 73 65 54 69 6d   1;.  if( useTim
124b0 65 6f 75 74 20 29 20 61 6c 61 72 6d 28 33 30 29  eout ) alarm(30)
124c0 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 4d 41 58  ;.}..#define MAX
124d0 5f 50 41 52 41 4c 4c 45 4c 20 35 30 20 20 2f 2a  _PARALLEL 50  /*
124e0 20 4e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c   Number of simul
124f0 74 61 6e 65 6f 75 73 20 63 68 69 6c 64 72 65 6e  taneous children
12500 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 70   */../*.** All p
12510 6f 73 73 69 62 6c 65 20 66 6f 72 6d 73 20 6f 66  ossible forms of
12520 20 61 6e 20 49 50 20 61 64 64 72 65 73 73 2e 20   an IP address. 
12530 20 4e 65 65 64 65 64 20 74 6f 20 77 6f 72 6b 20   Needed to work 
12540 61 72 6f 75 6e 64 20 47 43 43 20 73 74 72 69 63  around GCC stric
12550 74 0a 2a 2a 20 61 6c 69 61 73 69 6e 67 20 72 75  t.** aliasing ru
12560 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  les..*/.typedef 
12570 75 6e 69 6f 6e 20 7b 0a 20 20 73 74 72 75 63 74  union {.  struct
12580 20 73 6f 63 6b 61 64 64 72 20 73 61 3b 20 20 20   sockaddr sa;   
12590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 62             /* Ab
125a0 73 74 72 61 63 74 20 73 75 70 65 72 63 6c 61 73  stract superclas
125b0 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 6f  s */.  struct so
125c0 63 6b 61 64 64 72 5f 69 6e 20 73 61 34 3b 20 20  ckaddr_in sa4;  
125d0 20 20 20 20 20 20 20 20 2f 2a 20 49 50 76 34 20          /* IPv4 
125e0 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 6f 63 6b  */.  struct sock
125f0 61 64 64 72 5f 69 6e 36 20 73 61 36 3b 20 20 20  addr_in6 sa6;   
12600 20 20 20 20 20 20 2f 2a 20 49 50 76 36 20 2a 2f        /* IPv6 */
12610 0a 20 20 73 74 72 75 63 74 20 73 6f 63 6b 61 64  .  struct sockad
12620 64 72 5f 73 74 6f 72 61 67 65 20 73 61 73 3b 20  dr_storage sas; 
12630 20 20 20 20 2f 2a 20 53 68 6f 75 6c 64 20 62 65      /* Should be
12640 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20   the maximum of 
12650 74 68 65 20 61 62 6f 76 65 20 33 20 2a 2f 0a 7d  the above 3 */.}
12660 20 61 64 64 72 65 73 73 3b 0a 0a 2f 2a 0a 2a 2a   address;../*.**
12670 20 49 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 48 54   Implement an HT
12680 54 50 20 73 65 72 76 65 72 20 64 61 65 6d 6f 6e  TP server daemon
12690 20 6c 69 73 74 65 6e 69 6e 67 20 6f 6e 20 70 6f   listening on po
126a0 72 74 20 69 50 6f 72 74 2e 0a 2a 2a 0a 2a 2a 20  rt iPort..**.** 
126b0 41 73 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f  As new connectio
126c0 6e 73 20 61 72 72 69 76 65 2c 20 66 6f 72 6b 20  ns arrive, fork 
126d0 61 20 63 68 69 6c 64 20 61 6e 64 20 6c 65 74 20  a child and let 
126e0 63 68 69 6c 64 20 72 65 74 75 72 6e 0a 2a 2a 20  child return.** 
126f0 6f 75 74 20 6f 66 20 74 68 69 73 20 70 72 6f 63  out of this proc
12700 65 64 75 72 65 20 63 61 6c 6c 2e 20 20 54 68 65  edure call.  The
12710 20 63 68 69 6c 64 20 77 69 6c 6c 20 68 61 6e 64   child will hand
12720 6c 65 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a  le the request..
12730 2a 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6e 65  ** The parent ne
12740 76 65 72 20 72 65 74 75 72 6e 73 20 66 72 6f 6d  ver returns from
12750 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 2e   this procedure.
12760 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  .**.** Return 0 
12770 74 6f 20 65 61 63 68 20 63 68 69 6c 64 20 61 73  to each child as
12780 20 69 74 20 72 75 6e 73 2e 20 20 49 66 20 75 6e   it runs.  If un
12790 61 62 6c 65 20 74 6f 20 65 73 74 61 62 6c 69 73  able to establis
127a0 68 20 61 0a 2a 2a 20 6c 69 73 74 65 6e 69 6e 67  h a.** listening
127b0 20 73 6f 63 6b 65 74 2c 20 72 65 74 75 72 6e 20   socket, return 
127c0 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74  non-zero..*/.int
127d0 20 68 74 74 70 5f 73 65 72 76 65 72 28 63 6f 6e   http_server(con
127e0 73 74 20 63 68 61 72 20 2a 7a 50 6f 72 74 2c 20  st char *zPort, 
127f0 69 6e 74 20 6c 6f 63 61 6c 4f 6e 6c 79 29 7b 0a  int localOnly){.
12800 20 20 69 6e 74 20 6c 69 73 74 65 6e 65 72 5b 32    int listener[2
12810 30 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  0];            /
12820 2a 20 54 68 65 20 73 65 72 76 65 72 20 73 6f 63  * The server soc
12830 6b 65 74 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6f  kets */.  int co
12840 6e 6e 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20  nnection;       
12850 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 63 6b         /* A sock
12860 65 74 20 66 6f 72 20 65 61 63 68 20 69 6e 64 69  et for each indi
12870 76 69 64 75 61 6c 20 63 6f 6e 6e 65 63 74 69 6f  vidual connectio
12880 6e 20 2a 2f 0a 20 20 66 64 5f 73 65 74 20 72 65  n */.  fd_set re
12890 61 64 66 64 73 3b 20 20 20 20 20 20 20 20 20 20  adfds;          
128a0 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 66 69      /* Set of fi
128b0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66  le descriptors f
128c0 6f 72 20 73 65 6c 65 63 74 28 29 20 2a 2f 0a 20  or select() */. 
128d0 20 61 64 64 72 65 73 73 20 69 6e 61 64 64 72 3b   address inaddr;
128e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
128f0 20 52 65 6d 6f 74 65 20 61 64 64 72 65 73 73 20   Remote address 
12900 2a 2f 0a 20 20 73 6f 63 6b 6c 65 6e 5f 74 20 6c  */.  socklen_t l
12910 65 6e 61 64 64 72 3b 20 20 20 20 20 20 20 20 20  enaddr;         
12920 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
12930 68 65 20 69 6e 61 64 64 72 20 73 74 72 75 63 74  he inaddr struct
12940 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 69  ure */.  int chi
12950 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
12960 20 20 20 20 20 20 2f 2a 20 50 49 44 20 6f 66 20        /* PID of 
12970 74 68 65 20 63 68 69 6c 64 20 70 72 6f 63 65 73  the child proces
12980 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 63 68 69 6c  s */.  int nchil
12990 64 72 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  dren = 0;       
129a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
129b0 20 63 68 69 6c 64 20 70 72 6f 63 65 73 73 65 73   child processes
129c0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 74 69 6d   */.  struct tim
129d0 65 76 61 6c 20 64 65 6c 61 79 3b 20 20 20 20 20  eval delay;     
129e0 20 20 20 2f 2a 20 48 6f 77 20 6c 6f 6e 67 20 74     /* How long t
129f0 6f 20 77 61 69 74 20 69 6e 73 69 64 65 20 73 65  o wait inside se
12a00 6c 65 63 74 28 29 20 2a 2f 0a 20 20 69 6e 74 20  lect() */.  int 
12a10 6f 70 74 20 3d 20 31 3b 20 20 20 20 20 20 20 20  opt = 1;        
12a20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 74 73           /* sets
12a30 6f 63 6b 6f 70 74 20 66 6c 61 67 20 2a 2f 0a 20  ockopt flag */. 
12a40 20 73 74 72 75 63 74 20 61 64 64 72 69 6e 66 6f   struct addrinfo
12a50 20 73 48 69 6e 74 73 3b 20 20 20 20 20 20 2f 2a   sHints;      /*
12a60 20 41 64 64 72 65 73 73 20 68 69 6e 74 73 20 2a   Address hints *
12a70 2f 0a 20 20 73 74 72 75 63 74 20 61 64 64 72 69  /.  struct addri
12a80 6e 66 6f 20 2a 70 41 64 64 72 73 2c 20 2a 70 3b  nfo *pAddrs, *p;
12a90 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b   /* */.  int rc;
12aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ab0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
12ac0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  code */.  int i,
12ad0 20 6e 3b 0a 20 20 69 6e 74 20 6d 61 78 46 64 20   n;.  int maxFd 
12ae0 3d 20 2d 31 3b 0a 20 20 0a 20 20 6d 65 6d 73 65  = -1;.  .  memse
12af0 74 28 26 73 48 69 6e 74 73 2c 20 30 2c 20 73 69  t(&sHints, 0, si
12b00 7a 65 6f 66 28 73 48 69 6e 74 73 29 29 3b 0a 20  zeof(sHints));. 
12b10 20 69 66 28 20 69 70 76 34 4f 6e 6c 79 20 29 7b   if( ipv4Only ){
12b20 0a 20 20 20 20 73 48 69 6e 74 73 2e 61 69 5f 66  .    sHints.ai_f
12b30 61 6d 69 6c 79 20 3d 20 50 46 5f 49 4e 45 54 3b  amily = PF_INET;
12b40 0a 20 20 20 20 2f 2a 70 72 69 6e 74 66 28 22 69  .    /*printf("i
12b50 70 76 34 20 6f 6e 6c 79 5c 6e 22 29 3b 2a 2f 0a  pv4 only\n");*/.
12b60 20 20 7d 65 6c 73 65 20 69 66 28 20 69 70 76 36    }else if( ipv6
12b70 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 48 69 6e  Only ){.    sHin
12b80 74 73 2e 61 69 5f 66 61 6d 69 6c 79 20 3d 20 50  ts.ai_family = P
12b90 46 5f 49 4e 45 54 36 3b 0a 20 20 20 20 2f 2a 70  F_INET6;.    /*p
12ba0 72 69 6e 74 66 28 22 69 70 76 36 20 6f 6e 6c 79  rintf("ipv6 only
12bb0 5c 6e 22 29 3b 2a 2f 0a 20 20 7d 65 6c 73 65 7b  \n");*/.  }else{
12bc0 0a 20 20 20 20 73 48 69 6e 74 73 2e 61 69 5f 66  .    sHints.ai_f
12bd0 61 6d 69 6c 79 20 3d 20 50 46 5f 55 4e 53 50 45  amily = PF_UNSPE
12be0 43 3b 0a 20 20 7d 0a 20 20 73 48 69 6e 74 73 2e  C;.  }.  sHints.
12bf0 61 69 5f 73 6f 63 6b 74 79 70 65 20 3d 20 53 4f  ai_socktype = SO
12c00 43 4b 5f 53 54 52 45 41 4d 3b 0a 20 20 73 48 69  CK_STREAM;.  sHi
12c10 6e 74 73 2e 61 69 5f 66 6c 61 67 73 20 3d 20 41  nts.ai_flags = A
12c20 49 5f 50 41 53 53 49 56 45 3b 0a 20 20 73 48 69  I_PASSIVE;.  sHi
12c30 6e 74 73 2e 61 69 5f 70 72 6f 74 6f 63 6f 6c 20  nts.ai_protocol 
12c40 3d 20 30 3b 0a 20 20 72 63 20 3d 20 67 65 74 61  = 0;.  rc = geta
12c50 64 64 72 69 6e 66 6f 28 6c 6f 63 61 6c 4f 6e 6c  ddrinfo(localOnl
12c60 79 20 3f 20 22 6c 6f 63 61 6c 68 6f 73 74 22 3a  y ? "localhost":
12c70 20 30 2c 20 7a 50 6f 72 74 2c 20 26 73 48 69 6e   0, zPort, &sHin
12c80 74 73 2c 20 26 70 41 64 64 72 73 29 3b 0a 20 20  ts, &pAddrs);.  
12c90 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 66 70  if( rc ){.    fp
12ca0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 63  rintf(stderr, "c
12cb0 6f 75 6c 64 20 6e 6f 74 20 67 65 74 20 61 64 64  ould not get add
12cc0 72 20 69 6e 66 6f 3a 20 25 73 22 2c 20 0a 20 20  r info: %s", .  
12cd0 20 20 20 20 20 20 20 20 20 20 72 63 21 3d 45 41            rc!=EA
12ce0 49 5f 53 59 53 54 45 4d 20 3f 20 67 61 69 5f 73  I_SYSTEM ? gai_s
12cf0 74 72 65 72 72 6f 72 28 72 63 29 20 3a 20 73 74  trerror(rc) : st
12d00 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 29 3b 0a  rerror(errno));.
12d10 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
12d20 7d 0a 20 20 66 6f 72 28 6e 3d 30 2c 20 70 3d 70  }.  for(n=0, p=p
12d30 41 64 64 72 73 3b 20 6e 3c 28 69 6e 74 29 28 73  Addrs; n<(int)(s
12d40 69 7a 65 6f 66 28 6c 69 73 74 65 6e 65 72 29 2f  izeof(listener)/
12d50 73 69 7a 65 6f 66 28 6c 69 73 74 65 6e 65 72 5b  sizeof(listener[
12d60 30 5d 29 29 20 26 26 20 70 21 3d 30 3b 0a 20 20  0])) && p!=0;.  
12d70 20 20 20 20 20 20 70 3d 70 2d 3e 61 69 5f 6e 65        p=p->ai_ne
12d80 78 74 29 7b 0a 20 20 20 20 6c 69 73 74 65 6e 65  xt){.    listene
12d90 72 5b 6e 5d 20 3d 20 73 6f 63 6b 65 74 28 70 2d  r[n] = socket(p-
12da0 3e 61 69 5f 66 61 6d 69 6c 79 2c 20 70 2d 3e 61  >ai_family, p->a
12db0 69 5f 73 6f 63 6b 74 79 70 65 2c 20 70 2d 3e 61  i_socktype, p->a
12dc0 69 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 20 20 20  i_protocol);.   
12dd0 20 69 66 28 20 6c 69 73 74 65 6e 65 72 5b 6e 5d   if( listener[n]
12de0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  >=0 ){.      /* 
12df0 69 66 20 77 65 20 63 61 6e 27 74 20 74 65 72 6d  if we can't term
12e00 69 6e 61 74 65 20 6e 69 63 65 6c 79 2c 20 61 74  inate nicely, at
12e10 20 6c 65 61 73 74 20 61 6c 6c 6f 77 20 74 68 65   least allow the
12e20 20 73 6f 63 6b 65 74 20 74 6f 20 62 65 20 72 65   socket to be re
12e30 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 65  used */.      se
12e40 74 73 6f 63 6b 6f 70 74 28 6c 69 73 74 65 6e 65  tsockopt(listene
12e50 72 5b 6e 5d 2c 20 53 4f 4c 5f 53 4f 43 4b 45 54  r[n], SOL_SOCKET
12e60 2c 20 53 4f 5f 52 45 55 53 45 41 44 44 52 2c 26  , SO_REUSEADDR,&
12e70 6f 70 74 2c 20 73 69 7a 65 6f 66 28 6f 70 74 29  opt, sizeof(opt)
12e80 29 3b 0a 20 20 20 20 20 20 0a 23 69 66 20 64 65  );.      .#if de
12e90 66 69 6e 65 64 28 49 50 56 36 5f 56 36 4f 4e 4c  fined(IPV6_V6ONL
12ea0 59 29 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  Y).      if( p->
12eb0 61 69 5f 66 61 6d 69 6c 79 3d 3d 41 46 5f 49 4e  ai_family==AF_IN
12ec0 45 54 36 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ET6 ){.        i
12ed0 6e 74 20 76 36 6f 6e 6c 79 20 3d 20 31 3b 0a 20  nt v6only = 1;. 
12ee0 20 20 20 20 20 20 20 73 65 74 73 6f 63 6b 6f 70         setsockop
12ef0 74 28 6c 69 73 74 65 6e 65 72 5b 6e 5d 2c 20 49  t(listener[n], I
12f00 50 50 52 4f 54 4f 5f 49 50 56 36 2c 20 49 50 56  PPROTO_IPV6, IPV
12f10 36 5f 56 36 4f 4e 4c 59 2c 0a 20 20 20 20 20 20  6_V6ONLY,.      
12f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 76                &v
12f30 36 6f 6e 6c 79 2c 20 73 69 7a 65 6f 66 28 76 36  6only, sizeof(v6
12f40 6f 6e 6c 79 29 29 3b 0a 20 20 20 20 20 20 7d 0a  only));.      }.
12f50 23 65 6e 64 69 66 0a 20 20 20 20 20 20 0a 20 20  #endif.      .  
12f60 20 20 20 20 69 66 28 20 62 69 6e 64 28 6c 69 73      if( bind(lis
12f70 74 65 6e 65 72 5b 6e 5d 2c 20 70 2d 3e 61 69 5f  tener[n], p->ai_
12f80 61 64 64 72 2c 20 70 2d 3e 61 69 5f 61 64 64 72  addr, p->ai_addr
12f90 6c 65 6e 29 3c 30 20 29 7b 0a 20 20 20 20 20 20  len)<0 ){.      
12fa0 20 20 70 72 69 6e 74 66 28 22 62 69 6e 64 20 66    printf("bind f
12fb0 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20 73 74  ailed: %s\n", st
12fc0 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 29 3b 0a  rerror(errno));.
12fd0 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 6c 69          close(li
12fe0 73 74 65 6e 65 72 5b 6e 5d 29 3b 0a 20 20 20 20  stener[n]);.    
12ff0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
13000 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
13010 6c 69 73 74 65 6e 28 6c 69 73 74 65 6e 65 72 5b  listen(listener[
13020 6e 5d 2c 20 32 30 29 3c 30 20 29 7b 0a 20 20 20  n], 20)<0 ){.   
13030 20 20 20 20 20 70 72 69 6e 74 66 28 22 6c 69 73       printf("lis
13040 74 65 6e 28 29 20 66 61 69 6c 65 64 3a 20 25 73  ten() failed: %s
13050 5c 6e 22 2c 20 73 74 72 65 72 72 6f 72 28 65 72  \n", strerror(er
13060 72 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 63  rno));.        c
13070 6c 6f 73 65 28 6c 69 73 74 65 6e 65 72 5b 6e 5d  lose(listener[n]
13080 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
13090 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
130a0 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     n++;.    }.  
130b0 7d 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a  }.  if( n==0 ){.
130c0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
130d0 72 72 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e  rr, "cannot open
130e0 20 61 6e 79 20 73 6f 63 6b 65 74 73 5c 6e 22 29   any sockets\n")
130f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
13100 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 31 20    }..  while( 1 
13110 29 7b 0a 20 20 20 20 69 66 28 20 6e 63 68 69 6c  ){.    if( nchil
13120 64 72 65 6e 3e 4d 41 58 5f 50 41 52 41 4c 4c 45  dren>MAX_PARALLE
13130 4c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 6c  L ){.      /* Sl
13140 6f 77 20 64 6f 77 6e 20 69 66 20 63 6f 6e 6e 65  ow down if conne
13150 63 74 69 6f 6e 73 20 61 72 65 20 61 72 72 69 76  ctions are arriv
13160 69 6e 67 20 74 6f 6f 20 66 61 73 74 20 2a 2f 0a  ing too fast */.
13170 20 20 20 20 20 20 73 6c 65 65 70 28 20 6e 63 68        sleep( nch
13180 69 6c 64 72 65 6e 2d 4d 41 58 5f 50 41 52 41 4c  ildren-MAX_PARAL
13190 4c 45 4c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  LEL );.    }.   
131a0 20 64 65 6c 61 79 2e 74 76 5f 73 65 63 20 3d 20   delay.tv_sec = 
131b0 36 30 3b 0a 20 20 20 20 64 65 6c 61 79 2e 74 76  60;.    delay.tv
131c0 5f 75 73 65 63 20 3d 20 30 3b 0a 20 20 20 20 46  _usec = 0;.    F
131d0 44 5f 5a 45 52 4f 28 26 72 65 61 64 66 64 73 29  D_ZERO(&readfds)
131e0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
131f0 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
13200 61 73 73 65 72 74 28 20 6c 69 73 74 65 6e 65 72  assert( listener
13210 5b 69 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  [i]>=0 );.      
13220 46 44 5f 53 45 54 28 20 6c 69 73 74 65 6e 65 72  FD_SET( listener
13230 5b 69 5d 2c 20 26 72 65 61 64 66 64 73 29 3b 0a  [i], &readfds);.
13240 20 20 20 20 20 20 69 66 28 20 6c 69 73 74 65 6e        if( listen
13250 65 72 5b 69 5d 3e 6d 61 78 46 64 20 29 20 6d 61  er[i]>maxFd ) ma
13260 78 46 64 20 3d 20 6c 69 73 74 65 6e 65 72 5b 69  xFd = listener[i
13270 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 6c  ];.    }.    sel
13280 65 63 74 28 20 6d 61 78 46 64 2b 31 2c 20 26 72  ect( maxFd+1, &r
13290 65 61 64 66 64 73 2c 20 30 2c 20 30 2c 20 26 64  eadfds, 0, 0, &d
132a0 65 6c 61 79 29 3b 0a 20 20 20 20 66 6f 72 28 69  elay);.    for(i
132b0 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
132c0 20 20 20 20 20 69 66 28 20 46 44 5f 49 53 53 45       if( FD_ISSE
132d0 54 28 6c 69 73 74 65 6e 65 72 5b 69 5d 2c 20 26  T(listener[i], &
132e0 72 65 61 64 66 64 73 29 20 29 7b 0a 20 20 20 20  readfds) ){.    
132f0 20 20 20 20 6c 65 6e 61 64 64 72 20 3d 20 73 69      lenaddr = si
13300 7a 65 6f 66 28 69 6e 61 64 64 72 29 3b 0a 20 20  zeof(inaddr);.  
13310 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
13320 20 3d 20 61 63 63 65 70 74 28 6c 69 73 74 65 6e   = accept(listen
13330 65 72 5b 69 5d 2c 20 26 69 6e 61 64 64 72 2e 73  er[i], &inaddr.s
13340 61 2c 20 26 6c 65 6e 61 64 64 72 29 3b 0a 20 20  a, &lenaddr);.  
13350 20 20 20 20 20 20 69 66 28 20 63 6f 6e 6e 65 63        if( connec
13360 74 69 6f 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20  tion>=0 ){.     
13370 20 20 20 20 20 63 68 69 6c 64 20 3d 20 66 6f 72       child = for
13380 6b 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  k();.          i
13390 66 28 20 63 68 69 6c 64 21 3d 30 20 29 7b 0a 20  f( child!=0 ){. 
133a0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63             if( c
133b0 68 69 6c 64 3e 30 20 29 20 6e 63 68 69 6c 64 72  hild>0 ) nchildr
133c0 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  en++;.          
133d0 20 20 63 6c 6f 73 65 28 63 6f 6e 6e 65 63 74 69    close(connecti
133e0 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  on);.           
133f0 20 2f 2a 20 70 72 69 6e 74 66 28 22 73 75 62 70   /* printf("subp
13400 72 6f 63 65 73 73 20 25 64 20 73 74 61 72 74 65  rocess %d starte
13410 64 2e 2e 2e 5c 6e 22 2c 20 63 68 69 6c 64 29 3b  d...\n", child);
13420 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
13430 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7d 65   */.          }e
13440 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
13450 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 2c 20 66   int nErr = 0, f
13460 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  d;.            c
13470 6c 6f 73 65 28 30 29 3b 0a 20 20 20 20 20 20 20  lose(0);.       
13480 20 20 20 20 20 66 64 20 3d 20 64 75 70 28 63 6f       fd = dup(co
13490 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  nnection);.     
134a0 20 20 20 20 20 20 20 69 66 28 20 66 64 21 3d 30         if( fd!=0
134b0 20 29 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20   ) nErr++;.     
134c0 20 20 20 20 20 20 20 63 6c 6f 73 65 28 31 29 3b         close(1);
134d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 64 20  .            fd 
134e0 3d 20 64 75 70 28 63 6f 6e 6e 65 63 74 69 6f 6e  = dup(connection
134f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
13500 66 28 20 66 64 21 3d 31 20 29 20 6e 45 72 72 2b  f( fd!=1 ) nErr+
13510 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  +;.            c
13520 6c 6f 73 65 28 63 6f 6e 6e 65 63 74 69 6f 6e 29  lose(connection)
13530 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
13540 74 75 72 6e 20 6e 45 72 72 3b 0a 20 20 20 20 20  turn nErr;.     
13550 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
13560 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
13570 2a 20 42 75 72 79 20 64 65 61 64 20 63 68 69 6c  * Bury dead chil
13580 64 72 65 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68  dren */.      wh
13590 69 6c 65 28 20 28 63 68 69 6c 64 20 3d 20 77 61  ile( (child = wa
135a0 69 74 70 69 64 28 30 2c 20 30 2c 20 57 4e 4f 48  itpid(0, 0, WNOH
135b0 41 4e 47 29 29 3e 30 20 29 7b 0a 20 20 20 20 20  ANG))>0 ){.     
135c0 20 20 20 2f 2a 20 70 72 69 6e 74 66 28 22 70 72     /* printf("pr
135d0 6f 63 65 73 73 20 25 64 20 65 6e 64 73 5c 6e 22  ocess %d ends\n"
135e0 2c 20 63 68 69 6c 64 29 3b 20 66 66 6c 75 73 68  , child); fflush
135f0 28 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 20  (stdout); */.   
13600 20 20 20 20 20 6e 63 68 69 6c 64 72 65 6e 2d 2d       nchildren--
13610 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13620 20 20 7d 0a 20 20 2f 2a 20 4e 4f 54 20 52 45 41    }.  /* NOT REA
13630 43 48 45 44 20 2a 2f 20 20 0a 20 20 65 78 69 74  CHED */  .  exit
13640 28 31 29 3b 0a 7d 0a 0a 0a 69 6e 74 20 6d 61 69  (1);.}...int mai
13650 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72  n(int argc, char
13660 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74 20   **argv){.  int 
13670 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
13680 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
13690 75 6e 74 65 72 20 2a 2f 0a 20 20 63 68 61 72 20  unter */.  char 
136a0 2a 7a 50 65 72 6d 55 73 65 72 20 3d 20 30 3b 20  *zPermUser = 0; 
136b0 20 20 20 20 20 2f 2a 20 52 75 6e 20 64 61 65 6d       /* Run daem
136c0 6f 6e 20 77 69 74 68 20 74 68 69 73 20 75 73 65  on with this use
136d0 72 27 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  r's permissions 
136e0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
136f0 2a 7a 50 6f 72 74 20 3d 20 30 3b 20 20 20 20 2f  *zPort = 0;    /
13700 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 48  * Implement an H
13710 54 54 50 20 73 65 72 76 65 72 20 70 72 6f 63 65  TTP server proce
13720 73 73 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 43  ss */.  int useC
13730 68 72 6f 6f 74 4a 61 69 6c 20 3d 20 31 3b 20 20  hrootJail = 1;  
13740 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65    /* True to use
13750 20 61 20 63 68 61 6e 67 65 2d 72 6f 6f 74 20 6a   a change-root j
13760 61 69 6c 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ail */.  struct 
13770 70 61 73 73 77 64 20 2a 70 77 64 20 3d 20 30 3b  passwd *pwd = 0;
13780 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
13790 6e 20 61 62 6f 75 74 20 74 68 65 20 75 73 65 72  n about the user
137a0 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64   */..  /* Record
137b0 20 74 68 65 20 74 69 6d 65 20 77 68 65 6e 20 70   the time when p
137c0 72 6f 63 65 73 73 69 6e 67 20 62 65 67 69 6e 73  rocessing begins
137d0 2e 0a 20 20 2a 2f 0a 20 20 67 65 74 74 69 6d 65  ..  */.  gettime
137e0 6f 66 64 61 79 28 26 62 65 67 69 6e 54 69 6d 65  ofday(&beginTime
137f0 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73  , 0);..  /* Pars
13800 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61  e command-line a
13810 72 67 75 6d 65 6e 74 73 0a 20 20 2a 2f 0a 20 20  rguments.  */.  
13820 77 68 69 6c 65 28 20 61 72 67 63 3e 31 20 26 26  while( argc>1 &&
13830 20 61 72 67 76 5b 31 5d 5b 30 5d 3d 3d 27 2d 27   argv[1][0]=='-'
13840 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20   ){.    char *z 
13850 3d 20 61 72 67 76 5b 31 5d 3b 0a 20 20 20 20 63  = argv[1];.    c
13860 68 61 72 20 2a 7a 41 72 67 20 3d 20 61 72 67 63  har *zArg = argc
13870 3e 3d 33 20 3f 20 61 72 67 76 5b 32 5d 20 3a 20  >=3 ? argv[2] : 
13880 22 30 22 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30  "0";.    if( z[0
13890 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d  ]=='-' && z[1]==
138a0 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69  '-' ) z++;.    i
138b0 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 75 73  f( strcmp(z,"-us
138c0 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  er")==0 ){.     
138d0 20 7a 50 65 72 6d 55 73 65 72 20 3d 20 7a 41 72   zPermUser = zAr
138e0 67 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  g;.    }else if(
138f0 20 73 74 72 63 6d 70 28 7a 2c 22 2d 72 6f 6f 74   strcmp(z,"-root
13900 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  ")==0 ){.      z
13910 52 6f 6f 74 20 3d 20 7a 41 72 67 3b 0a 20 20 20  Root = zArg;.   
13920 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
13930 70 28 7a 2c 22 2d 6c 6f 67 66 69 6c 65 22 29 3d  p(z,"-logfile")=
13940 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 4c 6f 67  =0 ){.      zLog
13950 46 69 6c 65 20 3d 20 7a 41 72 67 3b 0a 20 20 20  File = zArg;.   
13960 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
13970 70 28 7a 2c 22 2d 6d 61 78 2d 61 67 65 22 29 3d  p(z,"-max-age")=
13980 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 78 41 67  =0 ){.      mxAg
13990 65 20 3d 20 61 74 6f 69 28 7a 41 72 67 29 3b 0a  e = atoi(zArg);.
139a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
139b0 72 63 6d 70 28 7a 2c 22 2d 68 74 74 70 73 22 29  rcmp(z,"-https")
139c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 73 65  ==0 ){.      use
139d0 48 74 74 70 73 20 3d 20 61 74 6f 69 28 7a 41 72  Https = atoi(zAr
139e0 67 29 3b 0a 20 20 20 20 20 20 7a 48 74 74 70 20  g);.      zHttp 
139f0 3d 20 75 73 65 48 74 74 70 73 20 3f 20 22 68 74  = useHttps ? "ht
13a00 74 70 73 22 20 3a 20 22 68 74 74 70 22 3b 0a 20  tps" : "http";. 
13a10 20 20 20 20 20 69 66 28 20 75 73 65 48 74 74 70       if( useHttp
13a20 73 20 29 20 7a 52 65 6d 6f 74 65 41 64 64 72 20  s ) zRemoteAddr 
13a30 3d 20 67 65 74 65 6e 76 28 22 52 45 4d 4f 54 45  = getenv("REMOTE
13a40 5f 48 4f 53 54 22 29 3b 0a 20 20 20 20 7d 65 6c  _HOST");.    }el
13a50 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
13a60 20 22 2d 70 6f 72 74 22 29 3d 3d 30 20 29 7b 0a   "-port")==0 ){.
13a70 20 20 20 20 20 20 7a 50 6f 72 74 20 3d 20 7a 41        zPort = zA
13a80 72 67 3b 0a 20 20 20 20 20 20 73 74 61 6e 64 61  rg;.      standa
13a90 6c 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65  lone = 1;.    }e
13aa0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
13ab0 2c 20 22 2d 66 61 6d 69 6c 79 22 29 3d 3d 30 20  , "-family")==0 
13ac0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
13ad0 63 6d 70 28 7a 41 72 67 2c 20 22 69 70 76 34 22  cmp(zArg, "ipv4"
13ae0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
13af0 69 70 76 34 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  ipv4Only = 1;.  
13b00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
13b10 72 63 6d 70 28 7a 41 72 67 2c 20 22 69 70 76 36  rcmp(zArg, "ipv6
13b20 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
13b30 20 69 70 76 36 4f 6e 6c 79 20 3d 20 31 3b 0a 20   ipv6Only = 1;. 
13b40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13b50 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28      Malfunction(
13b60 35 30 30 2c 20 20 2f 2a 20 4c 4f 47 3a 20 75 6e  500,  /* LOG: un
13b70 6b 6e 6f 77 6e 20 49 50 20 70 72 6f 74 6f 63 6f  known IP protoco
13b80 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  l */.           
13b90 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77           "unknow
13ba0 6e 20 49 50 20 70 72 6f 74 6f 63 6f 6c 3a 20 5b  n IP protocol: [
13bb0 25 73 5d 5c 6e 22 2c 20 7a 41 72 67 29 3b 0a 20  %s]\n", zArg);. 
13bc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
13bd0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22   if( strcmp(z, "
13be0 2d 6a 61 69 6c 22 29 3d 3d 30 20 29 7b 0a 20 20  -jail")==0 ){.  
13bf0 20 20 20 20 69 66 28 20 61 74 6f 69 28 7a 41 72      if( atoi(zAr
13c00 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  g)==0 ){.       
13c10 20 75 73 65 43 68 72 6f 6f 74 4a 61 69 6c 20 3d   useChrootJail =
13c20 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
13c30 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
13c40 28 7a 2c 20 22 2d 64 65 62 75 67 22 29 3d 3d 30  (z, "-debug")==0
13c50 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 74   ){.      if( at
13c60 6f 69 28 7a 41 72 67 29 20 29 7b 0a 20 20 20 20  oi(zArg) ){.    
13c70 20 20 20 20 75 73 65 54 69 6d 65 6f 75 74 20 3d      useTimeout =
13c80 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
13c90 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
13ca0 28 7a 2c 20 22 2d 69 6e 70 75 74 22 29 3d 3d 30  (z, "-input")==0
13cb0 20 29 7b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65   ){.      fclose
13cc0 28 73 74 64 69 6e 29 3b 0a 20 20 20 20 20 20 73  (stdin);.      s
13cd0 74 64 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 41 72  tdin = fopen(zAr
13ce0 67 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 20 20  g, "rb");.      
13cf0 69 66 28 20 73 74 64 69 6e 3d 3d 30 20 29 7b 0a  if( stdin==0 ){.
13d00 20 20 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74          Malfunct
13d10 69 6f 6e 28 35 30 31 2c 20 2f 2a 20 4c 4f 47 3a  ion(501, /* LOG:
13d20 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 2d 2d 69   cannot open --i
13d30 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20  nput file */.   
13d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d50 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 2d 2d   "cannot open --
13d60 69 6e 70 75 74 20 66 69 6c 65 20 5c 22 25 73 5c  input file \"%s\
13d70 22 5c 6e 22 2c 20 7a 41 72 67 29 3b 0a 20 20 20  "\n", zArg);.   
13d80 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
13d90 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 64  f( strcmp(z, "-d
13da0 61 74 65 74 65 73 74 22 29 3d 3d 30 20 29 7b 0a  atetest")==0 ){.
13db0 20 20 20 20 20 20 54 65 73 74 50 61 72 73 65 52        TestParseR
13dc0 66 63 38 32 32 44 61 74 65 28 29 3b 0a 20 20 20  fc822Date();.   
13dd0 20 20 20 70 72 69 6e 74 66 28 22 4f 6b 5c 6e 22     printf("Ok\n"
13de0 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 30 29  );.      exit(0)
13df0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13e00 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 35     Malfunction(5
13e10 31 30 2c 20 2f 2a 20 4c 4f 47 3a 20 75 6e 6b 6e  10, /* LOG: unkn
13e20 6f 77 6e 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  own command-line
13e30 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20 6c 61 75   argument on lau
13e40 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  nch */.         
13e50 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77           "unknow
13e60 6e 20 61 72 67 75 6d 65 6e 74 3a 20 5b 25 73 5d  n argument: [%s]
13e70 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20  \n", z);.    }. 
13e80 20 20 20 61 72 67 76 20 2b 3d 20 32 3b 0a 20 20     argv += 2;.  
13e90 20 20 61 72 67 63 20 2d 3d 20 32 3b 0a 20 20 7d    argc -= 2;.  }
13ea0 0a 20 20 69 66 28 20 7a 52 6f 6f 74 3d 3d 30 20  .  if( zRoot==0 
13eb0 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61 6e 64  ){.    if( stand
13ec0 61 6c 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 7a  alone ){.      z
13ed0 52 6f 6f 74 20 3d 20 22 2e 22 3b 0a 20 20 20 20  Root = ".";.    
13ee0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d 61 6c  }else{.      Mal
13ef0 66 75 6e 63 74 69 6f 6e 28 35 32 30 2c 20 2f 2a  function(520, /*
13f00 20 4c 4f 47 3a 20 2d 2d 72 6f 6f 74 20 61 72 67   LOG: --root arg
13f10 75 6d 65 6e 74 20 6d 69 73 73 69 6e 67 20 2a 2f  ument missing */
13f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13f30 20 20 20 22 6e 6f 20 2d 2d 72 6f 6f 74 20 73 70     "no --root sp
13f40 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 7d  ecified");.    }
13f50 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 43 68 61  .  }.  .  /* Cha
13f60 6e 67 65 20 64 69 72 65 63 74 6f 72 69 65 73 20  nge directories 
13f70 74 6f 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74  to the root of t
13f80 68 65 20 48 54 54 50 20 66 69 6c 65 73 79 73 74  he HTTP filesyst
13f90 65 6d 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63  em.  Then.  ** c
13fa0 72 65 61 74 65 20 61 20 63 68 72 6f 6f 74 20 6a  reate a chroot j
13fb0 61 69 6c 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a  ail there..  */.
13fc0 20 20 69 66 28 20 63 68 64 69 72 28 7a 52 6f 6f    if( chdir(zRoo
13fd0 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 4d 61 6c  t)!=0 ){.    Mal
13fe0 66 75 6e 63 74 69 6f 6e 28 35 33 30 2c 20 2f 2a  function(530, /*
13ff0 20 4c 4f 47 3a 20 63 68 64 69 72 28 29 20 66 61   LOG: chdir() fa
14000 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  iled */.        
14010 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20          "cannot 
14020 63 68 61 6e 67 65 20 74 6f 20 64 69 72 65 63 74  change to direct
14030 6f 72 79 20 5b 25 73 5d 22 2c 20 7a 52 6f 6f 74  ory [%s]", zRoot
14040 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74  );.  }..  /* Get
14050 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
14060 75 74 20 74 68 65 20 75 73 65 72 20 69 66 20 61  ut the user if a
14070 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 66  vailable */.  if
14080 28 20 7a 50 65 72 6d 55 73 65 72 20 29 20 70 77  ( zPermUser ) pw
14090 64 20 3d 20 67 65 74 70 77 6e 61 6d 28 7a 50 65  d = getpwnam(zPe
140a0 72 6d 55 73 65 72 29 3b 0a 0a 20 20 2f 2a 20 45  rmUser);..  /* E
140b0 6e 74 65 72 20 74 68 65 20 63 68 72 6f 6f 74 20  nter the chroot 
140c0 6a 61 69 6c 20 69 66 20 72 65 71 75 65 73 74 65  jail if requeste
140d0 64 20 2a 2f 20 20 0a 20 20 69 66 28 20 7a 50 65  d */  .  if( zPe
140e0 72 6d 55 73 65 72 20 26 26 20 75 73 65 43 68 72  rmUser && useChr
140f0 6f 6f 74 4a 61 69 6c 20 26 26 20 67 65 74 75 69  ootJail && getui
14100 64 28 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  d()==0 ){.    if
14110 28 20 63 68 72 6f 6f 74 28 22 2e 22 29 3c 30 20  ( chroot(".")<0 
14120 29 7b 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e 63  ){.      Malfunc
14130 74 69 6f 6e 28 35 34 30 2c 20 2f 2a 20 4c 4f 47  tion(540, /* LOG
14140 3a 20 63 68 72 6f 6f 74 28 29 20 66 61 69 6c 65  : chroot() faile
14150 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  d */.           
14160 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74         "unable t
14170 6f 20 63 72 65 61 74 65 20 63 68 72 6f 6f 74 20  o create chroot 
14180 6a 61 69 6c 22 29 3b 0a 20 20 20 20 7d 65 6c 73  jail");.    }els
14190 65 7b 0a 20 20 20 20 20 20 7a 52 6f 6f 74 20 3d  e{.      zRoot =
141a0 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   "";.    }.  }..
141b0 20 20 2f 2a 20 41 63 74 69 76 61 74 65 20 74 68    /* Activate th
141c0 65 20 73 65 72 76 65 72 2c 20 69 66 20 72 65 71  e server, if req
141d0 75 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  uested */.  if( 
141e0 7a 50 6f 72 74 20 26 26 20 68 74 74 70 5f 73 65  zPort && http_se
141f0 72 76 65 72 28 7a 50 6f 72 74 2c 20 30 29 20 29  rver(zPort, 0) )
14200 7b 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f  {.    Malfunctio
14210 6e 28 35 35 30 2c 20 2f 2a 20 4c 4f 47 3a 20 73  n(550, /* LOG: s
14220 65 72 76 65 72 20 73 74 61 72 74 75 70 20 66 61  erver startup fa
14230 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  iled */.        
14240 20 20 20 20 20 20 20 20 22 66 61 69 6c 65 64 20          "failed 
14250 74 6f 20 73 74 61 72 74 20 73 65 72 76 65 72 22  to start server"
14260 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 72 6f  );.  }..  /* Dro
14270 70 20 72 6f 6f 74 20 70 72 69 76 69 6c 65 67 65  p root privilege
14280 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 50  s..  */.  if( zP
14290 65 72 6d 55 73 65 72 20 29 7b 0a 20 20 20 20 69  ermUser ){.    i
142a0 66 28 20 70 77 64 20 29 7b 0a 20 20 20 20 20 20  f( pwd ){.      
142b0 69 66 28 20 73 65 74 67 69 64 28 70 77 64 2d 3e  if( setgid(pwd->
142c0 70 77 5f 67 69 64 29 20 29 7b 0a 20 20 20 20 20  pw_gid) ){.     
142d0 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 35     Malfunction(5
142e0 36 30 2c 20 2f 2a 20 4c 4f 47 3a 20 73 65 74 67  60, /* LOG: setg
142f0 69 64 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20  id() failed */. 
14300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14310 20 20 20 22 63 61 6e 6e 6f 74 20 73 65 74 20 67     "cannot set g
14320 72 6f 75 70 2d 69 64 20 74 6f 20 25 64 22 2c 20  roup-id to %d", 
14330 70 77 64 2d 3e 70 77 5f 67 69 64 29 3b 0a 20 20  pwd->pw_gid);.  
14340 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
14350 73 65 74 75 69 64 28 70 77 64 2d 3e 70 77 5f 75  setuid(pwd->pw_u
14360 69 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 4d  id) ){.        M
14370 61 6c 66 75 6e 63 74 69 6f 6e 28 35 37 30 2c 20  alfunction(570, 
14380 2f 2a 20 4c 4f 47 3a 20 73 65 74 75 69 64 28 29  /* LOG: setuid()
14390 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
143a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
143b0 63 61 6e 6e 6f 74 20 73 65 74 20 75 73 65 72 2d  cannot set user-
143c0 69 64 20 74 6f 20 25 64 22 2c 20 70 77 64 2d 3e  id to %d", pwd->
143d0 70 77 5f 75 69 64 29 3b 0a 20 20 20 20 20 20 7d  pw_uid);.      }
143e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
143f0 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 35 38    Malfunction(58
14400 30 2c 20 2f 2a 20 4c 4f 47 3a 20 75 6e 6b 6e 6f  0, /* LOG: unkno
14410 77 6e 20 75 73 65 72 20 2a 2f 0a 20 20 20 20 20  wn user */.     
14420 20 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f               "no
14430 20 73 75 63 68 20 75 73 65 72 20 5b 25 73 5d 22   such user [%s]"
14440 2c 20 7a 50 65 72 6d 55 73 65 72 29 3b 0a 20 20  , zPermUser);.  
14450 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 67 65    }.  }.  if( ge
14460 74 75 69 64 28 29 3d 3d 30 20 29 7b 0a 20 20 20  tuid()==0 ){.   
14470 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 35 39 30   Malfunction(590
14480 2c 20 2f 2a 20 4c 4f 47 3a 20 63 61 6e 6e 6f 74  , /* LOG: cannot
14490 20 72 75 6e 20 61 73 20 72 6f 6f 74 20 2a 2f 0a   run as root */.
144a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144b0 22 63 61 6e 6e 6f 74 20 72 75 6e 20 61 73 20 72  "cannot run as r
144c0 6f 6f 74 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  oot");.  }..  /*
144d0 20 47 65 74 20 74 68 65 20 49 50 20 61 64 64 72   Get the IP addr
144e0 65 73 73 20 66 72 6f 6d 20 77 68 65 6e 63 65 20  ess from whence 
144f0 74 68 65 20 72 65 71 75 65 73 74 20 6f 72 69 67  the request orig
14500 69 6e 61 74 65 73 0a 20 20 2a 2f 0a 20 20 69 66  inates.  */.  if
14510 28 20 7a 52 65 6d 6f 74 65 41 64 64 72 3d 3d 30  ( zRemoteAddr==0
14520 20 29 7b 0a 20 20 20 20 61 64 64 72 65 73 73 20   ){.    address 
14530 72 65 6d 6f 74 65 41 64 64 72 3b 0a 20 20 20 20  remoteAddr;.    
14540 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 73 69 7a  unsigned int siz
14550 65 20 3d 20 73 69 7a 65 6f 66 28 72 65 6d 6f 74  e = sizeof(remot
14560 65 41 64 64 72 29 3b 0a 20 20 20 20 63 68 61 72  eAddr);.    char
14570 20 7a 48 6f 73 74 5b 4e 49 5f 4d 41 58 48 4f 53   zHost[NI_MAXHOS
14580 54 5d 3b 0a 20 20 20 20 69 66 28 20 67 65 74 70  T];.    if( getp
14590 65 65 72 6e 61 6d 65 28 30 2c 20 26 72 65 6d 6f  eername(0, &remo
145a0 74 65 41 64 64 72 2e 73 61 2c 20 26 73 69 7a 65  teAddr.sa, &size
145b0 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 65  )>=0 ){.      ge
145c0 74 6e 61 6d 65 69 6e 66 6f 28 26 72 65 6d 6f 74  tnameinfo(&remot
145d0 65 41 64 64 72 2e 73 61 2c 20 73 69 7a 65 2c 20  eAddr.sa, size, 
145e0 7a 48 6f 73 74 2c 20 73 69 7a 65 6f 66 28 7a 48  zHost, sizeof(zH
145f0 6f 73 74 29 2c 20 30 2c 20 30 2c 0a 20 20 20 20  ost), 0, 0,.    
14600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 49                NI
14610 5f 4e 55 4d 45 52 49 43 48 4f 53 54 29 3b 0a 20  _NUMERICHOST);. 
14620 20 20 20 20 20 7a 52 65 6d 6f 74 65 41 64 64 72       zRemoteAddr
14630 20 3d 20 53 74 72 44 75 70 28 7a 48 6f 73 74 29   = StrDup(zHost)
14640 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
14650 28 20 7a 52 65 6d 6f 74 65 41 64 64 72 21 3d 30  ( zRemoteAddr!=0
14660 0a 20 20 20 26 26 20 73 74 72 6e 63 6d 70 28 7a  .   && strncmp(z
14670 52 65 6d 6f 74 65 41 64 64 72 2c 20 22 3a 3a 66  RemoteAddr, "::f
14680 66 66 66 3a 22 2c 20 37 29 3d 3d 30 0a 20 20 20  fff:", 7)==0.   
14690 26 26 20 73 74 72 63 68 72 28 7a 52 65 6d 6f 74  && strchr(zRemot
146a0 65 41 64 64 72 2b 37 2c 20 27 3a 27 29 3d 3d 30  eAddr+7, ':')==0
146b0 0a 20 20 20 26 26 20 73 74 72 63 68 72 28 7a 52  .   && strchr(zR
146c0 65 6d 6f 74 65 41 64 64 72 2b 37 2c 20 27 2e 27  emoteAddr+7, '.'
146d0 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 7a 52  )!=0.  ){.    zR
146e0 65 6d 6f 74 65 41 64 64 72 20 2b 3d 20 37 3b 0a  emoteAddr += 7;.
146f0 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73    }..  /* Proces
14700 73 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 65  s the input stre
14710 61 6d 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  am */.  for(i=0;
14720 20 69 3c 31 30 30 3b 20 69 2b 2b 29 7b 0a 20 20   i<100; i++){.  
14730 20 20 50 72 6f 63 65 73 73 4f 6e 65 52 65 71 75    ProcessOneRequ
14740 65 73 74 28 30 29 3b 0a 20 20 7d 0a 20 20 50 72  est(0);.  }.  Pr
14750 6f 63 65 73 73 4f 6e 65 52 65 71 75 65 73 74 28  ocessOneRequest(
14760 31 29 3b 0a 20 20 65 78 69 74 28 30 29 3b 0a 7d  1);.  exit(0);.}
14770 0a 0a 23 69 66 20 30 0a 2f 2a 20 43 6f 70 79 2f  ..#if 0./* Copy/
14780 70 61 73 74 65 20 74 68 65 20 66 6f 6c 6c 6f 77  paste the follow
14790 69 6e 67 20 74 65 78 74 20 69 6e 74 6f 20 53 51  ing text into SQ
147a0 4c 69 74 65 20 74 6f 20 67 65 6e 65 72 61 74 65  Lite to generate
147b0 20 74 68 65 20 78 72 65 66 0a 2a 2a 20 74 61 62   the xref.** tab
147c0 6c 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  le that describe
147d0 73 20 61 6c 6c 20 65 72 72 6f 72 20 63 6f 64 65  s all error code
147e0 73 2e 0a 2a 2f 0a 42 45 47 49 4e 3b 0a 43 52 45  s..*/.BEGIN;.CRE
147f0 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54  ATE TABLE IF NOT
14800 20 45 58 49 53 54 53 20 78 72 65 66 28 6c 69 6e   EXISTS xref(lin
14810 65 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d  eno INTEGER PRIM
14820 41 52 59 20 4b 45 59 2c 20 64 65 73 63 20 54 45  ARY KEY, desc TE
14830 58 54 29 3b 0a 44 45 4c 45 54 45 20 46 52 4f 4d  XT);.DELETE FROM
14840 20 58 72 65 66 3b 0a 49 4e 53 45 52 54 20 49 4e   Xref;.INSERT IN
14850 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 31  TO xref VALUES(1
14860 30 30 2c 27 4d 61 6c 6c 6f 63 28 29 20 66 61 69  00,'Malloc() fai
14870 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  led');.INSERT IN
14880 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 31  TO xref VALUES(1
14890 31 30 2c 27 4e 6f 74 20 61 75 74 68 6f 72 69 7a  10,'Not authoriz
148a0 65 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54  ed');.INSERT INT
148b0 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 31 32  O xref VALUES(12
148c0 30 2c 27 43 47 49 20 45 72 72 6f 72 27 29 3b 0a  0,'CGI Error');.
148d0 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66  INSERT INTO xref
148e0 20 56 41 4c 55 45 53 28 31 33 30 2c 27 54 69 6d   VALUES(130,'Tim
148f0 65 6f 75 74 27 29 3b 0a 49 4e 53 45 52 54 20 49  eout');.INSERT I
14900 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28  NTO xref VALUES(
14910 31 34 30 2c 27 43 47 49 20 73 63 72 69 70 74 20  140,'CGI script 
14920 69 73 20 77 72 69 74 61 62 6c 65 27 29 3b 0a 49  is writable');.I
14930 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
14940 56 41 4c 55 45 53 28 31 35 30 2c 27 43 61 6e 6e  VALUES(150,'Cann
14950 6f 74 20 6f 70 65 6e 20 2d 61 75 74 68 20 66 69  ot open -auth fi
14960 6c 65 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54  le');.INSERT INT
14970 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 31 36  O xref VALUES(16
14980 30 2c 27 68 74 74 70 20 72 65 71 75 65 73 74 20  0,'http request 
14990 6f 6e 20 68 74 74 70 73 2d 6f 6e 6c 79 20 70 61  on https-only pa
149a0 67 65 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54  ge');.INSERT INT
149b0 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 31 37  O xref VALUES(17
149c0 30 2c 27 2d 61 75 74 68 20 72 65 64 69 72 65 63  0,'-auth redirec
149d0 74 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f  t');.INSERT INTO
149e0 20 78 72 65 66 20 56 41 4c 55 45 53 28 31 38 30   xref VALUES(180
149f0 2c 27 6d 61 6c 66 6f 72 6d 65 64 20 65 6e 74 72  ,'malformed entr
14a00 79 20 69 6e 20 2d 61 75 74 68 20 66 69 6c 65 27  y in -auth file'
14a10 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  );.INSERT INTO x
14a20 72 65 66 20 56 41 4c 55 45 53 28 31 39 30 2c 27  ref VALUES(190,'
14a30 63 68 64 69 72 28 29 20 66 61 69 6c 65 64 27 29  chdir() failed')
14a40 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72  ;.INSERT INTO xr
14a50 65 66 20 56 41 4c 55 45 53 28 32 30 30 2c 27 62  ef VALUES(200,'b
14a60 61 64 20 70 72 6f 74 6f 63 6f 6c 20 69 6e 20 48  ad protocol in H
14a70 54 54 50 20 68 65 61 64 65 72 27 29 3b 0a 49 4e  TTP header');.IN
14a80 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56  SERT INTO xref V
14a90 41 4c 55 45 53 28 32 31 30 2c 27 45 6d 70 74 79  ALUES(210,'Empty
14aa0 20 72 65 71 75 65 73 74 20 55 52 49 27 29 3b 0a   request URI');.
14ab0 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66  INSERT INTO xref
14ac0 20 56 41 4c 55 45 53 28 32 32 30 2c 27 55 6e 6b   VALUES(220,'Unk
14ad0 6e 6f 77 6e 20 72 65 71 75 65 73 74 20 6d 65 74  nown request met
14ae0 68 6f 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  hod');.INSERT IN
14af0 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 32  TO xref VALUES(2
14b00 33 30 2c 27 52 65 66 65 72 72 65 72 20 69 73 20  30,'Referrer is 
14b10 64 65 76 69 64 73 2e 6e 65 74 27 29 3b 0a 49 4e  devids.net');.IN
14b20 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56  SERT INTO xref V
14b30 41 4c 55 45 53 28 32 34 30 2c 27 49 6c 6c 65 67  ALUES(240,'Illeg
14b40 61 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 48 4f  al content in HO
14b50 53 54 3a 20 70 61 72 61 6d 65 74 65 72 27 29 3b  ST: parameter');
14b60 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65  .INSERT INTO xre
14b70 66 20 56 41 4c 55 45 53 28 32 35 30 2c 27 44 69  f VALUES(250,'Di
14b80 73 61 6c 6c 6f 77 65 64 20 75 73 65 72 20 61 67  sallowed user ag
14b90 65 6e 74 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  ent');.INSERT IN
14ba0 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 32  TO xref VALUES(2
14bb0 36 30 2c 27 44 69 73 61 6c 6c 6f 77 65 64 20 72  60,'Disallowed r
14bc0 65 66 65 72 72 65 72 27 29 3b 0a 49 4e 53 45 52  eferrer');.INSER
14bd0 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
14be0 45 53 28 32 37 30 2c 27 52 65 71 75 65 73 74 20  ES(270,'Request 
14bf0 74 6f 6f 20 6c 61 72 67 65 27 29 3b 0a 49 4e 53  too large');.INS
14c00 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41  ERT INTO xref VA
14c10 4c 55 45 53 28 32 38 30 2c 27 6d 6b 73 74 65 6d  LUES(280,'mkstem
14c20 70 28 29 20 66 61 69 6c 65 64 27 29 3b 0a 49 4e  p() failed');.IN
14c30 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56  SERT INTO xref V
14c40 41 4c 55 45 53 28 32 39 30 2c 27 63 61 6e 6e 6f  ALUES(290,'canno
14c50 74 20 63 72 65 61 74 65 20 74 65 6d 70 20 66 69  t create temp fi
14c60 6c 65 20 66 6f 72 20 50 4f 53 54 20 63 6f 6e 74  le for POST cont
14c70 65 6e 74 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  ent');.INSERT IN
14c80 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 33  TO xref VALUES(3
14c90 30 30 2c 27 50 61 74 68 20 65 6c 65 6d 65 6e 74  00,'Path element
14ca0 20 62 65 67 69 6e 73 20 77 69 74 68 20 2e 20 6f   begins with . o
14cb0 72 20 2d 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  r -');.INSERT IN
14cc0 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 33  TO xref VALUES(3
14cd0 31 30 2c 27 55 52 49 20 64 6f 65 73 20 6e 6f 74  10,'URI does not
14ce0 20 73 74 61 72 74 20 77 69 74 68 20 2f 27 29 3b   start with /');
14cf0 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65  .INSERT INTO xre
14d00 66 20 56 41 4c 55 45 53 28 33 32 30 2c 27 55 52  f VALUES(320,'UR
14d10 49 20 74 6f 6f 20 6c 6f 6e 67 27 29 3b 0a 49 4e  I too long');.IN
14d20 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56  SERT INTO xref V
14d30 41 4c 55 45 53 28 33 33 30 2c 27 4d 69 73 73 69  ALUES(330,'Missi
14d40 6e 67 20 48 4f 53 54 3a 20 70 61 72 61 6d 65 74  ng HOST: paramet
14d50 65 72 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54  er');.INSERT INT
14d60 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 33 34  O xref VALUES(34
14d70 30 2c 27 48 4f 53 54 20 70 61 72 61 6d 65 74 65  0,'HOST paramete
14d80 72 20 74 6f 6f 20 6c 6f 6e 67 27 29 3b 0a 49 4e  r too long');.IN
14d90 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56  SERT INTO xref V
14da0 41 4c 55 45 53 28 33 35 30 2c 27 2a 2e 77 65 62  ALUES(350,'*.web
14db0 73 69 74 65 20 70 65 72 6d 69 73 73 69 6f 6e 73  site permissions
14dc0 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
14dd0 78 72 65 66 20 56 41 4c 55 45 53 28 33 36 30 2c  xref VALUES(360,
14de0 27 63 68 64 69 72 28 29 20 66 61 69 6c 65 64 27  'chdir() failed'
14df0 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  );.INSERT INTO x
14e00 72 65 66 20 56 41 4c 55 45 53 28 33 37 30 2c 27  ref VALUES(370,'
14e10 72 65 64 69 72 65 63 74 20 74 6f 20 6e 6f 74 2d  redirect to not-
14e20 66 6f 75 6e 64 20 70 61 67 65 27 29 3b 0a 49 4e  found page');.IN
14e30 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56  SERT INTO xref V
14e40 41 4c 55 45 53 28 33 38 30 2c 27 55 52 49 20 6e  ALUES(380,'URI n
14e50 6f 74 20 66 6f 75 6e 64 27 29 3b 0a 49 4e 53 45  ot found');.INSE
14e60 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
14e70 55 45 53 28 33 39 30 2c 27 46 69 6c 65 20 6e 6f  UES(390,'File no
14e80 74 20 72 65 61 64 61 62 6c 65 27 29 3b 0a 49 4e  t readable');.IN
14e90 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56  SERT INTO xref V
14ea0 41 4c 55 45 53 28 34 30 30 2c 27 55 52 49 20 69  ALUES(400,'URI i
14eb0 73 20 61 20 64 69 72 65 63 74 6f 72 79 20 77 2f  s a directory w/
14ec0 6f 20 69 6e 64 65 78 2e 68 74 6d 6c 27 29 3b 0a  o index.html');.
14ed0 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66  INSERT INTO xref
14ee0 20 56 41 4c 55 45 53 28 34 31 30 2c 27 72 65 64   VALUES(410,'red
14ef0 69 72 65 63 74 20 74 6f 20 61 64 64 20 74 72 61  irect to add tra
14f00 69 6c 69 6e 67 20 2f 27 29 3b 0a 49 4e 53 45 52  iling /');.INSER
14f10 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
14f20 45 53 28 34 32 30 2c 27 63 68 64 69 72 28 29 20  ES(420,'chdir() 
14f30 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54  failed');.INSERT
14f40 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45   INTO xref VALUE
14f50 53 28 34 33 30 2c 27 64 75 70 28 30 29 20 66 61  S(430,'dup(0) fa
14f60 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54 20 49  iled');.INSERT I
14f70 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28  NTO xref VALUES(
14f80 34 34 30 2c 27 70 69 70 65 28 29 20 66 61 69 6c  440,'pipe() fail
14f90 65 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54  ed');.INSERT INT
14fa0 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 34 35  O xref VALUES(45
14fb0 30 2c 27 64 75 70 28 31 29 20 66 61 69 6c 65 64  0,'dup(1) failed
14fc0 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
14fd0 78 72 65 66 20 56 41 4c 55 45 53 28 34 36 30 2c  xref VALUES(460,
14fe0 27 45 78 63 65 73 73 20 55 52 49 20 63 6f 6e 74  'Excess URI cont
14ff0 65 6e 74 20 70 61 73 74 20 73 74 61 74 69 63 20  ent past static 
15000 66 69 6c 65 20 6e 61 6d 65 27 29 3b 0a 49 4e 53  file name');.INS
15010 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41  ERT INTO xref VA
15020 4c 55 45 53 28 34 37 30 2c 27 45 54 61 67 20 43  LUES(470,'ETag C
15030 61 63 68 65 20 48 69 74 27 29 3b 0a 49 4e 53 45  ache Hit');.INSE
15040 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
15050 55 45 53 28 34 38 30 2c 27 66 6f 70 65 6e 28 29  UES(480,'fopen()
15060 20 66 61 69 6c 65 64 20 66 6f 72 20 73 74 61 74   failed for stat
15070 69 63 20 63 6f 6e 74 65 6e 74 27 29 3b 0a 49 4e  ic content');.IN
15080 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56  SERT INTO xref V
15090 41 4c 55 45 53 28 32 2c 27 4e 6f 72 6d 61 6c 20  ALUES(2,'Normal 
150a0 48 45 41 44 20 72 65 70 6c 79 27 29 3b 0a 49 4e  HEAD reply');.IN
150b0 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56  SERT INTO xref V
150c0 41 4c 55 45 53 28 30 2c 27 4e 6f 72 6d 61 6c 20  ALUES(0,'Normal 
150d0 72 65 70 6c 79 27 29 3b 0a 49 4e 53 45 52 54 20  reply');.INSERT 
150e0 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53  INTO xref VALUES
150f0 28 35 30 30 2c 27 75 6e 6b 6e 6f 77 6e 20 49 50  (500,'unknown IP
15100 20 70 72 6f 74 6f 63 6f 6c 27 29 3b 0a 49 4e 53   protocol');.INS
15110 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41  ERT INTO xref VA
15120 4c 55 45 53 28 35 30 31 2c 27 63 61 6e 6e 6f 74  LUES(501,'cannot
15130 20 6f 70 65 6e 20 2d 2d 69 6e 70 75 74 20 66 69   open --input fi
15140 6c 65 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54  le');.INSERT INT
15150 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 35 31  O xref VALUES(51
15160 30 2c 27 75 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61  0,'unknown comma
15170 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74  nd-line argument
15180 20 6f 6e 20 6c 61 75 6e 63 68 27 29 3b 0a 49 4e   on launch');.IN
15190 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56  SERT INTO xref V
151a0 41 4c 55 45 53 28 35 32 30 2c 27 2d 2d 72 6f 6f  ALUES(520,'--roo
151b0 74 20 61 72 67 75 6d 65 6e 74 20 6d 69 73 73 69  t argument missi
151c0 6e 67 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54  ng');.INSERT INT
151d0 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 35 33  O xref VALUES(53
151e0 30 2c 27 63 68 64 69 72 28 29 20 66 61 69 6c 65  0,'chdir() faile
151f0 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f  d');.INSERT INTO
15200 20 78 72 65 66 20 56 41 4c 55 45 53 28 35 34 30   xref VALUES(540
15210 2c 27 63 68 72 6f 6f 74 28 29 20 66 61 69 6c 65  ,'chroot() faile
15220 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f  d');.INSERT INTO
15230 20 78 72 65 66 20 56 41 4c 55 45 53 28 35 35 30   xref VALUES(550
15240 2c 27 73 65 72 76 65 72 20 73 74 61 72 74 75 70  ,'server startup
15250 20 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52   failed');.INSER
15260 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
15270 45 53 28 35 36 30 2c 27 73 65 74 67 69 64 28 29  ES(560,'setgid()
15280 20 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52   failed');.INSER
15290 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
152a0 45 53 28 35 37 30 2c 27 73 65 74 75 69 64 28 29  ES(570,'setuid()
152b0 20 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52   failed');.INSER
152c0 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
152d0 45 53 28 35 38 30 2c 27 75 6e 6b 6e 6f 77 6e 20  ES(580,'unknown 
152e0 75 73 65 72 27 29 3b 0a 49 4e 53 45 52 54 20 49  user');.INSERT I
152f0 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28  NTO xref VALUES(
15300 35 39 30 2c 27 63 61 6e 6e 6f 74 20 72 75 6e 20  590,'cannot run 
15310 61 73 20 72 6f 6f 74 27 29 3b 0a 49 4e 53 45 52  as root');.INSER
15320 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
15330 45 53 28 36 30 30 2c 27 6d 61 6c 6c 6f 63 28 29  ES(600,'malloc()
15340 20 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52   failed');.INSER
15350 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
15360 45 53 28 36 31 30 2c 27 6d 61 6c 6c 6f 63 28 29  ES(610,'malloc()
15370 20 66 61 69 6c 65 64 27 29 3b 0a 43 4f 4d 4d 49   failed');.COMMI
15380 54 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  T;.#endif /* SQL
15390 20 2a 2f 0a                                       */.