Documentation Source Text

Hex Artifact Content
Login

Artifact cb576b23cd0debd65e42e320affc440337a70f31:


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 0a 2a 2a 20 20 20 20 20 2a 20 4f 6e 65 20  td.**     * One 
0060: 70 72 6f 63 65 73 73 20 70 65 72 20 72 65 71 75  process per requ
0070: 65 73 74 0a 2a 2a 20 20 20 20 20 2a 20 44 65 6c  est.**     * Del
0080: 69 76 65 72 20 73 74 61 74 69 63 20 63 6f 6e 74  iver static cont
0090: 65 6e 74 20 6f 72 20 72 75 6e 20 43 47 49 0a 2a  ent or run CGI.*
00a0: 2a 20 20 20 20 20 2a 20 56 69 72 74 75 61 6c 20  *     * Virtual 
00b0: 73 69 74 65 73 20 62 61 73 65 64 20 6f 6e 20 74  sites based on t
00c0: 68 65 20 22 48 6f 73 74 3a 22 20 70 72 6f 70 65  he "Host:" prope
00d0: 72 74 79 20 6f 66 20 74 68 65 20 48 54 54 50 20  rty of the HTTP 
00e0: 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 2a 20  header.**     * 
00f0: 56 65 72 79 20 73 6d 61 6c 6c 20 63 6f 64 65 20  Very small code 
0100: 62 61 73 65 20 28 31 20 66 69 6c 65 29 20 74 6f  base (1 file) to
0110: 20 66 61 63 69 6c 69 74 61 74 65 20 73 65 63 75   facilitate secu
0120: 72 69 74 79 20 61 75 64 69 74 69 6e 67 0a 2a 2a  rity auditing.**
0130: 20 20 20 20 20 2a 20 53 69 6d 70 6c 65 20 73 65       * Simple se
0140: 74 75 70 20 2d 20 6e 6f 20 63 6f 6e 66 69 67 75  tup - no configu
0150: 72 61 74 69 6f 6e 20 66 69 6c 65 73 20 74 6f 20  ration files to 
0160: 6d 65 73 73 20 77 69 74 68 2e 0a 2a 2a 20 0a 2a  mess with..** .*
0170: 2a 20 54 68 69 73 20 66 69 6c 65 20 69 6d 70 6c  * This file impl
0180: 65 6d 65 6e 74 73 20 61 20 73 6d 61 6c 6c 20 61  ements a small a
0190: 6e 64 20 73 69 6d 70 6c 65 20 62 75 74 20 73 65  nd simple but se
01a0: 63 75 72 65 20 61 6e 64 20 65 66 66 65 63 74 69  cure and effecti
01b0: 76 65 20 77 65 62 0a 2a 2a 20 73 65 72 76 65 72  ve web.** server
01c0: 2e 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  .  There are no 
01d0: 66 72 69 6c 6c 73 2e 20 20 41 6e 79 74 68 69 6e  frills.  Anythin
01e0: 67 20 74 68 61 74 20 63 6f 75 6c 64 20 62 65 20  g that could be 
01f0: 72 65 61 73 6f 6e 61 62 6c 79 0a 2a 2a 20 6f 6d  reasonably.** om
0200: 69 74 74 65 64 20 68 61 73 20 62 65 65 6e 2e 0a  itted has been..
0210: 2a 2a 0a 2a 2a 20 53 65 74 75 70 20 72 75 6c 65  **.** Setup rule
0220: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  s:.**.**    (1) 
0230: 4c 61 75 6e 63 68 20 61 73 20 72 6f 6f 74 20 66  Launch as root f
0240: 72 6f 6d 20 69 6e 65 74 64 20 6c 69 6b 65 20 74  rom inetd like t
0250: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
0260: 20 20 20 20 20 20 68 74 74 70 64 20 2d 6c 6f 67        httpd -log
0270: 66 69 6c 65 20 6c 6f 67 66 69 6c 65 20 2d 72 6f  file logfile -ro
0280: 6f 74 20 2f 68 6f 6d 65 2f 77 77 77 20 2d 75 73  ot /home/www -us
0290: 65 72 20 6e 6f 62 6f 64 79 0a 2a 2a 0a 2a 2a 20  er nobody.**.** 
02a0: 20 20 20 20 20 20 20 49 74 20 77 69 6c 6c 20 61         It will a
02b0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 72  utomatically chr
02c0: 6f 6f 74 20 74 6f 20 2f 68 6f 6d 65 2f 77 77 77  oot to /home/www
02d0: 20 61 6e 64 20 62 65 63 6f 6d 65 20 75 73 65 72   and become user
02e0: 20 6e 6f 62 6f 64 79 2e 0a 2a 2a 20 20 20 20 20   nobody..**     
02f0: 20 20 20 54 68 65 20 6c 6f 67 66 69 6c 65 20 6e     The logfile n
0300: 61 6d 65 20 73 68 6f 75 6c 64 20 62 65 20 72 65  ame should be re
0310: 6c 61 74 69 76 65 20 74 6f 20 74 68 65 20 63 68  lative to the ch
0320: 72 6f 6f 74 20 6a 61 69 6c 2e 0a 2a 2a 0a 2a 2a  root jail..**.**
0330: 20 20 20 20 28 32 29 20 44 69 72 65 63 74 6f 72      (2) Director
0340: 69 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ies of the form 
0350: 22 2a 2e 77 65 62 73 69 74 65 22 20 28 65 78 3a  "*.website" (ex:
0360: 20 77 77 77 5f 68 77 61 63 69 5f 63 6f 6d 2e 77   www_hwaci_com.w
0370: 65 62 73 69 74 65 29 0a 2a 2a 20 20 20 20 20 20  ebsite).**      
0380: 20 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e    contain conten
0390: 74 2e 20 20 54 68 65 20 64 69 72 65 63 74 6f 72  t.  The director
03a0: 79 20 69 73 20 63 68 6f 73 65 6e 20 62 61 73 65  y is chosen base
03b0: 64 20 6f 6e 20 48 4f 53 54 2e 20 20 49 66 20 6e  d on HOST.  If n
03c0: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 48 4f 53 54  o.**        HOST
03d0: 20 6f 72 20 74 68 65 20 68 6f 73 74 20 64 69 72   or the host dir
03e0: 65 63 74 6f 72 79 20 69 73 20 6e 6f 74 20 66 6f  ectory is not fo
03f0: 75 6e 64 2c 20 22 64 65 66 61 75 6c 74 2e 77 65  und, "default.we
0400: 62 73 69 74 65 22 20 69 73 20 75 73 65 64 2e 0a  bsite" is used..
0410: 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 41 6e 79  **.**    (3) Any
0420: 20 66 69 6c 65 20 6f 72 20 64 69 72 65 63 74 6f   file or directo
0430: 72 79 20 77 68 6f 73 65 20 6e 61 6d 65 20 62 65  ry whose name be
0440: 67 69 6e 73 20 77 69 74 68 20 22 2e 22 20 6f 72  gins with "." or
0450: 20 22 2d 22 20 69 73 20 69 67 6e 6f 72 65 64 2e   "-" is ignored.
0460: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 43 68  .**.**    (4) Ch
0470: 61 72 61 63 74 65 72 73 20 6f 74 68 65 72 20 74  aracters other t
0480: 68 61 6e 20 61 2d 7a 41 2d 5a 30 2d 39 5f 2e 2c  han a-zA-Z0-9_.,
0490: 2a 7e 2f 20 69 6e 20 74 68 65 20 66 69 6c 65 6e  *~/ in the filen
04a0: 61 6d 65 20 61 72 65 20 74 72 61 6e 73 6c 61 74  ame are translat
04b0: 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 69 6e 74  ed.**        int
04c0: 6f 20 5f 2e 20 20 54 68 69 73 20 69 73 20 61 20  o _.  This is a 
04d0: 64 65 66 65 6e 73 65 20 61 67 61 69 6e 73 74 20  defense against 
04e0: 63 72 6f 73 73 2d 73 69 74 65 20 73 63 72 69 70  cross-site scrip
04f0: 74 69 6e 67 20 61 74 74 61 63 6b 73 20 61 6e 64  ting attacks and
0500: 0a 2a 2a 20 20 20 20 20 20 20 20 6f 74 68 65 72  .**        other
0510: 20 6d 69 73 63 68 69 65 66 2e 0a 2a 2a 0a 2a 2a   mischief..**.**
0520: 20 20 20 20 28 35 29 20 45 78 65 63 75 74 61 62      (5) Executab
0530: 6c 65 20 66 69 6c 65 73 20 61 72 65 20 72 75 6e  le files are run
0540: 20 61 73 20 43 47 49 2e 20 20 41 6c 6c 20 6f 74   as CGI.  All ot
0550: 68 65 72 20 66 69 6c 65 73 20 61 72 65 20 64 65  her files are de
0560: 6c 69 76 65 72 65 64 0a 2a 2a 20 20 20 20 20 20  livered.**      
0570: 20 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 20    as is..**.**  
0580: 20 20 28 36 29 20 46 6f 72 20 53 53 4c 20 73 75    (6) For SSL su
0590: 70 70 6f 72 74 20 75 73 65 20 73 74 75 6e 6e 65  pport use stunne
05a0: 6c 20 61 6e 64 20 61 64 64 20 74 68 65 20 2d 68  l and add the -h
05b0: 74 74 70 73 20 31 20 6f 70 74 69 6f 6e 20 6f 6e  ttps 1 option on
05c0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 68   the.**        h
05d0: 74 74 70 64 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  ttpd command-lin
05e0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 37 29 20  e..**.**    (7) 
05f0: 49 66 20 61 20 66 69 6c 65 20 6e 61 6d 65 64 20  If a file named 
0600: 22 2d 61 75 74 68 22 20 65 78 69 73 74 73 20 69  "-auth" exists i
0610: 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63  n the same direc
0620: 74 6f 72 79 20 61 73 20 66 69 6c 65 20 74 6f 0a  tory as file to.
0630: 2a 2a 20 20 20 20 20 20 20 20 62 65 20 72 75 6e  **        be run
0640: 20 61 73 20 43 47 49 20 6f 72 20 74 6f 20 62 65   as CGI or to be
0650: 20 64 65 6c 69 76 65 72 65 64 2c 20 74 68 65 6e   delivered, then
0660: 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 69 6e 66   it contains inf
0670: 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  ormation.**     
0680: 20 20 20 66 6f 72 20 48 54 54 50 20 42 61 73 69     for HTTP Basi
0690: 63 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 2e  c authorization.
06a0: 20 20 53 65 65 20 66 69 6c 65 20 66 6f 72 6d 61    See file forma
06b0: 74 20 64 65 74 61 69 6c 73 20 62 65 6c 6f 77 2e  t details below.
06c0: 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 42 61 73 69 63 20  .**.**.** Basic 
06d0: 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e 3a 0a 2a  Authorization:.*
06e0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
06f0: 20 22 2d 61 75 74 68 22 20 65 78 69 73 74 73 20   "-auth" exists 
0700: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65  in the same dire
0710: 63 74 6f 72 79 20 61 73 20 74 68 65 20 63 6f 6e  ctory as the con
0720: 74 65 6e 74 20 66 69 6c 65 0a 2a 2a 20 28 66 6f  tent file.** (fo
0730: 72 20 62 6f 74 68 20 73 74 61 74 69 63 20 63 6f  r both static co
0740: 6e 74 65 6e 74 20 61 6e 64 20 43 47 49 29 20 74  ntent and CGI) t
0750: 68 65 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  hen it contains 
0760: 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
0770: 75 73 65 64 0a 2a 2a 20 66 6f 72 20 62 61 73 69  used.** for basi
0780: 63 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 2e  c authorization.
0790: 20 20 54 68 65 20 66 69 6c 65 20 66 6f 72 6d 61    The file forma
07a0: 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t is as follows:
07b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 42 6c 61  .**.**    *  Bla
07c0: 6e 6b 20 6c 69 6e 65 73 20 61 6e 64 20 6c 69 6e  nk lines and lin
07d0: 65 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  es that begin wi
07e0: 74 68 20 27 23 27 20 61 72 65 20 69 67 6e 6f 72  th '#' are ignor
07f0: 65 64 0a 2a 2a 20 20 20 20 2a 20 20 22 68 74 74  ed.**    *  "htt
0800: 70 2d 72 65 64 69 72 65 63 74 22 20 66 6f 72 63  p-redirect" forc
0810: 65 73 20 61 20 72 65 64 69 72 65 63 74 20 74 6f  es a redirect to
0820: 20 48 54 54 50 53 20 69 66 20 6e 6f 74 20 74 68   HTTPS if not th
0830: 65 72 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 20  ere already.**  
0840: 20 20 2a 20 20 22 68 74 74 70 73 2d 6f 6e 6c 79    *  "https-only
0850: 22 20 64 69 73 61 6c 6c 6f 77 73 20 6f 70 65 72  " disallows oper
0860: 61 74 69 6f 6e 20 69 6e 20 48 54 54 50 0a 2a 2a  ation in HTTP.**
0870: 20 20 20 20 2a 20 20 22 75 73 65 72 20 4e 41 4d      *  "user NAM
0880: 45 20 4c 4f 47 49 4e 3a 50 41 53 53 57 4f 52 44  E LOGIN:PASSWORD
0890: 22 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  " checks to see 
08a0: 69 66 20 4c 4f 47 49 4e 3a 50 41 53 53 57 4f 52  if LOGIN:PASSWOR
08b0: 44 20 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 68  D .**       auth
08c0: 6f 72 69 7a 61 74 69 6f 6e 20 63 72 65 64 65 6e  orization creden
08d0: 74 69 61 6c 73 20 61 72 65 20 70 72 6f 76 69 64  tials are provid
08e0: 65 64 2c 20 61 6e 64 20 69 66 20 73 6f 20 73 65  ed, and if so se
08f0: 74 73 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  ts the.**       
0900: 52 45 4d 4f 54 45 5f 55 53 45 52 20 74 6f 20 4e  REMOTE_USER to N
0910: 41 4d 45 2e 0a 2a 2a 20 20 20 20 2a 20 20 22 72  AME..**    *  "r
0920: 65 61 6c 6d 20 54 45 58 54 22 20 73 65 74 73 20  ealm TEXT" sets 
0930: 74 68 65 20 72 65 61 6c 6d 20 74 6f 20 54 45 58  the realm to TEX
0940: 54 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 63  T..**.** There c
0950: 61 6e 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 22  an be multiple "
0960: 75 73 65 72 22 20 6c 69 6e 65 73 2e 20 20 49 66  user" lines.  If
0970: 20 6e 6f 20 22 75 73 65 72 22 20 6c 69 6e 65 20   no "user" line 
0980: 6d 61 74 63 68 65 73 2c 20 74 68 65 0a 2a 2a 20  matches, the.** 
0990: 72 65 71 75 65 73 74 20 66 61 69 6c 73 20 77 69  request fails wi
09a0: 74 68 20 61 20 34 30 31 20 65 72 72 6f 72 2e 0a  th a 401 error..
09b0: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  */.#include <std
09c0: 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  io.h>.#include <
09d0: 63 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  ctype.h>.#includ
09e0: 65 20 3c 73 79 73 6c 6f 67 2e 68 3e 0a 23 69 6e  e <syslog.h>.#in
09f0: 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e  clude <stdlib.h>
0a00: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73  .#include <sys/s
0a10: 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  tat.h>.#include 
0a20: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
0a30: 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69  ude <fcntl.h>.#i
0a40: 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68  nclude <string.h
0a50: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 70 77 64 2e  >.#include <pwd.
0a60: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
0a70: 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  /time.h>.#includ
0a80: 65 20 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a  e <sys/types.h>.
0a90: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 6f  #include <sys/so
0aa0: 63 6b 65 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  cket.h>.#include
0ab0: 20 3c 73 79 73 2f 77 61 69 74 2e 68 3e 0a 23 69   <sys/wait.h>.#i
0ac0: 6e 63 6c 75 64 65 20 3c 6e 65 74 69 6e 65 74 2f  nclude <netinet/
0ad0: 69 6e 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  in.h>.#include <
0ae0: 61 72 70 61 2f 69 6e 65 74 2e 68 3e 0a 23 69 6e  arpa/inet.h>.#in
0af0: 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e  clude <stdarg.h>
0b00: 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e  .#include <time.
0b10: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
0b20: 2f 74 69 6d 65 73 2e 68 3e 0a 23 69 6e 63 6c 75  /times.h>.#inclu
0b30: 64 65 20 3c 6e 65 74 64 62 2e 68 3e 0a 23 69 6e  de <netdb.h>.#in
0b40: 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a  clude <errno.h>.
0b50: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 72 65  #include <sys/re
0b60: 73 6f 75 72 63 65 2e 68 3e 0a 23 69 66 64 65 66  source.h>.#ifdef
0b70: 20 6c 69 6e 75 78 0a 23 69 6e 63 6c 75 64 65 20   linux.#include 
0b80: 3c 73 79 73 2f 73 65 6e 64 66 69 6c 65 2e 68 3e  <sys/sendfile.h>
0b90: 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65  .#endif.#include
0ba0: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 2f 2a 0a   <assert.h>../*.
0bb0: 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65  ** Configure the
0bc0: 20 73 65 72 76 65 72 20 62 79 20 73 65 74 74 69   server by setti
0bd0: 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
0be0: 20 6d 61 63 72 6f 73 20 61 6e 64 20 72 65 63 6f   macros and reco
0bf0: 6d 70 69 6c 69 6e 67 2e 0a 2a 2f 0a 23 69 66 6e  mpiling..*/.#ifn
0c00: 64 65 66 20 44 45 46 41 55 4c 54 5f 50 4f 52 54  def DEFAULT_PORT
0c10: 0a 23 64 65 66 69 6e 65 20 44 45 46 41 55 4c 54  .#define DEFAULT
0c20: 5f 50 4f 52 54 20 22 38 30 22 0a 23 65 6e 64 69  _PORT "80".#endi
0c30: 66 0a 23 69 66 6e 64 65 66 20 4d 41 58 5f 43 4f  f.#ifndef MAX_CO
0c40: 4e 54 45 4e 54 5f 4c 45 4e 47 54 48 0a 23 64 65  NTENT_LENGTH.#de
0c50: 66 69 6e 65 20 4d 41 58 5f 43 4f 4e 54 45 4e 54  fine MAX_CONTENT
0c60: 5f 4c 45 4e 47 54 48 20 39 30 30 30 30 30 30 0a  _LENGTH 9000000.
0c70: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65  #endif../*.** We
0c80: 20 72 65 63 6f 72 64 20 6d 6f 73 74 20 6f 66 20   record most of 
0c90: 74 68 65 20 73 74 61 74 65 20 69 6e 66 6f 72 6d  the state inform
0ca0: 61 74 69 6f 6e 20 61 73 20 67 6c 6f 62 61 6c 20  ation as global 
0cb0: 76 61 72 69 61 62 6c 65 73 2e 20 20 54 68 69 73  variables.  This
0cc0: 0a 2a 2a 20 73 61 76 65 73 20 68 61 76 69 6e 67  .** saves having
0cd0: 20 74 6f 20 70 61 73 73 20 69 6e 66 6f 72 6d 61   to pass informa
0ce0: 74 69 6f 6e 20 74 6f 20 73 75 62 72 6f 75 74 69  tion to subrouti
0cf0: 6e 65 73 20 61 73 20 70 61 72 61 6d 65 74 65 72  nes as parameter
0d00: 73 2c 20 61 6e 64 0a 2a 2a 20 6d 61 6b 65 73 20  s, and.** makes 
0d10: 74 68 65 20 65 78 65 63 75 74 61 62 6c 65 20 73  the executable s
0d20: 6d 61 6c 6c 65 72 2e 2e 2e 0a 2a 2f 0a 73 74 61  maller....*/.sta
0d30: 74 69 63 20 63 68 61 72 20 2a 7a 52 6f 6f 74 20  tic char *zRoot 
0d40: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
0d50: 20 52 6f 6f 74 20 64 69 72 65 63 74 6f 72 79 20   Root directory 
0d60: 6f 66 20 74 68 65 20 77 65 62 73 69 74 65 20 2a  of the website *
0d70: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a  /.static char *z
0d80: 54 6d 70 4e 61 6d 20 3d 20 30 3b 20 20 20 20 20  TmpNam = 0;     
0d90: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20     /* Name of a 
0da0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a  temporary file *
0db0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 54  /.static char zT
0dc0: 6d 70 4e 61 6d 42 75 66 5b 35 30 30 5d 3b 20 20  mpNamBuf[500];  
0dd0: 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68     /* Space to h
0de0: 6f 6c 64 20 74 68 65 20 74 65 6d 70 6f 72 61 72  old the temporar
0df0: 79 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 73 74  y filename */.st
0e00: 61 74 69 63 20 63 68 61 72 20 2a 7a 50 72 6f 74  atic char *zProt
0e10: 6f 63 6f 6c 20 3d 20 30 3b 20 20 20 20 20 20 2f  ocol = 0;      /
0e20: 2a 20 54 68 65 20 70 72 6f 74 6f 63 6f 6c 20 62  * The protocol b
0e30: 65 69 6e 67 20 75 73 69 6e 67 20 62 79 20 74 68  eing using by th
0e40: 65 20 62 72 6f 77 73 65 72 20 2a 2f 0a 73 74 61  e browser */.sta
0e50: 74 69 63 20 63 68 61 72 20 2a 7a 4d 65 74 68 6f  tic char *zMetho
0e60: 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  d = 0;        /*
0e70: 20 54 68 65 20 6d 65 74 68 6f 64 2e 20 20 4d 75   The method.  Mu
0e80: 73 74 20 62 65 20 47 45 54 20 2a 2f 0a 73 74 61  st be GET */.sta
0e90: 74 69 63 20 63 68 61 72 20 2a 7a 53 63 72 69 70  tic char *zScrip
0ea0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  t = 0;        /*
0eb0: 20 54 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 72   The object to r
0ec0: 65 74 72 69 65 76 65 20 2a 2f 0a 73 74 61 74 69  etrieve */.stati
0ed0: 63 20 63 68 61 72 20 2a 7a 52 65 61 6c 53 63 72  c char *zRealScr
0ee0: 69 70 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 54  ipt = 0;    /* T
0ef0: 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74  he object to ret
0f00: 72 69 65 76 65 2e 20 20 53 61 6d 65 20 61 73 20  rieve.  Same as 
0f10: 7a 53 63 72 69 70 74 0a 20 20 20 20 20 20 20 20  zScript.        
0f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f30: 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 63 65           ** exce
0f40: 70 74 20 6d 69 67 68 74 20 68 61 76 65 20 22 2f  pt might have "/
0f50: 69 6e 64 65 78 2e 68 74 6d 6c 22 20 61 70 70 65  index.html" appe
0f60: 6e 64 65 64 20 2a 2f 0a 73 74 61 74 69 63 20 63  nded */.static c
0f70: 68 61 72 20 2a 7a 48 6f 6d 65 20 3d 20 30 3b 20  har *zHome = 0; 
0f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0f90: 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69  directory contai
0fa0: 6e 69 6e 67 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  ning content */.
0fb0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 51 75  static char *zQu
0fc0: 65 72 79 53 74 72 69 6e 67 20 3d 20 30 3b 20 20  eryString = 0;  
0fd0: 20 2f 2a 20 54 68 65 20 71 75 65 72 79 20 73 74   /* The query st
0fe0: 72 69 6e 67 20 6f 6e 20 74 68 65 20 65 6e 64 20  ring on the end 
0ff0: 6f 66 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 73  of the name */.s
1000: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 46 69 6c  tatic char *zFil
1010: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
1020: 2f 2a 20 54 68 65 20 66 69 6c 65 6e 61 6d 65 20  /* The filename 
1030: 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f  of the object to
1040: 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 73 74 61   retrieve */.sta
1050: 74 69 63 20 69 6e 74 20 6c 65 6e 46 69 6c 65 20  tic int lenFile 
1060: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
1070: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a   Length of the z
1080: 46 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 73 74 61  File name */.sta
1090: 74 69 63 20 63 68 61 72 20 2a 7a 44 69 72 20 3d  tic char *zDir =
10a0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
10b0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72   Name of the dir
10c0: 65 63 74 6f 72 79 20 68 6f 6c 64 69 6e 67 20 7a  ectory holding z
10d0: 46 69 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20 63  File */.static c
10e0: 68 61 72 20 2a 7a 50 61 74 68 49 6e 66 6f 20 3d  har *zPathInfo =
10f0: 20 30 3b 20 20 20 20 20 20 2f 2a 20 50 61 72 74   0;      /* Part
1100: 20 6f 66 20 74 68 65 20 70 61 74 68 6e 61 6d 65   of the pathname
1110: 20 70 61 73 74 20 74 68 65 20 66 69 6c 65 20 2a   past the file *
1120: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a  /.static char *z
1130: 41 67 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20  Agent = 0;      
1140: 20 20 20 2f 2a 20 57 68 61 74 20 74 79 70 65 20     /* What type 
1150: 69 66 20 62 72 6f 77 73 65 72 20 69 73 20 6d 61  if browser is ma
1160: 6b 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20  king this query 
1170: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
1180: 7a 53 65 72 76 65 72 4e 61 6d 65 20 3d 20 30 3b  zServerName = 0;
1190: 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20      /* The name 
11a0: 61 66 74 65 72 20 74 68 65 20 68 74 74 70 3a 2f  after the http:/
11b0: 2f 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  / */.static char
11c0: 20 2a 7a 53 65 72 76 65 72 50 6f 72 74 20 3d 20   *zServerPort = 
11d0: 30 3b 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 72  0;    /* The por
11e0: 74 20 6e 75 6d 62 65 72 20 2a 2f 0a 73 74 61 74  t number */.stat
11f0: 69 63 20 63 68 61 72 20 2a 7a 43 6f 6f 6b 69 65  ic char *zCookie
1200: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
1210: 43 6f 6f 6b 69 65 73 20 72 65 70 6f 72 74 65 64  Cookies reported
1220: 20 77 69 74 68 20 74 68 65 20 72 65 71 75 65 73   with the reques
1230: 74 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  t */.static char
1240: 20 2a 7a 48 74 74 70 48 6f 73 74 20 3d 20 30 3b   *zHttpHost = 0;
1250: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 61 63        /* Name ac
1260: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 77  cording to the w
1270: 65 62 20 62 72 6f 77 73 65 72 20 2a 2f 0a 73 74  eb browser */.st
1280: 61 74 69 63 20 63 68 61 72 20 2a 7a 52 65 61 6c  atic char *zReal
1290: 50 6f 72 74 20 3d 20 30 3b 20 20 20 20 20 20 2f  Port = 0;      /
12a0: 2a 20 54 68 65 20 72 65 61 6c 20 54 43 50 20 70  * The real TCP p
12b0: 6f 72 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67  ort when running
12c0: 20 61 73 20 64 61 65 6d 6f 6e 20 2a 2f 0a 73 74   as daemon */.st
12d0: 61 74 69 63 20 63 68 61 72 20 2a 7a 52 65 6d 6f  atic char *zRemo
12e0: 74 65 41 64 64 72 20 3d 20 30 3b 20 20 20 20 2f  teAddr = 0;    /
12f0: 2a 20 49 50 20 61 64 64 72 65 73 73 20 6f 66 20  * IP address of 
1300: 74 68 65 20 72 65 71 75 65 73 74 20 2a 2f 0a 73  the request */.s
1310: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 52 65 66  tatic char *zRef
1320: 65 72 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  erer = 0;       
1330: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70  /* Name of the p
1340: 61 67 65 20 74 68 61 74 20 72 65 66 65 72 65 64  age that refered
1350: 20 74 6f 20 75 73 20 2a 2f 0a 73 74 61 74 69 63   to us */.static
1360: 20 63 68 61 72 20 2a 7a 41 63 63 65 70 74 20 3d   char *zAccept =
1370: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 68   0;        /* Wh
1380: 61 74 20 66 6f 72 6d 61 74 73 20 77 69 6c 6c 20  at formats will 
1390: 62 65 20 61 63 63 65 70 74 65 64 20 2a 2f 0a 73  be accepted */.s
13a0: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 43 6f 6e  tatic char *zCon
13b0: 74 65 6e 74 4c 65 6e 67 74 68 20 3d 20 30 3b 20  tentLength = 0; 
13c0: 2f 2a 20 43 6f 6e 74 65 6e 74 20 6c 65 6e 67 74  /* Content lengt
13d0: 68 20 72 65 70 6f 72 74 65 64 20 69 6e 20 74 68  h reported in th
13e0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 73 74 61 74  e header */.stat
13f0: 69 63 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e  ic char *zConten
1400: 74 54 79 70 65 20 3d 20 30 3b 20 20 20 2f 2a 20  tType = 0;   /* 
1410: 43 6f 6e 74 65 6e 74 20 74 79 70 65 20 72 65 70  Content type rep
1420: 6f 72 74 65 64 20 69 6e 20 74 68 65 20 68 65 61  orted in the hea
1430: 64 65 72 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  der */.static ch
1440: 61 72 20 2a 7a 51 75 65 72 79 53 75 66 66 69 78  ar *zQuerySuffix
1450: 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 70   = 0;   /* The p
1460: 61 72 74 20 6f 66 20 74 68 65 20 55 52 4c 20 61  art of the URL a
1470: 66 74 65 72 20 74 68 65 20 66 69 72 73 74 20 3f  fter the first ?
1480: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
1490: 2a 7a 41 75 74 68 54 79 70 65 20 3d 20 30 3b 20  *zAuthType = 0; 
14a0: 20 20 20 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a       /* Authoriz
14b0: 61 74 69 6f 6e 20 74 79 70 65 20 28 62 61 73 69  ation type (basi
14c0: 63 20 6f 72 20 64 69 67 65 73 74 29 20 2a 2f 0a  c or digest) */.
14d0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 41 75  static char *zAu
14e0: 74 68 41 72 67 20 3d 20 30 3b 20 20 20 20 20 20  thArg = 0;      
14f0: 20 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74 69 6f   /* Authorizatio
1500: 6e 20 76 61 6c 75 65 73 20 2a 2f 0a 73 74 61 74  n values */.stat
1510: 69 63 20 63 68 61 72 20 2a 7a 52 65 6d 6f 74 65  ic char *zRemote
1520: 55 73 65 72 20 3d 20 30 3b 20 20 20 20 2f 2a 20  User = 0;    /* 
1530: 52 45 4d 4f 54 45 5f 55 53 45 52 20 73 65 74 20  REMOTE_USER set 
1540: 62 79 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  by authorization
1550: 20 6d 6f 64 75 6c 65 20 2a 2f 0a 73 74 61 74 69   module */.stati
1560: 63 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 20 20  c int nIn = 0;  
1570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1580: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
1590: 66 20 69 6e 70 75 74 20 2a 2f 0a 73 74 61 74 69  f input */.stati
15a0: 63 20 69 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 20  c int nOut = 0; 
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
15c0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
15d0: 66 20 6f 75 74 70 75 74 20 2a 2f 0a 73 74 61 74  f output */.stat
15e0: 69 63 20 63 68 61 72 20 7a 52 65 70 6c 79 53 74  ic char zReplySt
15f0: 61 74 75 73 5b 34 5d 3b 20 20 20 20 20 2f 2a 20  atus[4];     /* 
1600: 52 65 70 6c 79 20 73 74 61 74 75 73 20 63 6f 64  Reply status cod
1610: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
1620: 73 74 61 74 75 73 53 65 6e 74 20 3d 20 30 3b 20  statusSent = 0; 
1630: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 61 66        /* True af
1640: 74 65 72 20 73 74 61 74 75 73 20 6c 69 6e 65 20  ter status line 
1650: 69 73 20 73 65 6e 74 20 2a 2f 0a 73 74 61 74 69  is sent */.stati
1660: 63 20 63 68 61 72 20 2a 7a 4c 6f 67 46 69 6c 65  c char *zLogFile
1670: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4c   = 0;       /* L
1680: 6f 67 20 74 6f 20 74 68 69 73 20 66 69 6c 65 20  og to this file 
1690: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
16a0: 62 75 67 46 6c 61 67 20 3d 20 30 3b 20 20 20 20  bugFlag = 0;    
16b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 62      /* True if b
16c0: 65 69 6e 67 20 64 65 62 75 67 67 65 64 20 2a 2f  eing debugged */
16d0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 74  .static struct t
16e0: 69 6d 65 76 61 6c 20 62 65 67 69 6e 54 69 6d 65  imeval beginTime
16f0: 3b 20 2f 2a 20 54 69 6d 65 20 77 68 65 6e 20 74  ; /* Time when t
1700: 68 69 73 20 70 72 6f 63 65 73 73 20 73 74 61 72  his process star
1710: 74 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ts */.static int
1720: 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e   closeConnection
1730: 20 3d 20 30 3b 20 20 2f 2a 20 54 72 75 65 20 74   = 0;  /* True t
1740: 6f 20 73 65 6e 64 20 43 6f 6e 6e 65 63 74 69 6f  o send Connectio
1750: 6e 3a 20 63 6c 6f 73 65 20 69 6e 20 72 65 70 6c  n: close in repl
1760: 79 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  y */.static int 
1770: 6e 52 65 71 75 65 73 74 20 3d 20 30 3b 20 20 20  nRequest = 0;   
1780: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1790: 6f 66 20 72 65 71 75 65 73 74 73 20 70 72 6f 63  of requests proc
17a0: 65 73 73 65 64 20 2a 2f 0a 73 74 61 74 69 63 20  essed */.static 
17b0: 69 6e 74 20 6f 6d 69 74 4c 6f 67 20 3d 20 30 3b  int omitLog = 0;
17c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
17d0: 6e 6f 74 20 6d 61 6b 65 20 6c 6f 67 66 69 6c 65  not make logfile
17e0: 20 65 6e 74 72 69 65 73 20 69 66 20 74 72 75 65   entries if true
17f0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75   */.static int u
1800: 73 65 48 74 74 70 73 20 3d 20 30 3b 20 20 20 20  seHttps = 0;    
1810: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
1820: 75 73 65 20 48 54 54 50 53 3a 20 69 6e 73 74 65  use HTTPS: inste
1830: 61 64 20 6f 66 20 48 54 54 50 3a 20 2a 2f 0a 73  ad of HTTP: */.s
1840: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 48 74 74  tatic char *zHtt
1850: 70 20 3d 20 22 68 74 74 70 22 3b 20 20 20 20 20  p = "http";     
1860: 2f 2a 20 68 74 74 70 20 6f 72 20 68 74 74 70 73  /* http or https
1870: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75   */.static int u
1880: 73 65 54 69 6d 65 6f 75 74 20 3d 20 31 3b 20 20  seTimeout = 1;  
1890: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
18a0: 75 73 65 20 74 69 6d 65 73 20 2a 2f 0a 73 74 61  use times */.sta
18b0: 74 69 63 20 69 6e 74 20 73 74 61 6e 64 61 6c 6f  tic int standalo
18c0: 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ne = 0;       /*
18d0: 20 52 75 6e 20 61 73 20 61 20 73 74 61 6e 64 61   Run as a standa
18e0: 6c 6f 6e 65 20 73 65 72 76 65 72 20 28 6e 6f 20  lone server (no 
18f0: 69 6e 65 74 64 29 20 2a 2f 0a 73 74 61 74 69 63  inetd) */.static
1900: 20 69 6e 74 20 69 70 76 36 4f 6e 6c 79 20 3d 20   int ipv6Only = 
1910: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73  0;         /* Us
1920: 65 20 49 50 76 36 20 6f 6e 6c 79 20 2a 2f 0a 73  e IPv6 only */.s
1930: 74 61 74 69 63 20 69 6e 74 20 69 70 76 34 4f 6e  tatic int ipv4On
1940: 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ly = 0;         
1950: 2f 2a 20 55 73 65 20 49 50 76 34 20 6f 6e 6c 79  /* Use IPv4 only
1960: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
1970: 74 20 72 75 73 61 67 65 20 70 72 69 6f 72 53 65  t rusage priorSe
1980: 6c 66 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73  lf;  /* Previous
1990: 6c 79 20 72 65 70 6f 72 74 20 53 45 4c 46 20 74  ly report SELF t
19a0: 69 6d 65 20 2a 2f 0a 73 74 61 74 69 63 20 73 74  ime */.static st
19b0: 72 75 63 74 20 72 75 73 61 67 65 20 70 72 69 6f  ruct rusage prio
19c0: 72 43 68 69 6c 64 3b 20 2f 2a 20 50 72 65 76 69  rChild; /* Previ
19d0: 6f 75 73 6c 79 20 72 65 70 6f 72 74 20 43 48 49  ously report CHI
19e0: 4c 44 20 74 69 6d 65 20 2a 2f 0a 0a 2f 2a 0a 2a  LD time */../*.*
19f0: 2a 20 44 6f 75 62 6c 65 20 61 6e 79 20 64 6f 75  * Double any dou
1a00: 62 6c 65 2d 71 75 6f 74 65 20 63 68 61 72 61 63  ble-quote charac
1a10: 74 65 72 73 20 69 6e 20 61 20 73 74 72 69 6e 67  ters in a string
1a20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
1a30: 20 2a 45 73 63 61 70 65 28 63 68 61 72 20 2a 7a   *Escape(char *z
1a40: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
1a50: 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20 63   int n;.  char c
1a60: 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a  ;.  char *zOut;.
1a70: 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 3d 7a 5b    for(i=0; (c=z[
1a80: 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 22 27  i])!=0 && c!='"'
1a90: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 63  ; i++){}.  if( c
1aa0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 3b 0a  ==0 ) return z;.
1ab0: 20 20 6e 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69    n = 1;.  for(i
1ac0: 2b 2b 3b 20 28 63 3d 7a 5b 69 5d 29 21 3d 30 3b  ++; (c=z[i])!=0;
1ad0: 20 69 2b 2b 29 7b 20 69 66 28 20 63 3d 3d 27 22   i++){ if( c=='"
1ae0: 27 20 29 20 6e 2b 2b 3b 20 7d 0a 20 20 7a 4f 75  ' ) n++; }.  zOu
1af0: 74 20 3d 20 6d 61 6c 6c 6f 63 28 20 69 2b 6e 2b  t = malloc( i+n+
1b00: 31 20 29 3b 0a 20 20 69 66 28 20 7a 4f 75 74 3d  1 );.  if( zOut=
1b10: 3d 30 20 29 20 72 65 74 75 72 6e 20 22 22 3b 0a  =0 ) return "";.
1b20: 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63 3d    for(i=j=0; (c=
1b30: 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a  z[i])!=0; i++){.
1b40: 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20      zOut[j++] = 
1b50: 63 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 22  c;.    if( c=='"
1b60: 27 20 29 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20  ' ) zOut[j++] = 
1b70: 63 3b 0a 20 20 7d 0a 20 20 7a 4f 75 74 5b 6a 5d  c;.  }.  zOut[j]
1b80: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a   = 0;.  return z
1b90: 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  Out;.}../*.** Co
1ba0: 6e 76 65 72 74 20 61 20 73 74 72 75 63 74 20 74  nvert a struct t
1bb0: 69 6d 65 76 61 6c 20 69 6e 74 6f 20 61 6e 20 69  imeval into an i
1bc0: 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66  nteger number of
1bd0: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 0a 2a 2f   milliseconds.*/
1be0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 76 6d 73  .static int tvms
1bf0: 28 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20  (struct timeval 
1c00: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 69  *p){.  return (i
1c10: 6e 74 29 28 70 2d 3e 74 76 5f 73 65 63 2a 31 30  nt)(p->tv_sec*10
1c20: 30 30 30 30 30 20 2b 20 70 2d 3e 74 76 5f 75 73  00000 + p->tv_us
1c30: 65 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ec);.}../*.** Ma
1c40: 6b 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  ke an entry in t
1c50: 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 20 49 66  he log file.  If
1c60: 20 74 68 65 20 48 54 54 50 20 63 6f 6e 6e 65 63   the HTTP connec
1c70: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 0a 2a  tion should be.*
1c80: 2a 20 63 6c 6f 73 65 64 2c 20 74 68 65 6e 20 74  * closed, then t
1c90: 65 72 6d 69 6e 61 74 65 20 74 68 69 73 20 70 72  erminate this pr
1ca0: 6f 63 65 73 73 2e 20 20 4f 74 68 65 72 77 69 73  ocess.  Otherwis
1cb0: 65 20 72 65 74 75 72 6e 2e 0a 2a 2f 0a 73 74 61  e return..*/.sta
1cc0: 74 69 63 20 76 6f 69 64 20 4d 61 6b 65 4c 6f 67  tic void MakeLog
1cd0: 45 6e 74 72 79 28 69 6e 74 20 61 29 7b 0a 20 20  Entry(int a){.  
1ce0: 46 49 4c 45 20 2a 6c 6f 67 3b 0a 20 20 69 66 28  FILE *log;.  if(
1cf0: 20 7a 54 6d 70 4e 61 6d 20 29 7b 0a 20 20 20 20   zTmpNam ){.    
1d00: 75 6e 6c 69 6e 6b 28 7a 54 6d 70 4e 61 6d 29 3b  unlink(zTmpNam);
1d10: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4c 6f 67 46  .  }.  if( zLogF
1d20: 69 6c 65 20 26 26 20 21 6f 6d 69 74 4c 6f 67 20  ile && !omitLog 
1d30: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 74 69  ){.    struct ti
1d40: 6d 65 76 61 6c 20 6e 6f 77 3b 0a 20 20 20 20 73  meval now;.    s
1d50: 74 72 75 63 74 20 74 6d 20 2a 70 54 6d 3b 0a 20  truct tm *pTm;. 
1d60: 20 20 20 73 74 72 75 63 74 20 72 75 73 61 67 65     struct rusage
1d70: 20 73 65 6c 66 2c 20 63 68 69 6c 64 72 65 6e 3b   self, children;
1d80: 0a 20 20 20 20 69 6e 74 20 77 61 69 74 53 74 61  .    int waitSta
1d90: 74 75 73 3b 0a 20 20 20 20 63 68 61 72 20 7a 44  tus;.    char zD
1da0: 61 74 65 5b 32 30 30 5d 3b 0a 20 20 20 20 63 68  ate[200];.    ch
1db0: 61 72 20 2a 7a 52 4d 20 3d 20 7a 52 65 6d 6f 74  ar *zRM = zRemot
1dc0: 65 55 73 65 72 20 3f 20 7a 52 65 6d 6f 74 65 55  eUser ? zRemoteU
1dd0: 73 65 72 20 3a 20 22 22 3b 0a 0a 20 20 20 20 69  ser : "";..    i
1de0: 66 28 20 7a 53 63 72 69 70 74 3d 3d 30 20 29 20  f( zScript==0 ) 
1df0: 7a 53 63 72 69 70 74 20 3d 20 22 22 3b 0a 20 20  zScript = "";.  
1e00: 20 20 69 66 28 20 7a 52 65 61 6c 53 63 72 69 70    if( zRealScrip
1e10: 74 3d 3d 30 20 29 20 7a 52 65 61 6c 53 63 72 69  t==0 ) zRealScri
1e20: 70 74 20 3d 20 22 22 3b 0a 20 20 20 20 69 66 28  pt = "";.    if(
1e30: 20 7a 52 65 6d 6f 74 65 41 64 64 72 3d 3d 30 20   zRemoteAddr==0 
1e40: 29 20 7a 52 65 6d 6f 74 65 41 64 64 72 20 3d 20  ) zRemoteAddr = 
1e50: 22 22 3b 0a 20 20 20 20 69 66 28 20 7a 48 74 74  "";.    if( zHtt
1e60: 70 48 6f 73 74 3d 3d 30 20 29 20 7a 48 74 74 70  pHost==0 ) zHttp
1e70: 48 6f 73 74 20 3d 20 22 22 3b 0a 20 20 20 20 69  Host = "";.    i
1e80: 66 28 20 7a 52 65 66 65 72 65 72 3d 3d 30 20 29  f( zReferer==0 )
1e90: 20 7a 52 65 66 65 72 65 72 20 3d 20 22 22 3b 0a   zReferer = "";.
1ea0: 20 20 20 20 69 66 28 20 7a 41 67 65 6e 74 3d 3d      if( zAgent==
1eb0: 30 20 29 20 7a 41 67 65 6e 74 20 3d 20 22 22 3b  0 ) zAgent = "";
1ec0: 0a 20 20 20 20 67 65 74 74 69 6d 65 6f 66 64 61  .    gettimeofda
1ed0: 79 28 26 6e 6f 77 2c 20 30 29 3b 0a 20 20 20 20  y(&now, 0);.    
1ee0: 70 54 6d 20 3d 20 6c 6f 63 61 6c 74 69 6d 65 28  pTm = localtime(
1ef0: 26 6e 6f 77 2e 74 76 5f 73 65 63 29 3b 0a 20 20  &now.tv_sec);.  
1f00: 20 20 73 74 72 66 74 69 6d 65 28 7a 44 61 74 65    strftime(zDate
1f10: 2c 20 73 69 7a 65 6f 66 28 7a 44 61 74 65 29 2c  , sizeof(zDate),
1f20: 20 22 25 59 2d 25 6d 2d 25 64 20 25 48 3a 25 4d   "%Y-%m-%d %H:%M
1f30: 3a 25 53 22 2c 20 70 54 6d 29 3b 0a 20 20 20 20  :%S", pTm);.    
1f40: 77 61 69 74 70 69 64 28 2d 31 2c 20 26 77 61 69  waitpid(-1, &wai
1f50: 74 53 74 61 74 75 73 2c 20 57 4e 4f 48 41 4e 47  tStatus, WNOHANG
1f60: 29 3b 0a 20 20 20 20 67 65 74 72 75 73 61 67 65  );.    getrusage
1f70: 28 52 55 53 41 47 45 5f 53 45 4c 46 2c 20 26 73  (RUSAGE_SELF, &s
1f80: 65 6c 66 29 3b 0a 20 20 20 20 67 65 74 72 75 73  elf);.    getrus
1f90: 61 67 65 28 52 55 53 41 47 45 5f 43 48 49 4c 44  age(RUSAGE_CHILD
1fa0: 52 45 4e 2c 20 26 63 68 69 6c 64 72 65 6e 29 3b  REN, &children);
1fb0: 0a 20 20 20 20 69 66 28 20 28 6c 6f 67 20 3d 20  .    if( (log = 
1fc0: 66 6f 70 65 6e 28 7a 4c 6f 67 46 69 6c 65 2c 22  fopen(zLogFile,"
1fd0: 61 22 29 29 21 3d 30 20 29 7b 0a 23 69 66 64 65  a"))!=0 ){.#ifde
1fe0: 66 20 43 4f 4d 42 49 4e 45 44 5f 4c 4f 47 5f 46  f COMBINED_LOG_F
1ff0: 4f 52 4d 41 54 0a 20 20 20 20 20 20 73 74 72 66  ORMAT.      strf
2000: 74 69 6d 65 28 7a 44 61 74 65 2c 20 73 69 7a 65  time(zDate, size
2010: 6f 66 28 7a 44 61 74 65 29 2c 20 22 25 64 2f 25  of(zDate), "%d/%
2020: 62 2f 25 59 3a 25 48 3a 25 4d 3a 25 53 20 25 7a  b/%Y:%H:%M:%S %z
2030: 22 2c 20 70 54 6d 29 3b 0a 20 20 20 20 20 20 66  ", pTm);.      f
2040: 70 72 69 6e 74 66 28 6c 6f 67 2c 20 22 25 73 20  printf(log, "%s 
2050: 2d 20 2d 20 5b 25 73 5d 20 5c 22 25 73 20 25 73  - - [%s] \"%s %s
2060: 20 25 73 5c 22 20 25 73 20 25 64 20 5c 22 25 73   %s\" %s %d \"%s
2070: 5c 22 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20  \" \"%s\"\n",.  
2080: 20 20 20 20 20 20 20 20 20 20 20 20 7a 52 65 6d              zRem
2090: 6f 74 65 41 64 64 72 2c 20 7a 44 61 74 65 2c 20  oteAddr, zDate, 
20a0: 7a 4d 65 74 68 6f 64 2c 20 7a 53 63 72 69 70 74  zMethod, zScript
20b0: 2c 20 7a 50 72 6f 74 6f 63 6f 6c 2c 0a 20 20 20  , zProtocol,.   
20c0: 20 20 20 20 20 20 20 20 20 20 20 7a 52 65 70 6c             zRepl
20d0: 79 53 74 61 74 75 73 2c 20 6e 4f 75 74 2c 20 7a  yStatus, nOut, z
20e0: 52 65 66 65 72 65 72 2c 20 7a 41 67 65 6e 74 29  Referer, zAgent)
20f0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 73 74  ;.#else.      st
2100: 72 66 74 69 6d 65 28 7a 44 61 74 65 2c 20 73 69  rftime(zDate, si
2110: 7a 65 6f 66 28 7a 44 61 74 65 29 2c 20 22 25 59  zeof(zDate), "%Y
2120: 2d 25 6d 2d 25 64 20 25 48 3a 25 4d 3a 25 53 22  -%m-%d %H:%M:%S"
2130: 2c 20 70 54 6d 29 3b 0a 20 20 20 20 20 20 2f 2a  , pTm);.      /*
2140: 20 4c 6f 67 20 72 65 63 6f 72 64 20 66 69 6c 65   Log record file
2150: 73 3a 0a 20 20 20 20 20 20 2a 2a 20 20 28 31 29  s:.      **  (1)
2160: 20 44 61 74 65 20 61 6e 64 20 74 69 6d 65 0a 20   Date and time. 
2170: 20 20 20 20 20 2a 2a 20 20 28 32 29 20 49 50 20       **  (2) IP 
2180: 61 64 64 72 65 73 73 0a 20 20 20 20 20 20 2a 2a  address.      **
2190: 20 20 28 33 29 20 55 52 4c 20 62 65 69 6e 67 20    (3) URL being 
21a0: 61 63 63 65 73 73 65 64 0a 20 20 20 20 20 20 2a  accessed.      *
21b0: 2a 20 20 28 34 29 20 52 65 66 65 72 65 72 0a 20  *  (4) Referer. 
21c0: 20 20 20 20 20 2a 2a 20 20 28 35 29 20 52 65 70       **  (5) Rep
21d0: 6c 79 20 73 74 61 74 75 73 0a 20 20 20 20 20 20  ly status.      
21e0: 2a 2a 20 20 28 36 29 20 42 79 74 65 73 20 72 65  **  (6) Bytes re
21f0: 63 65 69 76 65 64 0a 20 20 20 20 20 20 2a 2a 20  ceived.      ** 
2200: 20 28 37 29 20 42 79 74 65 73 20 73 65 6e 74 0a   (7) Bytes sent.
2210: 20 20 20 20 20 20 2a 2a 20 20 28 38 29 20 53 65        **  (8) Se
2220: 6c 66 20 75 73 65 72 20 74 69 6d 65 0a 20 20 20  lf user time.   
2230: 20 20 20 2a 2a 20 20 28 39 29 20 53 65 6c 66 20     **  (9) Self 
2240: 73 79 73 74 65 6d 20 74 69 6d 65 0a 20 20 20 20  system time.    
2250: 20 20 2a 2a 20 28 31 30 29 20 43 68 69 6c 64 72    ** (10) Childr
2260: 65 6e 20 75 73 65 72 20 74 69 6d 65 0a 20 20 20  en user time.   
2270: 20 20 20 2a 2a 20 28 31 31 29 20 43 68 69 6c 64     ** (11) Child
2280: 72 65 6e 20 73 79 73 74 65 6d 20 74 69 6d 65 0a  ren system time.
2290: 20 20 20 20 20 20 2a 2a 20 28 31 32 29 20 54 6f        ** (12) To
22a0: 74 61 6c 20 77 61 6c 6c 2d 63 6c 6f 63 6b 20 74  tal wall-clock t
22b0: 69 6d 65 0a 20 20 20 20 20 20 2a 2a 20 28 31 33  ime.      ** (13
22c0: 29 20 52 65 71 75 65 73 74 20 6e 75 6d 62 65 72  ) Request number
22d0: 20 66 6f 72 20 73 61 6d 65 20 54 43 50 2f 49 50   for same TCP/IP
22e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20   connection.    
22f0: 20 20 2a 2a 20 28 31 34 29 20 55 73 65 72 20 61    ** (14) User a
2300: 67 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 28 31  gent.      ** (1
2310: 35 29 20 52 65 6d 6f 74 65 20 75 73 65 72 0a 20  5) Remote user. 
2320: 20 20 20 20 20 2a 2a 20 28 31 36 29 20 42 79 74       ** (16) Byt
2330: 65 73 20 6f 66 20 55 52 4c 20 74 68 61 74 20 63  es of URL that c
2340: 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65  orrespond to the
2350: 20 53 43 52 49 50 54 5f 4e 41 4d 45 0a 20 20 20   SCRIPT_NAME.   
2360: 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 70 72 69     */.      fpri
2370: 6e 74 66 28 6c 6f 67 2c 0a 20 20 20 20 20 20 20  ntf(log,.       
2380: 20 22 25 73 2c 25 73 2c 5c 22 25 73 3a 2f 2f 25   "%s,%s,\"%s://%
2390: 73 25 73 5c 22 2c 5c 22 25 73 5c 22 2c 22 0a 20  s%s\",\"%s\",". 
23a0: 20 20 20 20 20 20 20 20 20 20 22 25 73 2c 25 64            "%s,%d
23b0: 2c 25 64 2c 25 64 2c 25 64 2c 25 64 2c 25 64 2c  ,%d,%d,%d,%d,%d,
23c0: 25 64 2c 25 64 2c 5c 22 25 73 5c 22 2c 5c 22 25  %d,%d,\"%s\",\"%
23d0: 73 5c 22 2c 25 64 5c 6e 22 2c 0a 20 20 20 20 20  s\",%d\n",.     
23e0: 20 20 20 7a 44 61 74 65 2c 20 7a 52 65 6d 6f 74     zDate, zRemot
23f0: 65 41 64 64 72 2c 20 7a 48 74 74 70 2c 20 45 73  eAddr, zHttp, Es
2400: 63 61 70 65 28 7a 48 74 74 70 48 6f 73 74 29 2c  cape(zHttpHost),
2410: 20 45 73 63 61 70 65 28 7a 53 63 72 69 70 74 29   Escape(zScript)
2420: 2c 0a 20 20 20 20 20 20 20 20 45 73 63 61 70 65  ,.        Escape
2430: 28 7a 52 65 66 65 72 65 72 29 2c 20 7a 52 65 70  (zReferer), zRep
2440: 6c 79 53 74 61 74 75 73 2c 20 6e 49 6e 2c 20 6e  lyStatus, nIn, n
2450: 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 74 76 6d  Out,.        tvm
2460: 73 28 26 73 65 6c 66 2e 72 75 5f 75 74 69 6d 65  s(&self.ru_utime
2470: 29 20 2d 20 74 76 6d 73 28 26 70 72 69 6f 72 53  ) - tvms(&priorS
2480: 65 6c 66 2e 72 75 5f 75 74 69 6d 65 29 2c 0a 20  elf.ru_utime),. 
2490: 20 20 20 20 20 20 20 74 76 6d 73 28 26 73 65 6c         tvms(&sel
24a0: 66 2e 72 75 5f 73 74 69 6d 65 29 20 2d 20 74 76  f.ru_stime) - tv
24b0: 6d 73 28 26 70 72 69 6f 72 53 65 6c 66 2e 72 75  ms(&priorSelf.ru
24c0: 5f 73 74 69 6d 65 29 2c 0a 20 20 20 20 20 20 20  _stime),.       
24d0: 20 74 76 6d 73 28 26 63 68 69 6c 64 72 65 6e 2e   tvms(&children.
24e0: 72 75 5f 75 74 69 6d 65 29 20 2d 20 74 76 6d 73  ru_utime) - tvms
24f0: 28 26 70 72 69 6f 72 43 68 69 6c 64 2e 72 75 5f  (&priorChild.ru_
2500: 75 74 69 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  utime),.        
2510: 74 76 6d 73 28 26 63 68 69 6c 64 72 65 6e 2e 72  tvms(&children.r
2520: 75 5f 73 74 69 6d 65 29 20 2d 20 74 76 6d 73 28  u_stime) - tvms(
2530: 26 70 72 69 6f 72 43 68 69 6c 64 2e 72 75 5f 73  &priorChild.ru_s
2540: 74 69 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 74  time),.        t
2550: 76 6d 73 28 26 6e 6f 77 29 20 2d 20 74 76 6d 73  vms(&now) - tvms
2560: 28 26 62 65 67 69 6e 54 69 6d 65 29 2c 0a 20 20  (&beginTime),.  
2570: 20 20 20 20 20 20 6e 52 65 71 75 65 73 74 2c 20        nRequest, 
2580: 45 73 63 61 70 65 28 7a 41 67 65 6e 74 29 2c 20  Escape(zAgent), 
2590: 45 73 63 61 70 65 28 7a 52 4d 29 2c 0a 20 20 20  Escape(zRM),.   
25a0: 20 20 20 20 20 28 69 6e 74 29 28 73 74 72 6c 65       (int)(strle
25b0: 6e 28 7a 48 74 74 70 29 2b 73 74 72 6c 65 6e 28  n(zHttp)+strlen(
25c0: 7a 48 74 74 70 48 6f 73 74 29 2b 73 74 72 6c 65  zHttpHost)+strle
25d0: 6e 28 7a 52 65 61 6c 53 63 72 69 70 74 29 2b 33  n(zRealScript)+3
25e0: 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ).      );.     
25f0: 20 70 72 69 6f 72 53 65 6c 66 20 3d 20 73 65 6c   priorSelf = sel
2600: 66 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 43 68  f;.      priorCh
2610: 69 6c 64 20 3d 20 63 68 69 6c 64 72 65 6e 3b 0a  ild = children;.
2620: 20 20 20 20 20 20 62 65 67 69 6e 54 69 6d 65 20        beginTime 
2630: 3d 20 6e 6f 77 3b 0a 23 65 6e 64 69 66 0a 20 20  = now;.#endif.  
2640: 20 20 20 20 66 63 6c 6f 73 65 28 6c 6f 67 29 3b      fclose(log);
2650: 0a 20 20 20 20 20 20 6e 49 6e 20 3d 20 6e 4f 75  .      nIn = nOu
2660: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
2670: 0a 20 20 69 66 28 20 63 6c 6f 73 65 43 6f 6e 6e  .  if( closeConn
2680: 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 65 78  ection ){.    ex
2690: 69 74 28 61 29 3b 0a 20 20 7d 0a 20 20 73 74 61  it(a);.  }.  sta
26a0: 74 75 73 53 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a  tusSent = 0;.}..
26b0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  /*.** Allocate m
26c0: 65 6d 6f 72 79 20 73 61 66 65 6c 79 0a 2a 2f 0a  emory safely.*/.
26d0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 53 61 66  static char *Saf
26e0: 65 4d 61 6c 6c 6f 63 28 20 69 6e 74 20 73 69 7a  eMalloc( int siz
26f0: 65 20 29 7b 0a 20 20 63 68 61 72 20 2a 70 3b 0a  e ){.  char *p;.
2700: 0a 20 20 70 20 3d 20 28 63 68 61 72 2a 29 6d 61  .  p = (char*)ma
2710: 6c 6c 6f 63 28 73 69 7a 65 29 3b 0a 20 20 69 66  lloc(size);.  if
2720: 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  ( p==0 ){.    st
2730: 72 63 70 79 28 7a 52 65 70 6c 79 53 74 61 74 75  rcpy(zReplyStatu
2740: 73 2c 20 22 39 39 38 22 29 3b 0a 20 20 20 20 4d  s, "998");.    M
2750: 61 6b 65 4c 6f 67 45 6e 74 72 79 28 31 29 3b 0a  akeLogEntry(1);.
2760: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
2770: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
2780: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61  /*.** Set the va
2790: 6c 75 65 20 6f 66 20 65 6e 76 69 72 6f 6e 6d 65  lue of environme
27a0: 6e 74 20 76 61 72 69 61 62 6c 65 20 7a 56 61 72  nt variable zVar
27b0: 20 74 6f 20 7a 56 61 6c 75 65 2e 0a 2a 2f 0a 73   to zValue..*/.s
27c0: 74 61 74 69 63 20 76 6f 69 64 20 53 65 74 45 6e  tatic void SetEn
27d0: 76 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56  v(const char *zV
27e0: 61 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ar, const char *
27f0: 7a 56 61 6c 75 65 29 7b 0a 20 20 63 68 61 72 20  zValue){.  char 
2800: 2a 7a 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  *z;.  int len;. 
2810: 20 69 66 28 20 7a 56 61 6c 75 65 3d 3d 30 20 29   if( zValue==0 )
2820: 20 7a 56 61 6c 75 65 3d 22 22 3b 0a 20 20 6c 65   zValue="";.  le
2830: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 56 61 72 29  n = strlen(zVar)
2840: 20 2b 20 73 74 72 6c 65 6e 28 7a 56 61 6c 75 65   + strlen(zValue
2850: 29 20 2b 20 32 3b 0a 20 20 7a 20 3d 20 53 61 66  ) + 2;.  z = Saf
2860: 65 4d 61 6c 6c 6f 63 28 6c 65 6e 29 3b 0a 20 20  eMalloc(len);.  
2870: 73 70 72 69 6e 74 66 28 7a 2c 22 25 73 3d 25 73  sprintf(z,"%s=%s
2880: 22 2c 7a 56 61 72 2c 7a 56 61 6c 75 65 29 3b 0a  ",zVar,zValue);.
2890: 20 20 70 75 74 65 6e 76 28 7a 29 3b 0a 7d 0a 0a    putenv(z);.}..
28a0: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
28b0: 20 66 69 72 73 74 20 73 70 61 63 65 2d 64 65 6c   first space-del
28c0: 69 6d 69 74 65 64 20 74 6f 6b 65 6e 20 66 72 6f  imited token fro
28d0: 6d 20 61 20 73 74 72 69 6e 67 20 61 6e 64 20 72  m a string and r
28e0: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
28f0: 65 72 20 74 6f 20 69 74 2e 20 20 41 64 64 20 61  er to it.  Add a
2900: 20 4e 55 4c 4c 20 74 6f 20 74 68 65 20 73 74 72   NULL to the str
2910: 69 6e 67 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  ing to terminate
2920: 20 74 68 65 20 74 6f 6b 65 6e 2e 0a 2a 2a 20 4d   the token..** M
2930: 61 6b 65 20 2a 7a 4c 65 66 74 4f 76 65 72 20 70  ake *zLeftOver p
2940: 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 74 61 72  oint to the star
2950: 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 74 6f  t of the next to
2960: 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ken..*/.static c
2970: 68 61 72 20 2a 47 65 74 46 69 72 73 74 45 6c 65  har *GetFirstEle
2980: 6d 65 6e 74 28 63 68 61 72 20 2a 7a 49 6e 70 75  ment(char *zInpu
2990: 74 2c 20 63 68 61 72 20 2a 2a 7a 4c 65 66 74 4f  t, char **zLeftO
29a0: 76 65 72 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52  ver){.  char *zR
29b0: 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 69 66 28  esult = 0;.  if(
29c0: 20 7a 49 6e 70 75 74 3d 3d 30 20 29 7b 0a 20 20   zInput==0 ){.  
29d0: 20 20 69 66 28 20 7a 4c 65 66 74 4f 76 65 72 20    if( zLeftOver 
29e0: 29 20 2a 7a 4c 65 66 74 4f 76 65 72 20 3d 20 30  ) *zLeftOver = 0
29f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
2a00: 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 69 73 73    }.  while( iss
2a10: 70 61 63 65 28 2a 7a 49 6e 70 75 74 29 20 29 7b  pace(*zInput) ){
2a20: 20 7a 49 6e 70 75 74 2b 2b 3b 20 7d 0a 20 20 7a   zInput++; }.  z
2a30: 52 65 73 75 6c 74 20 3d 20 7a 49 6e 70 75 74 3b  Result = zInput;
2a40: 0a 20 20 77 68 69 6c 65 28 20 2a 7a 49 6e 70 75  .  while( *zInpu
2a50: 74 20 26 26 20 21 69 73 73 70 61 63 65 28 2a 7a  t && !isspace(*z
2a60: 49 6e 70 75 74 29 20 29 7b 20 7a 49 6e 70 75 74  Input) ){ zInput
2a70: 2b 2b 3b 20 7d 0a 20 20 69 66 28 20 2a 7a 49 6e  ++; }.  if( *zIn
2a80: 70 75 74 20 29 7b 0a 20 20 20 20 2a 7a 49 6e 70  put ){.    *zInp
2a90: 75 74 20 3d 20 30 3b 0a 20 20 20 20 7a 49 6e 70  ut = 0;.    zInp
2aa0: 75 74 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28  ut++;.    while(
2ab0: 20 69 73 73 70 61 63 65 28 2a 7a 49 6e 70 75 74   isspace(*zInput
2ac0: 29 20 29 7b 20 7a 49 6e 70 75 74 2b 2b 3b 20 7d  ) ){ zInput++; }
2ad0: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4c 65 66 74  .  }.  if( zLeft
2ae0: 4f 76 65 72 20 29 7b 20 2a 7a 4c 65 66 74 4f 76  Over ){ *zLeftOv
2af0: 65 72 20 3d 20 7a 49 6e 70 75 74 3b 20 7d 0a 20  er = zInput; }. 
2b00: 20 72 65 74 75 72 6e 20 7a 52 65 73 75 6c 74 3b   return zResult;
2b10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
2b20: 20 63 6f 70 79 20 6f 66 20 61 20 73 74 72 69 6e   copy of a strin
2b30: 67 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  g into memory ob
2b40: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
2b50: 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  oc..*/.static ch
2b60: 61 72 20 2a 53 74 72 44 75 70 28 63 6f 6e 73 74  ar *StrDup(const
2b70: 20 63 68 61 72 20 2a 7a 53 72 63 29 7b 0a 20 20   char *zSrc){.  
2b80: 63 68 61 72 20 2a 7a 44 65 73 74 3b 0a 20 20 69  char *zDest;.  i
2b90: 6e 74 20 73 69 7a 65 3b 0a 0a 20 20 69 66 28 20  nt size;..  if( 
2ba0: 7a 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  zSrc==0 ) return
2bb0: 20 30 3b 0a 20 20 73 69 7a 65 20 3d 20 73 74 72   0;.  size = str
2bc0: 6c 65 6e 28 7a 53 72 63 29 20 2b 20 31 3b 0a 20  len(zSrc) + 1;. 
2bd0: 20 7a 44 65 73 74 20 3d 20 28 63 68 61 72 2a 29   zDest = (char*)
2be0: 53 61 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  SafeMalloc( size
2bf0: 20 29 3b 0a 20 20 73 74 72 63 70 79 28 7a 44 65   );.  strcpy(zDe
2c00: 73 74 2c 7a 53 72 63 29 3b 0a 20 20 72 65 74 75  st,zSrc);.  retu
2c10: 72 6e 20 7a 44 65 73 74 3b 0a 7d 0a 73 74 61 74  rn zDest;.}.stat
2c20: 69 63 20 63 68 61 72 20 2a 53 74 72 41 70 70 65  ic char *StrAppe
2c30: 6e 64 28 63 68 61 72 20 2a 7a 50 72 69 6f 72 2c  nd(char *zPrior,
2c40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65   const char *zSe
2c50: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
2c60: 53 72 63 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44  Src){.  char *zD
2c70: 65 73 74 3b 0a 20 20 69 6e 74 20 73 69 7a 65 3b  est;.  int size;
2c80: 0a 20 20 69 6e 74 20 6e 31 2c 20 6e 32 3b 0a 0a  .  int n1, n2;..
2c90: 20 20 69 66 28 20 7a 53 72 63 3d 3d 30 20 29 20    if( zSrc==0 ) 
2ca0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
2cb0: 7a 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75  zPrior==0 ) retu
2cc0: 72 6e 20 53 74 72 44 75 70 28 7a 53 72 63 29 3b  rn StrDup(zSrc);
2cd0: 0a 20 20 73 69 7a 65 20 3d 20 28 6e 31 3d 73 74  .  size = (n1=st
2ce0: 72 6c 65 6e 28 7a 53 72 63 29 29 20 2b 20 28 6e  rlen(zSrc)) + (n
2cf0: 32 3d 73 74 72 6c 65 6e 28 7a 53 65 70 29 29 20  2=strlen(zSep)) 
2d00: 2b 20 73 74 72 6c 65 6e 28 7a 50 72 69 6f 72 29  + strlen(zPrior)
2d10: 20 2b 20 31 3b 0a 20 20 7a 44 65 73 74 20 3d 20   + 1;.  zDest = 
2d20: 28 63 68 61 72 2a 29 53 61 66 65 4d 61 6c 6c 6f  (char*)SafeMallo
2d30: 63 28 20 73 69 7a 65 20 29 3b 0a 20 20 73 74 72  c( size );.  str
2d40: 63 70 79 28 7a 44 65 73 74 2c 7a 50 72 69 6f 72  cpy(zDest,zPrior
2d50: 29 3b 0a 20 20 66 72 65 65 28 7a 50 72 69 6f 72  );.  free(zPrior
2d60: 29 3b 0a 20 20 73 74 72 63 70 79 28 26 7a 44 65  );.  strcpy(&zDe
2d70: 73 74 5b 6e 31 5d 2c 7a 53 65 70 29 3b 0a 20 20  st[n1],zSep);.  
2d80: 73 74 72 63 70 79 28 26 7a 44 65 73 74 5b 6e 31  strcpy(&zDest[n1
2d90: 2b 6e 32 5d 2c 7a 53 72 63 29 3b 0a 20 20 72 65  +n2],zSrc);.  re
2da0: 74 75 72 6e 20 7a 44 65 73 74 3b 0a 7d 0a 0a 2f  turn zDest;.}../
2db0: 2a 0a 2a 2a 20 42 72 65 61 6b 20 61 20 6c 69 6e  *.** Break a lin
2dc0: 65 20 61 74 20 74 68 65 20 66 69 72 73 74 20 5c  e at the first \
2dd0: 6e 20 6f 72 20 5c 72 20 63 68 61 72 61 63 74 65  n or \r characte
2de0: 72 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69  r seen..*/.stati
2df0: 63 20 76 6f 69 64 20 52 65 6d 6f 76 65 4e 65 77  c void RemoveNew
2e00: 6c 69 6e 65 28 63 68 61 72 20 2a 7a 29 7b 0a 20  line(char *z){. 
2e10: 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
2e20: 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20  rn;.  while( *z 
2e30: 26 26 20 2a 7a 21 3d 27 5c 6e 27 20 26 26 20 2a  && *z!='\n' && *
2e40: 7a 21 3d 27 5c 72 27 20 29 7b 20 7a 2b 2b 3b 20  z!='\r' ){ z++; 
2e50: 7d 0a 20 20 2a 7a 20 3d 20 30 3b 0a 7d 0a 0a 2f  }.  *z = 0;.}../
2e60: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 64 61 74  *.** Print a dat
2e70: 65 20 74 61 67 20 69 6e 20 74 68 65 20 68 65 61  e tag in the hea
2e80: 64 65 72 2e 20 20 54 68 65 20 6e 61 6d 65 20 6f  der.  The name o
2e90: 66 20 74 68 65 20 74 61 67 20 69 73 20 7a 54 61  f the tag is zTa
2ea0: 67 2e 0a 2a 2a 20 54 68 65 20 64 61 74 65 20 69  g..** The date i
2eb0: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 66 72 6f  s determined fro
2ec0: 6d 20 74 68 65 20 75 6e 69 78 20 74 69 6d 65 73  m the unix times
2ed0: 74 61 6d 70 20 67 69 76 65 6e 2e 0a 2a 2f 0a 73  tamp given..*/.s
2ee0: 74 61 74 69 63 20 69 6e 74 20 44 61 74 65 54 61  tatic int DateTa
2ef0: 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  g(const char *zT
2f00: 61 67 2c 20 74 69 6d 65 5f 74 20 74 29 7b 0a 20  ag, time_t t){. 
2f10: 20 73 74 72 75 63 74 20 74 6d 20 2a 74 6d 3b 0a   struct tm *tm;.
2f20: 20 20 63 68 61 72 20 7a 44 61 74 65 5b 31 30 30    char zDate[100
2f30: 5d 3b 0a 20 20 74 6d 20 3d 20 67 6d 74 69 6d 65  ];.  tm = gmtime
2f40: 28 26 74 29 3b 0a 20 20 73 74 72 66 74 69 6d 65  (&t);.  strftime
2f50: 28 7a 44 61 74 65 2c 20 73 69 7a 65 6f 66 28 7a  (zDate, sizeof(z
2f60: 44 61 74 65 29 2c 20 22 25 61 2c 20 25 64 20 20  Date), "%a, %d  
2f70: 25 62 20 25 59 20 25 48 3a 25 4d 3a 25 53 20 25  %b %Y %H:%M:%S %
2f80: 7a 22 2c 20 74 6d 29 3b 0a 20 20 72 65 74 75 72  z", tm);.  retur
2f90: 6e 20 70 72 69 6e 74 66 28 22 25 73 3a 20 25 73  n printf("%s: %s
2fa0: 5c 72 5c 6e 22 2c 20 7a 54 61 67 2c 20 7a 44 61  \r\n", zTag, zDa
2fb0: 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  te);.}../*.** Pr
2fc0: 69 6e 74 20 74 68 65 20 66 69 72 73 74 20 6c 69  int the first li
2fd0: 6e 65 20 6f 66 20 61 20 72 65 73 70 6f 6e 73 65  ne of a response
2fe0: 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68 65   followed by the
2ff0: 20 73 65 72 76 65 72 20 74 79 70 65 2e 0a 2a 2f   server type..*/
3000: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 74 61  .static void Sta
3010: 72 74 52 65 73 70 6f 6e 73 65 28 63 6f 6e 73 74  rtResponse(const
3020: 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 43 6f   char *zResultCo
3030: 64 65 29 7b 0a 20 20 74 69 6d 65 5f 74 20 6e 6f  de){.  time_t no
3040: 77 3b 0a 20 20 74 69 6d 65 28 26 6e 6f 77 29 3b  w;.  time(&now);
3050: 0a 20 20 69 66 28 20 73 74 61 74 75 73 53 65 6e  .  if( statusSen
3060: 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e 4f  t ) return;.  nO
3070: 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 25 73  ut += printf("%s
3080: 20 25 73 5c 72 5c 6e 22 2c 20 7a 50 72 6f 74 6f   %s\r\n", zProto
3090: 63 6f 6c 2c 20 7a 52 65 73 75 6c 74 43 6f 64 65  col, zResultCode
30a0: 29 3b 0a 20 20 73 74 72 6e 63 70 79 28 7a 52 65  );.  strncpy(zRe
30b0: 70 6c 79 53 74 61 74 75 73 2c 20 7a 52 65 73 75  plyStatus, zResu
30c0: 6c 74 43 6f 64 65 2c 20 33 29 3b 0a 20 20 7a 52  ltCode, 3);.  zR
30d0: 65 70 6c 79 53 74 61 74 75 73 5b 33 5d 20 3d 20  eplyStatus[3] = 
30e0: 30 3b 0a 20 20 69 66 28 20 7a 52 65 70 6c 79 53  0;.  if( zReplyS
30f0: 74 61 74 75 73 5b 30 5d 3e 3d 27 34 27 20 29 7b  tatus[0]>='4' ){
3100: 0a 20 20 20 20 63 6c 6f 73 65 43 6f 6e 6e 65 63  .    closeConnec
3110: 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  tion = 1;.  }.  
3120: 69 66 28 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74  if( closeConnect
3130: 69 6f 6e 20 29 7b 0a 20 20 20 20 6e 4f 75 74 20  ion ){.    nOut 
3140: 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 6e 65  += printf("Conne
3150: 63 74 69 6f 6e 3a 20 63 6c 6f 73 65 5c 72 5c 6e  ction: close\r\n
3160: 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
3170: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
3180: 22 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 6b 65 65  "Connection: kee
3190: 70 2d 61 6c 69 76 65 5c 72 5c 6e 22 29 3b 0a 20  p-alive\r\n");. 
31a0: 20 7d 0a 20 20 6e 4f 75 74 20 2b 3d 20 44 61 74   }.  nOut += Dat
31b0: 65 54 61 67 28 22 44 61 74 65 22 2c 20 6e 6f 77  eTag("Date", now
31c0: 29 3b 0a 20 20 73 74 61 74 75 73 53 65 6e 74 20  );.  statusSent 
31d0: 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65  = 1;.}../*.** Te
31e0: 6c 6c 20 74 68 65 20 63 6c 69 65 6e 74 20 74 68  ll the client th
31f0: 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  at there is no s
3200: 75 63 68 20 64 6f 63 75 6d 65 6e 74 0a 2a 2f 0a  uch document.*/.
3210: 73 74 61 74 69 63 20 76 6f 69 64 20 4e 6f 74 46  static void NotF
3220: 6f 75 6e 64 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  ound(int lineno)
3230: 7b 0a 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73  {.  StartRespons
3240: 65 28 22 34 30 34 20 4e 6f 74 20 46 6f 75 6e 64  e("404 Not Found
3250: 22 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72  ");.  nOut += pr
3260: 69 6e 74 66 28 0a 20 20 20 20 22 43 6f 6e 74 65  intf(.    "Conte
3270: 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 68 74  nt-type: text/ht
3280: 6d 6c 5c 72 5c 6e 22 0a 20 20 20 20 22 5c 72 5c  ml\r\n".    "\r\
3290: 6e 22 0a 20 20 20 20 22 3c 68 65 61 64 3e 3c 74  n".    "<head><t
32a0: 69 74 6c 65 20 6c 69 6e 65 6e 6f 3d 5c 22 25 64  itle lineno=\"%d
32b0: 5c 22 3e 4e 6f 74 20 46 6f 75 6e 64 3c 2f 74 69  \">Not Found</ti
32c0: 74 6c 65 3e 3c 2f 68 65 61 64 3e 5c 6e 22 0a 20  tle></head>\n". 
32d0: 20 20 20 22 3c 62 6f 64 79 3e 3c 68 31 3e 44 6f     "<body><h1>Do
32e0: 63 75 6d 65 6e 74 20 4e 6f 74 20 46 6f 75 6e 64  cument Not Found
32f0: 3c 2f 68 31 3e 5c 6e 22 0a 20 20 20 20 22 54 68  </h1>\n".    "Th
3300: 65 20 64 6f 63 75 6d 65 6e 74 20 25 73 20 69 73  e document %s is
3310: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 6f   not available o
3320: 6e 20 74 68 69 73 20 73 65 72 76 65 72 5c 6e 22  n this server\n"
3330: 0a 20 20 20 20 22 3c 2f 62 6f 64 79 3e 5c 6e 22  .    "</body>\n"
3340: 2c 20 6c 69 6e 65 6e 6f 2c 20 7a 53 63 72 69 70  , lineno, zScrip
3350: 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74  t);.  MakeLogEnt
3360: 72 79 28 30 29 3b 0a 20 20 65 78 69 74 28 30 29  ry(0);.  exit(0)
3370: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20  ;.}../*.** Tell 
3380: 74 68 65 20 63 6c 69 65 6e 74 20 74 68 61 74 20  the client that 
3390: 74 68 65 79 20 61 72 65 20 6e 6f 74 20 77 65 6c  they are not wel
33a0: 63 6f 6d 65 64 20 68 65 72 65 2e 0a 2a 2f 0a 73  comed here..*/.s
33b0: 74 61 74 69 63 20 76 6f 69 64 20 46 6f 72 62 69  tatic void Forbi
33c0: 64 64 65 6e 28 76 6f 69 64 29 7b 0a 20 20 53 74  dden(void){.  St
33d0: 61 72 74 52 65 73 70 6f 6e 73 65 28 22 34 30 33  artResponse("403
33e0: 20 46 6f 72 62 69 64 64 65 6e 22 29 3b 0a 20 20   Forbidden");.  
33f0: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a  nOut += printf(.
3400: 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70      "Content-typ
3410: 65 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c 72 5c  e: text/plain\r\
3420: 6e 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20  n".    "\r\n".  
3430: 20 20 22 41 63 63 65 73 73 20 64 65 6e 69 65 64    "Access denied
3440: 5c 6e 22 0a 20 20 29 3b 0a 20 20 63 6c 6f 73 65  \n".  );.  close
3450: 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 31 3b 0a  Connection = 1;.
3460: 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30    MakeLogEntry(0
3470: 29 3b 0a 20 20 65 78 69 74 28 30 29 3b 0a 7d 0a  );.  exit(0);.}.
3480: 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20  ./*.** Tell the 
3490: 63 6c 69 65 6e 74 20 74 68 61 74 20 61 75 74 68  client that auth
34a0: 6f 72 69 7a 61 74 69 6f 6e 20 69 73 20 72 65 71  orization is req
34b0: 75 69 72 65 64 20 74 6f 20 61 63 63 65 73 73 20  uired to access 
34c0: 74 68 65 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 2e  the.** document.
34d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
34e0: 4e 6f 74 41 75 74 68 6f 72 69 7a 65 64 28 63 6f  NotAuthorized(co
34f0: 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 61 6c 6d  nst char *zRealm
3500: 29 7b 0a 20 20 53 74 61 72 74 52 65 73 70 6f 6e  ){.  StartRespon
3510: 73 65 28 22 34 30 31 20 41 75 74 68 6f 72 69 7a  se("401 Authoriz
3520: 61 74 69 6f 6e 20 52 65 71 75 69 72 65 64 22 29  ation Required")
3530: 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e  ;.  nOut += prin
3540: 74 66 28 0a 20 20 20 20 22 57 57 57 2d 41 75 74  tf(.    "WWW-Aut
3550: 68 65 6e 74 69 63 61 74 65 3a 20 42 61 73 69 63  henticate: Basic
3560: 20 72 65 61 6c 6d 3d 5c 22 25 73 5c 22 5c 72 5c   realm=\"%s\"\r\
3570: 6e 22 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d  n".    "Content-
3580: 74 79 70 65 3a 20 74 65 78 74 2f 68 74 6d 6c 5c  type: text/html\
3590: 72 5c 6e 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a  r\n".    "\r\n".
35a0: 20 20 20 20 22 3c 68 65 61 64 3e 3c 74 69 74 6c      "<head><titl
35b0: 65 3e 4e 6f 74 20 41 75 74 68 6f 72 69 7a 65 64  e>Not Authorized
35c0: 3c 2f 74 69 74 6c 65 3e 3c 2f 68 65 61 64 3e 5c  </title></head>\
35d0: 6e 22 0a 20 20 20 20 22 3c 62 6f 64 79 3e 3c 68  n".    "<body><h
35e0: 31 3e 34 30 31 20 4e 6f 74 20 41 75 74 68 6f 72  1>401 Not Author
35f0: 69 7a 65 64 3c 2f 68 31 3e 5c 6e 22 0a 20 20 20  ized</h1>\n".   
3600: 20 22 41 20 6c 6f 67 69 6e 20 61 6e 64 20 70 61   "A login and pa
3610: 73 73 77 6f 72 64 20 61 72 65 20 72 65 71 75 69  ssword are requi
3620: 72 65 64 20 66 6f 72 20 74 68 69 73 20 64 6f 63  red for this doc
3630: 75 6d 65 6e 74 5c 6e 22 0a 20 20 20 20 22 3c 2f  ument\n".    "</
3640: 62 6f 64 79 3e 5c 6e 22 2c 20 7a 52 65 61 6c 6d  body>\n", zRealm
3650: 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72  );.  MakeLogEntr
3660: 79 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  y(0);.}../*.** T
3670: 65 6c 6c 20 74 68 65 20 63 6c 69 65 6e 74 20 74  ell the client t
3680: 68 61 74 20 74 68 65 72 65 20 69 73 20 61 6e 20  hat there is an 
3690: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 73 63 72  error in the scr
36a0: 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ipt..*/.static v
36b0: 6f 69 64 20 43 67 69 45 72 72 6f 72 28 76 6f 69  oid CgiError(voi
36c0: 64 29 7b 0a 20 20 53 74 61 72 74 52 65 73 70 6f  d){.  StartRespo
36d0: 6e 73 65 28 22 35 30 30 20 45 72 72 6f 72 22 29  nse("500 Error")
36e0: 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e  ;.  nOut += prin
36f0: 74 66 28 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74  tf(.    "Content
3700: 2d 74 79 70 65 3a 20 74 65 78 74 2f 68 74 6d 6c  -type: text/html
3710: 5c 72 5c 6e 22 0a 20 20 20 20 22 5c 72 5c 6e 22  \r\n".    "\r\n"
3720: 0a 20 20 20 20 22 3c 68 65 61 64 3e 3c 74 69 74  .    "<head><tit
3730: 6c 65 3e 43 47 49 20 50 72 6f 67 72 61 6d 20 45  le>CGI Program E
3740: 72 72 6f 72 3c 2f 74 69 74 6c 65 3e 3c 2f 68 65  rror</title></he
3750: 61 64 3e 5c 6e 22 0a 20 20 20 20 22 3c 62 6f 64  ad>\n".    "<bod
3760: 79 3e 3c 68 31 3e 43 47 49 20 50 72 6f 67 72 61  y><h1>CGI Progra
3770: 6d 20 45 72 72 6f 72 3c 2f 68 31 3e 5c 6e 22 0a  m Error</h1>\n".
3780: 20 20 20 20 22 54 68 65 20 43 47 49 20 70 72 6f      "The CGI pro
3790: 67 72 61 6d 20 25 73 20 67 65 6e 65 72 61 74 65  gram %s generate
37a0: 64 20 61 6e 20 65 72 72 6f 72 5c 6e 22 0a 20 20  d an error\n".  
37b0: 20 20 22 3c 2f 62 6f 64 79 3e 5c 6e 22 2c 20 7a    "</body>\n", z
37c0: 53 63 72 69 70 74 29 3b 0a 20 20 4d 61 6b 65 4c  Script);.  MakeL
37d0: 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20 20 65 78  ogEntry(0);.  ex
37e0: 69 74 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  it(0);.}../*.** 
37f0: 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 69  This is called i
3800: 66 20 77 65 20 74 69 6d 65 6f 75 74 2e 0a 2a 2f  f we timeout..*/
3810: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 69 6d  .static void Tim
3820: 65 6f 75 74 28 69 6e 74 20 4e 6f 74 55 73 65 64  eout(int NotUsed
3830: 29 7b 0a 20 20 28 76 6f 69 64 29 4e 6f 74 55 73  ){.  (void)NotUs
3840: 65 64 3b 0a 20 20 69 66 28 20 21 64 65 62 75 67  ed;.  if( !debug
3850: 46 6c 61 67 20 29 7b 0a 20 20 20 20 69 66 28 20  Flag ){.    if( 
3860: 7a 53 63 72 69 70 74 20 26 26 20 7a 53 63 72 69  zScript && zScri
3870: 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73  pt[0] ){.      s
3880: 74 72 63 70 79 28 7a 52 65 70 6c 79 53 74 61 74  trcpy(zReplyStat
3890: 75 73 2c 20 22 39 39 39 22 29 3b 0a 20 20 20 20  us, "999");.    
38a0: 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30    MakeLogEntry(0
38b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 69  );.    }.    exi
38c0: 74 28 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  t(0);.  }.}../*.
38d0: 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c 69 65  ** Tell the clie
38e0: 6e 74 20 74 68 61 74 20 74 68 65 72 65 20 69 73  nt that there is
38f0: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65   an error in the
3900: 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74   script..*/.stat
3910: 69 63 20 76 6f 69 64 20 43 67 69 53 63 72 69 70  ic void CgiScrip
3920: 74 57 72 69 74 61 62 6c 65 28 76 6f 69 64 29 7b  tWritable(void){
3930: 0a 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65  .  StartResponse
3940: 28 22 35 30 30 20 43 47 49 20 43 6f 6e 66 69 67  ("500 CGI Config
3950: 75 72 61 74 69 6f 6e 20 45 72 72 6f 72 22 29 3b  uration Error");
3960: 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74  .  nOut += print
3970: 66 28 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d  f(.    "Content-
3980: 74 79 70 65 3a 20 74 65 78 74 2f 70 6c 61 69 6e  type: text/plain
3990: 5c 72 5c 6e 22 0a 20 20 20 20 22 5c 72 5c 6e 22  \r\n".    "\r\n"
39a0: 0a 20 20 20 20 22 54 68 65 20 43 47 49 20 70 72  .    "The CGI pr
39b0: 6f 67 72 61 6d 20 25 73 20 69 73 20 77 72 69 74  ogram %s is writ
39c0: 61 62 6c 65 20 62 79 20 75 73 65 72 73 20 6f 74  able by users ot
39d0: 68 65 72 20 74 68 61 6e 20 69 74 73 20 6f 77 6e  her than its own
39e0: 65 72 2e 5c 6e 22 2c 0a 20 20 20 20 7a 52 65 61  er.\n",.    zRea
39f0: 6c 53 63 72 69 70 74 29 3b 0a 20 20 4d 61 6b 65  lScript);.  Make
3a00: 4c 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20 20 65  LogEntry(0);.  e
3a10: 78 69 74 28 30 29 3b 20 20 20 20 20 20 20 0a 7d  xit(0);       .}
3a20: 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68 65  ../*.** Tell the
3a30: 20 63 6c 69 65 6e 74 20 74 68 61 74 20 74 68 65   client that the
3a40: 20 73 65 72 76 65 72 20 6d 61 6c 66 75 6e 63 74   server malfunct
3a50: 69 6f 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ioned..*/.static
3a60: 20 76 6f 69 64 20 4d 61 6c 66 75 6e 63 74 69 6f   void Malfunctio
3a70: 6e 28 69 6e 74 20 6c 69 6e 65 6e 75 6d 2c 20 63  n(int linenum, c
3a80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
3a90: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
3aa0: 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61  ist ap;.  va_sta
3ab0: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
3ac0: 0a 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65  .  StartResponse
3ad0: 28 22 35 30 30 20 53 65 72 76 65 72 20 4d 61 6c  ("500 Server Mal
3ae0: 66 75 6e 63 74 69 6f 6e 22 29 3b 0a 20 20 6e 4f  function");.  nO
3af0: 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20  ut += printf(.  
3b00: 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a    "Content-type:
3b10: 20 74 65 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22   text/plain\r\n"
3b20: 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20  .    "\r\n".    
3b30: 22 57 65 62 20 73 65 72 76 65 72 20 6d 61 6c 66  "Web server malf
3b40: 75 6e 63 74 69 6f 6e 65 64 3b 20 65 72 72 6f 72  unctioned; error
3b50: 20 6e 75 6d 62 65 72 20 25 64 5c 6e 5c 6e 22 2c   number %d\n\n",
3b60: 20 6c 69 6e 65 6e 75 6d 29 3b 0a 20 20 69 66 28   linenum);.  if(
3b70: 20 7a 46 6f 72 6d 61 74 20 29 7b 0a 20 20 20 20   zFormat ){.    
3b80: 6e 4f 75 74 20 2b 3d 20 76 70 72 69 6e 74 66 28  nOut += vprintf(
3b90: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
3ba0: 7d 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79  }.  MakeLogEntry
3bb0: 28 30 29 3b 0a 20 20 65 78 69 74 28 30 29 3b 20  (0);.  exit(0); 
3bc0: 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20        .}../*.** 
3bd0: 44 6f 20 61 20 73 65 72 76 65 72 20 72 65 64 69  Do a server redi
3be0: 72 65 63 74 20 74 6f 20 74 68 65 20 64 6f 63 75  rect to the docu
3bf0: 6d 65 6e 74 20 73 70 65 63 69 66 69 65 64 2e 20  ment specified. 
3c00: 20 54 68 65 20 64 6f 63 75 6d 65 6e 74 0a 2a 2a   The document.**
3c10: 20 6e 61 6d 65 20 6e 6f 74 20 63 6f 6e 74 61 69   name not contai
3c20: 6e 20 73 63 68 65 6d 65 20 6f 72 20 6e 65 74 77  n scheme or netw
3c30: 6f 72 6b 20 6c 6f 63 61 74 69 6f 6e 20 6f 72 20  ork location or 
3c40: 74 68 65 20 71 75 65 72 79 20 73 74 72 69 6e 67  the query string
3c50: 2e 0a 2a 2a 20 49 74 20 77 69 6c 6c 20 62 65 20  ..** It will be 
3c60: 6a 75 73 74 20 74 68 65 20 70 61 74 68 2e 0a 2a  just the path..*
3c70: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 52 65  /.static void Re
3c80: 64 69 72 65 63 74 28 63 6f 6e 73 74 20 63 68 61  direct(const cha
3c90: 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 69  r *zPath, int fi
3ca0: 6e 69 73 68 29 7b 0a 20 20 53 74 61 72 74 52 65  nish){.  StartRe
3cb0: 73 70 6f 6e 73 65 28 22 33 30 32 20 54 65 6d 70  sponse("302 Temp
3cc0: 6f 72 61 72 79 20 52 65 64 69 72 65 63 74 22 29  orary Redirect")
3cd0: 3b 0a 20 20 69 66 28 20 7a 53 65 72 76 65 72 50  ;.  if( zServerP
3ce0: 6f 72 74 3d 3d 30 20 7c 7c 20 7a 53 65 72 76 65  ort==0 || zServe
3cf0: 72 50 6f 72 74 5b 30 5d 3d 3d 30 20 7c 7c 20 73  rPort[0]==0 || s
3d00: 74 72 63 6d 70 28 7a 53 65 72 76 65 72 50 6f 72  trcmp(zServerPor
3d10: 74 2c 22 38 30 22 29 3d 3d 30 20 29 7b 0a 20 20  t,"80")==0 ){.  
3d20: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
3d30: 28 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73 3a 2f  ("Location: %s:/
3d40: 2f 25 73 25 73 25 73 5c 72 5c 6e 22 2c 0a 20 20  /%s%s%s\r\n",.  
3d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d60: 20 7a 48 74 74 70 2c 20 7a 53 65 72 76 65 72 4e   zHttp, zServerN
3d70: 61 6d 65 2c 20 7a 50 61 74 68 2c 20 7a 51 75 65  ame, zPath, zQue
3d80: 72 79 53 75 66 66 69 78 29 3b 0a 20 20 7d 65 6c  rySuffix);.  }el
3d90: 73 65 7b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20  se{.    nOut += 
3da0: 70 72 69 6e 74 66 28 22 4c 6f 63 61 74 69 6f 6e  printf("Location
3db0: 3a 20 25 73 3a 2f 2f 25 73 3a 25 73 25 73 25 73  : %s://%s:%s%s%s
3dc0: 5c 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  \r\n",.         
3dd0: 20 20 20 20 20 20 20 20 20 20 7a 48 74 74 70 2c            zHttp,
3de0: 20 7a 53 65 72 76 65 72 4e 61 6d 65 2c 20 7a 53   zServerName, zS
3df0: 65 72 76 65 72 50 6f 72 74 2c 20 7a 50 61 74 68  erverPort, zPath
3e00: 2c 20 7a 51 75 65 72 79 53 75 66 66 69 78 29 3b  , zQuerySuffix);
3e10: 0a 20 20 7d 0a 20 20 69 66 28 20 66 69 6e 69 73  .  }.  if( finis
3e20: 68 20 29 7b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d  h ){.    nOut +=
3e30: 20 70 72 69 6e 74 66 28 22 43 6f 6e 74 65 6e 74   printf("Content
3e40: 2d 6c 65 6e 67 74 68 3a 20 30 5c 72 5c 6e 22 29  -length: 0\r\n")
3e50: 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72  ;.    nOut += pr
3e60: 69 6e 74 66 28 22 5c 72 5c 6e 22 29 3b 0a 20 20  intf("\r\n");.  
3e70: 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30    MakeLogEntry(0
3e80: 29 3b 0a 20 20 7d 0a 20 20 66 66 6c 75 73 68 28  );.  }.  fflush(
3e90: 73 74 64 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  stdout);.}../*.*
3ea0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3eb0: 74 72 65 61 74 73 20 69 74 73 20 69 6e 70 75 74  treats its input
3ec0: 20 61 73 20 61 20 62 61 73 65 2d 36 34 20 73 74   as a base-64 st
3ed0: 72 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 73  ring and returns
3ee0: 20 74 68 65 0a 2a 2a 20 64 65 63 6f 64 65 64 20   the.** decoded 
3ef0: 76 61 6c 75 65 20 6f 66 20 74 68 61 74 20 73 74  value of that st
3f00: 72 69 6e 67 2e 20 20 43 68 61 72 61 63 74 65 72  ring.  Character
3f10: 73 20 6f 66 20 69 6e 70 75 74 20 74 68 61 74 20  s of input that 
3f20: 61 72 65 20 6e 6f 74 0a 2a 2a 20 76 61 6c 69 64  are not.** valid
3f30: 20 62 61 73 65 2d 36 34 20 63 68 61 72 61 63 74   base-64 charact
3f40: 65 72 73 20 28 73 75 63 68 20 61 73 20 73 70 61  ers (such as spa
3f50: 63 65 73 20 61 6e 64 20 6e 65 77 6c 69 6e 65 73  ces and newlines
3f60: 29 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a  ) are ignored..*
3f70: 2f 0a 76 6f 69 64 20 44 65 63 6f 64 65 36 34 28  /.void Decode64(
3f80: 63 68 61 72 20 2a 7a 36 34 29 7b 0a 20 20 63 68  char *z64){.  ch
3f90: 61 72 20 2a 7a 44 61 74 61 3b 0a 20 20 69 6e 74  ar *zData;.  int
3fa0: 20 6e 36 34 3b 0a 20 20 69 6e 74 20 69 2c 20 6a   n64;.  int i, j
3fb0: 3b 0a 20 20 69 6e 74 20 61 2c 20 62 2c 20 63 2c  ;.  int a, b, c,
3fc0: 20 64 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   d;.  static int
3fd0: 20 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 73   isInit = 0;.  s
3fe0: 74 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73 5b  tatic int trans[
3ff0: 31 32 38 5d 3b 0a 20 20 73 74 61 74 69 63 20 75  128];.  static u
4000: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 42 61  nsigned char zBa
4010: 73 65 5b 5d 20 3d 20 0a 20 20 20 20 22 41 42 43  se[] = .    "ABC
4020: 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53  DEFGHIJKLMNOPQRS
4030: 54 55 56 57 58 59 5a 61 62 63 64 65 66 67 68 69  TUVWXYZabcdefghi
4040: 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79  jklmnopqrstuvwxy
4050: 7a 30 31 32 33 34 35 36 37 38 39 2b 2f 22 3b 0a  z0123456789+/";.
4060: 0a 20 20 69 66 28 20 21 69 73 49 6e 69 74 20 29  .  if( !isInit )
4070: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
4080: 3c 31 32 38 3b 20 69 2b 2b 29 7b 20 74 72 61 6e  <128; i++){ tran
4090: 73 5b 69 5d 20 3d 20 30 3b 20 7d 0a 20 20 20 20  s[i] = 0; }.    
40a0: 66 6f 72 28 69 3d 30 3b 20 7a 42 61 73 65 5b 69  for(i=0; zBase[i
40b0: 5d 3b 20 69 2b 2b 29 7b 20 74 72 61 6e 73 5b 7a  ]; i++){ trans[z
40c0: 42 61 73 65 5b 69 5d 20 26 20 30 78 37 66 5d 20  Base[i] & 0x7f] 
40d0: 3d 20 69 3b 20 7d 0a 20 20 20 20 69 73 49 6e 69  = i; }.    isIni
40e0: 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 6e 36 34  t = 1;.  }.  n64
40f0: 20 3d 20 73 74 72 6c 65 6e 28 7a 36 34 29 3b 0a   = strlen(z64);.
4100: 20 20 77 68 69 6c 65 28 20 6e 36 34 3e 30 20 26    while( n64>0 &
4110: 26 20 7a 36 34 5b 6e 36 34 2d 31 5d 3d 3d 27 3d  & z64[n64-1]=='=
4120: 27 20 29 20 6e 36 34 2d 2d 3b 0a 20 20 7a 44 61  ' ) n64--;.  zDa
4130: 74 61 20 3d 20 7a 36 34 3b 0a 20 20 66 6f 72 28  ta = z64;.  for(
4140: 69 3d 6a 3d 30 3b 20 69 2b 33 3c 6e 36 34 3b 20  i=j=0; i+3<n64; 
4150: 69 2b 3d 34 29 7b 0a 20 20 20 20 61 20 3d 20 74  i+=4){.    a = t
4160: 72 61 6e 73 5b 7a 36 34 5b 69 5d 20 26 20 30 78  rans[z64[i] & 0x
4170: 37 66 5d 3b 0a 20 20 20 20 62 20 3d 20 74 72 61  7f];.    b = tra
4180: 6e 73 5b 7a 36 34 5b 69 2b 31 5d 20 26 20 30 78  ns[z64[i+1] & 0x
4190: 37 66 5d 3b 0a 20 20 20 20 63 20 3d 20 74 72 61  7f];.    c = tra
41a0: 6e 73 5b 7a 36 34 5b 69 2b 32 5d 20 26 20 30 78  ns[z64[i+2] & 0x
41b0: 37 66 5d 3b 0a 20 20 20 20 64 20 3d 20 74 72 61  7f];.    d = tra
41c0: 6e 73 5b 7a 36 34 5b 69 2b 33 5d 20 26 20 30 78  ns[z64[i+3] & 0x
41d0: 37 66 5d 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a  7f];.    zData[j
41e0: 2b 2b 5d 20 3d 20 28 28 61 3c 3c 32 29 20 26 20  ++] = ((a<<2) & 
41f0: 30 78 66 63 29 20 7c 20 28 28 62 3e 3e 34 29 20  0xfc) | ((b>>4) 
4200: 26 20 30 78 30 33 29 3b 0a 20 20 20 20 7a 44 61  & 0x03);.    zDa
4210: 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28 62 3c 3c 34  ta[j++] = ((b<<4
4220: 29 20 26 20 30 78 66 30 29 20 7c 20 28 28 63 3e  ) & 0xf0) | ((c>
4230: 3e 32 29 20 26 20 30 78 30 66 29 3b 0a 20 20 20  >2) & 0x0f);.   
4240: 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28   zData[j++] = ((
4250: 63 3c 3c 36 29 20 26 20 30 78 63 30 29 20 7c 20  c<<6) & 0xc0) | 
4260: 28 64 20 26 20 30 78 33 66 29 3b 0a 20 20 7d 0a  (d & 0x3f);.  }.
4270: 20 20 69 66 28 20 69 2b 32 3c 6e 36 34 20 29 7b    if( i+2<n64 ){
4280: 0a 20 20 20 20 61 20 3d 20 74 72 61 6e 73 5b 7a  .    a = trans[z
4290: 36 34 5b 69 5d 20 26 20 30 78 37 66 5d 3b 0a 20  64[i] & 0x7f];. 
42a0: 20 20 20 62 20 3d 20 74 72 61 6e 73 5b 7a 36 34     b = trans[z64
42b0: 5b 69 2b 31 5d 20 26 20 30 78 37 66 5d 3b 0a 20  [i+1] & 0x7f];. 
42c0: 20 20 20 63 20 3d 20 74 72 61 6e 73 5b 7a 36 34     c = trans[z64
42d0: 5b 69 2b 32 5d 20 26 20 30 78 37 66 5d 3b 0a 20  [i+2] & 0x7f];. 
42e0: 20 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20     zData[j++] = 
42f0: 28 28 61 3c 3c 32 29 20 26 20 30 78 66 63 29 20  ((a<<2) & 0xfc) 
4300: 7c 20 28 28 62 3e 3e 34 29 20 26 20 30 78 30 33  | ((b>>4) & 0x03
4310: 29 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b 2b  );.    zData[j++
4320: 5d 20 3d 20 28 28 62 3c 3c 34 29 20 26 20 30 78  ] = ((b<<4) & 0x
4330: 66 30 29 20 7c 20 28 28 63 3e 3e 32 29 20 26 20  f0) | ((c>>2) & 
4340: 30 78 30 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69  0x0f);.  }else i
4350: 66 28 20 69 2b 31 3c 6e 36 34 20 29 7b 0a 20 20  f( i+1<n64 ){.  
4360: 20 20 61 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b    a = trans[z64[
4370: 69 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20  i] & 0x7f];.    
4380: 62 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b  b = trans[z64[i+
4390: 31 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20  1] & 0x7f];.    
43a0: 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28 61  zData[j++] = ((a
43b0: 3c 3c 32 29 20 26 20 30 78 66 63 29 20 7c 20 28  <<2) & 0xfc) | (
43c0: 28 62 3e 3e 34 29 20 26 20 30 78 30 33 29 3b 0a  (b>>4) & 0x03);.
43d0: 20 20 7d 0a 20 20 7a 44 61 74 61 5b 6a 5d 20 3d    }.  zData[j] =
43e0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65   0;.}../*.** Che
43f0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 62 61 73  ck to see if bas
4400: 69 63 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  ic authorization
4410: 20 63 72 65 64 65 6e 74 69 61 6c 73 20 61 72 65   credentials are
4420: 20 70 72 6f 76 69 64 65 64 20 66 6f 72 0a 2a 2a   provided for.**
4430: 20 74 68 65 20 75 73 65 72 20 61 63 63 6f 72 64   the user accord
4440: 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 66 6f 72  ing to the infor
4450: 6d 61 74 69 6f 6e 20 69 6e 20 7a 41 75 74 68 46  mation in zAuthF
4460: 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ile.  Return tru
4470: 65 0a 2a 2a 20 69 66 20 61 75 74 68 6f 72 69 7a  e.** if authoriz
4480: 65 64 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ed.  Return fals
4490: 65 20 69 66 20 6e 6f 74 20 61 75 74 68 6f 72 69  e if not authori
44a0: 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 69 6c 65 20  zed..**.** File 
44b0: 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  format:.**.**   
44c0: 20 2a 20 20 42 6c 61 6e 6b 20 6c 69 6e 65 73 20   *  Blank lines 
44d0: 61 6e 64 20 6c 69 6e 65 73 20 74 68 61 74 20 62  and lines that b
44e0: 65 67 69 6e 20 77 69 74 68 20 27 23 27 20 61 72  egin with '#' ar
44f0: 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 20 20 20  e ignored.**    
4500: 2a 20 20 22 68 74 74 70 2d 72 65 64 69 72 65 63  *  "http-redirec
4510: 74 22 20 66 6f 72 63 65 73 20 61 20 72 65 64 69  t" forces a redi
4520: 72 65 63 74 20 74 6f 20 48 54 54 50 53 20 69 66  rect to HTTPS if
4530: 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61   not there alrea
4540: 64 79 0a 2a 2a 20 20 20 20 2a 20 20 22 68 74 74  dy.**    *  "htt
4550: 70 73 2d 6f 6e 6c 79 22 20 64 69 73 61 6c 6c 6f  ps-only" disallo
4560: 77 73 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 20  ws operation in 
4570: 48 54 54 50 0a 2a 2a 20 20 20 20 2a 20 20 22 75  HTTP.**    *  "u
4580: 73 65 72 20 4e 41 4d 45 20 4c 4f 47 49 4e 3a 50  ser NAME LOGIN:P
4590: 41 53 53 57 4f 52 44 22 20 63 68 65 63 6b 73 20  ASSWORD" checks 
45a0: 74 6f 20 73 65 65 20 69 66 20 4c 4f 47 49 4e 3a  to see if LOGIN:
45b0: 50 41 53 53 57 4f 52 44 20 0a 2a 2a 20 20 20 20  PASSWORD .**    
45c0: 20 20 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e     authorization
45d0: 20 63 72 65 64 65 6e 74 69 61 6c 73 20 61 72 65   credentials are
45e0: 20 70 72 6f 76 69 64 65 64 2c 20 61 6e 64 20 69   provided, and i
45f0: 66 20 73 6f 20 73 65 74 73 20 74 68 65 0a 2a 2a  f so sets the.**
4600: 20 20 20 20 20 20 20 52 45 4d 4f 54 45 5f 55 53         REMOTE_US
4610: 45 52 20 74 6f 20 4e 41 4d 45 2e 0a 2a 2a 20 20  ER to NAME..**  
4620: 20 20 2a 20 20 22 72 65 61 6c 6d 20 54 45 58 54    *  "realm TEXT
4630: 22 20 73 65 74 73 20 74 68 65 20 72 65 61 6c 6d  " sets the realm
4640: 20 74 6f 20 54 45 58 54 2e 0a 2a 2f 0a 73 74 61   to TEXT..*/.sta
4650: 74 69 63 20 69 6e 74 20 43 68 65 63 6b 42 61 73  tic int CheckBas
4660: 69 63 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e 28  icAuthorization(
4670: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 75 74  const char *zAut
4680: 68 46 69 6c 65 29 7b 0a 20 20 46 49 4c 45 20 2a  hFile){.  FILE *
4690: 69 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 61  in;.  char *zRea
46a0: 6c 6d 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 72 65  lm = "unknown re
46b0: 61 6c 6d 22 3b 0a 20 20 63 68 61 72 20 2a 7a 4c  alm";.  char *zL
46c0: 6f 67 69 6e 50 73 77 64 3b 0a 20 20 63 68 61 72  oginPswd;.  char
46d0: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63 68 61 72 20   *zName;.  char 
46e0: 7a 4c 69 6e 65 5b 32 30 30 30 5d 3b 0a 0a 20 20  zLine[2000];..  
46f0: 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 41 75 74 68  in = fopen(zAuth
4700: 46 69 6c 65 2c 20 22 72 22 29 3b 0a 20 20 69 66  File, "r");.  if
4710: 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 4e  ( in==0 ){.    N
4720: 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f  otFound(__LINE__
4730: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
4740: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 41 75 74 68  .  }.  if( zAuth
4750: 41 72 67 20 29 20 44 65 63 6f 64 65 36 34 28 7a  Arg ) Decode64(z
4760: 41 75 74 68 41 72 67 29 3b 0a 20 20 77 68 69 6c  AuthArg);.  whil
4770: 65 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 20  e( fgets(zLine, 
4780: 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 69  sizeof(zLine), i
4790: 6e 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  n) ){.    char *
47a0: 7a 46 69 65 6c 64 4e 61 6d 65 3b 0a 20 20 20 20  zFieldName;.    
47b0: 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 0a 20 20 20  char *zVal;..   
47c0: 20 7a 46 69 65 6c 64 4e 61 6d 65 20 3d 20 47 65   zFieldName = Ge
47d0: 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a 4c  tFirstElement(zL
47e0: 69 6e 65 2c 26 7a 56 61 6c 29 3b 0a 20 20 20 20  ine,&zVal);.    
47f0: 69 66 28 20 7a 46 69 65 6c 64 4e 61 6d 65 3d 3d  if( zFieldName==
4800: 30 20 7c 7c 20 2a 7a 46 69 65 6c 64 4e 61 6d 65  0 || *zFieldName
4810: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
4820: 20 20 20 20 69 66 28 20 7a 46 69 65 6c 64 4e 61      if( zFieldNa
4830: 6d 65 5b 30 5d 3d 3d 27 23 27 20 29 20 63 6f 6e  me[0]=='#' ) con
4840: 74 69 6e 75 65 3b 0a 20 20 20 20 52 65 6d 6f 76  tinue;.    Remov
4850: 65 4e 65 77 6c 69 6e 65 28 7a 56 61 6c 29 3b 0a  eNewline(zVal);.
4860: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
4870: 46 69 65 6c 64 4e 61 6d 65 2c 20 22 72 65 61 6c  FieldName, "real
4880: 6d 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  m")==0 ){.      
4890: 7a 52 65 61 6c 6d 20 3d 20 53 74 72 44 75 70 28  zRealm = StrDup(
48a0: 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  zVal);.    }else
48b0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 65   if( strcmp(zFie
48c0: 6c 64 4e 61 6d 65 2c 22 75 73 65 72 22 29 3d 3d  ldName,"user")==
48d0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  0 ){.      if( z
48e0: 41 75 74 68 41 72 67 3d 3d 30 20 29 20 63 6f 6e  AuthArg==0 ) con
48f0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7a 4e 61  tinue;.      zNa
4900: 6d 65 20 3d 20 47 65 74 46 69 72 73 74 45 6c 65  me = GetFirstEle
4910: 6d 65 6e 74 28 7a 56 61 6c 2c 20 26 7a 56 61 6c  ment(zVal, &zVal
4920: 29 3b 0a 20 20 20 20 20 20 7a 4c 6f 67 69 6e 50  );.      zLoginP
4930: 73 77 64 20 3d 20 47 65 74 46 69 72 73 74 45 6c  swd = GetFirstEl
4940: 65 6d 65 6e 74 28 7a 56 61 6c 2c 20 26 7a 56 61  ement(zVal, &zVa
4950: 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c  l);.      if( zL
4960: 6f 67 69 6e 50 73 77 64 3d 3d 30 20 29 20 63 6f  oginPswd==0 ) co
4970: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
4980: 28 20 7a 41 75 74 68 41 72 67 20 26 26 20 73 74  ( zAuthArg && st
4990: 72 63 6d 70 28 7a 41 75 74 68 41 72 67 2c 7a 4c  rcmp(zAuthArg,zL
49a0: 6f 67 69 6e 50 73 77 64 29 3d 3d 30 20 29 7b 0a  oginPswd)==0 ){.
49b0: 20 20 20 20 20 20 20 20 7a 52 65 6d 6f 74 65 55          zRemoteU
49c0: 73 65 72 20 3d 20 53 74 72 44 75 70 28 7a 4e 61  ser = StrDup(zNa
49d0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 66 63 6c  me);.        fcl
49e0: 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 20  ose(in);.       
49f0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
4a00: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
4a10: 20 73 74 72 63 6d 70 28 7a 46 69 65 6c 64 4e 61   strcmp(zFieldNa
4a20: 6d 65 2c 22 68 74 74 70 73 2d 6f 6e 6c 79 22 29  me,"https-only")
4a30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
4a40: 20 21 75 73 65 48 74 74 70 73 20 29 7b 0a 20 20   !useHttps ){.  
4a50: 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f        NotFound(_
4a60: 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
4a70: 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
4a80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
4a90: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
4aa0: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69  e if( strcmp(zFi
4ab0: 65 6c 64 4e 61 6d 65 2c 22 68 74 74 70 2d 72 65  eldName,"http-re
4ac0: 64 69 72 65 63 74 22 29 3d 3d 30 20 29 7b 0a 20  direct")==0 ){. 
4ad0: 20 20 20 20 20 69 66 28 20 21 75 73 65 48 74 74       if( !useHtt
4ae0: 70 73 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 48  ps ){.        zH
4af0: 74 74 70 20 3d 20 22 68 74 74 70 73 22 3b 0a 20  ttp = "https";. 
4b00: 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a         sprintf(z
4b10: 4c 69 6e 65 2c 20 22 25 73 25 73 22 2c 20 7a 53  Line, "%s%s", zS
4b20: 63 72 69 70 74 2c 20 7a 50 61 74 68 49 6e 66 6f  cript, zPathInfo
4b30: 29 3b 0a 20 20 20 20 20 20 20 20 52 65 64 69 72  );.        Redir
4b40: 65 63 74 28 7a 4c 69 6e 65 2c 20 31 29 3b 0a 20  ect(zLine, 1);. 
4b50: 20 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69 6e         fclose(in
4b60: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
4b70: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
4b80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4e 6f   }else{.      No
4b90: 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29  tFound(__LINE__)
4ba0: 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69  ;.      fclose(i
4bb0: 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  n);.      return
4bc0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
4bd0: 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 4e 6f  fclose(in);.  No
4be0: 74 41 75 74 68 6f 72 69 7a 65 64 28 7a 52 65 61  tAuthorized(zRea
4bf0: 6c 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  lm);.  return 0;
4c00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 75 65 73 73 20  .}../*.** Guess 
4c10: 74 68 65 20 6d 69 6d 65 2d 74 79 70 65 20 6f 66  the mime-type of
4c20: 20 61 20 64 6f 63 75 6d 65 6e 74 20 62 61 73 65   a document base
4c30: 64 20 6f 6e 20 69 74 73 20 6e 61 6d 65 2e 0a 2a  d on its name..*
4c40: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 47 65  /.const char *Ge
4c50: 74 4d 69 6d 65 54 79 70 65 28 63 6f 6e 73 74 20  tMimeType(const 
4c60: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74  char *zName, int
4c70: 20 6e 4e 61 6d 65 29 7b 0a 20 20 63 6f 6e 73 74   nName){.  const
4c80: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20   char *z;.  int 
4c90: 69 3b 0a 20 20 69 6e 74 20 66 69 72 73 74 2c 20  i;.  int first, 
4ca0: 6c 61 73 74 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b  last;.  int len;
4cb0: 0a 20 20 63 68 61 72 20 7a 53 75 66 66 69 78 5b  .  char zSuffix[
4cc0: 32 30 5d 3b 0a 0a 20 20 2f 2a 20 41 20 74 61 62  20];..  /* A tab
4cd0: 6c 65 20 6f 66 20 6d 69 6d 65 74 79 70 65 73 20  le of mimetypes 
4ce0: 62 61 73 65 64 20 6f 6e 20 66 69 6c 65 20 73 75  based on file su
4cf0: 66 66 69 78 65 73 2e 20 0a 20 20 2a 2a 20 53 75  ffixes. .  ** Su
4d00: 66 66 69 78 65 73 20 6d 75 73 74 20 62 65 20 69  ffixes must be i
4d10: 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20 73  n sorted order s
4d20: 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 64 6f  o that we can do
4d30: 20 61 20 62 69 6e 61 72 79 0a 20 20 2a 2a 20 73   a binary.  ** s
4d40: 65 61 72 63 68 20 74 6f 20 66 69 6e 64 20 74 68  earch to find th
4d50: 65 20 6d 69 6d 65 2d 74 79 70 65 0a 20 20 2a 2f  e mime-type.  */
4d60: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
4d70: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e  struct {.    con
4d80: 73 74 20 63 68 61 72 20 2a 7a 53 75 66 66 69 78  st char *zSuffix
4d90: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66  ;       /* The f
4da0: 69 6c 65 20 73 75 66 66 69 78 20 2a 2f 0a 20 20  ile suffix */.  
4db0: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4dd0: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 75  Length of the su
4de0: 66 66 69 78 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  ffix */.    cons
4df0: 74 20 63 68 61 72 20 2a 7a 4d 69 6d 65 74 79 70  t char *zMimetyp
4e00: 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  e;     /* The co
4e10: 72 72 65 73 70 6f 6e 64 69 6e 67 20 6d 69 6d 65  rresponding mime
4e20: 74 79 70 65 20 2a 2f 0a 20 20 7d 20 61 4d 69 6d  type */.  } aMim
4e30: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 61  e[] = {.    { "a
4e40: 69 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22  i",         2, "
4e50: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 6f 73 74  application/post
4e60: 73 63 72 69 70 74 22 20 20 20 20 20 20 20 20 20  script"         
4e70: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 69 66     },.    { "aif
4e80: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75  ",        3, "au
4e90: 64 69 6f 2f 78 2d 61 69 66 66 22 20 20 20 20 20  dio/x-aiff"     
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4eb0: 20 7d 2c 0a 20 20 20 20 7b 20 22 61 69 66 63 22   },.    { "aifc"
4ec0: 2c 20 20 20 20 20 20 20 34 2c 20 22 61 75 64 69  ,       4, "audi
4ed0: 6f 2f 78 2d 61 69 66 66 22 20 20 20 20 20 20 20  o/x-aiff"       
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
4ef0: 2c 0a 20 20 20 20 7b 20 22 61 69 66 66 22 2c 20  ,.    { "aiff", 
4f00: 20 20 20 20 20 20 34 2c 20 22 61 75 64 69 6f 2f        4, "audio/
4f10: 78 2d 61 69 66 66 22 20 20 20 20 20 20 20 20 20  x-aiff"         
4f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
4f30: 20 20 20 20 7b 20 22 61 72 6a 22 2c 20 20 20 20      { "arj",    
4f40: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
4f50: 69 6f 6e 2f 78 2d 61 72 6a 2d 63 6f 6d 70 72 65  ion/x-arj-compre
4f60: 73 73 65 64 22 20 20 20 20 20 20 7d 2c 0a 20 20  ssed"      },.  
4f70: 20 20 7b 20 22 61 73 63 22 2c 20 20 20 20 20 20    { "asc",      
4f80: 20 20 33 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e    3, "text/plain
4f90: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
4fa0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
4fb0: 7b 20 22 61 73 66 22 2c 20 20 20 20 20 20 20 20  { "asf",        
4fc0: 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 61  3, "video/x-ms-a
4fd0: 73 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20  sf"             
4fe0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
4ff0: 22 61 73 78 22 2c 20 20 20 20 20 20 20 20 33 2c  "asx",        3,
5000: 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 61 73 78   "video/x-ms-asx
5010: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
5020: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61       },.    { "a
5030: 75 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22  u",         2, "
5040: 61 75 64 69 6f 2f 75 6c 61 77 22 20 20 20 20 20  audio/ulaw"     
5050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5060: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 76 69     },.    { "avi
5070: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69  ",        3, "vi
5080: 64 65 6f 2f 78 2d 6d 73 76 69 64 65 6f 22 20 20  deo/x-msvideo"  
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50a0: 20 7d 2c 0a 20 20 20 20 7b 20 22 62 61 74 22 2c   },.    { "bat",
50b0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
50c0: 69 63 61 74 69 6f 6e 2f 78 2d 6d 73 64 6f 73 2d  ication/x-msdos-
50d0: 70 72 6f 67 72 61 6d 22 20 20 20 20 20 20 20 7d  program"       }
50e0: 2c 0a 20 20 20 20 7b 20 22 62 63 70 69 6f 22 2c  ,.    { "bcpio",
50f0: 20 20 20 20 20 20 35 2c 20 22 61 70 70 6c 69 63        5, "applic
5100: 61 74 69 6f 6e 2f 78 2d 62 63 70 69 6f 22 20 20  ation/x-bcpio"  
5110: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
5120: 20 20 20 20 7b 20 22 62 69 6e 22 2c 20 20 20 20      { "bin",    
5130: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
5140: 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d  ion/octet-stream
5150: 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  "          },.  
5160: 20 20 7b 20 22 63 22 2c 20 20 20 20 20 20 20 20    { "c",        
5170: 20 20 31 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e    1, "text/plain
5180: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
5190: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
51a0: 7b 20 22 63 63 22 2c 20 20 20 20 20 20 20 20 20  { "cc",         
51b0: 32 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20  2, "text/plain" 
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51d0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
51e0: 22 63 63 61 64 22 2c 20 20 20 20 20 20 20 34 2c  "ccad",       4,
51f0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 63 6c   "application/cl
5200: 61 72 69 73 63 61 64 22 20 20 20 20 20 20 20 20  ariscad"        
5210: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63       },.    { "c
5220: 64 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  df",        3, "
5230: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6e 65  application/x-ne
5240: 74 63 64 66 22 20 20 20 20 20 20 20 20 20 20 20  tcdf"           
5250: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6c 61     },.    { "cla
5260: 73 73 22 2c 20 20 20 20 20 20 35 2c 20 22 61 70  ss",      5, "ap
5270: 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d  plication/octet-
5280: 73 74 72 65 61 6d 22 20 20 20 20 20 20 20 20 20  stream"         
5290: 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 64 22 2c   },.    { "cod",
52a0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
52b0: 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 72 69 6d 2e  ication/vnd.rim.
52c0: 63 6f 64 22 20 20 20 20 20 20 20 20 20 20 20 7d  cod"           }
52d0: 2c 0a 20 20 20 20 7b 20 22 63 6f 6d 22 2c 20 20  ,.    { "com",  
52e0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
52f0: 61 74 69 6f 6e 2f 78 2d 6d 73 64 6f 73 2d 70 72  ation/x-msdos-pr
5300: 6f 67 72 61 6d 22 20 20 20 20 20 20 20 7d 2c 0a  ogram"       },.
5310: 20 20 20 20 7b 20 22 63 70 69 6f 22 2c 20 20 20      { "cpio",   
5320: 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74      4, "applicat
5330: 69 6f 6e 2f 78 2d 63 70 69 6f 22 20 20 20 20 20  ion/x-cpio"     
5340: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
5350: 20 20 7b 20 22 63 70 74 22 2c 20 20 20 20 20 20    { "cpt",      
5360: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
5370: 6e 2f 6d 61 63 2d 63 6f 6d 70 61 63 74 70 72 6f  n/mac-compactpro
5380: 22 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  "        },.    
5390: 7b 20 22 63 73 68 22 2c 20 20 20 20 20 20 20 20  { "csh",        
53a0: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
53b0: 78 2d 63 73 68 22 20 20 20 20 20 20 20 20 20 20  x-csh"          
53c0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
53d0: 22 63 73 73 22 2c 20 20 20 20 20 20 20 20 33 2c  "css",        3,
53e0: 20 22 74 65 78 74 2f 63 73 73 22 20 20 20 20 20   "text/css"     
53f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5400: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64       },.    { "d
5410: 63 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  cr",        3, "
5420: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 64 69  application/x-di
5430: 72 65 63 74 6f 72 22 20 20 20 20 20 20 20 20 20  rector"         
5440: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 65 62     },.    { "deb
5450: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
5460: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 64 65 62 69  plication/x-debi
5470: 61 6e 2d 70 61 63 6b 61 67 65 22 20 20 20 20 20  an-package"     
5480: 20 7d 2c 0a 20 20 20 20 7b 20 22 64 69 72 22 2c   },.    { "dir",
5490: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
54a0: 69 63 61 74 69 6f 6e 2f 78 2d 64 69 72 65 63 74  ication/x-direct
54b0: 6f 72 22 20 20 20 20 20 20 20 20 20 20 20 20 7d  or"            }
54c0: 2c 0a 20 20 20 20 7b 20 22 64 6c 22 2c 20 20 20  ,.    { "dl",   
54d0: 20 20 20 20 20 20 32 2c 20 22 76 69 64 65 6f 2f        2, "video/
54e0: 64 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20  dl"             
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
5500: 20 20 20 20 7b 20 22 64 6d 73 22 2c 20 20 20 20      { "dms",    
5510: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
5520: 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d  ion/octet-stream
5530: 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  "          },.  
5540: 20 20 7b 20 22 64 6f 63 22 2c 20 20 20 20 20 20    { "doc",      
5550: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
5560: 6e 2f 6d 73 77 6f 72 64 22 20 20 20 20 20 20 20  n/msword"       
5570: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
5580: 7b 20 22 64 72 77 22 2c 20 20 20 20 20 20 20 20  { "drw",        
5590: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
55a0: 64 72 61 66 74 69 6e 67 22 20 20 20 20 20 20 20  drafting"       
55b0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
55c0: 22 64 76 69 22 2c 20 20 20 20 20 20 20 20 33 2c  "dvi",        3,
55d0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
55e0: 64 76 69 22 20 20 20 20 20 20 20 20 20 20 20 20  dvi"            
55f0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64       },.    { "d
5600: 77 67 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  wg",        3, "
5610: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 61 63 61 64  application/acad
5620: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
5630: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 78 66     },.    { "dxf
5640: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
5650: 70 6c 69 63 61 74 69 6f 6e 2f 64 78 66 22 20 20  plication/dxf"  
5660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5670: 20 7d 2c 0a 20 20 20 20 7b 20 22 64 78 72 22 2c   },.    { "dxr",
5680: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
5690: 69 63 61 74 69 6f 6e 2f 78 2d 64 69 72 65 63 74  ication/x-direct
56a0: 6f 72 22 20 20 20 20 20 20 20 20 20 20 20 20 7d  or"            }
56b0: 2c 0a 20 20 20 20 7b 20 22 65 70 73 22 2c 20 20  ,.    { "eps",  
56c0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
56d0: 61 74 69 6f 6e 2f 70 6f 73 74 73 63 72 69 70 74  ation/postscript
56e0: 22 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  "            },.
56f0: 20 20 20 20 7b 20 22 65 74 78 22 2c 20 20 20 20      { "etx",    
5700: 20 20 20 20 33 2c 20 22 74 65 78 74 2f 78 2d 73      3, "text/x-s
5710: 65 74 65 78 74 22 20 20 20 20 20 20 20 20 20 20  etext"          
5720: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
5730: 20 20 7b 20 22 65 78 65 22 2c 20 20 20 20 20 20    { "exe",      
5740: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
5750: 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22 20  n/octet-stream" 
5760: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
5770: 7b 20 22 65 7a 22 2c 20 20 20 20 20 20 20 20 20  { "ez",         
5780: 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  2, "application/
5790: 61 6e 64 72 65 77 2d 69 6e 73 65 74 22 20 20 20  andrew-inset"   
57a0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
57b0: 22 66 22 2c 20 20 20 20 20 20 20 20 20 20 31 2c  "f",          1,
57c0: 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20 20   "text/plain"   
57d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57e0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66       },.    { "f
57f0: 39 30 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  90",        3, "
5800: 74 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20 20  text/plain"     
5810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5820: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66 6c 69     },.    { "fli
5830: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69  ",        3, "vi
5840: 64 65 6f 2f 66 6c 69 22 20 20 20 20 20 20 20 20  deo/fli"        
5850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5860: 20 7d 2c 0a 20 20 20 20 7b 20 22 66 6c 76 22 2c   },.    { "flv",
5870: 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64 65          3, "vide
5880: 6f 2f 66 6c 76 22 20 20 20 20 20 20 20 20 20 20  o/flv"          
5890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
58a0: 2c 0a 20 20 20 20 7b 20 22 67 69 66 22 2c 20 20  ,.    { "gif",  
58b0: 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f        3, "image/
58c0: 67 69 66 22 20 20 20 20 20 20 20 20 20 20 20 20  gif"            
58d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
58e0: 20 20 20 20 7b 20 22 67 6c 22 2c 20 20 20 20 20      { "gl",     
58f0: 20 20 20 20 32 2c 20 22 76 69 64 65 6f 2f 67 6c      2, "video/gl
5900: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
5910: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
5920: 20 20 7b 20 22 67 74 61 72 22 2c 20 20 20 20 20    { "gtar",     
5930: 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    4, "applicatio
5940: 6e 2f 78 2d 67 74 61 72 22 20 20 20 20 20 20 20  n/x-gtar"       
5950: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
5960: 7b 20 22 67 7a 22 2c 20 20 20 20 20 20 20 20 20  { "gz",         
5970: 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  2, "application/
5980: 78 2d 67 7a 69 70 22 20 20 20 20 20 20 20 20 20  x-gzip"         
5990: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
59a0: 22 68 64 66 22 2c 20 20 20 20 20 20 20 20 33 2c  "hdf",        3,
59b0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
59c0: 68 64 66 22 20 20 20 20 20 20 20 20 20 20 20 20  hdf"            
59d0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68       },.    { "h
59e0: 68 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22  h",         2, "
59f0: 74 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20 20  text/plain"     
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a10: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68 71 78     },.    { "hqx
5a20: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
5a30: 70 6c 69 63 61 74 69 6f 6e 2f 6d 61 63 2d 62 69  plication/mac-bi
5a40: 6e 68 65 78 34 30 22 20 20 20 20 20 20 20 20 20  nhex40"         
5a50: 20 7d 2c 0a 20 20 20 20 7b 20 22 68 22 2c 20 20   },.    { "h",  
5a60: 20 20 20 20 20 20 20 20 31 2c 20 22 74 65 78 74          1, "text
5a70: 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20  /plain"         
5a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
5a90: 2c 0a 20 20 20 20 7b 20 22 68 74 6d 22 2c 20 20  ,.    { "htm",  
5aa0: 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 68        3, "text/h
5ab0: 74 6d 6c 3b 20 63 68 61 72 73 65 74 3d 75 74 66  tml; charset=utf
5ac0: 2d 38 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  -8"          },.
5ad0: 20 20 20 20 7b 20 22 68 74 6d 6c 22 2c 20 20 20      { "html",   
5ae0: 20 20 20 20 34 2c 20 22 74 65 78 74 2f 68 74 6d      4, "text/htm
5af0: 6c 3b 20 63 68 61 72 73 65 74 3d 75 74 66 2d 38  l; charset=utf-8
5b00: 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  "          },.  
5b10: 20 20 7b 20 22 69 63 65 22 2c 20 20 20 20 20 20    { "ice",      
5b20: 20 20 33 2c 20 22 78 2d 63 6f 6e 66 65 72 65 6e    3, "x-conferen
5b30: 63 65 2f 78 2d 63 6f 6f 6c 74 61 6c 6b 22 20 20  ce/x-cooltalk"  
5b40: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
5b50: 7b 20 22 69 65 66 22 2c 20 20 20 20 20 20 20 20  { "ief",        
5b60: 33 2c 20 22 69 6d 61 67 65 2f 69 65 66 22 20 20  3, "image/ief"  
5b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b80: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
5b90: 22 69 67 65 73 22 2c 20 20 20 20 20 20 20 34 2c  "iges",       4,
5ba0: 20 22 6d 6f 64 65 6c 2f 69 67 65 73 22 20 20 20   "model/iges"   
5bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bc0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69       },.    { "i
5bd0: 67 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  gs",        3, "
5be0: 6d 6f 64 65 6c 2f 69 67 65 73 22 20 20 20 20 20  model/iges"     
5bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c00: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 70 73     },.    { "ips
5c10: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
5c20: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 69 70 73 63  plication/x-ipsc
5c30: 72 69 70 74 22 20 20 20 20 20 20 20 20 20 20 20  ript"           
5c40: 20 7d 2c 0a 20 20 20 20 7b 20 22 69 70 78 22 2c   },.    { "ipx",
5c50: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
5c60: 69 63 61 74 69 6f 6e 2f 78 2d 69 70 69 78 22 20  ication/x-ipix" 
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
5c80: 2c 0a 20 20 20 20 7b 20 22 6a 61 64 22 2c 20 20  ,.    { "jad",  
5c90: 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 76        3, "text/v
5ca0: 6e 64 2e 73 75 6e 2e 6a 32 6d 65 2e 61 70 70 2d  nd.sun.j2me.app-
5cb0: 64 65 73 63 72 69 70 74 6f 72 22 20 20 7d 2c 0a  descriptor"  },.
5cc0: 20 20 20 20 7b 20 22 6a 61 72 22 2c 20 20 20 20      { "jar",    
5cd0: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
5ce0: 69 6f 6e 2f 6a 61 76 61 2d 61 72 63 68 69 76 65  ion/java-archive
5cf0: 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  "          },.  
5d00: 20 20 7b 20 22 6a 70 65 67 22 2c 20 20 20 20 20    { "jpeg",     
5d10: 20 20 34 2c 20 22 69 6d 61 67 65 2f 6a 70 65 67    4, "image/jpeg
5d20: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
5d30: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
5d40: 7b 20 22 6a 70 65 22 2c 20 20 20 20 20 20 20 20  { "jpe",        
5d50: 33 2c 20 22 69 6d 61 67 65 2f 6a 70 65 67 22 20  3, "image/jpeg" 
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d70: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
5d80: 22 6a 70 67 22 2c 20 20 20 20 20 20 20 20 33 2c  "jpg",        3,
5d90: 20 22 69 6d 61 67 65 2f 6a 70 65 67 22 20 20 20   "image/jpeg"   
5da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5db0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a       },.    { "j
5dc0: 73 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22  s",         2, "
5dd0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6a 61  application/x-ja
5de0: 76 61 73 63 72 69 70 74 22 20 20 20 20 20 20 20  vascript"       
5df0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6b 61 72     },.    { "kar
5e00: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75  ",        3, "au
5e10: 64 69 6f 2f 6d 69 64 69 22 20 20 20 20 20 20 20  dio/midi"       
5e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e30: 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 61 74 65 78   },.    { "latex
5e40: 22 2c 20 20 20 20 20 20 35 2c 20 22 61 70 70 6c  ",      5, "appl
5e50: 69 63 61 74 69 6f 6e 2f 78 2d 6c 61 74 65 78 22  ication/x-latex"
5e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
5e70: 2c 0a 20 20 20 20 7b 20 22 6c 68 61 22 2c 20 20  ,.    { "lha",  
5e80: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
5e90: 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65  ation/octet-stre
5ea0: 61 6d 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  am"          },.
5eb0: 20 20 20 20 7b 20 22 6c 73 70 22 2c 20 20 20 20      { "lsp",    
5ec0: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
5ed0: 69 6f 6e 2f 78 2d 6c 69 73 70 22 20 20 20 20 20  ion/x-lisp"     
5ee0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
5ef0: 20 20 7b 20 22 6c 7a 68 22 2c 20 20 20 20 20 20    { "lzh",      
5f00: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
5f10: 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22 20  n/octet-stream" 
5f20: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
5f30: 7b 20 22 6d 22 2c 20 20 20 20 20 20 20 20 20 20  { "m",          
5f40: 31 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20  1, "text/plain" 
5f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f60: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
5f70: 22 6d 33 75 22 2c 20 20 20 20 20 20 20 20 33 2c  "m3u",        3,
5f80: 20 22 61 75 64 69 6f 2f 78 2d 6d 70 65 67 75 72   "audio/x-mpegur
5f90: 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l"              
5fa0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d       },.    { "m
5fb0: 61 6e 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  an",        3, "
5fc0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72  application/x-tr
5fd0: 6f 66 66 2d 6d 61 6e 22 20 20 20 20 20 20 20 20  off-man"        
5fe0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 65 22     },.    { "me"
5ff0: 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70  ,         2, "ap
6000: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72 6f 66  plication/x-trof
6010: 66 2d 6d 65 22 20 20 20 20 20 20 20 20 20 20 20  f-me"           
6020: 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 65 73 68 22   },.    { "mesh"
6030: 2c 20 20 20 20 20 20 20 34 2c 20 22 6d 6f 64 65  ,       4, "mode
6040: 6c 2f 6d 65 73 68 22 20 20 20 20 20 20 20 20 20  l/mesh"         
6050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
6060: 2c 0a 20 20 20 20 7b 20 22 6d 69 64 22 2c 20 20  ,.    { "mid",  
6070: 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f        3, "audio/
6080: 6d 69 64 69 22 20 20 20 20 20 20 20 20 20 20 20  midi"           
6090: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
60a0: 20 20 20 20 7b 20 22 6d 69 64 69 22 2c 20 20 20      { "midi",   
60b0: 20 20 20 20 34 2c 20 22 61 75 64 69 6f 2f 6d 69      4, "audio/mi
60c0: 64 69 22 20 20 20 20 20 20 20 20 20 20 20 20 20  di"             
60d0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
60e0: 20 20 7b 20 22 6d 69 66 22 2c 20 20 20 20 20 20    { "mif",      
60f0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
6100: 6e 2f 78 2d 6d 69 66 22 20 20 20 20 20 20 20 20  n/x-mif"        
6110: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
6120: 7b 20 22 6d 69 6d 65 22 2c 20 20 20 20 20 20 20  { "mime",       
6130: 34 2c 20 22 77 77 77 2f 6d 69 6d 65 22 20 20 20  4, "www/mime"   
6140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6150: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
6160: 22 6d 6f 76 69 65 22 2c 20 20 20 20 20 20 35 2c  "movie",      5,
6170: 20 22 76 69 64 65 6f 2f 78 2d 73 67 69 2d 6d 6f   "video/x-sgi-mo
6180: 76 69 65 22 20 20 20 20 20 20 20 20 20 20 20 20  vie"            
6190: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d       },.    { "m
61a0: 6f 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ov",        3, "
61b0: 76 69 64 65 6f 2f 71 75 69 63 6b 74 69 6d 65 22  video/quicktime"
61c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61d0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 32     },.    { "mp2
61e0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75  ",        3, "au
61f0: 64 69 6f 2f 6d 70 65 67 22 20 20 20 20 20 20 20  dio/mpeg"       
6200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6210: 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 32 22 2c   },.    { "mp2",
6220: 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64 65          3, "vide
6230: 6f 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20 20  o/mpeg"         
6240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
6250: 2c 0a 20 20 20 20 7b 20 22 6d 70 33 22 2c 20 20  ,.    { "mp3",  
6260: 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f        3, "audio/
6270: 6d 70 65 67 22 20 20 20 20 20 20 20 20 20 20 20  mpeg"           
6280: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
6290: 20 20 20 20 7b 20 22 6d 70 65 67 22 2c 20 20 20      { "mpeg",   
62a0: 20 20 20 20 34 2c 20 22 76 69 64 65 6f 2f 6d 70      4, "video/mp
62b0: 65 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20  eg"             
62c0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
62d0: 20 20 7b 20 22 6d 70 65 22 2c 20 20 20 20 20 20    { "mpe",      
62e0: 20 20 33 2c 20 22 76 69 64 65 6f 2f 6d 70 65 67    3, "video/mpeg
62f0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
6300: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
6310: 7b 20 22 6d 70 67 61 22 2c 20 20 20 20 20 20 20  { "mpga",       
6320: 34 2c 20 22 61 75 64 69 6f 2f 6d 70 65 67 22 20  4, "audio/mpeg" 
6330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6340: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
6350: 22 6d 70 67 22 2c 20 20 20 20 20 20 20 20 33 2c  "mpg",        3,
6360: 20 22 76 69 64 65 6f 2f 6d 70 65 67 22 20 20 20   "video/mpeg"   
6370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6380: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d       },.    { "m
6390: 73 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22  s",         2, "
63a0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72  application/x-tr
63b0: 6f 66 66 2d 6d 73 22 20 20 20 20 20 20 20 20 20  off-ms"         
63c0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 73 68     },.    { "msh
63d0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 6d 6f  ",        3, "mo
63e0: 64 65 6c 2f 6d 65 73 68 22 20 20 20 20 20 20 20  del/mesh"       
63f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6400: 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 63 22 2c 20   },.    { "nc", 
6410: 20 20 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c          2, "appl
6420: 69 63 61 74 69 6f 6e 2f 78 2d 6e 65 74 63 64 66  ication/x-netcdf
6430: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  "              }
6440: 2c 0a 20 20 20 20 7b 20 22 6f 64 61 22 2c 20 20  ,.    { "oda",  
6450: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
6460: 61 74 69 6f 6e 2f 6f 64 61 22 20 20 20 20 20 20  ation/oda"      
6470: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
6480: 20 20 20 20 7b 20 22 6f 67 67 22 2c 20 20 20 20      { "ogg",    
6490: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
64a0: 69 6f 6e 2f 6f 67 67 22 20 20 20 20 20 20 20 20  ion/ogg"        
64b0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
64c0: 20 20 7b 20 22 6f 67 6d 22 2c 20 20 20 20 20 20    { "ogm",      
64d0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
64e0: 6e 2f 6f 67 67 22 20 20 20 20 20 20 20 20 20 20  n/ogg"          
64f0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
6500: 7b 20 22 70 62 6d 22 2c 20 20 20 20 20 20 20 20  { "pbm",        
6510: 33 2c 20 22 69 6d 61 67 65 2f 78 2d 70 6f 72 74  3, "image/x-port
6520: 61 62 6c 65 2d 62 69 74 6d 61 70 22 20 20 20 20  able-bitmap"    
6530: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
6540: 22 70 64 62 22 2c 20 20 20 20 20 20 20 20 33 2c  "pdb",        3,
6550: 20 22 63 68 65 6d 69 63 61 6c 2f 78 2d 70 64 62   "chemical/x-pdb
6560: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
6570: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70       },.    { "p
6580: 64 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  df",        3, "
6590: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 64 66 22  application/pdf"
65a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65b0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 67 6d     },.    { "pgm
65c0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d  ",        3, "im
65d0: 61 67 65 2f 78 2d 70 6f 72 74 61 62 6c 65 2d 67  age/x-portable-g
65e0: 72 61 79 6d 61 70 22 20 20 20 20 20 20 20 20 20  raymap"         
65f0: 20 7d 2c 0a 20 20 20 20 7b 20 22 70 67 6e 22 2c   },.    { "pgn",
6600: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
6610: 69 63 61 74 69 6f 6e 2f 78 2d 63 68 65 73 73 2d  ication/x-chess-
6620: 70 67 6e 22 20 20 20 20 20 20 20 20 20 20 20 7d  pgn"           }
6630: 2c 0a 20 20 20 20 7b 20 22 70 67 70 22 2c 20 20  ,.    { "pgp",  
6640: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
6650: 61 74 69 6f 6e 2f 70 67 70 22 20 20 20 20 20 20  ation/pgp"      
6660: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
6670: 20 20 20 20 7b 20 22 70 6c 22 2c 20 20 20 20 20      { "pl",     
6680: 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74      2, "applicat
6690: 69 6f 6e 2f 78 2d 70 65 72 6c 22 20 20 20 20 20  ion/x-perl"     
66a0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
66b0: 20 20 7b 20 22 70 6d 22 2c 20 20 20 20 20 20 20    { "pm",       
66c0: 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    2, "applicatio
66d0: 6e 2f 78 2d 70 65 72 6c 22 20 20 20 20 20 20 20  n/x-perl"       
66e0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
66f0: 7b 20 22 70 6e 67 22 2c 20 20 20 20 20 20 20 20  { "png",        
6700: 33 2c 20 22 69 6d 61 67 65 2f 70 6e 67 22 20 20  3, "image/png"  
6710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6720: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
6730: 22 70 6e 6d 22 2c 20 20 20 20 20 20 20 20 33 2c  "pnm",        3,
6740: 20 22 69 6d 61 67 65 2f 78 2d 70 6f 72 74 61 62   "image/x-portab
6750: 6c 65 2d 61 6e 79 6d 61 70 22 20 20 20 20 20 20  le-anymap"      
6760: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70       },.    { "p
6770: 6f 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ot",        3, "
6780: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 70 6f  application/mspo
6790: 77 65 72 70 6f 69 6e 74 22 20 20 20 20 20 20 20  werpoint"       
67a0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 70 6d     },.    { "ppm
67b0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d  ",        3, "im
67c0: 61 67 65 2f 78 2d 70 6f 72 74 61 62 6c 65 2d 70  age/x-portable-p
67d0: 69 78 6d 61 70 22 20 20 20 20 20 20 20 20 20 20  ixmap"          
67e0: 20 7d 2c 0a 20 20 20 20 7b 20 22 70 70 73 22 2c   },.    { "pps",
67f0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
6800: 69 63 61 74 69 6f 6e 2f 6d 73 70 6f 77 65 72 70  ication/mspowerp
6810: 6f 69 6e 74 22 20 20 20 20 20 20 20 20 20 20 7d  oint"          }
6820: 2c 0a 20 20 20 20 7b 20 22 70 70 74 22 2c 20 20  ,.    { "ppt",  
6830: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
6840: 61 74 69 6f 6e 2f 6d 73 70 6f 77 65 72 70 6f 69  ation/mspowerpoi
6850: 6e 74 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  nt"          },.
6860: 20 20 20 20 7b 20 22 70 70 7a 22 2c 20 20 20 20      { "ppz",    
6870: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
6880: 69 6f 6e 2f 6d 73 70 6f 77 65 72 70 6f 69 6e 74  ion/mspowerpoint
6890: 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  "          },.  
68a0: 20 20 7b 20 22 70 72 65 22 2c 20 20 20 20 20 20    { "pre",      
68b0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
68c0: 6e 2f 78 2d 66 72 65 65 6c 61 6e 63 65 22 20 20  n/x-freelance"  
68d0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
68e0: 7b 20 22 70 72 74 22 2c 20 20 20 20 20 20 20 20  { "prt",        
68f0: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
6900: 70 72 6f 5f 65 6e 67 22 20 20 20 20 20 20 20 20  pro_eng"        
6910: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
6920: 22 70 73 22 2c 20 20 20 20 20 20 20 20 20 32 2c  "ps",         2,
6930: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 6f   "application/po
6940: 73 74 73 63 72 69 70 74 22 20 20 20 20 20 20 20  stscript"       
6950: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 71       },.    { "q
6960: 74 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22  t",         2, "
6970: 76 69 64 65 6f 2f 71 75 69 63 6b 74 69 6d 65 22  video/quicktime"
6980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6990: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61 22     },.    { "ra"
69a0: 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 75  ,         2, "au
69b0: 64 69 6f 2f 78 2d 72 65 61 6c 61 75 64 69 6f 22  dio/x-realaudio"
69c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69d0: 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61 6d 22 2c   },.    { "ram",
69e0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69          3, "audi
69f0: 6f 2f 78 2d 70 6e 2d 72 65 61 6c 61 75 64 69 6f  o/x-pn-realaudio
6a00: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  "              }
6a10: 2c 0a 20 20 20 20 7b 20 22 72 61 72 22 2c 20 20  ,.    { "rar",  
6a20: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
6a30: 61 74 69 6f 6e 2f 78 2d 72 61 72 2d 63 6f 6d 70  ation/x-rar-comp
6a40: 72 65 73 73 65 64 22 20 20 20 20 20 20 7d 2c 0a  ressed"      },.
6a50: 20 20 20 20 7b 20 22 72 61 73 22 2c 20 20 20 20      { "ras",    
6a60: 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 63 6d      3, "image/cm
6a70: 75 2d 72 61 73 74 65 72 22 20 20 20 20 20 20 20  u-raster"       
6a80: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
6a90: 20 20 7b 20 22 72 61 73 22 2c 20 20 20 20 20 20    { "ras",      
6aa0: 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 63 6d    3, "image/x-cm
6ab0: 75 2d 72 61 73 74 65 72 22 20 20 20 20 20 20 20  u-raster"       
6ac0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
6ad0: 7b 20 22 72 67 62 22 2c 20 20 20 20 20 20 20 20  { "rgb",        
6ae0: 33 2c 20 22 69 6d 61 67 65 2f 78 2d 72 67 62 22  3, "image/x-rgb"
6af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b00: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
6b10: 22 72 6d 22 2c 20 20 20 20 20 20 20 20 20 32 2c  "rm",         2,
6b20: 20 22 61 75 64 69 6f 2f 78 2d 70 6e 2d 72 65 61   "audio/x-pn-rea
6b30: 6c 61 75 64 69 6f 22 20 20 20 20 20 20 20 20 20  laudio"         
6b40: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72       },.    { "r
6b50: 6f 66 66 22 2c 20 20 20 20 20 20 20 34 2c 20 22  off",       4, "
6b60: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72  application/x-tr
6b70: 6f 66 66 22 20 20 20 20 20 20 20 20 20 20 20 20  off"            
6b80: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 70 6d     },.    { "rpm
6b90: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75  ",        3, "au
6ba0: 64 69 6f 2f 78 2d 70 6e 2d 72 65 61 6c 61 75 64  dio/x-pn-realaud
6bb0: 69 6f 2d 70 6c 75 67 69 6e 22 20 20 20 20 20 20  io-plugin"      
6bc0: 20 7d 2c 0a 20 20 20 20 7b 20 22 72 74 66 22 2c   },.    { "rtf",
6bd0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
6be0: 69 63 61 74 69 6f 6e 2f 72 74 66 22 20 20 20 20  ication/rtf"    
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
6c00: 2c 0a 20 20 20 20 7b 20 22 72 74 66 22 2c 20 20  ,.    { "rtf",  
6c10: 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 72        3, "text/r
6c20: 74 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20  tf"             
6c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
6c40: 20 20 20 20 7b 20 22 72 74 78 22 2c 20 20 20 20      { "rtx",    
6c50: 20 20 20 20 33 2c 20 22 74 65 78 74 2f 72 69 63      3, "text/ric
6c60: 68 74 65 78 74 22 20 20 20 20 20 20 20 20 20 20  htext"          
6c70: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
6c80: 20 20 7b 20 22 73 63 6d 22 2c 20 20 20 20 20 20    { "scm",      
6c90: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
6ca0: 6e 2f 78 2d 6c 6f 74 75 73 73 63 72 65 65 6e 63  n/x-lotusscreenc
6cb0: 61 6d 22 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  am"      },.    
6cc0: 7b 20 22 73 65 74 22 2c 20 20 20 20 20 20 20 20  { "set",        
6cd0: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
6ce0: 73 65 74 22 20 20 20 20 20 20 20 20 20 20 20 20  set"            
6cf0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
6d00: 22 73 67 6d 6c 22 2c 20 20 20 20 20 20 20 34 2c  "sgml",       4,
6d10: 20 22 74 65 78 74 2f 73 67 6d 6c 22 20 20 20 20   "text/sgml"    
6d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d30: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73       },.    { "s
6d40: 67 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  gm",        3, "
6d50: 74 65 78 74 2f 73 67 6d 6c 22 20 20 20 20 20 20  text/sgml"      
6d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d70: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 68 22     },.    { "sh"
6d80: 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70  ,         2, "ap
6d90: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 68 22 20  plication/x-sh" 
6da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6db0: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 68 61 72 22   },.    { "shar"
6dc0: 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c  ,       4, "appl
6dd0: 69 63 61 74 69 6f 6e 2f 78 2d 73 68 61 72 22 20  ication/x-shar" 
6de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
6df0: 2c 0a 20 20 20 20 7b 20 22 73 69 6c 6f 22 2c 20  ,.    { "silo", 
6e00: 20 20 20 20 20 20 34 2c 20 22 6d 6f 64 65 6c 2f        4, "model/
6e10: 6d 65 73 68 22 20 20 20 20 20 20 20 20 20 20 20  mesh"           
6e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
6e30: 20 20 20 20 7b 20 22 73 69 74 22 2c 20 20 20 20      { "sit",    
6e40: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
6e50: 69 6f 6e 2f 78 2d 73 74 75 66 66 69 74 22 20 20  ion/x-stuffit"  
6e60: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
6e70: 20 20 7b 20 22 73 6b 64 22 2c 20 20 20 20 20 20    { "skd",      
6e80: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
6e90: 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20 20 20 20 20  n/x-koan"       
6ea0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
6eb0: 7b 20 22 73 6b 6d 22 2c 20 20 20 20 20 20 20 20  { "skm",        
6ec0: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
6ed0: 78 2d 6b 6f 61 6e 22 20 20 20 20 20 20 20 20 20  x-koan"         
6ee0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
6ef0: 22 73 6b 70 22 2c 20 20 20 20 20 20 20 20 33 2c  "skp",        3,
6f00: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
6f10: 6b 6f 61 6e 22 20 20 20 20 20 20 20 20 20 20 20  koan"           
6f20: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73       },.    { "s
6f30: 6b 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  kt",        3, "
6f40: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6b 6f  application/x-ko
6f50: 61 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20  an"             
6f60: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 69     },.    { "smi
6f70: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
6f80: 70 6c 69 63 61 74 69 6f 6e 2f 73 6d 69 6c 22 20  plication/smil" 
6f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fa0: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 69 6c 22   },.    { "smil"
6fb0: 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c  ,       4, "appl
6fc0: 69 63 61 74 69 6f 6e 2f 73 6d 69 6c 22 20 20 20  ication/smil"   
6fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
6fe0: 2c 0a 20 20 20 20 7b 20 22 73 6e 64 22 2c 20 20  ,.    { "snd",  
6ff0: 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f        3, "audio/
7000: 62 61 73 69 63 22 20 20 20 20 20 20 20 20 20 20  basic"          
7010: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
7020: 20 20 20 20 7b 20 22 73 6f 6c 22 2c 20 20 20 20      { "sol",    
7030: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
7040: 69 6f 6e 2f 73 6f 6c 69 64 73 22 20 20 20 20 20  ion/solids"     
7050: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
7060: 20 20 7b 20 22 73 70 6c 22 2c 20 20 20 20 20 20    { "spl",      
7070: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
7080: 6e 2f 78 2d 66 75 74 75 72 65 73 70 6c 61 73 68  n/x-futuresplash
7090: 22 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  "        },.    
70a0: 7b 20 22 73 72 63 22 2c 20 20 20 20 20 20 20 20  { "src",        
70b0: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
70c0: 78 2d 77 61 69 73 2d 73 6f 75 72 63 65 22 20 20  x-wais-source"  
70d0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
70e0: 22 73 74 65 70 22 2c 20 20 20 20 20 20 20 34 2c  "step",       4,
70f0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 53 54   "application/ST
7100: 45 50 22 20 20 20 20 20 20 20 20 20 20 20 20 20  EP"             
7110: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73       },.    { "s
7120: 74 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  tl",        3, "
7130: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 53 4c 41 22  application/SLA"
7140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7150: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 74 70     },.    { "stp
7160: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
7170: 70 6c 69 63 61 74 69 6f 6e 2f 53 54 45 50 22 20  plication/STEP" 
7180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7190: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 76 34 63 70   },.    { "sv4cp
71a0: 69 6f 22 2c 20 20 20 20 37 2c 20 22 61 70 70 6c  io",    7, "appl
71b0: 69 63 61 74 69 6f 6e 2f 78 2d 73 76 34 63 70 69  ication/x-sv4cpi
71c0: 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  o"             }
71d0: 2c 0a 20 20 20 20 7b 20 22 73 76 34 63 72 63 22  ,.    { "sv4crc"
71e0: 2c 20 20 20 20 20 36 2c 20 22 61 70 70 6c 69 63  ,     6, "applic
71f0: 61 74 69 6f 6e 2f 78 2d 73 76 34 63 72 63 22 20  ation/x-sv4crc" 
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
7210: 20 20 20 20 7b 20 22 73 77 66 22 2c 20 20 20 20      { "swf",    
7220: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
7230: 69 6f 6e 2f 78 2d 73 68 6f 63 6b 77 61 76 65 2d  ion/x-shockwave-
7240: 66 6c 61 73 68 22 20 20 20 20 20 7d 2c 0a 20 20  flash"     },.  
7250: 20 20 7b 20 22 74 22 2c 20 20 20 20 20 20 20 20    { "t",        
7260: 20 20 31 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    1, "applicatio
7270: 6e 2f 78 2d 74 72 6f 66 66 22 20 20 20 20 20 20  n/x-troff"      
7280: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
7290: 7b 20 22 74 61 72 22 2c 20 20 20 20 20 20 20 20  { "tar",        
72a0: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
72b0: 78 2d 74 61 72 22 20 20 20 20 20 20 20 20 20 20  x-tar"          
72c0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
72d0: 22 74 63 6c 22 2c 20 20 20 20 20 20 20 20 33 2c  "tcl",        3,
72e0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
72f0: 74 63 6c 22 20 20 20 20 20 20 20 20 20 20 20 20  tcl"            
7300: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74       },.    { "t
7310: 65 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ex",        3, "
7320: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 65  application/x-te
7330: 78 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x"              
7340: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 65 78     },.    { "tex
7350: 69 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70  i",       4, "ap
7360: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 65 78 69  plication/x-texi
7370: 6e 66 6f 22 20 20 20 20 20 20 20 20 20 20 20 20  nfo"            
7380: 20 7d 2c 0a 20 20 20 20 7b 20 22 74 65 78 69 6e   },.    { "texin
7390: 66 6f 22 2c 20 20 20 20 37 2c 20 22 61 70 70 6c  fo",    7, "appl
73a0: 69 63 61 74 69 6f 6e 2f 78 2d 74 65 78 69 6e 66  ication/x-texinf
73b0: 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  o"             }
73c0: 2c 0a 20 20 20 20 7b 20 22 74 67 7a 22 2c 20 20  ,.    { "tgz",  
73d0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
73e0: 61 74 69 6f 6e 2f 78 2d 74 61 72 2d 67 7a 22 20  ation/x-tar-gz" 
73f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
7400: 20 20 20 20 7b 20 22 74 69 66 66 22 2c 20 20 20      { "tiff",   
7410: 20 20 20 20 34 2c 20 22 69 6d 61 67 65 2f 74 69      4, "image/ti
7420: 66 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ff"             
7430: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
7440: 20 20 7b 20 22 74 69 66 22 2c 20 20 20 20 20 20    { "tif",      
7450: 20 20 33 2c 20 22 69 6d 61 67 65 2f 74 69 66 66    3, "image/tiff
7460: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
7470: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
7480: 7b 20 22 74 72 22 2c 20 20 20 20 20 20 20 20 20  { "tr",         
7490: 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  2, "application/
74a0: 78 2d 74 72 6f 66 66 22 20 20 20 20 20 20 20 20  x-troff"        
74b0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
74c0: 22 74 73 69 22 2c 20 20 20 20 20 20 20 20 33 2c  "tsi",        3,
74d0: 20 22 61 75 64 69 6f 2f 54 53 50 2d 61 75 64 69   "audio/TSP-audi
74e0: 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o"              
74f0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74       },.    { "t
7500: 73 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  sp",        3, "
7510: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 64 73 70 74  application/dspt
7520: 79 70 65 22 20 20 20 20 20 20 20 20 20 20 20 20  ype"            
7530: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 73 76     },.    { "tsv
7540: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65  ",        3, "te
7550: 78 74 2f 74 61 62 2d 73 65 70 61 72 61 74 65 64  xt/tab-separated
7560: 2d 76 61 6c 75 65 73 22 20 20 20 20 20 20 20 20  -values"        
7570: 20 7d 2c 0a 20 20 20 20 7b 20 22 74 78 74 22 2c   },.    { "txt",
7580: 20 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74          3, "text
7590: 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20  /plain"         
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
75b0: 2c 0a 20 20 20 20 7b 20 22 75 6e 76 22 2c 20 20  ,.    { "unv",  
75c0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
75d0: 61 74 69 6f 6e 2f 69 2d 64 65 61 73 22 20 20 20  ation/i-deas"   
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
75f0: 20 20 20 20 7b 20 22 75 73 74 61 72 22 2c 20 20      { "ustar",  
7600: 20 20 20 20 35 2c 20 22 61 70 70 6c 69 63 61 74      5, "applicat
7610: 69 6f 6e 2f 78 2d 75 73 74 61 72 22 20 20 20 20  ion/x-ustar"    
7620: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
7630: 20 20 7b 20 22 76 63 64 22 2c 20 20 20 20 20 20    { "vcd",      
7640: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
7650: 6e 2f 78 2d 63 64 6c 69 6e 6b 22 20 20 20 20 20  n/x-cdlink"     
7660: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
7670: 7b 20 22 76 64 61 22 2c 20 20 20 20 20 20 20 20  { "vda",        
7680: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
7690: 76 64 61 22 20 20 20 20 20 20 20 20 20 20 20 20  vda"            
76a0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
76b0: 22 76 69 76 22 2c 20 20 20 20 20 20 20 20 33 2c  "viv",        3,
76c0: 20 22 76 69 64 65 6f 2f 76 6e 64 2e 76 69 76 6f   "video/vnd.vivo
76d0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
76e0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 76       },.    { "v
76f0: 69 76 6f 22 2c 20 20 20 20 20 20 20 34 2c 20 22  ivo",       4, "
7700: 76 69 64 65 6f 2f 76 6e 64 2e 76 69 76 6f 22 20  video/vnd.vivo" 
7710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7720: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 76 72 6d     },.    { "vrm
7730: 6c 22 2c 20 20 20 20 20 20 20 34 2c 20 22 6d 6f  l",       4, "mo
7740: 64 65 6c 2f 76 72 6d 6c 22 20 20 20 20 20 20 20  del/vrml"       
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7760: 20 7d 2c 0a 20 20 20 20 7b 20 22 77 61 76 22 2c   },.    { "wav",
7770: 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69          3, "audi
7780: 6f 2f 78 2d 77 61 76 22 20 20 20 20 20 20 20 20  o/x-wav"        
7790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
77a0: 2c 0a 20 20 20 20 7b 20 22 77 61 78 22 2c 20 20  ,.    { "wax",  
77b0: 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f        3, "audio/
77c0: 78 2d 6d 73 2d 77 61 78 22 20 20 20 20 20 20 20  x-ms-wax"       
77d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
77e0: 20 20 20 20 7b 20 22 77 69 6b 69 22 2c 20 20 20      { "wiki",   
77f0: 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74      4, "applicat
7800: 69 6f 6e 2f 78 2d 66 6f 73 73 69 6c 2d 77 69 6b  ion/x-fossil-wik
7810: 69 22 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  i"         },.  
7820: 20 20 7b 20 22 77 6d 61 22 2c 20 20 20 20 20 20    { "wma",      
7830: 20 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 6d 73    3, "audio/x-ms
7840: 2d 77 6d 61 22 20 20 20 20 20 20 20 20 20 20 20  -wma"           
7850: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
7860: 7b 20 22 77 6d 76 22 2c 20 20 20 20 20 20 20 20  { "wmv",        
7870: 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 77  3, "video/x-ms-w
7880: 6d 76 22 20 20 20 20 20 20 20 20 20 20 20 20 20  mv"             
7890: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
78a0: 22 77 6d 78 22 2c 20 20 20 20 20 20 20 20 33 2c  "wmx",        3,
78b0: 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 77 6d 78   "video/x-ms-wmx
78c0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
78d0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77       },.    { "w
78e0: 72 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  rl",        3, "
78f0: 6d 6f 64 65 6c 2f 76 72 6d 6c 22 20 20 20 20 20  model/vrml"     
7900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7910: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 76 78     },.    { "wvx
7920: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69  ",        3, "vi
7930: 64 65 6f 2f 78 2d 6d 73 2d 77 76 78 22 20 20 20  deo/x-ms-wvx"   
7940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7950: 20 7d 2c 0a 20 20 20 20 7b 20 22 78 62 6d 22 2c   },.    { "xbm",
7960: 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67          3, "imag
7970: 65 2f 78 2d 78 62 69 74 6d 61 70 22 20 20 20 20  e/x-xbitmap"    
7980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
7990: 2c 0a 20 20 20 20 7b 20 22 78 6c 63 22 2c 20 20  ,.    { "xlc",  
79a0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
79b0: 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63  ation/vnd.ms-exc
79c0: 65 6c 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  el"          },.
79d0: 20 20 20 20 7b 20 22 78 6c 6c 22 2c 20 20 20 20      { "xll",    
79e0: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
79f0: 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c  ion/vnd.ms-excel
7a00: 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  "          },.  
7a10: 20 20 7b 20 22 78 6c 6d 22 2c 20 20 20 20 20 20    { "xlm",      
7a20: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
7a30: 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20  n/vnd.ms-excel" 
7a40: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
7a50: 7b 20 22 78 6c 73 22 2c 20 20 20 20 20 20 20 20  { "xls",        
7a60: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
7a70: 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20 20 20  vnd.ms-excel"   
7a80: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
7a90: 22 78 6c 77 22 2c 20 20 20 20 20 20 20 20 33 2c  "xlw",        3,
7aa0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76 6e   "application/vn
7ab0: 64 2e 6d 73 2d 65 78 63 65 6c 22 20 20 20 20 20  d.ms-excel"     
7ac0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78       },.    { "x
7ad0: 6d 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ml",        3, "
7ae0: 74 65 78 74 2f 78 6d 6c 22 20 20 20 20 20 20 20  text/xml"       
7af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b00: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 70 6d     },.    { "xpm
7b10: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d  ",        3, "im
7b20: 61 67 65 2f 78 2d 78 70 69 78 6d 61 70 22 20 20  age/x-xpixmap"  
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b40: 20 7d 2c 0a 20 20 20 20 7b 20 22 78 77 64 22 2c   },.    { "xwd",
7b50: 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67          3, "imag
7b60: 65 2f 78 2d 78 77 69 6e 64 6f 77 64 75 6d 70 22  e/x-xwindowdump"
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
7b80: 2c 0a 20 20 20 20 7b 20 22 78 79 7a 22 2c 20 20  ,.    { "xyz",  
7b90: 20 20 20 20 20 20 33 2c 20 22 63 68 65 6d 69 63        3, "chemic
7ba0: 61 6c 2f 78 2d 70 64 62 22 20 20 20 20 20 20 20  al/x-pdb"       
7bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
7bc0: 20 20 20 20 7b 20 22 7a 69 70 22 2c 20 20 20 20      { "zip",    
7bd0: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
7be0: 69 6f 6e 2f 7a 69 70 22 20 20 20 20 20 20 20 20  ion/zip"        
7bf0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
7c00: 7d 3b 0a 0a 20 20 66 6f 72 28 69 3d 6e 4e 61 6d  };..  for(i=nNam
7c10: 65 2d 31 3b 20 69 3e 30 20 26 26 20 7a 4e 61 6d  e-1; i>0 && zNam
7c20: 65 5b 69 5d 21 3d 27 2e 27 3b 20 69 2d 2d 29 7b  e[i]!='.'; i--){
7c30: 7d 0a 20 20 7a 20 3d 20 26 7a 4e 61 6d 65 5b 69  }.  z = &zName[i
7c40: 2b 31 5d 3b 0a 20 20 6c 65 6e 20 3d 20 6e 4e 61  +1];.  len = nNa
7c50: 6d 65 20 2d 20 69 3b 0a 20 20 69 66 28 20 6c 65  me - i;.  if( le
7c60: 6e 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 7a 53  n<(int)sizeof(zS
7c70: 75 66 66 69 78 29 2d 31 20 29 7b 0a 20 20 20 20  uffix)-1 ){.    
7c80: 73 74 72 63 70 79 28 7a 53 75 66 66 69 78 2c 20  strcpy(zSuffix, 
7c90: 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  z);.    for(i=0;
7ca0: 20 7a 53 75 66 66 69 78 5b 69 5d 3b 20 69 2b 2b   zSuffix[i]; i++
7cb0: 29 20 7a 53 75 66 66 69 78 5b 69 5d 20 3d 20 74  ) zSuffix[i] = t
7cc0: 6f 6c 6f 77 65 72 28 7a 53 75 66 66 69 78 5b 69  olower(zSuffix[i
7cd0: 5d 29 3b 0a 20 20 20 20 66 69 72 73 74 20 3d 20  ]);.    first = 
7ce0: 30 3b 0a 20 20 20 20 6c 61 73 74 20 3d 20 73 69  0;.    last = si
7cf0: 7a 65 6f 66 28 61 4d 69 6d 65 29 2f 73 69 7a 65  zeof(aMime)/size
7d00: 6f 66 28 61 4d 69 6d 65 5b 30 5d 29 3b 0a 20 20  of(aMime[0]);.  
7d10: 20 20 77 68 69 6c 65 28 20 66 69 72 73 74 3c 3d    while( first<=
7d20: 6c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  last ){.      in
7d30: 74 20 63 3b 0a 20 20 20 20 20 20 69 20 3d 20 28  t c;.      i = (
7d40: 66 69 72 73 74 2b 6c 61 73 74 29 2f 32 3b 0a 20  first+last)/2;. 
7d50: 20 20 20 20 20 63 20 3d 20 73 74 72 63 6d 70 28       c = strcmp(
7d60: 7a 53 75 66 66 69 78 2c 20 61 4d 69 6d 65 5b 69  zSuffix, aMime[i
7d70: 5d 2e 7a 53 75 66 66 69 78 29 3b 0a 20 20 20 20  ].zSuffix);.    
7d80: 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74    if( c==0 ) ret
7d90: 75 72 6e 20 61 4d 69 6d 65 5b 69 5d 2e 7a 4d 69  urn aMime[i].zMi
7da0: 6d 65 74 79 70 65 3b 0a 20 20 20 20 20 20 69 66  metype;.      if
7db0: 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c<0 ){.       
7dc0: 20 6c 61 73 74 20 3d 20 69 2d 31 3b 0a 20 20 20   last = i-1;.   
7dd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7de0: 20 20 66 69 72 73 74 20 3d 20 69 2b 31 3b 0a 20    first = i+1;. 
7df0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7e00: 0a 20 20 72 65 74 75 72 6e 20 22 61 70 70 6c 69  .  return "appli
7e10: 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72  cation/octet-str
7e20: 65 61 6d 22 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  eam";.}../*.** T
7e30: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  he following tab
7e40: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 31 20 66 6f  le contains 1 fo
7e50: 72 20 61 6c 6c 20 63 68 61 72 61 63 74 65 72 73  r all characters
7e60: 20 74 68 61 74 20 61 72 65 20 70 65 72 6d 69 74   that are permit
7e70: 74 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 70 61  ted in.** the pa
7e80: 72 74 20 6f 66 20 74 68 65 20 55 52 4c 20 62 65  rt of the URL be
7e90: 66 6f 72 65 20 74 68 65 20 71 75 65 72 79 20 70  fore the query p
7ea0: 61 72 61 6d 65 74 65 72 73 20 61 6e 64 20 66 72  arameters and fr
7eb0: 61 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c  agment..**.** Al
7ec0: 6c 6f 77 65 64 20 63 68 61 72 61 63 74 65 72 73  lowed characters
7ed0: 3a 20 20 30 2d 39 20 61 2d 7a 20 41 2d 5a 20 2c  :  0-9 a-z A-Z ,
7ee0: 2d 2e 2f 3a 5f 7e 0a 2a 2a 0a 2a 2a 20 44 69 73  -./:_~.**.** Dis
7ef0: 61 6c 6c 6f 77 65 64 20 63 68 61 72 61 63 74 65  allowed characte
7f00: 72 73 20 69 6e 63 6c 75 64 65 3a 20 20 21 22 23  rs include:  !"#
7f10: 24 25 26 27 28 29 2a 2b 3b 3c 3d 3e 3f 5b 5c 5d  $%&'()*+;<=>?[\]
7f20: 5e 7b 7c 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ^{|}.*/.static c
7f30: 6f 6e 73 74 20 63 68 61 72 20 61 6c 6c 6f 77 65  onst char allowe
7f40: 64 49 6e 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20  dInName[] = {.  
7f50: 20 20 20 20 2f 2a 20 20 78 30 20 20 78 31 20 20      /*  x0  x1  
7f60: 78 32 20 20 78 33 20 20 78 34 20 20 78 35 20 20  x2  x3  x4  x5  
7f70: 78 36 20 20 78 37 20 20 78 38 20 20 78 39 20 20  x6  x7  x8  x9  
7f80: 78 61 20 20 78 62 20 20 78 63 20 20 78 64 20 20  xa  xb  xc  xd  
7f90: 78 65 20 20 78 66 20 2a 2f 0a 2f 2a 20 30 78 20  xe  xf */./* 0x 
7fa0: 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20  */   0,  0,  0, 
7fb0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
7fc0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
7fd0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
7fe0: 20 30 2c 0a 2f 2a 20 31 78 20 2a 2f 20 20 20 30   0,./* 1x */   0
7ff0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
8000: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
8010: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
8020: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a  ,  0,  0,  0,./*
8030: 20 32 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20   2x */   0,  0, 
8040: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
8050: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
8060: 20 30 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c 20   0,  0,  1,  1, 
8070: 20 31 2c 20 20 31 2c 0a 2f 2a 20 33 78 20 2a 2f   1,  1,./* 3x */
8080: 20 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31     1,  1,  1,  1
8090: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
80a0: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 30  ,  1,  1,  1,  0
80b0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
80c0: 2c 0a 2f 2a 20 34 78 20 2a 2f 20 20 20 30 2c 20  ,./* 4x */   0, 
80d0: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
80e0: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
80f0: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
8100: 20 31 2c 20 20 31 2c 20 20 31 2c 0a 2f 2a 20 35   1,  1,  1,./* 5
8110: 78 20 2a 2f 20 20 20 31 2c 20 20 31 2c 20 20 31  x */   1,  1,  1
8120: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
8130: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
8140: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
8150: 2c 20 20 31 2c 0a 2f 2a 20 36 78 20 2a 2f 20 20  ,  1,./* 6x */  
8160: 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   0,  1,  1,  1, 
8170: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
8180: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
8190: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 0a   1,  1,  1,  1,.
81a0: 2f 2a 20 37 78 20 2a 2f 20 20 20 31 2c 20 20 31  /* 7x */   1,  1
81b0: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
81c0: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
81d0: 2c 20 20 31 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  1,  0,  0,  0
81e0: 2c 20 20 31 2c 20 20 30 2c 0a 7d 3b 0a 0a 2f 2a  ,  1,  0,.};../*
81f0: 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
8200: 6d 62 65 72 20 6f 66 20 22 2f 22 20 63 68 61 72  mber of "/" char
8210: 61 63 74 65 72 73 20 69 6e 20 61 20 73 74 72 69  acters in a stri
8220: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
8230: 74 20 63 6f 75 6e 74 53 6c 61 73 68 65 73 28 63  t countSlashes(c
8240: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
8250: 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 77 68   int n = 0;.  wh
8260: 69 6c 65 28 20 2a 7a 20 29 20 69 66 28 20 2a 28  ile( *z ) if( *(
8270: 7a 2b 2b 29 3d 3d 27 2f 27 20 29 20 6e 2b 2b 3b  z++)=='/' ) n++;
8280: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
8290: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
82a0: 6e 65 20 70 72 6f 63 65 73 73 65 73 20 61 20 73  ne processes a s
82b0: 69 6e 67 6c 65 20 48 54 54 50 20 72 65 71 75 65  ingle HTTP reque
82c0: 73 74 20 6f 6e 20 73 74 61 6e 64 61 72 64 20 69  st on standard i
82d0: 6e 70 75 74 20 61 6e 64 0a 2a 2a 20 73 65 6e 64  nput and.** send
82e0: 73 20 74 68 65 20 72 65 70 6c 79 20 74 6f 20 73  s the reply to s
82f0: 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74 2e 20  tandard output. 
8300: 20 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   If the argument
8310: 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 0a 2a   is 1 it means.*
8320: 2a 20 74 68 61 74 20 77 65 20 61 72 65 20 73 68  * that we are sh
8330: 6f 75 6c 64 20 63 6c 6f 73 65 20 74 68 65 20 73  ould close the s
8340: 6f 63 6b 65 74 20 77 69 74 68 6f 75 74 20 70 72  ocket without pr
8350: 6f 63 65 73 73 69 6e 67 20 61 64 64 69 74 69 6f  ocessing additio
8360: 6e 61 6c 0a 2a 2a 20 48 54 54 50 20 72 65 71 75  nal.** HTTP requ
8370: 65 73 74 73 20 61 66 74 65 72 20 74 68 65 20 63  ests after the c
8380: 75 72 72 65 6e 74 20 72 65 71 75 65 73 74 20 66  urrent request f
8390: 69 6e 69 73 68 65 73 2e 20 20 30 20 6d 65 61 6e  inishes.  0 mean
83a0: 73 20 77 65 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  s we are.** allo
83b0: 77 65 64 20 74 6f 20 6b 65 65 70 20 74 68 65 20  wed to keep the 
83c0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20  connection open 
83d0: 61 6e 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61  and to process a
83e0: 64 64 69 74 69 6f 6e 61 6c 20 72 65 71 75 65 73  dditional reques
83f0: 74 73 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ts..** This rout
8400: 69 6e 65 20 6d 61 79 20 63 68 6f 6f 73 65 20 74  ine may choose t
8410: 6f 20 63 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e  o close the conn
8420: 65 63 74 69 6f 6e 20 65 76 65 6e 20 69 66 20 74  ection even if t
8430: 68 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  he argument.** i
8440: 73 20 30 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  s 0..** .** If t
8450: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 68  he connection sh
8460: 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 2c 20  ould be closed, 
8470: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6c  this routine cal
8480: 6c 73 20 65 78 69 74 28 29 20 61 6e 64 0a 2a 2a  ls exit() and.**
8490: 20 74 68 75 73 20 6e 65 76 65 72 20 72 65 74 75   thus never retu
84a0: 72 6e 73 2e 20 20 49 66 20 74 68 69 73 20 72 6f  rns.  If this ro
84b0: 75 74 69 6e 65 20 64 6f 65 73 20 72 65 74 75 72  utine does retur
84c0: 6e 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  n it means that 
84d0: 61 6e 6f 74 68 65 72 0a 2a 2a 20 48 54 54 50 20  another.** HTTP 
84e0: 72 65 71 75 65 73 74 20 6d 61 79 20 61 70 70 65  request may appe
84f0: 61 72 20 6f 6e 20 74 68 65 20 77 69 72 65 2e 0a  ar on the wire..
8500: 2a 2f 0a 76 6f 69 64 20 50 72 6f 63 65 73 73 4f  */.void ProcessO
8510: 6e 65 52 65 71 75 65 73 74 28 69 6e 74 20 66 6f  neRequest(int fo
8520: 72 63 65 43 6c 6f 73 65 29 7b 0a 20 20 69 6e 74  rceClose){.  int
8530: 20 69 2c 20 63 3b 0a 20 20 63 68 61 72 20 2a 7a   i, c;.  char *z
8540: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8550: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 70 61     /* Used to pa
8560: 72 73 65 20 75 70 20 61 20 73 74 72 69 6e 67 20  rse up a string 
8570: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  */.  struct stat
8580: 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 2f   statbuf;      /
8590: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
85a0: 6f 75 74 20 74 68 65 20 66 69 6c 65 20 74 6f 20  out the file to 
85b0: 62 65 20 72 65 74 72 69 65 76 65 64 20 2a 2f 0a  be retrieved */.
85c0: 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20    FILE *in;     
85d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
85e0: 6f 72 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  or reading from 
85f0: 43 47 49 20 73 63 72 69 70 74 73 20 2a 2f 0a 20  CGI scripts */. 
8600: 20 63 68 61 72 20 7a 4c 69 6e 65 5b 31 30 30 30   char zLine[1000
8610: 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ];         /* A 
8620: 62 75 66 66 65 72 20 66 6f 72 20 69 6e 70 75 74  buffer for input
8630: 20 6c 69 6e 65 73 20 6f 72 20 66 6f 72 6d 69 6e   lines or formin
8640: 67 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 2f 2a  g names */..  /*
8650: 20 43 68 61 6e 67 65 20 64 69 72 65 63 74 6f 72   Change director
8660: 69 65 73 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  ies to the root 
8670: 6f 66 20 74 68 65 20 48 54 54 50 20 66 69 6c 65  of the HTTP file
8680: 73 79 73 74 65 6d 0a 20 20 2a 2f 0a 20 20 69 66  system.  */.  if
8690: 28 20 63 68 64 69 72 28 7a 52 6f 6f 74 5b 30 5d  ( chdir(zRoot[0]
86a0: 20 3f 20 7a 52 6f 6f 74 20 3a 20 22 2f 22 29 21   ? zRoot : "/")!
86b0: 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  =0 ){.    char z
86c0: 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20 20 20 4d  Buf[1000];.    M
86d0: 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e  alfunction(__LIN
86e0: 45 5f 5f 2c 20 22 63 61 6e 6e 6f 74 20 63 68 64  E__, "cannot chd
86f0: 69 72 20 74 6f 20 5b 25 73 5d 20 66 72 6f 6d 20  ir to [%s] from 
8700: 5b 25 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20  [%s]",.         
8710: 7a 52 6f 6f 74 2c 20 67 65 74 63 77 64 28 7a 42  zRoot, getcwd(zB
8720: 75 66 2c 39 39 39 29 29 3b 0a 20 20 7d 0a 20 20  uf,999));.  }.  
8730: 6e 52 65 71 75 65 73 74 2b 2b 3b 0a 0a 20 20 2f  nRequest++;..  /
8740: 2a 0a 20 20 2a 2a 20 57 65 20 6d 75 73 74 20 72  *.  ** We must r
8750: 65 63 65 69 76 65 20 61 20 63 6f 6d 70 6c 65 74  eceive a complet
8760: 65 20 68 65 61 64 65 72 20 77 69 74 68 69 6e 20  e header within 
8770: 31 35 20 73 65 63 6f 6e 64 73 0a 20 20 2a 2f 0a  15 seconds.  */.
8780: 20 20 73 69 67 6e 61 6c 28 53 49 47 41 4c 52 4d    signal(SIGALRM
8790: 2c 20 54 69 6d 65 6f 75 74 29 3b 0a 20 20 69 66  , Timeout);.  if
87a0: 28 20 75 73 65 54 69 6d 65 6f 75 74 20 29 20 61  ( useTimeout ) a
87b0: 6c 61 72 6d 28 31 35 29 3b 0a 0a 20 20 2f 2a 20  larm(15);..  /* 
87c0: 47 65 74 20 74 68 65 20 66 69 72 73 74 20 6c 69  Get the first li
87d0: 6e 65 20 6f 66 20 74 68 65 20 72 65 71 75 65 73  ne of the reques
87e0: 74 20 61 6e 64 20 70 61 72 73 65 20 6f 75 74 20  t and parse out 
87f0: 74 68 65 0a 20 20 2a 2a 20 6d 65 74 68 6f 64 2c  the.  ** method,
8800: 20 74 68 65 20 73 63 72 69 70 74 20 61 6e 64 20   the script and 
8810: 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2e 0a 20 20  the protocol..  
8820: 2a 2f 0a 20 20 69 66 28 20 66 67 65 74 73 28 7a  */.  if( fgets(z
8830: 4c 69 6e 65 2c 73 69 7a 65 6f 66 28 7a 4c 69 6e  Line,sizeof(zLin
8840: 65 29 2c 73 74 64 69 6e 29 3d 3d 30 20 29 7b 0a  e),stdin)==0 ){.
8850: 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20 7d      exit(0);.  }
8860: 0a 20 20 6f 6d 69 74 4c 6f 67 20 3d 20 30 3b 0a  .  omitLog = 0;.
8870: 20 20 6e 49 6e 20 2b 3d 20 73 74 72 6c 65 6e 28    nIn += strlen(
8880: 7a 4c 69 6e 65 29 3b 0a 20 20 7a 4d 65 74 68 6f  zLine);.  zMetho
8890: 64 20 3d 20 53 74 72 44 75 70 28 47 65 74 46 69  d = StrDup(GetFi
88a0: 72 73 74 45 6c 65 6d 65 6e 74 28 7a 4c 69 6e 65  rstElement(zLine
88b0: 2c 26 7a 29 29 3b 0a 20 20 7a 52 65 61 6c 53 63  ,&z));.  zRealSc
88c0: 72 69 70 74 20 3d 20 7a 53 63 72 69 70 74 20 3d  ript = zScript =
88d0: 20 53 74 72 44 75 70 28 47 65 74 46 69 72 73 74   StrDup(GetFirst
88e0: 45 6c 65 6d 65 6e 74 28 7a 2c 26 7a 29 29 3b 0a  Element(z,&z));.
88f0: 20 20 7a 50 72 6f 74 6f 63 6f 6c 20 3d 20 53 74    zProtocol = St
8900: 72 44 75 70 28 47 65 74 46 69 72 73 74 45 6c 65  rDup(GetFirstEle
8910: 6d 65 6e 74 28 7a 2c 26 7a 29 29 3b 0a 20 20 69  ment(z,&z));.  i
8920: 66 28 20 7a 50 72 6f 74 6f 63 6f 6c 3d 3d 30 20  f( zProtocol==0 
8930: 7c 7c 20 73 74 72 6e 63 6d 70 28 7a 50 72 6f 74  || strncmp(zProt
8940: 6f 63 6f 6c 2c 22 48 54 54 50 2f 22 2c 35 29 21  ocol,"HTTP/",5)!
8950: 3d 30 20 7c 7c 20 73 74 72 6c 65 6e 28 7a 50 72  =0 || strlen(zPr
8960: 6f 74 6f 63 6f 6c 29 21 3d 38 20 29 7b 0a 20 20  otocol)!=8 ){.  
8970: 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28    StartResponse(
8980: 22 34 30 30 20 42 61 64 20 52 65 71 75 65 73 74  "400 Bad Request
8990: 22 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20  ");.    nOut += 
89a0: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22 43  printf(.      "C
89b0: 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78  ontent-type: tex
89c0: 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20  t/plain\r\n".   
89d0: 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 20 20     "\r\n".      
89e0: 22 54 68 69 73 20 73 65 72 76 65 72 20 64 6f 65  "This server doe
89f0: 73 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64  s not understand
8a00: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
8a10: 72 6f 74 6f 63 6f 6c 5c 6e 22 0a 20 20 20 20 29  rotocol\n".    )
8a20: 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74  ;.    MakeLogEnt
8a30: 72 79 28 30 29 3b 0a 20 20 20 20 65 78 69 74 28  ry(0);.    exit(
8a40: 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 53  0);.  }.  if( zS
8a50: 63 72 69 70 74 5b 30 5d 3d 3d 30 20 29 20 4e 6f  cript[0]==0 ) No
8a60: 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29  tFound(__LINE__)
8a70: 3b 0a 20 20 69 66 28 20 66 6f 72 63 65 43 6c 6f  ;.  if( forceClo
8a80: 73 65 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 43  se ){.    closeC
8a90: 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 31 3b 0a 20  onnection = 1;. 
8aa0: 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 72 6f 74   }else if( zProt
8ab0: 6f 63 6f 6c 5b 35 5d 3c 27 31 27 20 7c 7c 20 7a  ocol[5]<'1' || z
8ac0: 50 72 6f 74 6f 63 6f 6c 5b 37 5d 3c 27 31 27 20  Protocol[7]<'1' 
8ad0: 29 7b 0a 20 20 20 20 63 6c 6f 73 65 43 6f 6e 6e  ){.    closeConn
8ae0: 65 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d 0a  ection = 1;.  }.
8af0: 0a 20 20 2f 2a 20 54 68 69 73 20 76 65 72 79 20  .  /* This very 
8b00: 73 69 6d 70 6c 65 20 73 65 72 76 65 72 20 6f 6e  simple server on
8b10: 6c 79 20 75 6e 64 65 72 73 74 61 6e 64 73 20 74  ly understands t
8b20: 68 65 20 47 45 54 2c 20 50 4f 53 54 0a 20 20 2a  he GET, POST.  *
8b30: 2a 20 61 6e 64 20 48 45 41 44 20 6d 65 74 68 6f  * and HEAD metho
8b40: 64 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74  ds.  */.  if( st
8b50: 72 63 6d 70 28 7a 4d 65 74 68 6f 64 2c 22 47 45  rcmp(zMethod,"GE
8b60: 54 22 29 21 3d 30 20 26 26 20 73 74 72 63 6d 70  T")!=0 && strcmp
8b70: 28 7a 4d 65 74 68 6f 64 2c 22 50 4f 53 54 22 29  (zMethod,"POST")
8b80: 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20 73 74  !=0.       && st
8b90: 72 63 6d 70 28 7a 4d 65 74 68 6f 64 2c 22 48 45  rcmp(zMethod,"HE
8ba0: 41 44 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 53  AD")!=0 ){.    S
8bb0: 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 35 30  tartResponse("50
8bc0: 31 20 4e 6f 74 20 49 6d 70 6c 65 6d 65 6e 74 65  1 Not Implemente
8bd0: 64 22 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d  d");.    nOut +=
8be0: 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22   printf(.      "
8bf0: 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65  Content-type: te
8c00: 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20  xt/plain\r\n".  
8c10: 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 20      "\r\n".     
8c20: 20 22 54 68 65 20 25 73 20 6d 65 74 68 6f 64 20   "The %s method 
8c30: 69 73 20 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74  is not implement
8c40: 65 64 20 6f 6e 20 74 68 69 73 20 73 65 72 76 65  ed on this serve
8c50: 72 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 7a 4d 65  r.\n",.      zMe
8c60: 74 68 6f 64 29 3b 0a 20 20 20 20 4d 61 6b 65 4c  thod);.    MakeL
8c70: 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20 20 20 20  ogEntry(0);.    
8c80: 65 78 69 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20  exit(0);.  }..  
8c90: 2f 2a 20 47 65 74 20 61 6c 6c 20 74 68 65 20 6f  /* Get all the o
8ca0: 70 74 69 6f 6e 61 6c 20 66 69 65 6c 64 73 20 74  ptional fields t
8cb0: 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 65 20 66  hat follow the f
8cc0: 69 72 73 74 20 6c 69 6e 65 2e 0a 20 20 2a 2f 0a  irst line..  */.
8cd0: 20 20 7a 43 6f 6f 6b 69 65 20 3d 20 30 3b 0a 20    zCookie = 0;. 
8ce0: 20 7a 41 75 74 68 54 79 70 65 20 3d 20 30 3b 0a   zAuthType = 0;.
8cf0: 20 20 7a 52 65 6d 6f 74 65 55 73 65 72 20 3d 20    zRemoteUser = 
8d00: 30 3b 0a 20 20 7a 52 65 66 65 72 65 72 20 3d 20  0;.  zReferer = 
8d10: 30 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74  0;.  while( fget
8d20: 73 28 7a 4c 69 6e 65 2c 73 69 7a 65 6f 66 28 7a  s(zLine,sizeof(z
8d30: 4c 69 6e 65 29 2c 73 74 64 69 6e 29 20 29 7b 0a  Line),stdin) ){.
8d40: 20 20 20 20 63 68 61 72 20 2a 7a 46 69 65 6c 64      char *zField
8d50: 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  Name;.    char *
8d60: 7a 56 61 6c 3b 0a 0a 20 20 20 20 6e 49 6e 20 2b  zVal;..    nIn +
8d70: 3d 20 73 74 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b  = strlen(zLine);
8d80: 0a 20 20 20 20 7a 46 69 65 6c 64 4e 61 6d 65 20  .    zFieldName 
8d90: 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e  = GetFirstElemen
8da0: 74 28 7a 4c 69 6e 65 2c 26 7a 56 61 6c 29 3b 0a  t(zLine,&zVal);.
8db0: 20 20 20 20 69 66 28 20 7a 46 69 65 6c 64 4e 61      if( zFieldNa
8dc0: 6d 65 3d 3d 30 20 7c 7c 20 2a 7a 46 69 65 6c 64  me==0 || *zField
8dd0: 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Name==0 ) break;
8de0: 0a 20 20 20 20 52 65 6d 6f 76 65 4e 65 77 6c 69  .    RemoveNewli
8df0: 6e 65 28 7a 56 61 6c 29 3b 0a 20 20 20 20 69 66  ne(zVal);.    if
8e00: 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69  ( strcasecmp(zFi
8e10: 65 6c 64 4e 61 6d 65 2c 22 55 73 65 72 2d 41 67  eldName,"User-Ag
8e20: 65 6e 74 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ent:")==0 ){.   
8e30: 20 20 20 7a 41 67 65 6e 74 20 3d 20 53 74 72 44     zAgent = StrD
8e40: 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65  up(zVal);.    }e
8e50: 6c 73 65 20 69 66 28 20 73 74 72 63 61 73 65 63  lse if( strcasec
8e60: 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 41  mp(zFieldName,"A
8e70: 63 63 65 70 74 3a 22 29 3d 3d 30 20 29 7b 0a 20  ccept:")==0 ){. 
8e80: 20 20 20 20 20 7a 41 63 63 65 70 74 20 3d 20 53       zAccept = S
8e90: 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20  trDup(zVal);.   
8ea0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 61   }else if( strca
8eb0: 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65  secmp(zFieldName
8ec0: 2c 22 43 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74 68  ,"Content-length
8ed0: 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  :")==0 ){.      
8ee0: 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 20 3d  zContentLength =
8ef0: 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20   StrDup(zVal);. 
8f00: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
8f10: 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61  casecmp(zFieldNa
8f20: 6d 65 2c 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65  me,"Content-type
8f30: 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  :")==0 ){.      
8f40: 7a 43 6f 6e 74 65 6e 74 54 79 70 65 20 3d 20 53  zContentType = S
8f50: 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20  trDup(zVal);.   
8f60: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 61   }else if( strca
8f70: 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65  secmp(zFieldName
8f80: 2c 22 52 65 66 65 72 65 72 3a 22 29 3d 3d 30 20  ,"Referer:")==0 
8f90: 29 7b 0a 20 20 20 20 20 20 7a 52 65 66 65 72 65  ){.      zRefere
8fa0: 72 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29  r = StrDup(zVal)
8fb0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8fc0: 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c  strcasecmp(zFiel
8fd0: 64 4e 61 6d 65 2c 22 43 6f 6f 6b 69 65 3a 22 29  dName,"Cookie:")
8fe0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f  ==0 ){.      zCo
8ff0: 6f 6b 69 65 20 3d 20 53 74 72 41 70 70 65 6e 64  okie = StrAppend
9000: 28 7a 43 6f 6f 6b 69 65 2c 22 3b 20 22 2c 7a 56  (zCookie,"; ",zV
9010: 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  al);.    }else i
9020: 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46  f( strcasecmp(zF
9030: 69 65 6c 64 4e 61 6d 65 2c 22 43 6f 6e 6e 65 63  ieldName,"Connec
9040: 74 69 6f 6e 3a 22 29 3d 3d 30 20 29 7b 0a 20 20  tion:")==0 ){.  
9050: 20 20 20 20 69 66 28 20 73 74 72 63 61 73 65 63      if( strcasec
9060: 6d 70 28 7a 56 61 6c 2c 22 63 6c 6f 73 65 22 29  mp(zVal,"close")
9070: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
9080: 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d  loseConnection =
9090: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
90a0: 69 66 28 20 21 66 6f 72 63 65 43 6c 6f 73 65 20  if( !forceClose 
90b0: 26 26 20 73 74 72 63 61 73 65 63 6d 70 28 7a 56  && strcasecmp(zV
90c0: 61 6c 2c 20 22 6b 65 65 70 2d 61 6c 69 76 65 22  al, "keep-alive"
90d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
90e0: 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20  closeConnection 
90f0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
9100: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 61   }else if( strca
9110: 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65  secmp(zFieldName
9120: 2c 22 48 6f 73 74 3a 22 29 3d 3d 30 20 29 7b 0a  ,"Host:")==0 ){.
9130: 20 20 20 20 20 20 69 6e 74 20 69 6e 53 71 75 61        int inSqua
9140: 72 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68  re = 0;.      ch
9150: 61 72 20 63 3b 0a 20 20 20 20 20 20 7a 48 74 74  ar c;.      zHtt
9160: 70 48 6f 73 74 20 3d 20 53 74 72 44 75 70 28 7a  pHost = StrDup(z
9170: 56 61 6c 29 3b 0a 20 20 20 20 20 20 7a 53 65 72  Val);.      zSer
9180: 76 65 72 50 6f 72 74 20 3d 20 7a 53 65 72 76 65  verPort = zServe
9190: 72 4e 61 6d 65 20 3d 20 53 74 72 44 75 70 28 7a  rName = StrDup(z
91a0: 48 74 74 70 48 6f 73 74 29 3b 0a 20 20 20 20 20  HttpHost);.     
91b0: 20 77 68 69 6c 65 28 20 7a 53 65 72 76 65 72 50   while( zServerP
91c0: 6f 72 74 20 26 26 20 28 63 20 3d 20 2a 7a 53 65  ort && (c = *zSe
91d0: 72 76 65 72 50 6f 72 74 29 21 3d 30 0a 20 20 20  rverPort)!=0.   
91e0: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 63             && (c
91f0: 21 3d 27 3a 27 20 7c 7c 20 69 6e 53 71 75 61 72  !=':' || inSquar
9200: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  e) ){.        if
9210: 28 20 63 3d 3d 27 5b 27 20 29 20 69 6e 53 71 75  ( c=='[' ) inSqu
9220: 61 72 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  are = 1;.       
9230: 20 69 66 28 20 63 3d 3d 27 5d 27 20 29 20 69 6e   if( c==']' ) in
9240: 53 71 75 61 72 65 20 3d 20 30 3b 0a 20 20 20 20  Square = 0;.    
9250: 20 20 20 20 7a 53 65 72 76 65 72 50 6f 72 74 2b      zServerPort+
9260: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
9270: 20 69 66 28 20 7a 53 65 72 76 65 72 50 6f 72 74   if( zServerPort
9280: 20 26 26 20 2a 7a 53 65 72 76 65 72 50 6f 72 74   && *zServerPort
9290: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 7a 53 65   ){.        *zSe
92a0: 72 76 65 72 50 6f 72 74 20 3d 20 30 3b 0a 20 20  rverPort = 0;.  
92b0: 20 20 20 20 20 20 7a 53 65 72 76 65 72 50 6f 72        zServerPor
92c0: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
92d0: 20 20 20 69 66 28 20 7a 52 65 61 6c 50 6f 72 74     if( zRealPort
92e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 65 72   ){.        zSer
92f0: 76 65 72 50 6f 72 74 20 3d 20 53 74 72 44 75 70  verPort = StrDup
9300: 28 7a 52 65 61 6c 50 6f 72 74 29 3b 0a 20 20 20  (zRealPort);.   
9310: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
9320: 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46  f( strcasecmp(zF
9330: 69 65 6c 64 4e 61 6d 65 2c 22 41 75 74 68 6f 72  ieldName,"Author
9340: 69 7a 61 74 69 6f 6e 3a 22 29 3d 3d 30 20 29 7b  ization:")==0 ){
9350: 0a 20 20 20 20 20 20 7a 41 75 74 68 54 79 70 65  .      zAuthType
9360: 20 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65   = GetFirstEleme
9370: 6e 74 28 53 74 72 44 75 70 28 7a 56 61 6c 29 2c  nt(StrDup(zVal),
9380: 20 26 7a 41 75 74 68 41 72 67 29 3b 0a 20 20 20   &zAuthArg);.   
9390: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 69 73   }.  }..  /* Dis
93a0: 61 6c 6c 6f 77 20 72 65 66 65 72 72 69 6e 67 20  allow referring 
93b0: 66 72 6f 6d 20 63 65 72 74 61 69 6e 20 63 6c 69  from certain cli
93c0: 65 6e 74 73 20 2a 2f 0a 20 20 69 66 28 20 7a 41  ents */.  if( zA
93d0: 67 65 6e 74 20 29 7b 0a 20 20 20 20 69 66 28 20  gent ){.    if( 
93e0: 73 74 72 73 74 72 28 7a 41 67 65 6e 74 2c 20 22  strstr(zAgent, "
93f0: 57 69 6e 64 6f 77 73 5f 39 22 29 21 3d 30 0a 20  Windows_9")!=0. 
9400: 20 20 20 20 7c 7c 20 73 74 72 73 74 72 28 7a 41      || strstr(zA
9410: 67 65 6e 74 2c 20 22 44 6f 77 6e 6c 6f 61 64 5f  gent, "Download_
9420: 4d 61 73 74 65 72 22 29 21 3d 30 0a 20 20 20 20  Master")!=0.    
9430: 20 7c 7c 20 73 74 72 73 74 72 28 7a 41 67 65 6e   || strstr(zAgen
9440: 74 2c 20 22 45 7a 6f 6f 6d 73 2f 22 29 21 3d 30  t, "Ezooms/")!=0
9450: 0a 20 20 20 2f 2a 7c 7c 20 73 74 72 73 74 72 28  .   /*|| strstr(
9460: 7a 41 67 65 6e 74 2c 20 22 62 69 6e 67 62 6f 74  zAgent, "bingbot
9470: 22 29 21 3d 30 2a 2f 0a 20 20 20 20 20 7c 7c 20  ")!=0*/.     || 
9480: 73 74 72 73 74 72 28 7a 41 67 65 6e 74 2c 20 22  strstr(zAgent, "
9490: 41 68 72 65 66 73 42 6f 74 22 29 21 3d 30 0a 20  AhrefsBot")!=0. 
94a0: 20 20 20 29 7b 0a 20 20 20 20 20 20 46 6f 72 62     ){.      Forb
94b0: 69 64 64 65 6e 28 29 3b 0a 20 20 20 20 7d 0a 20  idden();.    }. 
94c0: 20 7d 0a 23 69 66 20 30 0a 20 20 69 66 28 20 7a   }.#if 0.  if( z
94d0: 52 65 66 65 72 65 72 20 29 7b 0a 20 20 20 20 73  Referer ){.    s
94e0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
94f0: 20 2a 61 7a 44 69 73 61 6c 6c 6f 77 5b 5d 20 3d   *azDisallow[] =
9500: 20 7b 0a 20 20 20 20 20 20 22 73 6b 69 64 72 6f   {.      "skidro
9510: 77 63 72 61 63 6b 2e 63 6f 6d 22 2c 0a 20 20 20  wcrack.com",.   
9520: 20 20 20 22 68 6f 73 68 69 79 75 75 67 69 2e 74     "hoshiyuugi.t
9530: 69 73 74 6f 72 79 2e 63 6f 6d 22 2c 0a 20 20 20  istory.com",.   
9540: 20 20 20 22 73 6b 69 64 72 6f 77 67 61 6d 65 73     "skidrowgames
9550: 2e 6e 65 74 22 2c 0a 20 20 20 20 7d 3b 0a 20 20  .net",.    };.  
9560: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
9570: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
9580: 7a 44 69 73 61 6c 6c 6f 77 29 2f 73 69 7a 65 6f  zDisallow)/sizeo
9590: 66 28 61 7a 44 69 73 61 6c 6c 6f 77 5b 30 5d 29  f(azDisallow[0])
95a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
95b0: 28 20 73 74 72 73 74 72 28 7a 52 65 66 65 72 65  ( strstr(zRefere
95c0: 72 2c 20 61 7a 44 69 73 61 6c 6c 6f 77 5b 69 5d  r, azDisallow[i]
95d0: 29 21 3d 30 20 29 20 4e 6f 74 46 6f 75 6e 64 28  )!=0 ) NotFound(
95e0: 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d  __LINE__);.    }
95f0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
9600: 2a 20 4d 61 6b 65 20 61 6e 20 65 78 74 72 61 20  * Make an extra 
9610: 65 66 66 6f 72 74 20 74 6f 20 67 65 74 20 61 20  effort to get a 
9620: 76 61 6c 69 64 20 73 65 72 76 65 72 20 6e 61 6d  valid server nam
9630: 65 20 61 6e 64 20 70 6f 72 74 20 6e 75 6d 62 65  e and port numbe
9640: 72 2e 0a 20 20 2a 2a 20 4f 6e 6c 79 20 4e 65 74  r..  ** Only Net
9650: 73 63 61 70 65 20 70 72 6f 76 69 64 65 73 20 74  scape provides t
9660: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  his information.
9670: 20 20 49 66 20 74 68 65 20 62 72 6f 77 73 65 72    If the browser
9680: 20 69 73 0a 20 20 2a 2a 20 49 6e 74 65 72 6e 65   is.  ** Interne
9690: 74 20 45 78 70 6c 6f 72 65 72 2c 20 74 68 65 6e  t Explorer, then
96a0: 20 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64   we have to find
96b0: 20 6f 75 74 20 74 68 65 20 69 6e 66 6f 72 6d 61   out the informa
96c0: 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 6f 75  tion for.  ** ou
96d0: 72 73 65 6c 76 65 73 2e 0a 20 20 2a 2f 0a 20 20  rselves..  */.  
96e0: 69 66 28 20 7a 53 65 72 76 65 72 4e 61 6d 65 3d  if( zServerName=
96f0: 3d 30 20 29 7b 0a 20 20 20 20 7a 53 65 72 76 65  =0 ){.    zServe
9700: 72 4e 61 6d 65 20 3d 20 53 61 66 65 4d 61 6c 6c  rName = SafeMall
9710: 6f 63 28 20 31 30 30 20 29 3b 0a 20 20 20 20 67  oc( 100 );.    g
9720: 65 74 68 6f 73 74 6e 61 6d 65 28 7a 53 65 72 76  ethostname(zServ
9730: 65 72 4e 61 6d 65 2c 31 30 30 29 3b 0a 20 20 7d  erName,100);.  }
9740: 0a 20 20 69 66 28 20 7a 53 65 72 76 65 72 50 6f  .  if( zServerPo
9750: 72 74 3d 3d 30 20 7c 7c 20 2a 7a 53 65 72 76 65  rt==0 || *zServe
9760: 72 50 6f 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  rPort==0 ){.    
9770: 7a 53 65 72 76 65 72 50 6f 72 74 20 3d 20 44 45  zServerPort = DE
9780: 46 41 55 4c 54 5f 50 4f 52 54 3b 0a 20 20 7d 0a  FAULT_PORT;.  }.
9790: 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65  .  /* Remove the
97a0: 20 71 75 65 72 79 20 73 74 72 69 6e 67 20 66 72   query string fr
97b0: 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  om the end of th
97c0: 65 20 72 65 71 75 65 73 74 65 64 20 66 69 6c 65  e requested file
97d0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 7a 3d 7a  ..  */.  for(z=z
97e0: 53 63 72 69 70 74 3b 20 2a 7a 20 26 26 20 2a 7a  Script; *z && *z
97f0: 21 3d 27 3f 27 3b 20 7a 2b 2b 29 7b 7d 0a 20 20  !='?'; z++){}.  
9800: 69 66 28 20 2a 7a 3d 3d 27 3f 27 20 29 7b 0a 20  if( *z=='?' ){. 
9810: 20 20 20 7a 51 75 65 72 79 53 75 66 66 69 78 20     zQuerySuffix 
9820: 3d 20 53 74 72 44 75 70 28 7a 29 3b 0a 20 20 20  = StrDup(z);.   
9830: 20 2a 7a 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65   *z = 0;.  }else
9840: 7b 0a 20 20 20 20 7a 51 75 65 72 79 53 75 66 66  {.    zQuerySuff
9850: 69 78 20 3d 20 22 22 3b 0a 20 20 7d 0a 20 20 7a  ix = "";.  }.  z
9860: 51 75 65 72 79 53 74 72 69 6e 67 20 3d 20 2a 7a  QueryString = *z
9870: 51 75 65 72 79 53 75 66 66 69 78 20 3f 20 26 7a  QuerySuffix ? &z
9880: 51 75 65 72 79 53 75 66 66 69 78 5b 31 5d 20 3a  QuerySuffix[1] :
9890: 20 7a 51 75 65 72 79 53 75 66 66 69 78 3b 0a 0a   zQuerySuffix;..
98a0: 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 66 69    /* Create a fi
98b0: 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 50  le to hold the P
98c0: 4f 53 54 20 71 75 65 72 79 20 64 61 74 61 2c 20  OST query data, 
98d0: 69 66 20 61 6e 79 2e 20 20 57 65 20 68 61 76 65  if any.  We have
98e0: 20 74 6f 0a 20 20 2a 2a 20 64 6f 20 69 74 20 74   to.  ** do it t
98f0: 68 69 73 20 77 61 79 2e 20 20 57 65 20 63 61 6e  his way.  We can
9900: 27 74 20 6a 75 73 74 20 70 61 73 73 20 74 68 65  't just pass the
9910: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
9920: 20 64 6f 77 6e 20 74 6f 0a 20 20 2a 2a 20 74 68   down to.  ** th
9930: 65 20 63 68 69 6c 64 20 70 72 6f 63 65 73 73 20  e child process 
9940: 62 65 63 61 75 73 65 20 74 68 65 20 66 67 65 74  because the fget
9950: 73 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  s() function may
9960: 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20   have already.  
9970: 2a 2a 20 72 65 61 64 20 70 61 72 74 20 6f 66 20  ** read part of 
9980: 74 68 65 20 50 4f 53 54 20 64 61 74 61 20 69 6e  the POST data in
9990: 74 6f 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20  to its internal 
99a0: 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  buffer..  */.  i
99b0: 66 28 20 7a 4d 65 74 68 6f 64 5b 30 5d 3d 3d 27  f( zMethod[0]=='
99c0: 50 27 20 26 26 20 7a 43 6f 6e 74 65 6e 74 4c 65  P' && zContentLe
99d0: 6e 67 74 68 21 3d 30 20 29 7b 0a 20 20 20 20 69  ngth!=0 ){.    i
99e0: 6e 74 20 6c 65 6e 20 3d 20 61 74 6f 69 28 7a 43  nt len = atoi(zC
99f0: 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 29 3b 0a 20  ontentLength);. 
9a00: 20 20 20 46 49 4c 45 20 2a 6f 75 74 3b 0a 20 20     FILE *out;.  
9a10: 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 20 20    char *zBuf;.  
9a20: 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 69 66    int n;..    if
9a30: 28 20 6c 65 6e 3e 4d 41 58 5f 43 4f 4e 54 45 4e  ( len>MAX_CONTEN
9a40: 54 5f 4c 45 4e 47 54 48 20 29 7b 0a 20 20 20 20  T_LENGTH ){.    
9a50: 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28    StartResponse(
9a60: 22 35 30 30 20 52 65 71 75 65 73 74 20 74 6f 6f  "500 Request too
9a70: 20 6c 61 72 67 65 22 29 3b 0a 20 20 20 20 20 20   large");.      
9a80: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a  nOut += printf(.
9a90: 20 20 20 20 20 20 20 20 22 43 6f 6e 74 65 6e 74          "Content
9aa0: 2d 74 79 70 65 3a 20 74 65 78 74 2f 70 6c 61 69  -type: text/plai
9ab0: 6e 5c 72 5c 6e 22 0a 20 20 20 20 20 20 20 20 22  n\r\n".        "
9ac0: 5c 72 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 54  \r\n".        "T
9ad0: 6f 6f 20 6d 75 63 68 20 50 4f 53 54 20 64 61 74  oo much POST dat
9ae0: 61 5c 6e 22 0a 20 20 20 20 20 20 29 3b 0a 20 20  a\n".      );.  
9af0: 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79      MakeLogEntry
9b00: 28 30 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28  (0);.      exit(
9b10: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 70  0);.    }.    sp
9b20: 72 69 6e 74 66 28 7a 54 6d 70 4e 61 6d 42 75 66  rintf(zTmpNamBuf
9b30: 2c 20 22 2f 74 6d 70 2f 2d 70 6f 73 74 2d 64 61  , "/tmp/-post-da
9b40: 74 61 2d 58 58 58 58 58 58 22 29 3b 0a 20 20 20  ta-XXXXXX");.   
9b50: 20 7a 54 6d 70 4e 61 6d 20 3d 20 7a 54 6d 70 4e   zTmpNam = zTmpN
9b60: 61 6d 42 75 66 3b 0a 20 20 20 20 6d 6b 73 74 65  amBuf;.    mkste
9b70: 6d 70 28 7a 54 6d 70 4e 61 6d 29 3b 0a 20 20 20  mp(zTmpNam);.   
9b80: 20 6f 75 74 20 3d 20 66 6f 70 65 6e 28 7a 54 6d   out = fopen(zTm
9b90: 70 4e 61 6d 2c 22 77 22 29 3b 0a 20 20 20 20 69  pNam,"w");.    i
9ba0: 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  f( out==0 ){.   
9bb0: 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65     StartResponse
9bc0: 28 22 35 30 30 20 43 61 6e 6e 6f 74 20 63 72 65  ("500 Cannot cre
9bd0: 61 74 65 20 2f 74 6d 70 20 66 69 6c 65 22 29 3b  ate /tmp file");
9be0: 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70  .      nOut += p
9bf0: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22  rintf(.        "
9c00: 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65  Content-type: te
9c10: 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20  xt/plain\r\n".  
9c20: 20 20 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20        "\r\n".   
9c30: 20 20 20 20 20 22 43 6f 75 6c 64 20 6e 6f 74 20       "Could not 
9c40: 6f 70 65 6e 20 5c 22 25 73 5c 22 20 66 6f 72 20  open \"%s\" for 
9c50: 77 72 69 74 69 6e 67 5c 6e 22 2c 20 7a 54 6d 70  writing\n", zTmp
9c60: 4e 61 6d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  Nam.      );.   
9c70: 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28     MakeLogEntry(
9c80: 30 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 30  0);.      exit(0
9c90: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75  );.    }.    zBu
9ca0: 66 20 3d 20 53 61 66 65 4d 61 6c 6c 6f 63 28 20  f = SafeMalloc( 
9cb0: 6c 65 6e 20 29 3b 0a 20 20 20 20 69 66 28 20 75  len );.    if( u
9cc0: 73 65 54 69 6d 65 6f 75 74 20 29 20 61 6c 61 72  seTimeout ) alar
9cd0: 6d 28 31 35 20 2b 20 6c 65 6e 2f 32 30 30 30 29  m(15 + len/2000)
9ce0: 3b 0a 20 20 20 20 6e 20 3d 20 66 72 65 61 64 28  ;.    n = fread(
9cf0: 7a 42 75 66 2c 31 2c 6c 65 6e 2c 73 74 64 69 6e  zBuf,1,len,stdin
9d00: 29 3b 0a 20 20 20 20 6e 49 6e 20 2b 3d 20 6e 3b  );.    nIn += n;
9d10: 0a 20 20 20 20 66 77 72 69 74 65 28 7a 42 75 66  .    fwrite(zBuf
9d20: 2c 31 2c 6e 2c 6f 75 74 29 3b 0a 20 20 20 20 66  ,1,n,out);.    f
9d30: 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 66  ree(zBuf);.    f
9d40: 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 7d 0a  close(out);.  }.
9d50: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
9d60: 74 68 65 20 72 75 6e 6e 69 6e 67 20 74 69 6d 65  the running time
9d70: 20 69 73 20 6e 6f 74 20 74 6f 6f 20 67 72 65 61   is not too grea
9d80: 74 20 2a 2f 0a 20 20 69 66 28 20 75 73 65 54 69  t */.  if( useTi
9d90: 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d 28 31 30  meout ) alarm(10
9da0: 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74  );..  /* Convert
9db0: 20 61 6c 6c 20 75 6e 75 73 75 61 6c 20 63 68 61   all unusual cha
9dc0: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73  racters in the s
9dd0: 63 72 69 70 74 20 6e 61 6d 65 20 69 6e 74 6f 20  cript name into 
9de0: 22 5f 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  "_"..  **.  ** T
9df0: 68 69 73 20 69 73 20 61 20 64 65 66 65 6e 73 65  his is a defense
9e00: 20 61 67 61 69 6e 73 74 20 76 61 72 69 6f 75 73   against various
9e10: 20 61 74 74 61 63 6b 73 2c 20 58 53 53 20 61 74   attacks, XSS at
9e20: 74 61 63 6b 73 20 69 6e 20 70 61 72 74 69 63 75  tacks in particu
9e30: 6c 61 72 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  lar..  */.  for(
9e40: 7a 3d 7a 53 63 72 69 70 74 3b 20 2a 7a 3b 20 7a  z=zScript; *z; z
9e50: 2b 2b 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65  ++){.    unsigne
9e60: 64 20 63 68 61 72 20 63 20 3d 20 2a 28 75 6e 73  d char c = *(uns
9e70: 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 3b 0a 20  igned char*)z;. 
9e80: 20 20 20 69 66 28 20 28 63 26 30 78 38 30 29 21     if( (c&0x80)!
9e90: 3d 30 20 7c 7c 20 21 61 6c 6c 6f 77 65 64 49 6e  =0 || !allowedIn
9ea0: 4e 61 6d 65 5b 63 5d 20 29 7b 0a 20 20 20 20 20  Name[c] ){.     
9eb0: 20 2a 7a 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20   *z = '_';.     
9ec0: 20 69 66 28 20 63 3d 3d 27 25 27 20 26 26 20 7a   if( c=='%' && z
9ed0: 5b 31 5d 21 3d 30 20 26 26 20 7a 5b 32 5d 21 3d  [1]!=0 && z[2]!=
9ee0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  0 ){.        for
9ef0: 28 69 3d 33 3b 20 28 7a 5b 69 2d 32 5d 20 3d 20  (i=3; (z[i-2] = 
9f00: 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 7d  z[i])!=0; i++){}
9f10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9f20: 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 27 74 20 61   }..  /* Don't a
9f30: 6c 6c 6f 77 20 22 2f 2e 22 20 6f 72 20 22 2f 2d  llow "/." or "/-
9f40: 22 20 74 6f 20 74 6f 20 6f 63 63 75 72 20 61 6e  " to to occur an
9f50: 79 77 68 65 72 65 20 69 6e 20 74 68 65 20 65 6e  ywhere in the en
9f60: 74 69 74 79 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20  tity name..  ** 
9f70: 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 61 74  This prevents at
9f80: 74 61 63 6b 73 20 69 6e 76 6f 6c 76 69 6e 67 20  tacks involving 
9f90: 22 2e 2e 22 20 61 6e 64 20 61 6c 73 6f 20 61 6c  ".." and also al
9fa0: 6c 6f 77 73 20 75 73 20 74 6f 20 63 72 65 61 74  lows us to creat
9fb0: 65 0a 20 20 2a 2a 20 66 69 6c 65 73 20 61 6e 64  e.  ** files and
9fc0: 20 64 69 72 65 63 74 6f 72 69 65 73 20 77 68 6f   directories who
9fd0: 73 65 20 6e 61 6d 65 73 20 62 65 67 69 6e 20 77  se names begin w
9fe0: 69 74 68 20 22 2d 22 20 77 68 69 63 68 20 61 72  ith "-" which ar
9ff0: 65 20 69 6e 76 69 73 69 62 6c 65 0a 20 20 2a 2a  e invisible.  **
a000: 20 74 6f 20 74 68 65 20 77 65 62 73 65 72 76 65   to the webserve
a010: 72 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 7a 3d  r..  */.  for(z=
a020: 7a 53 63 72 69 70 74 3b 20 2a 7a 3b 20 7a 2b 2b  zScript; *z; z++
a030: 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27  ){.    if( *z=='
a040: 2f 27 20 26 26 20 28 7a 5b 31 5d 3d 3d 27 2e 27  /' && (z[1]=='.'
a050: 20 7c 7c 20 7a 5b 31 5d 3d 3d 27 2d 27 29 20 29   || z[1]=='-') )
a060: 7b 0a 20 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e  {.       NotFoun
a070: 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  d(__LINE__);.   
a080: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67   }.  }..  /* Fig
a090: 75 72 65 20 6f 75 74 20 77 68 61 74 20 74 68 65  ure out what the
a0a0: 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 66 69 6c   root of the fil
a0b0: 65 73 79 73 74 65 6d 20 73 68 6f 75 6c 64 20 62  esystem should b
a0c0: 65 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  e.  If the.  ** 
a0d0: 48 54 54 50 5f 48 4f 53 54 20 70 61 72 61 6d 65  HTTP_HOST parame
a0e0: 74 65 72 20 65 78 69 73 74 73 20 28 73 74 6f 72  ter exists (stor
a0f0: 65 64 20 69 6e 20 7a 48 74 74 70 48 6f 73 74 29  ed in zHttpHost)
a100: 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65   then remove the
a110: 0a 20 20 2a 2a 20 70 6f 72 74 20 6e 75 6d 62 65  .  ** port numbe
a120: 72 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 28  r from the end (
a130: 69 66 20 61 6e 79 29 2c 20 63 6f 6e 76 65 72 74  if any), convert
a140: 20 61 6c 6c 20 63 68 61 72 61 63 74 65 72 73 20   all characters 
a150: 74 6f 20 6c 6f 77 65 72 0a 20 20 2a 2a 20 63 61  to lower.  ** ca
a160: 73 65 2c 20 61 6e 64 20 63 6f 6e 76 65 72 74 20  se, and convert 
a170: 61 6c 6c 20 22 2e 22 20 74 6f 20 22 5f 22 2e 20  all "." to "_". 
a180: 20 54 68 65 6e 20 74 72 79 20 74 6f 20 66 69 6e   Then try to fin
a190: 64 20 61 20 64 69 72 65 63 74 6f 72 79 0a 20 20  d a directory.  
a1a0: 2a 2a 20 77 69 74 68 20 74 68 61 74 20 6e 61 6d  ** with that nam
a1b0: 65 20 61 6e 64 20 74 68 65 20 65 78 74 65 6e 73  e and the extens
a1c0: 69 6f 6e 20 2e 77 65 62 73 69 74 65 2e 20 20 49  ion .website.  I
a1d0: 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c 6f 6f  f not found, loo
a1e0: 6b 0a 20 20 2a 2a 20 66 6f 72 20 22 64 65 66 61  k.  ** for "defa
a1f0: 75 6c 74 2e 77 65 62 73 69 74 65 22 2e 0a 20 20  ult.website"..  
a200: 2a 2f 0a 20 20 69 66 28 20 7a 53 63 72 69 70 74  */.  if( zScript
a210: 5b 30 5d 21 3d 27 2f 27 20 29 20 4e 6f 74 46 6f  [0]!='/' ) NotFo
a220: 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  und(__LINE__);. 
a230: 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 52 6f 6f   if( strlen(zRoo
a240: 74 29 2b 34 30 20 3e 3d 20 73 69 7a 65 6f 66 28  t)+40 >= sizeof(
a250: 7a 4c 69 6e 65 29 20 29 20 4e 6f 74 46 6f 75 6e  zLine) ) NotFoun
a260: 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 69  d(__LINE__);.  i
a270: 66 28 20 7a 48 74 74 70 48 6f 73 74 3d 3d 30 20  f( zHttpHost==0 
a280: 7c 7c 20 7a 48 74 74 70 48 6f 73 74 5b 30 5d 3d  || zHttpHost[0]=
a290: 3d 30 20 29 7b 0a 20 20 20 20 4e 6f 74 46 6f 75  =0 ){.    NotFou
a2a0: 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  nd(__LINE__);.  
a2b0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6c 65 6e  }else if( strlen
a2c0: 28 7a 48 74 74 70 48 6f 73 74 29 2b 73 74 72 6c  (zHttpHost)+strl
a2d0: 65 6e 28 7a 52 6f 6f 74 29 2b 31 30 20 3e 3d 20  en(zRoot)+10 >= 
a2e0: 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 20 29 7b  sizeof(zLine) ){
a2f0: 0a 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f  .    NotFound(__
a300: 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65  LINE__);.  }else
a310: 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c  {.    sprintf(zL
a320: 69 6e 65 2c 20 22 25 73 2f 25 73 22 2c 20 7a 52  ine, "%s/%s", zR
a330: 6f 6f 74 2c 20 7a 48 74 74 70 48 6f 73 74 29 3b  oot, zHttpHost);
a340: 0a 20 20 20 20 66 6f 72 28 69 3d 73 74 72 6c 65  .    for(i=strle
a350: 6e 28 7a 52 6f 6f 74 29 2b 31 3b 20 7a 4c 69 6e  n(zRoot)+1; zLin
a360: 65 5b 69 5d 20 26 26 20 7a 4c 69 6e 65 5b 69 5d  e[i] && zLine[i]
a370: 21 3d 27 3a 27 3b 20 69 2b 2b 29 7b 0a 20 20 20  !=':'; i++){.   
a380: 20 20 20 69 6e 74 20 63 20 3d 20 7a 4c 69 6e 65     int c = zLine
a390: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21  [i];.      if( !
a3a0: 69 73 61 6c 6e 75 6d 28 63 29 20 29 7b 0a 20 20  isalnum(c) ){.  
a3b0: 20 20 20 20 20 20 7a 4c 69 6e 65 5b 69 5d 20 3d        zLine[i] =
a3c0: 20 27 5f 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73   '_';.      }els
a3d0: 65 20 69 66 28 20 69 73 75 70 70 65 72 28 63 29  e if( isupper(c)
a3e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e   ){.        zLin
a3f0: 65 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72 28 63  e[i] = tolower(c
a400: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
a410: 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a 4c 69  .    strcpy(&zLi
a420: 6e 65 5b 69 5d 2c 20 22 2e 77 65 62 73 69 74 65  ne[i], ".website
a430: 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74  ");.  }.  if( st
a440: 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75  at(zLine,&statbu
a450: 66 29 20 7c 7c 20 21 53 5f 49 53 44 49 52 28 73  f) || !S_ISDIR(s
a460: 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20  tatbuf.st_mode) 
a470: 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  ){.    sprintf(z
a480: 4c 69 6e 65 2c 20 22 25 73 2f 64 65 66 61 75 6c  Line, "%s/defaul
a490: 74 2e 77 65 62 73 69 74 65 22 2c 20 7a 52 6f 6f  t.website", zRoo
a4a0: 74 29 3b 0a 20 20 20 20 69 66 28 20 73 74 61 74  t);.    if( stat
a4b0: 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75 66 29  (zLine,&statbuf)
a4c0: 20 7c 7c 20 21 53 5f 49 53 44 49 52 28 73 74 61   || !S_ISDIR(sta
a4d0: 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 7b  tbuf.st_mode) ){
a4e0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 61 6e 64  .      if( stand
a4f0: 61 6c 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 20  alone ){.       
a500: 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20   sprintf(zLine, 
a510: 22 25 73 22 2c 20 7a 52 6f 6f 74 29 3b 0a 20 20  "%s", zRoot);.  
a520: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a530: 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49     NotFound(__LI
a540: 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  NE__);.      }. 
a550: 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 48 6f 6d 65     }.  }.  zHome
a560: 20 3d 20 53 74 72 44 75 70 28 7a 4c 69 6e 65 29   = StrDup(zLine)
a570: 3b 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 64  ;..  /* Change d
a580: 69 72 65 63 74 6f 72 69 65 73 20 74 6f 20 74 68  irectories to th
a590: 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 48 54  e root of the HT
a5a0: 54 50 20 66 69 6c 65 73 79 73 74 65 6d 0a 20 20  TP filesystem.  
a5b0: 2a 2f 0a 20 20 69 66 28 20 63 68 64 69 72 28 7a  */.  if( chdir(z
a5c0: 48 6f 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Home)!=0 ){.    
a5d0: 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b  char zBuf[1000];
a5e0: 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e  .    Malfunction
a5f0: 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 63 61 6e 6e  (__LINE__, "cann
a600: 6f 74 20 63 68 64 69 72 20 74 6f 20 5b 25 73 5d  ot chdir to [%s]
a610: 20 66 72 6f 6d 20 5b 25 73 5d 22 2c 0a 20 20 20   from [%s]",.   
a620: 20 20 20 20 20 20 7a 48 6f 6d 65 2c 20 67 65 74        zHome, get
a630: 63 77 64 28 7a 42 75 66 2c 39 39 39 29 29 3b 0a  cwd(zBuf,999));.
a640: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
a650: 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74 68 65   the file in the
a660: 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 57 65   filesystem.  We
a670: 20 6d 69 67 68 74 20 68 61 76 65 20 74 6f 20 61   might have to a
a680: 70 70 65 6e 64 0a 20 20 2a 2a 20 74 68 65 20 6e  ppend.  ** the n
a690: 61 6d 65 20 22 69 6e 64 65 78 2e 68 74 6d 6c 22  ame "index.html"
a6a0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 69 6e   in order to fin
a6b0: 64 20 69 74 2e 20 20 41 6e 79 20 65 78 63 65 73  d it.  Any exces
a6c0: 73 20 70 61 74 68 0a 20 20 2a 2a 20 69 6e 66 6f  s path.  ** info
a6d0: 72 6d 61 74 69 6f 6e 20 69 73 20 70 75 74 20 69  rmation is put i
a6e0: 6e 74 6f 20 74 68 65 20 7a 50 61 74 68 49 6e 66  nto the zPathInf
a6f0: 6f 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 2a 2f  o variable..  */
a700: 0a 20 20 7a 4c 69 6e 65 5b 30 5d 20 3d 20 27 2e  .  zLine[0] = '.
a710: 27 3b 0a 20 20 69 20 3d 20 30 3b 0a 20 20 77 68  ';.  i = 0;.  wh
a720: 69 6c 65 28 20 7a 53 63 72 69 70 74 5b 69 5d 20  ile( zScript[i] 
a730: 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 53  ){.    while( zS
a740: 63 72 69 70 74 5b 69 5d 20 26 26 20 7a 53 63 72  cript[i] && zScr
a750: 69 70 74 5b 69 5d 21 3d 27 2f 27 20 29 7b 0a 20  ipt[i]!='/' ){. 
a760: 20 20 20 20 20 7a 4c 69 6e 65 5b 69 2b 31 5d 20       zLine[i+1] 
a770: 3d 20 7a 53 63 72 69 70 74 5b 69 5d 3b 0a 20 20  = zScript[i];.  
a780: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20      i++;.    }. 
a790: 20 20 20 7a 4c 69 6e 65 5b 69 2b 31 5d 20 3d 20     zLine[i+1] = 
a7a0: 30 3b 0a 20 20 20 20 69 66 28 20 73 74 61 74 28  0;.    if( stat(
a7b0: 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75 66 29 21  zLine,&statbuf)!
a7c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
a7d0: 73 74 69 6c 6c 53 65 61 72 63 68 69 6e 67 20 3d  stillSearching =
a7e0: 20 31 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   1;.      while(
a7f0: 20 73 74 69 6c 6c 53 65 61 72 63 68 69 6e 67 20   stillSearching 
a800: 26 26 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20  && i>0 ){.      
a810: 20 20 77 68 69 6c 65 28 20 69 3e 30 20 26 26 20    while( i>0 && 
a820: 7a 4c 69 6e 65 5b 69 5d 21 3d 27 2f 27 20 29 7b  zLine[i]!='/' ){
a830: 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20   i--; }.        
a840: 73 74 72 63 70 79 28 26 7a 4c 69 6e 65 5b 69 5d  strcpy(&zLine[i]
a850: 2c 20 22 2f 6e 6f 74 2d 66 6f 75 6e 64 2e 68 74  , "/not-found.ht
a860: 6d 6c 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ml");.        if
a870: 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74  ( stat(zLine,&st
a880: 61 74 62 75 66 29 3d 3d 30 20 26 26 20 53 5f 49  atbuf)==0 && S_I
a890: 53 52 45 47 28 73 74 61 74 62 75 66 2e 73 74 5f  SREG(statbuf.st_
a8a0: 6d 6f 64 65 29 0a 20 20 20 20 20 20 20 20 20 20  mode).          
a8b0: 20 20 26 26 20 61 63 63 65 73 73 28 7a 4c 69 6e    && access(zLin
a8c0: 65 2c 52 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20  e,R_OK)==0 ){.  
a8d0: 20 20 20 20 20 20 20 20 7a 52 65 61 6c 53 63 72          zRealScr
a8e0: 69 70 74 20 3d 20 53 74 72 44 75 70 28 26 7a 4c  ipt = StrDup(&zL
a8f0: 69 6e 65 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  ine[1]);.       
a900: 20 20 20 52 65 64 69 72 65 63 74 28 7a 52 65 61     Redirect(zRea
a910: 6c 53 63 72 69 70 74 2c 20 31 29 3b 0a 20 20 20  lScript, 1);.   
a920: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
a930: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
a940: 20 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20          i--;.   
a950: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
a960: 20 20 20 20 20 69 66 28 20 73 74 69 6c 6c 53 65       if( stillSe
a970: 61 72 63 68 69 6e 67 20 29 20 4e 6f 74 46 6f 75  arching ) NotFou
a980: 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  nd(__LINE__);.  
a990: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
a9a0: 0a 20 20 20 20 69 66 28 20 53 5f 49 53 52 45 47  .    if( S_ISREG
a9b0: 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65  (statbuf.st_mode
a9c0: 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ) ){.      if( a
a9d0: 63 63 65 73 73 28 7a 4c 69 6e 65 2c 52 5f 4f 4b  ccess(zLine,R_OK
a9e0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 4e 6f 74  ) ){.        Not
a9f0: 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b  Found(__LINE__);
aa00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
aa10: 52 65 61 6c 53 63 72 69 70 74 20 3d 20 53 74 72  RealScript = Str
aa20: 44 75 70 28 26 7a 4c 69 6e 65 5b 31 5d 29 3b 0a  Dup(&zLine[1]);.
aa30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
aa40: 20 7d 0a 20 20 20 20 69 66 28 20 7a 53 63 72 69   }.    if( zScri
aa50: 70 74 5b 69 5d 3d 3d 30 20 7c 7c 20 7a 53 63 72  pt[i]==0 || zScr
aa60: 69 70 74 5b 69 2b 31 5d 3d 3d 30 20 29 7b 0a 20  ipt[i+1]==0 ){. 
aa70: 20 20 20 20 20 73 74 72 63 70 79 28 26 7a 4c 69       strcpy(&zLi
aa80: 6e 65 5b 69 2b 31 5d 2c 22 2f 69 6e 64 65 78 2e  ne[i+1],"/index.
aa90: 68 74 6d 6c 22 29 3b 0a 20 20 20 20 20 20 69 66  html");.      if
aaa0: 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74  ( stat(zLine,&st
aab0: 61 74 62 75 66 29 21 3d 30 20 7c 7c 20 21 53 5f  atbuf)!=0 || !S_
aac0: 49 53 52 45 47 28 73 74 61 74 62 75 66 2e 73 74  ISREG(statbuf.st
aad0: 5f 6d 6f 64 65 29 20 0a 20 20 20 20 20 20 7c 7c  _mode) .      ||
aae0: 20 61 63 63 65 73 73 28 7a 4c 69 6e 65 2c 52 5f   access(zLine,R_
aaf0: 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  OK) ){.        s
ab00: 74 72 63 70 79 28 26 7a 4c 69 6e 65 5b 69 2b 31  trcpy(&zLine[i+1
ab10: 5d 2c 22 2f 69 6e 64 65 78 2e 63 67 69 22 29 3b  ],"/index.cgi");
ab20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 61  .        if( sta
ab30: 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75 66  t(zLine,&statbuf
ab40: 29 21 3d 30 20 7c 7c 20 21 53 5f 49 53 52 45 47  )!=0 || !S_ISREG
ab50: 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65  (statbuf.st_mode
ab60: 29 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 61 63  ) .        || ac
ab70: 63 65 73 73 28 7a 4c 69 6e 65 2c 52 5f 4f 4b 29  cess(zLine,R_OK)
ab80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 4e 6f   ){.          No
ab90: 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29  tFound(__LINE__)
aba0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
abb0: 20 20 7d 0a 20 20 20 20 20 20 7a 52 65 61 6c 53    }.      zRealS
abc0: 63 72 69 70 74 20 3d 20 53 74 72 44 75 70 28 26  cript = StrDup(&
abd0: 7a 4c 69 6e 65 5b 31 5d 29 3b 0a 20 20 20 20 20  zLine[1]);.     
abe0: 20 69 66 28 20 7a 53 63 72 69 70 74 5b 69 5d 3d   if( zScript[i]=
abf0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
ac00: 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
ac10: 64 20 55 52 4c 20 64 6f 65 73 20 6e 6f 74 20 65  d URL does not e
ac20: 6e 64 20 77 69 74 68 20 22 2f 22 20 62 75 74 20  nd with "/" but 
ac30: 77 65 20 68 61 64 20 74 6f 0a 20 20 20 20 20 20  we had to.      
ac40: 20 20 2a 2a 20 61 70 70 65 6e 64 20 22 69 6e 64    ** append "ind
ac50: 65 78 2e 68 74 6d 6c 22 2c 20 74 68 65 6e 20 61  ex.html", then a
ac60: 20 72 65 64 69 72 65 63 74 20 69 73 20 6e 65 63   redirect is nec
ac70: 65 73 73 61 72 79 2e 20 20 4f 74 68 65 72 77 69  essary.  Otherwi
ac80: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  se.        ** no
ac90: 6e 65 20 6f 66 20 74 68 65 20 72 65 6c 61 74 69  ne of the relati
aca0: 76 65 20 55 52 4c 73 20 69 6e 20 74 68 65 20 64  ve URLs in the d
acb0: 65 6c 69 76 65 72 65 64 20 64 6f 63 75 6d 65 6e  elivered documen
acc0: 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  t will be.      
acd0: 20 20 2a 2a 20 63 6f 72 72 65 63 74 2e 20 2a 2f    ** correct. */
ace0: 0a 20 20 20 20 20 20 20 20 52 65 64 69 72 65 63  .        Redirec
acf0: 74 28 7a 52 65 61 6c 53 63 72 69 70 74 2c 20 31  t(zRealScript, 1
ad00: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
ad10: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
ad20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
ad30: 20 20 7a 4c 69 6e 65 5b 69 2b 31 5d 20 3d 20 7a    zLine[i+1] = z
ad40: 53 63 72 69 70 74 5b 69 5d 3b 0a 20 20 20 20 69  Script[i];.    i
ad50: 2b 2b 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 20  ++;.  }.  zFile 
ad60: 3d 20 53 74 72 44 75 70 28 7a 4c 69 6e 65 29 3b  = StrDup(zLine);
ad70: 0a 20 20 7a 50 61 74 68 49 6e 66 6f 20 3d 20 53  .  zPathInfo = S
ad80: 74 72 44 75 70 28 26 7a 53 63 72 69 70 74 5b 69  trDup(&zScript[i
ad90: 5d 29 3b 0a 20 20 6c 65 6e 46 69 6c 65 20 3d 20  ]);.  lenFile = 
ada0: 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 3b 0a 20  strlen(zFile);. 
adb0: 20 7a 44 69 72 20 3d 20 53 74 72 44 75 70 28 7a   zDir = StrDup(z
adc0: 46 69 6c 65 29 3b 0a 20 20 66 6f 72 28 69 3d 73  File);.  for(i=s
add0: 74 72 6c 65 6e 28 7a 44 69 72 29 2d 31 3b 20 69  trlen(zDir)-1; i
ade0: 3e 30 20 26 26 20 7a 44 69 72 5b 69 5d 21 3d 27  >0 && zDir[i]!='
adf0: 2f 27 3b 20 69 2d 2d 29 7b 7d 3b 0a 20 20 69 66  /'; i--){};.  if
ae00: 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 73  ( i==0 ){.     s
ae10: 74 72 63 70 79 28 7a 44 69 72 2c 22 2f 22 29 3b  trcpy(zDir,"/");
ae20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 7a  .  }else{.     z
ae30: 44 69 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a  Dir[i] = 0;.  }.
ae40: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
ae50: 65 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ee if there is a
ae60: 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  n authorization 
ae70: 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20  file.  If there 
ae80: 69 73 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73  is,.  ** process
ae90: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 70 72 69   it..  */.  spri
aea0: 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 25 73 2f 2d  ntf(zLine, "%s/-
aeb0: 61 75 74 68 22 2c 20 7a 44 69 72 29 3b 0a 20 20  auth", zDir);.  
aec0: 69 66 28 20 61 63 63 65 73 73 28 7a 4c 69 6e 65  if( access(zLine
aed0: 2c 52 5f 4f 4b 29 3d 3d 30 20 26 26 20 21 43 68  ,R_OK)==0 && !Ch
aee0: 65 63 6b 42 61 73 69 63 41 75 74 68 6f 72 69 7a  eckBasicAuthoriz
aef0: 61 74 69 6f 6e 28 7a 4c 69 6e 65 29 20 29 20 72  ation(zLine) ) r
af00: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 61 6b  eturn;..  /* Tak
af10: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 61 63  e appropriate ac
af20: 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  tion.  */.  if( 
af30: 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65  (statbuf.st_mode
af40: 20 26 20 30 31 30 30 29 3d 3d 30 31 30 30 20 26   & 0100)==0100 &
af50: 26 20 61 63 63 65 73 73 28 7a 46 69 6c 65 2c 58  & access(zFile,X
af60: 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  _OK)==0 ){.    /
af70: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c  *.    ** The fol
af80: 6c 6f 77 69 6e 67 73 20 73 74 61 74 69 63 20 76  lowings static v
af90: 61 72 69 61 62 6c 65 73 20 61 72 65 20 75 73 65  ariables are use
afa0: 64 20 74 6f 20 73 65 74 75 70 20 74 68 65 20 65  d to setup the e
afb0: 6e 76 69 72 6f 6e 6d 65 6e 74 0a 20 20 20 20 2a  nvironment.    *
afc0: 2a 20 66 6f 72 20 74 68 65 20 43 47 49 20 73 63  * for the CGI sc
afd0: 72 69 70 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ript.    */.    
afe0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 65 66  static char *def
aff0: 61 75 6c 74 5f 70 61 74 68 20 3d 20 22 2f 62 69  ault_path = "/bi
b000: 6e 3a 2f 75 73 72 2f 62 69 6e 22 3b 0a 20 20 20  n:/usr/bin";.   
b010: 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 67 61   static char *ga
b020: 74 65 77 61 79 5f 69 6e 74 65 72 66 61 63 65 20  teway_interface 
b030: 3d 20 22 43 47 49 2f 31 2e 30 22 3b 0a 20 20 20  = "CGI/1.0";.   
b040: 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 7b   static struct {
b050: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 6e  .      char *zEn
b060: 76 4e 61 6d 65 3b 0a 20 20 20 20 20 20 63 68 61  vName;.      cha
b070: 72 20 2a 2a 70 7a 45 6e 76 56 61 6c 75 65 3b 0a  r **pzEnvValue;.
b080: 20 20 20 20 7d 20 63 67 69 65 6e 76 5b 5d 20 3d      } cgienv[] =
b090: 20 7b 0a 20 20 20 20 20 20 7b 20 22 41 55 54 48   {.      { "AUTH
b0a0: 5f 54 59 50 45 22 2c 20 20 20 20 20 20 20 20 20  _TYPE",         
b0b0: 20 20 20 20 20 20 20 20 20 20 26 7a 41 75 74 68            &zAuth
b0c0: 54 79 70 65 20 7d 2c 0a 20 20 20 20 20 20 7b 20  Type },.      { 
b0d0: 22 41 55 54 48 5f 43 4f 4e 54 45 4e 54 22 2c 20  "AUTH_CONTENT", 
b0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
b0f0: 7a 41 75 74 68 41 72 67 20 7d 2c 0a 20 20 20 20  zAuthArg },.    
b100: 20 20 7b 20 22 43 4f 4e 54 45 4e 54 5f 4c 45 4e    { "CONTENT_LEN
b110: 47 54 48 22 2c 20 20 20 20 20 20 20 20 20 20 20  GTH",           
b120: 20 20 20 26 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67     &zContentLeng
b130: 74 68 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 43  th },.      { "C
b140: 4f 4e 54 45 4e 54 5f 54 59 50 45 22 2c 20 20 20  ONTENT_TYPE",   
b150: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 43               &zC
b160: 6f 6e 74 65 6e 74 54 79 70 65 20 7d 2c 0a 20 20  ontentType },.  
b170: 20 20 20 20 7b 20 22 44 4f 43 55 4d 45 4e 54 5f      { "DOCUMENT_
b180: 52 4f 4f 54 22 2c 20 20 20 20 20 20 20 20 20 20  ROOT",          
b190: 20 20 20 20 20 26 7a 48 6f 6d 65 20 7d 2c 0a 20       &zHome },. 
b1a0: 20 20 20 20 20 7b 20 22 47 41 54 45 57 41 59 5f       { "GATEWAY_
b1b0: 49 4e 54 45 52 46 41 43 45 22 2c 20 20 20 20 20  INTERFACE",     
b1c0: 20 20 20 20 20 20 26 67 61 74 65 77 61 79 5f 69        &gateway_i
b1d0: 6e 74 65 72 66 61 63 65 20 7d 2c 0a 20 20 20 20  nterface },.    
b1e0: 20 20 7b 20 22 48 54 54 50 5f 41 43 43 45 50 54    { "HTTP_ACCEPT
b1f0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
b200: 20 20 20 26 7a 41 63 63 65 70 74 20 7d 2c 0a 20     &zAccept },. 
b210: 20 20 20 20 20 7b 20 22 48 54 54 50 5f 43 4f 4f       { "HTTP_COO
b220: 4b 49 45 22 2c 20 20 20 20 20 20 20 20 20 20 20  KIE",           
b230: 20 20 20 20 20 20 26 7a 43 6f 6f 6b 69 65 20 7d        &zCookie }
b240: 2c 0a 20 20 20 20 20 20 7b 20 22 48 54 54 50 5f  ,.      { "HTTP_
b250: 48 4f 53 54 22 2c 20 20 20 20 20 20 20 20 20 20  HOST",          
b260: 20 20 20 20 20 20 20 20 20 26 7a 48 74 74 70 48           &zHttpH
b270: 6f 73 74 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  ost },.      { "
b280: 48 54 54 50 5f 52 45 46 45 52 45 52 22 2c 20 20  HTTP_REFERER",  
b290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
b2a0: 52 65 66 65 72 65 72 20 7d 2c 0a 20 20 20 20 20  Referer },.     
b2b0: 20 7b 20 22 48 54 54 50 5f 55 53 45 52 5f 41 47   { "HTTP_USER_AG
b2c0: 45 4e 54 22 2c 20 20 20 20 20 20 20 20 20 20 20  ENT",           
b2d0: 20 20 26 7a 41 67 65 6e 74 20 7d 2c 0a 20 20 20    &zAgent },.   
b2e0: 20 20 20 7b 20 22 50 41 54 48 22 2c 20 20 20 20     { "PATH",    
b2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b300: 20 20 20 20 26 64 65 66 61 75 6c 74 5f 70 61 74      &default_pat
b310: 68 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 50 41  h },.      { "PA
b320: 54 48 5f 49 4e 46 4f 22 2c 20 20 20 20 20 20 20  TH_INFO",       
b330: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 50 61              &zPa
b340: 74 68 49 6e 66 6f 20 7d 2c 0a 20 20 20 20 20 20  thInfo },.      
b350: 7b 20 22 51 55 45 52 59 5f 53 54 52 49 4e 47 22  { "QUERY_STRING"
b360: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b370: 20 26 7a 51 75 65 72 79 53 74 72 69 6e 67 20 7d   &zQueryString }
b380: 2c 0a 20 20 20 20 20 20 7b 20 22 52 45 4d 4f 54  ,.      { "REMOT
b390: 45 5f 41 44 44 52 22 2c 20 20 20 20 20 20 20 20  E_ADDR",        
b3a0: 20 20 20 20 20 20 20 20 20 26 7a 52 65 6d 6f 74           &zRemot
b3b0: 65 41 64 64 72 20 7d 2c 0a 20 20 20 20 20 20 7b  eAddr },.      {
b3c0: 20 22 52 45 51 55 45 53 54 5f 4d 45 54 48 4f 44   "REQUEST_METHOD
b3d0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
b3e0: 26 7a 4d 65 74 68 6f 64 20 7d 2c 0a 20 20 20 20  &zMethod },.    
b3f0: 20 20 7b 20 22 52 45 51 55 45 53 54 5f 55 52 49    { "REQUEST_URI
b400: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
b410: 20 20 20 26 7a 53 63 72 69 70 74 20 7d 2c 0a 20     &zScript },. 
b420: 20 20 20 20 20 7b 20 22 52 45 4d 4f 54 45 5f 55       { "REMOTE_U
b430: 53 45 52 22 2c 20 20 20 20 20 20 20 20 20 20 20  SER",           
b440: 20 20 20 20 20 20 26 7a 52 65 6d 6f 74 65 55 73        &zRemoteUs
b450: 65 72 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  er },.      { "S
b460: 43 52 49 50 54 5f 44 49 52 45 43 54 4f 52 59 22  CRIPT_DIRECTORY"
b470: 2c 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 44  ,            &zD
b480: 69 72 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  ir },.      { "S
b490: 43 52 49 50 54 5f 46 49 4c 45 4e 41 4d 45 22 2c  CRIPT_FILENAME",
b4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 46               &zF
b4b0: 69 6c 65 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  ile },.      { "
b4c0: 53 43 52 49 50 54 5f 4e 41 4d 45 22 2c 20 20 20  SCRIPT_NAME",   
b4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
b4e0: 52 65 61 6c 53 63 72 69 70 74 20 7d 2c 0a 20 20  RealScript },.  
b4f0: 20 20 20 20 7b 20 22 53 45 52 56 45 52 5f 4e 41      { "SERVER_NA
b500: 4d 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ME",            
b510: 20 20 20 20 20 26 7a 53 65 72 76 65 72 4e 61 6d       &zServerNam
b520: 65 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 45  e },.      { "SE
b530: 52 56 45 52 5f 50 4f 52 54 22 2c 20 20 20 20 20  RVER_PORT",     
b540: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 53 65              &zSe
b550: 72 76 65 72 50 6f 72 74 20 7d 2c 0a 20 20 20 20  rverPort },.    
b560: 20 20 7b 20 22 53 45 52 56 45 52 5f 50 52 4f 54    { "SERVER_PROT
b570: 4f 43 4f 4c 22 2c 20 20 20 20 20 20 20 20 20 20  OCOL",          
b580: 20 20 20 26 7a 50 72 6f 74 6f 63 6f 6c 20 7d 2c     &zProtocol },
b590: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 68 61 72  .    };.    char
b5a0: 20 2a 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 3b   *zBaseFilename;
b5b0: 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 77     /* Filename w
b5c0: 69 74 68 6f 75 74 20 64 69 72 65 63 74 6f 72 79  ithout directory
b5d0: 20 70 72 65 66 69 78 20 2a 2f 0a 0a 20 20 20 20   prefix */..    
b5e0: 2f 2a 20 49 66 20 69 74 73 20 65 78 65 63 75 74  /* If its execut
b5f0: 61 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65  able, it must be
b600: 20 61 20 43 47 49 20 70 72 6f 67 72 61 6d 2e 20   a CGI program. 
b610: 20 53 74 61 72 74 20 62 79 0a 20 20 20 20 2a 2a   Start by.    **
b620: 20 63 68 61 6e 67 69 6e 67 20 64 69 72 65 63 74   changing direct
b630: 6f 72 69 65 73 20 74 6f 20 74 68 65 20 64 69 72  ories to the dir
b640: 65 63 74 6f 72 79 20 68 6f 6c 64 69 6e 67 20 74  ectory holding t
b650: 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20  he program..    
b660: 2a 2f 0a 20 20 20 20 69 66 28 20 63 68 64 69 72  */.    if( chdir
b670: 28 7a 44 69 72 29 20 29 7b 0a 20 20 20 20 20 20  (zDir) ){.      
b680: 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b  char zBuf[1000];
b690: 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69  .      Malfuncti
b6a0: 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 63 61  on(__LINE__, "ca
b6b0: 6e 6e 6f 74 20 63 68 64 69 72 20 74 6f 20 5b 25  nnot chdir to [%
b6c0: 73 5d 20 66 72 6f 6d 20 5b 25 73 5d 22 2c 20 0a  s] from [%s]", .
b6d0: 20 20 20 20 20 20 20 20 20 20 20 7a 44 69 72 2c             zDir,
b6e0: 20 67 65 74 63 77 64 28 7a 42 75 66 2c 39 39 39   getcwd(zBuf,999
b6f0: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
b700: 2a 20 53 65 74 75 70 20 74 68 65 20 65 6e 76 69  * Setup the envi
b710: 72 6f 6e 6d 65 6e 74 20 61 70 70 72 6f 70 72 69  ronment appropri
b720: 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ately..    */.  
b730: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 69 6e    for(i=0; i<(in
b740: 74 29 28 73 69 7a 65 6f 66 28 63 67 69 65 6e 76  t)(sizeof(cgienv
b750: 29 2f 73 69 7a 65 6f 66 28 63 67 69 65 6e 76 5b  )/sizeof(cgienv[
b760: 30 5d 29 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  0])); i++){.    
b770: 20 20 69 66 28 20 2a 63 67 69 65 6e 76 5b 69 5d    if( *cgienv[i]
b780: 2e 70 7a 45 6e 76 56 61 6c 75 65 20 29 7b 0a 20  .pzEnvValue ){. 
b790: 20 20 20 20 20 20 20 53 65 74 45 6e 76 28 63 67         SetEnv(cg
b7a0: 69 65 6e 76 5b 69 5d 2e 7a 45 6e 76 4e 61 6d 65  ienv[i].zEnvName
b7b0: 2c 2a 63 67 69 65 6e 76 5b 69 5d 2e 70 7a 45 6e  ,*cgienv[i].pzEn
b7c0: 76 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d  vValue);.      }
b7d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
b7e0: 73 65 48 74 74 70 73 20 29 7b 0a 20 20 20 20 20  seHttps ){.     
b7f0: 20 70 75 74 65 6e 76 28 22 48 54 54 50 53 3d 6f   putenv("HTTPS=o
b800: 6e 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n");.    }..    
b810: 2f 2a 0a 20 20 20 20 2a 2a 20 41 62 6f 72 74 20  /*.    ** Abort 
b820: 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 69 66  with an error if
b830: 20 74 68 65 20 43 47 49 20 73 63 72 69 70 74 20   the CGI script 
b840: 69 73 20 77 72 69 74 61 62 6c 65 20 62 79 20 61  is writable by a
b850: 6e 79 6f 6e 65 20 6f 74 68 65 72 0a 20 20 20 20  nyone other.    
b860: 2a 2a 20 74 68 61 6e 20 69 74 73 20 6f 77 6e 65  ** than its owne
b870: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
b880: 28 20 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64  ( statbuf.st_mod
b890: 65 20 26 20 30 30 32 32 20 29 7b 0a 20 20 20 20  e & 0022 ){.    
b8a0: 20 20 43 67 69 53 63 72 69 70 74 57 72 69 74 61    CgiScriptWrita
b8b0: 62 6c 65 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ble();.    }..  
b8c0: 20 20 2f 2a 20 46 6f 72 20 74 68 65 20 50 4f 53    /* For the POS
b8d0: 54 20 6d 65 74 68 6f 64 20 61 6c 6c 20 69 6e 70  T method all inp
b8e0: 75 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  ut has been writ
b8f0: 74 65 6e 20 74 6f 20 61 20 74 65 6d 70 6f 72 61  ten to a tempora
b900: 72 79 20 66 69 6c 65 2c 0a 20 20 20 20 2a 2a 20  ry file,.    ** 
b910: 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 72 65  so we have to re
b920: 64 69 72 65 63 74 20 69 6e 70 75 74 20 74 6f 20  direct input to 
b930: 74 68 65 20 43 47 49 20 73 63 72 69 70 74 20 66  the CGI script f
b940: 72 6f 6d 20 74 68 61 74 20 66 69 6c 65 2e 0a 20  rom that file.. 
b950: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 4d     */.    if( zM
b960: 65 74 68 6f 64 5b 30 5d 3d 3d 27 50 27 20 29 7b  ethod[0]=='P' ){
b970: 0a 20 20 20 20 20 20 64 75 70 28 30 29 3b 0a 20  .      dup(0);. 
b980: 20 20 20 20 20 63 6c 6f 73 65 28 30 29 3b 0a 20       close(0);. 
b990: 20 20 20 20 20 6f 70 65 6e 28 7a 54 6d 70 4e 61       open(zTmpNa
b9a0: 6d 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20  m, O_RDONLY);.  
b9b0: 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 73    }..    for(i=s
b9c0: 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2d 31 3b 20  trlen(zFile)-1; 
b9d0: 69 3e 3d 30 20 26 26 20 7a 46 69 6c 65 5b 69 5d  i>=0 && zFile[i]
b9e0: 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20  !='/'; i--){}.  
b9f0: 20 20 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 20    zBaseFilename 
ba00: 3d 20 26 7a 46 69 6c 65 5b 69 2b 31 5d 3b 0a 20  = &zFile[i+1];. 
ba10: 20 20 20 69 66 28 20 69 3e 3d 30 20 26 26 20 73     if( i>=0 && s
ba20: 74 72 6e 63 6d 70 28 7a 42 61 73 65 46 69 6c 65  trncmp(zBaseFile
ba30: 6e 61 6d 65 2c 22 6e 70 68 2d 22 2c 34 29 3d 3d  name,"nph-",4)==
ba40: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  0 ){.      /* If
ba50: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
ba60: 20 43 47 49 20 73 63 72 69 70 74 20 62 65 67 69   CGI script begi
ba70: 6e 73 20 77 69 74 68 20 22 6e 70 68 2d 22 20 74  ns with "nph-" t
ba80: 68 65 6e 20 77 65 20 61 72 65 0a 20 20 20 20 20  hen we are.     
ba90: 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68   ** dealing with
baa0: 20 61 20 22 6e 6f 6e 2d 70 61 72 73 65 64 20 68   a "non-parsed h
bab0: 65 61 64 65 72 73 22 20 43 47 49 20 73 63 72 69  eaders" CGI scri
bac0: 70 74 2e 20 20 4a 75 73 74 20 65 78 65 63 28 29  pt.  Just exec()
bad0: 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 64 69 72  .      ** it dir
bae0: 65 63 74 6c 79 20 61 6e 64 20 6c 65 74 20 69 74  ectly and let it
baf0: 20 68 61 6e 64 6c 65 20 61 6c 6c 20 69 74 73 20   handle all its 
bb00: 6f 77 6e 20 68 65 61 64 65 72 20 67 65 6e 65 72  own header gener
bb10: 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ation..      */.
bb20: 20 20 20 20 20 20 65 78 65 63 6c 28 7a 42 61 73        execl(zBas
bb30: 65 46 69 6c 65 6e 61 6d 65 2c 7a 42 61 73 65 46  eFilename,zBaseF
bb40: 69 6c 65 6e 61 6d 65 2c 28 63 68 61 72 2a 29 30  ilename,(char*)0
bb50: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4e 4f 54 45  );.      /* NOTE
bb60: 3a 20 4e 6f 20 6c 6f 67 20 65 6e 74 72 79 20 77  : No log entry w
bb70: 72 69 74 74 65 6e 20 66 6f 72 20 6e 70 68 2d 20  ritten for nph- 
bb80: 73 63 72 69 70 74 73 20 2a 2f 0a 20 20 20 20 20  scripts */.     
bb90: 20 65 78 69 74 28 30 29 3b 0a 20 20 20 20 7d 0a   exit(0);.    }.
bba0: 0a 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72  .    /* Fall thr
bbb0: 75 20 74 6f 20 68 65 72 65 20 6f 6e 6c 79 20 69  u to here only i
bbc0: 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 28  f this process (
bbd0: 74 68 65 20 73 65 72 76 65 72 29 20 69 73 20 67  the server) is g
bbe0: 6f 69 6e 67 0a 20 20 20 20 2a 2a 20 74 6f 20 72  oing.    ** to r
bbf0: 65 61 64 20 61 6e 64 20 61 75 67 6d 65 6e 74 20  ead and augment 
bc00: 74 68 65 20 68 65 61 64 65 72 20 73 65 6e 74 20  the header sent 
bc10: 62 61 63 6b 20 62 79 20 74 68 65 20 43 47 49 20  back by the CGI 
bc20: 70 72 6f 63 65 73 73 2e 0a 20 20 20 20 2a 2a 20  process..    ** 
bc30: 4f 70 65 6e 20 61 20 70 69 70 65 20 74 6f 20 72  Open a pipe to r
bc40: 65 63 65 69 76 65 20 74 68 65 20 6f 75 74 70 75  eceive the outpu
bc50: 74 20 66 72 6f 6d 20 74 68 65 20 43 47 49 20 70  t from the CGI p
bc60: 72 6f 63 65 73 73 2e 20 20 54 68 65 6e 0a 20 20  rocess.  Then.  
bc70: 20 20 2a 2a 20 66 6f 72 6b 20 74 68 65 20 43 47    ** fork the CG
bc80: 49 20 70 72 6f 63 65 73 73 2e 20 20 4f 6e 63 65  I process.  Once
bc90: 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 64   everything is d
bca0: 6f 6e 65 2c 20 77 65 20 73 68 6f 75 6c 64 20 62  one, we should b
bcb0: 65 0a 20 20 20 20 2a 2a 20 61 62 6c 65 20 74 6f  e.    ** able to
bcc0: 20 72 65 61 64 20 74 68 65 20 6f 75 74 70 75 74   read the output
bcd0: 20 6f 66 20 43 47 49 20 6f 6e 20 74 68 65 20 22   of CGI on the "
bce0: 69 6e 22 20 73 74 72 65 61 6d 2e 0a 20 20 20 20  in" stream..    
bcf0: 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69  */.    {.      i
bd00: 6e 74 20 70 78 5b 32 5d 3b 0a 20 20 20 20 20 20  nt px[2];.      
bd10: 70 69 70 65 28 70 78 29 3b 0a 20 20 20 20 20 20  pipe(px);.      
bd20: 69 66 28 20 66 6f 72 6b 28 29 3d 3d 30 20 29 7b  if( fork()==0 ){
bd30: 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 70  .        close(p
bd40: 78 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 63  x[0]);.        c
bd50: 6c 6f 73 65 28 31 29 3b 0a 20 20 20 20 20 20 20  lose(1);.       
bd60: 20 64 75 70 28 70 78 5b 31 5d 29 3b 0a 20 20 20   dup(px[1]);.   
bd70: 20 20 20 20 20 63 6c 6f 73 65 28 70 78 5b 31 5d       close(px[1]
bd80: 29 3b 0a 20 20 20 20 20 20 20 20 65 78 65 63 6c  );.        execl
bd90: 28 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c 20  (zBaseFilename, 
bda0: 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c 20 28  zBaseFilename, (
bdb0: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
bdc0: 20 20 65 78 69 74 28 30 29 3b 0a 20 20 20 20 20    exit(0);.     
bdd0: 20 7d 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 70   }.      close(p
bde0: 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 6e 20  x[1]);.      in 
bdf0: 3d 20 66 64 6f 70 65 6e 28 70 78 5b 30 5d 2c 20  = fdopen(px[0], 
be00: 22 72 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  "r");.    }.    
be10: 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  if( in==0 ){.   
be20: 20 20 20 43 67 69 45 72 72 6f 72 28 29 3b 0a 20     CgiError();. 
be30: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 61     }..    /* Rea
be40: 64 20 61 6e 64 20 70 72 6f 63 65 73 73 20 74 68  d and process th
be50: 65 20 66 69 72 73 74 20 6c 69 6e 65 20 6f 66 20  e first line of 
be60: 74 68 65 20 68 65 61 64 65 72 20 72 65 74 75 72  the header retur
be70: 6e 65 64 20 62 79 20 74 68 65 0a 20 20 20 20 2a  ned by the.    *
be80: 2a 20 43 47 49 20 73 63 72 69 70 74 2e 0a 20 20  * CGI script..  
be90: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 65    */.    if( use
bea0: 54 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d 28  Timeout ) alarm(
beb0: 31 35 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  15);.    while( 
bec0: 66 67 65 74 73 28 7a 4c 69 6e 65 2c 73 69 7a 65  fgets(zLine,size
bed0: 6f 66 28 7a 4c 69 6e 65 29 2c 69 6e 29 20 29 7b  of(zLine),in) ){
bee0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63  .      if( strnc
bef0: 6d 70 28 7a 4c 69 6e 65 2c 22 4c 6f 63 61 74 69  mp(zLine,"Locati
bf00: 6f 6e 3a 22 2c 39 29 3d 3d 30 20 29 7b 0a 20 20  on:",9)==0 ){.  
bf10: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
bf20: 20 20 20 20 20 52 65 6d 6f 76 65 4e 65 77 6c 69       RemoveNewli
bf30: 6e 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20  ne(zLine);.     
bf40: 20 20 20 7a 20 3d 20 26 7a 4c 69 6e 65 5b 31 30     z = &zLine[10
bf50: 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ];.        while
bf60: 28 20 69 73 73 70 61 63 65 28 2a 7a 29 20 29 7b  ( isspace(*z) ){
bf70: 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20   z++; }.        
bf80: 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
bf90: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
bfa0: 66 28 20 7a 5b 69 5d 3d 3d 27 3f 27 20 29 7b 0a  f( z[i]=='?' ){.
bfb0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65              zQue
bfc0: 72 79 53 75 66 66 69 78 20 3d 20 53 74 72 44 75  rySuffix = StrDu
bfd0: 70 28 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20  p("");.         
bfe0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
bff0: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 69 66       .        if
c000: 28 20 7a 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 7a  ( z[0]=='/' && z
c010: 5b 31 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [1]=='/' ){.    
c020: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 63 68        /* The sch
c030: 65 6d 65 20 69 73 20 6d 69 73 73 69 6e 67 2e 20  eme is missing. 
c040: 20 41 64 64 20 69 74 20 69 6e 20 62 65 66 6f 72   Add it in befor
c050: 65 20 72 65 64 69 72 65 63 74 69 6e 67 20 2a 2f  e redirecting */
c060: 0a 20 20 20 20 20 20 20 20 20 20 53 74 61 72 74  .          Start
c070: 52 65 73 70 6f 6e 73 65 28 22 33 30 32 20 52 65  Response("302 Re
c080: 64 69 72 65 63 74 22 29 3b 0a 20 20 20 20 20 20  direct");.      
c090: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
c0a0: 74 66 28 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73  tf("Location: %s
c0b0: 3a 25 73 25 73 5c 72 5c 6e 22 2c 7a 48 74 74 70  :%s%s\r\n",zHttp
c0c0: 2c 7a 2c 7a 51 75 65 72 79 53 75 66 66 69 78 29  ,z,zQuerySuffix)
c0d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
c0e0: 6b 3b 20 2f 2a 20 44 4b 20 2a 2f 0a 20 20 20 20  k; /* DK */.    
c0f0: 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74        MakeLogEnt
c100: 72 79 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20  ry(0);.         
c110: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
c120: 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30 5d 3d   }else if( z[0]=
c130: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
c140: 20 20 2f 2a 20 54 68 65 20 73 63 68 65 6d 65 20    /* The scheme 
c150: 61 6e 64 20 6e 65 74 77 6f 72 6b 20 6c 6f 63 61  and network loca
c160: 74 69 6f 6e 20 61 72 65 20 6d 69 73 73 69 6e 67  tion are missing
c170: 20 62 75 74 20 77 65 20 68 61 76 65 0a 20 20 20   but we have.   
c180: 20 20 20 20 20 20 20 2a 2a 20 61 6e 20 61 62 73         ** an abs
c190: 6f 6c 75 74 65 20 70 61 74 68 2e 20 2a 2f 0a 20  olute path. */. 
c1a0: 20 20 20 20 20 20 20 20 20 52 65 64 69 72 65 63           Redirec
c1b0: 74 28 7a 2c 20 30 29 3b 20 2f 2a 20 44 4b 20 2a  t(z, 0); /* DK *
c1c0: 2f 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  /.          brea
c1d0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
c1e0: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
c1f0: 20 73 65 65 20 69 66 20 74 68 65 72 65 20 69 73   see if there is
c200: 20 61 20 73 63 68 65 6d 65 20 70 72 65 66 69 78   a scheme prefix
c210: 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
c220: 69 3d 30 3b 20 7a 5b 69 5d 20 26 26 20 7a 5b 69  i=0; z[i] && z[i
c230: 5d 21 3d 27 3a 27 20 26 26 20 7a 5b 69 5d 21 3d  ]!=':' && z[i]!=
c240: 27 2f 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  '/'; i++){}.    
c250: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 3a      if( z[i]==':
c260: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ' ){.          /
c270: 2a 20 57 65 20 68 61 76 65 20 61 20 73 63 68 65  * We have a sche
c280: 6d 65 2e 20 20 41 73 73 75 6d 65 20 74 68 65 72  me.  Assume ther
c290: 65 20 69 73 20 61 6e 20 61 62 73 6f 6c 75 74 65  e is an absolute
c2a0: 20 55 52 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20   URL */.        
c2b0: 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28    StartResponse(
c2c0: 22 33 30 32 20 52 65 64 69 72 65 63 74 22 29 3b  "302 Redirect");
c2d0: 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20  .          nOut 
c2e0: 2b 3d 20 70 72 69 6e 74 66 28 22 4c 6f 63 61 74  += printf("Locat
c2f0: 69 6f 6e 3a 20 25 73 25 73 5c 72 5c 6e 22 2c 7a  ion: %s%s\r\n",z
c300: 2c 7a 51 75 65 72 79 53 75 66 66 69 78 29 3b 0a  ,zQuerySuffix);.
c310: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
c320: 20 2f 2a 20 44 4b 20 2a 2f 0a 20 20 20 20 20 20   /* DK */.      
c330: 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79      MakeLogEntry
c340: 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  (0);.          r
c350: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d  eturn;.        }
c360: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74  .        /* Must
c370: 20 62 65 20 61 20 72 65 6c 61 74 69 76 65 20 70   be a relative p
c380: 61 74 68 6e 61 6d 65 2e 20 20 43 6f 6e 73 74 72  athname.  Constr
c390: 75 63 74 20 74 68 65 20 61 62 73 6f 6c 75 74 65  uct the absolute
c3a0: 20 70 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20   pathname.      
c3b0: 20 20 2a 2a 20 61 6e 64 20 72 65 64 69 72 65 63    ** and redirec
c3c0: 74 20 74 6f 20 69 74 2e 20 2a 2f 0a 20 20 20 20  t to it. */.    
c3d0: 20 20 20 20 69 20 3d 20 73 74 72 6c 65 6e 28 7a      i = strlen(z
c3e0: 52 65 61 6c 53 63 72 69 70 74 29 3b 0a 20 20 20  RealScript);.   
c3f0: 20 20 20 20 20 77 68 69 6c 65 28 20 69 3e 30 20       while( i>0 
c400: 26 26 20 7a 52 65 61 6c 53 63 72 69 70 74 5b 69  && zRealScript[i
c410: 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 69 2d 2d 3b  -1]!='/' ){ i--;
c420: 20 7d 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65   }.        while
c430: 28 20 69 3e 30 20 26 26 20 7a 52 65 61 6c 53 63  ( i>0 && zRealSc
c440: 72 69 70 74 5b 69 2d 31 5d 3d 3d 27 2f 27 20 29  ript[i-1]=='/' )
c450: 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20  { i--; }.       
c460: 20 77 68 69 6c 65 28 20 2a 7a 3d 3d 27 2e 27 20   while( *z=='.' 
c470: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
c480: 20 7a 5b 31 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20   z[1]=='/' ){.  
c490: 20 20 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 32            z += 2
c4a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
c4b0: 65 20 69 66 28 20 7a 5b 31 5d 3d 3d 27 2e 27 20  e if( z[1]=='.' 
c4c0: 26 26 20 7a 5b 32 5d 3d 3d 27 2f 27 20 29 7b 0a  && z[2]=='/' ){.
c4d0: 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c              whil
c4e0: 65 28 20 69 3e 30 20 26 26 20 7a 52 65 61 6c 53  e( i>0 && zRealS
c4f0: 63 72 69 70 74 5b 69 2d 31 5d 21 3d 27 2f 27 20  cript[i-1]!='/' 
c500: 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ i--; }.      
c510: 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3e 30        while( i>0
c520: 20 26 26 20 7a 52 65 61 6c 53 63 72 69 70 74 5b   && zRealScript[
c530: 69 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 69 2d 2d  i-1]=='/' ){ i--
c540: 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ; }.            
c550: 7a 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20 20  z += 3;.        
c560: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c570: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c580: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c590: 7d 0a 20 20 20 20 20 20 20 20 53 74 61 72 74 52  }.        StartR
c5a0: 65 73 70 6f 6e 73 65 28 22 33 30 32 20 52 65 64  esponse("302 Red
c5b0: 69 72 65 63 74 22 29 3b 0a 20 20 20 20 20 20 20  irect");.       
c5c0: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
c5d0: 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73 3a 2f 2f  "Location: %s://
c5e0: 25 73 22 2c 7a 48 74 74 70 2c 7a 53 65 72 76 65  %s",zHttp,zServe
c5f0: 72 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  rName);.        
c600: 69 66 28 20 73 74 72 63 6d 70 28 7a 53 65 72 76  if( strcmp(zServ
c610: 65 72 50 6f 72 74 2c 22 38 30 22 29 20 29 7b 0a  erPort,"80") ){.
c620: 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20 2b            nOut +
c630: 3d 20 70 72 69 6e 74 66 28 22 3a 25 73 22 2c 7a  = printf(":%s",z
c640: 53 65 72 76 65 72 50 6f 72 74 29 3b 0a 20 20 20  ServerPort);.   
c650: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
c660: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 25  Out += printf("%
c670: 2e 2a 73 2f 25 73 25 73 5c 72 5c 6e 5c 72 5c 6e  .*s/%s%s\r\n\r\n
c680: 22 2c 69 2c 7a 52 65 61 6c 53 63 72 69 70 74 2c  ",i,zRealScript,
c690: 7a 2c 7a 51 75 65 72 79 53 75 66 66 69 78 29 3b  z,zQuerySuffix);
c6a0: 0a 20 20 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67  .        MakeLog
c6b0: 45 6e 74 72 79 28 30 29 3b 0a 20 20 20 20 20 20  Entry(0);.      
c6c0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
c6d0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d  }else if( strncm
c6e0: 70 28 7a 4c 69 6e 65 2c 22 53 74 61 74 75 73 3a  p(zLine,"Status:
c6f0: 22 2c 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ",7)==0 ){.     
c700: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
c710: 20 20 66 6f 72 28 69 3d 37 3b 20 69 73 73 70 61    for(i=7; isspa
c720: 63 65 28 7a 4c 69 6e 65 5b 69 5d 29 3b 20 69 2b  ce(zLine[i]); i+
c730: 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 6e 4f 75  +){}.        nOu
c740: 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 25 73 20  t += printf("%s 
c750: 25 73 22 2c 20 7a 50 72 6f 74 6f 63 6f 6c 2c 20  %s", zProtocol, 
c760: 26 7a 4c 69 6e 65 5b 69 5d 29 3b 0a 20 20 20 20  &zLine[i]);.    
c770: 20 20 20 20 73 74 72 6e 63 70 79 28 7a 52 65 70      strncpy(zRep
c780: 6c 79 53 74 61 74 75 73 2c 20 26 7a 4c 69 6e 65  lyStatus, &zLine
c790: 5b 69 5d 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  [i], 3);.       
c7a0: 20 7a 52 65 70 6c 79 53 74 61 74 75 73 5b 33 5d   zReplyStatus[3]
c7b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 74   = 0;.        st
c7c0: 61 74 75 73 53 65 6e 74 20 3d 20 31 3b 0a 20 20  atusSent = 1;.  
c7d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c7e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c7f0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
c800: 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22   StartResponse("
c810: 32 30 30 20 4f 4b 22 29 3b 0a 20 20 20 20 20 20  200 OK");.      
c820: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
c830: 28 22 25 73 22 2c 7a 4c 69 6e 65 29 3b 0a 20 20  ("%s",zLine);.  
c840: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a        for(i=0; z
c850: 4c 69 6e 65 5b 69 5d 20 26 26 20 21 69 73 73 70  Line[i] && !issp
c860: 61 63 65 28 7a 4c 69 6e 65 5b 69 5d 29 20 26 26  ace(zLine[i]) &&
c870: 20 7a 4c 69 6e 65 5b 69 5d 21 3d 27 3a 27 3b 20   zLine[i]!=':'; 
c880: 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 69  i++){}.        i
c890: 66 28 20 69 3c 32 20 7c 7c 20 7a 4c 69 6e 65 5b  f( i<2 || zLine[
c8a0: 69 5d 21 3d 27 3a 27 20 29 20 62 72 65 61 6b 3b  i]!=':' ) break;
c8b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
c8c0: 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 76 65 72      /* Copy ever
c8d0: 79 74 68 69 6e 67 20 65 6c 73 65 20 74 68 72 75  ything else thru
c8e0: 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 65 20   without change 
c8f0: 6f 72 20 61 6e 61 6c 79 73 69 73 2e 0a 20 20 20  or analysis..   
c900: 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 65 54   */.    if( useT
c910: 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d 28 36  imeout ) alarm(6
c920: 30 2a 35 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  0*5);.    while(
c930: 20 28 63 20 3d 20 67 65 74 63 28 69 6e 29 29 21   (c = getc(in))!
c940: 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20 20 70 75  =EOF ){.      pu
c950: 74 63 28 63 2c 73 74 64 6f 75 74 29 3b 0a 20 20  tc(c,stdout);.  
c960: 20 20 20 20 6e 4f 75 74 2b 2b 3b 0a 20 20 20 20      nOut++;.    
c970: 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29  }.    fclose(in)
c980: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63 6f  ;.  }else if( co
c990: 75 6e 74 53 6c 61 73 68 65 73 28 7a 52 65 61 6c  untSlashes(zReal
c9a0: 53 63 72 69 70 74 29 21 3d 63 6f 75 6e 74 53 6c  Script)!=countSl
c9b0: 61 73 68 65 73 28 7a 53 63 72 69 70 74 29 20 29  ashes(zScript) )
c9c0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 55 52 49  {.    /* The URI
c9d0: 20 72 65 66 65 72 73 20 74 6f 20 61 20 6e 6f 6e   refers to a non
c9e0: 2d 65 78 65 63 75 74 61 62 6c 65 20 66 69 6c 65  -executable file
c9f0: 20 73 6f 20 69 74 20 69 73 20 73 74 61 74 69 63   so it is static
ca00: 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74 0a 20   content.  But. 
ca10: 20 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20     ** there are 
ca20: 65 78 74 72 61 20 74 65 72 6d 73 20 69 6e 20 74  extra terms in t
ca30: 68 65 20 55 52 49 20 70 61 73 74 20 74 68 65 20  he URI past the 
ca40: 65 6e 64 20 6f 66 20 74 68 65 20 63 6f 6e 74 65  end of the conte
ca50: 6e 74 2e 20 20 57 65 20 6e 65 65 64 0a 20 20 20  nt.  We need.   
ca60: 20 2a 2a 20 74 6f 20 72 65 64 69 72 65 63 74 65   ** to redirecte
ca70: 64 20 74 6f 20 74 68 61 74 20 72 65 6c 61 74 69  d to that relati
ca80: 76 65 20 55 52 4c 73 20 69 6e 20 74 68 65 20 63  ve URLs in the c
ca90: 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 62 65 20 72  ontent will be r
caa0: 69 67 68 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ight..    */.   
cab0: 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22   StartResponse("
cac0: 33 30 31 20 4d 6f 76 65 64 20 50 65 72 6d 61 6e  301 Moved Perman
cad0: 65 6e 74 6c 79 22 29 3b 0a 20 20 20 20 69 66 28  ently");.    if(
cae0: 20 7a 53 65 72 76 65 72 50 6f 72 74 3d 3d 30 20   zServerPort==0 
caf0: 7c 7c 20 7a 53 65 72 76 65 72 50 6f 72 74 5b 30  || zServerPort[0
cb00: 5d 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a  ]==0 || strcmp(z
cb10: 53 65 72 76 65 72 50 6f 72 74 2c 22 38 30 22 29  ServerPort,"80")
cb20: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 4f 75  ==0 ){.      nOu
cb30: 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 4c 6f 63  t += printf("Loc
cb40: 61 74 69 6f 6e 3a 20 25 73 3a 2f 2f 25 73 25 73  ation: %s://%s%s
cb50: 5c 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  \r\n",.         
cb60: 20 20 20 20 20 20 20 20 20 20 20 20 7a 48 74 74              zHtt
cb70: 70 2c 20 7a 53 65 72 76 65 72 4e 61 6d 65 2c 20  p, zServerName, 
cb80: 7a 52 65 61 6c 53 63 72 69 70 74 29 3b 0a 20 20  zRealScript);.  
cb90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
cba0: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 4c  Out += printf("L
cbb0: 6f 63 61 74 69 6f 6e 3a 20 25 73 3a 2f 2f 25 73  ocation: %s://%s
cbc0: 3a 25 73 25 73 5c 72 5c 6e 22 2c 0a 20 20 20 20  :%s%s\r\n",.    
cbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbe0: 20 7a 48 74 74 70 2c 20 7a 53 65 72 76 65 72 4e   zHttp, zServerN
cbf0: 61 6d 65 2c 20 7a 53 65 72 76 65 72 50 6f 72 74  ame, zServerPort
cc00: 2c 20 7a 52 65 61 6c 53 63 72 69 70 74 29 3b 0a  , zRealScript);.
cc10: 20 20 20 20 7d 0a 20 20 20 20 6e 4f 75 74 20 2b      }.    nOut +
cc20: 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 74 65 6e  = printf("Conten
cc30: 74 2d 6c 65 6e 67 74 68 3a 20 30 5c 72 5c 6e 22  t-length: 0\r\n"
cc40: 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70  );.    nOut += p
cc50: 72 69 6e 74 66 28 22 5c 72 5c 6e 22 29 3b 0a 20  rintf("\r\n");. 
cc60: 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28     MakeLogEntry(
cc70: 30 29 3b 0a 20 20 20 20 66 66 6c 75 73 68 28 73  0);.    fflush(s
cc80: 74 64 6f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  tdout);.  }else{
cc90: 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73  .    /* If it is
cca0: 6e 27 74 20 65 78 65 63 75 74 61 62 6c 65 20 74  n't executable t
ccb0: 68 65 6e 20 69 74 0a 20 20 20 20 2a 2a 20 6d 75  hen it.    ** mu
ccc0: 73 74 20 61 20 73 69 6d 70 6c 65 20 66 69 6c 65  st a simple file
ccd0: 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
cce0: 65 20 63 6f 70 69 65 64 20 74 6f 20 6f 75 74 70  e copied to outp
ccf0: 75 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ut..    */.    c
cd00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6e 74  onst char *zCont
cd10: 65 6e 74 54 79 70 65 20 3d 20 47 65 74 4d 69 6d  entType = GetMim
cd20: 65 54 79 70 65 28 7a 46 69 6c 65 2c 20 6c 65 6e  eType(zFile, len
cd30: 46 69 6c 65 29 3b 0a 0a 20 20 20 20 69 66 28 20  File);..    if( 
cd40: 7a 54 6d 70 4e 61 6d 20 29 20 75 6e 6c 69 6e 6b  zTmpNam ) unlink
cd50: 28 7a 54 6d 70 4e 61 6d 29 3b 0a 20 20 20 20 69  (zTmpNam);.    i
cd60: 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c  n = fopen(zFile,
cd70: 22 72 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e  "r");.    if( in
cd80: 3d 3d 30 20 29 20 4e 6f 74 46 6f 75 6e 64 28 5f  ==0 ) NotFound(_
cd90: 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 53 74  _LINE__);.    St
cda0: 61 72 74 52 65 73 70 6f 6e 73 65 28 22 32 30 30  artResponse("200
cdb0: 20 4f 4b 22 29 3b 0a 20 20 20 20 6e 4f 75 74 20   OK");.    nOut 
cdc0: 2b 3d 20 44 61 74 65 54 61 67 28 22 4c 61 73 74  += DateTag("Last
cdd0: 2d 4d 6f 64 69 66 69 65 64 22 2c 20 73 74 61 74  -Modified", stat
cde0: 62 75 66 2e 73 74 5f 6d 74 69 6d 65 29 3b 0a 20  buf.st_mtime);. 
cdf0: 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74     nOut += print
ce00: 66 28 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a  f("Content-type:
ce10: 20 25 73 5c 72 5c 6e 22 2c 7a 43 6f 6e 74 65 6e   %s\r\n",zConten
ce20: 74 54 79 70 65 29 3b 0a 20 20 20 20 6e 4f 75 74  tType);.    nOut
ce30: 20 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 74   += printf("Cont
ce40: 65 6e 74 2d 6c 65 6e 67 74 68 3a 20 25 64 5c 72  ent-length: %d\r
ce50: 5c 6e 5c 72 5c 6e 22 2c 28 69 6e 74 29 73 74 61  \n\r\n",(int)sta
ce60: 74 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 20  tbuf.st_size);. 
ce70: 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74     fflush(stdout
ce80: 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  );.    if( strcm
ce90: 70 28 7a 4d 65 74 68 6f 64 2c 22 48 45 41 44 22  p(zMethod,"HEAD"
cea0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4d 61  )==0 ){.      Ma
ceb0: 6b 65 4c 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20  keLogEntry(0);. 
cec0: 20 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b       fclose(in);
ced0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
cee0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65     }.    if( use
cef0: 54 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d 28  Timeout ) alarm(
cf00: 33 30 20 2b 20 73 74 61 74 62 75 66 2e 73 74 5f  30 + statbuf.st_
cf10: 73 69 7a 65 2f 31 30 30 30 29 3b 0a 23 69 66 64  size/1000);.#ifd
cf20: 65 66 20 6c 69 6e 75 78 0a 20 20 20 20 7b 0a 20  ef linux.    {. 
cf30: 20 20 20 20 20 6f 66 66 5f 74 20 6f 66 66 73 65       off_t offse
cf40: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 4f 75  t = 0;.      nOu
cf50: 74 20 2b 3d 20 73 65 6e 64 66 69 6c 65 28 66 69  t += sendfile(fi
cf60: 6c 65 6e 6f 28 73 74 64 6f 75 74 29 2c 20 66 69  leno(stdout), fi
cf70: 6c 65 6e 6f 28 69 6e 29 2c 20 26 6f 66 66 73 65  leno(in), &offse
cf80: 74 2c 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69  t, statbuf.st_si
cf90: 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65  ze);.    }.#else
cfa0: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d  .    while( (c =
cfb0: 20 67 65 74 63 28 69 6e 29 29 21 3d 45 4f 46 20   getc(in))!=EOF 
cfc0: 29 7b 0a 20 20 20 20 20 20 70 75 74 63 28 63 2c  ){.      putc(c,
cfd0: 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 6e  stdout);.      n
cfe0: 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e  Out++;.    }.#en
cff0: 64 69 66 0a 20 20 20 20 66 63 6c 6f 73 65 28 69  dif.    fclose(i
d000: 6e 29 3b 0a 20 20 7d 0a 20 20 66 66 6c 75 73 68  n);.  }.  fflush
d010: 28 73 74 64 6f 75 74 29 3b 0a 20 20 4d 61 6b 65  (stdout);.  Make
d020: 4c 6f 67 45 6e 74 72 79 28 30 29 3b 0a 0a 20 20  LogEntry(0);..  
d030: 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 65 71 75  /* The next requ
d040: 65 73 74 20 6d 75 73 74 20 61 72 72 69 76 65 20  est must arrive 
d050: 77 69 74 68 69 6e 20 33 30 20 73 65 63 6f 6e 64  within 30 second
d060: 73 20 6f 72 20 77 65 20 63 6c 6f 73 65 20 74 68  s or we close th
d070: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 2a  e connection.  *
d080: 2f 0a 20 20 6f 6d 69 74 4c 6f 67 20 3d 20 31 3b  /.  omitLog = 1;
d090: 0a 20 20 69 66 28 20 75 73 65 54 69 6d 65 6f 75  .  if( useTimeou
d0a0: 74 20 29 20 61 6c 61 72 6d 28 33 30 29 3b 0a 7d  t ) alarm(30);.}
d0b0: 0a 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41  ..#define MAX_PA
d0c0: 52 41 4c 4c 45 4c 20 35 30 20 20 2f 2a 20 4e 75  RALLEL 50  /* Nu
d0d0: 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e  mber of simultan
d0e0: 65 6f 75 73 20 63 68 69 6c 64 72 65 6e 20 2a 2f  eous children */
d0f0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 70 6f 73 73  ../*.** All poss
d100: 69 62 6c 65 20 66 6f 72 6d 73 20 6f 66 20 61 6e  ible forms of an
d110: 20 49 50 20 61 64 64 72 65 73 73 2e 20 20 4e 65   IP address.  Ne
d120: 65 64 65 64 20 74 6f 20 77 6f 72 6b 20 61 72 6f  eded to work aro
d130: 75 6e 64 20 47 43 43 20 73 74 72 69 63 74 0a 2a  und GCC strict.*
d140: 2a 20 61 6c 69 61 73 69 6e 67 20 72 75 6c 65 73  * aliasing rules
d150: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 75 6e 69  ..*/.typedef uni
d160: 6f 6e 20 7b 0a 20 20 73 74 72 75 63 74 20 73 6f  on {.  struct so
d170: 63 6b 61 64 64 72 20 73 61 3b 20 20 20 20 20 20  ckaddr sa;      
d180: 20 20 20 20 20 20 20 20 2f 2a 20 41 62 73 74 72          /* Abstr
d190: 61 63 74 20 73 75 70 65 72 63 6c 61 73 73 20 2a  act superclass *
d1a0: 2f 0a 20 20 73 74 72 75 63 74 20 73 6f 63 6b 61  /.  struct socka
d1b0: 64 64 72 5f 69 6e 20 73 61 34 3b 20 20 20 20 20  ddr_in sa4;     
d1c0: 20 20 20 20 20 2f 2a 20 49 50 76 34 20 2a 2f 0a       /* IPv4 */.
d1d0: 20 20 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64    struct sockadd
d1e0: 72 5f 69 6e 36 20 73 61 36 3b 20 20 20 20 20 20  r_in6 sa6;      
d1f0: 20 20 20 2f 2a 20 49 50 76 36 20 2a 2f 0a 20 20     /* IPv6 */.  
d200: 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f  struct sockaddr_
d210: 73 74 6f 72 61 67 65 20 73 61 73 3b 20 20 20 20  storage sas;    
d220: 20 2f 2a 20 53 68 6f 75 6c 64 20 62 65 20 74 68   /* Should be th
d230: 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65  e maximum of the
d240: 20 61 62 6f 76 65 20 33 20 2a 2f 0a 7d 20 61 64   above 3 */.} ad
d250: 64 72 65 73 73 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d  dress;../*.** Im
d260: 70 6c 65 6d 65 6e 74 20 61 6e 20 48 54 54 50 20  plement an HTTP 
d270: 73 65 72 76 65 72 20 64 61 65 6d 6f 6e 20 6c 69  server daemon li
d280: 73 74 65 6e 69 6e 67 20 6f 6e 20 70 6f 72 74 20  stening on port 
d290: 69 50 6f 72 74 2e 0a 2a 2a 0a 2a 2a 20 41 73 20  iPort..**.** As 
d2a0: 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  new connections 
d2b0: 61 72 72 69 76 65 2c 20 66 6f 72 6b 20 61 20 63  arrive, fork a c
d2c0: 68 69 6c 64 20 61 6e 64 20 6c 65 74 20 63 68 69  hild and let chi
d2d0: 6c 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6f 75 74  ld return.** out
d2e0: 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75   of this procedu
d2f0: 72 65 20 63 61 6c 6c 2e 20 20 54 68 65 20 63 68  re call.  The ch
d300: 69 6c 64 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20  ild will handle 
d310: 74 68 65 20 72 65 71 75 65 73 74 2e 0a 2a 2a 20  the request..** 
d320: 54 68 65 20 70 61 72 65 6e 74 20 6e 65 76 65 72  The parent never
d330: 20 72 65 74 75 72 6e 73 20 66 72 6f 6d 20 74 68   returns from th
d340: 69 73 20 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2a  is procedure..**
d350: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 74 6f 20  .** Return 0 to 
d360: 65 61 63 68 20 63 68 69 6c 64 20 61 73 20 69 74  each child as it
d370: 20 72 75 6e 73 2e 20 20 49 66 20 75 6e 61 62 6c   runs.  If unabl
d380: 65 20 74 6f 20 65 73 74 61 62 6c 69 73 68 20 61  e to establish a
d390: 0a 2a 2a 20 6c 69 73 74 65 6e 69 6e 67 20 73 6f  .** listening so
d3a0: 63 6b 65 74 2c 20 72 65 74 75 72 6e 20 6e 6f 6e  cket, return non
d3b0: 2d 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 68 74  -zero..*/.int ht
d3c0: 74 70 5f 73 65 72 76 65 72 28 63 6f 6e 73 74 20  tp_server(const 
d3d0: 63 68 61 72 20 2a 7a 50 6f 72 74 2c 20 69 6e 74  char *zPort, int
d3e0: 20 6c 6f 63 61 6c 4f 6e 6c 79 29 7b 0a 20 20 69   localOnly){.  i
d3f0: 6e 74 20 6c 69 73 74 65 6e 65 72 5b 32 30 5d 3b  nt listener[20];
d400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
d410: 68 65 20 73 65 72 76 65 72 20 73 6f 63 6b 65 74  he server socket
d420: 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 6e 65  s */.  int conne
d430: 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  ction;          
d440: 20 20 20 20 2f 2a 20 41 20 73 6f 63 6b 65 74 20      /* A socket 
d450: 66 6f 72 20 65 61 63 68 20 69 6e 64 69 76 69 64  for each individ
d460: 75 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ual connection *
d470: 2f 0a 20 20 66 64 5f 73 65 74 20 72 65 61 64 66  /.  fd_set readf
d480: 64 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ds;             
d490: 20 2f 2a 20 53 65 74 20 6f 66 20 66 69 6c 65 20   /* Set of file 
d4a0: 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20  descriptors for 
d4b0: 73 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 61 64  select() */.  ad
d4c0: 64 72 65 73 73 20 69 6e 61 64 64 72 3b 20 20 20  dress inaddr;   
d4d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
d4e0: 6d 6f 74 65 20 61 64 64 72 65 73 73 20 2a 2f 0a  mote address */.
d4f0: 20 20 73 6f 63 6b 6c 65 6e 5f 74 20 6c 65 6e 61    socklen_t lena
d500: 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ddr;           /
d510: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  * Length of the 
d520: 69 6e 61 64 64 72 20 73 74 72 75 63 74 75 72 65  inaddr structure
d530: 20 2a 2f 0a 20 20 69 6e 74 20 63 68 69 6c 64 3b   */.  int child;
d540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d550: 20 20 20 2f 2a 20 50 49 44 20 6f 66 20 74 68 65     /* PID of the
d560: 20 63 68 69 6c 64 20 70 72 6f 63 65 73 73 20 2a   child process *
d570: 2f 0a 20 20 69 6e 74 20 6e 63 68 69 6c 64 72 65  /.  int nchildre
d580: 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
d590: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
d5a0: 69 6c 64 20 70 72 6f 63 65 73 73 65 73 20 2a 2f  ild processes */
d5b0: 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61  .  struct timeva
d5c0: 6c 20 64 65 6c 61 79 3b 20 20 20 20 20 20 20 20  l delay;        
d5d0: 2f 2a 20 48 6f 77 20 6c 6f 6e 67 20 74 6f 20 77  /* How long to w
d5e0: 61 69 74 20 69 6e 73 69 64 65 20 73 65 6c 65 63  ait inside selec
d5f0: 74 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 74  t() */.  int opt
d600: 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
d610: 20 20 20 20 20 20 2f 2a 20 73 65 74 73 6f 63 6b        /* setsock
d620: 6f 70 74 20 66 6c 61 67 20 2a 2f 0a 20 20 73 74  opt flag */.  st
d630: 72 75 63 74 20 61 64 64 72 69 6e 66 6f 20 73 48  ruct addrinfo sH
d640: 69 6e 74 73 3b 20 20 20 20 20 20 2f 2a 20 41 64  ints;      /* Ad
d650: 64 72 65 73 73 20 68 69 6e 74 73 20 2a 2f 0a 20  dress hints */. 
d660: 20 73 74 72 75 63 74 20 61 64 64 72 69 6e 66 6f   struct addrinfo
d670: 20 2a 70 41 64 64 72 73 2c 20 2a 70 3b 20 2f 2a   *pAddrs, *p; /*
d680: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
d690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6a0: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
d6b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6e 3b  e */.  int i, n;
d6c0: 0a 20 20 69 6e 74 20 6d 61 78 46 64 20 3d 20 2d  .  int maxFd = -
d6d0: 31 3b 0a 20 20 0a 20 20 6d 65 6d 73 65 74 28 26  1;.  .  memset(&
d6e0: 73 48 69 6e 74 73 2c 20 30 2c 20 73 69 7a 65 6f  sHints, 0, sizeo
d6f0: 66 28 73 48 69 6e 74 73 29 29 3b 0a 20 20 69 66  f(sHints));.  if
d700: 28 20 69 70 76 34 4f 6e 6c 79 20 29 7b 0a 20 20  ( ipv4Only ){.  
d710: 20 20 73 48 69 6e 74 73 2e 61 69 5f 66 61 6d 69    sHints.ai_fami
d720: 6c 79 20 3d 20 50 46 5f 49 4e 45 54 3b 0a 20 20  ly = PF_INET;.  
d730: 20 20 2f 2a 70 72 69 6e 74 66 28 22 69 70 76 34    /*printf("ipv4
d740: 20 6f 6e 6c 79 5c 6e 22 29 3b 2a 2f 0a 20 20 7d   only\n");*/.  }
d750: 65 6c 73 65 20 69 66 28 20 69 70 76 36 4f 6e 6c  else if( ipv6Onl
d760: 79 20 29 7b 0a 20 20 20 20 73 48 69 6e 74 73 2e  y ){.    sHints.
d770: 61 69 5f 66 61 6d 69 6c 79 20 3d 20 50 46 5f 49  ai_family = PF_I
d780: 4e 45 54 36 3b 0a 20 20 20 20 2f 2a 70 72 69 6e  NET6;.    /*prin
d790: 74 66 28 22 69 70 76 36 20 6f 6e 6c 79 5c 6e 22  tf("ipv6 only\n"
d7a0: 29 3b 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  );*/.  }else{.  
d7b0: 20 20 73 48 69 6e 74 73 2e 61 69 5f 66 61 6d 69    sHints.ai_fami
d7c0: 6c 79 20 3d 20 50 46 5f 55 4e 53 50 45 43 3b 0a  ly = PF_UNSPEC;.
d7d0: 20 20 7d 0a 20 20 73 48 69 6e 74 73 2e 61 69 5f    }.  sHints.ai_
d7e0: 73 6f 63 6b 74 79 70 65 20 3d 20 53 4f 43 4b 5f  socktype = SOCK_
d7f0: 53 54 52 45 41 4d 3b 0a 20 20 73 48 69 6e 74 73  STREAM;.  sHints
d800: 2e 61 69 5f 66 6c 61 67 73 20 3d 20 41 49 5f 50  .ai_flags = AI_P
d810: 41 53 53 49 56 45 3b 0a 20 20 73 48 69 6e 74 73  ASSIVE;.  sHints
d820: 2e 61 69 5f 70 72 6f 74 6f 63 6f 6c 20 3d 20 30  .ai_protocol = 0
d830: 3b 0a 20 20 72 63 20 3d 20 67 65 74 61 64 64 72  ;.  rc = getaddr
d840: 69 6e 66 6f 28 6c 6f 63 61 6c 4f 6e 6c 79 20 3f  info(localOnly ?
d850: 20 22 6c 6f 63 61 6c 68 6f 73 74 22 3a 20 30 2c   "localhost": 0,
d860: 20 7a 50 6f 72 74 2c 20 26 73 48 69 6e 74 73 2c   zPort, &sHints,
d870: 20 26 70 41 64 64 72 73 29 3b 0a 20 20 69 66 28   &pAddrs);.  if(
d880: 20 72 63 20 29 7b 0a 20 20 20 20 66 70 72 69 6e   rc ){.    fprin
d890: 74 66 28 73 74 64 65 72 72 2c 20 22 63 6f 75 6c  tf(stderr, "coul
d8a0: 64 20 6e 6f 74 20 67 65 74 20 61 64 64 72 20 69  d not get addr i
d8b0: 6e 66 6f 3a 20 25 73 22 2c 20 0a 20 20 20 20 20  nfo: %s", .     
d8c0: 20 20 20 20 20 20 20 72 63 21 3d 45 41 49 5f 53         rc!=EAI_S
d8d0: 59 53 54 45 4d 20 3f 20 67 61 69 5f 73 74 72 65  YSTEM ? gai_stre
d8e0: 72 72 6f 72 28 72 63 29 20 3a 20 73 74 72 65 72  rror(rc) : strer
d8f0: 72 6f 72 28 65 72 72 6e 6f 29 29 3b 0a 20 20 20  ror(errno));.   
d900: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
d910: 20 66 6f 72 28 6e 3d 30 2c 20 70 3d 70 41 64 64   for(n=0, p=pAdd
d920: 72 73 3b 20 6e 3c 28 69 6e 74 29 28 73 69 7a 65  rs; n<(int)(size
d930: 6f 66 28 6c 69 73 74 65 6e 65 72 29 2f 73 69 7a  of(listener)/siz
d940: 65 6f 66 28 6c 69 73 74 65 6e 65 72 5b 30 5d 29  eof(listener[0])
d950: 29 20 26 26 20 70 21 3d 30 3b 0a 20 20 20 20 20  ) && p!=0;.     
d960: 20 20 20 70 3d 70 2d 3e 61 69 5f 6e 65 78 74 29     p=p->ai_next)
d970: 7b 0a 20 20 20 20 6c 69 73 74 65 6e 65 72 5b 6e  {.    listener[n
d980: 5d 20 3d 20 73 6f 63 6b 65 74 28 70 2d 3e 61 69  ] = socket(p->ai
d990: 5f 66 61 6d 69 6c 79 2c 20 70 2d 3e 61 69 5f 73  _family, p->ai_s
d9a0: 6f 63 6b 74 79 70 65 2c 20 70 2d 3e 61 69 5f 70  ocktype, p->ai_p
d9b0: 72 6f 74 6f 63 6f 6c 29 3b 0a 20 20 20 20 69 66  rotocol);.    if
d9c0: 28 20 6c 69 73 74 65 6e 65 72 5b 6e 5d 3e 3d 30  ( listener[n]>=0
d9d0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20   ){.      /* if 
d9e0: 77 65 20 63 61 6e 27 74 20 74 65 72 6d 69 6e 61  we can't termina
d9f0: 74 65 20 6e 69 63 65 6c 79 2c 20 61 74 20 6c 65  te nicely, at le
da00: 61 73 74 20 61 6c 6c 6f 77 20 74 68 65 20 73 6f  ast allow the so
da10: 63 6b 65 74 20 74 6f 20 62 65 20 72 65 75 73 65  cket to be reuse
da20: 64 20 2a 2f 0a 20 20 20 20 20 20 73 65 74 73 6f  d */.      setso
da30: 63 6b 6f 70 74 28 6c 69 73 74 65 6e 65 72 5b 6e  ckopt(listener[n
da40: 5d 2c 20 53 4f 4c 5f 53 4f 43 4b 45 54 2c 20 53  ], SOL_SOCKET, S
da50: 4f 5f 52 45 55 53 45 41 44 44 52 2c 26 6f 70 74  O_REUSEADDR,&opt
da60: 2c 20 73 69 7a 65 6f 66 28 6f 70 74 29 29 3b 0a  , sizeof(opt));.
da70: 20 20 20 20 20 20 0a 23 69 66 20 64 65 66 69 6e        .#if defin
da80: 65 64 28 49 50 56 36 5f 56 36 4f 4e 4c 59 29 0a  ed(IPV6_V6ONLY).
da90: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 69 5f        if( p->ai_
daa0: 66 61 6d 69 6c 79 3d 3d 41 46 5f 49 4e 45 54 36  family==AF_INET6
dab0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
dac0: 76 36 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20  v6only = 1;.    
dad0: 20 20 20 20 73 65 74 73 6f 63 6b 6f 70 74 28 6c      setsockopt(l
dae0: 69 73 74 65 6e 65 72 5b 6e 5d 2c 20 49 50 50 52  istener[n], IPPR
daf0: 4f 54 4f 5f 49 50 56 36 2c 20 49 50 56 36 5f 56  OTO_IPV6, IPV6_V
db00: 36 4f 4e 4c 59 2c 0a 20 20 20 20 20 20 20 20 20  6ONLY,.         
db10: 20 20 20 20 20 20 20 20 20 20 20 26 76 36 6f 6e             &v6on
db20: 6c 79 2c 20 73 69 7a 65 6f 66 28 76 36 6f 6e 6c  ly, sizeof(v6onl
db30: 79 29 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  y));.      }.#en
db40: 64 69 66 0a 20 20 20 20 20 20 0a 20 20 20 20 20  dif.      .     
db50: 20 69 66 28 20 62 69 6e 64 28 6c 69 73 74 65 6e   if( bind(listen
db60: 65 72 5b 6e 5d 2c 20 70 2d 3e 61 69 5f 61 64 64  er[n], p->ai_add
db70: 72 2c 20 70 2d 3e 61 69 5f 61 64 64 72 6c 65 6e  r, p->ai_addrlen
db80: 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  )<0 ){.        p
db90: 72 69 6e 74 66 28 22 62 69 6e 64 20 66 61 69 6c  rintf("bind fail
dba0: 65 64 3a 20 25 73 5c 6e 22 2c 20 73 74 72 65 72  ed: %s\n", strer
dbb0: 72 6f 72 28 65 72 72 6e 6f 29 29 3b 0a 20 20 20  ror(errno));.   
dbc0: 20 20 20 20 20 63 6c 6f 73 65 28 6c 69 73 74 65       close(liste
dbd0: 6e 65 72 5b 6e 5d 29 3b 0a 20 20 20 20 20 20 20  ner[n]);.       
dbe0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
dbf0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6c 69 73   }.      if( lis
dc00: 74 65 6e 28 6c 69 73 74 65 6e 65 72 5b 6e 5d 2c  ten(listener[n],
dc10: 20 32 30 29 3c 30 20 29 7b 0a 20 20 20 20 20 20   20)<0 ){.      
dc20: 20 20 70 72 69 6e 74 66 28 22 6c 69 73 74 65 6e    printf("listen
dc30: 28 29 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22  () failed: %s\n"
dc40: 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f  , strerror(errno
dc50: 29 29 3b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73  ));.        clos
dc60: 65 28 6c 69 73 74 65 6e 65 72 5b 6e 5d 29 3b 0a  e(listener[n]);.
dc70: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
dc80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
dc90: 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n++;.    }.  }. 
dca0: 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
dcb0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
dcc0: 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 61 6e   "cannot open an
dcd0: 79 20 73 6f 63 6b 65 74 73 5c 6e 22 29 3b 0a 20  y sockets\n");. 
dce0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
dcf0: 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ..  while( 1 ){.
dd00: 20 20 20 20 69 66 28 20 6e 63 68 69 6c 64 72 65      if( nchildre
dd10: 6e 3e 4d 41 58 5f 50 41 52 41 4c 4c 45 4c 20 29  n>MAX_PARALLEL )
dd20: 7b 0a 20 20 20 20 20 20 2f 2a 20 53 6c 6f 77 20  {.      /* Slow 
dd30: 64 6f 77 6e 20 69 66 20 63 6f 6e 6e 65 63 74 69  down if connecti
dd40: 6f 6e 73 20 61 72 65 20 61 72 72 69 76 69 6e 67  ons are arriving
dd50: 20 74 6f 6f 20 66 61 73 74 20 2a 2f 0a 20 20 20   too fast */.   
dd60: 20 20 20 73 6c 65 65 70 28 20 6e 63 68 69 6c 64     sleep( nchild
dd70: 72 65 6e 2d 4d 41 58 5f 50 41 52 41 4c 4c 45 4c  ren-MAX_PARALLEL
dd80: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65   );.    }.    de
dd90: 6c 61 79 2e 74 76 5f 73 65 63 20 3d 20 36 30 3b  lay.tv_sec = 60;
dda0: 0a 20 20 20 20 64 65 6c 61 79 2e 74 76 5f 75 73  .    delay.tv_us
ddb0: 65 63 20 3d 20 30 3b 0a 20 20 20 20 46 44 5f 5a  ec = 0;.    FD_Z
ddc0: 45 52 4f 28 26 72 65 61 64 66 64 73 29 3b 0a 20  ERO(&readfds);. 
ddd0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b     for(i=0; i<n;
dde0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
ddf0: 65 72 74 28 20 6c 69 73 74 65 6e 65 72 5b 69 5d  ert( listener[i]
de00: 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 46 44 5f  >=0 );.      FD_
de10: 53 45 54 28 20 6c 69 73 74 65 6e 65 72 5b 69 5d  SET( listener[i]
de20: 2c 20 26 72 65 61 64 66 64 73 29 3b 0a 20 20 20  , &readfds);.   
de30: 20 20 20 69 66 28 20 6c 69 73 74 65 6e 65 72 5b     if( listener[
de40: 69 5d 3e 6d 61 78 46 64 20 29 20 6d 61 78 46 64  i]>maxFd ) maxFd
de50: 20 3d 20 6c 69 73 74 65 6e 65 72 5b 69 5d 3b 0a   = listener[i];.
de60: 20 20 20 20 7d 0a 20 20 20 20 73 65 6c 65 63 74      }.    select
de70: 28 20 6d 61 78 46 64 2b 31 2c 20 26 72 65 61 64  ( maxFd+1, &read
de80: 66 64 73 2c 20 30 2c 20 30 2c 20 26 64 65 6c 61  fds, 0, 0, &dela
de90: 79 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  y);.    for(i=0;
dea0: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
deb0: 20 20 69 66 28 20 46 44 5f 49 53 53 45 54 28 6c    if( FD_ISSET(l
dec0: 69 73 74 65 6e 65 72 5b 69 5d 2c 20 26 72 65 61  istener[i], &rea
ded0: 64 66 64 73 29 20 29 7b 0a 20 20 20 20 20 20 20  dfds) ){.       
dee0: 20 6c 65 6e 61 64 64 72 20 3d 20 73 69 7a 65 6f   lenaddr = sizeo
def0: 66 28 69 6e 61 64 64 72 29 3b 0a 20 20 20 20 20  f(inaddr);.     
df00: 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20     connection = 
df10: 61 63 63 65 70 74 28 6c 69 73 74 65 6e 65 72 5b  accept(listener[
df20: 69 5d 2c 20 26 69 6e 61 64 64 72 2e 73 61 2c 20  i], &inaddr.sa, 
df30: 26 6c 65 6e 61 64 64 72 29 3b 0a 20 20 20 20 20  &lenaddr);.     
df40: 20 20 20 69 66 28 20 63 6f 6e 6e 65 63 74 69 6f     if( connectio
df50: 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=0 ){.        
df60: 20 20 63 68 69 6c 64 20 3d 20 66 6f 72 6b 28 29    child = fork()
df70: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
df80: 63 68 69 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20  child!=0 ){.    
df90: 20 20 20 20 20 20 20 20 69 66 28 20 63 68 69 6c          if( chil
dfa0: 64 3e 30 20 29 20 6e 63 68 69 6c 64 72 65 6e 2b  d>0 ) nchildren+
dfb0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  +;.            c
dfc0: 6c 6f 73 65 28 63 6f 6e 6e 65 63 74 69 6f 6e 29  lose(connection)
dfd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;.            /*
dfe0: 20 70 72 69 6e 74 66 28 22 73 75 62 70 72 6f 63   printf("subproc
dff0: 65 73 73 20 25 64 20 73 74 61 72 74 65 64 2e 2e  ess %d started..
e000: 2e 5c 6e 22 2c 20 63 68 69 6c 64 29 3b 20 66 66  .\n", child); ff
e010: 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 20 2a 2f  lush(stdout); */
e020: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
e030: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
e040: 74 20 6e 45 72 72 20 3d 20 30 2c 20 66 64 3b 0a  t nErr = 0, fd;.
e050: 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73              clos
e060: 65 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(0);.          
e070: 20 20 66 64 20 3d 20 64 75 70 28 63 6f 6e 6e 65    fd = dup(conne
e080: 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20  ction);.        
e090: 20 20 20 20 69 66 28 20 66 64 21 3d 30 20 29 20      if( fd!=0 ) 
e0a0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
e0b0: 20 20 20 20 63 6c 6f 73 65 28 31 29 3b 0a 20 20      close(1);.  
e0c0: 20 20 20 20 20 20 20 20 20 20 66 64 20 3d 20 64            fd = d
e0d0: 75 70 28 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a  up(connection);.
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
e0f0: 66 64 21 3d 31 20 29 20 6e 45 72 72 2b 2b 3b 0a  fd!=1 ) nErr++;.
e100: 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73              clos
e110: 65 28 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20  e(connection);. 
e120: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
e130: 6e 20 6e 45 72 72 3b 0a 20 20 20 20 20 20 20 20  n nErr;.        
e140: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
e150: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 42      }.      /* B
e160: 75 72 79 20 64 65 61 64 20 63 68 69 6c 64 72 65  ury dead childre
e170: 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65  n */.      while
e180: 28 20 28 63 68 69 6c 64 20 3d 20 77 61 69 74 70  ( (child = waitp
e190: 69 64 28 30 2c 20 30 2c 20 57 4e 4f 48 41 4e 47  id(0, 0, WNOHANG
e1a0: 29 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ))>0 ){.        
e1b0: 2f 2a 20 70 72 69 6e 74 66 28 22 70 72 6f 63 65  /* printf("proce
e1c0: 73 73 20 25 64 20 65 6e 64 73 5c 6e 22 2c 20 63  ss %d ends\n", c
e1d0: 68 69 6c 64 29 3b 20 66 66 6c 75 73 68 28 73 74  hild); fflush(st
e1e0: 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 20 20 20 20  dout); */.      
e1f0: 20 20 6e 63 68 69 6c 64 72 65 6e 2d 2d 3b 0a 20    nchildren--;. 
e200: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
e210: 0a 20 20 2f 2a 20 4e 4f 54 20 52 45 41 43 48 45  .  /* NOT REACHE
e220: 44 20 2a 2f 20 20 0a 20 20 65 78 69 74 28 31 29  D */  .  exit(1)
e230: 3b 0a 7d 0a 0a 0a 69 6e 74 20 6d 61 69 6e 28 69  ;.}...int main(i
e240: 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a  nt argc, char **
e250: 61 72 67 76 29 7b 0a 20 20 69 6e 74 20 69 3b 20  argv){.  int i; 
e260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e270: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
e280: 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50  er */.  char *zP
e290: 65 72 6d 55 73 65 72 20 3d 20 30 3b 20 20 20 20  ermUser = 0;    
e2a0: 20 20 2f 2a 20 52 75 6e 20 64 61 65 6d 6f 6e 20    /* Run daemon 
e2b0: 77 69 74 68 20 74 68 69 73 20 75 73 65 72 27 73  with this user's
e2c0: 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 2a 2f 0a   permissions */.
e2d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
e2e0: 6f 72 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49  ort = 0;    /* I
e2f0: 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 48 54 54 50  mplement an HTTP
e300: 20 73 65 72 76 65 72 20 70 72 6f 63 65 73 73 20   server process 
e310: 2a 2f 0a 20 20 69 6e 74 20 75 73 65 43 68 72 6f  */.  int useChro
e320: 6f 74 4a 61 69 6c 20 3d 20 31 3b 20 20 20 20 2f  otJail = 1;    /
e330: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 61 20  * True to use a 
e340: 63 68 61 6e 67 65 2d 72 6f 6f 74 20 6a 61 69 6c  change-root jail
e350: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 70 61 73   */.  struct pas
e360: 73 77 64 20 2a 70 77 64 20 3d 20 30 3b 20 20 20  swd *pwd = 0;   
e370: 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
e380: 62 6f 75 74 20 74 68 65 20 75 73 65 72 20 2a 2f  bout the user */
e390: 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68  ..  /* Record th
e3a0: 65 20 74 69 6d 65 20 77 68 65 6e 20 70 72 6f 63  e time when proc
e3b0: 65 73 73 69 6e 67 20 62 65 67 69 6e 73 2e 0a 20  essing begins.. 
e3c0: 20 2a 2f 0a 20 20 67 65 74 74 69 6d 65 6f 66 64   */.  gettimeofd
e3d0: 61 79 28 26 62 65 67 69 6e 54 69 6d 65 2c 20 30  ay(&beginTime, 0
e3e0: 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 63  );..  /* Parse c
e3f0: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75  ommand-line argu
e400: 6d 65 6e 74 73 0a 20 20 2a 2f 0a 20 20 77 68 69  ments.  */.  whi
e410: 6c 65 28 20 61 72 67 63 3e 31 20 26 26 20 61 72  le( argc>1 && ar
e420: 67 76 5b 31 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b  gv[1][0]=='-' ){
e430: 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61  .    char *z = a
e440: 72 67 76 5b 31 5d 3b 0a 20 20 20 20 63 68 61 72  rgv[1];.    char
e450: 20 2a 7a 41 72 67 20 3d 20 61 72 67 63 3e 3d 33   *zArg = argc>=3
e460: 20 3f 20 61 72 67 76 5b 32 5d 20 3a 20 22 30 22   ? argv[2] : "0"
e470: 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d  ;.    if( z[0]==
e480: 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27  '-' && z[1]=='-'
e490: 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20   ) z++;.    if( 
e4a0: 73 74 72 63 6d 70 28 7a 2c 22 2d 75 73 65 72 22  strcmp(z,"-user"
e4b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 50  )==0 ){.      zP
e4c0: 65 72 6d 55 73 65 72 20 3d 20 7a 41 72 67 3b 0a  ermUser = zArg;.
e4d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
e4e0: 72 63 6d 70 28 7a 2c 22 2d 72 6f 6f 74 22 29 3d  rcmp(z,"-root")=
e4f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 52 6f 6f  =0 ){.      zRoo
e500: 74 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 7d 65  t = zArg;.    }e
e510: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
e520: 2c 22 2d 6c 6f 67 66 69 6c 65 22 29 3d 3d 30 20  ,"-logfile")==0 
e530: 29 7b 0a 20 20 20 20 20 20 7a 4c 6f 67 46 69 6c  ){.      zLogFil
e540: 65 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 7d 65  e = zArg;.    }e
e550: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
e560: 2c 22 2d 68 74 74 70 73 22 29 3d 3d 30 20 29 7b  ,"-https")==0 ){
e570: 0a 20 20 20 20 20 20 75 73 65 48 74 74 70 73 20  .      useHttps 
e580: 3d 20 61 74 6f 69 28 7a 41 72 67 29 3b 0a 20 20  = atoi(zArg);.  
e590: 20 20 20 20 7a 48 74 74 70 20 3d 20 75 73 65 48      zHttp = useH
e5a0: 74 74 70 73 20 3f 20 22 68 74 74 70 22 20 3a 20  ttps ? "http" : 
e5b0: 22 68 74 74 70 73 22 3b 0a 20 20 20 20 7d 65 6c  "https";.    }el
e5c0: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
e5d0: 20 22 2d 70 6f 72 74 22 29 3d 3d 30 20 29 7b 0a   "-port")==0 ){.
e5e0: 20 20 20 20 20 20 7a 50 6f 72 74 20 3d 20 7a 41        zPort = zA
e5f0: 72 67 3b 0a 20 20 20 20 20 20 73 74 61 6e 64 61  rg;.      standa
e600: 6c 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65  lone = 1;.    }e
e610: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
e620: 2c 20 22 2d 66 61 6d 69 6c 79 22 29 3d 3d 30 20  , "-family")==0 
e630: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
e640: 63 6d 70 28 7a 41 72 67 2c 20 22 69 70 76 34 22  cmp(zArg, "ipv4"
e650: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
e660: 69 70 76 34 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  ipv4Only = 1;.  
e670: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
e680: 72 63 6d 70 28 7a 41 72 67 2c 20 22 69 70 76 36  rcmp(zArg, "ipv6
e690: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
e6a0: 20 69 70 76 36 4f 6e 6c 79 20 3d 20 31 3b 0a 20   ipv6Only = 1;. 
e6b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e6c0: 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28      Malfunction(
e6d0: 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 75 6e 6b 6e 6f  __LINE__, "unkno
e6e0: 77 6e 20 49 50 20 70 72 6f 74 6f 63 6f 6c 3a 20  wn IP protocol: 
e6f0: 5b 25 73 5d 22 2c 20 7a 41 72 67 29 3b 0a 20 20  [%s]", zArg);.  
e700: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
e710: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d  if( strcmp(z, "-
e720: 6a 61 69 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20  jail")==0 ){.   
e730: 20 20 20 69 66 28 20 61 74 6f 69 28 7a 41 72 67     if( atoi(zArg
e740: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
e750: 75 73 65 43 68 72 6f 6f 74 4a 61 69 6c 20 3d 20  useChrootJail = 
e760: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
e770: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
e780: 7a 2c 20 22 2d 64 65 62 75 67 22 29 3d 3d 30 20  z, "-debug")==0 
e790: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 74 6f  ){.      if( ato
e7a0: 69 28 7a 41 72 67 29 20 29 7b 0a 20 20 20 20 20  i(zArg) ){.     
e7b0: 20 20 20 75 73 65 54 69 6d 65 6f 75 74 20 3d 20     useTimeout = 
e7c0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
e7d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d 61 6c 66  else{.      Malf
e7e0: 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f  unction(__LINE__
e7f0: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 61 72 67 75 6d  , "unknown argum
e800: 65 6e 74 3a 20 5b 25 73 5d 22 2c 20 7a 29 3b 0a  ent: [%s]", z);.
e810: 20 20 20 20 7d 0a 20 20 20 20 61 72 67 76 20 2b      }.    argv +
e820: 3d 20 32 3b 0a 20 20 20 20 61 72 67 63 20 2d 3d  = 2;.    argc -=
e830: 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 52   2;.  }.  if( zR
e840: 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  oot==0 ){.    if
e850: 28 20 73 74 61 6e 64 61 6c 6f 6e 65 20 29 7b 0a  ( standalone ){.
e860: 20 20 20 20 20 20 7a 52 6f 6f 74 20 3d 20 22 2e        zRoot = ".
e870: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ";.    }else{.  
e880: 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28      Malfunction(
e890: 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 6e 6f 20 2d 2d  __LINE__, "no --
e8a0: 72 6f 6f 74 20 73 70 65 63 69 66 69 65 64 22 29  root specified")
e8b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
e8c0: 20 2f 2a 20 43 68 61 6e 67 65 20 64 69 72 65 63   /* Change direc
e8d0: 74 6f 72 69 65 73 20 74 6f 20 74 68 65 20 72 6f  tories to the ro
e8e0: 6f 74 20 6f 66 20 74 68 65 20 48 54 54 50 20 66  ot of the HTTP f
e8f0: 69 6c 65 73 79 73 74 65 6d 2e 20 20 54 68 65 6e  ilesystem.  Then
e900: 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20 63  .  ** create a c
e910: 68 72 6f 6f 74 20 6a 61 69 6c 20 74 68 65 72 65  hroot jail there
e920: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 64  ..  */.  if( chd
e930: 69 72 28 7a 52 6f 6f 74 29 21 3d 30 20 29 7b 0a  ir(zRoot)!=0 ){.
e940: 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28      Malfunction(
e950: 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 63 61 6e 6e 6f  __LINE__, "canno
e960: 74 20 63 68 61 6e 67 65 20 74 6f 20 64 69 72 65  t change to dire
e970: 63 74 6f 72 79 20 5b 25 73 5d 22 2c 20 7a 52 6f  ctory [%s]", zRo
e980: 6f 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  ot);.  }..  /* G
e990: 65 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  et information a
e9a0: 62 6f 75 74 20 74 68 65 20 75 73 65 72 20 69 66  bout the user if
e9b0: 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
e9c0: 69 66 28 20 7a 50 65 72 6d 55 73 65 72 20 29 20  if( zPermUser ) 
e9d0: 70 77 64 20 3d 20 67 65 74 70 77 6e 61 6d 28 7a  pwd = getpwnam(z
e9e0: 50 65 72 6d 55 73 65 72 29 3b 0a 0a 20 20 2f 2a  PermUser);..  /*
e9f0: 20 45 6e 74 65 72 20 74 68 65 20 63 68 72 6f 6f   Enter the chroo
ea00: 74 20 6a 61 69 6c 20 69 66 20 72 65 71 75 65 73  t jail if reques
ea10: 74 65 64 20 2a 2f 20 20 0a 20 20 69 66 28 20 7a  ted */  .  if( z
ea20: 50 65 72 6d 55 73 65 72 20 26 26 20 75 73 65 43  PermUser && useC
ea30: 68 72 6f 6f 74 4a 61 69 6c 20 26 26 20 67 65 74  hrootJail && get
ea40: 75 69 64 28 29 3d 3d 30 20 29 7b 0a 20 20 20 20  uid()==0 ){.    
ea50: 69 66 28 20 63 68 72 6f 6f 74 28 22 2e 22 29 3c  if( chroot(".")<
ea60: 30 20 29 7b 0a 20 20 20 20 20 20 4d 61 6c 66 75  0 ){.      Malfu
ea70: 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c  nction(__LINE__,
ea80: 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 72 65 61   "unable to crea
ea90: 74 65 20 63 68 72 6f 6f 74 20 6a 61 69 6c 22 29  te chroot jail")
eaa0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
eab0: 20 20 20 7a 52 6f 6f 74 20 3d 20 22 22 3b 0a 20     zRoot = "";. 
eac0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
ead0: 63 74 69 76 61 74 65 20 74 68 65 20 73 65 72 76  ctivate the serv
eae0: 65 72 2c 20 69 66 20 72 65 71 75 65 73 74 65 64  er, if requested
eaf0: 20 2a 2f 0a 20 20 69 66 28 20 7a 50 6f 72 74 20   */.  if( zPort 
eb00: 26 26 20 68 74 74 70 5f 73 65 72 76 65 72 28 7a  && http_server(z
eb10: 50 6f 72 74 2c 20 30 29 20 29 7b 0a 20 20 20 20  Port, 0) ){.    
eb20: 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49  Malfunction(__LI
eb30: 4e 45 5f 5f 2c 20 22 66 61 69 6c 65 64 20 74 6f  NE__, "failed to
eb40: 20 73 74 61 72 74 20 73 65 72 76 65 72 22 29 3b   start server");
eb50: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 72 6f 70 20  .  }..  /* Drop 
eb60: 72 6f 6f 74 20 70 72 69 76 69 6c 65 67 65 73 2e  root privileges.
eb70: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 50 65 72  .  */.  if( zPer
eb80: 6d 55 73 65 72 20 29 7b 0a 20 20 20 20 69 66 28  mUser ){.    if(
eb90: 20 70 77 64 20 29 7b 0a 20 20 20 20 20 20 73 65   pwd ){.      se
eba0: 74 67 69 64 28 70 77 64 2d 3e 70 77 5f 67 69 64  tgid(pwd->pw_gid
ebb0: 29 3b 0a 20 20 20 20 20 20 73 65 74 75 69 64 28  );.      setuid(
ebc0: 70 77 64 2d 3e 70 77 5f 75 69 64 29 3b 0a 20 20  pwd->pw_uid);.  
ebd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d    }else{.      M
ebe0: 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e  alfunction(__LIN
ebf0: 45 5f 5f 2c 20 22 6e 6f 20 73 75 63 68 20 75 73  E__, "no such us
ec00: 65 72 20 5b 25 73 5d 22 2c 20 7a 50 65 72 6d 55  er [%s]", zPermU
ec10: 73 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ser);.    }.  }.
ec20: 20 20 69 66 28 20 67 65 74 75 69 64 28 29 3d 3d    if( getuid()==
ec30: 30 20 29 7b 0a 20 20 20 20 4d 61 6c 66 75 6e 63  0 ){.    Malfunc
ec40: 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22  tion(__LINE__, "
ec50: 63 61 6e 6e 6f 74 20 72 75 6e 20 61 73 20 72 6f  cannot run as ro
ec60: 6f 74 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ot");.  }..  /* 
ec70: 47 65 74 20 74 68 65 20 49 50 20 61 64 64 72 65  Get the IP addre
ec80: 73 73 20 66 72 6f 6d 20 77 68 65 6e 20 74 68 65  ss from when the
ec90: 20 72 65 71 75 65 73 74 20 6f 72 69 67 69 6e 61   request origina
eca0: 74 65 73 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20  tes.  */.  {.   
ecb0: 20 61 64 64 72 65 73 73 20 72 65 6d 6f 74 65 41   address remoteA
ecc0: 64 64 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  ddr;.    unsigne
ecd0: 64 20 69 6e 74 20 73 69 7a 65 20 3d 20 73 69 7a  d int size = siz
ece0: 65 6f 66 28 72 65 6d 6f 74 65 41 64 64 72 29 3b  eof(remoteAddr);
ecf0: 0a 20 20 20 20 63 68 61 72 20 7a 48 6f 73 74 5b  .    char zHost[
ed00: 4e 49 5f 4d 41 58 48 4f 53 54 5d 3b 0a 20 20 20  NI_MAXHOST];.   
ed10: 20 69 66 28 20 67 65 74 70 65 65 72 6e 61 6d 65   if( getpeername
ed20: 28 30 2c 20 26 72 65 6d 6f 74 65 41 64 64 72 2e  (0, &remoteAddr.
ed30: 73 61 2c 20 26 73 69 7a 65 29 3e 3d 30 20 29 7b  sa, &size)>=0 ){
ed40: 0a 20 20 20 20 20 20 67 65 74 6e 61 6d 65 69 6e  .      getnamein
ed50: 66 6f 28 26 72 65 6d 6f 74 65 41 64 64 72 2e 73  fo(&remoteAddr.s
ed60: 61 2c 20 73 69 7a 65 2c 20 7a 48 6f 73 74 2c 20  a, size, zHost, 
ed70: 73 69 7a 65 6f 66 28 7a 48 6f 73 74 29 2c 20 30  sizeof(zHost), 0
ed80: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
ed90: 20 20 20 20 20 20 20 4e 49 5f 4e 55 4d 45 52 49         NI_NUMERI
eda0: 43 48 4f 53 54 29 3b 0a 20 20 20 20 20 20 7a 52  CHOST);.      zR
edb0: 65 6d 6f 74 65 41 64 64 72 20 3d 20 53 74 72 44  emoteAddr = StrD
edc0: 75 70 28 7a 48 6f 73 74 29 3b 0a 20 20 20 20 7d  up(zHost);.    }
edd0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
ede0: 73 73 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  ss the input str
edf0: 65 61 6d 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  eam */.  for(i=0
ee00: 3b 20 69 3c 31 30 30 3b 20 69 2b 2b 29 7b 0a 20  ; i<100; i++){. 
ee10: 20 20 20 50 72 6f 63 65 73 73 4f 6e 65 52 65 71     ProcessOneReq
ee20: 75 65 73 74 28 30 29 3b 0a 20 20 7d 0a 20 20 50  uest(0);.  }.  P
ee30: 72 6f 63 65 73 73 4f 6e 65 52 65 71 75 65 73 74  rocessOneRequest
ee40: 28 31 29 3b 0a 20 20 65 78 69 74 28 30 29 3b 0a  (1);.  exit(0);.
ee50: 7d 0a                                            }.