Documentation Source Text

Hex Artifact Content
Login

Artifact 5a6c18cad898a0bca4f550e253df3416ee707bb37c394f62466dd0a9e3f7cae5:


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 0a 2a 2a 20 20 20  or run CGI.**   
00d0: 20 20 2a 20 56 69 72 74 75 61 6c 20 73 69 74 65    * Virtual site
00e0: 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 22  s based on the "
00f0: 48 6f 73 74 3a 22 20 70 72 6f 70 65 72 74 79 20  Host:" property 
0100: 6f 66 20 74 68 65 20 48 54 54 50 20 68 65 61 64  of the HTTP head
0110: 65 72 0a 2a 2a 20 20 20 20 20 2a 20 52 75 6e 73  er.**     * Runs
0120: 20 69 6e 20 61 20 63 68 72 6f 6f 74 20 6a 61 69   in a chroot jai
0130: 6c 0a 2a 2a 20 20 20 20 20 2a 20 55 6e 69 66 69  l.**     * Unifi
0140: 65 64 20 6c 6f 67 20 66 69 6c 65 20 69 6e 20 61  ed log file in a
0150: 20 43 53 56 20 66 6f 72 6d 61 74 0a 2a 2a 20 20   CSV format.**  
0160: 20 20 20 2a 20 53 6d 61 6c 6c 20 63 6f 64 65 20     * Small code 
0170: 62 61 73 65 20 28 74 68 69 73 20 31 20 66 69 6c  base (this 1 fil
0180: 65 29 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  e) to facilitate
0190: 20 73 65 63 75 72 69 74 79 20 61 75 64 69 74 69   security auditi
01a0: 6e 67 0a 2a 2a 20 20 20 20 20 2a 20 53 69 6d 70  ng.**     * Simp
01b0: 6c 65 20 73 65 74 75 70 20 2d 20 6e 6f 20 63 6f  le setup - no co
01c0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65  nfiguration file
01d0: 73 20 74 6f 20 6d 65 73 73 20 77 69 74 68 2e 0a  s to mess with..
01e0: 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  ** .** This file
01f0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 73 6d   implements a sm
0200: 61 6c 6c 20 61 6e 64 20 73 69 6d 70 6c 65 20 62  all and simple b
0210: 75 74 20 73 65 63 75 72 65 20 61 6e 64 20 65 66  ut secure and ef
0220: 66 65 63 74 69 76 65 20 77 65 62 0a 2a 2a 20 73  fective web.** s
0230: 65 72 76 65 72 2e 20 20 54 68 65 72 65 20 61 72  erver.  There ar
0240: 65 20 6e 6f 20 66 72 69 6c 6c 73 2e 20 20 41 6e  e no frills.  An
0250: 79 74 68 69 6e 67 20 74 68 61 74 20 63 6f 75 6c  ything that coul
0260: 64 20 62 65 20 72 65 61 73 6f 6e 61 62 6c 79 0a  d be reasonably.
0270: 2a 2a 20 6f 6d 69 74 74 65 64 20 68 61 73 20 62  ** omitted has b
0280: 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 74 75 70  een..**.** Setup
0290: 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   rules:.**.**   
02a0: 20 28 31 29 20 4c 61 75 6e 63 68 20 61 73 20 72   (1) Launch as r
02b0: 6f 6f 74 20 66 72 6f 6d 20 69 6e 65 74 64 20 6c  oot from inetd l
02c0: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
02d0: 20 20 20 20 20 20 20 20 20 20 20 68 74 74 70 64             httpd
02e0: 20 2d 6c 6f 67 66 69 6c 65 20 6c 6f 67 66 69 6c   -logfile logfil
02f0: 65 20 2d 72 6f 6f 74 20 2f 68 6f 6d 65 2f 77 77  e -root /home/ww
0300: 77 20 2d 75 73 65 72 20 6e 6f 62 6f 64 79 0a 2a  w -user nobody.*
0310: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 49 74 20 77  *.**        It w
0320: 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
0330: 79 20 63 68 72 6f 6f 74 20 74 6f 20 2f 68 6f 6d  y chroot to /hom
0340: 65 2f 77 77 77 20 61 6e 64 20 62 65 63 6f 6d 65  e/www and become
0350: 20 75 73 65 72 20 6e 6f 62 6f 64 79 2e 0a 2a 2a   user nobody..**
0360: 20 20 20 20 20 20 20 20 54 68 65 20 6c 6f 67 66          The logf
0370: 69 6c 65 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20  ile name should 
0380: 62 65 20 72 65 6c 61 74 69 76 65 20 74 6f 20 74  be relative to t
0390: 68 65 20 63 68 72 6f 6f 74 20 6a 61 69 6c 2e 0a  he chroot jail..
03a0: 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 44 69 72  **.**    (2) Dir
03b0: 65 63 74 6f 72 69 65 73 20 6f 66 20 74 68 65 20  ectories of the 
03c0: 66 6f 72 6d 20 22 2a 2e 77 65 62 73 69 74 65 22  form "*.website"
03d0: 20 28 65 78 3a 20 77 77 77 5f 68 77 61 63 69 5f   (ex: www_hwaci_
03e0: 63 6f 6d 2e 77 65 62 73 69 74 65 29 0a 2a 2a 20  com.website).** 
03f0: 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 63         contain c
0400: 6f 6e 74 65 6e 74 2e 20 20 54 68 65 20 64 69 72  ontent.  The dir
0410: 65 63 74 6f 72 79 20 69 73 20 63 68 6f 73 65 6e  ectory is chosen
0420: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 48 54   based on the HT
0430: 54 50 5f 48 4f 53 54 0a 2a 2a 20 20 20 20 20 20  TP_HOST.**      
0440: 20 20 72 65 71 75 65 73 74 20 68 65 61 64 65 72    request header
0450: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
0460: 6f 20 48 54 54 50 5f 48 4f 53 54 20 68 65 61 64  o HTTP_HOST head
0470: 65 72 20 6f 72 20 69 66 20 74 68 65 0a 2a 2a 20  er or if the.** 
0480: 20 20 20 20 20 20 20 63 6f 72 72 65 73 70 6f 6e         correspon
0490: 64 69 6e 67 20 68 6f 73 74 20 64 69 72 65 63 74  ding host direct
04a0: 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ory does not exi
04b0: 73 74 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  st, then the.** 
04c0: 20 20 20 20 20 20 20 22 64 65 66 61 75 6c 74 2e         "default.
04d0: 77 65 62 73 69 74 65 22 20 69 73 20 75 73 65 64  website" is used
04e0: 2e 20 20 49 66 20 74 68 65 20 48 54 54 50 5f 48  .  If the HTTP_H
04f0: 4f 53 54 20 68 65 61 64 65 72 20 63 6f 6e 74 61  OST header conta
0500: 69 6e 73 20 61 6e 79 0a 2a 2a 20 20 20 20 20 20  ins any.**      
0510: 20 20 63 68 61 72 61 74 65 72 73 20 6f 74 68 65    charaters othe
0520: 72 20 74 68 61 6e 20 5b 61 2d 7a 41 2d 5a 30 2d  r than [a-zA-Z0-
0530: 39 5f 2e 2c 2a 7e 2f 5d 20 74 68 65 6e 20 61 20  9_.,*~/] then a 
0540: 34 30 33 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20  403 error is.** 
0550: 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 64         generated
0560: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 41  ..**.**    (3) A
0570: 6e 79 20 66 69 6c 65 20 6f 72 20 64 69 72 65 63  ny file or direc
0580: 74 6f 72 79 20 77 68 6f 73 65 20 6e 61 6d 65 20  tory whose name 
0590: 62 65 67 69 6e 73 20 77 69 74 68 20 22 2e 22 20  begins with "." 
05a0: 6f 72 20 22 2d 22 20 69 73 20 69 67 6e 6f 72 65  or "-" is ignore
05b0: 64 2c 0a 2a 2a 20 20 20 20 20 20 20 20 65 78 63  d,.**        exc
05c0: 65 70 74 20 66 6f 72 20 2f 2e 77 65 6c 6c 2d 6b  ept for /.well-k
05d0: 6e 6f 77 6e 2f 20 61 74 20 74 68 65 20 74 6f 70  nown/ at the top
05e0: 2d 6c 65 76 65 6c 2e 20 20 54 68 65 20 65 78 63  -level.  The exc
05f0: 65 70 74 69 6f 6e 20 69 73 20 66 6f 72 0a 2a 2a  eption is for.**
0600: 20 20 20 20 20 20 20 20 52 46 43 2d 35 37 38 35          RFC-5785
0610: 20 74 6f 20 61 6c 6c 6f 77 20 6c 65 74 73 65 6e   to allow letsen
0620: 63 72 79 70 74 20 6f 72 20 63 65 72 74 62 6f 74  crypt or certbot
0630: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 54   to generate a T
0640: 53 4c 20 63 65 72 74 0a 2a 2a 20 20 20 20 20 20  SL cert.**      
0650: 20 20 75 73 69 6e 67 20 77 65 62 72 6f 6f 74 2e    using webroot.
0660: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 43 68  .**.**    (4) Ch
0670: 61 72 61 63 74 65 72 73 20 6f 74 68 65 72 20 74  aracters other t
0680: 68 61 6e 20 5b 30 2d 39 61 2d 7a 41 2d 5a 2c 2d  han [0-9a-zA-Z,-
0690: 2e 2f 3a 5f 7e 5d 20 61 6e 64 20 61 6e 79 20 25  ./:_~] and any %
06a0: 48 48 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a  HH characters.**
06b0: 20 20 20 20 20 20 20 20 65 73 63 61 70 65 73 20          escapes 
06c0: 69 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  in the filename 
06d0: 61 72 65 20 61 6c 6c 20 74 72 61 6e 73 6c 61 74  are all translat
06e0: 65 64 20 69 6e 74 6f 20 22 5f 22 2e 20 20 54 68  ed into "_".  Th
06f0: 69 73 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20  is is.**        
0700: 61 20 64 65 66 65 6e 73 65 20 61 67 61 69 6e 73  a defense agains
0710: 74 20 63 72 6f 73 73 2d 73 69 74 65 20 73 63 72  t cross-site scr
0720: 69 70 74 69 6e 67 20 61 74 74 61 63 6b 73 20 61  ipting attacks a
0730: 6e 64 20 6f 74 68 65 72 20 6d 69 73 63 68 69 65  nd other mischie
0740: 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 35 29 20  f..**.**    (5) 
0750: 45 78 65 63 75 74 61 62 6c 65 20 66 69 6c 65 73  Executable files
0760: 20 61 72 65 20 72 75 6e 20 61 73 20 43 47 49 2e   are run as CGI.
0770: 20 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 6c 65    All other file
0780: 73 20 61 72 65 20 64 65 6c 69 76 65 72 65 64 0a  s are delivered.
0790: 2a 2a 20 20 20 20 20 20 20 20 61 73 20 69 73 2e  **        as is.
07a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 36 29 20 46 6f  .**.**    (6) Fo
07b0: 72 20 53 53 4c 20 73 75 70 70 6f 72 74 20 75 73  r SSL support us
07c0: 65 20 73 74 75 6e 6e 65 6c 20 61 6e 64 20 61 64  e stunnel and ad
07d0: 64 20 74 68 65 20 2d 68 74 74 70 73 20 31 20 6f  d the -https 1 o
07e0: 70 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  ption on the.** 
07f0: 20 20 20 20 20 20 20 68 74 74 70 64 20 63 6f 6d         httpd com
0800: 6d 61 6e 64 2d 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a  mand-line..**.**
0810: 20 20 20 20 28 37 29 20 49 66 20 61 20 66 69 6c      (7) If a fil
0820: 65 20 6e 61 6d 65 64 20 22 2d 61 75 74 68 22 20  e named "-auth" 
0830: 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 73 61  exists in the sa
0840: 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20  me directory as 
0850: 74 68 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 20  the file to.**  
0860: 20 20 20 20 20 20 62 65 20 72 75 6e 20 61 73 20        be run as 
0870: 43 47 49 20 6f 72 20 74 6f 20 62 65 20 64 65 6c  CGI or to be del
0880: 69 76 65 72 65 64 2c 20 74 68 65 6e 20 69 74 20  ivered, then it 
0890: 63 6f 6e 74 61 69 6e 73 20 69 6e 66 6f 72 6d 61  contains informa
08a0: 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 66  tion.**        f
08b0: 6f 72 20 48 54 54 50 20 42 61 73 69 63 20 61 75  or HTTP Basic au
08c0: 74 68 6f 72 69 7a 61 74 69 6f 6e 2e 20 20 53 65  thorization.  Se
08d0: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 64 65  e file format de
08e0: 74 61 69 6c 73 20 62 65 6c 6f 77 2e 0a 2a 2a 0a  tails below..**.
08f0: 2a 2a 20 20 20 20 28 38 29 20 54 6f 20 72 75 6e  **    (8) To run
0900: 20 61 73 20 61 20 73 74 61 6e 64 2d 61 6c 6f 6e   as a stand-alon
0910: 65 20 73 65 72 76 65 72 2c 20 73 69 6d 70 6c 79  e server, simply
0920: 20 61 64 64 20 74 68 65 20 22 2d 70 6f 72 74 20   add the "-port 
0930: 4e 22 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 0a  N" command-line.
0940: 2a 2a 20 20 20 20 20 20 20 20 6f 70 74 69 6f 6e  **        option
0950: 20 74 6f 20 64 65 66 69 6e 65 20 77 68 69 63 68   to define which
0960: 20 54 43 50 20 70 6f 72 74 20 74 6f 20 6c 69 73   TCP port to lis
0970: 74 65 6e 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ten on..**.**   
0980: 20 28 39 29 20 46 6f 72 20 73 74 61 74 69 63 20   (9) For static 
0990: 63 6f 6e 74 65 6e 74 2c 20 74 68 65 20 6d 69 6d  content, the mim
09a0: 65 74 79 70 65 20 69 73 20 64 65 74 65 72 6d 69  etype is determi
09b0: 6e 65 64 20 62 79 20 74 68 65 20 66 69 6c 65 20  ned by the file 
09c0: 73 75 66 66 69 78 0a 2a 2a 20 20 20 20 20 20 20  suffix.**       
09d0: 20 75 73 69 6e 67 20 61 20 74 61 62 6c 65 20 62   using a table b
09e0: 75 69 6c 74 20 69 6e 74 6f 20 74 68 65 20 73 6f  uilt into the so
09f0: 75 72 63 65 20 63 6f 64 65 20 62 65 6c 6f 77 2e  urce code below.
0a00: 20 20 49 66 20 79 6f 75 20 68 61 76 65 0a 2a 2a    If you have.**
0a10: 20 20 20 20 20 20 20 20 75 6e 75 73 75 61 6c 20          unusual 
0a20: 63 6f 6e 74 65 6e 74 20 66 69 6c 65 73 2c 20 79  content files, y
0a30: 6f 75 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  ou might need to
0a40: 20 65 78 74 65 6e 64 20 74 68 69 73 20 74 61 62   extend this tab
0a50: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 6d 61 6e  le..**.** Comman
0a60: 64 2d 6c 69 6e 65 20 4f 70 74 69 6f 6e 73 3a 0a  d-line Options:.
0a70: 2a 2a 0a 2a 2a 20 20 2d 2d 72 6f 6f 74 20 44 49  **.**  --root DI
0a80: 52 20 20 20 20 20 20 20 44 65 66 69 6e 65 73 20  R       Defines 
0a90: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68  the directory th
0aa0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
0ab0: 76 61 72 69 6f 75 73 0a 2a 2a 20 20 20 20 20 20  various.**      
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 24 48 4f               $HO
0ad0: 53 54 2e 77 65 62 73 69 74 65 20 73 75 62 64 69  ST.website subdi
0ae0: 72 65 63 74 6f 72 69 65 73 2c 20 65 61 63 68 20  rectories, each 
0af0: 63 6f 6e 74 61 69 6e 69 6e 67 20 77 65 62 20 63  containing web c
0b00: 6f 6e 74 65 6e 74 20 0a 2a 2a 20 20 20 20 20 20  ontent .**      
0b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
0b20: 20 61 20 73 69 6e 67 6c 65 20 76 69 72 74 75 61   a single virtua
0b30: 6c 20 68 6f 73 74 2e 20 20 49 66 20 6c 61 75 6e  l host.  If laun
0b40: 63 68 65 64 20 61 73 20 72 6f 6f 74 20 61 6e 64  ched as root and
0b50: 20 69 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   if.**          
0b60: 20 20 20 20 20 20 20 20 20 22 2d 2d 75 73 65 72           "--user
0b70: 20 55 53 45 52 22 20 61 6c 73 6f 20 61 70 70 65   USER" also appe
0b80: 61 72 73 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61  ars on the comma
0b90: 6e 64 2d 6c 69 6e 65 20 61 6e 64 20 69 66 0a 2a  nd-line and if.*
0ba0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0bb0: 20 20 20 20 22 2d 2d 6a 61 69 6c 20 30 22 20 69      "--jail 0" i
0bc0: 73 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e 20  s omitted, then 
0bd0: 74 68 65 20 70 72 6f 63 65 73 73 20 72 75 6e 73  the process runs
0be0: 20 69 6e 20 61 20 63 68 72 6f 6f 74 0a 2a 2a 20   in a chroot.** 
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c00: 20 20 6a 61 69 6c 20 72 6f 6f 74 65 64 20 61 74    jail rooted at
0c10: 20 74 68 69 73 20 64 69 72 65 63 74 6f 72 79 20   this directory 
0c20: 61 6e 64 20 75 6e 64 65 72 20 74 68 65 20 75 73  and under the us
0c30: 65 72 69 64 20 55 53 45 52 2e 0a 2a 2a 20 20 20  erid USER..**   
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c50: 54 68 69 73 20 6f 70 74 69 6f 6e 20 69 73 20 72  This option is r
0c60: 65 71 75 69 72 65 64 20 66 6f 72 20 78 69 6e 65  equired for xine
0c70: 74 64 20 6c 61 75 6e 63 68 20 62 75 74 20 64 65  td launch but de
0c80: 66 61 75 6c 74 73 0a 2a 2a 20 20 20 20 20 20 20  faults.**       
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 74 6f 20 22              to "
0ca0: 2e 22 20 66 6f 72 20 61 20 73 74 61 6e 64 2d 61  ." for a stand-a
0cb0: 6c 6f 6e 65 20 77 65 62 20 73 65 72 76 65 72 2e  lone web server.
0cc0: 0a 2a 2a 0a 2a 2a 20 20 2d 2d 75 73 65 72 20 55  .**.**  --user U
0cd0: 53 45 52 20 20 20 20 20 20 44 65 66 69 6e 65 20  SER      Define 
0ce0: 74 68 65 20 75 73 65 72 20 75 6e 64 65 72 20 77  the user under w
0cf0: 68 69 63 68 20 74 68 65 20 70 72 6f 63 65 73 73  hich the process
0d00: 20 73 68 6f 75 6c 64 20 72 75 6e 20 69 66 0a 2a   should run if.*
0d10: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0d20: 20 20 20 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6c      originally l
0d30: 61 75 6e 63 68 65 64 20 61 73 20 72 6f 6f 74 2e  aunched as root.
0d40: 20 20 54 68 69 73 20 70 72 6f 63 65 73 73 20 77    This process w
0d50: 69 6c 6c 20 72 65 66 75 73 65 20 74 6f 0a 2a 2a  ill refuse to.**
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d70: 20 20 20 72 75 6e 20 61 73 20 72 6f 6f 74 20 28     run as root (
0d80: 66 6f 72 20 73 65 63 75 72 69 74 79 29 2e 20 20  for security).  
0d90: 49 66 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 69  If this option i
0da0: 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 0a 2a 2a  s omitted and.**
0db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0dc0: 20 20 20 74 68 65 20 70 72 6f 63 65 73 73 20 69     the process i
0dd0: 73 20 6c 61 75 6e 63 68 65 64 20 61 73 20 72 6f  s launched as ro
0de0: 6f 74 2c 20 69 74 20 77 69 6c 6c 20 61 62 6f 72  ot, it will abor
0df0: 74 20 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20  t without.**    
0e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
0e10: 72 6f 63 65 73 73 69 6e 67 20 61 6e 79 20 48 54  rocessing any HT
0e20: 54 50 20 72 65 71 75 65 73 74 73 2e 0a 2a 2a 0a  TP requests..**.
0e30: 2a 2a 20 20 2d 2d 6c 6f 67 66 69 6c 65 20 46 49  **  --logfile FI
0e40: 4c 45 20 20 20 41 70 70 65 6e 64 20 61 20 73 69  LE   Append a si
0e50: 6e 67 6c 65 2d 6c 69 6e 65 2c 20 43 53 56 2d 66  ngle-line, CSV-f
0e60: 6f 72 6d 61 74 2c 20 6c 6f 67 20 66 69 6c 65 20  ormat, log file 
0e70: 65 6e 74 72 79 20 74 6f 20 46 49 4c 45 0a 2a 2a  entry to FILE.**
0e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e90: 20 20 20 66 6f 72 20 65 61 63 68 20 48 54 54 50     for each HTTP
0ea0: 20 72 65 71 75 65 73 74 2e 20 20 46 49 4c 45 20   request.  FILE 
0eb0: 73 68 6f 75 6c 64 20 62 65 20 61 20 66 75 6c 6c  should be a full
0ec0: 20 70 61 74 68 6e 61 6d 65 2e 0a 2a 2a 20 20 20   pathname..**   
0ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ee0: 54 68 65 20 46 49 4c 45 20 6e 61 6d 65 20 69 73  The FILE name is
0ef0: 20 69 6e 74 65 72 70 72 65 74 65 64 20 69 6e 73   interpreted ins
0f00: 69 64 65 20 74 68 65 20 63 68 72 6f 6f 74 20 6a  ide the chroot j
0f10: 61 69 6c 2e 20 20 54 68 65 0a 2a 2a 20 20 20 20  ail.  The.**    
0f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
0f30: 49 4c 45 20 6e 61 6d 65 20 69 73 20 65 78 70 61  ILE name is expa
0f40: 6e 64 65 64 20 75 73 69 6e 67 20 73 74 72 66 74  nded using strft
0f50: 69 6d 65 28 29 20 69 66 20 69 74 20 63 6f 6e 74  ime() if it cont
0f60: 61 69 6e 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ains.**         
0f70: 20 20 20 20 20 20 20 20 20 20 61 74 20 6c 65 61            at lea
0f80: 73 74 20 6f 6e 65 20 27 25 27 20 61 6e 64 20 69  st one '%' and i
0f90: 73 20 6e 6f 74 20 74 6f 6f 20 6c 6f 6e 67 2e 0a  s not too long..
0fa0: 2a 2a 0a 2a 2a 20 20 2d 2d 68 74 74 70 73 20 20  **.**  --https  
0fb0: 20 20 20 20 20 20 20 20 49 6e 64 69 63 61 74 65          Indicate
0fc0: 73 20 74 68 61 74 20 69 6e 70 75 74 20 69 73 20  s that input is 
0fd0: 63 6f 6d 69 6e 67 20 6f 76 65 72 20 53 53 4c 20  coming over SSL 
0fe0: 61 6e 64 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20  and is being.** 
0ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1000: 20 20 64 65 63 6f 64 65 64 20 75 70 73 74 72 65    decoded upstre
1010: 61 6d 2c 20 70 65 72 68 61 70 73 20 62 79 20 73  am, perhaps by s
1020: 74 75 6e 6e 65 6c 2e 20 20 28 54 68 69 73 20 70  tunnel.  (This p
1030: 72 6f 67 72 61 6d 0a 2a 2a 20 20 20 20 20 20 20  rogram.**       
1040: 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 6c 79              only
1050: 20 75 6e 64 65 72 73 74 61 6e 64 73 20 70 6c 61   understands pla
1060: 69 6e 74 65 78 74 2e 29 0a 2a 2a 0a 2a 2a 20 20  intext.).**.**  
1070: 2d 2d 66 61 6d 69 6c 79 20 69 70 76 34 20 20 20  --family ipv4   
1080: 20 4f 6e 6c 79 20 61 63 63 65 70 74 20 69 6e 70   Only accept inp
1090: 75 74 20 66 72 6f 6d 20 49 50 56 34 20 6f 72 20  ut from IPV4 or 
10a0: 49 50 56 36 2c 20 72 65 73 70 65 63 74 69 76 65  IPV6, respective
10b0: 6c 79 2e 0a 2a 2a 20 20 2d 2d 66 61 6d 69 6c 79  ly..**  --family
10c0: 20 69 70 76 36 20 20 20 20 54 68 65 73 65 20 6f   ipv6    These o
10d0: 70 74 69 6f 6e 73 20 61 72 65 20 6f 6e 6c 79 20  ptions are only 
10e0: 6d 65 61 6e 69 6e 67 66 75 6c 20 69 66 20 61 6c  meaningful if al
10f0: 74 68 74 74 70 64 20 69 73 20 72 75 6e 0a 2a 2a  thttpd is run.**
1100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1110: 20 20 20 61 73 20 61 20 73 74 61 6e 64 2d 61 6c     as a stand-al
1120: 6f 6e 65 20 73 65 72 76 65 72 2e 0a 2a 2a 0a 2a  one server..**.*
1130: 2a 20 20 2d 2d 6a 61 69 6c 20 42 4f 4f 4c 45 41  *  --jail BOOLEA
1140: 4e 20 20 20 49 6e 64 69 63 61 74 65 73 20 77 68  N   Indicates wh
1150: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 6f 20  ether or not to 
1160: 66 6f 72 6d 20 61 20 63 68 72 6f 6f 74 20 6a 61  form a chroot ja
1170: 69 6c 20 69 66 20 0a 2a 2a 20 20 20 20 20 20 20  il if .**       
1180: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 69 74              init
1190: 69 61 6c 6c 79 20 72 75 6e 20 61 73 20 72 6f 6f  ially run as roo
11a0: 74 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  t.  The default 
11b0: 69 73 20 74 72 75 65 2c 20 73 6f 20 74 68 65 20  is true, so the 
11c0: 6f 6e 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  only.**         
11d0: 20 20 20 20 20 20 20 20 20 20 75 73 65 66 75 6c            useful
11e0: 20 76 61 72 69 61 6e 74 20 6f 66 20 74 68 69 73   variant of this
11f0: 20 6f 70 74 69 6f 6e 20 69 73 20 22 2d 2d 6a 61   option is "--ja
1200: 69 6c 20 30 22 20 77 68 69 63 68 20 70 72 65 76  il 0" which prev
1210: 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ents.**         
1220: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 66 6f            the fo
1230: 72 6d 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  rmation of the c
1240: 68 72 6f 6f 74 20 6a 61 69 6c 2e 0a 2a 2a 0a 2a  hroot jail..**.*
1250: 2a 20 20 2d 2d 6d 61 78 2d 61 67 65 20 53 45 43  *  --max-age SEC
1260: 20 20 20 20 54 68 65 20 76 61 6c 75 65 20 66 6f      The value fo
1270: 72 20 22 43 61 63 68 65 2d 43 6f 6e 74 72 6f 6c  r "Cache-Control
1280: 3a 20 6d 61 78 2d 61 67 65 3d 25 64 22 2e 20 20  : max-age=%d".  
1290: 44 65 66 61 75 6c 74 73 20 74 6f 0a 2a 2a 20 20  Defaults to.**  
12a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b0: 20 31 32 30 20 73 65 63 6f 6e 64 73 2e 0a 2a 2a   120 seconds..**
12c0: 0a 2a 2a 20 20 2d 2d 64 65 62 75 67 20 20 20 20  .**  --debug    
12d0: 20 20 20 20 20 20 44 69 73 61 62 6c 65 73 20 69        Disables i
12e0: 6e 70 75 74 20 74 69 6d 65 6f 75 74 73 2e 20 20  nput timeouts.  
12f0: 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 20 66  This is useful f
1300: 6f 72 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20  or debugging.** 
1310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1320: 20 20 77 68 65 6e 20 69 6e 70 75 74 73 20 69 73    when inputs is
1330: 20 62 65 69 6e 67 20 74 79 70 65 64 20 69 6e 20   being typed in 
1340: 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20  manually..**.** 
1350: 43 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74  Command-line opt
1360: 69 6f 6e 73 20 63 61 6e 20 74 61 6b 65 20 65 69  ions can take ei
1370: 74 68 65 72 20 6f 6e 65 20 6f 72 20 74 77 6f 20  ther one or two 
1380: 69 6e 69 74 69 61 6c 20 22 2d 22 20 63 68 61 72  initial "-" char
1390: 61 63 74 65 72 73 2e 0a 2a 2a 20 53 6f 20 22 2d  acters..** So "-
13a0: 2d 64 65 62 75 67 22 20 61 6e 64 20 22 2d 64 65  -debug" and "-de
13b0: 62 75 67 22 20 6d 65 61 6e 20 74 68 65 20 73 61  bug" mean the sa
13c0: 6d 65 20 74 68 69 6e 67 2c 20 66 6f 72 20 65 78  me thing, for ex
13d0: 61 6d 70 6c 65 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ample..**.**.** 
13e0: 53 65 63 75 72 69 74 79 20 46 65 61 74 75 72 65  Security Feature
13f0: 73 3a 0a 2a 2a 0a 2a 2a 20 28 31 29 20 20 54 68  s:.**.** (1)  Th
1400: 69 73 20 70 72 6f 67 72 61 6d 20 61 75 74 6f 6d  is program autom
1410: 61 74 69 63 61 6c 6c 79 20 70 75 74 73 20 69 74  atically puts it
1420: 73 65 6c 66 20 69 6e 73 69 64 65 20 61 20 63 68  self inside a ch
1430: 72 6f 6f 74 20 6a 61 69 6c 20 69 66 0a 2a 2a 20  root jail if.** 
1440: 20 20 20 20 20 69 74 20 63 61 6e 20 61 6e 64 20       it can and 
1450: 69 66 20 6e 6f 74 20 73 70 65 63 69 66 69 63 61  if not specifica
1460: 6c 6c 79 20 70 72 6f 68 69 62 69 74 65 64 20 62  lly prohibited b
1470: 79 20 74 68 65 20 22 2d 2d 6a 61 69 6c 20 30 22  y the "--jail 0"
1480: 0a 2a 2a 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64  .**      command
1490: 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 2e 20 20 54  -line option.  T
14a0: 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 6a  he root of the j
14b0: 61 69 6c 20 69 73 20 74 68 65 20 64 69 72 65 63  ail is the direc
14c0: 74 6f 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  tory that.**    
14d0: 20 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76    contains the v
14e0: 61 72 69 6f 75 73 20 24 48 4f 53 54 2e 77 65 62  arious $HOST.web
14f0: 73 69 74 65 20 63 6f 6e 74 65 6e 74 20 73 75 62  site content sub
1500: 64 69 72 65 63 74 6f 72 69 65 73 2e 0a 2a 2a 0a  directories..**.
1510: 2a 2a 20 28 32 29 20 20 4e 6f 20 69 6e 70 75 74  ** (2)  No input
1520: 20 69 73 20 72 65 61 64 20 77 68 69 6c 65 20 74   is read while t
1530: 68 69 73 20 70 72 6f 63 65 73 73 20 68 61 73 20  his process has 
1540: 72 6f 6f 74 20 70 72 69 76 69 6c 65 67 65 73 2e  root privileges.
1550: 20 20 52 6f 6f 74 0a 2a 2a 20 20 20 20 20 20 70    Root.**      p
1560: 72 69 76 69 6c 65 67 65 73 20 61 72 65 20 64 72  rivileges are dr
1570: 6f 70 70 65 64 20 70 72 69 6f 72 20 74 6f 20 72  opped prior to r
1580: 65 61 64 69 6e 67 20 61 6e 79 20 69 6e 70 75 74  eading any input
1590: 20 28 62 75 74 20 61 66 74 65 72 20 65 6e 74 65   (but after ente
15a0: 72 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  ring.**      the
15b0: 20 63 68 72 6f 6f 74 20 6a 61 69 6c 2c 20 6f 66   chroot jail, of
15c0: 20 63 6f 75 72 73 65 29 2e 20 20 49 66 20 72 6f   course).  If ro
15d0: 6f 74 20 70 72 69 76 69 6c 65 67 65 73 20 63 61  ot privileges ca
15e0: 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 0a  nnot be dropped.
15f0: 2a 2a 20 20 20 20 20 20 28 66 6f 72 20 65 78 61  **      (for exa
1600: 6d 70 6c 65 20 62 65 63 61 75 73 65 20 74 68 65  mple because the
1610: 20 2d 2d 75 73 65 72 20 63 6f 6d 6d 61 6e 64 2d   --user command-
1620: 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 77 61 73 20  line option was 
1630: 6f 6d 69 74 74 65 64 20 6f 72 0a 2a 2a 20 20 20  omitted or.**   
1640: 20 20 20 62 65 63 61 75 73 65 20 74 68 65 20 75     because the u
1650: 73 65 72 20 73 70 65 63 69 66 69 65 64 20 62 79  ser specified by
1660: 20 74 68 65 20 2d 2d 75 73 65 72 20 6f 70 74 69   the --user opti
1670: 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  on does not exis
1680: 74 29 2c 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  t), .**      the
1690: 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 61 62  n the process ab
16a0: 6f 72 74 73 20 77 69 74 68 20 61 6e 20 65 72 72  orts with an err
16b0: 6f 72 20 70 72 69 6f 72 20 74 6f 20 72 65 61 64  or prior to read
16c0: 69 6e 67 20 61 6e 79 20 69 6e 70 75 74 2e 0a 2a  ing any input..*
16d0: 2a 0a 2a 2a 20 28 33 29 20 20 54 68 65 20 6c 65  *.** (3)  The le
16e0: 6e 67 74 68 20 6f 66 20 61 6e 20 48 54 54 50 20  ngth of an HTTP 
16f0: 72 65 71 75 65 73 74 20 69 73 20 6c 69 6d 69 74  request is limit
1700: 65 64 20 74 6f 20 4d 41 58 5f 43 4f 4e 54 45 4e  ed to MAX_CONTEN
1710: 54 5f 4c 45 4e 47 54 48 20 62 79 74 65 73 0a 2a  T_LENGTH bytes.*
1720: 2a 20 20 20 20 20 20 28 64 65 66 61 75 6c 74 3a  *      (default:
1730: 20 32 35 30 20 6d 69 6c 6c 69 6f 6e 29 2e 20 20   250 million).  
1740: 41 6e 79 20 48 54 54 50 20 72 65 71 75 65 73 74  Any HTTP request
1750: 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74 68 69   longer than thi
1760: 73 20 66 61 69 6c 73 0a 2a 2a 20 20 20 20 20 20  s fails.**      
1770: 77 69 74 68 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  with an error..*
1780: 2a 0a 2a 2a 20 28 34 29 20 20 54 68 65 72 65 20  *.** (4)  There 
1790: 61 72 65 20 68 61 72 64 2d 63 6f 64 65 64 20 74  are hard-coded t
17a0: 69 6d 65 2d 6f 75 74 73 20 6f 6e 20 65 61 63 68  ime-outs on each
17b0: 20 48 54 54 50 20 72 65 71 75 65 73 74 2e 20 20   HTTP request.  
17c0: 49 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 0a  If this process.
17d0: 2a 2a 20 20 20 20 20 20 77 61 69 74 73 20 6c 6f  **      waits lo
17e0: 6e 67 65 72 20 74 68 61 6e 20 74 68 65 20 74 69  nger than the ti
17f0: 6d 65 6f 75 74 20 66 6f 72 20 74 68 65 20 63 6f  meout for the co
1800: 6d 70 6c 65 74 65 20 72 65 71 75 65 73 74 2c 20  mplete request, 
1810: 6f 72 20 66 6f 72 20 43 47 49 0a 2a 2a 20 20 20  or for CGI.**   
1820: 20 20 20 74 6f 20 66 69 6e 69 73 68 20 72 75 6e     to finish run
1830: 6e 69 6e 67 2c 20 74 68 65 6e 20 74 68 69 73 20  ning, then this 
1840: 70 72 6f 63 65 73 73 20 61 62 6f 72 74 73 2e 20  process aborts. 
1850: 20 28 54 68 65 20 74 69 6d 65 6f 75 74 20 66 65   (The timeout fe
1860: 61 74 75 72 65 0a 2a 2a 20 20 20 20 20 20 63 61  ature.**      ca
1870: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
1880: 69 6e 67 20 74 68 65 20 2d 2d 64 65 62 75 67 20  ing the --debug 
1890: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74  command-line opt
18a0: 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 28 35 29 20  ion.).**.** (5) 
18b0: 20 49 66 20 74 68 65 20 48 54 54 50 5f 48 4f 53   If the HTTP_HOS
18c0: 54 20 72 65 71 75 65 73 74 20 68 65 61 64 65 72  T request header
18d0: 20 63 6f 6e 74 61 69 6e 73 20 63 68 61 72 61 63   contains charac
18e0: 74 65 72 73 20 6f 74 68 65 72 20 74 68 61 6e 0a  ters other than.
18f0: 2a 2a 20 20 20 20 20 20 5b 30 2d 39 61 2d 7a 41  **      [0-9a-zA
1900: 2d 5a 2c 2d 2e 2f 3a 5f 7e 5d 20 74 68 65 6e 20  -Z,-./:_~] then 
1910: 74 68 65 20 65 6e 74 69 72 65 20 72 65 71 75 65  the entire reque
1920: 73 74 20 69 73 20 72 65 6a 65 63 74 65 64 2e 0a  st is rejected..
1930: 2a 2a 0a 2a 2a 20 28 36 29 20 20 41 6e 79 20 63  **.** (6)  Any c
1940: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
1950: 20 55 52 49 20 70 61 74 68 6e 61 6d 65 20 6f 74   URI pathname ot
1960: 68 65 72 20 74 68 61 6e 20 5b 30 2d 39 61 2d 7a  her than [0-9a-z
1970: 41 2d 5a 2c 2d 2e 2f 3a 5f 7e 5d 0a 2a 2a 20 20  A-Z,-./:_~].**  
1980: 20 20 20 20 61 72 65 20 63 6f 6e 76 65 72 74 65      are converte
1990: 64 20 69 6e 74 6f 20 22 5f 22 2e 20 20 54 68 69  d into "_".  Thi
19a0: 73 20 61 70 70 6c 69 65 73 20 74 6f 20 74 68 65  s applies to the
19b0: 20 70 61 74 68 6e 61 6d 65 20 6f 6e 6c 79 2c 20   pathname only, 
19c0: 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74  not.**      to t
19d0: 68 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  he query paramet
19e0: 65 72 73 20 6f 72 20 66 72 61 67 6d 65 6e 74 2e  ers or fragment.
19f0: 0a 2a 2a 0a 2a 2a 20 28 37 29 20 20 49 66 20 74  .**.** (7)  If t
1a00: 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74  he first charact
1a10: 65 72 20 6f 66 20 61 6e 79 20 55 52 49 20 70 61  er of any URI pa
1a20: 74 68 6e 61 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74  thname component
1a30: 20 69 73 20 22 2e 22 20 6f 72 20 22 2d 22 0a 2a   is "." or "-".*
1a40: 2a 20 20 20 20 20 20 74 68 65 6e 20 61 20 34 30  *      then a 40
1a50: 34 20 4e 6f 74 20 46 6f 75 6e 64 20 72 65 70 6c  4 Not Found repl
1a60: 79 20 69 73 20 67 65 6e 65 72 61 74 65 64 2e 20  y is generated. 
1a70: 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 61   This prevents a
1a80: 74 74 61 63 6b 73 0a 2a 2a 20 20 20 20 20 20 73  ttacks.**      s
1a90: 75 63 68 20 61 73 20 69 6e 63 6c 75 64 69 6e 67  uch as including
1aa0: 20 22 2e 2e 22 20 6f 72 20 22 2e 22 20 64 69 72   ".." or "." dir
1ab0: 65 63 74 6f 72 79 20 65 6c 65 6d 65 6e 74 73 20  ectory elements 
1ac0: 69 6e 20 74 68 65 20 70 61 74 68 6e 61 6d 65 0a  in the pathname.
1ad0: 2a 2a 20 20 20 20 20 20 61 6e 64 20 61 6c 6c 6f  **      and allo
1ae0: 77 73 20 70 6c 61 63 69 6e 67 20 66 69 6c 65 73  ws placing files
1af0: 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73   and directories
1b00: 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   in the content 
1b10: 73 75 62 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  subdirectory.** 
1b20: 20 20 20 20 20 74 68 61 74 20 61 72 65 20 69 6e       that are in
1b30: 76 69 73 69 62 6c 65 20 74 6f 20 61 6c 6c 20 48  visible to all H
1b40: 54 54 50 20 72 65 71 75 65 73 74 73 2c 20 62 79  TTP requests, by
1b50: 20 6d 61 6b 69 6e 67 20 74 68 65 20 66 69 72 73   making the firs
1b60: 74 20 0a 2a 2a 20 20 20 20 20 20 63 68 61 72 61  t .**      chara
1b70: 63 74 65 72 20 6f 66 20 74 68 65 20 66 69 6c 65  cter of the file
1b80: 20 6f 72 20 73 75 62 64 69 72 65 63 74 6f 72 79   or subdirectory
1b90: 20 6e 61 6d 65 20 22 2d 22 20 6f 72 20 22 2e 22   name "-" or "."
1ba0: 2e 0a 2a 2a 0a 2a 2a 20 28 38 29 20 20 54 68 65  ..**.** (8)  The
1bb0: 20 72 65 71 75 65 73 74 20 55 52 49 20 6d 75 73   request URI mus
1bc0: 74 20 62 65 67 69 6e 20 77 69 74 68 20 22 2f 22  t begin with "/"
1bd0: 20 6f 72 20 65 6c 73 65 20 61 20 34 30 34 20 65   or else a 404 e
1be0: 72 72 6f 72 20 69 73 20 67 65 6e 65 72 61 74 65  rror is generate
1bf0: 64 2e 0a 2a 2a 0a 2a 2a 20 28 39 29 20 20 54 68  d..**.** (9)  Th
1c00: 69 73 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72  is program never
1c10: 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65 20   sets the value 
1c20: 6f 66 20 61 6e 20 65 6e 76 69 72 6f 6e 6d 65 6e  of an environmen
1c30: 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 61 0a  t variable to a.
1c40: 2a 2a 20 20 20 20 20 20 73 74 72 69 6e 67 20 74  **      string t
1c50: 68 61 74 20 62 65 67 69 6e 73 20 77 69 74 68 20  hat begins with 
1c60: 22 28 29 20 7b 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a  "() {"..**.**.**
1c70: 20 42 61 73 69 63 20 41 75 74 68 6f 72 69 7a 61   Basic Authoriza
1c80: 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion:.**.** If t
1c90: 68 65 20 66 69 6c 65 20 22 2d 61 75 74 68 22 20  he file "-auth" 
1ca0: 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 73 61  exists in the sa
1cb0: 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20  me directory as 
1cc0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 69 6c 65  the content file
1cd0: 0a 2a 2a 20 28 66 6f 72 20 62 6f 74 68 20 73 74  .** (for both st
1ce0: 61 74 69 63 20 63 6f 6e 74 65 6e 74 20 61 6e 64  atic content and
1cf0: 20 43 47 49 29 20 74 68 65 6e 20 69 74 20 63 6f   CGI) then it co
1d00: 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 66 6f 72  ntains the infor
1d10: 6d 61 74 69 6f 6e 20 75 73 65 64 0a 2a 2a 20 66  mation used.** f
1d20: 6f 72 20 62 61 73 69 63 20 61 75 74 68 6f 72 69  or basic authori
1d30: 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 66 69 6c  zation.  The fil
1d40: 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
1d50: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
1d60: 20 2a 20 20 42 6c 61 6e 6b 20 6c 69 6e 65 73 20   *  Blank lines 
1d70: 61 6e 64 20 6c 69 6e 65 73 20 74 68 61 74 20 62  and lines that b
1d80: 65 67 69 6e 20 77 69 74 68 20 27 23 27 20 61 72  egin with '#' ar
1d90: 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 20 20 20  e ignored.**    
1da0: 2a 20 20 22 68 74 74 70 2d 72 65 64 69 72 65 63  *  "http-redirec
1db0: 74 22 20 66 6f 72 63 65 73 20 61 20 72 65 64 69  t" forces a redi
1dc0: 72 65 63 74 20 74 6f 20 48 54 54 50 53 20 69 66  rect to HTTPS if
1dd0: 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61   not there alrea
1de0: 64 79 0a 2a 2a 20 20 20 20 2a 20 20 22 68 74 74  dy.**    *  "htt
1df0: 70 73 2d 6f 6e 6c 79 22 20 64 69 73 61 6c 6c 6f  ps-only" disallo
1e00: 77 73 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 20  ws operation in 
1e10: 48 54 54 50 0a 2a 2a 20 20 20 20 2a 20 20 22 75  HTTP.**    *  "u
1e20: 73 65 72 20 4e 41 4d 45 20 4c 4f 47 49 4e 3a 50  ser NAME LOGIN:P
1e30: 41 53 53 57 4f 52 44 22 20 63 68 65 63 6b 73 20  ASSWORD" checks 
1e40: 74 6f 20 73 65 65 20 69 66 20 4c 4f 47 49 4e 3a  to see if LOGIN:
1e50: 50 41 53 53 57 4f 52 44 20 0a 2a 2a 20 20 20 20  PASSWORD .**    
1e60: 20 20 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e     authorization
1e70: 20 63 72 65 64 65 6e 74 69 61 6c 73 20 61 72 65   credentials are
1e80: 20 70 72 6f 76 69 64 65 64 2c 20 61 6e 64 20 69   provided, and i
1e90: 66 20 73 6f 20 73 65 74 73 20 74 68 65 0a 2a 2a  f so sets the.**
1ea0: 20 20 20 20 20 20 20 52 45 4d 4f 54 45 5f 55 53         REMOTE_US
1eb0: 45 52 20 74 6f 20 4e 41 4d 45 2e 0a 2a 2a 20 20  ER to NAME..**  
1ec0: 20 20 2a 20 20 22 72 65 61 6c 6d 20 54 45 58 54    *  "realm TEXT
1ed0: 22 20 73 65 74 73 20 74 68 65 20 72 65 61 6c 6d  " sets the realm
1ee0: 20 74 6f 20 54 45 58 54 2e 0a 2a 2a 0a 2a 2a 20   to TEXT..**.** 
1ef0: 54 68 65 72 65 20 63 61 6e 20 62 65 20 6d 75 6c  There can be mul
1f00: 74 69 70 6c 65 20 22 75 73 65 72 22 20 6c 69 6e  tiple "user" lin
1f10: 65 73 2e 20 20 49 66 20 6e 6f 20 22 75 73 65 72  es.  If no "user
1f20: 22 20 6c 69 6e 65 20 6d 61 74 63 68 65 73 2c 20  " line matches, 
1f30: 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 20 66  the.** request f
1f40: 61 69 6c 73 20 77 69 74 68 20 61 20 34 30 31 20  ails with a 401 
1f50: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 42 65 63  error..**.** Bec
1f60: 61 75 73 65 20 6f 66 20 73 65 63 75 72 69 74 79  ause of security
1f70: 20 72 75 6c 65 20 28 37 29 2c 20 74 68 65 72 65   rule (7), there
1f80: 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 74   is no way for t
1f90: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
1fa0: 65 20 22 2d 61 75 74 68 22 0a 2a 2a 20 66 69 6c  e "-auth".** fil
1fb0: 65 20 74 6f 20 6c 65 61 6b 20 6f 75 74 20 76 69  e to leak out vi
1fc0: 61 20 48 54 54 50 20 72 65 71 75 65 73 74 2e 0a  a HTTP request..
1fd0: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  */.#include <std
1fe0: 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  io.h>.#include <
1ff0: 63 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  ctype.h>.#includ
2000: 65 20 3c 73 79 73 6c 6f 67 2e 68 3e 0a 23 69 6e  e <syslog.h>.#in
2010: 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e  clude <stdlib.h>
2020: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73  .#include <sys/s
2030: 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  tat.h>.#include 
2040: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
2050: 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69  ude <fcntl.h>.#i
2060: 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68  nclude <string.h
2070: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 70 77 64 2e  >.#include <pwd.
2080: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
2090: 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  /time.h>.#includ
20a0: 65 20 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a  e <sys/types.h>.
20b0: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 6f  #include <sys/so
20c0: 63 6b 65 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  cket.h>.#include
20d0: 20 3c 73 79 73 2f 77 61 69 74 2e 68 3e 0a 23 69   <sys/wait.h>.#i
20e0: 6e 63 6c 75 64 65 20 3c 6e 65 74 69 6e 65 74 2f  nclude <netinet/
20f0: 69 6e 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  in.h>.#include <
2100: 61 72 70 61 2f 69 6e 65 74 2e 68 3e 0a 23 69 6e  arpa/inet.h>.#in
2110: 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e  clude <stdarg.h>
2120: 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e  .#include <time.
2130: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
2140: 2f 74 69 6d 65 73 2e 68 3e 0a 23 69 6e 63 6c 75  /times.h>.#inclu
2150: 64 65 20 3c 6e 65 74 64 62 2e 68 3e 0a 23 69 6e  de <netdb.h>.#in
2160: 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a  clude <errno.h>.
2170: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 72 65  #include <sys/re
2180: 73 6f 75 72 63 65 2e 68 3e 0a 23 69 6e 63 6c 75  source.h>.#inclu
2190: 64 65 20 3c 73 69 67 6e 61 6c 2e 68 3e 0a 23 69  de <signal.h>.#i
21a0: 66 64 65 66 20 6c 69 6e 75 78 0a 23 69 6e 63 6c  fdef linux.#incl
21b0: 75 64 65 20 3c 73 79 73 2f 73 65 6e 64 66 69 6c  ude <sys/sendfil
21c0: 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 6e 63  e.h>.#endif.#inc
21d0: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
21e0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65  ./*.** Configure
21f0: 20 74 68 65 20 73 65 72 76 65 72 20 62 79 20 73   the server by s
2200: 65 74 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  etting the follo
2210: 77 69 6e 67 20 6d 61 63 72 6f 73 20 61 6e 64 20  wing macros and 
2220: 72 65 63 6f 6d 70 69 6c 69 6e 67 2e 0a 2a 2f 0a  recompiling..*/.
2230: 23 69 66 6e 64 65 66 20 44 45 46 41 55 4c 54 5f  #ifndef DEFAULT_
2240: 50 4f 52 54 0a 23 64 65 66 69 6e 65 20 44 45 46  PORT.#define DEF
2250: 41 55 4c 54 5f 50 4f 52 54 20 22 38 30 22 20 20  AULT_PORT "80"  
2260: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
2270: 66 61 75 6c 74 20 54 43 50 20 70 6f 72 74 20 66  fault TCP port f
2280: 6f 72 20 48 54 54 50 20 2a 2f 0a 23 65 6e 64 69  or HTTP */.#endi
2290: 66 0a 23 69 66 6e 64 65 66 20 4d 41 58 5f 43 4f  f.#ifndef MAX_CO
22a0: 4e 54 45 4e 54 5f 4c 45 4e 47 54 48 0a 23 64 65  NTENT_LENGTH.#de
22b0: 66 69 6e 65 20 4d 41 58 5f 43 4f 4e 54 45 4e 54  fine MAX_CONTENT
22c0: 5f 4c 45 4e 47 54 48 20 32 35 30 30 30 30 30 30  _LENGTH 25000000
22d0: 30 20 20 2f 2a 20 4d 61 78 20 6c 65 6e 67 74 68  0  /* Max length
22e0: 20 6f 66 20 48 54 54 50 20 72 65 71 75 65 73 74   of HTTP request
22f0: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 23 65 6e 64   content */.#end
2300: 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 72 65 63  if../*.** We rec
2310: 6f 72 64 20 6d 6f 73 74 20 6f 66 20 74 68 65 20  ord most of the 
2320: 73 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  state informatio
2330: 6e 20 61 73 20 67 6c 6f 62 61 6c 20 76 61 72 69  n as global vari
2340: 61 62 6c 65 73 2e 20 20 54 68 69 73 0a 2a 2a 20  ables.  This.** 
2350: 73 61 76 65 73 20 68 61 76 69 6e 67 20 74 6f 20  saves having to 
2360: 70 61 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  pass information
2370: 20 74 6f 20 73 75 62 72 6f 75 74 69 6e 65 73 20   to subroutines 
2380: 61 73 20 70 61 72 61 6d 65 74 65 72 73 2c 20 61  as parameters, a
2390: 6e 64 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20  nd.** makes the 
23a0: 65 78 65 63 75 74 61 62 6c 65 20 73 6d 61 6c 6c  executable small
23b0: 65 72 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  er....*/.static 
23c0: 63 68 61 72 20 2a 7a 52 6f 6f 74 20 3d 20 30 3b  char *zRoot = 0;
23d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
23e0: 74 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74  t directory of t
23f0: 68 65 20 77 65 62 73 69 74 65 20 2a 2f 0a 73 74  he website */.st
2400: 61 74 69 63 20 63 68 61 72 20 2a 7a 54 6d 70 4e  atic char *zTmpN
2410: 61 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  am = 0;        /
2420: 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70  * Name of a temp
2430: 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 73 74  orary file */.st
2440: 61 74 69 63 20 63 68 61 72 20 7a 54 6d 70 4e 61  atic char zTmpNa
2450: 6d 42 75 66 5b 35 30 30 5d 3b 20 20 20 20 20 2f  mBuf[500];     /
2460: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
2470: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
2480: 6c 65 6e 61 6d 65 20 2a 2f 0a 73 74 61 74 69 63  lename */.static
2490: 20 63 68 61 72 20 2a 7a 50 72 6f 74 6f 63 6f 6c   char *zProtocol
24a0: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 68   = 0;      /* Th
24b0: 65 20 70 72 6f 74 6f 63 6f 6c 20 62 65 69 6e 67  e protocol being
24c0: 20 75 73 69 6e 67 20 62 79 20 74 68 65 20 62 72   using by the br
24d0: 6f 77 73 65 72 20 2a 2f 0a 73 74 61 74 69 63 20  owser */.static 
24e0: 63 68 61 72 20 2a 7a 4d 65 74 68 6f 64 20 3d 20  char *zMethod = 
24f0: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  0;        /* The
2500: 20 6d 65 74 68 6f 64 2e 20 20 4d 75 73 74 20 62   method.  Must b
2510: 65 20 47 45 54 20 2a 2f 0a 73 74 61 74 69 63 20  e GET */.static 
2520: 63 68 61 72 20 2a 7a 53 63 72 69 70 74 20 3d 20  char *zScript = 
2530: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  0;        /* The
2540: 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74 72 69   object to retri
2550: 65 76 65 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  eve */.static ch
2560: 61 72 20 2a 7a 52 65 61 6c 53 63 72 69 70 74 20  ar *zRealScript 
2570: 3d 20 30 3b 20 20 20 20 2f 2a 20 54 68 65 20 6f  = 0;    /* The o
2580: 62 6a 65 63 74 20 74 6f 20 72 65 74 72 69 65 76  bject to retriev
2590: 65 2e 20 20 53 61 6d 65 20 61 73 20 7a 53 63 72  e.  Same as zScr
25a0: 69 70 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ipt.            
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c0: 20 20 20 20 20 2a 2a 20 65 78 63 65 70 74 20 6d       ** except m
25d0: 69 67 68 74 20 68 61 76 65 20 22 2f 69 6e 64 65  ight have "/inde
25e0: 78 2e 68 74 6d 6c 22 20 61 70 70 65 6e 64 65 64  x.html" appended
25f0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
2600: 2a 7a 48 6f 6d 65 20 3d 20 30 3b 20 20 20 20 20  *zHome = 0;     
2610: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65       /* The dire
2620: 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  ctory containing
2630: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 73 74 61 74   content */.stat
2640: 69 63 20 63 68 61 72 20 2a 7a 51 75 65 72 79 53  ic char *zQueryS
2650: 74 72 69 6e 67 20 3d 20 30 3b 20 20 20 2f 2a 20  tring = 0;   /* 
2660: 54 68 65 20 71 75 65 72 79 20 73 74 72 69 6e 67  The query string
2670: 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74   on the end of t
2680: 68 65 20 6e 61 6d 65 20 2a 2f 0a 73 74 61 74 69  he name */.stati
2690: 63 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20  c char *zFile = 
26a0: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  0;          /* T
26b0: 68 65 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74  he filename of t
26c0: 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74  he object to ret
26d0: 72 69 65 76 65 20 2a 2f 0a 73 74 61 74 69 63 20  rieve */.static 
26e0: 69 6e 74 20 6c 65 6e 46 69 6c 65 20 3d 20 30 3b  int lenFile = 0;
26f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
2700: 67 74 68 20 6f 66 20 74 68 65 20 7a 46 69 6c 65  gth of the zFile
2710: 20 6e 61 6d 65 20 2a 2f 0a 73 74 61 74 69 63 20   name */.static 
2720: 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 20  char *zDir = 0; 
2730: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
2740: 65 20 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f  e of the directo
2750: 72 79 20 68 6f 6c 64 69 6e 67 20 7a 46 69 6c 65  ry holding zFile
2760: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
2770: 2a 7a 50 61 74 68 49 6e 66 6f 20 3d 20 30 3b 20  *zPathInfo = 0; 
2780: 20 20 20 20 20 2f 2a 20 50 61 72 74 20 6f 66 20       /* Part of 
2790: 74 68 65 20 70 61 74 68 6e 61 6d 65 20 70 61 73  the pathname pas
27a0: 74 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 73 74  t the file */.st
27b0: 61 74 69 63 20 63 68 61 72 20 2a 7a 41 67 65 6e  atic char *zAgen
27c0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  t = 0;         /
27d0: 2a 20 57 68 61 74 20 74 79 70 65 20 69 66 20 62  * What type if b
27e0: 72 6f 77 73 65 72 20 69 73 20 6d 61 6b 69 6e 67  rowser is making
27f0: 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 73   this query */.s
2800: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 53 65 72  tatic char *zSer
2810: 76 65 72 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20  verName = 0;    
2820: 2f 2a 20 54 68 65 20 6e 61 6d 65 20 61 66 74 65  /* The name afte
2830: 72 20 74 68 65 20 68 74 74 70 3a 2f 2f 20 2a 2f  r the http:// */
2840: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 53  .static char *zS
2850: 65 72 76 65 72 50 6f 72 74 20 3d 20 30 3b 20 20  erverPort = 0;  
2860: 20 20 2f 2a 20 54 68 65 20 70 6f 72 74 20 6e 75    /* The port nu
2870: 6d 62 65 72 20 2a 2f 0a 73 74 61 74 69 63 20 63  mber */.static c
2880: 68 61 72 20 2a 7a 43 6f 6f 6b 69 65 20 3d 20 30  har *zCookie = 0
2890: 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6f 6b  ;        /* Cook
28a0: 69 65 73 20 72 65 70 6f 72 74 65 64 20 77 69 74  ies reported wit
28b0: 68 20 74 68 65 20 72 65 71 75 65 73 74 20 2a 2f  h the request */
28c0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 48  .static char *zH
28d0: 74 74 70 48 6f 73 74 20 3d 20 30 3b 20 20 20 20  ttpHost = 0;    
28e0: 20 20 2f 2a 20 4e 61 6d 65 20 61 63 63 6f 72 64    /* Name accord
28f0: 69 6e 67 20 74 6f 20 74 68 65 20 77 65 62 20 62  ing to the web b
2900: 72 6f 77 73 65 72 20 2a 2f 0a 73 74 61 74 69 63  rowser */.static
2910: 20 63 68 61 72 20 2a 7a 52 65 61 6c 50 6f 72 74   char *zRealPort
2920: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 68   = 0;      /* Th
2930: 65 20 72 65 61 6c 20 54 43 50 20 70 6f 72 74 20  e real TCP port 
2940: 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 61 73 20  when running as 
2950: 64 61 65 6d 6f 6e 20 2a 2f 0a 73 74 61 74 69 63  daemon */.static
2960: 20 63 68 61 72 20 2a 7a 52 65 6d 6f 74 65 41 64   char *zRemoteAd
2970: 64 72 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 50  dr = 0;    /* IP
2980: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
2990: 72 65 71 75 65 73 74 20 2a 2f 0a 73 74 61 74 69  request */.stati
29a0: 63 20 63 68 61 72 20 2a 7a 52 65 66 65 72 65 72  c char *zReferer
29b0: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
29c0: 61 6d 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  ame of the page 
29d0: 74 68 61 74 20 72 65 66 65 72 65 64 20 74 6f 20  that refered to 
29e0: 75 73 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  us */.static cha
29f0: 72 20 2a 7a 41 63 63 65 70 74 20 3d 20 30 3b 20  r *zAccept = 0; 
2a00: 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 66         /* What f
2a10: 6f 72 6d 61 74 73 20 77 69 6c 6c 20 62 65 20 61  ormats will be a
2a20: 63 63 65 70 74 65 64 20 2a 2f 0a 73 74 61 74 69  ccepted */.stati
2a30: 63 20 63 68 61 72 20 2a 7a 41 63 63 65 70 74 45  c char *zAcceptE
2a40: 6e 63 6f 64 69 6e 67 20 3d 30 3b 20 2f 2a 20 67  ncoding =0; /* g
2a50: 7a 69 70 20 6f 72 20 64 65 66 61 75 6c 74 20 2a  zip or default *
2a60: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a  /.static char *z
2a70: 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 20 3d 20  ContentLength = 
2a80: 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6c 65  0; /* Content le
2a90: 6e 67 74 68 20 72 65 70 6f 72 74 65 64 20 69 6e  ngth reported in
2aa0: 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 73   the header */.s
2ab0: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 43 6f 6e  tatic char *zCon
2ac0: 74 65 6e 74 54 79 70 65 20 3d 20 30 3b 20 20 20  tentType = 0;   
2ad0: 2f 2a 20 43 6f 6e 74 65 6e 74 20 74 79 70 65 20  /* Content type 
2ae0: 72 65 70 6f 72 74 65 64 20 69 6e 20 74 68 65 20  reported in the 
2af0: 68 65 61 64 65 72 20 2a 2f 0a 73 74 61 74 69 63  header */.static
2b00: 20 63 68 61 72 20 2a 7a 51 75 65 72 79 53 75 66   char *zQuerySuf
2b10: 66 69 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68  fix = 0;   /* Th
2b20: 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 55 52  e part of the UR
2b30: 4c 20 61 66 74 65 72 20 74 68 65 20 66 69 72 73  L after the firs
2b40: 74 20 3f 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  t ? */.static ch
2b50: 61 72 20 2a 7a 41 75 74 68 54 79 70 65 20 3d 20  ar *zAuthType = 
2b60: 30 3b 20 20 20 20 20 20 2f 2a 20 41 75 74 68 6f  0;      /* Autho
2b70: 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 20 28 62  rization type (b
2b80: 61 73 69 63 20 6f 72 20 64 69 67 65 73 74 29 20  asic or digest) 
2b90: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
2ba0: 7a 41 75 74 68 41 72 67 20 3d 20 30 3b 20 20 20  zAuthArg = 0;   
2bb0: 20 20 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 61      /* Authoriza
2bc0: 74 69 6f 6e 20 76 61 6c 75 65 73 20 2a 2f 0a 73  tion values */.s
2bd0: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 52 65 6d  tatic char *zRem
2be0: 6f 74 65 55 73 65 72 20 3d 20 30 3b 20 20 20 20  oteUser = 0;    
2bf0: 2f 2a 20 52 45 4d 4f 54 45 5f 55 53 45 52 20 73  /* REMOTE_USER s
2c00: 65 74 20 62 79 20 61 75 74 68 6f 72 69 7a 61 74  et by authorizat
2c10: 69 6f 6e 20 6d 6f 64 75 6c 65 20 2a 2f 0a 73 74  ion module */.st
2c20: 61 74 69 63 20 63 68 61 72 20 2a 7a 49 66 4e 6f  atic char *zIfNo
2c30: 6e 65 4d 61 74 63 68 3d 20 30 3b 20 20 20 20 2f  neMatch= 0;    /
2c40: 2a 20 54 68 65 20 49 66 2d 4e 6f 6e 65 2d 4d 61  * The If-None-Ma
2c50: 74 63 68 20 68 65 61 64 65 72 20 76 61 6c 75 65  tch header value
2c60: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e   */.static int n
2c70: 49 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  In = 0;         
2c80: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2c90: 66 20 62 79 74 65 73 20 6f 66 20 69 6e 70 75 74  f bytes of input
2ca0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e   */.static int n
2cb0: 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Out = 0;        
2cc0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2cd0: 66 20 62 79 74 65 73 20 6f 66 20 6f 75 74 70 75  f bytes of outpu
2ce0: 74 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  t */.static char
2cf0: 20 7a 52 65 70 6c 79 53 74 61 74 75 73 5b 34 5d   zReplyStatus[4]
2d00: 3b 20 20 20 20 20 2f 2a 20 52 65 70 6c 79 20 73  ;     /* Reply s
2d10: 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 73 74  tatus code */.st
2d20: 61 74 69 63 20 69 6e 74 20 73 74 61 74 75 73 53  atic int statusS
2d30: 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ent = 0;       /
2d40: 2a 20 54 72 75 65 20 61 66 74 65 72 20 73 74 61  * True after sta
2d50: 74 75 73 20 6c 69 6e 65 20 69 73 20 73 65 6e 74  tus line is sent
2d60: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
2d70: 2a 7a 4c 6f 67 46 69 6c 65 20 3d 20 30 3b 20 20  *zLogFile = 0;  
2d80: 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 6f 20 74       /* Log to t
2d90: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 73 74 61 74  his file */.stat
2da0: 69 63 20 69 6e 74 20 64 65 62 75 67 46 6c 61 67  ic int debugFlag
2db0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
2dc0: 54 72 75 65 20 69 66 20 62 65 69 6e 67 20 64 65  True if being de
2dd0: 62 75 67 67 65 64 20 2a 2f 0a 73 74 61 74 69 63  bugged */.static
2de0: 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20   struct timeval 
2df0: 62 65 67 69 6e 54 69 6d 65 3b 20 2f 2a 20 54 69  beginTime; /* Ti
2e00: 6d 65 20 77 68 65 6e 20 74 68 69 73 20 70 72 6f  me when this pro
2e10: 63 65 73 73 20 73 74 61 72 74 73 20 2a 2f 0a 73  cess starts */.s
2e20: 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 43  tatic int closeC
2e30: 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 30 3b 20 20  onnection = 0;  
2e40: 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 6e 64 20  /* True to send 
2e50: 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f 73  Connection: clos
2e60: 65 20 69 6e 20 72 65 70 6c 79 20 2a 2f 0a 73 74  e in reply */.st
2e70: 61 74 69 63 20 69 6e 74 20 6e 52 65 71 75 65 73  atic int nReques
2e80: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  t = 0;         /
2e90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 71 75  * Number of requ
2ea0: 65 73 74 73 20 70 72 6f 63 65 73 73 65 64 20 2a  ests processed *
2eb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 6d 69  /.static int omi
2ec0: 74 4c 6f 67 20 3d 20 30 3b 20 20 20 20 20 20 20  tLog = 0;       
2ed0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6d 61 6b     /* Do not mak
2ee0: 65 20 6c 6f 67 66 69 6c 65 20 65 6e 74 72 69 65  e logfile entrie
2ef0: 73 20 69 66 20 74 72 75 65 20 2a 2f 0a 73 74 61  s if true */.sta
2f00: 74 69 63 20 69 6e 74 20 75 73 65 48 74 74 70 73  tic int useHttps
2f10: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
2f20: 20 54 72 75 65 20 74 6f 20 75 73 65 20 48 54 54   True to use HTT
2f30: 50 53 3a 20 69 6e 73 74 65 61 64 20 6f 66 20 48  PS: instead of H
2f40: 54 54 50 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63  TTP: */.static c
2f50: 68 61 72 20 2a 7a 48 74 74 70 20 3d 20 22 68 74  har *zHttp = "ht
2f60: 74 70 22 3b 20 20 20 20 20 2f 2a 20 68 74 74 70  tp";     /* http
2f70: 20 6f 72 20 68 74 74 70 73 20 2a 2f 0a 73 74 61   or https */.sta
2f80: 74 69 63 20 69 6e 74 20 75 73 65 54 69 6d 65 6f  tic int useTimeo
2f90: 75 74 20 3d 20 31 3b 20 20 20 20 20 20 20 2f 2a  ut = 1;       /*
2fa0: 20 54 72 75 65 20 74 6f 20 75 73 65 20 74 69 6d   True to use tim
2fb0: 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es */.static int
2fc0: 20 73 74 61 6e 64 61 6c 6f 6e 65 20 3d 20 30 3b   standalone = 0;
2fd0: 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 20 61 73         /* Run as
2fe0: 20 61 20 73 74 61 6e 64 61 6c 6f 6e 65 20 73 65   a standalone se
2ff0: 72 76 65 72 20 28 6e 6f 20 69 6e 65 74 64 29 20  rver (no inetd) 
3000: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 70  */.static int ip
3010: 76 36 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20  v6Only = 0;     
3020: 20 20 20 20 2f 2a 20 55 73 65 20 49 50 76 36 20      /* Use IPv6 
3030: 6f 6e 6c 79 20 2a 2f 0a 73 74 61 74 69 63 20 69  only */.static i
3040: 6e 74 20 69 70 76 34 4f 6e 6c 79 20 3d 20 30 3b  nt ipv4Only = 0;
3050: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
3060: 49 50 76 34 20 6f 6e 6c 79 20 2a 2f 0a 73 74 61  IPv4 only */.sta
3070: 74 69 63 20 73 74 72 75 63 74 20 72 75 73 61 67  tic struct rusag
3080: 65 20 70 72 69 6f 72 53 65 6c 66 3b 20 20 2f 2a  e priorSelf;  /*
3090: 20 50 72 65 76 69 6f 75 73 6c 79 20 72 65 70 6f   Previously repo
30a0: 72 74 20 53 45 4c 46 20 74 69 6d 65 20 2a 2f 0a  rt SELF time */.
30b0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 72 75  static struct ru
30c0: 73 61 67 65 20 70 72 69 6f 72 43 68 69 6c 64 3b  sage priorChild;
30d0: 20 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79 20 72   /* Previously r
30e0: 65 70 6f 72 74 20 43 48 49 4c 44 20 74 69 6d 65  eport CHILD time
30f0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d   */.static int m
3100: 78 41 67 65 20 3d 20 31 32 30 3b 20 20 20 20 20  xAge = 120;     
3110: 20 20 20 20 20 2f 2a 20 43 61 63 68 65 2d 63 6f       /* Cache-co
3120: 6e 74 72 6f 6c 20 6d 61 78 2d 61 67 65 20 2a 2f  ntrol max-age */
3130: 0a 0a 2f 2a 0a 2a 2a 20 44 6f 75 62 6c 65 20 61  ../*.** Double a
3140: 6e 79 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 20  ny double-quote 
3150: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 61 20  characters in a 
3160: 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  string..*/.stati
3170: 63 20 63 68 61 72 20 2a 45 73 63 61 70 65 28 63  c char *Escape(c
3180: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69  har *z){.  int i
3190: 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  , j;.  int n;.  
31a0: 63 68 61 72 20 63 3b 0a 20 20 63 68 61 72 20 2a  char c;.  char *
31b0: 7a 4f 75 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  zOut;.  for(i=0;
31c0: 20 28 63 3d 7a 5b 69 5d 29 21 3d 30 20 26 26 20   (c=z[i])!=0 && 
31d0: 63 21 3d 27 22 27 3b 20 69 2b 2b 29 7b 7d 0a 20  c!='"'; i++){}. 
31e0: 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74 75   if( c==0 ) retu
31f0: 72 6e 20 7a 3b 0a 20 20 6e 20 3d 20 31 3b 0a 20  rn z;.  n = 1;. 
3200: 20 66 6f 72 28 69 2b 2b 3b 20 28 63 3d 7a 5b 69   for(i++; (c=z[i
3210: 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 20 69 66 28  ])!=0; i++){ if(
3220: 20 63 3d 3d 27 22 27 20 29 20 6e 2b 2b 3b 20 7d   c=='"' ) n++; }
3230: 0a 20 20 7a 4f 75 74 20 3d 20 6d 61 6c 6c 6f 63  .  zOut = malloc
3240: 28 20 69 2b 6e 2b 31 20 29 3b 0a 20 20 69 66 28  ( i+n+1 );.  if(
3250: 20 7a 4f 75 74 3d 3d 30 20 29 20 72 65 74 75 72   zOut==0 ) retur
3260: 6e 20 22 22 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  n "";.  for(i=j=
3270: 30 3b 20 28 63 3d 7a 5b 69 5d 29 21 3d 30 3b 20  0; (c=z[i])!=0; 
3280: 69 2b 2b 29 7b 0a 20 20 20 20 7a 4f 75 74 5b 6a  i++){.    zOut[j
3290: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 69 66 28  ++] = c;.    if(
32a0: 20 63 3d 3d 27 22 27 20 29 20 7a 4f 75 74 5b 6a   c=='"' ) zOut[j
32b0: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a  ++] = c;.  }.  z
32c0: 4f 75 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65  Out[j] = 0;.  re
32d0: 74 75 72 6e 20 7a 4f 75 74 3b 0a 7d 0a 0a 2f 2a  turn zOut;.}../*
32e0: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 73 74  .** Convert a st
32f0: 72 75 63 74 20 74 69 6d 65 76 61 6c 20 69 6e 74  ruct timeval int
3300: 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d  o an integer num
3310: 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
3320: 6e 64 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nds.*/.static in
3330: 74 20 74 76 6d 73 28 73 74 72 75 63 74 20 74 69  t tvms(struct ti
3340: 6d 65 76 61 6c 20 2a 70 29 7b 0a 20 20 72 65 74  meval *p){.  ret
3350: 75 72 6e 20 28 69 6e 74 29 28 70 2d 3e 74 76 5f  urn (int)(p->tv_
3360: 73 65 63 2a 31 30 30 30 30 30 30 20 2b 20 70 2d  sec*1000000 + p-
3370: 3e 74 76 5f 75 73 65 63 29 3b 0a 7d 0a 0a 2f 2a  >tv_usec);.}../*
3380: 0a 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72  .** Make an entr
3390: 79 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c  y in the log fil
33a0: 65 2e 20 20 49 66 20 74 68 65 20 48 54 54 50 20  e.  If the HTTP 
33b0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 68 6f 75 6c  connection shoul
33c0: 64 20 62 65 0a 2a 2a 20 63 6c 6f 73 65 64 2c 20  d be.** closed, 
33d0: 74 68 65 6e 20 74 65 72 6d 69 6e 61 74 65 20 74  then terminate t
33e0: 68 69 73 20 70 72 6f 63 65 73 73 2e 20 20 4f 74  his process.  Ot
33f0: 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 2e 0a  herwise return..
3400: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d  */.static void M
3410: 61 6b 65 4c 6f 67 45 6e 74 72 79 28 69 6e 74 20  akeLogEntry(int 
3420: 65 78 69 74 43 6f 64 65 2c 20 69 6e 74 20 6c 69  exitCode, int li
3430: 6e 65 4e 75 6d 29 7b 0a 20 20 46 49 4c 45 20 2a  neNum){.  FILE *
3440: 6c 6f 67 3b 0a 20 20 69 66 28 20 7a 54 6d 70 4e  log;.  if( zTmpN
3450: 61 6d 20 29 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b  am ){.    unlink
3460: 28 7a 54 6d 70 4e 61 6d 29 3b 0a 20 20 7d 0a 20  (zTmpNam);.  }. 
3470: 20 69 66 28 20 7a 4c 6f 67 46 69 6c 65 20 26 26   if( zLogFile &&
3480: 20 21 6f 6d 69 74 4c 6f 67 20 29 7b 0a 20 20 20   !omitLog ){.   
3490: 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20   struct timeval 
34a0: 6e 6f 77 3b 0a 20 20 20 20 73 74 72 75 63 74 20  now;.    struct 
34b0: 74 6d 20 2a 70 54 6d 3b 0a 20 20 20 20 73 74 72  tm *pTm;.    str
34c0: 75 63 74 20 72 75 73 61 67 65 20 73 65 6c 66 2c  uct rusage self,
34d0: 20 63 68 69 6c 64 72 65 6e 3b 0a 20 20 20 20 69   children;.    i
34e0: 6e 74 20 77 61 69 74 53 74 61 74 75 73 3b 0a 20  nt waitStatus;. 
34f0: 20 20 20 63 68 61 72 20 2a 7a 52 4d 20 3d 20 7a     char *zRM = z
3500: 52 65 6d 6f 74 65 55 73 65 72 20 3f 20 7a 52 65  RemoteUser ? zRe
3510: 6d 6f 74 65 55 73 65 72 20 3a 20 22 22 3b 0a 20  moteUser : "";. 
3520: 20 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61     char *zFilena
3530: 6d 65 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 73  me;.    size_t s
3540: 7a 3b 0a 20 20 20 20 63 68 61 72 20 7a 44 61 74  z;.    char zDat
3550: 65 5b 32 30 30 5d 3b 0a 20 20 20 20 63 68 61 72  e[200];.    char
3560: 20 7a 45 78 70 4c 6f 67 46 69 6c 65 5b 35 30 30   zExpLogFile[500
3570: 5d 3b 0a 0a 20 20 20 20 69 66 28 20 7a 53 63 72  ];..    if( zScr
3580: 69 70 74 3d 3d 30 20 29 20 7a 53 63 72 69 70 74  ipt==0 ) zScript
3590: 20 3d 20 22 22 3b 0a 20 20 20 20 69 66 28 20 7a   = "";.    if( z
35a0: 52 65 61 6c 53 63 72 69 70 74 3d 3d 30 20 29 20  RealScript==0 ) 
35b0: 7a 52 65 61 6c 53 63 72 69 70 74 20 3d 20 22 22  zRealScript = ""
35c0: 3b 0a 20 20 20 20 69 66 28 20 7a 52 65 6d 6f 74  ;.    if( zRemot
35d0: 65 41 64 64 72 3d 3d 30 20 29 20 7a 52 65 6d 6f  eAddr==0 ) zRemo
35e0: 74 65 41 64 64 72 20 3d 20 22 22 3b 0a 20 20 20  teAddr = "";.   
35f0: 20 69 66 28 20 7a 48 74 74 70 48 6f 73 74 3d 3d   if( zHttpHost==
3600: 30 20 29 20 7a 48 74 74 70 48 6f 73 74 20 3d 20  0 ) zHttpHost = 
3610: 22 22 3b 0a 20 20 20 20 69 66 28 20 7a 52 65 66  "";.    if( zRef
3620: 65 72 65 72 3d 3d 30 20 29 20 7a 52 65 66 65 72  erer==0 ) zRefer
3630: 65 72 20 3d 20 22 22 3b 0a 20 20 20 20 69 66 28  er = "";.    if(
3640: 20 7a 41 67 65 6e 74 3d 3d 30 20 29 20 7a 41 67   zAgent==0 ) zAg
3650: 65 6e 74 20 3d 20 22 22 3b 0a 20 20 20 20 67 65  ent = "";.    ge
3660: 74 74 69 6d 65 6f 66 64 61 79 28 26 6e 6f 77 2c  ttimeofday(&now,
3670: 20 30 29 3b 0a 20 20 20 20 70 54 6d 20 3d 20 6c   0);.    pTm = l
3680: 6f 63 61 6c 74 69 6d 65 28 26 6e 6f 77 2e 74 76  ocaltime(&now.tv
3690: 5f 73 65 63 29 3b 0a 20 20 20 20 73 74 72 66 74  _sec);.    strft
36a0: 69 6d 65 28 7a 44 61 74 65 2c 20 73 69 7a 65 6f  ime(zDate, sizeo
36b0: 66 28 7a 44 61 74 65 29 2c 20 22 25 59 2d 25 6d  f(zDate), "%Y-%m
36c0: 2d 25 64 20 25 48 3a 25 4d 3a 25 53 22 2c 20 70  -%d %H:%M:%S", p
36d0: 54 6d 29 3b 0a 20 20 20 20 73 7a 20 3d 20 73 74  Tm);.    sz = st
36e0: 72 66 74 69 6d 65 28 7a 45 78 70 4c 6f 67 46 69  rftime(zExpLogFi
36f0: 6c 65 2c 20 73 69 7a 65 6f 66 28 7a 45 78 70 4c  le, sizeof(zExpL
3700: 6f 67 46 69 6c 65 29 2c 20 7a 4c 6f 67 46 69 6c  ogFile), zLogFil
3710: 65 2c 20 70 54 6d 29 3b 0a 20 20 20 20 69 66 28  e, pTm);.    if(
3720: 20 73 7a 3e 30 20 26 26 20 73 7a 3c 73 69 7a 65   sz>0 && sz<size
3730: 6f 66 28 7a 45 78 70 4c 6f 67 46 69 6c 65 29 2d  of(zExpLogFile)-
3740: 32 20 29 7b 0a 20 20 20 20 20 20 7a 46 69 6c 65  2 ){.      zFile
3750: 6e 61 6d 65 20 3d 20 7a 45 78 70 4c 6f 67 46 69  name = zExpLogFi
3760: 6c 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  le;.    }else{. 
3770: 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d       zFilename =
3780: 20 7a 4c 6f 67 46 69 6c 65 3b 0a 20 20 20 20 7d   zLogFile;.    }
3790: 0a 20 20 20 20 77 61 69 74 70 69 64 28 2d 31 2c  .    waitpid(-1,
37a0: 20 26 77 61 69 74 53 74 61 74 75 73 2c 20 57 4e   &waitStatus, WN
37b0: 4f 48 41 4e 47 29 3b 0a 20 20 20 20 67 65 74 72  OHANG);.    getr
37c0: 75 73 61 67 65 28 52 55 53 41 47 45 5f 53 45 4c  usage(RUSAGE_SEL
37d0: 46 2c 20 26 73 65 6c 66 29 3b 0a 20 20 20 20 67  F, &self);.    g
37e0: 65 74 72 75 73 61 67 65 28 52 55 53 41 47 45 5f  etrusage(RUSAGE_
37f0: 43 48 49 4c 44 52 45 4e 2c 20 26 63 68 69 6c 64  CHILDREN, &child
3800: 72 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 28 6c  ren);.    if( (l
3810: 6f 67 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65  og = fopen(zFile
3820: 6e 61 6d 65 2c 22 61 22 29 29 21 3d 30 20 29 7b  name,"a"))!=0 ){
3830: 0a 23 69 66 64 65 66 20 43 4f 4d 42 49 4e 45 44  .#ifdef COMBINED
3840: 5f 4c 4f 47 5f 46 4f 52 4d 41 54 0a 20 20 20 20  _LOG_FORMAT.    
3850: 20 20 73 74 72 66 74 69 6d 65 28 7a 44 61 74 65    strftime(zDate
3860: 2c 20 73 69 7a 65 6f 66 28 7a 44 61 74 65 29 2c  , sizeof(zDate),
3870: 20 22 25 64 2f 25 62 2f 25 59 3a 25 48 3a 25 4d   "%d/%b/%Y:%H:%M
3880: 3a 25 53 20 25 7a 22 2c 20 70 54 6d 29 3b 0a 20  :%S %z", pTm);. 
3890: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6c 6f 67       fprintf(log
38a0: 2c 20 22 25 73 20 2d 20 2d 20 5b 25 73 5d 20 5c  , "%s - - [%s] \
38b0: 22 25 73 20 25 73 20 25 73 5c 22 20 25 73 20 25  "%s %s %s\" %s %
38c0: 64 20 5c 22 25 73 5c 22 20 5c 22 25 73 5c 22 5c  d \"%s\" \"%s\"\
38d0: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
38e0: 20 20 7a 52 65 6d 6f 74 65 41 64 64 72 2c 20 7a    zRemoteAddr, z
38f0: 44 61 74 65 2c 20 7a 4d 65 74 68 6f 64 2c 20 7a  Date, zMethod, z
3900: 53 63 72 69 70 74 2c 20 7a 50 72 6f 74 6f 63 6f  Script, zProtoco
3910: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
3920: 20 7a 52 65 70 6c 79 53 74 61 74 75 73 2c 20 6e   zReplyStatus, n
3930: 4f 75 74 2c 20 7a 52 65 66 65 72 65 72 2c 20 7a  Out, zReferer, z
3940: 41 67 65 6e 74 29 3b 0a 23 65 6c 73 65 0a 20 20  Agent);.#else.  
3950: 20 20 20 20 73 74 72 66 74 69 6d 65 28 7a 44 61      strftime(zDa
3960: 74 65 2c 20 73 69 7a 65 6f 66 28 7a 44 61 74 65  te, sizeof(zDate
3970: 29 2c 20 22 25 59 2d 25 6d 2d 25 64 20 25 48 3a  ), "%Y-%m-%d %H:
3980: 25 4d 3a 25 53 22 2c 20 70 54 6d 29 3b 0a 20 20  %M:%S", pTm);.  
3990: 20 20 20 20 2f 2a 20 4c 6f 67 20 72 65 63 6f 72      /* Log recor
39a0: 64 20 66 69 6c 65 73 3a 0a 20 20 20 20 20 20 2a  d files:.      *
39b0: 2a 20 20 28 31 29 20 44 61 74 65 20 61 6e 64 20  *  (1) Date and 
39c0: 74 69 6d 65 0a 20 20 20 20 20 20 2a 2a 20 20 28  time.      **  (
39d0: 32 29 20 49 50 20 61 64 64 72 65 73 73 0a 20 20  2) IP address.  
39e0: 20 20 20 20 2a 2a 20 20 28 33 29 20 55 52 4c 20      **  (3) URL 
39f0: 62 65 69 6e 67 20 61 63 63 65 73 73 65 64 0a 20  being accessed. 
3a00: 20 20 20 20 20 2a 2a 20 20 28 34 29 20 52 65 66       **  (4) Ref
3a10: 65 72 65 72 0a 20 20 20 20 20 20 2a 2a 20 20 28  erer.      **  (
3a20: 35 29 20 52 65 70 6c 79 20 73 74 61 74 75 73 0a  5) Reply status.
3a30: 20 20 20 20 20 20 2a 2a 20 20 28 36 29 20 42 79        **  (6) By
3a40: 74 65 73 20 72 65 63 65 69 76 65 64 0a 20 20 20  tes received.   
3a50: 20 20 20 2a 2a 20 20 28 37 29 20 42 79 74 65 73     **  (7) Bytes
3a60: 20 73 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 20   sent.      **  
3a70: 28 38 29 20 53 65 6c 66 20 75 73 65 72 20 74 69  (8) Self user ti
3a80: 6d 65 0a 20 20 20 20 20 20 2a 2a 20 20 28 39 29  me.      **  (9)
3a90: 20 53 65 6c 66 20 73 79 73 74 65 6d 20 74 69 6d   Self system tim
3aa0: 65 0a 20 20 20 20 20 20 2a 2a 20 28 31 30 29 20  e.      ** (10) 
3ab0: 43 68 69 6c 64 72 65 6e 20 75 73 65 72 20 74 69  Children user ti
3ac0: 6d 65 0a 20 20 20 20 20 20 2a 2a 20 28 31 31 29  me.      ** (11)
3ad0: 20 43 68 69 6c 64 72 65 6e 20 73 79 73 74 65 6d   Children system
3ae0: 20 74 69 6d 65 0a 20 20 20 20 20 20 2a 2a 20 28   time.      ** (
3af0: 31 32 29 20 54 6f 74 61 6c 20 77 61 6c 6c 2d 63  12) Total wall-c
3b00: 6c 6f 63 6b 20 74 69 6d 65 0a 20 20 20 20 20 20  lock time.      
3b10: 2a 2a 20 28 31 33 29 20 52 65 71 75 65 73 74 20  ** (13) Request 
3b20: 6e 75 6d 62 65 72 20 66 6f 72 20 73 61 6d 65 20  number for same 
3b30: 54 43 50 2f 49 50 20 63 6f 6e 6e 65 63 74 69 6f  TCP/IP connectio
3b40: 6e 0a 20 20 20 20 20 20 2a 2a 20 28 31 34 29 20  n.      ** (14) 
3b50: 55 73 65 72 20 61 67 65 6e 74 0a 20 20 20 20 20  User agent.     
3b60: 20 2a 2a 20 28 31 35 29 20 52 65 6d 6f 74 65 20   ** (15) Remote 
3b70: 75 73 65 72 0a 20 20 20 20 20 20 2a 2a 20 28 31  user.      ** (1
3b80: 36 29 20 42 79 74 65 73 20 6f 66 20 55 52 4c 20  6) Bytes of URL 
3b90: 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20  that correspond 
3ba0: 74 6f 20 74 68 65 20 53 43 52 49 50 54 5f 4e 41  to the SCRIPT_NA
3bb0: 4d 45 0a 20 20 20 20 20 20 2a 2a 20 28 31 37 29  ME.      ** (17)
3bc0: 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 69 6e 20   Line number in 
3bd0: 73 6f 75 72 63 65 20 66 69 6c 65 0a 20 20 20 20  source file.    
3be0: 20 20 2a 2f 0a 20 20 20 20 20 20 66 70 72 69 6e    */.      fprin
3bf0: 74 66 28 6c 6f 67 2c 0a 20 20 20 20 20 20 20 20  tf(log,.        
3c00: 22 25 73 2c 25 73 2c 5c 22 25 73 3a 2f 2f 25 73  "%s,%s,\"%s://%s
3c10: 25 73 5c 22 2c 5c 22 25 73 5c 22 2c 22 0a 20 20  %s\",\"%s\",".  
3c20: 20 20 20 20 20 20 20 20 20 22 25 73 2c 25 64 2c           "%s,%d,
3c30: 25 64 2c 25 64 2c 25 64 2c 25 64 2c 25 64 2c 25  %d,%d,%d,%d,%d,%
3c40: 64 2c 25 64 2c 5c 22 25 73 5c 22 2c 5c 22 25 73  d,%d,\"%s\",\"%s
3c50: 5c 22 2c 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20  \",%d,%d\n",.   
3c60: 20 20 20 20 20 7a 44 61 74 65 2c 20 7a 52 65 6d       zDate, zRem
3c70: 6f 74 65 41 64 64 72 2c 20 7a 48 74 74 70 2c 20  oteAddr, zHttp, 
3c80: 45 73 63 61 70 65 28 7a 48 74 74 70 48 6f 73 74  Escape(zHttpHost
3c90: 29 2c 20 45 73 63 61 70 65 28 7a 53 63 72 69 70  ), Escape(zScrip
3ca0: 74 29 2c 0a 20 20 20 20 20 20 20 20 45 73 63 61  t),.        Esca
3cb0: 70 65 28 7a 52 65 66 65 72 65 72 29 2c 20 7a 52  pe(zReferer), zR
3cc0: 65 70 6c 79 53 74 61 74 75 73 2c 20 6e 49 6e 2c  eplyStatus, nIn,
3cd0: 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 74   nOut,.        t
3ce0: 76 6d 73 28 26 73 65 6c 66 2e 72 75 5f 75 74 69  vms(&self.ru_uti
3cf0: 6d 65 29 20 2d 20 74 76 6d 73 28 26 70 72 69 6f  me) - tvms(&prio
3d00: 72 53 65 6c 66 2e 72 75 5f 75 74 69 6d 65 29 2c  rSelf.ru_utime),
3d10: 0a 20 20 20 20 20 20 20 20 74 76 6d 73 28 26 73  .        tvms(&s
3d20: 65 6c 66 2e 72 75 5f 73 74 69 6d 65 29 20 2d 20  elf.ru_stime) - 
3d30: 74 76 6d 73 28 26 70 72 69 6f 72 53 65 6c 66 2e  tvms(&priorSelf.
3d40: 72 75 5f 73 74 69 6d 65 29 2c 0a 20 20 20 20 20  ru_stime),.     
3d50: 20 20 20 74 76 6d 73 28 26 63 68 69 6c 64 72 65     tvms(&childre
3d60: 6e 2e 72 75 5f 75 74 69 6d 65 29 20 2d 20 74 76  n.ru_utime) - tv
3d70: 6d 73 28 26 70 72 69 6f 72 43 68 69 6c 64 2e 72  ms(&priorChild.r
3d80: 75 5f 75 74 69 6d 65 29 2c 0a 20 20 20 20 20 20  u_utime),.      
3d90: 20 20 74 76 6d 73 28 26 63 68 69 6c 64 72 65 6e    tvms(&children
3da0: 2e 72 75 5f 73 74 69 6d 65 29 20 2d 20 74 76 6d  .ru_stime) - tvm
3db0: 73 28 26 70 72 69 6f 72 43 68 69 6c 64 2e 72 75  s(&priorChild.ru
3dc0: 5f 73 74 69 6d 65 29 2c 0a 20 20 20 20 20 20 20  _stime),.       
3dd0: 20 74 76 6d 73 28 26 6e 6f 77 29 20 2d 20 74 76   tvms(&now) - tv
3de0: 6d 73 28 26 62 65 67 69 6e 54 69 6d 65 29 2c 0a  ms(&beginTime),.
3df0: 20 20 20 20 20 20 20 20 6e 52 65 71 75 65 73 74          nRequest
3e00: 2c 20 45 73 63 61 70 65 28 7a 41 67 65 6e 74 29  , Escape(zAgent)
3e10: 2c 20 45 73 63 61 70 65 28 7a 52 4d 29 2c 0a 20  , Escape(zRM),. 
3e20: 20 20 20 20 20 20 20 28 69 6e 74 29 28 73 74 72         (int)(str
3e30: 6c 65 6e 28 7a 48 74 74 70 29 2b 73 74 72 6c 65  len(zHttp)+strle
3e40: 6e 28 7a 48 74 74 70 48 6f 73 74 29 2b 73 74 72  n(zHttpHost)+str
3e50: 6c 65 6e 28 7a 52 65 61 6c 53 63 72 69 70 74 29  len(zRealScript)
3e60: 2b 33 29 2c 0a 20 20 20 20 20 20 20 20 6c 69 6e  +3),.        lin
3e70: 65 4e 75 6d 0a 20 20 20 20 20 20 29 3b 0a 20 20  eNum.      );.  
3e80: 20 20 20 20 70 72 69 6f 72 53 65 6c 66 20 3d 20      priorSelf = 
3e90: 73 65 6c 66 3b 0a 20 20 20 20 20 20 70 72 69 6f  self;.      prio
3ea0: 72 43 68 69 6c 64 20 3d 20 63 68 69 6c 64 72 65  rChild = childre
3eb0: 6e 3b 0a 20 20 20 20 20 20 62 65 67 69 6e 54 69  n;.      beginTi
3ec0: 6d 65 20 3d 20 6e 6f 77 3b 0a 23 65 6e 64 69 66  me = now;.#endif
3ed0: 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6c 6f  .      fclose(lo
3ee0: 67 29 3b 0a 20 20 20 20 20 20 6e 49 6e 20 3d 20  g);.      nIn = 
3ef0: 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  nOut = 0;.    }.
3f00: 20 20 7d 0a 20 20 69 66 28 20 63 6c 6f 73 65 43    }.  if( closeC
3f10: 6f 6e 6e 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20  onnection ){.   
3f20: 20 65 78 69 74 28 65 78 69 74 43 6f 64 65 29 3b   exit(exitCode);
3f30: 0a 20 20 7d 0a 20 20 73 74 61 74 75 73 53 65 6e  .  }.  statusSen
3f40: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
3f50: 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
3f60: 73 61 66 65 6c 79 0a 2a 2f 0a 73 74 61 74 69 63  safely.*/.static
3f70: 20 63 68 61 72 20 2a 53 61 66 65 4d 61 6c 6c 6f   char *SafeMallo
3f80: 63 28 20 69 6e 74 20 73 69 7a 65 20 29 7b 0a 20  c( int size ){. 
3f90: 20 63 68 61 72 20 2a 70 3b 0a 0a 20 20 70 20 3d   char *p;..  p =
3fa0: 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 73   (char*)malloc(s
3fb0: 69 7a 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ize);.  if( p==0
3fc0: 20 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28 7a   ){.    strcpy(z
3fd0: 52 65 70 6c 79 53 74 61 74 75 73 2c 20 22 39 39  ReplyStatus, "99
3fe0: 38 22 29 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f 67  8");.    MakeLog
3ff0: 45 6e 74 72 79 28 31 2c 5f 5f 4c 49 4e 45 5f 5f  Entry(1,__LINE__
4000: 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 4d 61 6c 6c  );  /* LOG: Mall
4010: 6f 63 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20  oc() failed */. 
4020: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
4030: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
4040: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c  *.** Set the val
4050: 75 65 20 6f 66 20 65 6e 76 69 72 6f 6e 6d 65 6e  ue of environmen
4060: 74 20 76 61 72 69 61 62 6c 65 20 7a 56 61 72 20  t variable zVar 
4070: 74 6f 20 7a 56 61 6c 75 65 2e 0a 2a 2f 0a 73 74  to zValue..*/.st
4080: 61 74 69 63 20 76 6f 69 64 20 53 65 74 45 6e 76  atic void SetEnv
4090: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61  (const char *zVa
40a0: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
40b0: 56 61 6c 75 65 29 7b 0a 20 20 63 68 61 72 20 2a  Value){.  char *
40c0: 7a 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  z;.  int len;.  
40d0: 69 66 28 20 7a 56 61 6c 75 65 3d 3d 30 20 29 20  if( zValue==0 ) 
40e0: 7a 56 61 6c 75 65 3d 22 22 3b 0a 20 20 2f 2a 20  zValue="";.  /* 
40f0: 44 69 73 61 62 6c 65 20 61 6e 20 61 74 74 65 6d  Disable an attem
4100: 70 74 65 64 20 62 61 73 68 64 6f 6f 72 20 61 74  pted bashdoor at
4110: 74 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 73 74  tack */.  if( st
4120: 72 6e 63 6d 70 28 7a 56 61 6c 75 65 2c 22 28 29  rncmp(zValue,"()
4130: 20 7b 22 2c 34 29 3d 3d 30 20 29 20 7a 56 61 6c   {",4)==0 ) zVal
4140: 75 65 20 3d 20 22 22 3b 0a 20 20 6c 65 6e 20 3d  ue = "";.  len =
4150: 20 73 74 72 6c 65 6e 28 7a 56 61 72 29 20 2b 20   strlen(zVar) + 
4160: 73 74 72 6c 65 6e 28 7a 56 61 6c 75 65 29 20 2b  strlen(zValue) +
4170: 20 32 3b 0a 20 20 7a 20 3d 20 53 61 66 65 4d 61   2;.  z = SafeMa
4180: 6c 6c 6f 63 28 6c 65 6e 29 3b 0a 20 20 73 70 72  lloc(len);.  spr
4190: 69 6e 74 66 28 7a 2c 22 25 73 3d 25 73 22 2c 7a  intf(z,"%s=%s",z
41a0: 56 61 72 2c 7a 56 61 6c 75 65 29 3b 0a 20 20 70  Var,zValue);.  p
41b0: 75 74 65 6e 76 28 7a 29 3b 0a 7d 0a 0a 2f 2a 0a  utenv(z);.}../*.
41c0: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 66 69  ** Remove the fi
41d0: 72 73 74 20 73 70 61 63 65 2d 64 65 6c 69 6d 69  rst space-delimi
41e0: 74 65 64 20 74 6f 6b 65 6e 20 66 72 6f 6d 20 61  ted token from a
41f0: 20 73 74 72 69 6e 67 20 61 6e 64 20 72 65 74 75   string and retu
4200: 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
4210: 74 6f 20 69 74 2e 20 20 41 64 64 20 61 20 4e 55  to it.  Add a NU
4220: 4c 4c 20 74 6f 20 74 68 65 20 73 74 72 69 6e 67  LL to the string
4230: 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
4240: 65 20 74 6f 6b 65 6e 2e 0a 2a 2a 20 4d 61 6b 65  e token..** Make
4250: 20 2a 7a 4c 65 66 74 4f 76 65 72 20 70 6f 69 6e   *zLeftOver poin
4260: 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  t to the start o
4270: 66 20 74 68 65 20 6e 65 78 74 20 74 6f 6b 65 6e  f the next token
4280: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
4290: 20 2a 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e   *GetFirstElemen
42a0: 74 28 63 68 61 72 20 2a 7a 49 6e 70 75 74 2c 20  t(char *zInput, 
42b0: 63 68 61 72 20 2a 2a 7a 4c 65 66 74 4f 76 65 72  char **zLeftOver
42c0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65 73 75  ){.  char *zResu
42d0: 6c 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 49  lt = 0;.  if( zI
42e0: 6e 70 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  nput==0 ){.    i
42f0: 66 28 20 7a 4c 65 66 74 4f 76 65 72 20 29 20 2a  f( zLeftOver ) *
4300: 7a 4c 65 66 74 4f 76 65 72 20 3d 20 30 3b 0a 20  zLeftOver = 0;. 
4310: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
4320: 0a 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63  .  while( isspac
4330: 65 28 2a 7a 49 6e 70 75 74 29 20 29 7b 20 7a 49  e(*zInput) ){ zI
4340: 6e 70 75 74 2b 2b 3b 20 7d 0a 20 20 7a 52 65 73  nput++; }.  zRes
4350: 75 6c 74 20 3d 20 7a 49 6e 70 75 74 3b 0a 20 20  ult = zInput;.  
4360: 77 68 69 6c 65 28 20 2a 7a 49 6e 70 75 74 20 26  while( *zInput &
4370: 26 20 21 69 73 73 70 61 63 65 28 2a 7a 49 6e 70  & !isspace(*zInp
4380: 75 74 29 20 29 7b 20 7a 49 6e 70 75 74 2b 2b 3b  ut) ){ zInput++;
4390: 20 7d 0a 20 20 69 66 28 20 2a 7a 49 6e 70 75 74   }.  if( *zInput
43a0: 20 29 7b 0a 20 20 20 20 2a 7a 49 6e 70 75 74 20   ){.    *zInput 
43b0: 3d 20 30 3b 0a 20 20 20 20 7a 49 6e 70 75 74 2b  = 0;.    zInput+
43c0: 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73  +;.    while( is
43d0: 73 70 61 63 65 28 2a 7a 49 6e 70 75 74 29 20 29  space(*zInput) )
43e0: 7b 20 7a 49 6e 70 75 74 2b 2b 3b 20 7d 0a 20 20  { zInput++; }.  
43f0: 7d 0a 20 20 69 66 28 20 7a 4c 65 66 74 4f 76 65  }.  if( zLeftOve
4400: 72 20 29 7b 20 2a 7a 4c 65 66 74 4f 76 65 72 20  r ){ *zLeftOver 
4410: 3d 20 7a 49 6e 70 75 74 3b 20 7d 0a 20 20 72 65  = zInput; }.  re
4420: 74 75 72 6e 20 7a 52 65 73 75 6c 74 3b 0a 7d 0a  turn zResult;.}.
4430: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 63 6f  ./*.** Make a co
4440: 70 79 20 6f 66 20 61 20 73 74 72 69 6e 67 20 69  py of a string i
4450: 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
4460: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ned from malloc.
4470: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
4480: 2a 53 74 72 44 75 70 28 63 6f 6e 73 74 20 63 68  *StrDup(const ch
4490: 61 72 20 2a 7a 53 72 63 29 7b 0a 20 20 63 68 61  ar *zSrc){.  cha
44a0: 72 20 2a 7a 44 65 73 74 3b 0a 20 20 69 6e 74 20  r *zDest;.  int 
44b0: 73 69 7a 65 3b 0a 0a 20 20 69 66 28 20 7a 53 72  size;..  if( zSr
44c0: 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  c==0 ) return 0;
44d0: 0a 20 20 73 69 7a 65 20 3d 20 73 74 72 6c 65 6e  .  size = strlen
44e0: 28 7a 53 72 63 29 20 2b 20 31 3b 0a 20 20 7a 44  (zSrc) + 1;.  zD
44f0: 65 73 74 20 3d 20 28 63 68 61 72 2a 29 53 61 66  est = (char*)Saf
4500: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 20 29 3b  eMalloc( size );
4510: 0a 20 20 73 74 72 63 70 79 28 7a 44 65 73 74 2c  .  strcpy(zDest,
4520: 7a 53 72 63 29 3b 0a 20 20 72 65 74 75 72 6e 20  zSrc);.  return 
4530: 7a 44 65 73 74 3b 0a 7d 0a 73 74 61 74 69 63 20  zDest;.}.static 
4540: 63 68 61 72 20 2a 53 74 72 41 70 70 65 6e 64 28  char *StrAppend(
4550: 63 68 61 72 20 2a 7a 50 72 69 6f 72 2c 20 63 6f  char *zPrior, co
4560: 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 2c 20  nst char *zSep, 
4570: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63  const char *zSrc
4580: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 65 73 74  ){.  char *zDest
4590: 3b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20  ;.  int size;.  
45a0: 69 6e 74 20 6e 31 2c 20 6e 32 3b 0a 0a 20 20 69  int n1, n2;..  i
45b0: 66 28 20 7a 53 72 63 3d 3d 30 20 29 20 72 65 74  f( zSrc==0 ) ret
45c0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 7a 50 72  urn 0;.  if( zPr
45d0: 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ior==0 ) return 
45e0: 53 74 72 44 75 70 28 7a 53 72 63 29 3b 0a 20 20  StrDup(zSrc);.  
45f0: 73 69 7a 65 20 3d 20 28 6e 31 3d 73 74 72 6c 65  size = (n1=strle
4600: 6e 28 7a 53 72 63 29 29 20 2b 20 28 6e 32 3d 73  n(zSrc)) + (n2=s
4610: 74 72 6c 65 6e 28 7a 53 65 70 29 29 20 2b 20 73  trlen(zSep)) + s
4620: 74 72 6c 65 6e 28 7a 50 72 69 6f 72 29 20 2b 20  trlen(zPrior) + 
4630: 31 3b 0a 20 20 7a 44 65 73 74 20 3d 20 28 63 68  1;.  zDest = (ch
4640: 61 72 2a 29 53 61 66 65 4d 61 6c 6c 6f 63 28 20  ar*)SafeMalloc( 
4650: 73 69 7a 65 20 29 3b 0a 20 20 73 74 72 63 70 79  size );.  strcpy
4660: 28 7a 44 65 73 74 2c 7a 50 72 69 6f 72 29 3b 0a  (zDest,zPrior);.
4670: 20 20 66 72 65 65 28 7a 50 72 69 6f 72 29 3b 0a    free(zPrior);.
4680: 20 20 73 74 72 63 70 79 28 26 7a 44 65 73 74 5b    strcpy(&zDest[
4690: 6e 31 5d 2c 7a 53 65 70 29 3b 0a 20 20 73 74 72  n1],zSep);.  str
46a0: 63 70 79 28 26 7a 44 65 73 74 5b 6e 31 2b 6e 32  cpy(&zDest[n1+n2
46b0: 5d 2c 7a 53 72 63 29 3b 0a 20 20 72 65 74 75 72  ],zSrc);.  retur
46c0: 6e 20 7a 44 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zDest;.}../*.*
46d0: 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 45 54  * Compare two ET
46e0: 61 67 20 76 61 6c 75 65 73 2e 20 52 65 74 75 72  ag values. Retur
46f0: 6e 20 30 20 69 66 20 74 68 65 79 20 6d 61 74 63  n 0 if they matc
4700: 68 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69  h and non-zero i
4710: 66 20 74 68 65 79 20 64 69 66 66 65 72 2e 0a 2a  f they differ..*
4720: 2a 0a 2a 2a 20 54 68 65 20 6f 6e 65 20 6f 6e 20  *.** The one on 
4730: 74 68 65 20 6c 65 66 74 20 6d 69 67 68 74 20 62  the left might b
4740: 65 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  e a NULL pointer
4750: 20 61 6e 64 20 69 74 20 6d 69 67 68 74 20 62 65   and it might be
4760: 20 71 75 6f 74 65 64 2e 0a 2a 2f 0a 73 74 61 74   quoted..*/.stat
4770: 69 63 20 69 6e 74 20 43 6f 6d 70 61 72 65 45 74  ic int CompareEt
4780: 61 67 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ags(const char *
4790: 7a 41 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  zA, const char *
47a0: 7a 42 29 7b 0a 20 20 69 66 28 20 7a 41 3d 3d 30  zB){.  if( zA==0
47b0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
47c0: 66 28 20 7a 41 5b 30 5d 3d 3d 27 22 27 20 29 7b  f( zA[0]=='"' ){
47d0: 0a 20 20 20 20 69 6e 74 20 6c 65 6e 42 20 3d 20  .    int lenB = 
47e0: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 29 3b  (int)strlen(zB);
47f0: 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70  .    if( strncmp
4800: 28 7a 41 2b 31 2c 20 7a 42 2c 20 6c 65 6e 42 29  (zA+1, zB, lenB)
4810: 3d 3d 30 20 26 26 20 7a 41 5b 6c 65 6e 42 2b 31  ==0 && zA[lenB+1
4820: 5d 3d 3d 27 22 27 20 29 20 72 65 74 75 72 6e 20  ]=='"' ) return 
4830: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
4840: 73 74 72 63 6d 70 28 7a 41 2c 20 7a 42 29 3b 0a  strcmp(zA, zB);.
4850: 7d 0a 0a 2f 2a 0a 2a 2a 20 42 72 65 61 6b 20 61  }../*.** Break a
4860: 20 6c 69 6e 65 20 61 74 20 74 68 65 20 66 69 72   line at the fir
4870: 73 74 20 5c 6e 20 6f 72 20 5c 72 20 63 68 61 72  st \n or \r char
4880: 61 63 74 65 72 20 73 65 65 6e 2e 0a 2a 2f 0a 73  acter seen..*/.s
4890: 74 61 74 69 63 20 76 6f 69 64 20 52 65 6d 6f 76  tatic void Remov
48a0: 65 4e 65 77 6c 69 6e 65 28 63 68 61 72 20 2a 7a  eNewline(char *z
48b0: 29 7b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  ){.  if( z==0 ) 
48c0: 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28  return;.  while(
48d0: 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c 6e 27 20   *z && *z!='\n' 
48e0: 26 26 20 2a 7a 21 3d 27 5c 72 27 20 29 7b 20 7a  && *z!='\r' ){ z
48f0: 2b 2b 3b 20 7d 0a 20 20 2a 7a 20 3d 20 30 3b 0a  ++; }.  *z = 0;.
4900: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  }../*.** Print a
4910: 20 64 61 74 65 20 74 61 67 20 69 6e 20 74 68 65   date tag in the
4920: 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 6e 61   header.  The na
4930: 6d 65 20 6f 66 20 74 68 65 20 74 61 67 20 69 73  me of the tag is
4940: 20 7a 54 61 67 2e 0a 2a 2a 20 54 68 65 20 64 61   zTag..** The da
4950: 74 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  te is determined
4960: 20 66 72 6f 6d 20 74 68 65 20 75 6e 69 78 20 74   from the unix t
4970: 69 6d 65 73 74 61 6d 70 20 67 69 76 65 6e 2e 0a  imestamp given..
4980: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 61  */.static int Da
4990: 74 65 54 61 67 28 63 6f 6e 73 74 20 63 68 61 72  teTag(const char
49a0: 20 2a 7a 54 61 67 2c 20 74 69 6d 65 5f 74 20 74   *zTag, time_t t
49b0: 29 7b 0a 20 20 73 74 72 75 63 74 20 74 6d 20 2a  ){.  struct tm *
49c0: 74 6d 3b 0a 20 20 63 68 61 72 20 7a 44 61 74 65  tm;.  char zDate
49d0: 5b 31 30 30 5d 3b 0a 20 20 74 6d 20 3d 20 67 6d  [100];.  tm = gm
49e0: 74 69 6d 65 28 26 74 29 3b 0a 20 20 73 74 72 66  time(&t);.  strf
49f0: 74 69 6d 65 28 7a 44 61 74 65 2c 20 73 69 7a 65  time(zDate, size
4a00: 6f 66 28 7a 44 61 74 65 29 2c 20 22 25 61 2c 20  of(zDate), "%a, 
4a10: 25 64 20 25 62 20 25 59 20 25 48 3a 25 4d 3a 25  %d %b %Y %H:%M:%
4a20: 53 20 25 7a 22 2c 20 74 6d 29 3b 0a 20 20 72 65  S %z", tm);.  re
4a30: 74 75 72 6e 20 70 72 69 6e 74 66 28 22 25 73 3a  turn printf("%s:
4a40: 20 25 73 5c 72 5c 6e 22 2c 20 7a 54 61 67 2c 20   %s\r\n", zTag, 
4a50: 7a 44 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zDate);.}../*.**
4a60: 20 50 72 69 6e 74 20 74 68 65 20 66 69 72 73 74   Print the first
4a70: 20 6c 69 6e 65 20 6f 66 20 61 20 72 65 73 70 6f   line of a respo
4a80: 6e 73 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  nse followed by 
4a90: 74 68 65 20 73 65 72 76 65 72 20 74 79 70 65 2e  the server type.
4aa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4ab0: 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 63 6f  StartResponse(co
4ac0: 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 73 75 6c  nst char *zResul
4ad0: 74 43 6f 64 65 29 7b 0a 20 20 74 69 6d 65 5f 74  tCode){.  time_t
4ae0: 20 6e 6f 77 3b 0a 20 20 74 69 6d 65 28 26 6e 6f   now;.  time(&no
4af0: 77 29 3b 0a 20 20 69 66 28 20 73 74 61 74 75 73  w);.  if( status
4b00: 53 65 6e 74 20 29 20 72 65 74 75 72 6e 3b 0a 20  Sent ) return;. 
4b10: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
4b20: 22 25 73 20 25 73 5c 72 5c 6e 22 2c 20 7a 50 72  "%s %s\r\n", zPr
4b30: 6f 74 6f 63 6f 6c 2c 20 7a 52 65 73 75 6c 74 43  otocol, zResultC
4b40: 6f 64 65 29 3b 0a 20 20 73 74 72 6e 63 70 79 28  ode);.  strncpy(
4b50: 7a 52 65 70 6c 79 53 74 61 74 75 73 2c 20 7a 52  zReplyStatus, zR
4b60: 65 73 75 6c 74 43 6f 64 65 2c 20 33 29 3b 0a 20  esultCode, 3);. 
4b70: 20 7a 52 65 70 6c 79 53 74 61 74 75 73 5b 33 5d   zReplyStatus[3]
4b80: 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 52 65 70   = 0;.  if( zRep
4b90: 6c 79 53 74 61 74 75 73 5b 30 5d 3e 3d 27 34 27  lyStatus[0]>='4'
4ba0: 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 43 6f 6e   ){.    closeCon
4bb0: 6e 65 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d  nection = 1;.  }
4bc0: 0a 20 20 69 66 28 20 63 6c 6f 73 65 43 6f 6e 6e  .  if( closeConn
4bd0: 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 6e 4f  ection ){.    nO
4be0: 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f  ut += printf("Co
4bf0: 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f 73 65 5c  nnection: close\
4c00: 72 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  r\n");.  }else{.
4c10: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
4c20: 74 66 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20  tf("Connection: 
4c30: 6b 65 65 70 2d 61 6c 69 76 65 5c 72 5c 6e 22 29  keep-alive\r\n")
4c40: 3b 0a 20 20 7d 0a 20 20 6e 4f 75 74 20 2b 3d 20  ;.  }.  nOut += 
4c50: 44 61 74 65 54 61 67 28 22 44 61 74 65 22 2c 20  DateTag("Date", 
4c60: 6e 6f 77 29 3b 0a 20 20 73 74 61 74 75 73 53 65  now);.  statusSe
4c70: 6e 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nt = 1;.}../*.**
4c80: 20 54 65 6c 6c 20 74 68 65 20 63 6c 69 65 6e 74   Tell the client
4c90: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
4ca0: 6f 20 73 75 63 68 20 64 6f 63 75 6d 65 6e 74 0a  o such document.
4cb0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4e  */.static void N
4cc0: 6f 74 46 6f 75 6e 64 28 69 6e 74 20 6c 69 6e 65  otFound(int line
4cd0: 6e 6f 29 7b 0a 20 20 53 74 61 72 74 52 65 73 70  no){.  StartResp
4ce0: 6f 6e 73 65 28 22 34 30 34 20 4e 6f 74 20 46 6f  onse("404 Not Fo
4cf0: 75 6e 64 22 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d  und");.  nOut +=
4d00: 20 70 72 69 6e 74 66 28 0a 20 20 20 20 22 43 6f   printf(.    "Co
4d10: 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74  ntent-type: text
4d20: 2f 68 74 6d 6c 5c 72 5c 6e 22 0a 20 20 20 20 22  /html\r\n".    "
4d30: 5c 72 5c 6e 22 0a 20 20 20 20 22 3c 68 65 61 64  \r\n".    "<head
4d40: 3e 3c 74 69 74 6c 65 20 6c 69 6e 65 6e 6f 3d 5c  ><title lineno=\
4d50: 22 25 64 5c 22 3e 4e 6f 74 20 46 6f 75 6e 64 3c  "%d\">Not Found<
4d60: 2f 74 69 74 6c 65 3e 3c 2f 68 65 61 64 3e 5c 6e  /title></head>\n
4d70: 22 0a 20 20 20 20 22 3c 62 6f 64 79 3e 3c 68 31  ".    "<body><h1
4d80: 3e 44 6f 63 75 6d 65 6e 74 20 4e 6f 74 20 46 6f  >Document Not Fo
4d90: 75 6e 64 3c 2f 68 31 3e 5c 6e 22 0a 20 20 20 20  und</h1>\n".    
4da0: 22 54 68 65 20 64 6f 63 75 6d 65 6e 74 20 25 73  "The document %s
4db0: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
4dc0: 65 20 6f 6e 20 74 68 69 73 20 73 65 72 76 65 72  e on this server
4dd0: 5c 6e 22 0a 20 20 20 20 22 3c 2f 62 6f 64 79 3e  \n".    "</body>
4de0: 5c 6e 22 2c 20 6c 69 6e 65 6e 6f 2c 20 7a 53 63  \n", lineno, zSc
4df0: 72 69 70 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67  ript);.  MakeLog
4e00: 45 6e 74 72 79 28 30 2c 20 6c 69 6e 65 6e 6f 29  Entry(0, lineno)
4e10: 3b 0a 20 20 65 78 69 74 28 30 29 3b 0a 7d 0a 0a  ;.  exit(0);.}..
4e20: 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63  /*.** Tell the c
4e30: 6c 69 65 6e 74 20 74 68 61 74 20 74 68 65 79 20  lient that they 
4e40: 61 72 65 20 6e 6f 74 20 77 65 6c 63 6f 6d 65 64  are not welcomed
4e50: 20 68 65 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   here..*/.static
4e60: 20 76 6f 69 64 20 46 6f 72 62 69 64 64 65 6e 28   void Forbidden(
4e70: 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 53  int lineno){.  S
4e80: 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 34 30  tartResponse("40
4e90: 33 20 46 6f 72 62 69 64 64 65 6e 22 29 3b 0a 20  3 Forbidden");. 
4ea0: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
4eb0: 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79  .    "Content-ty
4ec0: 70 65 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c 72  pe: text/plain\r
4ed0: 5c 6e 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20  \n".    "\r\n". 
4ee0: 20 20 20 22 41 63 63 65 73 73 20 64 65 6e 69 65     "Access denie
4ef0: 64 5c 6e 22 0a 20 20 29 3b 0a 20 20 63 6c 6f 73  d\n".  );.  clos
4f00: 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 31 3b  eConnection = 1;
4f10: 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28  .  MakeLogEntry(
4f20: 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 65 78  0, lineno);.  ex
4f30: 69 74 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  it(0);.}../*.** 
4f40: 54 65 6c 6c 20 74 68 65 20 63 6c 69 65 6e 74 20  Tell the client 
4f50: 74 68 61 74 20 61 75 74 68 6f 72 69 7a 61 74 69  that authorizati
4f60: 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74  on is required t
4f70: 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20  o access the.** 
4f80: 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  document..*/.sta
4f90: 74 69 63 20 76 6f 69 64 20 4e 6f 74 41 75 74 68  tic void NotAuth
4fa0: 6f 72 69 7a 65 64 28 63 6f 6e 73 74 20 63 68 61  orized(const cha
4fb0: 72 20 2a 7a 52 65 61 6c 6d 29 7b 0a 20 20 53 74  r *zRealm){.  St
4fc0: 61 72 74 52 65 73 70 6f 6e 73 65 28 22 34 30 31  artResponse("401
4fd0: 20 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 52   Authorization R
4fe0: 65 71 75 69 72 65 64 22 29 3b 0a 20 20 6e 4f 75  equired");.  nOu
4ff0: 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20  t += printf(.   
5000: 20 22 57 57 57 2d 41 75 74 68 65 6e 74 69 63 61   "WWW-Authentica
5010: 74 65 3a 20 42 61 73 69 63 20 72 65 61 6c 6d 3d  te: Basic realm=
5020: 5c 22 25 73 5c 22 5c 72 5c 6e 22 0a 20 20 20 20  \"%s\"\r\n".    
5030: 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74  "Content-type: t
5040: 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e 22 0a 20 20  ext/html\r\n".  
5050: 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 22 3c 68    "\r\n".    "<h
5060: 65 61 64 3e 3c 74 69 74 6c 65 3e 4e 6f 74 20 41  ead><title>Not A
5070: 75 74 68 6f 72 69 7a 65 64 3c 2f 74 69 74 6c 65  uthorized</title
5080: 3e 3c 2f 68 65 61 64 3e 5c 6e 22 0a 20 20 20 20  ></head>\n".    
5090: 22 3c 62 6f 64 79 3e 3c 68 31 3e 34 30 31 20 4e  "<body><h1>401 N
50a0: 6f 74 20 41 75 74 68 6f 72 69 7a 65 64 3c 2f 68  ot Authorized</h
50b0: 31 3e 5c 6e 22 0a 20 20 20 20 22 41 20 6c 6f 67  1>\n".    "A log
50c0: 69 6e 20 61 6e 64 20 70 61 73 73 77 6f 72 64 20  in and password 
50d0: 61 72 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  are required for
50e0: 20 74 68 69 73 20 64 6f 63 75 6d 65 6e 74 5c 6e   this document\n
50f0: 22 0a 20 20 20 20 22 3c 2f 62 6f 64 79 3e 5c 6e  ".    "</body>\n
5100: 22 2c 20 7a 52 65 61 6c 6d 29 3b 0a 20 20 4d 61  ", zRealm);.  Ma
5110: 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 5f 5f  keLogEntry(0, __
5120: 4c 49 4e 45 5f 5f 29 3b 20 20 2f 2a 20 4c 4f 47  LINE__);  /* LOG
5130: 3a 20 4e 6f 74 20 61 75 74 68 6f 72 69 7a 65 64  : Not authorized
5140: 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c   */.}../*.** Tel
5150: 6c 20 74 68 65 20 63 6c 69 65 6e 74 20 74 68 61  l the client tha
5160: 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 72  t there is an er
5170: 72 6f 72 20 69 6e 20 74 68 65 20 73 63 72 69 70  ror in the scrip
5180: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
5190: 64 20 43 67 69 45 72 72 6f 72 28 76 6f 69 64 29  d CgiError(void)
51a0: 7b 0a 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73  {.  StartRespons
51b0: 65 28 22 35 30 30 20 45 72 72 6f 72 22 29 3b 0a  e("500 Error");.
51c0: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
51d0: 28 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74  (.    "Content-t
51e0: 79 70 65 3a 20 74 65 78 74 2f 68 74 6d 6c 5c 72  ype: text/html\r
51f0: 5c 6e 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20  \n".    "\r\n". 
5200: 20 20 20 22 3c 68 65 61 64 3e 3c 74 69 74 6c 65     "<head><title
5210: 3e 43 47 49 20 50 72 6f 67 72 61 6d 20 45 72 72  >CGI Program Err
5220: 6f 72 3c 2f 74 69 74 6c 65 3e 3c 2f 68 65 61 64  or</title></head
5230: 3e 5c 6e 22 0a 20 20 20 20 22 3c 62 6f 64 79 3e  >\n".    "<body>
5240: 3c 68 31 3e 43 47 49 20 50 72 6f 67 72 61 6d 20  <h1>CGI Program 
5250: 45 72 72 6f 72 3c 2f 68 31 3e 5c 6e 22 0a 20 20  Error</h1>\n".  
5260: 20 20 22 54 68 65 20 43 47 49 20 70 72 6f 67 72    "The CGI progr
5270: 61 6d 20 25 73 20 67 65 6e 65 72 61 74 65 64 20  am %s generated 
5280: 61 6e 20 65 72 72 6f 72 5c 6e 22 0a 20 20 20 20  an error\n".    
5290: 22 3c 2f 62 6f 64 79 3e 5c 6e 22 2c 20 7a 53 63  "</body>\n", zSc
52a0: 72 69 70 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67  ript);.  MakeLog
52b0: 45 6e 74 72 79 28 30 2c 20 5f 5f 4c 49 4e 45 5f  Entry(0, __LINE_
52c0: 5f 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 43 47 49  _);  /* LOG: CGI
52d0: 20 45 72 72 6f 72 20 2a 2f 0a 20 20 65 78 69 74   Error */.  exit
52e0: 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  (0);.}../*.** Th
52f0: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 69 66 20  is is called if 
5300: 77 65 20 74 69 6d 65 6f 75 74 20 6f 72 20 63 61  we timeout or ca
5310: 74 63 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6b  tch some other k
5320: 69 6e 64 20 6f 66 20 73 69 67 6e 61 6c 2e 0a 2a  ind of signal..*
5330: 2a 20 4c 6f 67 20 61 6e 20 65 72 72 6f 72 20 63  * Log an error c
5340: 6f 64 65 20 77 68 69 63 68 20 69 73 20 39 30 30  ode which is 900
5350: 2b 69 53 69 67 20 61 6e 64 20 74 68 65 6e 20 71  +iSig and then q
5360: 75 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  uit..*/.static v
5370: 6f 69 64 20 54 69 6d 65 6f 75 74 28 69 6e 74 20  oid Timeout(int 
5380: 69 53 69 67 29 7b 0a 20 20 69 66 28 20 21 64 65  iSig){.  if( !de
5390: 62 75 67 46 6c 61 67 20 29 7b 0a 20 20 20 20 69  bugFlag ){.    i
53a0: 66 28 20 7a 53 63 72 69 70 74 20 26 26 20 7a 53  f( zScript && zS
53b0: 63 72 69 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20  cript[0] ){.    
53c0: 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 5d 3b    char zBuf[10];
53d0: 0a 20 20 20 20 20 20 7a 42 75 66 5b 30 5d 20 3d  .      zBuf[0] =
53e0: 20 27 39 27 3b 0a 20 20 20 20 20 20 7a 42 75 66   '9';.      zBuf
53f0: 5b 31 5d 20 3d 20 27 30 27 20 2b 20 28 69 53 69  [1] = '0' + (iSi
5400: 67 2f 31 30 29 25 31 30 3b 0a 20 20 20 20 20 20  g/10)%10;.      
5410: 7a 42 75 66 5b 32 5d 20 3d 20 27 30 27 20 2b 20  zBuf[2] = '0' + 
5420: 69 53 69 67 25 31 30 3b 0a 20 20 20 20 20 20 7a  iSig%10;.      z
5430: 42 75 66 5b 33 5d 20 3d 20 30 3b 0a 20 20 20 20  Buf[3] = 0;.    
5440: 20 20 73 74 72 63 70 79 28 7a 52 65 70 6c 79 53    strcpy(zReplyS
5450: 74 61 74 75 73 2c 20 7a 42 75 66 29 3b 0a 20 20  tatus, zBuf);.  
5460: 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79      MakeLogEntry
5470: 28 30 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 20  (0, __LINE__);  
5480: 2f 2a 20 4c 4f 47 3a 20 54 69 6d 65 6f 75 74 20  /* LOG: Timeout 
5490: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 69  */.    }.    exi
54a0: 74 28 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  t(0);.  }.}../*.
54b0: 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c 69 65  ** Tell the clie
54c0: 6e 74 20 74 68 61 74 20 74 68 65 72 65 20 69 73  nt that there is
54d0: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65   an error in the
54e0: 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74   script..*/.stat
54f0: 69 63 20 76 6f 69 64 20 43 67 69 53 63 72 69 70  ic void CgiScrip
5500: 74 57 72 69 74 61 62 6c 65 28 76 6f 69 64 29 7b  tWritable(void){
5510: 0a 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65  .  StartResponse
5520: 28 22 35 30 30 20 43 47 49 20 43 6f 6e 66 69 67  ("500 CGI Config
5530: 75 72 61 74 69 6f 6e 20 45 72 72 6f 72 22 29 3b  uration Error");
5540: 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74  .  nOut += print
5550: 66 28 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d  f(.    "Content-
5560: 74 79 70 65 3a 20 74 65 78 74 2f 70 6c 61 69 6e  type: text/plain
5570: 5c 72 5c 6e 22 0a 20 20 20 20 22 5c 72 5c 6e 22  \r\n".    "\r\n"
5580: 0a 20 20 20 20 22 54 68 65 20 43 47 49 20 70 72  .    "The CGI pr
5590: 6f 67 72 61 6d 20 25 73 20 69 73 20 77 72 69 74  ogram %s is writ
55a0: 61 62 6c 65 20 62 79 20 75 73 65 72 73 20 6f 74  able by users ot
55b0: 68 65 72 20 74 68 61 6e 20 69 74 73 20 6f 77 6e  her than its own
55c0: 65 72 2e 5c 6e 22 2c 0a 20 20 20 20 7a 52 65 61  er.\n",.    zRea
55d0: 6c 53 63 72 69 70 74 29 3b 0a 20 20 4d 61 6b 65  lScript);.  Make
55e0: 4c 6f 67 45 6e 74 72 79 28 30 2c 20 5f 5f 4c 49  LogEntry(0, __LI
55f0: 4e 45 5f 5f 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20  NE__);  /* LOG: 
5600: 43 47 49 20 73 63 72 69 70 74 20 69 73 20 77 72  CGI script is wr
5610: 69 74 61 62 6c 65 20 2a 2f 0a 20 20 65 78 69 74  itable */.  exit
5620: 28 30 29 3b 20 20 20 20 20 20 20 0a 7d 0a 0a 2f  (0);       .}../
5630: 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c  *.** Tell the cl
5640: 69 65 6e 74 20 74 68 61 74 20 74 68 65 20 73 65  ient that the se
5650: 72 76 65 72 20 6d 61 6c 66 75 6e 63 74 69 6f 6e  rver malfunction
5660: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
5670: 69 64 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 69  id Malfunction(i
5680: 6e 74 20 6c 69 6e 65 6e 75 6d 2c 20 63 6f 6e 73  nt linenum, cons
5690: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
56a0: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
56b0: 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28   ap;.  va_start(
56c0: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
56d0: 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 35  StartResponse("5
56e0: 30 30 20 53 65 72 76 65 72 20 4d 61 6c 66 75 6e  00 Server Malfun
56f0: 63 74 69 6f 6e 22 29 3b 0a 20 20 6e 4f 75 74 20  ction");.  nOut 
5700: 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20 22  += printf(.    "
5710: 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65  Content-type: te
5720: 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20  xt/plain\r\n".  
5730: 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 22 57 65    "\r\n".    "We
5740: 62 20 73 65 72 76 65 72 20 6d 61 6c 66 75 6e 63  b server malfunc
5750: 74 69 6f 6e 65 64 3b 20 65 72 72 6f 72 20 6e 75  tioned; error nu
5760: 6d 62 65 72 20 25 64 5c 6e 5c 6e 22 2c 20 6c 69  mber %d\n\n", li
5770: 6e 65 6e 75 6d 29 3b 0a 20 20 69 66 28 20 7a 46  nenum);.  if( zF
5780: 6f 72 6d 61 74 20 29 7b 0a 20 20 20 20 6e 4f 75  ormat ){.    nOu
5790: 74 20 2b 3d 20 76 70 72 69 6e 74 66 28 7a 46 6f  t += vprintf(zFo
57a0: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 20  rmat, ap);.  }. 
57b0: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c   MakeLogEntry(0,
57c0: 20 6c 69 6e 65 6e 75 6d 29 3b 0a 20 20 65 78 69   linenum);.  exi
57d0: 74 28 30 29 3b 20 20 20 20 20 20 20 0a 7d 0a 0a  t(0);       .}..
57e0: 2f 2a 0a 2a 2a 20 44 6f 20 61 20 73 65 72 76 65  /*.** Do a serve
57f0: 72 20 72 65 64 69 72 65 63 74 20 74 6f 20 74 68  r redirect to th
5800: 65 20 64 6f 63 75 6d 65 6e 74 20 73 70 65 63 69  e document speci
5810: 66 69 65 64 2e 20 20 54 68 65 20 64 6f 63 75 6d  fied.  The docum
5820: 65 6e 74 0a 2a 2a 20 6e 61 6d 65 20 6e 6f 74 20  ent.** name not 
5830: 63 6f 6e 74 61 69 6e 20 73 63 68 65 6d 65 20 6f  contain scheme o
5840: 72 20 6e 65 74 77 6f 72 6b 20 6c 6f 63 61 74 69  r network locati
5850: 6f 6e 20 6f 72 20 74 68 65 20 71 75 65 72 79 20  on or the query 
5860: 73 74 72 69 6e 67 2e 0a 2a 2a 20 49 74 20 77 69  string..** It wi
5870: 6c 6c 20 62 65 20 6a 75 73 74 20 74 68 65 20 70  ll be just the p
5880: 61 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ath..*/.static v
5890: 6f 69 64 20 52 65 64 69 72 65 63 74 28 63 6f 6e  oid Redirect(con
58a0: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
58b0: 69 6e 74 20 66 69 6e 69 73 68 2c 20 69 6e 74 20  int finish, int 
58c0: 6c 69 6e 65 6e 6f 29 7b 0a 20 20 53 74 61 72 74  lineno){.  Start
58d0: 52 65 73 70 6f 6e 73 65 28 22 33 30 32 20 54 65  Response("302 Te
58e0: 6d 70 6f 72 61 72 79 20 52 65 64 69 72 65 63 74  mporary Redirect
58f0: 22 29 3b 0a 20 20 69 66 28 20 7a 53 65 72 76 65  ");.  if( zServe
5900: 72 50 6f 72 74 3d 3d 30 20 7c 7c 20 7a 53 65 72  rPort==0 || zSer
5910: 76 65 72 50 6f 72 74 5b 30 5d 3d 3d 30 20 7c 7c  verPort[0]==0 ||
5920: 20 73 74 72 63 6d 70 28 7a 53 65 72 76 65 72 50   strcmp(zServerP
5930: 6f 72 74 2c 22 38 30 22 29 3d 3d 30 20 29 7b 0a  ort,"80")==0 ){.
5940: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
5950: 74 66 28 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73  tf("Location: %s
5960: 3a 2f 2f 25 73 25 73 25 73 5c 72 5c 6e 22 2c 0a  ://%s%s%s\r\n",.
5970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5980: 20 20 20 7a 48 74 74 70 2c 20 7a 53 65 72 76 65     zHttp, zServe
5990: 72 4e 61 6d 65 2c 20 7a 50 61 74 68 2c 20 7a 51  rName, zPath, zQ
59a0: 75 65 72 79 53 75 66 66 69 78 29 3b 0a 20 20 7d  uerySuffix);.  }
59b0: 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 75 74 20 2b  else{.    nOut +
59c0: 3d 20 70 72 69 6e 74 66 28 22 4c 6f 63 61 74 69  = printf("Locati
59d0: 6f 6e 3a 20 25 73 3a 2f 2f 25 73 3a 25 73 25 73  on: %s://%s:%s%s
59e0: 25 73 5c 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %s\r\n",.       
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 48 74 74              zHtt
5a00: 70 2c 20 7a 53 65 72 76 65 72 4e 61 6d 65 2c 20  p, zServerName, 
5a10: 7a 53 65 72 76 65 72 50 6f 72 74 2c 20 7a 50 61  zServerPort, zPa
5a20: 74 68 2c 20 7a 51 75 65 72 79 53 75 66 66 69 78  th, zQuerySuffix
5a30: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 69 6e  );.  }.  if( fin
5a40: 69 73 68 20 29 7b 0a 20 20 20 20 6e 4f 75 74 20  ish ){.    nOut 
5a50: 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 74 65  += printf("Conte
5a60: 6e 74 2d 6c 65 6e 67 74 68 3a 20 30 5c 72 5c 6e  nt-length: 0\r\n
5a70: 22 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20  ");.    nOut += 
5a80: 70 72 69 6e 74 66 28 22 5c 72 5c 6e 22 29 3b 0a  printf("\r\n");.
5a90: 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79      MakeLogEntry
5aa0: 28 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d  (0, lineno);.  }
5ab0: 0a 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74  .  fflush(stdout
5ac0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
5ad0: 20 66 75 6e 63 74 69 6f 6e 20 74 72 65 61 74 73   function treats
5ae0: 20 69 74 73 20 69 6e 70 75 74 20 61 73 20 61 20   its input as a 
5af0: 62 61 73 65 2d 36 34 20 73 74 72 69 6e 67 20 61  base-64 string a
5b00: 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  nd returns the.*
5b10: 2a 20 64 65 63 6f 64 65 64 20 76 61 6c 75 65 20  * decoded value 
5b20: 6f 66 20 74 68 61 74 20 73 74 72 69 6e 67 2e 20  of that string. 
5b30: 20 43 68 61 72 61 63 74 65 72 73 20 6f 66 20 69   Characters of i
5b40: 6e 70 75 74 20 74 68 61 74 20 61 72 65 20 6e 6f  nput that are no
5b50: 74 0a 2a 2a 20 76 61 6c 69 64 20 62 61 73 65 2d  t.** valid base-
5b60: 36 34 20 63 68 61 72 61 63 74 65 72 73 20 28 73  64 characters (s
5b70: 75 63 68 20 61 73 20 73 70 61 63 65 73 20 61 6e  uch as spaces an
5b80: 64 20 6e 65 77 6c 69 6e 65 73 29 20 61 72 65 20  d newlines) are 
5b90: 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64  ignored..*/.void
5ba0: 20 44 65 63 6f 64 65 36 34 28 63 68 61 72 20 2a   Decode64(char *
5bb0: 7a 36 34 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44  z64){.  char *zD
5bc0: 61 74 61 3b 0a 20 20 69 6e 74 20 6e 36 34 3b 0a  ata;.  int n64;.
5bd0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
5be0: 74 20 61 2c 20 62 2c 20 63 2c 20 64 3b 0a 20 20  t a, b, c, d;.  
5bf0: 73 74 61 74 69 63 20 69 6e 74 20 69 73 49 6e 69  static int isIni
5c00: 74 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  t = 0;.  static 
5c10: 69 6e 74 20 74 72 61 6e 73 5b 31 32 38 5d 3b 0a  int trans[128];.
5c20: 20 20 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65    static unsigne
5c30: 64 20 63 68 61 72 20 7a 42 61 73 65 5b 5d 20 3d  d char zBase[] =
5c40: 20 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49   .    "ABCDEFGHI
5c50: 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59  JKLMNOPQRSTUVWXY
5c60: 5a 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  Zabcdefghijklmno
5c70: 70 71 72 73 74 75 76 77 78 79 7a 30 31 32 33 34  pqrstuvwxyz01234
5c80: 35 36 37 38 39 2b 2f 22 3b 0a 0a 20 20 69 66 28  56789+/";..  if(
5c90: 20 21 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20   !isInit ){.    
5ca0: 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20  for(i=0; i<128; 
5cb0: 69 2b 2b 29 7b 20 74 72 61 6e 73 5b 69 5d 20 3d  i++){ trans[i] =
5cc0: 20 30 3b 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d   0; }.    for(i=
5cd0: 30 3b 20 7a 42 61 73 65 5b 69 5d 3b 20 69 2b 2b  0; zBase[i]; i++
5ce0: 29 7b 20 74 72 61 6e 73 5b 7a 42 61 73 65 5b 69  ){ trans[zBase[i
5cf0: 5d 20 26 20 30 78 37 66 5d 20 3d 20 69 3b 20 7d  ] & 0x7f] = i; }
5d00: 0a 20 20 20 20 69 73 49 6e 69 74 20 3d 20 31 3b  .    isInit = 1;
5d10: 0a 20 20 7d 0a 20 20 6e 36 34 20 3d 20 73 74 72  .  }.  n64 = str
5d20: 6c 65 6e 28 7a 36 34 29 3b 0a 20 20 77 68 69 6c  len(z64);.  whil
5d30: 65 28 20 6e 36 34 3e 30 20 26 26 20 7a 36 34 5b  e( n64>0 && z64[
5d40: 6e 36 34 2d 31 5d 3d 3d 27 3d 27 20 29 20 6e 36  n64-1]=='=' ) n6
5d50: 34 2d 2d 3b 0a 20 20 7a 44 61 74 61 20 3d 20 7a  4--;.  zData = z
5d60: 36 34 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  64;.  for(i=j=0;
5d70: 20 69 2b 33 3c 6e 36 34 3b 20 69 2b 3d 34 29 7b   i+3<n64; i+=4){
5d80: 0a 20 20 20 20 61 20 3d 20 74 72 61 6e 73 5b 7a  .    a = trans[z
5d90: 36 34 5b 69 5d 20 26 20 30 78 37 66 5d 3b 0a 20  64[i] & 0x7f];. 
5da0: 20 20 20 62 20 3d 20 74 72 61 6e 73 5b 7a 36 34     b = trans[z64
5db0: 5b 69 2b 31 5d 20 26 20 30 78 37 66 5d 3b 0a 20  [i+1] & 0x7f];. 
5dc0: 20 20 20 63 20 3d 20 74 72 61 6e 73 5b 7a 36 34     c = trans[z64
5dd0: 5b 69 2b 32 5d 20 26 20 30 78 37 66 5d 3b 0a 20  [i+2] & 0x7f];. 
5de0: 20 20 20 64 20 3d 20 74 72 61 6e 73 5b 7a 36 34     d = trans[z64
5df0: 5b 69 2b 33 5d 20 26 20 30 78 37 66 5d 3b 0a 20  [i+3] & 0x7f];. 
5e00: 20 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20     zData[j++] = 
5e10: 28 28 61 3c 3c 32 29 20 26 20 30 78 66 63 29 20  ((a<<2) & 0xfc) 
5e20: 7c 20 28 28 62 3e 3e 34 29 20 26 20 30 78 30 33  | ((b>>4) & 0x03
5e30: 29 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b 2b  );.    zData[j++
5e40: 5d 20 3d 20 28 28 62 3c 3c 34 29 20 26 20 30 78  ] = ((b<<4) & 0x
5e50: 66 30 29 20 7c 20 28 28 63 3e 3e 32 29 20 26 20  f0) | ((c>>2) & 
5e60: 30 78 30 66 29 3b 0a 20 20 20 20 7a 44 61 74 61  0x0f);.    zData
5e70: 5b 6a 2b 2b 5d 20 3d 20 28 28 63 3c 3c 36 29 20  [j++] = ((c<<6) 
5e80: 26 20 30 78 63 30 29 20 7c 20 28 64 20 26 20 30  & 0xc0) | (d & 0
5e90: 78 33 66 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  x3f);.  }.  if( 
5ea0: 69 2b 32 3c 6e 36 34 20 29 7b 0a 20 20 20 20 61  i+2<n64 ){.    a
5eb0: 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 5d 20   = trans[z64[i] 
5ec0: 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 62 20 3d  & 0x7f];.    b =
5ed0: 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b 31 5d 20   trans[z64[i+1] 
5ee0: 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 63 20 3d  & 0x7f];.    c =
5ef0: 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b 32 5d 20   trans[z64[i+2] 
5f00: 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 7a 44 61  & 0x7f];.    zDa
5f10: 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28 61 3c 3c 32  ta[j++] = ((a<<2
5f20: 29 20 26 20 30 78 66 63 29 20 7c 20 28 28 62 3e  ) & 0xfc) | ((b>
5f30: 3e 34 29 20 26 20 30 78 30 33 29 3b 0a 20 20 20  >4) & 0x03);.   
5f40: 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28   zData[j++] = ((
5f50: 62 3c 3c 34 29 20 26 20 30 78 66 30 29 20 7c 20  b<<4) & 0xf0) | 
5f60: 28 28 63 3e 3e 32 29 20 26 20 30 78 30 66 29 3b  ((c>>2) & 0x0f);
5f70: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 2b 31  .  }else if( i+1
5f80: 3c 6e 36 34 20 29 7b 0a 20 20 20 20 61 20 3d 20  <n64 ){.    a = 
5f90: 74 72 61 6e 73 5b 7a 36 34 5b 69 5d 20 26 20 30  trans[z64[i] & 0
5fa0: 78 37 66 5d 3b 0a 20 20 20 20 62 20 3d 20 74 72  x7f];.    b = tr
5fb0: 61 6e 73 5b 7a 36 34 5b 69 2b 31 5d 20 26 20 30  ans[z64[i+1] & 0
5fc0: 78 37 66 5d 3b 0a 20 20 20 20 7a 44 61 74 61 5b  x7f];.    zData[
5fd0: 6a 2b 2b 5d 20 3d 20 28 28 61 3c 3c 32 29 20 26  j++] = ((a<<2) &
5fe0: 20 30 78 66 63 29 20 7c 20 28 28 62 3e 3e 34 29   0xfc) | ((b>>4)
5ff0: 20 26 20 30 78 30 33 29 3b 0a 20 20 7d 0a 20 20   & 0x03);.  }.  
6000: 7a 44 61 74 61 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a  zData[j] = 0;.}.
6010: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
6020: 73 65 65 20 69 66 20 62 61 73 69 63 20 61 75 74  see if basic aut
6030: 68 6f 72 69 7a 61 74 69 6f 6e 20 63 72 65 64 65  horization crede
6040: 6e 74 69 61 6c 73 20 61 72 65 20 70 72 6f 76 69  ntials are provi
6050: 64 65 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20 75  ded for.** the u
6060: 73 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ser according to
6070: 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
6080: 20 69 6e 20 7a 41 75 74 68 46 69 6c 65 2e 20 20   in zAuthFile.  
6090: 52 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69  Return true.** i
60a0: 66 20 61 75 74 68 6f 72 69 7a 65 64 2e 20 20 52  f authorized.  R
60b0: 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 6e  eturn false if n
60c0: 6f 74 20 61 75 74 68 6f 72 69 7a 65 64 2e 0a 2a  ot authorized..*
60d0: 2a 0a 2a 2a 20 46 69 6c 65 20 66 6f 72 6d 61 74  *.** File format
60e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 42 6c  :.**.**    *  Bl
60f0: 61 6e 6b 20 6c 69 6e 65 73 20 61 6e 64 20 6c 69  ank lines and li
6100: 6e 65 73 20 74 68 61 74 20 62 65 67 69 6e 20 77  nes that begin w
6110: 69 74 68 20 27 23 27 20 61 72 65 20 69 67 6e 6f  ith '#' are igno
6120: 72 65 64 0a 2a 2a 20 20 20 20 2a 20 20 22 68 74  red.**    *  "ht
6130: 74 70 2d 72 65 64 69 72 65 63 74 22 20 66 6f 72  tp-redirect" for
6140: 63 65 73 20 61 20 72 65 64 69 72 65 63 74 20 74  ces a redirect t
6150: 6f 20 48 54 54 50 53 20 69 66 20 6e 6f 74 20 74  o HTTPS if not t
6160: 68 65 72 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20  here already.** 
6170: 20 20 20 2a 20 20 22 68 74 74 70 73 2d 6f 6e 6c     *  "https-onl
6180: 79 22 20 64 69 73 61 6c 6c 6f 77 73 20 6f 70 65  y" disallows ope
6190: 72 61 74 69 6f 6e 20 69 6e 20 48 54 54 50 0a 2a  ration in HTTP.*
61a0: 2a 20 20 20 20 2a 20 20 22 75 73 65 72 20 4e 41  *    *  "user NA
61b0: 4d 45 20 4c 4f 47 49 4e 3a 50 41 53 53 57 4f 52  ME LOGIN:PASSWOR
61c0: 44 22 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  D" checks to see
61d0: 20 69 66 20 4c 4f 47 49 4e 3a 50 41 53 53 57 4f   if LOGIN:PASSWO
61e0: 52 44 20 0a 2a 2a 20 20 20 20 20 20 20 61 75 74  RD .**       aut
61f0: 68 6f 72 69 7a 61 74 69 6f 6e 20 63 72 65 64 65  horization crede
6200: 6e 74 69 61 6c 73 20 61 72 65 20 70 72 6f 76 69  ntials are provi
6210: 64 65 64 2c 20 61 6e 64 20 69 66 20 73 6f 20 73  ded, and if so s
6220: 65 74 73 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ets the.**      
6230: 20 52 45 4d 4f 54 45 5f 55 53 45 52 20 74 6f 20   REMOTE_USER to 
6240: 4e 41 4d 45 2e 0a 2a 2a 20 20 20 20 2a 20 20 22  NAME..**    *  "
6250: 72 65 61 6c 6d 20 54 45 58 54 22 20 73 65 74 73  realm TEXT" sets
6260: 20 74 68 65 20 72 65 61 6c 6d 20 74 6f 20 54 45   the realm to TE
6270: 58 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  XT..*/.static in
6280: 74 20 43 68 65 63 6b 42 61 73 69 63 41 75 74 68  t CheckBasicAuth
6290: 6f 72 69 7a 61 74 69 6f 6e 28 63 6f 6e 73 74 20  orization(const 
62a0: 63 68 61 72 20 2a 7a 41 75 74 68 46 69 6c 65 29  char *zAuthFile)
62b0: 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20  {.  FILE *in;.  
62c0: 63 68 61 72 20 2a 7a 52 65 61 6c 6d 20 3d 20 22  char *zRealm = "
62d0: 75 6e 6b 6e 6f 77 6e 20 72 65 61 6c 6d 22 3b 0a  unknown realm";.
62e0: 20 20 63 68 61 72 20 2a 7a 4c 6f 67 69 6e 50 73    char *zLoginPs
62f0: 77 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  wd;.  char *zNam
6300: 65 3b 0a 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b  e;.  char zLine[
6310: 32 30 30 30 5d 3b 0a 0a 20 20 69 6e 20 3d 20 66  2000];..  in = f
6320: 6f 70 65 6e 28 7a 41 75 74 68 46 69 6c 65 2c 20  open(zAuthFile, 
6330: 22 72 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d  "r");.  if( in==
6340: 30 20 29 7b 0a 20 20 20 20 4e 6f 74 46 6f 75 6e  0 ){.    NotFoun
6350: 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 20 2f 2a  d(__LINE__);  /*
6360: 20 4c 4f 47 3a 20 43 61 6e 6e 6f 74 20 6f 70 65   LOG: Cannot ope
6370: 6e 20 2d 61 75 74 68 20 66 69 6c 65 20 2a 2f 0a  n -auth file */.
6380: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6390: 7d 0a 20 20 69 66 28 20 7a 41 75 74 68 41 72 67  }.  if( zAuthArg
63a0: 20 29 20 44 65 63 6f 64 65 36 34 28 7a 41 75 74   ) Decode64(zAut
63b0: 68 41 72 67 29 3b 0a 20 20 77 68 69 6c 65 28 20  hArg);.  while( 
63c0: 66 67 65 74 73 28 7a 4c 69 6e 65 2c 20 73 69 7a  fgets(zLine, siz
63d0: 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 69 6e 29 20  eof(zLine), in) 
63e0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69  ){.    char *zFi
63f0: 65 6c 64 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61  eldName;.    cha
6400: 72 20 2a 7a 56 61 6c 3b 0a 0a 20 20 20 20 7a 46  r *zVal;..    zF
6410: 69 65 6c 64 4e 61 6d 65 20 3d 20 47 65 74 46 69  ieldName = GetFi
6420: 72 73 74 45 6c 65 6d 65 6e 74 28 7a 4c 69 6e 65  rstElement(zLine
6430: 2c 26 7a 56 61 6c 29 3b 0a 20 20 20 20 69 66 28  ,&zVal);.    if(
6440: 20 7a 46 69 65 6c 64 4e 61 6d 65 3d 3d 30 20 7c   zFieldName==0 |
6450: 7c 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 3d 3d 30  | *zFieldName==0
6460: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
6470: 20 69 66 28 20 7a 46 69 65 6c 64 4e 61 6d 65 5b   if( zFieldName[
6480: 30 5d 3d 3d 27 23 27 20 29 20 63 6f 6e 74 69 6e  0]=='#' ) contin
6490: 75 65 3b 0a 20 20 20 20 52 65 6d 6f 76 65 4e 65  ue;.    RemoveNe
64a0: 77 6c 69 6e 65 28 7a 56 61 6c 29 3b 0a 20 20 20  wline(zVal);.   
64b0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 65   if( strcmp(zFie
64c0: 6c 64 4e 61 6d 65 2c 20 22 72 65 61 6c 6d 22 29  ldName, "realm")
64d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 52 65  ==0 ){.      zRe
64e0: 61 6c 6d 20 3d 20 53 74 72 44 75 70 28 7a 56 61  alm = StrDup(zVa
64f0: 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  l);.    }else if
6500: 28 20 73 74 72 63 6d 70 28 7a 46 69 65 6c 64 4e  ( strcmp(zFieldN
6510: 61 6d 65 2c 22 75 73 65 72 22 29 3d 3d 30 20 29  ame,"user")==0 )
6520: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 75 74  {.      if( zAut
6530: 68 41 72 67 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  hArg==0 ) contin
6540: 75 65 3b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20  ue;.      zName 
6550: 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e  = GetFirstElemen
6560: 74 28 7a 56 61 6c 2c 20 26 7a 56 61 6c 29 3b 0a  t(zVal, &zVal);.
6570: 20 20 20 20 20 20 7a 4c 6f 67 69 6e 50 73 77 64        zLoginPswd
6580: 20 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65   = GetFirstEleme
6590: 6e 74 28 7a 56 61 6c 2c 20 26 7a 56 61 6c 29 3b  nt(zVal, &zVal);
65a0: 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 6f 67 69  .      if( zLogi
65b0: 6e 50 73 77 64 3d 3d 30 20 29 20 63 6f 6e 74 69  nPswd==0 ) conti
65c0: 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  nue;.      if( z
65d0: 41 75 74 68 41 72 67 20 26 26 20 73 74 72 63 6d  AuthArg && strcm
65e0: 70 28 7a 41 75 74 68 41 72 67 2c 7a 4c 6f 67 69  p(zAuthArg,zLogi
65f0: 6e 50 73 77 64 29 3d 3d 30 20 29 7b 0a 20 20 20  nPswd)==0 ){.   
6600: 20 20 20 20 20 7a 52 65 6d 6f 74 65 55 73 65 72       zRemoteUser
6610: 20 3d 20 53 74 72 44 75 70 28 7a 4e 61 6d 65 29   = StrDup(zName)
6620: 3b 0a 20 20 20 20 20 20 20 20 66 63 6c 6f 73 65  ;.        fclose
6630: 28 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 72 65  (in);.        re
6640: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
6650: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
6660: 72 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c  rcmp(zFieldName,
6670: 22 68 74 74 70 73 2d 6f 6e 6c 79 22 29 3d 3d 30  "https-only")==0
6680: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 75   ){.      if( !u
6690: 73 65 48 74 74 70 73 20 29 7b 0a 20 20 20 20 20  seHttps ){.     
66a0: 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49     NotFound(__LI
66b0: 4e 45 5f 5f 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20  NE__);  /* LOG: 
66c0: 20 68 74 74 70 20 72 65 71 75 65 73 74 20 6f 6e   http request on
66d0: 20 68 74 74 70 73 2d 6f 6e 6c 79 20 70 61 67 65   https-only page
66e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 63 6c 6f   */.        fclo
66f0: 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  se(in);.        
6700: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
6710: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
6720: 73 74 72 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d  strcmp(zFieldNam
6730: 65 2c 22 68 74 74 70 2d 72 65 64 69 72 65 63 74  e,"http-redirect
6740: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
6750: 66 28 20 21 75 73 65 48 74 74 70 73 20 29 7b 0a  f( !useHttps ){.
6760: 20 20 20 20 20 20 20 20 7a 48 74 74 70 20 3d 20          zHttp = 
6770: 22 68 74 74 70 73 22 3b 0a 20 20 20 20 20 20 20  "https";.       
6780: 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20   sprintf(zLine, 
6790: 22 25 73 25 73 22 2c 20 7a 53 63 72 69 70 74 2c  "%s%s", zScript,
67a0: 20 7a 50 61 74 68 49 6e 66 6f 29 3b 0a 20 20 20   zPathInfo);.   
67b0: 20 20 20 20 20 52 65 64 69 72 65 63 74 28 7a 4c       Redirect(zL
67c0: 69 6e 65 2c 20 31 2c 20 5f 5f 4c 49 4e 45 5f 5f  ine, 1, __LINE__
67d0: 29 3b 20 2f 2a 20 4c 4f 47 3a 20 2d 61 75 74 68  ); /* LOG: -auth
67e0: 20 72 65 64 69 72 65 63 74 20 2a 2f 0a 20 20 20   redirect */.   
67f0: 20 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b       fclose(in);
6800: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6810: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
6820: 65 6c 73 65 7b 0a 20 20 20 20 20 20 4e 6f 74 46  else{.      NotF
6830: 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20  ound(__LINE__); 
6840: 20 2f 2a 20 4c 4f 47 3a 20 20 6d 61 6c 66 6f 72   /* LOG:  malfor
6850: 6d 65 64 20 65 6e 74 72 79 20 69 6e 20 2d 61 75  med entry in -au
6860: 74 68 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20  th file */.     
6870: 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20   fclose(in);.   
6880: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
6890: 20 7d 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28   }.  }.  fclose(
68a0: 69 6e 29 3b 0a 20 20 4e 6f 74 41 75 74 68 6f 72  in);.  NotAuthor
68b0: 69 7a 65 64 28 7a 52 65 61 6c 6d 29 3b 0a 20 20  ized(zRealm);.  
68c0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
68d0: 2a 2a 20 47 75 65 73 73 20 74 68 65 20 6d 69 6d  ** Guess the mim
68e0: 65 2d 74 79 70 65 20 6f 66 20 61 20 64 6f 63 75  e-type of a docu
68f0: 6d 65 6e 74 20 62 61 73 65 64 20 6f 6e 20 69 74  ment based on it
6900: 73 20 6e 61 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  s name..*/.const
6910: 20 63 68 61 72 20 2a 47 65 74 4d 69 6d 65 54 79   char *GetMimeTy
6920: 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  pe(const char *z
6930: 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29  Name, int nName)
6940: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
6950: 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  z;.  int i;.  in
6960: 74 20 66 69 72 73 74 2c 20 6c 61 73 74 3b 0a 20  t first, last;. 
6970: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 63 68 61 72   int len;.  char
6980: 20 7a 53 75 66 66 69 78 5b 32 30 5d 3b 0a 0a 20   zSuffix[20];.. 
6990: 20 2f 2a 20 41 20 74 61 62 6c 65 20 6f 66 20 6d   /* A table of m
69a0: 69 6d 65 74 79 70 65 73 20 62 61 73 65 64 20 6f  imetypes based o
69b0: 6e 20 66 69 6c 65 20 73 75 66 66 69 78 65 73 2e  n file suffixes.
69c0: 20 0a 20 20 2a 2a 20 53 75 66 66 69 78 65 73 20   .  ** Suffixes 
69d0: 6d 75 73 74 20 62 65 20 69 6e 20 73 6f 72 74 65  must be in sorte
69e0: 64 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20  d order so that 
69f0: 77 65 20 63 61 6e 20 64 6f 20 61 20 62 69 6e 61  we can do a bina
6a00: 72 79 0a 20 20 2a 2a 20 73 65 61 72 63 68 20 74  ry.  ** search t
6a10: 6f 20 66 69 6e 64 20 74 68 65 20 6d 69 6d 65 2d  o find the mime-
6a20: 74 79 70 65 0a 20 20 2a 2f 0a 20 20 73 74 61 74  type.  */.  stat
6a30: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
6a40: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
6a50: 20 2a 7a 53 75 66 66 69 78 3b 20 20 20 20 20 20   *zSuffix;      
6a60: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66   /* The file suf
6a70: 66 69 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  fix */.    int s
6a80: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
6a90: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
6aa0: 6f 66 20 74 68 65 20 73 75 66 66 69 78 20 2a 2f  of the suffix */
6ab0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
6ac0: 2a 7a 4d 69 6d 65 74 79 70 65 3b 20 20 20 20 20  *zMimetype;     
6ad0: 2f 2a 20 54 68 65 20 63 6f 72 72 65 73 70 6f 6e  /* The correspon
6ae0: 64 69 6e 67 20 6d 69 6d 65 74 79 70 65 20 2a 2f  ding mimetype */
6af0: 0a 20 20 7d 20 61 4d 69 6d 65 5b 5d 20 3d 20 7b  .  } aMime[] = {
6b00: 0a 20 20 20 20 7b 20 22 61 69 22 2c 20 20 20 20  .    { "ai",    
6b10: 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61       2, "applica
6b20: 74 69 6f 6e 2f 70 6f 73 74 73 63 72 69 70 74 22  tion/postscript"
6b30: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6b40: 20 20 20 7b 20 22 61 69 66 22 2c 20 20 20 20 20     { "aif",     
6b50: 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 61     3, "audio/x-a
6b60: 69 66 66 22 20 20 20 20 20 20 20 20 20 20 20 20  iff"            
6b70: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6b80: 20 7b 20 22 61 69 66 63 22 2c 20 20 20 20 20 20   { "aifc",      
6b90: 20 34 2c 20 22 61 75 64 69 6f 2f 78 2d 61 69 66   4, "audio/x-aif
6ba0: 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f"              
6bb0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6bc0: 20 22 61 69 66 66 22 2c 20 20 20 20 20 20 20 34   "aiff",       4
6bd0: 2c 20 22 61 75 64 69 6f 2f 78 2d 61 69 66 66 22  , "audio/x-aiff"
6be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bf0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6c00: 61 72 6a 22 2c 20 20 20 20 20 20 20 20 33 2c 20  arj",        3, 
6c10: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 61  "application/x-a
6c20: 72 6a 2d 63 6f 6d 70 72 65 73 73 65 64 22 20 20  rj-compressed"  
6c30: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 73      },.    { "as
6c40: 63 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74  c",        3, "t
6c50: 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20  ext/plain"      
6c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c70: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 73 66 22    },.    { "asf"
6c80: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64  ,        3, "vid
6c90: 65 6f 2f 78 2d 6d 73 2d 61 73 66 22 20 20 20 20  eo/x-ms-asf"    
6ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cb0: 7d 2c 0a 20 20 20 20 7b 20 22 61 73 78 22 2c 20  },.    { "asx", 
6cc0: 20 20 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f         3, "video
6cd0: 2f 78 2d 6d 73 2d 61 73 78 22 20 20 20 20 20 20  /x-ms-asx"      
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6cf0: 0a 20 20 20 20 7b 20 22 61 75 22 2c 20 20 20 20  .    { "au",    
6d00: 20 20 20 20 20 32 2c 20 22 61 75 64 69 6f 2f 75       2, "audio/u
6d10: 6c 61 77 22 20 20 20 20 20 20 20 20 20 20 20 20  law"            
6d20: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6d30: 20 20 20 7b 20 22 61 76 69 22 2c 20 20 20 20 20     { "avi",     
6d40: 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d     3, "video/x-m
6d50: 73 76 69 64 65 6f 22 20 20 20 20 20 20 20 20 20  svideo"         
6d60: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6d70: 20 7b 20 22 62 61 74 22 2c 20 20 20 20 20 20 20   { "bat",       
6d80: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
6d90: 2f 78 2d 6d 73 64 6f 73 2d 70 72 6f 67 72 61 6d  /x-msdos-program
6da0: 22 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  "       },.    {
6db0: 20 22 62 63 70 69 6f 22 2c 20 20 20 20 20 20 35   "bcpio",      5
6dc0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
6dd0: 2d 62 63 70 69 6f 22 20 20 20 20 20 20 20 20 20  -bcpio"         
6de0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6df0: 62 69 6e 22 2c 20 20 20 20 20 20 20 20 33 2c 20  bin",        3, 
6e00: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74  "application/oct
6e10: 65 74 2d 73 74 72 65 61 6d 22 20 20 20 20 20 20  et-stream"      
6e20: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 22      },.    { "c"
6e30: 2c 20 20 20 20 20 20 20 20 20 20 31 2c 20 22 74  ,          1, "t
6e40: 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20  ext/plain"      
6e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e60: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 63 22 2c    },.    { "cc",
6e70: 20 20 20 20 20 20 20 20 20 32 2c 20 22 74 65 78           2, "tex
6e80: 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20  t/plain"        
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ea0: 7d 2c 0a 20 20 20 20 7b 20 22 63 63 61 64 22 2c  },.    { "ccad",
6eb0: 20 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69         4, "appli
6ec0: 63 61 74 69 6f 6e 2f 63 6c 61 72 69 73 63 61 64  cation/clariscad
6ed0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  "             },
6ee0: 0a 20 20 20 20 7b 20 22 63 64 66 22 2c 20 20 20  .    { "cdf",   
6ef0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
6f00: 74 69 6f 6e 2f 78 2d 6e 65 74 63 64 66 22 20 20  tion/x-netcdf"  
6f10: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6f20: 20 20 20 7b 20 22 63 6c 61 73 73 22 2c 20 20 20     { "class",   
6f30: 20 20 20 35 2c 20 22 61 70 70 6c 69 63 61 74 69     5, "applicati
6f40: 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22  on/octet-stream"
6f50: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6f60: 20 7b 20 22 63 6f 64 22 2c 20 20 20 20 20 20 20   { "cod",       
6f70: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
6f80: 2f 76 6e 64 2e 72 69 6d 2e 63 6f 64 22 20 20 20  /vnd.rim.cod"   
6f90: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6fa0: 20 22 63 6f 6d 22 2c 20 20 20 20 20 20 20 20 33   "com",        3
6fb0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
6fc0: 2d 6d 73 64 6f 73 2d 70 72 6f 67 72 61 6d 22 20  -msdos-program" 
6fd0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6fe0: 63 70 69 6f 22 2c 20 20 20 20 20 20 20 34 2c 20  cpio",       4, 
6ff0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 63  "application/x-c
7000: 70 69 6f 22 20 20 20 20 20 20 20 20 20 20 20 20  pio"            
7010: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 70      },.    { "cp
7020: 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  t",        3, "a
7030: 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 61 63 2d 63  pplication/mac-c
7040: 6f 6d 70 61 63 74 70 72 6f 22 20 20 20 20 20 20  ompactpro"      
7050: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 73 68 22    },.    { "csh"
7060: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
7070: 6c 69 63 61 74 69 6f 6e 2f 78 2d 63 73 68 22 20  lication/x-csh" 
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7090: 7d 2c 0a 20 20 20 20 7b 20 22 63 73 73 22 2c 20  },.    { "css", 
70a0: 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f         3, "text/
70b0: 63 73 73 22 20 20 20 20 20 20 20 20 20 20 20 20  css"            
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
70d0: 0a 20 20 20 20 7b 20 22 64 63 72 22 2c 20 20 20  .    { "dcr",   
70e0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
70f0: 74 69 6f 6e 2f 78 2d 64 69 72 65 63 74 6f 72 22  tion/x-director"
7100: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7110: 20 20 20 7b 20 22 64 65 62 22 2c 20 20 20 20 20     { "deb",     
7120: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
7130: 6f 6e 2f 78 2d 64 65 62 69 61 6e 2d 70 61 63 6b  on/x-debian-pack
7140: 61 67 65 22 20 20 20 20 20 20 7d 2c 0a 20 20 20  age"      },.   
7150: 20 7b 20 22 64 69 72 22 2c 20 20 20 20 20 20 20   { "dir",       
7160: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
7170: 2f 78 2d 64 69 72 65 63 74 6f 72 22 20 20 20 20  /x-director"    
7180: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7190: 20 22 64 6c 22 2c 20 20 20 20 20 20 20 20 20 32   "dl",         2
71a0: 2c 20 22 76 69 64 65 6f 2f 64 6c 22 20 20 20 20  , "video/dl"    
71b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71c0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
71d0: 64 6d 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20  dms",        3, 
71e0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74  "application/oct
71f0: 65 74 2d 73 74 72 65 61 6d 22 20 20 20 20 20 20  et-stream"      
7200: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 6f      },.    { "do
7210: 63 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  c",        3, "a
7220: 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 77 6f 72  pplication/mswor
7230: 64 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d"              
7240: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 72 77 22    },.    { "drw"
7250: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
7260: 6c 69 63 61 74 69 6f 6e 2f 64 72 61 66 74 69 6e  lication/draftin
7270: 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g"              
7280: 7d 2c 0a 20 20 20 20 7b 20 22 64 76 69 22 2c 20  },.    { "dvi", 
7290: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
72a0: 63 61 74 69 6f 6e 2f 78 2d 64 76 69 22 20 20 20  cation/x-dvi"   
72b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
72c0: 0a 20 20 20 20 7b 20 22 64 77 67 22 2c 20 20 20  .    { "dwg",   
72d0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
72e0: 74 69 6f 6e 2f 61 63 61 64 22 20 20 20 20 20 20  tion/acad"      
72f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7300: 20 20 20 7b 20 22 64 78 66 22 2c 20 20 20 20 20     { "dxf",     
7310: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
7320: 6f 6e 2f 64 78 66 22 20 20 20 20 20 20 20 20 20  on/dxf"         
7330: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7340: 20 7b 20 22 64 78 72 22 2c 20 20 20 20 20 20 20   { "dxr",       
7350: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
7360: 2f 78 2d 64 69 72 65 63 74 6f 72 22 20 20 20 20  /x-director"    
7370: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7380: 20 22 65 70 73 22 2c 20 20 20 20 20 20 20 20 33   "eps",        3
7390: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70  , "application/p
73a0: 6f 73 74 73 63 72 69 70 74 22 20 20 20 20 20 20  ostscript"      
73b0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
73c0: 65 74 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20  etx",        3, 
73d0: 22 74 65 78 74 2f 78 2d 73 65 74 65 78 74 22 20  "text/x-setext" 
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73f0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65 78      },.    { "ex
7400: 65 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  e",        3, "a
7410: 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74  pplication/octet
7420: 2d 73 74 72 65 61 6d 22 20 20 20 20 20 20 20 20  -stream"        
7430: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65 7a 22 2c    },.    { "ez",
7440: 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70 70           2, "app
7450: 6c 69 63 61 74 69 6f 6e 2f 61 6e 64 72 65 77 2d  lication/andrew-
7460: 69 6e 73 65 74 22 20 20 20 20 20 20 20 20 20 20  inset"          
7470: 7d 2c 0a 20 20 20 20 7b 20 22 66 22 2c 20 20 20  },.    { "f",   
7480: 20 20 20 20 20 20 20 31 2c 20 22 74 65 78 74 2f         1, "text/
7490: 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20 20  plain"          
74a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
74b0: 0a 20 20 20 20 7b 20 22 66 39 30 22 2c 20 20 20  .    { "f90",   
74c0: 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 70 6c       3, "text/pl
74d0: 61 69 6e 22 20 20 20 20 20 20 20 20 20 20 20 20  ain"            
74e0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
74f0: 20 20 20 7b 20 22 66 6c 69 22 2c 20 20 20 20 20     { "fli",     
7500: 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 66 6c 69     3, "video/fli
7510: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
7520: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7530: 20 7b 20 22 66 6c 76 22 2c 20 20 20 20 20 20 20   { "flv",       
7540: 20 33 2c 20 22 76 69 64 65 6f 2f 66 6c 76 22 20   3, "video/flv" 
7550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7560: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7570: 20 22 67 69 66 22 2c 20 20 20 20 20 20 20 20 33   "gif",        3
7580: 2c 20 22 69 6d 61 67 65 2f 67 69 66 22 20 20 20  , "image/gif"   
7590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75a0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
75b0: 67 6c 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  gl",         2, 
75c0: 22 76 69 64 65 6f 2f 67 6c 22 20 20 20 20 20 20  "video/gl"      
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75e0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 67 74      },.    { "gt
75f0: 61 72 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61  ar",       4, "a
7600: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 67 74 61  pplication/x-gta
7610: 72 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r"              
7620: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 67 7a 22 2c    },.    { "gz",
7630: 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70 70           2, "app
7640: 6c 69 63 61 74 69 6f 6e 2f 78 2d 67 7a 69 70 22  lication/x-gzip"
7650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7660: 7d 2c 0a 20 20 20 20 7b 20 22 68 64 66 22 2c 20  },.    { "hdf", 
7670: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
7680: 63 61 74 69 6f 6e 2f 78 2d 68 64 66 22 20 20 20  cation/x-hdf"   
7690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
76a0: 0a 20 20 20 20 7b 20 22 68 68 22 2c 20 20 20 20  .    { "hh",    
76b0: 20 20 20 20 20 32 2c 20 22 74 65 78 74 2f 70 6c       2, "text/pl
76c0: 61 69 6e 22 20 20 20 20 20 20 20 20 20 20 20 20  ain"            
76d0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
76e0: 20 20 20 7b 20 22 68 71 78 22 2c 20 20 20 20 20     { "hqx",     
76f0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
7700: 6f 6e 2f 6d 61 63 2d 62 69 6e 68 65 78 34 30 22  on/mac-binhex40"
7710: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7720: 20 7b 20 22 68 22 2c 20 20 20 20 20 20 20 20 20   { "h",         
7730: 20 31 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22   1, "text/plain"
7740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7750: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7760: 20 22 68 74 6d 22 2c 20 20 20 20 20 20 20 20 33   "htm",        3
7770: 2c 20 22 74 65 78 74 2f 68 74 6d 6c 3b 20 63 68  , "text/html; ch
7780: 61 72 73 65 74 3d 75 74 66 2d 38 22 20 20 20 20  arset=utf-8"    
7790: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
77a0: 68 74 6d 6c 22 2c 20 20 20 20 20 20 20 34 2c 20  html",       4, 
77b0: 22 74 65 78 74 2f 68 74 6d 6c 3b 20 63 68 61 72  "text/html; char
77c0: 73 65 74 3d 75 74 66 2d 38 22 20 20 20 20 20 20  set=utf-8"      
77d0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 63      },.    { "ic
77e0: 65 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 78  e",        3, "x
77f0: 2d 63 6f 6e 66 65 72 65 6e 63 65 2f 78 2d 63 6f  -conference/x-co
7800: 6f 6c 74 61 6c 6b 22 20 20 20 20 20 20 20 20 20  oltalk"         
7810: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 65 66 22    },.    { "ief"
7820: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61  ,        3, "ima
7830: 67 65 2f 69 65 66 22 20 20 20 20 20 20 20 20 20  ge/ief"         
7840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7850: 7d 2c 0a 20 20 20 20 7b 20 22 69 67 65 73 22 2c  },.    { "iges",
7860: 20 20 20 20 20 20 20 34 2c 20 22 6d 6f 64 65 6c         4, "model
7870: 2f 69 67 65 73 22 20 20 20 20 20 20 20 20 20 20  /iges"          
7880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7890: 0a 20 20 20 20 7b 20 22 69 67 73 22 2c 20 20 20  .    { "igs",   
78a0: 20 20 20 20 20 33 2c 20 22 6d 6f 64 65 6c 2f 69       3, "model/i
78b0: 67 65 73 22 20 20 20 20 20 20 20 20 20 20 20 20  ges"            
78c0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
78d0: 20 20 20 7b 20 22 69 70 73 22 2c 20 20 20 20 20     { "ips",     
78e0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
78f0: 6f 6e 2f 78 2d 69 70 73 63 72 69 70 74 22 20 20  on/x-ipscript"  
7900: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7910: 20 7b 20 22 69 70 78 22 2c 20 20 20 20 20 20 20   { "ipx",       
7920: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
7930: 2f 78 2d 69 70 69 78 22 20 20 20 20 20 20 20 20  /x-ipix"        
7940: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7950: 20 22 6a 61 64 22 2c 20 20 20 20 20 20 20 20 33   "jad",        3
7960: 2c 20 22 74 65 78 74 2f 76 6e 64 2e 73 75 6e 2e  , "text/vnd.sun.
7970: 6a 32 6d 65 2e 61 70 70 2d 64 65 73 63 72 69 70  j2me.app-descrip
7980: 74 6f 72 22 20 20 7d 2c 0a 20 20 20 20 7b 20 22  tor"  },.    { "
7990: 6a 61 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20  jar",        3, 
79a0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6a 61 76  "application/jav
79b0: 61 2d 61 72 63 68 69 76 65 22 20 20 20 20 20 20  a-archive"      
79c0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 70      },.    { "jp
79d0: 65 67 22 2c 20 20 20 20 20 20 20 34 2c 20 22 69  eg",       4, "i
79e0: 6d 61 67 65 2f 6a 70 65 67 22 20 20 20 20 20 20  mage/jpeg"      
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a00: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 70 65 22    },.    { "jpe"
7a10: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61  ,        3, "ima
7a20: 67 65 2f 6a 70 65 67 22 20 20 20 20 20 20 20 20  ge/jpeg"        
7a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a40: 7d 2c 0a 20 20 20 20 7b 20 22 6a 70 67 22 2c 20  },.    { "jpg", 
7a50: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
7a60: 2f 6a 70 65 67 22 20 20 20 20 20 20 20 20 20 20  /jpeg"          
7a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7a80: 0a 20 20 20 20 7b 20 22 6a 73 22 2c 20 20 20 20  .    { "js",    
7a90: 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61       2, "applica
7aa0: 74 69 6f 6e 2f 78 2d 6a 61 76 61 73 63 72 69 70  tion/x-javascrip
7ab0: 74 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  t"          },. 
7ac0: 20 20 20 7b 20 22 6b 61 72 22 2c 20 20 20 20 20     { "kar",     
7ad0: 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 6d 69 64     3, "audio/mid
7ae0: 69 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i"              
7af0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7b00: 20 7b 20 22 6c 61 74 65 78 22 2c 20 20 20 20 20   { "latex",     
7b10: 20 35 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   5, "application
7b20: 2f 78 2d 6c 61 74 65 78 22 20 20 20 20 20 20 20  /x-latex"       
7b30: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7b40: 20 22 6c 68 61 22 2c 20 20 20 20 20 20 20 20 33   "lha",        3
7b50: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f  , "application/o
7b60: 63 74 65 74 2d 73 74 72 65 61 6d 22 20 20 20 20  ctet-stream"    
7b70: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7b80: 6c 73 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20  lsp",        3, 
7b90: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6c  "application/x-l
7ba0: 69 73 70 22 20 20 20 20 20 20 20 20 20 20 20 20  isp"            
7bb0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 7a      },.    { "lz
7bc0: 68 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  h",        3, "a
7bd0: 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74  pplication/octet
7be0: 2d 73 74 72 65 61 6d 22 20 20 20 20 20 20 20 20  -stream"        
7bf0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 22 2c 20    },.    { "m", 
7c00: 20 20 20 20 20 20 20 20 20 31 2c 20 22 74 65 78           1, "tex
7c10: 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20  t/plain"        
7c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c30: 7d 2c 0a 20 20 20 20 7b 20 22 6d 33 75 22 2c 20  },.    { "m3u", 
7c40: 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f         3, "audio
7c50: 2f 78 2d 6d 70 65 67 75 72 6c 22 20 20 20 20 20  /x-mpegurl"     
7c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7c70: 0a 20 20 20 20 7b 20 22 6d 61 6e 22 2c 20 20 20  .    { "man",   
7c80: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
7c90: 74 69 6f 6e 2f 78 2d 74 72 6f 66 66 2d 6d 61 6e  tion/x-troff-man
7ca0: 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  "           },. 
7cb0: 20 20 20 7b 20 22 6d 65 22 2c 20 20 20 20 20 20     { "me",      
7cc0: 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69     2, "applicati
7cd0: 6f 6e 2f 78 2d 74 72 6f 66 66 2d 6d 65 22 20 20  on/x-troff-me"  
7ce0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7cf0: 20 7b 20 22 6d 65 73 68 22 2c 20 20 20 20 20 20   { "mesh",      
7d00: 20 34 2c 20 22 6d 6f 64 65 6c 2f 6d 65 73 68 22   4, "model/mesh"
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d20: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7d30: 20 22 6d 69 64 22 2c 20 20 20 20 20 20 20 20 33   "mid",        3
7d40: 2c 20 22 61 75 64 69 6f 2f 6d 69 64 69 22 20 20  , "audio/midi"  
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d60: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7d70: 6d 69 64 69 22 2c 20 20 20 20 20 20 20 34 2c 20  midi",       4, 
7d80: 22 61 75 64 69 6f 2f 6d 69 64 69 22 20 20 20 20  "audio/midi"    
7d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7da0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 69      },.    { "mi
7db0: 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  f",        3, "a
7dc0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6d 69 66  pplication/x-mif
7dd0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
7de0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 69 6d 65    },.    { "mime
7df0: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 77 77 77  ",       4, "www
7e00: 2f 6d 69 6d 65 22 20 20 20 20 20 20 20 20 20 20  /mime"          
7e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e20: 7d 2c 0a 20 20 20 20 7b 20 22 6d 6f 76 69 65 22  },.    { "movie"
7e30: 2c 20 20 20 20 20 20 35 2c 20 22 76 69 64 65 6f  ,      5, "video
7e40: 2f 78 2d 73 67 69 2d 6d 6f 76 69 65 22 20 20 20  /x-sgi-movie"   
7e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7e60: 0a 20 20 20 20 7b 20 22 6d 6f 76 22 2c 20 20 20  .    { "mov",   
7e70: 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 71       3, "video/q
7e80: 75 69 63 6b 74 69 6d 65 22 20 20 20 20 20 20 20  uicktime"       
7e90: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7ea0: 20 20 20 7b 20 22 6d 70 32 22 2c 20 20 20 20 20     { "mp2",     
7eb0: 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 6d 70 65     3, "audio/mpe
7ec0: 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g"              
7ed0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7ee0: 20 7b 20 22 6d 70 32 22 2c 20 20 20 20 20 20 20   { "mp2",       
7ef0: 20 33 2c 20 22 76 69 64 65 6f 2f 6d 70 65 67 22   3, "video/mpeg"
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f10: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7f20: 20 22 6d 70 33 22 2c 20 20 20 20 20 20 20 20 33   "mp3",        3
7f30: 2c 20 22 61 75 64 69 6f 2f 6d 70 65 67 22 20 20  , "audio/mpeg"  
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f50: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7f60: 6d 70 65 67 22 2c 20 20 20 20 20 20 20 34 2c 20  mpeg",       4, 
7f70: 22 76 69 64 65 6f 2f 6d 70 65 67 22 20 20 20 20  "video/mpeg"    
7f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f90: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70      },.    { "mp
7fa0: 65 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76  e",        3, "v
7fb0: 69 64 65 6f 2f 6d 70 65 67 22 20 20 20 20 20 20  ideo/mpeg"      
7fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fd0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 67 61    },.    { "mpga
7fe0: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 75 64  ",       4, "aud
7ff0: 69 6f 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20  io/mpeg"        
8000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8010: 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 67 22 2c 20  },.    { "mpg", 
8020: 20 20 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f         3, "video
8030: 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20 20 20  /mpeg"          
8040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8050: 0a 20 20 20 20 7b 20 22 6d 73 22 2c 20 20 20 20  .    { "ms",    
8060: 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61       2, "applica
8070: 74 69 6f 6e 2f 78 2d 74 72 6f 66 66 2d 6d 73 22  tion/x-troff-ms"
8080: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8090: 20 20 20 7b 20 22 6d 73 68 22 2c 20 20 20 20 20     { "msh",     
80a0: 20 20 20 33 2c 20 22 6d 6f 64 65 6c 2f 6d 65 73     3, "model/mes
80b0: 68 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h"              
80c0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
80d0: 20 7b 20 22 6e 63 22 2c 20 20 20 20 20 20 20 20   { "nc",        
80e0: 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   2, "application
80f0: 2f 78 2d 6e 65 74 63 64 66 22 20 20 20 20 20 20  /x-netcdf"      
8100: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8110: 20 22 6f 64 61 22 2c 20 20 20 20 20 20 20 20 33   "oda",        3
8120: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f  , "application/o
8130: 64 61 22 20 20 20 20 20 20 20 20 20 20 20 20 20  da"             
8140: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8150: 6f 67 67 22 2c 20 20 20 20 20 20 20 20 33 2c 20  ogg",        3, 
8160: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 67 67  "application/ogg
8170: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8180: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 67      },.    { "og
8190: 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  m",        3, "a
81a0: 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 67 67 22 20  pplication/ogg" 
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81c0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 62 6d 22    },.    { "pbm"
81d0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61  ,        3, "ima
81e0: 67 65 2f 78 2d 70 6f 72 74 61 62 6c 65 2d 62 69  ge/x-portable-bi
81f0: 74 6d 61 70 22 20 20 20 20 20 20 20 20 20 20 20  tmap"           
8200: 7d 2c 0a 20 20 20 20 7b 20 22 70 64 62 22 2c 20  },.    { "pdb", 
8210: 20 20 20 20 20 20 20 33 2c 20 22 63 68 65 6d 69         3, "chemi
8220: 63 61 6c 2f 78 2d 70 64 62 22 20 20 20 20 20 20  cal/x-pdb"      
8230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8240: 0a 20 20 20 20 7b 20 22 70 64 66 22 2c 20 20 20  .    { "pdf",   
8250: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
8260: 74 69 6f 6e 2f 70 64 66 22 20 20 20 20 20 20 20  tion/pdf"       
8270: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8280: 20 20 20 7b 20 22 70 67 6d 22 2c 20 20 20 20 20     { "pgm",     
8290: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 70     3, "image/x-p
82a0: 6f 72 74 61 62 6c 65 2d 67 72 61 79 6d 61 70 22  ortable-graymap"
82b0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
82c0: 20 7b 20 22 70 67 6e 22 2c 20 20 20 20 20 20 20   { "pgn",       
82d0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
82e0: 2f 78 2d 63 68 65 73 73 2d 70 67 6e 22 20 20 20  /x-chess-pgn"   
82f0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8300: 20 22 70 67 70 22 2c 20 20 20 20 20 20 20 20 33   "pgp",        3
8310: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70  , "application/p
8320: 67 70 22 20 20 20 20 20 20 20 20 20 20 20 20 20  gp"             
8330: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8340: 70 6c 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  pl",         2, 
8350: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 70  "application/x-p
8360: 65 72 6c 22 20 20 20 20 20 20 20 20 20 20 20 20  erl"            
8370: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 6d      },.    { "pm
8380: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61  ",         2, "a
8390: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 70 65 72  pplication/x-per
83a0: 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l"              
83b0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 6e 67 22    },.    { "png"
83c0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61  ,        3, "ima
83d0: 67 65 2f 70 6e 67 22 20 20 20 20 20 20 20 20 20  ge/png"         
83e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83f0: 7d 2c 0a 20 20 20 20 7b 20 22 70 6e 6d 22 2c 20  },.    { "pnm", 
8400: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
8410: 2f 78 2d 70 6f 72 74 61 62 6c 65 2d 61 6e 79 6d  /x-portable-anym
8420: 61 70 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c  ap"           },
8430: 0a 20 20 20 20 7b 20 22 70 6f 74 22 2c 20 20 20  .    { "pot",   
8440: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
8450: 74 69 6f 6e 2f 6d 73 70 6f 77 65 72 70 6f 69 6e  tion/mspowerpoin
8460: 74 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  t"          },. 
8470: 20 20 20 7b 20 22 70 70 6d 22 2c 20 20 20 20 20     { "ppm",     
8480: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 70     3, "image/x-p
8490: 6f 72 74 61 62 6c 65 2d 70 69 78 6d 61 70 22 20  ortable-pixmap" 
84a0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
84b0: 20 7b 20 22 70 70 73 22 2c 20 20 20 20 20 20 20   { "pps",       
84c0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
84d0: 2f 6d 73 70 6f 77 65 72 70 6f 69 6e 74 22 20 20  /mspowerpoint"  
84e0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
84f0: 20 22 70 70 74 22 2c 20 20 20 20 20 20 20 20 33   "ppt",        3
8500: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d  , "application/m
8510: 73 70 6f 77 65 72 70 6f 69 6e 74 22 20 20 20 20  spowerpoint"    
8520: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8530: 70 70 7a 22 2c 20 20 20 20 20 20 20 20 33 2c 20  ppz",        3, 
8540: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 70  "application/msp
8550: 6f 77 65 72 70 6f 69 6e 74 22 20 20 20 20 20 20  owerpoint"      
8560: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 72      },.    { "pr
8570: 65 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  e",        3, "a
8580: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 66 72 65  pplication/x-fre
8590: 65 6c 61 6e 63 65 22 20 20 20 20 20 20 20 20 20  elance"         
85a0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 72 74 22    },.    { "prt"
85b0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
85c0: 6c 69 63 61 74 69 6f 6e 2f 70 72 6f 5f 65 6e 67  lication/pro_eng
85d0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
85e0: 7d 2c 0a 20 20 20 20 7b 20 22 70 73 22 2c 20 20  },.    { "ps",  
85f0: 20 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69         2, "appli
8600: 63 61 74 69 6f 6e 2f 70 6f 73 74 73 63 72 69 70  cation/postscrip
8610: 74 22 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  t"            },
8620: 0a 20 20 20 20 7b 20 22 71 74 22 2c 20 20 20 20  .    { "qt",    
8630: 20 20 20 20 20 32 2c 20 22 76 69 64 65 6f 2f 71       2, "video/q
8640: 75 69 63 6b 74 69 6d 65 22 20 20 20 20 20 20 20  uicktime"       
8650: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8660: 20 20 20 7b 20 22 72 61 22 2c 20 20 20 20 20 20     { "ra",      
8670: 20 20 20 32 2c 20 22 61 75 64 69 6f 2f 78 2d 72     2, "audio/x-r
8680: 65 61 6c 61 75 64 69 6f 22 20 20 20 20 20 20 20  ealaudio"       
8690: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
86a0: 20 7b 20 22 72 61 6d 22 2c 20 20 20 20 20 20 20   { "ram",       
86b0: 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 70 6e 2d   3, "audio/x-pn-
86c0: 72 65 61 6c 61 75 64 69 6f 22 20 20 20 20 20 20  realaudio"      
86d0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
86e0: 20 22 72 61 72 22 2c 20 20 20 20 20 20 20 20 33   "rar",        3
86f0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
8700: 2d 72 61 72 2d 63 6f 6d 70 72 65 73 73 65 64 22  -rar-compressed"
8710: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8720: 72 61 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20  ras",        3, 
8730: 22 69 6d 61 67 65 2f 63 6d 75 2d 72 61 73 74 65  "image/cmu-raste
8740: 72 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r"              
8750: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61      },.    { "ra
8760: 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69  s",        3, "i
8770: 6d 61 67 65 2f 78 2d 63 6d 75 2d 72 61 73 74 65  mage/x-cmu-raste
8780: 72 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r"              
8790: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 67 62 22    },.    { "rgb"
87a0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61  ,        3, "ima
87b0: 67 65 2f 78 2d 72 67 62 22 20 20 20 20 20 20 20  ge/x-rgb"       
87c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87d0: 7d 2c 0a 20 20 20 20 7b 20 22 72 6d 22 2c 20 20  },.    { "rm",  
87e0: 20 20 20 20 20 20 20 32 2c 20 22 61 75 64 69 6f         2, "audio
87f0: 2f 78 2d 70 6e 2d 72 65 61 6c 61 75 64 69 6f 22  /x-pn-realaudio"
8800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8810: 0a 20 20 20 20 7b 20 22 72 6f 66 66 22 2c 20 20  .    { "roff",  
8820: 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61       4, "applica
8830: 74 69 6f 6e 2f 78 2d 74 72 6f 66 66 22 20 20 20  tion/x-troff"   
8840: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8850: 20 20 20 7b 20 22 72 70 6d 22 2c 20 20 20 20 20     { "rpm",     
8860: 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 70     3, "audio/x-p
8870: 6e 2d 72 65 61 6c 61 75 64 69 6f 2d 70 6c 75 67  n-realaudio-plug
8880: 69 6e 22 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  in"       },.   
8890: 20 7b 20 22 72 74 66 22 2c 20 20 20 20 20 20 20   { "rtf",       
88a0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
88b0: 2f 72 74 66 22 20 20 20 20 20 20 20 20 20 20 20  /rtf"           
88c0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
88d0: 20 22 72 74 66 22 2c 20 20 20 20 20 20 20 20 33   "rtf",        3
88e0: 2c 20 22 74 65 78 74 2f 72 74 66 22 20 20 20 20  , "text/rtf"    
88f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8900: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8910: 72 74 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20  rtx",        3, 
8920: 22 74 65 78 74 2f 72 69 63 68 74 65 78 74 22 20  "text/richtext" 
8930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8940: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 63      },.    { "sc
8950: 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  m",        3, "a
8960: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6c 6f 74  pplication/x-lot
8970: 75 73 73 63 72 65 65 6e 63 61 6d 22 20 20 20 20  usscreencam"    
8980: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 65 74 22    },.    { "set"
8990: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
89a0: 6c 69 63 61 74 69 6f 6e 2f 73 65 74 22 20 20 20  lication/set"   
89b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89c0: 7d 2c 0a 20 20 20 20 7b 20 22 73 67 6d 6c 22 2c  },.    { "sgml",
89d0: 20 20 20 20 20 20 20 34 2c 20 22 74 65 78 74 2f         4, "text/
89e0: 73 67 6d 6c 22 20 20 20 20 20 20 20 20 20 20 20  sgml"           
89f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8a00: 0a 20 20 20 20 7b 20 22 73 67 6d 22 2c 20 20 20  .    { "sgm",   
8a10: 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 73 67       3, "text/sg
8a20: 6d 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ml"             
8a30: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8a40: 20 20 20 7b 20 22 73 68 22 2c 20 20 20 20 20 20     { "sh",      
8a50: 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69     2, "applicati
8a60: 6f 6e 2f 78 2d 73 68 22 20 20 20 20 20 20 20 20  on/x-sh"        
8a70: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8a80: 20 7b 20 22 73 68 61 72 22 2c 20 20 20 20 20 20   { "shar",      
8a90: 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   4, "application
8aa0: 2f 78 2d 73 68 61 72 22 20 20 20 20 20 20 20 20  /x-shar"        
8ab0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8ac0: 20 22 73 69 6c 6f 22 2c 20 20 20 20 20 20 20 34   "silo",       4
8ad0: 2c 20 22 6d 6f 64 65 6c 2f 6d 65 73 68 22 20 20  , "model/mesh"  
8ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8af0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8b00: 73 69 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20  sit",        3, 
8b10: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73  "application/x-s
8b20: 74 75 66 66 69 74 22 20 20 20 20 20 20 20 20 20  tuffit"         
8b30: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6b      },.    { "sk
8b40: 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  d",        3, "a
8b50: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6b 6f 61  pplication/x-koa
8b60: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
8b70: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6b 6d 22    },.    { "skm"
8b80: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
8b90: 6c 69 63 61 74 69 6f 6e 2f 78 2d 6b 6f 61 6e 22  lication/x-koan"
8ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bb0: 7d 2c 0a 20 20 20 20 7b 20 22 73 6b 70 22 2c 20  },.    { "skp", 
8bc0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
8bd0: 63 61 74 69 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20  cation/x-koan"  
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8bf0: 0a 20 20 20 20 7b 20 22 73 6b 74 22 2c 20 20 20  .    { "skt",   
8c00: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
8c10: 74 69 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20 20  tion/x-koan"    
8c20: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8c30: 20 20 20 7b 20 22 73 6d 69 22 2c 20 20 20 20 20     { "smi",     
8c40: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
8c50: 6f 6e 2f 73 6d 69 6c 22 20 20 20 20 20 20 20 20  on/smil"        
8c60: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8c70: 20 7b 20 22 73 6d 69 6c 22 2c 20 20 20 20 20 20   { "smil",      
8c80: 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   4, "application
8c90: 2f 73 6d 69 6c 22 20 20 20 20 20 20 20 20 20 20  /smil"          
8ca0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8cb0: 20 22 73 6e 64 22 2c 20 20 20 20 20 20 20 20 33   "snd",        3
8cc0: 2c 20 22 61 75 64 69 6f 2f 62 61 73 69 63 22 20  , "audio/basic" 
8cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ce0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8cf0: 73 6f 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20  sol",        3, 
8d00: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 73 6f 6c  "application/sol
8d10: 69 64 73 22 20 20 20 20 20 20 20 20 20 20 20 20  ids"            
8d20: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 70      },.    { "sp
8d30: 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  l",        3, "a
8d40: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 66 75 74  pplication/x-fut
8d50: 75 72 65 73 70 6c 61 73 68 22 20 20 20 20 20 20  uresplash"      
8d60: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 72 63 22    },.    { "src"
8d70: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
8d80: 6c 69 63 61 74 69 6f 6e 2f 78 2d 77 61 69 73 2d  lication/x-wais-
8d90: 73 6f 75 72 63 65 22 20 20 20 20 20 20 20 20 20  source"         
8da0: 7d 2c 0a 20 20 20 20 7b 20 22 73 74 65 70 22 2c  },.    { "step",
8db0: 20 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69         4, "appli
8dc0: 63 61 74 69 6f 6e 2f 53 54 45 50 22 20 20 20 20  cation/STEP"    
8dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8de0: 0a 20 20 20 20 7b 20 22 73 74 6c 22 2c 20 20 20  .    { "stl",   
8df0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
8e00: 74 69 6f 6e 2f 53 4c 41 22 20 20 20 20 20 20 20  tion/SLA"       
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8e20: 20 20 20 7b 20 22 73 74 70 22 2c 20 20 20 20 20     { "stp",     
8e30: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
8e40: 6f 6e 2f 53 54 45 50 22 20 20 20 20 20 20 20 20  on/STEP"        
8e50: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8e60: 20 7b 20 22 73 76 34 63 70 69 6f 22 2c 20 20 20   { "sv4cpio",   
8e70: 20 37 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   7, "application
8e80: 2f 78 2d 73 76 34 63 70 69 6f 22 20 20 20 20 20  /x-sv4cpio"     
8e90: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8ea0: 20 22 73 76 34 63 72 63 22 2c 20 20 20 20 20 36   "sv4crc",     6
8eb0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
8ec0: 2d 73 76 34 63 72 63 22 20 20 20 20 20 20 20 20  -sv4crc"        
8ed0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8ee0: 73 76 67 22 2c 20 20 20 20 20 20 20 20 33 2c 20  svg",        3, 
8ef0: 22 69 6d 61 67 65 2f 73 76 67 2b 78 6d 6c 22 20  "image/svg+xml" 
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f10: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 77      },.    { "sw
8f20: 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  f",        3, "a
8f30: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 68 6f  pplication/x-sho
8f40: 63 6b 77 61 76 65 2d 66 6c 61 73 68 22 20 20 20  ckwave-flash"   
8f50: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 22 2c 20    },.    { "t", 
8f60: 20 20 20 20 20 20 20 20 20 31 2c 20 22 61 70 70           1, "app
8f70: 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72 6f 66 66  lication/x-troff
8f80: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8f90: 7d 2c 0a 20 20 20 20 7b 20 22 74 61 72 22 2c 20  },.    { "tar", 
8fa0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
8fb0: 63 61 74 69 6f 6e 2f 78 2d 74 61 72 22 20 20 20  cation/x-tar"   
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8fd0: 0a 20 20 20 20 7b 20 22 74 63 6c 22 2c 20 20 20  .    { "tcl",   
8fe0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
8ff0: 74 69 6f 6e 2f 78 2d 74 63 6c 22 20 20 20 20 20  tion/x-tcl"     
9000: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
9010: 20 20 20 7b 20 22 74 65 78 22 2c 20 20 20 20 20     { "tex",     
9020: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
9030: 6f 6e 2f 78 2d 74 65 78 22 20 20 20 20 20 20 20  on/x-tex"       
9040: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9050: 20 7b 20 22 74 65 78 69 22 2c 20 20 20 20 20 20   { "texi",      
9060: 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   4, "application
9070: 2f 78 2d 74 65 78 69 6e 66 6f 22 20 20 20 20 20  /x-texinfo"     
9080: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
9090: 20 22 74 65 78 69 6e 66 6f 22 2c 20 20 20 20 37   "texinfo",    7
90a0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
90b0: 2d 74 65 78 69 6e 66 6f 22 20 20 20 20 20 20 20  -texinfo"       
90c0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
90d0: 74 67 7a 22 2c 20 20 20 20 20 20 20 20 33 2c 20  tgz",        3, 
90e0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74  "application/x-t
90f0: 61 72 2d 67 7a 22 20 20 20 20 20 20 20 20 20 20  ar-gz"          
9100: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 69      },.    { "ti
9110: 66 66 22 2c 20 20 20 20 20 20 20 34 2c 20 22 69  ff",       4, "i
9120: 6d 61 67 65 2f 74 69 66 66 22 20 20 20 20 20 20  mage/tiff"      
9130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9140: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 69 66 22    },.    { "tif"
9150: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61  ,        3, "ima
9160: 67 65 2f 74 69 66 66 22 20 20 20 20 20 20 20 20  ge/tiff"        
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9180: 7d 2c 0a 20 20 20 20 7b 20 22 74 72 22 2c 20 20  },.    { "tr",  
9190: 20 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69         2, "appli
91a0: 63 61 74 69 6f 6e 2f 78 2d 74 72 6f 66 66 22 20  cation/x-troff" 
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
91c0: 0a 20 20 20 20 7b 20 22 74 73 69 22 2c 20 20 20  .    { "tsi",   
91d0: 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 54       3, "audio/T
91e0: 53 50 2d 61 75 64 69 6f 22 20 20 20 20 20 20 20  SP-audio"       
91f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
9200: 20 20 20 7b 20 22 74 73 70 22 2c 20 20 20 20 20     { "tsp",     
9210: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
9220: 6f 6e 2f 64 73 70 74 79 70 65 22 20 20 20 20 20  on/dsptype"     
9230: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9240: 20 7b 20 22 74 73 76 22 2c 20 20 20 20 20 20 20   { "tsv",       
9250: 20 33 2c 20 22 74 65 78 74 2f 74 61 62 2d 73 65   3, "text/tab-se
9260: 70 61 72 61 74 65 64 2d 76 61 6c 75 65 73 22 20  parated-values" 
9270: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
9280: 20 22 74 78 74 22 2c 20 20 20 20 20 20 20 20 33   "txt",        3
9290: 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20  , "text/plain"  
92a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92b0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
92c0: 75 6e 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20  unv",        3, 
92d0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 69 2d 64  "application/i-d
92e0: 65 61 73 22 20 20 20 20 20 20 20 20 20 20 20 20  eas"            
92f0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 75 73      },.    { "us
9300: 74 61 72 22 2c 20 20 20 20 20 20 35 2c 20 22 61  tar",      5, "a
9310: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 75 73 74  pplication/x-ust
9320: 61 72 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ar"             
9330: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 76 63 64 22    },.    { "vcd"
9340: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
9350: 6c 69 63 61 74 69 6f 6e 2f 78 2d 63 64 6c 69 6e  lication/x-cdlin
9360: 6b 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k"              
9370: 7d 2c 0a 20 20 20 20 7b 20 22 76 64 61 22 2c 20  },.    { "vda", 
9380: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
9390: 63 61 74 69 6f 6e 2f 76 64 61 22 20 20 20 20 20  cation/vda"     
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
93b0: 0a 20 20 20 20 7b 20 22 76 69 76 22 2c 20 20 20  .    { "viv",   
93c0: 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 76       3, "video/v
93d0: 6e 64 2e 76 69 76 6f 22 20 20 20 20 20 20 20 20  nd.vivo"        
93e0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
93f0: 20 20 20 7b 20 22 76 69 76 6f 22 2c 20 20 20 20     { "vivo",    
9400: 20 20 20 34 2c 20 22 76 69 64 65 6f 2f 76 6e 64     4, "video/vnd
9410: 2e 76 69 76 6f 22 20 20 20 20 20 20 20 20 20 20  .vivo"          
9420: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9430: 20 7b 20 22 76 72 6d 6c 22 2c 20 20 20 20 20 20   { "vrml",      
9440: 20 34 2c 20 22 6d 6f 64 65 6c 2f 76 72 6d 6c 22   4, "model/vrml"
9450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9460: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
9470: 20 22 76 73 69 78 22 2c 20 20 20 20 20 20 20 34   "vsix",       4
9480: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76  , "application/v
9490: 73 69 78 22 20 20 20 20 20 20 20 20 20 20 20 20  six"            
94a0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
94b0: 77 61 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20  wav",        3, 
94c0: 22 61 75 64 69 6f 2f 78 2d 77 61 76 22 20 20 20  "audio/x-wav"   
94d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94e0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 61      },.    { "wa
94f0: 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  x",        3, "a
9500: 75 64 69 6f 2f 78 2d 6d 73 2d 77 61 78 22 20 20  udio/x-ms-wax"  
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9520: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 69 6b 69    },.    { "wiki
9530: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70 70  ",       4, "app
9540: 6c 69 63 61 74 69 6f 6e 2f 78 2d 66 6f 73 73 69  lication/x-fossi
9550: 6c 2d 77 69 6b 69 22 20 20 20 20 20 20 20 20 20  l-wiki"         
9560: 7d 2c 0a 20 20 20 20 7b 20 22 77 6d 61 22 2c 20  },.    { "wma", 
9570: 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f         3, "audio
9580: 2f 78 2d 6d 73 2d 77 6d 61 22 20 20 20 20 20 20  /x-ms-wma"      
9590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
95a0: 0a 20 20 20 20 7b 20 22 77 6d 76 22 2c 20 20 20  .    { "wmv",   
95b0: 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 78       3, "video/x
95c0: 2d 6d 73 2d 77 6d 76 22 20 20 20 20 20 20 20 20  -ms-wmv"        
95d0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
95e0: 20 20 20 7b 20 22 77 6d 78 22 2c 20 20 20 20 20     { "wmx",     
95f0: 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d     3, "video/x-m
9600: 73 2d 77 6d 78 22 20 20 20 20 20 20 20 20 20 20  s-wmx"          
9610: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9620: 20 7b 20 22 77 72 6c 22 2c 20 20 20 20 20 20 20   { "wrl",       
9630: 20 33 2c 20 22 6d 6f 64 65 6c 2f 76 72 6d 6c 22   3, "model/vrml"
9640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9650: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
9660: 20 22 77 76 78 22 2c 20 20 20 20 20 20 20 20 33   "wvx",        3
9670: 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 77 76  , "video/x-ms-wv
9680: 78 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x"              
9690: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
96a0: 78 62 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20  xbm",        3, 
96b0: 22 69 6d 61 67 65 2f 78 2d 78 62 69 74 6d 61 70  "image/x-xbitmap
96c0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
96d0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 6c      },.    { "xl
96e0: 63 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  c",        3, "a
96f0: 70 70 6c 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d  pplication/vnd.m
9700: 73 2d 65 78 63 65 6c 22 20 20 20 20 20 20 20 20  s-excel"        
9710: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 6c 6c 22    },.    { "xll"
9720: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
9730: 6c 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d  lication/vnd.ms-
9740: 65 78 63 65 6c 22 20 20 20 20 20 20 20 20 20 20  excel"          
9750: 7d 2c 0a 20 20 20 20 7b 20 22 78 6c 6d 22 2c 20  },.    { "xlm", 
9760: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
9770: 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78  cation/vnd.ms-ex
9780: 63 65 6c 22 20 20 20 20 20 20 20 20 20 20 7d 2c  cel"          },
9790: 0a 20 20 20 20 7b 20 22 78 6c 73 22 2c 20 20 20  .    { "xls",   
97a0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
97b0: 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65  tion/vnd.ms-exce
97c0: 6c 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  l"          },. 
97d0: 20 20 20 7b 20 22 78 6c 77 22 2c 20 20 20 20 20     { "xlw",     
97e0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
97f0: 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22  on/vnd.ms-excel"
9800: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9810: 20 7b 20 22 78 6d 6c 22 2c 20 20 20 20 20 20 20   { "xml",       
9820: 20 33 2c 20 22 74 65 78 74 2f 78 6d 6c 22 20 20   3, "text/xml"  
9830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9840: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
9850: 20 22 78 70 6d 22 2c 20 20 20 20 20 20 20 20 33   "xpm",        3
9860: 2c 20 22 69 6d 61 67 65 2f 78 2d 78 70 69 78 6d  , "image/x-xpixm
9870: 61 70 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ap"             
9880: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
9890: 78 77 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20  xwd",        3, 
98a0: 22 69 6d 61 67 65 2f 78 2d 78 77 69 6e 64 6f 77  "image/x-xwindow
98b0: 64 75 6d 70 22 20 20 20 20 20 20 20 20 20 20 20  dump"           
98c0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 79      },.    { "xy
98d0: 7a 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 63  z",        3, "c
98e0: 68 65 6d 69 63 61 6c 2f 78 2d 70 64 62 22 20 20  hemical/x-pdb"  
98f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9900: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 7a 69 70 22    },.    { "zip"
9910: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
9920: 6c 69 63 61 74 69 6f 6e 2f 7a 69 70 22 20 20 20  lication/zip"   
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9940: 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 66 6f 72 28 69  },.  };..  for(i
9950: 3d 6e 4e 61 6d 65 2d 31 3b 20 69 3e 30 20 26 26  =nName-1; i>0 &&
9960: 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 2e 27 3b 20   zName[i]!='.'; 
9970: 69 2d 2d 29 7b 7d 0a 20 20 7a 20 3d 20 26 7a 4e  i--){}.  z = &zN
9980: 61 6d 65 5b 69 2b 31 5d 3b 0a 20 20 6c 65 6e 20  ame[i+1];.  len 
9990: 3d 20 6e 4e 61 6d 65 20 2d 20 69 3b 0a 20 20 69  = nName - i;.  i
99a0: 66 28 20 6c 65 6e 3c 28 69 6e 74 29 73 69 7a 65  f( len<(int)size
99b0: 6f 66 28 7a 53 75 66 66 69 78 29 2d 31 20 29 7b  of(zSuffix)-1 ){
99c0: 0a 20 20 20 20 73 74 72 63 70 79 28 7a 53 75 66  .    strcpy(zSuf
99d0: 66 69 78 2c 20 7a 29 3b 0a 20 20 20 20 66 6f 72  fix, z);.    for
99e0: 28 69 3d 30 3b 20 7a 53 75 66 66 69 78 5b 69 5d  (i=0; zSuffix[i]
99f0: 3b 20 69 2b 2b 29 20 7a 53 75 66 66 69 78 5b 69  ; i++) zSuffix[i
9a00: 5d 20 3d 20 74 6f 6c 6f 77 65 72 28 7a 53 75 66  ] = tolower(zSuf
9a10: 66 69 78 5b 69 5d 29 3b 0a 20 20 20 20 66 69 72  fix[i]);.    fir
9a20: 73 74 20 3d 20 30 3b 0a 20 20 20 20 6c 61 73 74  st = 0;.    last
9a30: 20 3d 20 73 69 7a 65 6f 66 28 61 4d 69 6d 65 29   = sizeof(aMime)
9a40: 2f 73 69 7a 65 6f 66 28 61 4d 69 6d 65 5b 30 5d  /sizeof(aMime[0]
9a50: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 66 69  );.    while( fi
9a60: 72 73 74 3c 3d 6c 61 73 74 20 29 7b 0a 20 20 20  rst<=last ){.   
9a70: 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
9a80: 69 20 3d 20 28 66 69 72 73 74 2b 6c 61 73 74 29  i = (first+last)
9a90: 2f 32 3b 0a 20 20 20 20 20 20 63 20 3d 20 73 74  /2;.      c = st
9aa0: 72 63 6d 70 28 7a 53 75 66 66 69 78 2c 20 61 4d  rcmp(zSuffix, aM
9ab0: 69 6d 65 5b 69 5d 2e 7a 53 75 66 66 69 78 29 3b  ime[i].zSuffix);
9ac0: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
9ad0: 29 20 72 65 74 75 72 6e 20 61 4d 69 6d 65 5b 69  ) return aMime[i
9ae0: 5d 2e 7a 4d 69 6d 65 74 79 70 65 3b 0a 20 20 20  ].zMimetype;.   
9af0: 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20     if( c<0 ){.  
9b00: 20 20 20 20 20 20 6c 61 73 74 20 3d 20 69 2d 31        last = i-1
9b10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9b20: 20 20 20 20 20 20 20 66 69 72 73 74 20 3d 20 69         first = i
9b30: 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  +1;.      }.    
9b40: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22  }.  }.  return "
9b50: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65  application/octe
9b60: 74 2d 73 74 72 65 61 6d 22 3b 0a 7d 0a 0a 2f 2a  t-stream";.}../*
9b70: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
9b80: 67 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73  g table contains
9b90: 20 31 20 66 6f 72 20 61 6c 6c 20 63 68 61 72 61   1 for all chara
9ba0: 63 74 65 72 73 20 74 68 61 74 20 61 72 65 20 70  cters that are p
9bb0: 65 72 6d 69 74 74 65 64 20 69 6e 0a 2a 2a 20 74  ermitted in.** t
9bc0: 68 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 55  he part of the U
9bd0: 52 4c 20 62 65 66 6f 72 65 20 74 68 65 20 71 75  RL before the qu
9be0: 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 61  ery parameters a
9bf0: 6e 64 20 66 72 61 67 6d 65 6e 74 2e 0a 2a 2a 0a  nd fragment..**.
9c00: 2a 2a 20 41 6c 6c 6f 77 65 64 20 63 68 61 72 61  ** Allowed chara
9c10: 63 74 65 72 73 3a 20 20 30 2d 39 61 2d 7a 41 2d  cters:  0-9a-zA-
9c20: 5a 2c 2d 2e 2f 3a 5f 7e 0a 2a 2a 0a 2a 2a 20 44  Z,-./:_~.**.** D
9c30: 69 73 61 6c 6c 6f 77 65 64 20 63 68 61 72 61 63  isallowed charac
9c40: 74 65 72 73 20 69 6e 63 6c 75 64 65 3a 20 20 21  ters include:  !
9c50: 22 23 24 25 26 27 28 29 2a 2b 3b 3c 3d 3e 3f 5b  "#$%&'()*+;<=>?[
9c60: 5c 5d 5e 7b 7c 7d 0a 2a 2f 0a 73 74 61 74 69 63  \]^{|}.*/.static
9c70: 20 63 6f 6e 73 74 20 63 68 61 72 20 61 6c 6c 6f   const char allo
9c80: 77 65 64 49 6e 4e 61 6d 65 5b 5d 20 3d 20 7b 0a  wedInName[] = {.
9c90: 20 20 20 20 20 20 2f 2a 20 20 78 30 20 20 78 31        /*  x0  x1
9ca0: 20 20 78 32 20 20 78 33 20 20 78 34 20 20 78 35    x2  x3  x4  x5
9cb0: 20 20 78 36 20 20 78 37 20 20 78 38 20 20 78 39    x6  x7  x8  x9
9cc0: 20 20 78 61 20 20 78 62 20 20 78 63 20 20 78 64    xa  xb  xc  xd
9cd0: 20 20 78 65 20 20 78 66 20 2a 2f 0a 2f 2a 20 30    xe  xf */./* 0
9ce0: 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30  x */   0,  0,  0
9cf0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9d00: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9d10: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9d20: 2c 20 20 30 2c 0a 2f 2a 20 31 78 20 2a 2f 20 20  ,  0,./* 1x */  
9d30: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9d40: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9d50: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9d60: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a   0,  0,  0,  0,.
9d70: 2f 2a 20 32 78 20 2a 2f 20 20 20 30 2c 20 20 30  /* 2x */   0,  0
9d80: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9d90: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9da0: 2c 20 20 30 2c 20 20 30 2c 20 20 31 2c 20 20 31  ,  0,  0,  1,  1
9db0: 2c 20 20 31 2c 20 20 31 2c 0a 2f 2a 20 33 78 20  ,  1,  1,./* 3x 
9dc0: 2a 2f 20 20 20 31 2c 20 20 31 2c 20 20 31 2c 20  */   1,  1,  1, 
9dd0: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
9de0: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
9df0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9e00: 20 30 2c 0a 2f 2a 20 34 78 20 2a 2f 20 20 20 30   0,./* 4x */   0
9e10: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
9e20: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
9e30: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
9e40: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 0a 2f 2a  ,  1,  1,  1,./*
9e50: 20 35 78 20 2a 2f 20 20 20 31 2c 20 20 31 2c 20   5x */   1,  1, 
9e60: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
9e70: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
9e80: 20 31 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   1,  0,  0,  0, 
9e90: 20 30 2c 20 20 31 2c 0a 2f 2a 20 36 78 20 2a 2f   0,  1,./* 6x */
9ea0: 20 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 31     0,  1,  1,  1
9eb0: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
9ec0: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
9ed0: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
9ee0: 2c 0a 2f 2a 20 37 78 20 2a 2f 20 20 20 31 2c 20  ,./* 7x */   1, 
9ef0: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
9f00: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
9f10: 20 31 2c 20 20 31 2c 20 20 30 2c 20 20 30 2c 20   1,  1,  0,  0, 
9f20: 20 30 2c 20 20 31 2c 20 20 30 2c 0a 2f 2a 20 38   0,  1,  0,./* 8
9f30: 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30  x */   0,  0,  0
9f40: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9f50: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9f60: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9f70: 2c 20 20 30 2c 0a 2f 2a 20 39 78 20 2a 2f 20 20  ,  0,./* 9x */  
9f80: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9f90: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9fa0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
9fb0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a   0,  0,  0,  0,.
9fc0: 2f 2a 20 41 78 20 2a 2f 20 20 20 30 2c 20 20 30  /* Ax */   0,  0
9fd0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9fe0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
9ff0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a000: 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 42 78 20  ,  0,  0,./* Bx 
a010: 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20  */   0,  0,  0, 
a020: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a030: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a040: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a050: 20 30 2c 0a 2f 2a 20 43 78 20 2a 2f 20 20 20 30   0,./* Cx */   0
a060: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a070: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a080: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a090: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a  ,  0,  0,  0,./*
a0a0: 20 44 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20   Dx */   0,  0, 
a0b0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a0c0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a0d0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a0e0: 20 30 2c 20 20 30 2c 0a 2f 2a 20 45 78 20 2a 2f   0,  0,./* Ex */
a0f0: 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30     0,  0,  0,  0
a100: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a110: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a120: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a130: 2c 0a 2f 2a 20 46 78 20 2a 2f 20 20 20 30 2c 20  ,./* Fx */   0, 
a140: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a150: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a160: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a170: 20 30 2c 20 20 30 2c 20 20 30 2c 0a 7d 3b 0a 0a   0,  0,  0,.};..
a180: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c  /*.** Remove all
a190: 20 64 69 73 61 6c 6c 6f 77 65 64 20 63 68 61 72   disallowed char
a1a0: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 69 6e  acters in the in
a1b0: 70 75 74 20 73 74 72 69 6e 67 20 7a 5b 5d 2e 20  put string z[]. 
a1c0: 20 43 6f 6e 76 65 72 74 20 61 6e 79 0a 2a 2a 20   Convert any.** 
a1d0: 64 69 73 61 6c 6c 6f 77 65 64 20 63 68 61 72 61  disallowed chara
a1e0: 63 74 65 72 73 20 69 6e 74 6f 20 22 5f 22 2e 0a  cters into "_"..
a1f0: 2a 2a 0a 2a 2a 20 4e 6f 74 20 74 68 61 74 20 74  **.** Not that t
a200: 68 65 20 74 68 72 65 65 20 63 68 61 72 61 63 74  he three charact
a210: 65 72 20 73 65 71 75 65 6e 63 65 20 22 25 58 58  er sequence "%XX
a220: 22 20 77 68 65 72 65 20 58 20 69 73 20 61 6e 79  " where X is any
a230: 20 62 79 74 65 20 69 73 0a 2a 2a 20 63 6f 6e 76   byte is.** conv
a240: 65 72 74 65 64 20 69 6e 74 6f 20 61 20 73 69 6e  erted into a sin
a250: 67 6c 65 20 22 5f 22 20 63 68 61 72 61 63 74 65  gle "_" characte
a260: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
a270: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
a280: 61 72 61 63 74 65 72 73 20 63 6f 6e 76 65 72 74  aracters convert
a290: 65 64 2e 20 20 41 6e 20 22 25 58 58 22 20 2d 3e  ed.  An "%XX" ->
a2a0: 20 22 5f 22 20 63 6f 6e 76 65 72 73 69 6f 6e 0a   "_" conversion.
a2b0: 2a 2a 20 63 6f 75 6e 74 73 20 61 73 20 61 20 73  ** counts as a s
a2c0: 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72 2e  ingle character.
a2d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
a2e0: 61 6e 69 74 69 7a 65 53 74 72 69 6e 67 28 63 68  anitizeString(ch
a2f0: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 43  ar *z){.  int nC
a300: 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 77 68 69  hange = 0;.  whi
a310: 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 69 66  le( *z ){.    if
a320: 28 20 21 61 6c 6c 6f 77 65 64 49 6e 4e 61 6d 65  ( !allowedInName
a330: 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  [*(unsigned char
a340: 2a 29 7a 5d 20 29 7b 0a 20 20 20 20 20 20 69 66  *)z] ){.      if
a350: 28 20 2a 7a 3d 3d 27 25 27 20 26 26 20 7a 5b 31  ( *z=='%' && z[1
a360: 5d 21 3d 30 20 26 26 20 7a 5b 32 5d 21 3d 30 20  ]!=0 && z[2]!=0 
a370: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
a380: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
a390: 33 3b 20 28 7a 5b 69 2d 32 5d 20 3d 20 7a 5b 69  3; (z[i-2] = z[i
a3a0: 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ])!=0; i++){}.  
a3b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 7a 20 3d      }.      *z =
a3c0: 20 27 5f 27 3b 0a 20 20 20 20 20 20 6e 43 68 61   '_';.      nCha
a3d0: 6e 67 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  nge++;.    }.   
a3e0: 20 7a 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75   z++;.  }.  retu
a3f0: 72 6e 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f  rn nChange;.}../
a400: 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e  *.** Count the n
a410: 75 6d 62 65 72 20 6f 66 20 22 2f 22 20 63 68 61  umber of "/" cha
a420: 72 61 63 74 65 72 73 20 69 6e 20 61 20 73 74 72  racters in a str
a430: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
a440: 6e 74 20 63 6f 75 6e 74 53 6c 61 73 68 65 73 28  nt countSlashes(
a450: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
a460: 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 77    int n = 0;.  w
a470: 68 69 6c 65 28 20 2a 7a 20 29 20 69 66 28 20 2a  hile( *z ) if( *
a480: 28 7a 2b 2b 29 3d 3d 27 2f 27 20 29 20 6e 2b 2b  (z++)=='/' ) n++
a490: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
a4a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
a4b0: 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 61 20  ine processes a 
a4c0: 73 69 6e 67 6c 65 20 48 54 54 50 20 72 65 71 75  single HTTP requ
a4d0: 65 73 74 20 6f 6e 20 73 74 61 6e 64 61 72 64 20  est on standard 
a4e0: 69 6e 70 75 74 20 61 6e 64 0a 2a 2a 20 73 65 6e  input and.** sen
a4f0: 64 73 20 74 68 65 20 72 65 70 6c 79 20 74 6f 20  ds the reply to 
a500: 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74 2e  standard output.
a510: 20 20 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e    If the argumen
a520: 74 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 0a  t is 1 it means.
a530: 2a 2a 20 74 68 61 74 20 77 65 20 61 72 65 20 73  ** that we are s
a540: 68 6f 75 6c 64 20 63 6c 6f 73 65 20 74 68 65 20  hould close the 
a550: 73 6f 63 6b 65 74 20 77 69 74 68 6f 75 74 20 70  socket without p
a560: 72 6f 63 65 73 73 69 6e 67 20 61 64 64 69 74 69  rocessing additi
a570: 6f 6e 61 6c 0a 2a 2a 20 48 54 54 50 20 72 65 71  onal.** HTTP req
a580: 75 65 73 74 73 20 61 66 74 65 72 20 74 68 65 20  uests after the 
a590: 63 75 72 72 65 6e 74 20 72 65 71 75 65 73 74 20  current request 
a5a0: 66 69 6e 69 73 68 65 73 2e 20 20 30 20 6d 65 61  finishes.  0 mea
a5b0: 6e 73 20 77 65 20 61 72 65 0a 2a 2a 20 61 6c 6c  ns we are.** all
a5c0: 6f 77 65 64 20 74 6f 20 6b 65 65 70 20 74 68 65  owed to keep the
a5d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e   connection open
a5e0: 20 61 6e 64 20 74 6f 20 70 72 6f 63 65 73 73 20   and to process 
a5f0: 61 64 64 69 74 69 6f 6e 61 6c 20 72 65 71 75 65  additional reque
a600: 73 74 73 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  sts..** This rou
a610: 74 69 6e 65 20 6d 61 79 20 63 68 6f 6f 73 65 20  tine may choose 
a620: 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 63 6f 6e  to close the con
a630: 6e 65 63 74 69 6f 6e 20 65 76 65 6e 20 69 66 20  nection even if 
a640: 74 68 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  the argument.** 
a650: 69 73 20 30 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  is 0..** .** If 
a660: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  the connection s
a670: 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 2c  hould be closed,
a680: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
a690: 6c 6c 73 20 65 78 69 74 28 29 20 61 6e 64 0a 2a  lls exit() and.*
a6a0: 2a 20 74 68 75 73 20 6e 65 76 65 72 20 72 65 74  * thus never ret
a6b0: 75 72 6e 73 2e 20 20 49 66 20 74 68 69 73 20 72  urns.  If this r
a6c0: 6f 75 74 69 6e 65 20 64 6f 65 73 20 72 65 74 75  outine does retu
a6d0: 72 6e 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  rn it means that
a6e0: 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 48 54 54 50   another.** HTTP
a6f0: 20 72 65 71 75 65 73 74 20 6d 61 79 20 61 70 70   request may app
a700: 65 61 72 20 6f 6e 20 74 68 65 20 77 69 72 65 2e  ear on the wire.
a710: 0a 2a 2f 0a 76 6f 69 64 20 50 72 6f 63 65 73 73  .*/.void Process
a720: 4f 6e 65 52 65 71 75 65 73 74 28 69 6e 74 20 66  OneRequest(int f
a730: 6f 72 63 65 43 6c 6f 73 65 29 7b 0a 20 20 69 6e  orceClose){.  in
a740: 74 20 69 2c 20 6a 2c 20 6a 30 2c 20 63 3b 0a 20  t i, j, j0, c;. 
a750: 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
a760: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
a770: 65 64 20 74 6f 20 70 61 72 73 65 20 75 70 20 61  ed to parse up a
a780: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 73 74 72   string */.  str
a790: 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66  uct stat statbuf
a7a0: 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  ;      /* Inform
a7b0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
a7c0: 66 69 6c 65 20 74 6f 20 62 65 20 72 65 74 72 69  file to be retri
a7d0: 65 76 65 64 20 2a 2f 0a 20 20 46 49 4c 45 20 2a  eved */.  FILE *
a7e0: 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  in;             
a7f0: 20 20 20 20 2f 2a 20 46 6f 72 20 72 65 61 64 69      /* For readi
a800: 6e 67 20 66 72 6f 6d 20 43 47 49 20 73 63 72 69  ng from CGI scri
a810: 70 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 7a 4c  pts */.  char zL
a820: 69 6e 65 5b 31 30 30 30 5d 3b 20 20 20 20 20 20  ine[1000];      
a830: 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 66     /* A buffer f
a840: 6f 72 20 69 6e 70 75 74 20 6c 69 6e 65 73 20 6f  or input lines o
a850: 72 20 66 6f 72 6d 69 6e 67 20 6e 61 6d 65 73 20  r forming names 
a860: 2a 2f 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20  */..  /* Change 
a870: 64 69 72 65 63 74 6f 72 69 65 73 20 74 6f 20 74  directories to t
a880: 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 48  he root of the H
a890: 54 54 50 20 66 69 6c 65 73 79 73 74 65 6d 0a 20  TTP filesystem. 
a8a0: 20 2a 2f 0a 20 20 69 66 28 20 63 68 64 69 72 28   */.  if( chdir(
a8b0: 7a 52 6f 6f 74 5b 30 5d 20 3f 20 7a 52 6f 6f 74  zRoot[0] ? zRoot
a8c0: 20 3a 20 22 2f 22 29 21 3d 30 20 29 7b 0a 20 20   : "/")!=0 ){.  
a8d0: 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30    char zBuf[1000
a8e0: 5d 3b 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69  ];.    Malfuncti
a8f0: 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 20 20 2f  on(__LINE__,   /
a900: 2a 20 4c 4f 47 3a 20 63 68 64 69 72 28 29 20 66  * LOG: chdir() f
a910: 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  ailed */.       
a920: 20 20 22 63 61 6e 6e 6f 74 20 63 68 64 69 72 20    "cannot chdir 
a930: 74 6f 20 5b 25 73 5d 20 66 72 6f 6d 20 5b 25 73  to [%s] from [%s
a940: 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 52 6f  ]",.         zRo
a950: 6f 74 2c 20 67 65 74 63 77 64 28 7a 42 75 66 2c  ot, getcwd(zBuf,
a960: 39 39 39 29 29 3b 0a 20 20 7d 0a 20 20 6e 52 65  999));.  }.  nRe
a970: 71 75 65 73 74 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20  quest++;..  /*. 
a980: 20 2a 2a 20 57 65 20 6d 75 73 74 20 72 65 63 65   ** We must rece
a990: 69 76 65 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  ive a complete h
a9a0: 65 61 64 65 72 20 77 69 74 68 69 6e 20 31 35 20  eader within 15 
a9b0: 73 65 63 6f 6e 64 73 0a 20 20 2a 2f 0a 20 20 73  seconds.  */.  s
a9c0: 69 67 6e 61 6c 28 53 49 47 41 4c 52 4d 2c 20 54  ignal(SIGALRM, T
a9d0: 69 6d 65 6f 75 74 29 3b 0a 20 20 73 69 67 6e 61  imeout);.  signa
a9e0: 6c 28 53 49 47 53 45 47 56 2c 20 54 69 6d 65 6f  l(SIGSEGV, Timeo
a9f0: 75 74 29 3b 0a 20 20 73 69 67 6e 61 6c 28 53 49  ut);.  signal(SI
aa00: 47 50 49 50 45 2c 20 54 69 6d 65 6f 75 74 29 3b  GPIPE, Timeout);
aa10: 0a 20 20 69 66 28 20 75 73 65 54 69 6d 65 6f 75  .  if( useTimeou
aa20: 74 20 29 20 61 6c 61 72 6d 28 31 35 29 3b 0a 0a  t ) alarm(15);..
aa30: 20 20 2f 2a 20 47 65 74 20 74 68 65 20 66 69 72    /* Get the fir
aa40: 73 74 20 6c 69 6e 65 20 6f 66 20 74 68 65 20 72  st line of the r
aa50: 65 71 75 65 73 74 20 61 6e 64 20 70 61 72 73 65  equest and parse
aa60: 20 6f 75 74 20 74 68 65 0a 20 20 2a 2a 20 6d 65   out the.  ** me
aa70: 74 68 6f 64 2c 20 74 68 65 20 73 63 72 69 70 74  thod, the script
aa80: 20 61 6e 64 20 74 68 65 20 70 72 6f 74 6f 63 6f   and the protoco
aa90: 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 66 67  l..  */.  if( fg
aaa0: 65 74 73 28 7a 4c 69 6e 65 2c 73 69 7a 65 6f 66  ets(zLine,sizeof
aab0: 28 7a 4c 69 6e 65 29 2c 73 74 64 69 6e 29 3d 3d  (zLine),stdin)==
aac0: 30 20 29 7b 0a 20 20 20 20 65 78 69 74 28 30 29  0 ){.    exit(0)
aad0: 3b 0a 20 20 7d 0a 20 20 6f 6d 69 74 4c 6f 67 20  ;.  }.  omitLog 
aae0: 3d 20 30 3b 0a 20 20 6e 49 6e 20 2b 3d 20 73 74  = 0;.  nIn += st
aaf0: 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20 20 7a  rlen(zLine);.  z
ab00: 4d 65 74 68 6f 64 20 3d 20 53 74 72 44 75 70 28  Method = StrDup(
ab10: 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28  GetFirstElement(
ab20: 7a 4c 69 6e 65 2c 26 7a 29 29 3b 0a 20 20 7a 52  zLine,&z));.  zR
ab30: 65 61 6c 53 63 72 69 70 74 20 3d 20 7a 53 63 72  ealScript = zScr
ab40: 69 70 74 20 3d 20 53 74 72 44 75 70 28 47 65 74  ipt = StrDup(Get
ab50: 46 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a 2c 26  FirstElement(z,&
ab60: 7a 29 29 3b 0a 20 20 7a 50 72 6f 74 6f 63 6f 6c  z));.  zProtocol
ab70: 20 3d 20 53 74 72 44 75 70 28 47 65 74 46 69 72   = StrDup(GetFir
ab80: 73 74 45 6c 65 6d 65 6e 74 28 7a 2c 26 7a 29 29  stElement(z,&z))
ab90: 3b 0a 20 20 69 66 28 20 7a 50 72 6f 74 6f 63 6f  ;.  if( zProtoco
aba0: 6c 3d 3d 30 20 7c 7c 20 73 74 72 6e 63 6d 70 28  l==0 || strncmp(
abb0: 7a 50 72 6f 74 6f 63 6f 6c 2c 22 48 54 54 50 2f  zProtocol,"HTTP/
abc0: 22 2c 35 29 21 3d 30 20 7c 7c 20 73 74 72 6c 65  ",5)!=0 || strle
abd0: 6e 28 7a 50 72 6f 74 6f 63 6f 6c 29 21 3d 38 20  n(zProtocol)!=8 
abe0: 29 7b 0a 20 20 20 20 53 74 61 72 74 52 65 73 70  ){.    StartResp
abf0: 6f 6e 73 65 28 22 34 30 30 20 42 61 64 20 52 65  onse("400 Bad Re
ac00: 71 75 65 73 74 22 29 3b 0a 20 20 20 20 6e 4f 75  quest");.    nOu
ac10: 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20  t += printf(.   
ac20: 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65     "Content-type
ac30: 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e  : text/plain\r\n
ac40: 22 0a 20 20 20 20 20 20 22 5c 72 5c 6e 22 0a 20  ".      "\r\n". 
ac50: 20 20 20 20 20 22 54 68 69 73 20 73 65 72 76 65       "This serve
ac60: 72 20 64 6f 65 73 20 6e 6f 74 20 75 6e 64 65 72  r does not under
ac70: 73 74 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  stand the reques
ac80: 74 65 64 20 70 72 6f 74 6f 63 6f 6c 5c 6e 22 0a  ted protocol\n".
ac90: 20 20 20 20 29 3b 0a 20 20 20 20 4d 61 6b 65 4c      );.    MakeL
aca0: 6f 67 45 6e 74 72 79 28 30 2c 20 5f 5f 4c 49 4e  ogEntry(0, __LIN
acb0: 45 5f 5f 29 3b 20 2f 2a 20 4c 4f 47 3a 20 62 61  E__); /* LOG: ba
acc0: 64 20 70 72 6f 74 6f 63 6f 6c 20 69 6e 20 48 54  d protocol in HT
acd0: 54 50 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20  TP header */.   
ace0: 20 65 78 69 74 28 30 29 3b 0a 20 20 7d 0a 20 20   exit(0);.  }.  
acf0: 69 66 28 20 7a 53 63 72 69 70 74 5b 30 5d 3d 3d  if( zScript[0]==
ad00: 30 20 29 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c  0 ) NotFound(__L
ad10: 49 4e 45 5f 5f 29 3b 20 2f 2a 20 4c 4f 47 3a 20  INE__); /* LOG: 
ad20: 45 6d 70 74 79 20 72 65 71 75 65 73 74 20 55 52  Empty request UR
ad30: 49 20 2a 2f 0a 20 20 69 66 28 20 66 6f 72 63 65  I */.  if( force
ad40: 43 6c 6f 73 65 20 29 7b 0a 20 20 20 20 63 6c 6f  Close ){.    clo
ad50: 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 31  seConnection = 1
ad60: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50  ;.  }else if( zP
ad70: 72 6f 74 6f 63 6f 6c 5b 35 5d 3c 27 31 27 20 7c  rotocol[5]<'1' |
ad80: 7c 20 7a 50 72 6f 74 6f 63 6f 6c 5b 37 5d 3c 27  | zProtocol[7]<'
ad90: 31 27 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 43  1' ){.    closeC
ada0: 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 31 3b 0a 20  onnection = 1;. 
adb0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 76 65   }..  /* This ve
adc0: 72 79 20 73 69 6d 70 6c 65 20 73 65 72 76 65 72  ry simple server
add0: 20 6f 6e 6c 79 20 75 6e 64 65 72 73 74 61 6e 64   only understand
ade0: 73 20 74 68 65 20 47 45 54 2c 20 50 4f 53 54 0a  s the GET, POST.
adf0: 20 20 2a 2a 20 61 6e 64 20 48 45 41 44 20 6d 65    ** and HEAD me
ae00: 74 68 6f 64 73 0a 20 20 2a 2f 0a 20 20 69 66 28  thods.  */.  if(
ae10: 20 73 74 72 63 6d 70 28 7a 4d 65 74 68 6f 64 2c   strcmp(zMethod,
ae20: 22 47 45 54 22 29 21 3d 30 20 26 26 20 73 74 72  "GET")!=0 && str
ae30: 63 6d 70 28 7a 4d 65 74 68 6f 64 2c 22 50 4f 53  cmp(zMethod,"POS
ae40: 54 22 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26  T")!=0.       &&
ae50: 20 73 74 72 63 6d 70 28 7a 4d 65 74 68 6f 64 2c   strcmp(zMethod,
ae60: 22 48 45 41 44 22 29 21 3d 30 20 29 7b 0a 20 20  "HEAD")!=0 ){.  
ae70: 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28    StartResponse(
ae80: 22 35 30 31 20 4e 6f 74 20 49 6d 70 6c 65 6d 65  "501 Not Impleme
ae90: 6e 74 65 64 22 29 3b 0a 20 20 20 20 6e 4f 75 74  nted");.    nOut
aea0: 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20   += printf(.    
aeb0: 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a    "Content-type:
aec0: 20 74 65 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22   text/plain\r\n"
aed0: 0a 20 20 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20  .      "\r\n".  
aee0: 20 20 20 20 22 54 68 65 20 25 73 20 6d 65 74 68      "The %s meth
aef0: 6f 64 20 69 73 20 6e 6f 74 20 69 6d 70 6c 65 6d  od is not implem
af00: 65 6e 74 65 64 20 6f 6e 20 74 68 69 73 20 73 65  ented on this se
af10: 72 76 65 72 2e 5c 6e 22 2c 0a 20 20 20 20 20 20  rver.\n",.      
af20: 7a 4d 65 74 68 6f 64 29 3b 0a 20 20 20 20 4d 61  zMethod);.    Ma
af30: 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 5f 5f  keLogEntry(0, __
af40: 4c 49 4e 45 5f 5f 29 3b 20 2f 2a 20 4c 4f 47 3a  LINE__); /* LOG:
af50: 20 55 6e 6b 6e 6f 77 6e 20 72 65 71 75 65 73 74   Unknown request
af60: 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 20 20 65   method */.    e
af70: 78 69 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  xit(0);.  }..  /
af80: 2a 20 47 65 74 20 61 6c 6c 20 74 68 65 20 6f 70  * Get all the op
af90: 74 69 6f 6e 61 6c 20 66 69 65 6c 64 73 20 74 68  tional fields th
afa0: 61 74 20 66 6f 6c 6c 6f 77 20 74 68 65 20 66 69  at follow the fi
afb0: 72 73 74 20 6c 69 6e 65 2e 0a 20 20 2a 2f 0a 20  rst line..  */. 
afc0: 20 7a 43 6f 6f 6b 69 65 20 3d 20 30 3b 0a 20 20   zCookie = 0;.  
afd0: 7a 41 75 74 68 54 79 70 65 20 3d 20 30 3b 0a 20  zAuthType = 0;. 
afe0: 20 7a 52 65 6d 6f 74 65 55 73 65 72 20 3d 20 30   zRemoteUser = 0
aff0: 3b 0a 20 20 7a 52 65 66 65 72 65 72 20 3d 20 30  ;.  zReferer = 0
b000: 3b 0a 20 20 7a 49 66 4e 6f 6e 65 4d 61 74 63 68  ;.  zIfNoneMatch
b010: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 66   = 0;.  while( f
b020: 67 65 74 73 28 7a 4c 69 6e 65 2c 73 69 7a 65 6f  gets(zLine,sizeo
b030: 66 28 7a 4c 69 6e 65 29 2c 73 74 64 69 6e 29 20  f(zLine),stdin) 
b040: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69  ){.    char *zFi
b050: 65 6c 64 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61  eldName;.    cha
b060: 72 20 2a 7a 56 61 6c 3b 0a 0a 20 20 20 20 6e 49  r *zVal;..    nI
b070: 6e 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 4c 69 6e  n += strlen(zLin
b080: 65 29 3b 0a 20 20 20 20 7a 46 69 65 6c 64 4e 61  e);.    zFieldNa
b090: 6d 65 20 3d 20 47 65 74 46 69 72 73 74 45 6c 65  me = GetFirstEle
b0a0: 6d 65 6e 74 28 7a 4c 69 6e 65 2c 26 7a 56 61 6c  ment(zLine,&zVal
b0b0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 65 6c  );.    if( zFiel
b0c0: 64 4e 61 6d 65 3d 3d 30 20 7c 7c 20 2a 7a 46 69  dName==0 || *zFi
b0d0: 65 6c 64 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65  eldName==0 ) bre
b0e0: 61 6b 3b 0a 20 20 20 20 52 65 6d 6f 76 65 4e 65  ak;.    RemoveNe
b0f0: 77 6c 69 6e 65 28 7a 56 61 6c 29 3b 0a 20 20 20  wline(zVal);.   
b100: 20 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28   if( strcasecmp(
b110: 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 55 73 65 72  zFieldName,"User
b120: 2d 41 67 65 6e 74 3a 22 29 3d 3d 30 20 29 7b 0a  -Agent:")==0 ){.
b130: 20 20 20 20 20 20 7a 41 67 65 6e 74 20 3d 20 53        zAgent = S
b140: 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20  trDup(zVal);.   
b150: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 61   }else if( strca
b160: 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65  secmp(zFieldName
b170: 2c 22 41 63 63 65 70 74 3a 22 29 3d 3d 30 20 29  ,"Accept:")==0 )
b180: 7b 0a 20 20 20 20 20 20 7a 41 63 63 65 70 74 20  {.      zAccept 
b190: 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a  = StrDup(zVal);.
b1a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
b1b0: 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e  rcasecmp(zFieldN
b1c0: 61 6d 65 2c 22 41 63 63 65 70 74 2d 45 6e 63 6f  ame,"Accept-Enco
b1d0: 64 69 6e 67 3a 22 29 3d 3d 30 20 29 7b 0a 20 20  ding:")==0 ){.  
b1e0: 20 20 20 20 7a 41 63 63 65 70 74 45 6e 63 6f 64      zAcceptEncod
b1f0: 69 6e 67 20 3d 20 53 74 72 44 75 70 28 7a 56 61  ing = StrDup(zVa
b200: 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  l);.    }else if
b210: 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69  ( strcasecmp(zFi
b220: 65 6c 64 4e 61 6d 65 2c 22 43 6f 6e 74 65 6e 74  eldName,"Content
b230: 2d 6c 65 6e 67 74 68 3a 22 29 3d 3d 30 20 29 7b  -length:")==0 ){
b240: 0a 20 20 20 20 20 20 7a 43 6f 6e 74 65 6e 74 4c  .      zContentL
b250: 65 6e 67 74 68 20 3d 20 53 74 72 44 75 70 28 7a  ength = StrDup(z
b260: 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Val);.    }else 
b270: 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a  if( strcasecmp(z
b280: 46 69 65 6c 64 4e 61 6d 65 2c 22 43 6f 6e 74 65  FieldName,"Conte
b290: 6e 74 2d 74 79 70 65 3a 22 29 3d 3d 30 20 29 7b  nt-type:")==0 ){
b2a0: 0a 20 20 20 20 20 20 7a 43 6f 6e 74 65 6e 74 54  .      zContentT
b2b0: 79 70 65 20 3d 20 53 74 72 44 75 70 28 7a 56 61  ype = StrDup(zVa
b2c0: 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  l);.    }else if
b2d0: 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69  ( strcasecmp(zFi
b2e0: 65 6c 64 4e 61 6d 65 2c 22 52 65 66 65 72 65 72  eldName,"Referer
b2f0: 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  :")==0 ){.      
b300: 7a 52 65 66 65 72 65 72 20 3d 20 53 74 72 44 75  zReferer = StrDu
b310: 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 69  p(zVal);.      i
b320: 66 28 20 73 74 72 73 74 72 28 7a 56 61 6c 2c 20  f( strstr(zVal, 
b330: 22 64 65 76 69 64 73 2e 6e 65 74 2f 22 29 21 3d  "devids.net/")!=
b340: 30 20 29 7b 20 7a 52 65 66 65 72 65 72 20 3d 20  0 ){ zReferer = 
b350: 22 64 65 76 69 64 73 2e 6e 65 74 2e 73 6d 75 74  "devids.net.smut
b360: 22 3b 0a 20 20 20 20 20 20 20 20 46 6f 72 62 69  ";.        Forbi
b370: 64 64 65 6e 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20  dden(__LINE__); 
b380: 2f 2a 20 4c 4f 47 3a 20 52 65 66 65 72 72 65 72  /* LOG: Referrer
b390: 20 69 73 20 64 65 76 69 64 73 2e 6e 65 74 20 2a   is devids.net *
b3a0: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  /.      }.    }e
b3b0: 6c 73 65 20 69 66 28 20 73 74 72 63 61 73 65 63  lse if( strcasec
b3c0: 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 43  mp(zFieldName,"C
b3d0: 6f 6f 6b 69 65 3a 22 29 3d 3d 30 20 29 7b 0a 20  ookie:")==0 ){. 
b3e0: 20 20 20 20 20 7a 43 6f 6f 6b 69 65 20 3d 20 53       zCookie = S
b3f0: 74 72 41 70 70 65 6e 64 28 7a 43 6f 6f 6b 69 65  trAppend(zCookie
b400: 2c 22 3b 20 22 2c 7a 56 61 6c 29 3b 0a 20 20 20  ,"; ",zVal);.   
b410: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 61   }else if( strca
b420: 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65  secmp(zFieldName
b430: 2c 22 43 6f 6e 6e 65 63 74 69 6f 6e 3a 22 29 3d  ,"Connection:")=
b440: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
b450: 73 74 72 63 61 73 65 63 6d 70 28 7a 56 61 6c 2c  strcasecmp(zVal,
b460: 22 63 6c 6f 73 65 22 29 3d 3d 30 20 29 7b 0a 20  "close")==0 ){. 
b470: 20 20 20 20 20 20 20 63 6c 6f 73 65 43 6f 6e 6e         closeConn
b480: 65 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 20 20  ection = 1;.    
b490: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 66 6f 72    }else if( !for
b4a0: 63 65 43 6c 6f 73 65 20 26 26 20 73 74 72 63 61  ceClose && strca
b4b0: 73 65 63 6d 70 28 7a 56 61 6c 2c 20 22 6b 65 65  secmp(zVal, "kee
b4c0: 70 2d 61 6c 69 76 65 22 29 3d 3d 30 20 29 7b 0a  p-alive")==0 ){.
b4d0: 20 20 20 20 20 20 20 20 63 6c 6f 73 65 43 6f 6e          closeCon
b4e0: 6e 65 63 74 69 6f 6e 20 3d 20 30 3b 0a 20 20 20  nection = 0;.   
b4f0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
b500: 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46  f( strcasecmp(zF
b510: 69 65 6c 64 4e 61 6d 65 2c 22 48 6f 73 74 3a 22  ieldName,"Host:"
b520: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
b530: 74 20 69 6e 53 71 75 61 72 65 20 3d 20 30 3b 0a  t inSquare = 0;.
b540: 20 20 20 20 20 20 63 68 61 72 20 63 3b 0a 20 20        char c;.  
b550: 20 20 20 20 69 66 28 20 73 61 6e 69 74 69 7a 65      if( sanitize
b560: 53 74 72 69 6e 67 28 7a 56 61 6c 29 20 29 7b 0a  String(zVal) ){.
b570: 20 20 20 20 20 20 20 20 46 6f 72 62 69 64 64 65          Forbidde
b580: 6e 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 20 2f 2a  n(__LINE__);  /*
b590: 20 4c 4f 47 3a 20 49 6c 6c 65 67 61 6c 20 63 6f   LOG: Illegal co
b5a0: 6e 74 65 6e 74 20 69 6e 20 48 4f 53 54 3a 20 70  ntent in HOST: p
b5b0: 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 20 20  arameter */.    
b5c0: 20 20 7d 0a 20 20 20 20 20 20 7a 48 74 74 70 48    }.      zHttpH
b5d0: 6f 73 74 20 3d 20 53 74 72 44 75 70 28 7a 56 61  ost = StrDup(zVa
b5e0: 6c 29 3b 0a 20 20 20 20 20 20 7a 53 65 72 76 65  l);.      zServe
b5f0: 72 50 6f 72 74 20 3d 20 7a 53 65 72 76 65 72 4e  rPort = zServerN
b600: 61 6d 65 20 3d 20 53 74 72 44 75 70 28 7a 48 74  ame = StrDup(zHt
b610: 74 70 48 6f 73 74 29 3b 0a 20 20 20 20 20 20 77  tpHost);.      w
b620: 68 69 6c 65 28 20 7a 53 65 72 76 65 72 50 6f 72  hile( zServerPor
b630: 74 20 26 26 20 28 63 20 3d 20 2a 7a 53 65 72 76  t && (c = *zServ
b640: 65 72 50 6f 72 74 29 21 3d 30 0a 20 20 20 20 20  erPort)!=0.     
b650: 20 20 20 20 20 20 20 20 20 26 26 20 28 63 21 3d           && (c!=
b660: 27 3a 27 20 7c 7c 20 69 6e 53 71 75 61 72 65 29  ':' || inSquare)
b670: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
b680: 63 3d 3d 27 5b 27 20 29 20 69 6e 53 71 75 61 72  c=='[' ) inSquar
b690: 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  e = 1;.        i
b6a0: 66 28 20 63 3d 3d 27 5d 27 20 29 20 69 6e 53 71  f( c==']' ) inSq
b6b0: 75 61 72 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  uare = 0;.      
b6c0: 20 20 7a 53 65 72 76 65 72 50 6f 72 74 2b 2b 3b    zServerPort++;
b6d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
b6e0: 66 28 20 7a 53 65 72 76 65 72 50 6f 72 74 20 26  f( zServerPort &
b6f0: 26 20 2a 7a 53 65 72 76 65 72 50 6f 72 74 20 29  & *zServerPort )
b700: 7b 0a 20 20 20 20 20 20 20 20 2a 7a 53 65 72 76  {.        *zServ
b710: 65 72 50 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20  erPort = 0;.    
b720: 20 20 20 20 7a 53 65 72 76 65 72 50 6f 72 74 2b      zServerPort+
b730: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
b740: 20 69 66 28 20 7a 52 65 61 6c 50 6f 72 74 20 29   if( zRealPort )
b750: 7b 0a 20 20 20 20 20 20 20 20 7a 53 65 72 76 65  {.        zServe
b760: 72 50 6f 72 74 20 3d 20 53 74 72 44 75 70 28 7a  rPort = StrDup(z
b770: 52 65 61 6c 50 6f 72 74 29 3b 0a 20 20 20 20 20  RealPort);.     
b780: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
b790: 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65   strcasecmp(zFie
b7a0: 6c 64 4e 61 6d 65 2c 22 41 75 74 68 6f 72 69 7a  ldName,"Authoriz
b7b0: 61 74 69 6f 6e 3a 22 29 3d 3d 30 20 29 7b 0a 20  ation:")==0 ){. 
b7c0: 20 20 20 20 20 7a 41 75 74 68 54 79 70 65 20 3d       zAuthType =
b7d0: 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74   GetFirstElement
b7e0: 28 53 74 72 44 75 70 28 7a 56 61 6c 29 2c 20 26  (StrDup(zVal), &
b7f0: 7a 41 75 74 68 41 72 67 29 3b 0a 20 20 20 20 7d  zAuthArg);.    }
b800: 65 6c 73 65 20 69 66 28 20 73 74 72 63 61 73 65  else if( strcase
b810: 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22  cmp(zFieldName,"
b820: 49 66 2d 4e 6f 6e 65 2d 4d 61 74 63 68 3a 22 29  If-None-Match:")
b830: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 49 66  ==0 ){.      zIf
b840: 4e 6f 6e 65 4d 61 74 63 68 20 3d 20 53 74 72 44  NoneMatch = StrD
b850: 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 0a  up(zVal);.    }.
b860: 20 20 7d 0a 0a 20 20 2f 2a 20 44 69 73 61 6c 6c    }..  /* Disall
b870: 6f 77 20 72 65 71 75 65 73 74 73 20 66 72 6f 6d  ow requests from
b880: 20 63 65 72 74 61 69 6e 20 63 6c 69 65 6e 74 73   certain clients
b890: 20 2a 2f 0a 20 20 69 66 28 20 7a 41 67 65 6e 74   */.  if( zAgent
b8a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 73   ){.    if( strs
b8b0: 74 72 28 7a 41 67 65 6e 74 2c 20 22 57 69 6e 64  tr(zAgent, "Wind
b8c0: 6f 77 73 5f 39 22 29 21 3d 30 0a 20 20 20 20 20  ows_9")!=0.     
b8d0: 7c 7c 20 73 74 72 73 74 72 28 7a 41 67 65 6e 74  || strstr(zAgent
b8e0: 2c 20 22 44 6f 77 6e 6c 6f 61 64 5f 4d 61 73 74  , "Download_Mast
b8f0: 65 72 22 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20  er")!=0.     || 
b900: 73 74 72 73 74 72 28 7a 41 67 65 6e 74 2c 20 22  strstr(zAgent, "
b910: 45 7a 6f 6f 6d 73 2f 22 29 21 3d 30 0a 20 20 20  Ezooms/")!=0.   
b920: 20 20 7c 7c 20 73 74 72 73 74 72 28 7a 41 67 65    || strstr(zAge
b930: 6e 74 2c 20 22 48 54 54 72 61 63 6b 22 29 21 3d  nt, "HTTrack")!=
b940: 30 0a 20 20 20 20 20 7c 7c 20 73 74 72 73 74 72  0.     || strstr
b950: 28 7a 41 67 65 6e 74 2c 20 22 41 68 72 65 66 73  (zAgent, "Ahrefs
b960: 42 6f 74 22 29 21 3d 30 0a 20 20 20 20 29 7b 0a  Bot")!=0.    ){.
b970: 20 20 20 20 20 20 46 6f 72 62 69 64 64 65 6e 28        Forbidden(
b980: 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 20 2f 2a 20 4c  __LINE__);  /* L
b990: 4f 47 3a 20 44 69 73 61 6c 6c 6f 77 65 64 20 75  OG: Disallowed u
b9a0: 73 65 72 20 61 67 65 6e 74 20 2a 2f 0a 20 20 20  ser agent */.   
b9b0: 20 7d 0a 20 20 7d 0a 23 69 66 20 30 0a 20 20 69   }.  }.#if 0.  i
b9c0: 66 28 20 7a 52 65 66 65 72 65 72 20 29 7b 0a 20  f( zReferer ){. 
b9d0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
b9e0: 63 68 61 72 20 2a 61 7a 44 69 73 61 6c 6c 6f 77  char *azDisallow
b9f0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 22 73 6b  [] = {.      "sk
ba00: 69 64 72 6f 77 63 72 61 63 6b 2e 63 6f 6d 22 2c  idrowcrack.com",
ba10: 0a 20 20 20 20 20 20 22 68 6f 73 68 69 79 75 75  .      "hoshiyuu
ba20: 67 69 2e 74 69 73 74 6f 72 79 2e 63 6f 6d 22 2c  gi.tistory.com",
ba30: 0a 20 20 20 20 20 20 22 73 6b 69 64 72 6f 77 67  .      "skidrowg
ba40: 61 6d 65 73 2e 6e 65 74 22 2c 0a 20 20 20 20 7d  ames.net",.    }
ba50: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
ba60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
ba70: 6f 66 28 61 7a 44 69 73 61 6c 6c 6f 77 29 2f 73  of(azDisallow)/s
ba80: 69 7a 65 6f 66 28 61 7a 44 69 73 61 6c 6c 6f 77  izeof(azDisallow
ba90: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
baa0: 20 20 69 66 28 20 73 74 72 73 74 72 28 7a 52 65    if( strstr(zRe
bab0: 66 65 72 65 72 2c 20 61 7a 44 69 73 61 6c 6c 6f  ferer, azDisallo
bac0: 77 5b 69 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20  w[i])!=0 ){.    
bad0: 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c      NotFound(__L
bae0: 49 4e 45 5f 5f 29 3b 20 20 2f 2a 20 4c 4f 47 3a  INE__);  /* LOG:
baf0: 20 44 69 73 61 6c 6c 6f 77 65 64 20 72 65 66 65   Disallowed refe
bb00: 72 72 65 72 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  rrer */.      }.
bb10: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
bb20: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 6e 20 65  ..  /* Make an e
bb30: 78 74 72 61 20 65 66 66 6f 72 74 20 74 6f 20 67  xtra effort to g
bb40: 65 74 20 61 20 76 61 6c 69 64 20 73 65 72 76 65  et a valid serve
bb50: 72 20 6e 61 6d 65 20 61 6e 64 20 70 6f 72 74 20  r name and port 
bb60: 6e 75 6d 62 65 72 2e 0a 20 20 2a 2a 20 4f 6e 6c  number..  ** Onl
bb70: 79 20 4e 65 74 73 63 61 70 65 20 70 72 6f 76 69  y Netscape provi
bb80: 64 65 73 20 74 68 69 73 20 69 6e 66 6f 72 6d 61  des this informa
bb90: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 62 72  tion.  If the br
bba0: 6f 77 73 65 72 20 69 73 0a 20 20 2a 2a 20 49 6e  owser is.  ** In
bbb0: 74 65 72 6e 65 74 20 45 78 70 6c 6f 72 65 72 2c  ternet Explorer,
bbc0: 20 74 68 65 6e 20 77 65 20 68 61 76 65 20 74 6f   then we have to
bbd0: 20 66 69 6e 64 20 6f 75 74 20 74 68 65 20 69 6e   find out the in
bbe0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 0a 20 20  formation for.  
bbf0: 2a 2a 20 6f 75 72 73 65 6c 76 65 73 2e 0a 20 20  ** ourselves..  
bc00: 2a 2f 0a 20 20 69 66 28 20 7a 53 65 72 76 65 72  */.  if( zServer
bc10: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  Name==0 ){.    z
bc20: 53 65 72 76 65 72 4e 61 6d 65 20 3d 20 53 61 66  ServerName = Saf
bc30: 65 4d 61 6c 6c 6f 63 28 20 31 30 30 20 29 3b 0a  eMalloc( 100 );.
bc40: 20 20 20 20 67 65 74 68 6f 73 74 6e 61 6d 65 28      gethostname(
bc50: 7a 53 65 72 76 65 72 4e 61 6d 65 2c 31 30 30 29  zServerName,100)
bc60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 53 65 72  ;.  }.  if( zSer
bc70: 76 65 72 50 6f 72 74 3d 3d 30 20 7c 7c 20 2a 7a  verPort==0 || *z
bc80: 53 65 72 76 65 72 50 6f 72 74 3d 3d 30 20 29 7b  ServerPort==0 ){
bc90: 0a 20 20 20 20 7a 53 65 72 76 65 72 50 6f 72 74  .    zServerPort
bca0: 20 3d 20 44 45 46 41 55 4c 54 5f 50 4f 52 54 3b   = DEFAULT_PORT;
bcb0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  .  }..  /* Remov
bcc0: 65 20 74 68 65 20 71 75 65 72 79 20 73 74 72 69  e the query stri
bcd0: 6e 67 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  ng from the end 
bce0: 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  of the requested
bcf0: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f   file..  */.  fo
bd00: 72 28 7a 3d 7a 53 63 72 69 70 74 3b 20 2a 7a 20  r(z=zScript; *z 
bd10: 26 26 20 2a 7a 21 3d 27 3f 27 3b 20 7a 2b 2b 29  && *z!='?'; z++)
bd20: 7b 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 3f 27  {}.  if( *z=='?'
bd30: 20 29 7b 0a 20 20 20 20 7a 51 75 65 72 79 53 75   ){.    zQuerySu
bd40: 66 66 69 78 20 3d 20 53 74 72 44 75 70 28 7a 29  ffix = StrDup(z)
bd50: 3b 0a 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20  ;.    *z = 0;.  
bd60: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 51 75 65 72  }else{.    zQuer
bd70: 79 53 75 66 66 69 78 20 3d 20 22 22 3b 0a 20 20  ySuffix = "";.  
bd80: 7d 0a 20 20 7a 51 75 65 72 79 53 74 72 69 6e 67  }.  zQueryString
bd90: 20 3d 20 2a 7a 51 75 65 72 79 53 75 66 66 69 78   = *zQuerySuffix
bda0: 20 3f 20 26 7a 51 75 65 72 79 53 75 66 66 69 78   ? &zQuerySuffix
bdb0: 5b 31 5d 20 3a 20 7a 51 75 65 72 79 53 75 66 66  [1] : zQuerySuff
bdc0: 69 78 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65  ix;..  /* Create
bdd0: 20 61 20 66 69 6c 65 20 74 6f 20 68 6f 6c 64 20   a file to hold 
bde0: 74 68 65 20 50 4f 53 54 20 71 75 65 72 79 20 64  the POST query d
bdf0: 61 74 61 2c 20 69 66 20 61 6e 79 2e 20 20 57 65  ata, if any.  We
be00: 20 68 61 76 65 20 74 6f 0a 20 20 2a 2a 20 64 6f   have to.  ** do
be10: 20 69 74 20 74 68 69 73 20 77 61 79 2e 20 20 57   it this way.  W
be20: 65 20 63 61 6e 27 74 20 6a 75 73 74 20 70 61 73  e can't just pas
be30: 73 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  s the file descr
be40: 69 70 74 6f 72 20 64 6f 77 6e 20 74 6f 0a 20 20  iptor down to.  
be50: 2a 2a 20 74 68 65 20 63 68 69 6c 64 20 70 72 6f  ** the child pro
be60: 63 65 73 73 20 62 65 63 61 75 73 65 20 74 68 65  cess because the
be70: 20 66 67 65 74 73 28 29 20 66 75 6e 63 74 69 6f   fgets() functio
be80: 6e 20 6d 61 79 20 68 61 76 65 20 61 6c 72 65 61  n may have alrea
be90: 64 79 0a 20 20 2a 2a 20 72 65 61 64 20 70 61 72  dy.  ** read par
bea0: 74 20 6f 66 20 74 68 65 20 50 4f 53 54 20 64 61  t of the POST da
beb0: 74 61 20 69 6e 74 6f 20 69 74 73 20 69 6e 74 65  ta into its inte
bec0: 72 6e 61 6c 20 62 75 66 66 65 72 2e 0a 20 20 2a  rnal buffer..  *
bed0: 2f 0a 20 20 69 66 28 20 7a 4d 65 74 68 6f 64 5b  /.  if( zMethod[
bee0: 30 5d 3d 3d 27 50 27 20 26 26 20 7a 43 6f 6e 74  0]=='P' && zCont
bef0: 65 6e 74 4c 65 6e 67 74 68 21 3d 30 20 29 7b 0a  entLength!=0 ){.
bf00: 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 61 74      int len = at
bf10: 6f 69 28 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67 74  oi(zContentLengt
bf20: 68 29 3b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75  h);.    FILE *ou
bf30: 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 42 75  t;.    char *zBu
bf40: 66 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20  f;.    int n;.. 
bf50: 20 20 20 69 66 28 20 6c 65 6e 3e 4d 41 58 5f 43     if( len>MAX_C
bf60: 4f 4e 54 45 4e 54 5f 4c 45 4e 47 54 48 20 29 7b  ONTENT_LENGTH ){
bf70: 0a 20 20 20 20 20 20 53 74 61 72 74 52 65 73 70  .      StartResp
bf80: 6f 6e 73 65 28 22 35 30 30 20 52 65 71 75 65 73  onse("500 Reques
bf90: 74 20 74 6f 6f 20 6c 61 72 67 65 22 29 3b 0a 20  t too large");. 
bfa0: 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69       nOut += pri
bfb0: 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 43 6f  ntf(.        "Co
bfc0: 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74  ntent-type: text
bfd0: 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20 20  /plain\r\n".    
bfe0: 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 20      "\r\n".     
bff0: 20 20 20 22 54 6f 6f 20 6d 75 63 68 20 50 4f 53     "Too much POS
c000: 54 20 64 61 74 61 5c 6e 22 0a 20 20 20 20 20 20  T data\n".      
c010: 29 3b 0a 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67  );.      MakeLog
c020: 45 6e 74 72 79 28 30 2c 20 5f 5f 4c 49 4e 45 5f  Entry(0, __LINE_
c030: 5f 29 3b 20 2f 2a 20 4c 4f 47 3a 20 52 65 71 75  _); /* LOG: Requ
c040: 65 73 74 20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f  est too large */
c050: 0a 20 20 20 20 20 20 65 78 69 74 28 30 29 3b 0a  .      exit(0);.
c060: 20 20 20 20 7d 0a 20 20 20 20 73 70 72 69 6e 74      }.    sprint
c070: 66 28 7a 54 6d 70 4e 61 6d 42 75 66 2c 20 22 2f  f(zTmpNamBuf, "/
c080: 74 6d 70 2f 2d 70 6f 73 74 2d 64 61 74 61 2d 58  tmp/-post-data-X
c090: 58 58 58 58 58 22 29 3b 0a 20 20 20 20 7a 54 6d  XXXXX");.    zTm
c0a0: 70 4e 61 6d 20 3d 20 7a 54 6d 70 4e 61 6d 42 75  pNam = zTmpNamBu
c0b0: 66 3b 0a 20 20 20 20 69 66 28 20 6d 6b 73 74 65  f;.    if( mkste
c0c0: 6d 70 28 7a 54 6d 70 4e 61 6d 29 3c 30 20 29 7b  mp(zTmpNam)<0 ){
c0d0: 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69  .      Malfuncti
c0e0: 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 20 2f 2a  on(__LINE__,  /*
c0f0: 20 4c 4f 47 3a 20 6d 6b 73 74 65 6d 70 28 29 20   LOG: mkstemp() 
c100: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
c110: 20 20 20 20 20 20 20 20 20 22 43 61 6e 6e 6f 74           "Cannot
c120: 20 63 72 65 61 74 65 20 61 20 74 65 6d 70 20 66   create a temp f
c130: 69 6c 65 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ile in which to 
c140: 73 74 6f 72 65 20 50 4f 53 54 20 64 61 74 61 22  store POST data"
c150: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 75 74  );.    }.    out
c160: 20 3d 20 66 6f 70 65 6e 28 7a 54 6d 70 4e 61 6d   = fopen(zTmpNam
c170: 2c 22 77 22 29 3b 0a 20 20 20 20 69 66 28 20 6f  ,"w");.    if( o
c180: 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53  ut==0 ){.      S
c190: 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 35 30  tartResponse("50
c1a0: 30 20 43 61 6e 6e 6f 74 20 63 72 65 61 74 65 20  0 Cannot create 
c1b0: 2f 74 6d 70 20 66 69 6c 65 22 29 3b 0a 20 20 20  /tmp file");.   
c1c0: 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74     nOut += print
c1d0: 66 28 0a 20 20 20 20 20 20 20 20 22 43 6f 6e 74  f(.        "Cont
c1e0: 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 70  ent-type: text/p
c1f0: 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 20 20  lain\r\n".      
c200: 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 20 20 20    "\r\n".       
c210: 20 22 43 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e   "Could not open
c220: 20 5c 22 25 73 5c 22 20 66 6f 72 20 77 72 69 74   \"%s\" for writ
c230: 69 6e 67 5c 6e 22 2c 20 7a 54 6d 70 4e 61 6d 0a  ing\n", zTmpNam.
c240: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 4d        );.      M
c250: 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 5f  akeLogEntry(0, _
c260: 5f 4c 49 4e 45 5f 5f 29 3b 20 2f 2a 20 4c 4f 47  _LINE__); /* LOG
c270: 3a 20 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20  : cannot create 
c280: 74 65 6d 70 20 66 69 6c 65 20 66 6f 72 20 50 4f  temp file for PO
c290: 53 54 20 2a 2f 0a 20 20 20 20 20 20 65 78 69 74  ST */.      exit
c2a0: 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  (0);.    }.    z
c2b0: 42 75 66 20 3d 20 53 61 66 65 4d 61 6c 6c 6f 63  Buf = SafeMalloc
c2c0: 28 20 6c 65 6e 2b 31 20 29 3b 0a 20 20 20 20 69  ( len+1 );.    i
c2d0: 66 28 20 75 73 65 54 69 6d 65 6f 75 74 20 29 20  f( useTimeout ) 
c2e0: 61 6c 61 72 6d 28 31 35 20 2b 20 6c 65 6e 2f 32  alarm(15 + len/2
c2f0: 30 30 30 29 3b 0a 20 20 20 20 6e 20 3d 20 66 72  000);.    n = fr
c300: 65 61 64 28 7a 42 75 66 2c 31 2c 6c 65 6e 2c 73  ead(zBuf,1,len,s
c310: 74 64 69 6e 29 3b 0a 20 20 20 20 6e 49 6e 20 2b  tdin);.    nIn +
c320: 3d 20 6e 3b 0a 20 20 20 20 66 77 72 69 74 65 28  = n;.    fwrite(
c330: 7a 42 75 66 2c 31 2c 6e 2c 6f 75 74 29 3b 0a 20  zBuf,1,n,out);. 
c340: 20 20 20 66 72 65 65 28 7a 42 75 66 29 3b 0a 20     free(zBuf);. 
c350: 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a     fclose(out);.
c360: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
c370: 75 72 65 20 74 68 65 20 72 75 6e 6e 69 6e 67 20  ure the running 
c380: 74 69 6d 65 20 69 73 20 6e 6f 74 20 74 6f 6f 20  time is not too 
c390: 67 72 65 61 74 20 2a 2f 0a 20 20 69 66 28 20 75  great */.  if( u
c3a0: 73 65 54 69 6d 65 6f 75 74 20 29 20 61 6c 61 72  seTimeout ) alar
c3b0: 6d 28 31 30 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  m(10);..  /* Con
c3c0: 76 65 72 74 20 61 6c 6c 20 75 6e 75 73 75 61 6c  vert all unusual
c3d0: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
c3e0: 68 65 20 73 63 72 69 70 74 20 6e 61 6d 65 20 69  he script name i
c3f0: 6e 74 6f 20 22 5f 22 2e 0a 20 20 2a 2a 0a 20 20  nto "_"..  **.  
c400: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 64 65 66  ** This is a def
c410: 65 6e 73 65 20 61 67 61 69 6e 73 74 20 76 61 72  ense against var
c420: 69 6f 75 73 20 61 74 74 61 63 6b 73 2c 20 58 53  ious attacks, XS
c430: 53 20 61 74 74 61 63 6b 73 20 69 6e 20 70 61 72  S attacks in par
c440: 74 69 63 75 6c 61 72 2e 0a 20 20 2a 2f 0a 20 20  ticular..  */.  
c450: 73 61 6e 69 74 69 7a 65 53 74 72 69 6e 67 28 7a  sanitizeString(z
c460: 53 63 72 69 70 74 29 3b 0a 0a 20 20 2f 2a 20 44  Script);..  /* D
c470: 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 22 2f 2e 22  o not allow "/."
c480: 20 6f 72 20 22 2f 2d 22 20 74 6f 20 74 6f 20 6f   or "/-" to to o
c490: 63 63 75 72 20 61 6e 79 77 68 65 72 65 20 69 6e  ccur anywhere in
c4a0: 20 74 68 65 20 65 6e 74 69 74 79 20 6e 61 6d 65   the entity name
c4b0: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 65 76  ..  ** This prev
c4c0: 65 6e 74 73 20 61 74 74 61 63 6b 73 20 69 6e 76  ents attacks inv
c4d0: 6f 6c 76 69 6e 67 20 22 2e 2e 22 20 61 6e 64 20  olving ".." and 
c4e0: 61 6c 73 6f 20 61 6c 6c 6f 77 73 20 75 73 20 74  also allows us t
c4f0: 6f 20 63 72 65 61 74 65 0a 20 20 2a 2a 20 66 69  o create.  ** fi
c500: 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72  les and director
c510: 69 65 73 20 77 68 6f 73 65 20 6e 61 6d 65 73 20  ies whose names 
c520: 62 65 67 69 6e 20 77 69 74 68 20 22 2d 22 20 6f  begin with "-" o
c530: 72 20 22 2e 22 20 77 68 69 63 68 20 61 72 65 0a  r "." which are.
c540: 20 20 2a 2a 20 69 6e 76 69 73 69 62 6c 65 20 74    ** invisible t
c550: 6f 20 74 68 65 20 77 65 62 73 65 72 76 65 72 2e  o the webserver.
c560: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70  .  **.  ** Excep
c570: 74 69 6f 6e 3a 20 20 41 6c 6c 6f 77 20 74 68 65  tion:  Allow the
c580: 20 22 2f 2e 77 65 6c 6c 2d 6b 6e 6f 77 6e 2f 22   "/.well-known/"
c590: 20 70 72 65 66 69 78 20 69 6e 20 61 63 63 6f 72   prefix in accor
c5a0: 64 61 6e 63 65 20 77 69 74 68 0a 20 20 2a 2a 20  dance with.  ** 
c5b0: 52 46 43 2d 35 37 38 35 0a 20 20 2a 2f 0a 20 20  RFC-5785.  */.  
c5c0: 66 6f 72 28 7a 3d 7a 53 63 72 69 70 74 3b 20 2a  for(z=zScript; *
c5d0: 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  z; z++){.    if(
c5e0: 20 2a 7a 3d 3d 27 2f 27 20 26 26 20 28 7a 5b 31   *z=='/' && (z[1
c5f0: 5d 3d 3d 27 2e 27 20 7c 7c 20 7a 5b 31 5d 3d 3d  ]=='.' || z[1]==
c600: 27 2d 27 29 0a 20 20 20 20 20 26 26 20 28 7a 3e  '-').     && (z>
c610: 7a 53 63 72 69 70 74 20 7c 7c 20 73 74 72 6e 63  zScript || strnc
c620: 6d 70 28 7a 2c 22 2f 2e 77 65 6c 6c 2d 6b 6e 6f  mp(z,"/.well-kno
c630: 77 6e 2f 22 2c 31 33 29 21 3d 30 29 0a 20 20 20  wn/",13)!=0).   
c640: 20 29 7b 0a 20 20 20 20 20 20 20 4e 6f 74 46 6f   ){.       NotFo
c650: 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 2f  und(__LINE__); /
c660: 2a 20 4c 4f 47 3a 20 50 61 74 68 20 65 6c 65 6d  * LOG: Path elem
c670: 65 6e 74 20 62 65 67 69 6e 73 20 77 69 74 68 20  ent begins with 
c680: 22 2e 22 20 6f 72 20 22 2d 22 20 2a 2f 0a 20 20  "." or "-" */.  
c690: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
c6a0: 67 75 72 65 20 6f 75 74 20 77 68 61 74 20 74 68  gure out what th
c6b0: 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 66 69  e root of the fi
c6c0: 6c 65 73 79 73 74 65 6d 20 73 68 6f 75 6c 64 20  lesystem should 
c6d0: 62 65 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a  be.  If the.  **
c6e0: 20 48 54 54 50 5f 48 4f 53 54 20 70 61 72 61 6d   HTTP_HOST param
c6f0: 65 74 65 72 20 65 78 69 73 74 73 20 28 73 74 6f  eter exists (sto
c700: 72 65 64 20 69 6e 20 7a 48 74 74 70 48 6f 73 74  red in zHttpHost
c710: 29 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68  ) then remove th
c720: 65 0a 20 20 2a 2a 20 70 6f 72 74 20 6e 75 6d 62  e.  ** port numb
c730: 65 72 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  er from the end 
c740: 28 69 66 20 61 6e 79 29 2c 20 63 6f 6e 76 65 72  (if any), conver
c750: 74 20 61 6c 6c 20 63 68 61 72 61 63 74 65 72 73  t all characters
c760: 20 74 6f 20 6c 6f 77 65 72 0a 20 20 2a 2a 20 63   to lower.  ** c
c770: 61 73 65 2c 20 61 6e 64 20 63 6f 6e 76 65 72 74  ase, and convert
c780: 20 61 6c 6c 20 22 2e 22 20 74 6f 20 22 5f 22 2e   all "." to "_".
c790: 20 20 54 68 65 6e 20 74 72 79 20 74 6f 20 66 69    Then try to fi
c7a0: 6e 64 20 61 20 64 69 72 65 63 74 6f 72 79 0a 20  nd a directory. 
c7b0: 20 2a 2a 20 77 69 74 68 20 74 68 61 74 20 6e 61   ** with that na
c7c0: 6d 65 20 61 6e 64 20 74 68 65 20 65 78 74 65 6e  me and the exten
c7d0: 73 69 6f 6e 20 2e 77 65 62 73 69 74 65 2e 20 20  sion .website.  
c7e0: 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c 6f  If not found, lo
c7f0: 6f 6b 0a 20 20 2a 2a 20 66 6f 72 20 22 64 65 66  ok.  ** for "def
c800: 61 75 6c 74 2e 77 65 62 73 69 74 65 22 2e 0a 20  ault.website".. 
c810: 20 2a 2f 0a 20 20 69 66 28 20 7a 53 63 72 69 70   */.  if( zScrip
c820: 74 5b 30 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20  t[0]!='/' ){.   
c830: 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45   NotFound(__LINE
c840: 5f 5f 29 3b 20 2f 2a 20 4c 4f 47 3a 20 55 52 49  __); /* LOG: URI
c850: 20 64 6f 65 73 20 6e 6f 74 20 73 74 61 72 74 20   does not start 
c860: 77 69 74 68 20 22 2f 22 20 2a 2f 0a 20 20 7d 0a  with "/" */.  }.
c870: 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 52 6f    if( strlen(zRo
c880: 6f 74 29 2b 34 30 20 3e 3d 20 73 69 7a 65 6f 66  ot)+40 >= sizeof
c890: 28 7a 4c 69 6e 65 29 20 29 7b 0a 20 20 20 20 20  (zLine) ){.     
c8a0: 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f  NotFound(__LINE_
c8b0: 5f 29 3b 20 2f 2a 20 4c 4f 47 3a 20 55 52 49 20  _); /* LOG: URI 
c8c0: 74 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a 20 20 7d 0a  too long */.  }.
c8d0: 20 20 69 66 28 20 7a 48 74 74 70 48 6f 73 74 3d    if( zHttpHost=
c8e0: 3d 30 20 7c 7c 20 7a 48 74 74 70 48 6f 73 74 5b  =0 || zHttpHost[
c8f0: 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 4e 6f 74  0]==0 ){.    Not
c900: 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b  Found(__LINE__);
c910: 20 20 2f 2a 20 4c 4f 47 3a 20 4d 69 73 73 69 6e    /* LOG: Missin
c920: 67 20 48 4f 53 54 3a 20 70 61 72 61 6d 65 74 65  g HOST: paramete
c930: 72 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28  r */.  }else if(
c940: 20 73 74 72 6c 65 6e 28 7a 48 74 74 70 48 6f 73   strlen(zHttpHos
c950: 74 29 2b 73 74 72 6c 65 6e 28 7a 52 6f 6f 74 29  t)+strlen(zRoot)
c960: 2b 31 30 20 3e 3d 20 73 69 7a 65 6f 66 28 7a 4c  +10 >= sizeof(zL
c970: 69 6e 65 29 20 29 7b 0a 20 20 20 20 4e 6f 74 46  ine) ){.    NotF
c980: 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20  ound(__LINE__); 
c990: 20 2f 2a 20 4c 4f 47 3a 20 48 4f 53 54 20 70 61   /* LOG: HOST pa
c9a0: 72 61 6d 65 74 65 72 20 74 6f 6f 20 6c 6f 6e 67  rameter too long
c9b0: 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
c9c0: 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20   sprintf(zLine, 
c9d0: 22 25 73 2f 25 73 22 2c 20 7a 52 6f 6f 74 2c 20  "%s/%s", zRoot, 
c9e0: 7a 48 74 74 70 48 6f 73 74 29 3b 0a 20 20 20 20  zHttpHost);.    
c9f0: 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 7a 52 6f  for(i=strlen(zRo
ca00: 6f 74 29 2b 31 3b 20 7a 4c 69 6e 65 5b 69 5d 20  ot)+1; zLine[i] 
ca10: 26 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d 27 3a 27  && zLine[i]!=':'
ca20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
ca30: 74 20 63 20 3d 20 7a 4c 69 6e 65 5b 69 5d 3b 0a  t c = zLine[i];.
ca40: 20 20 20 20 20 20 69 66 28 20 21 69 73 61 6c 6e        if( !isaln
ca50: 75 6d 28 63 29 20 29 7b 0a 20 20 20 20 20 20 20  um(c) ){.       
ca60: 20 7a 4c 69 6e 65 5b 69 5d 20 3d 20 27 5f 27 3b   zLine[i] = '_';
ca70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
ca80: 20 69 73 75 70 70 65 72 28 63 29 20 29 7b 0a 20   isupper(c) ){. 
ca90: 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 69 5d 20         zLine[i] 
caa0: 3d 20 74 6f 6c 6f 77 65 72 28 63 29 3b 0a 20 20  = tolower(c);.  
cab0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
cac0: 73 74 72 63 70 79 28 26 7a 4c 69 6e 65 5b 69 5d  strcpy(&zLine[i]
cad0: 2c 20 22 2e 77 65 62 73 69 74 65 22 29 3b 0a 20  , ".website");. 
cae0: 20 7d 0a 20 20 69 66 28 20 73 74 61 74 28 7a 4c   }.  if( stat(zL
caf0: 69 6e 65 2c 26 73 74 61 74 62 75 66 29 20 7c 7c  ine,&statbuf) ||
cb00: 20 21 53 5f 49 53 44 49 52 28 73 74 61 74 62 75   !S_ISDIR(statbu
cb10: 66 2e 73 74 5f 6d 6f 64 65 29 20 29 7b 0a 20 20  f.st_mode) ){.  
cb20: 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c    sprintf(zLine,
cb30: 20 22 25 73 2f 64 65 66 61 75 6c 74 2e 77 65 62   "%s/default.web
cb40: 73 69 74 65 22 2c 20 7a 52 6f 6f 74 29 3b 0a 20  site", zRoot);. 
cb50: 20 20 20 69 66 28 20 73 74 61 74 28 7a 4c 69 6e     if( stat(zLin
cb60: 65 2c 26 73 74 61 74 62 75 66 29 20 7c 7c 20 21  e,&statbuf) || !
cb70: 53 5f 49 53 44 49 52 28 73 74 61 74 62 75 66 2e  S_ISDIR(statbuf.
cb80: 73 74 5f 6d 6f 64 65 29 20 29 7b 0a 20 20 20 20  st_mode) ){.    
cb90: 20 20 69 66 28 20 73 74 61 6e 64 61 6c 6f 6e 65    if( standalone
cba0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 70 72 69   ){.        spri
cbb0: 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 25 73 22 2c  ntf(zLine, "%s",
cbc0: 20 7a 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 7d   zRoot);.      }
cbd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4e 6f  else{.        No
cbe0: 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29  tFound(__LINE__)
cbf0: 3b 20 20 2f 2a 20 4c 4f 47 3a 20 2a 2e 77 65 62  ;  /* LOG: *.web
cc00: 73 69 74 65 20 70 65 72 6d 69 73 73 69 6f 6e 73  site permissions
cc10: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
cc20: 7d 0a 20 20 7d 0a 20 20 7a 48 6f 6d 65 20 3d 20  }.  }.  zHome = 
cc30: 53 74 72 44 75 70 28 7a 4c 69 6e 65 29 3b 0a 0a  StrDup(zLine);..
cc40: 20 20 2f 2a 20 43 68 61 6e 67 65 20 64 69 72 65    /* Change dire
cc50: 63 74 6f 72 69 65 73 20 74 6f 20 74 68 65 20 72  ctories to the r
cc60: 6f 6f 74 20 6f 66 20 74 68 65 20 48 54 54 50 20  oot of the HTTP 
cc70: 66 69 6c 65 73 79 73 74 65 6d 0a 20 20 2a 2f 0a  filesystem.  */.
cc80: 20 20 69 66 28 20 63 68 64 69 72 28 7a 48 6f 6d    if( chdir(zHom
cc90: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  e)!=0 ){.    cha
cca0: 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20  r zBuf[1000];.  
ccb0: 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f    Malfunction(__
ccc0: 4c 49 4e 45 5f 5f 2c 20 20 2f 2a 20 4c 4f 47 3a  LINE__,  /* LOG:
ccd0: 20 63 68 64 69 72 28 29 20 66 61 69 6c 65 64 20   chdir() failed 
cce0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 22 63 61 6e  */.         "can
ccf0: 6e 6f 74 20 63 68 64 69 72 20 74 6f 20 5b 25 73  not chdir to [%s
cd00: 5d 20 66 72 6f 6d 20 5b 25 73 5d 22 2c 0a 20 20  ] from [%s]",.  
cd10: 20 20 20 20 20 20 20 7a 48 6f 6d 65 2c 20 67 65         zHome, ge
cd20: 74 63 77 64 28 7a 42 75 66 2c 39 39 39 29 29 3b  tcwd(zBuf,999));
cd30: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
cd40: 65 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74 68  e the file in th
cd50: 65 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 57  e filesystem.  W
cd60: 65 20 6d 69 67 68 74 20 68 61 76 65 20 74 6f 20  e might have to 
cd70: 61 70 70 65 6e 64 0a 20 20 2a 2a 20 74 68 65 20  append.  ** the 
cd80: 6e 61 6d 65 20 22 69 6e 64 65 78 2e 68 74 6d 6c  name "index.html
cd90: 22 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 69  " in order to fi
cda0: 6e 64 20 69 74 2e 20 20 41 6e 79 20 65 78 63 65  nd it.  Any exce
cdb0: 73 73 20 70 61 74 68 0a 20 20 2a 2a 20 69 6e 66  ss path.  ** inf
cdc0: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 70 75 74 20  ormation is put 
cdd0: 69 6e 74 6f 20 74 68 65 20 7a 50 61 74 68 49 6e  into the zPathIn
cde0: 66 6f 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 2a  fo variable..  *
cdf0: 2f 0a 20 20 6a 20 3d 20 6a 30 20 3d 20 28 69 6e  /.  j = j0 = (in
ce00: 74 29 73 74 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b  t)strlen(zLine);
ce10: 0a 20 20 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c  .  i = 0;.  whil
ce20: 65 28 20 7a 53 63 72 69 70 74 5b 69 5d 20 29 7b  e( zScript[i] ){
ce30: 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 53 63 72  .    while( zScr
ce40: 69 70 74 5b 69 5d 20 26 26 20 28 69 3d 3d 30 20  ipt[i] && (i==0 
ce50: 7c 7c 20 7a 53 63 72 69 70 74 5b 69 5d 21 3d 27  || zScript[i]!='
ce60: 2f 27 29 20 29 7b 0a 20 20 20 20 20 20 7a 4c 69  /') ){.      zLi
ce70: 6e 65 5b 6a 5d 20 3d 20 7a 53 63 72 69 70 74 5b  ne[j] = zScript[
ce80: 69 5d 3b 0a 20 20 20 20 20 20 69 2b 2b 3b 20 6a  i];.      i++; j
ce90: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4c  ++;.    }.    zL
cea0: 69 6e 65 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20  ine[j] = 0;.    
ceb0: 69 66 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26  if( stat(zLine,&
cec0: 73 74 61 74 62 75 66 29 21 3d 30 20 29 7b 0a 20  statbuf)!=0 ){. 
ced0: 20 20 20 20 20 69 6e 74 20 73 74 69 6c 6c 53 65       int stillSe
cee0: 61 72 63 68 69 6e 67 20 3d 20 31 3b 0a 20 20 20  arching = 1;.   
cef0: 20 20 20 77 68 69 6c 65 28 20 73 74 69 6c 6c 53     while( stillS
cf00: 65 61 72 63 68 69 6e 67 20 26 26 20 69 3e 30 20  earching && i>0 
cf10: 26 26 20 6a 3e 6a 30 20 29 7b 0a 20 20 20 20 20  && j>j0 ){.     
cf20: 20 20 20 77 68 69 6c 65 28 20 6a 3e 6a 30 20 26     while( j>j0 &
cf30: 26 20 7a 4c 69 6e 65 5b 6a 2d 31 5d 21 3d 27 2f  & zLine[j-1]!='/
cf40: 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20  ' ){ j--; }.    
cf50: 20 20 20 20 73 74 72 63 70 79 28 26 7a 4c 69 6e      strcpy(&zLin
cf60: 65 5b 6a 2d 31 5d 2c 20 22 2f 6e 6f 74 2d 66 6f  e[j-1], "/not-fo
cf70: 75 6e 64 2e 68 74 6d 6c 22 29 3b 0a 20 20 20 20  und.html");.    
cf80: 20 20 20 20 69 66 28 20 73 74 61 74 28 7a 4c 69      if( stat(zLi
cf90: 6e 65 2c 26 73 74 61 74 62 75 66 29 3d 3d 30 20  ne,&statbuf)==0 
cfa0: 26 26 20 53 5f 49 53 52 45 47 28 73 74 61 74 62  && S_ISREG(statb
cfb0: 75 66 2e 73 74 5f 6d 6f 64 65 29 0a 20 20 20 20  uf.st_mode).    
cfc0: 20 20 20 20 20 20 20 20 26 26 20 61 63 63 65 73          && acces
cfd0: 73 28 7a 4c 69 6e 65 2c 52 5f 4f 4b 29 3d 3d 30  s(zLine,R_OK)==0
cfe0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 52   ){.          zR
cff0: 65 61 6c 53 63 72 69 70 74 20 3d 20 53 74 72 44  ealScript = StrD
d000: 75 70 28 26 7a 4c 69 6e 65 5b 6a 30 5d 29 3b 0a  up(&zLine[j0]);.
d010: 20 20 20 20 20 20 20 20 20 20 52 65 64 69 72 65            Redire
d020: 63 74 28 7a 52 65 61 6c 53 63 72 69 70 74 2c 20  ct(zRealScript, 
d030: 31 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 2f 2a  1, __LINE__); /*
d040: 20 4c 4f 47 3a 20 72 65 64 69 72 65 63 74 20 74   LOG: redirect t
d050: 6f 20 6e 6f 74 2d 66 6f 75 6e 64 20 2a 2f 0a 20  o not-found */. 
d060: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
d070: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
d080: 20 20 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20            j--;. 
d090: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
d0a0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 69 6c 6c  .      if( still
d0b0: 53 65 61 72 63 68 69 6e 67 20 29 20 4e 6f 74 46  Searching ) NotF
d0c0: 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20  ound(__LINE__); 
d0d0: 2f 2a 20 4c 4f 47 3a 20 55 52 49 20 6e 6f 74 20  /* LOG: URI not 
d0e0: 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 62  found */.      b
d0f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
d100: 69 66 28 20 53 5f 49 53 52 45 47 28 73 74 61 74  if( S_ISREG(stat
d110: 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 7b 0a  buf.st_mode) ){.
d120: 20 20 20 20 20 20 69 66 28 20 61 63 63 65 73 73        if( access
d130: 28 7a 4c 69 6e 65 2c 52 5f 4f 4b 29 20 29 7b 0a  (zLine,R_OK) ){.
d140: 20 20 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64          NotFound
d150: 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 20 2f 2a 20  (__LINE__);  /* 
d160: 4c 4f 47 3a 20 46 69 6c 65 20 6e 6f 74 20 72 65  LOG: File not re
d170: 61 64 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  adable */.      
d180: 7d 0a 20 20 20 20 20 20 7a 52 65 61 6c 53 63 72  }.      zRealScr
d190: 69 70 74 20 3d 20 53 74 72 44 75 70 28 26 7a 4c  ipt = StrDup(&zL
d1a0: 69 6e 65 5b 6a 30 5d 29 3b 0a 20 20 20 20 20 20  ine[j0]);.      
d1b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
d1c0: 20 69 66 28 20 7a 53 63 72 69 70 74 5b 69 5d 3d   if( zScript[i]=
d1d0: 3d 30 20 7c 7c 20 7a 53 63 72 69 70 74 5b 69 2b  =0 || zScript[i+
d1e0: 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  1]==0 ){.      s
d1f0: 74 72 63 70 79 28 26 7a 4c 69 6e 65 5b 6a 5d 2c  trcpy(&zLine[j],
d200: 22 2f 69 6e 64 65 78 2e 68 74 6d 6c 22 29 3b 0a  "/index.html");.
d210: 20 20 20 20 20 20 69 66 28 20 73 74 61 74 28 7a        if( stat(z
d220: 4c 69 6e 65 2c 26 73 74 61 74 62 75 66 29 21 3d  Line,&statbuf)!=
d230: 30 20 7c 7c 20 21 53 5f 49 53 52 45 47 28 73 74  0 || !S_ISREG(st
d240: 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 0a  atbuf.st_mode) .
d250: 20 20 20 20 20 20 7c 7c 20 61 63 63 65 73 73 28        || access(
d260: 7a 4c 69 6e 65 2c 52 5f 4f 4b 29 20 29 7b 0a 20  zLine,R_OK) ){. 
d270: 20 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a         strcpy(&z
d280: 4c 69 6e 65 5b 6a 5d 2c 22 2f 69 6e 64 65 78 2e  Line[j],"/index.
d290: 63 67 69 22 29 3b 0a 20 20 20 20 20 20 20 20 69  cgi");.        i
d2a0: 66 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73  f( stat(zLine,&s
d2b0: 74 61 74 62 75 66 29 21 3d 30 20 7c 7c 20 21 53  tatbuf)!=0 || !S
d2c0: 5f 49 53 52 45 47 28 73 74 61 74 62 75 66 2e 73  _ISREG(statbuf.s
d2d0: 74 5f 6d 6f 64 65 29 20 0a 20 20 20 20 20 20 20  t_mode) .       
d2e0: 20 7c 7c 20 61 63 63 65 73 73 28 7a 4c 69 6e 65   || access(zLine
d2f0: 2c 52 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20  ,R_OK) ){.      
d300: 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c      NotFound(__L
d310: 49 4e 45 5f 5f 29 3b 20 2f 2a 20 4c 4f 47 3a 20  INE__); /* LOG: 
d320: 55 52 49 20 69 73 20 61 20 64 69 72 65 63 74 6f  URI is a directo
d330: 72 79 20 77 2f 6f 20 69 6e 64 65 78 2e 68 74 6d  ry w/o index.htm
d340: 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  l */.        }. 
d350: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 52 65       }.      zRe
d360: 61 6c 53 63 72 69 70 74 20 3d 20 53 74 72 44 75  alScript = StrDu
d370: 70 28 26 7a 4c 69 6e 65 5b 6a 30 5d 29 3b 0a 20  p(&zLine[j0]);. 
d380: 20 20 20 20 20 69 66 28 20 7a 53 63 72 69 70 74       if( zScript
d390: 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]==0 ){.      
d3a0: 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75    /* If the requ
d3b0: 65 73 74 65 64 20 55 52 4c 20 64 6f 65 73 20 6e  ested URL does n
d3c0: 6f 74 20 65 6e 64 20 77 69 74 68 20 22 2f 22 20  ot end with "/" 
d3d0: 62 75 74 20 77 65 20 68 61 64 20 74 6f 0a 20 20  but we had to.  
d3e0: 20 20 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20        ** append 
d3f0: 22 69 6e 64 65 78 2e 68 74 6d 6c 22 2c 20 74 68  "index.html", th
d400: 65 6e 20 61 20 72 65 64 69 72 65 63 74 20 69 73  en a redirect is
d410: 20 6e 65 63 65 73 73 61 72 79 2e 20 20 4f 74 68   necessary.  Oth
d420: 65 72 77 69 73 65 0a 20 20 20 20 20 20 20 20 2a  erwise.        *
d430: 2a 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 65  * none of the re
d440: 6c 61 74 69 76 65 20 55 52 4c 73 20 69 6e 20 74  lative URLs in t
d450: 68 65 20 64 65 6c 69 76 65 72 65 64 20 64 6f 63  he delivered doc
d460: 75 6d 65 6e 74 20 77 69 6c 6c 20 62 65 0a 20 20  ument will be.  
d470: 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74        ** correct
d480: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 52 65 64  . */.        Red
d490: 69 72 65 63 74 28 7a 52 65 61 6c 53 63 72 69 70  irect(zRealScrip
d4a0: 74 2c 31 2c 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 2f  t,1,__LINE__); /
d4b0: 2a 20 4c 4f 47 3a 20 72 65 64 69 72 65 63 74 20  * LOG: redirect 
d4c0: 74 6f 20 61 64 64 20 74 72 61 69 6c 69 6e 67 20  to add trailing 
d4d0: 2f 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  / */.        ret
d4e0: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
d4f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d500: 20 20 20 20 7a 4c 69 6e 65 5b 6a 5d 20 3d 20 7a      zLine[j] = z
d510: 53 63 72 69 70 74 5b 69 5d 3b 0a 20 20 20 20 69  Script[i];.    i
d520: 2b 2b 3b 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 7a  ++; j++;.  }.  z
d530: 46 69 6c 65 20 3d 20 53 74 72 44 75 70 28 7a 4c  File = StrDup(zL
d540: 69 6e 65 29 3b 0a 20 20 7a 50 61 74 68 49 6e 66  ine);.  zPathInf
d550: 6f 20 3d 20 53 74 72 44 75 70 28 26 7a 53 63 72  o = StrDup(&zScr
d560: 69 70 74 5b 69 5d 29 3b 0a 20 20 6c 65 6e 46 69  ipt[i]);.  lenFi
d570: 6c 65 20 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c  le = strlen(zFil
d580: 65 29 3b 0a 20 20 7a 44 69 72 20 3d 20 53 74 72  e);.  zDir = Str
d590: 44 75 70 28 7a 46 69 6c 65 29 3b 0a 20 20 66 6f  Dup(zFile);.  fo
d5a0: 72 28 69 3d 73 74 72 6c 65 6e 28 7a 44 69 72 29  r(i=strlen(zDir)
d5b0: 2d 31 3b 20 69 3e 30 20 26 26 20 7a 44 69 72 5b  -1; i>0 && zDir[
d5c0: 69 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 3b  i]!='/'; i--){};
d5d0: 0a 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20  .  if( i==0 ){. 
d5e0: 20 20 20 20 73 74 72 63 70 79 28 7a 44 69 72 2c      strcpy(zDir,
d5f0: 22 2f 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  "/");.  }else{. 
d600: 20 20 20 20 7a 44 69 72 5b 69 5d 20 3d 20 30 3b      zDir[i] = 0;
d610: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
d620: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
d630: 20 69 73 20 61 6e 20 61 75 74 68 6f 72 69 7a 61   is an authoriza
d640: 74 69 6f 6e 20 66 69 6c 65 2e 20 20 49 66 20 74  tion file.  If t
d650: 68 65 72 65 20 69 73 2c 0a 20 20 2a 2a 20 70 72  here is,.  ** pr
d660: 6f 63 65 73 73 20 69 74 2e 0a 20 20 2a 2f 0a 20  ocess it..  */. 
d670: 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20   sprintf(zLine, 
d680: 22 25 73 2f 2d 61 75 74 68 22 2c 20 7a 44 69 72  "%s/-auth", zDir
d690: 29 3b 0a 20 20 69 66 28 20 61 63 63 65 73 73 28  );.  if( access(
d6a0: 7a 4c 69 6e 65 2c 52 5f 4f 4b 29 3d 3d 30 20 26  zLine,R_OK)==0 &
d6b0: 26 20 21 43 68 65 63 6b 42 61 73 69 63 41 75 74  & !CheckBasicAut
d6c0: 68 6f 72 69 7a 61 74 69 6f 6e 28 7a 4c 69 6e 65  horization(zLine
d6d0: 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  ) ) return;..  /
d6e0: 2a 20 54 61 6b 65 20 61 70 70 72 6f 70 72 69 61  * Take appropria
d6f0: 74 65 20 61 63 74 69 6f 6e 0a 20 20 2a 2f 0a 20  te action.  */. 
d700: 20 69 66 28 20 28 73 74 61 74 62 75 66 2e 73 74   if( (statbuf.st
d710: 5f 6d 6f 64 65 20 26 20 30 31 30 30 29 3d 3d 30  _mode & 0100)==0
d720: 31 30 30 20 26 26 20 61 63 63 65 73 73 28 7a 46  100 && access(zF
d730: 69 6c 65 2c 58 5f 4f 4b 29 3d 3d 30 20 29 7b 0a  ile,X_OK)==0 ){.
d740: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68      /*.    ** Th
d750: 65 20 66 6f 6c 6c 6f 77 69 6e 67 73 20 73 74 61  e followings sta
d760: 74 69 63 20 76 61 72 69 61 62 6c 65 73 20 61 72  tic variables ar
d770: 65 20 75 73 65 64 20 74 6f 20 73 65 74 75 70 20  e used to setup 
d780: 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 0a  the environment.
d790: 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 43      ** for the C
d7a0: 47 49 20 73 63 72 69 70 74 0a 20 20 20 20 2a 2f  GI script.    */
d7b0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72  .    static char
d7c0: 20 2a 64 65 66 61 75 6c 74 5f 70 61 74 68 20 3d   *default_path =
d7d0: 20 22 2f 62 69 6e 3a 2f 75 73 72 2f 62 69 6e 22   "/bin:/usr/bin"
d7e0: 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 68 61  ;.    static cha
d7f0: 72 20 2a 67 61 74 65 77 61 79 5f 69 6e 74 65 72  r *gateway_inter
d800: 66 61 63 65 20 3d 20 22 43 47 49 2f 31 2e 30 22  face = "CGI/1.0"
d810: 3b 0a 20 20 20 20 73 74 61 74 69 63 20 73 74 72  ;.    static str
d820: 75 63 74 20 7b 0a 20 20 20 20 20 20 63 68 61 72  uct {.      char
d830: 20 2a 7a 45 6e 76 4e 61 6d 65 3b 0a 20 20 20 20   *zEnvName;.    
d840: 20 20 63 68 61 72 20 2a 2a 70 7a 45 6e 76 56 61    char **pzEnvVa
d850: 6c 75 65 3b 0a 20 20 20 20 7d 20 63 67 69 65 6e  lue;.    } cgien
d860: 76 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  v[] = {.      { 
d870: 22 41 55 54 48 5f 54 59 50 45 22 2c 20 20 20 20  "AUTH_TYPE",    
d880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
d890: 7a 41 75 74 68 54 79 70 65 20 7d 2c 0a 20 20 20  zAuthType },.   
d8a0: 20 20 20 7b 20 22 41 55 54 48 5f 43 4f 4e 54 45     { "AUTH_CONTE
d8b0: 4e 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  NT",            
d8c0: 20 20 20 20 26 7a 41 75 74 68 41 72 67 20 7d 2c      &zAuthArg },
d8d0: 0a 20 20 20 20 20 20 7b 20 22 43 4f 4e 54 45 4e  .      { "CONTEN
d8e0: 54 5f 4c 45 4e 47 54 48 22 2c 20 20 20 20 20 20  T_LENGTH",      
d8f0: 20 20 20 20 20 20 20 20 26 7a 43 6f 6e 74 65 6e          &zConten
d900: 74 4c 65 6e 67 74 68 20 7d 2c 0a 20 20 20 20 20  tLength },.     
d910: 20 7b 20 22 43 4f 4e 54 45 4e 54 5f 54 59 50 45   { "CONTENT_TYPE
d920: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
d930: 20 20 26 7a 43 6f 6e 74 65 6e 74 54 79 70 65 20    &zContentType 
d940: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 44 4f 43 55  },.      { "DOCU
d950: 4d 45 4e 54 5f 52 4f 4f 54 22 2c 20 20 20 20 20  MENT_ROOT",     
d960: 20 20 20 20 20 20 20 20 20 20 26 7a 48 6f 6d 65            &zHome
d970: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 47 41 54   },.      { "GAT
d980: 45 57 41 59 5f 49 4e 54 45 52 46 41 43 45 22 2c  EWAY_INTERFACE",
d990: 20 20 20 20 20 20 20 20 20 20 20 26 67 61 74 65             &gate
d9a0: 77 61 79 5f 69 6e 74 65 72 66 61 63 65 20 7d 2c  way_interface },
d9b0: 0a 20 20 20 20 20 20 7b 20 22 48 54 54 50 5f 41  .      { "HTTP_A
d9c0: 43 43 45 50 54 22 2c 20 20 20 20 20 20 20 20 20  CCEPT",         
d9d0: 20 20 20 20 20 20 20 20 26 7a 41 63 63 65 70 74          &zAccept
d9e0: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 48 54 54   },.      { "HTT
d9f0: 50 5f 41 43 43 45 50 54 5f 45 4e 43 4f 44 49 4e  P_ACCEPT_ENCODIN
da00: 47 22 2c 20 20 20 20 20 20 20 20 26 7a 41 63 63  G",        &zAcc
da10: 65 70 74 45 6e 63 6f 64 69 6e 67 20 7d 2c 0a 20  eptEncoding },. 
da20: 20 20 20 20 20 7b 20 22 48 54 54 50 5f 43 4f 4f       { "HTTP_COO
da30: 4b 49 45 22 2c 20 20 20 20 20 20 20 20 20 20 20  KIE",           
da40: 20 20 20 20 20 20 26 7a 43 6f 6f 6b 69 65 20 7d        &zCookie }
da50: 2c 0a 20 20 20 20 20 20 7b 20 22 48 54 54 50 5f  ,.      { "HTTP_
da60: 48 4f 53 54 22 2c 20 20 20 20 20 20 20 20 20 20  HOST",          
da70: 20 20 20 20 20 20 20 20 20 26 7a 48 74 74 70 48           &zHttpH
da80: 6f 73 74 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  ost },.      { "
da90: 48 54 54 50 5f 49 46 5f 4e 4f 4e 45 5f 4d 41 54  HTTP_IF_NONE_MAT
daa0: 43 48 22 2c 20 20 20 20 20 20 20 20 20 20 26 7a  CH",          &z
dab0: 49 66 4e 6f 6e 65 4d 61 74 63 68 20 7d 2c 0a 20  IfNoneMatch },. 
dac0: 20 20 20 20 20 7b 20 22 48 54 54 50 5f 52 45 46       { "HTTP_REF
dad0: 45 52 45 52 22 2c 20 20 20 20 20 20 20 20 20 20  ERER",          
dae0: 20 20 20 20 20 20 26 7a 52 65 66 65 72 65 72 20        &zReferer 
daf0: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 48 54 54 50  },.      { "HTTP
db00: 5f 55 53 45 52 5f 41 47 45 4e 54 22 2c 20 20 20  _USER_AGENT",   
db10: 20 20 20 20 20 20 20 20 20 20 26 7a 41 67 65 6e            &zAgen
db20: 74 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 50 41  t },.      { "PA
db30: 54 48 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  TH",            
db40: 20 20 20 20 20 20 20 20 20 20 20 20 26 64 65 66              &def
db50: 61 75 6c 74 5f 70 61 74 68 20 7d 2c 0a 20 20 20  ault_path },.   
db60: 20 20 20 7b 20 22 50 41 54 48 5f 49 4e 46 4f 22     { "PATH_INFO"
db70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
db80: 20 20 20 20 26 7a 50 61 74 68 49 6e 66 6f 20 7d      &zPathInfo }
db90: 2c 0a 20 20 20 20 20 20 7b 20 22 51 55 45 52 59  ,.      { "QUERY
dba0: 5f 53 54 52 49 4e 47 22 2c 20 20 20 20 20 20 20  _STRING",       
dbb0: 20 20 20 20 20 20 20 20 20 26 7a 51 75 65 72 79           &zQuery
dbc0: 53 74 72 69 6e 67 20 7d 2c 0a 20 20 20 20 20 20  String },.      
dbd0: 7b 20 22 52 45 4d 4f 54 45 5f 41 44 44 52 22 2c  { "REMOTE_ADDR",
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbf0: 20 26 7a 52 65 6d 6f 74 65 41 64 64 72 20 7d 2c   &zRemoteAddr },
dc00: 0a 20 20 20 20 20 20 7b 20 22 52 45 51 55 45 53  .      { "REQUES
dc10: 54 5f 4d 45 54 48 4f 44 22 2c 20 20 20 20 20 20  T_METHOD",      
dc20: 20 20 20 20 20 20 20 20 26 7a 4d 65 74 68 6f 64          &zMethod
dc30: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 52 45 51   },.      { "REQ
dc40: 55 45 53 54 5f 55 52 49 22 2c 20 20 20 20 20 20  UEST_URI",      
dc50: 20 20 20 20 20 20 20 20 20 20 20 26 7a 53 63 72             &zScr
dc60: 69 70 74 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  ipt },.      { "
dc70: 52 45 4d 4f 54 45 5f 55 53 45 52 22 2c 20 20 20  REMOTE_USER",   
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
dc90: 52 65 6d 6f 74 65 55 73 65 72 20 7d 2c 0a 20 20  RemoteUser },.  
dca0: 20 20 20 20 7b 20 22 53 43 52 49 50 54 5f 44 49      { "SCRIPT_DI
dcb0: 52 45 43 54 4f 52 59 22 2c 20 20 20 20 20 20 20  RECTORY",       
dcc0: 20 20 20 20 20 26 7a 44 69 72 20 7d 2c 0a 20 20       &zDir },.  
dcd0: 20 20 20 20 7b 20 22 53 43 52 49 50 54 5f 46 49      { "SCRIPT_FI
dce0: 4c 45 4e 41 4d 45 22 2c 20 20 20 20 20 20 20 20  LENAME",        
dcf0: 20 20 20 20 20 26 7a 46 69 6c 65 20 7d 2c 0a 20       &zFile },. 
dd00: 20 20 20 20 20 7b 20 22 53 43 52 49 50 54 5f 4e       { "SCRIPT_N
dd10: 41 4d 45 22 2c 20 20 20 20 20 20 20 20 20 20 20  AME",           
dd20: 20 20 20 20 20 20 26 7a 52 65 61 6c 53 63 72 69        &zRealScri
dd30: 70 74 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  pt },.      { "S
dd40: 45 52 56 45 52 5f 4e 41 4d 45 22 2c 20 20 20 20  ERVER_NAME",    
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 53               &zS
dd60: 65 72 76 65 72 4e 61 6d 65 20 7d 2c 0a 20 20 20  erverName },.   
dd70: 20 20 20 7b 20 22 53 45 52 56 45 52 5f 50 4f 52     { "SERVER_POR
dd80: 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  T",             
dd90: 20 20 20 20 26 7a 53 65 72 76 65 72 50 6f 72 74      &zServerPort
dda0: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 45 52   },.      { "SER
ddb0: 56 45 52 5f 50 52 4f 54 4f 43 4f 4c 22 2c 20 20  VER_PROTOCOL",  
ddc0: 20 20 20 20 20 20 20 20 20 20 20 26 7a 50 72 6f             &zPro
ddd0: 74 6f 63 6f 6c 20 7d 2c 0a 20 20 20 20 7d 3b 0a  tocol },.    };.
dde0: 20 20 20 20 63 68 61 72 20 2a 7a 42 61 73 65 46      char *zBaseF
ddf0: 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
de00: 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 77 69 74   /* Filename wit
de10: 68 6f 75 74 20 64 69 72 65 63 74 6f 72 79 20 70  hout directory p
de20: 72 65 66 69 78 20 2a 2f 0a 20 20 20 20 69 6e 74  refix */.    int
de30: 20 73 65 65 6e 43 6f 6e 74 65 6e 74 4c 65 6e 67   seenContentLeng
de40: 74 68 20 3d 20 30 3b 20 20 20 2f 2a 20 54 72 75  th = 0;   /* Tru
de50: 65 20 69 66 20 43 6f 6e 74 65 6e 74 2d 6c 65 6e  e if Content-len
de60: 67 74 68 3a 20 68 65 61 64 65 72 20 73 65 65 6e  gth: header seen
de70: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 73   */.    int nRes
de80: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
de90: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
dea0: 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 20 20   payload */.    
deb0: 69 6e 74 20 6e 4d 61 6c 6c 6f 63 20 3d 20 30 3b  int nMalloc = 0;
dec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ded0: 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  Bytes of space a
dee0: 6c 6c 6f 63 61 74 65 64 20 74 6f 20 61 52 65 73  llocated to aRes
def0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 61 52   */.    char *aR
df00: 65 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  es = 0;         
df10: 20 20 20 20 20 2f 2a 20 50 61 79 6c 6f 61 64 20       /* Payload 
df20: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 69 74  */..    /* If it
df30: 73 20 65 78 65 63 75 74 61 62 6c 65 2c 20 69 74  s executable, it
df40: 20 6d 75 73 74 20 62 65 20 61 20 43 47 49 20 70   must be a CGI p
df50: 72 6f 67 72 61 6d 2e 20 20 53 74 61 72 74 20 62  rogram.  Start b
df60: 79 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67 69 6e  y.    ** changin
df70: 67 20 64 69 72 65 63 74 6f 72 69 65 73 20 74 6f  g directories to
df80: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 68   the directory h
df90: 6f 6c 64 69 6e 67 20 74 68 65 20 70 72 6f 67 72  olding the progr
dfa0: 61 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  am..    */.    i
dfb0: 66 28 20 63 68 64 69 72 28 7a 44 69 72 29 20 29  f( chdir(zDir) )
dfc0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 42 75  {.      char zBu
dfd0: 66 5b 31 30 30 30 5d 3b 0a 20 20 20 20 20 20 4d  f[1000];.      M
dfe0: 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e  alfunction(__LIN
dff0: 45 5f 5f 2c 20 2f 2a 20 4c 4f 47 3a 20 63 68 64  E__, /* LOG: chd
e000: 69 72 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20  ir() failed */. 
e010: 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f            "canno
e020: 74 20 63 68 64 69 72 20 74 6f 20 5b 25 73 5d 20  t chdir to [%s] 
e030: 66 72 6f 6d 20 5b 25 73 5d 22 2c 20 0a 20 20 20  from [%s]", .   
e040: 20 20 20 20 20 20 20 20 7a 44 69 72 2c 20 67 65          zDir, ge
e050: 74 63 77 64 28 7a 42 75 66 2c 39 39 39 29 29 3b  tcwd(zBuf,999));
e060: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
e070: 65 74 75 70 20 74 68 65 20 65 6e 76 69 72 6f 6e  etup the environ
e080: 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65  ment appropriate
e090: 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ly..    */.    f
e0a0: 6f 72 28 69 3d 30 3b 20 69 3c 28 69 6e 74 29 28  or(i=0; i<(int)(
e0b0: 73 69 7a 65 6f 66 28 63 67 69 65 6e 76 29 2f 73  sizeof(cgienv)/s
e0c0: 69 7a 65 6f 66 28 63 67 69 65 6e 76 5b 30 5d 29  izeof(cgienv[0])
e0d0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
e0e0: 66 28 20 2a 63 67 69 65 6e 76 5b 69 5d 2e 70 7a  f( *cgienv[i].pz
e0f0: 45 6e 76 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  EnvValue ){.    
e100: 20 20 20 20 53 65 74 45 6e 76 28 63 67 69 65 6e      SetEnv(cgien
e110: 76 5b 69 5d 2e 7a 45 6e 76 4e 61 6d 65 2c 2a 63  v[i].zEnvName,*c
e120: 67 69 65 6e 76 5b 69 5d 2e 70 7a 45 6e 76 56 61  gienv[i].pzEnvVa
e130: 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lue);.      }.  
e140: 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65 48    }.    if( useH
e150: 74 74 70 73 20 29 7b 0a 20 20 20 20 20 20 70 75  ttps ){.      pu
e160: 74 65 6e 76 28 22 48 54 54 50 53 3d 6f 6e 22 29  tenv("HTTPS=on")
e170: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
e180: 20 20 20 20 2a 2a 20 41 62 6f 72 74 20 77 69 74      ** Abort wit
e190: 68 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68  h an error if th
e1a0: 65 20 43 47 49 20 73 63 72 69 70 74 20 69 73 20  e CGI script is 
e1b0: 77 72 69 74 61 62 6c 65 20 62 79 20 61 6e 79 6f  writable by anyo
e1c0: 6e 65 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20  ne other.    ** 
e1d0: 74 68 61 6e 20 69 74 73 20 6f 77 6e 65 72 2e 0a  than its owner..
e1e0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
e1f0: 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 20 26  tatbuf.st_mode &
e200: 20 30 30 32 32 20 29 7b 0a 20 20 20 20 20 20 43   0022 ){.      C
e210: 67 69 53 63 72 69 70 74 57 72 69 74 61 62 6c 65  giScriptWritable
e220: 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ();.    }..    /
e230: 2a 20 46 6f 72 20 74 68 65 20 50 4f 53 54 20 6d  * For the POST m
e240: 65 74 68 6f 64 20 61 6c 6c 20 69 6e 70 75 74 20  ethod all input 
e250: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
e260: 20 74 6f 20 61 20 74 65 6d 70 6f 72 61 72 79 20   to a temporary 
e270: 66 69 6c 65 2c 0a 20 20 20 20 2a 2a 20 73 6f 20  file,.    ** so 
e280: 77 65 20 68 61 76 65 20 74 6f 20 72 65 64 69 72  we have to redir
e290: 65 63 74 20 69 6e 70 75 74 20 74 6f 20 74 68 65  ect input to the
e2a0: 20 43 47 49 20 73 63 72 69 70 74 20 66 72 6f 6d   CGI script from
e2b0: 20 74 68 61 74 20 66 69 6c 65 2e 0a 20 20 20 20   that file..    
e2c0: 2a 2f 0a 20 20 20 20 69 66 28 20 7a 4d 65 74 68  */.    if( zMeth
e2d0: 6f 64 5b 30 5d 3d 3d 27 50 27 20 29 7b 0a 20 20  od[0]=='P' ){.  
e2e0: 20 20 20 20 69 66 28 20 64 75 70 28 30 29 3c 30      if( dup(0)<0
e2f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 61 6c 66   ){.        Malf
e300: 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f  unction(__LINE__
e310: 2c 20 20 2f 2a 20 4c 4f 47 3a 20 64 75 70 28 29  ,  /* LOG: dup()
e320: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
e330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
e340: 55 6e 61 62 6c 65 20 74 6f 20 64 75 70 6c 69 63  Unable to duplic
e350: 61 74 69 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  ation file descr
e360: 69 70 74 6f 72 20 30 22 29 3b 0a 20 20 20 20 20  iptor 0");.     
e370: 20 7d 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 30   }.      close(0
e380: 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e 28 7a 54  );.      open(zT
e390: 6d 70 4e 61 6d 2c 20 4f 5f 52 44 4f 4e 4c 59 29  mpNam, O_RDONLY)
e3a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  ;.    }..    for
e3b0: 28 69 3d 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29  (i=strlen(zFile)
e3c0: 2d 31 3b 20 69 3e 3d 30 20 26 26 20 7a 46 69 6c  -1; i>=0 && zFil
e3d0: 65 5b 69 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b  e[i]!='/'; i--){
e3e0: 7d 0a 20 20 20 20 7a 42 61 73 65 46 69 6c 65 6e  }.    zBaseFilen
e3f0: 61 6d 65 20 3d 20 26 7a 46 69 6c 65 5b 69 2b 31  ame = &zFile[i+1
e400: 5d 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 30 20  ];.    if( i>=0 
e410: 26 26 20 73 74 72 6e 63 6d 70 28 7a 42 61 73 65  && strncmp(zBase
e420: 46 69 6c 65 6e 61 6d 65 2c 22 6e 70 68 2d 22 2c  Filename,"nph-",
e430: 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  4)==0 ){.      /
e440: 2a 20 49 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  * If the name of
e450: 20 74 68 65 20 43 47 49 20 73 63 72 69 70 74 20   the CGI script 
e460: 62 65 67 69 6e 73 20 77 69 74 68 20 22 6e 70 68  begins with "nph
e470: 2d 22 20 74 68 65 6e 20 77 65 20 61 72 65 0a 20  -" then we are. 
e480: 20 20 20 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20       ** dealing 
e490: 77 69 74 68 20 61 20 22 6e 6f 6e 2d 70 61 72 73  with a "non-pars
e4a0: 65 64 20 68 65 61 64 65 72 73 22 20 43 47 49 20  ed headers" CGI 
e4b0: 73 63 72 69 70 74 2e 20 20 4a 75 73 74 20 65 78  script.  Just ex
e4c0: 65 63 28 29 0a 20 20 20 20 20 20 2a 2a 20 69 74  ec().      ** it
e4d0: 20 64 69 72 65 63 74 6c 79 20 61 6e 64 20 6c 65   directly and le
e4e0: 74 20 69 74 20 68 61 6e 64 6c 65 20 61 6c 6c 20  t it handle all 
e4f0: 69 74 73 20 6f 77 6e 20 68 65 61 64 65 72 20 67  its own header g
e500: 65 6e 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 20  eneration..     
e510: 20 2a 2f 0a 20 20 20 20 20 20 65 78 65 63 6c 28   */.      execl(
e520: 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c 7a 42  zBaseFilename,zB
e530: 61 73 65 46 69 6c 65 6e 61 6d 65 2c 28 63 68 61  aseFilename,(cha
e540: 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20  r*)0);.      /* 
e550: 4e 4f 54 45 3a 20 4e 6f 20 6c 6f 67 20 65 6e 74  NOTE: No log ent
e560: 72 79 20 77 72 69 74 74 65 6e 20 66 6f 72 20 6e  ry written for n
e570: 70 68 2d 20 73 63 72 69 70 74 73 20 2a 2f 0a 20  ph- scripts */. 
e580: 20 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20       exit(0);.  
e590: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 61 6c 6c    }..    /* Fall
e5a0: 20 74 68 72 75 20 74 6f 20 68 65 72 65 20 6f 6e   thru to here on
e5b0: 6c 79 20 69 66 20 74 68 69 73 20 70 72 6f 63 65  ly if this proce
e5c0: 73 73 20 28 74 68 65 20 73 65 72 76 65 72 29 20  ss (the server) 
e5d0: 69 73 20 67 6f 69 6e 67 0a 20 20 20 20 2a 2a 20  is going.    ** 
e5e0: 74 6f 20 72 65 61 64 20 61 6e 64 20 61 75 67 6d  to read and augm
e5f0: 65 6e 74 20 74 68 65 20 68 65 61 64 65 72 20 73  ent the header s
e600: 65 6e 74 20 62 61 63 6b 20 62 79 20 74 68 65 20  ent back by the 
e610: 43 47 49 20 70 72 6f 63 65 73 73 2e 0a 20 20 20  CGI process..   
e620: 20 2a 2a 20 4f 70 65 6e 20 61 20 70 69 70 65 20   ** Open a pipe 
e630: 74 6f 20 72 65 63 65 69 76 65 20 74 68 65 20 6f  to receive the o
e640: 75 74 70 75 74 20 66 72 6f 6d 20 74 68 65 20 43  utput from the C
e650: 47 49 20 70 72 6f 63 65 73 73 2e 20 20 54 68 65  GI process.  The
e660: 6e 0a 20 20 20 20 2a 2a 20 66 6f 72 6b 20 74 68  n.    ** fork th
e670: 65 20 43 47 49 20 70 72 6f 63 65 73 73 2e 20 20  e CGI process.  
e680: 4f 6e 63 65 20 65 76 65 72 79 74 68 69 6e 67 20  Once everything 
e690: 69 73 20 64 6f 6e 65 2c 20 77 65 20 73 68 6f 75  is done, we shou
e6a0: 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 61 62 6c  ld be.    ** abl
e6b0: 65 20 74 6f 20 72 65 61 64 20 74 68 65 20 6f 75  e to read the ou
e6c0: 74 70 75 74 20 6f 66 20 43 47 49 20 6f 6e 20 74  tput of CGI on t
e6d0: 68 65 20 22 69 6e 22 20 73 74 72 65 61 6d 2e 0a  he "in" stream..
e6e0: 20 20 20 20 2a 2f 0a 20 20 20 20 7b 0a 20 20 20      */.    {.   
e6f0: 20 20 20 69 6e 74 20 70 78 5b 32 5d 3b 0a 20 20     int px[2];.  
e700: 20 20 20 20 69 66 28 20 70 69 70 65 28 70 78 29      if( pipe(px)
e710: 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 61 6c 66   ){.        Malf
e720: 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f  unction(__LINE__
e730: 2c 20 2f 2a 20 4c 4f 47 3a 20 70 69 70 65 28 29  , /* LOG: pipe()
e740: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
e750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
e760: 55 6e 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65  Unable to create
e770: 20 61 20 70 69 70 65 20 66 6f 72 20 74 68 65 20   a pipe for the 
e780: 43 47 49 20 70 72 6f 67 72 61 6d 22 29 3b 0a 20  CGI program");. 
e790: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
e7a0: 20 66 6f 72 6b 28 29 3d 3d 30 20 29 7b 0a 20 20   fork()==0 ){.  
e7b0: 20 20 20 20 20 20 63 6c 6f 73 65 28 70 78 5b 30        close(px[0
e7c0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73  ]);.        clos
e7d0: 65 28 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  e(1);.        if
e7e0: 28 20 64 75 70 28 70 78 5b 31 5d 29 21 3d 31 20  ( dup(px[1])!=1 
e7f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 4d 61 6c  ){.          Mal
e800: 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f  function(__LINE_
e810: 5f 2c 20 2f 2a 20 4c 4f 47 3a 20 64 75 70 28 29  _, /* LOG: dup()
e820: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
e830: 20 20 20 20 20 20 20 20 20 20 20 20 22 55 6e 61              "Una
e840: 62 6c 65 20 74 6f 20 64 75 70 6c 69 63 61 74 65  ble to duplicate
e850: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
e860: 20 25 64 20 74 6f 20 31 22 2c 0a 20 20 20 20 20   %d to 1",.     
e870: 20 20 20 20 20 20 20 20 20 20 20 20 70 78 5b 31              px[1
e880: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
e890: 20 20 20 20 20 20 63 6c 6f 73 65 28 70 78 5b 31        close(px[1
e8a0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 65 78 65 63  ]);.        exec
e8b0: 6c 28 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c  l(zBaseFilename,
e8c0: 20 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c 20   zBaseFilename, 
e8d0: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
e8e0: 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20 20 20     exit(0);.    
e8f0: 20 20 7d 0a 20 20 20 20 20 20 63 6c 6f 73 65 28    }.      close(
e900: 70 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 6e  px[1]);.      in
e910: 20 3d 20 66 64 6f 70 65 6e 28 70 78 5b 30 5d 2c   = fdopen(px[0],
e920: 20 22 72 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20   "r");.    }.   
e930: 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20   if( in==0 ){.  
e940: 20 20 20 20 43 67 69 45 72 72 6f 72 28 29 3b 0a      CgiError();.
e950: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
e960: 61 64 20 61 6e 64 20 70 72 6f 63 65 73 73 20 74  ad and process t
e970: 68 65 20 66 69 72 73 74 20 6c 69 6e 65 20 6f 66  he first line of
e980: 20 74 68 65 20 68 65 61 64 65 72 20 72 65 74 75   the header retu
e990: 72 6e 65 64 20 62 79 20 74 68 65 0a 20 20 20 20  rned by the.    
e9a0: 2a 2a 20 43 47 49 20 73 63 72 69 70 74 2e 0a 20  ** CGI script.. 
e9b0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73     */.    if( us
e9c0: 65 54 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d  eTimeout ) alarm
e9d0: 28 31 35 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  (15);.    while(
e9e0: 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 73 69 7a   fgets(zLine,siz
e9f0: 65 6f 66 28 7a 4c 69 6e 65 29 2c 69 6e 29 20 26  eof(zLine),in) &
ea00: 26 20 21 69 73 73 70 61 63 65 28 7a 4c 69 6e 65  & !isspace(zLine
ea10: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 69 66  [0]) ){.      if
ea20: 28 20 73 74 72 6e 63 61 73 65 63 6d 70 28 7a 4c  ( strncasecmp(zL
ea30: 69 6e 65 2c 22 4c 6f 63 61 74 69 6f 6e 3a 22 2c  ine,"Location:",
ea40: 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  9)==0 ){.       
ea50: 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22   StartResponse("
ea60: 33 30 32 20 52 65 64 69 72 65 63 74 22 29 3b 0a  302 Redirect");.
ea70: 20 20 20 20 20 20 20 20 52 65 6d 6f 76 65 4e 65          RemoveNe
ea80: 77 6c 69 6e 65 28 7a 4c 69 6e 65 29 3b 0a 20 20  wline(zLine);.  
ea90: 20 20 20 20 20 20 7a 20 3d 20 26 7a 4c 69 6e 65        z = &zLine
eaa0: 5b 31 30 5d 3b 0a 20 20 20 20 20 20 20 20 77 68  [10];.        wh
eab0: 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 7a 29  ile( isspace(*z)
eac0: 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20   ){ z++; }.     
ead0: 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74     nOut += print
eae0: 66 28 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73 5c  f("Location: %s\
eaf0: 72 5c 6e 22 2c 7a 29 3b 0a 20 20 20 20 20 20 7d  r\n",z);.      }
eb00: 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 61 73  else if( strncas
eb10: 65 63 6d 70 28 7a 4c 69 6e 65 2c 22 53 74 61 74  ecmp(zLine,"Stat
eb20: 75 73 3a 22 2c 37 29 3d 3d 30 20 29 7b 0a 20 20  us:",7)==0 ){.  
eb30: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
eb40: 20 20 20 20 20 66 6f 72 28 69 3d 37 3b 20 69 73       for(i=7; is
eb50: 73 70 61 63 65 28 7a 4c 69 6e 65 5b 69 5d 29 3b  space(zLine[i]);
eb60: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   i++){}.        
eb70: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22  nOut += printf("
eb80: 25 73 20 25 73 22 2c 20 7a 50 72 6f 74 6f 63 6f  %s %s", zProtoco
eb90: 6c 2c 20 26 7a 4c 69 6e 65 5b 69 5d 29 3b 0a 20  l, &zLine[i]);. 
eba0: 20 20 20 20 20 20 20 73 74 72 6e 63 70 79 28 7a         strncpy(z
ebb0: 52 65 70 6c 79 53 74 61 74 75 73 2c 20 26 7a 4c  ReplyStatus, &zL
ebc0: 69 6e 65 5b 69 5d 2c 20 33 29 3b 0a 20 20 20 20  ine[i], 3);.    
ebd0: 20 20 20 20 7a 52 65 70 6c 79 53 74 61 74 75 73      zReplyStatus
ebe0: 5b 33 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  [3] = 0;.       
ebf0: 20 73 74 61 74 75 73 53 65 6e 74 20 3d 20 31 3b   statusSent = 1;
ec00: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ec10: 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 61        if( strnca
ec20: 73 65 63 6d 70 28 7a 4c 69 6e 65 2c 20 22 43 6f  secmp(zLine, "Co
ec30: 6e 74 65 6e 74 2d 6c 65 6e 67 74 68 3a 22 2c 20  ntent-length:", 
ec40: 31 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  14)==0 ){.      
ec50: 20 20 20 20 73 65 65 6e 43 6f 6e 74 65 6e 74 4c      seenContentL
ec60: 65 6e 67 74 68 20 3d 20 31 3b 0a 20 20 20 20 20  ength = 1;.     
ec70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 53 74 61     }.        Sta
ec80: 72 74 52 65 73 70 6f 6e 73 65 28 22 32 30 30 20  rtResponse("200 
ec90: 4f 4b 22 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f  OK");.        nO
eca0: 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 25 73  ut += printf("%s
ecb0: 22 2c 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  ",zLine);.      
ecc0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
ecd0: 43 6f 70 79 20 65 76 65 72 79 74 68 69 6e 67 20  Copy everything 
ece0: 65 6c 73 65 20 74 68 72 75 20 77 69 74 68 6f 75  else thru withou
ecf0: 74 20 63 68 61 6e 67 65 20 6f 72 20 61 6e 61 6c  t change or anal
ed00: 79 73 69 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ysis..    */.   
ed10: 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22   StartResponse("
ed20: 32 30 30 20 4f 4b 22 29 3b 0a 20 20 20 20 69 66  200 OK");.    if
ed30: 28 20 75 73 65 54 69 6d 65 6f 75 74 20 29 20 61  ( useTimeout ) a
ed40: 6c 61 72 6d 28 36 30 2a 35 29 3b 0a 20 20 20 20  larm(60*5);.    
ed50: 69 66 28 20 73 65 65 6e 43 6f 6e 74 65 6e 74 4c  if( seenContentL
ed60: 65 6e 67 74 68 20 29 7b 0a 20 20 20 20 20 20 6e  ength ){.      n
ed70: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 25  Out += printf("%
ed80: 73 22 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  s", zLine);.    
ed90: 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 67 65    while( (c = ge
eda0: 74 63 28 69 6e 29 29 21 3d 45 4f 46 20 29 7b 0a  tc(in))!=EOF ){.
edb0: 20 20 20 20 20 20 20 20 70 75 74 63 28 63 2c 73          putc(c,s
edc0: 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  tdout);.        
edd0: 6e 4f 75 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  nOut++;.      }.
ede0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
edf0: 20 6e 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20   nRes = 0;.     
ee00: 20 6e 4d 61 6c 6c 6f 63 20 3d 20 31 30 30 30 3b   nMalloc = 1000;
ee10: 0a 20 20 20 20 20 20 61 52 65 73 20 3d 20 6d 61  .      aRes = ma
ee20: 6c 6c 6f 63 28 6e 4d 61 6c 6c 6f 63 2b 31 29 3b  lloc(nMalloc+1);
ee30: 0a 20 20 20 20 20 20 69 66 28 20 61 52 65 73 3d  .      if( aRes=
ee40: 3d 30 20 29 20 4d 61 6c 66 75 6e 63 74 69 6f 6e  =0 ) Malfunction
ee50: 28 5f 5f 4c 49 4e 45 5f 5f 2c 22 4f 75 74 20 6f  (__LINE__,"Out o
ee60: 66 20 6d 65 6d 6f 72 79 3a 20 25 64 20 62 79 74  f memory: %d byt
ee70: 65 73 22 2c 20 6e 4d 61 6c 6c 6f 63 29 3b 0a 20  es", nMalloc);. 
ee80: 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d       while( (c =
ee90: 20 67 65 74 63 28 69 6e 29 29 21 3d 45 4f 46 20   getc(in))!=EOF 
eea0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
eeb0: 52 65 73 3e 3d 6e 4d 61 6c 6c 6f 63 20 29 7b 0a  Res>=nMalloc ){.
eec0: 20 20 20 20 20 20 20 20 20 20 6e 4d 61 6c 6c 6f            nMallo
eed0: 63 20 3d 20 6e 4d 61 6c 6c 6f 63 2a 32 3b 0a 20  c = nMalloc*2;. 
eee0: 20 20 20 20 20 20 20 20 20 61 52 65 73 20 3d 20           aRes = 
eef0: 72 65 61 6c 6c 6f 63 28 61 52 65 73 2c 20 6e 4d  realloc(aRes, nM
ef00: 61 6c 6c 6f 63 2b 31 29 3b 0a 20 20 20 20 20 20  alloc+1);.      
ef10: 20 20 20 20 69 66 28 20 61 52 65 73 3d 3d 30 20      if( aRes==0 
ef20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
ef30: 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49  Malfunction(__LI
ef40: 4e 45 5f 5f 2c 20 22 4f 75 74 20 6f 66 20 6d 65  NE__, "Out of me
ef50: 6d 6f 72 79 3a 20 25 64 20 62 79 74 65 73 22 2c  mory: %d bytes",
ef60: 20 6e 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20   nMalloc);.     
ef70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
ef80: 0a 20 20 20 20 20 20 20 20 61 52 65 73 5b 6e 52  .        aRes[nR
ef90: 65 73 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20  es++] = c;.     
efa0: 20 7d 0a 20 20 20 20 20 20 61 52 65 73 5b 6e 52   }.      aRes[nR
efb0: 65 73 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e  es] = 0;.      n
efc0: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 43  Out += printf("C
efd0: 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74 68 3a 20 25  ontent-length: %
efe0: 64 5c 72 5c 6e 5c 72 5c 6e 25 73 22 2c 20 6e 52  d\r\n\r\n%s", nR
eff0: 65 73 2c 20 61 52 65 73 29 3b 0a 20 20 20 20 20  es, aRes);.     
f000: 20 66 72 65 65 28 61 52 65 73 29 3b 0a 20 20 20   free(aRes);.   
f010: 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e   }.    fclose(in
f020: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63  );.  }else if( c
f030: 6f 75 6e 74 53 6c 61 73 68 65 73 28 7a 52 65 61  ountSlashes(zRea
f040: 6c 53 63 72 69 70 74 29 21 3d 63 6f 75 6e 74 53  lScript)!=countS
f050: 6c 61 73 68 65 73 28 7a 53 63 72 69 70 74 29 20  lashes(zScript) 
f060: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
f070: 20 72 65 71 75 65 73 74 20 55 52 49 20 66 6f 72   request URI for
f080: 20 73 74 61 74 69 63 20 63 6f 6e 74 65 6e 74 20   static content 
f090: 63 6f 6e 74 61 69 6e 73 20 6d 61 74 65 72 69 61  contains materia
f0a0: 6c 20 70 61 73 74 20 74 68 65 0a 20 20 20 20 2a  l past the.    *
f0b0: 2a 20 61 63 74 75 61 6c 20 63 6f 6e 74 65 6e 74  * actual content
f0c0: 20 66 69 6c 65 20 6e 61 6d 65 2c 20 72 65 70 6f   file name, repo
f0d0: 72 74 20 74 68 61 74 20 61 73 20 61 20 34 30 34  rt that as a 404
f0e0: 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 4e   error. */.    N
f0f0: 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f  otFound(__LINE__
f100: 29 3b 20 2f 2a 20 4c 4f 47 3a 20 45 78 63 65 73  ); /* LOG: Exces
f110: 73 20 55 52 49 20 63 6f 6e 74 65 6e 74 20 70 61  s URI content pa
f120: 73 74 20 73 74 61 74 69 63 20 66 69 6c 65 20 6e  st static file n
f130: 61 6d 65 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  ame */.  }else{.
f140: 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 6e      /* If it isn
f150: 27 74 20 65 78 65 63 75 74 61 62 6c 65 20 74 68  't executable th
f160: 65 6e 20 69 74 0a 20 20 20 20 2a 2a 20 6d 75 73  en it.    ** mus
f170: 74 20 61 20 73 69 6d 70 6c 65 20 66 69 6c 65 20  t a simple file 
f180: 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
f190: 20 63 6f 70 69 65 64 20 74 6f 20 6f 75 74 70 75   copied to outpu
f1a0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f  t..    */.    co
f1b0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65  nst char *zConte
f1c0: 6e 74 54 79 70 65 20 3d 20 47 65 74 4d 69 6d 65  ntType = GetMime
f1d0: 54 79 70 65 28 7a 46 69 6c 65 2c 20 6c 65 6e 46  Type(zFile, lenF
f1e0: 69 6c 65 29 3b 0a 20 20 20 20 63 68 61 72 20 7a  ile);.    char z
f1f0: 45 54 61 67 5b 31 30 30 5d 3b 0a 0a 20 20 20 20  ETag[100];..    
f200: 69 66 28 20 7a 54 6d 70 4e 61 6d 20 29 20 75 6e  if( zTmpNam ) un
f210: 6c 69 6e 6b 28 7a 54 6d 70 4e 61 6d 29 3b 0a 20  link(zTmpNam);. 
f220: 20 20 20 73 70 72 69 6e 74 66 28 7a 45 54 61 67     sprintf(zETag
f230: 2c 20 22 6d 25 78 73 25 78 22 2c 20 28 69 6e 74  , "m%xs%x", (int
f240: 29 73 74 61 74 62 75 66 2e 73 74 5f 6d 74 69 6d  )statbuf.st_mtim
f250: 65 2c 20 28 69 6e 74 29 73 74 61 74 62 75 66 2e  e, (int)statbuf.
f260: 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 69 66  st_size);.    if
f270: 28 20 43 6f 6d 70 61 72 65 45 74 61 67 73 28 7a  ( CompareEtags(z
f280: 49 66 4e 6f 6e 65 4d 61 74 63 68 2c 7a 45 54 61  IfNoneMatch,zETa
f290: 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53  g)==0 ){.      S
f2a0: 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 33 30  tartResponse("30
f2b0: 34 20 4e 6f 74 20 4d 6f 64 69 66 69 65 64 22 29  4 Not Modified")
f2c0: 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20  ;.      nOut += 
f2d0: 70 72 69 6e 74 66 28 22 43 61 63 68 65 2d 43 6f  printf("Cache-Co
f2e0: 6e 74 72 6f 6c 3a 20 6d 61 78 2d 61 67 65 3d 25  ntrol: max-age=%
f2f0: 64 5c 72 5c 6e 22 2c 20 6d 78 41 67 65 29 3b 0a  d\r\n", mxAge);.
f300: 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72        nOut += pr
f310: 69 6e 74 66 28 22 45 54 61 67 3a 20 5c 22 25 73  intf("ETag: \"%s
f320: 5c 22 5c 72 5c 6e 22 2c 20 7a 45 54 61 67 29 3b  \"\r\n", zETag);
f330: 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70  .      nOut += p
f340: 72 69 6e 74 66 28 22 5c 72 5c 6e 22 29 3b 0a 20  rintf("\r\n");. 
f350: 20 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f       fflush(stdo
f360: 75 74 29 3b 0a 20 20 20 20 20 20 4d 61 6b 65 4c  ut);.      MakeL
f370: 6f 67 45 6e 74 72 79 28 30 2c 20 5f 5f 4c 49 4e  ogEntry(0, __LIN
f380: 45 5f 5f 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 45  E__);  /* LOG: E
f390: 54 61 67 20 43 61 63 68 65 20 48 69 74 20 2a 2f  Tag Cache Hit */
f3a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
f3b0: 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d 20 66 6f     }.    in = fo
f3c0: 70 65 6e 28 7a 46 69 6c 65 2c 22 72 22 29 3b 0a  pen(zFile,"r");.
f3d0: 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20      if( in==0 ) 
f3e0: 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f  NotFound(__LINE_
f3f0: 5f 29 3b 20 2f 2a 20 4c 4f 47 3a 20 66 6f 70 65  _); /* LOG: fope
f400: 6e 28 29 20 66 61 69 6c 65 64 20 66 6f 72 20 73  n() failed for s
f410: 74 61 74 69 63 20 63 6f 6e 74 65 6e 74 20 2a 2f  tatic content */
f420: 0a 20 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e  .    StartRespon
f430: 73 65 28 22 32 30 30 20 4f 4b 22 29 3b 0a 20 20  se("200 OK");.  
f440: 20 20 6e 4f 75 74 20 2b 3d 20 44 61 74 65 54 61    nOut += DateTa
f450: 67 28 22 4c 61 73 74 2d 4d 6f 64 69 66 69 65 64  g("Last-Modified
f460: 22 2c 20 73 74 61 74 62 75 66 2e 73 74 5f 6d 74  ", statbuf.st_mt
f470: 69 6d 65 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b  ime);.    nOut +
f480: 3d 20 70 72 69 6e 74 66 28 22 43 61 63 68 65 2d  = printf("Cache-
f490: 43 6f 6e 74 72 6f 6c 3a 20 6d 61 78 2d 61 67 65  Control: max-age
f4a0: 3d 25 64 5c 72 5c 6e 22 2c 20 6d 78 41 67 65 29  =%d\r\n", mxAge)
f4b0: 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72  ;.    nOut += pr
f4c0: 69 6e 74 66 28 22 45 54 61 67 3a 20 5c 22 25 73  intf("ETag: \"%s
f4d0: 5c 22 5c 72 5c 6e 22 2c 20 7a 45 54 61 67 29 3b  \"\r\n", zETag);
f4e0: 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69  .    nOut += pri
f4f0: 6e 74 66 28 22 43 6f 6e 74 65 6e 74 2d 74 79 70  ntf("Content-typ
f500: 65 3a 20 25 73 5c 72 5c 6e 22 2c 7a 43 6f 6e 74  e: %s\r\n",zCont
f510: 65 6e 74 54 79 70 65 29 3b 0a 20 20 20 20 6e 4f  entType);.    nO
f520: 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f  ut += printf("Co
f530: 6e 74 65 6e 74 2d 6c 65 6e 67 74 68 3a 20 25 64  ntent-length: %d
f540: 5c 72 5c 6e 5c 72 5c 6e 22 2c 28 69 6e 74 29 73  \r\n\r\n",(int)s
f550: 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b  tatbuf.st_size);
f560: 0a 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f  .    fflush(stdo
f570: 75 74 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72  ut);.    if( str
f580: 63 6d 70 28 7a 4d 65 74 68 6f 64 2c 22 48 45 41  cmp(zMethod,"HEA
f590: 44 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  D")==0 ){.      
f5a0: 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20  MakeLogEntry(0, 
f5b0: 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 2f 2a 20 4c 4f  __LINE__); /* LO
f5c0: 47 3a 20 4e 6f 72 6d 61 6c 20 48 45 41 44 20 72  G: Normal HEAD r
f5d0: 65 70 6c 79 20 2a 2f 0a 20 20 20 20 20 20 66 63  eply */.      fc
f5e0: 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20  lose(in);.      
f5f0: 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
f600: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
f610: 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65 54    }.    if( useT
f620: 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d 28 33  imeout ) alarm(3
f630: 30 20 2b 20 73 74 61 74 62 75 66 2e 73 74 5f 73  0 + statbuf.st_s
f640: 69 7a 65 2f 31 30 30 30 29 3b 0a 23 69 66 64 65  ize/1000);.#ifde
f650: 66 20 6c 69 6e 75 78 0a 20 20 20 20 7b 0a 20 20  f linux.    {.  
f660: 20 20 20 20 6f 66 66 5f 74 20 6f 66 66 73 65 74      off_t offset
f670: 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 4f 75 74   = 0;.      nOut
f680: 20 2b 3d 20 73 65 6e 64 66 69 6c 65 28 66 69 6c   += sendfile(fil
f690: 65 6e 6f 28 73 74 64 6f 75 74 29 2c 20 66 69 6c  eno(stdout), fil
f6a0: 65 6e 6f 28 69 6e 29 2c 20 26 6f 66 66 73 65 74  eno(in), &offset
f6b0: 2c 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a  , statbuf.st_siz
f6c0: 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  e);.    }.#else.
f6d0: 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20      while( (c = 
f6e0: 67 65 74 63 28 69 6e 29 29 21 3d 45 4f 46 20 29  getc(in))!=EOF )
f6f0: 7b 0a 20 20 20 20 20 20 70 75 74 63 28 63 2c 73  {.      putc(c,s
f700: 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 6e 4f  tdout);.      nO
f710: 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ut++;.    }.#end
f720: 69 66 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e  if.    fclose(in
f730: 29 3b 0a 20 20 7d 0a 20 20 66 66 6c 75 73 68 28  );.  }.  fflush(
f740: 73 74 64 6f 75 74 29 3b 0a 20 20 4d 61 6b 65 4c  stdout);.  MakeL
f750: 6f 67 45 6e 74 72 79 28 30 2c 20 5f 5f 4c 49 4e  ogEntry(0, __LIN
f760: 45 5f 5f 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 4e  E__);  /* LOG: N
f770: 6f 72 6d 61 6c 20 72 65 70 6c 79 20 2a 2f 0a 0a  ormal reply */..
f780: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 65    /* The next re
f790: 71 75 65 73 74 20 6d 75 73 74 20 61 72 72 69 76  quest must arriv
f7a0: 65 20 77 69 74 68 69 6e 20 33 30 20 73 65 63 6f  e within 30 seco
f7b0: 6e 64 73 20 6f 72 20 77 65 20 63 6c 6f 73 65 20  nds or we close 
f7c0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20  the connection. 
f7d0: 20 2a 2f 0a 20 20 6f 6d 69 74 4c 6f 67 20 3d 20   */.  omitLog = 
f7e0: 31 3b 0a 20 20 69 66 28 20 75 73 65 54 69 6d 65  1;.  if( useTime
f7f0: 6f 75 74 20 29 20 61 6c 61 72 6d 28 33 30 29 3b  out ) alarm(30);
f800: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f  .}..#define MAX_
f810: 50 41 52 41 4c 4c 45 4c 20 35 30 20 20 2f 2a 20  PARALLEL 50  /* 
f820: 4e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 74  Number of simult
f830: 61 6e 65 6f 75 73 20 63 68 69 6c 64 72 65 6e 20  aneous children 
f840: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 70 6f  */../*.** All po
f850: 73 73 69 62 6c 65 20 66 6f 72 6d 73 20 6f 66 20  ssible forms of 
f860: 61 6e 20 49 50 20 61 64 64 72 65 73 73 2e 20 20  an IP address.  
f870: 4e 65 65 64 65 64 20 74 6f 20 77 6f 72 6b 20 61  Needed to work a
f880: 72 6f 75 6e 64 20 47 43 43 20 73 74 72 69 63 74  round GCC strict
f890: 0a 2a 2a 20 61 6c 69 61 73 69 6e 67 20 72 75 6c  .** aliasing rul
f8a0: 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 75  es..*/.typedef u
f8b0: 6e 69 6f 6e 20 7b 0a 20 20 73 74 72 75 63 74 20  nion {.  struct 
f8c0: 73 6f 63 6b 61 64 64 72 20 73 61 3b 20 20 20 20  sockaddr sa;    
f8d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 62 73            /* Abs
f8e0: 74 72 61 63 74 20 73 75 70 65 72 63 6c 61 73 73  tract superclass
f8f0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 6f 63   */.  struct soc
f900: 6b 61 64 64 72 5f 69 6e 20 73 61 34 3b 20 20 20  kaddr_in sa4;   
f910: 20 20 20 20 20 20 20 2f 2a 20 49 50 76 34 20 2a         /* IPv4 *
f920: 2f 0a 20 20 73 74 72 75 63 74 20 73 6f 63 6b 61  /.  struct socka
f930: 64 64 72 5f 69 6e 36 20 73 61 36 3b 20 20 20 20  ddr_in6 sa6;    
f940: 20 20 20 20 20 2f 2a 20 49 50 76 36 20 2a 2f 0a       /* IPv6 */.
f950: 20 20 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64    struct sockadd
f960: 72 5f 73 74 6f 72 61 67 65 20 73 61 73 3b 20 20  r_storage sas;  
f970: 20 20 20 2f 2a 20 53 68 6f 75 6c 64 20 62 65 20     /* Should be 
f980: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74  the maximum of t
f990: 68 65 20 61 62 6f 76 65 20 33 20 2a 2f 0a 7d 20  he above 3 */.} 
f9a0: 61 64 64 72 65 73 73 3b 0a 0a 2f 2a 0a 2a 2a 20  address;../*.** 
f9b0: 49 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 48 54 54  Implement an HTT
f9c0: 50 20 73 65 72 76 65 72 20 64 61 65 6d 6f 6e 20  P server daemon 
f9d0: 6c 69 73 74 65 6e 69 6e 67 20 6f 6e 20 70 6f 72  listening on por
f9e0: 74 20 69 50 6f 72 74 2e 0a 2a 2a 0a 2a 2a 20 41  t iPort..**.** A
f9f0: 73 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e  s new connection
fa00: 73 20 61 72 72 69 76 65 2c 20 66 6f 72 6b 20 61  s arrive, fork a
fa10: 20 63 68 69 6c 64 20 61 6e 64 20 6c 65 74 20 63   child and let c
fa20: 68 69 6c 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6f  hild return.** o
fa30: 75 74 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65  ut of this proce
fa40: 64 75 72 65 20 63 61 6c 6c 2e 20 20 54 68 65 20  dure call.  The 
fa50: 63 68 69 6c 64 20 77 69 6c 6c 20 68 61 6e 64 6c  child will handl
fa60: 65 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 2a  e the request..*
fa70: 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6e 65 76  * The parent nev
fa80: 65 72 20 72 65 74 75 72 6e 73 20 66 72 6f 6d 20  er returns from 
fa90: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 2e 0a  this procedure..
faa0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 74  **.** Return 0 t
fab0: 6f 20 65 61 63 68 20 63 68 69 6c 64 20 61 73 20  o each child as 
fac0: 69 74 20 72 75 6e 73 2e 20 20 49 66 20 75 6e 61  it runs.  If una
fad0: 62 6c 65 20 74 6f 20 65 73 74 61 62 6c 69 73 68  ble to establish
fae0: 20 61 0a 2a 2a 20 6c 69 73 74 65 6e 69 6e 67 20   a.** listening 
faf0: 73 6f 63 6b 65 74 2c 20 72 65 74 75 72 6e 20 6e  socket, return n
fb00: 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20  on-zero..*/.int 
fb10: 68 74 74 70 5f 73 65 72 76 65 72 28 63 6f 6e 73  http_server(cons
fb20: 74 20 63 68 61 72 20 2a 7a 50 6f 72 74 2c 20 69  t char *zPort, i
fb30: 6e 74 20 6c 6f 63 61 6c 4f 6e 6c 79 29 7b 0a 20  nt localOnly){. 
fb40: 20 69 6e 74 20 6c 69 73 74 65 6e 65 72 5b 32 30   int listener[20
fb50: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ];            /*
fb60: 20 54 68 65 20 73 65 72 76 65 72 20 73 6f 63 6b   The server sock
fb70: 65 74 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e  ets */.  int con
fb80: 6e 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20  nection;        
fb90: 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 63 6b 65        /* A socke
fba0: 74 20 66 6f 72 20 65 61 63 68 20 69 6e 64 69 76  t for each indiv
fbb0: 69 64 75 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e  idual connection
fbc0: 20 2a 2f 0a 20 20 66 64 5f 73 65 74 20 72 65 61   */.  fd_set rea
fbd0: 64 66 64 73 3b 20 20 20 20 20 20 20 20 20 20 20  dfds;           
fbe0: 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 66 69 6c     /* Set of fil
fbf0: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f  e descriptors fo
fc00: 72 20 73 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20  r select() */.  
fc10: 61 64 64 72 65 73 73 20 69 6e 61 64 64 72 3b 20  address inaddr; 
fc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fc30: 52 65 6d 6f 74 65 20 61 64 64 72 65 73 73 20 2a  Remote address *
fc40: 2f 0a 20 20 73 6f 63 6b 6c 65 6e 5f 74 20 6c 65  /.  socklen_t le
fc50: 6e 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20  naddr;          
fc60: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68   /* Length of th
fc70: 65 20 69 6e 61 64 64 72 20 73 74 72 75 63 74 75  e inaddr structu
fc80: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 69 6c  re */.  int chil
fc90: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
fca0: 20 20 20 20 20 2f 2a 20 50 49 44 20 6f 66 20 74       /* PID of t
fcb0: 68 65 20 63 68 69 6c 64 20 70 72 6f 63 65 73 73  he child process
fcc0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 63 68 69 6c 64   */.  int nchild
fcd0: 72 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ren = 0;        
fce0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
fcf0: 63 68 69 6c 64 20 70 72 6f 63 65 73 73 65 73 20  child processes 
fd00: 2a 2f 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  */.  struct time
fd10: 76 61 6c 20 64 65 6c 61 79 3b 20 20 20 20 20 20  val delay;      
fd20: 20 20 2f 2a 20 48 6f 77 20 6c 6f 6e 67 20 74 6f    /* How long to
fd30: 20 77 61 69 74 20 69 6e 73 69 64 65 20 73 65 6c   wait inside sel
fd40: 65 63 74 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f  ect() */.  int o
fd50: 70 74 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  pt = 1;         
fd60: 20 20 20 20 20 20 20 20 2f 2a 20 73 65 74 73 6f          /* setso
fd70: 63 6b 6f 70 74 20 66 6c 61 67 20 2a 2f 0a 20 20  ckopt flag */.  
fd80: 73 74 72 75 63 74 20 61 64 64 72 69 6e 66 6f 20  struct addrinfo 
fd90: 73 48 69 6e 74 73 3b 20 20 20 20 20 20 2f 2a 20  sHints;      /* 
fda0: 41 64 64 72 65 73 73 20 68 69 6e 74 73 20 2a 2f  Address hints */
fdb0: 0a 20 20 73 74 72 75 63 74 20 61 64 64 72 69 6e  .  struct addrin
fdc0: 66 6f 20 2a 70 41 64 64 72 73 2c 20 2a 70 3b 20  fo *pAddrs, *p; 
fdd0: 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  /* */.  int rc; 
fde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdf0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
fe00: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  ode */.  int i, 
fe10: 6e 3b 0a 20 20 69 6e 74 20 6d 61 78 46 64 20 3d  n;.  int maxFd =
fe20: 20 2d 31 3b 0a 20 20 0a 20 20 6d 65 6d 73 65 74   -1;.  .  memset
fe30: 28 26 73 48 69 6e 74 73 2c 20 30 2c 20 73 69 7a  (&sHints, 0, siz
fe40: 65 6f 66 28 73 48 69 6e 74 73 29 29 3b 0a 20 20  eof(sHints));.  
fe50: 69 66 28 20 69 70 76 34 4f 6e 6c 79 20 29 7b 0a  if( ipv4Only ){.
fe60: 20 20 20 20 73 48 69 6e 74 73 2e 61 69 5f 66 61      sHints.ai_fa
fe70: 6d 69 6c 79 20 3d 20 50 46 5f 49 4e 45 54 3b 0a  mily = PF_INET;.
fe80: 20 20 20 20 2f 2a 70 72 69 6e 74 66 28 22 69 70      /*printf("ip
fe90: 76 34 20 6f 6e 6c 79 5c 6e 22 29 3b 2a 2f 0a 20  v4 only\n");*/. 
fea0: 20 7d 65 6c 73 65 20 69 66 28 20 69 70 76 36 4f   }else if( ipv6O
feb0: 6e 6c 79 20 29 7b 0a 20 20 20 20 73 48 69 6e 74  nly ){.    sHint
fec0: 73 2e 61 69 5f 66 61 6d 69 6c 79 20 3d 20 50 46  s.ai_family = PF
fed0: 5f 49 4e 45 54 36 3b 0a 20 20 20 20 2f 2a 70 72  _INET6;.    /*pr
fee0: 69 6e 74 66 28 22 69 70 76 36 20 6f 6e 6c 79 5c  intf("ipv6 only\
fef0: 6e 22 29 3b 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  n");*/.  }else{.
ff00: 20 20 20 20 73 48 69 6e 74 73 2e 61 69 5f 66 61      sHints.ai_fa
ff10: 6d 69 6c 79 20 3d 20 50 46 5f 55 4e 53 50 45 43  mily = PF_UNSPEC
ff20: 3b 0a 20 20 7d 0a 20 20 73 48 69 6e 74 73 2e 61  ;.  }.  sHints.a
ff30: 69 5f 73 6f 63 6b 74 79 70 65 20 3d 20 53 4f 43  i_socktype = SOC
ff40: 4b 5f 53 54 52 45 41 4d 3b 0a 20 20 73 48 69 6e  K_STREAM;.  sHin
ff50: 74 73 2e 61 69 5f 66 6c 61 67 73 20 3d 20 41 49  ts.ai_flags = AI
ff60: 5f 50 41 53 53 49 56 45 3b 0a 20 20 73 48 69 6e  _PASSIVE;.  sHin
ff70: 74 73 2e 61 69 5f 70 72 6f 74 6f 63 6f 6c 20 3d  ts.ai_protocol =
ff80: 20 30 3b 0a 20 20 72 63 20 3d 20 67 65 74 61 64   0;.  rc = getad
ff90: 64 72 69 6e 66 6f 28 6c 6f 63 61 6c 4f 6e 6c 79  drinfo(localOnly
ffa0: 20 3f 20 22 6c 6f 63 61 6c 68 6f 73 74 22 3a 20   ? "localhost": 
ffb0: 30 2c 20 7a 50 6f 72 74 2c 20 26 73 48 69 6e 74  0, zPort, &sHint
ffc0: 73 2c 20 26 70 41 64 64 72 73 29 3b 0a 20 20 69  s, &pAddrs);.  i
ffd0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 66 70 72  f( rc ){.    fpr
ffe0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 63 6f  intf(stderr, "co
fff0: 75 6c 64 20 6e 6f 74 20 67 65 74 20 61 64 64 72  uld not get addr
10000 20 69 6e 66 6f 3a 20 25 73 22 2c 20 0a 20 20 20   info: %s", .   
10010 20 20 20 20 20 20 20 20 20 72 63 21 3d 45 41 49           rc!=EAI
10020 5f 53 59 53 54 45 4d 20 3f 20 67 61 69 5f 73 74  _SYSTEM ? gai_st
10030 72 65 72 72 6f 72 28 72 63 29 20 3a 20 73 74 72  rerror(rc) : str
10040 65 72 72 6f 72 28 65 72 72 6e 6f 29 29 3b 0a 20  error(errno));. 
10050 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
10060 0a 20 20 66 6f 72 28 6e 3d 30 2c 20 70 3d 70 41  .  for(n=0, p=pA
10070 64 64 72 73 3b 20 6e 3c 28 69 6e 74 29 28 73 69  ddrs; n<(int)(si
10080 7a 65 6f 66 28 6c 69 73 74 65 6e 65 72 29 2f 73  zeof(listener)/s
10090 69 7a 65 6f 66 28 6c 69 73 74 65 6e 65 72 5b 30  izeof(listener[0
100a0 5d 29 29 20 26 26 20 70 21 3d 30 3b 0a 20 20 20  ])) && p!=0;.   
100b0 20 20 20 20 20 70 3d 70 2d 3e 61 69 5f 6e 65 78       p=p->ai_nex
100c0 74 29 7b 0a 20 20 20 20 6c 69 73 74 65 6e 65 72  t){.    listener
100d0 5b 6e 5d 20 3d 20 73 6f 63 6b 65 74 28 70 2d 3e  [n] = socket(p->
100e0 61 69 5f 66 61 6d 69 6c 79 2c 20 70 2d 3e 61 69  ai_family, p->ai
100f0 5f 73 6f 63 6b 74 79 70 65 2c 20 70 2d 3e 61 69  _socktype, p->ai
10100 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 20 20 20 20  _protocol);.    
10110 69 66 28 20 6c 69 73 74 65 6e 65 72 5b 6e 5d 3e  if( listener[n]>
10120 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69  =0 ){.      /* i
10130 66 20 77 65 20 63 61 6e 27 74 20 74 65 72 6d 69  f we can't termi
10140 6e 61 74 65 20 6e 69 63 65 6c 79 2c 20 61 74 20  nate nicely, at 
10150 6c 65 61 73 74 20 61 6c 6c 6f 77 20 74 68 65 20  least allow the 
10160 73 6f 63 6b 65 74 20 74 6f 20 62 65 20 72 65 75  socket to be reu
10170 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 65 74  sed */.      set
10180 73 6f 63 6b 6f 70 74 28 6c 69 73 74 65 6e 65 72  sockopt(listener
10190 5b 6e 5d 2c 20 53 4f 4c 5f 53 4f 43 4b 45 54 2c  [n], SOL_SOCKET,
101a0 20 53 4f 5f 52 45 55 53 45 41 44 44 52 2c 26 6f   SO_REUSEADDR,&o
101b0 70 74 2c 20 73 69 7a 65 6f 66 28 6f 70 74 29 29  pt, sizeof(opt))
101c0 3b 0a 20 20 20 20 20 20 0a 23 69 66 20 64 65 66  ;.      .#if def
101d0 69 6e 65 64 28 49 50 56 36 5f 56 36 4f 4e 4c 59  ined(IPV6_V6ONLY
101e0 29 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61  ).      if( p->a
101f0 69 5f 66 61 6d 69 6c 79 3d 3d 41 46 5f 49 4e 45  i_family==AF_INE
10200 54 36 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  T6 ){.        in
10210 74 20 76 36 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20  t v6only = 1;.  
10220 20 20 20 20 20 20 73 65 74 73 6f 63 6b 6f 70 74        setsockopt
10230 28 6c 69 73 74 65 6e 65 72 5b 6e 5d 2c 20 49 50  (listener[n], IP
10240 50 52 4f 54 4f 5f 49 50 56 36 2c 20 49 50 56 36  PROTO_IPV6, IPV6
10250 5f 56 36 4f 4e 4c 59 2c 0a 20 20 20 20 20 20 20  _V6ONLY,.       
10260 20 20 20 20 20 20 20 20 20 20 20 20 20 26 76 36               &v6
10270 6f 6e 6c 79 2c 20 73 69 7a 65 6f 66 28 76 36 6f  only, sizeof(v6o
10280 6e 6c 79 29 29 3b 0a 20 20 20 20 20 20 7d 0a 23  nly));.      }.#
10290 65 6e 64 69 66 0a 20 20 20 20 20 20 0a 20 20 20  endif.      .   
102a0 20 20 20 69 66 28 20 62 69 6e 64 28 6c 69 73 74     if( bind(list
102b0 65 6e 65 72 5b 6e 5d 2c 20 70 2d 3e 61 69 5f 61  ener[n], p->ai_a
102c0 64 64 72 2c 20 70 2d 3e 61 69 5f 61 64 64 72 6c  ddr, p->ai_addrl
102d0 65 6e 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  en)<0 ){.       
102e0 20 70 72 69 6e 74 66 28 22 62 69 6e 64 20 66 61   printf("bind fa
102f0 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20 73 74 72  iled: %s\n", str
10300 65 72 72 6f 72 28 65 72 72 6e 6f 29 29 3b 0a 20  error(errno));. 
10310 20 20 20 20 20 20 20 63 6c 6f 73 65 28 6c 69 73         close(lis
10320 74 65 6e 65 72 5b 6e 5d 29 3b 0a 20 20 20 20 20  tener[n]);.     
10330 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
10340 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6c     }.      if( l
10350 69 73 74 65 6e 28 6c 69 73 74 65 6e 65 72 5b 6e  isten(listener[n
10360 5d 2c 20 32 30 29 3c 30 20 29 7b 0a 20 20 20 20  ], 20)<0 ){.    
10370 20 20 20 20 70 72 69 6e 74 66 28 22 6c 69 73 74      printf("list
10380 65 6e 28 29 20 66 61 69 6c 65 64 3a 20 25 73 5c  en() failed: %s\
10390 6e 22 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72  n", strerror(err
103a0 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 63 6c  no));.        cl
103b0 6f 73 65 28 6c 69 73 74 65 6e 65 72 5b 6e 5d 29  ose(listener[n])
103c0 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
103d0 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
103e0 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    n++;.    }.  }
103f0 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20  .  if( n==0 ){. 
10400 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
10410 72 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  r, "cannot open 
10420 61 6e 79 20 73 6f 63 6b 65 74 73 5c 6e 22 29 3b  any sockets\n");
10430 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
10440 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29   }..  while( 1 )
10450 7b 0a 20 20 20 20 69 66 28 20 6e 63 68 69 6c 64  {.    if( nchild
10460 72 65 6e 3e 4d 41 58 5f 50 41 52 41 4c 4c 45 4c  ren>MAX_PARALLEL
10470 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 6c 6f   ){.      /* Slo
10480 77 20 64 6f 77 6e 20 69 66 20 63 6f 6e 6e 65 63  w down if connec
10490 74 69 6f 6e 73 20 61 72 65 20 61 72 72 69 76 69  tions are arrivi
104a0 6e 67 20 74 6f 6f 20 66 61 73 74 20 2a 2f 0a 20  ng too fast */. 
104b0 20 20 20 20 20 73 6c 65 65 70 28 20 6e 63 68 69       sleep( nchi
104c0 6c 64 72 65 6e 2d 4d 41 58 5f 50 41 52 41 4c 4c  ldren-MAX_PARALL
104d0 45 4c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  EL );.    }.    
104e0 64 65 6c 61 79 2e 74 76 5f 73 65 63 20 3d 20 36  delay.tv_sec = 6
104f0 30 3b 0a 20 20 20 20 64 65 6c 61 79 2e 74 76 5f  0;.    delay.tv_
10500 75 73 65 63 20 3d 20 30 3b 0a 20 20 20 20 46 44  usec = 0;.    FD
10510 5f 5a 45 52 4f 28 26 72 65 61 64 66 64 73 29 3b  _ZERO(&readfds);
10520 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
10530 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  n; i++){.      a
10540 73 73 65 72 74 28 20 6c 69 73 74 65 6e 65 72 5b  ssert( listener[
10550 69 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 46  i]>=0 );.      F
10560 44 5f 53 45 54 28 20 6c 69 73 74 65 6e 65 72 5b  D_SET( listener[
10570 69 5d 2c 20 26 72 65 61 64 66 64 73 29 3b 0a 20  i], &readfds);. 
10580 20 20 20 20 20 69 66 28 20 6c 69 73 74 65 6e 65       if( listene
10590 72 5b 69 5d 3e 6d 61 78 46 64 20 29 20 6d 61 78  r[i]>maxFd ) max
105a0 46 64 20 3d 20 6c 69 73 74 65 6e 65 72 5b 69 5d  Fd = listener[i]
105b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 6c 65  ;.    }.    sele
105c0 63 74 28 20 6d 61 78 46 64 2b 31 2c 20 26 72 65  ct( maxFd+1, &re
105d0 61 64 66 64 73 2c 20 30 2c 20 30 2c 20 26 64 65  adfds, 0, 0, &de
105e0 6c 61 79 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  lay);.    for(i=
105f0 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
10600 20 20 20 20 69 66 28 20 46 44 5f 49 53 53 45 54      if( FD_ISSET
10610 28 6c 69 73 74 65 6e 65 72 5b 69 5d 2c 20 26 72  (listener[i], &r
10620 65 61 64 66 64 73 29 20 29 7b 0a 20 20 20 20 20  eadfds) ){.     
10630 20 20 20 6c 65 6e 61 64 64 72 20 3d 20 73 69 7a     lenaddr = siz
10640 65 6f 66 28 69 6e 61 64 64 72 29 3b 0a 20 20 20  eof(inaddr);.   
10650 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20       connection 
10660 3d 20 61 63 63 65 70 74 28 6c 69 73 74 65 6e 65  = accept(listene
10670 72 5b 69 5d 2c 20 26 69 6e 61 64 64 72 2e 73 61  r[i], &inaddr.sa
10680 2c 20 26 6c 65 6e 61 64 64 72 29 3b 0a 20 20 20  , &lenaddr);.   
10690 20 20 20 20 20 69 66 28 20 63 6f 6e 6e 65 63 74       if( connect
106a0 69 6f 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ion>=0 ){.      
106b0 20 20 20 20 63 68 69 6c 64 20 3d 20 66 6f 72 6b      child = fork
106c0 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ();.          if
106d0 28 20 63 68 69 6c 64 21 3d 30 20 29 7b 0a 20 20  ( child!=0 ){.  
106e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 68            if( ch
106f0 69 6c 64 3e 30 20 29 20 6e 63 68 69 6c 64 72 65  ild>0 ) nchildre
10700 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  n++;.           
10710 20 63 6c 6f 73 65 28 63 6f 6e 6e 65 63 74 69 6f   close(connectio
10720 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
10730 2f 2a 20 70 72 69 6e 74 66 28 22 73 75 62 70 72  /* printf("subpr
10740 6f 63 65 73 73 20 25 64 20 73 74 61 72 74 65 64  ocess %d started
10750 2e 2e 2e 5c 6e 22 2c 20 63 68 69 6c 64 29 3b 20  ...\n", child); 
10760 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 20  fflush(stdout); 
10770 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  */.          }el
10780 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
10790 69 6e 74 20 6e 45 72 72 20 3d 20 30 2c 20 66 64  int nErr = 0, fd
107a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6c  ;.            cl
107b0 6f 73 65 28 30 29 3b 0a 20 20 20 20 20 20 20 20  ose(0);.        
107c0 20 20 20 20 66 64 20 3d 20 64 75 70 28 63 6f 6e      fd = dup(con
107d0 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  nection);.      
107e0 20 20 20 20 20 20 69 66 28 20 66 64 21 3d 30 20        if( fd!=0 
107f0 29 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ) nErr++;.      
10800 20 20 20 20 20 20 63 6c 6f 73 65 28 31 29 3b 0a        close(1);.
10810 20 20 20 20 20 20 20 20 20 20 20 20 66 64 20 3d              fd =
10820 20 64 75 70 28 63 6f 6e 6e 65 63 74 69 6f 6e 29   dup(connection)
10830 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
10840 28 20 66 64 21 3d 31 20 29 20 6e 45 72 72 2b 2b  ( fd!=1 ) nErr++
10850 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6c  ;.            cl
10860 6f 73 65 28 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b  ose(connection);
10870 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
10880 75 72 6e 20 6e 45 72 72 3b 0a 20 20 20 20 20 20  urn nErr;.      
10890 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
108a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
108b0 20 42 75 72 79 20 64 65 61 64 20 63 68 69 6c 64   Bury dead child
108c0 72 65 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  ren */.      whi
108d0 6c 65 28 20 28 63 68 69 6c 64 20 3d 20 77 61 69  le( (child = wai
108e0 74 70 69 64 28 30 2c 20 30 2c 20 57 4e 4f 48 41  tpid(0, 0, WNOHA
108f0 4e 47 29 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  NG))>0 ){.      
10900 20 20 2f 2a 20 70 72 69 6e 74 66 28 22 70 72 6f    /* printf("pro
10910 63 65 73 73 20 25 64 20 65 6e 64 73 5c 6e 22 2c  cess %d ends\n",
10920 20 63 68 69 6c 64 29 3b 20 66 66 6c 75 73 68 28   child); fflush(
10930 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 20 20  stdout); */.    
10940 20 20 20 20 6e 63 68 69 6c 64 72 65 6e 2d 2d 3b      nchildren--;
10950 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10960 20 7d 0a 20 20 2f 2a 20 4e 4f 54 20 52 45 41 43   }.  /* NOT REAC
10970 48 45 44 20 2a 2f 20 20 0a 20 20 65 78 69 74 28  HED */  .  exit(
10980 31 29 3b 0a 7d 0a 0a 0a 69 6e 74 20 6d 61 69 6e  1);.}...int main
10990 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20  (int argc, char 
109a0 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74 20 69  **argv){.  int i
109b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
109c0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
109d0 6e 74 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  nter */.  char *
109e0 7a 50 65 72 6d 55 73 65 72 20 3d 20 30 3b 20 20  zPermUser = 0;  
109f0 20 20 20 20 2f 2a 20 52 75 6e 20 64 61 65 6d 6f      /* Run daemo
10a00 6e 20 77 69 74 68 20 74 68 69 73 20 75 73 65 72  n with this user
10a10 27 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 2a  's permissions *
10a20 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
10a30 7a 50 6f 72 74 20 3d 20 30 3b 20 20 20 20 2f 2a  zPort = 0;    /*
10a40 20 49 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 48 54   Implement an HT
10a50 54 50 20 73 65 72 76 65 72 20 70 72 6f 63 65 73  TP server proces
10a60 73 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 43 68  s */.  int useCh
10a70 72 6f 6f 74 4a 61 69 6c 20 3d 20 31 3b 20 20 20  rootJail = 1;   
10a80 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
10a90 61 20 63 68 61 6e 67 65 2d 72 6f 6f 74 20 6a 61  a change-root ja
10aa0 69 6c 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 70  il */.  struct p
10ab0 61 73 73 77 64 20 2a 70 77 64 20 3d 20 30 3b 20  asswd *pwd = 0; 
10ac0 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
10ad0 20 61 62 6f 75 74 20 74 68 65 20 75 73 65 72 20   about the user 
10ae0 2a 2f 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20  */..  /* Record 
10af0 74 68 65 20 74 69 6d 65 20 77 68 65 6e 20 70 72  the time when pr
10b00 6f 63 65 73 73 69 6e 67 20 62 65 67 69 6e 73 2e  ocessing begins.
10b10 0a 20 20 2a 2f 0a 20 20 67 65 74 74 69 6d 65 6f  .  */.  gettimeo
10b20 66 64 61 79 28 26 62 65 67 69 6e 54 69 6d 65 2c  fday(&beginTime,
10b30 20 30 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65   0);..  /* Parse
10b40 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72   command-line ar
10b50 67 75 6d 65 6e 74 73 0a 20 20 2a 2f 0a 20 20 77  guments.  */.  w
10b60 68 69 6c 65 28 20 61 72 67 63 3e 31 20 26 26 20  hile( argc>1 && 
10b70 61 72 67 76 5b 31 5d 5b 30 5d 3d 3d 27 2d 27 20  argv[1][0]=='-' 
10b80 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
10b90 20 61 72 67 76 5b 31 5d 3b 0a 20 20 20 20 63 68   argv[1];.    ch
10ba0 61 72 20 2a 7a 41 72 67 20 3d 20 61 72 67 63 3e  ar *zArg = argc>
10bb0 3d 33 20 3f 20 61 72 67 76 5b 32 5d 20 3a 20 22  =3 ? argv[2] : "
10bc0 30 22 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d  0";.    if( z[0]
10bd0 3d 3d 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27  =='-' && z[1]=='
10be0 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66  -' ) z++;.    if
10bf0 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 75 73 65  ( strcmp(z,"-use
10c00 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
10c10 7a 50 65 72 6d 55 73 65 72 20 3d 20 7a 41 72 67  zPermUser = zArg
10c20 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
10c30 73 74 72 63 6d 70 28 7a 2c 22 2d 72 6f 6f 74 22  strcmp(z,"-root"
10c40 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 52  )==0 ){.      zR
10c50 6f 6f 74 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20  oot = zArg;.    
10c60 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
10c70 28 7a 2c 22 2d 6c 6f 67 66 69 6c 65 22 29 3d 3d  (z,"-logfile")==
10c80 30 20 29 7b 0a 20 20 20 20 20 20 7a 4c 6f 67 46  0 ){.      zLogF
10c90 69 6c 65 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20  ile = zArg;.    
10ca0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
10cb0 28 7a 2c 22 2d 6d 61 78 2d 61 67 65 22 29 3d 3d  (z,"-max-age")==
10cc0 30 20 29 7b 0a 20 20 20 20 20 20 6d 78 41 67 65  0 ){.      mxAge
10cd0 20 3d 20 61 74 6f 69 28 7a 41 72 67 29 3b 0a 20   = atoi(zArg);. 
10ce0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
10cf0 63 6d 70 28 7a 2c 22 2d 68 74 74 70 73 22 29 3d  cmp(z,"-https")=
10d00 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 73 65 48  =0 ){.      useH
10d10 74 74 70 73 20 3d 20 61 74 6f 69 28 7a 41 72 67  ttps = atoi(zArg
10d20 29 3b 0a 20 20 20 20 20 20 7a 48 74 74 70 20 3d  );.      zHttp =
10d30 20 75 73 65 48 74 74 70 73 20 3f 20 22 68 74 74   useHttps ? "htt
10d40 70 73 22 20 3a 20 22 68 74 74 70 22 3b 0a 20 20  ps" : "http";.  
10d50 20 20 20 20 69 66 28 20 75 73 65 48 74 74 70 73      if( useHttps
10d60 20 29 20 7a 52 65 6d 6f 74 65 41 64 64 72 20 3d   ) zRemoteAddr =
10d70 20 67 65 74 65 6e 76 28 22 52 45 4d 4f 54 45 5f   getenv("REMOTE_
10d80 48 4f 53 54 22 29 3b 0a 20 20 20 20 7d 65 6c 73  HOST");.    }els
10d90 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20  e if( strcmp(z, 
10da0 22 2d 70 6f 72 74 22 29 3d 3d 30 20 29 7b 0a 20  "-port")==0 ){. 
10db0 20 20 20 20 20 7a 50 6f 72 74 20 3d 20 7a 41 72       zPort = zAr
10dc0 67 3b 0a 20 20 20 20 20 20 73 74 61 6e 64 61 6c  g;.      standal
10dd0 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  one = 1;.    }el
10de0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
10df0 20 22 2d 66 61 6d 69 6c 79 22 29 3d 3d 30 20 29   "-family")==0 )
10e00 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
10e10 6d 70 28 7a 41 72 67 2c 20 22 69 70 76 34 22 29  mp(zArg, "ipv4")
10e20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
10e30 70 76 34 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20  pv4Only = 1;.   
10e40 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
10e50 63 6d 70 28 7a 41 72 67 2c 20 22 69 70 76 36 22  cmp(zArg, "ipv6"
10e60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
10e70 69 70 76 36 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  ipv6Only = 1;.  
10e80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10e90 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f     Malfunction(_
10ea0 5f 4c 49 4e 45 5f 5f 2c 20 20 2f 2a 20 4c 4f 47  _LINE__,  /* LOG
10eb0 3a 20 75 6e 6b 6e 6f 77 6e 20 49 50 20 70 72 6f  : unknown IP pro
10ec0 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20 20 20 20  tocol */.       
10ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 75 6e               "un
10ee0 6b 6e 6f 77 6e 20 49 50 20 70 72 6f 74 6f 63 6f  known IP protoco
10ef0 6c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 41 72 67  l: [%s]\n", zArg
10f00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
10f10 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
10f20 7a 2c 20 22 2d 6a 61 69 6c 22 29 3d 3d 30 20 29  z, "-jail")==0 )
10f30 7b 0a 20 20 20 20 20 20 69 66 28 20 61 74 6f 69  {.      if( atoi
10f40 28 7a 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20  (zArg)==0 ){.   
10f50 20 20 20 20 20 75 73 65 43 68 72 6f 6f 74 4a 61       useChrootJa
10f60 69 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  il = 0;.      }.
10f70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
10f80 72 63 6d 70 28 7a 2c 20 22 2d 64 65 62 75 67 22  rcmp(z, "-debug"
10f90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
10fa0 28 20 61 74 6f 69 28 7a 41 72 67 29 20 29 7b 0a  ( atoi(zArg) ){.
10fb0 20 20 20 20 20 20 20 20 75 73 65 54 69 6d 65 6f          useTimeo
10fc0 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ut = 0;.      }.
10fd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10fe0 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c   Malfunction(__L
10ff0 49 4e 45 5f 5f 2c 20 2f 2a 20 4c 4f 47 3a 20 75  INE__, /* LOG: u
11000 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64 2d 6c  nknown command-l
11010 69 6e 65 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20  ine argument on 
11020 6c 61 75 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20  launch */.      
11030 20 20 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b              "unk
11040 6e 6f 77 6e 20 61 72 67 75 6d 65 6e 74 3a 20 5b  nown argument: [
11050 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20  %s]\n", z);.    
11060 7d 0a 20 20 20 20 61 72 67 76 20 2b 3d 20 32 3b  }.    argv += 2;
11070 0a 20 20 20 20 61 72 67 63 20 2d 3d 20 32 3b 0a  .    argc -= 2;.
11080 20 20 7d 0a 20 20 69 66 28 20 7a 52 6f 6f 74 3d    }.  if( zRoot=
11090 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  =0 ){.    if( st
110a0 61 6e 64 61 6c 6f 6e 65 20 29 7b 0a 20 20 20 20  andalone ){.    
110b0 20 20 7a 52 6f 6f 74 20 3d 20 22 2e 22 3b 0a 20    zRoot = ".";. 
110c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
110d0 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49  Malfunction(__LI
110e0 4e 45 5f 5f 2c 20 2f 2a 20 4c 4f 47 3a 20 2d 2d  NE__, /* LOG: --
110f0 72 6f 6f 74 20 61 72 67 75 6d 65 6e 74 20 6d 69  root argument mi
11100 73 73 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20  ssing */.       
11110 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f 20 2d             "no -
11120 2d 72 6f 6f 74 20 73 70 65 63 69 66 69 65 64 22  -root specified"
11130 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  );.    }.  }.  .
11140 20 20 2f 2a 20 43 68 61 6e 67 65 20 64 69 72 65    /* Change dire
11150 63 74 6f 72 69 65 73 20 74 6f 20 74 68 65 20 72  ctories to the r
11160 6f 6f 74 20 6f 66 20 74 68 65 20 48 54 54 50 20  oot of the HTTP 
11170 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 54 68 65  filesystem.  The
11180 6e 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20  n.  ** create a 
11190 63 68 72 6f 6f 74 20 6a 61 69 6c 20 74 68 65 72  chroot jail ther
111a0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68  e..  */.  if( ch
111b0 64 69 72 28 7a 52 6f 6f 74 29 21 3d 30 20 29 7b  dir(zRoot)!=0 ){
111c0 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e  .    Malfunction
111d0 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a 20 4c 4f  (__LINE__, /* LO
111e0 47 3a 20 63 68 64 69 72 28 29 20 66 61 69 6c 65  G: chdir() faile
111f0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  d */.           
11200 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 68 61       "cannot cha
11210 6e 67 65 20 74 6f 20 64 69 72 65 63 74 6f 72 79  nge to directory
11220 20 5b 25 73 5d 22 2c 20 7a 52 6f 6f 74 29 3b 0a   [%s]", zRoot);.
11230 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 69 6e    }..  /* Get in
11240 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
11250 74 68 65 20 75 73 65 72 20 69 66 20 61 76 61 69  the user if avai
11260 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 7a  lable */.  if( z
11270 50 65 72 6d 55 73 65 72 20 29 20 70 77 64 20 3d  PermUser ) pwd =
11280 20 67 65 74 70 77 6e 61 6d 28 7a 50 65 72 6d 55   getpwnam(zPermU
11290 73 65 72 29 3b 0a 0a 20 20 2f 2a 20 45 6e 74 65  ser);..  /* Ente
112a0 72 20 74 68 65 20 63 68 72 6f 6f 74 20 6a 61 69  r the chroot jai
112b0 6c 20 69 66 20 72 65 71 75 65 73 74 65 64 20 2a  l if requested *
112c0 2f 20 20 0a 20 20 69 66 28 20 7a 50 65 72 6d 55  /  .  if( zPermU
112d0 73 65 72 20 26 26 20 75 73 65 43 68 72 6f 6f 74  ser && useChroot
112e0 4a 61 69 6c 20 26 26 20 67 65 74 75 69 64 28 29  Jail && getuid()
112f0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 63  ==0 ){.    if( c
11300 68 72 6f 6f 74 28 22 2e 22 29 3c 30 20 29 7b 0a  hroot(".")<0 ){.
11310 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f        Malfunctio
11320 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a 20 4c  n(__LINE__, /* L
11330 4f 47 3a 20 63 68 72 6f 6f 74 28 29 20 66 61 69  OG: chroot() fai
11340 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  led */.         
11350 20 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65           "unable
11360 20 74 6f 20 63 72 65 61 74 65 20 63 68 72 6f 6f   to create chroo
11370 74 20 6a 61 69 6c 22 29 3b 0a 20 20 20 20 7d 65  t jail");.    }e
11380 6c 73 65 7b 0a 20 20 20 20 20 20 7a 52 6f 6f 74  lse{.      zRoot
11390 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 7d   = "";.    }.  }
113a0 0a 0a 20 20 2f 2a 20 41 63 74 69 76 61 74 65 20  ..  /* Activate 
113b0 74 68 65 20 73 65 72 76 65 72 2c 20 69 66 20 72  the server, if r
113c0 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 69 66  equested */.  if
113d0 28 20 7a 50 6f 72 74 20 26 26 20 68 74 74 70 5f  ( zPort && http_
113e0 73 65 72 76 65 72 28 7a 50 6f 72 74 2c 20 30 29  server(zPort, 0)
113f0 20 29 7b 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74   ){.    Malfunct
11400 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a  ion(__LINE__, /*
11410 20 4c 4f 47 3a 20 73 65 72 76 65 72 20 73 74 61   LOG: server sta
11420 72 74 75 70 20 66 61 69 6c 65 64 20 2a 2f 0a 20  rtup failed */. 
11430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
11440 66 61 69 6c 65 64 20 74 6f 20 73 74 61 72 74 20  failed to start 
11450 73 65 72 76 65 72 22 29 3b 0a 20 20 7d 0a 0a 20  server");.  }.. 
11460 20 2f 2a 20 44 72 6f 70 20 72 6f 6f 74 20 70 72   /* Drop root pr
11470 69 76 69 6c 65 67 65 73 2e 0a 20 20 2a 2f 0a 20  ivileges..  */. 
11480 20 69 66 28 20 7a 50 65 72 6d 55 73 65 72 20 29   if( zPermUser )
11490 7b 0a 20 20 20 20 69 66 28 20 70 77 64 20 29 7b  {.    if( pwd ){
114a0 0a 20 20 20 20 20 20 69 66 28 20 73 65 74 67 69  .      if( setgi
114b0 64 28 70 77 64 2d 3e 70 77 5f 67 69 64 29 20 29  d(pwd->pw_gid) )
114c0 7b 0a 20 20 20 20 20 20 20 20 4d 61 6c 66 75 6e  {.        Malfun
114d0 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20  ction(__LINE__, 
114e0 2f 2a 20 4c 4f 47 3a 20 73 65 74 67 69 64 28 29  /* LOG: setgid()
114f0 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
11500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
11510 63 61 6e 6e 6f 74 20 73 65 74 20 67 72 6f 75 70  cannot set group
11520 2d 69 64 20 74 6f 20 25 64 22 2c 20 70 77 64 2d  -id to %d", pwd-
11530 3e 70 77 5f 67 69 64 29 3b 0a 20 20 20 20 20 20  >pw_gid);.      
11540 7d 0a 20 20 20 20 20 20 69 66 28 20 73 65 74 75  }.      if( setu
11550 69 64 28 70 77 64 2d 3e 70 77 5f 75 69 64 29 20  id(pwd->pw_uid) 
11560 29 7b 0a 20 20 20 20 20 20 20 20 4d 61 6c 66 75  ){.        Malfu
11570 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c  nction(__LINE__,
11580 20 2f 2a 20 4c 4f 47 3a 20 73 65 74 75 69 64 28   /* LOG: setuid(
11590 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20  ) failed */.    
115a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115b0 22 63 61 6e 6e 6f 74 20 73 65 74 20 75 73 65 72  "cannot set user
115c0 2d 69 64 20 74 6f 20 25 64 22 2c 20 70 77 64 2d  -id to %d", pwd-
115d0 3e 70 77 5f 75 69 64 29 3b 0a 20 20 20 20 20 20  >pw_uid);.      
115e0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
115f0 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f     Malfunction(_
11600 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a 20 4c 4f 47 3a  _LINE__, /* LOG:
11610 20 75 6e 6b 6e 6f 77 6e 20 75 73 65 72 20 2a 2f   unknown user */
11620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11630 20 20 20 22 6e 6f 20 73 75 63 68 20 75 73 65 72     "no such user
11640 20 5b 25 73 5d 22 2c 20 7a 50 65 72 6d 55 73 65   [%s]", zPermUse
11650 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
11660 69 66 28 20 67 65 74 75 69 64 28 29 3d 3d 30 20  if( getuid()==0 
11670 29 7b 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69  ){.    Malfuncti
11680 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a 20  on(__LINE__, /* 
11690 4c 4f 47 3a 20 63 61 6e 6e 6f 74 20 72 75 6e 20  LOG: cannot run 
116a0 61 73 20 72 6f 6f 74 20 2a 2f 0a 20 20 20 20 20  as root */.     
116b0 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e             "cann
116c0 6f 74 20 72 75 6e 20 61 73 20 72 6f 6f 74 22 29  ot run as root")
116d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20  ;.  }..  /* Get 
116e0 74 68 65 20 49 50 20 61 64 64 72 65 73 73 20 66  the IP address f
116f0 72 6f 6d 20 77 68 65 6e 63 65 20 74 68 65 20 72  rom whence the r
11700 65 71 75 65 73 74 20 6f 72 69 67 69 6e 61 74 65  equest originate
11710 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65  s.  */.  if( zRe
11720 6d 6f 74 65 41 64 64 72 3d 3d 30 20 29 7b 0a 20  moteAddr==0 ){. 
11730 20 20 20 61 64 64 72 65 73 73 20 72 65 6d 6f 74     address remot
11740 65 41 64 64 72 3b 0a 20 20 20 20 75 6e 73 69 67  eAddr;.    unsig
11750 6e 65 64 20 69 6e 74 20 73 69 7a 65 20 3d 20 73  ned int size = s
11760 69 7a 65 6f 66 28 72 65 6d 6f 74 65 41 64 64 72  izeof(remoteAddr
11770 29 3b 0a 20 20 20 20 63 68 61 72 20 7a 48 6f 73  );.    char zHos
11780 74 5b 4e 49 5f 4d 41 58 48 4f 53 54 5d 3b 0a 20  t[NI_MAXHOST];. 
11790 20 20 20 69 66 28 20 67 65 74 70 65 65 72 6e 61     if( getpeerna
117a0 6d 65 28 30 2c 20 26 72 65 6d 6f 74 65 41 64 64  me(0, &remoteAdd
117b0 72 2e 73 61 2c 20 26 73 69 7a 65 29 3e 3d 30 20  r.sa, &size)>=0 
117c0 29 7b 0a 20 20 20 20 20 20 67 65 74 6e 61 6d 65  ){.      getname
117d0 69 6e 66 6f 28 26 72 65 6d 6f 74 65 41 64 64 72  info(&remoteAddr
117e0 2e 73 61 2c 20 73 69 7a 65 2c 20 7a 48 6f 73 74  .sa, size, zHost
117f0 2c 20 73 69 7a 65 6f 66 28 7a 48 6f 73 74 29 2c  , sizeof(zHost),
11800 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
11810 20 20 20 20 20 20 20 20 20 4e 49 5f 4e 55 4d 45           NI_NUME
11820 52 49 43 48 4f 53 54 29 3b 0a 20 20 20 20 20 20  RICHOST);.      
11830 7a 52 65 6d 6f 74 65 41 64 64 72 20 3d 20 53 74  zRemoteAddr = St
11840 72 44 75 70 28 7a 48 6f 73 74 29 3b 0a 20 20 20  rDup(zHost);.   
11850 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 52 65   }.  }.  if( zRe
11860 6d 6f 74 65 41 64 64 72 21 3d 30 0a 20 20 20 26  moteAddr!=0.   &
11870 26 20 73 74 72 6e 63 6d 70 28 7a 52 65 6d 6f 74  & strncmp(zRemot
11880 65 41 64 64 72 2c 20 22 3a 3a 66 66 66 66 3a 22  eAddr, "::ffff:"
11890 2c 20 37 29 3d 3d 30 0a 20 20 20 26 26 20 73 74  , 7)==0.   && st
118a0 72 63 68 72 28 7a 52 65 6d 6f 74 65 41 64 64 72  rchr(zRemoteAddr
118b0 2b 37 2c 20 27 3a 27 29 3d 3d 30 0a 20 20 20 26  +7, ':')==0.   &
118c0 26 20 73 74 72 63 68 72 28 7a 52 65 6d 6f 74 65  & strchr(zRemote
118d0 41 64 64 72 2b 37 2c 20 27 2e 27 29 21 3d 30 0a  Addr+7, '.')!=0.
118e0 20 20 29 7b 0a 20 20 20 20 7a 52 65 6d 6f 74 65    ){.    zRemote
118f0 41 64 64 72 20 2b 3d 20 37 3b 0a 20 20 7d 0a 0a  Addr += 7;.  }..
11900 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65    /* Process the
11910 20 69 6e 70 75 74 20 73 74 72 65 61 6d 20 2a 2f   input stream */
11920 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 30  .  for(i=0; i<10
11930 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 72 6f  0; i++){.    Pro
11940 63 65 73 73 4f 6e 65 52 65 71 75 65 73 74 28 30  cessOneRequest(0
11950 29 3b 0a 20 20 7d 0a 20 20 50 72 6f 63 65 73 73  );.  }.  Process
11960 4f 6e 65 52 65 71 75 65 73 74 28 31 29 3b 0a 20  OneRequest(1);. 
11970 20 65 78 69 74 28 30 29 3b 0a 7d 0a               exit(0);.}.