Hex Artifact Content
Not logged in

Artifact 97f8036e59539cac6399252af13d28b161b675a4:

File src/main.c part of check-in [7ba10f1a6a] - When the "http" command is run as root, automatically set up a chroot jail and drop root privileges prior to reading any input. by drh on 2009-08-31 00:48:44.

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 69 6e 74 20 6c 6f  base */.  int lo
07f0: 63 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20 20  calOpen;        
0800: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
0810: 20 6c 6f 63 61 6c 20 64 61 74 61 62 61 73 65 20   local database 
0820: 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20 63 68 61  is open */.  cha
0830: 72 20 2a 7a 4c 6f 63 61 6c 52 6f 6f 74 3b 20 20  r *zLocalRoot;  
0840: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65       /* The dire
0850: 63 74 6f 72 79 20 68 6f 6c 64 69 6e 67 20 74 68  ctory holding th
0860: 65 20 20 6c 6f 63 61 6c 20 64 61 74 61 62 61 73  e  local databas
0870: 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 50 72  e */.  int minPr
0880: 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 2f  efix;          /
0890: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 69 67 69  * Number of digi
08a0: 74 73 20 6e 65 65 64 65 64 20 66 6f 72 20 61 20  ts needed for a 
08b0: 64 69 73 74 69 6e 63 74 20 55 55 49 44 20 2a 2f  distinct UUID */
08c0: 0a 20 20 69 6e 74 20 66 53 71 6c 54 72 61 63 65  .  int fSqlTrace
08d0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ;          /* Tr
08e0: 75 65 20 69 66 20 2d 73 71 6c 74 72 61 63 65 20  ue if -sqltrace 
08f0: 66 6c 61 67 20 69 73 20 70 72 65 73 65 6e 74 20  flag is present 
0900: 2a 2f 0a 20 20 69 6e 74 20 66 53 71 6c 50 72 69  */.  int fSqlPri
0910: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nt;          /* 
0920: 54 72 75 65 20 69 66 20 2d 73 71 6c 70 72 69 6e  True if -sqlprin
0930: 74 20 66 6c 61 67 20 69 73 20 70 72 65 73 65 6e  t flag is presen
0940: 74 20 2a 2f 0a 20 20 69 6e 74 20 66 48 74 74 70  t */.  int fHttp
0950: 54 72 61 63 65 3b 20 20 20 20 20 20 20 20 20 2f  Trace;         /
0960: 2a 20 54 72 61 63 65 20 6f 75 74 62 6f 75 6e 64  * Trace outbound
0970: 20 48 54 54 50 20 72 65 71 75 65 73 74 73 20 2a   HTTP requests *
0980: 2f 0a 20 20 69 6e 74 20 66 4e 6f 53 79 6e 63 3b  /.  int fNoSync;
0990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
09a0: 6f 20 6e 6f 74 20 64 6f 20 61 6e 20 61 75 74 6f  o not do an auto
09b0: 73 79 6e 63 20 65 76 65 6e 2e 20 20 2d 2d 6e 6f  sync even.  --no
09c0: 73 79 6e 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a  sync */.  char *
09d0: 7a 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20  zPath;          
09e0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 77 65 62    /* Name of web
09f0: 70 61 67 65 20 62 65 69 6e 67 20 73 65 72 76 65  page being serve
0a00: 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78  d */.  char *zEx
0a10: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f  tra;           /
0a20: 2a 20 45 78 74 72 61 20 70 61 74 68 20 69 6e 66  * Extra path inf
0a30: 6f 72 6d 61 74 69 6f 6e 20 70 61 73 74 20 74 68  ormation past th
0a40: 65 20 77 65 62 70 61 67 65 20 6e 61 6d 65 20 2a  e webpage name *
0a50: 2f 0a 20 20 63 68 61 72 20 2a 7a 42 61 73 65 55  /.  char *zBaseU
0a60: 52 4c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46  RL;         /* F
0a70: 75 6c 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20  ull text of the 
0a80: 55 52 4c 20 62 65 69 6e 67 20 73 65 72 76 65 64  URL being served
0a90: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 6f 70   */.  char *zTop
0aa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
0ab0: 20 50 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72   Parent director
0ac0: 79 20 6f 66 20 7a 50 61 74 68 20 2a 2f 0a 20 20  y of zPath */.  
0ad0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6e  const char *zCon
0ae0: 74 65 6e 74 54 79 70 65 3b 20 20 2f 2a 20 54 68  tentType;  /* Th
0af0: 65 20 63 6f 6e 74 65 6e 74 20 74 79 70 65 20 6f  e content type o
0b00: 66 20 74 68 65 20 69 6e 70 75 74 20 48 54 54 50  f the input HTTP
0b10: 20 72 65 71 75 65 73 74 20 2a 2f 0a 20 20 69 6e   request */.  in
0b20: 74 20 69 45 72 72 50 72 69 6f 72 69 74 79 3b 20  t iErrPriority; 
0b30: 20 20 20 20 20 20 2f 2a 20 50 72 69 6f 72 69 74        /* Priorit
0b40: 79 20 6f 66 20 63 75 72 72 65 6e 74 20 65 72 72  y of current err
0b50: 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20  or message */.  
0b60: 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 20 20  char *zErrMsg;  
0b70: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
0b80: 6f 66 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  of an error mess
0b90: 61 67 65 20 2a 2f 0a 20 20 42 6c 6f 62 20 63 67  age */.  Blob cg
0ba0: 69 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  iIn;            
0bb0: 20 2f 2a 20 49 6e 70 75 74 20 74 6f 20 61 6e 20   /* Input to an 
0bc0: 78 66 65 72 20 77 77 77 20 6d 65 74 68 6f 64 20  xfer www method 
0bd0: 2a 2f 0a 20 20 69 6e 74 20 63 67 69 50 61 6e 69  */.  int cgiPani
0be0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
0bf0: 57 72 69 74 65 20 65 72 72 6f 72 20 6d 65 73 73  Write error mess
0c00: 61 67 65 73 20 74 6f 20 43 47 49 20 2a 2f 0a 20  ages to CGI */. 
0c10: 20 69 6e 74 20 78 66 65 72 50 61 6e 69 63 3b 20   int xferPanic; 
0c20: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
0c30: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  e error messages
0c40: 20 69 6e 20 58 46 45 52 20 70 72 6f 74 6f 63 6f   in XFER protoco
0c50: 6c 20 2a 2f 0a 20 20 69 6e 74 20 66 75 6c 6c 48  l */.  int fullH
0c60: 74 74 70 52 65 70 6c 79 3b 20 20 20 20 20 20 2f  ttpReply;      /
0c70: 2a 20 54 72 75 65 20 66 6f 72 20 66 75 6c 6c 20  * True for full 
0c80: 48 54 54 50 20 72 65 70 6c 79 2e 20 20 46 61 6c  HTTP reply.  Fal
0c90: 73 65 20 66 6f 72 20 43 47 49 20 72 65 70 6c 79  se for CGI reply
0ca0: 20 2a 2f 0a 20 20 54 68 5f 49 6e 74 65 72 70 20   */.  Th_Interp 
0cb0: 2a 69 6e 74 65 72 70 3b 20 20 20 20 20 20 2f 2a  *interp;      /*
0cc0: 20 54 68 65 20 54 48 31 20 69 6e 74 65 72 70 72   The TH1 interpr
0cd0: 65 74 65 72 20 2a 2f 0a 20 20 46 49 4c 45 20 2a  eter */.  FILE *
0ce0: 68 74 74 70 49 6e 3b 20 20 20 20 20 20 20 20 20  httpIn;         
0cf0: 20 20 2f 2a 20 41 63 63 65 70 74 20 48 54 54 50    /* Accept HTTP
0d00: 20 69 6e 70 75 74 20 66 72 6f 6d 20 68 65 72 65   input from here
0d10: 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 68 74 74 70   */.  FILE *http
0d20: 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Out;          /*
0d30: 20 53 65 6e 64 20 48 54 54 50 20 6f 75 74 70 75   Send HTTP outpu
0d40: 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  t here */.  int 
0d50: 78 6c 69 6e 6b 43 6c 75 73 74 65 72 4f 6e 6c 79  xlinkClusterOnly
0d60: 3b 20 20 20 2f 2a 20 53 65 74 20 77 68 65 6e 20  ;   /* Set when 
0d70: 63 6c 6f 6e 69 6e 67 2e 20 20 4f 6e 6c 79 20 70  cloning.  Only p
0d80: 72 6f 63 65 73 73 20 63 6c 75 73 74 65 72 73 20  rocess clusters 
0d90: 2a 2f 0a 20 20 69 6e 74 20 66 54 69 6d 65 46 6f  */.  int fTimeFo
0da0: 72 6d 61 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  rmat;        /* 
0db0: 31 20 66 6f 72 20 55 54 43 2e 20 20 32 20 66 6f  1 for UTC.  2 fo
0dc0: 72 20 6c 6f 63 61 6c 74 69 6d 65 2e 20 20 30 20  r localtime.  0 
0dd0: 6e 6f 74 20 79 65 74 20 73 65 6c 65 63 74 65 64  not yet selected
0de0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 43 6f 6d 6d   */.  int *aComm
0df0: 69 74 46 69 6c 65 3b 20 20 20 20 20 20 20 2f 2a  itFile;       /*
0e00: 20 41 72 72 61 79 20 6f 66 20 66 69 6c 65 73 20   Array of files 
0e10: 74 6f 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20  to be committed 
0e20: 2a 2f 0a 20 20 69 6e 74 20 6d 61 72 6b 50 72 69  */.  int markPri
0e30: 76 61 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  vate;        /* 
0e40: 41 6c 6c 20 6e 65 77 20 61 72 74 69 66 61 63 74  All new artifact
0e50: 73 20 61 72 65 20 70 72 69 76 61 74 65 20 69 66  s are private if
0e60: 20 74 72 75 65 20 2a 2f 0a 0a 20 20 69 6e 74 20   true */..  int 
0e70: 75 72 6c 49 73 46 69 6c 65 3b 20 20 20 20 20 20  urlIsFile;      
0e80: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
0e90: 20 22 66 69 6c 65 3a 22 20 75 72 6c 20 2a 2f 0a   "file:" url */.
0ea0: 20 20 69 6e 74 20 75 72 6c 49 73 48 74 74 70 73    int urlIsHttps
0eb0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
0ec0: 65 20 69 66 20 61 20 22 68 74 74 70 73 3a 22 20  e if a "https:" 
0ed0: 75 72 6c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 75  url */.  char *u
0ee0: 72 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  rlName;         
0ef0: 20 2f 2a 20 48 6f 73 74 6e 61 6d 65 20 66 6f 72   /* Hostname for
0f00: 20 68 74 74 70 3a 20 6f 72 20 66 69 6c 65 6e 61   http: or filena
0f10: 6d 65 20 66 6f 72 20 66 69 6c 65 3a 20 2a 2f 0a  me for file: */.
0f20: 20 20 63 68 61 72 20 2a 75 72 6c 48 6f 73 74 6e    char *urlHostn
0f30: 61 6d 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  ame;      /* The
0f40: 20 48 4f 53 54 3a 20 70 61 72 61 6d 65 74 65 72   HOST: parameter
0f50: 20 6f 6e 20 68 74 74 70 20 68 65 61 64 65 72 73   on http headers
0f60: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 75 72 6c 50   */.  char *urlP
0f70: 72 6f 74 6f 63 6f 6c 3b 20 20 20 20 20 20 2f 2a  rotocol;      /*
0f80: 20 22 68 74 74 70 22 20 6f 72 20 22 68 74 74 70   "http" or "http
0f90: 73 22 20 2a 2f 0a 20 20 69 6e 74 20 75 72 6c 50  s" */.  int urlP
0fa0: 6f 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ort;            
0fb0: 2f 2a 20 54 43 50 20 70 6f 72 74 20 6e 75 6d 62  /* TCP port numb
0fc0: 65 72 20 66 6f 72 20 68 74 74 70 3a 20 6f 72 20  er for http: or 
0fd0: 68 74 74 70 73 3a 20 2a 2f 0a 20 20 69 6e 74 20  https: */.  int 
0fe0: 75 72 6c 44 66 6c 74 50 6f 72 74 3b 20 20 20 20  urlDfltPort;    
0ff0: 20 20 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75      /* The defau
1000: 6c 74 20 70 6f 72 74 20 66 6f 72 20 74 68 65 20  lt port for the 
1010: 67 69 76 65 6e 20 70 72 6f 74 6f 63 6f 6c 20 2a  given protocol *
1020: 2f 0a 20 20 63 68 61 72 20 2a 75 72 6c 50 61 74  /.  char *urlPat
1030: 68 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  h;          /* P
1040: 61 74 68 6e 61 6d 65 20 66 6f 72 20 68 74 74 70  athname for http
1050: 3a 20 2a 2f 0a 20 20 63 68 61 72 20 2a 75 72 6c  : */.  char *url
1060: 55 73 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f  User;          /
1070: 2a 20 55 73 65 72 20 69 64 20 66 6f 72 20 68 74  * User id for ht
1080: 74 70 3a 20 2a 2f 0a 20 20 63 68 61 72 20 2a 75  tp: */.  char *u
1090: 72 6c 50 61 73 73 77 64 3b 20 20 20 20 20 20 20  rlPasswd;       
10a0: 20 2f 2a 20 50 61 73 73 77 6f 72 64 20 66 6f 72   /* Password for
10b0: 20 68 74 74 70 3a 20 2a 2f 0a 20 20 63 68 61 72   http: */.  char
10c0: 20 2a 75 72 6c 43 61 6e 6f 6e 69 63 61 6c 3b 20   *urlCanonical; 
10d0: 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c      /* Canonical
10e0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
10f0: 6f 66 20 74 68 65 20 55 52 4c 20 2a 2f 0a 0a 20  of the URL */.. 
1100: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f   const char *zLo
1110: 67 69 6e 3b 20 20 20 20 20 2f 2a 20 4c 6f 67 69  gin;     /* Logi
1120: 6e 20 6e 61 6d 65 2e 20 20 22 22 20 69 66 20 6e  n name.  "" if n
1130: 6f 74 20 6c 6f 67 67 65 64 20 69 6e 2e 20 2a 2f  ot logged in. */
1140: 0a 20 20 69 6e 74 20 6e 6f 50 73 77 64 3b 20 20  .  int noPswd;  
1150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1160: 67 67 65 64 20 69 6e 20 77 69 74 68 6f 75 74 20  gged in without 
1170: 70 61 73 73 77 6f 72 64 20 28 6f 6e 20 31 32 37  password (on 127
1180: 2e 30 2e 30 2e 31 29 20 2a 2f 0a 20 20 69 6e 74  .0.0.1) */.  int
1190: 20 75 73 65 72 55 69 64 3b 20 20 20 20 20 20 20   userUid;       
11a0: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
11b0: 75 73 65 72 20 69 64 20 2a 2f 0a 0a 20 20 2f 2a  user id */..  /*
11c0: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65   Information use
11d0: 64 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  d to populate th
11e0: 65 20 52 43 56 46 52 4f 4d 20 74 61 62 6c 65 20  e RCVFROM table 
11f0: 2a 2f 0a 20 20 69 6e 74 20 72 63 76 69 64 3b 20  */.  int rcvid; 
1200: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1210: 54 68 65 20 72 63 76 69 64 2e 20 20 30 20 69 66  The rcvid.  0 if
1220: 20 6e 6f 74 20 79 65 74 20 64 65 66 69 6e 65 64   not yet defined
1230: 2e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 49 70  . */.  char *zIp
1240: 41 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f  Addr;          /
1250: 2a 20 54 68 65 20 72 65 6d 6f 74 65 20 49 50 20  * The remote IP 
1260: 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 63 68 61  address */.  cha
1270: 72 20 2a 7a 4e 6f 6e 63 65 3b 20 20 20 20 20 20  r *zNonce;      
1280: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 6f 6e 63       /* The nonc
1290: 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 67 69 6e  e used for login
12a0: 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 70 65 72 6d   */.  .  /* perm
12b0: 69 73 73 69 6f 6e 73 20 75 73 65 64 20 62 79 20  issions used by 
12c0: 74 68 65 20 73 65 72 76 65 72 20 2a 2f 0a 20 20  the server */.  
12d0: 69 6e 74 20 6f 6b 53 65 74 75 70 3b 20 20 20 20  int okSetup;    
12e0: 20 20 20 20 20 20 20 20 2f 2a 20 73 3a 20 75 73          /* s: us
12f0: 65 20 53 65 74 75 70 20 73 63 72 65 65 6e 73 20  e Setup screens 
1300: 6f 6e 20 77 65 62 20 69 6e 74 65 72 66 61 63 65  on web interface
1310: 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b 41 64 6d 69   */.  int okAdmi
1320: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n;            /*
1330: 20 61 3a 20 61 64 6d 69 6e 69 73 74 72 61 74 69   a: administrati
1340: 76 65 20 70 65 72 6d 69 73 73 69 6f 6e 20 2a 2f  ve permission */
1350: 0a 20 20 69 6e 74 20 6f 6b 44 65 6c 65 74 65 3b  .  int okDelete;
1360: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 3a             /* d:
1370: 20 64 65 6c 65 74 65 20 77 69 6b 69 20 6f 72 20   delete wiki or 
1380: 74 69 63 6b 65 74 73 20 2a 2f 0a 20 20 69 6e 74  tickets */.  int
1390: 20 6f 6b 50 61 73 73 77 6f 72 64 3b 20 20 20 20   okPassword;    
13a0: 20 20 20 20 20 2f 2a 20 70 3a 20 63 68 61 6e 67       /* p: chang
13b0: 65 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20  e password */.  
13c0: 69 6e 74 20 6f 6b 51 75 65 72 79 3b 20 20 20 20  int okQuery;    
13d0: 20 20 20 20 20 20 20 20 2f 2a 20 71 3a 20 63 72          /* q: cr
13e0: 65 61 74 65 20 6e 65 77 20 72 65 70 6f 72 74 73  eate new reports
13f0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b 57 72 69 74   */.  int okWrit
1400: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1410: 20 69 3a 20 78 66 65 72 20 69 6e 62 6f 75 6e 64   i: xfer inbound
1420: 2e 20 63 68 65 63 6b 69 6e 20 2a 2f 0a 20 20 69  . checkin */.  i
1430: 6e 74 20 6f 6b 52 65 61 64 3b 20 20 20 20 20 20  nt okRead;      
1440: 20 20 20 20 20 20 20 2f 2a 20 6f 3a 20 78 66 65         /* o: xfe
1450: 72 20 6f 75 74 62 6f 75 6e 64 2e 20 63 68 65 63  r outbound. chec
1460: 6b 6f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b  kout */.  int ok
1470: 48 69 73 74 6f 72 79 3b 20 20 20 20 20 20 20 20  History;        
1480: 20 20 2f 2a 20 68 3a 20 61 63 63 65 73 73 20 68    /* h: access h
1490: 69 73 74 6f 72 69 63 61 6c 20 69 6e 66 6f 72 6d  istorical inform
14a0: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 69 6e 74 20  ation. */.  int 
14b0: 6f 6b 43 6c 6f 6e 65 3b 20 20 20 20 20 20 20 20  okClone;        
14c0: 20 20 20 20 2f 2a 20 67 3a 20 63 6c 6f 6e 65 20      /* g: clone 
14d0: 2a 2f 0a 20 20 69 6e 74 20 6f 6b 52 64 57 69 6b  */.  int okRdWik
14e0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  i;           /* 
14f0: 6a 3a 20 76 69 65 77 20 77 69 6b 69 20 76 69 61  j: view wiki via
1500: 20 77 65 62 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b   web */.  int ok
1510: 4e 65 77 57 69 6b 69 3b 20 20 20 20 20 20 20 20  NewWiki;        
1520: 20 20 2f 2a 20 66 3a 20 63 72 65 61 74 65 20 6e    /* f: create n
1530: 65 77 20 77 69 6b 69 20 76 69 61 20 77 65 62 20  ew wiki via web 
1540: 2a 2f 0a 20 20 69 6e 74 20 6f 6b 41 70 6e 64 57  */.  int okApndW
1550: 69 6b 69 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  iki;         /* 
1560: 6d 3a 20 61 70 70 65 6e 64 20 74 6f 20 77 69 6b  m: append to wik
1570: 69 20 76 69 61 20 77 65 62 20 2a 2f 0a 20 20 69  i via web */.  i
1580: 6e 74 20 6f 6b 57 72 57 69 6b 69 3b 20 20 20 20  nt okWrWiki;    
1590: 20 20 20 20 20 20 20 2f 2a 20 6b 3a 20 65 64 69         /* k: edi
15a0: 74 20 77 69 6b 69 20 76 69 61 20 77 65 62 20 2a  t wiki via web *
15b0: 2f 0a 20 20 69 6e 74 20 6f 6b 52 64 54 6b 74 3b  /.  int okRdTkt;
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
15d0: 3a 20 76 69 65 77 20 74 69 63 6b 65 74 73 20 76  : view tickets v
15e0: 69 61 20 77 65 62 20 2a 2f 0a 20 20 69 6e 74 20  ia web */.  int 
15f0: 6f 6b 4e 65 77 54 6b 74 3b 20 20 20 20 20 20 20  okNewTkt;       
1600: 20 20 20 20 2f 2a 20 6e 3a 20 63 72 65 61 74 65      /* n: create
1610: 20 6e 65 77 20 74 69 63 6b 65 74 73 20 2a 2f 0a   new tickets */.
1620: 20 20 69 6e 74 20 6f 6b 41 70 6e 64 54 6b 74 3b    int okApndTkt;
1630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 3a 20            /* c: 
1640: 61 70 70 65 6e 64 20 74 6f 20 74 69 63 6b 65 74  append to ticket
1650: 73 20 76 69 61 20 74 68 65 20 77 65 62 20 2a 2f  s via the web */
1660: 0a 20 20 69 6e 74 20 6f 6b 57 72 54 6b 74 3b 20  .  int okWrTkt; 
1670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 77 3a             /* w:
1680: 20 6d 61 6b 65 20 63 68 61 6e 67 65 73 20 74 6f   make changes to
1690: 20 74 69 63 6b 65 74 73 20 76 69 61 20 77 65 62   tickets via web
16a0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b 54 6b 74 46   */.  int okTktF
16b0: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  mt;           /*
16c0: 20 74 3a 20 63 72 65 61 74 65 20 6e 65 77 20 74   t: create new t
16d0: 69 63 6b 65 74 20 72 65 70 6f 72 74 20 66 6f 72  icket report for
16e0: 6d 61 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b  mats */.  int ok
16f0: 52 64 41 64 64 72 3b 20 20 20 20 20 20 20 20 20  RdAddr;         
1700: 20 20 2f 2a 20 65 3a 20 72 65 61 64 20 65 6d 61    /* e: read ema
1710: 69 6c 20 61 64 64 72 65 73 73 65 73 20 6f 72 20  il addresses or 
1720: 6f 74 68 65 72 20 70 72 69 76 61 74 65 20 64 61  other private da
1730: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b 5a 69  ta */.  int okZi
1740: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1750: 2f 2a 20 7a 3a 20 64 6f 77 6e 6c 6f 61 64 20 7a  /* z: download z
1760: 69 70 70 65 64 20 61 72 74 69 66 61 63 74 20 76  ipped artifact v
1770: 69 61 20 2f 7a 69 70 20 55 52 4c 20 2a 2f 0a 0a  ia /zip URL */..
1780: 20 20 2f 2a 20 46 6f 72 20 64 65 66 65 6e 73 65    /* For defense
1790: 20 61 67 61 69 6e 73 74 20 43 72 6f 73 73 2d 73   against Cross-s
17a0: 69 74 65 20 52 65 71 75 65 73 74 20 46 6f 72 67  ite Request Forg
17b0: 65 72 79 20 61 74 74 61 63 6b 73 20 2a 2f 0a 20  ery attacks */. 
17c0: 20 63 68 61 72 20 7a 43 73 72 66 54 6f 6b 65 6e   char zCsrfToken
17d0: 5b 31 32 5d 3b 20 20 20 20 2f 2a 20 56 61 6c 75  [12];    /* Valu
17e0: 65 20 6f 66 20 74 68 65 20 61 6e 74 69 2d 43 53  e of the anti-CS
17f0: 52 46 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e  RF token */.  in
1800: 74 20 6f 6b 43 73 72 66 3b 20 20 20 20 20 20 20  t okCsrf;       
1810: 20 20 20 20 20 20 2f 2a 20 41 6e 74 69 2d 43 53        /* Anti-CS
1820: 52 46 20 74 6f 6b 65 6e 20 69 73 20 70 72 65 73  RF token is pres
1830: 65 6e 74 20 61 6e 64 20 76 61 6c 69 64 20 2a 2f  ent and valid */
1840: 0a 0a 20 20 46 49 4c 45 20 2a 66 44 65 62 75 67  ..  FILE *fDebug
1850: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ;           /* W
1860: 72 69 74 65 20 64 65 62 75 67 20 69 6e 66 6f 72  rite debug infor
1870: 6d 61 74 69 6f 6e 20 68 65 72 65 2c 20 69 66 20  mation here, if 
1880: 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 20  the file exists 
1890: 2a 2f 0a 20 20 69 6e 74 20 74 68 54 72 61 63 65  */.  int thTrace
18a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
18b0: 54 72 75 65 20 74 6f 20 65 6e 61 62 6c 65 20 54  True to enable T
18c0: 48 31 20 64 65 62 75 67 67 69 6e 67 20 6f 75 74  H1 debugging out
18d0: 70 75 74 20 2a 2f 0a 20 20 42 6c 6f 62 20 74 68  put */.  Blob th
18e0: 4c 6f 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Log;            
18f0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20   /* Text of the 
1900: 54 48 31 20 64 65 62 75 67 67 69 6e 67 20 6f 75  TH1 debugging ou
1910: 74 70 75 74 20 2a 2f 0a 0a 20 20 69 6e 74 20 69  tput */..  int i
1920: 73 48 6f 6d 65 3b 20 20 20 20 20 20 20 20 20 20  sHome;          
1930: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
1940: 6e 64 65 72 69 6e 67 20 74 68 65 20 22 68 6f 6d  ndering the "hom
1950: 65 22 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a  e" page */..  /*
1960: 20 53 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65   Storage for the
1970: 20 61 75 78 28 29 20 61 6e 64 2f 6f 72 20 6f 70   aux() and/or op
1980: 74 69 6f 6e 28 29 20 53 51 4c 20 66 75 6e 63 74  tion() SQL funct
1990: 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
19a0: 0a 20 20 69 6e 74 20 6e 41 75 78 3b 20 20 20 20  .  int nAux;    
19b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 69 73  /* Number of dis
19d0: 74 69 6e 63 74 20 61 75 78 28 29 20 6f 72 20 6f  tinct aux() or o
19e0: 70 74 69 6f 6e 28 29 20 76 61 6c 75 65 73 20 2a  ption() values *
19f0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1a00: 61 7a 41 75 78 4e 61 6d 65 5b 4d 58 5f 41 55 58  azAuxName[MX_AUX
1a10: 5d 3b 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 65 61  ]; /* Name of ea
1a20: 63 68 20 61 75 78 28 29 20 6f 72 20 6f 70 74 69  ch aux() or opti
1a30: 6f 6e 28 29 20 76 61 6c 75 65 20 2a 2f 0a 20 20  on() value */.  
1a40: 63 68 61 72 20 2a 61 7a 41 75 78 50 61 72 61 6d  char *azAuxParam
1a50: 5b 4d 58 5f 41 55 58 5d 3b 20 20 20 20 20 20 2f  [MX_AUX];      /
1a60: 2a 20 50 61 72 61 6d 20 6f 66 20 65 61 63 68 20  * Param of each 
1a70: 61 75 78 28 29 20 6f 72 20 6f 70 74 69 6f 6e 28  aux() or option(
1a80: 29 20 76 61 6c 75 65 20 2a 2f 0a 20 20 63 6f 6e  ) value */.  con
1a90: 73 74 20 63 68 61 72 20 2a 61 7a 41 75 78 56 61  st char *azAuxVa
1aa0: 6c 5b 4d 58 5f 41 55 58 5d 3b 20 20 2f 2a 20 56  l[MX_AUX];  /* V
1ab0: 61 6c 75 65 20 6f 66 20 65 61 63 68 20 61 75 78  alue of each aux
1ac0: 28 29 20 6f 72 20 6f 70 74 69 6f 6e 28 29 20 76  () or option() v
1ad0: 61 6c 75 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  alue */.  const 
1ae0: 63 68 61 72 20 2a 2a 61 7a 41 75 78 4f 70 74 5b  char **azAuxOpt[
1af0: 4d 58 5f 41 55 58 5d 3b 20 2f 2a 20 4f 70 74 69  MX_AUX]; /* Opti
1b00: 6f 6e 73 20 6f 66 20 65 61 63 68 20 6f 70 74 69  ons of each opti
1b10: 6f 6e 28 29 20 76 61 6c 75 65 20 2a 2f 0a 20 20  on() value */.  
1b20: 69 6e 74 20 61 6e 41 75 78 43 6f 6c 73 5b 4d 58  int anAuxCols[MX
1b30: 5f 41 55 58 5d 3b 20 20 20 20 20 20 20 20 20 2f  _AUX];         /
1b40: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
1b50: 6d 6e 73 20 66 6f 72 20 6f 70 74 69 6f 6e 28 29  mns for option()
1b60: 20 76 61 6c 75 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f   values */.};../
1b70: 2a 0a 2a 2a 20 4d 61 63 72 6f 20 66 6f 72 20 64  *.** Macro for d
1b80: 65 62 75 67 67 69 6e 67 3a 0a 2a 2f 0a 23 64 65  ebugging:.*/.#de
1b90: 66 69 6e 65 20 43 47 49 44 45 42 55 47 28 58 29  fine CGIDEBUG(X)
1ba0: 20 20 69 66 28 20 67 2e 66 44 65 62 75 67 20 29    if( g.fDebug )
1bb0: 20 63 67 69 5f 64 65 62 75 67 20 58 0a 0a 23 65   cgi_debug X..#e
1bc0: 6e 64 69 66 0a 0a 47 6c 6f 62 61 6c 20 67 3b 0a  ndif..Global g;.
1bd0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  ./*.** The table
1be0: 20 6f 66 20 77 65 62 20 70 61 67 65 73 20 73 75   of web pages su
1bf0: 70 70 6f 72 74 65 64 20 62 79 20 74 68 69 73 20  pported by this 
1c00: 61 70 70 6c 69 63 61 74 69 6f 6e 20 69 73 20 67  application is g
1c10: 65 6e 65 72 61 74 65 64 20 0a 2a 2a 20 61 75 74  enerated .** aut
1c20: 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 74 68  omatically by th
1c30: 65 20 22 6d 6b 69 6e 64 65 78 22 20 70 72 6f 67  e "mkindex" prog
1c40: 72 61 6d 20 61 6e 64 20 77 72 69 74 74 65 6e 20  ram and written 
1c50: 69 6e 74 6f 20 61 20 66 69 6c 65 0a 2a 2a 20 6e  into a file.** n
1c60: 61 6d 65 64 20 22 70 61 67 65 5f 69 6e 64 65 78  amed "page_index
1c70: 2e 68 22 2e 20 20 57 65 20 69 6e 63 6c 75 64 65  .h".  We include
1c80: 20 74 68 61 74 20 66 69 6c 65 20 68 65 72 65 20   that file here 
1c90: 74 6f 20 67 65 74 20 61 63 63 65 73 73 0a 2a 2a  to get access.**
1ca0: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   to the table..*
1cb0: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 67 65  /.#include "page
1cc0: 5f 69 6e 64 65 78 2e 68 22 0a 0a 2f 2a 0a 2a 2a  _index.h"../*.**
1cd0: 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 66 75   Search for a fu
1ce0: 6e 63 74 69 6f 6e 20 77 68 6f 73 65 20 6e 61 6d  nction whose nam
1cf0: 65 20 6d 61 74 63 68 65 73 20 7a 4e 61 6d 65 2e  e matches zName.
1d00: 20 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65    Write a pointe
1d10: 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 66 75 6e  r to.** that fun
1d20: 63 74 69 6f 6e 20 69 6e 74 6f 20 2a 70 78 46 75  ction into *pxFu
1d30: 6e 63 20 61 6e 64 20 72 65 74 75 72 6e 20 30 2e  nc and return 0.
1d40: 20 20 49 66 20 6e 6f 20 6d 61 74 63 68 20 69 73    If no match is
1d50: 20 66 6f 75 6e 64 2c 0a 2a 2a 20 72 65 74 75 72   found,.** retur
1d60: 6e 20 31 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  n 1.  If the com
1d70: 6d 61 6e 64 20 69 73 20 61 6d 62 69 67 75 6f 75  mand is ambiguou
1d80: 73 20 72 65 74 75 72 6e 20 32 3b 0a 2a 2a 0a 2a  s return 2;.**.*
1d90: 2a 20 54 68 65 20 4e 61 6d 65 4d 61 70 20 73 74  * The NameMap st
1da0: 72 75 63 74 75 72 65 20 61 6e 64 20 74 68 65 20  ructure and the 
1db0: 74 61 62 6c 65 73 20 77 65 20 61 72 65 20 73 65  tables we are se
1dc0: 61 72 63 68 69 6e 67 20 61 67 61 69 6e 73 74 20  arching against 
1dd0: 61 72 65 0a 2a 2a 20 64 65 66 69 6e 65 64 20 69  are.** defined i
1de0: 6e 20 74 68 65 20 70 61 67 65 5f 69 6e 64 65 78  n the page_index
1df0: 2e 68 20 68 65 61 64 65 72 20 66 69 6c 65 20 77  .h header file w
1e00: 68 69 63 68 20 69 73 20 61 75 74 6f 6d 61 74 69  hich is automati
1e10: 63 61 6c 6c 79 0a 2a 2a 20 67 65 6e 65 72 61 74  cally.** generat
1e20: 65 64 20 62 79 20 6d 6b 69 6e 64 65 78 2e 63 20  ed by mkindex.c 
1e30: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 73 74 61 74  program..*/.stat
1e40: 69 63 20 69 6e 74 20 6e 61 6d 65 5f 73 65 61 72  ic int name_sear
1e50: 63 68 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ch(.  const char
1e60: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 2f   *zName,       /
1e70: 2a 20 54 68 65 20 6e 61 6d 65 20 77 65 20 61 72  * The name we ar
1e80: 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f  e looking for */
1e90: 0a 20 20 63 6f 6e 73 74 20 4e 61 6d 65 4d 61 70  .  const NameMap
1ea0: 20 2a 61 4d 61 70 2c 20 20 20 20 20 2f 2a 20 53   *aMap,     /* S
1eb0: 65 61 72 63 68 20 69 6e 20 74 68 69 73 20 61 72  earch in this ar
1ec0: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ray */.  int nMa
1ed0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1ee0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
1ef0: 6c 6f 74 73 20 69 6e 20 61 4d 61 70 5b 5d 20 2a  lots in aMap[] *
1f00: 2f 0a 20 20 69 6e 74 20 2a 70 49 6e 64 65 78 20  /.  int *pIndex 
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f20: 4f 55 54 3a 20 54 68 65 20 69 6e 64 65 78 20 69  OUT: The index i
1f30: 6e 20 61 4d 61 70 5b 5d 20 6f 66 20 74 68 65 20  n aMap[] of the 
1f40: 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e  match */.){.  in
1f50: 74 20 75 70 72 2c 20 6c 77 72 2c 20 63 6e 74 2c  t upr, lwr, cnt,
1f60: 20 6d 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 20 3d   m, i;.  int n =
1f70: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a   strlen(zName);.
1f80: 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 75 70 72    lwr = 0;.  upr
1f90: 20 3d 20 6e 4d 61 70 2d 31 3b 0a 20 20 77 68 69   = nMap-1;.  whi
1fa0: 6c 65 28 20 6c 77 72 3c 3d 75 70 72 20 29 7b 0a  le( lwr<=upr ){.
1fb0: 20 20 20 20 69 6e 74 20 6d 69 64 2c 20 63 3b 0a      int mid, c;.
1fc0: 20 20 20 20 6d 69 64 20 3d 20 28 75 70 72 2b 6c      mid = (upr+l
1fd0: 77 72 29 2f 32 3b 0a 20 20 20 20 63 20 3d 20 73  wr)/2;.    c = s
1fe0: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 4d 61  trcmp(zName, aMa
1ff0: 70 5b 6d 69 64 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  p[mid].zName);. 
2000: 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
2010: 20 20 20 20 20 2a 70 49 6e 64 65 78 20 3d 20 6d       *pIndex = m
2020: 69 64 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  id;.      return
2030: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
2040: 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 75  ( c<0 ){.      u
2050: 70 72 20 3d 20 6d 69 64 20 2d 20 31 3b 0a 20 20  pr = mid - 1;.  
2060: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c    }else{.      l
2070: 77 72 20 3d 20 6d 69 64 20 2b 20 31 3b 0a 20 20  wr = mid + 1;.  
2080: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 6d 3d    }.  }.  for(m=
2090: 63 6e 74 3d 30 2c 20 69 3d 75 70 72 2d 32 3b 20  cnt=0, i=upr-2; 
20a0: 69 3c 3d 75 70 72 2b 33 20 26 26 20 69 3c 6e 4d  i<=upr+3 && i<nM
20b0: 61 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ap; i++){.    if
20c0: 28 20 69 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65  ( i<0 ) continue
20d0: 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d  ;.    if( strncm
20e0: 70 28 7a 4e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d  p(zName, aMap[i]
20f0: 2e 7a 4e 61 6d 65 2c 20 6e 29 3d 3d 30 20 29 7b  .zName, n)==0 ){
2100: 0a 20 20 20 20 20 20 6d 20 3d 20 69 3b 0a 20 20  .      m = i;.  
2110: 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d      cnt++;.    }
2120: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6e 74 3d 3d  .  }.  if( cnt==
2130: 31 20 29 7b 0a 20 20 20 20 2a 70 49 6e 64 65 78  1 ){.    *pIndex
2140: 20 3d 20 6d 3b 0a 20 20 20 20 72 65 74 75 72 6e   = m;.    return
2150: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
2160: 20 31 2b 28 63 6e 74 3e 31 29 3b 0a 7d 0a 0a 0a   1+(cnt>1);.}...
2170: 2f 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 63 65  /*.** This proce
2180: 64 75 72 65 20 72 75 6e 73 20 66 69 72 73 74 2e  dure runs first.
2190: 0a 2a 2f 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74  .*/.int main(int
21a0: 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
21b0: 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  gv){.  const cha
21c0: 72 20 2a 7a 43 6d 64 4e 61 6d 65 3b 0a 20 20 69  r *zCmdName;.  i
21d0: 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 72 63  nt idx;.  int rc
21e0: 3b 0a 0a 20 20 67 2e 6e 6f 77 20 3d 20 74 69 6d  ;..  g.now = tim
21f0: 65 28 30 29 3b 0a 20 20 67 2e 61 72 67 63 20 3d  e(0);.  g.argc =
2200: 20 61 72 67 63 3b 0a 20 20 67 2e 61 72 67 76 20   argc;.  g.argv 
2210: 3d 20 61 72 67 76 3b 0a 20 20 69 66 28 20 67 65  = argv;.  if( ge
2220: 74 65 6e 76 28 22 47 41 54 45 57 41 59 5f 49 4e  tenv("GATEWAY_IN
2230: 54 45 52 46 41 43 45 22 29 21 3d 30 20 29 7b 0a  TERFACE")!=0 ){.
2240: 20 20 20 20 7a 43 6d 64 4e 61 6d 65 20 3d 20 22      zCmdName = "
2250: 63 67 69 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  cgi";.  }else if
2260: 28 20 61 72 67 63 3c 32 20 29 7b 0a 20 20 20 20  ( argc<2 ){.    
2270: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
2280: 22 55 73 61 67 65 3a 20 25 73 20 43 4f 4d 4d 41  "Usage: %s COMMA
2290: 4e 44 20 2e 2e 2e 5c 6e 22 2c 20 61 72 67 76 5b  ND ...\n", argv[
22a0: 30 5d 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  0]);.    exit(1)
22b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67  ;.  }else{.    g
22c0: 2e 66 53 71 6c 54 72 61 63 65 20 3d 20 66 69 6e  .fSqlTrace = fin
22d0: 64 5f 6f 70 74 69 6f 6e 28 22 73 71 6c 74 72 61  d_option("sqltra
22e0: 63 65 22 2c 20 30 2c 20 30 29 21 3d 30 3b 0a 20  ce", 0, 0)!=0;. 
22f0: 20 20 20 67 2e 66 53 71 6c 50 72 69 6e 74 20 3d     g.fSqlPrint =
2300: 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 73 71   find_option("sq
2310: 6c 70 72 69 6e 74 22 2c 20 30 2c 20 30 29 21 3d  lprint", 0, 0)!=
2320: 30 3b 0a 20 20 20 20 67 2e 66 48 74 74 70 54 72  0;.    g.fHttpTr
2330: 61 63 65 20 3d 20 66 69 6e 64 5f 6f 70 74 69 6f  ace = find_optio
2340: 6e 28 22 68 74 74 70 74 72 61 63 65 22 2c 20 30  n("httptrace", 0
2350: 2c 20 30 29 21 3d 30 3b 0a 20 20 20 20 67 2e 7a  , 0)!=0;.    g.z
2360: 4c 6f 67 69 6e 20 3d 20 66 69 6e 64 5f 6f 70 74  Login = find_opt
2370: 69 6f 6e 28 22 75 73 65 72 22 2c 20 22 55 22 2c  ion("user", "U",
2380: 20 31 29 3b 0a 20 20 20 20 7a 43 6d 64 4e 61 6d   1);.    zCmdNam
2390: 65 20 3d 20 61 72 67 76 5b 31 5d 3b 0a 20 20 7d  e = argv[1];.  }
23a0: 0a 20 20 72 63 20 3d 20 6e 61 6d 65 5f 73 65 61  .  rc = name_sea
23b0: 72 63 68 28 7a 43 6d 64 4e 61 6d 65 2c 20 61 43  rch(zCmdName, aC
23c0: 6f 6d 6d 61 6e 64 2c 20 63 6f 75 6e 74 28 61 43  ommand, count(aC
23d0: 6f 6d 6d 61 6e 64 29 2c 20 26 69 64 78 29 3b 0a  ommand), &idx);.
23e0: 20 20 69 66 28 20 72 63 3d 3d 31 20 29 7b 0a 20    if( rc==1 ){. 
23f0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
2400: 72 2c 22 25 73 3a 20 75 6e 6b 6e 6f 77 6e 20 63  r,"%s: unknown c
2410: 6f 6d 6d 61 6e 64 3a 20 25 73 5c 6e 22 0a 20 20  ommand: %s\n".  
2420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2430: 20 22 25 73 3a 20 75 73 65 20 5c 22 68 65 6c 70   "%s: use \"help
2440: 5c 22 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66 6f  \" for more info
2450: 72 6d 61 74 69 6f 6e 5c 6e 22 2c 0a 20 20 20 20  rmation\n",.    
2460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
2470: 72 67 76 5b 30 5d 2c 20 7a 43 6d 64 4e 61 6d 65  rgv[0], zCmdName
2480: 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  , argv[0]);.    
2490: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73  return 1;.  }els
24a0: 65 20 69 66 28 20 72 63 3d 3d 32 20 29 7b 0a 20  e if( rc==2 ){. 
24b0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
24c0: 72 2c 22 25 73 3a 20 61 6d 62 69 67 75 6f 75 73  r,"%s: ambiguous
24d0: 20 63 6f 6d 6d 61 6e 64 20 70 72 65 66 69 78 3a   command prefix:
24e0: 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 20 20 20   %s\n".         
24f0: 20 20 20 20 20 20 20 20 20 20 22 25 73 3a 20 75            "%s: u
2500: 73 65 20 5c 22 68 65 6c 70 5c 22 20 66 6f 72 20  se \"help\" for 
2510: 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  more information
2520: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2530: 20 20 20 20 20 20 20 20 61 72 67 76 5b 30 5d 2c          argv[0],
2540: 20 7a 43 6d 64 4e 61 6d 65 2c 20 61 72 67 76 5b   zCmdName, argv[
2550: 30 5d 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0]);.    return 
2560: 31 3b 0a 20 20 7d 0a 20 20 61 43 6f 6d 6d 61 6e  1;.  }.  aComman
2570: 64 5b 69 64 78 5d 2e 78 46 75 6e 63 28 29 3b 0a  d[idx].xFunc();.
2580: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2590: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65 72  *.** Print an er
25a0: 72 6f 72 20 6d 65 73 73 61 67 65 2c 20 72 6f 6c  ror message, rol
25b0: 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61  lback all databa
25c0: 73 65 73 2c 20 61 6e 64 20 71 75 69 74 2e 0a 2a  ses, and quit..*
25d0: 2f 0a 76 6f 69 64 20 66 6f 73 73 69 6c 5f 70 61  /.void fossil_pa
25e0: 6e 69 63 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  nic(const char *
25f0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
2600: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 76 61 5f 6c   char *z;.  va_l
2610: 69 73 74 20 61 70 3b 0a 20 20 73 74 61 74 69 63  ist ap;.  static
2620: 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20   int once = 1;. 
2630: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
2640: 6f 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 76 6d  ormat);.  z = vm
2650: 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20  printf(zFormat, 
2660: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
2670: 29 3b 0a 20 20 69 66 28 20 67 2e 63 67 69 50 61  );.  if( g.cgiPa
2680: 6e 69 63 20 26 26 20 6f 6e 63 65 20 29 7b 0a 20  nic && once ){. 
2690: 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20     once = 0;.   
26a0: 20 63 67 69 5f 70 72 69 6e 74 66 28 22 3c 70 3e   cgi_printf("<p>
26b0: 3c 66 6f 6e 74 20 63 6f 6c 6f 72 3d 5c 22 72 65  <font color=\"re
26c0: 64 5c 22 3e 25 68 3c 2f 66 6f 6e 74 3e 3c 2f 70  d\">%h</font></p
26d0: 3e 22 2c 20 7a 29 3b 0a 20 20 20 20 63 67 69 5f  >", z);.    cgi_
26e0: 72 65 70 6c 79 28 29 3b 0a 20 20 7d 65 6c 73 65  reply();.  }else
26f0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
2700: 64 65 72 72 2c 20 22 25 73 3a 20 25 73 5c 6e 22  derr, "%s: %s\n"
2710: 2c 20 67 2e 61 72 67 76 5b 30 5d 2c 20 7a 29 3b  , g.argv[0], z);
2720: 0a 20 20 7d 0a 20 20 64 62 5f 66 6f 72 63 65 5f  .  }.  db_force_
2730: 72 6f 6c 6c 62 61 63 6b 28 29 3b 0a 20 20 65 78  rollback();.  ex
2740: 69 74 28 31 29 3b 0a 7d 0a 76 6f 69 64 20 66 6f  it(1);.}.void fo
2750: 73 73 69 6c 5f 66 61 74 61 6c 28 63 6f 6e 73 74  ssil_fatal(const
2760: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
2770: 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b  ...){.  char *z;
2780: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
2790: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
27a0: 6f 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 76 6d  ormat);.  z = vm
27b0: 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20  printf(zFormat, 
27c0: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
27d0: 29 3b 0a 20 20 69 66 28 20 67 2e 63 67 69 50 61  );.  if( g.cgiPa
27e0: 6e 69 63 20 29 7b 0a 20 20 20 20 67 2e 63 67 69  nic ){.    g.cgi
27f0: 50 61 6e 69 63 20 3d 20 30 3b 0a 20 20 20 20 63  Panic = 0;.    c
2800: 67 69 5f 70 72 69 6e 74 66 28 22 3c 70 3e 3c 66  gi_printf("<p><f
2810: 6f 6e 74 20 63 6f 6c 6f 72 3d 5c 22 72 65 64 5c  ont color=\"red\
2820: 22 3e 25 68 3c 2f 66 6f 6e 74 3e 3c 2f 70 3e 22  ">%h</font></p>"
2830: 2c 20 7a 29 3b 0a 20 20 20 20 63 67 69 5f 72 65  , z);.    cgi_re
2840: 70 6c 79 28 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ply();.  }else{.
2850: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
2860: 72 72 2c 20 22 25 73 3a 20 25 73 5c 6e 22 2c 20  rr, "%s: %s\n", 
2870: 67 2e 61 72 67 76 5b 30 5d 2c 20 7a 29 3b 0a 20  g.argv[0], z);. 
2880: 20 7d 0a 20 20 64 62 5f 66 6f 72 63 65 5f 72 6f   }.  db_force_ro
2890: 6c 6c 62 61 63 6b 28 29 3b 0a 20 20 65 78 69 74  llback();.  exit
28a0: 28 31 29 3b 0a 7d 0a 76 6f 69 64 20 66 6f 73 73  (1);.}.void foss
28b0: 69 6c 5f 77 61 72 6e 69 6e 67 28 63 6f 6e 73 74  il_warning(const
28c0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
28d0: 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b  ...){.  char *z;
28e0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
28f0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
2900: 6f 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 76 6d  ormat);.  z = vm
2910: 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20  printf(zFormat, 
2920: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
2930: 29 3b 0a 20 20 69 66 28 20 67 2e 63 67 69 50 61  );.  if( g.cgiPa
2940: 6e 69 63 20 29 7b 0a 20 20 20 20 63 67 69 5f 70  nic ){.    cgi_p
2950: 72 69 6e 74 66 28 22 3c 70 3e 3c 66 6f 6e 74 20  rintf("<p><font 
2960: 63 6f 6c 6f 72 3d 5c 22 72 65 64 5c 22 3e 25 68  color=\"red\">%h
2970: 3c 2f 66 6f 6e 74 3e 3c 2f 70 3e 22 2c 20 7a 29  </font></p>", z)
2980: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
2990: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
29a0: 25 73 3a 20 25 73 5c 6e 22 2c 20 67 2e 61 72 67  %s: %s\n", g.arg
29b0: 76 5b 30 5d 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a  v[0], z);.  }.}.
29c0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 75  ./*.** Print a u
29d0: 73 61 67 65 20 63 6f 6d 6d 65 6e 74 20 61 6e 64  sage comment and
29e0: 20 71 75 69 74 0a 2a 2f 0a 76 6f 69 64 20 75 73   quit.*/.void us
29f0: 61 67 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  age(const char *
2a00: 7a 46 6f 72 6d 61 74 29 7b 0a 20 20 66 70 72 69  zFormat){.  fpri
2a10: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
2a20: 67 65 3a 20 25 73 20 25 73 20 25 73 5c 6e 22 2c  ge: %s %s %s\n",
2a30: 20 67 2e 61 72 67 76 5b 30 5d 2c 20 67 2e 61 72   g.argv[0], g.ar
2a40: 67 76 5b 31 5d 2c 20 7a 46 6f 72 6d 61 74 29 3b  gv[1], zFormat);
2a50: 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 2f  .  exit(1);.}../
2a60: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 6e 20 65 6c  *.** Remove n el
2a70: 65 6d 65 6e 74 73 20 66 72 6f 6d 20 67 2e 61 72  ements from g.ar
2a80: 67 76 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  gv beginning wit
2a90: 68 20 74 68 65 20 69 2d 74 68 20 65 6c 65 6d 65  h the i-th eleme
2aa0: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 72 65 6d 6f  nt..*/.void remo
2ab0: 76 65 5f 66 72 6f 6d 5f 61 72 67 76 28 69 6e 74  ve_from_argv(int
2ac0: 20 69 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e   i, int n){.  in
2ad0: 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 69 2b 6e  t j;.  for(j=i+n
2ae0: 3b 20 6a 3c 67 2e 61 72 67 63 3b 20 69 2b 2b 2c  ; j<g.argc; i++,
2af0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 67 2e 61 72 67   j++){.    g.arg
2b00: 76 5b 69 5d 20 3d 20 67 2e 61 72 67 76 5b 6a 5d  v[i] = g.argv[j]
2b10: 3b 0a 20 20 7d 0a 20 20 67 2e 61 72 67 63 20 3d  ;.  }.  g.argc =
2b20: 20 69 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   i;.}.../*.** Lo
2b30: 6f 6b 20 66 6f 72 20 61 20 63 6f 6d 6d 61 6e 64  ok for a command
2b40: 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 2e 20 20 49  -line option.  I
2b50: 66 20 70 72 65 73 65 6e 74 2c 20 72 65 74 75 72  f present, retur
2b60: 6e 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20  n a pointer..** 
2b70: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d  Return NULL if m
2b80: 69 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 68 61  issing..**.** ha
2b90: 73 41 72 67 3d 3d 30 20 6d 65 61 6e 73 20 74 68  sArg==0 means th
2ba0: 65 20 6f 70 74 69 6f 6e 20 69 73 20 61 20 66 6c  e option is a fl
2bb0: 61 67 2e 20 20 49 74 20 69 73 20 65 69 74 68 65  ag.  It is eithe
2bc0: 72 20 70 72 65 73 65 6e 74 20 6f 72 20 6e 6f 74  r present or not
2bd0: 2e 0a 2a 2a 20 68 61 73 41 72 67 3d 3d 31 20 6d  ..** hasArg==1 m
2be0: 65 61 6e 73 20 74 68 65 20 6f 70 74 69 6f 6e 20  eans the option 
2bf0: 68 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e  has an argument.
2c00: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
2c10: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 61 72 67  er to the.** arg
2c20: 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  ument..*/.const 
2c30: 63 68 61 72 20 2a 66 69 6e 64 5f 6f 70 74 69 6f  char *find_optio
2c40: 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c  n(const char *zL
2c50: 6f 6e 67 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ong, const char 
2c60: 2a 7a 53 68 6f 72 74 2c 20 69 6e 74 20 68 61 73  *zShort, int has
2c70: 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Arg){.  int i;. 
2c80: 20 69 6e 74 20 6e 4c 6f 6e 67 3b 0a 20 20 63 6f   int nLong;.  co
2c90: 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 74 75 72  nst char *zRetur
2ca0: 6e 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  n = 0;.  assert(
2cb0: 20 68 61 73 41 72 67 3d 3d 30 20 7c 7c 20 68 61   hasArg==0 || ha
2cc0: 73 41 72 67 3d 3d 31 20 29 3b 0a 20 20 6e 4c 6f  sArg==1 );.  nLo
2cd0: 6e 67 20 3d 20 73 74 72 6c 65 6e 28 7a 4c 6f 6e  ng = strlen(zLon
2ce0: 67 29 3b 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69  g);.  for(i=2; i
2cf0: 3c 67 2e 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20  <g.argc; i++){. 
2d00: 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
2d10: 69 66 20 28 69 2b 68 61 73 41 72 67 20 3e 3d 20  if (i+hasArg >= 
2d20: 67 2e 61 72 67 63 29 20 62 72 65 61 6b 3b 0a 20  g.argc) break;. 
2d30: 20 20 20 7a 20 3d 20 67 2e 61 72 67 76 5b 69 5d     z = g.argv[i]
2d40: 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d  ;.    if( z[0]!=
2d50: 27 2d 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  '-' ) continue;.
2d60: 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28      z++;.    if(
2d70: 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20   z[0]=='-' ){.  
2d80: 20 20 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20      if( z[1]==0 
2d90: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6d 6f 76  ){.        remov
2da0: 65 5f 66 72 6f 6d 5f 61 72 67 76 28 69 2c 20 31  e_from_argv(i, 1
2db0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
2dc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2dd0: 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  z++;.    }.    i
2de0: 66 28 20 73 74 72 6e 63 6d 70 28 7a 2c 7a 4c 6f  f( strncmp(z,zLo
2df0: 6e 67 2c 6e 4c 6f 6e 67 29 3d 3d 30 20 29 7b 0a  ng,nLong)==0 ){.
2e00: 20 20 20 20 20 20 69 66 28 20 68 61 73 41 72 67        if( hasArg
2e10: 20 26 26 20 7a 5b 6e 4c 6f 6e 67 5d 3d 3d 27 3d   && z[nLong]=='=
2e20: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65  ' ){.        zRe
2e30: 74 75 72 6e 20 3d 20 26 7a 5b 6e 4c 6f 6e 67 2b  turn = &z[nLong+
2e40: 31 5d 3b 0a 20 20 20 20 20 20 20 20 72 65 6d 6f  1];.        remo
2e50: 76 65 5f 66 72 6f 6d 5f 61 72 67 76 28 69 2c 20  ve_from_argv(i, 
2e60: 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  1);.        brea
2e70: 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  k;.      }else i
2e80: 66 28 20 7a 5b 6e 4c 6f 6e 67 5d 3d 3d 30 20 29  f( z[nLong]==0 )
2e90: 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74 75 72  {.        zRetur
2ea0: 6e 20 3d 20 67 2e 61 72 67 76 5b 69 2b 68 61 73  n = g.argv[i+has
2eb0: 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20 72 65  Arg];.        re
2ec0: 6d 6f 76 65 5f 66 72 6f 6d 5f 61 72 67 76 28 69  move_from_argv(i
2ed0: 2c 20 31 2b 68 61 73 41 72 67 29 3b 0a 20 20 20  , 1+hasArg);.   
2ee0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2ef0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
2f00: 28 20 7a 53 68 6f 72 74 21 3d 30 20 26 26 20 73  ( zShort!=0 && s
2f10: 74 72 63 6d 70 28 7a 2c 7a 53 68 6f 72 74 29 3d  trcmp(z,zShort)=
2f20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 74  =0 ){.      zRet
2f30: 75 72 6e 20 3d 20 67 2e 61 72 67 76 5b 69 2b 68  urn = g.argv[i+h
2f40: 61 73 41 72 67 5d 3b 0a 20 20 20 20 20 20 72 65  asArg];.      re
2f50: 6d 6f 76 65 5f 66 72 6f 6d 5f 61 72 67 76 28 69  move_from_argv(i
2f60: 2c 20 31 2b 68 61 73 41 72 67 29 3b 0a 20 20 20  , 1+hasArg);.   
2f70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2f80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65    }.  return zRe
2f90: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56  turn;.}../*.** V
2fa0: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 72 65  erify that there
2fb0: 20 61 72 65 20 6e 6f 20 75 6e 70 72 6f 63 65 73   are no unproces
2fc0: 73 65 64 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  sed command-line
2fd0: 20 6f 70 74 69 6f 6e 73 2e 20 20 49 66 0a 2a 2a   options.  If.**
2fe0: 20 41 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20 63   Any remaining c
2ff0: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75  ommand-line argu
3000: 6d 65 6e 74 20 62 65 67 69 6e 73 20 77 69 74 68  ment begins with
3010: 20 22 2d 22 20 70 72 69 6e 74 0a 2a 2a 20 61 6e   "-" print.** an
3020: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
3030: 6e 64 20 71 75 69 74 2e 0a 2a 2f 0a 76 6f 69 64  nd quit..*/.void
3040: 20 76 65 72 69 66 79 5f 61 6c 6c 5f 6f 70 74 69   verify_all_opti
3050: 6f 6e 73 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74  ons(void){.  int
3060: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   i;.  for(i=1; i
3070: 3c 67 2e 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20  <g.argc; i++){. 
3080: 20 20 20 69 66 28 20 67 2e 61 72 67 76 5b 69 5d     if( g.argv[i]
3090: 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [0]=='-' ){.    
30a0: 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22    fossil_fatal("
30b0: 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 63 6f 6d  unrecognized com
30c0: 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand-line option
30d0: 2c 20 6f 72 20 6d 69 73 73 69 6e 67 20 61 72 67  , or missing arg
30e0: 75 6d 65 6e 74 3a 20 25 73 22 2c 20 67 2e 61 72  ument: %s", g.ar
30f0: 67 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  gv[i]);.    }.  
3100: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  }.}../*.** Print
3110: 20 61 20 6c 69 73 74 20 6f 66 20 77 6f 72 64 73   a list of words
3120: 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 63 6f 6c   in multiple col
3130: 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  umns..*/.static 
3140: 76 6f 69 64 20 6d 75 6c 74 69 5f 63 6f 6c 75 6d  void multi_colum
3150: 6e 5f 6c 69 73 74 28 63 6f 6e 73 74 20 63 68 61  n_list(const cha
3160: 72 20 2a 2a 61 7a 57 6f 72 64 2c 20 69 6e 74 20  r **azWord, int 
3170: 6e 57 6f 72 64 29 7b 0a 20 20 69 6e 74 20 69 2c  nWord){.  int i,
3180: 20 6a 2c 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 6d   j, len;.  int m
3190: 78 4c 65 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20  xLen = 0;.  int 
31a0: 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e 52 6f 77  nCol;.  int nRow
31b0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
31c0: 57 6f 72 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Word; i++){.    
31d0: 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 61 7a 57  len = strlen(azW
31e0: 6f 72 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  ord[i]);.    if(
31f0: 20 6c 65 6e 3e 6d 78 4c 65 6e 20 29 20 6d 78 4c   len>mxLen ) mxL
3200: 65 6e 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20  en = len;.  }.  
3210: 6e 43 6f 6c 20 3d 20 38 30 2f 28 6d 78 4c 65 6e  nCol = 80/(mxLen
3220: 2b 32 29 3b 0a 20 20 69 66 28 20 6e 43 6f 6c 3d  +2);.  if( nCol=
3230: 3d 30 20 29 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20  =0 ) nCol = 1;. 
3240: 20 6e 52 6f 77 20 3d 20 28 6e 57 6f 72 64 20 2b   nRow = (nWord +
3250: 20 6e 43 6f 6c 20 2d 20 31 29 2f 6e 43 6f 6c 3b   nCol - 1)/nCol;
3260: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52  .  for(i=0; i<nR
3270: 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  ow; i++){.    co
3280: 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 61 63 65  nst char *zSpace
3290: 72 20 3d 20 22 22 3b 0a 20 20 20 20 66 6f 72 28  r = "";.    for(
32a0: 6a 3d 69 3b 20 6a 3c 6e 57 6f 72 64 3b 20 6a 2b  j=i; j<nWord; j+
32b0: 3d 6e 52 6f 77 29 7b 0a 20 20 20 20 20 20 70 72  =nRow){.      pr
32c0: 69 6e 74 66 28 22 25 73 25 2d 2a 73 22 2c 20 7a  intf("%s%-*s", z
32d0: 53 70 61 63 65 72 2c 20 6d 78 4c 65 6e 2c 20 61  Spacer, mxLen, a
32e0: 7a 57 6f 72 64 5b 6a 5d 29 3b 0a 20 20 20 20 20  zWord[j]);.     
32f0: 20 7a 53 70 61 63 65 72 20 3d 20 22 20 20 22 3b   zSpacer = "  ";
3300: 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74  .    }.    print
3310: 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 0a  f("\n");.  }.}..
3320: 2f 2a 0a 2a 2a 20 43 4f 4d 20 4d 41 4e 44 3a 20  /*.** COM MAND: 
3330: 63 6f 6d 6d 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55  commands.**.** U
3340: 73 61 67 65 3a 20 25 66 6f 73 73 69 6c 20 63 6f  sage: %fossil co
3350: 6d 6d 61 6e 64 73 0a 2a 2a 20 4c 69 73 74 20 61  mmands.** List a
3360: 6c 6c 20 73 75 70 70 6f 72 74 65 64 20 63 6f 6d  ll supported com
3370: 6d 61 6e 64 73 2e 0a 2a 2f 0a 76 6f 69 64 20 63  mands..*/.void c
3380: 6d 64 5f 63 6d 64 5f 6c 69 73 74 28 76 6f 69 64  md_cmd_list(void
3390: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 43 6d 64  ){.  int i, nCmd
33a0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
33b0: 61 43 6d 64 5b 63 6f 75 6e 74 28 61 43 6f 6d 6d  aCmd[count(aComm
33c0: 61 6e 64 29 5d 3b 0a 20 20 66 6f 72 28 69 3d 6e  and)];.  for(i=n
33d0: 43 6d 64 3d 30 3b 20 69 3c 63 6f 75 6e 74 28 61  Cmd=0; i<count(a
33e0: 43 6f 6d 6d 61 6e 64 29 3b 20 69 2b 2b 29 7b 0a  Command); i++){.
33f0: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
3400: 61 43 6f 6d 6d 61 6e 64 5b 69 5d 2e 7a 4e 61 6d  aCommand[i].zNam
3410: 65 2c 22 74 65 73 74 22 2c 34 29 3d 3d 30 20 29  e,"test",4)==0 )
3420: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 2f   continue;.    /
3430: 2a 20 69 66 28 20 73 74 72 63 6d 70 28 61 43 6f  * if( strcmp(aCo
3440: 6d 6d 61 6e 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  mmand[i].zName, 
3450: 67 2e 61 72 67 76 5b 31 5d 29 3d 3d 30 20 29 20  g.argv[1])==0 ) 
3460: 63 6f 6e 74 69 6e 75 65 3b 20 2a 2f 0a 20 20 20  continue; */.   
3470: 20 61 43 6d 64 5b 6e 43 6d 64 2b 2b 5d 20 3d 20   aCmd[nCmd++] = 
3480: 61 43 6f 6d 6d 61 6e 64 5b 69 5d 2e 7a 4e 61 6d  aCommand[i].zNam
3490: 65 3b 0a 20 20 7d 0a 20 20 6d 75 6c 74 69 5f 63  e;.  }.  multi_c
34a0: 6f 6c 75 6d 6e 5f 6c 69 73 74 28 61 43 6d 64 2c  olumn_list(aCmd,
34b0: 20 6e 43 6d 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nCmd);.}../*.**
34c0: 20 43 4f 4d 4d 41 4e 44 3a 20 74 65 73 74 2d 63   COMMAND: test-c
34d0: 6f 6d 6d 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73  ommands.**.** Us
34e0: 61 67 65 3a 20 25 66 6f 73 73 69 6c 20 74 65 73  age: %fossil tes
34f0: 74 2d 63 6f 6d 6d 61 6e 64 73 0a 2a 2a 0a 2a 2a  t-commands.**.**
3500: 20 4c 69 73 74 20 61 6c 6c 20 63 6f 6d 6d 61 6e   List all comman
3510: 64 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  ds used for test
3520: 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
3530: 67 2e 0a 2a 2f 0a 76 6f 69 64 20 63 6d 64 5f 74  g..*/.void cmd_t
3540: 65 73 74 5f 63 6d 64 5f 6c 69 73 74 28 76 6f 69  est_cmd_list(voi
3550: 64 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 43 6d  d){.  int i, nCm
3560: 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  d;.  const char 
3570: 2a 61 43 6d 64 5b 63 6f 75 6e 74 28 61 43 6f 6d  *aCmd[count(aCom
3580: 6d 61 6e 64 29 5d 3b 0a 20 20 66 6f 72 28 69 3d  mand)];.  for(i=
3590: 6e 43 6d 64 3d 30 3b 20 69 3c 63 6f 75 6e 74 28  nCmd=0; i<count(
35a0: 61 43 6f 6d 6d 61 6e 64 29 3b 20 69 2b 2b 29 7b  aCommand); i++){
35b0: 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70  .    if( strncmp
35c0: 28 61 43 6f 6d 6d 61 6e 64 5b 69 5d 2e 7a 4e 61  (aCommand[i].zNa
35d0: 6d 65 2c 22 74 65 73 74 22 2c 34 29 21 3d 30 20  me,"test",4)!=0 
35e0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
35f0: 2f 2a 20 69 66 28 20 73 74 72 63 6d 70 28 61 43  /* if( strcmp(aC
3600: 6f 6d 6d 61 6e 64 5b 69 5d 2e 7a 4e 61 6d 65 2c  ommand[i].zName,
3610: 20 67 2e 61 72 67 76 5b 31 5d 29 3d 3d 30 20 29   g.argv[1])==0 )
3620: 20 63 6f 6e 74 69 6e 75 65 3b 20 2a 2f 0a 20 20   continue; */.  
3630: 20 20 61 43 6d 64 5b 6e 43 6d 64 2b 2b 5d 20 3d    aCmd[nCmd++] =
3640: 20 61 43 6f 6d 6d 61 6e 64 5b 69 5d 2e 7a 4e 61   aCommand[i].zNa
3650: 6d 65 3b 0a 20 20 7d 0a 20 20 6d 75 6c 74 69 5f  me;.  }.  multi_
3660: 63 6f 6c 75 6d 6e 5f 6c 69 73 74 28 61 43 6d 64  column_list(aCmd
3670: 2c 20 6e 43 6d 64 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  , nCmd);.}.../*.
3680: 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 76 65 72 73  ** COMMAND: vers
3690: 69 6f 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  ion.**.** Usage:
36a0: 20 25 66 6f 73 73 69 6c 20 76 65 72 73 69 6f 6e   %fossil version
36b0: 0a 2a 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  .**.** Print the
36c0: 20 73 6f 75 72 63 65 20 63 6f 64 65 20 76 65 72   source code ver
36d0: 73 69 6f 6e 20 6e 75 6d 62 65 72 20 66 6f 72 20  sion number for 
36e0: 74 68 65 20 66 6f 73 73 69 6c 20 65 78 65 63 75  the fossil execu
36f0: 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 76  table..*/.void v
3700: 65 72 73 69 6f 6e 5f 63 6d 64 28 76 6f 69 64 29  ersion_cmd(void)
3710: 7b 0a 20 20 70 72 69 6e 74 66 28 22 54 68 69 73  {.  printf("This
3720: 20 69 73 20 66 6f 73 73 69 6c 20 76 65 72 73 69   is fossil versi
3730: 6f 6e 20 22 20 4d 41 4e 49 46 45 53 54 5f 56 45  on " MANIFEST_VE
3740: 52 53 49 4f 4e 20 22 20 22 20 4d 41 4e 49 46 45  RSION " " MANIFE
3750: 53 54 5f 44 41 54 45 20 22 20 55 54 43 5c 6e 22  ST_DATE " UTC\n"
3760: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d  );.}.../*.** COM
3770: 4d 41 4e 44 3a 20 68 65 6c 70 0a 2a 2a 0a 2a 2a  MAND: help.**.**
3780: 20 55 73 61 67 65 3a 20 25 66 6f 73 73 69 6c 20   Usage: %fossil 
3790: 68 65 6c 70 20 43 4f 4d 4d 41 4e 44 0a 2a 2a 0a  help COMMAND.**.
37a0: 2a 2a 20 44 69 73 70 6c 61 79 20 69 6e 66 6f 72  ** Display infor
37b0: 6d 61 74 69 6f 6e 20 6f 6e 20 68 6f 77 20 74 6f  mation on how to
37c0: 20 75 73 65 20 43 4f 4d 4d 41 4e 44 0a 2a 2f 0a   use COMMAND.*/.
37d0: 76 6f 69 64 20 68 65 6c 70 5f 63 6d 64 28 76 6f  void help_cmd(vo
37e0: 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 69  id){.  int rc, i
37f0: 64 78 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  dx;.  const char
3800: 20 2a 7a 3b 0a 20 20 69 66 28 20 67 2e 61 72 67   *z;.  if( g.arg
3810: 63 21 3d 33 20 29 7b 0a 20 20 20 20 70 72 69 6e  c!=3 ){.    prin
3820: 74 66 28 22 55 73 61 67 65 3a 20 25 73 20 68 65  tf("Usage: %s he
3830: 6c 70 20 43 4f 4d 4d 41 4e 44 2e 5c 6e 41 76 61  lp COMMAND.\nAva
3840: 69 6c 61 62 6c 65 20 43 4f 4d 4d 41 4e 44 73 3a  ilable COMMANDs:
3850: 5c 6e 22 2c 20 67 2e 61 72 67 76 5b 30 5d 29 3b  \n", g.argv[0]);
3860: 0a 20 20 20 20 63 6d 64 5f 63 6d 64 5f 6c 69 73  .    cmd_cmd_lis
3870: 74 28 29 3b 0a 20 20 20 20 76 65 72 73 69 6f 6e  t();.    version
3880: 5f 63 6d 64 28 29 3b 0a 20 20 20 20 72 65 74 75  _cmd();.    retu
3890: 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6e  rn;.  }.  rc = n
38a0: 61 6d 65 5f 73 65 61 72 63 68 28 67 2e 61 72 67  ame_search(g.arg
38b0: 76 5b 32 5d 2c 20 61 43 6f 6d 6d 61 6e 64 2c 20  v[2], aCommand, 
38c0: 63 6f 75 6e 74 28 61 43 6f 6d 6d 61 6e 64 29 2c  count(aCommand),
38d0: 20 26 69 64 78 29 3b 0a 20 20 69 66 28 20 72 63   &idx);.  if( rc
38e0: 3d 3d 31 20 29 7b 0a 20 20 20 20 66 6f 73 73 69  ==1 ){.    fossi
38f0: 6c 5f 66 61 74 61 6c 28 22 75 6e 6b 6e 6f 77 6e  l_fatal("unknown
3900: 20 63 6f 6d 6d 61 6e 64 3a 20 25 73 22 2c 20 67   command: %s", g
3910: 2e 61 72 67 76 5b 32 5d 29 3b 0a 20 20 7d 65 6c  .argv[2]);.  }el
3920: 73 65 20 69 66 28 20 72 63 3d 3d 32 20 29 7b 0a  se if( rc==2 ){.
3930: 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c      fossil_fatal
3940: 28 22 61 6d 62 69 67 75 6f 75 73 20 63 6f 6d 6d  ("ambiguous comm
3950: 61 6e 64 20 70 72 65 66 69 78 3a 20 25 73 22 2c  and prefix: %s",
3960: 20 67 2e 61 72 67 76 5b 32 5d 29 3b 0a 20 20 7d   g.argv[2]);.  }
3970: 0a 20 20 7a 20 3d 20 61 43 6d 64 48 65 6c 70 5b  .  z = aCmdHelp[
3980: 69 64 78 5d 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  idx];.  if( z==0
3990: 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66   ){.    fossil_f
39a0: 61 74 61 6c 28 22 6e 6f 20 68 65 6c 70 20 61 76  atal("no help av
39b0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ailable for the 
39c0: 25 73 20 63 6f 6d 6d 61 6e 64 22 2c 0a 20 20 20  %s command",.   
39d0: 20 20 20 20 61 43 6f 6d 6d 61 6e 64 5b 69 64 78      aCommand[idx
39e0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ].zName);.  }.  
39f0: 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20  while( *z ){.   
3a00: 20 69 66 28 20 2a 7a 3d 3d 27 25 27 20 26 26 20   if( *z=='%' && 
3a10: 73 74 72 6e 63 6d 70 28 7a 2c 20 22 25 66 6f 73  strncmp(z, "%fos
3a20: 73 69 6c 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20  sil", 7)==0 ){. 
3a30: 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 22       printf("%s"
3a40: 2c 20 67 2e 61 72 67 76 5b 30 5d 29 3b 0a 20 20  , g.argv[0]);.  
3a50: 20 20 20 20 7a 20 2b 3d 20 37 3b 0a 20 20 20 20      z += 7;.    
3a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 75 74  }else{.      put
3a70: 63 68 61 72 28 2a 7a 29 3b 0a 20 20 20 20 20 20  char(*z);.      
3a80: 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  z++;.    }.  }. 
3a90: 20 70 75 74 63 68 61 72 28 27 5c 6e 27 29 3b 0a   putchar('\n');.
3aa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
3ab0: 20 67 2e 7a 42 61 73 65 55 52 4c 20 76 61 6c 75   g.zBaseURL valu
3ac0: 65 20 74 6f 20 74 68 65 20 66 75 6c 6c 20 55 52  e to the full UR
3ad0: 4c 20 66 6f 72 20 74 68 65 20 74 6f 70 6c 65 76  L for the toplev
3ae0: 65 6c 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 73  el of.** the fos
3af0: 73 69 6c 20 74 72 65 65 2e 20 20 53 65 74 20 67  sil tree.  Set g
3b00: 2e 7a 48 6f 6d 65 55 52 4c 20 74 6f 20 67 2e 7a  .zHomeURL to g.z
3b10: 42 61 73 65 55 52 4c 20 77 69 74 68 6f 75 74 20  BaseURL without 
3b20: 74 68 65 0a 2a 2a 20 6c 65 61 64 69 6e 67 20 22  the.** leading "
3b30: 68 74 74 70 3a 2f 2f 22 20 61 6e 64 20 74 68 65  http://" and the
3b40: 20 68 6f 73 74 20 61 6e 64 20 70 6f 72 74 2e 0a   host and port..
3b50: 2a 2f 0a 76 6f 69 64 20 73 65 74 5f 62 61 73 65  */.void set_base
3b60: 5f 75 72 6c 28 76 6f 69 64 29 7b 0a 20 20 69 6e  _url(void){.  in
3b70: 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t i;.  const cha
3b80: 72 20 2a 7a 48 6f 73 74 20 3d 20 50 44 28 22 48  r *zHost = PD("H
3b90: 54 54 50 5f 48 4f 53 54 22 2c 22 22 29 3b 0a 20  TTP_HOST","");. 
3ba0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f   const char *zMo
3bb0: 64 65 20 3d 20 50 44 28 22 48 54 54 50 53 22 2c  de = PD("HTTPS",
3bc0: 22 6f 66 66 22 29 3b 0a 20 20 63 6f 6e 73 74 20  "off");.  const 
3bd0: 63 68 61 72 20 2a 7a 43 75 72 20 3d 20 50 44 28  char *zCur = PD(
3be0: 22 53 43 52 49 50 54 5f 4e 41 4d 45 22 2c 22 2f  "SCRIPT_NAME","/
3bf0: 22 29 3b 0a 0a 20 20 69 20 3d 20 73 74 72 6c 65  ");..  i = strle
3c00: 6e 28 7a 43 75 72 29 3b 0a 20 20 77 68 69 6c 65  n(zCur);.  while
3c10: 28 20 69 3e 30 20 26 26 20 7a 43 75 72 5b 69 2d  ( i>0 && zCur[i-
3c20: 31 5d 3d 3d 27 2f 27 20 29 20 69 2d 2d 3b 0a 20  1]=='/' ) i--;. 
3c30: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4d 6f 64   if( strcmp(zMod
3c40: 65 2c 22 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20  e,"on")==0 ){.  
3c50: 20 20 67 2e 7a 42 61 73 65 55 52 4c 20 3d 20 6d    g.zBaseURL = m
3c60: 70 72 69 6e 74 66 28 22 68 74 74 70 73 3a 2f 2f  printf("https://
3c70: 25 73 25 2e 2a 73 22 2c 20 7a 48 6f 73 74 2c 20  %s%.*s", zHost, 
3c80: 69 2c 20 7a 43 75 72 29 3b 0a 20 20 20 20 67 2e  i, zCur);.    g.
3c90: 7a 54 6f 70 20 3d 20 26 67 2e 7a 42 61 73 65 55  zTop = &g.zBaseU
3ca0: 52 4c 5b 38 2b 73 74 72 6c 65 6e 28 7a 48 6f 73  RL[8+strlen(zHos
3cb0: 74 29 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t)];.  }else{.  
3cc0: 20 20 67 2e 7a 42 61 73 65 55 52 4c 20 3d 20 6d    g.zBaseURL = m
3cd0: 70 72 69 6e 74 66 28 22 68 74 74 70 3a 2f 2f 25  printf("http://%
3ce0: 73 25 2e 2a 73 22 2c 20 7a 48 6f 73 74 2c 20 69  s%.*s", zHost, i
3cf0: 2c 20 7a 43 75 72 29 3b 0a 20 20 20 20 67 2e 7a  , zCur);.    g.z
3d00: 54 6f 70 20 3d 20 26 67 2e 7a 42 61 73 65 55 52  Top = &g.zBaseUR
3d10: 4c 5b 37 2b 73 74 72 6c 65 6e 28 7a 48 6f 73 74  L[7+strlen(zHost
3d20: 29 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  )];.  }.}../*.**
3d30: 20 53 65 6e 64 20 61 6e 20 48 54 54 50 20 72 65   Send an HTTP re
3d40: 64 69 72 65 63 74 20 62 61 63 6b 20 74 6f 20 74  direct back to t
3d50: 68 65 20 64 65 73 69 67 6e 61 74 65 64 20 49 6e  he designated In
3d60: 64 65 78 20 50 61 67 65 2e 0a 2a 2f 0a 76 6f 69  dex Page..*/.voi
3d70: 64 20 66 6f 73 73 69 6c 5f 72 65 64 69 72 65 63  d fossil_redirec
3d80: 74 5f 68 6f 6d 65 28 76 6f 69 64 29 7b 0a 20 20  t_home(void){.  
3d90: 63 67 69 5f 72 65 64 69 72 65 63 74 66 28 22 25  cgi_redirectf("%
3da0: 73 25 73 22 2c 20 67 2e 7a 42 61 73 65 55 52 4c  s%s", g.zBaseURL
3db0: 2c 20 64 62 5f 67 65 74 28 22 69 6e 64 65 78 2d  , db_get("index-
3dc0: 70 61 67 65 22 2c 20 22 2f 69 6e 64 65 78 22 29  page", "/index")
3dd0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 63  );.}../*.** Prec
3de0: 6f 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  onditions:.**.**
3df0: 20 20 20 20 2a 20 45 6e 76 69 72 6f 6e 6d 65 6e      * Environmen
3e00: 74 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  t variables are 
3e10: 73 65 74 20 75 70 20 61 63 63 6f 72 64 69 6e 67  set up according
3e20: 20 74 6f 20 74 68 65 20 43 47 49 20 73 74 61 6e   to the CGI stan
3e30: 64 61 72 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  dard..**    * Th
3e40: 65 20 72 65 73 70 6f 73 69 74 6f 72 79 20 64 61  e respository da
3e50: 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
3e60: 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e  located and open
3e70: 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 6f 63 65  ed..** .** Proce
3e80: 73 73 20 74 68 65 20 77 65 62 70 61 67 65 20 73  ss the webpage s
3e90: 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20  pecified by the 
3ea0: 50 41 54 48 5f 49 4e 46 4f 20 6f 72 20 52 45 51  PATH_INFO or REQ
3eb0: 55 45 53 54 5f 55 52 49 0a 2a 2a 20 65 6e 76 69  UEST_URI.** envi
3ec0: 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
3ed0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3ee0: 20 70 72 6f 63 65 73 73 5f 6f 6e 65 5f 77 65 62   process_one_web
3ef0: 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20 20 63  _page(void){.  c
3f00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
3f10: 49 6e 66 6f 3b 0a 20 20 63 68 61 72 20 2a 7a 50  Info;.  char *zP
3f20: 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 69 6e  ath = NULL;.  in
3f30: 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 69 3b 0a  t idx;.  int i;.
3f40: 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 70  .  /* Find the p
3f50: 61 67 65 20 74 68 61 74 20 74 68 65 20 75 73 65  age that the use
3f60: 72 20 68 61 73 20 72 65 71 75 65 73 74 65 64 2c  r has requested,
3f70: 20 63 6f 6e 73 74 72 75 63 74 20 61 6e 64 20 64   construct and d
3f80: 65 6c 69 76 65 72 20 74 68 61 74 0a 20 20 2a 2a  eliver that.  **
3f90: 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 73 65   page..  */.  se
3fa0: 74 5f 62 61 73 65 5f 75 72 6c 28 29 3b 0a 20 20  t_base_url();.  
3fb0: 7a 50 61 74 68 49 6e 66 6f 20 3d 20 50 28 22 50  zPathInfo = P("P
3fc0: 41 54 48 5f 49 4e 46 4f 22 29 3b 0a 20 20 69 66  ATH_INFO");.  if
3fd0: 28 20 7a 50 61 74 68 49 6e 66 6f 3d 3d 30 20 7c  ( zPathInfo==0 |
3fe0: 7c 20 7a 50 61 74 68 49 6e 66 6f 5b 30 5d 3d 3d  | zPathInfo[0]==
3ff0: 30 20 0a 20 20 20 20 20 20 7c 7c 20 28 7a 50 61  0 .      || (zPa
4000: 74 68 49 6e 66 6f 5b 30 5d 3d 3d 27 2f 27 20 26  thInfo[0]=='/' &
4010: 26 20 7a 50 61 74 68 49 6e 66 6f 5b 31 5d 3d 3d  & zPathInfo[1]==
4020: 30 29 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c  0) ){.    fossil
4030: 5f 72 65 64 69 72 65 63 74 5f 68 6f 6d 65 28 29  _redirect_home()
4040: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
4050: 50 61 74 68 20 3d 20 6d 70 72 69 6e 74 66 28 22  Path = mprintf("
4060: 25 73 22 2c 20 7a 50 61 74 68 49 6e 66 6f 29 3b  %s", zPathInfo);
4070: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  .  }..  /* Remov
4080: 65 20 74 68 65 20 6c 65 61 64 69 6e 67 20 22 2f  e the leading "/
4090: 22 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  " at the beginni
40a0: 6e 67 20 6f 66 20 74 68 65 20 70 61 74 68 2e 0a  ng of the path..
40b0: 20 20 2a 2f 0a 20 20 67 2e 7a 50 61 74 68 20 3d    */.  g.zPath =
40c0: 20 26 7a 50 61 74 68 5b 31 5d 3b 0a 20 20 66 6f   &zPath[1];.  fo
40d0: 72 28 69 3d 31 3b 20 7a 50 61 74 68 5b 69 5d 20  r(i=1; zPath[i] 
40e0: 26 26 20 7a 50 61 74 68 5b 69 5d 21 3d 27 2f 27  && zPath[i]!='/'
40f0: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 7a  ; i++){}.  if( z
4100: 50 61 74 68 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a  Path[i]=='/' ){.
4110: 20 20 20 20 7a 50 61 74 68 5b 69 5d 20 3d 20 30      zPath[i] = 0
4120: 3b 0a 20 20 20 20 67 2e 7a 45 78 74 72 61 20 3d  ;.    g.zExtra =
4130: 20 26 7a 50 61 74 68 5b 69 2b 31 5d 3b 0a 20 20   &zPath[i+1];.  
4140: 7d 65 6c 73 65 7b 0a 20 20 20 20 67 2e 7a 45 78  }else{.    g.zEx
4150: 74 72 61 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  tra = 0;.  }.  i
4160: 66 28 20 67 2e 7a 45 78 74 72 61 20 29 7b 0a 20  f( g.zExtra ){. 
4170: 20 20 20 2f 2a 20 43 47 49 20 70 61 72 61 6d 65     /* CGI parame
4180: 74 65 72 73 20 67 65 74 20 74 68 69 73 20 74 72  ters get this tr
4190: 65 61 74 6d 65 6e 74 20 65 6c 73 65 77 68 65 72  eatment elsewher
41a0: 65 2c 20 62 75 74 20 70 6c 61 63 65 73 20 6c 69  e, but places li
41b0: 6b 65 20 67 65 74 66 69 6c 65 0a 20 20 20 20 2a  ke getfile.    *
41c0: 2a 20 77 69 6c 6c 20 75 73 65 20 67 2e 7a 45 78  * will use g.zEx
41d0: 74 72 61 20 64 69 72 65 63 74 6c 79 2e 0a 20 20  tra directly..  
41e0: 20 20 2a 2f 0a 20 20 20 20 64 65 68 74 74 70 69    */.    dehttpi
41f0: 7a 65 28 67 2e 7a 45 78 74 72 61 29 3b 0a 20 20  ze(g.zExtra);.  
4200: 20 20 63 67 69 5f 73 65 74 5f 70 61 72 61 6d 65    cgi_set_parame
4210: 74 65 72 5f 6e 6f 63 6f 70 79 28 22 6e 61 6d 65  ter_nocopy("name
4220: 22 2c 20 67 2e 7a 45 78 74 72 61 29 3b 0a 20 20  ", g.zExtra);.  
4230: 7d 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74 20  }..  /* Prevent 
4240: 72 6f 62 6f 74 73 20 66 72 6f 6d 20 69 6e 64 65  robots from inde
4250: 78 69 6e 67 20 74 68 69 73 20 73 69 74 65 2e 0a  xing this site..
4260: 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 72 63 6d    */.  if( strcm
4270: 70 28 67 2e 7a 50 61 74 68 2c 20 22 72 6f 62 6f  p(g.zPath, "robo
4280: 74 73 2e 74 78 74 22 29 3d 3d 30 20 29 7b 0a 20  ts.txt")==0 ){. 
4290: 20 20 20 63 67 69 5f 73 65 74 5f 63 6f 6e 74 65     cgi_set_conte
42a0: 6e 74 5f 74 79 70 65 28 22 74 65 78 74 2f 70 6c  nt_type("text/pl
42b0: 61 69 6e 22 29 3b 0a 20 20 20 20 40 20 55 73 65  ain");.    @ Use
42c0: 72 2d 61 67 65 6e 74 3a 20 2a 0a 20 20 20 20 40  r-agent: *.    @
42d0: 20 44 69 73 61 6c 6c 6f 77 3a 20 2f 0a 20 20 20   Disallow: /.   
42e0: 20 63 67 69 5f 72 65 70 6c 79 28 29 3b 0a 20 20   cgi_reply();.  
42f0: 20 20 65 78 69 74 28 30 29 3b 0a 20 20 7d 0a 20    exit(0);.  }. 
4300: 20 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68   .  /* Locate th
4310: 65 20 6d 65 74 68 6f 64 20 73 70 65 63 69 66 69  e method specifi
4320: 65 64 20 62 79 20 74 68 65 20 70 61 74 68 20 61  ed by the path a
4330: 6e 64 20 65 78 65 63 75 74 65 20 74 68 65 20 66  nd execute the f
4340: 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 68 61  unction.  ** tha
4350: 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61  t implements tha
4360: 74 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20  t method..  */. 
4370: 20 69 66 28 20 6e 61 6d 65 5f 73 65 61 72 63 68   if( name_search
4380: 28 67 2e 7a 50 61 74 68 2c 20 61 57 65 62 70 61  (g.zPath, aWebpa
4390: 67 65 2c 20 63 6f 75 6e 74 28 61 57 65 62 70 61  ge, count(aWebpa
43a0: 67 65 29 2c 20 26 69 64 78 29 20 26 26 0a 20 20  ge), &idx) &&.  
43b0: 20 20 20 20 6e 61 6d 65 5f 73 65 61 72 63 68 28      name_search(
43c0: 22 6e 6f 74 5f 66 6f 75 6e 64 22 2c 20 61 57 65  "not_found", aWe
43d0: 62 70 61 67 65 2c 20 63 6f 75 6e 74 28 61 57 65  bpage, count(aWe
43e0: 62 70 61 67 65 29 2c 20 26 69 64 78 29 20 29 7b  bpage), &idx) ){
43f0: 0a 20 20 20 20 63 67 69 5f 73 65 74 5f 73 74 61  .    cgi_set_sta
4400: 74 75 73 28 34 30 34 2c 22 4e 6f 74 20 46 6f 75  tus(404,"Not Fou
4410: 6e 64 22 29 3b 0a 20 20 20 20 40 20 3c 68 31 3e  nd");.    @ <h1>
4420: 4e 6f 74 20 46 6f 75 6e 64 3c 2f 68 31 3e 0a 20  Not Found</h1>. 
4430: 20 20 20 40 20 3c 70 3e 50 61 67 65 20 6e 6f 74     @ <p>Page not
4440: 20 66 6f 75 6e 64 3a 20 25 68 28 67 2e 7a 50 61   found: %h(g.zPa
4450: 74 68 29 3c 2f 70 3e 0a 20 20 7d 65 6c 73 65 7b  th)</p>.  }else{
4460: 0a 20 20 20 20 61 57 65 62 70 61 67 65 5b 69 64  .    aWebpage[id
4470: 78 5d 2e 78 46 75 6e 63 28 29 3b 0a 20 20 7d 0a  x].xFunc();.  }.
4480: 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65  .  /* Return the
4490: 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20   result..  */.  
44a0: 63 67 69 5f 72 65 70 6c 79 28 29 3b 0a 7d 0a 0a  cgi_reply();.}..
44b0: 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 63  /*.** COMMAND: c
44c0: 67 69 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  gi.**.** Usage: 
44d0: 25 66 6f 73 73 69 6c 20 3f 63 67 69 3f 20 53 43  %fossil ?cgi? SC
44e0: 52 49 50 54 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  RIPT.**.** The S
44f0: 43 52 49 50 54 20 61 72 67 75 6d 65 6e 74 20 69  CRIPT argument i
4500: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
4510: 66 69 6c 65 20 74 68 61 74 20 69 73 20 74 68 65  file that is the
4520: 20 43 47 49 20 73 63 72 69 70 74 0a 2a 2a 20 74   CGI script.** t
4530: 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 75 6e  hat is being run
4540: 2e 20 20 54 68 65 20 63 6f 6d 6d 61 6e 64 20 6e  .  The command n
4550: 61 6d 65 2c 20 22 63 67 69 22 2c 20 6d 61 79 20  ame, "cgi", may 
4560: 62 65 20 6f 6d 69 74 74 65 64 20 69 66 0a 2a 2a  be omitted if.**
4570: 20 74 68 65 20 47 41 54 45 57 41 59 5f 49 4e 54   the GATEWAY_INT
4580: 45 52 46 41 43 45 20 65 6e 76 69 72 6f 6e 6d 65  ERFACE environme
4590: 6e 74 20 76 61 72 69 61 62 6c 65 20 69 73 20 73  nt variable is s
45a0: 65 74 20 74 6f 20 22 43 47 49 22 20 28 77 68 69  et to "CGI" (whi
45b0: 63 68 0a 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77  ch.** should alw
45c0: 61 79 73 20 62 65 20 74 68 65 20 63 61 73 65 20  ays be the case 
45d0: 66 6f 72 20 43 47 49 20 73 63 72 69 70 74 73 20  for CGI scripts 
45e0: 72 75 6e 20 62 79 20 61 20 77 65 62 73 65 72 76  run by a webserv
45f0: 65 72 2e 29 20 20 54 68 65 0a 2a 2a 20 53 43 52  er.)  The.** SCR
4600: 49 50 54 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  IPT file should 
4610: 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67 20 6c  look something l
4620: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
4630: 20 20 20 20 20 23 21 2f 75 73 72 2f 62 69 6e 2f       #!/usr/bin/
4640: 66 6f 73 73 69 6c 0a 2a 2a 20 20 20 20 20 20 72  fossil.**      r
4650: 65 70 6f 73 69 74 6f 72 79 3a 20 2f 68 6f 6d 65  epository: /home
4660: 2f 73 6f 6d 65 62 6f 64 79 2f 70 72 6f 6a 65 63  /somebody/projec
4670: 74 2e 64 62 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  t.db.**.** The s
4680: 65 63 6f 6e 64 20 6c 69 6e 65 20 64 65 66 69 6e  econd line defin
4690: 65 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  es the name of t
46a0: 68 65 20 72 65 70 6f 73 69 74 6f 72 79 2e 20 20  he repository.  
46b0: 41 66 74 65 72 20 6c 6f 63 61 74 69 6e 67 0a 2a  After locating.*
46c0: 2a 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72 79  * the repository
46d0: 2c 20 66 6f 73 73 69 6c 20 77 69 6c 6c 20 67 65  , fossil will ge
46e0: 6e 65 72 61 74 65 20 61 20 77 65 62 70 61 67 65  nerate a webpage
46f0: 20 6f 6e 20 73 74 64 6f 75 74 20 62 61 73 65 64   on stdout based
4700: 20 6f 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   on.** the value
4710: 73 20 6f 66 20 73 74 61 6e 64 61 72 64 20 43 47  s of standard CG
4720: 49 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  I environment va
4730: 72 69 61 62 6c 65 73 2e 0a 2a 2f 0a 76 6f 69 64  riables..*/.void
4740: 20 63 6d 64 5f 63 67 69 28 76 6f 69 64 29 7b 0a   cmd_cgi(void){.
4750: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
4760: 69 6c 65 3b 0a 20 20 42 6c 6f 62 20 63 6f 6e 66  ile;.  Blob conf
4770: 69 67 2c 20 6c 69 6e 65 2c 20 6b 65 79 2c 20 76  ig, line, key, v
4780: 61 6c 75 65 3b 0a 20 20 69 66 28 20 67 2e 61 72  alue;.  if( g.ar
4790: 67 63 3d 3d 33 20 26 26 20 73 74 72 63 6d 70 28  gc==3 && strcmp(
47a0: 67 2e 61 72 67 76 5b 31 5d 2c 22 63 67 69 22 29  g.argv[1],"cgi")
47b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 46 69 6c 65  ==0 ){.    zFile
47c0: 20 3d 20 67 2e 61 72 67 76 5b 32 5d 3b 0a 20 20   = g.argv[2];.  
47d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 46 69 6c 65  }else{.    zFile
47e0: 20 3d 20 67 2e 61 72 67 76 5b 31 5d 3b 0a 20 20   = g.argv[1];.  
47f0: 7d 0a 20 20 67 2e 68 74 74 70 4f 75 74 20 3d 20  }.  g.httpOut = 
4800: 73 74 64 6f 75 74 3b 0a 20 20 67 2e 68 74 74 70  stdout;.  g.http
4810: 49 6e 20 3d 20 73 74 64 69 6e 3b 0a 23 69 66 64  In = stdin;.#ifd
4820: 65 66 20 5f 5f 4d 49 4e 47 57 33 32 5f 5f 0a 20  ef __MINGW32__. 
4830: 20 2f 2a 20 53 65 74 20 62 69 6e 61 72 79 20 6d   /* Set binary m
4840: 6f 64 65 20 6f 6e 20 77 69 6e 64 6f 77 73 20 74  ode on windows t
4850: 6f 20 61 76 6f 69 64 20 75 6e 64 65 73 69 72 65  o avoid undesire
4860: 64 20 74 72 61 6e 73 6c 61 74 69 6f 6e 73 0a 20  d translations. 
4870: 20 2a 2a 20 62 65 74 77 65 65 6e 20 5c 6e 20 61   ** between \n a
4880: 6e 64 20 5c 72 5c 6e 2e 20 2a 2f 0a 20 20 73 65  nd \r\n. */.  se
4890: 74 6d 6f 64 65 28 5f 66 69 6c 65 6e 6f 28 67 2e  tmode(_fileno(g.
48a0: 68 74 74 70 4f 75 74 29 2c 20 5f 4f 5f 42 49 4e  httpOut), _O_BIN
48b0: 41 52 59 29 3b 0a 20 20 73 65 74 6d 6f 64 65 28  ARY);.  setmode(
48c0: 5f 66 69 6c 65 6e 6f 28 67 2e 68 74 74 70 49 6e  _fileno(g.httpIn
48d0: 29 2c 20 5f 4f 5f 42 49 4e 41 52 59 29 3b 0a 23  ), _O_BINARY);.#
48e0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 45  endif.#ifdef __E
48f0: 4d 58 5f 5f 0a 20 20 2f 2a 20 53 69 6d 69 6c 61  MX__.  /* Simila
4900: 72 20 68 61 63 6b 20 66 6f 72 20 4f 53 2f 32 20  r hack for OS/2 
4910: 2a 2f 0a 20 20 73 65 74 6d 6f 64 65 28 66 69 6c  */.  setmode(fil
4920: 65 6e 6f 28 67 2e 68 74 74 70 4f 75 74 29 2c 20  eno(g.httpOut), 
4930: 4f 5f 42 49 4e 41 52 59 29 3b 0a 20 20 73 65 74  O_BINARY);.  set
4940: 6d 6f 64 65 28 66 69 6c 65 6e 6f 28 67 2e 68 74  mode(fileno(g.ht
4950: 74 70 49 6e 29 2c 20 4f 5f 42 49 4e 41 52 59 29  tpIn), O_BINARY)
4960: 3b 0a 23 65 6e 64 69 66 0a 20 20 67 2e 63 67 69  ;.#endif.  g.cgi
4970: 50 61 6e 69 63 20 3d 20 31 3b 0a 20 20 62 6c 6f  Panic = 1;.  blo
4980: 62 5f 72 65 61 64 5f 66 72 6f 6d 5f 66 69 6c 65  b_read_from_file
4990: 28 26 63 6f 6e 66 69 67 2c 20 7a 46 69 6c 65 29  (&config, zFile)
49a0: 3b 0a 20 20 77 68 69 6c 65 28 20 62 6c 6f 62 5f  ;.  while( blob_
49b0: 6c 69 6e 65 28 26 63 6f 6e 66 69 67 2c 20 26 6c  line(&config, &l
49c0: 69 6e 65 29 20 29 7b 0a 20 20 20 20 69 66 28 20  ine) ){.    if( 
49d0: 21 62 6c 6f 62 5f 74 6f 6b 65 6e 28 26 6c 69 6e  !blob_token(&lin
49e0: 65 2c 20 26 6b 65 79 29 20 29 20 63 6f 6e 74 69  e, &key) ) conti
49f0: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 62 6c 6f  nue;.    if( blo
4a00: 62 5f 62 75 66 66 65 72 28 26 6b 65 79 29 5b 30  b_buffer(&key)[0
4a10: 5d 3d 3d 27 23 27 20 29 20 63 6f 6e 74 69 6e 75  ]=='#' ) continu
4a20: 65 3b 0a 20 20 20 20 69 66 28 20 62 6c 6f 62 5f  e;.    if( blob_
4a30: 65 71 28 26 6b 65 79 2c 20 22 64 65 62 75 67 3a  eq(&key, "debug:
4a40: 22 29 20 26 26 20 62 6c 6f 62 5f 74 6f 6b 65 6e  ") && blob_token
4a50: 28 26 6c 69 6e 65 2c 20 26 76 61 6c 75 65 29 20  (&line, &value) 
4a60: 29 7b 0a 20 20 20 20 20 20 67 2e 66 44 65 62 75  ){.      g.fDebu
4a70: 67 20 3d 20 66 6f 70 65 6e 28 62 6c 6f 62 5f 73  g = fopen(blob_s
4a80: 74 72 28 26 76 61 6c 75 65 29 2c 20 22 61 22 29  tr(&value), "a")
4a90: 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 72 65 73  ;.      blob_res
4aa0: 65 74 28 26 76 61 6c 75 65 29 3b 0a 20 20 20 20  et(&value);.    
4ab0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
4ac0: 7d 0a 20 20 20 20 69 66 28 20 62 6c 6f 62 5f 65  }.    if( blob_e
4ad0: 71 28 26 6b 65 79 2c 20 22 48 4f 4d 45 3a 22 29  q(&key, "HOME:")
4ae0: 20 26 26 20 62 6c 6f 62 5f 74 6f 6b 65 6e 28 26   && blob_token(&
4af0: 6c 69 6e 65 2c 20 26 76 61 6c 75 65 29 20 29 7b  line, &value) ){
4b00: 0a 20 20 20 20 20 20 63 67 69 5f 73 65 74 65 6e  .      cgi_seten
4b10: 76 28 22 48 4f 4d 45 22 2c 20 62 6c 6f 62 5f 73  v("HOME", blob_s
4b20: 74 72 28 26 76 61 6c 75 65 29 29 3b 0a 20 20 20  tr(&value));.   
4b30: 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 76     blob_reset(&v
4b40: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 63 6f 6e  alue);.      con
4b50: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
4b60: 20 69 66 28 20 62 6c 6f 62 5f 65 71 28 26 6b 65   if( blob_eq(&ke
4b70: 79 2c 20 22 72 65 70 6f 73 69 74 6f 72 79 3a 22  y, "repository:"
4b80: 29 20 26 26 20 62 6c 6f 62 5f 74 6f 6b 65 6e 28  ) && blob_token(
4b90: 26 6c 69 6e 65 2c 20 26 76 61 6c 75 65 29 20 29  &line, &value) )
4ba0: 7b 0a 20 20 20 20 20 20 64 62 5f 6f 70 65 6e 5f  {.      db_open_
4bb0: 72 65 70 6f 73 69 74 6f 72 79 28 62 6c 6f 62 5f  repository(blob_
4bc0: 73 74 72 28 26 76 61 6c 75 65 29 29 3b 0a 20 20  str(&value));.  
4bd0: 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26      blob_reset(&
4be0: 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 6c  value);.      bl
4bf0: 6f 62 5f 72 65 73 65 74 28 26 63 6f 6e 66 69 67  ob_reset(&config
4c00: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4c10: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
4c20: 67 2e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 63  g.db==0 ){.    c
4c30: 67 69 5f 70 61 6e 69 63 28 22 55 6e 61 62 6c 65  gi_panic("Unable
4c40: 20 74 6f 20 66 69 6e 64 20 6f 72 20 6f 70 65 6e   to find or open
4c50: 20 74 68 65 20 70 72 6f 6a 65 63 74 20 72 65 70   the project rep
4c60: 6f 73 69 74 6f 72 79 22 29 3b 0a 20 20 7d 0a 20  ository");.  }. 
4c70: 20 63 67 69 5f 69 6e 69 74 28 29 3b 0a 20 20 70   cgi_init();.  p
4c80: 72 6f 63 65 73 73 5f 6f 6e 65 5f 77 65 62 5f 70  rocess_one_web_p
4c90: 61 67 65 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  age();.}../*.** 
4ca0: 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 66 6f 72  undocumented for
4cb0: 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  mat:.**.**      
4cc0: 20 20 66 6f 73 73 69 6c 20 68 74 74 70 20 52 45    fossil http RE
4cd0: 50 4f 53 49 54 4f 52 59 20 49 4e 46 49 4c 45 20  POSITORY INFILE 
4ce0: 4f 55 54 46 49 4c 45 20 49 50 41 44 44 52 0a 2a  OUTFILE IPADDR.*
4cf0: 2a 0a 2a 2a 20 54 68 65 20 61 72 67 76 3d 3d 36  *.** The argv==6
4d00: 20 66 6f 72 6d 20 69 73 20 75 73 65 64 20 62 79   form is used by
4d10: 20 74 68 65 20 77 69 6e 33 32 20 73 65 72 76 65   the win32 serve
4d20: 72 20 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 43 4f  r only..**.** CO
4d30: 4d 4d 41 4e 44 3a 20 68 74 74 70 0a 2a 2a 0a 2a  MMAND: http.**.*
4d40: 2a 20 55 73 61 67 65 3a 20 25 66 6f 73 73 69 6c  * Usage: %fossil
4d50: 20 68 74 74 70 20 52 45 50 4f 53 49 54 4f 52 59   http REPOSITORY
4d60: 0a 2a 2a 0a 2a 2a 20 48 61 6e 64 6c 65 20 61 20  .**.** Handle a 
4d70: 73 69 6e 67 6c 65 20 48 54 54 50 20 72 65 71 75  single HTTP requ
4d80: 65 73 74 20 61 70 70 65 61 72 69 6e 67 20 6f 6e  est appearing on
4d90: 20 73 74 64 69 6e 2e 20 20 54 68 65 20 72 65 73   stdin.  The res
4da0: 75 6c 74 69 6e 67 20 77 65 62 70 61 67 65 0a 2a  ulting webpage.*
4db0: 2a 20 69 73 20 64 65 6c 69 76 65 72 65 64 20 6f  * is delivered o
4dc0: 6e 20 73 74 64 6f 75 74 2e 20 20 54 68 69 73 20  n stdout.  This 
4dd0: 6d 65 74 68 6f 64 20 69 73 20 75 73 65 64 20 74  method is used t
4de0: 6f 20 6c 61 75 6e 63 68 20 61 6e 20 48 54 54 50  o launch an HTTP
4df0: 20 72 65 71 75 65 73 74 0a 2a 2a 20 68 61 6e 64   request.** hand
4e00: 6c 65 72 20 66 72 6f 6d 20 69 6e 65 74 64 2c 20  ler from inetd, 
4e10: 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 54 68  for example.  Th
4e20: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
4e30: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 0a 2a  e name of the .*
4e40: 2a 20 72 65 70 6f 73 69 74 6f 72 79 2e 0a 2a 2f  * repository..*/
4e50: 0a 76 6f 69 64 20 63 6d 64 5f 68 74 74 70 28 76  .void cmd_http(v
4e60: 6f 69 64 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  oid){.  const ch
4e70: 61 72 20 2a 7a 49 70 41 64 64 72 3b 0a 20 20 69  ar *zIpAddr;.  i
4e80: 66 28 20 67 2e 61 72 67 63 21 3d 32 20 26 26 20  f( g.argc!=2 && 
4e90: 67 2e 61 72 67 63 21 3d 33 20 26 26 20 67 2e 61  g.argc!=3 && g.a
4ea0: 72 67 63 21 3d 36 20 29 7b 0a 20 20 20 20 63 67  rgc!=6 ){.    cg
4eb0: 69 5f 70 61 6e 69 63 28 22 6e 6f 20 72 65 70 6f  i_panic("no repo
4ec0: 73 69 74 6f 72 79 20 73 70 65 63 69 66 69 65 64  sitory specified
4ed0: 22 29 3b 0a 20 20 7d 0a 23 69 66 20 21 64 65 66  ");.  }.#if !def
4ee0: 69 6e 65 64 28 5f 5f 4d 49 4e 47 57 33 32 5f 5f  ined(__MINGW32__
4ef0: 29 0a 20 20 69 66 28 20 67 2e 61 72 67 63 3d 3d  ).  if( g.argc==
4f00: 33 20 26 26 20 67 65 74 75 69 64 28 29 3d 3d 30  3 && getuid()==0
4f10: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
4f20: 20 20 20 63 68 61 72 20 2a 7a 52 65 70 6f 20 3d     char *zRepo =
4f30: 20 67 2e 61 72 67 76 5b 32 5d 3b 0a 20 20 20 20   g.argv[2];.    
4f40: 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
4f50: 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 73 74 72  t;.    for(i=str
4f60: 6c 65 6e 28 7a 52 65 70 6f 29 2d 31 3b 20 69 3e  len(zRepo)-1; i>
4f70: 30 20 26 26 20 7a 52 65 70 6f 5b 69 5d 21 3d 27  0 && zRepo[i]!='
4f80: 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 20 20 69  /'; i--){}.    i
4f90: 66 28 20 7a 52 65 70 6f 5b 69 5d 3d 3d 27 2f 27  f( zRepo[i]=='/'
4fa0: 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 70 6f 5b   ){.      zRepo[
4fb0: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68  i] = 0;.      ch
4fc0: 64 69 72 28 67 2e 61 72 67 76 5b 32 5d 29 3b 0a  dir(g.argv[2]);.
4fd0: 20 20 20 20 20 20 63 68 72 6f 6f 74 28 67 2e 61        chroot(g.a
4fe0: 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20 67  rgv[2]);.      g
4ff0: 2e 61 72 67 76 5b 32 5d 20 3d 20 26 7a 52 65 70  .argv[2] = &zRep
5000: 6f 5b 69 2b 31 5d 3b 0a 20 20 20 20 7d 0a 20 20  o[i+1];.    }.  
5010: 20 20 69 66 28 20 73 74 61 74 28 67 2e 61 72 67    if( stat(g.arg
5020: 76 5b 32 5d 2c 20 26 73 53 74 61 74 29 21 3d 30  v[2], &sStat)!=0
5030: 20 29 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c   ){.      fossil
5040: 5f 66 61 74 61 6c 28 22 63 61 6e 6e 6f 74 20 73  _fatal("cannot s
5050: 74 61 74 28 29 20 72 65 70 6f 73 69 74 6f 72 79  tat() repository
5060: 3a 20 25 73 22 2c 20 67 2e 61 72 67 76 5b 32 5d  : %s", g.argv[2]
5070: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74  );.    }.    set
5080: 67 69 64 28 73 53 74 61 74 2e 73 74 5f 67 69 64  gid(sStat.st_gid
5090: 29 3b 0a 20 20 20 20 73 65 74 75 69 64 28 73 53  );.    setuid(sS
50a0: 74 61 74 2e 73 74 5f 75 69 64 29 3b 0a 20 20 7d  tat.st_uid);.  }
50b0: 0a 23 65 6e 64 69 66 0a 20 20 67 2e 63 67 69 50  .#endif.  g.cgiP
50c0: 61 6e 69 63 20 3d 20 31 3b 0a 20 20 67 2e 66 75  anic = 1;.  g.fu
50d0: 6c 6c 48 74 74 70 52 65 70 6c 79 20 3d 20 31 3b  llHttpReply = 1;
50e0: 0a 20 20 69 66 28 20 67 2e 61 72 67 63 3d 3d 36  .  if( g.argc==6
50f0: 20 29 7b 0a 20 20 20 20 67 2e 68 74 74 70 49 6e   ){.    g.httpIn
5100: 20 3d 20 66 6f 70 65 6e 28 67 2e 61 72 67 76 5b   = fopen(g.argv[
5110: 33 5d 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 67  3], "rb");.    g
5120: 2e 68 74 74 70 4f 75 74 20 3d 20 66 6f 70 65 6e  .httpOut = fopen
5130: 28 67 2e 61 72 67 76 5b 34 5d 2c 20 22 77 62 22  (g.argv[4], "wb"
5140: 29 3b 0a 20 20 20 20 7a 49 70 41 64 64 72 20 3d  );.    zIpAddr =
5150: 20 67 2e 61 72 67 76 5b 35 5d 3b 0a 20 20 7d 65   g.argv[5];.  }e
5160: 6c 73 65 7b 0a 20 20 20 20 67 2e 68 74 74 70 49  lse{.    g.httpI
5170: 6e 20 3d 20 73 74 64 69 6e 3b 0a 20 20 20 20 67  n = stdin;.    g
5180: 2e 68 74 74 70 4f 75 74 20 3d 20 73 74 64 6f 75  .httpOut = stdou
5190: 74 3b 0a 20 20 20 20 7a 49 70 41 64 64 72 20 3d  t;.    zIpAddr =
51a0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 2e   0;.  }.  if( g.
51b0: 61 72 67 63 3e 3d 33 20 29 7b 0a 20 20 20 20 64  argc>=3 ){.    d
51c0: 62 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72  b_open_repositor
51d0: 79 28 67 2e 61 72 67 76 5b 32 5d 29 3b 0a 20 20  y(g.argv[2]);.  
51e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 5f 6d 75  }else{.    db_mu
51f0: 73 74 5f 62 65 5f 77 69 74 68 69 6e 5f 74 72 65  st_be_within_tre
5200: 65 28 29 3b 0a 20 20 7d 0a 20 20 63 67 69 5f 68  e();.  }.  cgi_h
5210: 61 6e 64 6c 65 5f 68 74 74 70 5f 72 65 71 75 65  andle_http_reque
5220: 73 74 28 7a 49 70 41 64 64 72 29 3b 0a 20 20 70  st(zIpAddr);.  p
5230: 72 6f 63 65 73 73 5f 6f 6e 65 5f 77 65 62 5f 70  rocess_one_web_p
5240: 61 67 65 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  age();.}../*.** 
5250: 43 4f 4d 4d 41 4e 44 3a 20 74 65 73 74 2d 68 74  COMMAND: test-ht
5260: 74 70 0a 2a 2a 20 57 6f 72 6b 73 20 6c 69 6b 65  tp.** Works like
5270: 20 74 68 65 20 68 74 74 70 20 63 6f 6d 6d 61 6e   the http comman
5280: 64 20 62 75 74 20 67 69 76 65 73 20 73 65 74 75  d but gives setu
5290: 70 20 70 65 72 6d 69 73 73 69 6f 6e 20 74 6f 20  p permission to 
52a0: 61 6c 6c 20 75 73 65 72 73 2e 0a 2a 2f 0a 76 6f  all users..*/.vo
52b0: 69 64 20 63 6d 64 5f 74 65 73 74 5f 68 74 74 70  id cmd_test_http
52c0: 28 76 6f 69 64 29 7b 0a 20 20 6c 6f 67 69 6e 5f  (void){.  login_
52d0: 73 65 74 5f 63 61 70 61 62 69 6c 69 74 69 65 73  set_capabilities
52e0: 28 22 73 22 29 3b 0a 20 20 63 6d 64 5f 68 74 74  ("s");.  cmd_htt
52f0: 70 28 29 3b 0a 7d 0a 0a 0a 23 69 66 20 21 64 65  p();.}...#if !de
5300: 66 69 6e 65 64 28 5f 5f 44 41 52 57 49 4e 5f 5f  fined(__DARWIN__
5310: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  ) && !defined(__
5320: 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 53  APPLE__)./*.** S
5330: 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 65  earch for an exe
5340: 63 75 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 50  cutable on the P
5350: 41 54 48 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  ATH environment 
5360: 76 61 72 69 61 62 6c 65 2e 0a 2a 2a 20 52 65 74  variable..** Ret
5370: 75 72 6e 20 74 72 75 65 20 28 31 29 20 69 66 20  urn true (1) if 
5380: 66 6f 75 6e 64 20 61 6e 64 20 66 61 6c 73 65 20  found and false 
5390: 28 30 29 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  (0) if not found
53a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
53b0: 62 69 6e 61 72 79 4f 6e 50 61 74 68 28 63 6f 6e  binaryOnPath(con
53c0: 73 74 20 63 68 61 72 20 2a 7a 42 69 6e 61 72 79  st char *zBinary
53d0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
53e0: 2a 7a 50 61 74 68 20 3d 20 67 65 74 65 6e 76 28  *zPath = getenv(
53f0: 22 50 41 54 48 22 29 3b 0a 20 20 63 68 61 72 20  "PATH");.  char 
5400: 2a 7a 46 75 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b  *zFull;.  int i;
5410: 0a 20 20 69 6e 74 20 62 45 78 69 73 74 73 3b 0a  .  int bExists;.
5420: 20 20 77 68 69 6c 65 28 20 7a 50 61 74 68 20 26    while( zPath &
5430: 26 20 7a 50 61 74 68 5b 30 5d 20 29 7b 0a 20 20  & zPath[0] ){.  
5440: 20 20 77 68 69 6c 65 28 20 7a 50 61 74 68 5b 30    while( zPath[0
5450: 5d 3d 3d 27 3a 27 20 29 20 7a 50 61 74 68 2b 2b  ]==':' ) zPath++
5460: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a  ;.    for(i=0; z
5470: 50 61 74 68 5b 69 5d 20 26 26 20 7a 50 61 74 68  Path[i] && zPath
5480: 5b 69 5d 21 3d 27 3a 27 3b 20 69 2b 2b 29 7b 7d  [i]!=':'; i++){}
5490: 0a 20 20 20 20 7a 46 75 6c 6c 20 3d 20 6d 70 72  .    zFull = mpr
54a0: 69 6e 74 66 28 22 25 2e 2a 73 2f 25 73 22 2c 20  intf("%.*s/%s", 
54b0: 69 2c 20 7a 50 61 74 68 2c 20 7a 42 69 6e 61 72  i, zPath, zBinar
54c0: 79 29 3b 0a 20 20 20 20 62 45 78 69 73 74 73 20  y);.    bExists 
54d0: 3d 20 61 63 63 65 73 73 28 7a 46 75 6c 6c 2c 20  = access(zFull, 
54e0: 58 5f 4f 4b 29 3b 0a 20 20 20 20 66 72 65 65 28  X_OK);.    free(
54f0: 7a 46 75 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  zFull);.    if( 
5500: 62 45 78 69 73 74 73 3d 3d 30 20 29 20 72 65 74  bExists==0 ) ret
5510: 75 72 6e 20 31 3b 0a 20 20 20 20 7a 50 61 74 68  urn 1;.    zPath
5520: 20 2b 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74   += i;.  }.  ret
5530: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
5540: 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20  ./*.** COMMAND: 
5550: 73 65 72 76 65 72 0a 2a 2a 20 43 4f 4d 4d 41 4e  server.** COMMAN
5560: 44 3a 20 75 69 0a 2a 2a 0a 2a 2a 20 55 73 61 67  D: ui.**.** Usag
5570: 65 3a 20 25 66 6f 73 73 69 6c 20 73 65 72 76 65  e: %fossil serve
5580: 72 20 3f 2d 50 7c 2d 2d 70 6f 72 74 20 54 43 50  r ?-P|--port TCP
5590: 50 4f 52 54 3f 20 3f 52 45 50 4f 53 49 54 4f 52  PORT? ?REPOSITOR
55a0: 59 3f 0a 2a 2a 20 20 20 20 4f 72 3a 20 25 66 6f  Y?.**    Or: %fo
55b0: 73 73 69 6c 20 75 69 20 3f 2d 50 7c 2d 2d 70 6f  ssil ui ?-P|--po
55c0: 72 74 20 54 43 50 50 4f 52 54 3f 20 3f 52 45 50  rt TCPPORT? ?REP
55d0: 4f 53 49 54 4f 52 59 3f 0a 2a 2a 0a 2a 2a 20 4f  OSITORY?.**.** O
55e0: 70 65 6e 20 61 20 73 6f 63 6b 65 74 20 61 6e 64  pen a socket and
55f0: 20 62 65 67 69 6e 20 6c 69 73 74 65 6e 69 6e 67   begin listening
5600: 20 61 6e 64 20 72 65 73 70 6f 6e 64 69 6e 67 20   and responding 
5610: 74 6f 20 48 54 54 50 20 72 65 71 75 65 73 74 73  to HTTP requests
5620: 20 6f 6e 0a 2a 2a 20 54 43 50 20 70 6f 72 74 20   on.** TCP port 
5630: 38 30 38 30 2c 20 6f 72 20 6f 6e 20 61 6e 79 20  8080, or on any 
5640: 6f 74 68 65 72 20 54 43 50 20 70 6f 72 74 20 64  other TCP port d
5650: 65 66 69 6e 65 64 20 62 79 20 74 68 65 20 2d 50  efined by the -P
5660: 20 6f 72 0a 2a 2a 20 2d 2d 70 6f 72 74 20 6f 70   or.** --port op
5670: 74 69 6f 6e 2e 20 20 54 68 65 20 6f 70 74 69 6f  tion.  The optio
5680: 6e 61 6c 20 61 72 67 75 6d 65 6e 74 20 69 73 20  nal argument is 
5690: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
56a0: 72 65 70 6f 73 69 74 6f 72 79 2e 0a 2a 2a 20 54  repository..** T
56b0: 68 65 20 72 65 70 6f 73 69 74 6f 72 79 20 61 72  he repository ar
56c0: 67 75 6d 65 6e 74 20 6d 61 79 20 62 65 20 6f 6d  gument may be om
56d0: 69 74 74 65 64 20 69 66 20 74 68 65 20 77 6f 72  itted if the wor
56e0: 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 69  king directory i
56f0: 73 0a 2a 2a 20 77 69 74 68 69 6e 20 61 6e 20 6f  s.** within an o
5700: 70 65 6e 20 63 68 65 63 6b 6f 75 74 2e 0a 2a 2a  pen checkout..**
5710: 0a 2a 2a 20 54 68 65 20 22 75 69 22 20 63 6f 6d  .** The "ui" com
5720: 6d 61 6e 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  mand automatical
5730: 6c 79 20 73 74 61 72 74 73 20 61 20 77 65 62 20  ly starts a web 
5740: 62 72 6f 77 73 65 72 20 61 66 74 65 72 20 69 6e  browser after in
5750: 69 74 69 61 6c 69 7a 69 6e 67 0a 2a 2a 20 74 68  itializing.** th
5760: 65 20 77 65 62 20 73 65 72 76 65 72 2e 0a 2a 2f  e web server..*/
5770: 0a 76 6f 69 64 20 63 6d 64 5f 77 65 62 73 65 72  .void cmd_webser
5780: 76 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74  ver(void){.  int
5790: 20 69 50 6f 72 74 2c 20 6d 78 50 6f 72 74 3b 0a   iPort, mxPort;.
57a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
57b0: 6f 72 74 3b 0a 20 20 63 68 61 72 20 2a 7a 42 72  ort;.  char *zBr
57c0: 6f 77 73 65 72 3b 0a 20 20 63 68 61 72 20 2a 7a  owser;.  char *z
57d0: 42 72 6f 77 73 65 72 43 6d 64 20 3d 20 30 3b 0a  BrowserCmd = 0;.
57e0: 0a 20 20 67 2e 74 68 54 72 61 63 65 20 3d 20 66  .  g.thTrace = f
57f0: 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 74 68 2d 74  ind_option("th-t
5800: 72 61 63 65 22 2c 20 30 2c 20 30 29 21 3d 30 3b  race", 0, 0)!=0;
5810: 0a 20 20 69 66 28 20 67 2e 74 68 54 72 61 63 65  .  if( g.thTrace
5820: 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72   ){.    blob_zer
5830: 6f 28 26 67 2e 74 68 4c 6f 67 29 3b 0a 20 20 7d  o(&g.thLog);.  }
5840: 0a 20 20 7a 50 6f 72 74 20 3d 20 66 69 6e 64 5f  .  zPort = find_
5850: 6f 70 74 69 6f 6e 28 22 70 6f 72 74 22 2c 20 22  option("port", "
5860: 50 22 2c 20 31 29 3b 0a 20 20 69 66 28 20 67 2e  P", 1);.  if( g.
5870: 61 72 67 63 21 3d 32 20 26 26 20 67 2e 61 72 67  argc!=2 && g.arg
5880: 63 21 3d 33 20 29 20 75 73 61 67 65 28 22 3f 52  c!=3 ) usage("?R
5890: 45 50 4f 53 49 54 4f 52 59 3f 22 29 3b 0a 20 20  EPOSITORY?");.  
58a0: 69 66 28 20 67 2e 61 72 67 63 3d 3d 32 20 29 7b  if( g.argc==2 ){
58b0: 0a 20 20 20 20 64 62 5f 6d 75 73 74 5f 62 65 5f  .    db_must_be_
58c0: 77 69 74 68 69 6e 5f 74 72 65 65 28 29 3b 0a 20  within_tree();. 
58d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 5f 6f   }else{.    db_o
58e0: 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28 67  pen_repository(g
58f0: 2e 61 72 67 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20  .argv[2]);.  }. 
5900: 20 69 66 28 20 7a 50 6f 72 74 20 29 7b 0a 20 20   if( zPort ){.  
5910: 20 20 69 50 6f 72 74 20 3d 20 6d 78 50 6f 72 74    iPort = mxPort
5920: 20 3d 20 61 74 6f 69 28 7a 50 6f 72 74 29 3b 0a   = atoi(zPort);.
5930: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 50 6f    }else{.    iPo
5940: 72 74 20 3d 20 64 62 5f 67 65 74 5f 69 6e 74 28  rt = db_get_int(
5950: 22 68 74 74 70 2d 70 6f 72 74 22 2c 20 38 30 38  "http-port", 808
5960: 30 29 3b 0a 20 20 20 20 6d 78 50 6f 72 74 20 3d  0);.    mxPort =
5970: 20 69 50 6f 72 74 2b 31 30 30 3b 0a 20 20 7d 0a   iPort+100;.  }.
5980: 23 69 66 6e 64 65 66 20 5f 5f 4d 49 4e 47 57 33  #ifndef __MINGW3
5990: 32 5f 5f 0a 20 20 2f 2a 20 55 6e 69 78 20 69 6d  2__.  /* Unix im
59a0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  plementation */.
59b0: 20 20 69 66 28 20 67 2e 61 72 67 76 5b 31 5d 5b    if( g.argv[1][
59c0: 30 5d 3d 3d 27 75 27 20 29 7b 0a 23 69 66 20 21  0]=='u' ){.#if !
59d0: 64 65 66 69 6e 65 64 28 5f 5f 44 41 52 57 49 4e  defined(__DARWIN
59e0: 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  __) && !defined(
59f0: 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 7a  __APPLE__).    z
5a00: 42 72 6f 77 73 65 72 20 3d 20 64 62 5f 67 65 74  Browser = db_get
5a10: 28 22 77 65 62 2d 62 72 6f 77 73 65 72 22 2c 20  ("web-browser", 
5a20: 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 42 72 6f  0);.    if( zBro
5a30: 77 73 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  wser==0 ){.     
5a40: 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 61 7a   static char *az
5a50: 42 72 6f 77 73 65 72 50 72 6f 67 5b 5d 20 3d 20  BrowserProg[] = 
5a60: 7b 20 22 78 64 67 2d 6f 70 65 6e 22 2c 20 22 67  { "xdg-open", "g
5a70: 6e 6f 6d 65 2d 6f 70 65 6e 22 2c 20 22 66 69 72  nome-open", "fir
5a80: 65 66 6f 78 22 20 7d 3b 0a 20 20 20 20 20 20 69  efox" };.      i
5a90: 6e 74 20 69 3b 0a 20 20 20 20 20 20 7a 42 72 6f  nt i;.      zBro
5aa0: 77 73 65 72 20 3d 20 22 65 63 68 6f 22 3b 0a 20  wser = "echo";. 
5ab0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
5ac0: 73 69 7a 65 6f 66 28 61 7a 42 72 6f 77 73 65 72  sizeof(azBrowser
5ad0: 50 72 6f 67 29 2f 73 69 7a 65 6f 66 28 61 7a 42  Prog)/sizeof(azB
5ae0: 72 6f 77 73 65 72 50 72 6f 67 5b 30 5d 29 3b 20  rowserProg[0]); 
5af0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
5b00: 28 20 62 69 6e 61 72 79 4f 6e 50 61 74 68 28 61  ( binaryOnPath(a
5b10: 7a 42 72 6f 77 73 65 72 50 72 6f 67 5b 69 5d 29  zBrowserProg[i])
5b20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 42   ){.          zB
5b30: 72 6f 77 73 65 72 20 3d 20 61 7a 42 72 6f 77 73  rowser = azBrows
5b40: 65 72 50 72 6f 67 5b 69 5d 3b 0a 20 20 20 20 20  erProg[i];.     
5b50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5b60: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
5b70: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7a 42    }.#else.    zB
5b80: 72 6f 77 73 65 72 20 3d 20 64 62 5f 67 65 74 28  rowser = db_get(
5b90: 22 77 65 62 2d 62 72 6f 77 73 65 72 22 2c 20 22  "web-browser", "
5ba0: 6f 70 65 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 20  open");.#endif. 
5bb0: 20 20 20 7a 42 72 6f 77 73 65 72 43 6d 64 20 3d     zBrowserCmd =
5bc0: 20 6d 70 72 69 6e 74 66 28 22 25 73 20 68 74 74   mprintf("%s htt
5bd0: 70 3a 2f 2f 6c 6f 63 61 6c 68 6f 73 74 3a 25 25  p://localhost:%%
5be0: 64 2f 20 26 22 2c 20 7a 42 72 6f 77 73 65 72 29  d/ &", zBrowser)
5bf0: 3b 0a 20 20 7d 0a 20 20 64 62 5f 63 6c 6f 73 65  ;.  }.  db_close
5c00: 28 29 3b 0a 20 20 69 66 28 20 63 67 69 5f 68 74  ();.  if( cgi_ht
5c10: 74 70 5f 73 65 72 76 65 72 28 69 50 6f 72 74 2c  tp_server(iPort,
5c20: 20 6d 78 50 6f 72 74 2c 20 7a 42 72 6f 77 73 65   mxPort, zBrowse
5c30: 72 43 6d 64 29 20 29 7b 0a 20 20 20 20 66 6f 73  rCmd) ){.    fos
5c40: 73 69 6c 5f 66 61 74 61 6c 28 22 75 6e 61 62 6c  sil_fatal("unabl
5c50: 65 20 74 6f 20 6c 69 73 74 65 6e 20 6f 6e 20 54  e to listen on T
5c60: 43 50 20 73 6f 63 6b 65 74 20 25 64 22 2c 20 69  CP socket %d", i
5c70: 50 6f 72 74 29 3b 0a 20 20 7d 0a 20 20 67 2e 68  Port);.  }.  g.h
5c80: 74 74 70 49 6e 20 3d 20 73 74 64 69 6e 3b 0a 20  ttpIn = stdin;. 
5c90: 20 67 2e 68 74 74 70 4f 75 74 20 3d 20 73 74 64   g.httpOut = std
5ca0: 6f 75 74 3b 0a 20 20 69 66 28 20 67 2e 66 48 74  out;.  if( g.fHt
5cb0: 74 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 66  tpTrace ){.    f
5cc0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
5cd0: 3d 3d 3d 3d 3d 3d 20 53 45 52 56 45 52 20 70 69  ====== SERVER pi
5ce0: 64 20 25 64 20 3d 3d 3d 3d 3d 3d 3d 5c 6e 22 2c  d %d =======\n",
5cf0: 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20 7d 0a   getpid());.  }.
5d00: 20 20 67 2e 63 67 69 50 61 6e 69 63 20 3d 20 31    g.cgiPanic = 1
5d10: 3b 0a 20 20 69 66 28 20 67 2e 61 72 67 63 3d 3d  ;.  if( g.argc==
5d20: 32 20 29 7b 0a 20 20 20 20 64 62 5f 6d 75 73 74  2 ){.    db_must
5d30: 5f 62 65 5f 77 69 74 68 69 6e 5f 74 72 65 65 28  _be_within_tree(
5d40: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
5d50: 64 62 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f  db_open_reposito
5d60: 72 79 28 67 2e 61 72 67 76 5b 32 5d 29 3b 0a 20  ry(g.argv[2]);. 
5d70: 20 7d 0a 20 20 63 67 69 5f 68 61 6e 64 6c 65 5f   }.  cgi_handle_
5d80: 68 74 74 70 5f 72 65 71 75 65 73 74 28 30 29 3b  http_request(0);
5d90: 0a 20 20 70 72 6f 63 65 73 73 5f 6f 6e 65 5f 77  .  process_one_w
5da0: 65 62 5f 70 61 67 65 28 29 3b 0a 23 65 6c 73 65  eb_page();.#else
5db0: 0a 20 20 2f 2a 20 57 69 6e 33 32 20 69 6d 70 6c  .  /* Win32 impl
5dc0: 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  ementation */.  
5dd0: 69 66 28 20 67 2e 61 72 67 76 5b 31 5d 5b 30 5d  if( g.argv[1][0]
5de0: 3d 3d 27 75 27 20 29 7b 0a 20 20 20 20 7a 42 72  =='u' ){.    zBr
5df0: 6f 77 73 65 72 20 3d 20 64 62 5f 67 65 74 28 22  owser = db_get("
5e00: 77 65 62 2d 62 72 6f 77 73 65 72 22 2c 20 22 73  web-browser", "s
5e10: 74 61 72 74 22 29 3b 0a 20 20 20 20 7a 42 72 6f  tart");.    zBro
5e20: 77 73 65 72 43 6d 64 20 3d 20 6d 70 72 69 6e 74  wserCmd = mprint
5e30: 66 28 22 25 73 20 68 74 74 70 3a 2f 2f 31 32 37  f("%s http://127
5e40: 2e 30 2e 30 2e 31 3a 25 25 64 2f 22 2c 20 7a 42  .0.0.1:%%d/", zB
5e50: 72 6f 77 73 65 72 29 3b 0a 20 20 7d 0a 20 20 64  rowser);.  }.  d
5e60: 62 5f 63 6c 6f 73 65 28 29 3b 0a 20 20 77 69 6e  b_close();.  win
5e70: 33 32 5f 68 74 74 70 5f 73 65 72 76 65 72 28 69  32_http_server(i
5e80: 50 6f 72 74 2c 20 6d 78 50 6f 72 74 2c 20 7a 42  Port, mxPort, zB
5e90: 72 6f 77 73 65 72 43 6d 64 29 3b 0a 23 65 6e 64  rowserCmd);.#end
5ea0: 69 66 0a 7d 0a                                   if.}.