Documentation Source Text

Hex Artifact Content
Login

Artifact 23292cdc05a983ced8d32ac7499c441bcd589c1e:


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 32 30 30 30 30 30 30 30  _LENGTH 20000000
0c70: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
0c80: 65 20 72 65 63 6f 72 64 20 6d 6f 73 74 20 6f 66  e record most of
0c90: 20 74 68 65 20 73 74 61 74 65 20 69 6e 66 6f 72   the state infor
0ca0: 6d 61 74 69 6f 6e 20 61 73 20 67 6c 6f 62 61 6c  mation as global
0cb0: 20 76 61 72 69 61 62 6c 65 73 2e 20 20 54 68 69   variables.  Thi
0cc0: 73 0a 2a 2a 20 73 61 76 65 73 20 68 61 76 69 6e  s.** saves havin
0cd0: 67 20 74 6f 20 70 61 73 73 20 69 6e 66 6f 72 6d  g to pass inform
0ce0: 61 74 69 6f 6e 20 74 6f 20 73 75 62 72 6f 75 74  ation to subrout
0cf0: 69 6e 65 73 20 61 73 20 70 61 72 61 6d 65 74 65  ines as paramete
0d00: 72 73 2c 20 61 6e 64 0a 2a 2a 20 6d 61 6b 65 73  rs, and.** makes
0d10: 20 74 68 65 20 65 78 65 63 75 74 61 62 6c 65 20   the executable 
0d20: 73 6d 61 6c 6c 65 72 2e 2e 2e 0a 2a 2f 0a 73 74  smaller....*/.st
0d30: 61 74 69 63 20 63 68 61 72 20 2a 7a 52 6f 6f 74  atic char *zRoot
0d40: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
0d50: 2a 20 52 6f 6f 74 20 64 69 72 65 63 74 6f 72 79  * Root directory
0d60: 20 6f 66 20 74 68 65 20 77 65 62 73 69 74 65 20   of the website 
0d70: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
0d80: 7a 54 6d 70 4e 61 6d 20 3d 20 30 3b 20 20 20 20  zTmpNam = 0;    
0d90: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61      /* Name of a
0da0: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
0db0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a  */.static char z
0dc0: 54 6d 70 4e 61 6d 42 75 66 5b 35 30 30 5d 3b 20  TmpNamBuf[500]; 
0dd0: 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20      /* Space to 
0de0: 68 6f 6c 64 20 74 68 65 20 74 65 6d 70 6f 72 61  hold the tempora
0df0: 72 79 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 73  ry filename */.s
0e00: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 50 72 6f  tatic char *zPro
0e10: 74 6f 63 6f 6c 20 3d 20 30 3b 20 20 20 20 20 20  tocol = 0;      
0e20: 2f 2a 20 54 68 65 20 70 72 6f 74 6f 63 6f 6c 20  /* The protocol 
0e30: 62 65 69 6e 67 20 75 73 69 6e 67 20 62 79 20 74  being using by t
0e40: 68 65 20 62 72 6f 77 73 65 72 20 2a 2f 0a 73 74  he browser */.st
0e50: 61 74 69 63 20 63 68 61 72 20 2a 7a 4d 65 74 68  atic char *zMeth
0e60: 6f 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  od = 0;        /
0e70: 2a 20 54 68 65 20 6d 65 74 68 6f 64 2e 20 20 4d  * The method.  M
0e80: 75 73 74 20 62 65 20 47 45 54 20 2a 2f 0a 73 74  ust be GET */.st
0e90: 61 74 69 63 20 63 68 61 72 20 2a 7a 53 63 72 69  atic char *zScri
0ea0: 70 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  pt = 0;        /
0eb0: 2a 20 54 68 65 20 6f 62 6a 65 63 74 20 74 6f 20  * The object to 
0ec0: 72 65 74 72 69 65 76 65 20 2a 2f 0a 73 74 61 74  retrieve */.stat
0ed0: 69 63 20 63 68 61 72 20 2a 7a 52 65 61 6c 53 63  ic char *zRealSc
0ee0: 72 69 70 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ript = 0;    /* 
0ef0: 54 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 72 65  The object to re
0f00: 74 72 69 65 76 65 2e 20 20 53 61 6d 65 20 61 73  trieve.  Same as
0f10: 20 7a 53 63 72 69 70 74 0a 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 20 2a 2a 20 65 78 63            ** exc
0f40: 65 70 74 20 6d 69 67 68 74 20 68 61 76 65 20 22  ept might have "
0f50: 2f 69 6e 64 65 78 2e 68 74 6d 6c 22 20 61 70 70  /index.html" app
0f60: 65 6e 64 65 64 20 2a 2f 0a 73 74 61 74 69 63 20  ended */.static 
0f70: 63 68 61 72 20 2a 7a 48 6f 6d 65 20 3d 20 30 3b  char *zHome = 0;
0f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0f90: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
0fa0: 69 6e 69 6e 67 20 63 6f 6e 74 65 6e 74 20 2a 2f  ining content */
0fb0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 51  .static char *zQ
0fc0: 75 65 72 79 53 74 72 69 6e 67 20 3d 20 30 3b 20  ueryString = 0; 
0fd0: 20 20 2f 2a 20 54 68 65 20 71 75 65 72 79 20 73    /* The query s
0fe0: 74 72 69 6e 67 20 6f 6e 20 74 68 65 20 65 6e 64  tring on the end
0ff0: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a   of the name */.
1000: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 46 69  static char *zFi
1010: 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  le = 0;         
1020: 20 2f 2a 20 54 68 65 20 66 69 6c 65 6e 61 6d 65   /* The filename
1030: 20 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 20 74   of the object t
1040: 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 73 74  o retrieve */.st
1050: 61 74 69 63 20 69 6e 74 20 6c 65 6e 46 69 6c 65  atic int lenFile
1060: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
1070: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  * Length of the 
1080: 7a 46 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 73 74  zFile name */.st
1090: 61 74 69 63 20 63 68 61 72 20 2a 7a 44 69 72 20  atic char *zDir 
10a0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
10b0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 69  * Name of the di
10c0: 72 65 63 74 6f 72 79 20 68 6f 6c 64 69 6e 67 20  rectory holding 
10d0: 7a 46 69 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20  zFile */.static 
10e0: 63 68 61 72 20 2a 7a 50 61 74 68 49 6e 66 6f 20  char *zPathInfo 
10f0: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 50 61 72  = 0;      /* Par
1100: 74 20 6f 66 20 74 68 65 20 70 61 74 68 6e 61 6d  t of the pathnam
1110: 65 20 70 61 73 74 20 74 68 65 20 66 69 6c 65 20  e past the file 
1120: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
1130: 7a 41 67 65 6e 74 20 3d 20 30 3b 20 20 20 20 20  zAgent = 0;     
1140: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 79 70 65      /* What type
1150: 20 69 66 20 62 72 6f 77 73 65 72 20 69 73 20 6d   if browser is m
1160: 61 6b 69 6e 67 20 74 68 69 73 20 71 75 65 72 79  aking this query
1170: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
1180: 2a 7a 53 65 72 76 65 72 4e 61 6d 65 20 3d 20 30  *zServerName = 0
1190: 3b 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65  ;    /* The name
11a0: 20 61 66 74 65 72 20 74 68 65 20 68 74 74 70 3a   after the http:
11b0: 2f 2f 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  // */.static cha
11c0: 72 20 2a 7a 53 65 72 76 65 72 50 6f 72 74 20 3d  r *zServerPort =
11d0: 20 30 3b 20 20 20 20 2f 2a 20 54 68 65 20 70 6f   0;    /* The po
11e0: 72 74 20 6e 75 6d 62 65 72 20 2a 2f 0a 73 74 61  rt number */.sta
11f0: 74 69 63 20 63 68 61 72 20 2a 7a 43 6f 6f 6b 69  tic char *zCooki
1200: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  e = 0;        /*
1210: 20 43 6f 6f 6b 69 65 73 20 72 65 70 6f 72 74 65   Cookies reporte
1220: 64 20 77 69 74 68 20 74 68 65 20 72 65 71 75 65  d with the reque
1230: 73 74 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  st */.static cha
1240: 72 20 2a 7a 48 74 74 70 48 6f 73 74 20 3d 20 30  r *zHttpHost = 0
1250: 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 61  ;      /* Name a
1260: 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
1270: 77 65 62 20 62 72 6f 77 73 65 72 20 2a 2f 0a 73  web browser */.s
1280: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 52 65 61  tatic char *zRea
1290: 6c 50 6f 72 74 20 3d 20 30 3b 20 20 20 20 20 20  lPort = 0;      
12a0: 2f 2a 20 54 68 65 20 72 65 61 6c 20 54 43 50 20  /* The real TCP 
12b0: 70 6f 72 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e  port when runnin
12c0: 67 20 61 73 20 64 61 65 6d 6f 6e 20 2a 2f 0a 73  g as daemon */.s
12d0: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 52 65 6d  tatic char *zRem
12e0: 6f 74 65 41 64 64 72 20 3d 20 30 3b 20 20 20 20  oteAddr = 0;    
12f0: 2f 2a 20 49 50 20 61 64 64 72 65 73 73 20 6f 66  /* IP address of
1300: 20 74 68 65 20 72 65 71 75 65 73 74 20 2a 2f 0a   the request */.
1310: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 52 65  static char *zRe
1320: 66 65 72 65 72 20 3d 20 30 3b 20 20 20 20 20 20  ferer = 0;      
1330: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1340: 70 61 67 65 20 74 68 61 74 20 72 65 66 65 72 65  page that refere
1350: 64 20 74 6f 20 75 73 20 2a 2f 0a 73 74 61 74 69  d to us */.stati
1360: 63 20 63 68 61 72 20 2a 7a 41 63 63 65 70 74 20  c char *zAccept 
1370: 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 57  = 0;        /* W
1380: 68 61 74 20 66 6f 72 6d 61 74 73 20 77 69 6c 6c  hat formats will
1390: 20 62 65 20 61 63 63 65 70 74 65 64 20 2a 2f 0a   be accepted */.
13a0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 43 6f  static char *zCo
13b0: 6e 74 65 6e 74 4c 65 6e 67 74 68 20 3d 20 30 3b  ntentLength = 0;
13c0: 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6c 65 6e 67   /* Content leng
13d0: 74 68 20 72 65 70 6f 72 74 65 64 20 69 6e 20 74  th reported in t
13e0: 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 73 74 61  he header */.sta
13f0: 74 69 63 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65  tic char *zConte
1400: 6e 74 54 79 70 65 20 3d 20 30 3b 20 20 20 2f 2a  ntType = 0;   /*
1410: 20 43 6f 6e 74 65 6e 74 20 74 79 70 65 20 72 65   Content type re
1420: 70 6f 72 74 65 64 20 69 6e 20 74 68 65 20 68 65  ported in the he
1430: 61 64 65 72 20 2a 2f 0a 73 74 61 74 69 63 20 63  ader */.static c
1440: 68 61 72 20 2a 7a 51 75 65 72 79 53 75 66 66 69  har *zQuerySuffi
1450: 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20  x = 0;   /* The 
1460: 70 61 72 74 20 6f 66 20 74 68 65 20 55 52 4c 20  part of the URL 
1470: 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74 20  after the first 
1480: 3f 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ? */.static char
1490: 20 2a 7a 41 75 74 68 54 79 70 65 20 3d 20 30 3b   *zAuthType = 0;
14a0: 20 20 20 20 20 20 2f 2a 20 41 75 74 68 6f 72 69        /* Authori
14b0: 7a 61 74 69 6f 6e 20 74 79 70 65 20 28 62 61 73  zation type (bas
14c0: 69 63 20 6f 72 20 64 69 67 65 73 74 29 20 2a 2f  ic or digest) */
14d0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 41  .static char *zA
14e0: 75 74 68 41 72 67 20 3d 20 30 3b 20 20 20 20 20  uthArg = 0;     
14f0: 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74 69    /* Authorizati
1500: 6f 6e 20 76 61 6c 75 65 73 20 2a 2f 0a 73 74 61  on values */.sta
1510: 74 69 63 20 63 68 61 72 20 2a 7a 52 65 6d 6f 74  tic char *zRemot
1520: 65 55 73 65 72 20 3d 20 30 3b 20 20 20 20 2f 2a  eUser = 0;    /*
1530: 20 52 45 4d 4f 54 45 5f 55 53 45 52 20 73 65 74   REMOTE_USER set
1540: 20 62 79 20 61 75 74 68 6f 72 69 7a 61 74 69 6f   by authorizatio
1550: 6e 20 6d 6f 64 75 6c 65 20 2a 2f 0a 73 74 61 74  n module */.stat
1560: 69 63 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 20  ic int nIn = 0; 
1570: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1580: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1590: 6f 66 20 69 6e 70 75 74 20 2a 2f 0a 73 74 61 74  of input */.stat
15a0: 69 63 20 69 6e 74 20 6e 4f 75 74 20 3d 20 30 3b  ic int nOut = 0;
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15c0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
15d0: 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 73 74 61  of output */.sta
15e0: 74 69 63 20 63 68 61 72 20 7a 52 65 70 6c 79 53  tic char zReplyS
15f0: 74 61 74 75 73 5b 34 5d 3b 20 20 20 20 20 2f 2a  tatus[4];     /*
1600: 20 52 65 70 6c 79 20 73 74 61 74 75 73 20 63 6f   Reply status co
1610: 64 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  de */.static int
1620: 20 73 74 61 74 75 73 53 65 6e 74 20 3d 20 30 3b   statusSent = 0;
1630: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 61         /* True a
1640: 66 74 65 72 20 73 74 61 74 75 73 20 6c 69 6e 65  fter status line
1650: 20 69 73 20 73 65 6e 74 20 2a 2f 0a 73 74 61 74   is sent */.stat
1660: 69 63 20 63 68 61 72 20 2a 7a 4c 6f 67 46 69 6c  ic char *zLogFil
1670: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
1680: 4c 6f 67 20 74 6f 20 74 68 69 73 20 66 69 6c 65  Log to this file
1690: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64   */.static int d
16a0: 65 62 75 67 46 6c 61 67 20 3d 20 30 3b 20 20 20  ebugFlag = 0;   
16b0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
16c0: 62 65 69 6e 67 20 64 65 62 75 67 67 65 64 20 2a  being debugged *
16d0: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
16e0: 74 69 6d 65 76 61 6c 20 62 65 67 69 6e 54 69 6d  timeval beginTim
16f0: 65 3b 20 2f 2a 20 54 69 6d 65 20 77 68 65 6e 20  e; /* Time when 
1700: 74 68 69 73 20 70 72 6f 63 65 73 73 20 73 74 61  this process sta
1710: 72 74 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rts */.static in
1720: 74 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f  t closeConnectio
1730: 6e 20 3d 20 30 3b 20 20 2f 2a 20 54 72 75 65 20  n = 0;  /* True 
1740: 74 6f 20 73 65 6e 64 20 43 6f 6e 6e 65 63 74 69  to send Connecti
1750: 6f 6e 3a 20 63 6c 6f 73 65 20 69 6e 20 72 65 70  on: close in rep
1760: 6c 79 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ly */.static int
1770: 20 6e 52 65 71 75 65 73 74 20 3d 20 30 3b 20 20   nRequest = 0;  
1780: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1790: 20 6f 66 20 72 65 71 75 65 73 74 73 20 70 72 6f   of requests pro
17a0: 63 65 73 73 65 64 20 2a 2f 0a 73 74 61 74 69 63  cessed */.static
17b0: 20 69 6e 74 20 6f 6d 69 74 4c 6f 67 20 3d 20 30   int omitLog = 0
17c0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  ;          /* Do
17d0: 20 6e 6f 74 20 6d 61 6b 65 20 6c 6f 67 66 69 6c   not make logfil
17e0: 65 20 65 6e 74 72 69 65 73 20 69 66 20 74 72 75  e entries if tru
17f0: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
1800: 75 73 65 48 74 74 70 73 20 3d 20 30 3b 20 20 20  useHttps = 0;   
1810: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
1820: 20 75 73 65 20 48 54 54 50 53 3a 20 69 6e 73 74   use HTTPS: inst
1830: 65 61 64 20 6f 66 20 48 54 54 50 3a 20 2a 2f 0a  ead of HTTP: */.
1840: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 48 74  static char *zHt
1850: 74 70 20 3d 20 22 68 74 74 70 22 3b 20 20 20 20  tp = "http";    
1860: 20 2f 2a 20 68 74 74 70 20 6f 72 20 68 74 74 70   /* http or http
1870: 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
1880: 75 73 65 54 69 6d 65 6f 75 74 20 3d 20 31 3b 20  useTimeout = 1; 
1890: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
18a0: 20 75 73 65 20 74 69 6d 65 73 20 2a 2f 0a 73 74   use times */.st
18b0: 61 74 69 63 20 69 6e 74 20 73 74 61 6e 64 61 6c  atic int standal
18c0: 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  one = 0;       /
18d0: 2a 20 52 75 6e 20 61 73 20 61 20 73 74 61 6e 64  * Run as a stand
18e0: 61 6c 6f 6e 65 20 73 65 72 76 65 72 20 28 6e 6f  alone server (no
18f0: 20 69 6e 65 74 64 29 20 2a 2f 0a 73 74 61 74 69   inetd) */.stati
1900: 63 20 69 6e 74 20 69 70 76 36 4f 6e 6c 79 20 3d  c int ipv6Only =
1910: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 55   0;         /* U
1920: 73 65 20 49 50 76 36 20 6f 6e 6c 79 20 2a 2f 0a  se IPv6 only */.
1930: 73 74 61 74 69 63 20 69 6e 74 20 69 70 76 34 4f  static int ipv4O
1940: 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nly = 0;        
1950: 20 2f 2a 20 55 73 65 20 49 50 76 34 20 6f 6e 6c   /* Use IPv4 onl
1960: 79 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  y */.static stru
1970: 63 74 20 72 75 73 61 67 65 20 70 72 69 6f 72 53  ct rusage priorS
1980: 65 6c 66 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75  elf;  /* Previou
1990: 73 6c 79 20 72 65 70 6f 72 74 20 53 45 4c 46 20  sly report SELF 
19a0: 74 69 6d 65 20 2a 2f 0a 73 74 61 74 69 63 20 73  time */.static s
19b0: 74 72 75 63 74 20 72 75 73 61 67 65 20 70 72 69  truct rusage pri
19c0: 6f 72 43 68 69 6c 64 3b 20 2f 2a 20 50 72 65 76  orChild; /* Prev
19d0: 69 6f 75 73 6c 79 20 72 65 70 6f 72 74 20 43 48  iously report CH
19e0: 49 4c 44 20 74 69 6d 65 20 2a 2f 0a 0a 2f 2a 0a  ILD time */../*.
19f0: 2a 2a 20 44 6f 75 62 6c 65 20 61 6e 79 20 64 6f  ** Double any do
1a00: 75 62 6c 65 2d 71 75 6f 74 65 20 63 68 61 72 61  uble-quote chara
1a10: 63 74 65 72 73 20 69 6e 20 61 20 73 74 72 69 6e  cters in a strin
1a20: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  g..*/.static cha
1a30: 72 20 2a 45 73 63 61 70 65 28 63 68 61 72 20 2a  r *Escape(char *
1a40: 7a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  z){.  int i, j;.
1a50: 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20    int n;.  char 
1a60: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b  c;.  char *zOut;
1a70: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 3d 7a  .  for(i=0; (c=z
1a80: 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 22  [i])!=0 && c!='"
1a90: 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20  '; i++){}.  if( 
1aa0: 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 3b  c==0 ) return z;
1ab0: 0a 20 20 6e 20 3d 20 31 3b 0a 20 20 66 6f 72 28  .  n = 1;.  for(
1ac0: 69 2b 2b 3b 20 28 63 3d 7a 5b 69 5d 29 21 3d 30  i++; (c=z[i])!=0
1ad0: 3b 20 69 2b 2b 29 7b 20 69 66 28 20 63 3d 3d 27  ; i++){ if( c=='
1ae0: 22 27 20 29 20 6e 2b 2b 3b 20 7d 0a 20 20 7a 4f  "' ) n++; }.  zO
1af0: 75 74 20 3d 20 6d 61 6c 6c 6f 63 28 20 69 2b 6e  ut = malloc( i+n
1b00: 2b 31 20 29 3b 0a 20 20 69 66 28 20 7a 4f 75 74  +1 );.  if( zOut
1b10: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 22 22 3b  ==0 ) return "";
1b20: 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63  .  for(i=j=0; (c
1b30: 3d 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b  =z[i])!=0; i++){
1b40: 0a 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d  .    zOut[j++] =
1b50: 20 63 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27   c;.    if( c=='
1b60: 22 27 20 29 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d  "' ) zOut[j++] =
1b70: 20 63 3b 0a 20 20 7d 0a 20 20 7a 4f 75 74 5b 6a   c;.  }.  zOut[j
1b80: 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 0;.  return 
1b90: 7a 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  zOut;.}../*.** C
1ba0: 6f 6e 76 65 72 74 20 61 20 73 74 72 75 63 74 20  onvert a struct 
1bb0: 74 69 6d 65 76 61 6c 20 69 6e 74 6f 20 61 6e 20  timeval into an 
1bc0: 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f  integer number o
1bd0: 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 0a 2a  f milliseconds.*
1be0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 76 6d  /.static int tvm
1bf0: 73 28 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c  s(struct timeval
1c00: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28   *p){.  return (
1c10: 69 6e 74 29 28 70 2d 3e 74 76 5f 73 65 63 2a 31  int)(p->tv_sec*1
1c20: 30 30 30 30 30 30 20 2b 20 70 2d 3e 74 76 5f 75  000000 + p->tv_u
1c30: 73 65 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  sec);.}../*.** M
1c40: 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  ake an entry in 
1c50: 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 20 49  the log file.  I
1c60: 66 20 74 68 65 20 48 54 54 50 20 63 6f 6e 6e 65  f the HTTP conne
1c70: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 0a  ction should be.
1c80: 2a 2a 20 63 6c 6f 73 65 64 2c 20 74 68 65 6e 20  ** closed, then 
1c90: 74 65 72 6d 69 6e 61 74 65 20 74 68 69 73 20 70  terminate this p
1ca0: 72 6f 63 65 73 73 2e 20 20 4f 74 68 65 72 77 69  rocess.  Otherwi
1cb0: 73 65 20 72 65 74 75 72 6e 2e 0a 2a 2f 0a 73 74  se return..*/.st
1cc0: 61 74 69 63 20 76 6f 69 64 20 4d 61 6b 65 4c 6f  atic void MakeLo
1cd0: 67 45 6e 74 72 79 28 69 6e 74 20 61 29 7b 0a 20  gEntry(int a){. 
1ce0: 20 46 49 4c 45 20 2a 6c 6f 67 3b 0a 20 20 69 66   FILE *log;.  if
1cf0: 28 20 7a 54 6d 70 4e 61 6d 20 29 7b 0a 20 20 20  ( zTmpNam ){.   
1d00: 20 75 6e 6c 69 6e 6b 28 7a 54 6d 70 4e 61 6d 29   unlink(zTmpNam)
1d10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4c 6f 67  ;.  }.  if( zLog
1d20: 46 69 6c 65 20 26 26 20 21 6f 6d 69 74 4c 6f 67  File && !omitLog
1d30: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 74   ){.    struct t
1d40: 69 6d 65 76 61 6c 20 6e 6f 77 3b 0a 20 20 20 20  imeval now;.    
1d50: 73 74 72 75 63 74 20 74 6d 20 2a 70 54 6d 3b 0a  struct tm *pTm;.
1d60: 20 20 20 20 73 74 72 75 63 74 20 72 75 73 61 67      struct rusag
1d70: 65 20 73 65 6c 66 2c 20 63 68 69 6c 64 72 65 6e  e self, children
1d80: 3b 0a 20 20 20 20 69 6e 74 20 77 61 69 74 53 74  ;.    int waitSt
1d90: 61 74 75 73 3b 0a 20 20 20 20 63 68 61 72 20 7a  atus;.    char z
1da0: 44 61 74 65 5b 32 30 30 5d 3b 0a 20 20 20 20 63  Date[200];.    c
1db0: 68 61 72 20 2a 7a 52 4d 20 3d 20 7a 52 65 6d 6f  har *zRM = zRemo
1dc0: 74 65 55 73 65 72 20 3f 20 7a 52 65 6d 6f 74 65  teUser ? zRemote
1dd0: 55 73 65 72 20 3a 20 22 22 3b 0a 0a 20 20 20 20  User : "";..    
1de0: 69 66 28 20 7a 53 63 72 69 70 74 3d 3d 30 20 29  if( zScript==0 )
1df0: 20 7a 53 63 72 69 70 74 20 3d 20 22 22 3b 0a 20   zScript = "";. 
1e00: 20 20 20 69 66 28 20 7a 52 65 61 6c 53 63 72 69     if( zRealScri
1e10: 70 74 3d 3d 30 20 29 20 7a 52 65 61 6c 53 63 72  pt==0 ) zRealScr
1e20: 69 70 74 20 3d 20 22 22 3b 0a 20 20 20 20 69 66  ipt = "";.    if
1e30: 28 20 7a 52 65 6d 6f 74 65 41 64 64 72 3d 3d 30  ( zRemoteAddr==0
1e40: 20 29 20 7a 52 65 6d 6f 74 65 41 64 64 72 20 3d   ) zRemoteAddr =
1e50: 20 22 22 3b 0a 20 20 20 20 69 66 28 20 7a 48 74   "";.    if( zHt
1e60: 74 70 48 6f 73 74 3d 3d 30 20 29 20 7a 48 74 74  tpHost==0 ) zHtt
1e70: 70 48 6f 73 74 20 3d 20 22 22 3b 0a 20 20 20 20  pHost = "";.    
1e80: 69 66 28 20 7a 52 65 66 65 72 65 72 3d 3d 30 20  if( zReferer==0 
1e90: 29 20 7a 52 65 66 65 72 65 72 20 3d 20 22 22 3b  ) zReferer = "";
1ea0: 0a 20 20 20 20 69 66 28 20 7a 41 67 65 6e 74 3d  .    if( zAgent=
1eb0: 3d 30 20 29 20 7a 41 67 65 6e 74 20 3d 20 22 22  =0 ) zAgent = ""
1ec0: 3b 0a 20 20 20 20 67 65 74 74 69 6d 65 6f 66 64  ;.    gettimeofd
1ed0: 61 79 28 26 6e 6f 77 2c 20 30 29 3b 0a 20 20 20  ay(&now, 0);.   
1ee0: 20 70 54 6d 20 3d 20 6c 6f 63 61 6c 74 69 6d 65   pTm = localtime
1ef0: 28 26 6e 6f 77 2e 74 76 5f 73 65 63 29 3b 0a 20  (&now.tv_sec);. 
1f00: 20 20 20 73 74 72 66 74 69 6d 65 28 7a 44 61 74     strftime(zDat
1f10: 65 2c 20 73 69 7a 65 6f 66 28 7a 44 61 74 65 29  e, sizeof(zDate)
1f20: 2c 20 22 25 59 2d 25 6d 2d 25 64 20 25 48 3a 25  , "%Y-%m-%d %H:%
1f30: 4d 3a 25 53 22 2c 20 70 54 6d 29 3b 0a 20 20 20  M:%S", pTm);.   
1f40: 20 77 61 69 74 70 69 64 28 2d 31 2c 20 26 77 61   waitpid(-1, &wa
1f50: 69 74 53 74 61 74 75 73 2c 20 57 4e 4f 48 41 4e  itStatus, WNOHAN
1f60: 47 29 3b 0a 20 20 20 20 67 65 74 72 75 73 61 67  G);.    getrusag
1f70: 65 28 52 55 53 41 47 45 5f 53 45 4c 46 2c 20 26  e(RUSAGE_SELF, &
1f80: 73 65 6c 66 29 3b 0a 20 20 20 20 67 65 74 72 75  self);.    getru
1f90: 73 61 67 65 28 52 55 53 41 47 45 5f 43 48 49 4c  sage(RUSAGE_CHIL
1fa0: 44 52 45 4e 2c 20 26 63 68 69 6c 64 72 65 6e 29  DREN, &children)
1fb0: 3b 0a 20 20 20 20 69 66 28 20 28 6c 6f 67 20 3d  ;.    if( (log =
1fc0: 20 66 6f 70 65 6e 28 7a 4c 6f 67 46 69 6c 65 2c   fopen(zLogFile,
1fd0: 22 61 22 29 29 21 3d 30 20 29 7b 0a 23 69 66 64  "a"))!=0 ){.#ifd
1fe0: 65 66 20 43 4f 4d 42 49 4e 45 44 5f 4c 4f 47 5f  ef COMBINED_LOG_
1ff0: 46 4f 52 4d 41 54 0a 20 20 20 20 20 20 73 74 72  FORMAT.      str
2000: 66 74 69 6d 65 28 7a 44 61 74 65 2c 20 73 69 7a  ftime(zDate, siz
2010: 65 6f 66 28 7a 44 61 74 65 29 2c 20 22 25 64 2f  eof(zDate), "%d/
2020: 25 62 2f 25 59 3a 25 48 3a 25 4d 3a 25 53 20 25  %b/%Y:%H:%M:%S %
2030: 7a 22 2c 20 70 54 6d 29 3b 0a 20 20 20 20 20 20  z", pTm);.      
2040: 66 70 72 69 6e 74 66 28 6c 6f 67 2c 20 22 25 73  fprintf(log, "%s
2050: 20 2d 20 2d 20 5b 25 73 5d 20 5c 22 25 73 20 25   - - [%s] \"%s %
2060: 73 20 25 73 5c 22 20 25 73 20 25 64 20 5c 22 25  s %s\" %s %d \"%
2070: 73 5c 22 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20  s\" \"%s\"\n",. 
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 52 65               zRe
2090: 6d 6f 74 65 41 64 64 72 2c 20 7a 44 61 74 65 2c  moteAddr, zDate,
20a0: 20 7a 4d 65 74 68 6f 64 2c 20 7a 53 63 72 69 70   zMethod, zScrip
20b0: 74 2c 20 7a 50 72 6f 74 6f 63 6f 6c 2c 0a 20 20  t, zProtocol,.  
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 52 65 70              zRep
20d0: 6c 79 53 74 61 74 75 73 2c 20 6e 4f 75 74 2c 20  lyStatus, nOut, 
20e0: 7a 52 65 66 65 72 65 72 2c 20 7a 41 67 65 6e 74  zReferer, zAgent
20f0: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 73  );.#else.      s
2100: 74 72 66 74 69 6d 65 28 7a 44 61 74 65 2c 20 73  trftime(zDate, s
2110: 69 7a 65 6f 66 28 7a 44 61 74 65 29 2c 20 22 25  izeof(zDate), "%
2120: 59 2d 25 6d 2d 25 64 20 25 48 3a 25 4d 3a 25 53  Y-%m-%d %H:%M:%S
2130: 22 2c 20 70 54 6d 29 3b 0a 20 20 20 20 20 20 2f  ", pTm);.      /
2140: 2a 20 4c 6f 67 20 72 65 63 6f 72 64 20 66 69 6c  * Log record fil
2150: 65 73 3a 0a 20 20 20 20 20 20 2a 2a 20 20 28 31  es:.      **  (1
2160: 29 20 44 61 74 65 20 61 6e 64 20 74 69 6d 65 0a  ) Date and time.
2170: 20 20 20 20 20 20 2a 2a 20 20 28 32 29 20 49 50        **  (2) IP
2180: 20 61 64 64 72 65 73 73 0a 20 20 20 20 20 20 2a   address.      *
2190: 2a 20 20 28 33 29 20 55 52 4c 20 62 65 69 6e 67  *  (3) URL being
21a0: 20 61 63 63 65 73 73 65 64 0a 20 20 20 20 20 20   accessed.      
21b0: 2a 2a 20 20 28 34 29 20 52 65 66 65 72 65 72 0a  **  (4) Referer.
21c0: 20 20 20 20 20 20 2a 2a 20 20 28 35 29 20 52 65        **  (5) Re
21d0: 70 6c 79 20 73 74 61 74 75 73 0a 20 20 20 20 20  ply status.     
21e0: 20 2a 2a 20 20 28 36 29 20 42 79 74 65 73 20 72   **  (6) Bytes r
21f0: 65 63 65 69 76 65 64 0a 20 20 20 20 20 20 2a 2a  eceived.      **
2200: 20 20 28 37 29 20 42 79 74 65 73 20 73 65 6e 74    (7) Bytes sent
2210: 0a 20 20 20 20 20 20 2a 2a 20 20 28 38 29 20 53  .      **  (8) S
2220: 65 6c 66 20 75 73 65 72 20 74 69 6d 65 0a 20 20  elf user time.  
2230: 20 20 20 20 2a 2a 20 20 28 39 29 20 53 65 6c 66      **  (9) Self
2240: 20 73 79 73 74 65 6d 20 74 69 6d 65 0a 20 20 20   system time.   
2250: 20 20 20 2a 2a 20 28 31 30 29 20 43 68 69 6c 64     ** (10) Child
2260: 72 65 6e 20 75 73 65 72 20 74 69 6d 65 0a 20 20  ren user time.  
2270: 20 20 20 20 2a 2a 20 28 31 31 29 20 43 68 69 6c      ** (11) Chil
2280: 64 72 65 6e 20 73 79 73 74 65 6d 20 74 69 6d 65  dren system time
2290: 0a 20 20 20 20 20 20 2a 2a 20 28 31 32 29 20 54  .      ** (12) T
22a0: 6f 74 61 6c 20 77 61 6c 6c 2d 63 6c 6f 63 6b 20  otal wall-clock 
22b0: 74 69 6d 65 0a 20 20 20 20 20 20 2a 2a 20 28 31  time.      ** (1
22c0: 33 29 20 52 65 71 75 65 73 74 20 6e 75 6d 62 65  3) Request numbe
22d0: 72 20 66 6f 72 20 73 61 6d 65 20 54 43 50 2f 49  r for same TCP/I
22e0: 50 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  P connection.   
22f0: 20 20 20 2a 2a 20 28 31 34 29 20 55 73 65 72 20     ** (14) User 
2300: 61 67 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 28  agent.      ** (
2310: 31 35 29 20 52 65 6d 6f 74 65 20 75 73 65 72 0a  15) Remote user.
2320: 20 20 20 20 20 20 2a 2a 20 28 31 36 29 20 42 79        ** (16) By
2330: 74 65 73 20 6f 66 20 55 52 4c 20 74 68 61 74 20  tes of URL that 
2340: 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68  correspond to th
2350: 65 20 53 43 52 49 50 54 5f 4e 41 4d 45 0a 20 20  e SCRIPT_NAME.  
2360: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 70 72      */.      fpr
2370: 69 6e 74 66 28 6c 6f 67 2c 0a 20 20 20 20 20 20  intf(log,.      
2380: 20 20 22 25 73 2c 25 73 2c 5c 22 25 73 3a 2f 2f    "%s,%s,\"%s://
2390: 25 73 25 73 5c 22 2c 5c 22 25 73 5c 22 2c 22 0a  %s%s\",\"%s\",".
23a0: 20 20 20 20 20 20 20 20 20 20 20 22 25 73 2c 25             "%s,%
23b0: 64 2c 25 64 2c 25 64 2c 25 64 2c 25 64 2c 25 64  d,%d,%d,%d,%d,%d
23c0: 2c 25 64 2c 25 64 2c 5c 22 25 73 5c 22 2c 5c 22  ,%d,%d,\"%s\",\"
23d0: 25 73 5c 22 2c 25 64 5c 6e 22 2c 0a 20 20 20 20  %s\",%d\n",.    
23e0: 20 20 20 20 7a 44 61 74 65 2c 20 7a 52 65 6d 6f      zDate, zRemo
23f0: 74 65 41 64 64 72 2c 20 7a 48 74 74 70 2c 20 45  teAddr, zHttp, E
2400: 73 63 61 70 65 28 7a 48 74 74 70 48 6f 73 74 29  scape(zHttpHost)
2410: 2c 20 45 73 63 61 70 65 28 7a 53 63 72 69 70 74  , Escape(zScript
2420: 29 2c 0a 20 20 20 20 20 20 20 20 45 73 63 61 70  ),.        Escap
2430: 65 28 7a 52 65 66 65 72 65 72 29 2c 20 7a 52 65  e(zReferer), zRe
2440: 70 6c 79 53 74 61 74 75 73 2c 20 6e 49 6e 2c 20  plyStatus, nIn, 
2450: 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 74 76  nOut,.        tv
2460: 6d 73 28 26 73 65 6c 66 2e 72 75 5f 75 74 69 6d  ms(&self.ru_utim
2470: 65 29 20 2d 20 74 76 6d 73 28 26 70 72 69 6f 72  e) - tvms(&prior
2480: 53 65 6c 66 2e 72 75 5f 75 74 69 6d 65 29 2c 0a  Self.ru_utime),.
2490: 20 20 20 20 20 20 20 20 74 76 6d 73 28 26 73 65          tvms(&se
24a0: 6c 66 2e 72 75 5f 73 74 69 6d 65 29 20 2d 20 74  lf.ru_stime) - t
24b0: 76 6d 73 28 26 70 72 69 6f 72 53 65 6c 66 2e 72  vms(&priorSelf.r
24c0: 75 5f 73 74 69 6d 65 29 2c 0a 20 20 20 20 20 20  u_stime),.      
24d0: 20 20 74 76 6d 73 28 26 63 68 69 6c 64 72 65 6e    tvms(&children
24e0: 2e 72 75 5f 75 74 69 6d 65 29 20 2d 20 74 76 6d  .ru_utime) - tvm
24f0: 73 28 26 70 72 69 6f 72 43 68 69 6c 64 2e 72 75  s(&priorChild.ru
2500: 5f 75 74 69 6d 65 29 2c 0a 20 20 20 20 20 20 20  _utime),.       
2510: 20 74 76 6d 73 28 26 63 68 69 6c 64 72 65 6e 2e   tvms(&children.
2520: 72 75 5f 73 74 69 6d 65 29 20 2d 20 74 76 6d 73  ru_stime) - tvms
2530: 28 26 70 72 69 6f 72 43 68 69 6c 64 2e 72 75 5f  (&priorChild.ru_
2540: 73 74 69 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  stime),.        
2550: 74 76 6d 73 28 26 6e 6f 77 29 20 2d 20 74 76 6d  tvms(&now) - tvm
2560: 73 28 26 62 65 67 69 6e 54 69 6d 65 29 2c 0a 20  s(&beginTime),. 
2570: 20 20 20 20 20 20 20 6e 52 65 71 75 65 73 74 2c         nRequest,
2580: 20 45 73 63 61 70 65 28 7a 41 67 65 6e 74 29 2c   Escape(zAgent),
2590: 20 45 73 63 61 70 65 28 7a 52 4d 29 2c 0a 20 20   Escape(zRM),.  
25a0: 20 20 20 20 20 20 28 69 6e 74 29 28 73 74 72 6c        (int)(strl
25b0: 65 6e 28 7a 48 74 74 70 29 2b 73 74 72 6c 65 6e  en(zHttp)+strlen
25c0: 28 7a 48 74 74 70 48 6f 73 74 29 2b 73 74 72 6c  (zHttpHost)+strl
25d0: 65 6e 28 7a 52 65 61 6c 53 63 72 69 70 74 29 2b  en(zRealScript)+
25e0: 33 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  3).      );.    
25f0: 20 20 70 72 69 6f 72 53 65 6c 66 20 3d 20 73 65    priorSelf = se
2600: 6c 66 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 43  lf;.      priorC
2610: 68 69 6c 64 20 3d 20 63 68 69 6c 64 72 65 6e 3b  hild = children;
2620: 0a 20 20 20 20 20 20 62 65 67 69 6e 54 69 6d 65  .      beginTime
2630: 20 3d 20 6e 6f 77 3b 0a 23 65 6e 64 69 66 0a 20   = now;.#endif. 
2640: 20 20 20 20 20 66 63 6c 6f 73 65 28 6c 6f 67 29       fclose(log)
2650: 3b 0a 20 20 20 20 20 20 6e 49 6e 20 3d 20 6e 4f  ;.      nIn = nO
2660: 75 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ut = 0;.    }.  
2670: 7d 0a 20 20 69 66 28 20 63 6c 6f 73 65 43 6f 6e  }.  if( closeCon
2680: 6e 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 65  nection ){.    e
2690: 78 69 74 28 61 29 3b 0a 20 20 7d 0a 20 20 73 74  xit(a);.  }.  st
26a0: 61 74 75 73 53 65 6e 74 20 3d 20 30 3b 0a 7d 0a  atusSent = 0;.}.
26b0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
26c0: 6d 65 6d 6f 72 79 20 73 61 66 65 6c 79 0a 2a 2f  memory safely.*/
26d0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 53 61  .static char *Sa
26e0: 66 65 4d 61 6c 6c 6f 63 28 20 69 6e 74 20 73 69  feMalloc( int si
26f0: 7a 65 20 29 7b 0a 20 20 63 68 61 72 20 2a 70 3b  ze ){.  char *p;
2700: 0a 0a 20 20 70 20 3d 20 28 63 68 61 72 2a 29 6d  ..  p = (char*)m
2710: 61 6c 6c 6f 63 28 73 69 7a 65 29 3b 0a 20 20 69  alloc(size);.  i
2720: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73  f( p==0 ){.    s
2730: 74 72 63 70 79 28 7a 52 65 70 6c 79 53 74 61 74  trcpy(zReplyStat
2740: 75 73 2c 20 22 39 39 38 22 29 3b 0a 20 20 20 20  us, "998");.    
2750: 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 31 29 3b  MakeLogEntry(1);
2760: 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
2770: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
2780: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76  ./*.** Set the v
2790: 61 6c 75 65 20 6f 66 20 65 6e 76 69 72 6f 6e 6d  alue of environm
27a0: 65 6e 74 20 76 61 72 69 61 62 6c 65 20 7a 56 61  ent variable zVa
27b0: 72 20 74 6f 20 7a 56 61 6c 75 65 2e 0a 2a 2f 0a  r to zValue..*/.
27c0: 73 74 61 74 69 63 20 76 6f 69 64 20 53 65 74 45  static void SetE
27d0: 6e 76 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  nv(const char *z
27e0: 56 61 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Var, const char 
27f0: 2a 7a 56 61 6c 75 65 29 7b 0a 20 20 63 68 61 72  *zValue){.  char
2800: 20 2a 7a 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a   *z;.  int len;.
2810: 20 20 69 66 28 20 7a 56 61 6c 75 65 3d 3d 30 20    if( zValue==0 
2820: 29 20 7a 56 61 6c 75 65 3d 22 22 3b 0a 20 20 6c  ) zValue="";.  l
2830: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 56 61 72  en = strlen(zVar
2840: 29 20 2b 20 73 74 72 6c 65 6e 28 7a 56 61 6c 75  ) + strlen(zValu
2850: 65 29 20 2b 20 32 3b 0a 20 20 7a 20 3d 20 53 61  e) + 2;.  z = Sa
2860: 66 65 4d 61 6c 6c 6f 63 28 6c 65 6e 29 3b 0a 20  feMalloc(len);. 
2870: 20 73 70 72 69 6e 74 66 28 7a 2c 22 25 73 3d 25   sprintf(z,"%s=%
2880: 73 22 2c 7a 56 61 72 2c 7a 56 61 6c 75 65 29 3b  s",zVar,zValue);
2890: 0a 20 20 70 75 74 65 6e 76 28 7a 29 3b 0a 7d 0a  .  putenv(z);.}.
28a0: 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
28b0: 65 20 66 69 72 73 74 20 73 70 61 63 65 2d 64 65  e first space-de
28c0: 6c 69 6d 69 74 65 64 20 74 6f 6b 65 6e 20 66 72  limited token fr
28d0: 6f 6d 20 61 20 73 74 72 69 6e 67 20 61 6e 64 20  om a string and 
28e0: 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  return.** a poin
28f0: 74 65 72 20 74 6f 20 69 74 2e 20 20 41 64 64 20  ter to it.  Add 
2900: 61 20 4e 55 4c 4c 20 74 6f 20 74 68 65 20 73 74  a NULL to the st
2910: 72 69 6e 67 20 74 6f 20 74 65 72 6d 69 6e 61 74  ring to terminat
2920: 65 20 74 68 65 20 74 6f 6b 65 6e 2e 0a 2a 2a 20  e the token..** 
2930: 4d 61 6b 65 20 2a 7a 4c 65 66 74 4f 76 65 72 20  Make *zLeftOver 
2940: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 74 61  point to the sta
2950: 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 74  rt of the next t
2960: 6f 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oken..*/.static 
2970: 63 68 61 72 20 2a 47 65 74 46 69 72 73 74 45 6c  char *GetFirstEl
2980: 65 6d 65 6e 74 28 63 68 61 72 20 2a 7a 49 6e 70  ement(char *zInp
2990: 75 74 2c 20 63 68 61 72 20 2a 2a 7a 4c 65 66 74  ut, char **zLeft
29a0: 4f 76 65 72 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Over){.  char *z
29b0: 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 69 66  Result = 0;.  if
29c0: 28 20 7a 49 6e 70 75 74 3d 3d 30 20 29 7b 0a 20  ( zInput==0 ){. 
29d0: 20 20 20 69 66 28 20 7a 4c 65 66 74 4f 76 65 72     if( zLeftOver
29e0: 20 29 20 2a 7a 4c 65 66 74 4f 76 65 72 20 3d 20   ) *zLeftOver = 
29f0: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  0;.    return 0;
2a00: 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 69 73  .  }.  while( is
2a10: 73 70 61 63 65 28 2a 7a 49 6e 70 75 74 29 20 29  space(*zInput) )
2a20: 7b 20 7a 49 6e 70 75 74 2b 2b 3b 20 7d 0a 20 20  { zInput++; }.  
2a30: 7a 52 65 73 75 6c 74 20 3d 20 7a 49 6e 70 75 74  zResult = zInput
2a40: 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 49 6e 70  ;.  while( *zInp
2a50: 75 74 20 26 26 20 21 69 73 73 70 61 63 65 28 2a  ut && !isspace(*
2a60: 7a 49 6e 70 75 74 29 20 29 7b 20 7a 49 6e 70 75  zInput) ){ zInpu
2a70: 74 2b 2b 3b 20 7d 0a 20 20 69 66 28 20 2a 7a 49  t++; }.  if( *zI
2a80: 6e 70 75 74 20 29 7b 0a 20 20 20 20 2a 7a 49 6e  nput ){.    *zIn
2a90: 70 75 74 20 3d 20 30 3b 0a 20 20 20 20 7a 49 6e  put = 0;.    zIn
2aa0: 70 75 74 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65  put++;.    while
2ab0: 28 20 69 73 73 70 61 63 65 28 2a 7a 49 6e 70 75  ( isspace(*zInpu
2ac0: 74 29 20 29 7b 20 7a 49 6e 70 75 74 2b 2b 3b 20  t) ){ zInput++; 
2ad0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4c 65 66  }.  }.  if( zLef
2ae0: 74 4f 76 65 72 20 29 7b 20 2a 7a 4c 65 66 74 4f  tOver ){ *zLeftO
2af0: 76 65 72 20 3d 20 7a 49 6e 70 75 74 3b 20 7d 0a  ver = zInput; }.
2b00: 20 20 72 65 74 75 72 6e 20 7a 52 65 73 75 6c 74    return zResult
2b10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
2b20: 61 20 63 6f 70 79 20 6f 66 20 61 20 73 74 72 69  a copy of a stri
2b30: 6e 67 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  ng into memory o
2b40: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
2b50: 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  loc..*/.static c
2b60: 68 61 72 20 2a 53 74 72 44 75 70 28 63 6f 6e 73  har *StrDup(cons
2b70: 74 20 63 68 61 72 20 2a 7a 53 72 63 29 7b 0a 20  t char *zSrc){. 
2b80: 20 63 68 61 72 20 2a 7a 44 65 73 74 3b 0a 20 20   char *zDest;.  
2b90: 69 6e 74 20 73 69 7a 65 3b 0a 0a 20 20 69 66 28  int size;..  if(
2ba0: 20 7a 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72   zSrc==0 ) retur
2bb0: 6e 20 30 3b 0a 20 20 73 69 7a 65 20 3d 20 73 74  n 0;.  size = st
2bc0: 72 6c 65 6e 28 7a 53 72 63 29 20 2b 20 31 3b 0a  rlen(zSrc) + 1;.
2bd0: 20 20 7a 44 65 73 74 20 3d 20 28 63 68 61 72 2a    zDest = (char*
2be0: 29 53 61 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  )SafeMalloc( siz
2bf0: 65 20 29 3b 0a 20 20 73 74 72 63 70 79 28 7a 44  e );.  strcpy(zD
2c00: 65 73 74 2c 7a 53 72 63 29 3b 0a 20 20 72 65 74  est,zSrc);.  ret
2c10: 75 72 6e 20 7a 44 65 73 74 3b 0a 7d 0a 73 74 61  urn zDest;.}.sta
2c20: 74 69 63 20 63 68 61 72 20 2a 53 74 72 41 70 70  tic char *StrApp
2c30: 65 6e 64 28 63 68 61 72 20 2a 7a 50 72 69 6f 72  end(char *zPrior
2c40: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
2c50: 65 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ep, const char *
2c60: 7a 53 72 63 29 7b 0a 20 20 63 68 61 72 20 2a 7a  zSrc){.  char *z
2c70: 44 65 73 74 3b 0a 20 20 69 6e 74 20 73 69 7a 65  Dest;.  int size
2c80: 3b 0a 20 20 69 6e 74 20 6e 31 2c 20 6e 32 3b 0a  ;.  int n1, n2;.
2c90: 0a 20 20 69 66 28 20 7a 53 72 63 3d 3d 30 20 29  .  if( zSrc==0 )
2ca0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
2cb0: 20 7a 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74   zPrior==0 ) ret
2cc0: 75 72 6e 20 53 74 72 44 75 70 28 7a 53 72 63 29  urn StrDup(zSrc)
2cd0: 3b 0a 20 20 73 69 7a 65 20 3d 20 28 6e 31 3d 73  ;.  size = (n1=s
2ce0: 74 72 6c 65 6e 28 7a 53 72 63 29 29 20 2b 20 28  trlen(zSrc)) + (
2cf0: 6e 32 3d 73 74 72 6c 65 6e 28 7a 53 65 70 29 29  n2=strlen(zSep))
2d00: 20 2b 20 73 74 72 6c 65 6e 28 7a 50 72 69 6f 72   + strlen(zPrior
2d10: 29 20 2b 20 31 3b 0a 20 20 7a 44 65 73 74 20 3d  ) + 1;.  zDest =
2d20: 20 28 63 68 61 72 2a 29 53 61 66 65 4d 61 6c 6c   (char*)SafeMall
2d30: 6f 63 28 20 73 69 7a 65 20 29 3b 0a 20 20 73 74  oc( size );.  st
2d40: 72 63 70 79 28 7a 44 65 73 74 2c 7a 50 72 69 6f  rcpy(zDest,zPrio
2d50: 72 29 3b 0a 20 20 66 72 65 65 28 7a 50 72 69 6f  r);.  free(zPrio
2d60: 72 29 3b 0a 20 20 73 74 72 63 70 79 28 26 7a 44  r);.  strcpy(&zD
2d70: 65 73 74 5b 6e 31 5d 2c 7a 53 65 70 29 3b 0a 20  est[n1],zSep);. 
2d80: 20 73 74 72 63 70 79 28 26 7a 44 65 73 74 5b 6e   strcpy(&zDest[n
2d90: 31 2b 6e 32 5d 2c 7a 53 72 63 29 3b 0a 20 20 72  1+n2],zSrc);.  r
2da0: 65 74 75 72 6e 20 7a 44 65 73 74 3b 0a 7d 0a 0a  eturn zDest;.}..
2db0: 2f 2a 0a 2a 2a 20 42 72 65 61 6b 20 61 20 6c 69  /*.** Break a li
2dc0: 6e 65 20 61 74 20 74 68 65 20 66 69 72 73 74 20  ne at the first 
2dd0: 5c 6e 20 6f 72 20 5c 72 20 63 68 61 72 61 63 74  \n or \r charact
2de0: 65 72 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 61 74  er seen..*/.stat
2df0: 69 63 20 76 6f 69 64 20 52 65 6d 6f 76 65 4e 65  ic void RemoveNe
2e00: 77 6c 69 6e 65 28 63 68 61 72 20 2a 7a 29 7b 0a  wline(char *z){.
2e10: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
2e20: 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a  urn;.  while( *z
2e30: 20 26 26 20 2a 7a 21 3d 27 5c 6e 27 20 26 26 20   && *z!='\n' && 
2e40: 2a 7a 21 3d 27 5c 72 27 20 29 7b 20 7a 2b 2b 3b  *z!='\r' ){ z++;
2e50: 20 7d 0a 20 20 2a 7a 20 3d 20 30 3b 0a 7d 0a 0a   }.  *z = 0;.}..
2e60: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 64 61  /*.** Print a da
2e70: 74 65 20 74 61 67 20 69 6e 20 74 68 65 20 68 65  te tag in the he
2e80: 61 64 65 72 2e 20 20 54 68 65 20 6e 61 6d 65 20  ader.  The name 
2e90: 6f 66 20 74 68 65 20 74 61 67 20 69 73 20 7a 54  of the tag is zT
2ea0: 61 67 2e 0a 2a 2a 20 54 68 65 20 64 61 74 65 20  ag..** The date 
2eb0: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 66 72  is determined fr
2ec0: 6f 6d 20 74 68 65 20 75 6e 69 78 20 74 69 6d 65  om the unix time
2ed0: 73 74 61 6d 70 20 67 69 76 65 6e 2e 0a 2a 2f 0a  stamp given..*/.
2ee0: 73 74 61 74 69 63 20 69 6e 74 20 44 61 74 65 54  static int DateT
2ef0: 61 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ag(const char *z
2f00: 54 61 67 2c 20 74 69 6d 65 5f 74 20 74 29 7b 0a  Tag, time_t t){.
2f10: 20 20 73 74 72 75 63 74 20 74 6d 20 2a 74 6d 3b    struct tm *tm;
2f20: 0a 20 20 63 68 61 72 20 7a 44 61 74 65 5b 31 30  .  char zDate[10
2f30: 30 5d 3b 0a 20 20 74 6d 20 3d 20 67 6d 74 69 6d  0];.  tm = gmtim
2f40: 65 28 26 74 29 3b 0a 20 20 73 74 72 66 74 69 6d  e(&t);.  strftim
2f50: 65 28 7a 44 61 74 65 2c 20 73 69 7a 65 6f 66 28  e(zDate, sizeof(
2f60: 7a 44 61 74 65 29 2c 20 22 25 61 2c 20 25 64 20  zDate), "%a, %d 
2f70: 20 25 62 20 25 59 20 25 48 3a 25 4d 3a 25 53 20   %b %Y %H:%M:%S 
2f80: 25 7a 22 2c 20 74 6d 29 3b 0a 20 20 72 65 74 75  %z", tm);.  retu
2f90: 72 6e 20 70 72 69 6e 74 66 28 22 25 73 3a 20 25  rn printf("%s: %
2fa0: 73 5c 72 5c 6e 22 2c 20 7a 54 61 67 2c 20 7a 44  s\r\n", zTag, zD
2fb0: 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ate);.}../*.** P
2fc0: 72 69 6e 74 20 74 68 65 20 66 69 72 73 74 20 6c  rint the first l
2fd0: 69 6e 65 20 6f 66 20 61 20 72 65 73 70 6f 6e 73  ine of a respons
2fe0: 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68  e followed by th
2ff0: 65 20 73 65 72 76 65 72 20 74 79 70 65 2e 0a 2a  e server type..*
3000: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 74  /.static void St
3010: 61 72 74 52 65 73 70 6f 6e 73 65 28 63 6f 6e 73  artResponse(cons
3020: 74 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 43  t char *zResultC
3030: 6f 64 65 29 7b 0a 20 20 74 69 6d 65 5f 74 20 6e  ode){.  time_t n
3040: 6f 77 3b 0a 20 20 74 69 6d 65 28 26 6e 6f 77 29  ow;.  time(&now)
3050: 3b 0a 20 20 69 66 28 20 73 74 61 74 75 73 53 65  ;.  if( statusSe
3060: 6e 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e  nt ) return;.  n
3070: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 25  Out += printf("%
3080: 73 20 25 73 5c 72 5c 6e 22 2c 20 7a 50 72 6f 74  s %s\r\n", zProt
3090: 6f 63 6f 6c 2c 20 7a 52 65 73 75 6c 74 43 6f 64  ocol, zResultCod
30a0: 65 29 3b 0a 20 20 73 74 72 6e 63 70 79 28 7a 52  e);.  strncpy(zR
30b0: 65 70 6c 79 53 74 61 74 75 73 2c 20 7a 52 65 73  eplyStatus, zRes
30c0: 75 6c 74 43 6f 64 65 2c 20 33 29 3b 0a 20 20 7a  ultCode, 3);.  z
30d0: 52 65 70 6c 79 53 74 61 74 75 73 5b 33 5d 20 3d  ReplyStatus[3] =
30e0: 20 30 3b 0a 20 20 69 66 28 20 7a 52 65 70 6c 79   0;.  if( zReply
30f0: 53 74 61 74 75 73 5b 30 5d 3e 3d 27 34 27 20 29  Status[0]>='4' )
3100: 7b 0a 20 20 20 20 63 6c 6f 73 65 43 6f 6e 6e 65  {.    closeConne
3110: 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d 0a 20  ction = 1;.  }. 
3120: 20 69 66 28 20 63 6c 6f 73 65 43 6f 6e 6e 65 63   if( closeConnec
3130: 74 69 6f 6e 20 29 7b 0a 20 20 20 20 6e 4f 75 74  tion ){.    nOut
3140: 20 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 6e   += printf("Conn
3150: 65 63 74 69 6f 6e 3a 20 63 6c 6f 73 65 5c 72 5c  ection: close\r\
3160: 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n");.  }else{.  
3170: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
3180: 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 6b 65  ("Connection: ke
3190: 65 70 2d 61 6c 69 76 65 5c 72 5c 6e 22 29 3b 0a  ep-alive\r\n");.
31a0: 20 20 7d 0a 20 20 6e 4f 75 74 20 2b 3d 20 44 61    }.  nOut += Da
31b0: 74 65 54 61 67 28 22 44 61 74 65 22 2c 20 6e 6f  teTag("Date", no
31c0: 77 29 3b 0a 20 20 73 74 61 74 75 73 53 65 6e 74  w);.  statusSent
31d0: 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 1;.}../*.** T
31e0: 65 6c 6c 20 74 68 65 20 63 6c 69 65 6e 74 20 74  ell the client t
31f0: 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
3200: 73 75 63 68 20 64 6f 63 75 6d 65 6e 74 0a 2a 2f  such document.*/
3210: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4e 6f 74  .static void Not
3220: 46 6f 75 6e 64 28 69 6e 74 20 6c 69 6e 65 6e 6f  Found(int lineno
3230: 29 7b 0a 20 20 53 74 61 72 74 52 65 73 70 6f 6e  ){.  StartRespon
3240: 73 65 28 22 34 30 34 20 4e 6f 74 20 46 6f 75 6e  se("404 Not Foun
3250: 64 22 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70  d");.  nOut += p
3260: 72 69 6e 74 66 28 0a 20 20 20 20 22 43 6f 6e 74  rintf(.    "Cont
3270: 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 68  ent-type: text/h
3280: 74 6d 6c 5c 72 5c 6e 22 0a 20 20 20 20 22 5c 72  tml\r\n".    "\r
3290: 5c 6e 22 0a 20 20 20 20 22 3c 68 65 61 64 3e 3c  \n".    "<head><
32a0: 74 69 74 6c 65 20 6c 69 6e 65 6e 6f 3d 5c 22 25  title lineno=\"%
32b0: 64 5c 22 3e 4e 6f 74 20 46 6f 75 6e 64 3c 2f 74  d\">Not Found</t
32c0: 69 74 6c 65 3e 3c 2f 68 65 61 64 3e 5c 6e 22 0a  itle></head>\n".
32d0: 20 20 20 20 22 3c 62 6f 64 79 3e 3c 68 31 3e 44      "<body><h1>D
32e0: 6f 63 75 6d 65 6e 74 20 4e 6f 74 20 46 6f 75 6e  ocument Not Foun
32f0: 64 3c 2f 68 31 3e 5c 6e 22 0a 20 20 20 20 22 54  d</h1>\n".    "T
3300: 68 65 20 64 6f 63 75 6d 65 6e 74 20 25 73 20 69  he document %s i
3310: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
3320: 6f 6e 20 74 68 69 73 20 73 65 72 76 65 72 5c 6e  on this server\n
3330: 22 0a 20 20 20 20 22 3c 2f 62 6f 64 79 3e 5c 6e  ".    "</body>\n
3340: 22 2c 20 6c 69 6e 65 6e 6f 2c 20 7a 53 63 72 69  ", lineno, zScri
3350: 70 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e  pt);.  MakeLogEn
3360: 74 72 79 28 30 29 3b 0a 20 20 65 78 69 74 28 30  try(0);.  exit(0
3370: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c  );.}../*.** Tell
3380: 20 74 68 65 20 63 6c 69 65 6e 74 20 74 68 61 74   the client that
3390: 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 77 65   they are not we
33a0: 6c 63 6f 6d 65 64 20 68 65 72 65 2e 0a 2a 2f 0a  lcomed here..*/.
33b0: 73 74 61 74 69 63 20 76 6f 69 64 20 46 6f 72 62  static void Forb
33c0: 69 64 64 65 6e 28 76 6f 69 64 29 7b 0a 20 20 53  idden(void){.  S
33d0: 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 34 30  tartResponse("40
33e0: 33 20 46 6f 72 62 69 64 64 65 6e 22 29 3b 0a 20  3 Forbidden");. 
33f0: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
3400: 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79  .    "Content-ty
3410: 70 65 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c 72  pe: text/plain\r
3420: 5c 6e 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20  \n".    "\r\n". 
3430: 20 20 20 22 41 63 63 65 73 73 20 64 65 6e 69 65     "Access denie
3440: 64 5c 6e 22 0a 20 20 29 3b 0a 20 20 63 6c 6f 73  d\n".  );.  clos
3450: 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 31 3b  eConnection = 1;
3460: 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28  .  MakeLogEntry(
3470: 30 29 3b 0a 20 20 65 78 69 74 28 30 29 3b 0a 7d  0);.  exit(0);.}
3480: 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68 65  ../*.** Tell the
3490: 20 63 6c 69 65 6e 74 20 74 68 61 74 20 61 75 74   client that aut
34a0: 68 6f 72 69 7a 61 74 69 6f 6e 20 69 73 20 72 65  horization is re
34b0: 71 75 69 72 65 64 20 74 6f 20 61 63 63 65 73 73  quired to access
34c0: 20 74 68 65 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74   the.** document
34d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
34e0: 20 4e 6f 74 41 75 74 68 6f 72 69 7a 65 64 28 63   NotAuthorized(c
34f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 61 6c  onst char *zReal
3500: 6d 29 7b 0a 20 20 53 74 61 72 74 52 65 73 70 6f  m){.  StartRespo
3510: 6e 73 65 28 22 34 30 31 20 41 75 74 68 6f 72 69  nse("401 Authori
3520: 7a 61 74 69 6f 6e 20 52 65 71 75 69 72 65 64 22  zation Required"
3530: 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69  );.  nOut += pri
3540: 6e 74 66 28 0a 20 20 20 20 22 57 57 57 2d 41 75  ntf(.    "WWW-Au
3550: 74 68 65 6e 74 69 63 61 74 65 3a 20 42 61 73 69  thenticate: Basi
3560: 63 20 72 65 61 6c 6d 3d 5c 22 25 73 5c 22 5c 72  c realm=\"%s\"\r
3570: 5c 6e 22 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74  \n".    "Content
3580: 2d 74 79 70 65 3a 20 74 65 78 74 2f 68 74 6d 6c  -type: text/html
3590: 5c 72 5c 6e 22 0a 20 20 20 20 22 5c 72 5c 6e 22  \r\n".    "\r\n"
35a0: 0a 20 20 20 20 22 3c 68 65 61 64 3e 3c 74 69 74  .    "<head><tit
35b0: 6c 65 3e 4e 6f 74 20 41 75 74 68 6f 72 69 7a 65  le>Not Authorize
35c0: 64 3c 2f 74 69 74 6c 65 3e 3c 2f 68 65 61 64 3e  d</title></head>
35d0: 5c 6e 22 0a 20 20 20 20 22 3c 62 6f 64 79 3e 3c  \n".    "<body><
35e0: 68 31 3e 34 30 31 20 4e 6f 74 20 41 75 74 68 6f  h1>401 Not Autho
35f0: 72 69 7a 65 64 3c 2f 68 31 3e 5c 6e 22 0a 20 20  rized</h1>\n".  
3600: 20 20 22 41 20 6c 6f 67 69 6e 20 61 6e 64 20 70    "A login and p
3610: 61 73 73 77 6f 72 64 20 61 72 65 20 72 65 71 75  assword are requ
3620: 69 72 65 64 20 66 6f 72 20 74 68 69 73 20 64 6f  ired for this do
3630: 63 75 6d 65 6e 74 5c 6e 22 0a 20 20 20 20 22 3c  cument\n".    "<
3640: 2f 62 6f 64 79 3e 5c 6e 22 2c 20 7a 52 65 61 6c  /body>\n", zReal
3650: 6d 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74  m);.  MakeLogEnt
3660: 72 79 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ry(0);.}../*.** 
3670: 54 65 6c 6c 20 74 68 65 20 63 6c 69 65 6e 74 20  Tell the client 
3680: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 6e  that there is an
3690: 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 73 63   error in the sc
36a0: 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ript..*/.static 
36b0: 76 6f 69 64 20 43 67 69 45 72 72 6f 72 28 76 6f  void CgiError(vo
36c0: 69 64 29 7b 0a 20 20 53 74 61 72 74 52 65 73 70  id){.  StartResp
36d0: 6f 6e 73 65 28 22 35 30 30 20 45 72 72 6f 72 22  onse("500 Error"
36e0: 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69  );.  nOut += pri
36f0: 6e 74 66 28 0a 20 20 20 20 22 43 6f 6e 74 65 6e  ntf(.    "Conten
3700: 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 68 74 6d  t-type: text/htm
3710: 6c 5c 72 5c 6e 22 0a 20 20 20 20 22 5c 72 5c 6e  l\r\n".    "\r\n
3720: 22 0a 20 20 20 20 22 3c 68 65 61 64 3e 3c 74 69  ".    "<head><ti
3730: 74 6c 65 3e 43 47 49 20 50 72 6f 67 72 61 6d 20  tle>CGI Program 
3740: 45 72 72 6f 72 3c 2f 74 69 74 6c 65 3e 3c 2f 68  Error</title></h
3750: 65 61 64 3e 5c 6e 22 0a 20 20 20 20 22 3c 62 6f  ead>\n".    "<bo
3760: 64 79 3e 3c 68 31 3e 43 47 49 20 50 72 6f 67 72  dy><h1>CGI Progr
3770: 61 6d 20 45 72 72 6f 72 3c 2f 68 31 3e 5c 6e 22  am Error</h1>\n"
3780: 0a 20 20 20 20 22 54 68 65 20 43 47 49 20 70 72  .    "The CGI pr
3790: 6f 67 72 61 6d 20 25 73 20 67 65 6e 65 72 61 74  ogram %s generat
37a0: 65 64 20 61 6e 20 65 72 72 6f 72 5c 6e 22 0a 20  ed an error\n". 
37b0: 20 20 20 22 3c 2f 62 6f 64 79 3e 5c 6e 22 2c 20     "</body>\n", 
37c0: 7a 53 63 72 69 70 74 29 3b 0a 20 20 4d 61 6b 65  zScript);.  Make
37d0: 4c 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20 20 65  LogEntry(0);.  e
37e0: 78 69 74 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xit(0);.}../*.**
37f0: 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
3800: 69 66 20 77 65 20 74 69 6d 65 6f 75 74 20 6f 72  if we timeout or
3810: 20 63 61 74 63 68 20 73 6f 6d 65 20 6f 74 68 65   catch some othe
3820: 72 20 6b 69 6e 64 20 6f 66 20 73 69 67 6e 61 6c  r kind of signal
3830: 2e 0a 2a 2a 20 4c 6f 67 20 61 6e 20 65 72 72 6f  ..** Log an erro
3840: 72 20 63 6f 64 65 20 77 68 69 63 68 20 69 73 20  r code which is 
3850: 39 30 30 2b 69 53 69 67 20 61 6e 64 20 74 68 65  900+iSig and the
3860: 6e 20 71 75 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  n quit..*/.stati
3870: 63 20 76 6f 69 64 20 54 69 6d 65 6f 75 74 28 69  c void Timeout(i
3880: 6e 74 20 69 53 69 67 29 7b 0a 20 20 69 66 28 20  nt iSig){.  if( 
3890: 21 64 65 62 75 67 46 6c 61 67 20 29 7b 0a 20 20  !debugFlag ){.  
38a0: 20 20 69 66 28 20 7a 53 63 72 69 70 74 20 26 26    if( zScript &&
38b0: 20 7a 53 63 72 69 70 74 5b 30 5d 20 29 7b 0a 20   zScript[0] ){. 
38c0: 20 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 31       char zBuf[1
38d0: 30 5d 3b 0a 20 20 20 20 20 20 7a 42 75 66 5b 30  0];.      zBuf[0
38e0: 5d 20 3d 20 27 39 27 3b 0a 20 20 20 20 20 20 7a  ] = '9';.      z
38f0: 42 75 66 5b 31 5d 20 3d 20 27 30 27 20 2b 20 28  Buf[1] = '0' + (
3900: 69 53 69 67 2f 31 30 29 25 31 30 3b 0a 20 20 20  iSig/10)%10;.   
3910: 20 20 20 7a 42 75 66 5b 32 5d 20 3d 20 27 30 27     zBuf[2] = '0'
3920: 20 2b 20 69 53 69 67 25 31 30 3b 0a 20 20 20 20   + iSig%10;.    
3930: 20 20 7a 42 75 66 5b 33 5d 20 3d 20 30 3b 0a 20    zBuf[3] = 0;. 
3940: 20 20 20 20 20 73 74 72 63 70 79 28 7a 52 65 70       strcpy(zRep
3950: 6c 79 53 74 61 74 75 73 2c 20 7a 42 75 66 29 3b  lyStatus, zBuf);
3960: 0a 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e  .      MakeLogEn
3970: 74 72 79 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20  try(0);.    }.  
3980: 20 20 65 78 69 74 28 30 29 3b 0a 20 20 7d 0a 7d    exit(0);.  }.}
3990: 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68 65  ../*.** Tell the
39a0: 20 63 6c 69 65 6e 74 20 74 68 61 74 20 74 68 65   client that the
39b0: 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69  re is an error i
39c0: 6e 20 74 68 65 20 73 63 72 69 70 74 2e 0a 2a 2f  n the script..*/
39d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 67 69  .static void Cgi
39e0: 53 63 72 69 70 74 57 72 69 74 61 62 6c 65 28 76  ScriptWritable(v
39f0: 6f 69 64 29 7b 0a 20 20 53 74 61 72 74 52 65 73  oid){.  StartRes
3a00: 70 6f 6e 73 65 28 22 35 30 30 20 43 47 49 20 43  ponse("500 CGI C
3a10: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 45 72 72  onfiguration Err
3a20: 6f 72 22 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20  or");.  nOut += 
3a30: 70 72 69 6e 74 66 28 0a 20 20 20 20 22 43 6f 6e  printf(.    "Con
3a40: 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f  tent-type: text/
3a50: 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 22  plain\r\n".    "
3a60: 5c 72 5c 6e 22 0a 20 20 20 20 22 54 68 65 20 43  \r\n".    "The C
3a70: 47 49 20 70 72 6f 67 72 61 6d 20 25 73 20 69 73  GI program %s is
3a80: 20 77 72 69 74 61 62 6c 65 20 62 79 20 75 73 65   writable by use
3a90: 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 69 74  rs other than it
3aa0: 73 20 6f 77 6e 65 72 2e 5c 6e 22 2c 0a 20 20 20  s owner.\n",.   
3ab0: 20 7a 52 65 61 6c 53 63 72 69 70 74 29 3b 0a 20   zRealScript);. 
3ac0: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 29   MakeLogEntry(0)
3ad0: 3b 0a 20 20 65 78 69 74 28 30 29 3b 20 20 20 20  ;.  exit(0);    
3ae0: 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c     .}../*.** Tel
3af0: 6c 20 74 68 65 20 63 6c 69 65 6e 74 20 74 68 61  l the client tha
3b00: 74 20 74 68 65 20 73 65 72 76 65 72 20 6d 61 6c  t the server mal
3b10: 66 75 6e 63 74 69 6f 6e 65 64 2e 0a 2a 2f 0a 73  functioned..*/.s
3b20: 74 61 74 69 63 20 76 6f 69 64 20 4d 61 6c 66 75  tatic void Malfu
3b30: 6e 63 74 69 6f 6e 28 69 6e 74 20 6c 69 6e 65 6e  nction(int linen
3b40: 75 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  um, const char *
3b50: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
3b60: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76   va_list ap;.  v
3b70: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
3b80: 6d 61 74 29 3b 0a 20 20 53 74 61 72 74 52 65 73  mat);.  StartRes
3b90: 70 6f 6e 73 65 28 22 35 30 30 20 53 65 72 76 65  ponse("500 Serve
3ba0: 72 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 22 29 3b  r Malfunction");
3bb0: 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74  .  nOut += print
3bc0: 66 28 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d  f(.    "Content-
3bd0: 74 79 70 65 3a 20 74 65 78 74 2f 70 6c 61 69 6e  type: text/plain
3be0: 5c 72 5c 6e 22 0a 20 20 20 20 22 5c 72 5c 6e 22  \r\n".    "\r\n"
3bf0: 0a 20 20 20 20 22 57 65 62 20 73 65 72 76 65 72  .    "Web server
3c00: 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 65 64 3b 20   malfunctioned; 
3c10: 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 25 64 5c  error number %d\
3c20: 6e 5c 6e 22 2c 20 6c 69 6e 65 6e 75 6d 29 3b 0a  n\n", linenum);.
3c30: 20 20 69 66 28 20 7a 46 6f 72 6d 61 74 20 29 7b    if( zFormat ){
3c40: 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 76 70 72  .    nOut += vpr
3c50: 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70  intf(zFormat, ap
3c60: 29 3b 0a 20 20 7d 0a 20 20 4d 61 6b 65 4c 6f 67  );.  }.  MakeLog
3c70: 45 6e 74 72 79 28 30 29 3b 0a 20 20 65 78 69 74  Entry(0);.  exit
3c80: 28 30 29 3b 20 20 20 20 20 20 20 0a 7d 0a 0a 2f  (0);       .}../
3c90: 2a 0a 2a 2a 20 44 6f 20 61 20 73 65 72 76 65 72  *.** Do a server
3ca0: 20 72 65 64 69 72 65 63 74 20 74 6f 20 74 68 65   redirect to the
3cb0: 20 64 6f 63 75 6d 65 6e 74 20 73 70 65 63 69 66   document specif
3cc0: 69 65 64 2e 20 20 54 68 65 20 64 6f 63 75 6d 65  ied.  The docume
3cd0: 6e 74 0a 2a 2a 20 6e 61 6d 65 20 6e 6f 74 20 63  nt.** name not c
3ce0: 6f 6e 74 61 69 6e 20 73 63 68 65 6d 65 20 6f 72  ontain scheme or
3cf0: 20 6e 65 74 77 6f 72 6b 20 6c 6f 63 61 74 69 6f   network locatio
3d00: 6e 20 6f 72 20 74 68 65 20 71 75 65 72 79 20 73  n or the query s
3d10: 74 72 69 6e 67 2e 0a 2a 2a 20 49 74 20 77 69 6c  tring..** It wil
3d20: 6c 20 62 65 20 6a 75 73 74 20 74 68 65 20 70 61  l be just the pa
3d30: 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  th..*/.static vo
3d40: 69 64 20 52 65 64 69 72 65 63 74 28 63 6f 6e 73  id Redirect(cons
3d50: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69  t char *zPath, i
3d60: 6e 74 20 66 69 6e 69 73 68 29 7b 0a 20 20 53 74  nt finish){.  St
3d70: 61 72 74 52 65 73 70 6f 6e 73 65 28 22 33 30 32  artResponse("302
3d80: 20 54 65 6d 70 6f 72 61 72 79 20 52 65 64 69 72   Temporary Redir
3d90: 65 63 74 22 29 3b 0a 20 20 69 66 28 20 7a 53 65  ect");.  if( zSe
3da0: 72 76 65 72 50 6f 72 74 3d 3d 30 20 7c 7c 20 7a  rverPort==0 || z
3db0: 53 65 72 76 65 72 50 6f 72 74 5b 30 5d 3d 3d 30  ServerPort[0]==0
3dc0: 20 7c 7c 20 73 74 72 63 6d 70 28 7a 53 65 72 76   || strcmp(zServ
3dd0: 65 72 50 6f 72 74 2c 22 38 30 22 29 3d 3d 30 20  erPort,"80")==0 
3de0: 29 7b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70  ){.    nOut += p
3df0: 72 69 6e 74 66 28 22 4c 6f 63 61 74 69 6f 6e 3a  rintf("Location:
3e00: 20 25 73 3a 2f 2f 25 73 25 73 25 73 5c 72 5c 6e   %s://%s%s%s\r\n
3e10: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
3e20: 20 20 20 20 20 20 7a 48 74 74 70 2c 20 7a 53 65        zHttp, zSe
3e30: 72 76 65 72 4e 61 6d 65 2c 20 7a 50 61 74 68 2c  rverName, zPath,
3e40: 20 7a 51 75 65 72 79 53 75 66 66 69 78 29 3b 0a   zQuerySuffix);.
3e50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 75    }else{.    nOu
3e60: 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 4c 6f 63  t += printf("Loc
3e70: 61 74 69 6f 6e 3a 20 25 73 3a 2f 2f 25 73 3a 25  ation: %s://%s:%
3e80: 73 25 73 25 73 5c 72 5c 6e 22 2c 0a 20 20 20 20  s%s%s\r\n",.    
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
3ea0: 48 74 74 70 2c 20 7a 53 65 72 76 65 72 4e 61 6d  Http, zServerNam
3eb0: 65 2c 20 7a 53 65 72 76 65 72 50 6f 72 74 2c 20  e, zServerPort, 
3ec0: 7a 50 61 74 68 2c 20 7a 51 75 65 72 79 53 75 66  zPath, zQuerySuf
3ed0: 66 69 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  fix);.  }.  if( 
3ee0: 66 69 6e 69 73 68 20 29 7b 0a 20 20 20 20 6e 4f  finish ){.    nO
3ef0: 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f  ut += printf("Co
3f00: 6e 74 65 6e 74 2d 6c 65 6e 67 74 68 3a 20 30 5c  ntent-length: 0\
3f10: 72 5c 6e 22 29 3b 0a 20 20 20 20 6e 4f 75 74 20  r\n");.    nOut 
3f20: 2b 3d 20 70 72 69 6e 74 66 28 22 5c 72 5c 6e 22  += printf("\r\n"
3f30: 29 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e  );.    MakeLogEn
3f40: 74 72 79 28 30 29 3b 0a 20 20 7d 0a 20 20 66 66  try(0);.  }.  ff
3f50: 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 7d 0a  lush(stdout);.}.
3f60: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
3f70: 74 69 6f 6e 20 74 72 65 61 74 73 20 69 74 73 20  tion treats its 
3f80: 69 6e 70 75 74 20 61 73 20 61 20 62 61 73 65 2d  input as a base-
3f90: 36 34 20 73 74 72 69 6e 67 20 61 6e 64 20 72 65  64 string and re
3fa0: 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 64 65 63  turns the.** dec
3fb0: 6f 64 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68  oded value of th
3fc0: 61 74 20 73 74 72 69 6e 67 2e 20 20 43 68 61 72  at string.  Char
3fd0: 61 63 74 65 72 73 20 6f 66 20 69 6e 70 75 74 20  acters of input 
3fe0: 74 68 61 74 20 61 72 65 20 6e 6f 74 0a 2a 2a 20  that are not.** 
3ff0: 76 61 6c 69 64 20 62 61 73 65 2d 36 34 20 63 68  valid base-64 ch
4000: 61 72 61 63 74 65 72 73 20 28 73 75 63 68 20 61  aracters (such a
4010: 73 20 73 70 61 63 65 73 20 61 6e 64 20 6e 65 77  s spaces and new
4020: 6c 69 6e 65 73 29 20 61 72 65 20 69 67 6e 6f 72  lines) are ignor
4030: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 44 65 63 6f  ed..*/.void Deco
4040: 64 65 36 34 28 63 68 61 72 20 2a 7a 36 34 29 7b  de64(char *z64){
4050: 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 61 3b 0a  .  char *zData;.
4060: 20 20 69 6e 74 20 6e 36 34 3b 0a 20 20 69 6e 74    int n64;.  int
4070: 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 61 2c 20   i, j;.  int a, 
4080: 62 2c 20 63 2c 20 64 3b 0a 20 20 73 74 61 74 69  b, c, d;.  stati
4090: 63 20 69 6e 74 20 69 73 49 6e 69 74 20 3d 20 30  c int isInit = 0
40a0: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 74  ;.  static int t
40b0: 72 61 6e 73 5b 31 32 38 5d 3b 0a 20 20 73 74 61  rans[128];.  sta
40c0: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61  tic unsigned cha
40d0: 72 20 7a 42 61 73 65 5b 5d 20 3d 20 0a 20 20 20  r zBase[] = .   
40e0: 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
40f0: 4f 50 51 52 53 54 55 56 57 58 59 5a 61 62 63 64  OPQRSTUVWXYZabcd
4100: 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
4110: 75 76 77 78 79 7a 30 31 32 33 34 35 36 37 38 39  uvwxyz0123456789
4120: 2b 2f 22 3b 0a 0a 20 20 69 66 28 20 21 69 73 49  +/";..  if( !isI
4130: 6e 69 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  nit ){.    for(i
4140: 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b 29 7b  =0; i<128; i++){
4150: 20 74 72 61 6e 73 5b 69 5d 20 3d 20 30 3b 20 7d   trans[i] = 0; }
4160: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 42  .    for(i=0; zB
4170: 61 73 65 5b 69 5d 3b 20 69 2b 2b 29 7b 20 74 72  ase[i]; i++){ tr
4180: 61 6e 73 5b 7a 42 61 73 65 5b 69 5d 20 26 20 30  ans[zBase[i] & 0
4190: 78 37 66 5d 20 3d 20 69 3b 20 7d 0a 20 20 20 20  x7f] = i; }.    
41a0: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a  isInit = 1;.  }.
41b0: 20 20 6e 36 34 20 3d 20 73 74 72 6c 65 6e 28 7a    n64 = strlen(z
41c0: 36 34 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 36  64);.  while( n6
41d0: 34 3e 30 20 26 26 20 7a 36 34 5b 6e 36 34 2d 31  4>0 && z64[n64-1
41e0: 5d 3d 3d 27 3d 27 20 29 20 6e 36 34 2d 2d 3b 0a  ]=='=' ) n64--;.
41f0: 20 20 7a 44 61 74 61 20 3d 20 7a 36 34 3b 0a 20    zData = z64;. 
4200: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 2b 33 3c   for(i=j=0; i+3<
4210: 6e 36 34 3b 20 69 2b 3d 34 29 7b 0a 20 20 20 20  n64; i+=4){.    
4220: 61 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 5d  a = trans[z64[i]
4230: 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 62 20   & 0x7f];.    b 
4240: 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b 31 5d  = trans[z64[i+1]
4250: 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 63 20   & 0x7f];.    c 
4260: 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b 32 5d  = trans[z64[i+2]
4270: 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 64 20   & 0x7f];.    d 
4280: 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b 33 5d  = trans[z64[i+3]
4290: 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 7a 44   & 0x7f];.    zD
42a0: 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28 61 3c 3c  ata[j++] = ((a<<
42b0: 32 29 20 26 20 30 78 66 63 29 20 7c 20 28 28 62  2) & 0xfc) | ((b
42c0: 3e 3e 34 29 20 26 20 30 78 30 33 29 3b 0a 20 20  >>4) & 0x03);.  
42d0: 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28    zData[j++] = (
42e0: 28 62 3c 3c 34 29 20 26 20 30 78 66 30 29 20 7c  (b<<4) & 0xf0) |
42f0: 20 28 28 63 3e 3e 32 29 20 26 20 30 78 30 66 29   ((c>>2) & 0x0f)
4300: 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d  ;.    zData[j++]
4310: 20 3d 20 28 28 63 3c 3c 36 29 20 26 20 30 78 63   = ((c<<6) & 0xc
4320: 30 29 20 7c 20 28 64 20 26 20 30 78 33 66 29 3b  0) | (d & 0x3f);
4330: 0a 20 20 7d 0a 20 20 69 66 28 20 69 2b 32 3c 6e  .  }.  if( i+2<n
4340: 36 34 20 29 7b 0a 20 20 20 20 61 20 3d 20 74 72  64 ){.    a = tr
4350: 61 6e 73 5b 7a 36 34 5b 69 5d 20 26 20 30 78 37  ans[z64[i] & 0x7
4360: 66 5d 3b 0a 20 20 20 20 62 20 3d 20 74 72 61 6e  f];.    b = tran
4370: 73 5b 7a 36 34 5b 69 2b 31 5d 20 26 20 30 78 37  s[z64[i+1] & 0x7
4380: 66 5d 3b 0a 20 20 20 20 63 20 3d 20 74 72 61 6e  f];.    c = tran
4390: 73 5b 7a 36 34 5b 69 2b 32 5d 20 26 20 30 78 37  s[z64[i+2] & 0x7
43a0: 66 5d 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b  f];.    zData[j+
43b0: 2b 5d 20 3d 20 28 28 61 3c 3c 32 29 20 26 20 30  +] = ((a<<2) & 0
43c0: 78 66 63 29 20 7c 20 28 28 62 3e 3e 34 29 20 26  xfc) | ((b>>4) &
43d0: 20 30 78 30 33 29 3b 0a 20 20 20 20 7a 44 61 74   0x03);.    zDat
43e0: 61 5b 6a 2b 2b 5d 20 3d 20 28 28 62 3c 3c 34 29  a[j++] = ((b<<4)
43f0: 20 26 20 30 78 66 30 29 20 7c 20 28 28 63 3e 3e   & 0xf0) | ((c>>
4400: 32 29 20 26 20 30 78 30 66 29 3b 0a 20 20 7d 65  2) & 0x0f);.  }e
4410: 6c 73 65 20 69 66 28 20 69 2b 31 3c 6e 36 34 20  lse if( i+1<n64 
4420: 29 7b 0a 20 20 20 20 61 20 3d 20 74 72 61 6e 73  ){.    a = trans
4430: 5b 7a 36 34 5b 69 5d 20 26 20 30 78 37 66 5d 3b  [z64[i] & 0x7f];
4440: 0a 20 20 20 20 62 20 3d 20 74 72 61 6e 73 5b 7a  .    b = trans[z
4450: 36 34 5b 69 2b 31 5d 20 26 20 30 78 37 66 5d 3b  64[i+1] & 0x7f];
4460: 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20  .    zData[j++] 
4470: 3d 20 28 28 61 3c 3c 32 29 20 26 20 30 78 66 63  = ((a<<2) & 0xfc
4480: 29 20 7c 20 28 28 62 3e 3e 34 29 20 26 20 30 78  ) | ((b>>4) & 0x
4490: 30 33 29 3b 0a 20 20 7d 0a 20 20 7a 44 61 74 61  03);.  }.  zData
44a0: 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  [j] = 0;.}../*.*
44b0: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
44c0: 66 20 62 61 73 69 63 20 61 75 74 68 6f 72 69 7a  f basic authoriz
44d0: 61 74 69 6f 6e 20 63 72 65 64 65 6e 74 69 61 6c  ation credential
44e0: 73 20 61 72 65 20 70 72 6f 76 69 64 65 64 20 66  s are provided f
44f0: 6f 72 0a 2a 2a 20 74 68 65 20 75 73 65 72 20 61  or.** the user a
4500: 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
4510: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 7a  information in z
4520: 41 75 74 68 46 69 6c 65 2e 20 20 52 65 74 75 72  AuthFile.  Retur
4530: 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 61 75 74  n true.** if aut
4540: 68 6f 72 69 7a 65 64 2e 20 20 52 65 74 75 72 6e  horized.  Return
4550: 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 61 75   false if not au
4560: 74 68 6f 72 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20  thorized..**.** 
4570: 46 69 6c 65 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a  File format:.**.
4580: 2a 2a 20 20 20 20 2a 20 20 42 6c 61 6e 6b 20 6c  **    *  Blank l
4590: 69 6e 65 73 20 61 6e 64 20 6c 69 6e 65 73 20 74  ines and lines t
45a0: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 27  hat begin with '
45b0: 23 27 20 61 72 65 20 69 67 6e 6f 72 65 64 0a 2a  #' are ignored.*
45c0: 2a 20 20 20 20 2a 20 20 22 68 74 74 70 2d 72 65  *    *  "http-re
45d0: 64 69 72 65 63 74 22 20 66 6f 72 63 65 73 20 61  direct" forces a
45e0: 20 72 65 64 69 72 65 63 74 20 74 6f 20 48 54 54   redirect to HTT
45f0: 50 53 20 69 66 20 6e 6f 74 20 74 68 65 72 65 20  PS if not there 
4600: 61 6c 72 65 61 64 79 0a 2a 2a 20 20 20 20 2a 20  already.**    * 
4610: 20 22 68 74 74 70 73 2d 6f 6e 6c 79 22 20 64 69   "https-only" di
4620: 73 61 6c 6c 6f 77 73 20 6f 70 65 72 61 74 69 6f  sallows operatio
4630: 6e 20 69 6e 20 48 54 54 50 0a 2a 2a 20 20 20 20  n in HTTP.**    
4640: 2a 20 20 22 75 73 65 72 20 4e 41 4d 45 20 4c 4f  *  "user NAME LO
4650: 47 49 4e 3a 50 41 53 53 57 4f 52 44 22 20 63 68  GIN:PASSWORD" ch
4660: 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 4c  ecks to see if L
4670: 4f 47 49 4e 3a 50 41 53 53 57 4f 52 44 20 0a 2a  OGIN:PASSWORD .*
4680: 2a 20 20 20 20 20 20 20 61 75 74 68 6f 72 69 7a  *       authoriz
4690: 61 74 69 6f 6e 20 63 72 65 64 65 6e 74 69 61 6c  ation credential
46a0: 73 20 61 72 65 20 70 72 6f 76 69 64 65 64 2c 20  s are provided, 
46b0: 61 6e 64 20 69 66 20 73 6f 20 73 65 74 73 20 74  and if so sets t
46c0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 52 45 4d 4f  he.**       REMO
46d0: 54 45 5f 55 53 45 52 20 74 6f 20 4e 41 4d 45 2e  TE_USER to NAME.
46e0: 0a 2a 2a 20 20 20 20 2a 20 20 22 72 65 61 6c 6d  .**    *  "realm
46f0: 20 54 45 58 54 22 20 73 65 74 73 20 74 68 65 20   TEXT" sets the 
4700: 72 65 61 6c 6d 20 74 6f 20 54 45 58 54 2e 0a 2a  realm to TEXT..*
4710: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 43 68 65  /.static int Che
4720: 63 6b 42 61 73 69 63 41 75 74 68 6f 72 69 7a 61  ckBasicAuthoriza
4730: 74 69 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  tion(const char 
4740: 2a 7a 41 75 74 68 46 69 6c 65 29 7b 0a 20 20 46  *zAuthFile){.  F
4750: 49 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20  ILE *in;.  char 
4760: 2a 7a 52 65 61 6c 6d 20 3d 20 22 75 6e 6b 6e 6f  *zRealm = "unkno
4770: 77 6e 20 72 65 61 6c 6d 22 3b 0a 20 20 63 68 61  wn realm";.  cha
4780: 72 20 2a 7a 4c 6f 67 69 6e 50 73 77 64 3b 0a 20  r *zLoginPswd;. 
4790: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
47a0: 63 68 61 72 20 7a 4c 69 6e 65 5b 32 30 30 30 5d  char zLine[2000]
47b0: 3b 0a 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28  ;..  in = fopen(
47c0: 7a 41 75 74 68 46 69 6c 65 2c 20 22 72 22 29 3b  zAuthFile, "r");
47d0: 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a  .  if( in==0 ){.
47e0: 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c      NotFound(__L
47f0: 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 72 65 74 75  INE__);.    retu
4800: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
4810: 7a 41 75 74 68 41 72 67 20 29 20 44 65 63 6f 64  zAuthArg ) Decod
4820: 65 36 34 28 7a 41 75 74 68 41 72 67 29 3b 0a 20  e64(zAuthArg);. 
4830: 20 77 68 69 6c 65 28 20 66 67 65 74 73 28 7a 4c   while( fgets(zL
4840: 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c 69 6e  ine, sizeof(zLin
4850: 65 29 2c 20 69 6e 29 20 29 7b 0a 20 20 20 20 63  e), in) ){.    c
4860: 68 61 72 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 3b  har *zFieldName;
4870: 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 3b  .    char *zVal;
4880: 0a 0a 20 20 20 20 7a 46 69 65 6c 64 4e 61 6d 65  ..    zFieldName
4890: 20 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65   = GetFirstEleme
48a0: 6e 74 28 7a 4c 69 6e 65 2c 26 7a 56 61 6c 29 3b  nt(zLine,&zVal);
48b0: 0a 20 20 20 20 69 66 28 20 7a 46 69 65 6c 64 4e  .    if( zFieldN
48c0: 61 6d 65 3d 3d 30 20 7c 7c 20 2a 7a 46 69 65 6c  ame==0 || *zFiel
48d0: 64 4e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69  dName==0 ) conti
48e0: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 7a 46 69  nue;.    if( zFi
48f0: 65 6c 64 4e 61 6d 65 5b 30 5d 3d 3d 27 23 27 20  eldName[0]=='#' 
4900: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
4910: 52 65 6d 6f 76 65 4e 65 77 6c 69 6e 65 28 7a 56  RemoveNewline(zV
4920: 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72  al);.    if( str
4930: 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 20  cmp(zFieldName, 
4940: 22 72 65 61 6c 6d 22 29 3d 3d 30 20 29 7b 0a 20  "realm")==0 ){. 
4950: 20 20 20 20 20 7a 52 65 61 6c 6d 20 3d 20 53 74       zRealm = St
4960: 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20  rDup(zVal);.    
4970: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
4980: 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 75 73 65  (zFieldName,"use
4990: 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
49a0: 69 66 28 20 7a 41 75 74 68 41 72 67 3d 3d 30 20  if( zAuthArg==0 
49b0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
49c0: 20 20 7a 4e 61 6d 65 20 3d 20 47 65 74 46 69 72    zName = GetFir
49d0: 73 74 45 6c 65 6d 65 6e 74 28 7a 56 61 6c 2c 20  stElement(zVal, 
49e0: 26 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 7a 4c  &zVal);.      zL
49f0: 6f 67 69 6e 50 73 77 64 20 3d 20 47 65 74 46 69  oginPswd = GetFi
4a00: 72 73 74 45 6c 65 6d 65 6e 74 28 7a 56 61 6c 2c  rstElement(zVal,
4a10: 20 26 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 69   &zVal);.      i
4a20: 66 28 20 7a 4c 6f 67 69 6e 50 73 77 64 3d 3d 30  f( zLoginPswd==0
4a30: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
4a40: 20 20 20 69 66 28 20 7a 41 75 74 68 41 72 67 20     if( zAuthArg 
4a50: 26 26 20 73 74 72 63 6d 70 28 7a 41 75 74 68 41  && strcmp(zAuthA
4a60: 72 67 2c 7a 4c 6f 67 69 6e 50 73 77 64 29 3d 3d  rg,zLoginPswd)==
4a70: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65  0 ){.        zRe
4a80: 6d 6f 74 65 55 73 65 72 20 3d 20 53 74 72 44 75  moteUser = StrDu
4a90: 70 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  p(zName);.      
4aa0: 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
4ab0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
4ac0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
4ad0: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69  e if( strcmp(zFi
4ae0: 65 6c 64 4e 61 6d 65 2c 22 68 74 74 70 73 2d 6f  eldName,"https-o
4af0: 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nly")==0 ){.    
4b00: 20 20 69 66 28 20 21 75 73 65 48 74 74 70 73 20    if( !useHttps 
4b10: 29 7b 0a 20 20 20 20 20 20 20 20 4e 6f 74 46 6f  ){.        NotFo
4b20: 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  und(__LINE__);. 
4b30: 20 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69 6e         fclose(in
4b40: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
4b50: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
4b60: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
4b70: 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 68 74  p(zFieldName,"ht
4b80: 74 70 2d 72 65 64 69 72 65 63 74 22 29 3d 3d 30  tp-redirect")==0
4b90: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 75   ){.      if( !u
4ba0: 73 65 48 74 74 70 73 20 29 7b 0a 20 20 20 20 20  seHttps ){.     
4bb0: 20 20 20 7a 48 74 74 70 20 3d 20 22 68 74 74 70     zHttp = "http
4bc0: 73 22 3b 0a 20 20 20 20 20 20 20 20 73 70 72 69  s";.        spri
4bd0: 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 25 73 25 73  ntf(zLine, "%s%s
4be0: 22 2c 20 7a 53 63 72 69 70 74 2c 20 7a 50 61 74  ", zScript, zPat
4bf0: 68 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  hInfo);.        
4c00: 52 65 64 69 72 65 63 74 28 7a 4c 69 6e 65 2c 20  Redirect(zLine, 
4c10: 31 29 3b 0a 20 20 20 20 20 20 20 20 66 63 6c 6f  1);.        fclo
4c20: 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  se(in);.        
4c30: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
4c40: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
4c50: 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49     NotFound(__LI
4c60: 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 66 63 6c  NE__);.      fcl
4c70: 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 72  ose(in);.      r
4c80: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
4c90: 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b   }.  fclose(in);
4ca0: 0a 20 20 4e 6f 74 41 75 74 68 6f 72 69 7a 65 64  .  NotAuthorized
4cb0: 28 7a 52 65 61 6c 6d 29 3b 0a 20 20 72 65 74 75  (zRealm);.  retu
4cc0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
4cd0: 75 65 73 73 20 74 68 65 20 6d 69 6d 65 2d 74 79  uess the mime-ty
4ce0: 70 65 20 6f 66 20 61 20 64 6f 63 75 6d 65 6e 74  pe of a document
4cf0: 20 62 61 73 65 64 20 6f 6e 20 69 74 73 20 6e 61   based on its na
4d00: 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  me..*/.const cha
4d10: 72 20 2a 47 65 74 4d 69 6d 65 54 79 70 65 28 63  r *GetMimeType(c
4d20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
4d30: 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20  , int nName){.  
4d40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
4d50: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 66 69   int i;.  int fi
4d60: 72 73 74 2c 20 6c 61 73 74 3b 0a 20 20 69 6e 74  rst, last;.  int
4d70: 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20 7a 53 75   len;.  char zSu
4d80: 66 66 69 78 5b 32 30 5d 3b 0a 0a 20 20 2f 2a 20  ffix[20];..  /* 
4d90: 41 20 74 61 62 6c 65 20 6f 66 20 6d 69 6d 65 74  A table of mimet
4da0: 79 70 65 73 20 62 61 73 65 64 20 6f 6e 20 66 69  ypes based on fi
4db0: 6c 65 20 73 75 66 66 69 78 65 73 2e 20 0a 20 20  le suffixes. .  
4dc0: 2a 2a 20 53 75 66 66 69 78 65 73 20 6d 75 73 74  ** Suffixes must
4dd0: 20 62 65 20 69 6e 20 73 6f 72 74 65 64 20 6f 72   be in sorted or
4de0: 64 65 72 20 73 6f 20 74 68 61 74 20 77 65 20 63  der so that we c
4df0: 61 6e 20 64 6f 20 61 20 62 69 6e 61 72 79 0a 20  an do a binary. 
4e00: 20 2a 2a 20 73 65 61 72 63 68 20 74 6f 20 66 69   ** search to fi
4e10: 6e 64 20 74 68 65 20 6d 69 6d 65 2d 74 79 70 65  nd the mime-type
4e20: 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63  .  */.  static c
4e30: 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
4e40: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
4e50: 75 66 66 69 78 3b 20 20 20 20 20 20 20 2f 2a 20  uffix;       /* 
4e60: 54 68 65 20 66 69 6c 65 20 73 75 66 66 69 78 20  The file suffix 
4e70: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 3b  */.    int size;
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e90: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
4ea0: 68 65 20 73 75 66 66 69 78 20 2a 2f 0a 20 20 20  he suffix */.   
4eb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 69   const char *zMi
4ec0: 6d 65 74 79 70 65 3b 20 20 20 20 20 2f 2a 20 54  metype;     /* T
4ed0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
4ee0: 20 6d 69 6d 65 74 79 70 65 20 2a 2f 0a 20 20 7d   mimetype */.  }
4ef0: 20 61 4d 69 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20   aMime[] = {.   
4f00: 20 7b 20 22 61 69 22 2c 20 20 20 20 20 20 20 20   { "ai",        
4f10: 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   2, "application
4f20: 2f 70 6f 73 74 73 63 72 69 70 74 22 20 20 20 20  /postscript"    
4f30: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
4f40: 20 22 61 69 66 22 2c 20 20 20 20 20 20 20 20 33   "aif",        3
4f50: 2c 20 22 61 75 64 69 6f 2f 78 2d 61 69 66 66 22  , "audio/x-aiff"
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f70: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
4f80: 61 69 66 63 22 2c 20 20 20 20 20 20 20 34 2c 20  aifc",       4, 
4f90: 22 61 75 64 69 6f 2f 78 2d 61 69 66 66 22 20 20  "audio/x-aiff"  
4fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fb0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 69      },.    { "ai
4fc0: 66 66 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61  ff",       4, "a
4fd0: 75 64 69 6f 2f 78 2d 61 69 66 66 22 20 20 20 20  udio/x-aiff"    
4fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ff0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 72 6a 22    },.    { "arj"
5000: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
5010: 6c 69 63 61 74 69 6f 6e 2f 78 2d 61 72 6a 2d 63  lication/x-arj-c
5020: 6f 6d 70 72 65 73 73 65 64 22 20 20 20 20 20 20  ompressed"      
5030: 7d 2c 0a 20 20 20 20 7b 20 22 61 73 63 22 2c 20  },.    { "asc", 
5040: 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f         3, "text/
5050: 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20 20  plain"          
5060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
5070: 0a 20 20 20 20 7b 20 22 61 73 66 22 2c 20 20 20  .    { "asf",   
5080: 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 78       3, "video/x
5090: 2d 6d 73 2d 61 73 66 22 20 20 20 20 20 20 20 20  -ms-asf"        
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
50b0: 20 20 20 7b 20 22 61 73 78 22 2c 20 20 20 20 20     { "asx",     
50c0: 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d     3, "video/x-m
50d0: 73 2d 61 73 78 22 20 20 20 20 20 20 20 20 20 20  s-asx"          
50e0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
50f0: 20 7b 20 22 61 75 22 2c 20 20 20 20 20 20 20 20   { "au",        
5100: 20 32 2c 20 22 61 75 64 69 6f 2f 75 6c 61 77 22   2, "audio/ulaw"
5110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5120: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5130: 20 22 61 76 69 22 2c 20 20 20 20 20 20 20 20 33   "avi",        3
5140: 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 76 69 64  , "video/x-msvid
5150: 65 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20  eo"             
5160: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5170: 62 61 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20  bat",        3, 
5180: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6d  "application/x-m
5190: 73 64 6f 73 2d 70 72 6f 67 72 61 6d 22 20 20 20  sdos-program"   
51a0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 62 63      },.    { "bc
51b0: 70 69 6f 22 2c 20 20 20 20 20 20 35 2c 20 22 61  pio",      5, "a
51c0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 62 63 70  pplication/x-bcp
51d0: 69 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20  io"             
51e0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 62 69 6e 22    },.    { "bin"
51f0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
5200: 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73  lication/octet-s
5210: 74 72 65 61 6d 22 20 20 20 20 20 20 20 20 20 20  tream"          
5220: 7d 2c 0a 20 20 20 20 7b 20 22 63 22 2c 20 20 20  },.    { "c",   
5230: 20 20 20 20 20 20 20 31 2c 20 22 74 65 78 74 2f         1, "text/
5240: 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20 20  plain"          
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
5260: 0a 20 20 20 20 7b 20 22 63 63 22 2c 20 20 20 20  .    { "cc",    
5270: 20 20 20 20 20 32 2c 20 22 74 65 78 74 2f 70 6c       2, "text/pl
5280: 61 69 6e 22 20 20 20 20 20 20 20 20 20 20 20 20  ain"            
5290: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
52a0: 20 20 20 7b 20 22 63 63 61 64 22 2c 20 20 20 20     { "ccad",    
52b0: 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69     4, "applicati
52c0: 6f 6e 2f 63 6c 61 72 69 73 63 61 64 22 20 20 20  on/clariscad"   
52d0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
52e0: 20 7b 20 22 63 64 66 22 2c 20 20 20 20 20 20 20   { "cdf",       
52f0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
5300: 2f 78 2d 6e 65 74 63 64 66 22 20 20 20 20 20 20  /x-netcdf"      
5310: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5320: 20 22 63 6c 61 73 73 22 2c 20 20 20 20 20 20 35   "class",      5
5330: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f  , "application/o
5340: 63 74 65 74 2d 73 74 72 65 61 6d 22 20 20 20 20  ctet-stream"    
5350: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5360: 63 6f 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20  cod",        3, 
5370: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76 6e 64  "application/vnd
5380: 2e 72 69 6d 2e 63 6f 64 22 20 20 20 20 20 20 20  .rim.cod"       
5390: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f      },.    { "co
53a0: 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  m",        3, "a
53b0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6d 73 64  pplication/x-msd
53c0: 6f 73 2d 70 72 6f 67 72 61 6d 22 20 20 20 20 20  os-program"     
53d0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 70 69 6f    },.    { "cpio
53e0: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70 70  ",       4, "app
53f0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 63 70 69 6f 22  lication/x-cpio"
5400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5410: 7d 2c 0a 20 20 20 20 7b 20 22 63 70 74 22 2c 20  },.    { "cpt", 
5420: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
5430: 63 61 74 69 6f 6e 2f 6d 61 63 2d 63 6f 6d 70 61  cation/mac-compa
5440: 63 74 70 72 6f 22 20 20 20 20 20 20 20 20 7d 2c  ctpro"        },
5450: 0a 20 20 20 20 7b 20 22 63 73 68 22 2c 20 20 20  .    { "csh",   
5460: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
5470: 74 69 6f 6e 2f 78 2d 63 73 68 22 20 20 20 20 20  tion/x-csh"     
5480: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5490: 20 20 20 7b 20 22 63 73 73 22 2c 20 20 20 20 20     { "css",     
54a0: 20 20 20 33 2c 20 22 74 65 78 74 2f 63 73 73 22     3, "text/css"
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54c0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
54d0: 20 7b 20 22 64 63 72 22 2c 20 20 20 20 20 20 20   { "dcr",       
54e0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
54f0: 2f 78 2d 64 69 72 65 63 74 6f 72 22 20 20 20 20  /x-director"    
5500: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5510: 20 22 64 65 62 22 2c 20 20 20 20 20 20 20 20 33   "deb",        3
5520: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
5530: 2d 64 65 62 69 61 6e 2d 70 61 63 6b 61 67 65 22  -debian-package"
5540: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5550: 64 69 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20  dir",        3, 
5560: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 64  "application/x-d
5570: 69 72 65 63 74 6f 72 22 20 20 20 20 20 20 20 20  irector"        
5580: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 6c      },.    { "dl
5590: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 76  ",         2, "v
55a0: 69 64 65 6f 2f 64 6c 22 20 20 20 20 20 20 20 20  ideo/dl"        
55b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55c0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 6d 73 22    },.    { "dms"
55d0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
55e0: 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73  lication/octet-s
55f0: 74 72 65 61 6d 22 20 20 20 20 20 20 20 20 20 20  tream"          
5600: 7d 2c 0a 20 20 20 20 7b 20 22 64 6f 63 22 2c 20  },.    { "doc", 
5610: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
5620: 63 61 74 69 6f 6e 2f 6d 73 77 6f 72 64 22 20 20  cation/msword"  
5630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
5640: 0a 20 20 20 20 7b 20 22 64 72 77 22 2c 20 20 20  .    { "drw",   
5650: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
5660: 74 69 6f 6e 2f 64 72 61 66 74 69 6e 67 22 20 20  tion/drafting"  
5670: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5680: 20 20 20 7b 20 22 64 76 69 22 2c 20 20 20 20 20     { "dvi",     
5690: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
56a0: 6f 6e 2f 78 2d 64 76 69 22 20 20 20 20 20 20 20  on/x-dvi"       
56b0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
56c0: 20 7b 20 22 64 77 67 22 2c 20 20 20 20 20 20 20   { "dwg",       
56d0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
56e0: 2f 61 63 61 64 22 20 20 20 20 20 20 20 20 20 20  /acad"          
56f0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5700: 20 22 64 78 66 22 2c 20 20 20 20 20 20 20 20 33   "dxf",        3
5710: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 64  , "application/d
5720: 78 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20  xf"             
5730: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5740: 64 78 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20  dxr",        3, 
5750: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 64  "application/x-d
5760: 69 72 65 63 74 6f 72 22 20 20 20 20 20 20 20 20  irector"        
5770: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65 70      },.    { "ep
5780: 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  s",        3, "a
5790: 70 70 6c 69 63 61 74 69 6f 6e 2f 70 6f 73 74 73  pplication/posts
57a0: 63 72 69 70 74 22 20 20 20 20 20 20 20 20 20 20  cript"          
57b0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65 74 78 22    },.    { "etx"
57c0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65 78  ,        3, "tex
57d0: 74 2f 78 2d 73 65 74 65 78 74 22 20 20 20 20 20  t/x-setext"     
57e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57f0: 7d 2c 0a 20 20 20 20 7b 20 22 65 78 65 22 2c 20  },.    { "exe", 
5800: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
5810: 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72  cation/octet-str
5820: 65 61 6d 22 20 20 20 20 20 20 20 20 20 20 7d 2c  eam"          },
5830: 0a 20 20 20 20 7b 20 22 65 7a 22 2c 20 20 20 20  .    { "ez",    
5840: 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61       2, "applica
5850: 74 69 6f 6e 2f 61 6e 64 72 65 77 2d 69 6e 73 65  tion/andrew-inse
5860: 74 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  t"          },. 
5870: 20 20 20 7b 20 22 66 22 2c 20 20 20 20 20 20 20     { "f",       
5880: 20 20 20 31 2c 20 22 74 65 78 74 2f 70 6c 61 69     1, "text/plai
5890: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
58a0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
58b0: 20 7b 20 22 66 39 30 22 2c 20 20 20 20 20 20 20   { "f90",       
58c0: 20 33 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22   3, "text/plain"
58d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58e0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
58f0: 20 22 66 6c 69 22 2c 20 20 20 20 20 20 20 20 33   "fli",        3
5900: 2c 20 22 76 69 64 65 6f 2f 66 6c 69 22 20 20 20  , "video/fli"   
5910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5920: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5930: 66 6c 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20  flv",        3, 
5940: 22 76 69 64 65 6f 2f 66 6c 76 22 20 20 20 20 20  "video/flv"     
5950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5960: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 67 69      },.    { "gi
5970: 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69  f",        3, "i
5980: 6d 61 67 65 2f 67 69 66 22 20 20 20 20 20 20 20  mage/gif"       
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59a0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 67 6c 22 2c    },.    { "gl",
59b0: 20 20 20 20 20 20 20 20 20 32 2c 20 22 76 69 64           2, "vid
59c0: 65 6f 2f 67 6c 22 20 20 20 20 20 20 20 20 20 20  eo/gl"          
59d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59e0: 7d 2c 0a 20 20 20 20 7b 20 22 67 74 61 72 22 2c  },.    { "gtar",
59f0: 20 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69         4, "appli
5a00: 63 61 74 69 6f 6e 2f 78 2d 67 74 61 72 22 20 20  cation/x-gtar"  
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
5a20: 0a 20 20 20 20 7b 20 22 67 7a 22 2c 20 20 20 20  .    { "gz",    
5a30: 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61       2, "applica
5a40: 74 69 6f 6e 2f 78 2d 67 7a 69 70 22 20 20 20 20  tion/x-gzip"    
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5a60: 20 20 20 7b 20 22 68 64 66 22 2c 20 20 20 20 20     { "hdf",     
5a70: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
5a80: 6f 6e 2f 78 2d 68 64 66 22 20 20 20 20 20 20 20  on/x-hdf"       
5a90: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5aa0: 20 7b 20 22 68 68 22 2c 20 20 20 20 20 20 20 20   { "hh",        
5ab0: 20 32 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22   2, "text/plain"
5ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ad0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5ae0: 20 22 68 71 78 22 2c 20 20 20 20 20 20 20 20 33   "hqx",        3
5af0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d  , "application/m
5b00: 61 63 2d 62 69 6e 68 65 78 34 30 22 20 20 20 20  ac-binhex40"    
5b10: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5b20: 68 22 2c 20 20 20 20 20 20 20 20 20 20 31 2c 20  h",          1, 
5b30: 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20  "text/plain"    
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b50: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68 74      },.    { "ht
5b60: 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74  m",        3, "t
5b70: 65 78 74 2f 68 74 6d 6c 3b 20 63 68 61 72 73 65  ext/html; charse
5b80: 74 3d 75 74 66 2d 38 22 20 20 20 20 20 20 20 20  t=utf-8"        
5b90: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68 74 6d 6c    },.    { "html
5ba0: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 74 65 78  ",       4, "tex
5bb0: 74 2f 68 74 6d 6c 3b 20 63 68 61 72 73 65 74 3d  t/html; charset=
5bc0: 75 74 66 2d 38 22 20 20 20 20 20 20 20 20 20 20  utf-8"          
5bd0: 7d 2c 0a 20 20 20 20 7b 20 22 69 63 65 22 2c 20  },.    { "ice", 
5be0: 20 20 20 20 20 20 20 33 2c 20 22 78 2d 63 6f 6e         3, "x-con
5bf0: 66 65 72 65 6e 63 65 2f 78 2d 63 6f 6f 6c 74 61  ference/x-coolta
5c00: 6c 6b 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c  lk"           },
5c10: 0a 20 20 20 20 7b 20 22 69 65 66 22 2c 20 20 20  .    { "ief",   
5c20: 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 69       3, "image/i
5c30: 65 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ef"             
5c40: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5c50: 20 20 20 7b 20 22 69 67 65 73 22 2c 20 20 20 20     { "iges",    
5c60: 20 20 20 34 2c 20 22 6d 6f 64 65 6c 2f 69 67 65     4, "model/ige
5c70: 73 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s"              
5c80: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5c90: 20 7b 20 22 69 67 73 22 2c 20 20 20 20 20 20 20   { "igs",       
5ca0: 20 33 2c 20 22 6d 6f 64 65 6c 2f 69 67 65 73 22   3, "model/iges"
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cc0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5cd0: 20 22 69 70 73 22 2c 20 20 20 20 20 20 20 20 33   "ips",        3
5ce0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
5cf0: 2d 69 70 73 63 72 69 70 74 22 20 20 20 20 20 20  -ipscript"      
5d00: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5d10: 69 70 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20  ipx",        3, 
5d20: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 69  "application/x-i
5d30: 70 69 78 22 20 20 20 20 20 20 20 20 20 20 20 20  pix"            
5d40: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 61      },.    { "ja
5d50: 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74  d",        3, "t
5d60: 65 78 74 2f 76 6e 64 2e 73 75 6e 2e 6a 32 6d 65  ext/vnd.sun.j2me
5d70: 2e 61 70 70 2d 64 65 73 63 72 69 70 74 6f 72 22  .app-descriptor"
5d80: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 61 72 22    },.    { "jar"
5d90: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
5da0: 6c 69 63 61 74 69 6f 6e 2f 6a 61 76 61 2d 61 72  lication/java-ar
5db0: 63 68 69 76 65 22 20 20 20 20 20 20 20 20 20 20  chive"          
5dc0: 7d 2c 0a 20 20 20 20 7b 20 22 6a 70 65 67 22 2c  },.    { "jpeg",
5dd0: 20 20 20 20 20 20 20 34 2c 20 22 69 6d 61 67 65         4, "image
5de0: 2f 6a 70 65 67 22 20 20 20 20 20 20 20 20 20 20  /jpeg"          
5df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
5e00: 0a 20 20 20 20 7b 20 22 6a 70 65 22 2c 20 20 20  .    { "jpe",   
5e10: 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 6a       3, "image/j
5e20: 70 65 67 22 20 20 20 20 20 20 20 20 20 20 20 20  peg"            
5e30: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5e40: 20 20 20 7b 20 22 6a 70 67 22 2c 20 20 20 20 20     { "jpg",     
5e50: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 6a 70 65     3, "image/jpe
5e60: 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g"              
5e70: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5e80: 20 7b 20 22 6a 73 22 2c 20 20 20 20 20 20 20 20   { "js",        
5e90: 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   2, "application
5ea0: 2f 78 2d 6a 61 76 61 73 63 72 69 70 74 22 20 20  /x-javascript"  
5eb0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5ec0: 20 22 6b 61 72 22 2c 20 20 20 20 20 20 20 20 33   "kar",        3
5ed0: 2c 20 22 61 75 64 69 6f 2f 6d 69 64 69 22 20 20  , "audio/midi"  
5ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ef0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5f00: 6c 61 74 65 78 22 2c 20 20 20 20 20 20 35 2c 20  latex",      5, 
5f10: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6c  "application/x-l
5f20: 61 74 65 78 22 20 20 20 20 20 20 20 20 20 20 20  atex"           
5f30: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 68      },.    { "lh
5f40: 61 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  a",        3, "a
5f50: 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74  pplication/octet
5f60: 2d 73 74 72 65 61 6d 22 20 20 20 20 20 20 20 20  -stream"        
5f70: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 73 70 22    },.    { "lsp"
5f80: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
5f90: 6c 69 63 61 74 69 6f 6e 2f 78 2d 6c 69 73 70 22  lication/x-lisp"
5fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fb0: 7d 2c 0a 20 20 20 20 7b 20 22 6c 7a 68 22 2c 20  },.    { "lzh", 
5fc0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
5fd0: 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72  cation/octet-str
5fe0: 65 61 6d 22 20 20 20 20 20 20 20 20 20 20 7d 2c  eam"          },
5ff0: 0a 20 20 20 20 7b 20 22 6d 22 2c 20 20 20 20 20  .    { "m",     
6000: 20 20 20 20 20 31 2c 20 22 74 65 78 74 2f 70 6c       1, "text/pl
6010: 61 69 6e 22 20 20 20 20 20 20 20 20 20 20 20 20  ain"            
6020: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6030: 20 20 20 7b 20 22 6d 33 75 22 2c 20 20 20 20 20     { "m3u",     
6040: 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 6d     3, "audio/x-m
6050: 70 65 67 75 72 6c 22 20 20 20 20 20 20 20 20 20  pegurl"         
6060: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6070: 20 7b 20 22 6d 61 6e 22 2c 20 20 20 20 20 20 20   { "man",       
6080: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
6090: 2f 78 2d 74 72 6f 66 66 2d 6d 61 6e 22 20 20 20  /x-troff-man"   
60a0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
60b0: 20 22 6d 65 22 2c 20 20 20 20 20 20 20 20 20 32   "me",         2
60c0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
60d0: 2d 74 72 6f 66 66 2d 6d 65 22 20 20 20 20 20 20  -troff-me"      
60e0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
60f0: 6d 65 73 68 22 2c 20 20 20 20 20 20 20 34 2c 20  mesh",       4, 
6100: 22 6d 6f 64 65 6c 2f 6d 65 73 68 22 20 20 20 20  "model/mesh"    
6110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6120: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 69      },.    { "mi
6130: 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  d",        3, "a
6140: 75 64 69 6f 2f 6d 69 64 69 22 20 20 20 20 20 20  udio/midi"      
6150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6160: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 69 64 69    },.    { "midi
6170: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 75 64  ",       4, "aud
6180: 69 6f 2f 6d 69 64 69 22 20 20 20 20 20 20 20 20  io/midi"        
6190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61a0: 7d 2c 0a 20 20 20 20 7b 20 22 6d 69 66 22 2c 20  },.    { "mif", 
61b0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
61c0: 63 61 74 69 6f 6e 2f 78 2d 6d 69 66 22 20 20 20  cation/x-mif"   
61d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
61e0: 0a 20 20 20 20 7b 20 22 6d 69 6d 65 22 2c 20 20  .    { "mime",  
61f0: 20 20 20 20 20 34 2c 20 22 77 77 77 2f 6d 69 6d       4, "www/mim
6200: 65 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e"              
6210: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6220: 20 20 20 7b 20 22 6d 6f 76 69 65 22 2c 20 20 20     { "movie",   
6230: 20 20 20 35 2c 20 22 76 69 64 65 6f 2f 78 2d 73     5, "video/x-s
6240: 67 69 2d 6d 6f 76 69 65 22 20 20 20 20 20 20 20  gi-movie"       
6250: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6260: 20 7b 20 22 6d 6f 76 22 2c 20 20 20 20 20 20 20   { "mov",       
6270: 20 33 2c 20 22 76 69 64 65 6f 2f 71 75 69 63 6b   3, "video/quick
6280: 74 69 6d 65 22 20 20 20 20 20 20 20 20 20 20 20  time"           
6290: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
62a0: 20 22 6d 70 32 22 2c 20 20 20 20 20 20 20 20 33   "mp2",        3
62b0: 2c 20 22 61 75 64 69 6f 2f 6d 70 65 67 22 20 20  , "audio/mpeg"  
62c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62d0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
62e0: 6d 70 32 22 2c 20 20 20 20 20 20 20 20 33 2c 20  mp2",        3, 
62f0: 22 76 69 64 65 6f 2f 6d 70 65 67 22 20 20 20 20  "video/mpeg"    
6300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6310: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70      },.    { "mp
6320: 33 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  3",        3, "a
6330: 75 64 69 6f 2f 6d 70 65 67 22 20 20 20 20 20 20  udio/mpeg"      
6340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6350: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 65 67    },.    { "mpeg
6360: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 76 69 64  ",       4, "vid
6370: 65 6f 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20  eo/mpeg"        
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6390: 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 65 22 2c 20  },.    { "mpe", 
63a0: 20 20 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f         3, "video
63b0: 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20 20 20  /mpeg"          
63c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
63d0: 0a 20 20 20 20 7b 20 22 6d 70 67 61 22 2c 20 20  .    { "mpga",  
63e0: 20 20 20 20 20 34 2c 20 22 61 75 64 69 6f 2f 6d       4, "audio/m
63f0: 70 65 67 22 20 20 20 20 20 20 20 20 20 20 20 20  peg"            
6400: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6410: 20 20 20 7b 20 22 6d 70 67 22 2c 20 20 20 20 20     { "mpg",     
6420: 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 6d 70 65     3, "video/mpe
6430: 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g"              
6440: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6450: 20 7b 20 22 6d 73 22 2c 20 20 20 20 20 20 20 20   { "ms",        
6460: 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   2, "application
6470: 2f 78 2d 74 72 6f 66 66 2d 6d 73 22 20 20 20 20  /x-troff-ms"    
6480: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6490: 20 22 6d 73 68 22 2c 20 20 20 20 20 20 20 20 33   "msh",        3
64a0: 2c 20 22 6d 6f 64 65 6c 2f 6d 65 73 68 22 20 20  , "model/mesh"  
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64c0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
64d0: 6e 63 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  nc",         2, 
64e0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6e  "application/x-n
64f0: 65 74 63 64 66 22 20 20 20 20 20 20 20 20 20 20  etcdf"          
6500: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 64      },.    { "od
6510: 61 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  a",        3, "a
6520: 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 64 61 22 20  pplication/oda" 
6530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6540: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 67 67 22    },.    { "ogg"
6550: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
6560: 6c 69 63 61 74 69 6f 6e 2f 6f 67 67 22 20 20 20  lication/ogg"   
6570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6580: 7d 2c 0a 20 20 20 20 7b 20 22 6f 67 6d 22 2c 20  },.    { "ogm", 
6590: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
65a0: 63 61 74 69 6f 6e 2f 6f 67 67 22 20 20 20 20 20  cation/ogg"     
65b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
65c0: 0a 20 20 20 20 7b 20 22 70 62 6d 22 2c 20 20 20  .    { "pbm",   
65d0: 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78       3, "image/x
65e0: 2d 70 6f 72 74 61 62 6c 65 2d 62 69 74 6d 61 70  -portable-bitmap
65f0: 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  "           },. 
6600: 20 20 20 7b 20 22 70 64 62 22 2c 20 20 20 20 20     { "pdb",     
6610: 20 20 20 33 2c 20 22 63 68 65 6d 69 63 61 6c 2f     3, "chemical/
6620: 78 2d 70 64 62 22 20 20 20 20 20 20 20 20 20 20  x-pdb"          
6630: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6640: 20 7b 20 22 70 64 66 22 2c 20 20 20 20 20 20 20   { "pdf",       
6650: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
6660: 2f 70 64 66 22 20 20 20 20 20 20 20 20 20 20 20  /pdf"           
6670: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6680: 20 22 70 67 6d 22 2c 20 20 20 20 20 20 20 20 33   "pgm",        3
6690: 2c 20 22 69 6d 61 67 65 2f 78 2d 70 6f 72 74 61  , "image/x-porta
66a0: 62 6c 65 2d 67 72 61 79 6d 61 70 22 20 20 20 20  ble-graymap"    
66b0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
66c0: 70 67 6e 22 2c 20 20 20 20 20 20 20 20 33 2c 20  pgn",        3, 
66d0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 63  "application/x-c
66e0: 68 65 73 73 2d 70 67 6e 22 20 20 20 20 20 20 20  hess-pgn"       
66f0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 67      },.    { "pg
6700: 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  p",        3, "a
6710: 70 70 6c 69 63 61 74 69 6f 6e 2f 70 67 70 22 20  pplication/pgp" 
6720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6730: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 6c 22 2c    },.    { "pl",
6740: 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70 70           2, "app
6750: 6c 69 63 61 74 69 6f 6e 2f 78 2d 70 65 72 6c 22  lication/x-perl"
6760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6770: 7d 2c 0a 20 20 20 20 7b 20 22 70 6d 22 2c 20 20  },.    { "pm",  
6780: 20 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69         2, "appli
6790: 63 61 74 69 6f 6e 2f 78 2d 70 65 72 6c 22 20 20  cation/x-perl"  
67a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
67b0: 0a 20 20 20 20 7b 20 22 70 6e 67 22 2c 20 20 20  .    { "png",   
67c0: 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 70       3, "image/p
67d0: 6e 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ng"             
67e0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
67f0: 20 20 20 7b 20 22 70 6e 6d 22 2c 20 20 20 20 20     { "pnm",     
6800: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 70     3, "image/x-p
6810: 6f 72 74 61 62 6c 65 2d 61 6e 79 6d 61 70 22 20  ortable-anymap" 
6820: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6830: 20 7b 20 22 70 6f 74 22 2c 20 20 20 20 20 20 20   { "pot",       
6840: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
6850: 2f 6d 73 70 6f 77 65 72 70 6f 69 6e 74 22 20 20  /mspowerpoint"  
6860: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6870: 20 22 70 70 6d 22 2c 20 20 20 20 20 20 20 20 33   "ppm",        3
6880: 2c 20 22 69 6d 61 67 65 2f 78 2d 70 6f 72 74 61  , "image/x-porta
6890: 62 6c 65 2d 70 69 78 6d 61 70 22 20 20 20 20 20  ble-pixmap"     
68a0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
68b0: 70 70 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20  pps",        3, 
68c0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 70  "application/msp
68d0: 6f 77 65 72 70 6f 69 6e 74 22 20 20 20 20 20 20  owerpoint"      
68e0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 70      },.    { "pp
68f0: 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  t",        3, "a
6900: 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 70 6f 77  pplication/mspow
6910: 65 72 70 6f 69 6e 74 22 20 20 20 20 20 20 20 20  erpoint"        
6920: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 70 7a 22    },.    { "ppz"
6930: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
6940: 6c 69 63 61 74 69 6f 6e 2f 6d 73 70 6f 77 65 72  lication/mspower
6950: 70 6f 69 6e 74 22 20 20 20 20 20 20 20 20 20 20  point"          
6960: 7d 2c 0a 20 20 20 20 7b 20 22 70 72 65 22 2c 20  },.    { "pre", 
6970: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
6980: 63 61 74 69 6f 6e 2f 78 2d 66 72 65 65 6c 61 6e  cation/x-freelan
6990: 63 65 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c  ce"           },
69a0: 0a 20 20 20 20 7b 20 22 70 72 74 22 2c 20 20 20  .    { "prt",   
69b0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
69c0: 74 69 6f 6e 2f 70 72 6f 5f 65 6e 67 22 20 20 20  tion/pro_eng"   
69d0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
69e0: 20 20 20 7b 20 22 70 73 22 2c 20 20 20 20 20 20     { "ps",      
69f0: 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69     2, "applicati
6a00: 6f 6e 2f 70 6f 73 74 73 63 72 69 70 74 22 20 20  on/postscript"  
6a10: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6a20: 20 7b 20 22 71 74 22 2c 20 20 20 20 20 20 20 20   { "qt",        
6a30: 20 32 2c 20 22 76 69 64 65 6f 2f 71 75 69 63 6b   2, "video/quick
6a40: 74 69 6d 65 22 20 20 20 20 20 20 20 20 20 20 20  time"           
6a50: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6a60: 20 22 72 61 22 2c 20 20 20 20 20 20 20 20 20 32   "ra",         2
6a70: 2c 20 22 61 75 64 69 6f 2f 78 2d 72 65 61 6c 61  , "audio/x-reala
6a80: 75 64 69 6f 22 20 20 20 20 20 20 20 20 20 20 20  udio"           
6a90: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6aa0: 72 61 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20  ram",        3, 
6ab0: 22 61 75 64 69 6f 2f 78 2d 70 6e 2d 72 65 61 6c  "audio/x-pn-real
6ac0: 61 75 64 69 6f 22 20 20 20 20 20 20 20 20 20 20  audio"          
6ad0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61      },.    { "ra
6ae0: 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  r",        3, "a
6af0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 72 61 72  pplication/x-rar
6b00: 2d 63 6f 6d 70 72 65 73 73 65 64 22 20 20 20 20  -compressed"    
6b10: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61 73 22    },.    { "ras"
6b20: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61  ,        3, "ima
6b30: 67 65 2f 63 6d 75 2d 72 61 73 74 65 72 22 20 20  ge/cmu-raster"  
6b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b50: 7d 2c 0a 20 20 20 20 7b 20 22 72 61 73 22 2c 20  },.    { "ras", 
6b60: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
6b70: 2f 78 2d 63 6d 75 2d 72 61 73 74 65 72 22 20 20  /x-cmu-raster"  
6b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6b90: 0a 20 20 20 20 7b 20 22 72 67 62 22 2c 20 20 20  .    { "rgb",   
6ba0: 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78       3, "image/x
6bb0: 2d 72 67 62 22 20 20 20 20 20 20 20 20 20 20 20  -rgb"           
6bc0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6bd0: 20 20 20 7b 20 22 72 6d 22 2c 20 20 20 20 20 20     { "rm",      
6be0: 20 20 20 32 2c 20 22 61 75 64 69 6f 2f 78 2d 70     2, "audio/x-p
6bf0: 6e 2d 72 65 61 6c 61 75 64 69 6f 22 20 20 20 20  n-realaudio"    
6c00: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6c10: 20 7b 20 22 72 6f 66 66 22 2c 20 20 20 20 20 20   { "roff",      
6c20: 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   4, "application
6c30: 2f 78 2d 74 72 6f 66 66 22 20 20 20 20 20 20 20  /x-troff"       
6c40: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6c50: 20 22 72 70 6d 22 2c 20 20 20 20 20 20 20 20 33   "rpm",        3
6c60: 2c 20 22 61 75 64 69 6f 2f 78 2d 70 6e 2d 72 65  , "audio/x-pn-re
6c70: 61 6c 61 75 64 69 6f 2d 70 6c 75 67 69 6e 22 20  alaudio-plugin" 
6c80: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6c90: 72 74 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20  rtf",        3, 
6ca0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 72 74 66  "application/rtf
6cb0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
6cc0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 74      },.    { "rt
6cd0: 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74  f",        3, "t
6ce0: 65 78 74 2f 72 74 66 22 20 20 20 20 20 20 20 20  ext/rtf"        
6cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d00: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 74 78 22    },.    { "rtx"
6d10: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65 78  ,        3, "tex
6d20: 74 2f 72 69 63 68 74 65 78 74 22 20 20 20 20 20  t/richtext"     
6d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d40: 7d 2c 0a 20 20 20 20 7b 20 22 73 63 6d 22 2c 20  },.    { "scm", 
6d50: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
6d60: 63 61 74 69 6f 6e 2f 78 2d 6c 6f 74 75 73 73 63  cation/x-lotussc
6d70: 72 65 65 6e 63 61 6d 22 20 20 20 20 20 20 7d 2c  reencam"      },
6d80: 0a 20 20 20 20 7b 20 22 73 65 74 22 2c 20 20 20  .    { "set",   
6d90: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
6da0: 74 69 6f 6e 2f 73 65 74 22 20 20 20 20 20 20 20  tion/set"       
6db0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6dc0: 20 20 20 7b 20 22 73 67 6d 6c 22 2c 20 20 20 20     { "sgml",    
6dd0: 20 20 20 34 2c 20 22 74 65 78 74 2f 73 67 6d 6c     4, "text/sgml
6de0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
6df0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6e00: 20 7b 20 22 73 67 6d 22 2c 20 20 20 20 20 20 20   { "sgm",       
6e10: 20 33 2c 20 22 74 65 78 74 2f 73 67 6d 6c 22 20   3, "text/sgml" 
6e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e30: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6e40: 20 22 73 68 22 2c 20 20 20 20 20 20 20 20 20 32   "sh",         2
6e50: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
6e60: 2d 73 68 22 20 20 20 20 20 20 20 20 20 20 20 20  -sh"            
6e70: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6e80: 73 68 61 72 22 2c 20 20 20 20 20 20 20 34 2c 20  shar",       4, 
6e90: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73  "application/x-s
6ea0: 68 61 72 22 20 20 20 20 20 20 20 20 20 20 20 20  har"            
6eb0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 69      },.    { "si
6ec0: 6c 6f 22 2c 20 20 20 20 20 20 20 34 2c 20 22 6d  lo",       4, "m
6ed0: 6f 64 65 6c 2f 6d 65 73 68 22 20 20 20 20 20 20  odel/mesh"      
6ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ef0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 69 74 22    },.    { "sit"
6f00: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
6f10: 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 74 75 66 66  lication/x-stuff
6f20: 69 74 22 20 20 20 20 20 20 20 20 20 20 20 20 20  it"             
6f30: 7d 2c 0a 20 20 20 20 7b 20 22 73 6b 64 22 2c 20  },.    { "skd", 
6f40: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
6f50: 63 61 74 69 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20  cation/x-koan"  
6f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6f70: 0a 20 20 20 20 7b 20 22 73 6b 6d 22 2c 20 20 20  .    { "skm",   
6f80: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
6f90: 74 69 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20 20  tion/x-koan"    
6fa0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6fb0: 20 20 20 7b 20 22 73 6b 70 22 2c 20 20 20 20 20     { "skp",     
6fc0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
6fd0: 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20 20 20 20  on/x-koan"      
6fe0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6ff0: 20 7b 20 22 73 6b 74 22 2c 20 20 20 20 20 20 20   { "skt",       
7000: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
7010: 2f 78 2d 6b 6f 61 6e 22 20 20 20 20 20 20 20 20  /x-koan"        
7020: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7030: 20 22 73 6d 69 22 2c 20 20 20 20 20 20 20 20 33   "smi",        3
7040: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 73  , "application/s
7050: 6d 69 6c 22 20 20 20 20 20 20 20 20 20 20 20 20  mil"            
7060: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7070: 73 6d 69 6c 22 2c 20 20 20 20 20 20 20 34 2c 20  smil",       4, 
7080: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 73 6d 69  "application/smi
7090: 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l"              
70a0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6e      },.    { "sn
70b0: 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  d",        3, "a
70c0: 75 64 69 6f 2f 62 61 73 69 63 22 20 20 20 20 20  udio/basic"     
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70e0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6f 6c 22    },.    { "sol"
70f0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
7100: 6c 69 63 61 74 69 6f 6e 2f 73 6f 6c 69 64 73 22  lication/solids"
7110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7120: 7d 2c 0a 20 20 20 20 7b 20 22 73 70 6c 22 2c 20  },.    { "spl", 
7130: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
7140: 63 61 74 69 6f 6e 2f 78 2d 66 75 74 75 72 65 73  cation/x-futures
7150: 70 6c 61 73 68 22 20 20 20 20 20 20 20 20 7d 2c  plash"        },
7160: 0a 20 20 20 20 7b 20 22 73 72 63 22 2c 20 20 20  .    { "src",   
7170: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
7180: 74 69 6f 6e 2f 78 2d 77 61 69 73 2d 73 6f 75 72  tion/x-wais-sour
7190: 63 65 22 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  ce"         },. 
71a0: 20 20 20 7b 20 22 73 74 65 70 22 2c 20 20 20 20     { "step",    
71b0: 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69     4, "applicati
71c0: 6f 6e 2f 53 54 45 50 22 20 20 20 20 20 20 20 20  on/STEP"        
71d0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
71e0: 20 7b 20 22 73 74 6c 22 2c 20 20 20 20 20 20 20   { "stl",       
71f0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
7200: 2f 53 4c 41 22 20 20 20 20 20 20 20 20 20 20 20  /SLA"           
7210: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7220: 20 22 73 74 70 22 2c 20 20 20 20 20 20 20 20 33   "stp",        3
7230: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 53  , "application/S
7240: 54 45 50 22 20 20 20 20 20 20 20 20 20 20 20 20  TEP"            
7250: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7260: 73 76 34 63 70 69 6f 22 2c 20 20 20 20 37 2c 20  sv4cpio",    7, 
7270: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73  "application/x-s
7280: 76 34 63 70 69 6f 22 20 20 20 20 20 20 20 20 20  v4cpio"         
7290: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 76      },.    { "sv
72a0: 34 63 72 63 22 2c 20 20 20 20 20 36 2c 20 22 61  4crc",     6, "a
72b0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 76 34  pplication/x-sv4
72c0: 63 72 63 22 20 20 20 20 20 20 20 20 20 20 20 20  crc"            
72d0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 77 66 22    },.    { "swf"
72e0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
72f0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 68 6f 63 6b  lication/x-shock
7300: 77 61 76 65 2d 66 6c 61 73 68 22 20 20 20 20 20  wave-flash"     
7310: 7d 2c 0a 20 20 20 20 7b 20 22 74 22 2c 20 20 20  },.    { "t",   
7320: 20 20 20 20 20 20 20 31 2c 20 22 61 70 70 6c 69         1, "appli
7330: 63 61 74 69 6f 6e 2f 78 2d 74 72 6f 66 66 22 20  cation/x-troff" 
7340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7350: 0a 20 20 20 20 7b 20 22 74 61 72 22 2c 20 20 20  .    { "tar",   
7360: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
7370: 74 69 6f 6e 2f 78 2d 74 61 72 22 20 20 20 20 20  tion/x-tar"     
7380: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7390: 20 20 20 7b 20 22 74 63 6c 22 2c 20 20 20 20 20     { "tcl",     
73a0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
73b0: 6f 6e 2f 78 2d 74 63 6c 22 20 20 20 20 20 20 20  on/x-tcl"       
73c0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
73d0: 20 7b 20 22 74 65 78 22 2c 20 20 20 20 20 20 20   { "tex",       
73e0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
73f0: 2f 78 2d 74 65 78 22 20 20 20 20 20 20 20 20 20  /x-tex"         
7400: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7410: 20 22 74 65 78 69 22 2c 20 20 20 20 20 20 20 34   "texi",       4
7420: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
7430: 2d 74 65 78 69 6e 66 6f 22 20 20 20 20 20 20 20  -texinfo"       
7440: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7450: 74 65 78 69 6e 66 6f 22 2c 20 20 20 20 37 2c 20  texinfo",    7, 
7460: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74  "application/x-t
7470: 65 78 69 6e 66 6f 22 20 20 20 20 20 20 20 20 20  exinfo"         
7480: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 67      },.    { "tg
7490: 7a 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  z",        3, "a
74a0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 61 72  pplication/x-tar
74b0: 2d 67 7a 22 20 20 20 20 20 20 20 20 20 20 20 20  -gz"            
74c0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 69 66 66    },.    { "tiff
74d0: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 69 6d 61  ",       4, "ima
74e0: 67 65 2f 74 69 66 66 22 20 20 20 20 20 20 20 20  ge/tiff"        
74f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7500: 7d 2c 0a 20 20 20 20 7b 20 22 74 69 66 22 2c 20  },.    { "tif", 
7510: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
7520: 2f 74 69 66 66 22 20 20 20 20 20 20 20 20 20 20  /tiff"          
7530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7540: 0a 20 20 20 20 7b 20 22 74 72 22 2c 20 20 20 20  .    { "tr",    
7550: 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61       2, "applica
7560: 74 69 6f 6e 2f 78 2d 74 72 6f 66 66 22 20 20 20  tion/x-troff"   
7570: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7580: 20 20 20 7b 20 22 74 73 69 22 2c 20 20 20 20 20     { "tsi",     
7590: 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 54 53 50     3, "audio/TSP
75a0: 2d 61 75 64 69 6f 22 20 20 20 20 20 20 20 20 20  -audio"         
75b0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
75c0: 20 7b 20 22 74 73 70 22 2c 20 20 20 20 20 20 20   { "tsp",       
75d0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
75e0: 2f 64 73 70 74 79 70 65 22 20 20 20 20 20 20 20  /dsptype"       
75f0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7600: 20 22 74 73 76 22 2c 20 20 20 20 20 20 20 20 33   "tsv",        3
7610: 2c 20 22 74 65 78 74 2f 74 61 62 2d 73 65 70 61  , "text/tab-sepa
7620: 72 61 74 65 64 2d 76 61 6c 75 65 73 22 20 20 20  rated-values"   
7630: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7640: 74 78 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20  txt",        3, 
7650: 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20  "text/plain"    
7660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7670: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 75 6e      },.    { "un
7680: 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  v",        3, "a
7690: 70 70 6c 69 63 61 74 69 6f 6e 2f 69 2d 64 65 61  pplication/i-dea
76a0: 73 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s"              
76b0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 75 73 74 61    },.    { "usta
76c0: 72 22 2c 20 20 20 20 20 20 35 2c 20 22 61 70 70  r",      5, "app
76d0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 75 73 74 61 72  lication/x-ustar
76e0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
76f0: 7d 2c 0a 20 20 20 20 7b 20 22 76 63 64 22 2c 20  },.    { "vcd", 
7700: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
7710: 63 61 74 69 6f 6e 2f 78 2d 63 64 6c 69 6e 6b 22  cation/x-cdlink"
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7730: 0a 20 20 20 20 7b 20 22 76 64 61 22 2c 20 20 20  .    { "vda",   
7740: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
7750: 74 69 6f 6e 2f 76 64 61 22 20 20 20 20 20 20 20  tion/vda"       
7760: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7770: 20 20 20 7b 20 22 76 69 76 22 2c 20 20 20 20 20     { "viv",     
7780: 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 76 6e 64     3, "video/vnd
7790: 2e 76 69 76 6f 22 20 20 20 20 20 20 20 20 20 20  .vivo"          
77a0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
77b0: 20 7b 20 22 76 69 76 6f 22 2c 20 20 20 20 20 20   { "vivo",      
77c0: 20 34 2c 20 22 76 69 64 65 6f 2f 76 6e 64 2e 76   4, "video/vnd.v
77d0: 69 76 6f 22 20 20 20 20 20 20 20 20 20 20 20 20  ivo"            
77e0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
77f0: 20 22 76 72 6d 6c 22 2c 20 20 20 20 20 20 20 34   "vrml",       4
7800: 2c 20 22 6d 6f 64 65 6c 2f 76 72 6d 6c 22 20 20  , "model/vrml"  
7810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7820: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7830: 76 73 69 78 22 2c 20 20 20 20 20 20 20 34 2c 20  vsix",       4, 
7840: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76 73 69  "application/vsi
7850: 78 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x"              
7860: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 61      },.    { "wa
7870: 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  v",        3, "a
7880: 75 64 69 6f 2f 78 2d 77 61 76 22 20 20 20 20 20  udio/x-wav"     
7890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78a0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 61 78 22    },.    { "wax"
78b0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64  ,        3, "aud
78c0: 69 6f 2f 78 2d 6d 73 2d 77 61 78 22 20 20 20 20  io/x-ms-wax"    
78d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78e0: 7d 2c 0a 20 20 20 20 7b 20 22 77 69 6b 69 22 2c  },.    { "wiki",
78f0: 20 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69         4, "appli
7900: 63 61 74 69 6f 6e 2f 78 2d 66 6f 73 73 69 6c 2d  cation/x-fossil-
7910: 77 69 6b 69 22 20 20 20 20 20 20 20 20 20 7d 2c  wiki"         },
7920: 0a 20 20 20 20 7b 20 22 77 6d 61 22 2c 20 20 20  .    { "wma",   
7930: 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 78       3, "audio/x
7940: 2d 6d 73 2d 77 6d 61 22 20 20 20 20 20 20 20 20  -ms-wma"        
7950: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7960: 20 20 20 7b 20 22 77 6d 76 22 2c 20 20 20 20 20     { "wmv",     
7970: 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d     3, "video/x-m
7980: 73 2d 77 6d 76 22 20 20 20 20 20 20 20 20 20 20  s-wmv"          
7990: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
79a0: 20 7b 20 22 77 6d 78 22 2c 20 20 20 20 20 20 20   { "wmx",       
79b0: 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d   3, "video/x-ms-
79c0: 77 6d 78 22 20 20 20 20 20 20 20 20 20 20 20 20  wmx"            
79d0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
79e0: 20 22 77 72 6c 22 2c 20 20 20 20 20 20 20 20 33   "wrl",        3
79f0: 2c 20 22 6d 6f 64 65 6c 2f 76 72 6d 6c 22 20 20  , "model/vrml"  
7a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a10: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7a20: 77 76 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20  wvx",        3, 
7a30: 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 77 76 78 22  "video/x-ms-wvx"
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a50: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 62      },.    { "xb
7a60: 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69  m",        3, "i
7a70: 6d 61 67 65 2f 78 2d 78 62 69 74 6d 61 70 22 20  mage/x-xbitmap" 
7a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a90: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 6c 63 22    },.    { "xlc"
7aa0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
7ab0: 6c 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d  lication/vnd.ms-
7ac0: 65 78 63 65 6c 22 20 20 20 20 20 20 20 20 20 20  excel"          
7ad0: 7d 2c 0a 20 20 20 20 7b 20 22 78 6c 6c 22 2c 20  },.    { "xll", 
7ae0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
7af0: 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78  cation/vnd.ms-ex
7b00: 63 65 6c 22 20 20 20 20 20 20 20 20 20 20 7d 2c  cel"          },
7b10: 0a 20 20 20 20 7b 20 22 78 6c 6d 22 2c 20 20 20  .    { "xlm",   
7b20: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
7b30: 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65  tion/vnd.ms-exce
7b40: 6c 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  l"          },. 
7b50: 20 20 20 7b 20 22 78 6c 73 22 2c 20 20 20 20 20     { "xls",     
7b60: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
7b70: 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22  on/vnd.ms-excel"
7b80: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7b90: 20 7b 20 22 78 6c 77 22 2c 20 20 20 20 20 20 20   { "xlw",       
7ba0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
7bb0: 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20 20  /vnd.ms-excel"  
7bc0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7bd0: 20 22 78 6d 6c 22 2c 20 20 20 20 20 20 20 20 33   "xml",        3
7be0: 2c 20 22 74 65 78 74 2f 78 6d 6c 22 20 20 20 20  , "text/xml"    
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c00: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7c10: 78 70 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20  xpm",        3, 
7c20: 22 69 6d 61 67 65 2f 78 2d 78 70 69 78 6d 61 70  "image/x-xpixmap
7c30: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
7c40: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 77      },.    { "xw
7c50: 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69  d",        3, "i
7c60: 6d 61 67 65 2f 78 2d 78 77 69 6e 64 6f 77 64 75  mage/x-xwindowdu
7c70: 6d 70 22 20 20 20 20 20 20 20 20 20 20 20 20 20  mp"             
7c80: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 79 7a 22    },.    { "xyz"
7c90: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 63 68 65  ,        3, "che
7ca0: 6d 69 63 61 6c 2f 78 2d 70 64 62 22 20 20 20 20  mical/x-pdb"    
7cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cc0: 7d 2c 0a 20 20 20 20 7b 20 22 7a 69 70 22 2c 20  },.    { "zip", 
7cd0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
7ce0: 63 61 74 69 6f 6e 2f 7a 69 70 22 20 20 20 20 20  cation/zip"     
7cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7d00: 0a 20 20 7d 3b 0a 0a 20 20 66 6f 72 28 69 3d 6e  .  };..  for(i=n
7d10: 4e 61 6d 65 2d 31 3b 20 69 3e 30 20 26 26 20 7a  Name-1; i>0 && z
7d20: 4e 61 6d 65 5b 69 5d 21 3d 27 2e 27 3b 20 69 2d  Name[i]!='.'; i-
7d30: 2d 29 7b 7d 0a 20 20 7a 20 3d 20 26 7a 4e 61 6d  -){}.  z = &zNam
7d40: 65 5b 69 2b 31 5d 3b 0a 20 20 6c 65 6e 20 3d 20  e[i+1];.  len = 
7d50: 6e 4e 61 6d 65 20 2d 20 69 3b 0a 20 20 69 66 28  nName - i;.  if(
7d60: 20 6c 65 6e 3c 28 69 6e 74 29 73 69 7a 65 6f 66   len<(int)sizeof
7d70: 28 7a 53 75 66 66 69 78 29 2d 31 20 29 7b 0a 20  (zSuffix)-1 ){. 
7d80: 20 20 20 73 74 72 63 70 79 28 7a 53 75 66 66 69     strcpy(zSuffi
7d90: 78 2c 20 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69  x, z);.    for(i
7da0: 3d 30 3b 20 7a 53 75 66 66 69 78 5b 69 5d 3b 20  =0; zSuffix[i]; 
7db0: 69 2b 2b 29 20 7a 53 75 66 66 69 78 5b 69 5d 20  i++) zSuffix[i] 
7dc0: 3d 20 74 6f 6c 6f 77 65 72 28 7a 53 75 66 66 69  = tolower(zSuffi
7dd0: 78 5b 69 5d 29 3b 0a 20 20 20 20 66 69 72 73 74  x[i]);.    first
7de0: 20 3d 20 30 3b 0a 20 20 20 20 6c 61 73 74 20 3d   = 0;.    last =
7df0: 20 73 69 7a 65 6f 66 28 61 4d 69 6d 65 29 2f 73   sizeof(aMime)/s
7e00: 69 7a 65 6f 66 28 61 4d 69 6d 65 5b 30 5d 29 3b  izeof(aMime[0]);
7e10: 0a 20 20 20 20 77 68 69 6c 65 28 20 66 69 72 73  .    while( firs
7e20: 74 3c 3d 6c 61 73 74 20 29 7b 0a 20 20 20 20 20  t<=last ){.     
7e30: 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 20   int c;.      i 
7e40: 3d 20 28 66 69 72 73 74 2b 6c 61 73 74 29 2f 32  = (first+last)/2
7e50: 3b 0a 20 20 20 20 20 20 63 20 3d 20 73 74 72 63  ;.      c = strc
7e60: 6d 70 28 7a 53 75 66 66 69 78 2c 20 61 4d 69 6d  mp(zSuffix, aMim
7e70: 65 5b 69 5d 2e 7a 53 75 66 66 69 78 29 3b 0a 20  e[i].zSuffix);. 
7e80: 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20       if( c==0 ) 
7e90: 72 65 74 75 72 6e 20 61 4d 69 6d 65 5b 69 5d 2e  return aMime[i].
7ea0: 7a 4d 69 6d 65 74 79 70 65 3b 0a 20 20 20 20 20  zMimetype;.     
7eb0: 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20   if( c<0 ){.    
7ec0: 20 20 20 20 6c 61 73 74 20 3d 20 69 2d 31 3b 0a      last = i-1;.
7ed0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7ee0: 20 20 20 20 20 66 69 72 73 74 20 3d 20 69 2b 31       first = i+1
7ef0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7f00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 61 70    }.  return "ap
7f10: 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d  plication/octet-
7f20: 73 74 72 65 61 6d 22 3b 0a 7d 0a 0a 2f 2a 0a 2a  stream";.}../*.*
7f30: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
7f40: 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 31  table contains 1
7f50: 20 66 6f 72 20 61 6c 6c 20 63 68 61 72 61 63 74   for all charact
7f60: 65 72 73 20 74 68 61 74 20 61 72 65 20 70 65 72  ers that are per
7f70: 6d 69 74 74 65 64 20 69 6e 0a 2a 2a 20 74 68 65  mitted in.** the
7f80: 20 70 61 72 74 20 6f 66 20 74 68 65 20 55 52 4c   part of the URL
7f90: 20 62 65 66 6f 72 65 20 74 68 65 20 71 75 65 72   before the quer
7fa0: 79 20 70 61 72 61 6d 65 74 65 72 73 20 61 6e 64  y parameters and
7fb0: 20 66 72 61 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   fragment..**.**
7fc0: 20 41 6c 6c 6f 77 65 64 20 63 68 61 72 61 63 74   Allowed charact
7fd0: 65 72 73 3a 20 20 30 2d 39 20 61 2d 7a 20 41 2d  ers:  0-9 a-z A-
7fe0: 5a 20 2c 2d 2e 2f 3a 5f 7e 0a 2a 2a 0a 2a 2a 20  Z ,-./:_~.**.** 
7ff0: 44 69 73 61 6c 6c 6f 77 65 64 20 63 68 61 72 61  Disallowed chara
8000: 63 74 65 72 73 20 69 6e 63 6c 75 64 65 3a 20 20  cters include:  
8010: 21 22 23 24 25 26 27 28 29 2a 2b 3b 3c 3d 3e 3f  !"#$%&'()*+;<=>?
8020: 5b 5c 5d 5e 7b 7c 7d 0a 2a 2f 0a 73 74 61 74 69  [\]^{|}.*/.stati
8030: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 61 6c 6c  c const char all
8040: 6f 77 65 64 49 6e 4e 61 6d 65 5b 5d 20 3d 20 7b  owedInName[] = {
8050: 0a 20 20 20 20 20 20 2f 2a 20 20 78 30 20 20 78  .      /*  x0  x
8060: 31 20 20 78 32 20 20 78 33 20 20 78 34 20 20 78  1  x2  x3  x4  x
8070: 35 20 20 78 36 20 20 78 37 20 20 78 38 20 20 78  5  x6  x7  x8  x
8080: 39 20 20 78 61 20 20 78 62 20 20 78 63 20 20 78  9  xa  xb  xc  x
8090: 64 20 20 78 65 20 20 78 66 20 2a 2f 0a 2f 2a 20  d  xe  xf */./* 
80a0: 30 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20  0x */   0,  0,  
80b0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
80c0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
80d0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
80e0: 30 2c 20 20 30 2c 0a 2f 2a 20 31 78 20 2a 2f 20  0,  0,./* 1x */ 
80f0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
8100: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
8110: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
8120: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
8130: 0a 2f 2a 20 32 78 20 2a 2f 20 20 20 30 2c 20 20  ./* 2x */   0,  
8140: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
8150: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
8160: 30 2c 20 20 30 2c 20 20 30 2c 20 20 31 2c 20 20  0,  0,  0,  1,  
8170: 31 2c 20 20 31 2c 20 20 31 2c 0a 2f 2a 20 33 78  1,  1,  1,./* 3x
8180: 20 2a 2f 20 20 20 31 2c 20 20 31 2c 20 20 31 2c   */   1,  1,  1,
8190: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
81a0: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
81b0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
81c0: 20 20 30 2c 0a 2f 2a 20 34 78 20 2a 2f 20 20 20    0,./* 4x */   
81d0: 30 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  0,  1,  1,  1,  
81e0: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
81f0: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
8200: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 0a 2f  1,  1,  1,  1,./
8210: 2a 20 35 78 20 2a 2f 20 20 20 31 2c 20 20 31 2c  * 5x */   1,  1,
8220: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
8230: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
8240: 20 20 31 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    1,  0,  0,  0,
8250: 20 20 30 2c 20 20 31 2c 0a 2f 2a 20 36 78 20 2a    0,  1,./* 6x *
8260: 2f 20 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20  /   0,  1,  1,  
8270: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
8280: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
8290: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
82a0: 31 2c 0a 2f 2a 20 37 78 20 2a 2f 20 20 20 31 2c  1,./* 7x */   1,
82b0: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
82c0: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
82d0: 20 20 31 2c 20 20 31 2c 20 20 30 2c 20 20 30 2c    1,  1,  0,  0,
82e0: 20 20 30 2c 20 20 31 2c 20 20 30 2c 0a 7d 3b 0a    0,  1,  0,.};.
82f0: 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
8300: 20 6e 75 6d 62 65 72 20 6f 66 20 22 2f 22 20 63   number of "/" c
8310: 68 61 72 61 63 74 65 72 73 20 69 6e 20 61 20 73  haracters in a s
8320: 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
8330: 20 69 6e 74 20 63 6f 75 6e 74 53 6c 61 73 68 65   int countSlashe
8340: 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  s(const char *z)
8350: 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  {.  int n = 0;. 
8360: 20 77 68 69 6c 65 28 20 2a 7a 20 29 20 69 66 28   while( *z ) if(
8370: 20 2a 28 7a 2b 2b 29 3d 3d 27 2f 27 20 29 20 6e   *(z++)=='/' ) n
8380: 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  ++;.  return n;.
8390: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
83a0: 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20  utine processes 
83b0: 61 20 73 69 6e 67 6c 65 20 48 54 54 50 20 72 65  a single HTTP re
83c0: 71 75 65 73 74 20 6f 6e 20 73 74 61 6e 64 61 72  quest on standar
83d0: 64 20 69 6e 70 75 74 20 61 6e 64 0a 2a 2a 20 73  d input and.** s
83e0: 65 6e 64 73 20 74 68 65 20 72 65 70 6c 79 20 74  ends the reply t
83f0: 6f 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75  o standard outpu
8400: 74 2e 20 20 49 66 20 74 68 65 20 61 72 67 75 6d  t.  If the argum
8410: 65 6e 74 20 69 73 20 31 20 69 74 20 6d 65 61 6e  ent is 1 it mean
8420: 73 0a 2a 2a 20 74 68 61 74 20 77 65 20 61 72 65  s.** that we are
8430: 20 73 68 6f 75 6c 64 20 63 6c 6f 73 65 20 74 68   should close th
8440: 65 20 73 6f 63 6b 65 74 20 77 69 74 68 6f 75 74  e socket without
8450: 20 70 72 6f 63 65 73 73 69 6e 67 20 61 64 64 69   processing addi
8460: 74 69 6f 6e 61 6c 0a 2a 2a 20 48 54 54 50 20 72  tional.** HTTP r
8470: 65 71 75 65 73 74 73 20 61 66 74 65 72 20 74 68  equests after th
8480: 65 20 63 75 72 72 65 6e 74 20 72 65 71 75 65 73  e current reques
8490: 74 20 66 69 6e 69 73 68 65 73 2e 20 20 30 20 6d  t finishes.  0 m
84a0: 65 61 6e 73 20 77 65 20 61 72 65 0a 2a 2a 20 61  eans we are.** a
84b0: 6c 6c 6f 77 65 64 20 74 6f 20 6b 65 65 70 20 74  llowed to keep t
84c0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70  he connection op
84d0: 65 6e 20 61 6e 64 20 74 6f 20 70 72 6f 63 65 73  en and to proces
84e0: 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 72 65 71  s additional req
84f0: 75 65 73 74 73 2e 0a 2a 2a 20 54 68 69 73 20 72  uests..** This r
8500: 6f 75 74 69 6e 65 20 6d 61 79 20 63 68 6f 6f 73  outine may choos
8510: 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 63  e to close the c
8520: 6f 6e 6e 65 63 74 69 6f 6e 20 65 76 65 6e 20 69  onnection even i
8530: 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 0a 2a  f the argument.*
8540: 2a 20 69 73 20 30 2e 0a 2a 2a 20 0a 2a 2a 20 49  * is 0..** .** I
8550: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
8560: 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65   should be close
8570: 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
8580: 63 61 6c 6c 73 20 65 78 69 74 28 29 20 61 6e 64  calls exit() and
8590: 0a 2a 2a 20 74 68 75 73 20 6e 65 76 65 72 20 72  .** thus never r
85a0: 65 74 75 72 6e 73 2e 20 20 49 66 20 74 68 69 73  eturns.  If this
85b0: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 72 65   routine does re
85c0: 74 75 72 6e 20 69 74 20 6d 65 61 6e 73 20 74 68  turn it means th
85d0: 61 74 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 48 54  at another.** HT
85e0: 54 50 20 72 65 71 75 65 73 74 20 6d 61 79 20 61  TP request may a
85f0: 70 70 65 61 72 20 6f 6e 20 74 68 65 20 77 69 72  ppear on the wir
8600: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 50 72 6f 63 65  e..*/.void Proce
8610: 73 73 4f 6e 65 52 65 71 75 65 73 74 28 69 6e 74  ssOneRequest(int
8620: 20 66 6f 72 63 65 43 6c 6f 73 65 29 7b 0a 20 20   forceClose){.  
8630: 69 6e 74 20 69 2c 20 63 3b 0a 20 20 63 68 61 72  int i, c;.  char
8640: 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   *z;            
8650: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
8660: 20 70 61 72 73 65 20 75 70 20 61 20 73 74 72 69   parse up a stri
8670: 6e 67 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ng */.  struct s
8680: 74 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20  tat statbuf;    
8690: 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
86a0: 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20   about the file 
86b0: 74 6f 20 62 65 20 72 65 74 72 69 65 76 65 64 20  to be retrieved 
86c0: 2a 2f 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20  */.  FILE *in;  
86d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
86e0: 2a 20 46 6f 72 20 72 65 61 64 69 6e 67 20 66 72  * For reading fr
86f0: 6f 6d 20 43 47 49 20 73 63 72 69 70 74 73 20 2a  om CGI scripts *
8700: 2f 0a 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b 31  /.  char zLine[1
8710: 30 30 30 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a  000];         /*
8720: 20 41 20 62 75 66 66 65 72 20 66 6f 72 20 69 6e   A buffer for in
8730: 70 75 74 20 6c 69 6e 65 73 20 6f 72 20 66 6f 72  put lines or for
8740: 6d 69 6e 67 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20  ming names */.. 
8750: 20 2f 2a 20 43 68 61 6e 67 65 20 64 69 72 65 63   /* Change direc
8760: 74 6f 72 69 65 73 20 74 6f 20 74 68 65 20 72 6f  tories to the ro
8770: 6f 74 20 6f 66 20 74 68 65 20 48 54 54 50 20 66  ot of the HTTP f
8780: 69 6c 65 73 79 73 74 65 6d 0a 20 20 2a 2f 0a 20  ilesystem.  */. 
8790: 20 69 66 28 20 63 68 64 69 72 28 7a 52 6f 6f 74   if( chdir(zRoot
87a0: 5b 30 5d 20 3f 20 7a 52 6f 6f 74 20 3a 20 22 2f  [0] ? zRoot : "/
87b0: 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  ")!=0 ){.    cha
87c0: 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20  r zBuf[1000];.  
87d0: 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f    Malfunction(__
87e0: 4c 49 4e 45 5f 5f 2c 20 22 63 61 6e 6e 6f 74 20  LINE__, "cannot 
87f0: 63 68 64 69 72 20 74 6f 20 5b 25 73 5d 20 66 72  chdir to [%s] fr
8800: 6f 6d 20 5b 25 73 5d 22 2c 0a 20 20 20 20 20 20  om [%s]",.      
8810: 20 20 20 7a 52 6f 6f 74 2c 20 67 65 74 63 77 64     zRoot, getcwd
8820: 28 7a 42 75 66 2c 39 39 39 29 29 3b 0a 20 20 7d  (zBuf,999));.  }
8830: 0a 20 20 6e 52 65 71 75 65 73 74 2b 2b 3b 0a 0a  .  nRequest++;..
8840: 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 6d 75 73    /*.  ** We mus
8850: 74 20 72 65 63 65 69 76 65 20 61 20 63 6f 6d 70  t receive a comp
8860: 6c 65 74 65 20 68 65 61 64 65 72 20 77 69 74 68  lete header with
8870: 69 6e 20 31 35 20 73 65 63 6f 6e 64 73 0a 20 20  in 15 seconds.  
8880: 2a 2f 0a 20 20 73 69 67 6e 61 6c 28 53 49 47 41  */.  signal(SIGA
8890: 4c 52 4d 2c 20 54 69 6d 65 6f 75 74 29 3b 0a 20  LRM, Timeout);. 
88a0: 20 73 69 67 6e 61 6c 28 53 49 47 53 45 47 56 2c   signal(SIGSEGV,
88b0: 20 54 69 6d 65 6f 75 74 29 3b 0a 20 20 73 69 67   Timeout);.  sig
88c0: 6e 61 6c 28 53 49 47 50 49 50 45 2c 20 54 69 6d  nal(SIGPIPE, Tim
88d0: 65 6f 75 74 29 3b 0a 20 20 69 66 28 20 75 73 65  eout);.  if( use
88e0: 54 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d 28  Timeout ) alarm(
88f0: 31 35 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74  15);..  /* Get t
8900: 68 65 20 66 69 72 73 74 20 6c 69 6e 65 20 6f 66  he first line of
8910: 20 74 68 65 20 72 65 71 75 65 73 74 20 61 6e 64   the request and
8920: 20 70 61 72 73 65 20 6f 75 74 20 74 68 65 0a 20   parse out the. 
8930: 20 2a 2a 20 6d 65 74 68 6f 64 2c 20 74 68 65 20   ** method, the 
8940: 73 63 72 69 70 74 20 61 6e 64 20 74 68 65 20 70  script and the p
8950: 72 6f 74 6f 63 6f 6c 2e 0a 20 20 2a 2f 0a 20 20  rotocol..  */.  
8960: 69 66 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c  if( fgets(zLine,
8970: 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 73 74  sizeof(zLine),st
8980: 64 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65  din)==0 ){.    e
8990: 78 69 74 28 30 29 3b 0a 20 20 7d 0a 20 20 6f 6d  xit(0);.  }.  om
89a0: 69 74 4c 6f 67 20 3d 20 30 3b 0a 20 20 6e 49 6e  itLog = 0;.  nIn
89b0: 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 4c 69 6e 65   += strlen(zLine
89c0: 29 3b 0a 20 20 7a 4d 65 74 68 6f 64 20 3d 20 53  );.  zMethod = S
89d0: 74 72 44 75 70 28 47 65 74 46 69 72 73 74 45 6c  trDup(GetFirstEl
89e0: 65 6d 65 6e 74 28 7a 4c 69 6e 65 2c 26 7a 29 29  ement(zLine,&z))
89f0: 3b 0a 20 20 7a 52 65 61 6c 53 63 72 69 70 74 20  ;.  zRealScript 
8a00: 3d 20 7a 53 63 72 69 70 74 20 3d 20 53 74 72 44  = zScript = StrD
8a10: 75 70 28 47 65 74 46 69 72 73 74 45 6c 65 6d 65  up(GetFirstEleme
8a20: 6e 74 28 7a 2c 26 7a 29 29 3b 0a 20 20 7a 50 72  nt(z,&z));.  zPr
8a30: 6f 74 6f 63 6f 6c 20 3d 20 53 74 72 44 75 70 28  otocol = StrDup(
8a40: 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28  GetFirstElement(
8a50: 7a 2c 26 7a 29 29 3b 0a 20 20 69 66 28 20 7a 50  z,&z));.  if( zP
8a60: 72 6f 74 6f 63 6f 6c 3d 3d 30 20 7c 7c 20 73 74  rotocol==0 || st
8a70: 72 6e 63 6d 70 28 7a 50 72 6f 74 6f 63 6f 6c 2c  rncmp(zProtocol,
8a80: 22 48 54 54 50 2f 22 2c 35 29 21 3d 30 20 7c 7c  "HTTP/",5)!=0 ||
8a90: 20 73 74 72 6c 65 6e 28 7a 50 72 6f 74 6f 63 6f   strlen(zProtoco
8aa0: 6c 29 21 3d 38 20 29 7b 0a 20 20 20 20 53 74 61  l)!=8 ){.    Sta
8ab0: 72 74 52 65 73 70 6f 6e 73 65 28 22 34 30 30 20  rtResponse("400 
8ac0: 42 61 64 20 52 65 71 75 65 73 74 22 29 3b 0a 20  Bad Request");. 
8ad0: 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74     nOut += print
8ae0: 66 28 0a 20 20 20 20 20 20 22 43 6f 6e 74 65 6e  f(.      "Conten
8af0: 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 70 6c 61  t-type: text/pla
8b00: 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 20 20 22 5c  in\r\n".      "\
8b10: 72 5c 6e 22 0a 20 20 20 20 20 20 22 54 68 69 73  r\n".      "This
8b20: 20 73 65 72 76 65 72 20 64 6f 65 73 20 6e 6f 74   server does not
8b30: 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20   understand the 
8b40: 72 65 71 75 65 73 74 65 64 20 70 72 6f 74 6f 63  requested protoc
8b50: 6f 6c 5c 6e 22 0a 20 20 20 20 29 3b 0a 20 20 20  ol\n".    );.   
8b60: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 29   MakeLogEntry(0)
8b70: 3b 0a 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20  ;.    exit(0);. 
8b80: 20 7d 0a 20 20 69 66 28 20 7a 53 63 72 69 70 74   }.  if( zScript
8b90: 5b 30 5d 3d 3d 30 20 29 20 4e 6f 74 46 6f 75 6e  [0]==0 ) NotFoun
8ba0: 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 69  d(__LINE__);.  i
8bb0: 66 28 20 66 6f 72 63 65 43 6c 6f 73 65 20 29 7b  f( forceClose ){
8bc0: 0a 20 20 20 20 63 6c 6f 73 65 43 6f 6e 6e 65 63  .    closeConnec
8bd0: 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  tion = 1;.  }els
8be0: 65 20 69 66 28 20 7a 50 72 6f 74 6f 63 6f 6c 5b  e if( zProtocol[
8bf0: 35 5d 3c 27 31 27 20 7c 7c 20 7a 50 72 6f 74 6f  5]<'1' || zProto
8c00: 63 6f 6c 5b 37 5d 3c 27 31 27 20 29 7b 0a 20 20  col[7]<'1' ){.  
8c10: 20 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f    closeConnectio
8c20: 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n = 1;.  }..  /*
8c30: 20 54 68 69 73 20 76 65 72 79 20 73 69 6d 70 6c   This very simpl
8c40: 65 20 73 65 72 76 65 72 20 6f 6e 6c 79 20 75 6e  e server only un
8c50: 64 65 72 73 74 61 6e 64 73 20 74 68 65 20 47 45  derstands the GE
8c60: 54 2c 20 50 4f 53 54 0a 20 20 2a 2a 20 61 6e 64  T, POST.  ** and
8c70: 20 48 45 41 44 20 6d 65 74 68 6f 64 73 0a 20 20   HEAD methods.  
8c80: 2a 2f 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  */.  if( strcmp(
8c90: 7a 4d 65 74 68 6f 64 2c 22 47 45 54 22 29 21 3d  zMethod,"GET")!=
8ca0: 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 65 74  0 && strcmp(zMet
8cb0: 68 6f 64 2c 22 50 4f 53 54 22 29 21 3d 30 0a 20  hod,"POST")!=0. 
8cc0: 20 20 20 20 20 20 26 26 20 73 74 72 63 6d 70 28        && strcmp(
8cd0: 7a 4d 65 74 68 6f 64 2c 22 48 45 41 44 22 29 21  zMethod,"HEAD")!
8ce0: 3d 30 20 29 7b 0a 20 20 20 20 53 74 61 72 74 52  =0 ){.    StartR
8cf0: 65 73 70 6f 6e 73 65 28 22 35 30 31 20 4e 6f 74  esponse("501 Not
8d00: 20 49 6d 70 6c 65 6d 65 6e 74 65 64 22 29 3b 0a   Implemented");.
8d10: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
8d20: 74 66 28 0a 20 20 20 20 20 20 22 43 6f 6e 74 65  tf(.      "Conte
8d30: 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 70 6c  nt-type: text/pl
8d40: 61 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 20 20 22  ain\r\n".      "
8d50: 5c 72 5c 6e 22 0a 20 20 20 20 20 20 22 54 68 65  \r\n".      "The
8d60: 20 25 73 20 6d 65 74 68 6f 64 20 69 73 20 6e 6f   %s method is no
8d70: 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 6f 6e  t implemented on
8d80: 20 74 68 69 73 20 73 65 72 76 65 72 2e 5c 6e 22   this server.\n"
8d90: 2c 0a 20 20 20 20 20 20 7a 4d 65 74 68 6f 64 29  ,.      zMethod)
8da0: 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74  ;.    MakeLogEnt
8db0: 72 79 28 30 29 3b 0a 20 20 20 20 65 78 69 74 28  ry(0);.    exit(
8dc0: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  0);.  }..  /* Ge
8dd0: 74 20 61 6c 6c 20 74 68 65 20 6f 70 74 69 6f 6e  t all the option
8de0: 61 6c 20 66 69 65 6c 64 73 20 74 68 61 74 20 66  al fields that f
8df0: 6f 6c 6c 6f 77 20 74 68 65 20 66 69 72 73 74 20  ollow the first 
8e00: 6c 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 7a 43 6f  line..  */.  zCo
8e10: 6f 6b 69 65 20 3d 20 30 3b 0a 20 20 7a 41 75 74  okie = 0;.  zAut
8e20: 68 54 79 70 65 20 3d 20 30 3b 0a 20 20 7a 52 65  hType = 0;.  zRe
8e30: 6d 6f 74 65 55 73 65 72 20 3d 20 30 3b 0a 20 20  moteUser = 0;.  
8e40: 7a 52 65 66 65 72 65 72 20 3d 20 30 3b 0a 20 20  zReferer = 0;.  
8e50: 77 68 69 6c 65 28 20 66 67 65 74 73 28 7a 4c 69  while( fgets(zLi
8e60: 6e 65 2c 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29  ne,sizeof(zLine)
8e70: 2c 73 74 64 69 6e 29 20 29 7b 0a 20 20 20 20 63  ,stdin) ){.    c
8e80: 68 61 72 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 3b  har *zFieldName;
8e90: 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 3b  .    char *zVal;
8ea0: 0a 0a 20 20 20 20 6e 49 6e 20 2b 3d 20 73 74 72  ..    nIn += str
8eb0: 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  len(zLine);.    
8ec0: 7a 46 69 65 6c 64 4e 61 6d 65 20 3d 20 47 65 74  zFieldName = Get
8ed0: 46 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a 4c 69  FirstElement(zLi
8ee0: 6e 65 2c 26 7a 56 61 6c 29 3b 0a 20 20 20 20 69  ne,&zVal);.    i
8ef0: 66 28 20 7a 46 69 65 6c 64 4e 61 6d 65 3d 3d 30  f( zFieldName==0
8f00: 20 7c 7c 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 3d   || *zFieldName=
8f10: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
8f20: 52 65 6d 6f 76 65 4e 65 77 6c 69 6e 65 28 7a 56  RemoveNewline(zV
8f30: 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72  al);.    if( str
8f40: 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61  casecmp(zFieldNa
8f50: 6d 65 2c 22 55 73 65 72 2d 41 67 65 6e 74 3a 22  me,"User-Agent:"
8f60: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 41  )==0 ){.      zA
8f70: 67 65 6e 74 20 3d 20 53 74 72 44 75 70 28 7a 56  gent = StrDup(zV
8f80: 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  al);.    }else i
8f90: 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46  f( strcasecmp(zF
8fa0: 69 65 6c 64 4e 61 6d 65 2c 22 41 63 63 65 70 74  ieldName,"Accept
8fb0: 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  :")==0 ){.      
8fc0: 7a 41 63 63 65 70 74 20 3d 20 53 74 72 44 75 70  zAccept = StrDup
8fd0: 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  (zVal);.    }els
8fe0: 65 20 69 66 28 20 73 74 72 63 61 73 65 63 6d 70  e if( strcasecmp
8ff0: 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 43 6f 6e  (zFieldName,"Con
9000: 74 65 6e 74 2d 6c 65 6e 67 74 68 3a 22 29 3d 3d  tent-length:")==
9010: 30 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6e 74  0 ){.      zCont
9020: 65 6e 74 4c 65 6e 67 74 68 20 3d 20 53 74 72 44  entLength = StrD
9030: 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65  up(zVal);.    }e
9040: 6c 73 65 20 69 66 28 20 73 74 72 63 61 73 65 63  lse if( strcasec
9050: 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 43  mp(zFieldName,"C
9060: 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 22 29 3d 3d  ontent-type:")==
9070: 30 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6e 74  0 ){.      zCont
9080: 65 6e 74 54 79 70 65 20 3d 20 53 74 72 44 75 70  entType = StrDup
9090: 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  (zVal);.    }els
90a0: 65 20 69 66 28 20 73 74 72 63 61 73 65 63 6d 70  e if( strcasecmp
90b0: 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 52 65 66  (zFieldName,"Ref
90c0: 65 72 65 72 3a 22 29 3d 3d 30 20 29 7b 0a 20 20  erer:")==0 ){.  
90d0: 20 20 20 20 69 66 28 20 73 74 72 73 74 72 28 7a      if( strstr(z
90e0: 56 61 6c 2c 20 22 64 65 76 69 64 73 2e 6e 65 74  Val, "devids.net
90f0: 2f 22 29 21 3d 30 20 29 20 46 6f 72 62 69 64 64  /")!=0 ) Forbidd
9100: 65 6e 28 29 3b 0a 20 20 20 20 20 20 7a 52 65 66  en();.      zRef
9110: 65 72 65 72 20 3d 20 53 74 72 44 75 70 28 7a 56  erer = StrDup(zV
9120: 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  al);.    }else i
9130: 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46  f( strcasecmp(zF
9140: 69 65 6c 64 4e 61 6d 65 2c 22 43 6f 6f 6b 69 65  ieldName,"Cookie
9150: 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  :")==0 ){.      
9160: 7a 43 6f 6f 6b 69 65 20 3d 20 53 74 72 41 70 70  zCookie = StrApp
9170: 65 6e 64 28 7a 43 6f 6f 6b 69 65 2c 22 3b 20 22  end(zCookie,"; "
9180: 2c 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  ,zVal);.    }els
9190: 65 20 69 66 28 20 73 74 72 63 61 73 65 63 6d 70  e if( strcasecmp
91a0: 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 43 6f 6e  (zFieldName,"Con
91b0: 6e 65 63 74 69 6f 6e 3a 22 29 3d 3d 30 20 29 7b  nection:")==0 ){
91c0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 61  .      if( strca
91d0: 73 65 63 6d 70 28 7a 56 61 6c 2c 22 63 6c 6f 73  secmp(zVal,"clos
91e0: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
91f0: 20 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f    closeConnectio
9200: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  n = 1;.      }el
9210: 73 65 20 69 66 28 20 21 66 6f 72 63 65 43 6c 6f  se if( !forceClo
9220: 73 65 20 26 26 20 73 74 72 63 61 73 65 63 6d 70  se && strcasecmp
9230: 28 7a 56 61 6c 2c 20 22 6b 65 65 70 2d 61 6c 69  (zVal, "keep-ali
9240: 76 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ve")==0 ){.     
9250: 20 20 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69     closeConnecti
9260: 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  on = 0;.      }.
9270: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
9280: 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e  rcasecmp(zFieldN
9290: 61 6d 65 2c 22 48 6f 73 74 3a 22 29 3d 3d 30 20  ame,"Host:")==0 
92a0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 53  ){.      int inS
92b0: 71 75 61 72 65 20 3d 20 30 3b 0a 20 20 20 20 20  quare = 0;.     
92c0: 20 63 68 61 72 20 63 3b 0a 20 20 20 20 20 20 7a   char c;.      z
92d0: 48 74 74 70 48 6f 73 74 20 3d 20 53 74 72 44 75  HttpHost = StrDu
92e0: 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 7a  p(zVal);.      z
92f0: 53 65 72 76 65 72 50 6f 72 74 20 3d 20 7a 53 65  ServerPort = zSe
9300: 72 76 65 72 4e 61 6d 65 20 3d 20 53 74 72 44 75  rverName = StrDu
9310: 70 28 7a 48 74 74 70 48 6f 73 74 29 3b 0a 20 20  p(zHttpHost);.  
9320: 20 20 20 20 77 68 69 6c 65 28 20 7a 53 65 72 76      while( zServ
9330: 65 72 50 6f 72 74 20 26 26 20 28 63 20 3d 20 2a  erPort && (c = *
9340: 7a 53 65 72 76 65 72 50 6f 72 74 29 21 3d 30 0a  zServerPort)!=0.
9350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
9360: 20 28 63 21 3d 27 3a 27 20 7c 7c 20 69 6e 53 71   (c!=':' || inSq
9370: 75 61 72 65 29 20 29 7b 0a 20 20 20 20 20 20 20  uare) ){.       
9380: 20 69 66 28 20 63 3d 3d 27 5b 27 20 29 20 69 6e   if( c=='[' ) in
9390: 53 71 75 61 72 65 20 3d 20 31 3b 0a 20 20 20 20  Square = 1;.    
93a0: 20 20 20 20 69 66 28 20 63 3d 3d 27 5d 27 20 29      if( c==']' )
93b0: 20 69 6e 53 71 75 61 72 65 20 3d 20 30 3b 0a 20   inSquare = 0;. 
93c0: 20 20 20 20 20 20 20 7a 53 65 72 76 65 72 50 6f         zServerPo
93d0: 72 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rt++;.      }.  
93e0: 20 20 20 20 69 66 28 20 7a 53 65 72 76 65 72 50      if( zServerP
93f0: 6f 72 74 20 26 26 20 2a 7a 53 65 72 76 65 72 50  ort && *zServerP
9400: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ort ){.        *
9410: 7a 53 65 72 76 65 72 50 6f 72 74 20 3d 20 30 3b  zServerPort = 0;
9420: 0a 20 20 20 20 20 20 20 20 7a 53 65 72 76 65 72  .        zServer
9430: 50 6f 72 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  Port++;.      }.
9440: 20 20 20 20 20 20 69 66 28 20 7a 52 65 61 6c 50        if( zRealP
9450: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ort ){.        z
9460: 53 65 72 76 65 72 50 6f 72 74 20 3d 20 53 74 72  ServerPort = Str
9470: 44 75 70 28 7a 52 65 61 6c 50 6f 72 74 29 3b 0a  Dup(zRealPort);.
9480: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
9490: 65 20 69 66 28 20 73 74 72 63 61 73 65 63 6d 70  e if( strcasecmp
94a0: 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 41 75 74  (zFieldName,"Aut
94b0: 68 6f 72 69 7a 61 74 69 6f 6e 3a 22 29 3d 3d 30  horization:")==0
94c0: 20 29 7b 0a 20 20 20 20 20 20 7a 41 75 74 68 54   ){.      zAuthT
94d0: 79 70 65 20 3d 20 47 65 74 46 69 72 73 74 45 6c  ype = GetFirstEl
94e0: 65 6d 65 6e 74 28 53 74 72 44 75 70 28 7a 56 61  ement(StrDup(zVa
94f0: 6c 29 2c 20 26 7a 41 75 74 68 41 72 67 29 3b 0a  l), &zAuthArg);.
9500: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
9510: 44 69 73 61 6c 6c 6f 77 20 72 65 66 65 72 72 69  Disallow referri
9520: 6e 67 20 66 72 6f 6d 20 63 65 72 74 61 69 6e 20  ng from certain 
9530: 63 6c 69 65 6e 74 73 20 2a 2f 0a 20 20 69 66 28  clients */.  if(
9540: 20 7a 41 67 65 6e 74 20 29 7b 0a 20 20 20 20 69   zAgent ){.    i
9550: 66 28 20 73 74 72 73 74 72 28 7a 41 67 65 6e 74  f( strstr(zAgent
9560: 2c 20 22 57 69 6e 64 6f 77 73 5f 39 22 29 21 3d  , "Windows_9")!=
9570: 30 0a 20 20 20 20 20 7c 7c 20 73 74 72 73 74 72  0.     || strstr
9580: 28 7a 41 67 65 6e 74 2c 20 22 44 6f 77 6e 6c 6f  (zAgent, "Downlo
9590: 61 64 5f 4d 61 73 74 65 72 22 29 21 3d 30 0a 20  ad_Master")!=0. 
95a0: 20 20 20 20 7c 7c 20 73 74 72 73 74 72 28 7a 41      || strstr(zA
95b0: 67 65 6e 74 2c 20 22 45 7a 6f 6f 6d 73 2f 22 29  gent, "Ezooms/")
95c0: 21 3d 30 0a 20 20 20 2f 2a 7c 7c 20 73 74 72 73  !=0.   /*|| strs
95d0: 74 72 28 7a 41 67 65 6e 74 2c 20 22 62 69 6e 67  tr(zAgent, "bing
95e0: 62 6f 74 22 29 21 3d 30 2a 2f 0a 20 20 20 20 20  bot")!=0*/.     
95f0: 7c 7c 20 73 74 72 73 74 72 28 7a 41 67 65 6e 74  || strstr(zAgent
9600: 2c 20 22 41 68 72 65 66 73 42 6f 74 22 29 21 3d  , "AhrefsBot")!=
9610: 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 46  0.    ){.      F
9620: 6f 72 62 69 64 64 65 6e 28 29 3b 0a 20 20 20 20  orbidden();.    
9630: 7d 0a 20 20 7d 0a 23 69 66 20 30 0a 20 20 69 66  }.  }.#if 0.  if
9640: 28 20 7a 52 65 66 65 72 65 72 20 29 7b 0a 20 20  ( zReferer ){.  
9650: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
9660: 68 61 72 20 2a 61 7a 44 69 73 61 6c 6c 6f 77 5b  har *azDisallow[
9670: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 22 73 6b 69  ] = {.      "ski
9680: 64 72 6f 77 63 72 61 63 6b 2e 63 6f 6d 22 2c 0a  drowcrack.com",.
9690: 20 20 20 20 20 20 22 68 6f 73 68 69 79 75 75 67        "hoshiyuug
96a0: 69 2e 74 69 73 74 6f 72 79 2e 63 6f 6d 22 2c 0a  i.tistory.com",.
96b0: 20 20 20 20 20 20 22 73 6b 69 64 72 6f 77 67 61        "skidrowga
96c0: 6d 65 73 2e 6e 65 74 22 2c 0a 20 20 20 20 7d 3b  mes.net",.    };
96d0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
96e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
96f0: 66 28 61 7a 44 69 73 61 6c 6c 6f 77 29 2f 73 69  f(azDisallow)/si
9700: 7a 65 6f 66 28 61 7a 44 69 73 61 6c 6c 6f 77 5b  zeof(azDisallow[
9710: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  0]); i++){.     
9720: 20 69 66 28 20 73 74 72 73 74 72 28 7a 52 65 66   if( strstr(zRef
9730: 65 72 65 72 2c 20 61 7a 44 69 73 61 6c 6c 6f 77  erer, azDisallow
9740: 5b 69 5d 29 21 3d 30 20 29 20 4e 6f 74 46 6f 75  [i])!=0 ) NotFou
9750: 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  nd(__LINE__);.  
9760: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
9770: 20 20 2f 2a 20 4d 61 6b 65 20 61 6e 20 65 78 74    /* Make an ext
9780: 72 61 20 65 66 66 6f 72 74 20 74 6f 20 67 65 74  ra effort to get
9790: 20 61 20 76 61 6c 69 64 20 73 65 72 76 65 72 20   a valid server 
97a0: 6e 61 6d 65 20 61 6e 64 20 70 6f 72 74 20 6e 75  name and port nu
97b0: 6d 62 65 72 2e 0a 20 20 2a 2a 20 4f 6e 6c 79 20  mber..  ** Only 
97c0: 4e 65 74 73 63 61 70 65 20 70 72 6f 76 69 64 65  Netscape provide
97d0: 73 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  s this informati
97e0: 6f 6e 2e 20 20 49 66 20 74 68 65 20 62 72 6f 77  on.  If the brow
97f0: 73 65 72 20 69 73 0a 20 20 2a 2a 20 49 6e 74 65  ser is.  ** Inte
9800: 72 6e 65 74 20 45 78 70 6c 6f 72 65 72 2c 20 74  rnet Explorer, t
9810: 68 65 6e 20 77 65 20 68 61 76 65 20 74 6f 20 66  hen we have to f
9820: 69 6e 64 20 6f 75 74 20 74 68 65 20 69 6e 66 6f  ind out the info
9830: 72 6d 61 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a  rmation for.  **
9840: 20 6f 75 72 73 65 6c 76 65 73 2e 0a 20 20 2a 2f   ourselves..  */
9850: 0a 20 20 69 66 28 20 7a 53 65 72 76 65 72 4e 61  .  if( zServerNa
9860: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53 65  me==0 ){.    zSe
9870: 72 76 65 72 4e 61 6d 65 20 3d 20 53 61 66 65 4d  rverName = SafeM
9880: 61 6c 6c 6f 63 28 20 31 30 30 20 29 3b 0a 20 20  alloc( 100 );.  
9890: 20 20 67 65 74 68 6f 73 74 6e 61 6d 65 28 7a 53    gethostname(zS
98a0: 65 72 76 65 72 4e 61 6d 65 2c 31 30 30 29 3b 0a  erverName,100);.
98b0: 20 20 7d 0a 20 20 69 66 28 20 7a 53 65 72 76 65    }.  if( zServe
98c0: 72 50 6f 72 74 3d 3d 30 20 7c 7c 20 2a 7a 53 65  rPort==0 || *zSe
98d0: 72 76 65 72 50 6f 72 74 3d 3d 30 20 29 7b 0a 20  rverPort==0 ){. 
98e0: 20 20 20 7a 53 65 72 76 65 72 50 6f 72 74 20 3d     zServerPort =
98f0: 20 44 45 46 41 55 4c 54 5f 50 4f 52 54 3b 0a 20   DEFAULT_PORT;. 
9900: 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20   }..  /* Remove 
9910: 74 68 65 20 71 75 65 72 79 20 73 74 72 69 6e 67  the query string
9920: 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66   from the end of
9930: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 66   the requested f
9940: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ile..  */.  for(
9950: 7a 3d 7a 53 63 72 69 70 74 3b 20 2a 7a 20 26 26  z=zScript; *z &&
9960: 20 2a 7a 21 3d 27 3f 27 3b 20 7a 2b 2b 29 7b 7d   *z!='?'; z++){}
9970: 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 3f 27 20 29  .  if( *z=='?' )
9980: 7b 0a 20 20 20 20 7a 51 75 65 72 79 53 75 66 66  {.    zQuerySuff
9990: 69 78 20 3d 20 53 74 72 44 75 70 28 7a 29 3b 0a  ix = StrDup(z);.
99a0: 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 7d 65      *z = 0;.  }e
99b0: 6c 73 65 7b 0a 20 20 20 20 7a 51 75 65 72 79 53  lse{.    zQueryS
99c0: 75 66 66 69 78 20 3d 20 22 22 3b 0a 20 20 7d 0a  uffix = "";.  }.
99d0: 20 20 7a 51 75 65 72 79 53 74 72 69 6e 67 20 3d    zQueryString =
99e0: 20 2a 7a 51 75 65 72 79 53 75 66 66 69 78 20 3f   *zQuerySuffix ?
99f0: 20 26 7a 51 75 65 72 79 53 75 66 66 69 78 5b 31   &zQuerySuffix[1
9a00: 5d 20 3a 20 7a 51 75 65 72 79 53 75 66 66 69 78  ] : zQuerySuffix
9a10: 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 61  ;..  /* Create a
9a20: 20 66 69 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68   file to hold th
9a30: 65 20 50 4f 53 54 20 71 75 65 72 79 20 64 61 74  e POST query dat
9a40: 61 2c 20 69 66 20 61 6e 79 2e 20 20 57 65 20 68  a, if any.  We h
9a50: 61 76 65 20 74 6f 0a 20 20 2a 2a 20 64 6f 20 69  ave to.  ** do i
9a60: 74 20 74 68 69 73 20 77 61 79 2e 20 20 57 65 20  t this way.  We 
9a70: 63 61 6e 27 74 20 6a 75 73 74 20 70 61 73 73 20  can't just pass 
9a80: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
9a90: 74 6f 72 20 64 6f 77 6e 20 74 6f 0a 20 20 2a 2a  tor down to.  **
9aa0: 20 74 68 65 20 63 68 69 6c 64 20 70 72 6f 63 65   the child proce
9ab0: 73 73 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ss because the f
9ac0: 67 65 74 73 28 29 20 66 75 6e 63 74 69 6f 6e 20  gets() function 
9ad0: 6d 61 79 20 68 61 76 65 20 61 6c 72 65 61 64 79  may have already
9ae0: 0a 20 20 2a 2a 20 72 65 61 64 20 70 61 72 74 20  .  ** read part 
9af0: 6f 66 20 74 68 65 20 50 4f 53 54 20 64 61 74 61  of the POST data
9b00: 20 69 6e 74 6f 20 69 74 73 20 69 6e 74 65 72 6e   into its intern
9b10: 61 6c 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a  al buffer..  */.
9b20: 20 20 69 66 28 20 7a 4d 65 74 68 6f 64 5b 30 5d    if( zMethod[0]
9b30: 3d 3d 27 50 27 20 26 26 20 7a 43 6f 6e 74 65 6e  =='P' && zConten
9b40: 74 4c 65 6e 67 74 68 21 3d 30 20 29 7b 0a 20 20  tLength!=0 ){.  
9b50: 20 20 69 6e 74 20 6c 65 6e 20 3d 20 61 74 6f 69    int len = atoi
9b60: 28 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 29  (zContentLength)
9b70: 3b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 3b  ;.    FILE *out;
9b80: 0a 20 20 20 20 63 68 61 72 20 2a 7a 42 75 66 3b  .    char *zBuf;
9b90: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20  .    int n;..   
9ba0: 20 69 66 28 20 6c 65 6e 3e 4d 41 58 5f 43 4f 4e   if( len>MAX_CON
9bb0: 54 45 4e 54 5f 4c 45 4e 47 54 48 20 29 7b 0a 20  TENT_LENGTH ){. 
9bc0: 20 20 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e       StartRespon
9bd0: 73 65 28 22 35 30 30 20 52 65 71 75 65 73 74 20  se("500 Request 
9be0: 74 6f 6f 20 6c 61 72 67 65 22 29 3b 0a 20 20 20  too large");.   
9bf0: 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74     nOut += print
9c00: 66 28 0a 20 20 20 20 20 20 20 20 22 43 6f 6e 74  f(.        "Cont
9c10: 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 70  ent-type: text/p
9c20: 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 20 20  lain\r\n".      
9c30: 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 20 20 20    "\r\n".       
9c40: 20 22 54 6f 6f 20 6d 75 63 68 20 50 4f 53 54 20   "Too much POST 
9c50: 64 61 74 61 5c 6e 22 0a 20 20 20 20 20 20 29 3b  data\n".      );
9c60: 0a 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e  .      MakeLogEn
9c70: 74 72 79 28 30 29 3b 0a 20 20 20 20 20 20 65 78  try(0);.      ex
9c80: 69 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  it(0);.    }.   
9c90: 20 73 70 72 69 6e 74 66 28 7a 54 6d 70 4e 61 6d   sprintf(zTmpNam
9ca0: 42 75 66 2c 20 22 2f 74 6d 70 2f 2d 70 6f 73 74  Buf, "/tmp/-post
9cb0: 2d 64 61 74 61 2d 58 58 58 58 58 58 22 29 3b 0a  -data-XXXXXX");.
9cc0: 20 20 20 20 7a 54 6d 70 4e 61 6d 20 3d 20 7a 54      zTmpNam = zT
9cd0: 6d 70 4e 61 6d 42 75 66 3b 0a 20 20 20 20 6d 6b  mpNamBuf;.    mk
9ce0: 73 74 65 6d 70 28 7a 54 6d 70 4e 61 6d 29 3b 0a  stemp(zTmpNam);.
9cf0: 20 20 20 20 6f 75 74 20 3d 20 66 6f 70 65 6e 28      out = fopen(
9d00: 7a 54 6d 70 4e 61 6d 2c 22 77 22 29 3b 0a 20 20  zTmpNam,"w");.  
9d10: 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a    if( out==0 ){.
9d20: 20 20 20 20 20 20 53 74 61 72 74 52 65 73 70 6f        StartRespo
9d30: 6e 73 65 28 22 35 30 30 20 43 61 6e 6e 6f 74 20  nse("500 Cannot 
9d40: 63 72 65 61 74 65 20 2f 74 6d 70 20 66 69 6c 65  create /tmp file
9d50: 22 29 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b  ");.      nOut +
9d60: 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  = printf(.      
9d70: 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a    "Content-type:
9d80: 20 74 65 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22   text/plain\r\n"
9d90: 0a 20 20 20 20 20 20 20 20 22 5c 72 5c 6e 22 0a  .        "\r\n".
9da0: 20 20 20 20 20 20 20 20 22 43 6f 75 6c 64 20 6e          "Could n
9db0: 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20 66  ot open \"%s\" f
9dc0: 6f 72 20 77 72 69 74 69 6e 67 5c 6e 22 2c 20 7a  or writing\n", z
9dd0: 54 6d 70 4e 61 6d 0a 20 20 20 20 20 20 29 3b 0a  TmpNam.      );.
9de0: 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74        MakeLogEnt
9df0: 72 79 28 30 29 3b 0a 20 20 20 20 20 20 65 78 69  ry(0);.      exi
9e00: 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t(0);.    }.    
9e10: 7a 42 75 66 20 3d 20 53 61 66 65 4d 61 6c 6c 6f  zBuf = SafeMallo
9e20: 63 28 20 6c 65 6e 20 29 3b 0a 20 20 20 20 69 66  c( len );.    if
9e30: 28 20 75 73 65 54 69 6d 65 6f 75 74 20 29 20 61  ( useTimeout ) a
9e40: 6c 61 72 6d 28 31 35 20 2b 20 6c 65 6e 2f 32 30  larm(15 + len/20
9e50: 30 30 29 3b 0a 20 20 20 20 6e 20 3d 20 66 72 65  00);.    n = fre
9e60: 61 64 28 7a 42 75 66 2c 31 2c 6c 65 6e 2c 73 74  ad(zBuf,1,len,st
9e70: 64 69 6e 29 3b 0a 20 20 20 20 6e 49 6e 20 2b 3d  din);.    nIn +=
9e80: 20 6e 3b 0a 20 20 20 20 66 77 72 69 74 65 28 7a   n;.    fwrite(z
9e90: 42 75 66 2c 31 2c 6e 2c 6f 75 74 29 3b 0a 20 20  Buf,1,n,out);.  
9ea0: 20 20 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20    free(zBuf);.  
9eb0: 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20    fclose(out);. 
9ec0: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
9ed0: 72 65 20 74 68 65 20 72 75 6e 6e 69 6e 67 20 74  re the running t
9ee0: 69 6d 65 20 69 73 20 6e 6f 74 20 74 6f 6f 20 67  ime is not too g
9ef0: 72 65 61 74 20 2a 2f 0a 20 20 69 66 28 20 75 73  reat */.  if( us
9f00: 65 54 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d  eTimeout ) alarm
9f10: 28 31 30 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76  (10);..  /* Conv
9f20: 65 72 74 20 61 6c 6c 20 75 6e 75 73 75 61 6c 20  ert all unusual 
9f30: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
9f40: 65 20 73 63 72 69 70 74 20 6e 61 6d 65 20 69 6e  e script name in
9f50: 74 6f 20 22 5f 22 2e 0a 20 20 2a 2a 0a 20 20 2a  to "_"..  **.  *
9f60: 2a 20 54 68 69 73 20 69 73 20 61 20 64 65 66 65  * This is a defe
9f70: 6e 73 65 20 61 67 61 69 6e 73 74 20 76 61 72 69  nse against vari
9f80: 6f 75 73 20 61 74 74 61 63 6b 73 2c 20 58 53 53  ous attacks, XSS
9f90: 20 61 74 74 61 63 6b 73 20 69 6e 20 70 61 72 74   attacks in part
9fa0: 69 63 75 6c 61 72 2e 0a 20 20 2a 2f 0a 20 20 66  icular..  */.  f
9fb0: 6f 72 28 7a 3d 7a 53 63 72 69 70 74 3b 20 2a 7a  or(z=zScript; *z
9fc0: 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 75 6e 73 69  ; z++){.    unsi
9fd0: 67 6e 65 64 20 63 68 61 72 20 63 20 3d 20 2a 28  gned char c = *(
9fe0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a  unsigned char*)z
9ff0: 3b 0a 20 20 20 20 69 66 28 20 28 63 26 30 78 38  ;.    if( (c&0x8
a000: 30 29 21 3d 30 20 7c 7c 20 21 61 6c 6c 6f 77 65  0)!=0 || !allowe
a010: 64 49 6e 4e 61 6d 65 5b 63 5d 20 29 7b 0a 20 20  dInName[c] ){.  
a020: 20 20 20 20 2a 7a 20 3d 20 27 5f 27 3b 0a 20 20      *z = '_';.  
a030: 20 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20 26      if( c=='%' &
a040: 26 20 7a 5b 31 5d 21 3d 30 20 26 26 20 7a 5b 32  & z[1]!=0 && z[2
a050: 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]!=0 ){.        
a060: 66 6f 72 28 69 3d 33 3b 20 28 7a 5b 69 2d 32 5d  for(i=3; (z[i-2]
a070: 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b   = z[i])!=0; i++
a080: 29 7b 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ){}.      }.    
a090: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 27  }.  }..  /* Don'
a0a0: 74 20 61 6c 6c 6f 77 20 22 2f 2e 22 20 6f 72 20  t allow "/." or 
a0b0: 22 2f 2d 22 20 74 6f 20 74 6f 20 6f 63 63 75 72  "/-" to to occur
a0c0: 20 61 6e 79 77 68 65 72 65 20 69 6e 20 74 68 65   anywhere in the
a0d0: 20 65 6e 74 69 74 79 20 6e 61 6d 65 2e 0a 20 20   entity name..  
a0e0: 2a 2a 20 54 68 69 73 20 70 72 65 76 65 6e 74 73  ** This prevents
a0f0: 20 61 74 74 61 63 6b 73 20 69 6e 76 6f 6c 76 69   attacks involvi
a100: 6e 67 20 22 2e 2e 22 20 61 6e 64 20 61 6c 73 6f  ng ".." and also
a110: 20 61 6c 6c 6f 77 73 20 75 73 20 74 6f 20 63 72   allows us to cr
a120: 65 61 74 65 0a 20 20 2a 2a 20 66 69 6c 65 73 20  eate.  ** files 
a130: 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20  and directories 
a140: 77 68 6f 73 65 20 6e 61 6d 65 73 20 62 65 67 69  whose names begi
a150: 6e 20 77 69 74 68 20 22 2d 22 20 77 68 69 63 68  n with "-" which
a160: 20 61 72 65 20 69 6e 76 69 73 69 62 6c 65 0a 20   are invisible. 
a170: 20 2a 2a 20 74 6f 20 74 68 65 20 77 65 62 73 65   ** to the webse
a180: 72 76 65 72 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  rver..  */.  for
a190: 28 7a 3d 7a 53 63 72 69 70 74 3b 20 2a 7a 3b 20  (z=zScript; *z; 
a1a0: 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a  z++){.    if( *z
a1b0: 3d 3d 27 2f 27 20 26 26 20 28 7a 5b 31 5d 3d 3d  =='/' && (z[1]==
a1c0: 27 2e 27 20 7c 7c 20 7a 5b 31 5d 3d 3d 27 2d 27  '.' || z[1]=='-'
a1d0: 29 20 29 7b 0a 20 20 20 20 20 20 20 4e 6f 74 46  ) ){.       NotF
a1e0: 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  ound(__LINE__);.
a1f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
a200: 46 69 67 75 72 65 20 6f 75 74 20 77 68 61 74 20  Figure out what 
a210: 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
a220: 66 69 6c 65 73 79 73 74 65 6d 20 73 68 6f 75 6c  filesystem shoul
a230: 64 20 62 65 2e 20 20 49 66 20 74 68 65 0a 20 20  d be.  If the.  
a240: 2a 2a 20 48 54 54 50 5f 48 4f 53 54 20 70 61 72  ** HTTP_HOST par
a250: 61 6d 65 74 65 72 20 65 78 69 73 74 73 20 28 73  ameter exists (s
a260: 74 6f 72 65 64 20 69 6e 20 7a 48 74 74 70 48 6f  tored in zHttpHo
a270: 73 74 29 20 74 68 65 6e 20 72 65 6d 6f 76 65 20  st) then remove 
a280: 74 68 65 0a 20 20 2a 2a 20 70 6f 72 74 20 6e 75  the.  ** port nu
a290: 6d 62 65 72 20 66 72 6f 6d 20 74 68 65 20 65 6e  mber from the en
a2a0: 64 20 28 69 66 20 61 6e 79 29 2c 20 63 6f 6e 76  d (if any), conv
a2b0: 65 72 74 20 61 6c 6c 20 63 68 61 72 61 63 74 65  ert all characte
a2c0: 72 73 20 74 6f 20 6c 6f 77 65 72 0a 20 20 2a 2a  rs to lower.  **
a2d0: 20 63 61 73 65 2c 20 61 6e 64 20 63 6f 6e 76 65   case, and conve
a2e0: 72 74 20 61 6c 6c 20 22 2e 22 20 74 6f 20 22 5f  rt all "." to "_
a2f0: 22 2e 20 20 54 68 65 6e 20 74 72 79 20 74 6f 20  ".  Then try to 
a300: 66 69 6e 64 20 61 20 64 69 72 65 63 74 6f 72 79  find a directory
a310: 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 61 74 20  .  ** with that 
a320: 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 65 78 74  name and the ext
a330: 65 6e 73 69 6f 6e 20 2e 77 65 62 73 69 74 65 2e  ension .website.
a340: 20 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20    If not found, 
a350: 6c 6f 6f 6b 0a 20 20 2a 2a 20 66 6f 72 20 22 64  look.  ** for "d
a360: 65 66 61 75 6c 74 2e 77 65 62 73 69 74 65 22 2e  efault.website".
a370: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 53 63 72  .  */.  if( zScr
a380: 69 70 74 5b 30 5d 21 3d 27 2f 27 20 29 20 4e 6f  ipt[0]!='/' ) No
a390: 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29  tFound(__LINE__)
a3a0: 3b 0a 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a  ;.  if( strlen(z
a3b0: 52 6f 6f 74 29 2b 34 30 20 3e 3d 20 73 69 7a 65  Root)+40 >= size
a3c0: 6f 66 28 7a 4c 69 6e 65 29 20 29 20 4e 6f 74 46  of(zLine) ) NotF
a3d0: 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  ound(__LINE__);.
a3e0: 20 20 69 66 28 20 7a 48 74 74 70 48 6f 73 74 3d    if( zHttpHost=
a3f0: 3d 30 20 7c 7c 20 7a 48 74 74 70 48 6f 73 74 5b  =0 || zHttpHost[
a400: 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 4e 6f 74  0]==0 ){.    Not
a410: 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b  Found(__LINE__);
a420: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
a430: 6c 65 6e 28 7a 48 74 74 70 48 6f 73 74 29 2b 73  len(zHttpHost)+s
a440: 74 72 6c 65 6e 28 7a 52 6f 6f 74 29 2b 31 30 20  trlen(zRoot)+10 
a450: 3e 3d 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29  >= sizeof(zLine)
a460: 20 29 7b 0a 20 20 20 20 4e 6f 74 46 6f 75 6e 64   ){.    NotFound
a470: 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65  (__LINE__);.  }e
a480: 6c 73 65 7b 0a 20 20 20 20 73 70 72 69 6e 74 66  lse{.    sprintf
a490: 28 7a 4c 69 6e 65 2c 20 22 25 73 2f 25 73 22 2c  (zLine, "%s/%s",
a4a0: 20 7a 52 6f 6f 74 2c 20 7a 48 74 74 70 48 6f 73   zRoot, zHttpHos
a4b0: 74 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 73 74  t);.    for(i=st
a4c0: 72 6c 65 6e 28 7a 52 6f 6f 74 29 2b 31 3b 20 7a  rlen(zRoot)+1; z
a4d0: 4c 69 6e 65 5b 69 5d 20 26 26 20 7a 4c 69 6e 65  Line[i] && zLine
a4e0: 5b 69 5d 21 3d 27 3a 27 3b 20 69 2b 2b 29 7b 0a  [i]!=':'; i++){.
a4f0: 20 20 20 20 20 20 69 6e 74 20 63 20 3d 20 7a 4c        int c = zL
a500: 69 6e 65 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  ine[i];.      if
a510: 28 20 21 69 73 61 6c 6e 75 6d 28 63 29 20 29 7b  ( !isalnum(c) ){
a520: 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 69  .        zLine[i
a530: 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 7d  ] = '_';.      }
a540: 65 6c 73 65 20 69 66 28 20 69 73 75 70 70 65 72  else if( isupper
a550: 28 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  (c) ){.        z
a560: 4c 69 6e 65 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65  Line[i] = tolowe
a570: 72 28 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  r(c);.      }.  
a580: 20 20 7d 0a 20 20 20 20 73 74 72 63 70 79 28 26    }.    strcpy(&
a590: 7a 4c 69 6e 65 5b 69 5d 2c 20 22 2e 77 65 62 73  zLine[i], ".webs
a5a0: 69 74 65 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ite");.  }.  if(
a5b0: 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61   stat(zLine,&sta
a5c0: 74 62 75 66 29 20 7c 7c 20 21 53 5f 49 53 44 49  tbuf) || !S_ISDI
a5d0: 52 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64  R(statbuf.st_mod
a5e0: 65 29 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74  e) ){.    sprint
a5f0: 66 28 7a 4c 69 6e 65 2c 20 22 25 73 2f 64 65 66  f(zLine, "%s/def
a600: 61 75 6c 74 2e 77 65 62 73 69 74 65 22 2c 20 7a  ault.website", z
a610: 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 73  Root);.    if( s
a620: 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62  tat(zLine,&statb
a630: 75 66 29 20 7c 7c 20 21 53 5f 49 53 44 49 52 28  uf) || !S_ISDIR(
a640: 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29  statbuf.st_mode)
a650: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74   ){.      if( st
a660: 61 6e 64 61 6c 6f 6e 65 20 29 7b 0a 20 20 20 20  andalone ){.    
a670: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e      sprintf(zLin
a680: 65 2c 20 22 25 73 22 2c 20 7a 52 6f 6f 74 29 3b  e, "%s", zRoot);
a690: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a6a0: 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f        NotFound(_
a6b0: 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
a6c0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 48  }.    }.  }.  zH
a6d0: 6f 6d 65 20 3d 20 53 74 72 44 75 70 28 7a 4c 69  ome = StrDup(zLi
a6e0: 6e 65 29 3b 0a 0a 20 20 2f 2a 20 43 68 61 6e 67  ne);..  /* Chang
a6f0: 65 20 64 69 72 65 63 74 6f 72 69 65 73 20 74 6f  e directories to
a700: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
a710: 20 48 54 54 50 20 66 69 6c 65 73 79 73 74 65 6d   HTTP filesystem
a720: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 64 69  .  */.  if( chdi
a730: 72 28 7a 48 6f 6d 65 29 21 3d 30 20 29 7b 0a 20  r(zHome)!=0 ){. 
a740: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30     char zBuf[100
a750: 30 5d 3b 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74  0];.    Malfunct
a760: 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 63  ion(__LINE__, "c
a770: 61 6e 6e 6f 74 20 63 68 64 69 72 20 74 6f 20 5b  annot chdir to [
a780: 25 73 5d 20 66 72 6f 6d 20 5b 25 73 5d 22 2c 0a  %s] from [%s]",.
a790: 20 20 20 20 20 20 20 20 20 7a 48 6f 6d 65 2c 20           zHome, 
a7a0: 67 65 74 63 77 64 28 7a 42 75 66 2c 39 39 39 29  getcwd(zBuf,999)
a7b0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  );.  }..  /* Loc
a7c0: 61 74 65 20 74 68 65 20 66 69 6c 65 20 69 6e 20  ate the file in 
a7d0: 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 2e 20  the filesystem. 
a7e0: 20 57 65 20 6d 69 67 68 74 20 68 61 76 65 20 74   We might have t
a7f0: 6f 20 61 70 70 65 6e 64 0a 20 20 2a 2a 20 74 68  o append.  ** th
a800: 65 20 6e 61 6d 65 20 22 69 6e 64 65 78 2e 68 74  e name "index.ht
a810: 6d 6c 22 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ml" in order to 
a820: 66 69 6e 64 20 69 74 2e 20 20 41 6e 79 20 65 78  find it.  Any ex
a830: 63 65 73 73 20 70 61 74 68 0a 20 20 2a 2a 20 69  cess path.  ** i
a840: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 70 75  nformation is pu
a850: 74 20 69 6e 74 6f 20 74 68 65 20 7a 50 61 74 68  t into the zPath
a860: 49 6e 66 6f 20 76 61 72 69 61 62 6c 65 2e 0a 20  Info variable.. 
a870: 20 2a 2f 0a 20 20 7a 4c 69 6e 65 5b 30 5d 20 3d   */.  zLine[0] =
a880: 20 27 2e 27 3b 0a 20 20 69 20 3d 20 30 3b 0a 20   '.';.  i = 0;. 
a890: 20 77 68 69 6c 65 28 20 7a 53 63 72 69 70 74 5b   while( zScript[
a8a0: 69 5d 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  i] ){.    while(
a8b0: 20 7a 53 63 72 69 70 74 5b 69 5d 20 26 26 20 7a   zScript[i] && z
a8c0: 53 63 72 69 70 74 5b 69 5d 21 3d 27 2f 27 20 29  Script[i]!='/' )
a8d0: 7b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 69 2b  {.      zLine[i+
a8e0: 31 5d 20 3d 20 7a 53 63 72 69 70 74 5b 69 5d 3b  1] = zScript[i];
a8f0: 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  .      i++;.    
a900: 7d 0a 20 20 20 20 7a 4c 69 6e 65 5b 69 2b 31 5d  }.    zLine[i+1]
a910: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 74   = 0;.    if( st
a920: 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75  at(zLine,&statbu
a930: 66 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  f)!=0 ){.      i
a940: 6e 74 20 73 74 69 6c 6c 53 65 61 72 63 68 69 6e  nt stillSearchin
a950: 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 77 68 69  g = 1;.      whi
a960: 6c 65 28 20 73 74 69 6c 6c 53 65 61 72 63 68 69  le( stillSearchi
a970: 6e 67 20 26 26 20 69 3e 30 20 29 7b 0a 20 20 20  ng && i>0 ){.   
a980: 20 20 20 20 20 77 68 69 6c 65 28 20 69 3e 30 20       while( i>0 
a990: 26 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d 27 2f 27  && zLine[i]!='/'
a9a0: 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ i--; }.     
a9b0: 20 20 20 73 74 72 63 70 79 28 26 7a 4c 69 6e 65     strcpy(&zLine
a9c0: 5b 69 5d 2c 20 22 2f 6e 6f 74 2d 66 6f 75 6e 64  [i], "/not-found
a9d0: 2e 68 74 6d 6c 22 29 3b 0a 20 20 20 20 20 20 20  .html");.       
a9e0: 20 69 66 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c   if( stat(zLine,
a9f0: 26 73 74 61 74 62 75 66 29 3d 3d 30 20 26 26 20  &statbuf)==0 && 
aa00: 53 5f 49 53 52 45 47 28 73 74 61 74 62 75 66 2e  S_ISREG(statbuf.
aa10: 73 74 5f 6d 6f 64 65 29 0a 20 20 20 20 20 20 20  st_mode).       
aa20: 20 20 20 20 20 26 26 20 61 63 63 65 73 73 28 7a       && access(z
aa30: 4c 69 6e 65 2c 52 5f 4f 4b 29 3d 3d 30 20 29 7b  Line,R_OK)==0 ){
aa40: 0a 20 20 20 20 20 20 20 20 20 20 7a 52 65 61 6c  .          zReal
aa50: 53 63 72 69 70 74 20 3d 20 53 74 72 44 75 70 28  Script = StrDup(
aa60: 26 7a 4c 69 6e 65 5b 31 5d 29 3b 0a 20 20 20 20  &zLine[1]);.    
aa70: 20 20 20 20 20 20 52 65 64 69 72 65 63 74 28 7a        Redirect(z
aa80: 52 65 61 6c 53 63 72 69 70 74 2c 20 31 29 3b 0a  RealScript, 1);.
aa90: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
aaa0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
aab0: 0a 20 20 20 20 20 20 20 20 20 20 69 2d 2d 3b 0a  .          i--;.
aac0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
aad0: 7d 0a 20 20 20 20 20 20 69 66 28 20 73 74 69 6c  }.      if( stil
aae0: 6c 53 65 61 72 63 68 69 6e 67 20 29 20 4e 6f 74  lSearching ) Not
aaf0: 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b  Found(__LINE__);
ab00: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ab10: 20 20 7d 0a 20 20 20 20 69 66 28 20 53 5f 49 53    }.    if( S_IS
ab20: 52 45 47 28 73 74 61 74 62 75 66 2e 73 74 5f 6d  REG(statbuf.st_m
ab30: 6f 64 65 29 20 29 7b 0a 20 20 20 20 20 20 69 66  ode) ){.      if
ab40: 28 20 61 63 63 65 73 73 28 7a 4c 69 6e 65 2c 52  ( access(zLine,R
ab50: 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20  _OK) ){.        
ab60: 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f  NotFound(__LINE_
ab70: 5f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  _);.      }.    
ab80: 20 20 7a 52 65 61 6c 53 63 72 69 70 74 20 3d 20    zRealScript = 
ab90: 53 74 72 44 75 70 28 26 7a 4c 69 6e 65 5b 31 5d  StrDup(&zLine[1]
aba0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
abb0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 53      }.    if( zS
abc0: 63 72 69 70 74 5b 69 5d 3d 3d 30 20 7c 7c 20 7a  cript[i]==0 || z
abd0: 53 63 72 69 70 74 5b 69 2b 31 5d 3d 3d 30 20 29  Script[i+1]==0 )
abe0: 7b 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 26  {.      strcpy(&
abf0: 7a 4c 69 6e 65 5b 69 2b 31 5d 2c 22 2f 69 6e 64  zLine[i+1],"/ind
ac00: 65 78 2e 68 74 6d 6c 22 29 3b 0a 20 20 20 20 20  ex.html");.     
ac10: 20 69 66 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c   if( stat(zLine,
ac20: 26 73 74 61 74 62 75 66 29 21 3d 30 20 7c 7c 20  &statbuf)!=0 || 
ac30: 21 53 5f 49 53 52 45 47 28 73 74 61 74 62 75 66  !S_ISREG(statbuf
ac40: 2e 73 74 5f 6d 6f 64 65 29 20 0a 20 20 20 20 20  .st_mode) .     
ac50: 20 7c 7c 20 61 63 63 65 73 73 28 7a 4c 69 6e 65   || access(zLine
ac60: 2c 52 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20  ,R_OK) ){.      
ac70: 20 20 73 74 72 63 70 79 28 26 7a 4c 69 6e 65 5b    strcpy(&zLine[
ac80: 69 2b 31 5d 2c 22 2f 69 6e 64 65 78 2e 63 67 69  i+1],"/index.cgi
ac90: 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ");.        if( 
aca0: 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74  stat(zLine,&stat
acb0: 62 75 66 29 21 3d 30 20 7c 7c 20 21 53 5f 49 53  buf)!=0 || !S_IS
acc0: 52 45 47 28 73 74 61 74 62 75 66 2e 73 74 5f 6d  REG(statbuf.st_m
acd0: 6f 64 65 29 20 0a 20 20 20 20 20 20 20 20 7c 7c  ode) .        ||
ace0: 20 61 63 63 65 73 73 28 7a 4c 69 6e 65 2c 52 5f   access(zLine,R_
acf0: 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OK) ){.         
ad00: 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45   NotFound(__LINE
ad10: 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  __);.        }. 
ad20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 52 65       }.      zRe
ad30: 61 6c 53 63 72 69 70 74 20 3d 20 53 74 72 44 75  alScript = StrDu
ad40: 70 28 26 7a 4c 69 6e 65 5b 31 5d 29 3b 0a 20 20  p(&zLine[1]);.  
ad50: 20 20 20 20 69 66 28 20 7a 53 63 72 69 70 74 5b      if( zScript[
ad60: 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  i]==0 ){.       
ad70: 20 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75 65   /* If the reque
ad80: 73 74 65 64 20 55 52 4c 20 64 6f 65 73 20 6e 6f  sted URL does no
ad90: 74 20 65 6e 64 20 77 69 74 68 20 22 2f 22 20 62  t end with "/" b
ada0: 75 74 20 77 65 20 68 61 64 20 74 6f 0a 20 20 20  ut we had to.   
adb0: 20 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 22       ** append "
adc0: 69 6e 64 65 78 2e 68 74 6d 6c 22 2c 20 74 68 65  index.html", the
add0: 6e 20 61 20 72 65 64 69 72 65 63 74 20 69 73 20  n a redirect is 
ade0: 6e 65 63 65 73 73 61 72 79 2e 20 20 4f 74 68 65  necessary.  Othe
adf0: 72 77 69 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  rwise.        **
ae00: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 65 6c   none of the rel
ae10: 61 74 69 76 65 20 55 52 4c 73 20 69 6e 20 74 68  ative URLs in th
ae20: 65 20 64 65 6c 69 76 65 72 65 64 20 64 6f 63 75  e delivered docu
ae30: 6d 65 6e 74 20 77 69 6c 6c 20 62 65 0a 20 20 20  ment will be.   
ae40: 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 2e       ** correct.
ae50: 20 2a 2f 0a 20 20 20 20 20 20 20 20 52 65 64 69   */.        Redi
ae60: 72 65 63 74 28 7a 52 65 61 6c 53 63 72 69 70 74  rect(zRealScript
ae70: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65  , 1);.        re
ae80: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
ae90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
aea0: 0a 20 20 20 20 7a 4c 69 6e 65 5b 69 2b 31 5d 20  .    zLine[i+1] 
aeb0: 3d 20 7a 53 63 72 69 70 74 5b 69 5d 3b 0a 20 20  = zScript[i];.  
aec0: 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 7a 46 69    i++;.  }.  zFi
aed0: 6c 65 20 3d 20 53 74 72 44 75 70 28 7a 4c 69 6e  le = StrDup(zLin
aee0: 65 29 3b 0a 20 20 7a 50 61 74 68 49 6e 66 6f 20  e);.  zPathInfo 
aef0: 3d 20 53 74 72 44 75 70 28 26 7a 53 63 72 69 70  = StrDup(&zScrip
af00: 74 5b 69 5d 29 3b 0a 20 20 6c 65 6e 46 69 6c 65  t[i]);.  lenFile
af10: 20 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29   = strlen(zFile)
af20: 3b 0a 20 20 7a 44 69 72 20 3d 20 53 74 72 44 75  ;.  zDir = StrDu
af30: 70 28 7a 46 69 6c 65 29 3b 0a 20 20 66 6f 72 28  p(zFile);.  for(
af40: 69 3d 73 74 72 6c 65 6e 28 7a 44 69 72 29 2d 31  i=strlen(zDir)-1
af50: 3b 20 69 3e 30 20 26 26 20 7a 44 69 72 5b 69 5d  ; i>0 && zDir[i]
af60: 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 3b 0a 20  !='/'; i--){};. 
af70: 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20   if( i==0 ){.   
af80: 20 20 73 74 72 63 70 79 28 7a 44 69 72 2c 22 2f    strcpy(zDir,"/
af90: 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
afa0: 20 20 7a 44 69 72 5b 69 5d 20 3d 20 30 3b 0a 20    zDir[i] = 0;. 
afb0: 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   }..  /* Check t
afc0: 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 69  o see if there i
afd0: 73 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  s an authorizati
afe0: 6f 6e 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  on file.  If the
aff0: 72 65 20 69 73 2c 0a 20 20 2a 2a 20 70 72 6f 63  re is,.  ** proc
b000: 65 73 73 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73  ess it..  */.  s
b010: 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 25  printf(zLine, "%
b020: 73 2f 2d 61 75 74 68 22 2c 20 7a 44 69 72 29 3b  s/-auth", zDir);
b030: 0a 20 20 69 66 28 20 61 63 63 65 73 73 28 7a 4c  .  if( access(zL
b040: 69 6e 65 2c 52 5f 4f 4b 29 3d 3d 30 20 26 26 20  ine,R_OK)==0 && 
b050: 21 43 68 65 63 6b 42 61 73 69 63 41 75 74 68 6f  !CheckBasicAutho
b060: 72 69 7a 61 74 69 6f 6e 28 7a 4c 69 6e 65 29 20  rization(zLine) 
b070: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
b080: 54 61 6b 65 20 61 70 70 72 6f 70 72 69 61 74 65  Take appropriate
b090: 20 61 63 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69   action.  */.  i
b0a0: 66 28 20 28 73 74 61 74 62 75 66 2e 73 74 5f 6d  f( (statbuf.st_m
b0b0: 6f 64 65 20 26 20 30 31 30 30 29 3d 3d 30 31 30  ode & 0100)==010
b0c0: 30 20 26 26 20 61 63 63 65 73 73 28 7a 46 69 6c  0 && access(zFil
b0d0: 65 2c 58 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20  e,X_OK)==0 ){.  
b0e0: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
b0f0: 66 6f 6c 6c 6f 77 69 6e 67 73 20 73 74 61 74 69  followings stati
b100: 63 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  c variables are 
b110: 75 73 65 64 20 74 6f 20 73 65 74 75 70 20 74 68  used to setup th
b120: 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 0a 20 20  e environment.  
b130: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 43 47 49    ** for the CGI
b140: 20 73 63 72 69 70 74 0a 20 20 20 20 2a 2f 0a 20   script.    */. 
b150: 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a     static char *
b160: 64 65 66 61 75 6c 74 5f 70 61 74 68 20 3d 20 22  default_path = "
b170: 2f 62 69 6e 3a 2f 75 73 72 2f 62 69 6e 22 3b 0a  /bin:/usr/bin";.
b180: 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20      static char 
b190: 2a 67 61 74 65 77 61 79 5f 69 6e 74 65 72 66 61  *gateway_interfa
b1a0: 63 65 20 3d 20 22 43 47 49 2f 31 2e 30 22 3b 0a  ce = "CGI/1.0";.
b1b0: 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63      static struc
b1c0: 74 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  t {.      char *
b1d0: 7a 45 6e 76 4e 61 6d 65 3b 0a 20 20 20 20 20 20  zEnvName;.      
b1e0: 63 68 61 72 20 2a 2a 70 7a 45 6e 76 56 61 6c 75  char **pzEnvValu
b1f0: 65 3b 0a 20 20 20 20 7d 20 63 67 69 65 6e 76 5b  e;.    } cgienv[
b200: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 41  ] = {.      { "A
b210: 55 54 48 5f 54 59 50 45 22 2c 20 20 20 20 20 20  UTH_TYPE",      
b220: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 41               &zA
b230: 75 74 68 54 79 70 65 20 7d 2c 0a 20 20 20 20 20  uthType },.     
b240: 20 7b 20 22 41 55 54 48 5f 43 4f 4e 54 45 4e 54   { "AUTH_CONTENT
b250: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
b260: 20 20 26 7a 41 75 74 68 41 72 67 20 7d 2c 0a 20    &zAuthArg },. 
b270: 20 20 20 20 20 7b 20 22 43 4f 4e 54 45 4e 54 5f       { "CONTENT_
b280: 4c 45 4e 47 54 48 22 2c 20 20 20 20 20 20 20 20  LENGTH",        
b290: 20 20 20 20 20 20 26 7a 43 6f 6e 74 65 6e 74 4c        &zContentL
b2a0: 65 6e 67 74 68 20 7d 2c 0a 20 20 20 20 20 20 7b  ength },.      {
b2b0: 20 22 43 4f 4e 54 45 4e 54 5f 54 59 50 45 22 2c   "CONTENT_TYPE",
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2d0: 26 7a 43 6f 6e 74 65 6e 74 54 79 70 65 20 7d 2c  &zContentType },
b2e0: 0a 20 20 20 20 20 20 7b 20 22 44 4f 43 55 4d 45  .      { "DOCUME
b2f0: 4e 54 5f 52 4f 4f 54 22 2c 20 20 20 20 20 20 20  NT_ROOT",       
b300: 20 20 20 20 20 20 20 20 26 7a 48 6f 6d 65 20 7d          &zHome }
b310: 2c 0a 20 20 20 20 20 20 7b 20 22 47 41 54 45 57  ,.      { "GATEW
b320: 41 59 5f 49 4e 54 45 52 46 41 43 45 22 2c 20 20  AY_INTERFACE",  
b330: 20 20 20 20 20 20 20 20 20 26 67 61 74 65 77 61           &gatewa
b340: 79 5f 69 6e 74 65 72 66 61 63 65 20 7d 2c 0a 20  y_interface },. 
b350: 20 20 20 20 20 7b 20 22 48 54 54 50 5f 41 43 43       { "HTTP_ACC
b360: 45 50 54 22 2c 20 20 20 20 20 20 20 20 20 20 20  EPT",           
b370: 20 20 20 20 20 20 26 7a 41 63 63 65 70 74 20 7d        &zAccept }
b380: 2c 0a 20 20 20 20 20 20 7b 20 22 48 54 54 50 5f  ,.      { "HTTP_
b390: 43 4f 4f 4b 49 45 22 2c 20 20 20 20 20 20 20 20  COOKIE",        
b3a0: 20 20 20 20 20 20 20 20 20 26 7a 43 6f 6f 6b 69           &zCooki
b3b0: 65 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 48 54  e },.      { "HT
b3c0: 54 50 5f 48 4f 53 54 22 2c 20 20 20 20 20 20 20  TP_HOST",       
b3d0: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 48 74              &zHt
b3e0: 74 70 48 6f 73 74 20 7d 2c 0a 20 20 20 20 20 20  tpHost },.      
b3f0: 7b 20 22 48 54 54 50 5f 52 45 46 45 52 45 52 22  { "HTTP_REFERER"
b400: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b410: 20 26 7a 52 65 66 65 72 65 72 20 7d 2c 0a 20 20   &zReferer },.  
b420: 20 20 20 20 7b 20 22 48 54 54 50 5f 55 53 45 52      { "HTTP_USER
b430: 5f 41 47 45 4e 54 22 2c 20 20 20 20 20 20 20 20  _AGENT",        
b440: 20 20 20 20 20 26 7a 41 67 65 6e 74 20 7d 2c 0a       &zAgent },.
b450: 20 20 20 20 20 20 7b 20 22 50 41 54 48 22 2c 20        { "PATH", 
b460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b470: 20 20 20 20 20 20 20 26 64 65 66 61 75 6c 74 5f         &default_
b480: 70 61 74 68 20 7d 2c 0a 20 20 20 20 20 20 7b 20  path },.      { 
b490: 22 50 41 54 48 5f 49 4e 46 4f 22 2c 20 20 20 20  "PATH_INFO",    
b4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
b4b0: 7a 50 61 74 68 49 6e 66 6f 20 7d 2c 0a 20 20 20  zPathInfo },.   
b4c0: 20 20 20 7b 20 22 51 55 45 52 59 5f 53 54 52 49     { "QUERY_STRI
b4d0: 4e 47 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  NG",            
b4e0: 20 20 20 20 26 7a 51 75 65 72 79 53 74 72 69 6e      &zQueryStrin
b4f0: 67 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 52 45  g },.      { "RE
b500: 4d 4f 54 45 5f 41 44 44 52 22 2c 20 20 20 20 20  MOTE_ADDR",     
b510: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 52 65              &zRe
b520: 6d 6f 74 65 41 64 64 72 20 7d 2c 0a 20 20 20 20  moteAddr },.    
b530: 20 20 7b 20 22 52 45 51 55 45 53 54 5f 4d 45 54    { "REQUEST_MET
b540: 48 4f 44 22 2c 20 20 20 20 20 20 20 20 20 20 20  HOD",           
b550: 20 20 20 26 7a 4d 65 74 68 6f 64 20 7d 2c 0a 20     &zMethod },. 
b560: 20 20 20 20 20 7b 20 22 52 45 51 55 45 53 54 5f       { "REQUEST_
b570: 55 52 49 22 2c 20 20 20 20 20 20 20 20 20 20 20  URI",           
b580: 20 20 20 20 20 20 26 7a 53 63 72 69 70 74 20 7d        &zScript }
b590: 2c 0a 20 20 20 20 20 20 7b 20 22 52 45 4d 4f 54  ,.      { "REMOT
b5a0: 45 5f 55 53 45 52 22 2c 20 20 20 20 20 20 20 20  E_USER",        
b5b0: 20 20 20 20 20 20 20 20 20 26 7a 52 65 6d 6f 74           &zRemot
b5c0: 65 55 73 65 72 20 7d 2c 0a 20 20 20 20 20 20 7b  eUser },.      {
b5d0: 20 22 53 43 52 49 50 54 5f 44 49 52 45 43 54 4f   "SCRIPT_DIRECTO
b5e0: 52 59 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  RY",            
b5f0: 26 7a 44 69 72 20 7d 2c 0a 20 20 20 20 20 20 7b  &zDir },.      {
b600: 20 22 53 43 52 49 50 54 5f 46 49 4c 45 4e 41 4d   "SCRIPT_FILENAM
b610: 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  E",             
b620: 26 7a 46 69 6c 65 20 7d 2c 0a 20 20 20 20 20 20  &zFile },.      
b630: 7b 20 22 53 43 52 49 50 54 5f 4e 41 4d 45 22 2c  { "SCRIPT_NAME",
b640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b650: 20 26 7a 52 65 61 6c 53 63 72 69 70 74 20 7d 2c   &zRealScript },
b660: 0a 20 20 20 20 20 20 7b 20 22 53 45 52 56 45 52  .      { "SERVER
b670: 5f 4e 41 4d 45 22 2c 20 20 20 20 20 20 20 20 20  _NAME",         
b680: 20 20 20 20 20 20 20 20 26 7a 53 65 72 76 65 72          &zServer
b690: 4e 61 6d 65 20 7d 2c 0a 20 20 20 20 20 20 7b 20  Name },.      { 
b6a0: 22 53 45 52 56 45 52 5f 50 4f 52 54 22 2c 20 20  "SERVER_PORT",  
b6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
b6c0: 7a 53 65 72 76 65 72 50 6f 72 74 20 7d 2c 0a 20  zServerPort },. 
b6d0: 20 20 20 20 20 7b 20 22 53 45 52 56 45 52 5f 50       { "SERVER_P
b6e0: 52 4f 54 4f 43 4f 4c 22 2c 20 20 20 20 20 20 20  ROTOCOL",       
b6f0: 20 20 20 20 20 20 26 7a 50 72 6f 74 6f 63 6f 6c        &zProtocol
b700: 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63   },.    };.    c
b710: 68 61 72 20 2a 7a 42 61 73 65 46 69 6c 65 6e 61  har *zBaseFilena
b720: 6d 65 3b 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d  me;   /* Filenam
b730: 65 20 77 69 74 68 6f 75 74 20 64 69 72 65 63 74  e without direct
b740: 6f 72 79 20 70 72 65 66 69 78 20 2a 2f 0a 0a 20  ory prefix */.. 
b750: 20 20 20 2f 2a 20 49 66 20 69 74 73 20 65 78 65     /* If its exe
b760: 63 75 74 61 62 6c 65 2c 20 69 74 20 6d 75 73 74  cutable, it must
b770: 20 62 65 20 61 20 43 47 49 20 70 72 6f 67 72 61   be a CGI progra
b780: 6d 2e 20 20 53 74 61 72 74 20 62 79 0a 20 20 20  m.  Start by.   
b790: 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 64 69 72   ** changing dir
b7a0: 65 63 74 6f 72 69 65 73 20 74 6f 20 74 68 65 20  ectories to the 
b7b0: 64 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 69 6e  directory holdin
b7c0: 67 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20  g the program.. 
b7d0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 68     */.    if( ch
b7e0: 64 69 72 28 7a 44 69 72 29 20 29 7b 0a 20 20 20  dir(zDir) ){.   
b7f0: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30     char zBuf[100
b800: 30 5d 3b 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e  0];.      Malfun
b810: 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20  ction(__LINE__, 
b820: 22 63 61 6e 6e 6f 74 20 63 68 64 69 72 20 74 6f  "cannot chdir to
b830: 20 5b 25 73 5d 20 66 72 6f 6d 20 5b 25 73 5d 22   [%s] from [%s]"
b840: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 7a 44  , .           zD
b850: 69 72 2c 20 67 65 74 63 77 64 28 7a 42 75 66 2c  ir, getcwd(zBuf,
b860: 39 39 39 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  999));.    }..  
b870: 20 20 2f 2a 20 53 65 74 75 70 20 74 68 65 20 65    /* Setup the e
b880: 6e 76 69 72 6f 6e 6d 65 6e 74 20 61 70 70 72 6f  nvironment appro
b890: 70 72 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2f  priately..    */
b8a0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
b8b0: 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 63 67 69  (int)(sizeof(cgi
b8c0: 65 6e 76 29 2f 73 69 7a 65 6f 66 28 63 67 69 65  env)/sizeof(cgie
b8d0: 6e 76 5b 30 5d 29 29 3b 20 69 2b 2b 29 7b 0a 20  nv[0])); i++){. 
b8e0: 20 20 20 20 20 69 66 28 20 2a 63 67 69 65 6e 76       if( *cgienv
b8f0: 5b 69 5d 2e 70 7a 45 6e 76 56 61 6c 75 65 20 29  [i].pzEnvValue )
b900: 7b 0a 20 20 20 20 20 20 20 20 53 65 74 45 6e 76  {.        SetEnv
b910: 28 63 67 69 65 6e 76 5b 69 5d 2e 7a 45 6e 76 4e  (cgienv[i].zEnvN
b920: 61 6d 65 2c 2a 63 67 69 65 6e 76 5b 69 5d 2e 70  ame,*cgienv[i].p
b930: 7a 45 6e 76 56 61 6c 75 65 29 3b 0a 20 20 20 20  zEnvValue);.    
b940: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
b950: 28 20 75 73 65 48 74 74 70 73 20 29 7b 0a 20 20  ( useHttps ){.  
b960: 20 20 20 20 70 75 74 65 6e 76 28 22 48 54 54 50      putenv("HTTP
b970: 53 3d 6f 6e 22 29 3b 0a 20 20 20 20 7d 0a 0a 20  S=on");.    }.. 
b980: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 41 62 6f     /*.    ** Abo
b990: 72 74 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  rt with an error
b9a0: 20 69 66 20 74 68 65 20 43 47 49 20 73 63 72 69   if the CGI scri
b9b0: 70 74 20 69 73 20 77 72 69 74 61 62 6c 65 20 62  pt is writable b
b9c0: 79 20 61 6e 79 6f 6e 65 20 6f 74 68 65 72 0a 20  y anyone other. 
b9d0: 20 20 20 2a 2a 20 74 68 61 6e 20 69 74 73 20 6f     ** than its o
b9e0: 77 6e 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  wner..    */.   
b9f0: 20 69 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f   if( statbuf.st_
ba00: 6d 6f 64 65 20 26 20 30 30 32 32 20 29 7b 0a 20  mode & 0022 ){. 
ba10: 20 20 20 20 20 43 67 69 53 63 72 69 70 74 57 72       CgiScriptWr
ba20: 69 74 61 62 6c 65 28 29 3b 0a 20 20 20 20 7d 0a  itable();.    }.
ba30: 0a 20 20 20 20 2f 2a 20 46 6f 72 20 74 68 65 20  .    /* For the 
ba40: 50 4f 53 54 20 6d 65 74 68 6f 64 20 61 6c 6c 20  POST method all 
ba50: 69 6e 70 75 74 20 68 61 73 20 62 65 65 6e 20 77  input has been w
ba60: 72 69 74 74 65 6e 20 74 6f 20 61 20 74 65 6d 70  ritten to a temp
ba70: 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 20 20  orary file,.    
ba80: 2a 2a 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f  ** so we have to
ba90: 20 72 65 64 69 72 65 63 74 20 69 6e 70 75 74 20   redirect input 
baa0: 74 6f 20 74 68 65 20 43 47 49 20 73 63 72 69 70  to the CGI scrip
bab0: 74 20 66 72 6f 6d 20 74 68 61 74 20 66 69 6c 65  t from that file
bac0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
bad0: 20 7a 4d 65 74 68 6f 64 5b 30 5d 3d 3d 27 50 27   zMethod[0]=='P'
bae0: 20 29 7b 0a 20 20 20 20 20 20 64 75 70 28 30 29   ){.      dup(0)
baf0: 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 30 29  ;.      close(0)
bb00: 3b 0a 20 20 20 20 20 20 6f 70 65 6e 28 7a 54 6d  ;.      open(zTm
bb10: 70 4e 61 6d 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b  pNam, O_RDONLY);
bb20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
bb30: 69 3d 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2d  i=strlen(zFile)-
bb40: 31 3b 20 69 3e 3d 30 20 26 26 20 7a 46 69 6c 65  1; i>=0 && zFile
bb50: 5b 69 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d  [i]!='/'; i--){}
bb60: 0a 20 20 20 20 7a 42 61 73 65 46 69 6c 65 6e 61  .    zBaseFilena
bb70: 6d 65 20 3d 20 26 7a 46 69 6c 65 5b 69 2b 31 5d  me = &zFile[i+1]
bb80: 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 30 20 26  ;.    if( i>=0 &
bb90: 26 20 73 74 72 6e 63 6d 70 28 7a 42 61 73 65 46  & strncmp(zBaseF
bba0: 69 6c 65 6e 61 6d 65 2c 22 6e 70 68 2d 22 2c 34  ilename,"nph-",4
bbb0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
bbc0: 20 49 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   If the name of 
bbd0: 74 68 65 20 43 47 49 20 73 63 72 69 70 74 20 62  the CGI script b
bbe0: 65 67 69 6e 73 20 77 69 74 68 20 22 6e 70 68 2d  egins with "nph-
bbf0: 22 20 74 68 65 6e 20 77 65 20 61 72 65 0a 20 20  " then we are.  
bc00: 20 20 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77      ** dealing w
bc10: 69 74 68 20 61 20 22 6e 6f 6e 2d 70 61 72 73 65  ith a "non-parse
bc20: 64 20 68 65 61 64 65 72 73 22 20 43 47 49 20 73  d headers" CGI s
bc30: 63 72 69 70 74 2e 20 20 4a 75 73 74 20 65 78 65  cript.  Just exe
bc40: 63 28 29 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  c().      ** it 
bc50: 64 69 72 65 63 74 6c 79 20 61 6e 64 20 6c 65 74  directly and let
bc60: 20 69 74 20 68 61 6e 64 6c 65 20 61 6c 6c 20 69   it handle all i
bc70: 74 73 20 6f 77 6e 20 68 65 61 64 65 72 20 67 65  ts own header ge
bc80: 6e 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20  neration..      
bc90: 2a 2f 0a 20 20 20 20 20 20 65 78 65 63 6c 28 7a  */.      execl(z
bca0: 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c 7a 42 61  BaseFilename,zBa
bcb0: 73 65 46 69 6c 65 6e 61 6d 65 2c 28 63 68 61 72  seFilename,(char
bcc0: 2a 29 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4e  *)0);.      /* N
bcd0: 4f 54 45 3a 20 4e 6f 20 6c 6f 67 20 65 6e 74 72  OTE: No log entr
bce0: 79 20 77 72 69 74 74 65 6e 20 66 6f 72 20 6e 70  y written for np
bcf0: 68 2d 20 73 63 72 69 70 74 73 20 2a 2f 0a 20 20  h- scripts */.  
bd00: 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20 20      exit(0);.   
bd10: 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 61 6c 6c 20   }..    /* Fall 
bd20: 74 68 72 75 20 74 6f 20 68 65 72 65 20 6f 6e 6c  thru to here onl
bd30: 79 20 69 66 20 74 68 69 73 20 70 72 6f 63 65 73  y if this proces
bd40: 73 20 28 74 68 65 20 73 65 72 76 65 72 29 20 69  s (the server) i
bd50: 73 20 67 6f 69 6e 67 0a 20 20 20 20 2a 2a 20 74  s going.    ** t
bd60: 6f 20 72 65 61 64 20 61 6e 64 20 61 75 67 6d 65  o read and augme
bd70: 6e 74 20 74 68 65 20 68 65 61 64 65 72 20 73 65  nt the header se
bd80: 6e 74 20 62 61 63 6b 20 62 79 20 74 68 65 20 43  nt back by the C
bd90: 47 49 20 70 72 6f 63 65 73 73 2e 0a 20 20 20 20  GI process..    
bda0: 2a 2a 20 4f 70 65 6e 20 61 20 70 69 70 65 20 74  ** Open a pipe t
bdb0: 6f 20 72 65 63 65 69 76 65 20 74 68 65 20 6f 75  o receive the ou
bdc0: 74 70 75 74 20 66 72 6f 6d 20 74 68 65 20 43 47  tput from the CG
bdd0: 49 20 70 72 6f 63 65 73 73 2e 20 20 54 68 65 6e  I process.  Then
bde0: 0a 20 20 20 20 2a 2a 20 66 6f 72 6b 20 74 68 65  .    ** fork the
bdf0: 20 43 47 49 20 70 72 6f 63 65 73 73 2e 20 20 4f   CGI process.  O
be00: 6e 63 65 20 65 76 65 72 79 74 68 69 6e 67 20 69  nce everything i
be10: 73 20 64 6f 6e 65 2c 20 77 65 20 73 68 6f 75 6c  s done, we shoul
be20: 64 20 62 65 0a 20 20 20 20 2a 2a 20 61 62 6c 65  d be.    ** able
be30: 20 74 6f 20 72 65 61 64 20 74 68 65 20 6f 75 74   to read the out
be40: 70 75 74 20 6f 66 20 43 47 49 20 6f 6e 20 74 68  put of CGI on th
be50: 65 20 22 69 6e 22 20 73 74 72 65 61 6d 2e 0a 20  e "in" stream.. 
be60: 20 20 20 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20     */.    {.    
be70: 20 20 69 6e 74 20 70 78 5b 32 5d 3b 0a 20 20 20    int px[2];.   
be80: 20 20 20 70 69 70 65 28 70 78 29 3b 0a 20 20 20     pipe(px);.   
be90: 20 20 20 69 66 28 20 66 6f 72 6b 28 29 3d 3d 30     if( fork()==0
bea0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73   ){.        clos
beb0: 65 28 70 78 5b 30 5d 29 3b 0a 20 20 20 20 20 20  e(px[0]);.      
bec0: 20 20 63 6c 6f 73 65 28 31 29 3b 0a 20 20 20 20    close(1);.    
bed0: 20 20 20 20 64 75 70 28 70 78 5b 31 5d 29 3b 0a      dup(px[1]);.
bee0: 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 70 78          close(px
bef0: 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 65 78  [1]);.        ex
bf00: 65 63 6c 28 7a 42 61 73 65 46 69 6c 65 6e 61 6d  ecl(zBaseFilenam
bf10: 65 2c 20 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65  e, zBaseFilename
bf20: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
bf30: 20 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20       exit(0);.  
bf40: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 6f 73      }.      clos
bf50: 65 28 70 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20  e(px[1]);.      
bf60: 69 6e 20 3d 20 66 64 6f 70 65 6e 28 70 78 5b 30  in = fdopen(px[0
bf70: 5d 2c 20 22 72 22 29 3b 0a 20 20 20 20 7d 0a 20  ], "r");.    }. 
bf80: 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a     if( in==0 ){.
bf90: 20 20 20 20 20 20 43 67 69 45 72 72 6f 72 28 29        CgiError()
bfa0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
bfb0: 52 65 61 64 20 61 6e 64 20 70 72 6f 63 65 73 73  Read and process
bfc0: 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e 65 20   the first line 
bfd0: 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 72 65  of the header re
bfe0: 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 20 20  turned by the.  
bff0: 20 20 2a 2a 20 43 47 49 20 73 63 72 69 70 74 2e    ** CGI script.
c000: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
c010: 75 73 65 54 69 6d 65 6f 75 74 20 29 20 61 6c 61  useTimeout ) ala
c020: 72 6d 28 31 35 29 3b 0a 20 20 20 20 77 68 69 6c  rm(15);.    whil
c030: 65 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 73  e( fgets(zLine,s
c040: 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 69 6e 29  izeof(zLine),in)
c050: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74   ){.      if( st
c060: 72 6e 63 6d 70 28 7a 4c 69 6e 65 2c 22 4c 6f 63  rncmp(zLine,"Loc
c070: 61 74 69 6f 6e 3a 22 2c 39 29 3d 3d 30 20 29 7b  ation:",9)==0 ){
c080: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
c090: 20 20 20 20 20 20 20 20 52 65 6d 6f 76 65 4e 65          RemoveNe
c0a0: 77 6c 69 6e 65 28 7a 4c 69 6e 65 29 3b 0a 20 20  wline(zLine);.  
c0b0: 20 20 20 20 20 20 7a 20 3d 20 26 7a 4c 69 6e 65        z = &zLine
c0c0: 5b 31 30 5d 3b 0a 20 20 20 20 20 20 20 20 77 68  [10];.        wh
c0d0: 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 7a 29  ile( isspace(*z)
c0e0: 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20   ){ z++; }.     
c0f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d     for(i=0; z[i]
c100: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
c110: 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 3f 27 20    if( z[i]=='?' 
c120: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ){.            z
c130: 51 75 65 72 79 53 75 66 66 69 78 20 3d 20 53 74  QuerySuffix = St
c140: 72 44 75 70 28 22 22 29 3b 0a 20 20 20 20 20 20  rDup("");.      
c150: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
c160: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
c170: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2f 27 20 26   if( z[0]=='/' &
c180: 26 20 7a 5b 31 5d 3d 3d 27 2f 27 20 29 7b 0a 20  & z[1]=='/' ){. 
c190: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
c1a0: 73 63 68 65 6d 65 20 69 73 20 6d 69 73 73 69 6e  scheme is missin
c1b0: 67 2e 20 20 41 64 64 20 69 74 20 69 6e 20 62 65  g.  Add it in be
c1c0: 66 6f 72 65 20 72 65 64 69 72 65 63 74 69 6e 67  fore redirecting
c1d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 53 74   */.          St
c1e0: 61 72 74 52 65 73 70 6f 6e 73 65 28 22 33 30 32  artResponse("302
c1f0: 20 52 65 64 69 72 65 63 74 22 29 3b 0a 20 20 20   Redirect");.   
c200: 20 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70         nOut += p
c210: 72 69 6e 74 66 28 22 4c 6f 63 61 74 69 6f 6e 3a  rintf("Location:
c220: 20 25 73 3a 25 73 25 73 5c 72 5c 6e 22 2c 7a 48   %s:%s%s\r\n",zH
c230: 74 74 70 2c 7a 2c 7a 51 75 65 72 79 53 75 66 66  ttp,z,zQuerySuff
c240: 69 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ix);.          b
c250: 72 65 61 6b 3b 20 2f 2a 20 44 4b 20 2a 2f 0a 20  reak; /* DK */. 
c260: 20 20 20 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67           MakeLog
c270: 45 6e 74 72 79 28 30 29 3b 0a 20 20 20 20 20 20  Entry(0);.      
c280: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
c290: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b      }else if( z[
c2a0: 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  0]=='/' ){.     
c2b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 63 68 65       /* The sche
c2c0: 6d 65 20 61 6e 64 20 6e 65 74 77 6f 72 6b 20 6c  me and network l
c2d0: 6f 63 61 74 69 6f 6e 20 61 72 65 20 6d 69 73 73  ocation are miss
c2e0: 69 6e 67 20 62 75 74 20 77 65 20 68 61 76 65 0a  ing but we have.
c2f0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20            ** an 
c300: 61 62 73 6f 6c 75 74 65 20 70 61 74 68 2e 20 2a  absolute path. *
c310: 2f 0a 20 20 20 20 20 20 20 20 20 20 52 65 64 69  /.          Redi
c320: 72 65 63 74 28 7a 2c 20 30 29 3b 20 2f 2a 20 44  rect(z, 0); /* D
c330: 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 62  K */.          b
c340: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
c350: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
c360: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
c370: 20 69 73 20 61 20 73 63 68 65 6d 65 20 70 72 65   is a scheme pre
c380: 66 69 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  fix */.        f
c390: 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 20 26 26 20  or(i=0; z[i] && 
c3a0: 7a 5b 69 5d 21 3d 27 3a 27 20 26 26 20 7a 5b 69  z[i]!=':' && z[i
c3b0: 5d 21 3d 27 2f 27 3b 20 69 2b 2b 29 7b 7d 0a 20  ]!='/'; i++){}. 
c3c0: 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d         if( z[i]=
c3d0: 3d 27 3a 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =':' ){.        
c3e0: 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 73    /* We have a s
c3f0: 63 68 65 6d 65 2e 20 20 41 73 73 75 6d 65 20 74  cheme.  Assume t
c400: 68 65 72 65 20 69 73 20 61 6e 20 61 62 73 6f 6c  here is an absol
c410: 75 74 65 20 55 52 4c 20 2a 2f 0a 20 20 20 20 20  ute URL */.     
c420: 20 20 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e       StartRespon
c430: 73 65 28 22 33 30 32 20 52 65 64 69 72 65 63 74  se("302 Redirect
c440: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f  ");.          nO
c450: 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 4c 6f  ut += printf("Lo
c460: 63 61 74 69 6f 6e 3a 20 25 73 25 73 5c 72 5c 6e  cation: %s%s\r\n
c470: 22 2c 7a 2c 7a 51 75 65 72 79 53 75 66 66 69 78  ",z,zQuerySuffix
c480: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
c490: 61 6b 3b 20 2f 2a 20 44 4b 20 2a 2f 0a 20 20 20  ak; /* DK */.   
c4a0: 20 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e         MakeLogEn
c4b0: 74 72 79 28 30 29 3b 0a 20 20 20 20 20 20 20 20  try(0);.        
c4c0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
c4d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d    }.        /* M
c4e0: 75 73 74 20 62 65 20 61 20 72 65 6c 61 74 69 76  ust be a relativ
c4f0: 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 43 6f 6e  e pathname.  Con
c500: 73 74 72 75 63 74 20 74 68 65 20 61 62 73 6f 6c  struct the absol
c510: 75 74 65 20 70 61 74 68 6e 61 6d 65 0a 20 20 20  ute pathname.   
c520: 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 64 69       ** and redi
c530: 72 65 63 74 20 74 6f 20 69 74 2e 20 2a 2f 0a 20  rect to it. */. 
c540: 20 20 20 20 20 20 20 69 20 3d 20 73 74 72 6c 65         i = strle
c550: 6e 28 7a 52 65 61 6c 53 63 72 69 70 74 29 3b 0a  n(zRealScript);.
c560: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69          while( i
c570: 3e 30 20 26 26 20 7a 52 65 61 6c 53 63 72 69 70  >0 && zRealScrip
c580: 74 5b 69 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 69  t[i-1]!='/' ){ i
c590: 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 77 68  --; }.        wh
c5a0: 69 6c 65 28 20 69 3e 30 20 26 26 20 7a 52 65 61  ile( i>0 && zRea
c5b0: 6c 53 63 72 69 70 74 5b 69 2d 31 5d 3d 3d 27 2f  lScript[i-1]=='/
c5c0: 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20  ' ){ i--; }.    
c5d0: 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 3d 3d 27      while( *z=='
c5e0: 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  .' ){.          
c5f0: 69 66 28 20 7a 5b 31 5d 3d 3d 27 2f 27 20 29 7b  if( z[1]=='/' ){
c600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 2b  .            z +
c610: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 2;.          }
c620: 65 6c 73 65 20 69 66 28 20 7a 5b 31 5d 3d 3d 27  else if( z[1]=='
c630: 2e 27 20 26 26 20 7a 5b 32 5d 3d 3d 27 2f 27 20  .' && z[2]=='/' 
c640: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77  ){.            w
c650: 68 69 6c 65 28 20 69 3e 30 20 26 26 20 7a 52 65  hile( i>0 && zRe
c660: 61 6c 53 63 72 69 70 74 5b 69 2d 31 5d 21 3d 27  alScript[i-1]!='
c670: 2f 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20  /' ){ i--; }.   
c680: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
c690: 69 3e 30 20 26 26 20 7a 52 65 61 6c 53 63 72 69  i>0 && zRealScri
c6a0: 70 74 5b 69 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20  pt[i-1]=='/' ){ 
c6b0: 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 20  i--; }.         
c6c0: 20 20 20 7a 20 2b 3d 20 33 3b 0a 20 20 20 20 20     z += 3;.     
c6d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c6e0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c6f0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
c700: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 53 74 61     }.        Sta
c710: 72 74 52 65 73 70 6f 6e 73 65 28 22 33 30 32 20  rtResponse("302 
c720: 52 65 64 69 72 65 63 74 22 29 3b 0a 20 20 20 20  Redirect");.    
c730: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
c740: 74 66 28 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73  tf("Location: %s
c750: 3a 2f 2f 25 73 22 2c 7a 48 74 74 70 2c 7a 53 65  ://%s",zHttp,zSe
c760: 72 76 65 72 4e 61 6d 65 29 3b 0a 20 20 20 20 20  rverName);.     
c770: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 53     if( strcmp(zS
c780: 65 72 76 65 72 50 6f 72 74 2c 22 38 30 22 29 20  erverPort,"80") 
c790: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75  ){.          nOu
c7a0: 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 3a 25 73  t += printf(":%s
c7b0: 22 2c 7a 53 65 72 76 65 72 50 6f 72 74 29 3b 0a  ",zServerPort);.
c7c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c7d0: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
c7e0: 28 22 25 2e 2a 73 2f 25 73 25 73 5c 72 5c 6e 5c  ("%.*s/%s%s\r\n\
c7f0: 72 5c 6e 22 2c 69 2c 7a 52 65 61 6c 53 63 72 69  r\n",i,zRealScri
c800: 70 74 2c 7a 2c 7a 51 75 65 72 79 53 75 66 66 69  pt,z,zQuerySuffi
c810: 78 29 3b 0a 20 20 20 20 20 20 20 20 4d 61 6b 65  x);.        Make
c820: 4c 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20 20 20  LogEntry(0);.   
c830: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
c840: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
c850: 6e 63 6d 70 28 7a 4c 69 6e 65 2c 22 53 74 61 74  ncmp(zLine,"Stat
c860: 75 73 3a 22 2c 37 29 3d 3d 30 20 29 7b 0a 20 20  us:",7)==0 ){.  
c870: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
c880: 20 20 20 20 20 66 6f 72 28 69 3d 37 3b 20 69 73       for(i=7; is
c890: 73 70 61 63 65 28 7a 4c 69 6e 65 5b 69 5d 29 3b  space(zLine[i]);
c8a0: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   i++){}.        
c8b0: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22  nOut += printf("
c8c0: 25 73 20 25 73 22 2c 20 7a 50 72 6f 74 6f 63 6f  %s %s", zProtoco
c8d0: 6c 2c 20 26 7a 4c 69 6e 65 5b 69 5d 29 3b 0a 20  l, &zLine[i]);. 
c8e0: 20 20 20 20 20 20 20 73 74 72 6e 63 70 79 28 7a         strncpy(z
c8f0: 52 65 70 6c 79 53 74 61 74 75 73 2c 20 26 7a 4c  ReplyStatus, &zL
c900: 69 6e 65 5b 69 5d 2c 20 33 29 3b 0a 20 20 20 20  ine[i], 3);.    
c910: 20 20 20 20 7a 52 65 70 6c 79 53 74 61 74 75 73      zReplyStatus
c920: 5b 33 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  [3] = 0;.       
c930: 20 73 74 61 74 75 73 53 65 6e 74 20 3d 20 31 3b   statusSent = 1;
c940: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
c950: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c960: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
c970: 20 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73      StartRespons
c980: 65 28 22 32 30 30 20 4f 4b 22 29 3b 0a 20 20 20  e("200 OK");.   
c990: 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69       nOut += pri
c9a0: 6e 74 66 28 22 25 73 22 2c 7a 4c 69 6e 65 29 3b  ntf("%s",zLine);
c9b0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
c9c0: 3b 20 7a 4c 69 6e 65 5b 69 5d 20 26 26 20 21 69  ; zLine[i] && !i
c9d0: 73 73 70 61 63 65 28 7a 4c 69 6e 65 5b 69 5d 29  sspace(zLine[i])
c9e0: 20 26 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d 27 3a   && zLine[i]!=':
c9f0: 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  '; i++){}.      
ca00: 20 20 69 66 28 20 69 3c 32 20 7c 7c 20 7a 4c 69    if( i<2 || zLi
ca10: 6e 65 5b 69 5d 21 3d 27 3a 27 20 29 20 62 72 65  ne[i]!=':' ) bre
ca20: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
ca30: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 65  }..    /* Copy e
ca40: 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 20 74  verything else t
ca50: 68 72 75 20 77 69 74 68 6f 75 74 20 63 68 61 6e  hru without chan
ca60: 67 65 20 6f 72 20 61 6e 61 6c 79 73 69 73 2e 0a  ge or analysis..
ca70: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 75      */.    if( u
ca80: 73 65 54 69 6d 65 6f 75 74 20 29 20 61 6c 61 72  seTimeout ) alar
ca90: 6d 28 36 30 2a 35 29 3b 0a 20 20 20 20 77 68 69  m(60*5);.    whi
caa0: 6c 65 28 20 28 63 20 3d 20 67 65 74 63 28 69 6e  le( (c = getc(in
cab0: 29 29 21 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20  ))!=EOF ){.     
cac0: 20 70 75 74 63 28 63 2c 73 74 64 6f 75 74 29 3b   putc(c,stdout);
cad0: 0a 20 20 20 20 20 20 6e 4f 75 74 2b 2b 3b 0a 20  .      nOut++;. 
cae0: 20 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28     }.    fclose(
caf0: 69 6e 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  in);.  }else if(
cb00: 20 63 6f 75 6e 74 53 6c 61 73 68 65 73 28 7a 52   countSlashes(zR
cb10: 65 61 6c 53 63 72 69 70 74 29 21 3d 63 6f 75 6e  ealScript)!=coun
cb20: 74 53 6c 61 73 68 65 73 28 7a 53 63 72 69 70 74  tSlashes(zScript
cb30: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  ) ){.    /* If t
cb40: 68 65 20 72 65 71 75 65 73 74 20 55 52 49 20 66  he request URI f
cb50: 6f 72 20 73 74 61 74 69 63 20 63 6f 6e 74 65 6e  or static conten
cb60: 74 20 63 6f 6e 74 61 69 6e 73 20 6d 61 74 65 72  t contains mater
cb70: 69 61 6c 20 70 61 73 74 20 74 68 65 0a 20 20 20  ial past the.   
cb80: 20 2a 2a 20 61 63 74 75 61 6c 20 63 6f 6e 74 65   ** actual conte
cb90: 6e 74 20 66 69 6c 65 20 6e 61 6d 65 2c 20 72 65  nt file name, re
cba0: 70 6f 72 74 20 74 68 61 74 20 61 73 20 61 20 34  port that as a 4
cbb0: 30 34 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20  04 error. */.   
cbc0: 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45   NotFound(__LINE
cbd0: 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  __);.  }else{.  
cbe0: 20 20 2f 2a 20 49 66 20 69 74 20 69 73 6e 27 74    /* If it isn't
cbf0: 20 65 78 65 63 75 74 61 62 6c 65 20 74 68 65 6e   executable then
cc00: 20 69 74 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20   it.    ** must 
cc10: 61 20 73 69 6d 70 6c 65 20 66 69 6c 65 20 74 68  a simple file th
cc20: 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63  at needs to be c
cc30: 6f 70 69 65 64 20 74 6f 20 6f 75 74 70 75 74 2e  opied to output.
cc40: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  .    */.    cons
cc50: 74 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74  t char *zContent
cc60: 54 79 70 65 20 3d 20 47 65 74 4d 69 6d 65 54 79  Type = GetMimeTy
cc70: 70 65 28 7a 46 69 6c 65 2c 20 6c 65 6e 46 69 6c  pe(zFile, lenFil
cc80: 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a 54 6d  e);..    if( zTm
cc90: 70 4e 61 6d 20 29 20 75 6e 6c 69 6e 6b 28 7a 54  pNam ) unlink(zT
cca0: 6d 70 4e 61 6d 29 3b 0a 20 20 20 20 69 6e 20 3d  mpNam);.    in =
ccb0: 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 22 72 22   fopen(zFile,"r"
ccc0: 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30  );.    if( in==0
ccd0: 20 29 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49   ) NotFound(__LI
cce0: 4e 45 5f 5f 29 3b 0a 20 20 20 20 53 74 61 72 74  NE__);.    Start
ccf0: 52 65 73 70 6f 6e 73 65 28 22 32 30 30 20 4f 4b  Response("200 OK
cd00: 22 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20  ");.    nOut += 
cd10: 44 61 74 65 54 61 67 28 22 4c 61 73 74 2d 4d 6f  DateTag("Last-Mo
cd20: 64 69 66 69 65 64 22 2c 20 73 74 61 74 62 75 66  dified", statbuf
cd30: 2e 73 74 5f 6d 74 69 6d 65 29 3b 0a 20 20 20 20  .st_mtime);.    
cd40: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22  nOut += printf("
cd50: 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 25 73  Content-type: %s
cd60: 5c 72 5c 6e 22 2c 7a 43 6f 6e 74 65 6e 74 54 79  \r\n",zContentTy
cd70: 70 65 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d  pe);.    nOut +=
cd80: 20 70 72 69 6e 74 66 28 22 43 6f 6e 74 65 6e 74   printf("Content
cd90: 2d 6c 65 6e 67 74 68 3a 20 25 64 5c 72 5c 6e 5c  -length: %d\r\n\
cda0: 72 5c 6e 22 2c 28 69 6e 74 29 73 74 61 74 62 75  r\n",(int)statbu
cdb0: 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20  f.st_size);.    
cdc0: 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
cdd0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
cde0: 4d 65 74 68 6f 64 2c 22 48 45 41 44 22 29 3d 3d  Method,"HEAD")==
cdf0: 30 20 29 7b 0a 20 20 20 20 20 20 4d 61 6b 65 4c  0 ){.      MakeL
ce00: 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20 20 20 20  ogEntry(0);.    
ce10: 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
ce20: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
ce30: 7d 0a 20 20 20 20 69 66 28 20 75 73 65 54 69 6d  }.    if( useTim
ce40: 65 6f 75 74 20 29 20 61 6c 61 72 6d 28 33 30 20  eout ) alarm(30 
ce50: 2b 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a  + statbuf.st_siz
ce60: 65 2f 31 30 30 30 29 3b 0a 23 69 66 64 65 66 20  e/1000);.#ifdef 
ce70: 6c 69 6e 75 78 0a 20 20 20 20 7b 0a 20 20 20 20  linux.    {.    
ce80: 20 20 6f 66 66 5f 74 20 6f 66 66 73 65 74 20 3d    off_t offset =
ce90: 20 30 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b   0;.      nOut +
cea0: 3d 20 73 65 6e 64 66 69 6c 65 28 66 69 6c 65 6e  = sendfile(filen
ceb0: 6f 28 73 74 64 6f 75 74 29 2c 20 66 69 6c 65 6e  o(stdout), filen
cec0: 6f 28 69 6e 29 2c 20 26 6f 66 66 73 65 74 2c 20  o(in), &offset, 
ced0: 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 29  statbuf.st_size)
cee0: 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
cef0: 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 67 65    while( (c = ge
cf00: 74 63 28 69 6e 29 29 21 3d 45 4f 46 20 29 7b 0a  tc(in))!=EOF ){.
cf10: 20 20 20 20 20 20 70 75 74 63 28 63 2c 73 74 64        putc(c,std
cf20: 6f 75 74 29 3b 0a 20 20 20 20 20 20 6e 4f 75 74  out);.      nOut
cf30: 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ++;.    }.#endif
cf40: 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  .    fclose(in);
cf50: 0a 20 20 7d 0a 20 20 66 66 6c 75 73 68 28 73 74  .  }.  fflush(st
cf60: 64 6f 75 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67  dout);.  MakeLog
cf70: 45 6e 74 72 79 28 30 29 3b 0a 0a 20 20 2f 2a 20  Entry(0);..  /* 
cf80: 54 68 65 20 6e 65 78 74 20 72 65 71 75 65 73 74  The next request
cf90: 20 6d 75 73 74 20 61 72 72 69 76 65 20 77 69 74   must arrive wit
cfa0: 68 69 6e 20 33 30 20 73 65 63 6f 6e 64 73 20 6f  hin 30 seconds o
cfb0: 72 20 77 65 20 63 6c 6f 73 65 20 74 68 65 20 63  r we close the c
cfc0: 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 2a 2f 0a 20  onnection.  */. 
cfd0: 20 6f 6d 69 74 4c 6f 67 20 3d 20 31 3b 0a 20 20   omitLog = 1;.  
cfe0: 69 66 28 20 75 73 65 54 69 6d 65 6f 75 74 20 29  if( useTimeout )
cff0: 20 61 6c 61 72 6d 28 33 30 29 3b 0a 7d 0a 0a 23   alarm(30);.}..#
d000: 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 52 41 4c  define MAX_PARAL
d010: 4c 45 4c 20 35 30 20 20 2f 2a 20 4e 75 6d 62 65  LEL 50  /* Numbe
d020: 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75  r of simultaneou
d030: 73 20 63 68 69 6c 64 72 65 6e 20 2a 2f 0a 0a 2f  s children */../
d040: 2a 0a 2a 2a 20 41 6c 6c 20 70 6f 73 73 69 62 6c  *.** All possibl
d050: 65 20 66 6f 72 6d 73 20 6f 66 20 61 6e 20 49 50  e forms of an IP
d060: 20 61 64 64 72 65 73 73 2e 20 20 4e 65 65 64 65   address.  Neede
d070: 64 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  d to work around
d080: 20 47 43 43 20 73 74 72 69 63 74 0a 2a 2a 20 61   GCC strict.** a
d090: 6c 69 61 73 69 6e 67 20 72 75 6c 65 73 2e 0a 2a  liasing rules..*
d0a0: 2f 0a 74 79 70 65 64 65 66 20 75 6e 69 6f 6e 20  /.typedef union 
d0b0: 7b 0a 20 20 73 74 72 75 63 74 20 73 6f 63 6b 61  {.  struct socka
d0c0: 64 64 72 20 73 61 3b 20 20 20 20 20 20 20 20 20  ddr sa;         
d0d0: 20 20 20 20 20 2f 2a 20 41 62 73 74 72 61 63 74       /* Abstract
d0e0: 20 73 75 70 65 72 63 6c 61 73 73 20 2a 2f 0a 20   superclass */. 
d0f0: 20 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72   struct sockaddr
d100: 5f 69 6e 20 73 61 34 3b 20 20 20 20 20 20 20 20  _in sa4;        
d110: 20 20 2f 2a 20 49 50 76 34 20 2a 2f 0a 20 20 73    /* IPv4 */.  s
d120: 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 69  truct sockaddr_i
d130: 6e 36 20 73 61 36 3b 20 20 20 20 20 20 20 20 20  n6 sa6;         
d140: 2f 2a 20 49 50 76 36 20 2a 2f 0a 20 20 73 74 72  /* IPv6 */.  str
d150: 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 73 74 6f  uct sockaddr_sto
d160: 72 61 67 65 20 73 61 73 3b 20 20 20 20 20 2f 2a  rage sas;     /*
d170: 20 53 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6d   Should be the m
d180: 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 61 62  aximum of the ab
d190: 6f 76 65 20 33 20 2a 2f 0a 7d 20 61 64 64 72 65  ove 3 */.} addre
d1a0: 73 73 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ss;../*.** Imple
d1b0: 6d 65 6e 74 20 61 6e 20 48 54 54 50 20 73 65 72  ment an HTTP ser
d1c0: 76 65 72 20 64 61 65 6d 6f 6e 20 6c 69 73 74 65  ver daemon liste
d1d0: 6e 69 6e 67 20 6f 6e 20 70 6f 72 74 20 69 50 6f  ning on port iPo
d1e0: 72 74 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 6e 65 77  rt..**.** As new
d1f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 72   connections arr
d200: 69 76 65 2c 20 66 6f 72 6b 20 61 20 63 68 69 6c  ive, fork a chil
d210: 64 20 61 6e 64 20 6c 65 74 20 63 68 69 6c 64 20  d and let child 
d220: 72 65 74 75 72 6e 0a 2a 2a 20 6f 75 74 20 6f 66  return.** out of
d230: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
d240: 63 61 6c 6c 2e 20 20 54 68 65 20 63 68 69 6c 64  call.  The child
d250: 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 74 68 65   will handle the
d260: 20 72 65 71 75 65 73 74 2e 0a 2a 2a 20 54 68 65   request..** The
d270: 20 70 61 72 65 6e 74 20 6e 65 76 65 72 20 72 65   parent never re
d280: 74 75 72 6e 73 20 66 72 6f 6d 20 74 68 69 73 20  turns from this 
d290: 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2a 0a 2a 2a  procedure..**.**
d2a0: 20 52 65 74 75 72 6e 20 30 20 74 6f 20 65 61 63   Return 0 to eac
d2b0: 68 20 63 68 69 6c 64 20 61 73 20 69 74 20 72 75  h child as it ru
d2c0: 6e 73 2e 20 20 49 66 20 75 6e 61 62 6c 65 20 74  ns.  If unable t
d2d0: 6f 20 65 73 74 61 62 6c 69 73 68 20 61 0a 2a 2a  o establish a.**
d2e0: 20 6c 69 73 74 65 6e 69 6e 67 20 73 6f 63 6b 65   listening socke
d2f0: 74 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  t, return non-ze
d300: 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 68 74 74 70 5f  ro..*/.int http_
d310: 73 65 72 76 65 72 28 63 6f 6e 73 74 20 63 68 61  server(const cha
d320: 72 20 2a 7a 50 6f 72 74 2c 20 69 6e 74 20 6c 6f  r *zPort, int lo
d330: 63 61 6c 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20  calOnly){.  int 
d340: 6c 69 73 74 65 6e 65 72 5b 32 30 5d 3b 20 20 20  listener[20];   
d350: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
d360: 73 65 72 76 65 72 20 73 6f 63 6b 65 74 73 20 2a  server sockets *
d370: 2f 0a 20 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69  /.  int connecti
d380: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
d390: 20 2f 2a 20 41 20 73 6f 63 6b 65 74 20 66 6f 72   /* A socket for
d3a0: 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c   each individual
d3b0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
d3c0: 20 66 64 5f 73 65 74 20 72 65 61 64 66 64 73 3b   fd_set readfds;
d3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d3e0: 20 53 65 74 20 6f 66 20 66 69 6c 65 20 64 65 73   Set of file des
d3f0: 63 72 69 70 74 6f 72 73 20 66 6f 72 20 73 65 6c  criptors for sel
d400: 65 63 74 28 29 20 2a 2f 0a 20 20 61 64 64 72 65  ect() */.  addre
d410: 73 73 20 69 6e 61 64 64 72 3b 20 20 20 20 20 20  ss inaddr;      
d420: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 74          /* Remot
d430: 65 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 73  e address */.  s
d440: 6f 63 6b 6c 65 6e 5f 74 20 6c 65 6e 61 64 64 72  ocklen_t lenaddr
d450: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
d460: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 69 6e 61  ength of the ina
d470: 64 64 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ddr structure */
d480: 0a 20 20 69 6e 74 20 63 68 69 6c 64 3b 20 20 20  .  int child;   
d490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4a0: 2f 2a 20 50 49 44 20 6f 66 20 74 68 65 20 63 68  /* PID of the ch
d4b0: 69 6c 64 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  ild process */. 
d4c0: 20 69 6e 74 20 6e 63 68 69 6c 64 72 65 6e 20 3d   int nchildren =
d4d0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
d4e0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 69 6c 64   Number of child
d4f0: 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a 20 20   processes */.  
d500: 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 64  struct timeval d
d510: 65 6c 61 79 3b 20 20 20 20 20 20 20 20 2f 2a 20  elay;        /* 
d520: 48 6f 77 20 6c 6f 6e 67 20 74 6f 20 77 61 69 74  How long to wait
d530: 20 69 6e 73 69 64 65 20 73 65 6c 65 63 74 28 29   inside select()
d540: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 74 20 3d 20   */.  int opt = 
d550: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
d560: 20 20 20 2f 2a 20 73 65 74 73 6f 63 6b 6f 70 74     /* setsockopt
d570: 20 66 6c 61 67 20 2a 2f 0a 20 20 73 74 72 75 63   flag */.  struc
d580: 74 20 61 64 64 72 69 6e 66 6f 20 73 48 69 6e 74  t addrinfo sHint
d590: 73 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  s;      /* Addre
d5a0: 73 73 20 68 69 6e 74 73 20 2a 2f 0a 20 20 73 74  ss hints */.  st
d5b0: 72 75 63 74 20 61 64 64 72 69 6e 66 6f 20 2a 70  ruct addrinfo *p
d5c0: 41 64 64 72 73 2c 20 2a 70 3b 20 2f 2a 20 2a 2f  Addrs, *p; /* */
d5d0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5f0: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
d600: 2f 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  /.  int i, n;.  
d610: 69 6e 74 20 6d 61 78 46 64 20 3d 20 2d 31 3b 0a  int maxFd = -1;.
d620: 20 20 0a 20 20 6d 65 6d 73 65 74 28 26 73 48 69    .  memset(&sHi
d630: 6e 74 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  nts, 0, sizeof(s
d640: 48 69 6e 74 73 29 29 3b 0a 20 20 69 66 28 20 69  Hints));.  if( i
d650: 70 76 34 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73  pv4Only ){.    s
d660: 48 69 6e 74 73 2e 61 69 5f 66 61 6d 69 6c 79 20  Hints.ai_family 
d670: 3d 20 50 46 5f 49 4e 45 54 3b 0a 20 20 20 20 2f  = PF_INET;.    /
d680: 2a 70 72 69 6e 74 66 28 22 69 70 76 34 20 6f 6e  *printf("ipv4 on
d690: 6c 79 5c 6e 22 29 3b 2a 2f 0a 20 20 7d 65 6c 73  ly\n");*/.  }els
d6a0: 65 20 69 66 28 20 69 70 76 36 4f 6e 6c 79 20 29  e if( ipv6Only )
d6b0: 7b 0a 20 20 20 20 73 48 69 6e 74 73 2e 61 69 5f  {.    sHints.ai_
d6c0: 66 61 6d 69 6c 79 20 3d 20 50 46 5f 49 4e 45 54  family = PF_INET
d6d0: 36 3b 0a 20 20 20 20 2f 2a 70 72 69 6e 74 66 28  6;.    /*printf(
d6e0: 22 69 70 76 36 20 6f 6e 6c 79 5c 6e 22 29 3b 2a  "ipv6 only\n");*
d6f0: 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  /.  }else{.    s
d700: 48 69 6e 74 73 2e 61 69 5f 66 61 6d 69 6c 79 20  Hints.ai_family 
d710: 3d 20 50 46 5f 55 4e 53 50 45 43 3b 0a 20 20 7d  = PF_UNSPEC;.  }
d720: 0a 20 20 73 48 69 6e 74 73 2e 61 69 5f 73 6f 63  .  sHints.ai_soc
d730: 6b 74 79 70 65 20 3d 20 53 4f 43 4b 5f 53 54 52  ktype = SOCK_STR
d740: 45 41 4d 3b 0a 20 20 73 48 69 6e 74 73 2e 61 69  EAM;.  sHints.ai
d750: 5f 66 6c 61 67 73 20 3d 20 41 49 5f 50 41 53 53  _flags = AI_PASS
d760: 49 56 45 3b 0a 20 20 73 48 69 6e 74 73 2e 61 69  IVE;.  sHints.ai
d770: 5f 70 72 6f 74 6f 63 6f 6c 20 3d 20 30 3b 0a 20  _protocol = 0;. 
d780: 20 72 63 20 3d 20 67 65 74 61 64 64 72 69 6e 66   rc = getaddrinf
d790: 6f 28 6c 6f 63 61 6c 4f 6e 6c 79 20 3f 20 22 6c  o(localOnly ? "l
d7a0: 6f 63 61 6c 68 6f 73 74 22 3a 20 30 2c 20 7a 50  ocalhost": 0, zP
d7b0: 6f 72 74 2c 20 26 73 48 69 6e 74 73 2c 20 26 70  ort, &sHints, &p
d7c0: 41 64 64 72 73 29 3b 0a 20 20 69 66 28 20 72 63  Addrs);.  if( rc
d7d0: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
d7e0: 73 74 64 65 72 72 2c 20 22 63 6f 75 6c 64 20 6e  stderr, "could n
d7f0: 6f 74 20 67 65 74 20 61 64 64 72 20 69 6e 66 6f  ot get addr info
d800: 3a 20 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20  : %s", .        
d810: 20 20 20 20 72 63 21 3d 45 41 49 5f 53 59 53 54      rc!=EAI_SYST
d820: 45 4d 20 3f 20 67 61 69 5f 73 74 72 65 72 72 6f  EM ? gai_strerro
d830: 72 28 72 63 29 20 3a 20 73 74 72 65 72 72 6f 72  r(rc) : strerror
d840: 28 65 72 72 6e 6f 29 29 3b 0a 20 20 20 20 72 65  (errno));.    re
d850: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 66 6f  turn 1;.  }.  fo
d860: 72 28 6e 3d 30 2c 20 70 3d 70 41 64 64 72 73 3b  r(n=0, p=pAddrs;
d870: 20 6e 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28   n<(int)(sizeof(
d880: 6c 69 73 74 65 6e 65 72 29 2f 73 69 7a 65 6f 66  listener)/sizeof
d890: 28 6c 69 73 74 65 6e 65 72 5b 30 5d 29 29 20 26  (listener[0])) &
d8a0: 26 20 70 21 3d 30 3b 0a 20 20 20 20 20 20 20 20  & p!=0;.        
d8b0: 70 3d 70 2d 3e 61 69 5f 6e 65 78 74 29 7b 0a 20  p=p->ai_next){. 
d8c0: 20 20 20 6c 69 73 74 65 6e 65 72 5b 6e 5d 20 3d     listener[n] =
d8d0: 20 73 6f 63 6b 65 74 28 70 2d 3e 61 69 5f 66 61   socket(p->ai_fa
d8e0: 6d 69 6c 79 2c 20 70 2d 3e 61 69 5f 73 6f 63 6b  mily, p->ai_sock
d8f0: 74 79 70 65 2c 20 70 2d 3e 61 69 5f 70 72 6f 74  type, p->ai_prot
d900: 6f 63 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 6c  ocol);.    if( l
d910: 69 73 74 65 6e 65 72 5b 6e 5d 3e 3d 30 20 29 7b  istener[n]>=0 ){
d920: 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20  .      /* if we 
d930: 63 61 6e 27 74 20 74 65 72 6d 69 6e 61 74 65 20  can't terminate 
d940: 6e 69 63 65 6c 79 2c 20 61 74 20 6c 65 61 73 74  nicely, at least
d950: 20 61 6c 6c 6f 77 20 74 68 65 20 73 6f 63 6b 65   allow the socke
d960: 74 20 74 6f 20 62 65 20 72 65 75 73 65 64 20 2a  t to be reused *
d970: 2f 0a 20 20 20 20 20 20 73 65 74 73 6f 63 6b 6f  /.      setsocko
d980: 70 74 28 6c 69 73 74 65 6e 65 72 5b 6e 5d 2c 20  pt(listener[n], 
d990: 53 4f 4c 5f 53 4f 43 4b 45 54 2c 20 53 4f 5f 52  SOL_SOCKET, SO_R
d9a0: 45 55 53 45 41 44 44 52 2c 26 6f 70 74 2c 20 73  EUSEADDR,&opt, s
d9b0: 69 7a 65 6f 66 28 6f 70 74 29 29 3b 0a 20 20 20  izeof(opt));.   
d9c0: 20 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28     .#if defined(
d9d0: 49 50 56 36 5f 56 36 4f 4e 4c 59 29 0a 20 20 20  IPV6_V6ONLY).   
d9e0: 20 20 20 69 66 28 20 70 2d 3e 61 69 5f 66 61 6d     if( p->ai_fam
d9f0: 69 6c 79 3d 3d 41 46 5f 49 4e 45 54 36 20 29 7b  ily==AF_INET6 ){
da00: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 76 36 6f  .        int v6o
da10: 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nly = 1;.       
da20: 20 73 65 74 73 6f 63 6b 6f 70 74 28 6c 69 73 74   setsockopt(list
da30: 65 6e 65 72 5b 6e 5d 2c 20 49 50 50 52 4f 54 4f  ener[n], IPPROTO
da40: 5f 49 50 56 36 2c 20 49 50 56 36 5f 56 36 4f 4e  _IPV6, IPV6_V6ON
da50: 4c 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LY,.            
da60: 20 20 20 20 20 20 20 20 26 76 36 6f 6e 6c 79 2c          &v6only,
da70: 20 73 69 7a 65 6f 66 28 76 36 6f 6e 6c 79 29 29   sizeof(v6only))
da80: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
da90: 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66  .      .      if
daa0: 28 20 62 69 6e 64 28 6c 69 73 74 65 6e 65 72 5b  ( bind(listener[
dab0: 6e 5d 2c 20 70 2d 3e 61 69 5f 61 64 64 72 2c 20  n], p->ai_addr, 
dac0: 70 2d 3e 61 69 5f 61 64 64 72 6c 65 6e 29 3c 30  p->ai_addrlen)<0
dad0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e   ){.        prin
dae0: 74 66 28 22 62 69 6e 64 20 66 61 69 6c 65 64 3a  tf("bind failed:
daf0: 20 25 73 5c 6e 22 2c 20 73 74 72 65 72 72 6f 72   %s\n", strerror
db00: 28 65 72 72 6e 6f 29 29 3b 0a 20 20 20 20 20 20  (errno));.      
db10: 20 20 63 6c 6f 73 65 28 6c 69 73 74 65 6e 65 72    close(listener
db20: 5b 6e 5d 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  [n]);.        co
db30: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
db40: 20 20 20 20 20 20 69 66 28 20 6c 69 73 74 65 6e        if( listen
db50: 28 6c 69 73 74 65 6e 65 72 5b 6e 5d 2c 20 32 30  (listener[n], 20
db60: 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  )<0 ){.        p
db70: 72 69 6e 74 66 28 22 6c 69 73 74 65 6e 28 29 20  rintf("listen() 
db80: 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20 73  failed: %s\n", s
db90: 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 29 3b  trerror(errno));
dba0: 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 6c  .        close(l
dbb0: 69 73 74 65 6e 65 72 5b 6e 5d 29 3b 0a 20 20 20  istener[n]);.   
dbc0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
dbd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 2b 2b       }.      n++
dbe0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
dbf0: 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70  ( n==0 ){.    fp
dc00: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 63  rintf(stderr, "c
dc10: 61 6e 6e 6f 74 20 6f 70 65 6e 20 61 6e 79 20 73  annot open any s
dc20: 6f 63 6b 65 74 73 5c 6e 22 29 3b 0a 20 20 20 20  ockets\n");.    
dc30: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
dc40: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
dc50: 20 69 66 28 20 6e 63 68 69 6c 64 72 65 6e 3e 4d   if( nchildren>M
dc60: 41 58 5f 50 41 52 41 4c 4c 45 4c 20 29 7b 0a 20  AX_PARALLEL ){. 
dc70: 20 20 20 20 20 2f 2a 20 53 6c 6f 77 20 64 6f 77       /* Slow dow
dc80: 6e 20 69 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  n if connections
dc90: 20 61 72 65 20 61 72 72 69 76 69 6e 67 20 74 6f   are arriving to
dca0: 6f 20 66 61 73 74 20 2a 2f 0a 20 20 20 20 20 20  o fast */.      
dcb0: 73 6c 65 65 70 28 20 6e 63 68 69 6c 64 72 65 6e  sleep( nchildren
dcc0: 2d 4d 41 58 5f 50 41 52 41 4c 4c 45 4c 20 29 3b  -MAX_PARALLEL );
dcd0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 6c 61 79  .    }.    delay
dce0: 2e 74 76 5f 73 65 63 20 3d 20 36 30 3b 0a 20 20  .tv_sec = 60;.  
dcf0: 20 20 64 65 6c 61 79 2e 74 76 5f 75 73 65 63 20    delay.tv_usec 
dd00: 3d 20 30 3b 0a 20 20 20 20 46 44 5f 5a 45 52 4f  = 0;.    FD_ZERO
dd10: 28 26 72 65 61 64 66 64 73 29 3b 0a 20 20 20 20  (&readfds);.    
dd20: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
dd30: 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
dd40: 28 20 6c 69 73 74 65 6e 65 72 5b 69 5d 3e 3d 30  ( listener[i]>=0
dd50: 20 29 3b 0a 20 20 20 20 20 20 46 44 5f 53 45 54   );.      FD_SET
dd60: 28 20 6c 69 73 74 65 6e 65 72 5b 69 5d 2c 20 26  ( listener[i], &
dd70: 72 65 61 64 66 64 73 29 3b 0a 20 20 20 20 20 20  readfds);.      
dd80: 69 66 28 20 6c 69 73 74 65 6e 65 72 5b 69 5d 3e  if( listener[i]>
dd90: 6d 61 78 46 64 20 29 20 6d 61 78 46 64 20 3d 20  maxFd ) maxFd = 
dda0: 6c 69 73 74 65 6e 65 72 5b 69 5d 3b 0a 20 20 20  listener[i];.   
ddb0: 20 7d 0a 20 20 20 20 73 65 6c 65 63 74 28 20 6d   }.    select( m
ddc0: 61 78 46 64 2b 31 2c 20 26 72 65 61 64 66 64 73  axFd+1, &readfds
ddd0: 2c 20 30 2c 20 30 2c 20 26 64 65 6c 61 79 29 3b  , 0, 0, &delay);
dde0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
ddf0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  n; i++){.      i
de00: 66 28 20 46 44 5f 49 53 53 45 54 28 6c 69 73 74  f( FD_ISSET(list
de10: 65 6e 65 72 5b 69 5d 2c 20 26 72 65 61 64 66 64  ener[i], &readfd
de20: 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65  s) ){.        le
de30: 6e 61 64 64 72 20 3d 20 73 69 7a 65 6f 66 28 69  naddr = sizeof(i
de40: 6e 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20  naddr);.        
de50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 61 63 63  connection = acc
de60: 65 70 74 28 6c 69 73 74 65 6e 65 72 5b 69 5d 2c  ept(listener[i],
de70: 20 26 69 6e 61 64 64 72 2e 73 61 2c 20 26 6c 65   &inaddr.sa, &le
de80: 6e 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20  naddr);.        
de90: 69 66 28 20 63 6f 6e 6e 65 63 74 69 6f 6e 3e 3d  if( connection>=
dea0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  0 ){.          c
deb0: 68 69 6c 64 20 3d 20 66 6f 72 6b 28 29 3b 0a 20  hild = fork();. 
dec0: 20 20 20 20 20 20 20 20 20 69 66 28 20 63 68 69           if( chi
ded0: 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ld!=0 ){.       
dee0: 20 20 20 20 20 69 66 28 20 63 68 69 6c 64 3e 30       if( child>0
def0: 20 29 20 6e 63 68 69 6c 64 72 65 6e 2b 2b 3b 0a   ) nchildren++;.
df00: 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73              clos
df10: 65 28 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20  e(connection);. 
df20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 72             /* pr
df30: 69 6e 74 66 28 22 73 75 62 70 72 6f 63 65 73 73  intf("subprocess
df40: 20 25 64 20 73 74 61 72 74 65 64 2e 2e 2e 5c 6e   %d started...\n
df50: 22 2c 20 63 68 69 6c 64 29 3b 20 66 66 6c 75 73  ", child); fflus
df60: 68 28 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20  h(stdout); */.  
df70: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
df80: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e             int n
df90: 45 72 72 20 3d 20 30 2c 20 66 64 3b 0a 20 20 20  Err = 0, fd;.   
dfa0: 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 30           close(0
dfb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
dfc0: 64 20 3d 20 64 75 70 28 63 6f 6e 6e 65 63 74 69  d = dup(connecti
dfd0: 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  on);.           
dfe0: 20 69 66 28 20 66 64 21 3d 30 20 29 20 6e 45 72   if( fd!=0 ) nEr
dff0: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r++;.           
e000: 20 63 6c 6f 73 65 28 31 29 3b 0a 20 20 20 20 20   close(1);.     
e010: 20 20 20 20 20 20 20 66 64 20 3d 20 64 75 70 28         fd = dup(
e020: 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 20  connection);.   
e030: 20 20 20 20 20 20 20 20 20 69 66 28 20 66 64 21           if( fd!
e040: 3d 31 20 29 20 6e 45 72 72 2b 2b 3b 0a 20 20 20  =1 ) nErr++;.   
e050: 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 63           close(c
e060: 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 20 20  onnection);.    
e070: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
e080: 45 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Err;.          }
e090: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e0a0: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 42 75 72 79   }.      /* Bury
e0b0: 20 64 65 61 64 20 63 68 69 6c 64 72 65 6e 20 2a   dead children *
e0c0: 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  /.      while( (
e0d0: 63 68 69 6c 64 20 3d 20 77 61 69 74 70 69 64 28  child = waitpid(
e0e0: 30 2c 20 30 2c 20 57 4e 4f 48 41 4e 47 29 29 3e  0, 0, WNOHANG))>
e0f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
e100: 70 72 69 6e 74 66 28 22 70 72 6f 63 65 73 73 20  printf("process 
e110: 25 64 20 65 6e 64 73 5c 6e 22 2c 20 63 68 69 6c  %d ends\n", chil
e120: 64 29 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75  d); fflush(stdou
e130: 74 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e  t); */.        n
e140: 63 68 69 6c 64 72 65 6e 2d 2d 3b 0a 20 20 20 20  children--;.    
e150: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
e160: 2f 2a 20 4e 4f 54 20 52 45 41 43 48 45 44 20 2a  /* NOT REACHED *
e170: 2f 20 20 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d  /  .  exit(1);.}
e180: 0a 0a 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20  ...int main(int 
e190: 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67  argc, char **arg
e1a0: 76 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  v){.  int i;    
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1c0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
e1d0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 65 72 6d  */.  char *zPerm
e1e0: 55 73 65 72 20 3d 20 30 3b 20 20 20 20 20 20 2f  User = 0;      /
e1f0: 2a 20 52 75 6e 20 64 61 65 6d 6f 6e 20 77 69 74  * Run daemon wit
e200: 68 20 74 68 69 73 20 75 73 65 72 27 73 20 70 65  h this user's pe
e210: 72 6d 69 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 63  rmissions */.  c
e220: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 6f 72 74  onst char *zPort
e230: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6d 70 6c   = 0;    /* Impl
e240: 65 6d 65 6e 74 20 61 6e 20 48 54 54 50 20 73 65  ement an HTTP se
e250: 72 76 65 72 20 70 72 6f 63 65 73 73 20 2a 2f 0a  rver process */.
e260: 20 20 69 6e 74 20 75 73 65 43 68 72 6f 6f 74 4a    int useChrootJ
e270: 61 69 6c 20 3d 20 31 3b 20 20 20 20 2f 2a 20 54  ail = 1;    /* T
e280: 72 75 65 20 74 6f 20 75 73 65 20 61 20 63 68 61  rue to use a cha
e290: 6e 67 65 2d 72 6f 6f 74 20 6a 61 69 6c 20 2a 2f  nge-root jail */
e2a0: 0a 20 20 73 74 72 75 63 74 20 70 61 73 73 77 64  .  struct passwd
e2b0: 20 2a 70 77 64 20 3d 20 30 3b 20 20 20 2f 2a 20   *pwd = 0;   /* 
e2c0: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
e2d0: 74 20 74 68 65 20 75 73 65 72 20 2a 2f 0a 0a 20  t the user */.. 
e2e0: 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 74   /* Record the t
e2f0: 69 6d 65 20 77 68 65 6e 20 70 72 6f 63 65 73 73  ime when process
e300: 69 6e 67 20 62 65 67 69 6e 73 2e 0a 20 20 2a 2f  ing begins..  */
e310: 0a 20 20 67 65 74 74 69 6d 65 6f 66 64 61 79 28  .  gettimeofday(
e320: 26 62 65 67 69 6e 54 69 6d 65 2c 20 30 29 3b 0a  &beginTime, 0);.
e330: 0a 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6d 6d  .  /* Parse comm
e340: 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e  and-line argumen
e350: 74 73 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  ts.  */.  while(
e360: 20 61 72 67 63 3e 31 20 26 26 20 61 72 67 76 5b   argc>1 && argv[
e370: 31 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20  1][0]=='-' ){.  
e380: 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 72 67 76    char *z = argv
e390: 5b 31 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  [1];.    char *z
e3a0: 41 72 67 20 3d 20 61 72 67 63 3e 3d 33 20 3f 20  Arg = argc>=3 ? 
e3b0: 61 72 67 76 5b 32 5d 20 3a 20 22 30 22 3b 0a 20  argv[2] : "0";. 
e3c0: 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27     if( z[0]=='-'
e3d0: 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20   && z[1]=='-' ) 
e3e0: 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 73 74 72  z++;.    if( str
e3f0: 63 6d 70 28 7a 2c 22 2d 75 73 65 72 22 29 3d 3d  cmp(z,"-user")==
e400: 30 20 29 7b 0a 20 20 20 20 20 20 7a 50 65 72 6d  0 ){.      zPerm
e410: 55 73 65 72 20 3d 20 7a 41 72 67 3b 0a 20 20 20  User = zArg;.   
e420: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
e430: 70 28 7a 2c 22 2d 72 6f 6f 74 22 29 3d 3d 30 20  p(z,"-root")==0 
e440: 29 7b 0a 20 20 20 20 20 20 7a 52 6f 6f 74 20 3d  ){.      zRoot =
e450: 20 7a 41 72 67 3b 0a 20 20 20 20 7d 65 6c 73 65   zArg;.    }else
e460: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
e470: 6c 6f 67 66 69 6c 65 22 29 3d 3d 30 20 29 7b 0a  logfile")==0 ){.
e480: 20 20 20 20 20 20 7a 4c 6f 67 46 69 6c 65 20 3d        zLogFile =
e490: 20 7a 41 72 67 3b 0a 20 20 20 20 7d 65 6c 73 65   zArg;.    }else
e4a0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
e4b0: 68 74 74 70 73 22 29 3d 3d 30 20 29 7b 0a 20 20  https")==0 ){.  
e4c0: 20 20 20 20 75 73 65 48 74 74 70 73 20 3d 20 61      useHttps = a
e4d0: 74 6f 69 28 7a 41 72 67 29 3b 0a 20 20 20 20 20  toi(zArg);.     
e4e0: 20 7a 48 74 74 70 20 3d 20 75 73 65 48 74 74 70   zHttp = useHttp
e4f0: 73 20 3f 20 22 68 74 74 70 22 20 3a 20 22 68 74  s ? "http" : "ht
e500: 74 70 73 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20  tps";.    }else 
e510: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d  if( strcmp(z, "-
e520: 70 6f 72 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  port")==0 ){.   
e530: 20 20 20 7a 50 6f 72 74 20 3d 20 7a 41 72 67 3b     zPort = zArg;
e540: 0a 20 20 20 20 20 20 73 74 61 6e 64 61 6c 6f 6e  .      standalon
e550: 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 1;.    }else
e560: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22   if( strcmp(z, "
e570: 2d 66 61 6d 69 6c 79 22 29 3d 3d 30 20 29 7b 0a  -family")==0 ){.
e580: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
e590: 28 7a 41 72 67 2c 20 22 69 70 76 34 22 29 3d 3d  (zArg, "ipv4")==
e5a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 70 76  0 ){.        ipv
e5b0: 34 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20  4Only = 1;.     
e5c0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
e5d0: 70 28 7a 41 72 67 2c 20 22 69 70 76 36 22 29 3d  p(zArg, "ipv6")=
e5e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 70  =0 ){.        ip
e5f0: 76 36 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20  v6Only = 1;.    
e600: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e610: 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c   Malfunction(__L
e620: 49 4e 45 5f 5f 2c 20 22 75 6e 6b 6e 6f 77 6e 20  INE__, "unknown 
e630: 49 50 20 70 72 6f 74 6f 63 6f 6c 3a 20 5b 25 73  IP protocol: [%s
e640: 5d 22 2c 20 7a 41 72 67 29 3b 0a 20 20 20 20 20  ]", zArg);.     
e650: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
e660: 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 6a 61 69   strcmp(z, "-jai
e670: 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  l")==0 ){.      
e680: 69 66 28 20 61 74 6f 69 28 7a 41 72 67 29 3d 3d  if( atoi(zArg)==
e690: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 73 65  0 ){.        use
e6a0: 43 68 72 6f 6f 74 4a 61 69 6c 20 3d 20 30 3b 0a  ChrootJail = 0;.
e6b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
e6c0: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20  e if( strcmp(z, 
e6d0: 22 2d 64 65 62 75 67 22 29 3d 3d 30 20 29 7b 0a  "-debug")==0 ){.
e6e0: 20 20 20 20 20 20 69 66 28 20 61 74 6f 69 28 7a        if( atoi(z
e6f0: 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Arg) ){.        
e700: 75 73 65 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a  useTimeout = 0;.
e710: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
e720: 65 7b 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e 63  e{.      Malfunc
e730: 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22  tion(__LINE__, "
e740: 75 6e 6b 6e 6f 77 6e 20 61 72 67 75 6d 65 6e 74  unknown argument
e750: 3a 20 5b 25 73 5d 22 2c 20 7a 29 3b 0a 20 20 20  : [%s]", z);.   
e760: 20 7d 0a 20 20 20 20 61 72 67 76 20 2b 3d 20 32   }.    argv += 2
e770: 3b 0a 20 20 20 20 61 72 67 63 20 2d 3d 20 32 3b  ;.    argc -= 2;
e780: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 52 6f 6f 74  .  }.  if( zRoot
e790: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  ==0 ){.    if( s
e7a0: 74 61 6e 64 61 6c 6f 6e 65 20 29 7b 0a 20 20 20  tandalone ){.   
e7b0: 20 20 20 7a 52 6f 6f 74 20 3d 20 22 2e 22 3b 0a     zRoot = ".";.
e7c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e7d0: 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c   Malfunction(__L
e7e0: 49 4e 45 5f 5f 2c 20 22 6e 6f 20 2d 2d 72 6f 6f  INE__, "no --roo
e7f0: 74 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20  t specified");. 
e800: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a     }.  }.  .  /*
e810: 20 43 68 61 6e 67 65 20 64 69 72 65 63 74 6f 72   Change director
e820: 69 65 73 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  ies to the root 
e830: 6f 66 20 74 68 65 20 48 54 54 50 20 66 69 6c 65  of the HTTP file
e840: 73 79 73 74 65 6d 2e 20 20 54 68 65 6e 0a 20 20  system.  Then.  
e850: 2a 2a 20 63 72 65 61 74 65 20 61 20 63 68 72 6f  ** create a chro
e860: 6f 74 20 6a 61 69 6c 20 74 68 65 72 65 2e 0a 20  ot jail there.. 
e870: 20 2a 2f 0a 20 20 69 66 28 20 63 68 64 69 72 28   */.  if( chdir(
e880: 7a 52 6f 6f 74 29 21 3d 30 20 29 7b 0a 20 20 20  zRoot)!=0 ){.   
e890: 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c   Malfunction(__L
e8a0: 49 4e 45 5f 5f 2c 20 22 63 61 6e 6e 6f 74 20 63  INE__, "cannot c
e8b0: 68 61 6e 67 65 20 74 6f 20 64 69 72 65 63 74 6f  hange to directo
e8c0: 72 79 20 5b 25 73 5d 22 2c 20 7a 52 6f 6f 74 29  ry [%s]", zRoot)
e8d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20  ;.  }..  /* Get 
e8e0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
e8f0: 74 20 74 68 65 20 75 73 65 72 20 69 66 20 61 76  t the user if av
e900: 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28  ailable */.  if(
e910: 20 7a 50 65 72 6d 55 73 65 72 20 29 20 70 77 64   zPermUser ) pwd
e920: 20 3d 20 67 65 74 70 77 6e 61 6d 28 7a 50 65 72   = getpwnam(zPer
e930: 6d 55 73 65 72 29 3b 0a 0a 20 20 2f 2a 20 45 6e  mUser);..  /* En
e940: 74 65 72 20 74 68 65 20 63 68 72 6f 6f 74 20 6a  ter the chroot j
e950: 61 69 6c 20 69 66 20 72 65 71 75 65 73 74 65 64  ail if requested
e960: 20 2a 2f 20 20 0a 20 20 69 66 28 20 7a 50 65 72   */  .  if( zPer
e970: 6d 55 73 65 72 20 26 26 20 75 73 65 43 68 72 6f  mUser && useChro
e980: 6f 74 4a 61 69 6c 20 26 26 20 67 65 74 75 69 64  otJail && getuid
e990: 28 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ()==0 ){.    if(
e9a0: 20 63 68 72 6f 6f 74 28 22 2e 22 29 3c 30 20 29   chroot(".")<0 )
e9b0: 7b 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74  {.      Malfunct
e9c0: 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 75  ion(__LINE__, "u
e9d0: 6e 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  nable to create 
e9e0: 63 68 72 6f 6f 74 20 6a 61 69 6c 22 29 3b 0a 20  chroot jail");. 
e9f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ea00: 7a 52 6f 6f 74 20 3d 20 22 22 3b 0a 20 20 20 20  zRoot = "";.    
ea10: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 74 69  }.  }..  /* Acti
ea20: 76 61 74 65 20 74 68 65 20 73 65 72 76 65 72 2c  vate the server,
ea30: 20 69 66 20 72 65 71 75 65 73 74 65 64 20 2a 2f   if requested */
ea40: 0a 20 20 69 66 28 20 7a 50 6f 72 74 20 26 26 20  .  if( zPort && 
ea50: 68 74 74 70 5f 73 65 72 76 65 72 28 7a 50 6f 72  http_server(zPor
ea60: 74 2c 20 30 29 20 29 7b 0a 20 20 20 20 4d 61 6c  t, 0) ){.    Mal
ea70: 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f  function(__LINE_
ea80: 5f 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 73 74  _, "failed to st
ea90: 61 72 74 20 73 65 72 76 65 72 22 29 3b 0a 20 20  art server");.  
eaa0: 7d 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 72 6f 6f  }..  /* Drop roo
eab0: 74 20 70 72 69 76 69 6c 65 67 65 73 2e 0a 20 20  t privileges..  
eac0: 2a 2f 0a 20 20 69 66 28 20 7a 50 65 72 6d 55 73  */.  if( zPermUs
ead0: 65 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 77  er ){.    if( pw
eae0: 64 20 29 7b 0a 20 20 20 20 20 20 73 65 74 67 69  d ){.      setgi
eaf0: 64 28 70 77 64 2d 3e 70 77 5f 67 69 64 29 3b 0a  d(pwd->pw_gid);.
eb00: 20 20 20 20 20 20 73 65 74 75 69 64 28 70 77 64        setuid(pwd
eb10: 2d 3e 70 77 5f 75 69 64 29 3b 0a 20 20 20 20 7d  ->pw_uid);.    }
eb20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d 61 6c 66  else{.      Malf
eb30: 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f  unction(__LINE__
eb40: 2c 20 22 6e 6f 20 73 75 63 68 20 75 73 65 72 20  , "no such user 
eb50: 5b 25 73 5d 22 2c 20 7a 50 65 72 6d 55 73 65 72  [%s]", zPermUser
eb60: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
eb70: 66 28 20 67 65 74 75 69 64 28 29 3d 3d 30 20 29  f( getuid()==0 )
eb80: 7b 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f  {.    Malfunctio
eb90: 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 63 61 6e  n(__LINE__, "can
eba0: 6e 6f 74 20 72 75 6e 20 61 73 20 72 6f 6f 74 22  not run as root"
ebb0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74  );.  }..  /* Get
ebc0: 20 74 68 65 20 49 50 20 61 64 64 72 65 73 73 20   the IP address 
ebd0: 66 72 6f 6d 20 77 68 65 6e 20 74 68 65 20 72 65  from when the re
ebe0: 71 75 65 73 74 20 6f 72 69 67 69 6e 61 74 65 73  quest originates
ebf0: 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 61 64  .  */.  {.    ad
ec00: 64 72 65 73 73 20 72 65 6d 6f 74 65 41 64 64 72  dress remoteAddr
ec10: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69  ;.    unsigned i
ec20: 6e 74 20 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66  nt size = sizeof
ec30: 28 72 65 6d 6f 74 65 41 64 64 72 29 3b 0a 20 20  (remoteAddr);.  
ec40: 20 20 63 68 61 72 20 7a 48 6f 73 74 5b 4e 49 5f    char zHost[NI_
ec50: 4d 41 58 48 4f 53 54 5d 3b 0a 20 20 20 20 69 66  MAXHOST];.    if
ec60: 28 20 67 65 74 70 65 65 72 6e 61 6d 65 28 30 2c  ( getpeername(0,
ec70: 20 26 72 65 6d 6f 74 65 41 64 64 72 2e 73 61 2c   &remoteAddr.sa,
ec80: 20 26 73 69 7a 65 29 3e 3d 30 20 29 7b 0a 20 20   &size)>=0 ){.  
ec90: 20 20 20 20 67 65 74 6e 61 6d 65 69 6e 66 6f 28      getnameinfo(
eca0: 26 72 65 6d 6f 74 65 41 64 64 72 2e 73 61 2c 20  &remoteAddr.sa, 
ecb0: 73 69 7a 65 2c 20 7a 48 6f 73 74 2c 20 73 69 7a  size, zHost, siz
ecc0: 65 6f 66 28 7a 48 6f 73 74 29 2c 20 30 2c 20 30  eof(zHost), 0, 0
ecd0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ece0: 20 20 20 20 4e 49 5f 4e 55 4d 45 52 49 43 48 4f      NI_NUMERICHO
ecf0: 53 54 29 3b 0a 20 20 20 20 20 20 7a 52 65 6d 6f  ST);.      zRemo
ed00: 74 65 41 64 64 72 20 3d 20 53 74 72 44 75 70 28  teAddr = StrDup(
ed10: 7a 48 6f 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  zHost);.    }.  
ed20: 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  }..  /* Process 
ed30: 74 68 65 20 69 6e 70 75 74 20 73 74 72 65 61 6d  the input stream
ed40: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
ed50: 3c 31 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <100; i++){.    
ed60: 50 72 6f 63 65 73 73 4f 6e 65 52 65 71 75 65 73  ProcessOneReques
ed70: 74 28 30 29 3b 0a 20 20 7d 0a 20 20 50 72 6f 63  t(0);.  }.  Proc
ed80: 65 73 73 4f 6e 65 52 65 71 75 65 73 74 28 31 29  essOneRequest(1)
ed90: 3b 0a 20 20 65 78 69 74 28 30 29 3b 0a 7d 0a     ;.  exit(0);.}.