Documentation Source Text

Hex Artifact Content
Login

Artifact 0f78441e2de25641b06eda3079f6de1e1d126e52:


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 0a 2f 2a 0a 2a 2a 20 43 6f 6e  endif../*.** Con
0b60: 66 69 67 75 72 65 20 74 68 65 20 73 65 72 76 65  figure the serve
0b70: 72 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  r by setting the
0b80: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
0b90: 73 20 61 6e 64 20 72 65 63 6f 6d 70 69 6c 69 6e  s and recompilin
0ba0: 67 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 44 45  g..*/.#ifndef DE
0bb0: 46 41 55 4c 54 5f 50 4f 52 54 0a 23 64 65 66 69  FAULT_PORT.#defi
0bc0: 6e 65 20 44 45 46 41 55 4c 54 5f 50 4f 52 54 20  ne DEFAULT_PORT 
0bd0: 22 38 30 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e  "80".#endif.#ifn
0be0: 64 65 66 20 4d 41 58 5f 43 4f 4e 54 45 4e 54 5f  def MAX_CONTENT_
0bf0: 4c 45 4e 47 54 48 0a 23 64 65 66 69 6e 65 20 4d  LENGTH.#define M
0c00: 41 58 5f 43 4f 4e 54 45 4e 54 5f 4c 45 4e 47 54  AX_CONTENT_LENGT
0c10: 48 20 39 30 30 30 30 30 30 0a 23 65 6e 64 69 66  H 9000000.#endif
0c20: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 72 72  .../*.** The err
0c30: 6f 72 20 6e 75 6d 62 65 72 20 66 72 6f 6d 20 73  or number from s
0c40: 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a  ystem calls..*/.
0c50: 65 78 74 65 72 6e 20 69 6e 74 20 65 72 72 6e 6f  extern int errno
0c60: 3b 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 72 65 63 6f  ;../*.** We reco
0c70: 72 64 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 73  rd most of the s
0c80: 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tate information
0c90: 20 61 73 20 67 6c 6f 62 61 6c 20 76 61 72 69 61   as global varia
0ca0: 62 6c 65 73 2e 20 20 54 68 69 73 0a 2a 2a 20 73  bles.  This.** s
0cb0: 61 76 65 73 20 68 61 76 69 6e 67 20 74 6f 20 70  aves having to p
0cc0: 61 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ass information 
0cd0: 74 6f 20 73 75 62 72 6f 75 74 69 6e 65 73 20 61  to subroutines a
0ce0: 73 20 70 61 72 61 6d 65 74 65 72 73 2c 20 61 6e  s parameters, an
0cf0: 64 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 65  d.** makes the e
0d00: 78 65 63 75 74 61 62 6c 65 20 73 6d 61 6c 6c 65  xecutable smalle
0d10: 72 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  r....*/.static c
0d20: 68 61 72 20 2a 7a 52 6f 6f 74 20 3d 20 30 3b 20  har *zRoot = 0; 
0d30: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
0d40: 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68   directory of th
0d50: 65 20 77 65 62 73 69 74 65 20 2a 2f 0a 73 74 61  e website */.sta
0d60: 74 69 63 20 63 68 61 72 20 2a 7a 54 6d 70 4e 61  tic char *zTmpNa
0d70: 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  m = 0;        /*
0d80: 20 4e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f   Name of a tempo
0d90: 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 73 74 61  rary file */.sta
0da0: 74 69 63 20 63 68 61 72 20 7a 54 6d 70 4e 61 6d  tic char zTmpNam
0db0: 42 75 66 5b 35 30 30 5d 3b 20 20 20 20 20 2f 2a  Buf[500];     /*
0dc0: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
0dd0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
0de0: 65 6e 61 6d 65 20 2a 2f 0a 73 74 61 74 69 63 20  ename */.static 
0df0: 63 68 61 72 20 2a 7a 50 72 6f 74 6f 63 6f 6c 20  char *zProtocol 
0e00: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  = 0;      /* The
0e10: 20 70 72 6f 74 6f 63 6f 6c 20 62 65 69 6e 67 20   protocol being 
0e20: 75 73 69 6e 67 20 62 79 20 74 68 65 20 62 72 6f  using by the bro
0e30: 77 73 65 72 20 2a 2f 0a 73 74 61 74 69 63 20 63  wser */.static c
0e40: 68 61 72 20 2a 7a 4d 65 74 68 6f 64 20 3d 20 30  har *zMethod = 0
0e50: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
0e60: 6d 65 74 68 6f 64 2e 20 20 4d 75 73 74 20 62 65  method.  Must be
0e70: 20 47 45 54 20 2a 2f 0a 73 74 61 74 69 63 20 63   GET */.static c
0e80: 68 61 72 20 2a 7a 53 63 72 69 70 74 20 3d 20 30  har *zScript = 0
0e90: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
0ea0: 6f 62 6a 65 63 74 20 74 6f 20 72 65 74 72 69 65  object to retrie
0eb0: 76 65 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  ve */.static cha
0ec0: 72 20 2a 7a 52 65 61 6c 53 63 72 69 70 74 20 3d  r *zRealScript =
0ed0: 20 30 3b 20 20 20 20 2f 2a 20 54 68 65 20 6f 62   0;    /* The ob
0ee0: 6a 65 63 74 20 74 6f 20 72 65 74 72 69 65 76 65  ject to retrieve
0ef0: 2e 20 20 53 61 6d 65 20 61 73 20 7a 53 63 72 69  .  Same as zScri
0f00: 70 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  pt.             
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f20: 20 20 20 20 2a 2a 20 65 78 63 65 70 74 20 6d 69      ** except mi
0f30: 67 68 74 20 68 61 76 65 20 22 2f 69 6e 64 65 78  ght have "/index
0f40: 2e 68 74 6d 6c 22 20 61 70 70 65 6e 64 65 64 20  .html" appended 
0f50: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
0f60: 7a 48 6f 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  zHome = 0;      
0f70: 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63      /* The direc
0f80: 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
0f90: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 73 74 61 74 69  content */.stati
0fa0: 63 20 63 68 61 72 20 2a 7a 51 75 65 72 79 53 74  c char *zQuerySt
0fb0: 72 69 6e 67 20 3d 20 30 3b 20 20 20 2f 2a 20 54  ring = 0;   /* T
0fc0: 68 65 20 71 75 65 72 79 20 73 74 72 69 6e 67 20  he query string 
0fd0: 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  on the end of th
0fe0: 65 20 6e 61 6d 65 20 2a 2f 0a 73 74 61 74 69 63  e name */.static
0ff0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 30   char *zFile = 0
1000: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
1010: 65 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68  e filename of th
1020: 65 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74 72  e object to retr
1030: 69 65 76 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  ieve */.static i
1040: 6e 74 20 6c 65 6e 46 69 6c 65 20 3d 20 30 3b 20  nt lenFile = 0; 
1050: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
1060: 74 68 20 6f 66 20 74 68 65 20 7a 46 69 6c 65 20  th of the zFile 
1070: 6e 61 6d 65 20 2a 2f 0a 73 74 61 74 69 63 20 63  name */.static c
1080: 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 20 20  har *zDir = 0;  
1090: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
10a0: 20 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72   of the director
10b0: 79 20 68 6f 6c 64 69 6e 67 20 7a 46 69 6c 65 20  y holding zFile 
10c0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
10d0: 7a 50 61 74 68 49 6e 66 6f 20 3d 20 30 3b 20 20  zPathInfo = 0;  
10e0: 20 20 20 20 2f 2a 20 50 61 72 74 20 6f 66 20 74      /* Part of t
10f0: 68 65 20 70 61 74 68 6e 61 6d 65 20 70 61 73 74  he pathname past
1100: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 73 74 61   the file */.sta
1110: 74 69 63 20 63 68 61 72 20 2a 7a 41 67 65 6e 74  tic char *zAgent
1120: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
1130: 20 57 68 61 74 20 74 79 70 65 20 69 66 20 62 72   What type if br
1140: 6f 77 73 65 72 20 69 73 20 6d 61 6b 69 6e 67 20  owser is making 
1150: 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 73 74  this query */.st
1160: 61 74 69 63 20 63 68 61 72 20 2a 7a 53 65 72 76  atic char *zServ
1170: 65 72 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f  erName = 0;    /
1180: 2a 20 54 68 65 20 6e 61 6d 65 20 61 66 74 65 72  * The name after
1190: 20 74 68 65 20 68 74 74 70 3a 2f 2f 20 2a 2f 0a   the http:// */.
11a0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 53 65  static char *zSe
11b0: 72 76 65 72 50 6f 72 74 20 3d 20 30 3b 20 20 20  rverPort = 0;   
11c0: 20 2f 2a 20 54 68 65 20 70 6f 72 74 20 6e 75 6d   /* The port num
11d0: 62 65 72 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  ber */.static ch
11e0: 61 72 20 2a 7a 43 6f 6f 6b 69 65 20 3d 20 30 3b  ar *zCookie = 0;
11f0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6f 6b 69          /* Cooki
1200: 65 73 20 72 65 70 6f 72 74 65 64 20 77 69 74 68  es reported with
1210: 20 74 68 65 20 72 65 71 75 65 73 74 20 2a 2f 0a   the request */.
1220: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 48 74  static char *zHt
1230: 74 70 48 6f 73 74 20 3d 20 30 3b 20 20 20 20 20  tpHost = 0;     
1240: 20 2f 2a 20 4e 61 6d 65 20 61 63 63 6f 72 64 69   /* Name accordi
1250: 6e 67 20 74 6f 20 74 68 65 20 77 65 62 20 62 72  ng to the web br
1260: 6f 77 73 65 72 20 2a 2f 0a 73 74 61 74 69 63 20  owser */.static 
1270: 63 68 61 72 20 2a 7a 52 65 61 6c 50 6f 72 74 20  char *zRealPort 
1280: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  = 0;      /* The
1290: 20 72 65 61 6c 20 54 43 50 20 70 6f 72 74 20 77   real TCP port w
12a0: 68 65 6e 20 72 75 6e 6e 69 6e 67 20 61 73 20 64  hen running as d
12b0: 61 65 6d 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20  aemon */.static 
12c0: 63 68 61 72 20 2a 7a 52 65 6d 6f 74 65 41 64 64  char *zRemoteAdd
12d0: 72 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 50 20  r = 0;    /* IP 
12e0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 72  address of the r
12f0: 65 71 75 65 73 74 20 2a 2f 0a 73 74 61 74 69 63  equest */.static
1300: 20 63 68 61 72 20 2a 7a 52 65 66 65 72 65 72 20   char *zReferer 
1310: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  = 0;       /* Na
1320: 6d 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  me of the page t
1330: 68 61 74 20 72 65 66 65 72 65 64 20 74 6f 20 75  hat refered to u
1340: 73 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  s */.static char
1350: 20 2a 7a 41 63 63 65 70 74 20 3d 20 30 3b 20 20   *zAccept = 0;  
1360: 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 66 6f        /* What fo
1370: 72 6d 61 74 73 20 77 69 6c 6c 20 62 65 20 61 63  rmats will be ac
1380: 63 65 70 74 65 64 20 2a 2f 0a 73 74 61 74 69 63  cepted */.static
1390: 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 4c   char *zContentL
13a0: 65 6e 67 74 68 20 3d 20 30 3b 20 2f 2a 20 43 6f  ength = 0; /* Co
13b0: 6e 74 65 6e 74 20 6c 65 6e 67 74 68 20 72 65 70  ntent length rep
13c0: 6f 72 74 65 64 20 69 6e 20 74 68 65 20 68 65 61  orted in the hea
13d0: 64 65 72 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  der */.static ch
13e0: 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 54 79 70 65  ar *zContentType
13f0: 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 6e 74 65   = 0;   /* Conte
1400: 6e 74 20 74 79 70 65 20 72 65 70 6f 72 74 65 64  nt type reported
1410: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 2a   in the header *
1420: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a  /.static char *z
1430: 51 75 65 72 79 53 75 66 66 69 78 20 3d 20 30 3b  QuerySuffix = 0;
1440: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 74 20 6f     /* The part o
1450: 66 20 74 68 65 20 55 52 4c 20 61 66 74 65 72 20  f the URL after 
1460: 74 68 65 20 66 69 72 73 74 20 3f 20 2a 2f 0a 73  the first ? */.s
1470: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 41 75 74  tatic char *zAut
1480: 68 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20  hType = 0;      
1490: 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e  /* Authorization
14a0: 20 74 79 70 65 20 28 62 61 73 69 63 20 6f 72 20   type (basic or 
14b0: 64 69 67 65 73 74 29 20 2a 2f 0a 73 74 61 74 69  digest) */.stati
14c0: 63 20 63 68 61 72 20 2a 7a 41 75 74 68 41 72 67  c char *zAuthArg
14d0: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41   = 0;       /* A
14e0: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 76 61 6c  uthorization val
14f0: 75 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  ues */.static ch
1500: 61 72 20 2a 7a 52 65 6d 6f 74 65 55 73 65 72 20  ar *zRemoteUser 
1510: 3d 20 30 3b 20 20 20 20 2f 2a 20 52 45 4d 4f 54  = 0;    /* REMOT
1520: 45 5f 55 53 45 52 20 73 65 74 20 62 79 20 61 75  E_USER set by au
1530: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 6d 6f 64 75  thorization modu
1540: 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  le */.static int
1550: 20 6e 49 6e 20 3d 20 30 3b 20 20 20 20 20 20 20   nIn = 0;       
1560: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1570: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 69 6e 70   of bytes of inp
1580: 75 74 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ut */.static int
1590: 20 6e 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20   nOut = 0;      
15a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
15b0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6f 75 74   of bytes of out
15c0: 70 75 74 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  put */.static ch
15d0: 61 72 20 7a 52 65 70 6c 79 53 74 61 74 75 73 5b  ar zReplyStatus[
15e0: 34 5d 3b 20 20 20 20 20 2f 2a 20 52 65 70 6c 79  4];     /* Reply
15f0: 20 73 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a   status code */.
1600: 73 74 61 74 69 63 20 69 6e 74 20 73 74 61 74 75  static int statu
1610: 73 53 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20  sSent = 0;      
1620: 20 2f 2a 20 54 72 75 65 20 61 66 74 65 72 20 73   /* True after s
1630: 74 61 74 75 73 20 6c 69 6e 65 20 69 73 20 73 65  tatus line is se
1640: 6e 74 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  nt */.static cha
1650: 72 20 2a 7a 4c 6f 67 46 69 6c 65 20 3d 20 30 3b  r *zLogFile = 0;
1660: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 6f         /* Log to
1670: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 73 74   this file */.st
1680: 61 74 69 63 20 69 6e 74 20 64 65 62 75 67 46 6c  atic int debugFl
1690: 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  ag = 0;        /
16a0: 2a 20 54 72 75 65 20 69 66 20 62 65 69 6e 67 20  * True if being 
16b0: 64 65 62 75 67 67 65 64 20 2a 2f 0a 73 74 61 74  debugged */.stat
16c0: 69 63 20 74 69 6d 65 5f 74 20 62 65 67 69 6e 54  ic time_t beginT
16d0: 69 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ime;         /* 
16e0: 54 69 6d 65 20 77 68 65 6e 20 74 68 69 73 20 70  Time when this p
16f0: 72 6f 63 65 73 73 20 73 74 61 72 74 73 20 2a 2f  rocess starts */
1700: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73  .static int clos
1710: 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 30 3b  eConnection = 0;
1720: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 6e    /* True to sen
1730: 64 20 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c  d Connection: cl
1740: 6f 73 65 20 69 6e 20 72 65 70 6c 79 20 2a 2f 0a  ose in reply */.
1750: 73 74 61 74 69 63 20 69 6e 74 20 6e 52 65 71 75  static int nRequ
1760: 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  est = 0;        
1770: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
1780: 71 75 65 73 74 73 20 70 72 6f 63 65 73 73 65 64  quests processed
1790: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f   */.static int o
17a0: 6d 69 74 4c 6f 67 20 3d 20 30 3b 20 20 20 20 20  mitLog = 0;     
17b0: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6d       /* Do not m
17c0: 61 6b 65 20 6c 6f 67 66 69 6c 65 20 65 6e 74 72  ake logfile entr
17d0: 69 65 73 20 69 66 20 74 72 75 65 20 2a 2f 0a 73  ies if true */.s
17e0: 74 61 74 69 63 20 69 6e 74 20 75 73 65 48 74 74  tatic int useHtt
17f0: 70 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ps = 0;         
1800: 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 48  /* True to use H
1810: 54 54 50 53 3a 20 69 6e 73 74 65 61 64 20 6f 66  TTPS: instead of
1820: 20 48 54 54 50 3a 20 2a 2f 0a 73 74 61 74 69 63   HTTP: */.static
1830: 20 63 68 61 72 20 2a 7a 48 74 74 70 20 3d 20 22   char *zHttp = "
1840: 68 74 74 70 22 3b 20 20 20 20 20 2f 2a 20 68 74  http";     /* ht
1850: 74 70 20 6f 72 20 68 74 74 70 73 20 2a 2f 0a 0a  tp or https */..
1860: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 65 76 65  /*.** Change eve
1870: 72 79 20 73 70 61 63 65 20 6f 72 20 75 6e 70 72  ry space or unpr
1880: 69 6e 74 61 62 6c 65 20 63 68 61 72 61 63 74 65  intable characte
1890: 72 20 69 6e 20 74 68 65 20 7a 41 67 65 6e 74 5b  r in the zAgent[
18a0: 5d 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 74 6f  ] string.** into
18b0: 20 61 6e 20 5f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   an _..**.** If 
18c0: 74 68 65 20 75 73 65 72 20 61 67 65 6e 74 20 73  the user agent s
18d0: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 63  tring contains c
18e0: 65 72 74 61 69 6e 20 70 72 6f 68 69 62 69 74 65  ertain prohibite
18f0: 64 20 73 74 72 69 6e 67 2c 20 74 68 65 6e 0a 2a  d string, then.*
1900: 2a 20 65 78 69 74 20 69 6d 6d 65 64 69 61 74 65  * exit immediate
1910: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
1920: 69 64 20 46 69 78 75 70 55 73 65 72 41 67 65 6e  id FixupUserAgen
1930: 74 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69  t(void){.  int i
1940: 3b 0a 20 20 69 66 28 20 7a 41 67 65 6e 74 3d 3d  ;.  if( zAgent==
1950: 30 20 7c 7c 20 7a 41 67 65 6e 74 5b 30 5d 3d 3d  0 || zAgent[0]==
1960: 30 20 29 20 7a 41 67 65 6e 74 20 3d 20 22 2a 22  0 ) zAgent = "*"
1970: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 41 67  ;.  for(i=0; zAg
1980: 65 6e 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ent[i]; i++){.  
1990: 20 20 69 6e 74 20 63 20 3d 20 7a 41 67 65 6e 74    int c = zAgent
19a0: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 63 3c 27  [i];.    if( c<'
19b0: 21 27 20 7c 7c 20 63 3e 27 7e 27 20 20 29 7b 20  !' || c>'~'  ){ 
19c0: 7a 41 67 65 6e 74 5b 69 5d 20 3d 20 27 5f 27 3b  zAgent[i] = '_';
19d0: 20 7d 0a 20 20 7d 0a 23 69 66 20 30 0a 20 20 69   }.  }.#if 0.  i
19e0: 66 28 20 73 74 72 6e 63 6d 70 28 7a 41 67 65 6e  f( strncmp(zAgen
19f0: 74 2c 22 6d 73 6e 62 6f 74 22 2c 36 29 3d 3d 30  t,"msnbot",6)==0
1a00: 20 29 7b 0a 20 20 20 20 65 78 69 74 28 30 29 3b   ){.    exit(0);
1a10: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f  .  }.#endif.  fo
1a20: 72 28 69 3d 30 3b 20 7a 41 67 65 6e 74 5b 69 5d  r(i=0; zAgent[i]
1a30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1a40: 7a 41 67 65 6e 74 5b 69 5d 3d 3d 27 57 27 20 26  zAgent[i]=='W' &
1a50: 26 20 73 74 72 6e 63 6d 70 28 26 7a 41 67 65 6e  & strncmp(&zAgen
1a60: 74 5b 69 5d 2c 22 57 69 6e 64 6f 77 73 5f 39 22  t[i],"Windows_9"
1a70: 2c 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,9)==0 ){.      
1a80: 65 78 69 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20  exit(0);.    }. 
1a90: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
1aa0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
1ab0: 20 6c 6f 67 20 66 69 6c 65 2e 20 20 49 66 20 74   log file.  If t
1ac0: 68 65 20 48 54 54 50 20 63 6f 6e 6e 65 63 74 69  he HTTP connecti
1ad0: 6f 6e 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20  on should be.** 
1ae0: 63 6c 6f 73 65 64 2c 20 74 68 65 6e 20 74 65 72  closed, then ter
1af0: 6d 69 6e 61 74 65 20 74 68 69 73 20 70 72 6f 63  minate this proc
1b00: 65 73 73 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ess.  Otherwise 
1b10: 72 65 74 75 72 6e 2e 0a 2a 2f 0a 73 74 61 74 69  return..*/.stati
1b20: 63 20 76 6f 69 64 20 4d 61 6b 65 4c 6f 67 45 6e  c void MakeLogEn
1b30: 74 72 79 28 69 6e 74 20 61 29 7b 0a 20 20 46 49  try(int a){.  FI
1b40: 4c 45 20 2a 6c 6f 67 3b 0a 20 20 69 66 28 20 7a  LE *log;.  if( z
1b50: 54 6d 70 4e 61 6d 20 29 7b 0a 20 20 20 20 75 6e  TmpNam ){.    un
1b60: 6c 69 6e 6b 28 7a 54 6d 70 4e 61 6d 29 3b 0a 20  link(zTmpNam);. 
1b70: 20 7d 0a 20 20 69 66 28 20 7a 4c 6f 67 46 69 6c   }.  if( zLogFil
1b80: 65 20 26 26 20 21 6f 6d 69 74 4c 6f 67 20 29 7b  e && !omitLog ){
1b90: 0a 20 20 20 20 74 69 6d 65 5f 74 20 6e 6f 77 3b  .    time_t now;
1ba0: 0a 20 20 20 20 73 74 72 75 63 74 20 74 6d 20 2a  .    struct tm *
1bb0: 70 54 6d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  pTm;.    struct 
1bc0: 74 6d 73 20 73 54 6d 73 3b 0a 20 20 20 20 64 6f  tms sTms;.    do
1bd0: 75 62 6c 65 20 72 53 63 61 6c 65 3b 0a 20 20 20  uble rScale;.   
1be0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72   int i;.    char
1bf0: 20 7a 44 61 74 65 5b 32 30 30 5d 3b 0a 20 20 20   zDate[200];.   
1c00: 20 63 68 61 72 20 2a 7a 52 4d 20 3d 20 7a 52 65   char *zRM = zRe
1c10: 6d 6f 74 65 55 73 65 72 20 3f 20 7a 52 65 6d 6f  moteUser ? zRemo
1c20: 74 65 55 73 65 72 20 3a 20 22 2a 22 3b 0a 0a 20  teUser : "*";.. 
1c30: 20 20 20 69 66 28 20 7a 53 63 72 69 70 74 3d 3d     if( zScript==
1c40: 30 20 7c 7c 20 7a 53 63 72 69 70 74 5b 30 5d 3d  0 || zScript[0]=
1c50: 3d 30 20 29 20 7a 53 63 72 69 70 74 20 3d 20 22  =0 ) zScript = "
1c60: 2a 22 3b 0a 20 20 20 20 69 66 28 20 7a 52 65 6d  *";.    if( zRem
1c70: 6f 74 65 41 64 64 72 3d 3d 30 20 7c 7c 20 7a 52  oteAddr==0 || zR
1c80: 65 6d 6f 74 65 41 64 64 72 5b 30 5d 3d 3d 30 20  emoteAddr[0]==0 
1c90: 29 20 7a 52 65 6d 6f 74 65 41 64 64 72 20 3d 20  ) zRemoteAddr = 
1ca0: 22 2a 22 3b 0a 20 20 20 20 69 66 28 20 7a 48 74  "*";.    if( zHt
1cb0: 74 70 48 6f 73 74 3d 3d 30 20 7c 7c 20 7a 48 74  tpHost==0 || zHt
1cc0: 74 70 48 6f 73 74 5b 30 5d 3d 3d 30 20 29 20 7a  tpHost[0]==0 ) z
1cd0: 48 74 74 70 48 6f 73 74 20 3d 20 22 2a 22 3b 0a  HttpHost = "*";.
1ce0: 20 20 20 20 69 66 28 20 7a 52 65 66 65 72 65 72      if( zReferer
1cf0: 3d 3d 30 20 7c 7c 20 7a 52 65 66 65 72 65 72 5b  ==0 || zReferer[
1d00: 30 5d 3d 3d 30 20 29 20 7a 52 65 66 65 72 65 72  0]==0 ) zReferer
1d10: 20 3d 20 22 2a 22 3b 0a 20 20 20 20 66 6f 72 28   = "*";.    for(
1d20: 69 3d 30 3b 20 7a 52 65 66 65 72 65 72 5b 69 5d  i=0; zReferer[i]
1d30: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69  ; i++){ .      i
1d40: 66 28 20 69 73 73 70 61 63 65 28 7a 52 65 66 65  f( isspace(zRefe
1d50: 72 65 72 5b 69 5d 29 20 29 7b 20 7a 52 65 66 65  rer[i]) ){ zRefe
1d60: 72 65 72 20 3d 20 22 2a 22 3b 20 62 72 65 61 6b  rer = "*"; break
1d70: 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ; }.    }.    if
1d80: 28 20 7a 41 67 65 6e 74 3d 3d 30 20 7c 7c 20 7a  ( zAgent==0 || z
1d90: 41 67 65 6e 74 5b 30 5d 3d 3d 30 20 29 20 7a 41  Agent[0]==0 ) zA
1da0: 67 65 6e 74 20 3d 20 22 2a 22 3b 0a 20 20 20 20  gent = "*";.    
1db0: 74 69 6d 65 28 26 6e 6f 77 29 3b 0a 20 20 20 20  time(&now);.    
1dc0: 70 54 6d 20 3d 20 6c 6f 63 61 6c 74 69 6d 65 28  pTm = localtime(
1dd0: 26 6e 6f 77 29 3b 0a 20 20 20 20 73 74 72 66 74  &now);.    strft
1de0: 69 6d 65 28 7a 44 61 74 65 2c 20 73 69 7a 65 6f  ime(zDate, sizeo
1df0: 66 28 7a 44 61 74 65 29 2c 20 22 25 59 2d 25 6d  f(zDate), "%Y-%m
1e00: 2d 25 64 20 25 48 3a 25 4d 3a 25 53 22 2c 20 70  -%d %H:%M:%S", p
1e10: 54 6d 29 3b 0a 20 20 20 20 74 69 6d 65 73 28 26  Tm);.    times(&
1e20: 73 54 6d 73 29 3b 0a 20 20 20 20 72 53 63 61 6c  sTms);.    rScal
1e30: 65 20 3d 20 31 2e 30 2f 28 64 6f 75 62 6c 65 29  e = 1.0/(double)
1e40: 73 79 73 63 6f 6e 66 28 5f 53 43 5f 43 4c 4b 5f  sysconf(_SC_CLK_
1e50: 54 43 4b 29 3b 0a 20 20 20 20 63 68 64 69 72 28  TCK);.    chdir(
1e60: 7a 52 6f 6f 74 5b 30 5d 20 3f 20 7a 52 6f 6f 74  zRoot[0] ? zRoot
1e70: 20 3a 20 22 2f 22 29 3b 0a 20 20 20 20 69 66 28   : "/");.    if(
1e80: 20 28 6c 6f 67 20 3d 20 66 6f 70 65 6e 28 7a 4c   (log = fopen(zL
1e90: 6f 67 46 69 6c 65 2c 22 61 22 29 29 21 3d 30 20  ogFile,"a"))!=0 
1ea0: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
1eb0: 28 6c 6f 67 2c 20 22 25 73 20 25 73 20 25 73 3a  (log, "%s %s %s:
1ec0: 2f 2f 25 73 25 73 20 25 73 20 25 73 20 25 64 20  //%s%s %s %s %d 
1ed0: 25 64 20 25 67 20 25 67 20 25 67 20 25 67 20 25  %d %g %g %g %g %
1ee0: 64 20 25 64 20 25 73 20 25 73 5c 6e 22 2c 20 0a  d %d %s %s\n", .
1ef0: 20 20 20 20 20 20 20 20 20 20 7a 44 61 74 65 2c            zDate,
1f00: 20 7a 52 65 6d 6f 74 65 41 64 64 72 2c 20 7a 48   zRemoteAddr, zH
1f10: 74 74 70 2c 20 7a 48 74 74 70 48 6f 73 74 2c 20  ttp, zHttpHost, 
1f20: 7a 53 63 72 69 70 74 2c 20 7a 52 65 66 65 72 65  zScript, zRefere
1f30: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 52 65  r,.          zRe
1f40: 70 6c 79 53 74 61 74 75 73 2c 20 6e 49 6e 2c 20  plyStatus, nIn, 
1f50: 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20  nOut,.          
1f60: 72 53 63 61 6c 65 2a 73 54 6d 73 2e 74 6d 73 5f  rScale*sTms.tms_
1f70: 75 74 69 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  utime,.         
1f80: 20 72 53 63 61 6c 65 2a 73 54 6d 73 2e 74 6d 73   rScale*sTms.tms
1f90: 5f 73 74 69 6d 65 2c 0a 20 20 20 20 20 20 20 20  _stime,.        
1fa0: 20 20 72 53 63 61 6c 65 2a 73 54 6d 73 2e 74 6d    rScale*sTms.tm
1fb0: 73 5f 63 75 74 69 6d 65 2c 0a 20 20 20 20 20 20  s_cutime,.      
1fc0: 20 20 20 20 72 53 63 61 6c 65 2a 73 54 6d 73 2e      rScale*sTms.
1fd0: 74 6d 73 5f 63 73 74 69 6d 65 2c 0a 20 20 20 20  tms_cstime,.    
1fe0: 20 20 20 20 20 20 28 69 6e 74 29 28 6e 6f 77 20        (int)(now 
1ff0: 2d 20 62 65 67 69 6e 54 69 6d 65 29 2c 0a 20 20  - beginTime),.  
2000: 20 20 20 20 20 20 20 20 6e 52 65 71 75 65 73 74          nRequest
2010: 2c 20 7a 41 67 65 6e 74 2c 20 7a 52 4d 0a 20 20  , zAgent, zRM.  
2020: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 66 63 6c      );.      fcl
2030: 6f 73 65 28 6c 6f 67 29 3b 0a 20 20 20 20 20 20  ose(log);.      
2040: 6e 49 6e 20 3d 20 6e 4f 75 74 20 3d 20 30 3b 0a  nIn = nOut = 0;.
2050: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2060: 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20  closeConnection 
2070: 29 7b 0a 20 20 20 20 65 78 69 74 28 61 29 3b 0a  ){.    exit(a);.
2080: 20 20 7d 0a 20 20 73 74 61 74 75 73 53 65 6e 74    }.  statusSent
2090: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41   = 0;.}../*.** A
20a0: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 73  llocate memory s
20b0: 61 66 65 6c 79 0a 2a 2f 0a 73 74 61 74 69 63 20  afely.*/.static 
20c0: 63 68 61 72 20 2a 53 61 66 65 4d 61 6c 6c 6f 63  char *SafeMalloc
20d0: 28 20 69 6e 74 20 73 69 7a 65 20 29 7b 0a 20 20  ( int size ){.  
20e0: 63 68 61 72 20 2a 70 3b 0a 0a 20 20 70 20 3d 20  char *p;..  p = 
20f0: 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 73 69  (char*)malloc(si
2100: 7a 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ze);.  if( p==0 
2110: 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28 7a 52  ){.    strcpy(zR
2120: 65 70 6c 79 53 74 61 74 75 73 2c 20 22 39 39 38  eplyStatus, "998
2130: 22 29 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f 67 45  ");.    MakeLogE
2140: 6e 74 72 79 28 31 29 3b 0a 20 20 20 20 65 78 69  ntry(1);.    exi
2150: 74 28 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  t(1);.  }.  retu
2160: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn p;.}../*.** S
2170: 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
2180: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
2190: 61 62 6c 65 20 7a 56 61 72 20 74 6f 20 7a 56 61  able zVar to zVa
21a0: 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lue..*/.static v
21b0: 6f 69 64 20 53 65 74 45 6e 76 28 63 6f 6e 73 74  oid SetEnv(const
21c0: 20 63 68 61 72 20 2a 7a 56 61 72 2c 20 63 6f 6e   char *zVar, con
21d0: 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 29  st char *zValue)
21e0: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  {.  char *z;.  i
21f0: 6e 74 20 6c 65 6e 3b 0a 20 20 69 66 28 20 7a 56  nt len;.  if( zV
2200: 61 6c 75 65 3d 3d 30 20 29 20 7a 56 61 6c 75 65  alue==0 ) zValue
2210: 3d 22 22 3b 0a 20 20 6c 65 6e 20 3d 20 73 74 72  ="";.  len = str
2220: 6c 65 6e 28 7a 56 61 72 29 20 2b 20 73 74 72 6c  len(zVar) + strl
2230: 65 6e 28 7a 56 61 6c 75 65 29 20 2b 20 32 3b 0a  en(zValue) + 2;.
2240: 20 20 7a 20 3d 20 53 61 66 65 4d 61 6c 6c 6f 63    z = SafeMalloc
2250: 28 6c 65 6e 29 3b 0a 20 20 73 70 72 69 6e 74 66  (len);.  sprintf
2260: 28 7a 2c 22 25 73 3d 25 73 22 2c 7a 56 61 72 2c  (z,"%s=%s",zVar,
2270: 7a 56 61 6c 75 65 29 3b 0a 20 20 70 75 74 65 6e  zValue);.  puten
2280: 76 28 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  v(z);.}../*.** R
2290: 65 6d 6f 76 65 20 74 68 65 20 66 69 72 73 74 20  emove the first 
22a0: 73 70 61 63 65 2d 64 65 6c 69 6d 69 74 65 64 20  space-delimited 
22b0: 74 6f 6b 65 6e 20 66 72 6f 6d 20 61 20 73 74 72  token from a str
22c0: 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ing and return.*
22d0: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  * a pointer to i
22e0: 74 2e 20 20 41 64 64 20 61 20 4e 55 4c 4c 20 74  t.  Add a NULL t
22f0: 6f 20 74 68 65 20 73 74 72 69 6e 67 20 74 6f 20  o the string to 
2300: 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 74 6f  terminate the to
2310: 6b 65 6e 2e 0a 2a 2a 20 4d 61 6b 65 20 2a 7a 4c  ken..** Make *zL
2320: 65 66 74 4f 76 65 72 20 70 6f 69 6e 74 20 74 6f  eftOver point to
2330: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
2340: 65 20 6e 65 78 74 20 74 6f 6b 65 6e 2e 0a 2a 2f  e next token..*/
2350: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 47 65  .static char *Ge
2360: 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28 63 68  tFirstElement(ch
2370: 61 72 20 2a 7a 49 6e 70 75 74 2c 20 63 68 61 72  ar *zInput, char
2380: 20 2a 2a 7a 4c 65 66 74 4f 76 65 72 29 7b 0a 20   **zLeftOver){. 
2390: 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 20 3d   char *zResult =
23a0: 20 30 3b 0a 20 20 69 66 28 20 7a 49 6e 70 75 74   0;.  if( zInput
23b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  ==0 ){.    if( z
23c0: 4c 65 66 74 4f 76 65 72 20 29 20 2a 7a 4c 65 66  LeftOver ) *zLef
23d0: 74 4f 76 65 72 20 3d 20 30 3b 0a 20 20 20 20 72  tOver = 0;.    r
23e0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 77  eturn 0;.  }.  w
23f0: 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 7a  hile( isspace(*z
2400: 49 6e 70 75 74 29 20 29 7b 20 7a 49 6e 70 75 74  Input) ){ zInput
2410: 2b 2b 3b 20 7d 0a 20 20 7a 52 65 73 75 6c 74 20  ++; }.  zResult 
2420: 3d 20 7a 49 6e 70 75 74 3b 0a 20 20 77 68 69 6c  = zInput;.  whil
2430: 65 28 20 2a 7a 49 6e 70 75 74 20 26 26 20 21 69  e( *zInput && !i
2440: 73 73 70 61 63 65 28 2a 7a 49 6e 70 75 74 29 20  sspace(*zInput) 
2450: 29 7b 20 7a 49 6e 70 75 74 2b 2b 3b 20 7d 0a 20  ){ zInput++; }. 
2460: 20 69 66 28 20 2a 7a 49 6e 70 75 74 20 29 7b 0a   if( *zInput ){.
2470: 20 20 20 20 2a 7a 49 6e 70 75 74 20 3d 20 30 3b      *zInput = 0;
2480: 0a 20 20 20 20 7a 49 6e 70 75 74 2b 2b 3b 0a 20  .    zInput++;. 
2490: 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63     while( isspac
24a0: 65 28 2a 7a 49 6e 70 75 74 29 20 29 7b 20 7a 49  e(*zInput) ){ zI
24b0: 6e 70 75 74 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20  nput++; }.  }.  
24c0: 69 66 28 20 7a 4c 65 66 74 4f 76 65 72 20 29 7b  if( zLeftOver ){
24d0: 20 2a 7a 4c 65 66 74 4f 76 65 72 20 3d 20 7a 49   *zLeftOver = zI
24e0: 6e 70 75 74 3b 20 7d 0a 20 20 72 65 74 75 72 6e  nput; }.  return
24f0: 20 7a 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a   zResult;.}../*.
2500: 2a 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f  ** Make a copy o
2510: 66 20 61 20 73 74 72 69 6e 67 20 69 6e 74 6f 20  f a string into 
2520: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
2530: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a  from malloc..*/.
2540: 73 74 61 74 69 63 20 63 68 61 72 20 2a 53 74 72  static char *Str
2550: 44 75 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  Dup(const char *
2560: 7a 53 72 63 29 7b 0a 20 20 63 68 61 72 20 2a 7a  zSrc){.  char *z
2570: 44 65 73 74 3b 0a 20 20 69 6e 74 20 73 69 7a 65  Dest;.  int size
2580: 3b 0a 0a 20 20 69 66 28 20 7a 53 72 63 3d 3d 30  ;..  if( zSrc==0
2590: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
25a0: 69 7a 65 20 3d 20 73 74 72 6c 65 6e 28 7a 53 72  ize = strlen(zSr
25b0: 63 29 20 2b 20 31 3b 0a 20 20 7a 44 65 73 74 20  c) + 1;.  zDest 
25c0: 3d 20 28 63 68 61 72 2a 29 53 61 66 65 4d 61 6c  = (char*)SafeMal
25d0: 6c 6f 63 28 20 73 69 7a 65 20 29 3b 0a 20 20 73  loc( size );.  s
25e0: 74 72 63 70 79 28 7a 44 65 73 74 2c 7a 53 72 63  trcpy(zDest,zSrc
25f0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 44 65 73  );.  return zDes
2600: 74 3b 0a 7d 0a 73 74 61 74 69 63 20 63 68 61 72  t;.}.static char
2610: 20 2a 53 74 72 41 70 70 65 6e 64 28 63 68 61 72   *StrAppend(char
2620: 20 2a 7a 50 72 69 6f 72 2c 20 63 6f 6e 73 74 20   *zPrior, const 
2630: 63 68 61 72 20 2a 7a 53 65 70 2c 20 63 6f 6e 73  char *zSep, cons
2640: 74 20 63 68 61 72 20 2a 7a 53 72 63 29 7b 0a 20  t char *zSrc){. 
2650: 20 63 68 61 72 20 2a 7a 44 65 73 74 3b 0a 20 20   char *zDest;.  
2660: 69 6e 74 20 73 69 7a 65 3b 0a 20 20 69 6e 74 20  int size;.  int 
2670: 6e 31 2c 20 6e 32 3b 0a 0a 20 20 69 66 28 20 7a  n1, n2;..  if( z
2680: 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
2690: 30 3b 0a 20 20 69 66 28 20 7a 50 72 69 6f 72 3d  0;.  if( zPrior=
26a0: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 74 72 44  =0 ) return StrD
26b0: 75 70 28 7a 53 72 63 29 3b 0a 20 20 73 69 7a 65  up(zSrc);.  size
26c0: 20 3d 20 28 6e 31 3d 73 74 72 6c 65 6e 28 7a 53   = (n1=strlen(zS
26d0: 72 63 29 29 20 2b 20 28 6e 32 3d 73 74 72 6c 65  rc)) + (n2=strle
26e0: 6e 28 7a 53 65 70 29 29 20 2b 20 73 74 72 6c 65  n(zSep)) + strle
26f0: 6e 28 7a 50 72 69 6f 72 29 20 2b 20 31 3b 0a 20  n(zPrior) + 1;. 
2700: 20 7a 44 65 73 74 20 3d 20 28 63 68 61 72 2a 29   zDest = (char*)
2710: 53 61 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  SafeMalloc( size
2720: 20 29 3b 0a 20 20 73 74 72 63 70 79 28 7a 44 65   );.  strcpy(zDe
2730: 73 74 2c 7a 50 72 69 6f 72 29 3b 0a 20 20 66 72  st,zPrior);.  fr
2740: 65 65 28 7a 50 72 69 6f 72 29 3b 0a 20 20 73 74  ee(zPrior);.  st
2750: 72 63 70 79 28 26 7a 44 65 73 74 5b 6e 31 5d 2c  rcpy(&zDest[n1],
2760: 7a 53 65 70 29 3b 0a 20 20 73 74 72 63 70 79 28  zSep);.  strcpy(
2770: 26 7a 44 65 73 74 5b 6e 31 2b 6e 32 5d 2c 7a 53  &zDest[n1+n2],zS
2780: 72 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 44  rc);.  return zD
2790: 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 72  est;.}../*.** Br
27a0: 65 61 6b 20 61 20 6c 69 6e 65 20 61 74 20 74 68  eak a line at th
27b0: 65 20 66 69 72 73 74 20 5c 6e 20 6f 72 20 5c 72  e first \n or \r
27c0: 20 63 68 61 72 61 63 74 65 72 20 73 65 65 6e 2e   character seen.
27d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
27e0: 52 65 6d 6f 76 65 4e 65 77 6c 69 6e 65 28 63 68  RemoveNewline(ch
27f0: 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 7a 3d  ar *z){.  if( z=
2800: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77  =0 ) return;.  w
2810: 68 69 6c 65 28 20 2a 7a 20 26 26 20 2a 7a 21 3d  hile( *z && *z!=
2820: 27 5c 6e 27 20 26 26 20 2a 7a 21 3d 27 5c 72 27  '\n' && *z!='\r'
2830: 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 2a 7a 20   ){ z++; }.  *z 
2840: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  = 0;.}../*.** Pr
2850: 69 6e 74 20 61 20 64 61 74 65 20 74 61 67 20 69  int a date tag i
2860: 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54  n the header.  T
2870: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
2880: 61 67 20 69 73 20 7a 54 61 67 2e 0a 2a 2a 20 54  ag is zTag..** T
2890: 68 65 20 64 61 74 65 20 69 73 20 64 65 74 65 72  he date is deter
28a0: 6d 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 75  mined from the u
28b0: 6e 69 78 20 74 69 6d 65 73 74 61 6d 70 20 67 69  nix timestamp gi
28c0: 76 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ven..*/.static i
28d0: 6e 74 20 44 61 74 65 54 61 67 28 63 6f 6e 73 74  nt DateTag(const
28e0: 20 63 68 61 72 20 2a 7a 54 61 67 2c 20 74 69 6d   char *zTag, tim
28f0: 65 5f 74 20 74 29 7b 0a 20 20 73 74 72 75 63 74  e_t t){.  struct
2900: 20 74 6d 20 2a 74 6d 3b 0a 20 20 63 68 61 72 20   tm *tm;.  char 
2910: 7a 44 61 74 65 5b 31 30 30 5d 3b 0a 20 20 74 6d  zDate[100];.  tm
2920: 20 3d 20 67 6d 74 69 6d 65 28 26 74 29 3b 0a 20   = gmtime(&t);. 
2930: 20 73 74 72 66 74 69 6d 65 28 7a 44 61 74 65 2c   strftime(zDate,
2940: 20 73 69 7a 65 6f 66 28 7a 44 61 74 65 29 2c 20   sizeof(zDate), 
2950: 22 25 61 2c 20 25 64 20 20 25 62 20 25 59 20 25  "%a, %d  %b %Y %
2960: 48 3a 25 4d 3a 25 53 20 25 7a 22 2c 20 74 6d 29  H:%M:%S %z", tm)
2970: 3b 0a 20 20 72 65 74 75 72 6e 20 70 72 69 6e 74  ;.  return print
2980: 66 28 22 25 73 3a 20 25 73 5c 72 5c 6e 22 2c 20  f("%s: %s\r\n", 
2990: 7a 54 61 67 2c 20 7a 44 61 74 65 29 3b 0a 7d 0a  zTag, zDate);.}.
29a0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
29b0: 20 66 69 72 73 74 20 6c 69 6e 65 20 6f 66 20 61   first line of a
29c0: 20 72 65 73 70 6f 6e 73 65 20 66 6f 6c 6c 6f 77   response follow
29d0: 65 64 20 62 79 20 74 68 65 20 73 65 72 76 65 72  ed by the server
29e0: 20 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   type..*/.static
29f0: 20 76 6f 69 64 20 53 74 61 72 74 52 65 73 70 6f   void StartRespo
2a00: 6e 73 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  nse(const char *
2a10: 7a 52 65 73 75 6c 74 43 6f 64 65 29 7b 0a 20 20  zResultCode){.  
2a20: 74 69 6d 65 5f 74 20 6e 6f 77 3b 0a 20 20 74 69  time_t now;.  ti
2a30: 6d 65 28 26 6e 6f 77 29 3b 0a 20 20 69 66 28 20  me(&now);.  if( 
2a40: 73 74 61 74 75 73 53 65 6e 74 20 29 20 72 65 74  statusSent ) ret
2a50: 75 72 6e 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70  urn;.  nOut += p
2a60: 72 69 6e 74 66 28 22 25 73 20 25 73 5c 72 5c 6e  rintf("%s %s\r\n
2a70: 22 2c 20 7a 50 72 6f 74 6f 63 6f 6c 2c 20 7a 52  ", zProtocol, zR
2a80: 65 73 75 6c 74 43 6f 64 65 29 3b 0a 20 20 73 74  esultCode);.  st
2a90: 72 6e 63 70 79 28 7a 52 65 70 6c 79 53 74 61 74  rncpy(zReplyStat
2aa0: 75 73 2c 20 7a 52 65 73 75 6c 74 43 6f 64 65 2c  us, zResultCode,
2ab0: 20 33 29 3b 0a 20 20 7a 52 65 70 6c 79 53 74 61   3);.  zReplySta
2ac0: 74 75 73 5b 33 5d 20 3d 20 30 3b 0a 20 20 69 66  tus[3] = 0;.  if
2ad0: 28 20 7a 52 65 70 6c 79 53 74 61 74 75 73 5b 30  ( zReplyStatus[0
2ae0: 5d 3e 3d 27 34 27 20 29 7b 0a 20 20 20 20 63 6c  ]>='4' ){.    cl
2af0: 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20  oseConnection = 
2b00: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6c 6f  1;.  }.  if( clo
2b10: 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 29 7b 0a  seConnection ){.
2b20: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
2b30: 74 66 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20  tf("Connection: 
2b40: 63 6c 6f 73 65 5c 72 5c 6e 22 29 3b 0a 20 20 7d  close\r\n");.  }
2b50: 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 75 74 20 2b  else{.    nOut +
2b60: 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 6e 65 63  = printf("Connec
2b70: 74 69 6f 6e 3a 20 6b 65 65 70 2d 61 6c 69 76 65  tion: keep-alive
2b80: 5c 72 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 6e 4f  \r\n");.  }.  nO
2b90: 75 74 20 2b 3d 20 44 61 74 65 54 61 67 28 22 44  ut += DateTag("D
2ba0: 61 74 65 22 2c 20 6e 6f 77 29 3b 0a 20 20 73 74  ate", now);.  st
2bb0: 61 74 75 73 53 65 6e 74 20 3d 20 31 3b 0a 7d 0a  atusSent = 1;.}.
2bc0: 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20  ./*.** Tell the 
2bd0: 63 6c 69 65 6e 74 20 74 68 61 74 20 74 68 65 72  client that ther
2be0: 65 20 69 73 20 6e 6f 20 73 75 63 68 20 64 6f 63  e is no such doc
2bf0: 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20  ument.*/.static 
2c00: 76 6f 69 64 20 4e 6f 74 46 6f 75 6e 64 28 69 6e  void NotFound(in
2c10: 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 53 74 61  t lineno){.  Sta
2c20: 72 74 52 65 73 70 6f 6e 73 65 28 22 34 30 34 20  rtResponse("404 
2c30: 4e 6f 74 20 46 6f 75 6e 64 22 29 3b 0a 20 20 6e  Not Found");.  n
2c40: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20  Out += printf(. 
2c50: 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65     "Content-type
2c60: 3a 20 74 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e 22  : text/html\r\n"
2c70: 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20  .    "\r\n".    
2c80: 22 3c 68 65 61 64 3e 3c 74 69 74 6c 65 20 6c 69  "<head><title li
2c90: 6e 65 6e 6f 3d 5c 22 25 64 5c 22 3e 4e 6f 74 20  neno=\"%d\">Not 
2ca0: 46 6f 75 6e 64 3c 2f 74 69 74 6c 65 3e 3c 2f 68  Found</title></h
2cb0: 65 61 64 3e 5c 6e 22 0a 20 20 20 20 22 3c 62 6f  ead>\n".    "<bo
2cc0: 64 79 3e 3c 68 31 3e 44 6f 63 75 6d 65 6e 74 20  dy><h1>Document 
2cd0: 4e 6f 74 20 46 6f 75 6e 64 3c 2f 68 31 3e 5c 6e  Not Found</h1>\n
2ce0: 22 0a 20 20 20 20 22 54 68 65 20 64 6f 63 75 6d  ".    "The docum
2cf0: 65 6e 74 20 25 73 20 69 73 20 6e 6f 74 20 61 76  ent %s is not av
2d00: 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 69 73 20  ailable on this 
2d10: 73 65 72 76 65 72 5c 6e 22 0a 20 20 20 20 22 3c  server\n".    "<
2d20: 2f 62 6f 64 79 3e 5c 6e 22 2c 20 6c 69 6e 65 6e  /body>\n", linen
2d30: 6f 2c 20 7a 53 63 72 69 70 74 29 3b 0a 20 20 4d  o, zScript);.  M
2d40: 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 29 3b 0a  akeLogEntry(0);.
2d50: 20 20 65 78 69 74 28 30 29 3b 0a 7d 0a 0a 2f 2a    exit(0);.}../*
2d60: 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c 69  .** Tell the cli
2d70: 65 6e 74 20 74 68 61 74 20 61 75 74 68 6f 72 69  ent that authori
2d80: 7a 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  zation is requir
2d90: 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ed to access the
2da0: 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2f  .** document..*/
2db0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4e 6f 74  .static void Not
2dc0: 41 75 74 68 6f 72 69 7a 65 64 28 63 6f 6e 73 74  Authorized(const
2dd0: 20 63 68 61 72 20 2a 7a 52 65 61 6c 6d 29 7b 0a   char *zRealm){.
2de0: 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28    StartResponse(
2df0: 22 34 30 31 20 41 75 74 68 6f 72 69 7a 61 74 69  "401 Authorizati
2e00: 6f 6e 20 52 65 71 75 69 72 65 64 22 29 3b 0a 20  on Required");. 
2e10: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
2e20: 0a 20 20 20 20 22 57 57 57 2d 41 75 74 68 65 6e  .    "WWW-Authen
2e30: 74 69 63 61 74 65 3a 20 42 61 73 69 63 20 72 65  ticate: Basic re
2e40: 61 6c 6d 3d 5c 22 25 73 5c 22 5c 72 5c 6e 22 0a  alm=\"%s\"\r\n".
2e50: 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70      "Content-typ
2e60: 65 3a 20 74 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e  e: text/html\r\n
2e70: 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20  ".    "\r\n".   
2e80: 20 22 3c 68 65 61 64 3e 3c 74 69 74 6c 65 3e 4e   "<head><title>N
2e90: 6f 74 20 41 75 74 68 6f 72 69 7a 65 64 3c 2f 74  ot Authorized</t
2ea0: 69 74 6c 65 3e 3c 2f 68 65 61 64 3e 5c 6e 22 0a  itle></head>\n".
2eb0: 20 20 20 20 22 3c 62 6f 64 79 3e 3c 68 31 3e 34      "<body><h1>4
2ec0: 30 31 20 4e 6f 74 20 41 75 74 68 6f 72 69 7a 65  01 Not Authorize
2ed0: 64 3c 2f 68 31 3e 5c 6e 22 0a 20 20 20 20 22 41  d</h1>\n".    "A
2ee0: 20 6c 6f 67 69 6e 20 61 6e 64 20 70 61 73 73 77   login and passw
2ef0: 6f 72 64 20 61 72 65 20 72 65 71 75 69 72 65 64  ord are required
2f00: 20 66 6f 72 20 74 68 69 73 20 64 6f 63 75 6d 65   for this docume
2f10: 6e 74 5c 6e 22 0a 20 20 20 20 22 3c 2f 62 6f 64  nt\n".    "</bod
2f20: 79 3e 5c 6e 22 2c 20 7a 52 65 61 6c 6d 29 3b 0a  y>\n", zRealm);.
2f30: 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30    MakeLogEntry(0
2f40: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c  );.}../*.** Tell
2f50: 20 74 68 65 20 63 6c 69 65 6e 74 20 74 68 61 74   the client that
2f60: 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 72 72   there is an err
2f70: 6f 72 20 69 6e 20 74 68 65 20 73 63 72 69 70 74  or in the script
2f80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2f90: 20 43 67 69 45 72 72 6f 72 28 76 6f 69 64 29 7b   CgiError(void){
2fa0: 0a 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65  .  StartResponse
2fb0: 28 22 35 30 30 20 45 72 72 6f 72 22 29 3b 0a 20  ("500 Error");. 
2fc0: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
2fd0: 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79  .    "Content-ty
2fe0: 70 65 3a 20 74 65 78 74 2f 68 74 6d 6c 5c 72 5c  pe: text/html\r\
2ff0: 6e 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20  n".    "\r\n".  
3000: 20 20 22 3c 68 65 61 64 3e 3c 74 69 74 6c 65 3e    "<head><title>
3010: 43 47 49 20 50 72 6f 67 72 61 6d 20 45 72 72 6f  CGI Program Erro
3020: 72 3c 2f 74 69 74 6c 65 3e 3c 2f 68 65 61 64 3e  r</title></head>
3030: 5c 6e 22 0a 20 20 20 20 22 3c 62 6f 64 79 3e 3c  \n".    "<body><
3040: 68 31 3e 43 47 49 20 50 72 6f 67 72 61 6d 20 45  h1>CGI Program E
3050: 72 72 6f 72 3c 2f 68 31 3e 5c 6e 22 0a 20 20 20  rror</h1>\n".   
3060: 20 22 54 68 65 20 43 47 49 20 70 72 6f 67 72 61   "The CGI progra
3070: 6d 20 25 73 20 67 65 6e 65 72 61 74 65 64 20 61  m %s generated a
3080: 6e 20 65 72 72 6f 72 5c 6e 22 0a 20 20 20 20 22  n error\n".    "
3090: 3c 2f 62 6f 64 79 3e 5c 6e 22 2c 20 7a 53 63 72  </body>\n", zScr
30a0: 69 70 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45  ipt);.  MakeLogE
30b0: 6e 74 72 79 28 30 29 3b 0a 20 20 65 78 69 74 28  ntry(0);.  exit(
30c0: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0);.}../*.** Thi
30d0: 73 20 69 73 20 63 61 6c 6c 65 64 20 69 66 20 77  s is called if w
30e0: 65 20 74 69 6d 65 6f 75 74 2e 0a 2a 2f 0a 73 74  e timeout..*/.st
30f0: 61 74 69 63 20 76 6f 69 64 20 54 69 6d 65 6f 75  atic void Timeou
3100: 74 28 69 6e 74 20 4e 6f 74 55 73 65 64 29 7b 0a  t(int NotUsed){.
3110: 20 20 69 66 28 20 21 64 65 62 75 67 46 6c 61 67    if( !debugFlag
3120: 20 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28 7a   ){.    strcpy(z
3130: 52 65 70 6c 79 53 74 61 74 75 73 2c 20 22 39 39  ReplyStatus, "99
3140: 39 22 29 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f 67  9");.    MakeLog
3150: 45 6e 74 72 79 28 30 29 3b 0a 20 20 20 20 65 78  Entry(0);.    ex
3160: 69 74 28 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  it(0);.  }.}../*
3170: 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c 69  .** Tell the cli
3180: 65 6e 74 20 74 68 61 74 20 74 68 65 72 65 20 69  ent that there i
3190: 73 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68  s an error in th
31a0: 65 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61  e script..*/.sta
31b0: 74 69 63 20 76 6f 69 64 20 43 67 69 53 63 72 69  tic void CgiScri
31c0: 70 74 57 72 69 74 61 62 6c 65 28 76 6f 69 64 29  ptWritable(void)
31d0: 7b 0a 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73  {.  StartRespons
31e0: 65 28 22 35 30 30 20 43 47 49 20 43 6f 6e 66 69  e("500 CGI Confi
31f0: 67 75 72 61 74 69 6f 6e 20 45 72 72 6f 72 22 29  guration Error")
3200: 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e  ;.  nOut += prin
3210: 74 66 28 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74  tf(.    "Content
3220: 2d 74 79 70 65 3a 20 74 65 78 74 2f 68 74 6d 6c  -type: text/html
3230: 5c 72 5c 6e 22 0a 20 20 20 20 22 5c 72 5c 6e 22  \r\n".    "\r\n"
3240: 0a 20 20 20 20 22 3c 68 65 61 64 3e 3c 74 69 74  .    "<head><tit
3250: 6c 65 3e 43 47 49 20 43 6f 6e 66 69 67 75 72 61  le>CGI Configura
3260: 74 69 6f 6e 20 45 72 72 6f 72 3c 2f 74 69 74 6c  tion Error</titl
3270: 65 3e 3c 2f 68 65 61 64 3e 5c 6e 22 0a 20 20 20  e></head>\n".   
3280: 20 22 3c 62 6f 64 79 3e 3c 68 31 3e 43 47 49 20   "<body><h1>CGI 
3290: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 45 72  Configuration Er
32a0: 72 6f 72 3c 2f 68 31 3e 5c 6e 22 0a 20 20 20 20  ror</h1>\n".    
32b0: 22 54 68 65 20 43 47 49 20 70 72 6f 67 72 61 6d  "The CGI program
32c0: 20 25 73 20 69 73 20 77 72 69 74 61 62 6c 65 20   %s is writable 
32d0: 62 79 20 75 73 65 72 73 20 6f 74 68 65 72 20 74  by users other t
32e0: 68 61 6e 20 69 74 73 20 6f 77 6e 65 72 2e 5c 6e  han its owner.\n
32f0: 22 0a 20 20 20 20 22 3c 2f 62 6f 64 79 3e 5c 6e  ".    "</body>\n
3300: 22 2c 20 7a 52 65 61 6c 53 63 72 69 70 74 29 3b  ", zRealScript);
3310: 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28  .  MakeLogEntry(
3320: 30 29 3b 0a 20 20 65 78 69 74 28 30 29 3b 20 20  0);.  exit(0);  
3330: 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54       .}../*.** T
3340: 65 6c 6c 20 74 68 65 20 63 6c 69 65 6e 74 20 74  ell the client t
3350: 68 61 74 20 74 68 65 20 73 65 72 76 65 72 20 6d  hat the server m
3360: 61 6c 66 75 6e 63 74 69 6f 6e 65 64 2e 0a 2a 2f  alfunctioned..*/
3370: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d 61 6c  .static void Mal
3380: 66 75 6e 63 74 69 6f 6e 28 69 6e 74 20 6c 69 6e  function(int lin
3390: 65 6e 75 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72  enum, const char
33a0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
33b0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
33c0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
33d0: 6f 72 6d 61 74 29 3b 0a 20 20 53 74 61 72 74 52  ormat);.  StartR
33e0: 65 73 70 6f 6e 73 65 28 22 35 30 30 20 53 65 72  esponse("500 Ser
33f0: 76 65 72 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 22  ver Malfunction"
3400: 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69  );.  nOut += pri
3410: 6e 74 66 28 0a 20 20 20 20 22 43 6f 6e 74 65 6e  ntf(.    "Conten
3420: 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 68 74 6d  t-type: text/htm
3430: 6c 5c 72 5c 6e 22 0a 20 20 20 20 22 5c 72 5c 6e  l\r\n".    "\r\n
3440: 22 0a 20 20 20 20 22 3c 68 65 61 64 3e 3c 74 69  ".    "<head><ti
3450: 74 6c 65 3e 53 65 72 76 65 72 20 4d 61 6c 66 75  tle>Server Malfu
3460: 6e 63 74 69 6f 6e 3c 2f 74 69 74 6c 65 3e 3c 2f  nction</title></
3470: 68 65 61 64 3e 5c 6e 22 0a 20 20 20 20 22 3c 62  head>\n".    "<b
3480: 6f 64 79 3e 3c 68 31 3e 53 65 72 76 65 72 20 4d  ody><h1>Server M
3490: 61 6c 66 75 6e 63 74 69 6f 6e 3c 2f 68 31 3e 5c  alfunction</h1>\
34a0: 6e 22 0a 20 20 20 20 22 3c 70 3e 54 68 69 73 20  n".    "<p>This 
34b0: 77 65 62 20 73 65 72 76 65 72 20 68 61 73 20 6d  web server has m
34c0: 61 6c 66 75 6e 63 74 69 6f 6e 65 64 2e 5c 6e 5c  alfunctioned.\n\
34d0: 6e 22 0a 20 20 20 20 22 28 45 72 72 6f 72 20 6e  n".    "(Error n
34e0: 75 6d 62 65 72 3a 20 25 64 29 3c 2f 70 3e 5c 6e  umber: %d)</p>\n
34f0: 22 2c 20 6c 69 6e 65 6e 75 6d 29 3b 0a 20 20 69  ", linenum);.  i
3500: 66 28 20 7a 46 6f 72 6d 61 74 20 29 7b 0a 20 20  f( zFormat ){.  
3510: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
3520: 28 22 3c 70 3e 22 29 3b 0a 20 20 20 20 6e 4f 75  ("<p>");.    nOu
3530: 74 20 2b 3d 20 76 70 72 69 6e 74 66 28 7a 46 6f  t += vprintf(zFo
3540: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 6e  rmat, ap);.    n
3550: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 3c  Out += printf("<
3560: 2f 70 3e 5c 6e 5c 6e 22 29 3b 0a 20 20 7d 0a 20  /p>\n\n");.  }. 
3570: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
3580: 22 3c 2f 62 6f 64 79 3e 5c 6e 22 29 3b 0a 20 20  "</body>\n");.  
3590: 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 29 3b  MakeLogEntry(0);
35a0: 0a 20 20 65 78 69 74 28 30 29 3b 20 20 20 20 20  .  exit(0);     
35b0: 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61    .}../*.** Do a
35c0: 20 73 65 72 76 65 72 20 72 65 64 69 72 65 63 74   server redirect
35d0: 20 74 6f 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   to the document
35e0: 20 73 70 65 63 69 66 69 65 64 2e 20 20 54 68 65   specified.  The
35f0: 20 64 6f 63 75 6d 65 6e 74 0a 2a 2a 20 6e 61 6d   document.** nam
3600: 65 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 73 63  e not contain sc
3610: 68 65 6d 65 20 6f 72 20 6e 65 74 77 6f 72 6b 20  heme or network 
3620: 6c 6f 63 61 74 69 6f 6e 20 6f 72 20 74 68 65 20  location or the 
3630: 71 75 65 72 79 20 73 74 72 69 6e 67 2e 0a 2a 2a  query string..**
3640: 20 49 74 20 77 69 6c 6c 20 62 65 20 6a 75 73 74   It will be just
3650: 20 74 68 65 20 70 61 74 68 2e 0a 2a 2f 0a 73 74   the path..*/.st
3660: 61 74 69 63 20 76 6f 69 64 20 52 65 64 69 72 65  atic void Redire
3670: 63 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ct(const char *z
3680: 50 61 74 68 2c 20 69 6e 74 20 66 69 6e 69 73 68  Path, int finish
3690: 29 7b 0a 20 20 53 74 61 72 74 52 65 73 70 6f 6e  ){.  StartRespon
36a0: 73 65 28 22 33 30 32 20 54 65 6d 70 6f 72 61 72  se("302 Temporar
36b0: 79 20 52 65 64 69 72 65 63 74 22 29 3b 0a 20 20  y Redirect");.  
36c0: 69 66 28 20 7a 53 65 72 76 65 72 50 6f 72 74 3d  if( zServerPort=
36d0: 3d 30 20 7c 7c 20 7a 53 65 72 76 65 72 50 6f 72  =0 || zServerPor
36e0: 74 5b 30 5d 3d 3d 30 20 7c 7c 20 73 74 72 63 6d  t[0]==0 || strcm
36f0: 70 28 7a 53 65 72 76 65 72 50 6f 72 74 2c 22 38  p(zServerPort,"8
3700: 30 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4f  0")==0 ){.    nO
3710: 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 4c 6f  ut += printf("Lo
3720: 63 61 74 69 6f 6e 3a 20 25 73 3a 2f 2f 25 73 25  cation: %s://%s%
3730: 73 25 73 5c 72 5c 6e 22 2c 0a 20 20 20 20 20 20  s%s\r\n",.      
3740: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 48 74               zHt
3750: 74 70 2c 20 7a 53 65 72 76 65 72 4e 61 6d 65 2c  tp, zServerName,
3760: 20 7a 50 61 74 68 2c 20 7a 51 75 65 72 79 53 75   zPath, zQuerySu
3770: 66 66 69 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ffix);.  }else{.
3780: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
3790: 74 66 28 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73  tf("Location: %s
37a0: 3a 2f 2f 25 73 3a 25 73 25 73 25 73 5c 72 5c 6e  ://%s:%s%s%s\r\n
37b0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
37c0: 20 20 20 20 20 20 7a 48 74 74 70 2c 20 7a 53 65        zHttp, zSe
37d0: 72 76 65 72 4e 61 6d 65 2c 20 7a 53 65 72 76 65  rverName, zServe
37e0: 72 50 6f 72 74 2c 20 7a 50 61 74 68 2c 20 7a 51  rPort, zPath, zQ
37f0: 75 65 72 79 53 75 66 66 69 78 29 3b 0a 20 20 7d  uerySuffix);.  }
3800: 0a 20 20 69 66 28 20 66 69 6e 69 73 68 20 29 7b  .  if( finish ){
3810: 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69  .    nOut += pri
3820: 6e 74 66 28 22 5c 72 5c 6e 22 29 3b 0a 20 20 20  ntf("\r\n");.   
3830: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 29   MakeLogEntry(0)
3840: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
3850: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 72 65  his function tre
3860: 61 74 73 20 69 74 73 20 69 6e 70 75 74 20 61 73  ats its input as
3870: 20 61 20 62 61 73 65 2d 36 34 20 73 74 72 69 6e   a base-64 strin
3880: 67 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68  g and returns th
3890: 65 0a 2a 2a 20 64 65 63 6f 64 65 64 20 76 61 6c  e.** decoded val
38a0: 75 65 20 6f 66 20 74 68 61 74 20 73 74 72 69 6e  ue of that strin
38b0: 67 2e 20 20 43 68 61 72 61 63 74 65 72 73 20 6f  g.  Characters o
38c0: 66 20 69 6e 70 75 74 20 74 68 61 74 20 61 72 65  f input that are
38d0: 20 6e 6f 74 0a 2a 2a 20 76 61 6c 69 64 20 62 61   not.** valid ba
38e0: 73 65 2d 36 34 20 63 68 61 72 61 63 74 65 72 73  se-64 characters
38f0: 20 28 73 75 63 68 20 61 73 20 73 70 61 63 65 73   (such as spaces
3900: 20 61 6e 64 20 6e 65 77 6c 69 6e 65 73 29 20 61   and newlines) a
3910: 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 76  re ignored..*/.v
3920: 6f 69 64 20 44 65 63 6f 64 65 36 34 28 63 68 61  oid Decode64(cha
3930: 72 20 2a 7a 36 34 29 7b 0a 20 20 63 68 61 72 20  r *z64){.  char 
3940: 2a 7a 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 36  *zData;.  int n6
3950: 34 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  4;.  int i, j;. 
3960: 20 69 6e 74 20 61 2c 20 62 2c 20 63 2c 20 64 3b   int a, b, c, d;
3970: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 73  .  static int is
3980: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 73 74 61 74  Init = 0;.  stat
3990: 69 63 20 69 6e 74 20 74 72 61 6e 73 5b 31 32 38  ic int trans[128
39a0: 5d 3b 0a 20 20 73 74 61 74 69 63 20 75 6e 73 69  ];.  static unsi
39b0: 67 6e 65 64 20 63 68 61 72 20 7a 42 61 73 65 5b  gned char zBase[
39c0: 5d 20 3d 20 0a 20 20 20 20 22 41 42 43 44 45 46  ] = .    "ABCDEF
39d0: 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
39e0: 57 58 59 5a 61 62 63 64 65 66 67 68 69 6a 6b 6c  WXYZabcdefghijkl
39f0: 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 30 31  mnopqrstuvwxyz01
3a00: 32 33 34 35 36 37 38 39 2b 2f 22 3b 0a 0a 20 20  23456789+/";..  
3a10: 69 66 28 20 21 69 73 49 6e 69 74 20 29 7b 0a 20  if( !isInit ){. 
3a20: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32     for(i=0; i<12
3a30: 38 3b 20 69 2b 2b 29 7b 20 74 72 61 6e 73 5b 69  8; i++){ trans[i
3a40: 5d 20 3d 20 30 3b 20 7d 0a 20 20 20 20 66 6f 72  ] = 0; }.    for
3a50: 28 69 3d 30 3b 20 7a 42 61 73 65 5b 69 5d 3b 20  (i=0; zBase[i]; 
3a60: 69 2b 2b 29 7b 20 74 72 61 6e 73 5b 7a 42 61 73  i++){ trans[zBas
3a70: 65 5b 69 5d 20 26 20 30 78 37 66 5d 20 3d 20 69  e[i] & 0x7f] = i
3a80: 3b 20 7d 0a 20 20 20 20 69 73 49 6e 69 74 20 3d  ; }.    isInit =
3a90: 20 31 3b 0a 20 20 7d 0a 20 20 6e 36 34 20 3d 20   1;.  }.  n64 = 
3aa0: 73 74 72 6c 65 6e 28 7a 36 34 29 3b 0a 20 20 77  strlen(z64);.  w
3ab0: 68 69 6c 65 28 20 6e 36 34 3e 30 20 26 26 20 7a  hile( n64>0 && z
3ac0: 36 34 5b 6e 36 34 2d 31 5d 3d 3d 27 3d 27 20 29  64[n64-1]=='=' )
3ad0: 20 6e 36 34 2d 2d 3b 0a 20 20 7a 44 61 74 61 20   n64--;.  zData 
3ae0: 3d 20 7a 36 34 3b 0a 20 20 66 6f 72 28 69 3d 6a  = z64;.  for(i=j
3af0: 3d 30 3b 20 69 2b 33 3c 6e 36 34 3b 20 69 2b 3d  =0; i+3<n64; i+=
3b00: 34 29 7b 0a 20 20 20 20 61 20 3d 20 74 72 61 6e  4){.    a = tran
3b10: 73 5b 7a 36 34 5b 69 5d 20 26 20 30 78 37 66 5d  s[z64[i] & 0x7f]
3b20: 3b 0a 20 20 20 20 62 20 3d 20 74 72 61 6e 73 5b  ;.    b = trans[
3b30: 7a 36 34 5b 69 2b 31 5d 20 26 20 30 78 37 66 5d  z64[i+1] & 0x7f]
3b40: 3b 0a 20 20 20 20 63 20 3d 20 74 72 61 6e 73 5b  ;.    c = trans[
3b50: 7a 36 34 5b 69 2b 32 5d 20 26 20 30 78 37 66 5d  z64[i+2] & 0x7f]
3b60: 3b 0a 20 20 20 20 64 20 3d 20 74 72 61 6e 73 5b  ;.    d = trans[
3b70: 7a 36 34 5b 69 2b 33 5d 20 26 20 30 78 37 66 5d  z64[i+3] & 0x7f]
3b80: 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d  ;.    zData[j++]
3b90: 20 3d 20 28 28 61 3c 3c 32 29 20 26 20 30 78 66   = ((a<<2) & 0xf
3ba0: 63 29 20 7c 20 28 28 62 3e 3e 34 29 20 26 20 30  c) | ((b>>4) & 0
3bb0: 78 30 33 29 3b 0a 20 20 20 20 7a 44 61 74 61 5b  x03);.    zData[
3bc0: 6a 2b 2b 5d 20 3d 20 28 28 62 3c 3c 34 29 20 26  j++] = ((b<<4) &
3bd0: 20 30 78 66 30 29 20 7c 20 28 28 63 3e 3e 32 29   0xf0) | ((c>>2)
3be0: 20 26 20 30 78 30 66 29 3b 0a 20 20 20 20 7a 44   & 0x0f);.    zD
3bf0: 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28 63 3c 3c  ata[j++] = ((c<<
3c00: 36 29 20 26 20 30 78 63 30 29 20 7c 20 28 64 20  6) & 0xc0) | (d 
3c10: 26 20 30 78 33 66 29 3b 0a 20 20 7d 0a 20 20 69  & 0x3f);.  }.  i
3c20: 66 28 20 69 2b 32 3c 6e 36 34 20 29 7b 0a 20 20  f( i+2<n64 ){.  
3c30: 20 20 61 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b    a = trans[z64[
3c40: 69 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20  i] & 0x7f];.    
3c50: 62 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b  b = trans[z64[i+
3c60: 31 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20  1] & 0x7f];.    
3c70: 63 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b  c = trans[z64[i+
3c80: 32 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20  2] & 0x7f];.    
3c90: 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28 61  zData[j++] = ((a
3ca0: 3c 3c 32 29 20 26 20 30 78 66 63 29 20 7c 20 28  <<2) & 0xfc) | (
3cb0: 28 62 3e 3e 34 29 20 26 20 30 78 30 33 29 3b 0a  (b>>4) & 0x03);.
3cc0: 20 20 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d      zData[j++] =
3cd0: 20 28 28 62 3c 3c 34 29 20 26 20 30 78 66 30 29   ((b<<4) & 0xf0)
3ce0: 20 7c 20 28 28 63 3e 3e 32 29 20 26 20 30 78 30   | ((c>>2) & 0x0
3cf0: 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  f);.  }else if( 
3d00: 69 2b 31 3c 6e 36 34 20 29 7b 0a 20 20 20 20 61  i+1<n64 ){.    a
3d10: 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 5d 20   = trans[z64[i] 
3d20: 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 62 20 3d  & 0x7f];.    b =
3d30: 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b 31 5d 20   trans[z64[i+1] 
3d40: 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 7a 44 61  & 0x7f];.    zDa
3d50: 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28 61 3c 3c 32  ta[j++] = ((a<<2
3d60: 29 20 26 20 30 78 66 63 29 20 7c 20 28 28 62 3e  ) & 0xfc) | ((b>
3d70: 3e 34 29 20 26 20 30 78 30 33 29 3b 0a 20 20 7d  >4) & 0x03);.  }
3d80: 0a 20 20 7a 44 61 74 61 5b 6a 5d 20 3d 20 30 3b  .  zData[j] = 0;
3d90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
3da0: 74 6f 20 73 65 65 20 69 66 20 62 61 73 69 63 20  to see if basic 
3db0: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 72  authorization cr
3dc0: 65 64 65 6e 74 69 61 6c 73 20 61 72 65 20 70 72  edentials are pr
3dd0: 6f 76 69 64 65 64 20 66 6f 72 0a 2a 2a 20 74 68  ovided for.** th
3de0: 65 20 75 73 65 72 20 61 63 63 6f 72 64 69 6e 67  e user according
3df0: 20 74 6f 20 74 68 65 20 69 6e 66 6f 72 6d 61 74   to the informat
3e00: 69 6f 6e 20 69 6e 20 7a 41 75 74 68 46 69 6c 65  ion in zAuthFile
3e10: 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 0a 2a  .  Return true.*
3e20: 2a 20 69 66 20 61 75 74 68 6f 72 69 7a 65 64 2e  * if authorized.
3e30: 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69    Return false i
3e40: 66 20 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65 64  f not authorized
3e50: 2e 0a 2a 2a 0a 2a 2a 20 46 69 6c 65 20 66 6f 72  ..**.** File for
3e60: 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  mat:.**.**    * 
3e70: 20 42 6c 61 6e 6b 20 6c 69 6e 65 73 20 61 6e 64   Blank lines and
3e80: 20 6c 69 6e 65 73 20 74 68 61 74 20 62 65 67 69   lines that begi
3e90: 6e 20 77 69 74 68 20 27 23 27 20 61 72 65 20 69  n with '#' are i
3ea0: 67 6e 6f 72 65 64 0a 2a 2a 20 20 20 20 2a 20 20  gnored.**    *  
3eb0: 22 68 74 74 70 2d 72 65 64 69 72 65 63 74 22 20  "http-redirect" 
3ec0: 66 6f 72 63 65 73 20 61 20 72 65 64 69 72 65 63  forces a redirec
3ed0: 74 20 74 6f 20 48 54 54 50 53 20 69 66 20 6e 6f  t to HTTPS if no
3ee0: 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 0a  t there already.
3ef0: 2a 2a 20 20 20 20 2a 20 20 22 68 74 74 70 73 2d  **    *  "https-
3f00: 6f 6e 6c 79 22 20 64 69 73 61 6c 6c 6f 77 73 20  only" disallows 
3f10: 6f 70 65 72 61 74 69 6f 6e 20 69 6e 20 48 54 54  operation in HTT
3f20: 50 0a 2a 2a 20 20 20 20 2a 20 20 22 75 73 65 72  P.**    *  "user
3f30: 20 4e 41 4d 45 20 4c 4f 47 49 4e 3a 50 41 53 53   NAME LOGIN:PASS
3f40: 57 4f 52 44 22 20 63 68 65 63 6b 73 20 74 6f 20  WORD" checks to 
3f50: 73 65 65 20 69 66 20 4c 4f 47 49 4e 3a 50 41 53  see if LOGIN:PAS
3f60: 53 57 4f 52 44 20 0a 2a 2a 20 20 20 20 20 20 20  SWORD .**       
3f70: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 72  authorization cr
3f80: 65 64 65 6e 74 69 61 6c 73 20 61 72 65 20 70 72  edentials are pr
3f90: 6f 76 69 64 65 64 2c 20 61 6e 64 20 69 66 20 73  ovided, and if s
3fa0: 6f 20 73 65 74 73 20 74 68 65 0a 2a 2a 20 20 20  o sets the.**   
3fb0: 20 20 20 20 52 45 4d 4f 54 45 5f 55 53 45 52 20      REMOTE_USER 
3fc0: 74 6f 20 4e 41 4d 45 2e 0a 2a 2a 20 20 20 20 2a  to NAME..**    *
3fd0: 20 20 22 72 65 61 6c 6d 20 54 45 58 54 22 20 73    "realm TEXT" s
3fe0: 65 74 73 20 74 68 65 20 72 65 61 6c 6d 20 74 6f  ets the realm to
3ff0: 20 54 45 58 54 2e 0a 2a 2f 0a 73 74 61 74 69 63   TEXT..*/.static
4000: 20 69 6e 74 20 43 68 65 63 6b 42 61 73 69 63 41   int CheckBasicA
4010: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 28 63 6f 6e  uthorization(con
4020: 73 74 20 63 68 61 72 20 2a 7a 41 75 74 68 46 69  st char *zAuthFi
4030: 6c 65 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b  le){.  FILE *in;
4040: 0a 20 20 63 68 61 72 20 2a 7a 52 65 61 6c 6d 20  .  char *zRealm 
4050: 3d 20 22 75 6e 6b 6e 6f 77 6e 20 72 65 61 6c 6d  = "unknown realm
4060: 22 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 67 69  ";.  char *zLogi
4070: 6e 50 73 77 64 3b 0a 20 20 63 68 61 72 20 2a 7a  nPswd;.  char *z
4080: 4e 61 6d 65 3b 0a 20 20 63 68 61 72 20 7a 4c 69  Name;.  char zLi
4090: 6e 65 5b 32 30 30 30 5d 3b 0a 0a 20 20 69 6e 20  ne[2000];..  in 
40a0: 3d 20 66 6f 70 65 6e 28 7a 41 75 74 68 46 69 6c  = fopen(zAuthFil
40b0: 65 2c 20 22 72 22 29 3b 0a 20 20 69 66 28 20 69  e, "r");.  if( i
40c0: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 4e 6f 74 46  n==0 ){.    NotF
40d0: 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  ound(__LINE__);.
40e0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
40f0: 7d 0a 20 20 69 66 28 20 7a 41 75 74 68 41 72 67  }.  if( zAuthArg
4100: 20 29 20 44 65 63 6f 64 65 36 34 28 7a 41 75 74   ) Decode64(zAut
4110: 68 41 72 67 29 3b 0a 20 20 77 68 69 6c 65 28 20  hArg);.  while( 
4120: 66 67 65 74 73 28 7a 4c 69 6e 65 2c 20 73 69 7a  fgets(zLine, siz
4130: 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 69 6e 29 20  eof(zLine), in) 
4140: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69  ){.    char *zFi
4150: 65 6c 64 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61  eldName;.    cha
4160: 72 20 2a 7a 56 61 6c 3b 0a 0a 20 20 20 20 7a 46  r *zVal;..    zF
4170: 69 65 6c 64 4e 61 6d 65 20 3d 20 47 65 74 46 69  ieldName = GetFi
4180: 72 73 74 45 6c 65 6d 65 6e 74 28 7a 4c 69 6e 65  rstElement(zLine
4190: 2c 26 7a 56 61 6c 29 3b 0a 20 20 20 20 69 66 28  ,&zVal);.    if(
41a0: 20 7a 46 69 65 6c 64 4e 61 6d 65 3d 3d 30 20 7c   zFieldName==0 |
41b0: 7c 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 3d 3d 30  | *zFieldName==0
41c0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
41d0: 20 69 66 28 20 7a 46 69 65 6c 64 4e 61 6d 65 5b   if( zFieldName[
41e0: 30 5d 3d 3d 27 23 27 20 29 20 63 6f 6e 74 69 6e  0]=='#' ) contin
41f0: 75 65 3b 0a 20 20 20 20 52 65 6d 6f 76 65 4e 65  ue;.    RemoveNe
4200: 77 6c 69 6e 65 28 7a 56 61 6c 29 3b 0a 20 20 20  wline(zVal);.   
4210: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 65   if( strcmp(zFie
4220: 6c 64 4e 61 6d 65 2c 20 22 72 65 61 6c 6d 22 29  ldName, "realm")
4230: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 52 65  ==0 ){.      zRe
4240: 61 6c 6d 20 3d 20 53 74 72 44 75 70 28 7a 56 61  alm = StrDup(zVa
4250: 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  l);.    }else if
4260: 28 20 73 74 72 63 6d 70 28 7a 46 69 65 6c 64 4e  ( strcmp(zFieldN
4270: 61 6d 65 2c 22 75 73 65 72 22 29 3d 3d 30 20 29  ame,"user")==0 )
4280: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 75 74  {.      if( zAut
4290: 68 41 72 67 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  hArg==0 ) contin
42a0: 75 65 3b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20  ue;.      zName 
42b0: 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e  = GetFirstElemen
42c0: 74 28 7a 56 61 6c 2c 20 26 7a 56 61 6c 29 3b 0a  t(zVal, &zVal);.
42d0: 20 20 20 20 20 20 7a 4c 6f 67 69 6e 50 73 77 64        zLoginPswd
42e0: 20 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65   = GetFirstEleme
42f0: 6e 74 28 7a 56 61 6c 2c 20 26 7a 56 61 6c 29 3b  nt(zVal, &zVal);
4300: 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 6f 67 69  .      if( zLogi
4310: 6e 50 73 77 64 3d 3d 30 20 29 20 63 6f 6e 74 69  nPswd==0 ) conti
4320: 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  nue;.      if( z
4330: 41 75 74 68 41 72 67 20 26 26 20 73 74 72 63 6d  AuthArg && strcm
4340: 70 28 7a 41 75 74 68 41 72 67 2c 7a 4c 6f 67 69  p(zAuthArg,zLogi
4350: 6e 50 73 77 64 29 3d 3d 30 20 29 7b 0a 20 20 20  nPswd)==0 ){.   
4360: 20 20 20 20 20 7a 52 65 6d 6f 74 65 55 73 65 72       zRemoteUser
4370: 20 3d 20 53 74 72 44 75 70 28 7a 4e 61 6d 65 29   = StrDup(zName)
4380: 3b 0a 20 20 20 20 20 20 20 20 66 63 6c 6f 73 65  ;.        fclose
4390: 28 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 72 65  (in);.        re
43a0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
43b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
43c0: 72 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c  rcmp(zFieldName,
43d0: 22 68 74 74 70 73 2d 6f 6e 6c 79 22 29 3d 3d 30  "https-only")==0
43e0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 75   ){.      if( !u
43f0: 73 65 48 74 74 70 73 20 29 7b 0a 20 20 20 20 20  seHttps ){.     
4400: 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49     NotFound(__LI
4410: 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 66  NE__);.        f
4420: 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20  close(in);.     
4430: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
4440: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
4450: 66 28 20 73 74 72 63 6d 70 28 7a 46 69 65 6c 64  f( strcmp(zField
4460: 4e 61 6d 65 2c 22 68 74 74 70 2d 72 65 64 69 72  Name,"http-redir
4470: 65 63 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ect")==0 ){.    
4480: 20 20 69 66 28 20 21 75 73 65 48 74 74 70 73 20    if( !useHttps 
4490: 29 7b 0a 20 20 20 20 20 20 20 20 7a 48 74 74 70  ){.        zHttp
44a0: 20 3d 20 22 68 74 74 70 73 22 3b 0a 20 20 20 20   = "https";.    
44b0: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e      sprintf(zLin
44c0: 65 2c 20 22 25 73 25 73 22 2c 20 7a 53 63 72 69  e, "%s%s", zScri
44d0: 70 74 2c 20 7a 50 61 74 68 49 6e 66 6f 29 3b 0a  pt, zPathInfo);.
44e0: 20 20 20 20 20 20 20 20 52 65 64 69 72 65 63 74          Redirect
44f0: 28 7a 4c 69 6e 65 2c 20 31 29 3b 0a 20 20 20 20  (zLine, 1);.    
4500: 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
4510: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
4520: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
4530: 6c 73 65 7b 0a 20 20 20 20 20 20 4e 6f 74 46 6f  lse{.      NotFo
4540: 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  und(__LINE__);. 
4550: 20 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b       fclose(in);
4560: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
4570: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 63 6c  .    }.  }.  fcl
4580: 6f 73 65 28 69 6e 29 3b 0a 20 20 4e 6f 74 41 75  ose(in);.  NotAu
4590: 74 68 6f 72 69 7a 65 64 28 7a 52 65 61 6c 6d 29  thorized(zRealm)
45a0: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
45b0: 0a 2f 2a 0a 2a 2a 20 47 75 65 73 73 20 74 68 65  ./*.** Guess the
45c0: 20 6d 69 6d 65 2d 74 79 70 65 20 6f 66 20 61 20   mime-type of a 
45d0: 64 6f 63 75 6d 65 6e 74 20 62 61 73 65 64 20 6f  document based o
45e0: 6e 20 69 74 73 20 6e 61 6d 65 2e 0a 2a 2f 0a 63  n its name..*/.c
45f0: 6f 6e 73 74 20 63 68 61 72 20 2a 47 65 74 4d 69  onst char *GetMi
4600: 6d 65 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61  meType(const cha
4610: 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e  r *zName, int nN
4620: 61 6d 65 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  ame){.  const ch
4630: 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a  ar *z;.  int i;.
4640: 20 20 69 6e 74 20 66 69 72 73 74 2c 20 6c 61 73    int first, las
4650: 74 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  t;.  int len;.  
4660: 63 68 61 72 20 7a 53 75 66 66 69 78 5b 32 30 5d  char zSuffix[20]
4670: 3b 0a 0a 20 20 2f 2a 20 41 20 74 61 62 6c 65 20  ;..  /* A table 
4680: 6f 66 20 6d 69 6d 65 74 79 70 65 73 20 62 61 73  of mimetypes bas
4690: 65 64 20 6f 6e 20 66 69 6c 65 20 73 75 66 66 69  ed on file suffi
46a0: 78 65 73 2e 20 0a 20 20 2a 2a 20 53 75 66 66 69  xes. .  ** Suffi
46b0: 78 65 73 20 6d 75 73 74 20 62 65 20 69 6e 20 73  xes must be in s
46c0: 6f 72 74 65 64 20 6f 72 64 65 72 20 73 6f 20 74  orted order so t
46d0: 68 61 74 20 77 65 20 63 61 6e 20 64 6f 20 61 20  hat we can do a 
46e0: 62 69 6e 61 72 79 0a 20 20 2a 2a 20 73 65 61 72  binary.  ** sear
46f0: 63 68 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d  ch to find the m
4700: 69 6d 65 2d 74 79 70 65 0a 20 20 2a 2f 0a 20 20  ime-type.  */.  
4710: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
4720: 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  uct {.    const 
4730: 63 68 61 72 20 2a 7a 53 75 66 66 69 78 3b 20 20  char *zSuffix;  
4740: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
4750: 20 73 75 66 66 69 78 20 2a 2f 0a 20 20 20 20 69   suffix */.    i
4760: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
4770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
4780: 67 74 68 20 6f 66 20 74 68 65 20 73 75 66 66 69  gth of the suffi
4790: 78 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63  x */.    const c
47a0: 68 61 72 20 2a 7a 4d 69 6d 65 74 79 70 65 3b 20  har *zMimetype; 
47b0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 72 72 65      /* The corre
47c0: 73 70 6f 6e 64 69 6e 67 20 6d 69 6d 65 74 79 70  sponding mimetyp
47d0: 65 20 2a 2f 0a 20 20 7d 20 61 4d 69 6d 65 5b 5d  e */.  } aMime[]
47e0: 20 3d 20 7b 0a 20 20 20 20 7b 20 22 61 69 22 2c   = {.    { "ai",
47f0: 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70 70           2, "app
4800: 6c 69 63 61 74 69 6f 6e 2f 70 6f 73 74 73 63 72  lication/postscr
4810: 69 70 74 22 20 20 20 20 20 20 20 20 20 20 20 20  ipt"            
4820: 7d 2c 0a 20 20 20 20 7b 20 22 61 69 66 22 2c 20  },.    { "aif", 
4830: 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f         3, "audio
4840: 2f 78 2d 61 69 66 66 22 20 20 20 20 20 20 20 20  /x-aiff"        
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
4860: 0a 20 20 20 20 7b 20 22 61 69 66 63 22 2c 20 20  .    { "aifc",  
4870: 20 20 20 20 20 34 2c 20 22 61 75 64 69 6f 2f 78       4, "audio/x
4880: 2d 61 69 66 66 22 20 20 20 20 20 20 20 20 20 20  -aiff"          
4890: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
48a0: 20 20 20 7b 20 22 61 69 66 66 22 2c 20 20 20 20     { "aiff",    
48b0: 20 20 20 34 2c 20 22 61 75 64 69 6f 2f 78 2d 61     4, "audio/x-a
48c0: 69 66 66 22 20 20 20 20 20 20 20 20 20 20 20 20  iff"            
48d0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
48e0: 20 7b 20 22 61 72 6a 22 2c 20 20 20 20 20 20 20   { "arj",       
48f0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
4900: 2f 78 2d 61 72 6a 2d 63 6f 6d 70 72 65 73 73 65  /x-arj-compresse
4910: 64 22 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  d"      },.    {
4920: 20 22 61 73 63 22 2c 20 20 20 20 20 20 20 20 33   "asc",        3
4930: 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20  , "text/plain"  
4940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4950: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
4960: 61 73 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20  asf",        3, 
4970: 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 61 73 66 22  "video/x-ms-asf"
4980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4990: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 73      },.    { "as
49a0: 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76  x",        3, "v
49b0: 69 64 65 6f 2f 78 2d 6d 73 2d 61 73 78 22 20 20  ideo/x-ms-asx"  
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49d0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 75 22 2c    },.    { "au",
49e0: 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 75 64           2, "aud
49f0: 69 6f 2f 75 6c 61 77 22 20 20 20 20 20 20 20 20  io/ulaw"        
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a10: 7d 2c 0a 20 20 20 20 7b 20 22 61 76 69 22 2c 20  },.    { "avi", 
4a20: 20 20 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f         3, "video
4a30: 2f 78 2d 6d 73 76 69 64 65 6f 22 20 20 20 20 20  /x-msvideo"     
4a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
4a50: 0a 20 20 20 20 7b 20 22 62 61 74 22 2c 20 20 20  .    { "bat",   
4a60: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
4a70: 74 69 6f 6e 2f 78 2d 6d 73 64 6f 73 2d 70 72 6f  tion/x-msdos-pro
4a80: 67 72 61 6d 22 20 20 20 20 20 20 20 7d 2c 0a 20  gram"       },. 
4a90: 20 20 20 7b 20 22 62 63 70 69 6f 22 2c 20 20 20     { "bcpio",   
4aa0: 20 20 20 35 2c 20 22 61 70 70 6c 69 63 61 74 69     5, "applicati
4ab0: 6f 6e 2f 78 2d 62 63 70 69 6f 22 20 20 20 20 20  on/x-bcpio"     
4ac0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
4ad0: 20 7b 20 22 62 69 6e 22 2c 20 20 20 20 20 20 20   { "bin",       
4ae0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
4af0: 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22 20 20  /octet-stream"  
4b00: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
4b10: 20 22 63 22 2c 20 20 20 20 20 20 20 20 20 20 31   "c",          1
4b20: 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20  , "text/plain"  
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b40: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
4b50: 63 63 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  cc",         2, 
4b60: 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20  "text/plain"    
4b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b80: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 63      },.    { "cc
4b90: 61 64 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61  ad",       4, "a
4ba0: 70 70 6c 69 63 61 74 69 6f 6e 2f 63 6c 61 72 69  pplication/clari
4bb0: 73 63 61 64 22 20 20 20 20 20 20 20 20 20 20 20  scad"           
4bc0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 64 66 22    },.    { "cdf"
4bd0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
4be0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 6e 65 74 63 64  lication/x-netcd
4bf0: 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f"              
4c00: 7d 2c 0a 20 20 20 20 7b 20 22 63 6c 61 73 73 22  },.    { "class"
4c10: 2c 20 20 20 20 20 20 35 2c 20 22 61 70 70 6c 69  ,      5, "appli
4c20: 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72  cation/octet-str
4c30: 65 61 6d 22 20 20 20 20 20 20 20 20 20 20 7d 2c  eam"          },
4c40: 0a 20 20 20 20 7b 20 22 63 6f 64 22 2c 20 20 20  .    { "cod",   
4c50: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
4c60: 74 69 6f 6e 2f 76 6e 64 2e 72 69 6d 2e 63 6f 64  tion/vnd.rim.cod
4c70: 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  "           },. 
4c80: 20 20 20 7b 20 22 63 6f 6d 22 2c 20 20 20 20 20     { "com",     
4c90: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
4ca0: 6f 6e 2f 78 2d 6d 73 64 6f 73 2d 70 72 6f 67 72  on/x-msdos-progr
4cb0: 61 6d 22 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  am"       },.   
4cc0: 20 7b 20 22 63 70 69 6f 22 2c 20 20 20 20 20 20   { "cpio",      
4cd0: 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   4, "application
4ce0: 2f 78 2d 63 70 69 6f 22 20 20 20 20 20 20 20 20  /x-cpio"        
4cf0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
4d00: 20 22 63 70 74 22 2c 20 20 20 20 20 20 20 20 33   "cpt",        3
4d10: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d  , "application/m
4d20: 61 63 2d 63 6f 6d 70 61 63 74 70 72 6f 22 20 20  ac-compactpro"  
4d30: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
4d40: 63 73 68 22 2c 20 20 20 20 20 20 20 20 33 2c 20  csh",        3, 
4d50: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 63  "application/x-c
4d60: 73 68 22 20 20 20 20 20 20 20 20 20 20 20 20 20  sh"             
4d70: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 73      },.    { "cs
4d80: 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74  s",        3, "t
4d90: 65 78 74 2f 63 73 73 22 20 20 20 20 20 20 20 20  ext/css"        
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4db0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 63 72 22    },.    { "dcr"
4dc0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
4dd0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 64 69 72 65 63  lication/x-direc
4de0: 74 6f 72 22 20 20 20 20 20 20 20 20 20 20 20 20  tor"            
4df0: 7d 2c 0a 20 20 20 20 7b 20 22 64 65 62 22 2c 20  },.    { "deb", 
4e00: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
4e10: 63 61 74 69 6f 6e 2f 78 2d 64 65 62 69 61 6e 2d  cation/x-debian-
4e20: 70 61 63 6b 61 67 65 22 20 20 20 20 20 20 7d 2c  package"      },
4e30: 0a 20 20 20 20 7b 20 22 64 69 72 22 2c 20 20 20  .    { "dir",   
4e40: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
4e50: 74 69 6f 6e 2f 78 2d 64 69 72 65 63 74 6f 72 22  tion/x-director"
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
4e70: 20 20 20 7b 20 22 64 6c 22 2c 20 20 20 20 20 20     { "dl",      
4e80: 20 20 20 32 2c 20 22 76 69 64 65 6f 2f 64 6c 22     2, "video/dl"
4e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ea0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
4eb0: 20 7b 20 22 64 6d 73 22 2c 20 20 20 20 20 20 20   { "dms",       
4ec0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
4ed0: 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22 20 20  /octet-stream"  
4ee0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
4ef0: 20 22 64 6f 63 22 2c 20 20 20 20 20 20 20 20 33   "doc",        3
4f00: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d  , "application/m
4f10: 73 77 6f 72 64 22 20 20 20 20 20 20 20 20 20 20  sword"          
4f20: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
4f30: 64 72 77 22 2c 20 20 20 20 20 20 20 20 33 2c 20  drw",        3, 
4f40: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 64 72 61  "application/dra
4f50: 66 74 69 6e 67 22 20 20 20 20 20 20 20 20 20 20  fting"          
4f60: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 76      },.    { "dv
4f70: 69 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  i",        3, "a
4f80: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 64 76 69  pplication/x-dvi
4f90: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
4fa0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 77 67 22    },.    { "dwg"
4fb0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
4fc0: 6c 69 63 61 74 69 6f 6e 2f 61 63 61 64 22 20 20  lication/acad"  
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fe0: 7d 2c 0a 20 20 20 20 7b 20 22 64 78 66 22 2c 20  },.    { "dxf", 
4ff0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
5000: 63 61 74 69 6f 6e 2f 64 78 66 22 20 20 20 20 20  cation/dxf"     
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
5020: 0a 20 20 20 20 7b 20 22 64 78 72 22 2c 20 20 20  .    { "dxr",   
5030: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
5040: 74 69 6f 6e 2f 78 2d 64 69 72 65 63 74 6f 72 22  tion/x-director"
5050: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5060: 20 20 20 7b 20 22 65 70 73 22 2c 20 20 20 20 20     { "eps",     
5070: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
5080: 6f 6e 2f 70 6f 73 74 73 63 72 69 70 74 22 20 20  on/postscript"  
5090: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
50a0: 20 7b 20 22 65 74 78 22 2c 20 20 20 20 20 20 20   { "etx",       
50b0: 20 33 2c 20 22 74 65 78 74 2f 78 2d 73 65 74 65   3, "text/x-sete
50c0: 78 74 22 20 20 20 20 20 20 20 20 20 20 20 20 20  xt"             
50d0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
50e0: 20 22 65 78 65 22 2c 20 20 20 20 20 20 20 20 33   "exe",        3
50f0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f  , "application/o
5100: 63 74 65 74 2d 73 74 72 65 61 6d 22 20 20 20 20  ctet-stream"    
5110: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5120: 65 7a 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  ez",         2, 
5130: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 61 6e 64  "application/and
5140: 72 65 77 2d 69 6e 73 65 74 22 20 20 20 20 20 20  rew-inset"      
5150: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66 22      },.    { "f"
5160: 2c 20 20 20 20 20 20 20 20 20 20 31 2c 20 22 74  ,          1, "t
5170: 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20  ext/plain"      
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66 39 30 22    },.    { "f90"
51a0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65 78  ,        3, "tex
51b0: 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20  t/plain"        
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51d0: 7d 2c 0a 20 20 20 20 7b 20 22 66 6c 69 22 2c 20  },.    { "fli", 
51e0: 20 20 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f         3, "video
51f0: 2f 66 6c 69 22 20 20 20 20 20 20 20 20 20 20 20  /fli"           
5200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
5210: 0a 20 20 20 20 7b 20 22 66 6c 76 22 2c 20 20 20  .    { "flv",   
5220: 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 66       3, "video/f
5230: 6c 76 22 20 20 20 20 20 20 20 20 20 20 20 20 20  lv"             
5240: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5250: 20 20 20 7b 20 22 67 69 66 22 2c 20 20 20 20 20     { "gif",     
5260: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 67 69 66     3, "image/gif
5270: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
5280: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5290: 20 7b 20 22 67 6c 22 2c 20 20 20 20 20 20 20 20   { "gl",        
52a0: 20 32 2c 20 22 76 69 64 65 6f 2f 67 6c 22 20 20   2, "video/gl"  
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52c0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
52d0: 20 22 67 74 61 72 22 2c 20 20 20 20 20 20 20 34   "gtar",       4
52e0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
52f0: 2d 67 74 61 72 22 20 20 20 20 20 20 20 20 20 20  -gtar"          
5300: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5310: 67 7a 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  gz",         2, 
5320: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 67  "application/x-g
5330: 7a 69 70 22 20 20 20 20 20 20 20 20 20 20 20 20  zip"            
5340: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68 64      },.    { "hd
5350: 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  f",        3, "a
5360: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 68 64 66  pplication/x-hdf
5370: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
5380: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68 68 22 2c    },.    { "hh",
5390: 20 20 20 20 20 20 20 20 20 32 2c 20 22 74 65 78           2, "tex
53a0: 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20  t/plain"        
53b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53c0: 7d 2c 0a 20 20 20 20 7b 20 22 68 71 78 22 2c 20  },.    { "hqx", 
53d0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
53e0: 63 61 74 69 6f 6e 2f 6d 61 63 2d 62 69 6e 68 65  cation/mac-binhe
53f0: 78 34 30 22 20 20 20 20 20 20 20 20 20 20 7d 2c  x40"          },
5400: 0a 20 20 20 20 7b 20 22 68 22 2c 20 20 20 20 20  .    { "h",     
5410: 20 20 20 20 20 31 2c 20 22 74 65 78 74 2f 70 6c       1, "text/pl
5420: 61 69 6e 22 20 20 20 20 20 20 20 20 20 20 20 20  ain"            
5430: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5440: 20 20 20 7b 20 22 68 74 6d 22 2c 20 20 20 20 20     { "htm",     
5450: 20 20 20 33 2c 20 22 74 65 78 74 2f 68 74 6d 6c     3, "text/html
5460: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
5470: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5480: 20 7b 20 22 68 74 6d 6c 22 2c 20 20 20 20 20 20   { "html",      
5490: 20 34 2c 20 22 74 65 78 74 2f 68 74 6d 6c 22 20   4, "text/html" 
54a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54b0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
54c0: 20 22 69 63 65 22 2c 20 20 20 20 20 20 20 20 33   "ice",        3
54d0: 2c 20 22 78 2d 63 6f 6e 66 65 72 65 6e 63 65 2f  , "x-conference/
54e0: 78 2d 63 6f 6f 6c 74 61 6c 6b 22 20 20 20 20 20  x-cooltalk"     
54f0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5500: 69 65 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20  ief",        3, 
5510: 22 69 6d 61 67 65 2f 69 65 66 22 20 20 20 20 20  "image/ief"     
5520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5530: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 67      },.    { "ig
5540: 65 73 22 2c 20 20 20 20 20 20 20 34 2c 20 22 6d  es",       4, "m
5550: 6f 64 65 6c 2f 69 67 65 73 22 20 20 20 20 20 20  odel/iges"      
5560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5570: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 67 73 22    },.    { "igs"
5580: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 6d 6f 64  ,        3, "mod
5590: 65 6c 2f 69 67 65 73 22 20 20 20 20 20 20 20 20  el/iges"        
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55b0: 7d 2c 0a 20 20 20 20 7b 20 22 69 70 73 22 2c 20  },.    { "ips", 
55c0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
55d0: 63 61 74 69 6f 6e 2f 78 2d 69 70 73 63 72 69 70  cation/x-ipscrip
55e0: 74 22 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  t"            },
55f0: 0a 20 20 20 20 7b 20 22 69 70 78 22 2c 20 20 20  .    { "ipx",   
5600: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
5610: 74 69 6f 6e 2f 78 2d 69 70 69 78 22 20 20 20 20  tion/x-ipix"    
5620: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5630: 20 20 20 7b 20 22 6a 61 64 22 2c 20 20 20 20 20     { "jad",     
5640: 20 20 20 33 2c 20 22 74 65 78 74 2f 76 6e 64 2e     3, "text/vnd.
5650: 73 75 6e 2e 6a 32 6d 65 2e 61 70 70 2d 64 65 73  sun.j2me.app-des
5660: 63 72 69 70 74 6f 72 22 20 20 7d 2c 0a 20 20 20  criptor"  },.   
5670: 20 7b 20 22 6a 61 72 22 2c 20 20 20 20 20 20 20   { "jar",       
5680: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
5690: 2f 6a 61 76 61 2d 61 72 63 68 69 76 65 22 20 20  /java-archive"  
56a0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
56b0: 20 22 6a 70 65 67 22 2c 20 20 20 20 20 20 20 34   "jpeg",       4
56c0: 2c 20 22 69 6d 61 67 65 2f 6a 70 65 67 22 20 20  , "image/jpeg"  
56d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56e0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
56f0: 6a 70 65 22 2c 20 20 20 20 20 20 20 20 33 2c 20  jpe",        3, 
5700: 22 69 6d 61 67 65 2f 6a 70 65 67 22 20 20 20 20  "image/jpeg"    
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5720: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 70      },.    { "jp
5730: 67 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69  g",        3, "i
5740: 6d 61 67 65 2f 6a 70 65 67 22 20 20 20 20 20 20  mage/jpeg"      
5750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5760: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 22 2c    },.    { "js",
5770: 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70 70           2, "app
5780: 6c 69 63 61 74 69 6f 6e 2f 78 2d 6a 61 76 61 73  lication/x-javas
5790: 63 72 69 70 74 22 20 20 20 20 20 20 20 20 20 20  cript"          
57a0: 7d 2c 0a 20 20 20 20 7b 20 22 6b 61 72 22 2c 20  },.    { "kar", 
57b0: 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f         3, "audio
57c0: 2f 6d 69 64 69 22 20 20 20 20 20 20 20 20 20 20  /midi"          
57d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
57e0: 0a 20 20 20 20 7b 20 22 6c 61 74 65 78 22 2c 20  .    { "latex", 
57f0: 20 20 20 20 20 35 2c 20 22 61 70 70 6c 69 63 61       5, "applica
5800: 74 69 6f 6e 2f 78 2d 6c 61 74 65 78 22 20 20 20  tion/x-latex"   
5810: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5820: 20 20 20 7b 20 22 6c 68 61 22 2c 20 20 20 20 20     { "lha",     
5830: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
5840: 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22  on/octet-stream"
5850: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5860: 20 7b 20 22 6c 73 70 22 2c 20 20 20 20 20 20 20   { "lsp",       
5870: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
5880: 2f 78 2d 6c 69 73 70 22 20 20 20 20 20 20 20 20  /x-lisp"        
5890: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
58a0: 20 22 6c 7a 68 22 2c 20 20 20 20 20 20 20 20 33   "lzh",        3
58b0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f  , "application/o
58c0: 63 74 65 74 2d 73 74 72 65 61 6d 22 20 20 20 20  ctet-stream"    
58d0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
58e0: 6d 22 2c 20 20 20 20 20 20 20 20 20 20 31 2c 20  m",          1, 
58f0: 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20  "text/plain"    
5900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5910: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 33      },.    { "m3
5920: 75 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  u",        3, "a
5930: 75 64 69 6f 2f 78 2d 6d 70 65 67 75 72 6c 22 20  udio/x-mpegurl" 
5940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5950: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 61 6e 22    },.    { "man"
5960: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
5970: 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72 6f 66 66  lication/x-troff
5980: 2d 6d 61 6e 22 20 20 20 20 20 20 20 20 20 20 20  -man"           
5990: 7d 2c 0a 20 20 20 20 7b 20 22 6d 65 22 2c 20 20  },.    { "me",  
59a0: 20 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69         2, "appli
59b0: 63 61 74 69 6f 6e 2f 78 2d 74 72 6f 66 66 2d 6d  cation/x-troff-m
59c0: 65 22 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  e"            },
59d0: 0a 20 20 20 20 7b 20 22 6d 65 73 68 22 2c 20 20  .    { "mesh",  
59e0: 20 20 20 20 20 34 2c 20 22 6d 6f 64 65 6c 2f 6d       4, "model/m
59f0: 65 73 68 22 20 20 20 20 20 20 20 20 20 20 20 20  esh"            
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5a10: 20 20 20 7b 20 22 6d 69 64 22 2c 20 20 20 20 20     { "mid",     
5a20: 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 6d 69 64     3, "audio/mid
5a30: 69 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i"              
5a40: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5a50: 20 7b 20 22 6d 69 64 69 22 2c 20 20 20 20 20 20   { "midi",      
5a60: 20 34 2c 20 22 61 75 64 69 6f 2f 6d 69 64 69 22   4, "audio/midi"
5a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a80: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5a90: 20 22 6d 69 66 22 2c 20 20 20 20 20 20 20 20 33   "mif",        3
5aa0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
5ab0: 2d 6d 69 66 22 20 20 20 20 20 20 20 20 20 20 20  -mif"           
5ac0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5ad0: 6d 69 6d 65 22 2c 20 20 20 20 20 20 20 34 2c 20  mime",       4, 
5ae0: 22 77 77 77 2f 6d 69 6d 65 22 20 20 20 20 20 20  "www/mime"      
5af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b00: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 6f      },.    { "mo
5b10: 76 69 65 22 2c 20 20 20 20 20 20 35 2c 20 22 76  vie",      5, "v
5b20: 69 64 65 6f 2f 78 2d 73 67 69 2d 6d 6f 76 69 65  ideo/x-sgi-movie
5b30: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
5b40: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 6f 76 22    },.    { "mov"
5b50: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64  ,        3, "vid
5b60: 65 6f 2f 71 75 69 63 6b 74 69 6d 65 22 20 20 20  eo/quicktime"   
5b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b80: 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 32 22 2c 20  },.    { "mp2", 
5b90: 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f         3, "audio
5ba0: 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20 20 20  /mpeg"          
5bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
5bc0: 0a 20 20 20 20 7b 20 22 6d 70 32 22 2c 20 20 20  .    { "mp2",   
5bd0: 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 6d       3, "video/m
5be0: 70 65 67 22 20 20 20 20 20 20 20 20 20 20 20 20  peg"            
5bf0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5c00: 20 20 20 7b 20 22 6d 70 33 22 2c 20 20 20 20 20     { "mp3",     
5c10: 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 6d 70 65     3, "audio/mpe
5c20: 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g"              
5c30: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5c40: 20 7b 20 22 6d 70 65 67 22 2c 20 20 20 20 20 20   { "mpeg",      
5c50: 20 34 2c 20 22 76 69 64 65 6f 2f 6d 70 65 67 22   4, "video/mpeg"
5c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c70: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5c80: 20 22 6d 70 65 22 2c 20 20 20 20 20 20 20 20 33   "mpe",        3
5c90: 2c 20 22 76 69 64 65 6f 2f 6d 70 65 67 22 20 20  , "video/mpeg"  
5ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cb0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5cc0: 6d 70 67 61 22 2c 20 20 20 20 20 20 20 34 2c 20  mpga",       4, 
5cd0: 22 61 75 64 69 6f 2f 6d 70 65 67 22 20 20 20 20  "audio/mpeg"    
5ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cf0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70      },.    { "mp
5d00: 67 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76  g",        3, "v
5d10: 69 64 65 6f 2f 6d 70 65 67 22 20 20 20 20 20 20  ideo/mpeg"      
5d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d30: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 73 22 2c    },.    { "ms",
5d40: 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70 70           2, "app
5d50: 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72 6f 66 66  lication/x-troff
5d60: 2d 6d 73 22 20 20 20 20 20 20 20 20 20 20 20 20  -ms"            
5d70: 7d 2c 0a 20 20 20 20 7b 20 22 6d 73 68 22 2c 20  },.    { "msh", 
5d80: 20 20 20 20 20 20 20 33 2c 20 22 6d 6f 64 65 6c         3, "model
5d90: 2f 6d 65 73 68 22 20 20 20 20 20 20 20 20 20 20  /mesh"          
5da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
5db0: 0a 20 20 20 20 7b 20 22 6e 63 22 2c 20 20 20 20  .    { "nc",    
5dc0: 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61       2, "applica
5dd0: 74 69 6f 6e 2f 78 2d 6e 65 74 63 64 66 22 20 20  tion/x-netcdf"  
5de0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5df0: 20 20 20 7b 20 22 6f 64 61 22 2c 20 20 20 20 20     { "oda",     
5e00: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
5e10: 6f 6e 2f 6f 64 61 22 20 20 20 20 20 20 20 20 20  on/oda"         
5e20: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5e30: 20 7b 20 22 6f 67 67 22 2c 20 20 20 20 20 20 20   { "ogg",       
5e40: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
5e50: 2f 6f 67 67 22 20 20 20 20 20 20 20 20 20 20 20  /ogg"           
5e60: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5e70: 20 22 6f 67 6d 22 2c 20 20 20 20 20 20 20 20 33   "ogm",        3
5e80: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f  , "application/o
5e90: 67 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20  gg"             
5ea0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5eb0: 70 62 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20  pbm",        3, 
5ec0: 22 69 6d 61 67 65 2f 78 2d 70 6f 72 74 61 62 6c  "image/x-portabl
5ed0: 65 2d 62 69 74 6d 61 70 22 20 20 20 20 20 20 20  e-bitmap"       
5ee0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 64      },.    { "pd
5ef0: 62 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 63  b",        3, "c
5f00: 68 65 6d 69 63 61 6c 2f 78 2d 70 64 62 22 20 20  hemical/x-pdb"  
5f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f20: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 64 66 22    },.    { "pdf"
5f30: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
5f40: 6c 69 63 61 74 69 6f 6e 2f 70 64 66 22 20 20 20  lication/pdf"   
5f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f60: 7d 2c 0a 20 20 20 20 7b 20 22 70 67 6d 22 2c 20  },.    { "pgm", 
5f70: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
5f80: 2f 78 2d 70 6f 72 74 61 62 6c 65 2d 67 72 61 79  /x-portable-gray
5f90: 6d 61 70 22 20 20 20 20 20 20 20 20 20 20 7d 2c  map"          },
5fa0: 0a 20 20 20 20 7b 20 22 70 67 6e 22 2c 20 20 20  .    { "pgn",   
5fb0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
5fc0: 74 69 6f 6e 2f 78 2d 63 68 65 73 73 2d 70 67 6e  tion/x-chess-pgn
5fd0: 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  "           },. 
5fe0: 20 20 20 7b 20 22 70 67 70 22 2c 20 20 20 20 20     { "pgp",     
5ff0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
6000: 6f 6e 2f 70 67 70 22 20 20 20 20 20 20 20 20 20  on/pgp"         
6010: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6020: 20 7b 20 22 70 6c 22 2c 20 20 20 20 20 20 20 20   { "pl",        
6030: 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   2, "application
6040: 2f 78 2d 70 65 72 6c 22 20 20 20 20 20 20 20 20  /x-perl"        
6050: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6060: 20 22 70 6d 22 2c 20 20 20 20 20 20 20 20 20 32   "pm",         2
6070: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
6080: 2d 70 65 72 6c 22 20 20 20 20 20 20 20 20 20 20  -perl"          
6090: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
60a0: 70 6e 67 22 2c 20 20 20 20 20 20 20 20 33 2c 20  png",        3, 
60b0: 22 69 6d 61 67 65 2f 70 6e 67 22 20 20 20 20 20  "image/png"     
60c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60d0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 6e      },.    { "pn
60e0: 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69  m",        3, "i
60f0: 6d 61 67 65 2f 78 2d 70 6f 72 74 61 62 6c 65 2d  mage/x-portable-
6100: 61 6e 79 6d 61 70 22 20 20 20 20 20 20 20 20 20  anymap"         
6110: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 6f 74 22    },.    { "pot"
6120: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
6130: 6c 69 63 61 74 69 6f 6e 2f 6d 73 70 6f 77 65 72  lication/mspower
6140: 70 6f 69 6e 74 22 20 20 20 20 20 20 20 20 20 20  point"          
6150: 7d 2c 0a 20 20 20 20 7b 20 22 70 70 6d 22 2c 20  },.    { "ppm", 
6160: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
6170: 2f 78 2d 70 6f 72 74 61 62 6c 65 2d 70 69 78 6d  /x-portable-pixm
6180: 61 70 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c  ap"           },
6190: 0a 20 20 20 20 7b 20 22 70 70 73 22 2c 20 20 20  .    { "pps",   
61a0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
61b0: 74 69 6f 6e 2f 6d 73 70 6f 77 65 72 70 6f 69 6e  tion/mspowerpoin
61c0: 74 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  t"          },. 
61d0: 20 20 20 7b 20 22 70 70 74 22 2c 20 20 20 20 20     { "ppt",     
61e0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
61f0: 6f 6e 2f 6d 73 70 6f 77 65 72 70 6f 69 6e 74 22  on/mspowerpoint"
6200: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6210: 20 7b 20 22 70 70 7a 22 2c 20 20 20 20 20 20 20   { "ppz",       
6220: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
6230: 2f 6d 73 70 6f 77 65 72 70 6f 69 6e 74 22 20 20  /mspowerpoint"  
6240: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6250: 20 22 70 72 65 22 2c 20 20 20 20 20 20 20 20 33   "pre",        3
6260: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
6270: 2d 66 72 65 65 6c 61 6e 63 65 22 20 20 20 20 20  -freelance"     
6280: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6290: 70 72 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20  prt",        3, 
62a0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 72 6f  "application/pro
62b0: 5f 65 6e 67 22 20 20 20 20 20 20 20 20 20 20 20  _eng"           
62c0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 73      },.    { "ps
62d0: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61  ",         2, "a
62e0: 70 70 6c 69 63 61 74 69 6f 6e 2f 70 6f 73 74 73  pplication/posts
62f0: 63 72 69 70 74 22 20 20 20 20 20 20 20 20 20 20  cript"          
6300: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 71 74 22 2c    },.    { "qt",
6310: 20 20 20 20 20 20 20 20 20 32 2c 20 22 76 69 64           2, "vid
6320: 65 6f 2f 71 75 69 63 6b 74 69 6d 65 22 20 20 20  eo/quicktime"   
6330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6340: 7d 2c 0a 20 20 20 20 7b 20 22 72 61 22 2c 20 20  },.    { "ra",  
6350: 20 20 20 20 20 20 20 32 2c 20 22 61 75 64 69 6f         2, "audio
6360: 2f 78 2d 72 65 61 6c 61 75 64 69 6f 22 20 20 20  /x-realaudio"   
6370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6380: 0a 20 20 20 20 7b 20 22 72 61 6d 22 2c 20 20 20  .    { "ram",   
6390: 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 78       3, "audio/x
63a0: 2d 70 6e 2d 72 65 61 6c 61 75 64 69 6f 22 20 20  -pn-realaudio"  
63b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
63c0: 20 20 20 7b 20 22 72 61 72 22 2c 20 20 20 20 20     { "rar",     
63d0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
63e0: 6f 6e 2f 78 2d 72 61 72 2d 63 6f 6d 70 72 65 73  on/x-rar-compres
63f0: 73 65 64 22 20 20 20 20 20 20 7d 2c 0a 20 20 20  sed"      },.   
6400: 20 7b 20 22 72 61 73 22 2c 20 20 20 20 20 20 20   { "ras",       
6410: 20 33 2c 20 22 69 6d 61 67 65 2f 63 6d 75 2d 72   3, "image/cmu-r
6420: 61 73 74 65 72 22 20 20 20 20 20 20 20 20 20 20  aster"          
6430: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6440: 20 22 72 61 73 22 2c 20 20 20 20 20 20 20 20 33   "ras",        3
6450: 2c 20 22 69 6d 61 67 65 2f 78 2d 63 6d 75 2d 72  , "image/x-cmu-r
6460: 61 73 74 65 72 22 20 20 20 20 20 20 20 20 20 20  aster"          
6470: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6480: 72 67 62 22 2c 20 20 20 20 20 20 20 20 33 2c 20  rgb",        3, 
6490: 22 69 6d 61 67 65 2f 78 2d 72 67 62 22 20 20 20  "image/x-rgb"   
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64b0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 6d      },.    { "rm
64c0: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61  ",         2, "a
64d0: 75 64 69 6f 2f 78 2d 70 6e 2d 72 65 61 6c 61 75  udio/x-pn-realau
64e0: 64 69 6f 22 20 20 20 20 20 20 20 20 20 20 20 20  dio"            
64f0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 6f 66 66    },.    { "roff
6500: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70 70  ",       4, "app
6510: 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72 6f 66 66  lication/x-troff
6520: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
6530: 7d 2c 0a 20 20 20 20 7b 20 22 72 70 6d 22 2c 20  },.    { "rpm", 
6540: 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f         3, "audio
6550: 2f 78 2d 70 6e 2d 72 65 61 6c 61 75 64 69 6f 2d  /x-pn-realaudio-
6560: 70 6c 75 67 69 6e 22 20 20 20 20 20 20 20 7d 2c  plugin"       },
6570: 0a 20 20 20 20 7b 20 22 72 74 66 22 2c 20 20 20  .    { "rtf",   
6580: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
6590: 74 69 6f 6e 2f 72 74 66 22 20 20 20 20 20 20 20  tion/rtf"       
65a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
65b0: 20 20 20 7b 20 22 72 74 66 22 2c 20 20 20 20 20     { "rtf",     
65c0: 20 20 20 33 2c 20 22 74 65 78 74 2f 72 74 66 22     3, "text/rtf"
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65e0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
65f0: 20 7b 20 22 72 74 78 22 2c 20 20 20 20 20 20 20   { "rtx",       
6600: 20 33 2c 20 22 74 65 78 74 2f 72 69 63 68 74 65   3, "text/richte
6610: 78 74 22 20 20 20 20 20 20 20 20 20 20 20 20 20  xt"             
6620: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6630: 20 22 73 63 6d 22 2c 20 20 20 20 20 20 20 20 33   "scm",        3
6640: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
6650: 2d 6c 6f 74 75 73 73 63 72 65 65 6e 63 61 6d 22  -lotusscreencam"
6660: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6670: 73 65 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20  set",        3, 
6680: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 73 65 74  "application/set
6690: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
66a0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 67      },.    { "sg
66b0: 6d 6c 22 2c 20 20 20 20 20 20 20 34 2c 20 22 74  ml",       4, "t
66c0: 65 78 74 2f 73 67 6d 6c 22 20 20 20 20 20 20 20  ext/sgml"       
66d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66e0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 67 6d 22    },.    { "sgm"
66f0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65 78  ,        3, "tex
6700: 74 2f 73 67 6d 6c 22 20 20 20 20 20 20 20 20 20  t/sgml"         
6710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6720: 7d 2c 0a 20 20 20 20 7b 20 22 73 68 22 2c 20 20  },.    { "sh",  
6730: 20 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69         2, "appli
6740: 63 61 74 69 6f 6e 2f 78 2d 73 68 22 20 20 20 20  cation/x-sh"    
6750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6760: 0a 20 20 20 20 7b 20 22 73 68 61 72 22 2c 20 20  .    { "shar",  
6770: 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61       4, "applica
6780: 74 69 6f 6e 2f 78 2d 73 68 61 72 22 20 20 20 20  tion/x-shar"    
6790: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
67a0: 20 20 20 7b 20 22 73 69 6c 6f 22 2c 20 20 20 20     { "silo",    
67b0: 20 20 20 34 2c 20 22 6d 6f 64 65 6c 2f 6d 65 73     4, "model/mes
67c0: 68 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h"              
67d0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
67e0: 20 7b 20 22 73 69 74 22 2c 20 20 20 20 20 20 20   { "sit",       
67f0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
6800: 2f 78 2d 73 74 75 66 66 69 74 22 20 20 20 20 20  /x-stuffit"     
6810: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6820: 20 22 73 6b 64 22 2c 20 20 20 20 20 20 20 20 33   "skd",        3
6830: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
6840: 2d 6b 6f 61 6e 22 20 20 20 20 20 20 20 20 20 20  -koan"          
6850: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6860: 73 6b 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20  skm",        3, 
6870: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6b  "application/x-k
6880: 6f 61 6e 22 20 20 20 20 20 20 20 20 20 20 20 20  oan"            
6890: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6b      },.    { "sk
68a0: 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  p",        3, "a
68b0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6b 6f 61  pplication/x-koa
68c0: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
68d0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6b 74 22    },.    { "skt"
68e0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
68f0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 6b 6f 61 6e 22  lication/x-koan"
6900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6910: 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 69 22 2c 20  },.    { "smi", 
6920: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
6930: 63 61 74 69 6f 6e 2f 73 6d 69 6c 22 20 20 20 20  cation/smil"    
6940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6950: 0a 20 20 20 20 7b 20 22 73 6d 69 6c 22 2c 20 20  .    { "smil",  
6960: 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61       4, "applica
6970: 74 69 6f 6e 2f 73 6d 69 6c 22 20 20 20 20 20 20  tion/smil"      
6980: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6990: 20 20 20 7b 20 22 73 6e 64 22 2c 20 20 20 20 20     { "snd",     
69a0: 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 62 61 73     3, "audio/bas
69b0: 69 63 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ic"             
69c0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
69d0: 20 7b 20 22 73 6f 6c 22 2c 20 20 20 20 20 20 20   { "sol",       
69e0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
69f0: 2f 73 6f 6c 69 64 73 22 20 20 20 20 20 20 20 20  /solids"        
6a00: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6a10: 20 22 73 70 6c 22 2c 20 20 20 20 20 20 20 20 33   "spl",        3
6a20: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
6a30: 2d 66 75 74 75 72 65 73 70 6c 61 73 68 22 20 20  -futuresplash"  
6a40: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6a50: 73 72 63 22 2c 20 20 20 20 20 20 20 20 33 2c 20  src",        3, 
6a60: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 77  "application/x-w
6a70: 61 69 73 2d 73 6f 75 72 63 65 22 20 20 20 20 20  ais-source"     
6a80: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 74      },.    { "st
6a90: 65 70 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61  ep",       4, "a
6aa0: 70 70 6c 69 63 61 74 69 6f 6e 2f 53 54 45 50 22  pplication/STEP"
6ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ac0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 74 6c 22    },.    { "stl"
6ad0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
6ae0: 6c 69 63 61 74 69 6f 6e 2f 53 4c 41 22 20 20 20  lication/SLA"   
6af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b00: 7d 2c 0a 20 20 20 20 7b 20 22 73 74 70 22 2c 20  },.    { "stp", 
6b10: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
6b20: 63 61 74 69 6f 6e 2f 53 54 45 50 22 20 20 20 20  cation/STEP"    
6b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6b40: 0a 20 20 20 20 7b 20 22 73 76 34 63 70 69 6f 22  .    { "sv4cpio"
6b50: 2c 20 20 20 20 37 2c 20 22 61 70 70 6c 69 63 61  ,    7, "applica
6b60: 74 69 6f 6e 2f 78 2d 73 76 34 63 70 69 6f 22 20  tion/x-sv4cpio" 
6b70: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6b80: 20 20 20 7b 20 22 73 76 34 63 72 63 22 2c 20 20     { "sv4crc",  
6b90: 20 20 20 36 2c 20 22 61 70 70 6c 69 63 61 74 69     6, "applicati
6ba0: 6f 6e 2f 78 2d 73 76 34 63 72 63 22 20 20 20 20  on/x-sv4crc"    
6bb0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6bc0: 20 7b 20 22 73 77 66 22 2c 20 20 20 20 20 20 20   { "swf",       
6bd0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
6be0: 2f 78 2d 73 68 6f 63 6b 77 61 76 65 2d 66 6c 61  /x-shockwave-fla
6bf0: 73 68 22 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  sh"     },.    {
6c00: 20 22 74 22 2c 20 20 20 20 20 20 20 20 20 20 31   "t",          1
6c10: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
6c20: 2d 74 72 6f 66 66 22 20 20 20 20 20 20 20 20 20  -troff"         
6c30: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6c40: 74 61 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20  tar",        3, 
6c50: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74  "application/x-t
6c60: 61 72 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ar"             
6c70: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 63      },.    { "tc
6c80: 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  l",        3, "a
6c90: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 63 6c  pplication/x-tcl
6ca0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
6cb0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 65 78 22    },.    { "tex"
6cc0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
6cd0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 65 78 22 20  lication/x-tex" 
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cf0: 7d 2c 0a 20 20 20 20 7b 20 22 74 65 78 69 22 2c  },.    { "texi",
6d00: 20 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69         4, "appli
6d10: 63 61 74 69 6f 6e 2f 78 2d 74 65 78 69 6e 66 6f  cation/x-texinfo
6d20: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  "             },
6d30: 0a 20 20 20 20 7b 20 22 74 65 78 69 6e 66 6f 22  .    { "texinfo"
6d40: 2c 20 20 20 20 37 2c 20 22 61 70 70 6c 69 63 61  ,    7, "applica
6d50: 74 69 6f 6e 2f 78 2d 74 65 78 69 6e 66 6f 22 20  tion/x-texinfo" 
6d60: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6d70: 20 20 20 7b 20 22 74 67 7a 22 2c 20 20 20 20 20     { "tgz",     
6d80: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
6d90: 6f 6e 2f 78 2d 74 61 72 2d 67 7a 22 20 20 20 20  on/x-tar-gz"    
6da0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6db0: 20 7b 20 22 74 69 66 66 22 2c 20 20 20 20 20 20   { "tiff",      
6dc0: 20 34 2c 20 22 69 6d 61 67 65 2f 74 69 66 66 22   4, "image/tiff"
6dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6de0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6df0: 20 22 74 69 66 22 2c 20 20 20 20 20 20 20 20 33   "tif",        3
6e00: 2c 20 22 69 6d 61 67 65 2f 74 69 66 66 22 20 20  , "image/tiff"  
6e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e20: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6e30: 74 72 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  tr",         2, 
6e40: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74  "application/x-t
6e50: 72 6f 66 66 22 20 20 20 20 20 20 20 20 20 20 20  roff"           
6e60: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 73      },.    { "ts
6e70: 69 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  i",        3, "a
6e80: 75 64 69 6f 2f 54 53 50 2d 61 75 64 69 6f 22 20  udio/TSP-audio" 
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ea0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 73 70 22    },.    { "tsp"
6eb0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
6ec0: 6c 69 63 61 74 69 6f 6e 2f 64 73 70 74 79 70 65  lication/dsptype
6ed0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
6ee0: 7d 2c 0a 20 20 20 20 7b 20 22 74 73 76 22 2c 20  },.    { "tsv", 
6ef0: 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f         3, "text/
6f00: 74 61 62 2d 73 65 70 61 72 61 74 65 64 2d 76 61  tab-separated-va
6f10: 6c 75 65 73 22 20 20 20 20 20 20 20 20 20 7d 2c  lues"         },
6f20: 0a 20 20 20 20 7b 20 22 74 78 74 22 2c 20 20 20  .    { "txt",   
6f30: 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 70 6c       3, "text/pl
6f40: 61 69 6e 22 20 20 20 20 20 20 20 20 20 20 20 20  ain"            
6f50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6f60: 20 20 20 7b 20 22 75 6e 76 22 2c 20 20 20 20 20     { "unv",     
6f70: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
6f80: 6f 6e 2f 69 2d 64 65 61 73 22 20 20 20 20 20 20  on/i-deas"      
6f90: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6fa0: 20 7b 20 22 75 73 74 61 72 22 2c 20 20 20 20 20   { "ustar",     
6fb0: 20 35 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   5, "application
6fc0: 2f 78 2d 75 73 74 61 72 22 20 20 20 20 20 20 20  /x-ustar"       
6fd0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6fe0: 20 22 76 63 64 22 2c 20 20 20 20 20 20 20 20 33   "vcd",        3
6ff0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
7000: 2d 63 64 6c 69 6e 6b 22 20 20 20 20 20 20 20 20  -cdlink"        
7010: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7020: 76 64 61 22 2c 20 20 20 20 20 20 20 20 33 2c 20  vda",        3, 
7030: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76 64 61  "application/vda
7040: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
7050: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 76 69      },.    { "vi
7060: 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76  v",        3, "v
7070: 69 64 65 6f 2f 76 6e 64 2e 76 69 76 6f 22 20 20  ideo/vnd.vivo"  
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7090: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 76 69 76 6f    },.    { "vivo
70a0: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 76 69 64  ",       4, "vid
70b0: 65 6f 2f 76 6e 64 2e 76 69 76 6f 22 20 20 20 20  eo/vnd.vivo"    
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70d0: 7d 2c 0a 20 20 20 20 7b 20 22 76 72 6d 6c 22 2c  },.    { "vrml",
70e0: 20 20 20 20 20 20 20 34 2c 20 22 6d 6f 64 65 6c         4, "model
70f0: 2f 76 72 6d 6c 22 20 20 20 20 20 20 20 20 20 20  /vrml"          
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7110: 0a 20 20 20 20 7b 20 22 77 61 76 22 2c 20 20 20  .    { "wav",   
7120: 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 78       3, "audio/x
7130: 2d 77 61 76 22 20 20 20 20 20 20 20 20 20 20 20  -wav"           
7140: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7150: 20 20 20 7b 20 22 77 61 78 22 2c 20 20 20 20 20     { "wax",     
7160: 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 6d     3, "audio/x-m
7170: 73 2d 77 61 78 22 20 20 20 20 20 20 20 20 20 20  s-wax"          
7180: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7190: 20 7b 20 22 77 69 6b 69 22 2c 20 20 20 20 20 20   { "wiki",      
71a0: 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   4, "application
71b0: 2f 78 2d 66 6f 73 73 69 6c 2d 77 69 6b 69 22 20  /x-fossil-wiki" 
71c0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
71d0: 20 22 77 6d 61 22 2c 20 20 20 20 20 20 20 20 33   "wma",        3
71e0: 2c 20 22 61 75 64 69 6f 2f 78 2d 6d 73 2d 77 6d  , "audio/x-ms-wm
71f0: 61 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a"              
7200: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7210: 77 6d 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20  wmv",        3, 
7220: 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 77 6d 76 22  "video/x-ms-wmv"
7230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7240: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 6d      },.    { "wm
7250: 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76  x",        3, "v
7260: 69 64 65 6f 2f 78 2d 6d 73 2d 77 6d 78 22 20 20  ideo/x-ms-wmx"  
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7280: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 72 6c 22    },.    { "wrl"
7290: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 6d 6f 64  ,        3, "mod
72a0: 65 6c 2f 76 72 6d 6c 22 20 20 20 20 20 20 20 20  el/vrml"        
72b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72c0: 7d 2c 0a 20 20 20 20 7b 20 22 77 76 78 22 2c 20  },.    { "wvx", 
72d0: 20 20 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f         3, "video
72e0: 2f 78 2d 6d 73 2d 77 76 78 22 20 20 20 20 20 20  /x-ms-wvx"      
72f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7300: 0a 20 20 20 20 7b 20 22 78 62 6d 22 2c 20 20 20  .    { "xbm",   
7310: 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78       3, "image/x
7320: 2d 78 62 69 74 6d 61 70 22 20 20 20 20 20 20 20  -xbitmap"       
7330: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7340: 20 20 20 7b 20 22 78 6c 63 22 2c 20 20 20 20 20     { "xlc",     
7350: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
7360: 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22  on/vnd.ms-excel"
7370: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7380: 20 7b 20 22 78 6c 6c 22 2c 20 20 20 20 20 20 20   { "xll",       
7390: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
73a0: 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20 20  /vnd.ms-excel"  
73b0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
73c0: 20 22 78 6c 6d 22 2c 20 20 20 20 20 20 20 20 33   "xlm",        3
73d0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76  , "application/v
73e0: 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20 20 20 20  nd.ms-excel"    
73f0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7400: 78 6c 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20  xls",        3, 
7410: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76 6e 64  "application/vnd
7420: 2e 6d 73 2d 65 78 63 65 6c 22 20 20 20 20 20 20  .ms-excel"      
7430: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 6c      },.    { "xl
7440: 77 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  w",        3, "a
7450: 70 70 6c 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d  pplication/vnd.m
7460: 73 2d 65 78 63 65 6c 22 20 20 20 20 20 20 20 20  s-excel"        
7470: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 6d 6c 22    },.    { "xml"
7480: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65 78  ,        3, "tex
7490: 74 2f 78 6d 6c 22 20 20 20 20 20 20 20 20 20 20  t/xml"          
74a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74b0: 7d 2c 0a 20 20 20 20 7b 20 22 78 70 6d 22 2c 20  },.    { "xpm", 
74c0: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
74d0: 2f 78 2d 78 70 69 78 6d 61 70 22 20 20 20 20 20  /x-xpixmap"     
74e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
74f0: 0a 20 20 20 20 7b 20 22 78 77 64 22 2c 20 20 20  .    { "xwd",   
7500: 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78       3, "image/x
7510: 2d 78 77 69 6e 64 6f 77 64 75 6d 70 22 20 20 20  -xwindowdump"   
7520: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7530: 20 20 20 7b 20 22 78 79 7a 22 2c 20 20 20 20 20     { "xyz",     
7540: 20 20 20 33 2c 20 22 63 68 65 6d 69 63 61 6c 2f     3, "chemical/
7550: 78 2d 70 64 62 22 20 20 20 20 20 20 20 20 20 20  x-pdb"          
7560: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7570: 20 7b 20 22 7a 69 70 22 2c 20 20 20 20 20 20 20   { "zip",       
7580: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
7590: 2f 7a 69 70 22 20 20 20 20 20 20 20 20 20 20 20  /zip"           
75a0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a          },.  };.
75b0: 0a 20 20 66 6f 72 28 69 3d 6e 4e 61 6d 65 2d 31  .  for(i=nName-1
75c0: 3b 20 69 3e 30 20 26 26 20 7a 4e 61 6d 65 5b 69  ; i>0 && zName[i
75d0: 5d 21 3d 27 2e 27 3b 20 69 2d 2d 29 7b 7d 0a 20  ]!='.'; i--){}. 
75e0: 20 7a 20 3d 20 26 7a 4e 61 6d 65 5b 69 2b 31 5d   z = &zName[i+1]
75f0: 3b 0a 20 20 6c 65 6e 20 3d 20 6e 4e 61 6d 65 20  ;.  len = nName 
7600: 2d 20 69 3b 0a 20 20 69 66 28 20 6c 65 6e 3c 73  - i;.  if( len<s
7610: 69 7a 65 6f 66 28 7a 53 75 66 66 69 78 29 2d 31  izeof(zSuffix)-1
7620: 20 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28 7a   ){.    strcpy(z
7630: 53 75 66 66 69 78 2c 20 7a 29 3b 0a 20 20 20 20  Suffix, z);.    
7640: 66 6f 72 28 69 3d 30 3b 20 7a 53 75 66 66 69 78  for(i=0; zSuffix
7650: 5b 69 5d 3b 20 69 2b 2b 29 20 7a 53 75 66 66 69  [i]; i++) zSuffi
7660: 78 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72 28 7a  x[i] = tolower(z
7670: 53 75 66 66 69 78 5b 69 5d 29 3b 0a 20 20 20 20  Suffix[i]);.    
7680: 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 6c  first = 0;.    l
7690: 61 73 74 20 3d 20 73 69 7a 65 6f 66 28 61 4d 69  ast = sizeof(aMi
76a0: 6d 65 29 2f 73 69 7a 65 6f 66 28 61 4d 69 6d 65  me)/sizeof(aMime
76b0: 5b 30 5d 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  [0]);.    while(
76c0: 20 66 69 72 73 74 3c 3d 6c 61 73 74 20 29 7b 0a   first<=last ){.
76d0: 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20        int c;.   
76e0: 20 20 20 69 20 3d 20 28 66 69 72 73 74 2b 6c 61     i = (first+la
76f0: 73 74 29 2f 32 3b 0a 20 20 20 20 20 20 63 20 3d  st)/2;.      c =
7700: 20 73 74 72 63 6d 70 28 7a 53 75 66 66 69 78 2c   strcmp(zSuffix,
7710: 20 61 4d 69 6d 65 5b 69 5d 2e 7a 53 75 66 66 69   aMime[i].zSuffi
7720: 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d  x);.      if( c=
7730: 3d 30 20 29 20 72 65 74 75 72 6e 20 61 4d 69 6d  =0 ) return aMim
7740: 65 5b 69 5d 2e 7a 4d 69 6d 65 74 79 70 65 3b 0a  e[i].zMimetype;.
7750: 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b        if( c<0 ){
7760: 0a 20 20 20 20 20 20 20 20 6c 61 73 74 20 3d 20  .        last = 
7770: 69 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  i-1;.      }else
7780: 7b 0a 20 20 20 20 20 20 20 20 66 69 72 73 74 20  {.        first 
7790: 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20  = i+1;.      }. 
77a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
77b0: 6e 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f  n "application/o
77c0: 63 74 65 74 2d 73 74 72 65 61 6d 22 3b 0a 7d 0a  ctet-stream";.}.
77d0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
77e0: 77 69 6e 67 20 74 61 62 6c 65 20 63 6f 6e 74 61  wing table conta
77f0: 69 6e 73 20 31 20 66 6f 72 20 61 6c 6c 20 63 68  ins 1 for all ch
7800: 61 72 61 63 74 65 72 73 20 74 68 61 74 20 61 72  aracters that ar
7810: 65 20 70 65 72 6d 69 74 74 65 64 20 69 6e 0a 2a  e permitted in.*
7820: 2a 20 74 68 65 20 70 61 72 74 20 6f 66 20 74 68  * the part of th
7830: 65 20 55 52 4c 20 62 65 66 6f 72 65 20 74 68 65  e URL before the
7840: 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
7850: 73 20 61 6e 64 20 66 72 61 67 6d 65 6e 74 2e 0a  s and fragment..
7860: 2a 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 63 68  **.** Allowed ch
7870: 61 72 61 63 74 65 72 73 3a 20 20 30 2d 39 20 61  aracters:  0-9 a
7880: 2d 7a 20 41 2d 5a 20 2c 2d 2e 2f 3a 5f 7e 0a 2a  -z A-Z ,-./:_~.*
7890: 2a 0a 2a 2a 20 44 69 73 61 6c 6c 6f 77 65 64 20  *.** Disallowed 
78a0: 63 68 61 72 61 63 74 65 72 73 20 69 6e 63 6c 75  characters inclu
78b0: 64 65 3a 20 20 21 22 23 24 25 26 27 28 29 2a 2b  de:  !"#$%&'()*+
78c0: 3b 3c 3d 3e 3f 5b 5c 5d 5e 7b 7c 7d 0a 2a 2f 0a  ;<=>?[\]^{|}.*/.
78d0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
78e0: 72 20 61 6c 6c 6f 77 65 64 49 6e 4e 61 6d 65 5b  r allowedInName[
78f0: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 2f 2a 20 20  ] = {.      /*  
7900: 78 30 20 20 78 31 20 20 78 32 20 20 78 33 20 20  x0  x1  x2  x3  
7910: 78 34 20 20 78 35 20 20 78 36 20 20 78 37 20 20  x4  x5  x6  x7  
7920: 78 38 20 20 78 39 20 20 78 61 20 20 78 62 20 20  x8  x9  xa  xb  
7930: 78 63 20 20 78 64 20 20 78 65 20 20 78 66 20 2a  xc  xd  xe  xf *
7940: 2f 0a 2f 2a 20 30 78 20 2a 2f 20 20 20 30 2c 20  /./* 0x */   0, 
7950: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
7960: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
7970: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
7980: 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 31   0,  0,  0,./* 1
7990: 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30  x */   0,  0,  0
79a0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
79b0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
79c0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
79d0: 2c 20 20 30 2c 0a 2f 2a 20 32 78 20 2a 2f 20 20  ,  0,./* 2x */  
79e0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
79f0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
7a00: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
7a10: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 0a   1,  1,  1,  1,.
7a20: 2f 2a 20 33 78 20 2a 2f 20 20 20 31 2c 20 20 31  /* 3x */   1,  1
7a30: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
7a40: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
7a50: 2c 20 20 31 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  1,  0,  0,  0
7a60: 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 34 78 20  ,  0,  0,./* 4x 
7a70: 2a 2f 20 20 20 30 2c 20 20 31 2c 20 20 31 2c 20  */   0,  1,  1, 
7a80: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
7a90: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
7aa0: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
7ab0: 20 31 2c 0a 2f 2a 20 35 78 20 2a 2f 20 20 20 31   1,./* 5x */   1
7ac0: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
7ad0: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
7ae0: 2c 20 20 31 2c 20 20 31 2c 20 20 30 2c 20 20 30  ,  1,  1,  0,  0
7af0: 2c 20 20 30 2c 20 20 30 2c 20 20 31 2c 0a 2f 2a  ,  0,  0,  1,./*
7b00: 20 36 78 20 2a 2f 20 20 20 30 2c 20 20 31 2c 20   6x */   0,  1, 
7b10: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
7b20: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
7b30: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
7b40: 20 31 2c 20 20 31 2c 0a 2f 2a 20 37 78 20 2a 2f   1,  1,./* 7x */
7b50: 20 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31     1,  1,  1,  1
7b60: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
7b70: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 30  ,  1,  1,  1,  0
7b80: 2c 20 20 30 2c 20 20 30 2c 20 20 31 2c 20 20 30  ,  0,  0,  1,  0
7b90: 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ,.};../*.** This
7ba0: 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73   routine process
7bb0: 65 73 20 61 20 73 69 6e 67 6c 65 20 48 54 54 50  es a single HTTP
7bc0: 20 72 65 71 75 65 73 74 20 6f 6e 20 73 74 61 6e   request on stan
7bd0: 64 61 72 64 20 69 6e 70 75 74 20 61 6e 64 0a 2a  dard input and.*
7be0: 2a 20 73 65 6e 64 73 20 74 68 65 20 72 65 70 6c  * sends the repl
7bf0: 79 20 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75  y to standard ou
7c00: 74 70 75 74 2e 20 20 49 66 20 74 68 65 20 61 72  tput.  If the ar
7c10: 67 75 6d 65 6e 74 20 69 73 20 31 20 69 74 20 6d  gument is 1 it m
7c20: 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 77 65 20  eans.** that we 
7c30: 61 72 65 20 73 68 6f 75 6c 64 20 63 6c 6f 73 65  are should close
7c40: 20 74 68 65 20 73 6f 63 6b 65 74 20 77 69 74 68   the socket with
7c50: 6f 75 74 20 70 72 6f 63 65 73 73 69 6e 67 20 61  out processing a
7c60: 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 48 54 54  dditional.** HTT
7c70: 50 20 72 65 71 75 65 73 74 73 20 61 66 74 65 72  P requests after
7c80: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 71   the current req
7c90: 75 65 73 74 20 66 69 6e 69 73 68 65 73 2e 20 20  uest finishes.  
7ca0: 30 20 6d 65 61 6e 73 20 77 65 20 61 72 65 0a 2a  0 means we are.*
7cb0: 2a 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6b 65 65  * allowed to kee
7cc0: 70 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  p the connection
7cd0: 20 6f 70 65 6e 20 61 6e 64 20 74 6f 20 70 72 6f   open and to pro
7ce0: 63 65 73 73 20 61 64 64 69 74 69 6f 6e 61 6c 20  cess additional 
7cf0: 72 65 71 75 65 73 74 73 2e 0a 2a 2a 20 54 68 69  requests..** Thi
7d00: 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 63 68  s routine may ch
7d10: 6f 6f 73 65 20 74 6f 20 63 6c 6f 73 65 20 74 68  oose to close th
7d20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 65 76 65  e connection eve
7d30: 6e 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e  n if the argumen
7d40: 74 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2a 20 0a 2a  t.** is 0..** .*
7d50: 2a 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  * If the connect
7d60: 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 6c  ion should be cl
7d70: 6f 73 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  osed, this routi
7d80: 6e 65 20 63 61 6c 6c 73 20 65 78 69 74 28 29 20  ne calls exit() 
7d90: 61 6e 64 0a 2a 2a 20 74 68 75 73 20 6e 65 76 65  and.** thus neve
7da0: 72 20 72 65 74 75 72 6e 73 2e 20 20 49 66 20 74  r returns.  If t
7db0: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
7dc0: 20 72 65 74 75 72 6e 20 69 74 20 6d 65 61 6e 73   return it means
7dd0: 20 74 68 61 74 20 61 6e 6f 74 68 65 72 0a 2a 2a   that another.**
7de0: 20 48 54 54 50 20 72 65 71 75 65 73 74 20 6d 61   HTTP request ma
7df0: 79 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20  y appear on the 
7e00: 77 69 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 50 72  wire..*/.void Pr
7e10: 6f 63 65 73 73 4f 6e 65 52 65 71 75 65 73 74 28  ocessOneRequest(
7e20: 69 6e 74 20 66 6f 72 63 65 43 6c 6f 73 65 29 7b  int forceClose){
7e30: 0a 20 20 69 6e 74 20 69 2c 20 63 3b 0a 20 20 63  .  int i, c;.  c
7e40: 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20  har *z;         
7e50: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
7e60: 20 74 6f 20 70 61 72 73 65 20 75 70 20 61 20 73   to parse up a s
7e70: 74 72 69 6e 67 20 2a 2f 0a 20 20 73 74 72 75 63  tring */.  struc
7e80: 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 20  t stat statbuf; 
7e90: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
7ea0: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69  ion about the fi
7eb0: 6c 65 20 74 6f 20 62 65 20 72 65 74 72 69 65 76  le to be retriev
7ec0: 65 64 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 69 6e  ed */.  FILE *in
7ed0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7ee0: 20 20 2f 2a 20 46 6f 72 20 72 65 61 64 69 6e 67    /* For reading
7ef0: 20 66 72 6f 6d 20 43 47 49 20 73 63 72 69 70 74   from CGI script
7f00: 73 20 2a 2f 0a 20 20 63 68 61 72 20 7a 4c 69 6e  s */.  char zLin
7f10: 65 5b 31 30 30 30 5d 3b 20 20 20 20 20 20 20 20  e[1000];        
7f20: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 66 6f 72   /* A buffer for
7f30: 20 69 6e 70 75 74 20 6c 69 6e 65 73 20 6f 72 20   input lines or 
7f40: 66 6f 72 6d 69 6e 67 20 6e 61 6d 65 73 20 2a 2f  forming names */
7f50: 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 64 69  ..  /* Change di
7f60: 72 65 63 74 6f 72 69 65 73 20 74 6f 20 74 68 65  rectories to the
7f70: 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 48 54 54   root of the HTT
7f80: 50 20 66 69 6c 65 73 79 73 74 65 6d 0a 20 20 2a  P filesystem.  *
7f90: 2f 0a 20 20 69 66 28 20 63 68 64 69 72 28 7a 52  /.  if( chdir(zR
7fa0: 6f 6f 74 5b 30 5d 20 3f 20 7a 52 6f 6f 74 20 3a  oot[0] ? zRoot :
7fb0: 20 22 2f 22 29 21 3d 30 20 29 7b 0a 20 20 20 20   "/")!=0 ){.    
7fc0: 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b  char zBuf[1000];
7fd0: 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e  .    Malfunction
7fe0: 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 63 61 6e 6e  (__LINE__, "cann
7ff0: 6f 74 20 63 68 64 69 72 20 74 6f 20 5b 25 73 5d  ot chdir to [%s]
8000: 20 66 72 6f 6d 20 5b 25 73 5d 22 2c 0a 20 20 20   from [%s]",.   
8010: 20 20 20 20 20 20 7a 52 6f 6f 74 2c 20 67 65 74        zRoot, get
8020: 63 77 64 28 7a 42 75 66 2c 39 39 39 29 29 3b 0a  cwd(zBuf,999));.
8030: 20 20 7d 0a 20 20 6e 52 65 71 75 65 73 74 2b 2b    }.  nRequest++
8040: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20  ;..  /*.  ** We 
8050: 6d 75 73 74 20 72 65 63 65 69 76 65 20 61 20 63  must receive a c
8060: 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 20 77  omplete header w
8070: 69 74 68 69 6e 20 31 35 20 73 65 63 6f 6e 64 73  ithin 15 seconds
8080: 0a 20 20 2a 2f 0a 20 20 73 69 67 6e 61 6c 28 53  .  */.  signal(S
8090: 49 47 41 4c 52 4d 2c 20 54 69 6d 65 6f 75 74 29  IGALRM, Timeout)
80a0: 3b 0a 20 20 61 6c 61 72 6d 28 31 35 29 3b 0a 0a  ;.  alarm(15);..
80b0: 20 20 2f 2a 20 47 65 74 20 74 68 65 20 66 69 72    /* Get the fir
80c0: 73 74 20 6c 69 6e 65 20 6f 66 20 74 68 65 20 72  st line of the r
80d0: 65 71 75 65 73 74 20 61 6e 64 20 70 61 72 73 65  equest and parse
80e0: 20 6f 75 74 20 74 68 65 0a 20 20 2a 2a 20 6d 65   out the.  ** me
80f0: 74 68 6f 64 2c 20 74 68 65 20 73 63 72 69 70 74  thod, the script
8100: 20 61 6e 64 20 74 68 65 20 70 72 6f 74 6f 63 6f   and the protoco
8110: 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 66 67  l..  */.  if( fg
8120: 65 74 73 28 7a 4c 69 6e 65 2c 73 69 7a 65 6f 66  ets(zLine,sizeof
8130: 28 7a 4c 69 6e 65 29 2c 73 74 64 69 6e 29 3d 3d  (zLine),stdin)==
8140: 30 20 29 7b 0a 20 20 20 20 65 78 69 74 28 30 29  0 ){.    exit(0)
8150: 3b 0a 20 20 7d 0a 20 20 6f 6d 69 74 4c 6f 67 20  ;.  }.  omitLog 
8160: 3d 20 30 3b 0a 20 20 6e 49 6e 20 2b 3d 20 73 74  = 0;.  nIn += st
8170: 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20 20 7a  rlen(zLine);.  z
8180: 4d 65 74 68 6f 64 20 3d 20 53 74 72 44 75 70 28  Method = StrDup(
8190: 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28  GetFirstElement(
81a0: 7a 4c 69 6e 65 2c 26 7a 29 29 3b 0a 20 20 7a 52  zLine,&z));.  zR
81b0: 65 61 6c 53 63 72 69 70 74 20 3d 20 7a 53 63 72  ealScript = zScr
81c0: 69 70 74 20 3d 20 53 74 72 44 75 70 28 47 65 74  ipt = StrDup(Get
81d0: 46 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a 2c 26  FirstElement(z,&
81e0: 7a 29 29 3b 0a 20 20 7a 50 72 6f 74 6f 63 6f 6c  z));.  zProtocol
81f0: 20 3d 20 53 74 72 44 75 70 28 47 65 74 46 69 72   = StrDup(GetFir
8200: 73 74 45 6c 65 6d 65 6e 74 28 7a 2c 26 7a 29 29  stElement(z,&z))
8210: 3b 0a 20 20 69 66 28 20 7a 50 72 6f 74 6f 63 6f  ;.  if( zProtoco
8220: 6c 3d 3d 30 20 7c 7c 20 73 74 72 6e 63 6d 70 28  l==0 || strncmp(
8230: 7a 50 72 6f 74 6f 63 6f 6c 2c 22 48 54 54 50 2f  zProtocol,"HTTP/
8240: 22 2c 35 29 21 3d 30 20 7c 7c 20 73 74 72 6c 65  ",5)!=0 || strle
8250: 6e 28 7a 50 72 6f 74 6f 63 6f 6c 29 21 3d 38 20  n(zProtocol)!=8 
8260: 29 7b 0a 20 20 20 20 53 74 61 72 74 52 65 73 70  ){.    StartResp
8270: 6f 6e 73 65 28 22 34 30 30 20 42 61 64 20 52 65  onse("400 Bad Re
8280: 71 75 65 73 74 22 29 3b 0a 20 20 20 20 6e 4f 75  quest");.    nOu
8290: 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20  t += printf(.   
82a0: 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65     "Content-type
82b0: 3a 20 74 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e 22  : text/html\r\n"
82c0: 0a 20 20 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20  .      "\r\n".  
82d0: 20 20 20 20 22 3c 74 69 74 6c 65 3e 55 6e 6b 6e      "<title>Unkn
82e0: 6f 77 6e 20 50 72 6f 74 6f 63 6f 6c 20 4f 6e 20  own Protocol On 
82f0: 48 54 54 50 20 52 65 71 75 65 73 74 3c 2f 74 69  HTTP Request</ti
8300: 74 6c 65 3e 5c 6e 22 0a 20 20 20 20 20 20 22 3c  tle>\n".      "<
8310: 68 31 3e 55 6e 6b 6e 6f 77 6e 20 50 72 6f 74 6f  h1>Unknown Proto
8320: 63 6f 6c 3c 2f 68 31 3e 5c 6e 22 0a 20 20 20 20  col</h1>\n".    
8330: 20 20 22 54 68 69 73 20 73 65 72 76 65 72 20 64    "This server d
8340: 6f 65 73 20 6e 6f 74 20 75 6e 64 65 72 73 74 61  oes not understa
8350: 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
8360: 20 70 72 6f 74 6f 63 6f 6c 5c 6e 22 0a 20 20 20   protocol\n".   
8370: 20 29 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f 67 45   );.    MakeLogE
8380: 6e 74 72 79 28 30 29 3b 0a 20 20 20 20 65 78 69  ntry(0);.    exi
8390: 74 28 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  t(0);.  }.  if( 
83a0: 66 6f 72 63 65 43 6c 6f 73 65 20 29 7b 0a 20 20  forceClose ){.  
83b0: 20 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f    closeConnectio
83c0: 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  n = 1;.  }else i
83d0: 66 28 20 7a 50 72 6f 74 6f 63 6f 6c 5b 35 5d 3c  f( zProtocol[5]<
83e0: 27 31 27 20 7c 7c 20 7a 50 72 6f 74 6f 63 6f 6c  '1' || zProtocol
83f0: 5b 37 5d 3c 27 31 27 20 29 7b 0a 20 20 20 20 63  [7]<'1' ){.    c
8400: 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d  loseConnection =
8410: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68   1;.  }..  /* Th
8420: 69 73 20 76 65 72 79 20 73 69 6d 70 6c 65 20 73  is very simple s
8430: 65 72 76 65 72 20 6f 6e 6c 79 20 75 6e 64 65 72  erver only under
8440: 73 74 61 6e 64 73 20 74 68 65 20 47 45 54 2c 20  stands the GET, 
8450: 50 4f 53 54 0a 20 20 2a 2a 20 61 6e 64 20 48 45  POST.  ** and HE
8460: 41 44 20 6d 65 74 68 6f 64 73 0a 20 20 2a 2f 0a  AD methods.  */.
8470: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4d 65    if( strcmp(zMe
8480: 74 68 6f 64 2c 22 47 45 54 22 29 21 3d 30 20 26  thod,"GET")!=0 &
8490: 26 20 73 74 72 63 6d 70 28 7a 4d 65 74 68 6f 64  & strcmp(zMethod
84a0: 2c 22 50 4f 53 54 22 29 21 3d 30 0a 20 20 20 20  ,"POST")!=0.    
84b0: 20 20 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 65     && strcmp(zMe
84c0: 74 68 6f 64 2c 22 48 45 41 44 22 29 21 3d 30 20  thod,"HEAD")!=0 
84d0: 29 7b 0a 20 20 20 20 53 74 61 72 74 52 65 73 70  ){.    StartResp
84e0: 6f 6e 73 65 28 22 35 30 31 20 4e 6f 74 20 49 6d  onse("501 Not Im
84f0: 70 6c 65 6d 65 6e 74 65 64 22 29 3b 0a 20 20 20  plemented");.   
8500: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
8510: 0a 20 20 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d  .      "Content-
8520: 74 79 70 65 3a 20 74 65 78 74 2f 68 74 6d 6c 5c  type: text/html\
8530: 72 5c 6e 22 0a 20 20 20 20 20 20 22 5c 72 5c 6e  r\n".      "\r\n
8540: 22 0a 20 20 20 20 20 20 22 3c 68 65 61 64 3e 3c  ".      "<head><
8550: 74 69 74 6c 65 3e 4d 65 74 68 6f 64 20 6e 6f 74  title>Method not
8560: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 3c 2f 74 69   implemented</ti
8570: 74 6c 65 3e 3c 2f 68 65 61 64 3e 5c 6e 22 0a 20  tle></head>\n". 
8580: 20 20 20 20 20 22 3c 62 6f 64 79 3e 3c 68 31 3e       "<body><h1>
8590: 4d 65 74 68 6f 64 20 6e 6f 74 20 69 6d 70 6c 65  Method not imple
85a0: 6d 65 6e 74 65 64 3c 2f 68 31 3e 5c 6e 22 0a 20  mented</h1>\n". 
85b0: 20 20 20 20 20 22 54 68 65 20 25 73 20 6d 65 74       "The %s met
85c0: 68 6f 64 20 69 73 20 6e 6f 74 20 69 6d 70 6c 65  hod is not imple
85d0: 6d 65 6e 74 65 64 20 6f 6e 20 74 68 69 73 20 73  mented on this s
85e0: 65 72 76 65 72 2e 5c 6e 22 20 0a 20 20 20 20 20  erver.\n" .     
85f0: 20 22 3c 2f 62 6f 64 79 3e 5c 6e 22 2c 0a 20 20   "</body>\n",.  
8600: 20 20 20 20 7a 4d 65 74 68 6f 64 29 3b 0a 20 20      zMethod);.  
8610: 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30    MakeLogEntry(0
8620: 29 3b 0a 20 20 20 20 65 78 69 74 28 30 29 3b 0a  );.    exit(0);.
8630: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61 6c    }..  /* Get al
8640: 6c 20 74 68 65 20 6f 70 74 69 6f 6e 61 6c 20 66  l the optional f
8650: 69 65 6c 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  ields that follo
8660: 77 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e 65  w the first line
8670: 2e 0a 20 20 2a 2f 0a 20 20 7a 43 6f 6f 6b 69 65  ..  */.  zCookie
8680: 20 3d 20 30 3b 0a 20 20 7a 41 75 74 68 54 79 70   = 0;.  zAuthTyp
8690: 65 20 3d 20 30 3b 0a 20 20 7a 52 65 6d 6f 74 65  e = 0;.  zRemote
86a0: 55 73 65 72 20 3d 20 30 3b 0a 20 20 77 68 69 6c  User = 0;.  whil
86b0: 65 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 73  e( fgets(zLine,s
86c0: 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 73 74 64  izeof(zLine),std
86d0: 69 6e 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20  in) ){.    char 
86e0: 2a 7a 46 69 65 6c 64 4e 61 6d 65 3b 0a 20 20 20  *zFieldName;.   
86f0: 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 0a 20 20   char *zVal;..  
8700: 20 20 6e 49 6e 20 2b 3d 20 73 74 72 6c 65 6e 28    nIn += strlen(
8710: 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 7a 46 69 65  zLine);.    zFie
8720: 6c 64 4e 61 6d 65 20 3d 20 47 65 74 46 69 72 73  ldName = GetFirs
8730: 74 45 6c 65 6d 65 6e 74 28 7a 4c 69 6e 65 2c 26  tElement(zLine,&
8740: 7a 56 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a  zVal);.    if( z
8750: 46 69 65 6c 64 4e 61 6d 65 3d 3d 30 20 7c 7c 20  FieldName==0 || 
8760: 2a 7a 46 69 65 6c 64 4e 61 6d 65 3d 3d 30 20 29  *zFieldName==0 )
8770: 20 62 72 65 61 6b 3b 0a 20 20 20 20 52 65 6d 6f   break;.    Remo
8780: 76 65 4e 65 77 6c 69 6e 65 28 7a 56 61 6c 29 3b  veNewline(zVal);
8790: 0a 20 20 20 20 69 66 28 20 73 74 72 63 61 73 65  .    if( strcase
87a0: 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22  cmp(zFieldName,"
87b0: 55 73 65 72 2d 41 67 65 6e 74 3a 22 29 3d 3d 30  User-Agent:")==0
87c0: 20 29 7b 0a 20 20 20 20 20 20 7a 41 67 65 6e 74   ){.      zAgent
87d0: 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b   = StrDup(zVal);
87e0: 0a 20 20 20 20 20 20 46 69 78 75 70 55 73 65 72  .      FixupUser
87f0: 41 67 65 6e 74 28 29 3b 0a 20 20 20 20 7d 65 6c  Agent();.    }el
8800: 73 65 20 69 66 28 20 73 74 72 63 61 73 65 63 6d  se if( strcasecm
8810: 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 41 63  p(zFieldName,"Ac
8820: 63 65 70 74 3a 22 29 3d 3d 30 20 29 7b 0a 20 20  cept:")==0 ){.  
8830: 20 20 20 20 7a 41 63 63 65 70 74 20 3d 20 53 74      zAccept = St
8840: 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20  rDup(zVal);.    
8850: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 61 73  }else if( strcas
8860: 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c  ecmp(zFieldName,
8870: 22 43 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74 68 3a  "Content-length:
8880: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  ")==0 ){.      z
8890: 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 20 3d 20  ContentLength = 
88a0: 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20  StrDup(zVal);.  
88b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
88c0: 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d  asecmp(zFieldNam
88d0: 65 2c 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a  e,"Content-type:
88e0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  ")==0 ){.      z
88f0: 43 6f 6e 74 65 6e 74 54 79 70 65 20 3d 20 53 74  ContentType = St
8900: 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20  rDup(zVal);.    
8910: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 61 73  }else if( strcas
8920: 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c  ecmp(zFieldName,
8930: 22 52 65 66 65 72 65 72 3a 22 29 3d 3d 30 20 29  "Referer:")==0 )
8940: 7b 0a 20 20 20 20 20 20 7a 52 65 66 65 72 65 72  {.      zReferer
8950: 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b   = StrDup(zVal);
8960: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
8970: 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64  trcasecmp(zField
8980: 4e 61 6d 65 2c 22 43 6f 6f 6b 69 65 3a 22 29 3d  Name,"Cookie:")=
8990: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6f  =0 ){.      zCoo
89a0: 6b 69 65 20 3d 20 53 74 72 41 70 70 65 6e 64 28  kie = StrAppend(
89b0: 7a 43 6f 6f 6b 69 65 2c 22 3b 20 22 2c 7a 56 61  zCookie,"; ",zVa
89c0: 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  l);.    }else if
89d0: 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69  ( strcasecmp(zFi
89e0: 65 6c 64 4e 61 6d 65 2c 22 43 6f 6e 6e 65 63 74  eldName,"Connect
89f0: 69 6f 6e 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ion:")==0 ){.   
8a00: 20 20 20 69 66 28 20 73 74 72 63 61 73 65 63 6d     if( strcasecm
8a10: 70 28 7a 56 61 6c 2c 22 63 6c 6f 73 65 22 29 3d  p(zVal,"close")=
8a20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c  =0 ){.        cl
8a30: 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20  oseConnection = 
8a40: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
8a50: 66 28 20 21 66 6f 72 63 65 43 6c 6f 73 65 20 26  f( !forceClose &
8a60: 26 20 73 74 72 63 61 73 65 63 6d 70 28 7a 56 61  & strcasecmp(zVa
8a70: 6c 2c 20 22 6b 65 65 70 2d 61 6c 69 76 65 22 29  l, "keep-alive")
8a80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
8a90: 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d  loseConnection =
8aa0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
8ab0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 61 73  }else if( strcas
8ac0: 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c  ecmp(zFieldName,
8ad0: 22 48 6f 73 74 3a 22 29 3d 3d 30 20 29 7b 0a 20  "Host:")==0 ){. 
8ae0: 20 20 20 20 20 7a 53 65 72 76 65 72 50 6f 72 74       zServerPort
8af0: 20 3d 20 7a 53 65 72 76 65 72 4e 61 6d 65 20 3d   = zServerName =
8b00: 20 7a 48 74 74 70 48 6f 73 74 20 3d 20 53 74 72   zHttpHost = Str
8b10: 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 20  Dup(zVal);.     
8b20: 20 77 68 69 6c 65 28 20 7a 53 65 72 76 65 72 50   while( zServerP
8b30: 6f 72 74 20 26 26 20 2a 7a 53 65 72 76 65 72 50  ort && *zServerP
8b40: 6f 72 74 20 26 26 20 2a 7a 53 65 72 76 65 72 50  ort && *zServerP
8b50: 6f 72 74 21 3d 27 3a 27 20 29 7b 0a 20 20 20 20  ort!=':' ){.    
8b60: 20 20 20 20 7a 53 65 72 76 65 72 50 6f 72 74 2b      zServerPort+
8b70: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
8b80: 20 69 66 28 20 7a 53 65 72 76 65 72 50 6f 72 74   if( zServerPort
8b90: 20 26 26 20 2a 7a 53 65 72 76 65 72 50 6f 72 74   && *zServerPort
8ba0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 7a 53 65   ){.        *zSe
8bb0: 72 76 65 72 50 6f 72 74 20 3d 20 30 3b 0a 20 20  rverPort = 0;.  
8bc0: 20 20 20 20 20 20 7a 53 65 72 76 65 72 50 6f 72        zServerPor
8bd0: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
8be0: 20 20 20 69 66 28 20 7a 52 65 61 6c 50 6f 72 74     if( zRealPort
8bf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 65 72   ){.        zSer
8c00: 76 65 72 50 6f 72 74 20 3d 20 53 74 72 44 75 70  verPort = StrDup
8c10: 28 7a 52 65 61 6c 50 6f 72 74 29 3b 0a 20 20 20  (zRealPort);.   
8c20: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
8c30: 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46  f( strcasecmp(zF
8c40: 69 65 6c 64 4e 61 6d 65 2c 22 41 75 74 68 6f 72  ieldName,"Author
8c50: 69 7a 61 74 69 6f 6e 3a 22 29 3d 3d 30 20 29 7b  ization:")==0 ){
8c60: 0a 20 20 20 20 20 20 7a 41 75 74 68 54 79 70 65  .      zAuthType
8c70: 20 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65   = GetFirstEleme
8c80: 6e 74 28 53 74 72 44 75 70 28 7a 56 61 6c 29 2c  nt(StrDup(zVal),
8c90: 20 26 7a 41 75 74 68 41 72 67 29 3b 0a 20 20 20   &zAuthArg);.   
8ca0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
8cb0: 65 20 61 6e 20 65 78 74 72 61 20 65 66 66 6f 72  e an extra effor
8cc0: 74 20 74 6f 20 67 65 74 20 61 20 76 61 6c 69 64  t to get a valid
8cd0: 20 73 65 72 76 65 72 20 6e 61 6d 65 20 61 6e 64   server name and
8ce0: 20 70 6f 72 74 20 6e 75 6d 62 65 72 2e 0a 20 20   port number..  
8cf0: 2a 2a 20 4f 6e 6c 79 20 4e 65 74 73 63 61 70 65  ** Only Netscape
8d00: 20 70 72 6f 76 69 64 65 73 20 74 68 69 73 20 69   provides this i
8d10: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20  nformation.  If 
8d20: 74 68 65 20 62 72 6f 77 73 65 72 20 69 73 0a 20  the browser is. 
8d30: 20 2a 2a 20 49 6e 74 65 72 6e 65 74 20 45 78 70   ** Internet Exp
8d40: 6c 6f 72 65 72 2c 20 74 68 65 6e 20 77 65 20 68  lorer, then we h
8d50: 61 76 65 20 74 6f 20 66 69 6e 64 20 6f 75 74 20  ave to find out 
8d60: 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
8d70: 66 6f 72 0a 20 20 2a 2a 20 6f 75 72 73 65 6c 76  for.  ** ourselv
8d80: 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  es..  */.  if( z
8d90: 53 65 72 76 65 72 4e 61 6d 65 3d 3d 30 20 29 7b  ServerName==0 ){
8da0: 0a 20 20 20 20 7a 53 65 72 76 65 72 4e 61 6d 65  .    zServerName
8db0: 20 3d 20 53 61 66 65 4d 61 6c 6c 6f 63 28 20 31   = SafeMalloc( 1
8dc0: 30 30 20 29 3b 0a 20 20 20 20 67 65 74 68 6f 73  00 );.    gethos
8dd0: 74 6e 61 6d 65 28 7a 53 65 72 76 65 72 4e 61 6d  tname(zServerNam
8de0: 65 2c 31 30 30 29 3b 0a 20 20 7d 0a 20 20 69 66  e,100);.  }.  if
8df0: 28 20 7a 53 65 72 76 65 72 50 6f 72 74 3d 3d 30  ( zServerPort==0
8e00: 20 7c 7c 20 2a 7a 53 65 72 76 65 72 50 6f 72 74   || *zServerPort
8e10: 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53 65 72 76  ==0 ){.    zServ
8e20: 65 72 50 6f 72 74 20 3d 20 44 45 46 41 55 4c 54  erPort = DEFAULT
8e30: 5f 50 4f 52 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _PORT;.  }..  /*
8e40: 20 52 65 6d 6f 76 65 20 74 68 65 20 71 75 65 72   Remove the quer
8e50: 79 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 74 68  y string from th
8e60: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 65 71  e end of the req
8e70: 75 65 73 74 65 64 20 66 69 6c 65 2e 0a 20 20 2a  uested file..  *
8e80: 2f 0a 20 20 66 6f 72 28 7a 3d 7a 53 63 72 69 70  /.  for(z=zScrip
8e90: 74 3b 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 3f 27  t; *z && *z!='?'
8ea0: 3b 20 7a 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 2a  ; z++){}.  if( *
8eb0: 7a 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 7a 51  z=='?' ){.    zQ
8ec0: 75 65 72 79 53 75 66 66 69 78 20 3d 20 53 74 72  uerySuffix = Str
8ed0: 44 75 70 28 7a 29 3b 0a 20 20 20 20 2a 7a 20 3d  Dup(z);.    *z =
8ee0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
8ef0: 20 7a 51 75 65 72 79 53 75 66 66 69 78 20 3d 20   zQuerySuffix = 
8f00: 22 22 3b 0a 20 20 7d 0a 20 20 7a 51 75 65 72 79  "";.  }.  zQuery
8f10: 53 74 72 69 6e 67 20 3d 20 2a 7a 51 75 65 72 79  String = *zQuery
8f20: 53 75 66 66 69 78 20 3f 20 26 7a 51 75 65 72 79  Suffix ? &zQuery
8f30: 53 75 66 66 69 78 5b 31 5d 20 3a 20 7a 51 75 65  Suffix[1] : zQue
8f40: 72 79 53 75 66 66 69 78 3b 0a 0a 20 20 2f 2a 20  rySuffix;..  /* 
8f50: 43 72 65 61 74 65 20 61 20 66 69 6c 65 20 74 6f  Create a file to
8f60: 20 68 6f 6c 64 20 74 68 65 20 50 4f 53 54 20 71   hold the POST q
8f70: 75 65 72 79 20 64 61 74 61 2c 20 69 66 20 61 6e  uery data, if an
8f80: 79 2e 20 20 57 65 20 68 61 76 65 20 74 6f 0a 20  y.  We have to. 
8f90: 20 2a 2a 20 64 6f 20 69 74 20 74 68 69 73 20 77   ** do it this w
8fa0: 61 79 2e 20 20 57 65 20 63 61 6e 27 74 20 6a 75  ay.  We can't ju
8fb0: 73 74 20 70 61 73 73 20 74 68 65 20 66 69 6c 65  st pass the file
8fc0: 20 64 65 73 63 72 69 70 74 6f 72 20 64 6f 77 6e   descriptor down
8fd0: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 63 68 69   to.  ** the chi
8fe0: 6c 64 20 70 72 6f 63 65 73 73 20 62 65 63 61 75  ld process becau
8ff0: 73 65 20 74 68 65 20 66 67 65 74 73 28 29 20 66  se the fgets() f
9000: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 68 61 76 65  unction may have
9010: 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 72 65   already.  ** re
9020: 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 50  ad part of the P
9030: 4f 53 54 20 64 61 74 61 20 69 6e 74 6f 20 69 74  OST data into it
9040: 73 20 69 6e 74 65 72 6e 61 6c 20 62 75 66 66 65  s internal buffe
9050: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 4d  r..  */.  if( zM
9060: 65 74 68 6f 64 5b 30 5d 3d 3d 27 50 27 20 26 26  ethod[0]=='P' &&
9070: 20 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 21   zContentLength!
9080: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 65  =0 ){.    int le
9090: 6e 20 3d 20 61 74 6f 69 28 7a 43 6f 6e 74 65 6e  n = atoi(zConten
90a0: 74 4c 65 6e 67 74 68 29 3b 0a 20 20 20 20 46 49  tLength);.    FI
90b0: 4c 45 20 2a 6f 75 74 3b 0a 20 20 20 20 63 68 61  LE *out;.    cha
90c0: 72 20 2a 7a 42 75 66 3b 0a 20 20 20 20 69 6e 74  r *zBuf;.    int
90d0: 20 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6c 65 6e   n;..    if( len
90e0: 3e 4d 41 58 5f 43 4f 4e 54 45 4e 54 5f 4c 45 4e  >MAX_CONTENT_LEN
90f0: 47 54 48 20 29 7b 0a 20 20 20 20 20 20 53 74 61  GTH ){.      Sta
9100: 72 74 52 65 73 70 6f 6e 73 65 28 22 35 30 30 20  rtResponse("500 
9110: 52 65 71 75 65 73 74 20 74 6f 6f 20 6c 61 72 67  Request too larg
9120: 65 22 29 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20  e");.      nOut 
9130: 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20  += printf(.     
9140: 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65     "Content-type
9150: 3a 20 74 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e 22  : text/html\r\n"
9160: 0a 20 20 20 20 20 20 20 20 22 5c 72 5c 6e 22 0a  .        "\r\n".
9170: 20 20 20 20 20 20 20 20 22 54 6f 6f 20 6d 75 63          "Too muc
9180: 68 20 50 4f 53 54 20 64 61 74 61 5c 6e 22 0a 20  h POST data\n". 
9190: 20 20 20 20 20 20 20 22 3c 2f 62 6f 64 79 3e 5c         "</body>\
91a0: 6e 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  n".      );.    
91b0: 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30    MakeLogEntry(0
91c0: 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 30 29  );.      exit(0)
91d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 70 72 69  ;.    }.    spri
91e0: 6e 74 66 28 7a 54 6d 70 4e 61 6d 42 75 66 2c 20  ntf(zTmpNamBuf, 
91f0: 22 2f 74 6d 70 2f 2d 70 6f 73 74 2d 64 61 74 61  "/tmp/-post-data
9200: 2d 58 58 58 58 58 58 22 29 3b 0a 20 20 20 20 7a  -XXXXXX");.    z
9210: 54 6d 70 4e 61 6d 20 3d 20 7a 54 6d 70 4e 61 6d  TmpNam = zTmpNam
9220: 42 75 66 3b 0a 20 20 20 20 6d 6b 73 74 65 6d 70  Buf;.    mkstemp
9230: 28 7a 54 6d 70 4e 61 6d 29 3b 0a 20 20 20 20 6f  (zTmpNam);.    o
9240: 75 74 20 3d 20 66 6f 70 65 6e 28 7a 54 6d 70 4e  ut = fopen(zTmpN
9250: 61 6d 2c 22 77 22 29 3b 0a 20 20 20 20 7a 42 75  am,"w");.    zBu
9260: 66 20 3d 20 53 61 66 65 4d 61 6c 6c 6f 63 28 20  f = SafeMalloc( 
9270: 6c 65 6e 20 29 3b 0a 20 20 20 20 61 6c 61 72 6d  len );.    alarm
9280: 28 31 35 20 2b 20 6c 65 6e 2f 32 30 30 30 29 3b  (15 + len/2000);
9290: 0a 20 20 20 20 6e 20 3d 20 66 72 65 61 64 28 7a  .    n = fread(z
92a0: 42 75 66 2c 31 2c 6c 65 6e 2c 73 74 64 69 6e 29  Buf,1,len,stdin)
92b0: 3b 0a 20 20 20 20 6e 49 6e 20 2b 3d 20 6e 3b 0a  ;.    nIn += n;.
92c0: 20 20 20 20 66 77 72 69 74 65 28 7a 42 75 66 2c      fwrite(zBuf,
92d0: 31 2c 6e 2c 6f 75 74 29 3b 0a 20 20 20 20 66 72  1,n,out);.    fr
92e0: 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 66 63  ee(zBuf);.    fc
92f0: 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 7d 0a 0a  lose(out);.  }..
9300: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
9310: 68 65 20 72 75 6e 6e 69 6e 67 20 74 69 6d 65 20  he running time 
9320: 69 73 20 6e 6f 74 20 74 6f 6f 20 67 72 65 61 74  is not too great
9330: 20 2a 2f 0a 20 20 61 6c 61 72 6d 28 31 30 29 3b   */.  alarm(10);
9340: 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 61  ..  /* Convert a
9350: 6c 6c 20 75 6e 75 73 75 61 6c 20 63 68 61 72 61  ll unusual chara
9360: 63 74 65 72 73 20 69 6e 20 74 68 65 20 73 63 72  cters in the scr
9370: 69 70 74 20 6e 61 6d 65 20 69 6e 74 6f 20 22 5f  ipt name into "_
9380: 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  "..  **.  ** Thi
9390: 73 20 69 73 20 61 20 64 65 66 65 6e 73 65 20 61  s is a defense a
93a0: 67 61 69 6e 73 74 20 76 61 72 69 6f 75 73 20 61  gainst various a
93b0: 74 74 61 63 6b 73 2c 20 58 53 53 20 61 74 74 61  ttacks, XSS atta
93c0: 63 6b 73 20 69 6e 20 70 61 72 74 69 63 75 6c 61  cks in particula
93d0: 72 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 7a 3d  r..  */.  for(z=
93e0: 7a 53 63 72 69 70 74 3b 20 2a 7a 3b 20 7a 2b 2b  zScript; *z; z++
93f0: 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  ){.    unsigned 
9400: 63 68 61 72 20 63 20 3d 20 2a 28 75 6e 73 69 67  char c = *(unsig
9410: 6e 65 64 20 63 68 61 72 2a 29 7a 3b 0a 20 20 20  ned char*)z;.   
9420: 20 69 66 28 20 28 63 26 30 78 38 30 29 21 3d 30   if( (c&0x80)!=0
9430: 20 7c 7c 20 21 61 6c 6c 6f 77 65 64 49 6e 4e 61   || !allowedInNa
9440: 6d 65 5b 63 5d 20 29 7b 0a 20 20 20 20 20 20 2a  me[c] ){.      *
9450: 7a 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 69  z = '_';.      i
9460: 66 28 20 63 3d 3d 27 25 27 20 26 26 20 7a 5b 31  f( c=='%' && z[1
9470: 5d 21 3d 30 20 26 26 20 7a 5b 32 5d 21 3d 30 20  ]!=0 && z[2]!=0 
9480: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
9490: 3d 33 3b 20 28 7a 5b 69 2d 32 5d 20 3d 20 7a 5b  =3; (z[i-2] = z[
94a0: 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20  i])!=0; i++){}. 
94b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
94c0: 0a 0a 20 20 2f 2a 20 44 6f 6e 27 74 20 61 6c 6c  ..  /* Don't all
94d0: 6f 77 20 22 2f 2e 22 20 6f 72 20 22 2f 2d 22 20  ow "/." or "/-" 
94e0: 74 6f 20 74 6f 20 6f 63 63 75 72 20 61 6e 79 77  to to occur anyw
94f0: 68 65 72 65 20 69 6e 20 74 68 65 20 65 6e 74 69  here in the enti
9500: 74 79 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 54 68  ty name..  ** Th
9510: 69 73 20 70 72 65 76 65 6e 74 73 20 61 74 74 61  is prevents atta
9520: 63 6b 73 20 69 6e 76 6f 6c 76 69 6e 67 20 22 2e  cks involving ".
9530: 2e 22 20 61 6e 64 20 61 6c 73 6f 20 61 6c 6c 6f  ." and also allo
9540: 77 73 20 75 73 20 74 6f 20 63 72 65 61 74 65 0a  ws us to create.
9550: 20 20 2a 2a 20 66 69 6c 65 73 20 61 6e 64 20 64    ** files and d
9560: 69 72 65 63 74 6f 72 69 65 73 20 77 68 6f 73 65  irectories whose
9570: 20 6e 61 6d 65 73 20 62 65 67 69 6e 20 77 69 74   names begin wit
9580: 68 20 22 2d 22 20 77 68 69 63 68 20 61 72 65 20  h "-" which are 
9590: 69 6e 76 69 73 69 62 6c 65 0a 20 20 2a 2a 20 74  invisible.  ** t
95a0: 6f 20 74 68 65 20 77 65 62 73 65 72 76 65 72 2e  o the webserver.
95b0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 7a 3d 7a 53  .  */.  for(z=zS
95c0: 63 72 69 70 74 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b  cript; *z; z++){
95d0: 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2f 27  .    if( *z=='/'
95e0: 20 26 26 20 28 7a 5b 31 5d 3d 3d 27 2e 27 20 7c   && (z[1]=='.' |
95f0: 7c 20 7a 5b 31 5d 3d 3d 27 2d 27 29 20 29 7b 0a  | z[1]=='-') ){.
9600: 20 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28         NotFound(
9610: 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d  __LINE__);.    }
9620: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72  .  }..  /* Figur
9630: 65 20 6f 75 74 20 77 68 61 74 20 74 68 65 20 72  e out what the r
9640: 6f 6f 74 20 6f 66 20 74 68 65 20 66 69 6c 65 73  oot of the files
9650: 79 73 74 65 6d 20 73 68 6f 75 6c 64 20 62 65 2e  ystem should be.
9660: 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 48 54    If the.  ** HT
9670: 54 50 5f 48 4f 53 54 20 70 61 72 61 6d 65 74 65  TP_HOST paramete
9680: 72 20 65 78 69 73 74 73 20 28 73 74 6f 72 65 64  r exists (stored
9690: 20 69 6e 20 7a 48 74 74 70 48 6f 73 74 29 20 74   in zHttpHost) t
96a0: 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 0a 20  hen remove the. 
96b0: 20 2a 2a 20 70 6f 72 74 20 6e 75 6d 62 65 72 20   ** port number 
96c0: 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 28 69 66  from the end (if
96d0: 20 61 6e 79 29 2c 20 63 6f 6e 76 65 72 74 20 61   any), convert a
96e0: 6c 6c 20 63 68 61 72 61 63 74 65 72 73 20 74 6f  ll characters to
96f0: 20 6c 6f 77 65 72 0a 20 20 2a 2a 20 63 61 73 65   lower.  ** case
9700: 2c 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 61 6c  , and convert al
9710: 6c 20 22 2e 22 20 74 6f 20 22 5f 22 2e 20 20 54  l "." to "_".  T
9720: 68 65 6e 20 74 72 79 20 74 6f 20 66 69 6e 64 20  hen try to find 
9730: 61 20 64 69 72 65 63 74 6f 72 79 0a 20 20 2a 2a  a directory.  **
9740: 20 77 69 74 68 20 74 68 61 74 20 6e 61 6d 65 20   with that name 
9750: 61 6e 64 20 74 68 65 20 65 78 74 65 6e 73 69 6f  and the extensio
9760: 6e 20 2e 77 65 62 73 69 74 65 2e 20 20 49 66 20  n .website.  If 
9770: 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c 6f 6f 6b 0a  not found, look.
9780: 20 20 2a 2a 20 66 6f 72 20 22 64 65 66 61 75 6c    ** for "defaul
9790: 74 2e 77 65 62 73 69 74 65 22 2e 0a 20 20 2a 2f  t.website"..  */
97a0: 0a 20 20 69 66 28 20 7a 53 63 72 69 70 74 5b 30  .  if( zScript[0
97b0: 5d 21 3d 27 2f 27 20 29 20 4e 6f 74 46 6f 75 6e  ]!='/' ) NotFoun
97c0: 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 69  d(__LINE__);.  i
97d0: 66 28 20 73 74 72 6c 65 6e 28 7a 52 6f 6f 74 29  f( strlen(zRoot)
97e0: 2b 34 30 20 3e 3d 20 73 69 7a 65 6f 66 28 7a 4c  +40 >= sizeof(zL
97f0: 69 6e 65 29 20 29 20 4e 6f 74 46 6f 75 6e 64 28  ine) ) NotFound(
9800: 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 69 66 28  __LINE__);.  if(
9810: 20 7a 48 74 74 70 48 6f 73 74 3d 3d 30 20 29 7b   zHttpHost==0 ){
9820: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 69  .    sprintf(zLi
9830: 6e 65 2c 20 22 25 73 2f 64 65 66 61 75 6c 74 2e  ne, "%s/default.
9840: 77 65 62 73 69 74 65 22 2c 20 7a 52 6f 6f 74 29  website", zRoot)
9850: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
9860: 72 6c 65 6e 28 7a 48 74 74 70 48 6f 73 74 29 2b  rlen(zHttpHost)+
9870: 73 74 72 6c 65 6e 28 7a 52 6f 6f 74 29 2b 31 30  strlen(zRoot)+10
9880: 20 3e 3d 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65   >= sizeof(zLine
9890: 29 20 29 7b 0a 20 20 20 20 4e 6f 74 46 6f 75 6e  ) ){.    NotFoun
98a0: 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d  d(__LINE__);.  }
98b0: 65 6c 73 65 7b 0a 20 20 20 20 73 70 72 69 6e 74  else{.    sprint
98c0: 66 28 7a 4c 69 6e 65 2c 20 22 25 73 2f 25 73 22  f(zLine, "%s/%s"
98d0: 2c 20 7a 52 6f 6f 74 2c 20 7a 48 74 74 70 48 6f  , zRoot, zHttpHo
98e0: 73 74 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 73  st);.    for(i=s
98f0: 74 72 6c 65 6e 28 7a 52 6f 6f 74 29 2b 31 3b 20  trlen(zRoot)+1; 
9900: 7a 4c 69 6e 65 5b 69 5d 20 26 26 20 7a 4c 69 6e  zLine[i] && zLin
9910: 65 5b 69 5d 21 3d 27 3a 27 3b 20 69 2b 2b 29 7b  e[i]!=':'; i++){
9920: 0a 20 20 20 20 20 20 69 6e 74 20 63 20 3d 20 7a  .      int c = z
9930: 4c 69 6e 65 5b 69 5d 3b 0a 20 20 20 20 20 20 69  Line[i];.      i
9940: 66 28 20 21 69 73 61 6c 6e 75 6d 28 63 29 20 29  f( !isalnum(c) )
9950: 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b  {.        zLine[
9960: 69 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20  i] = '_';.      
9970: 7d 65 6c 73 65 20 69 66 28 20 69 73 75 70 70 65  }else if( isuppe
9980: 72 28 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  r(c) ){.        
9990: 7a 4c 69 6e 65 5b 69 5d 20 3d 20 74 6f 6c 6f 77  zLine[i] = tolow
99a0: 65 72 28 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  er(c);.      }. 
99b0: 20 20 20 7d 0a 20 20 20 20 73 74 72 63 70 79 28     }.    strcpy(
99c0: 26 7a 4c 69 6e 65 5b 69 5d 2c 20 22 2e 77 65 62  &zLine[i], ".web
99d0: 73 69 74 65 22 29 3b 0a 20 20 7d 0a 20 20 69 66  site");.  }.  if
99e0: 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74  ( stat(zLine,&st
99f0: 61 74 62 75 66 29 20 26 26 20 21 53 5f 49 53 44  atbuf) && !S_ISD
9a00: 49 52 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f  IR(statbuf.st_mo
9a10: 64 65 29 20 29 7b 0a 20 20 20 20 73 70 72 69 6e  de) ){.    sprin
9a20: 74 66 28 7a 4c 69 6e 65 2c 20 22 25 73 2f 64 65  tf(zLine, "%s/de
9a30: 66 61 75 6c 74 2e 77 65 62 73 69 74 65 22 2c 20  fault.website", 
9a40: 7a 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20  zRoot);.    if( 
9a50: 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74  stat(zLine,&stat
9a60: 62 75 66 29 20 26 26 20 21 53 5f 49 53 44 49 52  buf) && !S_ISDIR
9a70: 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65  (statbuf.st_mode
9a80: 29 20 29 7b 0a 20 20 20 20 20 20 4e 6f 74 46 6f  ) ){.      NotFo
9a90: 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  und(__LINE__);. 
9aa0: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 7a 48     }.  }.  .  zH
9ab0: 6f 6d 65 20 3d 20 53 74 72 44 75 70 28 7a 4c 69  ome = StrDup(zLi
9ac0: 6e 65 29 3b 0a 0a 20 20 2f 2a 20 43 68 61 6e 67  ne);..  /* Chang
9ad0: 65 20 64 69 72 65 63 74 6f 72 69 65 73 20 74 6f  e directories to
9ae0: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
9af0: 20 48 54 54 50 20 66 69 6c 65 73 79 73 74 65 6d   HTTP filesystem
9b00: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 64 69  .  */.  if( chdi
9b10: 72 28 7a 48 6f 6d 65 29 21 3d 30 20 29 7b 0a 20  r(zHome)!=0 ){. 
9b20: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30     char zBuf[100
9b30: 30 5d 3b 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74  0];.    Malfunct
9b40: 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 63  ion(__LINE__, "c
9b50: 61 6e 6e 6f 74 20 63 68 64 69 72 20 74 6f 20 5b  annot chdir to [
9b60: 25 73 5d 20 66 72 6f 6d 20 5b 25 73 5d 22 2c 0a  %s] from [%s]",.
9b70: 20 20 20 20 20 20 20 20 20 7a 48 6f 6d 65 2c 20           zHome, 
9b80: 67 65 74 63 77 64 28 7a 42 75 66 2c 39 39 39 29  getcwd(zBuf,999)
9b90: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  );.  }..  /* Loc
9ba0: 61 74 65 20 74 68 65 20 66 69 6c 65 20 69 6e 20  ate the file in 
9bb0: 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 2e 20  the filesystem. 
9bc0: 20 57 65 20 6d 69 67 68 74 20 68 61 76 65 20 74   We might have t
9bd0: 6f 20 61 70 70 65 6e 64 0a 20 20 2a 2a 20 74 68  o append.  ** th
9be0: 65 20 6e 61 6d 65 20 22 69 6e 64 65 78 2e 68 74  e name "index.ht
9bf0: 6d 6c 22 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ml" in order to 
9c00: 66 69 6e 64 20 69 74 2e 20 20 41 6e 79 20 65 78  find it.  Any ex
9c10: 63 65 73 73 20 70 61 74 68 0a 20 20 2a 2a 20 69  cess path.  ** i
9c20: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 70 75  nformation is pu
9c30: 74 20 69 6e 74 6f 20 74 68 65 20 7a 50 61 74 68  t into the zPath
9c40: 49 6e 66 6f 20 76 61 72 69 61 62 6c 65 2e 0a 20  Info variable.. 
9c50: 20 2a 2f 0a 20 20 7a 4c 69 6e 65 5b 30 5d 20 3d   */.  zLine[0] =
9c60: 20 27 2e 27 3b 0a 20 20 69 20 3d 20 30 3b 0a 20   '.';.  i = 0;. 
9c70: 20 77 68 69 6c 65 28 20 7a 53 63 72 69 70 74 5b   while( zScript[
9c80: 69 5d 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  i] ){.    while(
9c90: 20 7a 53 63 72 69 70 74 5b 69 5d 20 26 26 20 7a   zScript[i] && z
9ca0: 53 63 72 69 70 74 5b 69 5d 21 3d 27 2f 27 20 29  Script[i]!='/' )
9cb0: 7b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 69 2b  {.      zLine[i+
9cc0: 31 5d 20 3d 20 7a 53 63 72 69 70 74 5b 69 5d 3b  1] = zScript[i];
9cd0: 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  .      i++;.    
9ce0: 7d 0a 20 20 20 20 7a 4c 69 6e 65 5b 69 2b 31 5d  }.    zLine[i+1]
9cf0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 74   = 0;.    if( st
9d00: 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75  at(zLine,&statbu
9d10: 66 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 4e  f)!=0 ){.      N
9d20: 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f  otFound(__LINE__
9d30: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
9d40: 20 53 5f 49 53 52 45 47 28 73 74 61 74 62 75 66   S_ISREG(statbuf
9d50: 2e 73 74 5f 6d 6f 64 65 29 20 29 7b 0a 20 20 20  .st_mode) ){.   
9d60: 20 20 20 69 66 28 20 61 63 63 65 73 73 28 7a 4c     if( access(zL
9d70: 69 6e 65 2c 52 5f 4f 4b 29 20 29 7b 0a 20 20 20  ine,R_OK) ){.   
9d80: 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f       NotFound(__
9d90: 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 7d  LINE__);.      }
9da0: 0a 20 20 20 20 20 20 7a 52 65 61 6c 53 63 72 69  .      zRealScri
9db0: 70 74 20 3d 20 53 74 72 44 75 70 28 26 7a 4c 69  pt = StrDup(&zLi
9dc0: 6e 65 5b 31 5d 29 3b 0a 20 20 20 20 20 20 62 72  ne[1]);.      br
9dd0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
9de0: 66 28 20 7a 53 63 72 69 70 74 5b 69 5d 3d 3d 30  f( zScript[i]==0
9df0: 20 7c 7c 20 7a 53 63 72 69 70 74 5b 69 2b 31 5d   || zScript[i+1]
9e00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72  ==0 ){.      str
9e10: 63 70 79 28 26 7a 4c 69 6e 65 5b 69 2b 31 5d 2c  cpy(&zLine[i+1],
9e20: 22 2f 69 6e 64 65 78 2e 68 74 6d 6c 22 29 3b 0a  "/index.html");.
9e30: 20 20 20 20 20 20 69 66 28 20 73 74 61 74 28 7a        if( stat(z
9e40: 4c 69 6e 65 2c 26 73 74 61 74 62 75 66 29 21 3d  Line,&statbuf)!=
9e50: 30 20 7c 7c 20 21 53 5f 49 53 52 45 47 28 73 74  0 || !S_ISREG(st
9e60: 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 0a  atbuf.st_mode) .
9e70: 20 20 20 20 20 20 7c 7c 20 61 63 63 65 73 73 28        || access(
9e80: 7a 4c 69 6e 65 2c 52 5f 4f 4b 29 20 29 7b 0a 20  zLine,R_OK) ){. 
9e90: 20 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a         strcpy(&z
9ea0: 4c 69 6e 65 5b 69 2b 31 5d 2c 22 2f 69 6e 64 65  Line[i+1],"/inde
9eb0: 78 2e 63 67 69 22 29 3b 0a 20 20 20 20 20 20 20  x.cgi");.       
9ec0: 20 69 66 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c   if( stat(zLine,
9ed0: 26 73 74 61 74 62 75 66 29 21 3d 30 20 7c 7c 20  &statbuf)!=0 || 
9ee0: 21 53 5f 49 53 52 45 47 28 73 74 61 74 62 75 66  !S_ISREG(statbuf
9ef0: 2e 73 74 5f 6d 6f 64 65 29 20 0a 20 20 20 20 20  .st_mode) .     
9f00: 20 20 20 7c 7c 20 61 63 63 65 73 73 28 7a 4c 69     || access(zLi
9f10: 6e 65 2c 52 5f 4f 4b 29 20 29 7b 0a 20 20 20 20  ne,R_OK) ){.    
9f20: 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f        NotFound(_
9f30: 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
9f40: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
9f50: 20 20 7a 52 65 61 6c 53 63 72 69 70 74 20 3d 20    zRealScript = 
9f60: 53 74 72 44 75 70 28 26 7a 4c 69 6e 65 5b 31 5d  StrDup(&zLine[1]
9f70: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 53 63  );.      if( zSc
9f80: 72 69 70 74 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  ript[i]==0 ){.  
9f90: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
9fa0: 72 65 71 75 65 73 74 65 64 20 55 52 4c 20 64 6f  requested URL do
9fb0: 65 73 20 6e 6f 74 20 65 6e 64 20 77 69 74 68 20  es not end with 
9fc0: 22 2f 22 20 62 75 74 20 77 65 20 68 61 64 20 74  "/" but we had t
9fd0: 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70  o.        ** app
9fe0: 65 6e 64 20 22 69 6e 64 65 78 2e 68 74 6d 6c 22  end "index.html"
9ff0: 2c 20 74 68 65 6e 20 61 20 72 65 64 69 72 65 63  , then a redirec
a000: 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20  t is necessary. 
a010: 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 20   Otherwise.     
a020: 20 20 20 2a 2a 20 6e 6f 6e 65 20 6f 66 20 74 68     ** none of th
a030: 65 20 72 65 6c 61 74 69 76 65 20 55 52 4c 73 20  e relative URLs 
a040: 69 6e 20 74 68 65 20 64 65 6c 69 76 65 72 65 64  in the delivered
a050: 20 64 6f 63 75 6d 65 6e 74 20 77 69 6c 6c 20 62   document will b
a060: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 72  e.        ** cor
a070: 72 65 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rect. */.       
a080: 20 52 65 64 69 72 65 63 74 28 7a 52 65 61 6c 53   Redirect(zRealS
a090: 63 72 69 70 74 2c 20 31 29 3b 0a 20 20 20 20 20  cript, 1);.     
a0a0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
a0b0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
a0c0: 20 20 20 20 7d 0a 20 20 20 20 7a 4c 69 6e 65 5b      }.    zLine[
a0d0: 69 2b 31 5d 20 3d 20 7a 53 63 72 69 70 74 5b 69  i+1] = zScript[i
a0e0: 5d 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a  ];.    i++;.  }.
a0f0: 20 20 7a 46 69 6c 65 20 3d 20 53 74 72 44 75 70    zFile = StrDup
a100: 28 7a 4c 69 6e 65 29 3b 0a 20 20 7a 50 61 74 68  (zLine);.  zPath
a110: 49 6e 66 6f 20 3d 20 53 74 72 44 75 70 28 26 7a  Info = StrDup(&z
a120: 53 63 72 69 70 74 5b 69 5d 29 3b 0a 20 20 6c 65  Script[i]);.  le
a130: 6e 46 69 6c 65 20 3d 20 73 74 72 6c 65 6e 28 7a  nFile = strlen(z
a140: 46 69 6c 65 29 3b 0a 20 20 7a 44 69 72 20 3d 20  File);.  zDir = 
a150: 53 74 72 44 75 70 28 7a 46 69 6c 65 29 3b 0a 20  StrDup(zFile);. 
a160: 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 7a 44   for(i=strlen(zD
a170: 69 72 29 2d 31 3b 20 69 3e 30 20 26 26 20 7a 44  ir)-1; i>0 && zD
a180: 69 72 5b 69 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29  ir[i]!='/'; i--)
a190: 7b 7d 3b 0a 20 20 69 66 28 20 69 3d 3d 30 20 29  {};.  if( i==0 )
a1a0: 7b 0a 20 20 20 20 20 73 74 72 63 70 79 28 7a 44  {.     strcpy(zD
a1b0: 69 72 2c 22 2f 22 29 3b 0a 20 20 7d 65 6c 73 65  ir,"/");.  }else
a1c0: 7b 0a 20 20 20 20 20 7a 44 69 72 5b 69 5d 20 3d  {.     zDir[i] =
a1d0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68   0;.  }..  /* Ch
a1e0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
a1f0: 65 72 65 20 69 73 20 61 6e 20 61 75 74 68 6f 72  ere is an author
a200: 69 7a 61 74 69 6f 6e 20 66 69 6c 65 2e 20 20 49  ization file.  I
a210: 66 20 74 68 65 72 65 20 69 73 2c 0a 20 20 2a 2a  f there is,.  **
a220: 20 70 72 6f 63 65 73 73 20 69 74 2e 0a 20 20 2a   process it..  *
a230: 2f 0a 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e  /.  sprintf(zLin
a240: 65 2c 20 22 25 73 2f 2d 61 75 74 68 22 2c 20 7a  e, "%s/-auth", z
a250: 44 69 72 29 3b 0a 20 20 69 66 28 20 61 63 63 65  Dir);.  if( acce
a260: 73 73 28 7a 4c 69 6e 65 2c 52 5f 4f 4b 29 3d 3d  ss(zLine,R_OK)==
a270: 30 20 26 26 20 21 43 68 65 63 6b 42 61 73 69 63  0 && !CheckBasic
a280: 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e 28 7a 4c  Authorization(zL
a290: 69 6e 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  ine) ) return;..
a2a0: 20 20 2f 2a 20 54 61 6b 65 20 61 70 70 72 6f 70    /* Take approp
a2b0: 72 69 61 74 65 20 61 63 74 69 6f 6e 0a 20 20 2a  riate action.  *
a2c0: 2f 0a 20 20 69 66 28 20 28 73 74 61 74 62 75 66  /.  if( (statbuf
a2d0: 2e 73 74 5f 6d 6f 64 65 20 26 20 30 31 30 30 29  .st_mode & 0100)
a2e0: 3d 3d 30 31 30 30 20 26 26 20 61 63 63 65 73 73  ==0100 && access
a2f0: 28 7a 46 69 6c 65 2c 58 5f 4f 4b 29 3d 3d 30 20  (zFile,X_OK)==0 
a300: 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
a310: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 73 20   The followings 
a320: 73 74 61 74 69 63 20 76 61 72 69 61 62 6c 65 73  static variables
a330: 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 65 74   are used to set
a340: 75 70 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65  up the environme
a350: 6e 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  nt.    ** for th
a360: 65 20 43 47 49 20 73 63 72 69 70 74 0a 20 20 20  e CGI script.   
a370: 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63   */.    static c
a380: 68 61 72 20 2a 64 65 66 61 75 6c 74 5f 70 61 74  har *default_pat
a390: 68 20 3d 20 22 2f 62 69 6e 3a 2f 75 73 72 2f 62  h = "/bin:/usr/b
a3a0: 69 6e 22 3b 0a 20 20 20 20 73 74 61 74 69 63 20  in";.    static 
a3b0: 63 68 61 72 20 2a 67 61 74 65 77 61 79 5f 69 6e  char *gateway_in
a3c0: 74 65 72 66 61 63 65 20 3d 20 22 43 47 49 2f 31  terface = "CGI/1
a3d0: 2e 30 22 3b 0a 20 20 20 20 73 74 61 74 69 63 20  .0";.    static 
a3e0: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20 63  struct {.      c
a3f0: 68 61 72 20 2a 7a 45 6e 76 4e 61 6d 65 3b 0a 20  har *zEnvName;. 
a400: 20 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 45 6e       char **pzEn
a410: 76 56 61 6c 75 65 3b 0a 20 20 20 20 7d 20 63 67  vValue;.    } cg
a420: 69 65 6e 76 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  ienv[] = {.     
a430: 20 7b 20 22 41 55 54 48 5f 54 59 50 45 22 2c 20   { "AUTH_TYPE", 
a440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a450: 20 20 26 7a 41 75 74 68 54 79 70 65 20 7d 2c 0a    &zAuthType },.
a460: 20 20 20 20 20 20 7b 20 22 41 55 54 48 5f 43 4f        { "AUTH_CO
a470: 4e 54 45 4e 54 22 2c 20 20 20 20 20 20 20 20 20  NTENT",         
a480: 20 20 20 20 20 20 20 26 7a 41 75 74 68 41 72 67         &zAuthArg
a490: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 43 4f 4e   },.      { "CON
a4a0: 54 45 4e 54 5f 4c 45 4e 47 54 48 22 2c 20 20 20  TENT_LENGTH",   
a4b0: 20 20 20 20 20 20 20 20 20 20 20 26 7a 43 6f 6e             &zCon
a4c0: 74 65 6e 74 4c 65 6e 67 74 68 20 7d 2c 0a 20 20  tentLength },.  
a4d0: 20 20 20 20 7b 20 22 43 4f 4e 54 45 4e 54 5f 54      { "CONTENT_T
a4e0: 59 50 45 22 2c 20 20 20 20 20 20 20 20 20 20 20  YPE",           
a4f0: 20 20 20 20 20 26 7a 43 6f 6e 74 65 6e 74 54 79       &zContentTy
a500: 70 65 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 44  pe },.      { "D
a510: 4f 43 55 4d 45 4e 54 5f 52 4f 4f 54 22 2c 20 20  OCUMENT_ROOT",  
a520: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 48               &zH
a530: 6f 6d 65 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  ome },.      { "
a540: 47 41 54 45 57 41 59 5f 49 4e 54 45 52 46 41 43  GATEWAY_INTERFAC
a550: 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 26 67  E",           &g
a560: 61 74 65 77 61 79 5f 69 6e 74 65 72 66 61 63 65  ateway_interface
a570: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 48 54 54   },.      { "HTT
a580: 50 5f 41 43 43 45 50 54 22 2c 20 20 20 20 20 20  P_ACCEPT",      
a590: 20 20 20 20 20 20 20 20 20 20 20 26 7a 41 63 63             &zAcc
a5a0: 65 70 74 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  ept },.      { "
a5b0: 48 54 54 50 5f 43 4f 4f 4b 49 45 22 2c 20 20 20  HTTP_COOKIE",   
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
a5d0: 43 6f 6f 6b 69 65 20 7d 2c 0a 20 20 20 20 20 20  Cookie },.      
a5e0: 7b 20 22 48 54 54 50 5f 48 4f 53 54 22 2c 20 20  { "HTTP_HOST",  
a5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a600: 20 26 7a 48 74 74 70 48 6f 73 74 20 7d 2c 0a 20   &zHttpHost },. 
a610: 20 20 20 20 20 7b 20 22 48 54 54 50 5f 52 45 46       { "HTTP_REF
a620: 45 52 45 52 22 2c 20 20 20 20 20 20 20 20 20 20  ERER",          
a630: 20 20 20 20 20 20 26 7a 52 65 66 65 72 65 72 20        &zReferer 
a640: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 48 54 54 50  },.      { "HTTP
a650: 5f 55 53 45 52 5f 41 47 45 4e 54 22 2c 20 20 20  _USER_AGENT",   
a660: 20 20 20 20 20 20 20 20 20 20 26 7a 41 67 65 6e            &zAgen
a670: 74 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 50 41  t },.      { "PA
a680: 54 48 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  TH",            
a690: 20 20 20 20 20 20 20 20 20 20 20 20 26 64 65 66              &def
a6a0: 61 75 6c 74 5f 70 61 74 68 20 7d 2c 0a 20 20 20  ault_path },.   
a6b0: 20 20 20 7b 20 22 50 41 54 48 5f 49 4e 46 4f 22     { "PATH_INFO"
a6c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a6d0: 20 20 20 20 26 7a 50 61 74 68 49 6e 66 6f 20 7d      &zPathInfo }
a6e0: 2c 0a 20 20 20 20 20 20 7b 20 22 51 55 45 52 59  ,.      { "QUERY
a6f0: 5f 53 54 52 49 4e 47 22 2c 20 20 20 20 20 20 20  _STRING",       
a700: 20 20 20 20 20 20 20 20 20 26 7a 51 75 65 72 79           &zQuery
a710: 53 74 72 69 6e 67 20 7d 2c 0a 20 20 20 20 20 20  String },.      
a720: 7b 20 22 52 45 4d 4f 54 45 5f 41 44 44 52 22 2c  { "REMOTE_ADDR",
a730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a740: 20 26 7a 52 65 6d 6f 74 65 41 64 64 72 20 7d 2c   &zRemoteAddr },
a750: 0a 20 20 20 20 20 20 7b 20 22 52 45 51 55 45 53  .      { "REQUES
a760: 54 5f 4d 45 54 48 4f 44 22 2c 20 20 20 20 20 20  T_METHOD",      
a770: 20 20 20 20 20 20 20 20 26 7a 4d 65 74 68 6f 64          &zMethod
a780: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 52 45 51   },.      { "REQ
a790: 55 45 53 54 5f 55 52 49 22 2c 20 20 20 20 20 20  UEST_URI",      
a7a0: 20 20 20 20 20 20 20 20 20 20 20 26 7a 53 63 72             &zScr
a7b0: 69 70 74 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  ipt },.      { "
a7c0: 52 45 4d 4f 54 45 5f 55 53 45 52 22 2c 20 20 20  REMOTE_USER",   
a7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
a7e0: 52 65 6d 6f 74 65 55 73 65 72 20 7d 2c 0a 20 20  RemoteUser },.  
a7f0: 20 20 20 20 7b 20 22 53 43 52 49 50 54 5f 44 49      { "SCRIPT_DI
a800: 52 45 43 54 4f 52 59 22 2c 20 20 20 20 20 20 20  RECTORY",       
a810: 20 20 20 20 20 26 7a 44 69 72 20 7d 2c 0a 20 20       &zDir },.  
a820: 20 20 20 20 7b 20 22 53 43 52 49 50 54 5f 46 49      { "SCRIPT_FI
a830: 4c 45 4e 41 4d 45 22 2c 20 20 20 20 20 20 20 20  LENAME",        
a840: 20 20 20 20 20 26 7a 46 69 6c 65 20 7d 2c 0a 20       &zFile },. 
a850: 20 20 20 20 20 7b 20 22 53 43 52 49 50 54 5f 4e       { "SCRIPT_N
a860: 41 4d 45 22 2c 20 20 20 20 20 20 20 20 20 20 20  AME",           
a870: 20 20 20 20 20 20 26 7a 52 65 61 6c 53 63 72 69        &zRealScri
a880: 70 74 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  pt },.      { "S
a890: 45 52 56 45 52 5f 4e 41 4d 45 22 2c 20 20 20 20  ERVER_NAME",    
a8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 53               &zS
a8b0: 65 72 76 65 72 4e 61 6d 65 20 7d 2c 0a 20 20 20  erverName },.   
a8c0: 20 20 20 7b 20 22 53 45 52 56 45 52 5f 50 4f 52     { "SERVER_POR
a8d0: 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  T",             
a8e0: 20 20 20 20 26 7a 53 65 72 76 65 72 50 6f 72 74      &zServerPort
a8f0: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 45 52   },.      { "SER
a900: 56 45 52 5f 50 52 4f 54 4f 43 4f 4c 22 2c 20 20  VER_PROTOCOL",  
a910: 20 20 20 20 20 20 20 20 20 20 20 26 7a 50 72 6f             &zPro
a920: 74 6f 63 6f 6c 20 7d 2c 0a 20 20 20 20 7d 3b 0a  tocol },.    };.
a930: 20 20 20 20 63 68 61 72 20 2a 7a 42 61 73 65 46      char *zBaseF
a940: 69 6c 65 6e 61 6d 65 3b 20 20 20 2f 2a 20 46 69  ilename;   /* Fi
a950: 6c 65 6e 61 6d 65 20 77 69 74 68 6f 75 74 20 64  lename without d
a960: 69 72 65 63 74 6f 72 79 20 70 72 65 66 69 78 20  irectory prefix 
a970: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 69 74  */..    /* If it
a980: 73 20 65 78 65 63 75 74 61 62 6c 65 2c 20 69 74  s executable, it
a990: 20 6d 75 73 74 20 62 65 20 61 20 43 47 49 20 70   must be a CGI p
a9a0: 72 6f 67 72 61 6d 2e 20 20 53 74 61 72 74 20 62  rogram.  Start b
a9b0: 79 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67 69 6e  y.    ** changin
a9c0: 67 20 64 69 72 65 63 74 6f 72 69 65 73 20 74 6f  g directories to
a9d0: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 68   the directory h
a9e0: 6f 6c 64 69 6e 67 20 74 68 65 20 70 72 6f 67 72  olding the progr
a9f0: 61 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  am..    */.    i
aa00: 66 28 20 63 68 64 69 72 28 7a 44 69 72 29 20 29  f( chdir(zDir) )
aa10: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 42 75  {.      char zBu
aa20: 66 5b 31 30 30 30 5d 3b 0a 20 20 20 20 20 20 4d  f[1000];.      M
aa30: 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e  alfunction(__LIN
aa40: 45 5f 5f 2c 20 22 63 61 6e 6e 6f 74 20 63 68 64  E__, "cannot chd
aa50: 69 72 20 74 6f 20 5b 25 73 5d 20 66 72 6f 6d 20  ir to [%s] from 
aa60: 5b 25 73 5d 22 2c 20 0a 20 20 20 20 20 20 20 20  [%s]", .        
aa70: 20 20 20 7a 44 69 72 2c 20 67 65 74 63 77 64 28     zDir, getcwd(
aa80: 7a 42 75 66 2c 39 39 39 29 29 3b 0a 20 20 20 20  zBuf,999));.    
aa90: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 75 70 20  }..    /* Setup 
aaa0: 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  the environment 
aab0: 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 0a 20  appropriately.. 
aac0: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
aad0: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 63 67 69 65  0; i<sizeof(cgie
aae0: 6e 76 29 2f 73 69 7a 65 6f 66 28 63 67 69 65 6e  nv)/sizeof(cgien
aaf0: 76 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  v[0]); i++){.   
ab00: 20 20 20 69 66 28 20 2a 63 67 69 65 6e 76 5b 69     if( *cgienv[i
ab10: 5d 2e 70 7a 45 6e 76 56 61 6c 75 65 20 29 7b 0a  ].pzEnvValue ){.
ab20: 20 20 20 20 20 20 20 20 53 65 74 45 6e 76 28 63          SetEnv(c
ab30: 67 69 65 6e 76 5b 69 5d 2e 7a 45 6e 76 4e 61 6d  gienv[i].zEnvNam
ab40: 65 2c 2a 63 67 69 65 6e 76 5b 69 5d 2e 70 7a 45  e,*cgienv[i].pzE
ab50: 6e 76 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  nvValue);.      
ab60: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
ab70: 75 73 65 48 74 74 70 73 20 29 7b 0a 20 20 20 20  useHttps ){.    
ab80: 20 20 70 75 74 65 6e 76 28 22 48 54 54 50 53 3d    putenv("HTTPS=
ab90: 6f 6e 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  on");.    }..   
aba0: 20 2f 2a 0a 20 20 20 20 2a 2a 20 41 62 6f 72 74   /*.    ** Abort
abb0: 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 69   with an error i
abc0: 66 20 74 68 65 20 43 47 49 20 73 63 72 69 70 74  f the CGI script
abd0: 20 69 73 20 77 72 69 74 61 62 6c 65 20 62 79 20   is writable by 
abe0: 61 6e 79 6f 6e 65 20 6f 74 68 65 72 0a 20 20 20  anyone other.   
abf0: 20 2a 2a 20 74 68 61 6e 20 69 74 73 20 6f 77 6e   ** than its own
ac00: 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  er..    */.    i
ac10: 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f  f( statbuf.st_mo
ac20: 64 65 20 26 20 30 30 32 32 20 29 7b 0a 20 20 20  de & 0022 ){.   
ac30: 20 20 20 43 67 69 53 63 72 69 70 74 57 72 69 74     CgiScriptWrit
ac40: 61 62 6c 65 28 29 3b 0a 20 20 20 20 7d 0a 0a 20  able();.    }.. 
ac50: 20 20 20 2f 2a 20 46 6f 72 20 74 68 65 20 50 4f     /* For the PO
ac60: 53 54 20 6d 65 74 68 6f 64 20 61 6c 6c 20 69 6e  ST method all in
ac70: 70 75 74 20 68 61 73 20 62 65 65 6e 20 77 72 69  put has been wri
ac80: 74 74 65 6e 20 74 6f 20 61 20 74 65 6d 70 6f 72  tten to a tempor
ac90: 61 72 79 20 66 69 6c 65 2c 0a 20 20 20 20 2a 2a  ary file,.    **
aca0: 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 72   so we have to r
acb0: 65 64 69 72 65 63 74 20 69 6e 70 75 74 20 74 6f  edirect input to
acc0: 20 74 68 65 20 43 47 49 20 73 63 72 69 70 74 20   the CGI script 
acd0: 66 72 6f 6d 20 74 68 61 74 20 66 69 6c 65 2e 0a  from that file..
ace0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a      */.    if( z
acf0: 4d 65 74 68 6f 64 5b 30 5d 3d 3d 27 50 27 20 29  Method[0]=='P' )
ad00: 7b 0a 20 20 20 20 20 20 64 75 70 28 30 29 3b 0a  {.      dup(0);.
ad10: 20 20 20 20 20 20 63 6c 6f 73 65 28 30 29 3b 0a        close(0);.
ad20: 20 20 20 20 20 20 6f 70 65 6e 28 7a 54 6d 70 4e        open(zTmpN
ad30: 61 6d 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20  am, O_RDONLY);. 
ad40: 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d     }..    for(i=
ad50: 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2d 31 3b  strlen(zFile)-1;
ad60: 20 69 3e 3d 30 20 26 26 20 7a 46 69 6c 65 5b 69   i>=0 && zFile[i
ad70: 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20  ]!='/'; i--){}. 
ad80: 20 20 20 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65     zBaseFilename
ad90: 20 3d 20 26 7a 46 69 6c 65 5b 69 2b 31 5d 3b 0a   = &zFile[i+1];.
ada0: 20 20 20 20 69 66 28 20 69 3e 3d 30 20 26 26 20      if( i>=0 && 
adb0: 73 74 72 6e 63 6d 70 28 7a 42 61 73 65 46 69 6c  strncmp(zBaseFil
adc0: 65 6e 61 6d 65 2c 22 6e 70 68 2d 22 2c 34 29 3d  ename,"nph-",4)=
add0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
ade0: 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  f the name of th
adf0: 65 20 43 47 49 20 73 63 72 69 70 74 20 62 65 67  e CGI script beg
ae00: 69 6e 73 20 77 69 74 68 20 22 6e 70 68 2d 22 20  ins with "nph-" 
ae10: 74 68 65 6e 20 77 65 20 61 72 65 0a 20 20 20 20  then we are.    
ae20: 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74    ** dealing wit
ae30: 68 20 61 20 22 6e 6f 6e 2d 70 61 72 73 65 64 20  h a "non-parsed 
ae40: 68 65 61 64 65 72 73 22 20 43 47 49 20 73 63 72  headers" CGI scr
ae50: 69 70 74 2e 20 20 4a 75 73 74 20 65 78 65 63 28  ipt.  Just exec(
ae60: 29 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 64 69  ).      ** it di
ae70: 72 65 63 74 6c 79 20 61 6e 64 20 6c 65 74 20 69  rectly and let i
ae80: 74 20 68 61 6e 64 6c 65 20 61 6c 6c 20 69 74 73  t handle all its
ae90: 20 6f 77 6e 20 68 65 61 64 65 72 20 67 65 6e 65   own header gene
aea0: 72 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  ration..      */
aeb0: 0a 20 20 20 20 20 20 65 78 65 63 6c 28 7a 42 61  .      execl(zBa
aec0: 73 65 46 69 6c 65 6e 61 6d 65 2c 7a 42 61 73 65  seFilename,zBase
aed0: 46 69 6c 65 6e 61 6d 65 2c 28 63 68 61 72 2a 29  Filename,(char*)
aee0: 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4e 4f 54  0);.      /* NOT
aef0: 45 3a 20 4e 6f 20 6c 6f 67 20 65 6e 74 72 79 20  E: No log entry 
af00: 77 72 69 74 74 65 6e 20 66 6f 72 20 6e 70 68 2d  written for nph-
af10: 20 73 63 72 69 70 74 73 20 2a 2f 0a 20 20 20 20   scripts */.    
af20: 20 20 65 78 69 74 28 30 29 3b 0a 20 20 20 20 7d    exit(0);.    }
af30: 0a 0a 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68  ..    /* Fall th
af40: 72 75 20 74 6f 20 68 65 72 65 20 6f 6e 6c 79 20  ru to here only 
af50: 69 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  if this process 
af60: 28 74 68 65 20 73 65 72 76 65 72 29 20 69 73 20  (the server) is 
af70: 67 6f 69 6e 67 0a 20 20 20 20 2a 2a 20 74 6f 20  going.    ** to 
af80: 72 65 61 64 20 61 6e 64 20 61 75 67 6d 65 6e 74  read and augment
af90: 20 74 68 65 20 68 65 61 64 65 72 20 73 65 6e 74   the header sent
afa0: 20 62 61 63 6b 20 62 79 20 74 68 65 20 43 47 49   back by the CGI
afb0: 20 70 72 6f 63 65 73 73 2e 0a 20 20 20 20 2a 2a   process..    **
afc0: 20 4f 70 65 6e 20 61 20 70 69 70 65 20 74 6f 20   Open a pipe to 
afd0: 72 65 63 65 69 76 65 20 74 68 65 20 6f 75 74 70  receive the outp
afe0: 75 74 20 66 72 6f 6d 20 74 68 65 20 43 47 49 20  ut from the CGI 
aff0: 70 72 6f 63 65 73 73 2e 20 20 54 68 65 6e 0a 20  process.  Then. 
b000: 20 20 20 2a 2a 20 66 6f 72 6b 20 74 68 65 20 43     ** fork the C
b010: 47 49 20 70 72 6f 63 65 73 73 2e 20 20 4f 6e 63  GI process.  Onc
b020: 65 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  e everything is 
b030: 64 6f 6e 65 2c 20 77 65 20 73 68 6f 75 6c 64 20  done, we should 
b040: 62 65 0a 20 20 20 20 2a 2a 20 61 62 6c 65 20 74  be.    ** able t
b050: 6f 20 72 65 61 64 20 74 68 65 20 6f 75 74 70 75  o read the outpu
b060: 74 20 6f 66 20 43 47 49 20 6f 6e 20 74 68 65 20  t of CGI on the 
b070: 22 69 6e 22 20 73 74 72 65 61 6d 2e 0a 20 20 20  "in" stream..   
b080: 20 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20   */.    {.      
b090: 69 6e 74 20 70 78 5b 32 5d 3b 0a 20 20 20 20 20  int px[2];.     
b0a0: 20 70 69 70 65 28 70 78 29 3b 0a 20 20 20 20 20   pipe(px);.     
b0b0: 20 69 66 28 20 66 6f 72 6b 28 29 3d 3d 30 20 29   if( fork()==0 )
b0c0: 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28  {.        close(
b0d0: 70 78 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20  px[0]);.        
b0e0: 63 6c 6f 73 65 28 31 29 3b 0a 20 20 20 20 20 20  close(1);.      
b0f0: 20 20 64 75 70 28 70 78 5b 31 5d 29 3b 0a 20 20    dup(px[1]);.  
b100: 20 20 20 20 20 20 63 6c 6f 73 65 28 70 78 5b 31        close(px[1
b110: 5d 29 3b 0a 20 20 20 20 20 20 20 20 65 78 65 63  ]);.        exec
b120: 6c 28 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c  l(zBaseFilename,
b130: 20 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c 20   zBaseFilename, 
b140: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
b150: 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20 20 20     exit(0);.    
b160: 20 20 7d 0a 20 20 20 20 20 20 63 6c 6f 73 65 28    }.      close(
b170: 70 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 6e  px[1]);.      in
b180: 20 3d 20 66 64 6f 70 65 6e 28 70 78 5b 30 5d 2c   = fdopen(px[0],
b190: 20 22 72 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20   "r");.    }.   
b1a0: 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20   if( in==0 ){.  
b1b0: 20 20 20 20 43 67 69 45 72 72 6f 72 28 29 3b 0a      CgiError();.
b1c0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
b1d0: 61 64 20 61 6e 64 20 70 72 6f 63 65 73 73 20 74  ad and process t
b1e0: 68 65 20 66 69 72 73 74 20 6c 69 6e 65 20 6f 66  he first line of
b1f0: 20 74 68 65 20 68 65 61 64 65 72 20 72 65 74 75   the header retu
b200: 72 6e 65 64 20 62 79 20 74 68 65 0a 20 20 20 20  rned by the.    
b210: 2a 2a 20 43 47 49 20 73 63 72 69 70 74 2e 0a 20  ** CGI script.. 
b220: 20 20 20 2a 2f 0a 20 20 20 20 61 6c 61 72 6d 28     */.    alarm(
b230: 31 35 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  15);.    while( 
b240: 66 67 65 74 73 28 7a 4c 69 6e 65 2c 73 69 7a 65  fgets(zLine,size
b250: 6f 66 28 7a 4c 69 6e 65 29 2c 69 6e 29 20 29 7b  of(zLine),in) ){
b260: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63  .      if( strnc
b270: 6d 70 28 7a 4c 69 6e 65 2c 22 4c 6f 63 61 74 69  mp(zLine,"Locati
b280: 6f 6e 3a 22 2c 39 29 3d 3d 30 20 29 7b 0a 20 20  on:",9)==0 ){.  
b290: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
b2a0: 20 20 20 20 20 52 65 6d 6f 76 65 4e 65 77 6c 69       RemoveNewli
b2b0: 6e 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20  ne(zLine);.     
b2c0: 20 20 20 7a 20 3d 20 26 7a 4c 69 6e 65 5b 31 30     z = &zLine[10
b2d0: 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ];.        while
b2e0: 28 20 69 73 73 70 61 63 65 28 2a 7a 29 20 29 7b  ( isspace(*z) ){
b2f0: 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20   z++; }.        
b300: 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
b310: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
b320: 66 28 20 7a 5b 69 5d 3d 3d 27 3f 27 20 29 7b 0a  f( z[i]=='?' ){.
b330: 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65              zQue
b340: 72 79 53 75 66 66 69 78 20 3d 20 53 74 72 44 75  rySuffix = StrDu
b350: 70 28 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20  p("");.         
b360: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
b370: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 69 66       .        if
b380: 28 20 7a 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 7a  ( z[0]=='/' && z
b390: 5b 31 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [1]=='/' ){.    
b3a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 63 68        /* The sch
b3b0: 65 6d 65 20 69 73 20 6d 69 73 73 69 6e 67 2e 20  eme is missing. 
b3c0: 20 41 64 64 20 69 74 20 69 6e 20 62 65 66 6f 72   Add it in befor
b3d0: 65 20 72 65 64 69 72 65 63 74 69 6e 67 20 2a 2f  e redirecting */
b3e0: 0a 20 20 20 20 20 20 20 20 20 20 53 74 61 72 74  .          Start
b3f0: 52 65 73 70 6f 6e 73 65 28 22 33 30 32 20 52 65  Response("302 Re
b400: 64 69 72 65 63 74 22 29 3b 0a 20 20 20 20 20 20  direct");.      
b410: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
b420: 74 66 28 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73  tf("Location: %s
b430: 3a 25 73 25 73 5c 72 5c 6e 22 2c 7a 48 74 74 70  :%s%s\r\n",zHttp
b440: 2c 7a 2c 7a 51 75 65 72 79 53 75 66 66 69 78 29  ,z,zQuerySuffix)
b450: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
b460: 6b 3b 20 2f 2a 20 44 4b 20 2a 2f 0a 20 20 20 20  k; /* DK */.    
b470: 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74        MakeLogEnt
b480: 72 79 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20  ry(0);.         
b490: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
b4a0: 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30 5d 3d   }else if( z[0]=
b4b0: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
b4c0: 20 20 2f 2a 20 54 68 65 20 73 63 68 65 6d 65 20    /* The scheme 
b4d0: 61 6e 64 20 6e 65 74 77 6f 72 6b 20 6c 6f 63 61  and network loca
b4e0: 74 69 6f 6e 20 61 72 65 20 6d 69 73 73 69 6e 67  tion are missing
b4f0: 20 62 75 74 20 77 65 20 68 61 76 65 0a 20 20 20   but we have.   
b500: 20 20 20 20 20 20 20 2a 2a 20 61 6e 20 61 62 73         ** an abs
b510: 6f 6c 75 74 65 20 70 61 74 68 2e 20 2a 2f 0a 20  olute path. */. 
b520: 20 20 20 20 20 20 20 20 20 52 65 64 69 72 65 63           Redirec
b530: 74 28 7a 2c 20 30 29 3b 20 2f 2a 20 44 4b 20 2a  t(z, 0); /* DK *
b540: 2f 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  /.          brea
b550: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
b560: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
b570: 20 73 65 65 20 69 66 20 74 68 65 72 65 20 69 73   see if there is
b580: 20 61 20 73 63 68 65 6d 65 20 70 72 65 66 69 78   a scheme prefix
b590: 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
b5a0: 69 3d 30 3b 20 7a 5b 69 5d 20 26 26 20 7a 5b 69  i=0; z[i] && z[i
b5b0: 5d 21 3d 27 3a 27 20 26 26 20 7a 5b 69 5d 21 3d  ]!=':' && z[i]!=
b5c0: 27 2f 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  '/'; i++){}.    
b5d0: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 3a      if( z[i]==':
b5e0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ' ){.          /
b5f0: 2a 20 57 65 20 68 61 76 65 20 61 20 73 63 68 65  * We have a sche
b600: 6d 65 2e 20 20 41 73 73 75 6d 65 20 74 68 65 72  me.  Assume ther
b610: 65 20 69 73 20 61 6e 20 61 62 73 6f 6c 75 74 65  e is an absolute
b620: 20 55 52 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20   URL */.        
b630: 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28    StartResponse(
b640: 22 33 30 32 20 52 65 64 69 72 65 63 74 22 29 3b  "302 Redirect");
b650: 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20  .          nOut 
b660: 2b 3d 20 70 72 69 6e 74 66 28 22 4c 6f 63 61 74  += printf("Locat
b670: 69 6f 6e 3a 20 25 73 25 73 5c 72 5c 6e 22 2c 7a  ion: %s%s\r\n",z
b680: 2c 7a 51 75 65 72 79 53 75 66 66 69 78 29 3b 0a  ,zQuerySuffix);.
b690: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b6a0: 20 2f 2a 20 44 4b 20 2a 2f 0a 20 20 20 20 20 20   /* DK */.      
b6b0: 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79      MakeLogEntry
b6c0: 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  (0);.          r
b6d0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d  eturn;.        }
b6e0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74  .        /* Must
b6f0: 20 62 65 20 61 20 72 65 6c 61 74 69 76 65 20 70   be a relative p
b700: 61 74 68 6e 61 6d 65 2e 20 20 43 6f 6e 73 74 72  athname.  Constr
b710: 75 63 74 20 74 68 65 20 61 62 73 6f 6c 75 74 65  uct the absolute
b720: 20 70 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20   pathname.      
b730: 20 20 2a 2a 20 61 6e 64 20 72 65 64 69 72 65 63    ** and redirec
b740: 74 20 74 6f 20 69 74 2e 20 2a 2f 0a 20 20 20 20  t to it. */.    
b750: 20 20 20 20 69 20 3d 20 73 74 72 6c 65 6e 28 7a      i = strlen(z
b760: 52 65 61 6c 53 63 72 69 70 74 29 3b 0a 20 20 20  RealScript);.   
b770: 20 20 20 20 20 77 68 69 6c 65 28 20 69 3e 30 20       while( i>0 
b780: 26 26 20 7a 52 65 61 6c 53 63 72 69 70 74 5b 69  && zRealScript[i
b790: 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 69 2d 2d 3b  -1]!='/' ){ i--;
b7a0: 20 7d 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65   }.        while
b7b0: 28 20 69 3e 30 20 26 26 20 7a 52 65 61 6c 53 63  ( i>0 && zRealSc
b7c0: 72 69 70 74 5b 69 2d 31 5d 3d 3d 27 2f 27 20 29  ript[i-1]=='/' )
b7d0: 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20  { i--; }.       
b7e0: 20 77 68 69 6c 65 28 20 2a 7a 3d 3d 27 2e 27 20   while( *z=='.' 
b7f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
b800: 20 7a 5b 31 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20   z[1]=='/' ){.  
b810: 20 20 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 32            z += 2
b820: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
b830: 65 20 69 66 28 20 7a 5b 31 5d 3d 3d 27 2e 27 20  e if( z[1]=='.' 
b840: 26 26 20 7a 5b 32 5d 3d 3d 27 2f 27 20 29 7b 0a  && z[2]=='/' ){.
b850: 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c              whil
b860: 65 28 20 69 3e 30 20 26 26 20 7a 52 65 61 6c 53  e( i>0 && zRealS
b870: 63 72 69 70 74 5b 69 2d 31 5d 21 3d 27 2f 27 20  cript[i-1]!='/' 
b880: 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ i--; }.      
b890: 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3e 30        while( i>0
b8a0: 20 26 26 20 7a 52 65 61 6c 53 63 72 69 70 74 5b   && zRealScript[
b8b0: 69 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 69 2d 2d  i-1]=='/' ){ i--
b8c0: 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ; }.            
b8d0: 7a 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20 20  z += 3;.        
b8e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b8f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b900: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b910: 7d 0a 20 20 20 20 20 20 20 20 53 74 61 72 74 52  }.        StartR
b920: 65 73 70 6f 6e 73 65 28 22 33 30 32 20 52 65 64  esponse("302 Red
b930: 69 72 65 63 74 22 29 3b 0a 20 20 20 20 20 20 20  irect");.       
b940: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
b950: 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73 3a 2f 2f  "Location: %s://
b960: 25 73 22 2c 7a 48 74 74 70 2c 7a 53 65 72 76 65  %s",zHttp,zServe
b970: 72 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  rName);.        
b980: 69 66 28 20 73 74 72 63 6d 70 28 7a 53 65 72 76  if( strcmp(zServ
b990: 65 72 50 6f 72 74 2c 22 38 30 22 29 20 29 7b 0a  erPort,"80") ){.
b9a0: 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20 2b            nOut +
b9b0: 3d 20 70 72 69 6e 74 66 28 22 3a 25 73 22 2c 7a  = printf(":%s",z
b9c0: 53 65 72 76 65 72 50 6f 72 74 29 3b 0a 20 20 20  ServerPort);.   
b9d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
b9e0: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 25  Out += printf("%
b9f0: 2e 2a 73 2f 25 73 25 73 5c 72 5c 6e 5c 72 5c 6e  .*s/%s%s\r\n\r\n
ba00: 22 2c 69 2c 7a 52 65 61 6c 53 63 72 69 70 74 2c  ",i,zRealScript,
ba10: 7a 2c 7a 51 75 65 72 79 53 75 66 66 69 78 29 3b  z,zQuerySuffix);
ba20: 0a 20 20 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67  .        MakeLog
ba30: 45 6e 74 72 79 28 30 29 3b 0a 20 20 20 20 20 20  Entry(0);.      
ba40: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
ba50: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d  }else if( strncm
ba60: 70 28 7a 4c 69 6e 65 2c 22 53 74 61 74 75 73 3a  p(zLine,"Status:
ba70: 22 2c 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ",7)==0 ){.     
ba80: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
ba90: 20 20 66 6f 72 28 69 3d 37 3b 20 69 73 73 70 61    for(i=7; isspa
baa0: 63 65 28 7a 4c 69 6e 65 5b 69 5d 29 3b 20 69 2b  ce(zLine[i]); i+
bab0: 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 6e 4f 75  +){}.        nOu
bac0: 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 25 73 20  t += printf("%s 
bad0: 25 73 22 2c 20 7a 50 72 6f 74 6f 63 6f 6c 2c 20  %s", zProtocol, 
bae0: 26 7a 4c 69 6e 65 5b 69 5d 29 3b 0a 20 20 20 20  &zLine[i]);.    
baf0: 20 20 20 20 73 74 72 6e 63 70 79 28 7a 52 65 70      strncpy(zRep
bb00: 6c 79 53 74 61 74 75 73 2c 20 26 7a 4c 69 6e 65  lyStatus, &zLine
bb10: 5b 69 5d 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  [i], 3);.       
bb20: 20 7a 52 65 70 6c 79 53 74 61 74 75 73 5b 33 5d   zReplyStatus[3]
bb30: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 74   = 0;.        st
bb40: 61 74 75 73 53 65 6e 74 20 3d 20 31 3b 0a 20 20  atusSent = 1;.  
bb50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bb60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bb70: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
bb80: 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22   StartResponse("
bb90: 32 30 30 20 4f 4b 22 29 3b 0a 20 20 20 20 20 20  200 OK");.      
bba0: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
bbb0: 28 22 25 73 22 2c 7a 4c 69 6e 65 29 3b 0a 20 20  ("%s",zLine);.  
bbc0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a        for(i=0; z
bbd0: 4c 69 6e 65 5b 69 5d 20 26 26 20 21 69 73 73 70  Line[i] && !issp
bbe0: 61 63 65 28 7a 4c 69 6e 65 5b 69 5d 29 20 26 26  ace(zLine[i]) &&
bbf0: 20 7a 4c 69 6e 65 5b 69 5d 21 3d 27 3a 27 3b 20   zLine[i]!=':'; 
bc00: 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 69  i++){}.        i
bc10: 66 28 20 69 3c 32 20 7c 7c 20 7a 4c 69 6e 65 5b  f( i<2 || zLine[
bc20: 69 5d 21 3d 27 3a 27 20 29 20 62 72 65 61 6b 3b  i]!=':' ) break;
bc30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
bc40: 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 76 65 72      /* Copy ever
bc50: 79 74 68 69 6e 67 20 65 6c 73 65 20 74 68 72 75  ything else thru
bc60: 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 65 20   without change 
bc70: 6f 72 20 61 6e 61 6c 79 73 69 73 2e 0a 20 20 20  or analysis..   
bc80: 20 2a 2f 0a 20 20 20 20 61 6c 61 72 6d 28 36 30   */.    alarm(60
bc90: 2a 35 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  *5);.    while( 
bca0: 28 63 20 3d 20 67 65 74 63 28 69 6e 29 29 21 3d  (c = getc(in))!=
bcb0: 45 4f 46 20 29 7b 0a 20 20 20 20 20 20 70 75 74  EOF ){.      put
bcc0: 63 28 63 2c 73 74 64 6f 75 74 29 3b 0a 20 20 20  c(c,stdout);.   
bcd0: 20 20 20 6e 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d     nOut++;.    }
bce0: 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  .    fclose(in);
bcf0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
bd00: 20 49 66 20 69 74 20 69 73 6e 27 74 20 65 78 65   If it isn't exe
bd10: 63 75 74 61 62 6c 65 20 74 68 65 6e 20 69 74 0a  cutable then it.
bd20: 20 20 20 20 2a 2a 20 6d 75 73 74 20 61 20 73 69      ** must a si
bd30: 6d 70 6c 65 20 66 69 6c 65 20 74 68 61 74 20 6e  mple file that n
bd40: 65 65 64 73 20 74 6f 20 62 65 20 63 6f 70 69 65  eeds to be copie
bd50: 64 20 74 6f 20 6f 75 74 70 75 74 2e 0a 20 20 20  d to output..   
bd60: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
bd70: 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 54 79 70 65  ar *zContentType
bd80: 20 3d 20 47 65 74 4d 69 6d 65 54 79 70 65 28 7a   = GetMimeType(z
bd90: 46 69 6c 65 2c 20 6c 65 6e 46 69 6c 65 29 3b 0a  File, lenFile);.
bda0: 0a 20 20 20 20 69 66 28 20 7a 54 6d 70 4e 61 6d  .    if( zTmpNam
bdb0: 20 29 20 75 6e 6c 69 6e 6b 28 7a 54 6d 70 4e 61   ) unlink(zTmpNa
bdc0: 6d 29 3b 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70  m);.    in = fop
bdd0: 65 6e 28 7a 46 69 6c 65 2c 22 72 22 29 3b 0a 20  en(zFile,"r");. 
bde0: 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 4e     if( in==0 ) N
bdf0: 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f  otFound(__LINE__
be00: 29 3b 0a 20 20 20 20 53 74 61 72 74 52 65 73 70  );.    StartResp
be10: 6f 6e 73 65 28 22 32 30 30 20 4f 4b 22 29 3b 0a  onse("200 OK");.
be20: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 44 61 74 65      nOut += Date
be30: 54 61 67 28 22 4c 61 73 74 2d 4d 6f 64 69 66 69  Tag("Last-Modifi
be40: 65 64 22 2c 20 73 74 61 74 62 75 66 2e 73 74 5f  ed", statbuf.st_
be50: 6d 74 69 6d 65 29 3b 0a 20 20 20 20 6e 4f 75 74  mtime);.    nOut
be60: 20 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 74   += printf("Cont
be70: 65 6e 74 2d 74 79 70 65 3a 20 25 73 5c 72 5c 6e  ent-type: %s\r\n
be80: 22 2c 7a 43 6f 6e 74 65 6e 74 54 79 70 65 29 3b  ",zContentType);
be90: 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69  .    nOut += pri
bea0: 6e 74 66 28 22 43 6f 6e 74 65 6e 74 2d 6c 65 6e  ntf("Content-len
beb0: 67 74 68 3a 20 25 64 5c 72 5c 6e 5c 72 5c 6e 22  gth: %d\r\n\r\n"
bec0: 2c 28 69 6e 74 29 73 74 61 74 62 75 66 2e 73 74  ,(int)statbuf.st
bed0: 5f 73 69 7a 65 29 3b 0a 20 20 20 20 66 66 6c 75  _size);.    fflu
bee0: 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20  sh(stdout);.    
bef0: 69 66 28 20 73 74 72 63 6d 70 28 7a 4d 65 74 68  if( strcmp(zMeth
bf00: 6f 64 2c 22 48 45 41 44 22 29 3d 3d 30 20 29 7b  od,"HEAD")==0 ){
bf10: 0a 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e  .      MakeLogEn
bf20: 74 72 79 28 30 29 3b 0a 20 20 20 20 20 20 66 63  try(0);.      fc
bf30: 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20  lose(in);.      
bf40: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
bf50: 20 20 61 6c 61 72 6d 28 33 30 20 2b 20 73 74 61    alarm(30 + sta
bf60: 74 62 75 66 2e 73 74 5f 73 69 7a 65 2f 31 30 30  tbuf.st_size/100
bf70: 30 29 3b 0a 23 69 66 64 65 66 20 6c 69 6e 75 78  0);.#ifdef linux
bf80: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 6f 66 66  .    {.      off
bf90: 5f 74 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20  _t offset = 0;. 
bfa0: 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 73 65 6e       nOut += sen
bfb0: 64 66 69 6c 65 28 66 69 6c 65 6e 6f 28 73 74 64  dfile(fileno(std
bfc0: 6f 75 74 29 2c 20 66 69 6c 65 6e 6f 28 69 6e 29  out), fileno(in)
bfd0: 2c 20 26 6f 66 66 73 65 74 2c 20 73 74 61 74 62  , &offset, statb
bfe0: 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20  uf.st_size);.   
bff0: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 77 68 69   }.#else.    whi
c000: 6c 65 28 20 28 63 20 3d 20 67 65 74 63 28 69 6e  le( (c = getc(in
c010: 29 29 21 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20  ))!=EOF ){.     
c020: 20 70 75 74 63 28 63 2c 73 74 64 6f 75 74 29 3b   putc(c,stdout);
c030: 0a 20 20 20 20 20 20 6e 4f 75 74 2b 2b 3b 0a 20  .      nOut++;. 
c040: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
c050: 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 7d 0a  fclose(in);.  }.
c060: 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29    fflush(stdout)
c070: 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79  ;.  MakeLogEntry
c080: 28 30 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  (0);..  /* The n
c090: 65 78 74 20 72 65 71 75 65 73 74 20 6d 75 73 74  ext request must
c0a0: 20 61 72 72 69 76 65 20 77 69 74 68 69 6e 20 33   arrive within 3
c0b0: 30 20 73 65 63 6f 6e 64 73 20 6f 72 20 77 65 20  0 seconds or we 
c0c0: 63 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65 63  close the connec
c0d0: 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6f 6d 69 74  tion.  */.  omit
c0e0: 4c 6f 67 20 3d 20 31 3b 0a 20 20 61 6c 61 72 6d  Log = 1;.  alarm
c0f0: 28 33 30 29 3b 0a 7d 0a 0a 0a 69 6e 74 20 6d 61  (30);.}...int ma
c100: 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61  in(int argc, cha
c110: 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74  r **argv){.  int
c120: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
c130: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
c140: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 63 68 61 72  ounter */.  char
c150: 20 2a 7a 50 65 72 6d 55 73 65 72 20 3d 20 30 3b   *zPermUser = 0;
c160: 20 20 20 20 20 20 2f 2a 20 52 75 6e 20 64 61 65        /* Run dae
c170: 6d 6f 6e 20 77 69 74 68 20 74 68 69 73 20 75 73  mon with this us
c180: 65 72 27 73 20 70 65 72 6d 69 73 73 69 6f 6e 73  er's permissions
c190: 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64   */..  /* Record
c1a0: 20 74 68 65 20 74 69 6d 65 20 77 68 65 6e 20 70   the time when p
c1b0: 72 6f 63 65 73 73 69 6e 67 20 62 65 67 69 6e 73  rocessing begins
c1c0: 2e 0a 20 20 2a 2f 0a 20 20 74 69 6d 65 28 26 62  ..  */.  time(&b
c1d0: 65 67 69 6e 54 69 6d 65 29 3b 0a 0a 20 20 2f 2a  eginTime);..  /*
c1e0: 20 50 61 72 73 65 20 63 6f 6d 6d 61 6e 64 2d 6c   Parse command-l
c1f0: 69 6e 65 20 61 72 67 75 6d 65 6e 74 73 0a 20 20  ine arguments.  
c200: 2a 2f 0a 20 20 77 68 69 6c 65 28 20 61 72 67 63  */.  while( argc
c210: 3e 32 20 26 26 20 61 72 67 76 5b 31 5d 5b 30 5d  >2 && argv[1][0]
c220: 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 69 66 28  =='-' ){.    if(
c230: 20 73 74 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c   strcmp(argv[1],
c240: 22 2d 75 73 65 72 22 29 3d 3d 30 20 29 7b 0a 20  "-user")==0 ){. 
c250: 20 20 20 20 20 7a 50 65 72 6d 55 73 65 72 20 3d       zPermUser =
c260: 20 61 72 67 76 5b 32 5d 3b 0a 20 20 20 20 20 20   argv[2];.      
c270: 61 72 67 76 20 2b 3d 20 32 3b 0a 20 20 20 20 20  argv += 2;.     
c280: 20 61 72 67 63 20 2d 3d 20 32 3b 0a 20 20 20 20   argc -= 2;.    
c290: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
c2a0: 28 61 72 67 76 5b 31 5d 2c 22 2d 72 6f 6f 74 22  (argv[1],"-root"
c2b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 52  )==0 ){.      zR
c2c0: 6f 6f 74 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20  oot = argv[2];. 
c2d0: 20 20 20 20 20 61 72 67 76 20 2b 3d 20 32 3b 0a       argv += 2;.
c2e0: 20 20 20 20 20 20 61 72 67 63 20 2d 3d 20 32 3b        argc -= 2;
c2f0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
c300: 74 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22 2d  trcmp(argv[1],"-
c310: 6c 6f 67 66 69 6c 65 22 29 3d 3d 30 20 29 7b 0a  logfile")==0 ){.
c320: 20 20 20 20 20 20 7a 4c 6f 67 46 69 6c 65 20 3d        zLogFile =
c330: 20 61 72 67 76 5b 32 5d 3b 0a 20 20 20 20 20 20   argv[2];.      
c340: 61 72 67 76 20 2b 3d 20 32 3b 0a 20 20 20 20 20  argv += 2;.     
c350: 20 61 72 67 63 20 2d 3d 20 32 3b 0a 20 20 20 20   argc -= 2;.    
c360: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
c370: 28 61 72 67 76 5b 31 5d 2c 22 2d 68 74 74 70 73  (argv[1],"-https
c380: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75  ")==0 ){.      u
c390: 73 65 48 74 74 70 73 20 3d 20 61 74 6f 69 28 61  seHttps = atoi(a
c3a0: 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7a  rgv[2]);.      z
c3b0: 48 74 74 70 20 3d 20 75 73 65 48 74 74 70 73 20  Http = useHttps 
c3c0: 3f 20 22 68 74 74 70 22 20 3a 20 22 68 74 74 70  ? "http" : "http
c3d0: 73 22 3b 0a 20 20 20 20 20 20 61 72 67 76 20 2b  s";.      argv +
c3e0: 3d 20 32 3b 0a 20 20 20 20 20 20 61 72 67 63 20  = 2;.      argc 
c3f0: 2d 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  -= 2;.    }else{
c400: 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69  .      Malfuncti
c410: 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 75 6e  on(__LINE__, "un
c420: 6b 6e 6f 77 6e 20 61 72 67 75 6d 65 6e 74 3a 20  known argument: 
c430: 5b 25 73 5d 22 2c 20 61 72 67 76 5b 31 5d 29 3b  [%s]", argv[1]);
c440: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
c450: 20 7a 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20   zRoot==0 ){.   
c460: 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c   Malfunction(__L
c470: 49 4e 45 5f 5f 2c 20 22 6e 6f 20 72 6f 6f 74 20  INE__, "no root 
c480: 64 69 72 65 63 74 6f 72 79 20 73 70 65 63 69 66  directory specif
c490: 69 65 64 22 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  ied");.  }.  .  
c4a0: 2f 2a 20 43 68 61 6e 67 65 20 64 69 72 65 63 74  /* Change direct
c4b0: 6f 72 69 65 73 20 74 6f 20 74 68 65 20 72 6f 6f  ories to the roo
c4c0: 74 20 6f 66 20 74 68 65 20 48 54 54 50 20 66 69  t of the HTTP fi
c4d0: 6c 65 73 79 73 74 65 6d 0a 20 20 2a 2f 0a 20 20  lesystem.  */.  
c4e0: 69 66 28 20 63 68 64 69 72 28 7a 52 6f 6f 74 29  if( chdir(zRoot)
c4f0: 21 3d 30 20 29 7b 0a 20 20 20 20 4d 61 6c 66 75  !=0 ){.    Malfu
c500: 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c  nction(__LINE__,
c510: 20 22 63 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20   "cannot change 
c520: 74 6f 20 64 69 72 65 63 74 6f 72 79 20 5b 25 73  to directory [%s
c530: 5d 22 2c 20 7a 52 6f 6f 74 29 3b 0a 20 20 7d 0a  ]", zRoot);.  }.
c540: 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f  .  /* Attempt to
c550: 20 67 6f 20 69 6e 74 6f 20 61 20 63 68 72 6f 6f   go into a chroo
c560: 74 20 6a 61 69 6c 20 61 73 20 75 73 65 72 20 7a  t jail as user z
c570: 50 65 72 6d 55 73 65 72 0a 20 20 2a 2f 0a 20 20  PermUser.  */.  
c580: 69 66 28 20 7a 50 65 72 6d 55 73 65 72 20 29 7b  if( zPermUser ){
c590: 0a 20 20 20 20 73 74 72 75 63 74 20 70 61 73 73  .    struct pass
c5a0: 77 64 20 2a 70 77 64 20 3d 20 67 65 74 70 77 6e  wd *pwd = getpwn
c5b0: 61 6d 28 7a 50 65 72 6d 55 73 65 72 29 3b 0a 20  am(zPermUser);. 
c5c0: 20 20 20 69 66 28 20 70 77 64 20 29 7b 0a 20 20     if( pwd ){.  
c5d0: 20 20 20 20 69 66 28 20 63 68 72 6f 6f 74 28 22      if( chroot("
c5e0: 2e 22 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  .")<0 ){.       
c5f0: 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c   Malfunction(__L
c600: 49 4e 45 5f 5f 2c 20 22 75 6e 61 62 6c 65 20 74  INE__, "unable t
c610: 6f 20 63 72 65 61 74 65 20 63 68 72 6f 6f 74 20  o create chroot 
c620: 6a 61 69 6c 22 29 3b 0a 20 20 20 20 20 20 7d 0a  jail");.      }.
c630: 20 20 20 20 20 20 73 65 74 67 69 64 28 70 77 64        setgid(pwd
c640: 2d 3e 70 77 5f 67 69 64 29 3b 0a 20 20 20 20 20  ->pw_gid);.     
c650: 20 73 65 74 75 69 64 28 70 77 64 2d 3e 70 77 5f   setuid(pwd->pw_
c660: 75 69 64 29 3b 0a 20 20 20 20 20 20 7a 52 6f 6f  uid);.      zRoo
c670: 74 20 3d 20 22 22 3b 0a 20 20 20 20 7d 65 6c 73  t = "";.    }els
c680: 65 7b 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e 63  e{.      Malfunc
c690: 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22  tion(__LINE__, "
c6a0: 6e 6f 20 68 6f 6d 65 20 64 69 72 65 63 74 6f 72  no home director
c6b0: 79 20 66 6f 72 20 75 73 65 72 20 5b 25 73 5d 22  y for user [%s]"
c6c0: 2c 20 7a 50 65 72 6d 55 73 65 72 29 3b 0a 20 20  , zPermUser);.  
c6d0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 67 65    }.  }.  if( ge
c6e0: 74 75 69 64 28 29 3d 3d 30 20 29 7b 0a 20 20 20  tuid()==0 ){.   
c6f0: 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c   Malfunction(__L
c700: 49 4e 45 5f 5f 2c 20 22 63 61 6e 6e 6f 74 20 72  INE__, "cannot r
c710: 75 6e 20 61 73 20 72 6f 6f 74 22 29 3b 0a 20 20  un as root");.  
c720: 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  }..  /* Get the 
c730: 49 50 20 61 64 64 72 65 73 73 20 66 72 6f 6d 20  IP address from 
c740: 77 68 65 6e 20 74 68 65 20 72 65 71 75 65 73 74  when the request
c750: 20 6f 72 69 67 69 6e 61 74 65 73 0a 20 20 2a 2f   originates.  */
c760: 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20  .  {.    struct 
c770: 73 6f 63 6b 61 64 64 72 5f 69 6e 20 72 65 6d 6f  sockaddr_in remo
c780: 74 65 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20  teName;.    int 
c790: 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 74  size = sizeof(st
c7a0: 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e  ruct sockaddr_in
c7b0: 29 3b 0a 20 20 20 20 69 66 28 20 67 65 74 70 65  );.    if( getpe
c7c0: 65 72 6e 61 6d 65 28 66 69 6c 65 6e 6f 28 73 74  ername(fileno(st
c7d0: 64 69 6e 29 2c 20 28 73 74 72 75 63 74 20 73 6f  din), (struct so
c7e0: 63 6b 61 64 64 72 2a 29 26 72 65 6d 6f 74 65 4e  ckaddr*)&remoteN
c7f0: 61 6d 65 2c 20 26 73 69 7a 65 29 3e 3d 30 20 29  ame, &size)>=0 )
c800: 7b 0a 20 20 20 20 20 20 7a 52 65 6d 6f 74 65 41  {.      zRemoteA
c810: 64 64 72 20 3d 20 53 74 72 44 75 70 28 69 6e 65  ddr = StrDup(ine
c820: 74 5f 6e 74 6f 61 28 72 65 6d 6f 74 65 4e 61 6d  t_ntoa(remoteNam
c830: 65 2e 73 69 6e 5f 61 64 64 72 29 29 3b 0a 20 20  e.sin_addr));.  
c840: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72    }.  }..  /* Pr
c850: 6f 63 65 73 73 20 74 68 65 20 69 6e 70 75 74 20  ocess the input 
c860: 73 74 72 65 61 6d 20 2a 2f 0a 20 20 66 6f 72 28  stream */.  for(
c870: 69 3d 30 3b 20 69 3c 31 30 30 3b 20 69 2b 2b 29  i=0; i<100; i++)
c880: 7b 0a 20 20 20 20 50 72 6f 63 65 73 73 4f 6e 65  {.    ProcessOne
c890: 52 65 71 75 65 73 74 28 30 29 3b 0a 20 20 7d 0a  Request(0);.  }.
c8a0: 20 20 50 72 6f 63 65 73 73 4f 6e 65 52 65 71 75    ProcessOneRequ
c8b0: 65 73 74 28 31 29 3b 0a 20 20 65 78 69 74 28 30  est(1);.  exit(0
c8c0: 29 3b 0a 7d 0a                                   );.}.