Documentation Source Text

Hex Artifact Content
Login

Artifact 977cc6088b60cf409e0ccfad35614ea3d5800b1c:


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 2c 20 6f 72 20 61 73 20 61 20 73 74 61 6e  td, or as a stan
0060: 64 2d 61 6c 6f 6e 65 20 73 65 72 76 65 72 0a 2a  d-alone server.*
0070: 2a 20 20 20 20 20 2a 20 4f 6e 65 20 70 72 6f 63  *     * One proc
0080: 65 73 73 20 70 65 72 20 72 65 71 75 65 73 74 0a  ess per request.
0090: 2a 2a 20 20 20 20 20 2a 20 44 65 6c 69 76 65 72  **     * Deliver
00a0: 20 73 74 61 74 69 63 20 63 6f 6e 74 65 6e 74 20   static content 
00b0: 6f 72 20 72 75 6e 20 43 47 49 0a 2a 2a 20 20 20  or run CGI.**   
00c0: 20 20 2a 20 56 69 72 74 75 61 6c 20 73 69 74 65    * Virtual site
00d0: 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 22  s based on the "
00e0: 48 6f 73 74 3a 22 20 70 72 6f 70 65 72 74 79 20  Host:" property 
00f0: 6f 66 20 74 68 65 20 48 54 54 50 20 68 65 61 64  of the HTTP head
0100: 65 72 0a 2a 2a 20 20 20 20 20 2a 20 52 75 6e 73  er.**     * Runs
0110: 20 69 6e 20 61 20 63 68 72 6f 6f 74 20 6a 61 69   in a chroot jai
0120: 6c 0a 2a 2a 20 20 20 20 20 2a 20 55 6e 69 66 69  l.**     * Unifi
0130: 65 64 20 6c 6f 67 20 66 69 6c 65 20 69 6e 20 61  ed log file in a
0140: 20 43 53 56 20 66 6f 72 6d 61 74 0a 2a 2a 20 20   CSV format.**  
0150: 20 20 20 2a 20 56 65 72 79 20 73 6d 61 6c 6c 20     * Very small 
0160: 63 6f 64 65 20 62 61 73 65 20 28 31 20 66 69 6c  code base (1 fil
0170: 65 29 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  e) to facilitate
0180: 20 73 65 63 75 72 69 74 79 20 61 75 64 69 74 69   security auditi
0190: 6e 67 0a 2a 2a 20 20 20 20 20 2a 20 53 69 6d 70  ng.**     * Simp
01a0: 6c 65 20 73 65 74 75 70 20 2d 20 6e 6f 20 63 6f  le setup - no co
01b0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65  nfiguration file
01c0: 73 20 74 6f 20 6d 65 73 73 20 77 69 74 68 2e 0a  s to mess with..
01d0: 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  ** .** This file
01e0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 73 6d   implements a sm
01f0: 61 6c 6c 20 61 6e 64 20 73 69 6d 70 6c 65 20 62  all and simple b
0200: 75 74 20 73 65 63 75 72 65 20 61 6e 64 20 65 66  ut secure and ef
0210: 66 65 63 74 69 76 65 20 77 65 62 0a 2a 2a 20 73  fective web.** s
0220: 65 72 76 65 72 2e 20 20 54 68 65 72 65 20 61 72  erver.  There ar
0230: 65 20 6e 6f 20 66 72 69 6c 6c 73 2e 20 20 41 6e  e no frills.  An
0240: 79 74 68 69 6e 67 20 74 68 61 74 20 63 6f 75 6c  ything that coul
0250: 64 20 62 65 20 72 65 61 73 6f 6e 61 62 6c 79 0a  d be reasonably.
0260: 2a 2a 20 6f 6d 69 74 74 65 64 20 68 61 73 20 62  ** omitted has b
0270: 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 74 75 70  een..**.** Setup
0280: 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   rules:.**.**   
0290: 20 28 31 29 20 4c 61 75 6e 63 68 20 61 73 20 72   (1) Launch as r
02a0: 6f 6f 74 20 66 72 6f 6d 20 69 6e 65 74 64 20 6c  oot from inetd l
02b0: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
02c0: 20 20 20 20 20 20 20 20 20 20 20 68 74 74 70 64             httpd
02d0: 20 2d 6c 6f 67 66 69 6c 65 20 6c 6f 67 66 69 6c   -logfile logfil
02e0: 65 20 2d 72 6f 6f 74 20 2f 68 6f 6d 65 2f 77 77  e -root /home/ww
02f0: 77 20 2d 75 73 65 72 20 6e 6f 62 6f 64 79 0a 2a  w -user nobody.*
0300: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 49 74 20 77  *.**        It w
0310: 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
0320: 79 20 63 68 72 6f 6f 74 20 74 6f 20 2f 68 6f 6d  y chroot to /hom
0330: 65 2f 77 77 77 20 61 6e 64 20 62 65 63 6f 6d 65  e/www and become
0340: 20 75 73 65 72 20 6e 6f 62 6f 64 79 2e 0a 2a 2a   user nobody..**
0350: 20 20 20 20 20 20 20 20 54 68 65 20 6c 6f 67 66          The logf
0360: 69 6c 65 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20  ile name should 
0370: 62 65 20 72 65 6c 61 74 69 76 65 20 74 6f 20 74  be relative to t
0380: 68 65 20 63 68 72 6f 6f 74 20 6a 61 69 6c 2e 0a  he chroot jail..
0390: 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 44 69 72  **.**    (2) Dir
03a0: 65 63 74 6f 72 69 65 73 20 6f 66 20 74 68 65 20  ectories of the 
03b0: 66 6f 72 6d 20 22 2a 2e 77 65 62 73 69 74 65 22  form "*.website"
03c0: 20 28 65 78 3a 20 77 77 77 5f 68 77 61 63 69 5f   (ex: www_hwaci_
03d0: 63 6f 6d 2e 77 65 62 73 69 74 65 29 0a 2a 2a 20  com.website).** 
03e0: 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 63         contain c
03f0: 6f 6e 74 65 6e 74 2e 20 20 54 68 65 20 64 69 72  ontent.  The dir
0400: 65 63 74 6f 72 79 20 69 73 20 63 68 6f 73 65 6e  ectory is chosen
0410: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 48 54   based on the HT
0420: 54 50 5f 48 4f 53 54 0a 2a 2a 20 20 20 20 20 20  TP_HOST.**      
0430: 20 20 72 65 71 75 65 73 74 20 68 65 61 64 65 72    request header
0440: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
0450: 6f 20 48 54 54 50 5f 48 4f 53 54 20 68 65 61 64  o HTTP_HOST head
0460: 65 72 20 6f 72 20 69 66 20 74 68 65 0a 2a 2a 20  er or if the.** 
0470: 20 20 20 20 20 20 20 63 6f 72 72 65 73 70 6f 6e         correspon
0480: 64 69 6e 67 20 68 6f 73 74 20 64 69 72 65 63 74  ding host direct
0490: 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ory does not exi
04a0: 73 74 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  st, then the.** 
04b0: 20 20 20 20 20 20 20 22 64 65 66 61 75 6c 74 2e         "default.
04c0: 77 65 62 73 69 74 65 22 20 69 73 20 75 73 65 64  website" is used
04d0: 2e 20 20 49 66 20 74 68 65 20 48 54 54 50 5f 48  .  If the HTTP_H
04e0: 4f 53 54 20 68 65 61 64 65 72 20 63 6f 6e 74 61  OST header conta
04f0: 69 6e 73 20 61 6e 79 0a 2a 2a 20 20 20 20 20 20  ins any.**      
0500: 20 20 63 68 61 72 61 74 65 72 73 20 6f 74 68 65    charaters othe
0510: 72 20 74 68 61 6e 20 5b 61 2d 7a 41 2d 5a 30 2d  r than [a-zA-Z0-
0520: 39 5f 2e 2c 2a 7e 2f 5d 20 74 68 65 6e 20 61 20  9_.,*~/] then a 
0530: 34 30 33 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20  403 error is.** 
0540: 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 64         generated
0550: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 41  ..**.**    (3) A
0560: 6e 79 20 66 69 6c 65 20 6f 72 20 64 69 72 65 63  ny file or direc
0570: 74 6f 72 79 20 77 68 6f 73 65 20 6e 61 6d 65 20  tory whose name 
0580: 62 65 67 69 6e 73 20 77 69 74 68 20 22 2e 22 20  begins with "." 
0590: 6f 72 20 22 2d 22 20 69 73 20 69 67 6e 6f 72 65  or "-" is ignore
05a0: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20  d..**.**    (4) 
05b0: 43 68 61 72 61 63 74 65 72 73 20 6f 74 68 65 72  Characters other
05c0: 20 74 68 61 6e 20 5b 30 2d 39 61 2d 7a 41 2d 5a   than [0-9a-zA-Z
05d0: 2c 2d 2e 2f 3a 5f 7e 5d 20 61 6e 64 20 61 6e 79  ,-./:_~] and any
05e0: 20 25 48 48 20 63 68 61 72 61 63 74 65 72 73 0a   %HH characters.
05f0: 2a 2a 20 20 20 20 20 20 20 20 65 73 63 61 70 65  **        escape
0600: 73 20 69 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d  s in the filenam
0610: 65 20 61 72 65 20 61 6c 6c 20 74 72 61 6e 73 6c  e are all transl
0620: 61 74 65 64 20 69 6e 74 6f 20 22 5f 22 2e 20 20  ated into "_".  
0630: 54 68 69 73 20 69 73 0a 2a 2a 20 20 20 20 20 20  This is.**      
0640: 20 20 61 20 64 65 66 65 6e 73 65 20 61 67 61 69    a defense agai
0650: 6e 73 74 20 63 72 6f 73 73 2d 73 69 74 65 20 73  nst cross-site s
0660: 63 72 69 70 74 69 6e 67 20 61 74 74 61 63 6b 73  cripting attacks
0670: 20 61 6e 64 20 6f 74 68 65 72 20 6d 69 73 63 68   and other misch
0680: 69 65 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 35  ief..**.**    (5
0690: 29 20 45 78 65 63 75 74 61 62 6c 65 20 66 69 6c  ) Executable fil
06a0: 65 73 20 61 72 65 20 72 75 6e 20 61 73 20 43 47  es are run as CG
06b0: 49 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 66 69  I.  All other fi
06c0: 6c 65 73 20 61 72 65 20 64 65 6c 69 76 65 72 65  les are delivere
06d0: 64 0a 2a 2a 20 20 20 20 20 20 20 20 61 73 20 69  d.**        as i
06e0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 36 29 20  s..**.**    (6) 
06f0: 46 6f 72 20 53 53 4c 20 73 75 70 70 6f 72 74 20  For SSL support 
0700: 75 73 65 20 73 74 75 6e 6e 65 6c 20 61 6e 64 20  use stunnel and 
0710: 61 64 64 20 74 68 65 20 2d 68 74 74 70 73 20 31  add the -https 1
0720: 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a   option on the.*
0730: 2a 20 20 20 20 20 20 20 20 68 74 74 70 64 20 63  *        httpd c
0740: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 2e 0a 2a 2a 0a  ommand-line..**.
0750: 2a 2a 20 20 20 20 28 37 29 20 49 66 20 61 20 66  **    (7) If a f
0760: 69 6c 65 20 6e 61 6d 65 64 20 22 2d 61 75 74 68  ile named "-auth
0770: 22 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  " exists in the 
0780: 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61  same directory a
0790: 73 20 74 68 65 20 66 69 6c 65 20 74 6f 0a 2a 2a  s the file to.**
07a0: 20 20 20 20 20 20 20 20 62 65 20 72 75 6e 20 61          be run a
07b0: 73 20 43 47 49 20 6f 72 20 74 6f 20 62 65 20 64  s CGI or to be d
07c0: 65 6c 69 76 65 72 65 64 2c 20 74 68 65 6e 20 69  elivered, then i
07d0: 74 20 63 6f 6e 74 61 69 6e 73 20 69 6e 66 6f 72  t contains infor
07e0: 6d 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  mation.**       
07f0: 20 66 6f 72 20 48 54 54 50 20 42 61 73 69 63 20   for HTTP Basic 
0800: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 2e 20 20  authorization.  
0810: 53 65 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  See file format 
0820: 64 65 74 61 69 6c 73 20 62 65 6c 6f 77 2e 0a 2a  details below..*
0830: 2a 0a 2a 2a 20 20 20 20 28 38 29 20 54 6f 20 72  *.**    (8) To r
0840: 75 6e 20 61 73 20 61 20 73 74 61 6e 64 2d 61 6c  un as a stand-al
0850: 6f 6e 65 20 73 65 72 76 65 72 2c 20 73 69 6d 70  one server, simp
0860: 6c 79 20 61 64 64 20 74 68 65 20 22 2d 70 6f 72  ly add the "-por
0870: 74 20 4e 22 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  t N" command-lin
0880: 65 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 74 69  e.**        opti
0890: 6f 6e 20 74 6f 20 64 65 66 69 6e 65 20 77 68 69  on to define whi
08a0: 63 68 20 54 43 50 20 70 6f 72 74 20 74 6f 20 6c  ch TCP port to l
08b0: 69 73 74 65 6e 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  isten on..**.** 
08c0: 43 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 4f 70 74  Command-line Opt
08d0: 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 2d 2d 72  ions:.**.**  --r
08e0: 6f 6f 74 20 44 49 52 20 20 20 20 20 20 20 44 65  oot DIR       De
08f0: 66 69 6e 65 73 20 74 68 65 20 64 69 72 65 63 74  fines the direct
0900: 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ory that contain
0910: 73 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a  s the various.**
0920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0930: 20 20 20 24 48 4f 53 54 2e 77 65 62 73 69 74 65     $HOST.website
0940: 20 73 75 62 64 69 72 65 63 74 6f 72 69 65 73 2c   subdirectories,
0950: 20 65 61 63 68 20 63 6f 6e 74 61 69 6e 69 6e 67   each containing
0960: 20 77 65 62 20 63 6f 6e 74 65 6e 74 20 0a 2a 2a   web content .**
0970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0980: 20 20 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20     for a single 
0990: 76 69 72 74 75 61 6c 20 68 6f 73 74 2e 20 20 49  virtual host.  I
09a0: 66 20 6c 61 75 6e 63 68 65 64 20 61 73 20 72 6f  f launched as ro
09b0: 6f 74 20 61 6e 64 20 69 66 0a 2a 2a 20 20 20 20  ot and if.**    
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
09d0: 2d 2d 75 73 65 72 20 55 53 45 52 22 20 61 6c 73  --user USER" als
09e0: 6f 20 61 70 70 65 61 72 73 20 6f 6e 20 74 68 65  o appears on the
09f0: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 6e   command-line an
0a00: 64 20 69 66 0a 2a 2a 20 20 20 20 20 20 20 20 20  d if.**         
0a10: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 6a 61 69            "--jai
0a20: 6c 20 30 22 20 69 73 20 6f 6d 69 74 74 65 64 2c  l 0" is omitted,
0a30: 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
0a40: 73 20 72 75 6e 73 20 69 6e 20 61 20 63 68 72 6f  s runs in a chro
0a50: 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ot.**           
0a60: 20 20 20 20 20 20 20 20 6a 61 69 6c 20 72 6f 6f          jail roo
0a70: 74 65 64 20 61 74 20 74 68 69 73 20 64 69 72 65  ted at this dire
0a80: 63 74 6f 72 79 20 61 6e 64 20 75 6e 64 65 72 20  ctory and under 
0a90: 74 68 65 20 75 73 65 72 69 64 20 55 53 45 52 2e  the userid USER.
0aa0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0ab0: 20 20 20 20 20 20 54 68 69 73 20 6f 70 74 69 6f        This optio
0ac0: 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  n is required fo
0ad0: 72 20 78 69 6e 65 74 64 20 6c 61 75 6e 63 68 20  r xinetd launch 
0ae0: 62 75 74 20 64 65 66 61 75 6c 74 73 0a 2a 2a 20  but defaults.** 
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b00: 20 20 74 6f 20 22 2e 22 20 66 6f 72 20 61 20 73    to "." for a s
0b10: 74 61 6e 64 2d 61 6c 6f 6e 65 20 77 65 62 20 73  tand-alone web s
0b20: 65 72 76 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 2d 2d  erver..**.**  --
0b30: 75 73 65 72 20 55 53 45 52 20 20 20 20 20 20 44  user USER      D
0b40: 65 66 69 6e 65 20 74 68 65 20 75 73 65 72 20 75  efine the user u
0b50: 6e 64 65 72 20 77 68 69 63 68 20 74 68 65 20 70  nder which the p
0b60: 72 6f 63 65 73 73 20 73 68 6f 75 6c 64 20 72 75  rocess should ru
0b70: 6e 20 69 66 0a 2a 2a 20 20 20 20 20 20 20 20 20  n if.**         
0b80: 20 20 20 20 20 20 20 20 20 20 6f 72 69 67 69 6e            origin
0b90: 61 6c 6c 79 20 6c 61 75 6e 63 68 65 64 20 61 73  ally launched as
0ba0: 20 72 6f 6f 74 2e 20 20 54 68 69 73 20 70 72 6f   root.  This pro
0bb0: 63 65 73 73 20 77 69 6c 6c 20 72 65 66 75 73 65  cess will refuse
0bc0: 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   to.**          
0bd0: 20 20 20 20 20 20 20 20 20 72 75 6e 20 61 73 20           run as 
0be0: 72 6f 6f 74 20 28 66 6f 72 20 73 65 63 75 72 69  root (for securi
0bf0: 74 79 29 2e 20 20 49 66 20 74 68 69 73 20 6f 70  ty).  If this op
0c00: 74 69 6f 6e 20 69 73 20 6f 6d 69 74 74 65 64 20  tion is omitted 
0c10: 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
0c20: 20 20 20 20 20 20 20 20 20 74 68 65 20 70 72 6f           the pro
0c30: 63 65 73 73 20 69 73 20 6c 61 75 6e 63 68 65 64  cess is launched
0c40: 20 61 73 20 72 6f 6f 74 2c 20 69 74 20 77 69 6c   as root, it wil
0c50: 6c 20 61 62 6f 72 74 20 77 69 74 68 6f 75 74 0a  l abort without.
0c60: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0c70: 20 20 20 20 20 70 72 6f 63 65 73 73 69 6e 67 20       processing 
0c80: 61 6e 79 20 48 54 54 50 20 72 65 71 75 65 73 74  any HTTP request
0c90: 73 2e 0a 2a 2a 0a 2a 2a 20 20 2d 2d 6c 6f 67 66  s..**.**  --logf
0ca0: 69 6c 65 20 46 49 4c 45 20 20 20 41 70 70 65 6e  ile FILE   Appen
0cb0: 64 20 61 20 73 69 6e 67 6c 65 2d 6c 69 6e 65 2c  d a single-line,
0cc0: 20 43 53 56 2d 66 6f 72 6d 61 74 2c 20 6c 6f 67   CSV-format, log
0cd0: 20 66 69 6c 65 20 65 6e 74 72 79 20 74 6f 20 46   file entry to F
0ce0: 49 4c 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ILE.**          
0cf0: 20 20 20 20 20 20 20 20 20 66 6f 72 20 65 61 63           for eac
0d00: 68 20 48 54 54 50 20 72 65 71 75 65 73 74 2e 20  h HTTP request. 
0d10: 20 46 49 4c 45 20 73 68 6f 75 6c 64 20 62 65 20   FILE should be 
0d20: 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e  a full pathname.
0d30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0d40: 20 20 20 20 20 20 54 68 65 20 46 49 4c 45 20 6e        The FILE n
0d50: 61 6d 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  ame is interpret
0d60: 65 64 20 69 6e 73 69 64 65 20 74 68 65 20 63 68  ed inside the ch
0d70: 72 6f 6f 74 20 6a 61 69 6c 2e 20 20 54 68 65 0a  root jail.  The.
0d80: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0d90: 20 20 20 20 20 46 49 4c 45 20 6e 61 6d 65 20 69       FILE name i
0da0: 73 20 65 78 70 61 6e 64 65 64 20 75 73 69 6e 67  s expanded using
0db0: 20 73 74 72 66 74 69 6d 65 28 29 20 69 66 20 69   strftime() if i
0dc0: 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 20 20  t contains.**   
0dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0de0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 27 25 27  at least one '%'
0df0: 20 61 6e 64 20 69 73 20 6e 6f 74 20 74 6f 6f 20   and is not too 
0e00: 6c 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 2d 2d 68  long..**.**  --h
0e10: 74 74 70 73 20 20 20 20 20 20 20 20 20 20 49 6e  ttps          In
0e20: 64 69 63 61 74 65 73 20 74 68 61 74 20 69 6e 70  dicates that inp
0e30: 75 74 20 69 73 20 63 6f 6d 69 6e 67 20 6f 76 65  ut is coming ove
0e40: 72 20 53 53 4c 20 61 6e 64 20 69 73 20 62 65 69  r SSL and is bei
0e50: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ng.**           
0e60: 20 20 20 20 20 20 20 20 64 65 63 6f 64 65 64 20          decoded 
0e70: 75 70 73 74 72 65 61 6d 2c 20 70 65 72 68 61 70  upstream, perhap
0e80: 73 20 62 79 20 73 74 75 6e 6e 65 6c 2e 20 20 28  s by stunnel.  (
0e90: 54 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  This program.** 
0ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0eb0: 20 20 6f 6e 6c 79 20 75 6e 64 65 72 73 74 61 6e    only understan
0ec0: 64 73 20 70 6c 61 69 6e 74 65 78 74 2e 29 0a 2a  ds plaintext.).*
0ed0: 2a 0a 2a 2a 20 20 2d 2d 66 61 6d 69 6c 79 20 69  *.**  --family i
0ee0: 70 76 34 20 20 20 20 4f 6e 6c 79 20 61 63 63 65  pv4    Only acce
0ef0: 70 74 20 69 6e 70 75 74 20 66 72 6f 6d 20 49 50  pt input from IP
0f00: 56 34 20 6f 72 20 49 50 56 36 2c 20 72 65 73 70  V4 or IPV6, resp
0f10: 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 20 2d 2d  ectively..**  --
0f20: 66 61 6d 69 6c 79 20 69 70 76 36 20 20 20 20 54  family ipv6    T
0f30: 68 65 73 65 20 6f 70 74 69 6f 6e 73 20 61 72 65  hese options are
0f40: 20 6f 6e 6c 79 20 6d 65 61 6e 69 6e 67 66 75 6c   only meaningful
0f50: 20 69 66 20 61 6c 74 68 74 74 70 64 20 69 73 20   if althttpd is 
0f60: 72 75 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  run.**          
0f70: 20 20 20 20 20 20 20 20 20 61 73 20 61 20 73 74           as a st
0f80: 61 6e 64 2d 61 6c 6f 6e 65 20 73 65 72 76 65 72  and-alone server
0f90: 2e 0a 2a 2a 0a 2a 2a 20 20 2d 2d 6a 61 69 6c 20  ..**.**  --jail 
0fa0: 42 4f 4f 4c 45 41 4e 20 20 20 49 6e 64 69 63 61  BOOLEAN   Indica
0fb0: 74 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e  tes whether or n
0fc0: 6f 74 20 74 6f 20 66 6f 72 6d 20 61 20 63 68 72  ot to form a chr
0fd0: 6f 6f 74 20 6a 61 69 6c 20 69 66 20 0a 2a 2a 20  oot jail if .** 
0fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ff0: 20 20 69 6e 69 74 69 61 6c 6c 79 20 72 75 6e 20    initially run 
1000: 61 73 20 72 6f 6f 74 2e 20 20 54 68 65 20 64 65  as root.  The de
1010: 66 61 75 6c 74 20 69 73 20 74 72 75 65 2c 20 73  fault is true, s
1020: 6f 20 74 68 65 20 6f 6e 6c 79 0a 2a 2a 20 20 20  o the only.**   
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1040: 75 73 65 66 75 6c 20 76 61 72 69 61 6e 74 20 6f  useful variant o
1050: 66 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 69 73  f this option is
1060: 20 22 2d 2d 6a 61 69 6c 20 30 22 20 77 68 69 63   "--jail 0" whic
1070: 68 20 70 72 65 76 65 6e 74 73 0a 2a 2a 20 20 20  h prevents.**   
1080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1090: 74 68 65 20 66 6f 72 6d 61 74 69 6f 6e 20 6f 66  the formation of
10a0: 20 74 68 65 20 63 68 72 6f 6f 74 20 6a 61 69 6c   the chroot jail
10b0: 2e 0a 2a 2a 0a 2a 2a 20 20 2d 2d 64 65 62 75 67  ..**.**  --debug
10c0: 20 20 20 20 20 20 20 20 20 20 44 69 73 61 62 6c            Disabl
10d0: 65 73 20 69 6e 70 75 74 20 74 69 6d 65 6f 75 74  es input timeout
10e0: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 66  s.  This is usef
10f0: 75 6c 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ul for debugging
1100: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1110: 20 20 20 20 20 20 77 68 65 6e 20 69 6e 70 75 74        when input
1120: 73 20 69 73 20 62 65 69 6e 67 20 74 79 70 65 64  s is being typed
1130: 20 69 6e 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a   in manually..**
1140: 0a 2a 2a 20 43 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  .** Command-line
1150: 20 6f 70 74 69 6f 6e 73 20 63 61 6e 20 74 61 6b   options can tak
1160: 65 20 65 69 74 68 65 72 20 6f 6e 65 20 6f 72 20  e either one or 
1170: 74 77 6f 20 69 6e 69 74 69 61 6c 20 22 2d 22 20  two initial "-" 
1180: 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 20 53  characters..** S
1190: 6f 20 22 2d 2d 64 65 62 75 67 22 20 61 6e 64 20  o "--debug" and 
11a0: 22 2d 64 65 62 75 67 22 20 6d 65 61 6e 20 74 68  "-debug" mean th
11b0: 65 20 73 61 6d 65 20 74 68 69 6e 67 2c 20 66 6f  e same thing, fo
11c0: 72 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 0a 2a 2a  r example..**.**
11d0: 0a 2a 2a 20 53 65 63 75 72 69 74 79 20 46 65 61  .** Security Fea
11e0: 74 75 72 65 73 3a 0a 2a 2a 0a 2a 2a 20 28 31 29  tures:.**.** (1)
11f0: 20 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20 61    This program a
1200: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 70 75 74  utomatically put
1210: 73 20 69 74 73 65 6c 66 20 69 6e 73 69 64 65 20  s itself inside 
1220: 61 20 63 68 72 6f 6f 74 20 6a 61 69 6c 20 69 66  a chroot jail if
1230: 0a 2a 2a 20 20 20 20 20 20 69 74 20 63 61 6e 20  .**      it can 
1240: 61 6e 64 20 69 66 20 6e 6f 74 20 73 70 65 63 69  and if not speci
1250: 66 69 63 61 6c 6c 79 20 70 72 6f 68 69 62 69 74  fically prohibit
1260: 65 64 20 62 79 20 74 68 65 20 22 2d 2d 6a 61 69  ed by the "--jai
1270: 6c 20 30 22 0a 2a 2a 20 20 20 20 20 20 63 6f 6d  l 0".**      com
1280: 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand-line option
1290: 2e 20 20 54 68 65 20 72 6f 6f 74 20 6f 66 20 74  .  The root of t
12a0: 68 65 20 6a 61 69 6c 20 69 73 20 74 68 65 20 64  he jail is the d
12b0: 69 72 65 63 74 6f 72 79 20 74 68 61 74 0a 2a 2a  irectory that.**
12c0: 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 73 20 74        contains t
12d0: 68 65 20 76 61 72 69 6f 75 73 20 24 48 4f 53 54  he various $HOST
12e0: 2e 77 65 62 73 69 74 65 20 63 6f 6e 74 65 6e 74  .website content
12f0: 20 73 75 62 64 69 72 65 63 74 6f 72 69 65 73 2e   subdirectories.
1300: 0a 2a 2a 0a 2a 2a 20 28 32 29 20 20 4e 6f 20 69  .**.** (2)  No i
1310: 6e 70 75 74 20 69 73 20 72 65 61 64 20 77 68 69  nput is read whi
1320: 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
1330: 68 61 73 20 72 6f 6f 74 20 70 72 69 76 69 6c 65  has root privile
1340: 67 65 73 2e 20 20 52 6f 6f 74 0a 2a 2a 20 20 20  ges.  Root.**   
1350: 20 20 20 70 72 69 76 69 6c 65 67 65 73 20 61 72     privileges ar
1360: 65 20 64 72 6f 70 70 65 64 20 70 72 69 6f 72 20  e dropped prior 
1370: 74 6f 20 72 65 61 64 69 6e 67 20 61 6e 79 20 69  to reading any i
1380: 6e 70 75 74 20 28 62 75 74 20 61 66 74 65 72 20  nput (but after 
1390: 65 6e 74 65 72 69 6e 67 0a 2a 2a 20 20 20 20 20  entering.**     
13a0: 20 74 68 65 20 63 68 72 6f 6f 74 20 6a 61 69 6c   the chroot jail
13b0: 2c 20 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49  , of course).  I
13c0: 66 20 72 6f 6f 74 20 70 72 69 76 69 6c 65 67 65  f root privilege
13d0: 73 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70  s cannot be drop
13e0: 70 65 64 0a 2a 2a 20 20 20 20 20 20 28 66 6f 72  ped.**      (for
13f0: 20 65 78 61 6d 70 6c 65 20 62 65 63 61 75 73 65   example because
1400: 20 74 68 65 20 2d 2d 75 73 65 72 20 63 6f 6d 6d   the --user comm
1410: 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20  and-line option 
1420: 77 61 73 20 6f 6d 69 74 74 65 64 20 6f 72 0a 2a  was omitted or.*
1430: 2a 20 20 20 20 20 20 62 65 63 61 75 73 65 20 74  *      because t
1440: 68 65 20 75 73 65 72 20 73 70 65 63 69 66 69 65  he user specifie
1450: 64 20 62 79 20 74 68 65 20 2d 2d 75 73 65 72 20  d by the --user 
1460: 6f 70 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  option does not 
1470: 65 78 69 73 74 29 2c 20 0a 2a 2a 20 20 20 20 20  exist), .**     
1480: 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
1490: 73 20 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e  s aborts with an
14a0: 20 65 72 72 6f 72 20 70 72 69 6f 72 20 74 6f 20   error prior to 
14b0: 72 65 61 64 69 6e 67 20 61 6e 79 20 69 6e 70 75  reading any inpu
14c0: 74 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20 20 54 68  t..**.** (3)  Th
14d0: 65 20 6c 65 6e 67 74 68 20 6f 66 20 61 6e 20 48  e length of an H
14e0: 54 54 50 20 72 65 71 75 65 73 74 20 69 73 20 6c  TTP request is l
14f0: 69 6d 69 74 65 64 20 74 6f 20 4d 41 58 5f 43 4f  imited to MAX_CO
1500: 4e 54 45 4e 54 5f 4c 45 4e 47 54 48 20 62 79 74  NTENT_LENGTH byt
1510: 65 73 0a 2a 2a 20 20 20 20 20 20 28 64 65 66 61  es.**      (defa
1520: 75 6c 74 3a 20 32 30 20 6d 69 6c 6c 69 6f 6e 29  ult: 20 million)
1530: 2e 20 20 41 6e 79 20 48 54 54 50 20 72 65 71 75  .  Any HTTP requ
1540: 65 73 74 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20  est longer than 
1550: 74 68 69 73 20 66 61 69 6c 73 0a 2a 2a 20 20 20  this fails.**   
1560: 20 20 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72     with an error
1570: 2e 0a 2a 2a 0a 2a 2a 20 28 34 29 20 20 54 68 65  ..**.** (4)  The
1580: 72 65 20 61 72 65 20 68 61 72 64 2d 63 6f 64 65  re are hard-code
1590: 64 20 74 69 6d 65 2d 6f 75 74 73 20 6f 6e 20 65  d time-outs on e
15a0: 61 63 68 20 48 54 54 50 20 72 65 71 75 65 73 74  ach HTTP request
15b0: 2e 20 20 49 66 20 74 68 69 73 20 70 72 6f 63 65  .  If this proce
15c0: 73 73 0a 2a 2a 20 20 20 20 20 20 77 61 69 74 73  ss.**      waits
15d0: 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74 68 65   longer than the
15e0: 20 74 69 6d 65 6f 75 74 20 66 6f 72 20 74 68 65   timeout for the
15f0: 20 63 6f 6d 70 6c 65 74 65 20 72 65 71 75 65 73   complete reques
1600: 74 2c 20 6f 72 20 66 6f 72 20 43 47 49 0a 2a 2a  t, or for CGI.**
1610: 20 20 20 20 20 20 74 6f 20 66 69 6e 69 73 68 20        to finish 
1620: 72 75 6e 6e 69 6e 67 2c 20 74 68 65 6e 20 74 68  running, then th
1630: 69 73 20 70 72 6f 63 65 73 73 20 61 62 6f 72 74  is process abort
1640: 73 2e 20 20 28 54 68 65 20 74 69 6d 65 6f 75 74  s.  (The timeout
1650: 20 66 65 61 74 75 72 65 0a 2a 2a 20 20 20 20 20   feature.**     
1660: 20 63 61 6e 20 62 65 20 64 69 73 61 62 6c 65 64   can be disabled
1670: 20 75 73 69 6e 67 20 74 68 65 20 2d 2d 64 65 62   using the --deb
1680: 75 67 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  ug command-line 
1690: 6f 70 74 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 28  option.).**.** (
16a0: 35 29 20 20 49 66 20 74 68 65 20 48 54 54 50 5f  5)  If the HTTP_
16b0: 48 4f 53 54 20 72 65 71 75 65 73 74 20 68 65 61  HOST request hea
16c0: 64 65 72 20 63 6f 6e 74 61 69 6e 73 20 63 68 61  der contains cha
16d0: 72 61 63 74 65 72 73 20 6f 74 68 65 72 20 74 68  racters other th
16e0: 61 6e 0a 2a 2a 20 20 20 20 20 20 5b 30 2d 39 61  an.**      [0-9a
16f0: 2d 7a 41 2d 5a 2c 2d 2e 2f 3a 5f 7e 5d 20 74 68  -zA-Z,-./:_~] th
1700: 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20 72 65  en the entire re
1710: 71 75 65 73 74 20 69 73 20 72 65 6a 65 63 74 65  quest is rejecte
1720: 64 2e 0a 2a 2a 0a 2a 2a 20 28 36 29 20 20 41 6e  d..**.** (6)  An
1730: 79 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  y characters in 
1740: 74 68 65 20 55 52 49 20 70 61 74 68 6e 61 6d 65  the URI pathname
1750: 20 6f 74 68 65 72 20 74 68 61 6e 20 5b 30 2d 39   other than [0-9
1760: 61 2d 7a 41 2d 5a 2c 2d 2e 2f 3a 5f 7e 5d 0a 2a  a-zA-Z,-./:_~].*
1770: 2a 20 20 20 20 20 20 61 72 65 20 63 6f 6e 76 65  *      are conve
1780: 72 74 65 64 20 69 6e 74 6f 20 22 5f 22 2e 20 20  rted into "_".  
1790: 54 68 69 73 20 61 70 70 6c 69 65 73 20 74 6f 20  This applies to 
17a0: 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f 6e 6c  the pathname onl
17b0: 79 2c 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 74  y, not.**      t
17c0: 6f 20 74 68 65 20 71 75 65 72 79 20 70 61 72 61  o the query para
17d0: 6d 65 74 65 72 73 20 6f 72 20 66 72 61 67 6d 65  meters or fragme
17e0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 28 37 29 20 20 49  nt..**.** (7)  I
17f0: 66 20 74 68 65 20 66 69 72 73 74 20 63 68 61 72  f the first char
1800: 61 63 74 65 72 20 6f 66 20 61 6e 79 20 55 52 49  acter of any URI
1810: 20 70 61 74 68 6e 61 6d 65 20 63 6f 6d 70 6f 6e   pathname compon
1820: 65 6e 74 20 69 73 20 22 2e 22 20 6f 72 20 22 2d  ent is "." or "-
1830: 22 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e 20 61  ".**      then a
1840: 20 34 30 34 20 4e 6f 74 20 46 6f 75 6e 64 20 72   404 Not Found r
1850: 65 70 6c 79 20 69 73 20 67 65 6e 65 72 61 74 65  eply is generate
1860: 64 2e 20 20 54 68 69 73 20 70 72 65 76 65 6e 74  d.  This prevent
1870: 73 20 61 74 74 61 63 6b 73 0a 2a 2a 20 20 20 20  s attacks.**    
1880: 20 20 73 75 63 68 20 61 73 20 69 6e 63 6c 75 64    such as includ
1890: 69 6e 67 20 22 2e 2e 22 20 6f 72 20 22 2e 22 20  ing ".." or "." 
18a0: 64 69 72 65 63 74 6f 72 79 20 65 6c 65 6d 65 6e  directory elemen
18b0: 74 73 20 69 6e 20 74 68 65 20 70 61 74 68 6e 61  ts in the pathna
18c0: 6d 65 0a 2a 2a 20 20 20 20 20 20 61 6e 64 20 61  me.**      and a
18d0: 6c 6c 6f 77 73 20 70 6c 61 63 69 6e 67 20 66 69  llows placing fi
18e0: 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72  les and director
18f0: 69 65 73 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  ies in the conte
1900: 6e 74 20 73 75 62 64 69 72 65 63 74 6f 72 79 0a  nt subdirectory.
1910: 2a 2a 20 20 20 20 20 20 74 68 61 74 20 61 72 65  **      that are
1920: 20 69 6e 76 69 73 69 62 6c 65 20 74 6f 20 61 6c   invisible to al
1930: 6c 20 48 54 54 50 20 72 65 71 75 65 73 74 73 2c  l HTTP requests,
1940: 20 62 79 20 6d 61 6b 69 6e 67 20 74 68 65 20 66   by making the f
1950: 69 72 73 74 20 0a 2a 2a 20 20 20 20 20 20 63 68  irst .**      ch
1960: 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 66  aracter of the f
1970: 69 6c 65 20 6f 72 20 73 75 62 64 69 72 65 63 74  ile or subdirect
1980: 6f 72 79 20 6e 61 6d 65 20 22 2d 22 20 6f 72 20  ory name "-" or 
1990: 22 2e 22 2e 0a 2a 2a 0a 2a 2a 20 28 38 29 20 20  "."..**.** (8)  
19a0: 54 68 65 20 72 65 71 75 65 73 74 20 55 52 49 20  The request URI 
19b0: 6d 75 73 74 20 62 65 67 69 6e 20 77 69 74 68 20  must begin with 
19c0: 22 2f 22 20 6f 72 20 65 6c 73 65 20 61 20 34 30  "/" or else a 40
19d0: 34 20 65 72 72 6f 72 20 69 73 20 67 65 6e 65 72  4 error is gener
19e0: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 28 39 29 20  ated..**.** (9) 
19f0: 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20 6e 65   This program ne
1a00: 76 65 72 20 73 65 74 73 20 74 68 65 20 76 61 6c  ver sets the val
1a10: 75 65 20 6f 66 20 61 6e 20 65 6e 76 69 72 6f 6e  ue of an environ
1a20: 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 74 6f  ment variable to
1a30: 20 61 0a 2a 2a 20 20 20 20 20 20 73 74 72 69 6e   a.**      strin
1a40: 67 20 74 68 61 74 20 62 65 67 69 6e 73 20 77 69  g that begins wi
1a50: 74 68 20 22 28 29 20 7b 22 2e 0a 2a 2a 0a 2a 2a  th "() {"..**.**
1a60: 0a 2a 2a 20 42 61 73 69 63 20 41 75 74 68 6f 72  .** Basic Author
1a70: 69 7a 61 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 49  ization:.**.** I
1a80: 66 20 74 68 65 20 66 69 6c 65 20 22 2d 61 75 74  f the file "-aut
1a90: 68 22 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  h" exists in the
1aa0: 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20   same directory 
1ab0: 61 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66  as the content f
1ac0: 69 6c 65 0a 2a 2a 20 28 66 6f 72 20 62 6f 74 68  ile.** (for both
1ad0: 20 73 74 61 74 69 63 20 63 6f 6e 74 65 6e 74 20   static content 
1ae0: 61 6e 64 20 43 47 49 29 20 74 68 65 6e 20 69 74  and CGI) then it
1af0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e   contains the in
1b00: 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 0a 2a  formation used.*
1b10: 2a 20 66 6f 72 20 62 61 73 69 63 20 61 75 74 68  * for basic auth
1b20: 6f 72 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20  orization.  The 
1b30: 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61  file format is a
1b40: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
1b50: 20 20 20 20 2a 20 20 42 6c 61 6e 6b 20 6c 69 6e      *  Blank lin
1b60: 65 73 20 61 6e 64 20 6c 69 6e 65 73 20 74 68 61  es and lines tha
1b70: 74 20 62 65 67 69 6e 20 77 69 74 68 20 27 23 27  t begin with '#'
1b80: 20 61 72 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20   are ignored.** 
1b90: 20 20 20 2a 20 20 22 68 74 74 70 2d 72 65 64 69     *  "http-redi
1ba0: 72 65 63 74 22 20 66 6f 72 63 65 73 20 61 20 72  rect" forces a r
1bb0: 65 64 69 72 65 63 74 20 74 6f 20 48 54 54 50 53  edirect to HTTPS
1bc0: 20 69 66 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   if not there al
1bd0: 72 65 61 64 79 0a 2a 2a 20 20 20 20 2a 20 20 22  ready.**    *  "
1be0: 68 74 74 70 73 2d 6f 6e 6c 79 22 20 64 69 73 61  https-only" disa
1bf0: 6c 6c 6f 77 73 20 6f 70 65 72 61 74 69 6f 6e 20  llows operation 
1c00: 69 6e 20 48 54 54 50 0a 2a 2a 20 20 20 20 2a 20  in HTTP.**    * 
1c10: 20 22 75 73 65 72 20 4e 41 4d 45 20 4c 4f 47 49   "user NAME LOGI
1c20: 4e 3a 50 41 53 53 57 4f 52 44 22 20 63 68 65 63  N:PASSWORD" chec
1c30: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 4c 4f 47  ks to see if LOG
1c40: 49 4e 3a 50 41 53 53 57 4f 52 44 20 0a 2a 2a 20  IN:PASSWORD .** 
1c50: 20 20 20 20 20 20 61 75 74 68 6f 72 69 7a 61 74        authorizat
1c60: 69 6f 6e 20 63 72 65 64 65 6e 74 69 61 6c 73 20  ion credentials 
1c70: 61 72 65 20 70 72 6f 76 69 64 65 64 2c 20 61 6e  are provided, an
1c80: 64 20 69 66 20 73 6f 20 73 65 74 73 20 74 68 65  d if so sets the
1c90: 0a 2a 2a 20 20 20 20 20 20 20 52 45 4d 4f 54 45  .**       REMOTE
1ca0: 5f 55 53 45 52 20 74 6f 20 4e 41 4d 45 2e 0a 2a  _USER to NAME..*
1cb0: 2a 20 20 20 20 2a 20 20 22 72 65 61 6c 6d 20 54  *    *  "realm T
1cc0: 45 58 54 22 20 73 65 74 73 20 74 68 65 20 72 65  EXT" sets the re
1cd0: 61 6c 6d 20 74 6f 20 54 45 58 54 2e 0a 2a 2a 0a  alm to TEXT..**.
1ce0: 2a 2a 20 54 68 65 72 65 20 63 61 6e 20 62 65 20  ** There can be 
1cf0: 6d 75 6c 74 69 70 6c 65 20 22 75 73 65 72 22 20  multiple "user" 
1d00: 6c 69 6e 65 73 2e 20 20 49 66 20 6e 6f 20 22 75  lines.  If no "u
1d10: 73 65 72 22 20 6c 69 6e 65 20 6d 61 74 63 68 65  ser" line matche
1d20: 73 2c 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73  s, the.** reques
1d30: 74 20 66 61 69 6c 73 20 77 69 74 68 20 61 20 34  t fails with a 4
1d40: 30 31 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 69 6e  01 error..*/.#in
1d50: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
1d60: 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e  #include <ctype.
1d70: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
1d80: 6c 6f 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  log.h>.#include 
1d90: 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c  <stdlib.h>.#incl
1da0: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
1db0: 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74  .#include <unist
1dc0: 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66  d.h>.#include <f
1dd0: 63 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  cntl.h>.#include
1de0: 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63   <string.h>.#inc
1df0: 6c 75 64 65 20 3c 70 77 64 2e 68 3e 0a 23 69 6e  lude <pwd.h>.#in
1e00: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1e10: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
1e20: 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75  /types.h>.#inclu
1e30: 64 65 20 3c 73 79 73 2f 73 6f 63 6b 65 74 2e 68  de <sys/socket.h
1e40: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  >.#include <sys/
1e50: 77 61 69 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  wait.h>.#include
1e60: 20 3c 6e 65 74 69 6e 65 74 2f 69 6e 2e 68 3e 0a   <netinet/in.h>.
1e70: 23 69 6e 63 6c 75 64 65 20 3c 61 72 70 61 2f 69  #include <arpa/i
1e80: 6e 65 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  net.h>.#include 
1e90: 3c 73 74 64 61 72 67 2e 68 3e 0a 23 69 6e 63 6c  <stdarg.h>.#incl
1ea0: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1eb0: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 73  clude <sys/times
1ec0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6e 65  .h>.#include <ne
1ed0: 74 64 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  tdb.h>.#include 
1ee0: 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 6e 63 6c 75  <errno.h>.#inclu
1ef0: 64 65 20 3c 73 79 73 2f 72 65 73 6f 75 72 63 65  de <sys/resource
1f00: 2e 68 3e 0a 23 69 66 64 65 66 20 6c 69 6e 75 78  .h>.#ifdef linux
1f10: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73  .#include <sys/s
1f20: 65 6e 64 66 69 6c 65 2e 68 3e 0a 23 65 6e 64 69  endfile.h>.#endi
1f30: 66 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65  f.#include <asse
1f40: 72 74 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  rt.h>../*.** Con
1f50: 66 69 67 75 72 65 20 74 68 65 20 73 65 72 76 65  figure the serve
1f60: 72 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  r by setting the
1f70: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
1f80: 73 20 61 6e 64 20 72 65 63 6f 6d 70 69 6c 69 6e  s and recompilin
1f90: 67 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 44 45  g..*/.#ifndef DE
1fa0: 46 41 55 4c 54 5f 50 4f 52 54 0a 23 64 65 66 69  FAULT_PORT.#defi
1fb0: 6e 65 20 44 45 46 41 55 4c 54 5f 50 4f 52 54 20  ne DEFAULT_PORT 
1fc0: 22 38 30 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e  "80".#endif.#ifn
1fd0: 64 65 66 20 4d 41 58 5f 43 4f 4e 54 45 4e 54 5f  def MAX_CONTENT_
1fe0: 4c 45 4e 47 54 48 0a 23 64 65 66 69 6e 65 20 4d  LENGTH.#define M
1ff0: 41 58 5f 43 4f 4e 54 45 4e 54 5f 4c 45 4e 47 54  AX_CONTENT_LENGT
2000: 48 20 32 30 30 30 30 30 30 30 0a 23 65 6e 64 69  H 20000000.#endi
2010: 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 72 65 63 6f  f../*.** We reco
2020: 72 64 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 73  rd most of the s
2030: 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tate information
2040: 20 61 73 20 67 6c 6f 62 61 6c 20 76 61 72 69 61   as global varia
2050: 62 6c 65 73 2e 20 20 54 68 69 73 0a 2a 2a 20 73  bles.  This.** s
2060: 61 76 65 73 20 68 61 76 69 6e 67 20 74 6f 20 70  aves having to p
2070: 61 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ass information 
2080: 74 6f 20 73 75 62 72 6f 75 74 69 6e 65 73 20 61  to subroutines a
2090: 73 20 70 61 72 61 6d 65 74 65 72 73 2c 20 61 6e  s parameters, an
20a0: 64 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 65  d.** makes the e
20b0: 78 65 63 75 74 61 62 6c 65 20 73 6d 61 6c 6c 65  xecutable smalle
20c0: 72 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  r....*/.static c
20d0: 68 61 72 20 2a 7a 52 6f 6f 74 20 3d 20 30 3b 20  har *zRoot = 0; 
20e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
20f0: 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68   directory of th
2100: 65 20 77 65 62 73 69 74 65 20 2a 2f 0a 73 74 61  e website */.sta
2110: 74 69 63 20 63 68 61 72 20 2a 7a 54 6d 70 4e 61  tic char *zTmpNa
2120: 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  m = 0;        /*
2130: 20 4e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f   Name of a tempo
2140: 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 73 74 61  rary file */.sta
2150: 74 69 63 20 63 68 61 72 20 7a 54 6d 70 4e 61 6d  tic char zTmpNam
2160: 42 75 66 5b 35 30 30 5d 3b 20 20 20 20 20 2f 2a  Buf[500];     /*
2170: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
2180: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
2190: 65 6e 61 6d 65 20 2a 2f 0a 73 74 61 74 69 63 20  ename */.static 
21a0: 63 68 61 72 20 2a 7a 50 72 6f 74 6f 63 6f 6c 20  char *zProtocol 
21b0: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  = 0;      /* The
21c0: 20 70 72 6f 74 6f 63 6f 6c 20 62 65 69 6e 67 20   protocol being 
21d0: 75 73 69 6e 67 20 62 79 20 74 68 65 20 62 72 6f  using by the bro
21e0: 77 73 65 72 20 2a 2f 0a 73 74 61 74 69 63 20 63  wser */.static c
21f0: 68 61 72 20 2a 7a 4d 65 74 68 6f 64 20 3d 20 30  har *zMethod = 0
2200: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
2210: 6d 65 74 68 6f 64 2e 20 20 4d 75 73 74 20 62 65  method.  Must be
2220: 20 47 45 54 20 2a 2f 0a 73 74 61 74 69 63 20 63   GET */.static c
2230: 68 61 72 20 2a 7a 53 63 72 69 70 74 20 3d 20 30  har *zScript = 0
2240: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
2250: 6f 62 6a 65 63 74 20 74 6f 20 72 65 74 72 69 65  object to retrie
2260: 76 65 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  ve */.static cha
2270: 72 20 2a 7a 52 65 61 6c 53 63 72 69 70 74 20 3d  r *zRealScript =
2280: 20 30 3b 20 20 20 20 2f 2a 20 54 68 65 20 6f 62   0;    /* The ob
2290: 6a 65 63 74 20 74 6f 20 72 65 74 72 69 65 76 65  ject to retrieve
22a0: 2e 20 20 53 61 6d 65 20 61 73 20 7a 53 63 72 69  .  Same as zScri
22b0: 70 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  pt.             
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d0: 20 20 20 20 2a 2a 20 65 78 63 65 70 74 20 6d 69      ** except mi
22e0: 67 68 74 20 68 61 76 65 20 22 2f 69 6e 64 65 78  ght have "/index
22f0: 2e 68 74 6d 6c 22 20 61 70 70 65 6e 64 65 64 20  .html" appended 
2300: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
2310: 7a 48 6f 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  zHome = 0;      
2320: 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63      /* The direc
2330: 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
2340: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 73 74 61 74 69  content */.stati
2350: 63 20 63 68 61 72 20 2a 7a 51 75 65 72 79 53 74  c char *zQuerySt
2360: 72 69 6e 67 20 3d 20 30 3b 20 20 20 2f 2a 20 54  ring = 0;   /* T
2370: 68 65 20 71 75 65 72 79 20 73 74 72 69 6e 67 20  he query string 
2380: 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  on the end of th
2390: 65 20 6e 61 6d 65 20 2a 2f 0a 73 74 61 74 69 63  e name */.static
23a0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 30   char *zFile = 0
23b0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
23c0: 65 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68  e filename of th
23d0: 65 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74 72  e object to retr
23e0: 69 65 76 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  ieve */.static i
23f0: 6e 74 20 6c 65 6e 46 69 6c 65 20 3d 20 30 3b 20  nt lenFile = 0; 
2400: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
2410: 74 68 20 6f 66 20 74 68 65 20 7a 46 69 6c 65 20  th of the zFile 
2420: 6e 61 6d 65 20 2a 2f 0a 73 74 61 74 69 63 20 63  name */.static c
2430: 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 20 20  har *zDir = 0;  
2440: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
2450: 20 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72   of the director
2460: 79 20 68 6f 6c 64 69 6e 67 20 7a 46 69 6c 65 20  y holding zFile 
2470: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
2480: 7a 50 61 74 68 49 6e 66 6f 20 3d 20 30 3b 20 20  zPathInfo = 0;  
2490: 20 20 20 20 2f 2a 20 50 61 72 74 20 6f 66 20 74      /* Part of t
24a0: 68 65 20 70 61 74 68 6e 61 6d 65 20 70 61 73 74  he pathname past
24b0: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 73 74 61   the file */.sta
24c0: 74 69 63 20 63 68 61 72 20 2a 7a 41 67 65 6e 74  tic char *zAgent
24d0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
24e0: 20 57 68 61 74 20 74 79 70 65 20 69 66 20 62 72   What type if br
24f0: 6f 77 73 65 72 20 69 73 20 6d 61 6b 69 6e 67 20  owser is making 
2500: 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 73 74  this query */.st
2510: 61 74 69 63 20 63 68 61 72 20 2a 7a 53 65 72 76  atic char *zServ
2520: 65 72 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f  erName = 0;    /
2530: 2a 20 54 68 65 20 6e 61 6d 65 20 61 66 74 65 72  * The name after
2540: 20 74 68 65 20 68 74 74 70 3a 2f 2f 20 2a 2f 0a   the http:// */.
2550: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 53 65  static char *zSe
2560: 72 76 65 72 50 6f 72 74 20 3d 20 30 3b 20 20 20  rverPort = 0;   
2570: 20 2f 2a 20 54 68 65 20 70 6f 72 74 20 6e 75 6d   /* The port num
2580: 62 65 72 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  ber */.static ch
2590: 61 72 20 2a 7a 43 6f 6f 6b 69 65 20 3d 20 30 3b  ar *zCookie = 0;
25a0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6f 6b 69          /* Cooki
25b0: 65 73 20 72 65 70 6f 72 74 65 64 20 77 69 74 68  es reported with
25c0: 20 74 68 65 20 72 65 71 75 65 73 74 20 2a 2f 0a   the request */.
25d0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 48 74  static char *zHt
25e0: 74 70 48 6f 73 74 20 3d 20 30 3b 20 20 20 20 20  tpHost = 0;     
25f0: 20 2f 2a 20 4e 61 6d 65 20 61 63 63 6f 72 64 69   /* Name accordi
2600: 6e 67 20 74 6f 20 74 68 65 20 77 65 62 20 62 72  ng to the web br
2610: 6f 77 73 65 72 20 2a 2f 0a 73 74 61 74 69 63 20  owser */.static 
2620: 63 68 61 72 20 2a 7a 52 65 61 6c 50 6f 72 74 20  char *zRealPort 
2630: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  = 0;      /* The
2640: 20 72 65 61 6c 20 54 43 50 20 70 6f 72 74 20 77   real TCP port w
2650: 68 65 6e 20 72 75 6e 6e 69 6e 67 20 61 73 20 64  hen running as d
2660: 61 65 6d 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20  aemon */.static 
2670: 63 68 61 72 20 2a 7a 52 65 6d 6f 74 65 41 64 64  char *zRemoteAdd
2680: 72 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 50 20  r = 0;    /* IP 
2690: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 72  address of the r
26a0: 65 71 75 65 73 74 20 2a 2f 0a 73 74 61 74 69 63  equest */.static
26b0: 20 63 68 61 72 20 2a 7a 52 65 66 65 72 65 72 20   char *zReferer 
26c0: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  = 0;       /* Na
26d0: 6d 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  me of the page t
26e0: 68 61 74 20 72 65 66 65 72 65 64 20 74 6f 20 75  hat refered to u
26f0: 73 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  s */.static char
2700: 20 2a 7a 41 63 63 65 70 74 20 3d 20 30 3b 20 20   *zAccept = 0;  
2710: 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 66 6f        /* What fo
2720: 72 6d 61 74 73 20 77 69 6c 6c 20 62 65 20 61 63  rmats will be ac
2730: 63 65 70 74 65 64 20 2a 2f 0a 73 74 61 74 69 63  cepted */.static
2740: 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 4c   char *zContentL
2750: 65 6e 67 74 68 20 3d 20 30 3b 20 2f 2a 20 43 6f  ength = 0; /* Co
2760: 6e 74 65 6e 74 20 6c 65 6e 67 74 68 20 72 65 70  ntent length rep
2770: 6f 72 74 65 64 20 69 6e 20 74 68 65 20 68 65 61  orted in the hea
2780: 64 65 72 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  der */.static ch
2790: 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 54 79 70 65  ar *zContentType
27a0: 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 6e 74 65   = 0;   /* Conte
27b0: 6e 74 20 74 79 70 65 20 72 65 70 6f 72 74 65 64  nt type reported
27c0: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 2a   in the header *
27d0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a  /.static char *z
27e0: 51 75 65 72 79 53 75 66 66 69 78 20 3d 20 30 3b  QuerySuffix = 0;
27f0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 74 20 6f     /* The part o
2800: 66 20 74 68 65 20 55 52 4c 20 61 66 74 65 72 20  f the URL after 
2810: 74 68 65 20 66 69 72 73 74 20 3f 20 2a 2f 0a 73  the first ? */.s
2820: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 41 75 74  tatic char *zAut
2830: 68 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20  hType = 0;      
2840: 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e  /* Authorization
2850: 20 74 79 70 65 20 28 62 61 73 69 63 20 6f 72 20   type (basic or 
2860: 64 69 67 65 73 74 29 20 2a 2f 0a 73 74 61 74 69  digest) */.stati
2870: 63 20 63 68 61 72 20 2a 7a 41 75 74 68 41 72 67  c char *zAuthArg
2880: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41   = 0;       /* A
2890: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 76 61 6c  uthorization val
28a0: 75 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  ues */.static ch
28b0: 61 72 20 2a 7a 52 65 6d 6f 74 65 55 73 65 72 20  ar *zRemoteUser 
28c0: 3d 20 30 3b 20 20 20 20 2f 2a 20 52 45 4d 4f 54  = 0;    /* REMOT
28d0: 45 5f 55 53 45 52 20 73 65 74 20 62 79 20 61 75  E_USER set by au
28e0: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 6d 6f 64 75  thorization modu
28f0: 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  le */.static int
2900: 20 6e 49 6e 20 3d 20 30 3b 20 20 20 20 20 20 20   nIn = 0;       
2910: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2920: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 69 6e 70   of bytes of inp
2930: 75 74 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ut */.static int
2940: 20 6e 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20   nOut = 0;      
2950: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2960: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6f 75 74   of bytes of out
2970: 70 75 74 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  put */.static ch
2980: 61 72 20 7a 52 65 70 6c 79 53 74 61 74 75 73 5b  ar zReplyStatus[
2990: 34 5d 3b 20 20 20 20 20 2f 2a 20 52 65 70 6c 79  4];     /* Reply
29a0: 20 73 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a   status code */.
29b0: 73 74 61 74 69 63 20 69 6e 74 20 73 74 61 74 75  static int statu
29c0: 73 53 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20  sSent = 0;      
29d0: 20 2f 2a 20 54 72 75 65 20 61 66 74 65 72 20 73   /* True after s
29e0: 74 61 74 75 73 20 6c 69 6e 65 20 69 73 20 73 65  tatus line is se
29f0: 6e 74 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  nt */.static cha
2a00: 72 20 2a 7a 4c 6f 67 46 69 6c 65 20 3d 20 30 3b  r *zLogFile = 0;
2a10: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 6f         /* Log to
2a20: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 73 74   this file */.st
2a30: 61 74 69 63 20 69 6e 74 20 64 65 62 75 67 46 6c  atic int debugFl
2a40: 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  ag = 0;        /
2a50: 2a 20 54 72 75 65 20 69 66 20 62 65 69 6e 67 20  * True if being 
2a60: 64 65 62 75 67 67 65 64 20 2a 2f 0a 73 74 61 74  debugged */.stat
2a70: 69 63 20 73 74 72 75 63 74 20 74 69 6d 65 76 61  ic struct timeva
2a80: 6c 20 62 65 67 69 6e 54 69 6d 65 3b 20 2f 2a 20  l beginTime; /* 
2a90: 54 69 6d 65 20 77 68 65 6e 20 74 68 69 73 20 70  Time when this p
2aa0: 72 6f 63 65 73 73 20 73 74 61 72 74 73 20 2a 2f  rocess starts */
2ab0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73  .static int clos
2ac0: 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 30 3b  eConnection = 0;
2ad0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 6e    /* True to sen
2ae0: 64 20 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c  d Connection: cl
2af0: 6f 73 65 20 69 6e 20 72 65 70 6c 79 20 2a 2f 0a  ose in reply */.
2b00: 73 74 61 74 69 63 20 69 6e 74 20 6e 52 65 71 75  static int nRequ
2b10: 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  est = 0;        
2b20: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
2b30: 71 75 65 73 74 73 20 70 72 6f 63 65 73 73 65 64  quests processed
2b40: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f   */.static int o
2b50: 6d 69 74 4c 6f 67 20 3d 20 30 3b 20 20 20 20 20  mitLog = 0;     
2b60: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6d       /* Do not m
2b70: 61 6b 65 20 6c 6f 67 66 69 6c 65 20 65 6e 74 72  ake logfile entr
2b80: 69 65 73 20 69 66 20 74 72 75 65 20 2a 2f 0a 73  ies if true */.s
2b90: 74 61 74 69 63 20 69 6e 74 20 75 73 65 48 74 74  tatic int useHtt
2ba0: 70 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ps = 0;         
2bb0: 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 48  /* True to use H
2bc0: 54 54 50 53 3a 20 69 6e 73 74 65 61 64 20 6f 66  TTPS: instead of
2bd0: 20 48 54 54 50 3a 20 2a 2f 0a 73 74 61 74 69 63   HTTP: */.static
2be0: 20 63 68 61 72 20 2a 7a 48 74 74 70 20 3d 20 22   char *zHttp = "
2bf0: 68 74 74 70 22 3b 20 20 20 20 20 2f 2a 20 68 74  http";     /* ht
2c00: 74 70 20 6f 72 20 68 74 74 70 73 20 2a 2f 0a 73  tp or https */.s
2c10: 74 61 74 69 63 20 69 6e 74 20 75 73 65 54 69 6d  tatic int useTim
2c20: 65 6f 75 74 20 3d 20 31 3b 20 20 20 20 20 20 20  eout = 1;       
2c30: 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 74  /* True to use t
2c40: 69 6d 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  imes */.static i
2c50: 6e 74 20 73 74 61 6e 64 61 6c 6f 6e 65 20 3d 20  nt standalone = 
2c60: 30 3b 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 20  0;       /* Run 
2c70: 61 73 20 61 20 73 74 61 6e 64 61 6c 6f 6e 65 20  as a standalone 
2c80: 73 65 72 76 65 72 20 28 6e 6f 20 69 6e 65 74 64  server (no inetd
2c90: 29 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ) */.static int 
2ca0: 69 70 76 36 4f 6e 6c 79 20 3d 20 30 3b 20 20 20  ipv6Only = 0;   
2cb0: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 49 50 76        /* Use IPv
2cc0: 36 20 6f 6e 6c 79 20 2a 2f 0a 73 74 61 74 69 63  6 only */.static
2cd0: 20 69 6e 74 20 69 70 76 34 4f 6e 6c 79 20 3d 20   int ipv4Only = 
2ce0: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73  0;         /* Us
2cf0: 65 20 49 50 76 34 20 6f 6e 6c 79 20 2a 2f 0a 73  e IPv4 only */.s
2d00: 74 61 74 69 63 20 73 74 72 75 63 74 20 72 75 73  tatic struct rus
2d10: 61 67 65 20 70 72 69 6f 72 53 65 6c 66 3b 20 20  age priorSelf;  
2d20: 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79 20 72 65  /* Previously re
2d30: 70 6f 72 74 20 53 45 4c 46 20 74 69 6d 65 20 2a  port SELF time *
2d40: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
2d50: 72 75 73 61 67 65 20 70 72 69 6f 72 43 68 69 6c  rusage priorChil
2d60: 64 3b 20 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79  d; /* Previously
2d70: 20 72 65 70 6f 72 74 20 43 48 49 4c 44 20 74 69   report CHILD ti
2d80: 6d 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 6f 75  me */../*.** Dou
2d90: 62 6c 65 20 61 6e 79 20 64 6f 75 62 6c 65 2d 71  ble any double-q
2da0: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 20  uote characters 
2db0: 69 6e 20 61 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  in a string..*/.
2dc0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 45 73 63  static char *Esc
2dd0: 61 70 65 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20  ape(char *z){.  
2de0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
2df0: 6e 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 63  n;.  char c;.  c
2e00: 68 61 72 20 2a 7a 4f 75 74 3b 0a 20 20 66 6f 72  har *zOut;.  for
2e10: 28 69 3d 30 3b 20 28 63 3d 7a 5b 69 5d 29 21 3d  (i=0; (c=z[i])!=
2e20: 30 20 26 26 20 63 21 3d 27 22 27 3b 20 69 2b 2b  0 && c!='"'; i++
2e30: 29 7b 7d 0a 20 20 69 66 28 20 63 3d 3d 30 20 29  ){}.  if( c==0 )
2e40: 20 72 65 74 75 72 6e 20 7a 3b 0a 20 20 6e 20 3d   return z;.  n =
2e50: 20 31 3b 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 28   1;.  for(i++; (
2e60: 63 3d 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29  c=z[i])!=0; i++)
2e70: 7b 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 6e  { if( c=='"' ) n
2e80: 2b 2b 3b 20 7d 0a 20 20 7a 4f 75 74 20 3d 20 6d  ++; }.  zOut = m
2e90: 61 6c 6c 6f 63 28 20 69 2b 6e 2b 31 20 29 3b 0a  alloc( i+n+1 );.
2ea0: 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 20    if( zOut==0 ) 
2eb0: 72 65 74 75 72 6e 20 22 22 3b 0a 20 20 66 6f 72  return "";.  for
2ec0: 28 69 3d 6a 3d 30 3b 20 28 63 3d 7a 5b 69 5d 29  (i=j=0; (c=z[i])
2ed0: 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a  !=0; i++){.    z
2ee0: 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20  Out[j++] = c;.  
2ef0: 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 7a    if( c=='"' ) z
2f00: 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20  Out[j++] = c;.  
2f10: 7d 0a 20 20 7a 4f 75 74 5b 6a 5d 20 3d 20 30 3b  }.  zOut[j] = 0;
2f20: 0a 20 20 72 65 74 75 72 6e 20 7a 4f 75 74 3b 0a  .  return zOut;.
2f30: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
2f40: 20 61 20 73 74 72 75 63 74 20 74 69 6d 65 76 61   a struct timeva
2f50: 6c 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65  l into an intege
2f60: 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  r number of mill
2f70: 69 73 65 63 6f 6e 64 73 0a 2a 2f 0a 73 74 61 74  iseconds.*/.stat
2f80: 69 63 20 69 6e 74 20 74 76 6d 73 28 73 74 72 75  ic int tvms(stru
2f90: 63 74 20 74 69 6d 65 76 61 6c 20 2a 70 29 7b 0a  ct timeval *p){.
2fa0: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28 70    return (int)(p
2fb0: 2d 3e 74 76 5f 73 65 63 2a 31 30 30 30 30 30 30  ->tv_sec*1000000
2fc0: 20 2b 20 70 2d 3e 74 76 5f 75 73 65 63 29 3b 0a   + p->tv_usec);.
2fd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 6e  }../*.** Make an
2fe0: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6c 6f   entry in the lo
2ff0: 67 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 20  g file.  If the 
3000: 48 54 54 50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  HTTP connection 
3010: 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 63 6c 6f  should be.** clo
3020: 73 65 64 2c 20 74 68 65 6e 20 74 65 72 6d 69 6e  sed, then termin
3030: 61 74 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ate this process
3040: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 72 65 74  .  Otherwise ret
3050: 75 72 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  urn..*/.static v
3060: 6f 69 64 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79  oid MakeLogEntry
3070: 28 69 6e 74 20 65 78 69 74 43 6f 64 65 2c 20 69  (int exitCode, i
3080: 6e 74 20 6c 69 6e 65 4e 75 6d 29 7b 0a 20 20 46  nt lineNum){.  F
3090: 49 4c 45 20 2a 6c 6f 67 3b 0a 20 20 69 66 28 20  ILE *log;.  if( 
30a0: 7a 54 6d 70 4e 61 6d 20 29 7b 0a 20 20 20 20 75  zTmpNam ){.    u
30b0: 6e 6c 69 6e 6b 28 7a 54 6d 70 4e 61 6d 29 3b 0a  nlink(zTmpNam);.
30c0: 20 20 7d 0a 20 20 69 66 28 20 7a 4c 6f 67 46 69    }.  if( zLogFi
30d0: 6c 65 20 26 26 20 21 6f 6d 69 74 4c 6f 67 20 29  le && !omitLog )
30e0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 74 69 6d  {.    struct tim
30f0: 65 76 61 6c 20 6e 6f 77 3b 0a 20 20 20 20 73 74  eval now;.    st
3100: 72 75 63 74 20 74 6d 20 2a 70 54 6d 3b 0a 20 20  ruct tm *pTm;.  
3110: 20 20 73 74 72 75 63 74 20 72 75 73 61 67 65 20    struct rusage 
3120: 73 65 6c 66 2c 20 63 68 69 6c 64 72 65 6e 3b 0a  self, children;.
3130: 20 20 20 20 69 6e 74 20 77 61 69 74 53 74 61 74      int waitStat
3140: 75 73 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 52  us;.    char *zR
3150: 4d 20 3d 20 7a 52 65 6d 6f 74 65 55 73 65 72 20  M = zRemoteUser 
3160: 3f 20 7a 52 65 6d 6f 74 65 55 73 65 72 20 3a 20  ? zRemoteUser : 
3170: 22 22 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 46  "";.    char *zF
3180: 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 73 69 7a  ilename;.    siz
3190: 65 5f 74 20 73 7a 3b 0a 20 20 20 20 63 68 61 72  e_t sz;.    char
31a0: 20 7a 44 61 74 65 5b 32 30 30 5d 3b 0a 20 20 20   zDate[200];.   
31b0: 20 63 68 61 72 20 7a 45 78 70 4c 6f 67 46 69 6c   char zExpLogFil
31c0: 65 5b 35 30 30 5d 3b 0a 0a 20 20 20 20 69 66 28  e[500];..    if(
31d0: 20 7a 53 63 72 69 70 74 3d 3d 30 20 29 20 7a 53   zScript==0 ) zS
31e0: 63 72 69 70 74 20 3d 20 22 22 3b 0a 20 20 20 20  cript = "";.    
31f0: 69 66 28 20 7a 52 65 61 6c 53 63 72 69 70 74 3d  if( zRealScript=
3200: 3d 30 20 29 20 7a 52 65 61 6c 53 63 72 69 70 74  =0 ) zRealScript
3210: 20 3d 20 22 22 3b 0a 20 20 20 20 69 66 28 20 7a   = "";.    if( z
3220: 52 65 6d 6f 74 65 41 64 64 72 3d 3d 30 20 29 20  RemoteAddr==0 ) 
3230: 7a 52 65 6d 6f 74 65 41 64 64 72 20 3d 20 22 22  zRemoteAddr = ""
3240: 3b 0a 20 20 20 20 69 66 28 20 7a 48 74 74 70 48  ;.    if( zHttpH
3250: 6f 73 74 3d 3d 30 20 29 20 7a 48 74 74 70 48 6f  ost==0 ) zHttpHo
3260: 73 74 20 3d 20 22 22 3b 0a 20 20 20 20 69 66 28  st = "";.    if(
3270: 20 7a 52 65 66 65 72 65 72 3d 3d 30 20 29 20 7a   zReferer==0 ) z
3280: 52 65 66 65 72 65 72 20 3d 20 22 22 3b 0a 20 20  Referer = "";.  
3290: 20 20 69 66 28 20 7a 41 67 65 6e 74 3d 3d 30 20    if( zAgent==0 
32a0: 29 20 7a 41 67 65 6e 74 20 3d 20 22 22 3b 0a 20  ) zAgent = "";. 
32b0: 20 20 20 67 65 74 74 69 6d 65 6f 66 64 61 79 28     gettimeofday(
32c0: 26 6e 6f 77 2c 20 30 29 3b 0a 20 20 20 20 70 54  &now, 0);.    pT
32d0: 6d 20 3d 20 6c 6f 63 61 6c 74 69 6d 65 28 26 6e  m = localtime(&n
32e0: 6f 77 2e 74 76 5f 73 65 63 29 3b 0a 20 20 20 20  ow.tv_sec);.    
32f0: 73 74 72 66 74 69 6d 65 28 7a 44 61 74 65 2c 20  strftime(zDate, 
3300: 73 69 7a 65 6f 66 28 7a 44 61 74 65 29 2c 20 22  sizeof(zDate), "
3310: 25 59 2d 25 6d 2d 25 64 20 25 48 3a 25 4d 3a 25  %Y-%m-%d %H:%M:%
3320: 53 22 2c 20 70 54 6d 29 3b 0a 20 20 20 20 73 7a  S", pTm);.    sz
3330: 20 3d 20 73 74 72 66 74 69 6d 65 28 7a 45 78 70   = strftime(zExp
3340: 4c 6f 67 46 69 6c 65 2c 20 73 69 7a 65 6f 66 28  LogFile, sizeof(
3350: 7a 45 78 70 4c 6f 67 46 69 6c 65 29 2c 20 7a 4c  zExpLogFile), zL
3360: 6f 67 46 69 6c 65 2c 20 70 54 6d 29 3b 0a 20 20  ogFile, pTm);.  
3370: 20 20 69 66 28 20 73 7a 3e 30 20 26 26 20 73 7a    if( sz>0 && sz
3380: 3c 73 69 7a 65 6f 66 28 7a 45 78 70 4c 6f 67 46  <sizeof(zExpLogF
3390: 69 6c 65 29 2d 32 20 29 7b 0a 20 20 20 20 20 20  ile)-2 ){.      
33a0: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 45 78 70  zFilename = zExp
33b0: 4c 6f 67 46 69 6c 65 3b 0a 20 20 20 20 7d 65 6c  LogFile;.    }el
33c0: 73 65 7b 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e  se{.      zFilen
33d0: 61 6d 65 20 3d 20 7a 4c 6f 67 46 69 6c 65 3b 0a  ame = zLogFile;.
33e0: 20 20 20 20 7d 0a 20 20 20 20 77 61 69 74 70 69      }.    waitpi
33f0: 64 28 2d 31 2c 20 26 77 61 69 74 53 74 61 74 75  d(-1, &waitStatu
3400: 73 2c 20 57 4e 4f 48 41 4e 47 29 3b 0a 20 20 20  s, WNOHANG);.   
3410: 20 67 65 74 72 75 73 61 67 65 28 52 55 53 41 47   getrusage(RUSAG
3420: 45 5f 53 45 4c 46 2c 20 26 73 65 6c 66 29 3b 0a  E_SELF, &self);.
3430: 20 20 20 20 67 65 74 72 75 73 61 67 65 28 52 55      getrusage(RU
3440: 53 41 47 45 5f 43 48 49 4c 44 52 45 4e 2c 20 26  SAGE_CHILDREN, &
3450: 63 68 69 6c 64 72 65 6e 29 3b 0a 20 20 20 20 69  children);.    i
3460: 66 28 20 28 6c 6f 67 20 3d 20 66 6f 70 65 6e 28  f( (log = fopen(
3470: 7a 46 69 6c 65 6e 61 6d 65 2c 22 61 22 29 29 21  zFilename,"a"))!
3480: 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 43 4f 4d  =0 ){.#ifdef COM
3490: 42 49 4e 45 44 5f 4c 4f 47 5f 46 4f 52 4d 41 54  BINED_LOG_FORMAT
34a0: 0a 20 20 20 20 20 20 73 74 72 66 74 69 6d 65 28  .      strftime(
34b0: 7a 44 61 74 65 2c 20 73 69 7a 65 6f 66 28 7a 44  zDate, sizeof(zD
34c0: 61 74 65 29 2c 20 22 25 64 2f 25 62 2f 25 59 3a  ate), "%d/%b/%Y:
34d0: 25 48 3a 25 4d 3a 25 53 20 25 7a 22 2c 20 70 54  %H:%M:%S %z", pT
34e0: 6d 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  m);.      fprint
34f0: 66 28 6c 6f 67 2c 20 22 25 73 20 2d 20 2d 20 5b  f(log, "%s - - [
3500: 25 73 5d 20 5c 22 25 73 20 25 73 20 25 73 5c 22  %s] \"%s %s %s\"
3510: 20 25 73 20 25 64 20 5c 22 25 73 5c 22 20 5c 22   %s %d \"%s\" \"
3520: 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %s\"\n",.       
3530: 20 20 20 20 20 20 20 7a 52 65 6d 6f 74 65 41 64         zRemoteAd
3540: 64 72 2c 20 7a 44 61 74 65 2c 20 7a 4d 65 74 68  dr, zDate, zMeth
3550: 6f 64 2c 20 7a 53 63 72 69 70 74 2c 20 7a 50 72  od, zScript, zPr
3560: 6f 74 6f 63 6f 6c 2c 0a 20 20 20 20 20 20 20 20  otocol,.        
3570: 20 20 20 20 20 20 7a 52 65 70 6c 79 53 74 61 74        zReplyStat
3580: 75 73 2c 20 6e 4f 75 74 2c 20 7a 52 65 66 65 72  us, nOut, zRefer
3590: 65 72 2c 20 7a 41 67 65 6e 74 29 3b 0a 23 65 6c  er, zAgent);.#el
35a0: 73 65 0a 20 20 20 20 20 20 73 74 72 66 74 69 6d  se.      strftim
35b0: 65 28 7a 44 61 74 65 2c 20 73 69 7a 65 6f 66 28  e(zDate, sizeof(
35c0: 7a 44 61 74 65 29 2c 20 22 25 59 2d 25 6d 2d 25  zDate), "%Y-%m-%
35d0: 64 20 25 48 3a 25 4d 3a 25 53 22 2c 20 70 54 6d  d %H:%M:%S", pTm
35e0: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20  );.      /* Log 
35f0: 72 65 63 6f 72 64 20 66 69 6c 65 73 3a 0a 20 20  record files:.  
3600: 20 20 20 20 2a 2a 20 20 28 31 29 20 44 61 74 65      **  (1) Date
3610: 20 61 6e 64 20 74 69 6d 65 0a 20 20 20 20 20 20   and time.      
3620: 2a 2a 20 20 28 32 29 20 49 50 20 61 64 64 72 65  **  (2) IP addre
3630: 73 73 0a 20 20 20 20 20 20 2a 2a 20 20 28 33 29  ss.      **  (3)
3640: 20 55 52 4c 20 62 65 69 6e 67 20 61 63 63 65 73   URL being acces
3650: 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 20 28 34  sed.      **  (4
3660: 29 20 52 65 66 65 72 65 72 0a 20 20 20 20 20 20  ) Referer.      
3670: 2a 2a 20 20 28 35 29 20 52 65 70 6c 79 20 73 74  **  (5) Reply st
3680: 61 74 75 73 0a 20 20 20 20 20 20 2a 2a 20 20 28  atus.      **  (
3690: 36 29 20 42 79 74 65 73 20 72 65 63 65 69 76 65  6) Bytes receive
36a0: 64 0a 20 20 20 20 20 20 2a 2a 20 20 28 37 29 20  d.      **  (7) 
36b0: 42 79 74 65 73 20 73 65 6e 74 0a 20 20 20 20 20  Bytes sent.     
36c0: 20 2a 2a 20 20 28 38 29 20 53 65 6c 66 20 75 73   **  (8) Self us
36d0: 65 72 20 74 69 6d 65 0a 20 20 20 20 20 20 2a 2a  er time.      **
36e0: 20 20 28 39 29 20 53 65 6c 66 20 73 79 73 74 65    (9) Self syste
36f0: 6d 20 74 69 6d 65 0a 20 20 20 20 20 20 2a 2a 20  m time.      ** 
3700: 28 31 30 29 20 43 68 69 6c 64 72 65 6e 20 75 73  (10) Children us
3710: 65 72 20 74 69 6d 65 0a 20 20 20 20 20 20 2a 2a  er time.      **
3720: 20 28 31 31 29 20 43 68 69 6c 64 72 65 6e 20 73   (11) Children s
3730: 79 73 74 65 6d 20 74 69 6d 65 0a 20 20 20 20 20  ystem time.     
3740: 20 2a 2a 20 28 31 32 29 20 54 6f 74 61 6c 20 77   ** (12) Total w
3750: 61 6c 6c 2d 63 6c 6f 63 6b 20 74 69 6d 65 0a 20  all-clock time. 
3760: 20 20 20 20 20 2a 2a 20 28 31 33 29 20 52 65 71       ** (13) Req
3770: 75 65 73 74 20 6e 75 6d 62 65 72 20 66 6f 72 20  uest number for 
3780: 73 61 6d 65 20 54 43 50 2f 49 50 20 63 6f 6e 6e  same TCP/IP conn
3790: 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ection.      ** 
37a0: 28 31 34 29 20 55 73 65 72 20 61 67 65 6e 74 0a  (14) User agent.
37b0: 20 20 20 20 20 20 2a 2a 20 28 31 35 29 20 52 65        ** (15) Re
37c0: 6d 6f 74 65 20 75 73 65 72 0a 20 20 20 20 20 20  mote user.      
37d0: 2a 2a 20 28 31 36 29 20 42 79 74 65 73 20 6f 66  ** (16) Bytes of
37e0: 20 55 52 4c 20 74 68 61 74 20 63 6f 72 72 65 73   URL that corres
37f0: 70 6f 6e 64 20 74 6f 20 74 68 65 20 53 43 52 49  pond to the SCRI
3800: 50 54 5f 4e 41 4d 45 0a 20 20 20 20 20 20 2a 2a  PT_NAME.      **
3810: 20 28 31 37 29 20 4c 69 6e 65 20 6e 75 6d 62 65   (17) Line numbe
3820: 72 20 69 6e 20 73 6f 75 72 63 65 20 66 69 6c 65  r in source file
3830: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
3840: 66 70 72 69 6e 74 66 28 6c 6f 67 2c 0a 20 20 20  fprintf(log,.   
3850: 20 20 20 20 20 22 25 73 2c 25 73 2c 5c 22 25 73       "%s,%s,\"%s
3860: 3a 2f 2f 25 73 25 73 5c 22 2c 5c 22 25 73 5c 22  ://%s%s\",\"%s\"
3870: 2c 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 25  ,".           "%
3880: 73 2c 25 64 2c 25 64 2c 25 64 2c 25 64 2c 25 64  s,%d,%d,%d,%d,%d
3890: 2c 25 64 2c 25 64 2c 25 64 2c 5c 22 25 73 5c 22  ,%d,%d,%d,\"%s\"
38a0: 2c 5c 22 25 73 5c 22 2c 25 64 2c 25 64 5c 6e 22  ,\"%s\",%d,%d\n"
38b0: 2c 0a 20 20 20 20 20 20 20 20 7a 44 61 74 65 2c  ,.        zDate,
38c0: 20 7a 52 65 6d 6f 74 65 41 64 64 72 2c 20 7a 48   zRemoteAddr, zH
38d0: 74 74 70 2c 20 45 73 63 61 70 65 28 7a 48 74 74  ttp, Escape(zHtt
38e0: 70 48 6f 73 74 29 2c 20 45 73 63 61 70 65 28 7a  pHost), Escape(z
38f0: 53 63 72 69 70 74 29 2c 0a 20 20 20 20 20 20 20  Script),.       
3900: 20 45 73 63 61 70 65 28 7a 52 65 66 65 72 65 72   Escape(zReferer
3910: 29 2c 20 7a 52 65 70 6c 79 53 74 61 74 75 73 2c  ), zReplyStatus,
3920: 20 6e 49 6e 2c 20 6e 4f 75 74 2c 0a 20 20 20 20   nIn, nOut,.    
3930: 20 20 20 20 74 76 6d 73 28 26 73 65 6c 66 2e 72      tvms(&self.r
3940: 75 5f 75 74 69 6d 65 29 20 2d 20 74 76 6d 73 28  u_utime) - tvms(
3950: 26 70 72 69 6f 72 53 65 6c 66 2e 72 75 5f 75 74  &priorSelf.ru_ut
3960: 69 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 74 76  ime),.        tv
3970: 6d 73 28 26 73 65 6c 66 2e 72 75 5f 73 74 69 6d  ms(&self.ru_stim
3980: 65 29 20 2d 20 74 76 6d 73 28 26 70 72 69 6f 72  e) - tvms(&prior
3990: 53 65 6c 66 2e 72 75 5f 73 74 69 6d 65 29 2c 0a  Self.ru_stime),.
39a0: 20 20 20 20 20 20 20 20 74 76 6d 73 28 26 63 68          tvms(&ch
39b0: 69 6c 64 72 65 6e 2e 72 75 5f 75 74 69 6d 65 29  ildren.ru_utime)
39c0: 20 2d 20 74 76 6d 73 28 26 70 72 69 6f 72 43 68   - tvms(&priorCh
39d0: 69 6c 64 2e 72 75 5f 75 74 69 6d 65 29 2c 0a 20  ild.ru_utime),. 
39e0: 20 20 20 20 20 20 20 74 76 6d 73 28 26 63 68 69         tvms(&chi
39f0: 6c 64 72 65 6e 2e 72 75 5f 73 74 69 6d 65 29 20  ldren.ru_stime) 
3a00: 2d 20 74 76 6d 73 28 26 70 72 69 6f 72 43 68 69  - tvms(&priorChi
3a10: 6c 64 2e 72 75 5f 73 74 69 6d 65 29 2c 0a 20 20  ld.ru_stime),.  
3a20: 20 20 20 20 20 20 74 76 6d 73 28 26 6e 6f 77 29        tvms(&now)
3a30: 20 2d 20 74 76 6d 73 28 26 62 65 67 69 6e 54 69   - tvms(&beginTi
3a40: 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 6e 52 65  me),.        nRe
3a50: 71 75 65 73 74 2c 20 45 73 63 61 70 65 28 7a 41  quest, Escape(zA
3a60: 67 65 6e 74 29 2c 20 45 73 63 61 70 65 28 7a 52  gent), Escape(zR
3a70: 4d 29 2c 0a 20 20 20 20 20 20 20 20 28 69 6e 74  M),.        (int
3a80: 29 28 73 74 72 6c 65 6e 28 7a 48 74 74 70 29 2b  )(strlen(zHttp)+
3a90: 73 74 72 6c 65 6e 28 7a 48 74 74 70 48 6f 73 74  strlen(zHttpHost
3aa0: 29 2b 73 74 72 6c 65 6e 28 7a 52 65 61 6c 53 63  )+strlen(zRealSc
3ab0: 72 69 70 74 29 2b 33 29 2c 0a 20 20 20 20 20 20  ript)+3),.      
3ac0: 20 20 6c 69 6e 65 4e 75 6d 0a 20 20 20 20 20 20    lineNum.      
3ad0: 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 53 65  );.      priorSe
3ae0: 6c 66 20 3d 20 73 65 6c 66 3b 0a 20 20 20 20 20  lf = self;.     
3af0: 20 70 72 69 6f 72 43 68 69 6c 64 20 3d 20 63 68   priorChild = ch
3b00: 69 6c 64 72 65 6e 3b 0a 20 20 20 20 20 20 62 65  ildren;.      be
3b10: 67 69 6e 54 69 6d 65 20 3d 20 6e 6f 77 3b 0a 23  ginTime = now;.#
3b20: 65 6e 64 69 66 0a 20 20 20 20 20 20 66 63 6c 6f  endif.      fclo
3b30: 73 65 28 6c 6f 67 29 3b 0a 20 20 20 20 20 20 6e  se(log);.      n
3b40: 49 6e 20 3d 20 6e 4f 75 74 20 3d 20 30 3b 0a 20  In = nOut = 0;. 
3b50: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 63     }.  }.  if( c
3b60: 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 29  loseConnection )
3b70: 7b 0a 20 20 20 20 65 78 69 74 28 65 78 69 74 43  {.    exit(exitC
3b80: 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 73 74 61 74  ode);.  }.  stat
3b90: 75 73 53 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  usSent = 0;.}../
3ba0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65  *.** Allocate me
3bb0: 6d 6f 72 79 20 73 61 66 65 6c 79 0a 2a 2f 0a 73  mory safely.*/.s
3bc0: 74 61 74 69 63 20 63 68 61 72 20 2a 53 61 66 65  tatic char *Safe
3bd0: 4d 61 6c 6c 6f 63 28 20 69 6e 74 20 73 69 7a 65  Malloc( int size
3be0: 20 29 7b 0a 20 20 63 68 61 72 20 2a 70 3b 0a 0a   ){.  char *p;..
3bf0: 20 20 70 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c    p = (char*)mal
3c00: 6c 6f 63 28 73 69 7a 65 29 3b 0a 20 20 69 66 28  loc(size);.  if(
3c10: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72   p==0 ){.    str
3c20: 63 70 79 28 7a 52 65 70 6c 79 53 74 61 74 75 73  cpy(zReplyStatus
3c30: 2c 20 22 39 39 38 22 29 3b 0a 20 20 20 20 4d 61  , "998");.    Ma
3c40: 6b 65 4c 6f 67 45 6e 74 72 79 28 31 2c 5f 5f 4c  keLogEntry(1,__L
3c50: 49 4e 45 5f 5f 29 3b 20 20 2f 2a 20 4c 4f 47 3a  INE__);  /* LOG:
3c60: 20 4d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   Malloc() failed
3c70: 20 2a 2f 0a 20 20 20 20 65 78 69 74 28 31 29 3b   */.    exit(1);
3c80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
3c90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
3ca0: 65 20 76 61 6c 75 65 20 6f 66 20 65 6e 76 69 72  e value of envir
3cb0: 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20  onment variable 
3cc0: 7a 56 61 72 20 74 6f 20 7a 56 61 6c 75 65 2e 0a  zVar to zValue..
3cd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53  */.static void S
3ce0: 65 74 45 6e 76 28 63 6f 6e 73 74 20 63 68 61 72  etEnv(const char
3cf0: 20 2a 7a 56 61 72 2c 20 63 6f 6e 73 74 20 63 68   *zVar, const ch
3d00: 61 72 20 2a 7a 56 61 6c 75 65 29 7b 0a 20 20 63  ar *zValue){.  c
3d10: 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6c 65  har *z;.  int le
3d20: 6e 3b 0a 20 20 69 66 28 20 7a 56 61 6c 75 65 3d  n;.  if( zValue=
3d30: 3d 30 20 29 20 7a 56 61 6c 75 65 3d 22 22 3b 0a  =0 ) zValue="";.
3d40: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 61 6e 20    /* Disable an 
3d50: 61 74 74 65 6d 70 74 65 64 20 62 61 73 68 64 6f  attempted bashdo
3d60: 6f 72 20 61 74 74 61 63 6b 20 2a 2f 0a 20 20 69  or attack */.  i
3d70: 66 28 20 73 74 72 6e 63 6d 70 28 7a 56 61 6c 75  f( strncmp(zValu
3d80: 65 2c 22 28 29 20 7b 22 2c 34 29 3d 3d 30 20 29  e,"() {",4)==0 )
3d90: 20 7a 56 61 6c 75 65 20 3d 20 22 22 3b 0a 20 20   zValue = "";.  
3da0: 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 56 61  len = strlen(zVa
3db0: 72 29 20 2b 20 73 74 72 6c 65 6e 28 7a 56 61 6c  r) + strlen(zVal
3dc0: 75 65 29 20 2b 20 32 3b 0a 20 20 7a 20 3d 20 53  ue) + 2;.  z = S
3dd0: 61 66 65 4d 61 6c 6c 6f 63 28 6c 65 6e 29 3b 0a  afeMalloc(len);.
3de0: 20 20 73 70 72 69 6e 74 66 28 7a 2c 22 25 73 3d    sprintf(z,"%s=
3df0: 25 73 22 2c 7a 56 61 72 2c 7a 56 61 6c 75 65 29  %s",zVar,zValue)
3e00: 3b 0a 20 20 70 75 74 65 6e 76 28 7a 29 3b 0a 7d  ;.  putenv(z);.}
3e10: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
3e20: 68 65 20 66 69 72 73 74 20 73 70 61 63 65 2d 64  he first space-d
3e30: 65 6c 69 6d 69 74 65 64 20 74 6f 6b 65 6e 20 66  elimited token f
3e40: 72 6f 6d 20 61 20 73 74 72 69 6e 67 20 61 6e 64  rom a string and
3e50: 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   return.** a poi
3e60: 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 41 64 64  nter to it.  Add
3e70: 20 61 20 4e 55 4c 4c 20 74 6f 20 74 68 65 20 73   a NULL to the s
3e80: 74 72 69 6e 67 20 74 6f 20 74 65 72 6d 69 6e 61  tring to termina
3e90: 74 65 20 74 68 65 20 74 6f 6b 65 6e 2e 0a 2a 2a  te the token..**
3ea0: 20 4d 61 6b 65 20 2a 7a 4c 65 66 74 4f 76 65 72   Make *zLeftOver
3eb0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 74   point to the st
3ec0: 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20  art of the next 
3ed0: 74 6f 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  token..*/.static
3ee0: 20 63 68 61 72 20 2a 47 65 74 46 69 72 73 74 45   char *GetFirstE
3ef0: 6c 65 6d 65 6e 74 28 63 68 61 72 20 2a 7a 49 6e  lement(char *zIn
3f00: 70 75 74 2c 20 63 68 61 72 20 2a 2a 7a 4c 65 66  put, char **zLef
3f10: 74 4f 76 65 72 29 7b 0a 20 20 63 68 61 72 20 2a  tOver){.  char *
3f20: 7a 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 69  zResult = 0;.  i
3f30: 66 28 20 7a 49 6e 70 75 74 3d 3d 30 20 29 7b 0a  f( zInput==0 ){.
3f40: 20 20 20 20 69 66 28 20 7a 4c 65 66 74 4f 76 65      if( zLeftOve
3f50: 72 20 29 20 2a 7a 4c 65 66 74 4f 76 65 72 20 3d  r ) *zLeftOver =
3f60: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   0;.    return 0
3f70: 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 69  ;.  }.  while( i
3f80: 73 73 70 61 63 65 28 2a 7a 49 6e 70 75 74 29 20  sspace(*zInput) 
3f90: 29 7b 20 7a 49 6e 70 75 74 2b 2b 3b 20 7d 0a 20  ){ zInput++; }. 
3fa0: 20 7a 52 65 73 75 6c 74 20 3d 20 7a 49 6e 70 75   zResult = zInpu
3fb0: 74 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 49 6e  t;.  while( *zIn
3fc0: 70 75 74 20 26 26 20 21 69 73 73 70 61 63 65 28  put && !isspace(
3fd0: 2a 7a 49 6e 70 75 74 29 20 29 7b 20 7a 49 6e 70  *zInput) ){ zInp
3fe0: 75 74 2b 2b 3b 20 7d 0a 20 20 69 66 28 20 2a 7a  ut++; }.  if( *z
3ff0: 49 6e 70 75 74 20 29 7b 0a 20 20 20 20 2a 7a 49  Input ){.    *zI
4000: 6e 70 75 74 20 3d 20 30 3b 0a 20 20 20 20 7a 49  nput = 0;.    zI
4010: 6e 70 75 74 2b 2b 3b 0a 20 20 20 20 77 68 69 6c  nput++;.    whil
4020: 65 28 20 69 73 73 70 61 63 65 28 2a 7a 49 6e 70  e( isspace(*zInp
4030: 75 74 29 20 29 7b 20 7a 49 6e 70 75 74 2b 2b 3b  ut) ){ zInput++;
4040: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4c 65   }.  }.  if( zLe
4050: 66 74 4f 76 65 72 20 29 7b 20 2a 7a 4c 65 66 74  ftOver ){ *zLeft
4060: 4f 76 65 72 20 3d 20 7a 49 6e 70 75 74 3b 20 7d  Over = zInput; }
4070: 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 73 75 6c  .  return zResul
4080: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  t;.}../*.** Make
4090: 20 61 20 63 6f 70 79 20 6f 66 20 61 20 73 74 72   a copy of a str
40a0: 69 6e 67 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ing into memory 
40b0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
40c0: 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lloc..*/.static 
40d0: 63 68 61 72 20 2a 53 74 72 44 75 70 28 63 6f 6e  char *StrDup(con
40e0: 73 74 20 63 68 61 72 20 2a 7a 53 72 63 29 7b 0a  st char *zSrc){.
40f0: 20 20 63 68 61 72 20 2a 7a 44 65 73 74 3b 0a 20    char *zDest;. 
4100: 20 69 6e 74 20 73 69 7a 65 3b 0a 0a 20 20 69 66   int size;..  if
4110: 28 20 7a 53 72 63 3d 3d 30 20 29 20 72 65 74 75  ( zSrc==0 ) retu
4120: 72 6e 20 30 3b 0a 20 20 73 69 7a 65 20 3d 20 73  rn 0;.  size = s
4130: 74 72 6c 65 6e 28 7a 53 72 63 29 20 2b 20 31 3b  trlen(zSrc) + 1;
4140: 0a 20 20 7a 44 65 73 74 20 3d 20 28 63 68 61 72  .  zDest = (char
4150: 2a 29 53 61 66 65 4d 61 6c 6c 6f 63 28 20 73 69  *)SafeMalloc( si
4160: 7a 65 20 29 3b 0a 20 20 73 74 72 63 70 79 28 7a  ze );.  strcpy(z
4170: 44 65 73 74 2c 7a 53 72 63 29 3b 0a 20 20 72 65  Dest,zSrc);.  re
4180: 74 75 72 6e 20 7a 44 65 73 74 3b 0a 7d 0a 73 74  turn zDest;.}.st
4190: 61 74 69 63 20 63 68 61 72 20 2a 53 74 72 41 70  atic char *StrAp
41a0: 70 65 6e 64 28 63 68 61 72 20 2a 7a 50 72 69 6f  pend(char *zPrio
41b0: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
41c0: 53 65 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Sep, const char 
41d0: 2a 7a 53 72 63 29 7b 0a 20 20 63 68 61 72 20 2a  *zSrc){.  char *
41e0: 7a 44 65 73 74 3b 0a 20 20 69 6e 74 20 73 69 7a  zDest;.  int siz
41f0: 65 3b 0a 20 20 69 6e 74 20 6e 31 2c 20 6e 32 3b  e;.  int n1, n2;
4200: 0a 0a 20 20 69 66 28 20 7a 53 72 63 3d 3d 30 20  ..  if( zSrc==0 
4210: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
4220: 28 20 7a 50 72 69 6f 72 3d 3d 30 20 29 20 72 65  ( zPrior==0 ) re
4230: 74 75 72 6e 20 53 74 72 44 75 70 28 7a 53 72 63  turn StrDup(zSrc
4240: 29 3b 0a 20 20 73 69 7a 65 20 3d 20 28 6e 31 3d  );.  size = (n1=
4250: 73 74 72 6c 65 6e 28 7a 53 72 63 29 29 20 2b 20  strlen(zSrc)) + 
4260: 28 6e 32 3d 73 74 72 6c 65 6e 28 7a 53 65 70 29  (n2=strlen(zSep)
4270: 29 20 2b 20 73 74 72 6c 65 6e 28 7a 50 72 69 6f  ) + strlen(zPrio
4280: 72 29 20 2b 20 31 3b 0a 20 20 7a 44 65 73 74 20  r) + 1;.  zDest 
4290: 3d 20 28 63 68 61 72 2a 29 53 61 66 65 4d 61 6c  = (char*)SafeMal
42a0: 6c 6f 63 28 20 73 69 7a 65 20 29 3b 0a 20 20 73  loc( size );.  s
42b0: 74 72 63 70 79 28 7a 44 65 73 74 2c 7a 50 72 69  trcpy(zDest,zPri
42c0: 6f 72 29 3b 0a 20 20 66 72 65 65 28 7a 50 72 69  or);.  free(zPri
42d0: 6f 72 29 3b 0a 20 20 73 74 72 63 70 79 28 26 7a  or);.  strcpy(&z
42e0: 44 65 73 74 5b 6e 31 5d 2c 7a 53 65 70 29 3b 0a  Dest[n1],zSep);.
42f0: 20 20 73 74 72 63 70 79 28 26 7a 44 65 73 74 5b    strcpy(&zDest[
4300: 6e 31 2b 6e 32 5d 2c 7a 53 72 63 29 3b 0a 20 20  n1+n2],zSrc);.  
4310: 72 65 74 75 72 6e 20 7a 44 65 73 74 3b 0a 7d 0a  return zDest;.}.
4320: 0a 2f 2a 0a 2a 2a 20 42 72 65 61 6b 20 61 20 6c  ./*.** Break a l
4330: 69 6e 65 20 61 74 20 74 68 65 20 66 69 72 73 74  ine at the first
4340: 20 5c 6e 20 6f 72 20 5c 72 20 63 68 61 72 61 63   \n or \r charac
4350: 74 65 72 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 61  ter seen..*/.sta
4360: 74 69 63 20 76 6f 69 64 20 52 65 6d 6f 76 65 4e  tic void RemoveN
4370: 65 77 6c 69 6e 65 28 63 68 61 72 20 2a 7a 29 7b  ewline(char *z){
4380: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
4390: 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 2a  turn;.  while( *
43a0: 7a 20 26 26 20 2a 7a 21 3d 27 5c 6e 27 20 26 26  z && *z!='\n' &&
43b0: 20 2a 7a 21 3d 27 5c 72 27 20 29 7b 20 7a 2b 2b   *z!='\r' ){ z++
43c0: 3b 20 7d 0a 20 20 2a 7a 20 3d 20 30 3b 0a 7d 0a  ; }.  *z = 0;.}.
43d0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 64  ./*.** Print a d
43e0: 61 74 65 20 74 61 67 20 69 6e 20 74 68 65 20 68  ate tag in the h
43f0: 65 61 64 65 72 2e 20 20 54 68 65 20 6e 61 6d 65  eader.  The name
4400: 20 6f 66 20 74 68 65 20 74 61 67 20 69 73 20 7a   of the tag is z
4410: 54 61 67 2e 0a 2a 2a 20 54 68 65 20 64 61 74 65  Tag..** The date
4420: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 66   is determined f
4430: 72 6f 6d 20 74 68 65 20 75 6e 69 78 20 74 69 6d  rom the unix tim
4440: 65 73 74 61 6d 70 20 67 69 76 65 6e 2e 0a 2a 2f  estamp given..*/
4450: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 61 74 65  .static int Date
4460: 54 61 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  Tag(const char *
4470: 7a 54 61 67 2c 20 74 69 6d 65 5f 74 20 74 29 7b  zTag, time_t t){
4480: 0a 20 20 73 74 72 75 63 74 20 74 6d 20 2a 74 6d  .  struct tm *tm
4490: 3b 0a 20 20 63 68 61 72 20 7a 44 61 74 65 5b 31  ;.  char zDate[1
44a0: 30 30 5d 3b 0a 20 20 74 6d 20 3d 20 67 6d 74 69  00];.  tm = gmti
44b0: 6d 65 28 26 74 29 3b 0a 20 20 73 74 72 66 74 69  me(&t);.  strfti
44c0: 6d 65 28 7a 44 61 74 65 2c 20 73 69 7a 65 6f 66  me(zDate, sizeof
44d0: 28 7a 44 61 74 65 29 2c 20 22 25 61 2c 20 25 64  (zDate), "%a, %d
44e0: 20 20 25 62 20 25 59 20 25 48 3a 25 4d 3a 25 53    %b %Y %H:%M:%S
44f0: 20 25 7a 22 2c 20 74 6d 29 3b 0a 20 20 72 65 74   %z", tm);.  ret
4500: 75 72 6e 20 70 72 69 6e 74 66 28 22 25 73 3a 20  urn printf("%s: 
4510: 25 73 5c 72 5c 6e 22 2c 20 7a 54 61 67 2c 20 7a  %s\r\n", zTag, z
4520: 44 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Date);.}../*.** 
4530: 50 72 69 6e 74 20 74 68 65 20 66 69 72 73 74 20  Print the first 
4540: 6c 69 6e 65 20 6f 66 20 61 20 72 65 73 70 6f 6e  line of a respon
4550: 73 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74  se followed by t
4560: 68 65 20 73 65 72 76 65 72 20 74 79 70 65 2e 0a  he server type..
4570: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53  */.static void S
4580: 74 61 72 74 52 65 73 70 6f 6e 73 65 28 63 6f 6e  tartResponse(con
4590: 73 74 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74  st char *zResult
45a0: 43 6f 64 65 29 7b 0a 20 20 74 69 6d 65 5f 74 20  Code){.  time_t 
45b0: 6e 6f 77 3b 0a 20 20 74 69 6d 65 28 26 6e 6f 77  now;.  time(&now
45c0: 29 3b 0a 20 20 69 66 28 20 73 74 61 74 75 73 53  );.  if( statusS
45d0: 65 6e 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ent ) return;.  
45e0: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22  nOut += printf("
45f0: 25 73 20 25 73 5c 72 5c 6e 22 2c 20 7a 50 72 6f  %s %s\r\n", zPro
4600: 74 6f 63 6f 6c 2c 20 7a 52 65 73 75 6c 74 43 6f  tocol, zResultCo
4610: 64 65 29 3b 0a 20 20 73 74 72 6e 63 70 79 28 7a  de);.  strncpy(z
4620: 52 65 70 6c 79 53 74 61 74 75 73 2c 20 7a 52 65  ReplyStatus, zRe
4630: 73 75 6c 74 43 6f 64 65 2c 20 33 29 3b 0a 20 20  sultCode, 3);.  
4640: 7a 52 65 70 6c 79 53 74 61 74 75 73 5b 33 5d 20  zReplyStatus[3] 
4650: 3d 20 30 3b 0a 20 20 69 66 28 20 7a 52 65 70 6c  = 0;.  if( zRepl
4660: 79 53 74 61 74 75 73 5b 30 5d 3e 3d 27 34 27 20  yStatus[0]>='4' 
4670: 29 7b 0a 20 20 20 20 63 6c 6f 73 65 43 6f 6e 6e  ){.    closeConn
4680: 65 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d 0a  ection = 1;.  }.
4690: 20 20 69 66 28 20 63 6c 6f 73 65 43 6f 6e 6e 65    if( closeConne
46a0: 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 6e 4f 75  ction ){.    nOu
46b0: 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e  t += printf("Con
46c0: 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f 73 65 5c 72  nection: close\r
46d0: 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  \n");.  }else{. 
46e0: 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74     nOut += print
46f0: 66 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 6b  f("Connection: k
4700: 65 65 70 2d 61 6c 69 76 65 5c 72 5c 6e 22 29 3b  eep-alive\r\n");
4710: 0a 20 20 7d 0a 20 20 6e 4f 75 74 20 2b 3d 20 44  .  }.  nOut += D
4720: 61 74 65 54 61 67 28 22 44 61 74 65 22 2c 20 6e  ateTag("Date", n
4730: 6f 77 29 3b 0a 20 20 73 74 61 74 75 73 53 65 6e  ow);.  statusSen
4740: 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 1;.}../*.** 
4750: 54 65 6c 6c 20 74 68 65 20 63 6c 69 65 6e 74 20  Tell the client 
4760: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
4770: 20 73 75 63 68 20 64 6f 63 75 6d 65 6e 74 0a 2a   such document.*
4780: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4e 6f  /.static void No
4790: 74 46 6f 75 6e 64 28 69 6e 74 20 6c 69 6e 65 6e  tFound(int linen
47a0: 6f 29 7b 0a 20 20 53 74 61 72 74 52 65 73 70 6f  o){.  StartRespo
47b0: 6e 73 65 28 22 34 30 34 20 4e 6f 74 20 46 6f 75  nse("404 Not Fou
47c0: 6e 64 22 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20  nd");.  nOut += 
47d0: 70 72 69 6e 74 66 28 0a 20 20 20 20 22 43 6f 6e  printf(.    "Con
47e0: 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f  tent-type: text/
47f0: 68 74 6d 6c 5c 72 5c 6e 22 0a 20 20 20 20 22 5c  html\r\n".    "\
4800: 72 5c 6e 22 0a 20 20 20 20 22 3c 68 65 61 64 3e  r\n".    "<head>
4810: 3c 74 69 74 6c 65 20 6c 69 6e 65 6e 6f 3d 5c 22  <title lineno=\"
4820: 25 64 5c 22 3e 4e 6f 74 20 46 6f 75 6e 64 3c 2f  %d\">Not Found</
4830: 74 69 74 6c 65 3e 3c 2f 68 65 61 64 3e 5c 6e 22  title></head>\n"
4840: 0a 20 20 20 20 22 3c 62 6f 64 79 3e 3c 68 31 3e  .    "<body><h1>
4850: 44 6f 63 75 6d 65 6e 74 20 4e 6f 74 20 46 6f 75  Document Not Fou
4860: 6e 64 3c 2f 68 31 3e 5c 6e 22 0a 20 20 20 20 22  nd</h1>\n".    "
4870: 54 68 65 20 64 6f 63 75 6d 65 6e 74 20 25 73 20  The document %s 
4880: 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
4890: 20 6f 6e 20 74 68 69 73 20 73 65 72 76 65 72 5c   on this server\
48a0: 6e 22 0a 20 20 20 20 22 3c 2f 62 6f 64 79 3e 5c  n".    "</body>\
48b0: 6e 22 2c 20 6c 69 6e 65 6e 6f 2c 20 7a 53 63 72  n", lineno, zScr
48c0: 69 70 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45  ipt);.  MakeLogE
48d0: 6e 74 72 79 28 30 2c 20 6c 69 6e 65 6e 6f 29 3b  ntry(0, lineno);
48e0: 0a 20 20 65 78 69 74 28 30 29 3b 0a 7d 0a 0a 2f  .  exit(0);.}../
48f0: 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c  *.** Tell the cl
4900: 69 65 6e 74 20 74 68 61 74 20 74 68 65 79 20 61  ient that they a
4910: 72 65 20 6e 6f 74 20 77 65 6c 63 6f 6d 65 64 20  re not welcomed 
4920: 68 65 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  here..*/.static 
4930: 76 6f 69 64 20 46 6f 72 62 69 64 64 65 6e 28 69  void Forbidden(i
4940: 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 53 74  nt lineno){.  St
4950: 61 72 74 52 65 73 70 6f 6e 73 65 28 22 34 30 33  artResponse("403
4960: 20 46 6f 72 62 69 64 64 65 6e 22 29 3b 0a 20 20   Forbidden");.  
4970: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a  nOut += printf(.
4980: 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70      "Content-typ
4990: 65 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c 72 5c  e: text/plain\r\
49a0: 6e 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20  n".    "\r\n".  
49b0: 20 20 22 41 63 63 65 73 73 20 64 65 6e 69 65 64    "Access denied
49c0: 5c 6e 22 0a 20 20 29 3b 0a 20 20 63 6c 6f 73 65  \n".  );.  close
49d0: 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 31 3b 0a  Connection = 1;.
49e0: 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30    MakeLogEntry(0
49f0: 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 65 78 69  , lineno);.  exi
4a00: 74 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  t(0);.}../*.** T
4a10: 65 6c 6c 20 74 68 65 20 63 6c 69 65 6e 74 20 74  ell the client t
4a20: 68 61 74 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  hat authorizatio
4a30: 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  n is required to
4a40: 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 64   access the.** d
4a50: 6f 63 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  ocument..*/.stat
4a60: 69 63 20 76 6f 69 64 20 4e 6f 74 41 75 74 68 6f  ic void NotAutho
4a70: 72 69 7a 65 64 28 63 6f 6e 73 74 20 63 68 61 72  rized(const char
4a80: 20 2a 7a 52 65 61 6c 6d 29 7b 0a 20 20 53 74 61   *zRealm){.  Sta
4a90: 72 74 52 65 73 70 6f 6e 73 65 28 22 34 30 31 20  rtResponse("401 
4aa0: 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 52 65  Authorization Re
4ab0: 71 75 69 72 65 64 22 29 3b 0a 20 20 6e 4f 75 74  quired");.  nOut
4ac0: 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20   += printf(.    
4ad0: 22 57 57 57 2d 41 75 74 68 65 6e 74 69 63 61 74  "WWW-Authenticat
4ae0: 65 3a 20 42 61 73 69 63 20 72 65 61 6c 6d 3d 5c  e: Basic realm=\
4af0: 22 25 73 5c 22 5c 72 5c 6e 22 0a 20 20 20 20 22  "%s\"\r\n".    "
4b00: 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65  Content-type: te
4b10: 78 74 2f 68 74 6d 6c 5c 72 5c 6e 22 0a 20 20 20  xt/html\r\n".   
4b20: 20 22 5c 72 5c 6e 22 0a 20 20 20 20 22 3c 68 65   "\r\n".    "<he
4b30: 61 64 3e 3c 74 69 74 6c 65 3e 4e 6f 74 20 41 75  ad><title>Not Au
4b40: 74 68 6f 72 69 7a 65 64 3c 2f 74 69 74 6c 65 3e  thorized</title>
4b50: 3c 2f 68 65 61 64 3e 5c 6e 22 0a 20 20 20 20 22  </head>\n".    "
4b60: 3c 62 6f 64 79 3e 3c 68 31 3e 34 30 31 20 4e 6f  <body><h1>401 No
4b70: 74 20 41 75 74 68 6f 72 69 7a 65 64 3c 2f 68 31  t Authorized</h1
4b80: 3e 5c 6e 22 0a 20 20 20 20 22 41 20 6c 6f 67 69  >\n".    "A logi
4b90: 6e 20 61 6e 64 20 70 61 73 73 77 6f 72 64 20 61  n and password a
4ba0: 72 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  re required for 
4bb0: 74 68 69 73 20 64 6f 63 75 6d 65 6e 74 5c 6e 22  this document\n"
4bc0: 0a 20 20 20 20 22 3c 2f 62 6f 64 79 3e 5c 6e 22  .    "</body>\n"
4bd0: 2c 20 7a 52 65 61 6c 6d 29 3b 0a 20 20 4d 61 6b  , zRealm);.  Mak
4be0: 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 5f 5f 4c  eLogEntry(0, __L
4bf0: 49 4e 45 5f 5f 29 3b 20 20 2f 2a 20 4c 4f 47 3a  INE__);  /* LOG:
4c00: 20 4e 6f 74 20 61 75 74 68 6f 72 69 7a 65 64 20   Not authorized 
4c10: 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c  */.}../*.** Tell
4c20: 20 74 68 65 20 63 6c 69 65 6e 74 20 74 68 61 74   the client that
4c30: 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 72 72   there is an err
4c40: 6f 72 20 69 6e 20 74 68 65 20 73 63 72 69 70 74  or in the script
4c50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4c60: 20 43 67 69 45 72 72 6f 72 28 76 6f 69 64 29 7b   CgiError(void){
4c70: 0a 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65  .  StartResponse
4c80: 28 22 35 30 30 20 45 72 72 6f 72 22 29 3b 0a 20  ("500 Error");. 
4c90: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
4ca0: 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79  .    "Content-ty
4cb0: 70 65 3a 20 74 65 78 74 2f 68 74 6d 6c 5c 72 5c  pe: text/html\r\
4cc0: 6e 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20  n".    "\r\n".  
4cd0: 20 20 22 3c 68 65 61 64 3e 3c 74 69 74 6c 65 3e    "<head><title>
4ce0: 43 47 49 20 50 72 6f 67 72 61 6d 20 45 72 72 6f  CGI Program Erro
4cf0: 72 3c 2f 74 69 74 6c 65 3e 3c 2f 68 65 61 64 3e  r</title></head>
4d00: 5c 6e 22 0a 20 20 20 20 22 3c 62 6f 64 79 3e 3c  \n".    "<body><
4d10: 68 31 3e 43 47 49 20 50 72 6f 67 72 61 6d 20 45  h1>CGI Program E
4d20: 72 72 6f 72 3c 2f 68 31 3e 5c 6e 22 0a 20 20 20  rror</h1>\n".   
4d30: 20 22 54 68 65 20 43 47 49 20 70 72 6f 67 72 61   "The CGI progra
4d40: 6d 20 25 73 20 67 65 6e 65 72 61 74 65 64 20 61  m %s generated a
4d50: 6e 20 65 72 72 6f 72 5c 6e 22 0a 20 20 20 20 22  n error\n".    "
4d60: 3c 2f 62 6f 64 79 3e 5c 6e 22 2c 20 7a 53 63 72  </body>\n", zScr
4d70: 69 70 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45  ipt);.  MakeLogE
4d80: 6e 74 72 79 28 30 2c 20 5f 5f 4c 49 4e 45 5f 5f  ntry(0, __LINE__
4d90: 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 43 47 49 20  );  /* LOG: CGI 
4da0: 45 72 72 6f 72 20 2a 2f 0a 20 20 65 78 69 74 28  Error */.  exit(
4db0: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0);.}../*.** Thi
4dc0: 73 20 69 73 20 63 61 6c 6c 65 64 20 69 66 20 77  s is called if w
4dd0: 65 20 74 69 6d 65 6f 75 74 20 6f 72 20 63 61 74  e timeout or cat
4de0: 63 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6b 69  ch some other ki
4df0: 6e 64 20 6f 66 20 73 69 67 6e 61 6c 2e 0a 2a 2a  nd of signal..**
4e00: 20 4c 6f 67 20 61 6e 20 65 72 72 6f 72 20 63 6f   Log an error co
4e10: 64 65 20 77 68 69 63 68 20 69 73 20 39 30 30 2b  de which is 900+
4e20: 69 53 69 67 20 61 6e 64 20 74 68 65 6e 20 71 75  iSig and then qu
4e30: 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  it..*/.static vo
4e40: 69 64 20 54 69 6d 65 6f 75 74 28 69 6e 74 20 69  id Timeout(int i
4e50: 53 69 67 29 7b 0a 20 20 69 66 28 20 21 64 65 62  Sig){.  if( !deb
4e60: 75 67 46 6c 61 67 20 29 7b 0a 20 20 20 20 69 66  ugFlag ){.    if
4e70: 28 20 7a 53 63 72 69 70 74 20 26 26 20 7a 53 63  ( zScript && zSc
4e80: 72 69 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20  ript[0] ){.     
4e90: 20 63 68 61 72 20 7a 42 75 66 5b 31 30 5d 3b 0a   char zBuf[10];.
4ea0: 20 20 20 20 20 20 7a 42 75 66 5b 30 5d 20 3d 20        zBuf[0] = 
4eb0: 27 39 27 3b 0a 20 20 20 20 20 20 7a 42 75 66 5b  '9';.      zBuf[
4ec0: 31 5d 20 3d 20 27 30 27 20 2b 20 28 69 53 69 67  1] = '0' + (iSig
4ed0: 2f 31 30 29 25 31 30 3b 0a 20 20 20 20 20 20 7a  /10)%10;.      z
4ee0: 42 75 66 5b 32 5d 20 3d 20 27 30 27 20 2b 20 69  Buf[2] = '0' + i
4ef0: 53 69 67 25 31 30 3b 0a 20 20 20 20 20 20 7a 42  Sig%10;.      zB
4f00: 75 66 5b 33 5d 20 3d 20 30 3b 0a 20 20 20 20 20  uf[3] = 0;.     
4f10: 20 73 74 72 63 70 79 28 7a 52 65 70 6c 79 53 74   strcpy(zReplySt
4f20: 61 74 75 73 2c 20 7a 42 75 66 29 3b 0a 20 20 20  atus, zBuf);.   
4f30: 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28     MakeLogEntry(
4f40: 30 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 20 2f  0, __LINE__);  /
4f50: 2a 20 4c 4f 47 3a 20 54 69 6d 65 6f 75 74 20 2a  * LOG: Timeout *
4f60: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 69 74  /.    }.    exit
4f70: 28 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (0);.  }.}../*.*
4f80: 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c 69 65 6e  * Tell the clien
4f90: 74 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  t that there is 
4fa0: 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  an error in the 
4fb0: 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69  script..*/.stati
4fc0: 63 20 76 6f 69 64 20 43 67 69 53 63 72 69 70 74  c void CgiScript
4fd0: 57 72 69 74 61 62 6c 65 28 76 6f 69 64 29 7b 0a  Writable(void){.
4fe0: 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28    StartResponse(
4ff0: 22 35 30 30 20 43 47 49 20 43 6f 6e 66 69 67 75  "500 CGI Configu
5000: 72 61 74 69 6f 6e 20 45 72 72 6f 72 22 29 3b 0a  ration Error");.
5010: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
5020: 28 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74  (.    "Content-t
5030: 79 70 65 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c  ype: text/plain\
5040: 72 5c 6e 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a  r\n".    "\r\n".
5050: 20 20 20 20 22 54 68 65 20 43 47 49 20 70 72 6f      "The CGI pro
5060: 67 72 61 6d 20 25 73 20 69 73 20 77 72 69 74 61  gram %s is writa
5070: 62 6c 65 20 62 79 20 75 73 65 72 73 20 6f 74 68  ble by users oth
5080: 65 72 20 74 68 61 6e 20 69 74 73 20 6f 77 6e 65  er than its owne
5090: 72 2e 5c 6e 22 2c 0a 20 20 20 20 7a 52 65 61 6c  r.\n",.    zReal
50a0: 53 63 72 69 70 74 29 3b 0a 20 20 4d 61 6b 65 4c  Script);.  MakeL
50b0: 6f 67 45 6e 74 72 79 28 30 2c 20 5f 5f 4c 49 4e  ogEntry(0, __LIN
50c0: 45 5f 5f 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 43  E__);  /* LOG: C
50d0: 47 49 20 73 63 72 69 70 74 20 69 73 20 77 72 69  GI script is wri
50e0: 74 61 62 6c 65 20 2a 2f 0a 20 20 65 78 69 74 28  table */.  exit(
50f0: 30 29 3b 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a  0);       .}../*
5100: 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c 69  .** Tell the cli
5110: 65 6e 74 20 74 68 61 74 20 74 68 65 20 73 65 72  ent that the ser
5120: 76 65 72 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 65  ver malfunctione
5130: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
5140: 64 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 69 6e  d Malfunction(in
5150: 74 20 6c 69 6e 65 6e 75 6d 2c 20 63 6f 6e 73 74  t linenum, const
5160: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
5170: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
5180: 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ap;.  va_start(a
5190: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 53  p, zFormat);.  S
51a0: 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 35 30  tartResponse("50
51b0: 30 20 53 65 72 76 65 72 20 4d 61 6c 66 75 6e 63  0 Server Malfunc
51c0: 74 69 6f 6e 22 29 3b 0a 20 20 6e 4f 75 74 20 2b  tion");.  nOut +
51d0: 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20 22 43  = printf(.    "C
51e0: 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78  ontent-type: tex
51f0: 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20  t/plain\r\n".   
5200: 20 22 5c 72 5c 6e 22 0a 20 20 20 20 22 57 65 62   "\r\n".    "Web
5210: 20 73 65 72 76 65 72 20 6d 61 6c 66 75 6e 63 74   server malfunct
5220: 69 6f 6e 65 64 3b 20 65 72 72 6f 72 20 6e 75 6d  ioned; error num
5230: 62 65 72 20 25 64 5c 6e 5c 6e 22 2c 20 6c 69 6e  ber %d\n\n", lin
5240: 65 6e 75 6d 29 3b 0a 20 20 69 66 28 20 7a 46 6f  enum);.  if( zFo
5250: 72 6d 61 74 20 29 7b 0a 20 20 20 20 6e 4f 75 74  rmat ){.    nOut
5260: 20 2b 3d 20 76 70 72 69 6e 74 66 28 7a 46 6f 72   += vprintf(zFor
5270: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 20 20  mat, ap);.  }.  
5280: 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20  MakeLogEntry(0, 
5290: 6c 69 6e 65 6e 75 6d 29 3b 0a 20 20 65 78 69 74  linenum);.  exit
52a0: 28 30 29 3b 20 20 20 20 20 20 20 0a 7d 0a 0a 2f  (0);       .}../
52b0: 2a 0a 2a 2a 20 44 6f 20 61 20 73 65 72 76 65 72  *.** Do a server
52c0: 20 72 65 64 69 72 65 63 74 20 74 6f 20 74 68 65   redirect to the
52d0: 20 64 6f 63 75 6d 65 6e 74 20 73 70 65 63 69 66   document specif
52e0: 69 65 64 2e 20 20 54 68 65 20 64 6f 63 75 6d 65  ied.  The docume
52f0: 6e 74 0a 2a 2a 20 6e 61 6d 65 20 6e 6f 74 20 63  nt.** name not c
5300: 6f 6e 74 61 69 6e 20 73 63 68 65 6d 65 20 6f 72  ontain scheme or
5310: 20 6e 65 74 77 6f 72 6b 20 6c 6f 63 61 74 69 6f   network locatio
5320: 6e 20 6f 72 20 74 68 65 20 71 75 65 72 79 20 73  n or the query s
5330: 74 72 69 6e 67 2e 0a 2a 2a 20 49 74 20 77 69 6c  tring..** It wil
5340: 6c 20 62 65 20 6a 75 73 74 20 74 68 65 20 70 61  l be just the pa
5350: 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  th..*/.static vo
5360: 69 64 20 52 65 64 69 72 65 63 74 28 63 6f 6e 73  id Redirect(cons
5370: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69  t char *zPath, i
5380: 6e 74 20 66 69 6e 69 73 68 2c 20 69 6e 74 20 6c  nt finish, int l
5390: 69 6e 65 6e 6f 29 7b 0a 20 20 53 74 61 72 74 52  ineno){.  StartR
53a0: 65 73 70 6f 6e 73 65 28 22 33 30 32 20 54 65 6d  esponse("302 Tem
53b0: 70 6f 72 61 72 79 20 52 65 64 69 72 65 63 74 22  porary Redirect"
53c0: 29 3b 0a 20 20 69 66 28 20 7a 53 65 72 76 65 72  );.  if( zServer
53d0: 50 6f 72 74 3d 3d 30 20 7c 7c 20 7a 53 65 72 76  Port==0 || zServ
53e0: 65 72 50 6f 72 74 5b 30 5d 3d 3d 30 20 7c 7c 20  erPort[0]==0 || 
53f0: 73 74 72 63 6d 70 28 7a 53 65 72 76 65 72 50 6f  strcmp(zServerPo
5400: 72 74 2c 22 38 30 22 29 3d 3d 30 20 29 7b 0a 20  rt,"80")==0 ){. 
5410: 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74     nOut += print
5420: 66 28 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73 3a  f("Location: %s:
5430: 2f 2f 25 73 25 73 25 73 5c 72 5c 6e 22 2c 0a 20  //%s%s%s\r\n",. 
5440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5450: 20 20 7a 48 74 74 70 2c 20 7a 53 65 72 76 65 72    zHttp, zServer
5460: 4e 61 6d 65 2c 20 7a 50 61 74 68 2c 20 7a 51 75  Name, zPath, zQu
5470: 65 72 79 53 75 66 66 69 78 29 3b 0a 20 20 7d 65  erySuffix);.  }e
5480: 6c 73 65 7b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d  lse{.    nOut +=
5490: 20 70 72 69 6e 74 66 28 22 4c 6f 63 61 74 69 6f   printf("Locatio
54a0: 6e 3a 20 25 73 3a 2f 2f 25 73 3a 25 73 25 73 25  n: %s://%s:%s%s%
54b0: 73 5c 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  s\r\n",.        
54c0: 20 20 20 20 20 20 20 20 20 20 20 7a 48 74 74 70             zHttp
54d0: 2c 20 7a 53 65 72 76 65 72 4e 61 6d 65 2c 20 7a  , zServerName, z
54e0: 53 65 72 76 65 72 50 6f 72 74 2c 20 7a 50 61 74  ServerPort, zPat
54f0: 68 2c 20 7a 51 75 65 72 79 53 75 66 66 69 78 29  h, zQuerySuffix)
5500: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 69 6e 69  ;.  }.  if( fini
5510: 73 68 20 29 7b 0a 20 20 20 20 6e 4f 75 74 20 2b  sh ){.    nOut +
5520: 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 74 65 6e  = printf("Conten
5530: 74 2d 6c 65 6e 67 74 68 3a 20 30 5c 72 5c 6e 22  t-length: 0\r\n"
5540: 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70  );.    nOut += p
5550: 72 69 6e 74 66 28 22 5c 72 5c 6e 22 29 3b 0a 20  rintf("\r\n");. 
5560: 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28     MakeLogEntry(
5570: 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a  0, lineno);.  }.
5580: 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29    fflush(stdout)
5590: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
55a0: 66 75 6e 63 74 69 6f 6e 20 74 72 65 61 74 73 20  function treats 
55b0: 69 74 73 20 69 6e 70 75 74 20 61 73 20 61 20 62  its input as a b
55c0: 61 73 65 2d 36 34 20 73 74 72 69 6e 67 20 61 6e  ase-64 string an
55d0: 64 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  d returns the.**
55e0: 20 64 65 63 6f 64 65 64 20 76 61 6c 75 65 20 6f   decoded value o
55f0: 66 20 74 68 61 74 20 73 74 72 69 6e 67 2e 20 20  f that string.  
5600: 43 68 61 72 61 63 74 65 72 73 20 6f 66 20 69 6e  Characters of in
5610: 70 75 74 20 74 68 61 74 20 61 72 65 20 6e 6f 74  put that are not
5620: 0a 2a 2a 20 76 61 6c 69 64 20 62 61 73 65 2d 36  .** valid base-6
5630: 34 20 63 68 61 72 61 63 74 65 72 73 20 28 73 75  4 characters (su
5640: 63 68 20 61 73 20 73 70 61 63 65 73 20 61 6e 64  ch as spaces and
5650: 20 6e 65 77 6c 69 6e 65 73 29 20 61 72 65 20 69   newlines) are i
5660: 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  gnored..*/.void 
5670: 44 65 63 6f 64 65 36 34 28 63 68 61 72 20 2a 7a  Decode64(char *z
5680: 36 34 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 61  64){.  char *zDa
5690: 74 61 3b 0a 20 20 69 6e 74 20 6e 36 34 3b 0a 20  ta;.  int n64;. 
56a0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
56b0: 20 61 2c 20 62 2c 20 63 2c 20 64 3b 0a 20 20 73   a, b, c, d;.  s
56c0: 74 61 74 69 63 20 69 6e 74 20 69 73 49 6e 69 74  tatic int isInit
56d0: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69   = 0;.  static i
56e0: 6e 74 20 74 72 61 6e 73 5b 31 32 38 5d 3b 0a 20  nt trans[128];. 
56f0: 20 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64   static unsigned
5700: 20 63 68 61 72 20 7a 42 61 73 65 5b 5d 20 3d 20   char zBase[] = 
5710: 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a  .    "ABCDEFGHIJ
5720: 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
5730: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
5740: 71 72 73 74 75 76 77 78 79 7a 30 31 32 33 34 35  qrstuvwxyz012345
5750: 36 37 38 39 2b 2f 22 3b 0a 0a 20 20 69 66 28 20  6789+/";..  if( 
5760: 21 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 66  !isInit ){.    f
5770: 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69  or(i=0; i<128; i
5780: 2b 2b 29 7b 20 74 72 61 6e 73 5b 69 5d 20 3d 20  ++){ trans[i] = 
5790: 30 3b 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30  0; }.    for(i=0
57a0: 3b 20 7a 42 61 73 65 5b 69 5d 3b 20 69 2b 2b 29  ; zBase[i]; i++)
57b0: 7b 20 74 72 61 6e 73 5b 7a 42 61 73 65 5b 69 5d  { trans[zBase[i]
57c0: 20 26 20 30 78 37 66 5d 20 3d 20 69 3b 20 7d 0a   & 0x7f] = i; }.
57d0: 20 20 20 20 69 73 49 6e 69 74 20 3d 20 31 3b 0a      isInit = 1;.
57e0: 20 20 7d 0a 20 20 6e 36 34 20 3d 20 73 74 72 6c    }.  n64 = strl
57f0: 65 6e 28 7a 36 34 29 3b 0a 20 20 77 68 69 6c 65  en(z64);.  while
5800: 28 20 6e 36 34 3e 30 20 26 26 20 7a 36 34 5b 6e  ( n64>0 && z64[n
5810: 36 34 2d 31 5d 3d 3d 27 3d 27 20 29 20 6e 36 34  64-1]=='=' ) n64
5820: 2d 2d 3b 0a 20 20 7a 44 61 74 61 20 3d 20 7a 36  --;.  zData = z6
5830: 34 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  4;.  for(i=j=0; 
5840: 69 2b 33 3c 6e 36 34 3b 20 69 2b 3d 34 29 7b 0a  i+3<n64; i+=4){.
5850: 20 20 20 20 61 20 3d 20 74 72 61 6e 73 5b 7a 36      a = trans[z6
5860: 34 5b 69 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20  4[i] & 0x7f];.  
5870: 20 20 62 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b    b = trans[z64[
5880: 69 2b 31 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20  i+1] & 0x7f];.  
5890: 20 20 63 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b    c = trans[z64[
58a0: 69 2b 32 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20  i+2] & 0x7f];.  
58b0: 20 20 64 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b    d = trans[z64[
58c0: 69 2b 33 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20  i+3] & 0x7f];.  
58d0: 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28    zData[j++] = (
58e0: 28 61 3c 3c 32 29 20 26 20 30 78 66 63 29 20 7c  (a<<2) & 0xfc) |
58f0: 20 28 28 62 3e 3e 34 29 20 26 20 30 78 30 33 29   ((b>>4) & 0x03)
5900: 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d  ;.    zData[j++]
5910: 20 3d 20 28 28 62 3c 3c 34 29 20 26 20 30 78 66   = ((b<<4) & 0xf
5920: 30 29 20 7c 20 28 28 63 3e 3e 32 29 20 26 20 30  0) | ((c>>2) & 0
5930: 78 30 66 29 3b 0a 20 20 20 20 7a 44 61 74 61 5b  x0f);.    zData[
5940: 6a 2b 2b 5d 20 3d 20 28 28 63 3c 3c 36 29 20 26  j++] = ((c<<6) &
5950: 20 30 78 63 30 29 20 7c 20 28 64 20 26 20 30 78   0xc0) | (d & 0x
5960: 33 66 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  3f);.  }.  if( i
5970: 2b 32 3c 6e 36 34 20 29 7b 0a 20 20 20 20 61 20  +2<n64 ){.    a 
5980: 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 5d 20 26  = trans[z64[i] &
5990: 20 30 78 37 66 5d 3b 0a 20 20 20 20 62 20 3d 20   0x7f];.    b = 
59a0: 74 72 61 6e 73 5b 7a 36 34 5b 69 2b 31 5d 20 26  trans[z64[i+1] &
59b0: 20 30 78 37 66 5d 3b 0a 20 20 20 20 63 20 3d 20   0x7f];.    c = 
59c0: 74 72 61 6e 73 5b 7a 36 34 5b 69 2b 32 5d 20 26  trans[z64[i+2] &
59d0: 20 30 78 37 66 5d 3b 0a 20 20 20 20 7a 44 61 74   0x7f];.    zDat
59e0: 61 5b 6a 2b 2b 5d 20 3d 20 28 28 61 3c 3c 32 29  a[j++] = ((a<<2)
59f0: 20 26 20 30 78 66 63 29 20 7c 20 28 28 62 3e 3e   & 0xfc) | ((b>>
5a00: 34 29 20 26 20 30 78 30 33 29 3b 0a 20 20 20 20  4) & 0x03);.    
5a10: 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28 62  zData[j++] = ((b
5a20: 3c 3c 34 29 20 26 20 30 78 66 30 29 20 7c 20 28  <<4) & 0xf0) | (
5a30: 28 63 3e 3e 32 29 20 26 20 30 78 30 66 29 3b 0a  (c>>2) & 0x0f);.
5a40: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 2b 31 3c    }else if( i+1<
5a50: 6e 36 34 20 29 7b 0a 20 20 20 20 61 20 3d 20 74  n64 ){.    a = t
5a60: 72 61 6e 73 5b 7a 36 34 5b 69 5d 20 26 20 30 78  rans[z64[i] & 0x
5a70: 37 66 5d 3b 0a 20 20 20 20 62 20 3d 20 74 72 61  7f];.    b = tra
5a80: 6e 73 5b 7a 36 34 5b 69 2b 31 5d 20 26 20 30 78  ns[z64[i+1] & 0x
5a90: 37 66 5d 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a  7f];.    zData[j
5aa0: 2b 2b 5d 20 3d 20 28 28 61 3c 3c 32 29 20 26 20  ++] = ((a<<2) & 
5ab0: 30 78 66 63 29 20 7c 20 28 28 62 3e 3e 34 29 20  0xfc) | ((b>>4) 
5ac0: 26 20 30 78 30 33 29 3b 0a 20 20 7d 0a 20 20 7a  & 0x03);.  }.  z
5ad0: 44 61 74 61 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a  Data[j] = 0;.}..
5ae0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
5af0: 65 65 20 69 66 20 62 61 73 69 63 20 61 75 74 68  ee if basic auth
5b00: 6f 72 69 7a 61 74 69 6f 6e 20 63 72 65 64 65 6e  orization creden
5b10: 74 69 61 6c 73 20 61 72 65 20 70 72 6f 76 69 64  tials are provid
5b20: 65 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20 75 73  ed for.** the us
5b30: 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  er according to 
5b40: 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
5b50: 69 6e 20 7a 41 75 74 68 46 69 6c 65 2e 20 20 52  in zAuthFile.  R
5b60: 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66  eturn true.** if
5b70: 20 61 75 74 68 6f 72 69 7a 65 64 2e 20 20 52 65   authorized.  Re
5b80: 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 6e 6f  turn false if no
5b90: 74 20 61 75 74 68 6f 72 69 7a 65 64 2e 0a 2a 2a  t authorized..**
5ba0: 0a 2a 2a 20 46 69 6c 65 20 66 6f 72 6d 61 74 3a  .** File format:
5bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 42 6c 61  .**.**    *  Bla
5bc0: 6e 6b 20 6c 69 6e 65 73 20 61 6e 64 20 6c 69 6e  nk lines and lin
5bd0: 65 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  es that begin wi
5be0: 74 68 20 27 23 27 20 61 72 65 20 69 67 6e 6f 72  th '#' are ignor
5bf0: 65 64 0a 2a 2a 20 20 20 20 2a 20 20 22 68 74 74  ed.**    *  "htt
5c00: 70 2d 72 65 64 69 72 65 63 74 22 20 66 6f 72 63  p-redirect" forc
5c10: 65 73 20 61 20 72 65 64 69 72 65 63 74 20 74 6f  es a redirect to
5c20: 20 48 54 54 50 53 20 69 66 20 6e 6f 74 20 74 68   HTTPS if not th
5c30: 65 72 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 20  ere already.**  
5c40: 20 20 2a 20 20 22 68 74 74 70 73 2d 6f 6e 6c 79    *  "https-only
5c50: 22 20 64 69 73 61 6c 6c 6f 77 73 20 6f 70 65 72  " disallows oper
5c60: 61 74 69 6f 6e 20 69 6e 20 48 54 54 50 0a 2a 2a  ation in HTTP.**
5c70: 20 20 20 20 2a 20 20 22 75 73 65 72 20 4e 41 4d      *  "user NAM
5c80: 45 20 4c 4f 47 49 4e 3a 50 41 53 53 57 4f 52 44  E LOGIN:PASSWORD
5c90: 22 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  " checks to see 
5ca0: 69 66 20 4c 4f 47 49 4e 3a 50 41 53 53 57 4f 52  if LOGIN:PASSWOR
5cb0: 44 20 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 68  D .**       auth
5cc0: 6f 72 69 7a 61 74 69 6f 6e 20 63 72 65 64 65 6e  orization creden
5cd0: 74 69 61 6c 73 20 61 72 65 20 70 72 6f 76 69 64  tials are provid
5ce0: 65 64 2c 20 61 6e 64 20 69 66 20 73 6f 20 73 65  ed, and if so se
5cf0: 74 73 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  ts the.**       
5d00: 52 45 4d 4f 54 45 5f 55 53 45 52 20 74 6f 20 4e  REMOTE_USER to N
5d10: 41 4d 45 2e 0a 2a 2a 20 20 20 20 2a 20 20 22 72  AME..**    *  "r
5d20: 65 61 6c 6d 20 54 45 58 54 22 20 73 65 74 73 20  ealm TEXT" sets 
5d30: 74 68 65 20 72 65 61 6c 6d 20 74 6f 20 54 45 58  the realm to TEX
5d40: 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  T..*/.static int
5d50: 20 43 68 65 63 6b 42 61 73 69 63 41 75 74 68 6f   CheckBasicAutho
5d60: 72 69 7a 61 74 69 6f 6e 28 63 6f 6e 73 74 20 63  rization(const c
5d70: 68 61 72 20 2a 7a 41 75 74 68 46 69 6c 65 29 7b  har *zAuthFile){
5d80: 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 63  .  FILE *in;.  c
5d90: 68 61 72 20 2a 7a 52 65 61 6c 6d 20 3d 20 22 75  har *zRealm = "u
5da0: 6e 6b 6e 6f 77 6e 20 72 65 61 6c 6d 22 3b 0a 20  nknown realm";. 
5db0: 20 63 68 61 72 20 2a 7a 4c 6f 67 69 6e 50 73 77   char *zLoginPsw
5dc0: 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  d;.  char *zName
5dd0: 3b 0a 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b 32  ;.  char zLine[2
5de0: 30 30 30 5d 3b 0a 0a 20 20 69 6e 20 3d 20 66 6f  000];..  in = fo
5df0: 70 65 6e 28 7a 41 75 74 68 46 69 6c 65 2c 20 22  pen(zAuthFile, "
5e00: 72 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30  r");.  if( in==0
5e10: 20 29 7b 0a 20 20 20 20 4e 6f 74 46 6f 75 6e 64   ){.    NotFound
5e20: 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 20 2f 2a 20  (__LINE__);  /* 
5e30: 4c 4f 47 3a 20 43 61 6e 6e 6f 74 20 6f 70 65 6e  LOG: Cannot open
5e40: 20 2d 61 75 74 68 20 66 69 6c 65 20 2a 2f 0a 20   -auth file */. 
5e50: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
5e60: 0a 20 20 69 66 28 20 7a 41 75 74 68 41 72 67 20  .  if( zAuthArg 
5e70: 29 20 44 65 63 6f 64 65 36 34 28 7a 41 75 74 68  ) Decode64(zAuth
5e80: 41 72 67 29 3b 0a 20 20 77 68 69 6c 65 28 20 66  Arg);.  while( f
5e90: 67 65 74 73 28 7a 4c 69 6e 65 2c 20 73 69 7a 65  gets(zLine, size
5ea0: 6f 66 28 7a 4c 69 6e 65 29 2c 20 69 6e 29 20 29  of(zLine), in) )
5eb0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69 65  {.    char *zFie
5ec0: 6c 64 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72  ldName;.    char
5ed0: 20 2a 7a 56 61 6c 3b 0a 0a 20 20 20 20 7a 46 69   *zVal;..    zFi
5ee0: 65 6c 64 4e 61 6d 65 20 3d 20 47 65 74 46 69 72  eldName = GetFir
5ef0: 73 74 45 6c 65 6d 65 6e 74 28 7a 4c 69 6e 65 2c  stElement(zLine,
5f00: 26 7a 56 61 6c 29 3b 0a 20 20 20 20 69 66 28 20  &zVal);.    if( 
5f10: 7a 46 69 65 6c 64 4e 61 6d 65 3d 3d 30 20 7c 7c  zFieldName==0 ||
5f20: 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 3d 3d 30 20   *zFieldName==0 
5f30: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
5f40: 69 66 28 20 7a 46 69 65 6c 64 4e 61 6d 65 5b 30  if( zFieldName[0
5f50: 5d 3d 3d 27 23 27 20 29 20 63 6f 6e 74 69 6e 75  ]=='#' ) continu
5f60: 65 3b 0a 20 20 20 20 52 65 6d 6f 76 65 4e 65 77  e;.    RemoveNew
5f70: 6c 69 6e 65 28 7a 56 61 6c 29 3b 0a 20 20 20 20  line(zVal);.    
5f80: 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 65 6c  if( strcmp(zFiel
5f90: 64 4e 61 6d 65 2c 20 22 72 65 61 6c 6d 22 29 3d  dName, "realm")=
5fa0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 61  =0 ){.      zRea
5fb0: 6c 6d 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c  lm = StrDup(zVal
5fc0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
5fd0: 20 73 74 72 63 6d 70 28 7a 46 69 65 6c 64 4e 61   strcmp(zFieldNa
5fe0: 6d 65 2c 22 75 73 65 72 22 29 3d 3d 30 20 29 7b  me,"user")==0 ){
5ff0: 0a 20 20 20 20 20 20 69 66 28 20 7a 41 75 74 68  .      if( zAuth
6000: 41 72 67 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Arg==0 ) continu
6010: 65 3b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  e;.      zName =
6020: 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74   GetFirstElement
6030: 28 7a 56 61 6c 2c 20 26 7a 56 61 6c 29 3b 0a 20  (zVal, &zVal);. 
6040: 20 20 20 20 20 7a 4c 6f 67 69 6e 50 73 77 64 20       zLoginPswd 
6050: 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e  = GetFirstElemen
6060: 74 28 7a 56 61 6c 2c 20 26 7a 56 61 6c 29 3b 0a  t(zVal, &zVal);.
6070: 20 20 20 20 20 20 69 66 28 20 7a 4c 6f 67 69 6e        if( zLogin
6080: 50 73 77 64 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Pswd==0 ) contin
6090: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41  ue;.      if( zA
60a0: 75 74 68 41 72 67 20 26 26 20 73 74 72 63 6d 70  uthArg && strcmp
60b0: 28 7a 41 75 74 68 41 72 67 2c 7a 4c 6f 67 69 6e  (zAuthArg,zLogin
60c0: 50 73 77 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Pswd)==0 ){.    
60d0: 20 20 20 20 7a 52 65 6d 6f 74 65 55 73 65 72 20      zRemoteUser 
60e0: 3d 20 53 74 72 44 75 70 28 7a 4e 61 6d 65 29 3b  = StrDup(zName);
60f0: 0a 20 20 20 20 20 20 20 20 66 63 6c 6f 73 65 28  .        fclose(
6100: 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  in);.        ret
6110: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
6120: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
6130: 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22  cmp(zFieldName,"
6140: 68 74 74 70 73 2d 6f 6e 6c 79 22 29 3d 3d 30 20  https-only")==0 
6150: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 75 73  ){.      if( !us
6160: 65 48 74 74 70 73 20 29 7b 0a 20 20 20 20 20 20  eHttps ){.      
6170: 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e    NotFound(__LIN
6180: 45 5f 5f 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 20  E__);  /* LOG:  
6190: 68 74 74 70 20 72 65 71 75 65 73 74 20 6f 6e 20  http request on 
61a0: 68 74 74 70 73 2d 6f 6e 6c 79 20 70 61 67 65 20  https-only page 
61b0: 2a 2f 0a 20 20 20 20 20 20 20 20 66 63 6c 6f 73  */.        fclos
61c0: 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 72  e(in);.        r
61d0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
61e0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
61f0: 74 72 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65  trcmp(zFieldName
6200: 2c 22 68 74 74 70 2d 72 65 64 69 72 65 63 74 22  ,"http-redirect"
6210: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
6220: 28 20 21 75 73 65 48 74 74 70 73 20 29 7b 0a 20  ( !useHttps ){. 
6230: 20 20 20 20 20 20 20 7a 48 74 74 70 20 3d 20 22         zHttp = "
6240: 68 74 74 70 73 22 3b 0a 20 20 20 20 20 20 20 20  https";.        
6250: 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22  sprintf(zLine, "
6260: 25 73 25 73 22 2c 20 7a 53 63 72 69 70 74 2c 20  %s%s", zScript, 
6270: 7a 50 61 74 68 49 6e 66 6f 29 3b 0a 20 20 20 20  zPathInfo);.    
6280: 20 20 20 20 52 65 64 69 72 65 63 74 28 7a 4c 69      Redirect(zLi
6290: 6e 65 2c 20 31 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  ne, 1, __LINE__)
62a0: 3b 20 2f 2a 20 4c 4f 47 3a 20 2d 61 75 74 68 20  ; /* LOG: -auth 
62b0: 72 65 64 69 72 65 63 74 20 2a 2f 0a 20 20 20 20  redirect */.    
62c0: 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
62d0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
62e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
62f0: 6c 73 65 7b 0a 20 20 20 20 20 20 4e 6f 74 46 6f  lse{.      NotFo
6300: 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 20  und(__LINE__);  
6310: 2f 2a 20 4c 4f 47 3a 20 20 6d 61 6c 66 6f 72 6d  /* LOG:  malform
6320: 65 64 20 65 6e 74 72 79 20 69 6e 20 2d 61 75 74  ed entry in -aut
6330: 68 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20  h file */.      
6340: 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20  fclose(in);.    
6350: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
6360: 7d 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69  }.  }.  fclose(i
6370: 6e 29 3b 0a 20 20 4e 6f 74 41 75 74 68 6f 72 69  n);.  NotAuthori
6380: 7a 65 64 28 7a 52 65 61 6c 6d 29 3b 0a 20 20 72  zed(zRealm);.  r
6390: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
63a0: 2a 20 47 75 65 73 73 20 74 68 65 20 6d 69 6d 65  * Guess the mime
63b0: 2d 74 79 70 65 20 6f 66 20 61 20 64 6f 63 75 6d  -type of a docum
63c0: 65 6e 74 20 62 61 73 65 64 20 6f 6e 20 69 74 73  ent based on its
63d0: 20 6e 61 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   name..*/.const 
63e0: 63 68 61 72 20 2a 47 65 74 4d 69 6d 65 54 79 70  char *GetMimeTyp
63f0: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  e(const char *zN
6400: 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b  ame, int nName){
6410: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6420: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
6430: 20 66 69 72 73 74 2c 20 6c 61 73 74 3b 0a 20 20   first, last;.  
6440: 69 6e 74 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20  int len;.  char 
6450: 7a 53 75 66 66 69 78 5b 32 30 5d 3b 0a 0a 20 20  zSuffix[20];..  
6460: 2f 2a 20 41 20 74 61 62 6c 65 20 6f 66 20 6d 69  /* A table of mi
6470: 6d 65 74 79 70 65 73 20 62 61 73 65 64 20 6f 6e  metypes based on
6480: 20 66 69 6c 65 20 73 75 66 66 69 78 65 73 2e 20   file suffixes. 
6490: 0a 20 20 2a 2a 20 53 75 66 66 69 78 65 73 20 6d  .  ** Suffixes m
64a0: 75 73 74 20 62 65 20 69 6e 20 73 6f 72 74 65 64  ust be in sorted
64b0: 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20 77   order so that w
64c0: 65 20 63 61 6e 20 64 6f 20 61 20 62 69 6e 61 72  e can do a binar
64d0: 79 0a 20 20 2a 2a 20 73 65 61 72 63 68 20 74 6f  y.  ** search to
64e0: 20 66 69 6e 64 20 74 68 65 20 6d 69 6d 65 2d 74   find the mime-t
64f0: 79 70 65 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69  ype.  */.  stati
6500: 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
6510: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
6520: 2a 7a 53 75 66 66 69 78 3b 20 20 20 20 20 20 20  *zSuffix;       
6530: 2f 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66 66  /* The file suff
6540: 69 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 69  ix */.    int si
6550: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
6560: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
6570: 66 20 74 68 65 20 73 75 66 66 69 78 20 2a 2f 0a  f the suffix */.
6580: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
6590: 7a 4d 69 6d 65 74 79 70 65 3b 20 20 20 20 20 2f  zMimetype;     /
65a0: 2a 20 54 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  * The correspond
65b0: 69 6e 67 20 6d 69 6d 65 74 79 70 65 20 2a 2f 0a  ing mimetype */.
65c0: 20 20 7d 20 61 4d 69 6d 65 5b 5d 20 3d 20 7b 0a    } aMime[] = {.
65d0: 20 20 20 20 7b 20 22 61 69 22 2c 20 20 20 20 20      { "ai",     
65e0: 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74      2, "applicat
65f0: 69 6f 6e 2f 70 6f 73 74 73 63 72 69 70 74 22 20  ion/postscript" 
6600: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
6610: 20 20 7b 20 22 61 69 66 22 2c 20 20 20 20 20 20    { "aif",      
6620: 20 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 61 69    3, "audio/x-ai
6630: 66 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ff"             
6640: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
6650: 7b 20 22 61 69 66 63 22 2c 20 20 20 20 20 20 20  { "aifc",       
6660: 34 2c 20 22 61 75 64 69 6f 2f 78 2d 61 69 66 66  4, "audio/x-aiff
6670: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
6680: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
6690: 22 61 69 66 66 22 2c 20 20 20 20 20 20 20 34 2c  "aiff",       4,
66a0: 20 22 61 75 64 69 6f 2f 78 2d 61 69 66 66 22 20   "audio/x-aiff" 
66b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66c0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61       },.    { "a
66d0: 72 6a 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  rj",        3, "
66e0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 61 72  application/x-ar
66f0: 6a 2d 63 6f 6d 70 72 65 73 73 65 64 22 20 20 20  j-compressed"   
6700: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 73 63     },.    { "asc
6710: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65  ",        3, "te
6720: 78 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20  xt/plain"       
6730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6740: 20 7d 2c 0a 20 20 20 20 7b 20 22 61 73 66 22 2c   },.    { "asf",
6750: 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64 65          3, "vide
6760: 6f 2f 78 2d 6d 73 2d 61 73 66 22 20 20 20 20 20  o/x-ms-asf"     
6770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
6780: 2c 0a 20 20 20 20 7b 20 22 61 73 78 22 2c 20 20  ,.    { "asx",  
6790: 20 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f        3, "video/
67a0: 78 2d 6d 73 2d 61 73 78 22 20 20 20 20 20 20 20  x-ms-asx"       
67b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
67c0: 20 20 20 20 7b 20 22 61 75 22 2c 20 20 20 20 20      { "au",     
67d0: 20 20 20 20 32 2c 20 22 61 75 64 69 6f 2f 75 6c      2, "audio/ul
67e0: 61 77 22 20 20 20 20 20 20 20 20 20 20 20 20 20  aw"             
67f0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
6800: 20 20 7b 20 22 61 76 69 22 2c 20 20 20 20 20 20    { "avi",      
6810: 20 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73    3, "video/x-ms
6820: 76 69 64 65 6f 22 20 20 20 20 20 20 20 20 20 20  video"          
6830: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
6840: 7b 20 22 62 61 74 22 2c 20 20 20 20 20 20 20 20  { "bat",        
6850: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
6860: 78 2d 6d 73 64 6f 73 2d 70 72 6f 67 72 61 6d 22  x-msdos-program"
6870: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
6880: 22 62 63 70 69 6f 22 2c 20 20 20 20 20 20 35 2c  "bcpio",      5,
6890: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
68a0: 62 63 70 69 6f 22 20 20 20 20 20 20 20 20 20 20  bcpio"          
68b0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 62       },.    { "b
68c0: 69 6e 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  in",        3, "
68d0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65  application/octe
68e0: 74 2d 73 74 72 65 61 6d 22 20 20 20 20 20 20 20  t-stream"       
68f0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 22 2c     },.    { "c",
6900: 20 20 20 20 20 20 20 20 20 20 31 2c 20 22 74 65            1, "te
6910: 78 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20  xt/plain"       
6920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6930: 20 7d 2c 0a 20 20 20 20 7b 20 22 63 63 22 2c 20   },.    { "cc", 
6940: 20 20 20 20 20 20 20 20 32 2c 20 22 74 65 78 74          2, "text
6950: 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20  /plain"         
6960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
6970: 2c 0a 20 20 20 20 7b 20 22 63 63 61 64 22 2c 20  ,.    { "ccad", 
6980: 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63        4, "applic
6990: 61 74 69 6f 6e 2f 63 6c 61 72 69 73 63 61 64 22  ation/clariscad"
69a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
69b0: 20 20 20 20 7b 20 22 63 64 66 22 2c 20 20 20 20      { "cdf",    
69c0: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
69d0: 69 6f 6e 2f 78 2d 6e 65 74 63 64 66 22 20 20 20  ion/x-netcdf"   
69e0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
69f0: 20 20 7b 20 22 63 6c 61 73 73 22 2c 20 20 20 20    { "class",    
6a00: 20 20 35 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    5, "applicatio
6a10: 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22 20  n/octet-stream" 
6a20: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
6a30: 7b 20 22 63 6f 64 22 2c 20 20 20 20 20 20 20 20  { "cod",        
6a40: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
6a50: 76 6e 64 2e 72 69 6d 2e 63 6f 64 22 20 20 20 20  vnd.rim.cod"    
6a60: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
6a70: 22 63 6f 6d 22 2c 20 20 20 20 20 20 20 20 33 2c  "com",        3,
6a80: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
6a90: 6d 73 64 6f 73 2d 70 72 6f 67 72 61 6d 22 20 20  msdos-program"  
6aa0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63       },.    { "c
6ab0: 70 69 6f 22 2c 20 20 20 20 20 20 20 34 2c 20 22  pio",       4, "
6ac0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 63 70  application/x-cp
6ad0: 69 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20  io"             
6ae0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 70 74     },.    { "cpt
6af0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
6b00: 70 6c 69 63 61 74 69 6f 6e 2f 6d 61 63 2d 63 6f  plication/mac-co
6b10: 6d 70 61 63 74 70 72 6f 22 20 20 20 20 20 20 20  mpactpro"       
6b20: 20 7d 2c 0a 20 20 20 20 7b 20 22 63 73 68 22 2c   },.    { "csh",
6b30: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
6b40: 69 63 61 74 69 6f 6e 2f 78 2d 63 73 68 22 20 20  ication/x-csh"  
6b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
6b60: 2c 0a 20 20 20 20 7b 20 22 63 73 73 22 2c 20 20  ,.    { "css",  
6b70: 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 63        3, "text/c
6b80: 73 73 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ss"             
6b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
6ba0: 20 20 20 20 7b 20 22 64 63 72 22 2c 20 20 20 20      { "dcr",    
6bb0: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
6bc0: 69 6f 6e 2f 78 2d 64 69 72 65 63 74 6f 72 22 20  ion/x-director" 
6bd0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
6be0: 20 20 7b 20 22 64 65 62 22 2c 20 20 20 20 20 20    { "deb",      
6bf0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
6c00: 6e 2f 78 2d 64 65 62 69 61 6e 2d 70 61 63 6b 61  n/x-debian-packa
6c10: 67 65 22 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  ge"      },.    
6c20: 7b 20 22 64 69 72 22 2c 20 20 20 20 20 20 20 20  { "dir",        
6c30: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
6c40: 78 2d 64 69 72 65 63 74 6f 72 22 20 20 20 20 20  x-director"     
6c50: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
6c60: 22 64 6c 22 2c 20 20 20 20 20 20 20 20 20 32 2c  "dl",         2,
6c70: 20 22 76 69 64 65 6f 2f 64 6c 22 20 20 20 20 20   "video/dl"     
6c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c90: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64       },.    { "d
6ca0: 6d 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ms",        3, "
6cb0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65  application/octe
6cc0: 74 2d 73 74 72 65 61 6d 22 20 20 20 20 20 20 20  t-stream"       
6cd0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 6f 63     },.    { "doc
6ce0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
6cf0: 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 77 6f 72 64  plication/msword
6d00: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
6d10: 20 7d 2c 0a 20 20 20 20 7b 20 22 64 72 77 22 2c   },.    { "drw",
6d20: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
6d30: 69 63 61 74 69 6f 6e 2f 64 72 61 66 74 69 6e 67  ication/drafting
6d40: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  "              }
6d50: 2c 0a 20 20 20 20 7b 20 22 64 76 69 22 2c 20 20  ,.    { "dvi",  
6d60: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
6d70: 61 74 69 6f 6e 2f 78 2d 64 76 69 22 20 20 20 20  ation/x-dvi"    
6d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
6d90: 20 20 20 20 7b 20 22 64 77 67 22 2c 20 20 20 20      { "dwg",    
6da0: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
6db0: 69 6f 6e 2f 61 63 61 64 22 20 20 20 20 20 20 20  ion/acad"       
6dc0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
6dd0: 20 20 7b 20 22 64 78 66 22 2c 20 20 20 20 20 20    { "dxf",      
6de0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
6df0: 6e 2f 64 78 66 22 20 20 20 20 20 20 20 20 20 20  n/dxf"          
6e00: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
6e10: 7b 20 22 64 78 72 22 2c 20 20 20 20 20 20 20 20  { "dxr",        
6e20: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
6e30: 78 2d 64 69 72 65 63 74 6f 72 22 20 20 20 20 20  x-director"     
6e40: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
6e50: 22 65 70 73 22 2c 20 20 20 20 20 20 20 20 33 2c  "eps",        3,
6e60: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 6f   "application/po
6e70: 73 74 73 63 72 69 70 74 22 20 20 20 20 20 20 20  stscript"       
6e80: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65       },.    { "e
6e90: 74 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  tx",        3, "
6ea0: 74 65 78 74 2f 78 2d 73 65 74 65 78 74 22 20 20  text/x-setext"  
6eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ec0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65 78 65     },.    { "exe
6ed0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
6ee0: 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d  plication/octet-
6ef0: 73 74 72 65 61 6d 22 20 20 20 20 20 20 20 20 20  stream"         
6f00: 20 7d 2c 0a 20 20 20 20 7b 20 22 65 7a 22 2c 20   },.    { "ez", 
6f10: 20 20 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c          2, "appl
6f20: 69 63 61 74 69 6f 6e 2f 61 6e 64 72 65 77 2d 69  ication/andrew-i
6f30: 6e 73 65 74 22 20 20 20 20 20 20 20 20 20 20 7d  nset"          }
6f40: 2c 0a 20 20 20 20 7b 20 22 66 22 2c 20 20 20 20  ,.    { "f",    
6f50: 20 20 20 20 20 20 31 2c 20 22 74 65 78 74 2f 70        1, "text/p
6f60: 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20 20 20  lain"           
6f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
6f80: 20 20 20 20 7b 20 22 66 39 30 22 2c 20 20 20 20      { "f90",    
6f90: 20 20 20 20 33 2c 20 22 74 65 78 74 2f 70 6c 61      3, "text/pla
6fa0: 69 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20  in"             
6fb0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
6fc0: 20 20 7b 20 22 66 6c 69 22 2c 20 20 20 20 20 20    { "fli",      
6fd0: 20 20 33 2c 20 22 76 69 64 65 6f 2f 66 6c 69 22    3, "video/fli"
6fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ff0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
7000: 7b 20 22 66 6c 76 22 2c 20 20 20 20 20 20 20 20  { "flv",        
7010: 33 2c 20 22 76 69 64 65 6f 2f 66 6c 76 22 20 20  3, "video/flv"  
7020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7030: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
7040: 22 67 69 66 22 2c 20 20 20 20 20 20 20 20 33 2c  "gif",        3,
7050: 20 22 69 6d 61 67 65 2f 67 69 66 22 20 20 20 20   "image/gif"    
7060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7070: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 67       },.    { "g
7080: 6c 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22  l",         2, "
7090: 76 69 64 65 6f 2f 67 6c 22 20 20 20 20 20 20 20  video/gl"       
70a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70b0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 67 74 61     },.    { "gta
70c0: 72 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70  r",       4, "ap
70d0: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 67 74 61 72  plication/x-gtar
70e0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
70f0: 20 7d 2c 0a 20 20 20 20 7b 20 22 67 7a 22 2c 20   },.    { "gz", 
7100: 20 20 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c          2, "appl
7110: 69 63 61 74 69 6f 6e 2f 78 2d 67 7a 69 70 22 20  ication/x-gzip" 
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
7130: 2c 0a 20 20 20 20 7b 20 22 68 64 66 22 2c 20 20  ,.    { "hdf",  
7140: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
7150: 61 74 69 6f 6e 2f 78 2d 68 64 66 22 20 20 20 20  ation/x-hdf"    
7160: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
7170: 20 20 20 20 7b 20 22 68 68 22 2c 20 20 20 20 20      { "hh",     
7180: 20 20 20 20 32 2c 20 22 74 65 78 74 2f 70 6c 61      2, "text/pla
7190: 69 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20  in"             
71a0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
71b0: 20 20 7b 20 22 68 71 78 22 2c 20 20 20 20 20 20    { "hqx",      
71c0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
71d0: 6e 2f 6d 61 63 2d 62 69 6e 68 65 78 34 30 22 20  n/mac-binhex40" 
71e0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
71f0: 7b 20 22 68 22 2c 20 20 20 20 20 20 20 20 20 20  { "h",          
7200: 31 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20  1, "text/plain" 
7210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7220: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
7230: 22 68 74 6d 22 2c 20 20 20 20 20 20 20 20 33 2c  "htm",        3,
7240: 20 22 74 65 78 74 2f 68 74 6d 6c 3b 20 63 68 61   "text/html; cha
7250: 72 73 65 74 3d 75 74 66 2d 38 22 20 20 20 20 20  rset=utf-8"     
7260: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68       },.    { "h
7270: 74 6d 6c 22 2c 20 20 20 20 20 20 20 34 2c 20 22  tml",       4, "
7280: 74 65 78 74 2f 68 74 6d 6c 3b 20 63 68 61 72 73  text/html; chars
7290: 65 74 3d 75 74 66 2d 38 22 20 20 20 20 20 20 20  et=utf-8"       
72a0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 63 65     },.    { "ice
72b0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 78 2d  ",        3, "x-
72c0: 63 6f 6e 66 65 72 65 6e 63 65 2f 78 2d 63 6f 6f  conference/x-coo
72d0: 6c 74 61 6c 6b 22 20 20 20 20 20 20 20 20 20 20  ltalk"          
72e0: 20 7d 2c 0a 20 20 20 20 7b 20 22 69 65 66 22 2c   },.    { "ief",
72f0: 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67          3, "imag
7300: 65 2f 69 65 66 22 20 20 20 20 20 20 20 20 20 20  e/ief"          
7310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
7320: 2c 0a 20 20 20 20 7b 20 22 69 67 65 73 22 2c 20  ,.    { "iges", 
7330: 20 20 20 20 20 20 34 2c 20 22 6d 6f 64 65 6c 2f        4, "model/
7340: 69 67 65 73 22 20 20 20 20 20 20 20 20 20 20 20  iges"           
7350: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
7360: 20 20 20 20 7b 20 22 69 67 73 22 2c 20 20 20 20      { "igs",    
7370: 20 20 20 20 33 2c 20 22 6d 6f 64 65 6c 2f 69 67      3, "model/ig
7380: 65 73 22 20 20 20 20 20 20 20 20 20 20 20 20 20  es"             
7390: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
73a0: 20 20 7b 20 22 69 70 73 22 2c 20 20 20 20 20 20    { "ips",      
73b0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
73c0: 6e 2f 78 2d 69 70 73 63 72 69 70 74 22 20 20 20  n/x-ipscript"   
73d0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
73e0: 7b 20 22 69 70 78 22 2c 20 20 20 20 20 20 20 20  { "ipx",        
73f0: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
7400: 78 2d 69 70 69 78 22 20 20 20 20 20 20 20 20 20  x-ipix"         
7410: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
7420: 22 6a 61 64 22 2c 20 20 20 20 20 20 20 20 33 2c  "jad",        3,
7430: 20 22 74 65 78 74 2f 76 6e 64 2e 73 75 6e 2e 6a   "text/vnd.sun.j
7440: 32 6d 65 2e 61 70 70 2d 64 65 73 63 72 69 70 74  2me.app-descript
7450: 6f 72 22 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a  or"  },.    { "j
7460: 61 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ar",        3, "
7470: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6a 61 76 61  application/java
7480: 2d 61 72 63 68 69 76 65 22 20 20 20 20 20 20 20  -archive"       
7490: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 70 65     },.    { "jpe
74a0: 67 22 2c 20 20 20 20 20 20 20 34 2c 20 22 69 6d  g",       4, "im
74b0: 61 67 65 2f 6a 70 65 67 22 20 20 20 20 20 20 20  age/jpeg"       
74c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74d0: 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 70 65 22 2c   },.    { "jpe",
74e0: 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67          3, "imag
74f0: 65 2f 6a 70 65 67 22 20 20 20 20 20 20 20 20 20  e/jpeg"         
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
7510: 2c 0a 20 20 20 20 7b 20 22 6a 70 67 22 2c 20 20  ,.    { "jpg",  
7520: 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f        3, "image/
7530: 6a 70 65 67 22 20 20 20 20 20 20 20 20 20 20 20  jpeg"           
7540: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
7550: 20 20 20 20 7b 20 22 6a 73 22 2c 20 20 20 20 20      { "js",     
7560: 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74      2, "applicat
7570: 69 6f 6e 2f 78 2d 6a 61 76 61 73 63 72 69 70 74  ion/x-javascript
7580: 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  "          },.  
7590: 20 20 7b 20 22 6b 61 72 22 2c 20 20 20 20 20 20    { "kar",      
75a0: 20 20 33 2c 20 22 61 75 64 69 6f 2f 6d 69 64 69    3, "audio/midi
75b0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
75c0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
75d0: 7b 20 22 6c 61 74 65 78 22 2c 20 20 20 20 20 20  { "latex",      
75e0: 35 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  5, "application/
75f0: 78 2d 6c 61 74 65 78 22 20 20 20 20 20 20 20 20  x-latex"        
7600: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
7610: 22 6c 68 61 22 2c 20 20 20 20 20 20 20 20 33 2c  "lha",        3,
7620: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63   "application/oc
7630: 74 65 74 2d 73 74 72 65 61 6d 22 20 20 20 20 20  tet-stream"     
7640: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c       },.    { "l
7650: 73 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  sp",        3, "
7660: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6c 69  application/x-li
7670: 73 70 22 20 20 20 20 20 20 20 20 20 20 20 20 20  sp"             
7680: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 7a 68     },.    { "lzh
7690: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
76a0: 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d  plication/octet-
76b0: 73 74 72 65 61 6d 22 20 20 20 20 20 20 20 20 20  stream"         
76c0: 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 22 2c 20 20   },.    { "m",  
76d0: 20 20 20 20 20 20 20 20 31 2c 20 22 74 65 78 74          1, "text
76e0: 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20  /plain"         
76f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
7700: 2c 0a 20 20 20 20 7b 20 22 6d 33 75 22 2c 20 20  ,.    { "m3u",  
7710: 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f        3, "audio/
7720: 78 2d 6d 70 65 67 75 72 6c 22 20 20 20 20 20 20  x-mpegurl"      
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
7740: 20 20 20 20 7b 20 22 6d 61 6e 22 2c 20 20 20 20      { "man",    
7750: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
7760: 69 6f 6e 2f 78 2d 74 72 6f 66 66 2d 6d 61 6e 22  ion/x-troff-man"
7770: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
7780: 20 20 7b 20 22 6d 65 22 2c 20 20 20 20 20 20 20    { "me",       
7790: 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    2, "applicatio
77a0: 6e 2f 78 2d 74 72 6f 66 66 2d 6d 65 22 20 20 20  n/x-troff-me"   
77b0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
77c0: 7b 20 22 6d 65 73 68 22 2c 20 20 20 20 20 20 20  { "mesh",       
77d0: 34 2c 20 22 6d 6f 64 65 6c 2f 6d 65 73 68 22 20  4, "model/mesh" 
77e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77f0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
7800: 22 6d 69 64 22 2c 20 20 20 20 20 20 20 20 33 2c  "mid",        3,
7810: 20 22 61 75 64 69 6f 2f 6d 69 64 69 22 20 20 20   "audio/midi"   
7820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7830: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d       },.    { "m
7840: 69 64 69 22 2c 20 20 20 20 20 20 20 34 2c 20 22  idi",       4, "
7850: 61 75 64 69 6f 2f 6d 69 64 69 22 20 20 20 20 20  audio/midi"     
7860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7870: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 69 66     },.    { "mif
7880: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
7890: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6d 69 66 22  plication/x-mif"
78a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78b0: 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 69 6d 65 22   },.    { "mime"
78c0: 2c 20 20 20 20 20 20 20 34 2c 20 22 77 77 77 2f  ,       4, "www/
78d0: 6d 69 6d 65 22 20 20 20 20 20 20 20 20 20 20 20  mime"           
78e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
78f0: 2c 0a 20 20 20 20 7b 20 22 6d 6f 76 69 65 22 2c  ,.    { "movie",
7900: 20 20 20 20 20 20 35 2c 20 22 76 69 64 65 6f 2f        5, "video/
7910: 78 2d 73 67 69 2d 6d 6f 76 69 65 22 20 20 20 20  x-sgi-movie"    
7920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
7930: 20 20 20 20 7b 20 22 6d 6f 76 22 2c 20 20 20 20      { "mov",    
7940: 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 71 75      3, "video/qu
7950: 69 63 6b 74 69 6d 65 22 20 20 20 20 20 20 20 20  icktime"        
7960: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
7970: 20 20 7b 20 22 6d 70 32 22 2c 20 20 20 20 20 20    { "mp2",      
7980: 20 20 33 2c 20 22 61 75 64 69 6f 2f 6d 70 65 67    3, "audio/mpeg
7990: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
79a0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
79b0: 7b 20 22 6d 70 32 22 2c 20 20 20 20 20 20 20 20  { "mp2",        
79c0: 33 2c 20 22 76 69 64 65 6f 2f 6d 70 65 67 22 20  3, "video/mpeg" 
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79e0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
79f0: 22 6d 70 33 22 2c 20 20 20 20 20 20 20 20 33 2c  "mp3",        3,
7a00: 20 22 61 75 64 69 6f 2f 6d 70 65 67 22 20 20 20   "audio/mpeg"   
7a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a20: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d       },.    { "m
7a30: 70 65 67 22 2c 20 20 20 20 20 20 20 34 2c 20 22  peg",       4, "
7a40: 76 69 64 65 6f 2f 6d 70 65 67 22 20 20 20 20 20  video/mpeg"     
7a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a60: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 65     },.    { "mpe
7a70: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69  ",        3, "vi
7a80: 64 65 6f 2f 6d 70 65 67 22 20 20 20 20 20 20 20  deo/mpeg"       
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7aa0: 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 67 61 22   },.    { "mpga"
7ab0: 2c 20 20 20 20 20 20 20 34 2c 20 22 61 75 64 69  ,       4, "audi
7ac0: 6f 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20 20  o/mpeg"         
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
7ae0: 2c 0a 20 20 20 20 7b 20 22 6d 70 67 22 2c 20 20  ,.    { "mpg",  
7af0: 20 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f        3, "video/
7b00: 6d 70 65 67 22 20 20 20 20 20 20 20 20 20 20 20  mpeg"           
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
7b20: 20 20 20 20 7b 20 22 6d 73 22 2c 20 20 20 20 20      { "ms",     
7b30: 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74      2, "applicat
7b40: 69 6f 6e 2f 78 2d 74 72 6f 66 66 2d 6d 73 22 20  ion/x-troff-ms" 
7b50: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
7b60: 20 20 7b 20 22 6d 73 68 22 2c 20 20 20 20 20 20    { "msh",      
7b70: 20 20 33 2c 20 22 6d 6f 64 65 6c 2f 6d 65 73 68    3, "model/mesh
7b80: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
7b90: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
7ba0: 7b 20 22 6e 63 22 2c 20 20 20 20 20 20 20 20 20  { "nc",         
7bb0: 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  2, "application/
7bc0: 78 2d 6e 65 74 63 64 66 22 20 20 20 20 20 20 20  x-netcdf"       
7bd0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
7be0: 22 6f 64 61 22 2c 20 20 20 20 20 20 20 20 33 2c  "oda",        3,
7bf0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 64   "application/od
7c00: 61 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a"              
7c10: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f       },.    { "o
7c20: 67 67 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  gg",        3, "
7c30: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 67 67 22  application/ogg"
7c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c50: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 67 6d     },.    { "ogm
7c60: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
7c70: 70 6c 69 63 61 74 69 6f 6e 2f 6f 67 67 22 20 20  plication/ogg"  
7c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c90: 20 7d 2c 0a 20 20 20 20 7b 20 22 70 62 6d 22 2c   },.    { "pbm",
7ca0: 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67          3, "imag
7cb0: 65 2f 78 2d 70 6f 72 74 61 62 6c 65 2d 62 69 74  e/x-portable-bit
7cc0: 6d 61 70 22 20 20 20 20 20 20 20 20 20 20 20 7d  map"           }
7cd0: 2c 0a 20 20 20 20 7b 20 22 70 64 62 22 2c 20 20  ,.    { "pdb",  
7ce0: 20 20 20 20 20 20 33 2c 20 22 63 68 65 6d 69 63        3, "chemic
7cf0: 61 6c 2f 78 2d 70 64 62 22 20 20 20 20 20 20 20  al/x-pdb"       
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
7d10: 20 20 20 20 7b 20 22 70 64 66 22 2c 20 20 20 20      { "pdf",    
7d20: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
7d30: 69 6f 6e 2f 70 64 66 22 20 20 20 20 20 20 20 20  ion/pdf"        
7d40: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
7d50: 20 20 7b 20 22 70 67 6d 22 2c 20 20 20 20 20 20    { "pgm",      
7d60: 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 70 6f    3, "image/x-po
7d70: 72 74 61 62 6c 65 2d 67 72 61 79 6d 61 70 22 20  rtable-graymap" 
7d80: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
7d90: 7b 20 22 70 67 6e 22 2c 20 20 20 20 20 20 20 20  { "pgn",        
7da0: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
7db0: 78 2d 63 68 65 73 73 2d 70 67 6e 22 20 20 20 20  x-chess-pgn"    
7dc0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
7dd0: 22 70 67 70 22 2c 20 20 20 20 20 20 20 20 33 2c  "pgp",        3,
7de0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 67   "application/pg
7df0: 70 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p"              
7e00: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70       },.    { "p
7e10: 6c 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22  l",         2, "
7e20: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 70 65  application/x-pe
7e30: 72 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20  rl"             
7e40: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 6d 22     },.    { "pm"
7e50: 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70  ,         2, "ap
7e60: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 70 65 72 6c  plication/x-perl
7e70: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
7e80: 20 7d 2c 0a 20 20 20 20 7b 20 22 70 6e 67 22 2c   },.    { "png",
7e90: 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67          3, "imag
7ea0: 65 2f 70 6e 67 22 20 20 20 20 20 20 20 20 20 20  e/png"          
7eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
7ec0: 2c 0a 20 20 20 20 7b 20 22 70 6e 6d 22 2c 20 20  ,.    { "pnm",  
7ed0: 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f        3, "image/
7ee0: 78 2d 70 6f 72 74 61 62 6c 65 2d 61 6e 79 6d 61  x-portable-anyma
7ef0: 70 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  p"           },.
7f00: 20 20 20 20 7b 20 22 70 6f 74 22 2c 20 20 20 20      { "pot",    
7f10: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
7f20: 69 6f 6e 2f 6d 73 70 6f 77 65 72 70 6f 69 6e 74  ion/mspowerpoint
7f30: 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  "          },.  
7f40: 20 20 7b 20 22 70 70 6d 22 2c 20 20 20 20 20 20    { "ppm",      
7f50: 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 70 6f    3, "image/x-po
7f60: 72 74 61 62 6c 65 2d 70 69 78 6d 61 70 22 20 20  rtable-pixmap"  
7f70: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
7f80: 7b 20 22 70 70 73 22 2c 20 20 20 20 20 20 20 20  { "pps",        
7f90: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
7fa0: 6d 73 70 6f 77 65 72 70 6f 69 6e 74 22 20 20 20  mspowerpoint"   
7fb0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
7fc0: 22 70 70 74 22 2c 20 20 20 20 20 20 20 20 33 2c  "ppt",        3,
7fd0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73   "application/ms
7fe0: 70 6f 77 65 72 70 6f 69 6e 74 22 20 20 20 20 20  powerpoint"     
7ff0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70       },.    { "p
8000: 70 7a 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  pz",        3, "
8010: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 70 6f  application/mspo
8020: 77 65 72 70 6f 69 6e 74 22 20 20 20 20 20 20 20  werpoint"       
8030: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 72 65     },.    { "pre
8040: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
8050: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 66 72 65 65  plication/x-free
8060: 6c 61 6e 63 65 22 20 20 20 20 20 20 20 20 20 20  lance"          
8070: 20 7d 2c 0a 20 20 20 20 7b 20 22 70 72 74 22 2c   },.    { "prt",
8080: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
8090: 69 63 61 74 69 6f 6e 2f 70 72 6f 5f 65 6e 67 22  ication/pro_eng"
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
80b0: 2c 0a 20 20 20 20 7b 20 22 70 73 22 2c 20 20 20  ,.    { "ps",   
80c0: 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63        2, "applic
80d0: 61 74 69 6f 6e 2f 70 6f 73 74 73 63 72 69 70 74  ation/postscript
80e0: 22 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  "            },.
80f0: 20 20 20 20 7b 20 22 71 74 22 2c 20 20 20 20 20      { "qt",     
8100: 20 20 20 20 32 2c 20 22 76 69 64 65 6f 2f 71 75      2, "video/qu
8110: 69 63 6b 74 69 6d 65 22 20 20 20 20 20 20 20 20  icktime"        
8120: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8130: 20 20 7b 20 22 72 61 22 2c 20 20 20 20 20 20 20    { "ra",       
8140: 20 20 32 2c 20 22 61 75 64 69 6f 2f 78 2d 72 65    2, "audio/x-re
8150: 61 6c 61 75 64 69 6f 22 20 20 20 20 20 20 20 20  alaudio"        
8160: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
8170: 7b 20 22 72 61 6d 22 2c 20 20 20 20 20 20 20 20  { "ram",        
8180: 33 2c 20 22 61 75 64 69 6f 2f 78 2d 70 6e 2d 72  3, "audio/x-pn-r
8190: 65 61 6c 61 75 64 69 6f 22 20 20 20 20 20 20 20  ealaudio"       
81a0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
81b0: 22 72 61 72 22 2c 20 20 20 20 20 20 20 20 33 2c  "rar",        3,
81c0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
81d0: 72 61 72 2d 63 6f 6d 70 72 65 73 73 65 64 22 20  rar-compressed" 
81e0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72       },.    { "r
81f0: 61 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  as",        3, "
8200: 69 6d 61 67 65 2f 63 6d 75 2d 72 61 73 74 65 72  image/cmu-raster
8210: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8220: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61 73     },.    { "ras
8230: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d  ",        3, "im
8240: 61 67 65 2f 78 2d 63 6d 75 2d 72 61 73 74 65 72  age/x-cmu-raster
8250: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8260: 20 7d 2c 0a 20 20 20 20 7b 20 22 72 67 62 22 2c   },.    { "rgb",
8270: 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67          3, "imag
8280: 65 2f 78 2d 72 67 62 22 20 20 20 20 20 20 20 20  e/x-rgb"        
8290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
82a0: 2c 0a 20 20 20 20 7b 20 22 72 6d 22 2c 20 20 20  ,.    { "rm",   
82b0: 20 20 20 20 20 20 32 2c 20 22 61 75 64 69 6f 2f        2, "audio/
82c0: 78 2d 70 6e 2d 72 65 61 6c 61 75 64 69 6f 22 20  x-pn-realaudio" 
82d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
82e0: 20 20 20 20 7b 20 22 72 6f 66 66 22 2c 20 20 20      { "roff",   
82f0: 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74      4, "applicat
8300: 69 6f 6e 2f 78 2d 74 72 6f 66 66 22 20 20 20 20  ion/x-troff"    
8310: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8320: 20 20 7b 20 22 72 70 6d 22 2c 20 20 20 20 20 20    { "rpm",      
8330: 20 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 70 6e    3, "audio/x-pn
8340: 2d 72 65 61 6c 61 75 64 69 6f 2d 70 6c 75 67 69  -realaudio-plugi
8350: 6e 22 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  n"       },.    
8360: 7b 20 22 72 74 66 22 2c 20 20 20 20 20 20 20 20  { "rtf",        
8370: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
8380: 72 74 66 22 20 20 20 20 20 20 20 20 20 20 20 20  rtf"            
8390: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
83a0: 22 72 74 66 22 2c 20 20 20 20 20 20 20 20 33 2c  "rtf",        3,
83b0: 20 22 74 65 78 74 2f 72 74 66 22 20 20 20 20 20   "text/rtf"     
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83d0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72       },.    { "r
83e0: 74 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  tx",        3, "
83f0: 74 65 78 74 2f 72 69 63 68 74 65 78 74 22 20 20  text/richtext"  
8400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8410: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 63 6d     },.    { "scm
8420: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
8430: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6c 6f 74 75  plication/x-lotu
8440: 73 73 63 72 65 65 6e 63 61 6d 22 20 20 20 20 20  sscreencam"     
8450: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 65 74 22 2c   },.    { "set",
8460: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
8470: 69 63 61 74 69 6f 6e 2f 73 65 74 22 20 20 20 20  ication/set"    
8480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8490: 2c 0a 20 20 20 20 7b 20 22 73 67 6d 6c 22 2c 20  ,.    { "sgml", 
84a0: 20 20 20 20 20 20 34 2c 20 22 74 65 78 74 2f 73        4, "text/s
84b0: 67 6d 6c 22 20 20 20 20 20 20 20 20 20 20 20 20  gml"            
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
84d0: 20 20 20 20 7b 20 22 73 67 6d 22 2c 20 20 20 20      { "sgm",    
84e0: 20 20 20 20 33 2c 20 22 74 65 78 74 2f 73 67 6d      3, "text/sgm
84f0: 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l"              
8500: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8510: 20 20 7b 20 22 73 68 22 2c 20 20 20 20 20 20 20    { "sh",       
8520: 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    2, "applicatio
8530: 6e 2f 78 2d 73 68 22 20 20 20 20 20 20 20 20 20  n/x-sh"         
8540: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
8550: 7b 20 22 73 68 61 72 22 2c 20 20 20 20 20 20 20  { "shar",       
8560: 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  4, "application/
8570: 78 2d 73 68 61 72 22 20 20 20 20 20 20 20 20 20  x-shar"         
8580: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8590: 22 73 69 6c 6f 22 2c 20 20 20 20 20 20 20 34 2c  "silo",       4,
85a0: 20 22 6d 6f 64 65 6c 2f 6d 65 73 68 22 20 20 20   "model/mesh"   
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85c0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73       },.    { "s
85d0: 69 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  it",        3, "
85e0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 74  application/x-st
85f0: 75 66 66 69 74 22 20 20 20 20 20 20 20 20 20 20  uffit"          
8600: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6b 64     },.    { "skd
8610: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
8620: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6b 6f 61 6e  plication/x-koan
8630: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8640: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6b 6d 22 2c   },.    { "skm",
8650: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
8660: 69 63 61 74 69 6f 6e 2f 78 2d 6b 6f 61 6e 22 20  ication/x-koan" 
8670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8680: 2c 0a 20 20 20 20 7b 20 22 73 6b 70 22 2c 20 20  ,.    { "skp",  
8690: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
86a0: 61 74 69 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20  ation/x-koan"   
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
86c0: 20 20 20 20 7b 20 22 73 6b 74 22 2c 20 20 20 20      { "skt",    
86d0: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
86e0: 69 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20 20 20  ion/x-koan"     
86f0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8700: 20 20 7b 20 22 73 6d 69 22 2c 20 20 20 20 20 20    { "smi",      
8710: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
8720: 6e 2f 73 6d 69 6c 22 20 20 20 20 20 20 20 20 20  n/smil"         
8730: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
8740: 7b 20 22 73 6d 69 6c 22 2c 20 20 20 20 20 20 20  { "smil",       
8750: 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  4, "application/
8760: 73 6d 69 6c 22 20 20 20 20 20 20 20 20 20 20 20  smil"           
8770: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8780: 22 73 6e 64 22 2c 20 20 20 20 20 20 20 20 33 2c  "snd",        3,
8790: 20 22 61 75 64 69 6f 2f 62 61 73 69 63 22 20 20   "audio/basic"  
87a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87b0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73       },.    { "s
87c0: 6f 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ol",        3, "
87d0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 73 6f 6c 69  application/soli
87e0: 64 73 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ds"             
87f0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 70 6c     },.    { "spl
8800: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
8810: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 66 75 74 75  plication/x-futu
8820: 72 65 73 70 6c 61 73 68 22 20 20 20 20 20 20 20  resplash"       
8830: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 72 63 22 2c   },.    { "src",
8840: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
8850: 69 63 61 74 69 6f 6e 2f 78 2d 77 61 69 73 2d 73  ication/x-wais-s
8860: 6f 75 72 63 65 22 20 20 20 20 20 20 20 20 20 7d  ource"         }
8870: 2c 0a 20 20 20 20 7b 20 22 73 74 65 70 22 2c 20  ,.    { "step", 
8880: 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63        4, "applic
8890: 61 74 69 6f 6e 2f 53 54 45 50 22 20 20 20 20 20  ation/STEP"     
88a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
88b0: 20 20 20 20 7b 20 22 73 74 6c 22 2c 20 20 20 20      { "stl",    
88c0: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
88d0: 69 6f 6e 2f 53 4c 41 22 20 20 20 20 20 20 20 20  ion/SLA"        
88e0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
88f0: 20 20 7b 20 22 73 74 70 22 2c 20 20 20 20 20 20    { "stp",      
8900: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
8910: 6e 2f 53 54 45 50 22 20 20 20 20 20 20 20 20 20  n/STEP"         
8920: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
8930: 7b 20 22 73 76 34 63 70 69 6f 22 2c 20 20 20 20  { "sv4cpio",    
8940: 37 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  7, "application/
8950: 78 2d 73 76 34 63 70 69 6f 22 20 20 20 20 20 20  x-sv4cpio"      
8960: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8970: 22 73 76 34 63 72 63 22 2c 20 20 20 20 20 36 2c  "sv4crc",     6,
8980: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
8990: 73 76 34 63 72 63 22 20 20 20 20 20 20 20 20 20  sv4crc"         
89a0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73       },.    { "s
89b0: 77 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  wf",        3, "
89c0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 68  application/x-sh
89d0: 6f 63 6b 77 61 76 65 2d 66 6c 61 73 68 22 20 20  ockwave-flash"  
89e0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 22 2c     },.    { "t",
89f0: 20 20 20 20 20 20 20 20 20 20 31 2c 20 22 61 70            1, "ap
8a00: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72 6f 66  plication/x-trof
8a10: 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f"              
8a20: 20 7d 2c 0a 20 20 20 20 7b 20 22 74 61 72 22 2c   },.    { "tar",
8a30: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
8a40: 69 63 61 74 69 6f 6e 2f 78 2d 74 61 72 22 20 20  ication/x-tar"  
8a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8a60: 2c 0a 20 20 20 20 7b 20 22 74 63 6c 22 2c 20 20  ,.    { "tcl",  
8a70: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
8a80: 61 74 69 6f 6e 2f 78 2d 74 63 6c 22 20 20 20 20  ation/x-tcl"    
8a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
8aa0: 20 20 20 20 7b 20 22 74 65 78 22 2c 20 20 20 20      { "tex",    
8ab0: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
8ac0: 69 6f 6e 2f 78 2d 74 65 78 22 20 20 20 20 20 20  ion/x-tex"      
8ad0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8ae0: 20 20 7b 20 22 74 65 78 69 22 2c 20 20 20 20 20    { "texi",     
8af0: 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    4, "applicatio
8b00: 6e 2f 78 2d 74 65 78 69 6e 66 6f 22 20 20 20 20  n/x-texinfo"    
8b10: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
8b20: 7b 20 22 74 65 78 69 6e 66 6f 22 2c 20 20 20 20  { "texinfo",    
8b30: 37 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  7, "application/
8b40: 78 2d 74 65 78 69 6e 66 6f 22 20 20 20 20 20 20  x-texinfo"      
8b50: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8b60: 22 74 67 7a 22 2c 20 20 20 20 20 20 20 20 33 2c  "tgz",        3,
8b70: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
8b80: 74 61 72 2d 67 7a 22 20 20 20 20 20 20 20 20 20  tar-gz"         
8b90: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74       },.    { "t
8ba0: 69 66 66 22 2c 20 20 20 20 20 20 20 34 2c 20 22  iff",       4, "
8bb0: 69 6d 61 67 65 2f 74 69 66 66 22 20 20 20 20 20  image/tiff"     
8bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bd0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 69 66     },.    { "tif
8be0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d  ",        3, "im
8bf0: 61 67 65 2f 74 69 66 66 22 20 20 20 20 20 20 20  age/tiff"       
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c10: 20 7d 2c 0a 20 20 20 20 7b 20 22 74 72 22 2c 20   },.    { "tr", 
8c20: 20 20 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c          2, "appl
8c30: 69 63 61 74 69 6f 6e 2f 78 2d 74 72 6f 66 66 22  ication/x-troff"
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8c50: 2c 0a 20 20 20 20 7b 20 22 74 73 69 22 2c 20 20  ,.    { "tsi",  
8c60: 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f        3, "audio/
8c70: 54 53 50 2d 61 75 64 69 6f 22 20 20 20 20 20 20  TSP-audio"      
8c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
8c90: 20 20 20 20 7b 20 22 74 73 70 22 2c 20 20 20 20      { "tsp",    
8ca0: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
8cb0: 69 6f 6e 2f 64 73 70 74 79 70 65 22 20 20 20 20  ion/dsptype"    
8cc0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8cd0: 20 20 7b 20 22 74 73 76 22 2c 20 20 20 20 20 20    { "tsv",      
8ce0: 20 20 33 2c 20 22 74 65 78 74 2f 74 61 62 2d 73    3, "text/tab-s
8cf0: 65 70 61 72 61 74 65 64 2d 76 61 6c 75 65 73 22  eparated-values"
8d00: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
8d10: 7b 20 22 74 78 74 22 2c 20 20 20 20 20 20 20 20  { "txt",        
8d20: 33 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20  3, "text/plain" 
8d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d40: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8d50: 22 75 6e 76 22 2c 20 20 20 20 20 20 20 20 33 2c  "unv",        3,
8d60: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 69 2d   "application/i-
8d70: 64 65 61 73 22 20 20 20 20 20 20 20 20 20 20 20  deas"           
8d80: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 75       },.    { "u
8d90: 73 74 61 72 22 2c 20 20 20 20 20 20 35 2c 20 22  star",      5, "
8da0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 75 73  application/x-us
8db0: 74 61 72 22 20 20 20 20 20 20 20 20 20 20 20 20  tar"            
8dc0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 76 63 64     },.    { "vcd
8dd0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
8de0: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 63 64 6c 69  plication/x-cdli
8df0: 6e 6b 22 20 20 20 20 20 20 20 20 20 20 20 20 20  nk"             
8e00: 20 7d 2c 0a 20 20 20 20 7b 20 22 76 64 61 22 2c   },.    { "vda",
8e10: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
8e20: 69 63 61 74 69 6f 6e 2f 76 64 61 22 20 20 20 20  ication/vda"    
8e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8e40: 2c 0a 20 20 20 20 7b 20 22 76 69 76 22 2c 20 20  ,.    { "viv",  
8e50: 20 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f        3, "video/
8e60: 76 6e 64 2e 76 69 76 6f 22 20 20 20 20 20 20 20  vnd.vivo"       
8e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
8e80: 20 20 20 20 7b 20 22 76 69 76 6f 22 2c 20 20 20      { "vivo",   
8e90: 20 20 20 20 34 2c 20 22 76 69 64 65 6f 2f 76 6e      4, "video/vn
8ea0: 64 2e 76 69 76 6f 22 20 20 20 20 20 20 20 20 20  d.vivo"         
8eb0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8ec0: 20 20 7b 20 22 76 72 6d 6c 22 2c 20 20 20 20 20    { "vrml",     
8ed0: 20 20 34 2c 20 22 6d 6f 64 65 6c 2f 76 72 6d 6c    4, "model/vrml
8ee0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8ef0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
8f00: 7b 20 22 76 73 69 78 22 2c 20 20 20 20 20 20 20  { "vsix",       
8f10: 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  4, "application/
8f20: 76 73 69 78 22 20 20 20 20 20 20 20 20 20 20 20  vsix"           
8f30: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8f40: 22 77 61 76 22 2c 20 20 20 20 20 20 20 20 33 2c  "wav",        3,
8f50: 20 22 61 75 64 69 6f 2f 78 2d 77 61 76 22 20 20   "audio/x-wav"  
8f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f70: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77       },.    { "w
8f80: 61 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ax",        3, "
8f90: 61 75 64 69 6f 2f 78 2d 6d 73 2d 77 61 78 22 20  audio/x-ms-wax" 
8fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fb0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 69 6b     },.    { "wik
8fc0: 69 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70  i",       4, "ap
8fd0: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 66 6f 73 73  plication/x-foss
8fe0: 69 6c 2d 77 69 6b 69 22 20 20 20 20 20 20 20 20  il-wiki"        
8ff0: 20 7d 2c 0a 20 20 20 20 7b 20 22 77 6d 61 22 2c   },.    { "wma",
9000: 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69          3, "audi
9010: 6f 2f 78 2d 6d 73 2d 77 6d 61 22 20 20 20 20 20  o/x-ms-wma"     
9020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
9030: 2c 0a 20 20 20 20 7b 20 22 77 6d 76 22 2c 20 20  ,.    { "wmv",  
9040: 20 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f        3, "video/
9050: 78 2d 6d 73 2d 77 6d 76 22 20 20 20 20 20 20 20  x-ms-wmv"       
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
9070: 20 20 20 20 7b 20 22 77 6d 78 22 2c 20 20 20 20      { "wmx",    
9080: 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d      3, "video/x-
9090: 6d 73 2d 77 6d 78 22 20 20 20 20 20 20 20 20 20  ms-wmx"         
90a0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
90b0: 20 20 7b 20 22 77 72 6c 22 2c 20 20 20 20 20 20    { "wrl",      
90c0: 20 20 33 2c 20 22 6d 6f 64 65 6c 2f 76 72 6d 6c    3, "model/vrml
90d0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
90e0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
90f0: 7b 20 22 77 76 78 22 2c 20 20 20 20 20 20 20 20  { "wvx",        
9100: 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 77  3, "video/x-ms-w
9110: 76 78 22 20 20 20 20 20 20 20 20 20 20 20 20 20  vx"             
9120: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
9130: 22 78 62 6d 22 2c 20 20 20 20 20 20 20 20 33 2c  "xbm",        3,
9140: 20 22 69 6d 61 67 65 2f 78 2d 78 62 69 74 6d 61   "image/x-xbitma
9150: 70 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p"              
9160: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78       },.    { "x
9170: 6c 63 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  lc",        3, "
9180: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76 6e 64 2e  application/vnd.
9190: 6d 73 2d 65 78 63 65 6c 22 20 20 20 20 20 20 20  ms-excel"       
91a0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 6c 6c     },.    { "xll
91b0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
91c0: 70 6c 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73  plication/vnd.ms
91d0: 2d 65 78 63 65 6c 22 20 20 20 20 20 20 20 20 20  -excel"         
91e0: 20 7d 2c 0a 20 20 20 20 7b 20 22 78 6c 6d 22 2c   },.    { "xlm",
91f0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
9200: 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65  ication/vnd.ms-e
9210: 78 63 65 6c 22 20 20 20 20 20 20 20 20 20 20 7d  xcel"          }
9220: 2c 0a 20 20 20 20 7b 20 22 78 6c 73 22 2c 20 20  ,.    { "xls",  
9230: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
9240: 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63  ation/vnd.ms-exc
9250: 65 6c 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  el"          },.
9260: 20 20 20 20 7b 20 22 78 6c 77 22 2c 20 20 20 20      { "xlw",    
9270: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
9280: 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c  ion/vnd.ms-excel
9290: 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  "          },.  
92a0: 20 20 7b 20 22 78 6d 6c 22 2c 20 20 20 20 20 20    { "xml",      
92b0: 20 20 33 2c 20 22 74 65 78 74 2f 78 6d 6c 22 20    3, "text/xml" 
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92d0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
92e0: 7b 20 22 78 70 6d 22 2c 20 20 20 20 20 20 20 20  { "xpm",        
92f0: 33 2c 20 22 69 6d 61 67 65 2f 78 2d 78 70 69 78  3, "image/x-xpix
9300: 6d 61 70 22 20 20 20 20 20 20 20 20 20 20 20 20  map"            
9310: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
9320: 22 78 77 64 22 2c 20 20 20 20 20 20 20 20 33 2c  "xwd",        3,
9330: 20 22 69 6d 61 67 65 2f 78 2d 78 77 69 6e 64 6f   "image/x-xwindo
9340: 77 64 75 6d 70 22 20 20 20 20 20 20 20 20 20 20  wdump"          
9350: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78       },.    { "x
9360: 79 7a 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  yz",        3, "
9370: 63 68 65 6d 69 63 61 6c 2f 78 2d 70 64 62 22 20  chemical/x-pdb" 
9380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9390: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 7a 69 70     },.    { "zip
93a0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
93b0: 70 6c 69 63 61 74 69 6f 6e 2f 7a 69 70 22 20 20  plication/zip"  
93c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93d0: 20 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 66 6f 72 28   },.  };..  for(
93e0: 69 3d 6e 4e 61 6d 65 2d 31 3b 20 69 3e 30 20 26  i=nName-1; i>0 &
93f0: 26 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 2e 27 3b  & zName[i]!='.';
9400: 20 69 2d 2d 29 7b 7d 0a 20 20 7a 20 3d 20 26 7a   i--){}.  z = &z
9410: 4e 61 6d 65 5b 69 2b 31 5d 3b 0a 20 20 6c 65 6e  Name[i+1];.  len
9420: 20 3d 20 6e 4e 61 6d 65 20 2d 20 69 3b 0a 20 20   = nName - i;.  
9430: 69 66 28 20 6c 65 6e 3c 28 69 6e 74 29 73 69 7a  if( len<(int)siz
9440: 65 6f 66 28 7a 53 75 66 66 69 78 29 2d 31 20 29  eof(zSuffix)-1 )
9450: 7b 0a 20 20 20 20 73 74 72 63 70 79 28 7a 53 75  {.    strcpy(zSu
9460: 66 66 69 78 2c 20 7a 29 3b 0a 20 20 20 20 66 6f  ffix, z);.    fo
9470: 72 28 69 3d 30 3b 20 7a 53 75 66 66 69 78 5b 69  r(i=0; zSuffix[i
9480: 5d 3b 20 69 2b 2b 29 20 7a 53 75 66 66 69 78 5b  ]; i++) zSuffix[
9490: 69 5d 20 3d 20 74 6f 6c 6f 77 65 72 28 7a 53 75  i] = tolower(zSu
94a0: 66 66 69 78 5b 69 5d 29 3b 0a 20 20 20 20 66 69  ffix[i]);.    fi
94b0: 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 6c 61 73  rst = 0;.    las
94c0: 74 20 3d 20 73 69 7a 65 6f 66 28 61 4d 69 6d 65  t = sizeof(aMime
94d0: 29 2f 73 69 7a 65 6f 66 28 61 4d 69 6d 65 5b 30  )/sizeof(aMime[0
94e0: 5d 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 66  ]);.    while( f
94f0: 69 72 73 74 3c 3d 6c 61 73 74 20 29 7b 0a 20 20  irst<=last ){.  
9500: 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20      int c;.     
9510: 20 69 20 3d 20 28 66 69 72 73 74 2b 6c 61 73 74   i = (first+last
9520: 29 2f 32 3b 0a 20 20 20 20 20 20 63 20 3d 20 73  )/2;.      c = s
9530: 74 72 63 6d 70 28 7a 53 75 66 66 69 78 2c 20 61  trcmp(zSuffix, a
9540: 4d 69 6d 65 5b 69 5d 2e 7a 53 75 66 66 69 78 29  Mime[i].zSuffix)
9550: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30  ;.      if( c==0
9560: 20 29 20 72 65 74 75 72 6e 20 61 4d 69 6d 65 5b   ) return aMime[
9570: 69 5d 2e 7a 4d 69 6d 65 74 79 70 65 3b 0a 20 20  i].zMimetype;.  
9580: 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20      if( c<0 ){. 
9590: 20 20 20 20 20 20 20 6c 61 73 74 20 3d 20 69 2d         last = i-
95a0: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
95b0: 20 20 20 20 20 20 20 20 66 69 72 73 74 20 3d 20          first = 
95c0: 69 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i+1;.      }.   
95d0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
95e0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74  "application/oct
95f0: 65 74 2d 73 74 72 65 61 6d 22 3b 0a 7d 0a 0a 2f  et-stream";.}../
9600: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
9610: 6e 67 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  ng table contain
9620: 73 20 31 20 66 6f 72 20 61 6c 6c 20 63 68 61 72  s 1 for all char
9630: 61 63 74 65 72 73 20 74 68 61 74 20 61 72 65 20  acters that are 
9640: 70 65 72 6d 69 74 74 65 64 20 69 6e 0a 2a 2a 20  permitted in.** 
9650: 74 68 65 20 70 61 72 74 20 6f 66 20 74 68 65 20  the part of the 
9660: 55 52 4c 20 62 65 66 6f 72 65 20 74 68 65 20 71  URL before the q
9670: 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20  uery parameters 
9680: 61 6e 64 20 66 72 61 67 6d 65 6e 74 2e 0a 2a 2a  and fragment..**
9690: 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 63 68 61 72  .** Allowed char
96a0: 61 63 74 65 72 73 3a 20 20 30 2d 39 61 2d 7a 41  acters:  0-9a-zA
96b0: 2d 5a 2c 2d 2e 2f 3a 5f 7e 0a 2a 2a 0a 2a 2a 20  -Z,-./:_~.**.** 
96c0: 44 69 73 61 6c 6c 6f 77 65 64 20 63 68 61 72 61  Disallowed chara
96d0: 63 74 65 72 73 20 69 6e 63 6c 75 64 65 3a 20 20  cters include:  
96e0: 21 22 23 24 25 26 27 28 29 2a 2b 3b 3c 3d 3e 3f  !"#$%&'()*+;<=>?
96f0: 5b 5c 5d 5e 7b 7c 7d 0a 2a 2f 0a 73 74 61 74 69  [\]^{|}.*/.stati
9700: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 61 6c 6c  c const char all
9710: 6f 77 65 64 49 6e 4e 61 6d 65 5b 5d 20 3d 20 7b  owedInName[] = {
9720: 0a 20 20 20 20 20 20 2f 2a 20 20 78 30 20 20 78  .      /*  x0  x
9730: 31 20 20 78 32 20 20 78 33 20 20 78 34 20 20 78  1  x2  x3  x4  x
9740: 35 20 20 78 36 20 20 78 37 20 20 78 38 20 20 78  5  x6  x7  x8  x
9750: 39 20 20 78 61 20 20 78 62 20 20 78 63 20 20 78  9  xa  xb  xc  x
9760: 64 20 20 78 65 20 20 78 66 20 2a 2f 0a 2f 2a 20  d  xe  xf */./* 
9770: 30 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20  0x */   0,  0,  
9780: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
9790: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
97a0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
97b0: 30 2c 20 20 30 2c 0a 2f 2a 20 31 78 20 2a 2f 20  0,  0,./* 1x */ 
97c0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
97d0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
97e0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
97f0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
9800: 0a 2f 2a 20 32 78 20 2a 2f 20 20 20 30 2c 20 20  ./* 2x */   0,  
9810: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
9820: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
9830: 30 2c 20 20 30 2c 20 20 30 2c 20 20 31 2c 20 20  0,  0,  0,  1,  
9840: 31 2c 20 20 31 2c 20 20 31 2c 0a 2f 2a 20 33 78  1,  1,  1,./* 3x
9850: 20 2a 2f 20 20 20 31 2c 20 20 31 2c 20 20 31 2c   */   1,  1,  1,
9860: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
9870: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
9880: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
9890: 20 20 30 2c 0a 2f 2a 20 34 78 20 2a 2f 20 20 20    0,./* 4x */   
98a0: 30 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  0,  1,  1,  1,  
98b0: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
98c0: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
98d0: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 0a 2f  1,  1,  1,  1,./
98e0: 2a 20 35 78 20 2a 2f 20 20 20 31 2c 20 20 31 2c  * 5x */   1,  1,
98f0: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
9900: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
9910: 20 20 31 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    1,  0,  0,  0,
9920: 20 20 30 2c 20 20 31 2c 0a 2f 2a 20 36 78 20 2a    0,  1,./* 6x *
9930: 2f 20 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20  /   0,  1,  1,  
9940: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
9950: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
9960: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
9970: 31 2c 0a 2f 2a 20 37 78 20 2a 2f 20 20 20 31 2c  1,./* 7x */   1,
9980: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
9990: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
99a0: 20 20 31 2c 20 20 31 2c 20 20 30 2c 20 20 30 2c    1,  1,  0,  0,
99b0: 20 20 30 2c 20 20 31 2c 20 20 30 2c 0a 2f 2a 20    0,  1,  0,./* 
99c0: 38 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20  8x */   0,  0,  
99d0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
99e0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
99f0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
9a00: 30 2c 20 20 30 2c 0a 2f 2a 20 39 78 20 2a 2f 20  0,  0,./* 9x */ 
9a10: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
9a20: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
9a30: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
9a40: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
9a50: 0a 2f 2a 20 41 78 20 2a 2f 20 20 20 30 2c 20 20  ./* Ax */   0,  
9a60: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
9a70: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
9a80: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
9a90: 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 42 78  0,  0,  0,./* Bx
9aa0: 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c   */   0,  0,  0,
9ab0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
9ac0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
9ad0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
9ae0: 20 20 30 2c 0a 2f 2a 20 43 78 20 2a 2f 20 20 20    0,./* Cx */   
9af0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
9b00: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
9b10: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
9b20: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f  0,  0,  0,  0,./
9b30: 2a 20 44 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c  * Dx */   0,  0,
9b40: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
9b50: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
9b60: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
9b70: 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 45 78 20 2a    0,  0,./* Ex *
9b80: 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  /   0,  0,  0,  
9b90: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
9ba0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
9bb0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
9bc0: 30 2c 0a 2f 2a 20 46 78 20 2a 2f 20 20 20 30 2c  0,./* Fx */   0,
9bd0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
9be0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
9bf0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
9c00: 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 7d 3b 0a    0,  0,  0,.};.
9c10: 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c  ./*.** Remove al
9c20: 6c 20 64 69 73 61 6c 6c 6f 77 65 64 20 63 68 61  l disallowed cha
9c30: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 69  racters in the i
9c40: 6e 70 75 74 20 73 74 72 69 6e 67 20 7a 5b 5d 2e  nput string z[].
9c50: 20 20 43 6f 6e 76 65 72 74 20 61 6e 79 0a 2a 2a    Convert any.**
9c60: 20 64 69 73 61 6c 6c 6f 77 65 64 20 63 68 61 72   disallowed char
9c70: 61 63 74 65 72 73 20 69 6e 74 6f 20 22 5f 22 2e  acters into "_".
9c80: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 74 68 61 74 20  .**.** Not that 
9c90: 74 68 65 20 74 68 72 65 65 20 63 68 61 72 61 63  the three charac
9ca0: 74 65 72 20 73 65 71 75 65 6e 63 65 20 22 25 58  ter sequence "%X
9cb0: 58 22 20 77 68 65 72 65 20 58 20 69 73 20 61 6e  X" where X is an
9cc0: 79 20 62 79 74 65 20 69 73 0a 2a 2a 20 63 6f 6e  y byte is.** con
9cd0: 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 73 69  verted into a si
9ce0: 6e 67 6c 65 20 22 5f 22 20 63 68 61 72 61 63 74  ngle "_" charact
9cf0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
9d00: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
9d10: 68 61 72 61 63 74 65 72 73 20 63 6f 6e 76 65 72  haracters conver
9d20: 74 65 64 2e 20 20 41 6e 20 22 25 58 58 22 20 2d  ted.  An "%XX" -
9d30: 3e 20 22 5f 22 20 63 6f 6e 76 65 72 73 69 6f 6e  > "_" conversion
9d40: 0a 2a 2a 20 63 6f 75 6e 74 73 20 61 73 20 61 20  .** counts as a 
9d50: 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72  single character
9d60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9d70: 73 61 6e 69 74 69 7a 65 53 74 72 69 6e 67 28 63  sanitizeString(c
9d80: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e  har *z){.  int n
9d90: 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 77 68  Change = 0;.  wh
9da0: 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 69  ile( *z ){.    i
9db0: 66 28 20 21 61 6c 6c 6f 77 65 64 49 6e 4e 61 6d  f( !allowedInNam
9dc0: 65 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e[*(unsigned cha
9dd0: 72 2a 29 7a 5d 20 29 7b 0a 20 20 20 20 20 20 69  r*)z] ){.      i
9de0: 66 28 20 2a 7a 3d 3d 27 25 27 20 26 26 20 7a 5b  f( *z=='%' && z[
9df0: 31 5d 21 3d 30 20 26 26 20 7a 5b 32 5d 21 3d 30  1]!=0 && z[2]!=0
9e00: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
9e10: 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  i;.        for(i
9e20: 3d 33 3b 20 28 7a 5b 69 2d 32 5d 20 3d 20 7a 5b  =3; (z[i-2] = z[
9e30: 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20  i])!=0; i++){}. 
9e40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 7a 20       }.      *z 
9e50: 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 6e 43 68  = '_';.      nCh
9e60: 61 6e 67 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  ange++;.    }.  
9e70: 20 20 7a 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74    z++;.  }.  ret
9e80: 75 72 6e 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a  urn nChange;.}..
9e90: 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
9ea0: 6e 75 6d 62 65 72 20 6f 66 20 22 2f 22 20 63 68  number of "/" ch
9eb0: 61 72 61 63 74 65 72 73 20 69 6e 20 61 20 73 74  aracters in a st
9ec0: 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
9ed0: 69 6e 74 20 63 6f 75 6e 74 53 6c 61 73 68 65 73  int countSlashes
9ee0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
9ef0: 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
9f00: 77 68 69 6c 65 28 20 2a 7a 20 29 20 69 66 28 20  while( *z ) if( 
9f10: 2a 28 7a 2b 2b 29 3d 3d 27 2f 27 20 29 20 6e 2b  *(z++)=='/' ) n+
9f20: 2b 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  +;.  return n;.}
9f30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
9f40: 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 61  tine processes a
9f50: 20 73 69 6e 67 6c 65 20 48 54 54 50 20 72 65 71   single HTTP req
9f60: 75 65 73 74 20 6f 6e 20 73 74 61 6e 64 61 72 64  uest on standard
9f70: 20 69 6e 70 75 74 20 61 6e 64 0a 2a 2a 20 73 65   input and.** se
9f80: 6e 64 73 20 74 68 65 20 72 65 70 6c 79 20 74 6f  nds the reply to
9f90: 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74   standard output
9fa0: 2e 20 20 49 66 20 74 68 65 20 61 72 67 75 6d 65  .  If the argume
9fb0: 6e 74 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73  nt is 1 it means
9fc0: 0a 2a 2a 20 74 68 61 74 20 77 65 20 61 72 65 20  .** that we are 
9fd0: 73 68 6f 75 6c 64 20 63 6c 6f 73 65 20 74 68 65  should close the
9fe0: 20 73 6f 63 6b 65 74 20 77 69 74 68 6f 75 74 20   socket without 
9ff0: 70 72 6f 63 65 73 73 69 6e 67 20 61 64 64 69 74  processing addit
a000: 69 6f 6e 61 6c 0a 2a 2a 20 48 54 54 50 20 72 65  ional.** HTTP re
a010: 71 75 65 73 74 73 20 61 66 74 65 72 20 74 68 65  quests after the
a020: 20 63 75 72 72 65 6e 74 20 72 65 71 75 65 73 74   current request
a030: 20 66 69 6e 69 73 68 65 73 2e 20 20 30 20 6d 65   finishes.  0 me
a040: 61 6e 73 20 77 65 20 61 72 65 0a 2a 2a 20 61 6c  ans we are.** al
a050: 6c 6f 77 65 64 20 74 6f 20 6b 65 65 70 20 74 68  lowed to keep th
a060: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65  e connection ope
a070: 6e 20 61 6e 64 20 74 6f 20 70 72 6f 63 65 73 73  n and to process
a080: 20 61 64 64 69 74 69 6f 6e 61 6c 20 72 65 71 75   additional requ
a090: 65 73 74 73 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  ests..** This ro
a0a0: 75 74 69 6e 65 20 6d 61 79 20 63 68 6f 6f 73 65  utine may choose
a0b0: 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 63 6f   to close the co
a0c0: 6e 6e 65 63 74 69 6f 6e 20 65 76 65 6e 20 69 66  nnection even if
a0d0: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2a   the argument.**
a0e0: 20 69 73 20 30 2e 0a 2a 2a 20 0a 2a 2a 20 49 66   is 0..** .** If
a0f0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
a100: 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64  should be closed
a110: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
a120: 61 6c 6c 73 20 65 78 69 74 28 29 20 61 6e 64 0a  alls exit() and.
a130: 2a 2a 20 74 68 75 73 20 6e 65 76 65 72 20 72 65  ** thus never re
a140: 74 75 72 6e 73 2e 20 20 49 66 20 74 68 69 73 20  turns.  If this 
a150: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 72 65 74  routine does ret
a160: 75 72 6e 20 69 74 20 6d 65 61 6e 73 20 74 68 61  urn it means tha
a170: 74 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 48 54 54  t another.** HTT
a180: 50 20 72 65 71 75 65 73 74 20 6d 61 79 20 61 70  P request may ap
a190: 70 65 61 72 20 6f 6e 20 74 68 65 20 77 69 72 65  pear on the wire
a1a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 50 72 6f 63 65 73  ..*/.void Proces
a1b0: 73 4f 6e 65 52 65 71 75 65 73 74 28 69 6e 74 20  sOneRequest(int 
a1c0: 66 6f 72 63 65 43 6c 6f 73 65 29 7b 0a 20 20 69  forceClose){.  i
a1d0: 6e 74 20 69 2c 20 63 3b 0a 20 20 63 68 61 72 20  nt i, c;.  char 
a1e0: 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *z;             
a1f0: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
a200: 70 61 72 73 65 20 75 70 20 61 20 73 74 72 69 6e  parse up a strin
a210: 67 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74  g */.  struct st
a220: 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20  at statbuf;     
a230: 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
a240: 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 74  about the file t
a250: 6f 20 62 65 20 72 65 74 72 69 65 76 65 64 20 2a  o be retrieved *
a260: 2f 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20  /.  FILE *in;   
a270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a280: 20 46 6f 72 20 72 65 61 64 69 6e 67 20 66 72 6f   For reading fro
a290: 6d 20 43 47 49 20 73 63 72 69 70 74 73 20 2a 2f  m CGI scripts */
a2a0: 0a 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b 31 30  .  char zLine[10
a2b0: 30 30 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  00];         /* 
a2c0: 41 20 62 75 66 66 65 72 20 66 6f 72 20 69 6e 70  A buffer for inp
a2d0: 75 74 20 6c 69 6e 65 73 20 6f 72 20 66 6f 72 6d  ut lines or form
a2e0: 69 6e 67 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20  ing names */..  
a2f0: 2f 2a 20 43 68 61 6e 67 65 20 64 69 72 65 63 74  /* Change direct
a300: 6f 72 69 65 73 20 74 6f 20 74 68 65 20 72 6f 6f  ories to the roo
a310: 74 20 6f 66 20 74 68 65 20 48 54 54 50 20 66 69  t of the HTTP fi
a320: 6c 65 73 79 73 74 65 6d 0a 20 20 2a 2f 0a 20 20  lesystem.  */.  
a330: 69 66 28 20 63 68 64 69 72 28 7a 52 6f 6f 74 5b  if( chdir(zRoot[
a340: 30 5d 20 3f 20 7a 52 6f 6f 74 20 3a 20 22 2f 22  0] ? zRoot : "/"
a350: 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  )!=0 ){.    char
a360: 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20 20   zBuf[1000];.   
a370: 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c   Malfunction(__L
a380: 49 4e 45 5f 5f 2c 20 20 20 2f 2a 20 4c 4f 47 3a  INE__,   /* LOG:
a390: 20 63 68 64 69 72 28 29 20 66 61 69 6c 65 64 20   chdir() failed 
a3a0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 22 63 61 6e  */.         "can
a3b0: 6e 6f 74 20 63 68 64 69 72 20 74 6f 20 5b 25 73  not chdir to [%s
a3c0: 5d 20 66 72 6f 6d 20 5b 25 73 5d 22 2c 0a 20 20  ] from [%s]",.  
a3d0: 20 20 20 20 20 20 20 7a 52 6f 6f 74 2c 20 67 65         zRoot, ge
a3e0: 74 63 77 64 28 7a 42 75 66 2c 39 39 39 29 29 3b  tcwd(zBuf,999));
a3f0: 0a 20 20 7d 0a 20 20 6e 52 65 71 75 65 73 74 2b  .  }.  nRequest+
a400: 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65  +;..  /*.  ** We
a410: 20 6d 75 73 74 20 72 65 63 65 69 76 65 20 61 20   must receive a 
a420: 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 20  complete header 
a430: 77 69 74 68 69 6e 20 31 35 20 73 65 63 6f 6e 64  within 15 second
a440: 73 0a 20 20 2a 2f 0a 20 20 73 69 67 6e 61 6c 28  s.  */.  signal(
a450: 53 49 47 41 4c 52 4d 2c 20 54 69 6d 65 6f 75 74  SIGALRM, Timeout
a460: 29 3b 0a 20 20 73 69 67 6e 61 6c 28 53 49 47 53  );.  signal(SIGS
a470: 45 47 56 2c 20 54 69 6d 65 6f 75 74 29 3b 0a 20  EGV, Timeout);. 
a480: 20 73 69 67 6e 61 6c 28 53 49 47 50 49 50 45 2c   signal(SIGPIPE,
a490: 20 54 69 6d 65 6f 75 74 29 3b 0a 20 20 69 66 28   Timeout);.  if(
a4a0: 20 75 73 65 54 69 6d 65 6f 75 74 20 29 20 61 6c   useTimeout ) al
a4b0: 61 72 6d 28 31 35 29 3b 0a 0a 20 20 2f 2a 20 47  arm(15);..  /* G
a4c0: 65 74 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e  et the first lin
a4d0: 65 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74  e of the request
a4e0: 20 61 6e 64 20 70 61 72 73 65 20 6f 75 74 20 74   and parse out t
a4f0: 68 65 0a 20 20 2a 2a 20 6d 65 74 68 6f 64 2c 20  he.  ** method, 
a500: 74 68 65 20 73 63 72 69 70 74 20 61 6e 64 20 74  the script and t
a510: 68 65 20 70 72 6f 74 6f 63 6f 6c 2e 0a 20 20 2a  he protocol..  *
a520: 2f 0a 20 20 69 66 28 20 66 67 65 74 73 28 7a 4c  /.  if( fgets(zL
a530: 69 6e 65 2c 73 69 7a 65 6f 66 28 7a 4c 69 6e 65  ine,sizeof(zLine
a540: 29 2c 73 74 64 69 6e 29 3d 3d 30 20 29 7b 0a 20  ),stdin)==0 ){. 
a550: 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20 7d 0a     exit(0);.  }.
a560: 20 20 6f 6d 69 74 4c 6f 67 20 3d 20 30 3b 0a 20    omitLog = 0;. 
a570: 20 6e 49 6e 20 2b 3d 20 73 74 72 6c 65 6e 28 7a   nIn += strlen(z
a580: 4c 69 6e 65 29 3b 0a 20 20 7a 4d 65 74 68 6f 64  Line);.  zMethod
a590: 20 3d 20 53 74 72 44 75 70 28 47 65 74 46 69 72   = StrDup(GetFir
a5a0: 73 74 45 6c 65 6d 65 6e 74 28 7a 4c 69 6e 65 2c  stElement(zLine,
a5b0: 26 7a 29 29 3b 0a 20 20 7a 52 65 61 6c 53 63 72  &z));.  zRealScr
a5c0: 69 70 74 20 3d 20 7a 53 63 72 69 70 74 20 3d 20  ipt = zScript = 
a5d0: 53 74 72 44 75 70 28 47 65 74 46 69 72 73 74 45  StrDup(GetFirstE
a5e0: 6c 65 6d 65 6e 74 28 7a 2c 26 7a 29 29 3b 0a 20  lement(z,&z));. 
a5f0: 20 7a 50 72 6f 74 6f 63 6f 6c 20 3d 20 53 74 72   zProtocol = Str
a600: 44 75 70 28 47 65 74 46 69 72 73 74 45 6c 65 6d  Dup(GetFirstElem
a610: 65 6e 74 28 7a 2c 26 7a 29 29 3b 0a 20 20 69 66  ent(z,&z));.  if
a620: 28 20 7a 50 72 6f 74 6f 63 6f 6c 3d 3d 30 20 7c  ( zProtocol==0 |
a630: 7c 20 73 74 72 6e 63 6d 70 28 7a 50 72 6f 74 6f  | strncmp(zProto
a640: 63 6f 6c 2c 22 48 54 54 50 2f 22 2c 35 29 21 3d  col,"HTTP/",5)!=
a650: 30 20 7c 7c 20 73 74 72 6c 65 6e 28 7a 50 72 6f  0 || strlen(zPro
a660: 74 6f 63 6f 6c 29 21 3d 38 20 29 7b 0a 20 20 20  tocol)!=8 ){.   
a670: 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22   StartResponse("
a680: 34 30 30 20 42 61 64 20 52 65 71 75 65 73 74 22  400 Bad Request"
a690: 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70  );.    nOut += p
a6a0: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22 43 6f  rintf(.      "Co
a6b0: 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74  ntent-type: text
a6c0: 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20 20  /plain\r\n".    
a6d0: 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 20 20 22    "\r\n".      "
a6e0: 54 68 69 73 20 73 65 72 76 65 72 20 64 6f 65 73  This server does
a6f0: 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20   not understand 
a700: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 72  the requested pr
a710: 6f 74 6f 63 6f 6c 5c 6e 22 0a 20 20 20 20 29 3b  otocol\n".    );
a720: 0a 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72  .    MakeLogEntr
a730: 79 28 30 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20  y(0, __LINE__); 
a740: 2f 2a 20 4c 4f 47 3a 20 62 61 64 20 70 72 6f 74  /* LOG: bad prot
a750: 6f 63 6f 6c 20 69 6e 20 48 54 54 50 20 68 65 61  ocol in HTTP hea
a760: 64 65 72 20 2a 2f 0a 20 20 20 20 65 78 69 74 28  der */.    exit(
a770: 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 53  0);.  }.  if( zS
a780: 63 72 69 70 74 5b 30 5d 3d 3d 30 20 29 20 4e 6f  cript[0]==0 ) No
a790: 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29  tFound(__LINE__)
a7a0: 3b 20 2f 2a 20 4c 4f 47 3a 20 45 6d 70 74 79 20  ; /* LOG: Empty 
a7b0: 72 65 71 75 65 73 74 20 55 52 49 20 2a 2f 0a 20  request URI */. 
a7c0: 20 69 66 28 20 66 6f 72 63 65 43 6c 6f 73 65 20   if( forceClose 
a7d0: 29 7b 0a 20 20 20 20 63 6c 6f 73 65 43 6f 6e 6e  ){.    closeConn
a7e0: 65 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d 65  ection = 1;.  }e
a7f0: 6c 73 65 20 69 66 28 20 7a 50 72 6f 74 6f 63 6f  lse if( zProtoco
a800: 6c 5b 35 5d 3c 27 31 27 20 7c 7c 20 7a 50 72 6f  l[5]<'1' || zPro
a810: 74 6f 63 6f 6c 5b 37 5d 3c 27 31 27 20 29 7b 0a  tocol[7]<'1' ){.
a820: 20 20 20 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74      closeConnect
a830: 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  ion = 1;.  }..  
a840: 2f 2a 20 54 68 69 73 20 76 65 72 79 20 73 69 6d  /* This very sim
a850: 70 6c 65 20 73 65 72 76 65 72 20 6f 6e 6c 79 20  ple server only 
a860: 75 6e 64 65 72 73 74 61 6e 64 73 20 74 68 65 20  understands the 
a870: 47 45 54 2c 20 50 4f 53 54 0a 20 20 2a 2a 20 61  GET, POST.  ** a
a880: 6e 64 20 48 45 41 44 20 6d 65 74 68 6f 64 73 0a  nd HEAD methods.
a890: 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 72 63 6d    */.  if( strcm
a8a0: 70 28 7a 4d 65 74 68 6f 64 2c 22 47 45 54 22 29  p(zMethod,"GET")
a8b0: 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d  !=0 && strcmp(zM
a8c0: 65 74 68 6f 64 2c 22 50 4f 53 54 22 29 21 3d 30  ethod,"POST")!=0
a8d0: 0a 20 20 20 20 20 20 20 26 26 20 73 74 72 63 6d  .       && strcm
a8e0: 70 28 7a 4d 65 74 68 6f 64 2c 22 48 45 41 44 22  p(zMethod,"HEAD"
a8f0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 53 74 61 72  )!=0 ){.    Star
a900: 74 52 65 73 70 6f 6e 73 65 28 22 35 30 31 20 4e  tResponse("501 N
a910: 6f 74 20 49 6d 70 6c 65 6d 65 6e 74 65 64 22 29  ot Implemented")
a920: 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72  ;.    nOut += pr
a930: 69 6e 74 66 28 0a 20 20 20 20 20 20 22 43 6f 6e  intf(.      "Con
a940: 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f  tent-type: text/
a950: 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 20  plain\r\n".     
a960: 20 22 5c 72 5c 6e 22 0a 20 20 20 20 20 20 22 54   "\r\n".      "T
a970: 68 65 20 25 73 20 6d 65 74 68 6f 64 20 69 73 20  he %s method is 
a980: 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  not implemented 
a990: 6f 6e 20 74 68 69 73 20 73 65 72 76 65 72 2e 5c  on this server.\
a9a0: 6e 22 2c 0a 20 20 20 20 20 20 7a 4d 65 74 68 6f  n",.      zMetho
a9b0: 64 29 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f 67 45  d);.    MakeLogE
a9c0: 6e 74 72 79 28 30 2c 20 5f 5f 4c 49 4e 45 5f 5f  ntry(0, __LINE__
a9d0: 29 3b 20 2f 2a 20 4c 4f 47 3a 20 55 6e 6b 6e 6f  ); /* LOG: Unkno
a9e0: 77 6e 20 72 65 71 75 65 73 74 20 6d 65 74 68 6f  wn request metho
a9f0: 64 20 2a 2f 0a 20 20 20 20 65 78 69 74 28 30 29  d */.    exit(0)
aa00: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20  ;.  }..  /* Get 
aa10: 61 6c 6c 20 74 68 65 20 6f 70 74 69 6f 6e 61 6c  all the optional
aa20: 20 66 69 65 6c 64 73 20 74 68 61 74 20 66 6f 6c   fields that fol
aa30: 6c 6f 77 20 74 68 65 20 66 69 72 73 74 20 6c 69  low the first li
aa40: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 7a 43 6f 6f 6b  ne..  */.  zCook
aa50: 69 65 20 3d 20 30 3b 0a 20 20 7a 41 75 74 68 54  ie = 0;.  zAuthT
aa60: 79 70 65 20 3d 20 30 3b 0a 20 20 7a 52 65 6d 6f  ype = 0;.  zRemo
aa70: 74 65 55 73 65 72 20 3d 20 30 3b 0a 20 20 7a 52  teUser = 0;.  zR
aa80: 65 66 65 72 65 72 20 3d 20 30 3b 0a 20 20 77 68  eferer = 0;.  wh
aa90: 69 6c 65 28 20 66 67 65 74 73 28 7a 4c 69 6e 65  ile( fgets(zLine
aaa0: 2c 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 73  ,sizeof(zLine),s
aab0: 74 64 69 6e 29 20 29 7b 0a 20 20 20 20 63 68 61  tdin) ){.    cha
aac0: 72 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 3b 0a 20  r *zFieldName;. 
aad0: 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 0a     char *zVal;..
aae0: 20 20 20 20 6e 49 6e 20 2b 3d 20 73 74 72 6c 65      nIn += strle
aaf0: 6e 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 7a 46  n(zLine);.    zF
ab00: 69 65 6c 64 4e 61 6d 65 20 3d 20 47 65 74 46 69  ieldName = GetFi
ab10: 72 73 74 45 6c 65 6d 65 6e 74 28 7a 4c 69 6e 65  rstElement(zLine
ab20: 2c 26 7a 56 61 6c 29 3b 0a 20 20 20 20 69 66 28  ,&zVal);.    if(
ab30: 20 7a 46 69 65 6c 64 4e 61 6d 65 3d 3d 30 20 7c   zFieldName==0 |
ab40: 7c 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 3d 3d 30  | *zFieldName==0
ab50: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 52 65   ) break;.    Re
ab60: 6d 6f 76 65 4e 65 77 6c 69 6e 65 28 7a 56 61 6c  moveNewline(zVal
ab70: 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 61  );.    if( strca
ab80: 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65  secmp(zFieldName
ab90: 2c 22 55 73 65 72 2d 41 67 65 6e 74 3a 22 29 3d  ,"User-Agent:")=
aba0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 41 67 65  =0 ){.      zAge
abb0: 6e 74 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c  nt = StrDup(zVal
abc0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
abd0: 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65   strcasecmp(zFie
abe0: 6c 64 4e 61 6d 65 2c 22 41 63 63 65 70 74 3a 22  ldName,"Accept:"
abf0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 41  )==0 ){.      zA
ac00: 63 63 65 70 74 20 3d 20 53 74 72 44 75 70 28 7a  ccept = StrDup(z
ac10: 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Val);.    }else 
ac20: 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a  if( strcasecmp(z
ac30: 46 69 65 6c 64 4e 61 6d 65 2c 22 43 6f 6e 74 65  FieldName,"Conte
ac40: 6e 74 2d 6c 65 6e 67 74 68 3a 22 29 3d 3d 30 20  nt-length:")==0 
ac50: 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6e 74 65 6e  ){.      zConten
ac60: 74 4c 65 6e 67 74 68 20 3d 20 53 74 72 44 75 70  tLength = StrDup
ac70: 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  (zVal);.    }els
ac80: 65 20 69 66 28 20 73 74 72 63 61 73 65 63 6d 70  e if( strcasecmp
ac90: 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 43 6f 6e  (zFieldName,"Con
aca0: 74 65 6e 74 2d 74 79 70 65 3a 22 29 3d 3d 30 20  tent-type:")==0 
acb0: 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6e 74 65 6e  ){.      zConten
acc0: 74 54 79 70 65 20 3d 20 53 74 72 44 75 70 28 7a  tType = StrDup(z
acd0: 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Val);.    }else 
ace0: 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a  if( strcasecmp(z
acf0: 46 69 65 6c 64 4e 61 6d 65 2c 22 52 65 66 65 72  FieldName,"Refer
ad00: 65 72 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  er:")==0 ){.    
ad10: 20 20 7a 52 65 66 65 72 65 72 20 3d 20 53 74 72    zReferer = Str
ad20: 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 20  Dup(zVal);.     
ad30: 20 69 66 28 20 73 74 72 73 74 72 28 7a 56 61 6c   if( strstr(zVal
ad40: 2c 20 22 64 65 76 69 64 73 2e 6e 65 74 2f 22 29  , "devids.net/")
ad50: 21 3d 30 20 29 7b 20 7a 52 65 66 65 72 65 72 20  !=0 ){ zReferer 
ad60: 3d 20 22 64 65 76 69 64 73 2e 6e 65 74 2e 73 6d  = "devids.net.sm
ad70: 75 74 22 3b 0a 20 20 20 20 20 20 20 20 46 6f 72  ut";.        For
ad80: 62 69 64 64 65 6e 28 5f 5f 4c 49 4e 45 5f 5f 29  bidden(__LINE__)
ad90: 3b 20 2f 2a 20 4c 4f 47 3a 20 52 65 66 65 72 72  ; /* LOG: Referr
ada0: 65 72 20 69 73 20 64 65 76 69 64 73 2e 6e 65 74  er is devids.net
adb0: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
adc0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 61 73  }else if( strcas
add0: 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c  ecmp(zFieldName,
ade0: 22 43 6f 6f 6b 69 65 3a 22 29 3d 3d 30 20 29 7b  "Cookie:")==0 ){
adf0: 0a 20 20 20 20 20 20 7a 43 6f 6f 6b 69 65 20 3d  .      zCookie =
ae00: 20 53 74 72 41 70 70 65 6e 64 28 7a 43 6f 6f 6b   StrAppend(zCook
ae10: 69 65 2c 22 3b 20 22 2c 7a 56 61 6c 29 3b 0a 20  ie,"; ",zVal);. 
ae20: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
ae30: 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61  casecmp(zFieldNa
ae40: 6d 65 2c 22 43 6f 6e 6e 65 63 74 69 6f 6e 3a 22  me,"Connection:"
ae50: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
ae60: 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 56 61  ( strcasecmp(zVa
ae70: 6c 2c 22 63 6c 6f 73 65 22 29 3d 3d 30 20 29 7b  l,"close")==0 ){
ae80: 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 43 6f  .        closeCo
ae90: 6e 6e 65 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20  nnection = 1;.  
aea0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 66      }else if( !f
aeb0: 6f 72 63 65 43 6c 6f 73 65 20 26 26 20 73 74 72  orceClose && str
aec0: 63 61 73 65 63 6d 70 28 7a 56 61 6c 2c 20 22 6b  casecmp(zVal, "k
aed0: 65 65 70 2d 61 6c 69 76 65 22 29 3d 3d 30 20 29  eep-alive")==0 )
aee0: 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 43  {.        closeC
aef0: 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 30 3b 0a 20  onnection = 0;. 
af00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
af10: 20 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28   if( strcasecmp(
af20: 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 48 6f 73 74  zFieldName,"Host
af30: 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  :")==0 ){.      
af40: 69 6e 74 20 69 6e 53 71 75 61 72 65 20 3d 20 30  int inSquare = 0
af50: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 3b 0a  ;.      char c;.
af60: 20 20 20 20 20 20 69 66 28 20 73 61 6e 69 74 69        if( saniti
af70: 7a 65 53 74 72 69 6e 67 28 7a 56 61 6c 29 20 29  zeString(zVal) )
af80: 7b 0a 20 20 20 20 20 20 20 20 46 6f 72 62 69 64  {.        Forbid
af90: 64 65 6e 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 20  den(__LINE__);  
afa0: 2f 2a 20 4c 4f 47 3a 20 49 6c 6c 65 67 61 6c 20  /* LOG: Illegal 
afb0: 63 6f 6e 74 65 6e 74 20 69 6e 20 48 4f 53 54 3a  content in HOST:
afc0: 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
afd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 48 74 74      }.      zHtt
afe0: 70 48 6f 73 74 20 3d 20 53 74 72 44 75 70 28 7a  pHost = StrDup(z
aff0: 56 61 6c 29 3b 0a 20 20 20 20 20 20 7a 53 65 72  Val);.      zSer
b000: 76 65 72 50 6f 72 74 20 3d 20 7a 53 65 72 76 65  verPort = zServe
b010: 72 4e 61 6d 65 20 3d 20 53 74 72 44 75 70 28 7a  rName = StrDup(z
b020: 48 74 74 70 48 6f 73 74 29 3b 0a 20 20 20 20 20  HttpHost);.     
b030: 20 77 68 69 6c 65 28 20 7a 53 65 72 76 65 72 50   while( zServerP
b040: 6f 72 74 20 26 26 20 28 63 20 3d 20 2a 7a 53 65  ort && (c = *zSe
b050: 72 76 65 72 50 6f 72 74 29 21 3d 30 0a 20 20 20  rverPort)!=0.   
b060: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 63             && (c
b070: 21 3d 27 3a 27 20 7c 7c 20 69 6e 53 71 75 61 72  !=':' || inSquar
b080: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  e) ){.        if
b090: 28 20 63 3d 3d 27 5b 27 20 29 20 69 6e 53 71 75  ( c=='[' ) inSqu
b0a0: 61 72 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  are = 1;.       
b0b0: 20 69 66 28 20 63 3d 3d 27 5d 27 20 29 20 69 6e   if( c==']' ) in
b0c0: 53 71 75 61 72 65 20 3d 20 30 3b 0a 20 20 20 20  Square = 0;.    
b0d0: 20 20 20 20 7a 53 65 72 76 65 72 50 6f 72 74 2b      zServerPort+
b0e0: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
b0f0: 20 69 66 28 20 7a 53 65 72 76 65 72 50 6f 72 74   if( zServerPort
b100: 20 26 26 20 2a 7a 53 65 72 76 65 72 50 6f 72 74   && *zServerPort
b110: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 7a 53 65   ){.        *zSe
b120: 72 76 65 72 50 6f 72 74 20 3d 20 30 3b 0a 20 20  rverPort = 0;.  
b130: 20 20 20 20 20 20 7a 53 65 72 76 65 72 50 6f 72        zServerPor
b140: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
b150: 20 20 20 69 66 28 20 7a 52 65 61 6c 50 6f 72 74     if( zRealPort
b160: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 65 72   ){.        zSer
b170: 76 65 72 50 6f 72 74 20 3d 20 53 74 72 44 75 70  verPort = StrDup
b180: 28 7a 52 65 61 6c 50 6f 72 74 29 3b 0a 20 20 20  (zRealPort);.   
b190: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
b1a0: 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46  f( strcasecmp(zF
b1b0: 69 65 6c 64 4e 61 6d 65 2c 22 41 75 74 68 6f 72  ieldName,"Author
b1c0: 69 7a 61 74 69 6f 6e 3a 22 29 3d 3d 30 20 29 7b  ization:")==0 ){
b1d0: 0a 20 20 20 20 20 20 7a 41 75 74 68 54 79 70 65  .      zAuthType
b1e0: 20 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65   = GetFirstEleme
b1f0: 6e 74 28 53 74 72 44 75 70 28 7a 56 61 6c 29 2c  nt(StrDup(zVal),
b200: 20 26 7a 41 75 74 68 41 72 67 29 3b 0a 20 20 20   &zAuthArg);.   
b210: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 69 73   }.  }..  /* Dis
b220: 61 6c 6c 6f 77 20 72 65 71 75 65 73 74 73 20 66  allow requests f
b230: 72 6f 6d 20 63 65 72 74 61 69 6e 20 63 6c 69 65  rom certain clie
b240: 6e 74 73 20 2a 2f 0a 20 20 69 66 28 20 7a 41 67  nts */.  if( zAg
b250: 65 6e 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73  ent ){.    if( s
b260: 74 72 73 74 72 28 7a 41 67 65 6e 74 2c 20 22 57  trstr(zAgent, "W
b270: 69 6e 64 6f 77 73 5f 39 22 29 21 3d 30 0a 20 20  indows_9")!=0.  
b280: 20 20 20 7c 7c 20 73 74 72 73 74 72 28 7a 41 67     || strstr(zAg
b290: 65 6e 74 2c 20 22 44 6f 77 6e 6c 6f 61 64 5f 4d  ent, "Download_M
b2a0: 61 73 74 65 72 22 29 21 3d 30 0a 20 20 20 20 20  aster")!=0.     
b2b0: 7c 7c 20 73 74 72 73 74 72 28 7a 41 67 65 6e 74  || strstr(zAgent
b2c0: 2c 20 22 45 7a 6f 6f 6d 73 2f 22 29 21 3d 30 0a  , "Ezooms/")!=0.
b2d0: 20 20 20 2f 2a 7c 7c 20 73 74 72 73 74 72 28 7a     /*|| strstr(z
b2e0: 41 67 65 6e 74 2c 20 22 62 69 6e 67 62 6f 74 22  Agent, "bingbot"
b2f0: 29 21 3d 30 2a 2f 0a 20 20 20 20 20 7c 7c 20 73  )!=0*/.     || s
b300: 74 72 73 74 72 28 7a 41 67 65 6e 74 2c 20 22 41  trstr(zAgent, "A
b310: 68 72 65 66 73 42 6f 74 22 29 21 3d 30 0a 20 20  hrefsBot")!=0.  
b320: 20 20 29 7b 0a 20 20 20 20 20 20 46 6f 72 62 69    ){.      Forbi
b330: 64 64 65 6e 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20  dden(__LINE__); 
b340: 20 2f 2a 20 4c 4f 47 3a 20 44 69 73 61 6c 6c 6f   /* LOG: Disallo
b350: 77 65 64 20 75 73 65 72 20 61 67 65 6e 74 20 2a  wed user agent *
b360: 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 20  /.    }.  }.#if 
b370: 30 0a 20 20 69 66 28 20 7a 52 65 66 65 72 65 72  0.  if( zReferer
b380: 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63   ){.    static c
b390: 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69 73  onst char *azDis
b3a0: 61 6c 6c 6f 77 5b 5d 20 3d 20 7b 0a 20 20 20 20  allow[] = {.    
b3b0: 20 20 22 73 6b 69 64 72 6f 77 63 72 61 63 6b 2e    "skidrowcrack.
b3c0: 63 6f 6d 22 2c 0a 20 20 20 20 20 20 22 68 6f 73  com",.      "hos
b3d0: 68 69 79 75 75 67 69 2e 74 69 73 74 6f 72 79 2e  hiyuugi.tistory.
b3e0: 63 6f 6d 22 2c 0a 20 20 20 20 20 20 22 73 6b 69  com",.      "ski
b3f0: 64 72 6f 77 67 61 6d 65 73 2e 6e 65 74 22 2c 0a  drowgames.net",.
b400: 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69      };.    int i
b410: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
b420: 3c 73 69 7a 65 6f 66 28 61 7a 44 69 73 61 6c 6c  <sizeof(azDisall
b430: 6f 77 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 73  ow)/sizeof(azDis
b440: 61 6c 6c 6f 77 5b 30 5d 29 3b 20 69 2b 2b 29 7b  allow[0]); i++){
b450: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 73 74  .      if( strst
b460: 72 28 7a 52 65 66 65 72 65 72 2c 20 61 7a 44 69  r(zReferer, azDi
b470: 73 61 6c 6c 6f 77 5b 69 5d 29 21 3d 30 20 29 7b  sallow[i])!=0 ){
b480: 0a 20 20 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e  .        NotFoun
b490: 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 20 2f 2a  d(__LINE__);  /*
b4a0: 20 4c 4f 47 3a 20 44 69 73 61 6c 6c 6f 77 65 64   LOG: Disallowed
b4b0: 20 72 65 66 65 72 72 65 72 20 2a 2f 0a 20 20 20   referrer */.   
b4c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
b4d0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65  endif..  /* Make
b4e0: 20 61 6e 20 65 78 74 72 61 20 65 66 66 6f 72 74   an extra effort
b4f0: 20 74 6f 20 67 65 74 20 61 20 76 61 6c 69 64 20   to get a valid 
b500: 73 65 72 76 65 72 20 6e 61 6d 65 20 61 6e 64 20  server name and 
b510: 70 6f 72 74 20 6e 75 6d 62 65 72 2e 0a 20 20 2a  port number..  *
b520: 2a 20 4f 6e 6c 79 20 4e 65 74 73 63 61 70 65 20  * Only Netscape 
b530: 70 72 6f 76 69 64 65 73 20 74 68 69 73 20 69 6e  provides this in
b540: 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74  formation.  If t
b550: 68 65 20 62 72 6f 77 73 65 72 20 69 73 0a 20 20  he browser is.  
b560: 2a 2a 20 49 6e 74 65 72 6e 65 74 20 45 78 70 6c  ** Internet Expl
b570: 6f 72 65 72 2c 20 74 68 65 6e 20 77 65 20 68 61  orer, then we ha
b580: 76 65 20 74 6f 20 66 69 6e 64 20 6f 75 74 20 74  ve to find out t
b590: 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  he information f
b5a0: 6f 72 0a 20 20 2a 2a 20 6f 75 72 73 65 6c 76 65  or.  ** ourselve
b5b0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 53  s..  */.  if( zS
b5c0: 65 72 76 65 72 4e 61 6d 65 3d 3d 30 20 29 7b 0a  erverName==0 ){.
b5d0: 20 20 20 20 7a 53 65 72 76 65 72 4e 61 6d 65 20      zServerName 
b5e0: 3d 20 53 61 66 65 4d 61 6c 6c 6f 63 28 20 31 30  = SafeMalloc( 10
b5f0: 30 20 29 3b 0a 20 20 20 20 67 65 74 68 6f 73 74  0 );.    gethost
b600: 6e 61 6d 65 28 7a 53 65 72 76 65 72 4e 61 6d 65  name(zServerName
b610: 2c 31 30 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ,100);.  }.  if(
b620: 20 7a 53 65 72 76 65 72 50 6f 72 74 3d 3d 30 20   zServerPort==0 
b630: 7c 7c 20 2a 7a 53 65 72 76 65 72 50 6f 72 74 3d  || *zServerPort=
b640: 3d 30 20 29 7b 0a 20 20 20 20 7a 53 65 72 76 65  =0 ){.    zServe
b650: 72 50 6f 72 74 20 3d 20 44 45 46 41 55 4c 54 5f  rPort = DEFAULT_
b660: 50 4f 52 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  PORT;.  }..  /* 
b670: 52 65 6d 6f 76 65 20 74 68 65 20 71 75 65 72 79  Remove the query
b680: 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 74 68 65   string from the
b690: 20 65 6e 64 20 6f 66 20 74 68 65 20 72 65 71 75   end of the requ
b6a0: 65 73 74 65 64 20 66 69 6c 65 2e 0a 20 20 2a 2f  ested file..  */
b6b0: 0a 20 20 66 6f 72 28 7a 3d 7a 53 63 72 69 70 74  .  for(z=zScript
b6c0: 3b 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 3f 27 3b  ; *z && *z!='?';
b6d0: 20 7a 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 2a 7a   z++){}.  if( *z
b6e0: 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 7a 51 75  =='?' ){.    zQu
b6f0: 65 72 79 53 75 66 66 69 78 20 3d 20 53 74 72 44  erySuffix = StrD
b700: 75 70 28 7a 29 3b 0a 20 20 20 20 2a 7a 20 3d 20  up(z);.    *z = 
b710: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
b720: 7a 51 75 65 72 79 53 75 66 66 69 78 20 3d 20 22  zQuerySuffix = "
b730: 22 3b 0a 20 20 7d 0a 20 20 7a 51 75 65 72 79 53  ";.  }.  zQueryS
b740: 74 72 69 6e 67 20 3d 20 2a 7a 51 75 65 72 79 53  tring = *zQueryS
b750: 75 66 66 69 78 20 3f 20 26 7a 51 75 65 72 79 53  uffix ? &zQueryS
b760: 75 66 66 69 78 5b 31 5d 20 3a 20 7a 51 75 65 72  uffix[1] : zQuer
b770: 79 53 75 66 66 69 78 3b 0a 0a 20 20 2f 2a 20 43  ySuffix;..  /* C
b780: 72 65 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20  reate a file to 
b790: 68 6f 6c 64 20 74 68 65 20 50 4f 53 54 20 71 75  hold the POST qu
b7a0: 65 72 79 20 64 61 74 61 2c 20 69 66 20 61 6e 79  ery data, if any
b7b0: 2e 20 20 57 65 20 68 61 76 65 20 74 6f 0a 20 20  .  We have to.  
b7c0: 2a 2a 20 64 6f 20 69 74 20 74 68 69 73 20 77 61  ** do it this wa
b7d0: 79 2e 20 20 57 65 20 63 61 6e 27 74 20 6a 75 73  y.  We can't jus
b7e0: 74 20 70 61 73 73 20 74 68 65 20 66 69 6c 65 20  t pass the file 
b7f0: 64 65 73 63 72 69 70 74 6f 72 20 64 6f 77 6e 20  descriptor down 
b800: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 63 68 69 6c  to.  ** the chil
b810: 64 20 70 72 6f 63 65 73 73 20 62 65 63 61 75 73  d process becaus
b820: 65 20 74 68 65 20 66 67 65 74 73 28 29 20 66 75  e the fgets() fu
b830: 6e 63 74 69 6f 6e 20 6d 61 79 20 68 61 76 65 20  nction may have 
b840: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 72 65 61  already.  ** rea
b850: 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 50 4f  d part of the PO
b860: 53 54 20 64 61 74 61 20 69 6e 74 6f 20 69 74 73  ST data into its
b870: 20 69 6e 74 65 72 6e 61 6c 20 62 75 66 66 65 72   internal buffer
b880: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 4d 65  ..  */.  if( zMe
b890: 74 68 6f 64 5b 30 5d 3d 3d 27 50 27 20 26 26 20  thod[0]=='P' && 
b8a0: 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 21 3d  zContentLength!=
b8b0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 65 6e  0 ){.    int len
b8c0: 20 3d 20 61 74 6f 69 28 7a 43 6f 6e 74 65 6e 74   = atoi(zContent
b8d0: 4c 65 6e 67 74 68 29 3b 0a 20 20 20 20 46 49 4c  Length);.    FIL
b8e0: 45 20 2a 6f 75 74 3b 0a 20 20 20 20 63 68 61 72  E *out;.    char
b8f0: 20 2a 7a 42 75 66 3b 0a 20 20 20 20 69 6e 74 20   *zBuf;.    int 
b900: 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e  n;..    if( len>
b910: 4d 41 58 5f 43 4f 4e 54 45 4e 54 5f 4c 45 4e 47  MAX_CONTENT_LENG
b920: 54 48 20 29 7b 0a 20 20 20 20 20 20 53 74 61 72  TH ){.      Star
b930: 74 52 65 73 70 6f 6e 73 65 28 22 35 30 30 20 52  tResponse("500 R
b940: 65 71 75 65 73 74 20 74 6f 6f 20 6c 61 72 67 65  equest too large
b950: 22 29 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b  ");.      nOut +
b960: 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  = printf(.      
b970: 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a    "Content-type:
b980: 20 74 65 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22   text/plain\r\n"
b990: 0a 20 20 20 20 20 20 20 20 22 5c 72 5c 6e 22 0a  .        "\r\n".
b9a0: 20 20 20 20 20 20 20 20 22 54 6f 6f 20 6d 75 63          "Too muc
b9b0: 68 20 50 4f 53 54 20 64 61 74 61 5c 6e 22 0a 20  h POST data\n". 
b9c0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 4d 61       );.      Ma
b9d0: 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 5f 5f  keLogEntry(0, __
b9e0: 4c 49 4e 45 5f 5f 29 3b 20 2f 2a 20 4c 4f 47 3a  LINE__); /* LOG:
b9f0: 20 52 65 71 75 65 73 74 20 74 6f 6f 20 6c 61 72   Request too lar
ba00: 67 65 20 2a 2f 0a 20 20 20 20 20 20 65 78 69 74  ge */.      exit
ba10: 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  (0);.    }.    s
ba20: 70 72 69 6e 74 66 28 7a 54 6d 70 4e 61 6d 42 75  printf(zTmpNamBu
ba30: 66 2c 20 22 2f 74 6d 70 2f 2d 70 6f 73 74 2d 64  f, "/tmp/-post-d
ba40: 61 74 61 2d 58 58 58 58 58 58 22 29 3b 0a 20 20  ata-XXXXXX");.  
ba50: 20 20 7a 54 6d 70 4e 61 6d 20 3d 20 7a 54 6d 70    zTmpNam = zTmp
ba60: 4e 61 6d 42 75 66 3b 0a 20 20 20 20 69 66 28 20  NamBuf;.    if( 
ba70: 6d 6b 73 74 65 6d 70 28 7a 54 6d 70 4e 61 6d 29  mkstemp(zTmpNam)
ba80: 3c 30 20 29 7b 0a 20 20 20 20 20 20 4d 61 6c 66  <0 ){.      Malf
ba90: 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f  unction(__LINE__
baa0: 2c 20 20 2f 2a 20 4c 4f 47 3a 20 6d 6b 73 74 65  ,  /* LOG: mkste
bab0: 6d 70 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20  mp() failed */. 
bac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 43                "C
bad0: 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 61 20 74  annot create a t
bae0: 65 6d 70 20 66 69 6c 65 20 69 6e 20 77 68 69 63  emp file in whic
baf0: 68 20 74 6f 20 73 74 6f 72 65 20 50 4f 53 54 20  h to store POST 
bb00: 64 61 74 61 22 29 3b 0a 20 20 20 20 7d 0a 20 20  data");.    }.  
bb10: 20 20 6f 75 74 20 3d 20 66 6f 70 65 6e 28 7a 54    out = fopen(zT
bb20: 6d 70 4e 61 6d 2c 22 77 22 29 3b 0a 20 20 20 20  mpNam,"w");.    
bb30: 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20  if( out==0 ){.  
bb40: 20 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73      StartRespons
bb50: 65 28 22 35 30 30 20 43 61 6e 6e 6f 74 20 63 72  e("500 Cannot cr
bb60: 65 61 74 65 20 2f 74 6d 70 20 66 69 6c 65 22 29  eate /tmp file")
bb70: 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20  ;.      nOut += 
bb80: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
bb90: 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74  "Content-type: t
bba0: 65 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20  ext/plain\r\n". 
bbb0: 20 20 20 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20         "\r\n".  
bbc0: 20 20 20 20 20 20 22 43 6f 75 6c 64 20 6e 6f 74        "Could not
bbd0: 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20 66 6f 72   open \"%s\" for
bbe0: 20 77 72 69 74 69 6e 67 5c 6e 22 2c 20 7a 54 6d   writing\n", zTm
bbf0: 70 4e 61 6d 0a 20 20 20 20 20 20 29 3b 0a 20 20  pNam.      );.  
bc00: 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79      MakeLogEntry
bc10: 28 30 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 2f  (0, __LINE__); /
bc20: 2a 20 4c 4f 47 3a 20 63 61 6e 6e 6f 74 20 63 72  * LOG: cannot cr
bc30: 65 61 74 65 20 74 65 6d 70 20 66 69 6c 65 20 66  eate temp file f
bc40: 6f 72 20 50 4f 53 54 20 2a 2f 0a 20 20 20 20 20  or POST */.     
bc50: 20 65 78 69 74 28 30 29 3b 0a 20 20 20 20 7d 0a   exit(0);.    }.
bc60: 20 20 20 20 7a 42 75 66 20 3d 20 53 61 66 65 4d      zBuf = SafeM
bc70: 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31 20 29 3b 0a  alloc( len+1 );.
bc80: 20 20 20 20 69 66 28 20 75 73 65 54 69 6d 65 6f      if( useTimeo
bc90: 75 74 20 29 20 61 6c 61 72 6d 28 31 35 20 2b 20  ut ) alarm(15 + 
bca0: 6c 65 6e 2f 32 30 30 30 29 3b 0a 20 20 20 20 6e  len/2000);.    n
bcb0: 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 31 2c   = fread(zBuf,1,
bcc0: 6c 65 6e 2c 73 74 64 69 6e 29 3b 0a 20 20 20 20  len,stdin);.    
bcd0: 6e 49 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 66 77  nIn += n;.    fw
bce0: 72 69 74 65 28 7a 42 75 66 2c 31 2c 6e 2c 6f 75  rite(zBuf,1,n,ou
bcf0: 74 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 42 75  t);.    free(zBu
bd00: 66 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 6f  f);.    fclose(o
bd10: 75 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  ut);.  }..  /* M
bd20: 61 6b 65 20 73 75 72 65 20 74 68 65 20 72 75 6e  ake sure the run
bd30: 6e 69 6e 67 20 74 69 6d 65 20 69 73 20 6e 6f 74  ning time is not
bd40: 20 74 6f 6f 20 67 72 65 61 74 20 2a 2f 0a 20 20   too great */.  
bd50: 69 66 28 20 75 73 65 54 69 6d 65 6f 75 74 20 29  if( useTimeout )
bd60: 20 61 6c 61 72 6d 28 31 30 29 3b 0a 0a 20 20 2f   alarm(10);..  /
bd70: 2a 20 43 6f 6e 76 65 72 74 20 61 6c 6c 20 75 6e  * Convert all un
bd80: 75 73 75 61 6c 20 63 68 61 72 61 63 74 65 72 73  usual characters
bd90: 20 69 6e 20 74 68 65 20 73 63 72 69 70 74 20 6e   in the script n
bda0: 61 6d 65 20 69 6e 74 6f 20 22 5f 22 2e 0a 20 20  ame into "_"..  
bdb0: 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20  **.  ** This is 
bdc0: 61 20 64 65 66 65 6e 73 65 20 61 67 61 69 6e 73  a defense agains
bdd0: 74 20 76 61 72 69 6f 75 73 20 61 74 74 61 63 6b  t various attack
bde0: 73 2c 20 58 53 53 20 61 74 74 61 63 6b 73 20 69  s, XSS attacks i
bdf0: 6e 20 70 61 72 74 69 63 75 6c 61 72 2e 0a 20 20  n particular..  
be00: 2a 2f 0a 20 20 73 61 6e 69 74 69 7a 65 53 74 72  */.  sanitizeStr
be10: 69 6e 67 28 7a 53 63 72 69 70 74 29 3b 0a 0a 20  ing(zScript);.. 
be20: 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77   /* Do not allow
be30: 20 22 2f 2e 22 20 6f 72 20 22 2f 2d 22 20 74 6f   "/." or "/-" to
be40: 20 74 6f 20 6f 63 63 75 72 20 61 6e 79 77 68 65   to occur anywhe
be50: 72 65 20 69 6e 20 74 68 65 20 65 6e 74 69 74 79  re in the entity
be60: 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 54 68 69 73   name..  ** This
be70: 20 70 72 65 76 65 6e 74 73 20 61 74 74 61 63 6b   prevents attack
be80: 73 20 69 6e 76 6f 6c 76 69 6e 67 20 22 2e 2e 22  s involving ".."
be90: 20 61 6e 64 20 61 6c 73 6f 20 61 6c 6c 6f 77 73   and also allows
bea0: 20 75 73 20 74 6f 20 63 72 65 61 74 65 0a 20 20   us to create.  
beb0: 2a 2a 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72  ** files and dir
bec0: 65 63 74 6f 72 69 65 73 20 77 68 6f 73 65 20 6e  ectories whose n
bed0: 61 6d 65 73 20 62 65 67 69 6e 20 77 69 74 68 20  ames begin with 
bee0: 22 2d 22 20 6f 72 20 22 2e 22 20 77 68 69 63 68  "-" or "." which
bef0: 20 61 72 65 0a 20 20 2a 2a 20 69 6e 76 69 73 69   are.  ** invisi
bf00: 62 6c 65 20 74 6f 20 74 68 65 20 77 65 62 73 65  ble to the webse
bf10: 72 76 65 72 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  rver..  */.  for
bf20: 28 7a 3d 7a 53 63 72 69 70 74 3b 20 2a 7a 3b 20  (z=zScript; *z; 
bf30: 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a  z++){.    if( *z
bf40: 3d 3d 27 2f 27 20 26 26 20 28 7a 5b 31 5d 3d 3d  =='/' && (z[1]==
bf50: 27 2e 27 20 7c 7c 20 7a 5b 31 5d 3d 3d 27 2d 27  '.' || z[1]=='-'
bf60: 29 20 29 7b 0a 20 20 20 20 20 20 20 4e 6f 74 46  ) ){.       NotF
bf70: 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20  ound(__LINE__); 
bf80: 2f 2a 20 4c 4f 47 3a 20 50 61 74 68 20 65 6c 65  /* LOG: Path ele
bf90: 6d 65 6e 74 20 62 65 67 69 6e 73 20 77 69 74 68  ment begins with
bfa0: 20 22 2e 22 20 6f 72 20 22 2d 22 20 2a 2f 0a 20   "." or "-" */. 
bfb0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
bfc0: 69 67 75 72 65 20 6f 75 74 20 77 68 61 74 20 74  igure out what t
bfd0: 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 66  he root of the f
bfe0: 69 6c 65 73 79 73 74 65 6d 20 73 68 6f 75 6c 64  ilesystem should
bff0: 20 62 65 2e 20 20 49 66 20 74 68 65 0a 20 20 2a   be.  If the.  *
c000: 2a 20 48 54 54 50 5f 48 4f 53 54 20 70 61 72 61  * HTTP_HOST para
c010: 6d 65 74 65 72 20 65 78 69 73 74 73 20 28 73 74  meter exists (st
c020: 6f 72 65 64 20 69 6e 20 7a 48 74 74 70 48 6f 73  ored in zHttpHos
c030: 74 29 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74  t) then remove t
c040: 68 65 0a 20 20 2a 2a 20 70 6f 72 74 20 6e 75 6d  he.  ** port num
c050: 62 65 72 20 66 72 6f 6d 20 74 68 65 20 65 6e 64  ber from the end
c060: 20 28 69 66 20 61 6e 79 29 2c 20 63 6f 6e 76 65   (if any), conve
c070: 72 74 20 61 6c 6c 20 63 68 61 72 61 63 74 65 72  rt all character
c080: 73 20 74 6f 20 6c 6f 77 65 72 0a 20 20 2a 2a 20  s to lower.  ** 
c090: 63 61 73 65 2c 20 61 6e 64 20 63 6f 6e 76 65 72  case, and conver
c0a0: 74 20 61 6c 6c 20 22 2e 22 20 74 6f 20 22 5f 22  t all "." to "_"
c0b0: 2e 20 20 54 68 65 6e 20 74 72 79 20 74 6f 20 66  .  Then try to f
c0c0: 69 6e 64 20 61 20 64 69 72 65 63 74 6f 72 79 0a  ind a directory.
c0d0: 20 20 2a 2a 20 77 69 74 68 20 74 68 61 74 20 6e    ** with that n
c0e0: 61 6d 65 20 61 6e 64 20 74 68 65 20 65 78 74 65  ame and the exte
c0f0: 6e 73 69 6f 6e 20 2e 77 65 62 73 69 74 65 2e 20  nsion .website. 
c100: 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c   If not found, l
c110: 6f 6f 6b 0a 20 20 2a 2a 20 66 6f 72 20 22 64 65  ook.  ** for "de
c120: 66 61 75 6c 74 2e 77 65 62 73 69 74 65 22 2e 0a  fault.website"..
c130: 20 20 2a 2f 0a 20 20 69 66 28 20 7a 53 63 72 69    */.  if( zScri
c140: 70 74 5b 30 5d 21 3d 27 2f 27 20 29 7b 0a 20 20  pt[0]!='/' ){.  
c150: 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e    NotFound(__LIN
c160: 45 5f 5f 29 3b 20 2f 2a 20 4c 4f 47 3a 20 55 52  E__); /* LOG: UR
c170: 49 20 64 6f 65 73 20 6e 6f 74 20 73 74 61 72 74  I does not start
c180: 20 77 69 74 68 20 22 2f 22 20 2a 2f 0a 20 20 7d   with "/" */.  }
c190: 0a 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 52  .  if( strlen(zR
c1a0: 6f 6f 74 29 2b 34 30 20 3e 3d 20 73 69 7a 65 6f  oot)+40 >= sizeo
c1b0: 66 28 7a 4c 69 6e 65 29 20 29 7b 0a 20 20 20 20  f(zLine) ){.    
c1c0: 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45   NotFound(__LINE
c1d0: 5f 5f 29 3b 20 2f 2a 20 4c 4f 47 3a 20 55 52 49  __); /* LOG: URI
c1e0: 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a 20 20 7d   too long */.  }
c1f0: 0a 20 20 69 66 28 20 7a 48 74 74 70 48 6f 73 74  .  if( zHttpHost
c200: 3d 3d 30 20 7c 7c 20 7a 48 74 74 70 48 6f 73 74  ==0 || zHttpHost
c210: 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 4e 6f  [0]==0 ){.    No
c220: 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29  tFound(__LINE__)
c230: 3b 20 20 2f 2a 20 4c 4f 47 3a 20 4d 69 73 73 69  ;  /* LOG: Missi
c240: 6e 67 20 48 4f 53 54 3a 20 70 61 72 61 6d 65 74  ng HOST: paramet
c250: 65 72 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66  er */.  }else if
c260: 28 20 73 74 72 6c 65 6e 28 7a 48 74 74 70 48 6f  ( strlen(zHttpHo
c270: 73 74 29 2b 73 74 72 6c 65 6e 28 7a 52 6f 6f 74  st)+strlen(zRoot
c280: 29 2b 31 30 20 3e 3d 20 73 69 7a 65 6f 66 28 7a  )+10 >= sizeof(z
c290: 4c 69 6e 65 29 20 29 7b 0a 20 20 20 20 4e 6f 74  Line) ){.    Not
c2a0: 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b  Found(__LINE__);
c2b0: 20 20 2f 2a 20 4c 4f 47 3a 20 48 4f 53 54 20 70    /* LOG: HOST p
c2c0: 61 72 61 6d 65 74 65 72 20 74 6f 6f 20 6c 6f 6e  arameter too lon
c2d0: 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  g */.  }else{.  
c2e0: 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c    sprintf(zLine,
c2f0: 20 22 25 73 2f 25 73 22 2c 20 7a 52 6f 6f 74 2c   "%s/%s", zRoot,
c300: 20 7a 48 74 74 70 48 6f 73 74 29 3b 0a 20 20 20   zHttpHost);.   
c310: 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 7a 52   for(i=strlen(zR
c320: 6f 6f 74 29 2b 31 3b 20 7a 4c 69 6e 65 5b 69 5d  oot)+1; zLine[i]
c330: 20 26 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d 27 3a   && zLine[i]!=':
c340: 27 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  '; i++){.      i
c350: 6e 74 20 63 20 3d 20 7a 4c 69 6e 65 5b 69 5d 3b  nt c = zLine[i];
c360: 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 61 6c  .      if( !isal
c370: 6e 75 6d 28 63 29 20 29 7b 0a 20 20 20 20 20 20  num(c) ){.      
c380: 20 20 7a 4c 69 6e 65 5b 69 5d 20 3d 20 27 5f 27    zLine[i] = '_'
c390: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
c3a0: 28 20 69 73 75 70 70 65 72 28 63 29 20 29 7b 0a  ( isupper(c) ){.
c3b0: 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 69 5d          zLine[i]
c3c0: 20 3d 20 74 6f 6c 6f 77 65 72 28 63 29 3b 0a 20   = tolower(c);. 
c3d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
c3e0: 20 73 74 72 63 70 79 28 26 7a 4c 69 6e 65 5b 69   strcpy(&zLine[i
c3f0: 5d 2c 20 22 2e 77 65 62 73 69 74 65 22 29 3b 0a  ], ".website");.
c400: 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74 28 7a    }.  if( stat(z
c410: 4c 69 6e 65 2c 26 73 74 61 74 62 75 66 29 20 7c  Line,&statbuf) |
c420: 7c 20 21 53 5f 49 53 44 49 52 28 73 74 61 74 62  | !S_ISDIR(statb
c430: 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 7b 0a 20  uf.st_mode) ){. 
c440: 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65     sprintf(zLine
c450: 2c 20 22 25 73 2f 64 65 66 61 75 6c 74 2e 77 65  , "%s/default.we
c460: 62 73 69 74 65 22 2c 20 7a 52 6f 6f 74 29 3b 0a  bsite", zRoot);.
c470: 20 20 20 20 69 66 28 20 73 74 61 74 28 7a 4c 69      if( stat(zLi
c480: 6e 65 2c 26 73 74 61 74 62 75 66 29 20 7c 7c 20  ne,&statbuf) || 
c490: 21 53 5f 49 53 44 49 52 28 73 74 61 74 62 75 66  !S_ISDIR(statbuf
c4a0: 2e 73 74 5f 6d 6f 64 65 29 20 29 7b 0a 20 20 20  .st_mode) ){.   
c4b0: 20 20 20 69 66 28 20 73 74 61 6e 64 61 6c 6f 6e     if( standalon
c4c0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 70 72  e ){.        spr
c4d0: 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 25 73 22  intf(zLine, "%s"
c4e0: 2c 20 7a 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20  , zRoot);.      
c4f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4e  }else{.        N
c500: 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f  otFound(__LINE__
c510: 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 2a 2e 77 65  );  /* LOG: *.we
c520: 62 73 69 74 65 20 70 65 72 6d 69 73 73 69 6f 6e  bsite permission
c530: 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  s */.      }.   
c540: 20 7d 0a 20 20 7d 0a 20 20 7a 48 6f 6d 65 20 3d   }.  }.  zHome =
c550: 20 53 74 72 44 75 70 28 7a 4c 69 6e 65 29 3b 0a   StrDup(zLine);.
c560: 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 64 69 72  .  /* Change dir
c570: 65 63 74 6f 72 69 65 73 20 74 6f 20 74 68 65 20  ectories to the 
c580: 72 6f 6f 74 20 6f 66 20 74 68 65 20 48 54 54 50  root of the HTTP
c590: 20 66 69 6c 65 73 79 73 74 65 6d 0a 20 20 2a 2f   filesystem.  */
c5a0: 0a 20 20 69 66 28 20 63 68 64 69 72 28 7a 48 6f  .  if( chdir(zHo
c5b0: 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68  me)!=0 ){.    ch
c5c0: 61 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20  ar zBuf[1000];. 
c5d0: 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f     Malfunction(_
c5e0: 5f 4c 49 4e 45 5f 5f 2c 20 20 2f 2a 20 4c 4f 47  _LINE__,  /* LOG
c5f0: 3a 20 63 68 64 69 72 28 29 20 66 61 69 6c 65 64  : chdir() failed
c600: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 22 63 61   */.         "ca
c610: 6e 6e 6f 74 20 63 68 64 69 72 20 74 6f 20 5b 25  nnot chdir to [%
c620: 73 5d 20 66 72 6f 6d 20 5b 25 73 5d 22 2c 0a 20  s] from [%s]",. 
c630: 20 20 20 20 20 20 20 20 7a 48 6f 6d 65 2c 20 67          zHome, g
c640: 65 74 63 77 64 28 7a 42 75 66 2c 39 39 39 29 29  etcwd(zBuf,999))
c650: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
c660: 74 65 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74  te the file in t
c670: 68 65 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20  he filesystem.  
c680: 57 65 20 6d 69 67 68 74 20 68 61 76 65 20 74 6f  We might have to
c690: 20 61 70 70 65 6e 64 0a 20 20 2a 2a 20 74 68 65   append.  ** the
c6a0: 20 6e 61 6d 65 20 22 69 6e 64 65 78 2e 68 74 6d   name "index.htm
c6b0: 6c 22 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66  l" in order to f
c6c0: 69 6e 64 20 69 74 2e 20 20 41 6e 79 20 65 78 63  ind it.  Any exc
c6d0: 65 73 73 20 70 61 74 68 0a 20 20 2a 2a 20 69 6e  ess path.  ** in
c6e0: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 70 75 74  formation is put
c6f0: 20 69 6e 74 6f 20 74 68 65 20 7a 50 61 74 68 49   into the zPathI
c700: 6e 66 6f 20 76 61 72 69 61 62 6c 65 2e 0a 20 20  nfo variable..  
c710: 2a 2f 0a 20 20 7a 4c 69 6e 65 5b 30 5d 20 3d 20  */.  zLine[0] = 
c720: 27 2e 27 3b 0a 20 20 69 20 3d 20 30 3b 0a 20 20  '.';.  i = 0;.  
c730: 77 68 69 6c 65 28 20 7a 53 63 72 69 70 74 5b 69  while( zScript[i
c740: 5d 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  ] ){.    while( 
c750: 7a 53 63 72 69 70 74 5b 69 5d 20 26 26 20 7a 53  zScript[i] && zS
c760: 63 72 69 70 74 5b 69 5d 21 3d 27 2f 27 20 29 7b  cript[i]!='/' ){
c770: 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 69 2b 31  .      zLine[i+1
c780: 5d 20 3d 20 7a 53 63 72 69 70 74 5b 69 5d 3b 0a  ] = zScript[i];.
c790: 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d        i++;.    }
c7a0: 0a 20 20 20 20 7a 4c 69 6e 65 5b 69 2b 31 5d 20  .    zLine[i+1] 
c7b0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 74 61  = 0;.    if( sta
c7c0: 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75 66  t(zLine,&statbuf
c7d0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )!=0 ){.      in
c7e0: 74 20 73 74 69 6c 6c 53 65 61 72 63 68 69 6e 67  t stillSearching
c7f0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 77 68 69 6c   = 1;.      whil
c800: 65 28 20 73 74 69 6c 6c 53 65 61 72 63 68 69 6e  e( stillSearchin
c810: 67 20 26 26 20 69 3e 30 20 29 7b 0a 20 20 20 20  g && i>0 ){.    
c820: 20 20 20 20 77 68 69 6c 65 28 20 69 3e 30 20 26      while( i>0 &
c830: 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d 27 2f 27 20  & zLine[i]!='/' 
c840: 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ i--; }.      
c850: 20 20 73 74 72 63 70 79 28 26 7a 4c 69 6e 65 5b    strcpy(&zLine[
c860: 69 5d 2c 20 22 2f 6e 6f 74 2d 66 6f 75 6e 64 2e  i], "/not-found.
c870: 68 74 6d 6c 22 29 3b 0a 20 20 20 20 20 20 20 20  html");.        
c880: 69 66 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26  if( stat(zLine,&
c890: 73 74 61 74 62 75 66 29 3d 3d 30 20 26 26 20 53  statbuf)==0 && S
c8a0: 5f 49 53 52 45 47 28 73 74 61 74 62 75 66 2e 73  _ISREG(statbuf.s
c8b0: 74 5f 6d 6f 64 65 29 0a 20 20 20 20 20 20 20 20  t_mode).        
c8c0: 20 20 20 20 26 26 20 61 63 63 65 73 73 28 7a 4c      && access(zL
c8d0: 69 6e 65 2c 52 5f 4f 4b 29 3d 3d 30 20 29 7b 0a  ine,R_OK)==0 ){.
c8e0: 20 20 20 20 20 20 20 20 20 20 7a 52 65 61 6c 53            zRealS
c8f0: 63 72 69 70 74 20 3d 20 53 74 72 44 75 70 28 26  cript = StrDup(&
c900: 7a 4c 69 6e 65 5b 31 5d 29 3b 0a 20 20 20 20 20  zLine[1]);.     
c910: 20 20 20 20 20 52 65 64 69 72 65 63 74 28 7a 52       Redirect(zR
c920: 65 61 6c 53 63 72 69 70 74 2c 20 31 2c 20 5f 5f  ealScript, 1, __
c930: 4c 49 4e 45 5f 5f 29 3b 20 2f 2a 20 4c 4f 47 3a  LINE__); /* LOG:
c940: 20 72 65 64 69 72 65 63 74 20 74 6f 20 6e 6f 74   redirect to not
c950: 2d 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20  -found */.      
c960: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
c970: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c980: 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20       i--;.      
c990: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
c9a0: 20 20 69 66 28 20 73 74 69 6c 6c 53 65 61 72 63    if( stillSearc
c9b0: 68 69 6e 67 20 29 20 4e 6f 74 46 6f 75 6e 64 28  hing ) NotFound(
c9c0: 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 2f 2a 20 4c 4f  __LINE__); /* LO
c9d0: 47 3a 20 55 52 49 20 6e 6f 74 20 66 6f 75 6e 64  G: URI not found
c9e0: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
c9f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53  .    }.    if( S
ca00: 5f 49 53 52 45 47 28 73 74 61 74 62 75 66 2e 73  _ISREG(statbuf.s
ca10: 74 5f 6d 6f 64 65 29 20 29 7b 0a 20 20 20 20 20  t_mode) ){.     
ca20: 20 69 66 28 20 61 63 63 65 73 73 28 7a 4c 69 6e   if( access(zLin
ca30: 65 2c 52 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20  e,R_OK) ){.     
ca40: 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49     NotFound(__LI
ca50: 4e 45 5f 5f 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20  NE__);  /* LOG: 
ca60: 46 69 6c 65 20 6e 6f 74 20 72 65 61 64 61 62 6c  File not readabl
ca70: 65 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  e */.      }.   
ca80: 20 20 20 7a 52 65 61 6c 53 63 72 69 70 74 20 3d     zRealScript =
ca90: 20 53 74 72 44 75 70 28 26 7a 4c 69 6e 65 5b 31   StrDup(&zLine[1
caa0: 5d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ]);.      break;
cab0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
cac0: 53 63 72 69 70 74 5b 69 5d 3d 3d 30 20 7c 7c 20  Script[i]==0 || 
cad0: 7a 53 63 72 69 70 74 5b 69 2b 31 5d 3d 3d 30 20  zScript[i+1]==0 
cae0: 29 7b 0a 20 20 20 20 20 20 73 74 72 63 70 79 28  ){.      strcpy(
caf0: 26 7a 4c 69 6e 65 5b 69 2b 31 5d 2c 22 2f 69 6e  &zLine[i+1],"/in
cb00: 64 65 78 2e 68 74 6d 6c 22 29 3b 0a 20 20 20 20  dex.html");.    
cb10: 20 20 69 66 28 20 73 74 61 74 28 7a 4c 69 6e 65    if( stat(zLine
cb20: 2c 26 73 74 61 74 62 75 66 29 21 3d 30 20 7c 7c  ,&statbuf)!=0 ||
cb30: 20 21 53 5f 49 53 52 45 47 28 73 74 61 74 62 75   !S_ISREG(statbu
cb40: 66 2e 73 74 5f 6d 6f 64 65 29 20 0a 20 20 20 20  f.st_mode) .    
cb50: 20 20 7c 7c 20 61 63 63 65 73 73 28 7a 4c 69 6e    || access(zLin
cb60: 65 2c 52 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20  e,R_OK) ){.     
cb70: 20 20 20 73 74 72 63 70 79 28 26 7a 4c 69 6e 65     strcpy(&zLine
cb80: 5b 69 2b 31 5d 2c 22 2f 69 6e 64 65 78 2e 63 67  [i+1],"/index.cg
cb90: 69 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  i");.        if(
cba0: 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61   stat(zLine,&sta
cbb0: 74 62 75 66 29 21 3d 30 20 7c 7c 20 21 53 5f 49  tbuf)!=0 || !S_I
cbc0: 53 52 45 47 28 73 74 61 74 62 75 66 2e 73 74 5f  SREG(statbuf.st_
cbd0: 6d 6f 64 65 29 20 0a 20 20 20 20 20 20 20 20 7c  mode) .        |
cbe0: 7c 20 61 63 63 65 73 73 28 7a 4c 69 6e 65 2c 52  | access(zLine,R
cbf0: 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20  _OK) ){.        
cc00: 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e    NotFound(__LIN
cc10: 45 5f 5f 29 3b 20 2f 2a 20 4c 4f 47 3a 20 55 52  E__); /* LOG: UR
cc20: 49 20 69 73 20 61 20 64 69 72 65 63 74 6f 72 79  I is a directory
cc30: 20 77 2f 6f 20 69 6e 64 65 78 2e 68 74 6d 6c 20   w/o index.html 
cc40: 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
cc50: 20 20 20 7d 0a 20 20 20 20 20 20 7a 52 65 61 6c     }.      zReal
cc60: 53 63 72 69 70 74 20 3d 20 53 74 72 44 75 70 28  Script = StrDup(
cc70: 26 7a 4c 69 6e 65 5b 31 5d 29 3b 0a 20 20 20 20  &zLine[1]);.    
cc80: 20 20 69 66 28 20 7a 53 63 72 69 70 74 5b 69 5d    if( zScript[i]
cc90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
cca0: 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  * If the request
ccb0: 65 64 20 55 52 4c 20 64 6f 65 73 20 6e 6f 74 20  ed URL does not 
ccc0: 65 6e 64 20 77 69 74 68 20 22 2f 22 20 62 75 74  end with "/" but
ccd0: 20 77 65 20 68 61 64 20 74 6f 0a 20 20 20 20 20   we had to.     
cce0: 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 22 69 6e     ** append "in
ccf0: 64 65 78 2e 68 74 6d 6c 22 2c 20 74 68 65 6e 20  dex.html", then 
cd00: 61 20 72 65 64 69 72 65 63 74 20 69 73 20 6e 65  a redirect is ne
cd10: 63 65 73 73 61 72 79 2e 20 20 4f 74 68 65 72 77  cessary.  Otherw
cd20: 69 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  ise.        ** n
cd30: 6f 6e 65 20 6f 66 20 74 68 65 20 72 65 6c 61 74  one of the relat
cd40: 69 76 65 20 55 52 4c 73 20 69 6e 20 74 68 65 20  ive URLs in the 
cd50: 64 65 6c 69 76 65 72 65 64 20 64 6f 63 75 6d 65  delivered docume
cd60: 6e 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  nt will be.     
cd70: 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 2e 20 2a     ** correct. *
cd80: 2f 0a 20 20 20 20 20 20 20 20 52 65 64 69 72 65  /.        Redire
cd90: 63 74 28 7a 52 65 61 6c 53 63 72 69 70 74 2c 31  ct(zRealScript,1
cda0: 2c 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 2f 2a 20 4c  ,__LINE__); /* L
cdb0: 4f 47 3a 20 72 65 64 69 72 65 63 74 20 74 6f 20  OG: redirect to 
cdc0: 61 64 64 20 74 72 61 69 6c 69 6e 67 20 2f 20 2a  add trailing / *
cdd0: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
cde0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
cdf0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ce00: 20 7a 4c 69 6e 65 5b 69 2b 31 5d 20 3d 20 7a 53   zLine[i+1] = zS
ce10: 63 72 69 70 74 5b 69 5d 3b 0a 20 20 20 20 69 2b  cript[i];.    i+
ce20: 2b 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 20 3d  +;.  }.  zFile =
ce30: 20 53 74 72 44 75 70 28 7a 4c 69 6e 65 29 3b 0a   StrDup(zLine);.
ce40: 20 20 7a 50 61 74 68 49 6e 66 6f 20 3d 20 53 74    zPathInfo = St
ce50: 72 44 75 70 28 26 7a 53 63 72 69 70 74 5b 69 5d  rDup(&zScript[i]
ce60: 29 3b 0a 20 20 6c 65 6e 46 69 6c 65 20 3d 20 73  );.  lenFile = s
ce70: 74 72 6c 65 6e 28 7a 46 69 6c 65 29 3b 0a 20 20  trlen(zFile);.  
ce80: 7a 44 69 72 20 3d 20 53 74 72 44 75 70 28 7a 46  zDir = StrDup(zF
ce90: 69 6c 65 29 3b 0a 20 20 66 6f 72 28 69 3d 73 74  ile);.  for(i=st
cea0: 72 6c 65 6e 28 7a 44 69 72 29 2d 31 3b 20 69 3e  rlen(zDir)-1; i>
ceb0: 30 20 26 26 20 7a 44 69 72 5b 69 5d 21 3d 27 2f  0 && zDir[i]!='/
cec0: 27 3b 20 69 2d 2d 29 7b 7d 3b 0a 20 20 69 66 28  '; i--){};.  if(
ced0: 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 73 74   i==0 ){.     st
cee0: 72 63 70 79 28 7a 44 69 72 2c 22 2f 22 29 3b 0a  rcpy(zDir,"/");.
cef0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 7a 44    }else{.     zD
cf00: 69 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 0a  ir[i] = 0;.  }..
cf10: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
cf20: 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  e if there is an
cf30: 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66   authorization f
cf40: 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 69  ile.  If there i
cf50: 73 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  s,.  ** process 
cf60: 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 70 72 69 6e  it..  */.  sprin
cf70: 74 66 28 7a 4c 69 6e 65 2c 20 22 25 73 2f 2d 61  tf(zLine, "%s/-a
cf80: 75 74 68 22 2c 20 7a 44 69 72 29 3b 0a 20 20 69  uth", zDir);.  i
cf90: 66 28 20 61 63 63 65 73 73 28 7a 4c 69 6e 65 2c  f( access(zLine,
cfa0: 52 5f 4f 4b 29 3d 3d 30 20 26 26 20 21 43 68 65  R_OK)==0 && !Che
cfb0: 63 6b 42 61 73 69 63 41 75 74 68 6f 72 69 7a 61  ckBasicAuthoriza
cfc0: 74 69 6f 6e 28 7a 4c 69 6e 65 29 20 29 20 72 65  tion(zLine) ) re
cfd0: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 61 6b 65  turn;..  /* Take
cfe0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 61 63 74   appropriate act
cff0: 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  ion.  */.  if( (
d000: 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 20  statbuf.st_mode 
d010: 26 20 30 31 30 30 29 3d 3d 30 31 30 30 20 26 26  & 0100)==0100 &&
d020: 20 61 63 63 65 73 73 28 7a 46 69 6c 65 2c 58 5f   access(zFile,X_
d030: 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  OK)==0 ){.    /*
d040: 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
d050: 6f 77 69 6e 67 73 20 73 74 61 74 69 63 20 76 61  owings static va
d060: 72 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64  riables are used
d070: 20 74 6f 20 73 65 74 75 70 20 74 68 65 20 65 6e   to setup the en
d080: 76 69 72 6f 6e 6d 65 6e 74 0a 20 20 20 20 2a 2a  vironment.    **
d090: 20 66 6f 72 20 74 68 65 20 43 47 49 20 73 63 72   for the CGI scr
d0a0: 69 70 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ipt.    */.    s
d0b0: 74 61 74 69 63 20 63 68 61 72 20 2a 64 65 66 61  tatic char *defa
d0c0: 75 6c 74 5f 70 61 74 68 20 3d 20 22 2f 62 69 6e  ult_path = "/bin
d0d0: 3a 2f 75 73 72 2f 62 69 6e 22 3b 0a 20 20 20 20  :/usr/bin";.    
d0e0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 67 61 74  static char *gat
d0f0: 65 77 61 79 5f 69 6e 74 65 72 66 61 63 65 20 3d  eway_interface =
d100: 20 22 43 47 49 2f 31 2e 30 22 3b 0a 20 20 20 20   "CGI/1.0";.    
d110: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a  static struct {.
d120: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 6e 76        char *zEnv
d130: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 63 68 61 72  Name;.      char
d140: 20 2a 2a 70 7a 45 6e 76 56 61 6c 75 65 3b 0a 20   **pzEnvValue;. 
d150: 20 20 20 7d 20 63 67 69 65 6e 76 5b 5d 20 3d 20     } cgienv[] = 
d160: 7b 0a 20 20 20 20 20 20 7b 20 22 41 55 54 48 5f  {.      { "AUTH_
d170: 54 59 50 45 22 2c 20 20 20 20 20 20 20 20 20 20  TYPE",          
d180: 20 20 20 20 20 20 20 20 20 26 7a 41 75 74 68 54           &zAuthT
d190: 79 70 65 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  ype },.      { "
d1a0: 41 55 54 48 5f 43 4f 4e 54 45 4e 54 22 2c 20 20  AUTH_CONTENT",  
d1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
d1c0: 41 75 74 68 41 72 67 20 7d 2c 0a 20 20 20 20 20  AuthArg },.     
d1d0: 20 7b 20 22 43 4f 4e 54 45 4e 54 5f 4c 45 4e 47   { "CONTENT_LENG
d1e0: 54 48 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  TH",            
d1f0: 20 20 26 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67 74    &zContentLengt
d200: 68 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 43 4f  h },.      { "CO
d210: 4e 54 45 4e 54 5f 54 59 50 45 22 2c 20 20 20 20  NTENT_TYPE",    
d220: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 43 6f              &zCo
d230: 6e 74 65 6e 74 54 79 70 65 20 7d 2c 0a 20 20 20  ntentType },.   
d240: 20 20 20 7b 20 22 44 4f 43 55 4d 45 4e 54 5f 52     { "DOCUMENT_R
d250: 4f 4f 54 22 2c 20 20 20 20 20 20 20 20 20 20 20  OOT",           
d260: 20 20 20 20 26 7a 48 6f 6d 65 20 7d 2c 0a 20 20      &zHome },.  
d270: 20 20 20 20 7b 20 22 47 41 54 45 57 41 59 5f 49      { "GATEWAY_I
d280: 4e 54 45 52 46 41 43 45 22 2c 20 20 20 20 20 20  NTERFACE",      
d290: 20 20 20 20 20 26 67 61 74 65 77 61 79 5f 69 6e       &gateway_in
d2a0: 74 65 72 66 61 63 65 20 7d 2c 0a 20 20 20 20 20  terface },.     
d2b0: 20 7b 20 22 48 54 54 50 5f 41 43 43 45 50 54 22   { "HTTP_ACCEPT"
d2c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d2d0: 20 20 26 7a 41 63 63 65 70 74 20 7d 2c 0a 20 20    &zAccept },.  
d2e0: 20 20 20 20 7b 20 22 48 54 54 50 5f 43 4f 4f 4b      { "HTTP_COOK
d2f0: 49 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  IE",            
d300: 20 20 20 20 20 26 7a 43 6f 6f 6b 69 65 20 7d 2c       &zCookie },
d310: 0a 20 20 20 20 20 20 7b 20 22 48 54 54 50 5f 48  .      { "HTTP_H
d320: 4f 53 54 22 2c 20 20 20 20 20 20 20 20 20 20 20  OST",           
d330: 20 20 20 20 20 20 20 20 26 7a 48 74 74 70 48 6f          &zHttpHo
d340: 73 74 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 48  st },.      { "H
d350: 54 54 50 5f 52 45 46 45 52 45 52 22 2c 20 20 20  TTP_REFERER",   
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 52               &zR
d370: 65 66 65 72 65 72 20 7d 2c 0a 20 20 20 20 20 20  eferer },.      
d380: 7b 20 22 48 54 54 50 5f 55 53 45 52 5f 41 47 45  { "HTTP_USER_AGE
d390: 4e 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  NT",            
d3a0: 20 26 7a 41 67 65 6e 74 20 7d 2c 0a 20 20 20 20   &zAgent },.    
d3b0: 20 20 7b 20 22 50 41 54 48 22 2c 20 20 20 20 20    { "PATH",     
d3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3d0: 20 20 20 26 64 65 66 61 75 6c 74 5f 70 61 74 68     &default_path
d3e0: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 50 41 54   },.      { "PAT
d3f0: 48 5f 49 4e 46 4f 22 2c 20 20 20 20 20 20 20 20  H_INFO",        
d400: 20 20 20 20 20 20 20 20 20 20 20 26 7a 50 61 74             &zPat
d410: 68 49 6e 66 6f 20 7d 2c 0a 20 20 20 20 20 20 7b  hInfo },.      {
d420: 20 22 51 55 45 52 59 5f 53 54 52 49 4e 47 22 2c   "QUERY_STRING",
d430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d440: 26 7a 51 75 65 72 79 53 74 72 69 6e 67 20 7d 2c  &zQueryString },
d450: 0a 20 20 20 20 20 20 7b 20 22 52 45 4d 4f 54 45  .      { "REMOTE
d460: 5f 41 44 44 52 22 2c 20 20 20 20 20 20 20 20 20  _ADDR",         
d470: 20 20 20 20 20 20 20 20 26 7a 52 65 6d 6f 74 65          &zRemote
d480: 41 64 64 72 20 7d 2c 0a 20 20 20 20 20 20 7b 20  Addr },.      { 
d490: 22 52 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 22  "REQUEST_METHOD"
d4a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  ,              &
d4b0: 7a 4d 65 74 68 6f 64 20 7d 2c 0a 20 20 20 20 20  zMethod },.     
d4c0: 20 7b 20 22 52 45 51 55 45 53 54 5f 55 52 49 22   { "REQUEST_URI"
d4d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d4e0: 20 20 26 7a 53 63 72 69 70 74 20 7d 2c 0a 20 20    &zScript },.  
d4f0: 20 20 20 20 7b 20 22 52 45 4d 4f 54 45 5f 55 53      { "REMOTE_US
d500: 45 52 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ER",            
d510: 20 20 20 20 20 26 7a 52 65 6d 6f 74 65 55 73 65       &zRemoteUse
d520: 72 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 43  r },.      { "SC
d530: 52 49 50 54 5f 44 49 52 45 43 54 4f 52 59 22 2c  RIPT_DIRECTORY",
d540: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 44 69              &zDi
d550: 72 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 43  r },.      { "SC
d560: 52 49 50 54 5f 46 49 4c 45 4e 41 4d 45 22 2c 20  RIPT_FILENAME", 
d570: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 46 69              &zFi
d580: 6c 65 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  le },.      { "S
d590: 43 52 49 50 54 5f 4e 41 4d 45 22 2c 20 20 20 20  CRIPT_NAME",    
d5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 52               &zR
d5b0: 65 61 6c 53 63 72 69 70 74 20 7d 2c 0a 20 20 20  ealScript },.   
d5c0: 20 20 20 7b 20 22 53 45 52 56 45 52 5f 4e 41 4d     { "SERVER_NAM
d5d0: 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  E",             
d5e0: 20 20 20 20 26 7a 53 65 72 76 65 72 4e 61 6d 65      &zServerName
d5f0: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 45 52   },.      { "SER
d600: 56 45 52 5f 50 4f 52 54 22 2c 20 20 20 20 20 20  VER_PORT",      
d610: 20 20 20 20 20 20 20 20 20 20 20 26 7a 53 65 72             &zSer
d620: 76 65 72 50 6f 72 74 20 7d 2c 0a 20 20 20 20 20  verPort },.     
d630: 20 7b 20 22 53 45 52 56 45 52 5f 50 52 4f 54 4f   { "SERVER_PROTO
d640: 43 4f 4c 22 2c 20 20 20 20 20 20 20 20 20 20 20  COL",           
d650: 20 20 26 7a 50 72 6f 74 6f 63 6f 6c 20 7d 2c 0a    &zProtocol },.
d660: 20 20 20 20 7d 3b 0a 20 20 20 20 63 68 61 72 20      };.    char 
d670: 2a 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 3b 20  *zBaseFilename; 
d680: 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 77 69    /* Filename wi
d690: 74 68 6f 75 74 20 64 69 72 65 63 74 6f 72 79 20  thout directory 
d6a0: 70 72 65 66 69 78 20 2a 2f 0a 0a 20 20 20 20 2f  prefix */..    /
d6b0: 2a 20 49 66 20 69 74 73 20 65 78 65 63 75 74 61  * If its executa
d6c0: 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20  ble, it must be 
d6d0: 61 20 43 47 49 20 70 72 6f 67 72 61 6d 2e 20 20  a CGI program.  
d6e0: 53 74 61 72 74 20 62 79 0a 20 20 20 20 2a 2a 20  Start by.    ** 
d6f0: 63 68 61 6e 67 69 6e 67 20 64 69 72 65 63 74 6f  changing directo
d700: 72 69 65 73 20 74 6f 20 74 68 65 20 64 69 72 65  ries to the dire
d710: 63 74 6f 72 79 20 68 6f 6c 64 69 6e 67 20 74 68  ctory holding th
d720: 65 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20 2a  e program..    *
d730: 2f 0a 20 20 20 20 69 66 28 20 63 68 64 69 72 28  /.    if( chdir(
d740: 7a 44 69 72 29 20 29 7b 0a 20 20 20 20 20 20 63  zDir) ){.      c
d750: 68 61 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a  har zBuf[1000];.
d760: 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f        Malfunctio
d770: 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a 20 4c  n(__LINE__, /* L
d780: 4f 47 3a 20 63 68 64 69 72 28 29 20 66 61 69 6c  OG: chdir() fail
d790: 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
d7a0: 20 22 63 61 6e 6e 6f 74 20 63 68 64 69 72 20 74   "cannot chdir t
d7b0: 6f 20 5b 25 73 5d 20 66 72 6f 6d 20 5b 25 73 5d  o [%s] from [%s]
d7c0: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 7a  ", .           z
d7d0: 44 69 72 2c 20 67 65 74 63 77 64 28 7a 42 75 66  Dir, getcwd(zBuf
d7e0: 2c 39 39 39 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  ,999));.    }.. 
d7f0: 20 20 20 2f 2a 20 53 65 74 75 70 20 74 68 65 20     /* Setup the 
d800: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 61 70 70 72  environment appr
d810: 6f 70 72 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a  opriately..    *
d820: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
d830: 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 63 67  <(int)(sizeof(cg
d840: 69 65 6e 76 29 2f 73 69 7a 65 6f 66 28 63 67 69  ienv)/sizeof(cgi
d850: 65 6e 76 5b 30 5d 29 29 3b 20 69 2b 2b 29 7b 0a  env[0])); i++){.
d860: 20 20 20 20 20 20 69 66 28 20 2a 63 67 69 65 6e        if( *cgien
d870: 76 5b 69 5d 2e 70 7a 45 6e 76 56 61 6c 75 65 20  v[i].pzEnvValue 
d880: 29 7b 0a 20 20 20 20 20 20 20 20 53 65 74 45 6e  ){.        SetEn
d890: 76 28 63 67 69 65 6e 76 5b 69 5d 2e 7a 45 6e 76  v(cgienv[i].zEnv
d8a0: 4e 61 6d 65 2c 2a 63 67 69 65 6e 76 5b 69 5d 2e  Name,*cgienv[i].
d8b0: 70 7a 45 6e 76 56 61 6c 75 65 29 3b 0a 20 20 20  pzEnvValue);.   
d8c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
d8d0: 66 28 20 75 73 65 48 74 74 70 73 20 29 7b 0a 20  f( useHttps ){. 
d8e0: 20 20 20 20 20 70 75 74 65 6e 76 28 22 48 54 54       putenv("HTT
d8f0: 50 53 3d 6f 6e 22 29 3b 0a 20 20 20 20 7d 0a 0a  PS=on");.    }..
d900: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 41 62      /*.    ** Ab
d910: 6f 72 74 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ort with an erro
d920: 72 20 69 66 20 74 68 65 20 43 47 49 20 73 63 72  r if the CGI scr
d930: 69 70 74 20 69 73 20 77 72 69 74 61 62 6c 65 20  ipt is writable 
d940: 62 79 20 61 6e 79 6f 6e 65 20 6f 74 68 65 72 0a  by anyone other.
d950: 20 20 20 20 2a 2a 20 74 68 61 6e 20 69 74 73 20      ** than its 
d960: 6f 77 6e 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  owner..    */.  
d970: 20 20 69 66 28 20 73 74 61 74 62 75 66 2e 73 74    if( statbuf.st
d980: 5f 6d 6f 64 65 20 26 20 30 30 32 32 20 29 7b 0a  _mode & 0022 ){.
d990: 20 20 20 20 20 20 43 67 69 53 63 72 69 70 74 57        CgiScriptW
d9a0: 72 69 74 61 62 6c 65 28 29 3b 0a 20 20 20 20 7d  ritable();.    }
d9b0: 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 74 68 65  ..    /* For the
d9c0: 20 50 4f 53 54 20 6d 65 74 68 6f 64 20 61 6c 6c   POST method all
d9d0: 20 69 6e 70 75 74 20 68 61 73 20 62 65 65 6e 20   input has been 
d9e0: 77 72 69 74 74 65 6e 20 74 6f 20 61 20 74 65 6d  written to a tem
d9f0: 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 20  porary file,.   
da00: 20 2a 2a 20 73 6f 20 77 65 20 68 61 76 65 20 74   ** so we have t
da10: 6f 20 72 65 64 69 72 65 63 74 20 69 6e 70 75 74  o redirect input
da20: 20 74 6f 20 74 68 65 20 43 47 49 20 73 63 72 69   to the CGI scri
da30: 70 74 20 66 72 6f 6d 20 74 68 61 74 20 66 69 6c  pt from that fil
da40: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
da50: 28 20 7a 4d 65 74 68 6f 64 5b 30 5d 3d 3d 27 50  ( zMethod[0]=='P
da60: 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64  ' ){.      if( d
da70: 75 70 28 30 29 3c 30 20 29 7b 0a 20 20 20 20 20  up(0)<0 ){.     
da80: 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f     Malfunction(_
da90: 5f 4c 49 4e 45 5f 5f 2c 20 20 2f 2a 20 4c 4f 47  _LINE__,  /* LOG
daa0: 3a 20 64 75 70 28 29 20 66 61 69 6c 65 64 20 2a  : dup() failed *
dab0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
dac0: 20 20 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f        "Unable to
dad0: 20 64 75 70 6c 69 63 61 74 69 6f 6e 20 66 69 6c   duplication fil
dae0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 30 22 29  e descriptor 0")
daf0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
db00: 63 6c 6f 73 65 28 30 29 3b 0a 20 20 20 20 20 20  close(0);.      
db10: 6f 70 65 6e 28 7a 54 6d 70 4e 61 6d 2c 20 4f 5f  open(zTmpNam, O_
db20: 52 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 7d 0a 0a  RDONLY);.    }..
db30: 20 20 20 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e      for(i=strlen
db40: 28 7a 46 69 6c 65 29 2d 31 3b 20 69 3e 3d 30 20  (zFile)-1; i>=0 
db50: 26 26 20 7a 46 69 6c 65 5b 69 5d 21 3d 27 2f 27  && zFile[i]!='/'
db60: 3b 20 69 2d 2d 29 7b 7d 0a 20 20 20 20 7a 42 61  ; i--){}.    zBa
db70: 73 65 46 69 6c 65 6e 61 6d 65 20 3d 20 26 7a 46  seFilename = &zF
db80: 69 6c 65 5b 69 2b 31 5d 3b 0a 20 20 20 20 69 66  ile[i+1];.    if
db90: 28 20 69 3e 3d 30 20 26 26 20 73 74 72 6e 63 6d  ( i>=0 && strncm
dba0: 70 28 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c  p(zBaseFilename,
dbb0: 22 6e 70 68 2d 22 2c 34 29 3d 3d 30 20 29 7b 0a  "nph-",4)==0 ){.
dbc0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
dbd0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 43 47 49 20  name of the CGI 
dbe0: 73 63 72 69 70 74 20 62 65 67 69 6e 73 20 77 69  script begins wi
dbf0: 74 68 20 22 6e 70 68 2d 22 20 74 68 65 6e 20 77  th "nph-" then w
dc00: 65 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 64  e are.      ** d
dc10: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 22 6e  ealing with a "n
dc20: 6f 6e 2d 70 61 72 73 65 64 20 68 65 61 64 65 72  on-parsed header
dc30: 73 22 20 43 47 49 20 73 63 72 69 70 74 2e 20 20  s" CGI script.  
dc40: 4a 75 73 74 20 65 78 65 63 28 29 0a 20 20 20 20  Just exec().    
dc50: 20 20 2a 2a 20 69 74 20 64 69 72 65 63 74 6c 79    ** it directly
dc60: 20 61 6e 64 20 6c 65 74 20 69 74 20 68 61 6e 64   and let it hand
dc70: 6c 65 20 61 6c 6c 20 69 74 73 20 6f 77 6e 20 68  le all its own h
dc80: 65 61 64 65 72 20 67 65 6e 65 72 61 74 69 6f 6e  eader generation
dc90: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
dca0: 20 65 78 65 63 6c 28 7a 42 61 73 65 46 69 6c 65   execl(zBaseFile
dcb0: 6e 61 6d 65 2c 7a 42 61 73 65 46 69 6c 65 6e 61  name,zBaseFilena
dcc0: 6d 65 2c 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  me,(char*)0);.  
dcd0: 20 20 20 20 2f 2a 20 4e 4f 54 45 3a 20 4e 6f 20      /* NOTE: No 
dce0: 6c 6f 67 20 65 6e 74 72 79 20 77 72 69 74 74 65  log entry writte
dcf0: 6e 20 66 6f 72 20 6e 70 68 2d 20 73 63 72 69 70  n for nph- scrip
dd00: 74 73 20 2a 2f 0a 20 20 20 20 20 20 65 78 69 74  ts */.      exit
dd10: 28 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  (0);.    }..    
dd20: 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 74 6f 20  /* Fall thru to 
dd30: 68 65 72 65 20 6f 6e 6c 79 20 69 66 20 74 68 69  here only if thi
dd40: 73 20 70 72 6f 63 65 73 73 20 28 74 68 65 20 73  s process (the s
dd50: 65 72 76 65 72 29 20 69 73 20 67 6f 69 6e 67 0a  erver) is going.
dd60: 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 61      ** to read a
dd70: 6e 64 20 61 75 67 6d 65 6e 74 20 74 68 65 20 68  nd augment the h
dd80: 65 61 64 65 72 20 73 65 6e 74 20 62 61 63 6b 20  eader sent back 
dd90: 62 79 20 74 68 65 20 43 47 49 20 70 72 6f 63 65  by the CGI proce
dda0: 73 73 2e 0a 20 20 20 20 2a 2a 20 4f 70 65 6e 20  ss..    ** Open 
ddb0: 61 20 70 69 70 65 20 74 6f 20 72 65 63 65 69 76  a pipe to receiv
ddc0: 65 20 74 68 65 20 6f 75 74 70 75 74 20 66 72 6f  e the output fro
ddd0: 6d 20 74 68 65 20 43 47 49 20 70 72 6f 63 65 73  m the CGI proces
dde0: 73 2e 20 20 54 68 65 6e 0a 20 20 20 20 2a 2a 20  s.  Then.    ** 
ddf0: 66 6f 72 6b 20 74 68 65 20 43 47 49 20 70 72 6f  fork the CGI pro
de00: 63 65 73 73 2e 20 20 4f 6e 63 65 20 65 76 65 72  cess.  Once ever
de10: 79 74 68 69 6e 67 20 69 73 20 64 6f 6e 65 2c 20  ything is done, 
de20: 77 65 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20  we should be.   
de30: 20 2a 2a 20 61 62 6c 65 20 74 6f 20 72 65 61 64   ** able to read
de40: 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 43   the output of C
de50: 47 49 20 6f 6e 20 74 68 65 20 22 69 6e 22 20 73  GI on the "in" s
de60: 74 72 65 61 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20  tream..    */.  
de70: 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 78    {.      int px
de80: 5b 32 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [2];.      if( p
de90: 69 70 65 28 70 78 29 20 29 7b 0a 20 20 20 20 20  ipe(px) ){.     
dea0: 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f     Malfunction(_
deb0: 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a 20 4c 4f 47 3a  _LINE__, /* LOG:
dec0: 20 70 69 70 65 28 29 20 66 61 69 6c 65 64 20 2a   pipe() failed *
ded0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
dee0: 20 20 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f        "Unable to
def0: 20 63 72 65 61 74 65 20 61 20 70 69 70 65 20 66   create a pipe f
df00: 6f 72 20 74 68 65 20 43 47 49 20 70 72 6f 67 72  or the CGI progr
df10: 61 6d 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  am");.      }.  
df20: 20 20 20 20 69 66 28 20 66 6f 72 6b 28 29 3d 3d      if( fork()==
df30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f  0 ){.        clo
df40: 73 65 28 70 78 5b 30 5d 29 3b 0a 20 20 20 20 20  se(px[0]);.     
df50: 20 20 20 63 6c 6f 73 65 28 31 29 3b 0a 20 20 20     close(1);.   
df60: 20 20 20 20 20 69 66 28 20 64 75 70 28 70 78 5b       if( dup(px[
df70: 31 5d 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  1])!=1 ){.      
df80: 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28      Malfunction(
df90: 5f 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a 20 4c 4f 47  __LINE__, /* LOG
dfa0: 3a 20 64 75 70 28 29 20 66 61 69 6c 65 64 20 2a  : dup() failed *
dfb0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
dfc0: 20 20 20 22 55 6e 61 62 6c 65 20 74 6f 20 64 75     "Unable to du
dfd0: 70 6c 69 63 61 74 65 20 66 69 6c 65 20 64 65 73  plicate file des
dfe0: 63 72 69 70 74 6f 72 20 25 64 20 74 6f 20 31 22  criptor %d to 1"
dff0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e000: 20 20 20 70 78 5b 31 5d 29 3b 0a 20 20 20 20 20     px[1]);.     
e010: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 6c 6f     }.        clo
e020: 73 65 28 70 78 5b 31 5d 29 3b 0a 20 20 20 20 20  se(px[1]);.     
e030: 20 20 20 65 78 65 63 6c 28 7a 42 61 73 65 46 69     execl(zBaseFi
e040: 6c 65 6e 61 6d 65 2c 20 7a 42 61 73 65 46 69 6c  lename, zBaseFil
e050: 65 6e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29  ename, (char*)0)
e060: 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74 28 30  ;.        exit(0
e070: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e080: 20 63 6c 6f 73 65 28 70 78 5b 31 5d 29 3b 0a 20   close(px[1]);. 
e090: 20 20 20 20 20 69 6e 20 3d 20 66 64 6f 70 65 6e       in = fdopen
e0a0: 28 70 78 5b 30 5d 2c 20 22 72 22 29 3b 0a 20 20  (px[0], "r");.  
e0b0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d    }.    if( in==
e0c0: 30 20 29 7b 0a 20 20 20 20 20 20 43 67 69 45 72  0 ){.      CgiEr
e0d0: 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ror();.    }..  
e0e0: 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 70 72    /* Read and pr
e0f0: 6f 63 65 73 73 20 74 68 65 20 66 69 72 73 74 20  ocess the first 
e100: 6c 69 6e 65 20 6f 66 20 74 68 65 20 68 65 61 64  line of the head
e110: 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
e120: 68 65 0a 20 20 20 20 2a 2a 20 43 47 49 20 73 63  he.    ** CGI sc
e130: 72 69 70 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ript..    */.   
e140: 20 69 66 28 20 75 73 65 54 69 6d 65 6f 75 74 20   if( useTimeout 
e150: 29 20 61 6c 61 72 6d 28 31 35 29 3b 0a 20 20 20  ) alarm(15);.   
e160: 20 77 68 69 6c 65 28 20 66 67 65 74 73 28 7a 4c   while( fgets(zL
e170: 69 6e 65 2c 73 69 7a 65 6f 66 28 7a 4c 69 6e 65  ine,sizeof(zLine
e180: 29 2c 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 69  ),in) ){.      i
e190: 66 28 20 73 74 72 6e 63 6d 70 28 7a 4c 69 6e 65  f( strncmp(zLine
e1a0: 2c 22 4c 6f 63 61 74 69 6f 6e 3a 22 2c 39 29 3d  ,"Location:",9)=
e1b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
e1c0: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 52 65 6d  t i;.        Rem
e1d0: 6f 76 65 4e 65 77 6c 69 6e 65 28 7a 4c 69 6e 65  oveNewline(zLine
e1e0: 29 3b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 26  );.        z = &
e1f0: 7a 4c 69 6e 65 5b 31 30 5d 3b 0a 20 20 20 20 20  zLine[10];.     
e200: 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63     while( isspac
e210: 65 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  e(*z) ){ z++; }.
e220: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
e230: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
e240: 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d         if( z[i]=
e250: 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='?' ){.        
e260: 20 20 20 20 7a 51 75 65 72 79 53 75 66 66 69 78      zQuerySuffix
e270: 20 3d 20 53 74 72 44 75 70 28 22 22 29 3b 0a 20   = StrDup("");. 
e280: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
e290: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 0a 20 20     }.        .  
e2a0: 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d        if( z[0]==
e2b0: 27 2f 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2f 27  '/' && z[1]=='/'
e2c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
e2d0: 20 54 68 65 20 73 63 68 65 6d 65 20 69 73 20 6d   The scheme is m
e2e0: 69 73 73 69 6e 67 2e 20 20 41 64 64 20 69 74 20  issing.  Add it 
e2f0: 69 6e 20 62 65 66 6f 72 65 20 72 65 64 69 72 65  in before redire
e300: 63 74 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20  cting */.       
e310: 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65     StartResponse
e320: 28 22 33 30 32 20 52 65 64 69 72 65 63 74 22 29  ("302 Redirect")
e330: 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74  ;.          nOut
e340: 20 2b 3d 20 70 72 69 6e 74 66 28 22 4c 6f 63 61   += printf("Loca
e350: 74 69 6f 6e 3a 20 25 73 3a 25 73 25 73 5c 72 5c  tion: %s:%s%s\r\
e360: 6e 22 2c 7a 48 74 74 70 2c 7a 2c 7a 51 75 65 72  n",zHttp,z,zQuer
e370: 79 53 75 66 66 69 78 29 3b 0a 20 20 20 20 20 20  ySuffix);.      
e380: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e390: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30     }else if( z[0
e3a0: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
e3b0: 20 20 20 20 2f 2a 20 54 68 65 20 73 63 68 65 6d      /* The schem
e3c0: 65 20 61 6e 64 20 6e 65 74 77 6f 72 6b 20 6c 6f  e and network lo
e3d0: 63 61 74 69 6f 6e 20 61 72 65 20 6d 69 73 73 69  cation are missi
e3e0: 6e 67 20 62 75 74 20 77 65 20 68 61 76 65 0a 20  ng but we have. 
e3f0: 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20 61           ** an a
e400: 62 73 6f 6c 75 74 65 20 70 61 74 68 2e 20 2a 2f  bsolute path. */
e410: 0a 20 20 20 20 20 20 20 20 20 20 52 65 64 69 72  .          Redir
e420: 65 63 74 28 7a 2c 20 30 2c 20 5f 5f 4c 49 4e 45  ect(z, 0, __LINE
e430: 5f 5f 29 3b 20 2f 2a 20 4c 4f 47 3a 20 52 65 64  __); /* LOG: Red
e440: 69 72 65 63 74 20 66 72 6f 6d 20 43 47 49 20 2a  irect from CGI *
e450: 2f 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  /.          brea
e460: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
e470: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
e480: 20 73 65 65 20 69 66 20 74 68 65 72 65 20 69 73   see if there is
e490: 20 61 20 73 63 68 65 6d 65 20 70 72 65 66 69 78   a scheme prefix
e4a0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
e4b0: 69 3d 30 3b 20 7a 5b 69 5d 20 26 26 20 7a 5b 69  i=0; z[i] && z[i
e4c0: 5d 21 3d 27 3a 27 20 26 26 20 7a 5b 69 5d 21 3d  ]!=':' && z[i]!=
e4d0: 27 2f 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  '/'; i++){}.    
e4e0: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 3a      if( z[i]==':
e4f0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ' ){.          /
e500: 2a 20 57 65 20 68 61 76 65 20 61 20 73 63 68 65  * We have a sche
e510: 6d 65 2e 20 20 41 73 73 75 6d 65 20 74 68 65 72  me.  Assume ther
e520: 65 20 69 73 20 61 6e 20 61 62 73 6f 6c 75 74 65  e is an absolute
e530: 20 55 52 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20   URL */.        
e540: 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28    StartResponse(
e550: 22 33 30 32 20 52 65 64 69 72 65 63 74 22 29 3b  "302 Redirect");
e560: 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20  .          nOut 
e570: 2b 3d 20 70 72 69 6e 74 66 28 22 4c 6f 63 61 74  += printf("Locat
e580: 69 6f 6e 3a 20 25 73 25 73 5c 72 5c 6e 22 2c 7a  ion: %s%s\r\n",z
e590: 2c 7a 51 75 65 72 79 53 75 66 66 69 78 29 3b 0a  ,zQuerySuffix);.
e5a0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
e5b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e5c0: 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 61 20     /* Must be a 
e5d0: 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
e5e0: 65 2e 20 20 43 6f 6e 73 74 72 75 63 74 20 74 68  e.  Construct th
e5f0: 65 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 6e  e absolute pathn
e600: 61 6d 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ame.        ** a
e610: 6e 64 20 72 65 64 69 72 65 63 74 20 74 6f 20 69  nd redirect to i
e620: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 20  t. */.        i 
e630: 3d 20 73 74 72 6c 65 6e 28 7a 52 65 61 6c 53 63  = strlen(zRealSc
e640: 72 69 70 74 29 3b 0a 20 20 20 20 20 20 20 20 77  ript);.        w
e650: 68 69 6c 65 28 20 69 3e 30 20 26 26 20 7a 52 65  hile( i>0 && zRe
e660: 61 6c 53 63 72 69 70 74 5b 69 2d 31 5d 21 3d 27  alScript[i-1]!='
e670: 2f 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20  /' ){ i--; }.   
e680: 20 20 20 20 20 77 68 69 6c 65 28 20 69 3e 30 20       while( i>0 
e690: 26 26 20 7a 52 65 61 6c 53 63 72 69 70 74 5b 69  && zRealScript[i
e6a0: 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 69 2d 2d 3b  -1]=='/' ){ i--;
e6b0: 20 7d 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65   }.        while
e6c0: 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b 0a 20 20 20  ( *z=='.' ){.   
e6d0: 20 20 20 20 20 20 20 69 66 28 20 7a 5b 31 5d 3d         if( z[1]=
e6e0: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
e6f0: 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 20 20      z += 2;.    
e700: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
e710: 7a 5b 31 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 32  z[1]=='.' && z[2
e720: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
e730: 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3e 30        while( i>0
e740: 20 26 26 20 7a 52 65 61 6c 53 63 72 69 70 74 5b   && zRealScript[
e750: 69 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 69 2d 2d  i-1]!='/' ){ i--
e760: 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ; }.            
e770: 77 68 69 6c 65 28 20 69 3e 30 20 26 26 20 7a 52  while( i>0 && zR
e780: 65 61 6c 53 63 72 69 70 74 5b 69 2d 31 5d 3d 3d  ealScript[i-1]==
e790: 27 2f 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20  '/' ){ i--; }.  
e7a0: 20 20 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 33            z += 3
e7b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
e7c0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  e{.            b
e7d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
e7e0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
e7f0: 20 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73      StartRespons
e800: 65 28 22 33 30 32 20 52 65 64 69 72 65 63 74 22  e("302 Redirect"
e810: 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20  );.        nOut 
e820: 2b 3d 20 70 72 69 6e 74 66 28 22 4c 6f 63 61 74  += printf("Locat
e830: 69 6f 6e 3a 20 25 73 3a 2f 2f 25 73 22 2c 7a 48  ion: %s://%s",zH
e840: 74 74 70 2c 7a 53 65 72 76 65 72 4e 61 6d 65 29  ttp,zServerName)
e850: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74  ;.        if( st
e860: 72 63 6d 70 28 7a 53 65 72 76 65 72 50 6f 72 74  rcmp(zServerPort
e870: 2c 22 38 30 22 29 20 29 7b 0a 20 20 20 20 20 20  ,"80") ){.      
e880: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
e890: 74 66 28 22 3a 25 73 22 2c 7a 53 65 72 76 65 72  tf(":%s",zServer
e8a0: 50 6f 72 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  Port);.        }
e8b0: 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d  .        nOut +=
e8c0: 20 70 72 69 6e 74 66 28 22 25 2e 2a 73 2f 25 73   printf("%.*s/%s
e8d0: 25 73 5c 72 5c 6e 5c 72 5c 6e 22 2c 69 2c 7a 52  %s\r\n\r\n",i,zR
e8e0: 65 61 6c 53 63 72 69 70 74 2c 7a 2c 7a 51 75 65  ealScript,z,zQue
e8f0: 72 79 53 75 66 66 69 78 29 3b 0a 20 20 20 20 20  rySuffix);.     
e900: 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28     MakeLogEntry(
e910: 30 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 2f 2a  0, __LINE__); /*
e920: 20 4c 4f 47 3a 20 43 47 49 20 72 65 64 69 72 65   LOG: CGI redire
e930: 63 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  ct */.        re
e940: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73  turn;.      }els
e950: 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4c  e if( strncmp(zL
e960: 69 6e 65 2c 22 53 74 61 74 75 73 3a 22 2c 37 29  ine,"Status:",7)
e970: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
e980: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt i;.        fo
e990: 72 28 69 3d 37 3b 20 69 73 73 70 61 63 65 28 7a  r(i=7; isspace(z
e9a0: 4c 69 6e 65 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d  Line[i]); i++){}
e9b0: 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d  .        nOut +=
e9c0: 20 70 72 69 6e 74 66 28 22 25 73 20 25 73 22 2c   printf("%s %s",
e9d0: 20 7a 50 72 6f 74 6f 63 6f 6c 2c 20 26 7a 4c 69   zProtocol, &zLi
e9e0: 6e 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ne[i]);.        
e9f0: 73 74 72 6e 63 70 79 28 7a 52 65 70 6c 79 53 74  strncpy(zReplySt
ea00: 61 74 75 73 2c 20 26 7a 4c 69 6e 65 5b 69 5d 2c  atus, &zLine[i],
ea10: 20 33 29 3b 0a 20 20 20 20 20 20 20 20 7a 52 65   3);.        zRe
ea20: 70 6c 79 53 74 61 74 75 73 5b 33 5d 20 3d 20 30  plyStatus[3] = 0
ea30: 3b 0a 20 20 20 20 20 20 20 20 73 74 61 74 75 73  ;.        status
ea40: 53 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sent = 1;.      
ea50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
ea60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
ea70: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 53 74 61  t i;.        Sta
ea80: 72 74 52 65 73 70 6f 6e 73 65 28 22 32 30 30 20  rtResponse("200 
ea90: 4f 4b 22 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f  OK");.        nO
eaa0: 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 25 73  ut += printf("%s
eab0: 22 2c 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  ",zLine);.      
eac0: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4c 69 6e 65    for(i=0; zLine
ead0: 5b 69 5d 20 26 26 20 21 69 73 73 70 61 63 65 28  [i] && !isspace(
eae0: 7a 4c 69 6e 65 5b 69 5d 29 20 26 26 20 7a 4c 69  zLine[i]) && zLi
eaf0: 6e 65 5b 69 5d 21 3d 27 3a 27 3b 20 69 2b 2b 29  ne[i]!=':'; i++)
eb00: 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  {}.        if( i
eb10: 3c 32 20 7c 7c 20 7a 4c 69 6e 65 5b 69 5d 21 3d  <2 || zLine[i]!=
eb20: 27 3a 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ':' ) break;.   
eb30: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
eb40: 2f 2a 20 43 6f 70 79 20 65 76 65 72 79 74 68 69  /* Copy everythi
eb50: 6e 67 20 65 6c 73 65 20 74 68 72 75 20 77 69 74  ng else thru wit
eb60: 68 6f 75 74 20 63 68 61 6e 67 65 20 6f 72 20 61  hout change or a
eb70: 6e 61 6c 79 73 69 73 2e 0a 20 20 20 20 2a 2f 0a  nalysis..    */.
eb80: 20 20 20 20 69 66 28 20 75 73 65 54 69 6d 65 6f      if( useTimeo
eb90: 75 74 20 29 20 61 6c 61 72 6d 28 36 30 2a 35 29  ut ) alarm(60*5)
eba0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 20  ;.    while( (c 
ebb0: 3d 20 67 65 74 63 28 69 6e 29 29 21 3d 45 4f 46  = getc(in))!=EOF
ebc0: 20 29 7b 0a 20 20 20 20 20 20 70 75 74 63 28 63   ){.      putc(c
ebd0: 2c 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20  ,stdout);.      
ebe0: 6e 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nOut++;.    }.  
ebf0: 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
ec00: 7d 65 6c 73 65 20 69 66 28 20 63 6f 75 6e 74 53  }else if( countS
ec10: 6c 61 73 68 65 73 28 7a 52 65 61 6c 53 63 72 69  lashes(zRealScri
ec20: 70 74 29 21 3d 63 6f 75 6e 74 53 6c 61 73 68 65  pt)!=countSlashe
ec30: 73 28 7a 53 63 72 69 70 74 29 20 29 7b 0a 20 20  s(zScript) ){.  
ec40: 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75    /* If the requ
ec50: 65 73 74 20 55 52 49 20 66 6f 72 20 73 74 61 74  est URI for stat
ec60: 69 63 20 63 6f 6e 74 65 6e 74 20 63 6f 6e 74 61  ic content conta
ec70: 69 6e 73 20 6d 61 74 65 72 69 61 6c 20 70 61 73  ins material pas
ec80: 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 61 63 74  t the.    ** act
ec90: 75 61 6c 20 63 6f 6e 74 65 6e 74 20 66 69 6c 65  ual content file
eca0: 20 6e 61 6d 65 2c 20 72 65 70 6f 72 74 20 74 68   name, report th
ecb0: 61 74 20 61 73 20 61 20 34 30 34 20 65 72 72 6f  at as a 404 erro
ecc0: 72 2e 20 2a 2f 0a 20 20 20 20 4e 6f 74 46 6f 75  r. */.    NotFou
ecd0: 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 2f 2a  nd(__LINE__); /*
ece0: 20 4c 4f 47 3a 20 45 78 63 65 73 73 20 55 52 49   LOG: Excess URI
ecf0: 20 63 6f 6e 74 65 6e 74 20 70 61 73 74 20 73 74   content past st
ed00: 61 74 69 63 20 66 69 6c 65 20 6e 61 6d 65 20 2a  atic file name *
ed10: 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  /.  }else{.    /
ed20: 2a 20 49 66 20 69 74 20 69 73 6e 27 74 20 65 78  * If it isn't ex
ed30: 65 63 75 74 61 62 6c 65 20 74 68 65 6e 20 69 74  ecutable then it
ed40: 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 61 20 73  .    ** must a s
ed50: 69 6d 70 6c 65 20 66 69 6c 65 20 74 68 61 74 20  imple file that 
ed60: 6e 65 65 64 73 20 74 6f 20 62 65 20 63 6f 70 69  needs to be copi
ed70: 65 64 20 74 6f 20 6f 75 74 70 75 74 2e 0a 20 20  ed to output..  
ed80: 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63    */.    const c
ed90: 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 54 79 70  har *zContentTyp
eda0: 65 20 3d 20 47 65 74 4d 69 6d 65 54 79 70 65 28  e = GetMimeType(
edb0: 7a 46 69 6c 65 2c 20 6c 65 6e 46 69 6c 65 29 3b  zFile, lenFile);
edc0: 0a 0a 20 20 20 20 69 66 28 20 7a 54 6d 70 4e 61  ..    if( zTmpNa
edd0: 6d 20 29 20 75 6e 6c 69 6e 6b 28 7a 54 6d 70 4e  m ) unlink(zTmpN
ede0: 61 6d 29 3b 0a 20 20 20 20 69 6e 20 3d 20 66 6f  am);.    in = fo
edf0: 70 65 6e 28 7a 46 69 6c 65 2c 22 72 22 29 3b 0a  pen(zFile,"r");.
ee00: 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20      if( in==0 ) 
ee10: 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f  NotFound(__LINE_
ee20: 5f 29 3b 20 2f 2a 20 4c 4f 47 3a 20 66 6f 70 65  _); /* LOG: fope
ee30: 6e 28 29 20 66 61 69 6c 65 64 20 66 6f 72 20 73  n() failed for s
ee40: 74 61 74 69 63 20 63 6f 6e 74 65 6e 74 20 2a 2f  tatic content */
ee50: 0a 20 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e  .    StartRespon
ee60: 73 65 28 22 32 30 30 20 4f 4b 22 29 3b 0a 20 20  se("200 OK");.  
ee70: 20 20 6e 4f 75 74 20 2b 3d 20 44 61 74 65 54 61    nOut += DateTa
ee80: 67 28 22 4c 61 73 74 2d 4d 6f 64 69 66 69 65 64  g("Last-Modified
ee90: 22 2c 20 73 74 61 74 62 75 66 2e 73 74 5f 6d 74  ", statbuf.st_mt
eea0: 69 6d 65 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b  ime);.    nOut +
eeb0: 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 74 65 6e  = printf("Conten
eec0: 74 2d 74 79 70 65 3a 20 25 73 5c 72 5c 6e 22 2c  t-type: %s\r\n",
eed0: 7a 43 6f 6e 74 65 6e 74 54 79 70 65 29 3b 0a 20  zContentType);. 
eee0: 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74     nOut += print
eef0: 66 28 22 43 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74  f("Content-lengt
ef00: 68 3a 20 25 64 5c 72 5c 6e 5c 72 5c 6e 22 2c 28  h: %d\r\n\r\n",(
ef10: 69 6e 74 29 73 74 61 74 62 75 66 2e 73 74 5f 73  int)statbuf.st_s
ef20: 69 7a 65 29 3b 0a 20 20 20 20 66 66 6c 75 73 68  ize);.    fflush
ef30: 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 69 66  (stdout);.    if
ef40: 28 20 73 74 72 63 6d 70 28 7a 4d 65 74 68 6f 64  ( strcmp(zMethod
ef50: 2c 22 48 45 41 44 22 29 3d 3d 30 20 29 7b 0a 20  ,"HEAD")==0 ){. 
ef60: 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72       MakeLogEntr
ef70: 79 28 30 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20  y(0, __LINE__); 
ef80: 2f 2a 20 4e 6f 72 6d 61 6c 20 48 45 41 44 20 72  /* Normal HEAD r
ef90: 65 70 6c 79 20 2a 2f 0a 20 20 20 20 20 20 66 63  eply */.      fc
efa0: 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20  lose(in);.      
efb0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
efc0: 20 20 69 66 28 20 75 73 65 54 69 6d 65 6f 75 74    if( useTimeout
efd0: 20 29 20 61 6c 61 72 6d 28 33 30 20 2b 20 73 74   ) alarm(30 + st
efe0: 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 2f 31 30  atbuf.st_size/10
eff0: 30 30 29 3b 0a 23 69 66 64 65 66 20 6c 69 6e 75  00);.#ifdef linu
f000: 78 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 6f 66  x.    {.      of
f010: 66 5f 74 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  f_t offset = 0;.
f020: 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 73 65        nOut += se
f030: 6e 64 66 69 6c 65 28 66 69 6c 65 6e 6f 28 73 74  ndfile(fileno(st
f040: 64 6f 75 74 29 2c 20 66 69 6c 65 6e 6f 28 69 6e  dout), fileno(in
f050: 29 2c 20 26 6f 66 66 73 65 74 2c 20 73 74 61 74  ), &offset, stat
f060: 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20  buf.st_size);.  
f070: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 77 68    }.#else.    wh
f080: 69 6c 65 28 20 28 63 20 3d 20 67 65 74 63 28 69  ile( (c = getc(i
f090: 6e 29 29 21 3d 45 4f 46 20 29 7b 0a 20 20 20 20  n))!=EOF ){.    
f0a0: 20 20 70 75 74 63 28 63 2c 73 74 64 6f 75 74 29    putc(c,stdout)
f0b0: 3b 0a 20 20 20 20 20 20 6e 4f 75 74 2b 2b 3b 0a  ;.      nOut++;.
f0c0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
f0d0: 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 7d   fclose(in);.  }
f0e0: 0a 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74  .  fflush(stdout
f0f0: 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72  );.  MakeLogEntr
f100: 79 28 30 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20  y(0, __LINE__); 
f110: 20 2f 2a 20 4c 4f 47 3a 20 4e 6f 72 6d 61 6c 20   /* LOG: Normal 
f120: 72 65 70 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20 54  reply */..  /* T
f130: 68 65 20 6e 65 78 74 20 72 65 71 75 65 73 74 20  he next request 
f140: 6d 75 73 74 20 61 72 72 69 76 65 20 77 69 74 68  must arrive with
f150: 69 6e 20 33 30 20 73 65 63 6f 6e 64 73 20 6f 72  in 30 seconds or
f160: 20 77 65 20 63 6c 6f 73 65 20 74 68 65 20 63 6f   we close the co
f170: 6e 6e 65 63 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20  nnection.  */.  
f180: 6f 6d 69 74 4c 6f 67 20 3d 20 31 3b 0a 20 20 69  omitLog = 1;.  i
f190: 66 28 20 75 73 65 54 69 6d 65 6f 75 74 20 29 20  f( useTimeout ) 
f1a0: 61 6c 61 72 6d 28 33 30 29 3b 0a 7d 0a 0a 23 64  alarm(30);.}..#d
f1b0: 65 66 69 6e 65 20 4d 41 58 5f 50 41 52 41 4c 4c  efine MAX_PARALL
f1c0: 45 4c 20 35 30 20 20 2f 2a 20 4e 75 6d 62 65 72  EL 50  /* Number
f1d0: 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73   of simultaneous
f1e0: 20 63 68 69 6c 64 72 65 6e 20 2a 2f 0a 0a 2f 2a   children */../*
f1f0: 0a 2a 2a 20 41 6c 6c 20 70 6f 73 73 69 62 6c 65  .** All possible
f200: 20 66 6f 72 6d 73 20 6f 66 20 61 6e 20 49 50 20   forms of an IP 
f210: 61 64 64 72 65 73 73 2e 20 20 4e 65 65 64 65 64  address.  Needed
f220: 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   to work around 
f230: 47 43 43 20 73 74 72 69 63 74 0a 2a 2a 20 61 6c  GCC strict.** al
f240: 69 61 73 69 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f  iasing rules..*/
f250: 0a 74 79 70 65 64 65 66 20 75 6e 69 6f 6e 20 7b  .typedef union {
f260: 0a 20 20 73 74 72 75 63 74 20 73 6f 63 6b 61 64  .  struct sockad
f270: 64 72 20 73 61 3b 20 20 20 20 20 20 20 20 20 20  dr sa;          
f280: 20 20 20 20 2f 2a 20 41 62 73 74 72 61 63 74 20      /* Abstract 
f290: 73 75 70 65 72 63 6c 61 73 73 20 2a 2f 0a 20 20  superclass */.  
f2a0: 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f  struct sockaddr_
f2b0: 69 6e 20 73 61 34 3b 20 20 20 20 20 20 20 20 20  in sa4;         
f2c0: 20 2f 2a 20 49 50 76 34 20 2a 2f 0a 20 20 73 74   /* IPv4 */.  st
f2d0: 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e  ruct sockaddr_in
f2e0: 36 20 73 61 36 3b 20 20 20 20 20 20 20 20 20 2f  6 sa6;         /
f2f0: 2a 20 49 50 76 36 20 2a 2f 0a 20 20 73 74 72 75  * IPv6 */.  stru
f300: 63 74 20 73 6f 63 6b 61 64 64 72 5f 73 74 6f 72  ct sockaddr_stor
f310: 61 67 65 20 73 61 73 3b 20 20 20 20 20 2f 2a 20  age sas;     /* 
f320: 53 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6d 61  Should be the ma
f330: 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 61 62 6f  ximum of the abo
f340: 76 65 20 33 20 2a 2f 0a 7d 20 61 64 64 72 65 73  ve 3 */.} addres
f350: 73 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  s;../*.** Implem
f360: 65 6e 74 20 61 6e 20 48 54 54 50 20 73 65 72 76  ent an HTTP serv
f370: 65 72 20 64 61 65 6d 6f 6e 20 6c 69 73 74 65 6e  er daemon listen
f380: 69 6e 67 20 6f 6e 20 70 6f 72 74 20 69 50 6f 72  ing on port iPor
f390: 74 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 6e 65 77 20  t..**.** As new 
f3a0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 72 69  connections arri
f3b0: 76 65 2c 20 66 6f 72 6b 20 61 20 63 68 69 6c 64  ve, fork a child
f3c0: 20 61 6e 64 20 6c 65 74 20 63 68 69 6c 64 20 72   and let child r
f3d0: 65 74 75 72 6e 0a 2a 2a 20 6f 75 74 20 6f 66 20  eturn.** out of 
f3e0: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63  this procedure c
f3f0: 61 6c 6c 2e 20 20 54 68 65 20 63 68 69 6c 64 20  all.  The child 
f400: 77 69 6c 6c 20 68 61 6e 64 6c 65 20 74 68 65 20  will handle the 
f410: 72 65 71 75 65 73 74 2e 0a 2a 2a 20 54 68 65 20  request..** The 
f420: 70 61 72 65 6e 74 20 6e 65 76 65 72 20 72 65 74  parent never ret
f430: 75 72 6e 73 20 66 72 6f 6d 20 74 68 69 73 20 70  urns from this p
f440: 72 6f 63 65 64 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  rocedure..**.** 
f450: 52 65 74 75 72 6e 20 30 20 74 6f 20 65 61 63 68  Return 0 to each
f460: 20 63 68 69 6c 64 20 61 73 20 69 74 20 72 75 6e   child as it run
f470: 73 2e 20 20 49 66 20 75 6e 61 62 6c 65 20 74 6f  s.  If unable to
f480: 20 65 73 74 61 62 6c 69 73 68 20 61 0a 2a 2a 20   establish a.** 
f490: 6c 69 73 74 65 6e 69 6e 67 20 73 6f 63 6b 65 74  listening socket
f4a0: 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  , return non-zer
f4b0: 6f 2e 0a 2a 2f 0a 69 6e 74 20 68 74 74 70 5f 73  o..*/.int http_s
f4c0: 65 72 76 65 72 28 63 6f 6e 73 74 20 63 68 61 72  erver(const char
f4d0: 20 2a 7a 50 6f 72 74 2c 20 69 6e 74 20 6c 6f 63   *zPort, int loc
f4e0: 61 6c 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 6c  alOnly){.  int l
f4f0: 69 73 74 65 6e 65 72 5b 32 30 5d 3b 20 20 20 20  istener[20];    
f500: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
f510: 65 72 76 65 72 20 73 6f 63 6b 65 74 73 20 2a 2f  erver sockets */
f520: 0a 20 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f  .  int connectio
f530: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
f540: 2f 2a 20 41 20 73 6f 63 6b 65 74 20 66 6f 72 20  /* A socket for 
f550: 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20  each individual 
f560: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
f570: 66 64 5f 73 65 74 20 72 65 61 64 66 64 73 3b 20  fd_set readfds; 
f580: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f590: 53 65 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63  Set of file desc
f5a0: 72 69 70 74 6f 72 73 20 66 6f 72 20 73 65 6c 65  riptors for sele
f5b0: 63 74 28 29 20 2a 2f 0a 20 20 61 64 64 72 65 73  ct() */.  addres
f5c0: 73 20 69 6e 61 64 64 72 3b 20 20 20 20 20 20 20  s inaddr;       
f5d0: 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 74 65         /* Remote
f5e0: 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 73 6f   address */.  so
f5f0: 63 6b 6c 65 6e 5f 74 20 6c 65 6e 61 64 64 72 3b  cklen_t lenaddr;
f600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
f610: 6e 67 74 68 20 6f 66 20 74 68 65 20 69 6e 61 64  ngth of the inad
f620: 64 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  dr structure */.
f630: 20 20 69 6e 74 20 63 68 69 6c 64 3b 20 20 20 20    int child;    
f640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f650: 2a 20 50 49 44 20 6f 66 20 74 68 65 20 63 68 69  * PID of the chi
f660: 6c 64 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20  ld process */.  
f670: 69 6e 74 20 6e 63 68 69 6c 64 72 65 6e 20 3d 20  int nchildren = 
f680: 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
f690: 4e 75 6d 62 65 72 20 6f 66 20 63 68 69 6c 64 20  Number of child 
f6a0: 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a 20 20 73  processes */.  s
f6b0: 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 64 65  truct timeval de
f6c0: 6c 61 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 48  lay;        /* H
f6d0: 6f 77 20 6c 6f 6e 67 20 74 6f 20 77 61 69 74 20  ow long to wait 
f6e0: 69 6e 73 69 64 65 20 73 65 6c 65 63 74 28 29 20  inside select() 
f6f0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 74 20 3d 20 31  */.  int opt = 1
f700: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f710: 20 20 2f 2a 20 73 65 74 73 6f 63 6b 6f 70 74 20    /* setsockopt 
f720: 66 6c 61 67 20 2a 2f 0a 20 20 73 74 72 75 63 74  flag */.  struct
f730: 20 61 64 64 72 69 6e 66 6f 20 73 48 69 6e 74 73   addrinfo sHints
f740: 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
f750: 73 20 68 69 6e 74 73 20 2a 2f 0a 20 20 73 74 72  s hints */.  str
f760: 75 63 74 20 61 64 64 72 69 6e 66 6f 20 2a 70 41  uct addrinfo *pA
f770: 64 64 72 73 2c 20 2a 70 3b 20 2f 2a 20 2a 2f 0a  ddrs, *p; /* */.
f780: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
f790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f7a0: 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
f7b0: 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69  .  int i, n;.  i
f7c0: 6e 74 20 6d 61 78 46 64 20 3d 20 2d 31 3b 0a 20  nt maxFd = -1;. 
f7d0: 20 0a 20 20 6d 65 6d 73 65 74 28 26 73 48 69 6e   .  memset(&sHin
f7e0: 74 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 48  ts, 0, sizeof(sH
f7f0: 69 6e 74 73 29 29 3b 0a 20 20 69 66 28 20 69 70  ints));.  if( ip
f800: 76 34 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 48  v4Only ){.    sH
f810: 69 6e 74 73 2e 61 69 5f 66 61 6d 69 6c 79 20 3d  ints.ai_family =
f820: 20 50 46 5f 49 4e 45 54 3b 0a 20 20 20 20 2f 2a   PF_INET;.    /*
f830: 70 72 69 6e 74 66 28 22 69 70 76 34 20 6f 6e 6c  printf("ipv4 onl
f840: 79 5c 6e 22 29 3b 2a 2f 0a 20 20 7d 65 6c 73 65  y\n");*/.  }else
f850: 20 69 66 28 20 69 70 76 36 4f 6e 6c 79 20 29 7b   if( ipv6Only ){
f860: 0a 20 20 20 20 73 48 69 6e 74 73 2e 61 69 5f 66  .    sHints.ai_f
f870: 61 6d 69 6c 79 20 3d 20 50 46 5f 49 4e 45 54 36  amily = PF_INET6
f880: 3b 0a 20 20 20 20 2f 2a 70 72 69 6e 74 66 28 22  ;.    /*printf("
f890: 69 70 76 36 20 6f 6e 6c 79 5c 6e 22 29 3b 2a 2f  ipv6 only\n");*/
f8a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 48  .  }else{.    sH
f8b0: 69 6e 74 73 2e 61 69 5f 66 61 6d 69 6c 79 20 3d  ints.ai_family =
f8c0: 20 50 46 5f 55 4e 53 50 45 43 3b 0a 20 20 7d 0a   PF_UNSPEC;.  }.
f8d0: 20 20 73 48 69 6e 74 73 2e 61 69 5f 73 6f 63 6b    sHints.ai_sock
f8e0: 74 79 70 65 20 3d 20 53 4f 43 4b 5f 53 54 52 45  type = SOCK_STRE
f8f0: 41 4d 3b 0a 20 20 73 48 69 6e 74 73 2e 61 69 5f  AM;.  sHints.ai_
f900: 66 6c 61 67 73 20 3d 20 41 49 5f 50 41 53 53 49  flags = AI_PASSI
f910: 56 45 3b 0a 20 20 73 48 69 6e 74 73 2e 61 69 5f  VE;.  sHints.ai_
f920: 70 72 6f 74 6f 63 6f 6c 20 3d 20 30 3b 0a 20 20  protocol = 0;.  
f930: 72 63 20 3d 20 67 65 74 61 64 64 72 69 6e 66 6f  rc = getaddrinfo
f940: 28 6c 6f 63 61 6c 4f 6e 6c 79 20 3f 20 22 6c 6f  (localOnly ? "lo
f950: 63 61 6c 68 6f 73 74 22 3a 20 30 2c 20 7a 50 6f  calhost": 0, zPo
f960: 72 74 2c 20 26 73 48 69 6e 74 73 2c 20 26 70 41  rt, &sHints, &pA
f970: 64 64 72 73 29 3b 0a 20 20 69 66 28 20 72 63 20  ddrs);.  if( rc 
f980: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
f990: 74 64 65 72 72 2c 20 22 63 6f 75 6c 64 20 6e 6f  tderr, "could no
f9a0: 74 20 67 65 74 20 61 64 64 72 20 69 6e 66 6f 3a  t get addr info:
f9b0: 20 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20   %s", .         
f9c0: 20 20 20 72 63 21 3d 45 41 49 5f 53 59 53 54 45     rc!=EAI_SYSTE
f9d0: 4d 20 3f 20 67 61 69 5f 73 74 72 65 72 72 6f 72  M ? gai_strerror
f9e0: 28 72 63 29 20 3a 20 73 74 72 65 72 72 6f 72 28  (rc) : strerror(
f9f0: 65 72 72 6e 6f 29 29 3b 0a 20 20 20 20 72 65 74  errno));.    ret
fa00: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72  urn 1;.  }.  for
fa10: 28 6e 3d 30 2c 20 70 3d 70 41 64 64 72 73 3b 20  (n=0, p=pAddrs; 
fa20: 6e 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 6c  n<(int)(sizeof(l
fa30: 69 73 74 65 6e 65 72 29 2f 73 69 7a 65 6f 66 28  istener)/sizeof(
fa40: 6c 69 73 74 65 6e 65 72 5b 30 5d 29 29 20 26 26  listener[0])) &&
fa50: 20 70 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 70   p!=0;.        p
fa60: 3d 70 2d 3e 61 69 5f 6e 65 78 74 29 7b 0a 20 20  =p->ai_next){.  
fa70: 20 20 6c 69 73 74 65 6e 65 72 5b 6e 5d 20 3d 20    listener[n] = 
fa80: 73 6f 63 6b 65 74 28 70 2d 3e 61 69 5f 66 61 6d  socket(p->ai_fam
fa90: 69 6c 79 2c 20 70 2d 3e 61 69 5f 73 6f 63 6b 74  ily, p->ai_sockt
faa0: 79 70 65 2c 20 70 2d 3e 61 69 5f 70 72 6f 74 6f  ype, p->ai_proto
fab0: 63 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 6c 69  col);.    if( li
fac0: 73 74 65 6e 65 72 5b 6e 5d 3e 3d 30 20 29 7b 0a  stener[n]>=0 ){.
fad0: 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 63        /* if we c
fae0: 61 6e 27 74 20 74 65 72 6d 69 6e 61 74 65 20 6e  an't terminate n
faf0: 69 63 65 6c 79 2c 20 61 74 20 6c 65 61 73 74 20  icely, at least 
fb00: 61 6c 6c 6f 77 20 74 68 65 20 73 6f 63 6b 65 74  allow the socket
fb10: 20 74 6f 20 62 65 20 72 65 75 73 65 64 20 2a 2f   to be reused */
fb20: 0a 20 20 20 20 20 20 73 65 74 73 6f 63 6b 6f 70  .      setsockop
fb30: 74 28 6c 69 73 74 65 6e 65 72 5b 6e 5d 2c 20 53  t(listener[n], S
fb40: 4f 4c 5f 53 4f 43 4b 45 54 2c 20 53 4f 5f 52 45  OL_SOCKET, SO_RE
fb50: 55 53 45 41 44 44 52 2c 26 6f 70 74 2c 20 73 69  USEADDR,&opt, si
fb60: 7a 65 6f 66 28 6f 70 74 29 29 3b 0a 20 20 20 20  zeof(opt));.    
fb70: 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 49    .#if defined(I
fb80: 50 56 36 5f 56 36 4f 4e 4c 59 29 0a 20 20 20 20  PV6_V6ONLY).    
fb90: 20 20 69 66 28 20 70 2d 3e 61 69 5f 66 61 6d 69    if( p->ai_fami
fba0: 6c 79 3d 3d 41 46 5f 49 4e 45 54 36 20 29 7b 0a  ly==AF_INET6 ){.
fbb0: 20 20 20 20 20 20 20 20 69 6e 74 20 76 36 6f 6e          int v6on
fbc0: 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ly = 1;.        
fbd0: 73 65 74 73 6f 63 6b 6f 70 74 28 6c 69 73 74 65  setsockopt(liste
fbe0: 6e 65 72 5b 6e 5d 2c 20 49 50 50 52 4f 54 4f 5f  ner[n], IPPROTO_
fbf0: 49 50 56 36 2c 20 49 50 56 36 5f 56 36 4f 4e 4c  IPV6, IPV6_V6ONL
fc00: 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y,.             
fc10: 20 20 20 20 20 20 20 26 76 36 6f 6e 6c 79 2c 20         &v6only, 
fc20: 73 69 7a 65 6f 66 28 76 36 6f 6e 6c 79 29 29 3b  sizeof(v6only));
fc30: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
fc40: 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28        .      if(
fc50: 20 62 69 6e 64 28 6c 69 73 74 65 6e 65 72 5b 6e   bind(listener[n
fc60: 5d 2c 20 70 2d 3e 61 69 5f 61 64 64 72 2c 20 70  ], p->ai_addr, p
fc70: 2d 3e 61 69 5f 61 64 64 72 6c 65 6e 29 3c 30 20  ->ai_addrlen)<0 
fc80: 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74  ){.        print
fc90: 66 28 22 62 69 6e 64 20 66 61 69 6c 65 64 3a 20  f("bind failed: 
fca0: 25 73 5c 6e 22 2c 20 73 74 72 65 72 72 6f 72 28  %s\n", strerror(
fcb0: 65 72 72 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20  errno));.       
fcc0: 20 63 6c 6f 73 65 28 6c 69 73 74 65 6e 65 72 5b   close(listener[
fcd0: 6e 5d 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  n]);.        con
fce0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
fcf0: 20 20 20 20 20 69 66 28 20 6c 69 73 74 65 6e 28       if( listen(
fd00: 6c 69 73 74 65 6e 65 72 5b 6e 5d 2c 20 32 30 29  listener[n], 20)
fd10: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  <0 ){.        pr
fd20: 69 6e 74 66 28 22 6c 69 73 74 65 6e 28 29 20 66  intf("listen() f
fd30: 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20 73 74  ailed: %s\n", st
fd40: 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 29 3b 0a  rerror(errno));.
fd50: 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 6c 69          close(li
fd60: 73 74 65 6e 65 72 5b 6e 5d 29 3b 0a 20 20 20 20  stener[n]);.    
fd70: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
fd80: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 2b 2b 3b      }.      n++;
fd90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
fda0: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72   n==0 ){.    fpr
fdb0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 63 61  intf(stderr, "ca
fdc0: 6e 6e 6f 74 20 6f 70 65 6e 20 61 6e 79 20 73 6f  nnot open any so
fdd0: 63 6b 65 74 73 5c 6e 22 29 3b 0a 20 20 20 20 72  ckets\n");.    r
fde0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
fdf0: 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
fe00: 69 66 28 20 6e 63 68 69 6c 64 72 65 6e 3e 4d 41  if( nchildren>MA
fe10: 58 5f 50 41 52 41 4c 4c 45 4c 20 29 7b 0a 20 20  X_PARALLEL ){.  
fe20: 20 20 20 20 2f 2a 20 53 6c 6f 77 20 64 6f 77 6e      /* Slow down
fe30: 20 69 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   if connections 
fe40: 61 72 65 20 61 72 72 69 76 69 6e 67 20 74 6f 6f  are arriving too
fe50: 20 66 61 73 74 20 2a 2f 0a 20 20 20 20 20 20 73   fast */.      s
fe60: 6c 65 65 70 28 20 6e 63 68 69 6c 64 72 65 6e 2d  leep( nchildren-
fe70: 4d 41 58 5f 50 41 52 41 4c 4c 45 4c 20 29 3b 0a  MAX_PARALLEL );.
fe80: 20 20 20 20 7d 0a 20 20 20 20 64 65 6c 61 79 2e      }.    delay.
fe90: 74 76 5f 73 65 63 20 3d 20 36 30 3b 0a 20 20 20  tv_sec = 60;.   
fea0: 20 64 65 6c 61 79 2e 74 76 5f 75 73 65 63 20 3d   delay.tv_usec =
feb0: 20 30 3b 0a 20 20 20 20 46 44 5f 5a 45 52 4f 28   0;.    FD_ZERO(
fec0: 26 72 65 61 64 66 64 73 29 3b 0a 20 20 20 20 66  &readfds);.    f
fed0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
fee0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
fef0: 20 6c 69 73 74 65 6e 65 72 5b 69 5d 3e 3d 30 20   listener[i]>=0 
ff00: 29 3b 0a 20 20 20 20 20 20 46 44 5f 53 45 54 28  );.      FD_SET(
ff10: 20 6c 69 73 74 65 6e 65 72 5b 69 5d 2c 20 26 72   listener[i], &r
ff20: 65 61 64 66 64 73 29 3b 0a 20 20 20 20 20 20 69  eadfds);.      i
ff30: 66 28 20 6c 69 73 74 65 6e 65 72 5b 69 5d 3e 6d  f( listener[i]>m
ff40: 61 78 46 64 20 29 20 6d 61 78 46 64 20 3d 20 6c  axFd ) maxFd = l
ff50: 69 73 74 65 6e 65 72 5b 69 5d 3b 0a 20 20 20 20  istener[i];.    
ff60: 7d 0a 20 20 20 20 73 65 6c 65 63 74 28 20 6d 61  }.    select( ma
ff70: 78 46 64 2b 31 2c 20 26 72 65 61 64 66 64 73 2c  xFd+1, &readfds,
ff80: 20 30 2c 20 30 2c 20 26 64 65 6c 61 79 29 3b 0a   0, 0, &delay);.
ff90: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
ffa0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
ffb0: 28 20 46 44 5f 49 53 53 45 54 28 6c 69 73 74 65  ( FD_ISSET(liste
ffc0: 6e 65 72 5b 69 5d 2c 20 26 72 65 61 64 66 64 73  ner[i], &readfds
ffd0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e  ) ){.        len
ffe0: 61 64 64 72 20 3d 20 73 69 7a 65 6f 66 28 69 6e  addr = sizeof(in
fff0: 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 63  addr);.        c
10000 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 61 63 63 65  onnection = acce
10010 70 74 28 6c 69 73 74 65 6e 65 72 5b 69 5d 2c 20  pt(listener[i], 
10020 26 69 6e 61 64 64 72 2e 73 61 2c 20 26 6c 65 6e  &inaddr.sa, &len
10030 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 69  addr);.        i
10040 66 28 20 63 6f 6e 6e 65 63 74 69 6f 6e 3e 3d 30  f( connection>=0
10050 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68   ){.          ch
10060 69 6c 64 20 3d 20 66 6f 72 6b 28 29 3b 0a 20 20  ild = fork();.  
10070 20 20 20 20 20 20 20 20 69 66 28 20 63 68 69 6c          if( chil
10080 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d!=0 ){.        
10090 20 20 20 20 69 66 28 20 63 68 69 6c 64 3e 30 20      if( child>0 
100a0 29 20 6e 63 68 69 6c 64 72 65 6e 2b 2b 3b 0a 20  ) nchildren++;. 
100b0 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
100c0 28 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20 20  (connection);.  
100d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 72 69            /* pri
100e0 6e 74 66 28 22 73 75 62 70 72 6f 63 65 73 73 20  ntf("subprocess 
100f0 25 64 20 73 74 61 72 74 65 64 2e 2e 2e 5c 6e 22  %d started...\n"
10100 2c 20 63 68 69 6c 64 29 3b 20 66 66 6c 75 73 68  , child); fflush
10110 28 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 20  (stdout); */.   
10120 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
10130 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 45            int nE
10140 72 72 20 3d 20 30 2c 20 66 64 3b 0a 20 20 20 20  rr = 0, fd;.    
10150 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 30 29          close(0)
10160 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 64  ;.            fd
10170 20 3d 20 64 75 70 28 63 6f 6e 6e 65 63 74 69 6f   = dup(connectio
10180 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
10190 69 66 28 20 66 64 21 3d 30 20 29 20 6e 45 72 72  if( fd!=0 ) nErr
101a0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
101b0 63 6c 6f 73 65 28 31 29 3b 0a 20 20 20 20 20 20  close(1);.      
101c0 20 20 20 20 20 20 66 64 20 3d 20 64 75 70 28 63        fd = dup(c
101d0 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 20 20  onnection);.    
101e0 20 20 20 20 20 20 20 20 69 66 28 20 66 64 21 3d          if( fd!=
101f0 31 20 29 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  1 ) nErr++;.    
10200 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 63 6f          close(co
10210 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  nnection);.     
10220 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 45         return nE
10230 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rr;.          }.
10240 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10250 7d 0a 20 20 20 20 20 20 2f 2a 20 42 75 72 79 20  }.      /* Bury 
10260 64 65 61 64 20 63 68 69 6c 64 72 65 6e 20 2a 2f  dead children */
10270 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63  .      while( (c
10280 68 69 6c 64 20 3d 20 77 61 69 74 70 69 64 28 30  hild = waitpid(0
10290 2c 20 30 2c 20 57 4e 4f 48 41 4e 47 29 29 3e 30  , 0, WNOHANG))>0
102a0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 70   ){.        /* p
102b0 72 69 6e 74 66 28 22 70 72 6f 63 65 73 73 20 25  rintf("process %
102c0 64 20 65 6e 64 73 5c 6e 22 2c 20 63 68 69 6c 64  d ends\n", child
102d0 29 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74  ); fflush(stdout
102e0 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 63  ); */.        nc
102f0 68 69 6c 64 72 65 6e 2d 2d 3b 0a 20 20 20 20 20  hildren--;.     
10300 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
10310 2a 20 4e 4f 54 20 52 45 41 43 48 45 44 20 2a 2f  * NOT REACHED */
10320 20 20 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a    .  exit(1);.}.
10330 0a 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61  ..int main(int a
10340 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
10350 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
10360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10370 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
10380 2f 0a 20 20 63 68 61 72 20 2a 7a 50 65 72 6d 55  /.  char *zPermU
10390 73 65 72 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  ser = 0;      /*
103a0 20 52 75 6e 20 64 61 65 6d 6f 6e 20 77 69 74 68   Run daemon with
103b0 20 74 68 69 73 20 75 73 65 72 27 73 20 70 65 72   this user's per
103c0 6d 69 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 63 6f  missions */.  co
103d0 6e 73 74 20 63 68 61 72 20 2a 7a 50 6f 72 74 20  nst char *zPort 
103e0 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6d 70 6c 65  = 0;    /* Imple
103f0 6d 65 6e 74 20 61 6e 20 48 54 54 50 20 73 65 72  ment an HTTP ser
10400 76 65 72 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  ver process */. 
10410 20 69 6e 74 20 75 73 65 43 68 72 6f 6f 74 4a 61   int useChrootJa
10420 69 6c 20 3d 20 31 3b 20 20 20 20 2f 2a 20 54 72  il = 1;    /* Tr
10430 75 65 20 74 6f 20 75 73 65 20 61 20 63 68 61 6e  ue to use a chan
10440 67 65 2d 72 6f 6f 74 20 6a 61 69 6c 20 2a 2f 0a  ge-root jail */.
10450 20 20 73 74 72 75 63 74 20 70 61 73 73 77 64 20    struct passwd 
10460 2a 70 77 64 20 3d 20 30 3b 20 20 20 2f 2a 20 49  *pwd = 0;   /* I
10470 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
10480 20 74 68 65 20 75 73 65 72 20 2a 2f 0a 0a 20 20   the user */..  
10490 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 74 69  /* Record the ti
104a0 6d 65 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69  me when processi
104b0 6e 67 20 62 65 67 69 6e 73 2e 0a 20 20 2a 2f 0a  ng begins..  */.
104c0 20 20 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26    gettimeofday(&
104d0 62 65 67 69 6e 54 69 6d 65 2c 20 30 29 3b 0a 0a  beginTime, 0);..
104e0 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6d 6d 61    /* Parse comma
104f0 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74  nd-line argument
10500 73 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  s.  */.  while( 
10510 61 72 67 63 3e 31 20 26 26 20 61 72 67 76 5b 31  argc>1 && argv[1
10520 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  ][0]=='-' ){.   
10530 20 63 68 61 72 20 2a 7a 20 3d 20 61 72 67 76 5b   char *z = argv[
10540 31 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 41  1];.    char *zA
10550 72 67 20 3d 20 61 72 67 63 3e 3d 33 20 3f 20 61  rg = argc>=3 ? a
10560 72 67 76 5b 32 5d 20 3a 20 22 30 22 3b 0a 20 20  rgv[2] : "0";.  
10570 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20    if( z[0]=='-' 
10580 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a  && z[1]=='-' ) z
10590 2b 2b 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63  ++;.    if( strc
105a0 6d 70 28 7a 2c 22 2d 75 73 65 72 22 29 3d 3d 30  mp(z,"-user")==0
105b0 20 29 7b 0a 20 20 20 20 20 20 7a 50 65 72 6d 55   ){.      zPermU
105c0 73 65 72 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20  ser = zArg;.    
105d0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
105e0 28 7a 2c 22 2d 72 6f 6f 74 22 29 3d 3d 30 20 29  (z,"-root")==0 )
105f0 7b 0a 20 20 20 20 20 20 7a 52 6f 6f 74 20 3d 20  {.      zRoot = 
10600 7a 41 72 67 3b 0a 20 20 20 20 7d 65 6c 73 65 20  zArg;.    }else 
10610 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6c  if( strcmp(z,"-l
10620 6f 67 66 69 6c 65 22 29 3d 3d 30 20 29 7b 0a 20  ogfile")==0 ){. 
10630 20 20 20 20 20 7a 4c 6f 67 46 69 6c 65 20 3d 20       zLogFile = 
10640 7a 41 72 67 3b 0a 20 20 20 20 7d 65 6c 73 65 20  zArg;.    }else 
10650 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 68  if( strcmp(z,"-h
10660 74 74 70 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ttps")==0 ){.   
10670 20 20 20 75 73 65 48 74 74 70 73 20 3d 20 61 74     useHttps = at
10680 6f 69 28 7a 41 72 67 29 3b 0a 20 20 20 20 20 20  oi(zArg);.      
10690 7a 48 74 74 70 20 3d 20 75 73 65 48 74 74 70 73  zHttp = useHttps
106a0 20 3f 20 22 68 74 74 70 73 22 20 3a 20 22 68 74   ? "https" : "ht
106b0 74 70 22 3b 0a 20 20 20 20 20 20 69 66 28 20 75  tp";.      if( u
106c0 73 65 48 74 74 70 73 20 29 20 7a 52 65 6d 6f 74  seHttps ) zRemot
106d0 65 41 64 64 72 20 3d 20 67 65 74 65 6e 76 28 22  eAddr = getenv("
106e0 52 45 4d 4f 54 45 5f 48 4f 53 54 22 29 3b 0a 20  REMOTE_HOST");. 
106f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
10700 63 6d 70 28 7a 2c 20 22 2d 70 6f 72 74 22 29 3d  cmp(z, "-port")=
10710 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 50 6f 72  =0 ){.      zPor
10720 74 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 20 20  t = zArg;.      
10730 73 74 61 6e 64 61 6c 6f 6e 65 20 3d 20 31 3b 0a  standalone = 1;.
10740 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
10750 72 63 6d 70 28 7a 2c 20 22 2d 66 61 6d 69 6c 79  rcmp(z, "-family
10760 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
10770 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20  f( strcmp(zArg, 
10780 22 69 70 76 34 22 29 3d 3d 30 20 29 7b 0a 20 20  "ipv4")==0 ){.  
10790 20 20 20 20 20 20 69 70 76 34 4f 6e 6c 79 20 3d        ipv4Only =
107a0 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
107b0 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
107c0 20 22 69 70 76 36 22 29 3d 3d 30 20 29 7b 0a 20   "ipv6")==0 ){. 
107d0 20 20 20 20 20 20 20 69 70 76 36 4f 6e 6c 79 20         ipv6Only 
107e0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
107f0 7b 0a 20 20 20 20 20 20 20 20 4d 61 6c 66 75 6e  {.        Malfun
10800 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20  ction(__LINE__, 
10810 20 2f 2a 20 4c 4f 47 3a 20 75 6e 6b 6e 6f 77 6e   /* LOG: unknown
10820 20 49 50 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a   IP protocol */.
10830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10840 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 49 50 20      "unknown IP 
10850 70 72 6f 74 6f 63 6f 6c 3a 20 5b 25 73 5d 22 2c  protocol: [%s]",
10860 20 7a 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a   zArg);.      }.
10870 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
10880 72 63 6d 70 28 7a 2c 20 22 2d 6a 61 69 6c 22 29  rcmp(z, "-jail")
10890 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
108a0 20 61 74 6f 69 28 7a 41 72 67 29 3d 3d 30 20 29   atoi(zArg)==0 )
108b0 7b 0a 20 20 20 20 20 20 20 20 75 73 65 43 68 72  {.        useChr
108c0 6f 6f 74 4a 61 69 6c 20 3d 20 30 3b 0a 20 20 20  ootJail = 0;.   
108d0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
108e0 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 64  f( strcmp(z, "-d
108f0 65 62 75 67 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ebug")==0 ){.   
10900 20 20 20 69 66 28 20 61 74 6f 69 28 7a 41 72 67     if( atoi(zArg
10910 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75 73 65  ) ){.        use
10920 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 20 20 20  Timeout = 0;.   
10930 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
10940 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f        Malfunctio
10950 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a 20 4c  n(__LINE__, /* L
10960 4f 47 3a 20 75 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d  OG: unknown comm
10970 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e  and-line argumen
10980 74 20 6f 6e 20 6c 61 75 6e 63 68 20 2a 2f 0a 20  t on launch */. 
10990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109a0 20 22 75 6e 6b 6e 6f 77 6e 20 61 72 67 75 6d 65   "unknown argume
109b0 6e 74 3a 20 5b 25 73 5d 22 2c 20 7a 29 3b 0a 20  nt: [%s]", z);. 
109c0 20 20 20 7d 0a 20 20 20 20 61 72 67 76 20 2b 3d     }.    argv +=
109d0 20 32 3b 0a 20 20 20 20 61 72 67 63 20 2d 3d 20   2;.    argc -= 
109e0 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 52 6f  2;.  }.  if( zRo
109f0 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ot==0 ){.    if(
10a00 20 73 74 61 6e 64 61 6c 6f 6e 65 20 29 7b 0a 20   standalone ){. 
10a10 20 20 20 20 20 7a 52 6f 6f 74 20 3d 20 22 2e 22       zRoot = "."
10a20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10a30 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f     Malfunction(_
10a40 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a 20 4c 4f 47 3a  _LINE__, /* LOG:
10a50 20 2d 2d 72 6f 6f 74 20 61 72 67 75 6d 65 6e 74   --root argument
10a60 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 20 20   missing */.    
10a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 6e                "n
10a80 6f 20 2d 2d 72 6f 6f 74 20 73 70 65 63 69 66 69  o --root specifi
10a90 65 64 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ed");.    }.  }.
10aa0 20 20 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 64    .  /* Change d
10ab0 69 72 65 63 74 6f 72 69 65 73 20 74 6f 20 74 68  irectories to th
10ac0 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 48 54  e root of the HT
10ad0 54 50 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20  TP filesystem.  
10ae0 54 68 65 6e 0a 20 20 2a 2a 20 63 72 65 61 74 65  Then.  ** create
10af0 20 61 20 63 68 72 6f 6f 74 20 6a 61 69 6c 20 74   a chroot jail t
10b00 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  here..  */.  if(
10b10 20 63 68 64 69 72 28 7a 52 6f 6f 74 29 21 3d 30   chdir(zRoot)!=0
10b20 20 29 7b 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74   ){.    Malfunct
10b30 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a  ion(__LINE__, /*
10b40 20 4c 4f 47 3a 20 63 68 64 69 72 28 29 20 66 61   LOG: chdir() fa
10b50 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  iled */.        
10b60 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20          "cannot 
10b70 63 68 61 6e 67 65 20 74 6f 20 64 69 72 65 63 74  change to direct
10b80 6f 72 79 20 5b 25 73 5d 22 2c 20 7a 52 6f 6f 74  ory [%s]", zRoot
10b90 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74  );.  }..  /* Get
10ba0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
10bb0 75 74 20 74 68 65 20 75 73 65 72 20 69 66 20 61  ut the user if a
10bc0 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 66  vailable */.  if
10bd0 28 20 7a 50 65 72 6d 55 73 65 72 20 29 20 70 77  ( zPermUser ) pw
10be0 64 20 3d 20 67 65 74 70 77 6e 61 6d 28 7a 50 65  d = getpwnam(zPe
10bf0 72 6d 55 73 65 72 29 3b 0a 0a 20 20 2f 2a 20 45  rmUser);..  /* E
10c00 6e 74 65 72 20 74 68 65 20 63 68 72 6f 6f 74 20  nter the chroot 
10c10 6a 61 69 6c 20 69 66 20 72 65 71 75 65 73 74 65  jail if requeste
10c20 64 20 2a 2f 20 20 0a 20 20 69 66 28 20 7a 50 65  d */  .  if( zPe
10c30 72 6d 55 73 65 72 20 26 26 20 75 73 65 43 68 72  rmUser && useChr
10c40 6f 6f 74 4a 61 69 6c 20 26 26 20 67 65 74 75 69  ootJail && getui
10c50 64 28 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  d()==0 ){.    if
10c60 28 20 63 68 72 6f 6f 74 28 22 2e 22 29 3c 30 20  ( chroot(".")<0 
10c70 29 7b 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e 63  ){.      Malfunc
10c80 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 2f  tion(__LINE__, /
10c90 2a 20 4c 4f 47 3a 20 63 68 72 6f 6f 74 28 29 20  * LOG: chroot() 
10ca0 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 22 75 6e 61              "una
10cc0 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 63 68  ble to create ch
10cd0 72 6f 6f 74 20 6a 61 69 6c 22 29 3b 0a 20 20 20  root jail");.   
10ce0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 52   }else{.      zR
10cf0 6f 6f 74 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a  oot = "";.    }.
10d00 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 74 69 76 61    }..  /* Activa
10d10 74 65 20 74 68 65 20 73 65 72 76 65 72 2c 20 69  te the server, i
10d20 66 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20  f requested */. 
10d30 20 69 66 28 20 7a 50 6f 72 74 20 26 26 20 68 74   if( zPort && ht
10d40 74 70 5f 73 65 72 76 65 72 28 7a 50 6f 72 74 2c  tp_server(zPort,
10d50 20 30 29 20 29 7b 0a 20 20 20 20 4d 61 6c 66 75   0) ){.    Malfu
10d60 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c  nction(__LINE__,
10d70 20 2f 2a 20 4c 4f 47 3a 20 73 65 72 76 65 72 20   /* LOG: server 
10d80 73 74 61 72 74 75 70 20 66 61 69 6c 65 64 20 2a  startup failed *
10d90 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
10da0 20 20 22 66 61 69 6c 65 64 20 74 6f 20 73 74 61    "failed to sta
10db0 72 74 20 73 65 72 76 65 72 22 29 3b 0a 20 20 7d  rt server");.  }
10dc0 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 72 6f 6f 74  ..  /* Drop root
10dd0 20 70 72 69 76 69 6c 65 67 65 73 2e 0a 20 20 2a   privileges..  *
10de0 2f 0a 20 20 69 66 28 20 7a 50 65 72 6d 55 73 65  /.  if( zPermUse
10df0 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 77 64  r ){.    if( pwd
10e00 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 65   ){.      if( se
10e10 74 67 69 64 28 70 77 64 2d 3e 70 77 5f 67 69 64  tgid(pwd->pw_gid
10e20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 61 6c  ) ){.        Mal
10e30 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f  function(__LINE_
10e40 5f 2c 20 2f 2a 20 4c 4f 47 3a 20 73 65 74 67 69  _, /* LOG: setgi
10e50 64 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  d() failed */.  
10e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e70 20 20 22 63 61 6e 6e 6f 74 20 73 65 74 20 67 72    "cannot set gr
10e80 6f 75 70 2d 69 64 20 74 6f 20 25 64 22 2c 20 70  oup-id to %d", p
10e90 77 64 2d 3e 70 77 5f 67 69 64 29 3b 0a 20 20 20  wd->pw_gid);.   
10ea0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
10eb0 65 74 75 69 64 28 70 77 64 2d 3e 70 77 5f 75 69  etuid(pwd->pw_ui
10ec0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 61  d) ){.        Ma
10ed0 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45  lfunction(__LINE
10ee0 5f 5f 2c 20 2f 2a 20 4c 4f 47 3a 20 73 65 74 75  __, /* LOG: setu
10ef0 69 64 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20  id() failed */. 
10f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f10 20 20 20 22 63 61 6e 6e 6f 74 20 73 65 74 20 75     "cannot set u
10f20 73 65 72 2d 69 64 20 74 6f 20 25 64 22 2c 20 70  ser-id to %d", p
10f30 77 64 2d 3e 70 77 5f 75 69 64 29 3b 0a 20 20 20  wd->pw_uid);.   
10f40 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
10f50 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f        Malfunctio
10f60 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 2f 2a 20 4c  n(__LINE__, /* L
10f70 4f 47 3a 20 75 6e 6b 6e 6f 77 6e 20 75 73 65 72  OG: unknown user
10f80 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
10f90 20 20 20 20 20 20 22 6e 6f 20 73 75 63 68 20 75        "no such u
10fa0 73 65 72 20 5b 25 73 5d 22 2c 20 7a 50 65 72 6d  ser [%s]", zPerm
10fb0 55 73 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  User);.    }.  }
10fc0 0a 20 20 69 66 28 20 67 65 74 75 69 64 28 29 3d  .  if( getuid()=
10fd0 3d 30 20 29 7b 0a 20 20 20 20 4d 61 6c 66 75 6e  =0 ){.    Malfun
10fe0 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20  ction(__LINE__, 
10ff0 2f 2a 20 4c 4f 47 3a 20 63 61 6e 6e 6f 74 20 72  /* LOG: cannot r
11000 75 6e 20 61 73 20 72 6f 6f 74 20 2a 2f 0a 20 20  un as root */.  
11010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
11020 61 6e 6e 6f 74 20 72 75 6e 20 61 73 20 72 6f 6f  annot run as roo
11030 74 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  t");.  }..  /* G
11040 65 74 20 74 68 65 20 49 50 20 61 64 64 72 65 73  et the IP addres
11050 73 20 66 72 6f 6d 20 77 68 65 6e 63 65 20 74 68  s from whence th
11060 65 20 72 65 71 75 65 73 74 20 6f 72 69 67 69 6e  e request origin
11070 61 74 65 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ates.  */.  if( 
11080 7a 52 65 6d 6f 74 65 41 64 64 72 3d 3d 30 20 29  zRemoteAddr==0 )
11090 7b 0a 20 20 20 20 61 64 64 72 65 73 73 20 72 65  {.    address re
110a0 6d 6f 74 65 41 64 64 72 3b 0a 20 20 20 20 75 6e  moteAddr;.    un
110b0 73 69 67 6e 65 64 20 69 6e 74 20 73 69 7a 65 20  signed int size 
110c0 3d 20 73 69 7a 65 6f 66 28 72 65 6d 6f 74 65 41  = sizeof(remoteA
110d0 64 64 72 29 3b 0a 20 20 20 20 63 68 61 72 20 7a  ddr);.    char z
110e0 48 6f 73 74 5b 4e 49 5f 4d 41 58 48 4f 53 54 5d  Host[NI_MAXHOST]
110f0 3b 0a 20 20 20 20 69 66 28 20 67 65 74 70 65 65  ;.    if( getpee
11100 72 6e 61 6d 65 28 30 2c 20 26 72 65 6d 6f 74 65  rname(0, &remote
11110 41 64 64 72 2e 73 61 2c 20 26 73 69 7a 65 29 3e  Addr.sa, &size)>
11120 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 65 74 6e  =0 ){.      getn
11130 61 6d 65 69 6e 66 6f 28 26 72 65 6d 6f 74 65 41  ameinfo(&remoteA
11140 64 64 72 2e 73 61 2c 20 73 69 7a 65 2c 20 7a 48  ddr.sa, size, zH
11150 6f 73 74 2c 20 73 69 7a 65 6f 66 28 7a 48 6f 73  ost, sizeof(zHos
11160 74 29 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  t), 0, 0,.      
11170 20 20 20 20 20 20 20 20 20 20 20 20 4e 49 5f 4e              NI_N
11180 55 4d 45 52 49 43 48 4f 53 54 29 3b 0a 20 20 20  UMERICHOST);.   
11190 20 20 20 7a 52 65 6d 6f 74 65 41 64 64 72 20 3d     zRemoteAddr =
111a0 20 53 74 72 44 75 70 28 7a 48 6f 73 74 29 3b 0a   StrDup(zHost);.
111b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
111c0 50 72 6f 63 65 73 73 20 74 68 65 20 69 6e 70 75  Process the inpu
111d0 74 20 73 74 72 65 61 6d 20 2a 2f 0a 20 20 66 6f  t stream */.  fo
111e0 72 28 69 3d 30 3b 20 69 3c 31 30 30 3b 20 69 2b  r(i=0; i<100; i+
111f0 2b 29 7b 0a 20 20 20 20 50 72 6f 63 65 73 73 4f  +){.    ProcessO
11200 6e 65 52 65 71 75 65 73 74 28 30 29 3b 0a 20 20  neRequest(0);.  
11210 7d 0a 20 20 50 72 6f 63 65 73 73 4f 6e 65 52 65  }.  ProcessOneRe
11220 71 75 65 73 74 28 31 29 3b 0a 20 20 65 78 69 74  quest(1);.  exit
11230 28 30 29 3b 0a 7d 0a                             (0);.}.