Fossil with Commonmark

Hex Artifact Content
Login

Artifact c6ad62e5a9e835418ad34304d42e78faea4da1e9:


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 4f  file.h"../*.** O
03e0: 6e 20 57 69 6e 64 6f 77 73 2c 20 69 6e 63 6c 75  n Windows, inclu
03f0: 64 65 20 74 68 65 20 50 6c 61 74 66 6f 72 6d 20  de the Platform 
0400: 53 44 4b 20 68 65 61 64 65 72 20 66 69 6c 65 2e  SDK header file.
0410: 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 57 49 4e 33  .*/.#ifdef _WIN3
0420: 32 0a 23 20 69 6e 63 6c 75 64 65 20 3c 64 69 72  2.# include <dir
0430: 65 63 74 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65  ect.h>.# include
0440: 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a 23 20 69   <windows.h>.# i
0450: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 75 74 69 6d  nclude <sys/utim
0460: 65 2e 68 3e 0a 23 65 6c 73 65 0a 23 20 69 6e 63  e.h>.#else.# inc
0470: 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68  lude <sys/time.h
0480: 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  >.#endif../*.** 
0490: 54 68 65 20 66 69 6c 65 20 73 74 61 74 75 73 20  The file status 
04a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
04b0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
04c0: 20 73 74 61 74 28 29 20 63 61 6c 6c 2e 0a 2a 2a   stat() call..**
04d0: 0a 2a 2a 20 55 73 65 20 5f 73 74 61 74 69 36 34  .** Use _stati64
04e0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 73 74 61   rather than sta
04f0: 74 20 6f 6e 20 77 69 6e 64 6f 77 73 2c 20 69 6e  t on windows, in
0500: 20 6f 72 64 65 72 20 74 6f 20 68 61 6e 64 6c 65   order to handle
0510: 20 66 69 6c 65 73 0a 2a 2a 20 6c 61 72 67 65 72   files.** larger
0520: 20 74 68 61 6e 20 32 47 42 2e 0a 2a 2f 0a 23 69   than 2GB..*/.#i
0530: 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  f defined(_WIN32
0540: 29 20 26 26 20 28 64 65 66 69 6e 65 64 28 5f 5f  ) && (defined(__
0550: 4d 53 56 43 52 54 5f 5f 29 20 7c 7c 20 64 65 66  MSVCRT__) || def
0560: 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 29 0a  ined(_MSC_VER)).
0570: 23 20 75 6e 64 65 66 20 73 74 61 74 0a 23 20 64  # undef stat.# d
0580: 65 66 69 6e 65 20 73 74 61 74 20 5f 73 74 61 74  efine stat _stat
0590: 69 36 34 0a 23 65 6e 64 69 66 0a 2f 2a 0a 2a 2a  i64.#endif./*.**
05a0: 20 4f 6e 20 57 69 6e 64 6f 77 73 20 53 5f 49 53   On Windows S_IS
05b0: 4c 4e 4b 20 61 6c 77 61 79 73 20 72 65 74 75 72  LNK always retur
05c0: 6e 73 20 46 41 4c 53 45 2e 0a 2a 2f 0a 23 69 66  ns FALSE..*/.#if
05d0: 20 21 64 65 66 69 6e 65 64 28 53 5f 49 53 4c 4e   !defined(S_ISLN
05e0: 4b 29 0a 23 20 64 65 66 69 6e 65 20 53 5f 49 53  K).# define S_IS
05f0: 4c 4e 4b 28 78 29 20 28 30 29 0a 23 65 6e 64 69  LNK(x) (0).#endi
0600: 66 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  f.static int fil
0610: 65 53 74 61 74 56 61 6c 69 64 20 3d 20 30 3b 0a  eStatValid = 0;.
0620: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73 74  static struct st
0630: 61 74 20 66 69 6c 65 53 74 61 74 3b 0a 0a 2f 2a  at fileStat;../*
0640: 0a 2a 2a 20 46 69 6c 6c 20 73 74 61 74 20 62 75  .** Fill stat bu
0650: 66 20 77 69 74 68 20 69 6e 66 6f 72 6d 61 74 69  f with informati
0660: 6f 6e 20 72 65 63 65 69 76 65 64 20 66 72 6f 6d  on received from
0670: 20 73 74 61 74 28 29 20 6f 72 20 6c 73 74 61 74   stat() or lstat
0680: 28 29 2e 0a 2a 2a 20 6c 73 74 61 74 28 29 20 69  ()..** lstat() i
0690: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 55 6e 69 78  s called on Unix
06a0: 20 69 66 20 69 73 57 64 20 69 73 20 54 52 55 45   if isWd is TRUE
06b0: 20 61 6e 64 20 61 6c 6c 6f 77 2d 73 79 6d 6c 69   and allow-symli
06c0: 6e 6b 73 20 73 65 74 74 69 6e 67 20 69 73 20 6f  nks setting is o
06d0: 6e 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  n..**.*/.static 
06e0: 69 6e 74 20 66 6f 73 73 69 6c 5f 73 74 61 74 28  int fossil_stat(
06f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
0700: 65 6e 61 6d 65 2c 20 73 74 72 75 63 74 20 73 74  ename, struct st
0710: 61 74 20 2a 62 75 66 2c 20 69 6e 74 20 69 73 57  at *buf, int isW
0720: 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 23 69  d){.  int rc;.#i
0730: 66 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  f !defined(_WIN3
0740: 32 29 0a 20 20 63 68 61 72 20 2a 7a 4d 62 63 73  2).  char *zMbcs
0750: 20 3d 20 66 6f 73 73 69 6c 5f 75 74 66 38 5f 74   = fossil_utf8_t
0760: 6f 5f 66 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65  o_filename(zFile
0770: 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 73 57  name);.  if( isW
0780: 64 20 26 26 20 67 2e 61 6c 6c 6f 77 53 79 6d 6c  d && g.allowSyml
0790: 69 6e 6b 73 20 29 7b 0a 20 20 20 20 72 63 20 3d  inks ){.    rc =
07a0: 20 6c 73 74 61 74 28 7a 4d 62 63 73 2c 20 62 75   lstat(zMbcs, bu
07b0: 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f);.  }else{.   
07c0: 20 72 63 20 3d 20 73 74 61 74 28 7a 4d 62 63 73   rc = stat(zMbcs
07d0: 2c 20 62 75 66 29 3b 0a 20 20 7d 0a 23 65 6c 73  , buf);.  }.#els
07e0: 65 0a 20 20 77 63 68 61 72 5f 74 20 2a 7a 4d 62  e.  wchar_t *zMb
07f0: 63 73 20 3d 20 66 6f 73 73 69 6c 5f 75 74 66 38  cs = fossil_utf8
0800: 5f 74 6f 5f 66 69 6c 65 6e 61 6d 65 28 7a 46 69  _to_filename(zFi
0810: 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 63 20 3d 20  lename);.  rc = 
0820: 5f 77 73 74 61 74 69 36 34 28 7a 4d 62 63 73 2c  _wstati64(zMbcs,
0830: 20 62 75 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20   buf);.#endif.  
0840: 66 6f 73 73 69 6c 5f 66 69 6c 65 6e 61 6d 65 5f  fossil_filename_
0850: 66 72 65 65 28 7a 4d 62 63 73 29 3b 0a 20 20 72  free(zMbcs);.  r
0860: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
0870: 2a 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 66  ** Fill in the f
0880: 69 6c 65 53 74 61 74 20 76 61 72 69 61 62 6c 65  ileStat variable
0890: 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 6e 61   for the file na
08a0: 6d 65 64 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a  med zFilename..*
08b0: 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d  * If zFilename==
08c0: 30 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20  0, then use the 
08d0: 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 20 6f  previous value o
08e0: 66 20 66 69 6c 65 53 74 61 74 20 69 66 0a 2a 2a  f fileStat if.**
08f0: 20 74 68 65 72 65 20 69 73 20 61 20 70 72 65 76   there is a prev
0900: 69 6f 75 73 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  ious value..**.*
0910: 2a 20 49 66 20 69 73 57 64 20 69 73 20 54 52 55  * If isWd is TRU
0920: 45 2c 20 64 6f 20 6c 73 74 61 74 28 29 20 69 6e  E, do lstat() in
0930: 73 74 65 61 64 20 6f 66 20 73 74 61 74 28 29 20  stead of stat() 
0940: 69 66 20 61 6c 6c 6f 77 2d 73 79 6d 6c 69 6e 6b  if allow-symlink
0950: 73 20 69 73 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52  s is on..**.** R
0960: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
0970: 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4e 6f 20   of errors.  No 
0980: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 61  error messages a
0990: 72 65 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f  re generated..*/
09a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 53  .static int getS
09b0: 74 61 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  tat(const char *
09c0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 69  zFilename, int i
09d0: 73 57 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  sWd){.  int rc =
09e0: 20 30 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   0;.  if( zFilen
09f0: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ame==0 ){.    if
0a00: 28 20 66 69 6c 65 53 74 61 74 56 61 6c 69 64 3d  ( fileStatValid=
0a10: 3d 30 20 29 20 72 63 20 3d 20 31 3b 0a 20 20 7d  =0 ) rc = 1;.  }
0a20: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 66 6f  else{.    if( fo
0a30: 73 73 69 6c 5f 73 74 61 74 28 7a 46 69 6c 65 6e  ssil_stat(zFilen
0a40: 61 6d 65 2c 20 26 66 69 6c 65 53 74 61 74 2c 20  ame, &fileStat, 
0a50: 69 73 57 64 29 21 3d 30 20 29 7b 0a 20 20 20 20  isWd)!=0 ){.    
0a60: 20 20 66 69 6c 65 53 74 61 74 56 61 6c 69 64 20    fileStatValid 
0a70: 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
0a80: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
0a90: 20 20 20 20 66 69 6c 65 53 74 61 74 56 61 6c 69      fileStatVali
0aa0: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20  d = 1;.      rc 
0ab0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
0ac0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
0ad0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
0ae0: 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69  size of a file i
0af0: 6e 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e  n bytes.  Return
0b00: 20 2d 31 20 69 66 20 74 68 65 20 66 69 6c 65 20   -1 if the file 
0b10: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 65 78 69 73  does not.** exis
0b20: 74 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  t.  If zFilename
0b30: 20 69 73 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e   is NULL, return
0b40: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
0b50: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a   most recently.*
0b60: 2a 20 73 74 61 74 2d 65 64 20 66 69 6c 65 2e 0a  * stat-ed file..
0b70: 2a 2f 0a 69 36 34 20 66 69 6c 65 5f 73 69 7a 65  */.i64 file_size
0b80: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
0b90: 6c 65 6e 61 6d 65 29 7b 0a 20 20 72 65 74 75 72  lename){.  retur
0ba0: 6e 20 67 65 74 53 74 61 74 28 7a 46 69 6c 65 6e  n getStat(zFilen
0bb0: 61 6d 65 2c 20 30 29 20 3f 20 2d 31 20 3a 20 66  ame, 0) ? -1 : f
0bc0: 69 6c 65 53 74 61 74 2e 73 74 5f 73 69 7a 65 3b  ileStat.st_size;
0bd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 6d 65 20 61  .}../*.** Same a
0be0: 73 20 66 69 6c 65 5f 73 69 7a 65 28 29 2c 20 62  s file_size(), b
0bf0: 75 74 20 74 61 6b 65 73 20 69 6e 74 6f 20 61 63  ut takes into ac
0c00: 63 6f 75 6e 74 20 73 79 6d 6c 69 6e 6b 73 2e 0a  count symlinks..
0c10: 2a 2f 0a 69 36 34 20 66 69 6c 65 5f 77 64 5f 73  */.i64 file_wd_s
0c20: 69 7a 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ize(const char *
0c30: 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 72 65  zFilename){.  re
0c40: 74 75 72 6e 20 67 65 74 53 74 61 74 28 7a 46 69  turn getStat(zFi
0c50: 6c 65 6e 61 6d 65 2c 20 31 29 20 3f 20 2d 31 20  lename, 1) ? -1 
0c60: 3a 20 66 69 6c 65 53 74 61 74 2e 73 74 5f 73 69  : fileStat.st_si
0c70: 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ze;.}../*.** Ret
0c80: 75 72 6e 20 74 68 65 20 6d 6f 64 69 66 69 63 61  urn the modifica
0c90: 74 69 6f 6e 20 74 69 6d 65 20 66 6f 72 20 61 20  tion time for a 
0ca0: 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31  file.  Return -1
0cb0: 20 69 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20   if the file.** 
0cc0: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20  does not exist. 
0cd0: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
0ce0: 20 4e 55 4c 4c 20 72 65 74 75 72 6e 20 74 68 65   NULL return the
0cf0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 6f 73   size of the mos
0d00: 74 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 73 74  t.** recently st
0d10: 61 74 2d 65 64 20 66 69 6c 65 2e 0a 2a 2f 0a 69  at-ed file..*/.i
0d20: 36 34 20 66 69 6c 65 5f 6d 74 69 6d 65 28 63 6f  64 file_mtime(co
0d30: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
0d40: 61 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 67  ame){.  return g
0d50: 65 74 53 74 61 74 28 7a 46 69 6c 65 6e 61 6d 65  etStat(zFilename
0d60: 2c 20 30 29 20 3f 20 2d 31 20 3a 20 66 69 6c 65  , 0) ? -1 : file
0d70: 53 74 61 74 2e 73 74 5f 6d 74 69 6d 65 3b 0a 7d  Stat.st_mtime;.}
0d80: 0a 0a 2f 2a 0a 2a 2a 20 53 61 6d 65 20 61 73 20  ../*.** Same as 
0d90: 66 69 6c 65 5f 6d 74 69 6d 65 28 29 2c 20 62 75  file_mtime(), bu
0da0: 74 20 74 61 6b 65 73 20 69 6e 74 6f 20 61 63 63  t takes into acc
0db0: 6f 75 6e 74 20 73 79 6d 6c 69 6e 6b 73 2e 0a 2a  ount symlinks..*
0dc0: 2f 0a 69 36 34 20 66 69 6c 65 5f 77 64 5f 6d 74  /.i64 file_wd_mt
0dd0: 69 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ime(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 2d 31 20  lename, 1) ? -1 
0e10: 3a 20 66 69 6c 65 53 74 61 74 2e 73 74 5f 6d 74  : fileStat.st_mt
0e20: 69 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ime;.}../*.** Re
0e30: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0e40: 20 6e 61 6d 65 64 20 66 69 6c 65 20 69 73 20 61   named file is a
0e50: 6e 20 6f 72 64 69 6e 61 72 79 20 66 69 6c 65 20  n ordinary file 
0e60: 6f 72 20 73 79 6d 6c 69 6e 6b 0a 2a 2a 20 61 6e  or symlink.** an
0e70: 64 20 73 79 6d 6c 69 6e 6b 73 20 61 72 65 20 61  d symlinks are a
0e80: 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 52 65 74 75 72  llowed..** Retur
0e90: 6e 20 66 61 6c 73 65 20 66 6f 72 20 64 69 72 65  n false for dire
0ea0: 63 74 6f 72 69 65 73 2c 20 64 65 76 69 63 65 73  ctories, devices
0eb0: 2c 20 66 69 66 6f 73 2c 20 65 74 63 2e 0a 2a 2f  , fifos, etc..*/
0ec0: 0a 69 6e 74 20 66 69 6c 65 5f 77 64 5f 69 73 66  .int file_wd_isf
0ed0: 69 6c 65 5f 6f 72 5f 6c 69 6e 6b 28 63 6f 6e 73  ile_or_link(cons
0ee0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
0ef0: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 65 74  e){.  return get
0f00: 53 74 61 74 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  Stat(zFilename, 
0f10: 31 29 20 3f 20 30 20 3a 20 53 5f 49 53 52 45 47  1) ? 0 : S_ISREG
0f20: 28 66 69 6c 65 53 74 61 74 2e 73 74 5f 6d 6f 64  (fileStat.st_mod
0f30: 65 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  e) ||.          
0f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f50: 20 20 20 20 20 20 20 20 20 20 20 53 5f 49 53 4c             S_ISL
0f60: 4e 4b 28 66 69 6c 65 53 74 61 74 2e 73 74 5f 6d  NK(fileStat.st_m
0f70: 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ode);.}../*.** R
0f80: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
0f90: 65 20 6e 61 6d 65 64 20 66 69 6c 65 20 69 73 20  e named file is 
0fa0: 61 6e 20 6f 72 64 69 6e 61 72 79 20 66 69 6c 65  an ordinary file
0fb0: 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 0a  .  Return false.
0fc0: 2a 2a 20 66 6f 72 20 64 69 72 65 63 74 6f 72 69  ** for directori
0fd0: 65 73 2c 20 64 65 76 69 63 65 73 2c 20 66 69 66  es, devices, fif
0fe0: 6f 73 2c 20 73 79 6d 6c 69 6e 6b 73 2c 20 65 74  os, symlinks, et
0ff0: 63 2e 0a 2a 2f 0a 69 6e 74 20 66 69 6c 65 5f 69  c..*/.int file_i
1000: 73 66 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72  sfile(const char
1010: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
1020: 72 65 74 75 72 6e 20 67 65 74 53 74 61 74 28 7a  return getStat(z
1030: 46 69 6c 65 6e 61 6d 65 2c 20 30 29 20 3f 20 30  Filename, 0) ? 0
1040: 20 3a 20 53 5f 49 53 52 45 47 28 66 69 6c 65 53   : S_ISREG(fileS
1050: 74 61 74 2e 73 74 5f 6d 6f 64 65 29 3b 0a 7d 0a  tat.st_mode);.}.
1060: 0a 2f 2a 0a 2a 2a 20 53 61 6d 65 20 61 73 20 66  ./*.** Same as f
1070: 69 6c 65 5f 69 73 66 69 6c 65 28 29 2c 20 62 75  ile_isfile(), bu
1080: 74 20 74 61 6b 65 73 20 69 6e 74 6f 20 61 63 63  t takes into acc
1090: 6f 75 6e 74 20 73 79 6d 6c 69 6e 6b 73 2e 0a 2a  ount symlinks..*
10a0: 2f 0a 69 6e 74 20 66 69 6c 65 5f 77 64 5f 69 73  /.int file_wd_is
10b0: 66 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20  file(const char 
10c0: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 72  *zFilename){.  r
10d0: 65 74 75 72 6e 20 67 65 74 53 74 61 74 28 7a 46  eturn getStat(zF
10e0: 69 6c 65 6e 61 6d 65 2c 20 31 29 20 3f 20 30 20  ilename, 1) ? 0 
10f0: 3a 20 53 5f 49 53 52 45 47 28 66 69 6c 65 53 74  : S_ISREG(fileSt
1100: 61 74 2e 73 74 5f 6d 6f 64 65 29 3b 0a 7d 0a 0a  at.st_mode);.}..
1110: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 73 79 6d  /*.** Create sym
1120: 6c 69 6e 6b 20 74 6f 20 66 69 6c 65 20 6f 6e 20  link to file on 
1130: 55 6e 69 78 2c 20 6f 72 20 70 6c 61 69 6e 2d 74  Unix, or plain-t
1140: 65 78 74 20 66 69 6c 65 20 77 69 74 68 0a 2a 2a  ext file with.**
1150: 20 73 79 6d 6c 69 6e 6b 20 74 61 72 67 65 74 20   symlink target 
1160: 69 66 20 22 61 6c 6c 6f 77 2d 73 79 6d 6c 69 6e  if "allow-symlin
1170: 6b 73 22 20 69 73 20 6f 66 66 20 6f 72 20 77 65  ks" is off or we
1180: 27 72 65 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 0a  're on Windows..
1190: 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 3a  **.** Arguments:
11a0: 20 74 61 72 67 65 74 20 66 69 6c 65 20 28 73 79   target file (sy
11b0: 6d 6c 69 6e 6b 20 77 69 6c 6c 20 70 6f 69 6e 74  mlink will point
11c0: 20 74 6f 20 69 74 29 2c 20 6c 69 6e 6b 20 66 69   to it), link fi
11d0: 6c 65 0a 2a 2a 2f 0a 76 6f 69 64 20 73 79 6d 6c  le.**/.void syml
11e0: 69 6e 6b 5f 63 72 65 61 74 65 28 63 6f 6e 73 74  ink_create(const
11f0: 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74 46 69   char *zTargetFi
1200: 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  le, const char *
1210: 7a 4c 69 6e 6b 46 69 6c 65 29 7b 0a 23 69 66 20  zLinkFile){.#if 
1220: 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29  !defined(_WIN32)
1230: 0a 20 20 69 66 28 20 67 2e 61 6c 6c 6f 77 53 79  .  if( g.allowSy
1240: 6d 6c 69 6e 6b 73 20 29 7b 0a 20 20 20 20 69 6e  mlinks ){.    in
1250: 74 20 69 2c 20 6e 4e 61 6d 65 3b 0a 20 20 20 20  t i, nName;.    
1260: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 7a 42 75  char *zName, zBu
1270: 66 5b 31 30 30 30 5d 3b 0a 0a 20 20 20 20 6e 4e  f[1000];..    nN
1280: 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4c 69  ame = strlen(zLi
1290: 6e 6b 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28  nkFile);.    if(
12a0: 20 6e 4e 61 6d 65 3e 3d 73 69 7a 65 6f 66 28 7a   nName>=sizeof(z
12b0: 42 75 66 29 20 29 7b 0a 20 20 20 20 20 20 7a 4e  Buf) ){.      zN
12c0: 61 6d 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 25  ame = mprintf("%
12d0: 73 22 2c 20 7a 4c 69 6e 6b 46 69 6c 65 29 3b 0a  s", zLinkFile);.
12e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12f0: 20 7a 4e 61 6d 65 20 3d 20 7a 42 75 66 3b 0a 20   zName = zBuf;. 
1300: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 4e 61 6d       memcpy(zNam
1310: 65 2c 20 7a 4c 69 6e 6b 46 69 6c 65 2c 20 6e 4e  e, zLinkFile, nN
1320: 61 6d 65 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  ame+1);.    }.  
1330: 20 20 6e 4e 61 6d 65 20 3d 20 66 69 6c 65 5f 73    nName = file_s
1340: 69 6d 70 6c 69 66 79 5f 6e 61 6d 65 28 7a 4e 61  implify_name(zNa
1350: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 30 29 3b 0a 20  me, nName, 0);. 
1360: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 4e     for(i=1; i<nN
1370: 61 6d 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ame; i++){.     
1380: 20 69 66 28 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 27   if( zName[i]=='
1390: 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4e  /' ){.        zN
13a0: 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  ame[i] = 0;.    
13b0: 20 20 20 20 20 20 69 66 28 20 66 69 6c 65 5f 6d        if( file_m
13c0: 6b 64 69 72 28 7a 4e 61 6d 65 2c 20 31 29 20 29  kdir(zName, 1) )
13d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  {.            fo
13e0: 73 73 69 6c 5f 66 61 74 61 6c 5f 72 65 63 75 72  ssil_fatal_recur
13f0: 73 69 76 65 28 22 75 6e 61 62 6c 65 20 74 6f 20  sive("unable to 
1400: 63 72 65 61 74 65 20 64 69 72 65 63 74 6f 72 79  create directory
1410: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
1420: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1430: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1440: 20 20 20 20 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d        zName[i] =
1450: 20 27 2f 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20   '/';.      }.  
1460: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d    }.    if( zNam
1470: 65 21 3d 7a 42 75 66 20 29 20 66 72 65 65 28 7a  e!=zBuf ) free(z
1480: 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 69 66 28 20  Name);..    if( 
1490: 73 79 6d 6c 69 6e 6b 28 7a 54 61 72 67 65 74 46  symlink(zTargetF
14a0: 69 6c 65 2c 20 7a 4e 61 6d 65 29 21 3d 30 20 29  ile, zName)!=0 )
14b0: 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66  {.      fossil_f
14c0: 61 74 61 6c 5f 72 65 63 75 72 73 69 76 65 28 22  atal_recursive("
14d0: 75 6e 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65  unable to create
14e0: 20 73 79 6d 6c 69 6e 6b 20 5c 22 25 73 5c 22 22   symlink \"%s\""
14f0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  , zName);.    }.
1500: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
1510: 20 7b 0a 20 20 20 20 42 6c 6f 62 20 63 6f 6e 74   {.    Blob cont
1520: 65 6e 74 3b 0a 20 20 20 20 62 6c 6f 62 5f 73 65  ent;.    blob_se
1530: 74 28 26 63 6f 6e 74 65 6e 74 2c 20 7a 54 61 72  t(&content, zTar
1540: 67 65 74 46 69 6c 65 29 3b 0a 20 20 20 20 62 6c  getFile);.    bl
1550: 6f 62 5f 77 72 69 74 65 5f 74 6f 5f 66 69 6c 65  ob_write_to_file
1560: 28 26 63 6f 6e 74 65 6e 74 2c 20 7a 4c 69 6e 6b  (&content, zLink
1570: 46 69 6c 65 29 3b 0a 20 20 20 20 62 6c 6f 62 5f  File);.    blob_
1580: 72 65 73 65 74 28 26 63 6f 6e 74 65 6e 74 29 3b  reset(&content);
1590: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
15a0: 70 79 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b  py symbolic link
15b0: 20 66 72 6f 6d 20 7a 46 72 6f 6d 20 74 6f 20 7a   from zFrom to z
15c0: 54 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 79 6d 6c  To..*/.void syml
15d0: 69 6e 6b 5f 63 6f 70 79 28 63 6f 6e 73 74 20 63  ink_copy(const c
15e0: 68 61 72 20 2a 7a 46 72 6f 6d 2c 20 63 6f 6e 73  har *zFrom, cons
15f0: 74 20 63 68 61 72 20 2a 7a 54 6f 29 7b 0a 20 20  t char *zTo){.  
1600: 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 3b 0a 20 20  Blob content;.  
1610: 62 6c 6f 62 5f 72 65 61 64 5f 6c 69 6e 6b 28 26  blob_read_link(&
1620: 63 6f 6e 74 65 6e 74 2c 20 7a 46 72 6f 6d 29 3b  content, zFrom);
1630: 0a 20 20 73 79 6d 6c 69 6e 6b 5f 63 72 65 61 74  .  symlink_creat
1640: 65 28 62 6c 6f 62 5f 73 74 72 28 26 63 6f 6e 74  e(blob_str(&cont
1650: 65 6e 74 29 2c 20 7a 54 6f 29 3b 0a 20 20 62 6c  ent), zTo);.  bl
1660: 6f 62 5f 72 65 73 65 74 28 26 63 6f 6e 74 65 6e  ob_reset(&conten
1670: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
1680: 75 72 6e 20 66 69 6c 65 20 70 65 72 6d 69 73 73  urn file permiss
1690: 69 6f 6e 73 20 28 6e 6f 72 6d 61 6c 2c 20 65 78  ions (normal, ex
16a0: 65 63 75 74 61 62 6c 65 2c 20 6f 72 20 73 79 6d  ecutable, or sym
16b0: 6c 69 6e 6b 29 3a 0a 2a 2a 20 20 20 2d 20 50 45  link):.**   - PE
16c0: 52 4d 5f 45 58 45 20 69 66 20 66 69 6c 65 20 69  RM_EXE if file i
16d0: 73 20 65 78 65 63 75 74 61 62 6c 65 3b 0a 2a 2a  s executable;.**
16e0: 20 20 20 2d 20 50 45 52 4d 5f 4c 4e 4b 20 6f 6e     - PERM_LNK on
16f0: 20 55 6e 69 78 20 69 66 20 66 69 6c 65 20 69 73   Unix if file is
1700: 20 73 79 6d 6c 69 6e 6b 20 61 6e 64 20 61 6c 6c   symlink and all
1710: 6f 77 2d 73 79 6d 6c 69 6e 6b 73 20 6f 70 74 69  ow-symlinks opti
1720: 6f 6e 20 69 73 20 6f 6e 3b 0a 2a 2a 20 20 20 2d  on is on;.**   -
1730: 20 50 45 52 4d 5f 52 45 47 20 66 6f 72 20 61 6c   PERM_REG for al
1740: 6c 20 6f 74 68 65 72 20 63 61 73 65 73 20 28 72  l other cases (r
1750: 65 67 75 6c 61 72 20 66 69 6c 65 2c 20 64 69 72  egular file, dir
1760: 65 63 74 6f 72 79 2c 20 66 69 66 6f 2c 20 65 74  ectory, fifo, et
1770: 63 29 2e 0a 2a 2f 0a 69 6e 74 20 66 69 6c 65 5f  c)..*/.int file_
1780: 77 64 5f 70 65 72 6d 28 63 6f 6e 73 74 20 63 68  wd_perm(const ch
1790: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
17a0: 20 20 69 66 28 20 67 65 74 53 74 61 74 28 7a 46    if( getStat(zF
17b0: 69 6c 65 6e 61 6d 65 2c 20 31 29 20 29 20 72 65  ilename, 1) ) re
17c0: 74 75 72 6e 20 50 45 52 4d 5f 52 45 47 3b 0a 23  turn PERM_REG;.#
17d0: 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  if defined(_WIN3
17e0: 32 29 0a 23 20 20 69 66 6e 64 65 66 20 53 5f 49  2).#  ifndef S_I
17f0: 58 55 53 52 0a 23 20 20 20 20 64 65 66 69 6e 65  XUSR.#    define
1800: 20 53 5f 49 58 55 53 52 20 20 5f 53 5f 49 45 58   S_IXUSR  _S_IEX
1810: 45 43 0a 23 20 20 65 6e 64 69 66 0a 20 20 69 66  EC.#  endif.  if
1820: 28 20 53 5f 49 53 52 45 47 28 66 69 6c 65 53 74  ( S_ISREG(fileSt
1830: 61 74 2e 73 74 5f 6d 6f 64 65 29 20 26 26 20 28  at.st_mode) && (
1840: 28 53 5f 49 58 55 53 52 29 26 66 69 6c 65 53 74  (S_IXUSR)&fileSt
1850: 61 74 2e 73 74 5f 6d 6f 64 65 29 21 3d 30 20 29  at.st_mode)!=0 )
1860: 0a 20 20 20 20 72 65 74 75 72 6e 20 50 45 52 4d  .    return PERM
1870: 5f 45 58 45 3b 0a 20 20 65 6c 73 65 0a 20 20 20  _EXE;.  else.   
1880: 20 72 65 74 75 72 6e 20 50 45 52 4d 5f 52 45 47   return PERM_REG
1890: 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 53 5f  ;.#else.  if( S_
18a0: 49 53 52 45 47 28 66 69 6c 65 53 74 61 74 2e 73  ISREG(fileStat.s
18b0: 74 5f 6d 6f 64 65 29 20 26 26 0a 20 20 20 20 20  t_mode) &&.     
18c0: 20 28 28 53 5f 49 58 55 53 52 7c 53 5f 49 58 47   ((S_IXUSR|S_IXG
18d0: 52 50 7c 53 5f 49 58 4f 54 48 29 26 66 69 6c 65  RP|S_IXOTH)&file
18e0: 53 74 61 74 2e 73 74 5f 6d 6f 64 65 29 21 3d 30  Stat.st_mode)!=0
18f0: 20 29 0a 20 20 20 20 72 65 74 75 72 6e 20 50 45   ).    return PE
1900: 52 4d 5f 45 58 45 3b 0a 20 20 65 6c 73 65 20 69  RM_EXE;.  else i
1910: 66 28 20 67 2e 61 6c 6c 6f 77 53 79 6d 6c 69 6e  f( g.allowSymlin
1920: 6b 73 20 26 26 20 53 5f 49 53 4c 4e 4b 28 66 69  ks && S_ISLNK(fi
1930: 6c 65 53 74 61 74 2e 73 74 5f 6d 6f 64 65 29 20  leStat.st_mode) 
1940: 29 0a 20 20 20 20 72 65 74 75 72 6e 20 50 45 52  ).    return PER
1950: 4d 5f 4c 4e 4b 3b 0a 20 20 65 6c 73 65 0a 20 20  M_LNK;.  else.  
1960: 20 20 72 65 74 75 72 6e 20 50 45 52 4d 5f 52 45    return PERM_RE
1970: 47 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  G;.#endif.}../*.
1980: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
1990: 66 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65  f the named file
19a0: 20 69 73 20 61 6e 20 65 78 65 63 75 74 61 62 6c   is an executabl
19b0: 65 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  e.  Return false
19c0: 0a 2a 2a 20 66 6f 72 20 64 69 72 65 63 74 6f 72  .** for director
19d0: 69 65 73 2c 20 64 65 76 69 63 65 73 2c 20 66 69  ies, devices, fi
19e0: 66 6f 73 2c 20 73 79 6d 6c 69 6e 6b 73 2c 20 65  fos, symlinks, e
19f0: 74 63 2e 0a 2a 2f 0a 69 6e 74 20 66 69 6c 65 5f  tc..*/.int file_
1a00: 77 64 5f 69 73 65 78 65 28 63 6f 6e 73 74 20 63  wd_isexe(const c
1a10: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
1a20: 0a 20 20 72 65 74 75 72 6e 20 66 69 6c 65 5f 77  .  return file_w
1a30: 64 5f 70 65 72 6d 28 7a 46 69 6c 65 6e 61 6d 65  d_perm(zFilename
1a40: 29 3d 3d 50 45 52 4d 5f 45 58 45 3b 0a 7d 0a 0a  )==PERM_EXE;.}..
1a50: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
1a60: 45 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 66  E if the named f
1a70: 69 6c 65 20 69 73 20 61 20 73 79 6d 6c 69 6e 6b  ile is a symlink
1a80: 20 61 6e 64 20 73 79 6d 6c 69 6e 6b 73 20 61 72   and symlinks ar
1a90: 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 52 65  e allowed..** Re
1aa0: 74 75 72 6e 20 66 61 6c 73 65 20 66 6f 72 20 61  turn false for a
1ab0: 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a  ll other cases..
1ac0: 2a 2a 0a 2a 2a 20 4f 6e 20 57 69 6e 64 6f 77 73  **.** On Windows
1ad0: 2c 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20  , always return 
1ae0: 46 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20 66 69  False..*/.int fi
1af0: 6c 65 5f 77 64 5f 69 73 6c 69 6e 6b 28 63 6f 6e  le_wd_islink(con
1b00: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1b10: 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 69  me){.  return fi
1b20: 6c 65 5f 77 64 5f 70 65 72 6d 28 7a 46 69 6c 65  le_wd_perm(zFile
1b30: 6e 61 6d 65 29 3d 3d 50 45 52 4d 5f 4c 4e 4b 3b  name)==PERM_LNK;
1b40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1b50: 20 31 20 69 66 20 7a 46 69 6c 65 6e 61 6d 65 20   1 if zFilename 
1b60: 69 73 20 61 20 64 69 72 65 63 74 6f 72 79 2e 20  is a directory. 
1b70: 20 52 65 74 75 72 6e 20 30 20 69 66 20 7a 46 69   Return 0 if zFi
1b80: 6c 65 6e 61 6d 65 0a 2a 2a 20 64 6f 65 73 20 6e  lename.** does n
1b90: 6f 74 20 65 78 69 73 74 2e 20 20 52 65 74 75 72  ot exist.  Retur
1ba0: 6e 20 32 20 69 66 20 7a 46 69 6c 65 6e 61 6d 65  n 2 if zFilename
1bb0: 20 65 78 69 73 74 73 20 62 75 74 20 69 73 20 73   exists but is s
1bc0: 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 74 68 65  omething.** othe
1bd0: 72 20 74 68 61 6e 20 61 20 64 69 72 65 63 74 6f  r than a directo
1be0: 72 79 2e 0a 2a 2f 0a 69 6e 74 20 66 69 6c 65 5f  ry..*/.int file_
1bf0: 69 73 64 69 72 28 63 6f 6e 73 74 20 63 68 61 72  isdir(const char
1c00: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
1c10: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 7a  int rc;..  if( z
1c20: 46 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Filename ){.    
1c30: 63 68 61 72 20 2a 7a 46 4e 20 3d 20 6d 70 72 69  char *zFN = mpri
1c40: 6e 74 66 28 22 25 73 22 2c 20 7a 46 69 6c 65 6e  ntf("%s", zFilen
1c50: 61 6d 65 29 3b 0a 20 20 20 20 66 69 6c 65 5f 73  ame);.    file_s
1c60: 69 6d 70 6c 69 66 79 5f 6e 61 6d 65 28 7a 46 4e  implify_name(zFN
1c70: 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 72 63  , -1, 0);.    rc
1c80: 20 3d 20 67 65 74 53 74 61 74 28 7a 46 4e 2c 20   = getStat(zFN, 
1c90: 30 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 46 4e  0);.    free(zFN
1ca0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1cb0: 72 63 20 3d 20 67 65 74 53 74 61 74 28 30 2c 20  rc = getStat(0, 
1cc0: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
1cd0: 20 72 63 20 3f 20 30 20 3a 20 28 53 5f 49 53 44   rc ? 0 : (S_ISD
1ce0: 49 52 28 66 69 6c 65 53 74 61 74 2e 73 74 5f 6d  IR(fileStat.st_m
1cf0: 6f 64 65 29 20 3f 20 31 20 3a 20 32 29 3b 0a 7d  ode) ? 1 : 2);.}
1d00: 0a 0a 2f 2a 0a 2a 2a 20 53 61 6d 65 20 61 73 20  ../*.** Same as 
1d10: 66 69 6c 65 5f 69 73 64 69 72 28 29 2c 20 62 75  file_isdir(), bu
1d20: 74 20 74 61 6b 65 73 20 69 6e 74 6f 20 61 63 63  t takes into acc
1d30: 6f 75 6e 74 20 73 79 6d 6c 69 6e 6b 73 2e 0a 2a  ount symlinks..*
1d40: 2f 0a 69 6e 74 20 66 69 6c 65 5f 77 64 5f 69 73  /.int file_wd_is
1d50: 64 69 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  dir(const char *
1d60: 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e  zFilename){.  in
1d70: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 7a 46 69  t rc;..  if( zFi
1d80: 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 63 68  lename ){.    ch
1d90: 61 72 20 2a 7a 46 4e 20 3d 20 6d 70 72 69 6e 74  ar *zFN = mprint
1da0: 66 28 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d  f("%s", zFilenam
1db0: 65 29 3b 0a 20 20 20 20 66 69 6c 65 5f 73 69 6d  e);.    file_sim
1dc0: 70 6c 69 66 79 5f 6e 61 6d 65 28 7a 46 4e 2c 20  plify_name(zFN, 
1dd0: 2d 31 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d  -1, 0);.    rc =
1de0: 20 67 65 74 53 74 61 74 28 7a 46 4e 2c 20 31 29   getStat(zFN, 1)
1df0: 3b 0a 20 20 20 20 66 72 65 65 28 7a 46 4e 29 3b  ;.    free(zFN);
1e00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1e10: 20 3d 20 67 65 74 53 74 61 74 28 30 2c 20 31 29   = getStat(0, 1)
1e20: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1e30: 63 20 3f 20 30 20 3a 20 28 53 5f 49 53 44 49 52  c ? 0 : (S_ISDIR
1e40: 28 66 69 6c 65 53 74 61 74 2e 73 74 5f 6d 6f 64  (fileStat.st_mod
1e50: 65 29 20 3f 20 31 20 3a 20 32 29 3b 0a 7d 0a 0a  e) ? 1 : 2);.}..
1e60: 0a 2f 2a 0a 2a 2a 20 57 72 61 70 70 65 72 20 61  ./*.** Wrapper a
1e70: 72 6f 75 6e 64 20 74 68 65 20 61 63 63 65 73 73  round the access
1e80: 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a  () system call..
1e90: 2a 2f 0a 69 6e 74 20 66 69 6c 65 5f 61 63 63 65  */.int file_acce
1ea0: 73 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ss(const char *z
1eb0: 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 66 6c  Filename, int fl
1ec0: 61 67 73 29 7b 0a 23 69 66 64 65 66 20 5f 57 49  ags){.#ifdef _WI
1ed0: 4e 33 32 0a 20 20 77 63 68 61 72 5f 74 20 2a 7a  N32.  wchar_t *z
1ee0: 4d 62 63 73 20 3d 20 66 6f 73 73 69 6c 5f 75 74  Mbcs = fossil_ut
1ef0: 66 38 5f 74 6f 5f 66 69 6c 65 6e 61 6d 65 28 7a  f8_to_filename(z
1f00: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 6e 74  Filename);.  int
1f10: 20 72 63 20 3d 20 5f 77 61 63 63 65 73 73 28 7a   rc = _waccess(z
1f20: 4d 62 63 73 2c 20 66 6c 61 67 73 29 3b 0a 23 65  Mbcs, flags);.#e
1f30: 6c 73 65 0a 20 20 63 68 61 72 20 2a 7a 4d 62 63  lse.  char *zMbc
1f40: 73 20 3d 20 66 6f 73 73 69 6c 5f 75 74 66 38 5f  s = fossil_utf8_
1f50: 74 6f 5f 66 69 6c 65 6e 61 6d 65 28 7a 46 69 6c  to_filename(zFil
1f60: 65 6e 61 6d 65 29 3b 0a 20 20 69 6e 74 20 72 63  ename);.  int rc
1f70: 20 3d 20 61 63 63 65 73 73 28 7a 4d 62 63 73 2c   = access(zMbcs,
1f80: 20 66 6c 61 67 73 29 3b 0a 23 65 6e 64 69 66 0a   flags);.#endif.
1f90: 20 20 66 6f 73 73 69 6c 5f 66 69 6c 65 6e 61 6d    fossil_filenam
1fa0: 65 5f 66 72 65 65 28 7a 4d 62 63 73 29 3b 0a 20  e_free(zMbcs);. 
1fb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1fc0: 2a 0a 2a 2a 20 46 69 6e 64 20 61 6e 20 75 6e 75  *.** Find an unu
1fd0: 73 65 64 20 66 69 6c 65 6e 61 6d 65 20 73 69 6d  sed filename sim
1fe0: 69 6c 61 72 20 74 6f 20 7a 42 61 73 65 20 77 69  ilar to zBase wi
1ff0: 74 68 20 7a 53 75 66 66 69 78 20 61 70 70 65 6e  th zSuffix appen
2000: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20  ded..**.** Make 
2010: 74 68 65 20 6e 61 6d 65 20 72 65 6c 61 74 69 76  the name relativ
2020: 65 20 74 6f 20 74 68 65 20 77 6f 72 6b 69 6e 67  e to the working
2030: 20 64 69 72 65 63 74 6f 72 79 20 69 66 20 72 65   directory if re
2040: 6c 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a  lFlag is true..*
2050: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
2060: 6c 64 20 74 68 65 20 6e 65 77 20 66 69 6c 65 6e  ld the new filen
2070: 61 6d 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ame is obtained 
2080: 66 6f 72 6d 20 6d 70 72 69 6e 74 66 28 29 20 61  form mprintf() a
2090: 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nd should.** be 
20a0: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
20b0: 6c 65 72 2e 0a 2a 2f 0a 63 68 61 72 20 2a 66 69  ler..*/.char *fi
20c0: 6c 65 5f 6e 65 77 6e 61 6d 65 28 63 6f 6e 73 74  le_newname(const
20d0: 20 63 68 61 72 20 2a 7a 42 61 73 65 2c 20 63 6f   char *zBase, co
20e0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 75 66 66 69  nst char *zSuffi
20f0: 78 2c 20 69 6e 74 20 72 65 6c 46 6c 61 67 29 7b  x, int relFlag){
2100: 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a  .  char *z = 0;.
2110: 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
2120: 20 7a 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 73   z = mprintf("%s
2130: 2d 25 73 22 2c 20 7a 42 61 73 65 2c 20 7a 53 75  -%s", zBase, zSu
2140: 66 66 69 78 29 3b 0a 20 20 77 68 69 6c 65 28 20  ffix);.  while( 
2150: 66 69 6c 65 5f 73 69 7a 65 28 7a 29 3e 3d 30 20  file_size(z)>=0 
2160: 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 72  ){.    fossil_fr
2170: 65 65 28 7a 29 3b 0a 20 20 20 20 7a 20 3d 20 6d  ee(z);.    z = m
2180: 70 72 69 6e 74 66 28 22 25 73 2d 25 73 2d 25 64  printf("%s-%s-%d
2190: 22 2c 20 7a 42 61 73 65 2c 20 7a 53 75 66 66 69  ", zBase, zSuffi
21a0: 78 2c 20 63 6e 74 2b 2b 29 3b 0a 20 20 7d 0a 20  x, cnt++);.  }. 
21b0: 20 69 66 28 20 72 65 6c 46 6c 61 67 20 29 7b 0a   if( relFlag ){.
21c0: 20 20 20 20 42 6c 6f 62 20 78 3b 0a 20 20 20 20      Blob x;.    
21d0: 66 69 6c 65 5f 72 65 6c 61 74 69 76 65 5f 6e 61  file_relative_na
21e0: 6d 65 28 7a 2c 20 26 78 2c 20 30 29 3b 0a 20 20  me(z, &x, 0);.  
21f0: 20 20 66 6f 73 73 69 6c 5f 66 72 65 65 28 7a 29    fossil_free(z)
2200: 3b 0a 20 20 20 20 7a 20 3d 20 62 6c 6f 62 5f 73  ;.    z = blob_s
2210: 74 72 28 26 78 29 3b 0a 20 20 7d 0a 20 20 72 65  tr(&x);.  }.  re
2220: 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn z;.}../*.**
2230: 20 52 65 74 75 72 6e 20 74 68 65 20 74 61 69 6c   Return the tail
2240: 20 6f 66 20 61 20 66 69 6c 65 20 70 61 74 68 6e   of a file pathn
2250: 61 6d 65 2e 20 20 54 68 65 20 74 61 69 6c 20 69  ame.  The tail i
2260: 73 20 74 68 65 20 6c 61 73 74 20 63 6f 6d 70 6f  s the last compo
2270: 6e 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20 70  nent.** of the p
2280: 61 74 68 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ath.  For exampl
2290: 65 2c 20 74 68 65 20 74 61 69 6c 20 6f 66 20 22  e, the tail of "
22a0: 2f 61 2f 62 2f 63 2e 64 22 20 69 73 20 22 63 2e  /a/b/c.d" is "c.
22b0: 64 22 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  d"..*/.const cha
22c0: 72 20 2a 66 69 6c 65 5f 74 61 69 6c 28 63 6f 6e  r *file_tail(con
22d0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63  st char *z){.  c
22e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c  onst char *zTail
22f0: 20 3d 20 7a 3b 0a 20 20 77 68 69 6c 65 28 20 7a   = z;.  while( z
2300: 5b 30 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  [0] ){.    if( z
2310: 5b 30 5d 3d 3d 27 2f 27 20 29 20 7a 54 61 69 6c  [0]=='/' ) zTail
2320: 20 3d 20 26 7a 5b 31 5d 3b 0a 20 20 20 20 7a 2b   = &z[1];.    z+
2330: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
2340: 7a 54 61 69 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zTail;.}../*.** 
2350: 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74  Copy the content
2360: 20 6f 66 20 61 20 66 69 6c 65 20 66 72 6f 6d 20   of a file from 
2370: 6f 6e 65 20 70 6c 61 63 65 20 74 6f 20 61 6e 6f  one place to ano
2380: 74 68 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 66 69  ther..*/.void fi
2390: 6c 65 5f 63 6f 70 79 28 63 6f 6e 73 74 20 63 68  le_copy(const ch
23a0: 61 72 20 2a 7a 46 72 6f 6d 2c 20 63 6f 6e 73 74  ar *zFrom, const
23b0: 20 63 68 61 72 20 2a 7a 54 6f 29 7b 0a 20 20 46   char *zTo){.  F
23c0: 49 4c 45 20 2a 69 6e 2c 20 2a 6f 75 74 3b 0a 20  ILE *in, *out;. 
23d0: 20 69 6e 74 20 67 6f 74 3b 0a 20 20 63 68 61 72   int got;.  char
23e0: 20 7a 42 75 66 5b 38 31 39 32 5d 3b 0a 20 20 69   zBuf[8192];.  i
23f0: 6e 20 3d 20 66 6f 73 73 69 6c 5f 66 6f 70 65 6e  n = fossil_fopen
2400: 28 7a 46 72 6f 6d 2c 20 22 72 62 22 29 3b 0a 20  (zFrom, "rb");. 
2410: 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 66 6f 73   if( in==0 ) fos
2420: 73 69 6c 5f 66 61 74 61 6c 28 22 63 61 6e 6e 6f  sil_fatal("canno
2430: 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20 66 6f  t open \"%s\" fo
2440: 72 20 72 65 61 64 69 6e 67 22 2c 20 7a 46 72 6f  r reading", zFro
2450: 6d 29 3b 0a 20 20 6f 75 74 20 3d 20 66 6f 73 73  m);.  out = foss
2460: 69 6c 5f 66 6f 70 65 6e 28 7a 54 6f 2c 20 22 77  il_fopen(zTo, "w
2470: 62 22 29 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d  b");.  if( out==
2480: 30 20 29 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c  0 ) fossil_fatal
2490: 28 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22  ("cannot open \"
24a0: 25 73 5c 22 20 66 6f 72 20 77 72 69 74 69 6e 67  %s\" for writing
24b0: 22 2c 20 7a 54 6f 29 3b 0a 20 20 77 68 69 6c 65  ", zTo);.  while
24c0: 28 20 28 67 6f 74 3d 66 72 65 61 64 28 7a 42 75  ( (got=fread(zBu
24d0: 66 2c 20 31 2c 20 73 69 7a 65 6f 66 28 7a 42 75  f, 1, sizeof(zBu
24e0: 66 29 2c 20 69 6e 29 29 3e 30 20 29 7b 0a 20 20  f), in))>0 ){.  
24f0: 20 20 66 77 72 69 74 65 28 7a 42 75 66 2c 20 31    fwrite(zBuf, 1
2500: 2c 20 67 6f 74 2c 20 6f 75 74 29 3b 0a 20 20 7d  , got, out);.  }
2510: 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20  .  fclose(in);. 
2520: 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 7d 0a   fclose(out);.}.
2530: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63 6c  ./*.** Set or cl
2540: 65 61 72 20 74 68 65 20 65 78 65 63 75 74 65 20  ear the execute 
2550: 62 69 74 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20  bit on a file.  
2560: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
2570: 20 63 68 61 6e 67 65 0a 2a 2a 20 6f 63 63 75 72   change.** occur
2580: 72 65 64 20 61 6e 64 20 66 61 6c 73 65 20 69 66  red and false if
2590: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
25a0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74   a no-op..*/.int
25b0: 20 66 69 6c 65 5f 77 64 5f 73 65 74 65 78 65 28   file_wd_setexe(
25c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
25d0: 65 6e 61 6d 65 2c 20 69 6e 74 20 6f 6e 6f 66 66  ename, int onoff
25e0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
25f0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 57  .#if !defined(_W
2600: 49 4e 33 32 29 0a 20 20 73 74 72 75 63 74 20 73  IN32).  struct s
2610: 74 61 74 20 62 75 66 3b 0a 20 20 69 66 28 20 66  tat buf;.  if( f
2620: 6f 73 73 69 6c 5f 73 74 61 74 28 7a 46 69 6c 65  ossil_stat(zFile
2630: 6e 61 6d 65 2c 20 26 62 75 66 2c 20 31 29 21 3d  name, &buf, 1)!=
2640: 30 20 7c 7c 20 53 5f 49 53 4c 4e 4b 28 62 75 66  0 || S_ISLNK(buf
2650: 2e 73 74 5f 6d 6f 64 65 29 20 29 20 72 65 74 75  .st_mode) ) retu
2660: 72 6e 20 30 3b 0a 20 20 69 66 28 20 6f 6e 6f 66  rn 0;.  if( onof
2670: 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 61 72  f ){.    int tar
2680: 67 65 74 4d 6f 64 65 20 3d 20 28 62 75 66 2e 73  getMode = (buf.s
2690: 74 5f 6d 6f 64 65 20 26 20 30 34 34 34 29 3e 3e  t_mode & 0444)>>
26a0: 32 3b 0a 20 20 20 20 69 66 28 20 28 62 75 66 2e  2;.    if( (buf.
26b0: 73 74 5f 6d 6f 64 65 20 26 20 30 31 31 31 29 21  st_mode & 0111)!
26c0: 3d 74 61 72 67 65 74 4d 6f 64 65 20 29 7b 0a 20  =targetMode ){. 
26d0: 20 20 20 20 20 63 68 6d 6f 64 28 7a 46 69 6c 65       chmod(zFile
26e0: 6e 61 6d 65 2c 20 62 75 66 2e 73 74 5f 6d 6f 64  name, buf.st_mod
26f0: 65 20 7c 20 74 61 72 67 65 74 4d 6f 64 65 29 3b  e | targetMode);
2700: 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
2710: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2720: 20 20 69 66 28 20 28 62 75 66 2e 73 74 5f 6d 6f    if( (buf.st_mo
2730: 64 65 20 26 20 30 31 31 31 29 21 3d 30 20 29 7b  de & 0111)!=0 ){
2740: 0a 20 20 20 20 20 20 63 68 6d 6f 64 28 7a 46 69  .      chmod(zFi
2750: 6c 65 6e 61 6d 65 2c 20 62 75 66 2e 73 74 5f 6d  lename, buf.st_m
2760: 6f 64 65 20 26 20 7e 30 31 31 31 29 3b 0a 20 20  ode & ~0111);.  
2770: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2780: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
2790: 5f 57 49 4e 33 32 20 2a 2f 0a 20 20 72 65 74 75  _WIN32 */.  retu
27a0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
27b0: 53 65 74 20 74 68 65 20 6d 74 69 6d 65 20 66 6f  Set the mtime fo
27c0: 72 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69  r a file..*/.voi
27d0: 64 20 66 69 6c 65 5f 73 65 74 5f 6d 74 69 6d 65  d file_set_mtime
27e0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
27f0: 6c 65 6e 61 6d 65 2c 20 69 36 34 20 6e 65 77 4d  lename, i64 newM
2800: 54 69 6d 65 29 7b 0a 23 69 66 20 21 64 65 66 69  Time){.#if !defi
2810: 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20 20 73 74  ned(_WIN32).  st
2820: 72 75 63 74 20 74 69 6d 65 76 61 6c 20 74 76 5b  ruct timeval tv[
2830: 32 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 74 76 2c  2];.  memset(tv,
2840: 20 30 2c 20 73 69 7a 65 6f 66 28 74 76 5b 30 5d   0, sizeof(tv[0]
2850: 29 2a 32 29 3b 0a 20 20 74 76 5b 30 5d 2e 74 76  )*2);.  tv[0].tv
2860: 5f 73 65 63 20 3d 20 6e 65 77 4d 54 69 6d 65 3b  _sec = newMTime;
2870: 0a 20 20 74 76 5b 31 5d 2e 74 76 5f 73 65 63 20  .  tv[1].tv_sec 
2880: 3d 20 6e 65 77 4d 54 69 6d 65 3b 0a 20 20 63 68  = newMTime;.  ch
2890: 61 72 20 2a 7a 4d 62 63 73 20 3d 20 66 6f 73 73  ar *zMbcs = foss
28a0: 69 6c 5f 75 74 66 38 5f 74 6f 5f 66 69 6c 65 6e  il_utf8_to_filen
28b0: 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
28c0: 20 20 75 74 69 6d 65 73 28 7a 4d 62 63 73 2c 20    utimes(zMbcs, 
28d0: 74 76 29 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72  tv);.#else.  str
28e0: 75 63 74 20 5f 75 74 69 6d 62 75 66 20 74 62 3b  uct _utimbuf tb;
28f0: 0a 20 20 77 63 68 61 72 5f 74 20 2a 7a 4d 62 63  .  wchar_t *zMbc
2900: 73 20 3d 20 66 6f 73 73 69 6c 5f 75 74 66 38 5f  s = fossil_utf8_
2910: 74 6f 5f 66 69 6c 65 6e 61 6d 65 28 7a 46 69 6c  to_filename(zFil
2920: 65 6e 61 6d 65 29 3b 0a 20 20 74 62 2e 61 63 74  ename);.  tb.act
2930: 69 6d 65 20 3d 20 6e 65 77 4d 54 69 6d 65 3b 0a  ime = newMTime;.
2940: 20 20 74 62 2e 6d 6f 64 74 69 6d 65 20 3d 20 6e    tb.modtime = n
2950: 65 77 4d 54 69 6d 65 3b 0a 20 20 5f 77 75 74 69  ewMTime;.  _wuti
2960: 6d 65 28 7a 4d 62 63 73 2c 20 26 74 62 29 3b 0a  me(zMbcs, &tb);.
2970: 23 65 6e 64 69 66 0a 20 20 66 6f 73 73 69 6c 5f  #endif.  fossil_
2980: 66 69 6c 65 6e 61 6d 65 5f 66 72 65 65 28 7a 4d  filename_free(zM
2990: 62 63 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  bcs);.}../*.** C
29a0: 4f 4d 4d 41 4e 44 3a 20 74 65 73 74 2d 73 65 74  OMMAND: test-set
29b0: 2d 6d 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 55 73 61  -mtime.**.** Usa
29c0: 67 65 3a 20 25 66 6f 73 73 69 6c 20 74 65 73 74  ge: %fossil test
29d0: 2d 73 65 74 2d 6d 74 69 6d 65 20 46 49 4c 45 4e  -set-mtime FILEN
29e0: 41 4d 45 20 44 41 54 45 2f 54 49 4d 45 0a 2a 2a  AME DATE/TIME.**
29f0: 0a 2a 2a 20 53 65 74 73 20 74 68 65 20 6d 74 69  .** Sets the mti
2a00: 6d 65 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20  me of the named 
2a10: 66 69 6c 65 20 74 6f 20 74 68 65 20 64 61 74 65  file to the date
2a20: 2f 74 69 6d 65 20 73 68 6f 77 6e 2e 0a 2a 2f 0a  /time shown..*/.
2a30: 76 6f 69 64 20 74 65 73 74 5f 73 65 74 5f 6d 74  void test_set_mt
2a40: 69 6d 65 28 76 6f 69 64 29 7b 0a 20 20 63 6f 6e  ime(void){.  con
2a50: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a  st char *zFile;.
2a60: 20 20 63 68 61 72 20 2a 7a 44 61 74 65 3b 0a 20    char *zDate;. 
2a70: 20 69 36 34 20 69 4d 54 69 6d 65 3b 0a 20 20 69   i64 iMTime;.  i
2a80: 66 28 20 67 2e 61 72 67 63 21 3d 34 20 29 7b 0a  f( g.argc!=4 ){.
2a90: 20 20 20 20 75 73 61 67 65 28 22 74 65 73 74 2d      usage("test-
2aa0: 73 65 74 2d 6d 74 69 6d 65 20 46 49 4c 45 4e 41  set-mtime FILENA
2ab0: 4d 45 20 44 41 54 45 2f 54 49 4d 45 22 29 3b 0a  ME DATE/TIME");.
2ac0: 20 20 7d 0a 20 20 64 62 5f 6f 70 65 6e 5f 6f 72    }.  db_open_or
2ad0: 5f 61 74 74 61 63 68 28 22 3a 6d 65 6d 6f 72 79  _attach(":memory
2ae0: 3a 22 2c 20 22 6d 65 6d 22 2c 20 30 29 3b 0a 20  :", "mem", 0);. 
2af0: 20 69 4d 54 69 6d 65 20 3d 20 64 62 5f 69 6e 74   iMTime = db_int
2b00: 36 34 28 30 2c 20 22 53 45 4c 45 43 54 20 73 74  64(0, "SELECT st
2b10: 72 66 74 69 6d 65 28 27 25 25 73 27 2c 25 51 29  rftime('%%s',%Q)
2b20: 22 2c 20 67 2e 61 72 67 76 5b 33 5d 29 3b 0a 20  ", g.argv[3]);. 
2b30: 20 7a 46 69 6c 65 20 3d 20 67 2e 61 72 67 76 5b   zFile = g.argv[
2b40: 32 5d 3b 0a 20 20 66 69 6c 65 5f 73 65 74 5f 6d  2];.  file_set_m
2b50: 74 69 6d 65 28 7a 46 69 6c 65 2c 20 69 4d 54 69  time(zFile, iMTi
2b60: 6d 65 29 3b 0a 20 20 69 4d 54 69 6d 65 20 3d 20  me);.  iMTime = 
2b70: 66 69 6c 65 5f 77 64 5f 6d 74 69 6d 65 28 7a 46  file_wd_mtime(zF
2b80: 69 6c 65 29 3b 0a 20 20 7a 44 61 74 65 20 3d 20  ile);.  zDate = 
2b90: 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45  db_text(0, "SELE
2ba0: 43 54 20 64 61 74 65 74 69 6d 65 28 25 6c 6c 64  CT datetime(%lld
2bb0: 2c 20 27 75 6e 69 78 65 70 6f 63 68 27 29 22 2c  , 'unixepoch')",
2bc0: 20 69 4d 54 69 6d 65 29 3b 0a 20 20 66 6f 73 73   iMTime);.  foss
2bd0: 69 6c 5f 70 72 69 6e 74 28 22 53 65 74 20 6d 74  il_print("Set mt
2be0: 69 6d 65 20 6f 66 20 5c 22 25 73 5c 22 20 74 6f  ime of \"%s\" to
2bf0: 20 25 73 20 28 25 6c 6c 64 29 5c 6e 22 2c 20 7a   %s (%lld)\n", z
2c00: 46 69 6c 65 2c 20 7a 44 61 74 65 2c 20 69 4d 54  File, zDate, iMT
2c10: 69 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ime);.}../*.** D
2c20: 65 6c 65 74 65 20 61 20 66 69 6c 65 2e 0a 2a 2f  elete a file..*/
2c30: 0a 76 6f 69 64 20 66 69 6c 65 5f 64 65 6c 65 74  .void file_delet
2c40: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
2c50: 69 6c 65 6e 61 6d 65 29 7b 0a 23 69 66 64 65 66  ilename){.#ifdef
2c60: 20 5f 57 49 4e 33 32 0a 20 20 77 63 68 61 72 5f   _WIN32.  wchar_
2c70: 74 20 2a 7a 20 3d 20 66 6f 73 73 69 6c 5f 75 74  t *z = fossil_ut
2c80: 66 38 5f 74 6f 5f 66 69 6c 65 6e 61 6d 65 28 7a  f8_to_filename(z
2c90: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 5f 77 75  Filename);.  _wu
2ca0: 6e 6c 69 6e 6b 28 7a 29 3b 0a 23 65 6c 73 65 0a  nlink(z);.#else.
2cb0: 20 20 63 68 61 72 20 2a 7a 20 3d 20 66 6f 73 73    char *z = foss
2cc0: 69 6c 5f 75 74 66 38 5f 74 6f 5f 66 69 6c 65 6e  il_utf8_to_filen
2cd0: 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
2ce0: 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61    unlink(zFilena
2cf0: 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 66 6f  me);.#endif.  fo
2d00: 73 73 69 6c 5f 66 69 6c 65 6e 61 6d 65 5f 66 72  ssil_filename_fr
2d10: 65 65 28 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ee(z);.}../*.** 
2d20: 43 72 65 61 74 65 20 74 68 65 20 64 69 72 65 63  Create the direc
2d30: 74 6f 72 79 20 6e 61 6d 65 64 20 69 6e 20 74 68  tory named in th
2d40: 65 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 69  e argument, if i
2d50: 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  t does not alrea
2d60: 64 79 0a 2a 2a 20 65 78 69 73 74 2e 20 20 49 66  dy.** exist.  If
2d70: 20 66 6f 72 63 65 46 6c 61 67 20 69 73 20 31 2c   forceFlag is 1,
2d80: 20 64 65 6c 65 74 65 20 61 6e 79 20 70 72 69 6f   delete any prio
2d90: 72 20 6e 6f 6e 2d 64 69 72 65 63 74 6f 72 79 20  r non-directory 
2da0: 6f 62 6a 65 63 74 0a 2a 2a 20 77 69 74 68 20 74  object.** with t
2db0: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 0a 2a 2a  he same name..**
2dc0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
2dd0: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
2de0: 0a 2a 2f 0a 69 6e 74 20 66 69 6c 65 5f 6d 6b 64  .*/.int file_mkd
2df0: 69 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ir(const char *z
2e00: 4e 61 6d 65 2c 20 69 6e 74 20 66 6f 72 63 65 46  Name, int forceF
2e10: 6c 61 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  lag){.  int rc =
2e20: 20 66 69 6c 65 5f 77 64 5f 69 73 64 69 72 28 7a   file_wd_isdir(z
2e30: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  Name);.  if( rc=
2e40: 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20 21 66  =2 ){.    if( !f
2e50: 6f 72 63 65 46 6c 61 67 20 29 20 72 65 74 75 72  orceFlag ) retur
2e60: 6e 20 31 3b 0a 20 20 20 20 66 69 6c 65 5f 64 65  n 1;.    file_de
2e70: 6c 65 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d  lete(zName);.  }
2e80: 0a 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a  .  if( rc!=1 ){.
2e90: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e  #if defined(_WIN
2ea0: 33 32 29 0a 20 20 20 20 77 63 68 61 72 5f 74 20  32).    wchar_t 
2eb0: 2a 7a 4d 62 63 73 20 3d 20 66 6f 73 73 69 6c 5f  *zMbcs = fossil_
2ec0: 75 74 66 38 5f 74 6f 5f 66 69 6c 65 6e 61 6d 65  utf8_to_filename
2ed0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20  (zName);.    rc 
2ee0: 3d 20 5f 77 6d 6b 64 69 72 28 7a 4d 62 63 73 29  = _wmkdir(zMbcs)
2ef0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 63 68 61 72  ;.#else.    char
2f00: 20 2a 7a 4d 62 63 73 20 3d 20 66 6f 73 73 69 6c   *zMbcs = fossil
2f10: 5f 75 74 66 38 5f 74 6f 5f 66 69 6c 65 6e 61 6d  _utf8_to_filenam
2f20: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63  e(zName);.    rc
2f30: 20 3d 20 6d 6b 64 69 72 28 7a 4e 61 6d 65 2c 20   = mkdir(zName, 
2f40: 30 37 35 35 29 3b 0a 23 65 6e 64 69 66 0a 20 20  0755);.#endif.  
2f50: 20 20 66 6f 73 73 69 6c 5f 66 69 6c 65 6e 61 6d    fossil_filenam
2f60: 65 5f 66 72 65 65 28 7a 4d 62 63 73 29 3b 0a 20  e_free(zMbcs);. 
2f70: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2f80: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
2f90: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
2fa0: 75 65 20 69 66 20 74 68 65 20 66 69 6c 65 6e 61  ue if the filena
2fb0: 6d 65 20 67 69 76 65 6e 20 69 73 20 61 20 76 61  me given is a va
2fc0: 6c 69 64 20 66 69 6c 65 6e 61 6d 65 20 66 6f 72  lid filename for
2fd0: 0a 2a 2a 20 61 20 66 69 6c 65 20 69 6e 20 61 20  .** a file in a 
2fe0: 72 65 70 6f 73 69 74 6f 72 79 2e 20 20 56 61 6c  repository.  Val
2ff0: 69 64 20 66 69 6c 65 6e 61 6d 65 73 20 66 6f 6c  id filenames fol
3000: 6c 6f 77 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a  low all of the.*
3010: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 75 6c 65  * following rule
3020: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20  s:.**.**     *  
3030: 44 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77  Does not begin w
3040: 69 74 68 20 22 2f 22 0a 2a 2a 20 20 20 20 20 2a  ith "/".**     *
3050: 20 20 44 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61    Does not conta
3060: 69 6e 20 61 6e 79 20 70 61 74 68 20 65 6c 65 6d  in any path elem
3070: 65 6e 74 20 6e 61 6d 65 64 20 22 2e 22 20 6f 72  ent named "." or
3080: 20 22 2e 2e 22 0a 2a 2a 20 20 20 20 20 2a 20 20   "..".**     *  
3090: 44 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  Does not contain
30a0: 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 63 68   any of these ch
30b0: 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20  aracters in the 
30c0: 70 61 74 68 3a 20 22 5c 22 0a 2a 2a 20 20 20 20  path: "\".**    
30d0: 20 2a 20 20 44 6f 65 73 20 6e 6f 74 20 65 6e 64   *  Does not end
30e0: 20 77 69 74 68 20 22 2f 22 2e 0a 2a 2a 20 20 20   with "/"..**   
30f0: 20 20 2a 20 20 44 6f 65 73 20 6e 6f 74 20 63 6f    *  Does not co
3100: 6e 74 61 69 6e 20 74 77 6f 20 6f 72 20 6d 6f 72  ntain two or mor
3110: 65 20 22 2f 22 20 63 68 61 72 61 63 74 65 72 73  e "/" characters
3120: 20 69 6e 20 61 20 72 6f 77 2e 0a 2a 2a 20 20 20   in a row..**   
3130: 20 20 2a 20 20 43 6f 6e 74 61 69 6e 73 20 61 74    *  Contains at
3140: 20 6c 65 61 73 74 20 6f 6e 65 20 63 68 61 72 61   least one chara
3150: 63 74 65 72 0a 2a 2a 0a 2a 2a 20 49 6e 76 61 6c  cter.**.** Inval
3160: 69 64 20 55 54 46 38 20 63 68 61 72 61 63 74 65  id UTF8 characte
3170: 72 73 20 72 65 73 75 6c 74 20 69 6e 20 61 20 66  rs result in a f
3180: 61 6c 73 65 20 72 65 74 75 72 6e 20 69 66 20 62  alse return if b
3190: 53 74 72 69 63 74 55 74 66 38 20 69 73 0a 2a 2a  StrictUtf8 is.**
31a0: 20 74 72 75 65 2e 20 20 49 66 20 62 53 74 72 69   true.  If bStri
31b0: 63 74 55 74 66 38 20 69 73 20 66 61 6c 73 65 2c  ctUtf8 is false,
31c0: 20 69 6e 76 61 6c 69 64 20 55 54 46 38 20 63 68   invalid UTF8 ch
31d0: 61 72 61 63 74 65 72 73 20 61 72 65 20 73 69 6c  aracters are sil
31e0: 65 6e 74 6c 79 0a 2a 2a 20 69 67 6e 6f 72 65 64  ently.** ignored
31f0: 2e 20 53 65 65 20 68 74 74 70 3a 2f 2f 65 6e 2e  . See http://en.
3200: 77 69 6b 69 70 65 64 69 61 2e 6f 72 67 2f 77 69  wikipedia.org/wi
3210: 6b 69 2f 55 54 46 2d 38 23 49 6e 76 61 6c 69 64  ki/UTF-8#Invalid
3220: 5f 62 79 74 65 5f 73 65 71 75 65 6e 63 65 73 0a  _byte_sequences.
3230: 2a 2a 20 61 6e 64 20 68 74 74 70 3a 2f 2f 65 6e  ** and http://en
3240: 2e 77 69 6b 69 70 65 64 69 61 2e 6f 72 67 2f 77  .wikipedia.org/w
3250: 69 6b 69 2f 55 6e 69 63 6f 64 65 20 28 66 6f 72  iki/Unicode (for
3260: 20 74 68 65 20 6e 6f 6e 63 68 61 72 61 63 74 65   the noncharacte
3270: 72 73 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 53  rs).**.** The bS
3280: 74 72 69 63 74 55 74 66 38 20 66 6c 61 67 20 69  trictUtf8 flag i
3290: 73 20 74 72 75 65 20 66 6f 72 20 6e 65 77 20 69  s true for new i
32a0: 6e 70 75 74 73 2c 20 62 75 74 20 69 73 20 66 61  nputs, but is fa
32b0: 6c 73 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67  lse when parsing
32c0: 0a 2a 2a 20 6c 65 67 61 63 79 20 6d 61 6e 69 66  .** legacy manif
32d0: 65 73 74 73 2c 20 66 6f 72 20 62 61 63 6b 77 61  ests, for backwa
32e0: 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
32f0: 79 2e 0a 2a 2f 0a 69 6e 74 20 66 69 6c 65 5f 69  y..*/.int file_i
3300: 73 5f 73 69 6d 70 6c 65 5f 70 61 74 68 6e 61 6d  s_simple_pathnam
3310: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  e(const char *z,
3320: 20 69 6e 74 20 62 53 74 72 69 63 74 55 74 66 38   int bStrictUtf8
3330: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e  ){.  int i;.  un
3340: 73 69 67 6e 65 64 20 63 68 61 72 20 63 20 3d 20  signed char c = 
3350: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 20  (unsigned char) 
3360: 7a 5b 30 5d 3b 0a 20 20 63 68 61 72 20 6d 61 73  z[0];.  char mas
3370: 6b 4e 6f 6e 41 73 63 69 69 20 3d 20 62 53 74 72  kNonAscii = bStr
3380: 69 63 74 55 74 66 38 20 3f 20 30 78 38 30 20 3a  ictUtf8 ? 0x80 :
3390: 20 30 78 30 30 3b 0a 20 20 69 66 28 20 63 3d 3d   0x00;.  if( c==
33a0: 27 2f 27 20 7c 7c 20 63 3d 3d 30 20 29 20 72 65  '/' || c==0 ) re
33b0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 63 3d  turn 0;.  if( c=
33c0: 3d 27 2e 27 20 29 7b 0a 20 20 20 20 69 66 28 20  ='.' ){.    if( 
33d0: 7a 5b 31 5d 3d 3d 27 2f 27 20 7c 7c 20 7a 5b 31  z[1]=='/' || z[1
33e0: 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  ]==0 ) return 0;
33f0: 0a 20 20 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 27  .    if( z[1]=='
3400: 2e 27 20 26 26 20 28 7a 5b 32 5d 3d 3d 27 2f 27  .' && (z[2]=='/'
3410: 20 7c 7c 20 7a 5b 32 5d 3d 3d 30 29 20 29 20 72   || z[2]==0) ) r
3420: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66  eturn 0;.  }.  f
3430: 6f 72 28 69 3d 30 3b 20 28 63 3d 28 75 6e 73 69  or(i=0; (c=(unsi
3440: 67 6e 65 64 20 63 68 61 72 29 7a 5b 69 5d 29 21  gned char)z[i])!
3450: 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  =0; i++){.    if
3460: 28 20 63 20 26 20 6d 61 73 6b 4e 6f 6e 41 73 63  ( c & maskNonAsc
3470: 69 69 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ii ){.      if( 
3480: 28 7a 5b 2b 2b 69 5d 26 30 78 63 30 29 21 3d 30  (z[++i]&0xc0)!=0
3490: 78 38 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  x80 ){.        /
34a0: 2a 20 49 6e 76 61 6c 69 64 20 66 69 72 73 74 20  * Invalid first 
34b0: 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 62 79 74  continuation byt
34c0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  e */.        ret
34d0: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
34e0: 20 20 20 20 20 69 66 28 20 63 3c 30 78 63 32 20       if( c<0xc2 
34f0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ){.        /* In
3500: 76 61 6c 69 64 20 31 2d 62 79 74 65 20 55 54 46  valid 1-byte UTF
3510: 2d 38 20 73 65 71 75 65 6e 63 65 2c 20 6f 72 20  -8 sequence, or 
3520: 32 2d 62 79 74 65 20 6f 76 65 72 6c 6f 6e 67 20  2-byte overlong 
3530: 66 6f 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20  form. */.       
3540: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
3550: 20 7d 65 6c 73 65 20 69 66 28 20 28 63 26 30 78   }else if( (c&0x
3560: 65 30 29 3d 3d 30 78 65 30 20 29 7b 0a 20 20 20  e0)==0xe0 ){.   
3570: 20 20 20 20 20 2f 2a 20 33 2d 62 79 74 65 20 6f       /* 3-byte o
3580: 72 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20  r more */.      
3590: 20 20 69 6e 74 20 75 6e 69 63 6f 64 65 3b 0a 20    int unicode;. 
35a0: 20 20 20 20 20 20 20 69 66 28 20 63 26 30 78 31         if( c&0x1
35b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
35c0: 2a 20 55 6e 69 63 6f 64 65 20 63 68 61 72 61 63  * Unicode charac
35d0: 74 65 72 73 20 3e 20 55 2b 46 46 46 46 20 61 72  ters > U+FFFF ar
35e0: 65 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 2e  e not supported.
35f0: 0a 20 20 20 20 20 20 20 20 20 20 20 2a 20 57 69  .           * Wi
3600: 6e 64 6f 77 73 20 58 50 20 61 6e 64 20 65 61 72  ndows XP and ear
3610: 6c 69 65 72 20 63 61 6e 6e 6f 74 20 68 61 6e 64  lier cannot hand
3620: 6c 65 20 74 68 65 6d 2e 0a 20 20 20 20 20 20 20  le them..       
3630: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
3640: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
3650: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
3660: 54 68 69 73 20 69 73 20 61 20 33 2d 62 79 74 65  This is a 3-byte
3670: 20 55 54 46 2d 38 20 63 68 61 72 61 63 74 65 72   UTF-8 character
3680: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 63   */.        unic
3690: 6f 64 65 20 3d 20 28 28 63 26 30 78 30 66 29 3c  ode = ((c&0x0f)<
36a0: 3c 31 32 29 20 2b 20 28 28 7a 5b 69 5d 26 30 78  <12) + ((z[i]&0x
36b0: 33 66 29 3c 3c 36 29 20 2b 20 28 7a 5b 69 2b 31  3f)<<6) + (z[i+1
36c0: 5d 26 30 78 33 66 29 3b 0a 20 20 20 20 20 20 20  ]&0x3f);.       
36d0: 20 69 66 28 20 75 6e 69 63 6f 64 65 20 3c 3d 20   if( unicode <= 
36e0: 30 78 30 37 66 66 20 29 7b 0a 20 20 20 20 20 20  0x07ff ){.      
36f0: 20 20 20 20 2f 2a 20 6f 76 65 72 6c 6f 6e 67 20      /* overlong 
3700: 66 6f 72 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20  form */.        
3710: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
3720: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 75 6e      }else if( un
3730: 69 63 6f 64 65 3e 3d 30 78 65 30 30 30 20 29 7b  icode>=0xe000 ){
3740: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 2b  .          /* U+
3750: 45 30 30 30 2e 2e 55 2b 46 46 46 46 20 2a 2f 0a  E000..U+FFFF */.
3760: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 75            if( (u
3770: 6e 69 63 6f 64 65 3c 3d 30 78 66 38 66 66 29 20  nicode<=0xf8ff) 
3780: 7c 7c 20 28 75 6e 69 63 6f 64 65 3e 3d 30 78 66  || (unicode>=0xf
3790: 66 66 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ffe) ){.        
37a0: 20 20 20 20 2f 2a 20 55 2b 45 30 30 30 2e 2e 55      /* U+E000..U
37b0: 2b 46 38 46 46 20 61 72 65 20 66 6f 72 20 70 72  +F8FF are for pr
37c0: 69 76 61 74 65 20 75 73 65 2e 0a 20 20 20 20 20  ivate use..     
37d0: 20 20 20 20 20 20 20 20 2a 20 55 2b 46 46 46 45          * U+FFFE
37e0: 2e 2e 55 2b 46 46 46 46 20 61 72 65 20 6e 6f 6e  ..U+FFFF are non
37f0: 63 68 61 72 61 63 74 65 72 73 2e 20 2a 2f 0a 20  characters. */. 
3800: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
3810: 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  n 0;.          }
3820: 20 65 6c 73 65 20 69 66 28 20 28 75 6e 69 63 6f   else if( (unico
3830: 64 65 3e 3d 30 78 66 64 64 30 29 20 26 26 20 28  de>=0xfdd0) && (
3840: 75 6e 69 63 6f 64 65 3c 3d 30 78 66 64 65 66 29  unicode<=0xfdef)
3850: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3860: 2f 2a 20 55 2b 46 44 44 30 2e 2e 55 2b 46 44 45  /* U+FDD0..U+FDE
3870: 46 20 61 72 65 20 6e 6f 6e 63 68 61 72 61 63 74  F are noncharact
3880: 65 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ers. */.        
3890: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
38a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
38b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 75 6e 69    }else if( (uni
38c0: 63 6f 64 65 3e 3d 30 78 64 38 30 30 29 20 26 26  code>=0xd800) &&
38d0: 20 28 75 6e 69 63 6f 64 65 3c 3d 30 78 64 66 66   (unicode<=0xdff
38e0: 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  f) ){.          
38f0: 2f 2a 20 55 2b 44 38 30 30 2e 2e 55 2b 44 46 46  /* U+D800..U+DFF
3900: 46 20 61 72 65 20 66 6f 72 20 73 75 72 72 6f 67  F are for surrog
3910: 61 74 65 20 70 61 69 72 73 2e 20 2a 2f 0a 20 20  ate pairs. */.  
3920: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
3930: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3940: 20 20 20 20 69 66 28 20 28 7a 5b 2b 2b 69 5d 26      if( (z[++i]&
3950: 30 78 63 30 29 21 3d 30 78 38 30 20 29 7b 0a 20  0xc0)!=0x80 ){. 
3960: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 76 61           /* Inva
3970: 6c 69 64 20 73 65 63 6f 6e 64 20 63 6f 6e 74 69  lid second conti
3980: 6e 75 61 74 69 6f 6e 20 62 79 74 65 20 2a 2f 0a  nuation byte */.
3990: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
39a0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
39b0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
39c0: 69 66 28 20 62 53 74 72 69 63 74 55 74 66 38 20  if( bStrictUtf8 
39d0: 26 26 20 28 63 3d 3d 27 5c 5c 27 29 20 29 7b 0a  && (c=='\\') ){.
39e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
39f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3d      }.    if( c=
3a00: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 66  ='/' ){.      if
3a10: 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20  ( z[i+1]=='/' ) 
3a20: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
3a30: 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20  if( z[i+1]=='.' 
3a40: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ){.        if( z
3a50: 5b 69 2b 32 5d 3d 3d 27 2f 27 20 7c 7c 20 7a 5b  [i+2]=='/' || z[
3a60: 69 2b 32 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e  i+2]==0 ) return
3a70: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
3a80: 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 28  z[i+2]=='.' && (
3a90: 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 7c 7c 20 7a  z[i+3]=='/' || z
3aa0: 5b 69 2b 33 5d 3d 3d 30 29 20 29 20 72 65 74 75  [i+3]==0) ) retu
3ab0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
3ac0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 5b    }.  }.  if( z[
3ad0: 69 2d 31 5d 3d 3d 27 2f 27 20 29 20 72 65 74 75  i-1]=='/' ) retu
3ae0: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31  rn 0;.  return 1
3af0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
3b00: 65 20 6c 61 73 74 20 63 6f 6d 70 6f 6e 65 6e 74  e last component
3b10: 20 6f 66 20 74 68 65 20 70 61 74 68 6e 61 6d 65   of the pathname
3b20: 20 69 6e 20 7a 5b 30 5d 2e 2e 7a 5b 6a 2d 31 5d   in z[0]..z[j-1]
3b30: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   is something.**
3b40: 20 6f 74 68 65 72 20 74 68 61 6e 20 22 2e 2e 22   other than ".."
3b50: 20 74 68 65 6e 20 62 61 63 6b 20 69 74 20 6f 75   then back it ou
3b60: 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 72 75  t and return tru
3b70: 65 2e 20 20 49 66 20 74 68 65 20 6c 61 73 74 0a  e.  If the last.
3b80: 2a 2a 20 63 6f 6d 70 6f 6e 65 6e 74 20 69 73 20  ** component is 
3b90: 65 6d 70 74 79 20 6f 72 20 69 66 20 69 74 20 69  empty or if it i
3ba0: 73 20 22 2e 2e 22 20 74 68 65 6e 20 72 65 74 75  s ".." then retu
3bb0: 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61  rn false..*/.sta
3bc0: 74 69 63 20 69 6e 74 20 62 61 63 6b 75 70 5f 64  tic int backup_d
3bd0: 69 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ir(const char *z
3be0: 2c 20 69 6e 74 20 2a 70 4a 29 7b 0a 20 20 69 6e  , int *pJ){.  in
3bf0: 74 20 6a 20 3d 20 2a 70 4a 3b 0a 20 20 69 6e 74  t j = *pJ;.  int
3c00: 20 69 3b 0a 20 20 69 66 28 20 6a 3c 3d 30 20 29   i;.  if( j<=0 )
3c10: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72   return 0;.  for
3c20: 28 69 3d 6a 2d 31 3b 20 69 3e 30 20 26 26 20 7a  (i=j-1; i>0 && z
3c30: 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29  [i-1]!='/'; i--)
3c40: 7b 7d 0a 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  {}.  if( z[i]=='
3c50: 2e 27 20 26 26 20 69 3d 3d 6a 2d 32 20 26 26 20  .' && i==j-2 && 
3c60: 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 29 20 72 65  z[i+1]=='.' ) re
3c70: 74 75 72 6e 20 30 3b 0a 20 20 2a 70 4a 20 3d 20  turn 0;.  *pJ = 
3c80: 69 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  i-1;.  return 1;
3c90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69  .}../*.** Simpli
3ca0: 66 79 20 61 20 66 69 6c 65 6e 61 6d 65 20 62 79  fy a filename by
3cb0: 0a 2a 2a 0a 2a 2a 20 20 2a 20 43 6f 6e 76 65 72  .**.**  * Conver
3cc0: 74 20 61 6c 6c 20 5c 20 69 6e 74 6f 20 2f 20 6f  t all \ into / o
3cd0: 6e 20 77 69 6e 64 6f 77 73 20 61 6e 64 20 63 79  n windows and cy
3ce0: 67 77 69 6e 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76  gwin.**  * remov
3cf0: 69 6e 67 20 61 6e 79 20 74 72 61 69 6c 69 6e 67  ing any trailing
3d00: 20 61 6e 64 20 64 75 70 6c 69 63 61 74 65 20 2f   and duplicate /
3d10: 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20  .**  * removing 
3d20: 2f 2e 2f 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69  /./.**  * removi
3d30: 6e 67 20 2f 41 2f 2e 2e 2f 0a 2a 2a 0a 2a 2a 20  ng /A/../.**.** 
3d40: 43 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  Changes are made
3d50: 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74 75   in-place.  Retu
3d60: 72 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 20  rn the new name 
3d70: 6c 65 6e 67 74 68 2e 0a 2a 2a 20 49 66 20 74 68  length..** If th
3d80: 65 20 73 6c 61 73 68 20 70 61 72 61 6d 65 74 65  e slash paramete
3d90: 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
3da0: 68 65 20 74 72 61 69 6c 69 6e 67 20 73 6c 61 73  he trailing slas
3db0: 68 2c 20 69 66 20 61 6e 79 2c 0a 2a 2a 20 69 73  h, if any,.** is
3dc0: 20 72 65 74 61 69 6e 65 64 2e 0a 2a 2f 0a 69 6e   retained..*/.in
3dd0: 74 20 66 69 6c 65 5f 73 69 6d 70 6c 69 66 79 5f  t file_simplify_
3de0: 6e 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e  name(char *z, in
3df0: 74 20 6e 2c 20 69 6e 74 20 73 6c 61 73 68 29 7b  t n, int slash){
3e00: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
3e10: 66 28 20 6e 3c 30 20 29 20 6e 20 3d 20 73 74 72  f( n<0 ) n = str
3e20: 6c 65 6e 28 7a 29 3b 0a 0a 20 20 2f 2a 20 4f 6e  len(z);..  /* On
3e30: 20 77 69 6e 64 6f 77 73 20 61 6e 64 20 63 79 67   windows and cyg
3e40: 77 69 6e 20 63 6f 6e 76 65 72 74 20 61 6c 6c 20  win convert all 
3e50: 5c 20 63 68 61 72 61 63 74 65 72 73 20 74 6f 20  \ characters to 
3e60: 2f 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  / */.#if defined
3e70: 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69  (_WIN32) || defi
3e80: 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
3e90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
3ea0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b  i++){.    if( z[
3eb0: 69 5d 3d 3d 27 5c 5c 27 20 29 20 7a 5b 69 5d 20  i]=='\\' ) z[i] 
3ec0: 3d 20 27 2f 27 3b 0a 20 20 7d 0a 23 65 6e 64 69  = '/';.  }.#endi
3ed0: 66 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 69 6e 67  f..  /* Removing
3ee0: 20 74 72 61 69 6c 69 6e 67 20 22 2f 22 20 63 68   trailing "/" ch
3ef0: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 69 66  aracters */.  if
3f00: 28 20 21 73 6c 61 73 68 20 29 7b 0a 20 20 20 20  ( !slash ){.    
3f10: 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b  while( n>1 && z[
3f20: 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d  n-1]=='/' ){ n--
3f30: 3b 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ; }.  }..  /* Re
3f40: 6d 6f 76 65 20 64 75 70 6c 69 63 61 74 65 20 27  move duplicate '
3f50: 2f 27 20 63 68 61 72 61 63 74 65 72 73 2e 20 20  /' characters.  
3f60: 45 78 63 65 70 74 2c 20 74 77 6f 20 2f 2f 20 61  Except, two // a
3f70: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a  t the beginning.
3f80: 20 20 2a 2a 20 6f 66 20 61 20 70 61 74 68 6e 61    ** of a pathna
3f90: 6d 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 73 69  me is allowed si
3fa0: 6e 63 65 20 74 68 69 73 20 69 73 20 69 6d 70 6f  nce this is impo
3fb0: 72 74 61 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73  rtant on windows
3fc0: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6a 3d 31  . */.  for(i=j=1
3fd0: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
3fe0: 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a   z[j++] = z[i];.
3ff0: 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 69 5d 3d      while( z[i]=
4000: 3d 27 2f 27 20 26 26 20 69 3c 6e 2d 31 20 26 26  ='/' && i<n-1 &&
4010: 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 69   z[i+1]=='/' ) i
4020: 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 6a 3b  ++;.  }.  n = j;
4030: 0a 0a 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72  ..  /* Skip over
4040: 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 69 6e   zero or more in
4050: 69 74 69 61 6c 20 22 2e 2f 22 20 73 65 71 75 65  itial "./" seque
4060: 6e 63 65 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  nces */.  for(i=
4070: 30 3b 20 69 3c 6e 2d 31 20 26 26 20 7a 5b 69 5d  0; i<n-1 && z[i]
4080: 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 31 5d 3d  =='.' && z[i+1]=
4090: 3d 27 2f 27 3b 20 69 2b 3d 32 29 7b 7d 0a 0a 20  ='/'; i+=2){}.. 
40a0: 20 2f 2a 20 42 65 67 69 6e 20 63 6f 70 79 69 6e   /* Begin copyin
40b0: 67 20 66 72 6f 6d 20 7a 5b 69 5d 20 62 61 63 6b  g from z[i] back
40c0: 20 74 6f 20 7a 5b 6a 5d 2e 2e 2e 20 2a 2f 0a 20   to z[j]... */. 
40d0: 20 66 6f 72 28 6a 3d 30 3b 20 69 3c 6e 3b 20 69   for(j=0; i<n; i
40e0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69  ++){.    if( z[i
40f0: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
4100: 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 69 6e 74  /* Skip over int
4110: 65 72 6e 61 6c 20 22 2f 2e 22 20 64 69 72 65 63  ernal "/." direc
4120: 74 6f 72 79 20 63 6f 6d 70 6f 6e 65 6e 74 73 20  tory components 
4130: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69  */.      if( z[i
4140: 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 28 69 2b 32  +1]=='.' && (i+2
4150: 3d 3d 6e 20 7c 7c 20 7a 5b 69 2b 32 5d 3d 3d 27  ==n || z[i+2]=='
4160: 2f 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  /') ){.        i
4170: 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63   += 1;.        c
4180: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
4190: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
41a0: 69 73 20 69 73 20 61 20 22 2f 2e 2e 22 20 64 69  is is a "/.." di
41b0: 72 65 63 74 6f 72 79 20 63 6f 6d 70 6f 6e 65 6e  rectory componen
41c0: 74 20 74 68 65 6e 20 62 61 63 6b 20 6f 75 74 20  t then back out 
41d0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 72 65  the.      ** pre
41e0: 76 69 6f 75 73 20 74 65 72 6d 20 6f 66 20 74 68  vious term of th
41f0: 65 20 64 69 72 65 63 74 6f 72 79 20 69 66 20 69  e directory if i
4200: 74 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f  t is something o
4210: 74 68 65 72 20 74 68 61 6e 20 22 2e 2e 22 0a 20  ther than "..". 
4220: 20 20 20 20 20 2a 2a 20 6f 72 20 22 2e 22 0a 20       ** or ".". 
4230: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
4240: 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26  ( z[i+1]=='.' &&
4250: 20 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d   i+2<n && z[i+2]
4260: 3d 3d 27 2e 27 20 26 26 20 28 69 2b 33 3d 3d 6e  =='.' && (i+3==n
4270: 20 7c 7c 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 29   || z[i+3]=='/')
4280: 0a 20 20 20 20 20 20 20 26 26 20 62 61 63 6b 75  .       && backu
4290: 70 5f 64 69 72 28 7a 2c 20 26 6a 29 0a 20 20 20  p_dir(z, &j).   
42a0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20     ){.        i 
42b0: 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f  += 2;.        co
42c0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
42d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e      }.    if( j>
42e0: 3d 30 20 29 20 7a 5b 6a 5d 20 3d 20 7a 5b 69 5d  =0 ) z[j] = z[i]
42f0: 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    j++;.  }. 
4300: 20 69 66 28 20 6a 3d 3d 30 20 29 20 7a 5b 6a 2b   if( j==0 ) z[j+
4310: 2b 5d 20 3d 20 27 2e 27 3b 0a 20 20 7a 5b 6a 5d  +] = '.';.  z[j]
4320: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a   = 0;.  return j
4330: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41  ;.}../*.** COMMA
4340: 4e 44 3a 20 74 65 73 74 2d 73 69 6d 70 6c 69 66  ND: test-simplif
4350: 79 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 25 66 6f  y-name.**.** %fo
4360: 73 73 69 6c 20 74 65 73 74 2d 73 69 6d 70 6c 69  ssil test-simpli
4370: 66 79 2d 6e 61 6d 65 20 46 49 4c 45 4e 41 4d 45  fy-name FILENAME
4380: 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 50 72 69 6e 74 20  ....**.** Print 
4390: 74 68 65 20 73 69 6d 70 6c 69 66 69 65 64 20 76  the simplified v
43a0: 65 72 73 69 6f 6e 73 20 6f 66 20 65 61 63 68 20  ersions of each 
43b0: 46 49 4c 45 4e 41 4d 45 2e 0a 2a 2f 0a 76 6f 69  FILENAME..*/.voi
43c0: 64 20 63 6d 64 5f 74 65 73 74 5f 73 69 6d 70 6c  d cmd_test_simpl
43d0: 69 66 79 5f 6e 61 6d 65 28 76 6f 69 64 29 7b 0a  ify_name(void){.
43e0: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
43f0: 2a 7a 3b 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69  *z;.  for(i=2; i
4400: 3c 67 2e 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20  <g.argc; i++){. 
4410: 20 20 20 7a 20 3d 20 6d 70 72 69 6e 74 66 28 22     z = mprintf("
4420: 25 73 22 2c 20 67 2e 61 72 67 76 5b 69 5d 29 3b  %s", g.argv[i]);
4430: 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e  .    fossil_prin
4440: 74 28 22 5b 25 73 5d 20 2d 3e 20 22 2c 20 7a 29  t("[%s] -> ", z)
4450: 3b 0a 20 20 20 20 66 69 6c 65 5f 73 69 6d 70 6c  ;.    file_simpl
4460: 69 66 79 5f 6e 61 6d 65 28 7a 2c 20 2d 31 2c 20  ify_name(z, -1, 
4470: 30 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70  0);.    fossil_p
4480: 72 69 6e 74 28 22 5b 25 73 5d 5c 6e 22 2c 20 7a  rint("[%s]\n", z
4490: 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 72  );.    fossil_fr
44a0: 65 65 28 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ee(z);.  }.}../*
44b0: 0a 2a 2a 20 47 65 74 20 74 68 65 20 63 75 72 72  .** Get the curr
44c0: 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65  ent working dire
44d0: 63 74 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  ctory..**.** On 
44e0: 77 69 6e 64 6f 77 73 2c 20 74 68 65 20 6e 61 6d  windows, the nam
44f0: 65 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 66  e is converted f
4500: 72 6f 6d 20 75 6e 69 63 6f 64 65 20 74 6f 20 55  rom unicode to U
4510: 54 46 38 20 61 6e 64 20 61 6c 6c 20 27 5c 5c 27  TF8 and all '\\'
4520: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 61  .** characters a
4530: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20  re converted to 
4540: 27 2f 27 2e 20 20 4e 6f 20 63 6f 6e 76 65 72 73  '/'.  No convers
4550: 69 6f 6e 73 20 61 72 65 20 6e 65 65 64 65 64 20  ions are needed 
4560: 6f 6e 0a 2a 2a 20 75 6e 69 78 2e 0a 2a 2f 0a 76  on.** unix..*/.v
4570: 6f 69 64 20 66 69 6c 65 5f 67 65 74 63 77 64 28  oid file_getcwd(
4580: 63 68 61 72 20 2a 7a 42 75 66 2c 20 69 6e 74 20  char *zBuf, int 
4590: 6e 42 75 66 29 7b 0a 23 69 66 64 65 66 20 5f 57  nBuf){.#ifdef _W
45a0: 49 4e 33 32 0a 20 20 63 68 61 72 20 2a 7a 50 77  IN32.  char *zPw
45b0: 64 55 74 66 38 3b 0a 20 20 69 6e 74 20 6e 50 77  dUtf8;.  int nPw
45c0: 64 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 77 63  d;.  int i;.  wc
45d0: 68 61 72 5f 74 20 7a 50 77 64 5b 32 30 30 30 5d  har_t zPwd[2000]
45e0: 3b 0a 20 20 69 66 28 20 5f 77 67 65 74 63 77 64  ;.  if( _wgetcwd
45f0: 28 7a 50 77 64 2c 20 73 69 7a 65 6f 66 28 7a 50  (zPwd, sizeof(zP
4600: 77 64 29 2f 73 69 7a 65 6f 66 28 7a 50 77 64 5b  wd)/sizeof(zPwd[
4610: 30 5d 29 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  0])-1)==0 ){.   
4620: 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 63   fossil_fatal("c
4630: 61 6e 6e 6f 74 20 66 69 6e 64 20 74 68 65 20 63  annot find the c
4640: 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64  urrent working d
4650: 69 72 65 63 74 6f 72 79 2e 22 29 3b 0a 20 20 7d  irectory.");.  }
4660: 0a 20 20 7a 50 77 64 55 74 66 38 20 3d 20 66 6f  .  zPwdUtf8 = fo
4670: 73 73 69 6c 5f 66 69 6c 65 6e 61 6d 65 5f 74 6f  ssil_filename_to
4680: 5f 75 74 66 38 28 7a 50 77 64 29 3b 0a 20 20 6e  _utf8(zPwd);.  n
4690: 50 77 64 20 3d 20 73 74 72 6c 65 6e 28 7a 50 77  Pwd = strlen(zPw
46a0: 64 55 74 66 38 29 3b 0a 20 20 69 66 28 20 6e 50  dUtf8);.  if( nP
46b0: 77 64 20 3e 20 6e 42 75 66 2d 31 20 29 7b 0a 20  wd > nBuf-1 ){. 
46c0: 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28     fossil_fatal(
46d0: 22 70 77 64 20 74 6f 6f 20 62 69 67 3a 20 6d 61  "pwd too big: ma
46e0: 78 20 25 64 5c 6e 22 2c 20 6e 42 75 66 2d 31 29  x %d\n", nBuf-1)
46f0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
4700: 20 7a 50 77 64 55 74 66 38 5b 69 5d 3b 20 69 2b   zPwdUtf8[i]; i+
4710: 2b 29 20 69 66 28 20 7a 50 77 64 55 74 66 38 5b  +) if( zPwdUtf8[
4720: 69 5d 3d 3d 27 5c 5c 27 20 29 20 7a 50 77 64 55  i]=='\\' ) zPwdU
4730: 74 66 38 5b 69 5d 20 3d 20 27 2f 27 3b 0a 20 20  tf8[i] = '/';.  
4740: 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a 50 77  memcpy(zBuf, zPw
4750: 64 55 74 66 38 2c 20 6e 50 77 64 2b 31 29 3b 0a  dUtf8, nPwd+1);.
4760: 20 20 66 6f 73 73 69 6c 5f 66 69 6c 65 6e 61 6d    fossil_filenam
4770: 65 5f 66 72 65 65 28 7a 50 77 64 55 74 66 38 29  e_free(zPwdUtf8)
4780: 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 67 65  ;.#else.  if( ge
4790: 74 63 77 64 28 7a 42 75 66 2c 20 6e 42 75 66 2d  tcwd(zBuf, nBuf-
47a0: 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  1)==0 ){.    if(
47b0: 20 65 72 72 6e 6f 3d 3d 45 52 41 4e 47 45 20 29   errno==ERANGE )
47c0: 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66  {.      fossil_f
47d0: 61 74 61 6c 28 22 70 77 64 20 74 6f 6f 20 62 69  atal("pwd too bi
47e0: 67 3a 20 6d 61 78 20 25 64 5c 6e 22 2c 20 6e 42  g: max %d\n", nB
47f0: 75 66 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  uf-1);.    }else
4800: 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66  {.      fossil_f
4810: 61 74 61 6c 28 22 63 61 6e 6e 6f 74 20 66 69 6e  atal("cannot fin
4820: 64 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e  d current workin
4830: 67 20 64 69 72 65 63 74 6f 72 79 3b 20 25 73 22  g directory; %s"
4840: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4850: 20 20 20 20 20 73 74 72 65 72 72 6f 72 28 65 72       strerror(er
4860: 72 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rno));.    }.  }
4870: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
4880: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
4890: 7a 50 61 74 68 20 69 73 20 61 6e 20 61 62 73 6f  zPath is an abso
48a0: 6c 75 74 65 20 70 61 74 68 6e 61 6d 65 2e 20 20  lute pathname.  
48b0: 52 65 74 75 72 6e 20 66 61 6c 73 65 0a 2a 2a 20  Return false.** 
48c0: 69 66 20 69 74 20 69 73 20 72 65 6c 61 74 69 76  if it is relativ
48d0: 65 2e 0a 2a 2f 0a 69 6e 74 20 66 69 6c 65 5f 69  e..*/.int file_i
48e0: 73 5f 61 62 73 6f 6c 75 74 65 5f 70 61 74 68 28  s_absolute_path(
48f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
4900: 68 29 7b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b  h){.  if( zPath[
4910: 30 5d 3d 3d 27 2f 27 0a 23 69 66 20 64 65 66 69  0]=='/'.#if defi
4920: 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64  ned(_WIN32) || d
4930: 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
4940: 5f 29 0a 20 20 20 20 20 20 7c 7c 20 7a 50 61 74  _).      || zPat
4950: 68 5b 30 5d 3d 3d 27 5c 5c 27 0a 20 20 20 20 20  h[0]=='\\'.     
4960: 20 7c 7c 20 28 66 6f 73 73 69 6c 5f 69 73 61 6c   || (fossil_isal
4970: 70 68 61 28 7a 50 61 74 68 5b 30 5d 29 20 26 26  pha(zPath[0]) &&
4980: 20 7a 50 61 74 68 5b 31 5d 3d 3d 27 3a 27 0a 20   zPath[1]==':'. 
4990: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 7a 50            && (zP
49a0: 61 74 68 5b 32 5d 3d 3d 27 5c 5c 27 20 7c 7c 20  ath[2]=='\\' || 
49b0: 7a 50 61 74 68 5b 32 5d 3d 3d 27 2f 27 29 29 0a  zPath[2]=='/')).
49c0: 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20  #endif.  ){.    
49d0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73  return 1;.  }els
49e0: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  e{.    return 0;
49f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
4a00: 6d 70 75 74 65 20 61 20 63 61 6e 6f 6e 69 63 61  mpute a canonica
4a10: 6c 20 70 61 74 68 6e 61 6d 65 20 66 6f 72 20 61  l pathname for a
4a20: 20 66 69 6c 65 20 6f 72 20 64 69 72 65 63 74 6f   file or directo
4a30: 72 79 2e 0a 2a 2a 20 4d 61 6b 65 20 74 68 65 20  ry..** Make the 
4a40: 6e 61 6d 65 20 61 62 73 6f 6c 75 74 65 20 69 66  name absolute if
4a50: 20 69 74 20 69 73 20 72 65 6c 61 74 69 76 65 2e   it is relative.
4a60: 0a 2a 2a 20 52 65 6d 6f 76 65 20 72 65 64 75 6e  .** Remove redun
4a70: 64 61 6e 74 20 2f 20 63 68 61 72 61 63 74 65 72  dant / character
4a80: 73 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20  s.** Remove all 
4a90: 2f 2e 2f 20 70 61 74 68 20 65 6c 65 6d 65 6e 74  /./ path element
4aa0: 73 2e 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 2f 41  s..** Convert /A
4ab0: 2f 2e 2e 2f 20 74 6f 20 6a 75 73 74 20 2f 0a 2a  /../ to just /.*
4ac0: 2a 20 49 66 20 74 68 65 20 73 6c 61 73 68 20 70  * If the slash p
4ad0: 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
4ae0: 7a 65 72 6f 2c 20 74 68 65 20 74 72 61 69 6c 69  zero, the traili
4af0: 6e 67 20 73 6c 61 73 68 2c 20 69 66 20 61 6e 79  ng slash, if any
4b00: 2c 0a 2a 2a 20 69 73 20 72 65 74 61 69 6e 65 64  ,.** is retained
4b10: 2e 0a 2a 2f 0a 76 6f 69 64 20 66 69 6c 65 5f 63  ..*/.void file_c
4b20: 61 6e 6f 6e 69 63 61 6c 5f 6e 61 6d 65 28 63 6f  anonical_name(co
4b30: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 4e  nst char *zOrigN
4b40: 61 6d 65 2c 20 42 6c 6f 62 20 2a 70 4f 75 74 2c  ame, Blob *pOut,
4b50: 20 69 6e 74 20 73 6c 61 73 68 29 7b 0a 20 20 69   int slash){.  i
4b60: 66 28 20 66 69 6c 65 5f 69 73 5f 61 62 73 6f 6c  f( file_is_absol
4b70: 75 74 65 5f 70 61 74 68 28 7a 4f 72 69 67 4e 61  ute_path(zOrigNa
4b80: 6d 65 29 20 29 7b 0a 23 69 66 20 64 65 66 69 6e  me) ){.#if defin
4b90: 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
4ba0: 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
4bb0: 29 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 75 74  ).    char *zOut
4bc0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 6c 6f  ;.#endif.    blo
4bd0: 62 5f 73 65 74 28 70 4f 75 74 2c 20 7a 4f 72 69  b_set(pOut, zOri
4be0: 67 4e 61 6d 65 29 3b 0a 20 20 20 20 62 6c 6f 62  gName);.    blob
4bf0: 5f 6d 61 74 65 72 69 61 6c 69 7a 65 28 70 4f 75  _materialize(pOu
4c00: 74 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t);.#if defined(
4c10: 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
4c20: 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
4c30: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4f 6e 20     /*.    ** On 
4c40: 57 69 6e 64 6f 77 73 2f 63 79 67 77 69 6e 2c 20  Windows/cygwin, 
4c50: 6e 6f 72 6d 61 6c 69 7a 65 20 74 68 65 20 64 72  normalize the dr
4c60: 69 76 65 20 6c 65 74 74 65 72 20 74 6f 20 75 70  ive letter to up
4c70: 70 65 72 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  per case..    */
4c80: 0a 20 20 20 20 7a 4f 75 74 20 3d 20 62 6c 6f 62  .    zOut = blob
4c90: 5f 73 74 72 28 70 4f 75 74 29 3b 0a 20 20 20 20  _str(pOut);.    
4ca0: 69 66 28 20 66 6f 73 73 69 6c 5f 69 73 6c 6f 77  if( fossil_islow
4cb0: 65 72 28 7a 4f 75 74 5b 30 5d 29 20 26 26 20 7a  er(zOut[0]) && z
4cc0: 4f 75 74 5b 31 5d 3d 3d 27 3a 27 20 29 7b 0a 20  Out[1]==':' ){. 
4cd0: 20 20 20 20 20 7a 4f 75 74 5b 30 5d 20 3d 20 66       zOut[0] = f
4ce0: 6f 73 73 69 6c 5f 74 6f 75 70 70 65 72 28 7a 4f  ossil_toupper(zO
4cf0: 75 74 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a 23 65  ut[0]);.    }.#e
4d00: 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
4d10: 20 20 63 68 61 72 20 7a 50 77 64 5b 32 30 30 30    char zPwd[2000
4d20: 5d 3b 0a 20 20 20 20 66 69 6c 65 5f 67 65 74 63  ];.    file_getc
4d30: 77 64 28 7a 50 77 64 2c 20 73 69 7a 65 6f 66 28  wd(zPwd, sizeof(
4d40: 7a 50 77 64 29 2d 73 74 72 6c 65 6e 28 7a 4f 72  zPwd)-strlen(zOr
4d50: 69 67 4e 61 6d 65 29 29 3b 0a 23 69 66 20 64 65  igName));.#if de
4d60: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20 20  fined(_WIN32).  
4d70: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4f 6e 20 57    /*.    ** On W
4d80: 69 6e 64 6f 77 73 2c 20 6e 6f 72 6d 61 6c 69 7a  indows, normaliz
4d90: 65 20 74 68 65 20 64 72 69 76 65 20 6c 65 74 74  e the drive lett
4da0: 65 72 20 74 6f 20 75 70 70 65 72 20 63 61 73 65  er to upper case
4db0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
4dc0: 20 66 6f 73 73 69 6c 5f 69 73 6c 6f 77 65 72 28   fossil_islower(
4dd0: 7a 50 77 64 5b 30 5d 29 20 26 26 20 7a 50 77 64  zPwd[0]) && zPwd
4de0: 5b 31 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20  [1]==':' ){.    
4df0: 20 20 7a 50 77 64 5b 30 5d 20 3d 20 66 6f 73 73    zPwd[0] = foss
4e00: 69 6c 5f 74 6f 75 70 70 65 72 28 7a 50 77 64 5b  il_toupper(zPwd[
4e10: 30 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  0]);.    }.#endi
4e20: 66 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28  f.    blob_zero(
4e30: 70 4f 75 74 29 3b 0a 20 20 20 20 62 6c 6f 62 5f  pOut);.    blob_
4e40: 61 70 70 65 6e 64 66 28 70 4f 75 74 2c 20 22 25  appendf(pOut, "%
4e50: 2f 2f 25 2f 22 2c 20 7a 50 77 64 2c 20 7a 4f 72  //%/", zPwd, zOr
4e60: 69 67 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 62  igName);.  }.  b
4e70: 6c 6f 62 5f 72 65 73 69 7a 65 28 70 4f 75 74 2c  lob_resize(pOut,
4e80: 20 66 69 6c 65 5f 73 69 6d 70 6c 69 66 79 5f 6e   file_simplify_n
4e90: 61 6d 65 28 62 6c 6f 62 5f 62 75 66 66 65 72 28  ame(blob_buffer(
4ea0: 70 4f 75 74 29 2c 0a 20 20 20 20 20 20 20 20 20  pOut),.         
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c                bl
4ed0: 6f 62 5f 73 69 7a 65 28 70 4f 75 74 29 2c 20 73  ob_size(pOut), s
4ee0: 6c 61 73 68 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lash));.}../*.**
4ef0: 20 43 4f 4d 4d 41 4e 44 3a 20 20 74 65 73 74 2d   COMMAND:  test-
4f00: 63 61 6e 6f 6e 69 63 61 6c 2d 6e 61 6d 65 0a 2a  canonical-name.*
4f10: 2a 20 55 73 61 67 65 3a 20 25 66 6f 73 73 69 6c  * Usage: %fossil
4f20: 20 74 65 73 74 2d 63 61 6e 6f 6e 69 63 61 6c 2d   test-canonical-
4f30: 6e 61 6d 65 20 46 49 4c 45 4e 41 4d 45 2e 2e 2e  name FILENAME...
4f40: 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  .**.** Test the 
4f50: 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
4f60: 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 20   canonical name 
4f70: 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2a 20 41 6c  generator..** Al
4f80: 73 6f 20 74 65 73 74 20 46 6f 73 73 69 6c 27 73  so test Fossil's
4f90: 20 61 62 69 6c 69 74 79 20 74 6f 20 6d 65 61 73   ability to meas
4fa0: 75 72 65 20 61 74 74 72 69 62 75 74 65 73 20 6f  ure attributes o
4fb0: 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69  f a file..*/.voi
4fc0: 64 20 63 6d 64 5f 74 65 73 74 5f 63 61 6e 6f 6e  d cmd_test_canon
4fd0: 69 63 61 6c 5f 6e 61 6d 65 28 76 6f 69 64 29 7b  ical_name(void){
4fe0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 6c 6f 62  .  int i;.  Blob
4ff0: 20 78 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28   x;.  blob_zero(
5000: 26 78 29 3b 0a 20 20 66 6f 72 28 69 3d 32 3b 20  &x);.  for(i=2; 
5010: 69 3c 67 2e 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  i<g.argc; i++){.
5020: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30      char zBuf[10
5030: 30 5d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  0];.    const ch
5040: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 67 2e 61 72  ar *zName = g.ar
5050: 67 76 5b 69 5d 3b 0a 20 20 20 20 66 69 6c 65 5f  gv[i];.    file_
5060: 63 61 6e 6f 6e 69 63 61 6c 5f 6e 61 6d 65 28 7a  canonical_name(z
5070: 4e 61 6d 65 2c 20 26 78 2c 20 30 29 3b 0a 20 20  Name, &x, 0);.  
5080: 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22    fossil_print("
5090: 5b 25 73 5d 20 2d 3e 20 5b 25 73 5d 5c 6e 22 2c  [%s] -> [%s]\n",
50a0: 20 7a 4e 61 6d 65 2c 20 62 6c 6f 62 5f 62 75 66   zName, blob_buf
50b0: 66 65 72 28 26 78 29 29 3b 0a 20 20 20 20 62 6c  fer(&x));.    bl
50c0: 6f 62 5f 72 65 73 65 74 28 26 78 29 3b 0a 20 20  ob_reset(&x);.  
50d0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
50e0: 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  tf(sizeof(zBuf),
50f0: 20 7a 42 75 66 2c 20 22 25 6c 6c 64 22 2c 20 66   zBuf, "%lld", f
5100: 69 6c 65 5f 77 64 5f 73 69 7a 65 28 7a 4e 61 6d  ile_wd_size(zNam
5110: 65 29 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f  e));.    fossil_
5120: 70 72 69 6e 74 28 22 20 20 66 69 6c 65 5f 73 69  print("  file_si
5130: 7a 65 20 20 20 3d 20 25 73 5c 6e 22 2c 20 7a 42  ze   = %s\n", zB
5140: 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  uf);.    sqlite3
5150: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
5160: 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25  (zBuf), zBuf, "%
5170: 6c 6c 64 22 2c 20 66 69 6c 65 5f 77 64 5f 6d 74  lld", file_wd_mt
5180: 69 6d 65 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ime(zName));.   
5190: 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 20   fossil_print(" 
51a0: 20 66 69 6c 65 5f 6d 74 69 6d 65 20 20 3d 20 25   file_mtime  = %
51b0: 73 5c 6e 22 2c 20 7a 42 75 66 29 3b 0a 20 20 20  s\n", zBuf);.   
51c0: 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 20   fossil_print(" 
51d0: 20 66 69 6c 65 5f 69 73 66 69 6c 65 20 3d 20 25   file_isfile = %
51e0: 64 5c 6e 22 2c 20 66 69 6c 65 5f 77 64 5f 69 73  d\n", file_wd_is
51f0: 66 69 6c 65 28 7a 4e 61 6d 65 29 29 3b 0a 20 20  file(zName));.  
5200: 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22    fossil_print("
5210: 20 20 66 69 6c 65 5f 69 73 66 69 6c 65 5f 6f 72    file_isfile_or
5220: 5f 6c 69 6e 6b 20 3d 20 25 64 5c 6e 22 2c 66 69  _link = %d\n",fi
5230: 6c 65 5f 77 64 5f 69 73 66 69 6c 65 5f 6f 72 5f  le_wd_isfile_or_
5240: 6c 69 6e 6b 28 7a 4e 61 6d 65 29 29 3b 0a 20 20  link(zName));.  
5250: 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22    fossil_print("
5260: 20 20 66 69 6c 65 5f 69 73 6c 69 6e 6b 20 3d 20    file_islink = 
5270: 25 64 5c 6e 22 2c 20 66 69 6c 65 5f 77 64 5f 69  %d\n", file_wd_i
5280: 73 6c 69 6e 6b 28 7a 4e 61 6d 65 29 29 3b 0a 20  slink(zName));. 
5290: 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28     fossil_print(
52a0: 22 20 20 66 69 6c 65 5f 69 73 65 78 65 20 20 3d  "  file_isexe  =
52b0: 20 25 64 5c 6e 22 2c 20 66 69 6c 65 5f 77 64 5f   %d\n", file_wd_
52c0: 69 73 65 78 65 28 7a 4e 61 6d 65 29 29 3b 0a 20  isexe(zName));. 
52d0: 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28     fossil_print(
52e0: 22 20 20 66 69 6c 65 5f 69 73 64 69 72 20 20 3d  "  file_isdir  =
52f0: 20 25 64 5c 6e 22 2c 20 66 69 6c 65 5f 77 64 5f   %d\n", file_wd_
5300: 69 73 64 69 72 28 7a 4e 61 6d 65 29 29 3b 0a 20  isdir(zName));. 
5310: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
5320: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
5330: 69 76 65 6e 20 66 69 6c 65 6e 61 6d 65 20 69 73  iven filename is
5340: 20 63 61 6e 6f 6e 69 63 61 6c 2e 0a 2a 2a 0a 2a   canonical..**.*
5350: 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65  * Canonical name
5360: 73 20 61 72 65 20 66 75 6c 6c 20 70 61 74 68 6e  s are full pathn
5370: 61 6d 65 73 20 75 73 69 6e 67 20 22 2f 22 20 6e  ames using "/" n
5380: 6f 74 20 22 5c 22 20 61 6e 64 20 77 68 69 63 68  ot "\" and which
5390: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 22  .** contain no "
53a0: 2f 2e 2f 22 20 6f 72 20 22 2f 2e 2e 2f 22 20 74  /./" or "/../" t
53b0: 65 72 6d 73 2e 0a 2a 2f 0a 69 6e 74 20 66 69 6c  erms..*/.int fil
53c0: 65 5f 69 73 5f 63 61 6e 6f 6e 69 63 61 6c 28 63  e_is_canonical(c
53d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
53e0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 5b   int i;.  if( z[
53f0: 30 5d 21 3d 27 2f 27 0a 23 69 66 20 64 65 66 69  0]!='/'.#if defi
5400: 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64  ned(_WIN32) || d
5410: 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
5420: 5f 29 0a 20 20 20 20 26 26 20 28 21 66 6f 73 73  _).    && (!foss
5430: 69 6c 5f 69 73 75 70 70 65 72 28 7a 5b 30 5d 29  il_isupper(z[0])
5440: 20 7c 7c 20 7a 5b 31 5d 21 3d 27 3a 27 20 7c 7c   || z[1]!=':' ||
5450: 20 7a 5b 32 5d 21 3d 27 2f 27 29 0a 23 65 6e 64   z[2]!='/').#end
5460: 69 66 0a 20 20 29 20 72 65 74 75 72 6e 20 30 3b  if.  ) return 0;
5470: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69  ..  for(i=0; z[i
5480: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; i++){.    if(
5490: 20 7a 5b 69 5d 3d 3d 27 5c 5c 27 20 29 20 72 65   z[i]=='\\' ) re
54a0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
54b0: 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  z[i]=='/' ){.   
54c0: 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27     if( z[i+1]=='
54d0: 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  .' ){.        if
54e0: 28 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 7c 7c  ( z[i+2]=='/' ||
54f0: 20 7a 5b 69 2b 32 5d 3d 3d 30 20 29 20 72 65 74   z[i+2]==0 ) ret
5500: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 69  urn 0;.        i
5510: 66 28 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26  f( z[i+2]=='.' &
5520: 26 20 28 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 7c  & (z[i+3]=='/' |
5530: 7c 20 7a 5b 69 2b 33 5d 3d 3d 30 29 20 29 20 72  | z[i+3]==0) ) r
5540: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
5550: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5560: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
5570: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
5580: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 68   to the first ch
5590: 61 72 61 63 74 65 72 20 69 6e 20 61 20 70 61 74  aracter in a pat
55a0: 68 6e 61 6d 65 20 70 61 73 74 20 74 68 65 0a 2a  hname past the.*
55b0: 2a 20 64 72 69 76 65 20 6c 65 74 74 65 72 2e 20  * drive letter. 
55c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
55d0: 20 61 20 6e 6f 2d 6f 70 20 6f 6e 20 75 6e 69 78   a no-op on unix
55e0: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 66 69 6c 65 5f  ..*/.char *file_
55f0: 77 69 74 68 6f 75 74 5f 64 72 69 76 65 5f 6c 65  without_drive_le
5600: 74 74 65 72 28 63 68 61 72 20 2a 7a 49 6e 29 7b  tter(char *zIn){
5610: 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 20  .#ifdef _WIN32. 
5620: 20 69 66 28 20 66 6f 73 73 69 6c 5f 69 73 61 6c   if( fossil_isal
5630: 70 68 61 28 7a 49 6e 5b 30 5d 29 20 26 26 20 7a  pha(zIn[0]) && z
5640: 49 6e 5b 31 5d 3d 3d 27 3a 27 20 29 20 7a 49 6e  In[1]==':' ) zIn
5650: 20 2b 3d 20 32 3b 0a 23 65 6e 64 69 66 0a 20 20   += 2;.#endif.  
5660: 72 65 74 75 72 6e 20 7a 49 6e 3b 0a 7d 0a 0a 2f  return zIn;.}../
5670: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 70  *.** Compute a p
5680: 61 74 68 6e 61 6d 65 20 66 6f 72 20 61 20 66 69  athname for a fi
5690: 6c 65 20 6f 72 20 64 69 72 65 63 74 6f 72 79 20  le or directory 
56a0: 74 68 61 74 20 69 73 20 72 65 6c 61 74 69 76 65  that is relative
56b0: 0a 2a 2a 20 74 6f 20 74 68 65 20 63 75 72 72 65  .** to the curre
56c0: 6e 74 20 64 69 72 65 63 74 6f 72 79 2e 20 20 49  nt directory.  I
56d0: 66 20 74 68 65 20 73 6c 61 73 68 20 70 61 72 61  f the slash para
56e0: 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
56f0: 6f 2c 0a 2a 2a 20 74 68 65 20 74 72 61 69 6c 69  o,.** the traili
5700: 6e 67 20 73 6c 61 73 68 2c 20 69 66 20 61 6e 79  ng slash, if any
5710: 2c 20 69 73 20 72 65 74 61 69 6e 65 64 2e 0a 2a  , is retained..*
5720: 2f 0a 76 6f 69 64 20 66 69 6c 65 5f 72 65 6c 61  /.void file_rela
5730: 74 69 76 65 5f 6e 61 6d 65 28 63 6f 6e 73 74 20  tive_name(const 
5740: 63 68 61 72 20 2a 7a 4f 72 69 67 4e 61 6d 65 2c  char *zOrigName,
5750: 20 42 6c 6f 62 20 2a 70 4f 75 74 2c 20 69 6e 74   Blob *pOut, int
5760: 20 73 6c 61 73 68 29 7b 0a 20 20 63 68 61 72 20   slash){.  char 
5770: 2a 7a 50 61 74 68 3b 0a 20 20 62 6c 6f 62 5f 73  *zPath;.  blob_s
5780: 65 74 28 70 4f 75 74 2c 20 7a 4f 72 69 67 4e 61  et(pOut, zOrigNa
5790: 6d 65 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 69  me);.  blob_resi
57a0: 7a 65 28 70 4f 75 74 2c 20 66 69 6c 65 5f 73 69  ze(pOut, file_si
57b0: 6d 70 6c 69 66 79 5f 6e 61 6d 65 28 62 6c 6f 62  mplify_name(blob
57c0: 5f 62 75 66 66 65 72 28 70 4f 75 74 29 2c 0a 20  _buffer(pOut),. 
57d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57f0: 20 20 20 20 20 20 62 6c 6f 62 5f 73 69 7a 65 28        blob_size(
5800: 70 4f 75 74 29 2c 20 73 6c 61 73 68 29 29 3b 0a  pOut), slash));.
5810: 20 20 7a 50 61 74 68 20 3d 20 66 69 6c 65 5f 77    zPath = file_w
5820: 69 74 68 6f 75 74 5f 64 72 69 76 65 5f 6c 65 74  ithout_drive_let
5830: 74 65 72 28 62 6c 6f 62 5f 62 75 66 66 65 72 28  ter(blob_buffer(
5840: 70 4f 75 74 29 29 3b 0a 20 20 69 66 28 20 7a 50  pOut));.  if( zP
5850: 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20  ath[0]=='/' ){. 
5860: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
5870: 20 42 6c 6f 62 20 74 6d 70 3b 0a 20 20 20 20 63   Blob tmp;.    c
5880: 68 61 72 20 2a 7a 50 77 64 3b 0a 20 20 20 20 63  har *zPwd;.    c
5890: 68 61 72 20 7a 42 75 66 5b 32 30 30 30 5d 3b 0a  har zBuf[2000];.
58a0: 20 20 20 20 7a 50 77 64 20 3d 20 7a 42 75 66 3b      zPwd = zBuf;
58b0: 0a 20 20 20 20 66 69 6c 65 5f 67 65 74 63 77 64  .    file_getcwd
58c0: 28 7a 42 75 66 2c 20 73 69 7a 65 6f 66 28 7a 42  (zBuf, sizeof(zB
58d0: 75 66 29 2d 32 30 29 3b 0a 20 20 20 20 7a 50 77  uf)-20);.    zPw
58e0: 64 20 3d 20 66 69 6c 65 5f 77 69 74 68 6f 75 74  d = file_without
58f0: 5f 64 72 69 76 65 5f 6c 65 74 74 65 72 28 7a 42  _drive_letter(zB
5900: 75 66 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a  uf);.    i = 1;.
5910: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e  #if defined(_WIN
5920: 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  32) || defined(_
5930: 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 20 20 77  _CYGWIN__).    w
5940: 68 69 6c 65 28 20 7a 50 61 74 68 5b 69 5d 20 26  hile( zPath[i] &
5950: 26 20 66 6f 73 73 69 6c 5f 74 6f 6c 6f 77 65 72  & fossil_tolower
5960: 28 7a 50 77 64 5b 69 5d 29 3d 3d 66 6f 73 73 69  (zPwd[i])==fossi
5970: 6c 5f 74 6f 6c 6f 77 65 72 28 7a 50 61 74 68 5b  l_tolower(zPath[
5980: 69 5d 29 20 29 20 69 2b 2b 3b 0a 23 65 6c 73 65  i]) ) i++;.#else
5990: 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 50 61 74  .    while( zPat
59a0: 68 5b 69 5d 20 26 26 20 7a 50 77 64 5b 69 5d 3d  h[i] && zPwd[i]=
59b0: 3d 7a 50 61 74 68 5b 69 5d 20 29 20 69 2b 2b 3b  =zPath[i] ) i++;
59c0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
59d0: 7a 50 61 74 68 5b 69 5d 3d 3d 30 20 29 7b 0a 20  zPath[i]==0 ){. 
59e0: 20 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28       blob_reset(
59f0: 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28  pOut);.      if(
5a00: 20 7a 50 77 64 5b 69 5d 3d 3d 30 20 29 7b 0a 20   zPwd[i]==0 ){. 
5a10: 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65         blob_appe
5a20: 6e 64 28 70 4f 75 74 2c 20 22 2e 22 2c 20 31 29  nd(pOut, ".", 1)
5a30: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5a40: 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65         blob_appe
5a50: 6e 64 28 70 4f 75 74 2c 20 22 2e 2e 22 2c 20 32  nd(pOut, "..", 2
5a60: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  );.        for(j
5a70: 3d 69 2b 31 3b 20 7a 50 77 64 5b 6a 5d 3b 20 6a  =i+1; zPwd[j]; j
5a80: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
5a90: 66 28 20 7a 50 77 64 5b 6a 5d 3d 3d 27 2f 27 20  f( zPwd[j]=='/' 
5aa0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ){.            b
5ab0: 6c 6f 62 5f 61 70 70 65 6e 64 28 70 4f 75 74 2c  lob_append(pOut,
5ac0: 20 22 2f 2e 2e 22 2c 20 33 29 3b 0a 20 20 20 20   "/..", 3);.    
5ad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5ae0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
5af0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
5b00: 20 20 69 66 28 20 7a 50 77 64 5b 69 5d 3d 3d 30    if( zPwd[i]==0
5b10: 20 26 26 20 7a 50 61 74 68 5b 69 5d 3d 3d 27 2f   && zPath[i]=='/
5b20: 27 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ' ){.      memcp
5b30: 79 28 26 74 6d 70 2c 20 70 4f 75 74 2c 20 73 69  y(&tmp, pOut, si
5b40: 7a 65 6f 66 28 74 6d 70 29 29 3b 0a 20 20 20 20  zeof(tmp));.    
5b50: 20 20 62 6c 6f 62 5f 73 65 74 28 70 4f 75 74 2c    blob_set(pOut,
5b60: 20 22 2e 2f 22 29 3b 0a 20 20 20 20 20 20 62 6c   "./");.      bl
5b70: 6f 62 5f 61 70 70 65 6e 64 28 70 4f 75 74 2c 20  ob_append(pOut, 
5b80: 26 7a 50 61 74 68 5b 69 2b 31 5d 2c 20 2d 31 29  &zPath[i+1], -1)
5b90: 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 72 65 73  ;.      blob_res
5ba0: 65 74 28 26 74 6d 70 29 3b 0a 20 20 20 20 20 20  et(&tmp);.      
5bb0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
5bc0: 20 20 77 68 69 6c 65 28 20 7a 50 61 74 68 5b 69    while( zPath[i
5bd0: 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 69 2d 2d 3b  -1]!='/' ){ i--;
5be0: 20 7d 0a 20 20 20 20 62 6c 6f 62 5f 73 65 74 28   }.    blob_set(
5bf0: 26 74 6d 70 2c 20 22 2e 2e 2f 22 29 3b 0a 20 20  &tmp, "../");.  
5c00: 20 20 66 6f 72 28 6a 3d 69 3b 20 7a 50 77 64 5b    for(j=i; zPwd[
5c10: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  j]; j++){.      
5c20: 69 66 28 20 7a 50 77 64 5b 6a 5d 3d 3d 27 2f 27  if( zPwd[j]=='/'
5c30: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62   ){.        blob
5c40: 5f 61 70 70 65 6e 64 28 26 74 6d 70 2c 20 22 2e  _append(&tmp, ".
5c50: 2e 2f 22 2c 20 33 29 3b 0a 20 20 20 20 20 20 7d  ./", 3);.      }
5c60: 0a 20 20 20 20 7d 0a 20 20 20 20 62 6c 6f 62 5f  .    }.    blob_
5c70: 61 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 7a 50  append(&tmp, &zP
5c80: 61 74 68 5b 69 5d 2c 20 2d 31 29 3b 0a 20 20 20  ath[i], -1);.   
5c90: 20 62 6c 6f 62 5f 72 65 73 65 74 28 70 4f 75 74   blob_reset(pOut
5ca0: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f  );.    memcpy(pO
5cb0: 75 74 2c 20 26 74 6d 70 2c 20 73 69 7a 65 6f 66  ut, &tmp, sizeof
5cc0: 28 74 6d 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (tmp));.  }.}../
5cd0: 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 20 74  *.** COMMAND:  t
5ce0: 65 73 74 2d 72 65 6c 61 74 69 76 65 2d 6e 61 6d  est-relative-nam
5cf0: 65 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  e.**.** Test the
5d00: 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   operation of th
5d10: 65 20 72 65 6c 61 74 69 76 65 20 6e 61 6d 65 20  e relative name 
5d20: 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 76 6f  generator..*/.vo
5d30: 69 64 20 63 6d 64 5f 74 65 73 74 5f 72 65 6c 61  id cmd_test_rela
5d40: 74 69 76 65 5f 6e 61 6d 65 28 76 6f 69 64 29 7b  tive_name(void){
5d50: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 6c 6f 62  .  int i;.  Blob
5d60: 20 78 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28   x;.  blob_zero(
5d70: 26 78 29 3b 0a 20 20 66 6f 72 28 69 3d 32 3b 20  &x);.  for(i=2; 
5d80: 69 3c 67 2e 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  i<g.argc; i++){.
5d90: 20 20 20 20 66 69 6c 65 5f 72 65 6c 61 74 69 76      file_relativ
5da0: 65 5f 6e 61 6d 65 28 67 2e 61 72 67 76 5b 69 5d  e_name(g.argv[i]
5db0: 2c 20 26 78 2c 20 30 29 3b 0a 20 20 20 20 66 6f  , &x, 0);.    fo
5dc0: 73 73 69 6c 5f 70 72 69 6e 74 28 22 25 73 5c 6e  ssil_print("%s\n
5dd0: 22 2c 20 62 6c 6f 62 5f 62 75 66 66 65 72 28 26  ", blob_buffer(&
5de0: 78 29 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65  x));.    blob_re
5df0: 73 65 74 28 26 78 29 3b 0a 20 20 7d 0a 7d 0a 0a  set(&x);.  }.}..
5e00: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
5e10: 70 61 74 68 6e 61 6d 65 20 66 6f 72 20 61 20 66  pathname for a f
5e20: 69 6c 65 20 72 65 6c 61 74 69 76 65 20 74 6f 20  ile relative to 
5e30: 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
5e40: 6c 6f 63 61 6c 0a 2a 2a 20 74 72 65 65 2e 20 20  local.** tree.  
5e50: 52 65 74 75 72 6e 20 54 52 55 45 20 6f 6e 20 73  Return TRUE on s
5e60: 75 63 63 65 73 73 2e 20 20 4f 6e 20 66 61 69 6c  uccess.  On fail
5e70: 75 72 65 2c 20 70 72 69 6e 74 20 61 6e 64 20 65  ure, print and e
5e80: 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20  rror.** message 
5e90: 61 6e 64 20 71 75 69 74 20 69 66 20 74 68 65 20  and quit if the 
5ea0: 65 72 72 46 61 74 61 6c 20 66 6c 61 67 20 69 73  errFatal flag is
5eb0: 20 74 72 75 65 2e 20 20 49 66 20 65 72 72 46 61   true.  If errFa
5ec0: 74 61 6c 20 69 73 0a 2a 2a 20 66 61 6c 73 65 2c  tal is.** false,
5ed0: 20 74 68 65 6e 20 73 69 6d 70 6c 79 20 72 65 74   then simply ret
5ee0: 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urn 0..**.** The
5ef0: 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65   root of the tre
5f00: 65 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  e is defined by 
5f10: 74 68 65 20 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74  the g.zLocalRoot
5f20: 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 69 6e   variable..*/.in
5f30: 74 20 66 69 6c 65 5f 74 72 65 65 5f 6e 61 6d 65  t file_tree_name
5f40: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72  (const char *zOr
5f50: 69 67 4e 61 6d 65 2c 20 42 6c 6f 62 20 2a 70 4f  igName, Blob *pO
5f60: 75 74 2c 20 69 6e 74 20 65 72 72 46 61 74 61 6c  ut, int errFatal
5f70: 29 7b 0a 20 20 42 6c 6f 62 20 6c 6f 63 61 6c 52  ){.  Blob localR
5f80: 6f 6f 74 3b 0a 20 20 69 6e 74 20 6e 4c 6f 63 61  oot;.  int nLoca
5f90: 6c 52 6f 6f 74 3b 0a 20 20 63 68 61 72 20 2a 7a  lRoot;.  char *z
5fa0: 4c 6f 63 61 6c 52 6f 6f 74 3b 0a 20 20 42 6c 6f  LocalRoot;.  Blo
5fb0: 62 20 66 75 6c 6c 3b 0a 20 20 69 6e 74 20 6e 46  b full;.  int nF
5fc0: 75 6c 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75  ull;.  char *zFu
5fd0: 6c 6c 3b 0a 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f  ll;..  blob_zero
5fe0: 28 70 4f 75 74 29 3b 0a 20 20 64 62 5f 6d 75 73  (pOut);.  db_mus
5ff0: 74 5f 62 65 5f 77 69 74 68 69 6e 5f 74 72 65 65  t_be_within_tree
6000: 28 29 3b 0a 20 20 66 69 6c 65 5f 63 61 6e 6f 6e  ();.  file_canon
6010: 69 63 61 6c 5f 6e 61 6d 65 28 67 2e 7a 4c 6f 63  ical_name(g.zLoc
6020: 61 6c 52 6f 6f 74 2c 20 26 6c 6f 63 61 6c 52 6f  alRoot, &localRo
6030: 6f 74 2c 20 31 29 3b 0a 20 20 6e 4c 6f 63 61 6c  ot, 1);.  nLocal
6040: 52 6f 6f 74 20 3d 20 62 6c 6f 62 5f 73 69 7a 65  Root = blob_size
6050: 28 26 6c 6f 63 61 6c 52 6f 6f 74 29 3b 0a 20 20  (&localRoot);.  
6060: 7a 4c 6f 63 61 6c 52 6f 6f 74 20 3d 20 62 6c 6f  zLocalRoot = blo
6070: 62 5f 62 75 66 66 65 72 28 26 6c 6f 63 61 6c 52  b_buffer(&localR
6080: 6f 6f 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  oot);.  assert( 
6090: 6e 4c 6f 63 61 6c 52 6f 6f 74 3e 30 20 26 26 20  nLocalRoot>0 && 
60a0: 7a 4c 6f 63 61 6c 52 6f 6f 74 5b 6e 4c 6f 63 61  zLocalRoot[nLoca
60b0: 6c 52 6f 6f 74 2d 31 5d 3d 3d 27 2f 27 20 29 3b  lRoot-1]=='/' );
60c0: 0a 20 20 66 69 6c 65 5f 63 61 6e 6f 6e 69 63 61  .  file_canonica
60d0: 6c 5f 6e 61 6d 65 28 7a 4f 72 69 67 4e 61 6d 65  l_name(zOrigName
60e0: 2c 20 26 66 75 6c 6c 2c 20 30 29 3b 0a 20 20 6e  , &full, 0);.  n
60f0: 46 75 6c 6c 20 3d 20 62 6c 6f 62 5f 73 69 7a 65  Full = blob_size
6100: 28 26 66 75 6c 6c 29 3b 0a 20 20 7a 46 75 6c 6c  (&full);.  zFull
6110: 20 3d 20 62 6c 6f 62 5f 62 75 66 66 65 72 28 26   = blob_buffer(&
6120: 66 75 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 53 70 65  full);..  /* Spe
6130: 63 69 61 6c 20 63 61 73 65 2e 20 20 7a 4f 72 69  cial case.  zOri
6140: 67 4e 61 6d 65 20 72 65 66 65 72 73 20 74 6f 20  gName refers to 
6150: 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 20 64 69 72  g.zLocalRoot dir
6160: 65 63 74 6f 72 79 2e 20 2a 2f 0a 20 20 69 66 28  ectory. */.  if(
6170: 20 6e 46 75 6c 6c 3d 3d 6e 4c 6f 63 61 6c 52 6f   nFull==nLocalRo
6180: 6f 74 2d 31 20 26 26 20 6d 65 6d 63 6d 70 28 7a  ot-1 && memcmp(z
6190: 4c 6f 63 61 6c 52 6f 6f 74 2c 20 7a 46 75 6c 6c  LocalRoot, zFull
61a0: 2c 20 6e 46 75 6c 6c 29 3d 3d 30 20 29 7b 0a 20  , nFull)==0 ){. 
61b0: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70     blob_append(p
61c0: 4f 75 74 2c 20 22 2e 22 2c 20 31 29 3b 0a 20 20  Out, ".", 1);.  
61d0: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 6c 6f    blob_reset(&lo
61e0: 63 61 6c 52 6f 6f 74 29 3b 0a 20 20 20 20 62 6c  calRoot);.    bl
61f0: 6f 62 5f 72 65 73 65 74 28 26 66 75 6c 6c 29 3b  ob_reset(&full);
6200: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
6210: 20 7d 0a 0a 20 20 69 66 28 20 6e 46 75 6c 6c 3c   }..  if( nFull<
6220: 3d 6e 4c 6f 63 61 6c 52 6f 6f 74 20 7c 7c 20 6d  =nLocalRoot || m
6230: 65 6d 63 6d 70 28 7a 4c 6f 63 61 6c 52 6f 6f 74  emcmp(zLocalRoot
6240: 2c 20 7a 46 75 6c 6c 2c 20 6e 4c 6f 63 61 6c 52  , zFull, nLocalR
6250: 6f 6f 74 29 20 29 7b 0a 20 20 20 20 62 6c 6f 62  oot) ){.    blob
6260: 5f 72 65 73 65 74 28 26 6c 6f 63 61 6c 52 6f 6f  _reset(&localRoo
6270: 74 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73  t);.    blob_res
6280: 65 74 28 26 66 75 6c 6c 29 3b 0a 20 20 20 20 69  et(&full);.    i
6290: 66 28 20 65 72 72 46 61 74 61 6c 20 29 7b 0a 20  f( errFatal ){. 
62a0: 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61       fossil_fata
62b0: 6c 28 22 66 69 6c 65 20 6f 75 74 73 69 64 65 20  l("file outside 
62c0: 6f 66 20 63 68 65 63 6b 6f 75 74 20 74 72 65 65  of checkout tree
62d0: 3a 20 25 73 22 2c 20 7a 4f 72 69 67 4e 61 6d 65  : %s", zOrigName
62e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
62f0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 62 6c 6f  urn 0;.  }.  blo
6300: 62 5f 61 70 70 65 6e 64 28 70 4f 75 74 2c 20 26  b_append(pOut, &
6310: 7a 46 75 6c 6c 5b 6e 4c 6f 63 61 6c 52 6f 6f 74  zFull[nLocalRoot
6320: 5d 2c 20 6e 46 75 6c 6c 2d 6e 4c 6f 63 61 6c 52  ], nFull-nLocalR
6330: 6f 6f 74 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 73  oot);.  blob_res
6340: 65 74 28 26 6c 6f 63 61 6c 52 6f 6f 74 29 3b 0a  et(&localRoot);.
6350: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 66 75    blob_reset(&fu
6360: 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  ll);.  return 1;
6370: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e  .}../*.** COMMAN
6380: 44 3a 20 20 74 65 73 74 2d 74 72 65 65 2d 6e 61  D:  test-tree-na
6390: 6d 65 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68  me.**.** Test th
63a0: 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74  e operation of t
63b0: 68 65 20 74 72 65 65 20 6e 61 6d 65 20 67 65 6e  he tree name gen
63c0: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20  erator..*/.void 
63d0: 63 6d 64 5f 74 65 73 74 5f 74 72 65 65 5f 6e 61  cmd_test_tree_na
63e0: 6d 65 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20  me(void){.  int 
63f0: 69 3b 0a 20 20 42 6c 6f 62 20 78 3b 0a 20 20 62  i;.  Blob x;.  b
6400: 6c 6f 62 5f 7a 65 72 6f 28 26 78 29 3b 0a 20 20  lob_zero(&x);.  
6410: 66 6f 72 28 69 3d 32 3b 20 69 3c 67 2e 61 72 67  for(i=2; i<g.arg
6420: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  c; i++){.    if(
6430: 20 66 69 6c 65 5f 74 72 65 65 5f 6e 61 6d 65 28   file_tree_name(
6440: 67 2e 61 72 67 76 5b 69 5d 2c 20 26 78 2c 20 31  g.argv[i], &x, 1
6450: 29 20 29 7b 0a 20 20 20 20 20 20 66 6f 73 73 69  ) ){.      fossi
6460: 6c 5f 70 72 69 6e 74 28 22 25 73 5c 6e 22 2c 20  l_print("%s\n", 
6470: 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 78 29 29  blob_buffer(&x))
6480: 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 72 65 73  ;.      blob_res
6490: 65 74 28 26 78 29 3b 0a 20 20 20 20 7d 0a 20 20  et(&x);.    }.  
64a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65  }.}../*.** Parse
64b0: 20 61 20 55 52 49 20 69 6e 74 6f 20 73 63 68 65   a URI into sche
64c0: 6d 65 2c 20 68 6f 73 74 2c 20 70 6f 72 74 2c 20  me, host, port, 
64d0: 61 6e 64 20 70 61 74 68 2e 0a 2a 2f 0a 76 6f 69  and path..*/.voi
64e0: 64 20 66 69 6c 65 5f 70 61 72 73 65 5f 75 72 69  d file_parse_uri
64f0: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
6500: 7a 55 72 69 2c 0a 20 20 42 6c 6f 62 20 2a 70 53  zUri,.  Blob *pS
6510: 63 68 65 6d 65 2c 0a 20 20 42 6c 6f 62 20 2a 70  cheme,.  Blob *p
6520: 48 6f 73 74 2c 0a 20 20 69 6e 74 20 2a 70 50 6f  Host,.  int *pPo
6530: 72 74 2c 0a 20 20 42 6c 6f 62 20 2a 70 50 61 74  rt,.  Blob *pPat
6540: 68 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  h.){.  int i, j;
6550: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 55 72  ..  for(i=0; zUr
6560: 69 5b 69 5d 20 26 26 20 7a 55 72 69 5b 69 5d 3e  i[i] && zUri[i]>
6570: 3d 27 61 27 20 26 26 20 7a 55 72 69 5b 69 5d 3c  ='a' && zUri[i]<
6580: 3d 27 7a 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69  ='z'; i++){}.  i
6590: 66 28 20 7a 55 72 69 5b 69 5d 21 3d 27 3a 27 20  f( zUri[i]!=':' 
65a0: 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f  ){.    blob_zero
65b0: 28 70 53 63 68 65 6d 65 29 3b 0a 20 20 20 20 62  (pScheme);.    b
65c0: 6c 6f 62 5f 7a 65 72 6f 28 70 48 6f 73 74 29 3b  lob_zero(pHost);
65d0: 0a 20 20 20 20 62 6c 6f 62 5f 73 65 74 28 70 50  .    blob_set(pP
65e0: 61 74 68 2c 20 7a 55 72 69 29 3b 0a 20 20 20 20  ath, zUri);.    
65f0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 62 6c  return;.  }.  bl
6600: 6f 62 5f 69 6e 69 74 28 70 53 63 68 65 6d 65 2c  ob_init(pScheme,
6610: 20 7a 55 72 69 2c 20 69 29 3b 0a 20 20 69 2b 2b   zUri, i);.  i++
6620: 3b 0a 20 20 69 66 28 20 7a 55 72 69 5b 69 5d 3d  ;.  if( zUri[i]=
6630: 3d 27 2f 27 20 26 26 20 7a 55 72 69 5b 69 2b 31  ='/' && zUri[i+1
6640: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 69 20  ]=='/' ){.    i 
6650: 2b 3d 20 32 3b 0a 20 20 20 20 6a 20 3d 20 69 3b  += 2;.    j = i;
6660: 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69  .    while( zUri
6670: 5b 69 5d 20 26 26 20 7a 55 72 69 5b 69 5d 21 3d  [i] && zUri[i]!=
6680: 27 2f 27 20 26 26 20 7a 55 72 69 5b 69 5d 21 3d  '/' && zUri[i]!=
6690: 27 3a 27 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20  ':' ){ i++; }.  
66a0: 20 20 62 6c 6f 62 5f 69 6e 69 74 28 70 48 6f 73    blob_init(pHos
66b0: 74 2c 20 26 7a 55 72 69 5b 6a 5d 2c 20 69 2d 6a  t, &zUri[j], i-j
66c0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 55 72 69 5b  );.    if( zUri[
66d0: 69 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20 20  i]==':' ){.     
66e0: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 2a 70 50 6f   i++;.      *pPo
66f0: 72 74 20 3d 20 61 74 6f 69 28 26 7a 55 72 69 5b  rt = atoi(&zUri[
6700: 69 5d 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  i]);.      while
6710: 28 20 7a 55 72 69 5b 69 5d 20 26 26 20 7a 55 72  ( zUri[i] && zUr
6720: 69 5b 69 5d 21 3d 27 2f 27 20 29 7b 20 69 2b 2b  i[i]!='/' ){ i++
6730: 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ; }.    }.  }els
6740: 65 7b 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f  e{.    blob_zero
6750: 28 70 48 6f 73 74 29 3b 0a 20 20 7d 0a 20 20 69  (pHost);.  }.  i
6760: 66 28 20 7a 55 72 69 5b 69 5d 3d 3d 27 2f 27 20  f( zUri[i]=='/' 
6770: 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 73 65 74 28  ){.    blob_set(
6780: 70 50 61 74 68 2c 20 26 7a 55 72 69 5b 69 5d 29  pPath, &zUri[i])
6790: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62  ;.  }else{.    b
67a0: 6c 6f 62 5f 73 65 74 28 70 50 61 74 68 2c 20 22  lob_set(pPath, "
67b0: 2f 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  /");.  }.}../*.*
67c0: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 61  * Construct a ra
67d0: 6e 64 6f 6d 20 74 65 6d 70 6f 72 61 72 79 20 66  ndom temporary f
67e0: 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 7a 42 75  ilename into zBu
67f0: 66 5b 5d 2e 0a 2a 2f 0a 76 6f 69 64 20 66 69 6c  f[]..*/.void fil
6800: 65 5f 74 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e  e_tempname(int n
6810: 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
6820: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  {.#if defined(_W
6830: 49 4e 33 32 29 0a 20 20 63 6f 6e 73 74 20 63 68  IN32).  const ch
6840: 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b  ar *azDirs[] = {
6850: 0a 20 20 20 20 20 30 2c 20 2f 2a 20 47 65 74 54  .     0, /* GetT
6860: 65 6d 70 50 61 74 68 20 2a 2f 0a 20 20 20 20 20  empPath */.     
6870: 30 2c 20 2f 2a 20 54 45 4d 50 20 2a 2f 0a 20 20  0, /* TEMP */.  
6880: 20 20 20 30 2c 20 2f 2a 20 54 4d 50 20 2a 2f 0a     0, /* TMP */.
6890: 20 20 20 20 20 22 2e 22 2c 0a 20 20 7d 3b 0a 23       ".",.  };.#
68a0: 65 6c 73 65 0a 20 20 73 74 61 74 69 63 20 63 6f  else.  static co
68b0: 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20  nst char *const 
68c0: 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20  azDirs[] = {.   
68d0: 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20    "/var/tmp",.  
68e0: 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20     "/usr/tmp",. 
68f0: 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20      "/tmp",.    
6900: 20 22 2f 74 65 6d 70 22 2c 0a 20 20 20 20 20 22   "/temp",.     "
6910: 2e 22 2c 0a 20 20 7d 3b 0a 23 65 6e 64 69 66 0a  .",.  };.#endif.
6920: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
6930: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 43 68  nsigned char zCh
6940: 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63  ars[] =.    "abc
6950: 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
6960: 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42  tuvwxyz".    "AB
6970: 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
6980: 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30  STUVWXYZ".    "0
6990: 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 75 6e  123456789";.  un
69a0: 73 69 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b  signed int i, j;
69b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
69c0: 44 69 72 20 3d 20 22 2e 22 3b 0a 20 20 69 6e 74  Dir = ".";.  int
69d0: 20 63 6e 74 20 3d 20 30 3b 0a 0a 23 69 66 20 64   cnt = 0;..#if d
69e0: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20  efined(_WIN32). 
69f0: 20 77 63 68 61 72 5f 74 20 7a 54 6d 70 50 61 74   wchar_t zTmpPat
6a00: 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 0a 20 20  h[MAX_PATH];..  
6a10: 69 66 28 20 47 65 74 54 65 6d 70 50 61 74 68 57  if( GetTempPathW
6a20: 28 4d 41 58 5f 50 41 54 48 2c 20 7a 54 6d 70 50  (MAX_PATH, zTmpP
6a30: 61 74 68 29 20 29 7b 0a 20 20 20 20 61 7a 44 69  ath) ){.    azDi
6a40: 72 73 5b 30 5d 20 3d 20 66 6f 73 73 69 6c 5f 66  rs[0] = fossil_f
6a50: 69 6c 65 6e 61 6d 65 5f 74 6f 5f 75 74 66 38 28  ilename_to_utf8(
6a60: 7a 54 6d 70 50 61 74 68 29 3b 0a 20 20 7d 0a 0a  zTmpPath);.  }..
6a70: 20 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 66 6f    azDirs[1] = fo
6a80: 73 73 69 6c 5f 67 65 74 65 6e 76 28 22 54 45 4d  ssil_getenv("TEM
6a90: 50 22 29 3b 0a 20 20 61 7a 44 69 72 73 5b 32 5d  P");.  azDirs[2]
6aa0: 20 3d 20 66 6f 73 73 69 6c 5f 67 65 74 65 6e 76   = fossil_getenv
6ab0: 28 22 54 4d 50 22 29 3b 0a 23 65 6e 64 69 66 0a  ("TMP");.#endif.
6ac0: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ..  for(i=0; i<s
6ad0: 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69  izeof(azDirs)/si
6ae0: 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b  zeof(azDirs[0]);
6af0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
6b00: 7a 44 69 72 73 5b 69 5d 3d 3d 30 20 29 20 63 6f  zDirs[i]==0 ) co
6b10: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
6b20: 21 66 69 6c 65 5f 69 73 64 69 72 28 61 7a 44 69  !file_isdir(azDi
6b30: 72 73 5b 69 5d 29 20 29 20 63 6f 6e 74 69 6e 75  rs[i]) ) continu
6b40: 65 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20 61 7a  e;.    zDir = az
6b50: 44 69 72 73 5b 69 5d 3b 0a 20 20 20 20 62 72 65  Dirs[i];.    bre
6b60: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  ak;.  }..  /* Ch
6b70: 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74  eck that the out
6b80: 70 75 74 20 62 75 66 66 65 72 20 69 73 20 6c 61  put buffer is la
6b90: 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74  rge enough for t
6ba0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
6bb0: 65 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20  e.  ** name. If 
6bc0: 69 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72  it is not, retur
6bd0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  n SQLITE_ERROR..
6be0: 20 20 2a 2f 0a 20 20 69 66 28 20 28 73 74 72 6c    */.  if( (strl
6bf0: 65 6e 28 7a 44 69 72 29 20 2b 20 31 37 29 20 3e  en(zDir) + 17) >
6c00: 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29  = (size_t)nBuf )
6c10: 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74  {.    fossil_fat
6c20: 61 6c 28 22 69 6e 73 75 66 66 69 63 69 65 6e 74  al("insufficient
6c30: 20 73 70 61 63 65 20 66 6f 72 20 74 65 6d 70 6f   space for tempo
6c40: 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 22 29 3b  rary filename");
6c50: 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20  .  }..  do{.    
6c60: 69 66 28 20 63 6e 74 2b 2b 3e 32 30 20 29 20 66  if( cnt++>20 ) f
6c70: 6f 73 73 69 6c 5f 70 61 6e 69 63 28 22 63 61 6e  ossil_panic("can
6c80: 6e 6f 74 20 67 65 6e 65 72 61 74 65 20 61 20 74  not generate a t
6c90: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d  emporary filenam
6ca0: 65 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e");.    sqlite3
6cb0: 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31  _snprintf(nBuf-1
6cc0: 37 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 2c 20  7, zBuf, "%s/", 
6cd0: 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20 28  zDir);.    j = (
6ce0: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75 66 29  int)strlen(zBuf)
6cf0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61  ;.    sqlite3_ra
6d00: 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42  ndomness(15, &zB
6d10: 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28  uf[j]);.    for(
6d20: 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20  i=0; i<15; i++, 
6d30: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75 66  j++){.      zBuf
6d40: 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61  [j] = (char)zCha
6d50: 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63  rs[ ((unsigned c
6d60: 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69  har)zBuf[j])%(si
6d70: 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20  zeof(zChars)-1) 
6d80: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75  ];.    }.    zBu
6d90: 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69  f[j] = 0;.  }whi
6da0: 6c 65 28 20 66 69 6c 65 5f 73 69 7a 65 28 7a 42  le( file_size(zB
6db0: 75 66 29 3e 3d 30 20 29 3b 0a 0a 23 69 66 20 64  uf)>=0 );..#if d
6dc0: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20  efined(_WIN32). 
6dd0: 20 66 6f 73 73 69 6c 5f 66 69 6c 65 6e 61 6d 65   fossil_filename
6de0: 5f 66 72 65 65 28 28 63 68 61 72 20 2a 29 61 7a  _free((char *)az
6df0: 44 69 72 73 5b 30 5d 29 3b 0a 20 20 66 6f 73 73  Dirs[0]);.  foss
6e00: 69 6c 5f 66 69 6c 65 6e 61 6d 65 5f 66 72 65 65  il_filename_free
6e10: 28 28 63 68 61 72 20 2a 29 61 7a 44 69 72 73 5b  ((char *)azDirs[
6e20: 31 5d 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 66 69  1]);.  fossil_fi
6e30: 6c 65 6e 61 6d 65 5f 66 72 65 65 28 28 63 68 61  lename_free((cha
6e40: 72 20 2a 29 61 7a 44 69 72 73 5b 32 5d 29 3b 0a  r *)azDirs[2]);.
6e50: 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
6e60: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
6e70: 61 20 66 69 6c 65 20 6e 61 6d 65 64 20 7a 4e 61  a file named zNa
6e80: 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20 68 61  me exists and ha
6e90: 73 20 69 64 65 6e 74 69 63 61 6c 20 63 6f 6e 74  s identical cont
6ea0: 65 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 62 6c  ent.** to the bl
6eb0: 6f 62 20 70 43 6f 6e 74 65 6e 74 2e 20 20 49 66  ob pContent.  If
6ec0: 20 7a 4e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20   zName does not 
6ed0: 65 78 69 73 74 20 6f 72 20 69 66 20 74 68 65 20  exist or if the 
6ee0: 63 6f 6e 74 65 6e 74 20 69 73 0a 2a 2a 20 64 69  content is.** di
6ef0: 66 66 65 72 65 6e 74 20 69 6e 20 61 6e 79 20 77  fferent in any w
6f00: 61 79 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  ay, then return 
6f10: 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20 66 69  false..*/.int fi
6f20: 6c 65 5f 69 73 5f 74 68 65 5f 73 61 6d 65 28 42  le_is_the_same(B
6f30: 6c 6f 62 20 2a 70 43 6f 6e 74 65 6e 74 2c 20 63  lob *pContent, c
6f40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
6f50: 29 7b 0a 20 20 69 36 34 20 69 53 69 7a 65 3b 0a  ){.  i64 iSize;.
6f60: 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 6c 6f 62    int rc;.  Blob
6f70: 20 6f 6e 44 69 73 6b 3b 0a 0a 20 20 69 53 69 7a   onDisk;..  iSiz
6f80: 65 20 3d 20 66 69 6c 65 5f 77 64 5f 73 69 7a 65  e = file_wd_size
6f90: 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69  (zName);.  if( i
6fa0: 53 69 7a 65 3c 30 20 29 20 72 65 74 75 72 6e 20  Size<0 ) return 
6fb0: 30 3b 0a 20 20 69 66 28 20 69 53 69 7a 65 21 3d  0;.  if( iSize!=
6fc0: 62 6c 6f 62 5f 73 69 7a 65 28 70 43 6f 6e 74 65  blob_size(pConte
6fd0: 6e 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  nt) ) return 0;.
6fe0: 20 20 69 66 28 20 66 69 6c 65 5f 77 64 5f 69 73    if( file_wd_is
6ff0: 6c 69 6e 6b 28 7a 4e 61 6d 65 29 20 29 7b 0a 20  link(zName) ){. 
7000: 20 20 20 62 6c 6f 62 5f 72 65 61 64 5f 6c 69 6e     blob_read_lin
7010: 6b 28 26 6f 6e 44 69 73 6b 2c 20 7a 4e 61 6d 65  k(&onDisk, zName
7020: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
7030: 62 6c 6f 62 5f 72 65 61 64 5f 66 72 6f 6d 5f 66  blob_read_from_f
7040: 69 6c 65 28 26 6f 6e 44 69 73 6b 2c 20 7a 4e 61  ile(&onDisk, zNa
7050: 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  me);.  }.  rc = 
7060: 62 6c 6f 62 5f 63 6f 6d 70 61 72 65 28 26 6f 6e  blob_compare(&on
7070: 44 69 73 6b 2c 20 70 43 6f 6e 74 65 6e 74 29 3b  Disk, pContent);
7080: 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 6f  .  blob_reset(&o
7090: 6e 44 69 73 6b 29 3b 0a 20 20 72 65 74 75 72 6e  nDisk);.  return
70a0: 20 72 63 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   rc==0;.}../*.**
70b0: 20 50 6f 72 74 61 62 6c 65 20 75 6e 69 63 6f 64   Portable unicod
70c0: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
70d0: 20 6f 66 20 6f 70 65 6e 64 69 72 28 29 0a 2a 2f   of opendir().*/
70e0: 0a 23 69 66 20 49 4e 54 45 52 46 41 43 45 0a 0a  .#if INTERFACE..
70f0: 23 69 6e 63 6c 75 64 65 20 3c 64 69 72 65 6e 74  #include <dirent
7100: 2e 68 3e 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .h>.#if defined(
7110: 5f 57 49 4e 33 32 29 0a 23 20 64 65 66 69 6e 65  _WIN32).# define
7120: 20 44 49 52 20 5f 57 44 49 52 0a 23 20 64 65 66   DIR _WDIR.# def
7130: 69 6e 65 20 64 69 72 65 6e 74 20 5f 77 64 69 72  ine dirent _wdir
7140: 65 6e 74 0a 23 20 64 65 66 69 6e 65 20 6f 70 65  ent.# define ope
7150: 6e 64 69 72 20 5f 77 6f 70 65 6e 64 69 72 0a 23  ndir _wopendir.#
7160: 20 64 65 66 69 6e 65 20 72 65 61 64 64 69 72 20   define readdir 
7170: 5f 77 72 65 61 64 64 69 72 0a 23 20 64 65 66 69  _wreaddir.# defi
7180: 6e 65 20 63 6c 6f 73 65 64 69 72 20 5f 77 63 6c  ne closedir _wcl
7190: 6f 73 65 64 69 72 0a 23 65 6e 64 69 66 20 2f 2a  osedir.#endif /*
71a0: 20 5f 57 49 4e 33 32 20 2a 2f 0a 0a 23 65 6e 64   _WIN32 */..#end
71b0: 69 66 20 2f 2a 20 49 4e 54 45 52 46 41 43 45 20  if /* INTERFACE 
71c0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
71d0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 6e   the value of an
71e0: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
71f0: 69 61 62 6c 65 20 61 73 20 55 54 46 38 2e 0a 2a  iable as UTF8..*
7200: 2a 20 55 73 65 20 66 6f 73 73 69 6c 5f 66 69 6c  * Use fossil_fil
7210: 65 6e 61 6d 65 5f 66 72 65 65 28 29 20 74 6f 20  ename_free() to 
7220: 72 65 6c 65 61 73 65 20 72 65 73 6f 75 72 63 65  release resource
7230: 73 2e 0a 2a 2f 0a 63 68 61 72 20 2a 66 6f 73 73  s..*/.char *foss
7240: 69 6c 5f 67 65 74 65 6e 76 28 63 6f 6e 73 74 20  il_getenv(const 
7250: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 23 69  char *zName){.#i
7260: 66 64 65 66 20 5f 57 49 4e 33 32 0a 20 20 77 63  fdef _WIN32.  wc
7270: 68 61 72 5f 74 20 2a 75 4e 61 6d 65 20 3d 20 66  har_t *uName = f
7280: 6f 73 73 69 6c 5f 75 74 66 38 5f 74 6f 5f 75 6e  ossil_utf8_to_un
7290: 69 63 6f 64 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  icode(zName);.  
72a0: 76 6f 69 64 20 2a 7a 56 61 6c 75 65 20 3d 20 5f  void *zValue = _
72b0: 77 67 65 74 65 6e 76 28 75 4e 61 6d 65 29 3b 0a  wgetenv(uName);.
72c0: 20 20 66 6f 73 73 69 6c 5f 75 6e 69 63 6f 64 65    fossil_unicode
72d0: 5f 66 72 65 65 28 75 4e 61 6d 65 29 3b 0a 23 65  _free(uName);.#e
72e0: 6c 73 65 0a 20 20 63 68 61 72 20 2a 7a 56 61 6c  lse.  char *zVal
72f0: 75 65 20 3d 20 67 65 74 65 6e 76 28 7a 4e 61 6d  ue = getenv(zNam
7300: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  e);.#endif.  if(
7310: 20 7a 56 61 6c 75 65 20 29 20 7a 56 61 6c 75 65   zValue ) zValue
7320: 20 3d 20 66 6f 73 73 69 6c 5f 66 69 6c 65 6e 61   = fossil_filena
7330: 6d 65 5f 74 6f 5f 75 74 66 38 28 7a 56 61 6c 75  me_to_utf8(zValu
7340: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 56 61  e);.  return zVa
7350: 6c 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69  lue;.}../*.** Li
7360: 6b 65 20 66 6f 70 65 6e 28 29 20 62 75 74 20 61  ke fopen() but a
7370: 6c 77 61 79 73 20 74 61 6b 65 73 20 61 20 55 54  lways takes a UT
7380: 46 38 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  F8 argument..*/.
7390: 46 49 4c 45 20 2a 66 6f 73 73 69 6c 5f 66 6f 70  FILE *fossil_fop
73a0: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  en(const char *z
73b0: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
73c0: 20 2a 7a 4d 6f 64 65 29 7b 0a 23 69 66 64 65 66   *zMode){.#ifdef
73d0: 20 5f 57 49 4e 33 32 0a 20 20 77 63 68 61 72 5f   _WIN32.  wchar_
73e0: 74 20 2a 75 4d 6f 64 65 20 3d 20 66 6f 73 73 69  t *uMode = fossi
73f0: 6c 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63 6f 64  l_utf8_to_unicod
7400: 65 28 7a 4d 6f 64 65 29 3b 0a 20 20 77 63 68 61  e(zMode);.  wcha
7410: 72 5f 74 20 2a 75 4e 61 6d 65 20 3d 20 66 6f 73  r_t *uName = fos
7420: 73 69 6c 5f 75 74 66 38 5f 74 6f 5f 66 69 6c 65  sil_utf8_to_file
7430: 6e 61 6d 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 46  name(zName);.  F
7440: 49 4c 45 20 2a 66 20 3d 20 5f 77 66 6f 70 65 6e  ILE *f = _wfopen
7450: 28 75 4e 61 6d 65 2c 20 75 4d 6f 64 65 29 3b 0a  (uName, uMode);.
7460: 20 20 66 6f 73 73 69 6c 5f 66 69 6c 65 6e 61 6d    fossil_filenam
7470: 65 5f 66 72 65 65 28 75 4e 61 6d 65 29 3b 0a 20  e_free(uName);. 
7480: 20 66 6f 73 73 69 6c 5f 75 6e 69 63 6f 64 65 5f   fossil_unicode_
7490: 66 72 65 65 28 75 4d 6f 64 65 29 3b 0a 23 65 6c  free(uMode);.#el
74a0: 73 65 0a 20 20 46 49 4c 45 20 2a 66 20 3d 20 66  se.  FILE *f = f
74b0: 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 7a 4d 6f 64  open(zName, zMod
74c0: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  e);.#endif.  ret
74d0: 75 72 6e 20 66 3b 0a 7d 0a                       urn f;.}.