Documentation Source Text

Hex Artifact Content
Login

Artifact 348b063918d0d38a90b956ac0c152ce32365bd7e:


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 2e 0a 2a  if we timeout..*
3810: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 69  /.static void Ti
3820: 6d 65 6f 75 74 28 69 6e 74 20 4e 6f 74 55 73 65  meout(int NotUse
3830: 64 29 7b 0a 20 20 28 76 6f 69 64 29 4e 6f 74 55  d){.  (void)NotU
3840: 73 65 64 3b 0a 20 20 69 66 28 20 21 64 65 62 75  sed;.  if( !debu
3850: 67 46 6c 61 67 20 29 7b 0a 20 20 20 20 69 66 28  gFlag ){.    if(
3860: 20 7a 53 63 72 69 70 74 20 26 26 20 7a 53 63 72   zScript && zScr
3870: 69 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ipt[0] ){.      
3880: 73 74 72 63 70 79 28 7a 52 65 70 6c 79 53 74 61  strcpy(zReplySta
3890: 74 75 73 2c 20 22 39 39 39 22 29 3b 0a 20 20 20  tus, "999");.   
38a0: 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28     MakeLogEntry(
38b0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78  0);.    }.    ex
38c0: 69 74 28 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  it(0);.  }.}../*
38d0: 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c 69  .** Tell the cli
38e0: 65 6e 74 20 74 68 61 74 20 74 68 65 72 65 20 69  ent that there i
38f0: 73 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68  s an error in th
3900: 65 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61  e script..*/.sta
3910: 74 69 63 20 76 6f 69 64 20 43 67 69 53 63 72 69  tic void CgiScri
3920: 70 74 57 72 69 74 61 62 6c 65 28 76 6f 69 64 29  ptWritable(void)
3930: 7b 0a 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73  {.  StartRespons
3940: 65 28 22 35 30 30 20 43 47 49 20 43 6f 6e 66 69  e("500 CGI Confi
3950: 67 75 72 61 74 69 6f 6e 20 45 72 72 6f 72 22 29  guration Error")
3960: 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e  ;.  nOut += prin
3970: 74 66 28 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74  tf(.    "Content
3980: 2d 74 79 70 65 3a 20 74 65 78 74 2f 70 6c 61 69  -type: text/plai
3990: 6e 5c 72 5c 6e 22 0a 20 20 20 20 22 5c 72 5c 6e  n\r\n".    "\r\n
39a0: 22 0a 20 20 20 20 22 54 68 65 20 43 47 49 20 70  ".    "The CGI p
39b0: 72 6f 67 72 61 6d 20 25 73 20 69 73 20 77 72 69  rogram %s is wri
39c0: 74 61 62 6c 65 20 62 79 20 75 73 65 72 73 20 6f  table by users o
39d0: 74 68 65 72 20 74 68 61 6e 20 69 74 73 20 6f 77  ther than its ow
39e0: 6e 65 72 2e 5c 6e 22 2c 0a 20 20 20 20 7a 52 65  ner.\n",.    zRe
39f0: 61 6c 53 63 72 69 70 74 29 3b 0a 20 20 4d 61 6b  alScript);.  Mak
3a00: 65 4c 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20 20  eLogEntry(0);.  
3a10: 65 78 69 74 28 30 29 3b 20 20 20 20 20 20 20 0a  exit(0);       .
3a20: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68  }../*.** Tell th
3a30: 65 20 63 6c 69 65 6e 74 20 74 68 61 74 20 74 68  e client that th
3a40: 65 20 73 65 72 76 65 72 20 6d 61 6c 66 75 6e 63  e server malfunc
3a50: 74 69 6f 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  tioned..*/.stati
3a60: 63 20 76 6f 69 64 20 4d 61 6c 66 75 6e 63 74 69  c void Malfuncti
3a70: 6f 6e 28 69 6e 74 20 6c 69 6e 65 6e 75 6d 2c 20  on(int linenum, 
3a80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
3a90: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
3aa0: 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74  list ap;.  va_st
3ab0: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
3ac0: 3b 0a 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73  ;.  StartRespons
3ad0: 65 28 22 35 30 30 20 53 65 72 76 65 72 20 4d 61  e("500 Server Ma
3ae0: 6c 66 75 6e 63 74 69 6f 6e 22 29 3b 0a 20 20 6e  lfunction");.  n
3af0: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20  Out += printf(. 
3b00: 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65     "Content-type
3b10: 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e  : text/plain\r\n
3b20: 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20  ".    "\r\n".   
3b30: 20 22 57 65 62 20 73 65 72 76 65 72 20 6d 61 6c   "Web server mal
3b40: 66 75 6e 63 74 69 6f 6e 65 64 3b 20 65 72 72 6f  functioned; erro
3b50: 72 20 6e 75 6d 62 65 72 20 25 64 5c 6e 5c 6e 22  r number %d\n\n"
3b60: 2c 20 6c 69 6e 65 6e 75 6d 29 3b 0a 20 20 69 66  , linenum);.  if
3b70: 28 20 7a 46 6f 72 6d 61 74 20 29 7b 0a 20 20 20  ( zFormat ){.   
3b80: 20 6e 4f 75 74 20 2b 3d 20 76 70 72 69 6e 74 66   nOut += vprintf
3b90: 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20  (zFormat, ap);. 
3ba0: 20 7d 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72   }.  MakeLogEntr
3bb0: 79 28 30 29 3b 0a 20 20 65 78 69 74 28 30 29 3b  y(0);.  exit(0);
3bc0: 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a         .}../*.**
3bd0: 20 44 6f 20 61 20 73 65 72 76 65 72 20 72 65 64   Do a server red
3be0: 69 72 65 63 74 20 74 6f 20 74 68 65 20 64 6f 63  irect to the doc
3bf0: 75 6d 65 6e 74 20 73 70 65 63 69 66 69 65 64 2e  ument specified.
3c00: 20 20 54 68 65 20 64 6f 63 75 6d 65 6e 74 0a 2a    The document.*
3c10: 2a 20 6e 61 6d 65 20 6e 6f 74 20 63 6f 6e 74 61  * name not conta
3c20: 69 6e 20 73 63 68 65 6d 65 20 6f 72 20 6e 65 74  in scheme or net
3c30: 77 6f 72 6b 20 6c 6f 63 61 74 69 6f 6e 20 6f 72  work location or
3c40: 20 74 68 65 20 71 75 65 72 79 20 73 74 72 69 6e   the query strin
3c50: 67 2e 0a 2a 2a 20 49 74 20 77 69 6c 6c 20 62 65  g..** It will be
3c60: 20 6a 75 73 74 20 74 68 65 20 70 61 74 68 2e 0a   just the path..
3c70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 52  */.static void R
3c80: 65 64 69 72 65 63 74 28 63 6f 6e 73 74 20 63 68  edirect(const ch
3c90: 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66  ar *zPath, int f
3ca0: 69 6e 69 73 68 29 7b 0a 20 20 53 74 61 72 74 52  inish){.  StartR
3cb0: 65 73 70 6f 6e 73 65 28 22 33 30 32 20 54 65 6d  esponse("302 Tem
3cc0: 70 6f 72 61 72 79 20 52 65 64 69 72 65 63 74 22  porary Redirect"
3cd0: 29 3b 0a 20 20 69 66 28 20 7a 53 65 72 76 65 72  );.  if( zServer
3ce0: 50 6f 72 74 3d 3d 30 20 7c 7c 20 7a 53 65 72 76  Port==0 || zServ
3cf0: 65 72 50 6f 72 74 5b 30 5d 3d 3d 30 20 7c 7c 20  erPort[0]==0 || 
3d00: 73 74 72 63 6d 70 28 7a 53 65 72 76 65 72 50 6f  strcmp(zServerPo
3d10: 72 74 2c 22 38 30 22 29 3d 3d 30 20 29 7b 0a 20  rt,"80")==0 ){. 
3d20: 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74     nOut += print
3d30: 66 28 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73 3a  f("Location: %s:
3d40: 2f 2f 25 73 25 73 25 73 5c 72 5c 6e 22 2c 0a 20  //%s%s%s\r\n",. 
3d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d60: 20 20 7a 48 74 74 70 2c 20 7a 53 65 72 76 65 72    zHttp, zServer
3d70: 4e 61 6d 65 2c 20 7a 50 61 74 68 2c 20 7a 51 75  Name, zPath, zQu
3d80: 65 72 79 53 75 66 66 69 78 29 3b 0a 20 20 7d 65  erySuffix);.  }e
3d90: 6c 73 65 7b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d  lse{.    nOut +=
3da0: 20 70 72 69 6e 74 66 28 22 4c 6f 63 61 74 69 6f   printf("Locatio
3db0: 6e 3a 20 25 73 3a 2f 2f 25 73 3a 25 73 25 73 25  n: %s://%s:%s%s%
3dc0: 73 5c 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  s\r\n",.        
3dd0: 20 20 20 20 20 20 20 20 20 20 20 7a 48 74 74 70             zHttp
3de0: 2c 20 7a 53 65 72 76 65 72 4e 61 6d 65 2c 20 7a  , zServerName, z
3df0: 53 65 72 76 65 72 50 6f 72 74 2c 20 7a 50 61 74  ServerPort, zPat
3e00: 68 2c 20 7a 51 75 65 72 79 53 75 66 66 69 78 29  h, zQuerySuffix)
3e10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 69 6e 69  ;.  }.  if( fini
3e20: 73 68 20 29 7b 0a 20 20 20 20 6e 4f 75 74 20 2b  sh ){.    nOut +
3e30: 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 74 65 6e  = printf("Conten
3e40: 74 2d 6c 65 6e 67 74 68 3a 20 30 5c 72 5c 6e 22  t-length: 0\r\n"
3e50: 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70  );.    nOut += p
3e60: 72 69 6e 74 66 28 22 5c 72 5c 6e 22 29 3b 0a 20  rintf("\r\n");. 
3e70: 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28     MakeLogEntry(
3e80: 30 29 3b 0a 20 20 7d 0a 20 20 66 66 6c 75 73 68  0);.  }.  fflush
3e90: 28 73 74 64 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a  (stdout);.}../*.
3ea0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
3eb0: 20 74 72 65 61 74 73 20 69 74 73 20 69 6e 70 75   treats its inpu
3ec0: 74 20 61 73 20 61 20 62 61 73 65 2d 36 34 20 73  t as a base-64 s
3ed0: 74 72 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  tring and return
3ee0: 73 20 74 68 65 0a 2a 2a 20 64 65 63 6f 64 65 64  s the.** decoded
3ef0: 20 76 61 6c 75 65 20 6f 66 20 74 68 61 74 20 73   value of that s
3f00: 74 72 69 6e 67 2e 20 20 43 68 61 72 61 63 74 65  tring.  Characte
3f10: 72 73 20 6f 66 20 69 6e 70 75 74 20 74 68 61 74  rs of input that
3f20: 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 76 61 6c 69   are not.** vali
3f30: 64 20 62 61 73 65 2d 36 34 20 63 68 61 72 61 63  d base-64 charac
3f40: 74 65 72 73 20 28 73 75 63 68 20 61 73 20 73 70  ters (such as sp
3f50: 61 63 65 73 20 61 6e 64 20 6e 65 77 6c 69 6e 65  aces and newline
3f60: 73 29 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a  s) are ignored..
3f70: 2a 2f 0a 76 6f 69 64 20 44 65 63 6f 64 65 36 34  */.void Decode64
3f80: 28 63 68 61 72 20 2a 7a 36 34 29 7b 0a 20 20 63  (char *z64){.  c
3f90: 68 61 72 20 2a 7a 44 61 74 61 3b 0a 20 20 69 6e  har *zData;.  in
3fa0: 74 20 6e 36 34 3b 0a 20 20 69 6e 74 20 69 2c 20  t n64;.  int i, 
3fb0: 6a 3b 0a 20 20 69 6e 74 20 61 2c 20 62 2c 20 63  j;.  int a, b, c
3fc0: 2c 20 64 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  , d;.  static in
3fd0: 74 20 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  t isInit = 0;.  
3fe0: 73 74 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73  static int trans
3ff0: 5b 31 32 38 5d 3b 0a 20 20 73 74 61 74 69 63 20  [128];.  static 
4000: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 42  unsigned char zB
4010: 61 73 65 5b 5d 20 3d 20 0a 20 20 20 20 22 41 42  ase[] = .    "AB
4020: 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
4030: 53 54 55 56 57 58 59 5a 61 62 63 64 65 66 67 68  STUVWXYZabcdefgh
4040: 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
4050: 79 7a 30 31 32 33 34 35 36 37 38 39 2b 2f 22 3b  yz0123456789+/";
4060: 0a 0a 20 20 69 66 28 20 21 69 73 49 6e 69 74 20  ..  if( !isInit 
4070: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
4080: 69 3c 31 32 38 3b 20 69 2b 2b 29 7b 20 74 72 61  i<128; i++){ tra
4090: 6e 73 5b 69 5d 20 3d 20 30 3b 20 7d 0a 20 20 20  ns[i] = 0; }.   
40a0: 20 66 6f 72 28 69 3d 30 3b 20 7a 42 61 73 65 5b   for(i=0; zBase[
40b0: 69 5d 3b 20 69 2b 2b 29 7b 20 74 72 61 6e 73 5b  i]; i++){ trans[
40c0: 7a 42 61 73 65 5b 69 5d 20 26 20 30 78 37 66 5d  zBase[i] & 0x7f]
40d0: 20 3d 20 69 3b 20 7d 0a 20 20 20 20 69 73 49 6e   = i; }.    isIn
40e0: 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 6e 36  it = 1;.  }.  n6
40f0: 34 20 3d 20 73 74 72 6c 65 6e 28 7a 36 34 29 3b  4 = strlen(z64);
4100: 0a 20 20 77 68 69 6c 65 28 20 6e 36 34 3e 30 20  .  while( n64>0 
4110: 26 26 20 7a 36 34 5b 6e 36 34 2d 31 5d 3d 3d 27  && z64[n64-1]=='
4120: 3d 27 20 29 20 6e 36 34 2d 2d 3b 0a 20 20 7a 44  =' ) n64--;.  zD
4130: 61 74 61 20 3d 20 7a 36 34 3b 0a 20 20 66 6f 72  ata = z64;.  for
4140: 28 69 3d 6a 3d 30 3b 20 69 2b 33 3c 6e 36 34 3b  (i=j=0; i+3<n64;
4150: 20 69 2b 3d 34 29 7b 0a 20 20 20 20 61 20 3d 20   i+=4){.    a = 
4160: 74 72 61 6e 73 5b 7a 36 34 5b 69 5d 20 26 20 30  trans[z64[i] & 0
4170: 78 37 66 5d 3b 0a 20 20 20 20 62 20 3d 20 74 72  x7f];.    b = tr
4180: 61 6e 73 5b 7a 36 34 5b 69 2b 31 5d 20 26 20 30  ans[z64[i+1] & 0
4190: 78 37 66 5d 3b 0a 20 20 20 20 63 20 3d 20 74 72  x7f];.    c = tr
41a0: 61 6e 73 5b 7a 36 34 5b 69 2b 32 5d 20 26 20 30  ans[z64[i+2] & 0
41b0: 78 37 66 5d 3b 0a 20 20 20 20 64 20 3d 20 74 72  x7f];.    d = tr
41c0: 61 6e 73 5b 7a 36 34 5b 69 2b 33 5d 20 26 20 30  ans[z64[i+3] & 0
41d0: 78 37 66 5d 3b 0a 20 20 20 20 7a 44 61 74 61 5b  x7f];.    zData[
41e0: 6a 2b 2b 5d 20 3d 20 28 28 61 3c 3c 32 29 20 26  j++] = ((a<<2) &
41f0: 20 30 78 66 63 29 20 7c 20 28 28 62 3e 3e 34 29   0xfc) | ((b>>4)
4200: 20 26 20 30 78 30 33 29 3b 0a 20 20 20 20 7a 44   & 0x03);.    zD
4210: 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28 62 3c 3c  ata[j++] = ((b<<
4220: 34 29 20 26 20 30 78 66 30 29 20 7c 20 28 28 63  4) & 0xf0) | ((c
4230: 3e 3e 32 29 20 26 20 30 78 30 66 29 3b 0a 20 20  >>2) & 0x0f);.  
4240: 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28    zData[j++] = (
4250: 28 63 3c 3c 36 29 20 26 20 30 78 63 30 29 20 7c  (c<<6) & 0xc0) |
4260: 20 28 64 20 26 20 30 78 33 66 29 3b 0a 20 20 7d   (d & 0x3f);.  }
4270: 0a 20 20 69 66 28 20 69 2b 32 3c 6e 36 34 20 29  .  if( i+2<n64 )
4280: 7b 0a 20 20 20 20 61 20 3d 20 74 72 61 6e 73 5b  {.    a = trans[
4290: 7a 36 34 5b 69 5d 20 26 20 30 78 37 66 5d 3b 0a  z64[i] & 0x7f];.
42a0: 20 20 20 20 62 20 3d 20 74 72 61 6e 73 5b 7a 36      b = trans[z6
42b0: 34 5b 69 2b 31 5d 20 26 20 30 78 37 66 5d 3b 0a  4[i+1] & 0x7f];.
42c0: 20 20 20 20 63 20 3d 20 74 72 61 6e 73 5b 7a 36      c = trans[z6
42d0: 34 5b 69 2b 32 5d 20 26 20 30 78 37 66 5d 3b 0a  4[i+2] & 0x7f];.
42e0: 20 20 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d      zData[j++] =
42f0: 20 28 28 61 3c 3c 32 29 20 26 20 30 78 66 63 29   ((a<<2) & 0xfc)
4300: 20 7c 20 28 28 62 3e 3e 34 29 20 26 20 30 78 30   | ((b>>4) & 0x0
4310: 33 29 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b  3);.    zData[j+
4320: 2b 5d 20 3d 20 28 28 62 3c 3c 34 29 20 26 20 30  +] = ((b<<4) & 0
4330: 78 66 30 29 20 7c 20 28 28 63 3e 3e 32 29 20 26  xf0) | ((c>>2) &
4340: 20 30 78 30 66 29 3b 0a 20 20 7d 65 6c 73 65 20   0x0f);.  }else 
4350: 69 66 28 20 69 2b 31 3c 6e 36 34 20 29 7b 0a 20  if( i+1<n64 ){. 
4360: 20 20 20 61 20 3d 20 74 72 61 6e 73 5b 7a 36 34     a = trans[z64
4370: 5b 69 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20 20  [i] & 0x7f];.   
4380: 20 62 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69   b = trans[z64[i
4390: 2b 31 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20 20  +1] & 0x7f];.   
43a0: 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28   zData[j++] = ((
43b0: 61 3c 3c 32 29 20 26 20 30 78 66 63 29 20 7c 20  a<<2) & 0xfc) | 
43c0: 28 28 62 3e 3e 34 29 20 26 20 30 78 30 33 29 3b  ((b>>4) & 0x03);
43d0: 0a 20 20 7d 0a 20 20 7a 44 61 74 61 5b 6a 5d 20  .  }.  zData[j] 
43e0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  = 0;.}../*.** Ch
43f0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 62 61  eck to see if ba
4400: 73 69 63 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  sic authorizatio
4410: 6e 20 63 72 65 64 65 6e 74 69 61 6c 73 20 61 72  n credentials ar
4420: 65 20 70 72 6f 76 69 64 65 64 20 66 6f 72 0a 2a  e provided for.*
4430: 2a 20 74 68 65 20 75 73 65 72 20 61 63 63 6f 72  * the user accor
4440: 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 66 6f  ding to the info
4450: 72 6d 61 74 69 6f 6e 20 69 6e 20 7a 41 75 74 68  rmation in zAuth
4460: 46 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 72  File.  Return tr
4470: 75 65 0a 2a 2a 20 69 66 20 61 75 74 68 6f 72 69  ue.** if authori
4480: 7a 65 64 2e 20 20 52 65 74 75 72 6e 20 66 61 6c  zed.  Return fal
4490: 73 65 20 69 66 20 6e 6f 74 20 61 75 74 68 6f 72  se if not author
44a0: 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 69 6c 65  ized..**.** File
44b0: 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20   format:.**.**  
44c0: 20 20 2a 20 20 42 6c 61 6e 6b 20 6c 69 6e 65 73    *  Blank lines
44d0: 20 61 6e 64 20 6c 69 6e 65 73 20 74 68 61 74 20   and lines that 
44e0: 62 65 67 69 6e 20 77 69 74 68 20 27 23 27 20 61  begin with '#' a
44f0: 72 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 20 20  re ignored.**   
4500: 20 2a 20 20 22 68 74 74 70 2d 72 65 64 69 72 65   *  "http-redire
4510: 63 74 22 20 66 6f 72 63 65 73 20 61 20 72 65 64  ct" forces a red
4520: 69 72 65 63 74 20 74 6f 20 48 54 54 50 53 20 69  irect to HTTPS i
4530: 66 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  f not there alre
4540: 61 64 79 0a 2a 2a 20 20 20 20 2a 20 20 22 68 74  ady.**    *  "ht
4550: 74 70 73 2d 6f 6e 6c 79 22 20 64 69 73 61 6c 6c  tps-only" disall
4560: 6f 77 73 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e  ows operation in
4570: 20 48 54 54 50 0a 2a 2a 20 20 20 20 2a 20 20 22   HTTP.**    *  "
4580: 75 73 65 72 20 4e 41 4d 45 20 4c 4f 47 49 4e 3a  user NAME LOGIN:
4590: 50 41 53 53 57 4f 52 44 22 20 63 68 65 63 6b 73  PASSWORD" checks
45a0: 20 74 6f 20 73 65 65 20 69 66 20 4c 4f 47 49 4e   to see if LOGIN
45b0: 3a 50 41 53 53 57 4f 52 44 20 0a 2a 2a 20 20 20  :PASSWORD .**   
45c0: 20 20 20 20 61 75 74 68 6f 72 69 7a 61 74 69 6f      authorizatio
45d0: 6e 20 63 72 65 64 65 6e 74 69 61 6c 73 20 61 72  n credentials ar
45e0: 65 20 70 72 6f 76 69 64 65 64 2c 20 61 6e 64 20  e provided, and 
45f0: 69 66 20 73 6f 20 73 65 74 73 20 74 68 65 0a 2a  if so sets the.*
4600: 2a 20 20 20 20 20 20 20 52 45 4d 4f 54 45 5f 55  *       REMOTE_U
4610: 53 45 52 20 74 6f 20 4e 41 4d 45 2e 0a 2a 2a 20  SER to NAME..** 
4620: 20 20 20 2a 20 20 22 72 65 61 6c 6d 20 54 45 58     *  "realm TEX
4630: 54 22 20 73 65 74 73 20 74 68 65 20 72 65 61 6c  T" sets the real
4640: 6d 20 74 6f 20 54 45 58 54 2e 0a 2a 2f 0a 73 74  m to TEXT..*/.st
4650: 61 74 69 63 20 69 6e 74 20 43 68 65 63 6b 42 61  atic int CheckBa
4660: 73 69 63 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e  sicAuthorization
4670: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 75  (const char *zAu
4680: 74 68 46 69 6c 65 29 7b 0a 20 20 46 49 4c 45 20  thFile){.  FILE 
4690: 2a 69 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65  *in;.  char *zRe
46a0: 61 6c 6d 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 72  alm = "unknown r
46b0: 65 61 6c 6d 22 3b 0a 20 20 63 68 61 72 20 2a 7a  ealm";.  char *z
46c0: 4c 6f 67 69 6e 50 73 77 64 3b 0a 20 20 63 68 61  LoginPswd;.  cha
46d0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63 68 61 72  r *zName;.  char
46e0: 20 7a 4c 69 6e 65 5b 32 30 30 30 5d 3b 0a 0a 20   zLine[2000];.. 
46f0: 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 41 75 74   in = fopen(zAut
4700: 68 46 69 6c 65 2c 20 22 72 22 29 3b 0a 20 20 69  hFile, "r");.  i
4710: 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  f( in==0 ){.    
4720: 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f  NotFound(__LINE_
4730: 5f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  _);.    return 0
4740: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 41 75 74  ;.  }.  if( zAut
4750: 68 41 72 67 20 29 20 44 65 63 6f 64 65 36 34 28  hArg ) Decode64(
4760: 7a 41 75 74 68 41 72 67 29 3b 0a 20 20 77 68 69  zAuthArg);.  whi
4770: 6c 65 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c  le( fgets(zLine,
4780: 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20   sizeof(zLine), 
4790: 69 6e 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20  in) ){.    char 
47a0: 2a 7a 46 69 65 6c 64 4e 61 6d 65 3b 0a 20 20 20  *zFieldName;.   
47b0: 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 0a 20 20   char *zVal;..  
47c0: 20 20 7a 46 69 65 6c 64 4e 61 6d 65 20 3d 20 47    zFieldName = G
47d0: 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a  etFirstElement(z
47e0: 4c 69 6e 65 2c 26 7a 56 61 6c 29 3b 0a 20 20 20  Line,&zVal);.   
47f0: 20 69 66 28 20 7a 46 69 65 6c 64 4e 61 6d 65 3d   if( zFieldName=
4800: 3d 30 20 7c 7c 20 2a 7a 46 69 65 6c 64 4e 61 6d  =0 || *zFieldNam
4810: 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  e==0 ) continue;
4820: 0a 20 20 20 20 69 66 28 20 7a 46 69 65 6c 64 4e  .    if( zFieldN
4830: 61 6d 65 5b 30 5d 3d 3d 27 23 27 20 29 20 63 6f  ame[0]=='#' ) co
4840: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 52 65 6d 6f  ntinue;.    Remo
4850: 76 65 4e 65 77 6c 69 6e 65 28 7a 56 61 6c 29 3b  veNewline(zVal);
4860: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
4870: 7a 46 69 65 6c 64 4e 61 6d 65 2c 20 22 72 65 61  zFieldName, "rea
4880: 6c 6d 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lm")==0 ){.     
4890: 20 7a 52 65 61 6c 6d 20 3d 20 53 74 72 44 75 70   zRealm = StrDup
48a0: 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  (zVal);.    }els
48b0: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69  e if( strcmp(zFi
48c0: 65 6c 64 4e 61 6d 65 2c 22 75 73 65 72 22 29 3d  eldName,"user")=
48d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
48e0: 7a 41 75 74 68 41 72 67 3d 3d 30 20 29 20 63 6f  zAuthArg==0 ) co
48f0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7a 4e  ntinue;.      zN
4900: 61 6d 65 20 3d 20 47 65 74 46 69 72 73 74 45 6c  ame = GetFirstEl
4910: 65 6d 65 6e 74 28 7a 56 61 6c 2c 20 26 7a 56 61  ement(zVal, &zVa
4920: 6c 29 3b 0a 20 20 20 20 20 20 7a 4c 6f 67 69 6e  l);.      zLogin
4930: 50 73 77 64 20 3d 20 47 65 74 46 69 72 73 74 45  Pswd = GetFirstE
4940: 6c 65 6d 65 6e 74 28 7a 56 61 6c 2c 20 26 7a 56  lement(zVal, &zV
4950: 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  al);.      if( z
4960: 4c 6f 67 69 6e 50 73 77 64 3d 3d 30 20 29 20 63  LoginPswd==0 ) c
4970: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
4980: 66 28 20 7a 41 75 74 68 41 72 67 20 26 26 20 73  f( zAuthArg && s
4990: 74 72 63 6d 70 28 7a 41 75 74 68 41 72 67 2c 7a  trcmp(zAuthArg,z
49a0: 4c 6f 67 69 6e 50 73 77 64 29 3d 3d 30 20 29 7b  LoginPswd)==0 ){
49b0: 0a 20 20 20 20 20 20 20 20 7a 52 65 6d 6f 74 65  .        zRemote
49c0: 55 73 65 72 20 3d 20 53 74 72 44 75 70 28 7a 4e  User = StrDup(zN
49d0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 66 63  ame);.        fc
49e0: 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20  lose(in);.      
49f0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
4a00: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
4a10: 28 20 73 74 72 63 6d 70 28 7a 46 69 65 6c 64 4e  ( strcmp(zFieldN
4a20: 61 6d 65 2c 22 68 74 74 70 73 2d 6f 6e 6c 79 22  ame,"https-only"
4a30: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
4a40: 28 20 21 75 73 65 48 74 74 70 73 20 29 7b 0a 20  ( !useHttps ){. 
4a50: 20 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28         NotFound(
4a60: 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
4a70: 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
4a80: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
4a90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
4aa0: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46  se if( strcmp(zF
4ab0: 69 65 6c 64 4e 61 6d 65 2c 22 68 74 74 70 2d 72  ieldName,"http-r
4ac0: 65 64 69 72 65 63 74 22 29 3d 3d 30 20 29 7b 0a  edirect")==0 ){.
4ad0: 20 20 20 20 20 20 69 66 28 20 21 75 73 65 48 74        if( !useHt
4ae0: 74 70 73 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  tps ){.        z
4af0: 48 74 74 70 20 3d 20 22 68 74 74 70 73 22 3b 0a  Http = "https";.
4b00: 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28          sprintf(
4b10: 7a 4c 69 6e 65 2c 20 22 25 73 25 73 22 2c 20 7a  zLine, "%s%s", z
4b20: 53 63 72 69 70 74 2c 20 7a 50 61 74 68 49 6e 66  Script, zPathInf
4b30: 6f 29 3b 0a 20 20 20 20 20 20 20 20 52 65 64 69  o);.        Redi
4b40: 72 65 63 74 28 7a 4c 69 6e 65 2c 20 31 29 3b 0a  rect(zLine, 1);.
4b50: 20 20 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69          fclose(i
4b60: 6e 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  n);.        retu
4b70: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
4b80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4e    }else{.      N
4b90: 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f  otFound(__LINE__
4ba0: 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28  );.      fclose(
4bb0: 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  in);.      retur
4bc0: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 0;.    }.  }. 
4bd0: 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 4e   fclose(in);.  N
4be0: 6f 74 41 75 74 68 6f 72 69 7a 65 64 28 7a 52 65  otAuthorized(zRe
4bf0: 61 6c 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  alm);.  return 0
4c00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 75 65 73 73  ;.}../*.** Guess
4c10: 20 74 68 65 20 6d 69 6d 65 2d 74 79 70 65 20 6f   the mime-type o
4c20: 66 20 61 20 64 6f 63 75 6d 65 6e 74 20 62 61 73  f a document bas
4c30: 65 64 20 6f 6e 20 69 74 73 20 6e 61 6d 65 2e 0a  ed on its name..
4c40: 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 47  */.const char *G
4c50: 65 74 4d 69 6d 65 54 79 70 65 28 63 6f 6e 73 74  etMimeType(const
4c60: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e   char *zName, in
4c70: 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 63 6f 6e 73  t nName){.  cons
4c80: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74  t char *z;.  int
4c90: 20 69 3b 0a 20 20 69 6e 74 20 66 69 72 73 74 2c   i;.  int first,
4ca0: 20 6c 61 73 74 3b 0a 20 20 69 6e 74 20 6c 65 6e   last;.  int len
4cb0: 3b 0a 20 20 63 68 61 72 20 7a 53 75 66 66 69 78  ;.  char zSuffix
4cc0: 5b 32 30 5d 3b 0a 0a 20 20 2f 2a 20 41 20 74 61  [20];..  /* A ta
4cd0: 62 6c 65 20 6f 66 20 6d 69 6d 65 74 79 70 65 73  ble of mimetypes
4ce0: 20 62 61 73 65 64 20 6f 6e 20 66 69 6c 65 20 73   based on file s
4cf0: 75 66 66 69 78 65 73 2e 20 0a 20 20 2a 2a 20 53  uffixes. .  ** S
4d00: 75 66 66 69 78 65 73 20 6d 75 73 74 20 62 65 20  uffixes must be 
4d10: 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20  in sorted order 
4d20: 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 64  so that we can d
4d30: 6f 20 61 20 62 69 6e 61 72 79 0a 20 20 2a 2a 20  o a binary.  ** 
4d40: 73 65 61 72 63 68 20 74 6f 20 66 69 6e 64 20 74  search to find t
4d50: 68 65 20 6d 69 6d 65 2d 74 79 70 65 0a 20 20 2a  he mime-type.  *
4d60: 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  /.  static const
4d70: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f   struct {.    co
4d80: 6e 73 74 20 63 68 61 72 20 2a 7a 53 75 66 66 69  nst char *zSuffi
4d90: 78 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  x;       /* The 
4da0: 66 69 6c 65 20 73 75 66 66 69 78 20 2a 2f 0a 20  file suffix */. 
4db0: 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20     int size;    
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4dd0: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73   Length of the s
4de0: 75 66 66 69 78 20 2a 2f 0a 20 20 20 20 63 6f 6e  uffix */.    con
4df0: 73 74 20 63 68 61 72 20 2a 7a 4d 69 6d 65 74 79  st char *zMimety
4e00: 70 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 63  pe;     /* The c
4e10: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 6d 69 6d  orresponding mim
4e20: 65 74 79 70 65 20 2a 2f 0a 20 20 7d 20 61 4d 69  etype */.  } aMi
4e30: 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  me[] = {.    { "
4e40: 61 69 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  ai",         2, 
4e50: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 6f 73  "application/pos
4e60: 74 73 63 72 69 70 74 22 20 20 20 20 20 20 20 20  tscript"        
4e70: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 69      },.    { "ai
4e80: 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  f",        3, "a
4e90: 75 64 69 6f 2f 78 2d 61 69 66 66 22 20 20 20 20  udio/x-aiff"    
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4eb0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 69 66 63    },.    { "aifc
4ec0: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 75 64  ",       4, "aud
4ed0: 69 6f 2f 78 2d 61 69 66 66 22 20 20 20 20 20 20  io/x-aiff"      
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ef0: 7d 2c 0a 20 20 20 20 7b 20 22 61 69 66 66 22 2c  },.    { "aiff",
4f00: 20 20 20 20 20 20 20 34 2c 20 22 61 75 64 69 6f         4, "audio
4f10: 2f 78 2d 61 69 66 66 22 20 20 20 20 20 20 20 20  /x-aiff"        
4f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
4f30: 0a 20 20 20 20 7b 20 22 61 72 6a 22 2c 20 20 20  .    { "arj",   
4f40: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
4f50: 74 69 6f 6e 2f 78 2d 61 72 6a 2d 63 6f 6d 70 72  tion/x-arj-compr
4f60: 65 73 73 65 64 22 20 20 20 20 20 20 7d 2c 0a 20  essed"      },. 
4f70: 20 20 20 7b 20 22 61 73 63 22 2c 20 20 20 20 20     { "asc",     
4f80: 20 20 20 33 2c 20 22 74 65 78 74 2f 70 6c 61 69     3, "text/plai
4f90: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
4fa0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
4fb0: 20 7b 20 22 61 73 66 22 2c 20 20 20 20 20 20 20   { "asf",       
4fc0: 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d   3, "video/x-ms-
4fd0: 61 73 66 22 20 20 20 20 20 20 20 20 20 20 20 20  asf"            
4fe0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
4ff0: 20 22 61 73 78 22 2c 20 20 20 20 20 20 20 20 33   "asx",        3
5000: 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 61 73  , "video/x-ms-as
5010: 78 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x"              
5020: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5030: 61 75 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  au",         2, 
5040: 22 61 75 64 69 6f 2f 75 6c 61 77 22 20 20 20 20  "audio/ulaw"    
5050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5060: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 76      },.    { "av
5070: 69 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76  i",        3, "v
5080: 69 64 65 6f 2f 78 2d 6d 73 76 69 64 65 6f 22 20  ideo/x-msvideo" 
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50a0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 62 61 74 22    },.    { "bat"
50b0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
50c0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 6d 73 64 6f 73  lication/x-msdos
50d0: 2d 70 72 6f 67 72 61 6d 22 20 20 20 20 20 20 20  -program"       
50e0: 7d 2c 0a 20 20 20 20 7b 20 22 62 63 70 69 6f 22  },.    { "bcpio"
50f0: 2c 20 20 20 20 20 20 35 2c 20 22 61 70 70 6c 69  ,      5, "appli
5100: 63 61 74 69 6f 6e 2f 78 2d 62 63 70 69 6f 22 20  cation/x-bcpio" 
5110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
5120: 0a 20 20 20 20 7b 20 22 62 69 6e 22 2c 20 20 20  .    { "bin",   
5130: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
5140: 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61  tion/octet-strea
5150: 6d 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  m"          },. 
5160: 20 20 20 7b 20 22 63 22 2c 20 20 20 20 20 20 20     { "c",       
5170: 20 20 20 31 2c 20 22 74 65 78 74 2f 70 6c 61 69     1, "text/plai
5180: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
5190: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
51a0: 20 7b 20 22 63 63 22 2c 20 20 20 20 20 20 20 20   { "cc",        
51b0: 20 32 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22   2, "text/plain"
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51d0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
51e0: 20 22 63 63 61 64 22 2c 20 20 20 20 20 20 20 34   "ccad",       4
51f0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 63  , "application/c
5200: 6c 61 72 69 73 63 61 64 22 20 20 20 20 20 20 20  lariscad"       
5210: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5220: 63 64 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20  cdf",        3, 
5230: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6e  "application/x-n
5240: 65 74 63 64 66 22 20 20 20 20 20 20 20 20 20 20  etcdf"          
5250: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6c      },.    { "cl
5260: 61 73 73 22 2c 20 20 20 20 20 20 35 2c 20 22 61  ass",      5, "a
5270: 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74  pplication/octet
5280: 2d 73 74 72 65 61 6d 22 20 20 20 20 20 20 20 20  -stream"        
5290: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 64 22    },.    { "cod"
52a0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
52b0: 6c 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 72 69 6d  lication/vnd.rim
52c0: 2e 63 6f 64 22 20 20 20 20 20 20 20 20 20 20 20  .cod"           
52d0: 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 6d 22 2c 20  },.    { "com", 
52e0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
52f0: 63 61 74 69 6f 6e 2f 78 2d 6d 73 64 6f 73 2d 70  cation/x-msdos-p
5300: 72 6f 67 72 61 6d 22 20 20 20 20 20 20 20 7d 2c  rogram"       },
5310: 0a 20 20 20 20 7b 20 22 63 70 69 6f 22 2c 20 20  .    { "cpio",  
5320: 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61       4, "applica
5330: 74 69 6f 6e 2f 78 2d 63 70 69 6f 22 20 20 20 20  tion/x-cpio"    
5340: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5350: 20 20 20 7b 20 22 63 70 74 22 2c 20 20 20 20 20     { "cpt",     
5360: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
5370: 6f 6e 2f 6d 61 63 2d 63 6f 6d 70 61 63 74 70 72  on/mac-compactpr
5380: 6f 22 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  o"        },.   
5390: 20 7b 20 22 63 73 68 22 2c 20 20 20 20 20 20 20   { "csh",       
53a0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
53b0: 2f 78 2d 63 73 68 22 20 20 20 20 20 20 20 20 20  /x-csh"         
53c0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
53d0: 20 22 63 73 73 22 2c 20 20 20 20 20 20 20 20 33   "css",        3
53e0: 2c 20 22 74 65 78 74 2f 63 73 73 22 20 20 20 20  , "text/css"    
53f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5400: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5410: 64 63 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20  dcr",        3, 
5420: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 64  "application/x-d
5430: 69 72 65 63 74 6f 72 22 20 20 20 20 20 20 20 20  irector"        
5440: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 65      },.    { "de
5450: 62 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  b",        3, "a
5460: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 64 65 62  pplication/x-deb
5470: 69 61 6e 2d 70 61 63 6b 61 67 65 22 20 20 20 20  ian-package"    
5480: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 69 72 22    },.    { "dir"
5490: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
54a0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 64 69 72 65 63  lication/x-direc
54b0: 74 6f 72 22 20 20 20 20 20 20 20 20 20 20 20 20  tor"            
54c0: 7d 2c 0a 20 20 20 20 7b 20 22 64 6c 22 2c 20 20  },.    { "dl",  
54d0: 20 20 20 20 20 20 20 32 2c 20 22 76 69 64 65 6f         2, "video
54e0: 2f 64 6c 22 20 20 20 20 20 20 20 20 20 20 20 20  /dl"            
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
5500: 0a 20 20 20 20 7b 20 22 64 6d 73 22 2c 20 20 20  .    { "dms",   
5510: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
5520: 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61  tion/octet-strea
5530: 6d 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  m"          },. 
5540: 20 20 20 7b 20 22 64 6f 63 22 2c 20 20 20 20 20     { "doc",     
5550: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
5560: 6f 6e 2f 6d 73 77 6f 72 64 22 20 20 20 20 20 20  on/msword"      
5570: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5580: 20 7b 20 22 64 72 77 22 2c 20 20 20 20 20 20 20   { "drw",       
5590: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
55a0: 2f 64 72 61 66 74 69 6e 67 22 20 20 20 20 20 20  /drafting"      
55b0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
55c0: 20 22 64 76 69 22 2c 20 20 20 20 20 20 20 20 33   "dvi",        3
55d0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
55e0: 2d 64 76 69 22 20 20 20 20 20 20 20 20 20 20 20  -dvi"           
55f0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5600: 64 77 67 22 2c 20 20 20 20 20 20 20 20 33 2c 20  dwg",        3, 
5610: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 61 63 61  "application/aca
5620: 64 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d"              
5630: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 78      },.    { "dx
5640: 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  f",        3, "a
5650: 70 70 6c 69 63 61 74 69 6f 6e 2f 64 78 66 22 20  pplication/dxf" 
5660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5670: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 78 72 22    },.    { "dxr"
5680: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
5690: 6c 69 63 61 74 69 6f 6e 2f 78 2d 64 69 72 65 63  lication/x-direc
56a0: 74 6f 72 22 20 20 20 20 20 20 20 20 20 20 20 20  tor"            
56b0: 7d 2c 0a 20 20 20 20 7b 20 22 65 70 73 22 2c 20  },.    { "eps", 
56c0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
56d0: 63 61 74 69 6f 6e 2f 70 6f 73 74 73 63 72 69 70  cation/postscrip
56e0: 74 22 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  t"            },
56f0: 0a 20 20 20 20 7b 20 22 65 74 78 22 2c 20 20 20  .    { "etx",   
5700: 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 78 2d       3, "text/x-
5710: 73 65 74 65 78 74 22 20 20 20 20 20 20 20 20 20  setext"         
5720: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5730: 20 20 20 7b 20 22 65 78 65 22 2c 20 20 20 20 20     { "exe",     
5740: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
5750: 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22  on/octet-stream"
5760: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5770: 20 7b 20 22 65 7a 22 2c 20 20 20 20 20 20 20 20   { "ez",        
5780: 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   2, "application
5790: 2f 61 6e 64 72 65 77 2d 69 6e 73 65 74 22 20 20  /andrew-inset"  
57a0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
57b0: 20 22 66 22 2c 20 20 20 20 20 20 20 20 20 20 31   "f",          1
57c0: 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20  , "text/plain"  
57d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57e0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
57f0: 66 39 30 22 2c 20 20 20 20 20 20 20 20 33 2c 20  f90",        3, 
5800: 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20  "text/plain"    
5810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5820: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66 6c      },.    { "fl
5830: 69 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76  i",        3, "v
5840: 69 64 65 6f 2f 66 6c 69 22 20 20 20 20 20 20 20  ideo/fli"       
5850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5860: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66 6c 76 22    },.    { "flv"
5870: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64  ,        3, "vid
5880: 65 6f 2f 66 6c 76 22 20 20 20 20 20 20 20 20 20  eo/flv"         
5890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58a0: 7d 2c 0a 20 20 20 20 7b 20 22 67 69 66 22 2c 20  },.    { "gif", 
58b0: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
58c0: 2f 67 69 66 22 20 20 20 20 20 20 20 20 20 20 20  /gif"           
58d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
58e0: 0a 20 20 20 20 7b 20 22 67 6c 22 2c 20 20 20 20  .    { "gl",    
58f0: 20 20 20 20 20 32 2c 20 22 76 69 64 65 6f 2f 67       2, "video/g
5900: 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l"              
5910: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5920: 20 20 20 7b 20 22 67 74 61 72 22 2c 20 20 20 20     { "gtar",    
5930: 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69     4, "applicati
5940: 6f 6e 2f 78 2d 67 74 61 72 22 20 20 20 20 20 20  on/x-gtar"      
5950: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5960: 20 7b 20 22 67 7a 22 2c 20 20 20 20 20 20 20 20   { "gz",        
5970: 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   2, "application
5980: 2f 78 2d 67 7a 69 70 22 20 20 20 20 20 20 20 20  /x-gzip"        
5990: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
59a0: 20 22 68 64 66 22 2c 20 20 20 20 20 20 20 20 33   "hdf",        3
59b0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
59c0: 2d 68 64 66 22 20 20 20 20 20 20 20 20 20 20 20  -hdf"           
59d0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
59e0: 68 68 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  hh",         2, 
59f0: 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20  "text/plain"    
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a10: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68 71      },.    { "hq
5a20: 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  x",        3, "a
5a30: 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 61 63 2d 62  pplication/mac-b
5a40: 69 6e 68 65 78 34 30 22 20 20 20 20 20 20 20 20  inhex40"        
5a50: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68 22 2c 20    },.    { "h", 
5a60: 20 20 20 20 20 20 20 20 20 31 2c 20 22 74 65 78           1, "tex
5a70: 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20  t/plain"        
5a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a90: 7d 2c 0a 20 20 20 20 7b 20 22 68 74 6d 22 2c 20  },.    { "htm", 
5aa0: 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f         3, "text/
5ab0: 68 74 6d 6c 3b 20 63 68 61 72 73 65 74 3d 75 74  html; charset=ut
5ac0: 66 2d 38 22 20 20 20 20 20 20 20 20 20 20 7d 2c  f-8"          },
5ad0: 0a 20 20 20 20 7b 20 22 68 74 6d 6c 22 2c 20 20  .    { "html",  
5ae0: 20 20 20 20 20 34 2c 20 22 74 65 78 74 2f 68 74       4, "text/ht
5af0: 6d 6c 3b 20 63 68 61 72 73 65 74 3d 75 74 66 2d  ml; charset=utf-
5b00: 38 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  8"          },. 
5b10: 20 20 20 7b 20 22 69 63 65 22 2c 20 20 20 20 20     { "ice",     
5b20: 20 20 20 33 2c 20 22 78 2d 63 6f 6e 66 65 72 65     3, "x-confere
5b30: 6e 63 65 2f 78 2d 63 6f 6f 6c 74 61 6c 6b 22 20  nce/x-cooltalk" 
5b40: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5b50: 20 7b 20 22 69 65 66 22 2c 20 20 20 20 20 20 20   { "ief",       
5b60: 20 33 2c 20 22 69 6d 61 67 65 2f 69 65 66 22 20   3, "image/ief" 
5b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b80: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5b90: 20 22 69 67 65 73 22 2c 20 20 20 20 20 20 20 34   "iges",       4
5ba0: 2c 20 22 6d 6f 64 65 6c 2f 69 67 65 73 22 20 20  , "model/iges"  
5bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bc0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5bd0: 69 67 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20  igs",        3, 
5be0: 22 6d 6f 64 65 6c 2f 69 67 65 73 22 20 20 20 20  "model/iges"    
5bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c00: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 70      },.    { "ip
5c10: 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  s",        3, "a
5c20: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 69 70 73  pplication/x-ips
5c30: 63 72 69 70 74 22 20 20 20 20 20 20 20 20 20 20  cript"          
5c40: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 70 78 22    },.    { "ipx"
5c50: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
5c60: 6c 69 63 61 74 69 6f 6e 2f 78 2d 69 70 69 78 22  lication/x-ipix"
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c80: 7d 2c 0a 20 20 20 20 7b 20 22 6a 61 64 22 2c 20  },.    { "jad", 
5c90: 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f         3, "text/
5ca0: 76 6e 64 2e 73 75 6e 2e 6a 32 6d 65 2e 61 70 70  vnd.sun.j2me.app
5cb0: 2d 64 65 73 63 72 69 70 74 6f 72 22 20 20 7d 2c  -descriptor"  },
5cc0: 0a 20 20 20 20 7b 20 22 6a 61 72 22 2c 20 20 20  .    { "jar",   
5cd0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
5ce0: 74 69 6f 6e 2f 6a 61 76 61 2d 61 72 63 68 69 76  tion/java-archiv
5cf0: 65 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  e"          },. 
5d00: 20 20 20 7b 20 22 6a 70 65 67 22 2c 20 20 20 20     { "jpeg",    
5d10: 20 20 20 34 2c 20 22 69 6d 61 67 65 2f 6a 70 65     4, "image/jpe
5d20: 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g"              
5d30: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5d40: 20 7b 20 22 6a 70 65 22 2c 20 20 20 20 20 20 20   { "jpe",       
5d50: 20 33 2c 20 22 69 6d 61 67 65 2f 6a 70 65 67 22   3, "image/jpeg"
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d70: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5d80: 20 22 6a 70 67 22 2c 20 20 20 20 20 20 20 20 33   "jpg",        3
5d90: 2c 20 22 69 6d 61 67 65 2f 6a 70 65 67 22 20 20  , "image/jpeg"  
5da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5db0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5dc0: 6a 73 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  js",         2, 
5dd0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6a  "application/x-j
5de0: 61 76 61 73 63 72 69 70 74 22 20 20 20 20 20 20  avascript"      
5df0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6b 61      },.    { "ka
5e00: 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  r",        3, "a
5e10: 75 64 69 6f 2f 6d 69 64 69 22 20 20 20 20 20 20  udio/midi"      
5e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e30: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 61 74 65    },.    { "late
5e40: 78 22 2c 20 20 20 20 20 20 35 2c 20 22 61 70 70  x",      5, "app
5e50: 6c 69 63 61 74 69 6f 6e 2f 78 2d 6c 61 74 65 78  lication/x-latex
5e60: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
5e70: 7d 2c 0a 20 20 20 20 7b 20 22 6c 68 61 22 2c 20  },.    { "lha", 
5e80: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
5e90: 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72  cation/octet-str
5ea0: 65 61 6d 22 20 20 20 20 20 20 20 20 20 20 7d 2c  eam"          },
5eb0: 0a 20 20 20 20 7b 20 22 6c 73 70 22 2c 20 20 20  .    { "lsp",   
5ec0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
5ed0: 74 69 6f 6e 2f 78 2d 6c 69 73 70 22 20 20 20 20  tion/x-lisp"    
5ee0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5ef0: 20 20 20 7b 20 22 6c 7a 68 22 2c 20 20 20 20 20     { "lzh",     
5f00: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
5f10: 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22  on/octet-stream"
5f20: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5f30: 20 7b 20 22 6d 22 2c 20 20 20 20 20 20 20 20 20   { "m",         
5f40: 20 31 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22   1, "text/plain"
5f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f60: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5f70: 20 22 6d 33 75 22 2c 20 20 20 20 20 20 20 20 33   "m3u",        3
5f80: 2c 20 22 61 75 64 69 6f 2f 78 2d 6d 70 65 67 75  , "audio/x-mpegu
5f90: 72 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20  rl"             
5fa0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5fb0: 6d 61 6e 22 2c 20 20 20 20 20 20 20 20 33 2c 20  man",        3, 
5fc0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74  "application/x-t
5fd0: 72 6f 66 66 2d 6d 61 6e 22 20 20 20 20 20 20 20  roff-man"       
5fe0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 65      },.    { "me
5ff0: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61  ",         2, "a
6000: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72 6f  pplication/x-tro
6010: 66 66 2d 6d 65 22 20 20 20 20 20 20 20 20 20 20  ff-me"          
6020: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 65 73 68    },.    { "mesh
6030: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 6d 6f 64  ",       4, "mod
6040: 65 6c 2f 6d 65 73 68 22 20 20 20 20 20 20 20 20  el/mesh"        
6050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6060: 7d 2c 0a 20 20 20 20 7b 20 22 6d 69 64 22 2c 20  },.    { "mid", 
6070: 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f         3, "audio
6080: 2f 6d 69 64 69 22 20 20 20 20 20 20 20 20 20 20  /midi"          
6090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
60a0: 0a 20 20 20 20 7b 20 22 6d 69 64 69 22 2c 20 20  .    { "midi",  
60b0: 20 20 20 20 20 34 2c 20 22 61 75 64 69 6f 2f 6d       4, "audio/m
60c0: 69 64 69 22 20 20 20 20 20 20 20 20 20 20 20 20  idi"            
60d0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
60e0: 20 20 20 7b 20 22 6d 69 66 22 2c 20 20 20 20 20     { "mif",     
60f0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
6100: 6f 6e 2f 78 2d 6d 69 66 22 20 20 20 20 20 20 20  on/x-mif"       
6110: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6120: 20 7b 20 22 6d 69 6d 65 22 2c 20 20 20 20 20 20   { "mime",      
6130: 20 34 2c 20 22 77 77 77 2f 6d 69 6d 65 22 20 20   4, "www/mime"  
6140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6150: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6160: 20 22 6d 6f 76 69 65 22 2c 20 20 20 20 20 20 35   "movie",      5
6170: 2c 20 22 76 69 64 65 6f 2f 78 2d 73 67 69 2d 6d  , "video/x-sgi-m
6180: 6f 76 69 65 22 20 20 20 20 20 20 20 20 20 20 20  ovie"           
6190: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
61a0: 6d 6f 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20  mov",        3, 
61b0: 22 76 69 64 65 6f 2f 71 75 69 63 6b 74 69 6d 65  "video/quicktime
61c0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
61d0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70      },.    { "mp
61e0: 32 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  2",        3, "a
61f0: 75 64 69 6f 2f 6d 70 65 67 22 20 20 20 20 20 20  udio/mpeg"      
6200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6210: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 32 22    },.    { "mp2"
6220: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64  ,        3, "vid
6230: 65 6f 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20  eo/mpeg"        
6240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6250: 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 33 22 2c 20  },.    { "mp3", 
6260: 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f         3, "audio
6270: 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20 20 20  /mpeg"          
6280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6290: 0a 20 20 20 20 7b 20 22 6d 70 65 67 22 2c 20 20  .    { "mpeg",  
62a0: 20 20 20 20 20 34 2c 20 22 76 69 64 65 6f 2f 6d       4, "video/m
62b0: 70 65 67 22 20 20 20 20 20 20 20 20 20 20 20 20  peg"            
62c0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
62d0: 20 20 20 7b 20 22 6d 70 65 22 2c 20 20 20 20 20     { "mpe",     
62e0: 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 6d 70 65     3, "video/mpe
62f0: 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g"              
6300: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6310: 20 7b 20 22 6d 70 67 61 22 2c 20 20 20 20 20 20   { "mpga",      
6320: 20 34 2c 20 22 61 75 64 69 6f 2f 6d 70 65 67 22   4, "audio/mpeg"
6330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6340: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6350: 20 22 6d 70 67 22 2c 20 20 20 20 20 20 20 20 33   "mpg",        3
6360: 2c 20 22 76 69 64 65 6f 2f 6d 70 65 67 22 20 20  , "video/mpeg"  
6370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6380: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6390: 6d 73 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  ms",         2, 
63a0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74  "application/x-t
63b0: 72 6f 66 66 2d 6d 73 22 20 20 20 20 20 20 20 20  roff-ms"        
63c0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 73      },.    { "ms
63d0: 68 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 6d  h",        3, "m
63e0: 6f 64 65 6c 2f 6d 65 73 68 22 20 20 20 20 20 20  odel/mesh"      
63f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6400: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 63 22 2c    },.    { "nc",
6410: 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70 70           2, "app
6420: 6c 69 63 61 74 69 6f 6e 2f 78 2d 6e 65 74 63 64  lication/x-netcd
6430: 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f"              
6440: 7d 2c 0a 20 20 20 20 7b 20 22 6f 64 61 22 2c 20  },.    { "oda", 
6450: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
6460: 63 61 74 69 6f 6e 2f 6f 64 61 22 20 20 20 20 20  cation/oda"     
6470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6480: 0a 20 20 20 20 7b 20 22 6f 67 67 22 2c 20 20 20  .    { "ogg",   
6490: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
64a0: 74 69 6f 6e 2f 6f 67 67 22 20 20 20 20 20 20 20  tion/ogg"       
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
64c0: 20 20 20 7b 20 22 6f 67 6d 22 2c 20 20 20 20 20     { "ogm",     
64d0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
64e0: 6f 6e 2f 6f 67 67 22 20 20 20 20 20 20 20 20 20  on/ogg"         
64f0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6500: 20 7b 20 22 70 62 6d 22 2c 20 20 20 20 20 20 20   { "pbm",       
6510: 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 70 6f 72   3, "image/x-por
6520: 74 61 62 6c 65 2d 62 69 74 6d 61 70 22 20 20 20  table-bitmap"   
6530: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6540: 20 22 70 64 62 22 2c 20 20 20 20 20 20 20 20 33   "pdb",        3
6550: 2c 20 22 63 68 65 6d 69 63 61 6c 2f 78 2d 70 64  , "chemical/x-pd
6560: 62 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b"              
6570: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6580: 70 64 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20  pdf",        3, 
6590: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 64 66  "application/pdf
65a0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
65b0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 67      },.    { "pg
65c0: 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69  m",        3, "i
65d0: 6d 61 67 65 2f 78 2d 70 6f 72 74 61 62 6c 65 2d  mage/x-portable-
65e0: 67 72 61 79 6d 61 70 22 20 20 20 20 20 20 20 20  graymap"        
65f0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 67 6e 22    },.    { "pgn"
6600: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
6610: 6c 69 63 61 74 69 6f 6e 2f 78 2d 63 68 65 73 73  lication/x-chess
6620: 2d 70 67 6e 22 20 20 20 20 20 20 20 20 20 20 20  -pgn"           
6630: 7d 2c 0a 20 20 20 20 7b 20 22 70 67 70 22 2c 20  },.    { "pgp", 
6640: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
6650: 63 61 74 69 6f 6e 2f 70 67 70 22 20 20 20 20 20  cation/pgp"     
6660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6670: 0a 20 20 20 20 7b 20 22 70 6c 22 2c 20 20 20 20  .    { "pl",    
6680: 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61       2, "applica
6690: 74 69 6f 6e 2f 78 2d 70 65 72 6c 22 20 20 20 20  tion/x-perl"    
66a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
66b0: 20 20 20 7b 20 22 70 6d 22 2c 20 20 20 20 20 20     { "pm",      
66c0: 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69     2, "applicati
66d0: 6f 6e 2f 78 2d 70 65 72 6c 22 20 20 20 20 20 20  on/x-perl"      
66e0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
66f0: 20 7b 20 22 70 6e 67 22 2c 20 20 20 20 20 20 20   { "png",       
6700: 20 33 2c 20 22 69 6d 61 67 65 2f 70 6e 67 22 20   3, "image/png" 
6710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6720: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6730: 20 22 70 6e 6d 22 2c 20 20 20 20 20 20 20 20 33   "pnm",        3
6740: 2c 20 22 69 6d 61 67 65 2f 78 2d 70 6f 72 74 61  , "image/x-porta
6750: 62 6c 65 2d 61 6e 79 6d 61 70 22 20 20 20 20 20  ble-anymap"     
6760: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6770: 70 6f 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20  pot",        3, 
6780: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 70  "application/msp
6790: 6f 77 65 72 70 6f 69 6e 74 22 20 20 20 20 20 20  owerpoint"      
67a0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 70      },.    { "pp
67b0: 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69  m",        3, "i
67c0: 6d 61 67 65 2f 78 2d 70 6f 72 74 61 62 6c 65 2d  mage/x-portable-
67d0: 70 69 78 6d 61 70 22 20 20 20 20 20 20 20 20 20  pixmap"         
67e0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 70 73 22    },.    { "pps"
67f0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
6800: 6c 69 63 61 74 69 6f 6e 2f 6d 73 70 6f 77 65 72  lication/mspower
6810: 70 6f 69 6e 74 22 20 20 20 20 20 20 20 20 20 20  point"          
6820: 7d 2c 0a 20 20 20 20 7b 20 22 70 70 74 22 2c 20  },.    { "ppt", 
6830: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
6840: 63 61 74 69 6f 6e 2f 6d 73 70 6f 77 65 72 70 6f  cation/mspowerpo
6850: 69 6e 74 22 20 20 20 20 20 20 20 20 20 20 7d 2c  int"          },
6860: 0a 20 20 20 20 7b 20 22 70 70 7a 22 2c 20 20 20  .    { "ppz",   
6870: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
6880: 74 69 6f 6e 2f 6d 73 70 6f 77 65 72 70 6f 69 6e  tion/mspowerpoin
6890: 74 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  t"          },. 
68a0: 20 20 20 7b 20 22 70 72 65 22 2c 20 20 20 20 20     { "pre",     
68b0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
68c0: 6f 6e 2f 78 2d 66 72 65 65 6c 61 6e 63 65 22 20  on/x-freelance" 
68d0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
68e0: 20 7b 20 22 70 72 74 22 2c 20 20 20 20 20 20 20   { "prt",       
68f0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
6900: 2f 70 72 6f 5f 65 6e 67 22 20 20 20 20 20 20 20  /pro_eng"       
6910: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6920: 20 22 70 73 22 2c 20 20 20 20 20 20 20 20 20 32   "ps",         2
6930: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70  , "application/p
6940: 6f 73 74 73 63 72 69 70 74 22 20 20 20 20 20 20  ostscript"      
6950: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6960: 71 74 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  qt",         2, 
6970: 22 76 69 64 65 6f 2f 71 75 69 63 6b 74 69 6d 65  "video/quicktime
6980: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
6990: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61      },.    { "ra
69a0: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61  ",         2, "a
69b0: 75 64 69 6f 2f 78 2d 72 65 61 6c 61 75 64 69 6f  udio/x-realaudio
69c0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
69d0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61 6d 22    },.    { "ram"
69e0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64  ,        3, "aud
69f0: 69 6f 2f 78 2d 70 6e 2d 72 65 61 6c 61 75 64 69  io/x-pn-realaudi
6a00: 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o"              
6a10: 7d 2c 0a 20 20 20 20 7b 20 22 72 61 72 22 2c 20  },.    { "rar", 
6a20: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
6a30: 63 61 74 69 6f 6e 2f 78 2d 72 61 72 2d 63 6f 6d  cation/x-rar-com
6a40: 70 72 65 73 73 65 64 22 20 20 20 20 20 20 7d 2c  pressed"      },
6a50: 0a 20 20 20 20 7b 20 22 72 61 73 22 2c 20 20 20  .    { "ras",   
6a60: 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 63       3, "image/c
6a70: 6d 75 2d 72 61 73 74 65 72 22 20 20 20 20 20 20  mu-raster"      
6a80: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6a90: 20 20 20 7b 20 22 72 61 73 22 2c 20 20 20 20 20     { "ras",     
6aa0: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 63     3, "image/x-c
6ab0: 6d 75 2d 72 61 73 74 65 72 22 20 20 20 20 20 20  mu-raster"      
6ac0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6ad0: 20 7b 20 22 72 67 62 22 2c 20 20 20 20 20 20 20   { "rgb",       
6ae0: 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 72 67 62   3, "image/x-rgb
6af0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
6b00: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6b10: 20 22 72 6d 22 2c 20 20 20 20 20 20 20 20 20 32   "rm",         2
6b20: 2c 20 22 61 75 64 69 6f 2f 78 2d 70 6e 2d 72 65  , "audio/x-pn-re
6b30: 61 6c 61 75 64 69 6f 22 20 20 20 20 20 20 20 20  alaudio"        
6b40: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6b50: 72 6f 66 66 22 2c 20 20 20 20 20 20 20 34 2c 20  roff",       4, 
6b60: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74  "application/x-t
6b70: 72 6f 66 66 22 20 20 20 20 20 20 20 20 20 20 20  roff"           
6b80: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 70      },.    { "rp
6b90: 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  m",        3, "a
6ba0: 75 64 69 6f 2f 78 2d 70 6e 2d 72 65 61 6c 61 75  udio/x-pn-realau
6bb0: 64 69 6f 2d 70 6c 75 67 69 6e 22 20 20 20 20 20  dio-plugin"     
6bc0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 74 66 22    },.    { "rtf"
6bd0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
6be0: 6c 69 63 61 74 69 6f 6e 2f 72 74 66 22 20 20 20  lication/rtf"   
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c00: 7d 2c 0a 20 20 20 20 7b 20 22 72 74 66 22 2c 20  },.    { "rtf", 
6c10: 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f         3, "text/
6c20: 72 74 66 22 20 20 20 20 20 20 20 20 20 20 20 20  rtf"            
6c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6c40: 0a 20 20 20 20 7b 20 22 72 74 78 22 2c 20 20 20  .    { "rtx",   
6c50: 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 72 69       3, "text/ri
6c60: 63 68 74 65 78 74 22 20 20 20 20 20 20 20 20 20  chtext"         
6c70: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6c80: 20 20 20 7b 20 22 73 63 6d 22 2c 20 20 20 20 20     { "scm",     
6c90: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
6ca0: 6f 6e 2f 78 2d 6c 6f 74 75 73 73 63 72 65 65 6e  on/x-lotusscreen
6cb0: 63 61 6d 22 20 20 20 20 20 20 7d 2c 0a 20 20 20  cam"      },.   
6cc0: 20 7b 20 22 73 65 74 22 2c 20 20 20 20 20 20 20   { "set",       
6cd0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
6ce0: 2f 73 65 74 22 20 20 20 20 20 20 20 20 20 20 20  /set"           
6cf0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6d00: 20 22 73 67 6d 6c 22 2c 20 20 20 20 20 20 20 34   "sgml",       4
6d10: 2c 20 22 74 65 78 74 2f 73 67 6d 6c 22 20 20 20  , "text/sgml"   
6d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d30: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6d40: 73 67 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20  sgm",        3, 
6d50: 22 74 65 78 74 2f 73 67 6d 6c 22 20 20 20 20 20  "text/sgml"     
6d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d70: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 68      },.    { "sh
6d80: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61  ",         2, "a
6d90: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 68 22  pplication/x-sh"
6da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6db0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 68 61 72    },.    { "shar
6dc0: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70 70  ",       4, "app
6dd0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 68 61 72 22  lication/x-shar"
6de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6df0: 7d 2c 0a 20 20 20 20 7b 20 22 73 69 6c 6f 22 2c  },.    { "silo",
6e00: 20 20 20 20 20 20 20 34 2c 20 22 6d 6f 64 65 6c         4, "model
6e10: 2f 6d 65 73 68 22 20 20 20 20 20 20 20 20 20 20  /mesh"          
6e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6e30: 0a 20 20 20 20 7b 20 22 73 69 74 22 2c 20 20 20  .    { "sit",   
6e40: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
6e50: 74 69 6f 6e 2f 78 2d 73 74 75 66 66 69 74 22 20  tion/x-stuffit" 
6e60: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6e70: 20 20 20 7b 20 22 73 6b 64 22 2c 20 20 20 20 20     { "skd",     
6e80: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
6e90: 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20 20 20 20  on/x-koan"      
6ea0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6eb0: 20 7b 20 22 73 6b 6d 22 2c 20 20 20 20 20 20 20   { "skm",       
6ec0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
6ed0: 2f 78 2d 6b 6f 61 6e 22 20 20 20 20 20 20 20 20  /x-koan"        
6ee0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6ef0: 20 22 73 6b 70 22 2c 20 20 20 20 20 20 20 20 33   "skp",        3
6f00: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
6f10: 2d 6b 6f 61 6e 22 20 20 20 20 20 20 20 20 20 20  -koan"          
6f20: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6f30: 73 6b 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20  skt",        3, 
6f40: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6b  "application/x-k
6f50: 6f 61 6e 22 20 20 20 20 20 20 20 20 20 20 20 20  oan"            
6f60: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d      },.    { "sm
6f70: 69 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  i",        3, "a
6f80: 70 70 6c 69 63 61 74 69 6f 6e 2f 73 6d 69 6c 22  pplication/smil"
6f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fa0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 69 6c    },.    { "smil
6fb0: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70 70  ",       4, "app
6fc0: 6c 69 63 61 74 69 6f 6e 2f 73 6d 69 6c 22 20 20  lication/smil"  
6fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fe0: 7d 2c 0a 20 20 20 20 7b 20 22 73 6e 64 22 2c 20  },.    { "snd", 
6ff0: 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f         3, "audio
7000: 2f 62 61 73 69 63 22 20 20 20 20 20 20 20 20 20  /basic"         
7010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7020: 0a 20 20 20 20 7b 20 22 73 6f 6c 22 2c 20 20 20  .    { "sol",   
7030: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
7040: 74 69 6f 6e 2f 73 6f 6c 69 64 73 22 20 20 20 20  tion/solids"    
7050: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7060: 20 20 20 7b 20 22 73 70 6c 22 2c 20 20 20 20 20     { "spl",     
7070: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
7080: 6f 6e 2f 78 2d 66 75 74 75 72 65 73 70 6c 61 73  on/x-futuresplas
7090: 68 22 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  h"        },.   
70a0: 20 7b 20 22 73 72 63 22 2c 20 20 20 20 20 20 20   { "src",       
70b0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
70c0: 2f 78 2d 77 61 69 73 2d 73 6f 75 72 63 65 22 20  /x-wais-source" 
70d0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
70e0: 20 22 73 74 65 70 22 2c 20 20 20 20 20 20 20 34   "step",       4
70f0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 53  , "application/S
7100: 54 45 50 22 20 20 20 20 20 20 20 20 20 20 20 20  TEP"            
7110: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7120: 73 74 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20  stl",        3, 
7130: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 53 4c 41  "application/SLA
7140: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
7150: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 74      },.    { "st
7160: 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  p",        3, "a
7170: 70 70 6c 69 63 61 74 69 6f 6e 2f 53 54 45 50 22  pplication/STEP"
7180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7190: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 76 34 63    },.    { "sv4c
71a0: 70 69 6f 22 2c 20 20 20 20 37 2c 20 22 61 70 70  pio",    7, "app
71b0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 76 34 63 70  lication/x-sv4cp
71c0: 69 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20  io"             
71d0: 7d 2c 0a 20 20 20 20 7b 20 22 73 76 34 63 72 63  },.    { "sv4crc
71e0: 22 2c 20 20 20 20 20 36 2c 20 22 61 70 70 6c 69  ",     6, "appli
71f0: 63 61 74 69 6f 6e 2f 78 2d 73 76 34 63 72 63 22  cation/x-sv4crc"
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7210: 0a 20 20 20 20 7b 20 22 73 77 66 22 2c 20 20 20  .    { "swf",   
7220: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
7230: 74 69 6f 6e 2f 78 2d 73 68 6f 63 6b 77 61 76 65  tion/x-shockwave
7240: 2d 66 6c 61 73 68 22 20 20 20 20 20 7d 2c 0a 20  -flash"     },. 
7250: 20 20 20 7b 20 22 74 22 2c 20 20 20 20 20 20 20     { "t",       
7260: 20 20 20 31 2c 20 22 61 70 70 6c 69 63 61 74 69     1, "applicati
7270: 6f 6e 2f 78 2d 74 72 6f 66 66 22 20 20 20 20 20  on/x-troff"     
7280: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7290: 20 7b 20 22 74 61 72 22 2c 20 20 20 20 20 20 20   { "tar",       
72a0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
72b0: 2f 78 2d 74 61 72 22 20 20 20 20 20 20 20 20 20  /x-tar"         
72c0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
72d0: 20 22 74 63 6c 22 2c 20 20 20 20 20 20 20 20 33   "tcl",        3
72e0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
72f0: 2d 74 63 6c 22 20 20 20 20 20 20 20 20 20 20 20  -tcl"           
7300: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7310: 74 65 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20  tex",        3, 
7320: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74  "application/x-t
7330: 65 78 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ex"             
7340: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 65      },.    { "te
7350: 78 69 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61  xi",       4, "a
7360: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 65 78  pplication/x-tex
7370: 69 6e 66 6f 22 20 20 20 20 20 20 20 20 20 20 20  info"           
7380: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 65 78 69    },.    { "texi
7390: 6e 66 6f 22 2c 20 20 20 20 37 2c 20 22 61 70 70  nfo",    7, "app
73a0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 65 78 69 6e  lication/x-texin
73b0: 66 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20  fo"             
73c0: 7d 2c 0a 20 20 20 20 7b 20 22 74 67 7a 22 2c 20  },.    { "tgz", 
73d0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
73e0: 63 61 74 69 6f 6e 2f 78 2d 74 61 72 2d 67 7a 22  cation/x-tar-gz"
73f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7400: 0a 20 20 20 20 7b 20 22 74 69 66 66 22 2c 20 20  .    { "tiff",  
7410: 20 20 20 20 20 34 2c 20 22 69 6d 61 67 65 2f 74       4, "image/t
7420: 69 66 66 22 20 20 20 20 20 20 20 20 20 20 20 20  iff"            
7430: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7440: 20 20 20 7b 20 22 74 69 66 22 2c 20 20 20 20 20     { "tif",     
7450: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 74 69 66     3, "image/tif
7460: 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f"              
7470: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7480: 20 7b 20 22 74 72 22 2c 20 20 20 20 20 20 20 20   { "tr",        
7490: 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   2, "application
74a0: 2f 78 2d 74 72 6f 66 66 22 20 20 20 20 20 20 20  /x-troff"       
74b0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
74c0: 20 22 74 73 69 22 2c 20 20 20 20 20 20 20 20 33   "tsi",        3
74d0: 2c 20 22 61 75 64 69 6f 2f 54 53 50 2d 61 75 64  , "audio/TSP-aud
74e0: 69 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20  io"             
74f0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7500: 74 73 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20  tsp",        3, 
7510: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 64 73 70  "application/dsp
7520: 74 79 70 65 22 20 20 20 20 20 20 20 20 20 20 20  type"           
7530: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 73      },.    { "ts
7540: 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74  v",        3, "t
7550: 65 78 74 2f 74 61 62 2d 73 65 70 61 72 61 74 65  ext/tab-separate
7560: 64 2d 76 61 6c 75 65 73 22 20 20 20 20 20 20 20  d-values"       
7570: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 78 74 22    },.    { "txt"
7580: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65 78  ,        3, "tex
7590: 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20  t/plain"        
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75b0: 7d 2c 0a 20 20 20 20 7b 20 22 75 6e 76 22 2c 20  },.    { "unv", 
75c0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
75d0: 63 61 74 69 6f 6e 2f 69 2d 64 65 61 73 22 20 20  cation/i-deas"  
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
75f0: 0a 20 20 20 20 7b 20 22 75 73 74 61 72 22 2c 20  .    { "ustar", 
7600: 20 20 20 20 20 35 2c 20 22 61 70 70 6c 69 63 61       5, "applica
7610: 74 69 6f 6e 2f 78 2d 75 73 74 61 72 22 20 20 20  tion/x-ustar"   
7620: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7630: 20 20 20 7b 20 22 76 63 64 22 2c 20 20 20 20 20     { "vcd",     
7640: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
7650: 6f 6e 2f 78 2d 63 64 6c 69 6e 6b 22 20 20 20 20  on/x-cdlink"    
7660: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7670: 20 7b 20 22 76 64 61 22 2c 20 20 20 20 20 20 20   { "vda",       
7680: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
7690: 2f 76 64 61 22 20 20 20 20 20 20 20 20 20 20 20  /vda"           
76a0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
76b0: 20 22 76 69 76 22 2c 20 20 20 20 20 20 20 20 33   "viv",        3
76c0: 2c 20 22 76 69 64 65 6f 2f 76 6e 64 2e 76 69 76  , "video/vnd.viv
76d0: 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o"              
76e0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
76f0: 76 69 76 6f 22 2c 20 20 20 20 20 20 20 34 2c 20  vivo",       4, 
7700: 22 76 69 64 65 6f 2f 76 6e 64 2e 76 69 76 6f 22  "video/vnd.vivo"
7710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7720: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 76 72      },.    { "vr
7730: 6d 6c 22 2c 20 20 20 20 20 20 20 34 2c 20 22 6d  ml",       4, "m
7740: 6f 64 65 6c 2f 76 72 6d 6c 22 20 20 20 20 20 20  odel/vrml"      
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7760: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 61 76 22    },.    { "wav"
7770: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64  ,        3, "aud
7780: 69 6f 2f 78 2d 77 61 76 22 20 20 20 20 20 20 20  io/x-wav"       
7790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77a0: 7d 2c 0a 20 20 20 20 7b 20 22 77 61 78 22 2c 20  },.    { "wax", 
77b0: 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f         3, "audio
77c0: 2f 78 2d 6d 73 2d 77 61 78 22 20 20 20 20 20 20  /x-ms-wax"      
77d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
77e0: 0a 20 20 20 20 7b 20 22 77 69 6b 69 22 2c 20 20  .    { "wiki",  
77f0: 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61       4, "applica
7800: 74 69 6f 6e 2f 78 2d 66 6f 73 73 69 6c 2d 77 69  tion/x-fossil-wi
7810: 6b 69 22 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  ki"         },. 
7820: 20 20 20 7b 20 22 77 6d 61 22 2c 20 20 20 20 20     { "wma",     
7830: 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 6d     3, "audio/x-m
7840: 73 2d 77 6d 61 22 20 20 20 20 20 20 20 20 20 20  s-wma"          
7850: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7860: 20 7b 20 22 77 6d 76 22 2c 20 20 20 20 20 20 20   { "wmv",       
7870: 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d   3, "video/x-ms-
7880: 77 6d 76 22 20 20 20 20 20 20 20 20 20 20 20 20  wmv"            
7890: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
78a0: 20 22 77 6d 78 22 2c 20 20 20 20 20 20 20 20 33   "wmx",        3
78b0: 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 77 6d  , "video/x-ms-wm
78c0: 78 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x"              
78d0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
78e0: 77 72 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20  wrl",        3, 
78f0: 22 6d 6f 64 65 6c 2f 76 72 6d 6c 22 20 20 20 20  "model/vrml"    
7900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7910: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 76      },.    { "wv
7920: 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76  x",        3, "v
7930: 69 64 65 6f 2f 78 2d 6d 73 2d 77 76 78 22 20 20  ideo/x-ms-wvx"  
7940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7950: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 62 6d 22    },.    { "xbm"
7960: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61  ,        3, "ima
7970: 67 65 2f 78 2d 78 62 69 74 6d 61 70 22 20 20 20  ge/x-xbitmap"   
7980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7990: 7d 2c 0a 20 20 20 20 7b 20 22 78 6c 63 22 2c 20  },.    { "xlc", 
79a0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
79b0: 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78  cation/vnd.ms-ex
79c0: 63 65 6c 22 20 20 20 20 20 20 20 20 20 20 7d 2c  cel"          },
79d0: 0a 20 20 20 20 7b 20 22 78 6c 6c 22 2c 20 20 20  .    { "xll",   
79e0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
79f0: 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65  tion/vnd.ms-exce
7a00: 6c 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  l"          },. 
7a10: 20 20 20 7b 20 22 78 6c 6d 22 2c 20 20 20 20 20     { "xlm",     
7a20: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
7a30: 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22  on/vnd.ms-excel"
7a40: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7a50: 20 7b 20 22 78 6c 73 22 2c 20 20 20 20 20 20 20   { "xls",       
7a60: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
7a70: 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20 20  /vnd.ms-excel"  
7a80: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7a90: 20 22 78 6c 77 22 2c 20 20 20 20 20 20 20 20 33   "xlw",        3
7aa0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76  , "application/v
7ab0: 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20 20 20 20  nd.ms-excel"    
7ac0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7ad0: 78 6d 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20  xml",        3, 
7ae0: 22 74 65 78 74 2f 78 6d 6c 22 20 20 20 20 20 20  "text/xml"      
7af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b00: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 70      },.    { "xp
7b10: 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69  m",        3, "i
7b20: 6d 61 67 65 2f 78 2d 78 70 69 78 6d 61 70 22 20  mage/x-xpixmap" 
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b40: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 77 64 22    },.    { "xwd"
7b50: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61  ,        3, "ima
7b60: 67 65 2f 78 2d 78 77 69 6e 64 6f 77 64 75 6d 70  ge/x-xwindowdump
7b70: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
7b80: 7d 2c 0a 20 20 20 20 7b 20 22 78 79 7a 22 2c 20  },.    { "xyz", 
7b90: 20 20 20 20 20 20 20 33 2c 20 22 63 68 65 6d 69         3, "chemi
7ba0: 63 61 6c 2f 78 2d 70 64 62 22 20 20 20 20 20 20  cal/x-pdb"      
7bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7bc0: 0a 20 20 20 20 7b 20 22 7a 69 70 22 2c 20 20 20  .    { "zip",   
7bd0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
7be0: 74 69 6f 6e 2f 7a 69 70 22 20 20 20 20 20 20 20  tion/zip"       
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7c00: 20 7d 3b 0a 0a 20 20 66 6f 72 28 69 3d 6e 4e 61   };..  for(i=nNa
7c10: 6d 65 2d 31 3b 20 69 3e 30 20 26 26 20 7a 4e 61  me-1; i>0 && zNa
7c20: 6d 65 5b 69 5d 21 3d 27 2e 27 3b 20 69 2d 2d 29  me[i]!='.'; i--)
7c30: 7b 7d 0a 20 20 7a 20 3d 20 26 7a 4e 61 6d 65 5b  {}.  z = &zName[
7c40: 69 2b 31 5d 3b 0a 20 20 6c 65 6e 20 3d 20 6e 4e  i+1];.  len = nN
7c50: 61 6d 65 20 2d 20 69 3b 0a 20 20 69 66 28 20 6c  ame - i;.  if( l
7c60: 65 6e 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 7a  en<(int)sizeof(z
7c70: 53 75 66 66 69 78 29 2d 31 20 29 7b 0a 20 20 20  Suffix)-1 ){.   
7c80: 20 73 74 72 63 70 79 28 7a 53 75 66 66 69 78 2c   strcpy(zSuffix,
7c90: 20 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   z);.    for(i=0
7ca0: 3b 20 7a 53 75 66 66 69 78 5b 69 5d 3b 20 69 2b  ; zSuffix[i]; i+
7cb0: 2b 29 20 7a 53 75 66 66 69 78 5b 69 5d 20 3d 20  +) zSuffix[i] = 
7cc0: 74 6f 6c 6f 77 65 72 28 7a 53 75 66 66 69 78 5b  tolower(zSuffix[
7cd0: 69 5d 29 3b 0a 20 20 20 20 66 69 72 73 74 20 3d  i]);.    first =
7ce0: 20 30 3b 0a 20 20 20 20 6c 61 73 74 20 3d 20 73   0;.    last = s
7cf0: 69 7a 65 6f 66 28 61 4d 69 6d 65 29 2f 73 69 7a  izeof(aMime)/siz
7d00: 65 6f 66 28 61 4d 69 6d 65 5b 30 5d 29 3b 0a 20  eof(aMime[0]);. 
7d10: 20 20 20 77 68 69 6c 65 28 20 66 69 72 73 74 3c     while( first<
7d20: 3d 6c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 69  =last ){.      i
7d30: 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 20 3d 20  nt c;.      i = 
7d40: 28 66 69 72 73 74 2b 6c 61 73 74 29 2f 32 3b 0a  (first+last)/2;.
7d50: 20 20 20 20 20 20 63 20 3d 20 73 74 72 63 6d 70        c = strcmp
7d60: 28 7a 53 75 66 66 69 78 2c 20 61 4d 69 6d 65 5b  (zSuffix, aMime[
7d70: 69 5d 2e 7a 53 75 66 66 69 78 29 3b 0a 20 20 20  i].zSuffix);.   
7d80: 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65     if( c==0 ) re
7d90: 74 75 72 6e 20 61 4d 69 6d 65 5b 69 5d 2e 7a 4d  turn aMime[i].zM
7da0: 69 6d 65 74 79 70 65 3b 0a 20 20 20 20 20 20 69  imetype;.      i
7db0: 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( c<0 ){.      
7dc0: 20 20 6c 61 73 74 20 3d 20 69 2d 31 3b 0a 20 20    last = i-1;.  
7dd0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7de0: 20 20 20 66 69 72 73 74 20 3d 20 69 2b 31 3b 0a     first = i+1;.
7df0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7e00: 7d 0a 20 20 72 65 74 75 72 6e 20 22 61 70 70 6c  }.  return "appl
7e10: 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74  ication/octet-st
7e20: 72 65 61 6d 22 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ream";.}../*.** 
7e30: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  The following ta
7e40: 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 31 20 66  ble contains 1 f
7e50: 6f 72 20 61 6c 6c 20 63 68 61 72 61 63 74 65 72  or all character
7e60: 73 20 74 68 61 74 20 61 72 65 20 70 65 72 6d 69  s that are permi
7e70: 74 74 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 70  tted in.** the p
7e80: 61 72 74 20 6f 66 20 74 68 65 20 55 52 4c 20 62  art of the URL b
7e90: 65 66 6f 72 65 20 74 68 65 20 71 75 65 72 79 20  efore the query 
7ea0: 70 61 72 61 6d 65 74 65 72 73 20 61 6e 64 20 66  parameters and f
7eb0: 72 61 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41  ragment..**.** A
7ec0: 6c 6c 6f 77 65 64 20 63 68 61 72 61 63 74 65 72  llowed character
7ed0: 73 3a 20 20 30 2d 39 20 61 2d 7a 20 41 2d 5a 20  s:  0-9 a-z A-Z 
7ee0: 2c 2d 2e 2f 3a 5f 7e 0a 2a 2a 0a 2a 2a 20 44 69  ,-./:_~.**.** Di
7ef0: 73 61 6c 6c 6f 77 65 64 20 63 68 61 72 61 63 74  sallowed charact
7f00: 65 72 73 20 69 6e 63 6c 75 64 65 3a 20 20 21 22  ers include:  !"
7f10: 23 24 25 26 27 28 29 2a 2b 3b 3c 3d 3e 3f 5b 5c  #$%&'()*+;<=>?[\
7f20: 5d 5e 7b 7c 7d 0a 2a 2f 0a 73 74 61 74 69 63 20  ]^{|}.*/.static 
7f30: 63 6f 6e 73 74 20 63 68 61 72 20 61 6c 6c 6f 77  const char allow
7f40: 65 64 49 6e 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20  edInName[] = {. 
7f50: 20 20 20 20 20 2f 2a 20 20 78 30 20 20 78 31 20       /*  x0  x1 
7f60: 20 78 32 20 20 78 33 20 20 78 34 20 20 78 35 20   x2  x3  x4  x5 
7f70: 20 78 36 20 20 78 37 20 20 78 38 20 20 78 39 20   x6  x7  x8  x9 
7f80: 20 78 61 20 20 78 62 20 20 78 63 20 20 78 64 20   xa  xb  xc  xd 
7f90: 20 78 65 20 20 78 66 20 2a 2f 0a 2f 2a 20 30 78   xe  xf */./* 0x
7fa0: 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c   */   0,  0,  0,
7fb0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
7fc0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
7fd0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
7fe0: 20 20 30 2c 0a 2f 2a 20 31 78 20 2a 2f 20 20 20    0,./* 1x */   
7ff0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
8000: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
8010: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
8020: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f  0,  0,  0,  0,./
8030: 2a 20 32 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c  * 2x */   0,  0,
8040: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
8050: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
8060: 20 20 30 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c    0,  0,  1,  1,
8070: 20 20 31 2c 20 20 31 2c 0a 2f 2a 20 33 78 20 2a    1,  1,./* 3x *
8080: 2f 20 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  /   1,  1,  1,  
8090: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
80a0: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
80b0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
80c0: 30 2c 0a 2f 2a 20 34 78 20 2a 2f 20 20 20 30 2c  0,./* 4x */   0,
80d0: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
80e0: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
80f0: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
8100: 20 20 31 2c 20 20 31 2c 20 20 31 2c 0a 2f 2a 20    1,  1,  1,./* 
8110: 35 78 20 2a 2f 20 20 20 31 2c 20 20 31 2c 20 20  5x */   1,  1,  
8120: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
8130: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
8140: 31 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  1,  0,  0,  0,  
8150: 30 2c 20 20 31 2c 0a 2f 2a 20 36 78 20 2a 2f 20  0,  1,./* 6x */ 
8160: 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    0,  1,  1,  1,
8170: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
8180: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  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: 0a 2f 2a 20 37 78 20 2a 2f 20 20 20 31 2c 20 20  ./* 7x */   1,  
81b0: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
81c0: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
81d0: 31 2c 20 20 31 2c 20 20 30 2c 20 20 30 2c 20 20  1,  1,  0,  0,  
81e0: 30 2c 20 20 31 2c 20 20 30 2c 0a 7d 3b 0a 0a 2f  0,  1,  0,.};../
81f0: 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e  *.** Count the n
8200: 75 6d 62 65 72 20 6f 66 20 22 2f 22 20 63 68 61  umber of "/" cha
8210: 72 61 63 74 65 72 73 20 69 6e 20 61 20 73 74 72  racters in a str
8220: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
8230: 6e 74 20 63 6f 75 6e 74 53 6c 61 73 68 65 73 28  nt countSlashes(
8240: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
8250: 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 77    int n = 0;.  w
8260: 68 69 6c 65 28 20 2a 7a 20 29 20 69 66 28 20 2a  hile( *z ) if( *
8270: 28 7a 2b 2b 29 3d 3d 27 2f 27 20 29 20 6e 2b 2b  (z++)=='/' ) n++
8280: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
8290: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
82a0: 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 61 20  ine processes a 
82b0: 73 69 6e 67 6c 65 20 48 54 54 50 20 72 65 71 75  single HTTP requ
82c0: 65 73 74 20 6f 6e 20 73 74 61 6e 64 61 72 64 20  est on standard 
82d0: 69 6e 70 75 74 20 61 6e 64 0a 2a 2a 20 73 65 6e  input and.** sen
82e0: 64 73 20 74 68 65 20 72 65 70 6c 79 20 74 6f 20  ds the reply to 
82f0: 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74 2e  standard output.
8300: 20 20 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e    If the argumen
8310: 74 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 0a  t is 1 it means.
8320: 2a 2a 20 74 68 61 74 20 77 65 20 61 72 65 20 73  ** that we are s
8330: 68 6f 75 6c 64 20 63 6c 6f 73 65 20 74 68 65 20  hould close the 
8340: 73 6f 63 6b 65 74 20 77 69 74 68 6f 75 74 20 70  socket without p
8350: 72 6f 63 65 73 73 69 6e 67 20 61 64 64 69 74 69  rocessing additi
8360: 6f 6e 61 6c 0a 2a 2a 20 48 54 54 50 20 72 65 71  onal.** HTTP req
8370: 75 65 73 74 73 20 61 66 74 65 72 20 74 68 65 20  uests after the 
8380: 63 75 72 72 65 6e 74 20 72 65 71 75 65 73 74 20  current request 
8390: 66 69 6e 69 73 68 65 73 2e 20 20 30 20 6d 65 61  finishes.  0 mea
83a0: 6e 73 20 77 65 20 61 72 65 0a 2a 2a 20 61 6c 6c  ns we are.** all
83b0: 6f 77 65 64 20 74 6f 20 6b 65 65 70 20 74 68 65  owed to keep the
83c0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e   connection open
83d0: 20 61 6e 64 20 74 6f 20 70 72 6f 63 65 73 73 20   and to process 
83e0: 61 64 64 69 74 69 6f 6e 61 6c 20 72 65 71 75 65  additional reque
83f0: 73 74 73 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  sts..** This rou
8400: 74 69 6e 65 20 6d 61 79 20 63 68 6f 6f 73 65 20  tine may choose 
8410: 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 63 6f 6e  to close the con
8420: 6e 65 63 74 69 6f 6e 20 65 76 65 6e 20 69 66 20  nection even if 
8430: 74 68 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  the argument.** 
8440: 69 73 20 30 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  is 0..** .** If 
8450: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  the connection s
8460: 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 2c  hould be closed,
8470: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
8480: 6c 6c 73 20 65 78 69 74 28 29 20 61 6e 64 0a 2a  lls exit() and.*
8490: 2a 20 74 68 75 73 20 6e 65 76 65 72 20 72 65 74  * thus never ret
84a0: 75 72 6e 73 2e 20 20 49 66 20 74 68 69 73 20 72  urns.  If this r
84b0: 6f 75 74 69 6e 65 20 64 6f 65 73 20 72 65 74 75  outine does retu
84c0: 72 6e 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  rn it means that
84d0: 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 48 54 54 50   another.** HTTP
84e0: 20 72 65 71 75 65 73 74 20 6d 61 79 20 61 70 70   request may app
84f0: 65 61 72 20 6f 6e 20 74 68 65 20 77 69 72 65 2e  ear on the wire.
8500: 0a 2a 2f 0a 76 6f 69 64 20 50 72 6f 63 65 73 73  .*/.void Process
8510: 4f 6e 65 52 65 71 75 65 73 74 28 69 6e 74 20 66  OneRequest(int f
8520: 6f 72 63 65 43 6c 6f 73 65 29 7b 0a 20 20 69 6e  orceClose){.  in
8530: 74 20 69 2c 20 63 3b 0a 20 20 63 68 61 72 20 2a  t i, c;.  char *
8540: 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
8550: 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 70      /* Used to p
8560: 61 72 73 65 20 75 70 20 61 20 73 74 72 69 6e 67  arse up a string
8570: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61   */.  struct sta
8580: 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20  t statbuf;      
8590: 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
85a0: 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 74 6f  bout the file to
85b0: 20 62 65 20 72 65 74 72 69 65 76 65 64 20 2a 2f   be retrieved */
85c0: 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20  .  FILE *in;    
85d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
85e0: 46 6f 72 20 72 65 61 64 69 6e 67 20 66 72 6f 6d  For reading from
85f0: 20 43 47 49 20 73 63 72 69 70 74 73 20 2a 2f 0a   CGI scripts */.
8600: 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b 31 30 30    char zLine[100
8610: 30 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  0];         /* A
8620: 20 62 75 66 66 65 72 20 66 6f 72 20 69 6e 70 75   buffer for inpu
8630: 74 20 6c 69 6e 65 73 20 6f 72 20 66 6f 72 6d 69  t lines or formi
8640: 6e 67 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 2f  ng names */..  /
8650: 2a 20 43 68 61 6e 67 65 20 64 69 72 65 63 74 6f  * Change directo
8660: 72 69 65 73 20 74 6f 20 74 68 65 20 72 6f 6f 74  ries to the root
8670: 20 6f 66 20 74 68 65 20 48 54 54 50 20 66 69 6c   of the HTTP fil
8680: 65 73 79 73 74 65 6d 0a 20 20 2a 2f 0a 20 20 69  esystem.  */.  i
8690: 66 28 20 63 68 64 69 72 28 7a 52 6f 6f 74 5b 30  f( chdir(zRoot[0
86a0: 5d 20 3f 20 7a 52 6f 6f 74 20 3a 20 22 2f 22 29  ] ? zRoot : "/")
86b0: 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  !=0 ){.    char 
86c0: 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20 20 20  zBuf[1000];.    
86d0: 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49  Malfunction(__LI
86e0: 4e 45 5f 5f 2c 20 22 63 61 6e 6e 6f 74 20 63 68  NE__, "cannot ch
86f0: 64 69 72 20 74 6f 20 5b 25 73 5d 20 66 72 6f 6d  dir to [%s] from
8700: 20 5b 25 73 5d 22 2c 0a 20 20 20 20 20 20 20 20   [%s]",.        
8710: 20 7a 52 6f 6f 74 2c 20 67 65 74 63 77 64 28 7a   zRoot, getcwd(z
8720: 42 75 66 2c 39 39 39 29 29 3b 0a 20 20 7d 0a 20  Buf,999));.  }. 
8730: 20 6e 52 65 71 75 65 73 74 2b 2b 3b 0a 0a 20 20   nRequest++;..  
8740: 2f 2a 0a 20 20 2a 2a 20 57 65 20 6d 75 73 74 20  /*.  ** We must 
8750: 72 65 63 65 69 76 65 20 61 20 63 6f 6d 70 6c 65  receive a comple
8760: 74 65 20 68 65 61 64 65 72 20 77 69 74 68 69 6e  te header within
8770: 20 31 35 20 73 65 63 6f 6e 64 73 0a 20 20 2a 2f   15 seconds.  */
8780: 0a 20 20 73 69 67 6e 61 6c 28 53 49 47 41 4c 52  .  signal(SIGALR
8790: 4d 2c 20 54 69 6d 65 6f 75 74 29 3b 0a 20 20 69  M, Timeout);.  i
87a0: 66 28 20 75 73 65 54 69 6d 65 6f 75 74 20 29 20  f( useTimeout ) 
87b0: 61 6c 61 72 6d 28 31 35 29 3b 0a 0a 20 20 2f 2a  alarm(15);..  /*
87c0: 20 47 65 74 20 74 68 65 20 66 69 72 73 74 20 6c   Get the first l
87d0: 69 6e 65 20 6f 66 20 74 68 65 20 72 65 71 75 65  ine of the reque
87e0: 73 74 20 61 6e 64 20 70 61 72 73 65 20 6f 75 74  st and parse out
87f0: 20 74 68 65 0a 20 20 2a 2a 20 6d 65 74 68 6f 64   the.  ** method
8800: 2c 20 74 68 65 20 73 63 72 69 70 74 20 61 6e 64  , the script and
8810: 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2e 0a 20   the protocol.. 
8820: 20 2a 2f 0a 20 20 69 66 28 20 66 67 65 74 73 28   */.  if( fgets(
8830: 7a 4c 69 6e 65 2c 73 69 7a 65 6f 66 28 7a 4c 69  zLine,sizeof(zLi
8840: 6e 65 29 2c 73 74 64 69 6e 29 3d 3d 30 20 29 7b  ne),stdin)==0 ){
8850: 0a 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20  .    exit(0);.  
8860: 7d 0a 20 20 6f 6d 69 74 4c 6f 67 20 3d 20 30 3b  }.  omitLog = 0;
8870: 0a 20 20 6e 49 6e 20 2b 3d 20 73 74 72 6c 65 6e  .  nIn += strlen
8880: 28 7a 4c 69 6e 65 29 3b 0a 20 20 7a 4d 65 74 68  (zLine);.  zMeth
8890: 6f 64 20 3d 20 53 74 72 44 75 70 28 47 65 74 46  od = StrDup(GetF
88a0: 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a 4c 69 6e  irstElement(zLin
88b0: 65 2c 26 7a 29 29 3b 0a 20 20 7a 52 65 61 6c 53  e,&z));.  zRealS
88c0: 63 72 69 70 74 20 3d 20 7a 53 63 72 69 70 74 20  cript = zScript 
88d0: 3d 20 53 74 72 44 75 70 28 47 65 74 46 69 72 73  = StrDup(GetFirs
88e0: 74 45 6c 65 6d 65 6e 74 28 7a 2c 26 7a 29 29 3b  tElement(z,&z));
88f0: 0a 20 20 7a 50 72 6f 74 6f 63 6f 6c 20 3d 20 53  .  zProtocol = S
8900: 74 72 44 75 70 28 47 65 74 46 69 72 73 74 45 6c  trDup(GetFirstEl
8910: 65 6d 65 6e 74 28 7a 2c 26 7a 29 29 3b 0a 20 20  ement(z,&z));.  
8920: 69 66 28 20 7a 50 72 6f 74 6f 63 6f 6c 3d 3d 30  if( zProtocol==0
8930: 20 7c 7c 20 73 74 72 6e 63 6d 70 28 7a 50 72 6f   || strncmp(zPro
8940: 74 6f 63 6f 6c 2c 22 48 54 54 50 2f 22 2c 35 29  tocol,"HTTP/",5)
8950: 21 3d 30 20 7c 7c 20 73 74 72 6c 65 6e 28 7a 50  !=0 || strlen(zP
8960: 72 6f 74 6f 63 6f 6c 29 21 3d 38 20 29 7b 0a 20  rotocol)!=8 ){. 
8970: 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65     StartResponse
8980: 28 22 34 30 30 20 42 61 64 20 52 65 71 75 65 73  ("400 Bad Reques
8990: 74 22 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d  t");.    nOut +=
89a0: 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22   printf(.      "
89b0: 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65  Content-type: te
89c0: 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20  xt/plain\r\n".  
89d0: 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 20      "\r\n".     
89e0: 20 22 54 68 69 73 20 73 65 72 76 65 72 20 64 6f   "This server do
89f0: 65 73 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e  es not understan
8a00: 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  d the requested 
8a10: 70 72 6f 74 6f 63 6f 6c 5c 6e 22 0a 20 20 20 20  protocol\n".    
8a20: 29 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e  );.    MakeLogEn
8a30: 74 72 79 28 30 29 3b 0a 20 20 20 20 65 78 69 74  try(0);.    exit
8a40: 28 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  (0);.  }.  if( z
8a50: 53 63 72 69 70 74 5b 30 5d 3d 3d 30 20 29 20 4e  Script[0]==0 ) N
8a60: 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f  otFound(__LINE__
8a70: 29 3b 0a 20 20 69 66 28 20 66 6f 72 63 65 43 6c  );.  if( forceCl
8a80: 6f 73 65 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65  ose ){.    close
8a90: 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 31 3b 0a  Connection = 1;.
8aa0: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 72 6f    }else if( zPro
8ab0: 74 6f 63 6f 6c 5b 35 5d 3c 27 31 27 20 7c 7c 20  tocol[5]<'1' || 
8ac0: 7a 50 72 6f 74 6f 63 6f 6c 5b 37 5d 3c 27 31 27  zProtocol[7]<'1'
8ad0: 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 43 6f 6e   ){.    closeCon
8ae0: 6e 65 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d  nection = 1;.  }
8af0: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 76 65 72 79  ..  /* This very
8b00: 20 73 69 6d 70 6c 65 20 73 65 72 76 65 72 20 6f   simple server o
8b10: 6e 6c 79 20 75 6e 64 65 72 73 74 61 6e 64 73 20  nly understands 
8b20: 74 68 65 20 47 45 54 2c 20 50 4f 53 54 0a 20 20  the GET, POST.  
8b30: 2a 2a 20 61 6e 64 20 48 45 41 44 20 6d 65 74 68  ** and HEAD meth
8b40: 6f 64 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ods.  */.  if( s
8b50: 74 72 63 6d 70 28 7a 4d 65 74 68 6f 64 2c 22 47  trcmp(zMethod,"G
8b60: 45 54 22 29 21 3d 30 20 26 26 20 73 74 72 63 6d  ET")!=0 && strcm
8b70: 70 28 7a 4d 65 74 68 6f 64 2c 22 50 4f 53 54 22  p(zMethod,"POST"
8b80: 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20 73  )!=0.       && s
8b90: 74 72 63 6d 70 28 7a 4d 65 74 68 6f 64 2c 22 48  trcmp(zMethod,"H
8ba0: 45 41 44 22 29 21 3d 30 20 29 7b 0a 20 20 20 20  EAD")!=0 ){.    
8bb0: 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 35  StartResponse("5
8bc0: 30 31 20 4e 6f 74 20 49 6d 70 6c 65 6d 65 6e 74  01 Not Implement
8bd0: 65 64 22 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b  ed");.    nOut +
8be0: 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  = printf(.      
8bf0: 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74  "Content-type: t
8c00: 65 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20  ext/plain\r\n". 
8c10: 20 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20       "\r\n".    
8c20: 20 20 22 54 68 65 20 25 73 20 6d 65 74 68 6f 64    "The %s method
8c30: 20 69 73 20 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e   is not implemen
8c40: 74 65 64 20 6f 6e 20 74 68 69 73 20 73 65 72 76  ted on this serv
8c50: 65 72 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 7a 4d  er.\n",.      zM
8c60: 65 74 68 6f 64 29 3b 0a 20 20 20 20 4d 61 6b 65  ethod);.    Make
8c70: 4c 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20 20 20  LogEntry(0);.   
8c80: 20 65 78 69 74 28 30 29 3b 0a 20 20 7d 0a 0a 20   exit(0);.  }.. 
8c90: 20 2f 2a 20 47 65 74 20 61 6c 6c 20 74 68 65 20   /* Get all the 
8ca0: 6f 70 74 69 6f 6e 61 6c 20 66 69 65 6c 64 73 20  optional fields 
8cb0: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 65 20  that follow the 
8cc0: 66 69 72 73 74 20 6c 69 6e 65 2e 0a 20 20 2a 2f  first line..  */
8cd0: 0a 20 20 7a 43 6f 6f 6b 69 65 20 3d 20 30 3b 0a  .  zCookie = 0;.
8ce0: 20 20 7a 41 75 74 68 54 79 70 65 20 3d 20 30 3b    zAuthType = 0;
8cf0: 0a 20 20 7a 52 65 6d 6f 74 65 55 73 65 72 20 3d  .  zRemoteUser =
8d00: 20 30 3b 0a 20 20 7a 52 65 66 65 72 65 72 20 3d   0;.  zReferer =
8d10: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65   0;.  while( fge
8d20: 74 73 28 7a 4c 69 6e 65 2c 73 69 7a 65 6f 66 28  ts(zLine,sizeof(
8d30: 7a 4c 69 6e 65 29 2c 73 74 64 69 6e 29 20 29 7b  zLine),stdin) ){
8d40: 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69 65 6c  .    char *zFiel
8d50: 64 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20  dName;.    char 
8d60: 2a 7a 56 61 6c 3b 0a 0a 20 20 20 20 6e 49 6e 20  *zVal;..    nIn 
8d70: 2b 3d 20 73 74 72 6c 65 6e 28 7a 4c 69 6e 65 29  += strlen(zLine)
8d80: 3b 0a 20 20 20 20 7a 46 69 65 6c 64 4e 61 6d 65  ;.    zFieldName
8d90: 20 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65   = GetFirstEleme
8da0: 6e 74 28 7a 4c 69 6e 65 2c 26 7a 56 61 6c 29 3b  nt(zLine,&zVal);
8db0: 0a 20 20 20 20 69 66 28 20 7a 46 69 65 6c 64 4e  .    if( zFieldN
8dc0: 61 6d 65 3d 3d 30 20 7c 7c 20 2a 7a 46 69 65 6c  ame==0 || *zFiel
8dd0: 64 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b  dName==0 ) break
8de0: 3b 0a 20 20 20 20 52 65 6d 6f 76 65 4e 65 77 6c  ;.    RemoveNewl
8df0: 69 6e 65 28 7a 56 61 6c 29 3b 0a 20 20 20 20 69  ine(zVal);.    i
8e00: 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46  f( strcasecmp(zF
8e10: 69 65 6c 64 4e 61 6d 65 2c 22 55 73 65 72 2d 41  ieldName,"User-A
8e20: 67 65 6e 74 3a 22 29 3d 3d 30 20 29 7b 0a 20 20  gent:")==0 ){.  
8e30: 20 20 20 20 7a 41 67 65 6e 74 20 3d 20 53 74 72      zAgent = Str
8e40: 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d  Dup(zVal);.    }
8e50: 65 6c 73 65 20 69 66 28 20 73 74 72 63 61 73 65  else if( strcase
8e60: 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22  cmp(zFieldName,"
8e70: 41 63 63 65 70 74 3a 22 29 3d 3d 30 20 29 7b 0a  Accept:")==0 ){.
8e80: 20 20 20 20 20 20 7a 41 63 63 65 70 74 20 3d 20        zAccept = 
8e90: 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20  StrDup(zVal);.  
8ea0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
8eb0: 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d  asecmp(zFieldNam
8ec0: 65 2c 22 43 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74  e,"Content-lengt
8ed0: 68 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  h:")==0 ){.     
8ee0: 20 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 20   zContentLength 
8ef0: 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a  = StrDup(zVal);.
8f00: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
8f10: 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e  rcasecmp(zFieldN
8f20: 61 6d 65 2c 22 43 6f 6e 74 65 6e 74 2d 74 79 70  ame,"Content-typ
8f30: 65 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  e:")==0 ){.     
8f40: 20 7a 43 6f 6e 74 65 6e 74 54 79 70 65 20 3d 20   zContentType = 
8f50: 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20  StrDup(zVal);.  
8f60: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
8f70: 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d  asecmp(zFieldNam
8f80: 65 2c 22 52 65 66 65 72 65 72 3a 22 29 3d 3d 30  e,"Referer:")==0
8f90: 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 66 65 72   ){.      zRefer
8fa0: 65 72 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c  er = StrDup(zVal
8fb0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
8fc0: 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65   strcasecmp(zFie
8fd0: 6c 64 4e 61 6d 65 2c 22 43 6f 6f 6b 69 65 3a 22  ldName,"Cookie:"
8fe0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 43  )==0 ){.      zC
8ff0: 6f 6f 6b 69 65 20 3d 20 53 74 72 41 70 70 65 6e  ookie = StrAppen
9000: 64 28 7a 43 6f 6f 6b 69 65 2c 22 3b 20 22 2c 7a  d(zCookie,"; ",z
9010: 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Val);.    }else 
9020: 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a  if( strcasecmp(z
9030: 46 69 65 6c 64 4e 61 6d 65 2c 22 43 6f 6e 6e 65  FieldName,"Conne
9040: 63 74 69 6f 6e 3a 22 29 3d 3d 30 20 29 7b 0a 20  ction:")==0 ){. 
9050: 20 20 20 20 20 69 66 28 20 73 74 72 63 61 73 65       if( strcase
9060: 63 6d 70 28 7a 56 61 6c 2c 22 63 6c 6f 73 65 22  cmp(zVal,"close"
9070: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
9080: 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20  closeConnection 
9090: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
90a0: 20 69 66 28 20 21 66 6f 72 63 65 43 6c 6f 73 65   if( !forceClose
90b0: 20 26 26 20 73 74 72 63 61 73 65 63 6d 70 28 7a   && strcasecmp(z
90c0: 56 61 6c 2c 20 22 6b 65 65 70 2d 61 6c 69 76 65  Val, "keep-alive
90d0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
90e0: 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e   closeConnection
90f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
9100: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
9110: 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d  asecmp(zFieldNam
9120: 65 2c 22 48 6f 73 74 3a 22 29 3d 3d 30 20 29 7b  e,"Host:")==0 ){
9130: 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 53 71 75  .      int inSqu
9140: 61 72 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  are = 0;.      c
9150: 68 61 72 20 63 3b 0a 20 20 20 20 20 20 7a 48 74  har c;.      zHt
9160: 74 70 48 6f 73 74 20 3d 20 53 74 72 44 75 70 28  tpHost = StrDup(
9170: 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 7a 53 65  zVal);.      zSe
9180: 72 76 65 72 50 6f 72 74 20 3d 20 7a 53 65 72 76  rverPort = zServ
9190: 65 72 4e 61 6d 65 20 3d 20 53 74 72 44 75 70 28  erName = StrDup(
91a0: 7a 48 74 74 70 48 6f 73 74 29 3b 0a 20 20 20 20  zHttpHost);.    
91b0: 20 20 77 68 69 6c 65 28 20 7a 53 65 72 76 65 72    while( zServer
91c0: 50 6f 72 74 20 26 26 20 28 63 20 3d 20 2a 7a 53  Port && (c = *zS
91d0: 65 72 76 65 72 50 6f 72 74 29 21 3d 30 0a 20 20  erverPort)!=0.  
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
91f0: 63 21 3d 27 3a 27 20 7c 7c 20 69 6e 53 71 75 61  c!=':' || inSqua
9200: 72 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  re) ){.        i
9210: 66 28 20 63 3d 3d 27 5b 27 20 29 20 69 6e 53 71  f( c=='[' ) inSq
9220: 75 61 72 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  uare = 1;.      
9230: 20 20 69 66 28 20 63 3d 3d 27 5d 27 20 29 20 69    if( c==']' ) i
9240: 6e 53 71 75 61 72 65 20 3d 20 30 3b 0a 20 20 20  nSquare = 0;.   
9250: 20 20 20 20 20 7a 53 65 72 76 65 72 50 6f 72 74       zServerPort
9260: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
9270: 20 20 69 66 28 20 7a 53 65 72 76 65 72 50 6f 72    if( zServerPor
9280: 74 20 26 26 20 2a 7a 53 65 72 76 65 72 50 6f 72  t && *zServerPor
9290: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 7a 53  t ){.        *zS
92a0: 65 72 76 65 72 50 6f 72 74 20 3d 20 30 3b 0a 20  erverPort = 0;. 
92b0: 20 20 20 20 20 20 20 7a 53 65 72 76 65 72 50 6f         zServerPo
92c0: 72 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rt++;.      }.  
92d0: 20 20 20 20 69 66 28 20 7a 52 65 61 6c 50 6f 72      if( zRealPor
92e0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 65  t ){.        zSe
92f0: 72 76 65 72 50 6f 72 74 20 3d 20 53 74 72 44 75  rverPort = StrDu
9300: 70 28 7a 52 65 61 6c 50 6f 72 74 29 3b 0a 20 20  p(zRealPort);.  
9310: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
9320: 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a  if( strcasecmp(z
9330: 46 69 65 6c 64 4e 61 6d 65 2c 22 41 75 74 68 6f  FieldName,"Autho
9340: 72 69 7a 61 74 69 6f 6e 3a 22 29 3d 3d 30 20 29  rization:")==0 )
9350: 7b 0a 20 20 20 20 20 20 7a 41 75 74 68 54 79 70  {.      zAuthTyp
9360: 65 20 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d  e = GetFirstElem
9370: 65 6e 74 28 53 74 72 44 75 70 28 7a 56 61 6c 29  ent(StrDup(zVal)
9380: 2c 20 26 7a 41 75 74 68 41 72 67 29 3b 0a 20 20  , &zAuthArg);.  
9390: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 69    }.  }..  /* Di
93a0: 73 61 6c 6c 6f 77 20 72 65 66 65 72 72 69 6e 67  sallow referring
93b0: 20 66 72 6f 6d 20 63 65 72 74 61 69 6e 20 63 6c   from certain cl
93c0: 69 65 6e 74 73 20 2a 2f 0a 20 20 69 66 28 20 7a  ients */.  if( z
93d0: 41 67 65 6e 74 20 29 7b 0a 20 20 20 20 69 66 28  Agent ){.    if(
93e0: 20 73 74 72 73 74 72 28 7a 41 67 65 6e 74 2c 20   strstr(zAgent, 
93f0: 22 57 69 6e 64 6f 77 73 5f 39 22 29 21 3d 30 0a  "Windows_9")!=0.
9400: 20 20 20 20 20 7c 7c 20 73 74 72 73 74 72 28 7a       || strstr(z
9410: 41 67 65 6e 74 2c 20 22 44 6f 77 6e 6c 6f 61 64  Agent, "Download
9420: 5f 4d 61 73 74 65 72 22 29 21 3d 30 0a 20 20 20  _Master")!=0.   
9430: 20 20 7c 7c 20 73 74 72 73 74 72 28 7a 41 67 65    || strstr(zAge
9440: 6e 74 2c 20 22 45 7a 6f 6f 6d 73 2f 22 29 21 3d  nt, "Ezooms/")!=
9450: 30 0a 20 20 20 2f 2a 7c 7c 20 73 74 72 73 74 72  0.   /*|| strstr
9460: 28 7a 41 67 65 6e 74 2c 20 22 62 69 6e 67 62 6f  (zAgent, "bingbo
9470: 74 22 29 21 3d 30 2a 2f 0a 20 20 20 20 20 7c 7c  t")!=0*/.     ||
9480: 20 73 74 72 73 74 72 28 7a 41 67 65 6e 74 2c 20   strstr(zAgent, 
9490: 22 41 68 72 65 66 73 42 6f 74 22 29 21 3d 30 0a  "AhrefsBot")!=0.
94a0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 46 6f 72      ){.      For
94b0: 62 69 64 64 65 6e 28 29 3b 0a 20 20 20 20 7d 0a  bidden();.    }.
94c0: 20 20 7d 0a 23 69 66 20 30 0a 20 20 69 66 28 20    }.#if 0.  if( 
94d0: 7a 52 65 66 65 72 65 72 20 29 7b 0a 20 20 20 20  zReferer ){.    
94e0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
94f0: 72 20 2a 61 7a 44 69 73 61 6c 6c 6f 77 5b 5d 20  r *azDisallow[] 
9500: 3d 20 7b 0a 20 20 20 20 20 20 22 73 6b 69 64 72  = {.      "skidr
9510: 6f 77 63 72 61 63 6b 2e 63 6f 6d 22 2c 0a 20 20  owcrack.com",.  
9520: 20 20 20 20 22 68 6f 73 68 69 79 75 75 67 69 2e      "hoshiyuugi.
9530: 74 69 73 74 6f 72 79 2e 63 6f 6d 22 2c 0a 20 20  tistory.com",.  
9540: 20 20 20 20 22 73 6b 69 64 72 6f 77 67 61 6d 65      "skidrowgame
9550: 73 2e 6e 65 74 22 2c 0a 20 20 20 20 7d 3b 0a 20  s.net",.    };. 
9560: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
9570: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
9580: 61 7a 44 69 73 61 6c 6c 6f 77 29 2f 73 69 7a 65  azDisallow)/size
9590: 6f 66 28 61 7a 44 69 73 61 6c 6c 6f 77 5b 30 5d  of(azDisallow[0]
95a0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
95b0: 66 28 20 73 74 72 73 74 72 28 7a 52 65 66 65 72  f( strstr(zRefer
95c0: 65 72 2c 20 61 7a 44 69 73 61 6c 6c 6f 77 5b 69  er, azDisallow[i
95d0: 5d 29 21 3d 30 20 29 20 4e 6f 74 46 6f 75 6e 64  ])!=0 ) NotFound
95e0: 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20  (__LINE__);.    
95f0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
9600: 2f 2a 20 4d 61 6b 65 20 61 6e 20 65 78 74 72 61  /* Make an extra
9610: 20 65 66 66 6f 72 74 20 74 6f 20 67 65 74 20 61   effort to get a
9620: 20 76 61 6c 69 64 20 73 65 72 76 65 72 20 6e 61   valid server na
9630: 6d 65 20 61 6e 64 20 70 6f 72 74 20 6e 75 6d 62  me and port numb
9640: 65 72 2e 0a 20 20 2a 2a 20 4f 6e 6c 79 20 4e 65  er..  ** Only Ne
9650: 74 73 63 61 70 65 20 70 72 6f 76 69 64 65 73 20  tscape provides 
9660: 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  this information
9670: 2e 20 20 49 66 20 74 68 65 20 62 72 6f 77 73 65  .  If the browse
9680: 72 20 69 73 0a 20 20 2a 2a 20 49 6e 74 65 72 6e  r is.  ** Intern
9690: 65 74 20 45 78 70 6c 6f 72 65 72 2c 20 74 68 65  et Explorer, the
96a0: 6e 20 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e  n we have to fin
96b0: 64 20 6f 75 74 20 74 68 65 20 69 6e 66 6f 72 6d  d out the inform
96c0: 61 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 6f  ation for.  ** o
96d0: 75 72 73 65 6c 76 65 73 2e 0a 20 20 2a 2f 0a 20  urselves..  */. 
96e0: 20 69 66 28 20 7a 53 65 72 76 65 72 4e 61 6d 65   if( zServerName
96f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53 65 72 76  ==0 ){.    zServ
9700: 65 72 4e 61 6d 65 20 3d 20 53 61 66 65 4d 61 6c  erName = SafeMal
9710: 6c 6f 63 28 20 31 30 30 20 29 3b 0a 20 20 20 20  loc( 100 );.    
9720: 67 65 74 68 6f 73 74 6e 61 6d 65 28 7a 53 65 72  gethostname(zSer
9730: 76 65 72 4e 61 6d 65 2c 31 30 30 29 3b 0a 20 20  verName,100);.  
9740: 7d 0a 20 20 69 66 28 20 7a 53 65 72 76 65 72 50  }.  if( zServerP
9750: 6f 72 74 3d 3d 30 20 7c 7c 20 2a 7a 53 65 72 76  ort==0 || *zServ
9760: 65 72 50 6f 72 74 3d 3d 30 20 29 7b 0a 20 20 20  erPort==0 ){.   
9770: 20 7a 53 65 72 76 65 72 50 6f 72 74 20 3d 20 44   zServerPort = D
9780: 45 46 41 55 4c 54 5f 50 4f 52 54 3b 0a 20 20 7d  EFAULT_PORT;.  }
9790: 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68  ..  /* Remove th
97a0: 65 20 71 75 65 72 79 20 73 74 72 69 6e 67 20 66  e query string f
97b0: 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74  rom the end of t
97c0: 68 65 20 72 65 71 75 65 73 74 65 64 20 66 69 6c  he requested fil
97d0: 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 7a 3d  e..  */.  for(z=
97e0: 7a 53 63 72 69 70 74 3b 20 2a 7a 20 26 26 20 2a  zScript; *z && *
97f0: 7a 21 3d 27 3f 27 3b 20 7a 2b 2b 29 7b 7d 0a 20  z!='?'; z++){}. 
9800: 20 69 66 28 20 2a 7a 3d 3d 27 3f 27 20 29 7b 0a   if( *z=='?' ){.
9810: 20 20 20 20 7a 51 75 65 72 79 53 75 66 66 69 78      zQuerySuffix
9820: 20 3d 20 53 74 72 44 75 70 28 7a 29 3b 0a 20 20   = StrDup(z);.  
9830: 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 7d 65 6c 73    *z = 0;.  }els
9840: 65 7b 0a 20 20 20 20 7a 51 75 65 72 79 53 75 66  e{.    zQuerySuf
9850: 66 69 78 20 3d 20 22 22 3b 0a 20 20 7d 0a 20 20  fix = "";.  }.  
9860: 7a 51 75 65 72 79 53 74 72 69 6e 67 20 3d 20 2a  zQueryString = *
9870: 7a 51 75 65 72 79 53 75 66 66 69 78 20 3f 20 26  zQuerySuffix ? &
9880: 7a 51 75 65 72 79 53 75 66 66 69 78 5b 31 5d 20  zQuerySuffix[1] 
9890: 3a 20 7a 51 75 65 72 79 53 75 66 66 69 78 3b 0a  : zQuerySuffix;.
98a0: 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 66  .  /* Create a f
98b0: 69 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ile to hold the 
98c0: 50 4f 53 54 20 71 75 65 72 79 20 64 61 74 61 2c  POST query data,
98d0: 20 69 66 20 61 6e 79 2e 20 20 57 65 20 68 61 76   if any.  We hav
98e0: 65 20 74 6f 0a 20 20 2a 2a 20 64 6f 20 69 74 20  e to.  ** do it 
98f0: 74 68 69 73 20 77 61 79 2e 20 20 57 65 20 63 61  this way.  We ca
9900: 6e 27 74 20 6a 75 73 74 20 70 61 73 73 20 74 68  n't just pass th
9910: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
9920: 72 20 64 6f 77 6e 20 74 6f 0a 20 20 2a 2a 20 74  r down to.  ** t
9930: 68 65 20 63 68 69 6c 64 20 70 72 6f 63 65 73 73  he child process
9940: 20 62 65 63 61 75 73 65 20 74 68 65 20 66 67 65   because the fge
9950: 74 73 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 61  ts() function ma
9960: 79 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20  y have already. 
9970: 20 2a 2a 20 72 65 61 64 20 70 61 72 74 20 6f 66   ** read part of
9980: 20 74 68 65 20 50 4f 53 54 20 64 61 74 61 20 69   the POST data i
9990: 6e 74 6f 20 69 74 73 20 69 6e 74 65 72 6e 61 6c  nto its internal
99a0: 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20   buffer..  */.  
99b0: 69 66 28 20 7a 4d 65 74 68 6f 64 5b 30 5d 3d 3d  if( zMethod[0]==
99c0: 27 50 27 20 26 26 20 7a 43 6f 6e 74 65 6e 74 4c  'P' && zContentL
99d0: 65 6e 67 74 68 21 3d 30 20 29 7b 0a 20 20 20 20  ength!=0 ){.    
99e0: 69 6e 74 20 6c 65 6e 20 3d 20 61 74 6f 69 28 7a  int len = atoi(z
99f0: 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 29 3b 0a  ContentLength);.
9a00: 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 3b 0a 20      FILE *out;. 
9a10: 20 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 20     char *zBuf;. 
9a20: 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 69     int n;..    i
9a30: 66 28 20 6c 65 6e 3e 4d 41 58 5f 43 4f 4e 54 45  f( len>MAX_CONTE
9a40: 4e 54 5f 4c 45 4e 47 54 48 20 29 7b 0a 20 20 20  NT_LENGTH ){.   
9a50: 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65     StartResponse
9a60: 28 22 35 30 30 20 52 65 71 75 65 73 74 20 74 6f  ("500 Request to
9a70: 6f 20 6c 61 72 67 65 22 29 3b 0a 20 20 20 20 20  o large");.     
9a80: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
9a90: 0a 20 20 20 20 20 20 20 20 22 43 6f 6e 74 65 6e  .        "Conten
9aa0: 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 70 6c 61  t-type: text/pla
9ab0: 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 20 20 20 20  in\r\n".        
9ac0: 22 5c 72 5c 6e 22 0a 20 20 20 20 20 20 20 20 22  "\r\n".        "
9ad0: 54 6f 6f 20 6d 75 63 68 20 50 4f 53 54 20 64 61  Too much POST da
9ae0: 74 61 5c 6e 22 0a 20 20 20 20 20 20 29 3b 0a 20  ta\n".      );. 
9af0: 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72       MakeLogEntr
9b00: 79 28 30 29 3b 0a 20 20 20 20 20 20 65 78 69 74  y(0);.      exit
9b10: 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  (0);.    }.    s
9b20: 70 72 69 6e 74 66 28 7a 54 6d 70 4e 61 6d 42 75  printf(zTmpNamBu
9b30: 66 2c 20 22 2f 74 6d 70 2f 2d 70 6f 73 74 2d 64  f, "/tmp/-post-d
9b40: 61 74 61 2d 58 58 58 58 58 58 22 29 3b 0a 20 20  ata-XXXXXX");.  
9b50: 20 20 7a 54 6d 70 4e 61 6d 20 3d 20 7a 54 6d 70    zTmpNam = zTmp
9b60: 4e 61 6d 42 75 66 3b 0a 20 20 20 20 6d 6b 73 74  NamBuf;.    mkst
9b70: 65 6d 70 28 7a 54 6d 70 4e 61 6d 29 3b 0a 20 20  emp(zTmpNam);.  
9b80: 20 20 6f 75 74 20 3d 20 66 6f 70 65 6e 28 7a 54    out = fopen(zT
9b90: 6d 70 4e 61 6d 2c 22 77 22 29 3b 0a 20 20 20 20  mpNam,"w");.    
9ba0: 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20  if( out==0 ){.  
9bb0: 20 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73      StartRespons
9bc0: 65 28 22 35 30 30 20 43 61 6e 6e 6f 74 20 63 72  e("500 Cannot cr
9bd0: 65 61 74 65 20 2f 74 6d 70 20 66 69 6c 65 22 29  eate /tmp file")
9be0: 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20  ;.      nOut += 
9bf0: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
9c00: 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74  "Content-type: t
9c10: 65 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20  ext/plain\r\n". 
9c20: 20 20 20 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20         "\r\n".  
9c30: 20 20 20 20 20 20 22 43 6f 75 6c 64 20 6e 6f 74        "Could not
9c40: 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20 66 6f 72   open \"%s\" for
9c50: 20 77 72 69 74 69 6e 67 5c 6e 22 2c 20 7a 54 6d   writing\n", zTm
9c60: 70 4e 61 6d 0a 20 20 20 20 20 20 29 3b 0a 20 20  pNam.      );.  
9c70: 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79      MakeLogEntry
9c80: 28 30 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28  (0);.      exit(
9c90: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42  0);.    }.    zB
9ca0: 75 66 20 3d 20 53 61 66 65 4d 61 6c 6c 6f 63 28  uf = SafeMalloc(
9cb0: 20 6c 65 6e 20 29 3b 0a 20 20 20 20 69 66 28 20   len );.    if( 
9cc0: 75 73 65 54 69 6d 65 6f 75 74 20 29 20 61 6c 61  useTimeout ) ala
9cd0: 72 6d 28 31 35 20 2b 20 6c 65 6e 2f 32 30 30 30  rm(15 + len/2000
9ce0: 29 3b 0a 20 20 20 20 6e 20 3d 20 66 72 65 61 64  );.    n = fread
9cf0: 28 7a 42 75 66 2c 31 2c 6c 65 6e 2c 73 74 64 69  (zBuf,1,len,stdi
9d00: 6e 29 3b 0a 20 20 20 20 6e 49 6e 20 2b 3d 20 6e  n);.    nIn += n
9d10: 3b 0a 20 20 20 20 66 77 72 69 74 65 28 7a 42 75  ;.    fwrite(zBu
9d20: 66 2c 31 2c 6e 2c 6f 75 74 29 3b 0a 20 20 20 20  f,1,n,out);.    
9d30: 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
9d40: 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 7d  fclose(out);.  }
9d50: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
9d60: 20 74 68 65 20 72 75 6e 6e 69 6e 67 20 74 69 6d   the running tim
9d70: 65 20 69 73 20 6e 6f 74 20 74 6f 6f 20 67 72 65  e is not too gre
9d80: 61 74 20 2a 2f 0a 20 20 69 66 28 20 75 73 65 54  at */.  if( useT
9d90: 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d 28 31  imeout ) alarm(1
9da0: 30 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72  0);..  /* Conver
9db0: 74 20 61 6c 6c 20 75 6e 75 73 75 61 6c 20 63 68  t all unusual ch
9dc0: 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20  aracters in the 
9dd0: 73 63 72 69 70 74 20 6e 61 6d 65 20 69 6e 74 6f  script name into
9de0: 20 22 5f 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   "_"..  **.  ** 
9df0: 54 68 69 73 20 69 73 20 61 20 64 65 66 65 6e 73  This is a defens
9e00: 65 20 61 67 61 69 6e 73 74 20 76 61 72 69 6f 75  e against variou
9e10: 73 20 61 74 74 61 63 6b 73 2c 20 58 53 53 20 61  s attacks, XSS a
9e20: 74 74 61 63 6b 73 20 69 6e 20 70 61 72 74 69 63  ttacks in partic
9e30: 75 6c 61 72 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ular..  */.  for
9e40: 28 7a 3d 7a 53 63 72 69 70 74 3b 20 2a 7a 3b 20  (z=zScript; *z; 
9e50: 7a 2b 2b 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e  z++){.    unsign
9e60: 65 64 20 63 68 61 72 20 63 20 3d 20 2a 28 75 6e  ed char c = *(un
9e70: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 3b 0a  signed char*)z;.
9e80: 20 20 20 20 69 66 28 20 28 63 26 30 78 38 30 29      if( (c&0x80)
9e90: 21 3d 30 20 7c 7c 20 21 61 6c 6c 6f 77 65 64 49  !=0 || !allowedI
9ea0: 6e 4e 61 6d 65 5b 63 5d 20 29 7b 0a 20 20 20 20  nName[c] ){.    
9eb0: 20 20 2a 7a 20 3d 20 27 5f 27 3b 0a 20 20 20 20    *z = '_';.    
9ec0: 20 20 69 66 28 20 63 3d 3d 27 25 27 20 26 26 20    if( c=='%' && 
9ed0: 7a 5b 31 5d 21 3d 30 20 26 26 20 7a 5b 32 5d 21  z[1]!=0 && z[2]!
9ee0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  =0 ){.        fo
9ef0: 72 28 69 3d 33 3b 20 28 7a 5b 69 2d 32 5d 20 3d  r(i=3; (z[i-2] =
9f00: 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b   z[i])!=0; i++){
9f10: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
9f20: 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 27 74 20    }..  /* Don't 
9f30: 61 6c 6c 6f 77 20 22 2f 2e 22 20 6f 72 20 22 2f  allow "/." or "/
9f40: 2d 22 20 74 6f 20 74 6f 20 6f 63 63 75 72 20 61  -" to to occur a
9f50: 6e 79 77 68 65 72 65 20 69 6e 20 74 68 65 20 65  nywhere in the e
9f60: 6e 74 69 74 79 20 6e 61 6d 65 2e 0a 20 20 2a 2a  ntity name..  **
9f70: 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 61   This prevents a
9f80: 74 74 61 63 6b 73 20 69 6e 76 6f 6c 76 69 6e 67  ttacks involving
9f90: 20 22 2e 2e 22 20 61 6e 64 20 61 6c 73 6f 20 61   ".." and also a
9fa0: 6c 6c 6f 77 73 20 75 73 20 74 6f 20 63 72 65 61  llows us to crea
9fb0: 74 65 0a 20 20 2a 2a 20 66 69 6c 65 73 20 61 6e  te.  ** files an
9fc0: 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 77 68  d directories wh
9fd0: 6f 73 65 20 6e 61 6d 65 73 20 62 65 67 69 6e 20  ose names begin 
9fe0: 77 69 74 68 20 22 2d 22 20 77 68 69 63 68 20 61  with "-" which a
9ff0: 72 65 20 69 6e 76 69 73 69 62 6c 65 0a 20 20 2a  re invisible.  *
a000: 2a 20 74 6f 20 74 68 65 20 77 65 62 73 65 72 76  * to the webserv
a010: 65 72 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 7a  er..  */.  for(z
a020: 3d 7a 53 63 72 69 70 74 3b 20 2a 7a 3b 20 7a 2b  =zScript; *z; z+
a030: 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  +){.    if( *z==
a040: 27 2f 27 20 26 26 20 28 7a 5b 31 5d 3d 3d 27 2e  '/' && (z[1]=='.
a050: 27 20 7c 7c 20 7a 5b 31 5d 3d 3d 27 2d 27 29 20  ' || z[1]=='-') 
a060: 29 7b 0a 20 20 20 20 20 20 20 4e 6f 74 46 6f 75  ){.       NotFou
a070: 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  nd(__LINE__);.  
a080: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
a090: 67 75 72 65 20 6f 75 74 20 77 68 61 74 20 74 68  gure out what th
a0a0: 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 66 69  e root of the fi
a0b0: 6c 65 73 79 73 74 65 6d 20 73 68 6f 75 6c 64 20  lesystem should 
a0c0: 62 65 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a  be.  If the.  **
a0d0: 20 48 54 54 50 5f 48 4f 53 54 20 70 61 72 61 6d   HTTP_HOST param
a0e0: 65 74 65 72 20 65 78 69 73 74 73 20 28 73 74 6f  eter exists (sto
a0f0: 72 65 64 20 69 6e 20 7a 48 74 74 70 48 6f 73 74  red in zHttpHost
a100: 29 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68  ) then remove th
a110: 65 0a 20 20 2a 2a 20 70 6f 72 74 20 6e 75 6d 62  e.  ** port numb
a120: 65 72 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  er from the end 
a130: 28 69 66 20 61 6e 79 29 2c 20 63 6f 6e 76 65 72  (if any), conver
a140: 74 20 61 6c 6c 20 63 68 61 72 61 63 74 65 72 73  t all characters
a150: 20 74 6f 20 6c 6f 77 65 72 0a 20 20 2a 2a 20 63   to lower.  ** c
a160: 61 73 65 2c 20 61 6e 64 20 63 6f 6e 76 65 72 74  ase, and convert
a170: 20 61 6c 6c 20 22 2e 22 20 74 6f 20 22 5f 22 2e   all "." to "_".
a180: 20 20 54 68 65 6e 20 74 72 79 20 74 6f 20 66 69    Then try to fi
a190: 6e 64 20 61 20 64 69 72 65 63 74 6f 72 79 0a 20  nd a directory. 
a1a0: 20 2a 2a 20 77 69 74 68 20 74 68 61 74 20 6e 61   ** with that na
a1b0: 6d 65 20 61 6e 64 20 74 68 65 20 65 78 74 65 6e  me and the exten
a1c0: 73 69 6f 6e 20 2e 77 65 62 73 69 74 65 2e 20 20  sion .website.  
a1d0: 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c 6f  If not found, lo
a1e0: 6f 6b 0a 20 20 2a 2a 20 66 6f 72 20 22 64 65 66  ok.  ** for "def
a1f0: 61 75 6c 74 2e 77 65 62 73 69 74 65 22 2e 0a 20  ault.website".. 
a200: 20 2a 2f 0a 20 20 69 66 28 20 7a 53 63 72 69 70   */.  if( zScrip
a210: 74 5b 30 5d 21 3d 27 2f 27 20 29 20 4e 6f 74 46  t[0]!='/' ) NotF
a220: 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  ound(__LINE__);.
a230: 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 52 6f    if( strlen(zRo
a240: 6f 74 29 2b 34 30 20 3e 3d 20 73 69 7a 65 6f 66  ot)+40 >= sizeof
a250: 28 7a 4c 69 6e 65 29 20 29 20 4e 6f 74 46 6f 75  (zLine) ) NotFou
a260: 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  nd(__LINE__);.  
a270: 69 66 28 20 7a 48 74 74 70 48 6f 73 74 3d 3d 30  if( zHttpHost==0
a280: 20 7c 7c 20 7a 48 74 74 70 48 6f 73 74 5b 30 5d   || zHttpHost[0]
a290: 3d 3d 30 20 29 7b 0a 20 20 20 20 4e 6f 74 46 6f  ==0 ){.    NotFo
a2a0: 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  und(__LINE__);. 
a2b0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6c 65   }else if( strle
a2c0: 6e 28 7a 48 74 74 70 48 6f 73 74 29 2b 73 74 72  n(zHttpHost)+str
a2d0: 6c 65 6e 28 7a 52 6f 6f 74 29 2b 31 30 20 3e 3d  len(zRoot)+10 >=
a2e0: 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 20 29   sizeof(zLine) )
a2f0: 7b 0a 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f  {.    NotFound(_
a300: 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73  _LINE__);.  }els
a310: 65 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  e{.    sprintf(z
a320: 4c 69 6e 65 2c 20 22 25 73 2f 25 73 22 2c 20 7a  Line, "%s/%s", z
a330: 52 6f 6f 74 2c 20 7a 48 74 74 70 48 6f 73 74 29  Root, zHttpHost)
a340: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 73 74 72 6c  ;.    for(i=strl
a350: 65 6e 28 7a 52 6f 6f 74 29 2b 31 3b 20 7a 4c 69  en(zRoot)+1; zLi
a360: 6e 65 5b 69 5d 20 26 26 20 7a 4c 69 6e 65 5b 69  ne[i] && zLine[i
a370: 5d 21 3d 27 3a 27 3b 20 69 2b 2b 29 7b 0a 20 20  ]!=':'; i++){.  
a380: 20 20 20 20 69 6e 74 20 63 20 3d 20 7a 4c 69 6e      int c = zLin
a390: 65 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  e[i];.      if( 
a3a0: 21 69 73 61 6c 6e 75 6d 28 63 29 20 29 7b 0a 20  !isalnum(c) ){. 
a3b0: 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 69 5d 20         zLine[i] 
a3c0: 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 7d 65 6c  = '_';.      }el
a3d0: 73 65 20 69 66 28 20 69 73 75 70 70 65 72 28 63  se if( isupper(c
a3e0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69  ) ){.        zLi
a3f0: 6e 65 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72 28  ne[i] = tolower(
a400: 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
a410: 7d 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a 4c  }.    strcpy(&zL
a420: 69 6e 65 5b 69 5d 2c 20 22 2e 77 65 62 73 69 74  ine[i], ".websit
a430: 65 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  e");.  }.  if( s
a440: 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62  tat(zLine,&statb
a450: 75 66 29 20 7c 7c 20 21 53 5f 49 53 44 49 52 28  uf) || !S_ISDIR(
a460: 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29  statbuf.st_mode)
a470: 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28   ){.    sprintf(
a480: 7a 4c 69 6e 65 2c 20 22 25 73 2f 64 65 66 61 75  zLine, "%s/defau
a490: 6c 74 2e 77 65 62 73 69 74 65 22 2c 20 7a 52 6f  lt.website", zRo
a4a0: 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 73 74 61  ot);.    if( sta
a4b0: 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75 66  t(zLine,&statbuf
a4c0: 29 20 7c 7c 20 21 53 5f 49 53 44 49 52 28 73 74  ) || !S_ISDIR(st
a4d0: 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29  atbuf.st_mode) )
a4e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 61 6e  {.      if( stan
a4f0: 64 61 6c 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20  dalone ){.      
a500: 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c    sprintf(zLine,
a510: 20 22 25 73 22 2c 20 7a 52 6f 6f 74 29 3b 0a 20   "%s", zRoot);. 
a520: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a530: 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c      NotFound(__L
a540: 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 7d 0a  INE__);.      }.
a550: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 48 6f 6d      }.  }.  zHom
a560: 65 20 3d 20 53 74 72 44 75 70 28 7a 4c 69 6e 65  e = StrDup(zLine
a570: 29 3b 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20  );..  /* Change 
a580: 64 69 72 65 63 74 6f 72 69 65 73 20 74 6f 20 74  directories to t
a590: 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 48  he root of the H
a5a0: 54 54 50 20 66 69 6c 65 73 79 73 74 65 6d 0a 20  TTP filesystem. 
a5b0: 20 2a 2f 0a 20 20 69 66 28 20 63 68 64 69 72 28   */.  if( chdir(
a5c0: 7a 48 6f 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zHome)!=0 ){.   
a5d0: 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30 5d   char zBuf[1000]
a5e0: 3b 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f  ;.    Malfunctio
a5f0: 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 63 61 6e  n(__LINE__, "can
a600: 6e 6f 74 20 63 68 64 69 72 20 74 6f 20 5b 25 73  not chdir to [%s
a610: 5d 20 66 72 6f 6d 20 5b 25 73 5d 22 2c 0a 20 20  ] from [%s]",.  
a620: 20 20 20 20 20 20 20 7a 48 6f 6d 65 2c 20 67 65         zHome, ge
a630: 74 63 77 64 28 7a 42 75 66 2c 39 39 39 29 29 3b  tcwd(zBuf,999));
a640: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
a650: 65 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74 68  e the file in th
a660: 65 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 57  e filesystem.  W
a670: 65 20 6d 69 67 68 74 20 68 61 76 65 20 74 6f 20  e might have to 
a680: 61 70 70 65 6e 64 0a 20 20 2a 2a 20 74 68 65 20  append.  ** the 
a690: 6e 61 6d 65 20 22 69 6e 64 65 78 2e 68 74 6d 6c  name "index.html
a6a0: 22 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 69  " in order to fi
a6b0: 6e 64 20 69 74 2e 20 20 41 6e 79 20 65 78 63 65  nd it.  Any exce
a6c0: 73 73 20 70 61 74 68 0a 20 20 2a 2a 20 69 6e 66  ss path.  ** inf
a6d0: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 70 75 74 20  ormation is put 
a6e0: 69 6e 74 6f 20 74 68 65 20 7a 50 61 74 68 49 6e  into the zPathIn
a6f0: 66 6f 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 2a  fo variable..  *
a700: 2f 0a 20 20 7a 4c 69 6e 65 5b 30 5d 20 3d 20 27  /.  zLine[0] = '
a710: 2e 27 3b 0a 20 20 69 20 3d 20 30 3b 0a 20 20 77  .';.  i = 0;.  w
a720: 68 69 6c 65 28 20 7a 53 63 72 69 70 74 5b 69 5d  hile( zScript[i]
a730: 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a   ){.    while( z
a740: 53 63 72 69 70 74 5b 69 5d 20 26 26 20 7a 53 63  Script[i] && zSc
a750: 72 69 70 74 5b 69 5d 21 3d 27 2f 27 20 29 7b 0a  ript[i]!='/' ){.
a760: 20 20 20 20 20 20 7a 4c 69 6e 65 5b 69 2b 31 5d        zLine[i+1]
a770: 20 3d 20 7a 53 63 72 69 70 74 5b 69 5d 3b 0a 20   = zScript[i];. 
a780: 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a       i++;.    }.
a790: 20 20 20 20 7a 4c 69 6e 65 5b 69 2b 31 5d 20 3d      zLine[i+1] =
a7a0: 20 30 3b 0a 20 20 20 20 69 66 28 20 73 74 61 74   0;.    if( stat
a7b0: 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75 66 29  (zLine,&statbuf)
a7c0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  !=0 ){.      int
a7d0: 20 73 74 69 6c 6c 53 65 61 72 63 68 69 6e 67 20   stillSearching 
a7e0: 3d 20 31 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  = 1;.      while
a7f0: 28 20 73 74 69 6c 6c 53 65 61 72 63 68 69 6e 67  ( stillSearching
a800: 20 26 26 20 69 3e 30 20 29 7b 0a 20 20 20 20 20   && i>0 ){.     
a810: 20 20 20 77 68 69 6c 65 28 20 69 3e 30 20 26 26     while( i>0 &&
a820: 20 7a 4c 69 6e 65 5b 69 5d 21 3d 27 2f 27 20 29   zLine[i]!='/' )
a830: 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20  { i--; }.       
a840: 20 73 74 72 63 70 79 28 26 7a 4c 69 6e 65 5b 69   strcpy(&zLine[i
a850: 5d 2c 20 22 2f 6e 6f 74 2d 66 6f 75 6e 64 2e 68  ], "/not-found.h
a860: 74 6d 6c 22 29 3b 0a 20 20 20 20 20 20 20 20 69  tml");.        i
a870: 66 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73  f( stat(zLine,&s
a880: 74 61 74 62 75 66 29 3d 3d 30 20 26 26 20 53 5f  tatbuf)==0 && S_
a890: 49 53 52 45 47 28 73 74 61 74 62 75 66 2e 73 74  ISREG(statbuf.st
a8a0: 5f 6d 6f 64 65 29 0a 20 20 20 20 20 20 20 20 20  _mode).         
a8b0: 20 20 20 26 26 20 61 63 63 65 73 73 28 7a 4c 69     && access(zLi
a8c0: 6e 65 2c 52 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20  ne,R_OK)==0 ){. 
a8d0: 20 20 20 20 20 20 20 20 20 7a 52 65 61 6c 53 63           zRealSc
a8e0: 72 69 70 74 20 3d 20 53 74 72 44 75 70 28 26 7a  ript = StrDup(&z
a8f0: 4c 69 6e 65 5b 31 5d 29 3b 0a 20 20 20 20 20 20  Line[1]);.      
a900: 20 20 20 20 52 65 64 69 72 65 63 74 28 7a 52 65      Redirect(zRe
a910: 61 6c 53 63 72 69 70 74 2c 20 31 29 3b 0a 20 20  alScript, 1);.  
a920: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
a930: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
a940: 20 20 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20           i--;.  
a950: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
a960: 20 20 20 20 20 20 69 66 28 20 73 74 69 6c 6c 53        if( stillS
a970: 65 61 72 63 68 69 6e 67 20 29 20 4e 6f 74 46 6f  earching ) NotFo
a980: 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  und(__LINE__);. 
a990: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a9a0: 7d 0a 20 20 20 20 69 66 28 20 53 5f 49 53 52 45  }.    if( S_ISRE
a9b0: 47 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64  G(statbuf.st_mod
a9c0: 65 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  e) ){.      if( 
a9d0: 61 63 63 65 73 73 28 7a 4c 69 6e 65 2c 52 5f 4f  access(zLine,R_O
a9e0: 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 4e 6f  K) ){.        No
a9f0: 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29  tFound(__LINE__)
aa00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
aa10: 7a 52 65 61 6c 53 63 72 69 70 74 20 3d 20 53 74  zRealScript = St
aa20: 72 44 75 70 28 26 7a 4c 69 6e 65 5b 31 5d 29 3b  rDup(&zLine[1]);
aa30: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
aa40: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 53 63 72    }.    if( zScr
aa50: 69 70 74 5b 69 5d 3d 3d 30 20 7c 7c 20 7a 53 63  ipt[i]==0 || zSc
aa60: 72 69 70 74 5b 69 2b 31 5d 3d 3d 30 20 29 7b 0a  ript[i+1]==0 ){.
aa70: 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a 4c        strcpy(&zL
aa80: 69 6e 65 5b 69 2b 31 5d 2c 22 2f 69 6e 64 65 78  ine[i+1],"/index
aa90: 2e 68 74 6d 6c 22 29 3b 0a 20 20 20 20 20 20 69  .html");.      i
aaa0: 66 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73  f( stat(zLine,&s
aab0: 74 61 74 62 75 66 29 21 3d 30 20 7c 7c 20 21 53  tatbuf)!=0 || !S
aac0: 5f 49 53 52 45 47 28 73 74 61 74 62 75 66 2e 73  _ISREG(statbuf.s
aad0: 74 5f 6d 6f 64 65 29 20 0a 20 20 20 20 20 20 7c  t_mode) .      |
aae0: 7c 20 61 63 63 65 73 73 28 7a 4c 69 6e 65 2c 52  | access(zLine,R
aaf0: 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20  _OK) ){.        
ab00: 73 74 72 63 70 79 28 26 7a 4c 69 6e 65 5b 69 2b  strcpy(&zLine[i+
ab10: 31 5d 2c 22 2f 69 6e 64 65 78 2e 63 67 69 22 29  1],"/index.cgi")
ab20: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74  ;.        if( st
ab30: 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75  at(zLine,&statbu
ab40: 66 29 21 3d 30 20 7c 7c 20 21 53 5f 49 53 52 45  f)!=0 || !S_ISRE
ab50: 47 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64  G(statbuf.st_mod
ab60: 65 29 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 61  e) .        || a
ab70: 63 63 65 73 73 28 7a 4c 69 6e 65 2c 52 5f 4f 4b  ccess(zLine,R_OK
ab80: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 4e  ) ){.          N
ab90: 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f  otFound(__LINE__
aba0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
abb0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 52 65 61 6c     }.      zReal
abc0: 53 63 72 69 70 74 20 3d 20 53 74 72 44 75 70 28  Script = StrDup(
abd0: 26 7a 4c 69 6e 65 5b 31 5d 29 3b 0a 20 20 20 20  &zLine[1]);.    
abe0: 20 20 69 66 28 20 7a 53 63 72 69 70 74 5b 69 5d    if( zScript[i]
abf0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
ac00: 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  * If the request
ac10: 65 64 20 55 52 4c 20 64 6f 65 73 20 6e 6f 74 20  ed URL does not 
ac20: 65 6e 64 20 77 69 74 68 20 22 2f 22 20 62 75 74  end with "/" but
ac30: 20 77 65 20 68 61 64 20 74 6f 0a 20 20 20 20 20   we had to.     
ac40: 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 22 69 6e     ** append "in
ac50: 64 65 78 2e 68 74 6d 6c 22 2c 20 74 68 65 6e 20  dex.html", then 
ac60: 61 20 72 65 64 69 72 65 63 74 20 69 73 20 6e 65  a redirect is ne
ac70: 63 65 73 73 61 72 79 2e 20 20 4f 74 68 65 72 77  cessary.  Otherw
ac80: 69 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  ise.        ** n
ac90: 6f 6e 65 20 6f 66 20 74 68 65 20 72 65 6c 61 74  one of the relat
aca0: 69 76 65 20 55 52 4c 73 20 69 6e 20 74 68 65 20  ive URLs in the 
acb0: 64 65 6c 69 76 65 72 65 64 20 64 6f 63 75 6d 65  delivered docume
acc0: 6e 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  nt will be.     
acd0: 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 2e 20 2a     ** correct. *
ace0: 2f 0a 20 20 20 20 20 20 20 20 52 65 64 69 72 65  /.        Redire
acf0: 63 74 28 7a 52 65 61 6c 53 63 72 69 70 74 2c 20  ct(zRealScript, 
ad00: 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  1);.        retu
ad10: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
ad20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ad30: 20 20 20 7a 4c 69 6e 65 5b 69 2b 31 5d 20 3d 20     zLine[i+1] = 
ad40: 7a 53 63 72 69 70 74 5b 69 5d 3b 0a 20 20 20 20  zScript[i];.    
ad50: 69 2b 2b 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  i++;.  }.  zFile
ad60: 20 3d 20 53 74 72 44 75 70 28 7a 4c 69 6e 65 29   = StrDup(zLine)
ad70: 3b 0a 20 20 7a 50 61 74 68 49 6e 66 6f 20 3d 20  ;.  zPathInfo = 
ad80: 53 74 72 44 75 70 28 26 7a 53 63 72 69 70 74 5b  StrDup(&zScript[
ad90: 69 5d 29 3b 0a 20 20 6c 65 6e 46 69 6c 65 20 3d  i]);.  lenFile =
ada0: 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 3b 0a   strlen(zFile);.
adb0: 20 20 7a 44 69 72 20 3d 20 53 74 72 44 75 70 28    zDir = StrDup(
adc0: 7a 46 69 6c 65 29 3b 0a 20 20 66 6f 72 28 69 3d  zFile);.  for(i=
add0: 73 74 72 6c 65 6e 28 7a 44 69 72 29 2d 31 3b 20  strlen(zDir)-1; 
ade0: 69 3e 30 20 26 26 20 7a 44 69 72 5b 69 5d 21 3d  i>0 && zDir[i]!=
adf0: 27 2f 27 3b 20 69 2d 2d 29 7b 7d 3b 0a 20 20 69  '/'; i--){};.  i
ae00: 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( i==0 ){.     
ae10: 73 74 72 63 70 79 28 7a 44 69 72 2c 22 2f 22 29  strcpy(zDir,"/")
ae20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20  ;.  }else{.     
ae30: 7a 44 69 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d  zDir[i] = 0;.  }
ae40: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
ae50: 73 65 65 20 69 66 20 74 68 65 72 65 20 69 73 20  see if there is 
ae60: 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  an authorization
ae70: 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
ae80: 20 69 73 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 73   is,.  ** proces
ae90: 73 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 70 72  s it..  */.  spr
aea0: 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 25 73 2f  intf(zLine, "%s/
aeb0: 2d 61 75 74 68 22 2c 20 7a 44 69 72 29 3b 0a 20  -auth", zDir);. 
aec0: 20 69 66 28 20 61 63 63 65 73 73 28 7a 4c 69 6e   if( access(zLin
aed0: 65 2c 52 5f 4f 4b 29 3d 3d 30 20 26 26 20 21 43  e,R_OK)==0 && !C
aee0: 68 65 63 6b 42 61 73 69 63 41 75 74 68 6f 72 69  heckBasicAuthori
aef0: 7a 61 74 69 6f 6e 28 7a 4c 69 6e 65 29 20 29 20  zation(zLine) ) 
af00: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 61  return;..  /* Ta
af10: 6b 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 61  ke appropriate a
af20: 63 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66 28  ction.  */.  if(
af30: 20 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64   (statbuf.st_mod
af40: 65 20 26 20 30 31 30 30 29 3d 3d 30 31 30 30 20  e & 0100)==0100 
af50: 26 26 20 61 63 63 65 73 73 28 7a 46 69 6c 65 2c  && access(zFile,
af60: 58 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  X_OK)==0 ){.    
af70: 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  /*.    ** The fo
af80: 6c 6c 6f 77 69 6e 67 73 20 73 74 61 74 69 63 20  llowings static 
af90: 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 75 73  variables are us
afa0: 65 64 20 74 6f 20 73 65 74 75 70 20 74 68 65 20  ed to setup the 
afb0: 65 6e 76 69 72 6f 6e 6d 65 6e 74 0a 20 20 20 20  environment.    
afc0: 2a 2a 20 66 6f 72 20 74 68 65 20 43 47 49 20 73  ** for the CGI s
afd0: 63 72 69 70 74 0a 20 20 20 20 2a 2f 0a 20 20 20  cript.    */.   
afe0: 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 65   static char *de
aff0: 66 61 75 6c 74 5f 70 61 74 68 20 3d 20 22 2f 62  fault_path = "/b
b000: 69 6e 3a 2f 75 73 72 2f 62 69 6e 22 3b 0a 20 20  in:/usr/bin";.  
b010: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 67    static char *g
b020: 61 74 65 77 61 79 5f 69 6e 74 65 72 66 61 63 65  ateway_interface
b030: 20 3d 20 22 43 47 49 2f 31 2e 30 22 3b 0a 20 20   = "CGI/1.0";.  
b040: 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
b050: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45  {.      char *zE
b060: 6e 76 4e 61 6d 65 3b 0a 20 20 20 20 20 20 63 68  nvName;.      ch
b070: 61 72 20 2a 2a 70 7a 45 6e 76 56 61 6c 75 65 3b  ar **pzEnvValue;
b080: 0a 20 20 20 20 7d 20 63 67 69 65 6e 76 5b 5d 20  .    } cgienv[] 
b090: 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 41 55 54  = {.      { "AUT
b0a0: 48 5f 54 59 50 45 22 2c 20 20 20 20 20 20 20 20  H_TYPE",        
b0b0: 20 20 20 20 20 20 20 20 20 20 20 26 7a 41 75 74             &zAut
b0c0: 68 54 79 70 65 20 7d 2c 0a 20 20 20 20 20 20 7b  hType },.      {
b0d0: 20 22 41 55 54 48 5f 43 4f 4e 54 45 4e 54 22 2c   "AUTH_CONTENT",
b0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0f0: 26 7a 41 75 74 68 41 72 67 20 7d 2c 0a 20 20 20  &zAuthArg },.   
b100: 20 20 20 7b 20 22 43 4f 4e 54 45 4e 54 5f 4c 45     { "CONTENT_LE
b110: 4e 47 54 48 22 2c 20 20 20 20 20 20 20 20 20 20  NGTH",          
b120: 20 20 20 20 26 7a 43 6f 6e 74 65 6e 74 4c 65 6e      &zContentLen
b130: 67 74 68 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  gth },.      { "
b140: 43 4f 4e 54 45 4e 54 5f 54 59 50 45 22 2c 20 20  CONTENT_TYPE",  
b150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
b160: 43 6f 6e 74 65 6e 74 54 79 70 65 20 7d 2c 0a 20  ContentType },. 
b170: 20 20 20 20 20 7b 20 22 44 4f 43 55 4d 45 4e 54       { "DOCUMENT
b180: 5f 52 4f 4f 54 22 2c 20 20 20 20 20 20 20 20 20  _ROOT",         
b190: 20 20 20 20 20 20 26 7a 48 6f 6d 65 20 7d 2c 0a        &zHome },.
b1a0: 20 20 20 20 20 20 7b 20 22 47 41 54 45 57 41 59        { "GATEWAY
b1b0: 5f 49 4e 54 45 52 46 41 43 45 22 2c 20 20 20 20  _INTERFACE",    
b1c0: 20 20 20 20 20 20 20 26 67 61 74 65 77 61 79 5f         &gateway_
b1d0: 69 6e 74 65 72 66 61 63 65 20 7d 2c 0a 20 20 20  interface },.   
b1e0: 20 20 20 7b 20 22 48 54 54 50 5f 41 43 43 45 50     { "HTTP_ACCEP
b1f0: 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  T",             
b200: 20 20 20 20 26 7a 41 63 63 65 70 74 20 7d 2c 0a      &zAccept },.
b210: 20 20 20 20 20 20 7b 20 22 48 54 54 50 5f 43 4f        { "HTTP_CO
b220: 4f 4b 49 45 22 2c 20 20 20 20 20 20 20 20 20 20  OKIE",          
b230: 20 20 20 20 20 20 20 26 7a 43 6f 6f 6b 69 65 20         &zCookie 
b240: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 48 54 54 50  },.      { "HTTP
b250: 5f 48 4f 53 54 22 2c 20 20 20 20 20 20 20 20 20  _HOST",         
b260: 20 20 20 20 20 20 20 20 20 20 26 7a 48 74 74 70            &zHttp
b270: 48 6f 73 74 20 7d 2c 0a 20 20 20 20 20 20 7b 20  Host },.      { 
b280: 22 48 54 54 50 5f 52 45 46 45 52 45 52 22 2c 20  "HTTP_REFERER", 
b290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
b2a0: 7a 52 65 66 65 72 65 72 20 7d 2c 0a 20 20 20 20  zReferer },.    
b2b0: 20 20 7b 20 22 48 54 54 50 5f 55 53 45 52 5f 41    { "HTTP_USER_A
b2c0: 47 45 4e 54 22 2c 20 20 20 20 20 20 20 20 20 20  GENT",          
b2d0: 20 20 20 26 7a 41 67 65 6e 74 20 7d 2c 0a 20 20     &zAgent },.  
b2e0: 20 20 20 20 7b 20 22 50 41 54 48 22 2c 20 20 20      { "PATH",   
b2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b300: 20 20 20 20 20 26 64 65 66 61 75 6c 74 5f 70 61       &default_pa
b310: 74 68 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 50  th },.      { "P
b320: 41 54 48 5f 49 4e 46 4f 22 2c 20 20 20 20 20 20  ATH_INFO",      
b330: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 50               &zP
b340: 61 74 68 49 6e 66 6f 20 7d 2c 0a 20 20 20 20 20  athInfo },.     
b350: 20 7b 20 22 51 55 45 52 59 5f 53 54 52 49 4e 47   { "QUERY_STRING
b360: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
b370: 20 20 26 7a 51 75 65 72 79 53 74 72 69 6e 67 20    &zQueryString 
b380: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 52 45 4d 4f  },.      { "REMO
b390: 54 45 5f 41 44 44 52 22 2c 20 20 20 20 20 20 20  TE_ADDR",       
b3a0: 20 20 20 20 20 20 20 20 20 20 26 7a 52 65 6d 6f            &zRemo
b3b0: 74 65 41 64 64 72 20 7d 2c 0a 20 20 20 20 20 20  teAddr },.      
b3c0: 7b 20 22 52 45 51 55 45 53 54 5f 4d 45 54 48 4f  { "REQUEST_METHO
b3d0: 44 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  D",             
b3e0: 20 26 7a 4d 65 74 68 6f 64 20 7d 2c 0a 20 20 20   &zMethod },.   
b3f0: 20 20 20 7b 20 22 52 45 51 55 45 53 54 5f 55 52     { "REQUEST_UR
b400: 49 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  I",             
b410: 20 20 20 20 26 7a 53 63 72 69 70 74 20 7d 2c 0a      &zScript },.
b420: 20 20 20 20 20 20 7b 20 22 52 45 4d 4f 54 45 5f        { "REMOTE_
b430: 55 53 45 52 22 2c 20 20 20 20 20 20 20 20 20 20  USER",          
b440: 20 20 20 20 20 20 20 26 7a 52 65 6d 6f 74 65 55         &zRemoteU
b450: 73 65 72 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  ser },.      { "
b460: 53 43 52 49 50 54 5f 44 49 52 45 43 54 4f 52 59  SCRIPT_DIRECTORY
b470: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 26 7a  ",            &z
b480: 44 69 72 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  Dir },.      { "
b490: 53 43 52 49 50 54 5f 46 49 4c 45 4e 41 4d 45 22  SCRIPT_FILENAME"
b4a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a  ,             &z
b4b0: 46 69 6c 65 20 7d 2c 0a 20 20 20 20 20 20 7b 20  File },.      { 
b4c0: 22 53 43 52 49 50 54 5f 4e 41 4d 45 22 2c 20 20  "SCRIPT_NAME",  
b4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
b4e0: 7a 52 65 61 6c 53 63 72 69 70 74 20 7d 2c 0a 20  zRealScript },. 
b4f0: 20 20 20 20 20 7b 20 22 53 45 52 56 45 52 5f 4e       { "SERVER_N
b500: 41 4d 45 22 2c 20 20 20 20 20 20 20 20 20 20 20  AME",           
b510: 20 20 20 20 20 20 26 7a 53 65 72 76 65 72 4e 61        &zServerNa
b520: 6d 65 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  me },.      { "S
b530: 45 52 56 45 52 5f 50 4f 52 54 22 2c 20 20 20 20  ERVER_PORT",    
b540: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 53               &zS
b550: 65 72 76 65 72 50 6f 72 74 20 7d 2c 0a 20 20 20  erverPort },.   
b560: 20 20 20 7b 20 22 53 45 52 56 45 52 5f 50 52 4f     { "SERVER_PRO
b570: 54 4f 43 4f 4c 22 2c 20 20 20 20 20 20 20 20 20  TOCOL",         
b580: 20 20 20 20 26 7a 50 72 6f 74 6f 63 6f 6c 20 7d      &zProtocol }
b590: 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 68 61  ,.    };.    cha
b5a0: 72 20 2a 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65  r *zBaseFilename
b5b0: 3b 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20  ;   /* Filename 
b5c0: 77 69 74 68 6f 75 74 20 64 69 72 65 63 74 6f 72  without director
b5d0: 79 20 70 72 65 66 69 78 20 2a 2f 0a 0a 20 20 20  y prefix */..   
b5e0: 20 2f 2a 20 49 66 20 69 74 73 20 65 78 65 63 75   /* If its execu
b5f0: 74 61 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62  table, it must b
b600: 65 20 61 20 43 47 49 20 70 72 6f 67 72 61 6d 2e  e a CGI program.
b610: 20 20 53 74 61 72 74 20 62 79 0a 20 20 20 20 2a    Start by.    *
b620: 2a 20 63 68 61 6e 67 69 6e 67 20 64 69 72 65 63  * changing direc
b630: 74 6f 72 69 65 73 20 74 6f 20 74 68 65 20 64 69  tories to the di
b640: 72 65 63 74 6f 72 79 20 68 6f 6c 64 69 6e 67 20  rectory holding 
b650: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20  the program..   
b660: 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 68 64 69   */.    if( chdi
b670: 72 28 7a 44 69 72 29 20 29 7b 0a 20 20 20 20 20  r(zDir) ){.     
b680: 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30 5d   char zBuf[1000]
b690: 3b 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74  ;.      Malfunct
b6a0: 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 63  ion(__LINE__, "c
b6b0: 61 6e 6e 6f 74 20 63 68 64 69 72 20 74 6f 20 5b  annot chdir to [
b6c0: 25 73 5d 20 66 72 6f 6d 20 5b 25 73 5d 22 2c 20  %s] from [%s]", 
b6d0: 0a 20 20 20 20 20 20 20 20 20 20 20 7a 44 69 72  .           zDir
b6e0: 2c 20 67 65 74 63 77 64 28 7a 42 75 66 2c 39 39  , getcwd(zBuf,99
b6f0: 39 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  9));.    }..    
b700: 2f 2a 20 53 65 74 75 70 20 74 68 65 20 65 6e 76  /* Setup the env
b710: 69 72 6f 6e 6d 65 6e 74 20 61 70 70 72 6f 70 72  ironment appropr
b720: 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20  iately..    */. 
b730: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 69     for(i=0; i<(i
b740: 6e 74 29 28 73 69 7a 65 6f 66 28 63 67 69 65 6e  nt)(sizeof(cgien
b750: 76 29 2f 73 69 7a 65 6f 66 28 63 67 69 65 6e 76  v)/sizeof(cgienv
b760: 5b 30 5d 29 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  [0])); i++){.   
b770: 20 20 20 69 66 28 20 2a 63 67 69 65 6e 76 5b 69     if( *cgienv[i
b780: 5d 2e 70 7a 45 6e 76 56 61 6c 75 65 20 29 7b 0a  ].pzEnvValue ){.
b790: 20 20 20 20 20 20 20 20 53 65 74 45 6e 76 28 63          SetEnv(c
b7a0: 67 69 65 6e 76 5b 69 5d 2e 7a 45 6e 76 4e 61 6d  gienv[i].zEnvNam
b7b0: 65 2c 2a 63 67 69 65 6e 76 5b 69 5d 2e 70 7a 45  e,*cgienv[i].pzE
b7c0: 6e 76 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  nvValue);.      
b7d0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
b7e0: 75 73 65 48 74 74 70 73 20 29 7b 0a 20 20 20 20  useHttps ){.    
b7f0: 20 20 70 75 74 65 6e 76 28 22 48 54 54 50 53 3d    putenv("HTTPS=
b800: 6f 6e 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  on");.    }..   
b810: 20 2f 2a 0a 20 20 20 20 2a 2a 20 41 62 6f 72 74   /*.    ** Abort
b820: 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 69   with an error i
b830: 66 20 74 68 65 20 43 47 49 20 73 63 72 69 70 74  f the CGI script
b840: 20 69 73 20 77 72 69 74 61 62 6c 65 20 62 79 20   is writable by 
b850: 61 6e 79 6f 6e 65 20 6f 74 68 65 72 0a 20 20 20  anyone other.   
b860: 20 2a 2a 20 74 68 61 6e 20 69 74 73 20 6f 77 6e   ** than its own
b870: 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  er..    */.    i
b880: 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f  f( statbuf.st_mo
b890: 64 65 20 26 20 30 30 32 32 20 29 7b 0a 20 20 20  de & 0022 ){.   
b8a0: 20 20 20 43 67 69 53 63 72 69 70 74 57 72 69 74     CgiScriptWrit
b8b0: 61 62 6c 65 28 29 3b 0a 20 20 20 20 7d 0a 0a 20  able();.    }.. 
b8c0: 20 20 20 2f 2a 20 46 6f 72 20 74 68 65 20 50 4f     /* For the PO
b8d0: 53 54 20 6d 65 74 68 6f 64 20 61 6c 6c 20 69 6e  ST method all in
b8e0: 70 75 74 20 68 61 73 20 62 65 65 6e 20 77 72 69  put has been wri
b8f0: 74 74 65 6e 20 74 6f 20 61 20 74 65 6d 70 6f 72  tten to a tempor
b900: 61 72 79 20 66 69 6c 65 2c 0a 20 20 20 20 2a 2a  ary file,.    **
b910: 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 72   so we have to r
b920: 65 64 69 72 65 63 74 20 69 6e 70 75 74 20 74 6f  edirect input to
b930: 20 74 68 65 20 43 47 49 20 73 63 72 69 70 74 20   the CGI script 
b940: 66 72 6f 6d 20 74 68 61 74 20 66 69 6c 65 2e 0a  from that file..
b950: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a      */.    if( z
b960: 4d 65 74 68 6f 64 5b 30 5d 3d 3d 27 50 27 20 29  Method[0]=='P' )
b970: 7b 0a 20 20 20 20 20 20 64 75 70 28 30 29 3b 0a  {.      dup(0);.
b980: 20 20 20 20 20 20 63 6c 6f 73 65 28 30 29 3b 0a        close(0);.
b990: 20 20 20 20 20 20 6f 70 65 6e 28 7a 54 6d 70 4e        open(zTmpN
b9a0: 61 6d 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20  am, O_RDONLY);. 
b9b0: 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d     }..    for(i=
b9c0: 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2d 31 3b  strlen(zFile)-1;
b9d0: 20 69 3e 3d 30 20 26 26 20 7a 46 69 6c 65 5b 69   i>=0 && zFile[i
b9e0: 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20  ]!='/'; i--){}. 
b9f0: 20 20 20 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65     zBaseFilename
ba00: 20 3d 20 26 7a 46 69 6c 65 5b 69 2b 31 5d 3b 0a   = &zFile[i+1];.
ba10: 20 20 20 20 69 66 28 20 69 3e 3d 30 20 26 26 20      if( i>=0 && 
ba20: 73 74 72 6e 63 6d 70 28 7a 42 61 73 65 46 69 6c  strncmp(zBaseFil
ba30: 65 6e 61 6d 65 2c 22 6e 70 68 2d 22 2c 34 29 3d  ename,"nph-",4)=
ba40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
ba50: 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  f the name of th
ba60: 65 20 43 47 49 20 73 63 72 69 70 74 20 62 65 67  e CGI script beg
ba70: 69 6e 73 20 77 69 74 68 20 22 6e 70 68 2d 22 20  ins with "nph-" 
ba80: 74 68 65 6e 20 77 65 20 61 72 65 0a 20 20 20 20  then we are.    
ba90: 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74    ** dealing wit
baa0: 68 20 61 20 22 6e 6f 6e 2d 70 61 72 73 65 64 20  h a "non-parsed 
bab0: 68 65 61 64 65 72 73 22 20 43 47 49 20 73 63 72  headers" CGI scr
bac0: 69 70 74 2e 20 20 4a 75 73 74 20 65 78 65 63 28  ipt.  Just exec(
bad0: 29 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 64 69  ).      ** it di
bae0: 72 65 63 74 6c 79 20 61 6e 64 20 6c 65 74 20 69  rectly and let i
baf0: 74 20 68 61 6e 64 6c 65 20 61 6c 6c 20 69 74 73  t handle all its
bb00: 20 6f 77 6e 20 68 65 61 64 65 72 20 67 65 6e 65   own header gene
bb10: 72 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  ration..      */
bb20: 0a 20 20 20 20 20 20 65 78 65 63 6c 28 7a 42 61  .      execl(zBa
bb30: 73 65 46 69 6c 65 6e 61 6d 65 2c 7a 42 61 73 65  seFilename,zBase
bb40: 46 69 6c 65 6e 61 6d 65 2c 28 63 68 61 72 2a 29  Filename,(char*)
bb50: 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4e 4f 54  0);.      /* NOT
bb60: 45 3a 20 4e 6f 20 6c 6f 67 20 65 6e 74 72 79 20  E: No log entry 
bb70: 77 72 69 74 74 65 6e 20 66 6f 72 20 6e 70 68 2d  written for nph-
bb80: 20 73 63 72 69 70 74 73 20 2a 2f 0a 20 20 20 20   scripts */.    
bb90: 20 20 65 78 69 74 28 30 29 3b 0a 20 20 20 20 7d    exit(0);.    }
bba0: 0a 0a 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68  ..    /* Fall th
bbb0: 72 75 20 74 6f 20 68 65 72 65 20 6f 6e 6c 79 20  ru to here only 
bbc0: 69 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  if this process 
bbd0: 28 74 68 65 20 73 65 72 76 65 72 29 20 69 73 20  (the server) is 
bbe0: 67 6f 69 6e 67 0a 20 20 20 20 2a 2a 20 74 6f 20  going.    ** to 
bbf0: 72 65 61 64 20 61 6e 64 20 61 75 67 6d 65 6e 74  read and augment
bc00: 20 74 68 65 20 68 65 61 64 65 72 20 73 65 6e 74   the header sent
bc10: 20 62 61 63 6b 20 62 79 20 74 68 65 20 43 47 49   back by the CGI
bc20: 20 70 72 6f 63 65 73 73 2e 0a 20 20 20 20 2a 2a   process..    **
bc30: 20 4f 70 65 6e 20 61 20 70 69 70 65 20 74 6f 20   Open a pipe to 
bc40: 72 65 63 65 69 76 65 20 74 68 65 20 6f 75 74 70  receive the outp
bc50: 75 74 20 66 72 6f 6d 20 74 68 65 20 43 47 49 20  ut from the CGI 
bc60: 70 72 6f 63 65 73 73 2e 20 20 54 68 65 6e 0a 20  process.  Then. 
bc70: 20 20 20 2a 2a 20 66 6f 72 6b 20 74 68 65 20 43     ** fork the C
bc80: 47 49 20 70 72 6f 63 65 73 73 2e 20 20 4f 6e 63  GI process.  Onc
bc90: 65 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  e everything is 
bca0: 64 6f 6e 65 2c 20 77 65 20 73 68 6f 75 6c 64 20  done, we should 
bcb0: 62 65 0a 20 20 20 20 2a 2a 20 61 62 6c 65 20 74  be.    ** able t
bcc0: 6f 20 72 65 61 64 20 74 68 65 20 6f 75 74 70 75  o read the outpu
bcd0: 74 20 6f 66 20 43 47 49 20 6f 6e 20 74 68 65 20  t of CGI on the 
bce0: 22 69 6e 22 20 73 74 72 65 61 6d 2e 0a 20 20 20  "in" stream..   
bcf0: 20 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20   */.    {.      
bd00: 69 6e 74 20 70 78 5b 32 5d 3b 0a 20 20 20 20 20  int px[2];.     
bd10: 20 70 69 70 65 28 70 78 29 3b 0a 20 20 20 20 20   pipe(px);.     
bd20: 20 69 66 28 20 66 6f 72 6b 28 29 3d 3d 30 20 29   if( fork()==0 )
bd30: 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28  {.        close(
bd40: 70 78 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20  px[0]);.        
bd50: 63 6c 6f 73 65 28 31 29 3b 0a 20 20 20 20 20 20  close(1);.      
bd60: 20 20 64 75 70 28 70 78 5b 31 5d 29 3b 0a 20 20    dup(px[1]);.  
bd70: 20 20 20 20 20 20 63 6c 6f 73 65 28 70 78 5b 31        close(px[1
bd80: 5d 29 3b 0a 20 20 20 20 20 20 20 20 65 78 65 63  ]);.        exec
bd90: 6c 28 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c  l(zBaseFilename,
bda0: 20 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c 20   zBaseFilename, 
bdb0: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
bdc0: 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20 20 20     exit(0);.    
bdd0: 20 20 7d 0a 20 20 20 20 20 20 63 6c 6f 73 65 28    }.      close(
bde0: 70 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 6e  px[1]);.      in
bdf0: 20 3d 20 66 64 6f 70 65 6e 28 70 78 5b 30 5d 2c   = fdopen(px[0],
be00: 20 22 72 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20   "r");.    }.   
be10: 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20   if( in==0 ){.  
be20: 20 20 20 20 43 67 69 45 72 72 6f 72 28 29 3b 0a      CgiError();.
be30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
be40: 61 64 20 61 6e 64 20 70 72 6f 63 65 73 73 20 74  ad and process t
be50: 68 65 20 66 69 72 73 74 20 6c 69 6e 65 20 6f 66  he first line of
be60: 20 74 68 65 20 68 65 61 64 65 72 20 72 65 74 75   the header retu
be70: 72 6e 65 64 20 62 79 20 74 68 65 0a 20 20 20 20  rned by the.    
be80: 2a 2a 20 43 47 49 20 73 63 72 69 70 74 2e 0a 20  ** CGI script.. 
be90: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73     */.    if( us
bea0: 65 54 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d  eTimeout ) alarm
beb0: 28 31 35 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  (15);.    while(
bec0: 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 73 69 7a   fgets(zLine,siz
bed0: 65 6f 66 28 7a 4c 69 6e 65 29 2c 69 6e 29 20 29  eof(zLine),in) )
bee0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  {.      if( strn
bef0: 63 6d 70 28 7a 4c 69 6e 65 2c 22 4c 6f 63 61 74  cmp(zLine,"Locat
bf00: 69 6f 6e 3a 22 2c 39 29 3d 3d 30 20 29 7b 0a 20  ion:",9)==0 ){. 
bf10: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
bf20: 20 20 20 20 20 20 52 65 6d 6f 76 65 4e 65 77 6c        RemoveNewl
bf30: 69 6e 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  ine(zLine);.    
bf40: 20 20 20 20 7a 20 3d 20 26 7a 4c 69 6e 65 5b 31      z = &zLine[1
bf50: 30 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  0];.        whil
bf60: 65 28 20 69 73 73 70 61 63 65 28 2a 7a 29 20 29  e( isspace(*z) )
bf70: 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20  { z++; }.       
bf80: 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20   for(i=0; z[i]; 
bf90: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
bfa0: 69 66 28 20 7a 5b 69 5d 3d 3d 27 3f 27 20 29 7b  if( z[i]=='?' ){
bfb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75  .            zQu
bfc0: 65 72 79 53 75 66 66 69 78 20 3d 20 53 74 72 44  erySuffix = StrD
bfd0: 75 70 28 22 22 29 3b 0a 20 20 20 20 20 20 20 20  up("");.        
bfe0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
bff0: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 69        .        i
c000: 66 28 20 7a 5b 30 5d 3d 3d 27 2f 27 20 26 26 20  f( z[0]=='/' && 
c010: 7a 5b 31 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  z[1]=='/' ){.   
c020: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 63         /* The sc
c030: 68 65 6d 65 20 69 73 20 6d 69 73 73 69 6e 67 2e  heme is missing.
c040: 20 20 41 64 64 20 69 74 20 69 6e 20 62 65 66 6f    Add it in befo
c050: 72 65 20 72 65 64 69 72 65 63 74 69 6e 67 20 2a  re redirecting *
c060: 2f 0a 20 20 20 20 20 20 20 20 20 20 53 74 61 72  /.          Star
c070: 74 52 65 73 70 6f 6e 73 65 28 22 33 30 32 20 52  tResponse("302 R
c080: 65 64 69 72 65 63 74 22 29 3b 0a 20 20 20 20 20  edirect");.     
c090: 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69       nOut += pri
c0a0: 6e 74 66 28 22 4c 6f 63 61 74 69 6f 6e 3a 20 25  ntf("Location: %
c0b0: 73 3a 25 73 25 73 5c 72 5c 6e 22 2c 7a 48 74 74  s:%s%s\r\n",zHtt
c0c0: 70 2c 7a 2c 7a 51 75 65 72 79 53 75 66 66 69 78  p,z,zQuerySuffix
c0d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
c0e0: 61 6b 3b 20 2f 2a 20 44 4b 20 2a 2f 0a 20 20 20  ak; /* DK */.   
c0f0: 20 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e         MakeLogEn
c100: 74 72 79 28 30 29 3b 0a 20 20 20 20 20 20 20 20  try(0);.        
c110: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
c120: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30 5d    }else if( z[0]
c130: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
c140: 20 20 20 2f 2a 20 54 68 65 20 73 63 68 65 6d 65     /* The scheme
c150: 20 61 6e 64 20 6e 65 74 77 6f 72 6b 20 6c 6f 63   and network loc
c160: 61 74 69 6f 6e 20 61 72 65 20 6d 69 73 73 69 6e  ation are missin
c170: 67 20 62 75 74 20 77 65 20 68 61 76 65 0a 20 20  g but we have.  
c180: 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20 61 62          ** an ab
c190: 73 6f 6c 75 74 65 20 70 61 74 68 2e 20 2a 2f 0a  solute path. */.
c1a0: 20 20 20 20 20 20 20 20 20 20 52 65 64 69 72 65            Redire
c1b0: 63 74 28 7a 2c 20 30 29 3b 20 2f 2a 20 44 4b 20  ct(z, 0); /* DK 
c1c0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  */.          bre
c1d0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
c1e0: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
c1f0: 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 69  o see if there i
c200: 73 20 61 20 73 63 68 65 6d 65 20 70 72 65 66 69  s a scheme prefi
c210: 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  x */.        for
c220: 28 69 3d 30 3b 20 7a 5b 69 5d 20 26 26 20 7a 5b  (i=0; z[i] && z[
c230: 69 5d 21 3d 27 3a 27 20 26 26 20 7a 5b 69 5d 21  i]!=':' && z[i]!
c240: 3d 27 2f 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  ='/'; i++){}.   
c250: 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27       if( z[i]=='
c260: 3a 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  :' ){.          
c270: 2f 2a 20 57 65 20 68 61 76 65 20 61 20 73 63 68  /* We have a sch
c280: 65 6d 65 2e 20 20 41 73 73 75 6d 65 20 74 68 65  eme.  Assume the
c290: 72 65 20 69 73 20 61 6e 20 61 62 73 6f 6c 75 74  re is an absolut
c2a0: 65 20 55 52 4c 20 2a 2f 0a 20 20 20 20 20 20 20  e URL */.       
c2b0: 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65     StartResponse
c2c0: 28 22 33 30 32 20 52 65 64 69 72 65 63 74 22 29  ("302 Redirect")
c2d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74  ;.          nOut
c2e0: 20 2b 3d 20 70 72 69 6e 74 66 28 22 4c 6f 63 61   += printf("Loca
c2f0: 74 69 6f 6e 3a 20 25 73 25 73 5c 72 5c 6e 22 2c  tion: %s%s\r\n",
c300: 7a 2c 7a 51 75 65 72 79 53 75 66 66 69 78 29 3b  z,zQuerySuffix);
c310: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
c320: 3b 20 2f 2a 20 44 4b 20 2a 2f 0a 20 20 20 20 20  ; /* DK */.     
c330: 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72       MakeLogEntr
c340: 79 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  y(0);.          
c350: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
c360: 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73  }.        /* Mus
c370: 74 20 62 65 20 61 20 72 65 6c 61 74 69 76 65 20  t be a relative 
c380: 70 61 74 68 6e 61 6d 65 2e 20 20 43 6f 6e 73 74  pathname.  Const
c390: 72 75 63 74 20 74 68 65 20 61 62 73 6f 6c 75 74  ruct the absolut
c3a0: 65 20 70 61 74 68 6e 61 6d 65 0a 20 20 20 20 20  e pathname.     
c3b0: 20 20 20 2a 2a 20 61 6e 64 20 72 65 64 69 72 65     ** and redire
c3c0: 63 74 20 74 6f 20 69 74 2e 20 2a 2f 0a 20 20 20  ct to it. */.   
c3d0: 20 20 20 20 20 69 20 3d 20 73 74 72 6c 65 6e 28       i = strlen(
c3e0: 7a 52 65 61 6c 53 63 72 69 70 74 29 3b 0a 20 20  zRealScript);.  
c3f0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3e 30        while( i>0
c400: 20 26 26 20 7a 52 65 61 6c 53 63 72 69 70 74 5b   && zRealScript[
c410: 69 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 69 2d 2d  i-1]!='/' ){ i--
c420: 3b 20 7d 0a 20 20 20 20 20 20 20 20 77 68 69 6c  ; }.        whil
c430: 65 28 20 69 3e 30 20 26 26 20 7a 52 65 61 6c 53  e( i>0 && zRealS
c440: 63 72 69 70 74 5b 69 2d 31 5d 3d 3d 27 2f 27 20  cript[i-1]=='/' 
c450: 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ i--; }.      
c460: 20 20 77 68 69 6c 65 28 20 2a 7a 3d 3d 27 2e 27    while( *z=='.'
c470: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
c480: 28 20 7a 5b 31 5d 3d 3d 27 2f 27 20 29 7b 0a 20  ( z[1]=='/' ){. 
c490: 20 20 20 20 20 20 20 20 20 20 20 7a 20 2b 3d 20             z += 
c4a0: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  2;.          }el
c4b0: 73 65 20 69 66 28 20 7a 5b 31 5d 3d 3d 27 2e 27  se if( z[1]=='.'
c4c0: 20 26 26 20 7a 5b 32 5d 3d 3d 27 2f 27 20 29 7b   && z[2]=='/' ){
c4d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69  .            whi
c4e0: 6c 65 28 20 69 3e 30 20 26 26 20 7a 52 65 61 6c  le( i>0 && zReal
c4f0: 53 63 72 69 70 74 5b 69 2d 31 5d 21 3d 27 2f 27  Script[i-1]!='/'
c500: 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ i--; }.     
c510: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3e         while( i>
c520: 30 20 26 26 20 7a 52 65 61 6c 53 63 72 69 70 74  0 && zRealScript
c530: 5b 69 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 69 2d  [i-1]=='/' ){ i-
c540: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20  -; }.           
c550: 20 7a 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20   z += 3;.       
c560: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c570: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c580: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c590: 20 7d 0a 20 20 20 20 20 20 20 20 53 74 61 72 74   }.        Start
c5a0: 52 65 73 70 6f 6e 73 65 28 22 33 30 32 20 52 65  Response("302 Re
c5b0: 64 69 72 65 63 74 22 29 3b 0a 20 20 20 20 20 20  direct");.      
c5c0: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
c5d0: 28 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73 3a 2f  ("Location: %s:/
c5e0: 2f 25 73 22 2c 7a 48 74 74 70 2c 7a 53 65 72 76  /%s",zHttp,zServ
c5f0: 65 72 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  erName);.       
c600: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 53 65 72   if( strcmp(zSer
c610: 76 65 72 50 6f 72 74 2c 22 38 30 22 29 20 29 7b  verPort,"80") ){
c620: 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20  .          nOut 
c630: 2b 3d 20 70 72 69 6e 74 66 28 22 3a 25 73 22 2c  += printf(":%s",
c640: 7a 53 65 72 76 65 72 50 6f 72 74 29 3b 0a 20 20  zServerPort);.  
c650: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c660: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22  nOut += printf("
c670: 25 2e 2a 73 2f 25 73 25 73 5c 72 5c 6e 5c 72 5c  %.*s/%s%s\r\n\r\
c680: 6e 22 2c 69 2c 7a 52 65 61 6c 53 63 72 69 70 74  n",i,zRealScript
c690: 2c 7a 2c 7a 51 75 65 72 79 53 75 66 66 69 78 29  ,z,zQuerySuffix)
c6a0: 3b 0a 20 20 20 20 20 20 20 20 4d 61 6b 65 4c 6f  ;.        MakeLo
c6b0: 67 45 6e 74 72 79 28 30 29 3b 0a 20 20 20 20 20  gEntry(0);.     
c6c0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
c6d0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63   }else if( strnc
c6e0: 6d 70 28 7a 4c 69 6e 65 2c 22 53 74 61 74 75 73  mp(zLine,"Status
c6f0: 3a 22 2c 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20  :",7)==0 ){.    
c700: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
c710: 20 20 20 66 6f 72 28 69 3d 37 3b 20 69 73 73 70     for(i=7; issp
c720: 61 63 65 28 7a 4c 69 6e 65 5b 69 5d 29 3b 20 69  ace(zLine[i]); i
c730: 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 6e 4f  ++){}.        nO
c740: 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 25 73  ut += printf("%s
c750: 20 25 73 22 2c 20 7a 50 72 6f 74 6f 63 6f 6c 2c   %s", zProtocol,
c760: 20 26 7a 4c 69 6e 65 5b 69 5d 29 3b 0a 20 20 20   &zLine[i]);.   
c770: 20 20 20 20 20 73 74 72 6e 63 70 79 28 7a 52 65       strncpy(zRe
c780: 70 6c 79 53 74 61 74 75 73 2c 20 26 7a 4c 69 6e  plyStatus, &zLin
c790: 65 5b 69 5d 2c 20 33 29 3b 0a 20 20 20 20 20 20  e[i], 3);.      
c7a0: 20 20 7a 52 65 70 6c 79 53 74 61 74 75 73 5b 33    zReplyStatus[3
c7b0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  ] = 0;.        s
c7c0: 74 61 74 75 73 53 65 6e 74 20 3d 20 31 3b 0a 20  tatusSent = 1;. 
c7d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c7e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c7f0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
c800: 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28    StartResponse(
c810: 22 32 30 30 20 4f 4b 22 29 3b 0a 20 20 20 20 20  "200 OK");.     
c820: 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74     nOut += print
c830: 66 28 22 25 73 22 2c 7a 4c 69 6e 65 29 3b 0a 20  f("%s",zLine);. 
c840: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
c850: 7a 4c 69 6e 65 5b 69 5d 20 26 26 20 21 69 73 73  zLine[i] && !iss
c860: 70 61 63 65 28 7a 4c 69 6e 65 5b 69 5d 29 20 26  pace(zLine[i]) &
c870: 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d 27 3a 27 3b  & zLine[i]!=':';
c880: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   i++){}.        
c890: 69 66 28 20 69 3c 32 20 7c 7c 20 7a 4c 69 6e 65  if( i<2 || zLine
c8a0: 5b 69 5d 21 3d 27 3a 27 20 29 20 62 72 65 61 6b  [i]!=':' ) break
c8b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c8c0: 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 76 65  .    /* Copy eve
c8d0: 72 79 74 68 69 6e 67 20 65 6c 73 65 20 74 68 72  rything else thr
c8e0: 75 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 65  u without change
c8f0: 20 6f 72 20 61 6e 61 6c 79 73 69 73 2e 0a 20 20   or analysis..  
c900: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 65    */.    if( use
c910: 54 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d 28  Timeout ) alarm(
c920: 36 30 2a 35 29 3b 0a 20 20 20 20 77 68 69 6c 65  60*5);.    while
c930: 28 20 28 63 20 3d 20 67 65 74 63 28 69 6e 29 29  ( (c = getc(in))
c940: 21 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20 20 70  !=EOF ){.      p
c950: 75 74 63 28 63 2c 73 74 64 6f 75 74 29 3b 0a 20  utc(c,stdout);. 
c960: 20 20 20 20 20 6e 4f 75 74 2b 2b 3b 0a 20 20 20       nOut++;.   
c970: 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e   }.    fclose(in
c980: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63  );.  }else if( c
c990: 6f 75 6e 74 53 6c 61 73 68 65 73 28 7a 52 65 61  ountSlashes(zRea
c9a0: 6c 53 63 72 69 70 74 29 21 3d 63 6f 75 6e 74 53  lScript)!=countS
c9b0: 6c 61 73 68 65 73 28 7a 53 63 72 69 70 74 29 20  lashes(zScript) 
c9c0: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
c9d0: 20 72 65 71 75 65 73 74 20 55 52 49 20 66 6f 72   request URI for
c9e0: 20 73 74 61 74 69 63 20 63 6f 6e 74 65 6e 74 20   static content 
c9f0: 63 6f 6e 74 61 69 6e 73 20 6d 61 74 65 72 69 61  contains materia
ca00: 6c 20 70 61 73 74 20 74 68 65 0a 20 20 20 20 2a  l past the.    *
ca10: 2a 20 61 63 74 75 61 6c 20 63 6f 6e 74 65 6e 74  * actual content
ca20: 20 66 69 6c 65 20 6e 61 6d 65 2c 20 72 65 70 6f   file name, repo
ca30: 72 74 20 74 68 61 74 20 61 73 20 61 20 34 30 34  rt that as a 404
ca40: 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 4e   error. */.    N
ca50: 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f  otFound(__LINE__
ca60: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
ca70: 2f 2a 20 49 66 20 69 74 20 69 73 6e 27 74 20 65  /* If it isn't e
ca80: 78 65 63 75 74 61 62 6c 65 20 74 68 65 6e 20 69  xecutable then i
ca90: 74 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 61 20  t.    ** must a 
caa0: 73 69 6d 70 6c 65 20 66 69 6c 65 20 74 68 61 74  simple file that
cab0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63 6f 70   needs to be cop
cac0: 69 65 64 20 74 6f 20 6f 75 74 70 75 74 2e 0a 20  ied to output.. 
cad0: 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20     */.    const 
cae0: 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 54 79  char *zContentTy
caf0: 70 65 20 3d 20 47 65 74 4d 69 6d 65 54 79 70 65  pe = GetMimeType
cb00: 28 7a 46 69 6c 65 2c 20 6c 65 6e 46 69 6c 65 29  (zFile, lenFile)
cb10: 3b 0a 0a 20 20 20 20 69 66 28 20 7a 54 6d 70 4e  ;..    if( zTmpN
cb20: 61 6d 20 29 20 75 6e 6c 69 6e 6b 28 7a 54 6d 70  am ) unlink(zTmp
cb30: 4e 61 6d 29 3b 0a 20 20 20 20 69 6e 20 3d 20 66  Nam);.    in = f
cb40: 6f 70 65 6e 28 7a 46 69 6c 65 2c 22 72 22 29 3b  open(zFile,"r");
cb50: 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29  .    if( in==0 )
cb60: 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45   NotFound(__LINE
cb70: 5f 5f 29 3b 0a 20 20 20 20 53 74 61 72 74 52 65  __);.    StartRe
cb80: 73 70 6f 6e 73 65 28 22 32 30 30 20 4f 4b 22 29  sponse("200 OK")
cb90: 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 44 61  ;.    nOut += Da
cba0: 74 65 54 61 67 28 22 4c 61 73 74 2d 4d 6f 64 69  teTag("Last-Modi
cbb0: 66 69 65 64 22 2c 20 73 74 61 74 62 75 66 2e 73  fied", statbuf.s
cbc0: 74 5f 6d 74 69 6d 65 29 3b 0a 20 20 20 20 6e 4f  t_mtime);.    nO
cbd0: 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f  ut += printf("Co
cbe0: 6e 74 65 6e 74 2d 74 79 70 65 3a 20 25 73 5c 72  ntent-type: %s\r
cbf0: 5c 6e 22 2c 7a 43 6f 6e 74 65 6e 74 54 79 70 65  \n",zContentType
cc00: 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70  );.    nOut += p
cc10: 72 69 6e 74 66 28 22 43 6f 6e 74 65 6e 74 2d 6c  rintf("Content-l
cc20: 65 6e 67 74 68 3a 20 25 64 5c 72 5c 6e 5c 72 5c  ength: %d\r\n\r\
cc30: 6e 22 2c 28 69 6e 74 29 73 74 61 74 62 75 66 2e  n",(int)statbuf.
cc40: 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 66 66  st_size);.    ff
cc50: 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20  lush(stdout);.  
cc60: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4d 65    if( strcmp(zMe
cc70: 74 68 6f 64 2c 22 48 45 41 44 22 29 3d 3d 30 20  thod,"HEAD")==0 
cc80: 29 7b 0a 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67  ){.      MakeLog
cc90: 45 6e 74 72 79 28 30 29 3b 0a 20 20 20 20 20 20  Entry(0);.      
cca0: 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20  fclose(in);.    
ccb0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
ccc0: 20 20 20 20 69 66 28 20 75 73 65 54 69 6d 65 6f      if( useTimeo
ccd0: 75 74 20 29 20 61 6c 61 72 6d 28 33 30 20 2b 20  ut ) alarm(30 + 
cce0: 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 2f  statbuf.st_size/
ccf0: 31 30 30 30 29 3b 0a 23 69 66 64 65 66 20 6c 69  1000);.#ifdef li
cd00: 6e 75 78 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  nux.    {.      
cd10: 6f 66 66 5f 74 20 6f 66 66 73 65 74 20 3d 20 30  off_t offset = 0
cd20: 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20  ;.      nOut += 
cd30: 73 65 6e 64 66 69 6c 65 28 66 69 6c 65 6e 6f 28  sendfile(fileno(
cd40: 73 74 64 6f 75 74 29 2c 20 66 69 6c 65 6e 6f 28  stdout), fileno(
cd50: 69 6e 29 2c 20 26 6f 66 66 73 65 74 2c 20 73 74  in), &offset, st
cd60: 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a  atbuf.st_size);.
cd70: 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
cd80: 77 68 69 6c 65 28 20 28 63 20 3d 20 67 65 74 63  while( (c = getc
cd90: 28 69 6e 29 29 21 3d 45 4f 46 20 29 7b 0a 20 20  (in))!=EOF ){.  
cda0: 20 20 20 20 70 75 74 63 28 63 2c 73 74 64 6f 75      putc(c,stdou
cdb0: 74 29 3b 0a 20 20 20 20 20 20 6e 4f 75 74 2b 2b  t);.      nOut++
cdc0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
cdd0: 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
cde0: 20 7d 0a 20 20 66 66 6c 75 73 68 28 73 74 64 6f   }.  fflush(stdo
cdf0: 75 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e  ut);.  MakeLogEn
ce00: 74 72 79 28 30 29 3b 0a 0a 20 20 2f 2a 20 54 68  try(0);..  /* Th
ce10: 65 20 6e 65 78 74 20 72 65 71 75 65 73 74 20 6d  e next request m
ce20: 75 73 74 20 61 72 72 69 76 65 20 77 69 74 68 69  ust arrive withi
ce30: 6e 20 33 30 20 73 65 63 6f 6e 64 73 20 6f 72 20  n 30 seconds or 
ce40: 77 65 20 63 6c 6f 73 65 20 74 68 65 20 63 6f 6e  we close the con
ce50: 6e 65 63 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6f  nection.  */.  o
ce60: 6d 69 74 4c 6f 67 20 3d 20 31 3b 0a 20 20 69 66  mitLog = 1;.  if
ce70: 28 20 75 73 65 54 69 6d 65 6f 75 74 20 29 20 61  ( useTimeout ) a
ce80: 6c 61 72 6d 28 33 30 29 3b 0a 7d 0a 0a 23 64 65  larm(30);.}..#de
ce90: 66 69 6e 65 20 4d 41 58 5f 50 41 52 41 4c 4c 45  fine MAX_PARALLE
cea0: 4c 20 35 30 20 20 2f 2a 20 4e 75 6d 62 65 72 20  L 50  /* Number 
ceb0: 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20  of simultaneous 
cec0: 63 68 69 6c 64 72 65 6e 20 2a 2f 0a 0a 2f 2a 0a  children */../*.
ced0: 2a 2a 20 41 6c 6c 20 70 6f 73 73 69 62 6c 65 20  ** All possible 
cee0: 66 6f 72 6d 73 20 6f 66 20 61 6e 20 49 50 20 61  forms of an IP a
cef0: 64 64 72 65 73 73 2e 20 20 4e 65 65 64 65 64 20  ddress.  Needed 
cf00: 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 47  to work around G
cf10: 43 43 20 73 74 72 69 63 74 0a 2a 2a 20 61 6c 69  CC strict.** ali
cf20: 61 73 69 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a  asing rules..*/.
cf30: 74 79 70 65 64 65 66 20 75 6e 69 6f 6e 20 7b 0a  typedef union {.
cf40: 20 20 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64    struct sockadd
cf50: 72 20 73 61 3b 20 20 20 20 20 20 20 20 20 20 20  r sa;           
cf60: 20 20 20 2f 2a 20 41 62 73 74 72 61 63 74 20 73     /* Abstract s
cf70: 75 70 65 72 63 6c 61 73 73 20 2a 2f 0a 20 20 73  uperclass */.  s
cf80: 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 69  truct sockaddr_i
cf90: 6e 20 73 61 34 3b 20 20 20 20 20 20 20 20 20 20  n sa4;          
cfa0: 2f 2a 20 49 50 76 34 20 2a 2f 0a 20 20 73 74 72  /* IPv4 */.  str
cfb0: 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 36  uct sockaddr_in6
cfc0: 20 73 61 36 3b 20 20 20 20 20 20 20 20 20 2f 2a   sa6;         /*
cfd0: 20 49 50 76 36 20 2a 2f 0a 20 20 73 74 72 75 63   IPv6 */.  struc
cfe0: 74 20 73 6f 63 6b 61 64 64 72 5f 73 74 6f 72 61  t sockaddr_stora
cff0: 67 65 20 73 61 73 3b 20 20 20 20 20 2f 2a 20 53  ge sas;     /* S
d000: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6d 61 78  hould be the max
d010: 69 6d 75 6d 20 6f 66 20 74 68 65 20 61 62 6f 76  imum of the abov
d020: 65 20 33 20 2a 2f 0a 7d 20 61 64 64 72 65 73 73  e 3 */.} address
d030: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  ;../*.** Impleme
d040: 6e 74 20 61 6e 20 48 54 54 50 20 73 65 72 76 65  nt an HTTP serve
d050: 72 20 64 61 65 6d 6f 6e 20 6c 69 73 74 65 6e 69  r daemon listeni
d060: 6e 67 20 6f 6e 20 70 6f 72 74 20 69 50 6f 72 74  ng on port iPort
d070: 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 6e 65 77 20 63  ..**.** As new c
d080: 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 72 69 76  onnections arriv
d090: 65 2c 20 66 6f 72 6b 20 61 20 63 68 69 6c 64 20  e, fork a child 
d0a0: 61 6e 64 20 6c 65 74 20 63 68 69 6c 64 20 72 65  and let child re
d0b0: 74 75 72 6e 0a 2a 2a 20 6f 75 74 20 6f 66 20 74  turn.** out of t
d0c0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 61  his procedure ca
d0d0: 6c 6c 2e 20 20 54 68 65 20 63 68 69 6c 64 20 77  ll.  The child w
d0e0: 69 6c 6c 20 68 61 6e 64 6c 65 20 74 68 65 20 72  ill handle the r
d0f0: 65 71 75 65 73 74 2e 0a 2a 2a 20 54 68 65 20 70  equest..** The p
d100: 61 72 65 6e 74 20 6e 65 76 65 72 20 72 65 74 75  arent never retu
d110: 72 6e 73 20 66 72 6f 6d 20 74 68 69 73 20 70 72  rns from this pr
d120: 6f 63 65 64 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 52  ocedure..**.** R
d130: 65 74 75 72 6e 20 30 20 74 6f 20 65 61 63 68 20  eturn 0 to each 
d140: 63 68 69 6c 64 20 61 73 20 69 74 20 72 75 6e 73  child as it runs
d150: 2e 20 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20  .  If unable to 
d160: 65 73 74 61 62 6c 69 73 68 20 61 0a 2a 2a 20 6c  establish a.** l
d170: 69 73 74 65 6e 69 6e 67 20 73 6f 63 6b 65 74 2c  istening socket,
d180: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
d190: 2e 0a 2a 2f 0a 69 6e 74 20 68 74 74 70 5f 73 65  ..*/.int http_se
d1a0: 72 76 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20  rver(const char 
d1b0: 2a 7a 50 6f 72 74 2c 20 69 6e 74 20 6c 6f 63 61  *zPort, int loca
d1c0: 6c 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 6c 69  lOnly){.  int li
d1d0: 73 74 65 6e 65 72 5b 32 30 5d 3b 20 20 20 20 20  stener[20];     
d1e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 65         /* The se
d1f0: 72 76 65 72 20 73 6f 63 6b 65 74 73 20 2a 2f 0a  rver sockets */.
d200: 20 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e    int connection
d210: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
d220: 2a 20 41 20 73 6f 63 6b 65 74 20 66 6f 72 20 65  * A socket for e
d230: 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 63  ach individual c
d240: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 66  onnection */.  f
d250: 64 5f 73 65 74 20 72 65 61 64 66 64 73 3b 20 20  d_set readfds;  
d260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
d270: 65 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72  et of file descr
d280: 69 70 74 6f 72 73 20 66 6f 72 20 73 65 6c 65 63  iptors for selec
d290: 74 28 29 20 2a 2f 0a 20 20 61 64 64 72 65 73 73  t() */.  address
d2a0: 20 69 6e 61 64 64 72 3b 20 20 20 20 20 20 20 20   inaddr;        
d2b0: 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 74 65 20        /* Remote 
d2c0: 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 73 6f 63  address */.  soc
d2d0: 6b 6c 65 6e 5f 74 20 6c 65 6e 61 64 64 72 3b 20  klen_t lenaddr; 
d2e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
d2f0: 67 74 68 20 6f 66 20 74 68 65 20 69 6e 61 64 64  gth of the inadd
d300: 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  r structure */. 
d310: 20 69 6e 74 20 63 68 69 6c 64 3b 20 20 20 20 20   int child;     
d320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d330: 20 50 49 44 20 6f 66 20 74 68 65 20 63 68 69 6c   PID of the chil
d340: 64 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 69  d process */.  i
d350: 6e 74 20 6e 63 68 69 6c 64 72 65 6e 20 3d 20 30  nt nchildren = 0
d360: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
d370: 75 6d 62 65 72 20 6f 66 20 63 68 69 6c 64 20 70  umber of child p
d380: 72 6f 63 65 73 73 65 73 20 2a 2f 0a 20 20 73 74  rocesses */.  st
d390: 72 75 63 74 20 74 69 6d 65 76 61 6c 20 64 65 6c  ruct timeval del
d3a0: 61 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 48 6f  ay;        /* Ho
d3b0: 77 20 6c 6f 6e 67 20 74 6f 20 77 61 69 74 20 69  w long to wait i
d3c0: 6e 73 69 64 65 20 73 65 6c 65 63 74 28 29 20 2a  nside select() *
d3d0: 2f 0a 20 20 69 6e 74 20 6f 70 74 20 3d 20 31 3b  /.  int opt = 1;
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3f0: 20 2f 2a 20 73 65 74 73 6f 63 6b 6f 70 74 20 66   /* setsockopt f
d400: 6c 61 67 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  lag */.  struct 
d410: 61 64 64 72 69 6e 66 6f 20 73 48 69 6e 74 73 3b  addrinfo sHints;
d420: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
d430: 20 68 69 6e 74 73 20 2a 2f 0a 20 20 73 74 72 75   hints */.  stru
d440: 63 74 20 61 64 64 72 69 6e 66 6f 20 2a 70 41 64  ct addrinfo *pAd
d450: 64 72 73 2c 20 2a 70 3b 20 2f 2a 20 2a 2f 0a 20  drs, *p; /* */. 
d460: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
d470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d480: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
d490: 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 6e    int i, n;.  in
d4a0: 74 20 6d 61 78 46 64 20 3d 20 2d 31 3b 0a 20 20  t maxFd = -1;.  
d4b0: 0a 20 20 6d 65 6d 73 65 74 28 26 73 48 69 6e 74  .  memset(&sHint
d4c0: 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 48 69  s, 0, sizeof(sHi
d4d0: 6e 74 73 29 29 3b 0a 20 20 69 66 28 20 69 70 76  nts));.  if( ipv
d4e0: 34 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 48 69  4Only ){.    sHi
d4f0: 6e 74 73 2e 61 69 5f 66 61 6d 69 6c 79 20 3d 20  nts.ai_family = 
d500: 50 46 5f 49 4e 45 54 3b 0a 20 20 20 20 2f 2a 70  PF_INET;.    /*p
d510: 72 69 6e 74 66 28 22 69 70 76 34 20 6f 6e 6c 79  rintf("ipv4 only
d520: 5c 6e 22 29 3b 2a 2f 0a 20 20 7d 65 6c 73 65 20  \n");*/.  }else 
d530: 69 66 28 20 69 70 76 36 4f 6e 6c 79 20 29 7b 0a  if( ipv6Only ){.
d540: 20 20 20 20 73 48 69 6e 74 73 2e 61 69 5f 66 61      sHints.ai_fa
d550: 6d 69 6c 79 20 3d 20 50 46 5f 49 4e 45 54 36 3b  mily = PF_INET6;
d560: 0a 20 20 20 20 2f 2a 70 72 69 6e 74 66 28 22 69  .    /*printf("i
d570: 70 76 36 20 6f 6e 6c 79 5c 6e 22 29 3b 2a 2f 0a  pv6 only\n");*/.
d580: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 48 69    }else{.    sHi
d590: 6e 74 73 2e 61 69 5f 66 61 6d 69 6c 79 20 3d 20  nts.ai_family = 
d5a0: 50 46 5f 55 4e 53 50 45 43 3b 0a 20 20 7d 0a 20  PF_UNSPEC;.  }. 
d5b0: 20 73 48 69 6e 74 73 2e 61 69 5f 73 6f 63 6b 74   sHints.ai_sockt
d5c0: 79 70 65 20 3d 20 53 4f 43 4b 5f 53 54 52 45 41  ype = SOCK_STREA
d5d0: 4d 3b 0a 20 20 73 48 69 6e 74 73 2e 61 69 5f 66  M;.  sHints.ai_f
d5e0: 6c 61 67 73 20 3d 20 41 49 5f 50 41 53 53 49 56  lags = AI_PASSIV
d5f0: 45 3b 0a 20 20 73 48 69 6e 74 73 2e 61 69 5f 70  E;.  sHints.ai_p
d600: 72 6f 74 6f 63 6f 6c 20 3d 20 30 3b 0a 20 20 72  rotocol = 0;.  r
d610: 63 20 3d 20 67 65 74 61 64 64 72 69 6e 66 6f 28  c = getaddrinfo(
d620: 6c 6f 63 61 6c 4f 6e 6c 79 20 3f 20 22 6c 6f 63  localOnly ? "loc
d630: 61 6c 68 6f 73 74 22 3a 20 30 2c 20 7a 50 6f 72  alhost": 0, zPor
d640: 74 2c 20 26 73 48 69 6e 74 73 2c 20 26 70 41 64  t, &sHints, &pAd
d650: 64 72 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29  drs);.  if( rc )
d660: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
d670: 64 65 72 72 2c 20 22 63 6f 75 6c 64 20 6e 6f 74  derr, "could not
d680: 20 67 65 74 20 61 64 64 72 20 69 6e 66 6f 3a 20   get addr info: 
d690: 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  %s", .          
d6a0: 20 20 72 63 21 3d 45 41 49 5f 53 59 53 54 45 4d    rc!=EAI_SYSTEM
d6b0: 20 3f 20 67 61 69 5f 73 74 72 65 72 72 6f 72 28   ? gai_strerror(
d6c0: 72 63 29 20 3a 20 73 74 72 65 72 72 6f 72 28 65  rc) : strerror(e
d6d0: 72 72 6e 6f 29 29 3b 0a 20 20 20 20 72 65 74 75  rrno));.    retu
d6e0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  rn 1;.  }.  for(
d6f0: 6e 3d 30 2c 20 70 3d 70 41 64 64 72 73 3b 20 6e  n=0, p=pAddrs; n
d700: 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 6c 69  <(int)(sizeof(li
d710: 73 74 65 6e 65 72 29 2f 73 69 7a 65 6f 66 28 6c  stener)/sizeof(l
d720: 69 73 74 65 6e 65 72 5b 30 5d 29 29 20 26 26 20  istener[0])) && 
d730: 70 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 70 3d  p!=0;.        p=
d740: 70 2d 3e 61 69 5f 6e 65 78 74 29 7b 0a 20 20 20  p->ai_next){.   
d750: 20 6c 69 73 74 65 6e 65 72 5b 6e 5d 20 3d 20 73   listener[n] = s
d760: 6f 63 6b 65 74 28 70 2d 3e 61 69 5f 66 61 6d 69  ocket(p->ai_fami
d770: 6c 79 2c 20 70 2d 3e 61 69 5f 73 6f 63 6b 74 79  ly, p->ai_sockty
d780: 70 65 2c 20 70 2d 3e 61 69 5f 70 72 6f 74 6f 63  pe, p->ai_protoc
d790: 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 6c 69 73  ol);.    if( lis
d7a0: 74 65 6e 65 72 5b 6e 5d 3e 3d 30 20 29 7b 0a 20  tener[n]>=0 ){. 
d7b0: 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 63 61       /* if we ca
d7c0: 6e 27 74 20 74 65 72 6d 69 6e 61 74 65 20 6e 69  n't terminate ni
d7d0: 63 65 6c 79 2c 20 61 74 20 6c 65 61 73 74 20 61  cely, at least a
d7e0: 6c 6c 6f 77 20 74 68 65 20 73 6f 63 6b 65 74 20  llow the socket 
d7f0: 74 6f 20 62 65 20 72 65 75 73 65 64 20 2a 2f 0a  to be reused */.
d800: 20 20 20 20 20 20 73 65 74 73 6f 63 6b 6f 70 74        setsockopt
d810: 28 6c 69 73 74 65 6e 65 72 5b 6e 5d 2c 20 53 4f  (listener[n], SO
d820: 4c 5f 53 4f 43 4b 45 54 2c 20 53 4f 5f 52 45 55  L_SOCKET, SO_REU
d830: 53 45 41 44 44 52 2c 26 6f 70 74 2c 20 73 69 7a  SEADDR,&opt, siz
d840: 65 6f 66 28 6f 70 74 29 29 3b 0a 20 20 20 20 20  eof(opt));.     
d850: 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 49 50   .#if defined(IP
d860: 56 36 5f 56 36 4f 4e 4c 59 29 0a 20 20 20 20 20  V6_V6ONLY).     
d870: 20 69 66 28 20 70 2d 3e 61 69 5f 66 61 6d 69 6c   if( p->ai_famil
d880: 79 3d 3d 41 46 5f 49 4e 45 54 36 20 29 7b 0a 20  y==AF_INET6 ){. 
d890: 20 20 20 20 20 20 20 69 6e 74 20 76 36 6f 6e 6c         int v6onl
d8a0: 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73  y = 1;.        s
d8b0: 65 74 73 6f 63 6b 6f 70 74 28 6c 69 73 74 65 6e  etsockopt(listen
d8c0: 65 72 5b 6e 5d 2c 20 49 50 50 52 4f 54 4f 5f 49  er[n], IPPROTO_I
d8d0: 50 56 36 2c 20 49 50 56 36 5f 56 36 4f 4e 4c 59  PV6, IPV6_V6ONLY
d8e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d8f0: 20 20 20 20 20 20 26 76 36 6f 6e 6c 79 2c 20 73        &v6only, s
d900: 69 7a 65 6f 66 28 76 36 6f 6e 6c 79 29 29 3b 0a  izeof(v6only));.
d910: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
d920: 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20       .      if( 
d930: 62 69 6e 64 28 6c 69 73 74 65 6e 65 72 5b 6e 5d  bind(listener[n]
d940: 2c 20 70 2d 3e 61 69 5f 61 64 64 72 2c 20 70 2d  , p->ai_addr, p-
d950: 3e 61 69 5f 61 64 64 72 6c 65 6e 29 3c 30 20 29  >ai_addrlen)<0 )
d960: 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66  {.        printf
d970: 28 22 62 69 6e 64 20 66 61 69 6c 65 64 3a 20 25  ("bind failed: %
d980: 73 5c 6e 22 2c 20 73 74 72 65 72 72 6f 72 28 65  s\n", strerror(e
d990: 72 72 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20  rrno));.        
d9a0: 63 6c 6f 73 65 28 6c 69 73 74 65 6e 65 72 5b 6e  close(listener[n
d9b0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  ]);.        cont
d9c0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
d9d0: 20 20 20 20 69 66 28 20 6c 69 73 74 65 6e 28 6c      if( listen(l
d9e0: 69 73 74 65 6e 65 72 5b 6e 5d 2c 20 32 30 29 3c  istener[n], 20)<
d9f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69  0 ){.        pri
da00: 6e 74 66 28 22 6c 69 73 74 65 6e 28 29 20 66 61  ntf("listen() fa
da10: 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20 73 74 72  iled: %s\n", str
da20: 65 72 72 6f 72 28 65 72 72 6e 6f 29 29 3b 0a 20  error(errno));. 
da30: 20 20 20 20 20 20 20 63 6c 6f 73 65 28 6c 69 73         close(lis
da40: 74 65 6e 65 72 5b 6e 5d 29 3b 0a 20 20 20 20 20  tener[n]);.     
da50: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
da60: 20 20 20 7d 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a     }.      n++;.
da70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
da80: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  n==0 ){.    fpri
da90: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 63 61 6e  ntf(stderr, "can
daa0: 6e 6f 74 20 6f 70 65 6e 20 61 6e 79 20 73 6f 63  not open any soc
dab0: 6b 65 74 73 5c 6e 22 29 3b 0a 20 20 20 20 72 65  kets\n");.    re
dac0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 77  turn 1;.  }..  w
dad0: 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69  hile( 1 ){.    i
dae0: 66 28 20 6e 63 68 69 6c 64 72 65 6e 3e 4d 41 58  f( nchildren>MAX
daf0: 5f 50 41 52 41 4c 4c 45 4c 20 29 7b 0a 20 20 20  _PARALLEL ){.   
db00: 20 20 20 2f 2a 20 53 6c 6f 77 20 64 6f 77 6e 20     /* Slow down 
db10: 69 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  if connections a
db20: 72 65 20 61 72 72 69 76 69 6e 67 20 74 6f 6f 20  re arriving too 
db30: 66 61 73 74 20 2a 2f 0a 20 20 20 20 20 20 73 6c  fast */.      sl
db40: 65 65 70 28 20 6e 63 68 69 6c 64 72 65 6e 2d 4d  eep( nchildren-M
db50: 41 58 5f 50 41 52 41 4c 4c 45 4c 20 29 3b 0a 20  AX_PARALLEL );. 
db60: 20 20 20 7d 0a 20 20 20 20 64 65 6c 61 79 2e 74     }.    delay.t
db70: 76 5f 73 65 63 20 3d 20 36 30 3b 0a 20 20 20 20  v_sec = 60;.    
db80: 64 65 6c 61 79 2e 74 76 5f 75 73 65 63 20 3d 20  delay.tv_usec = 
db90: 30 3b 0a 20 20 20 20 46 44 5f 5a 45 52 4f 28 26  0;.    FD_ZERO(&
dba0: 72 65 61 64 66 64 73 29 3b 0a 20 20 20 20 66 6f  readfds);.    fo
dbb0: 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
dbc0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
dbd0: 6c 69 73 74 65 6e 65 72 5b 69 5d 3e 3d 30 20 29  listener[i]>=0 )
dbe0: 3b 0a 20 20 20 20 20 20 46 44 5f 53 45 54 28 20  ;.      FD_SET( 
dbf0: 6c 69 73 74 65 6e 65 72 5b 69 5d 2c 20 26 72 65  listener[i], &re
dc00: 61 64 66 64 73 29 3b 0a 20 20 20 20 20 20 69 66  adfds);.      if
dc10: 28 20 6c 69 73 74 65 6e 65 72 5b 69 5d 3e 6d 61  ( listener[i]>ma
dc20: 78 46 64 20 29 20 6d 61 78 46 64 20 3d 20 6c 69  xFd ) maxFd = li
dc30: 73 74 65 6e 65 72 5b 69 5d 3b 0a 20 20 20 20 7d  stener[i];.    }
dc40: 0a 20 20 20 20 73 65 6c 65 63 74 28 20 6d 61 78  .    select( max
dc50: 46 64 2b 31 2c 20 26 72 65 61 64 66 64 73 2c 20  Fd+1, &readfds, 
dc60: 30 2c 20 30 2c 20 26 64 65 6c 61 79 29 3b 0a 20  0, 0, &delay);. 
dc70: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b     for(i=0; i<n;
dc80: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
dc90: 20 46 44 5f 49 53 53 45 54 28 6c 69 73 74 65 6e   FD_ISSET(listen
dca0: 65 72 5b 69 5d 2c 20 26 72 65 61 64 66 64 73 29  er[i], &readfds)
dcb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 61   ){.        lena
dcc0: 64 64 72 20 3d 20 73 69 7a 65 6f 66 28 69 6e 61  ddr = sizeof(ina
dcd0: 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ddr);.        co
dce0: 6e 6e 65 63 74 69 6f 6e 20 3d 20 61 63 63 65 70  nnection = accep
dcf0: 74 28 6c 69 73 74 65 6e 65 72 5b 69 5d 2c 20 26  t(listener[i], &
dd00: 69 6e 61 64 64 72 2e 73 61 2c 20 26 6c 65 6e 61  inaddr.sa, &lena
dd10: 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ddr);.        if
dd20: 28 20 63 6f 6e 6e 65 63 74 69 6f 6e 3e 3d 30 20  ( connection>=0 
dd30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 69  ){.          chi
dd40: 6c 64 20 3d 20 66 6f 72 6b 28 29 3b 0a 20 20 20  ld = fork();.   
dd50: 20 20 20 20 20 20 20 69 66 28 20 63 68 69 6c 64         if( child
dd60: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
dd70: 20 20 20 69 66 28 20 63 68 69 6c 64 3e 30 20 29     if( child>0 )
dd80: 20 6e 63 68 69 6c 64 72 65 6e 2b 2b 3b 0a 20 20   nchildren++;.  
dd90: 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28            close(
dda0: 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 20  connection);.   
ddb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 70 72 69 6e           /* prin
ddc0: 74 66 28 22 73 75 62 70 72 6f 63 65 73 73 20 25  tf("subprocess %
ddd0: 64 20 73 74 61 72 74 65 64 2e 2e 2e 5c 6e 22 2c  d started...\n",
dde0: 20 63 68 69 6c 64 29 3b 20 66 66 6c 75 73 68 28   child); fflush(
ddf0: 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 20 20  stdout); */.    
de00: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
de10: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 45 72           int nEr
de20: 72 20 3d 20 30 2c 20 66 64 3b 0a 20 20 20 20 20  r = 0, fd;.     
de30: 20 20 20 20 20 20 20 63 6c 6f 73 65 28 30 29 3b         close(0);
de40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 64 20  .            fd 
de50: 3d 20 64 75 70 28 63 6f 6e 6e 65 63 74 69 6f 6e  = dup(connection
de60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
de70: 66 28 20 66 64 21 3d 30 20 29 20 6e 45 72 72 2b  f( fd!=0 ) nErr+
de80: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  +;.            c
de90: 6c 6f 73 65 28 31 29 3b 0a 20 20 20 20 20 20 20  lose(1);.       
dea0: 20 20 20 20 20 66 64 20 3d 20 64 75 70 28 63 6f       fd = dup(co
deb0: 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  nnection);.     
dec0: 20 20 20 20 20 20 20 69 66 28 20 66 64 21 3d 31         if( fd!=1
ded0: 20 29 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20   ) nErr++;.     
dee0: 20 20 20 20 20 20 20 63 6c 6f 73 65 28 63 6f 6e         close(con
def0: 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  nection);.      
df00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72        return nEr
df10: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  r;.          }. 
df20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
df30: 0a 20 20 20 20 20 20 2f 2a 20 42 75 72 79 20 64  .      /* Bury d
df40: 65 61 64 20 63 68 69 6c 64 72 65 6e 20 2a 2f 0a  ead children */.
df50: 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 68        while( (ch
df60: 69 6c 64 20 3d 20 77 61 69 74 70 69 64 28 30 2c  ild = waitpid(0,
df70: 20 30 2c 20 57 4e 4f 48 41 4e 47 29 29 3e 30 20   0, WNOHANG))>0 
df80: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 72  ){.        /* pr
df90: 69 6e 74 66 28 22 70 72 6f 63 65 73 73 20 25 64  intf("process %d
dfa0: 20 65 6e 64 73 5c 6e 22 2c 20 63 68 69 6c 64 29   ends\n", child)
dfb0: 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  ; fflush(stdout)
dfc0: 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 63 68  ; */.        nch
dfd0: 69 6c 64 72 65 6e 2d 2d 3b 0a 20 20 20 20 20 20  ildren--;.      
dfe0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  }.    }.  }.  /*
dff0: 20 4e 4f 54 20 52 45 41 43 48 45 44 20 2a 2f 20   NOT REACHED */ 
e000: 20 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a   .  exit(1);.}..
e010: 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72  .int main(int ar
e020: 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29  gc, char **argv)
e030: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
e040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e050: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
e060: 0a 20 20 63 68 61 72 20 2a 7a 50 65 72 6d 55 73  .  char *zPermUs
e070: 65 72 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  er = 0;      /* 
e080: 52 75 6e 20 64 61 65 6d 6f 6e 20 77 69 74 68 20  Run daemon with 
e090: 74 68 69 73 20 75 73 65 72 27 73 20 70 65 72 6d  this user's perm
e0a0: 69 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 63 6f 6e  issions */.  con
e0b0: 73 74 20 63 68 61 72 20 2a 7a 50 6f 72 74 20 3d  st char *zPort =
e0c0: 20 30 3b 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d   0;    /* Implem
e0d0: 65 6e 74 20 61 6e 20 48 54 54 50 20 73 65 72 76  ent an HTTP serv
e0e0: 65 72 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20  er process */.  
e0f0: 69 6e 74 20 75 73 65 43 68 72 6f 6f 74 4a 61 69  int useChrootJai
e100: 6c 20 3d 20 31 3b 20 20 20 20 2f 2a 20 54 72 75  l = 1;    /* Tru
e110: 65 20 74 6f 20 75 73 65 20 61 20 63 68 61 6e 67  e to use a chang
e120: 65 2d 72 6f 6f 74 20 6a 61 69 6c 20 2a 2f 0a 20  e-root jail */. 
e130: 20 73 74 72 75 63 74 20 70 61 73 73 77 64 20 2a   struct passwd *
e140: 70 77 64 20 3d 20 30 3b 20 20 20 2f 2a 20 49 6e  pwd = 0;   /* In
e150: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
e160: 74 68 65 20 75 73 65 72 20 2a 2f 0a 0a 20 20 2f  the user */..  /
e170: 2a 20 52 65 63 6f 72 64 20 74 68 65 20 74 69 6d  * Record the tim
e180: 65 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69 6e  e when processin
e190: 67 20 62 65 67 69 6e 73 2e 0a 20 20 2a 2f 0a 20  g begins..  */. 
e1a0: 20 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 62   gettimeofday(&b
e1b0: 65 67 69 6e 54 69 6d 65 2c 20 30 29 3b 0a 0a 20  eginTime, 0);.. 
e1c0: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6d 6d 61 6e   /* Parse comman
e1d0: 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 73  d-line arguments
e1e0: 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 61  .  */.  while( a
e1f0: 72 67 63 3e 31 20 26 26 20 61 72 67 76 5b 31 5d  rgc>1 && argv[1]
e200: 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [0]=='-' ){.    
e210: 63 68 61 72 20 2a 7a 20 3d 20 61 72 67 76 5b 31  char *z = argv[1
e220: 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 41 72  ];.    char *zAr
e230: 67 20 3d 20 61 72 67 63 3e 3d 33 20 3f 20 61 72  g = argc>=3 ? ar
e240: 67 76 5b 32 5d 20 3a 20 22 30 22 3b 0a 20 20 20  gv[2] : "0";.   
e250: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26   if( z[0]=='-' &
e260: 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b  & z[1]=='-' ) z+
e270: 2b 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  +;.    if( strcm
e280: 70 28 7a 2c 22 2d 75 73 65 72 22 29 3d 3d 30 20  p(z,"-user")==0 
e290: 29 7b 0a 20 20 20 20 20 20 7a 50 65 72 6d 55 73  ){.      zPermUs
e2a0: 65 72 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 7d  er = zArg;.    }
e2b0: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
e2c0: 7a 2c 22 2d 72 6f 6f 74 22 29 3d 3d 30 20 29 7b  z,"-root")==0 ){
e2d0: 0a 20 20 20 20 20 20 7a 52 6f 6f 74 20 3d 20 7a  .      zRoot = z
e2e0: 41 72 67 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  Arg;.    }else i
e2f0: 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6c 6f  f( strcmp(z,"-lo
e300: 67 66 69 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20  gfile")==0 ){.  
e310: 20 20 20 20 7a 4c 6f 67 46 69 6c 65 20 3d 20 7a      zLogFile = z
e320: 41 72 67 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  Arg;.    }else i
e330: 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 68 74  f( strcmp(z,"-ht
e340: 74 70 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tps")==0 ){.    
e350: 20 20 75 73 65 48 74 74 70 73 20 3d 20 61 74 6f    useHttps = ato
e360: 69 28 7a 41 72 67 29 3b 0a 20 20 20 20 20 20 7a  i(zArg);.      z
e370: 48 74 74 70 20 3d 20 75 73 65 48 74 74 70 73 20  Http = useHttps 
e380: 3f 20 22 68 74 74 70 22 20 3a 20 22 68 74 74 70  ? "http" : "http
e390: 73 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  s";.    }else if
e3a0: 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 70 6f  ( strcmp(z, "-po
e3b0: 72 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rt")==0 ){.     
e3c0: 20 7a 50 6f 72 74 20 3d 20 7a 41 72 67 3b 0a 20   zPort = zArg;. 
e3d0: 20 20 20 20 20 73 74 61 6e 64 61 6c 6f 6e 65 20       standalone 
e3e0: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 1;.    }else i
e3f0: 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 66  f( strcmp(z, "-f
e400: 61 6d 69 6c 79 22 29 3d 3d 30 20 29 7b 0a 20 20  amily")==0 ){.  
e410: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
e420: 41 72 67 2c 20 22 69 70 76 34 22 29 3d 3d 30 20  Arg, "ipv4")==0 
e430: 29 7b 0a 20 20 20 20 20 20 20 20 69 70 76 34 4f  ){.        ipv4O
e440: 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  nly = 1;.      }
e450: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
e460: 7a 41 72 67 2c 20 22 69 70 76 36 22 29 3d 3d 30  zArg, "ipv6")==0
e470: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 70 76 36   ){.        ipv6
e480: 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  Only = 1;.      
e490: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4d  }else{.        M
e4a0: 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e  alfunction(__LIN
e4b0: 45 5f 5f 2c 20 22 75 6e 6b 6e 6f 77 6e 20 49 50  E__, "unknown IP
e4c0: 20 70 72 6f 74 6f 63 6f 6c 3a 20 5b 25 73 5d 22   protocol: [%s]"
e4d0: 2c 20 7a 41 72 67 29 3b 0a 20 20 20 20 20 20 7d  , zArg);.      }
e4e0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
e4f0: 74 72 63 6d 70 28 7a 2c 20 22 2d 6a 61 69 6c 22  trcmp(z, "-jail"
e500: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
e510: 28 20 61 74 6f 69 28 7a 41 72 67 29 3d 3d 30 20  ( atoi(zArg)==0 
e520: 29 7b 0a 20 20 20 20 20 20 20 20 75 73 65 43 68  ){.        useCh
e530: 72 6f 6f 74 4a 61 69 6c 20 3d 20 30 3b 0a 20 20  rootJail = 0;.  
e540: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
e550: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d  if( strcmp(z, "-
e560: 64 65 62 75 67 22 29 3d 3d 30 20 29 7b 0a 20 20  debug")==0 ){.  
e570: 20 20 20 20 69 66 28 20 61 74 6f 69 28 7a 41 72      if( atoi(zAr
e580: 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75 73  g) ){.        us
e590: 65 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 20 20  eTimeout = 0;.  
e5a0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
e5b0: 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69  .      Malfuncti
e5c0: 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 75 6e  on(__LINE__, "un
e5d0: 6b 6e 6f 77 6e 20 61 72 67 75 6d 65 6e 74 3a 20  known argument: 
e5e0: 5b 25 73 5d 22 2c 20 7a 29 3b 0a 20 20 20 20 7d  [%s]", z);.    }
e5f0: 0a 20 20 20 20 61 72 67 76 20 2b 3d 20 32 3b 0a  .    argv += 2;.
e600: 20 20 20 20 61 72 67 63 20 2d 3d 20 32 3b 0a 20      argc -= 2;. 
e610: 20 7d 0a 20 20 69 66 28 20 7a 52 6f 6f 74 3d 3d   }.  if( zRoot==
e620: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61  0 ){.    if( sta
e630: 6e 64 61 6c 6f 6e 65 20 29 7b 0a 20 20 20 20 20  ndalone ){.     
e640: 20 7a 52 6f 6f 74 20 3d 20 22 2e 22 3b 0a 20 20   zRoot = ".";.  
e650: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d    }else{.      M
e660: 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e  alfunction(__LIN
e670: 45 5f 5f 2c 20 22 6e 6f 20 2d 2d 72 6f 6f 74 20  E__, "no --root 
e680: 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20  specified");.   
e690: 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 43   }.  }.  .  /* C
e6a0: 68 61 6e 67 65 20 64 69 72 65 63 74 6f 72 69 65  hange directorie
e6b0: 73 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 6f 66  s to the root of
e6c0: 20 74 68 65 20 48 54 54 50 20 66 69 6c 65 73 79   the HTTP filesy
e6d0: 73 74 65 6d 2e 20 20 54 68 65 6e 0a 20 20 2a 2a  stem.  Then.  **
e6e0: 20 63 72 65 61 74 65 20 61 20 63 68 72 6f 6f 74   create a chroot
e6f0: 20 6a 61 69 6c 20 74 68 65 72 65 2e 0a 20 20 2a   jail there..  *
e700: 2f 0a 20 20 69 66 28 20 63 68 64 69 72 28 7a 52  /.  if( chdir(zR
e710: 6f 6f 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 4d  oot)!=0 ){.    M
e720: 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e  alfunction(__LIN
e730: 45 5f 5f 2c 20 22 63 61 6e 6e 6f 74 20 63 68 61  E__, "cannot cha
e740: 6e 67 65 20 74 6f 20 64 69 72 65 63 74 6f 72 79  nge to directory
e750: 20 5b 25 73 5d 22 2c 20 7a 52 6f 6f 74 29 3b 0a   [%s]", zRoot);.
e760: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 69 6e    }..  /* Get in
e770: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
e780: 74 68 65 20 75 73 65 72 20 69 66 20 61 76 61 69  the user if avai
e790: 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 7a  lable */.  if( z
e7a0: 50 65 72 6d 55 73 65 72 20 29 20 70 77 64 20 3d  PermUser ) pwd =
e7b0: 20 67 65 74 70 77 6e 61 6d 28 7a 50 65 72 6d 55   getpwnam(zPermU
e7c0: 73 65 72 29 3b 0a 0a 20 20 2f 2a 20 45 6e 74 65  ser);..  /* Ente
e7d0: 72 20 74 68 65 20 63 68 72 6f 6f 74 20 6a 61 69  r the chroot jai
e7e0: 6c 20 69 66 20 72 65 71 75 65 73 74 65 64 20 2a  l if requested *
e7f0: 2f 20 20 0a 20 20 69 66 28 20 7a 50 65 72 6d 55  /  .  if( zPermU
e800: 73 65 72 20 26 26 20 75 73 65 43 68 72 6f 6f 74  ser && useChroot
e810: 4a 61 69 6c 20 26 26 20 67 65 74 75 69 64 28 29  Jail && getuid()
e820: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 63  ==0 ){.    if( c
e830: 68 72 6f 6f 74 28 22 2e 22 29 3c 30 20 29 7b 0a  hroot(".")<0 ){.
e840: 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f        Malfunctio
e850: 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 75 6e 61  n(__LINE__, "una
e860: 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 63 68  ble to create ch
e870: 72 6f 6f 74 20 6a 61 69 6c 22 29 3b 0a 20 20 20  root jail");.   
e880: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 52   }else{.      zR
e890: 6f 6f 74 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a  oot = "";.    }.
e8a0: 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 74 69 76 61    }..  /* Activa
e8b0: 74 65 20 74 68 65 20 73 65 72 76 65 72 2c 20 69  te the server, i
e8c0: 66 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20  f requested */. 
e8d0: 20 69 66 28 20 7a 50 6f 72 74 20 26 26 20 68 74   if( zPort && ht
e8e0: 74 70 5f 73 65 72 76 65 72 28 7a 50 6f 72 74 2c  tp_server(zPort,
e8f0: 20 30 29 20 29 7b 0a 20 20 20 20 4d 61 6c 66 75   0) ){.    Malfu
e900: 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c  nction(__LINE__,
e910: 20 22 66 61 69 6c 65 64 20 74 6f 20 73 74 61 72   "failed to star
e920: 74 20 73 65 72 76 65 72 22 29 3b 0a 20 20 7d 0a  t server");.  }.
e930: 0a 20 20 2f 2a 20 44 72 6f 70 20 72 6f 6f 74 20  .  /* Drop root 
e940: 70 72 69 76 69 6c 65 67 65 73 2e 0a 20 20 2a 2f  privileges..  */
e950: 0a 20 20 69 66 28 20 7a 50 65 72 6d 55 73 65 72  .  if( zPermUser
e960: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 77 64 20   ){.    if( pwd 
e970: 29 7b 0a 20 20 20 20 20 20 73 65 74 67 69 64 28  ){.      setgid(
e980: 70 77 64 2d 3e 70 77 5f 67 69 64 29 3b 0a 20 20  pwd->pw_gid);.  
e990: 20 20 20 20 73 65 74 75 69 64 28 70 77 64 2d 3e      setuid(pwd->
e9a0: 70 77 5f 75 69 64 29 3b 0a 20 20 20 20 7d 65 6c  pw_uid);.    }el
e9b0: 73 65 7b 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e  se{.      Malfun
e9c0: 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20  ction(__LINE__, 
e9d0: 22 6e 6f 20 73 75 63 68 20 75 73 65 72 20 5b 25  "no such user [%
e9e0: 73 5d 22 2c 20 7a 50 65 72 6d 55 73 65 72 29 3b  s]", zPermUser);
e9f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
ea00: 20 67 65 74 75 69 64 28 29 3d 3d 30 20 29 7b 0a   getuid()==0 ){.
ea10: 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28      Malfunction(
ea20: 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 63 61 6e 6e 6f  __LINE__, "canno
ea30: 74 20 72 75 6e 20 61 73 20 72 6f 6f 74 22 29 3b  t run as root");
ea40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 74  .  }..  /* Get t
ea50: 68 65 20 49 50 20 61 64 64 72 65 73 73 20 66 72  he IP address fr
ea60: 6f 6d 20 77 68 65 6e 20 74 68 65 20 72 65 71 75  om when the requ
ea70: 65 73 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 20  est originates. 
ea80: 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 61 64 64 72   */.  {.    addr
ea90: 65 73 73 20 72 65 6d 6f 74 65 41 64 64 72 3b 0a  ess remoteAddr;.
eaa0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
eab0: 20 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 72   size = sizeof(r
eac0: 65 6d 6f 74 65 41 64 64 72 29 3b 0a 20 20 20 20  emoteAddr);.    
ead0: 63 68 61 72 20 7a 48 6f 73 74 5b 4e 49 5f 4d 41  char zHost[NI_MA
eae0: 58 48 4f 53 54 5d 3b 0a 20 20 20 20 69 66 28 20  XHOST];.    if( 
eaf0: 67 65 74 70 65 65 72 6e 61 6d 65 28 30 2c 20 26  getpeername(0, &
eb00: 72 65 6d 6f 74 65 41 64 64 72 2e 73 61 2c 20 26  remoteAddr.sa, &
eb10: 73 69 7a 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  size)>=0 ){.    
eb20: 20 20 67 65 74 6e 61 6d 65 69 6e 66 6f 28 26 72    getnameinfo(&r
eb30: 65 6d 6f 74 65 41 64 64 72 2e 73 61 2c 20 73 69  emoteAddr.sa, si
eb40: 7a 65 2c 20 7a 48 6f 73 74 2c 20 73 69 7a 65 6f  ze, zHost, sizeo
eb50: 66 28 7a 48 6f 73 74 29 2c 20 30 2c 20 30 2c 0a  f(zHost), 0, 0,.
eb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb70: 20 20 4e 49 5f 4e 55 4d 45 52 49 43 48 4f 53 54    NI_NUMERICHOST
eb80: 29 3b 0a 20 20 20 20 20 20 7a 52 65 6d 6f 74 65  );.      zRemote
eb90: 41 64 64 72 20 3d 20 53 74 72 44 75 70 28 7a 48  Addr = StrDup(zH
eba0: 6f 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ost);.    }.  }.
ebb0: 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68  .  /* Process th
ebc0: 65 20 69 6e 70 75 74 20 73 74 72 65 61 6d 20 2a  e input stream *
ebd0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31  /.  for(i=0; i<1
ebe0: 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 72  00; i++){.    Pr
ebf0: 6f 63 65 73 73 4f 6e 65 52 65 71 75 65 73 74 28  ocessOneRequest(
ec00: 30 29 3b 0a 20 20 7d 0a 20 20 50 72 6f 63 65 73  0);.  }.  Proces
ec10: 73 4f 6e 65 52 65 71 75 65 73 74 28 31 29 3b 0a  sOneRequest(1);.
ec20: 20 20 65 78 69 74 28 30 29 3b 0a 7d 0a             exit(0);.}.