Documentation Source Text

Hex Artifact Content
Login

Artifact bd8b06894ff63d13e3ddf4181215edee6056de66:


0000: 2f 2a 0a 2a 2a 20 41 20 73 6d 61 6c 6c 2c 20 73  /*.** A small, s
0010: 69 6d 70 6c 65 20 48 54 54 50 20 73 65 72 76 65  imple HTTP serve
0020: 72 2e 0a 2a 2a 0a 2a 2a 20 46 65 61 74 75 72 65  r..**.** Feature
0030: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 4c  s:.**.**     * L
0040: 61 75 6e 63 68 65 64 20 66 72 6f 6d 20 69 6e 65  aunched from ine
0050: 74 64 0a 2a 2a 20 20 20 20 20 2a 20 4f 6e 65 20  td.**     * One 
0060: 70 72 6f 63 65 73 73 20 70 65 72 20 72 65 71 75  process per requ
0070: 65 73 74 0a 2a 2a 20 20 20 20 20 2a 20 44 65 6c  est.**     * Del
0080: 69 76 65 72 20 73 74 61 74 69 63 20 63 6f 6e 74  iver static cont
0090: 65 6e 74 20 6f 72 20 72 75 6e 20 43 47 49 0a 2a  ent or run CGI.*
00a0: 2a 20 20 20 20 20 2a 20 56 69 72 74 75 61 6c 20  *     * Virtual 
00b0: 73 69 74 65 73 20 62 61 73 65 64 20 6f 6e 20 74  sites based on t
00c0: 68 65 20 22 48 6f 73 74 3a 22 20 70 72 6f 70 65  he "Host:" prope
00d0: 72 74 79 20 6f 66 20 74 68 65 20 48 54 54 50 20  rty of the HTTP 
00e0: 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 2a 20  header.**     * 
00f0: 56 65 72 79 20 73 6d 61 6c 6c 20 63 6f 64 65 20  Very small code 
0100: 62 61 73 65 20 28 31 20 66 69 6c 65 29 20 74 6f  base (1 file) to
0110: 20 66 61 63 69 6c 69 74 79 20 73 65 63 75 72 69   facility securi
0120: 74 79 20 61 75 64 69 74 69 6e 67 0a 2a 2a 20 20  ty auditing.**  
0130: 20 20 20 2a 20 53 69 6d 70 6c 65 20 73 65 74 75     * Simple setu
0140: 70 20 2d 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61  p - no configura
0150: 74 69 6f 6e 20 66 69 6c 65 73 20 74 6f 20 6d 65  tion files to me
0160: 73 73 20 77 69 74 68 2e 0a 2a 2a 20 0a 2a 2a 20  ss with..** .** 
0170: 54 68 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d  This file implem
0180: 65 6e 74 73 20 61 20 73 6d 61 6c 6c 20 61 6e 64  ents a small and
0190: 20 73 69 6d 70 6c 65 20 62 75 74 20 73 65 63 75   simple but secu
01a0: 72 65 20 61 6e 64 20 65 66 66 65 63 74 69 76 65  re and effective
01b0: 20 77 65 62 0a 2a 2a 20 73 65 72 76 65 72 2e 20   web.** server. 
01c0: 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 66 72   There are no fr
01d0: 69 6c 6c 73 2e 20 20 41 6e 79 74 68 69 6e 67 20  ills.  Anything 
01e0: 74 68 61 74 20 63 6f 75 6c 64 20 62 65 20 72 65  that could be re
01f0: 61 73 6f 6e 61 62 6c 79 0a 2a 2a 20 6f 6d 69 74  asonably.** omit
0200: 74 65 64 20 68 61 73 20 62 65 65 6e 2e 0a 2a 2a  ted has been..**
0210: 0a 2a 2a 20 53 65 74 75 70 20 72 75 6c 65 73 3a  .** Setup rules:
0220: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 4c 61  .**.**    (1) La
0230: 75 6e 63 68 20 61 73 20 72 6f 6f 74 20 66 72 6f  unch as root fro
0240: 6d 20 69 6e 65 74 64 20 6c 69 6b 65 20 74 68 69  m inetd like thi
0250: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
0260: 20 20 20 20 68 74 74 70 64 20 2d 6c 6f 67 66 69      httpd -logfi
0270: 6c 65 20 6c 6f 67 66 69 6c 65 20 2d 72 6f 6f 74  le logfile -root
0280: 20 2f 68 6f 6d 65 2f 77 77 77 20 2d 75 73 65 72   /home/www -user
0290: 20 6e 6f 62 6f 64 79 0a 2a 2a 0a 2a 2a 20 20 20   nobody.**.**   
02a0: 20 20 20 20 20 49 74 20 77 69 6c 6c 20 61 75 74       It will aut
02b0: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 72 6f 6f  omatically chroo
02c0: 74 20 74 6f 20 2f 68 6f 6d 65 2f 77 77 77 20 61  t to /home/www a
02d0: 6e 64 20 62 65 63 6f 6d 65 20 75 73 65 72 20 6e  nd become user n
02e0: 6f 62 6f 64 79 2e 0a 2a 2a 20 20 20 20 20 20 20  obody..**       
02f0: 20 54 68 65 20 6c 6f 67 66 69 6c 65 20 6e 61 6d   The logfile nam
0300: 65 20 73 68 6f 75 6c 64 20 62 65 20 72 65 6c 61  e should be rela
0310: 74 69 76 65 20 74 6f 20 74 68 65 20 63 68 72 6f  tive to the chro
0320: 6f 74 20 6a 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 20  ot jail..**.**  
0330: 20 20 28 32 29 20 44 69 72 65 63 74 6f 72 69 65    (2) Directorie
0340: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 2a  s of the form "*
0350: 2e 77 65 62 73 69 74 65 22 20 28 65 78 3a 20 77  .website" (ex: w
0360: 77 77 5f 68 77 61 63 69 5f 63 6f 6d 2e 77 65 62  ww_hwaci_com.web
0370: 73 69 74 65 29 0a 2a 2a 20 20 20 20 20 20 20 20  site).**        
0380: 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74 2e  contain content.
0390: 20 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20    The directory 
03a0: 69 73 20 63 68 6f 73 65 6e 20 62 61 73 65 64 20  is chosen based 
03b0: 6f 6e 20 48 4f 53 54 2e 20 20 49 66 20 6e 6f 0a  on HOST.  If no.
03c0: 2a 2a 20 20 20 20 20 20 20 20 48 4f 53 54 20 6f  **        HOST o
03d0: 72 20 74 68 65 20 68 6f 73 74 20 64 69 72 65 63  r the host direc
03e0: 74 6f 72 79 20 69 73 20 6e 6f 74 20 66 6f 75 6e  tory is not foun
03f0: 64 2c 20 22 64 65 66 61 75 6c 74 2e 77 65 62 73  d, "default.webs
0400: 69 74 65 22 20 69 73 20 75 73 65 64 2e 0a 2a 2a  ite" is used..**
0410: 0a 2a 2a 20 20 20 20 28 33 29 20 41 6e 79 20 66  .**    (3) Any f
0420: 69 6c 65 20 6f 72 20 64 69 72 65 63 74 6f 72 79  ile or directory
0430: 20 77 68 6f 73 65 20 6e 61 6d 65 20 62 65 67 69   whose name begi
0440: 6e 73 20 77 69 74 68 20 22 2e 22 20 6f 72 20 22  ns with "." or "
0450: 2d 22 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  -" is ignored..*
0460: 2a 0a 2a 2a 20 20 20 20 28 34 29 20 43 68 61 72  *.**    (4) Char
0470: 61 63 74 65 72 73 20 6f 74 68 65 72 20 74 68 61  acters other tha
0480: 6e 20 61 2d 7a 41 2d 5a 30 2d 39 5f 2e 2c 2a 7e  n a-zA-Z0-9_.,*~
0490: 2f 20 69 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d  / in the filenam
04a0: 65 20 61 72 65 20 74 72 61 6e 73 6c 61 74 65 64  e are translated
04b0: 0a 2a 2a 20 20 20 20 20 20 20 20 69 6e 74 6f 20  .**        into 
04c0: 5f 2e 20 20 54 68 69 73 20 69 73 20 61 20 64 65  _.  This is a de
04d0: 66 65 6e 73 65 20 61 67 61 69 6e 73 74 20 63 72  fense against cr
04e0: 6f 73 73 2d 73 69 74 65 20 73 63 72 69 70 74 69  oss-site scripti
04f0: 6e 67 20 61 74 74 61 63 6b 73 20 61 6e 64 0a 2a  ng attacks and.*
0500: 2a 20 20 20 20 20 20 20 20 6f 74 68 65 72 20 6d  *        other m
0510: 69 73 63 68 69 65 66 2e 0a 2a 2a 0a 2a 2a 20 20  ischief..**.**  
0520: 20 20 28 35 29 20 45 78 65 63 75 74 61 62 6c 65    (5) Executable
0530: 20 66 69 6c 65 73 20 61 72 65 20 72 75 6e 20 61   files are run a
0540: 73 20 43 47 49 2e 20 20 41 6c 6c 20 6f 74 68 65  s CGI.  All othe
0550: 72 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 69  r files are deli
0560: 76 65 72 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  vered.**        
0570: 61 73 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  as is..**.**    
0580: 28 36 29 20 46 6f 72 20 53 53 4c 20 73 75 70 70  (6) For SSL supp
0590: 6f 72 74 20 75 73 65 20 73 74 75 6e 6e 65 6c 20  ort use stunnel 
05a0: 61 6e 64 20 61 64 64 20 74 68 65 20 2d 68 74 74  and add the -htt
05b0: 70 73 20 31 20 6f 70 74 69 6f 6e 20 6f 6e 20 74  ps 1 option on t
05c0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 68 74 74  he.**        htt
05d0: 70 64 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 2e  pd command-line.
05e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 37 29 20 49 66  .**.**    (7) If
05f0: 20 61 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 2d   a file named "-
0600: 61 75 74 68 22 20 65 78 69 73 74 73 20 69 6e 20  auth" exists in 
0610: 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f  the same directo
0620: 72 79 20 61 73 20 66 69 6c 65 20 74 6f 0a 2a 2a  ry as file to.**
0630: 20 20 20 20 20 20 20 20 62 65 20 72 75 6e 20 61          be run a
0640: 73 20 43 47 49 20 6f 72 20 74 6f 20 62 65 20 64  s CGI or to be d
0650: 65 6c 69 76 65 72 65 64 2c 20 74 68 65 6e 20 69  elivered, then i
0660: 74 20 63 6f 6e 74 61 69 6e 73 20 69 6e 66 6f 72  t contains infor
0670: 6d 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  mation.**       
0680: 20 66 6f 72 20 48 54 54 50 20 42 61 73 69 63 20   for HTTP Basic 
0690: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 2e 20 20  authorization.  
06a0: 53 65 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  See file format 
06b0: 64 65 74 61 69 6c 73 20 62 65 6c 6f 77 2e 0a 2a  details below..*
06c0: 2a 0a 2a 2a 0a 2a 2a 20 42 61 73 69 63 20 41 75  *.**.** Basic Au
06d0: 74 68 6f 72 69 7a 61 74 69 6f 6e 3a 0a 2a 2a 0a  thorization:.**.
06e0: 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 22  ** If the file "
06f0: 2d 61 75 74 68 22 20 65 78 69 73 74 73 20 69 6e  -auth" exists in
0700: 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74   the same direct
0710: 6f 72 79 20 61 73 20 74 68 65 20 63 6f 6e 74 65  ory as the conte
0720: 6e 74 20 66 69 6c 65 0a 2a 2a 20 28 66 6f 72 20  nt file.** (for 
0730: 62 6f 74 68 20 73 74 61 74 69 63 20 63 6f 6e 74  both static cont
0740: 65 6e 74 20 61 6e 64 20 43 47 49 29 20 74 68 65  ent and CGI) the
0750: 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  n it contains th
0760: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73  e information us
0770: 65 64 0a 2a 2a 20 66 6f 72 20 62 61 73 69 63 20  ed.** for basic 
0780: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 2e 20 20  authorization.  
0790: 54 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  The file format 
07a0: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
07b0: 2a 0a 2a 2a 20 20 20 20 2a 20 20 42 6c 61 6e 6b  *.**    *  Blank
07c0: 20 6c 69 6e 65 73 20 61 6e 64 20 6c 69 6e 65 73   lines and lines
07d0: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
07e0: 20 27 23 27 20 61 72 65 20 69 67 6e 6f 72 65 64   '#' are ignored
07f0: 0a 2a 2a 20 20 20 20 2a 20 20 22 68 74 74 70 2d  .**    *  "http-
0800: 72 65 64 69 72 65 63 74 22 20 66 6f 72 63 65 73  redirect" forces
0810: 20 61 20 72 65 64 69 72 65 63 74 20 74 6f 20 48   a redirect to H
0820: 54 54 50 53 20 69 66 20 6e 6f 74 20 74 68 65 72  TTPS if not ther
0830: 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 20 20 20  e already.**    
0840: 2a 20 20 22 68 74 74 70 73 2d 6f 6e 6c 79 22 20  *  "https-only" 
0850: 64 69 73 61 6c 6c 6f 77 73 20 6f 70 65 72 61 74  disallows operat
0860: 69 6f 6e 20 69 6e 20 48 54 54 50 0a 2a 2a 20 20  ion in HTTP.**  
0870: 20 20 2a 20 20 22 75 73 65 72 20 4e 41 4d 45 20    *  "user NAME 
0880: 4c 4f 47 49 4e 3a 50 41 53 53 57 4f 52 44 22 20  LOGIN:PASSWORD" 
0890: 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
08a0: 20 4c 4f 47 49 4e 3a 50 41 53 53 57 4f 52 44 20   LOGIN:PASSWORD 
08b0: 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 68 6f 72  .**       author
08c0: 69 7a 61 74 69 6f 6e 20 63 72 65 64 65 6e 74 69  ization credenti
08d0: 61 6c 73 20 61 72 65 20 70 72 6f 76 69 64 65 64  als are provided
08e0: 2c 20 61 6e 64 20 69 66 20 73 6f 20 73 65 74 73  , and if so sets
08f0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 52 45   the.**       RE
0900: 4d 4f 54 45 5f 55 53 45 52 20 74 6f 20 4e 41 4d  MOTE_USER to NAM
0910: 45 2e 0a 2a 2a 20 20 20 20 2a 20 20 22 72 65 61  E..**    *  "rea
0920: 6c 6d 20 54 45 58 54 22 20 73 65 74 73 20 74 68  lm TEXT" sets th
0930: 65 20 72 65 61 6c 6d 20 74 6f 20 54 45 58 54 2e  e realm to TEXT.
0940: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 63 61 6e  .**.** There can
0950: 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 22 75 73   be multiple "us
0960: 65 72 22 20 6c 69 6e 65 73 2e 20 20 49 66 20 6e  er" lines.  If n
0970: 6f 20 22 75 73 65 72 22 20 6c 69 6e 65 20 6d 61  o "user" line ma
0980: 74 63 68 65 73 2c 20 74 68 65 0a 2a 2a 20 72 65  tches, the.** re
0990: 71 75 65 73 74 20 66 61 69 6c 73 20 77 69 74 68  quest fails with
09a0: 20 61 20 34 30 31 20 65 72 72 6f 72 2e 0a 2a 2f   a 401 error..*/
09b0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f  .#include <stdio
09c0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74  .h>.#include <ct
09d0: 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ype.h>.#include 
09e0: 3c 73 79 73 6c 6f 67 2e 68 3e 0a 23 69 6e 63 6c  <syslog.h>.#incl
09f0: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23  ude <stdlib.h>.#
0a00: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61  include <sys/sta
0a10: 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75  t.h>.#include <u
0a20: 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64  nistd.h>.#includ
0a30: 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69 6e 63  e <fcntl.h>.#inc
0a40: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
0a50: 23 69 6e 63 6c 75 64 65 20 3c 70 77 64 2e 68 3e  #include <pwd.h>
0a60: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
0a70: 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ime.h>.#include 
0a80: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
0a90: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 6f 63 6b  nclude <sys/sock
0aa0: 65 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  et.h>.#include <
0ab0: 73 79 73 2f 77 61 69 74 2e 68 3e 0a 23 69 6e 63  sys/wait.h>.#inc
0ac0: 6c 75 64 65 20 3c 6e 65 74 69 6e 65 74 2f 69 6e  lude <netinet/in
0ad0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 72  .h>.#include <ar
0ae0: 70 61 2f 69 6e 65 74 2e 68 3e 0a 23 69 6e 63 6c  pa/inet.h>.#incl
0af0: 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e 0a 23  ude <stdarg.h>.#
0b00: 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e  include <time.h>
0b10: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
0b20: 69 6d 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  imes.h>.#include
0b30: 20 3c 6e 65 74 64 62 2e 68 3e 0a 23 69 6e 63 6c   <netdb.h>.#incl
0b40: 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69  ude <errno.h>.#i
0b50: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 72 65 73 6f  nclude <sys/reso
0b60: 75 72 63 65 2e 68 3e 0a 23 69 66 64 65 66 20 6c  urce.h>.#ifdef l
0b70: 69 6e 75 78 0a 23 69 6e 63 6c 75 64 65 20 3c 73  inux.#include <s
0b80: 79 73 2f 73 65 6e 64 66 69 6c 65 2e 68 3e 0a 23  ys/sendfile.h>.#
0b90: 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20 3c  endif.#include <
0ba0: 61 73 73 65 72 74 2e 68 3e 0a 0a 2f 2a 0a 2a 2a  assert.h>../*.**
0bb0: 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20 73   Configure the s
0bc0: 65 72 76 65 72 20 62 79 20 73 65 74 74 69 6e 67  erver by setting
0bd0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
0be0: 61 63 72 6f 73 20 61 6e 64 20 72 65 63 6f 6d 70  acros and recomp
0bf0: 69 6c 69 6e 67 2e 0a 2a 2f 0a 23 69 66 6e 64 65  iling..*/.#ifnde
0c00: 66 20 44 45 46 41 55 4c 54 5f 50 4f 52 54 0a 23  f DEFAULT_PORT.#
0c10: 64 65 66 69 6e 65 20 44 45 46 41 55 4c 54 5f 50  define DEFAULT_P
0c20: 4f 52 54 20 22 38 30 22 0a 23 65 6e 64 69 66 0a  ORT "80".#endif.
0c30: 23 69 66 6e 64 65 66 20 4d 41 58 5f 43 4f 4e 54  #ifndef MAX_CONT
0c40: 45 4e 54 5f 4c 45 4e 47 54 48 0a 23 64 65 66 69  ENT_LENGTH.#defi
0c50: 6e 65 20 4d 41 58 5f 43 4f 4e 54 45 4e 54 5f 4c  ne MAX_CONTENT_L
0c60: 45 4e 47 54 48 20 39 30 30 30 30 30 30 0a 23 65  ENGTH 9000000.#e
0c70: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 72  ndif../*.** We r
0c80: 65 63 6f 72 64 20 6d 6f 73 74 20 6f 66 20 74 68  ecord most of th
0c90: 65 20 73 74 61 74 65 20 69 6e 66 6f 72 6d 61 74  e state informat
0ca0: 69 6f 6e 20 61 73 20 67 6c 6f 62 61 6c 20 76 61  ion as global va
0cb0: 72 69 61 62 6c 65 73 2e 20 20 54 68 69 73 0a 2a  riables.  This.*
0cc0: 2a 20 73 61 76 65 73 20 68 61 76 69 6e 67 20 74  * saves having t
0cd0: 6f 20 70 61 73 73 20 69 6e 66 6f 72 6d 61 74 69  o pass informati
0ce0: 6f 6e 20 74 6f 20 73 75 62 72 6f 75 74 69 6e 65  on to subroutine
0cf0: 73 20 61 73 20 70 61 72 61 6d 65 74 65 72 73 2c  s as parameters,
0d00: 20 61 6e 64 0a 2a 2a 20 6d 61 6b 65 73 20 74 68   and.** makes th
0d10: 65 20 65 78 65 63 75 74 61 62 6c 65 20 73 6d 61  e executable sma
0d20: 6c 6c 65 72 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69  ller....*/.stati
0d30: 63 20 63 68 61 72 20 2a 7a 52 6f 6f 74 20 3d 20  c char *zRoot = 
0d40: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  0;          /* R
0d50: 6f 6f 74 20 64 69 72 65 63 74 6f 72 79 20 6f 66  oot directory of
0d60: 20 74 68 65 20 77 65 62 73 69 74 65 20 2a 2f 0a   the website */.
0d70: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 54 6d  static char *zTm
0d80: 70 4e 61 6d 20 3d 20 30 3b 20 20 20 20 20 20 20  pNam = 0;       
0d90: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 65   /* Name of a te
0da0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a  mporary file */.
0db0: 73 74 61 74 69 63 20 63 68 61 72 20 7a 54 6d 70  static char zTmp
0dc0: 4e 61 6d 42 75 66 5b 35 30 30 5d 3b 20 20 20 20  NamBuf[500];    
0dd0: 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c   /* Space to hol
0de0: 64 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  d the temporary 
0df0: 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 73 74 61 74  filename */.stat
0e00: 69 63 20 63 68 61 72 20 2a 7a 50 72 6f 74 6f 63  ic char *zProtoc
0e10: 6f 6c 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  ol = 0;      /* 
0e20: 54 68 65 20 70 72 6f 74 6f 63 6f 6c 20 62 65 69  The protocol bei
0e30: 6e 67 20 75 73 69 6e 67 20 62 79 20 74 68 65 20  ng using by the 
0e40: 62 72 6f 77 73 65 72 20 2a 2f 0a 73 74 61 74 69  browser */.stati
0e50: 63 20 63 68 61 72 20 2a 7a 4d 65 74 68 6f 64 20  c char *zMethod 
0e60: 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
0e70: 68 65 20 6d 65 74 68 6f 64 2e 20 20 4d 75 73 74  he method.  Must
0e80: 20 62 65 20 47 45 54 20 2a 2f 0a 73 74 61 74 69   be GET */.stati
0e90: 63 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74 20  c char *zScript 
0ea0: 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
0eb0: 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74  he object to ret
0ec0: 72 69 65 76 65 20 2a 2f 0a 73 74 61 74 69 63 20  rieve */.static 
0ed0: 63 68 61 72 20 2a 7a 52 65 61 6c 53 63 72 69 70  char *zRealScrip
0ee0: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 54 68 65  t = 0;    /* The
0ef0: 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74 72 69   object to retri
0f00: 65 76 65 2e 20 20 53 61 6d 65 20 61 73 20 7a 53  eve.  Same as zS
0f10: 63 72 69 70 74 0a 20 20 20 20 20 20 20 20 20 20  cript.          
0f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f30: 20 20 20 20 20 20 20 2a 2a 20 65 78 63 65 70 74         ** except
0f40: 20 6d 69 67 68 74 20 68 61 76 65 20 22 2f 69 6e   might have "/in
0f50: 64 65 78 2e 68 74 6d 6c 22 20 61 70 70 65 6e 64  dex.html" append
0f60: 65 64 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  ed */.static cha
0f70: 72 20 2a 7a 48 6f 6d 65 20 3d 20 30 3b 20 20 20  r *zHome = 0;   
0f80: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 69         /* The di
0f90: 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69  rectory containi
0fa0: 6e 67 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 73 74  ng content */.st
0fb0: 61 74 69 63 20 63 68 61 72 20 2a 7a 51 75 65 72  atic char *zQuer
0fc0: 79 53 74 72 69 6e 67 20 3d 20 30 3b 20 20 20 2f  yString = 0;   /
0fd0: 2a 20 54 68 65 20 71 75 65 72 79 20 73 74 72 69  * The query stri
0fe0: 6e 67 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66  ng on the end of
0ff0: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 73 74 61   the name */.sta
1000: 74 69 63 20 63 68 61 72 20 2a 7a 46 69 6c 65 20  tic char *zFile 
1010: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
1020: 20 54 68 65 20 66 69 6c 65 6e 61 6d 65 20 6f 66   The filename of
1030: 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 72   the object to r
1040: 65 74 72 69 65 76 65 20 2a 2f 0a 73 74 61 74 69  etrieve */.stati
1050: 63 20 69 6e 74 20 6c 65 6e 46 69 6c 65 20 3d 20  c int lenFile = 
1060: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  0;          /* L
1070: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a 46 69  ength of the zFi
1080: 6c 65 20 6e 61 6d 65 20 2a 2f 0a 73 74 61 74 69  le name */.stati
1090: 63 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30  c char *zDir = 0
10a0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
10b0: 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63  ame of the direc
10c0: 74 6f 72 79 20 68 6f 6c 64 69 6e 67 20 7a 46 69  tory holding zFi
10d0: 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  le */.static cha
10e0: 72 20 2a 7a 50 61 74 68 49 6e 66 6f 20 3d 20 30  r *zPathInfo = 0
10f0: 3b 20 20 20 20 20 20 2f 2a 20 50 61 72 74 20 6f  ;      /* Part o
1100: 66 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 70  f the pathname p
1110: 61 73 74 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a  ast the file */.
1120: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 41 67  static char *zAg
1130: 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ent = 0;        
1140: 20 2f 2a 20 57 68 61 74 20 74 79 70 65 20 69 66   /* What type if
1150: 20 62 72 6f 77 73 65 72 20 69 73 20 6d 61 6b 69   browser is maki
1160: 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f  ng this query */
1170: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 53  .static char *zS
1180: 65 72 76 65 72 4e 61 6d 65 20 3d 20 30 3b 20 20  erverName = 0;  
1190: 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 61 66    /* The name af
11a0: 74 65 72 20 74 68 65 20 68 74 74 70 3a 2f 2f 20  ter the http:// 
11b0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
11c0: 7a 53 65 72 76 65 72 50 6f 72 74 20 3d 20 30 3b  zServerPort = 0;
11d0: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 72 74 20      /* The port 
11e0: 6e 75 6d 62 65 72 20 2a 2f 0a 73 74 61 74 69 63  number */.static
11f0: 20 63 68 61 72 20 2a 7a 43 6f 6f 6b 69 65 20 3d   char *zCookie =
1200: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f   0;        /* Co
1210: 6f 6b 69 65 73 20 72 65 70 6f 72 74 65 64 20 77  okies reported w
1220: 69 74 68 20 74 68 65 20 72 65 71 75 65 73 74 20  ith the request 
1230: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
1240: 7a 48 74 74 70 48 6f 73 74 20 3d 20 30 3b 20 20  zHttpHost = 0;  
1250: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 61 63 63 6f      /* Name acco
1260: 72 64 69 6e 67 20 74 6f 20 74 68 65 20 77 65 62  rding to the web
1270: 20 62 72 6f 77 73 65 72 20 2a 2f 0a 73 74 61 74   browser */.stat
1280: 69 63 20 63 68 61 72 20 2a 7a 52 65 61 6c 50 6f  ic char *zRealPo
1290: 72 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  rt = 0;      /* 
12a0: 54 68 65 20 72 65 61 6c 20 54 43 50 20 70 6f 72  The real TCP por
12b0: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 61  t when running a
12c0: 73 20 64 61 65 6d 6f 6e 20 2a 2f 0a 73 74 61 74  s daemon */.stat
12d0: 69 63 20 63 68 61 72 20 2a 7a 52 65 6d 6f 74 65  ic char *zRemote
12e0: 41 64 64 72 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Addr = 0;    /* 
12f0: 49 50 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  IP address of th
1300: 65 20 72 65 71 75 65 73 74 20 2a 2f 0a 73 74 61  e request */.sta
1310: 74 69 63 20 63 68 61 72 20 2a 7a 52 65 66 65 72  tic char *zRefer
1320: 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
1330: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 61 67   Name of the pag
1340: 65 20 74 68 61 74 20 72 65 66 65 72 65 64 20 74  e that refered t
1350: 6f 20 75 73 20 2a 2f 0a 73 74 61 74 69 63 20 63  o us */.static c
1360: 68 61 72 20 2a 7a 41 63 63 65 70 74 20 3d 20 30  har *zAccept = 0
1370: 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74  ;        /* What
1380: 20 66 6f 72 6d 61 74 73 20 77 69 6c 6c 20 62 65   formats will be
1390: 20 61 63 63 65 70 74 65 64 20 2a 2f 0a 73 74 61   accepted */.sta
13a0: 74 69 63 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65  tic char *zConte
13b0: 6e 74 4c 65 6e 67 74 68 20 3d 20 30 3b 20 2f 2a  ntLength = 0; /*
13c0: 20 43 6f 6e 74 65 6e 74 20 6c 65 6e 67 74 68 20   Content length 
13d0: 72 65 70 6f 72 74 65 64 20 69 6e 20 74 68 65 20  reported in the 
13e0: 68 65 61 64 65 72 20 2a 2f 0a 73 74 61 74 69 63  header */.static
13f0: 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 54   char *zContentT
1400: 79 70 65 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f  ype = 0;   /* Co
1410: 6e 74 65 6e 74 20 74 79 70 65 20 72 65 70 6f 72  ntent type repor
1420: 74 65 64 20 69 6e 20 74 68 65 20 68 65 61 64 65  ted in the heade
1430: 72 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  r */.static char
1440: 20 2a 7a 51 75 65 72 79 53 75 66 66 69 78 20 3d   *zQuerySuffix =
1450: 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 72   0;   /* The par
1460: 74 20 6f 66 20 74 68 65 20 55 52 4c 20 61 66 74  t of the URL aft
1470: 65 72 20 74 68 65 20 66 69 72 73 74 20 3f 20 2a  er the first ? *
1480: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a  /.static char *z
1490: 41 75 74 68 54 79 70 65 20 3d 20 30 3b 20 20 20  AuthType = 0;   
14a0: 20 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74     /* Authorizat
14b0: 69 6f 6e 20 74 79 70 65 20 28 62 61 73 69 63 20  ion type (basic 
14c0: 6f 72 20 64 69 67 65 73 74 29 20 2a 2f 0a 73 74  or digest) */.st
14d0: 61 74 69 63 20 63 68 61 72 20 2a 7a 41 75 74 68  atic char *zAuth
14e0: 41 72 67 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  Arg = 0;       /
14f0: 2a 20 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  * Authorization 
1500: 76 61 6c 75 65 73 20 2a 2f 0a 73 74 61 74 69 63  values */.static
1510: 20 63 68 61 72 20 2a 7a 52 65 6d 6f 74 65 55 73   char *zRemoteUs
1520: 65 72 20 3d 20 30 3b 20 20 20 20 2f 2a 20 52 45  er = 0;    /* RE
1530: 4d 4f 54 45 5f 55 53 45 52 20 73 65 74 20 62 79  MOTE_USER set by
1540: 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 6d   authorization m
1550: 6f 64 75 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20  odule */.static 
1560: 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 20 20 20 20  int nIn = 0;    
1570: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1580: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
1590: 69 6e 70 75 74 20 2a 2f 0a 73 74 61 74 69 63 20  input */.static 
15a0: 69 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 20 20 20  int nOut = 0;   
15b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
15c0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
15d0: 6f 75 74 70 75 74 20 2a 2f 0a 73 74 61 74 69 63  output */.static
15e0: 20 63 68 61 72 20 7a 52 65 70 6c 79 53 74 61 74   char zReplyStat
15f0: 75 73 5b 34 5d 3b 20 20 20 20 20 2f 2a 20 52 65  us[4];     /* Re
1600: 70 6c 79 20 73 74 61 74 75 73 20 63 6f 64 65 20  ply status code 
1610: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74  */.static int st
1620: 61 74 75 73 53 65 6e 74 20 3d 20 30 3b 20 20 20  atusSent = 0;   
1630: 20 20 20 20 2f 2a 20 54 72 75 65 20 61 66 74 65      /* True afte
1640: 72 20 73 74 61 74 75 73 20 6c 69 6e 65 20 69 73  r status line is
1650: 20 73 65 6e 74 20 2a 2f 0a 73 74 61 74 69 63 20   sent */.static 
1660: 63 68 61 72 20 2a 7a 4c 6f 67 46 69 6c 65 20 3d  char *zLogFile =
1670: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67   0;       /* Log
1680: 20 74 6f 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   to this file */
1690: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 62 75  .static int debu
16a0: 67 46 6c 61 67 20 3d 20 30 3b 20 20 20 20 20 20  gFlag = 0;      
16b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 62 65 69    /* True if bei
16c0: 6e 67 20 64 65 62 75 67 67 65 64 20 2a 2f 0a 73  ng debugged */.s
16d0: 74 61 74 69 63 20 74 69 6d 65 5f 74 20 62 65 67  tatic time_t beg
16e0: 69 6e 54 69 6d 65 3b 20 20 20 20 20 20 20 20 20  inTime;         
16f0: 2f 2a 20 54 69 6d 65 20 77 68 65 6e 20 74 68 69  /* Time when thi
1700: 73 20 70 72 6f 63 65 73 73 20 73 74 61 72 74 73  s process starts
1710: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63   */.static int c
1720: 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d  loseConnection =
1730: 20 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20   0;  /* True to 
1740: 73 65 6e 64 20 43 6f 6e 6e 65 63 74 69 6f 6e 3a  send Connection:
1750: 20 63 6c 6f 73 65 20 69 6e 20 72 65 70 6c 79 20   close in reply 
1760: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 52  */.static int nR
1770: 65 71 75 65 73 74 20 3d 20 30 3b 20 20 20 20 20  equest = 0;     
1780: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1790: 20 72 65 71 75 65 73 74 73 20 70 72 6f 63 65 73   requests proces
17a0: 73 65 64 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  sed */.static in
17b0: 74 20 6f 6d 69 74 4c 6f 67 20 3d 20 30 3b 20 20  t omitLog = 0;  
17c0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
17d0: 74 20 6d 61 6b 65 20 6c 6f 67 66 69 6c 65 20 65  t make logfile e
17e0: 6e 74 72 69 65 73 20 69 66 20 74 72 75 65 20 2a  ntries if true *
17f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73 65  /.static int use
1800: 48 74 74 70 73 20 3d 20 30 3b 20 20 20 20 20 20  Https = 0;      
1810: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73     /* True to us
1820: 65 20 48 54 54 50 53 3a 20 69 6e 73 74 65 61 64  e HTTPS: instead
1830: 20 6f 66 20 48 54 54 50 3a 20 2a 2f 0a 73 74 61   of HTTP: */.sta
1840: 74 69 63 20 63 68 61 72 20 2a 7a 48 74 74 70 20  tic char *zHttp 
1850: 3d 20 22 68 74 74 70 22 3b 20 20 20 20 20 2f 2a  = "http";     /*
1860: 20 68 74 74 70 20 6f 72 20 68 74 74 70 73 20 2a   http or https *
1870: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73 65  /.static int use
1880: 54 69 6d 65 6f 75 74 20 3d 20 31 3b 20 20 20 20  Timeout = 1;    
1890: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73     /* True to us
18a0: 65 20 74 69 6d 65 73 20 2a 2f 0a 73 74 61 74 69  e times */.stati
18b0: 63 20 69 6e 74 20 69 70 76 36 4f 6e 6c 79 20 3d  c int ipv6Only =
18c0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 55   0;         /* U
18d0: 73 65 20 49 50 76 36 20 6f 6e 6c 79 20 2a 2f 0a  se IPv6 only */.
18e0: 73 74 61 74 69 63 20 69 6e 74 20 69 70 76 34 4f  static int ipv4O
18f0: 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nly = 0;        
1900: 20 2f 2a 20 55 73 65 20 49 50 76 34 20 6f 6e 6c   /* Use IPv4 onl
1910: 79 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  y */../*.** Chan
1920: 67 65 20 65 76 65 72 79 20 73 70 61 63 65 20 6f  ge every space o
1930: 72 20 75 6e 70 72 69 6e 74 61 62 6c 65 20 63 68  r unprintable ch
1940: 61 72 61 63 74 65 72 20 69 6e 20 74 68 65 20 7a  aracter in the z
1950: 41 67 65 6e 74 5b 5d 20 73 74 72 69 6e 67 0a 2a  Agent[] string.*
1960: 2a 20 69 6e 74 6f 20 61 6e 20 5f 2e 0a 2a 2a 0a  * into an _..**.
1970: 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 61  ** If the user a
1980: 67 65 6e 74 20 73 74 72 69 6e 67 20 63 6f 6e 74  gent string cont
1990: 61 69 6e 73 20 63 65 72 74 61 69 6e 20 70 72 6f  ains certain pro
19a0: 68 69 62 69 74 65 64 20 73 74 72 69 6e 67 2c 20  hibited string, 
19b0: 74 68 65 6e 0a 2a 2a 20 65 78 69 74 20 69 6d 6d  then.** exit imm
19c0: 65 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61  ediately..*/.sta
19d0: 74 69 63 20 76 6f 69 64 20 46 69 78 75 70 55 73  tic void FixupUs
19e0: 65 72 41 67 65 6e 74 28 76 6f 69 64 29 7b 0a 20  erAgent(void){. 
19f0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 41   int i;.  if( zA
1a00: 67 65 6e 74 3d 3d 30 20 7c 7c 20 7a 41 67 65 6e  gent==0 || zAgen
1a10: 74 5b 30 5d 3d 3d 30 20 29 20 7a 41 67 65 6e 74  t[0]==0 ) zAgent
1a20: 20 3d 20 22 2a 22 3b 0a 20 20 66 6f 72 28 69 3d   = "*";.  for(i=
1a30: 30 3b 20 7a 41 67 65 6e 74 5b 69 5d 3b 20 69 2b  0; zAgent[i]; i+
1a40: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20  +){.    int c = 
1a50: 7a 41 67 65 6e 74 5b 69 5d 3b 0a 20 20 20 20 69  zAgent[i];.    i
1a60: 66 28 20 63 3c 27 21 27 20 7c 7c 20 63 3e 27 7e  f( c<'!' || c>'~
1a70: 27 20 20 29 7b 20 7a 41 67 65 6e 74 5b 69 5d 20  '  ){ zAgent[i] 
1a80: 3d 20 27 5f 27 3b 20 7d 0a 20 20 7d 0a 23 69 66  = '_'; }.  }.#if
1a90: 20 30 0a 20 20 69 66 28 20 73 74 72 6e 63 6d 70   0.  if( strncmp
1aa0: 28 7a 41 67 65 6e 74 2c 22 6d 73 6e 62 6f 74 22  (zAgent,"msnbot"
1ab0: 2c 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78  ,6)==0 ){.    ex
1ac0: 69 74 28 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  it(0);.  }.#endi
1ad0: 66 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 41 67  f.  for(i=0; zAg
1ae0: 65 6e 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ent[i]; i++){.  
1af0: 20 20 69 66 28 20 7a 41 67 65 6e 74 5b 69 5d 3d    if( zAgent[i]=
1b00: 3d 27 57 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='W' && strncmp(
1b10: 26 7a 41 67 65 6e 74 5b 69 5d 2c 22 57 69 6e 64  &zAgent[i],"Wind
1b20: 6f 77 73 5f 39 22 2c 39 29 3d 3d 30 20 29 7b 0a  ows_9",9)==0 ){.
1b30: 20 20 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20        exit(0);. 
1b40: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1b50: 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20  * Make an entry 
1b60: 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e  in the log file.
1b70: 20 20 49 66 20 74 68 65 20 48 54 54 50 20 63 6f    If the HTTP co
1b80: 6e 6e 65 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  nnection should 
1b90: 62 65 0a 2a 2a 20 63 6c 6f 73 65 64 2c 20 74 68  be.** closed, th
1ba0: 65 6e 20 74 65 72 6d 69 6e 61 74 65 20 74 68 69  en terminate thi
1bb0: 73 20 70 72 6f 63 65 73 73 2e 20 20 4f 74 68 65  s process.  Othe
1bc0: 72 77 69 73 65 20 72 65 74 75 72 6e 2e 0a 2a 2f  rwise return..*/
1bd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d 61 6b  .static void Mak
1be0: 65 4c 6f 67 45 6e 74 72 79 28 69 6e 74 20 61 29  eLogEntry(int a)
1bf0: 7b 0a 20 20 46 49 4c 45 20 2a 6c 6f 67 3b 0a 20  {.  FILE *log;. 
1c00: 20 69 66 28 20 7a 54 6d 70 4e 61 6d 20 29 7b 0a   if( zTmpNam ){.
1c10: 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 54 6d 70 4e      unlink(zTmpN
1c20: 61 6d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  am);.  }.  if( z
1c30: 4c 6f 67 46 69 6c 65 20 26 26 20 21 6f 6d 69 74  LogFile && !omit
1c40: 4c 6f 67 20 29 7b 0a 20 20 20 20 74 69 6d 65 5f  Log ){.    time_
1c50: 74 20 6e 6f 77 3b 0a 20 20 20 20 73 74 72 75 63  t now;.    struc
1c60: 74 20 74 6d 20 2a 70 54 6d 3b 0a 20 20 20 20 73  t tm *pTm;.    s
1c70: 74 72 75 63 74 20 72 75 73 61 67 65 20 73 65 6c  truct rusage sel
1c80: 66 2c 20 63 68 69 6c 64 72 65 6e 3b 0a 20 20 20  f, children;.   
1c90: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
1ca0: 77 61 69 74 53 74 61 74 75 73 3b 0a 20 20 20 20  waitStatus;.    
1cb0: 63 68 61 72 20 7a 44 61 74 65 5b 32 30 30 5d 3b  char zDate[200];
1cc0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 52 4d 20 3d  .    char *zRM =
1cd0: 20 7a 52 65 6d 6f 74 65 55 73 65 72 20 3f 20 7a   zRemoteUser ? z
1ce0: 52 65 6d 6f 74 65 55 73 65 72 20 3a 20 22 2a 22  RemoteUser : "*"
1cf0: 3b 0a 0a 20 20 20 20 69 66 28 20 7a 53 63 72 69  ;..    if( zScri
1d00: 70 74 3d 3d 30 20 7c 7c 20 7a 53 63 72 69 70 74  pt==0 || zScript
1d10: 5b 30 5d 3d 3d 30 20 29 20 7a 53 63 72 69 70 74  [0]==0 ) zScript
1d20: 20 3d 20 22 2a 22 3b 0a 20 20 20 20 69 66 28 20   = "*";.    if( 
1d30: 7a 52 65 6d 6f 74 65 41 64 64 72 3d 3d 30 20 7c  zRemoteAddr==0 |
1d40: 7c 20 7a 52 65 6d 6f 74 65 41 64 64 72 5b 30 5d  | zRemoteAddr[0]
1d50: 3d 3d 30 20 29 20 7a 52 65 6d 6f 74 65 41 64 64  ==0 ) zRemoteAdd
1d60: 72 20 3d 20 22 2a 22 3b 0a 20 20 20 20 69 66 28  r = "*";.    if(
1d70: 20 7a 48 74 74 70 48 6f 73 74 3d 3d 30 20 7c 7c   zHttpHost==0 ||
1d80: 20 7a 48 74 74 70 48 6f 73 74 5b 30 5d 3d 3d 30   zHttpHost[0]==0
1d90: 20 29 20 7a 48 74 74 70 48 6f 73 74 20 3d 20 22   ) zHttpHost = "
1da0: 2a 22 3b 0a 20 20 20 20 69 66 28 20 7a 52 65 66  *";.    if( zRef
1db0: 65 72 65 72 3d 3d 30 20 7c 7c 20 7a 52 65 66 65  erer==0 || zRefe
1dc0: 72 65 72 5b 30 5d 3d 3d 30 20 29 20 7a 52 65 66  rer[0]==0 ) zRef
1dd0: 65 72 65 72 20 3d 20 22 2a 22 3b 0a 20 20 20 20  erer = "*";.    
1de0: 66 6f 72 28 69 3d 30 3b 20 7a 52 65 66 65 72 65  for(i=0; zRefere
1df0: 72 5b 69 5d 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  r[i]; i++){ .   
1e00: 20 20 20 69 66 28 20 69 73 73 70 61 63 65 28 7a     if( isspace(z
1e10: 52 65 66 65 72 65 72 5b 69 5d 29 20 29 7b 20 7a  Referer[i]) ){ z
1e20: 52 65 66 65 72 65 72 20 3d 20 22 2a 22 3b 20 62  Referer = "*"; b
1e30: 72 65 61 6b 3b 20 7d 0a 20 20 20 20 7d 0a 20 20  reak; }.    }.  
1e40: 20 20 69 66 28 20 7a 41 67 65 6e 74 3d 3d 30 20    if( zAgent==0 
1e50: 7c 7c 20 7a 41 67 65 6e 74 5b 30 5d 3d 3d 30 20  || zAgent[0]==0 
1e60: 29 20 7a 41 67 65 6e 74 20 3d 20 22 2a 22 3b 0a  ) zAgent = "*";.
1e70: 20 20 20 20 74 69 6d 65 28 26 6e 6f 77 29 3b 0a      time(&now);.
1e80: 20 20 20 20 70 54 6d 20 3d 20 6c 6f 63 61 6c 74      pTm = localt
1e90: 69 6d 65 28 26 6e 6f 77 29 3b 0a 20 20 20 20 73  ime(&now);.    s
1ea0: 74 72 66 74 69 6d 65 28 7a 44 61 74 65 2c 20 73  trftime(zDate, s
1eb0: 69 7a 65 6f 66 28 7a 44 61 74 65 29 2c 20 22 25  izeof(zDate), "%
1ec0: 59 2d 25 6d 2d 25 64 20 25 48 3a 25 4d 3a 25 53  Y-%m-%d %H:%M:%S
1ed0: 22 2c 20 70 54 6d 29 3b 0a 20 20 20 20 77 61 69  ", pTm);.    wai
1ee0: 74 70 69 64 28 2d 31 2c 20 26 77 61 69 74 53 74  tpid(-1, &waitSt
1ef0: 61 74 75 73 2c 20 57 4e 4f 48 41 4e 47 29 3b 0a  atus, WNOHANG);.
1f00: 20 20 20 20 67 65 74 72 75 73 61 67 65 28 52 55      getrusage(RU
1f10: 53 41 47 45 5f 53 45 4c 46 2c 20 26 73 65 6c 66  SAGE_SELF, &self
1f20: 29 3b 0a 20 20 20 20 67 65 74 72 75 73 61 67 65  );.    getrusage
1f30: 28 52 55 53 41 47 45 5f 43 48 49 4c 44 52 45 4e  (RUSAGE_CHILDREN
1f40: 2c 20 26 63 68 69 6c 64 72 65 6e 29 3b 0a 20 20  , &children);.  
1f50: 20 20 69 66 28 20 28 6c 6f 67 20 3d 20 66 6f 70    if( (log = fop
1f60: 65 6e 28 7a 4c 6f 67 46 69 6c 65 2c 22 61 22 29  en(zLogFile,"a")
1f70: 29 21 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 43  )!=0 ){.#ifdef C
1f80: 4f 4d 42 49 4e 45 44 5f 4c 4f 47 5f 46 4f 52 4d  OMBINED_LOG_FORM
1f90: 41 54 0a 20 20 20 20 20 20 73 74 72 66 74 69 6d  AT.      strftim
1fa0: 65 28 7a 44 61 74 65 2c 20 73 69 7a 65 6f 66 28  e(zDate, sizeof(
1fb0: 7a 44 61 74 65 29 2c 20 22 25 64 2f 25 62 2f 25  zDate), "%d/%b/%
1fc0: 59 3a 25 48 3a 25 4d 3a 25 53 20 25 7a 22 2c 20  Y:%H:%M:%S %z", 
1fd0: 70 54 6d 29 3b 0a 20 20 20 20 20 20 66 70 72 69  pTm);.      fpri
1fe0: 6e 74 66 28 6c 6f 67 2c 20 22 25 73 20 2d 20 2d  ntf(log, "%s - -
1ff0: 20 5b 25 73 5d 20 5c 22 25 73 20 25 73 20 25 73   [%s] \"%s %s %s
2000: 5c 22 20 25 73 20 25 64 20 5c 22 25 73 5c 22 20  \" %s %d \"%s\" 
2010: 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20  \"%s\"\n",.     
2020: 20 20 20 20 20 20 20 20 20 7a 52 65 6d 6f 74 65           zRemote
2030: 41 64 64 72 2c 20 7a 44 61 74 65 2c 20 7a 4d 65  Addr, zDate, zMe
2040: 74 68 6f 64 2c 20 7a 53 63 72 69 70 74 2c 20 7a  thod, zScript, z
2050: 50 72 6f 74 6f 63 6f 6c 2c 0a 20 20 20 20 20 20  Protocol,.      
2060: 20 20 20 20 20 20 20 20 7a 52 65 70 6c 79 53 74          zReplySt
2070: 61 74 75 73 2c 20 6e 4f 75 74 2c 20 7a 52 65 66  atus, nOut, zRef
2080: 65 72 65 72 2c 20 7a 41 67 65 6e 74 29 3b 0a 23  erer, zAgent);.#
2090: 65 6c 73 65 0a 20 20 20 20 20 20 73 74 72 66 74  else.      strft
20a0: 69 6d 65 28 7a 44 61 74 65 2c 20 73 69 7a 65 6f  ime(zDate, sizeo
20b0: 66 28 7a 44 61 74 65 29 2c 20 22 25 59 2d 25 6d  f(zDate), "%Y-%m
20c0: 2d 25 64 20 25 48 3a 25 4d 3a 25 53 22 2c 20 70  -%d %H:%M:%S", p
20d0: 54 6d 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  Tm);.      fprin
20e0: 74 66 28 6c 6f 67 2c 20 22 25 73 20 25 73 20 25  tf(log, "%s %s %
20f0: 73 3a 2f 2f 25 73 25 73 20 25 73 20 25 73 20 25  s://%s%s %s %s %
2100: 64 20 25 64 20 25 64 20 25 64 20 25 64 20 25 64  d %d %d %d %d %d
2110: 20 25 64 20 25 64 20 25 73 20 25 73 5c 6e 22 2c   %d %d %s %s\n",
2120: 20 0a 20 20 20 20 20 20 20 20 20 20 7a 44 61 74   .          zDat
2130: 65 2c 20 7a 52 65 6d 6f 74 65 41 64 64 72 2c 20  e, zRemoteAddr, 
2140: 7a 48 74 74 70 2c 20 7a 48 74 74 70 48 6f 73 74  zHttp, zHttpHost
2150: 2c 20 7a 53 63 72 69 70 74 2c 20 7a 52 65 66 65  , zScript, zRefe
2160: 72 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 7a  rer,.          z
2170: 52 65 70 6c 79 53 74 61 74 75 73 2c 20 6e 49 6e  ReplyStatus, nIn
2180: 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20  , nOut,.        
2190: 20 20 28 69 6e 74 29 28 73 65 6c 66 2e 72 75 5f    (int)(self.ru_
21a0: 75 74 69 6d 65 2e 74 76 5f 73 65 63 2a 31 30 30  utime.tv_sec*100
21b0: 30 30 30 30 20 2b 20 73 65 6c 66 2e 72 75 5f 75  0000 + self.ru_u
21c0: 74 69 6d 65 2e 74 76 5f 75 73 65 63 29 2c 0a 20  time.tv_usec),. 
21d0: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 73           (int)(s
21e0: 65 6c 66 2e 72 75 5f 73 74 69 6d 65 2e 74 76 5f  elf.ru_stime.tv_
21f0: 73 65 63 2a 31 30 30 30 30 30 30 20 2b 20 73 65  sec*1000000 + se
2200: 6c 66 2e 72 75 5f 73 74 69 6d 65 2e 74 76 5f 75  lf.ru_stime.tv_u
2210: 73 65 63 29 2c 0a 20 20 20 20 20 20 20 20 20 20  sec),.          
2220: 28 69 6e 74 29 28 63 68 69 6c 64 72 65 6e 2e 72  (int)(children.r
2230: 75 5f 75 74 69 6d 65 2e 74 76 5f 73 65 63 2a 31  u_utime.tv_sec*1
2240: 30 30 30 30 30 30 20 2b 20 63 68 69 6c 64 72 65  000000 + childre
2250: 6e 2e 72 75 5f 75 74 69 6d 65 2e 74 76 5f 75 73  n.ru_utime.tv_us
2260: 65 63 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28  ec),.          (
2270: 69 6e 74 29 28 63 68 69 6c 64 72 65 6e 2e 72 75  int)(children.ru
2280: 5f 73 74 69 6d 65 2e 74 76 5f 73 65 63 2a 31 30  _stime.tv_sec*10
2290: 30 30 30 30 30 20 2b 20 63 68 69 6c 64 72 65 6e  00000 + children
22a0: 2e 72 75 5f 73 74 69 6d 65 2e 74 76 5f 75 73 65  .ru_stime.tv_use
22b0: 63 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28 69  c),.          (i
22c0: 6e 74 29 28 6e 6f 77 20 2d 20 62 65 67 69 6e 54  nt)(now - beginT
22d0: 69 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ime),.          
22e0: 6e 52 65 71 75 65 73 74 2c 20 7a 41 67 65 6e 74  nRequest, zAgent
22f0: 2c 20 7a 52 4d 0a 20 20 20 20 20 20 29 3b 0a 23  , zRM.      );.#
2300: 65 6e 64 69 66 0a 20 20 20 20 20 20 66 63 6c 6f  endif.      fclo
2310: 73 65 28 6c 6f 67 29 3b 0a 20 20 20 20 20 20 6e  se(log);.      n
2320: 49 6e 20 3d 20 6e 4f 75 74 20 3d 20 30 3b 0a 20  In = nOut = 0;. 
2330: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 63     }.  }.  if( c
2340: 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 29  loseConnection )
2350: 7b 0a 20 20 20 20 65 78 69 74 28 61 29 3b 0a 20  {.    exit(a);. 
2360: 20 7d 0a 20 20 73 74 61 74 75 73 53 65 6e 74 20   }.  statusSent 
2370: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  = 0;.}../*.** Al
2380: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 73 61  locate memory sa
2390: 66 65 6c 79 0a 2a 2f 0a 73 74 61 74 69 63 20 63  fely.*/.static c
23a0: 68 61 72 20 2a 53 61 66 65 4d 61 6c 6c 6f 63 28  har *SafeMalloc(
23b0: 20 69 6e 74 20 73 69 7a 65 20 29 7b 0a 20 20 63   int size ){.  c
23c0: 68 61 72 20 2a 70 3b 0a 0a 20 20 70 20 3d 20 28  har *p;..  p = (
23d0: 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 73 69 7a  char*)malloc(siz
23e0: 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  e);.  if( p==0 )
23f0: 7b 0a 20 20 20 20 73 74 72 63 70 79 28 7a 52 65  {.    strcpy(zRe
2400: 70 6c 79 53 74 61 74 75 73 2c 20 22 39 39 38 22  plyStatus, "998"
2410: 29 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e  );.    MakeLogEn
2420: 74 72 79 28 31 29 3b 0a 20 20 20 20 65 78 69 74  try(1);.    exit
2430: 28 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (1);.  }.  retur
2440: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n p;.}../*.** Se
2450: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65  t the value of e
2460: 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
2470: 62 6c 65 20 7a 56 61 72 20 74 6f 20 7a 56 61 6c  ble zVar to zVal
2480: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ue..*/.static vo
2490: 69 64 20 53 65 74 45 6e 76 28 63 6f 6e 73 74 20  id SetEnv(const 
24a0: 63 68 61 72 20 2a 7a 56 61 72 2c 20 63 6f 6e 73  char *zVar, cons
24b0: 74 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 29 7b  t char *zValue){
24c0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e  .  char *z;.  in
24d0: 74 20 6c 65 6e 3b 0a 20 20 69 66 28 20 7a 56 61  t len;.  if( zVa
24e0: 6c 75 65 3d 3d 30 20 29 20 7a 56 61 6c 75 65 3d  lue==0 ) zValue=
24f0: 22 22 3b 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  "";.  len = strl
2500: 65 6e 28 7a 56 61 72 29 20 2b 20 73 74 72 6c 65  en(zVar) + strle
2510: 6e 28 7a 56 61 6c 75 65 29 20 2b 20 32 3b 0a 20  n(zValue) + 2;. 
2520: 20 7a 20 3d 20 53 61 66 65 4d 61 6c 6c 6f 63 28   z = SafeMalloc(
2530: 6c 65 6e 29 3b 0a 20 20 73 70 72 69 6e 74 66 28  len);.  sprintf(
2540: 7a 2c 22 25 73 3d 25 73 22 2c 7a 56 61 72 2c 7a  z,"%s=%s",zVar,z
2550: 56 61 6c 75 65 29 3b 0a 20 20 70 75 74 65 6e 76  Value);.  putenv
2560: 28 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  (z);.}../*.** Re
2570: 6d 6f 76 65 20 74 68 65 20 66 69 72 73 74 20 73  move the first s
2580: 70 61 63 65 2d 64 65 6c 69 6d 69 74 65 64 20 74  pace-delimited t
2590: 6f 6b 65 6e 20 66 72 6f 6d 20 61 20 73 74 72 69  oken from a stri
25a0: 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ng and return.**
25b0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
25c0: 2e 20 20 41 64 64 20 61 20 4e 55 4c 4c 20 74 6f  .  Add a NULL to
25d0: 20 74 68 65 20 73 74 72 69 6e 67 20 74 6f 20 74   the string to t
25e0: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 74 6f 6b  erminate the tok
25f0: 65 6e 2e 0a 2a 2a 20 4d 61 6b 65 20 2a 7a 4c 65  en..** Make *zLe
2600: 66 74 4f 76 65 72 20 70 6f 69 6e 74 20 74 6f 20  ftOver point to 
2610: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
2620: 20 6e 65 78 74 20 74 6f 6b 65 6e 2e 0a 2a 2f 0a   next token..*/.
2630: 73 74 61 74 69 63 20 63 68 61 72 20 2a 47 65 74  static char *Get
2640: 46 69 72 73 74 45 6c 65 6d 65 6e 74 28 63 68 61  FirstElement(cha
2650: 72 20 2a 7a 49 6e 70 75 74 2c 20 63 68 61 72 20  r *zInput, char 
2660: 2a 2a 7a 4c 65 66 74 4f 76 65 72 29 7b 0a 20 20  **zLeftOver){.  
2670: 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 20 3d 20  char *zResult = 
2680: 30 3b 0a 20 20 69 66 28 20 7a 49 6e 70 75 74 3d  0;.  if( zInput=
2690: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 4c  =0 ){.    if( zL
26a0: 65 66 74 4f 76 65 72 20 29 20 2a 7a 4c 65 66 74  eftOver ) *zLeft
26b0: 4f 76 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 65  Over = 0;.    re
26c0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 77 68  turn 0;.  }.  wh
26d0: 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 7a 49  ile( isspace(*zI
26e0: 6e 70 75 74 29 20 29 7b 20 7a 49 6e 70 75 74 2b  nput) ){ zInput+
26f0: 2b 3b 20 7d 0a 20 20 7a 52 65 73 75 6c 74 20 3d  +; }.  zResult =
2700: 20 7a 49 6e 70 75 74 3b 0a 20 20 77 68 69 6c 65   zInput;.  while
2710: 28 20 2a 7a 49 6e 70 75 74 20 26 26 20 21 69 73  ( *zInput && !is
2720: 73 70 61 63 65 28 2a 7a 49 6e 70 75 74 29 20 29  space(*zInput) )
2730: 7b 20 7a 49 6e 70 75 74 2b 2b 3b 20 7d 0a 20 20  { zInput++; }.  
2740: 69 66 28 20 2a 7a 49 6e 70 75 74 20 29 7b 0a 20  if( *zInput ){. 
2750: 20 20 20 2a 7a 49 6e 70 75 74 20 3d 20 30 3b 0a     *zInput = 0;.
2760: 20 20 20 20 7a 49 6e 70 75 74 2b 2b 3b 0a 20 20      zInput++;.  
2770: 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65    while( isspace
2780: 28 2a 7a 49 6e 70 75 74 29 20 29 7b 20 7a 49 6e  (*zInput) ){ zIn
2790: 70 75 74 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 69  put++; }.  }.  i
27a0: 66 28 20 7a 4c 65 66 74 4f 76 65 72 20 29 7b 20  f( zLeftOver ){ 
27b0: 2a 7a 4c 65 66 74 4f 76 65 72 20 3d 20 7a 49 6e  *zLeftOver = zIn
27c0: 70 75 74 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20  put; }.  return 
27d0: 7a 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  zResult;.}../*.*
27e0: 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  * Make a copy of
27f0: 20 61 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 6d   a string into m
2800: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
2810: 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73  rom malloc..*/.s
2820: 74 61 74 69 63 20 63 68 61 72 20 2a 53 74 72 44  tatic char *StrD
2830: 75 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  up(const char *z
2840: 53 72 63 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44  Src){.  char *zD
2850: 65 73 74 3b 0a 20 20 69 6e 74 20 73 69 7a 65 3b  est;.  int size;
2860: 0a 0a 20 20 69 66 28 20 7a 53 72 63 3d 3d 30 20  ..  if( zSrc==0 
2870: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 69  ) return 0;.  si
2880: 7a 65 20 3d 20 73 74 72 6c 65 6e 28 7a 53 72 63  ze = strlen(zSrc
2890: 29 20 2b 20 31 3b 0a 20 20 7a 44 65 73 74 20 3d  ) + 1;.  zDest =
28a0: 20 28 63 68 61 72 2a 29 53 61 66 65 4d 61 6c 6c   (char*)SafeMall
28b0: 6f 63 28 20 73 69 7a 65 20 29 3b 0a 20 20 73 74  oc( size );.  st
28c0: 72 63 70 79 28 7a 44 65 73 74 2c 7a 53 72 63 29  rcpy(zDest,zSrc)
28d0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 44 65 73 74  ;.  return zDest
28e0: 3b 0a 7d 0a 73 74 61 74 69 63 20 63 68 61 72 20  ;.}.static char 
28f0: 2a 53 74 72 41 70 70 65 6e 64 28 63 68 61 72 20  *StrAppend(char 
2900: 2a 7a 50 72 69 6f 72 2c 20 63 6f 6e 73 74 20 63  *zPrior, const c
2910: 68 61 72 20 2a 7a 53 65 70 2c 20 63 6f 6e 73 74  har *zSep, const
2920: 20 63 68 61 72 20 2a 7a 53 72 63 29 7b 0a 20 20   char *zSrc){.  
2930: 63 68 61 72 20 2a 7a 44 65 73 74 3b 0a 20 20 69  char *zDest;.  i
2940: 6e 74 20 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6e  nt size;.  int n
2950: 31 2c 20 6e 32 3b 0a 0a 20 20 69 66 28 20 7a 53  1, n2;..  if( zS
2960: 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rc==0 ) return 0
2970: 3b 0a 20 20 69 66 28 20 7a 50 72 69 6f 72 3d 3d  ;.  if( zPrior==
2980: 30 20 29 20 72 65 74 75 72 6e 20 53 74 72 44 75  0 ) return StrDu
2990: 70 28 7a 53 72 63 29 3b 0a 20 20 73 69 7a 65 20  p(zSrc);.  size 
29a0: 3d 20 28 6e 31 3d 73 74 72 6c 65 6e 28 7a 53 72  = (n1=strlen(zSr
29b0: 63 29 29 20 2b 20 28 6e 32 3d 73 74 72 6c 65 6e  c)) + (n2=strlen
29c0: 28 7a 53 65 70 29 29 20 2b 20 73 74 72 6c 65 6e  (zSep)) + strlen
29d0: 28 7a 50 72 69 6f 72 29 20 2b 20 31 3b 0a 20 20  (zPrior) + 1;.  
29e0: 7a 44 65 73 74 20 3d 20 28 63 68 61 72 2a 29 53  zDest = (char*)S
29f0: 61 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 20  afeMalloc( size 
2a00: 29 3b 0a 20 20 73 74 72 63 70 79 28 7a 44 65 73  );.  strcpy(zDes
2a10: 74 2c 7a 50 72 69 6f 72 29 3b 0a 20 20 66 72 65  t,zPrior);.  fre
2a20: 65 28 7a 50 72 69 6f 72 29 3b 0a 20 20 73 74 72  e(zPrior);.  str
2a30: 63 70 79 28 26 7a 44 65 73 74 5b 6e 31 5d 2c 7a  cpy(&zDest[n1],z
2a40: 53 65 70 29 3b 0a 20 20 73 74 72 63 70 79 28 26  Sep);.  strcpy(&
2a50: 7a 44 65 73 74 5b 6e 31 2b 6e 32 5d 2c 7a 53 72  zDest[n1+n2],zSr
2a60: 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 44 65  c);.  return zDe
2a70: 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 72 65  st;.}../*.** Bre
2a80: 61 6b 20 61 20 6c 69 6e 65 20 61 74 20 74 68 65  ak a line at the
2a90: 20 66 69 72 73 74 20 5c 6e 20 6f 72 20 5c 72 20   first \n or \r 
2aa0: 63 68 61 72 61 63 74 65 72 20 73 65 65 6e 2e 0a  character seen..
2ab0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 52  */.static void R
2ac0: 65 6d 6f 76 65 4e 65 77 6c 69 6e 65 28 63 68 61  emoveNewline(cha
2ad0: 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 7a 3d 3d  r *z){.  if( z==
2ae0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68  0 ) return;.  wh
2af0: 69 6c 65 28 20 2a 7a 20 26 26 20 2a 7a 21 3d 27  ile( *z && *z!='
2b00: 5c 6e 27 20 26 26 20 2a 7a 21 3d 27 5c 72 27 20  \n' && *z!='\r' 
2b10: 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 2a 7a 20 3d  ){ z++; }.  *z =
2b20: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69   0;.}../*.** Pri
2b30: 6e 74 20 61 20 64 61 74 65 20 74 61 67 20 69 6e  nt a date tag in
2b40: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
2b50: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
2b60: 67 20 69 73 20 7a 54 61 67 2e 0a 2a 2a 20 54 68  g is zTag..** Th
2b70: 65 20 64 61 74 65 20 69 73 20 64 65 74 65 72 6d  e date is determ
2b80: 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 75 6e  ined from the un
2b90: 69 78 20 74 69 6d 65 73 74 61 6d 70 20 67 69 76  ix timestamp giv
2ba0: 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  en..*/.static in
2bb0: 74 20 44 61 74 65 54 61 67 28 63 6f 6e 73 74 20  t DateTag(const 
2bc0: 63 68 61 72 20 2a 7a 54 61 67 2c 20 74 69 6d 65  char *zTag, time
2bd0: 5f 74 20 74 29 7b 0a 20 20 73 74 72 75 63 74 20  _t t){.  struct 
2be0: 74 6d 20 2a 74 6d 3b 0a 20 20 63 68 61 72 20 7a  tm *tm;.  char z
2bf0: 44 61 74 65 5b 31 30 30 5d 3b 0a 20 20 74 6d 20  Date[100];.  tm 
2c00: 3d 20 67 6d 74 69 6d 65 28 26 74 29 3b 0a 20 20  = gmtime(&t);.  
2c10: 73 74 72 66 74 69 6d 65 28 7a 44 61 74 65 2c 20  strftime(zDate, 
2c20: 73 69 7a 65 6f 66 28 7a 44 61 74 65 29 2c 20 22  sizeof(zDate), "
2c30: 25 61 2c 20 25 64 20 20 25 62 20 25 59 20 25 48  %a, %d  %b %Y %H
2c40: 3a 25 4d 3a 25 53 20 25 7a 22 2c 20 74 6d 29 3b  :%M:%S %z", tm);
2c50: 0a 20 20 72 65 74 75 72 6e 20 70 72 69 6e 74 66  .  return printf
2c60: 28 22 25 73 3a 20 25 73 5c 72 5c 6e 22 2c 20 7a  ("%s: %s\r\n", z
2c70: 54 61 67 2c 20 7a 44 61 74 65 29 3b 0a 7d 0a 0a  Tag, zDate);.}..
2c80: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
2c90: 66 69 72 73 74 20 6c 69 6e 65 20 6f 66 20 61 20  first line of a 
2ca0: 72 65 73 70 6f 6e 73 65 20 66 6f 6c 6c 6f 77 65  response followe
2cb0: 64 20 62 79 20 74 68 65 20 73 65 72 76 65 72 20  d by the server 
2cc0: 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  type..*/.static 
2cd0: 76 6f 69 64 20 53 74 61 72 74 52 65 73 70 6f 6e  void StartRespon
2ce0: 73 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  se(const char *z
2cf0: 52 65 73 75 6c 74 43 6f 64 65 29 7b 0a 20 20 74  ResultCode){.  t
2d00: 69 6d 65 5f 74 20 6e 6f 77 3b 0a 20 20 74 69 6d  ime_t now;.  tim
2d10: 65 28 26 6e 6f 77 29 3b 0a 20 20 69 66 28 20 73  e(&now);.  if( s
2d20: 74 61 74 75 73 53 65 6e 74 20 29 20 72 65 74 75  tatusSent ) retu
2d30: 72 6e 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72  rn;.  nOut += pr
2d40: 69 6e 74 66 28 22 25 73 20 25 73 5c 72 5c 6e 22  intf("%s %s\r\n"
2d50: 2c 20 7a 50 72 6f 74 6f 63 6f 6c 2c 20 7a 52 65  , zProtocol, zRe
2d60: 73 75 6c 74 43 6f 64 65 29 3b 0a 20 20 73 74 72  sultCode);.  str
2d70: 6e 63 70 79 28 7a 52 65 70 6c 79 53 74 61 74 75  ncpy(zReplyStatu
2d80: 73 2c 20 7a 52 65 73 75 6c 74 43 6f 64 65 2c 20  s, zResultCode, 
2d90: 33 29 3b 0a 20 20 7a 52 65 70 6c 79 53 74 61 74  3);.  zReplyStat
2da0: 75 73 5b 33 5d 20 3d 20 30 3b 0a 20 20 69 66 28  us[3] = 0;.  if(
2db0: 20 7a 52 65 70 6c 79 53 74 61 74 75 73 5b 30 5d   zReplyStatus[0]
2dc0: 3e 3d 27 34 27 20 29 7b 0a 20 20 20 20 63 6c 6f  >='4' ){.    clo
2dd0: 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 31  seConnection = 1
2de0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6c 6f 73  ;.  }.  if( clos
2df0: 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 29 7b 0a 20  eConnection ){. 
2e00: 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74     nOut += print
2e10: 66 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63  f("Connection: c
2e20: 6c 6f 73 65 5c 72 5c 6e 22 29 3b 0a 20 20 7d 65  lose\r\n");.  }e
2e30: 6c 73 65 7b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d  lse{.    nOut +=
2e40: 20 70 72 69 6e 74 66 28 22 43 6f 6e 6e 65 63 74   printf("Connect
2e50: 69 6f 6e 3a 20 6b 65 65 70 2d 61 6c 69 76 65 5c  ion: keep-alive\
2e60: 72 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 6e 4f 75  r\n");.  }.  nOu
2e70: 74 20 2b 3d 20 44 61 74 65 54 61 67 28 22 44 61  t += DateTag("Da
2e80: 74 65 22 2c 20 6e 6f 77 29 3b 0a 20 20 73 74 61  te", now);.  sta
2e90: 74 75 73 53 65 6e 74 20 3d 20 31 3b 0a 7d 0a 0a  tusSent = 1;.}..
2ea0: 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63  /*.** Tell the c
2eb0: 6c 69 65 6e 74 20 74 68 61 74 20 74 68 65 72 65  lient that there
2ec0: 20 69 73 20 6e 6f 20 73 75 63 68 20 64 6f 63 75   is no such docu
2ed0: 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ment.*/.static v
2ee0: 6f 69 64 20 4e 6f 74 46 6f 75 6e 64 28 69 6e 74  oid NotFound(int
2ef0: 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 53 74 61 72   lineno){.  Star
2f00: 74 52 65 73 70 6f 6e 73 65 28 22 34 30 34 20 4e  tResponse("404 N
2f10: 6f 74 20 46 6f 75 6e 64 22 29 3b 0a 20 20 6e 4f  ot Found");.  nO
2f20: 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20  ut += printf(.  
2f30: 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a    "Content-type:
2f40: 20 74 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e 22 0a   text/html\r\n".
2f50: 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 22      "\r\n".    "
2f60: 3c 68 65 61 64 3e 3c 74 69 74 6c 65 20 6c 69 6e  <head><title lin
2f70: 65 6e 6f 3d 5c 22 25 64 5c 22 3e 4e 6f 74 20 46  eno=\"%d\">Not F
2f80: 6f 75 6e 64 3c 2f 74 69 74 6c 65 3e 3c 2f 68 65  ound</title></he
2f90: 61 64 3e 5c 6e 22 0a 20 20 20 20 22 3c 62 6f 64  ad>\n".    "<bod
2fa0: 79 3e 3c 68 31 3e 44 6f 63 75 6d 65 6e 74 20 4e  y><h1>Document N
2fb0: 6f 74 20 46 6f 75 6e 64 3c 2f 68 31 3e 5c 6e 22  ot Found</h1>\n"
2fc0: 0a 20 20 20 20 22 54 68 65 20 64 6f 63 75 6d 65  .    "The docume
2fd0: 6e 74 20 25 73 20 69 73 20 6e 6f 74 20 61 76 61  nt %s is not ava
2fe0: 69 6c 61 62 6c 65 20 6f 6e 20 74 68 69 73 20 73  ilable on this s
2ff0: 65 72 76 65 72 5c 6e 22 0a 20 20 20 20 22 3c 2f  erver\n".    "</
3000: 62 6f 64 79 3e 5c 6e 22 2c 20 6c 69 6e 65 6e 6f  body>\n", lineno
3010: 2c 20 7a 53 63 72 69 70 74 29 3b 0a 20 20 4d 61  , zScript);.  Ma
3020: 6b 65 4c 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20  keLogEntry(0);. 
3030: 20 65 78 69 74 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a   exit(0);.}../*.
3040: 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c 69 65  ** Tell the clie
3050: 6e 74 20 74 68 61 74 20 61 75 74 68 6f 72 69 7a  nt that authoriz
3060: 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65  ation is require
3070: 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a  d to access the.
3080: 2a 2a 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** document..*/.
3090: 73 74 61 74 69 63 20 76 6f 69 64 20 4e 6f 74 41  static void NotA
30a0: 75 74 68 6f 72 69 7a 65 64 28 63 6f 6e 73 74 20  uthorized(const 
30b0: 63 68 61 72 20 2a 7a 52 65 61 6c 6d 29 7b 0a 20  char *zRealm){. 
30c0: 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22   StartResponse("
30d0: 34 30 31 20 41 75 74 68 6f 72 69 7a 61 74 69 6f  401 Authorizatio
30e0: 6e 20 52 65 71 75 69 72 65 64 22 29 3b 0a 20 20  n Required");.  
30f0: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a  nOut += printf(.
3100: 20 20 20 20 22 57 57 57 2d 41 75 74 68 65 6e 74      "WWW-Authent
3110: 69 63 61 74 65 3a 20 42 61 73 69 63 20 72 65 61  icate: Basic rea
3120: 6c 6d 3d 5c 22 25 73 5c 22 5c 72 5c 6e 22 0a 20  lm=\"%s\"\r\n". 
3130: 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65     "Content-type
3140: 3a 20 74 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e 22  : text/html\r\n"
3150: 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20  .    "\r\n".    
3160: 22 3c 68 65 61 64 3e 3c 74 69 74 6c 65 3e 4e 6f  "<head><title>No
3170: 74 20 41 75 74 68 6f 72 69 7a 65 64 3c 2f 74 69  t Authorized</ti
3180: 74 6c 65 3e 3c 2f 68 65 61 64 3e 5c 6e 22 0a 20  tle></head>\n". 
3190: 20 20 20 22 3c 62 6f 64 79 3e 3c 68 31 3e 34 30     "<body><h1>40
31a0: 31 20 4e 6f 74 20 41 75 74 68 6f 72 69 7a 65 64  1 Not Authorized
31b0: 3c 2f 68 31 3e 5c 6e 22 0a 20 20 20 20 22 41 20  </h1>\n".    "A 
31c0: 6c 6f 67 69 6e 20 61 6e 64 20 70 61 73 73 77 6f  login and passwo
31d0: 72 64 20 61 72 65 20 72 65 71 75 69 72 65 64 20  rd are required 
31e0: 66 6f 72 20 74 68 69 73 20 64 6f 63 75 6d 65 6e  for this documen
31f0: 74 5c 6e 22 0a 20 20 20 20 22 3c 2f 62 6f 64 79  t\n".    "</body
3200: 3e 5c 6e 22 2c 20 7a 52 65 61 6c 6d 29 3b 0a 20  >\n", zRealm);. 
3210: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 29   MakeLogEntry(0)
3220: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20  ;.}../*.** Tell 
3230: 74 68 65 20 63 6c 69 65 6e 74 20 74 68 61 74 20  the client that 
3240: 74 68 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f  there is an erro
3250: 72 20 69 6e 20 74 68 65 20 73 63 72 69 70 74 2e  r in the script.
3260: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3270: 43 67 69 45 72 72 6f 72 28 76 6f 69 64 29 7b 0a  CgiError(void){.
3280: 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28    StartResponse(
3290: 22 35 30 30 20 45 72 72 6f 72 22 29 3b 0a 20 20  "500 Error");.  
32a0: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a  nOut += printf(.
32b0: 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70      "Content-typ
32c0: 65 3a 20 74 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e  e: text/html\r\n
32d0: 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20  ".    "\r\n".   
32e0: 20 22 3c 68 65 61 64 3e 3c 74 69 74 6c 65 3e 43   "<head><title>C
32f0: 47 49 20 50 72 6f 67 72 61 6d 20 45 72 72 6f 72  GI Program Error
3300: 3c 2f 74 69 74 6c 65 3e 3c 2f 68 65 61 64 3e 5c  </title></head>\
3310: 6e 22 0a 20 20 20 20 22 3c 62 6f 64 79 3e 3c 68  n".    "<body><h
3320: 31 3e 43 47 49 20 50 72 6f 67 72 61 6d 20 45 72  1>CGI Program Er
3330: 72 6f 72 3c 2f 68 31 3e 5c 6e 22 0a 20 20 20 20  ror</h1>\n".    
3340: 22 54 68 65 20 43 47 49 20 70 72 6f 67 72 61 6d  "The CGI program
3350: 20 25 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e   %s generated an
3360: 20 65 72 72 6f 72 5c 6e 22 0a 20 20 20 20 22 3c   error\n".    "<
3370: 2f 62 6f 64 79 3e 5c 6e 22 2c 20 7a 53 63 72 69  /body>\n", zScri
3380: 70 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e  pt);.  MakeLogEn
3390: 74 72 79 28 30 29 3b 0a 20 20 65 78 69 74 28 30  try(0);.  exit(0
33a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
33b0: 20 69 73 20 63 61 6c 6c 65 64 20 69 66 20 77 65   is called if we
33c0: 20 74 69 6d 65 6f 75 74 2e 0a 2a 2f 0a 73 74 61   timeout..*/.sta
33d0: 74 69 63 20 76 6f 69 64 20 54 69 6d 65 6f 75 74  tic void Timeout
33e0: 28 69 6e 74 20 4e 6f 74 55 73 65 64 29 7b 0a 20  (int NotUsed){. 
33f0: 20 28 76 6f 69 64 29 4e 6f 74 55 73 65 64 3b 0a   (void)NotUsed;.
3400: 20 20 69 66 28 20 21 64 65 62 75 67 46 6c 61 67    if( !debugFlag
3410: 20 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28 7a   ){.    strcpy(z
3420: 52 65 70 6c 79 53 74 61 74 75 73 2c 20 22 39 39  ReplyStatus, "99
3430: 39 22 29 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f 67  9");.    MakeLog
3440: 45 6e 74 72 79 28 30 29 3b 0a 20 20 20 20 65 78  Entry(0);.    ex
3450: 69 74 28 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  it(0);.  }.}../*
3460: 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c 69  .** Tell the cli
3470: 65 6e 74 20 74 68 61 74 20 74 68 65 72 65 20 69  ent that there i
3480: 73 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68  s an error in th
3490: 65 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61  e script..*/.sta
34a0: 74 69 63 20 76 6f 69 64 20 43 67 69 53 63 72 69  tic void CgiScri
34b0: 70 74 57 72 69 74 61 62 6c 65 28 76 6f 69 64 29  ptWritable(void)
34c0: 7b 0a 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73  {.  StartRespons
34d0: 65 28 22 35 30 30 20 43 47 49 20 43 6f 6e 66 69  e("500 CGI Confi
34e0: 67 75 72 61 74 69 6f 6e 20 45 72 72 6f 72 22 29  guration Error")
34f0: 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e  ;.  nOut += prin
3500: 74 66 28 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74  tf(.    "Content
3510: 2d 74 79 70 65 3a 20 74 65 78 74 2f 70 6c 61 69  -type: text/plai
3520: 6e 5c 72 5c 6e 22 0a 20 20 20 20 22 5c 72 5c 6e  n\r\n".    "\r\n
3530: 22 0a 20 20 20 20 22 54 68 65 20 43 47 49 20 70  ".    "The CGI p
3540: 72 6f 67 72 61 6d 20 25 73 20 69 73 20 77 72 69  rogram %s is wri
3550: 74 61 62 6c 65 20 62 79 20 75 73 65 72 73 20 6f  table by users o
3560: 74 68 65 72 20 74 68 61 6e 20 69 74 73 20 6f 77  ther than its ow
3570: 6e 65 72 2e 5c 6e 22 2c 0a 20 20 20 20 7a 52 65  ner.\n",.    zRe
3580: 61 6c 53 63 72 69 70 74 29 3b 0a 20 20 4d 61 6b  alScript);.  Mak
3590: 65 4c 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20 20  eLogEntry(0);.  
35a0: 65 78 69 74 28 30 29 3b 20 20 20 20 20 20 20 0a  exit(0);       .
35b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68  }../*.** Tell th
35c0: 65 20 63 6c 69 65 6e 74 20 74 68 61 74 20 74 68  e client that th
35d0: 65 20 73 65 72 76 65 72 20 6d 61 6c 66 75 6e 63  e server malfunc
35e0: 74 69 6f 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  tioned..*/.stati
35f0: 63 20 76 6f 69 64 20 4d 61 6c 66 75 6e 63 74 69  c void Malfuncti
3600: 6f 6e 28 69 6e 74 20 6c 69 6e 65 6e 75 6d 2c 20  on(int linenum, 
3610: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
3620: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
3630: 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74  list ap;.  va_st
3640: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
3650: 3b 0a 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73  ;.  StartRespons
3660: 65 28 22 35 30 30 20 53 65 72 76 65 72 20 4d 61  e("500 Server Ma
3670: 6c 66 75 6e 63 74 69 6f 6e 22 29 3b 0a 20 20 6e  lfunction");.  n
3680: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20  Out += printf(. 
3690: 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65     "Content-type
36a0: 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e  : text/plain\r\n
36b0: 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20  ".    "\r\n".   
36c0: 20 22 57 65 62 20 73 65 72 76 65 72 20 6d 61 6c   "Web server mal
36d0: 66 75 6e 63 74 69 6f 6e 65 64 3b 20 65 72 72 6f  functioned; erro
36e0: 72 20 6e 75 6d 62 65 72 20 25 64 5c 6e 5c 6e 22  r number %d\n\n"
36f0: 2c 20 6c 69 6e 65 6e 75 6d 29 3b 0a 20 20 69 66  , linenum);.  if
3700: 28 20 7a 46 6f 72 6d 61 74 20 29 7b 0a 20 20 20  ( zFormat ){.   
3710: 20 6e 4f 75 74 20 2b 3d 20 76 70 72 69 6e 74 66   nOut += vprintf
3720: 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20  (zFormat, ap);. 
3730: 20 7d 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72   }.  MakeLogEntr
3740: 79 28 30 29 3b 0a 20 20 65 78 69 74 28 30 29 3b  y(0);.  exit(0);
3750: 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a         .}../*.**
3760: 20 44 6f 20 61 20 73 65 72 76 65 72 20 72 65 64   Do a server red
3770: 69 72 65 63 74 20 74 6f 20 74 68 65 20 64 6f 63  irect to the doc
3780: 75 6d 65 6e 74 20 73 70 65 63 69 66 69 65 64 2e  ument specified.
3790: 20 20 54 68 65 20 64 6f 63 75 6d 65 6e 74 0a 2a    The document.*
37a0: 2a 20 6e 61 6d 65 20 6e 6f 74 20 63 6f 6e 74 61  * name not conta
37b0: 69 6e 20 73 63 68 65 6d 65 20 6f 72 20 6e 65 74  in scheme or net
37c0: 77 6f 72 6b 20 6c 6f 63 61 74 69 6f 6e 20 6f 72  work location or
37d0: 20 74 68 65 20 71 75 65 72 79 20 73 74 72 69 6e   the query strin
37e0: 67 2e 0a 2a 2a 20 49 74 20 77 69 6c 6c 20 62 65  g..** It will be
37f0: 20 6a 75 73 74 20 74 68 65 20 70 61 74 68 2e 0a   just the path..
3800: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 52  */.static void R
3810: 65 64 69 72 65 63 74 28 63 6f 6e 73 74 20 63 68  edirect(const ch
3820: 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66  ar *zPath, int f
3830: 69 6e 69 73 68 29 7b 0a 20 20 53 74 61 72 74 52  inish){.  StartR
3840: 65 73 70 6f 6e 73 65 28 22 33 30 32 20 54 65 6d  esponse("302 Tem
3850: 70 6f 72 61 72 79 20 52 65 64 69 72 65 63 74 22  porary Redirect"
3860: 29 3b 0a 20 20 69 66 28 20 7a 53 65 72 76 65 72  );.  if( zServer
3870: 50 6f 72 74 3d 3d 30 20 7c 7c 20 7a 53 65 72 76  Port==0 || zServ
3880: 65 72 50 6f 72 74 5b 30 5d 3d 3d 30 20 7c 7c 20  erPort[0]==0 || 
3890: 73 74 72 63 6d 70 28 7a 53 65 72 76 65 72 50 6f  strcmp(zServerPo
38a0: 72 74 2c 22 38 30 22 29 3d 3d 30 20 29 7b 0a 20  rt,"80")==0 ){. 
38b0: 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74     nOut += print
38c0: 66 28 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73 3a  f("Location: %s:
38d0: 2f 2f 25 73 25 73 25 73 5c 72 5c 6e 22 2c 0a 20  //%s%s%s\r\n",. 
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38f0: 20 20 7a 48 74 74 70 2c 20 7a 53 65 72 76 65 72    zHttp, zServer
3900: 4e 61 6d 65 2c 20 7a 50 61 74 68 2c 20 7a 51 75  Name, zPath, zQu
3910: 65 72 79 53 75 66 66 69 78 29 3b 0a 20 20 7d 65  erySuffix);.  }e
3920: 6c 73 65 7b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d  lse{.    nOut +=
3930: 20 70 72 69 6e 74 66 28 22 4c 6f 63 61 74 69 6f   printf("Locatio
3940: 6e 3a 20 25 73 3a 2f 2f 25 73 3a 25 73 25 73 25  n: %s://%s:%s%s%
3950: 73 5c 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  s\r\n",.        
3960: 20 20 20 20 20 20 20 20 20 20 20 7a 48 74 74 70             zHttp
3970: 2c 20 7a 53 65 72 76 65 72 4e 61 6d 65 2c 20 7a  , zServerName, z
3980: 53 65 72 76 65 72 50 6f 72 74 2c 20 7a 50 61 74  ServerPort, zPat
3990: 68 2c 20 7a 51 75 65 72 79 53 75 66 66 69 78 29  h, zQuerySuffix)
39a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 69 6e 69  ;.  }.  if( fini
39b0: 73 68 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  sh ){.    printf
39c0: 28 22 43 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74 68  ("Content-length
39d0: 3a 20 30 5c 72 5c 6e 22 29 3b 0a 20 20 20 20 6e  : 0\r\n");.    n
39e0: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 5c  Out += printf("\
39f0: 72 5c 6e 22 29 3b 0a 20 20 20 20 4d 61 6b 65 4c  r\n");.    MakeL
3a00: 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20 20 7d 0a  ogEntry(0);.  }.
3a10: 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29    fflush(stdout)
3a20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
3a30: 66 75 6e 63 74 69 6f 6e 20 74 72 65 61 74 73 20  function treats 
3a40: 69 74 73 20 69 6e 70 75 74 20 61 73 20 61 20 62  its input as a b
3a50: 61 73 65 2d 36 34 20 73 74 72 69 6e 67 20 61 6e  ase-64 string an
3a60: 64 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  d returns the.**
3a70: 20 64 65 63 6f 64 65 64 20 76 61 6c 75 65 20 6f   decoded value o
3a80: 66 20 74 68 61 74 20 73 74 72 69 6e 67 2e 20 20  f that string.  
3a90: 43 68 61 72 61 63 74 65 72 73 20 6f 66 20 69 6e  Characters of in
3aa0: 70 75 74 20 74 68 61 74 20 61 72 65 20 6e 6f 74  put that are not
3ab0: 0a 2a 2a 20 76 61 6c 69 64 20 62 61 73 65 2d 36  .** valid base-6
3ac0: 34 20 63 68 61 72 61 63 74 65 72 73 20 28 73 75  4 characters (su
3ad0: 63 68 20 61 73 20 73 70 61 63 65 73 20 61 6e 64  ch as spaces and
3ae0: 20 6e 65 77 6c 69 6e 65 73 29 20 61 72 65 20 69   newlines) are i
3af0: 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  gnored..*/.void 
3b00: 44 65 63 6f 64 65 36 34 28 63 68 61 72 20 2a 7a  Decode64(char *z
3b10: 36 34 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 61  64){.  char *zDa
3b20: 74 61 3b 0a 20 20 69 6e 74 20 6e 36 34 3b 0a 20  ta;.  int n64;. 
3b30: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
3b40: 20 61 2c 20 62 2c 20 63 2c 20 64 3b 0a 20 20 73   a, b, c, d;.  s
3b50: 74 61 74 69 63 20 69 6e 74 20 69 73 49 6e 69 74  tatic int isInit
3b60: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69   = 0;.  static i
3b70: 6e 74 20 74 72 61 6e 73 5b 31 32 38 5d 3b 0a 20  nt trans[128];. 
3b80: 20 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64   static unsigned
3b90: 20 63 68 61 72 20 7a 42 61 73 65 5b 5d 20 3d 20   char zBase[] = 
3ba0: 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a  .    "ABCDEFGHIJ
3bb0: 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
3bc0: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
3bd0: 71 72 73 74 75 76 77 78 79 7a 30 31 32 33 34 35  qrstuvwxyz012345
3be0: 36 37 38 39 2b 2f 22 3b 0a 0a 20 20 69 66 28 20  6789+/";..  if( 
3bf0: 21 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 66  !isInit ){.    f
3c00: 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69  or(i=0; i<128; i
3c10: 2b 2b 29 7b 20 74 72 61 6e 73 5b 69 5d 20 3d 20  ++){ trans[i] = 
3c20: 30 3b 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30  0; }.    for(i=0
3c30: 3b 20 7a 42 61 73 65 5b 69 5d 3b 20 69 2b 2b 29  ; zBase[i]; i++)
3c40: 7b 20 74 72 61 6e 73 5b 7a 42 61 73 65 5b 69 5d  { trans[zBase[i]
3c50: 20 26 20 30 78 37 66 5d 20 3d 20 69 3b 20 7d 0a   & 0x7f] = i; }.
3c60: 20 20 20 20 69 73 49 6e 69 74 20 3d 20 31 3b 0a      isInit = 1;.
3c70: 20 20 7d 0a 20 20 6e 36 34 20 3d 20 73 74 72 6c    }.  n64 = strl
3c80: 65 6e 28 7a 36 34 29 3b 0a 20 20 77 68 69 6c 65  en(z64);.  while
3c90: 28 20 6e 36 34 3e 30 20 26 26 20 7a 36 34 5b 6e  ( n64>0 && z64[n
3ca0: 36 34 2d 31 5d 3d 3d 27 3d 27 20 29 20 6e 36 34  64-1]=='=' ) n64
3cb0: 2d 2d 3b 0a 20 20 7a 44 61 74 61 20 3d 20 7a 36  --;.  zData = z6
3cc0: 34 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  4;.  for(i=j=0; 
3cd0: 69 2b 33 3c 6e 36 34 3b 20 69 2b 3d 34 29 7b 0a  i+3<n64; i+=4){.
3ce0: 20 20 20 20 61 20 3d 20 74 72 61 6e 73 5b 7a 36      a = trans[z6
3cf0: 34 5b 69 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20  4[i] & 0x7f];.  
3d00: 20 20 62 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b    b = trans[z64[
3d10: 69 2b 31 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20  i+1] & 0x7f];.  
3d20: 20 20 63 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b    c = trans[z64[
3d30: 69 2b 32 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20  i+2] & 0x7f];.  
3d40: 20 20 64 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b    d = trans[z64[
3d50: 69 2b 33 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20  i+3] & 0x7f];.  
3d60: 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28    zData[j++] = (
3d70: 28 61 3c 3c 32 29 20 26 20 30 78 66 63 29 20 7c  (a<<2) & 0xfc) |
3d80: 20 28 28 62 3e 3e 34 29 20 26 20 30 78 30 33 29   ((b>>4) & 0x03)
3d90: 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d  ;.    zData[j++]
3da0: 20 3d 20 28 28 62 3c 3c 34 29 20 26 20 30 78 66   = ((b<<4) & 0xf
3db0: 30 29 20 7c 20 28 28 63 3e 3e 32 29 20 26 20 30  0) | ((c>>2) & 0
3dc0: 78 30 66 29 3b 0a 20 20 20 20 7a 44 61 74 61 5b  x0f);.    zData[
3dd0: 6a 2b 2b 5d 20 3d 20 28 28 63 3c 3c 36 29 20 26  j++] = ((c<<6) &
3de0: 20 30 78 63 30 29 20 7c 20 28 64 20 26 20 30 78   0xc0) | (d & 0x
3df0: 33 66 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  3f);.  }.  if( i
3e00: 2b 32 3c 6e 36 34 20 29 7b 0a 20 20 20 20 61 20  +2<n64 ){.    a 
3e10: 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 5d 20 26  = trans[z64[i] &
3e20: 20 30 78 37 66 5d 3b 0a 20 20 20 20 62 20 3d 20   0x7f];.    b = 
3e30: 74 72 61 6e 73 5b 7a 36 34 5b 69 2b 31 5d 20 26  trans[z64[i+1] &
3e40: 20 30 78 37 66 5d 3b 0a 20 20 20 20 63 20 3d 20   0x7f];.    c = 
3e50: 74 72 61 6e 73 5b 7a 36 34 5b 69 2b 32 5d 20 26  trans[z64[i+2] &
3e60: 20 30 78 37 66 5d 3b 0a 20 20 20 20 7a 44 61 74   0x7f];.    zDat
3e70: 61 5b 6a 2b 2b 5d 20 3d 20 28 28 61 3c 3c 32 29  a[j++] = ((a<<2)
3e80: 20 26 20 30 78 66 63 29 20 7c 20 28 28 62 3e 3e   & 0xfc) | ((b>>
3e90: 34 29 20 26 20 30 78 30 33 29 3b 0a 20 20 20 20  4) & 0x03);.    
3ea0: 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28 62  zData[j++] = ((b
3eb0: 3c 3c 34 29 20 26 20 30 78 66 30 29 20 7c 20 28  <<4) & 0xf0) | (
3ec0: 28 63 3e 3e 32 29 20 26 20 30 78 30 66 29 3b 0a  (c>>2) & 0x0f);.
3ed0: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 2b 31 3c    }else if( i+1<
3ee0: 6e 36 34 20 29 7b 0a 20 20 20 20 61 20 3d 20 74  n64 ){.    a = t
3ef0: 72 61 6e 73 5b 7a 36 34 5b 69 5d 20 26 20 30 78  rans[z64[i] & 0x
3f00: 37 66 5d 3b 0a 20 20 20 20 62 20 3d 20 74 72 61  7f];.    b = tra
3f10: 6e 73 5b 7a 36 34 5b 69 2b 31 5d 20 26 20 30 78  ns[z64[i+1] & 0x
3f20: 37 66 5d 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a  7f];.    zData[j
3f30: 2b 2b 5d 20 3d 20 28 28 61 3c 3c 32 29 20 26 20  ++] = ((a<<2) & 
3f40: 30 78 66 63 29 20 7c 20 28 28 62 3e 3e 34 29 20  0xfc) | ((b>>4) 
3f50: 26 20 30 78 30 33 29 3b 0a 20 20 7d 0a 20 20 7a  & 0x03);.  }.  z
3f60: 44 61 74 61 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a  Data[j] = 0;.}..
3f70: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
3f80: 65 65 20 69 66 20 62 61 73 69 63 20 61 75 74 68  ee if basic auth
3f90: 6f 72 69 7a 61 74 69 6f 6e 20 63 72 65 64 65 6e  orization creden
3fa0: 74 69 61 6c 73 20 61 72 65 20 70 72 6f 76 69 64  tials are provid
3fb0: 65 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20 75 73  ed for.** the us
3fc0: 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  er according to 
3fd0: 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
3fe0: 69 6e 20 7a 41 75 74 68 46 69 6c 65 2e 20 20 52  in zAuthFile.  R
3ff0: 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66  eturn true.** if
4000: 20 61 75 74 68 6f 72 69 7a 65 64 2e 20 20 52 65   authorized.  Re
4010: 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 6e 6f  turn false if no
4020: 74 20 61 75 74 68 6f 72 69 7a 65 64 2e 0a 2a 2a  t authorized..**
4030: 0a 2a 2a 20 46 69 6c 65 20 66 6f 72 6d 61 74 3a  .** File format:
4040: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 42 6c 61  .**.**    *  Bla
4050: 6e 6b 20 6c 69 6e 65 73 20 61 6e 64 20 6c 69 6e  nk lines and lin
4060: 65 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  es that begin wi
4070: 74 68 20 27 23 27 20 61 72 65 20 69 67 6e 6f 72  th '#' are ignor
4080: 65 64 0a 2a 2a 20 20 20 20 2a 20 20 22 68 74 74  ed.**    *  "htt
4090: 70 2d 72 65 64 69 72 65 63 74 22 20 66 6f 72 63  p-redirect" forc
40a0: 65 73 20 61 20 72 65 64 69 72 65 63 74 20 74 6f  es a redirect to
40b0: 20 48 54 54 50 53 20 69 66 20 6e 6f 74 20 74 68   HTTPS if not th
40c0: 65 72 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 20  ere already.**  
40d0: 20 20 2a 20 20 22 68 74 74 70 73 2d 6f 6e 6c 79    *  "https-only
40e0: 22 20 64 69 73 61 6c 6c 6f 77 73 20 6f 70 65 72  " disallows oper
40f0: 61 74 69 6f 6e 20 69 6e 20 48 54 54 50 0a 2a 2a  ation in HTTP.**
4100: 20 20 20 20 2a 20 20 22 75 73 65 72 20 4e 41 4d      *  "user NAM
4110: 45 20 4c 4f 47 49 4e 3a 50 41 53 53 57 4f 52 44  E LOGIN:PASSWORD
4120: 22 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  " checks to see 
4130: 69 66 20 4c 4f 47 49 4e 3a 50 41 53 53 57 4f 52  if LOGIN:PASSWOR
4140: 44 20 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 68  D .**       auth
4150: 6f 72 69 7a 61 74 69 6f 6e 20 63 72 65 64 65 6e  orization creden
4160: 74 69 61 6c 73 20 61 72 65 20 70 72 6f 76 69 64  tials are provid
4170: 65 64 2c 20 61 6e 64 20 69 66 20 73 6f 20 73 65  ed, and if so se
4180: 74 73 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  ts the.**       
4190: 52 45 4d 4f 54 45 5f 55 53 45 52 20 74 6f 20 4e  REMOTE_USER to N
41a0: 41 4d 45 2e 0a 2a 2a 20 20 20 20 2a 20 20 22 72  AME..**    *  "r
41b0: 65 61 6c 6d 20 54 45 58 54 22 20 73 65 74 73 20  ealm TEXT" sets 
41c0: 74 68 65 20 72 65 61 6c 6d 20 74 6f 20 54 45 58  the realm to TEX
41d0: 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  T..*/.static int
41e0: 20 43 68 65 63 6b 42 61 73 69 63 41 75 74 68 6f   CheckBasicAutho
41f0: 72 69 7a 61 74 69 6f 6e 28 63 6f 6e 73 74 20 63  rization(const c
4200: 68 61 72 20 2a 7a 41 75 74 68 46 69 6c 65 29 7b  har *zAuthFile){
4210: 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 63  .  FILE *in;.  c
4220: 68 61 72 20 2a 7a 52 65 61 6c 6d 20 3d 20 22 75  har *zRealm = "u
4230: 6e 6b 6e 6f 77 6e 20 72 65 61 6c 6d 22 3b 0a 20  nknown realm";. 
4240: 20 63 68 61 72 20 2a 7a 4c 6f 67 69 6e 50 73 77   char *zLoginPsw
4250: 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  d;.  char *zName
4260: 3b 0a 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b 32  ;.  char zLine[2
4270: 30 30 30 5d 3b 0a 0a 20 20 69 6e 20 3d 20 66 6f  000];..  in = fo
4280: 70 65 6e 28 7a 41 75 74 68 46 69 6c 65 2c 20 22  pen(zAuthFile, "
4290: 72 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30  r");.  if( in==0
42a0: 20 29 7b 0a 20 20 20 20 4e 6f 74 46 6f 75 6e 64   ){.    NotFound
42b0: 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20  (__LINE__);.    
42c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
42d0: 69 66 28 20 7a 41 75 74 68 41 72 67 20 29 20 44  if( zAuthArg ) D
42e0: 65 63 6f 64 65 36 34 28 7a 41 75 74 68 41 72 67  ecode64(zAuthArg
42f0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74  );.  while( fget
4300: 73 28 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f 66 28  s(zLine, sizeof(
4310: 7a 4c 69 6e 65 29 2c 20 69 6e 29 20 29 7b 0a 20  zLine), in) ){. 
4320: 20 20 20 63 68 61 72 20 2a 7a 46 69 65 6c 64 4e     char *zFieldN
4330: 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ame;.    char *z
4340: 56 61 6c 3b 0a 0a 20 20 20 20 7a 46 69 65 6c 64  Val;..    zField
4350: 4e 61 6d 65 20 3d 20 47 65 74 46 69 72 73 74 45  Name = GetFirstE
4360: 6c 65 6d 65 6e 74 28 7a 4c 69 6e 65 2c 26 7a 56  lement(zLine,&zV
4370: 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a 46 69  al);.    if( zFi
4380: 65 6c 64 4e 61 6d 65 3d 3d 30 20 7c 7c 20 2a 7a  eldName==0 || *z
4390: 46 69 65 6c 64 4e 61 6d 65 3d 3d 30 20 29 20 63  FieldName==0 ) c
43a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
43b0: 20 7a 46 69 65 6c 64 4e 61 6d 65 5b 30 5d 3d 3d   zFieldName[0]==
43c0: 27 23 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  '#' ) continue;.
43d0: 20 20 20 20 52 65 6d 6f 76 65 4e 65 77 6c 69 6e      RemoveNewlin
43e0: 65 28 7a 56 61 6c 29 3b 0a 20 20 20 20 69 66 28  e(zVal);.    if(
43f0: 20 73 74 72 63 6d 70 28 7a 46 69 65 6c 64 4e 61   strcmp(zFieldNa
4400: 6d 65 2c 20 22 72 65 61 6c 6d 22 29 3d 3d 30 20  me, "realm")==0 
4410: 29 7b 0a 20 20 20 20 20 20 7a 52 65 61 6c 6d 20  ){.      zRealm 
4420: 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a  = StrDup(zVal);.
4430: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
4440: 72 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c  rcmp(zFieldName,
4450: 22 75 73 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20  "user")==0 ){.  
4460: 20 20 20 20 69 66 28 20 7a 41 75 74 68 41 72 67      if( zAuthArg
4470: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
4480: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 47 65        zName = Ge
4490: 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a 56  tFirstElement(zV
44a0: 61 6c 2c 20 26 7a 56 61 6c 29 3b 0a 20 20 20 20  al, &zVal);.    
44b0: 20 20 7a 4c 6f 67 69 6e 50 73 77 64 20 3d 20 47    zLoginPswd = G
44c0: 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a  etFirstElement(z
44d0: 56 61 6c 2c 20 26 7a 56 61 6c 29 3b 0a 20 20 20  Val, &zVal);.   
44e0: 20 20 20 69 66 28 20 7a 4c 6f 67 69 6e 50 73 77     if( zLoginPsw
44f0: 64 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  d==0 ) continue;
4500: 0a 20 20 20 20 20 20 69 66 28 20 7a 41 75 74 68  .      if( zAuth
4510: 41 72 67 20 26 26 20 73 74 72 63 6d 70 28 7a 41  Arg && strcmp(zA
4520: 75 74 68 41 72 67 2c 7a 4c 6f 67 69 6e 50 73 77  uthArg,zLoginPsw
4530: 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  d)==0 ){.       
4540: 20 7a 52 65 6d 6f 74 65 55 73 65 72 20 3d 20 53   zRemoteUser = S
4550: 74 72 44 75 70 28 7a 4e 61 6d 65 29 3b 0a 20 20  trDup(zName);.  
4560: 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29        fclose(in)
4570: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
4580: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
4590: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
45a0: 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 68 74 74  (zFieldName,"htt
45b0: 70 73 2d 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a  ps-only")==0 ){.
45c0: 20 20 20 20 20 20 69 66 28 20 21 75 73 65 48 74        if( !useHt
45d0: 74 70 73 20 29 7b 0a 20 20 20 20 20 20 20 20 4e  tps ){.        N
45e0: 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f  otFound(__LINE__
45f0: 29 3b 0a 20 20 20 20 20 20 20 20 66 63 6c 6f 73  );.        fclos
4600: 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 72  e(in);.        r
4610: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
4620: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
4630: 74 72 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65  trcmp(zFieldName
4640: 2c 22 68 74 74 70 2d 72 65 64 69 72 65 63 74 22  ,"http-redirect"
4650: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
4660: 28 20 21 75 73 65 48 74 74 70 73 20 29 7b 0a 20  ( !useHttps ){. 
4670: 20 20 20 20 20 20 20 7a 48 74 74 70 20 3d 20 22         zHttp = "
4680: 68 74 74 70 73 22 3b 0a 20 20 20 20 20 20 20 20  https";.        
4690: 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22  sprintf(zLine, "
46a0: 25 73 25 73 22 2c 20 7a 53 63 72 69 70 74 2c 20  %s%s", zScript, 
46b0: 7a 50 61 74 68 49 6e 66 6f 29 3b 0a 20 20 20 20  zPathInfo);.    
46c0: 20 20 20 20 52 65 64 69 72 65 63 74 28 7a 4c 69      Redirect(zLi
46d0: 6e 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ne, 1);.        
46e0: 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20  fclose(in);.    
46f0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4700: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
4710: 0a 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28  .      NotFound(
4720: 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
4730: 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20   fclose(in);.   
4740: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
4750: 20 7d 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28   }.  }.  fclose(
4760: 69 6e 29 3b 0a 20 20 4e 6f 74 41 75 74 68 6f 72  in);.  NotAuthor
4770: 69 7a 65 64 28 7a 52 65 61 6c 6d 29 3b 0a 20 20  ized(zRealm);.  
4780: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
4790: 2a 2a 20 47 75 65 73 73 20 74 68 65 20 6d 69 6d  ** Guess the mim
47a0: 65 2d 74 79 70 65 20 6f 66 20 61 20 64 6f 63 75  e-type of a docu
47b0: 6d 65 6e 74 20 62 61 73 65 64 20 6f 6e 20 69 74  ment based on it
47c0: 73 20 6e 61 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  s name..*/.const
47d0: 20 63 68 61 72 20 2a 47 65 74 4d 69 6d 65 54 79   char *GetMimeTy
47e0: 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  pe(const char *z
47f0: 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29  Name, int nName)
4800: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
4810: 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  z;.  int i;.  in
4820: 74 20 66 69 72 73 74 2c 20 6c 61 73 74 3b 0a 20  t first, last;. 
4830: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 63 68 61 72   int len;.  char
4840: 20 7a 53 75 66 66 69 78 5b 32 30 5d 3b 0a 0a 20   zSuffix[20];.. 
4850: 20 2f 2a 20 41 20 74 61 62 6c 65 20 6f 66 20 6d   /* A table of m
4860: 69 6d 65 74 79 70 65 73 20 62 61 73 65 64 20 6f  imetypes based o
4870: 6e 20 66 69 6c 65 20 73 75 66 66 69 78 65 73 2e  n file suffixes.
4880: 20 0a 20 20 2a 2a 20 53 75 66 66 69 78 65 73 20   .  ** Suffixes 
4890: 6d 75 73 74 20 62 65 20 69 6e 20 73 6f 72 74 65  must be in sorte
48a0: 64 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20  d order so that 
48b0: 77 65 20 63 61 6e 20 64 6f 20 61 20 62 69 6e 61  we can do a bina
48c0: 72 79 0a 20 20 2a 2a 20 73 65 61 72 63 68 20 74  ry.  ** search t
48d0: 6f 20 66 69 6e 64 20 74 68 65 20 6d 69 6d 65 2d  o find the mime-
48e0: 74 79 70 65 0a 20 20 2a 2f 0a 20 20 73 74 61 74  type.  */.  stat
48f0: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
4900: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
4910: 20 2a 7a 53 75 66 66 69 78 3b 20 20 20 20 20 20   *zSuffix;      
4920: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66   /* The file suf
4930: 66 69 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  fix */.    int s
4940: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
4950: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
4960: 6f 66 20 74 68 65 20 73 75 66 66 69 78 20 2a 2f  of the suffix */
4970: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
4980: 2a 7a 4d 69 6d 65 74 79 70 65 3b 20 20 20 20 20  *zMimetype;     
4990: 2f 2a 20 54 68 65 20 63 6f 72 72 65 73 70 6f 6e  /* The correspon
49a0: 64 69 6e 67 20 6d 69 6d 65 74 79 70 65 20 2a 2f  ding mimetype */
49b0: 0a 20 20 7d 20 61 4d 69 6d 65 5b 5d 20 3d 20 7b  .  } aMime[] = {
49c0: 0a 20 20 20 20 7b 20 22 61 69 22 2c 20 20 20 20  .    { "ai",    
49d0: 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61       2, "applica
49e0: 74 69 6f 6e 2f 70 6f 73 74 73 63 72 69 70 74 22  tion/postscript"
49f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
4a00: 20 20 20 7b 20 22 61 69 66 22 2c 20 20 20 20 20     { "aif",     
4a10: 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 61     3, "audio/x-a
4a20: 69 66 66 22 20 20 20 20 20 20 20 20 20 20 20 20  iff"            
4a30: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
4a40: 20 7b 20 22 61 69 66 63 22 2c 20 20 20 20 20 20   { "aifc",      
4a50: 20 34 2c 20 22 61 75 64 69 6f 2f 78 2d 61 69 66   4, "audio/x-aif
4a60: 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f"              
4a70: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
4a80: 20 22 61 69 66 66 22 2c 20 20 20 20 20 20 20 34   "aiff",       4
4a90: 2c 20 22 61 75 64 69 6f 2f 78 2d 61 69 66 66 22  , "audio/x-aiff"
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ab0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
4ac0: 61 72 6a 22 2c 20 20 20 20 20 20 20 20 33 2c 20  arj",        3, 
4ad0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 61  "application/x-a
4ae0: 72 6a 2d 63 6f 6d 70 72 65 73 73 65 64 22 20 20  rj-compressed"  
4af0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 73      },.    { "as
4b00: 63 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74  c",        3, "t
4b10: 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20  ext/plain"      
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b30: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 73 66 22    },.    { "asf"
4b40: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64  ,        3, "vid
4b50: 65 6f 2f 78 2d 6d 73 2d 61 73 66 22 20 20 20 20  eo/x-ms-asf"    
4b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b70: 7d 2c 0a 20 20 20 20 7b 20 22 61 73 78 22 2c 20  },.    { "asx", 
4b80: 20 20 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f         3, "video
4b90: 2f 78 2d 6d 73 2d 61 73 78 22 20 20 20 20 20 20  /x-ms-asx"      
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
4bb0: 0a 20 20 20 20 7b 20 22 61 75 22 2c 20 20 20 20  .    { "au",    
4bc0: 20 20 20 20 20 32 2c 20 22 61 75 64 69 6f 2f 75       2, "audio/u
4bd0: 6c 61 77 22 20 20 20 20 20 20 20 20 20 20 20 20  law"            
4be0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
4bf0: 20 20 20 7b 20 22 61 76 69 22 2c 20 20 20 20 20     { "avi",     
4c00: 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d     3, "video/x-m
4c10: 73 76 69 64 65 6f 22 20 20 20 20 20 20 20 20 20  svideo"         
4c20: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
4c30: 20 7b 20 22 62 61 74 22 2c 20 20 20 20 20 20 20   { "bat",       
4c40: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
4c50: 2f 78 2d 6d 73 64 6f 73 2d 70 72 6f 67 72 61 6d  /x-msdos-program
4c60: 22 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  "       },.    {
4c70: 20 22 62 63 70 69 6f 22 2c 20 20 20 20 20 20 35   "bcpio",      5
4c80: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
4c90: 2d 62 63 70 69 6f 22 20 20 20 20 20 20 20 20 20  -bcpio"         
4ca0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
4cb0: 62 69 6e 22 2c 20 20 20 20 20 20 20 20 33 2c 20  bin",        3, 
4cc0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74  "application/oct
4cd0: 65 74 2d 73 74 72 65 61 6d 22 20 20 20 20 20 20  et-stream"      
4ce0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 22      },.    { "c"
4cf0: 2c 20 20 20 20 20 20 20 20 20 20 31 2c 20 22 74  ,          1, "t
4d00: 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20  ext/plain"      
4d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d20: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 63 22 2c    },.    { "cc",
4d30: 20 20 20 20 20 20 20 20 20 32 2c 20 22 74 65 78           2, "tex
4d40: 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20  t/plain"        
4d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d60: 7d 2c 0a 20 20 20 20 7b 20 22 63 63 61 64 22 2c  },.    { "ccad",
4d70: 20 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69         4, "appli
4d80: 63 61 74 69 6f 6e 2f 63 6c 61 72 69 73 63 61 64  cation/clariscad
4d90: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  "             },
4da0: 0a 20 20 20 20 7b 20 22 63 64 66 22 2c 20 20 20  .    { "cdf",   
4db0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
4dc0: 74 69 6f 6e 2f 78 2d 6e 65 74 63 64 66 22 20 20  tion/x-netcdf"  
4dd0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
4de0: 20 20 20 7b 20 22 63 6c 61 73 73 22 2c 20 20 20     { "class",   
4df0: 20 20 20 35 2c 20 22 61 70 70 6c 69 63 61 74 69     5, "applicati
4e00: 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22  on/octet-stream"
4e10: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
4e20: 20 7b 20 22 63 6f 64 22 2c 20 20 20 20 20 20 20   { "cod",       
4e30: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
4e40: 2f 76 6e 64 2e 72 69 6d 2e 63 6f 64 22 20 20 20  /vnd.rim.cod"   
4e50: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
4e60: 20 22 63 6f 6d 22 2c 20 20 20 20 20 20 20 20 33   "com",        3
4e70: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
4e80: 2d 6d 73 64 6f 73 2d 70 72 6f 67 72 61 6d 22 20  -msdos-program" 
4e90: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
4ea0: 63 70 69 6f 22 2c 20 20 20 20 20 20 20 34 2c 20  cpio",       4, 
4eb0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 63  "application/x-c
4ec0: 70 69 6f 22 20 20 20 20 20 20 20 20 20 20 20 20  pio"            
4ed0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 70      },.    { "cp
4ee0: 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  t",        3, "a
4ef0: 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 61 63 2d 63  pplication/mac-c
4f00: 6f 6d 70 61 63 74 70 72 6f 22 20 20 20 20 20 20  ompactpro"      
4f10: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 73 68 22    },.    { "csh"
4f20: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
4f30: 6c 69 63 61 74 69 6f 6e 2f 78 2d 63 73 68 22 20  lication/x-csh" 
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f50: 7d 2c 0a 20 20 20 20 7b 20 22 63 73 73 22 2c 20  },.    { "css", 
4f60: 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f         3, "text/
4f70: 63 73 73 22 20 20 20 20 20 20 20 20 20 20 20 20  css"            
4f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
4f90: 0a 20 20 20 20 7b 20 22 64 63 72 22 2c 20 20 20  .    { "dcr",   
4fa0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
4fb0: 74 69 6f 6e 2f 78 2d 64 69 72 65 63 74 6f 72 22  tion/x-director"
4fc0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
4fd0: 20 20 20 7b 20 22 64 65 62 22 2c 20 20 20 20 20     { "deb",     
4fe0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
4ff0: 6f 6e 2f 78 2d 64 65 62 69 61 6e 2d 70 61 63 6b  on/x-debian-pack
5000: 61 67 65 22 20 20 20 20 20 20 7d 2c 0a 20 20 20  age"      },.   
5010: 20 7b 20 22 64 69 72 22 2c 20 20 20 20 20 20 20   { "dir",       
5020: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
5030: 2f 78 2d 64 69 72 65 63 74 6f 72 22 20 20 20 20  /x-director"    
5040: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5050: 20 22 64 6c 22 2c 20 20 20 20 20 20 20 20 20 32   "dl",         2
5060: 2c 20 22 76 69 64 65 6f 2f 64 6c 22 20 20 20 20  , "video/dl"    
5070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5080: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5090: 64 6d 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20  dms",        3, 
50a0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74  "application/oct
50b0: 65 74 2d 73 74 72 65 61 6d 22 20 20 20 20 20 20  et-stream"      
50c0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 6f      },.    { "do
50d0: 63 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  c",        3, "a
50e0: 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 77 6f 72  pplication/mswor
50f0: 64 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d"              
5100: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 72 77 22    },.    { "drw"
5110: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
5120: 6c 69 63 61 74 69 6f 6e 2f 64 72 61 66 74 69 6e  lication/draftin
5130: 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g"              
5140: 7d 2c 0a 20 20 20 20 7b 20 22 64 76 69 22 2c 20  },.    { "dvi", 
5150: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
5160: 63 61 74 69 6f 6e 2f 78 2d 64 76 69 22 20 20 20  cation/x-dvi"   
5170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
5180: 0a 20 20 20 20 7b 20 22 64 77 67 22 2c 20 20 20  .    { "dwg",   
5190: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
51a0: 74 69 6f 6e 2f 61 63 61 64 22 20 20 20 20 20 20  tion/acad"      
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
51c0: 20 20 20 7b 20 22 64 78 66 22 2c 20 20 20 20 20     { "dxf",     
51d0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
51e0: 6f 6e 2f 64 78 66 22 20 20 20 20 20 20 20 20 20  on/dxf"         
51f0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5200: 20 7b 20 22 64 78 72 22 2c 20 20 20 20 20 20 20   { "dxr",       
5210: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
5220: 2f 78 2d 64 69 72 65 63 74 6f 72 22 20 20 20 20  /x-director"    
5230: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5240: 20 22 65 70 73 22 2c 20 20 20 20 20 20 20 20 33   "eps",        3
5250: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70  , "application/p
5260: 6f 73 74 73 63 72 69 70 74 22 20 20 20 20 20 20  ostscript"      
5270: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5280: 65 74 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20  etx",        3, 
5290: 22 74 65 78 74 2f 78 2d 73 65 74 65 78 74 22 20  "text/x-setext" 
52a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52b0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65 78      },.    { "ex
52c0: 65 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  e",        3, "a
52d0: 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74  pplication/octet
52e0: 2d 73 74 72 65 61 6d 22 20 20 20 20 20 20 20 20  -stream"        
52f0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65 7a 22 2c    },.    { "ez",
5300: 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70 70           2, "app
5310: 6c 69 63 61 74 69 6f 6e 2f 61 6e 64 72 65 77 2d  lication/andrew-
5320: 69 6e 73 65 74 22 20 20 20 20 20 20 20 20 20 20  inset"          
5330: 7d 2c 0a 20 20 20 20 7b 20 22 66 22 2c 20 20 20  },.    { "f",   
5340: 20 20 20 20 20 20 20 31 2c 20 22 74 65 78 74 2f         1, "text/
5350: 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20 20  plain"          
5360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
5370: 0a 20 20 20 20 7b 20 22 66 39 30 22 2c 20 20 20  .    { "f90",   
5380: 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 70 6c       3, "text/pl
5390: 61 69 6e 22 20 20 20 20 20 20 20 20 20 20 20 20  ain"            
53a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
53b0: 20 20 20 7b 20 22 66 6c 69 22 2c 20 20 20 20 20     { "fli",     
53c0: 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 66 6c 69     3, "video/fli
53d0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
53e0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
53f0: 20 7b 20 22 66 6c 76 22 2c 20 20 20 20 20 20 20   { "flv",       
5400: 20 33 2c 20 22 76 69 64 65 6f 2f 66 6c 76 22 20   3, "video/flv" 
5410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5420: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5430: 20 22 67 69 66 22 2c 20 20 20 20 20 20 20 20 33   "gif",        3
5440: 2c 20 22 69 6d 61 67 65 2f 67 69 66 22 20 20 20  , "image/gif"   
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5460: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5470: 67 6c 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  gl",         2, 
5480: 22 76 69 64 65 6f 2f 67 6c 22 20 20 20 20 20 20  "video/gl"      
5490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54a0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 67 74      },.    { "gt
54b0: 61 72 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61  ar",       4, "a
54c0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 67 74 61  pplication/x-gta
54d0: 72 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r"              
54e0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 67 7a 22 2c    },.    { "gz",
54f0: 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70 70           2, "app
5500: 6c 69 63 61 74 69 6f 6e 2f 78 2d 67 7a 69 70 22  lication/x-gzip"
5510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5520: 7d 2c 0a 20 20 20 20 7b 20 22 68 64 66 22 2c 20  },.    { "hdf", 
5530: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
5540: 63 61 74 69 6f 6e 2f 78 2d 68 64 66 22 20 20 20  cation/x-hdf"   
5550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
5560: 0a 20 20 20 20 7b 20 22 68 68 22 2c 20 20 20 20  .    { "hh",    
5570: 20 20 20 20 20 32 2c 20 22 74 65 78 74 2f 70 6c       2, "text/pl
5580: 61 69 6e 22 20 20 20 20 20 20 20 20 20 20 20 20  ain"            
5590: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
55a0: 20 20 20 7b 20 22 68 71 78 22 2c 20 20 20 20 20     { "hqx",     
55b0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
55c0: 6f 6e 2f 6d 61 63 2d 62 69 6e 68 65 78 34 30 22  on/mac-binhex40"
55d0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
55e0: 20 7b 20 22 68 22 2c 20 20 20 20 20 20 20 20 20   { "h",         
55f0: 20 31 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22   1, "text/plain"
5600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5610: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5620: 20 22 68 74 6d 22 2c 20 20 20 20 20 20 20 20 33   "htm",        3
5630: 2c 20 22 74 65 78 74 2f 68 74 6d 6c 3b 20 63 68  , "text/html; ch
5640: 61 72 73 65 74 3d 75 74 66 2d 38 22 20 20 20 20  arset=utf-8"    
5650: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5660: 68 74 6d 6c 22 2c 20 20 20 20 20 20 20 34 2c 20  html",       4, 
5670: 22 74 65 78 74 2f 68 74 6d 6c 3b 20 63 68 61 72  "text/html; char
5680: 73 65 74 3d 75 74 66 2d 38 22 20 20 20 20 20 20  set=utf-8"      
5690: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 63      },.    { "ic
56a0: 65 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 78  e",        3, "x
56b0: 2d 63 6f 6e 66 65 72 65 6e 63 65 2f 78 2d 63 6f  -conference/x-co
56c0: 6f 6c 74 61 6c 6b 22 20 20 20 20 20 20 20 20 20  oltalk"         
56d0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 65 66 22    },.    { "ief"
56e0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61  ,        3, "ima
56f0: 67 65 2f 69 65 66 22 20 20 20 20 20 20 20 20 20  ge/ief"         
5700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5710: 7d 2c 0a 20 20 20 20 7b 20 22 69 67 65 73 22 2c  },.    { "iges",
5720: 20 20 20 20 20 20 20 34 2c 20 22 6d 6f 64 65 6c         4, "model
5730: 2f 69 67 65 73 22 20 20 20 20 20 20 20 20 20 20  /iges"          
5740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
5750: 0a 20 20 20 20 7b 20 22 69 67 73 22 2c 20 20 20  .    { "igs",   
5760: 20 20 20 20 20 33 2c 20 22 6d 6f 64 65 6c 2f 69       3, "model/i
5770: 67 65 73 22 20 20 20 20 20 20 20 20 20 20 20 20  ges"            
5780: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5790: 20 20 20 7b 20 22 69 70 73 22 2c 20 20 20 20 20     { "ips",     
57a0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
57b0: 6f 6e 2f 78 2d 69 70 73 63 72 69 70 74 22 20 20  on/x-ipscript"  
57c0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
57d0: 20 7b 20 22 69 70 78 22 2c 20 20 20 20 20 20 20   { "ipx",       
57e0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
57f0: 2f 78 2d 69 70 69 78 22 20 20 20 20 20 20 20 20  /x-ipix"        
5800: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5810: 20 22 6a 61 64 22 2c 20 20 20 20 20 20 20 20 33   "jad",        3
5820: 2c 20 22 74 65 78 74 2f 76 6e 64 2e 73 75 6e 2e  , "text/vnd.sun.
5830: 6a 32 6d 65 2e 61 70 70 2d 64 65 73 63 72 69 70  j2me.app-descrip
5840: 74 6f 72 22 20 20 7d 2c 0a 20 20 20 20 7b 20 22  tor"  },.    { "
5850: 6a 61 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20  jar",        3, 
5860: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6a 61 76  "application/jav
5870: 61 2d 61 72 63 68 69 76 65 22 20 20 20 20 20 20  a-archive"      
5880: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 70      },.    { "jp
5890: 65 67 22 2c 20 20 20 20 20 20 20 34 2c 20 22 69  eg",       4, "i
58a0: 6d 61 67 65 2f 6a 70 65 67 22 20 20 20 20 20 20  mage/jpeg"      
58b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58c0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 70 65 22    },.    { "jpe"
58d0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61  ,        3, "ima
58e0: 67 65 2f 6a 70 65 67 22 20 20 20 20 20 20 20 20  ge/jpeg"        
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5900: 7d 2c 0a 20 20 20 20 7b 20 22 6a 70 67 22 2c 20  },.    { "jpg", 
5910: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
5920: 2f 6a 70 65 67 22 20 20 20 20 20 20 20 20 20 20  /jpeg"          
5930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
5940: 0a 20 20 20 20 7b 20 22 6a 73 22 2c 20 20 20 20  .    { "js",    
5950: 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61       2, "applica
5960: 74 69 6f 6e 2f 78 2d 6a 61 76 61 73 63 72 69 70  tion/x-javascrip
5970: 74 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  t"          },. 
5980: 20 20 20 7b 20 22 6b 61 72 22 2c 20 20 20 20 20     { "kar",     
5990: 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 6d 69 64     3, "audio/mid
59a0: 69 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i"              
59b0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
59c0: 20 7b 20 22 6c 61 74 65 78 22 2c 20 20 20 20 20   { "latex",     
59d0: 20 35 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   5, "application
59e0: 2f 78 2d 6c 61 74 65 78 22 20 20 20 20 20 20 20  /x-latex"       
59f0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5a00: 20 22 6c 68 61 22 2c 20 20 20 20 20 20 20 20 33   "lha",        3
5a10: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f  , "application/o
5a20: 63 74 65 74 2d 73 74 72 65 61 6d 22 20 20 20 20  ctet-stream"    
5a30: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5a40: 6c 73 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20  lsp",        3, 
5a50: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6c  "application/x-l
5a60: 69 73 70 22 20 20 20 20 20 20 20 20 20 20 20 20  isp"            
5a70: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 7a      },.    { "lz
5a80: 68 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  h",        3, "a
5a90: 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74  pplication/octet
5aa0: 2d 73 74 72 65 61 6d 22 20 20 20 20 20 20 20 20  -stream"        
5ab0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 22 2c 20    },.    { "m", 
5ac0: 20 20 20 20 20 20 20 20 20 31 2c 20 22 74 65 78           1, "tex
5ad0: 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20  t/plain"        
5ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5af0: 7d 2c 0a 20 20 20 20 7b 20 22 6d 33 75 22 2c 20  },.    { "m3u", 
5b00: 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f         3, "audio
5b10: 2f 78 2d 6d 70 65 67 75 72 6c 22 20 20 20 20 20  /x-mpegurl"     
5b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
5b30: 0a 20 20 20 20 7b 20 22 6d 61 6e 22 2c 20 20 20  .    { "man",   
5b40: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
5b50: 74 69 6f 6e 2f 78 2d 74 72 6f 66 66 2d 6d 61 6e  tion/x-troff-man
5b60: 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  "           },. 
5b70: 20 20 20 7b 20 22 6d 65 22 2c 20 20 20 20 20 20     { "me",      
5b80: 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69     2, "applicati
5b90: 6f 6e 2f 78 2d 74 72 6f 66 66 2d 6d 65 22 20 20  on/x-troff-me"  
5ba0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5bb0: 20 7b 20 22 6d 65 73 68 22 2c 20 20 20 20 20 20   { "mesh",      
5bc0: 20 34 2c 20 22 6d 6f 64 65 6c 2f 6d 65 73 68 22   4, "model/mesh"
5bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5be0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5bf0: 20 22 6d 69 64 22 2c 20 20 20 20 20 20 20 20 33   "mid",        3
5c00: 2c 20 22 61 75 64 69 6f 2f 6d 69 64 69 22 20 20  , "audio/midi"  
5c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c20: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5c30: 6d 69 64 69 22 2c 20 20 20 20 20 20 20 34 2c 20  midi",       4, 
5c40: 22 61 75 64 69 6f 2f 6d 69 64 69 22 20 20 20 20  "audio/midi"    
5c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c60: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 69      },.    { "mi
5c70: 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  f",        3, "a
5c80: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6d 69 66  pplication/x-mif
5c90: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
5ca0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 69 6d 65    },.    { "mime
5cb0: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 77 77 77  ",       4, "www
5cc0: 2f 6d 69 6d 65 22 20 20 20 20 20 20 20 20 20 20  /mime"          
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ce0: 7d 2c 0a 20 20 20 20 7b 20 22 6d 6f 76 69 65 22  },.    { "movie"
5cf0: 2c 20 20 20 20 20 20 35 2c 20 22 76 69 64 65 6f  ,      5, "video
5d00: 2f 78 2d 73 67 69 2d 6d 6f 76 69 65 22 20 20 20  /x-sgi-movie"   
5d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
5d20: 0a 20 20 20 20 7b 20 22 6d 6f 76 22 2c 20 20 20  .    { "mov",   
5d30: 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 71       3, "video/q
5d40: 75 69 63 6b 74 69 6d 65 22 20 20 20 20 20 20 20  uicktime"       
5d50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5d60: 20 20 20 7b 20 22 6d 70 32 22 2c 20 20 20 20 20     { "mp2",     
5d70: 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 6d 70 65     3, "audio/mpe
5d80: 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g"              
5d90: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5da0: 20 7b 20 22 6d 70 32 22 2c 20 20 20 20 20 20 20   { "mp2",       
5db0: 20 33 2c 20 22 76 69 64 65 6f 2f 6d 70 65 67 22   3, "video/mpeg"
5dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dd0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5de0: 20 22 6d 70 33 22 2c 20 20 20 20 20 20 20 20 33   "mp3",        3
5df0: 2c 20 22 61 75 64 69 6f 2f 6d 70 65 67 22 20 20  , "audio/mpeg"  
5e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e10: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5e20: 6d 70 65 67 22 2c 20 20 20 20 20 20 20 34 2c 20  mpeg",       4, 
5e30: 22 76 69 64 65 6f 2f 6d 70 65 67 22 20 20 20 20  "video/mpeg"    
5e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e50: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70      },.    { "mp
5e60: 65 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76  e",        3, "v
5e70: 69 64 65 6f 2f 6d 70 65 67 22 20 20 20 20 20 20  ideo/mpeg"      
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e90: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 67 61    },.    { "mpga
5ea0: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 75 64  ",       4, "aud
5eb0: 69 6f 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20  io/mpeg"        
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ed0: 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 67 22 2c 20  },.    { "mpg", 
5ee0: 20 20 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f         3, "video
5ef0: 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20 20 20  /mpeg"          
5f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
5f10: 0a 20 20 20 20 7b 20 22 6d 73 22 2c 20 20 20 20  .    { "ms",    
5f20: 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61       2, "applica
5f30: 74 69 6f 6e 2f 78 2d 74 72 6f 66 66 2d 6d 73 22  tion/x-troff-ms"
5f40: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5f50: 20 20 20 7b 20 22 6d 73 68 22 2c 20 20 20 20 20     { "msh",     
5f60: 20 20 20 33 2c 20 22 6d 6f 64 65 6c 2f 6d 65 73     3, "model/mes
5f70: 68 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h"              
5f80: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5f90: 20 7b 20 22 6e 63 22 2c 20 20 20 20 20 20 20 20   { "nc",        
5fa0: 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   2, "application
5fb0: 2f 78 2d 6e 65 74 63 64 66 22 20 20 20 20 20 20  /x-netcdf"      
5fc0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5fd0: 20 22 6f 64 61 22 2c 20 20 20 20 20 20 20 20 33   "oda",        3
5fe0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f  , "application/o
5ff0: 64 61 22 20 20 20 20 20 20 20 20 20 20 20 20 20  da"             
6000: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6010: 6f 67 67 22 2c 20 20 20 20 20 20 20 20 33 2c 20  ogg",        3, 
6020: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 67 67  "application/ogg
6030: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
6040: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 67      },.    { "og
6050: 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  m",        3, "a
6060: 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 67 67 22 20  pplication/ogg" 
6070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6080: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 62 6d 22    },.    { "pbm"
6090: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61  ,        3, "ima
60a0: 67 65 2f 78 2d 70 6f 72 74 61 62 6c 65 2d 62 69  ge/x-portable-bi
60b0: 74 6d 61 70 22 20 20 20 20 20 20 20 20 20 20 20  tmap"           
60c0: 7d 2c 0a 20 20 20 20 7b 20 22 70 64 62 22 2c 20  },.    { "pdb", 
60d0: 20 20 20 20 20 20 20 33 2c 20 22 63 68 65 6d 69         3, "chemi
60e0: 63 61 6c 2f 78 2d 70 64 62 22 20 20 20 20 20 20  cal/x-pdb"      
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6100: 0a 20 20 20 20 7b 20 22 70 64 66 22 2c 20 20 20  .    { "pdf",   
6110: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
6120: 74 69 6f 6e 2f 70 64 66 22 20 20 20 20 20 20 20  tion/pdf"       
6130: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6140: 20 20 20 7b 20 22 70 67 6d 22 2c 20 20 20 20 20     { "pgm",     
6150: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 70     3, "image/x-p
6160: 6f 72 74 61 62 6c 65 2d 67 72 61 79 6d 61 70 22  ortable-graymap"
6170: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6180: 20 7b 20 22 70 67 6e 22 2c 20 20 20 20 20 20 20   { "pgn",       
6190: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
61a0: 2f 78 2d 63 68 65 73 73 2d 70 67 6e 22 20 20 20  /x-chess-pgn"   
61b0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
61c0: 20 22 70 67 70 22 2c 20 20 20 20 20 20 20 20 33   "pgp",        3
61d0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70  , "application/p
61e0: 67 70 22 20 20 20 20 20 20 20 20 20 20 20 20 20  gp"             
61f0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6200: 70 6c 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  pl",         2, 
6210: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 70  "application/x-p
6220: 65 72 6c 22 20 20 20 20 20 20 20 20 20 20 20 20  erl"            
6230: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 6d      },.    { "pm
6240: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61  ",         2, "a
6250: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 70 65 72  pplication/x-per
6260: 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l"              
6270: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 6e 67 22    },.    { "png"
6280: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61  ,        3, "ima
6290: 67 65 2f 70 6e 67 22 20 20 20 20 20 20 20 20 20  ge/png"         
62a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62b0: 7d 2c 0a 20 20 20 20 7b 20 22 70 6e 6d 22 2c 20  },.    { "pnm", 
62c0: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
62d0: 2f 78 2d 70 6f 72 74 61 62 6c 65 2d 61 6e 79 6d  /x-portable-anym
62e0: 61 70 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c  ap"           },
62f0: 0a 20 20 20 20 7b 20 22 70 6f 74 22 2c 20 20 20  .    { "pot",   
6300: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
6310: 74 69 6f 6e 2f 6d 73 70 6f 77 65 72 70 6f 69 6e  tion/mspowerpoin
6320: 74 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  t"          },. 
6330: 20 20 20 7b 20 22 70 70 6d 22 2c 20 20 20 20 20     { "ppm",     
6340: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 70     3, "image/x-p
6350: 6f 72 74 61 62 6c 65 2d 70 69 78 6d 61 70 22 20  ortable-pixmap" 
6360: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6370: 20 7b 20 22 70 70 73 22 2c 20 20 20 20 20 20 20   { "pps",       
6380: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
6390: 2f 6d 73 70 6f 77 65 72 70 6f 69 6e 74 22 20 20  /mspowerpoint"  
63a0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
63b0: 20 22 70 70 74 22 2c 20 20 20 20 20 20 20 20 33   "ppt",        3
63c0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d  , "application/m
63d0: 73 70 6f 77 65 72 70 6f 69 6e 74 22 20 20 20 20  spowerpoint"    
63e0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
63f0: 70 70 7a 22 2c 20 20 20 20 20 20 20 20 33 2c 20  ppz",        3, 
6400: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 70  "application/msp
6410: 6f 77 65 72 70 6f 69 6e 74 22 20 20 20 20 20 20  owerpoint"      
6420: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 72      },.    { "pr
6430: 65 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  e",        3, "a
6440: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 66 72 65  pplication/x-fre
6450: 65 6c 61 6e 63 65 22 20 20 20 20 20 20 20 20 20  elance"         
6460: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 72 74 22    },.    { "prt"
6470: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
6480: 6c 69 63 61 74 69 6f 6e 2f 70 72 6f 5f 65 6e 67  lication/pro_eng
6490: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
64a0: 7d 2c 0a 20 20 20 20 7b 20 22 70 73 22 2c 20 20  },.    { "ps",  
64b0: 20 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69         2, "appli
64c0: 63 61 74 69 6f 6e 2f 70 6f 73 74 73 63 72 69 70  cation/postscrip
64d0: 74 22 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  t"            },
64e0: 0a 20 20 20 20 7b 20 22 71 74 22 2c 20 20 20 20  .    { "qt",    
64f0: 20 20 20 20 20 32 2c 20 22 76 69 64 65 6f 2f 71       2, "video/q
6500: 75 69 63 6b 74 69 6d 65 22 20 20 20 20 20 20 20  uicktime"       
6510: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6520: 20 20 20 7b 20 22 72 61 22 2c 20 20 20 20 20 20     { "ra",      
6530: 20 20 20 32 2c 20 22 61 75 64 69 6f 2f 78 2d 72     2, "audio/x-r
6540: 65 61 6c 61 75 64 69 6f 22 20 20 20 20 20 20 20  ealaudio"       
6550: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6560: 20 7b 20 22 72 61 6d 22 2c 20 20 20 20 20 20 20   { "ram",       
6570: 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 70 6e 2d   3, "audio/x-pn-
6580: 72 65 61 6c 61 75 64 69 6f 22 20 20 20 20 20 20  realaudio"      
6590: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
65a0: 20 22 72 61 72 22 2c 20 20 20 20 20 20 20 20 33   "rar",        3
65b0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
65c0: 2d 72 61 72 2d 63 6f 6d 70 72 65 73 73 65 64 22  -rar-compressed"
65d0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
65e0: 72 61 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20  ras",        3, 
65f0: 22 69 6d 61 67 65 2f 63 6d 75 2d 72 61 73 74 65  "image/cmu-raste
6600: 72 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r"              
6610: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61      },.    { "ra
6620: 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69  s",        3, "i
6630: 6d 61 67 65 2f 78 2d 63 6d 75 2d 72 61 73 74 65  mage/x-cmu-raste
6640: 72 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r"              
6650: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 67 62 22    },.    { "rgb"
6660: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61  ,        3, "ima
6670: 67 65 2f 78 2d 72 67 62 22 20 20 20 20 20 20 20  ge/x-rgb"       
6680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6690: 7d 2c 0a 20 20 20 20 7b 20 22 72 6d 22 2c 20 20  },.    { "rm",  
66a0: 20 20 20 20 20 20 20 32 2c 20 22 61 75 64 69 6f         2, "audio
66b0: 2f 78 2d 70 6e 2d 72 65 61 6c 61 75 64 69 6f 22  /x-pn-realaudio"
66c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
66d0: 0a 20 20 20 20 7b 20 22 72 6f 66 66 22 2c 20 20  .    { "roff",  
66e0: 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61       4, "applica
66f0: 74 69 6f 6e 2f 78 2d 74 72 6f 66 66 22 20 20 20  tion/x-troff"   
6700: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6710: 20 20 20 7b 20 22 72 70 6d 22 2c 20 20 20 20 20     { "rpm",     
6720: 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 70     3, "audio/x-p
6730: 6e 2d 72 65 61 6c 61 75 64 69 6f 2d 70 6c 75 67  n-realaudio-plug
6740: 69 6e 22 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  in"       },.   
6750: 20 7b 20 22 72 74 66 22 2c 20 20 20 20 20 20 20   { "rtf",       
6760: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
6770: 2f 72 74 66 22 20 20 20 20 20 20 20 20 20 20 20  /rtf"           
6780: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6790: 20 22 72 74 66 22 2c 20 20 20 20 20 20 20 20 33   "rtf",        3
67a0: 2c 20 22 74 65 78 74 2f 72 74 66 22 20 20 20 20  , "text/rtf"    
67b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67c0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
67d0: 72 74 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20  rtx",        3, 
67e0: 22 74 65 78 74 2f 72 69 63 68 74 65 78 74 22 20  "text/richtext" 
67f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6800: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 63      },.    { "sc
6810: 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  m",        3, "a
6820: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6c 6f 74  pplication/x-lot
6830: 75 73 73 63 72 65 65 6e 63 61 6d 22 20 20 20 20  usscreencam"    
6840: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 65 74 22    },.    { "set"
6850: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
6860: 6c 69 63 61 74 69 6f 6e 2f 73 65 74 22 20 20 20  lication/set"   
6870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6880: 7d 2c 0a 20 20 20 20 7b 20 22 73 67 6d 6c 22 2c  },.    { "sgml",
6890: 20 20 20 20 20 20 20 34 2c 20 22 74 65 78 74 2f         4, "text/
68a0: 73 67 6d 6c 22 20 20 20 20 20 20 20 20 20 20 20  sgml"           
68b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
68c0: 0a 20 20 20 20 7b 20 22 73 67 6d 22 2c 20 20 20  .    { "sgm",   
68d0: 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 73 67       3, "text/sg
68e0: 6d 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ml"             
68f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6900: 20 20 20 7b 20 22 73 68 22 2c 20 20 20 20 20 20     { "sh",      
6910: 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69     2, "applicati
6920: 6f 6e 2f 78 2d 73 68 22 20 20 20 20 20 20 20 20  on/x-sh"        
6930: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6940: 20 7b 20 22 73 68 61 72 22 2c 20 20 20 20 20 20   { "shar",      
6950: 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   4, "application
6960: 2f 78 2d 73 68 61 72 22 20 20 20 20 20 20 20 20  /x-shar"        
6970: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6980: 20 22 73 69 6c 6f 22 2c 20 20 20 20 20 20 20 34   "silo",       4
6990: 2c 20 22 6d 6f 64 65 6c 2f 6d 65 73 68 22 20 20  , "model/mesh"  
69a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69b0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
69c0: 73 69 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20  sit",        3, 
69d0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73  "application/x-s
69e0: 74 75 66 66 69 74 22 20 20 20 20 20 20 20 20 20  tuffit"         
69f0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6b      },.    { "sk
6a00: 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  d",        3, "a
6a10: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6b 6f 61  pplication/x-koa
6a20: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
6a30: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6b 6d 22    },.    { "skm"
6a40: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
6a50: 6c 69 63 61 74 69 6f 6e 2f 78 2d 6b 6f 61 6e 22  lication/x-koan"
6a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a70: 7d 2c 0a 20 20 20 20 7b 20 22 73 6b 70 22 2c 20  },.    { "skp", 
6a80: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
6a90: 63 61 74 69 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20  cation/x-koan"  
6aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6ab0: 0a 20 20 20 20 7b 20 22 73 6b 74 22 2c 20 20 20  .    { "skt",   
6ac0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
6ad0: 74 69 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20 20  tion/x-koan"    
6ae0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6af0: 20 20 20 7b 20 22 73 6d 69 22 2c 20 20 20 20 20     { "smi",     
6b00: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
6b10: 6f 6e 2f 73 6d 69 6c 22 20 20 20 20 20 20 20 20  on/smil"        
6b20: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6b30: 20 7b 20 22 73 6d 69 6c 22 2c 20 20 20 20 20 20   { "smil",      
6b40: 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   4, "application
6b50: 2f 73 6d 69 6c 22 20 20 20 20 20 20 20 20 20 20  /smil"          
6b60: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6b70: 20 22 73 6e 64 22 2c 20 20 20 20 20 20 20 20 33   "snd",        3
6b80: 2c 20 22 61 75 64 69 6f 2f 62 61 73 69 63 22 20  , "audio/basic" 
6b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ba0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6bb0: 73 6f 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20  sol",        3, 
6bc0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 73 6f 6c  "application/sol
6bd0: 69 64 73 22 20 20 20 20 20 20 20 20 20 20 20 20  ids"            
6be0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 70      },.    { "sp
6bf0: 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  l",        3, "a
6c00: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 66 75 74  pplication/x-fut
6c10: 75 72 65 73 70 6c 61 73 68 22 20 20 20 20 20 20  uresplash"      
6c20: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 72 63 22    },.    { "src"
6c30: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
6c40: 6c 69 63 61 74 69 6f 6e 2f 78 2d 77 61 69 73 2d  lication/x-wais-
6c50: 73 6f 75 72 63 65 22 20 20 20 20 20 20 20 20 20  source"         
6c60: 7d 2c 0a 20 20 20 20 7b 20 22 73 74 65 70 22 2c  },.    { "step",
6c70: 20 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69         4, "appli
6c80: 63 61 74 69 6f 6e 2f 53 54 45 50 22 20 20 20 20  cation/STEP"    
6c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6ca0: 0a 20 20 20 20 7b 20 22 73 74 6c 22 2c 20 20 20  .    { "stl",   
6cb0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
6cc0: 74 69 6f 6e 2f 53 4c 41 22 20 20 20 20 20 20 20  tion/SLA"       
6cd0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6ce0: 20 20 20 7b 20 22 73 74 70 22 2c 20 20 20 20 20     { "stp",     
6cf0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
6d00: 6f 6e 2f 53 54 45 50 22 20 20 20 20 20 20 20 20  on/STEP"        
6d10: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6d20: 20 7b 20 22 73 76 34 63 70 69 6f 22 2c 20 20 20   { "sv4cpio",   
6d30: 20 37 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   7, "application
6d40: 2f 78 2d 73 76 34 63 70 69 6f 22 20 20 20 20 20  /x-sv4cpio"     
6d50: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6d60: 20 22 73 76 34 63 72 63 22 2c 20 20 20 20 20 36   "sv4crc",     6
6d70: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
6d80: 2d 73 76 34 63 72 63 22 20 20 20 20 20 20 20 20  -sv4crc"        
6d90: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6da0: 73 77 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20  swf",        3, 
6db0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73  "application/x-s
6dc0: 68 6f 63 6b 77 61 76 65 2d 66 6c 61 73 68 22 20  hockwave-flash" 
6dd0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 22      },.    { "t"
6de0: 2c 20 20 20 20 20 20 20 20 20 20 31 2c 20 22 61  ,          1, "a
6df0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72 6f  pplication/x-tro
6e00: 66 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ff"             
6e10: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 61 72 22    },.    { "tar"
6e20: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
6e30: 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 61 72 22 20  lication/x-tar" 
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e50: 7d 2c 0a 20 20 20 20 7b 20 22 74 63 6c 22 2c 20  },.    { "tcl", 
6e60: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
6e70: 63 61 74 69 6f 6e 2f 78 2d 74 63 6c 22 20 20 20  cation/x-tcl"   
6e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6e90: 0a 20 20 20 20 7b 20 22 74 65 78 22 2c 20 20 20  .    { "tex",   
6ea0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
6eb0: 74 69 6f 6e 2f 78 2d 74 65 78 22 20 20 20 20 20  tion/x-tex"     
6ec0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6ed0: 20 20 20 7b 20 22 74 65 78 69 22 2c 20 20 20 20     { "texi",    
6ee0: 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69     4, "applicati
6ef0: 6f 6e 2f 78 2d 74 65 78 69 6e 66 6f 22 20 20 20  on/x-texinfo"   
6f00: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6f10: 20 7b 20 22 74 65 78 69 6e 66 6f 22 2c 20 20 20   { "texinfo",   
6f20: 20 37 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   7, "application
6f30: 2f 78 2d 74 65 78 69 6e 66 6f 22 20 20 20 20 20  /x-texinfo"     
6f40: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6f50: 20 22 74 67 7a 22 2c 20 20 20 20 20 20 20 20 33   "tgz",        3
6f60: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
6f70: 2d 74 61 72 2d 67 7a 22 20 20 20 20 20 20 20 20  -tar-gz"        
6f80: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6f90: 74 69 66 66 22 2c 20 20 20 20 20 20 20 34 2c 20  tiff",       4, 
6fa0: 22 69 6d 61 67 65 2f 74 69 66 66 22 20 20 20 20  "image/tiff"    
6fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fc0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 69      },.    { "ti
6fd0: 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69  f",        3, "i
6fe0: 6d 61 67 65 2f 74 69 66 66 22 20 20 20 20 20 20  mage/tiff"      
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7000: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 72 22 2c    },.    { "tr",
7010: 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70 70           2, "app
7020: 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72 6f 66 66  lication/x-troff
7030: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
7040: 7d 2c 0a 20 20 20 20 7b 20 22 74 73 69 22 2c 20  },.    { "tsi", 
7050: 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f         3, "audio
7060: 2f 54 53 50 2d 61 75 64 69 6f 22 20 20 20 20 20  /TSP-audio"     
7070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7080: 0a 20 20 20 20 7b 20 22 74 73 70 22 2c 20 20 20  .    { "tsp",   
7090: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
70a0: 74 69 6f 6e 2f 64 73 70 74 79 70 65 22 20 20 20  tion/dsptype"   
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
70c0: 20 20 20 7b 20 22 74 73 76 22 2c 20 20 20 20 20     { "tsv",     
70d0: 20 20 20 33 2c 20 22 74 65 78 74 2f 74 61 62 2d     3, "text/tab-
70e0: 73 65 70 61 72 61 74 65 64 2d 76 61 6c 75 65 73  separated-values
70f0: 22 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  "         },.   
7100: 20 7b 20 22 74 78 74 22 2c 20 20 20 20 20 20 20   { "txt",       
7110: 20 33 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22   3, "text/plain"
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7130: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7140: 20 22 75 6e 76 22 2c 20 20 20 20 20 20 20 20 33   "unv",        3
7150: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 69  , "application/i
7160: 2d 64 65 61 73 22 20 20 20 20 20 20 20 20 20 20  -deas"          
7170: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7180: 75 73 74 61 72 22 2c 20 20 20 20 20 20 35 2c 20  ustar",      5, 
7190: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 75  "application/x-u
71a0: 73 74 61 72 22 20 20 20 20 20 20 20 20 20 20 20  star"           
71b0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 76 63      },.    { "vc
71c0: 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  d",        3, "a
71d0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 63 64 6c  pplication/x-cdl
71e0: 69 6e 6b 22 20 20 20 20 20 20 20 20 20 20 20 20  ink"            
71f0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 76 64 61 22    },.    { "vda"
7200: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
7210: 6c 69 63 61 74 69 6f 6e 2f 76 64 61 22 20 20 20  lication/vda"   
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7230: 7d 2c 0a 20 20 20 20 7b 20 22 76 69 76 22 2c 20  },.    { "viv", 
7240: 20 20 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f         3, "video
7250: 2f 76 6e 64 2e 76 69 76 6f 22 20 20 20 20 20 20  /vnd.vivo"      
7260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7270: 0a 20 20 20 20 7b 20 22 76 69 76 6f 22 2c 20 20  .    { "vivo",  
7280: 20 20 20 20 20 34 2c 20 22 76 69 64 65 6f 2f 76       4, "video/v
7290: 6e 64 2e 76 69 76 6f 22 20 20 20 20 20 20 20 20  nd.vivo"        
72a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
72b0: 20 20 20 7b 20 22 76 72 6d 6c 22 2c 20 20 20 20     { "vrml",    
72c0: 20 20 20 34 2c 20 22 6d 6f 64 65 6c 2f 76 72 6d     4, "model/vrm
72d0: 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l"              
72e0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
72f0: 20 7b 20 22 77 61 76 22 2c 20 20 20 20 20 20 20   { "wav",       
7300: 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 77 61 76   3, "audio/x-wav
7310: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
7320: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7330: 20 22 77 61 78 22 2c 20 20 20 20 20 20 20 20 33   "wax",        3
7340: 2c 20 22 61 75 64 69 6f 2f 78 2d 6d 73 2d 77 61  , "audio/x-ms-wa
7350: 78 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x"              
7360: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7370: 77 69 6b 69 22 2c 20 20 20 20 20 20 20 34 2c 20  wiki",       4, 
7380: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 66  "application/x-f
7390: 6f 73 73 69 6c 2d 77 69 6b 69 22 20 20 20 20 20  ossil-wiki"     
73a0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 6d      },.    { "wm
73b0: 61 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  a",        3, "a
73c0: 75 64 69 6f 2f 78 2d 6d 73 2d 77 6d 61 22 20 20  udio/x-ms-wma"  
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73e0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 6d 76 22    },.    { "wmv"
73f0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64  ,        3, "vid
7400: 65 6f 2f 78 2d 6d 73 2d 77 6d 76 22 20 20 20 20  eo/x-ms-wmv"    
7410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7420: 7d 2c 0a 20 20 20 20 7b 20 22 77 6d 78 22 2c 20  },.    { "wmx", 
7430: 20 20 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f         3, "video
7440: 2f 78 2d 6d 73 2d 77 6d 78 22 20 20 20 20 20 20  /x-ms-wmx"      
7450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7460: 0a 20 20 20 20 7b 20 22 77 72 6c 22 2c 20 20 20  .    { "wrl",   
7470: 20 20 20 20 20 33 2c 20 22 6d 6f 64 65 6c 2f 76       3, "model/v
7480: 72 6d 6c 22 20 20 20 20 20 20 20 20 20 20 20 20  rml"            
7490: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
74a0: 20 20 20 7b 20 22 77 76 78 22 2c 20 20 20 20 20     { "wvx",     
74b0: 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d     3, "video/x-m
74c0: 73 2d 77 76 78 22 20 20 20 20 20 20 20 20 20 20  s-wvx"          
74d0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
74e0: 20 7b 20 22 78 62 6d 22 2c 20 20 20 20 20 20 20   { "xbm",       
74f0: 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 78 62 69   3, "image/x-xbi
7500: 74 6d 61 70 22 20 20 20 20 20 20 20 20 20 20 20  tmap"           
7510: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7520: 20 22 78 6c 63 22 2c 20 20 20 20 20 20 20 20 33   "xlc",        3
7530: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76  , "application/v
7540: 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20 20 20 20  nd.ms-excel"    
7550: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7560: 78 6c 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20  xll",        3, 
7570: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76 6e 64  "application/vnd
7580: 2e 6d 73 2d 65 78 63 65 6c 22 20 20 20 20 20 20  .ms-excel"      
7590: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 6c      },.    { "xl
75a0: 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  m",        3, "a
75b0: 70 70 6c 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d  pplication/vnd.m
75c0: 73 2d 65 78 63 65 6c 22 20 20 20 20 20 20 20 20  s-excel"        
75d0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 6c 73 22    },.    { "xls"
75e0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
75f0: 6c 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d  lication/vnd.ms-
7600: 65 78 63 65 6c 22 20 20 20 20 20 20 20 20 20 20  excel"          
7610: 7d 2c 0a 20 20 20 20 7b 20 22 78 6c 77 22 2c 20  },.    { "xlw", 
7620: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
7630: 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78  cation/vnd.ms-ex
7640: 63 65 6c 22 20 20 20 20 20 20 20 20 20 20 7d 2c  cel"          },
7650: 0a 20 20 20 20 7b 20 22 78 6d 6c 22 2c 20 20 20  .    { "xml",   
7660: 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 78 6d       3, "text/xm
7670: 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l"              
7680: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7690: 20 20 20 7b 20 22 78 70 6d 22 2c 20 20 20 20 20     { "xpm",     
76a0: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 78     3, "image/x-x
76b0: 70 69 78 6d 61 70 22 20 20 20 20 20 20 20 20 20  pixmap"         
76c0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
76d0: 20 7b 20 22 78 77 64 22 2c 20 20 20 20 20 20 20   { "xwd",       
76e0: 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 78 77 69   3, "image/x-xwi
76f0: 6e 64 6f 77 64 75 6d 70 22 20 20 20 20 20 20 20  ndowdump"       
7700: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7710: 20 22 78 79 7a 22 2c 20 20 20 20 20 20 20 20 33   "xyz",        3
7720: 2c 20 22 63 68 65 6d 69 63 61 6c 2f 78 2d 70 64  , "chemical/x-pd
7730: 62 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b"              
7740: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7750: 7a 69 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20  zip",        3, 
7760: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 7a 69 70  "application/zip
7770: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
7780: 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 66      },.  };..  f
7790: 6f 72 28 69 3d 6e 4e 61 6d 65 2d 31 3b 20 69 3e  or(i=nName-1; i>
77a0: 30 20 26 26 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27  0 && zName[i]!='
77b0: 2e 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 7a 20 3d  .'; i--){}.  z =
77c0: 20 26 7a 4e 61 6d 65 5b 69 2b 31 5d 3b 0a 20 20   &zName[i+1];.  
77d0: 6c 65 6e 20 3d 20 6e 4e 61 6d 65 20 2d 20 69 3b  len = nName - i;
77e0: 0a 20 20 69 66 28 20 6c 65 6e 3c 28 69 6e 74 29  .  if( len<(int)
77f0: 73 69 7a 65 6f 66 28 7a 53 75 66 66 69 78 29 2d  sizeof(zSuffix)-
7800: 31 20 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28  1 ){.    strcpy(
7810: 7a 53 75 66 66 69 78 2c 20 7a 29 3b 0a 20 20 20  zSuffix, z);.   
7820: 20 66 6f 72 28 69 3d 30 3b 20 7a 53 75 66 66 69   for(i=0; zSuffi
7830: 78 5b 69 5d 3b 20 69 2b 2b 29 20 7a 53 75 66 66  x[i]; i++) zSuff
7840: 69 78 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72 28  ix[i] = tolower(
7850: 7a 53 75 66 66 69 78 5b 69 5d 29 3b 0a 20 20 20  zSuffix[i]);.   
7860: 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20   first = 0;.    
7870: 6c 61 73 74 20 3d 20 73 69 7a 65 6f 66 28 61 4d  last = sizeof(aM
7880: 69 6d 65 29 2f 73 69 7a 65 6f 66 28 61 4d 69 6d  ime)/sizeof(aMim
7890: 65 5b 30 5d 29 3b 0a 20 20 20 20 77 68 69 6c 65  e[0]);.    while
78a0: 28 20 66 69 72 73 74 3c 3d 6c 61 73 74 20 29 7b  ( first<=last ){
78b0: 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20  .      int c;.  
78c0: 20 20 20 20 69 20 3d 20 28 66 69 72 73 74 2b 6c      i = (first+l
78d0: 61 73 74 29 2f 32 3b 0a 20 20 20 20 20 20 63 20  ast)/2;.      c 
78e0: 3d 20 73 74 72 63 6d 70 28 7a 53 75 66 66 69 78  = strcmp(zSuffix
78f0: 2c 20 61 4d 69 6d 65 5b 69 5d 2e 7a 53 75 66 66  , aMime[i].zSuff
7900: 69 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  ix);.      if( c
7910: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 4d 69  ==0 ) return aMi
7920: 6d 65 5b 69 5d 2e 7a 4d 69 6d 65 74 79 70 65 3b  me[i].zMimetype;
7930: 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29  .      if( c<0 )
7940: 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 20 3d  {.        last =
7950: 20 69 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   i-1;.      }els
7960: 65 7b 0a 20 20 20 20 20 20 20 20 66 69 72 73 74  e{.        first
7970: 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20 7d 0a   = i+1;.      }.
7980: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
7990: 72 6e 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  rn "application/
79a0: 6f 63 74 65 74 2d 73 74 72 65 61 6d 22 3b 0a 7d  octet-stream";.}
79b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
79c0: 6f 77 69 6e 67 20 74 61 62 6c 65 20 63 6f 6e 74  owing table cont
79d0: 61 69 6e 73 20 31 20 66 6f 72 20 61 6c 6c 20 63  ains 1 for all c
79e0: 68 61 72 61 63 74 65 72 73 20 74 68 61 74 20 61  haracters that a
79f0: 72 65 20 70 65 72 6d 69 74 74 65 64 20 69 6e 0a  re permitted in.
7a00: 2a 2a 20 74 68 65 20 70 61 72 74 20 6f 66 20 74  ** the part of t
7a10: 68 65 20 55 52 4c 20 62 65 66 6f 72 65 20 74 68  he URL before th
7a20: 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  e query paramete
7a30: 72 73 20 61 6e 64 20 66 72 61 67 6d 65 6e 74 2e  rs and fragment.
7a40: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 63  .**.** Allowed c
7a50: 68 61 72 61 63 74 65 72 73 3a 20 20 30 2d 39 20  haracters:  0-9 
7a60: 61 2d 7a 20 41 2d 5a 20 2c 2d 2e 2f 3a 5f 7e 0a  a-z A-Z ,-./:_~.
7a70: 2a 2a 0a 2a 2a 20 44 69 73 61 6c 6c 6f 77 65 64  **.** Disallowed
7a80: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 63 6c   characters incl
7a90: 75 64 65 3a 20 20 21 22 23 24 25 26 27 28 29 2a  ude:  !"#$%&'()*
7aa0: 2b 3b 3c 3d 3e 3f 5b 5c 5d 5e 7b 7c 7d 0a 2a 2f  +;<=>?[\]^{|}.*/
7ab0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
7ac0: 61 72 20 61 6c 6c 6f 77 65 64 49 6e 4e 61 6d 65  ar allowedInName
7ad0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 2f 2a 20  [] = {.      /* 
7ae0: 20 78 30 20 20 78 31 20 20 78 32 20 20 78 33 20   x0  x1  x2  x3 
7af0: 20 78 34 20 20 78 35 20 20 78 36 20 20 78 37 20   x4  x5  x6  x7 
7b00: 20 78 38 20 20 78 39 20 20 78 61 20 20 78 62 20   x8  x9  xa  xb 
7b10: 20 78 63 20 20 78 64 20 20 78 65 20 20 78 66 20   xc  xd  xe  xf 
7b20: 2a 2f 0a 2f 2a 20 30 78 20 2a 2f 20 20 20 30 2c  */./* 0x */   0,
7b30: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
7b40: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
7b50: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
7b60: 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20    0,  0,  0,./* 
7b70: 31 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20  1x */   0,  0,  
7b80: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
7b90: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
7ba0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
7bb0: 30 2c 20 20 30 2c 0a 2f 2a 20 32 78 20 2a 2f 20  0,  0,./* 2x */ 
7bc0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
7bd0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
7be0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
7bf0: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
7c00: 0a 2f 2a 20 33 78 20 2a 2f 20 20 20 31 2c 20 20  ./* 3x */   1,  
7c10: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
7c20: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
7c30: 31 2c 20 20 31 2c 20 20 30 2c 20 20 30 2c 20 20  1,  1,  0,  0,  
7c40: 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 34 78  0,  0,  0,./* 4x
7c50: 20 2a 2f 20 20 20 30 2c 20 20 31 2c 20 20 31 2c   */   0,  1,  1,
7c60: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
7c70: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
7c80: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
7c90: 20 20 31 2c 0a 2f 2a 20 35 78 20 2a 2f 20 20 20    1,./* 5x */   
7ca0: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
7cb0: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
7cc0: 31 2c 20 20 31 2c 20 20 31 2c 20 20 30 2c 20 20  1,  1,  1,  0,  
7cd0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 31 2c 0a 2f  0,  0,  0,  1,./
7ce0: 2a 20 36 78 20 2a 2f 20 20 20 30 2c 20 20 31 2c  * 6x */   0,  1,
7cf0: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
7d00: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
7d10: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
7d20: 20 20 31 2c 20 20 31 2c 0a 2f 2a 20 37 78 20 2a    1,  1,./* 7x *
7d30: 2f 20 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  /   1,  1,  1,  
7d40: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
7d50: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
7d60: 30 2c 20 20 30 2c 20 20 30 2c 20 20 31 2c 20 20  0,  0,  0,  1,  
7d70: 30 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0,.};../*.** Thi
7d80: 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73  s routine proces
7d90: 73 65 73 20 61 20 73 69 6e 67 6c 65 20 48 54 54  ses a single HTT
7da0: 50 20 72 65 71 75 65 73 74 20 6f 6e 20 73 74 61  P request on sta
7db0: 6e 64 61 72 64 20 69 6e 70 75 74 20 61 6e 64 0a  ndard input and.
7dc0: 2a 2a 20 73 65 6e 64 73 20 74 68 65 20 72 65 70  ** sends the rep
7dd0: 6c 79 20 74 6f 20 73 74 61 6e 64 61 72 64 20 6f  ly to standard o
7de0: 75 74 70 75 74 2e 20 20 49 66 20 74 68 65 20 61  utput.  If the a
7df0: 72 67 75 6d 65 6e 74 20 69 73 20 31 20 69 74 20  rgument is 1 it 
7e00: 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 77 65  means.** that we
7e10: 20 61 72 65 20 73 68 6f 75 6c 64 20 63 6c 6f 73   are should clos
7e20: 65 20 74 68 65 20 73 6f 63 6b 65 74 20 77 69 74  e the socket wit
7e30: 68 6f 75 74 20 70 72 6f 63 65 73 73 69 6e 67 20  hout processing 
7e40: 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 48 54  additional.** HT
7e50: 54 50 20 72 65 71 75 65 73 74 73 20 61 66 74 65  TP requests afte
7e60: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65  r the current re
7e70: 71 75 65 73 74 20 66 69 6e 69 73 68 65 73 2e 20  quest finishes. 
7e80: 20 30 20 6d 65 61 6e 73 20 77 65 20 61 72 65 0a   0 means we are.
7e90: 2a 2a 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6b 65  ** allowed to ke
7ea0: 65 70 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ep the connectio
7eb0: 6e 20 6f 70 65 6e 20 61 6e 64 20 74 6f 20 70 72  n open and to pr
7ec0: 6f 63 65 73 73 20 61 64 64 69 74 69 6f 6e 61 6c  ocess additional
7ed0: 20 72 65 71 75 65 73 74 73 2e 0a 2a 2a 20 54 68   requests..** Th
7ee0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 63  is routine may c
7ef0: 68 6f 6f 73 65 20 74 6f 20 63 6c 6f 73 65 20 74  hoose to close t
7f00: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 65 76  he connection ev
7f10: 65 6e 20 69 66 20 74 68 65 20 61 72 67 75 6d 65  en if the argume
7f20: 6e 74 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2a 20 0a  nt.** is 0..** .
7f30: 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63  ** If the connec
7f40: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63  tion should be c
7f50: 6c 6f 73 65 64 2c 20 74 68 69 73 20 72 6f 75 74  losed, this rout
7f60: 69 6e 65 20 63 61 6c 6c 73 20 65 78 69 74 28 29  ine calls exit()
7f70: 20 61 6e 64 0a 2a 2a 20 74 68 75 73 20 6e 65 76   and.** thus nev
7f80: 65 72 20 72 65 74 75 72 6e 73 2e 20 20 49 66 20  er returns.  If 
7f90: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  this routine doe
7fa0: 73 20 72 65 74 75 72 6e 20 69 74 20 6d 65 61 6e  s return it mean
7fb0: 73 20 74 68 61 74 20 61 6e 6f 74 68 65 72 0a 2a  s that another.*
7fc0: 2a 20 48 54 54 50 20 72 65 71 75 65 73 74 20 6d  * HTTP request m
7fd0: 61 79 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65  ay appear on the
7fe0: 20 77 69 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 50   wire..*/.void P
7ff0: 72 6f 63 65 73 73 4f 6e 65 52 65 71 75 65 73 74  rocessOneRequest
8000: 28 69 6e 74 20 66 6f 72 63 65 43 6c 6f 73 65 29  (int forceClose)
8010: 7b 0a 20 20 69 6e 74 20 69 2c 20 63 3b 0a 20 20  {.  int i, c;.  
8020: 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20  char *z;        
8030: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
8040: 64 20 74 6f 20 70 61 72 73 65 20 75 70 20 61 20  d to parse up a 
8050: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 73 74 72 75  string */.  stru
8060: 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b  ct stat statbuf;
8070: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
8080: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66  tion about the f
8090: 69 6c 65 20 74 6f 20 62 65 20 72 65 74 72 69 65  ile to be retrie
80a0: 76 65 64 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 69  ved */.  FILE *i
80b0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
80c0: 20 20 20 2f 2a 20 46 6f 72 20 72 65 61 64 69 6e     /* For readin
80d0: 67 20 66 72 6f 6d 20 43 47 49 20 73 63 72 69 70  g from CGI scrip
80e0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 7a 4c 69  ts */.  char zLi
80f0: 6e 65 5b 31 30 30 30 5d 3b 20 20 20 20 20 20 20  ne[1000];       
8100: 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 66 6f    /* A buffer fo
8110: 72 20 69 6e 70 75 74 20 6c 69 6e 65 73 20 6f 72  r input lines or
8120: 20 66 6f 72 6d 69 6e 67 20 6e 61 6d 65 73 20 2a   forming names *
8130: 2f 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 64  /..  /* Change d
8140: 69 72 65 63 74 6f 72 69 65 73 20 74 6f 20 74 68  irectories to th
8150: 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 48 54  e root of the HT
8160: 54 50 20 66 69 6c 65 73 79 73 74 65 6d 0a 20 20  TP filesystem.  
8170: 2a 2f 0a 20 20 69 66 28 20 63 68 64 69 72 28 7a  */.  if( chdir(z
8180: 52 6f 6f 74 5b 30 5d 20 3f 20 7a 52 6f 6f 74 20  Root[0] ? zRoot 
8190: 3a 20 22 2f 22 29 21 3d 30 20 29 7b 0a 20 20 20  : "/")!=0 ){.   
81a0: 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30 5d   char zBuf[1000]
81b0: 3b 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f  ;.    Malfunctio
81c0: 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 63 61 6e  n(__LINE__, "can
81d0: 6e 6f 74 20 63 68 64 69 72 20 74 6f 20 5b 25 73  not chdir to [%s
81e0: 5d 20 66 72 6f 6d 20 5b 25 73 5d 22 2c 0a 20 20  ] from [%s]",.  
81f0: 20 20 20 20 20 20 20 7a 52 6f 6f 74 2c 20 67 65         zRoot, ge
8200: 74 63 77 64 28 7a 42 75 66 2c 39 39 39 29 29 3b  tcwd(zBuf,999));
8210: 0a 20 20 7d 0a 20 20 6e 52 65 71 75 65 73 74 2b  .  }.  nRequest+
8220: 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65  +;..  /*.  ** We
8230: 20 6d 75 73 74 20 72 65 63 65 69 76 65 20 61 20   must receive a 
8240: 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 20  complete header 
8250: 77 69 74 68 69 6e 20 31 35 20 73 65 63 6f 6e 64  within 15 second
8260: 73 0a 20 20 2a 2f 0a 20 20 73 69 67 6e 61 6c 28  s.  */.  signal(
8270: 53 49 47 41 4c 52 4d 2c 20 54 69 6d 65 6f 75 74  SIGALRM, Timeout
8280: 29 3b 0a 20 20 69 66 28 20 75 73 65 54 69 6d 65  );.  if( useTime
8290: 6f 75 74 20 29 20 61 6c 61 72 6d 28 31 35 29 3b  out ) alarm(15);
82a0: 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 66  ..  /* Get the f
82b0: 69 72 73 74 20 6c 69 6e 65 20 6f 66 20 74 68 65  irst line of the
82c0: 20 72 65 71 75 65 73 74 20 61 6e 64 20 70 61 72   request and par
82d0: 73 65 20 6f 75 74 20 74 68 65 0a 20 20 2a 2a 20  se out the.  ** 
82e0: 6d 65 74 68 6f 64 2c 20 74 68 65 20 73 63 72 69  method, the scri
82f0: 70 74 20 61 6e 64 20 74 68 65 20 70 72 6f 74 6f  pt and the proto
8300: 63 6f 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  col..  */.  if( 
8310: 66 67 65 74 73 28 7a 4c 69 6e 65 2c 73 69 7a 65  fgets(zLine,size
8320: 6f 66 28 7a 4c 69 6e 65 29 2c 73 74 64 69 6e 29  of(zLine),stdin)
8330: 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78 69 74 28  ==0 ){.    exit(
8340: 30 29 3b 0a 20 20 7d 0a 20 20 6f 6d 69 74 4c 6f  0);.  }.  omitLo
8350: 67 20 3d 20 30 3b 0a 20 20 6e 49 6e 20 2b 3d 20  g = 0;.  nIn += 
8360: 73 74 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20  strlen(zLine);. 
8370: 20 7a 4d 65 74 68 6f 64 20 3d 20 53 74 72 44 75   zMethod = StrDu
8380: 70 28 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e  p(GetFirstElemen
8390: 74 28 7a 4c 69 6e 65 2c 26 7a 29 29 3b 0a 20 20  t(zLine,&z));.  
83a0: 7a 52 65 61 6c 53 63 72 69 70 74 20 3d 20 7a 53  zRealScript = zS
83b0: 63 72 69 70 74 20 3d 20 53 74 72 44 75 70 28 47  cript = StrDup(G
83c0: 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a  etFirstElement(z
83d0: 2c 26 7a 29 29 3b 0a 20 20 7a 50 72 6f 74 6f 63  ,&z));.  zProtoc
83e0: 6f 6c 20 3d 20 53 74 72 44 75 70 28 47 65 74 46  ol = StrDup(GetF
83f0: 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a 2c 26 7a  irstElement(z,&z
8400: 29 29 3b 0a 20 20 69 66 28 20 7a 50 72 6f 74 6f  ));.  if( zProto
8410: 63 6f 6c 3d 3d 30 20 7c 7c 20 73 74 72 6e 63 6d  col==0 || strncm
8420: 70 28 7a 50 72 6f 74 6f 63 6f 6c 2c 22 48 54 54  p(zProtocol,"HTT
8430: 50 2f 22 2c 35 29 21 3d 30 20 7c 7c 20 73 74 72  P/",5)!=0 || str
8440: 6c 65 6e 28 7a 50 72 6f 74 6f 63 6f 6c 29 21 3d  len(zProtocol)!=
8450: 38 20 29 7b 0a 20 20 20 20 53 74 61 72 74 52 65  8 ){.    StartRe
8460: 73 70 6f 6e 73 65 28 22 34 30 30 20 42 61 64 20  sponse("400 Bad 
8470: 52 65 71 75 65 73 74 22 29 3b 0a 20 20 20 20 6e  Request");.    n
8480: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20  Out += printf(. 
8490: 20 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79       "Content-ty
84a0: 70 65 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c 72  pe: text/plain\r
84b0: 5c 6e 22 0a 20 20 20 20 20 20 22 5c 72 5c 6e 22  \n".      "\r\n"
84c0: 0a 20 20 20 20 20 20 22 54 68 69 73 20 73 65 72  .      "This ser
84d0: 76 65 72 20 64 6f 65 73 20 6e 6f 74 20 75 6e 64  ver does not und
84e0: 65 72 73 74 61 6e 64 20 74 68 65 20 72 65 71 75  erstand the requ
84f0: 65 73 74 65 64 20 70 72 6f 74 6f 63 6f 6c 5c 6e  ested protocol\n
8500: 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 4d 61 6b  ".    );.    Mak
8510: 65 4c 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20 20  eLogEntry(0);.  
8520: 20 20 65 78 69 74 28 30 29 3b 0a 20 20 7d 0a 20    exit(0);.  }. 
8530: 20 69 66 28 20 7a 53 63 72 69 70 74 5b 30 5d 3d   if( zScript[0]=
8540: 3d 30 20 29 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f  =0 ) NotFound(__
8550: 4c 49 4e 45 5f 5f 29 3b 0a 20 20 69 66 28 20 66  LINE__);.  if( f
8560: 6f 72 63 65 43 6c 6f 73 65 20 29 7b 0a 20 20 20  orceClose ){.   
8570: 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e   closeConnection
8580: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 1;.  }else if
8590: 28 20 7a 50 72 6f 74 6f 63 6f 6c 5b 35 5d 3c 27  ( zProtocol[5]<'
85a0: 31 27 20 7c 7c 20 7a 50 72 6f 74 6f 63 6f 6c 5b  1' || zProtocol[
85b0: 37 5d 3c 27 31 27 20 29 7b 0a 20 20 20 20 63 6c  7]<'1' ){.    cl
85c0: 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20  oseConnection = 
85d0: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69  1;.  }..  /* Thi
85e0: 73 20 76 65 72 79 20 73 69 6d 70 6c 65 20 73 65  s very simple se
85f0: 72 76 65 72 20 6f 6e 6c 79 20 75 6e 64 65 72 73  rver only unders
8600: 74 61 6e 64 73 20 74 68 65 20 47 45 54 2c 20 50  tands the GET, P
8610: 4f 53 54 0a 20 20 2a 2a 20 61 6e 64 20 48 45 41  OST.  ** and HEA
8620: 44 20 6d 65 74 68 6f 64 73 0a 20 20 2a 2f 0a 20  D methods.  */. 
8630: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4d 65 74   if( strcmp(zMet
8640: 68 6f 64 2c 22 47 45 54 22 29 21 3d 30 20 26 26  hod,"GET")!=0 &&
8650: 20 73 74 72 63 6d 70 28 7a 4d 65 74 68 6f 64 2c   strcmp(zMethod,
8660: 22 50 4f 53 54 22 29 21 3d 30 0a 20 20 20 20 20  "POST")!=0.     
8670: 20 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 65 74    && strcmp(zMet
8680: 68 6f 64 2c 22 48 45 41 44 22 29 21 3d 30 20 29  hod,"HEAD")!=0 )
8690: 7b 0a 20 20 20 20 53 74 61 72 74 52 65 73 70 6f  {.    StartRespo
86a0: 6e 73 65 28 22 35 30 31 20 4e 6f 74 20 49 6d 70  nse("501 Not Imp
86b0: 6c 65 6d 65 6e 74 65 64 22 29 3b 0a 20 20 20 20  lemented");.    
86c0: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a  nOut += printf(.
86d0: 20 20 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74        "Content-t
86e0: 79 70 65 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c  ype: text/plain\
86f0: 72 5c 6e 22 0a 20 20 20 20 20 20 22 5c 72 5c 6e  r\n".      "\r\n
8700: 22 0a 20 20 20 20 20 20 22 54 68 65 20 25 73 20  ".      "The %s 
8710: 6d 65 74 68 6f 64 20 69 73 20 6e 6f 74 20 69 6d  method is not im
8720: 70 6c 65 6d 65 6e 74 65 64 20 6f 6e 20 74 68 69  plemented on thi
8730: 73 20 73 65 72 76 65 72 2e 5c 6e 22 2c 0a 20 20  s server.\n",.  
8740: 20 20 20 20 7a 4d 65 74 68 6f 64 29 3b 0a 20 20      zMethod);.  
8750: 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30    MakeLogEntry(0
8760: 29 3b 0a 20 20 20 20 65 78 69 74 28 30 29 3b 0a  );.    exit(0);.
8770: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61 6c    }..  /* Get al
8780: 6c 20 74 68 65 20 6f 70 74 69 6f 6e 61 6c 20 66  l the optional f
8790: 69 65 6c 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  ields that follo
87a0: 77 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e 65  w the first line
87b0: 2e 0a 20 20 2a 2f 0a 20 20 7a 43 6f 6f 6b 69 65  ..  */.  zCookie
87c0: 20 3d 20 30 3b 0a 20 20 7a 41 75 74 68 54 79 70   = 0;.  zAuthTyp
87d0: 65 20 3d 20 30 3b 0a 20 20 7a 52 65 6d 6f 74 65  e = 0;.  zRemote
87e0: 55 73 65 72 20 3d 20 30 3b 0a 20 20 7a 52 65 66  User = 0;.  zRef
87f0: 65 72 65 72 20 3d 20 30 3b 0a 20 20 77 68 69 6c  erer = 0;.  whil
8800: 65 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 73  e( fgets(zLine,s
8810: 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 73 74 64  izeof(zLine),std
8820: 69 6e 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20  in) ){.    char 
8830: 2a 7a 46 69 65 6c 64 4e 61 6d 65 3b 0a 20 20 20  *zFieldName;.   
8840: 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 0a 20 20   char *zVal;..  
8850: 20 20 6e 49 6e 20 2b 3d 20 73 74 72 6c 65 6e 28    nIn += strlen(
8860: 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 7a 46 69 65  zLine);.    zFie
8870: 6c 64 4e 61 6d 65 20 3d 20 47 65 74 46 69 72 73  ldName = GetFirs
8880: 74 45 6c 65 6d 65 6e 74 28 7a 4c 69 6e 65 2c 26  tElement(zLine,&
8890: 7a 56 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a  zVal);.    if( z
88a0: 46 69 65 6c 64 4e 61 6d 65 3d 3d 30 20 7c 7c 20  FieldName==0 || 
88b0: 2a 7a 46 69 65 6c 64 4e 61 6d 65 3d 3d 30 20 29  *zFieldName==0 )
88c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 52 65 6d 6f   break;.    Remo
88d0: 76 65 4e 65 77 6c 69 6e 65 28 7a 56 61 6c 29 3b  veNewline(zVal);
88e0: 0a 20 20 20 20 69 66 28 20 73 74 72 63 61 73 65  .    if( strcase
88f0: 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22  cmp(zFieldName,"
8900: 55 73 65 72 2d 41 67 65 6e 74 3a 22 29 3d 3d 30  User-Agent:")==0
8910: 20 29 7b 0a 20 20 20 20 20 20 7a 41 67 65 6e 74   ){.      zAgent
8920: 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b   = StrDup(zVal);
8930: 0a 20 20 20 20 20 20 46 69 78 75 70 55 73 65 72  .      FixupUser
8940: 41 67 65 6e 74 28 29 3b 0a 20 20 20 20 7d 65 6c  Agent();.    }el
8950: 73 65 20 69 66 28 20 73 74 72 63 61 73 65 63 6d  se if( strcasecm
8960: 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 41 63  p(zFieldName,"Ac
8970: 63 65 70 74 3a 22 29 3d 3d 30 20 29 7b 0a 20 20  cept:")==0 ){.  
8980: 20 20 20 20 7a 41 63 63 65 70 74 20 3d 20 53 74      zAccept = St
8990: 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20  rDup(zVal);.    
89a0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 61 73  }else if( strcas
89b0: 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c  ecmp(zFieldName,
89c0: 22 43 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74 68 3a  "Content-length:
89d0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  ")==0 ){.      z
89e0: 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 20 3d 20  ContentLength = 
89f0: 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20  StrDup(zVal);.  
8a00: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
8a10: 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d  asecmp(zFieldNam
8a20: 65 2c 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a  e,"Content-type:
8a30: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  ")==0 ){.      z
8a40: 43 6f 6e 74 65 6e 74 54 79 70 65 20 3d 20 53 74  ContentType = St
8a50: 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20  rDup(zVal);.    
8a60: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 61 73  }else if( strcas
8a70: 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c  ecmp(zFieldName,
8a80: 22 52 65 66 65 72 65 72 3a 22 29 3d 3d 30 20 29  "Referer:")==0 )
8a90: 7b 0a 20 20 20 20 20 20 7a 52 65 66 65 72 65 72  {.      zReferer
8aa0: 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b   = StrDup(zVal);
8ab0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
8ac0: 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64  trcasecmp(zField
8ad0: 4e 61 6d 65 2c 22 43 6f 6f 6b 69 65 3a 22 29 3d  Name,"Cookie:")=
8ae0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6f  =0 ){.      zCoo
8af0: 6b 69 65 20 3d 20 53 74 72 41 70 70 65 6e 64 28  kie = StrAppend(
8b00: 7a 43 6f 6f 6b 69 65 2c 22 3b 20 22 2c 7a 56 61  zCookie,"; ",zVa
8b10: 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  l);.    }else if
8b20: 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69  ( strcasecmp(zFi
8b30: 65 6c 64 4e 61 6d 65 2c 22 43 6f 6e 6e 65 63 74  eldName,"Connect
8b40: 69 6f 6e 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ion:")==0 ){.   
8b50: 20 20 20 69 66 28 20 73 74 72 63 61 73 65 63 6d     if( strcasecm
8b60: 70 28 7a 56 61 6c 2c 22 63 6c 6f 73 65 22 29 3d  p(zVal,"close")=
8b70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c  =0 ){.        cl
8b80: 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20  oseConnection = 
8b90: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
8ba0: 66 28 20 21 66 6f 72 63 65 43 6c 6f 73 65 20 26  f( !forceClose &
8bb0: 26 20 73 74 72 63 61 73 65 63 6d 70 28 7a 56 61  & strcasecmp(zVa
8bc0: 6c 2c 20 22 6b 65 65 70 2d 61 6c 69 76 65 22 29  l, "keep-alive")
8bd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
8be0: 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d  loseConnection =
8bf0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
8c00: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 61 73  }else if( strcas
8c10: 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c  ecmp(zFieldName,
8c20: 22 48 6f 73 74 3a 22 29 3d 3d 30 20 29 7b 0a 20  "Host:")==0 ){. 
8c30: 20 20 20 20 20 69 6e 74 20 69 6e 53 71 75 61 72       int inSquar
8c40: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61  e = 0;.      cha
8c50: 72 20 63 3b 0a 20 20 20 20 20 20 7a 48 74 74 70  r c;.      zHttp
8c60: 48 6f 73 74 20 3d 20 53 74 72 44 75 70 28 7a 56  Host = StrDup(zV
8c70: 61 6c 29 3b 0a 20 20 20 20 20 20 7a 53 65 72 76  al);.      zServ
8c80: 65 72 50 6f 72 74 20 3d 20 7a 53 65 72 76 65 72  erPort = zServer
8c90: 4e 61 6d 65 20 3d 20 53 74 72 44 75 70 28 7a 48  Name = StrDup(zH
8ca0: 74 74 70 48 6f 73 74 29 3b 0a 20 20 20 20 20 20  ttpHost);.      
8cb0: 77 68 69 6c 65 28 20 7a 53 65 72 76 65 72 50 6f  while( zServerPo
8cc0: 72 74 20 26 26 20 28 63 20 3d 20 2a 7a 53 65 72  rt && (c = *zSer
8cd0: 76 65 72 50 6f 72 74 29 21 3d 30 0a 20 20 20 20  verPort)!=0.    
8ce0: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 63 21            && (c!
8cf0: 3d 27 3a 27 20 7c 7c 20 69 6e 53 71 75 61 72 65  =':' || inSquare
8d00: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
8d10: 20 63 3d 3d 27 5b 27 20 29 20 69 6e 53 71 75 61   c=='[' ) inSqua
8d20: 72 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  re = 1;.        
8d30: 69 66 28 20 63 3d 3d 27 5d 27 20 29 20 69 6e 53  if( c==']' ) inS
8d40: 71 75 61 72 65 20 3d 20 30 3b 0a 20 20 20 20 20  quare = 0;.     
8d50: 20 20 20 7a 53 65 72 76 65 72 50 6f 72 74 2b 2b     zServerPort++
8d60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8d70: 69 66 28 20 7a 53 65 72 76 65 72 50 6f 72 74 20  if( zServerPort 
8d80: 26 26 20 2a 7a 53 65 72 76 65 72 50 6f 72 74 20  && *zServerPort 
8d90: 29 7b 0a 20 20 20 20 20 20 20 20 2a 7a 53 65 72  ){.        *zSer
8da0: 76 65 72 50 6f 72 74 20 3d 20 30 3b 0a 20 20 20  verPort = 0;.   
8db0: 20 20 20 20 20 7a 53 65 72 76 65 72 50 6f 72 74       zServerPort
8dc0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
8dd0: 20 20 69 66 28 20 7a 52 65 61 6c 50 6f 72 74 20    if( zRealPort 
8de0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 65 72 76  ){.        zServ
8df0: 65 72 50 6f 72 74 20 3d 20 53 74 72 44 75 70 28  erPort = StrDup(
8e00: 7a 52 65 61 6c 50 6f 72 74 29 3b 0a 20 20 20 20  zRealPort);.    
8e10: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
8e20: 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69  ( strcasecmp(zFi
8e30: 65 6c 64 4e 61 6d 65 2c 22 41 75 74 68 6f 72 69  eldName,"Authori
8e40: 7a 61 74 69 6f 6e 3a 22 29 3d 3d 30 20 29 7b 0a  zation:")==0 ){.
8e50: 20 20 20 20 20 20 7a 41 75 74 68 54 79 70 65 20        zAuthType 
8e60: 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e  = GetFirstElemen
8e70: 74 28 53 74 72 44 75 70 28 7a 56 61 6c 29 2c 20  t(StrDup(zVal), 
8e80: 26 7a 41 75 74 68 41 72 67 29 3b 0a 20 20 20 20  &zAuthArg);.    
8e90: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 69 73 61  }.  }..  /* Disa
8ea0: 6c 6c 6f 77 20 72 65 66 65 72 72 69 6e 67 20 66  llow referring f
8eb0: 72 6f 6d 20 63 65 72 74 61 69 6e 20 73 65 72 76  rom certain serv
8ec0: 65 72 73 20 2a 2f 0a 23 69 66 20 30 0a 20 20 69  ers */.#if 0.  i
8ed0: 66 28 20 7a 52 65 66 65 72 65 72 20 29 7b 0a 20  f( zReferer ){. 
8ee0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
8ef0: 63 68 61 72 20 2a 61 7a 44 69 73 61 6c 6c 6f 77  char *azDisallow
8f00: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 22 73 6b  [] = {.      "sk
8f10: 69 64 72 6f 77 63 72 61 63 6b 2e 63 6f 6d 22 2c  idrowcrack.com",
8f20: 0a 20 20 20 20 20 20 22 68 6f 73 68 69 79 75 75  .      "hoshiyuu
8f30: 67 69 2e 74 69 73 74 6f 72 79 2e 63 6f 6d 22 2c  gi.tistory.com",
8f40: 0a 20 20 20 20 20 20 22 73 6b 69 64 72 6f 77 67  .      "skidrowg
8f50: 61 6d 65 73 2e 6e 65 74 22 2c 0a 20 20 20 20 7d  ames.net",.    }
8f60: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
8f70: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
8f80: 6f 66 28 61 7a 44 69 73 61 6c 6c 6f 77 29 2f 73  of(azDisallow)/s
8f90: 69 7a 65 6f 66 28 61 7a 44 69 73 61 6c 6c 6f 77  izeof(azDisallow
8fa0: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
8fb0: 20 20 69 66 28 20 73 74 72 73 74 72 28 7a 52 65    if( strstr(zRe
8fc0: 66 65 72 65 72 2c 20 61 7a 44 69 73 61 6c 6c 6f  ferer, azDisallo
8fd0: 77 5b 69 5d 29 21 3d 30 20 29 20 4e 6f 74 46 6f  w[i])!=0 ) NotFo
8fe0: 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  und(__LINE__);. 
8ff0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
9000: 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 6e 20 65 78  .  /* Make an ex
9010: 74 72 61 20 65 66 66 6f 72 74 20 74 6f 20 67 65  tra effort to ge
9020: 74 20 61 20 76 61 6c 69 64 20 73 65 72 76 65 72  t a valid server
9030: 20 6e 61 6d 65 20 61 6e 64 20 70 6f 72 74 20 6e   name and port n
9040: 75 6d 62 65 72 2e 0a 20 20 2a 2a 20 4f 6e 6c 79  umber..  ** Only
9050: 20 4e 65 74 73 63 61 70 65 20 70 72 6f 76 69 64   Netscape provid
9060: 65 73 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74  es this informat
9070: 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 62 72 6f  ion.  If the bro
9080: 77 73 65 72 20 69 73 0a 20 20 2a 2a 20 49 6e 74  wser is.  ** Int
9090: 65 72 6e 65 74 20 45 78 70 6c 6f 72 65 72 2c 20  ernet Explorer, 
90a0: 74 68 65 6e 20 77 65 20 68 61 76 65 20 74 6f 20  then we have to 
90b0: 66 69 6e 64 20 6f 75 74 20 74 68 65 20 69 6e 66  find out the inf
90c0: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 0a 20 20 2a  ormation for.  *
90d0: 2a 20 6f 75 72 73 65 6c 76 65 73 2e 0a 20 20 2a  * ourselves..  *
90e0: 2f 0a 20 20 69 66 28 20 7a 53 65 72 76 65 72 4e  /.  if( zServerN
90f0: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53  ame==0 ){.    zS
9100: 65 72 76 65 72 4e 61 6d 65 20 3d 20 53 61 66 65  erverName = Safe
9110: 4d 61 6c 6c 6f 63 28 20 31 30 30 20 29 3b 0a 20  Malloc( 100 );. 
9120: 20 20 20 67 65 74 68 6f 73 74 6e 61 6d 65 28 7a     gethostname(z
9130: 53 65 72 76 65 72 4e 61 6d 65 2c 31 30 30 29 3b  ServerName,100);
9140: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 53 65 72 76  .  }.  if( zServ
9150: 65 72 50 6f 72 74 3d 3d 30 20 7c 7c 20 2a 7a 53  erPort==0 || *zS
9160: 65 72 76 65 72 50 6f 72 74 3d 3d 30 20 29 7b 0a  erverPort==0 ){.
9170: 20 20 20 20 7a 53 65 72 76 65 72 50 6f 72 74 20      zServerPort 
9180: 3d 20 44 45 46 41 55 4c 54 5f 50 4f 52 54 3b 0a  = DEFAULT_PORT;.
9190: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65    }..  /* Remove
91a0: 20 74 68 65 20 71 75 65 72 79 20 73 74 72 69 6e   the query strin
91b0: 67 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f  g from the end o
91c0: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
91d0: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  file..  */.  for
91e0: 28 7a 3d 7a 53 63 72 69 70 74 3b 20 2a 7a 20 26  (z=zScript; *z &
91f0: 26 20 2a 7a 21 3d 27 3f 27 3b 20 7a 2b 2b 29 7b  & *z!='?'; z++){
9200: 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 3f 27 20  }.  if( *z=='?' 
9210: 29 7b 0a 20 20 20 20 7a 51 75 65 72 79 53 75 66  ){.    zQuerySuf
9220: 66 69 78 20 3d 20 53 74 72 44 75 70 28 7a 29 3b  fix = StrDup(z);
9230: 0a 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 7d  .    *z = 0;.  }
9240: 65 6c 73 65 7b 0a 20 20 20 20 7a 51 75 65 72 79  else{.    zQuery
9250: 53 75 66 66 69 78 20 3d 20 22 22 3b 0a 20 20 7d  Suffix = "";.  }
9260: 0a 20 20 7a 51 75 65 72 79 53 74 72 69 6e 67 20  .  zQueryString 
9270: 3d 20 2a 7a 51 75 65 72 79 53 75 66 66 69 78 20  = *zQuerySuffix 
9280: 3f 20 26 7a 51 75 65 72 79 53 75 66 66 69 78 5b  ? &zQuerySuffix[
9290: 31 5d 20 3a 20 7a 51 75 65 72 79 53 75 66 66 69  1] : zQuerySuffi
92a0: 78 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  x;..  /* Create 
92b0: 61 20 66 69 6c 65 20 74 6f 20 68 6f 6c 64 20 74  a file to hold t
92c0: 68 65 20 50 4f 53 54 20 71 75 65 72 79 20 64 61  he POST query da
92d0: 74 61 2c 20 69 66 20 61 6e 79 2e 20 20 57 65 20  ta, if any.  We 
92e0: 68 61 76 65 20 74 6f 0a 20 20 2a 2a 20 64 6f 20  have to.  ** do 
92f0: 69 74 20 74 68 69 73 20 77 61 79 2e 20 20 57 65  it this way.  We
9300: 20 63 61 6e 27 74 20 6a 75 73 74 20 70 61 73 73   can't just pass
9310: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
9320: 70 74 6f 72 20 64 6f 77 6e 20 74 6f 0a 20 20 2a  ptor down to.  *
9330: 2a 20 74 68 65 20 63 68 69 6c 64 20 70 72 6f 63  * the child proc
9340: 65 73 73 20 62 65 63 61 75 73 65 20 74 68 65 20  ess because the 
9350: 66 67 65 74 73 28 29 20 66 75 6e 63 74 69 6f 6e  fgets() function
9360: 20 6d 61 79 20 68 61 76 65 20 61 6c 72 65 61 64   may have alread
9370: 79 0a 20 20 2a 2a 20 72 65 61 64 20 70 61 72 74  y.  ** read part
9380: 20 6f 66 20 74 68 65 20 50 4f 53 54 20 64 61 74   of the POST dat
9390: 61 20 69 6e 74 6f 20 69 74 73 20 69 6e 74 65 72  a into its inter
93a0: 6e 61 6c 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f  nal buffer..  */
93b0: 0a 20 20 69 66 28 20 7a 4d 65 74 68 6f 64 5b 30  .  if( zMethod[0
93c0: 5d 3d 3d 27 50 27 20 26 26 20 7a 43 6f 6e 74 65  ]=='P' && zConte
93d0: 6e 74 4c 65 6e 67 74 68 21 3d 30 20 29 7b 0a 20  ntLength!=0 ){. 
93e0: 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 61 74 6f     int len = ato
93f0: 69 28 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68  i(zContentLength
9400: 29 3b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74  );.    FILE *out
9410: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 42 75 66  ;.    char *zBuf
9420: 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20  ;.    int n;..  
9430: 20 20 69 66 28 20 6c 65 6e 3e 4d 41 58 5f 43 4f    if( len>MAX_CO
9440: 4e 54 45 4e 54 5f 4c 45 4e 47 54 48 20 29 7b 0a  NTENT_LENGTH ){.
9450: 20 20 20 20 20 20 53 74 61 72 74 52 65 73 70 6f        StartRespo
9460: 6e 73 65 28 22 35 30 30 20 52 65 71 75 65 73 74  nse("500 Request
9470: 20 74 6f 6f 20 6c 61 72 67 65 22 29 3b 0a 20 20   too large");.  
9480: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
9490: 74 66 28 0a 20 20 20 20 20 20 20 20 22 43 6f 6e  tf(.        "Con
94a0: 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f  tent-type: text/
94b0: 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 20  plain\r\n".     
94c0: 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 20 20     "\r\n".      
94d0: 20 20 22 54 6f 6f 20 6d 75 63 68 20 50 4f 53 54    "Too much POST
94e0: 20 64 61 74 61 5c 6e 22 0a 20 20 20 20 20 20 29   data\n".      )
94f0: 3b 0a 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45  ;.      MakeLogE
9500: 6e 74 72 79 28 30 29 3b 0a 20 20 20 20 20 20 65  ntry(0);.      e
9510: 78 69 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20  xit(0);.    }.  
9520: 20 20 73 70 72 69 6e 74 66 28 7a 54 6d 70 4e 61    sprintf(zTmpNa
9530: 6d 42 75 66 2c 20 22 2f 74 6d 70 2f 2d 70 6f 73  mBuf, "/tmp/-pos
9540: 74 2d 64 61 74 61 2d 58 58 58 58 58 58 22 29 3b  t-data-XXXXXX");
9550: 0a 20 20 20 20 7a 54 6d 70 4e 61 6d 20 3d 20 7a  .    zTmpNam = z
9560: 54 6d 70 4e 61 6d 42 75 66 3b 0a 20 20 20 20 6d  TmpNamBuf;.    m
9570: 6b 73 74 65 6d 70 28 7a 54 6d 70 4e 61 6d 29 3b  kstemp(zTmpNam);
9580: 0a 20 20 20 20 6f 75 74 20 3d 20 66 6f 70 65 6e  .    out = fopen
9590: 28 7a 54 6d 70 4e 61 6d 2c 22 77 22 29 3b 0a 20  (zTmpNam,"w");. 
95a0: 20 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b     if( out==0 ){
95b0: 0a 20 20 20 20 20 20 53 74 61 72 74 52 65 73 70  .      StartResp
95c0: 6f 6e 73 65 28 22 35 30 30 20 43 61 6e 6e 6f 74  onse("500 Cannot
95d0: 20 63 72 65 61 74 65 20 2f 74 6d 70 20 66 69 6c   create /tmp fil
95e0: 65 22 29 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20  e");.      nOut 
95f0: 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20  += printf(.     
9600: 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65     "Content-type
9610: 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e  : text/plain\r\n
9620: 22 0a 20 20 20 20 20 20 20 20 22 5c 72 5c 6e 22  ".        "\r\n"
9630: 0a 20 20 20 20 20 20 20 20 22 43 6f 75 6c 64 20  .        "Could 
9640: 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20  not open \"%s\" 
9650: 66 6f 72 20 77 72 69 74 69 6e 67 5c 6e 22 2c 20  for writing\n", 
9660: 7a 54 6d 70 4e 61 6d 0a 20 20 20 20 20 20 29 3b  zTmpNam.      );
9670: 0a 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e  .      MakeLogEn
9680: 74 72 79 28 30 29 3b 0a 20 20 20 20 20 20 65 78  try(0);.      ex
9690: 69 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  it(0);.    }.   
96a0: 20 7a 42 75 66 20 3d 20 53 61 66 65 4d 61 6c 6c   zBuf = SafeMall
96b0: 6f 63 28 20 6c 65 6e 20 29 3b 0a 20 20 20 20 69  oc( len );.    i
96c0: 66 28 20 75 73 65 54 69 6d 65 6f 75 74 20 29 20  f( useTimeout ) 
96d0: 61 6c 61 72 6d 28 31 35 20 2b 20 6c 65 6e 2f 32  alarm(15 + len/2
96e0: 30 30 30 29 3b 0a 20 20 20 20 6e 20 3d 20 66 72  000);.    n = fr
96f0: 65 61 64 28 7a 42 75 66 2c 31 2c 6c 65 6e 2c 73  ead(zBuf,1,len,s
9700: 74 64 69 6e 29 3b 0a 20 20 20 20 6e 49 6e 20 2b  tdin);.    nIn +
9710: 3d 20 6e 3b 0a 20 20 20 20 66 77 72 69 74 65 28  = n;.    fwrite(
9720: 7a 42 75 66 2c 31 2c 6e 2c 6f 75 74 29 3b 0a 20  zBuf,1,n,out);. 
9730: 20 20 20 66 72 65 65 28 7a 42 75 66 29 3b 0a 20     free(zBuf);. 
9740: 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a     fclose(out);.
9750: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
9760: 75 72 65 20 74 68 65 20 72 75 6e 6e 69 6e 67 20  ure the running 
9770: 74 69 6d 65 20 69 73 20 6e 6f 74 20 74 6f 6f 20  time is not too 
9780: 67 72 65 61 74 20 2a 2f 0a 20 20 69 66 28 20 75  great */.  if( u
9790: 73 65 54 69 6d 65 6f 75 74 20 29 20 61 6c 61 72  seTimeout ) alar
97a0: 6d 28 31 30 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  m(10);..  /* Con
97b0: 76 65 72 74 20 61 6c 6c 20 75 6e 75 73 75 61 6c  vert all unusual
97c0: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
97d0: 68 65 20 73 63 72 69 70 74 20 6e 61 6d 65 20 69  he script name i
97e0: 6e 74 6f 20 22 5f 22 2e 0a 20 20 2a 2a 0a 20 20  nto "_"..  **.  
97f0: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 64 65 66  ** This is a def
9800: 65 6e 73 65 20 61 67 61 69 6e 73 74 20 76 61 72  ense against var
9810: 69 6f 75 73 20 61 74 74 61 63 6b 73 2c 20 58 53  ious attacks, XS
9820: 53 20 61 74 74 61 63 6b 73 20 69 6e 20 70 61 72  S attacks in par
9830: 74 69 63 75 6c 61 72 2e 0a 20 20 2a 2f 0a 20 20  ticular..  */.  
9840: 66 6f 72 28 7a 3d 7a 53 63 72 69 70 74 3b 20 2a  for(z=zScript; *
9850: 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 75 6e 73  z; z++){.    uns
9860: 69 67 6e 65 64 20 63 68 61 72 20 63 20 3d 20 2a  igned char c = *
9870: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
9880: 7a 3b 0a 20 20 20 20 69 66 28 20 28 63 26 30 78  z;.    if( (c&0x
9890: 38 30 29 21 3d 30 20 7c 7c 20 21 61 6c 6c 6f 77  80)!=0 || !allow
98a0: 65 64 49 6e 4e 61 6d 65 5b 63 5d 20 29 7b 0a 20  edInName[c] ){. 
98b0: 20 20 20 20 20 2a 7a 20 3d 20 27 5f 27 3b 0a 20       *z = '_';. 
98c0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20       if( c=='%' 
98d0: 26 26 20 7a 5b 31 5d 21 3d 30 20 26 26 20 7a 5b  && z[1]!=0 && z[
98e0: 32 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  2]!=0 ){.       
98f0: 20 66 6f 72 28 69 3d 33 3b 20 28 7a 5b 69 2d 32   for(i=3; (z[i-2
9900: 5d 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b  ] = z[i])!=0; i+
9910: 2b 29 7b 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20  +){}.      }.   
9920: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e   }.  }..  /* Don
9930: 27 74 20 61 6c 6c 6f 77 20 22 2f 2e 22 20 6f 72  't allow "/." or
9940: 20 22 2f 2d 22 20 74 6f 20 74 6f 20 6f 63 63 75   "/-" to to occu
9950: 72 20 61 6e 79 77 68 65 72 65 20 69 6e 20 74 68  r anywhere in th
9960: 65 20 65 6e 74 69 74 79 20 6e 61 6d 65 2e 0a 20  e entity name.. 
9970: 20 2a 2a 20 54 68 69 73 20 70 72 65 76 65 6e 74   ** This prevent
9980: 73 20 61 74 74 61 63 6b 73 20 69 6e 76 6f 6c 76  s attacks involv
9990: 69 6e 67 20 22 2e 2e 22 20 61 6e 64 20 61 6c 73  ing ".." and als
99a0: 6f 20 61 6c 6c 6f 77 73 20 75 73 20 74 6f 20 63  o allows us to c
99b0: 72 65 61 74 65 0a 20 20 2a 2a 20 66 69 6c 65 73  reate.  ** files
99c0: 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73   and directories
99d0: 20 77 68 6f 73 65 20 6e 61 6d 65 73 20 62 65 67   whose names beg
99e0: 69 6e 20 77 69 74 68 20 22 2d 22 20 77 68 69 63  in with "-" whic
99f0: 68 20 61 72 65 20 69 6e 76 69 73 69 62 6c 65 0a  h are invisible.
9a00: 20 20 2a 2a 20 74 6f 20 74 68 65 20 77 65 62 73    ** to the webs
9a10: 65 72 76 65 72 2e 0a 20 20 2a 2f 0a 20 20 66 6f  erver..  */.  fo
9a20: 72 28 7a 3d 7a 53 63 72 69 70 74 3b 20 2a 7a 3b  r(z=zScript; *z;
9a30: 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a   z++){.    if( *
9a40: 7a 3d 3d 27 2f 27 20 26 26 20 28 7a 5b 31 5d 3d  z=='/' && (z[1]=
9a50: 3d 27 2e 27 20 7c 7c 20 7a 5b 31 5d 3d 3d 27 2d  ='.' || z[1]=='-
9a60: 27 29 20 29 7b 0a 20 20 20 20 20 20 20 4e 6f 74  ') ){.       Not
9a70: 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b  Found(__LINE__);
9a80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9a90: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 61 74   Figure out what
9aa0: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
9ab0: 20 66 69 6c 65 73 79 73 74 65 6d 20 73 68 6f 75   filesystem shou
9ac0: 6c 64 20 62 65 2e 20 20 49 66 20 74 68 65 0a 20  ld be.  If the. 
9ad0: 20 2a 2a 20 48 54 54 50 5f 48 4f 53 54 20 70 61   ** HTTP_HOST pa
9ae0: 72 61 6d 65 74 65 72 20 65 78 69 73 74 73 20 28  rameter exists (
9af0: 73 74 6f 72 65 64 20 69 6e 20 7a 48 74 74 70 48  stored in zHttpH
9b00: 6f 73 74 29 20 74 68 65 6e 20 72 65 6d 6f 76 65  ost) then remove
9b10: 20 74 68 65 0a 20 20 2a 2a 20 70 6f 72 74 20 6e   the.  ** port n
9b20: 75 6d 62 65 72 20 66 72 6f 6d 20 74 68 65 20 65  umber from the e
9b30: 6e 64 20 28 69 66 20 61 6e 79 29 2c 20 63 6f 6e  nd (if any), con
9b40: 76 65 72 74 20 61 6c 6c 20 63 68 61 72 61 63 74  vert all charact
9b50: 65 72 73 20 74 6f 20 6c 6f 77 65 72 0a 20 20 2a  ers to lower.  *
9b60: 2a 20 63 61 73 65 2c 20 61 6e 64 20 63 6f 6e 76  * case, and conv
9b70: 65 72 74 20 61 6c 6c 20 22 2e 22 20 74 6f 20 22  ert all "." to "
9b80: 5f 22 2e 20 20 54 68 65 6e 20 74 72 79 20 74 6f  _".  Then try to
9b90: 20 66 69 6e 64 20 61 20 64 69 72 65 63 74 6f 72   find a director
9ba0: 79 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 61 74  y.  ** with that
9bb0: 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 65 78   name and the ex
9bc0: 74 65 6e 73 69 6f 6e 20 2e 77 65 62 73 69 74 65  tension .website
9bd0: 2e 20 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c  .  If not found,
9be0: 20 6c 6f 6f 6b 0a 20 20 2a 2a 20 66 6f 72 20 22   look.  ** for "
9bf0: 64 65 66 61 75 6c 74 2e 77 65 62 73 69 74 65 22  default.website"
9c00: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 53 63  ..  */.  if( zSc
9c10: 72 69 70 74 5b 30 5d 21 3d 27 2f 27 20 29 20 4e  ript[0]!='/' ) N
9c20: 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f  otFound(__LINE__
9c30: 29 3b 0a 20 20 69 66 28 20 73 74 72 6c 65 6e 28  );.  if( strlen(
9c40: 7a 52 6f 6f 74 29 2b 34 30 20 3e 3d 20 73 69 7a  zRoot)+40 >= siz
9c50: 65 6f 66 28 7a 4c 69 6e 65 29 20 29 20 4e 6f 74  eof(zLine) ) Not
9c60: 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b  Found(__LINE__);
9c70: 0a 20 20 69 66 28 20 7a 48 74 74 70 48 6f 73 74  .  if( zHttpHost
9c80: 3d 3d 30 20 7c 7c 20 7a 48 74 74 70 48 6f 73 74  ==0 || zHttpHost
9c90: 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 4e 6f  [0]==0 ){.    No
9ca0: 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29  tFound(__LINE__)
9cb0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
9cc0: 72 6c 65 6e 28 7a 48 74 74 70 48 6f 73 74 29 2b  rlen(zHttpHost)+
9cd0: 73 74 72 6c 65 6e 28 7a 52 6f 6f 74 29 2b 31 30  strlen(zRoot)+10
9ce0: 20 3e 3d 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65   >= sizeof(zLine
9cf0: 29 20 29 7b 0a 20 20 20 20 4e 6f 74 46 6f 75 6e  ) ){.    NotFoun
9d00: 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d  d(__LINE__);.  }
9d10: 65 6c 73 65 7b 0a 20 20 20 20 73 70 72 69 6e 74  else{.    sprint
9d20: 66 28 7a 4c 69 6e 65 2c 20 22 25 73 2f 25 73 22  f(zLine, "%s/%s"
9d30: 2c 20 7a 52 6f 6f 74 2c 20 7a 48 74 74 70 48 6f  , zRoot, zHttpHo
9d40: 73 74 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 73  st);.    for(i=s
9d50: 74 72 6c 65 6e 28 7a 52 6f 6f 74 29 2b 31 3b 20  trlen(zRoot)+1; 
9d60: 7a 4c 69 6e 65 5b 69 5d 20 26 26 20 7a 4c 69 6e  zLine[i] && zLin
9d70: 65 5b 69 5d 21 3d 27 3a 27 3b 20 69 2b 2b 29 7b  e[i]!=':'; i++){
9d80: 0a 20 20 20 20 20 20 69 6e 74 20 63 20 3d 20 7a  .      int c = z
9d90: 4c 69 6e 65 5b 69 5d 3b 0a 20 20 20 20 20 20 69  Line[i];.      i
9da0: 66 28 20 21 69 73 61 6c 6e 75 6d 28 63 29 20 29  f( !isalnum(c) )
9db0: 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b  {.        zLine[
9dc0: 69 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20  i] = '_';.      
9dd0: 7d 65 6c 73 65 20 69 66 28 20 69 73 75 70 70 65  }else if( isuppe
9de0: 72 28 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  r(c) ){.        
9df0: 7a 4c 69 6e 65 5b 69 5d 20 3d 20 74 6f 6c 6f 77  zLine[i] = tolow
9e00: 65 72 28 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  er(c);.      }. 
9e10: 20 20 20 7d 0a 20 20 20 20 73 74 72 63 70 79 28     }.    strcpy(
9e20: 26 7a 4c 69 6e 65 5b 69 5d 2c 20 22 2e 77 65 62  &zLine[i], ".web
9e30: 73 69 74 65 22 29 3b 0a 20 20 7d 0a 20 20 69 66  site");.  }.  if
9e40: 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74  ( stat(zLine,&st
9e50: 61 74 62 75 66 29 20 7c 7c 20 21 53 5f 49 53 44  atbuf) || !S_ISD
9e60: 49 52 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f  IR(statbuf.st_mo
9e70: 64 65 29 20 29 7b 0a 20 20 20 20 73 70 72 69 6e  de) ){.    sprin
9e80: 74 66 28 7a 4c 69 6e 65 2c 20 22 25 73 2f 64 65  tf(zLine, "%s/de
9e90: 66 61 75 6c 74 2e 77 65 62 73 69 74 65 22 2c 20  fault.website", 
9ea0: 7a 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20  zRoot);.    if( 
9eb0: 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74  stat(zLine,&stat
9ec0: 62 75 66 29 20 7c 7c 20 21 53 5f 49 53 44 49 52  buf) || !S_ISDIR
9ed0: 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65  (statbuf.st_mode
9ee0: 29 20 29 7b 0a 20 20 20 20 20 20 4e 6f 74 46 6f  ) ){.      NotFo
9ef0: 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  und(__LINE__);. 
9f00: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 7a 48     }.  }.  .  zH
9f10: 6f 6d 65 20 3d 20 53 74 72 44 75 70 28 7a 4c 69  ome = StrDup(zLi
9f20: 6e 65 29 3b 0a 0a 20 20 2f 2a 20 43 68 61 6e 67  ne);..  /* Chang
9f30: 65 20 64 69 72 65 63 74 6f 72 69 65 73 20 74 6f  e directories to
9f40: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
9f50: 20 48 54 54 50 20 66 69 6c 65 73 79 73 74 65 6d   HTTP filesystem
9f60: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 64 69  .  */.  if( chdi
9f70: 72 28 7a 48 6f 6d 65 29 21 3d 30 20 29 7b 0a 20  r(zHome)!=0 ){. 
9f80: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30     char zBuf[100
9f90: 30 5d 3b 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74  0];.    Malfunct
9fa0: 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 63  ion(__LINE__, "c
9fb0: 61 6e 6e 6f 74 20 63 68 64 69 72 20 74 6f 20 5b  annot chdir to [
9fc0: 25 73 5d 20 66 72 6f 6d 20 5b 25 73 5d 22 2c 0a  %s] from [%s]",.
9fd0: 20 20 20 20 20 20 20 20 20 7a 48 6f 6d 65 2c 20           zHome, 
9fe0: 67 65 74 63 77 64 28 7a 42 75 66 2c 39 39 39 29  getcwd(zBuf,999)
9ff0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  );.  }..  /* Loc
a000: 61 74 65 20 74 68 65 20 66 69 6c 65 20 69 6e 20  ate the file in 
a010: 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 2e 20  the filesystem. 
a020: 20 57 65 20 6d 69 67 68 74 20 68 61 76 65 20 74   We might have t
a030: 6f 20 61 70 70 65 6e 64 0a 20 20 2a 2a 20 74 68  o append.  ** th
a040: 65 20 6e 61 6d 65 20 22 69 6e 64 65 78 2e 68 74  e name "index.ht
a050: 6d 6c 22 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ml" in order to 
a060: 66 69 6e 64 20 69 74 2e 20 20 41 6e 79 20 65 78  find it.  Any ex
a070: 63 65 73 73 20 70 61 74 68 0a 20 20 2a 2a 20 69  cess path.  ** i
a080: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 70 75  nformation is pu
a090: 74 20 69 6e 74 6f 20 74 68 65 20 7a 50 61 74 68  t into the zPath
a0a0: 49 6e 66 6f 20 76 61 72 69 61 62 6c 65 2e 0a 20  Info variable.. 
a0b0: 20 2a 2f 0a 20 20 7a 4c 69 6e 65 5b 30 5d 20 3d   */.  zLine[0] =
a0c0: 20 27 2e 27 3b 0a 20 20 69 20 3d 20 30 3b 0a 20   '.';.  i = 0;. 
a0d0: 20 77 68 69 6c 65 28 20 7a 53 63 72 69 70 74 5b   while( zScript[
a0e0: 69 5d 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  i] ){.    while(
a0f0: 20 7a 53 63 72 69 70 74 5b 69 5d 20 26 26 20 7a   zScript[i] && z
a100: 53 63 72 69 70 74 5b 69 5d 21 3d 27 2f 27 20 29  Script[i]!='/' )
a110: 7b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 69 2b  {.      zLine[i+
a120: 31 5d 20 3d 20 7a 53 63 72 69 70 74 5b 69 5d 3b  1] = zScript[i];
a130: 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  .      i++;.    
a140: 7d 0a 20 20 20 20 7a 4c 69 6e 65 5b 69 2b 31 5d  }.    zLine[i+1]
a150: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 74   = 0;.    if( st
a160: 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75  at(zLine,&statbu
a170: 66 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  f)!=0 ){.      i
a180: 6e 74 20 73 74 69 6c 6c 53 65 61 72 63 68 69 6e  nt stillSearchin
a190: 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 77 68 69  g = 1;.      whi
a1a0: 6c 65 28 20 73 74 69 6c 6c 53 65 61 72 63 68 69  le( stillSearchi
a1b0: 6e 67 20 26 26 20 69 3e 30 20 29 7b 0a 20 20 20  ng && i>0 ){.   
a1c0: 20 20 20 20 20 77 68 69 6c 65 28 20 69 3e 30 20       while( i>0 
a1d0: 26 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d 27 2f 27  && zLine[i]!='/'
a1e0: 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ i--; }.     
a1f0: 20 20 20 73 74 72 63 70 79 28 26 7a 4c 69 6e 65     strcpy(&zLine
a200: 5b 69 5d 2c 20 22 2f 6e 6f 74 2d 66 6f 75 6e 64  [i], "/not-found
a210: 2e 68 74 6d 6c 22 29 3b 0a 20 20 20 20 20 20 20  .html");.       
a220: 20 69 66 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c   if( stat(zLine,
a230: 26 73 74 61 74 62 75 66 29 3d 3d 30 20 26 26 20  &statbuf)==0 && 
a240: 53 5f 49 53 52 45 47 28 73 74 61 74 62 75 66 2e  S_ISREG(statbuf.
a250: 73 74 5f 6d 6f 64 65 29 0a 20 20 20 20 20 20 20  st_mode).       
a260: 20 20 20 20 20 26 26 20 61 63 63 65 73 73 28 7a       && access(z
a270: 4c 69 6e 65 2c 52 5f 4f 4b 29 3d 3d 30 20 29 7b  Line,R_OK)==0 ){
a280: 0a 20 20 20 20 20 20 20 20 20 20 7a 52 65 61 6c  .          zReal
a290: 53 63 72 69 70 74 20 3d 20 53 74 72 44 75 70 28  Script = StrDup(
a2a0: 26 7a 4c 69 6e 65 5b 31 5d 29 3b 0a 20 20 20 20  &zLine[1]);.    
a2b0: 20 20 20 20 20 20 52 65 64 69 72 65 63 74 28 7a        Redirect(z
a2c0: 52 65 61 6c 53 63 72 69 70 74 2c 20 31 29 3b 0a  RealScript, 1);.
a2d0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
a2e0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
a2f0: 0a 20 20 20 20 20 20 20 20 20 20 69 2d 2d 3b 0a  .          i--;.
a300: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a310: 7d 0a 20 20 20 20 20 20 69 66 28 20 73 74 69 6c  }.      if( stil
a320: 6c 53 65 61 72 63 68 69 6e 67 20 29 20 4e 6f 74  lSearching ) Not
a330: 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b  Found(__LINE__);
a340: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a350: 20 20 7d 0a 20 20 20 20 69 66 28 20 53 5f 49 53    }.    if( S_IS
a360: 52 45 47 28 73 74 61 74 62 75 66 2e 73 74 5f 6d  REG(statbuf.st_m
a370: 6f 64 65 29 20 29 7b 0a 20 20 20 20 20 20 69 66  ode) ){.      if
a380: 28 20 61 63 63 65 73 73 28 7a 4c 69 6e 65 2c 52  ( access(zLine,R
a390: 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20  _OK) ){.        
a3a0: 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f  NotFound(__LINE_
a3b0: 5f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  _);.      }.    
a3c0: 20 20 7a 52 65 61 6c 53 63 72 69 70 74 20 3d 20    zRealScript = 
a3d0: 53 74 72 44 75 70 28 26 7a 4c 69 6e 65 5b 31 5d  StrDup(&zLine[1]
a3e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a3f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 53      }.    if( zS
a400: 63 72 69 70 74 5b 69 5d 3d 3d 30 20 7c 7c 20 7a  cript[i]==0 || z
a410: 53 63 72 69 70 74 5b 69 2b 31 5d 3d 3d 30 20 29  Script[i+1]==0 )
a420: 7b 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 26  {.      strcpy(&
a430: 7a 4c 69 6e 65 5b 69 2b 31 5d 2c 22 2f 69 6e 64  zLine[i+1],"/ind
a440: 65 78 2e 68 74 6d 6c 22 29 3b 0a 20 20 20 20 20  ex.html");.     
a450: 20 69 66 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c   if( stat(zLine,
a460: 26 73 74 61 74 62 75 66 29 21 3d 30 20 7c 7c 20  &statbuf)!=0 || 
a470: 21 53 5f 49 53 52 45 47 28 73 74 61 74 62 75 66  !S_ISREG(statbuf
a480: 2e 73 74 5f 6d 6f 64 65 29 20 0a 20 20 20 20 20  .st_mode) .     
a490: 20 7c 7c 20 61 63 63 65 73 73 28 7a 4c 69 6e 65   || access(zLine
a4a0: 2c 52 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20  ,R_OK) ){.      
a4b0: 20 20 73 74 72 63 70 79 28 26 7a 4c 69 6e 65 5b    strcpy(&zLine[
a4c0: 69 2b 31 5d 2c 22 2f 69 6e 64 65 78 2e 63 67 69  i+1],"/index.cgi
a4d0: 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ");.        if( 
a4e0: 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74  stat(zLine,&stat
a4f0: 62 75 66 29 21 3d 30 20 7c 7c 20 21 53 5f 49 53  buf)!=0 || !S_IS
a500: 52 45 47 28 73 74 61 74 62 75 66 2e 73 74 5f 6d  REG(statbuf.st_m
a510: 6f 64 65 29 20 0a 20 20 20 20 20 20 20 20 7c 7c  ode) .        ||
a520: 20 61 63 63 65 73 73 28 7a 4c 69 6e 65 2c 52 5f   access(zLine,R_
a530: 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OK) ){.         
a540: 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45   NotFound(__LINE
a550: 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  __);.        }. 
a560: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 52 65       }.      zRe
a570: 61 6c 53 63 72 69 70 74 20 3d 20 53 74 72 44 75  alScript = StrDu
a580: 70 28 26 7a 4c 69 6e 65 5b 31 5d 29 3b 0a 20 20  p(&zLine[1]);.  
a590: 20 20 20 20 69 66 28 20 7a 53 63 72 69 70 74 5b      if( zScript[
a5a0: 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  i]==0 ){.       
a5b0: 20 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75 65   /* If the reque
a5c0: 73 74 65 64 20 55 52 4c 20 64 6f 65 73 20 6e 6f  sted URL does no
a5d0: 74 20 65 6e 64 20 77 69 74 68 20 22 2f 22 20 62  t end with "/" b
a5e0: 75 74 20 77 65 20 68 61 64 20 74 6f 0a 20 20 20  ut we had to.   
a5f0: 20 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 22       ** append "
a600: 69 6e 64 65 78 2e 68 74 6d 6c 22 2c 20 74 68 65  index.html", the
a610: 6e 20 61 20 72 65 64 69 72 65 63 74 20 69 73 20  n a redirect is 
a620: 6e 65 63 65 73 73 61 72 79 2e 20 20 4f 74 68 65  necessary.  Othe
a630: 72 77 69 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  rwise.        **
a640: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 65 6c   none of the rel
a650: 61 74 69 76 65 20 55 52 4c 73 20 69 6e 20 74 68  ative URLs in th
a660: 65 20 64 65 6c 69 76 65 72 65 64 20 64 6f 63 75  e delivered docu
a670: 6d 65 6e 74 20 77 69 6c 6c 20 62 65 0a 20 20 20  ment will be.   
a680: 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 2e       ** correct.
a690: 20 2a 2f 0a 20 20 20 20 20 20 20 20 52 65 64 69   */.        Redi
a6a0: 72 65 63 74 28 7a 52 65 61 6c 53 63 72 69 70 74  rect(zRealScript
a6b0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65  , 1);.        re
a6c0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
a6d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
a6e0: 0a 20 20 20 20 7a 4c 69 6e 65 5b 69 2b 31 5d 20  .    zLine[i+1] 
a6f0: 3d 20 7a 53 63 72 69 70 74 5b 69 5d 3b 0a 20 20  = zScript[i];.  
a700: 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 7a 46 69    i++;.  }.  zFi
a710: 6c 65 20 3d 20 53 74 72 44 75 70 28 7a 4c 69 6e  le = StrDup(zLin
a720: 65 29 3b 0a 20 20 7a 50 61 74 68 49 6e 66 6f 20  e);.  zPathInfo 
a730: 3d 20 53 74 72 44 75 70 28 26 7a 53 63 72 69 70  = StrDup(&zScrip
a740: 74 5b 69 5d 29 3b 0a 20 20 6c 65 6e 46 69 6c 65  t[i]);.  lenFile
a750: 20 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29   = strlen(zFile)
a760: 3b 0a 20 20 7a 44 69 72 20 3d 20 53 74 72 44 75  ;.  zDir = StrDu
a770: 70 28 7a 46 69 6c 65 29 3b 0a 20 20 66 6f 72 28  p(zFile);.  for(
a780: 69 3d 73 74 72 6c 65 6e 28 7a 44 69 72 29 2d 31  i=strlen(zDir)-1
a790: 3b 20 69 3e 30 20 26 26 20 7a 44 69 72 5b 69 5d  ; i>0 && zDir[i]
a7a0: 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 3b 0a 20  !='/'; i--){};. 
a7b0: 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20   if( i==0 ){.   
a7c0: 20 20 73 74 72 63 70 79 28 7a 44 69 72 2c 22 2f    strcpy(zDir,"/
a7d0: 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
a7e0: 20 20 7a 44 69 72 5b 69 5d 20 3d 20 30 3b 0a 20    zDir[i] = 0;. 
a7f0: 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   }..  /* Check t
a800: 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 69  o see if there i
a810: 73 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  s an authorizati
a820: 6f 6e 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  on file.  If the
a830: 72 65 20 69 73 2c 0a 20 20 2a 2a 20 70 72 6f 63  re is,.  ** proc
a840: 65 73 73 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73  ess it..  */.  s
a850: 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 25  printf(zLine, "%
a860: 73 2f 2d 61 75 74 68 22 2c 20 7a 44 69 72 29 3b  s/-auth", zDir);
a870: 0a 20 20 69 66 28 20 61 63 63 65 73 73 28 7a 4c  .  if( access(zL
a880: 69 6e 65 2c 52 5f 4f 4b 29 3d 3d 30 20 26 26 20  ine,R_OK)==0 && 
a890: 21 43 68 65 63 6b 42 61 73 69 63 41 75 74 68 6f  !CheckBasicAutho
a8a0: 72 69 7a 61 74 69 6f 6e 28 7a 4c 69 6e 65 29 20  rization(zLine) 
a8b0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
a8c0: 54 61 6b 65 20 61 70 70 72 6f 70 72 69 61 74 65  Take appropriate
a8d0: 20 61 63 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69   action.  */.  i
a8e0: 66 28 20 28 73 74 61 74 62 75 66 2e 73 74 5f 6d  f( (statbuf.st_m
a8f0: 6f 64 65 20 26 20 30 31 30 30 29 3d 3d 30 31 30  ode & 0100)==010
a900: 30 20 26 26 20 61 63 63 65 73 73 28 7a 46 69 6c  0 && access(zFil
a910: 65 2c 58 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20  e,X_OK)==0 ){.  
a920: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
a930: 66 6f 6c 6c 6f 77 69 6e 67 73 20 73 74 61 74 69  followings stati
a940: 63 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  c variables are 
a950: 75 73 65 64 20 74 6f 20 73 65 74 75 70 20 74 68  used to setup th
a960: 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 0a 20 20  e environment.  
a970: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 43 47 49    ** for the CGI
a980: 20 73 63 72 69 70 74 0a 20 20 20 20 2a 2f 0a 20   script.    */. 
a990: 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a     static char *
a9a0: 64 65 66 61 75 6c 74 5f 70 61 74 68 20 3d 20 22  default_path = "
a9b0: 2f 62 69 6e 3a 2f 75 73 72 2f 62 69 6e 22 3b 0a  /bin:/usr/bin";.
a9c0: 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20      static char 
a9d0: 2a 67 61 74 65 77 61 79 5f 69 6e 74 65 72 66 61  *gateway_interfa
a9e0: 63 65 20 3d 20 22 43 47 49 2f 31 2e 30 22 3b 0a  ce = "CGI/1.0";.
a9f0: 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63      static struc
aa00: 74 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  t {.      char *
aa10: 7a 45 6e 76 4e 61 6d 65 3b 0a 20 20 20 20 20 20  zEnvName;.      
aa20: 63 68 61 72 20 2a 2a 70 7a 45 6e 76 56 61 6c 75  char **pzEnvValu
aa30: 65 3b 0a 20 20 20 20 7d 20 63 67 69 65 6e 76 5b  e;.    } cgienv[
aa40: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 41  ] = {.      { "A
aa50: 55 54 48 5f 54 59 50 45 22 2c 20 20 20 20 20 20  UTH_TYPE",      
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 41               &zA
aa70: 75 74 68 54 79 70 65 20 7d 2c 0a 20 20 20 20 20  uthType },.     
aa80: 20 7b 20 22 41 55 54 48 5f 43 4f 4e 54 45 4e 54   { "AUTH_CONTENT
aa90: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
aaa0: 20 20 26 7a 41 75 74 68 41 72 67 20 7d 2c 0a 20    &zAuthArg },. 
aab0: 20 20 20 20 20 7b 20 22 43 4f 4e 54 45 4e 54 5f       { "CONTENT_
aac0: 4c 45 4e 47 54 48 22 2c 20 20 20 20 20 20 20 20  LENGTH",        
aad0: 20 20 20 20 20 20 26 7a 43 6f 6e 74 65 6e 74 4c        &zContentL
aae0: 65 6e 67 74 68 20 7d 2c 0a 20 20 20 20 20 20 7b  ength },.      {
aaf0: 20 22 43 4f 4e 54 45 4e 54 5f 54 59 50 45 22 2c   "CONTENT_TYPE",
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab10: 26 7a 43 6f 6e 74 65 6e 74 54 79 70 65 20 7d 2c  &zContentType },
ab20: 0a 20 20 20 20 20 20 7b 20 22 44 4f 43 55 4d 45  .      { "DOCUME
ab30: 4e 54 5f 52 4f 4f 54 22 2c 20 20 20 20 20 20 20  NT_ROOT",       
ab40: 20 20 20 20 20 20 20 20 26 7a 48 6f 6d 65 20 7d          &zHome }
ab50: 2c 0a 20 20 20 20 20 20 7b 20 22 47 41 54 45 57  ,.      { "GATEW
ab60: 41 59 5f 49 4e 54 45 52 46 41 43 45 22 2c 20 20  AY_INTERFACE",  
ab70: 20 20 20 20 20 20 20 20 20 26 67 61 74 65 77 61           &gatewa
ab80: 79 5f 69 6e 74 65 72 66 61 63 65 20 7d 2c 0a 20  y_interface },. 
ab90: 20 20 20 20 20 7b 20 22 48 54 54 50 5f 41 43 43       { "HTTP_ACC
aba0: 45 50 54 22 2c 20 20 20 20 20 20 20 20 20 20 20  EPT",           
abb0: 20 20 20 20 20 20 26 7a 41 63 63 65 70 74 20 7d        &zAccept }
abc0: 2c 0a 20 20 20 20 20 20 7b 20 22 48 54 54 50 5f  ,.      { "HTTP_
abd0: 43 4f 4f 4b 49 45 22 2c 20 20 20 20 20 20 20 20  COOKIE",        
abe0: 20 20 20 20 20 20 20 20 20 26 7a 43 6f 6f 6b 69           &zCooki
abf0: 65 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 48 54  e },.      { "HT
ac00: 54 50 5f 48 4f 53 54 22 2c 20 20 20 20 20 20 20  TP_HOST",       
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 48 74              &zHt
ac20: 74 70 48 6f 73 74 20 7d 2c 0a 20 20 20 20 20 20  tpHost },.      
ac30: 7b 20 22 48 54 54 50 5f 52 45 46 45 52 45 52 22  { "HTTP_REFERER"
ac40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ac50: 20 26 7a 52 65 66 65 72 65 72 20 7d 2c 0a 20 20   &zReferer },.  
ac60: 20 20 20 20 7b 20 22 48 54 54 50 5f 55 53 45 52      { "HTTP_USER
ac70: 5f 41 47 45 4e 54 22 2c 20 20 20 20 20 20 20 20  _AGENT",        
ac80: 20 20 20 20 20 26 7a 41 67 65 6e 74 20 7d 2c 0a       &zAgent },.
ac90: 20 20 20 20 20 20 7b 20 22 50 41 54 48 22 2c 20        { "PATH", 
aca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acb0: 20 20 20 20 20 20 20 26 64 65 66 61 75 6c 74 5f         &default_
acc0: 70 61 74 68 20 7d 2c 0a 20 20 20 20 20 20 7b 20  path },.      { 
acd0: 22 50 41 54 48 5f 49 4e 46 4f 22 2c 20 20 20 20  "PATH_INFO",    
ace0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
acf0: 7a 50 61 74 68 49 6e 66 6f 20 7d 2c 0a 20 20 20  zPathInfo },.   
ad00: 20 20 20 7b 20 22 51 55 45 52 59 5f 53 54 52 49     { "QUERY_STRI
ad10: 4e 47 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  NG",            
ad20: 20 20 20 20 26 7a 51 75 65 72 79 53 74 72 69 6e      &zQueryStrin
ad30: 67 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 52 45  g },.      { "RE
ad40: 4d 4f 54 45 5f 41 44 44 52 22 2c 20 20 20 20 20  MOTE_ADDR",     
ad50: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 52 65              &zRe
ad60: 6d 6f 74 65 41 64 64 72 20 7d 2c 0a 20 20 20 20  moteAddr },.    
ad70: 20 20 7b 20 22 52 45 51 55 45 53 54 5f 4d 45 54    { "REQUEST_MET
ad80: 48 4f 44 22 2c 20 20 20 20 20 20 20 20 20 20 20  HOD",           
ad90: 20 20 20 26 7a 4d 65 74 68 6f 64 20 7d 2c 0a 20     &zMethod },. 
ada0: 20 20 20 20 20 7b 20 22 52 45 51 55 45 53 54 5f       { "REQUEST_
adb0: 55 52 49 22 2c 20 20 20 20 20 20 20 20 20 20 20  URI",           
adc0: 20 20 20 20 20 20 26 7a 53 63 72 69 70 74 20 7d        &zScript }
add0: 2c 0a 20 20 20 20 20 20 7b 20 22 52 45 4d 4f 54  ,.      { "REMOT
ade0: 45 5f 55 53 45 52 22 2c 20 20 20 20 20 20 20 20  E_USER",        
adf0: 20 20 20 20 20 20 20 20 20 26 7a 52 65 6d 6f 74           &zRemot
ae00: 65 55 73 65 72 20 7d 2c 0a 20 20 20 20 20 20 7b  eUser },.      {
ae10: 20 22 53 43 52 49 50 54 5f 44 49 52 45 43 54 4f   "SCRIPT_DIRECTO
ae20: 52 59 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  RY",            
ae30: 26 7a 44 69 72 20 7d 2c 0a 20 20 20 20 20 20 7b  &zDir },.      {
ae40: 20 22 53 43 52 49 50 54 5f 46 49 4c 45 4e 41 4d   "SCRIPT_FILENAM
ae50: 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  E",             
ae60: 26 7a 46 69 6c 65 20 7d 2c 0a 20 20 20 20 20 20  &zFile },.      
ae70: 7b 20 22 53 43 52 49 50 54 5f 4e 41 4d 45 22 2c  { "SCRIPT_NAME",
ae80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae90: 20 26 7a 52 65 61 6c 53 63 72 69 70 74 20 7d 2c   &zRealScript },
aea0: 0a 20 20 20 20 20 20 7b 20 22 53 45 52 56 45 52  .      { "SERVER
aeb0: 5f 4e 41 4d 45 22 2c 20 20 20 20 20 20 20 20 20  _NAME",         
aec0: 20 20 20 20 20 20 20 20 26 7a 53 65 72 76 65 72          &zServer
aed0: 4e 61 6d 65 20 7d 2c 0a 20 20 20 20 20 20 7b 20  Name },.      { 
aee0: 22 53 45 52 56 45 52 5f 50 4f 52 54 22 2c 20 20  "SERVER_PORT",  
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
af00: 7a 53 65 72 76 65 72 50 6f 72 74 20 7d 2c 0a 20  zServerPort },. 
af10: 20 20 20 20 20 7b 20 22 53 45 52 56 45 52 5f 50       { "SERVER_P
af20: 52 4f 54 4f 43 4f 4c 22 2c 20 20 20 20 20 20 20  ROTOCOL",       
af30: 20 20 20 20 20 20 26 7a 50 72 6f 74 6f 63 6f 6c        &zProtocol
af40: 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63   },.    };.    c
af50: 68 61 72 20 2a 7a 42 61 73 65 46 69 6c 65 6e 61  har *zBaseFilena
af60: 6d 65 3b 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d  me;   /* Filenam
af70: 65 20 77 69 74 68 6f 75 74 20 64 69 72 65 63 74  e without direct
af80: 6f 72 79 20 70 72 65 66 69 78 20 2a 2f 0a 0a 20  ory prefix */.. 
af90: 20 20 20 2f 2a 20 49 66 20 69 74 73 20 65 78 65     /* If its exe
afa0: 63 75 74 61 62 6c 65 2c 20 69 74 20 6d 75 73 74  cutable, it must
afb0: 20 62 65 20 61 20 43 47 49 20 70 72 6f 67 72 61   be a CGI progra
afc0: 6d 2e 20 20 53 74 61 72 74 20 62 79 0a 20 20 20  m.  Start by.   
afd0: 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 64 69 72   ** changing dir
afe0: 65 63 74 6f 72 69 65 73 20 74 6f 20 74 68 65 20  ectories to the 
aff0: 64 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 69 6e  directory holdin
b000: 67 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20  g the program.. 
b010: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 68     */.    if( ch
b020: 64 69 72 28 7a 44 69 72 29 20 29 7b 0a 20 20 20  dir(zDir) ){.   
b030: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30     char zBuf[100
b040: 30 5d 3b 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e  0];.      Malfun
b050: 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20  ction(__LINE__, 
b060: 22 63 61 6e 6e 6f 74 20 63 68 64 69 72 20 74 6f  "cannot chdir to
b070: 20 5b 25 73 5d 20 66 72 6f 6d 20 5b 25 73 5d 22   [%s] from [%s]"
b080: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 7a 44  , .           zD
b090: 69 72 2c 20 67 65 74 63 77 64 28 7a 42 75 66 2c  ir, getcwd(zBuf,
b0a0: 39 39 39 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  999));.    }..  
b0b0: 20 20 2f 2a 20 53 65 74 75 70 20 74 68 65 20 65    /* Setup the e
b0c0: 6e 76 69 72 6f 6e 6d 65 6e 74 20 61 70 70 72 6f  nvironment appro
b0d0: 70 72 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2f  priately..    */
b0e0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
b0f0: 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 63 67 69  (int)(sizeof(cgi
b100: 65 6e 76 29 2f 73 69 7a 65 6f 66 28 63 67 69 65  env)/sizeof(cgie
b110: 6e 76 5b 30 5d 29 29 3b 20 69 2b 2b 29 7b 0a 20  nv[0])); i++){. 
b120: 20 20 20 20 20 69 66 28 20 2a 63 67 69 65 6e 76       if( *cgienv
b130: 5b 69 5d 2e 70 7a 45 6e 76 56 61 6c 75 65 20 29  [i].pzEnvValue )
b140: 7b 0a 20 20 20 20 20 20 20 20 53 65 74 45 6e 76  {.        SetEnv
b150: 28 63 67 69 65 6e 76 5b 69 5d 2e 7a 45 6e 76 4e  (cgienv[i].zEnvN
b160: 61 6d 65 2c 2a 63 67 69 65 6e 76 5b 69 5d 2e 70  ame,*cgienv[i].p
b170: 7a 45 6e 76 56 61 6c 75 65 29 3b 0a 20 20 20 20  zEnvValue);.    
b180: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
b190: 28 20 75 73 65 48 74 74 70 73 20 29 7b 0a 20 20  ( useHttps ){.  
b1a0: 20 20 20 20 70 75 74 65 6e 76 28 22 48 54 54 50      putenv("HTTP
b1b0: 53 3d 6f 6e 22 29 3b 0a 20 20 20 20 7d 0a 0a 20  S=on");.    }.. 
b1c0: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 41 62 6f     /*.    ** Abo
b1d0: 72 74 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  rt with an error
b1e0: 20 69 66 20 74 68 65 20 43 47 49 20 73 63 72 69   if the CGI scri
b1f0: 70 74 20 69 73 20 77 72 69 74 61 62 6c 65 20 62  pt is writable b
b200: 79 20 61 6e 79 6f 6e 65 20 6f 74 68 65 72 0a 20  y anyone other. 
b210: 20 20 20 2a 2a 20 74 68 61 6e 20 69 74 73 20 6f     ** than its o
b220: 77 6e 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  wner..    */.   
b230: 20 69 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f   if( statbuf.st_
b240: 6d 6f 64 65 20 26 20 30 30 32 32 20 29 7b 0a 20  mode & 0022 ){. 
b250: 20 20 20 20 20 43 67 69 53 63 72 69 70 74 57 72       CgiScriptWr
b260: 69 74 61 62 6c 65 28 29 3b 0a 20 20 20 20 7d 0a  itable();.    }.
b270: 0a 20 20 20 20 2f 2a 20 46 6f 72 20 74 68 65 20  .    /* For the 
b280: 50 4f 53 54 20 6d 65 74 68 6f 64 20 61 6c 6c 20  POST method all 
b290: 69 6e 70 75 74 20 68 61 73 20 62 65 65 6e 20 77  input has been w
b2a0: 72 69 74 74 65 6e 20 74 6f 20 61 20 74 65 6d 70  ritten to a temp
b2b0: 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 20 20  orary file,.    
b2c0: 2a 2a 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f  ** so we have to
b2d0: 20 72 65 64 69 72 65 63 74 20 69 6e 70 75 74 20   redirect input 
b2e0: 74 6f 20 74 68 65 20 43 47 49 20 73 63 72 69 70  to the CGI scrip
b2f0: 74 20 66 72 6f 6d 20 74 68 61 74 20 66 69 6c 65  t from that file
b300: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
b310: 20 7a 4d 65 74 68 6f 64 5b 30 5d 3d 3d 27 50 27   zMethod[0]=='P'
b320: 20 29 7b 0a 20 20 20 20 20 20 64 75 70 28 30 29   ){.      dup(0)
b330: 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 30 29  ;.      close(0)
b340: 3b 0a 20 20 20 20 20 20 6f 70 65 6e 28 7a 54 6d  ;.      open(zTm
b350: 70 4e 61 6d 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b  pNam, O_RDONLY);
b360: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
b370: 69 3d 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2d  i=strlen(zFile)-
b380: 31 3b 20 69 3e 3d 30 20 26 26 20 7a 46 69 6c 65  1; i>=0 && zFile
b390: 5b 69 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d  [i]!='/'; i--){}
b3a0: 0a 20 20 20 20 7a 42 61 73 65 46 69 6c 65 6e 61  .    zBaseFilena
b3b0: 6d 65 20 3d 20 26 7a 46 69 6c 65 5b 69 2b 31 5d  me = &zFile[i+1]
b3c0: 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 30 20 26  ;.    if( i>=0 &
b3d0: 26 20 73 74 72 6e 63 6d 70 28 7a 42 61 73 65 46  & strncmp(zBaseF
b3e0: 69 6c 65 6e 61 6d 65 2c 22 6e 70 68 2d 22 2c 34  ilename,"nph-",4
b3f0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
b400: 20 49 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   If the name of 
b410: 74 68 65 20 43 47 49 20 73 63 72 69 70 74 20 62  the CGI script b
b420: 65 67 69 6e 73 20 77 69 74 68 20 22 6e 70 68 2d  egins with "nph-
b430: 22 20 74 68 65 6e 20 77 65 20 61 72 65 0a 20 20  " then we are.  
b440: 20 20 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77      ** dealing w
b450: 69 74 68 20 61 20 22 6e 6f 6e 2d 70 61 72 73 65  ith a "non-parse
b460: 64 20 68 65 61 64 65 72 73 22 20 43 47 49 20 73  d headers" CGI s
b470: 63 72 69 70 74 2e 20 20 4a 75 73 74 20 65 78 65  cript.  Just exe
b480: 63 28 29 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  c().      ** it 
b490: 64 69 72 65 63 74 6c 79 20 61 6e 64 20 6c 65 74  directly and let
b4a0: 20 69 74 20 68 61 6e 64 6c 65 20 61 6c 6c 20 69   it handle all i
b4b0: 74 73 20 6f 77 6e 20 68 65 61 64 65 72 20 67 65  ts own header ge
b4c0: 6e 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20  neration..      
b4d0: 2a 2f 0a 20 20 20 20 20 20 65 78 65 63 6c 28 7a  */.      execl(z
b4e0: 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c 7a 42 61  BaseFilename,zBa
b4f0: 73 65 46 69 6c 65 6e 61 6d 65 2c 28 63 68 61 72  seFilename,(char
b500: 2a 29 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4e  *)0);.      /* N
b510: 4f 54 45 3a 20 4e 6f 20 6c 6f 67 20 65 6e 74 72  OTE: No log entr
b520: 79 20 77 72 69 74 74 65 6e 20 66 6f 72 20 6e 70  y written for np
b530: 68 2d 20 73 63 72 69 70 74 73 20 2a 2f 0a 20 20  h- scripts */.  
b540: 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20 20      exit(0);.   
b550: 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 61 6c 6c 20   }..    /* Fall 
b560: 74 68 72 75 20 74 6f 20 68 65 72 65 20 6f 6e 6c  thru to here onl
b570: 79 20 69 66 20 74 68 69 73 20 70 72 6f 63 65 73  y if this proces
b580: 73 20 28 74 68 65 20 73 65 72 76 65 72 29 20 69  s (the server) i
b590: 73 20 67 6f 69 6e 67 0a 20 20 20 20 2a 2a 20 74  s going.    ** t
b5a0: 6f 20 72 65 61 64 20 61 6e 64 20 61 75 67 6d 65  o read and augme
b5b0: 6e 74 20 74 68 65 20 68 65 61 64 65 72 20 73 65  nt the header se
b5c0: 6e 74 20 62 61 63 6b 20 62 79 20 74 68 65 20 43  nt back by the C
b5d0: 47 49 20 70 72 6f 63 65 73 73 2e 0a 20 20 20 20  GI process..    
b5e0: 2a 2a 20 4f 70 65 6e 20 61 20 70 69 70 65 20 74  ** Open a pipe t
b5f0: 6f 20 72 65 63 65 69 76 65 20 74 68 65 20 6f 75  o receive the ou
b600: 74 70 75 74 20 66 72 6f 6d 20 74 68 65 20 43 47  tput from the CG
b610: 49 20 70 72 6f 63 65 73 73 2e 20 20 54 68 65 6e  I process.  Then
b620: 0a 20 20 20 20 2a 2a 20 66 6f 72 6b 20 74 68 65  .    ** fork the
b630: 20 43 47 49 20 70 72 6f 63 65 73 73 2e 20 20 4f   CGI process.  O
b640: 6e 63 65 20 65 76 65 72 79 74 68 69 6e 67 20 69  nce everything i
b650: 73 20 64 6f 6e 65 2c 20 77 65 20 73 68 6f 75 6c  s done, we shoul
b660: 64 20 62 65 0a 20 20 20 20 2a 2a 20 61 62 6c 65  d be.    ** able
b670: 20 74 6f 20 72 65 61 64 20 74 68 65 20 6f 75 74   to read the out
b680: 70 75 74 20 6f 66 20 43 47 49 20 6f 6e 20 74 68  put of CGI on th
b690: 65 20 22 69 6e 22 20 73 74 72 65 61 6d 2e 0a 20  e "in" stream.. 
b6a0: 20 20 20 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20     */.    {.    
b6b0: 20 20 69 6e 74 20 70 78 5b 32 5d 3b 0a 20 20 20    int px[2];.   
b6c0: 20 20 20 70 69 70 65 28 70 78 29 3b 0a 20 20 20     pipe(px);.   
b6d0: 20 20 20 69 66 28 20 66 6f 72 6b 28 29 3d 3d 30     if( fork()==0
b6e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73   ){.        clos
b6f0: 65 28 70 78 5b 30 5d 29 3b 0a 20 20 20 20 20 20  e(px[0]);.      
b700: 20 20 63 6c 6f 73 65 28 31 29 3b 0a 20 20 20 20    close(1);.    
b710: 20 20 20 20 64 75 70 28 70 78 5b 31 5d 29 3b 0a      dup(px[1]);.
b720: 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 70 78          close(px
b730: 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 65 78  [1]);.        ex
b740: 65 63 6c 28 7a 42 61 73 65 46 69 6c 65 6e 61 6d  ecl(zBaseFilenam
b750: 65 2c 20 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65  e, zBaseFilename
b760: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
b770: 20 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20       exit(0);.  
b780: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 6f 73      }.      clos
b790: 65 28 70 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20  e(px[1]);.      
b7a0: 69 6e 20 3d 20 66 64 6f 70 65 6e 28 70 78 5b 30  in = fdopen(px[0
b7b0: 5d 2c 20 22 72 22 29 3b 0a 20 20 20 20 7d 0a 20  ], "r");.    }. 
b7c0: 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a     if( in==0 ){.
b7d0: 20 20 20 20 20 20 43 67 69 45 72 72 6f 72 28 29        CgiError()
b7e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
b7f0: 52 65 61 64 20 61 6e 64 20 70 72 6f 63 65 73 73  Read and process
b800: 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e 65 20   the first line 
b810: 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 72 65  of the header re
b820: 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 20 20  turned by the.  
b830: 20 20 2a 2a 20 43 47 49 20 73 63 72 69 70 74 2e    ** CGI script.
b840: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
b850: 75 73 65 54 69 6d 65 6f 75 74 20 29 20 61 6c 61  useTimeout ) ala
b860: 72 6d 28 31 35 29 3b 0a 20 20 20 20 77 68 69 6c  rm(15);.    whil
b870: 65 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 73  e( fgets(zLine,s
b880: 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 69 6e 29  izeof(zLine),in)
b890: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74   ){.      if( st
b8a0: 72 6e 63 6d 70 28 7a 4c 69 6e 65 2c 22 4c 6f 63  rncmp(zLine,"Loc
b8b0: 61 74 69 6f 6e 3a 22 2c 39 29 3d 3d 30 20 29 7b  ation:",9)==0 ){
b8c0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
b8d0: 20 20 20 20 20 20 20 20 52 65 6d 6f 76 65 4e 65          RemoveNe
b8e0: 77 6c 69 6e 65 28 7a 4c 69 6e 65 29 3b 0a 20 20  wline(zLine);.  
b8f0: 20 20 20 20 20 20 7a 20 3d 20 26 7a 4c 69 6e 65        z = &zLine
b900: 5b 31 30 5d 3b 0a 20 20 20 20 20 20 20 20 77 68  [10];.        wh
b910: 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 7a 29  ile( isspace(*z)
b920: 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20   ){ z++; }.     
b930: 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d     for(i=0; z[i]
b940: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
b950: 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 3f 27 20    if( z[i]=='?' 
b960: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ){.            z
b970: 51 75 65 72 79 53 75 66 66 69 78 20 3d 20 53 74  QuerySuffix = St
b980: 72 44 75 70 28 22 22 29 3b 0a 20 20 20 20 20 20  rDup("");.      
b990: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
b9a0: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
b9b0: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2f 27 20 26   if( z[0]=='/' &
b9c0: 26 20 7a 5b 31 5d 3d 3d 27 2f 27 20 29 7b 0a 20  & z[1]=='/' ){. 
b9d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
b9e0: 73 63 68 65 6d 65 20 69 73 20 6d 69 73 73 69 6e  scheme is missin
b9f0: 67 2e 20 20 41 64 64 20 69 74 20 69 6e 20 62 65  g.  Add it in be
ba00: 66 6f 72 65 20 72 65 64 69 72 65 63 74 69 6e 67  fore redirecting
ba10: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 53 74   */.          St
ba20: 61 72 74 52 65 73 70 6f 6e 73 65 28 22 33 30 32  artResponse("302
ba30: 20 52 65 64 69 72 65 63 74 22 29 3b 0a 20 20 20   Redirect");.   
ba40: 20 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70         nOut += p
ba50: 72 69 6e 74 66 28 22 4c 6f 63 61 74 69 6f 6e 3a  rintf("Location:
ba60: 20 25 73 3a 25 73 25 73 5c 72 5c 6e 22 2c 7a 48   %s:%s%s\r\n",zH
ba70: 74 74 70 2c 7a 2c 7a 51 75 65 72 79 53 75 66 66  ttp,z,zQuerySuff
ba80: 69 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ix);.          b
ba90: 72 65 61 6b 3b 20 2f 2a 20 44 4b 20 2a 2f 0a 20  reak; /* DK */. 
baa0: 20 20 20 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67           MakeLog
bab0: 45 6e 74 72 79 28 30 29 3b 0a 20 20 20 20 20 20  Entry(0);.      
bac0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
bad0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b      }else if( z[
bae0: 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  0]=='/' ){.     
baf0: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 63 68 65       /* The sche
bb00: 6d 65 20 61 6e 64 20 6e 65 74 77 6f 72 6b 20 6c  me and network l
bb10: 6f 63 61 74 69 6f 6e 20 61 72 65 20 6d 69 73 73  ocation are miss
bb20: 69 6e 67 20 62 75 74 20 77 65 20 68 61 76 65 0a  ing but we have.
bb30: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20            ** an 
bb40: 61 62 73 6f 6c 75 74 65 20 70 61 74 68 2e 20 2a  absolute path. *
bb50: 2f 0a 20 20 20 20 20 20 20 20 20 20 52 65 64 69  /.          Redi
bb60: 72 65 63 74 28 7a 2c 20 30 29 3b 20 2f 2a 20 44  rect(z, 0); /* D
bb70: 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 62  K */.          b
bb80: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
bb90: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
bba0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
bbb0: 20 69 73 20 61 20 73 63 68 65 6d 65 20 70 72 65   is a scheme pre
bbc0: 66 69 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  fix */.        f
bbd0: 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 20 26 26 20  or(i=0; z[i] && 
bbe0: 7a 5b 69 5d 21 3d 27 3a 27 20 26 26 20 7a 5b 69  z[i]!=':' && z[i
bbf0: 5d 21 3d 27 2f 27 3b 20 69 2b 2b 29 7b 7d 0a 20  ]!='/'; i++){}. 
bc00: 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d         if( z[i]=
bc10: 3d 27 3a 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =':' ){.        
bc20: 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 73    /* We have a s
bc30: 63 68 65 6d 65 2e 20 20 41 73 73 75 6d 65 20 74  cheme.  Assume t
bc40: 68 65 72 65 20 69 73 20 61 6e 20 61 62 73 6f 6c  here is an absol
bc50: 75 74 65 20 55 52 4c 20 2a 2f 0a 20 20 20 20 20  ute URL */.     
bc60: 20 20 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e       StartRespon
bc70: 73 65 28 22 33 30 32 20 52 65 64 69 72 65 63 74  se("302 Redirect
bc80: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f  ");.          nO
bc90: 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 4c 6f  ut += printf("Lo
bca0: 63 61 74 69 6f 6e 3a 20 25 73 25 73 5c 72 5c 6e  cation: %s%s\r\n
bcb0: 22 2c 7a 2c 7a 51 75 65 72 79 53 75 66 66 69 78  ",z,zQuerySuffix
bcc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
bcd0: 61 6b 3b 20 2f 2a 20 44 4b 20 2a 2f 0a 20 20 20  ak; /* DK */.   
bce0: 20 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e         MakeLogEn
bcf0: 74 72 79 28 30 29 3b 0a 20 20 20 20 20 20 20 20  try(0);.        
bd00: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
bd10: 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d    }.        /* M
bd20: 75 73 74 20 62 65 20 61 20 72 65 6c 61 74 69 76  ust be a relativ
bd30: 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 43 6f 6e  e pathname.  Con
bd40: 73 74 72 75 63 74 20 74 68 65 20 61 62 73 6f 6c  struct the absol
bd50: 75 74 65 20 70 61 74 68 6e 61 6d 65 0a 20 20 20  ute pathname.   
bd60: 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 64 69       ** and redi
bd70: 72 65 63 74 20 74 6f 20 69 74 2e 20 2a 2f 0a 20  rect to it. */. 
bd80: 20 20 20 20 20 20 20 69 20 3d 20 73 74 72 6c 65         i = strle
bd90: 6e 28 7a 52 65 61 6c 53 63 72 69 70 74 29 3b 0a  n(zRealScript);.
bda0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69          while( i
bdb0: 3e 30 20 26 26 20 7a 52 65 61 6c 53 63 72 69 70  >0 && zRealScrip
bdc0: 74 5b 69 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 69  t[i-1]!='/' ){ i
bdd0: 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 77 68  --; }.        wh
bde0: 69 6c 65 28 20 69 3e 30 20 26 26 20 7a 52 65 61  ile( i>0 && zRea
bdf0: 6c 53 63 72 69 70 74 5b 69 2d 31 5d 3d 3d 27 2f  lScript[i-1]=='/
be00: 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20  ' ){ i--; }.    
be10: 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 3d 3d 27      while( *z=='
be20: 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  .' ){.          
be30: 69 66 28 20 7a 5b 31 5d 3d 3d 27 2f 27 20 29 7b  if( z[1]=='/' ){
be40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 2b  .            z +
be50: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 2;.          }
be60: 65 6c 73 65 20 69 66 28 20 7a 5b 31 5d 3d 3d 27  else if( z[1]=='
be70: 2e 27 20 26 26 20 7a 5b 32 5d 3d 3d 27 2f 27 20  .' && z[2]=='/' 
be80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77  ){.            w
be90: 68 69 6c 65 28 20 69 3e 30 20 26 26 20 7a 52 65  hile( i>0 && zRe
bea0: 61 6c 53 63 72 69 70 74 5b 69 2d 31 5d 21 3d 27  alScript[i-1]!='
beb0: 2f 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20  /' ){ i--; }.   
bec0: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
bed0: 69 3e 30 20 26 26 20 7a 52 65 61 6c 53 63 72 69  i>0 && zRealScri
bee0: 70 74 5b 69 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20  pt[i-1]=='/' ){ 
bef0: 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 20  i--; }.         
bf00: 20 20 20 7a 20 2b 3d 20 33 3b 0a 20 20 20 20 20     z += 3;.     
bf10: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
bf20: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bf30: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
bf40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 53 74 61     }.        Sta
bf50: 72 74 52 65 73 70 6f 6e 73 65 28 22 33 30 32 20  rtResponse("302 
bf60: 52 65 64 69 72 65 63 74 22 29 3b 0a 20 20 20 20  Redirect");.    
bf70: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
bf80: 74 66 28 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73  tf("Location: %s
bf90: 3a 2f 2f 25 73 22 2c 7a 48 74 74 70 2c 7a 53 65  ://%s",zHttp,zSe
bfa0: 72 76 65 72 4e 61 6d 65 29 3b 0a 20 20 20 20 20  rverName);.     
bfb0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 53     if( strcmp(zS
bfc0: 65 72 76 65 72 50 6f 72 74 2c 22 38 30 22 29 20  erverPort,"80") 
bfd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75  ){.          nOu
bfe0: 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 3a 25 73  t += printf(":%s
bff0: 22 2c 7a 53 65 72 76 65 72 50 6f 72 74 29 3b 0a  ",zServerPort);.
c000: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c010: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
c020: 28 22 25 2e 2a 73 2f 25 73 25 73 5c 72 5c 6e 5c  ("%.*s/%s%s\r\n\
c030: 72 5c 6e 22 2c 69 2c 7a 52 65 61 6c 53 63 72 69  r\n",i,zRealScri
c040: 70 74 2c 7a 2c 7a 51 75 65 72 79 53 75 66 66 69  pt,z,zQuerySuffi
c050: 78 29 3b 0a 20 20 20 20 20 20 20 20 4d 61 6b 65  x);.        Make
c060: 4c 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20 20 20  LogEntry(0);.   
c070: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
c080: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
c090: 6e 63 6d 70 28 7a 4c 69 6e 65 2c 22 53 74 61 74  ncmp(zLine,"Stat
c0a0: 75 73 3a 22 2c 37 29 3d 3d 30 20 29 7b 0a 20 20  us:",7)==0 ){.  
c0b0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
c0c0: 20 20 20 20 20 66 6f 72 28 69 3d 37 3b 20 69 73       for(i=7; is
c0d0: 73 70 61 63 65 28 7a 4c 69 6e 65 5b 69 5d 29 3b  space(zLine[i]);
c0e0: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   i++){}.        
c0f0: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22  nOut += printf("
c100: 25 73 20 25 73 22 2c 20 7a 50 72 6f 74 6f 63 6f  %s %s", zProtoco
c110: 6c 2c 20 26 7a 4c 69 6e 65 5b 69 5d 29 3b 0a 20  l, &zLine[i]);. 
c120: 20 20 20 20 20 20 20 73 74 72 6e 63 70 79 28 7a         strncpy(z
c130: 52 65 70 6c 79 53 74 61 74 75 73 2c 20 26 7a 4c  ReplyStatus, &zL
c140: 69 6e 65 5b 69 5d 2c 20 33 29 3b 0a 20 20 20 20  ine[i], 3);.    
c150: 20 20 20 20 7a 52 65 70 6c 79 53 74 61 74 75 73      zReplyStatus
c160: 5b 33 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  [3] = 0;.       
c170: 20 73 74 61 74 75 73 53 65 6e 74 20 3d 20 31 3b   statusSent = 1;
c180: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
c190: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c1a0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
c1b0: 20 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73      StartRespons
c1c0: 65 28 22 32 30 30 20 4f 4b 22 29 3b 0a 20 20 20  e("200 OK");.   
c1d0: 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69       nOut += pri
c1e0: 6e 74 66 28 22 25 73 22 2c 7a 4c 69 6e 65 29 3b  ntf("%s",zLine);
c1f0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
c200: 3b 20 7a 4c 69 6e 65 5b 69 5d 20 26 26 20 21 69  ; zLine[i] && !i
c210: 73 73 70 61 63 65 28 7a 4c 69 6e 65 5b 69 5d 29  sspace(zLine[i])
c220: 20 26 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d 27 3a   && zLine[i]!=':
c230: 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  '; i++){}.      
c240: 20 20 69 66 28 20 69 3c 32 20 7c 7c 20 7a 4c 69    if( i<2 || zLi
c250: 6e 65 5b 69 5d 21 3d 27 3a 27 20 29 20 62 72 65  ne[i]!=':' ) bre
c260: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
c270: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 65  }..    /* Copy e
c280: 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 20 74  verything else t
c290: 68 72 75 20 77 69 74 68 6f 75 74 20 63 68 61 6e  hru without chan
c2a0: 67 65 20 6f 72 20 61 6e 61 6c 79 73 69 73 2e 0a  ge or analysis..
c2b0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 75      */.    if( u
c2c0: 73 65 54 69 6d 65 6f 75 74 20 29 20 61 6c 61 72  seTimeout ) alar
c2d0: 6d 28 36 30 2a 35 29 3b 0a 20 20 20 20 77 68 69  m(60*5);.    whi
c2e0: 6c 65 28 20 28 63 20 3d 20 67 65 74 63 28 69 6e  le( (c = getc(in
c2f0: 29 29 21 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20  ))!=EOF ){.     
c300: 20 70 75 74 63 28 63 2c 73 74 64 6f 75 74 29 3b   putc(c,stdout);
c310: 0a 20 20 20 20 20 20 6e 4f 75 74 2b 2b 3b 0a 20  .      nOut++;. 
c320: 20 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28     }.    fclose(
c330: 69 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  in);.  }else{.  
c340: 20 20 2f 2a 20 49 66 20 69 74 20 69 73 6e 27 74    /* If it isn't
c350: 20 65 78 65 63 75 74 61 62 6c 65 20 74 68 65 6e   executable then
c360: 20 69 74 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20   it.    ** must 
c370: 61 20 73 69 6d 70 6c 65 20 66 69 6c 65 20 74 68  a simple file th
c380: 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63  at needs to be c
c390: 6f 70 69 65 64 20 74 6f 20 6f 75 74 70 75 74 2e  opied to output.
c3a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  .    */.    cons
c3b0: 74 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74  t char *zContent
c3c0: 54 79 70 65 20 3d 20 47 65 74 4d 69 6d 65 54 79  Type = GetMimeTy
c3d0: 70 65 28 7a 46 69 6c 65 2c 20 6c 65 6e 46 69 6c  pe(zFile, lenFil
c3e0: 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a 54 6d  e);..    if( zTm
c3f0: 70 4e 61 6d 20 29 20 75 6e 6c 69 6e 6b 28 7a 54  pNam ) unlink(zT
c400: 6d 70 4e 61 6d 29 3b 0a 20 20 20 20 69 6e 20 3d  mpNam);.    in =
c410: 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 22 72 22   fopen(zFile,"r"
c420: 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30  );.    if( in==0
c430: 20 29 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49   ) NotFound(__LI
c440: 4e 45 5f 5f 29 3b 0a 20 20 20 20 53 74 61 72 74  NE__);.    Start
c450: 52 65 73 70 6f 6e 73 65 28 22 32 30 30 20 4f 4b  Response("200 OK
c460: 22 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20  ");.    nOut += 
c470: 44 61 74 65 54 61 67 28 22 4c 61 73 74 2d 4d 6f  DateTag("Last-Mo
c480: 64 69 66 69 65 64 22 2c 20 73 74 61 74 62 75 66  dified", statbuf
c490: 2e 73 74 5f 6d 74 69 6d 65 29 3b 0a 20 20 20 20  .st_mtime);.    
c4a0: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22  nOut += printf("
c4b0: 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 25 73  Content-type: %s
c4c0: 5c 72 5c 6e 22 2c 7a 43 6f 6e 74 65 6e 74 54 79  \r\n",zContentTy
c4d0: 70 65 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d  pe);.    nOut +=
c4e0: 20 70 72 69 6e 74 66 28 22 43 6f 6e 74 65 6e 74   printf("Content
c4f0: 2d 6c 65 6e 67 74 68 3a 20 25 64 5c 72 5c 6e 5c  -length: %d\r\n\
c500: 72 5c 6e 22 2c 28 69 6e 74 29 73 74 61 74 62 75  r\n",(int)statbu
c510: 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20  f.st_size);.    
c520: 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
c530: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
c540: 4d 65 74 68 6f 64 2c 22 48 45 41 44 22 29 3d 3d  Method,"HEAD")==
c550: 30 20 29 7b 0a 20 20 20 20 20 20 4d 61 6b 65 4c  0 ){.      MakeL
c560: 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20 20 20 20  ogEntry(0);.    
c570: 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
c580: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
c590: 7d 0a 20 20 20 20 69 66 28 20 75 73 65 54 69 6d  }.    if( useTim
c5a0: 65 6f 75 74 20 29 20 61 6c 61 72 6d 28 33 30 20  eout ) alarm(30 
c5b0: 2b 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a  + statbuf.st_siz
c5c0: 65 2f 31 30 30 30 29 3b 0a 23 69 66 64 65 66 20  e/1000);.#ifdef 
c5d0: 6c 69 6e 75 78 0a 20 20 20 20 7b 0a 20 20 20 20  linux.    {.    
c5e0: 20 20 6f 66 66 5f 74 20 6f 66 66 73 65 74 20 3d    off_t offset =
c5f0: 20 30 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b   0;.      nOut +
c600: 3d 20 73 65 6e 64 66 69 6c 65 28 66 69 6c 65 6e  = sendfile(filen
c610: 6f 28 73 74 64 6f 75 74 29 2c 20 66 69 6c 65 6e  o(stdout), filen
c620: 6f 28 69 6e 29 2c 20 26 6f 66 66 73 65 74 2c 20  o(in), &offset, 
c630: 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 29  statbuf.st_size)
c640: 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
c650: 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 67 65    while( (c = ge
c660: 74 63 28 69 6e 29 29 21 3d 45 4f 46 20 29 7b 0a  tc(in))!=EOF ){.
c670: 20 20 20 20 20 20 70 75 74 63 28 63 2c 73 74 64        putc(c,std
c680: 6f 75 74 29 3b 0a 20 20 20 20 20 20 6e 4f 75 74  out);.      nOut
c690: 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ++;.    }.#endif
c6a0: 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  .    fclose(in);
c6b0: 0a 20 20 7d 0a 20 20 66 66 6c 75 73 68 28 73 74  .  }.  fflush(st
c6c0: 64 6f 75 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67  dout);.  MakeLog
c6d0: 45 6e 74 72 79 28 30 29 3b 0a 0a 20 20 2f 2a 20  Entry(0);..  /* 
c6e0: 54 68 65 20 6e 65 78 74 20 72 65 71 75 65 73 74  The next request
c6f0: 20 6d 75 73 74 20 61 72 72 69 76 65 20 77 69 74   must arrive wit
c700: 68 69 6e 20 33 30 20 73 65 63 6f 6e 64 73 20 6f  hin 30 seconds o
c710: 72 20 77 65 20 63 6c 6f 73 65 20 74 68 65 20 63  r we close the c
c720: 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 2a 2f 0a 20  onnection.  */. 
c730: 20 6f 6d 69 74 4c 6f 67 20 3d 20 31 3b 0a 20 20   omitLog = 1;.  
c740: 69 66 28 20 75 73 65 54 69 6d 65 6f 75 74 20 29  if( useTimeout )
c750: 20 61 6c 61 72 6d 28 33 30 29 3b 0a 7d 0a 0a 23   alarm(30);.}..#
c760: 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 52 41 4c  define MAX_PARAL
c770: 4c 45 4c 20 35 30 20 20 2f 2a 20 4e 75 6d 62 65  LEL 50  /* Numbe
c780: 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75  r of simultaneou
c790: 73 20 63 68 69 6c 64 72 65 6e 20 2a 2f 0a 0a 2f  s children */../
c7a0: 2a 0a 2a 2a 20 41 6c 6c 20 70 6f 73 73 69 62 6c  *.** All possibl
c7b0: 65 20 66 6f 72 6d 73 20 6f 66 20 61 6e 20 49 50  e forms of an IP
c7c0: 20 61 64 64 72 65 73 73 2e 20 20 4e 65 65 64 65   address.  Neede
c7d0: 64 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  d to work around
c7e0: 20 47 43 43 20 73 74 72 69 63 74 0a 2a 2a 20 61   GCC strict.** a
c7f0: 6c 69 61 73 69 6e 67 20 72 75 6c 65 73 2e 0a 2a  liasing rules..*
c800: 2f 0a 74 79 70 65 64 65 66 20 75 6e 69 6f 6e 20  /.typedef union 
c810: 7b 0a 20 20 73 74 72 75 63 74 20 73 6f 63 6b 61  {.  struct socka
c820: 64 64 72 20 73 61 3b 20 20 20 20 20 20 20 20 20  ddr sa;         
c830: 20 20 20 20 20 2f 2a 20 41 62 73 74 72 61 63 74       /* Abstract
c840: 20 73 75 70 65 72 63 6c 61 73 73 20 2a 2f 0a 20   superclass */. 
c850: 20 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72   struct sockaddr
c860: 5f 69 6e 20 73 61 34 3b 20 20 20 20 20 20 20 20  _in sa4;        
c870: 20 20 2f 2a 20 49 50 76 34 20 2a 2f 0a 20 20 73    /* IPv4 */.  s
c880: 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 69  truct sockaddr_i
c890: 6e 36 20 73 61 36 3b 20 20 20 20 20 20 20 20 20  n6 sa6;         
c8a0: 2f 2a 20 49 50 76 36 20 2a 2f 0a 20 20 73 74 72  /* IPv6 */.  str
c8b0: 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 73 74 6f  uct sockaddr_sto
c8c0: 72 61 67 65 20 73 61 73 3b 20 20 20 20 20 2f 2a  rage sas;     /*
c8d0: 20 53 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6d   Should be the m
c8e0: 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 61 62  aximum of the ab
c8f0: 6f 76 65 20 33 20 2a 2f 0a 7d 20 61 64 64 72 65  ove 3 */.} addre
c900: 73 73 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ss;../*.** Imple
c910: 6d 65 6e 74 20 61 6e 20 48 54 54 50 20 73 65 72  ment an HTTP ser
c920: 76 65 72 20 64 61 65 6d 6f 6e 20 6c 69 73 74 65  ver daemon liste
c930: 6e 69 6e 67 20 6f 6e 20 70 6f 72 74 20 69 50 6f  ning on port iPo
c940: 72 74 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 6e 65 77  rt..**.** As new
c950: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 72   connections arr
c960: 69 76 65 2c 20 66 6f 72 6b 20 61 20 63 68 69 6c  ive, fork a chil
c970: 64 20 61 6e 64 20 6c 65 74 20 63 68 69 6c 64 20  d and let child 
c980: 72 65 74 75 72 6e 0a 2a 2a 20 6f 75 74 20 6f 66  return.** out of
c990: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
c9a0: 63 61 6c 6c 2e 20 20 54 68 65 20 63 68 69 6c 64  call.  The child
c9b0: 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 74 68 65   will handle the
c9c0: 20 72 65 71 75 65 73 74 2e 0a 2a 2a 20 54 68 65   request..** The
c9d0: 20 70 61 72 65 6e 74 20 6e 65 76 65 72 20 72 65   parent never re
c9e0: 74 75 72 6e 73 20 66 72 6f 6d 20 74 68 69 73 20  turns from this 
c9f0: 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2a 0a 2a 2a  procedure..**.**
ca00: 20 52 65 74 75 72 6e 20 30 20 74 6f 20 65 61 63   Return 0 to eac
ca10: 68 20 63 68 69 6c 64 20 61 73 20 69 74 20 72 75  h child as it ru
ca20: 6e 73 2e 20 20 49 66 20 75 6e 61 62 6c 65 20 74  ns.  If unable t
ca30: 6f 20 65 73 74 61 62 6c 69 73 68 20 61 0a 2a 2a  o establish a.**
ca40: 20 6c 69 73 74 65 6e 69 6e 67 20 73 6f 63 6b 65   listening socke
ca50: 74 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  t, return non-ze
ca60: 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 68 74 74 70 5f  ro..*/.int http_
ca70: 73 65 72 76 65 72 28 63 6f 6e 73 74 20 63 68 61  server(const cha
ca80: 72 20 2a 7a 50 6f 72 74 2c 20 69 6e 74 20 6c 6f  r *zPort, int lo
ca90: 63 61 6c 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20  calOnly){.  int 
caa0: 6c 69 73 74 65 6e 65 72 5b 32 30 5d 3b 20 20 20  listener[20];   
cab0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
cac0: 73 65 72 76 65 72 20 73 6f 63 6b 65 74 73 20 2a  server sockets *
cad0: 2f 0a 20 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69  /.  int connecti
cae0: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
caf0: 20 2f 2a 20 41 20 73 6f 63 6b 65 74 20 66 6f 72   /* A socket for
cb00: 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c   each individual
cb10: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
cb20: 20 66 64 5f 73 65 74 20 72 65 61 64 66 64 73 3b   fd_set readfds;
cb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cb40: 20 53 65 74 20 6f 66 20 66 69 6c 65 20 64 65 73   Set of file des
cb50: 63 72 69 70 74 6f 72 73 20 66 6f 72 20 73 65 6c  criptors for sel
cb60: 65 63 74 28 29 20 2a 2f 0a 20 20 61 64 64 72 65  ect() */.  addre
cb70: 73 73 20 69 6e 61 64 64 72 3b 20 20 20 20 20 20  ss inaddr;      
cb80: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 74          /* Remot
cb90: 65 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 73  e address */.  s
cba0: 6f 63 6b 6c 65 6e 5f 74 20 6c 65 6e 61 64 64 72  ocklen_t lenaddr
cbb0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
cbc0: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 69 6e 61  ength of the ina
cbd0: 64 64 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ddr structure */
cbe0: 0a 20 20 69 6e 74 20 63 68 69 6c 64 3b 20 20 20  .  int child;   
cbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc00: 2f 2a 20 50 49 44 20 6f 66 20 74 68 65 20 63 68  /* PID of the ch
cc10: 69 6c 64 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  ild process */. 
cc20: 20 69 6e 74 20 6e 63 68 69 6c 64 72 65 6e 20 3d   int nchildren =
cc30: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
cc40: 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 69 6c 64   Number of child
cc50: 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a 20 20   processes */.  
cc60: 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 64  struct timeval d
cc70: 65 6c 61 79 3b 20 20 20 20 20 20 20 20 2f 2a 20  elay;        /* 
cc80: 48 6f 77 20 6c 6f 6e 67 20 74 6f 20 77 61 69 74  How long to wait
cc90: 20 69 6e 73 69 64 65 20 73 65 6c 65 63 74 28 29   inside select()
cca0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 74 20 3d 20   */.  int opt = 
ccb0: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
ccc0: 20 20 20 2f 2a 20 73 65 74 73 6f 63 6b 6f 70 74     /* setsockopt
ccd0: 20 66 6c 61 67 20 2a 2f 0a 20 20 73 74 72 75 63   flag */.  struc
cce0: 74 20 61 64 64 72 69 6e 66 6f 20 73 48 69 6e 74  t addrinfo sHint
ccf0: 73 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  s;      /* Addre
cd00: 73 73 20 68 69 6e 74 73 20 2a 2f 0a 20 20 73 74  ss hints */.  st
cd10: 72 75 63 74 20 61 64 64 72 69 6e 66 6f 20 2a 70  ruct addrinfo *p
cd20: 41 64 64 72 73 2c 20 2a 70 3b 20 2f 2a 20 2a 2f  Addrs, *p; /* */
cd30: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
cd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd50: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
cd60: 2f 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  /.  int i, n;.  
cd70: 69 6e 74 20 6d 61 78 46 64 20 3d 20 2d 31 3b 0a  int maxFd = -1;.
cd80: 20 20 0a 20 20 6d 65 6d 73 65 74 28 26 73 48 69    .  memset(&sHi
cd90: 6e 74 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  nts, 0, sizeof(s
cda0: 48 69 6e 74 73 29 29 3b 0a 20 20 69 66 28 20 69  Hints));.  if( i
cdb0: 70 76 34 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73  pv4Only ){.    s
cdc0: 48 69 6e 74 73 2e 61 69 5f 66 61 6d 69 6c 79 20  Hints.ai_family 
cdd0: 3d 20 50 46 5f 49 4e 45 54 3b 0a 20 20 20 20 2f  = PF_INET;.    /
cde0: 2a 70 72 69 6e 74 66 28 22 69 70 76 34 20 6f 6e  *printf("ipv4 on
cdf0: 6c 79 5c 6e 22 29 3b 2a 2f 0a 20 20 7d 65 6c 73  ly\n");*/.  }els
ce00: 65 20 69 66 28 20 69 70 76 36 4f 6e 6c 79 20 29  e if( ipv6Only )
ce10: 7b 0a 20 20 20 20 73 48 69 6e 74 73 2e 61 69 5f  {.    sHints.ai_
ce20: 66 61 6d 69 6c 79 20 3d 20 50 46 5f 49 4e 45 54  family = PF_INET
ce30: 36 3b 0a 20 20 20 20 2f 2a 70 72 69 6e 74 66 28  6;.    /*printf(
ce40: 22 69 70 76 36 20 6f 6e 6c 79 5c 6e 22 29 3b 2a  "ipv6 only\n");*
ce50: 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  /.  }else{.    s
ce60: 48 69 6e 74 73 2e 61 69 5f 66 61 6d 69 6c 79 20  Hints.ai_family 
ce70: 3d 20 50 46 5f 55 4e 53 50 45 43 3b 0a 20 20 7d  = PF_UNSPEC;.  }
ce80: 0a 20 20 73 48 69 6e 74 73 2e 61 69 5f 73 6f 63  .  sHints.ai_soc
ce90: 6b 74 79 70 65 20 3d 20 53 4f 43 4b 5f 53 54 52  ktype = SOCK_STR
cea0: 45 41 4d 3b 0a 20 20 73 48 69 6e 74 73 2e 61 69  EAM;.  sHints.ai
ceb0: 5f 66 6c 61 67 73 20 3d 20 41 49 5f 50 41 53 53  _flags = AI_PASS
cec0: 49 56 45 3b 0a 20 20 73 48 69 6e 74 73 2e 61 69  IVE;.  sHints.ai
ced0: 5f 70 72 6f 74 6f 63 6f 6c 20 3d 20 30 3b 0a 20  _protocol = 0;. 
cee0: 20 72 63 20 3d 20 67 65 74 61 64 64 72 69 6e 66   rc = getaddrinf
cef0: 6f 28 6c 6f 63 61 6c 4f 6e 6c 79 20 3f 20 22 6c  o(localOnly ? "l
cf00: 6f 63 61 6c 68 6f 73 74 22 3a 20 30 2c 20 7a 50  ocalhost": 0, zP
cf10: 6f 72 74 2c 20 26 73 48 69 6e 74 73 2c 20 26 70  ort, &sHints, &p
cf20: 41 64 64 72 73 29 3b 0a 20 20 69 66 28 20 72 63  Addrs);.  if( rc
cf30: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
cf40: 73 74 64 65 72 72 2c 20 22 63 6f 75 6c 64 20 6e  stderr, "could n
cf50: 6f 74 20 67 65 74 20 61 64 64 72 20 69 6e 66 6f  ot get addr info
cf60: 3a 20 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20  : %s", .        
cf70: 20 20 20 20 72 63 21 3d 45 41 49 5f 53 59 53 54      rc!=EAI_SYST
cf80: 45 4d 20 3f 20 67 61 69 5f 73 74 72 65 72 72 6f  EM ? gai_strerro
cf90: 72 28 72 63 29 20 3a 20 73 74 72 65 72 72 6f 72  r(rc) : strerror
cfa0: 28 65 72 72 6e 6f 29 29 3b 0a 20 20 20 20 72 65  (errno));.    re
cfb0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 66 6f  turn 1;.  }.  fo
cfc0: 72 28 6e 3d 30 2c 20 70 3d 70 41 64 64 72 73 3b  r(n=0, p=pAddrs;
cfd0: 20 6e 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28   n<(int)(sizeof(
cfe0: 6c 69 73 74 65 6e 65 72 29 2f 73 69 7a 65 6f 66  listener)/sizeof
cff0: 28 6c 69 73 74 65 6e 65 72 5b 30 5d 29 29 20 26  (listener[0])) &
d000: 26 20 70 21 3d 30 3b 0a 20 20 20 20 20 20 20 20  & p!=0;.        
d010: 70 3d 70 2d 3e 61 69 5f 6e 65 78 74 29 7b 0a 20  p=p->ai_next){. 
d020: 20 20 20 6c 69 73 74 65 6e 65 72 5b 6e 5d 20 3d     listener[n] =
d030: 20 73 6f 63 6b 65 74 28 70 2d 3e 61 69 5f 66 61   socket(p->ai_fa
d040: 6d 69 6c 79 2c 20 70 2d 3e 61 69 5f 73 6f 63 6b  mily, p->ai_sock
d050: 74 79 70 65 2c 20 70 2d 3e 61 69 5f 70 72 6f 74  type, p->ai_prot
d060: 6f 63 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 6c  ocol);.    if( l
d070: 69 73 74 65 6e 65 72 5b 6e 5d 3e 3d 30 20 29 7b  istener[n]>=0 ){
d080: 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20  .      /* if we 
d090: 63 61 6e 27 74 20 74 65 72 6d 69 6e 61 74 65 20  can't terminate 
d0a0: 6e 69 63 65 6c 79 2c 20 61 74 20 6c 65 61 73 74  nicely, at least
d0b0: 20 61 6c 6c 6f 77 20 74 68 65 20 73 6f 63 6b 65   allow the socke
d0c0: 74 20 74 6f 20 62 65 20 72 65 75 73 65 64 20 2a  t to be reused *
d0d0: 2f 0a 20 20 20 20 20 20 73 65 74 73 6f 63 6b 6f  /.      setsocko
d0e0: 70 74 28 6c 69 73 74 65 6e 65 72 5b 6e 5d 2c 20  pt(listener[n], 
d0f0: 53 4f 4c 5f 53 4f 43 4b 45 54 2c 20 53 4f 5f 52  SOL_SOCKET, SO_R
d100: 45 55 53 45 41 44 44 52 2c 26 6f 70 74 2c 20 73  EUSEADDR,&opt, s
d110: 69 7a 65 6f 66 28 6f 70 74 29 29 3b 0a 20 20 20  izeof(opt));.   
d120: 20 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28     .#if defined(
d130: 49 50 56 36 5f 56 36 4f 4e 4c 59 29 0a 20 20 20  IPV6_V6ONLY).   
d140: 20 20 20 69 66 28 20 70 2d 3e 61 69 5f 66 61 6d     if( p->ai_fam
d150: 69 6c 79 3d 3d 41 46 5f 49 4e 45 54 36 20 29 7b  ily==AF_INET6 ){
d160: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 76 36 6f  .        int v6o
d170: 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nly = 1;.       
d180: 20 73 65 74 73 6f 63 6b 6f 70 74 28 6c 69 73 74   setsockopt(list
d190: 65 6e 65 72 5b 6e 5d 2c 20 49 50 50 52 4f 54 4f  ener[n], IPPROTO
d1a0: 5f 49 50 56 36 2c 20 49 50 56 36 5f 56 36 4f 4e  _IPV6, IPV6_V6ON
d1b0: 4c 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LY,.            
d1c0: 20 20 20 20 20 20 20 20 26 76 36 6f 6e 6c 79 2c          &v6only,
d1d0: 20 73 69 7a 65 6f 66 28 76 36 6f 6e 6c 79 29 29   sizeof(v6only))
d1e0: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
d1f0: 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66  .      .      if
d200: 28 20 62 69 6e 64 28 6c 69 73 74 65 6e 65 72 5b  ( bind(listener[
d210: 6e 5d 2c 20 70 2d 3e 61 69 5f 61 64 64 72 2c 20  n], p->ai_addr, 
d220: 70 2d 3e 61 69 5f 61 64 64 72 6c 65 6e 29 3c 30  p->ai_addrlen)<0
d230: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e   ){.        prin
d240: 74 66 28 22 62 69 6e 64 20 66 61 69 6c 65 64 3a  tf("bind failed:
d250: 20 25 73 5c 6e 22 2c 20 73 74 72 65 72 72 6f 72   %s\n", strerror
d260: 28 65 72 72 6e 6f 29 29 3b 0a 20 20 20 20 20 20  (errno));.      
d270: 20 20 63 6c 6f 73 65 28 6c 69 73 74 65 6e 65 72    close(listener
d280: 5b 6e 5d 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  [n]);.        co
d290: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
d2a0: 20 20 20 20 20 20 69 66 28 20 6c 69 73 74 65 6e        if( listen
d2b0: 28 6c 69 73 74 65 6e 65 72 5b 6e 5d 2c 20 32 30  (listener[n], 20
d2c0: 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  )<0 ){.        p
d2d0: 72 69 6e 74 66 28 22 6c 69 73 74 65 6e 28 29 20  rintf("listen() 
d2e0: 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20 73  failed: %s\n", s
d2f0: 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 29 3b  trerror(errno));
d300: 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 6c  .        close(l
d310: 69 73 74 65 6e 65 72 5b 6e 5d 29 3b 0a 20 20 20  istener[n]);.   
d320: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
d330: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 2b 2b       }.      n++
d340: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
d350: 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70  ( n==0 ){.    fp
d360: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 63  rintf(stderr, "c
d370: 61 6e 6e 6f 74 20 6f 70 65 6e 20 61 6e 79 20 73  annot open any s
d380: 6f 63 6b 65 74 73 5c 6e 22 29 3b 0a 20 20 20 20  ockets\n");.    
d390: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
d3a0: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
d3b0: 20 69 66 28 20 6e 63 68 69 6c 64 72 65 6e 3e 4d   if( nchildren>M
d3c0: 41 58 5f 50 41 52 41 4c 4c 45 4c 20 29 7b 0a 20  AX_PARALLEL ){. 
d3d0: 20 20 20 20 20 2f 2a 20 53 6c 6f 77 20 64 6f 77       /* Slow dow
d3e0: 6e 20 69 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  n if connections
d3f0: 20 61 72 65 20 61 72 72 69 76 69 6e 67 20 74 6f   are arriving to
d400: 6f 20 66 61 73 74 20 2a 2f 0a 20 20 20 20 20 20  o fast */.      
d410: 73 6c 65 65 70 28 20 6e 63 68 69 6c 64 72 65 6e  sleep( nchildren
d420: 2d 4d 41 58 5f 50 41 52 41 4c 4c 45 4c 20 29 3b  -MAX_PARALLEL );
d430: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 6c 61 79  .    }.    delay
d440: 2e 74 76 5f 73 65 63 20 3d 20 36 30 3b 0a 20 20  .tv_sec = 60;.  
d450: 20 20 64 65 6c 61 79 2e 74 76 5f 75 73 65 63 20    delay.tv_usec 
d460: 3d 20 30 3b 0a 20 20 20 20 46 44 5f 5a 45 52 4f  = 0;.    FD_ZERO
d470: 28 26 72 65 61 64 66 64 73 29 3b 0a 20 20 20 20  (&readfds);.    
d480: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
d490: 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
d4a0: 28 20 6c 69 73 74 65 6e 65 72 5b 69 5d 3e 3d 30  ( listener[i]>=0
d4b0: 20 29 3b 0a 20 20 20 20 20 20 46 44 5f 53 45 54   );.      FD_SET
d4c0: 28 20 6c 69 73 74 65 6e 65 72 5b 69 5d 2c 20 26  ( listener[i], &
d4d0: 72 65 61 64 66 64 73 29 3b 0a 20 20 20 20 20 20  readfds);.      
d4e0: 69 66 28 20 6c 69 73 74 65 6e 65 72 5b 69 5d 3e  if( listener[i]>
d4f0: 6d 61 78 46 64 20 29 20 6d 61 78 46 64 20 3d 20  maxFd ) maxFd = 
d500: 6c 69 73 74 65 6e 65 72 5b 69 5d 3b 0a 20 20 20  listener[i];.   
d510: 20 7d 0a 20 20 20 20 73 65 6c 65 63 74 28 20 6d   }.    select( m
d520: 61 78 46 64 2b 31 2c 20 26 72 65 61 64 66 64 73  axFd+1, &readfds
d530: 2c 20 30 2c 20 30 2c 20 26 64 65 6c 61 79 29 3b  , 0, 0, &delay);
d540: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
d550: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  n; i++){.      i
d560: 66 28 20 46 44 5f 49 53 53 45 54 28 6c 69 73 74  f( FD_ISSET(list
d570: 65 6e 65 72 5b 69 5d 2c 20 26 72 65 61 64 66 64  ener[i], &readfd
d580: 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65  s) ){.        le
d590: 6e 61 64 64 72 20 3d 20 73 69 7a 65 6f 66 28 69  naddr = sizeof(i
d5a0: 6e 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20  naddr);.        
d5b0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 61 63 63  connection = acc
d5c0: 65 70 74 28 6c 69 73 74 65 6e 65 72 5b 69 5d 2c  ept(listener[i],
d5d0: 20 26 69 6e 61 64 64 72 2e 73 61 2c 20 26 6c 65   &inaddr.sa, &le
d5e0: 6e 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20  naddr);.        
d5f0: 69 66 28 20 63 6f 6e 6e 65 63 74 69 6f 6e 3e 3d  if( connection>=
d600: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  0 ){.          c
d610: 68 69 6c 64 20 3d 20 66 6f 72 6b 28 29 3b 0a 20  hild = fork();. 
d620: 20 20 20 20 20 20 20 20 20 69 66 28 20 63 68 69           if( chi
d630: 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ld!=0 ){.       
d640: 20 20 20 20 20 69 66 28 20 63 68 69 6c 64 3e 30       if( child>0
d650: 20 29 20 6e 63 68 69 6c 64 72 65 6e 2b 2b 3b 0a   ) nchildren++;.
d660: 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73              clos
d670: 65 28 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20  e(connection);. 
d680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 72             /* pr
d690: 69 6e 74 66 28 22 73 75 62 70 72 6f 63 65 73 73  intf("subprocess
d6a0: 20 25 64 20 73 74 61 72 74 65 64 2e 2e 2e 5c 6e   %d started...\n
d6b0: 22 2c 20 63 68 69 6c 64 29 3b 20 66 66 6c 75 73  ", child); fflus
d6c0: 68 28 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20  h(stdout); */.  
d6d0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
d6e0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e             int n
d6f0: 45 72 72 20 3d 20 30 2c 20 66 64 3b 0a 20 20 20  Err = 0, fd;.   
d700: 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 30           close(0
d710: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
d720: 64 20 3d 20 64 75 70 28 63 6f 6e 6e 65 63 74 69  d = dup(connecti
d730: 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  on);.           
d740: 20 69 66 28 20 66 64 21 3d 30 20 29 20 6e 45 72   if( fd!=0 ) nEr
d750: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r++;.           
d760: 20 63 6c 6f 73 65 28 31 29 3b 0a 20 20 20 20 20   close(1);.     
d770: 20 20 20 20 20 20 20 66 64 20 3d 20 64 75 70 28         fd = dup(
d780: 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 20  connection);.   
d790: 20 20 20 20 20 20 20 20 20 69 66 28 20 66 64 21           if( fd!
d7a0: 3d 31 20 29 20 6e 45 72 72 2b 2b 3b 0a 20 20 20  =1 ) nErr++;.   
d7b0: 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 32           close(2
d7c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
d7d0: 64 20 3d 20 64 75 70 28 63 6f 6e 6e 65 63 74 69  d = dup(connecti
d7e0: 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  on);.           
d7f0: 20 69 66 28 20 66 64 21 3d 32 20 29 20 6e 45 72   if( fd!=2 ) nEr
d800: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r++;.           
d810: 20 63 6c 6f 73 65 28 63 6f 6e 6e 65 63 74 69 6f   close(connectio
d820: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
d830: 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 20 20 20  return nErr;.   
d840: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d850: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
d860: 20 2f 2a 20 42 75 72 79 20 64 65 61 64 20 63 68   /* Bury dead ch
d870: 69 6c 64 72 65 6e 20 2a 2f 0a 20 20 20 20 20 20  ildren */.      
d880: 77 68 69 6c 65 28 20 28 63 68 69 6c 64 20 3d 20  while( (child = 
d890: 77 61 69 74 70 69 64 28 30 2c 20 30 2c 20 57 4e  waitpid(0, 0, WN
d8a0: 4f 48 41 4e 47 29 29 3e 30 20 29 7b 0a 20 20 20  OHANG))>0 ){.   
d8b0: 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 66 28 22       /* printf("
d8c0: 70 72 6f 63 65 73 73 20 25 64 20 65 6e 64 73 5c  process %d ends\
d8d0: 6e 22 2c 20 63 68 69 6c 64 29 3b 20 66 66 6c 75  n", child); fflu
d8e0: 73 68 28 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20  sh(stdout); */. 
d8f0: 20 20 20 20 20 20 20 6e 63 68 69 6c 64 72 65 6e         nchildren
d900: 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
d910: 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4e 4f 54 20 52  }.  }.  /* NOT R
d920: 45 41 43 48 45 44 20 2a 2f 20 20 0a 20 20 65 78  EACHED */  .  ex
d930: 69 74 28 31 29 3b 0a 7d 0a 0a 0a 69 6e 74 20 6d  it(1);.}...int m
d940: 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68  ain(int argc, ch
d950: 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e  ar **argv){.  in
d960: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
d970: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
d980: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 63 68 61  counter */.  cha
d990: 72 20 2a 7a 50 65 72 6d 55 73 65 72 20 3d 20 30  r *zPermUser = 0
d9a0: 3b 20 20 20 20 20 20 2f 2a 20 52 75 6e 20 64 61  ;      /* Run da
d9b0: 65 6d 6f 6e 20 77 69 74 68 20 74 68 69 73 20 75  emon with this u
d9c0: 73 65 72 27 73 20 70 65 72 6d 69 73 73 69 6f 6e  ser's permission
d9d0: 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
d9e0: 72 20 2a 7a 50 6f 72 74 20 3d 20 30 3b 20 20 20  r *zPort = 0;   
d9f0: 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 6e   /* Implement an
da00: 20 48 54 54 50 20 73 65 72 76 65 72 20 70 72 6f   HTTP server pro
da10: 63 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 75 73  cess */.  int us
da20: 65 43 68 72 6f 6f 74 4a 61 69 6c 20 3d 20 31 3b  eChrootJail = 1;
da30: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75      /* True to u
da40: 73 65 20 61 20 63 68 61 6e 67 65 2d 72 6f 6f 74  se a change-root
da50: 20 6a 61 69 6c 20 2a 2f 0a 20 20 73 74 72 75 63   jail */.  struc
da60: 74 20 70 61 73 73 77 64 20 2a 70 77 64 20 3d 20  t passwd *pwd = 
da70: 30 3b 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74  0;   /* Informat
da80: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 75 73  ion about the us
da90: 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 63 6f  er */..  /* Reco
daa0: 72 64 20 74 68 65 20 74 69 6d 65 20 77 68 65 6e  rd the time when
dab0: 20 70 72 6f 63 65 73 73 69 6e 67 20 62 65 67 69   processing begi
dac0: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 74 69 6d 65 28  ns..  */.  time(
dad0: 26 62 65 67 69 6e 54 69 6d 65 29 3b 0a 0a 20 20  &beginTime);..  
dae0: 2f 2a 20 50 61 72 73 65 20 63 6f 6d 6d 61 6e 64  /* Parse command
daf0: 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 73 0a  -line arguments.
db00: 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 61 72    */.  while( ar
db10: 67 63 3e 31 20 26 26 20 61 72 67 76 5b 31 5d 5b  gc>1 && argv[1][
db20: 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 63  0]=='-' ){.    c
db30: 68 61 72 20 2a 7a 20 3d 20 61 72 67 76 5b 31 5d  har *z = argv[1]
db40: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 41 72 67  ;.    char *zArg
db50: 20 3d 20 61 72 67 63 3e 3d 33 20 3f 20 61 72 67   = argc>=3 ? arg
db60: 76 5b 32 5d 20 3a 20 22 30 22 3b 0a 20 20 20 20  v[2] : "0";.    
db70: 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26  if( z[0]=='-' &&
db80: 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b   z[1]=='-' ) z++
db90: 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  ;.    if( strcmp
dba0: 28 7a 2c 22 2d 75 73 65 72 22 29 3d 3d 30 20 29  (z,"-user")==0 )
dbb0: 7b 0a 20 20 20 20 20 20 7a 50 65 72 6d 55 73 65  {.      zPermUse
dbc0: 72 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 7d 65  r = zArg;.    }e
dbd0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
dbe0: 2c 22 2d 72 6f 6f 74 22 29 3d 3d 30 20 29 7b 0a  ,"-root")==0 ){.
dbf0: 20 20 20 20 20 20 7a 52 6f 6f 74 20 3d 20 7a 41        zRoot = zA
dc00: 72 67 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  rg;.    }else if
dc10: 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6c 6f 67  ( strcmp(z,"-log
dc20: 66 69 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  file")==0 ){.   
dc30: 20 20 20 7a 4c 6f 67 46 69 6c 65 20 3d 20 7a 41     zLogFile = zA
dc40: 72 67 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  rg;.    }else if
dc50: 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 68 74 74  ( strcmp(z,"-htt
dc60: 70 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ps")==0 ){.     
dc70: 20 75 73 65 48 74 74 70 73 20 3d 20 61 74 6f 69   useHttps = atoi
dc80: 28 7a 41 72 67 29 3b 0a 20 20 20 20 20 20 7a 48  (zArg);.      zH
dc90: 74 74 70 20 3d 20 75 73 65 48 74 74 70 73 20 3f  ttp = useHttps ?
dca0: 20 22 68 74 74 70 22 20 3a 20 22 68 74 74 70 73   "http" : "https
dcb0: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ";.    }else if(
dcc0: 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 70 6f 72   strcmp(z, "-por
dcd0: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
dce0: 7a 50 6f 72 74 20 3d 20 7a 41 72 67 3b 0a 20 20  zPort = zArg;.  
dcf0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
dd00: 6d 70 28 7a 2c 20 22 2d 66 61 6d 69 6c 79 22 29  mp(z, "-family")
dd10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
dd20: 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 69   strcmp(zArg, "i
dd30: 70 76 34 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  pv4")==0 ){.    
dd40: 20 20 20 20 69 70 76 34 4f 6e 6c 79 20 3d 20 31      ipv4Only = 1
dd50: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
dd60: 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22  ( strcmp(zArg, "
dd70: 69 70 76 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ipv6")==0 ){.   
dd80: 20 20 20 20 20 69 70 76 36 4f 6e 6c 79 20 3d 20       ipv6Only = 
dd90: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
dda0: 20 20 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74          Malfunct
ddb0: 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 75  ion(__LINE__, "u
ddc0: 6e 6b 6e 6f 77 6e 20 49 50 20 70 72 6f 74 6f 63  nknown IP protoc
ddd0: 6f 6c 3a 20 5b 25 73 5d 22 2c 20 7a 41 72 67 29  ol: [%s]", zArg)
dde0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
ddf0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
de00: 2c 20 22 2d 6a 61 69 6c 22 29 3d 3d 30 20 29 7b  , "-jail")==0 ){
de10: 0a 20 20 20 20 20 20 69 66 28 20 61 74 6f 69 28  .      if( atoi(
de20: 7a 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20  zArg)==0 ){.    
de30: 20 20 20 20 75 73 65 43 68 72 6f 6f 74 4a 61 69      useChrootJai
de40: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  l = 0;.      }. 
de50: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
de60: 63 6d 70 28 7a 2c 20 22 2d 64 65 62 75 67 22 29  cmp(z, "-debug")
de70: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
de80: 20 61 74 6f 69 28 7a 41 72 67 29 20 29 7b 0a 20   atoi(zArg) ){. 
de90: 20 20 20 20 20 20 20 75 73 65 54 69 6d 65 6f 75         useTimeou
dea0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
deb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
dec0: 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49  Malfunction(__LI
ded0: 4e 45 5f 5f 2c 20 22 75 6e 6b 6e 6f 77 6e 20 61  NE__, "unknown a
dee0: 72 67 75 6d 65 6e 74 3a 20 5b 25 73 5d 22 2c 20  rgument: [%s]", 
def0: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 72  z);.    }.    ar
df00: 67 76 20 2b 3d 20 32 3b 0a 20 20 20 20 61 72 67  gv += 2;.    arg
df10: 63 20 2d 3d 20 32 3b 0a 20 20 7d 0a 20 20 69 66  c -= 2;.  }.  if
df20: 28 20 7a 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20  ( zRoot==0 ){.  
df30: 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f    Malfunction(__
df40: 4c 49 4e 45 5f 5f 2c 20 22 6e 6f 20 2d 2d 72 6f  LINE__, "no --ro
df50: 6f 74 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a  ot specified");.
df60: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 43 68 61 6e    }.  .  /* Chan
df70: 67 65 20 64 69 72 65 63 74 6f 72 69 65 73 20 74  ge directories t
df80: 6f 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68  o the root of th
df90: 65 20 48 54 54 50 20 66 69 6c 65 73 79 73 74 65  e HTTP filesyste
dfa0: 6d 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63 72  m.  Then.  ** cr
dfb0: 65 61 74 65 20 61 20 63 68 72 6f 6f 74 20 6a 61  eate a chroot ja
dfc0: 69 6c 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20  il there..  */. 
dfd0: 20 69 66 28 20 63 68 64 69 72 28 7a 52 6f 6f 74   if( chdir(zRoot
dfe0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 4d 61 6c 66  )!=0 ){.    Malf
dff0: 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f  unction(__LINE__
e000: 2c 20 22 63 61 6e 6e 6f 74 20 63 68 61 6e 67 65  , "cannot change
e010: 20 74 6f 20 64 69 72 65 63 74 6f 72 79 20 5b 25   to directory [%
e020: 73 5d 22 2c 20 7a 52 6f 6f 74 29 3b 0a 20 20 7d  s]", zRoot);.  }
e030: 0a 0a 20 20 2f 2a 20 47 65 74 20 69 6e 66 6f 72  ..  /* Get infor
e040: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
e050: 20 75 73 65 72 20 69 66 20 61 76 61 69 6c 61 62   user if availab
e060: 6c 65 20 2a 2f 0a 20 20 69 66 28 20 7a 50 65 72  le */.  if( zPer
e070: 6d 55 73 65 72 20 29 20 70 77 64 20 3d 20 67 65  mUser ) pwd = ge
e080: 74 70 77 6e 61 6d 28 7a 50 65 72 6d 55 73 65 72  tpwnam(zPermUser
e090: 29 3b 0a 0a 20 20 2f 2a 20 45 6e 74 65 72 20 74  );..  /* Enter t
e0a0: 68 65 20 63 68 72 6f 6f 74 20 6a 61 69 6c 20 69  he chroot jail i
e0b0: 66 20 72 65 71 75 65 73 74 65 64 20 2a 2f 20 20  f requested */  
e0c0: 0a 20 20 69 66 28 20 7a 50 65 72 6d 55 73 65 72  .  if( zPermUser
e0d0: 20 26 26 20 75 73 65 43 68 72 6f 6f 74 4a 61 69   && useChrootJai
e0e0: 6c 20 26 26 20 67 65 74 75 69 64 28 29 3d 3d 30  l && getuid()==0
e0f0: 20 29 7b 0a 20 20 20 20 69 66 28 20 63 68 72 6f   ){.    if( chro
e100: 6f 74 28 22 2e 22 29 3c 30 20 29 7b 0a 20 20 20  ot(".")<0 ){.   
e110: 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f     Malfunction(_
e120: 5f 4c 49 4e 45 5f 5f 2c 20 22 75 6e 61 62 6c 65  _LINE__, "unable
e130: 20 74 6f 20 63 72 65 61 74 65 20 63 68 72 6f 6f   to create chroo
e140: 74 20 6a 61 69 6c 22 29 3b 0a 20 20 20 20 7d 65  t jail");.    }e
e150: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 52 6f 6f 74  lse{.      zRoot
e160: 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 7d   = "";.    }.  }
e170: 0a 0a 20 20 2f 2a 20 41 63 74 69 76 61 74 65 20  ..  /* Activate 
e180: 74 68 65 20 73 65 72 76 65 72 2c 20 69 66 20 72  the server, if r
e190: 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 69 66  equested */.  if
e1a0: 28 20 7a 50 6f 72 74 20 26 26 20 68 74 74 70 5f  ( zPort && http_
e1b0: 73 65 72 76 65 72 28 7a 50 6f 72 74 2c 20 30 29  server(zPort, 0)
e1c0: 20 29 7b 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74   ){.    Malfunct
e1d0: 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 66  ion(__LINE__, "f
e1e0: 61 69 6c 65 64 20 74 6f 20 73 74 61 72 74 20 73  ailed to start s
e1f0: 65 72 76 65 72 22 29 3b 0a 20 20 7d 0a 0a 20 20  erver");.  }..  
e200: 2f 2a 20 44 72 6f 70 20 72 6f 6f 74 20 70 72 69  /* Drop root pri
e210: 76 69 6c 65 67 65 73 2e 0a 20 20 2a 2f 0a 20 20  vileges..  */.  
e220: 69 66 28 20 7a 50 65 72 6d 55 73 65 72 20 29 7b  if( zPermUser ){
e230: 0a 20 20 20 20 69 66 28 20 70 77 64 20 29 7b 0a  .    if( pwd ){.
e240: 20 20 20 20 20 20 73 65 74 67 69 64 28 70 77 64        setgid(pwd
e250: 2d 3e 70 77 5f 67 69 64 29 3b 0a 20 20 20 20 20  ->pw_gid);.     
e260: 20 73 65 74 75 69 64 28 70 77 64 2d 3e 70 77 5f   setuid(pwd->pw_
e270: 75 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  uid);.    }else{
e280: 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69  .      Malfuncti
e290: 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 6e 6f  on(__LINE__, "no
e2a0: 20 73 75 63 68 20 75 73 65 72 20 5b 25 73 5d 22   such user [%s]"
e2b0: 2c 20 7a 50 65 72 6d 55 73 65 72 29 3b 0a 20 20  , zPermUser);.  
e2c0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 67 65    }.  }.  if( ge
e2d0: 74 75 69 64 28 29 3d 3d 30 20 29 7b 0a 20 20 20  tuid()==0 ){.   
e2e0: 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c   Malfunction(__L
e2f0: 49 4e 45 5f 5f 2c 20 22 63 61 6e 6e 6f 74 20 72  INE__, "cannot r
e300: 75 6e 20 61 73 20 72 6f 6f 74 22 29 3b 0a 20 20  un as root");.  
e310: 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  }..  /* Get the 
e320: 49 50 20 61 64 64 72 65 73 73 20 66 72 6f 6d 20  IP address from 
e330: 77 68 65 6e 20 74 68 65 20 72 65 71 75 65 73 74  when the request
e340: 20 6f 72 69 67 69 6e 61 74 65 73 0a 20 20 2a 2f   originates.  */
e350: 0a 20 20 7b 0a 20 20 20 20 61 64 64 72 65 73 73  .  {.    address
e360: 20 72 65 6d 6f 74 65 41 64 64 72 3b 0a 20 20 20   remoteAddr;.   
e370: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 73 69   unsigned int si
e380: 7a 65 20 3d 20 73 69 7a 65 6f 66 28 72 65 6d 6f  ze = sizeof(remo
e390: 74 65 41 64 64 72 29 3b 0a 20 20 20 20 63 68 61  teAddr);.    cha
e3a0: 72 20 7a 48 6f 73 74 5b 4e 49 5f 4d 41 58 48 4f  r zHost[NI_MAXHO
e3b0: 53 54 5d 3b 0a 20 20 20 20 69 66 28 20 67 65 74  ST];.    if( get
e3c0: 70 65 65 72 6e 61 6d 65 28 30 2c 20 26 72 65 6d  peername(0, &rem
e3d0: 6f 74 65 41 64 64 72 2e 73 61 2c 20 26 73 69 7a  oteAddr.sa, &siz
e3e0: 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  e)>=0 ){.      g
e3f0: 65 74 6e 61 6d 65 69 6e 66 6f 28 26 72 65 6d 6f  etnameinfo(&remo
e400: 74 65 41 64 64 72 2e 73 61 2c 20 73 69 7a 65 2c  teAddr.sa, size,
e410: 20 7a 48 6f 73 74 2c 20 73 69 7a 65 6f 66 28 7a   zHost, sizeof(z
e420: 48 6f 73 74 29 2c 20 30 2c 20 30 2c 0a 20 20 20  Host), 0, 0,.   
e430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
e440: 49 5f 4e 55 4d 45 52 49 43 48 4f 53 54 29 3b 0a  I_NUMERICHOST);.
e450: 20 20 20 20 20 20 7a 52 65 6d 6f 74 65 41 64 64        zRemoteAdd
e460: 72 20 3d 20 53 74 72 44 75 70 28 7a 48 6f 73 74  r = StrDup(zHost
e470: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
e480: 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20 69  /* Process the i
e490: 6e 70 75 74 20 73 74 72 65 61 6d 20 2a 2f 0a 20  nput stream */. 
e4a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 30 30 3b   for(i=0; i<100;
e4b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 50 72 6f 63 65   i++){.    Proce
e4c0: 73 73 4f 6e 65 52 65 71 75 65 73 74 28 30 29 3b  ssOneRequest(0);
e4d0: 0a 20 20 7d 0a 20 20 50 72 6f 63 65 73 73 4f 6e  .  }.  ProcessOn
e4e0: 65 52 65 71 75 65 73 74 28 31 29 3b 0a 20 20 65  eRequest(1);.  e
e4f0: 78 69 74 28 30 29 3b 0a 7d 0a                    xit(0);.}.