Documentation Source Text

Hex Artifact Content
Login

Artifact 172fb473864072dee241e15479ea6e61dd691c03:


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 66 64 65   <netdb.h>.#ifde
0b40: 66 20 6c 69 6e 75 78 0a 23 69 6e 63 6c 75 64 65  f linux.#include
0b50: 20 3c 73 79 73 2f 73 65 6e 64 66 69 6c 65 2e 68   <sys/sendfile.h
0b60: 3e 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64  >.#endif.#includ
0b70: 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 2f 2a  e <assert.h>../*
0b80: 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 74 68  .** Configure th
0b90: 65 20 73 65 72 76 65 72 20 62 79 20 73 65 74 74  e server by sett
0ba0: 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
0bb0: 67 20 6d 61 63 72 6f 73 20 61 6e 64 20 72 65 63  g macros and rec
0bc0: 6f 6d 70 69 6c 69 6e 67 2e 0a 2a 2f 0a 23 69 66  ompiling..*/.#if
0bd0: 6e 64 65 66 20 44 45 46 41 55 4c 54 5f 50 4f 52  ndef DEFAULT_POR
0be0: 54 0a 23 64 65 66 69 6e 65 20 44 45 46 41 55 4c  T.#define DEFAUL
0bf0: 54 5f 50 4f 52 54 20 22 38 30 22 0a 23 65 6e 64  T_PORT "80".#end
0c00: 69 66 0a 23 69 66 6e 64 65 66 20 4d 41 58 5f 43  if.#ifndef MAX_C
0c10: 4f 4e 54 45 4e 54 5f 4c 45 4e 47 54 48 0a 23 64  ONTENT_LENGTH.#d
0c20: 65 66 69 6e 65 20 4d 41 58 5f 43 4f 4e 54 45 4e  efine MAX_CONTEN
0c30: 54 5f 4c 45 4e 47 54 48 20 39 30 30 30 30 30 30  T_LENGTH 9000000
0c40: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
0c50: 54 68 65 20 65 72 72 6f 72 20 6e 75 6d 62 65 72  The error number
0c60: 20 66 72 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c   from system cal
0c70: 6c 73 2e 0a 2a 2f 0a 65 78 74 65 72 6e 20 69 6e  ls..*/.extern in
0c80: 74 20 65 72 72 6e 6f 3b 0a 0a 2f 2a 0a 2a 2a 20  t errno;../*.** 
0c90: 57 65 20 72 65 63 6f 72 64 20 6d 6f 73 74 20 6f  We record most o
0ca0: 66 20 74 68 65 20 73 74 61 74 65 20 69 6e 66 6f  f the state info
0cb0: 72 6d 61 74 69 6f 6e 20 61 73 20 67 6c 6f 62 61  rmation as globa
0cc0: 6c 20 76 61 72 69 61 62 6c 65 73 2e 20 20 54 68  l variables.  Th
0cd0: 69 73 0a 2a 2a 20 73 61 76 65 73 20 68 61 76 69  is.** saves havi
0ce0: 6e 67 20 74 6f 20 70 61 73 73 20 69 6e 66 6f 72  ng to pass infor
0cf0: 6d 61 74 69 6f 6e 20 74 6f 20 73 75 62 72 6f 75  mation to subrou
0d00: 74 69 6e 65 73 20 61 73 20 70 61 72 61 6d 65 74  tines as paramet
0d10: 65 72 73 2c 20 61 6e 64 0a 2a 2a 20 6d 61 6b 65  ers, and.** make
0d20: 73 20 74 68 65 20 65 78 65 63 75 74 61 62 6c 65  s the executable
0d30: 20 73 6d 61 6c 6c 65 72 2e 2e 2e 0a 2a 2f 0a 73   smaller....*/.s
0d40: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 52 6f 6f  tatic char *zRoo
0d50: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
0d60: 2f 2a 20 52 6f 6f 74 20 64 69 72 65 63 74 6f 72  /* Root director
0d70: 79 20 6f 66 20 74 68 65 20 77 65 62 73 69 74 65  y of the website
0d80: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
0d90: 2a 7a 54 6d 70 4e 61 6d 20 3d 20 30 3b 20 20 20  *zTmpNam = 0;   
0da0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
0db0: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
0dc0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
0dd0: 7a 54 6d 70 4e 61 6d 42 75 66 5b 35 30 30 5d 3b  zTmpNamBuf[500];
0de0: 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f       /* Space to
0df0: 20 68 6f 6c 64 20 74 68 65 20 74 65 6d 70 6f 72   hold the tempor
0e00: 61 72 79 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a  ary filename */.
0e10: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 50 72  static char *zPr
0e20: 6f 74 6f 63 6f 6c 20 3d 20 30 3b 20 20 20 20 20  otocol = 0;     
0e30: 20 2f 2a 20 54 68 65 20 70 72 6f 74 6f 63 6f 6c   /* The protocol
0e40: 20 62 65 69 6e 67 20 75 73 69 6e 67 20 62 79 20   being using by 
0e50: 74 68 65 20 62 72 6f 77 73 65 72 20 2a 2f 0a 73  the browser */.s
0e60: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 4d 65 74  tatic char *zMet
0e70: 68 6f 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  hod = 0;        
0e80: 2f 2a 20 54 68 65 20 6d 65 74 68 6f 64 2e 20 20  /* The method.  
0e90: 4d 75 73 74 20 62 65 20 47 45 54 20 2a 2f 0a 73  Must be GET */.s
0ea0: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 53 63 72  tatic char *zScr
0eb0: 69 70 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ipt = 0;        
0ec0: 2f 2a 20 54 68 65 20 6f 62 6a 65 63 74 20 74 6f  /* The object to
0ed0: 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 73 74 61   retrieve */.sta
0ee0: 74 69 63 20 63 68 61 72 20 2a 7a 52 65 61 6c 53  tic char *zRealS
0ef0: 63 72 69 70 74 20 3d 20 30 3b 20 20 20 20 2f 2a  cript = 0;    /*
0f00: 20 54 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 72   The object to r
0f10: 65 74 72 69 65 76 65 2e 20 20 53 61 6d 65 20 61  etrieve.  Same a
0f20: 73 20 7a 53 63 72 69 70 74 0a 20 20 20 20 20 20  s zScript.      
0f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f40: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78             ** ex
0f50: 63 65 70 74 20 6d 69 67 68 74 20 68 61 76 65 20  cept might have 
0f60: 22 2f 69 6e 64 65 78 2e 68 74 6d 6c 22 20 61 70  "/index.html" ap
0f70: 70 65 6e 64 65 64 20 2a 2f 0a 73 74 61 74 69 63  pended */.static
0f80: 20 63 68 61 72 20 2a 7a 48 6f 6d 65 20 3d 20 30   char *zHome = 0
0f90: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
0fa0: 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74  e directory cont
0fb0: 61 69 6e 69 6e 67 20 63 6f 6e 74 65 6e 74 20 2a  aining content *
0fc0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a  /.static char *z
0fd0: 51 75 65 72 79 53 74 72 69 6e 67 20 3d 20 30 3b  QueryString = 0;
0fe0: 20 20 20 2f 2a 20 54 68 65 20 71 75 65 72 79 20     /* The query 
0ff0: 73 74 72 69 6e 67 20 6f 6e 20 74 68 65 20 65 6e  string on the en
1000: 64 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 2a 2f  d of the name */
1010: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 46  .static char *zF
1020: 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ile = 0;        
1030: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 6e 61 6d    /* The filenam
1040: 65 20 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 20  e of the object 
1050: 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 73  to retrieve */.s
1060: 74 61 74 69 63 20 69 6e 74 20 6c 65 6e 46 69 6c  tatic int lenFil
1070: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
1080: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65  /* Length of the
1090: 20 7a 46 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 73   zFile name */.s
10a0: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 44 69 72  tatic char *zDir
10b0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10c0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
10d0: 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 69 6e 67  irectory holding
10e0: 20 7a 46 69 6c 65 20 2a 2f 0a 73 74 61 74 69 63   zFile */.static
10f0: 20 63 68 61 72 20 2a 7a 50 61 74 68 49 6e 66 6f   char *zPathInfo
1100: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 50 61   = 0;      /* Pa
1110: 72 74 20 6f 66 20 74 68 65 20 70 61 74 68 6e 61  rt of the pathna
1120: 6d 65 20 70 61 73 74 20 74 68 65 20 66 69 6c 65  me past the file
1130: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
1140: 2a 7a 41 67 65 6e 74 20 3d 20 30 3b 20 20 20 20  *zAgent = 0;    
1150: 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 79 70       /* What typ
1160: 65 20 69 66 20 62 72 6f 77 73 65 72 20 69 73 20  e if browser is 
1170: 6d 61 6b 69 6e 67 20 74 68 69 73 20 71 75 65 72  making this quer
1180: 79 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  y */.static char
1190: 20 2a 7a 53 65 72 76 65 72 4e 61 6d 65 20 3d 20   *zServerName = 
11a0: 30 3b 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d  0;    /* The nam
11b0: 65 20 61 66 74 65 72 20 74 68 65 20 68 74 74 70  e after the http
11c0: 3a 2f 2f 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  :// */.static ch
11d0: 61 72 20 2a 7a 53 65 72 76 65 72 50 6f 72 74 20  ar *zServerPort 
11e0: 3d 20 30 3b 20 20 20 20 2f 2a 20 54 68 65 20 70  = 0;    /* The p
11f0: 6f 72 74 20 6e 75 6d 62 65 72 20 2a 2f 0a 73 74  ort number */.st
1200: 61 74 69 63 20 63 68 61 72 20 2a 7a 43 6f 6f 6b  atic char *zCook
1210: 69 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  ie = 0;        /
1220: 2a 20 43 6f 6f 6b 69 65 73 20 72 65 70 6f 72 74  * Cookies report
1230: 65 64 20 77 69 74 68 20 74 68 65 20 72 65 71 75  ed with the requ
1240: 65 73 74 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  est */.static ch
1250: 61 72 20 2a 7a 48 74 74 70 48 6f 73 74 20 3d 20  ar *zHttpHost = 
1260: 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  0;      /* Name 
1270: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
1280: 20 77 65 62 20 62 72 6f 77 73 65 72 20 2a 2f 0a   web browser */.
1290: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 52 65  static char *zRe
12a0: 61 6c 50 6f 72 74 20 3d 20 30 3b 20 20 20 20 20  alPort = 0;     
12b0: 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 54 43 50   /* The real TCP
12c0: 20 70 6f 72 74 20 77 68 65 6e 20 72 75 6e 6e 69   port when runni
12d0: 6e 67 20 61 73 20 64 61 65 6d 6f 6e 20 2a 2f 0a  ng as daemon */.
12e0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 52 65  static char *zRe
12f0: 6d 6f 74 65 41 64 64 72 20 3d 20 30 3b 20 20 20  moteAddr = 0;   
1300: 20 2f 2a 20 49 50 20 61 64 64 72 65 73 73 20 6f   /* IP address o
1310: 66 20 74 68 65 20 72 65 71 75 65 73 74 20 2a 2f  f the request */
1320: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 52  .static char *zR
1330: 65 66 65 72 65 72 20 3d 20 30 3b 20 20 20 20 20  eferer = 0;     
1340: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1350: 20 70 61 67 65 20 74 68 61 74 20 72 65 66 65 72   page that refer
1360: 65 64 20 74 6f 20 75 73 20 2a 2f 0a 73 74 61 74  ed to us */.stat
1370: 69 63 20 63 68 61 72 20 2a 7a 41 63 63 65 70 74  ic char *zAccept
1380: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
1390: 57 68 61 74 20 66 6f 72 6d 61 74 73 20 77 69 6c  What formats wil
13a0: 6c 20 62 65 20 61 63 63 65 70 74 65 64 20 2a 2f  l be accepted */
13b0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 43  .static char *zC
13c0: 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 20 3d 20 30  ontentLength = 0
13d0: 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6c 65 6e  ; /* Content len
13e0: 67 74 68 20 72 65 70 6f 72 74 65 64 20 69 6e 20  gth reported in 
13f0: 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 73 74  the header */.st
1400: 61 74 69 63 20 63 68 61 72 20 2a 7a 43 6f 6e 74  atic char *zCont
1410: 65 6e 74 54 79 70 65 20 3d 20 30 3b 20 20 20 2f  entType = 0;   /
1420: 2a 20 43 6f 6e 74 65 6e 74 20 74 79 70 65 20 72  * Content type r
1430: 65 70 6f 72 74 65 64 20 69 6e 20 74 68 65 20 68  eported in the h
1440: 65 61 64 65 72 20 2a 2f 0a 73 74 61 74 69 63 20  eader */.static 
1450: 63 68 61 72 20 2a 7a 51 75 65 72 79 53 75 66 66  char *zQuerySuff
1460: 69 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65  ix = 0;   /* The
1470: 20 70 61 72 74 20 6f 66 20 74 68 65 20 55 52 4c   part of the URL
1480: 20 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74   after the first
1490: 20 3f 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61   ? */.static cha
14a0: 72 20 2a 7a 41 75 74 68 54 79 70 65 20 3d 20 30  r *zAuthType = 0
14b0: 3b 20 20 20 20 20 20 2f 2a 20 41 75 74 68 6f 72  ;      /* Author
14c0: 69 7a 61 74 69 6f 6e 20 74 79 70 65 20 28 62 61  ization type (ba
14d0: 73 69 63 20 6f 72 20 64 69 67 65 73 74 29 20 2a  sic or digest) *
14e0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a  /.static char *z
14f0: 41 75 74 68 41 72 67 20 3d 20 30 3b 20 20 20 20  AuthArg = 0;    
1500: 20 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74     /* Authorizat
1510: 69 6f 6e 20 76 61 6c 75 65 73 20 2a 2f 0a 73 74  ion values */.st
1520: 61 74 69 63 20 63 68 61 72 20 2a 7a 52 65 6d 6f  atic char *zRemo
1530: 74 65 55 73 65 72 20 3d 20 30 3b 20 20 20 20 2f  teUser = 0;    /
1540: 2a 20 52 45 4d 4f 54 45 5f 55 53 45 52 20 73 65  * REMOTE_USER se
1550: 74 20 62 79 20 61 75 74 68 6f 72 69 7a 61 74 69  t by authorizati
1560: 6f 6e 20 6d 6f 64 75 6c 65 20 2a 2f 0a 73 74 61  on module */.sta
1570: 74 69 63 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b  tic int nIn = 0;
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1590: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
15a0: 20 6f 66 20 69 6e 70 75 74 20 2a 2f 0a 73 74 61   of input */.sta
15b0: 74 69 63 20 69 6e 74 20 6e 4f 75 74 20 3d 20 30  tic int nOut = 0
15c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
15d0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
15e0: 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 73 74   of output */.st
15f0: 61 74 69 63 20 63 68 61 72 20 7a 52 65 70 6c 79  atic char zReply
1600: 53 74 61 74 75 73 5b 34 5d 3b 20 20 20 20 20 2f  Status[4];     /
1610: 2a 20 52 65 70 6c 79 20 73 74 61 74 75 73 20 63  * Reply status c
1620: 6f 64 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ode */.static in
1630: 74 20 73 74 61 74 75 73 53 65 6e 74 20 3d 20 30  t statusSent = 0
1640: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
1650: 61 66 74 65 72 20 73 74 61 74 75 73 20 6c 69 6e  after status lin
1660: 65 20 69 73 20 73 65 6e 74 20 2a 2f 0a 73 74 61  e is sent */.sta
1670: 74 69 63 20 63 68 61 72 20 2a 7a 4c 6f 67 46 69  tic char *zLogFi
1680: 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  le = 0;       /*
1690: 20 4c 6f 67 20 74 6f 20 74 68 69 73 20 66 69 6c   Log to this fil
16a0: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
16b0: 64 65 62 75 67 46 6c 61 67 20 3d 20 30 3b 20 20  debugFlag = 0;  
16c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
16d0: 20 62 65 69 6e 67 20 64 65 62 75 67 67 65 64 20   being debugged 
16e0: 2a 2f 0a 73 74 61 74 69 63 20 74 69 6d 65 5f 74  */.static time_t
16f0: 20 62 65 67 69 6e 54 69 6d 65 3b 20 20 20 20 20   beginTime;     
1700: 20 20 20 20 2f 2a 20 54 69 6d 65 20 77 68 65 6e      /* Time when
1710: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 73 74   this process st
1720: 61 72 74 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  arts */.static i
1730: 6e 74 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69  nt closeConnecti
1740: 6f 6e 20 3d 20 30 3b 20 20 2f 2a 20 54 72 75 65  on = 0;  /* True
1750: 20 74 6f 20 73 65 6e 64 20 43 6f 6e 6e 65 63 74   to send Connect
1760: 69 6f 6e 3a 20 63 6c 6f 73 65 20 69 6e 20 72 65  ion: close in re
1770: 70 6c 79 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ply */.static in
1780: 74 20 6e 52 65 71 75 65 73 74 20 3d 20 30 3b 20  t nRequest = 0; 
1790: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
17a0: 72 20 6f 66 20 72 65 71 75 65 73 74 73 20 70 72  r of requests pr
17b0: 6f 63 65 73 73 65 64 20 2a 2f 0a 73 74 61 74 69  ocessed */.stati
17c0: 63 20 69 6e 74 20 6f 6d 69 74 4c 6f 67 20 3d 20  c int omitLog = 
17d0: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  0;          /* D
17e0: 6f 20 6e 6f 74 20 6d 61 6b 65 20 6c 6f 67 66 69  o not make logfi
17f0: 6c 65 20 65 6e 74 72 69 65 73 20 69 66 20 74 72  le entries if tr
1800: 75 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ue */.static int
1810: 20 75 73 65 48 74 74 70 73 20 3d 20 30 3b 20 20   useHttps = 0;  
1820: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
1830: 6f 20 75 73 65 20 48 54 54 50 53 3a 20 69 6e 73  o use HTTPS: ins
1840: 74 65 61 64 20 6f 66 20 48 54 54 50 3a 20 2a 2f  tead of HTTP: */
1850: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 48  .static char *zH
1860: 74 74 70 20 3d 20 22 68 74 74 70 22 3b 20 20 20  ttp = "http";   
1870: 20 20 2f 2a 20 68 74 74 70 20 6f 72 20 68 74 74    /* http or htt
1880: 70 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ps */.static int
1890: 20 75 73 65 54 69 6d 65 6f 75 74 20 3d 20 31 3b   useTimeout = 1;
18a0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
18b0: 6f 20 75 73 65 20 74 69 6d 65 73 20 2a 2f 0a 0a  o use times */..
18c0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 65 76 65  /*.** Change eve
18d0: 72 79 20 73 70 61 63 65 20 6f 72 20 75 6e 70 72  ry space or unpr
18e0: 69 6e 74 61 62 6c 65 20 63 68 61 72 61 63 74 65  intable characte
18f0: 72 20 69 6e 20 74 68 65 20 7a 41 67 65 6e 74 5b  r in the zAgent[
1900: 5d 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 74 6f  ] string.** into
1910: 20 61 6e 20 5f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   an _..**.** If 
1920: 74 68 65 20 75 73 65 72 20 61 67 65 6e 74 20 73  the user agent s
1930: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 63  tring contains c
1940: 65 72 74 61 69 6e 20 70 72 6f 68 69 62 69 74 65  ertain prohibite
1950: 64 20 73 74 72 69 6e 67 2c 20 74 68 65 6e 0a 2a  d string, then.*
1960: 2a 20 65 78 69 74 20 69 6d 6d 65 64 69 61 74 65  * exit immediate
1970: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
1980: 69 64 20 46 69 78 75 70 55 73 65 72 41 67 65 6e  id FixupUserAgen
1990: 74 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69  t(void){.  int i
19a0: 3b 0a 20 20 69 66 28 20 7a 41 67 65 6e 74 3d 3d  ;.  if( zAgent==
19b0: 30 20 7c 7c 20 7a 41 67 65 6e 74 5b 30 5d 3d 3d  0 || zAgent[0]==
19c0: 30 20 29 20 7a 41 67 65 6e 74 20 3d 20 22 2a 22  0 ) zAgent = "*"
19d0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 41 67  ;.  for(i=0; zAg
19e0: 65 6e 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ent[i]; i++){.  
19f0: 20 20 69 6e 74 20 63 20 3d 20 7a 41 67 65 6e 74    int c = zAgent
1a00: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 63 3c 27  [i];.    if( c<'
1a10: 21 27 20 7c 7c 20 63 3e 27 7e 27 20 20 29 7b 20  !' || c>'~'  ){ 
1a20: 7a 41 67 65 6e 74 5b 69 5d 20 3d 20 27 5f 27 3b  zAgent[i] = '_';
1a30: 20 7d 0a 20 20 7d 0a 23 69 66 20 30 0a 20 20 69   }.  }.#if 0.  i
1a40: 66 28 20 73 74 72 6e 63 6d 70 28 7a 41 67 65 6e  f( strncmp(zAgen
1a50: 74 2c 22 6d 73 6e 62 6f 74 22 2c 36 29 3d 3d 30  t,"msnbot",6)==0
1a60: 20 29 7b 0a 20 20 20 20 65 78 69 74 28 30 29 3b   ){.    exit(0);
1a70: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f  .  }.#endif.  fo
1a80: 72 28 69 3d 30 3b 20 7a 41 67 65 6e 74 5b 69 5d  r(i=0; zAgent[i]
1a90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1aa0: 7a 41 67 65 6e 74 5b 69 5d 3d 3d 27 57 27 20 26  zAgent[i]=='W' &
1ab0: 26 20 73 74 72 6e 63 6d 70 28 26 7a 41 67 65 6e  & strncmp(&zAgen
1ac0: 74 5b 69 5d 2c 22 57 69 6e 64 6f 77 73 5f 39 22  t[i],"Windows_9"
1ad0: 2c 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,9)==0 ){.      
1ae0: 65 78 69 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20  exit(0);.    }. 
1af0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
1b00: 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
1b10: 20 6c 6f 67 20 66 69 6c 65 2e 20 20 49 66 20 74   log file.  If t
1b20: 68 65 20 48 54 54 50 20 63 6f 6e 6e 65 63 74 69  he HTTP connecti
1b30: 6f 6e 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20  on should be.** 
1b40: 63 6c 6f 73 65 64 2c 20 74 68 65 6e 20 74 65 72  closed, then ter
1b50: 6d 69 6e 61 74 65 20 74 68 69 73 20 70 72 6f 63  minate this proc
1b60: 65 73 73 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ess.  Otherwise 
1b70: 72 65 74 75 72 6e 2e 0a 2a 2f 0a 73 74 61 74 69  return..*/.stati
1b80: 63 20 76 6f 69 64 20 4d 61 6b 65 4c 6f 67 45 6e  c void MakeLogEn
1b90: 74 72 79 28 69 6e 74 20 61 29 7b 0a 20 20 46 49  try(int a){.  FI
1ba0: 4c 45 20 2a 6c 6f 67 3b 0a 20 20 69 66 28 20 7a  LE *log;.  if( z
1bb0: 54 6d 70 4e 61 6d 20 29 7b 0a 20 20 20 20 75 6e  TmpNam ){.    un
1bc0: 6c 69 6e 6b 28 7a 54 6d 70 4e 61 6d 29 3b 0a 20  link(zTmpNam);. 
1bd0: 20 7d 0a 20 20 69 66 28 20 7a 4c 6f 67 46 69 6c   }.  if( zLogFil
1be0: 65 20 26 26 20 21 6f 6d 69 74 4c 6f 67 20 29 7b  e && !omitLog ){
1bf0: 0a 20 20 20 20 74 69 6d 65 5f 74 20 6e 6f 77 3b  .    time_t now;
1c00: 0a 20 20 20 20 73 74 72 75 63 74 20 74 6d 20 2a  .    struct tm *
1c10: 70 54 6d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  pTm;.    struct 
1c20: 74 6d 73 20 73 54 6d 73 3b 0a 20 20 20 20 64 6f  tms sTms;.    do
1c30: 75 62 6c 65 20 72 53 63 61 6c 65 3b 0a 20 20 20  uble rScale;.   
1c40: 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72   int i;.    char
1c50: 20 7a 44 61 74 65 5b 32 30 30 5d 3b 0a 20 20 20   zDate[200];.   
1c60: 20 63 68 61 72 20 2a 7a 52 4d 20 3d 20 7a 52 65   char *zRM = zRe
1c70: 6d 6f 74 65 55 73 65 72 20 3f 20 7a 52 65 6d 6f  moteUser ? zRemo
1c80: 74 65 55 73 65 72 20 3a 20 22 2a 22 3b 0a 0a 20  teUser : "*";.. 
1c90: 20 20 20 69 66 28 20 7a 53 63 72 69 70 74 3d 3d     if( zScript==
1ca0: 30 20 7c 7c 20 7a 53 63 72 69 70 74 5b 30 5d 3d  0 || zScript[0]=
1cb0: 3d 30 20 29 20 7a 53 63 72 69 70 74 20 3d 20 22  =0 ) zScript = "
1cc0: 2a 22 3b 0a 20 20 20 20 69 66 28 20 7a 52 65 6d  *";.    if( zRem
1cd0: 6f 74 65 41 64 64 72 3d 3d 30 20 7c 7c 20 7a 52  oteAddr==0 || zR
1ce0: 65 6d 6f 74 65 41 64 64 72 5b 30 5d 3d 3d 30 20  emoteAddr[0]==0 
1cf0: 29 20 7a 52 65 6d 6f 74 65 41 64 64 72 20 3d 20  ) zRemoteAddr = 
1d00: 22 2a 22 3b 0a 20 20 20 20 69 66 28 20 7a 48 74  "*";.    if( zHt
1d10: 74 70 48 6f 73 74 3d 3d 30 20 7c 7c 20 7a 48 74  tpHost==0 || zHt
1d20: 74 70 48 6f 73 74 5b 30 5d 3d 3d 30 20 29 20 7a  tpHost[0]==0 ) z
1d30: 48 74 74 70 48 6f 73 74 20 3d 20 22 2a 22 3b 0a  HttpHost = "*";.
1d40: 20 20 20 20 69 66 28 20 7a 52 65 66 65 72 65 72      if( zReferer
1d50: 3d 3d 30 20 7c 7c 20 7a 52 65 66 65 72 65 72 5b  ==0 || zReferer[
1d60: 30 5d 3d 3d 30 20 29 20 7a 52 65 66 65 72 65 72  0]==0 ) zReferer
1d70: 20 3d 20 22 2a 22 3b 0a 20 20 20 20 66 6f 72 28   = "*";.    for(
1d80: 69 3d 30 3b 20 7a 52 65 66 65 72 65 72 5b 69 5d  i=0; zReferer[i]
1d90: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69  ; i++){ .      i
1da0: 66 28 20 69 73 73 70 61 63 65 28 7a 52 65 66 65  f( isspace(zRefe
1db0: 72 65 72 5b 69 5d 29 20 29 7b 20 7a 52 65 66 65  rer[i]) ){ zRefe
1dc0: 72 65 72 20 3d 20 22 2a 22 3b 20 62 72 65 61 6b  rer = "*"; break
1dd0: 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ; }.    }.    if
1de0: 28 20 7a 41 67 65 6e 74 3d 3d 30 20 7c 7c 20 7a  ( zAgent==0 || z
1df0: 41 67 65 6e 74 5b 30 5d 3d 3d 30 20 29 20 7a 41  Agent[0]==0 ) zA
1e00: 67 65 6e 74 20 3d 20 22 2a 22 3b 0a 20 20 20 20  gent = "*";.    
1e10: 74 69 6d 65 28 26 6e 6f 77 29 3b 0a 20 20 20 20  time(&now);.    
1e20: 70 54 6d 20 3d 20 6c 6f 63 61 6c 74 69 6d 65 28  pTm = localtime(
1e30: 26 6e 6f 77 29 3b 0a 20 20 20 20 73 74 72 66 74  &now);.    strft
1e40: 69 6d 65 28 7a 44 61 74 65 2c 20 73 69 7a 65 6f  ime(zDate, sizeo
1e50: 66 28 7a 44 61 74 65 29 2c 20 22 25 59 2d 25 6d  f(zDate), "%Y-%m
1e60: 2d 25 64 20 25 48 3a 25 4d 3a 25 53 22 2c 20 70  -%d %H:%M:%S", p
1e70: 54 6d 29 3b 0a 20 20 20 20 74 69 6d 65 73 28 26  Tm);.    times(&
1e80: 73 54 6d 73 29 3b 0a 20 20 20 20 72 53 63 61 6c  sTms);.    rScal
1e90: 65 20 3d 20 31 2e 30 2f 28 64 6f 75 62 6c 65 29  e = 1.0/(double)
1ea0: 73 79 73 63 6f 6e 66 28 5f 53 43 5f 43 4c 4b 5f  sysconf(_SC_CLK_
1eb0: 54 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 28 6c  TCK);.    if( (l
1ec0: 6f 67 20 3d 20 66 6f 70 65 6e 28 7a 4c 6f 67 46  og = fopen(zLogF
1ed0: 69 6c 65 2c 22 61 22 29 29 21 3d 30 20 29 7b 0a  ile,"a"))!=0 ){.
1ee0: 23 69 66 64 65 66 20 43 4f 4d 42 49 4e 45 44 5f  #ifdef COMBINED_
1ef0: 4c 4f 47 5f 46 4f 52 4d 41 54 0a 20 20 20 20 20  LOG_FORMAT.     
1f00: 20 73 74 72 66 74 69 6d 65 28 7a 44 61 74 65 2c   strftime(zDate,
1f10: 20 73 69 7a 65 6f 66 28 7a 44 61 74 65 29 2c 20   sizeof(zDate), 
1f20: 22 25 64 2f 25 62 2f 25 59 3a 25 48 3a 25 4d 3a  "%d/%b/%Y:%H:%M:
1f30: 25 53 20 25 7a 22 2c 20 70 54 6d 29 3b 0a 20 20  %S %z", pTm);.  
1f40: 20 20 20 20 66 70 72 69 6e 74 66 28 6c 6f 67 2c      fprintf(log,
1f50: 20 22 25 73 20 2d 20 2d 20 5b 25 73 5d 20 5c 22   "%s - - [%s] \"
1f60: 25 73 20 25 73 20 25 73 5c 22 20 25 73 20 25 64  %s %s %s\" %s %d
1f70: 20 5c 22 25 73 5c 22 20 5c 22 25 73 5c 22 5c 6e   \"%s\" \"%s\"\n
1f80: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1f90: 20 7a 52 65 6d 6f 74 65 41 64 64 72 2c 20 7a 44   zRemoteAddr, zD
1fa0: 61 74 65 2c 20 7a 4d 65 74 68 6f 64 2c 20 7a 53  ate, zMethod, zS
1fb0: 63 72 69 70 74 2c 20 7a 50 72 6f 74 6f 63 6f 6c  cript, zProtocol
1fc0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1fd0: 7a 52 65 70 6c 79 53 74 61 74 75 73 2c 20 6e 4f  zReplyStatus, nO
1fe0: 75 74 2c 20 7a 52 65 66 65 72 65 72 2c 20 7a 41  ut, zReferer, zA
1ff0: 67 65 6e 74 29 3b 0a 23 65 6c 73 65 0a 20 20 20  gent);.#else.   
2000: 20 20 20 73 74 72 66 74 69 6d 65 28 7a 44 61 74     strftime(zDat
2010: 65 2c 20 73 69 7a 65 6f 66 28 7a 44 61 74 65 29  e, sizeof(zDate)
2020: 2c 20 22 25 59 2d 25 6d 2d 25 64 20 25 48 3a 25  , "%Y-%m-%d %H:%
2030: 4d 3a 25 53 22 2c 20 70 54 6d 29 3b 0a 20 20 20  M:%S", pTm);.   
2040: 20 20 20 66 70 72 69 6e 74 66 28 6c 6f 67 2c 20     fprintf(log, 
2050: 22 25 73 20 25 73 20 25 73 3a 2f 2f 25 73 25 73  "%s %s %s://%s%s
2060: 20 25 73 20 25 73 20 25 64 20 25 64 20 25 67 20   %s %s %d %d %g 
2070: 25 67 20 25 67 20 25 67 20 25 64 20 25 64 20 25  %g %g %g %d %d %
2080: 73 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20  s %s\n", .      
2090: 20 20 20 20 7a 44 61 74 65 2c 20 7a 52 65 6d 6f      zDate, zRemo
20a0: 74 65 41 64 64 72 2c 20 7a 48 74 74 70 2c 20 7a  teAddr, zHttp, z
20b0: 48 74 74 70 48 6f 73 74 2c 20 7a 53 63 72 69 70  HttpHost, zScrip
20c0: 74 2c 20 7a 52 65 66 65 72 65 72 2c 0a 20 20 20  t, zReferer,.   
20d0: 20 20 20 20 20 20 20 7a 52 65 70 6c 79 53 74 61         zReplySta
20e0: 74 75 73 2c 20 6e 49 6e 2c 20 6e 4f 75 74 2c 0a  tus, nIn, nOut,.
20f0: 20 20 20 20 20 20 20 20 20 20 72 53 63 61 6c 65            rScale
2100: 2a 73 54 6d 73 2e 74 6d 73 5f 75 74 69 6d 65 2c  *sTms.tms_utime,
2110: 0a 20 20 20 20 20 20 20 20 20 20 72 53 63 61 6c  .          rScal
2120: 65 2a 73 54 6d 73 2e 74 6d 73 5f 73 74 69 6d 65  e*sTms.tms_stime
2130: 2c 0a 20 20 20 20 20 20 20 20 20 20 72 53 63 61  ,.          rSca
2140: 6c 65 2a 73 54 6d 73 2e 74 6d 73 5f 63 75 74 69  le*sTms.tms_cuti
2150: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 72 53  me,.          rS
2160: 63 61 6c 65 2a 73 54 6d 73 2e 74 6d 73 5f 63 73  cale*sTms.tms_cs
2170: 74 69 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  time,.          
2180: 28 69 6e 74 29 28 6e 6f 77 20 2d 20 62 65 67 69  (int)(now - begi
2190: 6e 54 69 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  nTime),.        
21a0: 20 20 6e 52 65 71 75 65 73 74 2c 20 7a 41 67 65    nRequest, zAge
21b0: 6e 74 2c 20 7a 52 4d 0a 20 20 20 20 20 20 29 3b  nt, zRM.      );
21c0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 63  .#endif.      fc
21d0: 6c 6f 73 65 28 6c 6f 67 29 3b 0a 20 20 20 20 20  lose(log);.     
21e0: 20 6e 49 6e 20 3d 20 6e 4f 75 74 20 3d 20 30 3b   nIn = nOut = 0;
21f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2200: 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e   closeConnection
2210: 20 29 7b 0a 20 20 20 20 65 78 69 74 28 61 29 3b   ){.    exit(a);
2220: 0a 20 20 7d 0a 20 20 73 74 61 74 75 73 53 65 6e  .  }.  statusSen
2230: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
2240: 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
2250: 73 61 66 65 6c 79 0a 2a 2f 0a 73 74 61 74 69 63  safely.*/.static
2260: 20 63 68 61 72 20 2a 53 61 66 65 4d 61 6c 6c 6f   char *SafeMallo
2270: 63 28 20 69 6e 74 20 73 69 7a 65 20 29 7b 0a 20  c( int size ){. 
2280: 20 63 68 61 72 20 2a 70 3b 0a 0a 20 20 70 20 3d   char *p;..  p =
2290: 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 73   (char*)malloc(s
22a0: 69 7a 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ize);.  if( p==0
22b0: 20 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28 7a   ){.    strcpy(z
22c0: 52 65 70 6c 79 53 74 61 74 75 73 2c 20 22 39 39  ReplyStatus, "99
22d0: 38 22 29 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f 67  8");.    MakeLog
22e0: 45 6e 74 72 79 28 31 29 3b 0a 20 20 20 20 65 78  Entry(1);.    ex
22f0: 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  it(1);.  }.  ret
2300: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
2310: 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  Set the value of
2320: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
2330: 69 61 62 6c 65 20 7a 56 61 72 20 74 6f 20 7a 56  iable zVar to zV
2340: 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
2350: 76 6f 69 64 20 53 65 74 45 6e 76 28 63 6f 6e 73  void SetEnv(cons
2360: 74 20 63 68 61 72 20 2a 7a 56 61 72 2c 20 63 6f  t char *zVar, co
2370: 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 75 65  nst char *zValue
2380: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
2390: 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 66 28 20 7a  int len;.  if( z
23a0: 56 61 6c 75 65 3d 3d 30 20 29 20 7a 56 61 6c 75  Value==0 ) zValu
23b0: 65 3d 22 22 3b 0a 20 20 6c 65 6e 20 3d 20 73 74  e="";.  len = st
23c0: 72 6c 65 6e 28 7a 56 61 72 29 20 2b 20 73 74 72  rlen(zVar) + str
23d0: 6c 65 6e 28 7a 56 61 6c 75 65 29 20 2b 20 32 3b  len(zValue) + 2;
23e0: 0a 20 20 7a 20 3d 20 53 61 66 65 4d 61 6c 6c 6f  .  z = SafeMallo
23f0: 63 28 6c 65 6e 29 3b 0a 20 20 73 70 72 69 6e 74  c(len);.  sprint
2400: 66 28 7a 2c 22 25 73 3d 25 73 22 2c 7a 56 61 72  f(z,"%s=%s",zVar
2410: 2c 7a 56 61 6c 75 65 29 3b 0a 20 20 70 75 74 65  ,zValue);.  pute
2420: 6e 76 28 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nv(z);.}../*.** 
2430: 52 65 6d 6f 76 65 20 74 68 65 20 66 69 72 73 74  Remove the first
2440: 20 73 70 61 63 65 2d 64 65 6c 69 6d 69 74 65 64   space-delimited
2450: 20 74 6f 6b 65 6e 20 66 72 6f 6d 20 61 20 73 74   token from a st
2460: 72 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 0a  ring and return.
2470: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
2480: 69 74 2e 20 20 41 64 64 20 61 20 4e 55 4c 4c 20  it.  Add a NULL 
2490: 74 6f 20 74 68 65 20 73 74 72 69 6e 67 20 74 6f  to the string to
24a0: 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 74   terminate the t
24b0: 6f 6b 65 6e 2e 0a 2a 2a 20 4d 61 6b 65 20 2a 7a  oken..** Make *z
24c0: 4c 65 66 74 4f 76 65 72 20 70 6f 69 6e 74 20 74  LeftOver point t
24d0: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
24e0: 68 65 20 6e 65 78 74 20 74 6f 6b 65 6e 2e 0a 2a  he next token..*
24f0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 47  /.static char *G
2500: 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28 63  etFirstElement(c
2510: 68 61 72 20 2a 7a 49 6e 70 75 74 2c 20 63 68 61  har *zInput, cha
2520: 72 20 2a 2a 7a 4c 65 66 74 4f 76 65 72 29 7b 0a  r **zLeftOver){.
2530: 20 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 20    char *zResult 
2540: 3d 20 30 3b 0a 20 20 69 66 28 20 7a 49 6e 70 75  = 0;.  if( zInpu
2550: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  t==0 ){.    if( 
2560: 7a 4c 65 66 74 4f 76 65 72 20 29 20 2a 7a 4c 65  zLeftOver ) *zLe
2570: 66 74 4f 76 65 72 20 3d 20 30 3b 0a 20 20 20 20  ftOver = 0;.    
2580: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
2590: 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a  while( isspace(*
25a0: 7a 49 6e 70 75 74 29 20 29 7b 20 7a 49 6e 70 75  zInput) ){ zInpu
25b0: 74 2b 2b 3b 20 7d 0a 20 20 7a 52 65 73 75 6c 74  t++; }.  zResult
25c0: 20 3d 20 7a 49 6e 70 75 74 3b 0a 20 20 77 68 69   = zInput;.  whi
25d0: 6c 65 28 20 2a 7a 49 6e 70 75 74 20 26 26 20 21  le( *zInput && !
25e0: 69 73 73 70 61 63 65 28 2a 7a 49 6e 70 75 74 29  isspace(*zInput)
25f0: 20 29 7b 20 7a 49 6e 70 75 74 2b 2b 3b 20 7d 0a   ){ zInput++; }.
2600: 20 20 69 66 28 20 2a 7a 49 6e 70 75 74 20 29 7b    if( *zInput ){
2610: 0a 20 20 20 20 2a 7a 49 6e 70 75 74 20 3d 20 30  .    *zInput = 0
2620: 3b 0a 20 20 20 20 7a 49 6e 70 75 74 2b 2b 3b 0a  ;.    zInput++;.
2630: 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61      while( isspa
2640: 63 65 28 2a 7a 49 6e 70 75 74 29 20 29 7b 20 7a  ce(*zInput) ){ z
2650: 49 6e 70 75 74 2b 2b 3b 20 7d 0a 20 20 7d 0a 20  Input++; }.  }. 
2660: 20 69 66 28 20 7a 4c 65 66 74 4f 76 65 72 20 29   if( zLeftOver )
2670: 7b 20 2a 7a 4c 65 66 74 4f 76 65 72 20 3d 20 7a  { *zLeftOver = z
2680: 49 6e 70 75 74 3b 20 7d 0a 20 20 72 65 74 75 72  Input; }.  retur
2690: 6e 20 7a 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a  n zResult;.}../*
26a0: 0a 2a 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20  .** Make a copy 
26b0: 6f 66 20 61 20 73 74 72 69 6e 67 20 69 6e 74 6f  of a string into
26c0: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
26d0: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f   from malloc..*/
26e0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 53 74  .static char *St
26f0: 72 44 75 70 28 63 6f 6e 73 74 20 63 68 61 72 20  rDup(const char 
2700: 2a 7a 53 72 63 29 7b 0a 20 20 63 68 61 72 20 2a  *zSrc){.  char *
2710: 7a 44 65 73 74 3b 0a 20 20 69 6e 74 20 73 69 7a  zDest;.  int siz
2720: 65 3b 0a 0a 20 20 69 66 28 20 7a 53 72 63 3d 3d  e;..  if( zSrc==
2730: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
2740: 73 69 7a 65 20 3d 20 73 74 72 6c 65 6e 28 7a 53  size = strlen(zS
2750: 72 63 29 20 2b 20 31 3b 0a 20 20 7a 44 65 73 74  rc) + 1;.  zDest
2760: 20 3d 20 28 63 68 61 72 2a 29 53 61 66 65 4d 61   = (char*)SafeMa
2770: 6c 6c 6f 63 28 20 73 69 7a 65 20 29 3b 0a 20 20  lloc( size );.  
2780: 73 74 72 63 70 79 28 7a 44 65 73 74 2c 7a 53 72  strcpy(zDest,zSr
2790: 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 44 65  c);.  return zDe
27a0: 73 74 3b 0a 7d 0a 73 74 61 74 69 63 20 63 68 61  st;.}.static cha
27b0: 72 20 2a 53 74 72 41 70 70 65 6e 64 28 63 68 61  r *StrAppend(cha
27c0: 72 20 2a 7a 50 72 69 6f 72 2c 20 63 6f 6e 73 74  r *zPrior, const
27d0: 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 63 6f 6e   char *zSep, con
27e0: 73 74 20 63 68 61 72 20 2a 7a 53 72 63 29 7b 0a  st char *zSrc){.
27f0: 20 20 63 68 61 72 20 2a 7a 44 65 73 74 3b 0a 20    char *zDest;. 
2800: 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 69 6e 74   int size;.  int
2810: 20 6e 31 2c 20 6e 32 3b 0a 0a 20 20 69 66 28 20   n1, n2;..  if( 
2820: 7a 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  zSrc==0 ) return
2830: 20 30 3b 0a 20 20 69 66 28 20 7a 50 72 69 6f 72   0;.  if( zPrior
2840: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 74 72  ==0 ) return Str
2850: 44 75 70 28 7a 53 72 63 29 3b 0a 20 20 73 69 7a  Dup(zSrc);.  siz
2860: 65 20 3d 20 28 6e 31 3d 73 74 72 6c 65 6e 28 7a  e = (n1=strlen(z
2870: 53 72 63 29 29 20 2b 20 28 6e 32 3d 73 74 72 6c  Src)) + (n2=strl
2880: 65 6e 28 7a 53 65 70 29 29 20 2b 20 73 74 72 6c  en(zSep)) + strl
2890: 65 6e 28 7a 50 72 69 6f 72 29 20 2b 20 31 3b 0a  en(zPrior) + 1;.
28a0: 20 20 7a 44 65 73 74 20 3d 20 28 63 68 61 72 2a    zDest = (char*
28b0: 29 53 61 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  )SafeMalloc( siz
28c0: 65 20 29 3b 0a 20 20 73 74 72 63 70 79 28 7a 44  e );.  strcpy(zD
28d0: 65 73 74 2c 7a 50 72 69 6f 72 29 3b 0a 20 20 66  est,zPrior);.  f
28e0: 72 65 65 28 7a 50 72 69 6f 72 29 3b 0a 20 20 73  ree(zPrior);.  s
28f0: 74 72 63 70 79 28 26 7a 44 65 73 74 5b 6e 31 5d  trcpy(&zDest[n1]
2900: 2c 7a 53 65 70 29 3b 0a 20 20 73 74 72 63 70 79  ,zSep);.  strcpy
2910: 28 26 7a 44 65 73 74 5b 6e 31 2b 6e 32 5d 2c 7a  (&zDest[n1+n2],z
2920: 53 72 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  Src);.  return z
2930: 44 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  Dest;.}../*.** B
2940: 72 65 61 6b 20 61 20 6c 69 6e 65 20 61 74 20 74  reak a line at t
2950: 68 65 20 66 69 72 73 74 20 5c 6e 20 6f 72 20 5c  he first \n or \
2960: 72 20 63 68 61 72 61 63 74 65 72 20 73 65 65 6e  r character seen
2970: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2980: 20 52 65 6d 6f 76 65 4e 65 77 6c 69 6e 65 28 63   RemoveNewline(c
2990: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 7a  har *z){.  if( z
29a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
29b0: 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 2a 7a 21  while( *z && *z!
29c0: 3d 27 5c 6e 27 20 26 26 20 2a 7a 21 3d 27 5c 72  ='\n' && *z!='\r
29d0: 27 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 2a 7a  ' ){ z++; }.  *z
29e0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50   = 0;.}../*.** P
29f0: 72 69 6e 74 20 61 20 64 61 74 65 20 74 61 67 20  rint a date tag 
2a00: 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 20  in the header.  
2a10: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
2a20: 74 61 67 20 69 73 20 7a 54 61 67 2e 0a 2a 2a 20  tag is zTag..** 
2a30: 54 68 65 20 64 61 74 65 20 69 73 20 64 65 74 65  The date is dete
2a40: 72 6d 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20  rmined from the 
2a50: 75 6e 69 78 20 74 69 6d 65 73 74 61 6d 70 20 67  unix timestamp g
2a60: 69 76 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iven..*/.static 
2a70: 69 6e 74 20 44 61 74 65 54 61 67 28 63 6f 6e 73  int DateTag(cons
2a80: 74 20 63 68 61 72 20 2a 7a 54 61 67 2c 20 74 69  t char *zTag, ti
2a90: 6d 65 5f 74 20 74 29 7b 0a 20 20 73 74 72 75 63  me_t t){.  struc
2aa0: 74 20 74 6d 20 2a 74 6d 3b 0a 20 20 63 68 61 72  t tm *tm;.  char
2ab0: 20 7a 44 61 74 65 5b 31 30 30 5d 3b 0a 20 20 74   zDate[100];.  t
2ac0: 6d 20 3d 20 67 6d 74 69 6d 65 28 26 74 29 3b 0a  m = gmtime(&t);.
2ad0: 20 20 73 74 72 66 74 69 6d 65 28 7a 44 61 74 65    strftime(zDate
2ae0: 2c 20 73 69 7a 65 6f 66 28 7a 44 61 74 65 29 2c  , sizeof(zDate),
2af0: 20 22 25 61 2c 20 25 64 20 20 25 62 20 25 59 20   "%a, %d  %b %Y 
2b00: 25 48 3a 25 4d 3a 25 53 20 25 7a 22 2c 20 74 6d  %H:%M:%S %z", tm
2b10: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 72 69 6e  );.  return prin
2b20: 74 66 28 22 25 73 3a 20 25 73 5c 72 5c 6e 22 2c  tf("%s: %s\r\n",
2b30: 20 7a 54 61 67 2c 20 7a 44 61 74 65 29 3b 0a 7d   zTag, zDate);.}
2b40: 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68  ../*.** Print th
2b50: 65 20 66 69 72 73 74 20 6c 69 6e 65 20 6f 66 20  e first line of 
2b60: 61 20 72 65 73 70 6f 6e 73 65 20 66 6f 6c 6c 6f  a response follo
2b70: 77 65 64 20 62 79 20 74 68 65 20 73 65 72 76 65  wed by the serve
2b80: 72 20 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69  r type..*/.stati
2b90: 63 20 76 6f 69 64 20 53 74 61 72 74 52 65 73 70  c void StartResp
2ba0: 6f 6e 73 65 28 63 6f 6e 73 74 20 63 68 61 72 20  onse(const char 
2bb0: 2a 7a 52 65 73 75 6c 74 43 6f 64 65 29 7b 0a 20  *zResultCode){. 
2bc0: 20 74 69 6d 65 5f 74 20 6e 6f 77 3b 0a 20 20 74   time_t now;.  t
2bd0: 69 6d 65 28 26 6e 6f 77 29 3b 0a 20 20 69 66 28  ime(&now);.  if(
2be0: 20 73 74 61 74 75 73 53 65 6e 74 20 29 20 72 65   statusSent ) re
2bf0: 74 75 72 6e 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20  turn;.  nOut += 
2c00: 70 72 69 6e 74 66 28 22 25 73 20 25 73 5c 72 5c  printf("%s %s\r\
2c10: 6e 22 2c 20 7a 50 72 6f 74 6f 63 6f 6c 2c 20 7a  n", zProtocol, z
2c20: 52 65 73 75 6c 74 43 6f 64 65 29 3b 0a 20 20 73  ResultCode);.  s
2c30: 74 72 6e 63 70 79 28 7a 52 65 70 6c 79 53 74 61  trncpy(zReplySta
2c40: 74 75 73 2c 20 7a 52 65 73 75 6c 74 43 6f 64 65  tus, zResultCode
2c50: 2c 20 33 29 3b 0a 20 20 7a 52 65 70 6c 79 53 74  , 3);.  zReplySt
2c60: 61 74 75 73 5b 33 5d 20 3d 20 30 3b 0a 20 20 69  atus[3] = 0;.  i
2c70: 66 28 20 7a 52 65 70 6c 79 53 74 61 74 75 73 5b  f( zReplyStatus[
2c80: 30 5d 3e 3d 27 34 27 20 29 7b 0a 20 20 20 20 63  0]>='4' ){.    c
2c90: 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d  loseConnection =
2ca0: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6c   1;.  }.  if( cl
2cb0: 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 29 7b  oseConnection ){
2cc0: 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69  .    nOut += pri
2cd0: 6e 74 66 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 3a  ntf("Connection:
2ce0: 20 63 6c 6f 73 65 5c 72 5c 6e 22 29 3b 0a 20 20   close\r\n");.  
2cf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 75 74 20  }else{.    nOut 
2d00: 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 6e 65  += printf("Conne
2d10: 63 74 69 6f 6e 3a 20 6b 65 65 70 2d 61 6c 69 76  ction: keep-aliv
2d20: 65 5c 72 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 6e  e\r\n");.  }.  n
2d30: 4f 75 74 20 2b 3d 20 44 61 74 65 54 61 67 28 22  Out += DateTag("
2d40: 44 61 74 65 22 2c 20 6e 6f 77 29 3b 0a 20 20 73  Date", now);.  s
2d50: 74 61 74 75 73 53 65 6e 74 20 3d 20 31 3b 0a 7d  tatusSent = 1;.}
2d60: 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68 65  ../*.** Tell the
2d70: 20 63 6c 69 65 6e 74 20 74 68 61 74 20 74 68 65   client that the
2d80: 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 64 6f  re is no such do
2d90: 63 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63  cument.*/.static
2da0: 20 76 6f 69 64 20 4e 6f 74 46 6f 75 6e 64 28 69   void NotFound(i
2db0: 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 53 74  nt lineno){.  St
2dc0: 61 72 74 52 65 73 70 6f 6e 73 65 28 22 34 30 34  artResponse("404
2dd0: 20 4e 6f 74 20 46 6f 75 6e 64 22 29 3b 0a 20 20   Not Found");.  
2de0: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a  nOut += printf(.
2df0: 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70      "Content-typ
2e00: 65 3a 20 74 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e  e: text/html\r\n
2e10: 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20  ".    "\r\n".   
2e20: 20 22 3c 68 65 61 64 3e 3c 74 69 74 6c 65 20 6c   "<head><title l
2e30: 69 6e 65 6e 6f 3d 5c 22 25 64 5c 22 3e 4e 6f 74  ineno=\"%d\">Not
2e40: 20 46 6f 75 6e 64 3c 2f 74 69 74 6c 65 3e 3c 2f   Found</title></
2e50: 68 65 61 64 3e 5c 6e 22 0a 20 20 20 20 22 3c 62  head>\n".    "<b
2e60: 6f 64 79 3e 3c 68 31 3e 44 6f 63 75 6d 65 6e 74  ody><h1>Document
2e70: 20 4e 6f 74 20 46 6f 75 6e 64 3c 2f 68 31 3e 5c   Not Found</h1>\
2e80: 6e 22 0a 20 20 20 20 22 54 68 65 20 64 6f 63 75  n".    "The docu
2e90: 6d 65 6e 74 20 25 73 20 69 73 20 6e 6f 74 20 61  ment %s is not a
2ea0: 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 69 73  vailable on this
2eb0: 20 73 65 72 76 65 72 5c 6e 22 0a 20 20 20 20 22   server\n".    "
2ec0: 3c 2f 62 6f 64 79 3e 5c 6e 22 2c 20 6c 69 6e 65  </body>\n", line
2ed0: 6e 6f 2c 20 7a 53 63 72 69 70 74 29 3b 0a 20 20  no, zScript);.  
2ee0: 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 29 3b  MakeLogEntry(0);
2ef0: 0a 20 20 65 78 69 74 28 30 29 3b 0a 7d 0a 0a 2f  .  exit(0);.}../
2f00: 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c  *.** Tell the cl
2f10: 69 65 6e 74 20 74 68 61 74 20 61 75 74 68 6f 72  ient that author
2f20: 69 7a 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69  ization is requi
2f30: 72 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68  red to access th
2f40: 65 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a  e.** document..*
2f50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4e 6f  /.static void No
2f60: 74 41 75 74 68 6f 72 69 7a 65 64 28 63 6f 6e 73  tAuthorized(cons
2f70: 74 20 63 68 61 72 20 2a 7a 52 65 61 6c 6d 29 7b  t char *zRealm){
2f80: 0a 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65  .  StartResponse
2f90: 28 22 34 30 31 20 41 75 74 68 6f 72 69 7a 61 74  ("401 Authorizat
2fa0: 69 6f 6e 20 52 65 71 75 69 72 65 64 22 29 3b 0a  ion Required");.
2fb0: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
2fc0: 28 0a 20 20 20 20 22 57 57 57 2d 41 75 74 68 65  (.    "WWW-Authe
2fd0: 6e 74 69 63 61 74 65 3a 20 42 61 73 69 63 20 72  nticate: Basic r
2fe0: 65 61 6c 6d 3d 5c 22 25 73 5c 22 5c 72 5c 6e 22  ealm=\"%s\"\r\n"
2ff0: 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79  .    "Content-ty
3000: 70 65 3a 20 74 65 78 74 2f 68 74 6d 6c 5c 72 5c  pe: text/html\r\
3010: 6e 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20  n".    "\r\n".  
3020: 20 20 22 3c 68 65 61 64 3e 3c 74 69 74 6c 65 3e    "<head><title>
3030: 4e 6f 74 20 41 75 74 68 6f 72 69 7a 65 64 3c 2f  Not Authorized</
3040: 74 69 74 6c 65 3e 3c 2f 68 65 61 64 3e 5c 6e 22  title></head>\n"
3050: 0a 20 20 20 20 22 3c 62 6f 64 79 3e 3c 68 31 3e  .    "<body><h1>
3060: 34 30 31 20 4e 6f 74 20 41 75 74 68 6f 72 69 7a  401 Not Authoriz
3070: 65 64 3c 2f 68 31 3e 5c 6e 22 0a 20 20 20 20 22  ed</h1>\n".    "
3080: 41 20 6c 6f 67 69 6e 20 61 6e 64 20 70 61 73 73  A login and pass
3090: 77 6f 72 64 20 61 72 65 20 72 65 71 75 69 72 65  word are require
30a0: 64 20 66 6f 72 20 74 68 69 73 20 64 6f 63 75 6d  d for this docum
30b0: 65 6e 74 5c 6e 22 0a 20 20 20 20 22 3c 2f 62 6f  ent\n".    "</bo
30c0: 64 79 3e 5c 6e 22 2c 20 7a 52 65 61 6c 6d 29 3b  dy>\n", zRealm);
30d0: 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28  .  MakeLogEntry(
30e0: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c  0);.}../*.** Tel
30f0: 6c 20 74 68 65 20 63 6c 69 65 6e 74 20 74 68 61  l the client tha
3100: 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 72  t there is an er
3110: 72 6f 72 20 69 6e 20 74 68 65 20 73 63 72 69 70  ror in the scrip
3120: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
3130: 64 20 43 67 69 45 72 72 6f 72 28 76 6f 69 64 29  d CgiError(void)
3140: 7b 0a 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73  {.  StartRespons
3150: 65 28 22 35 30 30 20 45 72 72 6f 72 22 29 3b 0a  e("500 Error");.
3160: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
3170: 28 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74  (.    "Content-t
3180: 79 70 65 3a 20 74 65 78 74 2f 68 74 6d 6c 5c 72  ype: text/html\r
3190: 5c 6e 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20  \n".    "\r\n". 
31a0: 20 20 20 22 3c 68 65 61 64 3e 3c 74 69 74 6c 65     "<head><title
31b0: 3e 43 47 49 20 50 72 6f 67 72 61 6d 20 45 72 72  >CGI Program Err
31c0: 6f 72 3c 2f 74 69 74 6c 65 3e 3c 2f 68 65 61 64  or</title></head
31d0: 3e 5c 6e 22 0a 20 20 20 20 22 3c 62 6f 64 79 3e  >\n".    "<body>
31e0: 3c 68 31 3e 43 47 49 20 50 72 6f 67 72 61 6d 20  <h1>CGI Program 
31f0: 45 72 72 6f 72 3c 2f 68 31 3e 5c 6e 22 0a 20 20  Error</h1>\n".  
3200: 20 20 22 54 68 65 20 43 47 49 20 70 72 6f 67 72    "The CGI progr
3210: 61 6d 20 25 73 20 67 65 6e 65 72 61 74 65 64 20  am %s generated 
3220: 61 6e 20 65 72 72 6f 72 5c 6e 22 0a 20 20 20 20  an error\n".    
3230: 22 3c 2f 62 6f 64 79 3e 5c 6e 22 2c 20 7a 53 63  "</body>\n", zSc
3240: 72 69 70 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67  ript);.  MakeLog
3250: 45 6e 74 72 79 28 30 29 3b 0a 20 20 65 78 69 74  Entry(0);.  exit
3260: 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  (0);.}../*.** Th
3270: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 69 66 20  is is called if 
3280: 77 65 20 74 69 6d 65 6f 75 74 2e 0a 2a 2f 0a 73  we timeout..*/.s
3290: 74 61 74 69 63 20 76 6f 69 64 20 54 69 6d 65 6f  tatic void Timeo
32a0: 75 74 28 69 6e 74 20 4e 6f 74 55 73 65 64 29 7b  ut(int NotUsed){
32b0: 0a 20 20 69 66 28 20 21 64 65 62 75 67 46 6c 61  .  if( !debugFla
32c0: 67 20 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28  g ){.    strcpy(
32d0: 7a 52 65 70 6c 79 53 74 61 74 75 73 2c 20 22 39  zReplyStatus, "9
32e0: 39 39 22 29 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f  99");.    MakeLo
32f0: 67 45 6e 74 72 79 28 30 29 3b 0a 20 20 20 20 65  gEntry(0);.    e
3300: 78 69 74 28 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  xit(0);.  }.}../
3310: 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c  *.** Tell the cl
3320: 69 65 6e 74 20 74 68 61 74 20 74 68 65 72 65 20  ient that there 
3330: 69 73 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74  is an error in t
3340: 68 65 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74  he script..*/.st
3350: 61 74 69 63 20 76 6f 69 64 20 43 67 69 53 63 72  atic void CgiScr
3360: 69 70 74 57 72 69 74 61 62 6c 65 28 76 6f 69 64  iptWritable(void
3370: 29 7b 0a 20 20 53 74 61 72 74 52 65 73 70 6f 6e  ){.  StartRespon
3380: 73 65 28 22 35 30 30 20 43 47 49 20 43 6f 6e 66  se("500 CGI Conf
3390: 69 67 75 72 61 74 69 6f 6e 20 45 72 72 6f 72 22  iguration Error"
33a0: 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69  );.  nOut += pri
33b0: 6e 74 66 28 0a 20 20 20 20 22 43 6f 6e 74 65 6e  ntf(.    "Conten
33c0: 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 68 74 6d  t-type: text/htm
33d0: 6c 5c 72 5c 6e 22 0a 20 20 20 20 22 5c 72 5c 6e  l\r\n".    "\r\n
33e0: 22 0a 20 20 20 20 22 3c 68 65 61 64 3e 3c 74 69  ".    "<head><ti
33f0: 74 6c 65 3e 43 47 49 20 43 6f 6e 66 69 67 75 72  tle>CGI Configur
3400: 61 74 69 6f 6e 20 45 72 72 6f 72 3c 2f 74 69 74  ation Error</tit
3410: 6c 65 3e 3c 2f 68 65 61 64 3e 5c 6e 22 0a 20 20  le></head>\n".  
3420: 20 20 22 3c 62 6f 64 79 3e 3c 68 31 3e 43 47 49    "<body><h1>CGI
3430: 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 45   Configuration E
3440: 72 72 6f 72 3c 2f 68 31 3e 5c 6e 22 0a 20 20 20  rror</h1>\n".   
3450: 20 22 54 68 65 20 43 47 49 20 70 72 6f 67 72 61   "The CGI progra
3460: 6d 20 25 73 20 69 73 20 77 72 69 74 61 62 6c 65  m %s is writable
3470: 20 62 79 20 75 73 65 72 73 20 6f 74 68 65 72 20   by users other 
3480: 74 68 61 6e 20 69 74 73 20 6f 77 6e 65 72 2e 5c  than its owner.\
3490: 6e 22 0a 20 20 20 20 22 3c 2f 62 6f 64 79 3e 5c  n".    "</body>\
34a0: 6e 22 2c 20 7a 52 65 61 6c 53 63 72 69 70 74 29  n", zRealScript)
34b0: 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79  ;.  MakeLogEntry
34c0: 28 30 29 3b 0a 20 20 65 78 69 74 28 30 29 3b 20  (0);.  exit(0); 
34d0: 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20        .}../*.** 
34e0: 54 65 6c 6c 20 74 68 65 20 63 6c 69 65 6e 74 20  Tell the client 
34f0: 74 68 61 74 20 74 68 65 20 73 65 72 76 65 72 20  that the server 
3500: 6d 61 6c 66 75 6e 63 74 69 6f 6e 65 64 2e 0a 2a  malfunctioned..*
3510: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d 61  /.static void Ma
3520: 6c 66 75 6e 63 74 69 6f 6e 28 69 6e 74 20 6c 69  lfunction(int li
3530: 6e 65 6e 75 6d 2c 20 63 6f 6e 73 74 20 63 68 61  nenum, const cha
3540: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
3550: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
3560: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
3570: 46 6f 72 6d 61 74 29 3b 0a 20 20 53 74 61 72 74  Format);.  Start
3580: 52 65 73 70 6f 6e 73 65 28 22 35 30 30 20 53 65  Response("500 Se
3590: 72 76 65 72 20 4d 61 6c 66 75 6e 63 74 69 6f 6e  rver Malfunction
35a0: 22 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72  ");.  nOut += pr
35b0: 69 6e 74 66 28 0a 20 20 20 20 22 43 6f 6e 74 65  intf(.    "Conte
35c0: 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 68 74  nt-type: text/ht
35d0: 6d 6c 5c 72 5c 6e 22 0a 20 20 20 20 22 5c 72 5c  ml\r\n".    "\r\
35e0: 6e 22 0a 20 20 20 20 22 3c 68 65 61 64 3e 3c 74  n".    "<head><t
35f0: 69 74 6c 65 3e 53 65 72 76 65 72 20 4d 61 6c 66  itle>Server Malf
3600: 75 6e 63 74 69 6f 6e 3c 2f 74 69 74 6c 65 3e 3c  unction</title><
3610: 2f 68 65 61 64 3e 5c 6e 22 0a 20 20 20 20 22 3c  /head>\n".    "<
3620: 62 6f 64 79 3e 3c 68 31 3e 53 65 72 76 65 72 20  body><h1>Server 
3630: 4d 61 6c 66 75 6e 63 74 69 6f 6e 3c 2f 68 31 3e  Malfunction</h1>
3640: 5c 6e 22 0a 20 20 20 20 22 3c 70 3e 54 68 69 73  \n".    "<p>This
3650: 20 77 65 62 20 73 65 72 76 65 72 20 68 61 73 20   web server has 
3660: 6d 61 6c 66 75 6e 63 74 69 6f 6e 65 64 2e 5c 6e  malfunctioned.\n
3670: 5c 6e 22 0a 20 20 20 20 22 28 45 72 72 6f 72 20  \n".    "(Error 
3680: 6e 75 6d 62 65 72 3a 20 25 64 29 3c 2f 70 3e 5c  number: %d)</p>\
3690: 6e 22 2c 20 6c 69 6e 65 6e 75 6d 29 3b 0a 20 20  n", linenum);.  
36a0: 69 66 28 20 7a 46 6f 72 6d 61 74 20 29 7b 0a 20  if( zFormat ){. 
36b0: 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74     nOut += print
36c0: 66 28 22 3c 70 3e 22 29 3b 0a 20 20 20 20 6e 4f  f("<p>");.    nO
36d0: 75 74 20 2b 3d 20 76 70 72 69 6e 74 66 28 7a 46  ut += vprintf(zF
36e0: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20  ormat, ap);.    
36f0: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22  nOut += printf("
3700: 3c 2f 70 3e 5c 6e 5c 6e 22 29 3b 0a 20 20 7d 0a  </p>\n\n");.  }.
3710: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
3720: 28 22 3c 2f 62 6f 64 79 3e 5c 6e 22 29 3b 0a 20  ("</body>\n");. 
3730: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 29   MakeLogEntry(0)
3740: 3b 0a 20 20 65 78 69 74 28 30 29 3b 20 20 20 20  ;.  exit(0);    
3750: 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20     .}../*.** Do 
3760: 61 20 73 65 72 76 65 72 20 72 65 64 69 72 65 63  a server redirec
3770: 74 20 74 6f 20 74 68 65 20 64 6f 63 75 6d 65 6e  t to the documen
3780: 74 20 73 70 65 63 69 66 69 65 64 2e 20 20 54 68  t specified.  Th
3790: 65 20 64 6f 63 75 6d 65 6e 74 0a 2a 2a 20 6e 61  e document.** na
37a0: 6d 65 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 73  me not contain s
37b0: 63 68 65 6d 65 20 6f 72 20 6e 65 74 77 6f 72 6b  cheme or network
37c0: 20 6c 6f 63 61 74 69 6f 6e 20 6f 72 20 74 68 65   location or the
37d0: 20 71 75 65 72 79 20 73 74 72 69 6e 67 2e 0a 2a   query string..*
37e0: 2a 20 49 74 20 77 69 6c 6c 20 62 65 20 6a 75 73  * It will be jus
37f0: 74 20 74 68 65 20 70 61 74 68 2e 0a 2a 2f 0a 73  t the path..*/.s
3800: 74 61 74 69 63 20 76 6f 69 64 20 52 65 64 69 72  tatic void Redir
3810: 65 63 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ect(const char *
3820: 7a 50 61 74 68 2c 20 69 6e 74 20 66 69 6e 69 73  zPath, int finis
3830: 68 29 7b 0a 20 20 53 74 61 72 74 52 65 73 70 6f  h){.  StartRespo
3840: 6e 73 65 28 22 33 30 32 20 54 65 6d 70 6f 72 61  nse("302 Tempora
3850: 72 79 20 52 65 64 69 72 65 63 74 22 29 3b 0a 20  ry Redirect");. 
3860: 20 69 66 28 20 7a 53 65 72 76 65 72 50 6f 72 74   if( zServerPort
3870: 3d 3d 30 20 7c 7c 20 7a 53 65 72 76 65 72 50 6f  ==0 || zServerPo
3880: 72 74 5b 30 5d 3d 3d 30 20 7c 7c 20 73 74 72 63  rt[0]==0 || strc
3890: 6d 70 28 7a 53 65 72 76 65 72 50 6f 72 74 2c 22  mp(zServerPort,"
38a0: 38 30 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  80")==0 ){.    n
38b0: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 4c  Out += printf("L
38c0: 6f 63 61 74 69 6f 6e 3a 20 25 73 3a 2f 2f 25 73  ocation: %s://%s
38d0: 25 73 25 73 5c 72 5c 6e 22 2c 0a 20 20 20 20 20  %s%s\r\n",.     
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 48                zH
38f0: 74 74 70 2c 20 7a 53 65 72 76 65 72 4e 61 6d 65  ttp, zServerName
3900: 2c 20 7a 50 61 74 68 2c 20 7a 51 75 65 72 79 53  , zPath, zQueryS
3910: 75 66 66 69 78 29 3b 0a 20 20 7d 65 6c 73 65 7b  uffix);.  }else{
3920: 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69  .    nOut += pri
3930: 6e 74 66 28 22 4c 6f 63 61 74 69 6f 6e 3a 20 25  ntf("Location: %
3940: 73 3a 2f 2f 25 73 3a 25 73 25 73 25 73 5c 72 5c  s://%s:%s%s%s\r\
3950: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
3960: 20 20 20 20 20 20 20 7a 48 74 74 70 2c 20 7a 53         zHttp, zS
3970: 65 72 76 65 72 4e 61 6d 65 2c 20 7a 53 65 72 76  erverName, zServ
3980: 65 72 50 6f 72 74 2c 20 7a 50 61 74 68 2c 20 7a  erPort, zPath, z
3990: 51 75 65 72 79 53 75 66 66 69 78 29 3b 0a 20 20  QuerySuffix);.  
39a0: 7d 0a 20 20 69 66 28 20 66 69 6e 69 73 68 20 29  }.  if( finish )
39b0: 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 43 6f  {.    printf("Co
39c0: 6e 74 65 6e 74 2d 6c 65 6e 67 74 68 3a 20 30 5c  ntent-length: 0\
39d0: 72 5c 6e 22 29 3b 0a 20 20 20 20 6e 4f 75 74 20  r\n");.    nOut 
39e0: 2b 3d 20 70 72 69 6e 74 66 28 22 5c 72 5c 6e 22  += printf("\r\n"
39f0: 29 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e  );.    MakeLogEn
3a00: 74 72 79 28 30 29 3b 0a 20 20 7d 0a 20 20 66 66  try(0);.  }.  ff
3a10: 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 7d 0a  lush(stdout);.}.
3a20: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
3a30: 74 69 6f 6e 20 74 72 65 61 74 73 20 69 74 73 20  tion treats its 
3a40: 69 6e 70 75 74 20 61 73 20 61 20 62 61 73 65 2d  input as a base-
3a50: 36 34 20 73 74 72 69 6e 67 20 61 6e 64 20 72 65  64 string and re
3a60: 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 64 65 63  turns the.** dec
3a70: 6f 64 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68  oded value of th
3a80: 61 74 20 73 74 72 69 6e 67 2e 20 20 43 68 61 72  at string.  Char
3a90: 61 63 74 65 72 73 20 6f 66 20 69 6e 70 75 74 20  acters of input 
3aa0: 74 68 61 74 20 61 72 65 20 6e 6f 74 0a 2a 2a 20  that are not.** 
3ab0: 76 61 6c 69 64 20 62 61 73 65 2d 36 34 20 63 68  valid base-64 ch
3ac0: 61 72 61 63 74 65 72 73 20 28 73 75 63 68 20 61  aracters (such a
3ad0: 73 20 73 70 61 63 65 73 20 61 6e 64 20 6e 65 77  s spaces and new
3ae0: 6c 69 6e 65 73 29 20 61 72 65 20 69 67 6e 6f 72  lines) are ignor
3af0: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 44 65 63 6f  ed..*/.void Deco
3b00: 64 65 36 34 28 63 68 61 72 20 2a 7a 36 34 29 7b  de64(char *z64){
3b10: 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 61 3b 0a  .  char *zData;.
3b20: 20 20 69 6e 74 20 6e 36 34 3b 0a 20 20 69 6e 74    int n64;.  int
3b30: 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 61 2c 20   i, j;.  int a, 
3b40: 62 2c 20 63 2c 20 64 3b 0a 20 20 73 74 61 74 69  b, c, d;.  stati
3b50: 63 20 69 6e 74 20 69 73 49 6e 69 74 20 3d 20 30  c int isInit = 0
3b60: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 74  ;.  static int t
3b70: 72 61 6e 73 5b 31 32 38 5d 3b 0a 20 20 73 74 61  rans[128];.  sta
3b80: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61  tic unsigned cha
3b90: 72 20 7a 42 61 73 65 5b 5d 20 3d 20 0a 20 20 20  r zBase[] = .   
3ba0: 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
3bb0: 4f 50 51 52 53 54 55 56 57 58 59 5a 61 62 63 64  OPQRSTUVWXYZabcd
3bc0: 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
3bd0: 75 76 77 78 79 7a 30 31 32 33 34 35 36 37 38 39  uvwxyz0123456789
3be0: 2b 2f 22 3b 0a 0a 20 20 69 66 28 20 21 69 73 49  +/";..  if( !isI
3bf0: 6e 69 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  nit ){.    for(i
3c00: 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b 29 7b  =0; i<128; i++){
3c10: 20 74 72 61 6e 73 5b 69 5d 20 3d 20 30 3b 20 7d   trans[i] = 0; }
3c20: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 42  .    for(i=0; zB
3c30: 61 73 65 5b 69 5d 3b 20 69 2b 2b 29 7b 20 74 72  ase[i]; i++){ tr
3c40: 61 6e 73 5b 7a 42 61 73 65 5b 69 5d 20 26 20 30  ans[zBase[i] & 0
3c50: 78 37 66 5d 20 3d 20 69 3b 20 7d 0a 20 20 20 20  x7f] = i; }.    
3c60: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a  isInit = 1;.  }.
3c70: 20 20 6e 36 34 20 3d 20 73 74 72 6c 65 6e 28 7a    n64 = strlen(z
3c80: 36 34 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 36  64);.  while( n6
3c90: 34 3e 30 20 26 26 20 7a 36 34 5b 6e 36 34 2d 31  4>0 && z64[n64-1
3ca0: 5d 3d 3d 27 3d 27 20 29 20 6e 36 34 2d 2d 3b 0a  ]=='=' ) n64--;.
3cb0: 20 20 7a 44 61 74 61 20 3d 20 7a 36 34 3b 0a 20    zData = z64;. 
3cc0: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 2b 33 3c   for(i=j=0; i+3<
3cd0: 6e 36 34 3b 20 69 2b 3d 34 29 7b 0a 20 20 20 20  n64; i+=4){.    
3ce0: 61 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 5d  a = trans[z64[i]
3cf0: 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 62 20   & 0x7f];.    b 
3d00: 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b 31 5d  = trans[z64[i+1]
3d10: 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 63 20   & 0x7f];.    c 
3d20: 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b 32 5d  = trans[z64[i+2]
3d30: 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 64 20   & 0x7f];.    d 
3d40: 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b 33 5d  = trans[z64[i+3]
3d50: 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 7a 44   & 0x7f];.    zD
3d60: 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28 61 3c 3c  ata[j++] = ((a<<
3d70: 32 29 20 26 20 30 78 66 63 29 20 7c 20 28 28 62  2) & 0xfc) | ((b
3d80: 3e 3e 34 29 20 26 20 30 78 30 33 29 3b 0a 20 20  >>4) & 0x03);.  
3d90: 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28    zData[j++] = (
3da0: 28 62 3c 3c 34 29 20 26 20 30 78 66 30 29 20 7c  (b<<4) & 0xf0) |
3db0: 20 28 28 63 3e 3e 32 29 20 26 20 30 78 30 66 29   ((c>>2) & 0x0f)
3dc0: 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d  ;.    zData[j++]
3dd0: 20 3d 20 28 28 63 3c 3c 36 29 20 26 20 30 78 63   = ((c<<6) & 0xc
3de0: 30 29 20 7c 20 28 64 20 26 20 30 78 33 66 29 3b  0) | (d & 0x3f);
3df0: 0a 20 20 7d 0a 20 20 69 66 28 20 69 2b 32 3c 6e  .  }.  if( i+2<n
3e00: 36 34 20 29 7b 0a 20 20 20 20 61 20 3d 20 74 72  64 ){.    a = tr
3e10: 61 6e 73 5b 7a 36 34 5b 69 5d 20 26 20 30 78 37  ans[z64[i] & 0x7
3e20: 66 5d 3b 0a 20 20 20 20 62 20 3d 20 74 72 61 6e  f];.    b = tran
3e30: 73 5b 7a 36 34 5b 69 2b 31 5d 20 26 20 30 78 37  s[z64[i+1] & 0x7
3e40: 66 5d 3b 0a 20 20 20 20 63 20 3d 20 74 72 61 6e  f];.    c = tran
3e50: 73 5b 7a 36 34 5b 69 2b 32 5d 20 26 20 30 78 37  s[z64[i+2] & 0x7
3e60: 66 5d 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b  f];.    zData[j+
3e70: 2b 5d 20 3d 20 28 28 61 3c 3c 32 29 20 26 20 30  +] = ((a<<2) & 0
3e80: 78 66 63 29 20 7c 20 28 28 62 3e 3e 34 29 20 26  xfc) | ((b>>4) &
3e90: 20 30 78 30 33 29 3b 0a 20 20 20 20 7a 44 61 74   0x03);.    zDat
3ea0: 61 5b 6a 2b 2b 5d 20 3d 20 28 28 62 3c 3c 34 29  a[j++] = ((b<<4)
3eb0: 20 26 20 30 78 66 30 29 20 7c 20 28 28 63 3e 3e   & 0xf0) | ((c>>
3ec0: 32 29 20 26 20 30 78 30 66 29 3b 0a 20 20 7d 65  2) & 0x0f);.  }e
3ed0: 6c 73 65 20 69 66 28 20 69 2b 31 3c 6e 36 34 20  lse if( i+1<n64 
3ee0: 29 7b 0a 20 20 20 20 61 20 3d 20 74 72 61 6e 73  ){.    a = trans
3ef0: 5b 7a 36 34 5b 69 5d 20 26 20 30 78 37 66 5d 3b  [z64[i] & 0x7f];
3f00: 0a 20 20 20 20 62 20 3d 20 74 72 61 6e 73 5b 7a  .    b = trans[z
3f10: 36 34 5b 69 2b 31 5d 20 26 20 30 78 37 66 5d 3b  64[i+1] & 0x7f];
3f20: 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20  .    zData[j++] 
3f30: 3d 20 28 28 61 3c 3c 32 29 20 26 20 30 78 66 63  = ((a<<2) & 0xfc
3f40: 29 20 7c 20 28 28 62 3e 3e 34 29 20 26 20 30 78  ) | ((b>>4) & 0x
3f50: 30 33 29 3b 0a 20 20 7d 0a 20 20 7a 44 61 74 61  03);.  }.  zData
3f60: 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  [j] = 0;.}../*.*
3f70: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
3f80: 66 20 62 61 73 69 63 20 61 75 74 68 6f 72 69 7a  f basic authoriz
3f90: 61 74 69 6f 6e 20 63 72 65 64 65 6e 74 69 61 6c  ation credential
3fa0: 73 20 61 72 65 20 70 72 6f 76 69 64 65 64 20 66  s are provided f
3fb0: 6f 72 0a 2a 2a 20 74 68 65 20 75 73 65 72 20 61  or.** the user a
3fc0: 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
3fd0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 7a  information in z
3fe0: 41 75 74 68 46 69 6c 65 2e 20 20 52 65 74 75 72  AuthFile.  Retur
3ff0: 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 61 75 74  n true.** if aut
4000: 68 6f 72 69 7a 65 64 2e 20 20 52 65 74 75 72 6e  horized.  Return
4010: 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 61 75   false if not au
4020: 74 68 6f 72 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20  thorized..**.** 
4030: 46 69 6c 65 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a  File format:.**.
4040: 2a 2a 20 20 20 20 2a 20 20 42 6c 61 6e 6b 20 6c  **    *  Blank l
4050: 69 6e 65 73 20 61 6e 64 20 6c 69 6e 65 73 20 74  ines and lines t
4060: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 27  hat begin with '
4070: 23 27 20 61 72 65 20 69 67 6e 6f 72 65 64 0a 2a  #' are ignored.*
4080: 2a 20 20 20 20 2a 20 20 22 68 74 74 70 2d 72 65  *    *  "http-re
4090: 64 69 72 65 63 74 22 20 66 6f 72 63 65 73 20 61  direct" forces a
40a0: 20 72 65 64 69 72 65 63 74 20 74 6f 20 48 54 54   redirect to HTT
40b0: 50 53 20 69 66 20 6e 6f 74 20 74 68 65 72 65 20  PS if not there 
40c0: 61 6c 72 65 61 64 79 0a 2a 2a 20 20 20 20 2a 20  already.**    * 
40d0: 20 22 68 74 74 70 73 2d 6f 6e 6c 79 22 20 64 69   "https-only" di
40e0: 73 61 6c 6c 6f 77 73 20 6f 70 65 72 61 74 69 6f  sallows operatio
40f0: 6e 20 69 6e 20 48 54 54 50 0a 2a 2a 20 20 20 20  n in HTTP.**    
4100: 2a 20 20 22 75 73 65 72 20 4e 41 4d 45 20 4c 4f  *  "user NAME LO
4110: 47 49 4e 3a 50 41 53 53 57 4f 52 44 22 20 63 68  GIN:PASSWORD" ch
4120: 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 4c  ecks to see if L
4130: 4f 47 49 4e 3a 50 41 53 53 57 4f 52 44 20 0a 2a  OGIN:PASSWORD .*
4140: 2a 20 20 20 20 20 20 20 61 75 74 68 6f 72 69 7a  *       authoriz
4150: 61 74 69 6f 6e 20 63 72 65 64 65 6e 74 69 61 6c  ation credential
4160: 73 20 61 72 65 20 70 72 6f 76 69 64 65 64 2c 20  s are provided, 
4170: 61 6e 64 20 69 66 20 73 6f 20 73 65 74 73 20 74  and if so sets t
4180: 68 65 0a 2a 2a 20 20 20 20 20 20 20 52 45 4d 4f  he.**       REMO
4190: 54 45 5f 55 53 45 52 20 74 6f 20 4e 41 4d 45 2e  TE_USER to NAME.
41a0: 0a 2a 2a 20 20 20 20 2a 20 20 22 72 65 61 6c 6d  .**    *  "realm
41b0: 20 54 45 58 54 22 20 73 65 74 73 20 74 68 65 20   TEXT" sets the 
41c0: 72 65 61 6c 6d 20 74 6f 20 54 45 58 54 2e 0a 2a  realm to TEXT..*
41d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 43 68 65  /.static int Che
41e0: 63 6b 42 61 73 69 63 41 75 74 68 6f 72 69 7a 61  ckBasicAuthoriza
41f0: 74 69 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  tion(const char 
4200: 2a 7a 41 75 74 68 46 69 6c 65 29 7b 0a 20 20 46  *zAuthFile){.  F
4210: 49 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20  ILE *in;.  char 
4220: 2a 7a 52 65 61 6c 6d 20 3d 20 22 75 6e 6b 6e 6f  *zRealm = "unkno
4230: 77 6e 20 72 65 61 6c 6d 22 3b 0a 20 20 63 68 61  wn realm";.  cha
4240: 72 20 2a 7a 4c 6f 67 69 6e 50 73 77 64 3b 0a 20  r *zLoginPswd;. 
4250: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
4260: 63 68 61 72 20 7a 4c 69 6e 65 5b 32 30 30 30 5d  char zLine[2000]
4270: 3b 0a 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28  ;..  in = fopen(
4280: 7a 41 75 74 68 46 69 6c 65 2c 20 22 72 22 29 3b  zAuthFile, "r");
4290: 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a  .  if( in==0 ){.
42a0: 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c      NotFound(__L
42b0: 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 72 65 74 75  INE__);.    retu
42c0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
42d0: 7a 41 75 74 68 41 72 67 20 29 20 44 65 63 6f 64  zAuthArg ) Decod
42e0: 65 36 34 28 7a 41 75 74 68 41 72 67 29 3b 0a 20  e64(zAuthArg);. 
42f0: 20 77 68 69 6c 65 28 20 66 67 65 74 73 28 7a 4c   while( fgets(zL
4300: 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c 69 6e  ine, sizeof(zLin
4310: 65 29 2c 20 69 6e 29 20 29 7b 0a 20 20 20 20 63  e), in) ){.    c
4320: 68 61 72 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 3b  har *zFieldName;
4330: 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 3b  .    char *zVal;
4340: 0a 0a 20 20 20 20 7a 46 69 65 6c 64 4e 61 6d 65  ..    zFieldName
4350: 20 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65   = GetFirstEleme
4360: 6e 74 28 7a 4c 69 6e 65 2c 26 7a 56 61 6c 29 3b  nt(zLine,&zVal);
4370: 0a 20 20 20 20 69 66 28 20 7a 46 69 65 6c 64 4e  .    if( zFieldN
4380: 61 6d 65 3d 3d 30 20 7c 7c 20 2a 7a 46 69 65 6c  ame==0 || *zFiel
4390: 64 4e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69  dName==0 ) conti
43a0: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 7a 46 69  nue;.    if( zFi
43b0: 65 6c 64 4e 61 6d 65 5b 30 5d 3d 3d 27 23 27 20  eldName[0]=='#' 
43c0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
43d0: 52 65 6d 6f 76 65 4e 65 77 6c 69 6e 65 28 7a 56  RemoveNewline(zV
43e0: 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72  al);.    if( str
43f0: 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 20  cmp(zFieldName, 
4400: 22 72 65 61 6c 6d 22 29 3d 3d 30 20 29 7b 0a 20  "realm")==0 ){. 
4410: 20 20 20 20 20 7a 52 65 61 6c 6d 20 3d 20 53 74       zRealm = St
4420: 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20  rDup(zVal);.    
4430: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
4440: 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 75 73 65  (zFieldName,"use
4450: 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
4460: 69 66 28 20 7a 41 75 74 68 41 72 67 3d 3d 30 20  if( zAuthArg==0 
4470: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
4480: 20 20 7a 4e 61 6d 65 20 3d 20 47 65 74 46 69 72    zName = GetFir
4490: 73 74 45 6c 65 6d 65 6e 74 28 7a 56 61 6c 2c 20  stElement(zVal, 
44a0: 26 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 7a 4c  &zVal);.      zL
44b0: 6f 67 69 6e 50 73 77 64 20 3d 20 47 65 74 46 69  oginPswd = GetFi
44c0: 72 73 74 45 6c 65 6d 65 6e 74 28 7a 56 61 6c 2c  rstElement(zVal,
44d0: 20 26 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 69   &zVal);.      i
44e0: 66 28 20 7a 4c 6f 67 69 6e 50 73 77 64 3d 3d 30  f( zLoginPswd==0
44f0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
4500: 20 20 20 69 66 28 20 7a 41 75 74 68 41 72 67 20     if( zAuthArg 
4510: 26 26 20 73 74 72 63 6d 70 28 7a 41 75 74 68 41  && strcmp(zAuthA
4520: 72 67 2c 7a 4c 6f 67 69 6e 50 73 77 64 29 3d 3d  rg,zLoginPswd)==
4530: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65  0 ){.        zRe
4540: 6d 6f 74 65 55 73 65 72 20 3d 20 53 74 72 44 75  moteUser = StrDu
4550: 70 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  p(zName);.      
4560: 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
4570: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
4580: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
4590: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69  e if( strcmp(zFi
45a0: 65 6c 64 4e 61 6d 65 2c 22 68 74 74 70 73 2d 6f  eldName,"https-o
45b0: 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nly")==0 ){.    
45c0: 20 20 69 66 28 20 21 75 73 65 48 74 74 70 73 20    if( !useHttps 
45d0: 29 7b 0a 20 20 20 20 20 20 20 20 4e 6f 74 46 6f  ){.        NotFo
45e0: 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  und(__LINE__);. 
45f0: 20 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69 6e         fclose(in
4600: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
4610: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
4620: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
4630: 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 68 74  p(zFieldName,"ht
4640: 74 70 2d 72 65 64 69 72 65 63 74 22 29 3d 3d 30  tp-redirect")==0
4650: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 75   ){.      if( !u
4660: 73 65 48 74 74 70 73 20 29 7b 0a 20 20 20 20 20  seHttps ){.     
4670: 20 20 20 7a 48 74 74 70 20 3d 20 22 68 74 74 70     zHttp = "http
4680: 73 22 3b 0a 20 20 20 20 20 20 20 20 73 70 72 69  s";.        spri
4690: 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 25 73 25 73  ntf(zLine, "%s%s
46a0: 22 2c 20 7a 53 63 72 69 70 74 2c 20 7a 50 61 74  ", zScript, zPat
46b0: 68 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  hInfo);.        
46c0: 52 65 64 69 72 65 63 74 28 7a 4c 69 6e 65 2c 20  Redirect(zLine, 
46d0: 31 29 3b 0a 20 20 20 20 20 20 20 20 66 63 6c 6f  1);.        fclo
46e0: 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  se(in);.        
46f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
4700: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
4710: 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49     NotFound(__LI
4720: 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 66 63 6c  NE__);.      fcl
4730: 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 72  ose(in);.      r
4740: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
4750: 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b   }.  fclose(in);
4760: 0a 20 20 4e 6f 74 41 75 74 68 6f 72 69 7a 65 64  .  NotAuthorized
4770: 28 7a 52 65 61 6c 6d 29 3b 0a 20 20 72 65 74 75  (zRealm);.  retu
4780: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
4790: 75 65 73 73 20 74 68 65 20 6d 69 6d 65 2d 74 79  uess the mime-ty
47a0: 70 65 20 6f 66 20 61 20 64 6f 63 75 6d 65 6e 74  pe of a document
47b0: 20 62 61 73 65 64 20 6f 6e 20 69 74 73 20 6e 61   based on its na
47c0: 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  me..*/.const cha
47d0: 72 20 2a 47 65 74 4d 69 6d 65 54 79 70 65 28 63  r *GetMimeType(c
47e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
47f0: 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20  , int nName){.  
4800: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
4810: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 66 69   int i;.  int fi
4820: 72 73 74 2c 20 6c 61 73 74 3b 0a 20 20 69 6e 74  rst, last;.  int
4830: 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20 7a 53 75   len;.  char zSu
4840: 66 66 69 78 5b 32 30 5d 3b 0a 0a 20 20 2f 2a 20  ffix[20];..  /* 
4850: 41 20 74 61 62 6c 65 20 6f 66 20 6d 69 6d 65 74  A table of mimet
4860: 79 70 65 73 20 62 61 73 65 64 20 6f 6e 20 66 69  ypes based on fi
4870: 6c 65 20 73 75 66 66 69 78 65 73 2e 20 0a 20 20  le suffixes. .  
4880: 2a 2a 20 53 75 66 66 69 78 65 73 20 6d 75 73 74  ** Suffixes must
4890: 20 62 65 20 69 6e 20 73 6f 72 74 65 64 20 6f 72   be in sorted or
48a0: 64 65 72 20 73 6f 20 74 68 61 74 20 77 65 20 63  der so that we c
48b0: 61 6e 20 64 6f 20 61 20 62 69 6e 61 72 79 0a 20  an do a binary. 
48c0: 20 2a 2a 20 73 65 61 72 63 68 20 74 6f 20 66 69   ** search to fi
48d0: 6e 64 20 74 68 65 20 6d 69 6d 65 2d 74 79 70 65  nd the mime-type
48e0: 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63  .  */.  static c
48f0: 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
4900: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
4910: 75 66 66 69 78 3b 20 20 20 20 20 20 20 2f 2a 20  uffix;       /* 
4920: 54 68 65 20 66 69 6c 65 20 73 75 66 66 69 78 20  The file suffix 
4930: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 3b  */.    int size;
4940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4950: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
4960: 68 65 20 73 75 66 66 69 78 20 2a 2f 0a 20 20 20  he suffix */.   
4970: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 69   const char *zMi
4980: 6d 65 74 79 70 65 3b 20 20 20 20 20 2f 2a 20 54  metype;     /* T
4990: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
49a0: 20 6d 69 6d 65 74 79 70 65 20 2a 2f 0a 20 20 7d   mimetype */.  }
49b0: 20 61 4d 69 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20   aMime[] = {.   
49c0: 20 7b 20 22 61 69 22 2c 20 20 20 20 20 20 20 20   { "ai",        
49d0: 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   2, "application
49e0: 2f 70 6f 73 74 73 63 72 69 70 74 22 20 20 20 20  /postscript"    
49f0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
4a00: 20 22 61 69 66 22 2c 20 20 20 20 20 20 20 20 33   "aif",        3
4a10: 2c 20 22 61 75 64 69 6f 2f 78 2d 61 69 66 66 22  , "audio/x-aiff"
4a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a30: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
4a40: 61 69 66 63 22 2c 20 20 20 20 20 20 20 34 2c 20  aifc",       4, 
4a50: 22 61 75 64 69 6f 2f 78 2d 61 69 66 66 22 20 20  "audio/x-aiff"  
4a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a70: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 69      },.    { "ai
4a80: 66 66 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61  ff",       4, "a
4a90: 75 64 69 6f 2f 78 2d 61 69 66 66 22 20 20 20 20  udio/x-aiff"    
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ab0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 72 6a 22    },.    { "arj"
4ac0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
4ad0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 61 72 6a 2d 63  lication/x-arj-c
4ae0: 6f 6d 70 72 65 73 73 65 64 22 20 20 20 20 20 20  ompressed"      
4af0: 7d 2c 0a 20 20 20 20 7b 20 22 61 73 63 22 2c 20  },.    { "asc", 
4b00: 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f         3, "text/
4b10: 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20 20  plain"          
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
4b30: 0a 20 20 20 20 7b 20 22 61 73 66 22 2c 20 20 20  .    { "asf",   
4b40: 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 78       3, "video/x
4b50: 2d 6d 73 2d 61 73 66 22 20 20 20 20 20 20 20 20  -ms-asf"        
4b60: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
4b70: 20 20 20 7b 20 22 61 73 78 22 2c 20 20 20 20 20     { "asx",     
4b80: 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d     3, "video/x-m
4b90: 73 2d 61 73 78 22 20 20 20 20 20 20 20 20 20 20  s-asx"          
4ba0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
4bb0: 20 7b 20 22 61 75 22 2c 20 20 20 20 20 20 20 20   { "au",        
4bc0: 20 32 2c 20 22 61 75 64 69 6f 2f 75 6c 61 77 22   2, "audio/ulaw"
4bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4be0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
4bf0: 20 22 61 76 69 22 2c 20 20 20 20 20 20 20 20 33   "avi",        3
4c00: 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 76 69 64  , "video/x-msvid
4c10: 65 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20  eo"             
4c20: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
4c30: 62 61 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20  bat",        3, 
4c40: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6d  "application/x-m
4c50: 73 64 6f 73 2d 70 72 6f 67 72 61 6d 22 20 20 20  sdos-program"   
4c60: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 62 63      },.    { "bc
4c70: 70 69 6f 22 2c 20 20 20 20 20 20 35 2c 20 22 61  pio",      5, "a
4c80: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 62 63 70  pplication/x-bcp
4c90: 69 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20  io"             
4ca0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 62 69 6e 22    },.    { "bin"
4cb0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
4cc0: 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73  lication/octet-s
4cd0: 74 72 65 61 6d 22 20 20 20 20 20 20 20 20 20 20  tream"          
4ce0: 7d 2c 0a 20 20 20 20 7b 20 22 63 22 2c 20 20 20  },.    { "c",   
4cf0: 20 20 20 20 20 20 20 31 2c 20 22 74 65 78 74 2f         1, "text/
4d00: 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20 20  plain"          
4d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
4d20: 0a 20 20 20 20 7b 20 22 63 63 22 2c 20 20 20 20  .    { "cc",    
4d30: 20 20 20 20 20 32 2c 20 22 74 65 78 74 2f 70 6c       2, "text/pl
4d40: 61 69 6e 22 20 20 20 20 20 20 20 20 20 20 20 20  ain"            
4d50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
4d60: 20 20 20 7b 20 22 63 63 61 64 22 2c 20 20 20 20     { "ccad",    
4d70: 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69     4, "applicati
4d80: 6f 6e 2f 63 6c 61 72 69 73 63 61 64 22 20 20 20  on/clariscad"   
4d90: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
4da0: 20 7b 20 22 63 64 66 22 2c 20 20 20 20 20 20 20   { "cdf",       
4db0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
4dc0: 2f 78 2d 6e 65 74 63 64 66 22 20 20 20 20 20 20  /x-netcdf"      
4dd0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
4de0: 20 22 63 6c 61 73 73 22 2c 20 20 20 20 20 20 35   "class",      5
4df0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f  , "application/o
4e00: 63 74 65 74 2d 73 74 72 65 61 6d 22 20 20 20 20  ctet-stream"    
4e10: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
4e20: 63 6f 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20  cod",        3, 
4e30: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76 6e 64  "application/vnd
4e40: 2e 72 69 6d 2e 63 6f 64 22 20 20 20 20 20 20 20  .rim.cod"       
4e50: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f      },.    { "co
4e60: 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  m",        3, "a
4e70: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6d 73 64  pplication/x-msd
4e80: 6f 73 2d 70 72 6f 67 72 61 6d 22 20 20 20 20 20  os-program"     
4e90: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 70 69 6f    },.    { "cpio
4ea0: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70 70  ",       4, "app
4eb0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 63 70 69 6f 22  lication/x-cpio"
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ed0: 7d 2c 0a 20 20 20 20 7b 20 22 63 70 74 22 2c 20  },.    { "cpt", 
4ee0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
4ef0: 63 61 74 69 6f 6e 2f 6d 61 63 2d 63 6f 6d 70 61  cation/mac-compa
4f00: 63 74 70 72 6f 22 20 20 20 20 20 20 20 20 7d 2c  ctpro"        },
4f10: 0a 20 20 20 20 7b 20 22 63 73 68 22 2c 20 20 20  .    { "csh",   
4f20: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
4f30: 74 69 6f 6e 2f 78 2d 63 73 68 22 20 20 20 20 20  tion/x-csh"     
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
4f50: 20 20 20 7b 20 22 63 73 73 22 2c 20 20 20 20 20     { "css",     
4f60: 20 20 20 33 2c 20 22 74 65 78 74 2f 63 73 73 22     3, "text/css"
4f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f80: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
4f90: 20 7b 20 22 64 63 72 22 2c 20 20 20 20 20 20 20   { "dcr",       
4fa0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
4fb0: 2f 78 2d 64 69 72 65 63 74 6f 72 22 20 20 20 20  /x-director"    
4fc0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
4fd0: 20 22 64 65 62 22 2c 20 20 20 20 20 20 20 20 33   "deb",        3
4fe0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
4ff0: 2d 64 65 62 69 61 6e 2d 70 61 63 6b 61 67 65 22  -debian-package"
5000: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5010: 64 69 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20  dir",        3, 
5020: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 64  "application/x-d
5030: 69 72 65 63 74 6f 72 22 20 20 20 20 20 20 20 20  irector"        
5040: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 6c      },.    { "dl
5050: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 76  ",         2, "v
5060: 69 64 65 6f 2f 64 6c 22 20 20 20 20 20 20 20 20  ideo/dl"        
5070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5080: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 6d 73 22    },.    { "dms"
5090: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
50a0: 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73  lication/octet-s
50b0: 74 72 65 61 6d 22 20 20 20 20 20 20 20 20 20 20  tream"          
50c0: 7d 2c 0a 20 20 20 20 7b 20 22 64 6f 63 22 2c 20  },.    { "doc", 
50d0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
50e0: 63 61 74 69 6f 6e 2f 6d 73 77 6f 72 64 22 20 20  cation/msword"  
50f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
5100: 0a 20 20 20 20 7b 20 22 64 72 77 22 2c 20 20 20  .    { "drw",   
5110: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
5120: 74 69 6f 6e 2f 64 72 61 66 74 69 6e 67 22 20 20  tion/drafting"  
5130: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5140: 20 20 20 7b 20 22 64 76 69 22 2c 20 20 20 20 20     { "dvi",     
5150: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
5160: 6f 6e 2f 78 2d 64 76 69 22 20 20 20 20 20 20 20  on/x-dvi"       
5170: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5180: 20 7b 20 22 64 77 67 22 2c 20 20 20 20 20 20 20   { "dwg",       
5190: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
51a0: 2f 61 63 61 64 22 20 20 20 20 20 20 20 20 20 20  /acad"          
51b0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
51c0: 20 22 64 78 66 22 2c 20 20 20 20 20 20 20 20 33   "dxf",        3
51d0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 64  , "application/d
51e0: 78 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20  xf"             
51f0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5200: 64 78 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20  dxr",        3, 
5210: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 64  "application/x-d
5220: 69 72 65 63 74 6f 72 22 20 20 20 20 20 20 20 20  irector"        
5230: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65 70      },.    { "ep
5240: 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  s",        3, "a
5250: 70 70 6c 69 63 61 74 69 6f 6e 2f 70 6f 73 74 73  pplication/posts
5260: 63 72 69 70 74 22 20 20 20 20 20 20 20 20 20 20  cript"          
5270: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65 74 78 22    },.    { "etx"
5280: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65 78  ,        3, "tex
5290: 74 2f 78 2d 73 65 74 65 78 74 22 20 20 20 20 20  t/x-setext"     
52a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52b0: 7d 2c 0a 20 20 20 20 7b 20 22 65 78 65 22 2c 20  },.    { "exe", 
52c0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
52d0: 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72  cation/octet-str
52e0: 65 61 6d 22 20 20 20 20 20 20 20 20 20 20 7d 2c  eam"          },
52f0: 0a 20 20 20 20 7b 20 22 65 7a 22 2c 20 20 20 20  .    { "ez",    
5300: 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61       2, "applica
5310: 74 69 6f 6e 2f 61 6e 64 72 65 77 2d 69 6e 73 65  tion/andrew-inse
5320: 74 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  t"          },. 
5330: 20 20 20 7b 20 22 66 22 2c 20 20 20 20 20 20 20     { "f",       
5340: 20 20 20 31 2c 20 22 74 65 78 74 2f 70 6c 61 69     1, "text/plai
5350: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
5360: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5370: 20 7b 20 22 66 39 30 22 2c 20 20 20 20 20 20 20   { "f90",       
5380: 20 33 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22   3, "text/plain"
5390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53a0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
53b0: 20 22 66 6c 69 22 2c 20 20 20 20 20 20 20 20 33   "fli",        3
53c0: 2c 20 22 76 69 64 65 6f 2f 66 6c 69 22 20 20 20  , "video/fli"   
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53e0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
53f0: 66 6c 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20  flv",        3, 
5400: 22 76 69 64 65 6f 2f 66 6c 76 22 20 20 20 20 20  "video/flv"     
5410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5420: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 67 69      },.    { "gi
5430: 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69  f",        3, "i
5440: 6d 61 67 65 2f 67 69 66 22 20 20 20 20 20 20 20  mage/gif"       
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5460: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 67 6c 22 2c    },.    { "gl",
5470: 20 20 20 20 20 20 20 20 20 32 2c 20 22 76 69 64           2, "vid
5480: 65 6f 2f 67 6c 22 20 20 20 20 20 20 20 20 20 20  eo/gl"          
5490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54a0: 7d 2c 0a 20 20 20 20 7b 20 22 67 74 61 72 22 2c  },.    { "gtar",
54b0: 20 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69         4, "appli
54c0: 63 61 74 69 6f 6e 2f 78 2d 67 74 61 72 22 20 20  cation/x-gtar"  
54d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
54e0: 0a 20 20 20 20 7b 20 22 67 7a 22 2c 20 20 20 20  .    { "gz",    
54f0: 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61       2, "applica
5500: 74 69 6f 6e 2f 78 2d 67 7a 69 70 22 20 20 20 20  tion/x-gzip"    
5510: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5520: 20 20 20 7b 20 22 68 64 66 22 2c 20 20 20 20 20     { "hdf",     
5530: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
5540: 6f 6e 2f 78 2d 68 64 66 22 20 20 20 20 20 20 20  on/x-hdf"       
5550: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5560: 20 7b 20 22 68 68 22 2c 20 20 20 20 20 20 20 20   { "hh",        
5570: 20 32 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22   2, "text/plain"
5580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5590: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
55a0: 20 22 68 71 78 22 2c 20 20 20 20 20 20 20 20 33   "hqx",        3
55b0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d  , "application/m
55c0: 61 63 2d 62 69 6e 68 65 78 34 30 22 20 20 20 20  ac-binhex40"    
55d0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
55e0: 68 22 2c 20 20 20 20 20 20 20 20 20 20 31 2c 20  h",          1, 
55f0: 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20  "text/plain"    
5600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5610: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68 74      },.    { "ht
5620: 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74  m",        3, "t
5630: 65 78 74 2f 68 74 6d 6c 22 20 20 20 20 20 20 20  ext/html"       
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5650: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68 74 6d 6c    },.    { "html
5660: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 74 65 78  ",       4, "tex
5670: 74 2f 68 74 6d 6c 22 20 20 20 20 20 20 20 20 20  t/html"         
5680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5690: 7d 2c 0a 20 20 20 20 7b 20 22 69 63 65 22 2c 20  },.    { "ice", 
56a0: 20 20 20 20 20 20 20 33 2c 20 22 78 2d 63 6f 6e         3, "x-con
56b0: 66 65 72 65 6e 63 65 2f 78 2d 63 6f 6f 6c 74 61  ference/x-coolta
56c0: 6c 6b 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c  lk"           },
56d0: 0a 20 20 20 20 7b 20 22 69 65 66 22 2c 20 20 20  .    { "ief",   
56e0: 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 69       3, "image/i
56f0: 65 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ef"             
5700: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5710: 20 20 20 7b 20 22 69 67 65 73 22 2c 20 20 20 20     { "iges",    
5720: 20 20 20 34 2c 20 22 6d 6f 64 65 6c 2f 69 67 65     4, "model/ige
5730: 73 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s"              
5740: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5750: 20 7b 20 22 69 67 73 22 2c 20 20 20 20 20 20 20   { "igs",       
5760: 20 33 2c 20 22 6d 6f 64 65 6c 2f 69 67 65 73 22   3, "model/iges"
5770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5780: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5790: 20 22 69 70 73 22 2c 20 20 20 20 20 20 20 20 33   "ips",        3
57a0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
57b0: 2d 69 70 73 63 72 69 70 74 22 20 20 20 20 20 20  -ipscript"      
57c0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
57d0: 69 70 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20  ipx",        3, 
57e0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 69  "application/x-i
57f0: 70 69 78 22 20 20 20 20 20 20 20 20 20 20 20 20  pix"            
5800: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 61      },.    { "ja
5810: 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74  d",        3, "t
5820: 65 78 74 2f 76 6e 64 2e 73 75 6e 2e 6a 32 6d 65  ext/vnd.sun.j2me
5830: 2e 61 70 70 2d 64 65 73 63 72 69 70 74 6f 72 22  .app-descriptor"
5840: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 61 72 22    },.    { "jar"
5850: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
5860: 6c 69 63 61 74 69 6f 6e 2f 6a 61 76 61 2d 61 72  lication/java-ar
5870: 63 68 69 76 65 22 20 20 20 20 20 20 20 20 20 20  chive"          
5880: 7d 2c 0a 20 20 20 20 7b 20 22 6a 70 65 67 22 2c  },.    { "jpeg",
5890: 20 20 20 20 20 20 20 34 2c 20 22 69 6d 61 67 65         4, "image
58a0: 2f 6a 70 65 67 22 20 20 20 20 20 20 20 20 20 20  /jpeg"          
58b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
58c0: 0a 20 20 20 20 7b 20 22 6a 70 65 22 2c 20 20 20  .    { "jpe",   
58d0: 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 6a       3, "image/j
58e0: 70 65 67 22 20 20 20 20 20 20 20 20 20 20 20 20  peg"            
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5900: 20 20 20 7b 20 22 6a 70 67 22 2c 20 20 20 20 20     { "jpg",     
5910: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 6a 70 65     3, "image/jpe
5920: 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g"              
5930: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5940: 20 7b 20 22 6a 73 22 2c 20 20 20 20 20 20 20 20   { "js",        
5950: 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   2, "application
5960: 2f 78 2d 6a 61 76 61 73 63 72 69 70 74 22 20 20  /x-javascript"  
5970: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5980: 20 22 6b 61 72 22 2c 20 20 20 20 20 20 20 20 33   "kar",        3
5990: 2c 20 22 61 75 64 69 6f 2f 6d 69 64 69 22 20 20  , "audio/midi"  
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59b0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
59c0: 6c 61 74 65 78 22 2c 20 20 20 20 20 20 35 2c 20  latex",      5, 
59d0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6c  "application/x-l
59e0: 61 74 65 78 22 20 20 20 20 20 20 20 20 20 20 20  atex"           
59f0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 68      },.    { "lh
5a00: 61 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  a",        3, "a
5a10: 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74  pplication/octet
5a20: 2d 73 74 72 65 61 6d 22 20 20 20 20 20 20 20 20  -stream"        
5a30: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 73 70 22    },.    { "lsp"
5a40: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
5a50: 6c 69 63 61 74 69 6f 6e 2f 78 2d 6c 69 73 70 22  lication/x-lisp"
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a70: 7d 2c 0a 20 20 20 20 7b 20 22 6c 7a 68 22 2c 20  },.    { "lzh", 
5a80: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
5a90: 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72  cation/octet-str
5aa0: 65 61 6d 22 20 20 20 20 20 20 20 20 20 20 7d 2c  eam"          },
5ab0: 0a 20 20 20 20 7b 20 22 6d 22 2c 20 20 20 20 20  .    { "m",     
5ac0: 20 20 20 20 20 31 2c 20 22 74 65 78 74 2f 70 6c       1, "text/pl
5ad0: 61 69 6e 22 20 20 20 20 20 20 20 20 20 20 20 20  ain"            
5ae0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5af0: 20 20 20 7b 20 22 6d 33 75 22 2c 20 20 20 20 20     { "m3u",     
5b00: 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 6d     3, "audio/x-m
5b10: 70 65 67 75 72 6c 22 20 20 20 20 20 20 20 20 20  pegurl"         
5b20: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5b30: 20 7b 20 22 6d 61 6e 22 2c 20 20 20 20 20 20 20   { "man",       
5b40: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
5b50: 2f 78 2d 74 72 6f 66 66 2d 6d 61 6e 22 20 20 20  /x-troff-man"   
5b60: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5b70: 20 22 6d 65 22 2c 20 20 20 20 20 20 20 20 20 32   "me",         2
5b80: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
5b90: 2d 74 72 6f 66 66 2d 6d 65 22 20 20 20 20 20 20  -troff-me"      
5ba0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5bb0: 6d 65 73 68 22 2c 20 20 20 20 20 20 20 34 2c 20  mesh",       4, 
5bc0: 22 6d 6f 64 65 6c 2f 6d 65 73 68 22 20 20 20 20  "model/mesh"    
5bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5be0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 69      },.    { "mi
5bf0: 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  d",        3, "a
5c00: 75 64 69 6f 2f 6d 69 64 69 22 20 20 20 20 20 20  udio/midi"      
5c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c20: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 69 64 69    },.    { "midi
5c30: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 75 64  ",       4, "aud
5c40: 69 6f 2f 6d 69 64 69 22 20 20 20 20 20 20 20 20  io/midi"        
5c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c60: 7d 2c 0a 20 20 20 20 7b 20 22 6d 69 66 22 2c 20  },.    { "mif", 
5c70: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
5c80: 63 61 74 69 6f 6e 2f 78 2d 6d 69 66 22 20 20 20  cation/x-mif"   
5c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
5ca0: 0a 20 20 20 20 7b 20 22 6d 69 6d 65 22 2c 20 20  .    { "mime",  
5cb0: 20 20 20 20 20 34 2c 20 22 77 77 77 2f 6d 69 6d       4, "www/mim
5cc0: 65 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e"              
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5ce0: 20 20 20 7b 20 22 6d 6f 76 69 65 22 2c 20 20 20     { "movie",   
5cf0: 20 20 20 35 2c 20 22 76 69 64 65 6f 2f 78 2d 73     5, "video/x-s
5d00: 67 69 2d 6d 6f 76 69 65 22 20 20 20 20 20 20 20  gi-movie"       
5d10: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5d20: 20 7b 20 22 6d 6f 76 22 2c 20 20 20 20 20 20 20   { "mov",       
5d30: 20 33 2c 20 22 76 69 64 65 6f 2f 71 75 69 63 6b   3, "video/quick
5d40: 74 69 6d 65 22 20 20 20 20 20 20 20 20 20 20 20  time"           
5d50: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5d60: 20 22 6d 70 32 22 2c 20 20 20 20 20 20 20 20 33   "mp2",        3
5d70: 2c 20 22 61 75 64 69 6f 2f 6d 70 65 67 22 20 20  , "audio/mpeg"  
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d90: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5da0: 6d 70 32 22 2c 20 20 20 20 20 20 20 20 33 2c 20  mp2",        3, 
5db0: 22 76 69 64 65 6f 2f 6d 70 65 67 22 20 20 20 20  "video/mpeg"    
5dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dd0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70      },.    { "mp
5de0: 33 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  3",        3, "a
5df0: 75 64 69 6f 2f 6d 70 65 67 22 20 20 20 20 20 20  udio/mpeg"      
5e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e10: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 65 67    },.    { "mpeg
5e20: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 76 69 64  ",       4, "vid
5e30: 65 6f 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20  eo/mpeg"        
5e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e50: 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 65 22 2c 20  },.    { "mpe", 
5e60: 20 20 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f         3, "video
5e70: 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20 20 20  /mpeg"          
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
5e90: 0a 20 20 20 20 7b 20 22 6d 70 67 61 22 2c 20 20  .    { "mpga",  
5ea0: 20 20 20 20 20 34 2c 20 22 61 75 64 69 6f 2f 6d       4, "audio/m
5eb0: 70 65 67 22 20 20 20 20 20 20 20 20 20 20 20 20  peg"            
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5ed0: 20 20 20 7b 20 22 6d 70 67 22 2c 20 20 20 20 20     { "mpg",     
5ee0: 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 6d 70 65     3, "video/mpe
5ef0: 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g"              
5f00: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5f10: 20 7b 20 22 6d 73 22 2c 20 20 20 20 20 20 20 20   { "ms",        
5f20: 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   2, "application
5f30: 2f 78 2d 74 72 6f 66 66 2d 6d 73 22 20 20 20 20  /x-troff-ms"    
5f40: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5f50: 20 22 6d 73 68 22 2c 20 20 20 20 20 20 20 20 33   "msh",        3
5f60: 2c 20 22 6d 6f 64 65 6c 2f 6d 65 73 68 22 20 20  , "model/mesh"  
5f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f80: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5f90: 6e 63 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  nc",         2, 
5fa0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6e  "application/x-n
5fb0: 65 74 63 64 66 22 20 20 20 20 20 20 20 20 20 20  etcdf"          
5fc0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 64      },.    { "od
5fd0: 61 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  a",        3, "a
5fe0: 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 64 61 22 20  pplication/oda" 
5ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6000: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 67 67 22    },.    { "ogg"
6010: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
6020: 6c 69 63 61 74 69 6f 6e 2f 6f 67 67 22 20 20 20  lication/ogg"   
6030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6040: 7d 2c 0a 20 20 20 20 7b 20 22 6f 67 6d 22 2c 20  },.    { "ogm", 
6050: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
6060: 63 61 74 69 6f 6e 2f 6f 67 67 22 20 20 20 20 20  cation/ogg"     
6070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6080: 0a 20 20 20 20 7b 20 22 70 62 6d 22 2c 20 20 20  .    { "pbm",   
6090: 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78       3, "image/x
60a0: 2d 70 6f 72 74 61 62 6c 65 2d 62 69 74 6d 61 70  -portable-bitmap
60b0: 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  "           },. 
60c0: 20 20 20 7b 20 22 70 64 62 22 2c 20 20 20 20 20     { "pdb",     
60d0: 20 20 20 33 2c 20 22 63 68 65 6d 69 63 61 6c 2f     3, "chemical/
60e0: 78 2d 70 64 62 22 20 20 20 20 20 20 20 20 20 20  x-pdb"          
60f0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6100: 20 7b 20 22 70 64 66 22 2c 20 20 20 20 20 20 20   { "pdf",       
6110: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
6120: 2f 70 64 66 22 20 20 20 20 20 20 20 20 20 20 20  /pdf"           
6130: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6140: 20 22 70 67 6d 22 2c 20 20 20 20 20 20 20 20 33   "pgm",        3
6150: 2c 20 22 69 6d 61 67 65 2f 78 2d 70 6f 72 74 61  , "image/x-porta
6160: 62 6c 65 2d 67 72 61 79 6d 61 70 22 20 20 20 20  ble-graymap"    
6170: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6180: 70 67 6e 22 2c 20 20 20 20 20 20 20 20 33 2c 20  pgn",        3, 
6190: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 63  "application/x-c
61a0: 68 65 73 73 2d 70 67 6e 22 20 20 20 20 20 20 20  hess-pgn"       
61b0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 67      },.    { "pg
61c0: 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  p",        3, "a
61d0: 70 70 6c 69 63 61 74 69 6f 6e 2f 70 67 70 22 20  pplication/pgp" 
61e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61f0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 6c 22 2c    },.    { "pl",
6200: 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70 70           2, "app
6210: 6c 69 63 61 74 69 6f 6e 2f 78 2d 70 65 72 6c 22  lication/x-perl"
6220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6230: 7d 2c 0a 20 20 20 20 7b 20 22 70 6d 22 2c 20 20  },.    { "pm",  
6240: 20 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69         2, "appli
6250: 63 61 74 69 6f 6e 2f 78 2d 70 65 72 6c 22 20 20  cation/x-perl"  
6260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6270: 0a 20 20 20 20 7b 20 22 70 6e 67 22 2c 20 20 20  .    { "png",   
6280: 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 70       3, "image/p
6290: 6e 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ng"             
62a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
62b0: 20 20 20 7b 20 22 70 6e 6d 22 2c 20 20 20 20 20     { "pnm",     
62c0: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 70     3, "image/x-p
62d0: 6f 72 74 61 62 6c 65 2d 61 6e 79 6d 61 70 22 20  ortable-anymap" 
62e0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
62f0: 20 7b 20 22 70 6f 74 22 2c 20 20 20 20 20 20 20   { "pot",       
6300: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
6310: 2f 6d 73 70 6f 77 65 72 70 6f 69 6e 74 22 20 20  /mspowerpoint"  
6320: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6330: 20 22 70 70 6d 22 2c 20 20 20 20 20 20 20 20 33   "ppm",        3
6340: 2c 20 22 69 6d 61 67 65 2f 78 2d 70 6f 72 74 61  , "image/x-porta
6350: 62 6c 65 2d 70 69 78 6d 61 70 22 20 20 20 20 20  ble-pixmap"     
6360: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6370: 70 70 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20  pps",        3, 
6380: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 70  "application/msp
6390: 6f 77 65 72 70 6f 69 6e 74 22 20 20 20 20 20 20  owerpoint"      
63a0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 70      },.    { "pp
63b0: 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  t",        3, "a
63c0: 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 70 6f 77  pplication/mspow
63d0: 65 72 70 6f 69 6e 74 22 20 20 20 20 20 20 20 20  erpoint"        
63e0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 70 7a 22    },.    { "ppz"
63f0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
6400: 6c 69 63 61 74 69 6f 6e 2f 6d 73 70 6f 77 65 72  lication/mspower
6410: 70 6f 69 6e 74 22 20 20 20 20 20 20 20 20 20 20  point"          
6420: 7d 2c 0a 20 20 20 20 7b 20 22 70 72 65 22 2c 20  },.    { "pre", 
6430: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
6440: 63 61 74 69 6f 6e 2f 78 2d 66 72 65 65 6c 61 6e  cation/x-freelan
6450: 63 65 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c  ce"           },
6460: 0a 20 20 20 20 7b 20 22 70 72 74 22 2c 20 20 20  .    { "prt",   
6470: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
6480: 74 69 6f 6e 2f 70 72 6f 5f 65 6e 67 22 20 20 20  tion/pro_eng"   
6490: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
64a0: 20 20 20 7b 20 22 70 73 22 2c 20 20 20 20 20 20     { "ps",      
64b0: 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69     2, "applicati
64c0: 6f 6e 2f 70 6f 73 74 73 63 72 69 70 74 22 20 20  on/postscript"  
64d0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
64e0: 20 7b 20 22 71 74 22 2c 20 20 20 20 20 20 20 20   { "qt",        
64f0: 20 32 2c 20 22 76 69 64 65 6f 2f 71 75 69 63 6b   2, "video/quick
6500: 74 69 6d 65 22 20 20 20 20 20 20 20 20 20 20 20  time"           
6510: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6520: 20 22 72 61 22 2c 20 20 20 20 20 20 20 20 20 32   "ra",         2
6530: 2c 20 22 61 75 64 69 6f 2f 78 2d 72 65 61 6c 61  , "audio/x-reala
6540: 75 64 69 6f 22 20 20 20 20 20 20 20 20 20 20 20  udio"           
6550: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6560: 72 61 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20  ram",        3, 
6570: 22 61 75 64 69 6f 2f 78 2d 70 6e 2d 72 65 61 6c  "audio/x-pn-real
6580: 61 75 64 69 6f 22 20 20 20 20 20 20 20 20 20 20  audio"          
6590: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61      },.    { "ra
65a0: 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  r",        3, "a
65b0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 72 61 72  pplication/x-rar
65c0: 2d 63 6f 6d 70 72 65 73 73 65 64 22 20 20 20 20  -compressed"    
65d0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61 73 22    },.    { "ras"
65e0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61  ,        3, "ima
65f0: 67 65 2f 63 6d 75 2d 72 61 73 74 65 72 22 20 20  ge/cmu-raster"  
6600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6610: 7d 2c 0a 20 20 20 20 7b 20 22 72 61 73 22 2c 20  },.    { "ras", 
6620: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
6630: 2f 78 2d 63 6d 75 2d 72 61 73 74 65 72 22 20 20  /x-cmu-raster"  
6640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6650: 0a 20 20 20 20 7b 20 22 72 67 62 22 2c 20 20 20  .    { "rgb",   
6660: 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78       3, "image/x
6670: 2d 72 67 62 22 20 20 20 20 20 20 20 20 20 20 20  -rgb"           
6680: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6690: 20 20 20 7b 20 22 72 6d 22 2c 20 20 20 20 20 20     { "rm",      
66a0: 20 20 20 32 2c 20 22 61 75 64 69 6f 2f 78 2d 70     2, "audio/x-p
66b0: 6e 2d 72 65 61 6c 61 75 64 69 6f 22 20 20 20 20  n-realaudio"    
66c0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
66d0: 20 7b 20 22 72 6f 66 66 22 2c 20 20 20 20 20 20   { "roff",      
66e0: 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   4, "application
66f0: 2f 78 2d 74 72 6f 66 66 22 20 20 20 20 20 20 20  /x-troff"       
6700: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6710: 20 22 72 70 6d 22 2c 20 20 20 20 20 20 20 20 33   "rpm",        3
6720: 2c 20 22 61 75 64 69 6f 2f 78 2d 70 6e 2d 72 65  , "audio/x-pn-re
6730: 61 6c 61 75 64 69 6f 2d 70 6c 75 67 69 6e 22 20  alaudio-plugin" 
6740: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6750: 72 74 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20  rtf",        3, 
6760: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 72 74 66  "application/rtf
6770: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
6780: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 74      },.    { "rt
6790: 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74  f",        3, "t
67a0: 65 78 74 2f 72 74 66 22 20 20 20 20 20 20 20 20  ext/rtf"        
67b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67c0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 74 78 22    },.    { "rtx"
67d0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65 78  ,        3, "tex
67e0: 74 2f 72 69 63 68 74 65 78 74 22 20 20 20 20 20  t/richtext"     
67f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6800: 7d 2c 0a 20 20 20 20 7b 20 22 73 63 6d 22 2c 20  },.    { "scm", 
6810: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
6820: 63 61 74 69 6f 6e 2f 78 2d 6c 6f 74 75 73 73 63  cation/x-lotussc
6830: 72 65 65 6e 63 61 6d 22 20 20 20 20 20 20 7d 2c  reencam"      },
6840: 0a 20 20 20 20 7b 20 22 73 65 74 22 2c 20 20 20  .    { "set",   
6850: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
6860: 74 69 6f 6e 2f 73 65 74 22 20 20 20 20 20 20 20  tion/set"       
6870: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6880: 20 20 20 7b 20 22 73 67 6d 6c 22 2c 20 20 20 20     { "sgml",    
6890: 20 20 20 34 2c 20 22 74 65 78 74 2f 73 67 6d 6c     4, "text/sgml
68a0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
68b0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
68c0: 20 7b 20 22 73 67 6d 22 2c 20 20 20 20 20 20 20   { "sgm",       
68d0: 20 33 2c 20 22 74 65 78 74 2f 73 67 6d 6c 22 20   3, "text/sgml" 
68e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68f0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6900: 20 22 73 68 22 2c 20 20 20 20 20 20 20 20 20 32   "sh",         2
6910: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
6920: 2d 73 68 22 20 20 20 20 20 20 20 20 20 20 20 20  -sh"            
6930: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6940: 73 68 61 72 22 2c 20 20 20 20 20 20 20 34 2c 20  shar",       4, 
6950: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73  "application/x-s
6960: 68 61 72 22 20 20 20 20 20 20 20 20 20 20 20 20  har"            
6970: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 69      },.    { "si
6980: 6c 6f 22 2c 20 20 20 20 20 20 20 34 2c 20 22 6d  lo",       4, "m
6990: 6f 64 65 6c 2f 6d 65 73 68 22 20 20 20 20 20 20  odel/mesh"      
69a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69b0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 69 74 22    },.    { "sit"
69c0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
69d0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 74 75 66 66  lication/x-stuff
69e0: 69 74 22 20 20 20 20 20 20 20 20 20 20 20 20 20  it"             
69f0: 7d 2c 0a 20 20 20 20 7b 20 22 73 6b 64 22 2c 20  },.    { "skd", 
6a00: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
6a10: 63 61 74 69 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20  cation/x-koan"  
6a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6a30: 0a 20 20 20 20 7b 20 22 73 6b 6d 22 2c 20 20 20  .    { "skm",   
6a40: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
6a50: 74 69 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20 20  tion/x-koan"    
6a60: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6a70: 20 20 20 7b 20 22 73 6b 70 22 2c 20 20 20 20 20     { "skp",     
6a80: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
6a90: 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20 20 20 20  on/x-koan"      
6aa0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6ab0: 20 7b 20 22 73 6b 74 22 2c 20 20 20 20 20 20 20   { "skt",       
6ac0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
6ad0: 2f 78 2d 6b 6f 61 6e 22 20 20 20 20 20 20 20 20  /x-koan"        
6ae0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6af0: 20 22 73 6d 69 22 2c 20 20 20 20 20 20 20 20 33   "smi",        3
6b00: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 73  , "application/s
6b10: 6d 69 6c 22 20 20 20 20 20 20 20 20 20 20 20 20  mil"            
6b20: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6b30: 73 6d 69 6c 22 2c 20 20 20 20 20 20 20 34 2c 20  smil",       4, 
6b40: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 73 6d 69  "application/smi
6b50: 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l"              
6b60: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6e      },.    { "sn
6b70: 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  d",        3, "a
6b80: 75 64 69 6f 2f 62 61 73 69 63 22 20 20 20 20 20  udio/basic"     
6b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ba0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6f 6c 22    },.    { "sol"
6bb0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
6bc0: 6c 69 63 61 74 69 6f 6e 2f 73 6f 6c 69 64 73 22  lication/solids"
6bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6be0: 7d 2c 0a 20 20 20 20 7b 20 22 73 70 6c 22 2c 20  },.    { "spl", 
6bf0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
6c00: 63 61 74 69 6f 6e 2f 78 2d 66 75 74 75 72 65 73  cation/x-futures
6c10: 70 6c 61 73 68 22 20 20 20 20 20 20 20 20 7d 2c  plash"        },
6c20: 0a 20 20 20 20 7b 20 22 73 72 63 22 2c 20 20 20  .    { "src",   
6c30: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
6c40: 74 69 6f 6e 2f 78 2d 77 61 69 73 2d 73 6f 75 72  tion/x-wais-sour
6c50: 63 65 22 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  ce"         },. 
6c60: 20 20 20 7b 20 22 73 74 65 70 22 2c 20 20 20 20     { "step",    
6c70: 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69     4, "applicati
6c80: 6f 6e 2f 53 54 45 50 22 20 20 20 20 20 20 20 20  on/STEP"        
6c90: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6ca0: 20 7b 20 22 73 74 6c 22 2c 20 20 20 20 20 20 20   { "stl",       
6cb0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
6cc0: 2f 53 4c 41 22 20 20 20 20 20 20 20 20 20 20 20  /SLA"           
6cd0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6ce0: 20 22 73 74 70 22 2c 20 20 20 20 20 20 20 20 33   "stp",        3
6cf0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 53  , "application/S
6d00: 54 45 50 22 20 20 20 20 20 20 20 20 20 20 20 20  TEP"            
6d10: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6d20: 73 76 34 63 70 69 6f 22 2c 20 20 20 20 37 2c 20  sv4cpio",    7, 
6d30: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73  "application/x-s
6d40: 76 34 63 70 69 6f 22 20 20 20 20 20 20 20 20 20  v4cpio"         
6d50: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 76      },.    { "sv
6d60: 34 63 72 63 22 2c 20 20 20 20 20 36 2c 20 22 61  4crc",     6, "a
6d70: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 76 34  pplication/x-sv4
6d80: 63 72 63 22 20 20 20 20 20 20 20 20 20 20 20 20  crc"            
6d90: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 77 66 22    },.    { "swf"
6da0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
6db0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 68 6f 63 6b  lication/x-shock
6dc0: 77 61 76 65 2d 66 6c 61 73 68 22 20 20 20 20 20  wave-flash"     
6dd0: 7d 2c 0a 20 20 20 20 7b 20 22 74 22 2c 20 20 20  },.    { "t",   
6de0: 20 20 20 20 20 20 20 31 2c 20 22 61 70 70 6c 69         1, "appli
6df0: 63 61 74 69 6f 6e 2f 78 2d 74 72 6f 66 66 22 20  cation/x-troff" 
6e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
6e10: 0a 20 20 20 20 7b 20 22 74 61 72 22 2c 20 20 20  .    { "tar",   
6e20: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
6e30: 74 69 6f 6e 2f 78 2d 74 61 72 22 20 20 20 20 20  tion/x-tar"     
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
6e50: 20 20 20 7b 20 22 74 63 6c 22 2c 20 20 20 20 20     { "tcl",     
6e60: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
6e70: 6f 6e 2f 78 2d 74 63 6c 22 20 20 20 20 20 20 20  on/x-tcl"       
6e80: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
6e90: 20 7b 20 22 74 65 78 22 2c 20 20 20 20 20 20 20   { "tex",       
6ea0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
6eb0: 2f 78 2d 74 65 78 22 20 20 20 20 20 20 20 20 20  /x-tex"         
6ec0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
6ed0: 20 22 74 65 78 69 22 2c 20 20 20 20 20 20 20 34   "texi",       4
6ee0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
6ef0: 2d 74 65 78 69 6e 66 6f 22 20 20 20 20 20 20 20  -texinfo"       
6f00: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
6f10: 74 65 78 69 6e 66 6f 22 2c 20 20 20 20 37 2c 20  texinfo",    7, 
6f20: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74  "application/x-t
6f30: 65 78 69 6e 66 6f 22 20 20 20 20 20 20 20 20 20  exinfo"         
6f40: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 67      },.    { "tg
6f50: 7a 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  z",        3, "a
6f60: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 61 72  pplication/x-tar
6f70: 2d 67 7a 22 20 20 20 20 20 20 20 20 20 20 20 20  -gz"            
6f80: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 69 66 66    },.    { "tiff
6f90: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 69 6d 61  ",       4, "ima
6fa0: 67 65 2f 74 69 66 66 22 20 20 20 20 20 20 20 20  ge/tiff"        
6fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fc0: 7d 2c 0a 20 20 20 20 7b 20 22 74 69 66 22 2c 20  },.    { "tif", 
6fd0: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
6fe0: 2f 74 69 66 66 22 20 20 20 20 20 20 20 20 20 20  /tiff"          
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7000: 0a 20 20 20 20 7b 20 22 74 72 22 2c 20 20 20 20  .    { "tr",    
7010: 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61       2, "applica
7020: 74 69 6f 6e 2f 78 2d 74 72 6f 66 66 22 20 20 20  tion/x-troff"   
7030: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7040: 20 20 20 7b 20 22 74 73 69 22 2c 20 20 20 20 20     { "tsi",     
7050: 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 54 53 50     3, "audio/TSP
7060: 2d 61 75 64 69 6f 22 20 20 20 20 20 20 20 20 20  -audio"         
7070: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7080: 20 7b 20 22 74 73 70 22 2c 20 20 20 20 20 20 20   { "tsp",       
7090: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
70a0: 2f 64 73 70 74 79 70 65 22 20 20 20 20 20 20 20  /dsptype"       
70b0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
70c0: 20 22 74 73 76 22 2c 20 20 20 20 20 20 20 20 33   "tsv",        3
70d0: 2c 20 22 74 65 78 74 2f 74 61 62 2d 73 65 70 61  , "text/tab-sepa
70e0: 72 61 74 65 64 2d 76 61 6c 75 65 73 22 20 20 20  rated-values"   
70f0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7100: 74 78 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20  txt",        3, 
7110: 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20  "text/plain"    
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7130: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 75 6e      },.    { "un
7140: 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  v",        3, "a
7150: 70 70 6c 69 63 61 74 69 6f 6e 2f 69 2d 64 65 61  pplication/i-dea
7160: 73 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s"              
7170: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 75 73 74 61    },.    { "usta
7180: 72 22 2c 20 20 20 20 20 20 35 2c 20 22 61 70 70  r",      5, "app
7190: 6c 69 63 61 74 69 6f 6e 2f 78 2d 75 73 74 61 72  lication/x-ustar
71a0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
71b0: 7d 2c 0a 20 20 20 20 7b 20 22 76 63 64 22 2c 20  },.    { "vcd", 
71c0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
71d0: 63 61 74 69 6f 6e 2f 78 2d 63 64 6c 69 6e 6b 22  cation/x-cdlink"
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
71f0: 0a 20 20 20 20 7b 20 22 76 64 61 22 2c 20 20 20  .    { "vda",   
7200: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
7210: 74 69 6f 6e 2f 76 64 61 22 20 20 20 20 20 20 20  tion/vda"       
7220: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7230: 20 20 20 7b 20 22 76 69 76 22 2c 20 20 20 20 20     { "viv",     
7240: 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 76 6e 64     3, "video/vnd
7250: 2e 76 69 76 6f 22 20 20 20 20 20 20 20 20 20 20  .vivo"          
7260: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7270: 20 7b 20 22 76 69 76 6f 22 2c 20 20 20 20 20 20   { "vivo",      
7280: 20 34 2c 20 22 76 69 64 65 6f 2f 76 6e 64 2e 76   4, "video/vnd.v
7290: 69 76 6f 22 20 20 20 20 20 20 20 20 20 20 20 20  ivo"            
72a0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
72b0: 20 22 76 72 6d 6c 22 2c 20 20 20 20 20 20 20 34   "vrml",       4
72c0: 2c 20 22 6d 6f 64 65 6c 2f 76 72 6d 6c 22 20 20  , "model/vrml"  
72d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72e0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
72f0: 77 61 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20  wav",        3, 
7300: 22 61 75 64 69 6f 2f 78 2d 77 61 76 22 20 20 20  "audio/x-wav"   
7310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7320: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 61      },.    { "wa
7330: 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  x",        3, "a
7340: 75 64 69 6f 2f 78 2d 6d 73 2d 77 61 78 22 20 20  udio/x-ms-wax"  
7350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7360: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 69 6b 69    },.    { "wiki
7370: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70 70  ",       4, "app
7380: 6c 69 63 61 74 69 6f 6e 2f 78 2d 66 6f 73 73 69  lication/x-fossi
7390: 6c 2d 77 69 6b 69 22 20 20 20 20 20 20 20 20 20  l-wiki"         
73a0: 7d 2c 0a 20 20 20 20 7b 20 22 77 6d 61 22 2c 20  },.    { "wma", 
73b0: 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f         3, "audio
73c0: 2f 78 2d 6d 73 2d 77 6d 61 22 20 20 20 20 20 20  /x-ms-wma"      
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
73e0: 0a 20 20 20 20 7b 20 22 77 6d 76 22 2c 20 20 20  .    { "wmv",   
73f0: 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 78       3, "video/x
7400: 2d 6d 73 2d 77 6d 76 22 20 20 20 20 20 20 20 20  -ms-wmv"        
7410: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7420: 20 20 20 7b 20 22 77 6d 78 22 2c 20 20 20 20 20     { "wmx",     
7430: 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d     3, "video/x-m
7440: 73 2d 77 6d 78 22 20 20 20 20 20 20 20 20 20 20  s-wmx"          
7450: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7460: 20 7b 20 22 77 72 6c 22 2c 20 20 20 20 20 20 20   { "wrl",       
7470: 20 33 2c 20 22 6d 6f 64 65 6c 2f 76 72 6d 6c 22   3, "model/vrml"
7480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7490: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
74a0: 20 22 77 76 78 22 2c 20 20 20 20 20 20 20 20 33   "wvx",        3
74b0: 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 77 76  , "video/x-ms-wv
74c0: 78 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x"              
74d0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
74e0: 78 62 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20  xbm",        3, 
74f0: 22 69 6d 61 67 65 2f 78 2d 78 62 69 74 6d 61 70  "image/x-xbitmap
7500: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
7510: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 6c      },.    { "xl
7520: 63 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  c",        3, "a
7530: 70 70 6c 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d  pplication/vnd.m
7540: 73 2d 65 78 63 65 6c 22 20 20 20 20 20 20 20 20  s-excel"        
7550: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 6c 6c 22    },.    { "xll"
7560: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
7570: 6c 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d  lication/vnd.ms-
7580: 65 78 63 65 6c 22 20 20 20 20 20 20 20 20 20 20  excel"          
7590: 7d 2c 0a 20 20 20 20 7b 20 22 78 6c 6d 22 2c 20  },.    { "xlm", 
75a0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
75b0: 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78  cation/vnd.ms-ex
75c0: 63 65 6c 22 20 20 20 20 20 20 20 20 20 20 7d 2c  cel"          },
75d0: 0a 20 20 20 20 7b 20 22 78 6c 73 22 2c 20 20 20  .    { "xls",   
75e0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
75f0: 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65  tion/vnd.ms-exce
7600: 6c 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  l"          },. 
7610: 20 20 20 7b 20 22 78 6c 77 22 2c 20 20 20 20 20     { "xlw",     
7620: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
7630: 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22  on/vnd.ms-excel"
7640: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7650: 20 7b 20 22 78 6d 6c 22 2c 20 20 20 20 20 20 20   { "xml",       
7660: 20 33 2c 20 22 74 65 78 74 2f 78 6d 6c 22 20 20   3, "text/xml"  
7670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7680: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7690: 20 22 78 70 6d 22 2c 20 20 20 20 20 20 20 20 33   "xpm",        3
76a0: 2c 20 22 69 6d 61 67 65 2f 78 2d 78 70 69 78 6d  , "image/x-xpixm
76b0: 61 70 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ap"             
76c0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
76d0: 78 77 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20  xwd",        3, 
76e0: 22 69 6d 61 67 65 2f 78 2d 78 77 69 6e 64 6f 77  "image/x-xwindow
76f0: 64 75 6d 70 22 20 20 20 20 20 20 20 20 20 20 20  dump"           
7700: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 79      },.    { "xy
7710: 7a 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 63  z",        3, "c
7720: 68 65 6d 69 63 61 6c 2f 78 2d 70 64 62 22 20 20  hemical/x-pdb"  
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 7a 69 70 22    },.    { "zip"
7750: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
7760: 6c 69 63 61 74 69 6f 6e 2f 7a 69 70 22 20 20 20  lication/zip"   
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7780: 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 66 6f 72 28 69  },.  };..  for(i
7790: 3d 6e 4e 61 6d 65 2d 31 3b 20 69 3e 30 20 26 26  =nName-1; i>0 &&
77a0: 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 2e 27 3b 20   zName[i]!='.'; 
77b0: 69 2d 2d 29 7b 7d 0a 20 20 7a 20 3d 20 26 7a 4e  i--){}.  z = &zN
77c0: 61 6d 65 5b 69 2b 31 5d 3b 0a 20 20 6c 65 6e 20  ame[i+1];.  len 
77d0: 3d 20 6e 4e 61 6d 65 20 2d 20 69 3b 0a 20 20 69  = nName - i;.  i
77e0: 66 28 20 6c 65 6e 3c 73 69 7a 65 6f 66 28 7a 53  f( len<sizeof(zS
77f0: 75 66 66 69 78 29 2d 31 20 29 7b 0a 20 20 20 20  uffix)-1 ){.    
7800: 73 74 72 63 70 79 28 7a 53 75 66 66 69 78 2c 20  strcpy(zSuffix, 
7810: 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  z);.    for(i=0;
7820: 20 7a 53 75 66 66 69 78 5b 69 5d 3b 20 69 2b 2b   zSuffix[i]; i++
7830: 29 20 7a 53 75 66 66 69 78 5b 69 5d 20 3d 20 74  ) zSuffix[i] = t
7840: 6f 6c 6f 77 65 72 28 7a 53 75 66 66 69 78 5b 69  olower(zSuffix[i
7850: 5d 29 3b 0a 20 20 20 20 66 69 72 73 74 20 3d 20  ]);.    first = 
7860: 30 3b 0a 20 20 20 20 6c 61 73 74 20 3d 20 73 69  0;.    last = si
7870: 7a 65 6f 66 28 61 4d 69 6d 65 29 2f 73 69 7a 65  zeof(aMime)/size
7880: 6f 66 28 61 4d 69 6d 65 5b 30 5d 29 3b 0a 20 20  of(aMime[0]);.  
7890: 20 20 77 68 69 6c 65 28 20 66 69 72 73 74 3c 3d    while( first<=
78a0: 6c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  last ){.      in
78b0: 74 20 63 3b 0a 20 20 20 20 20 20 69 20 3d 20 28  t c;.      i = (
78c0: 66 69 72 73 74 2b 6c 61 73 74 29 2f 32 3b 0a 20  first+last)/2;. 
78d0: 20 20 20 20 20 63 20 3d 20 73 74 72 63 6d 70 28       c = strcmp(
78e0: 7a 53 75 66 66 69 78 2c 20 61 4d 69 6d 65 5b 69  zSuffix, aMime[i
78f0: 5d 2e 7a 53 75 66 66 69 78 29 3b 0a 20 20 20 20  ].zSuffix);.    
7900: 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74    if( c==0 ) ret
7910: 75 72 6e 20 61 4d 69 6d 65 5b 69 5d 2e 7a 4d 69  urn aMime[i].zMi
7920: 6d 65 74 79 70 65 3b 0a 20 20 20 20 20 20 69 66  metype;.      if
7930: 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c<0 ){.       
7940: 20 6c 61 73 74 20 3d 20 69 2d 31 3b 0a 20 20 20   last = i-1;.   
7950: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7960: 20 20 66 69 72 73 74 20 3d 20 69 2b 31 3b 0a 20    first = i+1;. 
7970: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7980: 0a 20 20 72 65 74 75 72 6e 20 22 61 70 70 6c 69  .  return "appli
7990: 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72  cation/octet-str
79a0: 65 61 6d 22 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  eam";.}../*.** T
79b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  he following tab
79c0: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 31 20 66 6f  le contains 1 fo
79d0: 72 20 61 6c 6c 20 63 68 61 72 61 63 74 65 72 73  r all characters
79e0: 20 74 68 61 74 20 61 72 65 20 70 65 72 6d 69 74   that are permit
79f0: 74 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 70 61  ted in.** the pa
7a00: 72 74 20 6f 66 20 74 68 65 20 55 52 4c 20 62 65  rt of the URL be
7a10: 66 6f 72 65 20 74 68 65 20 71 75 65 72 79 20 70  fore the query p
7a20: 61 72 61 6d 65 74 65 72 73 20 61 6e 64 20 66 72  arameters and fr
7a30: 61 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c  agment..**.** Al
7a40: 6c 6f 77 65 64 20 63 68 61 72 61 63 74 65 72 73  lowed characters
7a50: 3a 20 20 30 2d 39 20 61 2d 7a 20 41 2d 5a 20 2c  :  0-9 a-z A-Z ,
7a60: 2d 2e 2f 3a 5f 7e 0a 2a 2a 0a 2a 2a 20 44 69 73  -./:_~.**.** Dis
7a70: 61 6c 6c 6f 77 65 64 20 63 68 61 72 61 63 74 65  allowed characte
7a80: 72 73 20 69 6e 63 6c 75 64 65 3a 20 20 21 22 23  rs include:  !"#
7a90: 24 25 26 27 28 29 2a 2b 3b 3c 3d 3e 3f 5b 5c 5d  $%&'()*+;<=>?[\]
7aa0: 5e 7b 7c 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ^{|}.*/.static c
7ab0: 6f 6e 73 74 20 63 68 61 72 20 61 6c 6c 6f 77 65  onst char allowe
7ac0: 64 49 6e 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20  dInName[] = {.  
7ad0: 20 20 20 20 2f 2a 20 20 78 30 20 20 78 31 20 20      /*  x0  x1  
7ae0: 78 32 20 20 78 33 20 20 78 34 20 20 78 35 20 20  x2  x3  x4  x5  
7af0: 78 36 20 20 78 37 20 20 78 38 20 20 78 39 20 20  x6  x7  x8  x9  
7b00: 78 61 20 20 78 62 20 20 78 63 20 20 78 64 20 20  xa  xb  xc  xd  
7b10: 78 65 20 20 78 66 20 2a 2f 0a 2f 2a 20 30 78 20  xe  xf */./* 0x 
7b20: 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20  */   0,  0,  0, 
7b30: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
7b40: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
7b50: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
7b60: 20 30 2c 0a 2f 2a 20 31 78 20 2a 2f 20 20 20 30   0,./* 1x */   0
7b70: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
7b80: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
7b90: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
7ba0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a  ,  0,  0,  0,./*
7bb0: 20 32 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20   2x */   0,  0, 
7bc0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
7bd0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
7be0: 20 30 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c 20   0,  0,  1,  1, 
7bf0: 20 31 2c 20 20 31 2c 0a 2f 2a 20 33 78 20 2a 2f   1,  1,./* 3x */
7c00: 20 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31     1,  1,  1,  1
7c10: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
7c20: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 30  ,  1,  1,  1,  0
7c30: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
7c40: 2c 0a 2f 2a 20 34 78 20 2a 2f 20 20 20 30 2c 20  ,./* 4x */   0, 
7c50: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
7c60: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
7c70: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
7c80: 20 31 2c 20 20 31 2c 20 20 31 2c 0a 2f 2a 20 35   1,  1,  1,./* 5
7c90: 78 20 2a 2f 20 20 20 31 2c 20 20 31 2c 20 20 31  x */   1,  1,  1
7ca0: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
7cb0: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
7cc0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
7cd0: 2c 20 20 31 2c 0a 2f 2a 20 36 78 20 2a 2f 20 20  ,  1,./* 6x */  
7ce0: 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   0,  1,  1,  1, 
7cf0: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
7d00: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
7d10: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 0a   1,  1,  1,  1,.
7d20: 2f 2a 20 37 78 20 2a 2f 20 20 20 31 2c 20 20 31  /* 7x */   1,  1
7d30: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
7d40: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
7d50: 2c 20 20 31 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  1,  0,  0,  0
7d60: 2c 20 20 31 2c 20 20 30 2c 0a 7d 3b 0a 0a 2f 2a  ,  1,  0,.};../*
7d70: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7d80: 20 70 72 6f 63 65 73 73 65 73 20 61 20 73 69 6e   processes a sin
7d90: 67 6c 65 20 48 54 54 50 20 72 65 71 75 65 73 74  gle HTTP request
7da0: 20 6f 6e 20 73 74 61 6e 64 61 72 64 20 69 6e 70   on standard inp
7db0: 75 74 20 61 6e 64 0a 2a 2a 20 73 65 6e 64 73 20  ut and.** sends 
7dc0: 74 68 65 20 72 65 70 6c 79 20 74 6f 20 73 74 61  the reply to sta
7dd0: 6e 64 61 72 64 20 6f 75 74 70 75 74 2e 20 20 49  ndard output.  I
7de0: 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69  f the argument i
7df0: 73 20 31 20 69 74 20 6d 65 61 6e 73 0a 2a 2a 20  s 1 it means.** 
7e00: 74 68 61 74 20 77 65 20 61 72 65 20 73 68 6f 75  that we are shou
7e10: 6c 64 20 63 6c 6f 73 65 20 74 68 65 20 73 6f 63  ld close the soc
7e20: 6b 65 74 20 77 69 74 68 6f 75 74 20 70 72 6f 63  ket without proc
7e30: 65 73 73 69 6e 67 20 61 64 64 69 74 69 6f 6e 61  essing additiona
7e40: 6c 0a 2a 2a 20 48 54 54 50 20 72 65 71 75 65 73  l.** HTTP reques
7e50: 74 73 20 61 66 74 65 72 20 74 68 65 20 63 75 72  ts after the cur
7e60: 72 65 6e 74 20 72 65 71 75 65 73 74 20 66 69 6e  rent request fin
7e70: 69 73 68 65 73 2e 20 20 30 20 6d 65 61 6e 73 20  ishes.  0 means 
7e80: 77 65 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 77 65  we are.** allowe
7e90: 64 20 74 6f 20 6b 65 65 70 20 74 68 65 20 63 6f  d to keep the co
7ea0: 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 61 6e  nnection open an
7eb0: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61 64 64  d to process add
7ec0: 69 74 69 6f 6e 61 6c 20 72 65 71 75 65 73 74 73  itional requests
7ed0: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
7ee0: 65 20 6d 61 79 20 63 68 6f 6f 73 65 20 74 6f 20  e may choose to 
7ef0: 63 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65 63  close the connec
7f00: 74 69 6f 6e 20 65 76 65 6e 20 69 66 20 74 68 65  tion even if the
7f10: 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20   argument.** is 
7f20: 30 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  0..** .** If the
7f30: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 68 6f 75   connection shou
7f40: 6c 64 20 62 65 20 63 6c 6f 73 65 64 2c 20 74 68  ld be closed, th
7f50: 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73  is routine calls
7f60: 20 65 78 69 74 28 29 20 61 6e 64 0a 2a 2a 20 74   exit() and.** t
7f70: 68 75 73 20 6e 65 76 65 72 20 72 65 74 75 72 6e  hus never return
7f80: 73 2e 20 20 49 66 20 74 68 69 73 20 72 6f 75 74  s.  If this rout
7f90: 69 6e 65 20 64 6f 65 73 20 72 65 74 75 72 6e 20  ine does return 
7fa0: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e  it means that an
7fb0: 6f 74 68 65 72 0a 2a 2a 20 48 54 54 50 20 72 65  other.** HTTP re
7fc0: 71 75 65 73 74 20 6d 61 79 20 61 70 70 65 61 72  quest may appear
7fd0: 20 6f 6e 20 74 68 65 20 77 69 72 65 2e 0a 2a 2f   on the wire..*/
7fe0: 0a 76 6f 69 64 20 50 72 6f 63 65 73 73 4f 6e 65  .void ProcessOne
7ff0: 52 65 71 75 65 73 74 28 69 6e 74 20 66 6f 72 63  Request(int forc
8000: 65 43 6c 6f 73 65 29 7b 0a 20 20 69 6e 74 20 69  eClose){.  int i
8010: 2c 20 63 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 20  , c;.  char *z; 
8020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8030: 20 2f 2a 20 55 73 65 64 20 74 6f 20 70 61 72 73   /* Used to pars
8040: 65 20 75 70 20 61 20 73 74 72 69 6e 67 20 2a 2f  e up a string */
8050: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73  .  struct stat s
8060: 74 61 74 62 75 66 3b 20 20 20 20 20 20 2f 2a 20  tatbuf;      /* 
8070: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
8080: 74 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  t the file to be
8090: 20 72 65 74 72 69 65 76 65 64 20 2a 2f 0a 20 20   retrieved */.  
80a0: 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20  FILE *in;       
80b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
80c0: 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 43 47   reading from CG
80d0: 49 20 73 63 72 69 70 74 73 20 2a 2f 0a 20 20 63  I scripts */.  c
80e0: 68 61 72 20 7a 4c 69 6e 65 5b 31 30 30 30 5d 3b  har zLine[1000];
80f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 75           /* A bu
8100: 66 66 65 72 20 66 6f 72 20 69 6e 70 75 74 20 6c  ffer for input l
8110: 69 6e 65 73 20 6f 72 20 66 6f 72 6d 69 6e 67 20  ines or forming 
8120: 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43  names */..  /* C
8130: 68 61 6e 67 65 20 64 69 72 65 63 74 6f 72 69 65  hange directorie
8140: 73 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 6f 66  s to the root of
8150: 20 74 68 65 20 48 54 54 50 20 66 69 6c 65 73 79   the HTTP filesy
8160: 73 74 65 6d 0a 20 20 2a 2f 0a 20 20 69 66 28 20  stem.  */.  if( 
8170: 63 68 64 69 72 28 7a 52 6f 6f 74 5b 30 5d 20 3f  chdir(zRoot[0] ?
8180: 20 7a 52 6f 6f 74 20 3a 20 22 2f 22 29 21 3d 30   zRoot : "/")!=0
8190: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75   ){.    char zBu
81a0: 66 5b 31 30 30 30 5d 3b 0a 20 20 20 20 4d 61 6c  f[1000];.    Mal
81b0: 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f  function(__LINE_
81c0: 5f 2c 20 22 63 61 6e 6e 6f 74 20 63 68 64 69 72  _, "cannot chdir
81d0: 20 74 6f 20 5b 25 73 5d 20 66 72 6f 6d 20 5b 25   to [%s] from [%
81e0: 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 52  s]",.         zR
81f0: 6f 6f 74 2c 20 67 65 74 63 77 64 28 7a 42 75 66  oot, getcwd(zBuf
8200: 2c 39 39 39 29 29 3b 0a 20 20 7d 0a 20 20 6e 52  ,999));.  }.  nR
8210: 65 71 75 65 73 74 2b 2b 3b 0a 0a 20 20 2f 2a 0a  equest++;..  /*.
8220: 20 20 2a 2a 20 57 65 20 6d 75 73 74 20 72 65 63    ** We must rec
8230: 65 69 76 65 20 61 20 63 6f 6d 70 6c 65 74 65 20  eive a complete 
8240: 68 65 61 64 65 72 20 77 69 74 68 69 6e 20 31 35  header within 15
8250: 20 73 65 63 6f 6e 64 73 0a 20 20 2a 2f 0a 20 20   seconds.  */.  
8260: 73 69 67 6e 61 6c 28 53 49 47 41 4c 52 4d 2c 20  signal(SIGALRM, 
8270: 54 69 6d 65 6f 75 74 29 3b 0a 20 20 69 66 28 20  Timeout);.  if( 
8280: 75 73 65 54 69 6d 65 6f 75 74 20 29 20 61 6c 61  useTimeout ) ala
8290: 72 6d 28 31 35 29 3b 0a 0a 20 20 2f 2a 20 47 65  rm(15);..  /* Ge
82a0: 74 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e 65  t the first line
82b0: 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 20   of the request 
82c0: 61 6e 64 20 70 61 72 73 65 20 6f 75 74 20 74 68  and parse out th
82d0: 65 0a 20 20 2a 2a 20 6d 65 74 68 6f 64 2c 20 74  e.  ** method, t
82e0: 68 65 20 73 63 72 69 70 74 20 61 6e 64 20 74 68  he script and th
82f0: 65 20 70 72 6f 74 6f 63 6f 6c 2e 0a 20 20 2a 2f  e protocol..  */
8300: 0a 20 20 69 66 28 20 66 67 65 74 73 28 7a 4c 69  .  if( fgets(zLi
8310: 6e 65 2c 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29  ne,sizeof(zLine)
8320: 2c 73 74 64 69 6e 29 3d 3d 30 20 29 7b 0a 20 20  ,stdin)==0 ){.  
8330: 20 20 65 78 69 74 28 30 29 3b 0a 20 20 7d 0a 20    exit(0);.  }. 
8340: 20 6f 6d 69 74 4c 6f 67 20 3d 20 30 3b 0a 20 20   omitLog = 0;.  
8350: 6e 49 6e 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 4c  nIn += strlen(zL
8360: 69 6e 65 29 3b 0a 20 20 7a 4d 65 74 68 6f 64 20  ine);.  zMethod 
8370: 3d 20 53 74 72 44 75 70 28 47 65 74 46 69 72 73  = StrDup(GetFirs
8380: 74 45 6c 65 6d 65 6e 74 28 7a 4c 69 6e 65 2c 26  tElement(zLine,&
8390: 7a 29 29 3b 0a 20 20 7a 52 65 61 6c 53 63 72 69  z));.  zRealScri
83a0: 70 74 20 3d 20 7a 53 63 72 69 70 74 20 3d 20 53  pt = zScript = S
83b0: 74 72 44 75 70 28 47 65 74 46 69 72 73 74 45 6c  trDup(GetFirstEl
83c0: 65 6d 65 6e 74 28 7a 2c 26 7a 29 29 3b 0a 20 20  ement(z,&z));.  
83d0: 7a 50 72 6f 74 6f 63 6f 6c 20 3d 20 53 74 72 44  zProtocol = StrD
83e0: 75 70 28 47 65 74 46 69 72 73 74 45 6c 65 6d 65  up(GetFirstEleme
83f0: 6e 74 28 7a 2c 26 7a 29 29 3b 0a 20 20 69 66 28  nt(z,&z));.  if(
8400: 20 7a 50 72 6f 74 6f 63 6f 6c 3d 3d 30 20 7c 7c   zProtocol==0 ||
8410: 20 73 74 72 6e 63 6d 70 28 7a 50 72 6f 74 6f 63   strncmp(zProtoc
8420: 6f 6c 2c 22 48 54 54 50 2f 22 2c 35 29 21 3d 30  ol,"HTTP/",5)!=0
8430: 20 7c 7c 20 73 74 72 6c 65 6e 28 7a 50 72 6f 74   || strlen(zProt
8440: 6f 63 6f 6c 29 21 3d 38 20 29 7b 0a 20 20 20 20  ocol)!=8 ){.    
8450: 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 34  StartResponse("4
8460: 30 30 20 42 61 64 20 52 65 71 75 65 73 74 22 29  00 Bad Request")
8470: 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72  ;.    nOut += pr
8480: 69 6e 74 66 28 0a 20 20 20 20 20 20 22 43 6f 6e  intf(.      "Con
8490: 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f  tent-type: text/
84a0: 68 74 6d 6c 5c 72 5c 6e 22 0a 20 20 20 20 20 20  html\r\n".      
84b0: 22 5c 72 5c 6e 22 0a 20 20 20 20 20 20 22 3c 74  "\r\n".      "<t
84c0: 69 74 6c 65 3e 55 6e 6b 6e 6f 77 6e 20 50 72 6f  itle>Unknown Pro
84d0: 74 6f 63 6f 6c 20 4f 6e 20 48 54 54 50 20 52 65  tocol On HTTP Re
84e0: 71 75 65 73 74 3c 2f 74 69 74 6c 65 3e 5c 6e 22  quest</title>\n"
84f0: 0a 20 20 20 20 20 20 22 3c 68 31 3e 55 6e 6b 6e  .      "<h1>Unkn
8500: 6f 77 6e 20 50 72 6f 74 6f 63 6f 6c 3c 2f 68 31  own Protocol</h1
8510: 3e 5c 6e 22 0a 20 20 20 20 20 20 22 54 68 69 73  >\n".      "This
8520: 20 73 65 72 76 65 72 20 64 6f 65 73 20 6e 6f 74   server does not
8530: 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20   understand the 
8540: 72 65 71 75 65 73 74 65 64 20 70 72 6f 74 6f 63  requested protoc
8550: 6f 6c 5c 6e 22 0a 20 20 20 20 29 3b 0a 20 20 20  ol\n".    );.   
8560: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 29   MakeLogEntry(0)
8570: 3b 0a 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20  ;.    exit(0);. 
8580: 20 7d 0a 20 20 69 66 28 20 7a 53 63 72 69 70 74   }.  if( zScript
8590: 5b 30 5d 3d 3d 30 20 29 20 4e 6f 74 46 6f 75 6e  [0]==0 ) NotFoun
85a0: 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 69  d(__LINE__);.  i
85b0: 66 28 20 66 6f 72 63 65 43 6c 6f 73 65 20 29 7b  f( forceClose ){
85c0: 0a 20 20 20 20 63 6c 6f 73 65 43 6f 6e 6e 65 63  .    closeConnec
85d0: 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  tion = 1;.  }els
85e0: 65 20 69 66 28 20 7a 50 72 6f 74 6f 63 6f 6c 5b  e if( zProtocol[
85f0: 35 5d 3c 27 31 27 20 7c 7c 20 7a 50 72 6f 74 6f  5]<'1' || zProto
8600: 63 6f 6c 5b 37 5d 3c 27 31 27 20 29 7b 0a 20 20  col[7]<'1' ){.  
8610: 20 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f    closeConnectio
8620: 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n = 1;.  }..  /*
8630: 20 54 68 69 73 20 76 65 72 79 20 73 69 6d 70 6c   This very simpl
8640: 65 20 73 65 72 76 65 72 20 6f 6e 6c 79 20 75 6e  e server only un
8650: 64 65 72 73 74 61 6e 64 73 20 74 68 65 20 47 45  derstands the GE
8660: 54 2c 20 50 4f 53 54 0a 20 20 2a 2a 20 61 6e 64  T, POST.  ** and
8670: 20 48 45 41 44 20 6d 65 74 68 6f 64 73 0a 20 20   HEAD methods.  
8680: 2a 2f 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  */.  if( strcmp(
8690: 7a 4d 65 74 68 6f 64 2c 22 47 45 54 22 29 21 3d  zMethod,"GET")!=
86a0: 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 65 74  0 && strcmp(zMet
86b0: 68 6f 64 2c 22 50 4f 53 54 22 29 21 3d 30 0a 20  hod,"POST")!=0. 
86c0: 20 20 20 20 20 20 26 26 20 73 74 72 63 6d 70 28        && strcmp(
86d0: 7a 4d 65 74 68 6f 64 2c 22 48 45 41 44 22 29 21  zMethod,"HEAD")!
86e0: 3d 30 20 29 7b 0a 20 20 20 20 53 74 61 72 74 52  =0 ){.    StartR
86f0: 65 73 70 6f 6e 73 65 28 22 35 30 31 20 4e 6f 74  esponse("501 Not
8700: 20 49 6d 70 6c 65 6d 65 6e 74 65 64 22 29 3b 0a   Implemented");.
8710: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
8720: 74 66 28 0a 20 20 20 20 20 20 22 43 6f 6e 74 65  tf(.      "Conte
8730: 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 68 74  nt-type: text/ht
8740: 6d 6c 5c 72 5c 6e 22 0a 20 20 20 20 20 20 22 5c  ml\r\n".      "\
8750: 72 5c 6e 22 0a 20 20 20 20 20 20 22 3c 68 65 61  r\n".      "<hea
8760: 64 3e 3c 74 69 74 6c 65 3e 4d 65 74 68 6f 64 20  d><title>Method 
8770: 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 3c  not implemented<
8780: 2f 74 69 74 6c 65 3e 3c 2f 68 65 61 64 3e 5c 6e  /title></head>\n
8790: 22 0a 20 20 20 20 20 20 22 3c 62 6f 64 79 3e 3c  ".      "<body><
87a0: 68 31 3e 4d 65 74 68 6f 64 20 6e 6f 74 20 69 6d  h1>Method not im
87b0: 70 6c 65 6d 65 6e 74 65 64 3c 2f 68 31 3e 5c 6e  plemented</h1>\n
87c0: 22 0a 20 20 20 20 20 20 22 54 68 65 20 25 73 20  ".      "The %s 
87d0: 6d 65 74 68 6f 64 20 69 73 20 6e 6f 74 20 69 6d  method is not im
87e0: 70 6c 65 6d 65 6e 74 65 64 20 6f 6e 20 74 68 69  plemented on thi
87f0: 73 20 73 65 72 76 65 72 2e 5c 6e 22 20 0a 20 20  s server.\n" .  
8800: 20 20 20 20 22 3c 2f 62 6f 64 79 3e 5c 6e 22 2c      "</body>\n",
8810: 0a 20 20 20 20 20 20 7a 4d 65 74 68 6f 64 29 3b  .      zMethod);
8820: 0a 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72  .    MakeLogEntr
8830: 79 28 30 29 3b 0a 20 20 20 20 65 78 69 74 28 30  y(0);.    exit(0
8840: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74  );.  }..  /* Get
8850: 20 61 6c 6c 20 74 68 65 20 6f 70 74 69 6f 6e 61   all the optiona
8860: 6c 20 66 69 65 6c 64 73 20 74 68 61 74 20 66 6f  l fields that fo
8870: 6c 6c 6f 77 20 74 68 65 20 66 69 72 73 74 20 6c  llow the first l
8880: 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 7a 43 6f 6f  ine..  */.  zCoo
8890: 6b 69 65 20 3d 20 30 3b 0a 20 20 7a 41 75 74 68  kie = 0;.  zAuth
88a0: 54 79 70 65 20 3d 20 30 3b 0a 20 20 7a 52 65 6d  Type = 0;.  zRem
88b0: 6f 74 65 55 73 65 72 20 3d 20 30 3b 0a 20 20 7a  oteUser = 0;.  z
88c0: 52 65 66 65 72 65 72 20 3d 20 30 3b 0a 20 20 77  Referer = 0;.  w
88d0: 68 69 6c 65 28 20 66 67 65 74 73 28 7a 4c 69 6e  hile( fgets(zLin
88e0: 65 2c 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c  e,sizeof(zLine),
88f0: 73 74 64 69 6e 29 20 29 7b 0a 20 20 20 20 63 68  stdin) ){.    ch
8900: 61 72 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 3b 0a  ar *zFieldName;.
8910: 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a      char *zVal;.
8920: 0a 20 20 20 20 6e 49 6e 20 2b 3d 20 73 74 72 6c  .    nIn += strl
8930: 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 7a  en(zLine);.    z
8940: 46 69 65 6c 64 4e 61 6d 65 20 3d 20 47 65 74 46  FieldName = GetF
8950: 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a 4c 69 6e  irstElement(zLin
8960: 65 2c 26 7a 56 61 6c 29 3b 0a 20 20 20 20 69 66  e,&zVal);.    if
8970: 28 20 7a 46 69 65 6c 64 4e 61 6d 65 3d 3d 30 20  ( zFieldName==0 
8980: 7c 7c 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 3d 3d  || *zFieldName==
8990: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 52  0 ) break;.    R
89a0: 65 6d 6f 76 65 4e 65 77 6c 69 6e 65 28 7a 56 61  emoveNewline(zVa
89b0: 6c 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63  l);.    if( strc
89c0: 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d  asecmp(zFieldNam
89d0: 65 2c 22 55 73 65 72 2d 41 67 65 6e 74 3a 22 29  e,"User-Agent:")
89e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 41 67  ==0 ){.      zAg
89f0: 65 6e 74 20 3d 20 53 74 72 44 75 70 28 7a 56 61  ent = StrDup(zVa
8a00: 6c 29 3b 0a 20 20 20 20 20 20 46 69 78 75 70 55  l);.      FixupU
8a10: 73 65 72 41 67 65 6e 74 28 29 3b 0a 20 20 20 20  serAgent();.    
8a20: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 61 73  }else if( strcas
8a30: 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c  ecmp(zFieldName,
8a40: 22 41 63 63 65 70 74 3a 22 29 3d 3d 30 20 29 7b  "Accept:")==0 ){
8a50: 0a 20 20 20 20 20 20 7a 41 63 63 65 70 74 20 3d  .      zAccept =
8a60: 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20   StrDup(zVal);. 
8a70: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
8a80: 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61  casecmp(zFieldNa
8a90: 6d 65 2c 22 43 6f 6e 74 65 6e 74 2d 6c 65 6e 67  me,"Content-leng
8aa0: 74 68 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  th:")==0 ){.    
8ab0: 20 20 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68    zContentLength
8ac0: 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b   = StrDup(zVal);
8ad0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
8ae0: 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64  trcasecmp(zField
8af0: 4e 61 6d 65 2c 22 43 6f 6e 74 65 6e 74 2d 74 79  Name,"Content-ty
8b00: 70 65 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  pe:")==0 ){.    
8b10: 20 20 7a 43 6f 6e 74 65 6e 74 54 79 70 65 20 3d    zContentType =
8b20: 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20   StrDup(zVal);. 
8b30: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
8b40: 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61  casecmp(zFieldNa
8b50: 6d 65 2c 22 52 65 66 65 72 65 72 3a 22 29 3d 3d  me,"Referer:")==
8b60: 30 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 66 65  0 ){.      zRefe
8b70: 72 65 72 20 3d 20 53 74 72 44 75 70 28 7a 56 61  rer = StrDup(zVa
8b80: 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  l);.    }else if
8b90: 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69  ( strcasecmp(zFi
8ba0: 65 6c 64 4e 61 6d 65 2c 22 43 6f 6f 6b 69 65 3a  eldName,"Cookie:
8bb0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  ")==0 ){.      z
8bc0: 43 6f 6f 6b 69 65 20 3d 20 53 74 72 41 70 70 65  Cookie = StrAppe
8bd0: 6e 64 28 7a 43 6f 6f 6b 69 65 2c 22 3b 20 22 2c  nd(zCookie,"; ",
8be0: 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  zVal);.    }else
8bf0: 20 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28   if( strcasecmp(
8c00: 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 43 6f 6e 6e  zFieldName,"Conn
8c10: 65 63 74 69 6f 6e 3a 22 29 3d 3d 30 20 29 7b 0a  ection:")==0 ){.
8c20: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 61 73        if( strcas
8c30: 65 63 6d 70 28 7a 56 61 6c 2c 22 63 6c 6f 73 65  ecmp(zVal,"close
8c40: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
8c50: 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e   closeConnection
8c60: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
8c70: 65 20 69 66 28 20 21 66 6f 72 63 65 43 6c 6f 73  e if( !forceClos
8c80: 65 20 26 26 20 73 74 72 63 61 73 65 63 6d 70 28  e && strcasecmp(
8c90: 7a 56 61 6c 2c 20 22 6b 65 65 70 2d 61 6c 69 76  zVal, "keep-aliv
8ca0: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
8cb0: 20 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f    closeConnectio
8cc0: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  n = 0;.      }. 
8cd0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
8ce0: 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61  casecmp(zFieldNa
8cf0: 6d 65 2c 22 48 6f 73 74 3a 22 29 3d 3d 30 20 29  me,"Host:")==0 )
8d00: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 53 71  {.      int inSq
8d10: 75 61 72 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  uare = 0;.      
8d20: 63 68 61 72 20 63 3b 0a 20 20 20 20 20 20 7a 48  char c;.      zH
8d30: 74 74 70 48 6f 73 74 20 3d 20 53 74 72 44 75 70  ttpHost = StrDup
8d40: 28 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 7a 53  (zVal);.      zS
8d50: 65 72 76 65 72 50 6f 72 74 20 3d 20 7a 53 65 72  erverPort = zSer
8d60: 76 65 72 4e 61 6d 65 20 3d 20 53 74 72 44 75 70  verName = StrDup
8d70: 28 7a 48 74 74 70 48 6f 73 74 29 3b 0a 20 20 20  (zHttpHost);.   
8d80: 20 20 20 77 68 69 6c 65 28 20 7a 53 65 72 76 65     while( zServe
8d90: 72 50 6f 72 74 20 26 26 20 28 63 20 3d 20 2a 7a  rPort && (c = *z
8da0: 53 65 72 76 65 72 50 6f 72 74 29 21 3d 30 0a 20  ServerPort)!=0. 
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
8dc0: 28 63 21 3d 27 3a 27 20 7c 7c 20 69 6e 53 71 75  (c!=':' || inSqu
8dd0: 61 72 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  are) ){.        
8de0: 69 66 28 20 63 3d 3d 27 5b 27 20 29 20 69 6e 53  if( c=='[' ) inS
8df0: 71 75 61 72 65 20 3d 20 31 3b 0a 20 20 20 20 20  quare = 1;.     
8e00: 20 20 20 69 66 28 20 63 3d 3d 27 5d 27 20 29 20     if( c==']' ) 
8e10: 69 6e 53 71 75 61 72 65 20 3d 20 30 3b 0a 20 20  inSquare = 0;.  
8e20: 20 20 20 20 20 20 7a 53 65 72 76 65 72 50 6f 72        zServerPor
8e30: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
8e40: 20 20 20 69 66 28 20 7a 53 65 72 76 65 72 50 6f     if( zServerPo
8e50: 72 74 20 26 26 20 2a 7a 53 65 72 76 65 72 50 6f  rt && *zServerPo
8e60: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 7a  rt ){.        *z
8e70: 53 65 72 76 65 72 50 6f 72 74 20 3d 20 30 3b 0a  ServerPort = 0;.
8e80: 20 20 20 20 20 20 20 20 7a 53 65 72 76 65 72 50          zServerP
8e90: 6f 72 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ort++;.      }. 
8ea0: 20 20 20 20 20 69 66 28 20 7a 52 65 61 6c 50 6f       if( zRealPo
8eb0: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53  rt ){.        zS
8ec0: 65 72 76 65 72 50 6f 72 74 20 3d 20 53 74 72 44  erverPort = StrD
8ed0: 75 70 28 7a 52 65 61 6c 50 6f 72 74 29 3b 0a 20  up(zRealPort);. 
8ee0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
8ef0: 20 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28   if( strcasecmp(
8f00: 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 41 75 74 68  zFieldName,"Auth
8f10: 6f 72 69 7a 61 74 69 6f 6e 3a 22 29 3d 3d 30 20  orization:")==0 
8f20: 29 7b 0a 20 20 20 20 20 20 7a 41 75 74 68 54 79  ){.      zAuthTy
8f30: 70 65 20 3d 20 47 65 74 46 69 72 73 74 45 6c 65  pe = GetFirstEle
8f40: 6d 65 6e 74 28 53 74 72 44 75 70 28 7a 56 61 6c  ment(StrDup(zVal
8f50: 29 2c 20 26 7a 41 75 74 68 41 72 67 29 3b 0a 20  ), &zAuthArg);. 
8f60: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44     }.  }..  /* D
8f70: 69 73 61 6c 6c 6f 77 20 72 65 66 65 72 72 69 6e  isallow referrin
8f80: 67 20 66 72 6f 6d 20 63 65 72 74 61 69 6e 20 73  g from certain s
8f90: 65 72 76 65 72 73 20 2a 2f 0a 23 69 66 20 30 0a  ervers */.#if 0.
8fa0: 20 20 69 66 28 20 7a 52 65 66 65 72 65 72 20 29    if( zReferer )
8fb0: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
8fc0: 73 74 20 63 68 61 72 20 2a 61 7a 44 69 73 61 6c  st char *azDisal
8fd0: 6c 6f 77 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  low[] = {.      
8fe0: 22 73 6b 69 64 72 6f 77 63 72 61 63 6b 2e 63 6f  "skidrowcrack.co
8ff0: 6d 22 2c 0a 20 20 20 20 20 20 22 68 6f 73 68 69  m",.      "hoshi
9000: 79 75 75 67 69 2e 74 69 73 74 6f 72 79 2e 63 6f  yuugi.tistory.co
9010: 6d 22 2c 0a 20 20 20 20 20 20 22 73 6b 69 64 72  m",.      "skidr
9020: 6f 77 67 61 6d 65 73 2e 6e 65 74 22 2c 0a 20 20  owgames.net",.  
9030: 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a    };.    int i;.
9040: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
9050: 69 7a 65 6f 66 28 61 7a 44 69 73 61 6c 6c 6f 77  izeof(azDisallow
9060: 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 73 61 6c  )/sizeof(azDisal
9070: 6c 6f 77 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  low[0]); i++){. 
9080: 20 20 20 20 20 69 66 28 20 73 74 72 73 74 72 28       if( strstr(
9090: 7a 52 65 66 65 72 65 72 2c 20 61 7a 44 69 73 61  zReferer, azDisa
90a0: 6c 6c 6f 77 5b 69 5d 29 21 3d 30 20 29 20 4e 6f  llow[i])!=0 ) No
90b0: 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29  tFound(__LINE__)
90c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
90d0: 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 6e  if..  /* Make an
90e0: 20 65 78 74 72 61 20 65 66 66 6f 72 74 20 74 6f   extra effort to
90f0: 20 67 65 74 20 61 20 76 61 6c 69 64 20 73 65 72   get a valid ser
9100: 76 65 72 20 6e 61 6d 65 20 61 6e 64 20 70 6f 72  ver name and por
9110: 74 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2a 20 4f  t number..  ** O
9120: 6e 6c 79 20 4e 65 74 73 63 61 70 65 20 70 72 6f  nly Netscape pro
9130: 76 69 64 65 73 20 74 68 69 73 20 69 6e 66 6f 72  vides this infor
9140: 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  mation.  If the 
9150: 62 72 6f 77 73 65 72 20 69 73 0a 20 20 2a 2a 20  browser is.  ** 
9160: 49 6e 74 65 72 6e 65 74 20 45 78 70 6c 6f 72 65  Internet Explore
9170: 72 2c 20 74 68 65 6e 20 77 65 20 68 61 76 65 20  r, then we have 
9180: 74 6f 20 66 69 6e 64 20 6f 75 74 20 74 68 65 20  to find out the 
9190: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 0a  information for.
91a0: 20 20 2a 2a 20 6f 75 72 73 65 6c 76 65 73 2e 0a    ** ourselves..
91b0: 20 20 2a 2f 0a 20 20 69 66 28 20 7a 53 65 72 76    */.  if( zServ
91c0: 65 72 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  erName==0 ){.   
91d0: 20 7a 53 65 72 76 65 72 4e 61 6d 65 20 3d 20 53   zServerName = S
91e0: 61 66 65 4d 61 6c 6c 6f 63 28 20 31 30 30 20 29  afeMalloc( 100 )
91f0: 3b 0a 20 20 20 20 67 65 74 68 6f 73 74 6e 61 6d  ;.    gethostnam
9200: 65 28 7a 53 65 72 76 65 72 4e 61 6d 65 2c 31 30  e(zServerName,10
9210: 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 53  0);.  }.  if( zS
9220: 65 72 76 65 72 50 6f 72 74 3d 3d 30 20 7c 7c 20  erverPort==0 || 
9230: 2a 7a 53 65 72 76 65 72 50 6f 72 74 3d 3d 30 20  *zServerPort==0 
9240: 29 7b 0a 20 20 20 20 7a 53 65 72 76 65 72 50 6f  ){.    zServerPo
9250: 72 74 20 3d 20 44 45 46 41 55 4c 54 5f 50 4f 52  rt = DEFAULT_POR
9260: 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d  T;.  }..  /* Rem
9270: 6f 76 65 20 74 68 65 20 71 75 65 72 79 20 73 74  ove the query st
9280: 72 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 65 6e  ring from the en
9290: 64 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74  d of the request
92a0: 65 64 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ed file..  */.  
92b0: 66 6f 72 28 7a 3d 7a 53 63 72 69 70 74 3b 20 2a  for(z=zScript; *
92c0: 7a 20 26 26 20 2a 7a 21 3d 27 3f 27 3b 20 7a 2b  z && *z!='?'; z+
92d0: 2b 29 7b 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27  +){}.  if( *z=='
92e0: 3f 27 20 29 7b 0a 20 20 20 20 7a 51 75 65 72 79  ?' ){.    zQuery
92f0: 53 75 66 66 69 78 20 3d 20 53 74 72 44 75 70 28  Suffix = StrDup(
9300: 7a 29 3b 0a 20 20 20 20 2a 7a 20 3d 20 30 3b 0a  z);.    *z = 0;.
9310: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 51 75    }else{.    zQu
9320: 65 72 79 53 75 66 66 69 78 20 3d 20 22 22 3b 0a  erySuffix = "";.
9330: 20 20 7d 0a 20 20 7a 51 75 65 72 79 53 74 72 69    }.  zQueryStri
9340: 6e 67 20 3d 20 2a 7a 51 75 65 72 79 53 75 66 66  ng = *zQuerySuff
9350: 69 78 20 3f 20 26 7a 51 75 65 72 79 53 75 66 66  ix ? &zQuerySuff
9360: 69 78 5b 31 5d 20 3a 20 7a 51 75 65 72 79 53 75  ix[1] : zQuerySu
9370: 66 66 69 78 3b 0a 0a 20 20 2f 2a 20 43 72 65 61  ffix;..  /* Crea
9380: 74 65 20 61 20 66 69 6c 65 20 74 6f 20 68 6f 6c  te a file to hol
9390: 64 20 74 68 65 20 50 4f 53 54 20 71 75 65 72 79  d the POST query
93a0: 20 64 61 74 61 2c 20 69 66 20 61 6e 79 2e 20 20   data, if any.  
93b0: 57 65 20 68 61 76 65 20 74 6f 0a 20 20 2a 2a 20  We have to.  ** 
93c0: 64 6f 20 69 74 20 74 68 69 73 20 77 61 79 2e 20  do it this way. 
93d0: 20 57 65 20 63 61 6e 27 74 20 6a 75 73 74 20 70   We can't just p
93e0: 61 73 73 20 74 68 65 20 66 69 6c 65 20 64 65 73  ass the file des
93f0: 63 72 69 70 74 6f 72 20 64 6f 77 6e 20 74 6f 0a  criptor down to.
9400: 20 20 2a 2a 20 74 68 65 20 63 68 69 6c 64 20 70    ** the child p
9410: 72 6f 63 65 73 73 20 62 65 63 61 75 73 65 20 74  rocess because t
9420: 68 65 20 66 67 65 74 73 28 29 20 66 75 6e 63 74  he fgets() funct
9430: 69 6f 6e 20 6d 61 79 20 68 61 76 65 20 61 6c 72  ion may have alr
9440: 65 61 64 79 0a 20 20 2a 2a 20 72 65 61 64 20 70  eady.  ** read p
9450: 61 72 74 20 6f 66 20 74 68 65 20 50 4f 53 54 20  art of the POST 
9460: 64 61 74 61 20 69 6e 74 6f 20 69 74 73 20 69 6e  data into its in
9470: 74 65 72 6e 61 6c 20 62 75 66 66 65 72 2e 0a 20  ternal buffer.. 
9480: 20 2a 2f 0a 20 20 69 66 28 20 7a 4d 65 74 68 6f   */.  if( zMetho
9490: 64 5b 30 5d 3d 3d 27 50 27 20 26 26 20 7a 43 6f  d[0]=='P' && zCo
94a0: 6e 74 65 6e 74 4c 65 6e 67 74 68 21 3d 30 20 29  ntentLength!=0 )
94b0: 7b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20  {.    int len = 
94c0: 61 74 6f 69 28 7a 43 6f 6e 74 65 6e 74 4c 65 6e  atoi(zContentLen
94d0: 67 74 68 29 3b 0a 20 20 20 20 46 49 4c 45 20 2a  gth);.    FILE *
94e0: 6f 75 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  out;.    char *z
94f0: 42 75 66 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  Buf;.    int n;.
9500: 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 4d 41 58  .    if( len>MAX
9510: 5f 43 4f 4e 54 45 4e 54 5f 4c 45 4e 47 54 48 20  _CONTENT_LENGTH 
9520: 29 7b 0a 20 20 20 20 20 20 53 74 61 72 74 52 65  ){.      StartRe
9530: 73 70 6f 6e 73 65 28 22 35 30 30 20 52 65 71 75  sponse("500 Requ
9540: 65 73 74 20 74 6f 6f 20 6c 61 72 67 65 22 29 3b  est too large");
9550: 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70  .      nOut += p
9560: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22  rintf(.        "
9570: 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65  Content-type: te
9580: 78 74 2f 68 74 6d 6c 5c 72 5c 6e 22 0a 20 20 20  xt/html\r\n".   
9590: 20 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20       "\r\n".    
95a0: 20 20 20 20 22 54 6f 6f 20 6d 75 63 68 20 50 4f      "Too much PO
95b0: 53 54 20 64 61 74 61 5c 6e 22 0a 20 20 20 20 20  ST data\n".     
95c0: 20 20 20 22 3c 2f 62 6f 64 79 3e 5c 6e 22 0a 20     "</body>\n". 
95d0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 4d 61       );.      Ma
95e0: 6b 65 4c 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20  keLogEntry(0);. 
95f0: 20 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20       exit(0);.  
9600: 20 20 7d 0a 20 20 20 20 73 70 72 69 6e 74 66 28    }.    sprintf(
9610: 7a 54 6d 70 4e 61 6d 42 75 66 2c 20 22 2f 74 6d  zTmpNamBuf, "/tm
9620: 70 2f 2d 70 6f 73 74 2d 64 61 74 61 2d 58 58 58  p/-post-data-XXX
9630: 58 58 58 22 29 3b 0a 20 20 20 20 7a 54 6d 70 4e  XXX");.    zTmpN
9640: 61 6d 20 3d 20 7a 54 6d 70 4e 61 6d 42 75 66 3b  am = zTmpNamBuf;
9650: 0a 20 20 20 20 6d 6b 73 74 65 6d 70 28 7a 54 6d  .    mkstemp(zTm
9660: 70 4e 61 6d 29 3b 0a 20 20 20 20 6f 75 74 20 3d  pNam);.    out =
9670: 20 66 6f 70 65 6e 28 7a 54 6d 70 4e 61 6d 2c 22   fopen(zTmpNam,"
9680: 77 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74  w");.    if( out
9690: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 74 61  ==0 ){.      Sta
96a0: 72 74 52 65 73 70 6f 6e 73 65 28 22 35 30 30 20  rtResponse("500 
96b0: 43 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 2f 74  Cannot create /t
96c0: 6d 70 20 66 69 6c 65 22 29 3b 0a 20 20 20 20 20  mp file");.     
96d0: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
96e0: 0a 20 20 20 20 20 20 20 20 22 43 6f 6e 74 65 6e  .        "Conten
96f0: 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 68 74 6d  t-type: text/htm
9700: 6c 5c 72 5c 6e 22 0a 20 20 20 20 20 20 20 20 22  l\r\n".        "
9710: 5c 72 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 43  \r\n".        "C
9720: 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20 5c 22  ould not open \"
9730: 25 73 5c 22 20 66 6f 72 20 77 72 69 74 69 6e 67  %s\" for writing
9740: 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 3c 2f 62  \n".        "</b
9750: 6f 64 79 3e 5c 6e 22 2c 20 7a 54 6d 70 4e 61 6d  ody>\n", zTmpNam
9760: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
9770: 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 29 3b  MakeLogEntry(0);
9780: 0a 20 20 20 20 20 20 65 78 69 74 28 30 29 3b 0a  .      exit(0);.
9790: 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 20 3d      }.    zBuf =
97a0: 20 53 61 66 65 4d 61 6c 6c 6f 63 28 20 6c 65 6e   SafeMalloc( len
97b0: 20 29 3b 0a 20 20 20 20 69 66 28 20 75 73 65 54   );.    if( useT
97c0: 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d 28 31  imeout ) alarm(1
97d0: 35 20 2b 20 6c 65 6e 2f 32 30 30 30 29 3b 0a 20  5 + len/2000);. 
97e0: 20 20 20 6e 20 3d 20 66 72 65 61 64 28 7a 42 75     n = fread(zBu
97f0: 66 2c 31 2c 6c 65 6e 2c 73 74 64 69 6e 29 3b 0a  f,1,len,stdin);.
9800: 20 20 20 20 6e 49 6e 20 2b 3d 20 6e 3b 0a 20 20      nIn += n;.  
9810: 20 20 66 77 72 69 74 65 28 7a 42 75 66 2c 31 2c    fwrite(zBuf,1,
9820: 6e 2c 6f 75 74 29 3b 0a 20 20 20 20 66 72 65 65  n,out);.    free
9830: 28 7a 42 75 66 29 3b 0a 20 20 20 20 66 63 6c 6f  (zBuf);.    fclo
9840: 73 65 28 6f 75 74 29 3b 0a 20 20 7d 0a 0a 20 20  se(out);.  }..  
9850: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
9860: 20 72 75 6e 6e 69 6e 67 20 74 69 6d 65 20 69 73   running time is
9870: 20 6e 6f 74 20 74 6f 6f 20 67 72 65 61 74 20 2a   not too great *
9880: 2f 0a 20 20 69 66 28 20 75 73 65 54 69 6d 65 6f  /.  if( useTimeo
9890: 75 74 20 29 20 61 6c 61 72 6d 28 31 30 29 3b 0a  ut ) alarm(10);.
98a0: 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 61 6c  .  /* Convert al
98b0: 6c 20 75 6e 75 73 75 61 6c 20 63 68 61 72 61 63  l unusual charac
98c0: 74 65 72 73 20 69 6e 20 74 68 65 20 73 63 72 69  ters in the scri
98d0: 70 74 20 6e 61 6d 65 20 69 6e 74 6f 20 22 5f 22  pt name into "_"
98e0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
98f0: 20 69 73 20 61 20 64 65 66 65 6e 73 65 20 61 67   is a defense ag
9900: 61 69 6e 73 74 20 76 61 72 69 6f 75 73 20 61 74  ainst various at
9910: 74 61 63 6b 73 2c 20 58 53 53 20 61 74 74 61 63  tacks, XSS attac
9920: 6b 73 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72  ks in particular
9930: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 7a 3d 7a  ..  */.  for(z=z
9940: 53 63 72 69 70 74 3b 20 2a 7a 3b 20 7a 2b 2b 29  Script; *z; z++)
9950: 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  {.    unsigned c
9960: 68 61 72 20 63 20 3d 20 2a 28 75 6e 73 69 67 6e  har c = *(unsign
9970: 65 64 20 63 68 61 72 2a 29 7a 3b 0a 20 20 20 20  ed char*)z;.    
9980: 69 66 28 20 28 63 26 30 78 38 30 29 21 3d 30 20  if( (c&0x80)!=0 
9990: 7c 7c 20 21 61 6c 6c 6f 77 65 64 49 6e 4e 61 6d  || !allowedInNam
99a0: 65 5b 63 5d 20 29 7b 0a 20 20 20 20 20 20 2a 7a  e[c] ){.      *z
99b0: 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 69 66   = '_';.      if
99c0: 28 20 63 3d 3d 27 25 27 20 26 26 20 7a 5b 31 5d  ( c=='%' && z[1]
99d0: 21 3d 30 20 26 26 20 7a 5b 32 5d 21 3d 30 20 29  !=0 && z[2]!=0 )
99e0: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
99f0: 33 3b 20 28 7a 5b 69 2d 32 5d 20 3d 20 7a 5b 69  3; (z[i-2] = z[i
9a00: 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ])!=0; i++){}.  
9a10: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9a20: 0a 20 20 2f 2a 20 44 6f 6e 27 74 20 61 6c 6c 6f  .  /* Don't allo
9a30: 77 20 22 2f 2e 22 20 6f 72 20 22 2f 2d 22 20 74  w "/." or "/-" t
9a40: 6f 20 74 6f 20 6f 63 63 75 72 20 61 6e 79 77 68  o to occur anywh
9a50: 65 72 65 20 69 6e 20 74 68 65 20 65 6e 74 69 74  ere in the entit
9a60: 79 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 54 68 69  y name..  ** Thi
9a70: 73 20 70 72 65 76 65 6e 74 73 20 61 74 74 61 63  s prevents attac
9a80: 6b 73 20 69 6e 76 6f 6c 76 69 6e 67 20 22 2e 2e  ks involving "..
9a90: 22 20 61 6e 64 20 61 6c 73 6f 20 61 6c 6c 6f 77  " and also allow
9aa0: 73 20 75 73 20 74 6f 20 63 72 65 61 74 65 0a 20  s us to create. 
9ab0: 20 2a 2a 20 66 69 6c 65 73 20 61 6e 64 20 64 69   ** files and di
9ac0: 72 65 63 74 6f 72 69 65 73 20 77 68 6f 73 65 20  rectories whose 
9ad0: 6e 61 6d 65 73 20 62 65 67 69 6e 20 77 69 74 68  names begin with
9ae0: 20 22 2d 22 20 77 68 69 63 68 20 61 72 65 20 69   "-" which are i
9af0: 6e 76 69 73 69 62 6c 65 0a 20 20 2a 2a 20 74 6f  nvisible.  ** to
9b00: 20 74 68 65 20 77 65 62 73 65 72 76 65 72 2e 0a   the webserver..
9b10: 20 20 2a 2f 0a 20 20 66 6f 72 28 7a 3d 7a 53 63    */.  for(z=zSc
9b20: 72 69 70 74 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a  ript; *z; z++){.
9b30: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2f 27 20      if( *z=='/' 
9b40: 26 26 20 28 7a 5b 31 5d 3d 3d 27 2e 27 20 7c 7c  && (z[1]=='.' ||
9b50: 20 7a 5b 31 5d 3d 3d 27 2d 27 29 20 29 7b 0a 20   z[1]=='-') ){. 
9b60: 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f        NotFound(_
9b70: 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a  _LINE__);.    }.
9b80: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65    }..  /* Figure
9b90: 20 6f 75 74 20 77 68 61 74 20 74 68 65 20 72 6f   out what the ro
9ba0: 6f 74 20 6f 66 20 74 68 65 20 66 69 6c 65 73 79  ot of the filesy
9bb0: 73 74 65 6d 20 73 68 6f 75 6c 64 20 62 65 2e 20  stem should be. 
9bc0: 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 48 54 54   If the.  ** HTT
9bd0: 50 5f 48 4f 53 54 20 70 61 72 61 6d 65 74 65 72  P_HOST parameter
9be0: 20 65 78 69 73 74 73 20 28 73 74 6f 72 65 64 20   exists (stored 
9bf0: 69 6e 20 7a 48 74 74 70 48 6f 73 74 29 20 74 68  in zHttpHost) th
9c00: 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 0a 20 20  en remove the.  
9c10: 2a 2a 20 70 6f 72 74 20 6e 75 6d 62 65 72 20 66  ** port number f
9c20: 72 6f 6d 20 74 68 65 20 65 6e 64 20 28 69 66 20  rom the end (if 
9c30: 61 6e 79 29 2c 20 63 6f 6e 76 65 72 74 20 61 6c  any), convert al
9c40: 6c 20 63 68 61 72 61 63 74 65 72 73 20 74 6f 20  l characters to 
9c50: 6c 6f 77 65 72 0a 20 20 2a 2a 20 63 61 73 65 2c  lower.  ** case,
9c60: 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 61 6c 6c   and convert all
9c70: 20 22 2e 22 20 74 6f 20 22 5f 22 2e 20 20 54 68   "." to "_".  Th
9c80: 65 6e 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61  en try to find a
9c90: 20 64 69 72 65 63 74 6f 72 79 0a 20 20 2a 2a 20   directory.  ** 
9ca0: 77 69 74 68 20 74 68 61 74 20 6e 61 6d 65 20 61  with that name a
9cb0: 6e 64 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e  nd the extension
9cc0: 20 2e 77 65 62 73 69 74 65 2e 20 20 49 66 20 6e   .website.  If n
9cd0: 6f 74 20 66 6f 75 6e 64 2c 20 6c 6f 6f 6b 0a 20  ot found, look. 
9ce0: 20 2a 2a 20 66 6f 72 20 22 64 65 66 61 75 6c 74   ** for "default
9cf0: 2e 77 65 62 73 69 74 65 22 2e 0a 20 20 2a 2f 0a  .website"..  */.
9d00: 20 20 69 66 28 20 7a 53 63 72 69 70 74 5b 30 5d    if( zScript[0]
9d10: 21 3d 27 2f 27 20 29 20 4e 6f 74 46 6f 75 6e 64  !='/' ) NotFound
9d20: 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 69 66  (__LINE__);.  if
9d30: 28 20 73 74 72 6c 65 6e 28 7a 52 6f 6f 74 29 2b  ( strlen(zRoot)+
9d40: 34 30 20 3e 3d 20 73 69 7a 65 6f 66 28 7a 4c 69  40 >= sizeof(zLi
9d50: 6e 65 29 20 29 20 4e 6f 74 46 6f 75 6e 64 28 5f  ne) ) NotFound(_
9d60: 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 69 66 28 20  _LINE__);.  if( 
9d70: 7a 48 74 74 70 48 6f 73 74 3d 3d 30 20 7c 7c 20  zHttpHost==0 || 
9d80: 7a 48 74 74 70 48 6f 73 74 5b 30 5d 3d 3d 30 20  zHttpHost[0]==0 
9d90: 29 7b 0a 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28  ){.    NotFound(
9da0: 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c  __LINE__);.  }el
9db0: 73 65 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 48  se if( strlen(zH
9dc0: 74 74 70 48 6f 73 74 29 2b 73 74 72 6c 65 6e 28  ttpHost)+strlen(
9dd0: 7a 52 6f 6f 74 29 2b 31 30 20 3e 3d 20 73 69 7a  zRoot)+10 >= siz
9de0: 65 6f 66 28 7a 4c 69 6e 65 29 20 29 7b 0a 20 20  eof(zLine) ){.  
9df0: 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c 49 4e    NotFound(__LIN
9e00: 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E__);.  }else{. 
9e10: 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65     sprintf(zLine
9e20: 2c 20 22 25 73 2f 25 73 22 2c 20 7a 52 6f 6f 74  , "%s/%s", zRoot
9e30: 2c 20 7a 48 74 74 70 48 6f 73 74 29 3b 0a 20 20  , zHttpHost);.  
9e40: 20 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 7a    for(i=strlen(z
9e50: 52 6f 6f 74 29 2b 31 3b 20 7a 4c 69 6e 65 5b 69  Root)+1; zLine[i
9e60: 5d 20 26 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d 27  ] && zLine[i]!='
9e70: 3a 27 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  :'; i++){.      
9e80: 69 6e 74 20 63 20 3d 20 7a 4c 69 6e 65 5b 69 5d  int c = zLine[i]
9e90: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 61  ;.      if( !isa
9ea0: 6c 6e 75 6d 28 63 29 20 29 7b 0a 20 20 20 20 20  lnum(c) ){.     
9eb0: 20 20 20 7a 4c 69 6e 65 5b 69 5d 20 3d 20 27 5f     zLine[i] = '_
9ec0: 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
9ed0: 66 28 20 69 73 75 70 70 65 72 28 63 29 20 29 7b  f( isupper(c) ){
9ee0: 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 69  .        zLine[i
9ef0: 5d 20 3d 20 74 6f 6c 6f 77 65 72 28 63 29 3b 0a  ] = tolower(c);.
9f00: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9f10: 20 20 73 74 72 63 70 79 28 26 7a 4c 69 6e 65 5b    strcpy(&zLine[
9f20: 69 5d 2c 20 22 2e 77 65 62 73 69 74 65 22 29 3b  i], ".website");
9f30: 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74 28  .  }.  if( stat(
9f40: 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75 66 29 20  zLine,&statbuf) 
9f50: 7c 7c 20 21 53 5f 49 53 44 49 52 28 73 74 61 74  || !S_ISDIR(stat
9f60: 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 7b 0a  buf.st_mode) ){.
9f70: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e      sprintf(zLin
9f80: 65 2c 20 22 25 73 2f 64 65 66 61 75 6c 74 2e 77  e, "%s/default.w
9f90: 65 62 73 69 74 65 22 2c 20 7a 52 6f 6f 74 29 3b  ebsite", zRoot);
9fa0: 0a 20 20 20 20 69 66 28 20 73 74 61 74 28 7a 4c  .    if( stat(zL
9fb0: 69 6e 65 2c 26 73 74 61 74 62 75 66 29 20 7c 7c  ine,&statbuf) ||
9fc0: 20 21 53 5f 49 53 44 49 52 28 73 74 61 74 62 75   !S_ISDIR(statbu
9fd0: 66 2e 73 74 5f 6d 6f 64 65 29 20 29 7b 0a 20 20  f.st_mode) ){.  
9fe0: 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f 4c      NotFound(__L
9ff0: 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20  INE__);.    }.  
a000: 7d 0a 20 20 0a 20 20 7a 48 6f 6d 65 20 3d 20 53  }.  .  zHome = S
a010: 74 72 44 75 70 28 7a 4c 69 6e 65 29 3b 0a 0a 20  trDup(zLine);.. 
a020: 20 2f 2a 20 43 68 61 6e 67 65 20 64 69 72 65 63   /* Change direc
a030: 74 6f 72 69 65 73 20 74 6f 20 74 68 65 20 72 6f  tories to the ro
a040: 6f 74 20 6f 66 20 74 68 65 20 48 54 54 50 20 66  ot of the HTTP f
a050: 69 6c 65 73 79 73 74 65 6d 0a 20 20 2a 2f 0a 20  ilesystem.  */. 
a060: 20 69 66 28 20 63 68 64 69 72 28 7a 48 6f 6d 65   if( chdir(zHome
a070: 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  )!=0 ){.    char
a080: 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20 20   zBuf[1000];.   
a090: 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c   Malfunction(__L
a0a0: 49 4e 45 5f 5f 2c 20 22 63 61 6e 6e 6f 74 20 63  INE__, "cannot c
a0b0: 68 64 69 72 20 74 6f 20 5b 25 73 5d 20 66 72 6f  hdir to [%s] fro
a0c0: 6d 20 5b 25 73 5d 22 2c 0a 20 20 20 20 20 20 20  m [%s]",.       
a0d0: 20 20 7a 48 6f 6d 65 2c 20 67 65 74 63 77 64 28    zHome, getcwd(
a0e0: 7a 42 75 66 2c 39 39 39 29 29 3b 0a 20 20 7d 0a  zBuf,999));.  }.
a0f0: 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
a100: 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
a110: 65 73 79 73 74 65 6d 2e 20 20 57 65 20 6d 69 67  esystem.  We mig
a120: 68 74 20 68 61 76 65 20 74 6f 20 61 70 70 65 6e  ht have to appen
a130: 64 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20  d.  ** the name 
a140: 22 69 6e 64 65 78 2e 68 74 6d 6c 22 20 69 6e 20  "index.html" in 
a150: 6f 72 64 65 72 20 74 6f 20 66 69 6e 64 20 69 74  order to find it
a160: 2e 20 20 41 6e 79 20 65 78 63 65 73 73 20 70 61  .  Any excess pa
a170: 74 68 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74  th.  ** informat
a180: 69 6f 6e 20 69 73 20 70 75 74 20 69 6e 74 6f 20  ion is put into 
a190: 74 68 65 20 7a 50 61 74 68 49 6e 66 6f 20 76 61  the zPathInfo va
a1a0: 72 69 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 7a  riable..  */.  z
a1b0: 4c 69 6e 65 5b 30 5d 20 3d 20 27 2e 27 3b 0a 20  Line[0] = '.';. 
a1c0: 20 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28   i = 0;.  while(
a1d0: 20 7a 53 63 72 69 70 74 5b 69 5d 20 29 7b 0a 20   zScript[i] ){. 
a1e0: 20 20 20 77 68 69 6c 65 28 20 7a 53 63 72 69 70     while( zScrip
a1f0: 74 5b 69 5d 20 26 26 20 7a 53 63 72 69 70 74 5b  t[i] && zScript[
a200: 69 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  i]!='/' ){.     
a210: 20 7a 4c 69 6e 65 5b 69 2b 31 5d 20 3d 20 7a 53   zLine[i+1] = zS
a220: 63 72 69 70 74 5b 69 5d 3b 0a 20 20 20 20 20 20  cript[i];.      
a230: 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  i++;.    }.    z
a240: 4c 69 6e 65 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20  Line[i+1] = 0;. 
a250: 20 20 20 69 66 28 20 73 74 61 74 28 7a 4c 69 6e     if( stat(zLin
a260: 65 2c 26 73 74 61 74 62 75 66 29 21 3d 30 20 29  e,&statbuf)!=0 )
a270: 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 74 69 6c  {.      int stil
a280: 6c 53 65 61 72 63 68 69 6e 67 20 3d 20 31 3b 0a  lSearching = 1;.
a290: 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 74 69        while( sti
a2a0: 6c 6c 53 65 61 72 63 68 69 6e 67 20 26 26 20 69  llSearching && i
a2b0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  >0 ){.        wh
a2c0: 69 6c 65 28 20 69 3e 30 20 26 26 20 7a 4c 69 6e  ile( i>0 && zLin
a2d0: 65 5b 69 5d 21 3d 27 2f 27 20 29 7b 20 69 2d 2d  e[i]!='/' ){ i--
a2e0: 3b 20 7d 0a 20 20 20 20 20 20 20 20 73 74 72 63  ; }.        strc
a2f0: 70 79 28 26 7a 4c 69 6e 65 5b 69 5d 2c 20 22 2f  py(&zLine[i], "/
a300: 6e 6f 74 2d 66 6f 75 6e 64 2e 68 74 6d 6c 22 29  not-found.html")
a310: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74  ;.        if( st
a320: 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75  at(zLine,&statbu
a330: 66 29 3d 3d 30 20 26 26 20 53 5f 49 53 52 45 47  f)==0 && S_ISREG
a340: 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65  (statbuf.st_mode
a350: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  ).            &&
a360: 20 61 63 63 65 73 73 28 7a 4c 69 6e 65 2c 52 5f   access(zLine,R_
a370: 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  OK)==0 ){.      
a380: 20 20 20 20 7a 52 65 61 6c 53 63 72 69 70 74 20      zRealScript 
a390: 3d 20 53 74 72 44 75 70 28 26 7a 4c 69 6e 65 5b  = StrDup(&zLine[
a3a0: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 52  1]);.          R
a3b0: 65 64 69 72 65 63 74 28 7a 52 65 61 6c 53 63 72  edirect(zRealScr
a3c0: 69 70 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ipt, 1);.       
a3d0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
a3e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a3f0: 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20      i--;.       
a400: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
a410: 20 69 66 28 20 73 74 69 6c 6c 53 65 61 72 63 68   if( stillSearch
a420: 69 6e 67 20 29 20 4e 6f 74 46 6f 75 6e 64 28 5f  ing ) NotFound(_
a430: 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
a440: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
a450: 20 69 66 28 20 53 5f 49 53 52 45 47 28 73 74 61   if( S_ISREG(sta
a460: 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 7b  tbuf.st_mode) ){
a470: 0a 20 20 20 20 20 20 69 66 28 20 61 63 63 65 73  .      if( acces
a480: 73 28 7a 4c 69 6e 65 2c 52 5f 4f 4b 29 20 29 7b  s(zLine,R_OK) ){
a490: 0a 20 20 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e  .        NotFoun
a4a0: 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  d(__LINE__);.   
a4b0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 52 65 61 6c     }.      zReal
a4c0: 53 63 72 69 70 74 20 3d 20 53 74 72 44 75 70 28  Script = StrDup(
a4d0: 26 7a 4c 69 6e 65 5b 31 5d 29 3b 0a 20 20 20 20  &zLine[1]);.    
a4e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
a4f0: 20 20 20 69 66 28 20 7a 53 63 72 69 70 74 5b 69     if( zScript[i
a500: 5d 3d 3d 30 20 7c 7c 20 7a 53 63 72 69 70 74 5b  ]==0 || zScript[
a510: 69 2b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  i+1]==0 ){.     
a520: 20 73 74 72 63 70 79 28 26 7a 4c 69 6e 65 5b 69   strcpy(&zLine[i
a530: 2b 31 5d 2c 22 2f 69 6e 64 65 78 2e 68 74 6d 6c  +1],"/index.html
a540: 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  ");.      if( st
a550: 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75  at(zLine,&statbu
a560: 66 29 21 3d 30 20 7c 7c 20 21 53 5f 49 53 52 45  f)!=0 || !S_ISRE
a570: 47 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64  G(statbuf.st_mod
a580: 65 29 20 0a 20 20 20 20 20 20 7c 7c 20 61 63 63  e) .      || acc
a590: 65 73 73 28 7a 4c 69 6e 65 2c 52 5f 4f 4b 29 20  ess(zLine,R_OK) 
a5a0: 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70  ){.        strcp
a5b0: 79 28 26 7a 4c 69 6e 65 5b 69 2b 31 5d 2c 22 2f  y(&zLine[i+1],"/
a5c0: 69 6e 64 65 78 2e 63 67 69 22 29 3b 0a 20 20 20  index.cgi");.   
a5d0: 20 20 20 20 20 69 66 28 20 73 74 61 74 28 7a 4c       if( stat(zL
a5e0: 69 6e 65 2c 26 73 74 61 74 62 75 66 29 21 3d 30  ine,&statbuf)!=0
a5f0: 20 7c 7c 20 21 53 5f 49 53 52 45 47 28 73 74 61   || !S_ISREG(sta
a600: 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 0a 20  tbuf.st_mode) . 
a610: 20 20 20 20 20 20 20 7c 7c 20 61 63 63 65 73 73         || access
a620: 28 7a 4c 69 6e 65 2c 52 5f 4f 4b 29 20 29 7b 0a  (zLine,R_OK) ){.
a630: 20 20 20 20 20 20 20 20 20 20 4e 6f 74 46 6f 75            NotFou
a640: 6e 64 28 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  nd(__LINE__);.  
a650: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
a660: 20 20 20 20 20 20 7a 52 65 61 6c 53 63 72 69 70        zRealScrip
a670: 74 20 3d 20 53 74 72 44 75 70 28 26 7a 4c 69 6e  t = StrDup(&zLin
a680: 65 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  e[1]);.      if(
a690: 20 7a 53 63 72 69 70 74 5b 69 5d 3d 3d 30 20 29   zScript[i]==0 )
a6a0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
a6b0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 55 52  the requested UR
a6c0: 4c 20 64 6f 65 73 20 6e 6f 74 20 65 6e 64 20 77  L does not end w
a6d0: 69 74 68 20 22 2f 22 20 62 75 74 20 77 65 20 68  ith "/" but we h
a6e0: 61 64 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  ad to.        **
a6f0: 20 61 70 70 65 6e 64 20 22 69 6e 64 65 78 2e 68   append "index.h
a700: 74 6d 6c 22 2c 20 74 68 65 6e 20 61 20 72 65 64  tml", then a red
a710: 69 72 65 63 74 20 69 73 20 6e 65 63 65 73 73 61  irect is necessa
a720: 72 79 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 20  ry.  Otherwise. 
a730: 20 20 20 20 20 20 20 2a 2a 20 6e 6f 6e 65 20 6f         ** none o
a740: 66 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 55  f the relative U
a750: 52 4c 73 20 69 6e 20 74 68 65 20 64 65 6c 69 76  RLs in the deliv
a760: 65 72 65 64 20 64 6f 63 75 6d 65 6e 74 20 77 69  ered document wi
a770: 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ll be.        **
a780: 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 20 20 20   correct. */.   
a790: 20 20 20 20 20 52 65 64 69 72 65 63 74 28 7a 52       Redirect(zR
a7a0: 65 61 6c 53 63 72 69 70 74 2c 20 31 29 3b 0a 20  ealScript, 1);. 
a7b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
a7c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
a7d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4c  ak;.    }.    zL
a7e0: 69 6e 65 5b 69 2b 31 5d 20 3d 20 7a 53 63 72 69  ine[i+1] = zScri
a7f0: 70 74 5b 69 5d 3b 0a 20 20 20 20 69 2b 2b 3b 0a  pt[i];.    i++;.
a800: 20 20 7d 0a 20 20 7a 46 69 6c 65 20 3d 20 53 74    }.  zFile = St
a810: 72 44 75 70 28 7a 4c 69 6e 65 29 3b 0a 20 20 7a  rDup(zLine);.  z
a820: 50 61 74 68 49 6e 66 6f 20 3d 20 53 74 72 44 75  PathInfo = StrDu
a830: 70 28 26 7a 53 63 72 69 70 74 5b 69 5d 29 3b 0a  p(&zScript[i]);.
a840: 20 20 6c 65 6e 46 69 6c 65 20 3d 20 73 74 72 6c    lenFile = strl
a850: 65 6e 28 7a 46 69 6c 65 29 3b 0a 20 20 7a 44 69  en(zFile);.  zDi
a860: 72 20 3d 20 53 74 72 44 75 70 28 7a 46 69 6c 65  r = StrDup(zFile
a870: 29 3b 0a 20 20 66 6f 72 28 69 3d 73 74 72 6c 65  );.  for(i=strle
a880: 6e 28 7a 44 69 72 29 2d 31 3b 20 69 3e 30 20 26  n(zDir)-1; i>0 &
a890: 26 20 7a 44 69 72 5b 69 5d 21 3d 27 2f 27 3b 20  & zDir[i]!='/'; 
a8a0: 69 2d 2d 29 7b 7d 3b 0a 20 20 69 66 28 20 69 3d  i--){};.  if( i=
a8b0: 3d 30 20 29 7b 0a 20 20 20 20 20 73 74 72 63 70  =0 ){.     strcp
a8c0: 79 28 7a 44 69 72 2c 22 2f 22 29 3b 0a 20 20 7d  y(zDir,"/");.  }
a8d0: 65 6c 73 65 7b 0a 20 20 20 20 20 7a 44 69 72 5b  else{.     zDir[
a8e0: 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  i] = 0;.  }..  /
a8f0: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
a900: 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 75  f there is an au
a910: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 69 6c 65  thorization file
a920: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 2c 0a  .  If there is,.
a930: 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 69 74 2e    ** process it.
a940: 0a 20 20 2a 2f 0a 20 20 73 70 72 69 6e 74 66 28  .  */.  sprintf(
a950: 7a 4c 69 6e 65 2c 20 22 25 73 2f 2d 61 75 74 68  zLine, "%s/-auth
a960: 22 2c 20 7a 44 69 72 29 3b 0a 20 20 69 66 28 20  ", zDir);.  if( 
a970: 61 63 63 65 73 73 28 7a 4c 69 6e 65 2c 52 5f 4f  access(zLine,R_O
a980: 4b 29 3d 3d 30 20 26 26 20 21 43 68 65 63 6b 42  K)==0 && !CheckB
a990: 61 73 69 63 41 75 74 68 6f 72 69 7a 61 74 69 6f  asicAuthorizatio
a9a0: 6e 28 7a 4c 69 6e 65 29 20 29 20 72 65 74 75 72  n(zLine) ) retur
a9b0: 6e 3b 0a 0a 20 20 2f 2a 20 54 61 6b 65 20 61 70  n;..  /* Take ap
a9c0: 70 72 6f 70 72 69 61 74 65 20 61 63 74 69 6f 6e  propriate action
a9d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 73 74 61  .  */.  if( (sta
a9e0: 74 62 75 66 2e 73 74 5f 6d 6f 64 65 20 26 20 30  tbuf.st_mode & 0
a9f0: 31 30 30 29 3d 3d 30 31 30 30 20 26 26 20 61 63  100)==0100 && ac
aa00: 63 65 73 73 28 7a 46 69 6c 65 2c 58 5f 4f 4b 29  cess(zFile,X_OK)
aa10: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ==0 ){.    /*.  
aa20: 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
aa30: 6e 67 73 20 73 74 61 74 69 63 20 76 61 72 69 61  ngs static varia
aa40: 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  bles are used to
aa50: 20 73 65 74 75 70 20 74 68 65 20 65 6e 76 69 72   setup the envir
aa60: 6f 6e 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 66 6f  onment.    ** fo
aa70: 72 20 74 68 65 20 43 47 49 20 73 63 72 69 70 74  r the CGI script
aa80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74  .    */.    stat
aa90: 69 63 20 63 68 61 72 20 2a 64 65 66 61 75 6c 74  ic char *default
aaa0: 5f 70 61 74 68 20 3d 20 22 2f 62 69 6e 3a 2f 75  _path = "/bin:/u
aab0: 73 72 2f 62 69 6e 22 3b 0a 20 20 20 20 73 74 61  sr/bin";.    sta
aac0: 74 69 63 20 63 68 61 72 20 2a 67 61 74 65 77 61  tic char *gatewa
aad0: 79 5f 69 6e 74 65 72 66 61 63 65 20 3d 20 22 43  y_interface = "C
aae0: 47 49 2f 31 2e 30 22 3b 0a 20 20 20 20 73 74 61  GI/1.0";.    sta
aaf0: 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20  tic struct {.   
ab00: 20 20 20 63 68 61 72 20 2a 7a 45 6e 76 4e 61 6d     char *zEnvNam
ab10: 65 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 2a  e;.      char **
ab20: 70 7a 45 6e 76 56 61 6c 75 65 3b 0a 20 20 20 20  pzEnvValue;.    
ab30: 7d 20 63 67 69 65 6e 76 5b 5d 20 3d 20 7b 0a 20  } cgienv[] = {. 
ab40: 20 20 20 20 20 7b 20 22 41 55 54 48 5f 54 59 50       { "AUTH_TYP
ab50: 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  E",             
ab60: 20 20 20 20 20 20 26 7a 41 75 74 68 54 79 70 65        &zAuthType
ab70: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 41 55 54   },.      { "AUT
ab80: 48 5f 43 4f 4e 54 45 4e 54 22 2c 20 20 20 20 20  H_CONTENT",     
ab90: 20 20 20 20 20 20 20 20 20 20 20 26 7a 41 75 74             &zAut
aba0: 68 41 72 67 20 7d 2c 0a 20 20 20 20 20 20 7b 20  hArg },.      { 
abb0: 22 43 4f 4e 54 45 4e 54 5f 4c 45 4e 47 54 48 22  "CONTENT_LENGTH"
abc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  ,              &
abd0: 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 20 7d  zContentLength }
abe0: 2c 0a 20 20 20 20 20 20 7b 20 22 43 4f 4e 54 45  ,.      { "CONTE
abf0: 4e 54 5f 54 59 50 45 22 2c 20 20 20 20 20 20 20  NT_TYPE",       
ac00: 20 20 20 20 20 20 20 20 20 26 7a 43 6f 6e 74 65           &zConte
ac10: 6e 74 54 79 70 65 20 7d 2c 0a 20 20 20 20 20 20  ntType },.      
ac20: 7b 20 22 44 4f 43 55 4d 45 4e 54 5f 52 4f 4f 54  { "DOCUMENT_ROOT
ac30: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
ac40: 20 26 7a 48 6f 6d 65 20 7d 2c 0a 20 20 20 20 20   &zHome },.     
ac50: 20 7b 20 22 47 41 54 45 57 41 59 5f 49 4e 54 45   { "GATEWAY_INTE
ac60: 52 46 41 43 45 22 2c 20 20 20 20 20 20 20 20 20  RFACE",         
ac70: 20 20 26 67 61 74 65 77 61 79 5f 69 6e 74 65 72    &gateway_inter
ac80: 66 61 63 65 20 7d 2c 0a 20 20 20 20 20 20 7b 20  face },.      { 
ac90: 22 48 54 54 50 5f 41 43 43 45 50 54 22 2c 20 20  "HTTP_ACCEPT",  
aca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
acb0: 7a 41 63 63 65 70 74 20 7d 2c 0a 20 20 20 20 20  zAccept },.     
acc0: 20 7b 20 22 48 54 54 50 5f 43 4f 4f 4b 49 45 22   { "HTTP_COOKIE"
acd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ace0: 20 20 26 7a 43 6f 6f 6b 69 65 20 7d 2c 0a 20 20    &zCookie },.  
acf0: 20 20 20 20 7b 20 22 48 54 54 50 5f 48 4f 53 54      { "HTTP_HOST
ad00: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
ad10: 20 20 20 20 20 26 7a 48 74 74 70 48 6f 73 74 20       &zHttpHost 
ad20: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 48 54 54 50  },.      { "HTTP
ad30: 5f 52 45 46 45 52 45 52 22 2c 20 20 20 20 20 20  _REFERER",      
ad40: 20 20 20 20 20 20 20 20 20 20 26 7a 52 65 66 65            &zRefe
ad50: 72 65 72 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  rer },.      { "
ad60: 48 54 54 50 5f 55 53 45 52 5f 41 47 45 4e 54 22  HTTP_USER_AGENT"
ad70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a  ,             &z
ad80: 41 67 65 6e 74 20 7d 2c 0a 20 20 20 20 20 20 7b  Agent },.      {
ad90: 20 22 50 41 54 48 22 2c 20 20 20 20 20 20 20 20   "PATH",        
ada0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adb0: 26 64 65 66 61 75 6c 74 5f 70 61 74 68 20 7d 2c  &default_path },
adc0: 0a 20 20 20 20 20 20 7b 20 22 50 41 54 48 5f 49  .      { "PATH_I
add0: 4e 46 4f 22 2c 20 20 20 20 20 20 20 20 20 20 20  NFO",           
ade0: 20 20 20 20 20 20 20 20 26 7a 50 61 74 68 49 6e          &zPathIn
adf0: 66 6f 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 51  fo },.      { "Q
ae00: 55 45 52 59 5f 53 54 52 49 4e 47 22 2c 20 20 20  UERY_STRING",   
ae10: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 51               &zQ
ae20: 75 65 72 79 53 74 72 69 6e 67 20 7d 2c 0a 20 20  ueryString },.  
ae30: 20 20 20 20 7b 20 22 52 45 4d 4f 54 45 5f 41 44      { "REMOTE_AD
ae40: 44 52 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  DR",            
ae50: 20 20 20 20 20 26 7a 52 65 6d 6f 74 65 41 64 64       &zRemoteAdd
ae60: 72 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 52 45  r },.      { "RE
ae70: 51 55 45 53 54 5f 4d 45 54 48 4f 44 22 2c 20 20  QUEST_METHOD",  
ae80: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 4d 65              &zMe
ae90: 74 68 6f 64 20 7d 2c 0a 20 20 20 20 20 20 7b 20  thod },.      { 
aea0: 22 52 45 51 55 45 53 54 5f 55 52 49 22 2c 20 20  "REQUEST_URI",  
aeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
aec0: 7a 53 63 72 69 70 74 20 7d 2c 0a 20 20 20 20 20  zScript },.     
aed0: 20 7b 20 22 52 45 4d 4f 54 45 5f 55 53 45 52 22   { "REMOTE_USER"
aee0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
aef0: 20 20 26 7a 52 65 6d 6f 74 65 55 73 65 72 20 7d    &zRemoteUser }
af00: 2c 0a 20 20 20 20 20 20 7b 20 22 53 43 52 49 50  ,.      { "SCRIP
af10: 54 5f 44 49 52 45 43 54 4f 52 59 22 2c 20 20 20  T_DIRECTORY",   
af20: 20 20 20 20 20 20 20 20 20 26 7a 44 69 72 20 7d           &zDir }
af30: 2c 0a 20 20 20 20 20 20 7b 20 22 53 43 52 49 50  ,.      { "SCRIP
af40: 54 5f 46 49 4c 45 4e 41 4d 45 22 2c 20 20 20 20  T_FILENAME",    
af50: 20 20 20 20 20 20 20 20 20 26 7a 46 69 6c 65 20           &zFile 
af60: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 43 52 49  },.      { "SCRI
af70: 50 54 5f 4e 41 4d 45 22 2c 20 20 20 20 20 20 20  PT_NAME",       
af80: 20 20 20 20 20 20 20 20 20 20 26 7a 52 65 61 6c            &zReal
af90: 53 63 72 69 70 74 20 7d 2c 0a 20 20 20 20 20 20  Script },.      
afa0: 7b 20 22 53 45 52 56 45 52 5f 4e 41 4d 45 22 2c  { "SERVER_NAME",
afb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afc0: 20 26 7a 53 65 72 76 65 72 4e 61 6d 65 20 7d 2c   &zServerName },
afd0: 0a 20 20 20 20 20 20 7b 20 22 53 45 52 56 45 52  .      { "SERVER
afe0: 5f 50 4f 52 54 22 2c 20 20 20 20 20 20 20 20 20  _PORT",         
aff0: 20 20 20 20 20 20 20 20 26 7a 53 65 72 76 65 72          &zServer
b000: 50 6f 72 74 20 7d 2c 0a 20 20 20 20 20 20 7b 20  Port },.      { 
b010: 22 53 45 52 56 45 52 5f 50 52 4f 54 4f 43 4f 4c  "SERVER_PROTOCOL
b020: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 26  ",             &
b030: 7a 50 72 6f 74 6f 63 6f 6c 20 7d 2c 0a 20 20 20  zProtocol },.   
b040: 20 7d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 42   };.    char *zB
b050: 61 73 65 46 69 6c 65 6e 61 6d 65 3b 20 20 20 2f  aseFilename;   /
b060: 2a 20 46 69 6c 65 6e 61 6d 65 20 77 69 74 68 6f  * Filename witho
b070: 75 74 20 64 69 72 65 63 74 6f 72 79 20 70 72 65  ut directory pre
b080: 66 69 78 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49  fix */..    /* I
b090: 66 20 69 74 73 20 65 78 65 63 75 74 61 62 6c 65  f its executable
b0a0: 2c 20 69 74 20 6d 75 73 74 20 62 65 20 61 20 43  , it must be a C
b0b0: 47 49 20 70 72 6f 67 72 61 6d 2e 20 20 53 74 61  GI program.  Sta
b0c0: 72 74 20 62 79 0a 20 20 20 20 2a 2a 20 63 68 61  rt by.    ** cha
b0d0: 6e 67 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65  nging directorie
b0e0: 73 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f  s to the directo
b0f0: 72 79 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70  ry holding the p
b100: 72 6f 67 72 61 6d 2e 0a 20 20 20 20 2a 2f 0a 20  rogram..    */. 
b110: 20 20 20 69 66 28 20 63 68 64 69 72 28 7a 44 69     if( chdir(zDi
b120: 72 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  r) ){.      char
b130: 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20 20   zBuf[1000];.   
b140: 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f     Malfunction(_
b150: 5f 4c 49 4e 45 5f 5f 2c 20 22 63 61 6e 6e 6f 74  _LINE__, "cannot
b160: 20 63 68 64 69 72 20 74 6f 20 5b 25 73 5d 20 66   chdir to [%s] f
b170: 72 6f 6d 20 5b 25 73 5d 22 2c 20 0a 20 20 20 20  rom [%s]", .    
b180: 20 20 20 20 20 20 20 7a 44 69 72 2c 20 67 65 74         zDir, get
b190: 63 77 64 28 7a 42 75 66 2c 39 39 39 29 29 3b 0a  cwd(zBuf,999));.
b1a0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
b1b0: 74 75 70 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d  tup the environm
b1c0: 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 6c  ent appropriatel
b1d0: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  y..    */.    fo
b1e0: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
b1f0: 63 67 69 65 6e 76 29 2f 73 69 7a 65 6f 66 28 63  cgienv)/sizeof(c
b200: 67 69 65 6e 76 5b 30 5d 29 3b 20 69 2b 2b 29 7b  gienv[0]); i++){
b210: 0a 20 20 20 20 20 20 69 66 28 20 2a 63 67 69 65  .      if( *cgie
b220: 6e 76 5b 69 5d 2e 70 7a 45 6e 76 56 61 6c 75 65  nv[i].pzEnvValue
b230: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65 74 45   ){.        SetE
b240: 6e 76 28 63 67 69 65 6e 76 5b 69 5d 2e 7a 45 6e  nv(cgienv[i].zEn
b250: 76 4e 61 6d 65 2c 2a 63 67 69 65 6e 76 5b 69 5d  vName,*cgienv[i]
b260: 2e 70 7a 45 6e 76 56 61 6c 75 65 29 3b 0a 20 20  .pzEnvValue);.  
b270: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
b280: 69 66 28 20 75 73 65 48 74 74 70 73 20 29 7b 0a  if( useHttps ){.
b290: 20 20 20 20 20 20 70 75 74 65 6e 76 28 22 48 54        putenv("HT
b2a0: 54 50 53 3d 6f 6e 22 29 3b 0a 20 20 20 20 7d 0a  TPS=on");.    }.
b2b0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 41  .    /*.    ** A
b2c0: 62 6f 72 74 20 77 69 74 68 20 61 6e 20 65 72 72  bort with an err
b2d0: 6f 72 20 69 66 20 74 68 65 20 43 47 49 20 73 63  or if the CGI sc
b2e0: 72 69 70 74 20 69 73 20 77 72 69 74 61 62 6c 65  ript is writable
b2f0: 20 62 79 20 61 6e 79 6f 6e 65 20 6f 74 68 65 72   by anyone other
b300: 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 69 74 73  .    ** than its
b310: 20 6f 77 6e 65 72 2e 0a 20 20 20 20 2a 2f 0a 20   owner..    */. 
b320: 20 20 20 69 66 28 20 73 74 61 74 62 75 66 2e 73     if( statbuf.s
b330: 74 5f 6d 6f 64 65 20 26 20 30 30 32 32 20 29 7b  t_mode & 0022 ){
b340: 0a 20 20 20 20 20 20 43 67 69 53 63 72 69 70 74  .      CgiScript
b350: 57 72 69 74 61 62 6c 65 28 29 3b 0a 20 20 20 20  Writable();.    
b360: 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 74 68  }..    /* For th
b370: 65 20 50 4f 53 54 20 6d 65 74 68 6f 64 20 61 6c  e POST method al
b380: 6c 20 69 6e 70 75 74 20 68 61 73 20 62 65 65 6e  l input has been
b390: 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 74 65   written to a te
b3a0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20  mporary file,.  
b3b0: 20 20 2a 2a 20 73 6f 20 77 65 20 68 61 76 65 20    ** so we have 
b3c0: 74 6f 20 72 65 64 69 72 65 63 74 20 69 6e 70 75  to redirect inpu
b3d0: 74 20 74 6f 20 74 68 65 20 43 47 49 20 73 63 72  t to the CGI scr
b3e0: 69 70 74 20 66 72 6f 6d 20 74 68 61 74 20 66 69  ipt from that fi
b3f0: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
b400: 66 28 20 7a 4d 65 74 68 6f 64 5b 30 5d 3d 3d 27  f( zMethod[0]=='
b410: 50 27 20 29 7b 0a 20 20 20 20 20 20 64 75 70 28  P' ){.      dup(
b420: 30 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28  0);.      close(
b430: 30 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e 28 7a  0);.      open(z
b440: 54 6d 70 4e 61 6d 2c 20 4f 5f 52 44 4f 4e 4c 59  TmpNam, O_RDONLY
b450: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f  );.    }..    fo
b460: 72 28 69 3d 73 74 72 6c 65 6e 28 7a 46 69 6c 65  r(i=strlen(zFile
b470: 29 2d 31 3b 20 69 3e 3d 30 20 26 26 20 7a 46 69  )-1; i>=0 && zFi
b480: 6c 65 5b 69 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29  le[i]!='/'; i--)
b490: 7b 7d 0a 20 20 20 20 7a 42 61 73 65 46 69 6c 65  {}.    zBaseFile
b4a0: 6e 61 6d 65 20 3d 20 26 7a 46 69 6c 65 5b 69 2b  name = &zFile[i+
b4b0: 31 5d 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 30  1];.    if( i>=0
b4c0: 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 42 61 73   && strncmp(zBas
b4d0: 65 46 69 6c 65 6e 61 6d 65 2c 22 6e 70 68 2d 22  eFilename,"nph-"
b4e0: 2c 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,4)==0 ){.      
b4f0: 2f 2a 20 49 66 20 74 68 65 20 6e 61 6d 65 20 6f  /* If the name o
b500: 66 20 74 68 65 20 43 47 49 20 73 63 72 69 70 74  f the CGI script
b510: 20 62 65 67 69 6e 73 20 77 69 74 68 20 22 6e 70   begins with "np
b520: 68 2d 22 20 74 68 65 6e 20 77 65 20 61 72 65 0a  h-" then we are.
b530: 20 20 20 20 20 20 2a 2a 20 64 65 61 6c 69 6e 67        ** dealing
b540: 20 77 69 74 68 20 61 20 22 6e 6f 6e 2d 70 61 72   with a "non-par
b550: 73 65 64 20 68 65 61 64 65 72 73 22 20 43 47 49  sed headers" CGI
b560: 20 73 63 72 69 70 74 2e 20 20 4a 75 73 74 20 65   script.  Just e
b570: 78 65 63 28 29 0a 20 20 20 20 20 20 2a 2a 20 69  xec().      ** i
b580: 74 20 64 69 72 65 63 74 6c 79 20 61 6e 64 20 6c  t directly and l
b590: 65 74 20 69 74 20 68 61 6e 64 6c 65 20 61 6c 6c  et it handle all
b5a0: 20 69 74 73 20 6f 77 6e 20 68 65 61 64 65 72 20   its own header 
b5b0: 67 65 6e 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20  generation..    
b5c0: 20 20 2a 2f 0a 20 20 20 20 20 20 65 78 65 63 6c    */.      execl
b5d0: 28 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c 7a  (zBaseFilename,z
b5e0: 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c 28 63 68  BaseFilename,(ch
b5f0: 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 2f 2a  ar*)0);.      /*
b600: 20 4e 4f 54 45 3a 20 4e 6f 20 6c 6f 67 20 65 6e   NOTE: No log en
b610: 74 72 79 20 77 72 69 74 74 65 6e 20 66 6f 72 20  try written for 
b620: 6e 70 68 2d 20 73 63 72 69 70 74 73 20 2a 2f 0a  nph- scripts */.
b630: 20 20 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20        exit(0);. 
b640: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 61 6c     }..    /* Fal
b650: 6c 20 74 68 72 75 20 74 6f 20 68 65 72 65 20 6f  l thru to here o
b660: 6e 6c 79 20 69 66 20 74 68 69 73 20 70 72 6f 63  nly if this proc
b670: 65 73 73 20 28 74 68 65 20 73 65 72 76 65 72 29  ess (the server)
b680: 20 69 73 20 67 6f 69 6e 67 0a 20 20 20 20 2a 2a   is going.    **
b690: 20 74 6f 20 72 65 61 64 20 61 6e 64 20 61 75 67   to read and aug
b6a0: 6d 65 6e 74 20 74 68 65 20 68 65 61 64 65 72 20  ment the header 
b6b0: 73 65 6e 74 20 62 61 63 6b 20 62 79 20 74 68 65  sent back by the
b6c0: 20 43 47 49 20 70 72 6f 63 65 73 73 2e 0a 20 20   CGI process..  
b6d0: 20 20 2a 2a 20 4f 70 65 6e 20 61 20 70 69 70 65    ** Open a pipe
b6e0: 20 74 6f 20 72 65 63 65 69 76 65 20 74 68 65 20   to receive the 
b6f0: 6f 75 74 70 75 74 20 66 72 6f 6d 20 74 68 65 20  output from the 
b700: 43 47 49 20 70 72 6f 63 65 73 73 2e 20 20 54 68  CGI process.  Th
b710: 65 6e 0a 20 20 20 20 2a 2a 20 66 6f 72 6b 20 74  en.    ** fork t
b720: 68 65 20 43 47 49 20 70 72 6f 63 65 73 73 2e 20  he CGI process. 
b730: 20 4f 6e 63 65 20 65 76 65 72 79 74 68 69 6e 67   Once everything
b740: 20 69 73 20 64 6f 6e 65 2c 20 77 65 20 73 68 6f   is done, we sho
b750: 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 61 62  uld be.    ** ab
b760: 6c 65 20 74 6f 20 72 65 61 64 20 74 68 65 20 6f  le to read the o
b770: 75 74 70 75 74 20 6f 66 20 43 47 49 20 6f 6e 20  utput of CGI on 
b780: 74 68 65 20 22 69 6e 22 20 73 74 72 65 61 6d 2e  the "in" stream.
b790: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7b 0a 20 20  .    */.    {.  
b7a0: 20 20 20 20 69 6e 74 20 70 78 5b 32 5d 3b 0a 20      int px[2];. 
b7b0: 20 20 20 20 20 70 69 70 65 28 70 78 29 3b 0a 20       pipe(px);. 
b7c0: 20 20 20 20 20 69 66 28 20 66 6f 72 6b 28 29 3d       if( fork()=
b7d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c  =0 ){.        cl
b7e0: 6f 73 65 28 70 78 5b 30 5d 29 3b 0a 20 20 20 20  ose(px[0]);.    
b7f0: 20 20 20 20 63 6c 6f 73 65 28 31 29 3b 0a 20 20      close(1);.  
b800: 20 20 20 20 20 20 64 75 70 28 70 78 5b 31 5d 29        dup(px[1])
b810: 3b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28  ;.        close(
b820: 70 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  px[1]);.        
b830: 65 78 65 63 6c 28 7a 42 61 73 65 46 69 6c 65 6e  execl(zBaseFilen
b840: 61 6d 65 2c 20 7a 42 61 73 65 46 69 6c 65 6e 61  ame, zBaseFilena
b850: 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  me, (char*)0);. 
b860: 20 20 20 20 20 20 20 65 78 69 74 28 30 29 3b 0a         exit(0);.
b870: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c        }.      cl
b880: 6f 73 65 28 70 78 5b 31 5d 29 3b 0a 20 20 20 20  ose(px[1]);.    
b890: 20 20 69 6e 20 3d 20 66 64 6f 70 65 6e 28 70 78    in = fdopen(px
b8a0: 5b 30 5d 2c 20 22 72 22 29 3b 0a 20 20 20 20 7d  [0], "r");.    }
b8b0: 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29  .    if( in==0 )
b8c0: 7b 0a 20 20 20 20 20 20 43 67 69 45 72 72 6f 72  {.      CgiError
b8d0: 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ();.    }..    /
b8e0: 2a 20 52 65 61 64 20 61 6e 64 20 70 72 6f 63 65  * Read and proce
b8f0: 73 73 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e  ss the first lin
b900: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
b910: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a  returned by the.
b920: 20 20 20 20 2a 2a 20 43 47 49 20 73 63 72 69 70      ** CGI scrip
b930: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
b940: 28 20 75 73 65 54 69 6d 65 6f 75 74 20 29 20 61  ( useTimeout ) a
b950: 6c 61 72 6d 28 31 35 29 3b 0a 20 20 20 20 77 68  larm(15);.    wh
b960: 69 6c 65 28 20 66 67 65 74 73 28 7a 4c 69 6e 65  ile( fgets(zLine
b970: 2c 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 69  ,sizeof(zLine),i
b980: 6e 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  n) ){.      if( 
b990: 73 74 72 6e 63 6d 70 28 7a 4c 69 6e 65 2c 22 4c  strncmp(zLine,"L
b9a0: 6f 63 61 74 69 6f 6e 3a 22 2c 39 29 3d 3d 30 20  ocation:",9)==0 
b9b0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
b9c0: 3b 0a 20 20 20 20 20 20 20 20 52 65 6d 6f 76 65  ;.        Remove
b9d0: 4e 65 77 6c 69 6e 65 28 7a 4c 69 6e 65 29 3b 0a  Newline(zLine);.
b9e0: 20 20 20 20 20 20 20 20 7a 20 3d 20 26 7a 4c 69          z = &zLi
b9f0: 6e 65 5b 31 30 5d 3b 0a 20 20 20 20 20 20 20 20  ne[10];.        
ba00: 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a  while( isspace(*
ba10: 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20  z) ){ z++; }.   
ba20: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b       for(i=0; z[
ba30: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
ba40: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 3f      if( z[i]=='?
ba50: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
ba60: 20 7a 51 75 65 72 79 53 75 66 66 69 78 20 3d 20   zQuerySuffix = 
ba70: 53 74 72 44 75 70 28 22 22 29 3b 0a 20 20 20 20  StrDup("");.    
ba80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ba90: 7d 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  }.        .     
baa0: 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2f 27     if( z[0]=='/'
bab0: 20 26 26 20 7a 5b 31 5d 3d 3d 27 2f 27 20 29 7b   && z[1]=='/' ){
bac0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
bad0: 65 20 73 63 68 65 6d 65 20 69 73 20 6d 69 73 73  e scheme is miss
bae0: 69 6e 67 2e 20 20 41 64 64 20 69 74 20 69 6e 20  ing.  Add it in 
baf0: 62 65 66 6f 72 65 20 72 65 64 69 72 65 63 74 69  before redirecti
bb00: 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ng */.          
bb10: 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 33  StartResponse("3
bb20: 30 32 20 52 65 64 69 72 65 63 74 22 29 3b 0a 20  02 Redirect");. 
bb30: 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d           nOut +=
bb40: 20 70 72 69 6e 74 66 28 22 4c 6f 63 61 74 69 6f   printf("Locatio
bb50: 6e 3a 20 25 73 3a 25 73 25 73 5c 72 5c 6e 22 2c  n: %s:%s%s\r\n",
bb60: 7a 48 74 74 70 2c 7a 2c 7a 51 75 65 72 79 53 75  zHttp,z,zQuerySu
bb70: 66 66 69 78 29 3b 0a 20 20 20 20 20 20 20 20 20  ffix);.         
bb80: 20 62 72 65 61 6b 3b 20 2f 2a 20 44 4b 20 2a 2f   break; /* DK */
bb90: 0a 20 20 20 20 20 20 20 20 20 20 4d 61 6b 65 4c  .          MakeL
bba0: 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20 20 20 20  ogEntry(0);.    
bbb0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
bbc0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
bbd0: 7a 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  z[0]=='/' ){.   
bbe0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 63         /* The sc
bbf0: 68 65 6d 65 20 61 6e 64 20 6e 65 74 77 6f 72 6b  heme and network
bc00: 20 6c 6f 63 61 74 69 6f 6e 20 61 72 65 20 6d 69   location are mi
bc10: 73 73 69 6e 67 20 62 75 74 20 77 65 20 68 61 76  ssing but we hav
bc20: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  e.          ** a
bc30: 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 2e  n absolute path.
bc40: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52 65   */.          Re
bc50: 64 69 72 65 63 74 28 7a 2c 20 30 29 3b 20 2f 2a  direct(z, 0); /*
bc60: 20 44 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   DK */.         
bc70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
bc80: 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  }.        /* Che
bc90: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
bca0: 72 65 20 69 73 20 61 20 73 63 68 65 6d 65 20 70  re is a scheme p
bcb0: 72 65 66 69 78 20 2a 2f 0a 20 20 20 20 20 20 20  refix */.       
bcc0: 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 20 26   for(i=0; z[i] &
bcd0: 26 20 7a 5b 69 5d 21 3d 27 3a 27 20 26 26 20 7a  & z[i]!=':' && z
bce0: 5b 69 5d 21 3d 27 2f 27 3b 20 69 2b 2b 29 7b 7d  [i]!='/'; i++){}
bcf0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69  .        if( z[i
bd00: 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20 20 20  ]==':' ){.      
bd10: 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61      /* We have a
bd20: 20 73 63 68 65 6d 65 2e 20 20 41 73 73 75 6d 65   scheme.  Assume
bd30: 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 62 73   there is an abs
bd40: 6f 6c 75 74 65 20 55 52 4c 20 2a 2f 0a 20 20 20  olute URL */.   
bd50: 20 20 20 20 20 20 20 53 74 61 72 74 52 65 73 70         StartResp
bd60: 6f 6e 73 65 28 22 33 30 32 20 52 65 64 69 72 65  onse("302 Redire
bd70: 63 74 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ct");.          
bd80: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22  nOut += printf("
bd90: 4c 6f 63 61 74 69 6f 6e 3a 20 25 73 25 73 5c 72  Location: %s%s\r
bda0: 5c 6e 22 2c 7a 2c 7a 51 75 65 72 79 53 75 66 66  \n",z,zQuerySuff
bdb0: 69 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ix);.          b
bdc0: 72 65 61 6b 3b 20 2f 2a 20 44 4b 20 2a 2f 0a 20  reak; /* DK */. 
bdd0: 20 20 20 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67           MakeLog
bde0: 45 6e 74 72 79 28 30 29 3b 0a 20 20 20 20 20 20  Entry(0);.      
bdf0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
be00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
be10: 20 4d 75 73 74 20 62 65 20 61 20 72 65 6c 61 74   Must be a relat
be20: 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 43  ive pathname.  C
be30: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 61 62 73  onstruct the abs
be40: 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d 65 0a 20  olute pathname. 
be50: 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65         ** and re
be60: 64 69 72 65 63 74 20 74 6f 20 69 74 2e 20 2a 2f  direct to it. */
be70: 0a 20 20 20 20 20 20 20 20 69 20 3d 20 73 74 72  .        i = str
be80: 6c 65 6e 28 7a 52 65 61 6c 53 63 72 69 70 74 29  len(zRealScript)
be90: 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
bea0: 20 69 3e 30 20 26 26 20 7a 52 65 61 6c 53 63 72   i>0 && zRealScr
beb0: 69 70 74 5b 69 2d 31 5d 21 3d 27 2f 27 20 29 7b  ipt[i-1]!='/' ){
bec0: 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20   i--; }.        
bed0: 77 68 69 6c 65 28 20 69 3e 30 20 26 26 20 7a 52  while( i>0 && zR
bee0: 65 61 6c 53 63 72 69 70 74 5b 69 2d 31 5d 3d 3d  ealScript[i-1]==
bef0: 27 2f 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20  '/' ){ i--; }.  
bf00: 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 3d        while( *z=
bf10: 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='.' ){.        
bf20: 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 27 2f 27 20    if( z[1]=='/' 
bf30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ){.            z
bf40: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20   += 2;.         
bf50: 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 31 5d 3d   }else if( z[1]=
bf60: 3d 27 2e 27 20 26 26 20 7a 5b 32 5d 3d 3d 27 2f  ='.' && z[2]=='/
bf70: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
bf80: 20 77 68 69 6c 65 28 20 69 3e 30 20 26 26 20 7a   while( i>0 && z
bf90: 52 65 61 6c 53 63 72 69 70 74 5b 69 2d 31 5d 21  RealScript[i-1]!
bfa0: 3d 27 2f 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20  ='/' ){ i--; }. 
bfb0: 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65             while
bfc0: 28 20 69 3e 30 20 26 26 20 7a 52 65 61 6c 53 63  ( i>0 && zRealSc
bfd0: 72 69 70 74 5b 69 2d 31 5d 3d 3d 27 2f 27 20 29  ript[i-1]=='/' )
bfe0: 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20  { i--; }.       
bff0: 20 20 20 20 20 7a 20 2b 3d 20 33 3b 0a 20 20 20       z += 3;.   
c000: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
c010: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
c020: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
c030: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 53       }.        S
c040: 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 33 30  tartResponse("30
c050: 32 20 52 65 64 69 72 65 63 74 22 29 3b 0a 20 20  2 Redirect");.  
c060: 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72        nOut += pr
c070: 69 6e 74 66 28 22 4c 6f 63 61 74 69 6f 6e 3a 20  intf("Location: 
c080: 25 73 3a 2f 2f 25 73 22 2c 7a 48 74 74 70 2c 7a  %s://%s",zHttp,z
c090: 53 65 72 76 65 72 4e 61 6d 65 29 3b 0a 20 20 20  ServerName);.   
c0a0: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
c0b0: 7a 53 65 72 76 65 72 50 6f 72 74 2c 22 38 30 22  zServerPort,"80"
c0c0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  ) ){.          n
c0d0: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 3a  Out += printf(":
c0e0: 25 73 22 2c 7a 53 65 72 76 65 72 50 6f 72 74 29  %s",zServerPort)
c0f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c100: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
c110: 74 66 28 22 25 2e 2a 73 2f 25 73 25 73 5c 72 5c  tf("%.*s/%s%s\r\
c120: 6e 5c 72 5c 6e 22 2c 69 2c 7a 52 65 61 6c 53 63  n\r\n",i,zRealSc
c130: 72 69 70 74 2c 7a 2c 7a 51 75 65 72 79 53 75 66  ript,z,zQuerySuf
c140: 66 69 78 29 3b 0a 20 20 20 20 20 20 20 20 4d 61  fix);.        Ma
c150: 6b 65 4c 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20  keLogEntry(0);. 
c160: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
c170: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
c180: 74 72 6e 63 6d 70 28 7a 4c 69 6e 65 2c 22 53 74  trncmp(zLine,"St
c190: 61 74 75 73 3a 22 2c 37 29 3d 3d 30 20 29 7b 0a  atus:",7)==0 ){.
c1a0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
c1b0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 37 3b 20         for(i=7; 
c1c0: 69 73 73 70 61 63 65 28 7a 4c 69 6e 65 5b 69 5d  isspace(zLine[i]
c1d0: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  ); i++){}.      
c1e0: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
c1f0: 28 22 25 73 20 25 73 22 2c 20 7a 50 72 6f 74 6f  ("%s %s", zProto
c200: 63 6f 6c 2c 20 26 7a 4c 69 6e 65 5b 69 5d 29 3b  col, &zLine[i]);
c210: 0a 20 20 20 20 20 20 20 20 73 74 72 6e 63 70 79  .        strncpy
c220: 28 7a 52 65 70 6c 79 53 74 61 74 75 73 2c 20 26  (zReplyStatus, &
c230: 7a 4c 69 6e 65 5b 69 5d 2c 20 33 29 3b 0a 20 20  zLine[i], 3);.  
c240: 20 20 20 20 20 20 7a 52 65 70 6c 79 53 74 61 74        zReplyStat
c250: 75 73 5b 33 5d 20 3d 20 30 3b 0a 20 20 20 20 20  us[3] = 0;.     
c260: 20 20 20 73 74 61 74 75 73 53 65 6e 74 20 3d 20     statusSent = 
c270: 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  1;.        break
c280: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
c290: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
c2a0: 20 20 20 20 20 20 53 74 61 72 74 52 65 73 70 6f        StartRespo
c2b0: 6e 73 65 28 22 32 30 30 20 4f 4b 22 29 3b 0a 20  nse("200 OK");. 
c2c0: 20 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70         nOut += p
c2d0: 72 69 6e 74 66 28 22 25 73 22 2c 7a 4c 69 6e 65  rintf("%s",zLine
c2e0: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
c2f0: 3d 30 3b 20 7a 4c 69 6e 65 5b 69 5d 20 26 26 20  =0; zLine[i] && 
c300: 21 69 73 73 70 61 63 65 28 7a 4c 69 6e 65 5b 69  !isspace(zLine[i
c310: 5d 29 20 26 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d  ]) && zLine[i]!=
c320: 27 3a 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  ':'; i++){}.    
c330: 20 20 20 20 69 66 28 20 69 3c 32 20 7c 7c 20 7a      if( i<2 || z
c340: 4c 69 6e 65 5b 69 5d 21 3d 27 3a 27 20 29 20 62  Line[i]!=':' ) b
c350: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
c360: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
c370: 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65   everything else
c380: 20 74 68 72 75 20 77 69 74 68 6f 75 74 20 63 68   thru without ch
c390: 61 6e 67 65 20 6f 72 20 61 6e 61 6c 79 73 69 73  ange or analysis
c3a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
c3b0: 20 75 73 65 54 69 6d 65 6f 75 74 20 29 20 61 6c   useTimeout ) al
c3c0: 61 72 6d 28 36 30 2a 35 29 3b 0a 20 20 20 20 77  arm(60*5);.    w
c3d0: 68 69 6c 65 28 20 28 63 20 3d 20 67 65 74 63 28  hile( (c = getc(
c3e0: 69 6e 29 29 21 3d 45 4f 46 20 29 7b 0a 20 20 20  in))!=EOF ){.   
c3f0: 20 20 20 70 75 74 63 28 63 2c 73 74 64 6f 75 74     putc(c,stdout
c400: 29 3b 0a 20 20 20 20 20 20 6e 4f 75 74 2b 2b 3b  );.      nOut++;
c410: 0a 20 20 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73  .    }.    fclos
c420: 65 28 69 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e(in);.  }else{.
c430: 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 6e      /* If it isn
c440: 27 74 20 65 78 65 63 75 74 61 62 6c 65 20 74 68  't executable th
c450: 65 6e 20 69 74 0a 20 20 20 20 2a 2a 20 6d 75 73  en it.    ** mus
c460: 74 20 61 20 73 69 6d 70 6c 65 20 66 69 6c 65 20  t a simple file 
c470: 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
c480: 20 63 6f 70 69 65 64 20 74 6f 20 6f 75 74 70 75   copied to outpu
c490: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f  t..    */.    co
c4a0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65  nst char *zConte
c4b0: 6e 74 54 79 70 65 20 3d 20 47 65 74 4d 69 6d 65  ntType = GetMime
c4c0: 54 79 70 65 28 7a 46 69 6c 65 2c 20 6c 65 6e 46  Type(zFile, lenF
c4d0: 69 6c 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a  ile);..    if( z
c4e0: 54 6d 70 4e 61 6d 20 29 20 75 6e 6c 69 6e 6b 28  TmpNam ) unlink(
c4f0: 7a 54 6d 70 4e 61 6d 29 3b 0a 20 20 20 20 69 6e  zTmpNam);.    in
c500: 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 22   = fopen(zFile,"
c510: 72 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d  r");.    if( in=
c520: 3d 30 20 29 20 4e 6f 74 46 6f 75 6e 64 28 5f 5f  =0 ) NotFound(__
c530: 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 53 74 61  LINE__);.    Sta
c540: 72 74 52 65 73 70 6f 6e 73 65 28 22 32 30 30 20  rtResponse("200 
c550: 4f 4b 22 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b  OK");.    nOut +
c560: 3d 20 44 61 74 65 54 61 67 28 22 4c 61 73 74 2d  = DateTag("Last-
c570: 4d 6f 64 69 66 69 65 64 22 2c 20 73 74 61 74 62  Modified", statb
c580: 75 66 2e 73 74 5f 6d 74 69 6d 65 29 3b 0a 20 20  uf.st_mtime);.  
c590: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
c5a0: 28 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20  ("Content-type: 
c5b0: 25 73 5c 72 5c 6e 22 2c 7a 43 6f 6e 74 65 6e 74  %s\r\n",zContent
c5c0: 54 79 70 65 29 3b 0a 20 20 20 20 6e 4f 75 74 20  Type);.    nOut 
c5d0: 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 74 65  += printf("Conte
c5e0: 6e 74 2d 6c 65 6e 67 74 68 3a 20 25 64 5c 72 5c  nt-length: %d\r\
c5f0: 6e 5c 72 5c 6e 22 2c 28 69 6e 74 29 73 74 61 74  n\r\n",(int)stat
c600: 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20  buf.st_size);.  
c610: 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29    fflush(stdout)
c620: 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  ;.    if( strcmp
c630: 28 7a 4d 65 74 68 6f 64 2c 22 48 45 41 44 22 29  (zMethod,"HEAD")
c640: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4d 61 6b  ==0 ){.      Mak
c650: 65 4c 6f 67 45 6e 74 72 79 28 30 29 3b 0a 20 20  eLogEntry(0);.  
c660: 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
c670: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
c680: 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65 54    }.    if( useT
c690: 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d 28 33  imeout ) alarm(3
c6a0: 30 20 2b 20 73 74 61 74 62 75 66 2e 73 74 5f 73  0 + statbuf.st_s
c6b0: 69 7a 65 2f 31 30 30 30 29 3b 0a 23 69 66 64 65  ize/1000);.#ifde
c6c0: 66 20 6c 69 6e 75 78 0a 20 20 20 20 7b 0a 20 20  f linux.    {.  
c6d0: 20 20 20 20 6f 66 66 5f 74 20 6f 66 66 73 65 74      off_t offset
c6e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 4f 75 74   = 0;.      nOut
c6f0: 20 2b 3d 20 73 65 6e 64 66 69 6c 65 28 66 69 6c   += sendfile(fil
c700: 65 6e 6f 28 73 74 64 6f 75 74 29 2c 20 66 69 6c  eno(stdout), fil
c710: 65 6e 6f 28 69 6e 29 2c 20 26 6f 66 66 73 65 74  eno(in), &offset
c720: 2c 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a  , statbuf.st_siz
c730: 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  e);.    }.#else.
c740: 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20      while( (c = 
c750: 67 65 74 63 28 69 6e 29 29 21 3d 45 4f 46 20 29  getc(in))!=EOF )
c760: 7b 0a 20 20 20 20 20 20 70 75 74 63 28 63 2c 73  {.      putc(c,s
c770: 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 6e 4f  tdout);.      nO
c780: 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ut++;.    }.#end
c790: 69 66 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e  if.    fclose(in
c7a0: 29 3b 0a 20 20 7d 0a 20 20 66 66 6c 75 73 68 28  );.  }.  fflush(
c7b0: 73 74 64 6f 75 74 29 3b 0a 20 20 4d 61 6b 65 4c  stdout);.  MakeL
c7c0: 6f 67 45 6e 74 72 79 28 30 29 3b 0a 0a 20 20 2f  ogEntry(0);..  /
c7d0: 2a 20 54 68 65 20 6e 65 78 74 20 72 65 71 75 65  * The next reque
c7e0: 73 74 20 6d 75 73 74 20 61 72 72 69 76 65 20 77  st must arrive w
c7f0: 69 74 68 69 6e 20 33 30 20 73 65 63 6f 6e 64 73  ithin 30 seconds
c800: 20 6f 72 20 77 65 20 63 6c 6f 73 65 20 74 68 65   or we close the
c810: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 2a 2f   connection.  */
c820: 0a 20 20 6f 6d 69 74 4c 6f 67 20 3d 20 31 3b 0a  .  omitLog = 1;.
c830: 20 20 69 66 28 20 75 73 65 54 69 6d 65 6f 75 74    if( useTimeout
c840: 20 29 20 61 6c 61 72 6d 28 33 30 29 3b 0a 7d 0a   ) alarm(30);.}.
c850: 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 52  .#define MAX_PAR
c860: 41 4c 4c 45 4c 20 35 30 20 20 2f 2a 20 4e 75 6d  ALLEL 50  /* Num
c870: 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65  ber of simultane
c880: 6f 75 73 20 63 68 69 6c 64 72 65 6e 20 2a 2f 0a  ous children */.
c890: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 70 6f 73 73 69  ./*.** All possi
c8a0: 62 6c 65 20 66 6f 72 6d 73 20 6f 66 20 61 6e 20  ble forms of an 
c8b0: 49 50 20 61 64 64 72 65 73 73 2e 20 20 4e 65 65  IP address.  Nee
c8c0: 64 65 64 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75  ded to work arou
c8d0: 6e 64 20 47 43 43 20 73 74 72 69 63 74 0a 2a 2a  nd GCC strict.**
c8e0: 20 61 6c 69 61 73 69 6e 67 20 72 75 6c 65 73 2e   aliasing rules.
c8f0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 75 6e 69 6f  .*/.typedef unio
c900: 6e 20 7b 0a 20 20 73 74 72 75 63 74 20 73 6f 63  n {.  struct soc
c910: 6b 61 64 64 72 20 73 61 3b 20 20 20 20 20 20 20  kaddr sa;       
c920: 20 20 20 20 20 20 20 2f 2a 20 41 62 73 74 72 61         /* Abstra
c930: 63 74 20 73 75 70 65 72 63 6c 61 73 73 20 2a 2f  ct superclass */
c940: 0a 20 20 73 74 72 75 63 74 20 73 6f 63 6b 61 64  .  struct sockad
c950: 64 72 5f 69 6e 20 73 61 34 3b 20 20 20 20 20 20  dr_in sa4;      
c960: 20 20 20 20 2f 2a 20 49 50 76 34 20 2a 2f 0a 20      /* IPv4 */. 
c970: 20 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72   struct sockaddr
c980: 5f 69 6e 36 20 73 61 36 3b 20 20 20 20 20 20 20  _in6 sa6;       
c990: 20 20 2f 2a 20 49 50 76 36 20 2a 2f 0a 20 20 73    /* IPv6 */.  s
c9a0: 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 73  truct sockaddr_s
c9b0: 74 6f 72 61 67 65 20 73 61 73 3b 20 20 20 20 20  torage sas;     
c9c0: 2f 2a 20 53 68 6f 75 6c 64 20 62 65 20 74 68 65  /* Should be the
c9d0: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
c9e0: 61 62 6f 76 65 20 33 20 2a 2f 0a 7d 20 61 64 64  above 3 */.} add
c9f0: 72 65 73 73 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  ress;../*.** Imp
ca00: 6c 65 6d 65 6e 74 20 61 6e 20 48 54 54 50 20 73  lement an HTTP s
ca10: 65 72 76 65 72 20 64 61 65 6d 6f 6e 20 6c 69 73  erver daemon lis
ca20: 74 65 6e 69 6e 67 20 6f 6e 20 70 6f 72 74 20 69  tening on port i
ca30: 50 6f 72 74 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 6e  Port..**.** As n
ca40: 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ew connections a
ca50: 72 72 69 76 65 2c 20 66 6f 72 6b 20 61 20 63 68  rrive, fork a ch
ca60: 69 6c 64 20 61 6e 64 20 6c 65 74 20 63 68 69 6c  ild and let chil
ca70: 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6f 75 74 20  d return.** out 
ca80: 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  of this procedur
ca90: 65 20 63 61 6c 6c 2e 20 20 54 68 65 20 63 68 69  e call.  The chi
caa0: 6c 64 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 74  ld will handle t
cab0: 68 65 20 72 65 71 75 65 73 74 2e 0a 2a 2a 20 54  he request..** T
cac0: 68 65 20 70 61 72 65 6e 74 20 6e 65 76 65 72 20  he parent never 
cad0: 72 65 74 75 72 6e 73 20 66 72 6f 6d 20 74 68 69  returns from thi
cae0: 73 20 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2a 0a  s procedure..**.
caf0: 2a 2a 20 52 65 74 75 72 6e 20 30 20 74 6f 20 65  ** Return 0 to e
cb00: 61 63 68 20 63 68 69 6c 64 20 61 73 20 69 74 20  ach child as it 
cb10: 72 75 6e 73 2e 20 20 49 66 20 75 6e 61 62 6c 65  runs.  If unable
cb20: 20 74 6f 20 65 73 74 61 62 6c 69 73 68 20 61 0a   to establish a.
cb30: 2a 2a 20 6c 69 73 74 65 6e 69 6e 67 20 73 6f 63  ** listening soc
cb40: 6b 65 74 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d  ket, return non-
cb50: 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 68 74 74  zero..*/.int htt
cb60: 70 5f 73 65 72 76 65 72 28 63 6f 6e 73 74 20 63  p_server(const c
cb70: 68 61 72 20 2a 7a 50 6f 72 74 2c 20 69 6e 74 20  har *zPort, int 
cb80: 6c 6f 63 61 6c 4f 6e 6c 79 29 7b 0a 20 20 69 6e  localOnly){.  in
cb90: 74 20 6c 69 73 74 65 6e 65 72 5b 32 30 5d 3b 20  t listener[20]; 
cba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
cbb0: 65 20 73 65 72 76 65 72 20 73 6f 63 6b 65 74 73  e server sockets
cbc0: 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 6e 65 63   */.  int connec
cbd0: 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  tion;           
cbe0: 20 20 20 2f 2a 20 41 20 73 6f 63 6b 65 74 20 66     /* A socket f
cbf0: 6f 72 20 65 61 63 68 20 69 6e 64 69 76 69 64 75  or each individu
cc00: 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  al connection */
cc10: 0a 20 20 66 64 5f 73 65 74 20 72 65 61 64 66 64  .  fd_set readfd
cc20: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
cc30: 2f 2a 20 53 65 74 20 6f 66 20 66 69 6c 65 20 64  /* Set of file d
cc40: 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 73  escriptors for s
cc50: 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 61 64 64  elect() */.  add
cc60: 72 65 73 73 20 69 6e 61 64 64 72 3b 20 20 20 20  ress inaddr;    
cc70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d            /* Rem
cc80: 6f 74 65 20 61 64 64 72 65 73 73 20 2a 2f 0a 20  ote address */. 
cc90: 20 73 6f 63 6b 6c 65 6e 5f 74 20 6c 65 6e 61 64   socklen_t lenad
cca0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dr;           /*
ccb0: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 69   Length of the i
ccc0: 6e 61 64 64 72 20 73 74 72 75 63 74 75 72 65 20  naddr structure 
ccd0: 2a 2f 0a 20 20 69 6e 74 20 63 68 69 6c 64 3b 20  */.  int child; 
cce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccf0: 20 20 2f 2a 20 50 49 44 20 6f 66 20 74 68 65 20    /* PID of the 
cd00: 63 68 69 6c 64 20 70 72 6f 63 65 73 73 20 2a 2f  child process */
cd10: 0a 20 20 69 6e 74 20 6e 63 68 69 6c 64 72 65 6e  .  int nchildren
cd20: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
cd30: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 69  /* Number of chi
cd40: 6c 64 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a  ld processes */.
cd50: 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c    struct timeval
cd60: 20 64 65 6c 61 79 3b 20 20 20 20 20 20 20 20 2f   delay;        /
cd70: 2a 20 48 6f 77 20 6c 6f 6e 67 20 74 6f 20 77 61  * How long to wa
cd80: 69 74 20 69 6e 73 69 64 65 20 73 65 6c 65 63 74  it inside select
cd90: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 74 20  () */.  int opt 
cda0: 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
cdb0: 20 20 20 20 20 2f 2a 20 73 65 74 73 6f 63 6b 6f       /* setsocko
cdc0: 70 74 20 66 6c 61 67 20 2a 2f 0a 20 20 73 74 72  pt flag */.  str
cdd0: 75 63 74 20 61 64 64 72 69 6e 66 6f 20 73 48 69  uct addrinfo sHi
cde0: 6e 74 73 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  nts;      /* Add
cdf0: 72 65 73 73 20 68 69 6e 74 73 20 2a 2f 0a 20 20  ress hints */.  
ce00: 73 74 72 75 63 74 20 61 64 64 72 69 6e 66 6f 20  struct addrinfo 
ce10: 2a 70 41 64 64 72 73 2c 20 2a 70 3b 20 2f 2a 20  *pAddrs, *p; /* 
ce20: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
ce30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce40: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
ce50: 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a   */.  int i, n;.
ce60: 20 20 69 6e 74 20 6d 61 78 46 64 20 3d 20 2d 31    int maxFd = -1
ce70: 3b 0a 20 20 0a 20 20 6d 65 6d 73 65 74 28 26 73  ;.  .  memset(&s
ce80: 48 69 6e 74 73 2c 20 30 2c 20 73 69 7a 65 6f 66  Hints, 0, sizeof
ce90: 28 73 48 69 6e 74 73 29 29 3b 0a 20 20 73 48 69  (sHints));.  sHi
cea0: 6e 74 73 2e 61 69 5f 66 61 6d 69 6c 79 20 3d 20  nts.ai_family = 
ceb0: 41 46 5f 55 4e 53 50 45 43 3b 0a 20 20 73 48 69  AF_UNSPEC;.  sHi
cec0: 6e 74 73 2e 61 69 5f 73 6f 63 6b 74 79 70 65 20  nts.ai_socktype 
ced0: 3d 20 53 4f 43 4b 5f 53 54 52 45 41 4d 3b 0a 20  = SOCK_STREAM;. 
cee0: 20 73 48 69 6e 74 73 2e 61 69 5f 66 6c 61 67 73   sHints.ai_flags
cef0: 20 3d 20 41 49 5f 50 41 53 53 49 56 45 3b 0a 20   = AI_PASSIVE;. 
cf00: 20 73 48 69 6e 74 73 2e 61 69 5f 70 72 6f 74 6f   sHints.ai_proto
cf10: 63 6f 6c 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  col = 0;.  rc = 
cf20: 67 65 74 61 64 64 72 69 6e 66 6f 28 6c 6f 63 61  getaddrinfo(loca
cf30: 6c 4f 6e 6c 79 20 3f 20 22 6c 6f 63 61 6c 68 6f  lOnly ? "localho
cf40: 73 74 22 3a 20 30 2c 20 7a 50 6f 72 74 2c 20 26  st": 0, zPort, &
cf50: 73 48 69 6e 74 73 2c 20 26 70 41 64 64 72 73 29  sHints, &pAddrs)
cf60: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
cf70: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
cf80: 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 67 65 74  , "could not get
cf90: 20 61 64 64 72 20 69 6e 66 6f 3a 20 25 73 22 2c   addr info: %s",
cfa0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63   .            rc
cfb0: 21 3d 45 41 49 5f 53 59 53 54 45 4d 20 3f 20 67  !=EAI_SYSTEM ? g
cfc0: 61 69 5f 73 74 72 65 72 72 6f 72 28 72 63 29 20  ai_strerror(rc) 
cfd0: 3a 20 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f  : strerror(errno
cfe0: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ));.    return 1
cff0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6e 3d 30 2c  ;.  }.  for(n=0,
d000: 20 70 3d 70 41 64 64 72 73 3b 20 6e 3c 73 69 7a   p=pAddrs; n<siz
d010: 65 6f 66 28 6c 69 73 74 65 6e 65 72 29 2f 73 69  eof(listener)/si
d020: 7a 65 6f 66 28 6c 69 73 74 65 6e 65 72 5b 30 5d  zeof(listener[0]
d030: 29 20 26 26 20 70 21 3d 30 3b 0a 20 20 20 20 20  ) && p!=0;.     
d040: 20 20 20 70 3d 70 2d 3e 61 69 5f 6e 65 78 74 29     p=p->ai_next)
d050: 7b 0a 20 20 20 20 6c 69 73 74 65 6e 65 72 5b 6e  {.    listener[n
d060: 5d 20 3d 20 73 6f 63 6b 65 74 28 70 2d 3e 61 69  ] = socket(p->ai
d070: 5f 66 61 6d 69 6c 79 2c 20 70 2d 3e 61 69 5f 73  _family, p->ai_s
d080: 6f 63 6b 74 79 70 65 2c 20 70 2d 3e 61 69 5f 70  ocktype, p->ai_p
d090: 72 6f 74 6f 63 6f 6c 29 3b 0a 20 20 20 20 69 66  rotocol);.    if
d0a0: 28 20 6c 69 73 74 65 6e 65 72 5b 6e 5d 3e 3d 30  ( listener[n]>=0
d0b0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20   ){.      /* if 
d0c0: 77 65 20 63 61 6e 27 74 20 74 65 72 6d 69 6e 61  we can't termina
d0d0: 74 65 20 6e 69 63 65 6c 79 2c 20 61 74 20 6c 65  te nicely, at le
d0e0: 61 73 74 20 61 6c 6c 6f 77 20 74 68 65 20 73 6f  ast allow the so
d0f0: 63 6b 65 74 20 74 6f 20 62 65 20 72 65 75 73 65  cket to be reuse
d100: 64 20 2a 2f 0a 20 20 20 20 20 20 73 65 74 73 6f  d */.      setso
d110: 63 6b 6f 70 74 28 6c 69 73 74 65 6e 65 72 5b 6e  ckopt(listener[n
d120: 5d 2c 20 53 4f 4c 5f 53 4f 43 4b 45 54 2c 20 53  ], SOL_SOCKET, S
d130: 4f 5f 52 45 55 53 45 41 44 44 52 2c 26 6f 70 74  O_REUSEADDR,&opt
d140: 2c 20 73 69 7a 65 6f 66 28 6f 70 74 29 29 3b 0a  , sizeof(opt));.
d150: 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28        .      if(
d160: 20 62 69 6e 64 28 6c 69 73 74 65 6e 65 72 5b 6e   bind(listener[n
d170: 5d 2c 20 70 2d 3e 61 69 5f 61 64 64 72 2c 20 70  ], p->ai_addr, p
d180: 2d 3e 61 69 5f 61 64 64 72 6c 65 6e 29 3c 30 20  ->ai_addrlen)<0 
d190: 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74  ){.        print
d1a0: 66 28 22 62 69 6e 64 20 66 61 69 6c 65 64 3a 20  f("bind failed: 
d1b0: 25 73 5c 6e 22 2c 20 73 74 72 65 72 72 6f 72 28  %s\n", strerror(
d1c0: 65 72 72 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20  errno));.       
d1d0: 20 63 6c 6f 73 65 28 6c 69 73 74 65 6e 65 72 5b   close(listener[
d1e0: 6e 5d 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  n]);.        con
d1f0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
d200: 20 20 20 20 20 69 66 28 20 6c 69 73 74 65 6e 28       if( listen(
d210: 6c 69 73 74 65 6e 65 72 5b 6e 5d 2c 20 32 30 29  listener[n], 20)
d220: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  <0 ){.        pr
d230: 69 6e 74 66 28 22 6c 69 73 74 65 6e 28 29 20 66  intf("listen() f
d240: 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20 73 74  ailed: %s\n", st
d250: 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 29 3b 0a  rerror(errno));.
d260: 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 6c 69          close(li
d270: 73 74 65 6e 65 72 5b 6e 5d 29 3b 0a 20 20 20 20  stener[n]);.    
d280: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
d290: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 2b 2b 3b      }.      n++;
d2a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
d2b0: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72   n==0 ){.    fpr
d2c0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 63 61  intf(stderr, "ca
d2d0: 6e 6e 6f 74 20 6f 70 65 6e 20 61 6e 79 20 73 6f  nnot open any so
d2e0: 63 6b 65 74 73 5c 6e 22 29 3b 0a 20 20 20 20 72  ckets\n");.    r
d2f0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
d300: 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
d310: 69 66 28 20 6e 63 68 69 6c 64 72 65 6e 3e 4d 41  if( nchildren>MA
d320: 58 5f 50 41 52 41 4c 4c 45 4c 20 29 7b 0a 20 20  X_PARALLEL ){.  
d330: 20 20 20 20 2f 2a 20 53 6c 6f 77 20 64 6f 77 6e      /* Slow down
d340: 20 69 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   if connections 
d350: 61 72 65 20 61 72 72 69 76 69 6e 67 20 74 6f 6f  are arriving too
d360: 20 66 61 73 74 20 2a 2f 0a 20 20 20 20 20 20 73   fast */.      s
d370: 6c 65 65 70 28 20 6e 63 68 69 6c 64 72 65 6e 2d  leep( nchildren-
d380: 4d 41 58 5f 50 41 52 41 4c 4c 45 4c 20 29 3b 0a  MAX_PARALLEL );.
d390: 20 20 20 20 7d 0a 20 20 20 20 64 65 6c 61 79 2e      }.    delay.
d3a0: 74 76 5f 73 65 63 20 3d 20 36 30 3b 0a 20 20 20  tv_sec = 60;.   
d3b0: 20 64 65 6c 61 79 2e 74 76 5f 75 73 65 63 20 3d   delay.tv_usec =
d3c0: 20 30 3b 0a 20 20 20 20 46 44 5f 5a 45 52 4f 28   0;.    FD_ZERO(
d3d0: 26 72 65 61 64 66 64 73 29 3b 0a 20 20 20 20 66  &readfds);.    f
d3e0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
d3f0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
d400: 20 6c 69 73 74 65 6e 65 72 5b 69 5d 3e 3d 30 20   listener[i]>=0 
d410: 29 3b 0a 20 20 20 20 20 20 46 44 5f 53 45 54 28  );.      FD_SET(
d420: 20 6c 69 73 74 65 6e 65 72 5b 69 5d 2c 20 26 72   listener[i], &r
d430: 65 61 64 66 64 73 29 3b 0a 20 20 20 20 20 20 69  eadfds);.      i
d440: 66 28 20 6c 69 73 74 65 6e 65 72 5b 69 5d 3e 6d  f( listener[i]>m
d450: 61 78 46 64 20 29 20 6d 61 78 46 64 20 3d 20 6c  axFd ) maxFd = l
d460: 69 73 74 65 6e 65 72 5b 69 5d 3b 0a 20 20 20 20  istener[i];.    
d470: 7d 0a 20 20 20 20 73 65 6c 65 63 74 28 20 6d 61  }.    select( ma
d480: 78 46 64 2b 31 2c 20 26 72 65 61 64 66 64 73 2c  xFd+1, &readfds,
d490: 20 30 2c 20 30 2c 20 26 64 65 6c 61 79 29 3b 0a   0, 0, &delay);.
d4a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
d4b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
d4c0: 28 20 46 44 5f 49 53 53 45 54 28 6c 69 73 74 65  ( FD_ISSET(liste
d4d0: 6e 65 72 5b 69 5d 2c 20 26 72 65 61 64 66 64 73  ner[i], &readfds
d4e0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e  ) ){.        len
d4f0: 61 64 64 72 20 3d 20 73 69 7a 65 6f 66 28 69 6e  addr = sizeof(in
d500: 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 63  addr);.        c
d510: 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 61 63 63 65  onnection = acce
d520: 70 74 28 6c 69 73 74 65 6e 65 72 5b 69 5d 2c 20  pt(listener[i], 
d530: 26 69 6e 61 64 64 72 2e 73 61 2c 20 26 6c 65 6e  &inaddr.sa, &len
d540: 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 69  addr);.        i
d550: 66 28 20 63 6f 6e 6e 65 63 74 69 6f 6e 3e 3d 30  f( connection>=0
d560: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68   ){.          ch
d570: 69 6c 64 20 3d 20 66 6f 72 6b 28 29 3b 0a 20 20  ild = fork();.  
d580: 20 20 20 20 20 20 20 20 69 66 28 20 63 68 69 6c          if( chil
d590: 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d!=0 ){.        
d5a0: 20 20 20 20 69 66 28 20 63 68 69 6c 64 3e 30 20      if( child>0 
d5b0: 29 20 6e 63 68 69 6c 64 72 65 6e 2b 2b 3b 0a 20  ) nchildren++;. 
d5c0: 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
d5d0: 28 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20 20  (connection);.  
d5e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 72 69            /* pri
d5f0: 6e 74 66 28 22 73 75 62 70 72 6f 63 65 73 73 20  ntf("subprocess 
d600: 25 64 20 73 74 61 72 74 65 64 2e 2e 2e 5c 6e 22  %d started...\n"
d610: 2c 20 63 68 69 6c 64 29 3b 20 66 66 6c 75 73 68  , child); fflush
d620: 28 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 20  (stdout); */.   
d630: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
d640: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 45            int nE
d650: 72 72 20 3d 20 30 2c 20 66 64 3b 0a 20 20 20 20  rr = 0, fd;.    
d660: 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 30 29          close(0)
d670: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 64  ;.            fd
d680: 20 3d 20 64 75 70 28 63 6f 6e 6e 65 63 74 69 6f   = dup(connectio
d690: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
d6a0: 69 66 28 20 66 64 21 3d 30 20 29 20 6e 45 72 72  if( fd!=0 ) nErr
d6b0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
d6c0: 63 6c 6f 73 65 28 31 29 3b 0a 20 20 20 20 20 20  close(1);.      
d6d0: 20 20 20 20 20 20 66 64 20 3d 20 64 75 70 28 63        fd = dup(c
d6e0: 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 20 20  onnection);.    
d6f0: 20 20 20 20 20 20 20 20 69 66 28 20 66 64 21 3d          if( fd!=
d700: 31 20 29 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  1 ) nErr++;.    
d710: 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 32 29          close(2)
d720: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 64  ;.            fd
d730: 20 3d 20 64 75 70 28 63 6f 6e 6e 65 63 74 69 6f   = dup(connectio
d740: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
d750: 69 66 28 20 66 64 21 3d 32 20 29 20 6e 45 72 72  if( fd!=2 ) nErr
d760: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
d770: 63 6c 6f 73 65 28 63 6f 6e 6e 65 63 74 69 6f 6e  close(connection
d780: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
d790: 65 74 75 72 6e 20 6e 45 72 72 3b 0a 20 20 20 20  eturn nErr;.    
d7a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d7b0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
d7c0: 2f 2a 20 42 75 72 79 20 64 65 61 64 20 63 68 69  /* Bury dead chi
d7d0: 6c 64 72 65 6e 20 2a 2f 0a 20 20 20 20 20 20 77  ldren */.      w
d7e0: 68 69 6c 65 28 20 28 63 68 69 6c 64 20 3d 20 77  hile( (child = w
d7f0: 61 69 74 70 69 64 28 30 2c 20 30 2c 20 57 4e 4f  aitpid(0, 0, WNO
d800: 48 41 4e 47 29 29 3e 30 20 29 7b 0a 20 20 20 20  HANG))>0 ){.    
d810: 20 20 20 20 2f 2a 20 70 72 69 6e 74 66 28 22 70      /* printf("p
d820: 72 6f 63 65 73 73 20 25 64 20 65 6e 64 73 5c 6e  rocess %d ends\n
d830: 22 2c 20 63 68 69 6c 64 29 3b 20 66 66 6c 75 73  ", child); fflus
d840: 68 28 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20  h(stdout); */.  
d850: 20 20 20 20 20 20 6e 63 68 69 6c 64 72 65 6e 2d        nchildren-
d860: 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  -;.      }.    }
d870: 0a 20 20 7d 0a 20 20 2f 2a 20 4e 4f 54 20 52 45  .  }.  /* NOT RE
d880: 41 43 48 45 44 20 2a 2f 20 20 0a 20 20 65 78 69  ACHED */  .  exi
d890: 74 28 31 29 3b 0a 7d 0a 0a 0a 69 6e 74 20 6d 61  t(1);.}...int ma
d8a0: 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61  in(int argc, cha
d8b0: 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74  r **argv){.  int
d8c0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
d8d0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
d8e0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 63 68 61 72  ounter */.  char
d8f0: 20 2a 7a 50 65 72 6d 55 73 65 72 20 3d 20 30 3b   *zPermUser = 0;
d900: 20 20 20 20 20 20 2f 2a 20 52 75 6e 20 64 61 65        /* Run dae
d910: 6d 6f 6e 20 77 69 74 68 20 74 68 69 73 20 75 73  mon with this us
d920: 65 72 27 73 20 70 65 72 6d 69 73 73 69 6f 6e 73  er's permissions
d930: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
d940: 20 2a 7a 50 6f 72 74 20 3d 20 30 3b 20 20 20 20   *zPort = 0;    
d950: 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 6e 20  /* Implement an 
d960: 48 54 54 50 20 73 65 72 76 65 72 20 70 72 6f 63  HTTP server proc
d970: 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  ess */.  int use
d980: 43 68 72 6f 6f 74 4a 61 69 6c 20 3d 20 31 3b 20  ChrootJail = 1; 
d990: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73     /* True to us
d9a0: 65 20 61 20 63 68 61 6e 67 65 2d 72 6f 6f 74 20  e a change-root 
d9b0: 6a 61 69 6c 20 2a 2f 0a 20 20 73 74 72 75 63 74  jail */.  struct
d9c0: 20 70 61 73 73 77 64 20 2a 70 77 64 20 3d 20 30   passwd *pwd = 0
d9d0: 3b 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69  ;   /* Informati
d9e0: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 75 73 65  on about the use
d9f0: 72 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 63 6f 72  r */..  /* Recor
da00: 64 20 74 68 65 20 74 69 6d 65 20 77 68 65 6e 20  d the time when 
da10: 70 72 6f 63 65 73 73 69 6e 67 20 62 65 67 69 6e  processing begin
da20: 73 2e 0a 20 20 2a 2f 0a 20 20 74 69 6d 65 28 26  s..  */.  time(&
da30: 62 65 67 69 6e 54 69 6d 65 29 3b 0a 0a 20 20 2f  beginTime);..  /
da40: 2a 20 50 61 72 73 65 20 63 6f 6d 6d 61 6e 64 2d  * Parse command-
da50: 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 73 0a 20  line arguments. 
da60: 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 61 72 67   */.  while( arg
da70: 63 3e 31 20 26 26 20 61 72 67 76 5b 31 5d 5b 30  c>1 && argv[1][0
da80: 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 63 68  ]=='-' ){.    ch
da90: 61 72 20 2a 7a 20 3d 20 61 72 67 76 5b 31 5d 3b  ar *z = argv[1];
daa0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 41 72 67 20  .    char *zArg 
dab0: 3d 20 61 72 67 63 3e 3d 33 20 3f 20 61 72 67 76  = argc>=3 ? argv
dac0: 5b 32 5d 20 3a 20 22 30 22 3b 0a 20 20 20 20 69  [2] : "0";.    i
dad0: 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20  f( z[0]=='-' && 
dae0: 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b  z[1]=='-' ) z++;
daf0: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
db00: 7a 2c 22 2d 75 73 65 72 22 29 3d 3d 30 20 29 7b  z,"-user")==0 ){
db10: 0a 20 20 20 20 20 20 7a 50 65 72 6d 55 73 65 72  .      zPermUser
db20: 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 7d 65 6c   = zArg;.    }el
db30: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
db40: 22 2d 72 6f 6f 74 22 29 3d 3d 30 20 29 7b 0a 20  "-root")==0 ){. 
db50: 20 20 20 20 20 7a 52 6f 6f 74 20 3d 20 7a 41 72       zRoot = zAr
db60: 67 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  g;.    }else if(
db70: 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6c 6f 67 66   strcmp(z,"-logf
db80: 69 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ile")==0 ){.    
db90: 20 20 7a 4c 6f 67 46 69 6c 65 20 3d 20 7a 41 72    zLogFile = zAr
dba0: 67 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  g;.    }else if(
dbb0: 20 73 74 72 63 6d 70 28 7a 2c 22 2d 68 74 74 70   strcmp(z,"-http
dbc0: 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  s")==0 ){.      
dbd0: 75 73 65 48 74 74 70 73 20 3d 20 61 74 6f 69 28  useHttps = atoi(
dbe0: 7a 41 72 67 29 3b 0a 20 20 20 20 20 20 7a 48 74  zArg);.      zHt
dbf0: 74 70 20 3d 20 75 73 65 48 74 74 70 73 20 3f 20  tp = useHttps ? 
dc00: 22 68 74 74 70 22 20 3a 20 22 68 74 74 70 73 22  "http" : "https"
dc10: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
dc20: 73 74 72 63 6d 70 28 7a 2c 20 22 2d 70 6f 72 74  strcmp(z, "-port
dc30: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  ")==0 ){.      z
dc40: 50 6f 72 74 20 3d 20 7a 41 72 67 3b 0a 20 20 20  Port = zArg;.   
dc50: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
dc60: 70 28 7a 2c 20 22 2d 6a 61 69 6c 22 29 3d 3d 30  p(z, "-jail")==0
dc70: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 74   ){.      if( at
dc80: 6f 69 28 7a 41 72 67 29 3d 3d 30 20 29 7b 0a 20  oi(zArg)==0 ){. 
dc90: 20 20 20 20 20 20 20 75 73 65 43 68 72 6f 6f 74         useChroot
dca0: 4a 61 69 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Jail = 0;.      
dcb0: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
dcc0: 73 74 72 63 6d 70 28 7a 2c 20 22 2d 64 65 62 75  strcmp(z, "-debu
dcd0: 67 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  g")==0 ){.      
dce0: 69 66 28 20 61 74 6f 69 28 7a 41 72 67 29 20 29  if( atoi(zArg) )
dcf0: 7b 0a 20 20 20 20 20 20 20 20 75 73 65 54 69 6d  {.        useTim
dd00: 65 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  eout = 0;.      
dd10: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
dd20: 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 5f     Malfunction(_
dd30: 5f 4c 49 4e 45 5f 5f 2c 20 22 75 6e 6b 6e 6f 77  _LINE__, "unknow
dd40: 6e 20 61 72 67 75 6d 65 6e 74 3a 20 5b 25 73 5d  n argument: [%s]
dd50: 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ", z);.    }.   
dd60: 20 61 72 67 76 20 2b 3d 20 32 3b 0a 20 20 20 20   argv += 2;.    
dd70: 61 72 67 63 20 2d 3d 20 32 3b 0a 20 20 7d 0a 20  argc -= 2;.  }. 
dd80: 20 69 66 28 20 7a 52 6f 6f 74 3d 3d 30 20 29 7b   if( zRoot==0 ){
dd90: 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e  .    Malfunction
dda0: 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 6e 6f 20 2d  (__LINE__, "no -
ddb0: 2d 72 6f 6f 74 20 73 70 65 63 69 66 69 65 64 22  -root specified"
ddc0: 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 43  );.  }.  .  /* C
ddd0: 68 61 6e 67 65 20 64 69 72 65 63 74 6f 72 69 65  hange directorie
dde0: 73 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 6f 66  s to the root of
ddf0: 20 74 68 65 20 48 54 54 50 20 66 69 6c 65 73 79   the HTTP filesy
de00: 73 74 65 6d 2e 20 20 54 68 65 6e 0a 20 20 2a 2a  stem.  Then.  **
de10: 20 63 72 65 61 74 65 20 61 20 63 68 72 6f 6f 74   create a chroot
de20: 20 6a 61 69 6c 20 74 68 65 72 65 2e 0a 20 20 2a   jail there..  *
de30: 2f 0a 20 20 69 66 28 20 63 68 64 69 72 28 7a 52  /.  if( chdir(zR
de40: 6f 6f 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 4d  oot)!=0 ){.    M
de50: 61 6c 66 75 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e  alfunction(__LIN
de60: 45 5f 5f 2c 20 22 63 61 6e 6e 6f 74 20 63 68 61  E__, "cannot cha
de70: 6e 67 65 20 74 6f 20 64 69 72 65 63 74 6f 72 79  nge to directory
de80: 20 5b 25 73 5d 22 2c 20 7a 52 6f 6f 74 29 3b 0a   [%s]", zRoot);.
de90: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 69 6e    }..  /* Get in
dea0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
deb0: 74 68 65 20 75 73 65 72 20 69 66 20 61 76 61 69  the user if avai
dec0: 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 7a  lable */.  if( z
ded0: 50 65 72 6d 55 73 65 72 20 29 20 70 77 64 20 3d  PermUser ) pwd =
dee0: 20 67 65 74 70 77 6e 61 6d 28 7a 50 65 72 6d 55   getpwnam(zPermU
def0: 73 65 72 29 3b 0a 0a 20 20 2f 2a 20 45 6e 74 65  ser);..  /* Ente
df00: 72 20 74 68 65 20 63 68 72 6f 6f 74 20 6a 61 69  r the chroot jai
df10: 6c 20 69 66 20 72 65 71 75 65 73 74 65 64 20 2a  l if requested *
df20: 2f 20 20 0a 20 20 69 66 28 20 7a 50 65 72 6d 55  /  .  if( zPermU
df30: 73 65 72 20 26 26 20 75 73 65 43 68 72 6f 6f 74  ser && useChroot
df40: 4a 61 69 6c 20 26 26 20 67 65 74 75 69 64 28 29  Jail && getuid()
df50: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 63  ==0 ){.    if( c
df60: 68 72 6f 6f 74 28 22 2e 22 29 3c 30 20 29 7b 0a  hroot(".")<0 ){.
df70: 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f        Malfunctio
df80: 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 75 6e 61  n(__LINE__, "una
df90: 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 63 68  ble to create ch
dfa0: 72 6f 6f 74 20 6a 61 69 6c 22 29 3b 0a 20 20 20  root jail");.   
dfb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 52   }else{.      zR
dfc0: 6f 6f 74 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a  oot = "";.    }.
dfd0: 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 74 69 76 61    }..  /* Activa
dfe0: 74 65 20 74 68 65 20 73 65 72 76 65 72 2c 20 69  te the server, i
dff0: 66 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20  f requested */. 
e000: 20 69 66 28 20 7a 50 6f 72 74 20 26 26 20 68 74   if( zPort && ht
e010: 74 70 5f 73 65 72 76 65 72 28 7a 50 6f 72 74 2c  tp_server(zPort,
e020: 20 30 29 20 29 7b 0a 20 20 20 20 4d 61 6c 66 75   0) ){.    Malfu
e030: 6e 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c  nction(__LINE__,
e040: 20 22 66 61 69 6c 65 64 20 74 6f 20 73 74 61 72   "failed to star
e050: 74 20 73 65 72 76 65 72 22 29 3b 0a 20 20 7d 0a  t server");.  }.
e060: 0a 20 20 2f 2a 20 44 72 6f 70 20 72 6f 6f 74 20  .  /* Drop root 
e070: 70 72 69 76 69 6c 65 67 65 73 2e 0a 20 20 2a 2f  privileges..  */
e080: 0a 20 20 69 66 28 20 7a 50 65 72 6d 55 73 65 72  .  if( zPermUser
e090: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 77 64 20   ){.    if( pwd 
e0a0: 29 7b 0a 20 20 20 20 20 20 73 65 74 67 69 64 28  ){.      setgid(
e0b0: 70 77 64 2d 3e 70 77 5f 67 69 64 29 3b 0a 20 20  pwd->pw_gid);.  
e0c0: 20 20 20 20 73 65 74 75 69 64 28 70 77 64 2d 3e      setuid(pwd->
e0d0: 70 77 5f 75 69 64 29 3b 0a 20 20 20 20 7d 65 6c  pw_uid);.    }el
e0e0: 73 65 7b 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e  se{.      Malfun
e0f0: 63 74 69 6f 6e 28 5f 5f 4c 49 4e 45 5f 5f 2c 20  ction(__LINE__, 
e100: 22 6e 6f 20 73 75 63 68 20 75 73 65 72 20 5b 25  "no such user [%
e110: 73 5d 22 2c 20 7a 50 65 72 6d 55 73 65 72 29 3b  s]", zPermUser);
e120: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
e130: 20 67 65 74 75 69 64 28 29 3d 3d 30 20 29 7b 0a   getuid()==0 ){.
e140: 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28      Malfunction(
e150: 5f 5f 4c 49 4e 45 5f 5f 2c 20 22 63 61 6e 6e 6f  __LINE__, "canno
e160: 74 20 72 75 6e 20 61 73 20 72 6f 6f 74 22 29 3b  t run as root");
e170: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 74  .  }..  /* Get t
e180: 68 65 20 49 50 20 61 64 64 72 65 73 73 20 66 72  he IP address fr
e190: 6f 6d 20 77 68 65 6e 20 74 68 65 20 72 65 71 75  om when the requ
e1a0: 65 73 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 20  est originates. 
e1b0: 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 61 64 64 72   */.  {.    addr
e1c0: 65 73 73 20 72 65 6d 6f 74 65 41 64 64 72 3b 0a  ess remoteAddr;.
e1d0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
e1e0: 20 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 72   size = sizeof(r
e1f0: 65 6d 6f 74 65 41 64 64 72 29 3b 0a 20 20 20 20  emoteAddr);.    
e200: 63 68 61 72 20 7a 48 6f 73 74 5b 4e 49 5f 4d 41  char zHost[NI_MA
e210: 58 48 4f 53 54 5d 3b 0a 20 20 20 20 69 66 28 20  XHOST];.    if( 
e220: 67 65 74 70 65 65 72 6e 61 6d 65 28 30 2c 20 26  getpeername(0, &
e230: 72 65 6d 6f 74 65 41 64 64 72 2e 73 61 2c 20 26  remoteAddr.sa, &
e240: 73 69 7a 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  size)>=0 ){.    
e250: 20 20 67 65 74 6e 61 6d 65 69 6e 66 6f 28 26 72    getnameinfo(&r
e260: 65 6d 6f 74 65 41 64 64 72 2e 73 61 2c 20 73 69  emoteAddr.sa, si
e270: 7a 65 2c 20 7a 48 6f 73 74 2c 20 73 69 7a 65 6f  ze, zHost, sizeo
e280: 66 28 7a 48 6f 73 74 29 2c 20 30 2c 20 30 2c 0a  f(zHost), 0, 0,.
e290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2a0: 20 20 4e 49 5f 4e 55 4d 45 52 49 43 48 4f 53 54    NI_NUMERICHOST
e2b0: 29 3b 0a 20 20 20 20 20 20 7a 52 65 6d 6f 74 65  );.      zRemote
e2c0: 41 64 64 72 20 3d 20 53 74 72 44 75 70 28 7a 48  Addr = StrDup(zH
e2d0: 6f 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ost);.    }.  }.
e2e0: 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68  .  /* Process th
e2f0: 65 20 69 6e 70 75 74 20 73 74 72 65 61 6d 20 2a  e input stream *
e300: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31  /.  for(i=0; i<1
e310: 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 72  00; i++){.    Pr
e320: 6f 63 65 73 73 4f 6e 65 52 65 71 75 65 73 74 28  ocessOneRequest(
e330: 30 29 3b 0a 20 20 7d 0a 20 20 50 72 6f 63 65 73  0);.  }.  Proces
e340: 73 4f 6e 65 52 65 71 75 65 73 74 28 31 29 3b 0a  sOneRequest(1);.
e350: 20 20 65 78 69 74 28 30 29 3b 0a 7d 0a             exit(0);.}.