Documentation Source Text
Hex Artifact Content
Not logged in

Artifact d53e8146bf7977fea1df95e2e9e194ca55268ce0:


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 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .*/.#include <st
05f0: 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  dio.h>.#include 
0600: 3c 63 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75  <ctype.h>.#inclu
0610: 64 65 20 3c 73 79 73 6c 6f 67 2e 68 3e 0a 23 69  de <syslog.h>.#i
0620: 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68  nclude <stdlib.h
0630: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  >.#include <sys/
0640: 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  stat.h>.#include
0650: 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63   <unistd.h>.#inc
0660: 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23  lude <fcntl.h>.#
0670: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e  include <string.
0680: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 70 77 64  h>.#include <pwd
0690: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
06a0: 73 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75  s/time.h>.#inclu
06b0: 64 65 20 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e  de <sys/types.h>
06c0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73  .#include <sys/s
06d0: 6f 63 6b 65 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ocket.h>.#includ
06e0: 65 20 3c 73 79 73 2f 77 61 69 74 2e 68 3e 0a 23  e <sys/wait.h>.#
06f0: 69 6e 63 6c 75 64 65 20 3c 6e 65 74 69 6e 65 74  include <netinet
0700: 2f 69 6e 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  /in.h>.#include 
0710: 3c 61 72 70 61 2f 69 6e 65 74 2e 68 3e 0a 23 69  <arpa/inet.h>.#i
0720: 6e 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68  nclude <stdarg.h
0730: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65  >.#include <time
0740: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
0750: 73 2f 74 69 6d 65 73 2e 68 3e 0a 23 69 66 64 65  s/times.h>.#ifde
0760: 66 20 6c 69 6e 75 78 0a 23 69 6e 63 6c 75 64 65  f linux.#include
0770: 20 3c 73 79 73 2f 73 65 6e 64 66 69 6c 65 2e 68   <sys/sendfile.h
0780: 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  >.#endif../*.** 
0790: 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20 73 65  Configure the se
07a0: 72 76 65 72 20 62 79 20 73 65 74 74 69 6e 67 20  rver by setting 
07b0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
07c0: 63 72 6f 73 20 61 6e 64 20 72 65 63 6f 6d 70 69  cros and recompi
07d0: 6c 69 6e 67 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ling..*/.#ifndef
07e0: 20 44 45 46 41 55 4c 54 5f 50 4f 52 54 0a 23 64   DEFAULT_PORT.#d
07f0: 65 66 69 6e 65 20 44 45 46 41 55 4c 54 5f 50 4f  efine DEFAULT_PO
0800: 52 54 20 22 38 30 22 0a 23 65 6e 64 69 66 0a 23  RT "80".#endif.#
0810: 69 66 6e 64 65 66 20 4d 41 58 5f 43 4f 4e 54 45  ifndef MAX_CONTE
0820: 4e 54 5f 4c 45 4e 47 54 48 0a 23 64 65 66 69 6e  NT_LENGTH.#defin
0830: 65 20 4d 41 58 5f 43 4f 4e 54 45 4e 54 5f 4c 45  e MAX_CONTENT_LE
0840: 4e 47 54 48 20 39 30 30 30 30 30 30 0a 23 65 6e  NGTH 9000000.#en
0850: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  dif.../*.** The 
0860: 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 66 72 6f  error number fro
0870: 6d 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a  m system calls..
0880: 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 65 72  */.extern int er
0890: 72 6e 6f 3b 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 72  rno;../*.** We r
08a0: 65 63 6f 72 64 20 6d 6f 73 74 20 6f 66 20 74 68  ecord most of th
08b0: 65 20 73 74 61 74 65 20 69 6e 66 6f 72 6d 61 74  e state informat
08c0: 69 6f 6e 20 61 73 20 67 6c 6f 62 61 6c 20 76 61  ion as global va
08d0: 72 69 61 62 6c 65 73 2e 20 20 54 68 69 73 0a 2a  riables.  This.*
08e0: 2a 20 73 61 76 65 73 20 68 61 76 69 6e 67 20 74  * saves having t
08f0: 6f 20 70 61 73 73 20 69 6e 66 6f 72 6d 61 74 69  o pass informati
0900: 6f 6e 20 74 6f 20 73 75 62 72 6f 75 74 69 6e 65  on to subroutine
0910: 73 20 61 73 20 70 61 72 61 6d 65 74 65 72 73 2c  s as parameters,
0920: 20 61 6e 64 0a 2a 2a 20 6d 61 6b 65 73 20 74 68   and.** makes th
0930: 65 20 65 78 65 63 75 74 61 62 6c 65 20 73 6d 61  e executable sma
0940: 6c 6c 65 72 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69  ller....*/.stati
0950: 63 20 63 68 61 72 20 2a 7a 52 6f 6f 74 20 3d 20  c char *zRoot = 
0960: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  0;          /* R
0970: 6f 6f 74 20 64 69 72 65 63 74 6f 72 79 20 6f 66  oot directory of
0980: 20 74 68 65 20 77 65 62 73 69 74 65 20 2a 2f 0a   the website */.
0990: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 54 6d  static char *zTm
09a0: 70 4e 61 6d 20 3d 20 30 3b 20 20 20 20 20 20 20  pNam = 0;       
09b0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 65   /* Name of a te
09c0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a  mporary file */.
09d0: 73 74 61 74 69 63 20 63 68 61 72 20 7a 54 6d 70  static char zTmp
09e0: 4e 61 6d 42 75 66 5b 35 30 30 5d 3b 20 20 20 20  NamBuf[500];    
09f0: 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c   /* Space to hol
0a00: 64 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  d the temporary 
0a10: 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 73 74 61 74  filename */.stat
0a20: 69 63 20 63 68 61 72 20 2a 7a 50 72 6f 74 6f 63  ic char *zProtoc
0a30: 6f 6c 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  ol = 0;      /* 
0a40: 54 68 65 20 70 72 6f 74 6f 63 6f 6c 20 62 65 69  The protocol bei
0a50: 6e 67 20 75 73 69 6e 67 20 62 79 20 74 68 65 20  ng using by the 
0a60: 62 72 6f 77 73 65 72 20 2a 2f 0a 73 74 61 74 69  browser */.stati
0a70: 63 20 63 68 61 72 20 2a 7a 4d 65 74 68 6f 64 20  c char *zMethod 
0a80: 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
0a90: 68 65 20 6d 65 74 68 6f 64 2e 20 20 4d 75 73 74  he method.  Must
0aa0: 20 62 65 20 47 45 54 20 2a 2f 0a 73 74 61 74 69   be GET */.stati
0ab0: 63 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74 20  c char *zScript 
0ac0: 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
0ad0: 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74  he object to ret
0ae0: 72 69 65 76 65 20 2a 2f 0a 73 74 61 74 69 63 20  rieve */.static 
0af0: 63 68 61 72 20 2a 7a 52 65 61 6c 53 63 72 69 70  char *zRealScrip
0b00: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 54 68 65  t = 0;    /* The
0b10: 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74 72 69   object to retri
0b20: 65 76 65 2e 20 20 53 61 6d 65 20 61 73 20 7a 53  eve.  Same as zS
0b30: 63 72 69 70 74 0a 20 20 20 20 20 20 20 20 20 20  cript.          
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 20 20 20 20 20 20 2a 2a 20 65 78 63 65 70 74         ** except
0b60: 20 6d 69 67 68 74 20 68 61 76 65 20 22 2f 69 6e   might have "/in
0b70: 64 65 78 2e 68 74 6d 6c 22 20 61 70 70 65 6e 64  dex.html" append
0b80: 65 64 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  ed */.static cha
0b90: 72 20 2a 7a 48 6f 6d 65 20 3d 20 30 3b 20 20 20  r *zHome = 0;   
0ba0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 69         /* The di
0bb0: 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69  rectory containi
0bc0: 6e 67 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 73 74  ng content */.st
0bd0: 61 74 69 63 20 63 68 61 72 20 2a 7a 51 75 65 72  atic char *zQuer
0be0: 79 53 74 72 69 6e 67 20 3d 20 30 3b 20 20 20 2f  yString = 0;   /
0bf0: 2a 20 54 68 65 20 71 75 65 72 79 20 73 74 72 69  * The query stri
0c00: 6e 67 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66  ng on the end of
0c10: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 73 74 61   the name */.sta
0c20: 74 69 63 20 63 68 61 72 20 2a 7a 46 69 6c 65 20  tic char *zFile 
0c30: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
0c40: 20 54 68 65 20 66 69 6c 65 6e 61 6d 65 20 6f 66   The filename of
0c50: 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 72   the object to r
0c60: 65 74 72 69 65 76 65 20 2a 2f 0a 73 74 61 74 69  etrieve */.stati
0c70: 63 20 69 6e 74 20 6c 65 6e 46 69 6c 65 20 3d 20  c int lenFile = 
0c80: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  0;          /* L
0c90: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a 46 69  ength of the zFi
0ca0: 6c 65 20 6e 61 6d 65 20 2a 2f 0a 73 74 61 74 69  le name */.stati
0cb0: 63 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30  c char *zDir = 0
0cc0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
0cd0: 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63  ame of the direc
0ce0: 74 6f 72 79 20 68 6f 6c 64 69 6e 67 20 7a 46 69  tory holding zFi
0cf0: 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  le */.static cha
0d00: 72 20 2a 7a 50 61 74 68 49 6e 66 6f 20 3d 20 30  r *zPathInfo = 0
0d10: 3b 20 20 20 20 20 20 2f 2a 20 50 61 72 74 20 6f  ;      /* Part o
0d20: 66 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 70  f the pathname p
0d30: 61 73 74 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a  ast the file */.
0d40: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 41 67  static char *zAg
0d50: 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ent = 0;        
0d60: 20 2f 2a 20 57 68 61 74 20 74 79 70 65 20 69 66   /* What type if
0d70: 20 62 72 6f 77 73 65 72 20 69 73 20 6d 61 6b 69   browser is maki
0d80: 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f  ng this query */
0d90: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 53  .static char *zS
0da0: 65 72 76 65 72 4e 61 6d 65 20 3d 20 30 3b 20 20  erverName = 0;  
0db0: 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 61 66    /* The name af
0dc0: 74 65 72 20 74 68 65 20 68 74 74 70 3a 2f 2f 20  ter the http:// 
0dd0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
0de0: 7a 53 65 72 76 65 72 50 6f 72 74 20 3d 20 30 3b  zServerPort = 0;
0df0: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 72 74 20      /* The port 
0e00: 6e 75 6d 62 65 72 20 2a 2f 0a 73 74 61 74 69 63  number */.static
0e10: 20 63 68 61 72 20 2a 7a 43 6f 6f 6b 69 65 20 3d   char *zCookie =
0e20: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f   0;        /* Co
0e30: 6f 6b 69 65 73 20 72 65 70 6f 72 74 65 64 20 77  okies reported w
0e40: 69 74 68 20 74 68 65 20 72 65 71 75 65 73 74 20  ith the request 
0e50: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
0e60: 7a 48 74 74 70 48 6f 73 74 20 3d 20 30 3b 20 20  zHttpHost = 0;  
0e70: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 61 63 63 6f      /* Name acco
0e80: 72 64 69 6e 67 20 74 6f 20 74 68 65 20 77 65 62  rding to the web
0e90: 20 62 72 6f 77 73 65 72 20 2a 2f 0a 73 74 61 74   browser */.stat
0ea0: 69 63 20 63 68 61 72 20 2a 7a 52 65 61 6c 50 6f  ic char *zRealPo
0eb0: 72 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  rt = 0;      /* 
0ec0: 54 68 65 20 72 65 61 6c 20 54 43 50 20 70 6f 72  The real TCP por
0ed0: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 61  t when running a
0ee0: 73 20 64 61 65 6d 6f 6e 20 2a 2f 0a 73 74 61 74  s daemon */.stat
0ef0: 69 63 20 63 68 61 72 20 2a 7a 52 65 6d 6f 74 65  ic char *zRemote
0f00: 41 64 64 72 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Addr = 0;    /* 
0f10: 49 50 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  IP address of th
0f20: 65 20 72 65 71 75 65 73 74 20 2a 2f 0a 73 74 61  e request */.sta
0f30: 74 69 63 20 63 68 61 72 20 2a 7a 52 65 66 65 72  tic char *zRefer
0f40: 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
0f50: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 61 67   Name of the pag
0f60: 65 20 74 68 61 74 20 72 65 66 65 72 65 64 20 74  e that refered t
0f70: 6f 20 75 73 20 2a 2f 0a 73 74 61 74 69 63 20 63  o us */.static c
0f80: 68 61 72 20 2a 7a 41 63 63 65 70 74 20 3d 20 30  har *zAccept = 0
0f90: 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74  ;        /* What
0fa0: 20 66 6f 72 6d 61 74 73 20 77 69 6c 6c 20 62 65   formats will be
0fb0: 20 61 63 63 65 70 74 65 64 20 2a 2f 0a 73 74 61   accepted */.sta
0fc0: 74 69 63 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65  tic char *zConte
0fd0: 6e 74 4c 65 6e 67 74 68 20 3d 20 30 3b 20 2f 2a  ntLength = 0; /*
0fe0: 20 43 6f 6e 74 65 6e 74 20 6c 65 6e 67 74 68 20   Content length 
0ff0: 72 65 70 6f 72 74 65 64 20 69 6e 20 74 68 65 20  reported in the 
1000: 68 65 61 64 65 72 20 2a 2f 0a 73 74 61 74 69 63  header */.static
1010: 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 54   char *zContentT
1020: 79 70 65 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f  ype = 0;   /* Co
1030: 6e 74 65 6e 74 20 74 79 70 65 20 72 65 70 6f 72  ntent type repor
1040: 74 65 64 20 69 6e 20 74 68 65 20 68 65 61 64 65  ted in the heade
1050: 72 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  r */.static char
1060: 20 2a 7a 51 75 65 72 79 53 75 66 66 69 78 20 3d   *zQuerySuffix =
1070: 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 72   0;   /* The par
1080: 74 20 6f 66 20 74 68 65 20 55 52 4c 20 61 66 74  t of the URL aft
1090: 65 72 20 74 68 65 20 66 69 72 73 74 20 3f 20 2a  er the first ? *
10a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 49 6e  /.static int nIn
10b0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10d0: 62 79 74 65 73 20 6f 66 20 69 6e 70 75 74 20 2a  bytes of input *
10e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 4f 75  /.static int nOu
10f0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
1100: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1110: 62 79 74 65 73 20 6f 66 20 6f 75 74 70 75 74 20  bytes of output 
1120: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a  */.static char z
1130: 52 65 70 6c 79 53 74 61 74 75 73 5b 34 5d 3b 20  ReplyStatus[4]; 
1140: 20 20 20 20 2f 2a 20 52 65 70 6c 79 20 73 74 61      /* Reply sta
1150: 74 75 73 20 63 6f 64 65 20 2a 2f 0a 73 74 61 74  tus code */.stat
1160: 69 63 20 69 6e 74 20 73 74 61 74 75 73 53 65 6e  ic int statusSen
1170: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  t = 0;       /* 
1180: 54 72 75 65 20 61 66 74 65 72 20 73 74 61 74 75  True after statu
1190: 73 20 6c 69 6e 65 20 69 73 20 73 65 6e 74 20 2a  s line is sent *
11a0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a  /.static char *z
11b0: 4c 6f 67 46 69 6c 65 20 3d 20 30 3b 20 20 20 20  LogFile = 0;    
11c0: 20 20 20 2f 2a 20 4c 6f 67 20 74 6f 20 74 68 69     /* Log to thi
11d0: 73 20 66 69 6c 65 20 2a 2f 0a 73 74 61 74 69 63  s file */.static
11e0: 20 69 6e 74 20 64 65 62 75 67 46 6c 61 67 20 3d   int debugFlag =
11f0: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
1200: 75 65 20 69 66 20 62 65 69 6e 67 20 64 65 62 75  ue if being debu
1210: 67 67 65 64 20 2a 2f 0a 73 74 61 74 69 63 20 74  gged */.static t
1220: 69 6d 65 5f 74 20 62 65 67 69 6e 54 69 6d 65 3b  ime_t beginTime;
1230: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 69 6d 65           /* Time
1240: 20 77 68 65 6e 20 74 68 69 73 20 70 72 6f 63 65   when this proce
1250: 73 73 20 73 74 61 72 74 73 20 2a 2f 0a 73 74 61  ss starts */.sta
1260: 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 43 6f 6e  tic int closeCon
1270: 6e 65 63 74 69 6f 6e 20 3d 20 30 3b 20 20 2f 2a  nection = 0;  /*
1280: 20 54 72 75 65 20 74 6f 20 73 65 6e 64 20 43 6f   True to send Co
1290: 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f 73 65 20  nnection: close 
12a0: 69 6e 20 72 65 70 6c 79 20 2a 2f 0a 73 74 61 74  in reply */.stat
12b0: 69 63 20 69 6e 74 20 6e 52 65 71 75 65 73 74 20  ic int nRequest 
12c0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
12d0: 4e 75 6d 62 65 72 20 6f 66 20 72 65 71 75 65 73  Number of reques
12e0: 74 73 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  ts processed */.
12f0: 73 74 61 74 69 63 20 69 6e 74 20 6f 6d 69 74 4c  static int omitL
1300: 6f 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  og = 0;         
1310: 20 2f 2a 20 44 6f 20 6e 6f 74 20 6d 61 6b 65 20   /* Do not make 
1320: 6c 6f 67 66 69 6c 65 20 65 6e 74 72 69 65 73 20  logfile entries 
1330: 69 66 20 74 72 75 65 20 2a 2f 0a 73 74 61 74 69  if true */.stati
1340: 63 20 69 6e 74 20 75 73 65 48 74 74 70 73 20 3d  c int useHttps =
1350: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   0;         /* T
1360: 72 75 65 20 74 6f 20 75 73 65 20 48 54 54 50 53  rue to use HTTPS
1370: 3a 20 69 6e 73 74 65 61 64 20 6f 66 20 48 54 54  : instead of HTT
1380: 50 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  P: */.static cha
1390: 72 20 2a 7a 48 74 74 70 20 3d 20 22 68 74 74 70  r *zHttp = "http
13a0: 22 3b 20 20 20 20 20 2f 2a 20 68 74 74 70 20 6f  ";     /* http o
13b0: 72 20 68 74 74 70 73 20 2a 2f 0a 0a 2f 2a 0a 2a  r https */../*.*
13c0: 2a 20 43 68 61 6e 67 65 20 65 76 65 72 79 20 73  * Change every s
13d0: 70 61 63 65 20 6f 72 20 75 6e 70 72 69 6e 74 61  pace or unprinta
13e0: 62 6c 65 20 63 68 61 72 61 63 74 65 72 20 69 6e  ble character in
13f0: 20 74 68 65 20 7a 41 67 65 6e 74 5b 5d 20 73 74   the zAgent[] st
1400: 72 69 6e 67 0a 2a 2a 20 69 6e 74 6f 20 61 6e 20  ring.** into an 
1410: 5f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  _..**.** If the 
1420: 75 73 65 72 20 61 67 65 6e 74 20 73 74 72 69 6e  user agent strin
1430: 67 20 63 6f 6e 74 61 69 6e 73 20 63 65 72 74 61  g contains certa
1440: 69 6e 20 70 72 6f 68 69 62 69 74 65 64 20 73 74  in prohibited st
1450: 72 69 6e 67 2c 20 74 68 65 6e 0a 2a 2a 20 65 78  ring, then.** ex
1460: 69 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  it immediately..
1470: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 46  */.static void F
1480: 69 78 75 70 55 73 65 72 41 67 65 6e 74 28 76 6f  ixupUserAgent(vo
1490: 69 64 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  id){.  int i;.  
14a0: 69 66 28 20 7a 41 67 65 6e 74 3d 3d 30 20 7c 7c  if( zAgent==0 ||
14b0: 20 7a 41 67 65 6e 74 5b 30 5d 3d 3d 30 20 29 20   zAgent[0]==0 ) 
14c0: 7a 41 67 65 6e 74 20 3d 20 22 2a 22 3b 0a 20 20  zAgent = "*";.  
14d0: 66 6f 72 28 69 3d 30 3b 20 7a 41 67 65 6e 74 5b  for(i=0; zAgent[
14e0: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  i]; i++){.    in
14f0: 74 20 63 20 3d 20 7a 41 67 65 6e 74 5b 69 5d 3b  t c = zAgent[i];
1500: 0a 20 20 20 20 69 66 28 20 63 3c 27 21 27 20 7c  .    if( c<'!' |
1510: 7c 20 63 3e 27 7e 27 20 20 29 7b 20 7a 41 67 65  | c>'~'  ){ zAge
1520: 6e 74 5b 69 5d 20 3d 20 27 5f 27 3b 20 7d 0a 20  nt[i] = '_'; }. 
1530: 20 7d 0a 23 69 66 20 30 0a 20 20 69 66 28 20 73   }.#if 0.  if( s
1540: 74 72 6e 63 6d 70 28 7a 41 67 65 6e 74 2c 22 6d  trncmp(zAgent,"m
1550: 73 6e 62 6f 74 22 2c 36 29 3d 3d 30 20 29 7b 0a  snbot",6)==0 ){.
1560: 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20 7d      exit(0);.  }
1570: 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d  .#endif.  for(i=
1580: 30 3b 20 7a 41 67 65 6e 74 5b 69 5d 3b 20 69 2b  0; zAgent[i]; i+
1590: 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 41 67 65  +){.    if( zAge
15a0: 6e 74 5b 69 5d 3d 3d 27 57 27 20 26 26 20 73 74  nt[i]=='W' && st
15b0: 72 6e 63 6d 70 28 26 7a 41 67 65 6e 74 5b 69 5d  rncmp(&zAgent[i]
15c0: 2c 22 57 69 6e 64 6f 77 73 5f 39 22 2c 39 29 3d  ,"Windows_9",9)=
15d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 65 78 69 74  =0 ){.      exit
15e0: 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  (0);.    }.  }.}
15f0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 6e 20  ../*.** Make an 
1600: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6c 6f 67  entry in the log
1610: 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 20 48   file.  If the H
1620: 54 54 50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  TTP connection s
1630: 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 63 6c 6f 73  hould be.** clos
1640: 65 64 2c 20 74 68 65 6e 20 74 65 72 6d 69 6e 61  ed, then termina
1650: 74 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  te this process.
1660: 20 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75    Otherwise retu
1670: 72 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rn..*/.static vo
1680: 69 64 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28  id MakeLogEntry(
1690: 69 6e 74 20 61 29 7b 0a 20 20 46 49 4c 45 20 2a  int a){.  FILE *
16a0: 6c 6f 67 3b 0a 20 20 69 66 28 20 7a 54 6d 70 4e  log;.  if( zTmpN
16b0: 61 6d 20 29 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b  am ){.    unlink
16c0: 28 7a 54 6d 70 4e 61 6d 29 3b 0a 20 20 7d 0a 20  (zTmpNam);.  }. 
16d0: 20 69 66 28 20 7a 4c 6f 67 46 69 6c 65 20 26 26   if( zLogFile &&
16e0: 20 21 6f 6d 69 74 4c 6f 67 20 29 7b 0a 20 20 20   !omitLog ){.   
16f0: 20 74 69 6d 65 5f 74 20 6e 6f 77 3b 0a 20 20 20   time_t now;.   
1700: 20 73 74 72 75 63 74 20 74 6d 20 2a 70 54 6d 3b   struct tm *pTm;
1710: 0a 20 20 20 20 73 74 72 75 63 74 20 74 6d 73 20  .    struct tms 
1720: 73 54 6d 73 3b 0a 20 20 20 20 64 6f 75 62 6c 65  sTms;.    double
1730: 20 72 53 63 61 6c 65 3b 0a 20 20 20 20 69 6e 74   rScale;.    int
1740: 20 69 3b 0a 20 20 20 20 63 68 61 72 20 7a 44 61   i;.    char zDa
1750: 74 65 5b 32 30 30 5d 3b 0a 0a 20 20 20 20 69 66  te[200];..    if
1760: 28 20 7a 53 63 72 69 70 74 3d 3d 30 20 7c 7c 20  ( zScript==0 || 
1770: 7a 53 63 72 69 70 74 5b 30 5d 3d 3d 30 20 29 20  zScript[0]==0 ) 
1780: 7a 53 63 72 69 70 74 20 3d 20 22 2a 22 3b 0a 20  zScript = "*";. 
1790: 20 20 20 69 66 28 20 7a 52 65 6d 6f 74 65 41 64     if( zRemoteAd
17a0: 64 72 3d 3d 30 20 7c 7c 20 7a 52 65 6d 6f 74 65  dr==0 || zRemote
17b0: 41 64 64 72 5b 30 5d 3d 3d 30 20 29 20 7a 52 65  Addr[0]==0 ) zRe
17c0: 6d 6f 74 65 41 64 64 72 20 3d 20 22 2a 22 3b 0a  moteAddr = "*";.
17d0: 20 20 20 20 69 66 28 20 7a 48 74 74 70 48 6f 73      if( zHttpHos
17e0: 74 3d 3d 30 20 7c 7c 20 7a 48 74 74 70 48 6f 73  t==0 || zHttpHos
17f0: 74 5b 30 5d 3d 3d 30 20 29 20 7a 48 74 74 70 48  t[0]==0 ) zHttpH
1800: 6f 73 74 20 3d 20 22 2a 22 3b 0a 20 20 20 20 69  ost = "*";.    i
1810: 66 28 20 7a 52 65 66 65 72 65 72 3d 3d 30 20 7c  f( zReferer==0 |
1820: 7c 20 7a 52 65 66 65 72 65 72 5b 30 5d 3d 3d 30  | zReferer[0]==0
1830: 20 29 20 7a 52 65 66 65 72 65 72 20 3d 20 22 2a   ) zReferer = "*
1840: 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ";.    for(i=0; 
1850: 7a 52 65 66 65 72 65 72 5b 69 5d 3b 20 69 2b 2b  zReferer[i]; i++
1860: 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 69 73  ){ .      if( is
1870: 73 70 61 63 65 28 7a 52 65 66 65 72 65 72 5b 69  space(zReferer[i
1880: 5d 29 20 29 7b 20 7a 52 65 66 65 72 65 72 20 3d  ]) ){ zReferer =
1890: 20 22 2a 22 3b 20 62 72 65 61 6b 3b 20 7d 0a 20   "*"; break; }. 
18a0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 41 67     }.    if( zAg
18b0: 65 6e 74 3d 3d 30 20 7c 7c 20 7a 41 67 65 6e 74  ent==0 || zAgent
18c0: 5b 30 5d 3d 3d 30 20 29 20 7a 41 67 65 6e 74 20  [0]==0 ) zAgent 
18d0: 3d 20 22 2a 22 3b 0a 20 20 20 20 74 69 6d 65 28  = "*";.    time(
18e0: 26 6e 6f 77 29 3b 0a 20 20 20 20 70 54 6d 20 3d  &now);.    pTm =
18f0: 20 6c 6f 63 61 6c 74 69 6d 65 28 26 6e 6f 77 29   localtime(&now)
1900: 3b 0a 20 20 20 20 73 74 72 66 74 69 6d 65 28 7a  ;.    strftime(z
1910: 44 61 74 65 2c 20 73 69 7a 65 6f 66 28 7a 44 61  Date, sizeof(zDa
1920: 74 65 29 2c 20 22 25 59 2d 25 6d 2d 25 64 20 25  te), "%Y-%m-%d %
1930: 48 3a 25 4d 3a 25 53 22 2c 20 70 54 6d 29 3b 0a  H:%M:%S", pTm);.
1940: 20 20 20 20 74 69 6d 65 73 28 26 73 54 6d 73 29      times(&sTms)
1950: 3b 0a 20 20 20 20 72 53 63 61 6c 65 20 3d 20 31  ;.    rScale = 1
1960: 2e 30 2f 28 64 6f 75 62 6c 65 29 73 79 73 63 6f  .0/(double)sysco
1970: 6e 66 28 5f 53 43 5f 43 4c 4b 5f 54 43 4b 29 3b  nf(_SC_CLK_TCK);
1980: 0a 20 20 20 20 63 68 64 69 72 28 7a 52 6f 6f 74  .    chdir(zRoot
1990: 5b 30 5d 20 3f 20 7a 52 6f 6f 74 20 3a 20 22 2f  [0] ? zRoot : "/
19a0: 22 29 3b 0a 20 20 20 20 69 66 28 20 28 6c 6f 67  ");.    if( (log
19b0: 20 3d 20 66 6f 70 65 6e 28 7a 4c 6f 67 46 69 6c   = fopen(zLogFil
19c0: 65 2c 22 61 22 29 29 21 3d 30 20 29 7b 0a 20 20  e,"a"))!=0 ){.  
19d0: 20 20 20 20 66 70 72 69 6e 74 66 28 6c 6f 67 2c      fprintf(log,
19e0: 20 22 25 73 20 25 73 20 25 73 3a 2f 2f 25 73 25   "%s %s %s://%s%
19f0: 73 20 25 73 20 25 73 20 25 64 20 25 64 20 25 67  s %s %s %d %d %g
1a00: 20 25 67 20 25 67 20 25 67 20 25 64 20 25 64 20   %g %g %g %d %d 
1a10: 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  %s\n", .        
1a20: 20 20 7a 44 61 74 65 2c 20 7a 52 65 6d 6f 74 65    zDate, zRemote
1a30: 41 64 64 72 2c 20 7a 48 74 74 70 2c 20 7a 48 74  Addr, zHttp, zHt
1a40: 74 70 48 6f 73 74 2c 20 7a 53 63 72 69 70 74 2c  tpHost, zScript,
1a50: 20 7a 52 65 66 65 72 65 72 2c 0a 20 20 20 20 20   zReferer,.     
1a60: 20 20 20 20 20 7a 52 65 70 6c 79 53 74 61 74 75       zReplyStatu
1a70: 73 2c 20 6e 49 6e 2c 20 6e 4f 75 74 2c 0a 20 20  s, nIn, nOut,.  
1a80: 20 20 20 20 20 20 20 20 72 53 63 61 6c 65 2a 73          rScale*s
1a90: 54 6d 73 2e 74 6d 73 5f 75 74 69 6d 65 2c 0a 20  Tms.tms_utime,. 
1aa0: 20 20 20 20 20 20 20 20 20 72 53 63 61 6c 65 2a           rScale*
1ab0: 73 54 6d 73 2e 74 6d 73 5f 73 74 69 6d 65 2c 0a  sTms.tms_stime,.
1ac0: 20 20 20 20 20 20 20 20 20 20 72 53 63 61 6c 65            rScale
1ad0: 2a 73 54 6d 73 2e 74 6d 73 5f 63 75 74 69 6d 65  *sTms.tms_cutime
1ae0: 2c 0a 20 20 20 20 20 20 20 20 20 20 72 53 63 61  ,.          rSca
1af0: 6c 65 2a 73 54 6d 73 2e 74 6d 73 5f 63 73 74 69  le*sTms.tms_csti
1b00: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 28 69  me,.          (i
1b10: 6e 74 29 28 6e 6f 77 20 2d 20 62 65 67 69 6e 54  nt)(now - beginT
1b20: 69 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ime),.          
1b30: 6e 52 65 71 75 65 73 74 2c 20 7a 41 67 65 6e 74  nRequest, zAgent
1b40: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
1b50: 66 63 6c 6f 73 65 28 6c 6f 67 29 3b 0a 20 20 20  fclose(log);.   
1b60: 20 20 20 6e 49 6e 20 3d 20 6e 4f 75 74 20 3d 20     nIn = nOut = 
1b70: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  0;.    }.  }.  i
1b80: 66 28 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69  f( closeConnecti
1b90: 6f 6e 20 29 7b 0a 20 20 20 20 65 78 69 74 28 61  on ){.    exit(a
1ba0: 29 3b 0a 20 20 7d 0a 20 20 73 74 61 74 75 73 53  );.  }.  statusS
1bb0: 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ent = 0;.}../*.*
1bc0: 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
1bd0: 79 20 73 61 66 65 6c 79 0a 2a 2f 0a 73 74 61 74  y safely.*/.stat
1be0: 69 63 20 63 68 61 72 20 2a 53 61 66 65 4d 61 6c  ic char *SafeMal
1bf0: 6c 6f 63 28 20 69 6e 74 20 73 69 7a 65 20 29 7b  loc( int size ){
1c00: 0a 20 20 63 68 61 72 20 2a 70 3b 0a 0a 20 20 70  .  char *p;..  p
1c10: 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63   = (char*)malloc
1c20: 28 73 69 7a 65 29 3b 0a 20 20 69 66 28 20 70 3d  (size);.  if( p=
1c30: 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 63 70 79  =0 ){.    strcpy
1c40: 28 7a 52 65 70 6c 79 53 74 61 74 75 73 2c 20 22  (zReplyStatus, "
1c50: 39 39 38 22 29 3b 0a 20 20 20 20 4d 61 6b 65 4c  998");.    MakeL
1c60: 6f 67 45 6e 74 72 79 28 31 29 3b 0a 20 20 20 20  ogEntry(1);.    
1c70: 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 72  exit(1);.  }.  r
1c80: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
1c90: 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20  * Set the value 
1ca0: 6f 66 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  of environment v
1cb0: 61 72 69 61 62 6c 65 20 7a 56 61 72 20 74 6f 20  ariable zVar to 
1cc0: 7a 56 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69  zValue..*/.stati
1cd0: 63 20 76 6f 69 64 20 53 65 74 45 6e 76 28 63 6f  c void SetEnv(co
1ce0: 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 72 2c 20  nst char *zVar, 
1cf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c  const char *zVal
1d00: 75 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  ue){.  char *z;.
1d10: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 66 28    int len;.  if(
1d20: 20 7a 56 61 6c 75 65 3d 3d 30 20 29 20 7a 56 61   zValue==0 ) zVa
1d30: 6c 75 65 3d 22 22 3b 0a 20 20 6c 65 6e 20 3d 20  lue="";.  len = 
1d40: 73 74 72 6c 65 6e 28 7a 56 61 72 29 20 2b 20 73  strlen(zVar) + s
1d50: 74 72 6c 65 6e 28 7a 56 61 6c 75 65 29 20 2b 20  trlen(zValue) + 
1d60: 32 3b 0a 20 20 7a 20 3d 20 53 61 66 65 4d 61 6c  2;.  z = SafeMal
1d70: 6c 6f 63 28 6c 65 6e 29 3b 0a 20 20 73 70 72 69  loc(len);.  spri
1d80: 6e 74 66 28 7a 2c 22 25 73 3d 25 73 22 2c 7a 56  ntf(z,"%s=%s",zV
1d90: 61 72 2c 7a 56 61 6c 75 65 29 3b 0a 20 20 70 75  ar,zValue);.  pu
1da0: 74 65 6e 76 28 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  tenv(z);.}../*.*
1db0: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 66 69 72  * Remove the fir
1dc0: 73 74 20 73 70 61 63 65 2d 64 65 6c 69 6d 69 74  st space-delimit
1dd0: 65 64 20 74 6f 6b 65 6e 20 66 72 6f 6d 20 61 20  ed token from a 
1de0: 73 74 72 69 6e 67 20 61 6e 64 20 72 65 74 75 72  string and retur
1df0: 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
1e00: 6f 20 69 74 2e 20 20 41 64 64 20 61 20 4e 55 4c  o it.  Add a NUL
1e10: 4c 20 74 6f 20 74 68 65 20 73 74 72 69 6e 67 20  L to the string 
1e20: 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
1e30: 20 74 6f 6b 65 6e 2e 0a 2a 2a 20 4d 61 6b 65 20   token..** Make 
1e40: 2a 7a 4c 65 66 74 4f 76 65 72 20 70 6f 69 6e 74  *zLeftOver point
1e50: 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
1e60: 20 74 68 65 20 6e 65 78 74 20 74 6f 6b 65 6e 2e   the next token.
1e70: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
1e80: 2a 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74  *GetFirstElement
1e90: 28 63 68 61 72 20 2a 7a 49 6e 70 75 74 2c 20 63  (char *zInput, c
1ea0: 68 61 72 20 2a 2a 7a 4c 65 66 74 4f 76 65 72 29  har **zLeftOver)
1eb0: 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65 73 75 6c  {.  char *zResul
1ec0: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 49 6e  t = 0;.  if( zIn
1ed0: 70 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  put==0 ){.    if
1ee0: 28 20 7a 4c 65 66 74 4f 76 65 72 20 29 20 2a 7a  ( zLeftOver ) *z
1ef0: 4c 65 66 74 4f 76 65 72 20 3d 20 30 3b 0a 20 20  LeftOver = 0;.  
1f00: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1f10: 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65    while( isspace
1f20: 28 2a 7a 49 6e 70 75 74 29 20 29 7b 20 7a 49 6e  (*zInput) ){ zIn
1f30: 70 75 74 2b 2b 3b 20 7d 0a 20 20 7a 52 65 73 75  put++; }.  zResu
1f40: 6c 74 20 3d 20 7a 49 6e 70 75 74 3b 0a 20 20 77  lt = zInput;.  w
1f50: 68 69 6c 65 28 20 2a 7a 49 6e 70 75 74 20 26 26  hile( *zInput &&
1f60: 20 21 69 73 73 70 61 63 65 28 2a 7a 49 6e 70 75   !isspace(*zInpu
1f70: 74 29 20 29 7b 20 7a 49 6e 70 75 74 2b 2b 3b 20  t) ){ zInput++; 
1f80: 7d 0a 20 20 69 66 28 20 2a 7a 49 6e 70 75 74 20  }.  if( *zInput 
1f90: 29 7b 0a 20 20 20 20 2a 7a 49 6e 70 75 74 20 3d  ){.    *zInput =
1fa0: 20 30 3b 0a 20 20 20 20 7a 49 6e 70 75 74 2b 2b   0;.    zInput++
1fb0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73 73  ;.    while( iss
1fc0: 70 61 63 65 28 2a 7a 49 6e 70 75 74 29 20 29 7b  pace(*zInput) ){
1fd0: 20 7a 49 6e 70 75 74 2b 2b 3b 20 7d 0a 20 20 7d   zInput++; }.  }
1fe0: 0a 20 20 69 66 28 20 7a 4c 65 66 74 4f 76 65 72  .  if( zLeftOver
1ff0: 20 29 7b 20 2a 7a 4c 65 66 74 4f 76 65 72 20 3d   ){ *zLeftOver =
2000: 20 7a 49 6e 70 75 74 3b 20 7d 0a 20 20 72 65 74   zInput; }.  ret
2010: 75 72 6e 20 7a 52 65 73 75 6c 74 3b 0a 7d 0a 0a  urn zResult;.}..
2020: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 63 6f 70  /*.** Make a cop
2030: 79 20 6f 66 20 61 20 73 74 72 69 6e 67 20 69 6e  y of a string in
2040: 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
2050: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a  ed from malloc..
2060: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
2070: 53 74 72 44 75 70 28 63 6f 6e 73 74 20 63 68 61  StrDup(const cha
2080: 72 20 2a 7a 53 72 63 29 7b 0a 20 20 63 68 61 72  r *zSrc){.  char
2090: 20 2a 7a 44 65 73 74 3b 0a 20 20 69 6e 74 20 73   *zDest;.  int s
20a0: 69 7a 65 3b 0a 0a 20 20 69 66 28 20 7a 53 72 63  ize;..  if( zSrc
20b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
20c0: 20 20 73 69 7a 65 20 3d 20 73 74 72 6c 65 6e 28    size = strlen(
20d0: 7a 53 72 63 29 20 2b 20 31 3b 0a 20 20 7a 44 65  zSrc) + 1;.  zDe
20e0: 73 74 20 3d 20 28 63 68 61 72 2a 29 53 61 66 65  st = (char*)Safe
20f0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 20 29 3b 0a  Malloc( size );.
2100: 20 20 73 74 72 63 70 79 28 7a 44 65 73 74 2c 7a    strcpy(zDest,z
2110: 53 72 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  Src);.  return z
2120: 44 65 73 74 3b 0a 7d 0a 73 74 61 74 69 63 20 63  Dest;.}.static c
2130: 68 61 72 20 2a 53 74 72 41 70 70 65 6e 64 28 63  har *StrAppend(c
2140: 68 61 72 20 2a 7a 50 72 69 6f 72 2c 20 63 6f 6e  har *zPrior, con
2150: 73 74 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 63  st char *zSep, c
2160: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63 29  onst char *zSrc)
2170: 7b 0a 20 20 63 68 61 72 20 2a 7a 44 65 73 74 3b  {.  char *zDest;
2180: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 69  .  int size;.  i
2190: 6e 74 20 6e 31 2c 20 6e 32 3b 0a 0a 20 20 69 66  nt n1, n2;..  if
21a0: 28 20 7a 53 72 63 3d 3d 30 20 29 20 72 65 74 75  ( zSrc==0 ) retu
21b0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 7a 50 72 69  rn 0;.  if( zPri
21c0: 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  or==0 ) return S
21d0: 74 72 44 75 70 28 7a 53 72 63 29 3b 0a 20 20 73  trDup(zSrc);.  s
21e0: 69 7a 65 20 3d 20 28 6e 31 3d 73 74 72 6c 65 6e  ize = (n1=strlen
21f0: 28 7a 53 72 63 29 29 20 2b 20 28 6e 32 3d 73 74  (zSrc)) + (n2=st
2200: 72 6c 65 6e 28 7a 53 65 70 29 29 20 2b 20 73 74  rlen(zSep)) + st
2210: 72 6c 65 6e 28 7a 50 72 69 6f 72 29 20 2b 20 31  rlen(zPrior) + 1
2220: 3b 0a 20 20 7a 44 65 73 74 20 3d 20 28 63 68 61  ;.  zDest = (cha
2230: 72 2a 29 53 61 66 65 4d 61 6c 6c 6f 63 28 20 73  r*)SafeMalloc( s
2240: 69 7a 65 20 29 3b 0a 20 20 73 74 72 63 70 79 28  ize );.  strcpy(
2250: 7a 44 65 73 74 2c 7a 50 72 69 6f 72 29 3b 0a 20  zDest,zPrior);. 
2260: 20 66 72 65 65 28 7a 50 72 69 6f 72 29 3b 0a 20   free(zPrior);. 
2270: 20 73 74 72 63 70 79 28 26 7a 44 65 73 74 5b 6e   strcpy(&zDest[n
2280: 31 5d 2c 7a 53 65 70 29 3b 0a 20 20 73 74 72 63  1],zSep);.  strc
2290: 70 79 28 26 7a 44 65 73 74 5b 6e 31 2b 6e 32 5d  py(&zDest[n1+n2]
22a0: 2c 7a 53 72 63 29 3b 0a 20 20 72 65 74 75 72 6e  ,zSrc);.  return
22b0: 20 7a 44 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zDest;.}../*.**
22c0: 20 42 72 65 61 6b 20 61 20 6c 69 6e 65 20 61 74   Break a line at
22d0: 20 74 68 65 20 66 69 72 73 74 20 5c 6e 20 6f 72   the first \n or
22e0: 20 5c 72 20 63 68 61 72 61 63 74 65 72 20 73 65   \r character se
22f0: 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  en..*/.static vo
2300: 69 64 20 52 65 6d 6f 76 65 4e 65 77 6c 69 6e 65  id RemoveNewline
2310: 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28  (char *z){.  if(
2320: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
2330: 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 2a    while( *z && *
2340: 7a 21 3d 27 5c 6e 27 20 26 26 20 2a 7a 21 3d 27  z!='\n' && *z!='
2350: 5c 72 27 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20  \r' ){ z++; }.  
2360: 2a 7a 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  *z = 0;.}../*.**
2370: 20 50 72 69 6e 74 20 61 20 64 61 74 65 20 74 61   Print a date ta
2380: 67 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  g in the header.
2390: 20 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68    The name of th
23a0: 65 20 74 61 67 20 69 73 20 7a 54 61 67 2e 0a 2a  e tag is zTag..*
23b0: 2a 20 54 68 65 20 64 61 74 65 20 69 73 20 64 65  * The date is de
23c0: 74 65 72 6d 69 6e 65 64 20 66 72 6f 6d 20 74 68  termined from th
23d0: 65 20 75 6e 69 78 20 74 69 6d 65 73 74 61 6d 70  e unix timestamp
23e0: 20 67 69 76 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69   given..*/.stati
23f0: 63 20 69 6e 74 20 44 61 74 65 54 61 67 28 63 6f  c int DateTag(co
2400: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 67 2c 20  nst char *zTag, 
2410: 74 69 6d 65 5f 74 20 74 29 7b 0a 20 20 73 74 72  time_t t){.  str
2420: 75 63 74 20 74 6d 20 2a 74 6d 3b 0a 20 20 63 68  uct tm *tm;.  ch
2430: 61 72 20 7a 44 61 74 65 5b 31 30 30 5d 3b 0a 20  ar zDate[100];. 
2440: 20 74 6d 20 3d 20 67 6d 74 69 6d 65 28 26 74 29   tm = gmtime(&t)
2450: 3b 0a 20 20 73 74 72 66 74 69 6d 65 28 7a 44 61  ;.  strftime(zDa
2460: 74 65 2c 20 73 69 7a 65 6f 66 28 7a 44 61 74 65  te, sizeof(zDate
2470: 29 2c 20 22 25 61 2c 20 25 64 20 20 25 62 20 25  ), "%a, %d  %b %
2480: 59 20 25 48 3a 25 4d 3a 25 53 20 25 7a 22 2c 20  Y %H:%M:%S %z", 
2490: 74 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 72  tm);.  return pr
24a0: 69 6e 74 66 28 22 25 73 3a 20 25 73 5c 72 5c 6e  intf("%s: %s\r\n
24b0: 22 2c 20 7a 54 61 67 2c 20 7a 44 61 74 65 29 3b  ", zTag, zDate);
24c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  .}../*.** Print 
24d0: 74 68 65 20 66 69 72 73 74 20 6c 69 6e 65 20 6f  the first line o
24e0: 66 20 61 20 72 65 73 70 6f 6e 73 65 20 66 6f 6c  f a response fol
24f0: 6c 6f 77 65 64 20 62 79 20 74 68 65 20 73 65 72  lowed by the ser
2500: 76 65 72 20 74 79 70 65 2e 0a 2a 2f 0a 73 74 61  ver type..*/.sta
2510: 74 69 63 20 76 6f 69 64 20 53 74 61 72 74 52 65  tic void StartRe
2520: 73 70 6f 6e 73 65 28 63 6f 6e 73 74 20 63 68 61  sponse(const cha
2530: 72 20 2a 7a 52 65 73 75 6c 74 43 6f 64 65 29 7b  r *zResultCode){
2540: 0a 20 20 74 69 6d 65 5f 74 20 6e 6f 77 3b 0a 20  .  time_t now;. 
2550: 20 74 69 6d 65 28 26 6e 6f 77 29 3b 0a 20 20 69   time(&now);.  i
2560: 66 28 20 73 74 61 74 75 73 53 65 6e 74 20 29 20  f( statusSent ) 
2570: 72 65 74 75 72 6e 3b 0a 20 20 6e 4f 75 74 20 2b  return;.  nOut +
2580: 3d 20 70 72 69 6e 74 66 28 22 25 73 20 25 73 5c  = printf("%s %s\
2590: 72 5c 6e 22 2c 20 7a 50 72 6f 74 6f 63 6f 6c 2c  r\n", zProtocol,
25a0: 20 7a 52 65 73 75 6c 74 43 6f 64 65 29 3b 0a 20   zResultCode);. 
25b0: 20 73 74 72 6e 63 70 79 28 7a 52 65 70 6c 79 53   strncpy(zReplyS
25c0: 74 61 74 75 73 2c 20 7a 52 65 73 75 6c 74 43 6f  tatus, zResultCo
25d0: 64 65 2c 20 33 29 3b 0a 20 20 7a 52 65 70 6c 79  de, 3);.  zReply
25e0: 53 74 61 74 75 73 5b 33 5d 20 3d 20 30 3b 0a 20  Status[3] = 0;. 
25f0: 20 69 66 28 20 7a 52 65 70 6c 79 53 74 61 74 75   if( zReplyStatu
2600: 73 5b 30 5d 3e 3d 27 34 27 20 29 7b 0a 20 20 20  s[0]>='4' ){.   
2610: 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e   closeConnection
2620: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
2630: 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20  closeConnection 
2640: 29 7b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70  ){.    nOut += p
2650: 72 69 6e 74 66 28 22 43 6f 6e 6e 65 63 74 69 6f  rintf("Connectio
2660: 6e 3a 20 63 6c 6f 73 65 5c 72 5c 6e 22 29 3b 0a  n: close\r\n");.
2670: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 75    }else{.    nOu
2680: 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e  t += printf("Con
2690: 6e 65 63 74 69 6f 6e 3a 20 6b 65 65 70 2d 61 6c  nection: keep-al
26a0: 69 76 65 5c 72 5c 6e 22 29 3b 0a 20 20 7d 0a 20  ive\r\n");.  }. 
26b0: 20 6e 4f 75 74 20 2b 3d 20 44 61 74 65 54 61 67   nOut += DateTag
26c0: 28 22 44 61 74 65 22 2c 20 6e 6f 77 29 3b 0a 20  ("Date", now);. 
26d0: 20 73 74 61 74 75 73 53 65 6e 74 20 3d 20 31 3b   statusSent = 1;
26e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74  .}../*.** Tell t
26f0: 68 65 20 63 6c 69 65 6e 74 20 74 68 61 74 20 74  he client that t
2700: 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20  here is no such 
2710: 64 6f 63 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74  document.*/.stat
2720: 69 63 20 76 6f 69 64 20 4e 6f 74 46 6f 75 6e 64  ic void NotFound
2730: 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20  (int lineno){.  
2740: 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 34  StartResponse("4
2750: 30 34 20 4e 6f 74 20 46 6f 75 6e 64 22 29 3b 0a  04 Not Found");.
2760: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
2770: 28 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74  (.    "Content-t
2780: 79 70 65 3a 20 74 65 78 74 2f 68 74 6d 6c 5c 72  ype: text/html\r
2790: 5c 6e 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20  \n".    "\r\n". 
27a0: 20 20 20 22 3c 68 65 61 64 3e 3c 74 69 74 6c 65     "<head><title
27b0: 20 6c 69 6e 65 6e 6f 3d 5c 22 25 64 5c 22 3e 4e   lineno=\"%d\">N
27c0: 6f 74 20 46 6f 75 6e 64 3c 2f 74 69 74 6c 65 3e  ot Found</title>
27d0: 3c 2f 68 65 61 64 3e 5c 6e 22 0a 20 20 20 20 22  </head>\n".    "
27e0: 3c 62 6f 64 79 3e 3c 68 31 3e 44 6f 63 75 6d 65  <body><h1>Docume
27f0: 6e 74 20 4e 6f 74 20 46 6f 75 6e 64 3c 2f 68 31  nt Not Found</h1
2800: 3e 5c 6e 22 0a 20 20 20 20 22 54 68 65 20 64 6f  >\n".    "The do
2810: 63 75 6d 65 6e 74 20 25 73 20 69 73 20 6e 6f 74  cument %s is not
2820: 20 61 76 61 69 76 61 62 6c 65 20 6f 6e 20 74 68   avaivable on th
2830: 69 73 20 73 65 72 76 65 72 5c 6e 22 0a 20 20 20  is server\n".   
2840: 20 22 3c 2f 62 6f 64 79 3e 5c 6e 22 2c 20 6c 69   "</body>\n", li
2850: 6e 65 6e 6f 2c 20 7a 53 63 72 69 70 74 29 3b 0a  neno, zScript);.
2860: 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30    MakeLogEntry(0
2870: 29 3b 0a 20 20 65 78 69 74 28 30 29 3b 0a 7d 0a  );.  exit(0);.}.
2880: 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20  ./*.** Tell the 
2890: 63 6c 69 65 6e 74 20 74 68 61 74 20 74 68 65 72  client that ther
28a0: 65 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69 6e  e is an error in
28b0: 20 74 68 65 20 73 63 72 69 70 74 2e 0a 2a 2f 0a   the script..*/.
28c0: 73 74 61 74 69 63 20 76 6f 69 64 20 43 67 69 45  static void CgiE
28d0: 72 72 6f 72 28 76 6f 69 64 29 7b 0a 20 20 53 74  rror(void){.  St
28e0: 61 72 74 52 65 73 70 6f 6e 73 65 28 22 35 30 30  artResponse("500
28f0: 20 45 72 72 6f 72 22 29 3b 0a 20 20 6e 4f 75 74   Error");.  nOut
2900: 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20   += printf(.    
2910: 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74  "Content-type: t
2920: 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e 22 0a 20 20  ext/html\r\n".  
2930: 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 22 3c 68    "\r\n".    "<h
2940: 65 61 64 3e 3c 74 69 74 6c 65 3e 43 47 49 20 50  ead><title>CGI P
2950: 72 6f 67 72 61 6d 20 45 72 72 6f 72 3c 2f 74 69  rogram Error</ti
2960: 74 6c 65 3e 3c 2f 68 65 61 64 3e 5c 6e 22 0a 20  tle></head>\n". 
2970: 20 20 20 22 3c 62 6f 64 79 3e 3c 68 31 3e 43 47     "<body><h1>CG
2980: 49 20 50 72 6f 67 72 61 6d 20 45 72 72 6f 72 3c  I Program Error<
2990: 2f 68 31 3e 5c 6e 22 0a 20 20 20 20 22 54 68 65  /h1>\n".    "The
29a0: 20 43 47 49 20 70 72 6f 67 72 61 6d 20 25 73 20   CGI program %s 
29b0: 67 65 6e 65 72 61 74 65 64 20 61 6e 20 65 72 72  generated an err
29c0: 6f 72 5c 6e 22 0a 20 20 20 20 22 3c 2f 62 6f 64  or\n".    "</bod
29d0: 79 3e 5c 6e 22 2c 20 7a 53 63 72 69 70 74 29 3b  y>\n", zScript);
29e0: 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28  .  MakeLogEntry(
29f0: 30 29 3b 0a 20 20 65 78 69 74 28 30 29 3b 0a 7d  0);.  exit(0);.}
2a00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
2a10: 63 61 6c 6c 65 64 20 69 66 20 77 65 20 74 69 6d  called if we tim
2a20: 65 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eout..*/.static 
2a30: 76 6f 69 64 20 54 69 6d 65 6f 75 74 28 69 6e 74  void Timeout(int
2a40: 20 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69 66 28   NotUsed){.  if(
2a50: 20 21 64 65 62 75 67 46 6c 61 67 20 29 7b 0a 20   !debugFlag ){. 
2a60: 20 20 20 73 74 72 63 70 79 28 7a 52 65 70 6c 79     strcpy(zReply
2a70: 53 74 61 74 75 73 2c 20 22 39 39 39 22 29 3b 0a  Status, "999");.
2a80: 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79      MakeLogEntry
2a90: 28 30 29 3b 0a 20 20 20 20 65 78 69 74 28 30 29  (0);.    exit(0)
2aa0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
2ab0: 65 6c 6c 20 74 68 65 20 63 6c 69 65 6e 74 20 74  ell the client t
2ac0: 68 61 74 20 74 68 65 72 65 20 69 73 20 61 6e 20  hat there is an 
2ad0: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 73 63 72  error in the scr
2ae0: 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ipt..*/.static v
2af0: 6f 69 64 20 43 67 69 53 63 72 69 70 74 57 72 69  oid CgiScriptWri
2b00: 74 61 62 6c 65 28 76 6f 69 64 29 7b 0a 20 20 53  table(void){.  S
2b10: 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 35 30  tartResponse("50
2b20: 30 20 43 47 49 20 43 6f 6e 66 69 67 75 72 61 74  0 CGI Configurat
2b30: 69 6f 6e 20 45 72 72 6f 72 22 29 3b 0a 20 20 6e  ion Error");.  n
2b40: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20  Out += printf(. 
2b50: 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65     "Content-type
2b60: 3a 20 74 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e 22  : text/html\r\n"
2b70: 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20  .    "\r\n".    
2b80: 22 3c 68 65 61 64 3e 3c 74 69 74 6c 65 3e 43 47  "<head><title>CG
2b90: 49 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  I Configuration 
2ba0: 45 72 72 6f 72 3c 2f 74 69 74 6c 65 3e 3c 2f 68  Error</title></h
2bb0: 65 61 64 3e 5c 6e 22 0a 20 20 20 20 22 3c 62 6f  ead>\n".    "<bo
2bc0: 64 79 3e 3c 68 31 3e 43 47 49 20 43 6f 6e 66 69  dy><h1>CGI Confi
2bd0: 67 75 72 61 74 69 6f 6e 20 45 72 72 6f 72 3c 2f  guration Error</
2be0: 68 31 3e 5c 6e 22 0a 20 20 20 20 22 54 68 65 20  h1>\n".    "The 
2bf0: 43 47 49 20 70 72 6f 67 72 61 6d 20 25 73 20 69  CGI program %s i
2c00: 73 20 77 72 69 74 61 62 6c 65 20 62 79 20 75 73  s writable by us
2c10: 65 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 69  ers other than i
2c20: 74 73 20 6f 77 6e 65 72 2e 5c 6e 22 0a 20 20 20  ts owner.\n".   
2c30: 20 22 3c 2f 62 6f 64 79 3e 5c 6e 22 2c 20 7a 52   "</body>\n", zR
2c40: 65 61 6c 53 63 72 69 70 74 29 3b 0a 20 20 4d 61  ealScript);.  Ma
2c50: 6b 65 4c 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20  keLogEntry(0);. 
2c60: 20 65 78 69 74 28 30 29 3b 20 20 20 20 20 20 20   exit(0);       
2c70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74  .}../*.** Tell t
2c80: 68 65 20 63 6c 69 65 6e 74 20 74 68 61 74 20 74  he client that t
2c90: 68 65 20 73 65 72 76 65 72 20 6d 61 6c 66 75 6e  he server malfun
2ca0: 63 74 69 6f 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  ctioned..*/.stat
2cb0: 69 63 20 76 6f 69 64 20 4d 61 6c 66 75 6e 63 74  ic void Malfunct
2cc0: 69 6f 6e 28 69 6e 74 20 6c 69 6e 65 6e 75 6d 2c  ion(int linenum,
2cd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
2ce0: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
2cf0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73  _list ap;.  va_s
2d00: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
2d10: 29 3b 0a 20 20 53 74 61 72 74 52 65 73 70 6f 6e  );.  StartRespon
2d20: 73 65 28 22 35 30 30 20 53 65 72 76 65 72 20 4d  se("500 Server M
2d30: 61 6c 66 75 6e 63 74 69 6f 6e 22 29 3b 0a 20 20  alfunction");.  
2d40: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a  nOut += printf(.
2d50: 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70      "Content-typ
2d60: 65 3a 20 74 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e  e: text/html\r\n
2d70: 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20  ".    "\r\n".   
2d80: 20 22 3c 68 65 61 64 3e 3c 74 69 74 6c 65 3e 53   "<head><title>S
2d90: 65 72 76 65 72 20 4d 61 6c 66 75 6e 63 74 69 6f  erver Malfunctio
2da0: 6e 3c 2f 74 69 74 6c 65 3e 3c 2f 68 65 61 64 3e  n</title></head>
2db0: 5c 6e 22 0a 20 20 20 20 22 3c 62 6f 64 79 3e 3c  \n".    "<body><
2dc0: 68 31 3e 53 65 72 76 65 72 20 4d 61 6c 66 75 6e  h1>Server Malfun
2dd0: 63 74 69 6f 6e 3c 2f 68 31 3e 5c 6e 22 0a 20 20  ction</h1>\n".  
2de0: 20 20 22 3c 70 3e 54 68 69 73 20 77 65 62 20 73    "<p>This web s
2df0: 65 72 76 65 72 20 68 61 73 20 6d 61 6c 66 75 6e  erver has malfun
2e00: 63 74 69 6f 6e 65 64 2e 5c 6e 5c 6e 22 0a 20 20  ctioned.\n\n".  
2e10: 20 20 22 28 45 72 72 6f 72 20 6e 75 6d 62 65 72    "(Error number
2e20: 3a 20 25 64 29 3c 2f 70 3e 5c 6e 22 2c 20 6c 69  : %d)</p>\n", li
2e30: 6e 65 6e 75 6d 29 3b 0a 20 20 69 66 28 20 7a 46  nenum);.  if( zF
2e40: 6f 72 6d 61 74 20 29 7b 0a 20 20 20 20 6e 4f 75  ormat ){.    nOu
2e50: 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 3c 70 3e  t += printf("<p>
2e60: 22 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20  ");.    nOut += 
2e70: 76 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c  vprintf(zFormat,
2e80: 20 61 70 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b   ap);.    nOut +
2e90: 3d 20 70 72 69 6e 74 66 28 22 3c 2f 70 3e 5c 6e  = printf("</p>\n
2ea0: 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 6e 4f 75 74  \n");.  }.  nOut
2eb0: 20 2b 3d 20 70 72 69 6e 74 66 28 22 3c 2f 62 6f   += printf("</bo
2ec0: 64 79 3e 5c 6e 22 29 3b 0a 20 20 4d 61 6b 65 4c  dy>\n");.  MakeL
2ed0: 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20 20 65 78  ogEntry(0);.  ex
2ee0: 69 74 28 30 29 3b 20 20 20 20 20 20 20 0a 7d 0a  it(0);       .}.
2ef0: 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 73 65 72 76  ./*.** Do a serv
2f00: 65 72 20 72 65 64 69 72 65 63 74 20 74 6f 20 74  er redirect to t
2f10: 68 65 20 64 6f 63 75 6d 65 6e 74 20 73 70 65 63  he document spec
2f20: 69 66 69 65 64 2e 20 20 54 68 65 20 64 6f 63 75  ified.  The docu
2f30: 6d 65 6e 74 0a 2a 2a 20 6e 61 6d 65 20 6e 6f 74  ment.** name not
2f40: 20 63 6f 6e 74 61 69 6e 20 73 63 68 65 6d 65 20   contain scheme 
2f50: 6f 72 20 6e 65 74 77 6f 72 6b 20 6c 6f 63 61 74  or network locat
2f60: 69 6f 6e 20 6f 72 20 74 68 65 20 71 75 65 72 79  ion or the query
2f70: 20 73 74 72 69 6e 67 2e 0a 2a 2a 20 49 74 20 77   string..** It w
2f80: 69 6c 6c 20 62 65 20 6a 75 73 74 20 74 68 65 20  ill be just the 
2f90: 70 61 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  path..*/.static 
2fa0: 76 6f 69 64 20 52 65 64 69 72 65 63 74 28 63 6f  void Redirect(co
2fb0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
2fc0: 20 69 6e 74 20 66 69 6e 69 73 68 29 7b 0a 20 20   int finish){.  
2fd0: 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 33  StartResponse("3
2fe0: 30 32 20 54 65 6d 70 6f 72 61 72 79 20 52 65 64  02 Temporary Red
2ff0: 69 72 65 63 74 22 29 3b 0a 20 20 69 66 28 20 7a  irect");.  if( z
3000: 53 65 72 76 65 72 50 6f 72 74 3d 3d 30 20 7c 7c  ServerPort==0 ||
3010: 20 7a 53 65 72 76 65 72 50 6f 72 74 5b 30 5d 3d   zServerPort[0]=
3020: 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a 53 65  =0 || strcmp(zSe
3030: 72 76 65 72 50 6f 72 74 2c 22 38 30 22 29 3d 3d  rverPort,"80")==
3040: 30 20 29 7b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d  0 ){.    nOut +=
3050: 20 70 72 69 6e 74 66 28 22 4c 6f 63 61 74 69 6f   printf("Locatio
3060: 6e 3a 20 25 73 3a 2f 2f 25 73 25 73 25 73 5c 72  n: %s://%s%s%s\r
3070: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
3080: 20 20 20 20 20 20 20 20 7a 48 74 74 70 2c 20 7a          zHttp, z
3090: 53 65 72 76 65 72 4e 61 6d 65 2c 20 7a 50 61 74  ServerName, zPat
30a0: 68 2c 20 7a 51 75 65 72 79 53 75 66 66 69 78 29  h, zQuerySuffix)
30b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
30c0: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 4c  Out += printf("L
30d0: 6f 63 61 74 69 6f 6e 3a 20 25 73 3a 2f 2f 25 73  ocation: %s://%s
30e0: 3a 25 73 25 73 25 73 5c 72 5c 6e 22 2c 0a 20 20  :%s%s%s\r\n",.  
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3100: 20 7a 48 74 74 70 2c 20 7a 53 65 72 76 65 72 4e   zHttp, zServerN
3110: 61 6d 65 2c 20 7a 53 65 72 76 65 72 50 6f 72 74  ame, zServerPort
3120: 2c 20 7a 50 61 74 68 2c 20 7a 51 75 65 72 79 53  , zPath, zQueryS
3130: 75 66 66 69 78 29 3b 0a 20 20 7d 0a 20 20 69 66  uffix);.  }.  if
3140: 28 20 66 69 6e 69 73 68 20 29 7b 0a 20 20 20 20  ( finish ){.    
3150: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22  nOut += printf("
3160: 5c 72 5c 6e 22 29 3b 0a 20 20 20 20 4d 61 6b 65  \r\n");.    Make
3170: 4c 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20 20 7d  LogEntry(0);.  }
3180: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 75 65 73 73 20  .}../*.** Guess 
3190: 74 68 65 20 6d 69 6d 65 2d 74 79 70 65 20 6f 66  the mime-type of
31a0: 20 61 20 64 6f 63 75 6d 65 6e 74 20 62 61 73 65   a document base
31b0: 64 20 6f 6e 20 69 74 73 20 6e 61 6d 65 2e 0a 2a  d on its name..*
31c0: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 47 65  /.const char *Ge
31d0: 74 4d 69 6d 65 54 79 70 65 28 63 6f 6e 73 74 20  tMimeType(const 
31e0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74  char *zName, int
31f0: 20 6e 4e 61 6d 65 29 7b 0a 20 20 63 6f 6e 73 74   nName){.  const
3200: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20   char *z;.  int 
3210: 69 3b 0a 20 20 69 6e 74 20 66 69 72 73 74 2c 20  i;.  int first, 
3220: 6c 61 73 74 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b  last;.  int len;
3230: 0a 20 20 63 68 61 72 20 7a 53 75 66 66 69 78 5b  .  char zSuffix[
3240: 32 30 5d 3b 0a 0a 20 20 2f 2a 20 41 20 74 61 62  20];..  /* A tab
3250: 6c 65 20 6f 66 20 6d 69 6d 65 74 79 70 65 73 20  le of mimetypes 
3260: 62 61 73 65 64 20 6f 6e 20 66 69 6c 65 20 73 75  based on file su
3270: 66 66 69 78 65 73 2e 20 0a 20 20 2a 2a 20 53 75  ffixes. .  ** Su
3280: 66 66 69 78 65 73 20 6d 75 73 74 20 62 65 20 69  ffixes must be i
3290: 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20 73  n sorted order s
32a0: 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 64 6f  o that we can do
32b0: 20 61 20 62 69 6e 61 72 79 0a 20 20 2a 2a 20 73   a binary.  ** s
32c0: 65 61 72 63 68 20 74 6f 20 66 69 6e 64 20 74 68  earch to find th
32d0: 65 20 6d 69 6d 65 2d 74 79 70 65 0a 20 20 2a 2f  e mime-type.  */
32e0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
32f0: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e  struct {.    con
3300: 73 74 20 63 68 61 72 20 2a 7a 53 75 66 66 69 78  st char *zSuffix
3310: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66  ;       /* The f
3320: 69 6c 65 20 73 75 66 66 69 78 20 2a 2f 0a 20 20  ile suffix */.  
3330: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
3340: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3350: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 75  Length of the su
3360: 66 66 69 78 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  ffix */.    cons
3370: 74 20 63 68 61 72 20 2a 7a 4d 69 6d 65 74 79 70  t char *zMimetyp
3380: 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  e;     /* The co
3390: 72 72 65 73 70 6f 6e 64 69 6e 67 20 6d 69 6d 65  rresponding mime
33a0: 74 79 70 65 20 2a 2f 0a 20 20 7d 20 61 4d 69 6d  type */.  } aMim
33b0: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 61  e[] = {.    { "a
33c0: 69 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22  i",         2, "
33d0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 6f 73 74  application/post
33e0: 73 63 72 69 70 74 22 20 20 20 20 20 20 20 20 20  script"         
33f0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 69 66     },.    { "aif
3400: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75  ",        3, "au
3410: 64 69 6f 2f 78 2d 61 69 66 66 22 20 20 20 20 20  dio/x-aiff"     
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3430: 20 7d 2c 0a 20 20 20 20 7b 20 22 61 69 66 63 22   },.    { "aifc"
3440: 2c 20 20 20 20 20 20 20 34 2c 20 22 61 75 64 69  ,       4, "audi
3450: 6f 2f 78 2d 61 69 66 66 22 20 20 20 20 20 20 20  o/x-aiff"       
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
3470: 2c 0a 20 20 20 20 7b 20 22 61 69 66 66 22 2c 20  ,.    { "aiff", 
3480: 20 20 20 20 20 20 34 2c 20 22 61 75 64 69 6f 2f        4, "audio/
3490: 78 2d 61 69 66 66 22 20 20 20 20 20 20 20 20 20  x-aiff"         
34a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
34b0: 20 20 20 20 7b 20 22 61 72 6a 22 2c 20 20 20 20      { "arj",    
34c0: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
34d0: 69 6f 6e 2f 78 2d 61 72 6a 2d 63 6f 6d 70 72 65  ion/x-arj-compre
34e0: 73 73 65 64 22 20 20 20 20 20 20 7d 2c 0a 20 20  ssed"      },.  
34f0: 20 20 7b 20 22 61 73 63 22 2c 20 20 20 20 20 20    { "asc",      
3500: 20 20 33 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e    3, "text/plain
3510: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
3520: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
3530: 7b 20 22 61 73 66 22 2c 20 20 20 20 20 20 20 20  { "asf",        
3540: 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 61  3, "video/x-ms-a
3550: 73 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20  sf"             
3560: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
3570: 22 61 73 78 22 2c 20 20 20 20 20 20 20 20 33 2c  "asx",        3,
3580: 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 61 73 78   "video/x-ms-asx
3590: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
35a0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61       },.    { "a
35b0: 75 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22  u",         2, "
35c0: 61 75 64 69 6f 2f 75 6c 61 77 22 20 20 20 20 20  audio/ulaw"     
35d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 76 69     },.    { "avi
35f0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69  ",        3, "vi
3600: 64 65 6f 2f 78 2d 6d 73 76 69 64 65 6f 22 20 20  deo/x-msvideo"  
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3620: 20 7d 2c 0a 20 20 20 20 7b 20 22 62 61 74 22 2c   },.    { "bat",
3630: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
3640: 69 63 61 74 69 6f 6e 2f 78 2d 6d 73 64 6f 73 2d  ication/x-msdos-
3650: 70 72 6f 67 72 61 6d 22 20 20 20 20 20 20 20 7d  program"       }
3660: 2c 0a 20 20 20 20 7b 20 22 62 63 70 69 6f 22 2c  ,.    { "bcpio",
3670: 20 20 20 20 20 20 35 2c 20 22 61 70 70 6c 69 63        5, "applic
3680: 61 74 69 6f 6e 2f 78 2d 62 63 70 69 6f 22 20 20  ation/x-bcpio"  
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
36a0: 20 20 20 20 7b 20 22 62 69 6e 22 2c 20 20 20 20      { "bin",    
36b0: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
36c0: 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d  ion/octet-stream
36d0: 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  "          },.  
36e0: 20 20 7b 20 22 63 22 2c 20 20 20 20 20 20 20 20    { "c",        
36f0: 20 20 31 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e    1, "text/plain
3700: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
3710: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
3720: 7b 20 22 63 63 22 2c 20 20 20 20 20 20 20 20 20  { "cc",         
3730: 32 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20  2, "text/plain" 
3740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3750: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
3760: 22 63 63 61 64 22 2c 20 20 20 20 20 20 20 34 2c  "ccad",       4,
3770: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 63 6c   "application/cl
3780: 61 72 69 73 63 61 64 22 20 20 20 20 20 20 20 20  ariscad"        
3790: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63       },.    { "c
37a0: 64 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  df",        3, "
37b0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6e 65  application/x-ne
37c0: 74 63 64 66 22 20 20 20 20 20 20 20 20 20 20 20  tcdf"           
37d0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6c 61     },.    { "cla
37e0: 73 73 22 2c 20 20 20 20 20 20 35 2c 20 22 61 70  ss",      5, "ap
37f0: 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d  plication/octet-
3800: 73 74 72 65 61 6d 22 20 20 20 20 20 20 20 20 20  stream"         
3810: 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 64 22 2c   },.    { "cod",
3820: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
3830: 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 72 69 6d 2e  ication/vnd.rim.
3840: 63 6f 64 22 20 20 20 20 20 20 20 20 20 20 20 7d  cod"           }
3850: 2c 0a 20 20 20 20 7b 20 22 63 6f 6d 22 2c 20 20  ,.    { "com",  
3860: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
3870: 61 74 69 6f 6e 2f 78 2d 6d 73 64 6f 73 2d 70 72  ation/x-msdos-pr
3880: 6f 67 72 61 6d 22 20 20 20 20 20 20 20 7d 2c 0a  ogram"       },.
3890: 20 20 20 20 7b 20 22 63 70 69 6f 22 2c 20 20 20      { "cpio",   
38a0: 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74      4, "applicat
38b0: 69 6f 6e 2f 78 2d 63 70 69 6f 22 20 20 20 20 20  ion/x-cpio"     
38c0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
38d0: 20 20 7b 20 22 63 70 74 22 2c 20 20 20 20 20 20    { "cpt",      
38e0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
38f0: 6e 2f 6d 61 63 2d 63 6f 6d 70 61 63 74 70 72 6f  n/mac-compactpro
3900: 22 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  "        },.    
3910: 7b 20 22 63 73 68 22 2c 20 20 20 20 20 20 20 20  { "csh",        
3920: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
3930: 78 2d 63 73 68 22 20 20 20 20 20 20 20 20 20 20  x-csh"          
3940: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
3950: 22 63 73 73 22 2c 20 20 20 20 20 20 20 20 33 2c  "css",        3,
3960: 20 22 74 65 78 74 2f 63 73 73 22 20 20 20 20 20   "text/css"     
3970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3980: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64       },.    { "d
3990: 63 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  cr",        3, "
39a0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 64 69  application/x-di
39b0: 72 65 63 74 6f 72 22 20 20 20 20 20 20 20 20 20  rector"         
39c0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 65 62     },.    { "deb
39d0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
39e0: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 64 65 62 69  plication/x-debi
39f0: 61 6e 2d 70 61 63 6b 61 67 65 22 20 20 20 20 20  an-package"     
3a00: 20 7d 2c 0a 20 20 20 20 7b 20 22 64 69 72 22 2c   },.    { "dir",
3a10: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
3a20: 69 63 61 74 69 6f 6e 2f 78 2d 64 69 72 65 63 74  ication/x-direct
3a30: 6f 72 22 20 20 20 20 20 20 20 20 20 20 20 20 7d  or"            }
3a40: 2c 0a 20 20 20 20 7b 20 22 64 6c 22 2c 20 20 20  ,.    { "dl",   
3a50: 20 20 20 20 20 20 32 2c 20 22 76 69 64 65 6f 2f        2, "video/
3a60: 64 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20  dl"             
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
3a80: 20 20 20 20 7b 20 22 64 6d 73 22 2c 20 20 20 20      { "dms",    
3a90: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
3aa0: 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d  ion/octet-stream
3ab0: 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  "          },.  
3ac0: 20 20 7b 20 22 64 6f 63 22 2c 20 20 20 20 20 20    { "doc",      
3ad0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
3ae0: 6e 2f 6d 73 77 6f 72 64 22 20 20 20 20 20 20 20  n/msword"       
3af0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
3b00: 7b 20 22 64 72 77 22 2c 20 20 20 20 20 20 20 20  { "drw",        
3b10: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
3b20: 64 72 61 66 74 69 6e 67 22 20 20 20 20 20 20 20  drafting"       
3b30: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
3b40: 22 64 76 69 22 2c 20 20 20 20 20 20 20 20 33 2c  "dvi",        3,
3b50: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
3b60: 64 76 69 22 20 20 20 20 20 20 20 20 20 20 20 20  dvi"            
3b70: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64       },.    { "d
3b80: 77 67 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  wg",        3, "
3b90: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 61 63 61 64  application/acad
3ba0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
3bb0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 78 66     },.    { "dxf
3bc0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
3bd0: 70 6c 69 63 61 74 69 6f 6e 2f 64 78 66 22 20 20  plication/dxf"  
3be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bf0: 20 7d 2c 0a 20 20 20 20 7b 20 22 64 78 72 22 2c   },.    { "dxr",
3c00: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
3c10: 69 63 61 74 69 6f 6e 2f 78 2d 64 69 72 65 63 74  ication/x-direct
3c20: 6f 72 22 20 20 20 20 20 20 20 20 20 20 20 20 7d  or"            }
3c30: 2c 0a 20 20 20 20 7b 20 22 65 70 73 22 2c 20 20  ,.    { "eps",  
3c40: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
3c50: 61 74 69 6f 6e 2f 70 6f 73 74 73 63 72 69 70 74  ation/postscript
3c60: 22 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  "            },.
3c70: 20 20 20 20 7b 20 22 65 74 78 22 2c 20 20 20 20      { "etx",    
3c80: 20 20 20 20 33 2c 20 22 74 65 78 74 2f 78 2d 73      3, "text/x-s
3c90: 65 74 65 78 74 22 20 20 20 20 20 20 20 20 20 20  etext"          
3ca0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
3cb0: 20 20 7b 20 22 65 78 65 22 2c 20 20 20 20 20 20    { "exe",      
3cc0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
3cd0: 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22 20  n/octet-stream" 
3ce0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
3cf0: 7b 20 22 65 7a 22 2c 20 20 20 20 20 20 20 20 20  { "ez",         
3d00: 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  2, "application/
3d10: 61 6e 64 72 65 77 2d 69 6e 73 65 74 22 20 20 20  andrew-inset"   
3d20: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
3d30: 22 66 22 2c 20 20 20 20 20 20 20 20 20 20 31 2c  "f",          1,
3d40: 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20 20   "text/plain"   
3d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d60: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66       },.    { "f
3d70: 39 30 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  90",        3, "
3d80: 74 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20 20  text/plain"     
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3da0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66 6c 69     },.    { "fli
3db0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69  ",        3, "vi
3dc0: 64 65 6f 2f 66 6c 69 22 20 20 20 20 20 20 20 20  deo/fli"        
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3de0: 20 7d 2c 0a 20 20 20 20 7b 20 22 66 6c 76 22 2c   },.    { "flv",
3df0: 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64 65          3, "vide
3e00: 6f 2f 66 6c 76 22 20 20 20 20 20 20 20 20 20 20  o/flv"          
3e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
3e20: 2c 0a 20 20 20 20 7b 20 22 67 69 66 22 2c 20 20  ,.    { "gif",  
3e30: 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f        3, "image/
3e40: 67 69 66 22 20 20 20 20 20 20 20 20 20 20 20 20  gif"            
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
3e60: 20 20 20 20 7b 20 22 67 6c 22 2c 20 20 20 20 20      { "gl",     
3e70: 20 20 20 20 32 2c 20 22 76 69 64 65 6f 2f 67 6c      2, "video/gl
3e80: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
3e90: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
3ea0: 20 20 7b 20 22 67 74 61 72 22 2c 20 20 20 20 20    { "gtar",     
3eb0: 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    4, "applicatio
3ec0: 6e 2f 78 2d 67 74 61 72 22 20 20 20 20 20 20 20  n/x-gtar"       
3ed0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
3ee0: 7b 20 22 67 7a 22 2c 20 20 20 20 20 20 20 20 20  { "gz",         
3ef0: 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  2, "application/
3f00: 78 2d 67 7a 69 70 22 20 20 20 20 20 20 20 20 20  x-gzip"         
3f10: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
3f20: 22 68 64 66 22 2c 20 20 20 20 20 20 20 20 33 2c  "hdf",        3,
3f30: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
3f40: 68 64 66 22 20 20 20 20 20 20 20 20 20 20 20 20  hdf"            
3f50: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68       },.    { "h
3f60: 68 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22  h",         2, "
3f70: 74 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20 20  text/plain"     
3f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f90: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68 71 78     },.    { "hqx
3fa0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
3fb0: 70 6c 69 63 61 74 69 6f 6e 2f 6d 61 63 2d 62 69  plication/mac-bi
3fc0: 6e 68 65 78 34 30 22 20 20 20 20 20 20 20 20 20  nhex40"         
3fd0: 20 7d 2c 0a 20 20 20 20 7b 20 22 68 22 2c 20 20   },.    { "h",  
3fe0: 20 20 20 20 20 20 20 20 31 2c 20 22 74 65 78 74          1, "text
3ff0: 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20  /plain"         
4000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
4010: 2c 0a 20 20 20 20 7b 20 22 68 74 6d 22 2c 20 20  ,.    { "htm",  
4020: 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 68        3, "text/h
4030: 74 6d 6c 22 20 20 20 20 20 20 20 20 20 20 20 20  tml"            
4040: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
4050: 20 20 20 20 7b 20 22 68 74 6d 6c 22 2c 20 20 20      { "html",   
4060: 20 20 20 20 34 2c 20 22 74 65 78 74 2f 68 74 6d      4, "text/htm
4070: 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l"              
4080: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
4090: 20 20 7b 20 22 69 63 65 22 2c 20 20 20 20 20 20    { "ice",      
40a0: 20 20 33 2c 20 22 78 2d 63 6f 6e 66 65 72 65 6e    3, "x-conferen
40b0: 63 65 2f 78 2d 63 6f 6f 6c 74 61 6c 6b 22 20 20  ce/x-cooltalk"  
40c0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
40d0: 7b 20 22 69 65 66 22 2c 20 20 20 20 20 20 20 20  { "ief",        
40e0: 33 2c 20 22 69 6d 61 67 65 2f 69 65 66 22 20 20  3, "image/ief"  
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4100: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
4110: 22 69 67 65 73 22 2c 20 20 20 20 20 20 20 34 2c  "iges",       4,
4120: 20 22 6d 6f 64 65 6c 2f 69 67 65 73 22 20 20 20   "model/iges"   
4130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4140: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69       },.    { "i
4150: 67 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  gs",        3, "
4160: 6d 6f 64 65 6c 2f 69 67 65 73 22 20 20 20 20 20  model/iges"     
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4180: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 70 73     },.    { "ips
4190: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
41a0: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 69 70 73 63  plication/x-ipsc
41b0: 72 69 70 74 22 20 20 20 20 20 20 20 20 20 20 20  ript"           
41c0: 20 7d 2c 0a 20 20 20 20 7b 20 22 69 70 78 22 2c   },.    { "ipx",
41d0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
41e0: 69 63 61 74 69 6f 6e 2f 78 2d 69 70 69 78 22 20  ication/x-ipix" 
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
4200: 2c 0a 20 20 20 20 7b 20 22 6a 61 64 22 2c 20 20  ,.    { "jad",  
4210: 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 76        3, "text/v
4220: 6e 64 2e 73 75 6e 2e 6a 32 6d 65 2e 61 70 70 2d  nd.sun.j2me.app-
4230: 64 65 73 63 72 69 70 74 6f 72 22 20 20 7d 2c 0a  descriptor"  },.
4240: 20 20 20 20 7b 20 22 6a 61 72 22 2c 20 20 20 20      { "jar",    
4250: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
4260: 69 6f 6e 2f 6a 61 76 61 2d 61 72 63 68 69 76 65  ion/java-archive
4270: 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  "          },.  
4280: 20 20 7b 20 22 6a 70 65 67 22 2c 20 20 20 20 20    { "jpeg",     
4290: 20 20 34 2c 20 22 69 6d 61 67 65 2f 6a 70 65 67    4, "image/jpeg
42a0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
42b0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
42c0: 7b 20 22 6a 70 65 22 2c 20 20 20 20 20 20 20 20  { "jpe",        
42d0: 33 2c 20 22 69 6d 61 67 65 2f 6a 70 65 67 22 20  3, "image/jpeg" 
42e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42f0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
4300: 22 6a 70 67 22 2c 20 20 20 20 20 20 20 20 33 2c  "jpg",        3,
4310: 20 22 69 6d 61 67 65 2f 6a 70 65 67 22 20 20 20   "image/jpeg"   
4320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4330: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a       },.    { "j
4340: 73 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22  s",         2, "
4350: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6a 61  application/x-ja
4360: 76 61 73 63 72 69 70 74 22 20 20 20 20 20 20 20  vascript"       
4370: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6b 61 72     },.    { "kar
4380: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75  ",        3, "au
4390: 64 69 6f 2f 6d 69 64 69 22 20 20 20 20 20 20 20  dio/midi"       
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43b0: 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 61 74 65 78   },.    { "latex
43c0: 22 2c 20 20 20 20 20 20 35 2c 20 22 61 70 70 6c  ",      5, "appl
43d0: 69 63 61 74 69 6f 6e 2f 78 2d 6c 61 74 65 78 22  ication/x-latex"
43e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
43f0: 2c 0a 20 20 20 20 7b 20 22 6c 68 61 22 2c 20 20  ,.    { "lha",  
4400: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
4410: 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65  ation/octet-stre
4420: 61 6d 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  am"          },.
4430: 20 20 20 20 7b 20 22 6c 73 70 22 2c 20 20 20 20      { "lsp",    
4440: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
4450: 69 6f 6e 2f 78 2d 6c 69 73 70 22 20 20 20 20 20  ion/x-lisp"     
4460: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
4470: 20 20 7b 20 22 6c 7a 68 22 2c 20 20 20 20 20 20    { "lzh",      
4480: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
4490: 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22 20  n/octet-stream" 
44a0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
44b0: 7b 20 22 6d 22 2c 20 20 20 20 20 20 20 20 20 20  { "m",          
44c0: 31 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20  1, "text/plain" 
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
44f0: 22 6d 33 75 22 2c 20 20 20 20 20 20 20 20 33 2c  "m3u",        3,
4500: 20 22 61 75 64 69 6f 2f 78 2d 6d 70 65 67 75 72   "audio/x-mpegur
4510: 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l"              
4520: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d       },.    { "m
4530: 61 6e 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  an",        3, "
4540: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72  application/x-tr
4550: 6f 66 66 2d 6d 61 6e 22 20 20 20 20 20 20 20 20  off-man"        
4560: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 65 22     },.    { "me"
4570: 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70  ,         2, "ap
4580: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72 6f 66  plication/x-trof
4590: 66 2d 6d 65 22 20 20 20 20 20 20 20 20 20 20 20  f-me"           
45a0: 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 65 73 68 22   },.    { "mesh"
45b0: 2c 20 20 20 20 20 20 20 34 2c 20 22 6d 6f 64 65  ,       4, "mode
45c0: 6c 2f 6d 65 73 68 22 20 20 20 20 20 20 20 20 20  l/mesh"         
45d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
45e0: 2c 0a 20 20 20 20 7b 20 22 6d 69 64 22 2c 20 20  ,.    { "mid",  
45f0: 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f        3, "audio/
4600: 6d 69 64 69 22 20 20 20 20 20 20 20 20 20 20 20  midi"           
4610: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
4620: 20 20 20 20 7b 20 22 6d 69 64 69 22 2c 20 20 20      { "midi",   
4630: 20 20 20 20 34 2c 20 22 61 75 64 69 6f 2f 6d 69      4, "audio/mi
4640: 64 69 22 20 20 20 20 20 20 20 20 20 20 20 20 20  di"             
4650: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
4660: 20 20 7b 20 22 6d 69 66 22 2c 20 20 20 20 20 20    { "mif",      
4670: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
4680: 6e 2f 78 2d 6d 69 66 22 20 20 20 20 20 20 20 20  n/x-mif"        
4690: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
46a0: 7b 20 22 6d 69 6d 65 22 2c 20 20 20 20 20 20 20  { "mime",       
46b0: 34 2c 20 22 77 77 77 2f 6d 69 6d 65 22 20 20 20  4, "www/mime"   
46c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46d0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
46e0: 22 6d 6f 76 69 65 22 2c 20 20 20 20 20 20 35 2c  "movie",      5,
46f0: 20 22 76 69 64 65 6f 2f 78 2d 73 67 69 2d 6d 6f   "video/x-sgi-mo
4700: 76 69 65 22 20 20 20 20 20 20 20 20 20 20 20 20  vie"            
4710: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d       },.    { "m
4720: 6f 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ov",        3, "
4730: 76 69 64 65 6f 2f 71 75 69 63 6b 74 69 6d 65 22  video/quicktime"
4740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4750: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 32     },.    { "mp2
4760: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75  ",        3, "au
4770: 64 69 6f 2f 6d 70 65 67 22 20 20 20 20 20 20 20  dio/mpeg"       
4780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4790: 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 32 22 2c   },.    { "mp2",
47a0: 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64 65          3, "vide
47b0: 6f 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20 20  o/mpeg"         
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
47d0: 2c 0a 20 20 20 20 7b 20 22 6d 70 33 22 2c 20 20  ,.    { "mp3",  
47e0: 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f        3, "audio/
47f0: 6d 70 65 67 22 20 20 20 20 20 20 20 20 20 20 20  mpeg"           
4800: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
4810: 20 20 20 20 7b 20 22 6d 70 65 67 22 2c 20 20 20      { "mpeg",   
4820: 20 20 20 20 34 2c 20 22 76 69 64 65 6f 2f 6d 70      4, "video/mp
4830: 65 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20  eg"             
4840: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
4850: 20 20 7b 20 22 6d 70 65 22 2c 20 20 20 20 20 20    { "mpe",      
4860: 20 20 33 2c 20 22 76 69 64 65 6f 2f 6d 70 65 67    3, "video/mpeg
4870: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
4880: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
4890: 7b 20 22 6d 70 67 61 22 2c 20 20 20 20 20 20 20  { "mpga",       
48a0: 34 2c 20 22 61 75 64 69 6f 2f 6d 70 65 67 22 20  4, "audio/mpeg" 
48b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48c0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
48d0: 22 6d 70 67 22 2c 20 20 20 20 20 20 20 20 33 2c  "mpg",        3,
48e0: 20 22 76 69 64 65 6f 2f 6d 70 65 67 22 20 20 20   "video/mpeg"   
48f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4900: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d       },.    { "m
4910: 73 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22  s",         2, "
4920: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72  application/x-tr
4930: 6f 66 66 2d 6d 73 22 20 20 20 20 20 20 20 20 20  off-ms"         
4940: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 73 68     },.    { "msh
4950: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 6d 6f  ",        3, "mo
4960: 64 65 6c 2f 6d 65 73 68 22 20 20 20 20 20 20 20  del/mesh"       
4970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4980: 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 63 22 2c 20   },.    { "nc", 
4990: 20 20 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c          2, "appl
49a0: 69 63 61 74 69 6f 6e 2f 78 2d 6e 65 74 63 64 66  ication/x-netcdf
49b0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  "              }
49c0: 2c 0a 20 20 20 20 7b 20 22 6f 64 61 22 2c 20 20  ,.    { "oda",  
49d0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
49e0: 61 74 69 6f 6e 2f 6f 64 61 22 20 20 20 20 20 20  ation/oda"      
49f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
4a00: 20 20 20 20 7b 20 22 6f 67 67 22 2c 20 20 20 20      { "ogg",    
4a10: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
4a20: 69 6f 6e 2f 6f 67 67 22 20 20 20 20 20 20 20 20  ion/ogg"        
4a30: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
4a40: 20 20 7b 20 22 6f 67 6d 22 2c 20 20 20 20 20 20    { "ogm",      
4a50: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
4a60: 6e 2f 6f 67 67 22 20 20 20 20 20 20 20 20 20 20  n/ogg"          
4a70: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
4a80: 7b 20 22 70 62 6d 22 2c 20 20 20 20 20 20 20 20  { "pbm",        
4a90: 33 2c 20 22 69 6d 61 67 65 2f 78 2d 70 6f 72 74  3, "image/x-port
4aa0: 61 62 6c 65 2d 62 69 74 6d 61 70 22 20 20 20 20  able-bitmap"    
4ab0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
4ac0: 22 70 64 62 22 2c 20 20 20 20 20 20 20 20 33 2c  "pdb",        3,
4ad0: 20 22 63 68 65 6d 69 63 61 6c 2f 78 2d 70 64 62   "chemical/x-pdb
4ae0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
4af0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70       },.    { "p
4b00: 64 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  df",        3, "
4b10: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 64 66 22  application/pdf"
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b30: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 67 6d     },.    { "pgm
4b40: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d  ",        3, "im
4b50: 61 67 65 2f 78 2d 70 6f 72 74 61 62 6c 65 2d 67  age/x-portable-g
4b60: 72 61 79 6d 61 70 22 20 20 20 20 20 20 20 20 20  raymap"         
4b70: 20 7d 2c 0a 20 20 20 20 7b 20 22 70 67 6e 22 2c   },.    { "pgn",
4b80: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
4b90: 69 63 61 74 69 6f 6e 2f 78 2d 63 68 65 73 73 2d  ication/x-chess-
4ba0: 70 67 6e 22 20 20 20 20 20 20 20 20 20 20 20 7d  pgn"           }
4bb0: 2c 0a 20 20 20 20 7b 20 22 70 67 70 22 2c 20 20  ,.    { "pgp",  
4bc0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
4bd0: 61 74 69 6f 6e 2f 70 67 70 22 20 20 20 20 20 20  ation/pgp"      
4be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
4bf0: 20 20 20 20 7b 20 22 70 6c 22 2c 20 20 20 20 20      { "pl",     
4c00: 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74      2, "applicat
4c10: 69 6f 6e 2f 78 2d 70 65 72 6c 22 20 20 20 20 20  ion/x-perl"     
4c20: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
4c30: 20 20 7b 20 22 70 6d 22 2c 20 20 20 20 20 20 20    { "pm",       
4c40: 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    2, "applicatio
4c50: 6e 2f 78 2d 70 65 72 6c 22 20 20 20 20 20 20 20  n/x-perl"       
4c60: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
4c70: 7b 20 22 70 6e 67 22 2c 20 20 20 20 20 20 20 20  { "png",        
4c80: 33 2c 20 22 69 6d 61 67 65 2f 70 6e 67 22 20 20  3, "image/png"  
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ca0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
4cb0: 22 70 6e 6d 22 2c 20 20 20 20 20 20 20 20 33 2c  "pnm",        3,
4cc0: 20 22 69 6d 61 67 65 2f 78 2d 70 6f 72 74 61 62   "image/x-portab
4cd0: 6c 65 2d 61 6e 79 6d 61 70 22 20 20 20 20 20 20  le-anymap"      
4ce0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70       },.    { "p
4cf0: 6f 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ot",        3, "
4d00: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 70 6f  application/mspo
4d10: 77 65 72 70 6f 69 6e 74 22 20 20 20 20 20 20 20  werpoint"       
4d20: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 70 6d     },.    { "ppm
4d30: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d  ",        3, "im
4d40: 61 67 65 2f 78 2d 70 6f 72 74 61 62 6c 65 2d 70  age/x-portable-p
4d50: 69 78 6d 61 70 22 20 20 20 20 20 20 20 20 20 20  ixmap"          
4d60: 20 7d 2c 0a 20 20 20 20 7b 20 22 70 70 73 22 2c   },.    { "pps",
4d70: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
4d80: 69 63 61 74 69 6f 6e 2f 6d 73 70 6f 77 65 72 70  ication/mspowerp
4d90: 6f 69 6e 74 22 20 20 20 20 20 20 20 20 20 20 7d  oint"          }
4da0: 2c 0a 20 20 20 20 7b 20 22 70 70 74 22 2c 20 20  ,.    { "ppt",  
4db0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
4dc0: 61 74 69 6f 6e 2f 6d 73 70 6f 77 65 72 70 6f 69  ation/mspowerpoi
4dd0: 6e 74 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  nt"          },.
4de0: 20 20 20 20 7b 20 22 70 70 7a 22 2c 20 20 20 20      { "ppz",    
4df0: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
4e00: 69 6f 6e 2f 6d 73 70 6f 77 65 72 70 6f 69 6e 74  ion/mspowerpoint
4e10: 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  "          },.  
4e20: 20 20 7b 20 22 70 72 65 22 2c 20 20 20 20 20 20    { "pre",      
4e30: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
4e40: 6e 2f 78 2d 66 72 65 65 6c 61 6e 63 65 22 20 20  n/x-freelance"  
4e50: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
4e60: 7b 20 22 70 72 74 22 2c 20 20 20 20 20 20 20 20  { "prt",        
4e70: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
4e80: 70 72 6f 5f 65 6e 67 22 20 20 20 20 20 20 20 20  pro_eng"        
4e90: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
4ea0: 22 70 73 22 2c 20 20 20 20 20 20 20 20 20 32 2c  "ps",         2,
4eb0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 6f   "application/po
4ec0: 73 74 73 63 72 69 70 74 22 20 20 20 20 20 20 20  stscript"       
4ed0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 71       },.    { "q
4ee0: 74 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22  t",         2, "
4ef0: 76 69 64 65 6f 2f 71 75 69 63 6b 74 69 6d 65 22  video/quicktime"
4f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f10: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61 22     },.    { "ra"
4f20: 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 75  ,         2, "au
4f30: 64 69 6f 2f 78 2d 72 65 61 6c 61 75 64 69 6f 22  dio/x-realaudio"
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f50: 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61 6d 22 2c   },.    { "ram",
4f60: 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69          3, "audi
4f70: 6f 2f 78 2d 70 6e 2d 72 65 61 6c 61 75 64 69 6f  o/x-pn-realaudio
4f80: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  "              }
4f90: 2c 0a 20 20 20 20 7b 20 22 72 61 72 22 2c 20 20  ,.    { "rar",  
4fa0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
4fb0: 61 74 69 6f 6e 2f 78 2d 72 61 72 2d 63 6f 6d 70  ation/x-rar-comp
4fc0: 72 65 73 73 65 64 22 20 20 20 20 20 20 7d 2c 0a  ressed"      },.
4fd0: 20 20 20 20 7b 20 22 72 61 73 22 2c 20 20 20 20      { "ras",    
4fe0: 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 63 6d      3, "image/cm
4ff0: 75 2d 72 61 73 74 65 72 22 20 20 20 20 20 20 20  u-raster"       
5000: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
5010: 20 20 7b 20 22 72 61 73 22 2c 20 20 20 20 20 20    { "ras",      
5020: 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 63 6d    3, "image/x-cm
5030: 75 2d 72 61 73 74 65 72 22 20 20 20 20 20 20 20  u-raster"       
5040: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
5050: 7b 20 22 72 67 62 22 2c 20 20 20 20 20 20 20 20  { "rgb",        
5060: 33 2c 20 22 69 6d 61 67 65 2f 78 2d 72 67 62 22  3, "image/x-rgb"
5070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5080: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
5090: 22 72 6d 22 2c 20 20 20 20 20 20 20 20 20 32 2c  "rm",         2,
50a0: 20 22 61 75 64 69 6f 2f 78 2d 70 6e 2d 72 65 61   "audio/x-pn-rea
50b0: 6c 61 75 64 69 6f 22 20 20 20 20 20 20 20 20 20  laudio"         
50c0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72       },.    { "r
50d0: 6f 66 66 22 2c 20 20 20 20 20 20 20 34 2c 20 22  off",       4, "
50e0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72  application/x-tr
50f0: 6f 66 66 22 20 20 20 20 20 20 20 20 20 20 20 20  off"            
5100: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 70 6d     },.    { "rpm
5110: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75  ",        3, "au
5120: 64 69 6f 2f 78 2d 70 6e 2d 72 65 61 6c 61 75 64  dio/x-pn-realaud
5130: 69 6f 2d 70 6c 75 67 69 6e 22 20 20 20 20 20 20  io-plugin"      
5140: 20 7d 2c 0a 20 20 20 20 7b 20 22 72 74 66 22 2c   },.    { "rtf",
5150: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
5160: 69 63 61 74 69 6f 6e 2f 72 74 66 22 20 20 20 20  ication/rtf"    
5170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
5180: 2c 0a 20 20 20 20 7b 20 22 72 74 66 22 2c 20 20  ,.    { "rtf",  
5190: 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 72        3, "text/r
51a0: 74 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20  tf"             
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
51c0: 20 20 20 20 7b 20 22 72 74 78 22 2c 20 20 20 20      { "rtx",    
51d0: 20 20 20 20 33 2c 20 22 74 65 78 74 2f 72 69 63      3, "text/ric
51e0: 68 74 65 78 74 22 20 20 20 20 20 20 20 20 20 20  htext"          
51f0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
5200: 20 20 7b 20 22 73 63 6d 22 2c 20 20 20 20 20 20    { "scm",      
5210: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
5220: 6e 2f 78 2d 6c 6f 74 75 73 73 63 72 65 65 6e 63  n/x-lotusscreenc
5230: 61 6d 22 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  am"      },.    
5240: 7b 20 22 73 65 74 22 2c 20 20 20 20 20 20 20 20  { "set",        
5250: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
5260: 73 65 74 22 20 20 20 20 20 20 20 20 20 20 20 20  set"            
5270: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
5280: 22 73 67 6d 6c 22 2c 20 20 20 20 20 20 20 34 2c  "sgml",       4,
5290: 20 22 74 65 78 74 2f 73 67 6d 6c 22 20 20 20 20   "text/sgml"    
52a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52b0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73       },.    { "s
52c0: 67 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  gm",        3, "
52d0: 74 65 78 74 2f 73 67 6d 6c 22 20 20 20 20 20 20  text/sgml"      
52e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52f0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 68 22     },.    { "sh"
5300: 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70  ,         2, "ap
5310: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 68 22 20  plication/x-sh" 
5320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5330: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 68 61 72 22   },.    { "shar"
5340: 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c  ,       4, "appl
5350: 69 63 61 74 69 6f 6e 2f 78 2d 73 68 61 72 22 20  ication/x-shar" 
5360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
5370: 2c 0a 20 20 20 20 7b 20 22 73 69 6c 6f 22 2c 20  ,.    { "silo", 
5380: 20 20 20 20 20 20 34 2c 20 22 6d 6f 64 65 6c 2f        4, "model/
5390: 6d 65 73 68 22 20 20 20 20 20 20 20 20 20 20 20  mesh"           
53a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
53b0: 20 20 20 20 7b 20 22 73 69 74 22 2c 20 20 20 20      { "sit",    
53c0: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
53d0: 69 6f 6e 2f 78 2d 73 74 75 66 66 69 74 22 20 20  ion/x-stuffit"  
53e0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
53f0: 20 20 7b 20 22 73 6b 64 22 2c 20 20 20 20 20 20    { "skd",      
5400: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
5410: 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20 20 20 20 20  n/x-koan"       
5420: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
5430: 7b 20 22 73 6b 6d 22 2c 20 20 20 20 20 20 20 20  { "skm",        
5440: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
5450: 78 2d 6b 6f 61 6e 22 20 20 20 20 20 20 20 20 20  x-koan"         
5460: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
5470: 22 73 6b 70 22 2c 20 20 20 20 20 20 20 20 33 2c  "skp",        3,
5480: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
5490: 6b 6f 61 6e 22 20 20 20 20 20 20 20 20 20 20 20  koan"           
54a0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73       },.    { "s
54b0: 6b 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  kt",        3, "
54c0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6b 6f  application/x-ko
54d0: 61 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20  an"             
54e0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 69     },.    { "smi
54f0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
5500: 70 6c 69 63 61 74 69 6f 6e 2f 73 6d 69 6c 22 20  plication/smil" 
5510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5520: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 69 6c 22   },.    { "smil"
5530: 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c  ,       4, "appl
5540: 69 63 61 74 69 6f 6e 2f 73 6d 69 6c 22 20 20 20  ication/smil"   
5550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
5560: 2c 0a 20 20 20 20 7b 20 22 73 6e 64 22 2c 20 20  ,.    { "snd",  
5570: 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f        3, "audio/
5580: 62 61 73 69 63 22 20 20 20 20 20 20 20 20 20 20  basic"          
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
55a0: 20 20 20 20 7b 20 22 73 6f 6c 22 2c 20 20 20 20      { "sol",    
55b0: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
55c0: 69 6f 6e 2f 73 6f 6c 69 64 73 22 20 20 20 20 20  ion/solids"     
55d0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
55e0: 20 20 7b 20 22 73 70 6c 22 2c 20 20 20 20 20 20    { "spl",      
55f0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
5600: 6e 2f 78 2d 66 75 74 75 72 65 73 70 6c 61 73 68  n/x-futuresplash
5610: 22 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  "        },.    
5620: 7b 20 22 73 72 63 22 2c 20 20 20 20 20 20 20 20  { "src",        
5630: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
5640: 78 2d 77 61 69 73 2d 73 6f 75 72 63 65 22 20 20  x-wais-source"  
5650: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
5660: 22 73 74 65 70 22 2c 20 20 20 20 20 20 20 34 2c  "step",       4,
5670: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 53 54   "application/ST
5680: 45 50 22 20 20 20 20 20 20 20 20 20 20 20 20 20  EP"             
5690: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73       },.    { "s
56a0: 74 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  tl",        3, "
56b0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 53 4c 41 22  application/SLA"
56c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56d0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 74 70     },.    { "stp
56e0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
56f0: 70 6c 69 63 61 74 69 6f 6e 2f 53 54 45 50 22 20  plication/STEP" 
5700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5710: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 76 34 63 70   },.    { "sv4cp
5720: 69 6f 22 2c 20 20 20 20 37 2c 20 22 61 70 70 6c  io",    7, "appl
5730: 69 63 61 74 69 6f 6e 2f 78 2d 73 76 34 63 70 69  ication/x-sv4cpi
5740: 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  o"             }
5750: 2c 0a 20 20 20 20 7b 20 22 73 76 34 63 72 63 22  ,.    { "sv4crc"
5760: 2c 20 20 20 20 20 36 2c 20 22 61 70 70 6c 69 63  ,     6, "applic
5770: 61 74 69 6f 6e 2f 78 2d 73 76 34 63 72 63 22 20  ation/x-sv4crc" 
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
5790: 20 20 20 20 7b 20 22 73 77 66 22 2c 20 20 20 20      { "swf",    
57a0: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
57b0: 69 6f 6e 2f 78 2d 73 68 6f 63 6b 77 61 76 65 2d  ion/x-shockwave-
57c0: 66 6c 61 73 68 22 20 20 20 20 20 7d 2c 0a 20 20  flash"     },.  
57d0: 20 20 7b 20 22 74 22 2c 20 20 20 20 20 20 20 20    { "t",        
57e0: 20 20 31 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    1, "applicatio
57f0: 6e 2f 78 2d 74 72 6f 66 66 22 20 20 20 20 20 20  n/x-troff"      
5800: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
5810: 7b 20 22 74 61 72 22 2c 20 20 20 20 20 20 20 20  { "tar",        
5820: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
5830: 78 2d 74 61 72 22 20 20 20 20 20 20 20 20 20 20  x-tar"          
5840: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
5850: 22 74 63 6c 22 2c 20 20 20 20 20 20 20 20 33 2c  "tcl",        3,
5860: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
5870: 74 63 6c 22 20 20 20 20 20 20 20 20 20 20 20 20  tcl"            
5880: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74       },.    { "t
5890: 65 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ex",        3, "
58a0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 65  application/x-te
58b0: 78 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x"              
58c0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 65 78     },.    { "tex
58d0: 69 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70  i",       4, "ap
58e0: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 65 78 69  plication/x-texi
58f0: 6e 66 6f 22 20 20 20 20 20 20 20 20 20 20 20 20  nfo"            
5900: 20 7d 2c 0a 20 20 20 20 7b 20 22 74 65 78 69 6e   },.    { "texin
5910: 66 6f 22 2c 20 20 20 20 37 2c 20 22 61 70 70 6c  fo",    7, "appl
5920: 69 63 61 74 69 6f 6e 2f 78 2d 74 65 78 69 6e 66  ication/x-texinf
5930: 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  o"             }
5940: 2c 0a 20 20 20 20 7b 20 22 74 67 7a 22 2c 20 20  ,.    { "tgz",  
5950: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
5960: 61 74 69 6f 6e 2f 78 2d 74 61 72 2d 67 7a 22 20  ation/x-tar-gz" 
5970: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
5980: 20 20 20 20 7b 20 22 74 69 66 66 22 2c 20 20 20      { "tiff",   
5990: 20 20 20 20 34 2c 20 22 69 6d 61 67 65 2f 74 69      4, "image/ti
59a0: 66 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ff"             
59b0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
59c0: 20 20 7b 20 22 74 69 66 22 2c 20 20 20 20 20 20    { "tif",      
59d0: 20 20 33 2c 20 22 69 6d 61 67 65 2f 74 69 66 66    3, "image/tiff
59e0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
59f0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
5a00: 7b 20 22 74 72 22 2c 20 20 20 20 20 20 20 20 20  { "tr",         
5a10: 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  2, "application/
5a20: 78 2d 74 72 6f 66 66 22 20 20 20 20 20 20 20 20  x-troff"        
5a30: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
5a40: 22 74 73 69 22 2c 20 20 20 20 20 20 20 20 33 2c  "tsi",        3,
5a50: 20 22 61 75 64 69 6f 2f 54 53 50 2d 61 75 64 69   "audio/TSP-audi
5a60: 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o"              
5a70: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74       },.    { "t
5a80: 73 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  sp",        3, "
5a90: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 64 73 70 74  application/dspt
5aa0: 79 70 65 22 20 20 20 20 20 20 20 20 20 20 20 20  ype"            
5ab0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 73 76     },.    { "tsv
5ac0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65  ",        3, "te
5ad0: 78 74 2f 74 61 62 2d 73 65 70 61 72 61 74 65 64  xt/tab-separated
5ae0: 2d 76 61 6c 75 65 73 22 20 20 20 20 20 20 20 20  -values"        
5af0: 20 7d 2c 0a 20 20 20 20 7b 20 22 74 78 74 22 2c   },.    { "txt",
5b00: 20 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74          3, "text
5b10: 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20  /plain"         
5b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
5b30: 2c 0a 20 20 20 20 7b 20 22 75 6e 76 22 2c 20 20  ,.    { "unv",  
5b40: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
5b50: 61 74 69 6f 6e 2f 69 2d 64 65 61 73 22 20 20 20  ation/i-deas"   
5b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
5b70: 20 20 20 20 7b 20 22 75 73 74 61 72 22 2c 20 20      { "ustar",  
5b80: 20 20 20 20 35 2c 20 22 61 70 70 6c 69 63 61 74      5, "applicat
5b90: 69 6f 6e 2f 78 2d 75 73 74 61 72 22 20 20 20 20  ion/x-ustar"    
5ba0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
5bb0: 20 20 7b 20 22 76 63 64 22 2c 20 20 20 20 20 20    { "vcd",      
5bc0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
5bd0: 6e 2f 78 2d 63 64 6c 69 6e 6b 22 20 20 20 20 20  n/x-cdlink"     
5be0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
5bf0: 7b 20 22 76 64 61 22 2c 20 20 20 20 20 20 20 20  { "vda",        
5c00: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
5c10: 76 64 61 22 20 20 20 20 20 20 20 20 20 20 20 20  vda"            
5c20: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
5c30: 22 76 69 76 22 2c 20 20 20 20 20 20 20 20 33 2c  "viv",        3,
5c40: 20 22 76 69 64 65 6f 2f 76 6e 64 2e 76 69 76 6f   "video/vnd.vivo
5c50: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
5c60: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 76       },.    { "v
5c70: 69 76 6f 22 2c 20 20 20 20 20 20 20 34 2c 20 22  ivo",       4, "
5c80: 76 69 64 65 6f 2f 76 6e 64 2e 76 69 76 6f 22 20  video/vnd.vivo" 
5c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ca0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 76 72 6d     },.    { "vrm
5cb0: 6c 22 2c 20 20 20 20 20 20 20 34 2c 20 22 6d 6f  l",       4, "mo
5cc0: 64 65 6c 2f 76 72 6d 6c 22 20 20 20 20 20 20 20  del/vrml"       
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ce0: 20 7d 2c 0a 20 20 20 20 7b 20 22 77 61 76 22 2c   },.    { "wav",
5cf0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69          3, "audi
5d00: 6f 2f 78 2d 77 61 76 22 20 20 20 20 20 20 20 20  o/x-wav"        
5d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
5d20: 2c 0a 20 20 20 20 7b 20 22 77 61 78 22 2c 20 20  ,.    { "wax",  
5d30: 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f        3, "audio/
5d40: 78 2d 6d 73 2d 77 61 78 22 20 20 20 20 20 20 20  x-ms-wax"       
5d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
5d60: 20 20 20 20 7b 20 22 77 69 6b 69 22 2c 20 20 20      { "wiki",   
5d70: 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74      4, "applicat
5d80: 69 6f 6e 2f 78 2d 66 6f 73 73 69 6c 2d 77 69 6b  ion/x-fossil-wik
5d90: 69 22 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  i"         },.  
5da0: 20 20 7b 20 22 77 6d 61 22 2c 20 20 20 20 20 20    { "wma",      
5db0: 20 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 6d 73    3, "audio/x-ms
5dc0: 2d 77 6d 61 22 20 20 20 20 20 20 20 20 20 20 20  -wma"           
5dd0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
5de0: 7b 20 22 77 6d 76 22 2c 20 20 20 20 20 20 20 20  { "wmv",        
5df0: 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 77  3, "video/x-ms-w
5e00: 6d 76 22 20 20 20 20 20 20 20 20 20 20 20 20 20  mv"             
5e10: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
5e20: 22 77 6d 78 22 2c 20 20 20 20 20 20 20 20 33 2c  "wmx",        3,
5e30: 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 77 6d 78   "video/x-ms-wmx
5e40: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
5e50: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77       },.    { "w
5e60: 72 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  rl",        3, "
5e70: 6d 6f 64 65 6c 2f 76 72 6d 6c 22 20 20 20 20 20  model/vrml"     
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e90: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 76 78     },.    { "wvx
5ea0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69  ",        3, "vi
5eb0: 64 65 6f 2f 78 2d 6d 73 2d 77 76 78 22 20 20 20  deo/x-ms-wvx"   
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ed0: 20 7d 2c 0a 20 20 20 20 7b 20 22 78 62 6d 22 2c   },.    { "xbm",
5ee0: 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67          3, "imag
5ef0: 65 2f 78 2d 78 62 69 74 6d 61 70 22 20 20 20 20  e/x-xbitmap"    
5f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
5f10: 2c 0a 20 20 20 20 7b 20 22 78 6c 63 22 2c 20 20  ,.    { "xlc",  
5f20: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
5f30: 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63  ation/vnd.ms-exc
5f40: 65 6c 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  el"          },.
5f50: 20 20 20 20 7b 20 22 78 6c 6c 22 2c 20 20 20 20      { "xll",    
5f60: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
5f70: 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c  ion/vnd.ms-excel
5f80: 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  "          },.  
5f90: 20 20 7b 20 22 78 6c 6d 22 2c 20 20 20 20 20 20    { "xlm",      
5fa0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
5fb0: 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20  n/vnd.ms-excel" 
5fc0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
5fd0: 7b 20 22 78 6c 73 22 2c 20 20 20 20 20 20 20 20  { "xls",        
5fe0: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
5ff0: 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20 20 20  vnd.ms-excel"   
6000: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
6010: 22 78 6c 77 22 2c 20 20 20 20 20 20 20 20 33 2c  "xlw",        3,
6020: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76 6e   "application/vn
6030: 64 2e 6d 73 2d 65 78 63 65 6c 22 20 20 20 20 20  d.ms-excel"     
6040: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78       },.    { "x
6050: 6d 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ml",        3, "
6060: 74 65 78 74 2f 78 6d 6c 22 20 20 20 20 20 20 20  text/xml"       
6070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6080: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 70 6d     },.    { "xpm
6090: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d  ",        3, "im
60a0: 61 67 65 2f 78 2d 78 70 69 78 6d 61 70 22 20 20  age/x-xpixmap"  
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60c0: 20 7d 2c 0a 20 20 20 20 7b 20 22 78 77 64 22 2c   },.    { "xwd",
60d0: 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67          3, "imag
60e0: 65 2f 78 2d 78 77 69 6e 64 6f 77 64 75 6d 70 22  e/x-xwindowdump"
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
6100: 2c 0a 20 20 20 20 7b 20 22 78 79 7a 22 2c 20 20  ,.    { "xyz",  
6110: 20 20 20 20 20 20 33 2c 20 22 63 68 65 6d 69 63        3, "chemic
6120: 61 6c 2f 78 2d 70 64 62 22 20 20 20 20 20 20 20  al/x-pdb"       
6130: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
6140: 20 20 20 20 7b 20 22 7a 69 70 22 2c 20 20 20 20      { "zip",    
6150: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
6160: 69 6f 6e 2f 7a 69 70 22 20 20 20 20 20 20 20 20  ion/zip"        
6170: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
6180: 7d 3b 0a 0a 20 20 66 6f 72 28 69 3d 6e 4e 61 6d  };..  for(i=nNam
6190: 65 2d 31 3b 20 69 3e 30 20 26 26 20 7a 4e 61 6d  e-1; i>0 && zNam
61a0: 65 5b 69 5d 21 3d 27 2e 27 3b 20 69 2d 2d 29 7b  e[i]!='.'; i--){
61b0: 7d 0a 20 20 7a 20 3d 20 26 7a 4e 61 6d 65 5b 69  }.  z = &zName[i
61c0: 2b 31 5d 3b 0a 20 20 6c 65 6e 20 3d 20 6e 4e 61  +1];.  len = nNa
61d0: 6d 65 20 2d 20 69 3b 0a 20 20 69 66 28 20 6c 65  me - i;.  if( le
61e0: 6e 3c 73 69 7a 65 6f 66 28 7a 53 75 66 66 69 78  n<sizeof(zSuffix
61f0: 29 2d 31 20 29 7b 0a 20 20 20 20 73 74 72 63 70  )-1 ){.    strcp
6200: 79 28 7a 53 75 66 66 69 78 2c 20 7a 29 3b 0a 20  y(zSuffix, z);. 
6210: 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 53 75 66     for(i=0; zSuf
6220: 66 69 78 5b 69 5d 3b 20 69 2b 2b 29 20 7a 53 75  fix[i]; i++) zSu
6230: 66 66 69 78 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65  ffix[i] = tolowe
6240: 72 28 7a 53 75 66 66 69 78 5b 69 5d 29 3b 0a 20  r(zSuffix[i]);. 
6250: 20 20 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20     first = 0;.  
6260: 20 20 6c 61 73 74 20 3d 20 73 69 7a 65 6f 66 28    last = sizeof(
6270: 61 4d 69 6d 65 29 2f 73 69 7a 65 6f 66 28 61 4d  aMime)/sizeof(aM
6280: 69 6d 65 5b 30 5d 29 3b 0a 20 20 20 20 77 68 69  ime[0]);.    whi
6290: 6c 65 28 20 66 69 72 73 74 3c 3d 6c 61 73 74 20  le( first<=last 
62a0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a  ){.      int c;.
62b0: 20 20 20 20 20 20 69 20 3d 20 28 66 69 72 73 74        i = (first
62c0: 2b 6c 61 73 74 29 2f 32 3b 0a 20 20 20 20 20 20  +last)/2;.      
62d0: 63 20 3d 20 73 74 72 63 6d 70 28 7a 53 75 66 66  c = strcmp(zSuff
62e0: 69 78 2c 20 61 4d 69 6d 65 5b 69 5d 2e 7a 53 75  ix, aMime[i].zSu
62f0: 66 66 69 78 29 3b 0a 20 20 20 20 20 20 69 66 28  ffix);.      if(
6300: 20 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61   c==0 ) return a
6310: 4d 69 6d 65 5b 69 5d 2e 7a 4d 69 6d 65 74 79 70  Mime[i].zMimetyp
6320: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30  e;.      if( c<0
6330: 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74   ){.        last
6340: 20 3d 20 69 2d 31 3b 0a 20 20 20 20 20 20 7d 65   = i-1;.      }e
6350: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 69 72  lse{.        fir
6360: 73 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20  st = i+1;.      
6370: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
6380: 74 75 72 6e 20 22 61 70 70 6c 69 63 61 74 69 6f  turn "applicatio
6390: 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22 3b  n/octet-stream";
63a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
63b0: 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 63 6f  llowing table co
63c0: 6e 74 61 69 6e 73 20 31 20 66 6f 72 20 61 6c 6c  ntains 1 for all
63d0: 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61 74   characters that
63e0: 20 61 72 65 20 70 65 72 6d 69 74 74 65 64 20 69   are permitted i
63f0: 6e 0a 2a 2a 20 74 68 65 20 70 61 72 74 20 6f 66  n.** the part of
6400: 20 74 68 65 20 55 52 4c 20 62 65 66 6f 72 65 20   the URL before 
6410: 74 68 65 20 71 75 65 72 79 20 70 61 72 61 6d 65  the query parame
6420: 74 65 72 73 20 61 6e 64 20 66 72 61 67 6d 65 6e  ters and fragmen
6430: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  t..*/.static con
6440: 73 74 20 63 68 61 72 20 61 6c 6c 6f 77 65 64 49  st char allowedI
6450: 6e 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  nName[] = {.    
6460: 20 20 2f 2a 20 20 78 30 20 20 78 31 20 20 78 32    /*  x0  x1  x2
6470: 20 20 78 33 20 20 78 34 20 20 78 35 20 20 78 36    x3  x4  x5  x6
6480: 20 20 78 37 20 20 78 38 20 20 78 39 20 20 78 61    x7  x8  x9  xa
6490: 20 20 78 62 20 20 78 63 20 20 78 64 20 20 78 65    xb  xc  xd  xe
64a0: 20 20 78 66 20 2a 2f 0a 2f 2a 20 30 78 20 2a 2f    xf */./* 0x */
64b0: 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30     0,  0,  0,  0
64c0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
64d0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
64e0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
64f0: 2c 0a 2f 2a 20 31 78 20 2a 2f 20 20 20 30 2c 20  ,./* 1x */   0, 
6500: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
6510: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
6520: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
6530: 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 32   0,  0,  0,./* 2
6540: 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30  x */   0,  0,  0
6550: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
6560: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
6570: 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  0,  1,  1,  1
6580: 2c 20 20 31 2c 0a 2f 2a 20 33 78 20 2a 2f 20 20  ,  1,./* 3x */  
6590: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
65a0: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
65b0: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 30 2c 20   1,  1,  1,  0, 
65c0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a   0,  0,  0,  0,.
65d0: 2f 2a 20 34 78 20 2a 2f 20 20 20 30 2c 20 20 31  /* 4x */   0,  1
65e0: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
65f0: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
6600: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
6610: 2c 20 20 31 2c 20 20 31 2c 0a 2f 2a 20 35 78 20  ,  1,  1,./* 5x 
6620: 2a 2f 20 20 20 31 2c 20 20 31 2c 20 20 31 2c 20  */   1,  1,  1, 
6630: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
6640: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
6650: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
6660: 20 31 2c 0a 2f 2a 20 36 78 20 2a 2f 20 20 20 30   1,./* 6x */   0
6670: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
6680: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
6690: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
66a0: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 0a 2f 2a  ,  1,  1,  1,./*
66b0: 20 37 78 20 2a 2f 20 20 20 31 2c 20 20 31 2c 20   7x */   1,  1, 
66c0: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
66d0: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
66e0: 20 31 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   1,  0,  0,  0, 
66f0: 20 31 2c 20 20 30 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a   1,  0,.};../*.*
6700: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70  * This routine p
6710: 72 6f 63 65 73 73 65 73 20 61 20 73 69 6e 67 6c  rocesses a singl
6720: 65 20 48 54 54 50 20 72 65 71 75 65 73 74 20 6f  e HTTP request o
6730: 6e 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74  n standard input
6740: 20 61 6e 64 0a 2a 2a 20 73 65 6e 64 73 20 74 68   and.** sends th
6750: 65 20 72 65 70 6c 79 20 74 6f 20 73 74 61 6e 64  e reply to stand
6760: 61 72 64 20 6f 75 74 70 75 74 2e 20 20 49 66 20  ard output.  If 
6770: 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  the argument is 
6780: 31 20 69 74 20 6d 65 61 6e 73 0a 2a 2a 20 74 68  1 it means.** th
6790: 61 74 20 77 65 20 61 72 65 20 73 68 6f 75 6c 64  at we are should
67a0: 20 63 6c 6f 73 65 20 74 68 65 20 73 6f 63 6b 65   close the socke
67b0: 74 20 77 69 74 68 6f 75 74 20 70 72 6f 63 65 73  t without proces
67c0: 73 69 6e 67 20 61 64 64 69 74 69 6f 6e 61 6c 0a  sing additional.
67d0: 2a 2a 20 48 54 54 50 20 72 65 71 75 65 73 74 73  ** HTTP requests
67e0: 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65   after the curre
67f0: 6e 74 20 72 65 71 75 65 73 74 20 66 69 6e 69 73  nt request finis
6800: 68 65 73 2e 20 20 30 20 6d 65 61 6e 73 20 77 65  hes.  0 means we
6810: 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20   are.** allowed 
6820: 74 6f 20 6b 65 65 70 20 74 68 65 20 63 6f 6e 6e  to keep the conn
6830: 65 63 74 69 6f 6e 20 6f 70 65 6e 20 61 6e 64 20  ection open and 
6840: 74 6f 20 70 72 6f 63 65 73 73 20 61 64 64 69 74  to process addit
6850: 69 6f 6e 61 6c 20 72 65 71 75 65 73 74 73 2e 0a  ional requests..
6860: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6870: 6d 61 79 20 63 68 6f 6f 73 65 20 74 6f 20 63 6c  may choose to cl
6880: 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ose the connecti
6890: 6f 6e 20 65 76 65 6e 20 69 66 20 74 68 65 20 61  on even if the a
68a0: 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 30 2e  rgument.** is 0.
68b0: 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 63  .** .** If the c
68c0: 6f 6e 6e 65 63 74 69 6f 6e 20 73 68 6f 75 6c 64  onnection should
68d0: 20 62 65 20 63 6c 6f 73 65 64 2c 20 74 68 69 73   be closed, this
68e0: 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 65   routine calls e
68f0: 78 69 74 28 29 20 61 6e 64 0a 2a 2a 20 74 68 75  xit() and.** thu
6900: 73 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73 2e  s never returns.
6910: 20 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e    If this routin
6920: 65 20 64 6f 65 73 20 72 65 74 75 72 6e 20 69 74  e does return it
6930: 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e 6f 74   means that anot
6940: 68 65 72 0a 2a 2a 20 48 54 54 50 20 72 65 71 75  her.** HTTP requ
6950: 65 73 74 20 6d 61 79 20 61 70 70 65 61 72 20 6f  est may appear o
6960: 6e 20 74 68 65 20 77 69 72 65 2e 0a 2a 2f 0a 76  n the wire..*/.v
6970: 6f 69 64 20 50 72 6f 63 65 73 73 4f 6e 65 52 65  oid ProcessOneRe
6980: 71 75 65 73 74 28 69 6e 74 20 66 6f 72 63 65 43  quest(int forceC
6990: 6c 6f 73 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20  lose){.  int i, 
69a0: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20  c;.  char *z;   
69b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
69c0: 2a 20 55 73 65 64 20 74 6f 20 70 61 72 73 65 20  * Used to parse 
69d0: 75 70 20 61 20 73 74 72 69 6e 67 20 2a 2f 0a 20  up a string */. 
69e0: 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61   struct stat sta
69f0: 74 62 75 66 3b 20 20 20 20 20 20 2f 2a 20 49 6e  tbuf;      /* In
6a00: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
6a10: 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 72  the file to be r
6a20: 65 74 72 69 65 76 65 64 20 2a 2f 0a 20 20 46 49  etrieved */.  FI
6a30: 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20  LE *in;         
6a40: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 72          /* For r
6a50: 65 61 64 69 6e 67 20 66 72 6f 6d 20 43 47 49 20  eading from CGI 
6a60: 73 63 72 69 70 74 73 20 2a 2f 0a 20 20 63 68 61  scripts */.  cha
6a70: 72 20 7a 4c 69 6e 65 5b 31 30 30 30 5d 3b 20 20  r zLine[1000];  
6a80: 20 20 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66         /* A buff
6a90: 65 72 20 66 6f 72 20 69 6e 70 75 74 20 6c 69 6e  er for input lin
6aa0: 65 73 20 6f 72 20 66 6f 72 6d 69 6e 67 20 6e 61  es or forming na
6ab0: 6d 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 61  mes */..  /* Cha
6ac0: 6e 67 65 20 64 69 72 65 63 74 6f 72 69 65 73 20  nge directories 
6ad0: 74 6f 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74  to the root of t
6ae0: 68 65 20 48 54 54 50 20 66 69 6c 65 73 79 73 74  he HTTP filesyst
6af0: 65 6d 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68  em.  */.  if( ch
6b00: 64 69 72 28 7a 52 6f 6f 74 5b 30 5d 20 3f 20 7a  dir(zRoot[0] ? z
6b10: 52 6f 6f 74 20 3a 20 22 2f 22 29 21 3d 30 20 29  Root : "/")!=0 )
6b20: 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b  {.    char zBuf[
6b30: 31 30 30 30 5d 3b 0a 20 20 20 20 4d 61 6c 66 75  1000];.    Malfu
6b40: 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c  nction(__LINE__,
6b50: 20 22 63 61 6e 6e 6f 74 20 63 68 64 69 72 20 74   "cannot chdir t
6b60: 6f 20 5b 25 73 5d 20 66 72 6f 6d 20 5b 25 73 5d  o [%s] from [%s]
6b70: 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 52 6f 6f  ",.         zRoo
6b80: 74 2c 20 67 65 74 63 77 64 28 7a 42 75 66 2c 39  t, getcwd(zBuf,9
6b90: 39 39 29 29 3b 0a 20 20 7d 0a 20 20 6e 52 65 71  99));.  }.  nReq
6ba0: 75 65 73 74 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20  uest++;..  /*.  
6bb0: 2a 2a 20 57 65 20 6d 75 73 74 20 72 65 63 65 69  ** We must recei
6bc0: 76 65 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65  ve a complete he
6bd0: 61 64 65 72 20 77 69 74 68 69 6e 20 31 35 20 73  ader within 15 s
6be0: 65 63 6f 6e 64 73 0a 20 20 2a 2f 0a 20 20 73 69  econds.  */.  si
6bf0: 67 6e 61 6c 28 53 49 47 41 4c 52 4d 2c 20 54 69  gnal(SIGALRM, Ti
6c00: 6d 65 6f 75 74 29 3b 0a 20 20 61 6c 61 72 6d 28  meout);.  alarm(
6c10: 31 35 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74  15);..  /* Get t
6c20: 68 65 20 66 69 72 73 74 20 6c 69 6e 65 20 6f 66  he first line of
6c30: 20 74 68 65 20 72 65 71 75 65 73 74 20 61 6e 64   the request and
6c40: 20 70 61 72 73 65 20 6f 75 74 20 74 68 65 0a 20   parse out the. 
6c50: 20 2a 2a 20 6d 65 74 68 6f 64 2c 20 74 68 65 20   ** method, the 
6c60: 73 63 72 69 70 74 20 61 6e 64 20 74 68 65 20 70  script and the p
6c70: 72 6f 74 6f 63 6f 6c 2e 0a 20 20 2a 2f 0a 20 20  rotocol..  */.  
6c80: 69 66 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c  if( fgets(zLine,
6c90: 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 73 74  sizeof(zLine),st
6ca0: 64 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65  din)==0 ){.    e
6cb0: 78 69 74 28 30 29 3b 0a 20 20 7d 0a 20 20 6f 6d  xit(0);.  }.  om
6cc0: 69 74 4c 6f 67 20 3d 20 30 3b 0a 20 20 6e 49 6e  itLog = 0;.  nIn
6cd0: 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 4c 69 6e 65   += strlen(zLine
6ce0: 29 3b 0a 20 20 7a 4d 65 74 68 6f 64 20 3d 20 53  );.  zMethod = S
6cf0: 74 72 44 75 70 28 47 65 74 46 69 72 73 74 45 6c  trDup(GetFirstEl
6d00: 65 6d 65 6e 74 28 7a 4c 69 6e 65 2c 26 7a 29 29  ement(zLine,&z))
6d10: 3b 0a 20 20 7a 52 65 61 6c 53 63 72 69 70 74 20  ;.  zRealScript 
6d20: 3d 20 7a 53 63 72 69 70 74 20 3d 20 53 74 72 44  = zScript = StrD
6d30: 75 70 28 47 65 74 46 69 72 73 74 45 6c 65 6d 65  up(GetFirstEleme
6d40: 6e 74 28 7a 2c 26 7a 29 29 3b 0a 20 20 7a 50 72  nt(z,&z));.  zPr
6d50: 6f 74 6f 63 6f 6c 20 3d 20 53 74 72 44 75 70 28  otocol = StrDup(
6d60: 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28  GetFirstElement(
6d70: 7a 2c 26 7a 29 29 3b 0a 20 20 69 66 28 20 7a 50  z,&z));.  if( zP
6d80: 72 6f 74 6f 63 6f 6c 3d 3d 30 20 7c 7c 20 73 74  rotocol==0 || st
6d90: 72 6e 63 6d 70 28 7a 50 72 6f 74 6f 63 6f 6c 2c  rncmp(zProtocol,
6da0: 22 48 54 54 50 2f 22 2c 35 29 21 3d 30 20 7c 7c  "HTTP/",5)!=0 ||
6db0: 20 73 74 72 6c 65 6e 28 7a 50 72 6f 74 6f 63 6f   strlen(zProtoco
6dc0: 6c 29 21 3d 38 20 29 7b 0a 20 20 20 20 53 74 61  l)!=8 ){.    Sta
6dd0: 72 74 52 65 73 70 6f 6e 73 65 28 22 34 30 30 20  rtResponse("400 
6de0: 42 61 64 20 52 65 71 75 65 73 74 22 29 3b 0a 20  Bad Request");. 
6df0: 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74     nOut += print
6e00: 66 28 0a 20 20 20 20 20 20 22 43 6f 6e 74 65 6e  f(.      "Conten
6e10: 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 68 74 6d  t-type: text/htm
6e20: 6c 5c 72 5c 6e 22 0a 20 20 20 20 20 20 22 5c 72  l\r\n".      "\r
6e30: 5c 6e 22 0a 20 20 20 20 20 20 22 3c 74 69 74 6c  \n".      "<titl
6e40: 65 3e 55 6e 6b 6e 6f 77 6e 20 50 72 6f 74 6f 63  e>Unknown Protoc
6e50: 6f 6c 20 4f 6e 20 48 54 54 50 20 52 65 71 75 65  ol On HTTP Reque
6e60: 73 74 3c 2f 74 69 74 6c 65 3e 5c 6e 22 0a 20 20  st</title>\n".  
6e70: 20 20 20 20 22 3c 68 31 3e 55 6e 6b 6e 6f 77 6e      "<h1>Unknown
6e80: 20 50 72 6f 74 6f 63 6f 6c 3c 2f 68 31 3e 5c 6e   Protocol</h1>\n
6e90: 22 0a 20 20 20 20 20 20 22 54 68 69 73 20 73 65  ".      "This se
6ea0: 72 76 65 72 20 64 6f 65 73 20 6e 6f 74 20 75 6e  rver does not un
6eb0: 64 65 72 73 74 61 6e 64 20 74 68 65 20 72 65 71  derstand the req
6ec0: 75 65 73 74 65 64 20 70 72 6f 74 6f 63 6f 6c 5c  uested protocol\
6ed0: 6e 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 4d 61  n".    );.    Ma
6ee0: 6b 65 4c 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20  keLogEntry(0);. 
6ef0: 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20 7d 0a     exit(0);.  }.
6f00: 20 20 69 66 28 20 66 6f 72 63 65 43 6c 6f 73 65    if( forceClose
6f10: 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 43 6f 6e   ){.    closeCon
6f20: 6e 65 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d  nection = 1;.  }
6f30: 65 6c 73 65 20 69 66 28 20 7a 50 72 6f 74 6f 63  else if( zProtoc
6f40: 6f 6c 5b 35 5d 3c 27 31 27 20 7c 7c 20 7a 50 72  ol[5]<'1' || zPr
6f50: 6f 74 6f 63 6f 6c 5b 37 5d 3c 27 31 27 20 29 7b  otocol[7]<'1' ){
6f60: 0a 20 20 20 20 63 6c 6f 73 65 43 6f 6e 6e 65 63  .    closeConnec
6f70: 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  tion = 1;.  }.. 
6f80: 20 2f 2a 20 54 68 69 73 20 76 65 72 79 20 73 69   /* This very si
6f90: 6d 70 6c 65 20 73 65 72 76 65 72 20 6f 6e 6c 79  mple server only
6fa0: 20 75 6e 64 65 72 73 74 61 6e 64 73 20 74 68 65   understands the
6fb0: 20 47 45 54 2c 20 50 4f 53 54 0a 20 20 2a 2a 20   GET, POST.  ** 
6fc0: 61 6e 64 20 48 45 41 44 20 6d 65 74 68 6f 64 73  and HEAD methods
6fd0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 72 63  .  */.  if( strc
6fe0: 6d 70 28 7a 4d 65 74 68 6f 64 2c 22 47 45 54 22  mp(zMethod,"GET"
6ff0: 29 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a  )!=0 && strcmp(z
7000: 4d 65 74 68 6f 64 2c 22 50 4f 53 54 22 29 21 3d  Method,"POST")!=
7010: 30 0a 20 20 20 20 20 20 20 26 26 20 73 74 72 63  0.       && strc
7020: 6d 70 28 7a 4d 65 74 68 6f 64 2c 22 48 45 41 44  mp(zMethod,"HEAD
7030: 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 53 74 61  ")!=0 ){.    Sta
7040: 72 74 52 65 73 70 6f 6e 73 65 28 22 35 30 31 20  rtResponse("501 
7050: 4e 6f 74 20 49 6d 70 6c 65 6d 65 6e 74 65 64 22  Not Implemented"
7060: 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70  );.    nOut += p
7070: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22 43 6f  rintf(.      "Co
7080: 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74  ntent-type: text
7090: 2f 68 74 6d 6c 5c 72 5c 6e 22 0a 20 20 20 20 20  /html\r\n".     
70a0: 20 22 5c 72 5c 6e 22 0a 20 20 20 20 20 20 22 3c   "\r\n".      "<
70b0: 68 65 61 64 3e 3c 74 69 74 6c 65 3e 4d 65 74 68  head><title>Meth
70c0: 6f 64 20 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74  od not implement
70d0: 65 64 3c 2f 74 69 74 6c 65 3e 3c 2f 68 65 61 64  ed</title></head
70e0: 3e 5c 6e 22 0a 20 20 20 20 20 20 22 3c 62 6f 64  >\n".      "<bod
70f0: 79 3e 3c 68 31 3e 4d 65 74 68 6f 64 20 6e 6f 74  y><h1>Method not
7100: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 3c 2f 68 31   implemented</h1
7110: 3e 5c 6e 22 0a 20 20 20 20 20 20 22 54 68 65 20  >\n".      "The 
7120: 25 73 20 6d 65 74 68 6f 64 20 69 73 20 6e 6f 74  %s method is not
7130: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 6f 6e 20   implemented on 
7140: 74 68 69 73 20 73 65 72 76 65 72 2e 5c 6e 22 20  this server.\n" 
7150: 0a 20 20 20 20 20 20 22 3c 2f 62 6f 64 79 3e 5c  .      "</body>\
7160: 6e 22 2c 0a 20 20 20 20 20 20 7a 4d 65 74 68 6f  n",.      zMetho
7170: 64 29 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f 67 45  d);.    MakeLogE
7180: 6e 74 72 79 28 30 29 3b 0a 20 20 20 20 65 78 69  ntry(0);.    exi
7190: 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  t(0);.  }..  /* 
71a0: 47 65 74 20 61 6c 6c 20 74 68 65 20 6f 70 74 69  Get all the opti
71b0: 6f 6e 61 6c 20 66 69 65 6c 64 73 20 74 68 61 74  onal fields that
71c0: 20 66 6f 6c 6c 6f 77 20 74 68 65 20 66 69 72 73   follow the firs
71d0: 74 20 6c 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 7a  t line..  */.  z
71e0: 43 6f 6f 6b 69 65 20 3d 20 30 3b 0a 20 20 77 68  Cookie = 0;.  wh
71f0: 69 6c 65 28 20 66 67 65 74 73 28 7a 4c 69 6e 65  ile( fgets(zLine
7200: 2c 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 73  ,sizeof(zLine),s
7210: 74 64 69 6e 29 20 29 7b 0a 20 20 20 20 63 68 61  tdin) ){.    cha
7220: 72 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 3b 0a 20  r *zFieldName;. 
7230: 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 0a     char *zVal;..
7240: 20 20 20 20 6e 49 6e 20 2b 3d 20 73 74 72 6c 65      nIn += strle
7250: 6e 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 7a 46  n(zLine);.    zF
7260: 69 65 6c 64 4e 61 6d 65 20 3d 20 47 65 74 46 69  ieldName = GetFi
7270: 72 73 74 45 6c 65 6d 65 6e 74 28 7a 4c 69 6e 65  rstElement(zLine
7280: 2c 26 7a 56 61 6c 29 3b 0a 20 20 20 20 69 66 28  ,&zVal);.    if(
7290: 20 7a 46 69 65 6c 64 4e 61 6d 65 3d 3d 30 20 7c   zFieldName==0 |
72a0: 7c 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 3d 3d 30  | *zFieldName==0
72b0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 52 65   ) break;.    Re
72c0: 6d 6f 76 65 4e 65 77 6c 69 6e 65 28 7a 56 61 6c  moveNewline(zVal
72d0: 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 61  );.    if( strca
72e0: 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65  secmp(zFieldName
72f0: 2c 22 55 73 65 72 2d 41 67 65 6e 74 3a 22 29 3d  ,"User-Agent:")=
7300: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 41 67 65  =0 ){.      zAge
7310: 6e 74 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c  nt = StrDup(zVal
7320: 29 3b 0a 20 20 20 20 20 20 46 69 78 75 70 55 73  );.      FixupUs
7330: 65 72 41 67 65 6e 74 28 29 3b 0a 20 20 20 20 7d  erAgent();.    }
7340: 65 6c 73 65 20 69 66 28 20 73 74 72 63 61 73 65  else if( strcase
7350: 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22  cmp(zFieldName,"
7360: 41 63 63 65 70 74 3a 22 29 3d 3d 30 20 29 7b 0a  Accept:")==0 ){.
7370: 20 20 20 20 20 20 7a 41 63 63 65 70 74 20 3d 20        zAccept = 
7380: 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20  StrDup(zVal);.  
7390: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
73a0: 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d  asecmp(zFieldNam
73b0: 65 2c 22 43 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74  e,"Content-lengt
73c0: 68 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  h:")==0 ){.     
73d0: 20 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 20   zContentLength 
73e0: 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a  = StrDup(zVal);.
73f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
7400: 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e  rcasecmp(zFieldN
7410: 61 6d 65 2c 22 43 6f 6e 74 65 6e 74 2d 74 79 70  ame,"Content-typ
7420: 65 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  e:")==0 ){.     
7430: 20 7a 43 6f 6e 74 65 6e 74 54 79 70 65 20 3d 20   zContentType = 
7440: 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20  StrDup(zVal);.  
7450: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
7460: 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d  asecmp(zFieldNam
7470: 65 2c 22 52 65 66 65 72 65 72 3a 22 29 3d 3d 30  e,"Referer:")==0
7480: 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 66 65 72   ){.      zRefer
7490: 65 72 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c  er = StrDup(zVal
74a0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
74b0: 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65   strcasecmp(zFie
74c0: 6c 64 4e 61 6d 65 2c 22 43 6f 6f 6b 69 65 3a 22  ldName,"Cookie:"
74d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 43  )==0 ){.      zC
74e0: 6f 6f 6b 69 65 20 3d 20 53 74 72 41 70 70 65 6e  ookie = StrAppen
74f0: 64 28 7a 43 6f 6f 6b 69 65 2c 22 3b 20 22 2c 7a  d(zCookie,"; ",z
7500: 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Val);.    }else 
7510: 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a  if( strcasecmp(z
7520: 46 69 65 6c 64 4e 61 6d 65 2c 22 43 6f 6e 6e 65  FieldName,"Conne
7530: 63 74 69 6f 6e 3a 22 29 3d 3d 30 20 29 7b 0a 20  ction:")==0 ){. 
7540: 20 20 20 20 20 69 66 28 20 73 74 72 63 61 73 65       if( strcase
7550: 63 6d 70 28 7a 56 61 6c 2c 22 63 6c 6f 73 65 22  cmp(zVal,"close"
7560: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
7570: 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20  closeConnection 
7580: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
7590: 20 69 66 28 20 21 66 6f 72 63 65 43 6c 6f 73 65   if( !forceClose
75a0: 20 26 26 20 73 74 72 63 61 73 65 63 6d 70 28 7a   && strcasecmp(z
75b0: 56 61 6c 2c 20 22 6b 65 65 70 2d 61 6c 69 76 65  Val, "keep-alive
75c0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
75d0: 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e   closeConnection
75e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
75f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
7600: 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d  asecmp(zFieldNam
7610: 65 2c 22 48 6f 73 74 3a 22 29 3d 3d 30 20 29 7b  e,"Host:")==0 ){
7620: 0a 20 20 20 20 20 20 7a 53 65 72 76 65 72 50 6f  .      zServerPo
7630: 72 74 20 3d 20 7a 53 65 72 76 65 72 4e 61 6d 65  rt = zServerName
7640: 20 3d 20 7a 48 74 74 70 48 6f 73 74 20 3d 20 53   = zHttpHost = S
7650: 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20  trDup(zVal);.   
7660: 20 20 20 77 68 69 6c 65 28 20 7a 53 65 72 76 65     while( zServe
7670: 72 50 6f 72 74 20 26 26 20 2a 7a 53 65 72 76 65  rPort && *zServe
7680: 72 50 6f 72 74 20 26 26 20 2a 7a 53 65 72 76 65  rPort && *zServe
7690: 72 50 6f 72 74 21 3d 27 3a 27 20 29 7b 0a 20 20  rPort!=':' ){.  
76a0: 20 20 20 20 20 20 7a 53 65 72 76 65 72 50 6f 72        zServerPor
76b0: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
76c0: 20 20 20 69 66 28 20 7a 53 65 72 76 65 72 50 6f     if( zServerPo
76d0: 72 74 20 26 26 20 2a 7a 53 65 72 76 65 72 50 6f  rt && *zServerPo
76e0: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 7a  rt ){.        *z
76f0: 53 65 72 76 65 72 50 6f 72 74 20 3d 20 30 3b 0a  ServerPort = 0;.
7700: 20 20 20 20 20 20 20 20 7a 53 65 72 76 65 72 50          zServerP
7710: 6f 72 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ort++;.      }. 
7720: 20 20 20 20 20 69 66 28 20 7a 52 65 61 6c 50 6f       if( zRealPo
7730: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53  rt ){.        zS
7740: 65 72 76 65 72 50 6f 72 74 20 3d 20 53 74 72 44  erverPort = StrD
7750: 75 70 28 7a 52 65 61 6c 50 6f 72 74 29 3b 0a 20  up(zRealPort);. 
7760: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7770: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 6e 20 65  ..  /* Make an e
7780: 78 74 72 61 20 65 66 66 6f 72 74 20 74 6f 20 67  xtra effort to g
7790: 65 74 20 61 20 76 61 6c 69 64 20 73 65 72 76 65  et a valid serve
77a0: 72 20 6e 61 6d 65 20 61 6e 64 20 70 6f 72 74 20  r name and port 
77b0: 6e 75 6d 62 65 72 2e 0a 20 20 2a 2a 20 4f 6e 6c  number..  ** Onl
77c0: 79 20 4e 65 74 73 63 61 70 65 20 70 72 6f 76 69  y Netscape provi
77d0: 64 65 73 20 74 68 69 73 20 69 6e 66 6f 72 6d 61  des this informa
77e0: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 62 72  tion.  If the br
77f0: 6f 77 73 65 72 20 69 73 0a 20 20 2a 2a 20 49 6e  owser is.  ** In
7800: 74 65 72 6e 65 74 20 45 78 70 6c 6f 72 65 72 2c  ternet Explorer,
7810: 20 74 68 65 6e 20 77 65 20 68 61 76 65 20 74 6f   then we have to
7820: 20 66 69 6e 64 20 6f 75 74 20 74 68 65 20 69 6e   find out the in
7830: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 0a 20 20  formation for.  
7840: 2a 2a 20 6f 75 72 73 65 6c 76 65 73 2e 0a 20 20  ** ourselves..  
7850: 2a 2f 0a 20 20 69 66 28 20 7a 53 65 72 76 65 72  */.  if( zServer
7860: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  Name==0 ){.    z
7870: 53 65 72 76 65 72 4e 61 6d 65 20 3d 20 53 61 66  ServerName = Saf
7880: 65 4d 61 6c 6c 6f 63 28 20 31 30 30 20 29 3b 0a  eMalloc( 100 );.
7890: 20 20 20 20 67 65 74 68 6f 73 74 6e 61 6d 65 28      gethostname(
78a0: 7a 53 65 72 76 65 72 4e 61 6d 65 2c 31 30 30 29  zServerName,100)
78b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 53 65 72  ;.  }.  if( zSer
78c0: 76 65 72 50 6f 72 74 3d 3d 30 20 7c 7c 20 2a 7a  verPort==0 || *z
78d0: 53 65 72 76 65 72 50 6f 72 74 3d 3d 30 20 29 7b  ServerPort==0 ){
78e0: 0a 20 20 20 20 7a 53 65 72 76 65 72 50 6f 72 74  .    zServerPort
78f0: 20 3d 20 44 45 46 41 55 4c 54 5f 50 4f 52 54 3b   = DEFAULT_PORT;
7900: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  .  }..  /* Remov
7910: 65 20 74 68 65 20 71 75 65 72 79 20 73 74 72 69  e the query stri
7920: 6e 67 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  ng from the end 
7930: 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  of the requested
7940: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f   file..  */.  fo
7950: 72 28 7a 3d 7a 53 63 72 69 70 74 3b 20 2a 7a 20  r(z=zScript; *z 
7960: 26 26 20 2a 7a 21 3d 27 3f 27 3b 20 7a 2b 2b 29  && *z!='?'; z++)
7970: 7b 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 3f 27  {}.  if( *z=='?'
7980: 20 29 7b 0a 20 20 20 20 7a 51 75 65 72 79 53 75   ){.    zQuerySu
7990: 66 66 69 78 20 3d 20 53 74 72 44 75 70 28 7a 29  ffix = StrDup(z)
79a0: 3b 0a 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20  ;.    *z = 0;.  
79b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 51 75 65 72  }else{.    zQuer
79c0: 79 53 75 66 66 69 78 20 3d 20 22 22 3b 0a 20 20  ySuffix = "";.  
79d0: 7d 0a 20 20 7a 51 75 65 72 79 53 74 72 69 6e 67  }.  zQueryString
79e0: 20 3d 20 2a 7a 51 75 65 72 79 53 75 66 66 69 78   = *zQuerySuffix
79f0: 20 3f 20 26 7a 51 75 65 72 79 53 75 66 66 69 78   ? &zQuerySuffix
7a00: 5b 31 5d 20 3a 20 7a 51 75 65 72 79 53 75 66 66  [1] : zQuerySuff
7a10: 69 78 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65  ix;..  /* Create
7a20: 20 61 20 66 69 6c 65 20 74 6f 20 68 6f 6c 64 20   a file to hold 
7a30: 74 68 65 20 50 4f 53 54 20 71 75 65 72 79 20 64  the POST query d
7a40: 61 74 61 2c 20 69 66 20 61 6e 79 2e 20 20 57 65  ata, if any.  We
7a50: 20 68 61 76 65 20 74 6f 0a 20 20 2a 2a 20 64 6f   have to.  ** do
7a60: 20 69 74 20 74 68 69 73 20 77 61 79 2e 20 20 57   it this way.  W
7a70: 65 20 63 61 6e 27 74 20 6a 75 73 74 20 70 61 73  e can't just pas
7a80: 73 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  s the file descr
7a90: 69 70 74 6f 72 20 64 6f 77 6e 20 74 6f 0a 20 20  iptor down to.  
7aa0: 2a 2a 20 74 68 65 20 63 68 69 6c 64 20 70 72 6f  ** the child pro
7ab0: 63 65 73 73 20 62 65 63 61 75 73 65 20 74 68 65  cess because the
7ac0: 20 66 67 65 74 73 28 29 20 66 75 6e 63 74 69 6f   fgets() functio
7ad0: 6e 20 6d 61 79 20 68 61 76 65 20 61 6c 72 65 61  n may have alrea
7ae0: 64 79 0a 20 20 2a 2a 20 72 65 61 64 20 70 61 72  dy.  ** read par
7af0: 74 20 6f 66 20 74 68 65 20 50 4f 53 54 20 64 61  t of the POST da
7b00: 74 61 20 69 6e 74 6f 20 69 74 73 20 69 6e 74 65  ta into its inte
7b10: 72 6e 61 6c 20 62 75 66 66 65 72 2e 0a 20 20 2a  rnal buffer..  *
7b20: 2f 0a 20 20 69 66 28 20 7a 4d 65 74 68 6f 64 5b  /.  if( zMethod[
7b30: 30 5d 3d 3d 27 50 27 20 26 26 20 7a 43 6f 6e 74  0]=='P' && zCont
7b40: 65 6e 74 4c 65 6e 67 74 68 21 3d 30 20 29 7b 0a  entLength!=0 ){.
7b50: 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 61 74      int len = at
7b60: 6f 69 28 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67 74  oi(zContentLengt
7b70: 68 29 3b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75  h);.    FILE *ou
7b80: 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 42 75  t;.    char *zBu
7b90: 66 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20  f;.    int n;.. 
7ba0: 20 20 20 69 66 28 20 6c 65 6e 3e 4d 41 58 5f 43     if( len>MAX_C
7bb0: 4f 4e 54 45 4e 54 5f 4c 45 4e 47 54 48 20 29 7b  ONTENT_LENGTH ){
7bc0: 0a 20 20 20 20 20 20 53 74 61 72 74 52 65 73 70  .      StartResp
7bd0: 6f 6e 73 65 28 22 35 30 30 20 52 65 71 75 65 73  onse("500 Reques
7be0: 74 20 74 6f 6f 20 6c 61 72 67 65 22 29 3b 0a 20  t too large");. 
7bf0: 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69       nOut += pri
7c00: 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 43 6f  ntf(.        "Co
7c10: 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74  ntent-type: text
7c20: 2f 68 74 6d 6c 5c 72 5c 6e 22 0a 20 20 20 20 20  /html\r\n".     
7c30: 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 20 20     "\r\n".      
7c40: 20 20 22 54 6f 6f 20 6d 75 63 68 20 50 4f 53 54    "Too much POST
7c50: 20 64 61 74 61 5c 6e 22 0a 20 20 20 20 20 20 20   data\n".       
7c60: 20 22 3c 2f 62 6f 64 79 3e 5c 6e 22 0a 20 20 20   "</body>\n".   
7c70: 20 20 20 29 3b 0a 20 20 20 20 20 20 4d 61 6b 65     );.      Make
7c80: 4c 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20 20 20  LogEntry(0);.   
7c90: 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20 20 20     exit(0);.    
7ca0: 7d 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 54  }.    sprintf(zT
7cb0: 6d 70 4e 61 6d 42 75 66 2c 20 22 2f 74 6d 70 2f  mpNamBuf, "/tmp/
7cc0: 2d 70 6f 73 74 2d 64 61 74 61 2d 58 58 58 58 58  -post-data-XXXXX
7cd0: 58 22 29 3b 0a 20 20 20 20 7a 54 6d 70 4e 61 6d  X");.    zTmpNam
7ce0: 20 3d 20 7a 54 6d 70 4e 61 6d 42 75 66 3b 0a 20   = zTmpNamBuf;. 
7cf0: 20 20 20 6d 6b 73 74 65 6d 70 28 7a 54 6d 70 4e     mkstemp(zTmpN
7d00: 61 6d 29 3b 0a 20 20 20 20 6f 75 74 20 3d 20 66  am);.    out = f
7d10: 6f 70 65 6e 28 7a 54 6d 70 4e 61 6d 2c 22 77 22  open(zTmpNam,"w"
7d20: 29 3b 0a 20 20 20 20 7a 42 75 66 20 3d 20 53 61  );.    zBuf = Sa
7d30: 66 65 4d 61 6c 6c 6f 63 28 20 6c 65 6e 20 29 3b  feMalloc( len );
7d40: 0a 20 20 20 20 61 6c 61 72 6d 28 31 35 20 2b 20  .    alarm(15 + 
7d50: 6c 65 6e 2f 32 30 30 30 29 3b 0a 20 20 20 20 6e  len/2000);.    n
7d60: 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 31 2c   = fread(zBuf,1,
7d70: 6c 65 6e 2c 73 74 64 69 6e 29 3b 0a 20 20 20 20  len,stdin);.    
7d80: 6e 49 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 66 77  nIn += n;.    fw
7d90: 72 69 74 65 28 7a 42 75 66 2c 31 2c 6e 2c 6f 75  rite(zBuf,1,n,ou
7da0: 74 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 42 75  t);.    free(zBu
7db0: 66 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 6f  f);.    fclose(o
7dc0: 75 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  ut);.  }..  /* M
7dd0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 72 75 6e  ake sure the run
7de0: 6e 69 6e 67 20 74 69 6d 65 20 69 73 20 6e 6f 74  ning time is not
7df0: 20 74 6f 6f 20 67 72 65 61 74 20 2a 2f 0a 20 20   too great */.  
7e00: 61 6c 61 72 6d 28 31 30 29 3b 0a 0a 20 20 2f 2a  alarm(10);..  /*
7e10: 20 43 6f 6e 76 65 72 74 20 61 6c 6c 20 75 6e 75   Convert all unu
7e20: 73 75 61 6c 20 63 68 61 72 61 63 74 65 72 73 20  sual characters 
7e30: 69 6e 20 74 68 65 20 73 63 72 69 70 74 20 6e 61  in the script na
7e40: 6d 65 20 69 6e 74 6f 20 22 5f 22 2e 0a 20 20 2a  me into "_"..  *
7e50: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61  *.  ** This is a
7e60: 20 64 65 66 65 6e 73 65 20 61 67 61 69 6e 73 74   defense against
7e70: 20 76 61 72 69 6f 75 73 20 61 74 74 61 63 6b 73   various attacks
7e80: 2c 20 58 53 53 20 61 74 74 61 63 6b 73 20 69 6e  , XSS attacks in
7e90: 20 70 61 72 74 69 63 75 6c 61 72 2e 0a 20 20 2a   particular..  *
7ea0: 2f 0a 20 20 66 6f 72 28 7a 3d 7a 53 63 72 69 70  /.  for(z=zScrip
7eb0: 74 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20  t; *z; z++){.   
7ec0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
7ed0: 20 3d 20 2a 28 75 6e 73 69 67 6e 65 64 20 63 68   = *(unsigned ch
7ee0: 61 72 2a 29 7a 3b 0a 20 20 20 20 69 66 28 20 28  ar*)z;.    if( (
7ef0: 63 26 30 78 38 30 29 21 3d 30 20 7c 7c 20 21 61  c&0x80)!=0 || !a
7f00: 6c 6c 6f 77 65 64 49 6e 4e 61 6d 65 5b 63 5d 20  llowedInName[c] 
7f10: 29 7b 0a 20 20 20 20 20 20 2a 7a 20 3d 20 27 5f  ){.      *z = '_
7f20: 27 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  ';.      if( c==
7f30: 27 25 27 20 26 26 20 7a 5b 31 5d 21 3d 30 20 26  '%' && z[1]!=0 &
7f40: 26 20 7a 5b 32 5d 21 3d 30 20 29 7b 0a 20 20 20  & z[2]!=0 ){.   
7f50: 20 20 20 20 20 66 6f 72 28 69 3d 33 3b 20 28 7a       for(i=3; (z
7f60: 5b 69 2d 32 5d 20 3d 20 7a 5b 69 5d 29 21 3d 30  [i-2] = z[i])!=0
7f70: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 7d  ; i++){}.      }
7f80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
7f90: 20 44 6f 6e 27 74 20 61 6c 6c 6f 77 20 22 2f 2e   Don't allow "/.
7fa0: 22 20 6f 72 20 22 2f 2d 22 20 74 6f 20 74 6f 20  " or "/-" to to 
7fb0: 6f 63 63 75 72 20 61 6e 79 77 68 65 72 65 20 69  occur anywhere i
7fc0: 6e 20 74 68 65 20 65 6e 74 69 74 79 20 6e 61 6d  n the entity nam
7fd0: 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 65  e..  ** This pre
7fe0: 76 65 6e 74 73 20 61 74 74 61 63 6b 73 20 69 6e  vents attacks in
7ff0: 76 6f 6c 76 69 6e 67 20 22 2e 2e 22 20 61 6e 64  volving ".." and
8000: 20 61 6c 73 6f 20 61 6c 6c 6f 77 73 20 75 73 20   also allows us 
8010: 74 6f 20 63 72 65 61 74 65 0a 20 20 2a 2a 20 66  to create.  ** f
8020: 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f  iles and directo
8030: 72 69 65 73 20 77 68 6f 73 65 20 6e 61 6d 65 73  ries whose names
8040: 20 62 65 67 69 6e 20 77 69 74 68 20 22 2d 22 20   begin with "-" 
8050: 77 68 69 63 68 20 61 72 65 20 69 6e 76 69 73 69  which are invisi
8060: 62 6c 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ble.  ** to the 
8070: 77 65 62 73 65 72 76 65 72 2e 0a 20 20 2a 2f 0a  webserver..  */.
8080: 20 20 66 6f 72 28 7a 3d 7a 53 63 72 69 70 74 3b    for(z=zScript;
8090: 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 69   *z; z++){.    i
80a0: 66 28 20 2a 7a 3d 3d 27 2f 27 20 26 26 20 28 7a  f( *z=='/' && (z
80b0: 5b 31 5d 3d 3d 27 2e 27 20 7c 7c 20 7a 5b 31 5d  [1]=='.' || z[1]
80c0: 3d 3d 27 2d 27 29 20 29 7b 0a 20 20 20 20 20 20  =='-') ){.      
80d0: 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45   NotFound(__LINE
80e0: 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  __);.    }.  }..
80f0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
8100: 77 68 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66  what the root of
8110: 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20   the filesystem 
8120: 73 68 6f 75 6c 64 20 62 65 2e 20 20 49 66 20 74  should be.  If t
8130: 68 65 0a 20 20 2a 2a 20 48 54 54 50 5f 48 4f 53  he.  ** HTTP_HOS
8140: 54 20 70 61 72 61 6d 65 74 65 72 20 65 78 69 73  T parameter exis
8150: 74 73 20 28 73 74 6f 72 65 64 20 69 6e 20 7a 48  ts (stored in zH
8160: 74 74 70 48 6f 73 74 29 20 74 68 65 6e 20 72 65  ttpHost) then re
8170: 6d 6f 76 65 20 74 68 65 0a 20 20 2a 2a 20 70 6f  move the.  ** po
8180: 72 74 20 6e 75 6d 62 65 72 20 66 72 6f 6d 20 74  rt number from t
8190: 68 65 20 65 6e 64 20 28 69 66 20 61 6e 79 29 2c  he end (if any),
81a0: 20 63 6f 6e 76 65 72 74 20 61 6c 6c 20 63 68 61   convert all cha
81b0: 72 61 63 74 65 72 73 20 74 6f 20 6c 6f 77 65 72  racters to lower
81c0: 0a 20 20 2a 2a 20 63 61 73 65 2c 20 61 6e 64 20  .  ** case, and 
81d0: 63 6f 6e 76 65 72 74 20 61 6c 6c 20 22 2e 22 20  convert all "." 
81e0: 74 6f 20 22 5f 22 2e 20 20 54 68 65 6e 20 74 72  to "_".  Then tr
81f0: 79 20 74 6f 20 66 69 6e 64 20 61 20 64 69 72 65  y to find a dire
8200: 63 74 6f 72 79 0a 20 20 2a 2a 20 77 69 74 68 20  ctory.  ** with 
8210: 74 68 61 74 20 6e 61 6d 65 20 61 6e 64 20 74 68  that name and th
8220: 65 20 65 78 74 65 6e 73 69 6f 6e 20 2e 77 65 62  e extension .web
8230: 73 69 74 65 2e 20 20 49 66 20 6e 6f 74 20 66 6f  site.  If not fo
8240: 75 6e 64 2c 20 6c 6f 6f 6b 0a 20 20 2a 2a 20 66  und, look.  ** f
8250: 6f 72 20 22 64 65 66 61 75 6c 74 2e 77 65 62 73  or "default.webs
8260: 69 74 65 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ite"..  */.  if(
8270: 20 7a 53 63 72 69 70 74 5b 30 5d 21 3d 27 2f 27   zScript[0]!='/'
8280: 20 29 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49   ) NotFound(__LI
8290: 4e 45 5f 5f 29 3b 0a 20 20 69 66 28 20 73 74 72  NE__);.  if( str
82a0: 6c 65 6e 28 7a 52 6f 6f 74 29 2b 34 30 20 3e 3d  len(zRoot)+40 >=
82b0: 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 20 29   sizeof(zLine) )
82c0: 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45   NotFound(__LINE
82d0: 5f 5f 29 3b 0a 20 20 69 66 28 20 7a 48 74 74 70  __);.  if( zHttp
82e0: 48 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Host==0 ){.    s
82f0: 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 25  printf(zLine, "%
8300: 73 2f 64 65 66 61 75 6c 74 2e 77 65 62 73 69 74  s/default.websit
8310: 65 22 2c 20 7a 52 6f 6f 74 29 3b 0a 20 20 7d 65  e", zRoot);.  }e
8320: 6c 73 65 20 69 66 28 20 73 74 72 6c 65 6e 28 7a  lse if( strlen(z
8330: 48 74 74 70 48 6f 73 74 29 2b 73 74 72 6c 65 6e  HttpHost)+strlen
8340: 28 7a 52 6f 6f 74 29 2b 31 30 20 3e 3d 20 73 69  (zRoot)+10 >= si
8350: 7a 65 6f 66 28 7a 4c 69 6e 65 29 20 29 7b 0a 20  zeof(zLine) ){. 
8360: 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49     NotFound(__LI
8370: 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NE__);.  }else{.
8380: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e      sprintf(zLin
8390: 65 2c 20 22 25 73 2f 25 73 22 2c 20 7a 52 6f 6f  e, "%s/%s", zRoo
83a0: 74 2c 20 7a 48 74 74 70 48 6f 73 74 29 3b 0a 20  t, zHttpHost);. 
83b0: 20 20 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28     for(i=strlen(
83c0: 7a 52 6f 6f 74 29 2b 31 3b 20 7a 4c 69 6e 65 5b  zRoot)+1; zLine[
83d0: 69 5d 20 26 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d  i] && zLine[i]!=
83e0: 27 3a 27 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ':'; i++){.     
83f0: 20 69 6e 74 20 63 20 3d 20 7a 4c 69 6e 65 5b 69   int c = zLine[i
8400: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  ];.      if( !is
8410: 61 6c 6e 75 6d 28 63 29 20 29 7b 0a 20 20 20 20  alnum(c) ){.    
8420: 20 20 20 20 7a 4c 69 6e 65 5b 69 5d 20 3d 20 27      zLine[i] = '
8430: 5f 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  _';.      }else 
8440: 69 66 28 20 69 73 75 70 70 65 72 28 63 29 20 29  if( isupper(c) )
8450: 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b  {.        zLine[
8460: 69 5d 20 3d 20 74 6f 6c 6f 77 65 72 28 63 29 3b  i] = tolower(c);
8470: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8480: 20 20 20 73 74 72 63 70 79 28 26 7a 4c 69 6e 65     strcpy(&zLine
8490: 5b 69 5d 2c 20 22 2e 77 65 62 73 69 74 65 22 29  [i], ".website")
84a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74  ;.  }.  if( stat
84b0: 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75 66 29  (zLine,&statbuf)
84c0: 20 26 26 20 21 53 5f 49 53 44 49 52 28 73 74 61   && !S_ISDIR(sta
84d0: 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 7b  tbuf.st_mode) ){
84e0: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 69  .    sprintf(zLi
84f0: 6e 65 2c 20 22 25 73 2f 64 65 66 61 75 6c 74 2e  ne, "%s/default.
8500: 77 65 62 73 69 74 65 22 2c 20 7a 52 6f 6f 74 29  website", zRoot)
8510: 3b 0a 20 20 20 20 69 66 28 20 73 74 61 74 28 7a  ;.    if( stat(z
8520: 4c 69 6e 65 2c 26 73 74 61 74 62 75 66 29 20 26  Line,&statbuf) &
8530: 26 20 21 53 5f 49 53 44 49 52 28 73 74 61 74 62  & !S_ISDIR(statb
8540: 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 7b 0a 20  uf.st_mode) ){. 
8550: 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f       NotFound(__
8560: 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20  LINE__);.    }. 
8570: 20 7d 0a 20 20 0a 20 20 7a 48 6f 6d 65 20 3d 20   }.  .  zHome = 
8580: 53 74 72 44 75 70 28 7a 4c 69 6e 65 29 3b 0a 0a  StrDup(zLine);..
8590: 20 20 2f 2a 20 43 68 61 6e 67 65 20 64 69 72 65    /* Change dire
85a0: 63 74 6f 72 69 65 73 20 74 6f 20 74 68 65 20 72  ctories to the r
85b0: 6f 6f 74 20 6f 66 20 74 68 65 20 48 54 54 50 20  oot of the HTTP 
85c0: 66 69 6c 65 73 79 73 74 65 6d 0a 20 20 2a 2f 0a  filesystem.  */.
85d0: 20 20 69 66 28 20 63 68 64 69 72 28 7a 48 6f 6d    if( chdir(zHom
85e0: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  e)!=0 ){.    cha
85f0: 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20  r zBuf[1000];.  
8600: 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f    Malfunction(__
8610: 4c 49 4e 45 5f 5f 2c 20 22 63 61 6e 6e 6f 74 20  LINE__, "cannot 
8620: 63 68 64 69 72 20 74 6f 20 5b 25 73 5d 20 66 72  chdir to [%s] fr
8630: 6f 6d 20 5b 25 73 5d 22 2c 0a 20 20 20 20 20 20  om [%s]",.      
8640: 20 20 20 7a 48 6f 6d 65 2c 20 67 65 74 63 77 64     zHome, getcwd
8650: 28 7a 42 75 66 2c 39 39 39 29 29 3b 0a 20 20 7d  (zBuf,999));.  }
8660: 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
8670: 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69  e file in the fi
8680: 6c 65 73 79 73 74 65 6d 2e 20 20 57 65 20 6d 69  lesystem.  We mi
8690: 67 68 74 20 68 61 76 65 20 74 6f 20 61 70 70 65  ght have to appe
86a0: 6e 64 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65  nd.  ** the name
86b0: 20 22 69 6e 64 65 78 2e 68 74 6d 6c 22 20 69 6e   "index.html" in
86c0: 20 6f 72 64 65 72 20 74 6f 20 66 69 6e 64 20 69   order to find i
86d0: 74 2e 20 20 41 6e 79 20 65 78 63 65 73 73 20 70  t.  Any excess p
86e0: 61 74 68 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61  ath.  ** informa
86f0: 74 69 6f 6e 20 69 73 20 70 75 74 20 69 6e 74 6f  tion is put into
8700: 20 74 68 65 20 7a 50 61 74 68 49 6e 66 6f 20 76   the zPathInfo v
8710: 61 72 69 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ariable..  */.  
8720: 7a 4c 69 6e 65 5b 30 5d 20 3d 20 27 2e 27 3b 0a  zLine[0] = '.';.
8730: 20 20 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65    i = 0;.  while
8740: 28 20 7a 53 63 72 69 70 74 5b 69 5d 20 29 7b 0a  ( zScript[i] ){.
8750: 20 20 20 20 77 68 69 6c 65 28 20 7a 53 63 72 69      while( zScri
8760: 70 74 5b 69 5d 20 26 26 20 7a 53 63 72 69 70 74  pt[i] && zScript
8770: 5b 69 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [i]!='/' ){.    
8780: 20 20 7a 4c 69 6e 65 5b 69 2b 31 5d 20 3d 20 7a    zLine[i+1] = z
8790: 53 63 72 69 70 74 5b 69 5d 3b 0a 20 20 20 20 20  Script[i];.     
87a0: 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20   i++;.    }.    
87b0: 7a 4c 69 6e 65 5b 69 2b 31 5d 20 3d 20 30 3b 0a  zLine[i+1] = 0;.
87c0: 20 20 20 20 69 66 28 20 73 74 61 74 28 7a 4c 69      if( stat(zLi
87d0: 6e 65 2c 26 73 74 61 74 62 75 66 29 21 3d 30 20  ne,&statbuf)!=0 
87e0: 29 7b 0a 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e  ){.      NotFoun
87f0: 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  d(__LINE__);.   
8800: 20 7d 0a 20 20 20 20 69 66 28 20 53 5f 49 53 52   }.    if( S_ISR
8810: 45 47 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f  EG(statbuf.st_mo
8820: 64 65 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  de) ){.      if(
8830: 20 61 63 63 65 73 73 28 7a 4c 69 6e 65 2c 52 5f   access(zLine,R_
8840: 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 4e  OK) ){.        N
8850: 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f  otFound(__LINE__
8860: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8870: 20 7a 52 65 61 6c 53 63 72 69 70 74 20 3d 20 53   zRealScript = S
8880: 74 72 44 75 70 28 26 7a 4c 69 6e 65 5b 31 5d 29  trDup(&zLine[1])
8890: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
88a0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 53 63     }.    if( zSc
88b0: 72 69 70 74 5b 69 5d 3d 3d 30 20 7c 7c 20 7a 53  ript[i]==0 || zS
88c0: 63 72 69 70 74 5b 69 2b 31 5d 3d 3d 30 20 29 7b  cript[i+1]==0 ){
88d0: 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a  .      strcpy(&z
88e0: 4c 69 6e 65 5b 69 2b 31 5d 2c 22 2f 69 6e 64 65  Line[i+1],"/inde
88f0: 78 2e 68 74 6d 6c 22 29 3b 0a 20 20 20 20 20 20  x.html");.      
8900: 69 66 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26  if( stat(zLine,&
8910: 73 74 61 74 62 75 66 29 21 3d 30 20 7c 7c 20 21  statbuf)!=0 || !
8920: 53 5f 49 53 52 45 47 28 73 74 61 74 62 75 66 2e  S_ISREG(statbuf.
8930: 73 74 5f 6d 6f 64 65 29 20 0a 20 20 20 20 20 20  st_mode) .      
8940: 7c 7c 20 61 63 63 65 73 73 28 7a 4c 69 6e 65 2c  || access(zLine,
8950: 52 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 20  R_OK) ){.       
8960: 20 73 74 72 63 70 79 28 26 7a 4c 69 6e 65 5b 69   strcpy(&zLine[i
8970: 2b 31 5d 2c 22 2f 69 6e 64 65 78 2e 63 67 69 22  +1],"/index.cgi"
8980: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
8990: 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62  tat(zLine,&statb
89a0: 75 66 29 21 3d 30 20 7c 7c 20 21 53 5f 49 53 52  uf)!=0 || !S_ISR
89b0: 45 47 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f  EG(statbuf.st_mo
89c0: 64 65 29 20 0a 20 20 20 20 20 20 20 20 7c 7c 20  de) .        || 
89d0: 61 63 63 65 73 73 28 7a 4c 69 6e 65 2c 52 5f 4f  access(zLine,R_O
89e0: 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  K) ){.          
89f0: 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f  NotFound(__LINE_
8a00: 5f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  _);.        }.  
8a10: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 52 65 61      }.      zRea
8a20: 6c 53 63 72 69 70 74 20 3d 20 53 74 72 44 75 70  lScript = StrDup
8a30: 28 26 7a 4c 69 6e 65 5b 31 5d 29 3b 0a 20 20 20  (&zLine[1]);.   
8a40: 20 20 20 69 66 28 20 7a 53 63 72 69 70 74 5b 69     if( zScript[i
8a50: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
8a60: 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  /* If the reques
8a70: 74 65 64 20 55 52 4c 20 64 6f 65 73 20 6e 6f 74  ted URL does not
8a80: 20 65 6e 64 20 77 69 74 68 20 22 2f 22 20 62 75   end with "/" bu
8a90: 74 20 77 65 20 68 61 64 20 74 6f 0a 20 20 20 20  t we had to.    
8aa0: 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 22 69      ** append "i
8ab0: 6e 64 65 78 2e 68 74 6d 6c 22 2c 20 74 68 65 6e  ndex.html", then
8ac0: 20 61 20 72 65 64 69 72 65 63 74 20 69 73 20 6e   a redirect is n
8ad0: 65 63 65 73 73 61 72 79 2e 20 20 4f 74 68 65 72  ecessary.  Other
8ae0: 77 69 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  wise.        ** 
8af0: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 65 6c 61  none of the rela
8b00: 74 69 76 65 20 55 52 4c 73 20 69 6e 20 74 68 65  tive URLs in the
8b10: 20 64 65 6c 69 76 65 72 65 64 20 64 6f 63 75 6d   delivered docum
8b20: 65 6e 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ent will be.    
8b30: 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 2e 20      ** correct. 
8b40: 2a 2f 0a 20 20 20 20 20 20 20 20 52 65 64 69 72  */.        Redir
8b50: 65 63 74 28 7a 52 65 61 6c 53 63 72 69 70 74 2c  ect(zRealScript,
8b60: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74   1);.        ret
8b70: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
8b80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8b90: 20 20 20 20 7a 4c 69 6e 65 5b 69 2b 31 5d 20 3d      zLine[i+1] =
8ba0: 20 7a 53 63 72 69 70 74 5b 69 5d 3b 0a 20 20 20   zScript[i];.   
8bb0: 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c   i++;.  }.  zFil
8bc0: 65 20 3d 20 53 74 72 44 75 70 28 7a 4c 69 6e 65  e = StrDup(zLine
8bd0: 29 3b 0a 20 20 7a 50 61 74 68 49 6e 66 6f 20 3d  );.  zPathInfo =
8be0: 20 53 74 72 44 75 70 28 26 7a 53 63 72 69 70 74   StrDup(&zScript
8bf0: 5b 69 5d 29 3b 0a 20 20 6c 65 6e 46 69 6c 65 20  [i]);.  lenFile 
8c00: 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 3b  = strlen(zFile);
8c10: 0a 20 20 7a 44 69 72 20 3d 20 53 74 72 44 75 70  .  zDir = StrDup
8c20: 28 7a 46 69 6c 65 29 3b 0a 20 20 66 6f 72 28 69  (zFile);.  for(i
8c30: 3d 73 74 72 6c 65 6e 28 7a 44 69 72 29 2d 31 3b  =strlen(zDir)-1;
8c40: 20 69 3e 30 20 26 26 20 7a 44 69 72 5b 69 5d 21   i>0 && zDir[i]!
8c50: 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 3b 0a 20 20  ='/'; i--){};.  
8c60: 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20  if( i==0 ){.    
8c70: 20 73 74 72 63 70 79 28 7a 44 69 72 2c 22 2f 22   strcpy(zDir,"/"
8c80: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
8c90: 20 7a 44 69 72 5b 69 5d 20 3d 20 30 3b 0a 20 20   zDir[i] = 0;.  
8ca0: 7d 0a 0a 20 20 2f 2a 20 54 61 6b 65 20 61 70 70  }..  /* Take app
8cb0: 72 6f 70 72 69 61 74 65 20 61 63 74 69 6f 6e 0a  ropriate action.
8cc0: 20 20 2a 2f 0a 20 20 69 66 28 20 28 73 74 61 74    */.  if( (stat
8cd0: 62 75 66 2e 73 74 5f 6d 6f 64 65 20 26 20 30 31  buf.st_mode & 01
8ce0: 30 30 29 3d 3d 30 31 30 30 20 26 26 20 61 63 63  00)==0100 && acc
8cf0: 65 73 73 28 7a 46 69 6c 65 2c 58 5f 4f 4b 29 3d  ess(zFile,X_OK)=
8d00: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  =0 ){.    /*.   
8d10: 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
8d20: 67 73 20 73 74 61 74 69 63 20 76 61 72 69 61 62  gs static variab
8d30: 6c 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  les are used to 
8d40: 73 65 74 75 70 20 74 68 65 20 65 6e 76 69 72 6f  setup the enviro
8d50: 6e 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 66 6f 72  nment.    ** for
8d60: 20 74 68 65 20 43 47 49 20 73 63 72 69 70 74 0a   the CGI script.
8d70: 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69      */.    stati
8d80: 63 20 63 68 61 72 20 2a 64 65 66 61 75 6c 74 5f  c char *default_
8d90: 70 61 74 68 20 3d 20 22 2f 62 69 6e 3a 2f 75 73  path = "/bin:/us
8da0: 72 2f 62 69 6e 22 3b 0a 20 20 20 20 73 74 61 74  r/bin";.    stat
8db0: 69 63 20 63 68 61 72 20 2a 67 61 74 65 77 61 79  ic char *gateway
8dc0: 5f 69 6e 74 65 72 66 61 63 65 20 3d 20 22 43 47  _interface = "CG
8dd0: 49 2f 31 2e 30 22 3b 0a 20 20 20 20 73 74 61 74  I/1.0";.    stat
8de0: 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  ic struct {.    
8df0: 20 20 63 68 61 72 20 2a 7a 45 6e 76 4e 61 6d 65    char *zEnvName
8e00: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 2a 70  ;.      char **p
8e10: 7a 45 6e 76 56 61 6c 75 65 3b 0a 20 20 20 20 7d  zEnvValue;.    }
8e20: 20 63 67 69 65 6e 76 5b 5d 20 3d 20 7b 0a 20 20   cgienv[] = {.  
8e30: 20 20 20 20 7b 20 22 43 4f 4e 54 45 4e 54 5f 4c      { "CONTENT_L
8e40: 45 4e 47 54 48 22 2c 20 20 20 20 20 20 20 20 20  ENGTH",         
8e50: 20 20 20 20 20 26 7a 43 6f 6e 74 65 6e 74 4c 65       &zContentLe
8e60: 6e 67 74 68 20 7d 2c 0a 20 20 20 20 20 20 7b 20  ngth },.      { 
8e70: 22 43 4f 4e 54 45 4e 54 5f 54 59 50 45 22 2c 20  "CONTENT_TYPE", 
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
8e90: 7a 43 6f 6e 74 65 6e 74 54 79 70 65 20 7d 2c 0a  zContentType },.
8ea0: 20 20 20 20 20 20 7b 20 22 44 4f 43 55 4d 45 4e        { "DOCUMEN
8eb0: 54 5f 52 4f 4f 54 22 2c 20 20 20 20 20 20 20 20  T_ROOT",        
8ec0: 20 20 20 20 20 20 20 26 7a 48 6f 6d 65 20 7d 2c         &zHome },
8ed0: 0a 20 20 20 20 20 20 7b 20 22 47 41 54 45 57 41  .      { "GATEWA
8ee0: 59 5f 49 4e 54 45 52 46 41 43 45 22 2c 20 20 20  Y_INTERFACE",   
8ef0: 20 20 20 20 20 20 20 20 26 67 61 74 65 77 61 79          &gateway
8f00: 5f 69 6e 74 65 72 66 61 63 65 20 7d 2c 0a 20 20  _interface },.  
8f10: 20 20 20 20 7b 20 22 48 54 54 50 5f 41 43 43 45      { "HTTP_ACCE
8f20: 50 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  PT",            
8f30: 20 20 20 20 20 26 7a 41 63 63 65 70 74 20 7d 2c       &zAccept },
8f40: 0a 20 20 20 20 20 20 7b 20 22 48 54 54 50 5f 43  .      { "HTTP_C
8f50: 4f 4f 4b 49 45 22 2c 20 20 20 20 20 20 20 20 20  OOKIE",         
8f60: 20 20 20 20 20 20 20 20 26 7a 43 6f 6f 6b 69 65          &zCookie
8f70: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 48 54 54   },.      { "HTT
8f80: 50 5f 48 4f 53 54 22 2c 20 20 20 20 20 20 20 20  P_HOST",        
8f90: 20 20 20 20 20 20 20 20 20 20 20 26 7a 48 74 74             &zHtt
8fa0: 70 48 6f 73 74 20 7d 2c 0a 20 20 20 20 20 20 7b  pHost },.      {
8fb0: 20 22 48 54 54 50 5f 52 45 46 45 52 45 52 22 2c   "HTTP_REFERER",
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fd0: 26 7a 52 65 66 65 72 65 72 20 7d 2c 0a 20 20 20  &zReferer },.   
8fe0: 20 20 20 7b 20 22 48 54 54 50 5f 55 53 45 52 5f     { "HTTP_USER_
8ff0: 41 47 45 4e 54 22 2c 20 20 20 20 20 20 20 20 20  AGENT",         
9000: 20 20 20 20 26 7a 41 67 65 6e 74 20 7d 2c 0a 20      &zAgent },. 
9010: 20 20 20 20 20 7b 20 22 50 41 54 48 22 2c 20 20       { "PATH",  
9020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9030: 20 20 20 20 20 20 26 64 65 66 61 75 6c 74 5f 70        &default_p
9040: 61 74 68 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  ath },.      { "
9050: 50 41 54 48 5f 49 4e 46 4f 22 2c 20 20 20 20 20  PATH_INFO",     
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
9070: 50 61 74 68 49 6e 66 6f 20 7d 2c 0a 20 20 20 20  PathInfo },.    
9080: 20 20 7b 20 22 51 55 45 52 59 5f 53 54 52 49 4e    { "QUERY_STRIN
9090: 47 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  G",             
90a0: 20 20 20 26 7a 51 75 65 72 79 53 74 72 69 6e 67     &zQueryString
90b0: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 52 45 4d   },.      { "REM
90c0: 4f 54 45 5f 41 44 44 52 22 2c 20 20 20 20 20 20  OTE_ADDR",      
90d0: 20 20 20 20 20 20 20 20 20 20 20 26 7a 52 65 6d             &zRem
90e0: 6f 74 65 41 64 64 72 20 7d 2c 0a 20 20 20 20 20  oteAddr },.     
90f0: 20 7b 20 22 52 45 51 55 45 53 54 5f 4d 45 54 48   { "REQUEST_METH
9100: 4f 44 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  OD",            
9110: 20 20 26 7a 4d 65 74 68 6f 64 20 7d 2c 0a 20 20    &zMethod },.  
9120: 20 20 20 20 7b 20 22 52 45 51 55 45 53 54 5f 55      { "REQUEST_U
9130: 52 49 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  RI",            
9140: 20 20 20 20 20 26 7a 53 63 72 69 70 74 20 7d 2c       &zScript },
9150: 0a 20 20 20 20 20 20 7b 20 22 53 43 52 49 50 54  .      { "SCRIPT
9160: 5f 44 49 52 45 43 54 4f 52 59 22 2c 20 20 20 20  _DIRECTORY",    
9170: 20 20 20 20 20 20 20 20 26 7a 44 69 72 20 7d 2c          &zDir },
9180: 0a 20 20 20 20 20 20 7b 20 22 53 43 52 49 50 54  .      { "SCRIPT
9190: 5f 46 49 4c 45 4e 41 4d 45 22 2c 20 20 20 20 20  _FILENAME",     
91a0: 20 20 20 20 20 20 20 20 26 7a 46 69 6c 65 20 7d          &zFile }
91b0: 2c 0a 20 20 20 20 20 20 7b 20 22 53 43 52 49 50  ,.      { "SCRIP
91c0: 54 5f 4e 41 4d 45 22 2c 20 20 20 20 20 20 20 20  T_NAME",        
91d0: 20 20 20 20 20 20 20 20 20 26 7a 52 65 61 6c 53           &zRealS
91e0: 63 72 69 70 74 20 7d 2c 0a 20 20 20 20 20 20 7b  cript },.      {
91f0: 20 22 53 45 52 56 45 52 5f 4e 41 4d 45 22 2c 20   "SERVER_NAME", 
9200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9210: 26 7a 53 65 72 76 65 72 4e 61 6d 65 20 7d 2c 0a  &zServerName },.
9220: 20 20 20 20 20 20 7b 20 22 53 45 52 56 45 52 5f        { "SERVER_
9230: 50 4f 52 54 22 2c 20 20 20 20 20 20 20 20 20 20  PORT",          
9240: 20 20 20 20 20 20 20 26 7a 53 65 72 76 65 72 50         &zServerP
9250: 6f 72 74 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  ort },.      { "
9260: 53 45 52 56 45 52 5f 50 52 4f 54 4f 43 4f 4c 22  SERVER_PROTOCOL"
9270: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a  ,             &z
9280: 50 72 6f 74 6f 63 6f 6c 20 7d 2c 0a 20 20 20 20  Protocol },.    
9290: 7d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 42 61  };.    char *zBa
92a0: 73 65 46 69 6c 65 6e 61 6d 65 3b 20 20 20 2f 2a  seFilename;   /*
92b0: 20 46 69 6c 65 6e 61 6d 65 20 77 69 74 68 6f 75   Filename withou
92c0: 74 20 64 69 72 65 63 74 6f 72 79 20 70 72 65 66  t directory pref
92d0: 69 78 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66  ix */..    /* If
92e0: 20 69 74 73 20 65 78 65 63 75 74 61 62 6c 65 2c   its executable,
92f0: 20 69 74 20 6d 75 73 74 20 62 65 20 61 20 43 47   it must be a CG
9300: 49 20 70 72 6f 67 72 61 6d 2e 20 20 53 74 61 72  I program.  Star
9310: 74 20 62 79 0a 20 20 20 20 2a 2a 20 63 68 61 6e  t by.    ** chan
9320: 67 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73  ging directories
9330: 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72   to the director
9340: 79 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 72  y holding the pr
9350: 6f 67 72 61 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20  ogram..    */.  
9360: 20 20 69 66 28 20 63 68 64 69 72 28 7a 44 69 72    if( chdir(zDir
9370: 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ) ){.      char 
9380: 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20 20 20  zBuf[1000];.    
9390: 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f    Malfunction(__
93a0: 4c 49 4e 45 5f 5f 2c 20 22 63 61 6e 6e 6f 74 20  LINE__, "cannot 
93b0: 63 68 64 69 72 20 74 6f 20 5b 25 73 5d 20 66 72  chdir to [%s] fr
93c0: 6f 6d 20 5b 25 73 5d 22 2c 20 0a 20 20 20 20 20  om [%s]", .     
93d0: 20 20 20 20 20 20 7a 44 69 72 2c 20 67 65 74 63        zDir, getc
93e0: 77 64 28 7a 42 75 66 2c 39 39 39 29 29 3b 0a 20  wd(zBuf,999));. 
93f0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
9400: 75 70 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65  up the environme
9410: 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  nt appropriately
9420: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
9430: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 63  (i=0; i<sizeof(c
9440: 67 69 65 6e 76 29 2f 73 69 7a 65 6f 66 28 63 67  gienv)/sizeof(cg
9450: 69 65 6e 76 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  ienv[0]); i++){.
9460: 20 20 20 20 20 20 69 66 28 20 2a 63 67 69 65 6e        if( *cgien
9470: 76 5b 69 5d 2e 70 7a 45 6e 76 56 61 6c 75 65 20  v[i].pzEnvValue 
9480: 29 7b 0a 20 20 20 20 20 20 20 20 53 65 74 45 6e  ){.        SetEn
9490: 76 28 63 67 69 65 6e 76 5b 69 5d 2e 7a 45 6e 76  v(cgienv[i].zEnv
94a0: 4e 61 6d 65 2c 2a 63 67 69 65 6e 76 5b 69 5d 2e  Name,*cgienv[i].
94b0: 70 7a 45 6e 76 56 61 6c 75 65 29 3b 0a 20 20 20  pzEnvValue);.   
94c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
94d0: 66 28 20 75 73 65 48 74 74 70 73 20 29 7b 0a 20  f( useHttps ){. 
94e0: 20 20 20 20 20 70 75 74 65 6e 76 28 22 48 54 54       putenv("HTT
94f0: 50 53 3d 6f 6e 22 29 3b 0a 20 20 20 20 7d 0a 0a  PS=on");.    }..
9500: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 41 62      /*.    ** Ab
9510: 6f 72 74 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ort with an erro
9520: 72 20 69 66 20 74 68 65 20 43 47 49 20 73 63 72  r if the CGI scr
9530: 69 70 74 20 69 73 20 77 72 69 74 61 62 6c 65 20  ipt is writable 
9540: 62 79 20 61 6e 79 6f 6e 65 20 6f 74 68 65 72 0a  by anyone other.
9550: 20 20 20 20 2a 2a 20 74 68 61 6e 20 69 74 73 20      ** than its 
9560: 6f 77 6e 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  owner..    */.  
9570: 20 20 69 66 28 20 73 74 61 74 62 75 66 2e 73 74    if( statbuf.st
9580: 5f 6d 6f 64 65 20 26 20 30 30 32 32 20 29 7b 0a  _mode & 0022 ){.
9590: 20 20 20 20 20 20 43 67 69 53 63 72 69 70 74 57        CgiScriptW
95a0: 72 69 74 61 62 6c 65 28 29 3b 0a 20 20 20 20 7d  ritable();.    }
95b0: 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 74 68 65  ..    /* For the
95c0: 20 50 4f 53 54 20 6d 65 74 68 6f 64 20 61 6c 6c   POST method all
95d0: 20 69 6e 70 75 74 20 68 61 73 20 62 65 65 6e 20   input has been 
95e0: 77 72 69 74 74 65 6e 20 74 6f 20 61 20 74 65 6d  written to a tem
95f0: 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 20  porary file,.   
9600: 20 2a 2a 20 73 6f 20 77 65 20 68 61 76 65 20 74   ** so we have t
9610: 6f 20 72 65 64 69 72 65 63 74 20 69 6e 70 75 74  o redirect input
9620: 20 74 6f 20 74 68 65 20 43 47 49 20 73 63 72 69   to the CGI scri
9630: 70 74 20 66 72 6f 6d 20 74 68 61 74 20 66 69 6c  pt from that fil
9640: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
9650: 28 20 7a 4d 65 74 68 6f 64 5b 30 5d 3d 3d 27 50  ( zMethod[0]=='P
9660: 27 20 29 7b 0a 20 20 20 20 20 20 64 75 70 28 30  ' ){.      dup(0
9670: 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 30  );.      close(0
9680: 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e 28 7a 54  );.      open(zT
9690: 6d 70 4e 61 6d 2c 20 4f 5f 52 44 4f 4e 4c 59 29  mpNam, O_RDONLY)
96a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  ;.    }..    for
96b0: 28 69 3d 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29  (i=strlen(zFile)
96c0: 2d 31 3b 20 69 3e 3d 30 20 26 26 20 7a 46 69 6c  -1; i>=0 && zFil
96d0: 65 5b 69 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b  e[i]!='/'; i--){
96e0: 7d 0a 20 20 20 20 7a 42 61 73 65 46 69 6c 65 6e  }.    zBaseFilen
96f0: 61 6d 65 20 3d 20 26 7a 46 69 6c 65 5b 69 2b 31  ame = &zFile[i+1
9700: 5d 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 30 20  ];.    if( i>=0 
9710: 26 26 20 73 74 72 6e 63 6d 70 28 7a 42 61 73 65  && strncmp(zBase
9720: 46 69 6c 65 6e 61 6d 65 2c 22 6e 70 68 2d 22 2c  Filename,"nph-",
9730: 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  4)==0 ){.      /
9740: 2a 20 49 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  * If the name of
9750: 20 74 68 65 20 43 47 49 20 73 63 72 69 70 74 20   the CGI script 
9760: 62 65 67 69 6e 73 20 77 69 74 68 20 22 6e 70 68  begins with "nph
9770: 2d 22 20 74 68 65 6e 20 77 65 20 61 72 65 0a 20  -" then we are. 
9780: 20 20 20 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20       ** dealing 
9790: 77 69 74 68 20 61 20 22 6e 6f 6e 2d 70 61 72 73  with a "non-pars
97a0: 65 64 20 68 65 61 64 65 72 73 22 20 43 47 49 20  ed headers" CGI 
97b0: 73 63 72 69 70 74 2e 20 20 4a 75 73 74 20 65 78  script.  Just ex
97c0: 65 63 28 29 0a 20 20 20 20 20 20 2a 2a 20 69 74  ec().      ** it
97d0: 20 64 69 72 65 63 74 6c 79 20 61 6e 64 20 6c 65   directly and le
97e0: 74 20 69 74 20 68 61 6e 64 6c 65 20 61 6c 6c 20  t it handle all 
97f0: 69 74 73 20 6f 77 6e 20 68 65 61 64 65 72 20 67  its own header g
9800: 65 6e 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 20  eneration..     
9810: 20 2a 2f 0a 20 20 20 20 20 20 65 78 65 63 6c 28   */.      execl(
9820: 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c 7a 42  zBaseFilename,zB
9830: 61 73 65 46 69 6c 65 6e 61 6d 65 2c 28 63 68 61  aseFilename,(cha
9840: 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20  r*)0);.      /* 
9850: 4e 4f 54 45 3a 20 4e 6f 20 6c 6f 67 20 65 6e 74  NOTE: No log ent
9860: 72 79 20 77 72 69 74 74 65 6e 20 66 6f 72 20 6e  ry written for n
9870: 70 68 2d 20 73 63 72 69 70 74 73 20 2a 2f 0a 20  ph- scripts */. 
9880: 20 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20       exit(0);.  
9890: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 61 6c 6c    }..    /* Fall
98a0: 20 74 68 72 75 20 74 6f 20 68 65 72 65 20 6f 6e   thru to here on
98b0: 6c 79 20 69 66 20 74 68 69 73 20 70 72 6f 63 65  ly if this proce
98c0: 73 73 20 28 74 68 65 20 73 65 72 76 65 72 29 20  ss (the server) 
98d0: 69 73 20 67 6f 69 6e 67 0a 20 20 20 20 2a 2a 20  is going.    ** 
98e0: 74 6f 20 72 65 61 64 20 61 6e 64 20 61 75 67 6d  to read and augm
98f0: 65 6e 74 20 74 68 65 20 68 65 61 64 65 72 20 73  ent the header s
9900: 65 6e 74 20 62 61 63 6b 20 62 79 20 74 68 65 20  ent back by the 
9910: 43 47 49 20 70 72 6f 63 65 73 73 2e 0a 20 20 20  CGI process..   
9920: 20 2a 2a 20 4f 70 65 6e 20 61 20 70 69 70 65 20   ** Open a pipe 
9930: 74 6f 20 72 65 63 65 69 76 65 20 74 68 65 20 6f  to receive the o
9940: 75 74 70 75 74 20 66 72 6f 6d 20 74 68 65 20 43  utput from the C
9950: 47 49 20 70 72 6f 63 65 73 73 2e 20 20 54 68 65  GI process.  The
9960: 6e 0a 20 20 20 20 2a 2a 20 66 6f 72 6b 20 74 68  n.    ** fork th
9970: 65 20 43 47 49 20 70 72 6f 63 65 73 73 2e 20 20  e CGI process.  
9980: 4f 6e 63 65 20 65 76 65 72 79 74 68 69 6e 67 20  Once everything 
9990: 69 73 20 64 6f 6e 65 2c 20 77 65 20 73 68 6f 75  is done, we shou
99a0: 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 61 62 6c  ld be.    ** abl
99b0: 65 20 74 6f 20 72 65 61 64 20 74 68 65 20 6f 75  e to read the ou
99c0: 74 70 75 74 20 6f 66 20 43 47 49 20 6f 6e 20 74  tput of CGI on t
99d0: 68 65 20 22 69 6e 22 20 73 74 72 65 61 6d 2e 0a  he "in" stream..
99e0: 20 20 20 20 2a 2f 0a 20 20 20 20 7b 0a 20 20 20      */.    {.   
99f0: 20 20 20 69 6e 74 20 70 78 5b 32 5d 3b 0a 20 20     int px[2];.  
9a00: 20 20 20 20 70 69 70 65 28 70 78 29 3b 0a 20 20      pipe(px);.  
9a10: 20 20 20 20 69 66 28 20 66 6f 72 6b 28 29 3d 3d      if( fork()==
9a20: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f  0 ){.        clo
9a30: 73 65 28 70 78 5b 30 5d 29 3b 0a 20 20 20 20 20  se(px[0]);.     
9a40: 20 20 20 63 6c 6f 73 65 28 31 29 3b 0a 20 20 20     close(1);.   
9a50: 20 20 20 20 20 64 75 70 28 70 78 5b 31 5d 29 3b       dup(px[1]);
9a60: 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 70  .        close(p
9a70: 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 65  x[1]);.        e
9a80: 78 65 63 6c 28 7a 42 61 73 65 46 69 6c 65 6e 61  xecl(zBaseFilena
9a90: 6d 65 2c 20 7a 42 61 73 65 46 69 6c 65 6e 61 6d  me, zBaseFilenam
9aa0: 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  e, (char*)0);.  
9ab0: 20 20 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20        exit(0);. 
9ac0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 6f       }.      clo
9ad0: 73 65 28 70 78 5b 31 5d 29 3b 0a 20 20 20 20 20  se(px[1]);.     
9ae0: 20 69 6e 20 3d 20 66 64 6f 70 65 6e 28 70 78 5b   in = fdopen(px[
9af0: 30 5d 2c 20 22 72 22 29 3b 0a 20 20 20 20 7d 0a  0], "r");.    }.
9b00: 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b      if( in==0 ){
9b10: 0a 20 20 20 20 20 20 43 67 69 45 72 72 6f 72 28  .      CgiError(
9b20: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
9b30: 20 52 65 61 64 20 61 6e 64 20 70 72 6f 63 65 73   Read and proces
9b40: 73 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e 65  s the first line
9b50: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 72   of the header r
9b60: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 20  eturned by the. 
9b70: 20 20 20 2a 2a 20 43 47 49 20 73 63 72 69 70 74     ** CGI script
9b80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 6c 61  ..    */.    ala
9b90: 72 6d 28 31 35 29 3b 0a 20 20 20 20 77 68 69 6c  rm(15);.    whil
9ba0: 65 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 73  e( fgets(zLine,s
9bb0: 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 69 6e 29  izeof(zLine),in)
9bc0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74   ){.      if( st
9bd0: 72 6e 63 6d 70 28 7a 4c 69 6e 65 2c 22 4c 6f 63  rncmp(zLine,"Loc
9be0: 61 74 69 6f 6e 3a 22 2c 39 29 3d 3d 30 20 29 7b  ation:",9)==0 ){
9bf0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
9c00: 20 20 20 20 20 20 20 20 52 65 6d 6f 76 65 4e 65          RemoveNe
9c10: 77 6c 69 6e 65 28 7a 4c 69 6e 65 29 3b 0a 20 20  wline(zLine);.  
9c20: 20 20 20 20 20 20 7a 20 3d 20 26 7a 4c 69 6e 65        z = &zLine
9c30: 5b 31 30 5d 3b 0a 20 20 20 20 20 20 20 20 77 68  [10];.        wh
9c40: 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 7a 29  ile( isspace(*z)
9c50: 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20   ){ z++; }.     
9c60: 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d     for(i=0; z[i]
9c70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
9c80: 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 3f 27 20    if( z[i]=='?' 
9c90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ){.            z
9ca0: 51 75 65 72 79 53 75 66 66 69 78 20 3d 20 53 74  QuerySuffix = St
9cb0: 72 44 75 70 28 22 22 29 3b 0a 20 20 20 20 20 20  rDup("");.      
9cc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
9cd0: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
9ce0: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2f 27 20 26   if( z[0]=='/' &
9cf0: 26 20 7a 5b 31 5d 3d 3d 27 2f 27 20 29 7b 0a 20  & z[1]=='/' ){. 
9d00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
9d10: 73 63 68 65 6d 65 20 69 73 20 6d 69 73 73 69 6e  scheme is missin
9d20: 67 2e 20 20 41 64 64 20 69 74 20 69 6e 20 62 65  g.  Add it in be
9d30: 66 6f 72 65 20 72 65 64 69 72 65 63 74 69 6e 67  fore redirecting
9d40: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 53 74   */.          St
9d50: 61 72 74 52 65 73 70 6f 6e 73 65 28 22 33 30 32  artResponse("302
9d60: 20 52 65 64 69 72 65 63 74 22 29 3b 0a 20 20 20   Redirect");.   
9d70: 20 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70         nOut += p
9d80: 72 69 6e 74 66 28 22 4c 6f 63 61 74 69 6f 6e 3a  rintf("Location:
9d90: 20 25 73 3a 25 73 25 73 5c 72 5c 6e 22 2c 7a 48   %s:%s%s\r\n",zH
9da0: 74 74 70 2c 7a 2c 7a 51 75 65 72 79 53 75 66 66  ttp,z,zQuerySuff
9db0: 69 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ix);.          b
9dc0: 72 65 61 6b 3b 20 2f 2a 20 44 4b 20 2a 2f 0a 20  reak; /* DK */. 
9dd0: 20 20 20 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67           MakeLog
9de0: 45 6e 74 72 79 28 30 29 3b 0a 20 20 20 20 20 20  Entry(0);.      
9df0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
9e00: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b      }else if( z[
9e10: 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  0]=='/' ){.     
9e20: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 63 68 65       /* The sche
9e30: 6d 65 20 61 6e 64 20 6e 65 74 77 6f 72 6b 20 6c  me and network l
9e40: 6f 63 61 74 69 6f 6e 20 61 72 65 20 6d 69 73 73  ocation are miss
9e50: 69 6e 67 20 62 75 74 20 77 65 20 68 61 76 65 0a  ing but we have.
9e60: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20            ** an 
9e70: 61 62 73 6f 6c 75 74 65 20 70 61 74 68 2e 20 2a  absolute path. *
9e80: 2f 0a 20 20 20 20 20 20 20 20 20 20 52 65 64 69  /.          Redi
9e90: 72 65 63 74 28 7a 2c 20 30 29 3b 20 2f 2a 20 44  rect(z, 0); /* D
9ea0: 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 62  K */.          b
9eb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
9ec0: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
9ed0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
9ee0: 20 69 73 20 61 20 73 63 68 65 6d 65 20 70 72 65   is a scheme pre
9ef0: 66 69 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  fix */.        f
9f00: 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 20 26 26 20  or(i=0; z[i] && 
9f10: 7a 5b 69 5d 21 3d 27 3a 27 20 26 26 20 7a 5b 69  z[i]!=':' && z[i
9f20: 5d 21 3d 27 2f 27 3b 20 69 2b 2b 29 7b 7d 0a 20  ]!='/'; i++){}. 
9f30: 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d         if( z[i]=
9f40: 3d 27 3a 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =':' ){.        
9f50: 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 73    /* We have a s
9f60: 63 68 65 6d 65 2e 20 20 41 73 73 75 6d 65 20 74  cheme.  Assume t
9f70: 68 65 72 65 20 69 73 20 61 6e 20 61 62 73 6f 6c  here is an absol
9f80: 75 74 65 20 55 52 4c 20 2a 2f 0a 20 20 20 20 20  ute URL */.     
9f90: 20 20 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e       StartRespon
9fa0: 73 65 28 22 33 30 32 20 52 65 64 69 72 65 63 74  se("302 Redirect
9fb0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f  ");.          nO
9fc0: 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 4c 6f  ut += printf("Lo
9fd0: 63 61 74 69 6f 6e 3a 20 25 73 25 73 5c 72 5c 6e  cation: %s%s\r\n
9fe0: 22 2c 7a 2c 7a 51 75 65 72 79 53 75 66 66 69 78  ",z,zQuerySuffix
9ff0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
a000: 61 6b 3b 20 2f 2a 20 44 4b 20 2a 2f 0a 20 20 20  ak; /* DK */.   
a010: 20 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e         MakeLogEn
a020: 74 72 79 28 30 29 3b 0a 20 20 20 20 20 20 20 20  try(0);.        
a030: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
a040: 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d    }.        /* M
a050: 75 73 74 20 62 65 20 61 20 72 65 6c 61 74 69 76  ust be a relativ
a060: 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 43 6f 6e  e pathname.  Con
a070: 73 74 72 75 63 74 20 74 68 65 20 61 62 73 6f 6c  struct the absol
a080: 75 74 65 20 70 61 74 68 6e 61 6d 65 0a 20 20 20  ute pathname.   
a090: 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 64 69       ** and redi
a0a0: 72 65 63 74 20 74 6f 20 69 74 2e 20 2a 2f 0a 20  rect to it. */. 
a0b0: 20 20 20 20 20 20 20 69 20 3d 20 73 74 72 6c 65         i = strle
a0c0: 6e 28 7a 52 65 61 6c 53 63 72 69 70 74 29 3b 0a  n(zRealScript);.
a0d0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69          while( i
a0e0: 3e 30 20 26 26 20 7a 52 65 61 6c 53 63 72 69 70  >0 && zRealScrip
a0f0: 74 5b 69 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 69  t[i-1]!='/' ){ i
a100: 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 77 68  --; }.        wh
a110: 69 6c 65 28 20 69 3e 30 20 26 26 20 7a 52 65 61  ile( i>0 && zRea
a120: 6c 53 63 72 69 70 74 5b 69 2d 31 5d 3d 3d 27 2f  lScript[i-1]=='/
a130: 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20  ' ){ i--; }.    
a140: 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 3d 3d 27      while( *z=='
a150: 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  .' ){.          
a160: 69 66 28 20 7a 5b 31 5d 3d 3d 27 2f 27 20 29 7b  if( z[1]=='/' ){
a170: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 2b  .            z +
a180: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 2;.          }
a190: 65 6c 73 65 20 69 66 28 20 7a 5b 31 5d 3d 3d 27  else if( z[1]=='
a1a0: 2e 27 20 26 26 20 7a 5b 32 5d 3d 3d 27 2f 27 20  .' && z[2]=='/' 
a1b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77  ){.            w
a1c0: 68 69 6c 65 28 20 69 3e 30 20 26 26 20 7a 52 65  hile( i>0 && zRe
a1d0: 61 6c 53 63 72 69 70 74 5b 69 2d 31 5d 21 3d 27  alScript[i-1]!='
a1e0: 2f 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20  /' ){ i--; }.   
a1f0: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
a200: 69 3e 30 20 26 26 20 7a 52 65 61 6c 53 63 72 69  i>0 && zRealScri
a210: 70 74 5b 69 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20  pt[i-1]=='/' ){ 
a220: 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 20  i--; }.         
a230: 20 20 20 7a 20 2b 3d 20 33 3b 0a 20 20 20 20 20     z += 3;.     
a240: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a250: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a260: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a270: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 53 74 61     }.        Sta
a280: 72 74 52 65 73 70 6f 6e 73 65 28 22 33 30 32 20  rtResponse("302 
a290: 52 65 64 69 72 65 63 74 22 29 3b 0a 20 20 20 20  Redirect");.    
a2a0: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
a2b0: 74 66 28 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73  tf("Location: %s
a2c0: 3a 2f 2f 25 73 22 2c 7a 48 74 74 70 2c 7a 53 65  ://%s",zHttp,zSe
a2d0: 72 76 65 72 4e 61 6d 65 29 3b 0a 20 20 20 20 20  rverName);.     
a2e0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 53     if( strcmp(zS
a2f0: 65 72 76 65 72 50 6f 72 74 2c 22 38 30 22 29 20  erverPort,"80") 
a300: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75  ){.          nOu
a310: 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 3a 25 73  t += printf(":%s
a320: 22 2c 7a 53 65 72 76 65 72 50 6f 72 74 29 3b 0a  ",zServerPort);.
a330: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a340: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
a350: 28 22 25 2e 2a 73 2f 25 73 25 73 5c 72 5c 6e 5c  ("%.*s/%s%s\r\n\
a360: 72 5c 6e 22 2c 69 2c 7a 52 65 61 6c 53 63 72 69  r\n",i,zRealScri
a370: 70 74 2c 7a 2c 7a 51 75 65 72 79 53 75 66 66 69  pt,z,zQuerySuffi
a380: 78 29 3b 0a 20 20 20 20 20 20 20 20 4d 61 6b 65  x);.        Make
a390: 4c 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20 20 20  LogEntry(0);.   
a3a0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
a3b0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
a3c0: 6e 63 6d 70 28 7a 4c 69 6e 65 2c 22 53 74 61 74  ncmp(zLine,"Stat
a3d0: 75 73 3a 22 2c 37 29 3d 3d 30 20 29 7b 0a 20 20  us:",7)==0 ){.  
a3e0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
a3f0: 20 20 20 20 20 66 6f 72 28 69 3d 37 3b 20 69 73       for(i=7; is
a400: 73 70 61 63 65 28 7a 4c 69 6e 65 5b 69 5d 29 3b  space(zLine[i]);
a410: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   i++){}.        
a420: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22  nOut += printf("
a430: 25 73 20 25 73 22 2c 20 7a 50 72 6f 74 6f 63 6f  %s %s", zProtoco
a440: 6c 2c 20 26 7a 4c 69 6e 65 5b 69 5d 29 3b 0a 20  l, &zLine[i]);. 
a450: 20 20 20 20 20 20 20 73 74 72 6e 63 70 79 28 7a         strncpy(z
a460: 52 65 70 6c 79 53 74 61 74 75 73 2c 20 26 7a 4c  ReplyStatus, &zL
a470: 69 6e 65 5b 69 5d 2c 20 33 29 3b 0a 20 20 20 20  ine[i], 3);.    
a480: 20 20 20 20 7a 52 65 70 6c 79 53 74 61 74 75 73      zReplyStatus
a490: 5b 33 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  [3] = 0;.       
a4a0: 20 73 74 61 74 75 73 53 65 6e 74 20 3d 20 31 3b   statusSent = 1;
a4b0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
a4c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a4d0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
a4e0: 20 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73      StartRespons
a4f0: 65 28 22 32 30 30 20 4f 4b 22 29 3b 0a 20 20 20  e("200 OK");.   
a500: 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69       nOut += pri
a510: 6e 74 66 28 22 25 73 22 2c 7a 4c 69 6e 65 29 3b  ntf("%s",zLine);
a520: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
a530: 3b 20 7a 4c 69 6e 65 5b 69 5d 20 26 26 20 21 69  ; zLine[i] && !i
a540: 73 73 70 61 63 65 28 7a 4c 69 6e 65 5b 69 5d 29  sspace(zLine[i])
a550: 20 26 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d 27 3a   && zLine[i]!=':
a560: 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  '; i++){}.      
a570: 20 20 69 66 28 20 69 3c 32 20 7c 7c 20 7a 4c 69    if( i<2 || zLi
a580: 6e 65 5b 69 5d 21 3d 27 3a 27 20 29 20 62 72 65  ne[i]!=':' ) bre
a590: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
a5a0: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 65  }..    /* Copy e
a5b0: 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 20 74  verything else t
a5c0: 68 72 75 20 77 69 74 68 6f 75 74 20 63 68 61 6e  hru without chan
a5d0: 67 65 20 6f 72 20 61 6e 61 6c 79 73 69 73 2e 0a  ge or analysis..
a5e0: 20 20 20 20 2a 2f 0a 20 20 20 20 61 6c 61 72 6d      */.    alarm
a5f0: 28 36 30 2a 35 29 3b 0a 20 20 20 20 77 68 69 6c  (60*5);.    whil
a600: 65 28 20 28 63 20 3d 20 67 65 74 63 28 69 6e 29  e( (c = getc(in)
a610: 29 21 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20 20  )!=EOF ){.      
a620: 70 75 74 63 28 63 2c 73 74 64 6f 75 74 29 3b 0a  putc(c,stdout);.
a630: 20 20 20 20 20 20 6e 4f 75 74 2b 2b 3b 0a 20 20        nOut++;.  
a640: 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28 69    }.    fclose(i
a650: 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  n);.  }else{.   
a660: 20 2f 2a 20 49 66 20 69 74 20 69 73 6e 27 74 20   /* If it isn't 
a670: 65 78 65 63 75 74 61 62 6c 65 20 74 68 65 6e 20  executable then 
a680: 69 74 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 61  it.    ** must a
a690: 20 73 69 6d 70 6c 65 20 66 69 6c 65 20 74 68 61   simple file tha
a6a0: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63 6f  t needs to be co
a6b0: 70 69 65 64 20 74 6f 20 6f 75 74 70 75 74 2e 0a  pied to output..
a6c0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74      */.    const
a6d0: 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 54   char *zContentT
a6e0: 79 70 65 20 3d 20 47 65 74 4d 69 6d 65 54 79 70  ype = GetMimeTyp
a6f0: 65 28 7a 46 69 6c 65 2c 20 6c 65 6e 46 69 6c 65  e(zFile, lenFile
a700: 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a 54 6d 70  );..    if( zTmp
a710: 4e 61 6d 20 29 20 75 6e 6c 69 6e 6b 28 7a 54 6d  Nam ) unlink(zTm
a720: 70 4e 61 6d 29 3b 0a 20 20 20 20 69 6e 20 3d 20  pNam);.    in = 
a730: 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 22 72 22 29  fopen(zFile,"r")
a740: 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20  ;.    if( in==0 
a750: 29 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e  ) NotFound(__LIN
a760: 45 5f 5f 29 3b 0a 20 20 20 20 53 74 61 72 74 52  E__);.    StartR
a770: 65 73 70 6f 6e 73 65 28 22 32 30 30 20 4f 4b 22  esponse("200 OK"
a780: 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 44  );.    nOut += D
a790: 61 74 65 54 61 67 28 22 4c 61 73 74 2d 4d 6f 64  ateTag("Last-Mod
a7a0: 69 66 69 65 64 22 2c 20 73 74 61 74 62 75 66 2e  ified", statbuf.
a7b0: 73 74 5f 6d 74 69 6d 65 29 3b 0a 20 20 20 20 6e  st_mtime);.    n
a7c0: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 43  Out += printf("C
a7d0: 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 25 73 5c  ontent-type: %s\
a7e0: 72 5c 6e 22 2c 7a 43 6f 6e 74 65 6e 74 54 79 70  r\n",zContentTyp
a7f0: 65 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20  e);.    nOut += 
a800: 70 72 69 6e 74 66 28 22 43 6f 6e 74 65 6e 74 2d  printf("Content-
a810: 6c 65 6e 67 74 68 3a 20 25 64 5c 72 5c 6e 5c 72  length: %d\r\n\r
a820: 5c 6e 22 2c 28 69 6e 74 29 73 74 61 74 62 75 66  \n",(int)statbuf
a830: 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 66  .st_size);.    f
a840: 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20  flush(stdout);. 
a850: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4d     if( strcmp(zM
a860: 65 74 68 6f 64 2c 22 48 45 41 44 22 29 3d 3d 30  ethod,"HEAD")==0
a870: 20 29 7b 0a 20 20 20 20 20 20 4d 61 6b 65 4c 6f   ){.      MakeLo
a880: 67 45 6e 74 72 79 28 30 29 3b 0a 20 20 20 20 20  gEntry(0);.     
a890: 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20   fclose(in);.   
a8a0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
a8b0: 0a 20 20 20 20 61 6c 61 72 6d 28 33 30 20 2b 20  .    alarm(30 + 
a8c0: 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 2f  statbuf.st_size/
a8d0: 31 30 30 30 29 3b 0a 23 69 66 64 65 66 20 6c 69  1000);.#ifdef li
a8e0: 6e 75 78 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  nux.    {.      
a8f0: 6f 66 66 5f 74 20 6f 66 66 73 65 74 20 3d 20 30  off_t offset = 0
a900: 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20  ;.      nOut += 
a910: 73 65 6e 64 66 69 6c 65 28 66 69 6c 65 6e 6f 28  sendfile(fileno(
a920: 73 74 64 6f 75 74 29 2c 20 66 69 6c 65 6e 6f 28  stdout), fileno(
a930: 69 6e 29 2c 20 26 6f 66 66 73 65 74 2c 20 73 74  in), &offset, st
a940: 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a  atbuf.st_size);.
a950: 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
a960: 77 68 69 6c 65 28 20 28 63 20 3d 20 67 65 74 63  while( (c = getc
a970: 28 69 6e 29 29 21 3d 45 4f 46 20 29 7b 0a 20 20  (in))!=EOF ){.  
a980: 20 20 20 20 70 75 74 63 28 63 2c 73 74 64 6f 75      putc(c,stdou
a990: 74 29 3b 0a 20 20 20 20 20 20 6e 4f 75 74 2b 2b  t);.      nOut++
a9a0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
a9b0: 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
a9c0: 20 7d 0a 20 20 66 66 6c 75 73 68 28 73 74 64 6f   }.  fflush(stdo
a9d0: 75 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e  ut);.  MakeLogEn
a9e0: 74 72 79 28 30 29 3b 0a 0a 20 20 2f 2a 20 54 68  try(0);..  /* Th
a9f0: 65 20 6e 65 78 74 20 72 65 71 75 65 73 74 20 6d  e next request m
aa00: 75 73 74 20 61 72 72 69 76 65 20 77 69 74 68 69  ust arrive withi
aa10: 6e 20 33 30 20 73 65 63 6f 6e 64 73 20 6f 72 20  n 30 seconds or 
aa20: 77 65 20 63 6c 6f 73 65 20 74 68 65 20 63 6f 6e  we close the con
aa30: 6e 65 63 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6f  nection.  */.  o
aa40: 6d 69 74 4c 6f 67 20 3d 20 31 3b 0a 20 20 61 6c  mitLog = 1;.  al
aa50: 61 72 6d 28 33 30 29 3b 0a 7d 0a 0a 0a 69 6e 74  arm(30);.}...int
aa60: 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20   main(int argc, 
aa70: 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20  char **argv){.  
aa80: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
aa90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
aaa0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 63  p counter */.  c
aab0: 68 61 72 20 2a 7a 50 65 72 6d 55 73 65 72 20 3d  har *zPermUser =
aac0: 20 30 3b 20 20 20 20 20 20 2f 2a 20 52 75 6e 20   0;      /* Run 
aad0: 64 61 65 6d 6f 6e 20 77 69 74 68 20 74 68 69 73  daemon with this
aae0: 20 75 73 65 72 27 73 20 70 65 72 6d 69 73 73 69   user's permissi
aaf0: 6f 6e 73 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 63  ons */..  /* Rec
ab00: 6f 72 64 20 74 68 65 20 74 69 6d 65 20 77 68 65  ord the time whe
ab10: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 65 67  n processing beg
ab20: 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 74 69 6d 65  ins..  */.  time
ab30: 28 26 62 65 67 69 6e 54 69 6d 65 29 3b 0a 0a 20  (&beginTime);.. 
ab40: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6d 6d 61 6e   /* Parse comman
ab50: 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 73  d-line arguments
ab60: 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 61  .  */.  while( a
ab70: 72 67 63 3e 32 20 26 26 20 61 72 67 76 5b 31 5d  rgc>2 && argv[1]
ab80: 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [0]=='-' ){.    
ab90: 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
aba0: 31 5d 2c 22 2d 75 73 65 72 22 29 3d 3d 30 20 29  1],"-user")==0 )
abb0: 7b 0a 20 20 20 20 20 20 7a 50 65 72 6d 55 73 65  {.      zPermUse
abc0: 72 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 20  r = argv[2];.   
abd0: 20 20 20 61 72 67 76 20 2b 3d 20 32 3b 0a 20 20     argv += 2;.  
abe0: 20 20 20 20 61 72 67 63 20 2d 3d 20 32 3b 0a 20      argc -= 2;. 
abf0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
ac00: 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22 2d 72 6f  cmp(argv[1],"-ro
ac10: 6f 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ot")==0 ){.     
ac20: 20 7a 52 6f 6f 74 20 3d 20 61 72 67 76 5b 32 5d   zRoot = argv[2]
ac30: 3b 0a 20 20 20 20 20 20 61 72 67 76 20 2b 3d 20  ;.      argv += 
ac40: 32 3b 0a 20 20 20 20 20 20 61 72 67 63 20 2d 3d  2;.      argc -=
ac50: 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   2;.    }else if
ac60: 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 31 5d  ( strcmp(argv[1]
ac70: 2c 22 2d 6c 6f 67 66 69 6c 65 22 29 3d 3d 30 20  ,"-logfile")==0 
ac80: 29 7b 0a 20 20 20 20 20 20 7a 4c 6f 67 46 69 6c  ){.      zLogFil
ac90: 65 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 20  e = argv[2];.   
aca0: 20 20 20 61 72 67 76 20 2b 3d 20 32 3b 0a 20 20     argv += 2;.  
acb0: 20 20 20 20 61 72 67 63 20 2d 3d 20 32 3b 0a 20      argc -= 2;. 
acc0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
acd0: 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22 2d 68 74  cmp(argv[1],"-ht
ace0: 74 70 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tps")==0 ){.    
acf0: 20 20 75 73 65 48 74 74 70 73 20 3d 20 61 74 6f    useHttps = ato
ad00: 69 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20  i(argv[2]);.    
ad10: 20 20 7a 48 74 74 70 20 3d 20 75 73 65 48 74 74    zHttp = useHtt
ad20: 70 73 20 3f 20 22 68 74 74 70 22 20 3a 20 22 68  ps ? "http" : "h
ad30: 74 74 70 73 22 3b 0a 20 20 20 20 20 20 61 72 67  ttps";.      arg
ad40: 76 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 61 72  v += 2;.      ar
ad50: 67 63 20 2d 3d 20 32 3b 0a 20 20 20 20 7d 65 6c  gc -= 2;.    }el
ad60: 73 65 7b 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e  se{.      Malfun
ad70: 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20  ction(__LINE__, 
ad80: 22 75 6e 6b 6e 6f 77 6e 20 61 72 67 75 6d 65 6e  "unknown argumen
ad90: 74 3a 20 5b 25 73 5d 22 2c 20 61 72 67 76 5b 31  t: [%s]", argv[1
ada0: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ]);.    }.  }.  
adb0: 69 66 28 20 7a 52 6f 6f 74 3d 3d 30 20 29 7b 0a  if( zRoot==0 ){.
adc0: 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28      Malfunction(
add0: 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 6e 6f 20 72 6f  __LINE__, "no ro
ade0: 6f 74 20 64 69 72 65 63 74 6f 72 79 20 73 70 65  ot directory spe
adf0: 63 69 66 69 65 64 22 29 3b 0a 20 20 7d 0a 20 20  cified");.  }.  
ae00: 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 64 69 72  .  /* Change dir
ae10: 65 63 74 6f 72 69 65 73 20 74 6f 20 74 68 65 20  ectories to the 
ae20: 72 6f 6f 74 20 6f 66 20 74 68 65 20 48 54 54 50  root of the HTTP
ae30: 20 66 69 6c 65 73 79 73 74 65 6d 0a 20 20 2a 2f   filesystem.  */
ae40: 0a 20 20 69 66 28 20 63 68 64 69 72 28 7a 52 6f  .  if( chdir(zRo
ae50: 6f 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 4d 61  ot)!=0 ){.    Ma
ae60: 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45  lfunction(__LINE
ae70: 5f 5f 2c 20 22 63 61 6e 6e 6f 74 20 63 68 61 6e  __, "cannot chan
ae80: 67 65 20 74 6f 20 64 69 72 65 63 74 6f 72 79 20  ge to directory 
ae90: 5b 25 73 5d 22 2c 20 7a 52 6f 6f 74 29 3b 0a 20  [%s]", zRoot);. 
aea0: 20 7d 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74   }..  /* Attempt
aeb0: 20 74 6f 20 67 6f 20 69 6e 74 6f 20 61 20 63 68   to go into a ch
aec0: 72 6f 6f 74 20 6a 61 69 6c 20 61 73 20 75 73 65  root jail as use
aed0: 72 20 7a 50 65 72 6d 55 73 65 72 0a 20 20 2a 2f  r zPermUser.  */
aee0: 0a 20 20 69 66 28 20 7a 50 65 72 6d 55 73 65 72  .  if( zPermUser
aef0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 70   ){.    struct p
af00: 61 73 73 77 64 20 2a 70 77 64 20 3d 20 67 65 74  asswd *pwd = get
af10: 70 77 6e 61 6d 28 7a 50 65 72 6d 55 73 65 72 29  pwnam(zPermUser)
af20: 3b 0a 20 20 20 20 69 66 28 20 70 77 64 20 29 7b  ;.    if( pwd ){
af30: 0a 20 20 20 20 20 20 69 66 28 20 63 68 72 6f 6f  .      if( chroo
af40: 74 28 22 2e 22 29 3c 30 20 29 7b 0a 20 20 20 20  t(".")<0 ){.    
af50: 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28      Malfunction(
af60: 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 75 6e 61 62 6c  __LINE__, "unabl
af70: 65 20 74 6f 20 63 72 65 61 74 65 20 63 68 72 6f  e to create chro
af80: 6f 74 20 6a 61 69 6c 22 29 3b 0a 20 20 20 20 20  ot jail");.     
af90: 20 7d 0a 20 20 20 20 20 20 73 65 74 67 69 64 28   }.      setgid(
afa0: 70 77 64 2d 3e 70 77 5f 67 69 64 29 3b 0a 20 20  pwd->pw_gid);.  
afb0: 20 20 20 20 73 65 74 75 69 64 28 70 77 64 2d 3e      setuid(pwd->
afc0: 70 77 5f 75 69 64 29 3b 0a 20 20 20 20 20 20 7a  pw_uid);.      z
afd0: 52 6f 6f 74 20 3d 20 22 22 3b 0a 20 20 20 20 7d  Root = "";.    }
afe0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d 61 6c 66  else{.      Malf
aff0: 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f  unction(__LINE__
b000: 2c 20 22 6e 6f 20 68 6f 6d 65 20 64 69 72 65 63  , "no home direc
b010: 74 6f 72 79 20 66 6f 72 20 75 73 65 72 20 5b 25  tory for user [%
b020: 73 5d 22 2c 20 7a 50 65 72 6d 55 73 65 72 29 3b  s]", zPermUser);
b030: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
b040: 20 67 65 74 75 69 64 28 29 3d 3d 30 20 29 7b 0a   getuid()==0 ){.
b050: 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28      Malfunction(
b060: 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 63 61 6e 6e 6f  __LINE__, "canno
b070: 74 20 72 75 6e 20 61 73 20 72 6f 6f 74 22 29 3b  t run as root");
b080: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 74  .  }..  /* Get t
b090: 68 65 20 49 50 20 61 64 64 72 65 73 73 20 66 72  he IP address fr
b0a0: 6f 6d 20 77 68 65 6e 20 74 68 65 20 72 65 71 75  om when the requ
b0b0: 65 73 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 20  est originates. 
b0c0: 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 73 74 72 75   */.  {.    stru
b0d0: 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 20 72  ct sockaddr_in r
b0e0: 65 6d 6f 74 65 4e 61 6d 65 3b 0a 20 20 20 20 69  emoteName;.    i
b0f0: 6e 74 20 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66  nt size = sizeof
b100: 28 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72  (struct sockaddr
b110: 5f 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 67 65  _in);.    if( ge
b120: 74 70 65 65 72 6e 61 6d 65 28 66 69 6c 65 6e 6f  tpeername(fileno
b130: 28 73 74 64 69 6e 29 2c 20 28 73 74 72 75 63 74  (stdin), (struct
b140: 20 73 6f 63 6b 61 64 64 72 2a 29 26 72 65 6d 6f   sockaddr*)&remo
b150: 74 65 4e 61 6d 65 2c 20 26 73 69 7a 65 29 3e 3d  teName, &size)>=
b160: 30 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 6d 6f  0 ){.      zRemo
b170: 74 65 41 64 64 72 20 3d 20 53 74 72 44 75 70 28  teAddr = StrDup(
b180: 69 6e 65 74 5f 6e 74 6f 61 28 72 65 6d 6f 74 65  inet_ntoa(remote
b190: 4e 61 6d 65 2e 73 69 6e 5f 61 64 64 72 29 29 3b  Name.sin_addr));
b1a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
b1b0: 20 50 72 6f 63 65 73 73 20 74 68 65 20 69 6e 70   Process the inp
b1c0: 75 74 20 73 74 72 65 61 6d 20 2a 2f 0a 20 20 66  ut stream */.  f
b1d0: 6f 72 28 69 3d 30 3b 20 69 3c 31 30 30 3b 20 69  or(i=0; i<100; i
b1e0: 2b 2b 29 7b 0a 20 20 20 20 50 72 6f 63 65 73 73  ++){.    Process
b1f0: 4f 6e 65 52 65 71 75 65 73 74 28 30 29 3b 0a 20  OneRequest(0);. 
b200: 20 7d 0a 20 20 50 72 6f 63 65 73 73 4f 6e 65 52   }.  ProcessOneR
b210: 65 71 75 65 73 74 28 31 29 3b 0a 20 20 65 78 69  equest(1);.  exi
b220: 74 28 30 29 3b 0a 7d 0a                          t(0);.}.