Documentation Source Text
Hex Artifact Content
Not logged in

Artifact 1ce30878424f9708eb0b3563a394a58a483ae72ff03975bdb97f35f60f4d4da8:


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 7a 53 63 72 69 70  ipt[i] && zScrip
ce50: 74 5b 69 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20  t[i]!='/' ){.   
ce60: 20 20 20 7a 4c 69 6e 65 5b 6a 5d 20 3d 20 7a 53     zLine[j] = zS
ce70: 63 72 69 70 74 5b 69 5d 3b 0a 20 20 20 20 20 20  cript[i];.      
ce80: 69 2b 2b 3b 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a  i++; j++;.    }.
ce90: 20 20 20 20 7a 4c 69 6e 65 5b 6a 5d 20 3d 20 30      zLine[j] = 0
cea0: 3b 0a 20 20 20 20 69 66 28 20 73 74 61 74 28 7a  ;.    if( stat(z
ceb0: 4c 69 6e 65 2c 26 73 74 61 74 62 75 66 29 21 3d  Line,&statbuf)!=
cec0: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  0 ){.      int s
ced0: 74 69 6c 6c 53 65 61 72 63 68 69 6e 67 20 3d 20  tillSearching = 
cee0: 31 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  1;.      while( 
cef0: 73 74 69 6c 6c 53 65 61 72 63 68 69 6e 67 20 26  stillSearching &
cf00: 26 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  & i>0 ){.       
cf10: 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a   while( j>0 && z
cf20: 4c 69 6e 65 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29  Line[j-1]!='/' )
cf30: 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20  { j--; }.       
cf40: 20 73 74 72 63 70 79 28 26 7a 4c 69 6e 65 5b 6a   strcpy(&zLine[j
cf50: 2d 31 5d 2c 20 22 2f 6e 6f 74 2d 66 6f 75 6e 64  -1], "/not-found
cf60: 2e 68 74 6d 6c 22 29 3b 0a 20 20 20 20 20 20 20  .html");.       
cf70: 20 69 66 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c   if( stat(zLine,
cf80: 26 73 74 61 74 62 75 66 29 3d 3d 30 20 26 26 20  &statbuf)==0 && 
cf90: 53 5f 49 53 52 45 47 28 73 74 61 74 62 75 66 2e  S_ISREG(statbuf.
cfa0: 73 74 5f 6d 6f 64 65 29 0a 20 20 20 20 20 20 20  st_mode).       
cfb0: 20 20 20 20 20 26 26 20 61 63 63 65 73 73 28 7a       && access(z
cfc0: 4c 69 6e 65 2c 52 5f 4f 4b 29 3d 3d 30 20 29 7b  Line,R_OK)==0 ){
cfd0: 0a 20 20 20 20 20 20 20 20 20 20 7a 52 65 61 6c  .          zReal
cfe0: 53 63 72 69 70 74 20 3d 20 53 74 72 44 75 70 28  Script = StrDup(
cff0: 26 7a 4c 69 6e 65 5b 6a 30 5d 29 3b 0a 20 20 20  &zLine[j0]);.   
d000: 20 20 20 20 20 20 20 52 65 64 69 72 65 63 74 28         Redirect(
d010: 7a 52 65 61 6c 53 63 72 69 70 74 2c 20 31 2c 20  zRealScript, 1, 
d020: 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 2f 2a 20 4c 4f  __LINE__); /* LO
d030: 47 3a 20 72 65 64 69 72 65 63 74 20 74 6f 20 6e  G: redirect to n
d040: 6f 74 2d 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  ot-found */.    
d050: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
d060: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d070: 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20         j--;.    
d080: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
d090: 20 20 20 20 69 66 28 20 73 74 69 6c 6c 53 65 61      if( stillSea
d0a0: 72 63 68 69 6e 67 20 29 20 4e 6f 74 46 6f 75 6e  rching ) NotFoun
d0b0: 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 2f 2a 20  d(__LINE__); /* 
d0c0: 4c 4f 47 3a 20 55 52 49 20 6e 6f 74 20 66 6f 75  LOG: URI not fou
d0d0: 6e 64 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  nd */.      brea
d0e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
d0f0: 20 53 5f 49 53 52 45 47 28 73 74 61 74 62 75 66   S_ISREG(statbuf
d100: 2e 73 74 5f 6d 6f 64 65 29 20 29 7b 0a 20 20 20  .st_mode) ){.   
d110: 20 20 20 69 66 28 20 61 63 63 65 73 73 28 7a 4c     if( access(zL
d120: 69 6e 65 2c 52 5f 4f 4b 29 20 29 7b 0a 20 20 20  ine,R_OK) ){.   
d130: 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f       NotFound(__
d140: 4c 49 4e 45 5f 5f 29 3b 20 20 2f 2a 20 4c 4f 47  LINE__);  /* LOG
d150: 3a 20 46 69 6c 65 20 6e 6f 74 20 72 65 61 64 61  : File not reada
d160: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ble */.      }. 
d170: 20 20 20 20 20 7a 52 65 61 6c 53 63 72 69 70 74       zRealScript
d180: 20 3d 20 53 74 72 44 75 70 28 26 7a 4c 69 6e 65   = StrDup(&zLine
d190: 5b 6a 30 5d 29 3b 0a 20 20 20 20 20 20 62 72 65  [j0]);.      bre
d1a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
d1b0: 28 20 7a 53 63 72 69 70 74 5b 69 5d 3d 3d 30 20  ( zScript[i]==0 
d1c0: 7c 7c 20 7a 53 63 72 69 70 74 5b 69 2b 31 5d 3d  || zScript[i+1]=
d1d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 63  =0 ){.      strc
d1e0: 70 79 28 26 7a 4c 69 6e 65 5b 6a 5d 2c 22 2f 69  py(&zLine[j],"/i
d1f0: 6e 64 65 78 2e 68 74 6d 6c 22 29 3b 0a 20 20 20  ndex.html");.   
d200: 20 20 20 69 66 28 20 73 74 61 74 28 7a 4c 69 6e     if( stat(zLin
d210: 65 2c 26 73 74 61 74 62 75 66 29 21 3d 30 20 7c  e,&statbuf)!=0 |
d220: 7c 20 21 53 5f 49 53 52 45 47 28 73 74 61 74 62  | !S_ISREG(statb
d230: 75 66 2e 73 74 5f 6d 6f 64 65 29 20 0a 20 20 20  uf.st_mode) .   
d240: 20 20 20 7c 7c 20 61 63 63 65 73 73 28 7a 4c 69     || access(zLi
d250: 6e 65 2c 52 5f 4f 4b 29 20 29 7b 0a 20 20 20 20  ne,R_OK) ){.    
d260: 20 20 20 20 73 74 72 63 70 79 28 26 7a 4c 69 6e      strcpy(&zLin
d270: 65 5b 6a 5d 2c 22 2f 69 6e 64 65 78 2e 63 67 69  e[j],"/index.cgi
d280: 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ");.        if( 
d290: 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74  stat(zLine,&stat
d2a0: 62 75 66 29 21 3d 30 20 7c 7c 20 21 53 5f 49 53  buf)!=0 || !S_IS
d2b0: 52 45 47 28 73 74 61 74 62 75 66 2e 73 74 5f 6d  REG(statbuf.st_m
d2c0: 6f 64 65 29 20 0a 20 20 20 20 20 20 20 20 7c 7c  ode) .        ||
d2d0: 20 61 63 63 65 73 73 28 7a 4c 69 6e 65 2c 52 5f   access(zLine,R_
d2e0: 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OK) ){.         
d2f0: 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45   NotFound(__LINE
d300: 5f 5f 29 3b 20 2f 2a 20 4c 4f 47 3a 20 55 52 49  __); /* LOG: URI
d310: 20 69 73 20 61 20 64 69 72 65 63 74 6f 72 79 20   is a directory 
d320: 77 2f 6f 20 69 6e 64 65 78 2e 68 74 6d 6c 20 2a  w/o index.html *
d330: 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
d340: 20 20 7d 0a 20 20 20 20 20 20 7a 52 65 61 6c 53    }.      zRealS
d350: 63 72 69 70 74 20 3d 20 53 74 72 44 75 70 28 26  cript = StrDup(&
d360: 7a 4c 69 6e 65 5b 6a 30 5d 29 3b 0a 20 20 20 20  zLine[j0]);.    
d370: 20 20 69 66 28 20 7a 53 63 72 69 70 74 5b 69 5d    if( zScript[i]
d380: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
d390: 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  * If the request
d3a0: 65 64 20 55 52 4c 20 64 6f 65 73 20 6e 6f 74 20  ed URL does not 
d3b0: 65 6e 64 20 77 69 74 68 20 22 2f 22 20 62 75 74  end with "/" but
d3c0: 20 77 65 20 68 61 64 20 74 6f 0a 20 20 20 20 20   we had to.     
d3d0: 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 22 69 6e     ** append "in
d3e0: 64 65 78 2e 68 74 6d 6c 22 2c 20 74 68 65 6e 20  dex.html", then 
d3f0: 61 20 72 65 64 69 72 65 63 74 20 69 73 20 6e 65  a redirect is ne
d400: 63 65 73 73 61 72 79 2e 20 20 4f 74 68 65 72 77  cessary.  Otherw
d410: 69 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  ise.        ** n
d420: 6f 6e 65 20 6f 66 20 74 68 65 20 72 65 6c 61 74  one of the relat
d430: 69 76 65 20 55 52 4c 73 20 69 6e 20 74 68 65 20  ive URLs in the 
d440: 64 65 6c 69 76 65 72 65 64 20 64 6f 63 75 6d 65  delivered docume
d450: 6e 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  nt will be.     
d460: 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 2e 20 2a     ** correct. *
d470: 2f 0a 20 20 20 20 20 20 20 20 52 65 64 69 72 65  /.        Redire
d480: 63 74 28 7a 52 65 61 6c 53 63 72 69 70 74 2c 31  ct(zRealScript,1
d490: 2c 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 2f 2a 20 4c  ,__LINE__); /* L
d4a0: 4f 47 3a 20 72 65 64 69 72 65 63 74 20 74 6f 20  OG: redirect to 
d4b0: 61 64 64 20 74 72 61 69 6c 69 6e 67 20 2f 20 2a  add trailing / *
d4c0: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
d4d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d4e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
d4f0: 20 7a 4c 69 6e 65 5b 6a 5d 20 3d 20 7a 53 63 72   zLine[j] = zScr
d500: 69 70 74 5b 69 5d 3b 0a 20 20 20 20 69 2b 2b 3b  ipt[i];.    i++;
d510: 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c   j++;.  }.  zFil
d520: 65 20 3d 20 53 74 72 44 75 70 28 7a 4c 69 6e 65  e = StrDup(zLine
d530: 29 3b 0a 20 20 7a 50 61 74 68 49 6e 66 6f 20 3d  );.  zPathInfo =
d540: 20 53 74 72 44 75 70 28 26 7a 53 63 72 69 70 74   StrDup(&zScript
d550: 5b 69 5d 29 3b 0a 20 20 6c 65 6e 46 69 6c 65 20  [i]);.  lenFile 
d560: 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 3b  = strlen(zFile);
d570: 0a 20 20 7a 44 69 72 20 3d 20 53 74 72 44 75 70  .  zDir = StrDup
d580: 28 7a 46 69 6c 65 29 3b 0a 20 20 66 6f 72 28 69  (zFile);.  for(i
d590: 3d 73 74 72 6c 65 6e 28 7a 44 69 72 29 2d 31 3b  =strlen(zDir)-1;
d5a0: 20 69 3e 30 20 26 26 20 7a 44 69 72 5b 69 5d 21   i>0 && zDir[i]!
d5b0: 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 3b 0a 20 20  ='/'; i--){};.  
d5c0: 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20  if( i==0 ){.    
d5d0: 20 73 74 72 63 70 79 28 7a 44 69 72 2c 22 2f 22   strcpy(zDir,"/"
d5e0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
d5f0: 20 7a 44 69 72 5b 69 5d 20 3d 20 30 3b 0a 20 20   zDir[i] = 0;.  
d600: 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  }..  /* Check to
d610: 20 73 65 65 20 69 66 20 74 68 65 72 65 20 69 73   see if there is
d620: 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f   an authorizatio
d630: 6e 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  n file.  If ther
d640: 65 20 69 73 2c 0a 20 20 2a 2a 20 70 72 6f 63 65  e is,.  ** proce
d650: 73 73 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 70  ss it..  */.  sp
d660: 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 25 73  rintf(zLine, "%s
d670: 2f 2d 61 75 74 68 22 2c 20 7a 44 69 72 29 3b 0a  /-auth", zDir);.
d680: 20 20 69 66 28 20 61 63 63 65 73 73 28 7a 4c 69    if( access(zLi
d690: 6e 65 2c 52 5f 4f 4b 29 3d 3d 30 20 26 26 20 21  ne,R_OK)==0 && !
d6a0: 43 68 65 63 6b 42 61 73 69 63 41 75 74 68 6f 72  CheckBasicAuthor
d6b0: 69 7a 61 74 69 6f 6e 28 7a 4c 69 6e 65 29 20 29  ization(zLine) )
d6c0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54   return;..  /* T
d6d0: 61 6b 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  ake appropriate 
d6e0: 61 63 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66  action.  */.  if
d6f0: 28 20 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f  ( (statbuf.st_mo
d700: 64 65 20 26 20 30 31 30 30 29 3d 3d 30 31 30 30  de & 0100)==0100
d710: 20 26 26 20 61 63 63 65 73 73 28 7a 46 69 6c 65   && access(zFile
d720: 2c 58 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20  ,X_OK)==0 ){.   
d730: 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   /*.    ** The f
d740: 6f 6c 6c 6f 77 69 6e 67 73 20 73 74 61 74 69 63  ollowings static
d750: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 75   variables are u
d760: 73 65 64 20 74 6f 20 73 65 74 75 70 20 74 68 65  sed to setup the
d770: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 0a 20 20 20   environment.   
d780: 20 2a 2a 20 66 6f 72 20 74 68 65 20 43 47 49 20   ** for the CGI 
d790: 73 63 72 69 70 74 0a 20 20 20 20 2a 2f 0a 20 20  script.    */.  
d7a0: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 64    static char *d
d7b0: 65 66 61 75 6c 74 5f 70 61 74 68 20 3d 20 22 2f  efault_path = "/
d7c0: 62 69 6e 3a 2f 75 73 72 2f 62 69 6e 22 3b 0a 20  bin:/usr/bin";. 
d7d0: 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a     static char *
d7e0: 67 61 74 65 77 61 79 5f 69 6e 74 65 72 66 61 63  gateway_interfac
d7f0: 65 20 3d 20 22 43 47 49 2f 31 2e 30 22 3b 0a 20  e = "CGI/1.0";. 
d800: 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74     static struct
d810: 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a   {.      char *z
d820: 45 6e 76 4e 61 6d 65 3b 0a 20 20 20 20 20 20 63  EnvName;.      c
d830: 68 61 72 20 2a 2a 70 7a 45 6e 76 56 61 6c 75 65  har **pzEnvValue
d840: 3b 0a 20 20 20 20 7d 20 63 67 69 65 6e 76 5b 5d  ;.    } cgienv[]
d850: 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 41 55   = {.      { "AU
d860: 54 48 5f 54 59 50 45 22 2c 20 20 20 20 20 20 20  TH_TYPE",       
d870: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 41 75              &zAu
d880: 74 68 54 79 70 65 20 7d 2c 0a 20 20 20 20 20 20  thType },.      
d890: 7b 20 22 41 55 54 48 5f 43 4f 4e 54 45 4e 54 22  { "AUTH_CONTENT"
d8a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d8b0: 20 26 7a 41 75 74 68 41 72 67 20 7d 2c 0a 20 20   &zAuthArg },.  
d8c0: 20 20 20 20 7b 20 22 43 4f 4e 54 45 4e 54 5f 4c      { "CONTENT_L
d8d0: 45 4e 47 54 48 22 2c 20 20 20 20 20 20 20 20 20  ENGTH",         
d8e0: 20 20 20 20 20 26 7a 43 6f 6e 74 65 6e 74 4c 65       &zContentLe
d8f0: 6e 67 74 68 20 7d 2c 0a 20 20 20 20 20 20 7b 20  ngth },.      { 
d900: 22 43 4f 4e 54 45 4e 54 5f 54 59 50 45 22 2c 20  "CONTENT_TYPE", 
d910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
d920: 7a 43 6f 6e 74 65 6e 74 54 79 70 65 20 7d 2c 0a  zContentType },.
d930: 20 20 20 20 20 20 7b 20 22 44 4f 43 55 4d 45 4e        { "DOCUMEN
d940: 54 5f 52 4f 4f 54 22 2c 20 20 20 20 20 20 20 20  T_ROOT",        
d950: 20 20 20 20 20 20 20 26 7a 48 6f 6d 65 20 7d 2c         &zHome },
d960: 0a 20 20 20 20 20 20 7b 20 22 47 41 54 45 57 41  .      { "GATEWA
d970: 59 5f 49 4e 54 45 52 46 41 43 45 22 2c 20 20 20  Y_INTERFACE",   
d980: 20 20 20 20 20 20 20 20 26 67 61 74 65 77 61 79          &gateway
d990: 5f 69 6e 74 65 72 66 61 63 65 20 7d 2c 0a 20 20  _interface },.  
d9a0: 20 20 20 20 7b 20 22 48 54 54 50 5f 41 43 43 45      { "HTTP_ACCE
d9b0: 50 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  PT",            
d9c0: 20 20 20 20 20 26 7a 41 63 63 65 70 74 20 7d 2c       &zAccept },
d9d0: 0a 20 20 20 20 20 20 7b 20 22 48 54 54 50 5f 41  .      { "HTTP_A
d9e0: 43 43 45 50 54 5f 45 4e 43 4f 44 49 4e 47 22 2c  CCEPT_ENCODING",
d9f0: 20 20 20 20 20 20 20 20 26 7a 41 63 63 65 70 74          &zAccept
da00: 45 6e 63 6f 64 69 6e 67 20 7d 2c 0a 20 20 20 20  Encoding },.    
da10: 20 20 7b 20 22 48 54 54 50 5f 43 4f 4f 4b 49 45    { "HTTP_COOKIE
da20: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
da30: 20 20 20 26 7a 43 6f 6f 6b 69 65 20 7d 2c 0a 20     &zCookie },. 
da40: 20 20 20 20 20 7b 20 22 48 54 54 50 5f 48 4f 53       { "HTTP_HOS
da50: 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  T",             
da60: 20 20 20 20 20 20 26 7a 48 74 74 70 48 6f 73 74        &zHttpHost
da70: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 48 54 54   },.      { "HTT
da80: 50 5f 49 46 5f 4e 4f 4e 45 5f 4d 41 54 43 48 22  P_IF_NONE_MATCH"
da90: 2c 20 20 20 20 20 20 20 20 20 20 26 7a 49 66 4e  ,          &zIfN
daa0: 6f 6e 65 4d 61 74 63 68 20 7d 2c 0a 20 20 20 20  oneMatch },.    
dab0: 20 20 7b 20 22 48 54 54 50 5f 52 45 46 45 52 45    { "HTTP_REFERE
dac0: 52 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  R",             
dad0: 20 20 20 26 7a 52 65 66 65 72 65 72 20 7d 2c 0a     &zReferer },.
dae0: 20 20 20 20 20 20 7b 20 22 48 54 54 50 5f 55 53        { "HTTP_US
daf0: 45 52 5f 41 47 45 4e 54 22 2c 20 20 20 20 20 20  ER_AGENT",      
db00: 20 20 20 20 20 20 20 26 7a 41 67 65 6e 74 20 7d         &zAgent }
db10: 2c 0a 20 20 20 20 20 20 7b 20 22 50 41 54 48 22  ,.      { "PATH"
db20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
db30: 20 20 20 20 20 20 20 20 20 26 64 65 66 61 75 6c           &defaul
db40: 74 5f 70 61 74 68 20 7d 2c 0a 20 20 20 20 20 20  t_path },.      
db50: 7b 20 22 50 41 54 48 5f 49 4e 46 4f 22 2c 20 20  { "PATH_INFO",  
db60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db70: 20 26 7a 50 61 74 68 49 6e 66 6f 20 7d 2c 0a 20   &zPathInfo },. 
db80: 20 20 20 20 20 7b 20 22 51 55 45 52 59 5f 53 54       { "QUERY_ST
db90: 52 49 4e 47 22 2c 20 20 20 20 20 20 20 20 20 20  RING",          
dba0: 20 20 20 20 20 20 26 7a 51 75 65 72 79 53 74 72        &zQueryStr
dbb0: 69 6e 67 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  ing },.      { "
dbc0: 52 45 4d 4f 54 45 5f 41 44 44 52 22 2c 20 20 20  REMOTE_ADDR",   
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
dbe0: 52 65 6d 6f 74 65 41 64 64 72 20 7d 2c 0a 20 20  RemoteAddr },.  
dbf0: 20 20 20 20 7b 20 22 52 45 51 55 45 53 54 5f 4d      { "REQUEST_M
dc00: 45 54 48 4f 44 22 2c 20 20 20 20 20 20 20 20 20  ETHOD",         
dc10: 20 20 20 20 20 26 7a 4d 65 74 68 6f 64 20 7d 2c       &zMethod },
dc20: 0a 20 20 20 20 20 20 7b 20 22 52 45 51 55 45 53  .      { "REQUES
dc30: 54 5f 55 52 49 22 2c 20 20 20 20 20 20 20 20 20  T_URI",         
dc40: 20 20 20 20 20 20 20 20 26 7a 53 63 72 69 70 74          &zScript
dc50: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 52 45 4d   },.      { "REM
dc60: 4f 54 45 5f 55 53 45 52 22 2c 20 20 20 20 20 20  OTE_USER",      
dc70: 20 20 20 20 20 20 20 20 20 20 20 26 7a 52 65 6d             &zRem
dc80: 6f 74 65 55 73 65 72 20 7d 2c 0a 20 20 20 20 20  oteUser },.     
dc90: 20 7b 20 22 53 43 52 49 50 54 5f 44 49 52 45 43   { "SCRIPT_DIREC
dca0: 54 4f 52 59 22 2c 20 20 20 20 20 20 20 20 20 20  TORY",          
dcb0: 20 20 26 7a 44 69 72 20 7d 2c 0a 20 20 20 20 20    &zDir },.     
dcc0: 20 7b 20 22 53 43 52 49 50 54 5f 46 49 4c 45 4e   { "SCRIPT_FILEN
dcd0: 41 4d 45 22 2c 20 20 20 20 20 20 20 20 20 20 20  AME",           
dce0: 20 20 26 7a 46 69 6c 65 20 7d 2c 0a 20 20 20 20    &zFile },.    
dcf0: 20 20 7b 20 22 53 43 52 49 50 54 5f 4e 41 4d 45    { "SCRIPT_NAME
dd00: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
dd10: 20 20 20 26 7a 52 65 61 6c 53 63 72 69 70 74 20     &zRealScript 
dd20: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 45 52 56  },.      { "SERV
dd30: 45 52 5f 4e 41 4d 45 22 2c 20 20 20 20 20 20 20  ER_NAME",       
dd40: 20 20 20 20 20 20 20 20 20 20 26 7a 53 65 72 76            &zServ
dd50: 65 72 4e 61 6d 65 20 7d 2c 0a 20 20 20 20 20 20  erName },.      
dd60: 7b 20 22 53 45 52 56 45 52 5f 50 4f 52 54 22 2c  { "SERVER_PORT",
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd80: 20 26 7a 53 65 72 76 65 72 50 6f 72 74 20 7d 2c   &zServerPort },
dd90: 0a 20 20 20 20 20 20 7b 20 22 53 45 52 56 45 52  .      { "SERVER
dda0: 5f 50 52 4f 54 4f 43 4f 4c 22 2c 20 20 20 20 20  _PROTOCOL",     
ddb0: 20 20 20 20 20 20 20 20 26 7a 50 72 6f 74 6f 63          &zProtoc
ddc0: 6f 6c 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20  ol },.    };.   
ddd0: 20 63 68 61 72 20 2a 7a 42 61 73 65 46 69 6c 65   char *zBaseFile
dde0: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  name;         /*
ddf0: 20 46 69 6c 65 6e 61 6d 65 20 77 69 74 68 6f 75   Filename withou
de00: 74 20 64 69 72 65 63 74 6f 72 79 20 70 72 65 66  t directory pref
de10: 69 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 65  ix */.    int se
de20: 65 6e 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 20  enContentLength 
de30: 3d 20 30 3b 20 20 20 2f 2a 20 54 72 75 65 20 69  = 0;   /* True i
de40: 66 20 43 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74 68  f Content-length
de50: 3a 20 68 65 61 64 65 72 20 73 65 65 6e 20 2a 2f  : header seen */
de60: 0a 20 20 20 20 69 6e 74 20 6e 52 65 73 20 3d 20  .    int nRes = 
de70: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
de80: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 70 61    /* Bytes of pa
de90: 79 6c 6f 61 64 20 2a 2f 0a 20 20 20 20 69 6e 74  yload */.    int
dea0: 20 6e 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 20 20   nMalloc = 0;   
deb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
dec0: 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  es of space allo
ded0: 63 61 74 65 64 20 74 6f 20 61 52 65 73 20 2a 2f  cated to aRes */
dee0: 0a 20 20 20 20 63 68 61 72 20 2a 61 52 65 73 20  .    char *aRes 
def0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
df00: 20 20 2f 2a 20 50 61 79 6c 6f 61 64 20 2a 2f 0a    /* Payload */.
df10: 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 73 20 65  .    /* If its e
df20: 78 65 63 75 74 61 62 6c 65 2c 20 69 74 20 6d 75  xecutable, it mu
df30: 73 74 20 62 65 20 61 20 43 47 49 20 70 72 6f 67  st be a CGI prog
df40: 72 61 6d 2e 20 20 53 74 61 72 74 20 62 79 0a 20  ram.  Start by. 
df50: 20 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 64     ** changing d
df60: 69 72 65 63 74 6f 72 69 65 73 20 74 6f 20 74 68  irectories to th
df70: 65 20 64 69 72 65 63 74 6f 72 79 20 68 6f 6c 64  e directory hold
df80: 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d 2e  ing the program.
df90: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
dfa0: 63 68 64 69 72 28 7a 44 69 72 29 20 29 7b 0a 20  chdir(zDir) ){. 
dfb0: 20 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 31       char zBuf[1
dfc0: 30 30 30 5d 3b 0a 20 20 20 20 20 20 4d 61 6c 66  000];.      Malf
dfd0: 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f  unction(__LINE__
dfe0: 2c 20 2f 2a 20 4c 4f 47 3a 20 63 68 64 69 72 28  , /* LOG: chdir(
dff0: 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20  ) failed */.    
e000: 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63         "cannot c
e010: 68 64 69 72 20 74 6f 20 5b 25 73 5d 20 66 72 6f  hdir to [%s] fro
e020: 6d 20 5b 25 73 5d 22 2c 20 0a 20 20 20 20 20 20  m [%s]", .      
e030: 20 20 20 20 20 7a 44 69 72 2c 20 67 65 74 63 77       zDir, getcw
e040: 64 28 7a 42 75 66 2c 39 39 39 29 29 3b 0a 20 20  d(zBuf,999));.  
e050: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 75    }..    /* Setu
e060: 70 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e  p the environmen
e070: 74 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e  t appropriately.
e080: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
e090: 69 3d 30 3b 20 69 3c 28 69 6e 74 29 28 73 69 7a  i=0; i<(int)(siz
e0a0: 65 6f 66 28 63 67 69 65 6e 76 29 2f 73 69 7a 65  eof(cgienv)/size
e0b0: 6f 66 28 63 67 69 65 6e 76 5b 30 5d 29 29 3b 20  of(cgienv[0])); 
e0c0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
e0d0: 2a 63 67 69 65 6e 76 5b 69 5d 2e 70 7a 45 6e 76  *cgienv[i].pzEnv
e0e0: 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 20  Value ){.       
e0f0: 20 53 65 74 45 6e 76 28 63 67 69 65 6e 76 5b 69   SetEnv(cgienv[i
e100: 5d 2e 7a 45 6e 76 4e 61 6d 65 2c 2a 63 67 69 65  ].zEnvName,*cgie
e110: 6e 76 5b 69 5d 2e 70 7a 45 6e 76 56 61 6c 75 65  nv[i].pzEnvValue
e120: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
e130: 0a 20 20 20 20 69 66 28 20 75 73 65 48 74 74 70  .    if( useHttp
e140: 73 20 29 7b 0a 20 20 20 20 20 20 70 75 74 65 6e  s ){.      puten
e150: 76 28 22 48 54 54 50 53 3d 6f 6e 22 29 3b 0a 20  v("HTTPS=on");. 
e160: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
e170: 20 2a 2a 20 41 62 6f 72 74 20 77 69 74 68 20 61   ** Abort with a
e180: 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 43  n error if the C
e190: 47 49 20 73 63 72 69 70 74 20 69 73 20 77 72 69  GI script is wri
e1a0: 74 61 62 6c 65 20 62 79 20 61 6e 79 6f 6e 65 20  table by anyone 
e1b0: 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  other.    ** tha
e1c0: 6e 20 69 74 73 20 6f 77 6e 65 72 2e 0a 20 20 20  n its owner..   
e1d0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 61 74   */.    if( stat
e1e0: 62 75 66 2e 73 74 5f 6d 6f 64 65 20 26 20 30 30  buf.st_mode & 00
e1f0: 32 32 20 29 7b 0a 20 20 20 20 20 20 43 67 69 53  22 ){.      CgiS
e200: 63 72 69 70 74 57 72 69 74 61 62 6c 65 28 29 3b  criptWritable();
e210: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46  .    }..    /* F
e220: 6f 72 20 74 68 65 20 50 4f 53 54 20 6d 65 74 68  or the POST meth
e230: 6f 64 20 61 6c 6c 20 69 6e 70 75 74 20 68 61 73  od all input has
e240: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
e250: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
e260: 65 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 77 65 20  e,.    ** so we 
e270: 68 61 76 65 20 74 6f 20 72 65 64 69 72 65 63 74  have to redirect
e280: 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 43 47   input to the CG
e290: 49 20 73 63 72 69 70 74 20 66 72 6f 6d 20 74 68  I script from th
e2a0: 61 74 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  at file..    */.
e2b0: 20 20 20 20 69 66 28 20 7a 4d 65 74 68 6f 64 5b      if( zMethod[
e2c0: 30 5d 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20  0]=='P' ){.     
e2d0: 20 69 66 28 20 64 75 70 28 30 29 3c 30 20 29 7b   if( dup(0)<0 ){
e2e0: 0a 20 20 20 20 20 20 20 20 4d 61 6c 66 75 6e 63  .        Malfunc
e2f0: 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 20  tion(__LINE__,  
e300: 2f 2a 20 4c 4f 47 3a 20 64 75 70 28 29 20 66 61  /* LOG: dup() fa
e310: 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  iled */.        
e320: 20 20 20 20 20 20 20 20 20 20 20 20 22 55 6e 61              "Una
e330: 62 6c 65 20 74 6f 20 64 75 70 6c 69 63 61 74 69  ble to duplicati
e340: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
e350: 6f 72 20 30 22 29 3b 0a 20 20 20 20 20 20 7d 0a  or 0");.      }.
e360: 20 20 20 20 20 20 63 6c 6f 73 65 28 30 29 3b 0a        close(0);.
e370: 20 20 20 20 20 20 6f 70 65 6e 28 7a 54 6d 70 4e        open(zTmpN
e380: 61 6d 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20  am, O_RDONLY);. 
e390: 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d     }..    for(i=
e3a0: 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2d 31 3b  strlen(zFile)-1;
e3b0: 20 69 3e 3d 30 20 26 26 20 7a 46 69 6c 65 5b 69   i>=0 && zFile[i
e3c0: 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20  ]!='/'; i--){}. 
e3d0: 20 20 20 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65     zBaseFilename
e3e0: 20 3d 20 26 7a 46 69 6c 65 5b 69 2b 31 5d 3b 0a   = &zFile[i+1];.
e3f0: 20 20 20 20 69 66 28 20 69 3e 3d 30 20 26 26 20      if( i>=0 && 
e400: 73 74 72 6e 63 6d 70 28 7a 42 61 73 65 46 69 6c  strncmp(zBaseFil
e410: 65 6e 61 6d 65 2c 22 6e 70 68 2d 22 2c 34 29 3d  ename,"nph-",4)=
e420: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
e430: 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  f the name of th
e440: 65 20 43 47 49 20 73 63 72 69 70 74 20 62 65 67  e CGI script beg
e450: 69 6e 73 20 77 69 74 68 20 22 6e 70 68 2d 22 20  ins with "nph-" 
e460: 74 68 65 6e 20 77 65 20 61 72 65 0a 20 20 20 20  then we are.    
e470: 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74    ** dealing wit
e480: 68 20 61 20 22 6e 6f 6e 2d 70 61 72 73 65 64 20  h a "non-parsed 
e490: 68 65 61 64 65 72 73 22 20 43 47 49 20 73 63 72  headers" CGI scr
e4a0: 69 70 74 2e 20 20 4a 75 73 74 20 65 78 65 63 28  ipt.  Just exec(
e4b0: 29 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 64 69  ).      ** it di
e4c0: 72 65 63 74 6c 79 20 61 6e 64 20 6c 65 74 20 69  rectly and let i
e4d0: 74 20 68 61 6e 64 6c 65 20 61 6c 6c 20 69 74 73  t handle all its
e4e0: 20 6f 77 6e 20 68 65 61 64 65 72 20 67 65 6e 65   own header gene
e4f0: 72 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  ration..      */
e500: 0a 20 20 20 20 20 20 65 78 65 63 6c 28 7a 42 61  .      execl(zBa
e510: 73 65 46 69 6c 65 6e 61 6d 65 2c 7a 42 61 73 65  seFilename,zBase
e520: 46 69 6c 65 6e 61 6d 65 2c 28 63 68 61 72 2a 29  Filename,(char*)
e530: 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4e 4f 54  0);.      /* NOT
e540: 45 3a 20 4e 6f 20 6c 6f 67 20 65 6e 74 72 79 20  E: No log entry 
e550: 77 72 69 74 74 65 6e 20 66 6f 72 20 6e 70 68 2d  written for nph-
e560: 20 73 63 72 69 70 74 73 20 2a 2f 0a 20 20 20 20   scripts */.    
e570: 20 20 65 78 69 74 28 30 29 3b 0a 20 20 20 20 7d    exit(0);.    }
e580: 0a 0a 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68  ..    /* Fall th
e590: 72 75 20 74 6f 20 68 65 72 65 20 6f 6e 6c 79 20  ru to here only 
e5a0: 69 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  if this process 
e5b0: 28 74 68 65 20 73 65 72 76 65 72 29 20 69 73 20  (the server) is 
e5c0: 67 6f 69 6e 67 0a 20 20 20 20 2a 2a 20 74 6f 20  going.    ** to 
e5d0: 72 65 61 64 20 61 6e 64 20 61 75 67 6d 65 6e 74  read and augment
e5e0: 20 74 68 65 20 68 65 61 64 65 72 20 73 65 6e 74   the header sent
e5f0: 20 62 61 63 6b 20 62 79 20 74 68 65 20 43 47 49   back by the CGI
e600: 20 70 72 6f 63 65 73 73 2e 0a 20 20 20 20 2a 2a   process..    **
e610: 20 4f 70 65 6e 20 61 20 70 69 70 65 20 74 6f 20   Open a pipe to 
e620: 72 65 63 65 69 76 65 20 74 68 65 20 6f 75 74 70  receive the outp
e630: 75 74 20 66 72 6f 6d 20 74 68 65 20 43 47 49 20  ut from the CGI 
e640: 70 72 6f 63 65 73 73 2e 20 20 54 68 65 6e 0a 20  process.  Then. 
e650: 20 20 20 2a 2a 20 66 6f 72 6b 20 74 68 65 20 43     ** fork the C
e660: 47 49 20 70 72 6f 63 65 73 73 2e 20 20 4f 6e 63  GI process.  Onc
e670: 65 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  e everything is 
e680: 64 6f 6e 65 2c 20 77 65 20 73 68 6f 75 6c 64 20  done, we should 
e690: 62 65 0a 20 20 20 20 2a 2a 20 61 62 6c 65 20 74  be.    ** able t
e6a0: 6f 20 72 65 61 64 20 74 68 65 20 6f 75 74 70 75  o read the outpu
e6b0: 74 20 6f 66 20 43 47 49 20 6f 6e 20 74 68 65 20  t of CGI on the 
e6c0: 22 69 6e 22 20 73 74 72 65 61 6d 2e 0a 20 20 20  "in" stream..   
e6d0: 20 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20   */.    {.      
e6e0: 69 6e 74 20 70 78 5b 32 5d 3b 0a 20 20 20 20 20  int px[2];.     
e6f0: 20 69 66 28 20 70 69 70 65 28 70 78 29 20 29 7b   if( pipe(px) ){
e700: 0a 20 20 20 20 20 20 20 20 4d 61 6c 66 75 6e 63  .        Malfunc
e710: 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 2f  tion(__LINE__, /
e720: 2a 20 4c 4f 47 3a 20 70 69 70 65 28 29 20 66 61  * LOG: pipe() fa
e730: 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  iled */.        
e740: 20 20 20 20 20 20 20 20 20 20 20 20 22 55 6e 61              "Una
e750: 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  ble to create a 
e760: 70 69 70 65 20 66 6f 72 20 74 68 65 20 43 47 49  pipe for the CGI
e770: 20 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20   program");.    
e780: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 66 6f    }.      if( fo
e790: 72 6b 28 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rk()==0 ){.     
e7a0: 20 20 20 63 6c 6f 73 65 28 70 78 5b 30 5d 29 3b     close(px[0]);
e7b0: 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 31  .        close(1
e7c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  );.        if( d
e7d0: 75 70 28 70 78 5b 31 5d 29 21 3d 31 20 29 7b 0a  up(px[1])!=1 ){.
e7e0: 20 20 20 20 20 20 20 20 20 20 4d 61 6c 66 75 6e            Malfun
e7f0: 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20  ction(__LINE__, 
e800: 2f 2a 20 4c 4f 47 3a 20 64 75 70 28 29 20 66 61  /* LOG: dup() fa
e810: 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  iled */.        
e820: 20 20 20 20 20 20 20 20 20 22 55 6e 61 62 6c 65           "Unable
e830: 20 74 6f 20 64 75 70 6c 69 63 61 74 65 20 66 69   to duplicate fi
e840: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 25 64  le descriptor %d
e850: 20 74 6f 20 31 22 2c 0a 20 20 20 20 20 20 20 20   to 1",.        
e860: 20 20 20 20 20 20 20 20 20 70 78 5b 31 5d 29 3b           px[1]);
e870: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e880: 20 20 20 63 6c 6f 73 65 28 70 78 5b 31 5d 29 3b     close(px[1]);
e890: 0a 20 20 20 20 20 20 20 20 65 78 65 63 6c 28 7a  .        execl(z
e8a0: 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c 20 7a 42  BaseFilename, zB
e8b0: 61 73 65 46 69 6c 65 6e 61 6d 65 2c 20 28 63 68  aseFilename, (ch
e8c0: 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20  ar*)0);.        
e8d0: 65 78 69 74 28 30 29 3b 0a 20 20 20 20 20 20 7d  exit(0);.      }
e8e0: 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 70 78 5b  .      close(px[
e8f0: 31 5d 29 3b 0a 20 20 20 20 20 20 69 6e 20 3d 20  1]);.      in = 
e900: 66 64 6f 70 65 6e 28 70 78 5b 30 5d 2c 20 22 72  fdopen(px[0], "r
e910: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ");.    }.    if
e920: 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ( in==0 ){.     
e930: 20 43 67 69 45 72 72 6f 72 28 29 3b 0a 20 20 20   CgiError();.   
e940: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20   }..    /* Read 
e950: 61 6e 64 20 70 72 6f 63 65 73 73 20 74 68 65 20  and process the 
e960: 66 69 72 73 74 20 6c 69 6e 65 20 6f 66 20 74 68  first line of th
e970: 65 20 68 65 61 64 65 72 20 72 65 74 75 72 6e 65  e header returne
e980: 64 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a 20  d by the.    ** 
e990: 43 47 49 20 73 63 72 69 70 74 2e 0a 20 20 20 20  CGI script..    
e9a0: 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 65 54 69  */.    if( useTi
e9b0: 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d 28 31 35  meout ) alarm(15
e9c0: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 66 67  );.    while( fg
e9d0: 65 74 73 28 7a 4c 69 6e 65 2c 73 69 7a 65 6f 66  ets(zLine,sizeof
e9e0: 28 7a 4c 69 6e 65 29 2c 69 6e 29 20 26 26 20 21  (zLine),in) && !
e9f0: 69 73 73 70 61 63 65 28 7a 4c 69 6e 65 5b 30 5d  isspace(zLine[0]
ea00: 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ) ){.      if( s
ea10: 74 72 6e 63 61 73 65 63 6d 70 28 7a 4c 69 6e 65  trncasecmp(zLine
ea20: 2c 22 4c 6f 63 61 74 69 6f 6e 3a 22 2c 39 29 3d  ,"Location:",9)=
ea30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 53 74  =0 ){.        St
ea40: 61 72 74 52 65 73 70 6f 6e 73 65 28 22 33 30 32  artResponse("302
ea50: 20 52 65 64 69 72 65 63 74 22 29 3b 0a 20 20 20   Redirect");.   
ea60: 20 20 20 20 20 52 65 6d 6f 76 65 4e 65 77 6c 69       RemoveNewli
ea70: 6e 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20  ne(zLine);.     
ea80: 20 20 20 7a 20 3d 20 26 7a 4c 69 6e 65 5b 31 30     z = &zLine[10
ea90: 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ];.        while
eaa0: 28 20 69 73 73 70 61 63 65 28 2a 7a 29 20 29 7b  ( isspace(*z) ){
eab0: 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20   z++; }.        
eac0: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22  nOut += printf("
ead0: 4c 6f 63 61 74 69 6f 6e 3a 20 25 73 5c 72 5c 6e  Location: %s\r\n
eae0: 22 2c 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ",z);.      }els
eaf0: 65 20 69 66 28 20 73 74 72 6e 63 61 73 65 63 6d  e if( strncasecm
eb00: 70 28 7a 4c 69 6e 65 2c 22 53 74 61 74 75 73 3a  p(zLine,"Status:
eb10: 22 2c 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ",7)==0 ){.     
eb20: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
eb30: 20 20 66 6f 72 28 69 3d 37 3b 20 69 73 73 70 61    for(i=7; isspa
eb40: 63 65 28 7a 4c 69 6e 65 5b 69 5d 29 3b 20 69 2b  ce(zLine[i]); i+
eb50: 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 6e 4f 75  +){}.        nOu
eb60: 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 25 73 20  t += printf("%s 
eb70: 25 73 22 2c 20 7a 50 72 6f 74 6f 63 6f 6c 2c 20  %s", zProtocol, 
eb80: 26 7a 4c 69 6e 65 5b 69 5d 29 3b 0a 20 20 20 20  &zLine[i]);.    
eb90: 20 20 20 20 73 74 72 6e 63 70 79 28 7a 52 65 70      strncpy(zRep
eba0: 6c 79 53 74 61 74 75 73 2c 20 26 7a 4c 69 6e 65  lyStatus, &zLine
ebb0: 5b 69 5d 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  [i], 3);.       
ebc0: 20 7a 52 65 70 6c 79 53 74 61 74 75 73 5b 33 5d   zReplyStatus[3]
ebd0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 74   = 0;.        st
ebe0: 61 74 75 73 53 65 6e 74 20 3d 20 31 3b 0a 20 20  atusSent = 1;.  
ebf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ec00: 20 20 20 69 66 28 20 73 74 72 6e 63 61 73 65 63     if( strncasec
ec10: 6d 70 28 7a 4c 69 6e 65 2c 20 22 43 6f 6e 74 65  mp(zLine, "Conte
ec20: 6e 74 2d 6c 65 6e 67 74 68 3a 22 2c 20 31 34 29  nt-length:", 14)
ec30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
ec40: 20 73 65 65 6e 43 6f 6e 74 65 6e 74 4c 65 6e 67   seenContentLeng
ec50: 74 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  th = 1;.        
ec60: 7d 0a 20 20 20 20 20 20 20 20 53 74 61 72 74 52  }.        StartR
ec70: 65 73 70 6f 6e 73 65 28 22 32 30 30 20 4f 4b 22  esponse("200 OK"
ec80: 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20  );.        nOut 
ec90: 2b 3d 20 70 72 69 6e 74 66 28 22 25 73 22 2c 7a  += printf("%s",z
eca0: 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Line);.      }. 
ecb0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70     }..    /* Cop
ecc0: 79 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73  y everything els
ecd0: 65 20 74 68 72 75 20 77 69 74 68 6f 75 74 20 63  e thru without c
ece0: 68 61 6e 67 65 20 6f 72 20 61 6e 61 6c 79 73 69  hange or analysi
ecf0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 53 74  s..    */.    St
ed00: 61 72 74 52 65 73 70 6f 6e 73 65 28 22 32 30 30  artResponse("200
ed10: 20 4f 4b 22 29 3b 0a 20 20 20 20 69 66 28 20 75   OK");.    if( u
ed20: 73 65 54 69 6d 65 6f 75 74 20 29 20 61 6c 61 72  seTimeout ) alar
ed30: 6d 28 36 30 2a 35 29 3b 0a 20 20 20 20 69 66 28  m(60*5);.    if(
ed40: 20 73 65 65 6e 43 6f 6e 74 65 6e 74 4c 65 6e 67   seenContentLeng
ed50: 74 68 20 29 7b 0a 20 20 20 20 20 20 6e 4f 75 74  th ){.      nOut
ed60: 20 2b 3d 20 70 72 69 6e 74 66 28 22 25 73 22 2c   += printf("%s",
ed70: 20 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 77   zLine);.      w
ed80: 68 69 6c 65 28 20 28 63 20 3d 20 67 65 74 63 28  hile( (c = getc(
ed90: 69 6e 29 29 21 3d 45 4f 46 20 29 7b 0a 20 20 20  in))!=EOF ){.   
eda0: 20 20 20 20 20 70 75 74 63 28 63 2c 73 74 64 6f       putc(c,stdo
edb0: 75 74 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75  ut);.        nOu
edc0: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
edd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52   }else{.      nR
ede0: 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 4d  es = 0;.      nM
edf0: 61 6c 6c 6f 63 20 3d 20 31 30 30 30 3b 0a 20 20  alloc = 1000;.  
ee00: 20 20 20 20 61 52 65 73 20 3d 20 6d 61 6c 6c 6f      aRes = mallo
ee10: 63 28 6e 4d 61 6c 6c 6f 63 2b 31 29 3b 0a 20 20  c(nMalloc+1);.  
ee20: 20 20 20 20 69 66 28 20 61 52 65 73 3d 3d 30 20      if( aRes==0 
ee30: 29 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f  ) Malfunction(__
ee40: 4c 49 4e 45 5f 5f 2c 22 4f 75 74 20 6f 66 20 6d  LINE__,"Out of m
ee50: 65 6d 6f 72 79 3a 20 25 64 20 62 79 74 65 73 22  emory: %d bytes"
ee60: 2c 20 6e 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  , nMalloc);.    
ee70: 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 67 65    while( (c = ge
ee80: 74 63 28 69 6e 29 29 21 3d 45 4f 46 20 29 7b 0a  tc(in))!=EOF ){.
ee90: 20 20 20 20 20 20 20 20 69 66 28 20 6e 52 65 73          if( nRes
eea0: 3e 3d 6e 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20  >=nMalloc ){.   
eeb0: 20 20 20 20 20 20 20 6e 4d 61 6c 6c 6f 63 20 3d         nMalloc =
eec0: 20 6e 4d 61 6c 6c 6f 63 2a 32 3b 0a 20 20 20 20   nMalloc*2;.    
eed0: 20 20 20 20 20 20 61 52 65 73 20 3d 20 72 65 61        aRes = rea
eee0: 6c 6c 6f 63 28 61 52 65 73 2c 20 6e 4d 61 6c 6c  lloc(aRes, nMall
eef0: 6f 63 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20  oc+1);.         
ef00: 20 69 66 28 20 61 52 65 73 3d 3d 30 20 29 7b 0a   if( aRes==0 ){.
ef10: 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 61 6c               Mal
ef20: 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f  function(__LINE_
ef30: 5f 2c 20 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72  _, "Out of memor
ef40: 79 3a 20 25 64 20 62 79 74 65 73 22 2c 20 6e 4d  y: %d bytes", nM
ef50: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20  alloc);.        
ef60: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
ef70: 20 20 20 20 20 20 61 52 65 73 5b 6e 52 65 73 2b        aRes[nRes+
ef80: 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a  +] = c;.      }.
ef90: 20 20 20 20 20 20 61 52 65 73 5b 6e 52 65 73 5d        aRes[nRes]
efa0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 4f 75 74   = 0;.      nOut
efb0: 20 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 74   += printf("Cont
efc0: 65 6e 74 2d 6c 65 6e 67 74 68 3a 20 25 64 5c 72  ent-length: %d\r
efd0: 5c 6e 5c 72 5c 6e 25 73 22 2c 20 6e 52 65 73 2c  \n\r\n%s", nRes,
efe0: 20 61 52 65 73 29 3b 0a 20 20 20 20 20 20 66 72   aRes);.      fr
eff0: 65 65 28 61 52 65 73 29 3b 0a 20 20 20 20 7d 0a  ee(aRes);.    }.
f000: 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
f010: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 6f 75 6e    }else if( coun
f020: 74 53 6c 61 73 68 65 73 28 7a 52 65 61 6c 53 63  tSlashes(zRealSc
f030: 72 69 70 74 29 21 3d 63 6f 75 6e 74 53 6c 61 73  ript)!=countSlas
f040: 68 65 73 28 7a 53 63 72 69 70 74 29 20 29 7b 0a  hes(zScript) ){.
f050: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65      /* If the re
f060: 71 75 65 73 74 20 55 52 49 20 66 6f 72 20 73 74  quest URI for st
f070: 61 74 69 63 20 63 6f 6e 74 65 6e 74 20 63 6f 6e  atic content con
f080: 74 61 69 6e 73 20 6d 61 74 65 72 69 61 6c 20 70  tains material p
f090: 61 73 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 61  ast the.    ** a
f0a0: 63 74 75 61 6c 20 63 6f 6e 74 65 6e 74 20 66 69  ctual content fi
f0b0: 6c 65 20 6e 61 6d 65 2c 20 72 65 70 6f 72 74 20  le name, report 
f0c0: 74 68 61 74 20 61 73 20 61 20 34 30 34 20 65 72  that as a 404 er
f0d0: 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 4e 6f 74 46  ror. */.    NotF
f0e0: 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20  ound(__LINE__); 
f0f0: 2f 2a 20 4c 4f 47 3a 20 45 78 63 65 73 73 20 55  /* LOG: Excess U
f100: 52 49 20 63 6f 6e 74 65 6e 74 20 70 61 73 74 20  RI content past 
f110: 73 74 61 74 69 63 20 66 69 6c 65 20 6e 61 6d 65  static file name
f120: 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
f130: 20 2f 2a 20 49 66 20 69 74 20 69 73 6e 27 74 20   /* If it isn't 
f140: 65 78 65 63 75 74 61 62 6c 65 20 74 68 65 6e 20  executable then 
f150: 69 74 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 61  it.    ** must a
f160: 20 73 69 6d 70 6c 65 20 66 69 6c 65 20 74 68 61   simple file tha
f170: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63 6f  t needs to be co
f180: 70 69 65 64 20 74 6f 20 6f 75 74 70 75 74 2e 0a  pied to output..
f190: 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74      */.    const
f1a0: 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 54   char *zContentT
f1b0: 79 70 65 20 3d 20 47 65 74 4d 69 6d 65 54 79 70  ype = GetMimeTyp
f1c0: 65 28 7a 46 69 6c 65 2c 20 6c 65 6e 46 69 6c 65  e(zFile, lenFile
f1d0: 29 3b 0a 20 20 20 20 63 68 61 72 20 7a 45 54 61  );.    char zETa
f1e0: 67 5b 31 30 30 5d 3b 0a 0a 20 20 20 20 69 66 28  g[100];..    if(
f1f0: 20 7a 54 6d 70 4e 61 6d 20 29 20 75 6e 6c 69 6e   zTmpNam ) unlin
f200: 6b 28 7a 54 6d 70 4e 61 6d 29 3b 0a 20 20 20 20  k(zTmpNam);.    
f210: 73 70 72 69 6e 74 66 28 7a 45 54 61 67 2c 20 22  sprintf(zETag, "
f220: 6d 25 78 73 25 78 22 2c 20 28 69 6e 74 29 73 74  m%xs%x", (int)st
f230: 61 74 62 75 66 2e 73 74 5f 6d 74 69 6d 65 2c 20  atbuf.st_mtime, 
f240: 28 69 6e 74 29 73 74 61 74 62 75 66 2e 73 74 5f  (int)statbuf.st_
f250: 73 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 43  size);.    if( C
f260: 6f 6d 70 61 72 65 45 74 61 67 73 28 7a 49 66 4e  ompareEtags(zIfN
f270: 6f 6e 65 4d 61 74 63 68 2c 7a 45 54 61 67 29 3d  oneMatch,zETag)=
f280: 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 74 61 72  =0 ){.      Star
f290: 74 52 65 73 70 6f 6e 73 65 28 22 33 30 34 20 4e  tResponse("304 N
f2a0: 6f 74 20 4d 6f 64 69 66 69 65 64 22 29 3b 0a 20  ot Modified");. 
f2b0: 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69       nOut += pri
f2c0: 6e 74 66 28 22 43 61 63 68 65 2d 43 6f 6e 74 72  ntf("Cache-Contr
f2d0: 6f 6c 3a 20 6d 61 78 2d 61 67 65 3d 25 64 5c 72  ol: max-age=%d\r
f2e0: 5c 6e 22 2c 20 6d 78 41 67 65 29 3b 0a 20 20 20  \n", mxAge);.   
f2f0: 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74     nOut += print
f300: 66 28 22 45 54 61 67 3a 20 5c 22 25 73 5c 22 5c  f("ETag: \"%s\"\
f310: 72 5c 6e 22 2c 20 7a 45 54 61 67 29 3b 0a 20 20  r\n", zETag);.  
f320: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
f330: 74 66 28 22 5c 72 5c 6e 22 29 3b 0a 20 20 20 20  tf("\r\n");.    
f340: 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29    fflush(stdout)
f350: 3b 0a 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45  ;.      MakeLogE
f360: 6e 74 72 79 28 30 2c 20 5f 5f 4c 49 4e 45 5f 5f  ntry(0, __LINE__
f370: 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 45 54 61 67  );  /* LOG: ETag
f380: 20 43 61 63 68 65 20 48 69 74 20 2a 2f 0a 20 20   Cache Hit */.  
f390: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
f3a0: 7d 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e  }.    in = fopen
f3b0: 28 7a 46 69 6c 65 2c 22 72 22 29 3b 0a 20 20 20  (zFile,"r");.   
f3c0: 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 4e 6f 74   if( in==0 ) Not
f3d0: 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b  Found(__LINE__);
f3e0: 20 2f 2a 20 4c 4f 47 3a 20 66 6f 70 65 6e 28 29   /* LOG: fopen()
f3f0: 20 66 61 69 6c 65 64 20 66 6f 72 20 73 74 61 74   failed for stat
f400: 69 63 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ic content */.  
f410: 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28    StartResponse(
f420: 22 32 30 30 20 4f 4b 22 29 3b 0a 20 20 20 20 6e  "200 OK");.    n
f430: 4f 75 74 20 2b 3d 20 44 61 74 65 54 61 67 28 22  Out += DateTag("
f440: 4c 61 73 74 2d 4d 6f 64 69 66 69 65 64 22 2c 20  Last-Modified", 
f450: 73 74 61 74 62 75 66 2e 73 74 5f 6d 74 69 6d 65  statbuf.st_mtime
f460: 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70  );.    nOut += p
f470: 72 69 6e 74 66 28 22 43 61 63 68 65 2d 43 6f 6e  rintf("Cache-Con
f480: 74 72 6f 6c 3a 20 6d 61 78 2d 61 67 65 3d 25 64  trol: max-age=%d
f490: 5c 72 5c 6e 22 2c 20 6d 78 41 67 65 29 3b 0a 20  \r\n", mxAge);. 
f4a0: 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74     nOut += print
f4b0: 66 28 22 45 54 61 67 3a 20 5c 22 25 73 5c 22 5c  f("ETag: \"%s\"\
f4c0: 72 5c 6e 22 2c 20 7a 45 54 61 67 29 3b 0a 20 20  r\n", zETag);.  
f4d0: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
f4e0: 28 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20  ("Content-type: 
f4f0: 25 73 5c 72 5c 6e 22 2c 7a 43 6f 6e 74 65 6e 74  %s\r\n",zContent
f500: 54 79 70 65 29 3b 0a 20 20 20 20 6e 4f 75 74 20  Type);.    nOut 
f510: 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 74 65  += printf("Conte
f520: 6e 74 2d 6c 65 6e 67 74 68 3a 20 25 64 5c 72 5c  nt-length: %d\r\
f530: 6e 5c 72 5c 6e 22 2c 28 69 6e 74 29 73 74 61 74  n\r\n",(int)stat
f540: 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20  buf.st_size);.  
f550: 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29    fflush(stdout)
f560: 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  ;.    if( strcmp
f570: 28 7a 4d 65 74 68 6f 64 2c 22 48 45 41 44 22 29  (zMethod,"HEAD")
f580: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4d 61 6b  ==0 ){.      Mak
f590: 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 5f 5f 4c  eLogEntry(0, __L
f5a0: 49 4e 45 5f 5f 29 3b 20 2f 2a 20 4c 4f 47 3a 20  INE__); /* LOG: 
f5b0: 4e 6f 72 6d 61 6c 20 48 45 41 44 20 72 65 70 6c  Normal HEAD repl
f5c0: 79 20 2a 2f 0a 20 20 20 20 20 20 66 63 6c 6f 73  y */.      fclos
f5d0: 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 66 66 6c  e(in);.      ffl
f5e0: 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20  ush(stdout);.   
f5f0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
f600: 0a 20 20 20 20 69 66 28 20 75 73 65 54 69 6d 65  .    if( useTime
f610: 6f 75 74 20 29 20 61 6c 61 72 6d 28 33 30 20 2b  out ) alarm(30 +
f620: 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65   statbuf.st_size
f630: 2f 31 30 30 30 29 3b 0a 23 69 66 64 65 66 20 6c  /1000);.#ifdef l
f640: 69 6e 75 78 0a 20 20 20 20 7b 0a 20 20 20 20 20  inux.    {.     
f650: 20 6f 66 66 5f 74 20 6f 66 66 73 65 74 20 3d 20   off_t offset = 
f660: 30 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d  0;.      nOut +=
f670: 20 73 65 6e 64 66 69 6c 65 28 66 69 6c 65 6e 6f   sendfile(fileno
f680: 28 73 74 64 6f 75 74 29 2c 20 66 69 6c 65 6e 6f  (stdout), fileno
f690: 28 69 6e 29 2c 20 26 6f 66 66 73 65 74 2c 20 73  (in), &offset, s
f6a0: 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b  tatbuf.st_size);
f6b0: 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
f6c0: 20 77 68 69 6c 65 28 20 28 63 20 3d 20 67 65 74   while( (c = get
f6d0: 63 28 69 6e 29 29 21 3d 45 4f 46 20 29 7b 0a 20  c(in))!=EOF ){. 
f6e0: 20 20 20 20 20 70 75 74 63 28 63 2c 73 74 64 6f       putc(c,stdo
f6f0: 75 74 29 3b 0a 20 20 20 20 20 20 6e 4f 75 74 2b  ut);.      nOut+
f700: 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  +;.    }.#endif.
f710: 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
f720: 20 20 7d 0a 20 20 66 66 6c 75 73 68 28 73 74 64    }.  fflush(std
f730: 6f 75 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45  out);.  MakeLogE
f740: 6e 74 72 79 28 30 2c 20 5f 5f 4c 49 4e 45 5f 5f  ntry(0, __LINE__
f750: 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 4e 6f 72 6d  );  /* LOG: Norm
f760: 61 6c 20 72 65 70 6c 79 20 2a 2f 0a 0a 20 20 2f  al reply */..  /
f770: 2a 20 54 68 65 20 6e 65 78 74 20 72 65 71 75 65  * The next reque
f780: 73 74 20 6d 75 73 74 20 61 72 72 69 76 65 20 77  st must arrive w
f790: 69 74 68 69 6e 20 33 30 20 73 65 63 6f 6e 64 73  ithin 30 seconds
f7a0: 20 6f 72 20 77 65 20 63 6c 6f 73 65 20 74 68 65   or we close the
f7b0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 2a 2f   connection.  */
f7c0: 0a 20 20 6f 6d 69 74 4c 6f 67 20 3d 20 31 3b 0a  .  omitLog = 1;.
f7d0: 20 20 69 66 28 20 75 73 65 54 69 6d 65 6f 75 74    if( useTimeout
f7e0: 20 29 20 61 6c 61 72 6d 28 33 30 29 3b 0a 7d 0a   ) alarm(30);.}.
f7f0: 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 52  .#define MAX_PAR
f800: 41 4c 4c 45 4c 20 35 30 20 20 2f 2a 20 4e 75 6d  ALLEL 50  /* Num
f810: 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65  ber of simultane
f820: 6f 75 73 20 63 68 69 6c 64 72 65 6e 20 2a 2f 0a  ous children */.
f830: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 70 6f 73 73 69  ./*.** All possi
f840: 62 6c 65 20 66 6f 72 6d 73 20 6f 66 20 61 6e 20  ble forms of an 
f850: 49 50 20 61 64 64 72 65 73 73 2e 20 20 4e 65 65  IP address.  Nee
f860: 64 65 64 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75  ded to work arou
f870: 6e 64 20 47 43 43 20 73 74 72 69 63 74 0a 2a 2a  nd GCC strict.**
f880: 20 61 6c 69 61 73 69 6e 67 20 72 75 6c 65 73 2e   aliasing rules.
f890: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 75 6e 69 6f  .*/.typedef unio
f8a0: 6e 20 7b 0a 20 20 73 74 72 75 63 74 20 73 6f 63  n {.  struct soc
f8b0: 6b 61 64 64 72 20 73 61 3b 20 20 20 20 20 20 20  kaddr sa;       
f8c0: 20 20 20 20 20 20 20 2f 2a 20 41 62 73 74 72 61         /* Abstra
f8d0: 63 74 20 73 75 70 65 72 63 6c 61 73 73 20 2a 2f  ct superclass */
f8e0: 0a 20 20 73 74 72 75 63 74 20 73 6f 63 6b 61 64  .  struct sockad
f8f0: 64 72 5f 69 6e 20 73 61 34 3b 20 20 20 20 20 20  dr_in sa4;      
f900: 20 20 20 20 2f 2a 20 49 50 76 34 20 2a 2f 0a 20      /* IPv4 */. 
f910: 20 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72   struct sockaddr
f920: 5f 69 6e 36 20 73 61 36 3b 20 20 20 20 20 20 20  _in6 sa6;       
f930: 20 20 2f 2a 20 49 50 76 36 20 2a 2f 0a 20 20 73    /* IPv6 */.  s
f940: 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 73  truct sockaddr_s
f950: 74 6f 72 61 67 65 20 73 61 73 3b 20 20 20 20 20  torage sas;     
f960: 2f 2a 20 53 68 6f 75 6c 64 20 62 65 20 74 68 65  /* Should be the
f970: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
f980: 61 62 6f 76 65 20 33 20 2a 2f 0a 7d 20 61 64 64  above 3 */.} add
f990: 72 65 73 73 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  ress;../*.** Imp
f9a0: 6c 65 6d 65 6e 74 20 61 6e 20 48 54 54 50 20 73  lement an HTTP s
f9b0: 65 72 76 65 72 20 64 61 65 6d 6f 6e 20 6c 69 73  erver daemon lis
f9c0: 74 65 6e 69 6e 67 20 6f 6e 20 70 6f 72 74 20 69  tening on port i
f9d0: 50 6f 72 74 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 6e  Port..**.** As n
f9e0: 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ew connections a
f9f0: 72 72 69 76 65 2c 20 66 6f 72 6b 20 61 20 63 68  rrive, fork a ch
fa00: 69 6c 64 20 61 6e 64 20 6c 65 74 20 63 68 69 6c  ild and let chil
fa10: 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6f 75 74 20  d return.** out 
fa20: 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  of this procedur
fa30: 65 20 63 61 6c 6c 2e 20 20 54 68 65 20 63 68 69  e call.  The chi
fa40: 6c 64 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 74  ld will handle t
fa50: 68 65 20 72 65 71 75 65 73 74 2e 0a 2a 2a 20 54  he request..** T
fa60: 68 65 20 70 61 72 65 6e 74 20 6e 65 76 65 72 20  he parent never 
fa70: 72 65 74 75 72 6e 73 20 66 72 6f 6d 20 74 68 69  returns from thi
fa80: 73 20 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2a 0a  s procedure..**.
fa90: 2a 2a 20 52 65 74 75 72 6e 20 30 20 74 6f 20 65  ** Return 0 to e
faa0: 61 63 68 20 63 68 69 6c 64 20 61 73 20 69 74 20  ach child as it 
fab0: 72 75 6e 73 2e 20 20 49 66 20 75 6e 61 62 6c 65  runs.  If unable
fac0: 20 74 6f 20 65 73 74 61 62 6c 69 73 68 20 61 0a   to establish a.
fad0: 2a 2a 20 6c 69 73 74 65 6e 69 6e 67 20 73 6f 63  ** listening soc
fae0: 6b 65 74 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d  ket, return non-
faf0: 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 68 74 74  zero..*/.int htt
fb00: 70 5f 73 65 72 76 65 72 28 63 6f 6e 73 74 20 63  p_server(const c
fb10: 68 61 72 20 2a 7a 50 6f 72 74 2c 20 69 6e 74 20  har *zPort, int 
fb20: 6c 6f 63 61 6c 4f 6e 6c 79 29 7b 0a 20 20 69 6e  localOnly){.  in
fb30: 74 20 6c 69 73 74 65 6e 65 72 5b 32 30 5d 3b 20  t listener[20]; 
fb40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
fb50: 65 20 73 65 72 76 65 72 20 73 6f 63 6b 65 74 73  e server sockets
fb60: 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 6e 65 63   */.  int connec
fb70: 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  tion;           
fb80: 20 20 20 2f 2a 20 41 20 73 6f 63 6b 65 74 20 66     /* A socket f
fb90: 6f 72 20 65 61 63 68 20 69 6e 64 69 76 69 64 75  or each individu
fba0: 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  al connection */
fbb0: 0a 20 20 66 64 5f 73 65 74 20 72 65 61 64 66 64  .  fd_set readfd
fbc0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
fbd0: 2f 2a 20 53 65 74 20 6f 66 20 66 69 6c 65 20 64  /* Set of file d
fbe0: 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 73  escriptors for s
fbf0: 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 61 64 64  elect() */.  add
fc00: 72 65 73 73 20 69 6e 61 64 64 72 3b 20 20 20 20  ress inaddr;    
fc10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d            /* Rem
fc20: 6f 74 65 20 61 64 64 72 65 73 73 20 2a 2f 0a 20  ote address */. 
fc30: 20 73 6f 63 6b 6c 65 6e 5f 74 20 6c 65 6e 61 64   socklen_t lenad
fc40: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dr;           /*
fc50: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 69   Length of the i
fc60: 6e 61 64 64 72 20 73 74 72 75 63 74 75 72 65 20  naddr structure 
fc70: 2a 2f 0a 20 20 69 6e 74 20 63 68 69 6c 64 3b 20  */.  int child; 
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc90: 20 20 2f 2a 20 50 49 44 20 6f 66 20 74 68 65 20    /* PID of the 
fca0: 63 68 69 6c 64 20 70 72 6f 63 65 73 73 20 2a 2f  child process */
fcb0: 0a 20 20 69 6e 74 20 6e 63 68 69 6c 64 72 65 6e  .  int nchildren
fcc0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
fcd0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 69  /* Number of chi
fce0: 6c 64 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a  ld processes */.
fcf0: 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c    struct timeval
fd00: 20 64 65 6c 61 79 3b 20 20 20 20 20 20 20 20 2f   delay;        /
fd10: 2a 20 48 6f 77 20 6c 6f 6e 67 20 74 6f 20 77 61  * How long to wa
fd20: 69 74 20 69 6e 73 69 64 65 20 73 65 6c 65 63 74  it inside select
fd30: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 74 20  () */.  int opt 
fd40: 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
fd50: 20 20 20 20 20 2f 2a 20 73 65 74 73 6f 63 6b 6f       /* setsocko
fd60: 70 74 20 66 6c 61 67 20 2a 2f 0a 20 20 73 74 72  pt flag */.  str
fd70: 75 63 74 20 61 64 64 72 69 6e 66 6f 20 73 48 69  uct addrinfo sHi
fd80: 6e 74 73 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  nts;      /* Add
fd90: 72 65 73 73 20 68 69 6e 74 73 20 2a 2f 0a 20 20  ress hints */.  
fda0: 73 74 72 75 63 74 20 61 64 64 72 69 6e 66 6f 20  struct addrinfo 
fdb0: 2a 70 41 64 64 72 73 2c 20 2a 70 3b 20 2f 2a 20  *pAddrs, *p; /* 
fdc0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
fdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fde0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
fdf0: 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a   */.  int i, n;.
fe00: 20 20 69 6e 74 20 6d 61 78 46 64 20 3d 20 2d 31    int maxFd = -1
fe10: 3b 0a 20 20 0a 20 20 6d 65 6d 73 65 74 28 26 73  ;.  .  memset(&s
fe20: 48 69 6e 74 73 2c 20 30 2c 20 73 69 7a 65 6f 66  Hints, 0, sizeof
fe30: 28 73 48 69 6e 74 73 29 29 3b 0a 20 20 69 66 28  (sHints));.  if(
fe40: 20 69 70 76 34 4f 6e 6c 79 20 29 7b 0a 20 20 20   ipv4Only ){.   
fe50: 20 73 48 69 6e 74 73 2e 61 69 5f 66 61 6d 69 6c   sHints.ai_famil
fe60: 79 20 3d 20 50 46 5f 49 4e 45 54 3b 0a 20 20 20  y = PF_INET;.   
fe70: 20 2f 2a 70 72 69 6e 74 66 28 22 69 70 76 34 20   /*printf("ipv4 
fe80: 6f 6e 6c 79 5c 6e 22 29 3b 2a 2f 0a 20 20 7d 65  only\n");*/.  }e
fe90: 6c 73 65 20 69 66 28 20 69 70 76 36 4f 6e 6c 79  lse if( ipv6Only
fea0: 20 29 7b 0a 20 20 20 20 73 48 69 6e 74 73 2e 61   ){.    sHints.a
feb0: 69 5f 66 61 6d 69 6c 79 20 3d 20 50 46 5f 49 4e  i_family = PF_IN
fec0: 45 54 36 3b 0a 20 20 20 20 2f 2a 70 72 69 6e 74  ET6;.    /*print
fed0: 66 28 22 69 70 76 36 20 6f 6e 6c 79 5c 6e 22 29  f("ipv6 only\n")
fee0: 3b 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;*/.  }else{.   
fef0: 20 73 48 69 6e 74 73 2e 61 69 5f 66 61 6d 69 6c   sHints.ai_famil
ff00: 79 20 3d 20 50 46 5f 55 4e 53 50 45 43 3b 0a 20  y = PF_UNSPEC;. 
ff10: 20 7d 0a 20 20 73 48 69 6e 74 73 2e 61 69 5f 73   }.  sHints.ai_s
ff20: 6f 63 6b 74 79 70 65 20 3d 20 53 4f 43 4b 5f 53  ocktype = SOCK_S
ff30: 54 52 45 41 4d 3b 0a 20 20 73 48 69 6e 74 73 2e  TREAM;.  sHints.
ff40: 61 69 5f 66 6c 61 67 73 20 3d 20 41 49 5f 50 41  ai_flags = AI_PA
ff50: 53 53 49 56 45 3b 0a 20 20 73 48 69 6e 74 73 2e  SSIVE;.  sHints.
ff60: 61 69 5f 70 72 6f 74 6f 63 6f 6c 20 3d 20 30 3b  ai_protocol = 0;
ff70: 0a 20 20 72 63 20 3d 20 67 65 74 61 64 64 72 69  .  rc = getaddri
ff80: 6e 66 6f 28 6c 6f 63 61 6c 4f 6e 6c 79 20 3f 20  nfo(localOnly ? 
ff90: 22 6c 6f 63 61 6c 68 6f 73 74 22 3a 20 30 2c 20  "localhost": 0, 
ffa0: 7a 50 6f 72 74 2c 20 26 73 48 69 6e 74 73 2c 20  zPort, &sHints, 
ffb0: 26 70 41 64 64 72 73 29 3b 0a 20 20 69 66 28 20  &pAddrs);.  if( 
ffc0: 72 63 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  rc ){.    fprint
ffd0: 66 28 73 74 64 65 72 72 2c 20 22 63 6f 75 6c 64  f(stderr, "could
ffe0: 20 6e 6f 74 20 67 65 74 20 61 64 64 72 20 69 6e   not get addr in
fff0: 66 6f 3a 20 25 73 22 2c 20 0a 20 20 20 20 20 20  fo: %s", .      
10000 20 20 20 20 20 20 72 63 21 3d 45 41 49 5f 53 59        rc!=EAI_SY
10010 53 54 45 4d 20 3f 20 67 61 69 5f 73 74 72 65 72  STEM ? gai_strer
10020 72 6f 72 28 72 63 29 20 3a 20 73 74 72 65 72 72  ror(rc) : strerr
10030 6f 72 28 65 72 72 6e 6f 29 29 3b 0a 20 20 20 20  or(errno));.    
10040 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
10050 66 6f 72 28 6e 3d 30 2c 20 70 3d 70 41 64 64 72  for(n=0, p=pAddr
10060 73 3b 20 6e 3c 28 69 6e 74 29 28 73 69 7a 65 6f  s; n<(int)(sizeo
10070 66 28 6c 69 73 74 65 6e 65 72 29 2f 73 69 7a 65  f(listener)/size
10080 6f 66 28 6c 69 73 74 65 6e 65 72 5b 30 5d 29 29  of(listener[0]))
10090 20 26 26 20 70 21 3d 30 3b 0a 20 20 20 20 20 20   && p!=0;.      
100a0 20 20 70 3d 70 2d 3e 61 69 5f 6e 65 78 74 29 7b    p=p->ai_next){
100b0 0a 20 20 20 20 6c 69 73 74 65 6e 65 72 5b 6e 5d  .    listener[n]
100c0 20 3d 20 73 6f 63 6b 65 74 28 70 2d 3e 61 69 5f   = socket(p->ai_
100d0 66 61 6d 69 6c 79 2c 20 70 2d 3e 61 69 5f 73 6f  family, p->ai_so
100e0 63 6b 74 79 70 65 2c 20 70 2d 3e 61 69 5f 70 72  cktype, p->ai_pr
100f0 6f 74 6f 63 6f 6c 29 3b 0a 20 20 20 20 69 66 28  otocol);.    if(
10100 20 6c 69 73 74 65 6e 65 72 5b 6e 5d 3e 3d 30 20   listener[n]>=0 
10110 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77  ){.      /* if w
10120 65 20 63 61 6e 27 74 20 74 65 72 6d 69 6e 61 74  e can't terminat
10130 65 20 6e 69 63 65 6c 79 2c 20 61 74 20 6c 65 61  e nicely, at lea
10140 73 74 20 61 6c 6c 6f 77 20 74 68 65 20 73 6f 63  st allow the soc
10150 6b 65 74 20 74 6f 20 62 65 20 72 65 75 73 65 64  ket to be reused
10160 20 2a 2f 0a 20 20 20 20 20 20 73 65 74 73 6f 63   */.      setsoc
10170 6b 6f 70 74 28 6c 69 73 74 65 6e 65 72 5b 6e 5d  kopt(listener[n]
10180 2c 20 53 4f 4c 5f 53 4f 43 4b 45 54 2c 20 53 4f  , SOL_SOCKET, SO
10190 5f 52 45 55 53 45 41 44 44 52 2c 26 6f 70 74 2c  _REUSEADDR,&opt,
101a0 20 73 69 7a 65 6f 66 28 6f 70 74 29 29 3b 0a 20   sizeof(opt));. 
101b0 20 20 20 20 20 0a 23 69 66 20 64 65 66 69 6e 65       .#if define
101c0 64 28 49 50 56 36 5f 56 36 4f 4e 4c 59 29 0a 20  d(IPV6_V6ONLY). 
101d0 20 20 20 20 20 69 66 28 20 70 2d 3e 61 69 5f 66       if( p->ai_f
101e0 61 6d 69 6c 79 3d 3d 41 46 5f 49 4e 45 54 36 20  amily==AF_INET6 
101f0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 76  ){.        int v
10200 36 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20  6only = 1;.     
10210 20 20 20 73 65 74 73 6f 63 6b 6f 70 74 28 6c 69     setsockopt(li
10220 73 74 65 6e 65 72 5b 6e 5d 2c 20 49 50 50 52 4f  stener[n], IPPRO
10230 54 4f 5f 49 50 56 36 2c 20 49 50 56 36 5f 56 36  TO_IPV6, IPV6_V6
10240 4f 4e 4c 59 2c 0a 20 20 20 20 20 20 20 20 20 20  ONLY,.          
10250 20 20 20 20 20 20 20 20 20 20 26 76 36 6f 6e 6c            &v6onl
10260 79 2c 20 73 69 7a 65 6f 66 28 76 36 6f 6e 6c 79  y, sizeof(v6only
10270 29 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ));.      }.#end
10280 69 66 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  if.      .      
10290 69 66 28 20 62 69 6e 64 28 6c 69 73 74 65 6e 65  if( bind(listene
102a0 72 5b 6e 5d 2c 20 70 2d 3e 61 69 5f 61 64 64 72  r[n], p->ai_addr
102b0 2c 20 70 2d 3e 61 69 5f 61 64 64 72 6c 65 6e 29  , p->ai_addrlen)
102c0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  <0 ){.        pr
102d0 69 6e 74 66 28 22 62 69 6e 64 20 66 61 69 6c 65  intf("bind faile
102e0 64 3a 20 25 73 5c 6e 22 2c 20 73 74 72 65 72 72  d: %s\n", strerr
102f0 6f 72 28 65 72 72 6e 6f 29 29 3b 0a 20 20 20 20  or(errno));.    
10300 20 20 20 20 63 6c 6f 73 65 28 6c 69 73 74 65 6e      close(listen
10310 65 72 5b 6e 5d 29 3b 0a 20 20 20 20 20 20 20 20  er[n]);.        
10320 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
10330 7d 0a 20 20 20 20 20 20 69 66 28 20 6c 69 73 74  }.      if( list
10340 65 6e 28 6c 69 73 74 65 6e 65 72 5b 6e 5d 2c 20  en(listener[n], 
10350 32 30 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  20)<0 ){.       
10360 20 70 72 69 6e 74 66 28 22 6c 69 73 74 65 6e 28   printf("listen(
10370 29 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c  ) failed: %s\n",
10380 20 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29   strerror(errno)
10390 29 3b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65  );.        close
103a0 28 6c 69 73 74 65 6e 65 72 5b 6e 5d 29 3b 0a 20  (listener[n]);. 
103b0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
103c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
103d0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
103e0 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
103f0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
10400 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 61 6e 79  "cannot open any
10410 20 73 6f 63 6b 65 74 73 5c 6e 22 29 3b 0a 20 20   sockets\n");.  
10420 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
10430 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
10440 20 20 20 69 66 28 20 6e 63 68 69 6c 64 72 65 6e     if( nchildren
10450 3e 4d 41 58 5f 50 41 52 41 4c 4c 45 4c 20 29 7b  >MAX_PARALLEL ){
10460 0a 20 20 20 20 20 20 2f 2a 20 53 6c 6f 77 20 64  .      /* Slow d
10470 6f 77 6e 20 69 66 20 63 6f 6e 6e 65 63 74 69 6f  own if connectio
10480 6e 73 20 61 72 65 20 61 72 72 69 76 69 6e 67 20  ns are arriving 
10490 74 6f 6f 20 66 61 73 74 20 2a 2f 0a 20 20 20 20  too fast */.    
104a0 20 20 73 6c 65 65 70 28 20 6e 63 68 69 6c 64 72    sleep( nchildr
104b0 65 6e 2d 4d 41 58 5f 50 41 52 41 4c 4c 45 4c 20  en-MAX_PARALLEL 
104c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 6c  );.    }.    del
104d0 61 79 2e 74 76 5f 73 65 63 20 3d 20 36 30 3b 0a  ay.tv_sec = 60;.
104e0 20 20 20 20 64 65 6c 61 79 2e 74 76 5f 75 73 65      delay.tv_use
104f0 63 20 3d 20 30 3b 0a 20 20 20 20 46 44 5f 5a 45  c = 0;.    FD_ZE
10500 52 4f 28 26 72 65 61 64 66 64 73 29 3b 0a 20 20  RO(&readfds);.  
10510 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
10520 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
10530 72 74 28 20 6c 69 73 74 65 6e 65 72 5b 69 5d 3e  rt( listener[i]>
10540 3d 30 20 29 3b 0a 20 20 20 20 20 20 46 44 5f 53  =0 );.      FD_S
10550 45 54 28 20 6c 69 73 74 65 6e 65 72 5b 69 5d 2c  ET( listener[i],
10560 20 26 72 65 61 64 66 64 73 29 3b 0a 20 20 20 20   &readfds);.    
10570 20 20 69 66 28 20 6c 69 73 74 65 6e 65 72 5b 69    if( listener[i
10580 5d 3e 6d 61 78 46 64 20 29 20 6d 61 78 46 64 20  ]>maxFd ) maxFd 
10590 3d 20 6c 69 73 74 65 6e 65 72 5b 69 5d 3b 0a 20  = listener[i];. 
105a0 20 20 20 7d 0a 20 20 20 20 73 65 6c 65 63 74 28     }.    select(
105b0 20 6d 61 78 46 64 2b 31 2c 20 26 72 65 61 64 66   maxFd+1, &readf
105c0 64 73 2c 20 30 2c 20 30 2c 20 26 64 65 6c 61 79  ds, 0, 0, &delay
105d0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
105e0 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
105f0 20 69 66 28 20 46 44 5f 49 53 53 45 54 28 6c 69   if( FD_ISSET(li
10600 73 74 65 6e 65 72 5b 69 5d 2c 20 26 72 65 61 64  stener[i], &read
10610 66 64 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20  fds) ){.        
10620 6c 65 6e 61 64 64 72 20 3d 20 73 69 7a 65 6f 66  lenaddr = sizeof
10630 28 69 6e 61 64 64 72 29 3b 0a 20 20 20 20 20 20  (inaddr);.      
10640 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 61    connection = a
10650 63 63 65 70 74 28 6c 69 73 74 65 6e 65 72 5b 69  ccept(listener[i
10660 5d 2c 20 26 69 6e 61 64 64 72 2e 73 61 2c 20 26  ], &inaddr.sa, &
10670 6c 65 6e 61 64 64 72 29 3b 0a 20 20 20 20 20 20  lenaddr);.      
10680 20 20 69 66 28 20 63 6f 6e 6e 65 63 74 69 6f 6e    if( connection
10690 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
106a0 20 63 68 69 6c 64 20 3d 20 66 6f 72 6b 28 29 3b   child = fork();
106b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
106c0 68 69 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 20  hild!=0 ){.     
106d0 20 20 20 20 20 20 20 69 66 28 20 63 68 69 6c 64         if( child
106e0 3e 30 20 29 20 6e 63 68 69 6c 64 72 65 6e 2b 2b  >0 ) nchildren++
106f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6c  ;.            cl
10700 6f 73 65 28 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b  ose(connection);
10710 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
10720 70 72 69 6e 74 66 28 22 73 75 62 70 72 6f 63 65  printf("subproce
10730 73 73 20 25 64 20 73 74 61 72 74 65 64 2e 2e 2e  ss %d started...
10740 5c 6e 22 2c 20 63 68 69 6c 64 29 3b 20 66 66 6c  \n", child); ffl
10750 75 73 68 28 73 74 64 6f 75 74 29 3b 20 2a 2f 0a  ush(stdout); */.
10760 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
10770 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
10780 20 6e 45 72 72 20 3d 20 30 2c 20 66 64 3b 0a 20   nErr = 0, fd;. 
10790 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
107a0 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (0);.           
107b0 20 66 64 20 3d 20 64 75 70 28 63 6f 6e 6e 65 63   fd = dup(connec
107c0 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  tion);.         
107d0 20 20 20 69 66 28 20 66 64 21 3d 30 20 29 20 6e     if( fd!=0 ) n
107e0 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Err++;.         
107f0 20 20 20 63 6c 6f 73 65 28 31 29 3b 0a 20 20 20     close(1);.   
10800 20 20 20 20 20 20 20 20 20 66 64 20 3d 20 64 75           fd = du
10810 70 28 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20  p(connection);. 
10820 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66             if( f
10830 64 21 3d 31 20 29 20 6e 45 72 72 2b 2b 3b 0a 20  d!=1 ) nErr++;. 
10840 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
10850 28 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20 20  (connection);.  
10860 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
10870 20 6e 45 72 72 3b 0a 20 20 20 20 20 20 20 20 20   nErr;.         
10880 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
10890 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 42 75     }.      /* Bu
108a0 72 79 20 64 65 61 64 20 63 68 69 6c 64 72 65 6e  ry dead children
108b0 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28   */.      while(
108c0 20 28 63 68 69 6c 64 20 3d 20 77 61 69 74 70 69   (child = waitpi
108d0 64 28 30 2c 20 30 2c 20 57 4e 4f 48 41 4e 47 29  d(0, 0, WNOHANG)
108e0 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  )>0 ){.        /
108f0 2a 20 70 72 69 6e 74 66 28 22 70 72 6f 63 65 73  * printf("proces
10900 73 20 25 64 20 65 6e 64 73 5c 6e 22 2c 20 63 68  s %d ends\n", ch
10910 69 6c 64 29 3b 20 66 66 6c 75 73 68 28 73 74 64  ild); fflush(std
10920 6f 75 74 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20  out); */.       
10930 20 6e 63 68 69 6c 64 72 65 6e 2d 2d 3b 0a 20 20   nchildren--;.  
10940 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
10950 20 20 2f 2a 20 4e 4f 54 20 52 45 41 43 48 45 44    /* NOT REACHED
10960 20 2a 2f 20 20 0a 20 20 65 78 69 74 28 31 29 3b   */  .  exit(1);
10970 0a 7d 0a 0a 0a 69 6e 74 20 6d 61 69 6e 28 69 6e  .}...int main(in
10980 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61  t argc, char **a
10990 72 67 76 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  rgv){.  int i;  
109a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109b0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
109c0 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 65  r */.  char *zPe
109d0 72 6d 55 73 65 72 20 3d 20 30 3b 20 20 20 20 20  rmUser = 0;     
109e0 20 2f 2a 20 52 75 6e 20 64 61 65 6d 6f 6e 20 77   /* Run daemon w
109f0 69 74 68 20 74 68 69 73 20 75 73 65 72 27 73 20  ith this user's 
10a00 70 65 72 6d 69 73 73 69 6f 6e 73 20 2a 2f 0a 20  permissions */. 
10a10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 6f   const char *zPo
10a20 72 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6d  rt = 0;    /* Im
10a30 70 6c 65 6d 65 6e 74 20 61 6e 20 48 54 54 50 20  plement an HTTP 
10a40 73 65 72 76 65 72 20 70 72 6f 63 65 73 73 20 2a  server process *
10a50 2f 0a 20 20 69 6e 74 20 75 73 65 43 68 72 6f 6f  /.  int useChroo
10a60 74 4a 61 69 6c 20 3d 20 31 3b 20 20 20 20 2f 2a  tJail = 1;    /*
10a70 20 54 72 75 65 20 74 6f 20 75 73 65 20 61 20 63   True to use a c
10a80 68 61 6e 67 65 2d 72 6f 6f 74 20 6a 61 69 6c 20  hange-root jail 
10a90 2a 2f 0a 20 20 73 74 72 75 63 74 20 70 61 73 73  */.  struct pass
10aa0 77 64 20 2a 70 77 64 20 3d 20 30 3b 20 20 20 2f  wd *pwd = 0;   /
10ab0 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
10ac0 6f 75 74 20 74 68 65 20 75 73 65 72 20 2a 2f 0a  out the user */.
10ad0 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65  .  /* Record the
10ae0 20 74 69 6d 65 20 77 68 65 6e 20 70 72 6f 63 65   time when proce
10af0 73 73 69 6e 67 20 62 65 67 69 6e 73 2e 0a 20 20  ssing begins..  
10b00 2a 2f 0a 20 20 67 65 74 74 69 6d 65 6f 66 64 61  */.  gettimeofda
10b10 79 28 26 62 65 67 69 6e 54 69 6d 65 2c 20 30 29  y(&beginTime, 0)
10b20 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 63 6f  ;..  /* Parse co
10b30 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d  mmand-line argum
10b40 65 6e 74 73 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  ents.  */.  whil
10b50 65 28 20 61 72 67 63 3e 31 20 26 26 20 61 72 67  e( argc>1 && arg
10b60 76 5b 31 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a  v[1][0]=='-' ){.
10b70 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 72      char *z = ar
10b80 67 76 5b 31 5d 3b 0a 20 20 20 20 63 68 61 72 20  gv[1];.    char 
10b90 2a 7a 41 72 67 20 3d 20 61 72 67 63 3e 3d 33 20  *zArg = argc>=3 
10ba0 3f 20 61 72 67 76 5b 32 5d 20 3a 20 22 30 22 3b  ? argv[2] : "0";
10bb0 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  .    if( z[0]=='
10bc0 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20  -' && z[1]=='-' 
10bd0 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 73  ) z++;.    if( s
10be0 74 72 63 6d 70 28 7a 2c 22 2d 75 73 65 72 22 29  trcmp(z,"-user")
10bf0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 50 65  ==0 ){.      zPe
10c00 72 6d 55 73 65 72 20 3d 20 7a 41 72 67 3b 0a 20  rmUser = zArg;. 
10c10 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
10c20 63 6d 70 28 7a 2c 22 2d 72 6f 6f 74 22 29 3d 3d  cmp(z,"-root")==
10c30 30 20 29 7b 0a 20 20 20 20 20 20 7a 52 6f 6f 74  0 ){.      zRoot
10c40 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 7d 65 6c   = zArg;.    }el
10c50 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
10c60 22 2d 6c 6f 67 66 69 6c 65 22 29 3d 3d 30 20 29  "-logfile")==0 )
10c70 7b 0a 20 20 20 20 20 20 7a 4c 6f 67 46 69 6c 65  {.      zLogFile
10c80 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 7d 65 6c   = zArg;.    }el
10c90 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
10ca0 22 2d 6d 61 78 2d 61 67 65 22 29 3d 3d 30 20 29  "-max-age")==0 )
10cb0 7b 0a 20 20 20 20 20 20 6d 78 41 67 65 20 3d 20  {.      mxAge = 
10cc0 61 74 6f 69 28 7a 41 72 67 29 3b 0a 20 20 20 20  atoi(zArg);.    
10cd0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
10ce0 28 7a 2c 22 2d 68 74 74 70 73 22 29 3d 3d 30 20  (z,"-https")==0 
10cf0 29 7b 0a 20 20 20 20 20 20 75 73 65 48 74 74 70  ){.      useHttp
10d00 73 20 3d 20 61 74 6f 69 28 7a 41 72 67 29 3b 0a  s = atoi(zArg);.
10d10 20 20 20 20 20 20 7a 48 74 74 70 20 3d 20 75 73        zHttp = us
10d20 65 48 74 74 70 73 20 3f 20 22 68 74 74 70 73 22  eHttps ? "https"
10d30 20 3a 20 22 68 74 74 70 22 3b 0a 20 20 20 20 20   : "http";.     
10d40 20 69 66 28 20 75 73 65 48 74 74 70 73 20 29 20   if( useHttps ) 
10d50 7a 52 65 6d 6f 74 65 41 64 64 72 20 3d 20 67 65  zRemoteAddr = ge
10d60 74 65 6e 76 28 22 52 45 4d 4f 54 45 5f 48 4f 53  tenv("REMOTE_HOS
10d70 54 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  T");.    }else i
10d80 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 70  f( strcmp(z, "-p
10d90 6f 72 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ort")==0 ){.    
10da0 20 20 7a 50 6f 72 74 20 3d 20 7a 41 72 67 3b 0a    zPort = zArg;.
10db0 20 20 20 20 20 20 73 74 61 6e 64 61 6c 6f 6e 65        standalone
10dc0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
10dd0 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d  if( strcmp(z, "-
10de0 66 61 6d 69 6c 79 22 29 3d 3d 30 20 29 7b 0a 20  family")==0 ){. 
10df0 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
10e00 7a 41 72 67 2c 20 22 69 70 76 34 22 29 3d 3d 30  zArg, "ipv4")==0
10e10 20 29 7b 0a 20 20 20 20 20 20 20 20 69 70 76 34   ){.        ipv4
10e20 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  Only = 1;.      
10e30 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
10e40 28 7a 41 72 67 2c 20 22 69 70 76 36 22 29 3d 3d  (zArg, "ipv6")==
10e50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 70 76  0 ){.        ipv
10e60 36 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20  6Only = 1;.     
10e70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10e80 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49  Malfunction(__LI
10e90 4e 45 5f 5f 2c 20 20 2f 2a 20 4c 4f 47 3a 20 75  NE__,  /* LOG: u
10ea0 6e 6b 6e 6f 77 6e 20 49 50 20 70 72 6f 74 6f 63  nknown IP protoc
10eb0 6f 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ol */.          
10ec0 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f            "unkno
10ed0 77 6e 20 49 50 20 70 72 6f 74 6f 63 6f 6c 3a 20  wn IP protocol: 
10ee0 5b 25 73 5d 5c 6e 22 2c 20 7a 41 72 67 29 3b 0a  [%s]\n", zArg);.
10ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
10f00 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20  e if( strcmp(z, 
10f10 22 2d 6a 61 69 6c 22 29 3d 3d 30 20 29 7b 0a 20  "-jail")==0 ){. 
10f20 20 20 20 20 20 69 66 28 20 61 74 6f 69 28 7a 41       if( atoi(zA
10f30 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rg)==0 ){.      
10f40 20 20 75 73 65 43 68 72 6f 6f 74 4a 61 69 6c 20    useChrootJail 
10f50 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
10f60 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
10f70 70 28 7a 2c 20 22 2d 64 65 62 75 67 22 29 3d 3d  p(z, "-debug")==
10f80 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  0 ){.      if( a
10f90 74 6f 69 28 7a 41 72 67 29 20 29 7b 0a 20 20 20  toi(zArg) ){.   
10fa0 20 20 20 20 20 75 73 65 54 69 6d 65 6f 75 74 20       useTimeout 
10fb0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
10fc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d 61   }else{.      Ma
10fd0 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45  lfunction(__LINE
10fe0 5f 5f 2c 20 2f 2a 20 4c 4f 47 3a 20 75 6e 6b 6e  __, /* LOG: unkn
10ff0 6f 77 6e 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  own command-line
11000 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20 6c 61 75   argument on lau
11010 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  nch */.         
11020 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77           "unknow
11030 6e 20 61 72 67 75 6d 65 6e 74 3a 20 5b 25 73 5d  n argument: [%s]
11040 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20  \n", z);.    }. 
11050 20 20 20 61 72 67 76 20 2b 3d 20 32 3b 0a 20 20     argv += 2;.  
11060 20 20 61 72 67 63 20 2d 3d 20 32 3b 0a 20 20 7d    argc -= 2;.  }
11070 0a 20 20 69 66 28 20 7a 52 6f 6f 74 3d 3d 30 20  .  if( zRoot==0 
11080 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61 6e 64  ){.    if( stand
11090 61 6c 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 7a  alone ){.      z
110a0 52 6f 6f 74 20 3d 20 22 2e 22 3b 0a 20 20 20 20  Root = ".";.    
110b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d 61 6c  }else{.      Mal
110c0 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f  function(__LINE_
110d0 5f 2c 20 2f 2a 20 4c 4f 47 3a 20 2d 2d 72 6f 6f  _, /* LOG: --roo
110e0 74 20 61 72 67 75 6d 65 6e 74 20 6d 69 73 73 69  t argument missi
110f0 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ng */.          
11100 20 20 20 20 20 20 20 20 22 6e 6f 20 2d 2d 72 6f          "no --ro
11110 6f 74 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a  ot specified");.
11120 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f      }.  }.  .  /
11130 2a 20 43 68 61 6e 67 65 20 64 69 72 65 63 74 6f  * Change directo
11140 72 69 65 73 20 74 6f 20 74 68 65 20 72 6f 6f 74  ries to the root
11150 20 6f 66 20 74 68 65 20 48 54 54 50 20 66 69 6c   of the HTTP fil
11160 65 73 79 73 74 65 6d 2e 20 20 54 68 65 6e 0a 20  esystem.  Then. 
11170 20 2a 2a 20 63 72 65 61 74 65 20 61 20 63 68 72   ** create a chr
11180 6f 6f 74 20 6a 61 69 6c 20 74 68 65 72 65 2e 0a  oot jail there..
11190 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 64 69 72    */.  if( chdir
111a0 28 7a 52 6f 6f 74 29 21 3d 30 20 29 7b 0a 20 20  (zRoot)!=0 ){.  
111b0 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f    Malfunction(__
111c0 4c 49 4e 45 5f 5f 2c 20 2f 2a 20 4c 4f 47 3a 20  LINE__, /* LOG: 
111d0 63 68 64 69 72 28 29 20 66 61 69 6c 65 64 20 2a  chdir() failed *
111e0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
111f0 20 20 22 63 61 6e 6e 6f 74 20 63 68 61 6e 67 65    "cannot change
11200 20 74 6f 20 64 69 72 65 63 74 6f 72 79 20 5b 25   to directory [%
11210 73 5d 22 2c 20 7a 52 6f 6f 74 29 3b 0a 20 20 7d  s]", zRoot);.  }
11220 0a 0a 20 20 2f 2a 20 47 65 74 20 69 6e 66 6f 72  ..  /* Get infor
11230 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
11240 20 75 73 65 72 20 69 66 20 61 76 61 69 6c 61 62   user if availab
11250 6c 65 20 2a 2f 0a 20 20 69 66 28 20 7a 50 65 72  le */.  if( zPer
11260 6d 55 73 65 72 20 29 20 70 77 64 20 3d 20 67 65  mUser ) pwd = ge
11270 74 70 77 6e 61 6d 28 7a 50 65 72 6d 55 73 65 72  tpwnam(zPermUser
11280 29 3b 0a 0a 20 20 2f 2a 20 45 6e 74 65 72 20 74  );..  /* Enter t
11290 68 65 20 63 68 72 6f 6f 74 20 6a 61 69 6c 20 69  he chroot jail i
112a0 66 20 72 65 71 75 65 73 74 65 64 20 2a 2f 20 20  f requested */  
112b0 0a 20 20 69 66 28 20 7a 50 65 72 6d 55 73 65 72  .  if( zPermUser
112c0 20 26 26 20 75 73 65 43 68 72 6f 6f 74 4a 61 69   && useChrootJai
112d0 6c 20 26 26 20 67 65 74 75 69 64 28 29 3d 3d 30  l && getuid()==0
112e0 20 29 7b 0a 20 20 20 20 69 66 28 20 63 68 72 6f   ){.    if( chro
112f0 6f 74 28 22 2e 22 29 3c 30 20 29 7b 0a 20 20 20  ot(".")<0 ){.   
11300 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f     Malfunction(_
11310 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a 20 4c 4f 47 3a  _LINE__, /* LOG:
11320 20 63 68 72 6f 6f 74 28 29 20 66 61 69 6c 65 64   chroot() failed
11330 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
11340 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
11350 20 63 72 65 61 74 65 20 63 68 72 6f 6f 74 20 6a   create chroot j
11360 61 69 6c 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ail");.    }else
11370 7b 0a 20 20 20 20 20 20 7a 52 6f 6f 74 20 3d 20  {.      zRoot = 
11380 22 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  "";.    }.  }.. 
11390 20 2f 2a 20 41 63 74 69 76 61 74 65 20 74 68 65   /* Activate the
113a0 20 73 65 72 76 65 72 2c 20 69 66 20 72 65 71 75   server, if requ
113b0 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 7a  ested */.  if( z
113c0 50 6f 72 74 20 26 26 20 68 74 74 70 5f 73 65 72  Port && http_ser
113d0 76 65 72 28 7a 50 6f 72 74 2c 20 30 29 20 29 7b  ver(zPort, 0) ){
113e0 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e  .    Malfunction
113f0 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a 20 4c 4f  (__LINE__, /* LO
11400 47 3a 20 73 65 72 76 65 72 20 73 74 61 72 74 75  G: server startu
11410 70 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20  p failed */.    
11420 20 20 20 20 20 20 20 20 20 20 20 20 22 66 61 69              "fai
11430 6c 65 64 20 74 6f 20 73 74 61 72 74 20 73 65 72  led to start ser
11440 76 65 72 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ver");.  }..  /*
11450 20 44 72 6f 70 20 72 6f 6f 74 20 70 72 69 76 69   Drop root privi
11460 6c 65 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  leges..  */.  if
11470 28 20 7a 50 65 72 6d 55 73 65 72 20 29 7b 0a 20  ( zPermUser ){. 
11480 20 20 20 69 66 28 20 70 77 64 20 29 7b 0a 20 20     if( pwd ){.  
11490 20 20 20 20 69 66 28 20 73 65 74 67 69 64 28 70      if( setgid(p
114a0 77 64 2d 3e 70 77 5f 67 69 64 29 20 29 7b 0a 20  wd->pw_gid) ){. 
114b0 20 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69         Malfuncti
114c0 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a 20  on(__LINE__, /* 
114d0 4c 4f 47 3a 20 73 65 74 67 69 64 28 29 20 66 61  LOG: setgid() fa
114e0 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  iled */.        
114f0 20 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e              "can
11500 6e 6f 74 20 73 65 74 20 67 72 6f 75 70 2d 69 64  not set group-id
11510 20 74 6f 20 25 64 22 2c 20 70 77 64 2d 3e 70 77   to %d", pwd->pw
11520 5f 67 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  _gid);.      }. 
11530 20 20 20 20 20 69 66 28 20 73 65 74 75 69 64 28       if( setuid(
11540 70 77 64 2d 3e 70 77 5f 75 69 64 29 20 29 7b 0a  pwd->pw_uid) ){.
11550 20 20 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74          Malfunct
11560 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a  ion(__LINE__, /*
11570 20 4c 4f 47 3a 20 73 65 74 75 69 64 28 29 20 66   LOG: setuid() f
11580 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  ailed */.       
11590 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 61               "ca
115a0 6e 6e 6f 74 20 73 65 74 20 75 73 65 72 2d 69 64  nnot set user-id
115b0 20 74 6f 20 25 64 22 2c 20 70 77 64 2d 3e 70 77   to %d", pwd->pw
115c0 5f 75 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  _uid);.      }. 
115d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
115e0 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49  Malfunction(__LI
115f0 4e 45 5f 5f 2c 20 2f 2a 20 4c 4f 47 3a 20 75 6e  NE__, /* LOG: un
11600 6b 6e 6f 77 6e 20 75 73 65 72 20 2a 2f 0a 20 20  known user */.  
11610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11620 22 6e 6f 20 73 75 63 68 20 75 73 65 72 20 5b 25  "no such user [%
11630 73 5d 22 2c 20 7a 50 65 72 6d 55 73 65 72 29 3b  s]", zPermUser);
11640 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
11650 20 67 65 74 75 69 64 28 29 3d 3d 30 20 29 7b 0a   getuid()==0 ){.
11660 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28      Malfunction(
11670 5f 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a 20 4c 4f 47  __LINE__, /* LOG
11680 3a 20 63 61 6e 6e 6f 74 20 72 75 6e 20 61 73 20  : cannot run as 
11690 72 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  root */.        
116a0 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20          "cannot 
116b0 72 75 6e 20 61 73 20 72 6f 6f 74 22 29 3b 0a 20  run as root");. 
116c0 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65   }..  /* Get the
116d0 20 49 50 20 61 64 64 72 65 73 73 20 66 72 6f 6d   IP address from
116e0 20 77 68 65 6e 63 65 20 74 68 65 20 72 65 71 75   whence the requ
116f0 65 73 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 20  est originates. 
11700 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6d 6f 74   */.  if( zRemot
11710 65 41 64 64 72 3d 3d 30 20 29 7b 0a 20 20 20 20  eAddr==0 ){.    
11720 61 64 64 72 65 73 73 20 72 65 6d 6f 74 65 41 64  address remoteAd
11730 64 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  dr;.    unsigned
11740 20 69 6e 74 20 73 69 7a 65 20 3d 20 73 69 7a 65   int size = size
11750 6f 66 28 72 65 6d 6f 74 65 41 64 64 72 29 3b 0a  of(remoteAddr);.
11760 20 20 20 20 63 68 61 72 20 7a 48 6f 73 74 5b 4e      char zHost[N
11770 49 5f 4d 41 58 48 4f 53 54 5d 3b 0a 20 20 20 20  I_MAXHOST];.    
11780 69 66 28 20 67 65 74 70 65 65 72 6e 61 6d 65 28  if( getpeername(
11790 30 2c 20 26 72 65 6d 6f 74 65 41 64 64 72 2e 73  0, &remoteAddr.s
117a0 61 2c 20 26 73 69 7a 65 29 3e 3d 30 20 29 7b 0a  a, &size)>=0 ){.
117b0 20 20 20 20 20 20 67 65 74 6e 61 6d 65 69 6e 66        getnameinf
117c0 6f 28 26 72 65 6d 6f 74 65 41 64 64 72 2e 73 61  o(&remoteAddr.sa
117d0 2c 20 73 69 7a 65 2c 20 7a 48 6f 73 74 2c 20 73  , size, zHost, s
117e0 69 7a 65 6f 66 28 7a 48 6f 73 74 29 2c 20 30 2c  izeof(zHost), 0,
117f0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
11800 20 20 20 20 20 20 4e 49 5f 4e 55 4d 45 52 49 43        NI_NUMERIC
11810 48 4f 53 54 29 3b 0a 20 20 20 20 20 20 7a 52 65  HOST);.      zRe
11820 6d 6f 74 65 41 64 64 72 20 3d 20 53 74 72 44 75  moteAddr = StrDu
11830 70 28 7a 48 6f 73 74 29 3b 0a 20 20 20 20 7d 0a  p(zHost);.    }.
11840 20 20 7d 0a 20 20 69 66 28 20 7a 52 65 6d 6f 74    }.  if( zRemot
11850 65 41 64 64 72 21 3d 30 0a 20 20 20 26 26 20 73  eAddr!=0.   && s
11860 74 72 6e 63 6d 70 28 7a 52 65 6d 6f 74 65 41 64  trncmp(zRemoteAd
11870 64 72 2c 20 22 3a 3a 66 66 66 66 3a 22 2c 20 37  dr, "::ffff:", 7
11880 29 3d 3d 30 0a 20 20 20 26 26 20 73 74 72 63 68  )==0.   && strch
11890 72 28 7a 52 65 6d 6f 74 65 41 64 64 72 2b 37 2c  r(zRemoteAddr+7,
118a0 20 27 3a 27 29 3d 3d 30 0a 20 20 20 26 26 20 73   ':')==0.   && s
118b0 74 72 63 68 72 28 7a 52 65 6d 6f 74 65 41 64 64  trchr(zRemoteAdd
118c0 72 2b 37 2c 20 27 2e 27 29 21 3d 30 0a 20 20 29  r+7, '.')!=0.  )
118d0 7b 0a 20 20 20 20 7a 52 65 6d 6f 74 65 41 64 64  {.    zRemoteAdd
118e0 72 20 2b 3d 20 37 3b 0a 20 20 7d 0a 0a 20 20 2f  r += 7;.  }..  /
118f0 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20 69 6e  * Process the in
11900 70 75 74 20 73 74 72 65 61 6d 20 2a 2f 0a 20 20  put stream */.  
11910 66 6f 72 28 69 3d 30 3b 20 69 3c 31 30 30 3b 20  for(i=0; i<100; 
11920 69 2b 2b 29 7b 0a 20 20 20 20 50 72 6f 63 65 73  i++){.    Proces
11930 73 4f 6e 65 52 65 71 75 65 73 74 28 30 29 3b 0a  sOneRequest(0);.
11940 20 20 7d 0a 20 20 50 72 6f 63 65 73 73 4f 6e 65    }.  ProcessOne
11950 52 65 71 75 65 73 74 28 31 29 3b 0a 20 20 65 78  Request(1);.  ex
11960 69 74 28 30 29 3b 0a 7d 0a                       it(0);.}.