Documentation Source Text

Hex Artifact Content
Login

Artifact 7c983c55dd0a6f87b847c25636309a44dceb81aa:


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 79 20 73 65 63 75 72 69   facility securi
0120: 74 79 20 61 75 64 69 74 69 6e 67 0a 2a 2a 20 20  ty auditing.**  
0130: 20 20 20 2a 20 53 69 6d 70 6c 65 20 73 65 74 75     * Simple setu
0140: 70 20 2d 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61  p - no configura
0150: 74 69 6f 6e 20 66 69 6c 65 73 20 74 6f 20 6d 65  tion files to me
0160: 73 73 20 77 69 74 68 2e 0a 2a 2a 20 0a 2a 2a 20  ss with..** .** 
0170: 54 68 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d  This file implem
0180: 65 6e 74 73 20 61 20 73 6d 61 6c 6c 20 61 6e 64  ents a small and
0190: 20 73 69 6d 70 6c 65 20 62 75 74 20 73 65 63 75   simple but secu
01a0: 72 65 20 61 6e 64 20 65 66 66 65 63 74 69 76 65  re and effective
01b0: 20 77 65 62 0a 2a 2a 20 73 65 72 76 65 72 2e 20   web.** server. 
01c0: 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 66 72   There are no fr
01d0: 69 6c 6c 73 2e 20 20 41 6e 79 74 68 69 6e 67 20  ills.  Anything 
01e0: 74 68 61 74 20 63 6f 75 6c 64 20 62 65 20 72 65  that could be re
01f0: 61 73 6f 6e 61 62 6c 79 0a 2a 2a 20 6f 6d 69 74  asonably.** omit
0200: 74 65 64 20 68 61 73 20 62 65 65 6e 2e 0a 2a 2a  ted has been..**
0210: 0a 2a 2a 20 53 65 74 75 70 20 72 75 6c 65 73 3a  .** Setup rules:
0220: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 4c 61  .**.**    (1) La
0230: 75 6e 63 68 20 61 73 20 72 6f 6f 74 20 66 72 6f  unch as root fro
0240: 6d 20 69 6e 65 74 64 20 6c 69 6b 65 20 74 68 69  m inetd like thi
0250: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
0260: 20 20 20 20 68 74 74 70 64 20 2d 6c 6f 67 66 69      httpd -logfi
0270: 6c 65 20 6c 6f 67 66 69 6c 65 20 2d 72 6f 6f 74  le logfile -root
0280: 20 2f 68 6f 6d 65 2f 77 77 77 20 2d 75 73 65 72   /home/www -user
0290: 20 6e 6f 62 6f 64 79 0a 2a 2a 0a 2a 2a 20 20 20   nobody.**.**   
02a0: 20 20 20 20 20 49 74 20 77 69 6c 6c 20 61 75 74       It will aut
02b0: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 72 6f 6f  omatically chroo
02c0: 74 20 74 6f 20 2f 68 6f 6d 65 2f 77 77 77 20 61  t to /home/www a
02d0: 6e 64 20 62 65 63 6f 6d 65 20 75 73 65 72 20 6e  nd become user n
02e0: 6f 62 6f 64 79 2e 0a 2a 2a 20 20 20 20 20 20 20  obody..**       
02f0: 20 54 68 65 20 6c 6f 67 66 69 6c 65 20 6e 61 6d   The logfile nam
0300: 65 20 73 68 6f 75 6c 64 20 62 65 20 72 65 6c 61  e should be rela
0310: 74 69 76 65 20 74 6f 20 74 68 65 20 63 68 72 6f  tive to the chro
0320: 6f 74 20 6a 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 20  ot jail..**.**  
0330: 20 20 28 32 29 20 44 69 72 65 63 74 6f 72 69 65    (2) Directorie
0340: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 2a  s of the form "*
0350: 2e 77 65 62 73 69 74 65 22 20 28 65 78 3a 20 77  .website" (ex: w
0360: 77 77 5f 68 77 61 63 69 5f 63 6f 6d 2e 77 65 62  ww_hwaci_com.web
0370: 73 69 74 65 29 0a 2a 2a 20 20 20 20 20 20 20 20  site).**        
0380: 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74 2e  contain content.
0390: 20 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20    The directory 
03a0: 69 73 20 63 68 6f 73 65 6e 20 62 61 73 65 64 20  is chosen based 
03b0: 6f 6e 20 48 4f 53 54 2e 20 20 49 66 20 6e 6f 0a  on HOST.  If no.
03c0: 2a 2a 20 20 20 20 20 20 20 20 48 4f 53 54 20 6f  **        HOST o
03d0: 72 20 74 68 65 20 68 6f 73 74 20 64 69 72 65 63  r the host direc
03e0: 74 6f 72 79 20 69 73 20 6e 6f 74 20 66 6f 75 6e  tory is not foun
03f0: 64 2c 20 22 64 65 66 61 75 6c 74 2e 77 65 62 73  d, "default.webs
0400: 69 74 65 22 20 69 73 20 75 73 65 64 2e 0a 2a 2a  ite" is used..**
0410: 0a 2a 2a 20 20 20 20 28 33 29 20 41 6e 79 20 66  .**    (3) Any f
0420: 69 6c 65 20 6f 72 20 64 69 72 65 63 74 6f 72 79  ile or directory
0430: 20 77 68 6f 73 65 20 6e 61 6d 65 20 62 65 67 69   whose name begi
0440: 6e 73 20 77 69 74 68 20 22 2e 22 20 6f 72 20 22  ns with "." or "
0450: 2d 22 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  -" is ignored..*
0460: 2a 0a 2a 2a 20 20 20 20 28 34 29 20 43 68 61 72  *.**    (4) Char
0470: 61 63 74 65 72 73 20 6f 74 68 65 72 20 74 68 61  acters other tha
0480: 6e 20 61 2d 7a 41 2d 5a 30 2d 39 5f 2e 2c 2a 7e  n a-zA-Z0-9_.,*~
0490: 2f 20 69 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d  / in the filenam
04a0: 65 20 61 72 65 20 74 72 61 6e 73 6c 61 74 65 64  e are translated
04b0: 0a 2a 2a 20 20 20 20 20 20 20 20 69 6e 74 6f 20  .**        into 
04c0: 5f 2e 20 20 54 68 69 73 20 69 73 20 61 20 64 65  _.  This is a de
04d0: 66 65 6e 73 65 20 61 67 61 69 6e 73 74 20 63 72  fense against cr
04e0: 6f 73 73 2d 73 69 74 65 20 73 63 72 69 70 74 69  oss-site scripti
04f0: 6e 67 20 61 74 74 61 63 6b 73 20 61 6e 64 0a 2a  ng attacks and.*
0500: 2a 20 20 20 20 20 20 20 20 6f 74 68 65 72 20 6d  *        other m
0510: 69 73 63 68 69 65 66 2e 0a 2a 2a 0a 2a 2a 20 20  ischief..**.**  
0520: 20 20 28 35 29 20 45 78 65 63 75 74 61 62 6c 65    (5) Executable
0530: 20 66 69 6c 65 73 20 61 72 65 20 72 75 6e 20 61   files are run a
0540: 73 20 43 47 49 2e 20 20 41 6c 6c 20 6f 74 68 65  s CGI.  All othe
0550: 72 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 69  r files are deli
0560: 76 65 72 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  vered.**        
0570: 61 73 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  as is..**.**    
0580: 28 36 29 20 46 6f 72 20 53 53 4c 20 73 75 70 70  (6) For SSL supp
0590: 6f 72 74 20 75 73 65 20 73 74 75 6e 6e 65 6c 20  ort use stunnel 
05a0: 61 6e 64 20 61 64 64 20 74 68 65 20 2d 68 74 74  and add the -htt
05b0: 70 73 20 31 20 6f 70 74 69 6f 6e 20 6f 6e 20 74  ps 1 option on t
05c0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 68 74 74  he.**        htt
05d0: 70 64 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 2e  pd command-line.
05e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 37 29 20 49 66  .**.**    (7) If
05f0: 20 61 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 2d   a file named "-
0600: 61 75 74 68 22 20 65 78 69 73 74 73 20 69 6e 20  auth" exists in 
0610: 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f  the same directo
0620: 72 79 20 61 73 20 66 69 6c 65 20 74 6f 0a 2a 2a  ry as file to.**
0630: 20 20 20 20 20 20 20 20 62 65 20 72 75 6e 20 61          be run a
0640: 73 20 43 47 49 20 6f 72 20 74 6f 20 62 65 20 64  s CGI or to be d
0650: 65 6c 69 76 65 72 65 64 2c 20 74 68 65 6e 20 69  elivered, then i
0660: 74 20 63 6f 6e 74 61 69 6e 73 20 69 6e 66 6f 72  t contains infor
0670: 6d 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  mation.**       
0680: 20 66 6f 72 20 48 54 54 50 20 42 61 73 69 63 20   for HTTP Basic 
0690: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 2e 20 20  authorization.  
06a0: 53 65 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  See file format 
06b0: 64 65 74 61 69 6c 73 20 62 65 6c 6f 77 2e 0a 2a  details below..*
06c0: 2a 0a 2a 2a 0a 2a 2a 20 42 61 73 69 63 20 41 75  *.**.** Basic Au
06d0: 74 68 6f 72 69 7a 61 74 69 6f 6e 3a 0a 2a 2a 0a  thorization:.**.
06e0: 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 22  ** If the file "
06f0: 2d 61 75 74 68 22 20 65 78 69 73 74 73 20 69 6e  -auth" exists in
0700: 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74   the same direct
0710: 6f 72 79 20 61 73 20 74 68 65 20 63 6f 6e 74 65  ory as the conte
0720: 6e 74 20 66 69 6c 65 0a 2a 2a 20 28 66 6f 72 20  nt file.** (for 
0730: 62 6f 74 68 20 73 74 61 74 69 63 20 63 6f 6e 74  both static cont
0740: 65 6e 74 20 61 6e 64 20 43 47 49 29 20 74 68 65  ent and CGI) the
0750: 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  n it contains th
0760: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73  e information us
0770: 65 64 0a 2a 2a 20 66 6f 72 20 62 61 73 69 63 20  ed.** for basic 
0780: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 2e 20 20  authorization.  
0790: 54 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  The file format 
07a0: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
07b0: 2a 0a 2a 2a 20 20 20 20 2a 20 20 42 6c 61 6e 6b  *.**    *  Blank
07c0: 20 6c 69 6e 65 73 20 61 6e 64 20 6c 69 6e 65 73   lines and lines
07d0: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
07e0: 20 27 23 27 20 61 72 65 20 69 67 6e 6f 72 65 64   '#' are ignored
07f0: 0a 2a 2a 20 20 20 20 2a 20 20 22 68 74 74 70 2d  .**    *  "http-
0800: 72 65 64 69 72 65 63 74 22 20 66 6f 72 63 65 73  redirect" forces
0810: 20 61 20 72 65 64 69 72 65 63 74 20 74 6f 20 48   a redirect to H
0820: 54 54 50 53 20 69 66 20 6e 6f 74 20 74 68 65 72  TTPS if not ther
0830: 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 20 20 20  e already.**    
0840: 2a 20 20 22 68 74 74 70 73 2d 6f 6e 6c 79 22 20  *  "https-only" 
0850: 64 69 73 61 6c 6c 6f 77 73 20 6f 70 65 72 61 74  disallows operat
0860: 69 6f 6e 20 69 6e 20 48 54 54 50 0a 2a 2a 20 20  ion in HTTP.**  
0870: 20 20 2a 20 20 22 75 73 65 72 20 4e 41 4d 45 20    *  "user NAME 
0880: 4c 4f 47 49 4e 3a 50 41 53 53 57 4f 52 44 22 20  LOGIN:PASSWORD" 
0890: 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
08a0: 20 4c 4f 47 49 4e 3a 50 41 53 53 57 4f 52 44 20   LOGIN:PASSWORD 
08b0: 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 68 6f 72  .**       author
08c0: 69 7a 61 74 69 6f 6e 20 63 72 65 64 65 6e 74 69  ization credenti
08d0: 61 6c 73 20 61 72 65 20 70 72 6f 76 69 64 65 64  als are provided
08e0: 2c 20 61 6e 64 20 69 66 20 73 6f 20 73 65 74 73  , and if so sets
08f0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 52 45   the.**       RE
0900: 4d 4f 54 45 5f 55 53 45 52 20 74 6f 20 4e 41 4d  MOTE_USER to NAM
0910: 45 2e 0a 2a 2a 20 20 20 20 2a 20 20 22 72 65 61  E..**    *  "rea
0920: 6c 6d 20 54 45 58 54 22 20 73 65 74 73 20 74 68  lm TEXT" sets th
0930: 65 20 72 65 61 6c 6d 20 74 6f 20 54 45 58 54 2e  e realm to TEXT.
0940: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 63 61 6e  .**.** There can
0950: 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 22 75 73   be multiple "us
0960: 65 72 22 20 6c 69 6e 65 73 2e 20 20 49 66 20 6e  er" lines.  If n
0970: 6f 20 22 75 73 65 72 22 20 6c 69 6e 65 20 6d 61  o "user" line ma
0980: 74 63 68 65 73 2c 20 74 68 65 0a 2a 2a 20 72 65  tches, the.** re
0990: 71 75 65 73 74 20 66 61 69 6c 73 20 77 69 74 68  quest fails with
09a0: 20 61 20 34 30 31 20 65 72 72 6f 72 2e 0a 2a 2f   a 401 error..*/
09b0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f  .#include <stdio
09c0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74  .h>.#include <ct
09d0: 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ype.h>.#include 
09e0: 3c 73 79 73 6c 6f 67 2e 68 3e 0a 23 69 6e 63 6c  <syslog.h>.#incl
09f0: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23  ude <stdlib.h>.#
0a00: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61  include <sys/sta
0a10: 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75  t.h>.#include <u
0a20: 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64  nistd.h>.#includ
0a30: 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69 6e 63  e <fcntl.h>.#inc
0a40: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
0a50: 23 69 6e 63 6c 75 64 65 20 3c 70 77 64 2e 68 3e  #include <pwd.h>
0a60: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
0a70: 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ime.h>.#include 
0a80: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
0a90: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 6f 63 6b  nclude <sys/sock
0aa0: 65 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  et.h>.#include <
0ab0: 73 79 73 2f 77 61 69 74 2e 68 3e 0a 23 69 6e 63  sys/wait.h>.#inc
0ac0: 6c 75 64 65 20 3c 6e 65 74 69 6e 65 74 2f 69 6e  lude <netinet/in
0ad0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 72  .h>.#include <ar
0ae0: 70 61 2f 69 6e 65 74 2e 68 3e 0a 23 69 6e 63 6c  pa/inet.h>.#incl
0af0: 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e 0a 23  ude <stdarg.h>.#
0b00: 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e  include <time.h>
0b10: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
0b20: 69 6d 65 73 2e 68 3e 0a 23 69 66 64 65 66 20 6c  imes.h>.#ifdef l
0b30: 69 6e 75 78 0a 23 69 6e 63 6c 75 64 65 20 3c 73  inux.#include <s
0b40: 79 73 2f 73 65 6e 64 66 69 6c 65 2e 68 3e 0a 23  ys/sendfile.h>.#
0b50: 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20 3c  endif.#include <
0b60: 61 73 73 65 72 74 2e 68 3e 0a 0a 2f 2a 0a 2a 2a  assert.h>../*.**
0b70: 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20 73   Configure the s
0b80: 65 72 76 65 72 20 62 79 20 73 65 74 74 69 6e 67  erver by setting
0b90: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
0ba0: 61 63 72 6f 73 20 61 6e 64 20 72 65 63 6f 6d 70  acros and recomp
0bb0: 69 6c 69 6e 67 2e 0a 2a 2f 0a 23 69 66 6e 64 65  iling..*/.#ifnde
0bc0: 66 20 44 45 46 41 55 4c 54 5f 50 4f 52 54 0a 23  f DEFAULT_PORT.#
0bd0: 64 65 66 69 6e 65 20 44 45 46 41 55 4c 54 5f 50  define DEFAULT_P
0be0: 4f 52 54 20 22 38 30 22 0a 23 65 6e 64 69 66 0a  ORT "80".#endif.
0bf0: 23 69 66 6e 64 65 66 20 4d 41 58 5f 43 4f 4e 54  #ifndef MAX_CONT
0c00: 45 4e 54 5f 4c 45 4e 47 54 48 0a 23 64 65 66 69  ENT_LENGTH.#defi
0c10: 6e 65 20 4d 41 58 5f 43 4f 4e 54 45 4e 54 5f 4c  ne MAX_CONTENT_L
0c20: 45 4e 47 54 48 20 39 30 30 30 30 30 30 0a 23 65  ENGTH 9000000.#e
0c30: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ndif.../*.** The
0c40: 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 66 72   error number fr
0c50: 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e  om system calls.
0c60: 0a 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 65  .*/.extern int e
0c70: 72 72 6e 6f 3b 0a 0a 2f 2a 0a 2a 2a 20 57 65 20  rrno;../*.** We 
0c80: 72 65 63 6f 72 64 20 6d 6f 73 74 20 6f 66 20 74  record most of t
0c90: 68 65 20 73 74 61 74 65 20 69 6e 66 6f 72 6d 61  he state informa
0ca0: 74 69 6f 6e 20 61 73 20 67 6c 6f 62 61 6c 20 76  tion as global v
0cb0: 61 72 69 61 62 6c 65 73 2e 20 20 54 68 69 73 0a  ariables.  This.
0cc0: 2a 2a 20 73 61 76 65 73 20 68 61 76 69 6e 67 20  ** saves having 
0cd0: 74 6f 20 70 61 73 73 20 69 6e 66 6f 72 6d 61 74  to pass informat
0ce0: 69 6f 6e 20 74 6f 20 73 75 62 72 6f 75 74 69 6e  ion to subroutin
0cf0: 65 73 20 61 73 20 70 61 72 61 6d 65 74 65 72 73  es as parameters
0d00: 2c 20 61 6e 64 0a 2a 2a 20 6d 61 6b 65 73 20 74  , and.** makes t
0d10: 68 65 20 65 78 65 63 75 74 61 62 6c 65 20 73 6d  he executable sm
0d20: 61 6c 6c 65 72 2e 2e 2e 0a 2a 2f 0a 73 74 61 74  aller....*/.stat
0d30: 69 63 20 63 68 61 72 20 2a 7a 52 6f 6f 74 20 3d  ic char *zRoot =
0d40: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
0d50: 52 6f 6f 74 20 64 69 72 65 63 74 6f 72 79 20 6f  Root directory o
0d60: 66 20 74 68 65 20 77 65 62 73 69 74 65 20 2a 2f  f the website */
0d70: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 54  .static char *zT
0d80: 6d 70 4e 61 6d 20 3d 20 30 3b 20 20 20 20 20 20  mpNam = 0;      
0d90: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74    /* Name of a t
0da0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f  emporary file */
0db0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 54 6d  .static char zTm
0dc0: 70 4e 61 6d 42 75 66 5b 35 30 30 5d 3b 20 20 20  pNamBuf[500];   
0dd0: 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f    /* Space to ho
0de0: 6c 64 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  ld the temporary
0df0: 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 73 74 61   filename */.sta
0e00: 74 69 63 20 63 68 61 72 20 2a 7a 50 72 6f 74 6f  tic char *zProto
0e10: 63 6f 6c 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  col = 0;      /*
0e20: 20 54 68 65 20 70 72 6f 74 6f 63 6f 6c 20 62 65   The protocol be
0e30: 69 6e 67 20 75 73 69 6e 67 20 62 79 20 74 68 65  ing using by the
0e40: 20 62 72 6f 77 73 65 72 20 2a 2f 0a 73 74 61 74   browser */.stat
0e50: 69 63 20 63 68 61 72 20 2a 7a 4d 65 74 68 6f 64  ic char *zMethod
0e60: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
0e70: 54 68 65 20 6d 65 74 68 6f 64 2e 20 20 4d 75 73  The method.  Mus
0e80: 74 20 62 65 20 47 45 54 20 2a 2f 0a 73 74 61 74  t be GET */.stat
0e90: 69 63 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74  ic char *zScript
0ea0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
0eb0: 54 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 72 65  The object to re
0ec0: 74 72 69 65 76 65 20 2a 2f 0a 73 74 61 74 69 63  trieve */.static
0ed0: 20 63 68 61 72 20 2a 7a 52 65 61 6c 53 63 72 69   char *zRealScri
0ee0: 70 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 54 68  pt = 0;    /* Th
0ef0: 65 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74 72  e object to retr
0f00: 69 65 76 65 2e 20 20 53 61 6d 65 20 61 73 20 7a  ieve.  Same as z
0f10: 53 63 72 69 70 74 0a 20 20 20 20 20 20 20 20 20  Script.         
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 2a 2a 20 65 78 63 65 70          ** excep
0f40: 74 20 6d 69 67 68 74 20 68 61 76 65 20 22 2f 69  t might have "/i
0f50: 6e 64 65 78 2e 68 74 6d 6c 22 20 61 70 70 65 6e  ndex.html" appen
0f60: 64 65 64 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  ded */.static ch
0f70: 61 72 20 2a 7a 48 6f 6d 65 20 3d 20 30 3b 20 20  ar *zHome = 0;  
0f80: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
0f90: 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
0fa0: 69 6e 67 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 73  ing content */.s
0fb0: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 51 75 65  tatic char *zQue
0fc0: 72 79 53 74 72 69 6e 67 20 3d 20 30 3b 20 20 20  ryString = 0;   
0fd0: 2f 2a 20 54 68 65 20 71 75 65 72 79 20 73 74 72  /* The query str
0fe0: 69 6e 67 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f  ing on the end o
0ff0: 66 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 73 74  f the name */.st
1000: 61 74 69 63 20 63 68 61 72 20 2a 7a 46 69 6c 65  atic char *zFile
1010: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
1020: 2a 20 54 68 65 20 66 69 6c 65 6e 61 6d 65 20 6f  * The filename o
1030: 66 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20  f the object to 
1040: 72 65 74 72 69 65 76 65 20 2a 2f 0a 73 74 61 74  retrieve */.stat
1050: 69 63 20 69 6e 74 20 6c 65 6e 46 69 6c 65 20 3d  ic int lenFile =
1060: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
1070: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a 46  Length of the zF
1080: 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 73 74 61 74  ile name */.stat
1090: 69 63 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20  ic char *zDir = 
10a0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
10b0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65  Name of the dire
10c0: 63 74 6f 72 79 20 68 6f 6c 64 69 6e 67 20 7a 46  ctory holding zF
10d0: 69 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  ile */.static ch
10e0: 61 72 20 2a 7a 50 61 74 68 49 6e 66 6f 20 3d 20  ar *zPathInfo = 
10f0: 30 3b 20 20 20 20 20 20 2f 2a 20 50 61 72 74 20  0;      /* Part 
1100: 6f 66 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20  of the pathname 
1110: 70 61 73 74 20 74 68 65 20 66 69 6c 65 20 2a 2f  past the file */
1120: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 41  .static char *zA
1130: 67 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20  gent = 0;       
1140: 20 20 2f 2a 20 57 68 61 74 20 74 79 70 65 20 69    /* What type i
1150: 66 20 62 72 6f 77 73 65 72 20 69 73 20 6d 61 6b  f browser is mak
1160: 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 2a  ing this query *
1170: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a  /.static char *z
1180: 53 65 72 76 65 72 4e 61 6d 65 20 3d 20 30 3b 20  ServerName = 0; 
1190: 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 61     /* The name a
11a0: 66 74 65 72 20 74 68 65 20 68 74 74 70 3a 2f 2f  fter the http://
11b0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
11c0: 2a 7a 53 65 72 76 65 72 50 6f 72 74 20 3d 20 30  *zServerPort = 0
11d0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 72 74  ;    /* The port
11e0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 73 74 61 74 69   number */.stati
11f0: 63 20 63 68 61 72 20 2a 7a 43 6f 6f 6b 69 65 20  c char *zCookie 
1200: 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  = 0;        /* C
1210: 6f 6f 6b 69 65 73 20 72 65 70 6f 72 74 65 64 20  ookies reported 
1220: 77 69 74 68 20 74 68 65 20 72 65 71 75 65 73 74  with the request
1230: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
1240: 2a 7a 48 74 74 70 48 6f 73 74 20 3d 20 30 3b 20  *zHttpHost = 0; 
1250: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 61 63 63       /* Name acc
1260: 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 77 65  ording to the we
1270: 62 20 62 72 6f 77 73 65 72 20 2a 2f 0a 73 74 61  b browser */.sta
1280: 74 69 63 20 63 68 61 72 20 2a 7a 52 65 61 6c 50  tic char *zRealP
1290: 6f 72 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  ort = 0;      /*
12a0: 20 54 68 65 20 72 65 61 6c 20 54 43 50 20 70 6f   The real TCP po
12b0: 72 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20  rt when running 
12c0: 61 73 20 64 61 65 6d 6f 6e 20 2a 2f 0a 73 74 61  as daemon */.sta
12d0: 74 69 63 20 63 68 61 72 20 2a 7a 52 65 6d 6f 74  tic char *zRemot
12e0: 65 41 64 64 72 20 3d 20 30 3b 20 20 20 20 2f 2a  eAddr = 0;    /*
12f0: 20 49 50 20 61 64 64 72 65 73 73 20 6f 66 20 74   IP address of t
1300: 68 65 20 72 65 71 75 65 73 74 20 2a 2f 0a 73 74  he request */.st
1310: 61 74 69 63 20 63 68 61 72 20 2a 7a 52 65 66 65  atic char *zRefe
1320: 72 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  rer = 0;       /
1330: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 61  * Name of the pa
1340: 67 65 20 74 68 61 74 20 72 65 66 65 72 65 64 20  ge that refered 
1350: 74 6f 20 75 73 20 2a 2f 0a 73 74 61 74 69 63 20  to us */.static 
1360: 63 68 61 72 20 2a 7a 41 63 63 65 70 74 20 3d 20  char *zAccept = 
1370: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61  0;        /* Wha
1380: 74 20 66 6f 72 6d 61 74 73 20 77 69 6c 6c 20 62  t formats will b
1390: 65 20 61 63 63 65 70 74 65 64 20 2a 2f 0a 73 74  e accepted */.st
13a0: 61 74 69 63 20 63 68 61 72 20 2a 7a 43 6f 6e 74  atic char *zCont
13b0: 65 6e 74 4c 65 6e 67 74 68 20 3d 20 30 3b 20 2f  entLength = 0; /
13c0: 2a 20 43 6f 6e 74 65 6e 74 20 6c 65 6e 67 74 68  * Content length
13d0: 20 72 65 70 6f 72 74 65 64 20 69 6e 20 74 68 65   reported in the
13e0: 20 68 65 61 64 65 72 20 2a 2f 0a 73 74 61 74 69   header */.stati
13f0: 63 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74  c char *zContent
1400: 54 79 70 65 20 3d 20 30 3b 20 20 20 2f 2a 20 43  Type = 0;   /* C
1410: 6f 6e 74 65 6e 74 20 74 79 70 65 20 72 65 70 6f  ontent type repo
1420: 72 74 65 64 20 69 6e 20 74 68 65 20 68 65 61 64  rted in the head
1430: 65 72 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  er */.static cha
1440: 72 20 2a 7a 51 75 65 72 79 53 75 66 66 69 78 20  r *zQuerySuffix 
1450: 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 70 61  = 0;   /* The pa
1460: 72 74 20 6f 66 20 74 68 65 20 55 52 4c 20 61 66  rt of the URL af
1470: 74 65 72 20 74 68 65 20 66 69 72 73 74 20 3f 20  ter the first ? 
1480: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
1490: 7a 41 75 74 68 54 79 70 65 20 3d 20 30 3b 20 20  zAuthType = 0;  
14a0: 20 20 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 61      /* Authoriza
14b0: 74 69 6f 6e 20 74 79 70 65 20 28 62 61 73 69 63  tion type (basic
14c0: 20 6f 72 20 64 69 67 65 73 74 29 20 2a 2f 0a 73   or digest) */.s
14d0: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 41 75 74  tatic char *zAut
14e0: 68 41 72 67 20 3d 20 30 3b 20 20 20 20 20 20 20  hArg = 0;       
14f0: 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e  /* Authorization
1500: 20 76 61 6c 75 65 73 20 2a 2f 0a 73 74 61 74 69   values */.stati
1510: 63 20 63 68 61 72 20 2a 7a 52 65 6d 6f 74 65 55  c char *zRemoteU
1520: 73 65 72 20 3d 20 30 3b 20 20 20 20 2f 2a 20 52  ser = 0;    /* R
1530: 45 4d 4f 54 45 5f 55 53 45 52 20 73 65 74 20 62  EMOTE_USER set b
1540: 79 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  y authorization 
1550: 6d 6f 64 75 6c 65 20 2a 2f 0a 73 74 61 74 69 63  module */.static
1560: 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 20 20 20   int nIn = 0;   
1570: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1580: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
1590: 20 69 6e 70 75 74 20 2a 2f 0a 73 74 61 74 69 63   input */.static
15a0: 20 69 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 20 20   int nOut = 0;  
15b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
15c0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
15d0: 20 6f 75 74 70 75 74 20 2a 2f 0a 73 74 61 74 69   output */.stati
15e0: 63 20 63 68 61 72 20 7a 52 65 70 6c 79 53 74 61  c char zReplySta
15f0: 74 75 73 5b 34 5d 3b 20 20 20 20 20 2f 2a 20 52  tus[4];     /* R
1600: 65 70 6c 79 20 73 74 61 74 75 73 20 63 6f 64 65  eply status code
1610: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73   */.static int s
1620: 74 61 74 75 73 53 65 6e 74 20 3d 20 30 3b 20 20  tatusSent = 0;  
1630: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 61 66 74       /* True aft
1640: 65 72 20 73 74 61 74 75 73 20 6c 69 6e 65 20 69  er status line i
1650: 73 20 73 65 6e 74 20 2a 2f 0a 73 74 61 74 69 63  s sent */.static
1660: 20 63 68 61 72 20 2a 7a 4c 6f 67 46 69 6c 65 20   char *zLogFile 
1670: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4c 6f  = 0;       /* Lo
1680: 67 20 74 6f 20 74 68 69 73 20 66 69 6c 65 20 2a  g to this file *
1690: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 62  /.static int deb
16a0: 75 67 46 6c 61 67 20 3d 20 30 3b 20 20 20 20 20  ugFlag = 0;     
16b0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 62 65     /* True if be
16c0: 69 6e 67 20 64 65 62 75 67 67 65 64 20 2a 2f 0a  ing debugged */.
16d0: 73 74 61 74 69 63 20 74 69 6d 65 5f 74 20 62 65  static time_t be
16e0: 67 69 6e 54 69 6d 65 3b 20 20 20 20 20 20 20 20  ginTime;        
16f0: 20 2f 2a 20 54 69 6d 65 20 77 68 65 6e 20 74 68   /* Time when th
1700: 69 73 20 70 72 6f 63 65 73 73 20 73 74 61 72 74  is process start
1710: 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
1720: 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20  closeConnection 
1730: 3d 20 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f  = 0;  /* True to
1740: 20 73 65 6e 64 20 43 6f 6e 6e 65 63 74 69 6f 6e   send Connection
1750: 3a 20 63 6c 6f 73 65 20 69 6e 20 72 65 70 6c 79  : close in reply
1760: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e   */.static int n
1770: 52 65 71 75 65 73 74 20 3d 20 30 3b 20 20 20 20  Request = 0;    
1780: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1790: 66 20 72 65 71 75 65 73 74 73 20 70 72 6f 63 65  f requests proce
17a0: 73 73 65 64 20 2a 2f 0a 73 74 61 74 69 63 20 69  ssed */.static i
17b0: 6e 74 20 6f 6d 69 74 4c 6f 67 20 3d 20 30 3b 20  nt omitLog = 0; 
17c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
17d0: 6f 74 20 6d 61 6b 65 20 6c 6f 67 66 69 6c 65 20  ot make logfile 
17e0: 65 6e 74 72 69 65 73 20 69 66 20 74 72 75 65 20  entries if true 
17f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73  */.static int us
1800: 65 48 74 74 70 73 20 3d 20 30 3b 20 20 20 20 20  eHttps = 0;     
1810: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75      /* True to u
1820: 73 65 20 48 54 54 50 53 3a 20 69 6e 73 74 65 61  se HTTPS: instea
1830: 64 20 6f 66 20 48 54 54 50 3a 20 2a 2f 0a 73 74  d of HTTP: */.st
1840: 61 74 69 63 20 63 68 61 72 20 2a 7a 48 74 74 70  atic char *zHttp
1850: 20 3d 20 22 68 74 74 70 22 3b 20 20 20 20 20 2f   = "http";     /
1860: 2a 20 68 74 74 70 20 6f 72 20 68 74 74 70 73 20  * http or https 
1870: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73  */.static int us
1880: 65 54 69 6d 65 6f 75 74 20 3d 20 31 3b 20 20 20  eTimeout = 1;   
1890: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75      /* True to u
18a0: 73 65 20 74 69 6d 65 73 20 2a 2f 0a 0a 2f 2a 0a  se times */../*.
18b0: 2a 2a 20 43 68 61 6e 67 65 20 65 76 65 72 79 20  ** Change every 
18c0: 73 70 61 63 65 20 6f 72 20 75 6e 70 72 69 6e 74  space or unprint
18d0: 61 62 6c 65 20 63 68 61 72 61 63 74 65 72 20 69  able character i
18e0: 6e 20 74 68 65 20 7a 41 67 65 6e 74 5b 5d 20 73  n the zAgent[] s
18f0: 74 72 69 6e 67 0a 2a 2a 20 69 6e 74 6f 20 61 6e  tring.** into an
1900: 20 5f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65   _..**.** If the
1910: 20 75 73 65 72 20 61 67 65 6e 74 20 73 74 72 69   user agent stri
1920: 6e 67 20 63 6f 6e 74 61 69 6e 73 20 63 65 72 74  ng contains cert
1930: 61 69 6e 20 70 72 6f 68 69 62 69 74 65 64 20 73  ain prohibited s
1940: 74 72 69 6e 67 2c 20 74 68 65 6e 0a 2a 2a 20 65  tring, then.** e
1950: 78 69 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  xit immediately.
1960: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1970: 46 69 78 75 70 55 73 65 72 41 67 65 6e 74 28 76  FixupUserAgent(v
1980: 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  oid){.  int i;. 
1990: 20 69 66 28 20 7a 41 67 65 6e 74 3d 3d 30 20 7c   if( zAgent==0 |
19a0: 7c 20 7a 41 67 65 6e 74 5b 30 5d 3d 3d 30 20 29  | zAgent[0]==0 )
19b0: 20 7a 41 67 65 6e 74 20 3d 20 22 2a 22 3b 0a 20   zAgent = "*";. 
19c0: 20 66 6f 72 28 69 3d 30 3b 20 7a 41 67 65 6e 74   for(i=0; zAgent
19d0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  [i]; i++){.    i
19e0: 6e 74 20 63 20 3d 20 7a 41 67 65 6e 74 5b 69 5d  nt c = zAgent[i]
19f0: 3b 0a 20 20 20 20 69 66 28 20 63 3c 27 21 27 20  ;.    if( c<'!' 
1a00: 7c 7c 20 63 3e 27 7e 27 20 20 29 7b 20 7a 41 67  || c>'~'  ){ zAg
1a10: 65 6e 74 5b 69 5d 20 3d 20 27 5f 27 3b 20 7d 0a  ent[i] = '_'; }.
1a20: 20 20 7d 0a 23 69 66 20 30 0a 20 20 69 66 28 20    }.#if 0.  if( 
1a30: 73 74 72 6e 63 6d 70 28 7a 41 67 65 6e 74 2c 22  strncmp(zAgent,"
1a40: 6d 73 6e 62 6f 74 22 2c 36 29 3d 3d 30 20 29 7b  msnbot",6)==0 ){
1a50: 0a 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20  .    exit(0);.  
1a60: 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69  }.#endif.  for(i
1a70: 3d 30 3b 20 7a 41 67 65 6e 74 5b 69 5d 3b 20 69  =0; zAgent[i]; i
1a80: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 41 67  ++){.    if( zAg
1a90: 65 6e 74 5b 69 5d 3d 3d 27 57 27 20 26 26 20 73  ent[i]=='W' && s
1aa0: 74 72 6e 63 6d 70 28 26 7a 41 67 65 6e 74 5b 69  trncmp(&zAgent[i
1ab0: 5d 2c 22 57 69 6e 64 6f 77 73 5f 39 22 2c 39 29  ],"Windows_9",9)
1ac0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 65 78 69  ==0 ){.      exi
1ad0: 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  t(0);.    }.  }.
1ae0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 6e  }../*.** Make an
1af0: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6c 6f   entry in the lo
1b00: 67 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 20  g file.  If the 
1b10: 48 54 54 50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  HTTP connection 
1b20: 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 63 6c 6f  should be.** clo
1b30: 73 65 64 2c 20 74 68 65 6e 20 74 65 72 6d 69 6e  sed, then termin
1b40: 61 74 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ate this process
1b50: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 72 65 74  .  Otherwise ret
1b60: 75 72 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  urn..*/.static v
1b70: 6f 69 64 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79  oid MakeLogEntry
1b80: 28 69 6e 74 20 61 29 7b 0a 20 20 46 49 4c 45 20  (int a){.  FILE 
1b90: 2a 6c 6f 67 3b 0a 20 20 69 66 28 20 7a 54 6d 70  *log;.  if( zTmp
1ba0: 4e 61 6d 20 29 7b 0a 20 20 20 20 75 6e 6c 69 6e  Nam ){.    unlin
1bb0: 6b 28 7a 54 6d 70 4e 61 6d 29 3b 0a 20 20 7d 0a  k(zTmpNam);.  }.
1bc0: 20 20 69 66 28 20 7a 4c 6f 67 46 69 6c 65 20 26    if( zLogFile &
1bd0: 26 20 21 6f 6d 69 74 4c 6f 67 20 29 7b 0a 20 20  & !omitLog ){.  
1be0: 20 20 74 69 6d 65 5f 74 20 6e 6f 77 3b 0a 20 20    time_t now;.  
1bf0: 20 20 73 74 72 75 63 74 20 74 6d 20 2a 70 54 6d    struct tm *pTm
1c00: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 74 6d 73  ;.    struct tms
1c10: 20 73 54 6d 73 3b 0a 20 20 20 20 64 6f 75 62 6c   sTms;.    doubl
1c20: 65 20 72 53 63 61 6c 65 3b 0a 20 20 20 20 69 6e  e rScale;.    in
1c30: 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 7a 44  t i;.    char zD
1c40: 61 74 65 5b 32 30 30 5d 3b 0a 20 20 20 20 63 68  ate[200];.    ch
1c50: 61 72 20 2a 7a 52 4d 20 3d 20 7a 52 65 6d 6f 74  ar *zRM = zRemot
1c60: 65 55 73 65 72 20 3f 20 7a 52 65 6d 6f 74 65 55  eUser ? zRemoteU
1c70: 73 65 72 20 3a 20 22 2a 22 3b 0a 0a 20 20 20 20  ser : "*";..    
1c80: 69 66 28 20 7a 53 63 72 69 70 74 3d 3d 30 20 7c  if( zScript==0 |
1c90: 7c 20 7a 53 63 72 69 70 74 5b 30 5d 3d 3d 30 20  | zScript[0]==0 
1ca0: 29 20 7a 53 63 72 69 70 74 20 3d 20 22 2a 22 3b  ) zScript = "*";
1cb0: 0a 20 20 20 20 69 66 28 20 7a 52 65 6d 6f 74 65  .    if( zRemote
1cc0: 41 64 64 72 3d 3d 30 20 7c 7c 20 7a 52 65 6d 6f  Addr==0 || zRemo
1cd0: 74 65 41 64 64 72 5b 30 5d 3d 3d 30 20 29 20 7a  teAddr[0]==0 ) z
1ce0: 52 65 6d 6f 74 65 41 64 64 72 20 3d 20 22 2a 22  RemoteAddr = "*"
1cf0: 3b 0a 20 20 20 20 69 66 28 20 7a 48 74 74 70 48  ;.    if( zHttpH
1d00: 6f 73 74 3d 3d 30 20 7c 7c 20 7a 48 74 74 70 48  ost==0 || zHttpH
1d10: 6f 73 74 5b 30 5d 3d 3d 30 20 29 20 7a 48 74 74  ost[0]==0 ) zHtt
1d20: 70 48 6f 73 74 20 3d 20 22 2a 22 3b 0a 20 20 20  pHost = "*";.   
1d30: 20 69 66 28 20 7a 52 65 66 65 72 65 72 3d 3d 30   if( zReferer==0
1d40: 20 7c 7c 20 7a 52 65 66 65 72 65 72 5b 30 5d 3d   || zReferer[0]=
1d50: 3d 30 20 29 20 7a 52 65 66 65 72 65 72 20 3d 20  =0 ) zReferer = 
1d60: 22 2a 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  "*";.    for(i=0
1d70: 3b 20 7a 52 65 66 65 72 65 72 5b 69 5d 3b 20 69  ; zReferer[i]; i
1d80: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20  ++){ .      if( 
1d90: 69 73 73 70 61 63 65 28 7a 52 65 66 65 72 65 72  isspace(zReferer
1da0: 5b 69 5d 29 20 29 7b 20 7a 52 65 66 65 72 65 72  [i]) ){ zReferer
1db0: 20 3d 20 22 2a 22 3b 20 62 72 65 61 6b 3b 20 7d   = "*"; break; }
1dc0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
1dd0: 41 67 65 6e 74 3d 3d 30 20 7c 7c 20 7a 41 67 65  Agent==0 || zAge
1de0: 6e 74 5b 30 5d 3d 3d 30 20 29 20 7a 41 67 65 6e  nt[0]==0 ) zAgen
1df0: 74 20 3d 20 22 2a 22 3b 0a 20 20 20 20 74 69 6d  t = "*";.    tim
1e00: 65 28 26 6e 6f 77 29 3b 0a 20 20 20 20 70 54 6d  e(&now);.    pTm
1e10: 20 3d 20 6c 6f 63 61 6c 74 69 6d 65 28 26 6e 6f   = localtime(&no
1e20: 77 29 3b 0a 20 20 20 20 73 74 72 66 74 69 6d 65  w);.    strftime
1e30: 28 7a 44 61 74 65 2c 20 73 69 7a 65 6f 66 28 7a  (zDate, sizeof(z
1e40: 44 61 74 65 29 2c 20 22 25 59 2d 25 6d 2d 25 64  Date), "%Y-%m-%d
1e50: 20 25 48 3a 25 4d 3a 25 53 22 2c 20 70 54 6d 29   %H:%M:%S", pTm)
1e60: 3b 0a 20 20 20 20 74 69 6d 65 73 28 26 73 54 6d  ;.    times(&sTm
1e70: 73 29 3b 0a 20 20 20 20 72 53 63 61 6c 65 20 3d  s);.    rScale =
1e80: 20 31 2e 30 2f 28 64 6f 75 62 6c 65 29 73 79 73   1.0/(double)sys
1e90: 63 6f 6e 66 28 5f 53 43 5f 43 4c 4b 5f 54 43 4b  conf(_SC_CLK_TCK
1ea0: 29 3b 0a 20 20 20 20 69 66 28 20 28 6c 6f 67 20  );.    if( (log 
1eb0: 3d 20 66 6f 70 65 6e 28 7a 4c 6f 67 46 69 6c 65  = fopen(zLogFile
1ec0: 2c 22 61 22 29 29 21 3d 30 20 29 7b 0a 23 69 66  ,"a"))!=0 ){.#if
1ed0: 64 65 66 20 43 4f 4d 42 49 4e 45 44 5f 4c 4f 47  def COMBINED_LOG
1ee0: 5f 46 4f 52 4d 41 54 0a 20 20 20 20 20 20 73 74  _FORMAT.      st
1ef0: 72 66 74 69 6d 65 28 7a 44 61 74 65 2c 20 73 69  rftime(zDate, si
1f00: 7a 65 6f 66 28 7a 44 61 74 65 29 2c 20 22 25 64  zeof(zDate), "%d
1f10: 2f 25 62 2f 25 59 3a 25 48 3a 25 4d 3a 25 53 20  /%b/%Y:%H:%M:%S 
1f20: 25 7a 22 2c 20 70 54 6d 29 3b 0a 20 20 20 20 20  %z", pTm);.     
1f30: 20 66 70 72 69 6e 74 66 28 6c 6f 67 2c 20 22 25   fprintf(log, "%
1f40: 73 20 2d 20 2d 20 5b 25 73 5d 20 5c 22 25 73 20  s - - [%s] \"%s 
1f50: 25 73 20 25 73 5c 22 20 25 73 20 25 64 20 5c 22  %s %s\" %s %d \"
1f60: 25 73 5c 22 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a  %s\" \"%s\"\n",.
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 52                zR
1f80: 65 6d 6f 74 65 41 64 64 72 2c 20 7a 44 61 74 65  emoteAddr, zDate
1f90: 2c 20 7a 4d 65 74 68 6f 64 2c 20 7a 53 63 72 69  , zMethod, zScri
1fa0: 70 74 2c 20 7a 50 72 6f 74 6f 63 6f 6c 2c 0a 20  pt, zProtocol,. 
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 52 65               zRe
1fc0: 70 6c 79 53 74 61 74 75 73 2c 20 6e 4f 75 74 2c  plyStatus, nOut,
1fd0: 20 7a 52 65 66 65 72 65 72 2c 20 7a 41 67 65 6e   zReferer, zAgen
1fe0: 74 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  t);.#else.      
1ff0: 73 74 72 66 74 69 6d 65 28 7a 44 61 74 65 2c 20  strftime(zDate, 
2000: 73 69 7a 65 6f 66 28 7a 44 61 74 65 29 2c 20 22  sizeof(zDate), "
2010: 25 59 2d 25 6d 2d 25 64 20 25 48 3a 25 4d 3a 25  %Y-%m-%d %H:%M:%
2020: 53 22 2c 20 70 54 6d 29 3b 0a 20 20 20 20 20 20  S", pTm);.      
2030: 66 70 72 69 6e 74 66 28 6c 6f 67 2c 20 22 25 73  fprintf(log, "%s
2040: 20 25 73 20 25 73 3a 2f 2f 25 73 25 73 20 25 73   %s %s://%s%s %s
2050: 20 25 73 20 25 64 20 25 64 20 25 67 20 25 67 20   %s %d %d %g %g 
2060: 25 67 20 25 67 20 25 64 20 25 64 20 25 73 20 25  %g %g %d %d %s %
2070: 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  s\n", .         
2080: 20 7a 44 61 74 65 2c 20 7a 52 65 6d 6f 74 65 41   zDate, zRemoteA
2090: 64 64 72 2c 20 7a 48 74 74 70 2c 20 7a 48 74 74  ddr, zHttp, zHtt
20a0: 70 48 6f 73 74 2c 20 7a 53 63 72 69 70 74 2c 20  pHost, zScript, 
20b0: 7a 52 65 66 65 72 65 72 2c 0a 20 20 20 20 20 20  zReferer,.      
20c0: 20 20 20 20 7a 52 65 70 6c 79 53 74 61 74 75 73      zReplyStatus
20d0: 2c 20 6e 49 6e 2c 20 6e 4f 75 74 2c 0a 20 20 20  , nIn, nOut,.   
20e0: 20 20 20 20 20 20 20 72 53 63 61 6c 65 2a 73 54         rScale*sT
20f0: 6d 73 2e 74 6d 73 5f 75 74 69 6d 65 2c 0a 20 20  ms.tms_utime,.  
2100: 20 20 20 20 20 20 20 20 72 53 63 61 6c 65 2a 73          rScale*s
2110: 54 6d 73 2e 74 6d 73 5f 73 74 69 6d 65 2c 0a 20  Tms.tms_stime,. 
2120: 20 20 20 20 20 20 20 20 20 72 53 63 61 6c 65 2a           rScale*
2130: 73 54 6d 73 2e 74 6d 73 5f 63 75 74 69 6d 65 2c  sTms.tms_cutime,
2140: 0a 20 20 20 20 20 20 20 20 20 20 72 53 63 61 6c  .          rScal
2150: 65 2a 73 54 6d 73 2e 74 6d 73 5f 63 73 74 69 6d  e*sTms.tms_cstim
2160: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 28 69 6e  e,.          (in
2170: 74 29 28 6e 6f 77 20 2d 20 62 65 67 69 6e 54 69  t)(now - beginTi
2180: 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 6e  me),.          n
2190: 52 65 71 75 65 73 74 2c 20 7a 41 67 65 6e 74 2c  Request, zAgent,
21a0: 20 7a 52 4d 0a 20 20 20 20 20 20 29 3b 0a 23 65   zRM.      );.#e
21b0: 6e 64 69 66 0a 20 20 20 20 20 20 66 63 6c 6f 73  ndif.      fclos
21c0: 65 28 6c 6f 67 29 3b 0a 20 20 20 20 20 20 6e 49  e(log);.      nI
21d0: 6e 20 3d 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20  n = nOut = 0;.  
21e0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 63 6c    }.  }.  if( cl
21f0: 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 29 7b  oseConnection ){
2200: 0a 20 20 20 20 65 78 69 74 28 61 29 3b 0a 20 20  .    exit(a);.  
2210: 7d 0a 20 20 73 74 61 74 75 73 53 65 6e 74 20 3d  }.  statusSent =
2220: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c   0;.}../*.** All
2230: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 73 61 66  ocate memory saf
2240: 65 6c 79 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ely.*/.static ch
2250: 61 72 20 2a 53 61 66 65 4d 61 6c 6c 6f 63 28 20  ar *SafeMalloc( 
2260: 69 6e 74 20 73 69 7a 65 20 29 7b 0a 20 20 63 68  int size ){.  ch
2270: 61 72 20 2a 70 3b 0a 0a 20 20 70 20 3d 20 28 63  ar *p;..  p = (c
2280: 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 73 69 7a 65  har*)malloc(size
2290: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
22a0: 0a 20 20 20 20 73 74 72 63 70 79 28 7a 52 65 70  .    strcpy(zRep
22b0: 6c 79 53 74 61 74 75 73 2c 20 22 39 39 38 22 29  lyStatus, "998")
22c0: 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74  ;.    MakeLogEnt
22d0: 72 79 28 31 29 3b 0a 20 20 20 20 65 78 69 74 28  ry(1);.    exit(
22e0: 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
22f0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   p;.}../*.** Set
2300: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 6e   the value of en
2310: 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
2320: 6c 65 20 7a 56 61 72 20 74 6f 20 7a 56 61 6c 75  le zVar to zValu
2330: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2340: 64 20 53 65 74 45 6e 76 28 63 6f 6e 73 74 20 63  d SetEnv(const c
2350: 68 61 72 20 2a 7a 56 61 72 2c 20 63 6f 6e 73 74  har *zVar, const
2360: 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 29 7b 0a   char *zValue){.
2370: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74    char *z;.  int
2380: 20 6c 65 6e 3b 0a 20 20 69 66 28 20 7a 56 61 6c   len;.  if( zVal
2390: 75 65 3d 3d 30 20 29 20 7a 56 61 6c 75 65 3d 22  ue==0 ) zValue="
23a0: 22 3b 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65  ";.  len = strle
23b0: 6e 28 7a 56 61 72 29 20 2b 20 73 74 72 6c 65 6e  n(zVar) + strlen
23c0: 28 7a 56 61 6c 75 65 29 20 2b 20 32 3b 0a 20 20  (zValue) + 2;.  
23d0: 7a 20 3d 20 53 61 66 65 4d 61 6c 6c 6f 63 28 6c  z = SafeMalloc(l
23e0: 65 6e 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a  en);.  sprintf(z
23f0: 2c 22 25 73 3d 25 73 22 2c 7a 56 61 72 2c 7a 56  ,"%s=%s",zVar,zV
2400: 61 6c 75 65 29 3b 0a 20 20 70 75 74 65 6e 76 28  alue);.  putenv(
2410: 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  z);.}../*.** Rem
2420: 6f 76 65 20 74 68 65 20 66 69 72 73 74 20 73 70  ove the first sp
2430: 61 63 65 2d 64 65 6c 69 6d 69 74 65 64 20 74 6f  ace-delimited to
2440: 6b 65 6e 20 66 72 6f 6d 20 61 20 73 74 72 69 6e  ken from a strin
2450: 67 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  g and return.** 
2460: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e  a pointer to it.
2470: 20 20 41 64 64 20 61 20 4e 55 4c 4c 20 74 6f 20    Add a NULL to 
2480: 74 68 65 20 73 74 72 69 6e 67 20 74 6f 20 74 65  the string to te
2490: 72 6d 69 6e 61 74 65 20 74 68 65 20 74 6f 6b 65  rminate the toke
24a0: 6e 2e 0a 2a 2a 20 4d 61 6b 65 20 2a 7a 4c 65 66  n..** Make *zLef
24b0: 74 4f 76 65 72 20 70 6f 69 6e 74 20 74 6f 20 74  tOver point to t
24c0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
24d0: 6e 65 78 74 20 74 6f 6b 65 6e 2e 0a 2a 2f 0a 73  next token..*/.s
24e0: 74 61 74 69 63 20 63 68 61 72 20 2a 47 65 74 46  tatic char *GetF
24f0: 69 72 73 74 45 6c 65 6d 65 6e 74 28 63 68 61 72  irstElement(char
2500: 20 2a 7a 49 6e 70 75 74 2c 20 63 68 61 72 20 2a   *zInput, char *
2510: 2a 7a 4c 65 66 74 4f 76 65 72 29 7b 0a 20 20 63  *zLeftOver){.  c
2520: 68 61 72 20 2a 7a 52 65 73 75 6c 74 20 3d 20 30  har *zResult = 0
2530: 3b 0a 20 20 69 66 28 20 7a 49 6e 70 75 74 3d 3d  ;.  if( zInput==
2540: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 4c 65  0 ){.    if( zLe
2550: 66 74 4f 76 65 72 20 29 20 2a 7a 4c 65 66 74 4f  ftOver ) *zLeftO
2560: 76 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  ver = 0;.    ret
2570: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69  urn 0;.  }.  whi
2580: 6c 65 28 20 69 73 73 70 61 63 65 28 2a 7a 49 6e  le( isspace(*zIn
2590: 70 75 74 29 20 29 7b 20 7a 49 6e 70 75 74 2b 2b  put) ){ zInput++
25a0: 3b 20 7d 0a 20 20 7a 52 65 73 75 6c 74 20 3d 20  ; }.  zResult = 
25b0: 7a 49 6e 70 75 74 3b 0a 20 20 77 68 69 6c 65 28  zInput;.  while(
25c0: 20 2a 7a 49 6e 70 75 74 20 26 26 20 21 69 73 73   *zInput && !iss
25d0: 70 61 63 65 28 2a 7a 49 6e 70 75 74 29 20 29 7b  pace(*zInput) ){
25e0: 20 7a 49 6e 70 75 74 2b 2b 3b 20 7d 0a 20 20 69   zInput++; }.  i
25f0: 66 28 20 2a 7a 49 6e 70 75 74 20 29 7b 0a 20 20  f( *zInput ){.  
2600: 20 20 2a 7a 49 6e 70 75 74 20 3d 20 30 3b 0a 20    *zInput = 0;. 
2610: 20 20 20 7a 49 6e 70 75 74 2b 2b 3b 0a 20 20 20     zInput++;.   
2620: 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28   while( isspace(
2630: 2a 7a 49 6e 70 75 74 29 20 29 7b 20 7a 49 6e 70  *zInput) ){ zInp
2640: 75 74 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 69 66  ut++; }.  }.  if
2650: 28 20 7a 4c 65 66 74 4f 76 65 72 20 29 7b 20 2a  ( zLeftOver ){ *
2660: 7a 4c 65 66 74 4f 76 65 72 20 3d 20 7a 49 6e 70  zLeftOver = zInp
2670: 75 74 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ut; }.  return z
2680: 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Result;.}../*.**
2690: 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   Make a copy of 
26a0: 61 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 6d 65  a string into me
26b0: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
26c0: 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74  om malloc..*/.st
26d0: 61 74 69 63 20 63 68 61 72 20 2a 53 74 72 44 75  atic char *StrDu
26e0: 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  p(const char *zS
26f0: 72 63 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 65  rc){.  char *zDe
2700: 73 74 3b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 0a  st;.  int size;.
2710: 0a 20 20 69 66 28 20 7a 53 72 63 3d 3d 30 20 29  .  if( zSrc==0 )
2720: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 69 7a   return 0;.  siz
2730: 65 20 3d 20 73 74 72 6c 65 6e 28 7a 53 72 63 29  e = strlen(zSrc)
2740: 20 2b 20 31 3b 0a 20 20 7a 44 65 73 74 20 3d 20   + 1;.  zDest = 
2750: 28 63 68 61 72 2a 29 53 61 66 65 4d 61 6c 6c 6f  (char*)SafeMallo
2760: 63 28 20 73 69 7a 65 20 29 3b 0a 20 20 73 74 72  c( size );.  str
2770: 63 70 79 28 7a 44 65 73 74 2c 7a 53 72 63 29 3b  cpy(zDest,zSrc);
2780: 0a 20 20 72 65 74 75 72 6e 20 7a 44 65 73 74 3b  .  return zDest;
2790: 0a 7d 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  .}.static char *
27a0: 53 74 72 41 70 70 65 6e 64 28 63 68 61 72 20 2a  StrAppend(char *
27b0: 7a 50 72 69 6f 72 2c 20 63 6f 6e 73 74 20 63 68  zPrior, const ch
27c0: 61 72 20 2a 7a 53 65 70 2c 20 63 6f 6e 73 74 20  ar *zSep, const 
27d0: 63 68 61 72 20 2a 7a 53 72 63 29 7b 0a 20 20 63  char *zSrc){.  c
27e0: 68 61 72 20 2a 7a 44 65 73 74 3b 0a 20 20 69 6e  har *zDest;.  in
27f0: 74 20 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 31  t size;.  int n1
2800: 2c 20 6e 32 3b 0a 0a 20 20 69 66 28 20 7a 53 72  , n2;..  if( zSr
2810: 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  c==0 ) return 0;
2820: 0a 20 20 69 66 28 20 7a 50 72 69 6f 72 3d 3d 30  .  if( zPrior==0
2830: 20 29 20 72 65 74 75 72 6e 20 53 74 72 44 75 70   ) return StrDup
2840: 28 7a 53 72 63 29 3b 0a 20 20 73 69 7a 65 20 3d  (zSrc);.  size =
2850: 20 28 6e 31 3d 73 74 72 6c 65 6e 28 7a 53 72 63   (n1=strlen(zSrc
2860: 29 29 20 2b 20 28 6e 32 3d 73 74 72 6c 65 6e 28  )) + (n2=strlen(
2870: 7a 53 65 70 29 29 20 2b 20 73 74 72 6c 65 6e 28  zSep)) + strlen(
2880: 7a 50 72 69 6f 72 29 20 2b 20 31 3b 0a 20 20 7a  zPrior) + 1;.  z
2890: 44 65 73 74 20 3d 20 28 63 68 61 72 2a 29 53 61  Dest = (char*)Sa
28a0: 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 20 29  feMalloc( size )
28b0: 3b 0a 20 20 73 74 72 63 70 79 28 7a 44 65 73 74  ;.  strcpy(zDest
28c0: 2c 7a 50 72 69 6f 72 29 3b 0a 20 20 66 72 65 65  ,zPrior);.  free
28d0: 28 7a 50 72 69 6f 72 29 3b 0a 20 20 73 74 72 63  (zPrior);.  strc
28e0: 70 79 28 26 7a 44 65 73 74 5b 6e 31 5d 2c 7a 53  py(&zDest[n1],zS
28f0: 65 70 29 3b 0a 20 20 73 74 72 63 70 79 28 26 7a  ep);.  strcpy(&z
2900: 44 65 73 74 5b 6e 31 2b 6e 32 5d 2c 7a 53 72 63  Dest[n1+n2],zSrc
2910: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 44 65 73  );.  return zDes
2920: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 72 65 61  t;.}../*.** Brea
2930: 6b 20 61 20 6c 69 6e 65 20 61 74 20 74 68 65 20  k a line at the 
2940: 66 69 72 73 74 20 5c 6e 20 6f 72 20 5c 72 20 63  first \n or \r c
2950: 68 61 72 61 63 74 65 72 20 73 65 65 6e 2e 0a 2a  haracter seen..*
2960: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 52 65  /.static void Re
2970: 6d 6f 76 65 4e 65 77 6c 69 6e 65 28 63 68 61 72  moveNewline(char
2980: 20 2a 7a 29 7b 0a 20 20 69 66 28 20 7a 3d 3d 30   *z){.  if( z==0
2990: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69   ) return;.  whi
29a0: 6c 65 28 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c  le( *z && *z!='\
29b0: 6e 27 20 26 26 20 2a 7a 21 3d 27 5c 72 27 20 29  n' && *z!='\r' )
29c0: 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 2a 7a 20 3d 20  { z++; }.  *z = 
29d0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  0;.}../*.** Prin
29e0: 74 20 61 20 64 61 74 65 20 74 61 67 20 69 6e 20  t a date tag in 
29f0: 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65  the header.  The
2a00: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 67   name of the tag
2a10: 20 69 73 20 7a 54 61 67 2e 0a 2a 2a 20 54 68 65   is zTag..** The
2a20: 20 64 61 74 65 20 69 73 20 64 65 74 65 72 6d 69   date is determi
2a30: 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 69  ned from the uni
2a40: 78 20 74 69 6d 65 73 74 61 6d 70 20 67 69 76 65  x timestamp give
2a50: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
2a60: 20 44 61 74 65 54 61 67 28 63 6f 6e 73 74 20 63   DateTag(const c
2a70: 68 61 72 20 2a 7a 54 61 67 2c 20 74 69 6d 65 5f  har *zTag, time_
2a80: 74 20 74 29 7b 0a 20 20 73 74 72 75 63 74 20 74  t t){.  struct t
2a90: 6d 20 2a 74 6d 3b 0a 20 20 63 68 61 72 20 7a 44  m *tm;.  char zD
2aa0: 61 74 65 5b 31 30 30 5d 3b 0a 20 20 74 6d 20 3d  ate[100];.  tm =
2ab0: 20 67 6d 74 69 6d 65 28 26 74 29 3b 0a 20 20 73   gmtime(&t);.  s
2ac0: 74 72 66 74 69 6d 65 28 7a 44 61 74 65 2c 20 73  trftime(zDate, s
2ad0: 69 7a 65 6f 66 28 7a 44 61 74 65 29 2c 20 22 25  izeof(zDate), "%
2ae0: 61 2c 20 25 64 20 20 25 62 20 25 59 20 25 48 3a  a, %d  %b %Y %H:
2af0: 25 4d 3a 25 53 20 25 7a 22 2c 20 74 6d 29 3b 0a  %M:%S %z", tm);.
2b00: 20 20 72 65 74 75 72 6e 20 70 72 69 6e 74 66 28    return printf(
2b10: 22 25 73 3a 20 25 73 5c 72 5c 6e 22 2c 20 7a 54  "%s: %s\r\n", zT
2b20: 61 67 2c 20 7a 44 61 74 65 29 3b 0a 7d 0a 0a 2f  ag, zDate);.}../
2b30: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 66  *.** Print the f
2b40: 69 72 73 74 20 6c 69 6e 65 20 6f 66 20 61 20 72  irst line of a r
2b50: 65 73 70 6f 6e 73 65 20 66 6f 6c 6c 6f 77 65 64  esponse followed
2b60: 20 62 79 20 74 68 65 20 73 65 72 76 65 72 20 74   by the server t
2b70: 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ype..*/.static v
2b80: 6f 69 64 20 53 74 61 72 74 52 65 73 70 6f 6e 73  oid StartRespons
2b90: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52  e(const char *zR
2ba0: 65 73 75 6c 74 43 6f 64 65 29 7b 0a 20 20 74 69  esultCode){.  ti
2bb0: 6d 65 5f 74 20 6e 6f 77 3b 0a 20 20 74 69 6d 65  me_t now;.  time
2bc0: 28 26 6e 6f 77 29 3b 0a 20 20 69 66 28 20 73 74  (&now);.  if( st
2bd0: 61 74 75 73 53 65 6e 74 20 29 20 72 65 74 75 72  atusSent ) retur
2be0: 6e 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69  n;.  nOut += pri
2bf0: 6e 74 66 28 22 25 73 20 25 73 5c 72 5c 6e 22 2c  ntf("%s %s\r\n",
2c00: 20 7a 50 72 6f 74 6f 63 6f 6c 2c 20 7a 52 65 73   zProtocol, zRes
2c10: 75 6c 74 43 6f 64 65 29 3b 0a 20 20 73 74 72 6e  ultCode);.  strn
2c20: 63 70 79 28 7a 52 65 70 6c 79 53 74 61 74 75 73  cpy(zReplyStatus
2c30: 2c 20 7a 52 65 73 75 6c 74 43 6f 64 65 2c 20 33  , zResultCode, 3
2c40: 29 3b 0a 20 20 7a 52 65 70 6c 79 53 74 61 74 75  );.  zReplyStatu
2c50: 73 5b 33 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20  s[3] = 0;.  if( 
2c60: 7a 52 65 70 6c 79 53 74 61 74 75 73 5b 30 5d 3e  zReplyStatus[0]>
2c70: 3d 27 34 27 20 29 7b 0a 20 20 20 20 63 6c 6f 73  ='4' ){.    clos
2c80: 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 31 3b  eConnection = 1;
2c90: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6c 6f 73 65  .  }.  if( close
2ca0: 43 6f 6e 6e 65 63 74 69 6f 6e 20 29 7b 0a 20 20  Connection ){.  
2cb0: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
2cc0: 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c  ("Connection: cl
2cd0: 6f 73 65 5c 72 5c 6e 22 29 3b 0a 20 20 7d 65 6c  ose\r\n");.  }el
2ce0: 73 65 7b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20  se{.    nOut += 
2cf0: 70 72 69 6e 74 66 28 22 43 6f 6e 6e 65 63 74 69  printf("Connecti
2d00: 6f 6e 3a 20 6b 65 65 70 2d 61 6c 69 76 65 5c 72  on: keep-alive\r
2d10: 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 6e 4f 75 74  \n");.  }.  nOut
2d20: 20 2b 3d 20 44 61 74 65 54 61 67 28 22 44 61 74   += DateTag("Dat
2d30: 65 22 2c 20 6e 6f 77 29 3b 0a 20 20 73 74 61 74  e", now);.  stat
2d40: 75 73 53 65 6e 74 20 3d 20 31 3b 0a 7d 0a 0a 2f  usSent = 1;.}../
2d50: 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c  *.** Tell the cl
2d60: 69 65 6e 74 20 74 68 61 74 20 74 68 65 72 65 20  ient that there 
2d70: 69 73 20 6e 6f 20 73 75 63 68 20 64 6f 63 75 6d  is no such docum
2d80: 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ent.*/.static vo
2d90: 69 64 20 4e 6f 74 46 6f 75 6e 64 28 69 6e 74 20  id NotFound(int 
2da0: 6c 69 6e 65 6e 6f 29 7b 0a 20 20 53 74 61 72 74  lineno){.  Start
2db0: 52 65 73 70 6f 6e 73 65 28 22 34 30 34 20 4e 6f  Response("404 No
2dc0: 74 20 46 6f 75 6e 64 22 29 3b 0a 20 20 6e 4f 75  t Found");.  nOu
2dd0: 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20  t += printf(.   
2de0: 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20   "Content-type: 
2df0: 74 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e 22 0a 20  text/html\r\n". 
2e00: 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 22 3c     "\r\n".    "<
2e10: 68 65 61 64 3e 3c 74 69 74 6c 65 20 6c 69 6e 65  head><title line
2e20: 6e 6f 3d 5c 22 25 64 5c 22 3e 4e 6f 74 20 46 6f  no=\"%d\">Not Fo
2e30: 75 6e 64 3c 2f 74 69 74 6c 65 3e 3c 2f 68 65 61  und</title></hea
2e40: 64 3e 5c 6e 22 0a 20 20 20 20 22 3c 62 6f 64 79  d>\n".    "<body
2e50: 3e 3c 68 31 3e 44 6f 63 75 6d 65 6e 74 20 4e 6f  ><h1>Document No
2e60: 74 20 46 6f 75 6e 64 3c 2f 68 31 3e 5c 6e 22 0a  t Found</h1>\n".
2e70: 20 20 20 20 22 54 68 65 20 64 6f 63 75 6d 65 6e      "The documen
2e80: 74 20 25 73 20 69 73 20 6e 6f 74 20 61 76 61 69  t %s is not avai
2e90: 6c 61 62 6c 65 20 6f 6e 20 74 68 69 73 20 73 65  lable on this se
2ea0: 72 76 65 72 5c 6e 22 0a 20 20 20 20 22 3c 2f 62  rver\n".    "</b
2eb0: 6f 64 79 3e 5c 6e 22 2c 20 6c 69 6e 65 6e 6f 2c  ody>\n", lineno,
2ec0: 20 7a 53 63 72 69 70 74 29 3b 0a 20 20 4d 61 6b   zScript);.  Mak
2ed0: 65 4c 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20 20  eLogEntry(0);.  
2ee0: 65 78 69 74 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  exit(0);.}../*.*
2ef0: 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c 69 65 6e  * Tell the clien
2f00: 74 20 74 68 61 74 20 61 75 74 68 6f 72 69 7a 61  t that authoriza
2f10: 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64  tion is required
2f20: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a   to access the.*
2f30: 2a 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  * document..*/.s
2f40: 74 61 74 69 63 20 76 6f 69 64 20 4e 6f 74 41 75  tatic void NotAu
2f50: 74 68 6f 72 69 7a 65 64 28 63 6f 6e 73 74 20 63  thorized(const c
2f60: 68 61 72 20 2a 7a 52 65 61 6c 6d 29 7b 0a 20 20  har *zRealm){.  
2f70: 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 34  StartResponse("4
2f80: 30 31 20 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e  01 Authorization
2f90: 20 52 65 71 75 69 72 65 64 22 29 3b 0a 20 20 6e   Required");.  n
2fa0: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20  Out += printf(. 
2fb0: 20 20 20 22 57 57 57 2d 41 75 74 68 65 6e 74 69     "WWW-Authenti
2fc0: 63 61 74 65 3a 20 42 61 73 69 63 20 72 65 61 6c  cate: Basic real
2fd0: 6d 3d 5c 22 25 73 5c 22 5c 72 5c 6e 22 0a 20 20  m=\"%s\"\r\n".  
2fe0: 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a    "Content-type:
2ff0: 20 74 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e 22 0a   text/html\r\n".
3000: 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 22      "\r\n".    "
3010: 3c 68 65 61 64 3e 3c 74 69 74 6c 65 3e 4e 6f 74  <head><title>Not
3020: 20 41 75 74 68 6f 72 69 7a 65 64 3c 2f 74 69 74   Authorized</tit
3030: 6c 65 3e 3c 2f 68 65 61 64 3e 5c 6e 22 0a 20 20  le></head>\n".  
3040: 20 20 22 3c 62 6f 64 79 3e 3c 68 31 3e 34 30 31    "<body><h1>401
3050: 20 4e 6f 74 20 41 75 74 68 6f 72 69 7a 65 64 3c   Not Authorized<
3060: 2f 68 31 3e 5c 6e 22 0a 20 20 20 20 22 41 20 6c  /h1>\n".    "A l
3070: 6f 67 69 6e 20 61 6e 64 20 70 61 73 73 77 6f 72  ogin and passwor
3080: 64 20 61 72 65 20 72 65 71 75 69 72 65 64 20 66  d are required f
3090: 6f 72 20 74 68 69 73 20 64 6f 63 75 6d 65 6e 74  or this document
30a0: 5c 6e 22 0a 20 20 20 20 22 3c 2f 62 6f 64 79 3e  \n".    "</body>
30b0: 5c 6e 22 2c 20 7a 52 65 61 6c 6d 29 3b 0a 20 20  \n", zRealm);.  
30c0: 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 29 3b  MakeLogEntry(0);
30d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74  .}../*.** Tell t
30e0: 68 65 20 63 6c 69 65 6e 74 20 74 68 61 74 20 74  he client that t
30f0: 68 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72  here is an error
3100: 20 69 6e 20 74 68 65 20 73 63 72 69 70 74 2e 0a   in the script..
3110: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43  */.static void C
3120: 67 69 45 72 72 6f 72 28 76 6f 69 64 29 7b 0a 20  giError(void){. 
3130: 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22   StartResponse("
3140: 35 30 30 20 45 72 72 6f 72 22 29 3b 0a 20 20 6e  500 Error");.  n
3150: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20  Out += printf(. 
3160: 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65     "Content-type
3170: 3a 20 74 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e 22  : text/html\r\n"
3180: 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20  .    "\r\n".    
3190: 22 3c 68 65 61 64 3e 3c 74 69 74 6c 65 3e 43 47  "<head><title>CG
31a0: 49 20 50 72 6f 67 72 61 6d 20 45 72 72 6f 72 3c  I Program Error<
31b0: 2f 74 69 74 6c 65 3e 3c 2f 68 65 61 64 3e 5c 6e  /title></head>\n
31c0: 22 0a 20 20 20 20 22 3c 62 6f 64 79 3e 3c 68 31  ".    "<body><h1
31d0: 3e 43 47 49 20 50 72 6f 67 72 61 6d 20 45 72 72  >CGI Program Err
31e0: 6f 72 3c 2f 68 31 3e 5c 6e 22 0a 20 20 20 20 22  or</h1>\n".    "
31f0: 54 68 65 20 43 47 49 20 70 72 6f 67 72 61 6d 20  The CGI program 
3200: 25 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e 20  %s generated an 
3210: 65 72 72 6f 72 5c 6e 22 0a 20 20 20 20 22 3c 2f  error\n".    "</
3220: 62 6f 64 79 3e 5c 6e 22 2c 20 7a 53 63 72 69 70  body>\n", zScrip
3230: 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74  t);.  MakeLogEnt
3240: 72 79 28 30 29 3b 0a 20 20 65 78 69 74 28 30 29  ry(0);.  exit(0)
3250: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
3260: 69 73 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20  is called if we 
3270: 74 69 6d 65 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74  timeout..*/.stat
3280: 69 63 20 76 6f 69 64 20 54 69 6d 65 6f 75 74 28  ic void Timeout(
3290: 69 6e 74 20 4e 6f 74 55 73 65 64 29 7b 0a 20 20  int NotUsed){.  
32a0: 69 66 28 20 21 64 65 62 75 67 46 6c 61 67 20 29  if( !debugFlag )
32b0: 7b 0a 20 20 20 20 73 74 72 63 70 79 28 7a 52 65  {.    strcpy(zRe
32c0: 70 6c 79 53 74 61 74 75 73 2c 20 22 39 39 39 22  plyStatus, "999"
32d0: 29 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e  );.    MakeLogEn
32e0: 74 72 79 28 30 29 3b 0a 20 20 20 20 65 78 69 74  try(0);.    exit
32f0: 28 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (0);.  }.}../*.*
3300: 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c 69 65 6e  * Tell the clien
3310: 74 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  t that there is 
3320: 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  an error in the 
3330: 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69  script..*/.stati
3340: 63 20 76 6f 69 64 20 43 67 69 53 63 72 69 70 74  c void CgiScript
3350: 57 72 69 74 61 62 6c 65 28 76 6f 69 64 29 7b 0a  Writable(void){.
3360: 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28    StartResponse(
3370: 22 35 30 30 20 43 47 49 20 43 6f 6e 66 69 67 75  "500 CGI Configu
3380: 72 61 74 69 6f 6e 20 45 72 72 6f 72 22 29 3b 0a  ration Error");.
3390: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
33a0: 28 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74  (.    "Content-t
33b0: 79 70 65 3a 20 74 65 78 74 2f 68 74 6d 6c 5c 72  ype: text/html\r
33c0: 5c 6e 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20  \n".    "\r\n". 
33d0: 20 20 20 22 3c 68 65 61 64 3e 3c 74 69 74 6c 65     "<head><title
33e0: 3e 43 47 49 20 43 6f 6e 66 69 67 75 72 61 74 69  >CGI Configurati
33f0: 6f 6e 20 45 72 72 6f 72 3c 2f 74 69 74 6c 65 3e  on Error</title>
3400: 3c 2f 68 65 61 64 3e 5c 6e 22 0a 20 20 20 20 22  </head>\n".    "
3410: 3c 62 6f 64 79 3e 3c 68 31 3e 43 47 49 20 43 6f  <body><h1>CGI Co
3420: 6e 66 69 67 75 72 61 74 69 6f 6e 20 45 72 72 6f  nfiguration Erro
3430: 72 3c 2f 68 31 3e 5c 6e 22 0a 20 20 20 20 22 54  r</h1>\n".    "T
3440: 68 65 20 43 47 49 20 70 72 6f 67 72 61 6d 20 25  he CGI program %
3450: 73 20 69 73 20 77 72 69 74 61 62 6c 65 20 62 79  s is writable by
3460: 20 75 73 65 72 73 20 6f 74 68 65 72 20 74 68 61   users other tha
3470: 6e 20 69 74 73 20 6f 77 6e 65 72 2e 5c 6e 22 0a  n its owner.\n".
3480: 20 20 20 20 22 3c 2f 62 6f 64 79 3e 5c 6e 22 2c      "</body>\n",
3490: 20 7a 52 65 61 6c 53 63 72 69 70 74 29 3b 0a 20   zRealScript);. 
34a0: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 29   MakeLogEntry(0)
34b0: 3b 0a 20 20 65 78 69 74 28 30 29 3b 20 20 20 20  ;.  exit(0);    
34c0: 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c     .}../*.** Tel
34d0: 6c 20 74 68 65 20 63 6c 69 65 6e 74 20 74 68 61  l the client tha
34e0: 74 20 74 68 65 20 73 65 72 76 65 72 20 6d 61 6c  t the server mal
34f0: 66 75 6e 63 74 69 6f 6e 65 64 2e 0a 2a 2f 0a 73  functioned..*/.s
3500: 74 61 74 69 63 20 76 6f 69 64 20 4d 61 6c 66 75  tatic void Malfu
3510: 6e 63 74 69 6f 6e 28 69 6e 74 20 6c 69 6e 65 6e  nction(int linen
3520: 75 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  um, const char *
3530: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
3540: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76   va_list ap;.  v
3550: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
3560: 6d 61 74 29 3b 0a 20 20 53 74 61 72 74 52 65 73  mat);.  StartRes
3570: 70 6f 6e 73 65 28 22 35 30 30 20 53 65 72 76 65  ponse("500 Serve
3580: 72 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 22 29 3b  r Malfunction");
3590: 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74  .  nOut += print
35a0: 66 28 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d  f(.    "Content-
35b0: 74 79 70 65 3a 20 74 65 78 74 2f 68 74 6d 6c 5c  type: text/html\
35c0: 72 5c 6e 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a  r\n".    "\r\n".
35d0: 20 20 20 20 22 3c 68 65 61 64 3e 3c 74 69 74 6c      "<head><titl
35e0: 65 3e 53 65 72 76 65 72 20 4d 61 6c 66 75 6e 63  e>Server Malfunc
35f0: 74 69 6f 6e 3c 2f 74 69 74 6c 65 3e 3c 2f 68 65  tion</title></he
3600: 61 64 3e 5c 6e 22 0a 20 20 20 20 22 3c 62 6f 64  ad>\n".    "<bod
3610: 79 3e 3c 68 31 3e 53 65 72 76 65 72 20 4d 61 6c  y><h1>Server Mal
3620: 66 75 6e 63 74 69 6f 6e 3c 2f 68 31 3e 5c 6e 22  function</h1>\n"
3630: 0a 20 20 20 20 22 3c 70 3e 54 68 69 73 20 77 65  .    "<p>This we
3640: 62 20 73 65 72 76 65 72 20 68 61 73 20 6d 61 6c  b server has mal
3650: 66 75 6e 63 74 69 6f 6e 65 64 2e 5c 6e 5c 6e 22  functioned.\n\n"
3660: 0a 20 20 20 20 22 28 45 72 72 6f 72 20 6e 75 6d  .    "(Error num
3670: 62 65 72 3a 20 25 64 29 3c 2f 70 3e 5c 6e 22 2c  ber: %d)</p>\n",
3680: 20 6c 69 6e 65 6e 75 6d 29 3b 0a 20 20 69 66 28   linenum);.  if(
3690: 20 7a 46 6f 72 6d 61 74 20 29 7b 0a 20 20 20 20   zFormat ){.    
36a0: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22  nOut += printf("
36b0: 3c 70 3e 22 29 3b 0a 20 20 20 20 6e 4f 75 74 20  <p>");.    nOut 
36c0: 2b 3d 20 76 70 72 69 6e 74 66 28 7a 46 6f 72 6d  += vprintf(zForm
36d0: 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 6e 4f 75  at, ap);.    nOu
36e0: 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 3c 2f 70  t += printf("</p
36f0: 3e 5c 6e 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 6e  >\n\n");.  }.  n
3700: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 3c  Out += printf("<
3710: 2f 62 6f 64 79 3e 5c 6e 22 29 3b 0a 20 20 4d 61  /body>\n");.  Ma
3720: 6b 65 4c 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20  keLogEntry(0);. 
3730: 20 65 78 69 74 28 30 29 3b 20 20 20 20 20 20 20   exit(0);       
3740: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 73  .}../*.** Do a s
3750: 65 72 76 65 72 20 72 65 64 69 72 65 63 74 20 74  erver redirect t
3760: 6f 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 73  o the document s
3770: 70 65 63 69 66 69 65 64 2e 20 20 54 68 65 20 64  pecified.  The d
3780: 6f 63 75 6d 65 6e 74 0a 2a 2a 20 6e 61 6d 65 20  ocument.** name 
3790: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 73 63 68 65  not contain sche
37a0: 6d 65 20 6f 72 20 6e 65 74 77 6f 72 6b 20 6c 6f  me or network lo
37b0: 63 61 74 69 6f 6e 20 6f 72 20 74 68 65 20 71 75  cation or the qu
37c0: 65 72 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 20 49  ery string..** I
37d0: 74 20 77 69 6c 6c 20 62 65 20 6a 75 73 74 20 74  t will be just t
37e0: 68 65 20 70 61 74 68 2e 0a 2a 2f 0a 73 74 61 74  he path..*/.stat
37f0: 69 63 20 76 6f 69 64 20 52 65 64 69 72 65 63 74  ic void Redirect
3800: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61  (const char *zPa
3810: 74 68 2c 20 69 6e 74 20 66 69 6e 69 73 68 29 7b  th, int finish){
3820: 0a 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65  .  StartResponse
3830: 28 22 33 30 32 20 54 65 6d 70 6f 72 61 72 79 20  ("302 Temporary 
3840: 52 65 64 69 72 65 63 74 22 29 3b 0a 20 20 69 66  Redirect");.  if
3850: 28 20 7a 53 65 72 76 65 72 50 6f 72 74 3d 3d 30  ( zServerPort==0
3860: 20 7c 7c 20 7a 53 65 72 76 65 72 50 6f 72 74 5b   || zServerPort[
3870: 30 5d 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28  0]==0 || strcmp(
3880: 7a 53 65 72 76 65 72 50 6f 72 74 2c 22 38 30 22  zServerPort,"80"
3890: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4f 75 74  )==0 ){.    nOut
38a0: 20 2b 3d 20 70 72 69 6e 74 66 28 22 4c 6f 63 61   += printf("Loca
38b0: 74 69 6f 6e 3a 20 25 73 3a 2f 2f 25 73 25 73 25  tion: %s://%s%s%
38c0: 73 5c 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  s\r\n",.        
38d0: 20 20 20 20 20 20 20 20 20 20 20 7a 48 74 74 70             zHttp
38e0: 2c 20 7a 53 65 72 76 65 72 4e 61 6d 65 2c 20 7a  , zServerName, z
38f0: 50 61 74 68 2c 20 7a 51 75 65 72 79 53 75 66 66  Path, zQuerySuff
3900: 69 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ix);.  }else{.  
3910: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
3920: 28 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73 3a 2f  ("Location: %s:/
3930: 2f 25 73 3a 25 73 25 73 25 73 5c 72 5c 6e 22 2c  /%s:%s%s%s\r\n",
3940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3950: 20 20 20 20 7a 48 74 74 70 2c 20 7a 53 65 72 76      zHttp, zServ
3960: 65 72 4e 61 6d 65 2c 20 7a 53 65 72 76 65 72 50  erName, zServerP
3970: 6f 72 74 2c 20 7a 50 61 74 68 2c 20 7a 51 75 65  ort, zPath, zQue
3980: 72 79 53 75 66 66 69 78 29 3b 0a 20 20 7d 0a 20  rySuffix);.  }. 
3990: 20 69 66 28 20 66 69 6e 69 73 68 20 29 7b 0a 20   if( finish ){. 
39a0: 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74     nOut += print
39b0: 66 28 22 5c 72 5c 6e 22 29 3b 0a 20 20 20 20 4d  f("\r\n");.    M
39c0: 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 29 3b 0a  akeLogEntry(0);.
39d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
39e0: 73 20 66 75 6e 63 74 69 6f 6e 20 74 72 65 61 74  s function treat
39f0: 73 20 69 74 73 20 69 6e 70 75 74 20 61 73 20 61  s its input as a
3a00: 20 62 61 73 65 2d 36 34 20 73 74 72 69 6e 67 20   base-64 string 
3a10: 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 0a  and returns the.
3a20: 2a 2a 20 64 65 63 6f 64 65 64 20 76 61 6c 75 65  ** decoded value
3a30: 20 6f 66 20 74 68 61 74 20 73 74 72 69 6e 67 2e   of that string.
3a40: 20 20 43 68 61 72 61 63 74 65 72 73 20 6f 66 20    Characters of 
3a50: 69 6e 70 75 74 20 74 68 61 74 20 61 72 65 20 6e  input that are n
3a60: 6f 74 0a 2a 2a 20 76 61 6c 69 64 20 62 61 73 65  ot.** valid base
3a70: 2d 36 34 20 63 68 61 72 61 63 74 65 72 73 20 28  -64 characters (
3a80: 73 75 63 68 20 61 73 20 73 70 61 63 65 73 20 61  such as spaces a
3a90: 6e 64 20 6e 65 77 6c 69 6e 65 73 29 20 61 72 65  nd newlines) are
3aa0: 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 76 6f 69   ignored..*/.voi
3ab0: 64 20 44 65 63 6f 64 65 36 34 28 63 68 61 72 20  d Decode64(char 
3ac0: 2a 7a 36 34 29 7b 0a 20 20 63 68 61 72 20 2a 7a  *z64){.  char *z
3ad0: 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 36 34 3b  Data;.  int n64;
3ae0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
3af0: 6e 74 20 61 2c 20 62 2c 20 63 2c 20 64 3b 0a 20  nt a, b, c, d;. 
3b00: 20 73 74 61 74 69 63 20 69 6e 74 20 69 73 49 6e   static int isIn
3b10: 69 74 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  it = 0;.  static
3b20: 20 69 6e 74 20 74 72 61 6e 73 5b 31 32 38 5d 3b   int trans[128];
3b30: 0a 20 20 73 74 61 74 69 63 20 75 6e 73 69 67 6e  .  static unsign
3b40: 65 64 20 63 68 61 72 20 7a 42 61 73 65 5b 5d 20  ed char zBase[] 
3b50: 3d 20 0a 20 20 20 20 22 41 42 43 44 45 46 47 48  = .    "ABCDEFGH
3b60: 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58  IJKLMNOPQRSTUVWX
3b70: 59 5a 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e  YZabcdefghijklmn
3b80: 6f 70 71 72 73 74 75 76 77 78 79 7a 30 31 32 33  opqrstuvwxyz0123
3b90: 34 35 36 37 38 39 2b 2f 22 3b 0a 0a 20 20 69 66  456789+/";..  if
3ba0: 28 20 21 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  ( !isInit ){.   
3bb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b   for(i=0; i<128;
3bc0: 20 69 2b 2b 29 7b 20 74 72 61 6e 73 5b 69 5d 20   i++){ trans[i] 
3bd0: 3d 20 30 3b 20 7d 0a 20 20 20 20 66 6f 72 28 69  = 0; }.    for(i
3be0: 3d 30 3b 20 7a 42 61 73 65 5b 69 5d 3b 20 69 2b  =0; zBase[i]; i+
3bf0: 2b 29 7b 20 74 72 61 6e 73 5b 7a 42 61 73 65 5b  +){ trans[zBase[
3c00: 69 5d 20 26 20 30 78 37 66 5d 20 3d 20 69 3b 20  i] & 0x7f] = i; 
3c10: 7d 0a 20 20 20 20 69 73 49 6e 69 74 20 3d 20 31  }.    isInit = 1
3c20: 3b 0a 20 20 7d 0a 20 20 6e 36 34 20 3d 20 73 74  ;.  }.  n64 = st
3c30: 72 6c 65 6e 28 7a 36 34 29 3b 0a 20 20 77 68 69  rlen(z64);.  whi
3c40: 6c 65 28 20 6e 36 34 3e 30 20 26 26 20 7a 36 34  le( n64>0 && z64
3c50: 5b 6e 36 34 2d 31 5d 3d 3d 27 3d 27 20 29 20 6e  [n64-1]=='=' ) n
3c60: 36 34 2d 2d 3b 0a 20 20 7a 44 61 74 61 20 3d 20  64--;.  zData = 
3c70: 7a 36 34 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  z64;.  for(i=j=0
3c80: 3b 20 69 2b 33 3c 6e 36 34 3b 20 69 2b 3d 34 29  ; i+3<n64; i+=4)
3c90: 7b 0a 20 20 20 20 61 20 3d 20 74 72 61 6e 73 5b  {.    a = trans[
3ca0: 7a 36 34 5b 69 5d 20 26 20 30 78 37 66 5d 3b 0a  z64[i] & 0x7f];.
3cb0: 20 20 20 20 62 20 3d 20 74 72 61 6e 73 5b 7a 36      b = trans[z6
3cc0: 34 5b 69 2b 31 5d 20 26 20 30 78 37 66 5d 3b 0a  4[i+1] & 0x7f];.
3cd0: 20 20 20 20 63 20 3d 20 74 72 61 6e 73 5b 7a 36      c = trans[z6
3ce0: 34 5b 69 2b 32 5d 20 26 20 30 78 37 66 5d 3b 0a  4[i+2] & 0x7f];.
3cf0: 20 20 20 20 64 20 3d 20 74 72 61 6e 73 5b 7a 36      d = trans[z6
3d00: 34 5b 69 2b 33 5d 20 26 20 30 78 37 66 5d 3b 0a  4[i+3] & 0x7f];.
3d10: 20 20 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d      zData[j++] =
3d20: 20 28 28 61 3c 3c 32 29 20 26 20 30 78 66 63 29   ((a<<2) & 0xfc)
3d30: 20 7c 20 28 28 62 3e 3e 34 29 20 26 20 30 78 30   | ((b>>4) & 0x0
3d40: 33 29 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b  3);.    zData[j+
3d50: 2b 5d 20 3d 20 28 28 62 3c 3c 34 29 20 26 20 30  +] = ((b<<4) & 0
3d60: 78 66 30 29 20 7c 20 28 28 63 3e 3e 32 29 20 26  xf0) | ((c>>2) &
3d70: 20 30 78 30 66 29 3b 0a 20 20 20 20 7a 44 61 74   0x0f);.    zDat
3d80: 61 5b 6a 2b 2b 5d 20 3d 20 28 28 63 3c 3c 36 29  a[j++] = ((c<<6)
3d90: 20 26 20 30 78 63 30 29 20 7c 20 28 64 20 26 20   & 0xc0) | (d & 
3da0: 30 78 33 66 29 3b 0a 20 20 7d 0a 20 20 69 66 28  0x3f);.  }.  if(
3db0: 20 69 2b 32 3c 6e 36 34 20 29 7b 0a 20 20 20 20   i+2<n64 ){.    
3dc0: 61 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 5d  a = trans[z64[i]
3dd0: 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 62 20   & 0x7f];.    b 
3de0: 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b 31 5d  = trans[z64[i+1]
3df0: 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 63 20   & 0x7f];.    c 
3e00: 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b 32 5d  = trans[z64[i+2]
3e10: 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 7a 44   & 0x7f];.    zD
3e20: 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28 61 3c 3c  ata[j++] = ((a<<
3e30: 32 29 20 26 20 30 78 66 63 29 20 7c 20 28 28 62  2) & 0xfc) | ((b
3e40: 3e 3e 34 29 20 26 20 30 78 30 33 29 3b 0a 20 20  >>4) & 0x03);.  
3e50: 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28    zData[j++] = (
3e60: 28 62 3c 3c 34 29 20 26 20 30 78 66 30 29 20 7c  (b<<4) & 0xf0) |
3e70: 20 28 28 63 3e 3e 32 29 20 26 20 30 78 30 66 29   ((c>>2) & 0x0f)
3e80: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 2b  ;.  }else if( i+
3e90: 31 3c 6e 36 34 20 29 7b 0a 20 20 20 20 61 20 3d  1<n64 ){.    a =
3ea0: 20 74 72 61 6e 73 5b 7a 36 34 5b 69 5d 20 26 20   trans[z64[i] & 
3eb0: 30 78 37 66 5d 3b 0a 20 20 20 20 62 20 3d 20 74  0x7f];.    b = t
3ec0: 72 61 6e 73 5b 7a 36 34 5b 69 2b 31 5d 20 26 20  rans[z64[i+1] & 
3ed0: 30 78 37 66 5d 3b 0a 20 20 20 20 7a 44 61 74 61  0x7f];.    zData
3ee0: 5b 6a 2b 2b 5d 20 3d 20 28 28 61 3c 3c 32 29 20  [j++] = ((a<<2) 
3ef0: 26 20 30 78 66 63 29 20 7c 20 28 28 62 3e 3e 34  & 0xfc) | ((b>>4
3f00: 29 20 26 20 30 78 30 33 29 3b 0a 20 20 7d 0a 20  ) & 0x03);.  }. 
3f10: 20 7a 44 61 74 61 5b 6a 5d 20 3d 20 30 3b 0a 7d   zData[j] = 0;.}
3f20: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
3f30: 20 73 65 65 20 69 66 20 62 61 73 69 63 20 61 75   see if basic au
3f40: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 72 65 64  thorization cred
3f50: 65 6e 74 69 61 6c 73 20 61 72 65 20 70 72 6f 76  entials are prov
3f60: 69 64 65 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20  ided for.** the 
3f70: 75 73 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74  user according t
3f80: 6f 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  o the informatio
3f90: 6e 20 69 6e 20 7a 41 75 74 68 46 69 6c 65 2e 20  n in zAuthFile. 
3fa0: 20 52 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20   Return true.** 
3fb0: 69 66 20 61 75 74 68 6f 72 69 7a 65 64 2e 20 20  if authorized.  
3fc0: 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
3fd0: 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65 64 2e 0a  not authorized..
3fe0: 2a 2a 0a 2a 2a 20 46 69 6c 65 20 66 6f 72 6d 61  **.** File forma
3ff0: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 42  t:.**.**    *  B
4000: 6c 61 6e 6b 20 6c 69 6e 65 73 20 61 6e 64 20 6c  lank lines and l
4010: 69 6e 65 73 20 74 68 61 74 20 62 65 67 69 6e 20  ines that begin 
4020: 77 69 74 68 20 27 23 27 20 61 72 65 20 69 67 6e  with '#' are ign
4030: 6f 72 65 64 0a 2a 2a 20 20 20 20 2a 20 20 22 68  ored.**    *  "h
4040: 74 74 70 2d 72 65 64 69 72 65 63 74 22 20 66 6f  ttp-redirect" fo
4050: 72 63 65 73 20 61 20 72 65 64 69 72 65 63 74 20  rces a redirect 
4060: 74 6f 20 48 54 54 50 53 20 69 66 20 6e 6f 74 20  to HTTPS if not 
4070: 74 68 65 72 65 20 61 6c 72 65 61 64 79 0a 2a 2a  there already.**
4080: 20 20 20 20 2a 20 20 22 68 74 74 70 73 2d 6f 6e      *  "https-on
4090: 6c 79 22 20 64 69 73 61 6c 6c 6f 77 73 20 6f 70  ly" disallows op
40a0: 65 72 61 74 69 6f 6e 20 69 6e 20 48 54 54 50 0a  eration in HTTP.
40b0: 2a 2a 20 20 20 20 2a 20 20 22 75 73 65 72 20 4e  **    *  "user N
40c0: 41 4d 45 20 4c 4f 47 49 4e 3a 50 41 53 53 57 4f  AME LOGIN:PASSWO
40d0: 52 44 22 20 63 68 65 63 6b 73 20 74 6f 20 73 65  RD" checks to se
40e0: 65 20 69 66 20 4c 4f 47 49 4e 3a 50 41 53 53 57  e if LOGIN:PASSW
40f0: 4f 52 44 20 0a 2a 2a 20 20 20 20 20 20 20 61 75  ORD .**       au
4100: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 72 65 64  thorization cred
4110: 65 6e 74 69 61 6c 73 20 61 72 65 20 70 72 6f 76  entials are prov
4120: 69 64 65 64 2c 20 61 6e 64 20 69 66 20 73 6f 20  ided, and if so 
4130: 73 65 74 73 20 74 68 65 0a 2a 2a 20 20 20 20 20  sets the.**     
4140: 20 20 52 45 4d 4f 54 45 5f 55 53 45 52 20 74 6f    REMOTE_USER to
4150: 20 4e 41 4d 45 2e 0a 2a 2a 20 20 20 20 2a 20 20   NAME..**    *  
4160: 22 72 65 61 6c 6d 20 54 45 58 54 22 20 73 65 74  "realm TEXT" set
4170: 73 20 74 68 65 20 72 65 61 6c 6d 20 74 6f 20 54  s the realm to T
4180: 45 58 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  EXT..*/.static i
4190: 6e 74 20 43 68 65 63 6b 42 61 73 69 63 41 75 74  nt CheckBasicAut
41a0: 68 6f 72 69 7a 61 74 69 6f 6e 28 63 6f 6e 73 74  horization(const
41b0: 20 63 68 61 72 20 2a 7a 41 75 74 68 46 69 6c 65   char *zAuthFile
41c0: 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20  ){.  FILE *in;. 
41d0: 20 63 68 61 72 20 2a 7a 52 65 61 6c 6d 20 3d 20   char *zRealm = 
41e0: 22 75 6e 6b 6e 6f 77 6e 20 72 65 61 6c 6d 22 3b  "unknown realm";
41f0: 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 67 69 6e 50  .  char *zLoginP
4200: 73 77 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  swd;.  char *zNa
4210: 6d 65 3b 0a 20 20 63 68 61 72 20 7a 4c 69 6e 65  me;.  char zLine
4220: 5b 32 30 30 30 5d 3b 0a 0a 20 20 69 6e 20 3d 20  [2000];..  in = 
4230: 66 6f 70 65 6e 28 7a 41 75 74 68 46 69 6c 65 2c  fopen(zAuthFile,
4240: 20 22 72 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d   "r");.  if( in=
4250: 3d 30 20 29 7b 0a 20 20 20 20 4e 6f 74 46 6f 75  =0 ){.    NotFou
4260: 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  nd(__LINE__);.  
4270: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
4280: 20 20 69 66 28 20 7a 41 75 74 68 41 72 67 20 29    if( zAuthArg )
4290: 20 44 65 63 6f 64 65 36 34 28 7a 41 75 74 68 41   Decode64(zAuthA
42a0: 72 67 29 3b 0a 20 20 77 68 69 6c 65 28 20 66 67  rg);.  while( fg
42b0: 65 74 73 28 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f  ets(zLine, sizeo
42c0: 66 28 7a 4c 69 6e 65 29 2c 20 69 6e 29 20 29 7b  f(zLine), in) ){
42d0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69 65 6c  .    char *zFiel
42e0: 64 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20  dName;.    char 
42f0: 2a 7a 56 61 6c 3b 0a 0a 20 20 20 20 7a 46 69 65  *zVal;..    zFie
4300: 6c 64 4e 61 6d 65 20 3d 20 47 65 74 46 69 72 73  ldName = GetFirs
4310: 74 45 6c 65 6d 65 6e 74 28 7a 4c 69 6e 65 2c 26  tElement(zLine,&
4320: 7a 56 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a  zVal);.    if( z
4330: 46 69 65 6c 64 4e 61 6d 65 3d 3d 30 20 7c 7c 20  FieldName==0 || 
4340: 2a 7a 46 69 65 6c 64 4e 61 6d 65 3d 3d 30 20 29  *zFieldName==0 )
4350: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
4360: 66 28 20 7a 46 69 65 6c 64 4e 61 6d 65 5b 30 5d  f( zFieldName[0]
4370: 3d 3d 27 23 27 20 29 20 63 6f 6e 74 69 6e 75 65  =='#' ) continue
4380: 3b 0a 20 20 20 20 52 65 6d 6f 76 65 4e 65 77 6c  ;.    RemoveNewl
4390: 69 6e 65 28 7a 56 61 6c 29 3b 0a 20 20 20 20 69  ine(zVal);.    i
43a0: 66 28 20 73 74 72 63 6d 70 28 7a 46 69 65 6c 64  f( strcmp(zField
43b0: 4e 61 6d 65 2c 20 22 72 65 61 6c 6d 22 29 3d 3d  Name, "realm")==
43c0: 30 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 61 6c  0 ){.      zReal
43d0: 6d 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29  m = StrDup(zVal)
43e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
43f0: 73 74 72 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d  strcmp(zFieldNam
4400: 65 2c 22 75 73 65 72 22 29 3d 3d 30 20 29 7b 0a  e,"user")==0 ){.
4410: 20 20 20 20 20 20 69 66 28 20 7a 41 75 74 68 41        if( zAuthA
4420: 72 67 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  rg==0 ) continue
4430: 3b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  ;.      zName = 
4440: 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28  GetFirstElement(
4450: 7a 56 61 6c 2c 20 26 7a 56 61 6c 29 3b 0a 20 20  zVal, &zVal);.  
4460: 20 20 20 20 7a 4c 6f 67 69 6e 50 73 77 64 20 3d      zLoginPswd =
4470: 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74   GetFirstElement
4480: 28 7a 56 61 6c 2c 20 26 7a 56 61 6c 29 3b 0a 20  (zVal, &zVal);. 
4490: 20 20 20 20 20 69 66 28 20 7a 4c 6f 67 69 6e 50       if( zLoginP
44a0: 73 77 64 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  swd==0 ) continu
44b0: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 75  e;.      if( zAu
44c0: 74 68 41 72 67 20 26 26 20 73 74 72 63 6d 70 28  thArg && strcmp(
44d0: 7a 41 75 74 68 41 72 67 2c 7a 4c 6f 67 69 6e 50  zAuthArg,zLoginP
44e0: 73 77 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  swd)==0 ){.     
44f0: 20 20 20 7a 52 65 6d 6f 74 65 55 73 65 72 20 3d     zRemoteUser =
4500: 20 53 74 72 44 75 70 28 7a 4e 61 6d 65 29 3b 0a   StrDup(zName);.
4510: 20 20 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69          fclose(i
4520: 6e 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  n);.        retu
4530: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
4540: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
4550: 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 68  mp(zFieldName,"h
4560: 74 74 70 73 2d 6f 6e 6c 79 22 29 3d 3d 30 20 29  ttps-only")==0 )
4570: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 75 73 65  {.      if( !use
4580: 48 74 74 70 73 20 29 7b 0a 20 20 20 20 20 20 20  Https ){.       
4590: 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45   NotFound(__LINE
45a0: 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 66 63 6c  __);.        fcl
45b0: 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 20  ose(in);.       
45c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
45d0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
45e0: 20 73 74 72 63 6d 70 28 7a 46 69 65 6c 64 4e 61   strcmp(zFieldNa
45f0: 6d 65 2c 22 68 74 74 70 2d 72 65 64 69 72 65 63  me,"http-redirec
4600: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
4610: 69 66 28 20 21 75 73 65 48 74 74 70 73 20 29 7b  if( !useHttps ){
4620: 0a 20 20 20 20 20 20 20 20 7a 48 74 74 70 20 3d  .        zHttp =
4630: 20 22 68 74 74 70 73 22 3b 0a 20 20 20 20 20 20   "https";.      
4640: 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c    sprintf(zLine,
4650: 20 22 25 73 25 73 22 2c 20 7a 53 63 72 69 70 74   "%s%s", zScript
4660: 2c 20 7a 50 61 74 68 49 6e 66 6f 29 3b 0a 20 20  , zPathInfo);.  
4670: 20 20 20 20 20 20 52 65 64 69 72 65 63 74 28 7a        Redirect(z
4680: 4c 69 6e 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  Line, 1);.      
4690: 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
46a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
46b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
46c0: 65 7b 0a 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e  e{.      NotFoun
46d0: 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  d(__LINE__);.   
46e0: 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
46f0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
4700: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 63 6c 6f 73     }.  }.  fclos
4710: 65 28 69 6e 29 3b 0a 20 20 4e 6f 74 41 75 74 68  e(in);.  NotAuth
4720: 6f 72 69 7a 65 64 28 7a 52 65 61 6c 6d 29 3b 0a  orized(zRealm);.
4730: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
4740: 2a 0a 2a 2a 20 47 75 65 73 73 20 74 68 65 20 6d  *.** Guess the m
4750: 69 6d 65 2d 74 79 70 65 20 6f 66 20 61 20 64 6f  ime-type of a do
4760: 63 75 6d 65 6e 74 20 62 61 73 65 64 20 6f 6e 20  cument based on 
4770: 69 74 73 20 6e 61 6d 65 2e 0a 2a 2f 0a 63 6f 6e  its name..*/.con
4780: 73 74 20 63 68 61 72 20 2a 47 65 74 4d 69 6d 65  st char *GetMime
4790: 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20  Type(const char 
47a0: 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d  *zName, int nNam
47b0: 65 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  e){.  const char
47c0: 20 2a 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *z;.  int i;.  
47d0: 69 6e 74 20 66 69 72 73 74 2c 20 6c 61 73 74 3b  int first, last;
47e0: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 63 68  .  int len;.  ch
47f0: 61 72 20 7a 53 75 66 66 69 78 5b 32 30 5d 3b 0a  ar zSuffix[20];.
4800: 0a 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 6f 66  .  /* A table of
4810: 20 6d 69 6d 65 74 79 70 65 73 20 62 61 73 65 64   mimetypes based
4820: 20 6f 6e 20 66 69 6c 65 20 73 75 66 66 69 78 65   on file suffixe
4830: 73 2e 20 0a 20 20 2a 2a 20 53 75 66 66 69 78 65  s. .  ** Suffixe
4840: 73 20 6d 75 73 74 20 62 65 20 69 6e 20 73 6f 72  s must be in sor
4850: 74 65 64 20 6f 72 64 65 72 20 73 6f 20 74 68 61  ted order so tha
4860: 74 20 77 65 20 63 61 6e 20 64 6f 20 61 20 62 69  t we can do a bi
4870: 6e 61 72 79 0a 20 20 2a 2a 20 73 65 61 72 63 68  nary.  ** search
4880: 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 69 6d   to find the mim
4890: 65 2d 74 79 70 65 0a 20 20 2a 2f 0a 20 20 73 74  e-type.  */.  st
48a0: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
48b0: 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  t {.    const ch
48c0: 61 72 20 2a 7a 53 75 66 66 69 78 3b 20 20 20 20  ar *zSuffix;    
48d0: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 73     /* The file s
48e0: 75 66 66 69 78 20 2a 2f 0a 20 20 20 20 69 6e 74  uffix */.    int
48f0: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
4900: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
4910: 68 20 6f 66 20 74 68 65 20 73 75 66 66 69 78 20  h of the suffix 
4920: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
4930: 72 20 2a 7a 4d 69 6d 65 74 79 70 65 3b 20 20 20  r *zMimetype;   
4940: 20 20 2f 2a 20 54 68 65 20 63 6f 72 72 65 73 70    /* The corresp
4950: 6f 6e 64 69 6e 67 20 6d 69 6d 65 74 79 70 65 20  onding mimetype 
4960: 2a 2f 0a 20 20 7d 20 61 4d 69 6d 65 5b 5d 20 3d  */.  } aMime[] =
4970: 20 7b 0a 20 20 20 20 7b 20 22 61 69 22 2c 20 20   {.    { "ai",  
4980: 20 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69         2, "appli
4990: 63 61 74 69 6f 6e 2f 70 6f 73 74 73 63 72 69 70  cation/postscrip
49a0: 74 22 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  t"            },
49b0: 0a 20 20 20 20 7b 20 22 61 69 66 22 2c 20 20 20  .    { "aif",   
49c0: 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 78       3, "audio/x
49d0: 2d 61 69 66 66 22 20 20 20 20 20 20 20 20 20 20  -aiff"          
49e0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
49f0: 20 20 20 7b 20 22 61 69 66 63 22 2c 20 20 20 20     { "aifc",    
4a00: 20 20 20 34 2c 20 22 61 75 64 69 6f 2f 78 2d 61     4, "audio/x-a
4a10: 69 66 66 22 20 20 20 20 20 20 20 20 20 20 20 20  iff"            
4a20: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
4a30: 20 7b 20 22 61 69 66 66 22 2c 20 20 20 20 20 20   { "aiff",      
4a40: 20 34 2c 20 22 61 75 64 69 6f 2f 78 2d 61 69 66   4, "audio/x-aif
4a50: 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f"              
4a60: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
4a70: 20 22 61 72 6a 22 2c 20 20 20 20 20 20 20 20 33   "arj",        3
4a80: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
4a90: 2d 61 72 6a 2d 63 6f 6d 70 72 65 73 73 65 64 22  -arj-compressed"
4aa0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
4ab0: 61 73 63 22 2c 20 20 20 20 20 20 20 20 33 2c 20  asc",        3, 
4ac0: 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20  "text/plain"    
4ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ae0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 73      },.    { "as
4af0: 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76  f",        3, "v
4b00: 69 64 65 6f 2f 78 2d 6d 73 2d 61 73 66 22 20 20  ideo/x-ms-asf"  
4b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b20: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 73 78 22    },.    { "asx"
4b30: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64  ,        3, "vid
4b40: 65 6f 2f 78 2d 6d 73 2d 61 73 78 22 20 20 20 20  eo/x-ms-asx"    
4b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b60: 7d 2c 0a 20 20 20 20 7b 20 22 61 75 22 2c 20 20  },.    { "au",  
4b70: 20 20 20 20 20 20 20 32 2c 20 22 61 75 64 69 6f         2, "audio
4b80: 2f 75 6c 61 77 22 20 20 20 20 20 20 20 20 20 20  /ulaw"          
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
4ba0: 0a 20 20 20 20 7b 20 22 61 76 69 22 2c 20 20 20  .    { "avi",   
4bb0: 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 78       3, "video/x
4bc0: 2d 6d 73 76 69 64 65 6f 22 20 20 20 20 20 20 20  -msvideo"       
4bd0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
4be0: 20 20 20 7b 20 22 62 61 74 22 2c 20 20 20 20 20     { "bat",     
4bf0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
4c00: 6f 6e 2f 78 2d 6d 73 64 6f 73 2d 70 72 6f 67 72  on/x-msdos-progr
4c10: 61 6d 22 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  am"       },.   
4c20: 20 7b 20 22 62 63 70 69 6f 22 2c 20 20 20 20 20   { "bcpio",     
4c30: 20 35 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   5, "application
4c40: 2f 78 2d 62 63 70 69 6f 22 20 20 20 20 20 20 20  /x-bcpio"       
4c50: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
4c60: 20 22 62 69 6e 22 2c 20 20 20 20 20 20 20 20 33   "bin",        3
4c70: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f  , "application/o
4c80: 63 74 65 74 2d 73 74 72 65 61 6d 22 20 20 20 20  ctet-stream"    
4c90: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
4ca0: 63 22 2c 20 20 20 20 20 20 20 20 20 20 31 2c 20  c",          1, 
4cb0: 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20  "text/plain"    
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cd0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 63      },.    { "cc
4ce0: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 74  ",         2, "t
4cf0: 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20  ext/plain"      
4d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d10: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 63 61 64    },.    { "ccad
4d20: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70 70  ",       4, "app
4d30: 6c 69 63 61 74 69 6f 6e 2f 63 6c 61 72 69 73 63  lication/clarisc
4d40: 61 64 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ad"             
4d50: 7d 2c 0a 20 20 20 20 7b 20 22 63 64 66 22 2c 20  },.    { "cdf", 
4d60: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
4d70: 63 61 74 69 6f 6e 2f 78 2d 6e 65 74 63 64 66 22  cation/x-netcdf"
4d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
4d90: 0a 20 20 20 20 7b 20 22 63 6c 61 73 73 22 2c 20  .    { "class", 
4da0: 20 20 20 20 20 35 2c 20 22 61 70 70 6c 69 63 61       5, "applica
4db0: 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61  tion/octet-strea
4dc0: 6d 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  m"          },. 
4dd0: 20 20 20 7b 20 22 63 6f 64 22 2c 20 20 20 20 20     { "cod",     
4de0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
4df0: 6f 6e 2f 76 6e 64 2e 72 69 6d 2e 63 6f 64 22 20  on/vnd.rim.cod" 
4e00: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
4e10: 20 7b 20 22 63 6f 6d 22 2c 20 20 20 20 20 20 20   { "com",       
4e20: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
4e30: 2f 78 2d 6d 73 64 6f 73 2d 70 72 6f 67 72 61 6d  /x-msdos-program
4e40: 22 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  "       },.    {
4e50: 20 22 63 70 69 6f 22 2c 20 20 20 20 20 20 20 34   "cpio",       4
4e60: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
4e70: 2d 63 70 69 6f 22 20 20 20 20 20 20 20 20 20 20  -cpio"          
4e80: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
4e90: 63 70 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20  cpt",        3, 
4ea0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 61 63  "application/mac
4eb0: 2d 63 6f 6d 70 61 63 74 70 72 6f 22 20 20 20 20  -compactpro"    
4ec0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 73      },.    { "cs
4ed0: 68 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  h",        3, "a
4ee0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 63 73 68  pplication/x-csh
4ef0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
4f00: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 73 73 22    },.    { "css"
4f10: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65 78  ,        3, "tex
4f20: 74 2f 63 73 73 22 20 20 20 20 20 20 20 20 20 20  t/css"          
4f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f40: 7d 2c 0a 20 20 20 20 7b 20 22 64 63 72 22 2c 20  },.    { "dcr", 
4f50: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
4f60: 63 61 74 69 6f 6e 2f 78 2d 64 69 72 65 63 74 6f  cation/x-directo
4f70: 72 22 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  r"            },
4f80: 0a 20 20 20 20 7b 20 22 64 65 62 22 2c 20 20 20  .    { "deb",   
4f90: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
4fa0: 74 69 6f 6e 2f 78 2d 64 65 62 69 61 6e 2d 70 61  tion/x-debian-pa
4fb0: 63 6b 61 67 65 22 20 20 20 20 20 20 7d 2c 0a 20  ckage"      },. 
4fc0: 20 20 20 7b 20 22 64 69 72 22 2c 20 20 20 20 20     { "dir",     
4fd0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
4fe0: 6f 6e 2f 78 2d 64 69 72 65 63 74 6f 72 22 20 20  on/x-director"  
4ff0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5000: 20 7b 20 22 64 6c 22 2c 20 20 20 20 20 20 20 20   { "dl",        
5010: 20 32 2c 20 22 76 69 64 65 6f 2f 64 6c 22 20 20   2, "video/dl"  
5020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5030: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5040: 20 22 64 6d 73 22 2c 20 20 20 20 20 20 20 20 33   "dms",        3
5050: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f  , "application/o
5060: 63 74 65 74 2d 73 74 72 65 61 6d 22 20 20 20 20  ctet-stream"    
5070: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5080: 64 6f 63 22 2c 20 20 20 20 20 20 20 20 33 2c 20  doc",        3, 
5090: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 77  "application/msw
50a0: 6f 72 64 22 20 20 20 20 20 20 20 20 20 20 20 20  ord"            
50b0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 72      },.    { "dr
50c0: 77 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  w",        3, "a
50d0: 70 70 6c 69 63 61 74 69 6f 6e 2f 64 72 61 66 74  pplication/draft
50e0: 69 6e 67 22 20 20 20 20 20 20 20 20 20 20 20 20  ing"            
50f0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 76 69 22    },.    { "dvi"
5100: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
5110: 6c 69 63 61 74 69 6f 6e 2f 78 2d 64 76 69 22 20  lication/x-dvi" 
5120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5130: 7d 2c 0a 20 20 20 20 7b 20 22 64 77 67 22 2c 20  },.    { "dwg", 
5140: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
5150: 63 61 74 69 6f 6e 2f 61 63 61 64 22 20 20 20 20  cation/acad"    
5160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
5170: 0a 20 20 20 20 7b 20 22 64 78 66 22 2c 20 20 20  .    { "dxf",   
5180: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
5190: 74 69 6f 6e 2f 64 78 66 22 20 20 20 20 20 20 20  tion/dxf"       
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
51b0: 20 20 20 7b 20 22 64 78 72 22 2c 20 20 20 20 20     { "dxr",     
51c0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
51d0: 6f 6e 2f 78 2d 64 69 72 65 63 74 6f 72 22 20 20  on/x-director"  
51e0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
51f0: 20 7b 20 22 65 70 73 22 2c 20 20 20 20 20 20 20   { "eps",       
5200: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
5210: 2f 70 6f 73 74 73 63 72 69 70 74 22 20 20 20 20  /postscript"    
5220: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5230: 20 22 65 74 78 22 2c 20 20 20 20 20 20 20 20 33   "etx",        3
5240: 2c 20 22 74 65 78 74 2f 78 2d 73 65 74 65 78 74  , "text/x-setext
5250: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
5260: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5270: 65 78 65 22 2c 20 20 20 20 20 20 20 20 33 2c 20  exe",        3, 
5280: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74  "application/oct
5290: 65 74 2d 73 74 72 65 61 6d 22 20 20 20 20 20 20  et-stream"      
52a0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65 7a      },.    { "ez
52b0: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61  ",         2, "a
52c0: 70 70 6c 69 63 61 74 69 6f 6e 2f 61 6e 64 72 65  pplication/andre
52d0: 77 2d 69 6e 73 65 74 22 20 20 20 20 20 20 20 20  w-inset"        
52e0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66 22 2c 20    },.    { "f", 
52f0: 20 20 20 20 20 20 20 20 20 31 2c 20 22 74 65 78           1, "tex
5300: 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20  t/plain"        
5310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5320: 7d 2c 0a 20 20 20 20 7b 20 22 66 39 30 22 2c 20  },.    { "f90", 
5330: 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f         3, "text/
5340: 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20 20  plain"          
5350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
5360: 0a 20 20 20 20 7b 20 22 66 6c 69 22 2c 20 20 20  .    { "fli",   
5370: 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 66       3, "video/f
5380: 6c 69 22 20 20 20 20 20 20 20 20 20 20 20 20 20  li"             
5390: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
53a0: 20 20 20 7b 20 22 66 6c 76 22 2c 20 20 20 20 20     { "flv",     
53b0: 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 66 6c 76     3, "video/flv
53c0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
53d0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
53e0: 20 7b 20 22 67 69 66 22 2c 20 20 20 20 20 20 20   { "gif",       
53f0: 20 33 2c 20 22 69 6d 61 67 65 2f 67 69 66 22 20   3, "image/gif" 
5400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5410: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5420: 20 22 67 6c 22 2c 20 20 20 20 20 20 20 20 20 32   "gl",         2
5430: 2c 20 22 76 69 64 65 6f 2f 67 6c 22 20 20 20 20  , "video/gl"    
5440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5450: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5460: 67 74 61 72 22 2c 20 20 20 20 20 20 20 34 2c 20  gtar",       4, 
5470: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 67  "application/x-g
5480: 74 61 72 22 20 20 20 20 20 20 20 20 20 20 20 20  tar"            
5490: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 67 7a      },.    { "gz
54a0: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61  ",         2, "a
54b0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 67 7a 69  pplication/x-gzi
54c0: 70 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p"              
54d0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68 64 66 22    },.    { "hdf"
54e0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
54f0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 68 64 66 22 20  lication/x-hdf" 
5500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5510: 7d 2c 0a 20 20 20 20 7b 20 22 68 68 22 2c 20 20  },.    { "hh",  
5520: 20 20 20 20 20 20 20 32 2c 20 22 74 65 78 74 2f         2, "text/
5530: 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20 20  plain"          
5540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
5550: 0a 20 20 20 20 7b 20 22 68 71 78 22 2c 20 20 20  .    { "hqx",   
5560: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
5570: 74 69 6f 6e 2f 6d 61 63 2d 62 69 6e 68 65 78 34  tion/mac-binhex4
5580: 30 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  0"          },. 
5590: 20 20 20 7b 20 22 68 22 2c 20 20 20 20 20 20 20     { "h",       
55a0: 20 20 20 31 2c 20 22 74 65 78 74 2f 70 6c 61 69     1, "text/plai
55b0: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
55c0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
55d0: 20 7b 20 22 68 74 6d 22 2c 20 20 20 20 20 20 20   { "htm",       
55e0: 20 33 2c 20 22 74 65 78 74 2f 68 74 6d 6c 22 20   3, "text/html" 
55f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5600: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5610: 20 22 68 74 6d 6c 22 2c 20 20 20 20 20 20 20 34   "html",       4
5620: 2c 20 22 74 65 78 74 2f 68 74 6d 6c 22 20 20 20  , "text/html"   
5630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5640: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5650: 69 63 65 22 2c 20 20 20 20 20 20 20 20 33 2c 20  ice",        3, 
5660: 22 78 2d 63 6f 6e 66 65 72 65 6e 63 65 2f 78 2d  "x-conference/x-
5670: 63 6f 6f 6c 74 61 6c 6b 22 20 20 20 20 20 20 20  cooltalk"       
5680: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 65      },.    { "ie
5690: 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69  f",        3, "i
56a0: 6d 61 67 65 2f 69 65 66 22 20 20 20 20 20 20 20  mage/ief"       
56b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56c0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 67 65 73    },.    { "iges
56d0: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 6d 6f 64  ",       4, "mod
56e0: 65 6c 2f 69 67 65 73 22 20 20 20 20 20 20 20 20  el/iges"        
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5700: 7d 2c 0a 20 20 20 20 7b 20 22 69 67 73 22 2c 20  },.    { "igs", 
5710: 20 20 20 20 20 20 20 33 2c 20 22 6d 6f 64 65 6c         3, "model
5720: 2f 69 67 65 73 22 20 20 20 20 20 20 20 20 20 20  /iges"          
5730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
5740: 0a 20 20 20 20 7b 20 22 69 70 73 22 2c 20 20 20  .    { "ips",   
5750: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
5760: 74 69 6f 6e 2f 78 2d 69 70 73 63 72 69 70 74 22  tion/x-ipscript"
5770: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5780: 20 20 20 7b 20 22 69 70 78 22 2c 20 20 20 20 20     { "ipx",     
5790: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
57a0: 6f 6e 2f 78 2d 69 70 69 78 22 20 20 20 20 20 20  on/x-ipix"      
57b0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
57c0: 20 7b 20 22 6a 61 64 22 2c 20 20 20 20 20 20 20   { "jad",       
57d0: 20 33 2c 20 22 74 65 78 74 2f 76 6e 64 2e 73 75   3, "text/vnd.su
57e0: 6e 2e 6a 32 6d 65 2e 61 70 70 2d 64 65 73 63 72  n.j2me.app-descr
57f0: 69 70 74 6f 72 22 20 20 7d 2c 0a 20 20 20 20 7b  iptor"  },.    {
5800: 20 22 6a 61 72 22 2c 20 20 20 20 20 20 20 20 33   "jar",        3
5810: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6a  , "application/j
5820: 61 76 61 2d 61 72 63 68 69 76 65 22 20 20 20 20  ava-archive"    
5830: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5840: 6a 70 65 67 22 2c 20 20 20 20 20 20 20 34 2c 20  jpeg",       4, 
5850: 22 69 6d 61 67 65 2f 6a 70 65 67 22 20 20 20 20  "image/jpeg"    
5860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5870: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 70      },.    { "jp
5880: 65 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69  e",        3, "i
5890: 6d 61 67 65 2f 6a 70 65 67 22 20 20 20 20 20 20  mage/jpeg"      
58a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58b0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 70 67 22    },.    { "jpg"
58c0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61  ,        3, "ima
58d0: 67 65 2f 6a 70 65 67 22 20 20 20 20 20 20 20 20  ge/jpeg"        
58e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58f0: 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 22 2c 20 20  },.    { "js",  
5900: 20 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69         2, "appli
5910: 63 61 74 69 6f 6e 2f 78 2d 6a 61 76 61 73 63 72  cation/x-javascr
5920: 69 70 74 22 20 20 20 20 20 20 20 20 20 20 7d 2c  ipt"          },
5930: 0a 20 20 20 20 7b 20 22 6b 61 72 22 2c 20 20 20  .    { "kar",   
5940: 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 6d       3, "audio/m
5950: 69 64 69 22 20 20 20 20 20 20 20 20 20 20 20 20  idi"            
5960: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5970: 20 20 20 7b 20 22 6c 61 74 65 78 22 2c 20 20 20     { "latex",   
5980: 20 20 20 35 2c 20 22 61 70 70 6c 69 63 61 74 69     5, "applicati
5990: 6f 6e 2f 78 2d 6c 61 74 65 78 22 20 20 20 20 20  on/x-latex"     
59a0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
59b0: 20 7b 20 22 6c 68 61 22 2c 20 20 20 20 20 20 20   { "lha",       
59c0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
59d0: 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22 20 20  /octet-stream"  
59e0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
59f0: 20 22 6c 73 70 22 2c 20 20 20 20 20 20 20 20 33   "lsp",        3
5a00: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
5a10: 2d 6c 69 73 70 22 20 20 20 20 20 20 20 20 20 20  -lisp"          
5a20: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5a30: 6c 7a 68 22 2c 20 20 20 20 20 20 20 20 33 2c 20  lzh",        3, 
5a40: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74  "application/oct
5a50: 65 74 2d 73 74 72 65 61 6d 22 20 20 20 20 20 20  et-stream"      
5a60: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 22      },.    { "m"
5a70: 2c 20 20 20 20 20 20 20 20 20 20 31 2c 20 22 74  ,          1, "t
5a80: 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20  ext/plain"      
5a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5aa0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 33 75 22    },.    { "m3u"
5ab0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64  ,        3, "aud
5ac0: 69 6f 2f 78 2d 6d 70 65 67 75 72 6c 22 20 20 20  io/x-mpegurl"   
5ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ae0: 7d 2c 0a 20 20 20 20 7b 20 22 6d 61 6e 22 2c 20  },.    { "man", 
5af0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
5b00: 63 61 74 69 6f 6e 2f 78 2d 74 72 6f 66 66 2d 6d  cation/x-troff-m
5b10: 61 6e 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c  an"           },
5b20: 0a 20 20 20 20 7b 20 22 6d 65 22 2c 20 20 20 20  .    { "me",    
5b30: 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61       2, "applica
5b40: 74 69 6f 6e 2f 78 2d 74 72 6f 66 66 2d 6d 65 22  tion/x-troff-me"
5b50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5b60: 20 20 20 7b 20 22 6d 65 73 68 22 2c 20 20 20 20     { "mesh",    
5b70: 20 20 20 34 2c 20 22 6d 6f 64 65 6c 2f 6d 65 73     4, "model/mes
5b80: 68 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h"              
5b90: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5ba0: 20 7b 20 22 6d 69 64 22 2c 20 20 20 20 20 20 20   { "mid",       
5bb0: 20 33 2c 20 22 61 75 64 69 6f 2f 6d 69 64 69 22   3, "audio/midi"
5bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bd0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5be0: 20 22 6d 69 64 69 22 2c 20 20 20 20 20 20 20 34   "midi",       4
5bf0: 2c 20 22 61 75 64 69 6f 2f 6d 69 64 69 22 20 20  , "audio/midi"  
5c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c10: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5c20: 6d 69 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20  mif",        3, 
5c30: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6d  "application/x-m
5c40: 69 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20  if"             
5c50: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 69      },.    { "mi
5c60: 6d 65 22 2c 20 20 20 20 20 20 20 34 2c 20 22 77  me",       4, "w
5c70: 77 77 2f 6d 69 6d 65 22 20 20 20 20 20 20 20 20  ww/mime"        
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c90: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 6f 76 69    },.    { "movi
5ca0: 65 22 2c 20 20 20 20 20 20 35 2c 20 22 76 69 64  e",      5, "vid
5cb0: 65 6f 2f 78 2d 73 67 69 2d 6d 6f 76 69 65 22 20  eo/x-sgi-movie" 
5cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cd0: 7d 2c 0a 20 20 20 20 7b 20 22 6d 6f 76 22 2c 20  },.    { "mov", 
5ce0: 20 20 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f         3, "video
5cf0: 2f 71 75 69 63 6b 74 69 6d 65 22 20 20 20 20 20  /quicktime"     
5d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
5d10: 0a 20 20 20 20 7b 20 22 6d 70 32 22 2c 20 20 20  .    { "mp2",   
5d20: 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 6d       3, "audio/m
5d30: 70 65 67 22 20 20 20 20 20 20 20 20 20 20 20 20  peg"            
5d40: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5d50: 20 20 20 7b 20 22 6d 70 32 22 2c 20 20 20 20 20     { "mp2",     
5d60: 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 6d 70 65     3, "video/mpe
5d70: 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g"              
5d80: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5d90: 20 7b 20 22 6d 70 33 22 2c 20 20 20 20 20 20 20   { "mp3",       
5da0: 20 33 2c 20 22 61 75 64 69 6f 2f 6d 70 65 67 22   3, "audio/mpeg"
5db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dc0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5dd0: 20 22 6d 70 65 67 22 2c 20 20 20 20 20 20 20 34   "mpeg",       4
5de0: 2c 20 22 76 69 64 65 6f 2f 6d 70 65 67 22 20 20  , "video/mpeg"  
5df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e00: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5e10: 6d 70 65 22 2c 20 20 20 20 20 20 20 20 33 2c 20  mpe",        3, 
5e20: 22 76 69 64 65 6f 2f 6d 70 65 67 22 20 20 20 20  "video/mpeg"    
5e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e40: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70      },.    { "mp
5e50: 67 61 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61  ga",       4, "a
5e60: 75 64 69 6f 2f 6d 70 65 67 22 20 20 20 20 20 20  udio/mpeg"      
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e80: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 67 22    },.    { "mpg"
5e90: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64  ,        3, "vid
5ea0: 65 6f 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20  eo/mpeg"        
5eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ec0: 7d 2c 0a 20 20 20 20 7b 20 22 6d 73 22 2c 20 20  },.    { "ms",  
5ed0: 20 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69         2, "appli
5ee0: 63 61 74 69 6f 6e 2f 78 2d 74 72 6f 66 66 2d 6d  cation/x-troff-m
5ef0: 73 22 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  s"            },
5f00: 0a 20 20 20 20 7b 20 22 6d 73 68 22 2c 20 20 20  .    { "msh",   
5f10: 20 20 20 20 20 33 2c 20 22 6d 6f 64 65 6c 2f 6d       3, "model/m
5f20: 65 73 68 22 20 20 20 20 20 20 20 20 20 20 20 20  esh"            
5f30: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5f40: 20 20 20 7b 20 22 6e 63 22 2c 20 20 20 20 20 20     { "nc",      
5f50: 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69     2, "applicati
5f60: 6f 6e 2f 78 2d 6e 65 74 63 64 66 22 20 20 20 20  on/x-netcdf"    
5f70: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5f80: 20 7b 20 22 6f 64 61 22 2c 20 20 20 20 20 20 20   { "oda",       
5f90: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
5fa0: 2f 6f 64 61 22 20 20 20 20 20 20 20 20 20 20 20  /oda"           
5fb0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5fc0: 20 22 6f 67 67 22 2c 20 20 20 20 20 20 20 20 33   "ogg",        3
5fd0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f  , "application/o
5fe0: 67 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20  gg"             
5ff0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6000: 6f 67 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20  ogm",        3, 
6010: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 67 67  "application/ogg
6020: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
6030: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 62      },.    { "pb
6040: 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69  m",        3, "i
6050: 6d 61 67 65 2f 78 2d 70 6f 72 74 61 62 6c 65 2d  mage/x-portable-
6060: 62 69 74 6d 61 70 22 20 20 20 20 20 20 20 20 20  bitmap"         
6070: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 64 62 22    },.    { "pdb"
6080: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 63 68 65  ,        3, "che
6090: 6d 69 63 61 6c 2f 78 2d 70 64 62 22 20 20 20 20  mical/x-pdb"    
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60b0: 7d 2c 0a 20 20 20 20 7b 20 22 70 64 66 22 2c 20  },.    { "pdf", 
60c0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
60d0: 63 61 74 69 6f 6e 2f 70 64 66 22 20 20 20 20 20  cation/pdf"     
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
60f0: 0a 20 20 20 20 7b 20 22 70 67 6d 22 2c 20 20 20  .    { "pgm",   
6100: 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78       3, "image/x
6110: 2d 70 6f 72 74 61 62 6c 65 2d 67 72 61 79 6d 61  -portable-grayma
6120: 70 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  p"          },. 
6130: 20 20 20 7b 20 22 70 67 6e 22 2c 20 20 20 20 20     { "pgn",     
6140: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
6150: 6f 6e 2f 78 2d 63 68 65 73 73 2d 70 67 6e 22 20  on/x-chess-pgn" 
6160: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6170: 20 7b 20 22 70 67 70 22 2c 20 20 20 20 20 20 20   { "pgp",       
6180: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
6190: 2f 70 67 70 22 20 20 20 20 20 20 20 20 20 20 20  /pgp"           
61a0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
61b0: 20 22 70 6c 22 2c 20 20 20 20 20 20 20 20 20 32   "pl",         2
61c0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
61d0: 2d 70 65 72 6c 22 20 20 20 20 20 20 20 20 20 20  -perl"          
61e0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
61f0: 70 6d 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  pm",         2, 
6200: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 70  "application/x-p
6210: 65 72 6c 22 20 20 20 20 20 20 20 20 20 20 20 20  erl"            
6220: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 6e      },.    { "pn
6230: 67 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69  g",        3, "i
6240: 6d 61 67 65 2f 70 6e 67 22 20 20 20 20 20 20 20  mage/png"       
6250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6260: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 6e 6d 22    },.    { "pnm"
6270: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61  ,        3, "ima
6280: 67 65 2f 78 2d 70 6f 72 74 61 62 6c 65 2d 61 6e  ge/x-portable-an
6290: 79 6d 61 70 22 20 20 20 20 20 20 20 20 20 20 20  ymap"           
62a0: 7d 2c 0a 20 20 20 20 7b 20 22 70 6f 74 22 2c 20  },.    { "pot", 
62b0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
62c0: 63 61 74 69 6f 6e 2f 6d 73 70 6f 77 65 72 70 6f  cation/mspowerpo
62d0: 69 6e 74 22 20 20 20 20 20 20 20 20 20 20 7d 2c  int"          },
62e0: 0a 20 20 20 20 7b 20 22 70 70 6d 22 2c 20 20 20  .    { "ppm",   
62f0: 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78       3, "image/x
6300: 2d 70 6f 72 74 61 62 6c 65 2d 70 69 78 6d 61 70  -portable-pixmap
6310: 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  "           },. 
6320: 20 20 20 7b 20 22 70 70 73 22 2c 20 20 20 20 20     { "pps",     
6330: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
6340: 6f 6e 2f 6d 73 70 6f 77 65 72 70 6f 69 6e 74 22  on/mspowerpoint"
6350: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6360: 20 7b 20 22 70 70 74 22 2c 20 20 20 20 20 20 20   { "ppt",       
6370: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
6380: 2f 6d 73 70 6f 77 65 72 70 6f 69 6e 74 22 20 20  /mspowerpoint"  
6390: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
63a0: 20 22 70 70 7a 22 2c 20 20 20 20 20 20 20 20 33   "ppz",        3
63b0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d  , "application/m
63c0: 73 70 6f 77 65 72 70 6f 69 6e 74 22 20 20 20 20  spowerpoint"    
63d0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
63e0: 70 72 65 22 2c 20 20 20 20 20 20 20 20 33 2c 20  pre",        3, 
63f0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 66  "application/x-f
6400: 72 65 65 6c 61 6e 63 65 22 20 20 20 20 20 20 20  reelance"       
6410: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 72      },.    { "pr
6420: 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  t",        3, "a
6430: 70 70 6c 69 63 61 74 69 6f 6e 2f 70 72 6f 5f 65  pplication/pro_e
6440: 6e 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ng"             
6450: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 73 22 2c    },.    { "ps",
6460: 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70 70           2, "app
6470: 6c 69 63 61 74 69 6f 6e 2f 70 6f 73 74 73 63 72  lication/postscr
6480: 69 70 74 22 20 20 20 20 20 20 20 20 20 20 20 20  ipt"            
6490: 7d 2c 0a 20 20 20 20 7b 20 22 71 74 22 2c 20 20  },.    { "qt",  
64a0: 20 20 20 20 20 20 20 32 2c 20 22 76 69 64 65 6f         2, "video
64b0: 2f 71 75 69 63 6b 74 69 6d 65 22 20 20 20 20 20  /quicktime"     
64c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
64d0: 0a 20 20 20 20 7b 20 22 72 61 22 2c 20 20 20 20  .    { "ra",    
64e0: 20 20 20 20 20 32 2c 20 22 61 75 64 69 6f 2f 78       2, "audio/x
64f0: 2d 72 65 61 6c 61 75 64 69 6f 22 20 20 20 20 20  -realaudio"     
6500: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6510: 20 20 20 7b 20 22 72 61 6d 22 2c 20 20 20 20 20     { "ram",     
6520: 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 70     3, "audio/x-p
6530: 6e 2d 72 65 61 6c 61 75 64 69 6f 22 20 20 20 20  n-realaudio"    
6540: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6550: 20 7b 20 22 72 61 72 22 2c 20 20 20 20 20 20 20   { "rar",       
6560: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
6570: 2f 78 2d 72 61 72 2d 63 6f 6d 70 72 65 73 73 65  /x-rar-compresse
6580: 64 22 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  d"      },.    {
6590: 20 22 72 61 73 22 2c 20 20 20 20 20 20 20 20 33   "ras",        3
65a0: 2c 20 22 69 6d 61 67 65 2f 63 6d 75 2d 72 61 73  , "image/cmu-ras
65b0: 74 65 72 22 20 20 20 20 20 20 20 20 20 20 20 20  ter"            
65c0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
65d0: 72 61 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20  ras",        3, 
65e0: 22 69 6d 61 67 65 2f 78 2d 63 6d 75 2d 72 61 73  "image/x-cmu-ras
65f0: 74 65 72 22 20 20 20 20 20 20 20 20 20 20 20 20  ter"            
6600: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 67      },.    { "rg
6610: 62 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69  b",        3, "i
6620: 6d 61 67 65 2f 78 2d 72 67 62 22 20 20 20 20 20  mage/x-rgb"     
6630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6640: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 6d 22 2c    },.    { "rm",
6650: 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 75 64           2, "aud
6660: 69 6f 2f 78 2d 70 6e 2d 72 65 61 6c 61 75 64 69  io/x-pn-realaudi
6670: 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o"              
6680: 7d 2c 0a 20 20 20 20 7b 20 22 72 6f 66 66 22 2c  },.    { "roff",
6690: 20 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69         4, "appli
66a0: 63 61 74 69 6f 6e 2f 78 2d 74 72 6f 66 66 22 20  cation/x-troff" 
66b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
66c0: 0a 20 20 20 20 7b 20 22 72 70 6d 22 2c 20 20 20  .    { "rpm",   
66d0: 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 78       3, "audio/x
66e0: 2d 70 6e 2d 72 65 61 6c 61 75 64 69 6f 2d 70 6c  -pn-realaudio-pl
66f0: 75 67 69 6e 22 20 20 20 20 20 20 20 7d 2c 0a 20  ugin"       },. 
6700: 20 20 20 7b 20 22 72 74 66 22 2c 20 20 20 20 20     { "rtf",     
6710: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
6720: 6f 6e 2f 72 74 66 22 20 20 20 20 20 20 20 20 20  on/rtf"         
6730: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6740: 20 7b 20 22 72 74 66 22 2c 20 20 20 20 20 20 20   { "rtf",       
6750: 20 33 2c 20 22 74 65 78 74 2f 72 74 66 22 20 20   3, "text/rtf"  
6760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6770: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6780: 20 22 72 74 78 22 2c 20 20 20 20 20 20 20 20 33   "rtx",        3
6790: 2c 20 22 74 65 78 74 2f 72 69 63 68 74 65 78 74  , "text/richtext
67a0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
67b0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
67c0: 73 63 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20  scm",        3, 
67d0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6c  "application/x-l
67e0: 6f 74 75 73 73 63 72 65 65 6e 63 61 6d 22 20 20  otusscreencam"  
67f0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 65      },.    { "se
6800: 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  t",        3, "a
6810: 70 70 6c 69 63 61 74 69 6f 6e 2f 73 65 74 22 20  pplication/set" 
6820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6830: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 67 6d 6c    },.    { "sgml
6840: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 74 65 78  ",       4, "tex
6850: 74 2f 73 67 6d 6c 22 20 20 20 20 20 20 20 20 20  t/sgml"         
6860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6870: 7d 2c 0a 20 20 20 20 7b 20 22 73 67 6d 22 2c 20  },.    { "sgm", 
6880: 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f         3, "text/
6890: 73 67 6d 6c 22 20 20 20 20 20 20 20 20 20 20 20  sgml"           
68a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
68b0: 0a 20 20 20 20 7b 20 22 73 68 22 2c 20 20 20 20  .    { "sh",    
68c0: 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61       2, "applica
68d0: 74 69 6f 6e 2f 78 2d 73 68 22 20 20 20 20 20 20  tion/x-sh"      
68e0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
68f0: 20 20 20 7b 20 22 73 68 61 72 22 2c 20 20 20 20     { "shar",    
6900: 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69     4, "applicati
6910: 6f 6e 2f 78 2d 73 68 61 72 22 20 20 20 20 20 20  on/x-shar"      
6920: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6930: 20 7b 20 22 73 69 6c 6f 22 2c 20 20 20 20 20 20   { "silo",      
6940: 20 34 2c 20 22 6d 6f 64 65 6c 2f 6d 65 73 68 22   4, "model/mesh"
6950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6960: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6970: 20 22 73 69 74 22 2c 20 20 20 20 20 20 20 20 33   "sit",        3
6980: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
6990: 2d 73 74 75 66 66 69 74 22 20 20 20 20 20 20 20  -stuffit"       
69a0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
69b0: 73 6b 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20  skd",        3, 
69c0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6b  "application/x-k
69d0: 6f 61 6e 22 20 20 20 20 20 20 20 20 20 20 20 20  oan"            
69e0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6b      },.    { "sk
69f0: 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  m",        3, "a
6a00: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6b 6f 61  pplication/x-koa
6a10: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
6a20: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6b 70 22    },.    { "skp"
6a30: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
6a40: 6c 69 63 61 74 69 6f 6e 2f 78 2d 6b 6f 61 6e 22  lication/x-koan"
6a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a60: 7d 2c 0a 20 20 20 20 7b 20 22 73 6b 74 22 2c 20  },.    { "skt", 
6a70: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
6a80: 63 61 74 69 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20  cation/x-koan"  
6a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6aa0: 0a 20 20 20 20 7b 20 22 73 6d 69 22 2c 20 20 20  .    { "smi",   
6ab0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
6ac0: 74 69 6f 6e 2f 73 6d 69 6c 22 20 20 20 20 20 20  tion/smil"      
6ad0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6ae0: 20 20 20 7b 20 22 73 6d 69 6c 22 2c 20 20 20 20     { "smil",    
6af0: 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69     4, "applicati
6b00: 6f 6e 2f 73 6d 69 6c 22 20 20 20 20 20 20 20 20  on/smil"        
6b10: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6b20: 20 7b 20 22 73 6e 64 22 2c 20 20 20 20 20 20 20   { "snd",       
6b30: 20 33 2c 20 22 61 75 64 69 6f 2f 62 61 73 69 63   3, "audio/basic
6b40: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
6b50: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6b60: 20 22 73 6f 6c 22 2c 20 20 20 20 20 20 20 20 33   "sol",        3
6b70: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 73  , "application/s
6b80: 6f 6c 69 64 73 22 20 20 20 20 20 20 20 20 20 20  olids"          
6b90: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6ba0: 73 70 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20  spl",        3, 
6bb0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 66  "application/x-f
6bc0: 75 74 75 72 65 73 70 6c 61 73 68 22 20 20 20 20  uturesplash"    
6bd0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 72      },.    { "sr
6be0: 63 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  c",        3, "a
6bf0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 77 61 69  pplication/x-wai
6c00: 73 2d 73 6f 75 72 63 65 22 20 20 20 20 20 20 20  s-source"       
6c10: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 74 65 70    },.    { "step
6c20: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70 70  ",       4, "app
6c30: 6c 69 63 61 74 69 6f 6e 2f 53 54 45 50 22 20 20  lication/STEP"  
6c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c50: 7d 2c 0a 20 20 20 20 7b 20 22 73 74 6c 22 2c 20  },.    { "stl", 
6c60: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
6c70: 63 61 74 69 6f 6e 2f 53 4c 41 22 20 20 20 20 20  cation/SLA"     
6c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6c90: 0a 20 20 20 20 7b 20 22 73 74 70 22 2c 20 20 20  .    { "stp",   
6ca0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
6cb0: 74 69 6f 6e 2f 53 54 45 50 22 20 20 20 20 20 20  tion/STEP"      
6cc0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6cd0: 20 20 20 7b 20 22 73 76 34 63 70 69 6f 22 2c 20     { "sv4cpio", 
6ce0: 20 20 20 37 2c 20 22 61 70 70 6c 69 63 61 74 69     7, "applicati
6cf0: 6f 6e 2f 78 2d 73 76 34 63 70 69 6f 22 20 20 20  on/x-sv4cpio"   
6d00: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6d10: 20 7b 20 22 73 76 34 63 72 63 22 2c 20 20 20 20   { "sv4crc",    
6d20: 20 36 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   6, "application
6d30: 2f 78 2d 73 76 34 63 72 63 22 20 20 20 20 20 20  /x-sv4crc"      
6d40: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6d50: 20 22 73 77 66 22 2c 20 20 20 20 20 20 20 20 33   "swf",        3
6d60: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
6d70: 2d 73 68 6f 63 6b 77 61 76 65 2d 66 6c 61 73 68  -shockwave-flash
6d80: 22 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22  "     },.    { "
6d90: 74 22 2c 20 20 20 20 20 20 20 20 20 20 31 2c 20  t",          1, 
6da0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74  "application/x-t
6db0: 72 6f 66 66 22 20 20 20 20 20 20 20 20 20 20 20  roff"           
6dc0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 61      },.    { "ta
6dd0: 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  r",        3, "a
6de0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 61 72  pplication/x-tar
6df0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
6e00: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 63 6c 22    },.    { "tcl"
6e10: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
6e20: 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 63 6c 22 20  lication/x-tcl" 
6e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e40: 7d 2c 0a 20 20 20 20 7b 20 22 74 65 78 22 2c 20  },.    { "tex", 
6e50: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
6e60: 63 61 74 69 6f 6e 2f 78 2d 74 65 78 22 20 20 20  cation/x-tex"   
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6e80: 0a 20 20 20 20 7b 20 22 74 65 78 69 22 2c 20 20  .    { "texi",  
6e90: 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61       4, "applica
6ea0: 74 69 6f 6e 2f 78 2d 74 65 78 69 6e 66 6f 22 20  tion/x-texinfo" 
6eb0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6ec0: 20 20 20 7b 20 22 74 65 78 69 6e 66 6f 22 2c 20     { "texinfo", 
6ed0: 20 20 20 37 2c 20 22 61 70 70 6c 69 63 61 74 69     7, "applicati
6ee0: 6f 6e 2f 78 2d 74 65 78 69 6e 66 6f 22 20 20 20  on/x-texinfo"   
6ef0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6f00: 20 7b 20 22 74 67 7a 22 2c 20 20 20 20 20 20 20   { "tgz",       
6f10: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
6f20: 2f 78 2d 74 61 72 2d 67 7a 22 20 20 20 20 20 20  /x-tar-gz"      
6f30: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6f40: 20 22 74 69 66 66 22 2c 20 20 20 20 20 20 20 34   "tiff",       4
6f50: 2c 20 22 69 6d 61 67 65 2f 74 69 66 66 22 20 20  , "image/tiff"  
6f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f70: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6f80: 74 69 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20  tif",        3, 
6f90: 22 69 6d 61 67 65 2f 74 69 66 66 22 20 20 20 20  "image/tiff"    
6fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fb0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 72      },.    { "tr
6fc0: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61  ",         2, "a
6fd0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72 6f  pplication/x-tro
6fe0: 66 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ff"             
6ff0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 73 69 22    },.    { "tsi"
7000: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64  ,        3, "aud
7010: 69 6f 2f 54 53 50 2d 61 75 64 69 6f 22 20 20 20  io/TSP-audio"   
7020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7030: 7d 2c 0a 20 20 20 20 7b 20 22 74 73 70 22 2c 20  },.    { "tsp", 
7040: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
7050: 63 61 74 69 6f 6e 2f 64 73 70 74 79 70 65 22 20  cation/dsptype" 
7060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7070: 0a 20 20 20 20 7b 20 22 74 73 76 22 2c 20 20 20  .    { "tsv",   
7080: 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 74 61       3, "text/ta
7090: 62 2d 73 65 70 61 72 61 74 65 64 2d 76 61 6c 75  b-separated-valu
70a0: 65 73 22 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  es"         },. 
70b0: 20 20 20 7b 20 22 74 78 74 22 2c 20 20 20 20 20     { "txt",     
70c0: 20 20 20 33 2c 20 22 74 65 78 74 2f 70 6c 61 69     3, "text/plai
70d0: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
70e0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
70f0: 20 7b 20 22 75 6e 76 22 2c 20 20 20 20 20 20 20   { "unv",       
7100: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
7110: 2f 69 2d 64 65 61 73 22 20 20 20 20 20 20 20 20  /i-deas"        
7120: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7130: 20 22 75 73 74 61 72 22 2c 20 20 20 20 20 20 35   "ustar",      5
7140: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
7150: 2d 75 73 74 61 72 22 20 20 20 20 20 20 20 20 20  -ustar"         
7160: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7170: 76 63 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20  vcd",        3, 
7180: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 63  "application/x-c
7190: 64 6c 69 6e 6b 22 20 20 20 20 20 20 20 20 20 20  dlink"          
71a0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 76 64      },.    { "vd
71b0: 61 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  a",        3, "a
71c0: 70 70 6c 69 63 61 74 69 6f 6e 2f 76 64 61 22 20  pplication/vda" 
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71e0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 76 69 76 22    },.    { "viv"
71f0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64  ,        3, "vid
7200: 65 6f 2f 76 6e 64 2e 76 69 76 6f 22 20 20 20 20  eo/vnd.vivo"    
7210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7220: 7d 2c 0a 20 20 20 20 7b 20 22 76 69 76 6f 22 2c  },.    { "vivo",
7230: 20 20 20 20 20 20 20 34 2c 20 22 76 69 64 65 6f         4, "video
7240: 2f 76 6e 64 2e 76 69 76 6f 22 20 20 20 20 20 20  /vnd.vivo"      
7250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7260: 0a 20 20 20 20 7b 20 22 76 72 6d 6c 22 2c 20 20  .    { "vrml",  
7270: 20 20 20 20 20 34 2c 20 22 6d 6f 64 65 6c 2f 76       4, "model/v
7280: 72 6d 6c 22 20 20 20 20 20 20 20 20 20 20 20 20  rml"            
7290: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
72a0: 20 20 20 7b 20 22 77 61 76 22 2c 20 20 20 20 20     { "wav",     
72b0: 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 77     3, "audio/x-w
72c0: 61 76 22 20 20 20 20 20 20 20 20 20 20 20 20 20  av"             
72d0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
72e0: 20 7b 20 22 77 61 78 22 2c 20 20 20 20 20 20 20   { "wax",       
72f0: 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 6d 73 2d   3, "audio/x-ms-
7300: 77 61 78 22 20 20 20 20 20 20 20 20 20 20 20 20  wax"            
7310: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7320: 20 22 77 69 6b 69 22 2c 20 20 20 20 20 20 20 34   "wiki",       4
7330: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
7340: 2d 66 6f 73 73 69 6c 2d 77 69 6b 69 22 20 20 20  -fossil-wiki"   
7350: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7360: 77 6d 61 22 2c 20 20 20 20 20 20 20 20 33 2c 20  wma",        3, 
7370: 22 61 75 64 69 6f 2f 78 2d 6d 73 2d 77 6d 61 22  "audio/x-ms-wma"
7380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7390: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 6d      },.    { "wm
73a0: 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76  v",        3, "v
73b0: 69 64 65 6f 2f 78 2d 6d 73 2d 77 6d 76 22 20 20  ideo/x-ms-wmv"  
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73d0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 6d 78 22    },.    { "wmx"
73e0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64  ,        3, "vid
73f0: 65 6f 2f 78 2d 6d 73 2d 77 6d 78 22 20 20 20 20  eo/x-ms-wmx"    
7400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7410: 7d 2c 0a 20 20 20 20 7b 20 22 77 72 6c 22 2c 20  },.    { "wrl", 
7420: 20 20 20 20 20 20 20 33 2c 20 22 6d 6f 64 65 6c         3, "model
7430: 2f 76 72 6d 6c 22 20 20 20 20 20 20 20 20 20 20  /vrml"          
7440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7450: 0a 20 20 20 20 7b 20 22 77 76 78 22 2c 20 20 20  .    { "wvx",   
7460: 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 78       3, "video/x
7470: 2d 6d 73 2d 77 76 78 22 20 20 20 20 20 20 20 20  -ms-wvx"        
7480: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7490: 20 20 20 7b 20 22 78 62 6d 22 2c 20 20 20 20 20     { "xbm",     
74a0: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 78     3, "image/x-x
74b0: 62 69 74 6d 61 70 22 20 20 20 20 20 20 20 20 20  bitmap"         
74c0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
74d0: 20 7b 20 22 78 6c 63 22 2c 20 20 20 20 20 20 20   { "xlc",       
74e0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
74f0: 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20 20  /vnd.ms-excel"  
7500: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7510: 20 22 78 6c 6c 22 2c 20 20 20 20 20 20 20 20 33   "xll",        3
7520: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76  , "application/v
7530: 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20 20 20 20  nd.ms-excel"    
7540: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7550: 78 6c 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20  xlm",        3, 
7560: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76 6e 64  "application/vnd
7570: 2e 6d 73 2d 65 78 63 65 6c 22 20 20 20 20 20 20  .ms-excel"      
7580: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 6c      },.    { "xl
7590: 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  s",        3, "a
75a0: 70 70 6c 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d  pplication/vnd.m
75b0: 73 2d 65 78 63 65 6c 22 20 20 20 20 20 20 20 20  s-excel"        
75c0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 6c 77 22    },.    { "xlw"
75d0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
75e0: 6c 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d  lication/vnd.ms-
75f0: 65 78 63 65 6c 22 20 20 20 20 20 20 20 20 20 20  excel"          
7600: 7d 2c 0a 20 20 20 20 7b 20 22 78 6d 6c 22 2c 20  },.    { "xml", 
7610: 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f         3, "text/
7620: 78 6d 6c 22 20 20 20 20 20 20 20 20 20 20 20 20  xml"            
7630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7640: 0a 20 20 20 20 7b 20 22 78 70 6d 22 2c 20 20 20  .    { "xpm",   
7650: 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78       3, "image/x
7660: 2d 78 70 69 78 6d 61 70 22 20 20 20 20 20 20 20  -xpixmap"       
7670: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7680: 20 20 20 7b 20 22 78 77 64 22 2c 20 20 20 20 20     { "xwd",     
7690: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 78     3, "image/x-x
76a0: 77 69 6e 64 6f 77 64 75 6d 70 22 20 20 20 20 20  windowdump"     
76b0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
76c0: 20 7b 20 22 78 79 7a 22 2c 20 20 20 20 20 20 20   { "xyz",       
76d0: 20 33 2c 20 22 63 68 65 6d 69 63 61 6c 2f 78 2d   3, "chemical/x-
76e0: 70 64 62 22 20 20 20 20 20 20 20 20 20 20 20 20  pdb"            
76f0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7700: 20 22 7a 69 70 22 2c 20 20 20 20 20 20 20 20 33   "zip",        3
7710: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 7a  , "application/z
7720: 69 70 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ip"             
7730: 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 0a 20        },.  };.. 
7740: 20 66 6f 72 28 69 3d 6e 4e 61 6d 65 2d 31 3b 20   for(i=nName-1; 
7750: 69 3e 30 20 26 26 20 7a 4e 61 6d 65 5b 69 5d 21  i>0 && zName[i]!
7760: 3d 27 2e 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 7a  ='.'; i--){}.  z
7770: 20 3d 20 26 7a 4e 61 6d 65 5b 69 2b 31 5d 3b 0a   = &zName[i+1];.
7780: 20 20 6c 65 6e 20 3d 20 6e 4e 61 6d 65 20 2d 20    len = nName - 
7790: 69 3b 0a 20 20 69 66 28 20 6c 65 6e 3c 73 69 7a  i;.  if( len<siz
77a0: 65 6f 66 28 7a 53 75 66 66 69 78 29 2d 31 20 29  eof(zSuffix)-1 )
77b0: 7b 0a 20 20 20 20 73 74 72 63 70 79 28 7a 53 75  {.    strcpy(zSu
77c0: 66 66 69 78 2c 20 7a 29 3b 0a 20 20 20 20 66 6f  ffix, z);.    fo
77d0: 72 28 69 3d 30 3b 20 7a 53 75 66 66 69 78 5b 69  r(i=0; zSuffix[i
77e0: 5d 3b 20 69 2b 2b 29 20 7a 53 75 66 66 69 78 5b  ]; i++) zSuffix[
77f0: 69 5d 20 3d 20 74 6f 6c 6f 77 65 72 28 7a 53 75  i] = tolower(zSu
7800: 66 66 69 78 5b 69 5d 29 3b 0a 20 20 20 20 66 69  ffix[i]);.    fi
7810: 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 6c 61 73  rst = 0;.    las
7820: 74 20 3d 20 73 69 7a 65 6f 66 28 61 4d 69 6d 65  t = sizeof(aMime
7830: 29 2f 73 69 7a 65 6f 66 28 61 4d 69 6d 65 5b 30  )/sizeof(aMime[0
7840: 5d 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 66  ]);.    while( f
7850: 69 72 73 74 3c 3d 6c 61 73 74 20 29 7b 0a 20 20  irst<=last ){.  
7860: 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20      int c;.     
7870: 20 69 20 3d 20 28 66 69 72 73 74 2b 6c 61 73 74   i = (first+last
7880: 29 2f 32 3b 0a 20 20 20 20 20 20 63 20 3d 20 73  )/2;.      c = s
7890: 74 72 63 6d 70 28 7a 53 75 66 66 69 78 2c 20 61  trcmp(zSuffix, a
78a0: 4d 69 6d 65 5b 69 5d 2e 7a 53 75 66 66 69 78 29  Mime[i].zSuffix)
78b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30  ;.      if( c==0
78c0: 20 29 20 72 65 74 75 72 6e 20 61 4d 69 6d 65 5b   ) return aMime[
78d0: 69 5d 2e 7a 4d 69 6d 65 74 79 70 65 3b 0a 20 20  i].zMimetype;.  
78e0: 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20      if( c<0 ){. 
78f0: 20 20 20 20 20 20 20 6c 61 73 74 20 3d 20 69 2d         last = i-
7900: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
7910: 20 20 20 20 20 20 20 20 66 69 72 73 74 20 3d 20          first = 
7920: 69 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i+1;.      }.   
7930: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
7940: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74  "application/oct
7950: 65 74 2d 73 74 72 65 61 6d 22 3b 0a 7d 0a 0a 2f  et-stream";.}../
7960: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
7970: 6e 67 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  ng table contain
7980: 73 20 31 20 66 6f 72 20 61 6c 6c 20 63 68 61 72  s 1 for all char
7990: 61 63 74 65 72 73 20 74 68 61 74 20 61 72 65 20  acters that are 
79a0: 70 65 72 6d 69 74 74 65 64 20 69 6e 0a 2a 2a 20  permitted in.** 
79b0: 74 68 65 20 70 61 72 74 20 6f 66 20 74 68 65 20  the part of the 
79c0: 55 52 4c 20 62 65 66 6f 72 65 20 74 68 65 20 71  URL before the q
79d0: 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20  uery parameters 
79e0: 61 6e 64 20 66 72 61 67 6d 65 6e 74 2e 0a 2a 2a  and fragment..**
79f0: 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 63 68 61 72  .** Allowed char
7a00: 61 63 74 65 72 73 3a 20 20 30 2d 39 20 61 2d 7a  acters:  0-9 a-z
7a10: 20 41 2d 5a 20 2c 2d 2e 2f 3a 5f 7e 0a 2a 2a 0a   A-Z ,-./:_~.**.
7a20: 2a 2a 20 44 69 73 61 6c 6c 6f 77 65 64 20 63 68  ** Disallowed ch
7a30: 61 72 61 63 74 65 72 73 20 69 6e 63 6c 75 64 65  aracters include
7a40: 3a 20 20 21 22 23 24 25 26 27 28 29 2a 2b 3b 3c  :  !"#$%&'()*+;<
7a50: 3d 3e 3f 5b 5c 5d 5e 7b 7c 7d 0a 2a 2f 0a 73 74  =>?[\]^{|}.*/.st
7a60: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
7a70: 61 6c 6c 6f 77 65 64 49 6e 4e 61 6d 65 5b 5d 20  allowedInName[] 
7a80: 3d 20 7b 0a 20 20 20 20 20 20 2f 2a 20 20 78 30  = {.      /*  x0
7a90: 20 20 78 31 20 20 78 32 20 20 78 33 20 20 78 34    x1  x2  x3  x4
7aa0: 20 20 78 35 20 20 78 36 20 20 78 37 20 20 78 38    x5  x6  x7  x8
7ab0: 20 20 78 39 20 20 78 61 20 20 78 62 20 20 78 63    x9  xa  xb  xc
7ac0: 20 20 78 64 20 20 78 65 20 20 78 66 20 2a 2f 0a    xd  xe  xf */.
7ad0: 2f 2a 20 30 78 20 2a 2f 20 20 20 30 2c 20 20 30  /* 0x */   0,  0
7ae0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
7af0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
7b00: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
7b10: 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 31 78 20  ,  0,  0,./* 1x 
7b20: 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20  */   0,  0,  0, 
7b30: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
7b40: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
7b50: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
7b60: 20 30 2c 0a 2f 2a 20 32 78 20 2a 2f 20 20 20 30   0,./* 2x */   0
7b70: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
7b80: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
7b90: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 31  ,  0,  0,  0,  1
7ba0: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 0a 2f 2a  ,  1,  1,  1,./*
7bb0: 20 33 78 20 2a 2f 20 20 20 31 2c 20 20 31 2c 20   3x */   1,  1, 
7bc0: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
7bd0: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
7be0: 20 31 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   1,  0,  0,  0, 
7bf0: 20 30 2c 20 20 30 2c 0a 2f 2a 20 34 78 20 2a 2f   0,  0,./* 4x */
7c00: 20 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 31     0,  1,  1,  1
7c10: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
7c20: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
7c30: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
7c40: 2c 0a 2f 2a 20 35 78 20 2a 2f 20 20 20 31 2c 20  ,./* 5x */   1, 
7c50: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
7c60: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
7c70: 20 31 2c 20 20 31 2c 20 20 30 2c 20 20 30 2c 20   1,  1,  0,  0, 
7c80: 20 30 2c 20 20 30 2c 20 20 31 2c 0a 2f 2a 20 36   0,  0,  1,./* 6
7c90: 78 20 2a 2f 20 20 20 30 2c 20 20 31 2c 20 20 31  x */   0,  1,  1
7ca0: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
7cb0: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
7cc0: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
7cd0: 2c 20 20 31 2c 0a 2f 2a 20 37 78 20 2a 2f 20 20  ,  1,./* 7x */  
7ce0: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
7cf0: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
7d00: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 30 2c 20   1,  1,  1,  0, 
7d10: 20 30 2c 20 20 30 2c 20 20 31 2c 20 20 30 2c 0a   0,  0,  1,  0,.
7d20: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  };../*.** This r
7d30: 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73  outine processes
7d40: 20 61 20 73 69 6e 67 6c 65 20 48 54 54 50 20 72   a single HTTP r
7d50: 65 71 75 65 73 74 20 6f 6e 20 73 74 61 6e 64 61  equest on standa
7d60: 72 64 20 69 6e 70 75 74 20 61 6e 64 0a 2a 2a 20  rd input and.** 
7d70: 73 65 6e 64 73 20 74 68 65 20 72 65 70 6c 79 20  sends the reply 
7d80: 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70  to standard outp
7d90: 75 74 2e 20 20 49 66 20 74 68 65 20 61 72 67 75  ut.  If the argu
7da0: 6d 65 6e 74 20 69 73 20 31 20 69 74 20 6d 65 61  ment is 1 it mea
7db0: 6e 73 0a 2a 2a 20 74 68 61 74 20 77 65 20 61 72  ns.** that we ar
7dc0: 65 20 73 68 6f 75 6c 64 20 63 6c 6f 73 65 20 74  e should close t
7dd0: 68 65 20 73 6f 63 6b 65 74 20 77 69 74 68 6f 75  he socket withou
7de0: 74 20 70 72 6f 63 65 73 73 69 6e 67 20 61 64 64  t processing add
7df0: 69 74 69 6f 6e 61 6c 0a 2a 2a 20 48 54 54 50 20  itional.** HTTP 
7e00: 72 65 71 75 65 73 74 73 20 61 66 74 65 72 20 74  requests after t
7e10: 68 65 20 63 75 72 72 65 6e 74 20 72 65 71 75 65  he current reque
7e20: 73 74 20 66 69 6e 69 73 68 65 73 2e 20 20 30 20  st finishes.  0 
7e30: 6d 65 61 6e 73 20 77 65 20 61 72 65 0a 2a 2a 20  means we are.** 
7e40: 61 6c 6c 6f 77 65 64 20 74 6f 20 6b 65 65 70 20  allowed to keep 
7e50: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  the connection o
7e60: 70 65 6e 20 61 6e 64 20 74 6f 20 70 72 6f 63 65  pen and to proce
7e70: 73 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 72 65  ss additional re
7e80: 71 75 65 73 74 73 2e 0a 2a 2a 20 54 68 69 73 20  quests..** This 
7e90: 72 6f 75 74 69 6e 65 20 6d 61 79 20 63 68 6f 6f  routine may choo
7ea0: 73 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20  se to close the 
7eb0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 65 76 65 6e 20  connection even 
7ec0: 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 0a  if the argument.
7ed0: 2a 2a 20 69 73 20 30 2e 0a 2a 2a 20 0a 2a 2a 20  ** is 0..** .** 
7ee0: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
7ef0: 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73  n should be clos
7f00: 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
7f10: 20 63 61 6c 6c 73 20 65 78 69 74 28 29 20 61 6e   calls exit() an
7f20: 64 0a 2a 2a 20 74 68 75 73 20 6e 65 76 65 72 20  d.** thus never 
7f30: 72 65 74 75 72 6e 73 2e 20 20 49 66 20 74 68 69  returns.  If thi
7f40: 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 72  s routine does r
7f50: 65 74 75 72 6e 20 69 74 20 6d 65 61 6e 73 20 74  eturn it means t
7f60: 68 61 74 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 48  hat another.** H
7f70: 54 54 50 20 72 65 71 75 65 73 74 20 6d 61 79 20  TTP request may 
7f80: 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 77 69  appear on the wi
7f90: 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 50 72 6f 63  re..*/.void Proc
7fa0: 65 73 73 4f 6e 65 52 65 71 75 65 73 74 28 69 6e  essOneRequest(in
7fb0: 74 20 66 6f 72 63 65 43 6c 6f 73 65 29 7b 0a 20  t forceClose){. 
7fc0: 20 69 6e 74 20 69 2c 20 63 3b 0a 20 20 63 68 61   int i, c;.  cha
7fd0: 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20  r *z;           
7fe0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
7ff0: 6f 20 70 61 72 73 65 20 75 70 20 61 20 73 74 72  o parse up a str
8000: 69 6e 67 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ing */.  struct 
8010: 73 74 61 74 20 73 74 61 74 62 75 66 3b 20 20 20  stat statbuf;   
8020: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
8030: 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65  n about the file
8040: 20 74 6f 20 62 65 20 72 65 74 72 69 65 76 65 64   to be retrieved
8050: 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 20   */.  FILE *in; 
8060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8070: 2f 2a 20 46 6f 72 20 72 65 61 64 69 6e 67 20 66  /* For reading f
8080: 72 6f 6d 20 43 47 49 20 73 63 72 69 70 74 73 20  rom CGI scripts 
8090: 2a 2f 0a 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b  */.  char zLine[
80a0: 31 30 30 30 5d 3b 20 20 20 20 20 20 20 20 20 2f  1000];         /
80b0: 2a 20 41 20 62 75 66 66 65 72 20 66 6f 72 20 69  * A buffer for i
80c0: 6e 70 75 74 20 6c 69 6e 65 73 20 6f 72 20 66 6f  nput lines or fo
80d0: 72 6d 69 6e 67 20 6e 61 6d 65 73 20 2a 2f 0a 0a  rming names */..
80e0: 20 20 2f 2a 20 43 68 61 6e 67 65 20 64 69 72 65    /* Change dire
80f0: 63 74 6f 72 69 65 73 20 74 6f 20 74 68 65 20 72  ctories to the r
8100: 6f 6f 74 20 6f 66 20 74 68 65 20 48 54 54 50 20  oot of the HTTP 
8110: 66 69 6c 65 73 79 73 74 65 6d 0a 20 20 2a 2f 0a  filesystem.  */.
8120: 20 20 69 66 28 20 63 68 64 69 72 28 7a 52 6f 6f    if( chdir(zRoo
8130: 74 5b 30 5d 20 3f 20 7a 52 6f 6f 74 20 3a 20 22  t[0] ? zRoot : "
8140: 2f 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68  /")!=0 ){.    ch
8150: 61 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20  ar zBuf[1000];. 
8160: 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f     Malfunction(_
8170: 5f 4c 49 4e 45 5f 5f 2c 20 22 63 61 6e 6e 6f 74  _LINE__, "cannot
8180: 20 63 68 64 69 72 20 74 6f 20 5b 25 73 5d 20 66   chdir to [%s] f
8190: 72 6f 6d 20 5b 25 73 5d 22 2c 0a 20 20 20 20 20  rom [%s]",.     
81a0: 20 20 20 20 7a 52 6f 6f 74 2c 20 67 65 74 63 77      zRoot, getcw
81b0: 64 28 7a 42 75 66 2c 39 39 39 29 29 3b 0a 20 20  d(zBuf,999));.  
81c0: 7d 0a 20 20 6e 52 65 71 75 65 73 74 2b 2b 3b 0a  }.  nRequest++;.
81d0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 6d 75  .  /*.  ** We mu
81e0: 73 74 20 72 65 63 65 69 76 65 20 61 20 63 6f 6d  st receive a com
81f0: 70 6c 65 74 65 20 68 65 61 64 65 72 20 77 69 74  plete header wit
8200: 68 69 6e 20 31 35 20 73 65 63 6f 6e 64 73 0a 20  hin 15 seconds. 
8210: 20 2a 2f 0a 20 20 73 69 67 6e 61 6c 28 53 49 47   */.  signal(SIG
8220: 41 4c 52 4d 2c 20 54 69 6d 65 6f 75 74 29 3b 0a  ALRM, Timeout);.
8230: 20 20 69 66 28 20 75 73 65 54 69 6d 65 6f 75 74    if( useTimeout
8240: 20 29 20 61 6c 61 72 6d 28 31 35 29 3b 0a 0a 20   ) alarm(15);.. 
8250: 20 2f 2a 20 47 65 74 20 74 68 65 20 66 69 72 73   /* Get the firs
8260: 74 20 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65  t line of the re
8270: 71 75 65 73 74 20 61 6e 64 20 70 61 72 73 65 20  quest and parse 
8280: 6f 75 74 20 74 68 65 0a 20 20 2a 2a 20 6d 65 74  out the.  ** met
8290: 68 6f 64 2c 20 74 68 65 20 73 63 72 69 70 74 20  hod, the script 
82a0: 61 6e 64 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c  and the protocol
82b0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 66 67 65  ..  */.  if( fge
82c0: 74 73 28 7a 4c 69 6e 65 2c 73 69 7a 65 6f 66 28  ts(zLine,sizeof(
82d0: 7a 4c 69 6e 65 29 2c 73 74 64 69 6e 29 3d 3d 30  zLine),stdin)==0
82e0: 20 29 7b 0a 20 20 20 20 65 78 69 74 28 30 29 3b   ){.    exit(0);
82f0: 0a 20 20 7d 0a 20 20 6f 6d 69 74 4c 6f 67 20 3d  .  }.  omitLog =
8300: 20 30 3b 0a 20 20 6e 49 6e 20 2b 3d 20 73 74 72   0;.  nIn += str
8310: 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20 20 7a 4d  len(zLine);.  zM
8320: 65 74 68 6f 64 20 3d 20 53 74 72 44 75 70 28 47  ethod = StrDup(G
8330: 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a  etFirstElement(z
8340: 4c 69 6e 65 2c 26 7a 29 29 3b 0a 20 20 7a 52 65  Line,&z));.  zRe
8350: 61 6c 53 63 72 69 70 74 20 3d 20 7a 53 63 72 69  alScript = zScri
8360: 70 74 20 3d 20 53 74 72 44 75 70 28 47 65 74 46  pt = StrDup(GetF
8370: 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a 2c 26 7a  irstElement(z,&z
8380: 29 29 3b 0a 20 20 7a 50 72 6f 74 6f 63 6f 6c 20  ));.  zProtocol 
8390: 3d 20 53 74 72 44 75 70 28 47 65 74 46 69 72 73  = StrDup(GetFirs
83a0: 74 45 6c 65 6d 65 6e 74 28 7a 2c 26 7a 29 29 3b  tElement(z,&z));
83b0: 0a 20 20 69 66 28 20 7a 50 72 6f 74 6f 63 6f 6c  .  if( zProtocol
83c0: 3d 3d 30 20 7c 7c 20 73 74 72 6e 63 6d 70 28 7a  ==0 || strncmp(z
83d0: 50 72 6f 74 6f 63 6f 6c 2c 22 48 54 54 50 2f 22  Protocol,"HTTP/"
83e0: 2c 35 29 21 3d 30 20 7c 7c 20 73 74 72 6c 65 6e  ,5)!=0 || strlen
83f0: 28 7a 50 72 6f 74 6f 63 6f 6c 29 21 3d 38 20 29  (zProtocol)!=8 )
8400: 7b 0a 20 20 20 20 53 74 61 72 74 52 65 73 70 6f  {.    StartRespo
8410: 6e 73 65 28 22 34 30 30 20 42 61 64 20 52 65 71  nse("400 Bad Req
8420: 75 65 73 74 22 29 3b 0a 20 20 20 20 6e 4f 75 74  uest");.    nOut
8430: 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20   += printf(.    
8440: 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a    "Content-type:
8450: 20 74 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e 22 0a   text/html\r\n".
8460: 20 20 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20        "\r\n".   
8470: 20 20 20 22 3c 74 69 74 6c 65 3e 55 6e 6b 6e 6f     "<title>Unkno
8480: 77 6e 20 50 72 6f 74 6f 63 6f 6c 20 4f 6e 20 48  wn Protocol On H
8490: 54 54 50 20 52 65 71 75 65 73 74 3c 2f 74 69 74  TTP Request</tit
84a0: 6c 65 3e 5c 6e 22 0a 20 20 20 20 20 20 22 3c 68  le>\n".      "<h
84b0: 31 3e 55 6e 6b 6e 6f 77 6e 20 50 72 6f 74 6f 63  1>Unknown Protoc
84c0: 6f 6c 3c 2f 68 31 3e 5c 6e 22 0a 20 20 20 20 20  ol</h1>\n".     
84d0: 20 22 54 68 69 73 20 73 65 72 76 65 72 20 64 6f   "This server do
84e0: 65 73 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e  es not understan
84f0: 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  d the requested 
8500: 70 72 6f 74 6f 63 6f 6c 5c 6e 22 0a 20 20 20 20  protocol\n".    
8510: 29 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e  );.    MakeLogEn
8520: 74 72 79 28 30 29 3b 0a 20 20 20 20 65 78 69 74  try(0);.    exit
8530: 28 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  (0);.  }.  if( z
8540: 53 63 72 69 70 74 5b 30 5d 3d 3d 30 20 29 20 4e  Script[0]==0 ) N
8550: 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f  otFound(__LINE__
8560: 29 3b 0a 20 20 69 66 28 20 66 6f 72 63 65 43 6c  );.  if( forceCl
8570: 6f 73 65 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65  ose ){.    close
8580: 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 31 3b 0a  Connection = 1;.
8590: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 72 6f    }else if( zPro
85a0: 74 6f 63 6f 6c 5b 35 5d 3c 27 31 27 20 7c 7c 20  tocol[5]<'1' || 
85b0: 7a 50 72 6f 74 6f 63 6f 6c 5b 37 5d 3c 27 31 27  zProtocol[7]<'1'
85c0: 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 43 6f 6e   ){.    closeCon
85d0: 6e 65 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d  nection = 1;.  }
85e0: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 76 65 72 79  ..  /* This very
85f0: 20 73 69 6d 70 6c 65 20 73 65 72 76 65 72 20 6f   simple server o
8600: 6e 6c 79 20 75 6e 64 65 72 73 74 61 6e 64 73 20  nly understands 
8610: 74 68 65 20 47 45 54 2c 20 50 4f 53 54 0a 20 20  the GET, POST.  
8620: 2a 2a 20 61 6e 64 20 48 45 41 44 20 6d 65 74 68  ** and HEAD meth
8630: 6f 64 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ods.  */.  if( s
8640: 74 72 63 6d 70 28 7a 4d 65 74 68 6f 64 2c 22 47  trcmp(zMethod,"G
8650: 45 54 22 29 21 3d 30 20 26 26 20 73 74 72 63 6d  ET")!=0 && strcm
8660: 70 28 7a 4d 65 74 68 6f 64 2c 22 50 4f 53 54 22  p(zMethod,"POST"
8670: 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20 73  )!=0.       && s
8680: 74 72 63 6d 70 28 7a 4d 65 74 68 6f 64 2c 22 48  trcmp(zMethod,"H
8690: 45 41 44 22 29 21 3d 30 20 29 7b 0a 20 20 20 20  EAD")!=0 ){.    
86a0: 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 35  StartResponse("5
86b0: 30 31 20 4e 6f 74 20 49 6d 70 6c 65 6d 65 6e 74  01 Not Implement
86c0: 65 64 22 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b  ed");.    nOut +
86d0: 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  = printf(.      
86e0: 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74  "Content-type: t
86f0: 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e 22 0a 20 20  ext/html\r\n".  
8700: 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 20      "\r\n".     
8710: 20 22 3c 68 65 61 64 3e 3c 74 69 74 6c 65 3e 4d   "<head><title>M
8720: 65 74 68 6f 64 20 6e 6f 74 20 69 6d 70 6c 65 6d  ethod not implem
8730: 65 6e 74 65 64 3c 2f 74 69 74 6c 65 3e 3c 2f 68  ented</title></h
8740: 65 61 64 3e 5c 6e 22 0a 20 20 20 20 20 20 22 3c  ead>\n".      "<
8750: 62 6f 64 79 3e 3c 68 31 3e 4d 65 74 68 6f 64 20  body><h1>Method 
8760: 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 3c  not implemented<
8770: 2f 68 31 3e 5c 6e 22 0a 20 20 20 20 20 20 22 54  /h1>\n".      "T
8780: 68 65 20 25 73 20 6d 65 74 68 6f 64 20 69 73 20  he %s method is 
8790: 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  not implemented 
87a0: 6f 6e 20 74 68 69 73 20 73 65 72 76 65 72 2e 5c  on this server.\
87b0: 6e 22 20 0a 20 20 20 20 20 20 22 3c 2f 62 6f 64  n" .      "</bod
87c0: 79 3e 5c 6e 22 2c 0a 20 20 20 20 20 20 7a 4d 65  y>\n",.      zMe
87d0: 74 68 6f 64 29 3b 0a 20 20 20 20 4d 61 6b 65 4c  thod);.    MakeL
87e0: 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20 20 20 20  ogEntry(0);.    
87f0: 65 78 69 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20  exit(0);.  }..  
8800: 2f 2a 20 47 65 74 20 61 6c 6c 20 74 68 65 20 6f  /* Get all the o
8810: 70 74 69 6f 6e 61 6c 20 66 69 65 6c 64 73 20 74  ptional fields t
8820: 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 65 20 66  hat follow the f
8830: 69 72 73 74 20 6c 69 6e 65 2e 0a 20 20 2a 2f 0a  irst line..  */.
8840: 20 20 7a 43 6f 6f 6b 69 65 20 3d 20 30 3b 0a 20    zCookie = 0;. 
8850: 20 7a 41 75 74 68 54 79 70 65 20 3d 20 30 3b 0a   zAuthType = 0;.
8860: 20 20 7a 52 65 6d 6f 74 65 55 73 65 72 20 3d 20    zRemoteUser = 
8870: 30 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74  0;.  while( fget
8880: 73 28 7a 4c 69 6e 65 2c 73 69 7a 65 6f 66 28 7a  s(zLine,sizeof(z
8890: 4c 69 6e 65 29 2c 73 74 64 69 6e 29 20 29 7b 0a  Line),stdin) ){.
88a0: 20 20 20 20 63 68 61 72 20 2a 7a 46 69 65 6c 64      char *zField
88b0: 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  Name;.    char *
88c0: 7a 56 61 6c 3b 0a 0a 20 20 20 20 6e 49 6e 20 2b  zVal;..    nIn +
88d0: 3d 20 73 74 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b  = strlen(zLine);
88e0: 0a 20 20 20 20 7a 46 69 65 6c 64 4e 61 6d 65 20  .    zFieldName 
88f0: 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e  = GetFirstElemen
8900: 74 28 7a 4c 69 6e 65 2c 26 7a 56 61 6c 29 3b 0a  t(zLine,&zVal);.
8910: 20 20 20 20 69 66 28 20 7a 46 69 65 6c 64 4e 61      if( zFieldNa
8920: 6d 65 3d 3d 30 20 7c 7c 20 2a 7a 46 69 65 6c 64  me==0 || *zField
8930: 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Name==0 ) break;
8940: 0a 20 20 20 20 52 65 6d 6f 76 65 4e 65 77 6c 69  .    RemoveNewli
8950: 6e 65 28 7a 56 61 6c 29 3b 0a 20 20 20 20 69 66  ne(zVal);.    if
8960: 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69  ( strcasecmp(zFi
8970: 65 6c 64 4e 61 6d 65 2c 22 55 73 65 72 2d 41 67  eldName,"User-Ag
8980: 65 6e 74 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ent:")==0 ){.   
8990: 20 20 20 7a 41 67 65 6e 74 20 3d 20 53 74 72 44     zAgent = StrD
89a0: 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20  up(zVal);.      
89b0: 46 69 78 75 70 55 73 65 72 41 67 65 6e 74 28 29  FixupUserAgent()
89c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
89d0: 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c  strcasecmp(zFiel
89e0: 64 4e 61 6d 65 2c 22 41 63 63 65 70 74 3a 22 29  dName,"Accept:")
89f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 41 63  ==0 ){.      zAc
8a00: 63 65 70 74 20 3d 20 53 74 72 44 75 70 28 7a 56  cept = StrDup(zV
8a10: 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  al);.    }else i
8a20: 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46  f( strcasecmp(zF
8a30: 69 65 6c 64 4e 61 6d 65 2c 22 43 6f 6e 74 65 6e  ieldName,"Conten
8a40: 74 2d 6c 65 6e 67 74 68 3a 22 29 3d 3d 30 20 29  t-length:")==0 )
8a50: 7b 0a 20 20 20 20 20 20 7a 43 6f 6e 74 65 6e 74  {.      zContent
8a60: 4c 65 6e 67 74 68 20 3d 20 53 74 72 44 75 70 28  Length = StrDup(
8a70: 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  zVal);.    }else
8a80: 20 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28   if( strcasecmp(
8a90: 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 43 6f 6e 74  zFieldName,"Cont
8aa0: 65 6e 74 2d 74 79 70 65 3a 22 29 3d 3d 30 20 29  ent-type:")==0 )
8ab0: 7b 0a 20 20 20 20 20 20 7a 43 6f 6e 74 65 6e 74  {.      zContent
8ac0: 54 79 70 65 20 3d 20 53 74 72 44 75 70 28 7a 56  Type = StrDup(zV
8ad0: 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  al);.    }else i
8ae0: 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46  f( strcasecmp(zF
8af0: 69 65 6c 64 4e 61 6d 65 2c 22 52 65 66 65 72 65  ieldName,"Refere
8b00: 72 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  r:")==0 ){.     
8b10: 20 7a 52 65 66 65 72 65 72 20 3d 20 53 74 72 44   zReferer = StrD
8b20: 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65  up(zVal);.    }e
8b30: 6c 73 65 20 69 66 28 20 73 74 72 63 61 73 65 63  lse if( strcasec
8b40: 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 43  mp(zFieldName,"C
8b50: 6f 6f 6b 69 65 3a 22 29 3d 3d 30 20 29 7b 0a 20  ookie:")==0 ){. 
8b60: 20 20 20 20 20 7a 43 6f 6f 6b 69 65 20 3d 20 53       zCookie = S
8b70: 74 72 41 70 70 65 6e 64 28 7a 43 6f 6f 6b 69 65  trAppend(zCookie
8b80: 2c 22 3b 20 22 2c 7a 56 61 6c 29 3b 0a 20 20 20  ,"; ",zVal);.   
8b90: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 61   }else if( strca
8ba0: 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65  secmp(zFieldName
8bb0: 2c 22 43 6f 6e 6e 65 63 74 69 6f 6e 3a 22 29 3d  ,"Connection:")=
8bc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
8bd0: 73 74 72 63 61 73 65 63 6d 70 28 7a 56 61 6c 2c  strcasecmp(zVal,
8be0: 22 63 6c 6f 73 65 22 29 3d 3d 30 20 29 7b 0a 20  "close")==0 ){. 
8bf0: 20 20 20 20 20 20 20 63 6c 6f 73 65 43 6f 6e 6e         closeConn
8c00: 65 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 20 20  ection = 1;.    
8c10: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 66 6f 72    }else if( !for
8c20: 63 65 43 6c 6f 73 65 20 26 26 20 73 74 72 63 61  ceClose && strca
8c30: 73 65 63 6d 70 28 7a 56 61 6c 2c 20 22 6b 65 65  secmp(zVal, "kee
8c40: 70 2d 61 6c 69 76 65 22 29 3d 3d 30 20 29 7b 0a  p-alive")==0 ){.
8c50: 20 20 20 20 20 20 20 20 63 6c 6f 73 65 43 6f 6e          closeCon
8c60: 6e 65 63 74 69 6f 6e 20 3d 20 30 3b 0a 20 20 20  nection = 0;.   
8c70: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
8c80: 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46  f( strcasecmp(zF
8c90: 69 65 6c 64 4e 61 6d 65 2c 22 48 6f 73 74 3a 22  ieldName,"Host:"
8ca0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 48  )==0 ){.      zH
8cb0: 74 74 70 48 6f 73 74 20 3d 20 53 74 72 44 75 70  ttpHost = StrDup
8cc0: 28 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 7a 53  (zVal);.      zS
8cd0: 65 72 76 65 72 50 6f 72 74 20 3d 20 7a 53 65 72  erverPort = zSer
8ce0: 76 65 72 4e 61 6d 65 20 3d 20 53 74 72 44 75 70  verName = StrDup
8cf0: 28 7a 48 74 74 70 48 6f 73 74 29 3b 0a 20 20 20  (zHttpHost);.   
8d00: 20 20 20 77 68 69 6c 65 28 20 7a 53 65 72 76 65     while( zServe
8d10: 72 50 6f 72 74 20 26 26 20 2a 7a 53 65 72 76 65  rPort && *zServe
8d20: 72 50 6f 72 74 20 26 26 20 2a 7a 53 65 72 76 65  rPort && *zServe
8d30: 72 50 6f 72 74 21 3d 27 3a 27 20 29 7b 0a 20 20  rPort!=':' ){.  
8d40: 20 20 20 20 20 20 7a 53 65 72 76 65 72 50 6f 72        zServerPor
8d50: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
8d60: 20 20 20 69 66 28 20 7a 53 65 72 76 65 72 50 6f     if( zServerPo
8d70: 72 74 20 26 26 20 2a 7a 53 65 72 76 65 72 50 6f  rt && *zServerPo
8d80: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 7a  rt ){.        *z
8d90: 53 65 72 76 65 72 50 6f 72 74 20 3d 20 30 3b 0a  ServerPort = 0;.
8da0: 20 20 20 20 20 20 20 20 7a 53 65 72 76 65 72 50          zServerP
8db0: 6f 72 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ort++;.      }. 
8dc0: 20 20 20 20 20 69 66 28 20 7a 52 65 61 6c 50 6f       if( zRealPo
8dd0: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53  rt ){.        zS
8de0: 65 72 76 65 72 50 6f 72 74 20 3d 20 53 74 72 44  erverPort = StrD
8df0: 75 70 28 7a 52 65 61 6c 50 6f 72 74 29 3b 0a 20  up(zRealPort);. 
8e00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
8e10: 20 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28   if( strcasecmp(
8e20: 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 41 75 74 68  zFieldName,"Auth
8e30: 6f 72 69 7a 61 74 69 6f 6e 3a 22 29 3d 3d 30 20  orization:")==0 
8e40: 29 7b 0a 20 20 20 20 20 20 7a 41 75 74 68 54 79  ){.      zAuthTy
8e50: 70 65 20 3d 20 47 65 74 46 69 72 73 74 45 6c 65  pe = GetFirstEle
8e60: 6d 65 6e 74 28 53 74 72 44 75 70 28 7a 56 61 6c  ment(StrDup(zVal
8e70: 29 2c 20 26 7a 41 75 74 68 41 72 67 29 3b 0a 20  ), &zAuthArg);. 
8e80: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
8e90: 61 6b 65 20 61 6e 20 65 78 74 72 61 20 65 66 66  ake an extra eff
8ea0: 6f 72 74 20 74 6f 20 67 65 74 20 61 20 76 61 6c  ort to get a val
8eb0: 69 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20 61  id server name a
8ec0: 6e 64 20 70 6f 72 74 20 6e 75 6d 62 65 72 2e 0a  nd port number..
8ed0: 20 20 2a 2a 20 4f 6e 6c 79 20 4e 65 74 73 63 61    ** Only Netsca
8ee0: 70 65 20 70 72 6f 76 69 64 65 73 20 74 68 69 73  pe provides this
8ef0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49   information.  I
8f00: 66 20 74 68 65 20 62 72 6f 77 73 65 72 20 69 73  f the browser is
8f10: 0a 20 20 2a 2a 20 49 6e 74 65 72 6e 65 74 20 45  .  ** Internet E
8f20: 78 70 6c 6f 72 65 72 2c 20 74 68 65 6e 20 77 65  xplorer, then we
8f30: 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20 6f 75   have to find ou
8f40: 74 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  t the informatio
8f50: 6e 20 66 6f 72 0a 20 20 2a 2a 20 6f 75 72 73 65  n for.  ** ourse
8f60: 6c 76 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lves..  */.  if(
8f70: 20 7a 53 65 72 76 65 72 4e 61 6d 65 3d 3d 30 20   zServerName==0 
8f80: 29 7b 0a 20 20 20 20 7a 53 65 72 76 65 72 4e 61  ){.    zServerNa
8f90: 6d 65 20 3d 20 53 61 66 65 4d 61 6c 6c 6f 63 28  me = SafeMalloc(
8fa0: 20 31 30 30 20 29 3b 0a 20 20 20 20 67 65 74 68   100 );.    geth
8fb0: 6f 73 74 6e 61 6d 65 28 7a 53 65 72 76 65 72 4e  ostname(zServerN
8fc0: 61 6d 65 2c 31 30 30 29 3b 0a 20 20 7d 0a 20 20  ame,100);.  }.  
8fd0: 69 66 28 20 7a 53 65 72 76 65 72 50 6f 72 74 3d  if( zServerPort=
8fe0: 3d 30 20 7c 7c 20 2a 7a 53 65 72 76 65 72 50 6f  =0 || *zServerPo
8ff0: 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53 65  rt==0 ){.    zSe
9000: 72 76 65 72 50 6f 72 74 20 3d 20 44 45 46 41 55  rverPort = DEFAU
9010: 4c 54 5f 50 4f 52 54 3b 0a 20 20 7d 0a 0a 20 20  LT_PORT;.  }..  
9020: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 71 75  /* Remove the qu
9030: 65 72 79 20 73 74 72 69 6e 67 20 66 72 6f 6d 20  ery string from 
9040: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72  the end of the r
9050: 65 71 75 65 73 74 65 64 20 66 69 6c 65 2e 0a 20  equested file.. 
9060: 20 2a 2f 0a 20 20 66 6f 72 28 7a 3d 7a 53 63 72   */.  for(z=zScr
9070: 69 70 74 3b 20 2a 7a 20 26 26 20 2a 7a 21 3d 27  ipt; *z && *z!='
9080: 3f 27 3b 20 7a 2b 2b 29 7b 7d 0a 20 20 69 66 28  ?'; z++){}.  if(
9090: 20 2a 7a 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20   *z=='?' ){.    
90a0: 7a 51 75 65 72 79 53 75 66 66 69 78 20 3d 20 53  zQuerySuffix = S
90b0: 74 72 44 75 70 28 7a 29 3b 0a 20 20 20 20 2a 7a  trDup(z);.    *z
90c0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
90d0: 20 20 20 7a 51 75 65 72 79 53 75 66 66 69 78 20     zQuerySuffix 
90e0: 3d 20 22 22 3b 0a 20 20 7d 0a 20 20 7a 51 75 65  = "";.  }.  zQue
90f0: 72 79 53 74 72 69 6e 67 20 3d 20 2a 7a 51 75 65  ryString = *zQue
9100: 72 79 53 75 66 66 69 78 20 3f 20 26 7a 51 75 65  rySuffix ? &zQue
9110: 72 79 53 75 66 66 69 78 5b 31 5d 20 3a 20 7a 51  rySuffix[1] : zQ
9120: 75 65 72 79 53 75 66 66 69 78 3b 0a 0a 20 20 2f  uerySuffix;..  /
9130: 2a 20 43 72 65 61 74 65 20 61 20 66 69 6c 65 20  * Create a file 
9140: 74 6f 20 68 6f 6c 64 20 74 68 65 20 50 4f 53 54  to hold the POST
9150: 20 71 75 65 72 79 20 64 61 74 61 2c 20 69 66 20   query data, if 
9160: 61 6e 79 2e 20 20 57 65 20 68 61 76 65 20 74 6f  any.  We have to
9170: 0a 20 20 2a 2a 20 64 6f 20 69 74 20 74 68 69 73  .  ** do it this
9180: 20 77 61 79 2e 20 20 57 65 20 63 61 6e 27 74 20   way.  We can't 
9190: 6a 75 73 74 20 70 61 73 73 20 74 68 65 20 66 69  just pass the fi
91a0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 64 6f  le descriptor do
91b0: 77 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 63  wn to.  ** the c
91c0: 68 69 6c 64 20 70 72 6f 63 65 73 73 20 62 65 63  hild process bec
91d0: 61 75 73 65 20 74 68 65 20 66 67 65 74 73 28 29  ause the fgets()
91e0: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 68 61   function may ha
91f0: 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ve already.  ** 
9200: 72 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  read part of the
9210: 20 50 4f 53 54 20 64 61 74 61 20 69 6e 74 6f 20   POST data into 
9220: 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 62 75 66  its internal buf
9230: 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  fer..  */.  if( 
9240: 7a 4d 65 74 68 6f 64 5b 30 5d 3d 3d 27 50 27 20  zMethod[0]=='P' 
9250: 26 26 20 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67 74  && zContentLengt
9260: 68 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  h!=0 ){.    int 
9270: 6c 65 6e 20 3d 20 61 74 6f 69 28 7a 43 6f 6e 74  len = atoi(zCont
9280: 65 6e 74 4c 65 6e 67 74 68 29 3b 0a 20 20 20 20  entLength);.    
9290: 46 49 4c 45 20 2a 6f 75 74 3b 0a 20 20 20 20 63  FILE *out;.    c
92a0: 68 61 72 20 2a 7a 42 75 66 3b 0a 20 20 20 20 69  har *zBuf;.    i
92b0: 6e 74 20 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6c  nt n;..    if( l
92c0: 65 6e 3e 4d 41 58 5f 43 4f 4e 54 45 4e 54 5f 4c  en>MAX_CONTENT_L
92d0: 45 4e 47 54 48 20 29 7b 0a 20 20 20 20 20 20 53  ENGTH ){.      S
92e0: 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 35 30  tartResponse("50
92f0: 30 20 52 65 71 75 65 73 74 20 74 6f 6f 20 6c 61  0 Request too la
9300: 72 67 65 22 29 3b 0a 20 20 20 20 20 20 6e 4f 75  rge");.      nOu
9310: 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20  t += printf(.   
9320: 20 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79       "Content-ty
9330: 70 65 3a 20 74 65 78 74 2f 68 74 6d 6c 5c 72 5c  pe: text/html\r\
9340: 6e 22 0a 20 20 20 20 20 20 20 20 22 5c 72 5c 6e  n".        "\r\n
9350: 22 0a 20 20 20 20 20 20 20 20 22 54 6f 6f 20 6d  ".        "Too m
9360: 75 63 68 20 50 4f 53 54 20 64 61 74 61 5c 6e 22  uch POST data\n"
9370: 0a 20 20 20 20 20 20 20 20 22 3c 2f 62 6f 64 79  .        "</body
9380: 3e 5c 6e 22 0a 20 20 20 20 20 20 29 3b 0a 20 20  >\n".      );.  
9390: 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79      MakeLogEntry
93a0: 28 30 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28  (0);.      exit(
93b0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 70  0);.    }.    sp
93c0: 72 69 6e 74 66 28 7a 54 6d 70 4e 61 6d 42 75 66  rintf(zTmpNamBuf
93d0: 2c 20 22 2f 74 6d 70 2f 2d 70 6f 73 74 2d 64 61  , "/tmp/-post-da
93e0: 74 61 2d 58 58 58 58 58 58 22 29 3b 0a 20 20 20  ta-XXXXXX");.   
93f0: 20 7a 54 6d 70 4e 61 6d 20 3d 20 7a 54 6d 70 4e   zTmpNam = zTmpN
9400: 61 6d 42 75 66 3b 0a 20 20 20 20 6d 6b 73 74 65  amBuf;.    mkste
9410: 6d 70 28 7a 54 6d 70 4e 61 6d 29 3b 0a 20 20 20  mp(zTmpNam);.   
9420: 20 6f 75 74 20 3d 20 66 6f 70 65 6e 28 7a 54 6d   out = fopen(zTm
9430: 70 4e 61 6d 2c 22 77 22 29 3b 0a 20 20 20 20 69  pNam,"w");.    i
9440: 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  f( out==0 ){.   
9450: 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65     StartResponse
9460: 28 22 35 30 30 20 43 61 6e 6e 6f 74 20 63 72 65  ("500 Cannot cre
9470: 61 74 65 20 2f 74 6d 70 20 66 69 6c 65 22 29 3b  ate /tmp file");
9480: 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70  .      nOut += p
9490: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22  rintf(.        "
94a0: 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65  Content-type: te
94b0: 78 74 2f 68 74 6d 6c 5c 72 5c 6e 22 0a 20 20 20  xt/html\r\n".   
94c0: 20 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20       "\r\n".    
94d0: 20 20 20 20 22 43 6f 75 6c 64 20 6e 6f 74 20 6f      "Could not o
94e0: 70 65 6e 20 5c 22 25 73 5c 22 20 66 6f 72 20 77  pen \"%s\" for w
94f0: 72 69 74 69 6e 67 5c 6e 22 0a 20 20 20 20 20 20  riting\n".      
9500: 20 20 22 3c 2f 62 6f 64 79 3e 5c 6e 22 2c 20 7a    "</body>\n", z
9510: 54 6d 70 4e 61 6d 0a 20 20 20 20 20 20 29 3b 0a  TmpNam.      );.
9520: 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74        MakeLogEnt
9530: 72 79 28 30 29 3b 0a 20 20 20 20 20 20 65 78 69  ry(0);.      exi
9540: 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t(0);.    }.    
9550: 7a 42 75 66 20 3d 20 53 61 66 65 4d 61 6c 6c 6f  zBuf = SafeMallo
9560: 63 28 20 6c 65 6e 20 29 3b 0a 20 20 20 20 69 66  c( len );.    if
9570: 28 20 75 73 65 54 69 6d 65 6f 75 74 20 29 20 61  ( useTimeout ) a
9580: 6c 61 72 6d 28 31 35 20 2b 20 6c 65 6e 2f 32 30  larm(15 + len/20
9590: 30 30 29 3b 0a 20 20 20 20 6e 20 3d 20 66 72 65  00);.    n = fre
95a0: 61 64 28 7a 42 75 66 2c 31 2c 6c 65 6e 2c 73 74  ad(zBuf,1,len,st
95b0: 64 69 6e 29 3b 0a 20 20 20 20 6e 49 6e 20 2b 3d  din);.    nIn +=
95c0: 20 6e 3b 0a 20 20 20 20 66 77 72 69 74 65 28 7a   n;.    fwrite(z
95d0: 42 75 66 2c 31 2c 6e 2c 6f 75 74 29 3b 0a 20 20  Buf,1,n,out);.  
95e0: 20 20 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20    free(zBuf);.  
95f0: 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20    fclose(out);. 
9600: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
9610: 72 65 20 74 68 65 20 72 75 6e 6e 69 6e 67 20 74  re the running t
9620: 69 6d 65 20 69 73 20 6e 6f 74 20 74 6f 6f 20 67  ime is not too g
9630: 72 65 61 74 20 2a 2f 0a 20 20 69 66 28 20 75 73  reat */.  if( us
9640: 65 54 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d  eTimeout ) alarm
9650: 28 31 30 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76  (10);..  /* Conv
9660: 65 72 74 20 61 6c 6c 20 75 6e 75 73 75 61 6c 20  ert all unusual 
9670: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
9680: 65 20 73 63 72 69 70 74 20 6e 61 6d 65 20 69 6e  e script name in
9690: 74 6f 20 22 5f 22 2e 0a 20 20 2a 2a 0a 20 20 2a  to "_"..  **.  *
96a0: 2a 20 54 68 69 73 20 69 73 20 61 20 64 65 66 65  * This is a defe
96b0: 6e 73 65 20 61 67 61 69 6e 73 74 20 76 61 72 69  nse against vari
96c0: 6f 75 73 20 61 74 74 61 63 6b 73 2c 20 58 53 53  ous attacks, XSS
96d0: 20 61 74 74 61 63 6b 73 20 69 6e 20 70 61 72 74   attacks in part
96e0: 69 63 75 6c 61 72 2e 0a 20 20 2a 2f 0a 20 20 66  icular..  */.  f
96f0: 6f 72 28 7a 3d 7a 53 63 72 69 70 74 3b 20 2a 7a  or(z=zScript; *z
9700: 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 75 6e 73 69  ; z++){.    unsi
9710: 67 6e 65 64 20 63 68 61 72 20 63 20 3d 20 2a 28  gned char c = *(
9720: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a  unsigned char*)z
9730: 3b 0a 20 20 20 20 69 66 28 20 28 63 26 30 78 38  ;.    if( (c&0x8
9740: 30 29 21 3d 30 20 7c 7c 20 21 61 6c 6c 6f 77 65  0)!=0 || !allowe
9750: 64 49 6e 4e 61 6d 65 5b 63 5d 20 29 7b 0a 20 20  dInName[c] ){.  
9760: 20 20 20 20 2a 7a 20 3d 20 27 5f 27 3b 0a 20 20      *z = '_';.  
9770: 20 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20 26      if( c=='%' &
9780: 26 20 7a 5b 31 5d 21 3d 30 20 26 26 20 7a 5b 32  & z[1]!=0 && z[2
9790: 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]!=0 ){.        
97a0: 66 6f 72 28 69 3d 33 3b 20 28 7a 5b 69 2d 32 5d  for(i=3; (z[i-2]
97b0: 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b   = z[i])!=0; i++
97c0: 29 7b 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ){}.      }.    
97d0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 27  }.  }..  /* Don'
97e0: 74 20 61 6c 6c 6f 77 20 22 2f 2e 22 20 6f 72 20  t allow "/." or 
97f0: 22 2f 2d 22 20 74 6f 20 74 6f 20 6f 63 63 75 72  "/-" to to occur
9800: 20 61 6e 79 77 68 65 72 65 20 69 6e 20 74 68 65   anywhere in the
9810: 20 65 6e 74 69 74 79 20 6e 61 6d 65 2e 0a 20 20   entity name..  
9820: 2a 2a 20 54 68 69 73 20 70 72 65 76 65 6e 74 73  ** This prevents
9830: 20 61 74 74 61 63 6b 73 20 69 6e 76 6f 6c 76 69   attacks involvi
9840: 6e 67 20 22 2e 2e 22 20 61 6e 64 20 61 6c 73 6f  ng ".." and also
9850: 20 61 6c 6c 6f 77 73 20 75 73 20 74 6f 20 63 72   allows us to cr
9860: 65 61 74 65 0a 20 20 2a 2a 20 66 69 6c 65 73 20  eate.  ** files 
9870: 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20  and directories 
9880: 77 68 6f 73 65 20 6e 61 6d 65 73 20 62 65 67 69  whose names begi
9890: 6e 20 77 69 74 68 20 22 2d 22 20 77 68 69 63 68  n with "-" which
98a0: 20 61 72 65 20 69 6e 76 69 73 69 62 6c 65 0a 20   are invisible. 
98b0: 20 2a 2a 20 74 6f 20 74 68 65 20 77 65 62 73 65   ** to the webse
98c0: 72 76 65 72 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  rver..  */.  for
98d0: 28 7a 3d 7a 53 63 72 69 70 74 3b 20 2a 7a 3b 20  (z=zScript; *z; 
98e0: 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a  z++){.    if( *z
98f0: 3d 3d 27 2f 27 20 26 26 20 28 7a 5b 31 5d 3d 3d  =='/' && (z[1]==
9900: 27 2e 27 20 7c 7c 20 7a 5b 31 5d 3d 3d 27 2d 27  '.' || z[1]=='-'
9910: 29 20 29 7b 0a 20 20 20 20 20 20 20 4e 6f 74 46  ) ){.       NotF
9920: 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  ound(__LINE__);.
9930: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
9940: 46 69 67 75 72 65 20 6f 75 74 20 77 68 61 74 20  Figure out what 
9950: 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
9960: 66 69 6c 65 73 79 73 74 65 6d 20 73 68 6f 75 6c  filesystem shoul
9970: 64 20 62 65 2e 20 20 49 66 20 74 68 65 0a 20 20  d be.  If the.  
9980: 2a 2a 20 48 54 54 50 5f 48 4f 53 54 20 70 61 72  ** HTTP_HOST par
9990: 61 6d 65 74 65 72 20 65 78 69 73 74 73 20 28 73  ameter exists (s
99a0: 74 6f 72 65 64 20 69 6e 20 7a 48 74 74 70 48 6f  tored in zHttpHo
99b0: 73 74 29 20 74 68 65 6e 20 72 65 6d 6f 76 65 20  st) then remove 
99c0: 74 68 65 0a 20 20 2a 2a 20 70 6f 72 74 20 6e 75  the.  ** port nu
99d0: 6d 62 65 72 20 66 72 6f 6d 20 74 68 65 20 65 6e  mber from the en
99e0: 64 20 28 69 66 20 61 6e 79 29 2c 20 63 6f 6e 76  d (if any), conv
99f0: 65 72 74 20 61 6c 6c 20 63 68 61 72 61 63 74 65  ert all characte
9a00: 72 73 20 74 6f 20 6c 6f 77 65 72 0a 20 20 2a 2a  rs to lower.  **
9a10: 20 63 61 73 65 2c 20 61 6e 64 20 63 6f 6e 76 65   case, and conve
9a20: 72 74 20 61 6c 6c 20 22 2e 22 20 74 6f 20 22 5f  rt all "." to "_
9a30: 22 2e 20 20 54 68 65 6e 20 74 72 79 20 74 6f 20  ".  Then try to 
9a40: 66 69 6e 64 20 61 20 64 69 72 65 63 74 6f 72 79  find a directory
9a50: 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 61 74 20  .  ** with that 
9a60: 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 65 78 74  name and the ext
9a70: 65 6e 73 69 6f 6e 20 2e 77 65 62 73 69 74 65 2e  ension .website.
9a80: 20 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20    If not found, 
9a90: 6c 6f 6f 6b 0a 20 20 2a 2a 20 66 6f 72 20 22 64  look.  ** for "d
9aa0: 65 66 61 75 6c 74 2e 77 65 62 73 69 74 65 22 2e  efault.website".
9ab0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 53 63 72  .  */.  if( zScr
9ac0: 69 70 74 5b 30 5d 21 3d 27 2f 27 20 29 20 4e 6f  ipt[0]!='/' ) No
9ad0: 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29  tFound(__LINE__)
9ae0: 3b 0a 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a  ;.  if( strlen(z
9af0: 52 6f 6f 74 29 2b 34 30 20 3e 3d 20 73 69 7a 65  Root)+40 >= size
9b00: 6f 66 28 7a 4c 69 6e 65 29 20 29 20 4e 6f 74 46  of(zLine) ) NotF
9b10: 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  ound(__LINE__);.
9b20: 20 20 69 66 28 20 7a 48 74 74 70 48 6f 73 74 3d    if( zHttpHost=
9b30: 3d 30 20 7c 7c 20 7a 48 74 74 70 48 6f 73 74 5b  =0 || zHttpHost[
9b40: 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 4e 6f 74  0]==0 ){.    Not
9b50: 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b  Found(__LINE__);
9b60: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
9b70: 6c 65 6e 28 7a 48 74 74 70 48 6f 73 74 29 2b 73  len(zHttpHost)+s
9b80: 74 72 6c 65 6e 28 7a 52 6f 6f 74 29 2b 31 30 20  trlen(zRoot)+10 
9b90: 3e 3d 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29  >= sizeof(zLine)
9ba0: 20 29 7b 0a 20 20 20 20 4e 6f 74 46 6f 75 6e 64   ){.    NotFound
9bb0: 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65  (__LINE__);.  }e
9bc0: 6c 73 65 7b 0a 20 20 20 20 73 70 72 69 6e 74 66  lse{.    sprintf
9bd0: 28 7a 4c 69 6e 65 2c 20 22 25 73 2f 25 73 22 2c  (zLine, "%s/%s",
9be0: 20 7a 52 6f 6f 74 2c 20 7a 48 74 74 70 48 6f 73   zRoot, zHttpHos
9bf0: 74 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 73 74  t);.    for(i=st
9c00: 72 6c 65 6e 28 7a 52 6f 6f 74 29 2b 31 3b 20 7a  rlen(zRoot)+1; z
9c10: 4c 69 6e 65 5b 69 5d 20 26 26 20 7a 4c 69 6e 65  Line[i] && zLine
9c20: 5b 69 5d 21 3d 27 3a 27 3b 20 69 2b 2b 29 7b 0a  [i]!=':'; i++){.
9c30: 20 20 20 20 20 20 69 6e 74 20 63 20 3d 20 7a 4c        int c = zL
9c40: 69 6e 65 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  ine[i];.      if
9c50: 28 20 21 69 73 61 6c 6e 75 6d 28 63 29 20 29 7b  ( !isalnum(c) ){
9c60: 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 69  .        zLine[i
9c70: 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 7d  ] = '_';.      }
9c80: 65 6c 73 65 20 69 66 28 20 69 73 75 70 70 65 72  else if( isupper
9c90: 28 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  (c) ){.        z
9ca0: 4c 69 6e 65 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65  Line[i] = tolowe
9cb0: 72 28 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  r(c);.      }.  
9cc0: 20 20 7d 0a 20 20 20 20 73 74 72 63 70 79 28 26    }.    strcpy(&
9cd0: 7a 4c 69 6e 65 5b 69 5d 2c 20 22 2e 77 65 62 73  zLine[i], ".webs
9ce0: 69 74 65 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ite");.  }.  if(
9cf0: 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61   stat(zLine,&sta
9d00: 74 62 75 66 29 20 7c 7c 20 21 53 5f 49 53 44 49  tbuf) || !S_ISDI
9d10: 52 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64  R(statbuf.st_mod
9d20: 65 29 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74  e) ){.    sprint
9d30: 66 28 7a 4c 69 6e 65 2c 20 22 25 73 2f 64 65 66  f(zLine, "%s/def
9d40: 61 75 6c 74 2e 77 65 62 73 69 74 65 22 2c 20 7a  ault.website", z
9d50: 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 73  Root);.    if( s
9d60: 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62  tat(zLine,&statb
9d70: 75 66 29 20 26 26 20 21 53 5f 49 53 44 49 52 28  uf) && !S_ISDIR(
9d80: 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29  statbuf.st_mode)
9d90: 20 29 7b 0a 20 20 20 20 20 20 4e 6f 74 46 6f 75   ){.      NotFou
9da0: 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  nd(__LINE__);.  
9db0: 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 7a 48 6f    }.  }.  .  zHo
9dc0: 6d 65 20 3d 20 53 74 72 44 75 70 28 7a 4c 69 6e  me = StrDup(zLin
9dd0: 65 29 3b 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65  e);..  /* Change
9de0: 20 64 69 72 65 63 74 6f 72 69 65 73 20 74 6f 20   directories to 
9df0: 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
9e00: 48 54 54 50 20 66 69 6c 65 73 79 73 74 65 6d 0a  HTTP filesystem.
9e10: 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 64 69 72    */.  if( chdir
9e20: 28 7a 48 6f 6d 65 29 21 3d 30 20 29 7b 0a 20 20  (zHome)!=0 ){.  
9e30: 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30    char zBuf[1000
9e40: 5d 3b 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69  ];.    Malfuncti
9e50: 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 63 61  on(__LINE__, "ca
9e60: 6e 6e 6f 74 20 63 68 64 69 72 20 74 6f 20 5b 25  nnot chdir to [%
9e70: 73 5d 20 66 72 6f 6d 20 5b 25 73 5d 22 2c 0a 20  s] from [%s]",. 
9e80: 20 20 20 20 20 20 20 20 7a 48 6f 6d 65 2c 20 67          zHome, g
9e90: 65 74 63 77 64 28 7a 42 75 66 2c 39 39 39 29 29  etcwd(zBuf,999))
9ea0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
9eb0: 74 65 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74  te the file in t
9ec0: 68 65 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20  he filesystem.  
9ed0: 57 65 20 6d 69 67 68 74 20 68 61 76 65 20 74 6f  We might have to
9ee0: 20 61 70 70 65 6e 64 0a 20 20 2a 2a 20 74 68 65   append.  ** the
9ef0: 20 6e 61 6d 65 20 22 69 6e 64 65 78 2e 68 74 6d   name "index.htm
9f00: 6c 22 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66  l" in order to f
9f10: 69 6e 64 20 69 74 2e 20 20 41 6e 79 20 65 78 63  ind it.  Any exc
9f20: 65 73 73 20 70 61 74 68 0a 20 20 2a 2a 20 69 6e  ess path.  ** in
9f30: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 70 75 74  formation is put
9f40: 20 69 6e 74 6f 20 74 68 65 20 7a 50 61 74 68 49   into the zPathI
9f50: 6e 66 6f 20 76 61 72 69 61 62 6c 65 2e 0a 20 20  nfo variable..  
9f60: 2a 2f 0a 20 20 7a 4c 69 6e 65 5b 30 5d 20 3d 20  */.  zLine[0] = 
9f70: 27 2e 27 3b 0a 20 20 69 20 3d 20 30 3b 0a 20 20  '.';.  i = 0;.  
9f80: 77 68 69 6c 65 28 20 7a 53 63 72 69 70 74 5b 69  while( zScript[i
9f90: 5d 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  ] ){.    while( 
9fa0: 7a 53 63 72 69 70 74 5b 69 5d 20 26 26 20 7a 53  zScript[i] && zS
9fb0: 63 72 69 70 74 5b 69 5d 21 3d 27 2f 27 20 29 7b  cript[i]!='/' ){
9fc0: 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 69 2b 31  .      zLine[i+1
9fd0: 5d 20 3d 20 7a 53 63 72 69 70 74 5b 69 5d 3b 0a  ] = zScript[i];.
9fe0: 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d        i++;.    }
9ff0: 0a 20 20 20 20 7a 4c 69 6e 65 5b 69 2b 31 5d 20  .    zLine[i+1] 
a000: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 74 61  = 0;.    if( sta
a010: 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75 66  t(zLine,&statbuf
a020: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 4e 6f  )!=0 ){.      No
a030: 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29  tFound(__LINE__)
a040: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
a050: 53 5f 49 53 52 45 47 28 73 74 61 74 62 75 66 2e  S_ISREG(statbuf.
a060: 73 74 5f 6d 6f 64 65 29 20 29 7b 0a 20 20 20 20  st_mode) ){.    
a070: 20 20 69 66 28 20 61 63 63 65 73 73 28 7a 4c 69    if( access(zLi
a080: 6e 65 2c 52 5f 4f 4b 29 20 29 7b 0a 20 20 20 20  ne,R_OK) ){.    
a090: 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c      NotFound(__L
a0a0: 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 7d 0a  INE__);.      }.
a0b0: 20 20 20 20 20 20 7a 52 65 61 6c 53 63 72 69 70        zRealScrip
a0c0: 74 20 3d 20 53 74 72 44 75 70 28 26 7a 4c 69 6e  t = StrDup(&zLin
a0d0: 65 5b 31 5d 29 3b 0a 20 20 20 20 20 20 62 72 65  e[1]);.      bre
a0e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
a0f0: 28 20 7a 53 63 72 69 70 74 5b 69 5d 3d 3d 30 20  ( zScript[i]==0 
a100: 7c 7c 20 7a 53 63 72 69 70 74 5b 69 2b 31 5d 3d  || zScript[i+1]=
a110: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 63  =0 ){.      strc
a120: 70 79 28 26 7a 4c 69 6e 65 5b 69 2b 31 5d 2c 22  py(&zLine[i+1],"
a130: 2f 69 6e 64 65 78 2e 68 74 6d 6c 22 29 3b 0a 20  /index.html");. 
a140: 20 20 20 20 20 69 66 28 20 73 74 61 74 28 7a 4c       if( stat(zL
a150: 69 6e 65 2c 26 73 74 61 74 62 75 66 29 21 3d 30  ine,&statbuf)!=0
a160: 20 7c 7c 20 21 53 5f 49 53 52 45 47 28 73 74 61   || !S_ISREG(sta
a170: 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 0a 20  tbuf.st_mode) . 
a180: 20 20 20 20 20 7c 7c 20 61 63 63 65 73 73 28 7a       || access(z
a190: 4c 69 6e 65 2c 52 5f 4f 4b 29 20 29 7b 0a 20 20  Line,R_OK) ){.  
a1a0: 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a 4c        strcpy(&zL
a1b0: 69 6e 65 5b 69 2b 31 5d 2c 22 2f 69 6e 64 65 78  ine[i+1],"/index
a1c0: 2e 63 67 69 22 29 3b 0a 20 20 20 20 20 20 20 20  .cgi");.        
a1d0: 69 66 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26  if( stat(zLine,&
a1e0: 73 74 61 74 62 75 66 29 21 3d 30 20 7c 7c 20 21  statbuf)!=0 || !
a1f0: 53 5f 49 53 52 45 47 28 73 74 61 74 62 75 66 2e  S_ISREG(statbuf.
a200: 73 74 5f 6d 6f 64 65 29 20 0a 20 20 20 20 20 20  st_mode) .      
a210: 20 20 7c 7c 20 61 63 63 65 73 73 28 7a 4c 69 6e    || access(zLin
a220: 65 2c 52 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20  e,R_OK) ){.     
a230: 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f       NotFound(__
a240: 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20  LINE__);.       
a250: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
a260: 20 7a 52 65 61 6c 53 63 72 69 70 74 20 3d 20 53   zRealScript = S
a270: 74 72 44 75 70 28 26 7a 4c 69 6e 65 5b 31 5d 29  trDup(&zLine[1])
a280: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 53 63 72  ;.      if( zScr
a290: 69 70 74 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20  ipt[i]==0 ){.   
a2a0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72       /* If the r
a2b0: 65 71 75 65 73 74 65 64 20 55 52 4c 20 64 6f 65  equested URL doe
a2c0: 73 20 6e 6f 74 20 65 6e 64 20 77 69 74 68 20 22  s not end with "
a2d0: 2f 22 20 62 75 74 20 77 65 20 68 61 64 20 74 6f  /" but we had to
a2e0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 65  .        ** appe
a2f0: 6e 64 20 22 69 6e 64 65 78 2e 68 74 6d 6c 22 2c  nd "index.html",
a300: 20 74 68 65 6e 20 61 20 72 65 64 69 72 65 63 74   then a redirect
a310: 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20   is necessary.  
a320: 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 20 20  Otherwise.      
a330: 20 20 2a 2a 20 6e 6f 6e 65 20 6f 66 20 74 68 65    ** none of the
a340: 20 72 65 6c 61 74 69 76 65 20 55 52 4c 73 20 69   relative URLs i
a350: 6e 20 74 68 65 20 64 65 6c 69 76 65 72 65 64 20  n the delivered 
a360: 64 6f 63 75 6d 65 6e 74 20 77 69 6c 6c 20 62 65  document will be
a370: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  .        ** corr
a380: 65 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ect. */.        
a390: 52 65 64 69 72 65 63 74 28 7a 52 65 61 6c 53 63  Redirect(zRealSc
a3a0: 72 69 70 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  ript, 1);.      
a3b0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
a3c0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
a3d0: 20 20 20 7d 0a 20 20 20 20 7a 4c 69 6e 65 5b 69     }.    zLine[i
a3e0: 2b 31 5d 20 3d 20 7a 53 63 72 69 70 74 5b 69 5d  +1] = zScript[i]
a3f0: 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20  ;.    i++;.  }. 
a400: 20 7a 46 69 6c 65 20 3d 20 53 74 72 44 75 70 28   zFile = StrDup(
a410: 7a 4c 69 6e 65 29 3b 0a 20 20 7a 50 61 74 68 49  zLine);.  zPathI
a420: 6e 66 6f 20 3d 20 53 74 72 44 75 70 28 26 7a 53  nfo = StrDup(&zS
a430: 63 72 69 70 74 5b 69 5d 29 3b 0a 20 20 6c 65 6e  cript[i]);.  len
a440: 46 69 6c 65 20 3d 20 73 74 72 6c 65 6e 28 7a 46  File = strlen(zF
a450: 69 6c 65 29 3b 0a 20 20 7a 44 69 72 20 3d 20 53  ile);.  zDir = S
a460: 74 72 44 75 70 28 7a 46 69 6c 65 29 3b 0a 20 20  trDup(zFile);.  
a470: 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 7a 44 69  for(i=strlen(zDi
a480: 72 29 2d 31 3b 20 69 3e 30 20 26 26 20 7a 44 69  r)-1; i>0 && zDi
a490: 72 5b 69 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b  r[i]!='/'; i--){
a4a0: 7d 3b 0a 20 20 69 66 28 20 69 3d 3d 30 20 29 7b  };.  if( i==0 ){
a4b0: 0a 20 20 20 20 20 73 74 72 63 70 79 28 7a 44 69  .     strcpy(zDi
a4c0: 72 2c 22 2f 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  r,"/");.  }else{
a4d0: 0a 20 20 20 20 20 7a 44 69 72 5b 69 5d 20 3d 20  .     zDir[i] = 
a4e0: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  0;.  }..  /* Che
a4f0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
a500: 72 65 20 69 73 20 61 6e 20 61 75 74 68 6f 72 69  re is an authori
a510: 7a 61 74 69 6f 6e 20 66 69 6c 65 2e 20 20 49 66  zation file.  If
a520: 20 74 68 65 72 65 20 69 73 2c 0a 20 20 2a 2a 20   there is,.  ** 
a530: 70 72 6f 63 65 73 73 20 69 74 2e 0a 20 20 2a 2f  process it..  */
a540: 0a 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65  .  sprintf(zLine
a550: 2c 20 22 25 73 2f 2d 61 75 74 68 22 2c 20 7a 44  , "%s/-auth", zD
a560: 69 72 29 3b 0a 20 20 69 66 28 20 61 63 63 65 73  ir);.  if( acces
a570: 73 28 7a 4c 69 6e 65 2c 52 5f 4f 4b 29 3d 3d 30  s(zLine,R_OK)==0
a580: 20 26 26 20 21 43 68 65 63 6b 42 61 73 69 63 41   && !CheckBasicA
a590: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 28 7a 4c 69  uthorization(zLi
a5a0: 6e 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ne) ) return;.. 
a5b0: 20 2f 2a 20 54 61 6b 65 20 61 70 70 72 6f 70 72   /* Take appropr
a5c0: 69 61 74 65 20 61 63 74 69 6f 6e 0a 20 20 2a 2f  iate action.  */
a5d0: 0a 20 20 69 66 28 20 28 73 74 61 74 62 75 66 2e  .  if( (statbuf.
a5e0: 73 74 5f 6d 6f 64 65 20 26 20 30 31 30 30 29 3d  st_mode & 0100)=
a5f0: 3d 30 31 30 30 20 26 26 20 61 63 63 65 73 73 28  =0100 && access(
a600: 7a 46 69 6c 65 2c 58 5f 4f 4b 29 3d 3d 30 20 29  zFile,X_OK)==0 )
a610: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
a620: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 73 20 73  The followings s
a630: 74 61 74 69 63 20 76 61 72 69 61 62 6c 65 73 20  tatic variables 
a640: 61 72 65 20 75 73 65 64 20 74 6f 20 73 65 74 75  are used to setu
a650: 70 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e  p the environmen
a660: 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65  t.    ** for the
a670: 20 43 47 49 20 73 63 72 69 70 74 0a 20 20 20 20   CGI script.    
a680: 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 68  */.    static ch
a690: 61 72 20 2a 64 65 66 61 75 6c 74 5f 70 61 74 68  ar *default_path
a6a0: 20 3d 20 22 2f 62 69 6e 3a 2f 75 73 72 2f 62 69   = "/bin:/usr/bi
a6b0: 6e 22 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63  n";.    static c
a6c0: 68 61 72 20 2a 67 61 74 65 77 61 79 5f 69 6e 74  har *gateway_int
a6d0: 65 72 66 61 63 65 20 3d 20 22 43 47 49 2f 31 2e  erface = "CGI/1.
a6e0: 30 22 3b 0a 20 20 20 20 73 74 61 74 69 63 20 73  0";.    static s
a6f0: 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20 63 68  truct {.      ch
a700: 61 72 20 2a 7a 45 6e 76 4e 61 6d 65 3b 0a 20 20  ar *zEnvName;.  
a710: 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 45 6e 76      char **pzEnv
a720: 56 61 6c 75 65 3b 0a 20 20 20 20 7d 20 63 67 69  Value;.    } cgi
a730: 65 6e 76 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  env[] = {.      
a740: 7b 20 22 41 55 54 48 5f 54 59 50 45 22 2c 20 20  { "AUTH_TYPE",  
a750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a760: 20 26 7a 41 75 74 68 54 79 70 65 20 7d 2c 0a 20   &zAuthType },. 
a770: 20 20 20 20 20 7b 20 22 41 55 54 48 5f 43 4f 4e       { "AUTH_CON
a780: 54 45 4e 54 22 2c 20 20 20 20 20 20 20 20 20 20  TENT",          
a790: 20 20 20 20 20 20 26 7a 41 75 74 68 41 72 67 20        &zAuthArg 
a7a0: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 43 4f 4e 54  },.      { "CONT
a7b0: 45 4e 54 5f 4c 45 4e 47 54 48 22 2c 20 20 20 20  ENT_LENGTH",    
a7c0: 20 20 20 20 20 20 20 20 20 20 26 7a 43 6f 6e 74            &zCont
a7d0: 65 6e 74 4c 65 6e 67 74 68 20 7d 2c 0a 20 20 20  entLength },.   
a7e0: 20 20 20 7b 20 22 43 4f 4e 54 45 4e 54 5f 54 59     { "CONTENT_TY
a7f0: 50 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  PE",            
a800: 20 20 20 20 26 7a 43 6f 6e 74 65 6e 74 54 79 70      &zContentTyp
a810: 65 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 44 4f  e },.      { "DO
a820: 43 55 4d 45 4e 54 5f 52 4f 4f 54 22 2c 20 20 20  CUMENT_ROOT",   
a830: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 48 6f              &zHo
a840: 6d 65 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 47  me },.      { "G
a850: 41 54 45 57 41 59 5f 49 4e 54 45 52 46 41 43 45  ATEWAY_INTERFACE
a860: 22 2c 20 20 20 20 20 20 20 20 20 20 20 26 67 61  ",           &ga
a870: 74 65 77 61 79 5f 69 6e 74 65 72 66 61 63 65 20  teway_interface 
a880: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 48 54 54 50  },.      { "HTTP
a890: 5f 41 43 43 45 50 54 22 2c 20 20 20 20 20 20 20  _ACCEPT",       
a8a0: 20 20 20 20 20 20 20 20 20 20 26 7a 41 63 63 65            &zAcce
a8b0: 70 74 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 48  pt },.      { "H
a8c0: 54 54 50 5f 43 4f 4f 4b 49 45 22 2c 20 20 20 20  TTP_COOKIE",    
a8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 43               &zC
a8e0: 6f 6f 6b 69 65 20 7d 2c 0a 20 20 20 20 20 20 7b  ookie },.      {
a8f0: 20 22 48 54 54 50 5f 48 4f 53 54 22 2c 20 20 20   "HTTP_HOST",   
a900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a910: 26 7a 48 74 74 70 48 6f 73 74 20 7d 2c 0a 20 20  &zHttpHost },.  
a920: 20 20 20 20 7b 20 22 48 54 54 50 5f 52 45 46 45      { "HTTP_REFE
a930: 52 45 52 22 2c 20 20 20 20 20 20 20 20 20 20 20  RER",           
a940: 20 20 20 20 20 26 7a 52 65 66 65 72 65 72 20 7d       &zReferer }
a950: 2c 0a 20 20 20 20 20 20 7b 20 22 48 54 54 50 5f  ,.      { "HTTP_
a960: 55 53 45 52 5f 41 47 45 4e 54 22 2c 20 20 20 20  USER_AGENT",    
a970: 20 20 20 20 20 20 20 20 20 26 7a 41 67 65 6e 74           &zAgent
a980: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 50 41 54   },.      { "PAT
a990: 48 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  H",             
a9a0: 20 20 20 20 20 20 20 20 20 20 20 26 64 65 66 61             &defa
a9b0: 75 6c 74 5f 70 61 74 68 20 7d 2c 0a 20 20 20 20  ult_path },.    
a9c0: 20 20 7b 20 22 50 41 54 48 5f 49 4e 46 4f 22 2c    { "PATH_INFO",
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9e0: 20 20 20 26 7a 50 61 74 68 49 6e 66 6f 20 7d 2c     &zPathInfo },
a9f0: 0a 20 20 20 20 20 20 7b 20 22 51 55 45 52 59 5f  .      { "QUERY_
aa00: 53 54 52 49 4e 47 22 2c 20 20 20 20 20 20 20 20  STRING",        
aa10: 20 20 20 20 20 20 20 20 26 7a 51 75 65 72 79 53          &zQueryS
aa20: 74 72 69 6e 67 20 7d 2c 0a 20 20 20 20 20 20 7b  tring },.      {
aa30: 20 22 52 45 4d 4f 54 45 5f 41 44 44 52 22 2c 20   "REMOTE_ADDR", 
aa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa50: 26 7a 52 65 6d 6f 74 65 41 64 64 72 20 7d 2c 0a  &zRemoteAddr },.
aa60: 20 20 20 20 20 20 7b 20 22 52 45 51 55 45 53 54        { "REQUEST
aa70: 5f 4d 45 54 48 4f 44 22 2c 20 20 20 20 20 20 20  _METHOD",       
aa80: 20 20 20 20 20 20 20 26 7a 4d 65 74 68 6f 64 20         &zMethod 
aa90: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 52 45 51 55  },.      { "REQU
aaa0: 45 53 54 5f 55 52 49 22 2c 20 20 20 20 20 20 20  EST_URI",       
aab0: 20 20 20 20 20 20 20 20 20 20 26 7a 53 63 72 69            &zScri
aac0: 70 74 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 52  pt },.      { "R
aad0: 45 4d 4f 54 45 5f 55 53 45 52 22 2c 20 20 20 20  EMOTE_USER",    
aae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 52               &zR
aaf0: 65 6d 6f 74 65 55 73 65 72 20 7d 2c 0a 20 20 20  emoteUser },.   
ab00: 20 20 20 7b 20 22 53 43 52 49 50 54 5f 44 49 52     { "SCRIPT_DIR
ab10: 45 43 54 4f 52 59 22 2c 20 20 20 20 20 20 20 20  ECTORY",        
ab20: 20 20 20 20 26 7a 44 69 72 20 7d 2c 0a 20 20 20      &zDir },.   
ab30: 20 20 20 7b 20 22 53 43 52 49 50 54 5f 46 49 4c     { "SCRIPT_FIL
ab40: 45 4e 41 4d 45 22 2c 20 20 20 20 20 20 20 20 20  ENAME",         
ab50: 20 20 20 20 26 7a 46 69 6c 65 20 7d 2c 0a 20 20      &zFile },.  
ab60: 20 20 20 20 7b 20 22 53 43 52 49 50 54 5f 4e 41      { "SCRIPT_NA
ab70: 4d 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ME",            
ab80: 20 20 20 20 20 26 7a 52 65 61 6c 53 63 72 69 70       &zRealScrip
ab90: 74 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 45  t },.      { "SE
aba0: 52 56 45 52 5f 4e 41 4d 45 22 2c 20 20 20 20 20  RVER_NAME",     
abb0: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 53 65              &zSe
abc0: 72 76 65 72 4e 61 6d 65 20 7d 2c 0a 20 20 20 20  rverName },.    
abd0: 20 20 7b 20 22 53 45 52 56 45 52 5f 50 4f 52 54    { "SERVER_PORT
abe0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
abf0: 20 20 20 26 7a 53 65 72 76 65 72 50 6f 72 74 20     &zServerPort 
ac00: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 45 52 56  },.      { "SERV
ac10: 45 52 5f 50 52 4f 54 4f 43 4f 4c 22 2c 20 20 20  ER_PROTOCOL",   
ac20: 20 20 20 20 20 20 20 20 20 20 26 7a 50 72 6f 74            &zProt
ac30: 6f 63 6f 6c 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20  ocol },.    };. 
ac40: 20 20 20 63 68 61 72 20 2a 7a 42 61 73 65 46 69     char *zBaseFi
ac50: 6c 65 6e 61 6d 65 3b 20 20 20 2f 2a 20 46 69 6c  lename;   /* Fil
ac60: 65 6e 61 6d 65 20 77 69 74 68 6f 75 74 20 64 69  ename without di
ac70: 72 65 63 74 6f 72 79 20 70 72 65 66 69 78 20 2a  rectory prefix *
ac80: 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 73  /..    /* If its
ac90: 20 65 78 65 63 75 74 61 62 6c 65 2c 20 69 74 20   executable, it 
aca0: 6d 75 73 74 20 62 65 20 61 20 43 47 49 20 70 72  must be a CGI pr
acb0: 6f 67 72 61 6d 2e 20 20 53 74 61 72 74 20 62 79  ogram.  Start by
acc0: 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67  .    ** changing
acd0: 20 64 69 72 65 63 74 6f 72 69 65 73 20 74 6f 20   directories to 
ace0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 68 6f  the directory ho
acf0: 6c 64 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61  lding the progra
ad00: 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  m..    */.    if
ad10: 28 20 63 68 64 69 72 28 7a 44 69 72 29 20 29 7b  ( chdir(zDir) ){
ad20: 0a 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66  .      char zBuf
ad30: 5b 31 30 30 30 5d 3b 0a 20 20 20 20 20 20 4d 61  [1000];.      Ma
ad40: 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45  lfunction(__LINE
ad50: 5f 5f 2c 20 22 63 61 6e 6e 6f 74 20 63 68 64 69  __, "cannot chdi
ad60: 72 20 74 6f 20 5b 25 73 5d 20 66 72 6f 6d 20 5b  r to [%s] from [
ad70: 25 73 5d 22 2c 20 0a 20 20 20 20 20 20 20 20 20  %s]", .         
ad80: 20 20 7a 44 69 72 2c 20 67 65 74 63 77 64 28 7a    zDir, getcwd(z
ad90: 42 75 66 2c 39 39 39 29 29 3b 0a 20 20 20 20 7d  Buf,999));.    }
ada0: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 75 70 20 74  ..    /* Setup t
adb0: 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 61  he environment a
adc0: 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 0a 20 20  ppropriately..  
add0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
ade0: 3b 20 69 3c 73 69 7a 65 6f 66 28 63 67 69 65 6e  ; i<sizeof(cgien
adf0: 76 29 2f 73 69 7a 65 6f 66 28 63 67 69 65 6e 76  v)/sizeof(cgienv
ae00: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
ae10: 20 20 69 66 28 20 2a 63 67 69 65 6e 76 5b 69 5d    if( *cgienv[i]
ae20: 2e 70 7a 45 6e 76 56 61 6c 75 65 20 29 7b 0a 20  .pzEnvValue ){. 
ae30: 20 20 20 20 20 20 20 53 65 74 45 6e 76 28 63 67         SetEnv(cg
ae40: 69 65 6e 76 5b 69 5d 2e 7a 45 6e 76 4e 61 6d 65  ienv[i].zEnvName
ae50: 2c 2a 63 67 69 65 6e 76 5b 69 5d 2e 70 7a 45 6e  ,*cgienv[i].pzEn
ae60: 76 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d  vValue);.      }
ae70: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
ae80: 73 65 48 74 74 70 73 20 29 7b 0a 20 20 20 20 20  seHttps ){.     
ae90: 20 70 75 74 65 6e 76 28 22 48 54 54 50 53 3d 6f   putenv("HTTPS=o
aea0: 6e 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n");.    }..    
aeb0: 2f 2a 0a 20 20 20 20 2a 2a 20 41 62 6f 72 74 20  /*.    ** Abort 
aec0: 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 69 66  with an error if
aed0: 20 74 68 65 20 43 47 49 20 73 63 72 69 70 74 20   the CGI script 
aee0: 69 73 20 77 72 69 74 61 62 6c 65 20 62 79 20 61  is writable by a
aef0: 6e 79 6f 6e 65 20 6f 74 68 65 72 0a 20 20 20 20  nyone other.    
af00: 2a 2a 20 74 68 61 6e 20 69 74 73 20 6f 77 6e 65  ** than its owne
af10: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
af20: 28 20 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64  ( statbuf.st_mod
af30: 65 20 26 20 30 30 32 32 20 29 7b 0a 20 20 20 20  e & 0022 ){.    
af40: 20 20 43 67 69 53 63 72 69 70 74 57 72 69 74 61    CgiScriptWrita
af50: 62 6c 65 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ble();.    }..  
af60: 20 20 2f 2a 20 46 6f 72 20 74 68 65 20 50 4f 53    /* For the POS
af70: 54 20 6d 65 74 68 6f 64 20 61 6c 6c 20 69 6e 70  T method all inp
af80: 75 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  ut has been writ
af90: 74 65 6e 20 74 6f 20 61 20 74 65 6d 70 6f 72 61  ten to a tempora
afa0: 72 79 20 66 69 6c 65 2c 0a 20 20 20 20 2a 2a 20  ry file,.    ** 
afb0: 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 72 65  so we have to re
afc0: 64 69 72 65 63 74 20 69 6e 70 75 74 20 74 6f 20  direct input to 
afd0: 74 68 65 20 43 47 49 20 73 63 72 69 70 74 20 66  the CGI script f
afe0: 72 6f 6d 20 74 68 61 74 20 66 69 6c 65 2e 0a 20  rom that file.. 
aff0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 4d     */.    if( zM
b000: 65 74 68 6f 64 5b 30 5d 3d 3d 27 50 27 20 29 7b  ethod[0]=='P' ){
b010: 0a 20 20 20 20 20 20 64 75 70 28 30 29 3b 0a 20  .      dup(0);. 
b020: 20 20 20 20 20 63 6c 6f 73 65 28 30 29 3b 0a 20       close(0);. 
b030: 20 20 20 20 20 6f 70 65 6e 28 7a 54 6d 70 4e 61       open(zTmpNa
b040: 6d 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20  m, O_RDONLY);.  
b050: 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 73    }..    for(i=s
b060: 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2d 31 3b 20  trlen(zFile)-1; 
b070: 69 3e 3d 30 20 26 26 20 7a 46 69 6c 65 5b 69 5d  i>=0 && zFile[i]
b080: 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20  !='/'; i--){}.  
b090: 20 20 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 20    zBaseFilename 
b0a0: 3d 20 26 7a 46 69 6c 65 5b 69 2b 31 5d 3b 0a 20  = &zFile[i+1];. 
b0b0: 20 20 20 69 66 28 20 69 3e 3d 30 20 26 26 20 73     if( i>=0 && s
b0c0: 74 72 6e 63 6d 70 28 7a 42 61 73 65 46 69 6c 65  trncmp(zBaseFile
b0d0: 6e 61 6d 65 2c 22 6e 70 68 2d 22 2c 34 29 3d 3d  name,"nph-",4)==
b0e0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  0 ){.      /* If
b0f0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
b100: 20 43 47 49 20 73 63 72 69 70 74 20 62 65 67 69   CGI script begi
b110: 6e 73 20 77 69 74 68 20 22 6e 70 68 2d 22 20 74  ns with "nph-" t
b120: 68 65 6e 20 77 65 20 61 72 65 0a 20 20 20 20 20  hen we are.     
b130: 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68   ** dealing with
b140: 20 61 20 22 6e 6f 6e 2d 70 61 72 73 65 64 20 68   a "non-parsed h
b150: 65 61 64 65 72 73 22 20 43 47 49 20 73 63 72 69  eaders" CGI scri
b160: 70 74 2e 20 20 4a 75 73 74 20 65 78 65 63 28 29  pt.  Just exec()
b170: 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 64 69 72  .      ** it dir
b180: 65 63 74 6c 79 20 61 6e 64 20 6c 65 74 20 69 74  ectly and let it
b190: 20 68 61 6e 64 6c 65 20 61 6c 6c 20 69 74 73 20   handle all its 
b1a0: 6f 77 6e 20 68 65 61 64 65 72 20 67 65 6e 65 72  own header gener
b1b0: 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ation..      */.
b1c0: 20 20 20 20 20 20 65 78 65 63 6c 28 7a 42 61 73        execl(zBas
b1d0: 65 46 69 6c 65 6e 61 6d 65 2c 7a 42 61 73 65 46  eFilename,zBaseF
b1e0: 69 6c 65 6e 61 6d 65 2c 28 63 68 61 72 2a 29 30  ilename,(char*)0
b1f0: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4e 4f 54 45  );.      /* NOTE
b200: 3a 20 4e 6f 20 6c 6f 67 20 65 6e 74 72 79 20 77  : No log entry w
b210: 72 69 74 74 65 6e 20 66 6f 72 20 6e 70 68 2d 20  ritten for nph- 
b220: 73 63 72 69 70 74 73 20 2a 2f 0a 20 20 20 20 20  scripts */.     
b230: 20 65 78 69 74 28 30 29 3b 0a 20 20 20 20 7d 0a   exit(0);.    }.
b240: 0a 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72  .    /* Fall thr
b250: 75 20 74 6f 20 68 65 72 65 20 6f 6e 6c 79 20 69  u to here only i
b260: 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 28  f this process (
b270: 74 68 65 20 73 65 72 76 65 72 29 20 69 73 20 67  the server) is g
b280: 6f 69 6e 67 0a 20 20 20 20 2a 2a 20 74 6f 20 72  oing.    ** to r
b290: 65 61 64 20 61 6e 64 20 61 75 67 6d 65 6e 74 20  ead and augment 
b2a0: 74 68 65 20 68 65 61 64 65 72 20 73 65 6e 74 20  the header sent 
b2b0: 62 61 63 6b 20 62 79 20 74 68 65 20 43 47 49 20  back by the CGI 
b2c0: 70 72 6f 63 65 73 73 2e 0a 20 20 20 20 2a 2a 20  process..    ** 
b2d0: 4f 70 65 6e 20 61 20 70 69 70 65 20 74 6f 20 72  Open a pipe to r
b2e0: 65 63 65 69 76 65 20 74 68 65 20 6f 75 74 70 75  eceive the outpu
b2f0: 74 20 66 72 6f 6d 20 74 68 65 20 43 47 49 20 70  t from the CGI p
b300: 72 6f 63 65 73 73 2e 20 20 54 68 65 6e 0a 20 20  rocess.  Then.  
b310: 20 20 2a 2a 20 66 6f 72 6b 20 74 68 65 20 43 47    ** fork the CG
b320: 49 20 70 72 6f 63 65 73 73 2e 20 20 4f 6e 63 65  I process.  Once
b330: 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 64   everything is d
b340: 6f 6e 65 2c 20 77 65 20 73 68 6f 75 6c 64 20 62  one, we should b
b350: 65 0a 20 20 20 20 2a 2a 20 61 62 6c 65 20 74 6f  e.    ** able to
b360: 20 72 65 61 64 20 74 68 65 20 6f 75 74 70 75 74   read the output
b370: 20 6f 66 20 43 47 49 20 6f 6e 20 74 68 65 20 22   of CGI on the "
b380: 69 6e 22 20 73 74 72 65 61 6d 2e 0a 20 20 20 20  in" stream..    
b390: 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69  */.    {.      i
b3a0: 6e 74 20 70 78 5b 32 5d 3b 0a 20 20 20 20 20 20  nt px[2];.      
b3b0: 70 69 70 65 28 70 78 29 3b 0a 20 20 20 20 20 20  pipe(px);.      
b3c0: 69 66 28 20 66 6f 72 6b 28 29 3d 3d 30 20 29 7b  if( fork()==0 ){
b3d0: 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 70  .        close(p
b3e0: 78 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 63  x[0]);.        c
b3f0: 6c 6f 73 65 28 31 29 3b 0a 20 20 20 20 20 20 20  lose(1);.       
b400: 20 64 75 70 28 70 78 5b 31 5d 29 3b 0a 20 20 20   dup(px[1]);.   
b410: 20 20 20 20 20 63 6c 6f 73 65 28 70 78 5b 31 5d       close(px[1]
b420: 29 3b 0a 20 20 20 20 20 20 20 20 65 78 65 63 6c  );.        execl
b430: 28 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c 20  (zBaseFilename, 
b440: 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c 20 28  zBaseFilename, (
b450: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
b460: 20 20 65 78 69 74 28 30 29 3b 0a 20 20 20 20 20    exit(0);.     
b470: 20 7d 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 70   }.      close(p
b480: 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 6e 20  x[1]);.      in 
b490: 3d 20 66 64 6f 70 65 6e 28 70 78 5b 30 5d 2c 20  = fdopen(px[0], 
b4a0: 22 72 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  "r");.    }.    
b4b0: 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  if( in==0 ){.   
b4c0: 20 20 20 43 67 69 45 72 72 6f 72 28 29 3b 0a 20     CgiError();. 
b4d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 61     }..    /* Rea
b4e0: 64 20 61 6e 64 20 70 72 6f 63 65 73 73 20 74 68  d and process th
b4f0: 65 20 66 69 72 73 74 20 6c 69 6e 65 20 6f 66 20  e first line of 
b500: 74 68 65 20 68 65 61 64 65 72 20 72 65 74 75 72  the header retur
b510: 6e 65 64 20 62 79 20 74 68 65 0a 20 20 20 20 2a  ned by the.    *
b520: 2a 20 43 47 49 20 73 63 72 69 70 74 2e 0a 20 20  * CGI script..  
b530: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 65    */.    if( use
b540: 54 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d 28  Timeout ) alarm(
b550: 31 35 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  15);.    while( 
b560: 66 67 65 74 73 28 7a 4c 69 6e 65 2c 73 69 7a 65  fgets(zLine,size
b570: 6f 66 28 7a 4c 69 6e 65 29 2c 69 6e 29 20 29 7b  of(zLine),in) ){
b580: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63  .      if( strnc
b590: 6d 70 28 7a 4c 69 6e 65 2c 22 4c 6f 63 61 74 69  mp(zLine,"Locati
b5a0: 6f 6e 3a 22 2c 39 29 3d 3d 30 20 29 7b 0a 20 20  on:",9)==0 ){.  
b5b0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
b5c0: 20 20 20 20 20 52 65 6d 6f 76 65 4e 65 77 6c 69       RemoveNewli
b5d0: 6e 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20  ne(zLine);.     
b5e0: 20 20 20 7a 20 3d 20 26 7a 4c 69 6e 65 5b 31 30     z = &zLine[10
b5f0: 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ];.        while
b600: 28 20 69 73 73 70 61 63 65 28 2a 7a 29 20 29 7b  ( isspace(*z) ){
b610: 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20   z++; }.        
b620: 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
b630: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
b640: 66 28 20 7a 5b 69 5d 3d 3d 27 3f 27 20 29 7b 0a  f( z[i]=='?' ){.
b650: 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65              zQue
b660: 72 79 53 75 66 66 69 78 20 3d 20 53 74 72 44 75  rySuffix = StrDu
b670: 70 28 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20  p("");.         
b680: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
b690: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 69 66       .        if
b6a0: 28 20 7a 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 7a  ( z[0]=='/' && z
b6b0: 5b 31 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [1]=='/' ){.    
b6c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 63 68        /* The sch
b6d0: 65 6d 65 20 69 73 20 6d 69 73 73 69 6e 67 2e 20  eme is missing. 
b6e0: 20 41 64 64 20 69 74 20 69 6e 20 62 65 66 6f 72   Add it in befor
b6f0: 65 20 72 65 64 69 72 65 63 74 69 6e 67 20 2a 2f  e redirecting */
b700: 0a 20 20 20 20 20 20 20 20 20 20 53 74 61 72 74  .          Start
b710: 52 65 73 70 6f 6e 73 65 28 22 33 30 32 20 52 65  Response("302 Re
b720: 64 69 72 65 63 74 22 29 3b 0a 20 20 20 20 20 20  direct");.      
b730: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
b740: 74 66 28 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73  tf("Location: %s
b750: 3a 25 73 25 73 5c 72 5c 6e 22 2c 7a 48 74 74 70  :%s%s\r\n",zHttp
b760: 2c 7a 2c 7a 51 75 65 72 79 53 75 66 66 69 78 29  ,z,zQuerySuffix)
b770: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
b780: 6b 3b 20 2f 2a 20 44 4b 20 2a 2f 0a 20 20 20 20  k; /* DK */.    
b790: 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74        MakeLogEnt
b7a0: 72 79 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20  ry(0);.         
b7b0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
b7c0: 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30 5d 3d   }else if( z[0]=
b7d0: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
b7e0: 20 20 2f 2a 20 54 68 65 20 73 63 68 65 6d 65 20    /* The scheme 
b7f0: 61 6e 64 20 6e 65 74 77 6f 72 6b 20 6c 6f 63 61  and network loca
b800: 74 69 6f 6e 20 61 72 65 20 6d 69 73 73 69 6e 67  tion are missing
b810: 20 62 75 74 20 77 65 20 68 61 76 65 0a 20 20 20   but we have.   
b820: 20 20 20 20 20 20 20 2a 2a 20 61 6e 20 61 62 73         ** an abs
b830: 6f 6c 75 74 65 20 70 61 74 68 2e 20 2a 2f 0a 20  olute path. */. 
b840: 20 20 20 20 20 20 20 20 20 52 65 64 69 72 65 63           Redirec
b850: 74 28 7a 2c 20 30 29 3b 20 2f 2a 20 44 4b 20 2a  t(z, 0); /* DK *
b860: 2f 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  /.          brea
b870: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
b880: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
b890: 20 73 65 65 20 69 66 20 74 68 65 72 65 20 69 73   see if there is
b8a0: 20 61 20 73 63 68 65 6d 65 20 70 72 65 66 69 78   a scheme prefix
b8b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
b8c0: 69 3d 30 3b 20 7a 5b 69 5d 20 26 26 20 7a 5b 69  i=0; z[i] && z[i
b8d0: 5d 21 3d 27 3a 27 20 26 26 20 7a 5b 69 5d 21 3d  ]!=':' && z[i]!=
b8e0: 27 2f 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  '/'; i++){}.    
b8f0: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 3a      if( z[i]==':
b900: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ' ){.          /
b910: 2a 20 57 65 20 68 61 76 65 20 61 20 73 63 68 65  * We have a sche
b920: 6d 65 2e 20 20 41 73 73 75 6d 65 20 74 68 65 72  me.  Assume ther
b930: 65 20 69 73 20 61 6e 20 61 62 73 6f 6c 75 74 65  e is an absolute
b940: 20 55 52 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20   URL */.        
b950: 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28    StartResponse(
b960: 22 33 30 32 20 52 65 64 69 72 65 63 74 22 29 3b  "302 Redirect");
b970: 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20  .          nOut 
b980: 2b 3d 20 70 72 69 6e 74 66 28 22 4c 6f 63 61 74  += printf("Locat
b990: 69 6f 6e 3a 20 25 73 25 73 5c 72 5c 6e 22 2c 7a  ion: %s%s\r\n",z
b9a0: 2c 7a 51 75 65 72 79 53 75 66 66 69 78 29 3b 0a  ,zQuerySuffix);.
b9b0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b9c0: 20 2f 2a 20 44 4b 20 2a 2f 0a 20 20 20 20 20 20   /* DK */.      
b9d0: 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79      MakeLogEntry
b9e0: 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  (0);.          r
b9f0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d  eturn;.        }
ba00: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74  .        /* Must
ba10: 20 62 65 20 61 20 72 65 6c 61 74 69 76 65 20 70   be a relative p
ba20: 61 74 68 6e 61 6d 65 2e 20 20 43 6f 6e 73 74 72  athname.  Constr
ba30: 75 63 74 20 74 68 65 20 61 62 73 6f 6c 75 74 65  uct the absolute
ba40: 20 70 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20   pathname.      
ba50: 20 20 2a 2a 20 61 6e 64 20 72 65 64 69 72 65 63    ** and redirec
ba60: 74 20 74 6f 20 69 74 2e 20 2a 2f 0a 20 20 20 20  t to it. */.    
ba70: 20 20 20 20 69 20 3d 20 73 74 72 6c 65 6e 28 7a      i = strlen(z
ba80: 52 65 61 6c 53 63 72 69 70 74 29 3b 0a 20 20 20  RealScript);.   
ba90: 20 20 20 20 20 77 68 69 6c 65 28 20 69 3e 30 20       while( i>0 
baa0: 26 26 20 7a 52 65 61 6c 53 63 72 69 70 74 5b 69  && zRealScript[i
bab0: 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 69 2d 2d 3b  -1]!='/' ){ i--;
bac0: 20 7d 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65   }.        while
bad0: 28 20 69 3e 30 20 26 26 20 7a 52 65 61 6c 53 63  ( i>0 && zRealSc
bae0: 72 69 70 74 5b 69 2d 31 5d 3d 3d 27 2f 27 20 29  ript[i-1]=='/' )
baf0: 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20  { i--; }.       
bb00: 20 77 68 69 6c 65 28 20 2a 7a 3d 3d 27 2e 27 20   while( *z=='.' 
bb10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
bb20: 20 7a 5b 31 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20   z[1]=='/' ){.  
bb30: 20 20 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 32            z += 2
bb40: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
bb50: 65 20 69 66 28 20 7a 5b 31 5d 3d 3d 27 2e 27 20  e if( z[1]=='.' 
bb60: 26 26 20 7a 5b 32 5d 3d 3d 27 2f 27 20 29 7b 0a  && z[2]=='/' ){.
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c              whil
bb80: 65 28 20 69 3e 30 20 26 26 20 7a 52 65 61 6c 53  e( i>0 && zRealS
bb90: 63 72 69 70 74 5b 69 2d 31 5d 21 3d 27 2f 27 20  cript[i-1]!='/' 
bba0: 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ i--; }.      
bbb0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3e 30        while( i>0
bbc0: 20 26 26 20 7a 52 65 61 6c 53 63 72 69 70 74 5b   && zRealScript[
bbd0: 69 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 69 2d 2d  i-1]=='/' ){ i--
bbe0: 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ; }.            
bbf0: 7a 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20 20  z += 3;.        
bc00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
bc10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bc20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
bc30: 7d 0a 20 20 20 20 20 20 20 20 53 74 61 72 74 52  }.        StartR
bc40: 65 73 70 6f 6e 73 65 28 22 33 30 32 20 52 65 64  esponse("302 Red
bc50: 69 72 65 63 74 22 29 3b 0a 20 20 20 20 20 20 20  irect");.       
bc60: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
bc70: 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73 3a 2f 2f  "Location: %s://
bc80: 25 73 22 2c 7a 48 74 74 70 2c 7a 53 65 72 76 65  %s",zHttp,zServe
bc90: 72 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  rName);.        
bca0: 69 66 28 20 73 74 72 63 6d 70 28 7a 53 65 72 76  if( strcmp(zServ
bcb0: 65 72 50 6f 72 74 2c 22 38 30 22 29 20 29 7b 0a  erPort,"80") ){.
bcc0: 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20 2b            nOut +
bcd0: 3d 20 70 72 69 6e 74 66 28 22 3a 25 73 22 2c 7a  = printf(":%s",z
bce0: 53 65 72 76 65 72 50 6f 72 74 29 3b 0a 20 20 20  ServerPort);.   
bcf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
bd00: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 25  Out += printf("%
bd10: 2e 2a 73 2f 25 73 25 73 5c 72 5c 6e 5c 72 5c 6e  .*s/%s%s\r\n\r\n
bd20: 22 2c 69 2c 7a 52 65 61 6c 53 63 72 69 70 74 2c  ",i,zRealScript,
bd30: 7a 2c 7a 51 75 65 72 79 53 75 66 66 69 78 29 3b  z,zQuerySuffix);
bd40: 0a 20 20 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67  .        MakeLog
bd50: 45 6e 74 72 79 28 30 29 3b 0a 20 20 20 20 20 20  Entry(0);.      
bd60: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
bd70: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d  }else if( strncm
bd80: 70 28 7a 4c 69 6e 65 2c 22 53 74 61 74 75 73 3a  p(zLine,"Status:
bd90: 22 2c 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ",7)==0 ){.     
bda0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
bdb0: 20 20 66 6f 72 28 69 3d 37 3b 20 69 73 73 70 61    for(i=7; isspa
bdc0: 63 65 28 7a 4c 69 6e 65 5b 69 5d 29 3b 20 69 2b  ce(zLine[i]); i+
bdd0: 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 6e 4f 75  +){}.        nOu
bde0: 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 25 73 20  t += printf("%s 
bdf0: 25 73 22 2c 20 7a 50 72 6f 74 6f 63 6f 6c 2c 20  %s", zProtocol, 
be00: 26 7a 4c 69 6e 65 5b 69 5d 29 3b 0a 20 20 20 20  &zLine[i]);.    
be10: 20 20 20 20 73 74 72 6e 63 70 79 28 7a 52 65 70      strncpy(zRep
be20: 6c 79 53 74 61 74 75 73 2c 20 26 7a 4c 69 6e 65  lyStatus, &zLine
be30: 5b 69 5d 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  [i], 3);.       
be40: 20 7a 52 65 70 6c 79 53 74 61 74 75 73 5b 33 5d   zReplyStatus[3]
be50: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 74   = 0;.        st
be60: 61 74 75 73 53 65 6e 74 20 3d 20 31 3b 0a 20 20  atusSent = 1;.  
be70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
be80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
be90: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
bea0: 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22   StartResponse("
beb0: 32 30 30 20 4f 4b 22 29 3b 0a 20 20 20 20 20 20  200 OK");.      
bec0: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
bed0: 28 22 25 73 22 2c 7a 4c 69 6e 65 29 3b 0a 20 20  ("%s",zLine);.  
bee0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a        for(i=0; z
bef0: 4c 69 6e 65 5b 69 5d 20 26 26 20 21 69 73 73 70  Line[i] && !issp
bf00: 61 63 65 28 7a 4c 69 6e 65 5b 69 5d 29 20 26 26  ace(zLine[i]) &&
bf10: 20 7a 4c 69 6e 65 5b 69 5d 21 3d 27 3a 27 3b 20   zLine[i]!=':'; 
bf20: 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 69  i++){}.        i
bf30: 66 28 20 69 3c 32 20 7c 7c 20 7a 4c 69 6e 65 5b  f( i<2 || zLine[
bf40: 69 5d 21 3d 27 3a 27 20 29 20 62 72 65 61 6b 3b  i]!=':' ) break;
bf50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
bf60: 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 76 65 72      /* Copy ever
bf70: 79 74 68 69 6e 67 20 65 6c 73 65 20 74 68 72 75  ything else thru
bf80: 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 65 20   without change 
bf90: 6f 72 20 61 6e 61 6c 79 73 69 73 2e 0a 20 20 20  or analysis..   
bfa0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 65 54   */.    if( useT
bfb0: 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d 28 36  imeout ) alarm(6
bfc0: 30 2a 35 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  0*5);.    while(
bfd0: 20 28 63 20 3d 20 67 65 74 63 28 69 6e 29 29 21   (c = getc(in))!
bfe0: 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20 20 70 75  =EOF ){.      pu
bff0: 74 63 28 63 2c 73 74 64 6f 75 74 29 3b 0a 20 20  tc(c,stdout);.  
c000: 20 20 20 20 6e 4f 75 74 2b 2b 3b 0a 20 20 20 20      nOut++;.    
c010: 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29  }.    fclose(in)
c020: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
c030: 2a 20 49 66 20 69 74 20 69 73 6e 27 74 20 65 78  * If it isn't ex
c040: 65 63 75 74 61 62 6c 65 20 74 68 65 6e 20 69 74  ecutable then it
c050: 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 61 20 73  .    ** must a s
c060: 69 6d 70 6c 65 20 66 69 6c 65 20 74 68 61 74 20  imple file that 
c070: 6e 65 65 64 73 20 74 6f 20 62 65 20 63 6f 70 69  needs to be copi
c080: 65 64 20 74 6f 20 6f 75 74 70 75 74 2e 0a 20 20  ed to output..  
c090: 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63    */.    const c
c0a0: 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 54 79 70  har *zContentTyp
c0b0: 65 20 3d 20 47 65 74 4d 69 6d 65 54 79 70 65 28  e = GetMimeType(
c0c0: 7a 46 69 6c 65 2c 20 6c 65 6e 46 69 6c 65 29 3b  zFile, lenFile);
c0d0: 0a 0a 20 20 20 20 69 66 28 20 7a 54 6d 70 4e 61  ..    if( zTmpNa
c0e0: 6d 20 29 20 75 6e 6c 69 6e 6b 28 7a 54 6d 70 4e  m ) unlink(zTmpN
c0f0: 61 6d 29 3b 0a 20 20 20 20 69 6e 20 3d 20 66 6f  am);.    in = fo
c100: 70 65 6e 28 7a 46 69 6c 65 2c 22 72 22 29 3b 0a  pen(zFile,"r");.
c110: 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20      if( in==0 ) 
c120: 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f  NotFound(__LINE_
c130: 5f 29 3b 0a 20 20 20 20 53 74 61 72 74 52 65 73  _);.    StartRes
c140: 70 6f 6e 73 65 28 22 32 30 30 20 4f 4b 22 29 3b  ponse("200 OK");
c150: 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 44 61 74  .    nOut += Dat
c160: 65 54 61 67 28 22 4c 61 73 74 2d 4d 6f 64 69 66  eTag("Last-Modif
c170: 69 65 64 22 2c 20 73 74 61 74 62 75 66 2e 73 74  ied", statbuf.st
c180: 5f 6d 74 69 6d 65 29 3b 0a 20 20 20 20 6e 4f 75  _mtime);.    nOu
c190: 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e  t += printf("Con
c1a0: 74 65 6e 74 2d 74 79 70 65 3a 20 25 73 5c 72 5c  tent-type: %s\r\
c1b0: 6e 22 2c 7a 43 6f 6e 74 65 6e 74 54 79 70 65 29  n",zContentType)
c1c0: 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72  ;.    nOut += pr
c1d0: 69 6e 74 66 28 22 43 6f 6e 74 65 6e 74 2d 6c 65  intf("Content-le
c1e0: 6e 67 74 68 3a 20 25 64 5c 72 5c 6e 5c 72 5c 6e  ngth: %d\r\n\r\n
c1f0: 22 2c 28 69 6e 74 29 73 74 61 74 62 75 66 2e 73  ",(int)statbuf.s
c200: 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 66 66 6c  t_size);.    ffl
c210: 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20  ush(stdout);.   
c220: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4d 65 74   if( strcmp(zMet
c230: 68 6f 64 2c 22 48 45 41 44 22 29 3d 3d 30 20 29  hod,"HEAD")==0 )
c240: 7b 0a 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45  {.      MakeLogE
c250: 6e 74 72 79 28 30 29 3b 0a 20 20 20 20 20 20 66  ntry(0);.      f
c260: 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20  close(in);.     
c270: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
c280: 20 20 20 69 66 28 20 75 73 65 54 69 6d 65 6f 75     if( useTimeou
c290: 74 20 29 20 61 6c 61 72 6d 28 33 30 20 2b 20 73  t ) alarm(30 + s
c2a0: 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 2f 31  tatbuf.st_size/1
c2b0: 30 30 30 29 3b 0a 23 69 66 64 65 66 20 6c 69 6e  000);.#ifdef lin
c2c0: 75 78 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 6f  ux.    {.      o
c2d0: 66 66 5f 74 20 6f 66 66 73 65 74 20 3d 20 30 3b  ff_t offset = 0;
c2e0: 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 73  .      nOut += s
c2f0: 65 6e 64 66 69 6c 65 28 66 69 6c 65 6e 6f 28 73  endfile(fileno(s
c300: 74 64 6f 75 74 29 2c 20 66 69 6c 65 6e 6f 28 69  tdout), fileno(i
c310: 6e 29 2c 20 26 6f 66 66 73 65 74 2c 20 73 74 61  n), &offset, sta
c320: 74 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 20  tbuf.st_size);. 
c330: 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 77     }.#else.    w
c340: 68 69 6c 65 28 20 28 63 20 3d 20 67 65 74 63 28  hile( (c = getc(
c350: 69 6e 29 29 21 3d 45 4f 46 20 29 7b 0a 20 20 20  in))!=EOF ){.   
c360: 20 20 20 70 75 74 63 28 63 2c 73 74 64 6f 75 74     putc(c,stdout
c370: 29 3b 0a 20 20 20 20 20 20 6e 4f 75 74 2b 2b 3b  );.      nOut++;
c380: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
c390: 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
c3a0: 7d 0a 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75  }.  fflush(stdou
c3b0: 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74  t);.  MakeLogEnt
c3c0: 72 79 28 30 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  ry(0);..  /* The
c3d0: 20 6e 65 78 74 20 72 65 71 75 65 73 74 20 6d 75   next request mu
c3e0: 73 74 20 61 72 72 69 76 65 20 77 69 74 68 69 6e  st arrive within
c3f0: 20 33 30 20 73 65 63 6f 6e 64 73 20 6f 72 20 77   30 seconds or w
c400: 65 20 63 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e  e close the conn
c410: 65 63 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6f 6d  ection.  */.  om
c420: 69 74 4c 6f 67 20 3d 20 31 3b 0a 20 20 69 66 28  itLog = 1;.  if(
c430: 20 75 73 65 54 69 6d 65 6f 75 74 20 29 20 61 6c   useTimeout ) al
c440: 61 72 6d 28 33 30 29 3b 0a 7d 0a 0a 23 64 65 66  arm(30);.}..#def
c450: 69 6e 65 20 4d 41 58 5f 50 41 52 41 4c 4c 45 4c  ine MAX_PARALLEL
c460: 20 35 30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f   50  /* Number o
c470: 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 63  f simultaneous c
c480: 68 69 6c 64 72 65 6e 20 2a 2f 0a 0a 2f 2a 0a 2a  hildren */../*.*
c490: 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 48  * Implement an H
c4a0: 54 54 50 20 73 65 72 76 65 72 20 64 61 65 6d 6f  TTP server daemo
c4b0: 6e 20 6c 69 73 74 65 6e 69 6e 67 20 6f 6e 20 70  n listening on p
c4c0: 6f 72 74 20 69 50 6f 72 74 2e 0a 2a 2a 0a 2a 2a  ort iPort..**.**
c4d0: 20 41 73 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69   As new connecti
c4e0: 6f 6e 73 20 61 72 72 69 76 65 2c 20 66 6f 72 6b  ons arrive, fork
c4f0: 20 61 20 63 68 69 6c 64 20 61 6e 64 20 6c 65 74   a child and let
c500: 20 63 68 69 6c 64 20 72 65 74 75 72 6e 0a 2a 2a   child return.**
c510: 20 6f 75 74 20 6f 66 20 74 68 69 73 20 70 72 6f   out of this pro
c520: 63 65 64 75 72 65 20 63 61 6c 6c 2e 20 20 54 68  cedure call.  Th
c530: 65 20 63 68 69 6c 64 20 77 69 6c 6c 20 68 61 6e  e child will han
c540: 64 6c 65 20 74 68 65 20 72 65 71 75 65 73 74 2e  dle the request.
c550: 0a 2a 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6e  .** The parent n
c560: 65 76 65 72 20 72 65 74 75 72 6e 73 20 66 72 6f  ever returns fro
c570: 6d 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  m this procedure
c580: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
c590: 20 74 6f 20 65 61 63 68 20 63 68 69 6c 64 20 61   to each child a
c5a0: 73 20 69 74 20 72 75 6e 73 2e 20 20 49 66 20 75  s it runs.  If u
c5b0: 6e 61 62 6c 65 20 74 6f 20 65 73 74 61 62 6c 69  nable to establi
c5c0: 73 68 20 61 0a 2a 2a 20 6c 69 73 74 65 6e 69 6e  sh a.** listenin
c5d0: 67 20 73 6f 63 6b 65 74 2c 20 72 65 74 75 72 6e  g socket, return
c5e0: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e   non-zero..*/.in
c5f0: 74 20 68 74 74 70 5f 73 65 72 76 65 72 28 69 6e  t http_server(in
c600: 74 20 69 50 6f 72 74 2c 20 69 6e 74 20 6c 6f 63  t iPort, int loc
c610: 61 6c 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 6c  alOnly){.  int l
c620: 69 73 74 65 6e 65 72 20 3d 20 2d 31 3b 20 20 20  istener = -1;   
c630: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
c640: 65 72 76 65 72 20 73 6f 63 6b 65 74 20 2a 2f 0a  erver socket */.
c650: 20 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e    int connection
c660: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
c670: 2a 20 41 20 73 6f 63 6b 65 74 20 66 6f 72 20 65  * A socket for e
c680: 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 63  ach individual c
c690: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 66  onnection */.  f
c6a0: 64 5f 73 65 74 20 72 65 61 64 66 64 73 3b 20 20  d_set readfds;  
c6b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
c6c0: 65 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72  et of file descr
c6d0: 69 70 74 6f 72 73 20 66 6f 72 20 73 65 6c 65 63  iptors for selec
c6e0: 74 28 29 20 2a 2f 0a 20 20 73 6f 63 6b 6c 65 6e  t() */.  socklen
c6f0: 5f 74 20 6c 65 6e 61 64 64 72 3b 20 20 20 20 20  _t lenaddr;     
c700: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
c710: 6f 66 20 74 68 65 20 69 6e 61 64 64 72 20 73 74  of the inaddr st
c720: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74  ructure */.  int
c730: 20 63 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20   child;         
c740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 49 44            /* PID
c750: 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 72   of the child pr
c760: 6f 63 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  ocess */.  int n
c770: 63 68 69 6c 64 72 65 6e 20 3d 20 30 3b 20 20 20  children = 0;   
c780: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c790: 72 20 6f 66 20 63 68 69 6c 64 20 70 72 6f 63 65  r of child proce
c7a0: 73 73 65 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  sses */.  struct
c7b0: 20 74 69 6d 65 76 61 6c 20 64 65 6c 61 79 3b 20   timeval delay; 
c7c0: 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6c 6f         /* How lo
c7d0: 6e 67 20 74 6f 20 77 61 69 74 20 69 6e 73 69 64  ng to wait insid
c7e0: 65 20 73 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20  e select() */.  
c7f0: 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f  struct sockaddr_
c800: 69 6e 20 69 6e 61 64 64 72 3b 20 20 20 2f 2a 20  in inaddr;   /* 
c810: 54 68 65 20 73 6f 63 6b 65 74 20 61 64 64 72 65  The socket addre
c820: 73 73 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 74 20  ss */.  int opt 
c830: 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
c840: 20 20 20 20 20 2f 2a 20 73 65 74 73 6f 63 6b 6f       /* setsocko
c850: 70 74 20 66 6c 61 67 20 2a 2f 0a 0a 20 20 6d 65  pt flag */..  me
c860: 6d 73 65 74 28 26 69 6e 61 64 64 72 2c 20 30 2c  mset(&inaddr, 0,
c870: 20 73 69 7a 65 6f 66 28 69 6e 61 64 64 72 29 29   sizeof(inaddr))
c880: 3b 0a 20 20 69 6e 61 64 64 72 2e 73 69 6e 5f 66  ;.  inaddr.sin_f
c890: 61 6d 69 6c 79 20 3d 20 41 46 5f 49 4e 45 54 3b  amily = AF_INET;
c8a0: 0a 20 20 69 66 28 20 6c 6f 63 61 6c 4f 6e 6c 79  .  if( localOnly
c8b0: 20 29 7b 0a 20 20 20 20 69 6e 61 64 64 72 2e 73   ){.    inaddr.s
c8c0: 69 6e 5f 61 64 64 72 2e 73 5f 61 64 64 72 20 3d  in_addr.s_addr =
c8d0: 20 68 74 6f 6e 6c 28 49 4e 41 44 44 52 5f 4c 4f   htonl(INADDR_LO
c8e0: 4f 50 42 41 43 4b 29 3b 0a 20 20 7d 65 6c 73 65  OPBACK);.  }else
c8f0: 7b 0a 20 20 20 20 69 6e 61 64 64 72 2e 73 69 6e  {.    inaddr.sin
c900: 5f 61 64 64 72 2e 73 5f 61 64 64 72 20 3d 20 68  _addr.s_addr = h
c910: 74 6f 6e 6c 28 49 4e 41 44 44 52 5f 41 4e 59 29  tonl(INADDR_ANY)
c920: 3b 0a 20 20 7d 0a 20 20 69 6e 61 64 64 72 2e 73  ;.  }.  inaddr.s
c930: 69 6e 5f 70 6f 72 74 20 3d 20 68 74 6f 6e 73 28  in_port = htons(
c940: 69 50 6f 72 74 29 3b 0a 20 20 6c 69 73 74 65 6e  iPort);.  listen
c950: 65 72 20 3d 20 73 6f 63 6b 65 74 28 41 46 5f 49  er = socket(AF_I
c960: 4e 45 54 2c 20 53 4f 43 4b 5f 53 54 52 45 41 4d  NET, SOCK_STREAM
c970: 2c 20 30 29 3b 0a 20 20 69 66 28 20 6c 69 73 74  , 0);.  if( list
c980: 65 6e 65 72 3c 30 20 29 7b 0a 20 20 20 20 69 50  ener<0 ){.    iP
c990: 6f 72 74 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e  ort++;.    fprin
c9a0: 74 66 28 73 74 64 65 72 72 2c 20 22 63 61 6e 6e  tf(stderr, "cann
c9b0: 6f 74 20 6f 70 65 6e 20 6c 69 73 74 65 6e 69 6e  ot open listenin
c9c0: 67 20 73 6f 63 6b 65 74 20 6f 6e 20 70 6f 72 74  g socket on port
c9d0: 20 25 64 5c 6e 22 2c 20 69 50 6f 72 74 29 3b 0a   %d\n", iPort);.
c9e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
c9f0: 7d 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 63 61  }..  /* if we ca
ca00: 6e 27 74 20 74 65 72 6d 69 6e 61 74 65 20 6e 69  n't terminate ni
ca10: 63 65 6c 79 2c 20 61 74 20 6c 65 61 73 74 20 61  cely, at least a
ca20: 6c 6c 6f 77 20 74 68 65 20 73 6f 63 6b 65 74 20  llow the socket 
ca30: 74 6f 20 62 65 20 72 65 75 73 65 64 20 2a 2f 0a  to be reused */.
ca40: 20 20 73 65 74 73 6f 63 6b 6f 70 74 28 6c 69 73    setsockopt(lis
ca50: 74 65 6e 65 72 2c 53 4f 4c 5f 53 4f 43 4b 45 54  tener,SOL_SOCKET
ca60: 2c 53 4f 5f 52 45 55 53 45 41 44 44 52 2c 26 6f  ,SO_REUSEADDR,&o
ca70: 70 74 2c 73 69 7a 65 6f 66 28 6f 70 74 29 29 3b  pt,sizeof(opt));
ca80: 0a 0a 20 20 69 66 28 20 62 69 6e 64 28 6c 69 73  ..  if( bind(lis
ca90: 74 65 6e 65 72 2c 20 28 73 74 72 75 63 74 20 73  tener, (struct s
caa0: 6f 63 6b 61 64 64 72 2a 29 26 69 6e 61 64 64 72  ockaddr*)&inaddr
cab0: 2c 20 73 69 7a 65 6f 66 28 69 6e 61 64 64 72 29  , sizeof(inaddr)
cac0: 29 3c 30 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65  )<0 ){.    close
cad0: 28 6c 69 73 74 65 6e 65 72 29 3b 0a 20 20 20 20  (listener);.    
cae0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
caf0: 22 62 69 6e 64 20 66 61 69 6c 65 64 5c 6e 22 29  "bind failed\n")
cb00: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
cb10: 20 20 7d 0a 20 20 6c 69 73 74 65 6e 28 6c 69 73    }.  listen(lis
cb20: 74 65 6e 65 72 2c 31 30 29 3b 0a 20 20 70 72 69  tener,10);.  pri
cb30: 6e 74 66 28 22 4c 69 73 74 65 6e 69 6e 67 20 66  ntf("Listening f
cb40: 6f 72 20 48 54 54 50 20 72 65 71 75 65 73 74 73  or HTTP requests
cb50: 20 6f 6e 20 54 43 50 20 70 6f 72 74 20 25 64 5c   on TCP port %d\
cb60: 6e 22 2c 20 69 50 6f 72 74 29 3b 0a 20 20 66 66  n", iPort);.  ff
cb70: 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20  lush(stdout);.  
cb80: 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
cb90: 69 66 28 20 6e 63 68 69 6c 64 72 65 6e 3e 4d 41  if( nchildren>MA
cba0: 58 5f 50 41 52 41 4c 4c 45 4c 20 29 7b 0a 20 20  X_PARALLEL ){.  
cbb0: 20 20 20 20 2f 2a 20 53 6c 6f 77 20 64 6f 77 6e      /* Slow down
cbc0: 20 69 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   if connections 
cbd0: 61 72 65 20 61 72 72 69 76 69 6e 67 20 74 6f 6f  are arriving too
cbe0: 20 66 61 73 74 20 2a 2f 0a 20 20 20 20 20 20 73   fast */.      s
cbf0: 6c 65 65 70 28 20 6e 63 68 69 6c 64 72 65 6e 2d  leep( nchildren-
cc00: 4d 41 58 5f 50 41 52 41 4c 4c 45 4c 20 29 3b 0a  MAX_PARALLEL );.
cc10: 20 20 20 20 7d 0a 20 20 20 20 64 65 6c 61 79 2e      }.    delay.
cc20: 74 76 5f 73 65 63 20 3d 20 36 30 3b 0a 20 20 20  tv_sec = 60;.   
cc30: 20 64 65 6c 61 79 2e 74 76 5f 75 73 65 63 20 3d   delay.tv_usec =
cc40: 20 30 3b 0a 20 20 20 20 46 44 5f 5a 45 52 4f 28   0;.    FD_ZERO(
cc50: 26 72 65 61 64 66 64 73 29 3b 0a 20 20 20 20 61  &readfds);.    a
cc60: 73 73 65 72 74 28 20 6c 69 73 74 65 6e 65 72 3e  ssert( listener>
cc70: 3d 30 20 29 3b 0a 20 20 20 20 46 44 5f 53 45 54  =0 );.    FD_SET
cc80: 28 20 6c 69 73 74 65 6e 65 72 2c 20 26 72 65 61  ( listener, &rea
cc90: 64 66 64 73 29 3b 0a 20 20 20 20 73 65 6c 65 63  dfds);.    selec
cca0: 74 28 20 6c 69 73 74 65 6e 65 72 2b 31 2c 20 26  t( listener+1, &
ccb0: 72 65 61 64 66 64 73 2c 20 30 2c 20 30 2c 20 26  readfds, 0, 0, &
ccc0: 64 65 6c 61 79 29 3b 0a 20 20 20 20 69 66 28 20  delay);.    if( 
ccd0: 46 44 5f 49 53 53 45 54 28 6c 69 73 74 65 6e 65  FD_ISSET(listene
cce0: 72 2c 20 26 72 65 61 64 66 64 73 29 20 29 7b 0a  r, &readfds) ){.
ccf0: 20 20 20 20 20 20 6c 65 6e 61 64 64 72 20 3d 20        lenaddr = 
cd00: 73 69 7a 65 6f 66 28 69 6e 61 64 64 72 29 3b 0a  sizeof(inaddr);.
cd10: 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
cd20: 20 3d 20 61 63 63 65 70 74 28 6c 69 73 74 65 6e   = accept(listen
cd30: 65 72 2c 20 28 73 74 72 75 63 74 20 73 6f 63 6b  er, (struct sock
cd40: 61 64 64 72 2a 29 26 69 6e 61 64 64 72 2c 20 26  addr*)&inaddr, &
cd50: 6c 65 6e 61 64 64 72 29 3b 0a 20 20 20 20 20 20  lenaddr);.      
cd60: 69 66 28 20 63 6f 6e 6e 65 63 74 69 6f 6e 3e 3d  if( connection>=
cd70: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 69  0 ){.        chi
cd80: 6c 64 20 3d 20 66 6f 72 6b 28 29 3b 0a 20 20 20  ld = fork();.   
cd90: 20 20 20 20 20 69 66 28 20 63 68 69 6c 64 21 3d       if( child!=
cda0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
cdb0: 66 28 20 63 68 69 6c 64 3e 30 20 29 20 6e 63 68  f( child>0 ) nch
cdc0: 69 6c 64 72 65 6e 2b 2b 3b 0a 20 20 20 20 20 20  ildren++;.      
cdd0: 20 20 20 20 63 6c 6f 73 65 28 63 6f 6e 6e 65 63      close(connec
cde0: 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  tion);.        }
cdf0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ce00: 69 6e 74 20 6e 45 72 72 20 3d 20 30 2c 20 66 64  int nErr = 0, fd
ce10: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  ;.          clos
ce20: 65 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(0);.          
ce30: 66 64 20 3d 20 64 75 70 28 63 6f 6e 6e 65 63 74  fd = dup(connect
ce40: 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ion);.          
ce50: 69 66 28 20 66 64 21 3d 30 20 29 20 6e 45 72 72  if( fd!=0 ) nErr
ce60: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  ++;.          cl
ce70: 6f 73 65 28 31 29 3b 0a 20 20 20 20 20 20 20 20  ose(1);.        
ce80: 20 20 66 64 20 3d 20 64 75 70 28 63 6f 6e 6e 65    fd = dup(conne
ce90: 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20  ction);.        
cea0: 20 20 69 66 28 20 66 64 21 3d 31 20 29 20 6e 45    if( fd!=1 ) nE
ceb0: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  rr++;.          
cec0: 63 6c 6f 73 65 28 32 29 3b 0a 20 20 20 20 20 20  close(2);.      
ced0: 20 20 20 20 66 64 20 3d 20 64 75 70 28 63 6f 6e      fd = dup(con
cee0: 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  nection);.      
cef0: 20 20 20 20 69 66 28 20 66 64 21 3d 32 20 29 20      if( fd!=2 ) 
cf00: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
cf10: 20 20 63 6c 6f 73 65 28 63 6f 6e 6e 65 63 74 69    close(connecti
cf20: 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  on);.          r
cf30: 65 74 75 72 6e 20 6e 45 72 72 3b 0a 20 20 20 20  eturn nErr;.    
cf40: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
cf50: 20 20 7d 0a 20 20 20 20 2f 2a 20 42 75 72 79 20    }.    /* Bury 
cf60: 64 65 61 64 20 63 68 69 6c 64 72 65 6e 20 2a 2f  dead children */
cf70: 0a 20 20 20 20 77 68 69 6c 65 28 20 77 61 69 74  .    while( wait
cf80: 70 69 64 28 30 2c 20 30 2c 20 57 4e 4f 48 41 4e  pid(0, 0, WNOHAN
cf90: 47 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 6e 63  G)>0 ){.      nc
cfa0: 68 69 6c 64 72 65 6e 2d 2d 3b 0a 20 20 20 20 7d  hildren--;.    }
cfb0: 0a 20 20 7d 0a 20 20 2f 2a 20 4e 4f 54 20 52 45  .  }.  /* NOT RE
cfc0: 41 43 48 45 44 20 2a 2f 20 20 0a 20 20 65 78 69  ACHED */  .  exi
cfd0: 74 28 31 29 3b 0a 7d 0a 0a 0a 69 6e 74 20 6d 61  t(1);.}...int ma
cfe0: 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61  in(int argc, cha
cff0: 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74  r **argv){.  int
d000: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
d010: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
d020: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 63 68 61 72  ounter */.  char
d030: 20 2a 7a 50 65 72 6d 55 73 65 72 20 3d 20 30 3b   *zPermUser = 0;
d040: 20 20 20 20 20 20 2f 2a 20 52 75 6e 20 64 61 65        /* Run dae
d050: 6d 6f 6e 20 77 69 74 68 20 74 68 69 73 20 75 73  mon with this us
d060: 65 72 27 73 20 70 65 72 6d 69 73 73 69 6f 6e 73  er's permissions
d070: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 72 74 20   */.  int iPort 
d080: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
d090: 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 6e 20  /* Implement an 
d0a0: 48 54 54 50 20 73 65 72 76 65 72 20 70 72 6f 63  HTTP server proc
d0b0: 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  ess */.  int use
d0c0: 43 68 72 6f 6f 74 4a 61 69 6c 20 3d 20 31 3b 20  ChrootJail = 1; 
d0d0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73     /* True to us
d0e0: 65 20 61 20 63 68 61 6e 67 65 2d 72 6f 6f 74 20  e a change-root 
d0f0: 6a 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65  jail */..  /* Re
d100: 63 6f 72 64 20 74 68 65 20 74 69 6d 65 20 77 68  cord the time wh
d110: 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 65  en processing be
d120: 67 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 74 69 6d  gins..  */.  tim
d130: 65 28 26 62 65 67 69 6e 54 69 6d 65 29 3b 0a 0a  e(&beginTime);..
d140: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6d 6d 61    /* Parse comma
d150: 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74  nd-line argument
d160: 73 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  s.  */.  while( 
d170: 61 72 67 63 3e 31 20 26 26 20 61 72 67 76 5b 31  argc>1 && argv[1
d180: 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  ][0]=='-' ){.   
d190: 20 63 68 61 72 20 2a 7a 20 3d 20 61 72 67 76 5b   char *z = argv[
d1a0: 31 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 41  1];.    char *zA
d1b0: 72 67 20 3d 20 61 72 67 63 3e 3d 33 20 3f 20 61  rg = argc>=3 ? a
d1c0: 72 67 76 5b 32 5d 20 3a 20 22 30 22 3b 0a 20 20  rgv[2] : "0";.  
d1d0: 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20    if( z[0]=='-' 
d1e0: 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a  && z[1]=='-' ) z
d1f0: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63  ++;.    if( strc
d200: 6d 70 28 7a 2c 22 2d 75 73 65 72 22 29 3d 3d 30  mp(z,"-user")==0
d210: 20 29 7b 0a 20 20 20 20 20 20 7a 50 65 72 6d 55   ){.      zPermU
d220: 73 65 72 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20  ser = zArg;.    
d230: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
d240: 28 7a 2c 22 2d 72 6f 6f 74 22 29 3d 3d 30 20 29  (z,"-root")==0 )
d250: 7b 0a 20 20 20 20 20 20 7a 52 6f 6f 74 20 3d 20  {.      zRoot = 
d260: 7a 41 72 67 3b 0a 20 20 20 20 7d 65 6c 73 65 20  zArg;.    }else 
d270: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6c  if( strcmp(z,"-l
d280: 6f 67 66 69 6c 65 22 29 3d 3d 30 20 29 7b 0a 20  ogfile")==0 ){. 
d290: 20 20 20 20 20 7a 4c 6f 67 46 69 6c 65 20 3d 20       zLogFile = 
d2a0: 7a 41 72 67 3b 0a 20 20 20 20 7d 65 6c 73 65 20  zArg;.    }else 
d2b0: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 68  if( strcmp(z,"-h
d2c0: 74 74 70 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ttps")==0 ){.   
d2d0: 20 20 20 75 73 65 48 74 74 70 73 20 3d 20 61 74     useHttps = at
d2e0: 6f 69 28 7a 41 72 67 29 3b 0a 20 20 20 20 20 20  oi(zArg);.      
d2f0: 7a 48 74 74 70 20 3d 20 75 73 65 48 74 74 70 73  zHttp = useHttps
d300: 20 3f 20 22 68 74 74 70 22 20 3a 20 22 68 74 74   ? "http" : "htt
d310: 70 73 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ps";.    }else i
d320: 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 70  f( strcmp(z, "-p
d330: 6f 72 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ort")==0 ){.    
d340: 20 20 69 50 6f 72 74 20 3d 20 61 74 6f 69 28 7a    iPort = atoi(z
d350: 41 72 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Arg);.    }else 
d360: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d  if( strcmp(z, "-
d370: 6a 61 69 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20  jail")==0 ){.   
d380: 20 20 20 69 66 28 20 61 74 6f 69 28 7a 41 72 67     if( atoi(zArg
d390: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
d3a0: 75 73 65 43 68 72 6f 6f 74 4a 61 69 6c 20 3d 20  useChrootJail = 
d3b0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
d3c0: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
d3d0: 7a 2c 20 22 2d 64 65 62 75 67 22 29 3d 3d 30 20  z, "-debug")==0 
d3e0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 74 6f  ){.      if( ato
d3f0: 69 28 7a 41 72 67 29 20 29 7b 0a 20 20 20 20 20  i(zArg) ){.     
d400: 20 20 20 75 73 65 54 69 6d 65 6f 75 74 20 3d 20     useTimeout = 
d410: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
d420: 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d 61 6c 66  else{.      Malf
d430: 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f  unction(__LINE__
d440: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 61 72 67 75 6d  , "unknown argum
d450: 65 6e 74 3a 20 5b 25 73 5d 22 2c 20 7a 29 3b 0a  ent: [%s]", z);.
d460: 20 20 20 20 7d 0a 20 20 20 20 61 72 67 76 20 2b      }.    argv +
d470: 3d 20 32 3b 0a 20 20 20 20 61 72 67 63 20 2d 3d  = 2;.    argc -=
d480: 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 52   2;.  }.  if( zR
d490: 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 4d 61  oot==0 ){.    Ma
d4a0: 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45  lfunction(__LINE
d4b0: 5f 5f 2c 20 22 6e 6f 20 2d 2d 72 6f 6f 74 20 73  __, "no --root s
d4c0: 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 7d 0a  pecified");.  }.
d4d0: 20 20 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 64    .  /* Change d
d4e0: 69 72 65 63 74 6f 72 69 65 73 20 74 6f 20 74 68  irectories to th
d4f0: 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 48 54  e root of the HT
d500: 54 50 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20  TP filesystem.  
d510: 54 68 65 6e 0a 20 20 2a 2a 20 63 72 65 61 74 65  Then.  ** create
d520: 20 61 20 63 68 72 6f 6f 74 20 6a 61 69 6c 20 74   a chroot jail t
d530: 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  here..  */.  if(
d540: 20 63 68 64 69 72 28 7a 52 6f 6f 74 29 21 3d 30   chdir(zRoot)!=0
d550: 20 29 7b 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74   ){.    Malfunct
d560: 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 63  ion(__LINE__, "c
d570: 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20 74 6f 20  annot change to 
d580: 64 69 72 65 63 74 6f 72 79 20 5b 25 73 5d 22 2c  directory [%s]",
d590: 20 7a 52 6f 6f 74 29 3b 0a 20 20 7d 0a 20 20 0a   zRoot);.  }.  .
d5a0: 20 20 69 66 28 20 7a 50 65 72 6d 55 73 65 72 20    if( zPermUser 
d5b0: 26 26 20 75 73 65 43 68 72 6f 6f 74 4a 61 69 6c  && useChrootJail
d5c0: 20 26 26 20 67 65 74 75 69 64 28 29 3d 3d 30 20   && getuid()==0 
d5d0: 29 7b 0a 20 20 20 20 69 66 28 20 63 68 72 6f 6f  ){.    if( chroo
d5e0: 74 28 22 2e 22 29 3c 30 20 29 7b 0a 20 20 20 20  t(".")<0 ){.    
d5f0: 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f    Malfunction(__
d600: 4c 49 4e 45 5f 5f 2c 20 22 75 6e 61 62 6c 65 20  LINE__, "unable 
d610: 74 6f 20 63 72 65 61 74 65 20 63 68 72 6f 6f 74  to create chroot
d620: 20 6a 61 69 6c 22 29 3b 0a 20 20 20 20 7d 65 6c   jail");.    }el
d630: 73 65 7b 0a 20 20 20 20 20 20 7a 52 6f 6f 74 20  se{.      zRoot 
d640: 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = "";.    }.  }.
d650: 0a 20 20 2f 2a 20 41 63 74 69 76 61 74 65 20 74  .  /* Activate t
d660: 68 65 20 73 65 72 76 65 72 2c 20 69 66 20 72 65  he server, if re
d670: 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28  quested */.  if(
d680: 20 69 50 6f 72 74 20 26 26 20 68 74 74 70 5f 73   iPort && http_s
d690: 65 72 76 65 72 28 69 50 6f 72 74 2c 20 30 29 20  erver(iPort, 0) 
d6a0: 29 7b 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69  ){.    Malfuncti
d6b0: 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 66 61  on(__LINE__, "fa
d6c0: 69 6c 65 64 20 74 6f 20 73 74 61 72 74 20 73 65  iled to start se
d6d0: 72 76 65 72 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rver");.  }..  /
d6e0: 2a 20 44 72 6f 70 20 72 6f 6f 74 20 70 72 69 76  * Drop root priv
d6f0: 69 6c 65 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  ileges..  */.  i
d700: 66 28 20 7a 50 65 72 6d 55 73 65 72 20 29 7b 0a  f( zPermUser ){.
d710: 20 20 20 20 73 74 72 75 63 74 20 70 61 73 73 77      struct passw
d720: 64 20 2a 70 77 64 20 3d 20 67 65 74 70 77 6e 61  d *pwd = getpwna
d730: 6d 28 7a 50 65 72 6d 55 73 65 72 29 3b 0a 20 20  m(zPermUser);.  
d740: 20 20 69 66 28 20 70 77 64 20 29 7b 0a 20 20 20    if( pwd ){.   
d750: 20 20 20 73 65 74 67 69 64 28 70 77 64 2d 3e 70     setgid(pwd->p
d760: 77 5f 67 69 64 29 3b 0a 20 20 20 20 20 20 73 65  w_gid);.      se
d770: 74 75 69 64 28 70 77 64 2d 3e 70 77 5f 75 69 64  tuid(pwd->pw_uid
d780: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
d790: 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28      Malfunction(
d7a0: 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 6e 6f 20 73 75  __LINE__, "no su
d7b0: 63 68 20 75 73 65 72 20 5b 25 73 5d 22 2c 20 7a  ch user [%s]", z
d7c0: 50 65 72 6d 55 73 65 72 29 3b 0a 20 20 20 20 7d  PermUser);.    }
d7d0: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 75 69  .  }.  if( getui
d7e0: 64 28 29 3d 3d 30 20 29 7b 0a 20 20 20 20 4d 61  d()==0 ){.    Ma
d7f0: 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45  lfunction(__LINE
d800: 5f 5f 2c 20 22 63 61 6e 6e 6f 74 20 72 75 6e 20  __, "cannot run 
d810: 61 73 20 72 6f 6f 74 22 29 3b 0a 20 20 7d 0a 0a  as root");.  }..
d820: 20 20 2f 2a 20 47 65 74 20 74 68 65 20 49 50 20    /* Get the IP 
d830: 61 64 64 72 65 73 73 20 66 72 6f 6d 20 77 68 65  address from whe
d840: 6e 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 72  n the request or
d850: 69 67 69 6e 61 74 65 73 0a 20 20 2a 2f 0a 20 20  iginates.  */.  
d860: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 6f 63  {.    struct soc
d870: 6b 61 64 64 72 5f 69 6e 20 72 65 6d 6f 74 65 4e  kaddr_in remoteN
d880: 61 6d 65 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  ame;.    unsigne
d890: 64 20 69 6e 74 20 73 69 7a 65 20 3d 20 73 69 7a  d int size = siz
d8a0: 65 6f 66 28 73 74 72 75 63 74 20 73 6f 63 6b 61  eof(struct socka
d8b0: 64 64 72 5f 69 6e 29 3b 0a 20 20 20 20 69 66 28  ddr_in);.    if(
d8c0: 20 67 65 74 70 65 65 72 6e 61 6d 65 28 30 2c 20   getpeername(0, 
d8d0: 28 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72  (struct sockaddr
d8e0: 2a 29 26 72 65 6d 6f 74 65 4e 61 6d 65 2c 20 26  *)&remoteName, &
d8f0: 73 69 7a 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  size)>=0 ){.    
d900: 20 20 7a 52 65 6d 6f 74 65 41 64 64 72 20 3d 20    zRemoteAddr = 
d910: 53 74 72 44 75 70 28 69 6e 65 74 5f 6e 74 6f 61  StrDup(inet_ntoa
d920: 28 72 65 6d 6f 74 65 4e 61 6d 65 2e 73 69 6e 5f  (remoteName.sin_
d930: 61 64 64 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20  addr));.    }.  
d940: 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  }..  /* Process 
d950: 74 68 65 20 69 6e 70 75 74 20 73 74 72 65 61 6d  the input stream
d960: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
d970: 3c 31 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <100; i++){.    
d980: 50 72 6f 63 65 73 73 4f 6e 65 52 65 71 75 65 73  ProcessOneReques
d990: 74 28 30 29 3b 0a 20 20 7d 0a 20 20 50 72 6f 63  t(0);.  }.  Proc
d9a0: 65 73 73 4f 6e 65 52 65 71 75 65 73 74 28 31 29  essOneRequest(1)
d9b0: 3b 0a 20 20 65 78 69 74 28 30 29 3b 0a 7d 0a     ;.  exit(0);.}.