Hex Artifact Content
Not logged in

Artifact 09a4698442b3d1228b405edcfc2f2da6995642b2:

File src/main.c part of check-in [dccd27c6da] - Added a global command line argument named -quiet. This will suppress some output (currently during sync) for those interfacing fossil with various development tools. It does not make eliminate all output, only the output that is meant for fancy display to the user on a console. You can now use this new flag anywhere by referencing if (!g.fQuiet) {...} by jeremy_c on 2009-12-14 23:18:54.

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 23 69 6e  ude <time.h>.#in
0410: 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a  clude <fcntl.h>.
0420: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79  #include <sys/ty
0430: 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  pes.h>.#include 
0440: 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a 0a 0a 23  <sys/stat.h>...#
0450: 69 66 20 49 4e 54 45 52 46 41 43 45 0a 0a 2f 2a  if INTERFACE../*
0460: 0a 2a 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c  .** Number of el
0470: 65 6d 65 6e 74 73 20 69 6e 20 61 6e 20 61 72 72  ements in an arr
0480: 61 79 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 63 6f  ay.*/.#define co
0490: 75 6e 74 28 58 29 20 20 28 73 69 7a 65 6f 66 28  unt(X)  (sizeof(
04a0: 58 29 2f 73 69 7a 65 6f 66 28 58 5b 30 5d 29 29  X)/sizeof(X[0]))
04b0: 0a 0a 2f 2a 0a 2a 2a 20 53 69 7a 65 20 6f 66 20  ../*.** Size of 
04c0: 61 20 55 55 49 44 20 69 6e 20 63 68 61 72 61 63  a UUID in charac
04d0: 74 65 72 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ters.*/.#define 
04e0: 55 55 49 44 5f 53 49 5a 45 20 34 30 0a 0a 2f 2a  UUID_SIZE 40../*
04f0: 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62  .** Maximum numb
0500: 65 72 20 6f 66 20 61 75 78 69 6c 69 61 72 79 20  er of auxiliary 
0510: 70 61 72 61 6d 65 74 65 72 73 20 6f 6e 20 72 65  parameters on re
0520: 70 6f 72 74 73 0a 2a 2f 0a 23 64 65 66 69 6e 65  ports.*/.#define
0530: 20 4d 58 5f 41 55 58 20 20 35 0a 0a 2f 2a 0a 2a   MX_AUX  5../*.*
0540: 2a 20 41 6c 6c 20 67 6c 6f 62 61 6c 20 76 61 72  * All global var
0550: 69 61 62 6c 65 73 20 61 72 65 20 69 6e 20 74 68  iables are in th
0560: 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  is structure..*/
0570: 0a 73 74 72 75 63 74 20 47 6c 6f 62 61 6c 20 7b  .struct Global {
0580: 0a 20 20 69 6e 74 20 61 72 67 63 3b 20 63 68 61  .  int argc; cha
0590: 72 20 2a 2a 61 72 67 76 3b 20 20 2f 2a 20 43 6f  r **argv;  /* Co
05a0: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d  mmand-line argum
05b0: 65 6e 74 73 20 74 6f 20 74 68 65 20 70 72 6f 67  ents to the prog
05c0: 72 61 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43  ram */.  int isC
05d0: 6f 6e 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  onst;           
05e0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
05f0: 6f 75 74 70 75 74 20 69 73 20 75 6e 63 68 61 6e  output is unchan
0600: 67 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ging */.  sqlite
0610: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
0620: 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74    /* The connect
0630: 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ion to the datab
0640: 61 73 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ases */.  sqlite
0650: 33 20 2a 64 62 43 6f 6e 66 69 67 3b 20 20 20 20  3 *dbConfig;    
0660: 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20 63 6f    /* Separate co
0670: 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 67 6c 6f  nnection for glo
0680: 62 61 6c 5f 63 6f 6e 66 69 67 20 74 61 62 6c 65  bal_config table
0690: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 41 74 74   */.  int useAtt
06a0: 61 63 68 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ach;          /*
06b0: 20 54 72 75 65 20 69 66 20 67 6c 6f 62 61 6c 5f   True if global_
06c0: 63 6f 6e 66 69 67 20 69 73 20 61 74 74 61 63 68  config is attach
06d0: 65 64 20 74 6f 20 72 65 70 6f 73 69 74 6f 72 79  ed to repository
06e0: 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 66 69 67   */.  int config
06f0: 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  Open;         /*
0700: 20 54 72 75 65 20 69 66 20 74 68 65 20 63 6f 6e   True if the con
0710: 66 69 67 20 64 61 74 61 62 61 73 65 20 69 73 20  fig database is 
0720: 6f 70 65 6e 20 2a 2f 0a 20 20 6c 6f 6e 67 20 6c  open */.  long l
0730: 6f 6e 67 20 69 6e 74 20 6e 6f 77 3b 20 20 20 20  ong int now;    
0740: 20 20 2f 2a 20 53 65 63 6f 6e 64 73 20 73 69 6e    /* Seconds sin
0750: 63 65 20 31 39 37 30 20 2a 2f 0a 20 20 69 6e 74  ce 1970 */.  int
0760: 20 72 65 70 6f 73 69 74 6f 72 79 4f 70 65 6e 3b   repositoryOpen;
0770: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
0780: 74 68 65 20 6d 61 69 6e 20 72 65 70 6f 73 69 74  the main reposit
0790: 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20  ory database is 
07a0: 6f 70 65 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  open */.  char *
07b0: 7a 52 65 70 6f 73 69 74 6f 72 79 4e 61 6d 65 3b  zRepositoryName;
07c0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
07d0: 20 72 65 70 6f 73 69 74 6f 72 79 20 64 61 74 61   repository data
07e0: 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  base */.  const 
07f0: 63 68 61 72 20 2a 7a 48 6f 6d 65 3b 20 20 20 20  char *zHome;    
0800: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 75 73 65    /* Name of use
0810: 72 20 68 6f 6d 65 20 64 69 72 65 63 74 6f 72 79  r home directory
0820: 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 61 6c 4f   */.  int localO
0830: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  pen;          /*
0840: 20 54 72 75 65 20 69 66 20 74 68 65 20 6c 6f 63   True if the loc
0850: 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  al database is o
0860: 70 65 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  pen */.  char *z
0870: 4c 6f 63 61 6c 52 6f 6f 74 3b 20 20 20 20 20 20  LocalRoot;      
0880: 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72   /* The director
0890: 79 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 20 6c  y holding the  l
08a0: 6f 63 61 6c 20 64 61 74 61 62 61 73 65 20 2a 2f  ocal database */
08b0: 0a 20 20 69 6e 74 20 6d 69 6e 50 72 65 66 69 78  .  int minPrefix
08c0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ;          /* Nu
08d0: 6d 62 65 72 20 6f 66 20 64 69 67 69 74 73 20 6e  mber of digits n
08e0: 65 65 64 65 64 20 66 6f 72 20 61 20 64 69 73 74  eeded for a dist
08f0: 69 6e 63 74 20 55 55 49 44 20 2a 2f 0a 20 20 69  inct UUID */.  i
0900: 6e 74 20 66 53 71 6c 54 72 61 63 65 3b 20 20 20  nt fSqlTrace;   
0910: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
0920: 66 20 2d 73 71 6c 74 72 61 63 65 20 66 6c 61 67  f -sqltrace flag
0930: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
0940: 20 69 6e 74 20 66 53 71 6c 50 72 69 6e 74 3b 20   int fSqlPrint; 
0950: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
0960: 20 69 66 20 2d 73 71 6c 70 72 69 6e 74 20 66 6c   if -sqlprint fl
0970: 61 67 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  ag is present */
0980: 0a 20 20 69 6e 74 20 66 51 75 69 65 74 3b 20 20  .  int fQuiet;  
0990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
09a0: 75 65 20 69 66 20 2d 71 75 69 65 74 20 66 6c 61  ue if -quiet fla
09b0: 67 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  g is present */.
09c0: 20 20 69 6e 74 20 66 48 74 74 70 54 72 61 63 65    int fHttpTrace
09d0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61  ;         /* Tra
09e0: 63 65 20 6f 75 74 62 6f 75 6e 64 20 48 54 54 50  ce outbound HTTP
09f0: 20 72 65 71 75 65 73 74 73 20 2a 2f 0a 20 20 69   requests */.  i
0a00: 6e 74 20 66 4e 6f 53 79 6e 63 3b 20 20 20 20 20  nt fNoSync;     
0a10: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
0a20: 20 64 6f 20 61 6e 20 61 75 74 6f 73 79 6e 63 20   do an autosync 
0a30: 65 76 65 6e 2e 20 20 2d 2d 6e 6f 73 79 6e 63 20  even.  --nosync 
0a40: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68  */.  char *zPath
0a50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0a60: 4e 61 6d 65 20 6f 66 20 77 65 62 70 61 67 65 20  Name of webpage 
0a70: 62 65 69 6e 67 20 73 65 72 76 65 64 20 2a 2f 0a  being served */.
0a80: 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 20    char *zExtra; 
0a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
0aa0: 72 61 20 70 61 74 68 20 69 6e 66 6f 72 6d 61 74  ra path informat
0ab0: 69 6f 6e 20 70 61 73 74 20 74 68 65 20 77 65 62  ion past the web
0ac0: 70 61 67 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63  page name */.  c
0ad0: 68 61 72 20 2a 7a 42 61 73 65 55 52 4c 3b 20 20  har *zBaseURL;  
0ae0: 20 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74         /* Full t
0af0: 65 78 74 20 6f 66 20 74 68 65 20 55 52 4c 20 62  ext of the URL b
0b00: 65 69 6e 67 20 73 65 72 76 65 64 20 2a 2f 0a 20  eing served */. 
0b10: 20 63 68 61 72 20 2a 7a 54 6f 70 3b 20 20 20 20   char *zTop;    
0b20: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65           /* Pare
0b30: 6e 74 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20  nt directory of 
0b40: 7a 50 61 74 68 20 2a 2f 0a 20 20 63 6f 6e 73 74  zPath */.  const
0b50: 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 54   char *zContentT
0b60: 79 70 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e  ype;  /* The con
0b70: 74 65 6e 74 20 74 79 70 65 20 6f 66 20 74 68 65  tent type of the
0b80: 20 69 6e 70 75 74 20 48 54 54 50 20 72 65 71 75   input HTTP requ
0b90: 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 45 72  est */.  int iEr
0ba0: 72 50 72 69 6f 72 69 74 79 3b 20 20 20 20 20 20  rPriority;      
0bb0: 20 2f 2a 20 50 72 69 6f 72 69 74 79 20 6f 66 20   /* Priority of 
0bc0: 63 75 72 72 65 6e 74 20 65 72 72 6f 72 20 6d 65  current error me
0bd0: 73 73 61 67 65 20 2a 2f 0a 20 20 63 68 61 72 20  ssage */.  char 
0be0: 2a 7a 45 72 72 4d 73 67 3b 20 20 20 20 20 20 20  *zErrMsg;       
0bf0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 61 6e     /* Text of an
0c00: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a   error message *
0c10: 2f 0a 20 20 42 6c 6f 62 20 63 67 69 49 6e 3b 20  /.  Blob cgiIn; 
0c20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
0c30: 6e 70 75 74 20 74 6f 20 61 6e 20 78 66 65 72 20  nput to an xfer 
0c40: 77 77 77 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  www method */.  
0c50: 69 6e 74 20 63 67 69 50 61 6e 69 63 3b 20 20 20  int cgiPanic;   
0c60: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
0c70: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
0c80: 74 6f 20 43 47 49 20 2a 2f 0a 20 20 69 6e 74 20  to CGI */.  int 
0c90: 78 66 65 72 50 61 6e 69 63 3b 20 20 20 20 20 20  xferPanic;      
0ca0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 65 72 72      /* Write err
0cb0: 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 20 58  or messages in X
0cc0: 46 45 52 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a  FER protocol */.
0cd0: 20 20 69 6e 74 20 66 75 6c 6c 48 74 74 70 52 65    int fullHttpRe
0ce0: 70 6c 79 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  ply;      /* Tru
0cf0: 65 20 66 6f 72 20 66 75 6c 6c 20 48 54 54 50 20  e for full HTTP 
0d00: 72 65 70 6c 79 2e 20 20 46 61 6c 73 65 20 66 6f  reply.  False fo
0d10: 72 20 43 47 49 20 72 65 70 6c 79 20 2a 2f 0a 20  r CGI reply */. 
0d20: 20 54 68 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65   Th_Interp *inte
0d30: 72 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rp;      /* The 
0d40: 54 48 31 20 69 6e 74 65 72 70 72 65 74 65 72 20  TH1 interpreter 
0d50: 2a 2f 0a 20 20 46 49 4c 45 20 2a 68 74 74 70 49  */.  FILE *httpI
0d60: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
0d70: 41 63 63 65 70 74 20 48 54 54 50 20 69 6e 70 75  Accept HTTP inpu
0d80: 74 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 20  t from here */. 
0d90: 20 46 49 4c 45 20 2a 68 74 74 70 4f 75 74 3b 20   FILE *httpOut; 
0da0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6e 64           /* Send
0db0: 20 48 54 54 50 20 6f 75 74 70 75 74 20 68 65 72   HTTP output her
0dc0: 65 20 2a 2f 0a 20 20 69 6e 74 20 78 6c 69 6e 6b  e */.  int xlink
0dd0: 43 6c 75 73 74 65 72 4f 6e 6c 79 3b 20 20 20 2f  ClusterOnly;   /
0de0: 2a 20 53 65 74 20 77 68 65 6e 20 63 6c 6f 6e 69  * Set when cloni
0df0: 6e 67 2e 20 20 4f 6e 6c 79 20 70 72 6f 63 65 73  ng.  Only proces
0e00: 73 20 63 6c 75 73 74 65 72 73 20 2a 2f 0a 20 20  s clusters */.  
0e10: 69 6e 74 20 66 54 69 6d 65 46 6f 72 6d 61 74 3b  int fTimeFormat;
0e20: 20 20 20 20 20 20 20 20 2f 2a 20 31 20 66 6f 72          /* 1 for
0e30: 20 55 54 43 2e 20 20 32 20 66 6f 72 20 6c 6f 63   UTC.  2 for loc
0e40: 61 6c 74 69 6d 65 2e 20 20 30 20 6e 6f 74 20 79  altime.  0 not y
0e50: 65 74 20 73 65 6c 65 63 74 65 64 20 2a 2f 0a 20  et selected */. 
0e60: 20 69 6e 74 20 2a 61 43 6f 6d 6d 69 74 46 69 6c   int *aCommitFil
0e70: 65 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61  e;       /* Arra
0e80: 79 20 6f 66 20 66 69 6c 65 73 20 74 6f 20 62 65  y of files to be
0e90: 20 63 6f 6d 6d 69 74 74 65 64 20 2a 2f 0a 20 20   committed */.  
0ea0: 69 6e 74 20 6d 61 72 6b 50 72 69 76 61 74 65 3b  int markPrivate;
0eb0: 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e          /* All n
0ec0: 65 77 20 61 72 74 69 66 61 63 74 73 20 61 72 65  ew artifacts are
0ed0: 20 70 72 69 76 61 74 65 20 69 66 20 74 72 75 65   private if true
0ee0: 20 2a 2f 0a 0a 20 20 69 6e 74 20 75 72 6c 49 73   */..  int urlIs
0ef0: 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 2f  File;          /
0f00: 2a 20 54 72 75 65 20 69 66 20 61 20 22 66 69 6c  * True if a "fil
0f10: 65 3a 22 20 75 72 6c 20 2a 2f 0a 20 20 69 6e 74  e:" url */.  int
0f20: 20 75 72 6c 49 73 48 74 74 70 73 3b 20 20 20 20   urlIsHttps;    
0f30: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
0f40: 61 20 22 68 74 74 70 73 3a 22 20 75 72 6c 20 2a  a "https:" url *
0f50: 2f 0a 20 20 63 68 61 72 20 2a 75 72 6c 4e 61 6d  /.  char *urlNam
0f60: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48  e;          /* H
0f70: 6f 73 74 6e 61 6d 65 20 66 6f 72 20 68 74 74 70  ostname for http
0f80: 3a 20 6f 72 20 66 69 6c 65 6e 61 6d 65 20 66 6f  : or filename fo
0f90: 72 20 66 69 6c 65 3a 20 2a 2f 0a 20 20 63 68 61  r file: */.  cha
0fa0: 72 20 2a 75 72 6c 48 6f 73 74 6e 61 6d 65 3b 20  r *urlHostname; 
0fb0: 20 20 20 20 20 2f 2a 20 54 68 65 20 48 4f 53 54       /* The HOST
0fc0: 3a 20 70 61 72 61 6d 65 74 65 72 20 6f 6e 20 68  : parameter on h
0fd0: 74 74 70 20 68 65 61 64 65 72 73 20 2a 2f 0a 20  ttp headers */. 
0fe0: 20 63 68 61 72 20 2a 75 72 6c 50 72 6f 74 6f 63   char *urlProtoc
0ff0: 6f 6c 3b 20 20 20 20 20 20 2f 2a 20 22 68 74 74  ol;      /* "htt
1000: 70 22 20 6f 72 20 22 68 74 74 70 73 22 20 2a 2f  p" or "https" */
1010: 0a 20 20 69 6e 74 20 75 72 6c 50 6f 72 74 3b 20  .  int urlPort; 
1020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 43             /* TC
1030: 50 20 70 6f 72 74 20 6e 75 6d 62 65 72 20 66 6f  P port number fo
1040: 72 20 68 74 74 70 3a 20 6f 72 20 68 74 74 70 73  r http: or https
1050: 3a 20 2a 2f 0a 20 20 69 6e 74 20 75 72 6c 44 66  : */.  int urlDf
1060: 6c 74 50 6f 72 74 3b 20 20 20 20 20 20 20 20 2f  ltPort;        /
1070: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 70 6f  * The default po
1080: 72 74 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  rt for the given
1090: 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 63   protocol */.  c
10a0: 68 61 72 20 2a 75 72 6c 50 61 74 68 3b 20 20 20  har *urlPath;   
10b0: 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61         /* Pathna
10c0: 6d 65 20 66 6f 72 20 68 74 74 70 3a 20 2a 2f 0a  me for http: */.
10d0: 20 20 63 68 61 72 20 2a 75 72 6c 55 73 65 72 3b    char *urlUser;
10e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
10f0: 72 20 69 64 20 66 6f 72 20 68 74 74 70 3a 20 2a  r id for http: *
1100: 2f 0a 20 20 63 68 61 72 20 2a 75 72 6c 50 61 73  /.  char *urlPas
1110: 73 77 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 50  swd;        /* P
1120: 61 73 73 77 6f 72 64 20 66 6f 72 20 68 74 74 70  assword for http
1130: 3a 20 2a 2f 0a 20 20 63 68 61 72 20 2a 75 72 6c  : */.  char *url
1140: 43 61 6e 6f 6e 69 63 61 6c 3b 20 20 20 20 20 2f  Canonical;     /
1150: 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 72 65 70 72  * Canonical repr
1160: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
1170: 65 20 55 52 4c 20 2a 2f 0a 20 20 63 68 61 72 20  e URL */.  char 
1180: 2a 75 72 6c 50 72 6f 78 79 41 75 74 68 3b 20 20  *urlProxyAuth;  
1190: 20 20 20 2f 2a 20 50 72 6f 78 79 2d 41 75 74 68     /* Proxy-Auth
11a0: 6f 72 69 7a 65 72 3a 20 73 74 72 69 6e 67 20 2a  orizer: string *
11b0: 2f 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  /..  const char 
11c0: 2a 7a 4c 6f 67 69 6e 3b 20 20 20 20 20 2f 2a 20  *zLogin;     /* 
11d0: 4c 6f 67 69 6e 20 6e 61 6d 65 2e 20 20 22 22 20  Login name.  "" 
11e0: 69 66 20 6e 6f 74 20 6c 6f 67 67 65 64 20 69 6e  if not logged in
11f0: 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 50 73 77  . */.  int noPsw
1200: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
1210: 2a 20 4c 6f 67 67 65 64 20 69 6e 20 77 69 74 68  * Logged in with
1220: 6f 75 74 20 70 61 73 73 77 6f 72 64 20 28 6f 6e  out password (on
1230: 20 31 32 37 2e 30 2e 30 2e 31 29 20 2a 2f 0a 20   127.0.0.1) */. 
1240: 20 69 6e 74 20 75 73 65 72 55 69 64 3b 20 20 20   int userUid;   
1250: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
1260: 67 65 72 20 75 73 65 72 20 69 64 20 2a 2f 0a 0a  ger user id */..
1270: 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
1280: 20 75 73 65 64 20 74 6f 20 70 6f 70 75 6c 61 74   used to populat
1290: 65 20 74 68 65 20 52 43 56 46 52 4f 4d 20 74 61  e the RCVFROM ta
12a0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 76  ble */.  int rcv
12b0: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
12c0: 20 2f 2a 20 54 68 65 20 72 63 76 69 64 2e 20 20   /* The rcvid.  
12d0: 30 20 69 66 20 6e 6f 74 20 79 65 74 20 64 65 66  0 if not yet def
12e0: 69 6e 65 64 2e 20 2a 2f 0a 20 20 63 68 61 72 20  ined. */.  char 
12f0: 2a 7a 49 70 41 64 64 72 3b 20 20 20 20 20 20 20  *zIpAddr;       
1300: 20 20 20 2f 2a 20 54 68 65 20 72 65 6d 6f 74 65     /* The remote
1310: 20 49 50 20 61 64 64 72 65 73 73 20 2a 2f 0a 20   IP address */. 
1320: 20 63 68 61 72 20 2a 7a 4e 6f 6e 63 65 3b 20 20   char *zNonce;  
1330: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1340: 6e 6f 6e 63 65 20 75 73 65 64 20 66 6f 72 20 6c  nonce used for l
1350: 6f 67 69 6e 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20  ogin */.  .  /* 
1360: 70 65 72 6d 69 73 73 69 6f 6e 73 20 75 73 65 64  permissions used
1370: 20 62 79 20 74 68 65 20 73 65 72 76 65 72 20 2a   by the server *
1380: 2f 0a 20 20 69 6e 74 20 6f 6b 53 65 74 75 70 3b  /.  int okSetup;
1390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
13a0: 3a 20 75 73 65 20 53 65 74 75 70 20 73 63 72 65  : use Setup scre
13b0: 65 6e 73 20 6f 6e 20 77 65 62 20 69 6e 74 65 72  ens on web inter
13c0: 66 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b  face */.  int ok
13d0: 41 64 6d 69 6e 3b 20 20 20 20 20 20 20 20 20 20  Admin;          
13e0: 20 20 2f 2a 20 61 3a 20 61 64 6d 69 6e 69 73 74    /* a: administ
13f0: 72 61 74 69 76 65 20 70 65 72 6d 69 73 73 69 6f  rative permissio
1400: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b 44 65 6c  n */.  int okDel
1410: 65 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ete;           /
1420: 2a 20 64 3a 20 64 65 6c 65 74 65 20 77 69 6b 69  * d: delete wiki
1430: 20 6f 72 20 74 69 63 6b 65 74 73 20 2a 2f 0a 20   or tickets */. 
1440: 20 69 6e 74 20 6f 6b 50 61 73 73 77 6f 72 64 3b   int okPassword;
1450: 20 20 20 20 20 20 20 20 20 2f 2a 20 70 3a 20 63           /* p: c
1460: 68 61 6e 67 65 20 70 61 73 73 77 6f 72 64 20 2a  hange password *
1470: 2f 0a 20 20 69 6e 74 20 6f 6b 51 75 65 72 79 3b  /.  int okQuery;
1480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 71              /* q
1490: 3a 20 63 72 65 61 74 65 20 6e 65 77 20 72 65 70  : create new rep
14a0: 6f 72 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b  orts */.  int ok
14b0: 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
14c0: 20 20 2f 2a 20 69 3a 20 78 66 65 72 20 69 6e 62    /* i: xfer inb
14d0: 6f 75 6e 64 2e 20 63 68 65 63 6b 69 6e 20 2a 2f  ound. checkin */
14e0: 0a 20 20 69 6e 74 20 6f 6b 52 65 61 64 3b 20 20  .  int okRead;  
14f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 3a             /* o:
1500: 20 78 66 65 72 20 6f 75 74 62 6f 75 6e 64 2e 20   xfer outbound. 
1510: 63 68 65 63 6b 6f 75 74 20 2a 2f 0a 20 20 69 6e  checkout */.  in
1520: 74 20 6f 6b 48 69 73 74 6f 72 79 3b 20 20 20 20  t okHistory;    
1530: 20 20 20 20 20 20 2f 2a 20 68 3a 20 61 63 63 65        /* h: acce
1540: 73 73 20 68 69 73 74 6f 72 69 63 61 6c 20 69 6e  ss historical in
1550: 66 6f 72 6d 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  formation. */.  
1560: 69 6e 74 20 6f 6b 43 6c 6f 6e 65 3b 20 20 20 20  int okClone;    
1570: 20 20 20 20 20 20 20 20 2f 2a 20 67 3a 20 63 6c          /* g: cl
1580: 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b 52  one */.  int okR
1590: 64 57 69 6b 69 3b 20 20 20 20 20 20 20 20 20 20  dWiki;          
15a0: 20 2f 2a 20 6a 3a 20 76 69 65 77 20 77 69 6b 69   /* j: view wiki
15b0: 20 76 69 61 20 77 65 62 20 2a 2f 0a 20 20 69 6e   via web */.  in
15c0: 74 20 6f 6b 4e 65 77 57 69 6b 69 3b 20 20 20 20  t okNewWiki;    
15d0: 20 20 20 20 20 20 2f 2a 20 66 3a 20 63 72 65 61        /* f: crea
15e0: 74 65 20 6e 65 77 20 77 69 6b 69 20 76 69 61 20  te new wiki via 
15f0: 77 65 62 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b 41  web */.  int okA
1600: 70 6e 64 57 69 6b 69 3b 20 20 20 20 20 20 20 20  pndWiki;        
1610: 20 2f 2a 20 6d 3a 20 61 70 70 65 6e 64 20 74 6f   /* m: append to
1620: 20 77 69 6b 69 20 76 69 61 20 77 65 62 20 2a 2f   wiki via web */
1630: 0a 20 20 69 6e 74 20 6f 6b 57 72 57 69 6b 69 3b  .  int okWrWiki;
1640: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6b 3a             /* k:
1650: 20 65 64 69 74 20 77 69 6b 69 20 76 69 61 20 77   edit wiki via w
1660: 65 62 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b 52 64  eb */.  int okRd
1670: 54 6b 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tkt;            
1680: 2f 2a 20 72 3a 20 76 69 65 77 20 74 69 63 6b 65  /* r: view ticke
1690: 74 73 20 76 69 61 20 77 65 62 20 2a 2f 0a 20 20  ts via web */.  
16a0: 69 6e 74 20 6f 6b 4e 65 77 54 6b 74 3b 20 20 20  int okNewTkt;   
16b0: 20 20 20 20 20 20 20 20 2f 2a 20 6e 3a 20 63 72          /* n: cr
16c0: 65 61 74 65 20 6e 65 77 20 74 69 63 6b 65 74 73  eate new tickets
16d0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b 41 70 6e 64   */.  int okApnd
16e0: 54 6b 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Tkt;          /*
16f0: 20 63 3a 20 61 70 70 65 6e 64 20 74 6f 20 74 69   c: append to ti
1700: 63 6b 65 74 73 20 76 69 61 20 74 68 65 20 77 65  ckets via the we
1710: 62 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b 57 72 54  b */.  int okWrT
1720: 6b 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  kt;            /
1730: 2a 20 77 3a 20 6d 61 6b 65 20 63 68 61 6e 67 65  * w: make change
1740: 73 20 74 6f 20 74 69 63 6b 65 74 73 20 76 69 61  s to tickets via
1750: 20 77 65 62 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b   web */.  int ok
1760: 54 6b 74 46 6d 74 3b 20 20 20 20 20 20 20 20 20  TktFmt;         
1770: 20 20 2f 2a 20 74 3a 20 63 72 65 61 74 65 20 6e    /* t: create n
1780: 65 77 20 74 69 63 6b 65 74 20 72 65 70 6f 72 74  ew ticket report
1790: 20 66 6f 72 6d 61 74 73 20 2a 2f 0a 20 20 69 6e   formats */.  in
17a0: 74 20 6f 6b 52 64 41 64 64 72 3b 20 20 20 20 20  t okRdAddr;     
17b0: 20 20 20 20 20 20 2f 2a 20 65 3a 20 72 65 61 64        /* e: read
17c0: 20 65 6d 61 69 6c 20 61 64 64 72 65 73 73 65 73   email addresses
17d0: 20 6f 72 20 6f 74 68 65 72 20 70 72 69 76 61 74   or other privat
17e0: 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
17f0: 6f 6b 5a 69 70 3b 20 20 20 20 20 20 20 20 20 20  okZip;          
1800: 20 20 20 20 2f 2a 20 7a 3a 20 64 6f 77 6e 6c 6f      /* z: downlo
1810: 61 64 20 7a 69 70 70 65 64 20 61 72 74 69 66 61  ad zipped artifa
1820: 63 74 20 76 69 61 20 2f 7a 69 70 20 55 52 4c 20  ct via /zip URL 
1830: 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 64 65 66  */..  /* For def
1840: 65 6e 73 65 20 61 67 61 69 6e 73 74 20 43 72 6f  ense against Cro
1850: 73 73 2d 73 69 74 65 20 52 65 71 75 65 73 74 20  ss-site Request 
1860: 46 6f 72 67 65 72 79 20 61 74 74 61 63 6b 73 20  Forgery attacks 
1870: 2a 2f 0a 20 20 63 68 61 72 20 7a 43 73 72 66 54  */.  char zCsrfT
1880: 6f 6b 65 6e 5b 31 32 5d 3b 20 20 20 20 2f 2a 20  oken[12];    /* 
1890: 56 61 6c 75 65 20 6f 66 20 74 68 65 20 61 6e 74  Value of the ant
18a0: 69 2d 43 53 52 46 20 74 6f 6b 65 6e 20 2a 2f 0a  i-CSRF token */.
18b0: 20 20 69 6e 74 20 6f 6b 43 73 72 66 3b 20 20 20    int okCsrf;   
18c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 74            /* Ant
18d0: 69 2d 43 53 52 46 20 74 6f 6b 65 6e 20 69 73 20  i-CSRF token is 
18e0: 70 72 65 73 65 6e 74 20 61 6e 64 20 76 61 6c 69  present and vali
18f0: 64 20 2a 2f 0a 0a 20 20 46 49 4c 45 20 2a 66 44  d */..  FILE *fD
1900: 65 62 75 67 3b 20 20 20 20 20 20 20 20 20 20 20  ebug;           
1910: 2f 2a 20 57 72 69 74 65 20 64 65 62 75 67 20 69  /* Write debug i
1920: 6e 66 6f 72 6d 61 74 69 6f 6e 20 68 65 72 65 2c  nformation here,
1930: 20 69 66 20 74 68 65 20 66 69 6c 65 20 65 78 69   if the file exi
1940: 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20 74 68 54  sts */.  int thT
1950: 72 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  race;           
1960: 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61 62   /* True to enab
1970: 6c 65 20 54 48 31 20 64 65 62 75 67 67 69 6e 67  le TH1 debugging
1980: 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 42 6c 6f   output */.  Blo
1990: 62 20 74 68 4c 6f 67 3b 20 20 20 20 20 20 20 20  b thLog;        
19a0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
19b0: 74 68 65 20 54 48 31 20 64 65 62 75 67 67 69 6e  the TH1 debuggin
19c0: 67 20 6f 75 74 70 75 74 20 2a 2f 0a 0a 20 20 69  g output */..  i
19d0: 6e 74 20 69 73 48 6f 6d 65 3b 20 20 20 20 20 20  nt isHome;      
19e0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
19f0: 66 20 72 65 6e 64 65 72 69 6e 67 20 74 68 65 20  f rendering the 
1a00: 22 68 6f 6d 65 22 20 70 61 67 65 20 2a 2f 0a 0a  "home" page */..
1a10: 20 20 2f 2a 20 53 74 6f 72 61 67 65 20 66 6f 72    /* Storage for
1a20: 20 74 68 65 20 61 75 78 28 29 20 61 6e 64 2f 6f   the aux() and/o
1a30: 72 20 6f 70 74 69 6f 6e 28 29 20 53 51 4c 20 66  r option() SQL f
1a40: 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
1a50: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 75 78 3b  s */.  int nAux;
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1a80: 20 64 69 73 74 69 6e 63 74 20 61 75 78 28 29 20   distinct aux() 
1a90: 6f 72 20 6f 70 74 69 6f 6e 28 29 20 76 61 6c 75  or option() valu
1aa0: 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  es */.  const ch
1ab0: 61 72 20 2a 61 7a 41 75 78 4e 61 6d 65 5b 4d 58  ar *azAuxName[MX
1ac0: 5f 41 55 58 5d 3b 20 2f 2a 20 4e 61 6d 65 20 6f  _AUX]; /* Name o
1ad0: 66 20 65 61 63 68 20 61 75 78 28 29 20 6f 72 20  f each aux() or 
1ae0: 6f 70 74 69 6f 6e 28 29 20 76 61 6c 75 65 20 2a  option() value *
1af0: 2f 0a 20 20 63 68 61 72 20 2a 61 7a 41 75 78 50  /.  char *azAuxP
1b00: 61 72 61 6d 5b 4d 58 5f 41 55 58 5d 3b 20 20 20  aram[MX_AUX];   
1b10: 20 20 20 2f 2a 20 50 61 72 61 6d 20 6f 66 20 65     /* Param of e
1b20: 61 63 68 20 61 75 78 28 29 20 6f 72 20 6f 70 74  ach aux() or opt
1b30: 69 6f 6e 28 29 20 76 61 6c 75 65 20 2a 2f 0a 20  ion() value */. 
1b40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 41   const char *azA
1b50: 75 78 56 61 6c 5b 4d 58 5f 41 55 58 5d 3b 20 20  uxVal[MX_AUX];  
1b60: 2f 2a 20 56 61 6c 75 65 20 6f 66 20 65 61 63 68  /* Value of each
1b70: 20 61 75 78 28 29 20 6f 72 20 6f 70 74 69 6f 6e   aux() or option
1b80: 28 29 20 76 61 6c 75 65 20 2a 2f 0a 20 20 63 6f  () value */.  co
1b90: 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 41 75 78  nst char **azAux
1ba0: 4f 70 74 5b 4d 58 5f 41 55 58 5d 3b 20 2f 2a 20  Opt[MX_AUX]; /* 
1bb0: 4f 70 74 69 6f 6e 73 20 6f 66 20 65 61 63 68 20  Options of each 
1bc0: 6f 70 74 69 6f 6e 28 29 20 76 61 6c 75 65 20 2a  option() value *
1bd0: 2f 0a 20 20 69 6e 74 20 61 6e 41 75 78 43 6f 6c  /.  int anAuxCol
1be0: 73 5b 4d 58 5f 41 55 58 5d 3b 20 20 20 20 20 20  s[MX_AUX];      
1bf0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c00: 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 6f 70 74 69  columns for opti
1c10: 6f 6e 28 29 20 76 61 6c 75 65 73 20 2a 2f 0a 7d  on() values */.}
1c20: 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 20 66  ;../*.** Macro f
1c30: 6f 72 20 64 65 62 75 67 67 69 6e 67 3a 0a 2a 2f  or debugging:.*/
1c40: 0a 23 64 65 66 69 6e 65 20 43 47 49 44 45 42 55  .#define CGIDEBU
1c50: 47 28 58 29 20 20 69 66 28 20 67 2e 66 44 65 62  G(X)  if( g.fDeb
1c60: 75 67 20 29 20 63 67 69 5f 64 65 62 75 67 20 58  ug ) cgi_debug X
1c70: 0a 0a 23 65 6e 64 69 66 0a 0a 47 6c 6f 62 61 6c  ..#endif..Global
1c80: 20 67 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74   g;../*.** The t
1c90: 61 62 6c 65 20 6f 66 20 77 65 62 20 70 61 67 65  able of web page
1ca0: 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 74  s supported by t
1cb0: 68 69 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  his application 
1cc0: 69 73 20 67 65 6e 65 72 61 74 65 64 20 0a 2a 2a  is generated .**
1cd0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62   automatically b
1ce0: 79 20 74 68 65 20 22 6d 6b 69 6e 64 65 78 22 20  y the "mkindex" 
1cf0: 70 72 6f 67 72 61 6d 20 61 6e 64 20 77 72 69 74  program and writ
1d00: 74 65 6e 20 69 6e 74 6f 20 61 20 66 69 6c 65 0a  ten into a file.
1d10: 2a 2a 20 6e 61 6d 65 64 20 22 70 61 67 65 5f 69  ** named "page_i
1d20: 6e 64 65 78 2e 68 22 2e 20 20 57 65 20 69 6e 63  ndex.h".  We inc
1d30: 6c 75 64 65 20 74 68 61 74 20 66 69 6c 65 20 68  lude that file h
1d40: 65 72 65 20 74 6f 20 67 65 74 20 61 63 63 65 73  ere to get acces
1d50: 73 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c  s.** to the tabl
1d60: 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  e..*/.#include "
1d70: 70 61 67 65 5f 69 6e 64 65 78 2e 68 22 0a 0a 2f  page_index.h"../
1d80: 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20  *.** Search for 
1d90: 61 20 66 75 6e 63 74 69 6f 6e 20 77 68 6f 73 65  a function whose
1da0: 20 6e 61 6d 65 20 6d 61 74 63 68 65 73 20 7a 4e   name matches zN
1db0: 61 6d 65 2e 20 20 57 72 69 74 65 20 61 20 70 6f  ame.  Write a po
1dc0: 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74  inter to.** that
1dd0: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 74 6f 20 2a   function into *
1de0: 70 78 46 75 6e 63 20 61 6e 64 20 72 65 74 75 72  pxFunc and retur
1df0: 6e 20 30 2e 20 20 49 66 20 6e 6f 20 6d 61 74 63  n 0.  If no matc
1e00: 68 20 69 73 20 66 6f 75 6e 64 2c 0a 2a 2a 20 72  h is found,.** r
1e10: 65 74 75 72 6e 20 31 2e 20 20 49 66 20 74 68 65  eturn 1.  If the
1e20: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 61 6d 62 69   command is ambi
1e30: 67 75 6f 75 73 20 72 65 74 75 72 6e 20 32 3b 0a  guous return 2;.
1e40: 2a 2a 0a 2a 2a 20 54 68 65 20 4e 61 6d 65 4d 61  **.** The NameMa
1e50: 70 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  p structure and 
1e60: 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 61 72  the tables we ar
1e70: 65 20 73 65 61 72 63 68 69 6e 67 20 61 67 61 69  e searching agai
1e80: 6e 73 74 20 61 72 65 0a 2a 2a 20 64 65 66 69 6e  nst are.** defin
1e90: 65 64 20 69 6e 20 74 68 65 20 70 61 67 65 5f 69  ed in the page_i
1ea0: 6e 64 65 78 2e 68 20 68 65 61 64 65 72 20 66 69  ndex.h header fi
1eb0: 6c 65 20 77 68 69 63 68 20 69 73 20 61 75 74 6f  le which is auto
1ec0: 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 67 65 6e  matically.** gen
1ed0: 65 72 61 74 65 64 20 62 79 20 6d 6b 69 6e 64 65  erated by mkinde
1ee0: 78 2e 63 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  x.c program..*/.
1ef0: 73 74 61 74 69 63 20 69 6e 74 20 6e 61 6d 65 5f  static int name_
1f00: 73 65 61 72 63 68 28 0a 20 20 63 6f 6e 73 74 20  search(.  const 
1f10: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
1f20: 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 77     /* The name w
1f30: 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f  e are looking fo
1f40: 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 4e 61 6d  r */.  const Nam
1f50: 65 4d 61 70 20 2a 61 4d 61 70 2c 20 20 20 20 20  eMap *aMap,     
1f60: 2f 2a 20 53 65 61 72 63 68 20 69 6e 20 74 68 69  /* Search in thi
1f70: 73 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  s array */.  int
1f80: 20 6e 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20   nMap,          
1f90: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1fa0: 6f 66 20 73 6c 6f 74 73 20 69 6e 20 61 4d 61 70  of slots in aMap
1fb0: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 6e  [] */.  int *pIn
1fc0: 64 65 78 20 20 20 20 20 20 20 20 20 20 20 20 20  dex             
1fd0: 20 2f 2a 20 4f 55 54 3a 20 54 68 65 20 69 6e 64   /* OUT: The ind
1fe0: 65 78 20 69 6e 20 61 4d 61 70 5b 5d 20 6f 66 20  ex in aMap[] of 
1ff0: 74 68 65 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a  the match */.){.
2000: 20 20 69 6e 74 20 75 70 72 2c 20 6c 77 72 2c 20    int upr, lwr, 
2010: 63 6e 74 2c 20 6d 2c 20 69 3b 0a 20 20 69 6e 74  cnt, m, i;.  int
2020: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d   n = strlen(zNam
2030: 65 29 3b 0a 20 20 6c 77 72 20 3d 20 30 3b 0a 20  e);.  lwr = 0;. 
2040: 20 75 70 72 20 3d 20 6e 4d 61 70 2d 31 3b 0a 20   upr = nMap-1;. 
2050: 20 77 68 69 6c 65 28 20 6c 77 72 3c 3d 75 70 72   while( lwr<=upr
2060: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 64 2c   ){.    int mid,
2070: 20 63 3b 0a 20 20 20 20 6d 69 64 20 3d 20 28 75   c;.    mid = (u
2080: 70 72 2b 6c 77 72 29 2f 32 3b 0a 20 20 20 20 63  pr+lwr)/2;.    c
2090: 20 3d 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c   = strcmp(zName,
20a0: 20 61 4d 61 70 5b 6d 69 64 5d 2e 7a 4e 61 6d 65   aMap[mid].zName
20b0: 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 30 20  );.    if( c==0 
20c0: 29 7b 0a 20 20 20 20 20 20 2a 70 49 6e 64 65 78  ){.      *pIndex
20d0: 20 3d 20 6d 69 64 3b 0a 20 20 20 20 20 20 72 65   = mid;.      re
20e0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73  turn 0;.    }els
20f0: 65 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20  e if( c<0 ){.   
2100: 20 20 20 75 70 72 20 3d 20 6d 69 64 20 2d 20 31     upr = mid - 1
2110: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2120: 20 20 20 6c 77 72 20 3d 20 6d 69 64 20 2b 20 31     lwr = mid + 1
2130: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
2140: 72 28 6d 3d 63 6e 74 3d 30 2c 20 69 3d 75 70 72  r(m=cnt=0, i=upr
2150: 2d 32 3b 20 69 3c 3d 75 70 72 2b 33 20 26 26 20  -2; i<=upr+3 && 
2160: 69 3c 6e 4d 61 70 3b 20 69 2b 2b 29 7b 0a 20 20  i<nMap; i++){.  
2170: 20 20 69 66 28 20 69 3c 30 20 29 20 63 6f 6e 74    if( i<0 ) cont
2180: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 74  inue;.    if( st
2190: 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 4d 61  rncmp(zName, aMa
21a0: 70 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3d 3d  p[i].zName, n)==
21b0: 30 20 29 7b 0a 20 20 20 20 20 20 6d 20 3d 20 69  0 ){.      m = i
21c0: 3b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  ;.      cnt++;. 
21d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 63     }.  }.  if( c
21e0: 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 2a 70 49  nt==1 ){.    *pI
21f0: 6e 64 65 78 20 3d 20 6d 3b 0a 20 20 20 20 72 65  ndex = m;.    re
2200: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
2210: 74 75 72 6e 20 31 2b 28 63 6e 74 3e 31 29 3b 0a  turn 1+(cnt>1);.
2220: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 70  }.../*.** This p
2230: 72 6f 63 65 64 75 72 65 20 72 75 6e 73 20 66 69  rocedure runs fi
2240: 72 73 74 2e 0a 2a 2f 0a 69 6e 74 20 6d 61 69 6e  rst..*/.int main
2250: 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20  (int argc, char 
2260: 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74  **argv){.  const
2270: 20 63 68 61 72 20 2a 7a 43 6d 64 4e 61 6d 65 3b   char *zCmdName;
2280: 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e  .  int idx;.  in
2290: 74 20 72 63 3b 0a 0a 20 20 67 2e 6e 6f 77 20 3d  t rc;..  g.now =
22a0: 20 74 69 6d 65 28 30 29 3b 0a 20 20 67 2e 61 72   time(0);.  g.ar
22b0: 67 63 20 3d 20 61 72 67 63 3b 0a 20 20 67 2e 61  gc = argc;.  g.a
22c0: 72 67 76 20 3d 20 61 72 67 76 3b 0a 20 20 69 66  rgv = argv;.  if
22d0: 28 20 67 65 74 65 6e 76 28 22 47 41 54 45 57 41  ( getenv("GATEWA
22e0: 59 5f 49 4e 54 45 52 46 41 43 45 22 29 21 3d 30  Y_INTERFACE")!=0
22f0: 20 29 7b 0a 20 20 20 20 7a 43 6d 64 4e 61 6d 65   ){.    zCmdName
2300: 20 3d 20 22 63 67 69 22 3b 0a 20 20 7d 65 6c 73   = "cgi";.  }els
2310: 65 20 69 66 28 20 61 72 67 63 3c 32 20 29 7b 0a  e if( argc<2 ){.
2320: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
2330: 72 72 2c 20 22 55 73 61 67 65 3a 20 25 73 20 43  rr, "Usage: %s C
2340: 4f 4d 4d 41 4e 44 20 2e 2e 2e 5c 6e 22 2c 20 61  OMMAND ...\n", a
2350: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 65 78 69  rgv[0]);.    exi
2360: 74 28 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  t(1);.  }else{. 
2370: 20 20 20 67 2e 66 51 75 69 65 74 20 3d 20 66 69     g.fQuiet = fi
2380: 6e 64 5f 6f 70 74 69 6f 6e 28 22 71 75 69 65 74  nd_option("quiet
2390: 22 2c 20 30 2c 20 30 29 21 3d 30 3b 0a 20 20 20  ", 0, 0)!=0;.   
23a0: 20 67 2e 66 53 71 6c 54 72 61 63 65 20 3d 20 66   g.fSqlTrace = f
23b0: 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 73 71 6c 74  ind_option("sqlt
23c0: 72 61 63 65 22 2c 20 30 2c 20 30 29 21 3d 30 3b  race", 0, 0)!=0;
23d0: 0a 20 20 20 20 67 2e 66 53 71 6c 50 72 69 6e 74  .    g.fSqlPrint
23e0: 20 3d 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22   = find_option("
23f0: 73 71 6c 70 72 69 6e 74 22 2c 20 30 2c 20 30 29  sqlprint", 0, 0)
2400: 21 3d 30 3b 0a 20 20 20 20 67 2e 66 48 74 74 70  !=0;.    g.fHttp
2410: 54 72 61 63 65 20 3d 20 66 69 6e 64 5f 6f 70 74  Trace = find_opt
2420: 69 6f 6e 28 22 68 74 74 70 74 72 61 63 65 22 2c  ion("httptrace",
2430: 20 30 2c 20 30 29 21 3d 30 3b 0a 20 20 20 20 67   0, 0)!=0;.    g
2440: 2e 7a 4c 6f 67 69 6e 20 3d 20 66 69 6e 64 5f 6f  .zLogin = find_o
2450: 70 74 69 6f 6e 28 22 75 73 65 72 22 2c 20 22 55  ption("user", "U
2460: 22 2c 20 31 29 3b 0a 20 20 20 20 7a 43 6d 64 4e  ", 1);.    zCmdN
2470: 61 6d 65 20 3d 20 61 72 67 76 5b 31 5d 3b 0a 20  ame = argv[1];. 
2480: 20 7d 0a 20 20 72 63 20 3d 20 6e 61 6d 65 5f 73   }.  rc = name_s
2490: 65 61 72 63 68 28 7a 43 6d 64 4e 61 6d 65 2c 20  earch(zCmdName, 
24a0: 61 43 6f 6d 6d 61 6e 64 2c 20 63 6f 75 6e 74 28  aCommand, count(
24b0: 61 43 6f 6d 6d 61 6e 64 29 2c 20 26 69 64 78 29  aCommand), &idx)
24c0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 31 20 29 7b  ;.  if( rc==1 ){
24d0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
24e0: 65 72 72 2c 22 25 73 3a 20 75 6e 6b 6e 6f 77 6e  err,"%s: unknown
24f0: 20 63 6f 6d 6d 61 6e 64 3a 20 25 73 5c 6e 22 0a   command: %s\n".
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 20 20 22 25 73 3a 20 75 73 65 20 5c 22 68 65     "%s: use \"he
2520: 6c 70 5c 22 20 66 6f 72 20 6d 6f 72 65 20 69 6e  lp\" for more in
2530: 66 6f 72 6d 61 74 69 6f 6e 5c 6e 22 2c 0a 20 20  formation\n",.  
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2550: 20 61 72 67 76 5b 30 5d 2c 20 7a 43 6d 64 4e 61   argv[0], zCmdNa
2560: 6d 65 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20  me, argv[0]);.  
2570: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65    return 1;.  }e
2580: 6c 73 65 20 69 66 28 20 72 63 3d 3d 32 20 29 7b  lse if( rc==2 ){
2590: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
25a0: 65 72 72 2c 22 25 73 3a 20 61 6d 62 69 67 75 6f  err,"%s: ambiguo
25b0: 75 73 20 63 6f 6d 6d 61 6e 64 20 70 72 65 66 69  us command prefi
25c0: 78 3a 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 20  x: %s\n".       
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73 3a              "%s:
25e0: 20 75 73 65 20 5c 22 68 65 6c 70 5c 22 20 66 6f   use \"help\" fo
25f0: 72 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69  r more informati
2600: 6f 6e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  on\n",.         
2610: 20 20 20 20 20 20 20 20 20 20 61 72 67 76 5b 30            argv[0
2620: 5d 2c 20 7a 43 6d 64 4e 61 6d 65 2c 20 61 72 67  ], zCmdName, arg
2630: 76 5b 30 5d 29 3b 0a 20 20 20 20 72 65 74 75 72  v[0]);.    retur
2640: 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 43 6f 6d 6d  n 1;.  }.  aComm
2650: 61 6e 64 5b 69 64 78 5d 2e 78 46 75 6e 63 28 29  and[idx].xFunc()
2660: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
2670: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20  ./*.** Print an 
2680: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2c 20 72  error message, r
2690: 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74 61  ollback all data
26a0: 62 61 73 65 73 2c 20 61 6e 64 20 71 75 69 74 2e  bases, and quit.
26b0: 0a 2a 2f 0a 76 6f 69 64 20 66 6f 73 73 69 6c 5f  .*/.void fossil_
26c0: 70 61 6e 69 63 28 63 6f 6e 73 74 20 63 68 61 72  panic(const char
26d0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
26e0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 76 61  .  char *z;.  va
26f0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 73 74 61 74  _list ap;.  stat
2700: 69 63 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b  ic int once = 1;
2710: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
2720: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20  zFormat);.  z = 
2730: 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74  vmprintf(zFormat
2740: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
2750: 61 70 29 3b 0a 20 20 69 66 28 20 67 2e 63 67 69  ap);.  if( g.cgi
2760: 50 61 6e 69 63 20 26 26 20 6f 6e 63 65 20 29 7b  Panic && once ){
2770: 0a 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20  .    once = 0;. 
2780: 20 20 20 63 67 69 5f 70 72 69 6e 74 66 28 22 3c     cgi_printf("<
2790: 70 3e 3c 66 6f 6e 74 20 63 6f 6c 6f 72 3d 5c 22  p><font color=\"
27a0: 72 65 64 5c 22 3e 25 68 3c 2f 66 6f 6e 74 3e 3c  red\">%h</font><
27b0: 2f 70 3e 22 2c 20 7a 29 3b 0a 20 20 20 20 63 67  /p>", z);.    cg
27c0: 69 5f 72 65 70 6c 79 28 29 3b 0a 20 20 7d 65 6c  i_reply();.  }el
27d0: 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  se{.    fprintf(
27e0: 73 74 64 65 72 72 2c 20 22 25 73 3a 20 25 73 5c  stderr, "%s: %s\
27f0: 6e 22 2c 20 67 2e 61 72 67 76 5b 30 5d 2c 20 7a  n", g.argv[0], z
2800: 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 6f 72 63  );.  }.  db_forc
2810: 65 5f 72 6f 6c 6c 62 61 63 6b 28 29 3b 0a 20 20  e_rollback();.  
2820: 65 78 69 74 28 31 29 3b 0a 7d 0a 76 6f 69 64 20  exit(1);.}.void 
2830: 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 63 6f 6e  fossil_fatal(con
2840: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
2850: 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a  , ...){.  char *
2860: 7a 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  z;.  va_list ap;
2870: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
2880: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20  zFormat);.  z = 
2890: 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74  vmprintf(zFormat
28a0: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
28b0: 61 70 29 3b 0a 20 20 69 66 28 20 67 2e 63 67 69  ap);.  if( g.cgi
28c0: 50 61 6e 69 63 20 29 7b 0a 20 20 20 20 67 2e 63  Panic ){.    g.c
28d0: 67 69 50 61 6e 69 63 20 3d 20 30 3b 0a 20 20 20  giPanic = 0;.   
28e0: 20 63 67 69 5f 70 72 69 6e 74 66 28 22 3c 70 3e   cgi_printf("<p>
28f0: 3c 66 6f 6e 74 20 63 6f 6c 6f 72 3d 5c 22 72 65  <font color=\"re
2900: 64 5c 22 3e 25 68 3c 2f 66 6f 6e 74 3e 3c 2f 70  d\">%h</font></p
2910: 3e 22 2c 20 7a 29 3b 0a 20 20 20 20 63 67 69 5f  >", z);.    cgi_
2920: 72 65 70 6c 79 28 29 3b 0a 20 20 7d 65 6c 73 65  reply();.  }else
2930: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
2940: 64 65 72 72 2c 20 22 25 73 3a 20 25 73 5c 6e 22  derr, "%s: %s\n"
2950: 2c 20 67 2e 61 72 67 76 5b 30 5d 2c 20 7a 29 3b  , g.argv[0], z);
2960: 0a 20 20 7d 0a 20 20 64 62 5f 66 6f 72 63 65 5f  .  }.  db_force_
2970: 72 6f 6c 6c 62 61 63 6b 28 29 3b 0a 20 20 65 78  rollback();.  ex
2980: 69 74 28 31 29 3b 0a 7d 0a 76 6f 69 64 20 66 6f  it(1);.}.void fo
2990: 73 73 69 6c 5f 77 61 72 6e 69 6e 67 28 63 6f 6e  ssil_warning(con
29a0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
29b0: 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a  , ...){.  char *
29c0: 7a 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  z;.  va_list ap;
29d0: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
29e0: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20  zFormat);.  z = 
29f0: 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74  vmprintf(zFormat
2a00: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
2a10: 61 70 29 3b 0a 20 20 69 66 28 20 67 2e 63 67 69  ap);.  if( g.cgi
2a20: 50 61 6e 69 63 20 29 7b 0a 20 20 20 20 63 67 69  Panic ){.    cgi
2a30: 5f 70 72 69 6e 74 66 28 22 3c 70 3e 3c 66 6f 6e  _printf("<p><fon
2a40: 74 20 63 6f 6c 6f 72 3d 5c 22 72 65 64 5c 22 3e  t color=\"red\">
2a50: 25 68 3c 2f 66 6f 6e 74 3e 3c 2f 70 3e 22 2c 20  %h</font></p>", 
2a60: 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  z);.  }else{.   
2a70: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
2a80: 20 22 25 73 3a 20 25 73 5c 6e 22 2c 20 67 2e 61   "%s: %s\n", g.a
2a90: 72 67 76 5b 30 5d 2c 20 7a 29 3b 0a 20 20 7d 0a  rgv[0], z);.  }.
2aa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  }../*.** Print a
2ab0: 20 75 73 61 67 65 20 63 6f 6d 6d 65 6e 74 20 61   usage comment a
2ac0: 6e 64 20 71 75 69 74 0a 2a 2f 0a 76 6f 69 64 20  nd quit.*/.void 
2ad0: 75 73 61 67 65 28 63 6f 6e 73 74 20 63 68 61 72  usage(const char
2ae0: 20 2a 7a 46 6f 72 6d 61 74 29 7b 0a 20 20 66 70   *zFormat){.  fp
2af0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2b00: 73 61 67 65 3a 20 25 73 20 25 73 20 25 73 5c 6e  sage: %s %s %s\n
2b10: 22 2c 20 67 2e 61 72 67 76 5b 30 5d 2c 20 67 2e  ", g.argv[0], g.
2b20: 61 72 67 76 5b 31 5d 2c 20 7a 46 6f 72 6d 61 74  argv[1], zFormat
2b30: 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a  );.  exit(1);.}.
2b40: 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 6e 20  ./*.** Remove n 
2b50: 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 20 67 2e  elements from g.
2b60: 61 72 67 76 20 62 65 67 69 6e 6e 69 6e 67 20 77  argv beginning w
2b70: 69 74 68 20 74 68 65 20 69 2d 74 68 20 65 6c 65  ith the i-th ele
2b80: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 72 65  ment..*/.void re
2b90: 6d 6f 76 65 5f 66 72 6f 6d 5f 61 72 67 76 28 69  move_from_argv(i
2ba0: 6e 74 20 69 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  nt i, int n){.  
2bb0: 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 69  int j;.  for(j=i
2bc0: 2b 6e 3b 20 6a 3c 67 2e 61 72 67 63 3b 20 69 2b  +n; j<g.argc; i+
2bd0: 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 67 2e 61  +, j++){.    g.a
2be0: 72 67 76 5b 69 5d 20 3d 20 67 2e 61 72 67 76 5b  rgv[i] = g.argv[
2bf0: 6a 5d 3b 0a 20 20 7d 0a 20 20 67 2e 61 72 67 63  j];.  }.  g.argc
2c00: 20 3d 20 69 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = i;.}.../*.** 
2c10: 4c 6f 6f 6b 20 66 6f 72 20 61 20 63 6f 6d 6d 61  Look for a comma
2c20: 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 2e 20  nd-line option. 
2c30: 20 49 66 20 70 72 65 73 65 6e 74 2c 20 72 65 74   If present, ret
2c40: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a  urn a pointer..*
2c50: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
2c60: 20 6d 69 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   missing..**.** 
2c70: 68 61 73 41 72 67 3d 3d 30 20 6d 65 61 6e 73 20  hasArg==0 means 
2c80: 74 68 65 20 6f 70 74 69 6f 6e 20 69 73 20 61 20  the option is a 
2c90: 66 6c 61 67 2e 20 20 49 74 20 69 73 20 65 69 74  flag.  It is eit
2ca0: 68 65 72 20 70 72 65 73 65 6e 74 20 6f 72 20 6e  her present or n
2cb0: 6f 74 2e 0a 2a 2a 20 68 61 73 41 72 67 3d 3d 31  ot..** hasArg==1
2cc0: 20 6d 65 61 6e 73 20 74 68 65 20 6f 70 74 69 6f   means the optio
2cd0: 6e 20 68 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  n has an argumen
2ce0: 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  t.  Return a poi
2cf0: 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 61  nter to the.** a
2d00: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73  rgument..*/.cons
2d10: 74 20 63 68 61 72 20 2a 66 69 6e 64 5f 6f 70 74  t char *find_opt
2d20: 69 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ion(const char *
2d30: 7a 4c 6f 6e 67 2c 20 63 6f 6e 73 74 20 63 68 61  zLong, const cha
2d40: 72 20 2a 7a 53 68 6f 72 74 2c 20 69 6e 74 20 68  r *zShort, int h
2d50: 61 73 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b  asArg){.  int i;
2d60: 0a 20 20 69 6e 74 20 6e 4c 6f 6e 67 3b 0a 20 20  .  int nLong;.  
2d70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 74  const char *zRet
2d80: 75 72 6e 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  urn = 0;.  asser
2d90: 74 28 20 68 61 73 41 72 67 3d 3d 30 20 7c 7c 20  t( hasArg==0 || 
2da0: 68 61 73 41 72 67 3d 3d 31 20 29 3b 0a 20 20 6e  hasArg==1 );.  n
2db0: 4c 6f 6e 67 20 3d 20 73 74 72 6c 65 6e 28 7a 4c  Long = strlen(zL
2dc0: 6f 6e 67 29 3b 0a 20 20 66 6f 72 28 69 3d 32 3b  ong);.  for(i=2;
2dd0: 20 69 3c 67 2e 61 72 67 63 3b 20 69 2b 2b 29 7b   i<g.argc; i++){
2de0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  .    char *z;.  
2df0: 20 20 69 66 20 28 69 2b 68 61 73 41 72 67 20 3e    if (i+hasArg >
2e00: 3d 20 67 2e 61 72 67 63 29 20 62 72 65 61 6b 3b  = g.argc) break;
2e10: 0a 20 20 20 20 7a 20 3d 20 67 2e 61 72 67 76 5b  .    z = g.argv[
2e20: 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d  i];.    if( z[0]
2e30: 21 3d 27 2d 27 20 29 20 63 6f 6e 74 69 6e 75 65  !='-' ) continue
2e40: 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69  ;.    z++;.    i
2e50: 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a  f( z[0]=='-' ){.
2e60: 20 20 20 20 20 20 69 66 28 20 7a 5b 31 5d 3d 3d        if( z[1]==
2e70: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6d  0 ){.        rem
2e80: 6f 76 65 5f 66 72 6f 6d 5f 61 72 67 76 28 69 2c  ove_from_argv(i,
2e90: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   1);.        bre
2ea0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2eb0: 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20    z++;.    }.   
2ec0: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 2c 7a   if( strncmp(z,z
2ed0: 4c 6f 6e 67 2c 6e 4c 6f 6e 67 29 3d 3d 30 20 29  Long,nLong)==0 )
2ee0: 7b 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 41  {.      if( hasA
2ef0: 72 67 20 26 26 20 7a 5b 6e 4c 6f 6e 67 5d 3d 3d  rg && z[nLong]==
2f00: 27 3d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  '=' ){.        z
2f10: 52 65 74 75 72 6e 20 3d 20 26 7a 5b 6e 4c 6f 6e  Return = &z[nLon
2f20: 67 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 72 65  g+1];.        re
2f30: 6d 6f 76 65 5f 66 72 6f 6d 5f 61 72 67 76 28 69  move_from_argv(i
2f40: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72  , 1);.        br
2f50: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
2f60: 20 69 66 28 20 7a 5b 6e 4c 6f 6e 67 5d 3d 3d 30   if( z[nLong]==0
2f70: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74   ){.        zRet
2f80: 75 72 6e 20 3d 20 67 2e 61 72 67 76 5b 69 2b 68  urn = g.argv[i+h
2f90: 61 73 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20  asArg];.        
2fa0: 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 61 72 67 76  remove_from_argv
2fb0: 28 69 2c 20 31 2b 68 61 73 41 72 67 29 3b 0a 20  (i, 1+hasArg);. 
2fc0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2fd0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
2fe0: 69 66 28 20 7a 53 68 6f 72 74 21 3d 30 20 26 26  if( zShort!=0 &&
2ff0: 20 73 74 72 63 6d 70 28 7a 2c 7a 53 68 6f 72 74   strcmp(z,zShort
3000: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 52  )==0 ){.      zR
3010: 65 74 75 72 6e 20 3d 20 67 2e 61 72 67 76 5b 69  eturn = g.argv[i
3020: 2b 68 61 73 41 72 67 5d 3b 0a 20 20 20 20 20 20  +hasArg];.      
3030: 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 61 72 67 76  remove_from_argv
3040: 28 69 2c 20 31 2b 68 61 73 41 72 67 29 3b 0a 20  (i, 1+hasArg);. 
3050: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3060: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  }.  }.  return z
3070: 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Return;.}../*.**
3080: 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
3090: 72 65 20 61 72 65 20 6e 6f 20 75 6e 70 72 6f 63  re are no unproc
30a0: 65 73 73 65 64 20 63 6f 6d 6d 61 6e 64 2d 6c 69  essed command-li
30b0: 6e 65 20 6f 70 74 69 6f 6e 73 2e 20 20 49 66 0a  ne options.  If.
30c0: 2a 2a 20 41 6e 79 20 72 65 6d 61 69 6e 69 6e 67  ** Any remaining
30d0: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72   command-line ar
30e0: 67 75 6d 65 6e 74 20 62 65 67 69 6e 73 20 77 69  gument begins wi
30f0: 74 68 20 22 2d 22 20 70 72 69 6e 74 0a 2a 2a 20  th "-" print.** 
3100: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
3110: 20 61 6e 64 20 71 75 69 74 2e 0a 2a 2f 0a 76 6f   and quit..*/.vo
3120: 69 64 20 76 65 72 69 66 79 5f 61 6c 6c 5f 6f 70  id verify_all_op
3130: 74 69 6f 6e 73 28 76 6f 69 64 29 7b 0a 20 20 69  tions(void){.  i
3140: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  nt i;.  for(i=1;
3150: 20 69 3c 67 2e 61 72 67 63 3b 20 69 2b 2b 29 7b   i<g.argc; i++){
3160: 0a 20 20 20 20 69 66 28 20 67 2e 61 72 67 76 5b  .    if( g.argv[
3170: 69 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20  i][0]=='-' ){.  
3180: 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c      fossil_fatal
3190: 28 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 63  ("unrecognized c
31a0: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69  ommand-line opti
31b0: 6f 6e 2c 20 6f 72 20 6d 69 73 73 69 6e 67 20 61  on, or missing a
31c0: 72 67 75 6d 65 6e 74 3a 20 25 73 22 2c 20 67 2e  rgument: %s", g.
31d0: 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  argv[i]);.    }.
31e0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69    }.}../*.** Pri
31f0: 6e 74 20 61 20 6c 69 73 74 20 6f 66 20 77 6f 72  nt a list of wor
3200: 64 73 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 63  ds in multiple c
3210: 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  olumns..*/.stati
3220: 63 20 76 6f 69 64 20 6d 75 6c 74 69 5f 63 6f 6c  c void multi_col
3230: 75 6d 6e 5f 6c 69 73 74 28 63 6f 6e 73 74 20 63  umn_list(const c
3240: 68 61 72 20 2a 2a 61 7a 57 6f 72 64 2c 20 69 6e  har **azWord, in
3250: 74 20 6e 57 6f 72 64 29 7b 0a 20 20 69 6e 74 20  t nWord){.  int 
3260: 69 2c 20 6a 2c 20 6c 65 6e 3b 0a 20 20 69 6e 74  i, j, len;.  int
3270: 20 6d 78 4c 65 6e 20 3d 20 30 3b 0a 20 20 69 6e   mxLen = 0;.  in
3280: 74 20 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e 52  t nCol;.  int nR
3290: 6f 77 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ow;.  for(i=0; i
32a0: 3c 6e 57 6f 72 64 3b 20 69 2b 2b 29 7b 0a 20 20  <nWord; i++){.  
32b0: 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 61    len = strlen(a
32c0: 7a 57 6f 72 64 5b 69 5d 29 3b 0a 20 20 20 20 69  zWord[i]);.    i
32d0: 66 28 20 6c 65 6e 3e 6d 78 4c 65 6e 20 29 20 6d  f( len>mxLen ) m
32e0: 78 4c 65 6e 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a  xLen = len;.  }.
32f0: 20 20 6e 43 6f 6c 20 3d 20 38 30 2f 28 6d 78 4c    nCol = 80/(mxL
3300: 65 6e 2b 32 29 3b 0a 20 20 69 66 28 20 6e 43 6f  en+2);.  if( nCo
3310: 6c 3d 3d 30 20 29 20 6e 43 6f 6c 20 3d 20 31 3b  l==0 ) nCol = 1;
3320: 0a 20 20 6e 52 6f 77 20 3d 20 28 6e 57 6f 72 64  .  nRow = (nWord
3330: 20 2b 20 6e 43 6f 6c 20 2d 20 31 29 2f 6e 43 6f   + nCol - 1)/nCo
3340: 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  l;.  for(i=0; i<
3350: 6e 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nRow; i++){.    
3360: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 61  const char *zSpa
3370: 63 65 72 20 3d 20 22 22 3b 0a 20 20 20 20 66 6f  cer = "";.    fo
3380: 72 28 6a 3d 69 3b 20 6a 3c 6e 57 6f 72 64 3b 20  r(j=i; j<nWord; 
3390: 6a 2b 3d 6e 52 6f 77 29 7b 0a 20 20 20 20 20 20  j+=nRow){.      
33a0: 70 72 69 6e 74 66 28 22 25 73 25 2d 2a 73 22 2c  printf("%s%-*s",
33b0: 20 7a 53 70 61 63 65 72 2c 20 6d 78 4c 65 6e 2c   zSpacer, mxLen,
33c0: 20 61 7a 57 6f 72 64 5b 6a 5d 29 3b 0a 20 20 20   azWord[j]);.   
33d0: 20 20 20 7a 53 70 61 63 65 72 20 3d 20 22 20 20     zSpacer = "  
33e0: 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69  ";.    }.    pri
33f0: 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d  ntf("\n");.  }.}
3400: 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 20 4d 41 4e 44  ../*.** COM MAND
3410: 3a 20 63 6f 6d 6d 61 6e 64 73 0a 2a 2a 0a 2a 2a  : commands.**.**
3420: 20 55 73 61 67 65 3a 20 25 66 6f 73 73 69 6c 20   Usage: %fossil 
3430: 63 6f 6d 6d 61 6e 64 73 0a 2a 2a 20 4c 69 73 74  commands.** List
3440: 20 61 6c 6c 20 73 75 70 70 6f 72 74 65 64 20 63   all supported c
3450: 6f 6d 6d 61 6e 64 73 2e 0a 2a 2f 0a 76 6f 69 64  ommands..*/.void
3460: 20 63 6d 64 5f 63 6d 64 5f 6c 69 73 74 28 76 6f   cmd_cmd_list(vo
3470: 69 64 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 43  id){.  int i, nC
3480: 6d 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  md;.  const char
3490: 20 2a 61 43 6d 64 5b 63 6f 75 6e 74 28 61 43 6f   *aCmd[count(aCo
34a0: 6d 6d 61 6e 64 29 5d 3b 0a 20 20 66 6f 72 28 69  mmand)];.  for(i
34b0: 3d 6e 43 6d 64 3d 30 3b 20 69 3c 63 6f 75 6e 74  =nCmd=0; i<count
34c0: 28 61 43 6f 6d 6d 61 6e 64 29 3b 20 69 2b 2b 29  (aCommand); i++)
34d0: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d  {.    if( strncm
34e0: 70 28 61 43 6f 6d 6d 61 6e 64 5b 69 5d 2e 7a 4e  p(aCommand[i].zN
34f0: 61 6d 65 2c 22 74 65 73 74 22 2c 34 29 3d 3d 30  ame,"test",4)==0
3500: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
3510: 20 2f 2a 20 69 66 28 20 73 74 72 63 6d 70 28 61   /* if( strcmp(a
3520: 43 6f 6d 6d 61 6e 64 5b 69 5d 2e 7a 4e 61 6d 65  Command[i].zName
3530: 2c 20 67 2e 61 72 67 76 5b 31 5d 29 3d 3d 30 20  , g.argv[1])==0 
3540: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 2a 2f 0a 20  ) continue; */. 
3550: 20 20 20 61 43 6d 64 5b 6e 43 6d 64 2b 2b 5d 20     aCmd[nCmd++] 
3560: 3d 20 61 43 6f 6d 6d 61 6e 64 5b 69 5d 2e 7a 4e  = aCommand[i].zN
3570: 61 6d 65 3b 0a 20 20 7d 0a 20 20 6d 75 6c 74 69  ame;.  }.  multi
3580: 5f 63 6f 6c 75 6d 6e 5f 6c 69 73 74 28 61 43 6d  _column_list(aCm
3590: 64 2c 20 6e 43 6d 64 29 3b 0a 7d 0a 0a 2f 2a 0a  d, nCmd);.}../*.
35a0: 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 74 65 73 74  ** COMMAND: test
35b0: 2d 63 6f 6d 6d 61 6e 64 73 0a 2a 2a 0a 2a 2a 20  -commands.**.** 
35c0: 55 73 61 67 65 3a 20 25 66 6f 73 73 69 6c 20 74  Usage: %fossil t
35d0: 65 73 74 2d 63 6f 6d 6d 61 6e 64 73 0a 2a 2a 0a  est-commands.**.
35e0: 2a 2a 20 4c 69 73 74 20 61 6c 6c 20 63 6f 6d 6d  ** List all comm
35f0: 61 6e 64 73 20 75 73 65 64 20 66 6f 72 20 74 65  ands used for te
3600: 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
3610: 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 63 6d 64  ing..*/.void cmd
3620: 5f 74 65 73 74 5f 63 6d 64 5f 6c 69 73 74 28 76  _test_cmd_list(v
3630: 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e  oid){.  int i, n
3640: 43 6d 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  Cmd;.  const cha
3650: 72 20 2a 61 43 6d 64 5b 63 6f 75 6e 74 28 61 43  r *aCmd[count(aC
3660: 6f 6d 6d 61 6e 64 29 5d 3b 0a 20 20 66 6f 72 28  ommand)];.  for(
3670: 69 3d 6e 43 6d 64 3d 30 3b 20 69 3c 63 6f 75 6e  i=nCmd=0; i<coun
3680: 74 28 61 43 6f 6d 6d 61 6e 64 29 3b 20 69 2b 2b  t(aCommand); i++
3690: 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63  ){.    if( strnc
36a0: 6d 70 28 61 43 6f 6d 6d 61 6e 64 5b 69 5d 2e 7a  mp(aCommand[i].z
36b0: 4e 61 6d 65 2c 22 74 65 73 74 22 2c 34 29 21 3d  Name,"test",4)!=
36c0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
36d0: 20 20 2f 2a 20 69 66 28 20 73 74 72 63 6d 70 28    /* if( strcmp(
36e0: 61 43 6f 6d 6d 61 6e 64 5b 69 5d 2e 7a 4e 61 6d  aCommand[i].zNam
36f0: 65 2c 20 67 2e 61 72 67 76 5b 31 5d 29 3d 3d 30  e, g.argv[1])==0
3700: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 2a 2f 0a   ) continue; */.
3710: 20 20 20 20 61 43 6d 64 5b 6e 43 6d 64 2b 2b 5d      aCmd[nCmd++]
3720: 20 3d 20 61 43 6f 6d 6d 61 6e 64 5b 69 5d 2e 7a   = aCommand[i].z
3730: 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 6d 75 6c 74  Name;.  }.  mult
3740: 69 5f 63 6f 6c 75 6d 6e 5f 6c 69 73 74 28 61 43  i_column_list(aC
3750: 6d 64 2c 20 6e 43 6d 64 29 3b 0a 7d 0a 0a 0a 2f  md, nCmd);.}.../
3760: 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 76 65  *.** COMMAND: ve
3770: 72 73 69 6f 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67  rsion.**.** Usag
3780: 65 3a 20 25 66 6f 73 73 69 6c 20 76 65 72 73 69  e: %fossil versi
3790: 6f 6e 0a 2a 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  on.**.** Print t
37a0: 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 76  he source code v
37b0: 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 66 6f  ersion number fo
37c0: 72 20 74 68 65 20 66 6f 73 73 69 6c 20 65 78 65  r the fossil exe
37d0: 63 75 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  cutable..*/.void
37e0: 20 76 65 72 73 69 6f 6e 5f 63 6d 64 28 76 6f 69   version_cmd(voi
37f0: 64 29 7b 0a 20 20 70 72 69 6e 74 66 28 22 54 68  d){.  printf("Th
3800: 69 73 20 69 73 20 66 6f 73 73 69 6c 20 76 65 72  is is fossil ver
3810: 73 69 6f 6e 20 22 20 4d 41 4e 49 46 45 53 54 5f  sion " MANIFEST_
3820: 56 45 52 53 49 4f 4e 20 22 20 22 20 4d 41 4e 49  VERSION " " MANI
3830: 46 45 53 54 5f 44 41 54 45 20 22 20 55 54 43 5c  FEST_DATE " UTC\
3840: 6e 22 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  n");.}.../*.** C
3850: 4f 4d 4d 41 4e 44 3a 20 68 65 6c 70 0a 2a 2a 0a  OMMAND: help.**.
3860: 2a 2a 20 55 73 61 67 65 3a 20 25 66 6f 73 73 69  ** Usage: %fossi
3870: 6c 20 68 65 6c 70 20 43 4f 4d 4d 41 4e 44 0a 2a  l help COMMAND.*
3880: 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20 69 6e 66  *.** Display inf
3890: 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 68 6f 77 20  ormation on how 
38a0: 74 6f 20 75 73 65 20 43 4f 4d 4d 41 4e 44 0a 2a  to use COMMAND.*
38b0: 2f 0a 76 6f 69 64 20 68 65 6c 70 5f 63 6d 64 28  /.void help_cmd(
38c0: 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 2c  void){.  int rc,
38d0: 20 69 64 78 3b 0a 20 20 63 6f 6e 73 74 20 63 68   idx;.  const ch
38e0: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 67 2e 61  ar *z;.  if( g.a
38f0: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 70 72  rgc!=3 ){.    pr
3900: 69 6e 74 66 28 22 55 73 61 67 65 3a 20 25 73 20  intf("Usage: %s 
3910: 68 65 6c 70 20 43 4f 4d 4d 41 4e 44 2e 5c 6e 41  help COMMAND.\nA
3920: 76 61 69 6c 61 62 6c 65 20 43 4f 4d 4d 41 4e 44  vailable COMMAND
3930: 73 3a 5c 6e 22 2c 20 67 2e 61 72 67 76 5b 30 5d  s:\n", g.argv[0]
3940: 29 3b 0a 20 20 20 20 63 6d 64 5f 63 6d 64 5f 6c  );.    cmd_cmd_l
3950: 69 73 74 28 29 3b 0a 20 20 20 20 76 65 72 73 69  ist();.    versi
3960: 6f 6e 5f 63 6d 64 28 29 3b 0a 20 20 20 20 72 65  on_cmd();.    re
3970: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  turn;.  }.  rc =
3980: 20 6e 61 6d 65 5f 73 65 61 72 63 68 28 67 2e 61   name_search(g.a
3990: 72 67 76 5b 32 5d 2c 20 61 43 6f 6d 6d 61 6e 64  rgv[2], aCommand
39a0: 2c 20 63 6f 75 6e 74 28 61 43 6f 6d 6d 61 6e 64  , count(aCommand
39b0: 29 2c 20 26 69 64 78 29 3b 0a 20 20 69 66 28 20  ), &idx);.  if( 
39c0: 72 63 3d 3d 31 20 29 7b 0a 20 20 20 20 66 6f 73  rc==1 ){.    fos
39d0: 73 69 6c 5f 66 61 74 61 6c 28 22 75 6e 6b 6e 6f  sil_fatal("unkno
39e0: 77 6e 20 63 6f 6d 6d 61 6e 64 3a 20 25 73 22 2c  wn command: %s",
39f0: 20 67 2e 61 72 67 76 5b 32 5d 29 3b 0a 20 20 7d   g.argv[2]);.  }
3a00: 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 32 20 29  else if( rc==2 )
3a10: 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74  {.    fossil_fat
3a20: 61 6c 28 22 61 6d 62 69 67 75 6f 75 73 20 63 6f  al("ambiguous co
3a30: 6d 6d 61 6e 64 20 70 72 65 66 69 78 3a 20 25 73  mmand prefix: %s
3a40: 22 2c 20 67 2e 61 72 67 76 5b 32 5d 29 3b 0a 20  ", g.argv[2]);. 
3a50: 20 7d 0a 20 20 7a 20 3d 20 61 43 6d 64 48 65 6c   }.  z = aCmdHel
3a60: 70 5b 69 64 78 5d 3b 0a 20 20 69 66 28 20 7a 3d  p[idx];.  if( z=
3a70: 3d 30 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c  =0 ){.    fossil
3a80: 5f 66 61 74 61 6c 28 22 6e 6f 20 68 65 6c 70 20  _fatal("no help 
3a90: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68  available for th
3aa0: 65 20 25 73 20 63 6f 6d 6d 61 6e 64 22 2c 0a 20  e %s command",. 
3ab0: 20 20 20 20 20 20 61 43 6f 6d 6d 61 6e 64 5b 69        aCommand[i
3ac0: 64 78 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  dx].zName);.  }.
3ad0: 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
3ae0: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 25 27 20 26     if( *z=='%' &
3af0: 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 22 25 66  & strncmp(z, "%f
3b00: 6f 73 73 69 6c 22 2c 20 37 29 3d 3d 30 20 29 7b  ossil", 7)==0 ){
3b10: 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25  .      printf("%
3b20: 73 22 2c 20 67 2e 61 72 67 76 5b 30 5d 29 3b 0a  s", g.argv[0]);.
3b30: 20 20 20 20 20 20 7a 20 2b 3d 20 37 3b 0a 20 20        z += 7;.  
3b40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
3b50: 75 74 63 68 61 72 28 2a 7a 29 3b 0a 20 20 20 20  utchar(*z);.    
3b60: 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    z++;.    }.  }
3b70: 0a 20 20 70 75 74 63 68 61 72 28 27 5c 6e 27 29  .  putchar('\n')
3b80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
3b90: 68 65 20 67 2e 7a 42 61 73 65 55 52 4c 20 76 61  he g.zBaseURL va
3ba0: 6c 75 65 20 74 6f 20 74 68 65 20 66 75 6c 6c 20  lue to the full 
3bb0: 55 52 4c 20 66 6f 72 20 74 68 65 20 74 6f 70 6c  URL for the topl
3bc0: 65 76 65 6c 20 6f 66 0a 2a 2a 20 74 68 65 20 66  evel of.** the f
3bd0: 6f 73 73 69 6c 20 74 72 65 65 2e 20 20 53 65 74  ossil tree.  Set
3be0: 20 67 2e 7a 48 6f 6d 65 55 52 4c 20 74 6f 20 67   g.zHomeURL to g
3bf0: 2e 7a 42 61 73 65 55 52 4c 20 77 69 74 68 6f 75  .zBaseURL withou
3c00: 74 20 74 68 65 0a 2a 2a 20 6c 65 61 64 69 6e 67  t the.** leading
3c10: 20 22 68 74 74 70 3a 2f 2f 22 20 61 6e 64 20 74   "http://" and t
3c20: 68 65 20 68 6f 73 74 20 61 6e 64 20 70 6f 72 74  he host and port
3c30: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 65 74 5f 62 61  ..*/.void set_ba
3c40: 73 65 5f 75 72 6c 28 76 6f 69 64 29 7b 0a 20 20  se_url(void){.  
3c50: 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63  int i;.  const c
3c60: 68 61 72 20 2a 7a 48 6f 73 74 20 3d 20 50 44 28  har *zHost = PD(
3c70: 22 48 54 54 50 5f 48 4f 53 54 22 2c 22 22 29 3b  "HTTP_HOST","");
3c80: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3c90: 4d 6f 64 65 20 3d 20 50 44 28 22 48 54 54 50 53  Mode = PD("HTTPS
3ca0: 22 2c 22 6f 66 66 22 29 3b 0a 20 20 63 6f 6e 73  ","off");.  cons
3cb0: 74 20 63 68 61 72 20 2a 7a 43 75 72 20 3d 20 50  t char *zCur = P
3cc0: 44 28 22 53 43 52 49 50 54 5f 4e 41 4d 45 22 2c  D("SCRIPT_NAME",
3cd0: 22 2f 22 29 3b 0a 0a 20 20 69 20 3d 20 73 74 72  "/");..  i = str
3ce0: 6c 65 6e 28 7a 43 75 72 29 3b 0a 20 20 77 68 69  len(zCur);.  whi
3cf0: 6c 65 28 20 69 3e 30 20 26 26 20 7a 43 75 72 5b  le( i>0 && zCur[
3d00: 69 2d 31 5d 3d 3d 27 2f 27 20 29 20 69 2d 2d 3b  i-1]=='/' ) i--;
3d10: 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4d  .  if( strcmp(zM
3d20: 6f 64 65 2c 22 6f 6e 22 29 3d 3d 30 20 29 7b 0a  ode,"on")==0 ){.
3d30: 20 20 20 20 67 2e 7a 42 61 73 65 55 52 4c 20 3d      g.zBaseURL =
3d40: 20 6d 70 72 69 6e 74 66 28 22 68 74 74 70 73 3a   mprintf("https:
3d50: 2f 2f 25 73 25 2e 2a 73 22 2c 20 7a 48 6f 73 74  //%s%.*s", zHost
3d60: 2c 20 69 2c 20 7a 43 75 72 29 3b 0a 20 20 20 20  , i, zCur);.    
3d70: 67 2e 7a 54 6f 70 20 3d 20 26 67 2e 7a 42 61 73  g.zTop = &g.zBas
3d80: 65 55 52 4c 5b 38 2b 73 74 72 6c 65 6e 28 7a 48  eURL[8+strlen(zH
3d90: 6f 73 74 29 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ost)];.  }else{.
3da0: 20 20 20 20 67 2e 7a 42 61 73 65 55 52 4c 20 3d      g.zBaseURL =
3db0: 20 6d 70 72 69 6e 74 66 28 22 68 74 74 70 3a 2f   mprintf("http:/
3dc0: 2f 25 73 25 2e 2a 73 22 2c 20 7a 48 6f 73 74 2c  /%s%.*s", zHost,
3dd0: 20 69 2c 20 7a 43 75 72 29 3b 0a 20 20 20 20 67   i, zCur);.    g
3de0: 2e 7a 54 6f 70 20 3d 20 26 67 2e 7a 42 61 73 65  .zTop = &g.zBase
3df0: 55 52 4c 5b 37 2b 73 74 72 6c 65 6e 28 7a 48 6f  URL[7+strlen(zHo
3e00: 73 74 29 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  st)];.  }.}../*.
3e10: 2a 2a 20 53 65 6e 64 20 61 6e 20 48 54 54 50 20  ** Send an HTTP 
3e20: 72 65 64 69 72 65 63 74 20 62 61 63 6b 20 74 6f  redirect back to
3e30: 20 74 68 65 20 64 65 73 69 67 6e 61 74 65 64 20   the designated 
3e40: 49 6e 64 65 78 20 50 61 67 65 2e 0a 2a 2f 0a 76  Index Page..*/.v
3e50: 6f 69 64 20 66 6f 73 73 69 6c 5f 72 65 64 69 72  oid fossil_redir
3e60: 65 63 74 5f 68 6f 6d 65 28 76 6f 69 64 29 7b 0a  ect_home(void){.
3e70: 20 20 63 67 69 5f 72 65 64 69 72 65 63 74 66 28    cgi_redirectf(
3e80: 22 25 73 25 73 22 2c 20 67 2e 7a 42 61 73 65 55  "%s%s", g.zBaseU
3e90: 52 4c 2c 20 64 62 5f 67 65 74 28 22 69 6e 64 65  RL, db_get("inde
3ea0: 78 2d 70 61 67 65 22 2c 20 22 2f 69 6e 64 65 78  x-page", "/index
3eb0: 22 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  "));.}../*.** Pr
3ec0: 65 63 6f 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a  econditions:.**.
3ed0: 2a 2a 20 20 20 20 2a 20 45 6e 76 69 72 6f 6e 6d  **    * Environm
3ee0: 65 6e 74 20 76 61 72 69 61 62 6c 65 73 20 61 72  ent variables ar
3ef0: 65 20 73 65 74 20 75 70 20 61 63 63 6f 72 64 69  e set up accordi
3f00: 6e 67 20 74 6f 20 74 68 65 20 43 47 49 20 73 74  ng to the CGI st
3f10: 61 6e 64 61 72 64 2e 0a 2a 2a 20 20 20 20 2a 20  andard..**    * 
3f20: 54 68 65 20 72 65 73 70 6f 73 69 74 6f 72 79 20  The respository 
3f30: 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
3f40: 6e 20 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70  n located and op
3f50: 65 6e 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 6f  ened..** .** Pro
3f60: 63 65 73 73 20 74 68 65 20 77 65 62 70 61 67 65  cess the webpage
3f70: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
3f80: 65 20 50 41 54 48 5f 49 4e 46 4f 20 6f 72 20 52  e PATH_INFO or R
3f90: 45 51 55 45 53 54 5f 55 52 49 0a 2a 2a 20 65 6e  EQUEST_URI.** en
3fa0: 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
3fb0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
3fc0: 69 64 20 70 72 6f 63 65 73 73 5f 6f 6e 65 5f 77  id process_one_w
3fd0: 65 62 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20  eb_page(void){. 
3fe0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
3ff0: 74 68 49 6e 66 6f 3b 0a 20 20 63 68 61 72 20 2a  thInfo;.  char *
4000: 7a 50 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20  zPath = NULL;.  
4010: 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 69  int idx;.  int i
4020: 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  ;..  /* Find the
4030: 20 70 61 67 65 20 74 68 61 74 20 74 68 65 20 75   page that the u
4040: 73 65 72 20 68 61 73 20 72 65 71 75 65 73 74 65  ser has requeste
4050: 64 2c 20 63 6f 6e 73 74 72 75 63 74 20 61 6e 64  d, construct and
4060: 20 64 65 6c 69 76 65 72 20 74 68 61 74 0a 20 20   deliver that.  
4070: 2a 2a 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ** page..  */.  
4080: 73 65 74 5f 62 61 73 65 5f 75 72 6c 28 29 3b 0a  set_base_url();.
4090: 20 20 7a 50 61 74 68 49 6e 66 6f 20 3d 20 50 28    zPathInfo = P(
40a0: 22 50 41 54 48 5f 49 4e 46 4f 22 29 3b 0a 20 20  "PATH_INFO");.  
40b0: 69 66 28 20 7a 50 61 74 68 49 6e 66 6f 3d 3d 30  if( zPathInfo==0
40c0: 20 7c 7c 20 7a 50 61 74 68 49 6e 66 6f 5b 30 5d   || zPathInfo[0]
40d0: 3d 3d 30 20 0a 20 20 20 20 20 20 7c 7c 20 28 7a  ==0 .      || (z
40e0: 50 61 74 68 49 6e 66 6f 5b 30 5d 3d 3d 27 2f 27  PathInfo[0]=='/'
40f0: 20 26 26 20 7a 50 61 74 68 49 6e 66 6f 5b 31 5d   && zPathInfo[1]
4100: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 66 6f 73 73  ==0) ){.    foss
4110: 69 6c 5f 72 65 64 69 72 65 63 74 5f 68 6f 6d 65  il_redirect_home
4120: 28 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ();.  }else{.   
4130: 20 7a 50 61 74 68 20 3d 20 6d 70 72 69 6e 74 66   zPath = mprintf
4140: 28 22 25 73 22 2c 20 7a 50 61 74 68 49 6e 66 6f  ("%s", zPathInfo
4150: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d  );.  }..  /* Rem
4160: 6f 76 65 20 74 68 65 20 6c 65 61 64 69 6e 67 20  ove the leading 
4170: 22 2f 22 20 61 74 20 74 68 65 20 62 65 67 69 6e  "/" at the begin
4180: 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 61 74 68  ning of the path
4190: 2e 0a 20 20 2a 2f 0a 20 20 67 2e 7a 50 61 74 68  ..  */.  g.zPath
41a0: 20 3d 20 26 7a 50 61 74 68 5b 31 5d 3b 0a 20 20   = &zPath[1];.  
41b0: 66 6f 72 28 69 3d 31 3b 20 7a 50 61 74 68 5b 69  for(i=1; zPath[i
41c0: 5d 20 26 26 20 7a 50 61 74 68 5b 69 5d 21 3d 27  ] && zPath[i]!='
41d0: 2f 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28  /'; i++){}.  if(
41e0: 20 7a 50 61 74 68 5b 69 5d 3d 3d 27 2f 27 20 29   zPath[i]=='/' )
41f0: 7b 0a 20 20 20 20 7a 50 61 74 68 5b 69 5d 20 3d  {.    zPath[i] =
4200: 20 30 3b 0a 20 20 20 20 67 2e 7a 45 78 74 72 61   0;.    g.zExtra
4210: 20 3d 20 26 7a 50 61 74 68 5b 69 2b 31 5d 3b 0a   = &zPath[i+1];.
4220: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67 2e 7a    }else{.    g.z
4230: 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 7d 0a 20  Extra = 0;.  }. 
4240: 20 69 66 28 20 67 2e 7a 45 78 74 72 61 20 29 7b   if( g.zExtra ){
4250: 0a 20 20 20 20 2f 2a 20 43 47 49 20 70 61 72 61  .    /* CGI para
4260: 6d 65 74 65 72 73 20 67 65 74 20 74 68 69 73 20  meters get this 
4270: 74 72 65 61 74 6d 65 6e 74 20 65 6c 73 65 77 68  treatment elsewh
4280: 65 72 65 2c 20 62 75 74 20 70 6c 61 63 65 73 20  ere, but places 
4290: 6c 69 6b 65 20 67 65 74 66 69 6c 65 0a 20 20 20  like getfile.   
42a0: 20 2a 2a 20 77 69 6c 6c 20 75 73 65 20 67 2e 7a   ** will use g.z
42b0: 45 78 74 72 61 20 64 69 72 65 63 74 6c 79 2e 0a  Extra directly..
42c0: 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 68 74 74      */.    dehtt
42d0: 70 69 7a 65 28 67 2e 7a 45 78 74 72 61 29 3b 0a  pize(g.zExtra);.
42e0: 20 20 20 20 63 67 69 5f 73 65 74 5f 70 61 72 61      cgi_set_para
42f0: 6d 65 74 65 72 5f 6e 6f 63 6f 70 79 28 22 6e 61  meter_nocopy("na
4300: 6d 65 22 2c 20 67 2e 7a 45 78 74 72 61 29 3b 0a  me", g.zExtra);.
4310: 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e    }..  /* Preven
4320: 74 20 72 6f 62 6f 74 73 20 66 72 6f 6d 20 69 6e  t robots from in
4330: 64 65 78 69 6e 67 20 74 68 69 73 20 73 69 74 65  dexing this site
4340: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 72  ..  */.  if( str
4350: 63 6d 70 28 67 2e 7a 50 61 74 68 2c 20 22 72 6f  cmp(g.zPath, "ro
4360: 62 6f 74 73 2e 74 78 74 22 29 3d 3d 30 20 29 7b  bots.txt")==0 ){
4370: 0a 20 20 20 20 63 67 69 5f 73 65 74 5f 63 6f 6e  .    cgi_set_con
4380: 74 65 6e 74 5f 74 79 70 65 28 22 74 65 78 74 2f  tent_type("text/
4390: 70 6c 61 69 6e 22 29 3b 0a 20 20 20 20 40 20 55  plain");.    @ U
43a0: 73 65 72 2d 61 67 65 6e 74 3a 20 2a 0a 20 20 20  ser-agent: *.   
43b0: 20 40 20 44 69 73 61 6c 6c 6f 77 3a 20 2f 0a 20   @ Disallow: /. 
43c0: 20 20 20 63 67 69 5f 72 65 70 6c 79 28 29 3b 0a     cgi_reply();.
43d0: 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20 7d      exit(0);.  }
43e0: 0a 20 20 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20  .  .  /* Locate 
43f0: 74 68 65 20 6d 65 74 68 6f 64 20 73 70 65 63 69  the method speci
4400: 66 69 65 64 20 62 79 20 74 68 65 20 70 61 74 68  fied by the path
4410: 20 61 6e 64 20 65 78 65 63 75 74 65 20 74 68 65   and execute the
4420: 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74   function.  ** t
4430: 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
4440: 68 61 74 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f  hat method..  */
4450: 0a 20 20 69 66 28 20 6e 61 6d 65 5f 73 65 61 72  .  if( name_sear
4460: 63 68 28 67 2e 7a 50 61 74 68 2c 20 61 57 65 62  ch(g.zPath, aWeb
4470: 70 61 67 65 2c 20 63 6f 75 6e 74 28 61 57 65 62  page, count(aWeb
4480: 70 61 67 65 29 2c 20 26 69 64 78 29 20 26 26 0a  page), &idx) &&.
4490: 20 20 20 20 20 20 6e 61 6d 65 5f 73 65 61 72 63        name_searc
44a0: 68 28 22 6e 6f 74 5f 66 6f 75 6e 64 22 2c 20 61  h("not_found", a
44b0: 57 65 62 70 61 67 65 2c 20 63 6f 75 6e 74 28 61  Webpage, count(a
44c0: 57 65 62 70 61 67 65 29 2c 20 26 69 64 78 29 20  Webpage), &idx) 
44d0: 29 7b 0a 20 20 20 20 63 67 69 5f 73 65 74 5f 73  ){.    cgi_set_s
44e0: 74 61 74 75 73 28 34 30 34 2c 22 4e 6f 74 20 46  tatus(404,"Not F
44f0: 6f 75 6e 64 22 29 3b 0a 20 20 20 20 40 20 3c 68  ound");.    @ <h
4500: 31 3e 4e 6f 74 20 46 6f 75 6e 64 3c 2f 68 31 3e  1>Not Found</h1>
4510: 0a 20 20 20 20 40 20 3c 70 3e 50 61 67 65 20 6e  .    @ <p>Page n
4520: 6f 74 20 66 6f 75 6e 64 3a 20 25 68 28 67 2e 7a  ot found: %h(g.z
4530: 50 61 74 68 29 3c 2f 70 3e 0a 20 20 7d 65 6c 73  Path)</p>.  }els
4540: 65 7b 0a 20 20 20 20 61 57 65 62 70 61 67 65 5b  e{.    aWebpage[
4550: 69 64 78 5d 2e 78 46 75 6e 63 28 29 3b 0a 20 20  idx].xFunc();.  
4560: 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74  }..  /* Return t
4570: 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a  he result..  */.
4580: 20 20 63 67 69 5f 72 65 70 6c 79 28 29 3b 0a 7d    cgi_reply();.}
4590: 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a  ../*.** COMMAND:
45a0: 20 63 67 69 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65   cgi.**.** Usage
45b0: 3a 20 25 66 6f 73 73 69 6c 20 3f 63 67 69 3f 20  : %fossil ?cgi? 
45c0: 53 43 52 49 50 54 0a 2a 2a 0a 2a 2a 20 54 68 65  SCRIPT.**.** The
45d0: 20 53 43 52 49 50 54 20 61 72 67 75 6d 65 6e 74   SCRIPT argument
45e0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
45f0: 61 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 74  a file that is t
4600: 68 65 20 43 47 49 20 73 63 72 69 70 74 0a 2a 2a  he CGI script.**
4610: 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 72   that is being r
4620: 75 6e 2e 20 20 54 68 65 20 63 6f 6d 6d 61 6e 64  un.  The command
4630: 20 6e 61 6d 65 2c 20 22 63 67 69 22 2c 20 6d 61   name, "cgi", ma
4640: 79 20 62 65 20 6f 6d 69 74 74 65 64 20 69 66 0a  y be omitted if.
4650: 2a 2a 20 74 68 65 20 47 41 54 45 57 41 59 5f 49  ** the GATEWAY_I
4660: 4e 54 45 52 46 41 43 45 20 65 6e 76 69 72 6f 6e  NTERFACE environ
4670: 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 69 73  ment variable is
4680: 20 73 65 74 20 74 6f 20 22 43 47 49 22 20 28 77   set to "CGI" (w
4690: 68 69 63 68 0a 2a 2a 20 73 68 6f 75 6c 64 20 61  hich.** should a
46a0: 6c 77 61 79 73 20 62 65 20 74 68 65 20 63 61 73  lways be the cas
46b0: 65 20 66 6f 72 20 43 47 49 20 73 63 72 69 70 74  e for CGI script
46c0: 73 20 72 75 6e 20 62 79 20 61 20 77 65 62 73 65  s run by a webse
46d0: 72 76 65 72 2e 29 20 20 54 68 65 0a 2a 2a 20 53  rver.)  The.** S
46e0: 43 52 49 50 54 20 66 69 6c 65 20 73 68 6f 75 6c  CRIPT file shoul
46f0: 64 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67  d look something
4700: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
4710: 2a 20 20 20 20 20 20 23 21 2f 75 73 72 2f 62 69  *      #!/usr/bi
4720: 6e 2f 66 6f 73 73 69 6c 0a 2a 2a 20 20 20 20 20  n/fossil.**     
4730: 20 72 65 70 6f 73 69 74 6f 72 79 3a 20 2f 68 6f   repository: /ho
4740: 6d 65 2f 73 6f 6d 65 62 6f 64 79 2f 70 72 6f 6a  me/somebody/proj
4750: 65 63 74 2e 64 62 0a 2a 2a 0a 2a 2a 20 54 68 65  ect.db.**.** The
4760: 20 73 65 63 6f 6e 64 20 6c 69 6e 65 20 64 65 66   second line def
4770: 69 6e 65 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  ines the name of
4780: 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72 79 2e   the repository.
4790: 20 20 41 66 74 65 72 20 6c 6f 63 61 74 69 6e 67    After locating
47a0: 0a 2a 2a 20 74 68 65 20 72 65 70 6f 73 69 74 6f  .** the reposito
47b0: 72 79 2c 20 66 6f 73 73 69 6c 20 77 69 6c 6c 20  ry, fossil will 
47c0: 67 65 6e 65 72 61 74 65 20 61 20 77 65 62 70 61  generate a webpa
47d0: 67 65 20 6f 6e 20 73 74 64 6f 75 74 20 62 61 73  ge on stdout bas
47e0: 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 76 61 6c  ed on.** the val
47f0: 75 65 73 20 6f 66 20 73 74 61 6e 64 61 72 64 20  ues of standard 
4800: 43 47 49 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  CGI environment 
4810: 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2f 0a 76 6f  variables..*/.vo
4820: 69 64 20 63 6d 64 5f 63 67 69 28 76 6f 69 64 29  id cmd_cgi(void)
4830: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
4840: 7a 46 69 6c 65 3b 0a 20 20 42 6c 6f 62 20 63 6f  zFile;.  Blob co
4850: 6e 66 69 67 2c 20 6c 69 6e 65 2c 20 6b 65 79 2c  nfig, line, key,
4860: 20 76 61 6c 75 65 3b 0a 20 20 69 66 28 20 67 2e   value;.  if( g.
4870: 61 72 67 63 3d 3d 33 20 26 26 20 73 74 72 63 6d  argc==3 && strcm
4880: 70 28 67 2e 61 72 67 76 5b 31 5d 2c 22 63 67 69  p(g.argv[1],"cgi
4890: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 46 69  ")==0 ){.    zFi
48a0: 6c 65 20 3d 20 67 2e 61 72 67 76 5b 32 5d 3b 0a  le = g.argv[2];.
48b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 46 69    }else{.    zFi
48c0: 6c 65 20 3d 20 67 2e 61 72 67 76 5b 31 5d 3b 0a  le = g.argv[1];.
48d0: 20 20 7d 0a 20 20 67 2e 68 74 74 70 4f 75 74 20    }.  g.httpOut 
48e0: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 67 2e 68 74  = stdout;.  g.ht
48f0: 74 70 49 6e 20 3d 20 73 74 64 69 6e 3b 0a 23 69  tpIn = stdin;.#i
4900: 66 64 65 66 20 5f 5f 4d 49 4e 47 57 33 32 5f 5f  fdef __MINGW32__
4910: 0a 20 20 2f 2a 20 53 65 74 20 62 69 6e 61 72 79  .  /* Set binary
4920: 20 6d 6f 64 65 20 6f 6e 20 77 69 6e 64 6f 77 73   mode on windows
4930: 20 74 6f 20 61 76 6f 69 64 20 75 6e 64 65 73 69   to avoid undesi
4940: 72 65 64 20 74 72 61 6e 73 6c 61 74 69 6f 6e 73  red translations
4950: 0a 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 5c 6e  .  ** between \n
4960: 20 61 6e 64 20 5c 72 5c 6e 2e 20 2a 2f 0a 20 20   and \r\n. */.  
4970: 73 65 74 6d 6f 64 65 28 5f 66 69 6c 65 6e 6f 28  setmode(_fileno(
4980: 67 2e 68 74 74 70 4f 75 74 29 2c 20 5f 4f 5f 42  g.httpOut), _O_B
4990: 49 4e 41 52 59 29 3b 0a 20 20 73 65 74 6d 6f 64  INARY);.  setmod
49a0: 65 28 5f 66 69 6c 65 6e 6f 28 67 2e 68 74 74 70  e(_fileno(g.http
49b0: 49 6e 29 2c 20 5f 4f 5f 42 49 4e 41 52 59 29 3b  In), _O_BINARY);
49c0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f  .#endif.#ifdef _
49d0: 5f 45 4d 58 5f 5f 0a 20 20 2f 2a 20 53 69 6d 69  _EMX__.  /* Simi
49e0: 6c 61 72 20 68 61 63 6b 20 66 6f 72 20 4f 53 2f  lar hack for OS/
49f0: 32 20 2a 2f 0a 20 20 73 65 74 6d 6f 64 65 28 66  2 */.  setmode(f
4a00: 69 6c 65 6e 6f 28 67 2e 68 74 74 70 4f 75 74 29  ileno(g.httpOut)
4a10: 2c 20 4f 5f 42 49 4e 41 52 59 29 3b 0a 20 20 73  , O_BINARY);.  s
4a20: 65 74 6d 6f 64 65 28 66 69 6c 65 6e 6f 28 67 2e  etmode(fileno(g.
4a30: 68 74 74 70 49 6e 29 2c 20 4f 5f 42 49 4e 41 52  httpIn), O_BINAR
4a40: 59 29 3b 0a 23 65 6e 64 69 66 0a 20 20 67 2e 63  Y);.#endif.  g.c
4a50: 67 69 50 61 6e 69 63 20 3d 20 31 3b 0a 20 20 62  giPanic = 1;.  b
4a60: 6c 6f 62 5f 72 65 61 64 5f 66 72 6f 6d 5f 66 69  lob_read_from_fi
4a70: 6c 65 28 26 63 6f 6e 66 69 67 2c 20 7a 46 69 6c  le(&config, zFil
4a80: 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 62 6c 6f  e);.  while( blo
4a90: 62 5f 6c 69 6e 65 28 26 63 6f 6e 66 69 67 2c 20  b_line(&config, 
4aa0: 26 6c 69 6e 65 29 20 29 7b 0a 20 20 20 20 69 66  &line) ){.    if
4ab0: 28 20 21 62 6c 6f 62 5f 74 6f 6b 65 6e 28 26 6c  ( !blob_token(&l
4ac0: 69 6e 65 2c 20 26 6b 65 79 29 20 29 20 63 6f 6e  ine, &key) ) con
4ad0: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 62  tinue;.    if( b
4ae0: 6c 6f 62 5f 62 75 66 66 65 72 28 26 6b 65 79 29  lob_buffer(&key)
4af0: 5b 30 5d 3d 3d 27 23 27 20 29 20 63 6f 6e 74 69  [0]=='#' ) conti
4b00: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 62 6c 6f  nue;.    if( blo
4b10: 62 5f 65 71 28 26 6b 65 79 2c 20 22 64 65 62 75  b_eq(&key, "debu
4b20: 67 3a 22 29 20 26 26 20 62 6c 6f 62 5f 74 6f 6b  g:") && blob_tok
4b30: 65 6e 28 26 6c 69 6e 65 2c 20 26 76 61 6c 75 65  en(&line, &value
4b40: 29 20 29 7b 0a 20 20 20 20 20 20 67 2e 66 44 65  ) ){.      g.fDe
4b50: 62 75 67 20 3d 20 66 6f 70 65 6e 28 62 6c 6f 62  bug = fopen(blob
4b60: 5f 73 74 72 28 26 76 61 6c 75 65 29 2c 20 22 61  _str(&value), "a
4b70: 22 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 72  ");.      blob_r
4b80: 65 73 65 74 28 26 76 61 6c 75 65 29 3b 0a 20 20  eset(&value);.  
4b90: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
4ba0: 20 20 7d 0a 20 20 20 20 69 66 28 20 62 6c 6f 62    }.    if( blob
4bb0: 5f 65 71 28 26 6b 65 79 2c 20 22 48 4f 4d 45 3a  _eq(&key, "HOME:
4bc0: 22 29 20 26 26 20 62 6c 6f 62 5f 74 6f 6b 65 6e  ") && blob_token
4bd0: 28 26 6c 69 6e 65 2c 20 26 76 61 6c 75 65 29 20  (&line, &value) 
4be0: 29 7b 0a 20 20 20 20 20 20 63 67 69 5f 73 65 74  ){.      cgi_set
4bf0: 65 6e 76 28 22 48 4f 4d 45 22 2c 20 62 6c 6f 62  env("HOME", blob
4c00: 5f 73 74 72 28 26 76 61 6c 75 65 29 29 3b 0a 20  _str(&value));. 
4c10: 20 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28       blob_reset(
4c20: 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 63  &value);.      c
4c30: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
4c40: 20 20 20 69 66 28 20 62 6c 6f 62 5f 65 71 28 26     if( blob_eq(&
4c50: 6b 65 79 2c 20 22 72 65 70 6f 73 69 74 6f 72 79  key, "repository
4c60: 3a 22 29 20 26 26 20 62 6c 6f 62 5f 74 6f 6b 65  :") && blob_toke
4c70: 6e 28 26 6c 69 6e 65 2c 20 26 76 61 6c 75 65 29  n(&line, &value)
4c80: 20 29 7b 0a 20 20 20 20 20 20 64 62 5f 6f 70 65   ){.      db_ope
4c90: 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28 62 6c 6f  n_repository(blo
4ca0: 62 5f 73 74 72 28 26 76 61 6c 75 65 29 29 3b 0a  b_str(&value));.
4cb0: 20 20 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74        blob_reset
4cc0: 28 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  (&value);.      
4cd0: 62 6c 6f 62 5f 72 65 73 65 74 28 26 63 6f 6e 66  blob_reset(&conf
4ce0: 69 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ig);.      break
4cf0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
4d00: 28 20 67 2e 64 62 3d 3d 30 20 29 7b 0a 20 20 20  ( g.db==0 ){.   
4d10: 20 63 67 69 5f 70 61 6e 69 63 28 22 55 6e 61 62   cgi_panic("Unab
4d20: 6c 65 20 74 6f 20 66 69 6e 64 20 6f 72 20 6f 70  le to find or op
4d30: 65 6e 20 74 68 65 20 70 72 6f 6a 65 63 74 20 72  en the project r
4d40: 65 70 6f 73 69 74 6f 72 79 22 29 3b 0a 20 20 7d  epository");.  }
4d50: 0a 20 20 63 67 69 5f 69 6e 69 74 28 29 3b 0a 20  .  cgi_init();. 
4d60: 20 70 72 6f 63 65 73 73 5f 6f 6e 65 5f 77 65 62   process_one_web
4d70: 5f 70 61 67 65 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  _page();.}../*.*
4d80: 2a 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 66  * undocumented f
4d90: 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ormat:.**.**    
4da0: 20 20 20 20 66 6f 73 73 69 6c 20 68 74 74 70 20      fossil http 
4db0: 52 45 50 4f 53 49 54 4f 52 59 20 49 4e 46 49 4c  REPOSITORY INFIL
4dc0: 45 20 4f 55 54 46 49 4c 45 20 49 50 41 44 44 52  E OUTFILE IPADDR
4dd0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 67 76 3d  .**.** The argv=
4de0: 3d 36 20 66 6f 72 6d 20 69 73 20 75 73 65 64 20  =6 form is used 
4df0: 62 79 20 74 68 65 20 77 69 6e 33 32 20 73 65 72  by the win32 ser
4e00: 76 65 72 20 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20  ver only..**.** 
4e10: 43 4f 4d 4d 41 4e 44 3a 20 68 74 74 70 0a 2a 2a  COMMAND: http.**
4e20: 0a 2a 2a 20 55 73 61 67 65 3a 20 25 66 6f 73 73  .** Usage: %foss
4e30: 69 6c 20 68 74 74 70 20 52 45 50 4f 53 49 54 4f  il http REPOSITO
4e40: 52 59 0a 2a 2a 0a 2a 2a 20 48 61 6e 64 6c 65 20  RY.**.** Handle 
4e50: 61 20 73 69 6e 67 6c 65 20 48 54 54 50 20 72 65  a single HTTP re
4e60: 71 75 65 73 74 20 61 70 70 65 61 72 69 6e 67 20  quest appearing 
4e70: 6f 6e 20 73 74 64 69 6e 2e 20 20 54 68 65 20 72  on stdin.  The r
4e80: 65 73 75 6c 74 69 6e 67 20 77 65 62 70 61 67 65  esulting webpage
4e90: 0a 2a 2a 20 69 73 20 64 65 6c 69 76 65 72 65 64  .** is delivered
4ea0: 20 6f 6e 20 73 74 64 6f 75 74 2e 20 20 54 68 69   on stdout.  Thi
4eb0: 73 20 6d 65 74 68 6f 64 20 69 73 20 75 73 65 64  s method is used
4ec0: 20 74 6f 20 6c 61 75 6e 63 68 20 61 6e 20 48 54   to launch an HT
4ed0: 54 50 20 72 65 71 75 65 73 74 0a 2a 2a 20 68 61  TP request.** ha
4ee0: 6e 64 6c 65 72 20 66 72 6f 6d 20 69 6e 65 74 64  ndler from inetd
4ef0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20  , for example.  
4f00: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
4f10: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
4f20: 0a 2a 2a 20 72 65 70 6f 73 69 74 6f 72 79 2e 0a  .** repository..
4f30: 2a 2f 0a 76 6f 69 64 20 63 6d 64 5f 68 74 74 70  */.void cmd_http
4f40: 28 76 6f 69 64 29 7b 0a 20 20 63 6f 6e 73 74 20  (void){.  const 
4f50: 63 68 61 72 20 2a 7a 49 70 41 64 64 72 3b 0a 20  char *zIpAddr;. 
4f60: 20 69 66 28 20 67 2e 61 72 67 63 21 3d 32 20 26   if( g.argc!=2 &
4f70: 26 20 67 2e 61 72 67 63 21 3d 33 20 26 26 20 67  & g.argc!=3 && g
4f80: 2e 61 72 67 63 21 3d 36 20 29 7b 0a 20 20 20 20  .argc!=6 ){.    
4f90: 63 67 69 5f 70 61 6e 69 63 28 22 6e 6f 20 72 65  cgi_panic("no re
4fa0: 70 6f 73 69 74 6f 72 79 20 73 70 65 63 69 66 69  pository specifi
4fb0: 65 64 22 29 3b 0a 20 20 7d 0a 23 69 66 20 21 64  ed");.  }.#if !d
4fc0: 65 66 69 6e 65 64 28 5f 5f 4d 49 4e 47 57 33 32  efined(__MINGW32
4fd0: 5f 5f 29 0a 20 20 69 66 28 20 67 2e 61 72 67 63  __).  if( g.argc
4fe0: 3d 3d 33 20 26 26 20 67 65 74 75 69 64 28 29 3d  ==3 && getuid()=
4ff0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
5000: 0a 20 20 20 20 63 68 61 72 20 2a 7a 52 65 70 6f  .    char *zRepo
5010: 20 3d 20 67 2e 61 72 67 76 5b 32 5d 3b 0a 20 20   = g.argv[2];.  
5020: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
5030: 74 61 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 73  tat;.    for(i=s
5040: 74 72 6c 65 6e 28 7a 52 65 70 6f 29 2d 31 3b 20  trlen(zRepo)-1; 
5050: 69 3e 30 20 26 26 20 7a 52 65 70 6f 5b 69 5d 21  i>0 && zRepo[i]!
5060: 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 20  ='/'; i--){}.   
5070: 20 69 66 28 20 7a 52 65 70 6f 5b 69 5d 3d 3d 27   if( zRepo[i]=='
5080: 2f 27 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 70  /' ){.      zRep
5090: 6f 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  o[i] = 0;.      
50a0: 63 68 64 69 72 28 67 2e 61 72 67 76 5b 32 5d 29  chdir(g.argv[2])
50b0: 3b 0a 20 20 20 20 20 20 63 68 72 6f 6f 74 28 67  ;.      chroot(g
50c0: 2e 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 20  .argv[2]);.     
50d0: 20 67 2e 61 72 67 76 5b 32 5d 20 3d 20 26 7a 52   g.argv[2] = &zR
50e0: 65 70 6f 5b 69 2b 31 5d 3b 0a 20 20 20 20 7d 0a  epo[i+1];.    }.
50f0: 20 20 20 20 69 66 28 20 73 74 61 74 28 67 2e 61      if( stat(g.a
5100: 72 67 76 5b 32 5d 2c 20 26 73 53 74 61 74 29 21  rgv[2], &sStat)!
5110: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 73 73  =0 ){.      foss
5120: 69 6c 5f 66 61 74 61 6c 28 22 63 61 6e 6e 6f 74  il_fatal("cannot
5130: 20 73 74 61 74 28 29 20 72 65 70 6f 73 69 74 6f   stat() reposito
5140: 72 79 3a 20 25 73 22 2c 20 67 2e 61 72 67 76 5b  ry: %s", g.argv[
5150: 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  2]);.    }.    s
5160: 65 74 67 69 64 28 73 53 74 61 74 2e 73 74 5f 67  etgid(sStat.st_g
5170: 69 64 29 3b 0a 20 20 20 20 73 65 74 75 69 64 28  id);.    setuid(
5180: 73 53 74 61 74 2e 73 74 5f 75 69 64 29 3b 0a 20  sStat.st_uid);. 
5190: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 67 2e 63 67   }.#endif.  g.cg
51a0: 69 50 61 6e 69 63 20 3d 20 31 3b 0a 20 20 67 2e  iPanic = 1;.  g.
51b0: 66 75 6c 6c 48 74 74 70 52 65 70 6c 79 20 3d 20  fullHttpReply = 
51c0: 31 3b 0a 20 20 69 66 28 20 67 2e 61 72 67 63 3d  1;.  if( g.argc=
51d0: 3d 36 20 29 7b 0a 20 20 20 20 67 2e 68 74 74 70  =6 ){.    g.http
51e0: 49 6e 20 3d 20 66 6f 70 65 6e 28 67 2e 61 72 67  In = fopen(g.arg
51f0: 76 5b 33 5d 2c 20 22 72 62 22 29 3b 0a 20 20 20  v[3], "rb");.   
5200: 20 67 2e 68 74 74 70 4f 75 74 20 3d 20 66 6f 70   g.httpOut = fop
5210: 65 6e 28 67 2e 61 72 67 76 5b 34 5d 2c 20 22 77  en(g.argv[4], "w
5220: 62 22 29 3b 0a 20 20 20 20 7a 49 70 41 64 64 72  b");.    zIpAddr
5230: 20 3d 20 67 2e 61 72 67 76 5b 35 5d 3b 0a 20 20   = g.argv[5];.  
5240: 7d 65 6c 73 65 7b 0a 20 20 20 20 67 2e 68 74 74  }else{.    g.htt
5250: 70 49 6e 20 3d 20 73 74 64 69 6e 3b 0a 20 20 20  pIn = stdin;.   
5260: 20 67 2e 68 74 74 70 4f 75 74 20 3d 20 73 74 64   g.httpOut = std
5270: 6f 75 74 3b 0a 20 20 20 20 7a 49 70 41 64 64 72  out;.    zIpAddr
5280: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
5290: 67 2e 61 72 67 63 3e 3d 33 20 29 7b 0a 20 20 20  g.argc>=3 ){.   
52a0: 20 64 62 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74   db_open_reposit
52b0: 6f 72 79 28 67 2e 61 72 67 76 5b 32 5d 29 3b 0a  ory(g.argv[2]);.
52c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 5f    }else{.    db_
52d0: 6d 75 73 74 5f 62 65 5f 77 69 74 68 69 6e 5f 74  must_be_within_t
52e0: 72 65 65 28 29 3b 0a 20 20 7d 0a 20 20 63 67 69  ree();.  }.  cgi
52f0: 5f 68 61 6e 64 6c 65 5f 68 74 74 70 5f 72 65 71  _handle_http_req
5300: 75 65 73 74 28 7a 49 70 41 64 64 72 29 3b 0a 20  uest(zIpAddr);. 
5310: 20 70 72 6f 63 65 73 73 5f 6f 6e 65 5f 77 65 62   process_one_web
5320: 5f 70 61 67 65 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  _page();.}../*.*
5330: 2a 20 43 4f 4d 4d 41 4e 44 3a 20 74 65 73 74 2d  * COMMAND: test-
5340: 68 74 74 70 0a 2a 2a 20 57 6f 72 6b 73 20 6c 69  http.** Works li
5350: 6b 65 20 74 68 65 20 68 74 74 70 20 63 6f 6d 6d  ke the http comm
5360: 61 6e 64 20 62 75 74 20 67 69 76 65 73 20 73 65  and but gives se
5370: 74 75 70 20 70 65 72 6d 69 73 73 69 6f 6e 20 74  tup permission t
5380: 6f 20 61 6c 6c 20 75 73 65 72 73 2e 0a 2a 2f 0a  o all users..*/.
5390: 76 6f 69 64 20 63 6d 64 5f 74 65 73 74 5f 68 74  void cmd_test_ht
53a0: 74 70 28 76 6f 69 64 29 7b 0a 20 20 6c 6f 67 69  tp(void){.  logi
53b0: 6e 5f 73 65 74 5f 63 61 70 61 62 69 6c 69 74 69  n_set_capabiliti
53c0: 65 73 28 22 73 22 29 3b 0a 20 20 63 6d 64 5f 68  es("s");.  cmd_h
53d0: 74 74 70 28 29 3b 0a 7d 0a 0a 0a 23 69 66 20 21  ttp();.}...#if !
53e0: 64 65 66 69 6e 65 64 28 5f 5f 44 41 52 57 49 4e  defined(__DARWIN
53f0: 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  __) && !defined(
5400: 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a  __APPLE__)./*.**
5410: 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65   Search for an e
5420: 78 65 63 75 74 61 62 6c 65 20 6f 6e 20 74 68 65  xecutable on the
5430: 20 50 41 54 48 20 65 6e 76 69 72 6f 6e 6d 65 6e   PATH environmen
5440: 74 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2a 20 52  t variable..** R
5450: 65 74 75 72 6e 20 74 72 75 65 20 28 31 29 20 69  eturn true (1) i
5460: 66 20 66 6f 75 6e 64 20 61 6e 64 20 66 61 6c 73  f found and fals
5470: 65 20 28 30 29 20 69 66 20 6e 6f 74 20 66 6f 75  e (0) if not fou
5480: 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
5490: 74 20 62 69 6e 61 72 79 4f 6e 50 61 74 68 28 63  t binaryOnPath(c
54a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 69 6e 61  onst char *zBina
54b0: 72 79 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ry){.  const cha
54c0: 72 20 2a 7a 50 61 74 68 20 3d 20 67 65 74 65 6e  r *zPath = geten
54d0: 76 28 22 50 41 54 48 22 29 3b 0a 20 20 63 68 61  v("PATH");.  cha
54e0: 72 20 2a 7a 46 75 6c 6c 3b 0a 20 20 69 6e 74 20  r *zFull;.  int 
54f0: 69 3b 0a 20 20 69 6e 74 20 62 45 78 69 73 74 73  i;.  int bExists
5500: 3b 0a 20 20 77 68 69 6c 65 28 20 7a 50 61 74 68  ;.  while( zPath
5510: 20 26 26 20 7a 50 61 74 68 5b 30 5d 20 29 7b 0a   && zPath[0] ){.
5520: 20 20 20 20 77 68 69 6c 65 28 20 7a 50 61 74 68      while( zPath
5530: 5b 30 5d 3d 3d 27 3a 27 20 29 20 7a 50 61 74 68  [0]==':' ) zPath
5540: 2b 2b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ++;.    for(i=0;
5550: 20 7a 50 61 74 68 5b 69 5d 20 26 26 20 7a 50 61   zPath[i] && zPa
5560: 74 68 5b 69 5d 21 3d 27 3a 27 3b 20 69 2b 2b 29  th[i]!=':'; i++)
5570: 7b 7d 0a 20 20 20 20 7a 46 75 6c 6c 20 3d 20 6d  {}.    zFull = m
5580: 70 72 69 6e 74 66 28 22 25 2e 2a 73 2f 25 73 22  printf("%.*s/%s"
5590: 2c 20 69 2c 20 7a 50 61 74 68 2c 20 7a 42 69 6e  , i, zPath, zBin
55a0: 61 72 79 29 3b 0a 20 20 20 20 62 45 78 69 73 74  ary);.    bExist
55b0: 73 20 3d 20 61 63 63 65 73 73 28 7a 46 75 6c 6c  s = access(zFull
55c0: 2c 20 58 5f 4f 4b 29 3b 0a 20 20 20 20 66 72 65  , X_OK);.    fre
55d0: 65 28 7a 46 75 6c 6c 29 3b 0a 20 20 20 20 69 66  e(zFull);.    if
55e0: 28 20 62 45 78 69 73 74 73 3d 3d 30 20 29 20 72  ( bExists==0 ) r
55f0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7a 50 61  eturn 1;.    zPa
5600: 74 68 20 2b 3d 20 69 3b 0a 20 20 7d 0a 20 20 72  th += i;.  }.  r
5610: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
5620: 66 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44  f../*.** COMMAND
5630: 3a 20 73 65 72 76 65 72 0a 2a 2a 20 43 4f 4d 4d  : server.** COMM
5640: 41 4e 44 3a 20 75 69 0a 2a 2a 0a 2a 2a 20 55 73  AND: ui.**.** Us
5650: 61 67 65 3a 20 25 66 6f 73 73 69 6c 20 73 65 72  age: %fossil ser
5660: 76 65 72 20 3f 2d 50 7c 2d 2d 70 6f 72 74 20 54  ver ?-P|--port T
5670: 43 50 50 4f 52 54 3f 20 3f 52 45 50 4f 53 49 54  CPPORT? ?REPOSIT
5680: 4f 52 59 3f 0a 2a 2a 20 20 20 20 4f 72 3a 20 25  ORY?.**    Or: %
5690: 66 6f 73 73 69 6c 20 75 69 20 3f 2d 50 7c 2d 2d  fossil ui ?-P|--
56a0: 70 6f 72 74 20 54 43 50 50 4f 52 54 3f 20 3f 52  port TCPPORT? ?R
56b0: 45 50 4f 53 49 54 4f 52 59 3f 0a 2a 2a 0a 2a 2a  EPOSITORY?.**.**
56c0: 20 4f 70 65 6e 20 61 20 73 6f 63 6b 65 74 20 61   Open a socket a
56d0: 6e 64 20 62 65 67 69 6e 20 6c 69 73 74 65 6e 69  nd begin listeni
56e0: 6e 67 20 61 6e 64 20 72 65 73 70 6f 6e 64 69 6e  ng and respondin
56f0: 67 20 74 6f 20 48 54 54 50 20 72 65 71 75 65 73  g to HTTP reques
5700: 74 73 20 6f 6e 0a 2a 2a 20 54 43 50 20 70 6f 72  ts on.** TCP por
5710: 74 20 38 30 38 30 2c 20 6f 72 20 6f 6e 20 61 6e  t 8080, or on an
5720: 79 20 6f 74 68 65 72 20 54 43 50 20 70 6f 72 74  y other TCP port
5730: 20 64 65 66 69 6e 65 64 20 62 79 20 74 68 65 20   defined by the 
5740: 2d 50 20 6f 72 0a 2a 2a 20 2d 2d 70 6f 72 74 20  -P or.** --port 
5750: 6f 70 74 69 6f 6e 2e 20 20 54 68 65 20 6f 70 74  option.  The opt
5760: 69 6f 6e 61 6c 20 61 72 67 75 6d 65 6e 74 20 69  ional argument i
5770: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
5780: 65 20 72 65 70 6f 73 69 74 6f 72 79 2e 0a 2a 2a  e repository..**
5790: 20 54 68 65 20 72 65 70 6f 73 69 74 6f 72 79 20   The repository 
57a0: 61 72 67 75 6d 65 6e 74 20 6d 61 79 20 62 65 20  argument may be 
57b0: 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 77  omitted if the w
57c0: 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79  orking directory
57d0: 20 69 73 0a 2a 2a 20 77 69 74 68 69 6e 20 61 6e   is.** within an
57e0: 20 6f 70 65 6e 20 63 68 65 63 6b 6f 75 74 2e 0a   open checkout..
57f0: 2a 2a 0a 2a 2a 20 54 68 65 20 22 75 69 22 20 63  **.** The "ui" c
5800: 6f 6d 6d 61 6e 64 20 61 75 74 6f 6d 61 74 69 63  ommand automatic
5810: 61 6c 6c 79 20 73 74 61 72 74 73 20 61 20 77 65  ally starts a we
5820: 62 20 62 72 6f 77 73 65 72 20 61 66 74 65 72 20  b browser after 
5830: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 2a 2a 20  initializing.** 
5840: 74 68 65 20 77 65 62 20 73 65 72 76 65 72 2e 0a  the web server..
5850: 2a 2f 0a 76 6f 69 64 20 63 6d 64 5f 77 65 62 73  */.void cmd_webs
5860: 65 72 76 65 72 28 76 6f 69 64 29 7b 0a 20 20 69  erver(void){.  i
5870: 6e 74 20 69 50 6f 72 74 2c 20 6d 78 50 6f 72 74  nt iPort, mxPort
5880: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
5890: 7a 50 6f 72 74 3b 0a 20 20 63 68 61 72 20 2a 7a  zPort;.  char *z
58a0: 42 72 6f 77 73 65 72 3b 0a 20 20 63 68 61 72 20  Browser;.  char 
58b0: 2a 7a 42 72 6f 77 73 65 72 43 6d 64 20 3d 20 30  *zBrowserCmd = 0
58c0: 3b 0a 0a 20 20 67 2e 74 68 54 72 61 63 65 20 3d  ;..  g.thTrace =
58d0: 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 74 68   find_option("th
58e0: 2d 74 72 61 63 65 22 2c 20 30 2c 20 30 29 21 3d  -trace", 0, 0)!=
58f0: 30 3b 0a 20 20 69 66 28 20 67 2e 74 68 54 72 61  0;.  if( g.thTra
5900: 63 65 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 7a  ce ){.    blob_z
5910: 65 72 6f 28 26 67 2e 74 68 4c 6f 67 29 3b 0a 20  ero(&g.thLog);. 
5920: 20 7d 0a 20 20 7a 50 6f 72 74 20 3d 20 66 69 6e   }.  zPort = fin
5930: 64 5f 6f 70 74 69 6f 6e 28 22 70 6f 72 74 22 2c  d_option("port",
5940: 20 22 50 22 2c 20 31 29 3b 0a 20 20 69 66 28 20   "P", 1);.  if( 
5950: 67 2e 61 72 67 63 21 3d 32 20 26 26 20 67 2e 61  g.argc!=2 && g.a
5960: 72 67 63 21 3d 33 20 29 20 75 73 61 67 65 28 22  rgc!=3 ) usage("
5970: 3f 52 45 50 4f 53 49 54 4f 52 59 3f 22 29 3b 0a  ?REPOSITORY?");.
5980: 20 20 69 66 28 20 67 2e 61 72 67 63 3d 3d 32 20    if( g.argc==2 
5990: 29 7b 0a 20 20 20 20 64 62 5f 6d 75 73 74 5f 62  ){.    db_must_b
59a0: 65 5f 77 69 74 68 69 6e 5f 74 72 65 65 28 29 3b  e_within_tree();
59b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62  .  }else{.    db
59c0: 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79  _open_repository
59d0: 28 67 2e 61 72 67 76 5b 32 5d 29 3b 0a 20 20 7d  (g.argv[2]);.  }
59e0: 0a 20 20 69 66 28 20 7a 50 6f 72 74 20 29 7b 0a  .  if( zPort ){.
59f0: 20 20 20 20 69 50 6f 72 74 20 3d 20 6d 78 50 6f      iPort = mxPo
5a00: 72 74 20 3d 20 61 74 6f 69 28 7a 50 6f 72 74 29  rt = atoi(zPort)
5a10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
5a20: 50 6f 72 74 20 3d 20 64 62 5f 67 65 74 5f 69 6e  Port = db_get_in
5a30: 74 28 22 68 74 74 70 2d 70 6f 72 74 22 2c 20 38  t("http-port", 8
5a40: 30 38 30 29 3b 0a 20 20 20 20 6d 78 50 6f 72 74  080);.    mxPort
5a50: 20 3d 20 69 50 6f 72 74 2b 31 30 30 3b 0a 20 20   = iPort+100;.  
5a60: 7d 0a 23 69 66 6e 64 65 66 20 5f 5f 4d 49 4e 47  }.#ifndef __MING
5a70: 57 33 32 5f 5f 0a 20 20 2f 2a 20 55 6e 69 78 20  W32__.  /* Unix 
5a80: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
5a90: 2f 0a 20 20 69 66 28 20 67 2e 61 72 67 76 5b 31  /.  if( g.argv[1
5aa0: 5d 5b 30 5d 3d 3d 27 75 27 20 29 7b 0a 23 69 66  ][0]=='u' ){.#if
5ab0: 20 21 64 65 66 69 6e 65 64 28 5f 5f 44 41 52 57   !defined(__DARW
5ac0: 49 4e 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65  IN__) && !define
5ad0: 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20  d(__APPLE__).   
5ae0: 20 7a 42 72 6f 77 73 65 72 20 3d 20 64 62 5f 67   zBrowser = db_g
5af0: 65 74 28 22 77 65 62 2d 62 72 6f 77 73 65 72 22  et("web-browser"
5b00: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 42  , 0);.    if( zB
5b10: 72 6f 77 73 65 72 3d 3d 30 20 29 7b 0a 20 20 20  rowser==0 ){.   
5b20: 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a     static char *
5b30: 61 7a 42 72 6f 77 73 65 72 50 72 6f 67 5b 5d 20  azBrowserProg[] 
5b40: 3d 20 7b 20 22 78 64 67 2d 6f 70 65 6e 22 2c 20  = { "xdg-open", 
5b50: 22 67 6e 6f 6d 65 2d 6f 70 65 6e 22 2c 20 22 66  "gnome-open", "f
5b60: 69 72 65 66 6f 78 22 20 7d 3b 0a 20 20 20 20 20  irefox" };.     
5b70: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 7a 42   int i;.      zB
5b80: 72 6f 77 73 65 72 20 3d 20 22 65 63 68 6f 22 3b  rowser = "echo";
5b90: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
5ba0: 69 3c 73 69 7a 65 6f 66 28 61 7a 42 72 6f 77 73  i<sizeof(azBrows
5bb0: 65 72 50 72 6f 67 29 2f 73 69 7a 65 6f 66 28 61  erProg)/sizeof(a
5bc0: 7a 42 72 6f 77 73 65 72 50 72 6f 67 5b 30 5d 29  zBrowserProg[0])
5bd0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
5be0: 69 66 28 20 62 69 6e 61 72 79 4f 6e 50 61 74 68  if( binaryOnPath
5bf0: 28 61 7a 42 72 6f 77 73 65 72 50 72 6f 67 5b 69  (azBrowserProg[i
5c00: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
5c10: 7a 42 72 6f 77 73 65 72 20 3d 20 61 7a 42 72 6f  zBrowser = azBro
5c20: 77 73 65 72 50 72 6f 67 5b 69 5d 3b 0a 20 20 20  wserProg[i];.   
5c30: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5c40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
5c50: 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
5c60: 7a 42 72 6f 77 73 65 72 20 3d 20 64 62 5f 67 65  zBrowser = db_ge
5c70: 74 28 22 77 65 62 2d 62 72 6f 77 73 65 72 22 2c  t("web-browser",
5c80: 20 22 6f 70 65 6e 22 29 3b 0a 23 65 6e 64 69 66   "open");.#endif
5c90: 0a 20 20 20 20 7a 42 72 6f 77 73 65 72 43 6d 64  .    zBrowserCmd
5ca0: 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 20 68   = mprintf("%s h
5cb0: 74 74 70 3a 2f 2f 6c 6f 63 61 6c 68 6f 73 74 3a  ttp://localhost:
5cc0: 25 25 64 2f 20 26 22 2c 20 7a 42 72 6f 77 73 65  %%d/ &", zBrowse
5cd0: 72 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 63 6c 6f  r);.  }.  db_clo
5ce0: 73 65 28 29 3b 0a 20 20 69 66 28 20 63 67 69 5f  se();.  if( cgi_
5cf0: 68 74 74 70 5f 73 65 72 76 65 72 28 69 50 6f 72  http_server(iPor
5d00: 74 2c 20 6d 78 50 6f 72 74 2c 20 7a 42 72 6f 77  t, mxPort, zBrow
5d10: 73 65 72 43 6d 64 29 20 29 7b 0a 20 20 20 20 66  serCmd) ){.    f
5d20: 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 75 6e 61  ossil_fatal("una
5d30: 62 6c 65 20 74 6f 20 6c 69 73 74 65 6e 20 6f 6e  ble to listen on
5d40: 20 54 43 50 20 73 6f 63 6b 65 74 20 25 64 22 2c   TCP socket %d",
5d50: 20 69 50 6f 72 74 29 3b 0a 20 20 7d 0a 20 20 67   iPort);.  }.  g
5d60: 2e 68 74 74 70 49 6e 20 3d 20 73 74 64 69 6e 3b  .httpIn = stdin;
5d70: 0a 20 20 67 2e 68 74 74 70 4f 75 74 20 3d 20 73  .  g.httpOut = s
5d80: 74 64 6f 75 74 3b 0a 20 20 69 66 28 20 67 2e 66  tdout;.  if( g.f
5d90: 48 74 74 70 54 72 61 63 65 20 29 7b 0a 20 20 20  HttpTrace ){.   
5da0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
5db0: 20 22 3d 3d 3d 3d 3d 3d 20 53 45 52 56 45 52 20   "====== SERVER 
5dc0: 70 69 64 20 25 64 20 3d 3d 3d 3d 3d 3d 3d 5c 6e  pid %d =======\n
5dd0: 22 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20  ", getpid());.  
5de0: 7d 0a 20 20 67 2e 63 67 69 50 61 6e 69 63 20 3d  }.  g.cgiPanic =
5df0: 20 31 3b 0a 20 20 69 66 28 20 67 2e 61 72 67 63   1;.  if( g.argc
5e00: 3d 3d 32 20 29 7b 0a 20 20 20 20 64 62 5f 6d 75  ==2 ){.    db_mu
5e10: 73 74 5f 62 65 5f 77 69 74 68 69 6e 5f 74 72 65  st_be_within_tre
5e20: 65 28 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  e();.  }else{.  
5e30: 20 20 64 62 5f 6f 70 65 6e 5f 72 65 70 6f 73 69    db_open_reposi
5e40: 74 6f 72 79 28 67 2e 61 72 67 76 5b 32 5d 29 3b  tory(g.argv[2]);
5e50: 0a 20 20 7d 0a 20 20 63 67 69 5f 68 61 6e 64 6c  .  }.  cgi_handl
5e60: 65 5f 68 74 74 70 5f 72 65 71 75 65 73 74 28 30  e_http_request(0
5e70: 29 3b 0a 20 20 70 72 6f 63 65 73 73 5f 6f 6e 65  );.  process_one
5e80: 5f 77 65 62 5f 70 61 67 65 28 29 3b 0a 23 65 6c  _web_page();.#el
5e90: 73 65 0a 20 20 2f 2a 20 57 69 6e 33 32 20 69 6d  se.  /* Win32 im
5ea0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  plementation */.
5eb0: 20 20 69 66 28 20 67 2e 61 72 67 76 5b 31 5d 5b    if( g.argv[1][
5ec0: 30 5d 3d 3d 27 75 27 20 29 7b 0a 20 20 20 20 7a  0]=='u' ){.    z
5ed0: 42 72 6f 77 73 65 72 20 3d 20 64 62 5f 67 65 74  Browser = db_get
5ee0: 28 22 77 65 62 2d 62 72 6f 77 73 65 72 22 2c 20  ("web-browser", 
5ef0: 22 73 74 61 72 74 22 29 3b 0a 20 20 20 20 7a 42  "start");.    zB
5f00: 72 6f 77 73 65 72 43 6d 64 20 3d 20 6d 70 72 69  rowserCmd = mpri
5f10: 6e 74 66 28 22 25 73 20 68 74 74 70 3a 2f 2f 31  ntf("%s http://1
5f20: 32 37 2e 30 2e 30 2e 31 3a 25 25 64 2f 22 2c 20  27.0.0.1:%%d/", 
5f30: 7a 42 72 6f 77 73 65 72 29 3b 0a 20 20 7d 0a 20  zBrowser);.  }. 
5f40: 20 64 62 5f 63 6c 6f 73 65 28 29 3b 0a 20 20 77   db_close();.  w
5f50: 69 6e 33 32 5f 68 74 74 70 5f 73 65 72 76 65 72  in32_http_server
5f60: 28 69 50 6f 72 74 2c 20 6d 78 50 6f 72 74 2c 20  (iPort, mxPort, 
5f70: 7a 42 72 6f 77 73 65 72 43 6d 64 29 3b 0a 23 65  zBrowserCmd);.#e
5f80: 6e 64 69 66 0a 7d 0a                             ndif.}.