Hex Artifact Content
Not logged in

Artifact 54f94155e2e54f0718c6b5b8c209d2fd02deb064:

File src/main.c part of check-in [1dbf332352] - Fix the HOST: header to use the original URL, not the proxy URL. by drh on 2008-05-05 19:08:43.

0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 32 30 30 36 20 44 2e 20 52 69 63 68  (c) 2006 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54  ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66  his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f  ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75  u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20  te it and/or.** 
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20  modify it under 
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
0090: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62   GNU General Pub
00a0: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 76  lic.** License v
00b0: 65 72 73 69 6f 6e 20 32 20 61 73 20 70 75 62 6c  ersion 2 as publ
00c0: 69 73 68 65 64 20 62 79 20 74 68 65 20 46 72 65  ished by the Fre
00d0: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
00e0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
00f0: 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73  s program is dis
0100: 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20  tributed in the 
0110: 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c  hope that it wil
0120: 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20  l be useful,.** 
0130: 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59 20  but WITHOUT ANY 
0140: 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75  WARRANTY; withou
0150: 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69  t even the impli
0160: 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a  ed warranty of.*
0170: 2a 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54  * MERCHANTABILIT
0180: 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52  Y or FITNESS FOR
0190: 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50 55   A PARTICULAR PU
01a0: 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65 20  RPOSE.  See the 
01b0: 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61 6c 20 50  GNU.** General P
01c0: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 6f  ublic License fo
01d0: 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a  r more details..
01e0: 2a 2a 20 0a 2a 2a 20 59 6f 75 20 73 68 6f 75 6c  ** .** You shoul
01f0: 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20  d have received 
0200: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e  a copy of the GN
0210: 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63  U General Public
0220: 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f 6e  .** License alon
0230: 67 20 77 69 74 68 20 74 68 69 73 20 6c 69 62 72  g with this libr
0240: 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72 69  ary; if not, wri
0250: 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72 65  te to the.** Fre
0260: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
0270: 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39 20  ation, Inc., 59 
0280: 54 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20 53  Temple Place - S
0290: 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f 73  uite 330,.** Bos
02a0: 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d 31  ton, MA  02111-1
02b0: 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a 20  307, USA..**.** 
02c0: 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69  Author contact i
02d0: 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20  nformation:.**  
02e0: 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a   drh@hwaci.com.*
02f0: 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68  *   http://www.h
0300: 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a  waci.com/drh/.**
0310: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
0320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0360: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 6f 64 75  .**.** This modu
0370: 6c 65 20 63 6f 64 65 73 20 74 68 65 20 6d 61 69  le codes the mai
0380: 6e 28 29 20 70 72 6f 63 65 64 75 72 65 20 74 68  n() procedure th
0390: 61 74 20 72 75 6e 73 20 66 69 72 73 74 20 77 68  at runs first wh
03a0: 65 6e 20 74 68 65 0a 2a 2a 20 70 72 6f 67 72 61  en the.** progra
03b0: 6d 20 69 73 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f  m is invoked..*/
03c0: 0a 23 69 6e 63 6c 75 64 65 20 22 63 6f 6e 66 69  .#include "confi
03d0: 67 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6d  g.h".#include "m
03e0: 61 69 6e 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  ain.h".#include 
03f0: 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c  <string.h>.#incl
0400: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 0a 23 69  ude <time.h>..#i
0410: 66 20 49 4e 54 45 52 46 41 43 45 0a 0a 2f 2a 0a  f INTERFACE../*.
0420: 2a 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  ** Number of ele
0430: 6d 65 6e 74 73 20 69 6e 20 61 6e 20 61 72 72 61  ments in an arra
0440: 79 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 63 6f 75  y.*/.#define cou
0450: 6e 74 28 58 29 20 20 28 73 69 7a 65 6f 66 28 58  nt(X)  (sizeof(X
0460: 29 2f 73 69 7a 65 6f 66 28 58 5b 30 5d 29 29 0a  )/sizeof(X[0])).
0470: 0a 2f 2a 0a 2a 2a 20 53 69 7a 65 20 6f 66 20 61  ./*.** Size of a
0480: 20 55 55 49 44 20 69 6e 20 63 68 61 72 61 63 74   UUID in charact
0490: 65 72 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55  ers.*/.#define U
04a0: 55 49 44 5f 53 49 5a 45 20 34 30 0a 0a 2f 2a 0a  UID_SIZE 40../*.
04b0: 2a 2a 20 41 6c 6c 20 67 6c 6f 62 61 6c 20 76 61  ** All global va
04c0: 72 69 61 62 6c 65 73 20 61 72 65 20 69 6e 20 74  riables are in t
04d0: 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  his structure..*
04e0: 2f 0a 73 74 72 75 63 74 20 47 6c 6f 62 61 6c 20  /.struct Global 
04f0: 7b 0a 20 20 69 6e 74 20 61 72 67 63 3b 20 63 68  {.  int argc; ch
0500: 61 72 20 2a 2a 61 72 67 76 3b 20 20 2f 2a 20 43  ar **argv;  /* C
0510: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75  ommand-line argu
0520: 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70 72 6f  ments to the pro
0530: 67 72 61 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 73  gram */.  int is
0540: 43 6f 6e 73 74 3b 20 20 20 20 20 20 20 20 20 20  Const;          
0550: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
0560: 20 6f 75 74 70 75 74 20 69 73 20 75 6e 63 68 61   output is uncha
0570: 6e 67 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74  nging */.  sqlit
0580: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
0590: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63     /* The connec
05a0: 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tion to the data
05b0: 62 61 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63  bases */.  int c
05c0: 6f 6e 66 69 67 4f 70 65 6e 3b 20 20 20 20 20 20  onfigOpen;      
05d0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
05e0: 65 20 63 6f 6e 66 69 67 20 64 61 74 61 62 61 73  e config databas
05f0: 65 20 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20 6c  e is open */.  l
0600: 6f 6e 67 20 6c 6f 6e 67 20 69 6e 74 20 6e 6f 77  ong long int now
0610: 3b 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64  ;      /* Second
0620: 73 20 73 69 6e 63 65 20 31 39 37 30 20 2a 2f 0a  s since 1970 */.
0630: 20 20 69 6e 74 20 72 65 70 6f 73 69 74 6f 72 79    int repository
0640: 4f 70 65 6e 3b 20 20 20 20 20 2f 2a 20 54 72 75  Open;     /* Tru
0650: 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20 72 65  e if the main re
0660: 70 6f 73 69 74 6f 72 79 20 64 61 74 61 62 61 73  pository databas
0670: 65 20 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20 63  e is open */.  c
0680: 68 61 72 20 2a 7a 52 65 70 6f 73 69 74 6f 72 79  har *zRepository
0690: 4e 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f  Name;  /* Name o
06a0: 66 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72 79  f the repository
06b0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
06c0: 6e 74 20 6c 6f 63 61 6c 4f 70 65 6e 3b 20 20 20  nt localOpen;   
06d0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
06e0: 66 20 74 68 65 20 6c 6f 63 61 6c 20 64 61 74 61  f the local data
06f0: 62 61 73 65 20 69 73 20 6f 70 65 6e 20 2a 2f 0a  base is open */.
0700: 20 20 63 68 61 72 20 2a 7a 4c 6f 63 61 6c 52 6f    char *zLocalRo
0710: 6f 74 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ot;       /* The
0720: 20 64 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 69   directory holdi
0730: 6e 67 20 74 68 65 20 20 6c 6f 63 61 6c 20 64 61  ng the  local da
0740: 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
0750: 6d 69 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20  minPrefix;      
0760: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0770: 20 64 69 67 69 74 73 20 6e 65 65 64 65 64 20 66   digits needed f
0780: 6f 72 20 61 20 64 69 73 74 69 6e 63 74 20 55 55  or a distinct UU
0790: 49 44 20 2a 2f 0a 20 20 69 6e 74 20 66 53 71 6c  ID */.  int fSql
07a0: 54 72 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Trace;          
07b0: 2f 2a 20 54 72 75 65 20 69 66 20 2d 73 71 6c 74  /* True if -sqlt
07c0: 72 61 63 65 20 66 6c 61 67 20 69 73 20 70 72 65  race flag is pre
07d0: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 66 53  sent */.  int fS
07e0: 71 6c 50 72 69 6e 74 3b 20 20 20 20 20 20 20 20  qlPrint;        
07f0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d 73 71    /* True if -sq
0800: 6c 70 72 69 6e 74 20 66 6c 61 67 20 69 73 20 70  lprint flag is p
0810: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
0820: 66 48 74 74 70 54 72 61 63 65 3b 20 20 20 20 20  fHttpTrace;     
0830: 20 20 20 20 2f 2a 20 54 72 61 63 65 20 6f 75 74      /* Trace out
0840: 62 6f 75 6e 64 20 48 54 54 50 20 72 65 71 75 65  bound HTTP reque
0850: 73 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  sts */.  char *z
0860: 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  Path;           
0870: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 77 65 62 70   /* Name of webp
0880: 61 67 65 20 62 65 69 6e 67 20 73 65 72 76 65 64  age being served
0890: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78 74   */.  char *zExt
08a0: 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ra;           /*
08b0: 20 45 78 74 72 61 20 70 61 74 68 20 69 6e 66 6f   Extra path info
08c0: 72 6d 61 74 69 6f 6e 20 70 61 73 74 20 74 68 65  rmation past the
08d0: 20 77 65 62 70 61 67 65 20 6e 61 6d 65 20 2a 2f   webpage name */
08e0: 0a 20 20 63 68 61 72 20 2a 7a 42 61 73 65 55 52  .  char *zBaseUR
08f0: 4c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75  L;         /* Fu
0900: 6c 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 55  ll text of the U
0910: 52 4c 20 62 65 69 6e 67 20 73 65 72 76 65 64 20  RL being served 
0920: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 6f 70 3b  */.  char *zTop;
0930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0940: 50 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79  Parent directory
0950: 20 6f 66 20 7a 50 61 74 68 20 2a 2f 0a 20 20 63   of zPath */.  c
0960: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6e 74  onst char *zCont
0970: 65 6e 74 54 79 70 65 3b 20 20 2f 2a 20 54 68 65  entType;  /* The
0980: 20 63 6f 6e 74 65 6e 74 20 74 79 70 65 20 6f 66   content type of
0990: 20 74 68 65 20 69 6e 70 75 74 20 48 54 54 50 20   the input HTTP 
09a0: 72 65 71 75 65 73 74 20 2a 2f 0a 20 20 69 6e 74  request */.  int
09b0: 20 69 45 72 72 50 72 69 6f 72 69 74 79 3b 20 20   iErrPriority;  
09c0: 20 20 20 20 20 2f 2a 20 50 72 69 6f 72 69 74 79       /* Priority
09d0: 20 6f 66 20 63 75 72 72 65 6e 74 20 65 72 72 6f   of current erro
09e0: 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 63  r message */.  c
09f0: 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 20 20 20  har *zErrMsg;   
0a00: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
0a10: 66 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  f an error messa
0a20: 67 65 20 2a 2f 0a 20 20 42 6c 6f 62 20 63 67 69  ge */.  Blob cgi
0a30: 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  In;             
0a40: 2f 2a 20 49 6e 70 75 74 20 74 6f 20 61 6e 20 78  /* Input to an x
0a50: 66 65 72 20 77 77 77 20 6d 65 74 68 6f 64 20 2a  fer www method *
0a60: 2f 0a 20 20 69 6e 74 20 63 67 69 50 61 6e 69 63  /.  int cgiPanic
0a70: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ;           /* W
0a80: 72 69 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61  rite error messa
0a90: 67 65 73 20 74 6f 20 43 47 49 20 2a 2f 0a 20 20  ges to CGI */.  
0aa0: 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  Th_Interp *inter
0ab0: 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 54  p;      /* The T
0ac0: 48 31 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a  H1 interpreter *
0ad0: 2f 0a 0a 20 20 69 6e 74 20 2a 61 43 6f 6d 6d 69  /..  int *aCommi
0ae0: 74 46 69 6c 65 3b 0a 0a 20 20 69 6e 74 20 75 72  tFile;..  int ur
0af0: 6c 49 73 46 69 6c 65 3b 20 20 20 20 20 20 20 20  lIsFile;        
0b00: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 22    /* True if a "
0b10: 66 69 6c 65 3a 22 20 75 72 6c 20 2a 2f 0a 20 20  file:" url */.  
0b20: 63 68 61 72 20 2a 75 72 6c 4e 61 6d 65 3b 20 20  char *urlName;  
0b30: 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 73 74 6e          /* Hostn
0b40: 61 6d 65 20 66 6f 72 20 68 74 74 70 3a 20 6f 72  ame for http: or
0b50: 20 66 69 6c 65 6e 61 6d 65 20 66 6f 72 20 66 69   filename for fi
0b60: 6c 65 3a 20 2a 2f 0a 20 20 63 68 61 72 20 2a 75  le: */.  char *u
0b70: 72 6c 48 6f 73 74 6e 61 6d 65 3b 20 20 20 20 20  rlHostname;     
0b80: 20 2f 2a 20 54 68 65 20 48 4f 53 54 3a 20 70 61   /* The HOST: pa
0b90: 72 61 6d 65 74 65 72 20 6f 6e 20 68 74 74 70 20  rameter on http 
0ba0: 68 65 61 64 65 72 73 20 2a 2f 0a 20 20 69 6e 74  headers */.  int
0bb0: 20 75 72 6c 50 6f 72 74 3b 20 20 20 20 20 20 20   urlPort;       
0bc0: 20 20 20 20 20 2f 2a 20 54 43 50 20 70 6f 72 74       /* TCP port
0bd0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 68 74 74 70   number for http
0be0: 3a 20 2a 2f 0a 20 20 63 68 61 72 20 2a 75 72 6c  : */.  char *url
0bf0: 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 2f  Path;          /
0c00: 2a 20 50 61 74 68 6e 61 6d 65 20 66 6f 72 20 68  * Pathname for h
0c10: 74 74 70 3a 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ttp: */.  char *
0c20: 75 72 6c 55 73 65 72 3b 20 20 20 20 20 20 20 20  urlUser;        
0c30: 20 20 2f 2a 20 55 73 65 72 20 69 64 20 66 6f 72    /* User id for
0c40: 20 68 74 74 70 3a 20 2a 2f 0a 20 20 63 68 61 72   http: */.  char
0c50: 20 2a 75 72 6c 50 61 73 73 77 64 3b 20 20 20 20   *urlPasswd;    
0c60: 20 20 20 20 2f 2a 20 50 61 73 73 77 6f 72 64 20      /* Password 
0c70: 66 6f 72 20 68 74 74 70 3a 20 2a 2f 0a 20 20 63  for http: */.  c
0c80: 68 61 72 20 2a 75 72 6c 43 61 6e 6f 6e 69 63 61  har *urlCanonica
0c90: 6c 3b 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69  l;     /* Canoni
0ca0: 63 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69  cal representati
0cb0: 6f 6e 20 6f 66 20 74 68 65 20 55 52 4c 20 2a 2f  on of the URL */
0cc0: 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
0cd0: 7a 4c 6f 67 69 6e 3b 20 20 20 20 20 2f 2a 20 4c  zLogin;     /* L
0ce0: 6f 67 69 6e 20 6e 61 6d 65 2e 20 20 22 22 20 69  ogin name.  "" i
0cf0: 66 20 6e 6f 74 20 6c 6f 67 67 65 64 20 69 6e 2e  f not logged in.
0d00: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 50 73 77 64   */.  int noPswd
0d10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
0d20: 20 4c 6f 67 67 65 64 20 69 6e 20 77 69 74 68 6f   Logged in witho
0d30: 75 74 20 70 61 73 73 77 6f 72 64 20 28 6f 6e 20  ut password (on 
0d40: 31 32 37 2e 30 2e 30 2e 31 29 20 2a 2f 0a 20 20  127.0.0.1) */.  
0d50: 69 6e 74 20 75 73 65 72 55 69 64 3b 20 20 20 20  int userUid;    
0d60: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
0d70: 65 72 20 75 73 65 72 20 69 64 20 2a 2f 0a 0a 20  er user id */.. 
0d80: 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
0d90: 75 73 65 64 20 74 6f 20 70 6f 70 75 6c 61 74 65  used to populate
0da0: 20 74 68 65 20 52 43 56 46 52 4f 4d 20 74 61 62   the RCVFROM tab
0db0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 76 69  le */.  int rcvi
0dc0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
0dd0: 2f 2a 20 54 68 65 20 72 63 76 69 64 2e 20 20 30  /* The rcvid.  0
0de0: 20 69 66 20 6e 6f 74 20 79 65 74 20 64 65 66 69   if not yet defi
0df0: 6e 65 64 2e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ned. */.  char *
0e00: 7a 49 70 41 64 64 72 3b 20 20 20 20 20 20 20 20  zIpAddr;        
0e10: 20 20 2f 2a 20 54 68 65 20 72 65 6d 6f 74 65 20    /* The remote 
0e20: 49 50 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  IP address */.  
0e30: 63 68 61 72 20 2a 7a 4e 6f 6e 63 65 3b 20 20 20  char *zNonce;   
0e40: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
0e50: 6f 6e 63 65 20 75 73 65 64 20 66 6f 72 20 6c 6f  once used for lo
0e60: 67 69 6e 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 70  gin */.  .  /* p
0e70: 65 72 6d 69 73 73 69 6f 6e 73 20 75 73 65 64 20  ermissions used 
0e80: 62 79 20 74 68 65 20 73 65 72 76 65 72 20 2a 2f  by the server */
0e90: 0a 20 20 69 6e 74 20 6f 6b 53 65 74 75 70 3b 20  .  int okSetup; 
0ea0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 3a             /* s:
0eb0: 20 75 73 65 20 53 65 74 75 70 20 73 63 72 65 65   use Setup scree
0ec0: 6e 73 20 6f 6e 20 77 65 62 20 69 6e 74 65 72 66  ns on web interf
0ed0: 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b 41  ace */.  int okA
0ee0: 64 6d 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  dmin;           
0ef0: 20 2f 2a 20 61 3a 20 61 64 6d 69 6e 69 73 74 72   /* a: administr
0f00: 61 74 69 76 65 20 70 65 72 6d 69 73 73 69 6f 6e  ative permission
0f10: 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b 44 65 6c 65   */.  int okDele
0f20: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te;           /*
0f30: 20 64 3a 20 64 65 6c 65 74 65 20 77 69 6b 69 20   d: delete wiki 
0f40: 6f 72 20 74 69 63 6b 65 74 73 20 2a 2f 0a 20 20  or tickets */.  
0f50: 69 6e 74 20 6f 6b 50 61 73 73 77 6f 72 64 3b 20  int okPassword; 
0f60: 20 20 20 20 20 20 20 20 2f 2a 20 70 3a 20 63 68          /* p: ch
0f70: 61 6e 67 65 20 70 61 73 73 77 6f 72 64 20 2a 2f  ange password */
0f80: 0a 20 20 69 6e 74 20 6f 6b 51 75 65 72 79 3b 20  .  int okQuery; 
0f90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 71 3a             /* q:
0fa0: 20 63 72 65 61 74 65 20 6e 65 77 20 72 65 70 6f   create new repo
0fb0: 72 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b 57  rts */.  int okW
0fc0: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
0fd0: 20 2f 2a 20 69 3a 20 78 66 65 72 20 69 6e 62 6f   /* i: xfer inbo
0fe0: 75 6e 64 2e 20 63 68 65 63 6b 69 6e 20 2a 2f 0a  und. checkin */.
0ff0: 20 20 69 6e 74 20 6f 6b 52 65 61 64 3b 20 20 20    int okRead;   
1000: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 3a 20            /* o: 
1010: 78 66 65 72 20 6f 75 74 62 6f 75 6e 64 2e 20 63  xfer outbound. c
1020: 68 65 63 6b 6f 75 74 20 2a 2f 0a 20 20 69 6e 74  heckout */.  int
1030: 20 6f 6b 48 69 73 74 6f 72 79 3b 20 20 20 20 20   okHistory;     
1040: 20 20 20 20 20 2f 2a 20 68 3a 20 61 63 63 65 73       /* h: acces
1050: 73 20 68 69 73 74 6f 72 69 63 61 6c 20 69 6e 66  s historical inf
1060: 6f 72 6d 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 69  ormation. */.  i
1070: 6e 74 20 6f 6b 43 6c 6f 6e 65 3b 20 20 20 20 20  nt okClone;     
1080: 20 20 20 20 20 20 20 2f 2a 20 67 3a 20 63 6c 6f         /* g: clo
1090: 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b 52 64  ne */.  int okRd
10a0: 57 69 6b 69 3b 20 20 20 20 20 20 20 20 20 20 20  Wiki;           
10b0: 2f 2a 20 6a 3a 20 76 69 65 77 20 77 69 6b 69 20  /* j: view wiki 
10c0: 76 69 61 20 77 65 62 20 2a 2f 0a 20 20 69 6e 74  via web */.  int
10d0: 20 6f 6b 4e 65 77 57 69 6b 69 3b 20 20 20 20 20   okNewWiki;     
10e0: 20 20 20 20 20 2f 2a 20 66 3a 20 63 72 65 61 74       /* f: creat
10f0: 65 20 6e 65 77 20 77 69 6b 69 20 76 69 61 20 77  e new wiki via w
1100: 65 62 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b 41 70  eb */.  int okAp
1110: 6e 64 57 69 6b 69 3b 20 20 20 20 20 20 20 20 20  ndWiki;         
1120: 2f 2a 20 6d 3a 20 61 70 70 65 6e 64 20 74 6f 20  /* m: append to 
1130: 77 69 6b 69 20 76 69 61 20 77 65 62 20 2a 2f 0a  wiki via web */.
1140: 20 20 69 6e 74 20 6f 6b 57 72 57 69 6b 69 3b 20    int okWrWiki; 
1150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6b 3a 20            /* k: 
1160: 65 64 69 74 20 77 69 6b 69 20 76 69 61 20 77 65  edit wiki via we
1170: 62 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b 52 64 54  b */.  int okRdT
1180: 6b 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  kt;            /
1190: 2a 20 72 3a 20 76 69 65 77 20 74 69 63 6b 65 74  * r: view ticket
11a0: 73 20 76 69 61 20 77 65 62 20 2a 2f 0a 20 20 69  s via web */.  i
11b0: 6e 74 20 6f 6b 4e 65 77 54 6b 74 3b 20 20 20 20  nt okNewTkt;    
11c0: 20 20 20 20 20 20 20 2f 2a 20 6e 3a 20 63 72 65         /* n: cre
11d0: 61 74 65 20 6e 65 77 20 74 69 63 6b 65 74 73 20  ate new tickets 
11e0: 2a 2f 0a 20 20 69 6e 74 20 6f 6b 41 70 6e 64 54  */.  int okApndT
11f0: 6b 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  kt;          /* 
1200: 63 3a 20 61 70 70 65 6e 64 20 74 6f 20 74 69 63  c: append to tic
1210: 6b 65 74 73 20 76 69 61 20 74 68 65 20 77 65 62  kets via the web
1220: 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b 57 72 54 6b   */.  int okWrTk
1230: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
1240: 20 77 3a 20 6d 61 6b 65 20 63 68 61 6e 67 65 73   w: make changes
1250: 20 74 6f 20 74 69 63 6b 65 74 73 20 76 69 61 20   to tickets via 
1260: 77 65 62 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b 52  web */.  int okR
1270: 64 41 64 64 72 3b 20 20 20 20 20 20 20 20 20 20  dAddr;          
1280: 20 2f 2a 20 65 3a 20 72 65 61 64 20 65 6d 61 69   /* e: read emai
1290: 6c 20 61 64 64 72 65 73 73 65 73 20 6f 6e 20 74  l addresses on t
12a0: 69 63 6b 65 74 73 20 2a 2f 0a 0a 20 20 46 49 4c  ickets */..  FIL
12b0: 45 20 2a 66 44 65 62 75 67 3b 20 20 20 20 20 20  E *fDebug;      
12c0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 64 65       /* Write de
12d0: 62 75 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  bug information 
12e0: 68 65 72 65 2c 20 69 66 20 74 68 65 20 66 69 6c  here, if the fil
12f0: 65 20 65 78 69 73 74 73 20 2a 2f 0a 7d 3b 0a 0a  e exists */.};..
1300: 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 20 66 6f 72 20  /*.** Macro for 
1310: 64 65 62 75 67 67 69 6e 67 3a 0a 2a 2f 0a 23 64  debugging:.*/.#d
1320: 65 66 69 6e 65 20 43 47 49 44 45 42 55 47 28 58  efine CGIDEBUG(X
1330: 29 20 20 69 66 28 20 67 2e 66 44 65 62 75 67 20  )  if( g.fDebug 
1340: 29 20 63 67 69 5f 64 65 62 75 67 20 58 0a 0a 23  ) cgi_debug X..#
1350: 65 6e 64 69 66 0a 0a 47 6c 6f 62 61 6c 20 67 3b  endif..Global g;
1360: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ../*.** The tabl
1370: 65 20 6f 66 20 77 65 62 20 70 61 67 65 73 20 73  e of web pages s
1380: 75 70 70 6f 72 74 65 64 20 62 79 20 74 68 69 73  upported by this
1390: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 69 73 20   application is 
13a0: 67 65 6e 65 72 61 74 65 64 20 0a 2a 2a 20 61 75  generated .** au
13b0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 74  tomatically by t
13c0: 68 65 20 22 6d 6b 69 6e 64 65 78 22 20 70 72 6f  he "mkindex" pro
13d0: 67 72 61 6d 20 61 6e 64 20 77 72 69 74 74 65 6e  gram and written
13e0: 20 69 6e 74 6f 20 61 20 66 69 6c 65 0a 2a 2a 20   into a file.** 
13f0: 6e 61 6d 65 64 20 22 70 61 67 65 5f 69 6e 64 65  named "page_inde
1400: 78 2e 68 22 2e 20 20 57 65 20 69 6e 63 6c 75 64  x.h".  We includ
1410: 65 20 74 68 61 74 20 66 69 6c 65 20 68 65 72 65  e that file here
1420: 20 74 6f 20 67 65 74 20 61 63 63 65 73 73 0a 2a   to get access.*
1430: 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 2e 0a  * to the table..
1440: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 67  */.#include "pag
1450: 65 5f 69 6e 64 65 78 2e 68 22 0a 0a 2f 2a 0a 2a  e_index.h"../*.*
1460: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 66  * Search for a f
1470: 75 6e 63 74 69 6f 6e 20 77 68 6f 73 65 20 6e 61  unction whose na
1480: 6d 65 20 6d 61 74 63 68 65 73 20 7a 4e 61 6d 65  me matches zName
1490: 2e 20 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74  .  Write a point
14a0: 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 66 75  er to.** that fu
14b0: 6e 63 74 69 6f 6e 20 69 6e 74 6f 20 2a 70 78 46  nction into *pxF
14c0: 75 6e 63 20 61 6e 64 20 72 65 74 75 72 6e 20 30  unc and return 0
14d0: 2e 20 20 49 66 20 6e 6f 20 6d 61 74 63 68 20 69  .  If no match i
14e0: 73 20 66 6f 75 6e 64 2c 0a 2a 2a 20 72 65 74 75  s found,.** retu
14f0: 72 6e 20 31 2e 20 20 49 66 20 74 68 65 20 63 6f  rn 1.  If the co
1500: 6d 6d 61 6e 64 20 69 73 20 61 6d 62 69 67 75 6f  mmand is ambiguo
1510: 75 73 20 72 65 74 75 72 6e 20 32 3b 0a 2a 2a 0a  us return 2;.**.
1520: 2a 2a 20 54 68 65 20 4e 61 6d 65 4d 61 70 20 73  ** The NameMap s
1530: 74 72 75 63 74 75 72 65 20 61 6e 64 20 74 68 65  tructure and the
1540: 20 74 61 62 6c 65 73 20 77 65 20 61 72 65 20 73   tables we are s
1550: 65 61 72 63 68 69 6e 67 20 61 67 61 69 6e 73 74  earching against
1560: 20 61 72 65 0a 2a 2a 20 64 65 66 69 6e 65 64 20   are.** defined 
1570: 69 6e 20 74 68 65 20 70 61 67 65 5f 69 6e 64 65  in the page_inde
1580: 78 2e 68 20 68 65 61 64 65 72 20 66 69 6c 65 20  x.h header file 
1590: 77 68 69 63 68 20 69 73 20 61 75 74 6f 6d 61 74  which is automat
15a0: 69 63 61 6c 6c 79 0a 2a 2a 20 67 65 6e 65 72 61  ically.** genera
15b0: 74 65 64 20 62 79 20 6d 6b 69 6e 64 65 78 2e 63  ted by mkindex.c
15c0: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 73 74 61   program..*/.sta
15d0: 74 69 63 20 69 6e 74 20 6e 61 6d 65 5f 73 65 61  tic int name_sea
15e0: 72 63 68 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  rch(.  const cha
15f0: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
1600: 2f 2a 20 54 68 65 20 6e 61 6d 65 20 77 65 20 61  /* The name we a
1610: 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a  re looking for *
1620: 2f 0a 20 20 63 6f 6e 73 74 20 4e 61 6d 65 4d 61  /.  const NameMa
1630: 70 20 2a 61 4d 61 70 2c 20 20 20 20 20 2f 2a 20  p *aMap,     /* 
1640: 53 65 61 72 63 68 20 69 6e 20 74 68 69 73 20 61  Search in this a
1650: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  rray */.  int nM
1660: 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ap,             
1670: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1680: 73 6c 6f 74 73 20 69 6e 20 61 4d 61 70 5b 5d 20  slots in aMap[] 
1690: 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 6e 64 65 78  */.  int *pIndex
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16b0: 20 4f 55 54 3a 20 54 68 65 20 69 6e 64 65 78 20   OUT: The index 
16c0: 69 6e 20 61 4d 61 70 5b 5d 20 6f 66 20 74 68 65  in aMap[] of the
16d0: 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69   match */.){.  i
16e0: 6e 74 20 75 70 72 2c 20 6c 77 72 2c 20 63 6e 74  nt upr, lwr, cnt
16f0: 2c 20 6d 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 20  , m, i;.  int n 
1700: 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b  = strlen(zName);
1710: 0a 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 75 70  .  lwr = 0;.  up
1720: 72 20 3d 20 6e 4d 61 70 2d 31 3b 0a 20 20 77 68  r = nMap-1;.  wh
1730: 69 6c 65 28 20 6c 77 72 3c 3d 75 70 72 20 29 7b  ile( lwr<=upr ){
1740: 0a 20 20 20 20 69 6e 74 20 6d 69 64 2c 20 63 3b  .    int mid, c;
1750: 0a 20 20 20 20 6d 69 64 20 3d 20 28 75 70 72 2b  .    mid = (upr+
1760: 6c 77 72 29 2f 32 3b 0a 20 20 20 20 63 20 3d 20  lwr)/2;.    c = 
1770: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 4d  strcmp(zName, aM
1780: 61 70 5b 6d 69 64 5d 2e 7a 4e 61 6d 65 29 3b 0a  ap[mid].zName);.
1790: 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a      if( c==0 ){.
17a0: 20 20 20 20 20 20 2a 70 49 6e 64 65 78 20 3d 20        *pIndex = 
17b0: 6d 69 64 3b 0a 20 20 20 20 20 20 72 65 74 75 72  mid;.      retur
17c0: 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  n 0;.    }else i
17d0: 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( c<0 ){.      
17e0: 75 70 72 20 3d 20 6d 69 64 20 2d 20 31 3b 0a 20  upr = mid - 1;. 
17f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1800: 6c 77 72 20 3d 20 6d 69 64 20 2b 20 31 3b 0a 20  lwr = mid + 1;. 
1810: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 6d     }.  }.  for(m
1820: 3d 63 6e 74 3d 30 2c 20 69 3d 75 70 72 2d 32 3b  =cnt=0, i=upr-2;
1830: 20 69 3c 3d 75 70 72 2b 33 20 26 26 20 69 3c 6e   i<=upr+3 && i<n
1840: 4d 61 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Map; i++){.    i
1850: 66 28 20 69 3c 30 20 29 20 63 6f 6e 74 69 6e 75  f( i<0 ) continu
1860: 65 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63  e;.    if( strnc
1870: 6d 70 28 7a 4e 61 6d 65 2c 20 61 4d 61 70 5b 69  mp(zName, aMap[i
1880: 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3d 3d 30 20 29  ].zName, n)==0 )
1890: 7b 0a 20 20 20 20 20 20 6d 20 3d 20 69 3b 0a 20  {.      m = i;. 
18a0: 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
18b0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 63 6e 74 3d  }.  }.  if( cnt=
18c0: 3d 31 20 29 7b 0a 20 20 20 20 2a 70 49 6e 64 65  =1 ){.    *pInde
18d0: 78 20 3d 20 6d 3b 0a 20 20 20 20 72 65 74 75 72  x = m;.    retur
18e0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
18f0: 6e 20 31 2b 28 63 6e 74 3e 31 29 3b 0a 7d 0a 0a  n 1+(cnt>1);.}..
1900: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 63  ./*.** This proc
1910: 65 64 75 72 65 20 72 75 6e 73 20 66 69 72 73 74  edure runs first
1920: 2e 0a 2a 2f 0a 69 6e 74 20 6d 61 69 6e 28 69 6e  ..*/.int main(in
1930: 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61  t argc, char **a
1940: 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  rgv){.  const ch
1950: 61 72 20 2a 7a 43 6d 64 4e 61 6d 65 3b 0a 20 20  ar *zCmdName;.  
1960: 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 72  int idx;.  int r
1970: 63 3b 0a 0a 20 20 67 2e 6e 6f 77 20 3d 20 74 69  c;..  g.now = ti
1980: 6d 65 28 30 29 3b 0a 20 20 67 2e 61 72 67 63 20  me(0);.  g.argc 
1990: 3d 20 61 72 67 63 3b 0a 20 20 67 2e 61 72 67 76  = argc;.  g.argv
19a0: 20 3d 20 61 72 67 76 3b 0a 20 20 69 66 28 20 67   = argv;.  if( g
19b0: 65 74 65 6e 76 28 22 47 41 54 45 57 41 59 5f 49  etenv("GATEWAY_I
19c0: 4e 54 45 52 46 41 43 45 22 29 21 3d 30 20 29 7b  NTERFACE")!=0 ){
19d0: 0a 20 20 20 20 7a 43 6d 64 4e 61 6d 65 20 3d 20  .    zCmdName = 
19e0: 22 63 67 69 22 3b 0a 20 20 7d 65 6c 73 65 20 69  "cgi";.  }else i
19f0: 66 28 20 61 72 67 63 3c 32 20 29 7b 0a 20 20 20  f( argc<2 ){.   
1a00: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1a10: 20 22 55 73 61 67 65 3a 20 25 73 20 43 4f 4d 4d   "Usage: %s COMM
1a20: 41 4e 44 20 2e 2e 2e 5c 6e 22 2c 20 61 72 67 76  AND ...\n", argv
1a30: 5b 30 5d 29 3b 0a 20 20 20 20 65 78 69 74 28 31  [0]);.    exit(1
1a40: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1a50: 67 2e 66 53 71 6c 54 72 61 63 65 20 3d 20 66 69  g.fSqlTrace = fi
1a60: 6e 64 5f 6f 70 74 69 6f 6e 28 22 73 71 6c 74 72  nd_option("sqltr
1a70: 61 63 65 22 2c 20 30 2c 20 30 29 21 3d 30 3b 0a  ace", 0, 0)!=0;.
1a80: 20 20 20 20 67 2e 66 53 71 6c 50 72 69 6e 74 20      g.fSqlPrint 
1a90: 3d 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 73  = find_option("s
1aa0: 71 6c 70 72 69 6e 74 22 2c 20 30 2c 20 30 29 21  qlprint", 0, 0)!
1ab0: 3d 30 3b 0a 20 20 20 20 67 2e 66 48 74 74 70 54  =0;.    g.fHttpT
1ac0: 72 61 63 65 20 3d 20 66 69 6e 64 5f 6f 70 74 69  race = find_opti
1ad0: 6f 6e 28 22 68 74 74 70 74 72 61 63 65 22 2c 20  on("httptrace", 
1ae0: 30 2c 20 30 29 21 3d 30 3b 0a 20 20 20 20 67 2e  0, 0)!=0;.    g.
1af0: 7a 4c 6f 67 69 6e 20 3d 20 66 69 6e 64 5f 6f 70  zLogin = find_op
1b00: 74 69 6f 6e 28 22 75 73 65 72 22 2c 20 22 55 22  tion("user", "U"
1b10: 2c 20 31 29 3b 0a 20 20 20 20 7a 43 6d 64 4e 61  , 1);.    zCmdNa
1b20: 6d 65 20 3d 20 61 72 67 76 5b 31 5d 3b 0a 20 20  me = argv[1];.  
1b30: 7d 0a 20 20 72 63 20 3d 20 6e 61 6d 65 5f 73 65  }.  rc = name_se
1b40: 61 72 63 68 28 7a 43 6d 64 4e 61 6d 65 2c 20 61  arch(zCmdName, a
1b50: 43 6f 6d 6d 61 6e 64 2c 20 63 6f 75 6e 74 28 61  Command, count(a
1b60: 43 6f 6d 6d 61 6e 64 29 2c 20 26 69 64 78 29 3b  Command), &idx);
1b70: 0a 20 20 69 66 28 20 72 63 3d 3d 31 20 29 7b 0a  .  if( rc==1 ){.
1b80: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1b90: 72 72 2c 22 25 73 3a 20 75 6e 6b 6e 6f 77 6e 20  rr,"%s: unknown 
1ba0: 63 6f 6d 6d 61 6e 64 3a 20 25 73 5c 6e 22 0a 20  command: %s\n". 
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc0: 20 20 22 25 73 3a 20 75 73 65 20 5c 22 68 65 6c    "%s: use \"hel
1bd0: 70 5c 22 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66  p\" for more inf
1be0: 6f 72 6d 61 74 69 6f 6e 5c 6e 22 2c 0a 20 20 20  ormation\n",.   
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c00: 61 72 67 76 5b 30 5d 2c 20 7a 43 6d 64 4e 61 6d  argv[0], zCmdNam
1c10: 65 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  e, argv[0]);.   
1c20: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c   return 1;.  }el
1c30: 73 65 20 69 66 28 20 72 63 3d 3d 32 20 29 7b 0a  se if( rc==2 ){.
1c40: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1c50: 72 72 2c 22 25 73 3a 20 61 6d 62 69 67 75 6f 75  rr,"%s: ambiguou
1c60: 73 20 63 6f 6d 6d 61 6e 64 20 70 72 65 66 69 78  s command prefix
1c70: 3a 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 20 20  : %s\n".        
1c80: 20 20 20 20 20 20 20 20 20 20 20 22 25 73 3a 20             "%s: 
1c90: 75 73 65 20 5c 22 68 65 6c 70 5c 22 20 66 6f 72  use \"help\" for
1ca0: 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f   more informatio
1cb0: 6e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  n\n",.          
1cc0: 20 20 20 20 20 20 20 20 20 61 72 67 76 5b 30 5d           argv[0]
1cd0: 2c 20 7a 43 6d 64 4e 61 6d 65 2c 20 61 72 67 76  , zCmdName, argv
1ce0: 5b 30 5d 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  [0]);.    return
1cf0: 20 31 3b 0a 20 20 7d 0a 20 20 61 43 6f 6d 6d 61   1;.  }.  aComma
1d00: 6e 64 5b 69 64 78 5d 2e 78 46 75 6e 63 28 29 3b  nd[idx].xFunc();
1d10: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1d20: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65  /*.** Print an e
1d30: 72 72 6f 72 20 6d 65 73 73 61 67 65 2c 20 72 6f  rror message, ro
1d40: 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74 61 62  llback all datab
1d50: 61 73 65 73 2c 20 61 6e 64 20 71 75 69 74 2e 0a  ases, and quit..
1d60: 2a 2f 0a 76 6f 69 64 20 66 6f 73 73 69 6c 5f 70  */.void fossil_p
1d70: 61 6e 69 63 28 63 6f 6e 73 74 20 63 68 61 72 20  anic(const char 
1d80: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
1d90: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 76 61 5f    char *z;.  va_
1da0: 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74  list ap;.  va_st
1db0: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
1dc0: 3b 0a 20 20 7a 20 3d 20 76 6d 70 72 69 6e 74 66  ;.  z = vmprintf
1dd0: 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20  (zFormat, ap);. 
1de0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69   va_end(ap);.  i
1df0: 66 28 20 67 2e 63 67 69 50 61 6e 69 63 20 29 7b  f( g.cgiPanic ){
1e00: 0a 20 20 20 20 67 2e 63 67 69 50 61 6e 69 63 20  .    g.cgiPanic 
1e10: 3d 20 30 3b 0a 20 20 20 20 63 67 69 5f 70 72 69  = 0;.    cgi_pri
1e20: 6e 74 66 28 22 3c 70 3e 3c 66 6f 6e 74 20 63 6f  ntf("<p><font co
1e30: 6c 6f 72 3d 5c 22 72 65 64 5c 22 3e 25 68 3c 2f  lor=\"red\">%h</
1e40: 66 6f 6e 74 3e 3c 2f 70 3e 22 2c 20 7a 29 3b 0a  font></p>", z);.
1e50: 20 20 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72      style_footer
1e60: 28 29 3b 0a 20 20 20 20 63 67 69 5f 72 65 70 6c  ();.    cgi_repl
1e70: 79 28 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  y();.  }else{.  
1e80: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
1e90: 2c 20 22 25 73 3a 20 25 73 5c 6e 22 2c 20 67 2e  , "%s: %s\n", g.
1ea0: 61 72 67 76 5b 30 5d 2c 20 7a 29 3b 0a 20 20 7d  argv[0], z);.  }
1eb0: 0a 20 20 64 62 5f 66 6f 72 63 65 5f 72 6f 6c 6c  .  db_force_roll
1ec0: 62 61 63 6b 28 29 3b 0a 20 20 65 78 69 74 28 31  back();.  exit(1
1ed0: 29 3b 0a 7d 0a 76 6f 69 64 20 66 6f 73 73 69 6c  );.}.void fossil
1ee0: 5f 66 61 74 61 6c 28 63 6f 6e 73 74 20 63 68 61  _fatal(const cha
1ef0: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
1f00: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 76  {.  char *z;.  v
1f10: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f  a_list ap;.  va_
1f20: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
1f30: 74 29 3b 0a 20 20 7a 20 3d 20 76 6d 70 72 69 6e  t);.  z = vmprin
1f40: 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  tf(zFormat, ap);
1f50: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
1f60: 20 69 66 28 20 67 2e 63 67 69 50 61 6e 69 63 20   if( g.cgiPanic 
1f70: 29 7b 0a 20 20 20 20 67 2e 63 67 69 50 61 6e 69  ){.    g.cgiPani
1f80: 63 20 3d 20 30 3b 0a 20 20 20 20 63 67 69 5f 70  c = 0;.    cgi_p
1f90: 72 69 6e 74 66 28 22 3c 70 3e 3c 66 6f 6e 74 20  rintf("<p><font 
1fa0: 63 6f 6c 6f 72 3d 5c 22 72 65 64 5c 22 3e 25 68  color=\"red\">%h
1fb0: 3c 2f 66 6f 6e 74 3e 3c 2f 70 3e 22 2c 20 7a 29  </font></p>", z)
1fc0: 3b 0a 20 20 20 20 73 74 79 6c 65 5f 66 6f 6f 74  ;.    style_foot
1fd0: 65 72 28 29 3b 0a 20 20 20 20 63 67 69 5f 72 65  er();.    cgi_re
1fe0: 70 6c 79 28 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ply();.  }else{.
1ff0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
2000: 72 72 2c 20 22 25 73 3a 20 25 73 5c 6e 22 2c 20  rr, "%s: %s\n", 
2010: 67 2e 61 72 67 76 5b 30 5d 2c 20 7a 29 3b 0a 20  g.argv[0], z);. 
2020: 20 7d 0a 20 20 64 62 5f 66 6f 72 63 65 5f 72 6f   }.  db_force_ro
2030: 6c 6c 62 61 63 6b 28 29 3b 0a 20 20 65 78 69 74  llback();.  exit
2040: 28 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  (1);.}../*.** Pr
2050: 69 6e 74 20 61 20 75 73 61 67 65 20 63 6f 6d 6d  int a usage comm
2060: 65 6e 74 20 61 6e 64 20 71 75 69 74 0a 2a 2f 0a  ent and quit.*/.
2070: 76 6f 69 64 20 75 73 61 67 65 28 63 6f 6e 73 74  void usage(const
2080: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 29 7b   char *zFormat){
2090: 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  .  fprintf(stder
20a0: 72 2c 20 22 55 73 61 67 65 3a 20 25 73 20 25 73  r, "Usage: %s %s
20b0: 20 25 73 5c 6e 22 2c 20 67 2e 61 72 67 76 5b 30   %s\n", g.argv[0
20c0: 5d 2c 20 67 2e 61 72 67 76 5b 31 5d 2c 20 7a 46  ], g.argv[1], zF
20d0: 6f 72 6d 61 74 29 3b 0a 20 20 65 78 69 74 28 31  ormat);.  exit(1
20e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  );.}../*.** Remo
20f0: 76 65 20 6e 20 65 6c 65 6d 65 6e 74 73 20 66 72  ve n elements fr
2100: 6f 6d 20 67 2e 61 72 67 76 20 62 65 67 69 6e 6e  om g.argv beginn
2110: 69 6e 67 20 77 69 74 68 20 74 68 65 20 69 2d 74  ing with the i-t
2120: 68 20 65 6c 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  h element..*/.vo
2130: 69 64 20 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 61  id remove_from_a
2140: 72 67 76 28 69 6e 74 20 69 2c 20 69 6e 74 20 6e  rgv(int i, int n
2150: 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f  ){.  int j;.  fo
2160: 72 28 6a 3d 69 2b 6e 3b 20 6a 3c 67 2e 61 72 67  r(j=i+n; j<g.arg
2170: 63 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20  c; i++, j++){.  
2180: 20 20 67 2e 61 72 67 76 5b 69 5d 20 3d 20 67 2e    g.argv[i] = g.
2190: 61 72 67 76 5b 6a 5d 3b 0a 20 20 7d 0a 20 20 67  argv[j];.  }.  g
21a0: 2e 61 72 67 63 20 3d 20 69 3b 0a 7d 0a 0a 0a 2f  .argc = i;.}.../
21b0: 2a 0a 2a 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 20  *.** Look for a 
21c0: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74  command-line opt
21d0: 69 6f 6e 2e 20 20 49 66 20 70 72 65 73 65 6e 74  ion.  If present
21e0: 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  , return a point
21f0: 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55  er..** Return NU
2200: 4c 4c 20 69 66 20 6d 69 73 73 69 6e 67 2e 0a 2a  LL if missing..*
2210: 2a 0a 2a 2a 20 68 61 73 41 72 67 3d 3d 30 20 6d  *.** hasArg==0 m
2220: 65 61 6e 73 20 74 68 65 20 6f 70 74 69 6f 6e 20  eans the option 
2230: 69 73 20 61 20 66 6c 61 67 2e 20 20 49 74 20 69  is a flag.  It i
2240: 73 20 65 69 74 68 65 72 20 70 72 65 73 65 6e 74  s either present
2250: 20 6f 72 20 6e 6f 74 2e 0a 2a 2a 20 68 61 73 41   or not..** hasA
2260: 72 67 3d 3d 31 20 6d 65 61 6e 73 20 74 68 65 20  rg==1 means the 
2270: 6f 70 74 69 6f 6e 20 68 61 73 20 61 6e 20 61 72  option has an ar
2280: 67 75 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  gument.  Return 
2290: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
22a0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  .** argument..*/
22b0: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6e  .const char *fin
22c0: 64 5f 6f 70 74 69 6f 6e 28 63 6f 6e 73 74 20 63  d_option(const c
22d0: 68 61 72 20 2a 7a 4c 6f 6e 67 2c 20 63 6f 6e 73  har *zLong, cons
22e0: 74 20 63 68 61 72 20 2a 7a 53 68 6f 72 74 2c 20  t char *zShort, 
22f0: 69 6e 74 20 68 61 73 41 72 67 29 7b 0a 20 20 69  int hasArg){.  i
2300: 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt i;.  const ch
2310: 61 72 20 2a 7a 52 65 74 75 72 6e 20 3d 20 30 3b  ar *zReturn = 0;
2320: 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 41 72  .  assert( hasAr
2330: 67 3d 3d 30 20 7c 7c 20 68 61 73 41 72 67 3d 3d  g==0 || hasArg==
2340: 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 32 3b 20  1 );.  for(i=2; 
2350: 69 3c 67 2e 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  i<g.argc; i++){.
2360: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 67 2e      char *z = g.
2370: 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 69 66 28  argv[i];.    if(
2380: 20 7a 5b 30 5d 21 3d 27 2d 27 20 29 20 63 6f 6e   z[0]!='-' ) con
2390: 74 69 6e 75 65 3b 0a 20 20 20 20 7a 2b 2b 3b 0a  tinue;.    z++;.
23a0: 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d      if( z[0]=='-
23b0: 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  ' ){.      if( z
23c0: 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [1]==0 ){.      
23d0: 20 20 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 61 72    remove_from_ar
23e0: 67 76 28 69 2c 20 31 29 3b 0a 20 20 20 20 20 20  gv(i, 1);.      
23f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2400: 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20  .      z++;.    
2410: 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  }.    if( strcmp
2420: 28 7a 2c 7a 4c 6f 6e 67 29 3d 3d 30 20 7c 7c 20  (z,zLong)==0 || 
2430: 28 7a 53 68 6f 72 74 21 3d 30 20 26 26 20 73 74  (zShort!=0 && st
2440: 72 63 6d 70 28 7a 2c 7a 53 68 6f 72 74 29 3d 3d  rcmp(z,zShort)==
2450: 30 29 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 74  0) ){.      zRet
2460: 75 72 6e 20 3d 20 67 2e 61 72 67 76 5b 69 2b 68  urn = g.argv[i+h
2470: 61 73 41 72 67 5d 3b 0a 20 20 20 20 20 20 72 65  asArg];.      re
2480: 6d 6f 76 65 5f 66 72 6f 6d 5f 61 72 67 76 28 69  move_from_argv(i
2490: 2c 20 31 2b 68 61 73 41 72 67 29 3b 0a 20 20 20  , 1+hasArg);.   
24a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
24b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65    }.  return zRe
24c0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56  turn;.}../*.** V
24d0: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 72 65  erify that there
24e0: 20 61 72 65 20 6e 6f 20 75 6e 70 72 6f 63 65 73   are no unproces
24f0: 73 65 64 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  sed command-line
2500: 20 6f 70 74 69 6f 6e 73 2e 20 20 49 66 0a 2a 2a   options.  If.**
2510: 20 41 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20 63   Any remaining c
2520: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75  ommand-line argu
2530: 6d 65 6e 74 20 62 65 67 69 6e 73 20 77 69 74 68  ment begins with
2540: 20 22 2d 22 20 70 72 69 6e 74 0a 2a 2a 20 61 6e   "-" print.** an
2550: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
2560: 6e 64 20 71 75 69 74 2e 0a 2a 2f 0a 76 6f 69 64  nd quit..*/.void
2570: 20 76 65 72 69 66 79 5f 61 6c 6c 5f 6f 70 74 69   verify_all_opti
2580: 6f 6e 73 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74  ons(void){.  int
2590: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   i;.  for(i=1; i
25a0: 3c 67 2e 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20  <g.argc; i++){. 
25b0: 20 20 20 69 66 28 20 67 2e 61 72 67 76 5b 69 5d     if( g.argv[i]
25c0: 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [0]=='-' ){.    
25d0: 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22    fossil_fatal("
25e0: 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 63 6f 6d  unrecognized com
25f0: 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand-line option
2600: 3a 20 25 73 22 2c 20 67 2e 61 72 67 76 5b 69 5d  : %s", g.argv[i]
2610: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
2620: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69  /*.** Print a li
2630: 73 74 20 6f 66 20 77 6f 72 64 73 20 69 6e 20 6d  st of words in m
2640: 75 6c 74 69 70 6c 65 20 63 6f 6c 75 6d 6e 73 2e  ultiple columns.
2650: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2660: 6d 75 6c 74 69 5f 63 6f 6c 75 6d 6e 5f 6c 69 73  multi_column_lis
2670: 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61  t(const char **a
2680: 7a 57 6f 72 64 2c 20 69 6e 74 20 6e 57 6f 72 64  zWord, int nWord
2690: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6c  ){.  int i, j, l
26a0: 65 6e 3b 0a 20 20 69 6e 74 20 6d 78 4c 65 6e 20  en;.  int mxLen 
26b0: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  = 0;.  int nCol;
26c0: 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 0a 20 20 66  .  int nRow;.  f
26d0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 57 6f 72 64 3b  or(i=0; i<nWord;
26e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6e 20 3d   i++){.    len =
26f0: 20 73 74 72 6c 65 6e 28 61 7a 57 6f 72 64 5b 69   strlen(azWord[i
2700: 5d 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e  ]);.    if( len>
2710: 6d 78 4c 65 6e 20 29 20 6d 78 4c 65 6e 20 3d 20  mxLen ) mxLen = 
2720: 6c 65 6e 3b 0a 20 20 7d 0a 20 20 6e 43 6f 6c 20  len;.  }.  nCol 
2730: 3d 20 38 30 2f 28 6d 78 4c 65 6e 2b 32 29 3b 0a  = 80/(mxLen+2);.
2740: 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20    if( nCol==0 ) 
2750: 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 6e 52 6f 77  nCol = 1;.  nRow
2760: 20 3d 20 28 6e 57 6f 72 64 20 2b 20 6e 43 6f 6c   = (nWord + nCol
2770: 20 2d 20 31 29 2f 6e 43 6f 6c 3b 0a 20 20 66 6f   - 1)/nCol;.  fo
2780: 72 28 69 3d 30 3b 20 69 3c 6e 52 6f 77 3b 20 69  r(i=0; i<nRow; i
2790: 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
27a0: 68 61 72 20 2a 7a 53 70 61 63 65 72 20 3d 20 22  har *zSpacer = "
27b0: 22 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20  ";.    for(j=i; 
27c0: 6a 3c 6e 57 6f 72 64 3b 20 6a 2b 3d 6e 52 6f 77  j<nWord; j+=nRow
27d0: 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  ){.      printf(
27e0: 22 25 73 25 2d 2a 73 22 2c 20 7a 53 70 61 63 65  "%s%-*s", zSpace
27f0: 72 2c 20 6d 78 4c 65 6e 2c 20 61 7a 57 6f 72 64  r, mxLen, azWord
2800: 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 7a 53 70 61  [j]);.      zSpa
2810: 63 65 72 20 3d 20 22 20 20 22 3b 0a 20 20 20 20  cer = "  ";.    
2820: 7d 0a 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e  }.    printf("\n
2830: 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ");.  }.}../*.**
2840: 20 43 4f 4d 20 4d 41 4e 44 3a 20 63 6f 6d 6d 61   COM MAND: comma
2850: 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  nds.**.** Usage:
2860: 20 25 66 6f 73 73 69 6c 20 63 6f 6d 6d 61 6e 64   %fossil command
2870: 73 0a 2a 2a 20 4c 69 73 74 20 61 6c 6c 20 73 75  s.** List all su
2880: 70 70 6f 72 74 65 64 20 63 6f 6d 6d 61 6e 64 73  pported commands
2890: 2e 0a 2a 2f 0a 76 6f 69 64 20 63 6d 64 5f 63 6d  ..*/.void cmd_cm
28a0: 64 5f 6c 69 73 74 28 76 6f 69 64 29 7b 0a 20 20  d_list(void){.  
28b0: 69 6e 74 20 69 2c 20 6e 43 6d 64 3b 0a 20 20 63  int i, nCmd;.  c
28c0: 6f 6e 73 74 20 63 68 61 72 20 2a 61 43 6d 64 5b  onst char *aCmd[
28d0: 63 6f 75 6e 74 28 61 43 6f 6d 6d 61 6e 64 29 5d  count(aCommand)]
28e0: 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 6d 64 3d 30  ;.  for(i=nCmd=0
28f0: 3b 20 69 3c 63 6f 75 6e 74 28 61 43 6f 6d 6d 61  ; i<count(aComma
2900: 6e 64 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nd); i++){.    i
2910: 66 28 20 73 74 72 6e 63 6d 70 28 61 43 6f 6d 6d  f( strncmp(aComm
2920: 61 6e 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 22 74 65  and[i].zName,"te
2930: 73 74 22 2c 34 29 3d 3d 30 20 29 20 63 6f 6e 74  st",4)==0 ) cont
2940: 69 6e 75 65 3b 0a 20 20 20 20 2f 2a 20 69 66 28  inue;.    /* if(
2950: 20 73 74 72 63 6d 70 28 61 43 6f 6d 6d 61 6e 64   strcmp(aCommand
2960: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 67 2e 61 72 67  [i].zName, g.arg
2970: 76 5b 31 5d 29 3d 3d 30 20 29 20 63 6f 6e 74 69  v[1])==0 ) conti
2980: 6e 75 65 3b 20 2a 2f 0a 20 20 20 20 61 43 6d 64  nue; */.    aCmd
2990: 5b 6e 43 6d 64 2b 2b 5d 20 3d 20 61 43 6f 6d 6d  [nCmd++] = aComm
29a0: 61 6e 64 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  and[i].zName;.  
29b0: 7d 0a 20 20 6d 75 6c 74 69 5f 63 6f 6c 75 6d 6e  }.  multi_column
29c0: 5f 6c 69 73 74 28 61 43 6d 64 2c 20 6e 43 6d 64  _list(aCmd, nCmd
29d0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d  );.}../*.** COMM
29e0: 41 4e 44 3a 20 74 65 73 74 2d 63 6f 6d 6d 61 6e  AND: test-comman
29f0: 64 73 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  ds.**.** Usage: 
2a00: 25 66 6f 73 73 69 6c 20 74 65 73 74 2d 63 6f 6d  %fossil test-com
2a10: 6d 61 6e 64 73 0a 2a 2a 20 4c 69 73 74 20 61 6c  mands.** List al
2a20: 6c 20 63 6f 6d 6d 61 6e 64 73 20 75 73 65 64 20  l commands used 
2a30: 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
2a40: 64 65 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a 76 6f  debugging..*/.vo
2a50: 69 64 20 63 6d 64 5f 74 65 73 74 5f 63 6d 64 5f  id cmd_test_cmd_
2a60: 6c 69 73 74 28 76 6f 69 64 29 7b 0a 20 20 69 6e  list(void){.  in
2a70: 74 20 69 2c 20 6e 43 6d 64 3b 0a 20 20 63 6f 6e  t i, nCmd;.  con
2a80: 73 74 20 63 68 61 72 20 2a 61 43 6d 64 5b 63 6f  st char *aCmd[co
2a90: 75 6e 74 28 61 43 6f 6d 6d 61 6e 64 29 5d 3b 0a  unt(aCommand)];.
2aa0: 20 20 66 6f 72 28 69 3d 6e 43 6d 64 3d 30 3b 20    for(i=nCmd=0; 
2ab0: 69 3c 63 6f 75 6e 74 28 61 43 6f 6d 6d 61 6e 64  i<count(aCommand
2ac0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
2ad0: 20 73 74 72 6e 63 6d 70 28 61 43 6f 6d 6d 61 6e   strncmp(aComman
2ae0: 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 22 74 65 73 74  d[i].zName,"test
2af0: 22 2c 34 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  ",4)!=0 ) contin
2b00: 75 65 3b 0a 20 20 20 20 2f 2a 20 69 66 28 20 73  ue;.    /* if( s
2b10: 74 72 63 6d 70 28 61 43 6f 6d 6d 61 6e 64 5b 69  trcmp(aCommand[i
2b20: 5d 2e 7a 4e 61 6d 65 2c 20 67 2e 61 72 67 76 5b  ].zName, g.argv[
2b30: 31 5d 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  1])==0 ) continu
2b40: 65 3b 20 2a 2f 0a 20 20 20 20 61 43 6d 64 5b 6e  e; */.    aCmd[n
2b50: 43 6d 64 2b 2b 5d 20 3d 20 61 43 6f 6d 6d 61 6e  Cmd++] = aComman
2b60: 64 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a  d[i].zName;.  }.
2b70: 20 20 6d 75 6c 74 69 5f 63 6f 6c 75 6d 6e 5f 6c    multi_column_l
2b80: 69 73 74 28 61 43 6d 64 2c 20 6e 43 6d 64 29 3b  ist(aCmd, nCmd);
2b90: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41  .}.../*.** COMMA
2ba0: 4e 44 3a 20 68 65 6c 70 0a 2a 2a 0a 2a 2a 20 55  ND: help.**.** U
2bb0: 73 61 67 65 3a 20 25 66 6f 73 73 69 6c 20 68 65  sage: %fossil he
2bc0: 6c 70 20 43 4f 4d 4d 41 4e 44 0a 2a 2a 20 44 69  lp COMMAND.** Di
2bd0: 73 70 6c 61 79 20 69 6e 66 6f 72 6d 61 74 69 6f  splay informatio
2be0: 6e 20 6f 6e 20 68 6f 77 20 74 6f 20 75 73 65 20  n on how to use 
2bf0: 43 4f 4d 4d 41 4e 44 0a 2a 2f 0a 76 6f 69 64 20  COMMAND.*/.void 
2c00: 68 65 6c 70 5f 63 6d 64 28 76 6f 69 64 29 7b 0a  help_cmd(void){.
2c10: 20 20 69 6e 74 20 72 63 2c 20 69 64 78 3b 0a 20    int rc, idx;. 
2c20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
2c30: 20 20 69 66 28 20 67 2e 61 72 67 63 21 3d 33 20    if( g.argc!=3 
2c40: 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 55  ){.    printf("U
2c50: 73 61 67 65 3a 20 25 73 20 68 65 6c 70 20 43 4f  sage: %s help CO
2c60: 4d 4d 41 4e 44 2e 5c 6e 41 76 61 69 6c 61 62 6c  MMAND.\nAvailabl
2c70: 65 20 43 4f 4d 4d 41 4e 44 73 3a 5c 6e 22 2c 20  e COMMANDs:\n", 
2c80: 67 2e 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  g.argv[0]);.    
2c90: 63 6d 64 5f 63 6d 64 5f 6c 69 73 74 28 29 3b 0a  cmd_cmd_list();.
2ca0: 20 20 20 20 70 72 69 6e 74 66 28 22 54 68 69 73      printf("This
2cb0: 20 69 73 20 66 6f 73 73 69 6c 20 76 65 72 73 69   is fossil versi
2cc0: 6f 6e 20 22 20 4d 41 4e 49 46 45 53 54 5f 56 45  on " MANIFEST_VE
2cd0: 52 53 49 4f 4e 20 22 20 22 20 4d 41 4e 49 46 45  RSION " " MANIFE
2ce0: 53 54 5f 44 41 54 45 20 22 5c 6e 22 29 3b 0a 20  ST_DATE "\n");. 
2cf0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
2d00: 20 72 63 20 3d 20 6e 61 6d 65 5f 73 65 61 72 63   rc = name_searc
2d10: 68 28 67 2e 61 72 67 76 5b 32 5d 2c 20 61 43 6f  h(g.argv[2], aCo
2d20: 6d 6d 61 6e 64 2c 20 63 6f 75 6e 74 28 61 43 6f  mmand, count(aCo
2d30: 6d 6d 61 6e 64 29 2c 20 26 69 64 78 29 3b 0a 20  mmand), &idx);. 
2d40: 20 69 66 28 20 72 63 3d 3d 31 20 29 7b 0a 20 20   if( rc==1 ){.  
2d50: 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22    fossil_fatal("
2d60: 75 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64 3a  unknown command:
2d70: 20 25 73 22 2c 20 67 2e 61 72 67 76 5b 32 5d 29   %s", g.argv[2])
2d80: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63  ;.  }else if( rc
2d90: 3d 3d 32 20 29 7b 0a 20 20 20 20 66 6f 73 73 69  ==2 ){.    fossi
2da0: 6c 5f 66 61 74 61 6c 28 22 61 6d 62 69 67 75 6f  l_fatal("ambiguo
2db0: 75 73 20 63 6f 6d 6d 61 6e 64 20 70 72 65 66 69  us command prefi
2dc0: 78 3a 20 25 73 22 2c 20 67 2e 61 72 67 76 5b 32  x: %s", g.argv[2
2dd0: 5d 29 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 61 43  ]);.  }.  z = aC
2de0: 6d 64 48 65 6c 70 5b 69 64 78 5d 3b 0a 20 20 69  mdHelp[idx];.  i
2df0: 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 66  f( z==0 ){.    f
2e00: 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 6e 6f 20  ossil_fatal("no 
2e10: 68 65 6c 70 20 61 76 61 69 6c 61 62 6c 65 20 66  help available f
2e20: 6f 72 20 74 68 65 20 25 73 20 63 6f 6d 6d 61 6e  or the %s comman
2e30: 64 22 2c 0a 20 20 20 20 20 20 20 61 43 6f 6d 6d  d",.       aComm
2e40: 61 6e 64 5b 69 64 78 5d 2e 7a 4e 61 6d 65 29 3b  and[idx].zName);
2e50: 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 2a 7a  .  }.  while( *z
2e60: 20 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d   ){.    if( *z==
2e70: 27 25 27 20 26 26 20 73 74 72 6e 63 6d 70 28 7a  '%' && strncmp(z
2e80: 2c 20 22 25 66 6f 73 73 69 6c 22 2c 20 37 29 3d  , "%fossil", 7)=
2e90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e  =0 ){.      prin
2ea0: 74 66 28 22 25 73 22 2c 20 67 2e 61 72 67 76 5b  tf("%s", g.argv[
2eb0: 30 5d 29 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  0]);.      z += 
2ec0: 37 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  7;.    }else{.  
2ed0: 20 20 20 20 70 75 74 63 68 61 72 28 2a 7a 29 3b      putchar(*z);
2ee0: 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20  .      z++;.    
2ef0: 7d 0a 20 20 7d 0a 20 20 70 75 74 63 68 61 72 28  }.  }.  putchar(
2f00: 27 5c 6e 27 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  '\n');.}../*.** 
2f10: 53 65 74 20 74 68 65 20 67 2e 7a 42 61 73 65 55  Set the g.zBaseU
2f20: 52 4c 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20  RL value to the 
2f30: 66 75 6c 6c 20 55 52 4c 20 66 6f 72 20 74 68 65  full URL for the
2f40: 20 74 6f 70 6c 65 76 65 6c 20 6f 66 0a 2a 2a 20   toplevel of.** 
2f50: 74 68 65 20 66 6f 73 73 69 6c 20 74 72 65 65 2e  the fossil tree.
2f60: 20 20 53 65 74 20 67 2e 7a 48 6f 6d 65 55 52 4c    Set g.zHomeURL
2f70: 20 74 6f 20 67 2e 7a 42 61 73 65 55 52 4c 20 77   to g.zBaseURL w
2f80: 69 74 68 6f 75 74 20 74 68 65 0a 2a 2a 20 6c 65  ithout the.** le
2f90: 61 64 69 6e 67 20 22 68 74 74 70 3a 2f 2f 22 20  ading "http://" 
2fa0: 61 6e 64 20 74 68 65 20 68 6f 73 74 20 61 6e 64  and the host and
2fb0: 20 70 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73   port..*/.void s
2fc0: 65 74 5f 62 61 73 65 5f 75 72 6c 28 76 6f 69 64  et_base_url(void
2fd0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  ){.  int i;.  co
2fe0: 6e 73 74 20 63 68 61 72 20 2a 7a 48 6f 73 74 20  nst char *zHost 
2ff0: 3d 20 50 44 28 22 48 54 54 50 5f 48 4f 53 54 22  = PD("HTTP_HOST"
3000: 2c 22 22 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68  ,"");.  const ch
3010: 61 72 20 2a 7a 4d 6f 64 65 20 3d 20 50 44 28 22  ar *zMode = PD("
3020: 48 54 54 50 53 22 2c 22 6f 66 66 22 29 3b 0a 20  HTTPS","off");. 
3030: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 75   const char *zCu
3040: 72 20 3d 20 50 44 28 22 52 45 51 55 45 53 54 5f  r = PD("REQUEST_
3050: 55 52 49 22 2c 22 2f 22 29 3b 0a 0a 20 20 66 6f  URI","/");..  fo
3060: 72 28 69 3d 30 3b 20 7a 43 75 72 5b 69 5d 20 26  r(i=0; zCur[i] &
3070: 26 20 7a 43 75 72 5b 69 5d 21 3d 27 3f 27 20 26  & zCur[i]!='?' &
3080: 26 20 7a 43 75 72 5b 69 5d 21 3d 27 23 27 3b 20  & zCur[i]!='#'; 
3090: 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 67 2e 7a  i++){}.  if( g.z
30a0: 45 78 74 72 61 20 29 7b 0a 20 20 20 20 2f 2a 20  Extra ){.    /* 
30b0: 53 6b 69 70 20 74 6f 20 73 74 61 72 74 20 6f 66  Skip to start of
30c0: 20 65 78 74 72 61 20 73 74 75 66 66 2c 20 74 68   extra stuff, th
30d0: 65 6e 20 70 61 73 73 20 6f 76 65 72 20 61 6e 79  en pass over any
30e0: 20 2f 27 73 20 74 68 61 74 20 6d 69 67 68 74 0a   /'s that might.
30f0: 20 20 20 20 2a 2a 20 68 61 76 65 20 73 65 70 61      ** have sepa
3100: 72 61 74 65 64 20 74 68 65 20 64 6f 63 75 6d 65  rated the docume
3110: 6e 74 20 72 6f 6f 74 20 66 72 6f 6d 20 74 68 65  nt root from the
3120: 20 65 78 74 72 61 20 73 74 75 66 66 2e 20 54 68   extra stuff. Th
3130: 69 73 0a 20 20 20 20 2a 2a 20 65 6e 73 75 72 65  is.    ** ensure
3140: 73 20 74 68 61 74 20 74 68 65 20 72 65 64 69 72  s that the redir
3150: 65 63 74 69 6f 6e 20 61 63 74 75 61 6c 6c 79 20  ection actually 
3160: 72 65 64 69 72 65 63 74 73 20 74 68 65 20 72 6f  redirects the ro
3170: 6f 74 2c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 73  ot, not.    ** s
3180: 6f 6d 65 74 68 69 6e 67 20 64 65 65 70 20 64 6f  omething deep do
3190: 77 6e 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  wn at the bottom
31a0: 20 6f 66 20 61 20 55 52 4c 2e 0a 20 20 20 20 2a   of a URL..    *
31b0: 2f 0a 20 20 20 20 69 20 2d 3d 20 73 74 72 6c 65  /.    i -= strle
31c0: 6e 28 67 2e 7a 45 78 74 72 61 29 3b 0a 20 20 20  n(g.zExtra);.   
31d0: 20 77 68 69 6c 65 28 20 69 3e 30 20 26 26 20 7a   while( i>0 && z
31e0: 43 75 72 5b 69 2d 31 5d 3d 3d 27 2f 27 20 29 7b  Cur[i-1]=='/' ){
31f0: 20 69 2d 2d 3b 20 7d 0a 20 20 7d 0a 20 20 77 68   i--; }.  }.  wh
3200: 69 6c 65 28 20 69 3e 30 20 26 26 20 7a 43 75 72  ile( i>0 && zCur
3210: 5b 69 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 69 2d  [i-1]!='/' ){ i-
3220: 2d 3b 20 7d 0a 20 20 77 68 69 6c 65 28 20 69 3e  -; }.  while( i>
3230: 30 20 26 26 20 7a 43 75 72 5b 69 2d 31 5d 3d 3d  0 && zCur[i-1]==
3240: 27 2f 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a 0a 20  '/' ){ i--; }.. 
3250: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4d 6f 64   if( strcmp(zMod
3260: 65 2c 22 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20  e,"on")==0 ){.  
3270: 20 20 67 2e 7a 42 61 73 65 55 52 4c 20 3d 20 6d    g.zBaseURL = m
3280: 70 72 69 6e 74 66 28 22 68 74 74 70 73 3a 2f 2f  printf("https://
3290: 25 73 25 2e 2a 73 22 2c 20 7a 48 6f 73 74 2c 20  %s%.*s", zHost, 
32a0: 69 2c 20 7a 43 75 72 29 3b 0a 20 20 20 20 67 2e  i, zCur);.    g.
32b0: 7a 54 6f 70 20 3d 20 26 67 2e 7a 42 61 73 65 55  zTop = &g.zBaseU
32c0: 52 4c 5b 38 2b 73 74 72 6c 65 6e 28 7a 48 6f 73  RL[8+strlen(zHos
32d0: 74 29 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t)];.  }else{.  
32e0: 20 20 67 2e 7a 42 61 73 65 55 52 4c 20 3d 20 6d    g.zBaseURL = m
32f0: 70 72 69 6e 74 66 28 22 68 74 74 70 3a 2f 2f 25  printf("http://%
3300: 73 25 2e 2a 73 22 2c 20 7a 48 6f 73 74 2c 20 69  s%.*s", zHost, i
3310: 2c 20 7a 43 75 72 29 3b 0a 20 20 20 20 67 2e 7a  , zCur);.    g.z
3320: 54 6f 70 20 3d 20 26 67 2e 7a 42 61 73 65 55 52  Top = &g.zBaseUR
3330: 4c 5b 37 2b 73 74 72 6c 65 6e 28 7a 48 6f 73 74  L[7+strlen(zHost
3340: 29 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  )];.  }.}../*.**
3350: 20 50 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a 0a   Preconditions:.
3360: 2a 2a 0a 2a 2a 20 20 20 20 2a 20 45 6e 76 69 72  **.**    * Envir
3370: 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 73  onment variables
3380: 20 61 72 65 20 73 65 74 20 75 70 20 61 63 63 6f   are set up acco
3390: 72 64 69 6e 67 20 74 6f 20 74 68 65 20 43 47 49  rding to the CGI
33a0: 20 73 74 61 6e 64 61 72 64 2e 0a 2a 2a 20 20 20   standard..**   
33b0: 20 2a 20 54 68 65 20 72 65 73 70 6f 73 69 74 6f   * The resposito
33c0: 72 79 20 64 61 74 61 62 61 73 65 20 68 61 73 20  ry database has 
33d0: 62 65 65 6e 20 6c 6f 63 61 74 65 64 20 61 6e 64  been located and
33e0: 20 6f 70 65 6e 65 64 2e 0a 2a 2a 20 0a 2a 2a 20   opened..** .** 
33f0: 50 72 6f 63 65 73 73 20 74 68 65 20 77 65 62 70  Process the webp
3400: 61 67 65 20 73 70 65 63 69 66 69 65 64 20 62 79  age specified by
3410: 20 74 68 65 20 50 41 54 48 5f 49 4e 46 4f 20 6f   the PATH_INFO o
3420: 72 20 52 45 51 55 45 53 54 5f 55 52 49 0a 2a 2a  r REQUEST_URI.**
3430: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
3440: 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  iable..*/.static
3450: 20 76 6f 69 64 20 70 72 6f 63 65 73 73 5f 6f 6e   void process_on
3460: 65 5f 77 65 62 5f 70 61 67 65 28 76 6f 69 64 29  e_web_page(void)
3470: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
3480: 7a 50 61 74 68 49 6e 66 6f 3b 0a 20 20 63 68 61  zPathInfo;.  cha
3490: 72 20 2a 7a 50 61 74 68 20 3d 20 4e 55 4c 4c 3b  r *zPath = NULL;
34a0: 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e  .  int idx;.  in
34b0: 74 20 69 2c 20 6a 3b 0a 0a 20 20 2f 2a 20 46 69  t i, j;..  /* Fi
34c0: 6e 64 20 74 68 65 20 70 61 67 65 20 74 68 61 74  nd the page that
34d0: 20 74 68 65 20 75 73 65 72 20 68 61 73 20 72 65   the user has re
34e0: 71 75 65 73 74 65 64 2c 20 63 6f 6e 73 74 72 75  quested, constru
34f0: 63 74 20 61 6e 64 20 64 65 6c 69 76 65 72 20 74  ct and deliver t
3500: 68 61 74 0a 20 20 2a 2a 20 70 61 67 65 2e 0a 20  hat.  ** page.. 
3510: 20 2a 2f 0a 20 20 7a 50 61 74 68 49 6e 66 6f 20   */.  zPathInfo 
3520: 3d 20 50 28 22 50 41 54 48 5f 49 4e 46 4f 22 29  = P("PATH_INFO")
3530: 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 49 6e 66  ;.  if( zPathInf
3540: 6f 3d 3d 30 20 7c 7c 20 7a 50 61 74 68 49 6e 66  o==0 || zPathInf
3550: 6f 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 63  o[0]==0 ){.    c
3560: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 3b  onst char *zUri;
3570: 0a 20 20 20 20 7a 55 72 69 20 3d 20 50 44 28 22  .    zUri = PD("
3580: 52 45 51 55 45 53 54 5f 55 52 49 22 2c 22 2f 22  REQUEST_URI","/"
3590: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
35a0: 7a 55 72 69 5b 69 5d 20 26 26 20 7a 55 72 69 5b  zUri[i] && zUri[
35b0: 69 5d 21 3d 27 3f 27 20 26 26 20 7a 55 72 69 5b  i]!='?' && zUri[
35c0: 69 5d 21 3d 27 23 27 3b 20 69 2b 2b 29 7b 7d 0a  i]!='#'; i++){}.
35d0: 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 6a 3e 30      for(j=i; j>0
35e0: 20 26 26 20 7a 55 72 69 5b 6a 2d 31 5d 21 3d 27   && zUri[j-1]!='
35f0: 2f 27 3b 20 6a 2d 2d 29 7b 7d 0a 20 20 20 20 63  /'; j--){}.    c
3600: 67 69 5f 72 65 64 69 72 65 63 74 66 28 22 25 2e  gi_redirectf("%.
3610: 2a 73 2f 69 6e 64 65 78 22 2c 20 69 2c 20 7a 55  *s/index", i, zU
3620: 72 69 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ri);.  }else{.  
3630: 20 20 7a 50 61 74 68 20 3d 20 6d 70 72 69 6e 74    zPath = mprint
3640: 66 28 22 25 73 22 2c 20 7a 50 61 74 68 49 6e 66  f("%s", zPathInf
3650: 6f 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  o);.  }..  /* Re
3660: 6d 6f 76 65 20 74 68 65 20 6c 65 61 64 69 6e 67  move the leading
3670: 20 22 2f 22 20 61 74 20 74 68 65 20 62 65 67 69   "/" at the begi
3680: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 61 74  nning of the pat
3690: 68 2e 0a 20 20 2a 2f 0a 20 20 67 2e 7a 50 61 74  h..  */.  g.zPat
36a0: 68 20 3d 20 26 7a 50 61 74 68 5b 31 5d 3b 0a 20  h = &zPath[1];. 
36b0: 20 66 6f 72 28 69 3d 31 3b 20 7a 50 61 74 68 5b   for(i=1; zPath[
36c0: 69 5d 20 26 26 20 7a 50 61 74 68 5b 69 5d 21 3d  i] && zPath[i]!=
36d0: 27 2f 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66  '/'; i++){}.  if
36e0: 28 20 7a 50 61 74 68 5b 69 5d 3d 3d 27 2f 27 20  ( zPath[i]=='/' 
36f0: 29 7b 0a 20 20 20 20 7a 50 61 74 68 5b 69 5d 20  ){.    zPath[i] 
3700: 3d 20 30 3b 0a 20 20 20 20 67 2e 7a 45 78 74 72  = 0;.    g.zExtr
3710: 61 20 3d 20 26 7a 50 61 74 68 5b 69 2b 31 5d 3b  a = &zPath[i+1];
3720: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67 2e  .  }else{.    g.
3730: 7a 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 7d 0a  zExtra = 0;.  }.
3740: 20 20 73 65 74 5f 62 61 73 65 5f 75 72 6c 28 29    set_base_url()
3750: 3b 0a 20 20 69 66 28 20 67 2e 7a 45 78 74 72 61  ;.  if( g.zExtra
3760: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 47 49 20 70   ){.    /* CGI p
3770: 61 72 61 6d 65 74 65 72 73 20 67 65 74 20 74 68  arameters get th
3780: 69 73 20 74 72 65 61 74 6d 65 6e 74 20 65 6c 73  is treatment els
3790: 65 77 68 65 72 65 2c 20 62 75 74 20 70 6c 61 63  ewhere, but plac
37a0: 65 73 20 6c 69 6b 65 20 67 65 74 66 69 6c 65 0a  es like getfile.
37b0: 20 20 20 20 2a 2a 20 77 69 6c 6c 20 75 73 65 20      ** will use 
37c0: 67 2e 7a 45 78 74 72 61 20 64 69 72 65 63 74 6c  g.zExtra directl
37d0: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65  y..    */.    de
37e0: 68 74 74 70 69 7a 65 28 67 2e 7a 45 78 74 72 61  httpize(g.zExtra
37f0: 29 3b 0a 20 20 20 20 63 67 69 5f 73 65 74 5f 70  );.    cgi_set_p
3800: 61 72 61 6d 65 74 65 72 5f 6e 6f 63 6f 70 79 28  arameter_nocopy(
3810: 22 6e 61 6d 65 22 2c 20 67 2e 7a 45 78 74 72 61  "name", g.zExtra
3820: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 65  );.  }..  /* Pre
3830: 76 65 6e 74 20 72 6f 62 6f 74 73 20 66 72 6f 6d  vent robots from
3840: 20 69 6e 64 65 78 69 6e 67 20 74 68 69 73 20 73   indexing this s
3850: 69 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ite..  */.  if( 
3860: 73 74 72 63 6d 70 28 67 2e 7a 50 61 74 68 2c 20  strcmp(g.zPath, 
3870: 22 72 6f 62 6f 74 73 2e 74 78 74 22 29 3d 3d 30  "robots.txt")==0
3880: 20 29 7b 0a 20 20 20 20 63 67 69 5f 73 65 74 5f   ){.    cgi_set_
3890: 63 6f 6e 74 65 6e 74 5f 74 79 70 65 28 22 74 65  content_type("te
38a0: 78 74 2f 70 6c 61 69 6e 22 29 3b 0a 20 20 20 20  xt/plain");.    
38b0: 40 20 55 73 65 72 2d 61 67 65 6e 74 3a 20 2a 0a  @ User-agent: *.
38c0: 20 20 20 20 40 20 44 69 73 61 6c 6c 6f 77 3a 20      @ Disallow: 
38d0: 2f 0a 20 20 20 20 63 67 69 5f 72 65 70 6c 79 28  /.    cgi_reply(
38e0: 29 3b 0a 20 20 20 20 65 78 69 74 28 30 29 3b 0a  );.    exit(0);.
38f0: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4c 6f 63 61    }.  .  /* Loca
3900: 74 65 20 74 68 65 20 6d 65 74 68 6f 64 20 73 70  te the method sp
3910: 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20 70  ecified by the p
3920: 61 74 68 20 61 6e 64 20 65 78 65 63 75 74 65 20  ath and execute 
3930: 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  the function.  *
3940: 2a 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  * that implement
3950: 73 20 74 68 61 74 20 6d 65 74 68 6f 64 2e 0a 20  s that method.. 
3960: 20 2a 2f 0a 20 20 69 66 28 20 6e 61 6d 65 5f 73   */.  if( name_s
3970: 65 61 72 63 68 28 67 2e 7a 50 61 74 68 2c 20 61  earch(g.zPath, a
3980: 57 65 62 70 61 67 65 2c 20 63 6f 75 6e 74 28 61  Webpage, count(a
3990: 57 65 62 70 61 67 65 29 2c 20 26 69 64 78 29 20  Webpage), &idx) 
39a0: 26 26 0a 20 20 20 20 20 20 6e 61 6d 65 5f 73 65  &&.      name_se
39b0: 61 72 63 68 28 22 6e 6f 74 5f 66 6f 75 6e 64 22  arch("not_found"
39c0: 2c 20 61 57 65 62 70 61 67 65 2c 20 63 6f 75 6e  , aWebpage, coun
39d0: 74 28 61 57 65 62 70 61 67 65 29 2c 20 26 69 64  t(aWebpage), &id
39e0: 78 29 20 29 7b 0a 20 20 20 20 63 67 69 5f 73 65  x) ){.    cgi_se
39f0: 74 5f 73 74 61 74 75 73 28 34 30 34 2c 22 4e 6f  t_status(404,"No
3a00: 74 20 46 6f 75 6e 64 22 29 3b 0a 20 20 20 20 40  t Found");.    @
3a10: 20 3c 68 31 3e 4e 6f 74 20 46 6f 75 6e 64 3c 2f   <h1>Not Found</
3a20: 68 31 3e 0a 20 20 20 20 40 20 3c 70 3e 50 61 67  h1>.    @ <p>Pag
3a30: 65 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 25 68 28  e not found: %h(
3a40: 67 2e 7a 50 61 74 68 29 3c 2f 70 3e 0a 20 20 7d  g.zPath)</p>.  }
3a50: 65 6c 73 65 7b 0a 20 20 20 20 61 57 65 62 70 61  else{.    aWebpa
3a60: 67 65 5b 69 64 78 5d 2e 78 46 75 6e 63 28 29 3b  ge[idx].xFunc();
3a70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72  .  }..  /* Retur
3a80: 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20  n the result..  
3a90: 2a 2f 0a 20 20 63 67 69 5f 72 65 70 6c 79 28 29  */.  cgi_reply()
3aa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41  ;.}../*.** COMMA
3ab0: 4e 44 3a 20 63 67 69 0a 2a 2a 0a 2a 2a 20 55 73  ND: cgi.**.** Us
3ac0: 61 67 65 3a 20 25 66 6f 73 73 69 6c 20 3f 63 67  age: %fossil ?cg
3ad0: 69 3f 20 53 43 52 49 50 54 0a 2a 2a 0a 2a 2a 20  i? SCRIPT.**.** 
3ae0: 54 68 65 20 53 43 52 49 50 54 20 61 72 67 75 6d  The SCRIPT argum
3af0: 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ent is the name 
3b00: 6f 66 20 61 20 66 69 6c 65 20 74 68 61 74 20 69  of a file that i
3b10: 73 20 74 68 65 20 43 47 49 20 73 63 72 69 70 74  s the CGI script
3b20: 0a 2a 2a 20 74 68 61 74 20 69 73 20 62 65 69 6e  .** that is bein
3b30: 67 20 72 75 6e 2e 20 20 54 68 65 20 63 6f 6d 6d  g run.  The comm
3b40: 61 6e 64 20 6e 61 6d 65 2c 20 22 63 67 69 22 2c  and name, "cgi",
3b50: 20 6d 61 79 20 62 65 20 6f 6d 69 74 74 65 64 20   may be omitted 
3b60: 69 66 0a 2a 2a 20 74 68 65 20 47 41 54 45 57 41  if.** the GATEWA
3b70: 59 5f 49 4e 54 45 52 46 41 43 45 20 65 6e 76 69  Y_INTERFACE envi
3b80: 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
3b90: 20 69 73 20 73 65 74 20 74 6f 20 22 43 47 49 22   is set to "CGI"
3ba0: 20 28 77 68 69 63 68 0a 2a 2a 20 73 68 6f 75 6c   (which.** shoul
3bb0: 64 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20  d always be the 
3bc0: 63 61 73 65 20 66 6f 72 20 43 47 49 20 73 63 72  case for CGI scr
3bd0: 69 70 74 73 20 72 75 6e 20 62 79 20 61 20 77 65  ipts run by a we
3be0: 62 73 65 72 76 65 72 2e 29 20 20 54 68 65 0a 2a  bserver.)  The.*
3bf0: 2a 20 53 43 52 49 50 54 20 66 69 6c 65 20 73 68  * SCRIPT file sh
3c00: 6f 75 6c 64 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68  ould look someth
3c10: 69 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ing like this:.*
3c20: 2a 0a 2a 2a 20 20 20 20 20 20 23 21 2f 75 73 72  *.**      #!/usr
3c30: 2f 62 69 6e 2f 66 6f 73 73 69 6c 0a 2a 2a 20 20  /bin/fossil.**  
3c40: 20 20 20 20 72 65 70 6f 73 69 74 6f 72 79 3a 20      repository: 
3c50: 2f 68 6f 6d 65 2f 73 6f 6d 65 62 6f 64 79 2f 70  /home/somebody/p
3c60: 72 6f 6a 65 63 74 2e 64 62 0a 2a 2a 0a 2a 2a 20  roject.db.**.** 
3c70: 54 68 65 20 73 65 63 6f 6e 64 20 6c 69 6e 65 20  The second line 
3c80: 64 65 66 69 6e 65 73 20 74 68 65 20 6e 61 6d 65  defines the name
3c90: 20 6f 66 20 74 68 65 20 72 65 70 6f 73 69 74 6f   of the reposito
3ca0: 72 79 2e 20 20 41 66 74 65 72 20 6c 6f 63 61 74  ry.  After locat
3cb0: 69 6e 67 0a 2a 2a 20 74 68 65 20 72 65 70 6f 73  ing.** the repos
3cc0: 69 74 6f 72 79 2c 20 66 6f 73 73 69 6c 20 77 69  itory, fossil wi
3cd0: 6c 6c 20 67 65 6e 65 72 61 74 65 20 61 20 77 65  ll generate a we
3ce0: 62 70 61 67 65 20 6f 6e 20 73 74 64 6f 75 74 20  bpage on stdout 
3cf0: 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20  based on.** the 
3d00: 76 61 6c 75 65 73 20 6f 66 20 73 74 61 6e 64 61  values of standa
3d10: 72 64 20 43 47 49 20 65 6e 76 69 72 6f 6e 6d 65  rd CGI environme
3d20: 6e 74 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2f  nt variables..*/
3d30: 0a 76 6f 69 64 20 63 6d 64 5f 63 67 69 28 76 6f  .void cmd_cgi(vo
3d40: 69 64 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  id){.  const cha
3d50: 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 42 6c 6f 62  r *zFile;.  Blob
3d60: 20 63 6f 6e 66 69 67 2c 20 6c 69 6e 65 2c 20 6b   config, line, k
3d70: 65 79 2c 20 76 61 6c 75 65 3b 0a 20 20 69 66 28  ey, value;.  if(
3d80: 20 67 2e 61 72 67 63 3d 3d 33 20 26 26 20 73 74   g.argc==3 && st
3d90: 72 63 6d 70 28 67 2e 61 72 67 76 5b 31 5d 2c 22  rcmp(g.argv[1],"
3da0: 63 67 69 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  cgi")==0 ){.    
3db0: 7a 46 69 6c 65 20 3d 20 67 2e 61 72 67 76 5b 32  zFile = g.argv[2
3dc0: 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
3dd0: 7a 46 69 6c 65 20 3d 20 67 2e 61 72 67 76 5b 31  zFile = g.argv[1
3de0: 5d 3b 0a 20 20 7d 0a 20 20 67 2e 63 67 69 50 61  ];.  }.  g.cgiPa
3df0: 6e 69 63 20 3d 20 31 3b 0a 20 20 62 6c 6f 62 5f  nic = 1;.  blob_
3e00: 72 65 61 64 5f 66 72 6f 6d 5f 66 69 6c 65 28 26  read_from_file(&
3e10: 63 6f 6e 66 69 67 2c 20 7a 46 69 6c 65 29 3b 0a  config, zFile);.
3e20: 20 20 77 68 69 6c 65 28 20 62 6c 6f 62 5f 6c 69    while( blob_li
3e30: 6e 65 28 26 63 6f 6e 66 69 67 2c 20 26 6c 69 6e  ne(&config, &lin
3e40: 65 29 20 29 7b 0a 20 20 20 20 69 66 28 20 21 62  e) ){.    if( !b
3e50: 6c 6f 62 5f 74 6f 6b 65 6e 28 26 6c 69 6e 65 2c  lob_token(&line,
3e60: 20 26 6b 65 79 29 20 29 20 63 6f 6e 74 69 6e 75   &key) ) continu
3e70: 65 3b 0a 20 20 20 20 69 66 28 20 62 6c 6f 62 5f  e;.    if( blob_
3e80: 62 75 66 66 65 72 28 26 6b 65 79 29 5b 30 5d 3d  buffer(&key)[0]=
3e90: 3d 27 23 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ='#' ) continue;
3ea0: 0a 20 20 20 20 69 66 28 20 62 6c 6f 62 5f 65 71  .    if( blob_eq
3eb0: 28 26 6b 65 79 2c 20 22 64 65 62 75 67 3a 22 29  (&key, "debug:")
3ec0: 20 26 26 20 62 6c 6f 62 5f 74 6f 6b 65 6e 28 26   && blob_token(&
3ed0: 6c 69 6e 65 2c 20 26 76 61 6c 75 65 29 20 29 7b  line, &value) ){
3ee0: 0a 20 20 20 20 20 20 67 2e 66 44 65 62 75 67 20  .      g.fDebug 
3ef0: 3d 20 66 6f 70 65 6e 28 62 6c 6f 62 5f 73 74 72  = fopen(blob_str
3f00: 28 26 76 61 6c 75 65 29 2c 20 22 61 22 29 3b 0a  (&value), "a");.
3f10: 20 20 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74        blob_reset
3f20: 28 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  (&value);.      
3f30: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
3f40: 20 20 20 20 69 66 28 20 62 6c 6f 62 5f 65 71 28      if( blob_eq(
3f50: 26 6b 65 79 2c 20 22 48 4f 4d 45 3a 22 29 20 26  &key, "HOME:") &
3f60: 26 20 62 6c 6f 62 5f 74 6f 6b 65 6e 28 26 6c 69  & blob_token(&li
3f70: 6e 65 2c 20 26 76 61 6c 75 65 29 20 29 7b 0a 20  ne, &value) ){. 
3f80: 20 20 20 20 20 63 67 69 5f 73 65 74 65 6e 76 28       cgi_setenv(
3f90: 22 48 4f 4d 45 22 2c 20 62 6c 6f 62 5f 73 74 72  "HOME", blob_str
3fa0: 28 26 76 61 6c 75 65 29 29 3b 0a 20 20 20 20 20  (&value));.     
3fb0: 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 76 61 6c   blob_reset(&val
3fc0: 75 65 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  ue);.      conti
3fd0: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
3fe0: 66 28 20 62 6c 6f 62 5f 65 71 28 26 6b 65 79 2c  f( blob_eq(&key,
3ff0: 20 22 72 65 70 6f 73 69 74 6f 72 79 3a 22 29 20   "repository:") 
4000: 26 26 20 62 6c 6f 62 5f 74 6f 6b 65 6e 28 26 6c  && blob_token(&l
4010: 69 6e 65 2c 20 26 76 61 6c 75 65 29 20 29 7b 0a  ine, &value) ){.
4020: 20 20 20 20 20 20 64 62 5f 6f 70 65 6e 5f 72 65        db_open_re
4030: 70 6f 73 69 74 6f 72 79 28 62 6c 6f 62 5f 73 74  pository(blob_st
4040: 72 28 26 76 61 6c 75 65 29 29 3b 0a 20 20 20 20  r(&value));.    
4050: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 76 61    blob_reset(&va
4060: 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62  lue);.      blob
4070: 5f 72 65 73 65 74 28 26 63 6f 6e 66 69 67 29 3b  _reset(&config);
4080: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4090: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 67 2e    }.  }.  if( g.
40a0: 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 63 67 69  db==0 ){.    cgi
40b0: 5f 70 61 6e 69 63 28 22 55 6e 61 62 6c 65 20 74  _panic("Unable t
40c0: 6f 20 66 69 6e 64 20 6f 72 20 6f 70 65 6e 20 74  o find or open t
40d0: 68 65 20 70 72 6f 6a 65 63 74 20 72 65 70 6f 73  he project repos
40e0: 69 74 6f 72 79 22 29 3b 0a 20 20 7d 0a 20 20 63  itory");.  }.  c
40f0: 67 69 5f 69 6e 69 74 28 29 3b 0a 20 20 70 72 6f  gi_init();.  pro
4100: 63 65 73 73 5f 6f 6e 65 5f 77 65 62 5f 70 61 67  cess_one_web_pag
4110: 65 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f  e();.}../*.** CO
4120: 4d 4d 41 4e 44 3a 20 68 74 74 70 0a 2a 2a 0a 2a  MMAND: http.**.*
4130: 2a 20 55 73 61 67 65 3a 20 25 66 6f 73 73 69 6c  * Usage: %fossil
4140: 20 68 74 74 70 20 52 45 50 4f 53 49 54 4f 52 59   http REPOSITORY
4150: 0a 2a 2a 0a 2a 2a 20 48 61 6e 64 6c 65 20 61 20  .**.** Handle a 
4160: 73 69 6e 67 6c 65 20 48 54 54 50 20 72 65 71 75  single HTTP requ
4170: 65 73 74 20 61 70 70 65 61 72 69 6e 67 20 6f 6e  est appearing on
4180: 20 73 74 64 69 6e 2e 20 20 54 68 65 20 72 65 73   stdin.  The res
4190: 75 6c 74 69 6e 67 20 77 65 62 70 61 67 65 0a 2a  ulting webpage.*
41a0: 2a 20 69 73 20 64 65 6c 69 76 65 72 65 64 20 6f  * is delivered o
41b0: 6e 20 73 74 64 6f 75 74 2e 20 20 54 68 69 73 20  n stdout.  This 
41c0: 6d 65 74 68 6f 64 20 69 73 20 75 73 65 64 20 74  method is used t
41d0: 6f 20 6c 61 75 6e 63 68 20 61 6e 20 48 54 54 50  o launch an HTTP
41e0: 20 72 65 71 75 65 73 74 0a 2a 2a 20 68 61 6e 64   request.** hand
41f0: 6c 65 72 20 66 72 6f 6d 20 69 6e 65 74 64 2c 20  ler from inetd, 
4200: 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 54 68  for example.  Th
4210: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
4220: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 0a 2a  e name of the .*
4230: 2a 20 72 65 70 6f 73 69 74 6f 72 79 2e 0a 2a 2f  * repository..*/
4240: 0a 76 6f 69 64 20 63 6d 64 5f 68 74 74 70 28 76  .void cmd_http(v
4250: 6f 69 64 29 7b 0a 20 20 69 66 28 20 67 2e 61 72  oid){.  if( g.ar
4260: 67 63 21 3d 32 20 26 26 20 67 2e 61 72 67 63 21  gc!=2 && g.argc!
4270: 3d 33 20 29 7b 0a 20 20 20 20 63 67 69 5f 70 61  =3 ){.    cgi_pa
4280: 6e 69 63 28 22 6e 6f 20 72 65 70 6f 73 69 74 6f  nic("no reposito
4290: 72 79 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a  ry specified");.
42a0: 20 20 7d 0a 20 20 67 2e 63 67 69 50 61 6e 69 63    }.  g.cgiPanic
42b0: 20 3d 20 31 3b 0a 20 20 69 66 28 20 67 2e 61 72   = 1;.  if( g.ar
42c0: 67 63 3d 3d 33 20 29 7b 0a 20 20 20 20 64 62 5f  gc==3 ){.    db_
42d0: 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28  open_repository(
42e0: 67 2e 61 72 67 76 5b 32 5d 29 3b 0a 20 20 7d 65  g.argv[2]);.  }e
42f0: 6c 73 65 7b 0a 20 20 20 20 64 62 5f 6d 75 73 74  lse{.    db_must
4300: 5f 62 65 5f 77 69 74 68 69 6e 5f 74 72 65 65 28  _be_within_tree(
4310: 29 3b 0a 20 20 7d 0a 20 20 63 67 69 5f 68 61 6e  );.  }.  cgi_han
4320: 64 6c 65 5f 68 74 74 70 5f 72 65 71 75 65 73 74  dle_http_request
4330: 28 29 3b 0a 20 20 70 72 6f 63 65 73 73 5f 6f 6e  ();.  process_on
4340: 65 5f 77 65 62 5f 70 61 67 65 28 29 3b 0a 7d 0a  e_web_page();.}.
4350: 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20  ./*.** COMMAND: 
4360: 74 65 73 74 2d 68 74 74 70 0a 2a 2a 20 57 6f 72  test-http.** Wor
4370: 6b 73 20 6c 69 6b 65 20 74 68 65 20 68 74 74 70  ks like the http
4380: 20 63 6f 6d 6d 61 6e 64 20 62 75 74 20 67 69 76   command but giv
4390: 65 73 20 73 65 74 75 70 20 70 65 72 6d 69 73 73  es setup permiss
43a0: 69 6f 6e 20 74 6f 20 61 6c 6c 20 75 73 65 72 73  ion to all users
43b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 63 6d 64 5f 74 65  ..*/.void cmd_te
43c0: 73 74 5f 68 74 74 70 28 76 6f 69 64 29 7b 0a 20  st_http(void){. 
43d0: 20 6c 6f 67 69 6e 5f 73 65 74 5f 63 61 70 61 62   login_set_capab
43e0: 69 6c 69 74 69 65 73 28 22 73 22 29 3b 0a 20 20  ilities("s");.  
43f0: 63 6d 64 5f 68 74 74 70 28 29 3b 0a 7d 0a 0a 2f  cmd_http();.}../
4400: 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 73 65  *.** COMMAND: se
4410: 72 76 65 72 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65  rver.**.** Usage
4420: 3a 20 25 66 6f 73 73 69 6c 20 73 65 72 76 65 72  : %fossil server
4430: 20 3f 2d 50 7c 2d 2d 70 6f 72 74 20 54 43 50 50   ?-P|--port TCPP
4440: 4f 52 54 3f 20 3f 52 45 50 4f 53 49 54 4f 52 59  ORT? ?REPOSITORY
4450: 3f 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73  ?.**.** Open a s
4460: 6f 63 6b 65 74 20 61 6e 64 20 62 65 67 69 6e 20  ocket and begin 
4470: 6c 69 73 74 65 6e 69 6e 67 20 61 6e 64 20 72 65  listening and re
4480: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 48 54 54 50  sponding to HTTP
4490: 20 72 65 71 75 65 73 74 73 20 6f 6e 0a 2a 2a 20   requests on.** 
44a0: 54 43 50 20 70 6f 72 74 20 38 30 38 30 2c 20 6f  TCP port 8080, o
44b0: 72 20 6f 6e 20 61 6e 79 20 6f 74 68 65 72 20 54  r on any other T
44c0: 43 50 20 70 6f 72 74 20 64 65 66 69 6e 65 64 20  CP port defined 
44d0: 62 79 20 74 68 65 20 2d 50 20 6f 72 0a 2a 2a 20  by the -P or.** 
44e0: 2d 2d 70 6f 72 74 20 6f 70 74 69 6f 6e 2e 20 20  --port option.  
44f0: 54 68 65 20 6f 70 74 69 6f 6e 61 6c 20 61 72 67  The optional arg
4500: 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d  ument is the nam
4510: 65 20 6f 66 20 74 68 65 20 72 65 70 6f 73 69 74  e of the reposit
4520: 6f 72 79 2e 0a 2a 2a 20 54 68 65 20 72 65 70 6f  ory..** The repo
4530: 73 69 74 6f 72 79 20 61 72 67 75 6d 65 6e 74 20  sitory argument 
4540: 6d 61 79 20 62 65 20 6f 6d 69 74 74 65 64 20 69  may be omitted i
4550: 66 20 74 68 65 20 77 6f 72 6b 69 6e 67 20 64 69  f the working di
4560: 72 65 63 74 6f 72 79 20 69 73 0a 2a 2a 20 77 69  rectory is.** wi
4570: 74 68 69 6e 20 61 6e 20 6f 70 65 6e 20 63 68 65  thin an open che
4580: 63 6b 6f 75 74 2e 0a 2a 2f 0a 76 6f 69 64 20 63  ckout..*/.void c
4590: 6d 64 5f 77 65 62 73 65 72 76 65 72 28 76 6f 69  md_webserver(voi
45a0: 64 29 7b 0a 20 20 69 6e 74 20 69 50 6f 72 74 3b  d){.  int iPort;
45b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
45c0: 50 6f 72 74 3b 0a 0a 20 20 7a 50 6f 72 74 20 3d  Port;..  zPort =
45d0: 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 70 6f   find_option("po
45e0: 72 74 22 2c 20 22 50 22 2c 20 31 29 3b 0a 20 20  rt", "P", 1);.  
45f0: 69 66 28 20 7a 50 6f 72 74 20 29 7b 0a 20 20 20  if( zPort ){.   
4600: 20 69 50 6f 72 74 20 3d 20 61 74 6f 69 28 7a 50   iPort = atoi(zP
4610: 6f 72 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ort);.  }else{. 
4620: 20 20 20 69 50 6f 72 74 20 3d 20 38 30 38 30 3b     iPort = 8080;
4630: 0a 20 20 7d 0a 20 20 69 66 28 20 67 2e 61 72 67  .  }.  if( g.arg
4640: 63 21 3d 32 20 26 26 20 67 2e 61 72 67 63 21 3d  c!=2 && g.argc!=
4650: 33 20 29 20 75 73 61 67 65 28 22 3f 52 45 50 4f  3 ) usage("?REPO
4660: 53 49 54 4f 52 59 3f 22 29 3b 0a 20 20 69 66 28  SITORY?");.  if(
4670: 20 67 2e 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20   g.argc==2 ){.  
4680: 20 20 64 62 5f 6d 75 73 74 5f 62 65 5f 77 69 74    db_must_be_wit
4690: 68 69 6e 5f 74 72 65 65 28 29 3b 0a 20 20 20 20  hin_tree();.    
46a0: 64 62 5f 63 6c 6f 73 65 28 29 3b 0a 20 20 7d 0a  db_close();.  }.
46b0: 20 20 63 67 69 5f 68 74 74 70 5f 73 65 72 76 65    cgi_http_serve
46c0: 72 28 69 50 6f 72 74 29 3b 0a 20 20 69 66 28 20  r(iPort);.  if( 
46d0: 67 2e 66 48 74 74 70 54 72 61 63 65 20 29 7b 0a  g.fHttpTrace ){.
46e0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
46f0: 72 72 2c 20 22 3d 3d 3d 3d 3d 3d 20 53 45 52 56  rr, "====== SERV
4700: 45 52 20 70 69 64 20 25 64 20 3d 3d 3d 3d 3d 3d  ER pid %d ======
4710: 3d 5c 6e 22 2c 20 67 65 74 70 69 64 28 29 29 3b  =\n", getpid());
4720: 0a 20 20 7d 0a 20 20 67 2e 63 67 69 50 61 6e 69  .  }.  g.cgiPani
4730: 63 20 3d 20 31 3b 0a 20 20 69 66 28 20 67 2e 61  c = 1;.  if( g.a
4740: 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 64 62  rgc==2 ){.    db
4750: 5f 6d 75 73 74 5f 62 65 5f 77 69 74 68 69 6e 5f  _must_be_within_
4760: 74 72 65 65 28 29 3b 0a 20 20 7d 65 6c 73 65 7b  tree();.  }else{
4770: 0a 20 20 20 20 64 62 5f 6f 70 65 6e 5f 72 65 70  .    db_open_rep
4780: 6f 73 69 74 6f 72 79 28 67 2e 61 72 67 76 5b 32  ository(g.argv[2
4790: 5d 29 3b 0a 20 20 7d 0a 20 20 63 67 69 5f 68 61  ]);.  }.  cgi_ha
47a0: 6e 64 6c 65 5f 68 74 74 70 5f 72 65 71 75 65 73  ndle_http_reques
47b0: 74 28 29 3b 0a 20 20 70 72 6f 63 65 73 73 5f 6f  t();.  process_o
47c0: 6e 65 5f 77 65 62 5f 70 61 67 65 28 29 3b 0a 7d  ne_web_page();.}
47d0: 0a                                               .