Fossil with Commonmark

Hex Artifact Content
Login

Artifact d29ba5922c86f2829ed4958f2999941a9063970a:


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 53 69 6d 70 6c 69 66 69 65 64 20 42 53 44 20   Simplified BSD 
00a0: 4c 69 63 65 6e 73 65 20 28 61 6c 73 6f 0a 2a 2a  License (also.**
00b0: 20 6b 6e 6f 77 6e 20 61 73 20 74 68 65 20 22 32   known as the "2
00c0: 2d 43 6c 61 75 73 65 20 4c 69 63 65 6e 73 65 22  -Clause License"
00d0: 20 6f 72 20 22 46 72 65 65 42 53 44 20 4c 69 63   or "FreeBSD Lic
00e0: 65 6e 73 65 22 2e 29 0a 0a 2a 2a 20 54 68 69 73  ense".)..** This
00f0: 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73 74   program is dist
0100: 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20 68  ributed in the h
0110: 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c 6c  ope that it will
0120: 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20 62   be useful,.** b
0130: 75 74 20 77 69 74 68 6f 75 74 20 61 6e 79 20 77  ut without any w
0140: 61 72 72 61 6e 74 79 3b 20 77 69 74 68 6f 75 74  arranty; without
0150: 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69 65   even the implie
0160: 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a 2a  d warranty of.**
0170: 20 6d 65 72 63 68 61 6e 74 61 62 69 6c 69 74 79   merchantability
0180: 20 6f 72 20 66 69 74 6e 65 73 73 20 66 6f 72 20   or fitness for 
0190: 61 20 70 61 72 74 69 63 75 6c 61 72 20 70 75 72  a particular pur
01a0: 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 75 74 68  pose..**.** Auth
01b0: 6f 72 20 63 6f 6e 74 61 63 74 20 69 6e 66 6f 72  or contact infor
01c0: 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 20 64 72 68  mation:.**   drh
01d0: 40 68 77 61 63 69 2e 63 6f 6d 0a 2a 2a 20 20 20  @hwaci.com.**   
01e0: 68 74 74 70 3a 2f 2f 77 77 77 2e 68 77 61 63 69  http://www.hwaci
01f0: 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a 0a 2a 2a 2a  .com/drh/.**.***
0200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
0250: 2a 2a 20 46 69 6c 65 20 75 74 69 6c 69 74 69 65  ** File utilitie
0260: 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f  s..**.** Functio
0270: 6e 73 20 6e 61 6d 65 64 20 66 69 6c 65 5f 2a 20  ns named file_* 
0280: 61 72 65 20 67 65 6e 65 72 69 63 20 66 75 6e 63  are generic func
0290: 74 69 6f 6e 73 20 74 68 61 74 20 61 6c 77 61 79  tions that alway
02a0: 73 20 66 6f 6c 6c 6f 77 20 73 79 6d 6c 69 6e 6b  s follow symlink
02b0: 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f  s..**.** Functio
02c0: 6e 73 20 6e 61 6d 65 64 20 66 69 6c 65 5f 77 64  ns named file_wd
02d0: 5f 2a 20 61 72 65 20 74 6f 20 62 65 20 75 73 65  _* are to be use
02e0: 64 20 66 6f 72 20 66 69 6c 65 73 20 69 6e 73 69  d for files insi
02f0: 64 65 20 77 6f 72 6b 69 6e 67 0a 2a 2a 20 64 69  de working.** di
0300: 72 65 63 74 6f 72 69 65 73 2e 20 54 68 65 79 20  rectories. They 
0310: 66 6f 6c 6c 6f 77 20 73 79 6d 6c 69 6e 6b 73 20  follow symlinks 
0320: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 27 61 6c  depending on 'al
0330: 6c 6f 77 2d 73 79 6d 6c 69 6e 6b 73 27 20 73 65  low-symlinks' se
0340: 74 74 69 6e 67 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  tting..*/.#inclu
0350: 64 65 20 22 63 6f 6e 66 69 67 2e 68 22 0a 23 69  de "config.h".#i
0360: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65  nclude <sys/type
0370: 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  s.h>.#include <s
0380: 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c  ys/stat.h>.#incl
0390: 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23  ude <unistd.h>.#
03a0: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e  include <string.
03b0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
03c0: 6e 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22  no.h>.#include "
03d0: 66 69 6c 65 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54  file.h"../*.** T
03e0: 68 65 20 66 69 6c 65 20 73 74 61 74 75 73 20 69  he file status i
03f0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
0400: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
0410: 73 74 61 74 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a  stat() call..**.
0420: 2a 2a 20 55 73 65 20 5f 73 74 61 74 69 36 34 20  ** Use _stati64 
0430: 72 61 74 68 65 72 20 74 68 61 6e 20 73 74 61 74  rather than stat
0440: 20 6f 6e 20 77 69 6e 64 6f 77 73 2c 20 69 6e 20   on windows, in 
0450: 6f 72 64 65 72 20 74 6f 20 68 61 6e 64 6c 65 20  order to handle 
0460: 66 69 6c 65 73 0a 2a 2a 20 6c 61 72 67 65 72 20  files.** larger 
0470: 74 68 61 6e 20 32 47 42 2e 0a 2a 2f 0a 23 69 66  than 2GB..*/.#if
0480: 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29   defined(_WIN32)
0490: 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 4d 53   && defined(__MS
04a0: 56 43 52 54 5f 5f 29 0a 23 20 64 65 66 69 6e 65  VCRT__).# define
04b0: 20 73 74 61 74 20 5f 73 74 61 74 69 36 34 0a 23   stat _stati64.#
04c0: 65 6e 64 69 66 0a 2f 2a 0a 2a 2a 20 4f 6e 20 57  endif./*.** On W
04d0: 69 6e 64 6f 77 73 20 53 5f 49 53 4c 4e 4b 20 61  indows S_ISLNK a
04e0: 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 46 41  lways returns FA
04f0: 4c 53 45 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  LSE..*/.#if defi
0500: 6e 65 64 28 5f 57 49 4e 33 32 29 0a 23 20 64 65  ned(_WIN32).# de
0510: 66 69 6e 65 20 53 5f 49 53 4c 4e 4b 28 78 29 20  fine S_ISLNK(x) 
0520: 28 30 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69  (0).#endif.stati
0530: 63 20 69 6e 74 20 66 69 6c 65 53 74 61 74 56 61  c int fileStatVa
0540: 6c 69 64 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  lid = 0;.static 
0550: 73 74 72 75 63 74 20 73 74 61 74 20 66 69 6c 65  struct stat file
0560: 53 74 61 74 3b 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c  Stat;../*.** Fil
0570: 6c 20 73 74 61 74 20 62 75 66 20 77 69 74 68 20  l stat buf with 
0580: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65 63 65  information rece
0590: 69 76 65 64 20 66 72 6f 6d 20 73 74 61 74 28 29  ived from stat()
05a0: 20 6f 72 20 6c 73 74 61 74 28 29 2e 0a 2a 2a 20   or lstat()..** 
05b0: 6c 73 74 61 74 28 29 20 69 73 20 63 61 6c 6c 65  lstat() is calle
05c0: 64 20 6f 6e 20 55 6e 69 78 20 69 66 20 69 73 57  d on Unix if isW
05d0: 64 20 69 73 20 54 52 55 45 20 61 6e 64 20 61 6c  d is TRUE and al
05e0: 6c 6f 77 2d 73 79 6d 6c 69 6e 6b 73 20 73 65 74  low-symlinks set
05f0: 74 69 6e 67 20 69 73 20 6f 6e 2e 0a 2a 2a 0a 2a  ting is on..**.*
0600: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6f 73  /.static int fos
0610: 73 69 6c 5f 73 74 61 74 28 63 6f 6e 73 74 20 63  sil_stat(const c
0620: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
0630: 73 74 72 75 63 74 20 73 74 61 74 20 2a 62 75 66  struct stat *buf
0640: 2c 20 69 6e 74 20 69 73 57 64 29 7b 0a 23 69 66  , int isWd){.#if
0650: 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32   !defined(_WIN32
0660: 29 0a 20 20 69 66 28 20 69 73 57 64 20 26 26 20  ).  if( isWd && 
0670: 67 2e 61 6c 6c 6f 77 53 79 6d 6c 69 6e 6b 73 20  g.allowSymlinks 
0680: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 73  ){.    return ls
0690: 74 61 74 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 62  tat(zFilename, b
06a0: 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  uf);.  }else{.  
06b0: 20 20 72 65 74 75 72 6e 20 73 74 61 74 28 7a 46    return stat(zF
06c0: 69 6c 65 6e 61 6d 65 2c 20 62 75 66 29 3b 0a 20  ilename, buf);. 
06d0: 20 7d 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72   }.#else.  int r
06e0: 63 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  c = 0;.  char *z
06f0: 4d 62 63 73 20 3d 20 66 6f 73 73 69 6c 5f 75 74  Mbcs = fossil_ut
0700: 66 38 5f 74 6f 5f 6d 62 63 73 28 7a 46 69 6c 65  f8_to_mbcs(zFile
0710: 6e 61 6d 65 29 3b 0a 20 20 72 63 20 3d 20 73 74  name);.  rc = st
0720: 61 74 28 7a 4d 62 63 73 2c 20 62 75 66 29 3b 0a  at(zMbcs, buf);.
0730: 20 20 66 6f 73 73 69 6c 5f 6d 62 63 73 5f 66 72    fossil_mbcs_fr
0740: 65 65 28 7a 4d 62 63 73 29 3b 0a 20 20 72 65 74  ee(zMbcs);.  ret
0750: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
0760: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 69 6e 20  ../*.** Fill in 
0770: 74 68 65 20 66 69 6c 65 53 74 61 74 20 76 61 72  the fileStat var
0780: 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20 66 69  iable for the fi
0790: 6c 65 20 6e 61 6d 65 64 20 7a 46 69 6c 65 6e 61  le named zFilena
07a0: 6d 65 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  me..** If zFilen
07b0: 61 6d 65 3d 3d 30 2c 20 74 68 65 6e 20 75 73 65  ame==0, then use
07c0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 76 61   the previous va
07d0: 6c 75 65 20 6f 66 20 66 69 6c 65 53 74 61 74 20  lue of fileStat 
07e0: 69 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  if.** there is a
07f0: 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e   previous value.
0800: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 73 57 64 20 69  .**.** If isWd i
0810: 73 20 54 52 55 45 2c 20 64 6f 20 6c 73 74 61 74  s TRUE, do lstat
0820: 28 29 20 69 6e 73 74 65 61 64 20 6f 66 20 73 74  () instead of st
0830: 61 74 28 29 20 69 66 20 61 6c 6c 6f 77 2d 73 79  at() if allow-sy
0840: 6d 6c 69 6e 6b 73 20 69 73 20 6f 6e 2e 0a 2a 2a  mlinks is on..**
0850: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
0860: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
0870: 20 20 4e 6f 20 65 72 72 6f 72 20 6d 65 73 73 61    No error messa
0880: 67 65 73 20 61 72 65 20 67 65 6e 65 72 61 74 65  ges are generate
0890: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
08a0: 20 67 65 74 53 74 61 74 28 63 6f 6e 73 74 20 63   getStat(const c
08b0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
08c0: 69 6e 74 20 69 73 57 64 29 7b 0a 20 20 69 6e 74  int isWd){.  int
08d0: 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a   rc = 0;.  if( z
08e0: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
08f0: 20 20 20 69 66 28 20 66 69 6c 65 53 74 61 74 56     if( fileStatV
0900: 61 6c 69 64 3d 3d 30 20 29 20 72 63 20 3d 20 31  alid==0 ) rc = 1
0910: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
0920: 66 28 20 66 6f 73 73 69 6c 5f 73 74 61 74 28 7a  f( fossil_stat(z
0930: 46 69 6c 65 6e 61 6d 65 2c 20 26 66 69 6c 65 53  Filename, &fileS
0940: 74 61 74 2c 20 69 73 57 64 29 21 3d 30 20 29 7b  tat, isWd)!=0 ){
0950: 0a 20 20 20 20 20 20 66 69 6c 65 53 74 61 74 56  .      fileStatV
0960: 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  alid = 0;.      
0970: 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  rc = 1;.    }els
0980: 65 7b 0a 20 20 20 20 20 20 66 69 6c 65 53 74 61  e{.      fileSta
0990: 74 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20  tValid = 1;.    
09a0: 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a    rc = 0;.    }.
09b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
09c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
09d0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 66   the size of a f
09e0: 69 6c 65 20 69 6e 20 62 79 74 65 73 2e 20 20 52  ile in bytes.  R
09f0: 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20  eturn -1 if the 
0a00: 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  file does not.**
0a10: 20 65 78 69 73 74 2e 20 20 49 66 20 7a 46 69 6c   exist.  If zFil
0a20: 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 72  ename is NULL, r
0a30: 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
0a40: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
0a50: 74 6c 79 0a 2a 2a 20 73 74 61 74 2d 65 64 20 66  tly.** stat-ed f
0a60: 69 6c 65 2e 0a 2a 2f 0a 69 36 34 20 66 69 6c 65  ile..*/.i64 file
0a70: 5f 73 69 7a 65 28 63 6f 6e 73 74 20 63 68 61 72  _size(const char
0a80: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
0a90: 72 65 74 75 72 6e 20 67 65 74 53 74 61 74 28 7a  return getStat(z
0aa0: 46 69 6c 65 6e 61 6d 65 2c 20 30 29 20 3f 20 2d  Filename, 0) ? -
0ab0: 31 20 3a 20 66 69 6c 65 53 74 61 74 2e 73 74 5f  1 : fileStat.st_
0ac0: 73 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  size;.}../*.** S
0ad0: 61 6d 65 20 61 73 20 66 69 6c 65 5f 73 69 7a 65  ame as file_size
0ae0: 28 29 2c 20 62 75 74 20 74 61 6b 65 73 20 69 6e  (), but takes in
0af0: 74 6f 20 61 63 63 6f 75 6e 74 20 73 79 6d 6c 69  to account symli
0b00: 6e 6b 73 2e 0a 2a 2f 0a 69 36 34 20 66 69 6c 65  nks..*/.i64 file
0b10: 5f 77 64 5f 73 69 7a 65 28 63 6f 6e 73 74 20 63  _wd_size(const c
0b20: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
0b30: 0a 20 20 72 65 74 75 72 6e 20 67 65 74 53 74 61  .  return getSta
0b40: 74 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 31 29 20  t(zFilename, 1) 
0b50: 3f 20 2d 31 20 3a 20 66 69 6c 65 53 74 61 74 2e  ? -1 : fileStat.
0b60: 73 74 5f 73 69 7a 65 3b 20 20 0a 7d 0a 0a 2f 2a  st_size;  .}../*
0b70: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d  .** Return the m
0b80: 6f 64 69 66 69 63 61 74 69 6f 6e 20 74 69 6d 65  odification time
0b90: 20 66 6f 72 20 61 20 66 69 6c 65 2e 20 20 52 65   for a file.  Re
0ba0: 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 66  turn -1 if the f
0bb0: 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  ile.** does not 
0bc0: 65 78 69 73 74 2e 20 20 49 66 20 7a 46 69 6c 65  exist.  If zFile
0bd0: 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 72 65 74  name is NULL ret
0be0: 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
0bf0: 74 68 65 20 6d 6f 73 74 0a 2a 2a 20 72 65 63 65  the most.** rece
0c00: 6e 74 6c 79 20 73 74 61 74 2d 65 64 20 66 69 6c  ntly stat-ed fil
0c10: 65 2e 0a 2a 2f 0a 69 36 34 20 66 69 6c 65 5f 6d  e..*/.i64 file_m
0c20: 74 69 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20  time(const char 
0c30: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 72  *zFilename){.  r
0c40: 65 74 75 72 6e 20 67 65 74 53 74 61 74 28 7a 46  eturn getStat(zF
0c50: 69 6c 65 6e 61 6d 65 2c 20 30 29 20 3f 20 2d 31  ilename, 0) ? -1
0c60: 20 3a 20 66 69 6c 65 53 74 61 74 2e 73 74 5f 6d   : fileStat.st_m
0c70: 74 69 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  time;.}../*.** S
0c80: 61 6d 65 20 61 73 20 66 69 6c 65 5f 6d 74 69 6d  ame as file_mtim
0c90: 65 28 29 2c 20 62 75 74 20 74 61 6b 65 73 20 69  e(), but takes i
0ca0: 6e 74 6f 20 61 63 63 6f 75 6e 74 20 73 79 6d 6c  nto account syml
0cb0: 69 6e 6b 73 2e 0a 2a 2f 0a 69 36 34 20 66 69 6c  inks..*/.i64 fil
0cc0: 65 5f 77 64 5f 6d 74 69 6d 65 28 63 6f 6e 73 74  e_wd_mtime(const
0cd0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
0ce0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 53  ){.  return getS
0cf0: 74 61 74 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 31  tat(zFilename, 1
0d00: 29 20 3f 20 2d 31 20 3a 20 66 69 6c 65 53 74 61  ) ? -1 : fileSta
0d10: 74 2e 73 74 5f 6d 74 69 6d 65 3b 0a 7d 0a 0a 2f  t.st_mtime;.}../
0d20: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
0d30: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 66 69   if the named fi
0d40: 6c 65 20 69 73 20 61 6e 20 6f 72 64 69 6e 61 72  le is an ordinar
0d50: 79 20 66 69 6c 65 20 6f 72 20 73 79 6d 6c 69 6e  y file or symlin
0d60: 6b 20 0a 2a 2a 20 61 6e 64 20 73 79 6d 6c 69 6e  k .** and symlin
0d70: 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  ks are allowed..
0d80: 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  ** Return false 
0d90: 66 6f 72 20 64 69 72 65 63 74 6f 72 69 65 73 2c  for directories,
0da0: 20 64 65 76 69 63 65 73 2c 20 66 69 66 6f 73 2c   devices, fifos,
0db0: 20 65 74 63 2e 0a 2a 2f 0a 69 6e 74 20 66 69 6c   etc..*/.int fil
0dc0: 65 5f 77 64 5f 69 73 66 69 6c 65 5f 6f 72 5f 6c  e_wd_isfile_or_l
0dd0: 69 6e 6b 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ink(const char *
0de0: 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 72 65  zFilename){.  re
0df0: 74 75 72 6e 20 67 65 74 53 74 61 74 28 7a 46 69  turn getStat(zFi
0e00: 6c 65 6e 61 6d 65 2c 20 31 29 20 3f 20 30 20 3a  lename, 1) ? 0 :
0e10: 20 53 5f 49 53 52 45 47 28 66 69 6c 65 53 74 61   S_ISREG(fileSta
0e20: 74 2e 73 74 5f 6d 6f 64 65 29 20 7c 7c 0a 20 20  t.st_mode) ||.  
0e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e50: 20 20 20 53 5f 49 53 4c 4e 4b 28 66 69 6c 65 53     S_ISLNK(fileS
0e60: 74 61 74 2e 73 74 5f 6d 6f 64 65 29 3b 0a 7d 0a  tat.st_mode);.}.
0e70: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
0e80: 55 45 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  UE if the named 
0e90: 66 69 6c 65 20 69 73 20 61 6e 20 6f 72 64 69 6e  file is an ordin
0ea0: 61 72 79 20 66 69 6c 65 2e 20 20 52 65 74 75 72  ary file.  Retur
0eb0: 6e 20 66 61 6c 73 65 0a 2a 2a 20 66 6f 72 20 64  n false.** for d
0ec0: 69 72 65 63 74 6f 72 69 65 73 2c 20 64 65 76 69  irectories, devi
0ed0: 63 65 73 2c 20 66 69 66 6f 73 2c 20 73 79 6d 6c  ces, fifos, syml
0ee0: 69 6e 6b 73 2c 20 65 74 63 2e 0a 2a 2f 0a 69 6e  inks, etc..*/.in
0ef0: 74 20 66 69 6c 65 5f 69 73 66 69 6c 65 28 63 6f  t file_isfile(co
0f00: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
0f10: 61 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 67  ame){.  return g
0f20: 65 74 53 74 61 74 28 7a 46 69 6c 65 6e 61 6d 65  etStat(zFilename
0f30: 2c 20 30 29 20 3f 20 30 20 3a 20 53 5f 49 53 52  , 0) ? 0 : S_ISR
0f40: 45 47 28 66 69 6c 65 53 74 61 74 2e 73 74 5f 6d  EG(fileStat.st_m
0f50: 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ode);.}../*.** S
0f60: 61 6d 65 20 61 73 20 66 69 6c 65 5f 69 73 66 69  ame as file_isfi
0f70: 6c 65 28 29 2c 20 62 75 74 20 74 61 6b 65 73 20  le(), but takes 
0f80: 69 6e 74 6f 20 61 63 63 6f 75 6e 74 20 73 79 6d  into account sym
0f90: 6c 69 6e 6b 73 2e 0a 2a 2f 0a 69 6e 74 20 66 69  links..*/.int fi
0fa0: 6c 65 5f 77 64 5f 69 73 66 69 6c 65 28 63 6f 6e  le_wd_isfile(con
0fb0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
0fc0: 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 65  me){.  return ge
0fd0: 74 53 74 61 74 28 7a 46 69 6c 65 6e 61 6d 65 2c  tStat(zFilename,
0fe0: 20 31 29 20 3f 20 30 20 3a 20 53 5f 49 53 52 45   1) ? 0 : S_ISRE
0ff0: 47 28 66 69 6c 65 53 74 61 74 2e 73 74 5f 6d 6f  G(fileStat.st_mo
1000: 64 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  de);.}../*.** Cr
1010: 65 61 74 65 20 73 79 6d 6c 69 6e 6b 20 74 6f 20  eate symlink to 
1020: 66 69 6c 65 20 6f 6e 20 55 6e 69 78 2c 20 6f 72  file on Unix, or
1030: 20 70 6c 61 69 6e 2d 74 65 78 74 20 66 69 6c 65   plain-text file
1040: 20 77 69 74 68 0a 2a 2a 20 73 79 6d 6c 69 6e 6b   with.** symlink
1050: 20 74 61 72 67 65 74 20 69 66 20 22 61 6c 6c 6f   target if "allo
1060: 77 2d 73 79 6d 6c 69 6e 6b 73 22 20 69 73 20 6f  w-symlinks" is o
1070: 66 66 20 6f 72 20 77 65 27 72 65 20 6f 6e 20 57  ff or we're on W
1080: 69 6e 64 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20 41 72  indows..**.** Ar
1090: 67 75 6d 65 6e 74 73 3a 20 74 61 72 67 65 74 20  guments: target 
10a0: 66 69 6c 65 20 28 73 79 6d 6c 69 6e 6b 20 77 69  file (symlink wi
10b0: 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 69 74 29 2c  ll point to it),
10c0: 20 6c 69 6e 6b 20 66 69 6c 65 0a 2a 2a 2f 0a 76   link file.**/.v
10d0: 6f 69 64 20 73 79 6d 6c 69 6e 6b 5f 63 72 65 61  oid symlink_crea
10e0: 74 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  te(const char *z
10f0: 54 61 72 67 65 74 46 69 6c 65 2c 20 63 6f 6e 73  TargetFile, cons
1100: 74 20 63 68 61 72 20 2a 7a 4c 69 6e 6b 46 69 6c  t char *zLinkFil
1110: 65 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64  e){.#if !defined
1120: 28 5f 57 49 4e 33 32 29 0a 20 20 69 66 28 20 67  (_WIN32).  if( g
1130: 2e 61 6c 6c 6f 77 53 79 6d 6c 69 6e 6b 73 20 29  .allowSymlinks )
1140: 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 4e 61  {.    int i, nNa
1150: 6d 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e  me;.    char *zN
1160: 61 6d 65 2c 20 7a 42 75 66 5b 31 30 30 30 5d 3b  ame, zBuf[1000];
1170: 0a 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 74  ..    nName = st
1180: 72 6c 65 6e 28 7a 4c 69 6e 6b 46 69 6c 65 29 3b  rlen(zLinkFile);
1190: 0a 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3e 3d  .    if( nName>=
11a0: 73 69 7a 65 6f 66 28 7a 42 75 66 29 20 29 7b 0a  sizeof(zBuf) ){.
11b0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 6d 70        zName = mp
11c0: 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 4c 69 6e  rintf("%s", zLin
11d0: 6b 46 69 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73  kFile);.    }els
11e0: 65 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  e{.      zName =
11f0: 20 7a 42 75 66 3b 0a 20 20 20 20 20 20 6d 65 6d   zBuf;.      mem
1200: 63 70 79 28 7a 4e 61 6d 65 2c 20 7a 4c 69 6e 6b  cpy(zName, zLink
1210: 46 69 6c 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a  File, nName+1);.
1220: 20 20 20 20 7d 0a 20 20 20 20 6e 4e 61 6d 65 20      }.    nName 
1230: 3d 20 66 69 6c 65 5f 73 69 6d 70 6c 69 66 79 5f  = file_simplify_
1240: 6e 61 6d 65 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  name(zName, nNam
1250: 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b  e);.    for(i=1;
1260: 20 69 3c 6e 4e 61 6d 65 3b 20 69 2b 2b 29 7b 0a   i<nName; i++){.
1270: 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b        if( zName[
1280: 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  i]=='/' ){.     
1290: 20 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b     zName[i] = 0;
12a0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66  .          if( f
12b0: 69 6c 65 5f 6d 6b 64 69 72 28 7a 4e 61 6d 65 2c  ile_mkdir(zName,
12c0: 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   1) ){.         
12d0: 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 5f     fossil_fatal_
12e0: 72 65 63 75 72 73 69 76 65 28 22 75 6e 61 62 6c  recursive("unabl
12f0: 65 20 74 6f 20 63 72 65 61 74 65 20 64 69 72 65  e to create dire
1300: 63 74 6f 72 79 20 25 73 22 2c 20 7a 4e 61 6d 65  ctory %s", zName
1310: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
1320: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20  eturn;.         
1330: 20 7d 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65   }.        zName
1340: 5b 69 5d 20 3d 20 27 2f 27 3b 0a 20 20 20 20 20  [i] = '/';.     
1350: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1360: 20 7a 4e 61 6d 65 21 3d 7a 42 75 66 20 29 20 66   zName!=zBuf ) f
1370: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20  ree(zName);..   
1380: 20 69 66 28 20 73 79 6d 6c 69 6e 6b 28 7a 54 61   if( symlink(zTa
1390: 72 67 65 74 46 69 6c 65 2c 20 7a 4e 61 6d 65 29  rgetFile, zName)
13a0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 73  !=0 ){.      fos
13b0: 73 69 6c 5f 66 61 74 61 6c 5f 72 65 63 75 72 73  sil_fatal_recurs
13c0: 69 76 65 28 22 75 6e 61 62 6c 65 20 74 6f 20 63  ive("unable to c
13d0: 72 65 61 74 65 20 73 79 6d 6c 69 6e 6b 20 5c 22  reate symlink \"
13e0: 25 73 5c 22 22 2c 20 7a 4e 61 6d 65 29 3b 20 20  %s\"", zName);  
13f0: 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 65 6c      .    }.  }el
1400: 73 65 0a 23 65 6e 64 69 66 20 0a 20 20 7b 0a 20  se.#endif .  {. 
1410: 20 20 20 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 3b     Blob content;
1420: 0a 20 20 20 20 62 6c 6f 62 5f 73 65 74 28 26 63  .    blob_set(&c
1430: 6f 6e 74 65 6e 74 2c 20 7a 54 61 72 67 65 74 46  ontent, zTargetF
1440: 69 6c 65 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 77  ile);.    blob_w
1450: 72 69 74 65 5f 74 6f 5f 66 69 6c 65 28 26 63 6f  rite_to_file(&co
1460: 6e 74 65 6e 74 2c 20 7a 4c 69 6e 6b 46 69 6c 65  ntent, zLinkFile
1470: 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65  );.    blob_rese
1480: 74 28 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 7d  t(&content);.  }
1490: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 73  .}../*.** Copy s
14a0: 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 66 72 6f  ymbolic link fro
14b0: 6d 20 7a 46 72 6f 6d 20 74 6f 20 7a 54 6f 2e 0a  m zFrom to zTo..
14c0: 2a 2f 0a 76 6f 69 64 20 73 79 6d 6c 69 6e 6b 5f  */.void symlink_
14d0: 63 6f 70 79 28 63 6f 6e 73 74 20 63 68 61 72 20  copy(const char 
14e0: 2a 7a 46 72 6f 6d 2c 20 63 6f 6e 73 74 20 63 68  *zFrom, const ch
14f0: 61 72 20 2a 7a 54 6f 29 7b 0a 20 20 42 6c 6f 62  ar *zTo){.  Blob
1500: 20 63 6f 6e 74 65 6e 74 3b 0a 20 20 62 6c 6f 62   content;.  blob
1510: 5f 72 65 61 64 5f 6c 69 6e 6b 28 26 63 6f 6e 74  _read_link(&cont
1520: 65 6e 74 2c 20 7a 46 72 6f 6d 29 3b 0a 20 20 73  ent, zFrom);.  s
1530: 79 6d 6c 69 6e 6b 5f 63 72 65 61 74 65 28 62 6c  ymlink_create(bl
1540: 6f 62 5f 73 74 72 28 26 63 6f 6e 74 65 6e 74 29  ob_str(&content)
1550: 2c 20 7a 54 6f 29 3b 0a 20 20 62 6c 6f 62 5f 72  , zTo);.  blob_r
1560: 65 73 65 74 28 26 63 6f 6e 74 65 6e 74 29 3b 0a  eset(&content);.
1570: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1580: 66 69 6c 65 20 70 65 72 6d 69 73 73 69 6f 6e 73  file permissions
1590: 20 28 6e 6f 72 6d 61 6c 2c 20 65 78 65 63 75 74   (normal, execut
15a0: 61 62 6c 65 2c 20 6f 72 20 73 79 6d 6c 69 6e 6b  able, or symlink
15b0: 29 3a 0a 2a 2a 20 20 20 2d 20 50 45 52 4d 5f 45  ):.**   - PERM_E
15c0: 58 45 20 69 66 20 66 69 6c 65 20 69 73 20 65 78  XE if file is ex
15d0: 65 63 75 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 2d  ecutable;.**   -
15e0: 20 50 45 52 4d 5f 4c 4e 4b 20 6f 6e 20 55 6e 69   PERM_LNK on Uni
15f0: 78 20 69 66 20 66 69 6c 65 20 69 73 20 73 79 6d  x if file is sym
1600: 6c 69 6e 6b 20 61 6e 64 20 61 6c 6c 6f 77 2d 73  link and allow-s
1610: 79 6d 6c 69 6e 6b 73 20 6f 70 74 69 6f 6e 20 69  ymlinks option i
1620: 73 20 6f 6e 3b 0a 2a 2a 20 20 20 2d 20 50 45 52  s on;.**   - PER
1630: 4d 5f 52 45 47 20 66 6f 72 20 61 6c 6c 20 6f 74  M_REG for all ot
1640: 68 65 72 20 63 61 73 65 73 20 28 72 65 67 75 6c  her cases (regul
1650: 61 72 20 66 69 6c 65 2c 20 64 69 72 65 63 74 6f  ar file, directo
1660: 72 79 2c 20 66 69 66 6f 2c 20 65 74 63 29 2e 0a  ry, fifo, etc)..
1670: 2a 2f 0a 69 6e 74 20 66 69 6c 65 5f 77 64 5f 70  */.int file_wd_p
1680: 65 72 6d 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  erm(const char *
1690: 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 66  zFilename){.  if
16a0: 28 20 67 65 74 53 74 61 74 28 7a 46 69 6c 65 6e  ( getStat(zFilen
16b0: 61 6d 65 2c 20 31 29 20 29 20 72 65 74 75 72 6e  ame, 1) ) return
16c0: 20 50 45 52 4d 5f 52 45 47 3b 0a 23 69 66 20 64   PERM_REG;.#if d
16d0: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 23  efined(_WIN32).#
16e0: 20 20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 44    if defined(__D
16f0: 4d 43 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64  MC__) || defined
1700: 28 5f 4d 53 43 5f 56 45 52 29 0a 23 20 20 20 20  (_MSC_VER).#    
1710: 64 65 66 69 6e 65 20 53 5f 49 58 55 53 52 20 20  define S_IXUSR  
1720: 5f 53 5f 49 45 58 45 43 0a 23 20 20 65 6e 64 69  _S_IEXEC.#  endi
1730: 66 0a 20 20 69 66 28 20 53 5f 49 53 52 45 47 28  f.  if( S_ISREG(
1740: 66 69 6c 65 53 74 61 74 2e 73 74 5f 6d 6f 64 65  fileStat.st_mode
1750: 29 20 26 26 20 28 28 53 5f 49 58 55 53 52 29 26  ) && ((S_IXUSR)&
1760: 66 69 6c 65 53 74 61 74 2e 73 74 5f 6d 6f 64 65  fileStat.st_mode
1770: 29 21 3d 30 20 29 0a 20 20 20 20 72 65 74 75 72  )!=0 ).    retur
1780: 6e 20 50 45 52 4d 5f 45 58 45 3b 0a 20 20 65 6c  n PERM_EXE;.  el
1790: 73 65 0a 20 20 20 20 72 65 74 75 72 6e 20 50 45  se.    return PE
17a0: 52 4d 5f 52 45 47 3b 0a 23 65 6c 73 65 0a 20 20  RM_REG;.#else.  
17b0: 69 66 28 20 53 5f 49 53 52 45 47 28 66 69 6c 65  if( S_ISREG(file
17c0: 53 74 61 74 2e 73 74 5f 6d 6f 64 65 29 20 26 26  Stat.st_mode) &&
17d0: 20 0a 20 20 20 20 20 20 28 28 53 5f 49 58 55 53   .      ((S_IXUS
17e0: 52 7c 53 5f 49 58 47 52 50 7c 53 5f 49 58 4f 54  R|S_IXGRP|S_IXOT
17f0: 48 29 26 66 69 6c 65 53 74 61 74 2e 73 74 5f 6d  H)&fileStat.st_m
1800: 6f 64 65 29 21 3d 30 20 29 0a 20 20 20 20 72 65  ode)!=0 ).    re
1810: 74 75 72 6e 20 50 45 52 4d 5f 45 58 45 3b 0a 20  turn PERM_EXE;. 
1820: 20 65 6c 73 65 20 69 66 28 20 67 2e 61 6c 6c 6f   else if( g.allo
1830: 77 53 79 6d 6c 69 6e 6b 73 20 26 26 20 53 5f 49  wSymlinks && S_I
1840: 53 4c 4e 4b 28 66 69 6c 65 53 74 61 74 2e 73 74  SLNK(fileStat.st
1850: 5f 6d 6f 64 65 29 20 29 0a 20 20 20 20 72 65 74  _mode) ).    ret
1860: 75 72 6e 20 50 45 52 4d 5f 4c 4e 4b 3b 0a 20 20  urn PERM_LNK;.  
1870: 65 6c 73 65 0a 20 20 20 20 72 65 74 75 72 6e 20  else.    return 
1880: 50 45 52 4d 5f 52 45 47 3b 0a 23 65 6e 64 69 66  PERM_REG;.#endif
1890: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
18a0: 20 54 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d   TRUE if the nam
18b0: 65 64 20 66 69 6c 65 20 69 73 20 61 6e 20 65 78  ed file is an ex
18c0: 65 63 75 74 61 62 6c 65 2e 20 20 52 65 74 75 72  ecutable.  Retur
18d0: 6e 20 66 61 6c 73 65 0a 2a 2a 20 66 6f 72 20 64  n false.** for d
18e0: 69 72 65 63 74 6f 72 69 65 73 2c 20 64 65 76 69  irectories, devi
18f0: 63 65 73 2c 20 66 69 66 6f 73 2c 20 73 79 6d 6c  ces, fifos, syml
1900: 69 6e 6b 73 2c 20 65 74 63 2e 0a 2a 2f 0a 69 6e  inks, etc..*/.in
1910: 74 20 66 69 6c 65 5f 77 64 5f 69 73 65 78 65 28  t file_wd_isexe(
1920: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1930: 65 6e 61 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e  ename){.  return
1940: 20 66 69 6c 65 5f 77 64 5f 70 65 72 6d 28 7a 46   file_wd_perm(zF
1950: 69 6c 65 6e 61 6d 65 29 3d 3d 50 45 52 4d 5f 45  ilename)==PERM_E
1960: 58 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  XE;.}../*.** Ret
1970: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
1980: 6e 61 6d 65 64 20 66 69 6c 65 20 69 73 20 61 20  named file is a 
1990: 73 79 6d 6c 69 6e 6b 20 61 6e 64 20 73 79 6d 6c  symlink and syml
19a0: 69 6e 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65 64  inks are allowed
19b0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73  ..** Return fals
19c0: 65 20 66 6f 72 20 61 6c 6c 20 6f 74 68 65 72 20  e for all other 
19d0: 63 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  cases..**.** On 
19e0: 57 69 6e 64 6f 77 73 2c 20 61 6c 77 61 79 73 20  Windows, always 
19f0: 72 65 74 75 72 6e 20 46 61 6c 73 65 2e 0a 2a 2f  return False..*/
1a00: 0a 69 6e 74 20 66 69 6c 65 5f 77 64 5f 69 73 6c  .int file_wd_isl
1a10: 69 6e 6b 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ink(const char *
1a20: 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 72 65  zFilename){.  re
1a30: 74 75 72 6e 20 66 69 6c 65 5f 77 64 5f 70 65 72  turn file_wd_per
1a40: 6d 28 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 50 45  m(zFilename)==PE
1a50: 52 4d 5f 4c 4e 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  RM_LNK;.}../*.**
1a60: 20 52 65 74 75 72 6e 20 31 20 69 66 20 7a 46 69   Return 1 if zFi
1a70: 6c 65 6e 61 6d 65 20 69 73 20 61 20 64 69 72 65  lename is a dire
1a80: 63 74 6f 72 79 2e 20 20 52 65 74 75 72 6e 20 30  ctory.  Return 0
1a90: 20 69 66 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a   if zFilename.**
1aa0: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
1ab0: 20 20 52 65 74 75 72 6e 20 32 20 69 66 20 7a 46    Return 2 if zF
1ac0: 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20 62  ilename exists b
1ad0: 75 74 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 0a  ut is something.
1ae0: 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  ** other than a 
1af0: 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e  directory..*/.in
1b00: 74 20 66 69 6c 65 5f 69 73 64 69 72 28 63 6f 6e  t file_isdir(con
1b10: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1b20: 6d 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  me){.  int rc;..
1b30: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
1b40: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 4e  ){.    char *zFN
1b50: 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 22 2c   = mprintf("%s",
1b60: 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
1b70: 20 66 69 6c 65 5f 73 69 6d 70 6c 69 66 79 5f 6e   file_simplify_n
1b80: 61 6d 65 28 7a 46 4e 2c 20 2d 31 29 3b 0a 20 20  ame(zFN, -1);.  
1b90: 20 20 72 63 20 3d 20 67 65 74 53 74 61 74 28 7a    rc = getStat(z
1ba0: 46 4e 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65  FN, 0);.    free
1bb0: 28 7a 46 4e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  (zFN);.  }else{.
1bc0: 20 20 20 20 72 63 20 3d 20 67 65 74 53 74 61 74      rc = getStat
1bd0: 28 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  (0, 0);.  }.  re
1be0: 74 75 72 6e 20 72 63 20 3f 20 30 20 3a 20 28 53  turn rc ? 0 : (S
1bf0: 5f 49 53 44 49 52 28 66 69 6c 65 53 74 61 74 2e  _ISDIR(fileStat.
1c00: 73 74 5f 6d 6f 64 65 29 20 3f 20 31 20 3a 20 32  st_mode) ? 1 : 2
1c10: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 6d 65  );.}../*.** Same
1c20: 20 61 73 20 66 69 6c 65 5f 69 73 64 69 72 28 29   as file_isdir()
1c30: 2c 20 62 75 74 20 74 61 6b 65 73 20 69 6e 74 6f  , but takes into
1c40: 20 61 63 63 6f 75 6e 74 20 73 79 6d 6c 69 6e 6b   account symlink
1c50: 73 2e 0a 2a 2f 0a 69 6e 74 20 66 69 6c 65 5f 77  s..*/.int file_w
1c60: 64 5f 69 73 64 69 72 28 63 6f 6e 73 74 20 63 68  d_isdir(const ch
1c70: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
1c80: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
1c90: 20 7a 46 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20   zFilename ){.  
1ca0: 20 20 63 68 61 72 20 2a 7a 46 4e 20 3d 20 6d 70    char *zFN = mp
1cb0: 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 46 69 6c  rintf("%s", zFil
1cc0: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 66 69 6c 65  ename);.    file
1cd0: 5f 73 69 6d 70 6c 69 66 79 5f 6e 61 6d 65 28 7a  _simplify_name(z
1ce0: 46 4e 2c 20 2d 31 29 3b 0a 20 20 20 20 72 63 20  FN, -1);.    rc 
1cf0: 3d 20 67 65 74 53 74 61 74 28 7a 46 4e 2c 20 31  = getStat(zFN, 1
1d00: 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 46 4e 29  );.    free(zFN)
1d10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1d20: 63 20 3d 20 67 65 74 53 74 61 74 28 30 2c 20 31  c = getStat(0, 1
1d30: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1d40: 72 63 20 3f 20 30 20 3a 20 28 53 5f 49 53 44 49  rc ? 0 : (S_ISDI
1d50: 52 28 66 69 6c 65 53 74 61 74 2e 73 74 5f 6d 6f  R(fileStat.st_mo
1d60: 64 65 29 20 3f 20 31 20 3a 20 32 29 3b 0a 7d 0a  de) ? 1 : 2);.}.
1d70: 0a 0a 2f 2a 0a 2a 2a 20 57 72 61 70 70 65 72 20  ../*.** Wrapper 
1d80: 61 72 6f 75 6e 64 20 74 68 65 20 61 63 63 65 73  around the acces
1d90: 73 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  s() system call.
1da0: 0a 2a 2f 0a 69 6e 74 20 66 69 6c 65 5f 61 63 63  .*/.int file_acc
1db0: 65 73 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ess(const char *
1dc0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 66  zFilename, int f
1dd0: 6c 61 67 73 29 7b 0a 20 20 63 68 61 72 20 2a 7a  lags){.  char *z
1de0: 4d 62 63 73 20 3d 20 66 6f 73 73 69 6c 5f 75 74  Mbcs = fossil_ut
1df0: 66 38 5f 74 6f 5f 6d 62 63 73 28 7a 46 69 6c 65  f8_to_mbcs(zFile
1e00: 6e 61 6d 65 29 3b 0a 20 20 69 6e 74 20 72 63 20  name);.  int rc 
1e10: 3d 20 61 63 63 65 73 73 28 7a 4d 62 63 73 2c 20  = access(zMbcs, 
1e20: 66 6c 61 67 73 29 3b 0a 20 20 66 6f 73 73 69 6c  flags);.  fossil
1e30: 5f 6d 62 63 73 5f 66 72 65 65 28 7a 4d 62 63 73  _mbcs_free(zMbcs
1e40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1e50: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 6e  }../*.** Find an
1e60: 20 75 6e 75 73 65 64 20 66 69 6c 65 6e 61 6d 65   unused filename
1e70: 20 73 69 6d 69 6c 61 72 20 74 6f 20 7a 42 61 73   similar to zBas
1e80: 65 20 77 69 74 68 20 7a 53 75 66 66 69 78 20 61  e with zSuffix a
1e90: 70 70 65 6e 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 4d  ppended..**.** M
1ea0: 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 72 65 6c  ake the name rel
1eb0: 61 74 69 76 65 20 74 6f 20 74 68 65 20 77 6f 72  ative to the wor
1ec0: 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 69  king directory i
1ed0: 66 20 72 65 6c 46 6c 61 67 20 69 73 20 74 72 75  f relFlag is tru
1ee0: 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  e..**.** Space t
1ef0: 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20 66  o hold the new f
1f00: 69 6c 65 6e 61 6d 65 20 69 73 20 6f 62 74 61 69  ilename is obtai
1f10: 6e 65 64 20 66 6f 72 6d 20 6d 70 72 69 6e 74 66  ned form mprintf
1f20: 28 29 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a  () and should.**
1f30: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
1f40: 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 63 68 61 72   caller..*/.char
1f50: 20 2a 66 69 6c 65 5f 6e 65 77 6e 61 6d 65 28 63   *file_newname(c
1f60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 61 73 65  onst char *zBase
1f70: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
1f80: 75 66 66 69 78 2c 20 69 6e 74 20 72 65 6c 46 6c  uffix, int relFl
1f90: 61 67 29 7b 0a 20 20 63 68 61 72 20 2a 7a 20 3d  ag){.  char *z =
1fa0: 20 30 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20   0;.  int cnt = 
1fb0: 30 3b 0a 20 20 7a 20 3d 20 6d 70 72 69 6e 74 66  0;.  z = mprintf
1fc0: 28 22 25 73 2d 25 73 22 2c 20 7a 42 61 73 65 2c  ("%s-%s", zBase,
1fd0: 20 7a 53 75 66 66 69 78 29 3b 0a 20 20 77 68 69   zSuffix);.  whi
1fe0: 6c 65 28 20 66 69 6c 65 5f 73 69 7a 65 28 7a 29  le( file_size(z)
1ff0: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 73 73 69  >=0 ){.    fossi
2000: 6c 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 7a  l_free(z);.    z
2010: 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 2d 25   = mprintf("%s-%
2020: 73 2d 25 64 22 2c 20 7a 42 61 73 65 2c 20 7a 53  s-%d", zBase, zS
2030: 75 66 66 69 78 2c 20 63 6e 74 2b 2b 29 3b 0a 20  uffix, cnt++);. 
2040: 20 7d 0a 20 20 69 66 28 20 72 65 6c 46 6c 61 67   }.  if( relFlag
2050: 20 29 7b 0a 20 20 20 20 42 6c 6f 62 20 78 3b 0a   ){.    Blob x;.
2060: 20 20 20 20 66 69 6c 65 5f 72 65 6c 61 74 69 76      file_relativ
2070: 65 5f 6e 61 6d 65 28 7a 2c 20 26 78 29 3b 0a 20  e_name(z, &x);. 
2080: 20 20 20 66 6f 73 73 69 6c 5f 66 72 65 65 28 7a     fossil_free(z
2090: 29 3b 0a 20 20 20 20 7a 20 3d 20 62 6c 6f 62 5f  );.    z = blob_
20a0: 73 74 72 28 26 78 29 3b 0a 20 20 7d 0a 20 20 72  str(&x);.  }.  r
20b0: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn z;.}../*.*
20c0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 61 69  * Return the tai
20d0: 6c 20 6f 66 20 61 20 66 69 6c 65 20 70 61 74 68  l of a file path
20e0: 6e 61 6d 65 2e 20 20 54 68 65 20 74 61 69 6c 20  name.  The tail 
20f0: 69 73 20 74 68 65 20 6c 61 73 74 20 63 6f 6d 70  is the last comp
2100: 6f 6e 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20  onent.** of the 
2110: 70 61 74 68 2e 20 20 46 6f 72 20 65 78 61 6d 70  path.  For examp
2120: 6c 65 2c 20 74 68 65 20 74 61 69 6c 20 6f 66 20  le, the tail of 
2130: 22 2f 61 2f 62 2f 63 2e 64 22 20 69 73 20 22 63  "/a/b/c.d" is "c
2140: 2e 64 22 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  .d"..*/.const ch
2150: 61 72 20 2a 66 69 6c 65 5f 74 61 69 6c 28 63 6f  ar *file_tail(co
2160: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
2170: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69  const char *zTai
2180: 6c 20 3d 20 7a 3b 0a 20 20 77 68 69 6c 65 28 20  l = z;.  while( 
2190: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 69 66 28 20  z[0] ){.    if( 
21a0: 7a 5b 30 5d 3d 3d 27 2f 27 20 29 20 7a 54 61 69  z[0]=='/' ) zTai
21b0: 6c 20 3d 20 26 7a 5b 31 5d 3b 0a 20 20 20 20 7a  l = &z[1];.    z
21c0: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
21d0: 20 7a 54 61 69 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zTail;.}../*.**
21e0: 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e   Copy the conten
21f0: 74 20 6f 66 20 61 20 66 69 6c 65 20 66 72 6f 6d  t of a file from
2200: 20 6f 6e 65 20 70 6c 61 63 65 20 74 6f 20 61 6e   one place to an
2210: 6f 74 68 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 66  other..*/.void f
2220: 69 6c 65 5f 63 6f 70 79 28 63 6f 6e 73 74 20 63  ile_copy(const c
2230: 68 61 72 20 2a 7a 46 72 6f 6d 2c 20 63 6f 6e 73  har *zFrom, cons
2240: 74 20 63 68 61 72 20 2a 7a 54 6f 29 7b 0a 20 20  t char *zTo){.  
2250: 46 49 4c 45 20 2a 69 6e 2c 20 2a 6f 75 74 3b 0a  FILE *in, *out;.
2260: 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 63 68 61    int got;.  cha
2270: 72 20 7a 42 75 66 5b 38 31 39 32 5d 3b 0a 20 20  r zBuf[8192];.  
2280: 69 6e 20 3d 20 66 6f 73 73 69 6c 5f 66 6f 70 65  in = fossil_fope
2290: 6e 28 7a 46 72 6f 6d 2c 20 22 72 62 22 29 3b 0a  n(zFrom, "rb");.
22a0: 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 66 6f    if( in==0 ) fo
22b0: 73 73 69 6c 5f 66 61 74 61 6c 28 22 63 61 6e 6e  ssil_fatal("cann
22c0: 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20 66  ot open \"%s\" f
22d0: 6f 72 20 72 65 61 64 69 6e 67 22 2c 20 7a 46 72  or reading", zFr
22e0: 6f 6d 29 3b 0a 20 20 6f 75 74 20 3d 20 66 6f 73  om);.  out = fos
22f0: 73 69 6c 5f 66 6f 70 65 6e 28 7a 54 6f 2c 20 22  sil_fopen(zTo, "
2300: 77 62 22 29 3b 0a 20 20 69 66 28 20 6f 75 74 3d  wb");.  if( out=
2310: 3d 30 20 29 20 66 6f 73 73 69 6c 5f 66 61 74 61  =0 ) fossil_fata
2320: 6c 28 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c  l("cannot open \
2330: 22 25 73 5c 22 20 66 6f 72 20 77 72 69 74 69 6e  "%s\" for writin
2340: 67 22 2c 20 7a 54 6f 29 3b 0a 20 20 77 68 69 6c  g", zTo);.  whil
2350: 65 28 20 28 67 6f 74 3d 66 72 65 61 64 28 7a 42  e( (got=fread(zB
2360: 75 66 2c 20 31 2c 20 73 69 7a 65 6f 66 28 7a 42  uf, 1, sizeof(zB
2370: 75 66 29 2c 20 69 6e 29 29 3e 30 20 29 7b 0a 20  uf), in))>0 ){. 
2380: 20 20 20 66 77 72 69 74 65 28 7a 42 75 66 2c 20     fwrite(zBuf, 
2390: 31 2c 20 67 6f 74 2c 20 6f 75 74 29 3b 0a 20 20  1, got, out);.  
23a0: 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a  }.  fclose(in);.
23b0: 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 7d    fclose(out);.}
23c0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63  ../*.** Set or c
23d0: 6c 65 61 72 20 74 68 65 20 65 78 65 63 75 74 65  lear the execute
23e0: 20 62 69 74 20 6f 6e 20 61 20 66 69 6c 65 2e 20   bit on a file. 
23f0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
2400: 61 20 63 68 61 6e 67 65 0a 2a 2a 20 6f 63 63 75  a change.** occu
2410: 72 72 65 64 20 61 6e 64 20 66 61 6c 73 65 20 69  rred and false i
2420: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
2430: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e  s a no-op..*/.in
2440: 74 20 66 69 6c 65 5f 77 64 5f 73 65 74 65 78 65  t file_wd_setexe
2450: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
2460: 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 6f 6e 6f 66  lename, int onof
2470: 66 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  f){.  int rc = 0
2480: 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f  ;.#if !defined(_
2490: 57 49 4e 33 32 29 0a 20 20 73 74 72 75 63 74 20  WIN32).  struct 
24a0: 73 74 61 74 20 62 75 66 3b 0a 20 20 69 66 28 20  stat buf;.  if( 
24b0: 66 6f 73 73 69 6c 5f 73 74 61 74 28 7a 46 69 6c  fossil_stat(zFil
24c0: 65 6e 61 6d 65 2c 20 26 62 75 66 2c 20 31 29 21  ename, &buf, 1)!
24d0: 3d 30 20 7c 7c 20 53 5f 49 53 4c 4e 4b 28 62 75  =0 || S_ISLNK(bu
24e0: 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 72 65 74  f.st_mode) ) ret
24f0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 6f 6e 6f  urn 0;.  if( ono
2500: 66 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 61  ff ){.    int ta
2510: 72 67 65 74 4d 6f 64 65 20 3d 20 28 62 75 66 2e  rgetMode = (buf.
2520: 73 74 5f 6d 6f 64 65 20 26 20 30 34 34 34 29 3e  st_mode & 0444)>
2530: 3e 32 3b 0a 20 20 20 20 69 66 28 20 28 62 75 66  >2;.    if( (buf
2540: 2e 73 74 5f 6d 6f 64 65 20 26 20 30 31 31 31 29  .st_mode & 0111)
2550: 21 3d 74 61 72 67 65 74 4d 6f 64 65 20 29 7b 0a  !=targetMode ){.
2560: 20 20 20 20 20 20 63 68 6d 6f 64 28 7a 46 69 6c        chmod(zFil
2570: 65 6e 61 6d 65 2c 20 62 75 66 2e 73 74 5f 6d 6f  ename, buf.st_mo
2580: 64 65 20 7c 20 74 61 72 67 65 74 4d 6f 64 65 29  de | targetMode)
2590: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
25a0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
25b0: 20 20 20 69 66 28 20 28 62 75 66 2e 73 74 5f 6d     if( (buf.st_m
25c0: 6f 64 65 20 26 20 30 31 31 31 29 21 3d 30 20 29  ode & 0111)!=0 )
25d0: 7b 0a 20 20 20 20 20 20 63 68 6d 6f 64 28 7a 46  {.      chmod(zF
25e0: 69 6c 65 6e 61 6d 65 2c 20 62 75 66 2e 73 74 5f  ilename, buf.st_
25f0: 6d 6f 64 65 20 26 20 7e 30 31 31 31 29 3b 0a 20  mode & ~0111);. 
2600: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2610: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
2620: 20 5f 57 49 4e 33 32 20 2a 2f 0a 20 20 72 65 74   _WIN32 */.  ret
2630: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2640: 20 44 65 6c 65 74 65 20 61 20 66 69 6c 65 2e 0a   Delete a file..
2650: 2a 2f 0a 76 6f 69 64 20 66 69 6c 65 5f 64 65 6c  */.void file_del
2660: 65 74 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ete(const char *
2670: 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68  zFilename){.  ch
2680: 61 72 20 2a 7a 20 3d 20 66 6f 73 73 69 6c 5f 75  ar *z = fossil_u
2690: 74 66 38 5f 74 6f 5f 6d 62 63 73 28 7a 46 69 6c  tf8_to_mbcs(zFil
26a0: 65 6e 61 6d 65 29 3b 0a 20 20 75 6e 6c 69 6e 6b  ename);.  unlink
26b0: 28 7a 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 6d 62  (z);.  fossil_mb
26c0: 63 73 5f 66 72 65 65 28 7a 29 3b 0a 7d 0a 0a 2f  cs_free(z);.}../
26d0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
26e0: 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 64 20  directory named 
26f0: 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c  in the argument,
2700: 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20   if it does not 
2710: 61 6c 72 65 61 64 79 0a 2a 2a 20 65 78 69 73 74  already.** exist
2720: 2e 20 20 49 66 20 66 6f 72 63 65 46 6c 61 67 20  .  If forceFlag 
2730: 69 73 20 31 2c 20 64 65 6c 65 74 65 20 61 6e 79  is 1, delete any
2740: 20 70 72 69 6f 72 20 6e 6f 6e 2d 64 69 72 65 63   prior non-direc
2750: 74 6f 72 79 20 6f 62 6a 65 63 74 20 0a 2a 2a 20  tory object .** 
2760: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
2770: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  me..**.** Return
2780: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
2790: 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 66 69  rrors..*/.int fi
27a0: 6c 65 5f 6d 6b 64 69 72 28 63 6f 6e 73 74 20 63  le_mkdir(const c
27b0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20  har *zName, int 
27c0: 66 6f 72 63 65 46 6c 61 67 29 7b 0a 20 20 69 6e  forceFlag){.  in
27d0: 74 20 72 63 20 3d 20 66 69 6c 65 5f 69 73 64 69  t rc = file_isdi
27e0: 72 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  r(zName);.  if( 
27f0: 72 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28  rc==2 ){.    if(
2800: 20 21 66 6f 72 63 65 46 6c 61 67 20 29 20 72 65   !forceFlag ) re
2810: 74 75 72 6e 20 31 3b 0a 20 20 20 20 66 69 6c 65  turn 1;.    file
2820: 5f 64 65 6c 65 74 65 28 7a 4e 61 6d 65 29 3b 0a  _delete(zName);.
2830: 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 31 20    }.  if( rc!=1 
2840: 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ){.#if defined(_
2850: 57 49 4e 33 32 29 0a 20 20 20 20 69 6e 74 20 72  WIN32).    int r
2860: 63 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 62  c;.    char *zMb
2870: 63 73 20 3d 20 66 6f 73 73 69 6c 5f 75 74 66 38  cs = fossil_utf8
2880: 5f 74 6f 5f 6d 62 63 73 28 7a 4e 61 6d 65 29 3b  _to_mbcs(zName);
2890: 0a 20 20 20 20 72 63 20 3d 20 6d 6b 64 69 72 28  .    rc = mkdir(
28a0: 7a 4d 62 63 73 29 3b 0a 20 20 20 20 66 6f 73 73  zMbcs);.    foss
28b0: 69 6c 5f 6d 62 63 73 5f 66 72 65 65 28 7a 4d 62  il_mbcs_free(zMb
28c0: 63 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  cs);.    return 
28d0: 72 63 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 65  rc;.#else.    re
28e0: 74 75 72 6e 20 6d 6b 64 69 72 28 7a 4e 61 6d 65  turn mkdir(zName
28f0: 2c 20 30 37 35 35 29 3b 0a 23 65 6e 64 69 66 0a  , 0755);.#endif.
2900: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
2910: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2920: 74 72 75 65 20 69 66 20 74 68 65 20 66 69 6c 65  true if the file
2930: 6e 61 6d 65 20 67 69 76 65 6e 20 69 73 20 61 20  name given is a 
2940: 76 61 6c 69 64 20 66 69 6c 65 6e 61 6d 65 20 66  valid filename f
2950: 6f 72 0a 2a 2a 20 61 20 66 69 6c 65 20 69 6e 20  or.** a file in 
2960: 61 20 72 65 70 6f 73 69 74 6f 72 79 2e 20 20 56  a repository.  V
2970: 61 6c 69 64 20 66 69 6c 65 6e 61 6d 65 73 20 66  alid filenames f
2980: 6f 6c 6c 6f 77 20 61 6c 6c 20 6f 66 20 74 68 65  ollow all of the
2990: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 75  .** following ru
29a0: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  les:.**.**     *
29b0: 20 20 44 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e    Does not begin
29c0: 20 77 69 74 68 20 22 2f 22 0a 2a 2a 20 20 20 20   with "/".**    
29d0: 20 2a 20 20 44 6f 65 73 20 6e 6f 74 20 63 6f 6e   *  Does not con
29e0: 74 61 69 6e 20 61 6e 79 20 70 61 74 68 20 65 6c  tain any path el
29f0: 65 6d 65 6e 74 20 6e 61 6d 65 64 20 22 2e 22 20  ement named "." 
2a00: 6f 72 20 22 2e 2e 22 0a 2a 2a 20 20 20 20 20 2a  or "..".**     *
2a10: 20 20 44 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61    Does not conta
2a20: 69 6e 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20  in any of these 
2a30: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
2a40: 65 20 70 61 74 68 3a 20 22 5c 2a 5b 5d 3f 22 0a  e path: "\*[]?".
2a50: 2a 2a 20 20 20 20 20 2a 20 20 44 6f 65 73 20 6e  **     *  Does n
2a60: 6f 74 20 65 6e 64 20 77 69 74 68 20 22 2f 22 2e  ot end with "/".
2a70: 0a 2a 2a 20 20 20 20 20 2a 20 20 44 6f 65 73 20  .**     *  Does 
2a80: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 74 77 6f 20  not contain two 
2a90: 6f 72 20 6d 6f 72 65 20 22 2f 22 20 63 68 61 72  or more "/" char
2aa0: 61 63 74 65 72 73 20 69 6e 20 61 20 72 6f 77 2e  acters in a row.
2ab0: 0a 2a 2a 20 20 20 20 20 2a 20 20 43 6f 6e 74 61  .**     *  Conta
2ac0: 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ins at least one
2ad0: 20 63 68 61 72 61 63 74 65 72 0a 2a 2f 0a 69 6e   character.*/.in
2ae0: 74 20 66 69 6c 65 5f 69 73 5f 73 69 6d 70 6c 65  t file_is_simple
2af0: 5f 70 61 74 68 6e 61 6d 65 28 63 6f 6e 73 74 20  _pathname(const 
2b00: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
2b10: 69 3b 0a 20 20 63 68 61 72 20 63 20 3d 20 7a 5b  i;.  char c = z[
2b20: 30 5d 3b 0a 20 20 69 66 28 20 63 3d 3d 27 2f 27  0];.  if( c=='/'
2b30: 20 7c 7c 20 63 3d 3d 30 20 29 20 72 65 74 75 72   || c==0 ) retur
2b40: 6e 20 30 3b 0a 20 20 69 66 28 20 63 3d 3d 27 2e  n 0;.  if( c=='.
2b50: 27 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 31  ' ){.    if( z[1
2b60: 5d 3d 3d 27 2f 27 20 7c 7c 20 7a 5b 31 5d 3d 3d  ]=='/' || z[1]==
2b70: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
2b80: 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 27 2e 27 20    if( z[1]=='.' 
2b90: 26 26 20 28 7a 5b 32 5d 3d 3d 27 2f 27 20 7c 7c  && (z[2]=='/' ||
2ba0: 20 7a 5b 32 5d 3d 3d 30 29 20 29 20 72 65 74 75   z[2]==0) ) retu
2bb0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  rn 0;.  }.  for(
2bc0: 69 3d 30 3b 20 28 63 3d 7a 5b 69 5d 29 21 3d 30  i=0; (c=z[i])!=0
2bd0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
2be0: 63 3d 3d 27 5c 5c 27 20 7c 7c 20 63 3d 3d 27 2a  c=='\\' || c=='*
2bf0: 27 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63  ' || c=='[' || c
2c00: 3d 3d 27 5d 27 20 7c 7c 20 63 3d 3d 27 3f 27 20  ==']' || c=='?' 
2c10: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2c20: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
2c30: 20 63 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20   c=='/' ){.     
2c40: 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27   if( z[i+1]=='/'
2c50: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
2c60: 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27     if( z[i+1]=='
2c70: 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  .' ){.        if
2c80: 28 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 7c 7c  ( z[i+2]=='/' ||
2c90: 20 7a 5b 69 2b 32 5d 3d 3d 30 20 29 20 72 65 74   z[i+2]==0 ) ret
2ca0: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 69  urn 0;.        i
2cb0: 66 28 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26  f( z[i+2]=='.' &
2cc0: 26 20 28 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 7c  & (z[i+3]=='/' |
2cd0: 7c 20 7a 5b 69 2b 33 5d 3d 3d 30 29 20 29 20 72  | z[i+3]==0) ) r
2ce0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
2cf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2d00: 20 7a 5b 69 2d 31 5d 3d 3d 27 2f 27 20 29 20 72   z[i-1]=='/' ) r
2d10: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
2d20: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  n 1;.}../*.** If
2d30: 20 74 68 65 20 6c 61 73 74 20 63 6f 6d 70 6f 6e   the last compon
2d40: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 74 68 6e  ent of the pathn
2d50: 61 6d 65 20 69 6e 20 7a 5b 30 5d 2e 2e 7a 5b 6a  ame in z[0]..z[j
2d60: 2d 31 5d 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  -1] is something
2d70: 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 22  .** other than "
2d80: 2e 2e 22 20 74 68 65 6e 20 62 61 63 6b 20 69 74  .." then back it
2d90: 20 6f 75 74 20 61 6e 64 20 72 65 74 75 72 6e 20   out and return 
2da0: 74 72 75 65 2e 20 20 49 66 20 74 68 65 20 6c 61  true.  If the la
2db0: 73 74 0a 2a 2a 20 63 6f 6d 70 6f 6e 65 6e 74 20  st.** component 
2dc0: 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20 69  is empty or if i
2dd0: 74 20 69 73 20 22 2e 2e 22 20 74 68 65 6e 20 72  t is ".." then r
2de0: 65 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a  eturn false..*/.
2df0: 73 74 61 74 69 63 20 69 6e 74 20 62 61 63 6b 75  static int backu
2e00: 70 5f 64 69 72 28 63 6f 6e 73 74 20 63 68 61 72  p_dir(const char
2e10: 20 2a 7a 2c 20 69 6e 74 20 2a 70 4a 29 7b 0a 20   *z, int *pJ){. 
2e20: 20 69 6e 74 20 6a 20 3d 20 2a 70 4a 3b 0a 20 20   int j = *pJ;.  
2e30: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 6a 3c 3d  int i;.  if( j<=
2e40: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
2e50: 66 6f 72 28 69 3d 6a 2d 31 3b 20 69 3e 30 20 26  for(i=j-1; i>0 &
2e60: 26 20 7a 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69  & z[i-1]!='/'; i
2e70: 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 7a 5b 69 5d  --){}.  if( z[i]
2e80: 3d 3d 27 2e 27 20 26 26 20 69 3d 3d 6a 2d 32 20  =='.' && i==j-2 
2e90: 26 26 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 29  && z[i+1]=='.' )
2ea0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 2a 70 4a   return 0;.  *pJ
2eb0: 20 3d 20 69 2d 31 3b 0a 20 20 72 65 74 75 72 6e   = i-1;.  return
2ec0: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d   1;.}../*.** Sim
2ed0: 70 6c 69 66 79 20 61 20 66 69 6c 65 6e 61 6d 65  plify a filename
2ee0: 20 62 79 0a 2a 2a 0a 2a 2a 20 20 2a 20 43 6f 6e   by.**.**  * Con
2ef0: 76 65 72 74 20 61 6c 6c 20 5c 20 69 6e 74 6f 20  vert all \ into 
2f00: 2f 20 6f 6e 20 77 69 6e 64 6f 77 73 0a 2a 2a 20  / on windows.** 
2f10: 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20   * removing any 
2f20: 74 72 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70  trailing and dup
2f30: 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 72  licate /.**  * r
2f40: 65 6d 6f 76 69 6e 67 20 2f 2e 2f 0a 2a 2a 20 20  emoving /./.**  
2f50: 2a 20 72 65 6d 6f 76 69 6e 67 20 2f 41 2f 2e 2e  * removing /A/..
2f60: 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20  /.**.** Changes 
2f70: 61 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61 63  are made in-plac
2f80: 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  e.  Return the n
2f90: 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e 0a  ew name length..
2fa0: 2a 2f 0a 69 6e 74 20 66 69 6c 65 5f 73 69 6d 70  */.int file_simp
2fb0: 6c 69 66 79 5f 6e 61 6d 65 28 63 68 61 72 20 2a  lify_name(char *
2fc0: 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74  z, int n){.  int
2fd0: 20 69 2c 20 6a 3b 0a 20 20 69 66 28 20 6e 3c 30   i, j;.  if( n<0
2fe0: 20 29 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29   ) n = strlen(z)
2ff0: 3b 0a 0a 20 20 2f 2a 20 4f 6e 20 77 69 6e 64 6f  ;..  /* On windo
3000: 77 73 20 63 6f 6e 76 65 72 74 20 61 6c 6c 20 5c  ws convert all \
3010: 20 63 68 61 72 61 63 74 65 72 73 20 74 6f 20 2f   characters to /
3020: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
3030: 5f 57 49 4e 33 32 29 0a 20 20 66 6f 72 28 69 3d  _WIN32).  for(i=
3040: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
3050: 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 5c 27    if( z[i]=='\\'
3060: 20 29 20 7a 5b 69 5d 20 3d 20 27 2f 27 3b 0a 20   ) z[i] = '/';. 
3070: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
3080: 52 65 6d 6f 76 69 6e 67 20 74 72 61 69 6c 69 6e  Removing trailin
3090: 67 20 22 2f 22 20 63 68 61 72 61 63 74 65 72 73  g "/" characters
30a0: 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31   */.  while( n>1
30b0: 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20   && z[n-1]=='/' 
30c0: 29 7b 20 6e 2d 2d 3b 20 7d 0a 0a 20 20 2f 2a 20  ){ n--; }..  /* 
30d0: 52 65 6d 6f 76 65 20 64 75 70 6c 69 63 61 74 65  Remove duplicate
30e0: 20 27 2f 27 20 63 68 61 72 61 63 74 65 72 73 2e   '/' characters.
30f0: 20 20 45 78 63 65 70 74 2c 20 74 77 6f 20 2f 2f    Except, two //
3100: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
3110: 67 0a 20 20 2a 2a 20 6f 66 20 61 20 70 61 74 68  g.  ** of a path
3120: 6e 61 6d 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  name is allowed 
3130: 73 69 6e 63 65 20 74 68 69 73 20 69 73 20 69 6d  since this is im
3140: 70 6f 72 74 61 6e 74 20 6f 6e 20 77 69 6e 64 6f  portant on windo
3150: 77 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6a  ws. */.  for(i=j
3160: 3d 31 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =1; i<n; i++){. 
3170: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d     z[j++] = z[i]
3180: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 69  ;.    while( z[i
3190: 5d 3d 3d 27 2f 27 20 26 26 20 69 3c 6e 2d 31 20  ]=='/' && i<n-1 
31a0: 26 26 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29  && z[i+1]=='/' )
31b0: 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20   i++;.  }.  n = 
31c0: 6a 3b 0a 0a 20 20 2f 2a 20 53 6b 69 70 20 6f 76  j;..  /* Skip ov
31d0: 65 72 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  er zero or more 
31e0: 69 6e 69 74 69 61 6c 20 22 2e 2f 22 20 73 65 71  initial "./" seq
31f0: 75 65 6e 63 65 73 20 2a 2f 0a 20 20 66 6f 72 28  uences */.  for(
3200: 69 3d 30 3b 20 69 3c 6e 2d 31 20 26 26 20 7a 5b  i=0; i<n-1 && z[
3210: 69 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 31  i]=='.' && z[i+1
3220: 5d 3d 3d 27 2f 27 3b 20 69 2b 3d 32 29 7b 7d 0a  ]=='/'; i+=2){}.
3230: 0a 20 20 2f 2a 20 42 65 67 69 6e 20 63 6f 70 79  .  /* Begin copy
3240: 69 6e 67 20 66 72 6f 6d 20 7a 5b 69 5d 20 62 61  ing from z[i] ba
3250: 63 6b 20 74 6f 20 7a 5b 6a 5d 2e 2e 2e 20 2a 2f  ck to z[j]... */
3260: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3c 6e 3b  .  for(j=0; i<n;
3270: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
3280: 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [i]=='/' ){.    
3290: 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 69    /* Skip over i
32a0: 6e 74 65 72 6e 61 6c 20 22 2f 2e 22 20 64 69 72  nternal "/." dir
32b0: 65 63 74 6f 72 79 20 63 6f 6d 70 6f 6e 65 6e 74  ectory component
32c0: 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a  s */.      if( z
32d0: 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 28 69  [i+1]=='.' && (i
32e0: 2b 32 3d 3d 6e 20 7c 7c 20 7a 5b 69 2b 32 5d 3d  +2==n || z[i+2]=
32f0: 3d 27 2f 27 29 20 29 7b 0a 20 20 20 20 20 20 20  ='/') ){.       
3300: 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20   i += 1;.       
3310: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
3320: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
3330: 74 68 69 73 20 69 73 20 61 20 22 2f 2e 2e 22 20  this is a "/.." 
3340: 64 69 72 65 63 74 6f 72 79 20 63 6f 6d 70 6f 6e  directory compon
3350: 65 6e 74 20 74 68 65 6e 20 62 61 63 6b 20 6f 75  ent then back ou
3360: 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70  t the.      ** p
3370: 72 65 76 69 6f 75 73 20 74 65 72 6d 20 6f 66 20  revious term of 
3380: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 66  the directory if
3390: 20 69 74 20 69 73 20 73 6f 6d 65 74 68 69 6e 67   it is something
33a0: 20 6f 74 68 65 72 20 74 68 61 6e 20 22 2e 2e 22   other than ".."
33b0: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 22 2e 22  .      ** or "."
33c0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
33d0: 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20  if( z[i+1]=='.' 
33e0: 26 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b  && i+2<n && z[i+
33f0: 32 5d 3d 3d 27 2e 27 20 26 26 20 28 69 2b 33 3d  2]=='.' && (i+3=
3400: 3d 6e 20 7c 7c 20 7a 5b 69 2b 33 5d 3d 3d 27 2f  =n || z[i+3]=='/
3410: 27 29 0a 20 20 20 20 20 20 20 26 26 20 62 61 63  ').       && bac
3420: 6b 75 70 5f 64 69 72 28 7a 2c 20 26 6a 29 0a 20  kup_dir(z, &j). 
3430: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
3440: 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  i += 2;.        
3450: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
3460: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
3470: 6a 3e 3d 30 20 29 20 7a 5b 6a 5d 20 3d 20 7a 5b  j>=0 ) z[j] = z[
3480: 69 5d 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d  i];.    j++;.  }
3490: 0a 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 7a 5b  .  if( j==0 ) z[
34a0: 6a 2b 2b 5d 20 3d 20 27 2e 27 3b 0a 20 20 7a 5b  j++] = '.';.  z[
34b0: 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  j] = 0;.  return
34c0: 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d   j;.}../*.** COM
34d0: 4d 41 4e 44 3a 20 74 65 73 74 2d 73 69 6d 70 6c  MAND: test-simpl
34e0: 69 66 79 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 25  ify-name.**.** %
34f0: 66 6f 73 73 69 6c 20 74 65 73 74 2d 73 69 6d 70  fossil test-simp
3500: 6c 69 66 79 2d 6e 61 6d 65 20 46 49 4c 45 4e 41  lify-name FILENA
3510: 4d 45 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 50 72 69 6e  ME....**.** Prin
3520: 74 20 74 68 65 20 73 69 6d 70 6c 69 66 69 65 64  t the simplified
3530: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 65 61 63   versions of eac
3540: 68 20 46 49 4c 45 4e 41 4d 45 2e 0a 2a 2f 0a 76  h FILENAME..*/.v
3550: 6f 69 64 20 63 6d 64 5f 74 65 73 74 5f 73 69 6d  oid cmd_test_sim
3560: 70 6c 69 66 79 5f 6e 61 6d 65 28 76 6f 69 64 29  plify_name(void)
3570: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  {.  int i;.  cha
3580: 72 20 2a 7a 3b 0a 20 20 66 6f 72 28 69 3d 32 3b  r *z;.  for(i=2;
3590: 20 69 3c 67 2e 61 72 67 63 3b 20 69 2b 2b 29 7b   i<g.argc; i++){
35a0: 0a 20 20 20 20 7a 20 3d 20 6d 70 72 69 6e 74 66  .    z = mprintf
35b0: 28 22 25 73 22 2c 20 67 2e 61 72 67 76 5b 69 5d  ("%s", g.argv[i]
35c0: 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 72  );.    fossil_pr
35d0: 69 6e 74 28 22 5b 25 73 5d 20 2d 3e 20 22 2c 20  int("[%s] -> ", 
35e0: 7a 29 3b 0a 20 20 20 20 66 69 6c 65 5f 73 69 6d  z);.    file_sim
35f0: 70 6c 69 66 79 5f 6e 61 6d 65 28 7a 2c 20 2d 31  plify_name(z, -1
3600: 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 72  );.    fossil_pr
3610: 69 6e 74 28 22 5b 25 73 5d 5c 6e 22 2c 20 7a 29  int("[%s]\n", z)
3620: 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 72 65  ;.    fossil_fre
3630: 65 28 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(z);.  }.}../*.
3640: 2a 2a 20 47 65 74 20 74 68 65 20 63 75 72 72 65  ** Get the curre
3650: 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63  nt working direc
3660: 74 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 77  tory..**.** On w
3670: 69 6e 64 6f 77 73 2c 20 74 68 65 20 6e 61 6d 65  indows, the name
3680: 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 66 72   is converted fr
3690: 6f 6d 20 4d 42 43 53 20 74 6f 20 55 54 46 38 20  om MBCS to UTF8 
36a0: 61 6e 64 20 61 6c 6c 20 27 5c 5c 27 0a 2a 2a 20  and all '\\'.** 
36b0: 63 68 61 72 61 63 74 65 72 73 20 61 72 65 20 63  characters are c
36c0: 6f 6e 76 65 72 74 65 64 20 74 6f 20 27 2f 27 2e  onverted to '/'.
36d0: 20 20 4e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73    No conversions
36e0: 20 61 72 65 20 6e 65 65 64 65 64 20 6f 6e 0a 2a   are needed on.*
36f0: 2a 20 75 6e 69 78 2e 0a 2a 2f 0a 76 6f 69 64 20  * unix..*/.void 
3700: 66 69 6c 65 5f 67 65 74 63 77 64 28 63 68 61 72  file_getcwd(char
3710: 20 2a 7a 42 75 66 2c 20 69 6e 74 20 6e 42 75 66   *zBuf, int nBuf
3720: 29 7b 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32  ){.#ifdef _WIN32
3730: 0a 20 20 63 68 61 72 20 2a 7a 50 77 64 55 74 66  .  char *zPwdUtf
3740: 38 3b 0a 20 20 69 6e 74 20 6e 50 77 64 3b 0a 20  8;.  int nPwd;. 
3750: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 7a   int i;.  char z
3760: 50 77 64 5b 32 30 30 30 5d 3b 0a 20 20 69 66 28  Pwd[2000];.  if(
3770: 20 67 65 74 63 77 64 28 7a 50 77 64 2c 20 73 69   getcwd(zPwd, si
3780: 7a 65 6f 66 28 7a 50 77 64 29 2d 31 29 3d 3d 30  zeof(zPwd)-1)==0
3790: 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66   ){.    fossil_f
37a0: 61 74 61 6c 28 22 63 61 6e 6e 6f 74 20 66 69 6e  atal("cannot fin
37b0: 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 77 6f  d the current wo
37c0: 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 2e  rking directory.
37d0: 22 29 3b 0a 20 20 7d 0a 20 20 7a 50 77 64 55 74  ");.  }.  zPwdUt
37e0: 66 38 20 3d 20 66 6f 73 73 69 6c 5f 6d 62 63 73  f8 = fossil_mbcs
37f0: 5f 74 6f 5f 75 74 66 38 28 7a 50 77 64 29 3b 0a  _to_utf8(zPwd);.
3800: 20 20 6e 50 77 64 20 3d 20 73 74 72 6c 65 6e 28    nPwd = strlen(
3810: 7a 50 77 64 55 74 66 38 29 3b 0a 20 20 69 66 28  zPwdUtf8);.  if(
3820: 20 6e 50 77 64 20 3e 20 6e 42 75 66 2d 31 20 29   nPwd > nBuf-1 )
3830: 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74  {.    fossil_fat
3840: 61 6c 28 22 70 77 64 20 74 6f 6f 20 62 69 67 3a  al("pwd too big:
3850: 20 6d 61 78 20 25 64 5c 6e 22 2c 20 6e 42 75 66   max %d\n", nBuf
3860: 2d 31 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  -1);.  }.  for(i
3870: 3d 30 3b 20 7a 50 77 64 55 74 66 38 5b 69 5d 3b  =0; zPwdUtf8[i];
3880: 20 69 2b 2b 29 20 69 66 28 20 7a 50 77 64 55 74   i++) if( zPwdUt
3890: 66 38 5b 69 5d 3d 3d 27 5c 5c 27 20 29 20 7a 50  f8[i]=='\\' ) zP
38a0: 77 64 55 74 66 38 5b 69 5d 20 3d 20 27 2f 27 3b  wdUtf8[i] = '/';
38b0: 0a 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20  .  memcpy(zBuf, 
38c0: 7a 50 77 64 55 74 66 38 2c 20 6e 50 77 64 2b 31  zPwdUtf8, nPwd+1
38d0: 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 6d 62 63 73  );.  fossil_mbcs
38e0: 5f 66 72 65 65 28 7a 50 77 64 55 74 66 38 29 3b  _free(zPwdUtf8);
38f0: 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 67 65 74  .#else.  if( get
3900: 63 77 64 28 7a 42 75 66 2c 20 6e 42 75 66 2d 31  cwd(zBuf, nBuf-1
3910: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
3920: 65 72 72 6e 6f 3d 3d 45 52 41 4e 47 45 20 29 7b  errno==ERANGE ){
3930: 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 61  .      fossil_fa
3940: 74 61 6c 28 22 70 77 64 20 74 6f 6f 20 62 69 67  tal("pwd too big
3950: 3a 20 6d 61 78 20 25 64 5c 6e 22 2c 20 6e 42 75  : max %d\n", nBu
3960: 66 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  f-1);.    }else{
3970: 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 61  .      fossil_fa
3980: 74 61 6c 28 22 63 61 6e 6e 6f 74 20 66 69 6e 64  tal("cannot find
3990: 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67   current working
39a0: 20 64 69 72 65 63 74 6f 72 79 3b 20 25 73 22 2c   directory; %s",
39b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
39c0: 20 20 20 20 73 74 72 65 72 72 6f 72 28 65 72 72      strerror(err
39d0: 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  no));.    }.  }.
39e0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
39f0: 43 6f 6d 70 75 74 65 20 61 20 63 61 6e 6f 6e 69  Compute a canoni
3a00: 63 61 6c 20 70 61 74 68 6e 61 6d 65 20 66 6f 72  cal pathname for
3a10: 20 61 20 66 69 6c 65 20 6f 72 20 64 69 72 65 63   a file or direc
3a20: 74 6f 72 79 2e 0a 2a 2a 20 4d 61 6b 65 20 74 68  tory..** Make th
3a30: 65 20 6e 61 6d 65 20 61 62 73 6f 6c 75 74 65 20  e name absolute 
3a40: 69 66 20 69 74 20 69 73 20 72 65 6c 61 74 69 76  if it is relativ
3a50: 65 2e 0a 2a 2a 20 52 65 6d 6f 76 65 20 72 65 64  e..** Remove red
3a60: 75 6e 64 61 6e 74 20 2f 20 63 68 61 72 61 63 74  undant / charact
3a70: 65 72 73 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c  ers.** Remove al
3a80: 6c 20 2f 2e 2f 20 70 61 74 68 20 65 6c 65 6d 65  l /./ path eleme
3a90: 6e 74 73 2e 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  nts..** Convert 
3aa0: 2f 41 2f 2e 2e 2f 20 74 6f 20 6a 75 73 74 20 2f  /A/../ to just /
3ab0: 0a 2a 2f 0a 76 6f 69 64 20 66 69 6c 65 5f 63 61  .*/.void file_ca
3ac0: 6e 6f 6e 69 63 61 6c 5f 6e 61 6d 65 28 63 6f 6e  nonical_name(con
3ad0: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 4e 61  st char *zOrigNa
3ae0: 6d 65 2c 20 42 6c 6f 62 20 2a 70 4f 75 74 29 7b  me, Blob *pOut){
3af0: 0a 20 20 69 66 28 20 7a 4f 72 69 67 4e 61 6d 65  .  if( zOrigName
3b00: 5b 30 5d 3d 3d 27 2f 27 20 0a 23 69 66 20 64 65  [0]=='/' .#if de
3b10: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20 20  fined(_WIN32).  
3b20: 20 20 20 20 7c 7c 20 7a 4f 72 69 67 4e 61 6d 65      || zOrigName
3b30: 5b 30 5d 3d 3d 27 5c 5c 27 0a 20 20 20 20 20 20  [0]=='\\'.      
3b40: 7c 7c 20 28 73 74 72 6c 65 6e 28 7a 4f 72 69 67  || (strlen(zOrig
3b50: 4e 61 6d 65 29 3e 33 20 26 26 20 7a 4f 72 69 67  Name)>3 && zOrig
3b60: 4e 61 6d 65 5b 31 5d 3d 3d 27 3a 27 0a 20 20 20  Name[1]==':'.   
3b70: 20 20 20 20 20 20 20 20 26 26 20 28 7a 4f 72 69          && (zOri
3b80: 67 4e 61 6d 65 5b 32 5d 3d 3d 27 5c 5c 27 20 7c  gName[2]=='\\' |
3b90: 7c 20 7a 4f 72 69 67 4e 61 6d 65 5b 32 5d 3d 3d  | zOrigName[2]==
3ba0: 27 2f 27 29 29 0a 23 65 6e 64 69 66 0a 20 20 29  '/')).#endif.  )
3bb0: 7b 0a 20 20 20 20 62 6c 6f 62 5f 73 65 74 28 70  {.    blob_set(p
3bc0: 4f 75 74 2c 20 7a 4f 72 69 67 4e 61 6d 65 29 3b  Out, zOrigName);
3bd0: 0a 20 20 20 20 62 6c 6f 62 5f 6d 61 74 65 72 69  .    blob_materi
3be0: 61 6c 69 7a 65 28 70 4f 75 74 29 3b 0a 20 20 7d  alize(pOut);.  }
3bf0: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a  else{.    char z
3c00: 50 77 64 5b 32 30 30 30 5d 3b 0a 20 20 20 20 66  Pwd[2000];.    f
3c10: 69 6c 65 5f 67 65 74 63 77 64 28 7a 50 77 64 2c  ile_getcwd(zPwd,
3c20: 20 73 69 7a 65 6f 66 28 7a 50 77 64 29 2d 73 74   sizeof(zPwd)-st
3c30: 72 6c 65 6e 28 7a 4f 72 69 67 4e 61 6d 65 29 29  rlen(zOrigName))
3c40: 3b 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28  ;.    blob_zero(
3c50: 70 4f 75 74 29 3b 0a 20 20 20 20 62 6c 6f 62 5f  pOut);.    blob_
3c60: 61 70 70 65 6e 64 66 28 70 4f 75 74 2c 20 22 25  appendf(pOut, "%
3c70: 2f 2f 25 2f 22 2c 20 7a 50 77 64 2c 20 7a 4f 72  //%/", zPwd, zOr
3c80: 69 67 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 62  igName);.  }.  b
3c90: 6c 6f 62 5f 72 65 73 69 7a 65 28 70 4f 75 74 2c  lob_resize(pOut,
3ca0: 20 66 69 6c 65 5f 73 69 6d 70 6c 69 66 79 5f 6e   file_simplify_n
3cb0: 61 6d 65 28 62 6c 6f 62 5f 62 75 66 66 65 72 28  ame(blob_buffer(
3cc0: 70 4f 75 74 29 2c 20 62 6c 6f 62 5f 73 69 7a 65  pOut), blob_size
3cd0: 28 70 4f 75 74 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a  (pOut)));.}../*.
3ce0: 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 20 74 65 73  ** COMMAND:  tes
3cf0: 74 2d 63 61 6e 6f 6e 69 63 61 6c 2d 6e 61 6d 65  t-canonical-name
3d00: 0a 2a 2a 20 55 73 61 67 65 3a 20 25 66 6f 73 73  .** Usage: %foss
3d10: 69 6c 20 74 65 73 74 2d 63 61 6e 6f 6e 69 63 61  il test-canonica
3d20: 6c 2d 6e 61 6d 65 20 46 49 4c 45 4e 41 4d 45 2e  l-name FILENAME.
3d30: 2e 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68  ...**.** Test th
3d40: 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74  e operation of t
3d50: 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d  he canonical nam
3d60: 65 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2a 20  e generator..** 
3d70: 41 6c 73 6f 20 74 65 73 74 20 46 6f 73 73 69 6c  Also test Fossil
3d80: 27 73 20 61 62 69 6c 69 74 79 20 74 6f 20 6d 65  's ability to me
3d90: 61 73 75 72 65 20 61 74 74 72 69 62 75 74 65 73  asure attributes
3da0: 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 76   of a file..*/.v
3db0: 6f 69 64 20 63 6d 64 5f 74 65 73 74 5f 63 61 6e  oid cmd_test_can
3dc0: 6f 6e 69 63 61 6c 5f 6e 61 6d 65 28 76 6f 69 64  onical_name(void
3dd0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 6c  ){.  int i;.  Bl
3de0: 6f 62 20 78 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72  ob x;.  blob_zer
3df0: 6f 28 26 78 29 3b 0a 20 20 66 6f 72 28 69 3d 32  o(&x);.  for(i=2
3e00: 3b 20 69 3c 67 2e 61 72 67 63 3b 20 69 2b 2b 29  ; i<g.argc; i++)
3e10: 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b  {.    char zBuf[
3e20: 31 30 30 5d 3b 0a 20 20 20 20 63 6f 6e 73 74 20  100];.    const 
3e30: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 67 2e  char *zName = g.
3e40: 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 66 69 6c  argv[i];.    fil
3e50: 65 5f 63 61 6e 6f 6e 69 63 61 6c 5f 6e 61 6d 65  e_canonical_name
3e60: 28 7a 4e 61 6d 65 2c 20 26 78 29 3b 0a 20 20 20  (zName, &x);.   
3e70: 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 5b   fossil_print("[
3e80: 25 73 5d 20 2d 3e 20 5b 25 73 5d 5c 6e 22 2c 20  %s] -> [%s]\n", 
3e90: 7a 4e 61 6d 65 2c 20 62 6c 6f 62 5f 62 75 66 66  zName, blob_buff
3ea0: 65 72 28 26 78 29 29 3b 0a 20 20 20 20 62 6c 6f  er(&x));.    blo
3eb0: 62 5f 72 65 73 65 74 28 26 78 29 3b 0a 20 20 20  b_reset(&x);.   
3ec0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
3ed0: 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  f(sizeof(zBuf), 
3ee0: 7a 42 75 66 2c 20 22 25 6c 6c 64 22 2c 20 66 69  zBuf, "%lld", fi
3ef0: 6c 65 5f 77 64 5f 73 69 7a 65 28 7a 4e 61 6d 65  le_wd_size(zName
3f00: 29 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70  ));.    fossil_p
3f10: 72 69 6e 74 28 22 20 20 66 69 6c 65 5f 73 69 7a  rint("  file_siz
3f20: 65 20 20 20 3d 20 25 73 5c 6e 22 2c 20 7a 42 75  e   = %s\n", zBu
3f30: 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  f);.    sqlite3_
3f40: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
3f50: 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 6c  zBuf), zBuf, "%l
3f60: 6c 64 22 2c 20 66 69 6c 65 5f 77 64 5f 6d 74 69  ld", file_wd_mti
3f70: 6d 65 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  me(zName));.    
3f80: 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 20 20  fossil_print("  
3f90: 66 69 6c 65 5f 6d 74 69 6d 65 20 20 3d 20 25 73  file_mtime  = %s
3fa0: 5c 6e 22 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20  \n", zBuf);.    
3fb0: 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 20 20  fossil_print("  
3fc0: 66 69 6c 65 5f 69 73 66 69 6c 65 20 3d 20 25 64  file_isfile = %d
3fd0: 5c 6e 22 2c 20 66 69 6c 65 5f 77 64 5f 69 73 66  \n", file_wd_isf
3fe0: 69 6c 65 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ile(zName));.   
3ff0: 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 20   fossil_print(" 
4000: 20 66 69 6c 65 5f 69 73 66 69 6c 65 5f 6f 72 5f   file_isfile_or_
4010: 6c 69 6e 6b 20 3d 20 25 64 5c 6e 22 2c 66 69 6c  link = %d\n",fil
4020: 65 5f 77 64 5f 69 73 66 69 6c 65 5f 6f 72 5f 6c  e_wd_isfile_or_l
4030: 69 6e 6b 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ink(zName));.   
4040: 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 20   fossil_print(" 
4050: 20 66 69 6c 65 5f 69 73 6c 69 6e 6b 20 3d 20 25   file_islink = %
4060: 64 5c 6e 22 2c 20 66 69 6c 65 5f 77 64 5f 69 73  d\n", file_wd_is
4070: 6c 69 6e 6b 28 7a 4e 61 6d 65 29 29 3b 0a 20 20  link(zName));.  
4080: 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22    fossil_print("
4090: 20 20 66 69 6c 65 5f 69 73 65 78 65 20 20 3d 20    file_isexe  = 
40a0: 25 64 5c 6e 22 2c 20 66 69 6c 65 5f 77 64 5f 69  %d\n", file_wd_i
40b0: 73 65 78 65 28 7a 4e 61 6d 65 29 29 3b 0a 20 20  sexe(zName));.  
40c0: 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22    fossil_print("
40d0: 20 20 66 69 6c 65 5f 69 73 64 69 72 20 20 3d 20    file_isdir  = 
40e0: 25 64 5c 6e 22 2c 20 66 69 6c 65 5f 77 64 5f 69  %d\n", file_wd_i
40f0: 73 64 69 72 28 7a 4e 61 6d 65 29 29 3b 0a 20 20  sdir(zName));.  
4100: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
4110: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
4120: 76 65 6e 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  ven filename is 
4130: 63 61 6e 6f 6e 69 63 61 6c 2e 0a 2a 2a 0a 2a 2a  canonical..**.**
4140: 20 43 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 73   Canonical names
4150: 20 61 72 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   are full pathna
4160: 6d 65 73 20 75 73 69 6e 67 20 22 2f 22 20 6e 6f  mes using "/" no
4170: 74 20 22 5c 22 20 61 6e 64 20 77 68 69 63 68 0a  t "\" and which.
4180: 2a 2a 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 22 2f  ** contain no "/
4190: 2e 2f 22 20 6f 72 20 22 2f 2e 2e 2f 22 20 74 65  ./" or "/../" te
41a0: 72 6d 73 2e 0a 2a 2f 0a 69 6e 74 20 66 69 6c 65  rms..*/.int file
41b0: 5f 69 73 5f 63 61 6e 6f 6e 69 63 61 6c 28 63 6f  _is_canonical(co
41c0: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
41d0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 5b 30  int i;.  if( z[0
41e0: 5d 21 3d 27 2f 27 0a 23 69 66 20 64 65 66 69 6e  ]!='/'.#if defin
41f0: 65 64 28 5f 57 49 4e 33 32 29 0a 20 20 20 20 26  ed(_WIN32).    &
4200: 26 20 28 7a 5b 30 5d 3d 3d 30 20 7c 7c 20 7a 5b  & (z[0]==0 || z[
4210: 31 5d 21 3d 27 3a 27 20 7c 7c 20 7a 5b 32 5d 21  1]!=':' || z[2]!
4220: 3d 27 2f 27 29 0a 23 65 6e 64 69 66 0a 20 20 29  ='/').#endif.  )
4230: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 66 6f   return 0;..  fo
4240: 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(i=0; z[i]; i++
4250: 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d  ){.    if( z[i]=
4260: 3d 27 5c 5c 27 20 29 20 72 65 74 75 72 6e 20 30  ='\\' ) return 0
4270: 3b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d  ;.    if( z[i]==
4280: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28  '/' ){.      if(
4290: 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 29 7b 0a   z[i+1]=='.' ){.
42a0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b          if( z[i+
42b0: 32 5d 3d 3d 27 2f 27 20 7c 7c 20 7a 5b 69 2b 32  2]=='/' || z[i+2
42c0: 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  ]==0 ) return 0;
42d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69  .        if( z[i
42e0: 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 28 7a 5b 69  +2]=='.' && (z[i
42f0: 2b 33 5d 3d 3d 27 2f 27 20 7c 7c 20 7a 5b 69 2b  +3]=='/' || z[i+
4300: 33 5d 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  3]==0) ) return 
4310: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
4320: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
4330: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 74 75 72  .}../* .** Retur
4340: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
4350: 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74  he first charact
4360: 65 72 20 69 6e 20 61 20 70 61 74 68 6e 61 6d 65  er in a pathname
4370: 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 64 72 69   past the.** dri
4380: 76 65 20 6c 65 74 74 65 72 2e 20 20 54 68 69 73  ve letter.  This
4390: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
43a0: 2d 6f 70 20 6f 6e 20 75 6e 69 78 2e 0a 2a 2f 0a  -op on unix..*/.
43b0: 63 68 61 72 20 2a 66 69 6c 65 5f 77 69 74 68 6f  char *file_witho
43c0: 75 74 5f 64 72 69 76 65 5f 6c 65 74 74 65 72 28  ut_drive_letter(
43d0: 63 68 61 72 20 2a 7a 49 6e 29 7b 0a 23 69 66 64  char *zIn){.#ifd
43e0: 65 66 20 5f 57 49 4e 33 32 0a 20 20 69 66 28 20  ef _WIN32.  if( 
43f0: 66 6f 73 73 69 6c 5f 69 73 61 6c 70 68 61 28 7a  fossil_isalpha(z
4400: 49 6e 5b 30 5d 29 20 26 26 20 7a 49 6e 5b 31 5d  In[0]) && zIn[1]
4410: 3d 3d 27 3a 27 20 29 20 7a 49 6e 20 2b 3d 20 32  ==':' ) zIn += 2
4420: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
4430: 6e 20 7a 49 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n zIn;.}../*.** 
4440: 43 6f 6d 70 75 74 65 20 61 20 70 61 74 68 6e 61  Compute a pathna
4450: 6d 65 20 66 6f 72 20 61 20 66 69 6c 65 20 6f 72  me for a file or
4460: 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
4470: 69 73 20 72 65 6c 61 74 69 76 65 0a 2a 2a 20 74  is relative.** t
4480: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 69  o the current di
4490: 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64  rectory..*/.void
44a0: 20 66 69 6c 65 5f 72 65 6c 61 74 69 76 65 5f 6e   file_relative_n
44b0: 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ame(const char *
44c0: 7a 4f 72 69 67 4e 61 6d 65 2c 20 42 6c 6f 62 20  zOrigName, Blob 
44d0: 2a 70 4f 75 74 29 7b 0a 20 20 63 68 61 72 20 2a  *pOut){.  char *
44e0: 7a 50 61 74 68 3b 0a 20 20 62 6c 6f 62 5f 73 65  zPath;.  blob_se
44f0: 74 28 70 4f 75 74 2c 20 7a 4f 72 69 67 4e 61 6d  t(pOut, zOrigNam
4500: 65 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 69 7a  e);.  blob_resiz
4510: 65 28 70 4f 75 74 2c 20 66 69 6c 65 5f 73 69 6d  e(pOut, file_sim
4520: 70 6c 69 66 79 5f 6e 61 6d 65 28 62 6c 6f 62 5f  plify_name(blob_
4530: 62 75 66 66 65 72 28 70 4f 75 74 29 2c 20 62 6c  buffer(pOut), bl
4540: 6f 62 5f 73 69 7a 65 28 70 4f 75 74 29 29 29 3b  ob_size(pOut)));
4550: 20 0a 20 20 7a 50 61 74 68 20 3d 20 66 69 6c 65   .  zPath = file
4560: 5f 77 69 74 68 6f 75 74 5f 64 72 69 76 65 5f 6c  _without_drive_l
4570: 65 74 74 65 72 28 62 6c 6f 62 5f 62 75 66 66 65  etter(blob_buffe
4580: 72 28 70 4f 75 74 29 29 3b 0a 20 20 69 66 28 20  r(pOut));.  if( 
4590: 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b  zPath[0]=='/' ){
45a0: 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  .    int i, j;. 
45b0: 20 20 20 42 6c 6f 62 20 74 6d 70 3b 0a 20 20 20     Blob tmp;.   
45c0: 20 63 68 61 72 20 2a 7a 50 77 64 3b 0a 20 20 20   char *zPwd;.   
45d0: 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 30 5d   char zBuf[2000]
45e0: 3b 0a 20 20 20 20 7a 50 77 64 20 3d 20 7a 42 75  ;.    zPwd = zBu
45f0: 66 3b 0a 20 20 20 20 66 69 6c 65 5f 67 65 74 63  f;.    file_getc
4600: 77 64 28 7a 42 75 66 2c 20 73 69 7a 65 6f 66 28  wd(zBuf, sizeof(
4610: 7a 42 75 66 29 2d 32 30 29 3b 0a 20 20 20 20 7a  zBuf)-20);.    z
4620: 50 77 64 20 3d 20 66 69 6c 65 5f 77 69 74 68 6f  Pwd = file_witho
4630: 75 74 5f 64 72 69 76 65 5f 6c 65 74 74 65 72 28  ut_drive_letter(
4640: 7a 42 75 66 29 3b 0a 20 20 20 20 69 20 3d 20 31  zBuf);.    i = 1
4650: 3b 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a  ;.#ifdef _WIN32.
4660: 20 20 20 20 77 68 69 6c 65 28 20 7a 50 61 74 68      while( zPath
4670: 5b 69 5d 20 26 26 20 66 6f 73 73 69 6c 5f 74 6f  [i] && fossil_to
4680: 6c 6f 77 65 72 28 7a 50 77 64 5b 69 5d 29 3d 3d  lower(zPwd[i])==
4690: 66 6f 73 73 69 6c 5f 74 6f 6c 6f 77 65 72 28 7a  fossil_tolower(z
46a0: 50 61 74 68 5b 69 5d 29 20 29 20 69 2b 2b 3b 0a  Path[i]) ) i++;.
46b0: 23 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65 28  #else.    while(
46c0: 20 7a 50 61 74 68 5b 69 5d 20 26 26 20 7a 50 77   zPath[i] && zPw
46d0: 64 5b 69 5d 3d 3d 7a 50 61 74 68 5b 69 5d 20 29  d[i]==zPath[i] )
46e0: 20 69 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20   i++;.#endif.   
46f0: 20 69 66 28 20 7a 50 61 74 68 5b 69 5d 3d 3d 30   if( zPath[i]==0
4700: 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 72   ){.      blob_r
4710: 65 73 65 74 28 70 4f 75 74 29 3b 0a 20 20 20 20  eset(pOut);.    
4720: 20 20 69 66 28 20 7a 50 77 64 5b 69 5d 3d 3d 30    if( zPwd[i]==0
4730: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62   ){.        blob
4740: 5f 61 70 70 65 6e 64 28 70 4f 75 74 2c 20 22 2e  _append(pOut, ".
4750: 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ", 1);.      }el
4760: 73 65 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62  se{.        blob
4770: 5f 61 70 70 65 6e 64 28 70 4f 75 74 2c 20 22 2e  _append(pOut, ".
4780: 2e 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  .", 2);.        
4790: 66 6f 72 28 6a 3d 69 2b 31 3b 20 7a 50 77 64 5b  for(j=i+1; zPwd[
47a0: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  j]; j++){.      
47b0: 20 20 20 20 69 66 28 20 7a 50 77 64 5b 6a 5d 3d      if( zPwd[j]=
47c0: 3d 27 2f 27 20 29 20 7b 0a 20 20 20 20 20 20 20  ='/' ) {.       
47d0: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64       blob_append
47e0: 28 70 4f 75 74 2c 20 22 2f 2e 2e 22 2c 20 33 29  (pOut, "/..", 3)
47f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
4800: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
4810: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
4820: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 50 77 64    }.    if( zPwd
4830: 5b 69 5d 3d 3d 30 20 26 26 20 7a 50 61 74 68 5b  [i]==0 && zPath[
4840: 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  i]=='/' ){.     
4850: 20 6d 65 6d 63 70 79 28 26 74 6d 70 2c 20 70 4f   memcpy(&tmp, pO
4860: 75 74 2c 20 73 69 7a 65 6f 66 28 74 6d 70 29 29  ut, sizeof(tmp))
4870: 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 73 65 74  ;.      blob_set
4880: 28 70 4f 75 74 2c 20 22 2e 2f 22 29 3b 0a 20 20  (pOut, "./");.  
4890: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28      blob_append(
48a0: 70 4f 75 74 2c 20 26 7a 50 61 74 68 5b 69 2b 31  pOut, &zPath[i+1
48b0: 5d 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 62 6c  ], -1);.      bl
48c0: 6f 62 5f 72 65 73 65 74 28 26 74 6d 70 29 3b 0a  ob_reset(&tmp);.
48d0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
48e0: 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 7a    }.    while( z
48f0: 50 61 74 68 5b 69 2d 31 5d 21 3d 27 2f 27 20 29  Path[i-1]!='/' )
4900: 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 62 6c 6f  { i--; }.    blo
4910: 62 5f 73 65 74 28 26 74 6d 70 2c 20 22 2e 2e 2f  b_set(&tmp, "../
4920: 22 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 3b  ");.    for(j=i;
4930: 20 7a 50 77 64 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a   zPwd[j]; j++){.
4940: 20 20 20 20 20 20 69 66 28 20 7a 50 77 64 5b 6a        if( zPwd[j
4950: 5d 3d 3d 27 2f 27 20 29 20 7b 0a 20 20 20 20 20  ]=='/' ) {.     
4960: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26     blob_append(&
4970: 74 6d 70 2c 20 22 2e 2e 2f 22 2c 20 33 29 3b 0a  tmp, "../", 3);.
4980: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4990: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26 74    blob_append(&t
49a0: 6d 70 2c 20 26 7a 50 61 74 68 5b 69 5d 2c 20 2d  mp, &zPath[i], -
49b0: 31 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73  1);.    blob_res
49c0: 65 74 28 70 4f 75 74 29 3b 0a 20 20 20 20 6d 65  et(pOut);.    me
49d0: 6d 63 70 79 28 70 4f 75 74 2c 20 26 74 6d 70 2c  mcpy(pOut, &tmp,
49e0: 20 73 69 7a 65 6f 66 28 74 6d 70 29 29 3b 0a 20   sizeof(tmp));. 
49f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d   }.}../*.** COMM
4a00: 41 4e 44 3a 20 20 74 65 73 74 2d 72 65 6c 61 74  AND:  test-relat
4a10: 69 76 65 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 54  ive-name.**.** T
4a20: 65 73 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f  est the operatio
4a30: 6e 20 6f 66 20 74 68 65 20 72 65 6c 61 74 69 76  n of the relativ
4a40: 65 20 6e 61 6d 65 20 67 65 6e 65 72 61 74 6f 72  e name generator
4a50: 2e 0a 2a 2f 0a 76 6f 69 64 20 63 6d 64 5f 74 65  ..*/.void cmd_te
4a60: 73 74 5f 72 65 6c 61 74 69 76 65 5f 6e 61 6d 65  st_relative_name
4a70: 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69 3b  (void){.  int i;
4a80: 0a 20 20 42 6c 6f 62 20 78 3b 0a 20 20 62 6c 6f  .  Blob x;.  blo
4a90: 62 5f 7a 65 72 6f 28 26 78 29 3b 0a 20 20 66 6f  b_zero(&x);.  fo
4aa0: 72 28 69 3d 32 3b 20 69 3c 67 2e 61 72 67 63 3b  r(i=2; i<g.argc;
4ab0: 20 69 2b 2b 29 7b 0a 20 20 20 20 66 69 6c 65 5f   i++){.    file_
4ac0: 72 65 6c 61 74 69 76 65 5f 6e 61 6d 65 28 67 2e  relative_name(g.
4ad0: 61 72 67 76 5b 69 5d 2c 20 26 78 29 3b 0a 20 20  argv[i], &x);.  
4ae0: 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22    fossil_print("
4af0: 25 73 5c 6e 22 2c 20 62 6c 6f 62 5f 62 75 66 66  %s\n", blob_buff
4b00: 65 72 28 26 78 29 29 3b 0a 20 20 20 20 62 6c 6f  er(&x));.    blo
4b10: 62 5f 72 65 73 65 74 28 26 78 29 3b 0a 20 20 7d  b_reset(&x);.  }
4b20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  .}../*.** Comput
4b30: 65 20 61 20 70 61 74 68 6e 61 6d 65 20 66 6f 72  e a pathname for
4b40: 20 61 20 66 69 6c 65 20 72 65 6c 61 74 69 76 65   a file relative
4b50: 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   to the root of 
4b60: 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 74 72 65  the local.** tre
4b70: 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  e.  Return TRUE 
4b80: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 4f 6e 20  on success.  On 
4b90: 66 61 69 6c 75 72 65 2c 20 70 72 69 6e 74 20 61  failure, print a
4ba0: 6e 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73  nd error.** mess
4bb0: 61 67 65 20 61 6e 64 20 71 75 69 74 20 69 66 20  age and quit if 
4bc0: 74 68 65 20 65 72 72 46 61 74 61 6c 20 66 6c 61  the errFatal fla
4bd0: 67 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 65  g is true.  If e
4be0: 72 72 46 61 74 61 6c 20 69 73 0a 2a 2a 20 66 61  rrFatal is.** fa
4bf0: 6c 73 65 2c 20 74 68 65 6e 20 73 69 6d 70 6c 79  lse, then simply
4c00: 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a   return 0..**.**
4c10: 20 54 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   The root of the
4c20: 20 74 72 65 65 20 69 73 20 64 65 66 69 6e 65 64   tree is defined
4c30: 20 62 79 20 74 68 65 20 67 2e 7a 4c 6f 63 61 6c   by the g.zLocal
4c40: 52 6f 6f 74 20 76 61 72 69 61 62 6c 65 2e 0a 2a  Root variable..*
4c50: 2f 0a 69 6e 74 20 66 69 6c 65 5f 74 72 65 65 5f  /.int file_tree_
4c60: 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20  name(const char 
4c70: 2a 7a 4f 72 69 67 4e 61 6d 65 2c 20 42 6c 6f 62  *zOrigName, Blob
4c80: 20 2a 70 4f 75 74 2c 20 69 6e 74 20 65 72 72 46   *pOut, int errF
4c90: 61 74 61 6c 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  atal){.  int n;.
4ca0: 20 20 42 6c 6f 62 20 66 75 6c 6c 3b 0a 20 20 69    Blob full;.  i
4cb0: 6e 74 20 6e 46 75 6c 6c 3b 0a 20 20 63 68 61 72  nt nFull;.  char
4cc0: 20 2a 7a 46 75 6c 6c 3b 0a 0a 20 20 62 6c 6f 62   *zFull;..  blob
4cd0: 5f 7a 65 72 6f 28 70 4f 75 74 29 3b 0a 20 20 64  _zero(pOut);.  d
4ce0: 62 5f 6d 75 73 74 5f 62 65 5f 77 69 74 68 69 6e  b_must_be_within
4cf0: 5f 74 72 65 65 28 29 3b 0a 20 20 66 69 6c 65 5f  _tree();.  file_
4d00: 63 61 6e 6f 6e 69 63 61 6c 5f 6e 61 6d 65 28 7a  canonical_name(z
4d10: 4f 72 69 67 4e 61 6d 65 2c 20 26 66 75 6c 6c 29  OrigName, &full)
4d20: 3b 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 67  ;.  n = strlen(g
4d30: 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 29 3b 0a 20 20  .zLocalRoot);.  
4d40: 61 73 73 65 72 74 28 20 6e 3e 30 20 26 26 20 67  assert( n>0 && g
4d50: 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 5b 6e 2d 31 5d  .zLocalRoot[n-1]
4d60: 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 46 75 6c 6c  =='/' );.  nFull
4d70: 20 3d 20 62 6c 6f 62 5f 73 69 7a 65 28 26 66 75   = blob_size(&fu
4d80: 6c 6c 29 3b 0a 20 20 7a 46 75 6c 6c 20 3d 20 62  ll);.  zFull = b
4d90: 6c 6f 62 5f 62 75 66 66 65 72 28 26 66 75 6c 6c  lob_buffer(&full
4da0: 29 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c  );..  /* Special
4db0: 20 63 61 73 65 2e 20 20 7a 4f 72 69 67 4e 61 6d   case.  zOrigNam
4dc0: 65 20 72 65 66 65 72 73 20 74 6f 20 67 2e 7a 4c  e refers to g.zL
4dd0: 6f 63 61 6c 52 6f 6f 74 20 64 69 72 65 63 74 6f  ocalRoot directo
4de0: 72 79 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 46 75  ry. */.  if( nFu
4df0: 6c 6c 3d 3d 6e 2d 31 20 26 26 20 6d 65 6d 63 6d  ll==n-1 && memcm
4e00: 70 28 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 2c 20  p(g.zLocalRoot, 
4e10: 7a 46 75 6c 6c 2c 20 6e 46 75 6c 6c 29 3d 3d 30  zFull, nFull)==0
4e20: 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70   ){.    blob_app
4e30: 65 6e 64 28 70 4f 75 74 2c 20 22 2e 22 2c 20 31  end(pOut, ".", 1
4e40: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
4e50: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 75 6c  .  }..  if( nFul
4e60: 6c 3c 3d 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 67  l<=n || memcmp(g
4e70: 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 2c 20 7a 46 75  .zLocalRoot, zFu
4e80: 6c 6c 2c 20 6e 29 20 29 7b 0a 20 20 20 20 62 6c  ll, n) ){.    bl
4e90: 6f 62 5f 72 65 73 65 74 28 26 66 75 6c 6c 29 3b  ob_reset(&full);
4ea0: 0a 20 20 20 20 69 66 28 20 65 72 72 46 61 74 61  .    if( errFata
4eb0: 6c 20 29 7b 0a 20 20 20 20 20 20 66 6f 73 73 69  l ){.      fossi
4ec0: 6c 5f 66 61 74 61 6c 28 22 66 69 6c 65 20 6f 75  l_fatal("file ou
4ed0: 74 73 69 64 65 20 6f 66 20 63 68 65 63 6b 6f 75  tside of checkou
4ee0: 74 20 74 72 65 65 3a 20 25 73 22 2c 20 7a 4f 72  t tree: %s", zOr
4ef0: 69 67 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  igName);.    }. 
4f00: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
4f10: 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70  .  blob_append(p
4f20: 4f 75 74 2c 20 26 7a 46 75 6c 6c 5b 6e 5d 2c 20  Out, &zFull[n], 
4f30: 6e 46 75 6c 6c 2d 6e 29 3b 0a 20 20 72 65 74 75  nFull-n);.  retu
4f40: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 1;.}../*.** C
4f50: 4f 4d 4d 41 4e 44 3a 20 20 74 65 73 74 2d 74 72  OMMAND:  test-tr
4f60: 65 65 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 54 65  ee-name.**.** Te
4f70: 73 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  st the operation
4f80: 20 6f 66 20 74 68 65 20 74 72 65 65 20 6e 61 6d   of the tree nam
4f90: 65 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  e generator..*/.
4fa0: 76 6f 69 64 20 63 6d 64 5f 74 65 73 74 5f 74 72  void cmd_test_tr
4fb0: 65 65 5f 6e 61 6d 65 28 76 6f 69 64 29 7b 0a 20  ee_name(void){. 
4fc0: 20 69 6e 74 20 69 3b 0a 20 20 42 6c 6f 62 20 78   int i;.  Blob x
4fd0: 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 78  ;.  blob_zero(&x
4fe0: 29 3b 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c  );.  for(i=2; i<
4ff0: 67 2e 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  g.argc; i++){.  
5000: 20 20 69 66 28 20 66 69 6c 65 5f 74 72 65 65 5f    if( file_tree_
5010: 6e 61 6d 65 28 67 2e 61 72 67 76 5b 69 5d 2c 20  name(g.argv[i], 
5020: 26 78 2c 20 31 29 20 29 7b 0a 20 20 20 20 20 20  &x, 1) ){.      
5030: 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 25 73  fossil_print("%s
5040: 5c 6e 22 2c 20 62 6c 6f 62 5f 62 75 66 66 65 72  \n", blob_buffer
5050: 28 26 78 29 29 3b 0a 20 20 20 20 20 20 62 6c 6f  (&x));.      blo
5060: 62 5f 72 65 73 65 74 28 26 78 29 3b 0a 20 20 20  b_reset(&x);.   
5070: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
5080: 50 61 72 73 65 20 61 20 55 52 49 20 69 6e 74 6f  Parse a URI into
5090: 20 73 63 68 65 6d 65 2c 20 68 6f 73 74 2c 20 70   scheme, host, p
50a0: 6f 72 74 2c 20 61 6e 64 20 70 61 74 68 2e 0a 2a  ort, and path..*
50b0: 2f 0a 76 6f 69 64 20 66 69 6c 65 5f 70 61 72 73  /.void file_pars
50c0: 65 5f 75 72 69 28 0a 20 20 63 6f 6e 73 74 20 63  e_uri(.  const c
50d0: 68 61 72 20 2a 7a 55 72 69 2c 0a 20 20 42 6c 6f  har *zUri,.  Blo
50e0: 62 20 2a 70 53 63 68 65 6d 65 2c 0a 20 20 42 6c  b *pScheme,.  Bl
50f0: 6f 62 20 2a 70 48 6f 73 74 2c 0a 20 20 69 6e 74  ob *pHost,.  int
5100: 20 2a 70 50 6f 72 74 2c 0a 20 20 42 6c 6f 62 20   *pPort,.  Blob 
5110: 2a 70 50 61 74 68 0a 29 7b 0a 20 20 69 6e 74 20  *pPath.){.  int 
5120: 69 2c 20 6a 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  i, j;..  for(i=0
5130: 3b 20 7a 55 72 69 5b 69 5d 20 26 26 20 7a 55 72  ; zUri[i] && zUr
5140: 69 5b 69 5d 3e 3d 27 61 27 20 26 26 20 7a 55 72  i[i]>='a' && zUr
5150: 69 5b 69 5d 3c 3d 27 7a 27 3b 20 69 2b 2b 29 7b  i[i]<='z'; i++){
5160: 7d 0a 20 20 69 66 28 20 7a 55 72 69 5b 69 5d 21  }.  if( zUri[i]!
5170: 3d 27 3a 27 20 29 7b 0a 20 20 20 20 62 6c 6f 62  =':' ){.    blob
5180: 5f 7a 65 72 6f 28 70 53 63 68 65 6d 65 29 3b 0a  _zero(pScheme);.
5190: 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 70 48      blob_zero(pH
51a0: 6f 73 74 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 73  ost);.    blob_s
51b0: 65 74 28 70 50 61 74 68 2c 20 7a 55 72 69 29 3b  et(pPath, zUri);
51c0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
51d0: 0a 20 20 62 6c 6f 62 5f 69 6e 69 74 28 70 53 63  .  blob_init(pSc
51e0: 68 65 6d 65 2c 20 7a 55 72 69 2c 20 69 29 3b 0a  heme, zUri, i);.
51f0: 20 20 69 2b 2b 3b 0a 20 20 69 66 28 20 7a 55 72    i++;.  if( zUr
5200: 69 5b 69 5d 3d 3d 27 2f 27 20 26 26 20 7a 55 72  i[i]=='/' && zUr
5210: 69 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 7b 0a 20  i[i+1]=='/' ){. 
5220: 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 6a     i += 2;.    j
5230: 20 3d 20 69 3b 0a 20 20 20 20 77 68 69 6c 65 28   = i;.    while(
5240: 20 7a 55 72 69 5b 69 5d 20 26 26 20 7a 55 72 69   zUri[i] && zUri
5250: 5b 69 5d 21 3d 27 2f 27 20 26 26 20 7a 55 72 69  [i]!='/' && zUri
5260: 5b 69 5d 21 3d 27 3a 27 20 29 7b 20 69 2b 2b 3b  [i]!=':' ){ i++;
5270: 20 7d 0a 20 20 20 20 62 6c 6f 62 5f 69 6e 69 74   }.    blob_init
5280: 28 70 48 6f 73 74 2c 20 26 7a 55 72 69 5b 6a 5d  (pHost, &zUri[j]
5290: 2c 20 69 2d 6a 29 3b 0a 20 20 20 20 69 66 28 20  , i-j);.    if( 
52a0: 7a 55 72 69 5b 69 5d 3d 3d 27 3a 27 20 29 7b 0a  zUri[i]==':' ){.
52b0: 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
52c0: 20 2a 70 50 6f 72 74 20 3d 20 61 74 6f 69 28 26   *pPort = atoi(&
52d0: 7a 55 72 69 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zUri[i]);.      
52e0: 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 5d 20 26  while( zUri[i] &
52f0: 26 20 7a 55 72 69 5b 69 5d 21 3d 27 2f 27 20 29  & zUri[i]!='/' )
5300: 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 20  { i++; }.    }. 
5310: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 6c 6f 62   }else{.    blob
5320: 5f 7a 65 72 6f 28 70 48 6f 73 74 29 3b 0a 20 20  _zero(pHost);.  
5330: 7d 0a 20 20 69 66 28 20 7a 55 72 69 5b 69 5d 3d  }.  if( zUri[i]=
5340: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 62 6c 6f 62  ='/' ){.    blob
5350: 5f 73 65 74 28 70 50 61 74 68 2c 20 26 7a 55 72  _set(pPath, &zUr
5360: 69 5b 69 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  i[i]);.  }else{.
5370: 20 20 20 20 62 6c 6f 62 5f 73 65 74 28 70 50 61      blob_set(pPa
5380: 74 68 2c 20 22 2f 22 29 3b 0a 20 20 7d 0a 7d 0a  th, "/");.  }.}.
5390: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  ./*.** Construct
53a0: 20 61 20 72 61 6e 64 6f 6d 20 74 65 6d 70 6f 72   a random tempor
53b0: 61 72 79 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74  ary filename int
53c0: 6f 20 7a 42 75 66 5b 5d 2e 0a 2a 2f 0a 76 6f 69  o zBuf[]..*/.voi
53d0: 64 20 66 69 6c 65 5f 74 65 6d 70 6e 61 6d 65 28  d file_tempname(
53e0: 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
53f0: 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20  zBuf){.  static 
5400: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69  const char *azDi
5410: 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 22 2f  rs[] = {.     "/
5420: 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22  var/tmp",.     "
5430: 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /usr/tmp",.     
5440: 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74  "/tmp",.     "/t
5450: 65 6d 70 22 2c 0a 20 20 20 20 20 22 2e 22 2c 0a  emp",.     ".",.
5460: 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f    };.  static co
5470: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
5480: 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20  r zChars[] =.   
5490: 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e   "abcdefghijklmn
54a0: 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20  opqrstuvwxyz".  
54b0: 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d    "ABCDEFGHIJKLM
54c0: 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20  NOPQRSTUVWXYZ". 
54d0: 20 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b     "0123456789";
54e0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
54f0: 69 2c 20 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68  i, j;.  const ch
5500: 61 72 20 2a 7a 44 69 72 20 3d 20 22 2e 22 3b 0a  ar *zDir = ".";.
5510: 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
5520: 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73   .  for(i=0; i<s
5530: 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69  izeof(azDirs)/si
5540: 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b  zeof(azDirs[0]);
5550: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   i++){.    if( !
5560: 66 69 6c 65 5f 69 73 64 69 72 28 61 7a 44 69 72  file_isdir(azDir
5570: 73 5b 69 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65  s[i]) ) continue
5580: 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20 61 7a 44  ;.    zDir = azD
5590: 69 72 73 5b 69 5d 3b 0a 20 20 20 20 62 72 65 61  irs[i];.    brea
55a0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  k;.  }..  /* Che
55b0: 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74 70  ck that the outp
55c0: 75 74 20 62 75 66 66 65 72 20 69 73 20 6c 61 72  ut buffer is lar
55d0: 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68  ge enough for th
55e0: 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
55f0: 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20   .  ** name. If 
5600: 69 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72  it is not, retur
5610: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  n SQLITE_ERROR..
5620: 20 20 2a 2f 0a 20 20 69 66 28 20 28 73 74 72 6c    */.  if( (strl
5630: 65 6e 28 7a 44 69 72 29 20 2b 20 31 37 29 20 3e  en(zDir) + 17) >
5640: 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29  = (size_t)nBuf )
5650: 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74  {.    fossil_fat
5660: 61 6c 28 22 69 6e 73 75 66 66 69 63 69 65 6e 74  al("insufficient
5670: 20 73 70 61 63 65 20 66 6f 72 20 74 65 6d 70 6f   space for tempo
5680: 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 22 29 3b  rary filename");
5690: 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20  .  }..  do{.    
56a0: 69 66 28 20 63 6e 74 2b 2b 3e 32 30 20 29 20 66  if( cnt++>20 ) f
56b0: 6f 73 73 69 6c 5f 70 61 6e 69 63 28 22 63 61 6e  ossil_panic("can
56c0: 6e 6f 74 20 67 65 6e 65 72 61 74 65 20 61 20 74  not generate a t
56d0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d  emporary filenam
56e0: 65 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e");.    sqlite3
56f0: 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31  _snprintf(nBuf-1
5700: 37 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 2c 20  7, zBuf, "%s/", 
5710: 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20 28  zDir);.    j = (
5720: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75 66 29  int)strlen(zBuf)
5730: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61  ;.    sqlite3_ra
5740: 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42  ndomness(15, &zB
5750: 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28  uf[j]);.    for(
5760: 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20  i=0; i<15; i++, 
5770: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75 66  j++){.      zBuf
5780: 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61  [j] = (char)zCha
5790: 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63  rs[ ((unsigned c
57a0: 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69  har)zBuf[j])%(si
57b0: 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20  zeof(zChars)-1) 
57c0: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75  ];.    }.    zBu
57d0: 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69  f[j] = 0;.  }whi
57e0: 6c 65 28 20 66 69 6c 65 5f 73 69 7a 65 28 7a 42  le( file_size(zB
57f0: 75 66 29 3e 3d 30 20 29 3b 0a 7d 0a 0a 0a 2f 2a  uf)>=0 );.}.../*
5800: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
5810: 69 66 20 61 20 66 69 6c 65 20 6e 61 6d 65 64 20  if a file named 
5820: 7a 4e 61 6d 65 20 65 78 69 73 74 73 20 61 6e 64  zName exists and
5830: 20 68 61 73 20 69 64 65 6e 74 69 63 61 6c 20 63   has identical c
5840: 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 74 68 65  ontent.** to the
5850: 20 62 6c 6f 62 20 70 43 6f 6e 74 65 6e 74 2e 20   blob pContent. 
5860: 20 49 66 20 7a 4e 61 6d 65 20 64 6f 65 73 20 6e   If zName does n
5870: 6f 74 20 65 78 69 73 74 20 6f 72 20 69 66 20 74  ot exist or if t
5880: 68 65 20 63 6f 6e 74 65 6e 74 20 69 73 0a 2a 2a  he content is.**
5890: 20 64 69 66 66 65 72 65 6e 74 20 69 6e 20 61 6e   different in an
58a0: 79 20 77 61 79 2c 20 74 68 65 6e 20 72 65 74 75  y way, then retu
58b0: 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74  rn false..*/.int
58c0: 20 66 69 6c 65 5f 69 73 5f 74 68 65 5f 73 61 6d   file_is_the_sam
58d0: 65 28 42 6c 6f 62 20 2a 70 43 6f 6e 74 65 6e 74  e(Blob *pContent
58e0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
58f0: 61 6d 65 29 7b 0a 20 20 69 36 34 20 69 53 69 7a  ame){.  i64 iSiz
5900: 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  e;.  int rc;.  B
5910: 6c 6f 62 20 6f 6e 44 69 73 6b 3b 0a 0a 20 20 69  lob onDisk;..  i
5920: 53 69 7a 65 20 3d 20 66 69 6c 65 5f 73 69 7a 65  Size = file_size
5930: 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69  (zName);.  if( i
5940: 53 69 7a 65 3c 30 20 29 20 72 65 74 75 72 6e 20  Size<0 ) return 
5950: 30 3b 0a 20 20 69 66 28 20 69 53 69 7a 65 21 3d  0;.  if( iSize!=
5960: 62 6c 6f 62 5f 73 69 7a 65 28 70 43 6f 6e 74 65  blob_size(pConte
5970: 6e 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  nt) ) return 0;.
5980: 20 20 69 66 28 20 66 69 6c 65 5f 77 64 5f 69 73    if( file_wd_is
5990: 6c 69 6e 6b 28 7a 4e 61 6d 65 29 20 29 7b 0a 20  link(zName) ){. 
59a0: 20 20 20 62 6c 6f 62 5f 72 65 61 64 5f 6c 69 6e     blob_read_lin
59b0: 6b 28 26 6f 6e 44 69 73 6b 2c 20 7a 4e 61 6d 65  k(&onDisk, zName
59c0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
59d0: 62 6c 6f 62 5f 72 65 61 64 5f 66 72 6f 6d 5f 66  blob_read_from_f
59e0: 69 6c 65 28 26 6f 6e 44 69 73 6b 2c 20 7a 4e 61  ile(&onDisk, zNa
59f0: 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  me);.  }.  rc = 
5a00: 62 6c 6f 62 5f 63 6f 6d 70 61 72 65 28 26 6f 6e  blob_compare(&on
5a10: 44 69 73 6b 2c 20 70 43 6f 6e 74 65 6e 74 29 3b  Disk, pContent);
5a20: 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 6f  .  blob_reset(&o
5a30: 6e 44 69 73 6b 29 3b 0a 20 20 72 65 74 75 72 6e  nDisk);.  return
5a40: 20 72 63 3d 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a   rc==0;.}.../***
5a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a90: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66  *******.** The f
5aa0: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
5ab0: 73 20 74 72 61 6e 73 6c 61 74 65 20 62 65 74 77  s translate betw
5ac0: 65 65 6e 20 4d 42 43 53 20 61 6e 64 20 55 54 46  een MBCS and UTF
5ad0: 38 20 6f 6e 20 77 69 6e 64 6f 77 73 2e 0a 2a 2a  8 on windows..**
5ae0: 20 53 69 6e 63 65 20 65 76 65 72 79 74 68 69 6e   Since everythin
5af0: 67 20 69 73 20 61 6c 77 61 79 73 20 55 54 46 38  g is always UTF8
5b00: 20 6f 6e 20 75 6e 69 78 2c 20 74 68 65 73 65 20   on unix, these 
5b10: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 6e 6f 2d  routines are no-
5b20: 6f 70 73 0a 2a 2a 20 74 68 65 72 65 2e 0a 2a 2f  ops.** there..*/
5b30: 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 23  .#ifdef _WIN32.#
5b40: 20 69 6e 63 6c 75 64 65 20 3c 77 69 6e 64 6f 77   include <window
5b50: 73 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  s.h>.#endif../*.
5b60: 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 4d 42 43  ** Translate MBC
5b70: 53 20 74 6f 20 55 54 46 38 2e 20 20 52 65 74 75  S to UTF8.  Retu
5b80: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
5b90: 74 68 65 20 74 72 61 6e 73 6c 61 74 65 64 20 74  the translated t
5ba0: 65 78 74 2e 20 20 0a 2a 2a 20 43 61 6c 6c 20 66  ext.  .** Call f
5bb0: 6f 73 73 69 6c 5f 6d 62 63 73 5f 66 72 65 65 28  ossil_mbcs_free(
5bc0: 29 20 74 6f 20 64 65 61 6c 6c 6f 63 61 74 65 20  ) to deallocate 
5bd0: 61 6e 79 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  any memory used 
5be0: 74 6f 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20  to store the.** 
5bf0: 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72  returned pointer
5c00: 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 2a 2f 0a 63   when done..*/.c
5c10: 68 61 72 20 2a 66 6f 73 73 69 6c 5f 6d 62 63 73  har *fossil_mbcs
5c20: 5f 74 6f 5f 75 74 66 38 28 63 6f 6e 73 74 20 63  _to_utf8(const c
5c30: 68 61 72 20 2a 7a 4d 62 63 73 29 7b 0a 23 69 66  har *zMbcs){.#if
5c40: 64 65 66 20 5f 57 49 4e 33 32 0a 20 20 65 78 74  def _WIN32.  ext
5c50: 65 72 6e 20 63 68 61 72 20 2a 73 71 6c 69 74 65  ern char *sqlite
5c60: 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
5c70: 75 74 66 38 28 63 6f 6e 73 74 20 63 68 61 72 2a  utf8(const char*
5c80: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
5c90: 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
5ca0: 6f 5f 75 74 66 38 28 7a 4d 62 63 73 29 3b 0a 23  o_utf8(zMbcs);.#
5cb0: 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 28 63  else.  return (c
5cc0: 68 61 72 2a 29 7a 4d 62 63 73 3b 20 20 2f 2a 20  har*)zMbcs;  /* 
5cd0: 4e 6f 2d 6f 70 20 6f 6e 20 75 6e 69 78 20 2a 2f  No-op on unix */
5ce0: 0a 23 65 6e 64 69 66 20 20 0a 7d 0a 0a 2f 2a 0a  .#endif  .}../*.
5cf0: 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 55 54 46  ** Translate UTF
5d00: 38 20 74 6f 20 4d 42 43 53 20 66 6f 72 20 75 73  8 to MBCS for us
5d10: 65 20 69 6e 20 73 79 73 74 65 6d 20 63 61 6c 6c  e in system call
5d20: 73 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  s.  Return a poi
5d30: 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 74  nter to the.** t
5d40: 72 61 6e 73 6c 61 74 65 64 20 74 65 78 74 2e 2e  ranslated text..
5d50: 20 20 43 61 6c 6c 20 66 6f 73 73 69 6c 5f 6d 62    Call fossil_mb
5d60: 63 73 5f 66 72 65 65 28 29 20 74 6f 20 64 65 61  cs_free() to dea
5d70: 6c 6c 6f 63 61 74 65 20 61 6e 79 20 6d 65 6d 6f  llocate any memo
5d80: 72 79 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74  ry.** used to st
5d90: 6f 72 65 20 74 68 65 20 72 65 74 75 72 6e 65 64  ore the returned
5da0: 20 70 6f 69 6e 74 65 72 20 77 68 65 6e 20 64 6f   pointer when do
5db0: 6e 65 2e 0a 2a 2f 0a 63 68 61 72 20 2a 66 6f 73  ne..*/.char *fos
5dc0: 73 69 6c 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73  sil_utf8_to_mbcs
5dd0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 74  (const char *zUt
5de0: 66 38 29 7b 0a 23 69 66 64 65 66 20 5f 57 49 4e  f8){.#ifdef _WIN
5df0: 33 32 0a 20 20 65 78 74 65 72 6e 20 63 68 61 72  32.  extern char
5e00: 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f   *sqlite3_win32_
5e10: 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e  utf8_to_mbcs(con
5e20: 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 72 65 74  st char*);.  ret
5e30: 75 72 6e 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  urn sqlite3_win3
5e40: 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 7a  2_utf8_to_mbcs(z
5e50: 55 74 66 38 29 3b 0a 23 65 6c 73 65 0a 20 20 72  Utf8);.#else.  r
5e60: 65 74 75 72 6e 20 28 63 68 61 72 2a 29 7a 55 74  eturn (char*)zUt
5e70: 66 38 3b 20 20 2f 2a 20 4e 6f 2d 6f 70 20 6f 6e  f8;  /* No-op on
5e80: 20 75 6e 69 78 20 2a 2f 0a 23 65 6e 64 69 66 20   unix */.#endif 
5e90: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73   .}../*.** Trans
5ea0: 6c 61 74 65 20 55 54 46 38 20 74 6f 20 4d 42 43  late UTF8 to MBC
5eb0: 53 20 66 6f 72 20 64 69 73 70 6c 61 79 20 6f 6e  S for display on
5ec0: 20 74 68 65 20 63 6f 6e 73 6f 6c 65 2e 20 20 52   the console.  R
5ed0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
5ee0: 74 6f 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 6c  to the.** transl
5ef0: 61 74 65 64 20 74 65 78 74 2e 2e 20 20 43 61 6c  ated text..  Cal
5f00: 6c 20 66 6f 73 73 69 6c 5f 6d 62 63 73 5f 66 72  l fossil_mbcs_fr
5f10: 65 65 28 29 20 74 6f 20 64 65 61 6c 6c 6f 63 61  ee() to dealloca
5f20: 74 65 20 61 6e 79 20 6d 65 6d 6f 72 79 0a 2a 2a  te any memory.**
5f30: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
5f40: 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e  he returned poin
5f50: 74 65 72 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 2a  ter when done..*
5f60: 2f 0a 63 68 61 72 20 2a 66 6f 73 73 69 6c 5f 75  /.char *fossil_u
5f70: 74 66 38 5f 74 6f 5f 63 6f 6e 73 6f 6c 65 28 63  tf8_to_console(c
5f80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38  onst char *zUtf8
5f90: 29 7b 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32  ){.#ifdef _WIN32
5fa0: 0a 20 20 69 6e 74 20 6e 43 68 61 72 2c 20 6e 42  .  int nChar, nB
5fb0: 79 74 65 3b 0a 20 20 57 43 48 41 52 20 2a 7a 55  yte;.  WCHAR *zU
5fc0: 6e 69 63 6f 64 65 3b 20 20 20 2f 2a 20 55 6e 69  nicode;   /* Uni
5fd0: 63 6f 64 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  code version of 
5fe0: 7a 55 74 66 38 20 2a 2f 0a 20 20 63 68 61 72 20  zUtf8 */.  char 
5ff0: 2a 7a 43 6f 6e 73 6f 6c 65 3b 20 20 20 20 2f 2a  *zConsole;    /*
6000: 20 43 6f 6e 73 6f 6c 65 20 76 65 72 73 69 6f 6e   Console version
6010: 20 6f 66 20 7a 55 74 66 38 20 2a 2f 0a 20 20 69   of zUtf8 */.  i
6020: 6e 74 20 63 6f 64 65 70 61 67 65 3b 20 20 20 20  nt codepage;    
6030: 20 20 2f 2a 20 43 6f 6e 73 6f 6c 65 20 63 6f 64    /* Console cod
6040: 65 20 70 61 67 65 20 2a 2f 0a 0a 20 20 6e 43 68  e page */..  nCh
6050: 61 72 20 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f  ar = MultiByteTo
6060: 57 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38  WideChar(CP_UTF8
6070: 2c 20 30 2c 20 7a 55 74 66 38 2c 20 2d 31 2c 20  , 0, zUtf8, -1, 
6080: 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 7a 55 6e 69  NULL, 0);.  zUni
6090: 63 6f 64 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e  code = malloc( n
60a0: 43 68 61 72 2a 73 69 7a 65 6f 66 28 7a 55 6e 69  Char*sizeof(zUni
60b0: 63 6f 64 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66  code[0]) );.  if
60c0: 28 20 7a 55 6e 69 63 6f 64 65 3d 3d 30 20 29 7b  ( zUnicode==0 ){
60d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
60e0: 20 7d 0a 20 20 6e 43 68 61 72 20 3d 20 4d 75 6c   }.  nChar = Mul
60f0: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
6100: 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 55 74  (CP_UTF8, 0, zUt
6110: 66 38 2c 20 2d 31 2c 20 7a 55 6e 69 63 6f 64 65  f8, -1, zUnicode
6120: 2c 20 6e 43 68 61 72 29 3b 0a 20 20 69 66 28 20  , nChar);.  if( 
6130: 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20  nChar==0 ){.    
6140: 66 72 65 65 28 7a 55 6e 69 63 6f 64 65 29 3b 0a  free(zUnicode);.
6150: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6160: 7d 0a 20 20 63 6f 64 65 70 61 67 65 20 3d 20 47  }.  codepage = G
6170: 65 74 43 6f 6e 73 6f 6c 65 43 50 28 29 3b 0a 20  etConsoleCP();. 
6180: 20 6e 42 79 74 65 20 3d 20 57 69 64 65 43 68 61   nByte = WideCha
6190: 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64  rToMultiByte(cod
61a0: 65 70 61 67 65 2c 20 30 2c 20 7a 55 6e 69 63 6f  epage, 0, zUnico
61b0: 64 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c  de, -1, 0, 0, 0,
61c0: 20 30 29 3b 0a 20 20 7a 43 6f 6e 73 6f 6c 65 20   0);.  zConsole 
61d0: 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  = malloc( nByte 
61e0: 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 73 6f 6c  );.  if( zConsol
61f0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 72 65 65  e==0 ){.    free
6200: 28 7a 55 6e 69 63 6f 64 65 29 3b 0a 20 20 20 20  (zUnicode);.    
6210: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
6220: 6e 42 79 74 65 20 3d 20 57 69 64 65 43 68 61 72  nByte = WideChar
6230: 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65  ToMultiByte(code
6240: 70 61 67 65 2c 20 30 2c 20 7a 55 6e 69 63 6f 64  page, 0, zUnicod
6250: 65 2c 20 2d 31 2c 20 7a 43 6f 6e 73 6f 6c 65 2c  e, -1, zConsole,
6260: 20 6e 42 79 74 65 2c 20 30 2c 20 30 29 3b 0a 20   nByte, 0, 0);. 
6270: 20 66 72 65 65 28 7a 55 6e 69 63 6f 64 65 29 3b   free(zUnicode);
6280: 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20  .  if( nByte == 
6290: 30 20 29 7b 0a 20 20 20 20 66 72 65 65 28 7a 43  0 ){.    free(zC
62a0: 6f 6e 73 6f 6c 65 29 3b 0a 20 20 20 20 7a 43 6f  onsole);.    zCo
62b0: 6e 73 6f 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  nsole = 0;.  }. 
62c0: 20 72 65 74 75 72 6e 20 7a 43 6f 6e 73 6f 6c 65   return zConsole
62d0: 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
62e0: 20 28 63 68 61 72 2a 29 7a 55 74 66 38 3b 20 20   (char*)zUtf8;  
62f0: 2f 2a 20 4e 6f 2d 6f 70 20 6f 6e 20 75 6e 69 78  /* No-op on unix
6300: 20 2a 2f 0a 23 65 6e 64 69 66 20 20 0a 7d 0a 0a   */.#endif  .}..
6310: 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20  /*.** Translate 
6320: 4d 42 43 53 20 74 6f 20 55 54 46 38 2e 20 20 52  MBCS to UTF8.  R
6330: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2e  eturn a pointer.
6340: 20 20 43 61 6c 6c 20 66 6f 73 73 69 6c 5f 6d 62    Call fossil_mb
6350: 63 73 5f 66 72 65 65 28 29 0a 2a 2a 20 74 6f 20  cs_free().** to 
6360: 64 65 61 6c 6c 6f 63 61 74 65 20 61 6e 79 20 6d  deallocate any m
6370: 65 6d 6f 72 79 20 75 73 65 64 20 74 6f 20 73 74  emory used to st
6380: 6f 72 65 20 74 68 65 20 72 65 74 75 72 6e 65 64  ore the returned
6390: 20 70 6f 69 6e 74 65 72 20 77 68 65 6e 20 64 6f   pointer when do
63a0: 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 66 6f 73 73  ne..*/.void foss
63b0: 69 6c 5f 6d 62 63 73 5f 66 72 65 65 28 63 68 61  il_mbcs_free(cha
63c0: 72 20 2a 7a 4f 6c 64 29 7b 0a 23 69 66 64 65 66  r *zOld){.#ifdef
63d0: 20 5f 57 49 4e 33 32 0a 20 20 66 72 65 65 28 7a   _WIN32.  free(z
63e0: 4f 6c 64 29 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a  Old);.#else.  /*
63f0: 20 4e 6f 2d 6f 70 20 6f 6e 20 75 6e 69 78 20 2a   No-op on unix *
6400: 2f 0a 23 65 6e 64 69 66 20 20 0a 7d 0a 0a 2f 2a  /.#endif  .}../*
6410: 0a 2a 2a 20 4c 69 6b 65 20 66 6f 70 65 6e 28 29  .** Like fopen()
6420: 20 62 75 74 20 61 6c 77 61 79 73 20 74 61 6b 65   but always take
6430: 73 20 61 20 55 54 46 38 20 61 72 67 75 6d 65 6e  s a UTF8 argumen
6440: 74 2e 0a 2a 2f 0a 46 49 4c 45 20 2a 66 6f 73 73  t..*/.FILE *foss
6450: 69 6c 5f 66 6f 70 65 6e 28 63 6f 6e 73 74 20 63  il_fopen(const c
6460: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
6470: 74 20 63 68 61 72 20 2a 7a 4d 6f 64 65 29 7b 0a  t char *zMode){.
6480: 20 20 63 68 61 72 20 2a 7a 4d 62 63 73 20 3d 20    char *zMbcs = 
6490: 66 6f 73 73 69 6c 5f 75 74 66 38 5f 74 6f 5f 6d  fossil_utf8_to_m
64a0: 62 63 73 28 7a 4e 61 6d 65 29 3b 0a 20 20 46 49  bcs(zName);.  FI
64b0: 4c 45 20 2a 66 20 3d 20 66 6f 70 65 6e 28 7a 4d  LE *f = fopen(zM
64c0: 62 63 73 2c 20 7a 4d 6f 64 65 29 3b 0a 20 20 66  bcs, zMode);.  f
64d0: 6f 73 73 69 6c 5f 6d 62 63 73 5f 66 72 65 65 28  ossil_mbcs_free(
64e0: 7a 4d 62 63 73 29 3b 0a 20 20 72 65 74 75 72 6e  zMbcs);.  return
64f0: 20 66 3b 0a 7d 0a                                 f;.}.